@formsnip/embed 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -9
- package/dist/FormSnip.d.ts.map +1 -1
- package/dist/index.d.ts +2 -11
- package/dist/index.esm.js +14 -26
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +14 -26
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +0 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/dataLayer.d.ts +2 -3
- package/dist/utils/dataLayer.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -60,16 +60,8 @@ function App() {
|
|
|
60
60
|
| `onError` | `(error: string) => void` | No | - | Callback fired when an error occurs |
|
|
61
61
|
| `className` | `string` | No | `''` | Additional CSS class names for the form container |
|
|
62
62
|
| `prefill` | `Record<string, string>` | No | - | Prefill values keyed by each field's prefill parameter |
|
|
63
|
-
| `pushDataLayerOnSuccess` | `boolean` | No | `false` | Push to `window.dataLayer` only after the server accepts the submission |
|
|
64
|
-
| `dataLayerEventName` | `string` | No | `formsnip_submission_success` | GTM `event` name for the dataLayer push |
|
|
65
63
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
Forms use `fetch`, so GTM's default **Form Submission** trigger usually won't fire. Enable
|
|
69
|
-
`pushDataLayerOnSuccess` and add a GTM **Custom Event** trigger matching `dataLayerEventName`. The push includes
|
|
70
|
-
`formsnipFormId` and `formsnipFormName` (no field values). It runs **only** on successful API responses — not when HTML5 validation blocks submit, required file upload is missing, or the API returns an error.
|
|
71
|
-
|
|
72
|
-
You can also call `pushFormSnipSubmissionDataLayer()` yourself from `onSuccess` for full control.
|
|
64
|
+
After a **successful** server submission, the component pushes `{ event: 'formsnip_submission_success', formsnipFormId, formsnipFormName? }` to `dataLayer` (for GTM Custom Event triggers). No field values are included.
|
|
73
65
|
|
|
74
66
|
## Features
|
|
75
67
|
|
package/dist/FormSnip.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormSnip.d.ts","sourceRoot":"","sources":["../src/FormSnip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EAAQ,aAAa,EAAiC,MAAM,SAAS,CAAC;AA+B7E,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"FormSnip.d.ts","sourceRoot":"","sources":["../src/FormSnip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EAAQ,aAAa,EAAiC,MAAM,SAAS,CAAC;AA+B7E,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAmd5C,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -56,14 +56,6 @@ interface FormSnipProps {
|
|
|
56
56
|
className?: string;
|
|
57
57
|
/** Optional prefill values keyed by URL prefill parameter (e.g. ?tjeneste=...) */
|
|
58
58
|
prefill?: Record<string, string>;
|
|
59
|
-
/**
|
|
60
|
-
* When true, pushes to `window.dataLayer` only after the server accepts the submission
|
|
61
|
-
* (not on HTML5 validation failure or API errors). For GTM, use a Custom Event trigger
|
|
62
|
-
* matching `dataLayerEventName`.
|
|
63
|
-
*/
|
|
64
|
-
pushDataLayerOnSuccess?: boolean;
|
|
65
|
-
/** GTM `event` name for the dataLayer push (default: `formsnip_submission_success`). */
|
|
66
|
-
dataLayerEventName?: string;
|
|
67
59
|
}
|
|
68
60
|
interface SubmissionResponse {
|
|
69
61
|
success: boolean;
|
|
@@ -109,11 +101,10 @@ declare function uploadFile(file: File, formId: string, baseUrl: string): Promis
|
|
|
109
101
|
declare function uploadFiles(files: File[], formId: string, baseUrl: string): Promise<UploadMultipleResult>;
|
|
110
102
|
|
|
111
103
|
/**
|
|
112
|
-
* Push a GTM-friendly event to
|
|
113
|
-
* Safe no-op
|
|
104
|
+
* Push a GTM-friendly event to the global dataLayer after a successful submission.
|
|
105
|
+
* Uses `globalThis` so it works in typical browser bundles. Safe no-op if push throws.
|
|
114
106
|
*/
|
|
115
107
|
declare function pushFormSnipSubmissionDataLayer(options: {
|
|
116
|
-
eventName?: string;
|
|
117
108
|
formId: string;
|
|
118
109
|
formName?: string;
|
|
119
110
|
}): void;
|
package/dist/index.esm.js
CHANGED
|
@@ -312,17 +312,18 @@ const CLASSES = {
|
|
|
312
312
|
};
|
|
313
313
|
|
|
314
314
|
/**
|
|
315
|
-
* Push a GTM-friendly event to
|
|
316
|
-
* Safe no-op
|
|
315
|
+
* Push a GTM-friendly event to the global dataLayer after a successful submission.
|
|
316
|
+
* Uses `globalThis` so it works in typical browser bundles. Safe no-op if push throws.
|
|
317
317
|
*/
|
|
318
318
|
function pushFormSnipSubmissionDataLayer(options) {
|
|
319
|
-
if (typeof window === 'undefined')
|
|
320
|
-
return;
|
|
321
319
|
try {
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
320
|
+
if (typeof globalThis === 'undefined')
|
|
321
|
+
return;
|
|
322
|
+
const g = globalThis;
|
|
323
|
+
const layer = Array.isArray(g.dataLayer) ? g.dataLayer : [];
|
|
324
|
+
g.dataLayer = layer;
|
|
325
|
+
layer.push({
|
|
326
|
+
event: 'formsnip_submission_success',
|
|
326
327
|
formsnipFormId: options.formId,
|
|
327
328
|
...(options.formName ? { formsnipFormName: options.formName } : {}),
|
|
328
329
|
});
|
|
@@ -356,7 +357,7 @@ function buildRowsFromFields(fields) {
|
|
|
356
357
|
return rows;
|
|
357
358
|
}
|
|
358
359
|
const DEFAULT_BASE_URL = 'https://api.formsnip.com';
|
|
359
|
-
const FormSnip = ({ formId, baseUrl = DEFAULT_BASE_URL, onSuccess, onError, className = '', prefill,
|
|
360
|
+
const FormSnip = ({ formId, baseUrl = DEFAULT_BASE_URL, onSuccess, onError, className = '', prefill, }) => {
|
|
360
361
|
const [form, setForm] = useState(null);
|
|
361
362
|
const [formData, setFormData] = useState({});
|
|
362
363
|
const [selectedFiles, setSelectedFiles] = useState({});
|
|
@@ -429,16 +430,6 @@ const FormSnip = ({ formId, baseUrl = DEFAULT_BASE_URL, onSuccess, onError, clas
|
|
|
429
430
|
}
|
|
430
431
|
}
|
|
431
432
|
}
|
|
432
|
-
// Debugging: log resolved prefill for hidden fields
|
|
433
|
-
if (typeof window !== 'undefined' && field.type === 'hidden') {
|
|
434
|
-
// eslint-disable-next-line no-console
|
|
435
|
-
console.debug('FormSnip hidden prefill', {
|
|
436
|
-
fieldId: field.id,
|
|
437
|
-
prefillKey,
|
|
438
|
-
resolvedValue: initialValue,
|
|
439
|
-
hasDefault: !!field.value,
|
|
440
|
-
});
|
|
441
|
-
}
|
|
442
433
|
// Hidden fields can also have a static default value from the schema
|
|
443
434
|
if (initialValue === '' && field.type === 'hidden' && field.value) {
|
|
444
435
|
initialValue = field.value;
|
|
@@ -520,13 +511,10 @@ const FormSnip = ({ formId, baseUrl = DEFAULT_BASE_URL, onSuccess, onError, clas
|
|
|
520
511
|
const json = await response.json();
|
|
521
512
|
if (response.ok && (json.success === undefined || json.success === true)) {
|
|
522
513
|
setSubmitSuccess(true);
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
formName: form?.name,
|
|
528
|
-
});
|
|
529
|
-
}
|
|
514
|
+
pushFormSnipSubmissionDataLayer({
|
|
515
|
+
formId,
|
|
516
|
+
formName: form?.name,
|
|
517
|
+
});
|
|
530
518
|
if (onSuccess) {
|
|
531
519
|
onSuccess(json.data);
|
|
532
520
|
}
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/utils/upload.ts","../src/components/FileUpload.tsx","../src/utils/styles.ts","../src/utils/dataLayer.ts","../src/FormSnip.tsx"],"sourcesContent":["const ALLOWED_FILE_EXTENSIONS = '.jpg,.jpeg,.png,.gif,.webp,.svg,.pdf,.mp4,.mpeg,.mov,.avi,.webm,.mkv,.mp3,.wav,.ogg,.aac,.flac';\nconst MAX_TOTAL_FILE_SIZE = 15 * 1024 * 1024; // 15MB\n\nexport interface UploadResult {\n success: boolean;\n fileKey?: string;\n error?: string;\n}\n\nexport interface UploadMultipleResult {\n success: boolean;\n fileKeys?: string[];\n errors?: string[];\n}\n\n/**\n * Upload a file to R2 via presigned URL\n */\nexport async function uploadFile(\n file: File,\n formId: string,\n baseUrl: string\n): Promise<UploadResult> {\n try {\n // Step 1: Get presigned upload URL\n const signResponse = await fetch(`${baseUrl}/uploads/sign`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n credentials: 'include',\n body: JSON.stringify({\n filename: file.name,\n contentType: file.type,\n size: file.size,\n formId,\n }),\n });\n\n if (!signResponse.ok) {\n return {\n success: false,\n error: 'Failed to get upload URL',\n };\n }\n\n const signData = await signResponse.json();\n if (!signData.success || !signData.data) {\n return {\n success: false,\n error: signData.message || 'Invalid upload URL response',\n };\n }\n\n const { uploadUrl, fileKey } = signData.data;\n\n // Step 2: Upload file directly to R2\n const uploadResponse = await fetch(uploadUrl, {\n method: 'PUT',\n body: file,\n headers: {\n 'Content-Type': file.type,\n },\n });\n\n if (!uploadResponse.ok) {\n return {\n success: false,\n error: `Upload failed: ${uploadResponse.statusText}`,\n };\n }\n\n return {\n success: true,\n fileKey,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n}\n\n/**\n * Upload multiple files to R2\n */\nexport async function uploadFiles(\n files: File[],\n formId: string,\n baseUrl: string\n): Promise<UploadMultipleResult> {\n // Check total size\n const totalSize = files.reduce((sum, file) => sum + file.size, 0);\n if (totalSize > MAX_TOTAL_FILE_SIZE) {\n return {\n success: false,\n errors: [`Total file size exceeds 15MB limit per submission`],\n };\n }\n\n const results = await Promise.allSettled(\n files.map((file) => uploadFile(file, formId, baseUrl))\n );\n\n const fileKeys: string[] = [];\n const errors: string[] = [];\n\n results.forEach((result, index) => {\n if (result.status === 'fulfilled' && result.value.success && result.value.fileKey) {\n fileKeys.push(result.value.fileKey);\n } else {\n const error =\n result.status === 'fulfilled'\n ? result.value.error || 'Upload failed'\n : result.reason?.message || 'Upload failed';\n errors.push(`${files[index].name}: ${error}`);\n }\n });\n\n return {\n success: fileKeys.length > 0,\n fileKeys: fileKeys.length > 0 ? fileKeys : undefined,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n\nexport { ALLOWED_FILE_EXTENSIONS, MAX_TOTAL_FILE_SIZE };\n","import React, { useRef, useState } from 'react';\nimport { ALLOWED_FILE_EXTENSIONS } from '../utils/upload';\nimport { CLASSES } from '../utils/styles';\n\ninterface FileUploadProps {\n id: string;\n label?: string;\n required?: boolean;\n disabled?: boolean;\n multiple?: boolean;\n onFilesChange: (files: File[]) => void;\n uploadedFiles?: string[];\n uploading?: boolean;\n error?: string;\n className?: string;\n}\n\nexport const FileUpload: React.FC<FileUploadProps> = ({\n id,\n label,\n required = false,\n disabled = false,\n multiple = true,\n onFilesChange,\n uploadedFiles = [],\n uploading = false,\n error,\n className = '',\n}) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n\n if (multiple) {\n setSelectedFiles((prev) => [...prev, ...files]);\n onFilesChange([...selectedFiles, ...files]);\n } else {\n setSelectedFiles(files);\n onFilesChange(files);\n }\n };\n\n const removeFile = (index: number) => {\n const newFiles = selectedFiles.filter((_, i) => i !== index);\n setSelectedFiles(newFiles);\n onFilesChange(newFiles);\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\n };\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (disabled || uploading) return;\n\n const files = Array.from(e.dataTransfer.files);\n\n if (multiple) {\n setSelectedFiles((prev) => [...prev, ...files]);\n onFilesChange([...selectedFiles, ...files]);\n } else {\n setSelectedFiles(files.slice(0, 1));\n onFilesChange(files.slice(0, 1));\n }\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n return (\n <div className={className}>\n {label && (\n <label className=\"fs-text-sm fs-text-gray-700 fs-mb-1\">\n {label}\n {required && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n )}\n\n <div\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n className={`fs-border-2 fs-border-dashed fs-rounded-lg fs-p-6 fs-text-center ${\n disabled || uploading ? '' : 'fs-cursor-pointer fs-hover-border-blue-400 fs-hover-bg-blue-50'\n }`}\n style={{\n borderColor: '#d1d5db',\n backgroundColor: disabled || uploading ? '#f9fafb' : '#ffffff',\n cursor: disabled || uploading ? 'not-allowed' : 'pointer',\n }}\n onClick={() => !disabled && !uploading && fileInputRef.current?.click()}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n id={id}\n multiple={multiple}\n onChange={handleFileSelect}\n className=\"hidden\"\n disabled={disabled || uploading}\n required={required && selectedFiles.length === 0 && uploadedFiles.length === 0}\n accept={ALLOWED_FILE_EXTENSIONS}\n />\n\n <div className=\"fs-flex fs-flex-col fs-items-center\">\n <svg\n className=\"fs-text-gray-400\"\n style={{ width: '3rem', height: '3rem', margin: '0 auto 0.5rem' }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\"\n />\n </svg>\n <p className=\"fs-text-sm fs-text-gray-600 fs-mb-1\">\n {uploading ? (\n <span className=\"fs-text-blue-600\">Uploading files...</span>\n ) : (\n <>\n <span className=\"fs-text-blue-600\" style={{ fontWeight: 500 }}>Click to upload</span>\n {' or drag and drop'}\n </>\n )}\n </p>\n <p className=\"fs-text-xs fs-text-gray-500\">\n {multiple ? 'Multiple files supported' : 'Single file only'} (Images, PDFs, videos,\n audio - Max 15MB total)\n </p>\n </div>\n </div>\n\n {selectedFiles.length > 0 && (\n <div className=\"mt-3 space-y-2\">\n {selectedFiles.map((file, index) => (\n <div\n key={`${file.name}-${index}`}\n className=\"flex items-center justify-between p-2 bg-gray-50 rounded border border-gray-200\"\n >\n <div className=\"flex items-center space-x-2 flex-1 min-w-0\">\n <svg\n className=\"w-5 h-5 text-gray-400 flex-shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-700 truncate\">{file.name}</p>\n <p className=\"text-xs text-gray-500\">{formatFileSize(file.size)}</p>\n </div>\n </div>\n {!uploading && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeFile(index);\n }}\n className=\"ml-2 text-red-500 hover:text-red-700 flex-shrink-0\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n\n {uploadedFiles.length > 0 && (\n <div className=\"mt-3 space-y-2\">\n {uploadedFiles.map((fileKey, index) => {\n const filename = fileKey.split('/').pop()?.split('-').slice(2).join('-') || fileKey;\n return (\n <div\n key={index}\n className=\"flex items-center justify-between p-2 bg-green-50 rounded border border-green-200\"\n >\n <div className=\"flex items-center space-x-2 flex-1 min-w-0\">\n <svg\n className=\"w-5 h-5 text-green-500 flex-shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-green-700 truncate\">{filename}</p>\n <p className=\"text-xs text-green-600\">Uploaded</p>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {error && <p className=\"mt-2 text-sm text-red-600\">{error}</p>}\n </div>\n );\n};\n","/**\n * Inject base styles into the document head (same as embed script)\n */\nexport function injectBaseStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById('formsnip-base-styles')) return;\n\n const css = [\n '.fs-flex{display:flex}',\n '.fs-flex-col{flex-direction:column}',\n '.fs-gap-5{gap:1.25rem}',\n '.fs-gap-6{gap:1.5rem}',\n '.fs-relative{position:relative}',\n '.fs-absolute{position:absolute}',\n '.fs-right-5{right:1.25rem}',\n '.fs-top-5{top:1.25rem}',\n '.fs-top-half{top:50%}',\n '.fs-translate-y-half{transform:translateY(-50%)}',\n '.fs-w-full{width:100%}',\n '.fs-p-5{padding:1.25rem}',\n '.fs-pr-10{padding-right:2.5rem}',\n '.fs-px-3{padding-left:0.75rem;padding-right:0.75rem}',\n '.fs-px-4{padding-left:1rem;padding-right:1rem}',\n '.fs-py-2{padding-top:0.5rem;padding-bottom:0.5rem}',\n '.fs-py-3{padding-top:0.75rem;padding-bottom:0.75rem}',\n '.fs-rounded-md{border-radius:0.375rem}',\n '.fs-rounded-lg{border-radius:0.5rem}',\n '.fs-rounded-full{border-radius:9999px}',\n '.fs-h-\\\\[120px\\\\]{height:120px}',\n '.fs-h-\\\\[180px\\\\]{height:180px}',\n '.fs-resize-none{resize:none}',\n '.fs-text-red-500{color:#ef4444}',\n '.fs-pointer-events-none{pointer-events:none}',\n '.fs-font-medium{font-weight:500}',\n '.fs-text-base{font-size:1rem;line-height:1.5rem}',\n '.fs-text-lg{font-size:1.125rem;line-height:1.75rem}',\n '.fs-border{border-width:1px}',\n '.fs-border-2{border-width:2px}',\n '.fs-border-dashed{border-style:dashed}',\n '.fs-border-gray-300{border-color:#d1d5db}',\n '.fs-text-center{text-align:center}',\n '.fs-cursor-pointer{cursor:pointer}',\n '.fs-transition{transition-property:all;transition-timing-function:cubic-bezier(0.4,0,0.2,1);transition-duration:150ms}',\n '.fs-hover-border-blue-400:hover{border-color:#60a5fa}',\n '.fs-hover-bg-blue-50:hover{background-color:#eff6ff}',\n '.fs-mt-2{margin-top:0.5rem}',\n '.fs-mb-1{margin-bottom:0.25rem}',\n '.fs-text-xs{font-size:0.75rem;line-height:1rem}',\n '.fs-text-sm{font-size:0.875rem;line-height:1.25rem}',\n '.fs-text-gray-400{color:#9ca3af}',\n '.fs-text-gray-500{color:#6b7280}',\n '.fs-text-gray-600{color:#4b5563}',\n '.fs-text-gray-700{color:#374151}',\n '.fs-text-blue-600{color:#2563eb}',\n '.fs-text-green-600{color:#16a34a}',\n '.fs-text-red-600{color:#dc2626}',\n '.fs-bg-gray-50{background-color:#f9fafb}',\n '.fs-bg-green-50{background-color:#f0fdf4}',\n '.fs-border-gray-200{border-color:#e5e7eb}',\n '.fs-border-green-200{border-color:#bbf7d0}',\n '.fs-p-2{padding:0.5rem}',\n '.fs-p-6{padding:1.5rem}',\n '.fs-space-y-2>*+*{margin-top:0.5rem}',\n '.fs-flex-1{flex:1 1 0%}',\n '.fs-min-w-0{min-width:0}',\n '.fs-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',\n '.fs-flex-shrink-0{flex-shrink:0}',\n '.fs-items-center{align-items:center}',\n '.fs-justify-between{justify-content:space-between}',\n '.fs-space-x-2>*+*{margin-left:0.5rem}',\n '.fs-outline-none{outline:none}',\n '.fs-hover-opacity:hover{opacity:0.9}',\n ].join('');\n\n const style = document.createElement('style');\n style.id = 'formsnip-base-styles';\n style.type = 'text/css';\n style.appendChild(document.createTextNode(css));\n document.head.appendChild(style);\n}\n\n/**\n * Apply embed styles to an element (same logic as embed script)\n */\nexport function applyStyles(\n styles: React.CSSProperties,\n customStyles?: {\n backgroundColor?: string;\n color?: string;\n borderColor?: string;\n borderRadius?: number;\n paddingX?: number;\n paddingY?: number;\n fontSize?: number;\n fullWidth?: boolean;\n }\n): React.CSSProperties {\n if (!customStyles) return styles;\n\n const result = { ...styles };\n\n if (customStyles.backgroundColor) {\n result.backgroundColor = customStyles.backgroundColor;\n }\n if (customStyles.color) {\n result.color = customStyles.color;\n }\n if (customStyles.borderColor) {\n result.borderColor = customStyles.borderColor;\n result.border = `1px solid ${customStyles.borderColor}`;\n }\n if (customStyles.borderRadius !== undefined) {\n result.borderRadius = `${customStyles.borderRadius}px`;\n }\n if (customStyles.paddingX !== undefined || customStyles.paddingY !== undefined) {\n const px = customStyles.paddingX !== undefined ? customStyles.paddingX : 0;\n const py = customStyles.paddingY !== undefined ? customStyles.paddingY : 0;\n result.padding = `${py}px ${px}px`;\n }\n if (customStyles.fontSize !== undefined) {\n result.fontSize = `${customStyles.fontSize}px`;\n }\n // Note: fullWidth is handled separately in the component, not here\n // to ensure proper display property handling\n\n return result;\n}\n\n/**\n * CSS class names matching embed script\n */\nexport const CLASSES = {\n form: 'fs-flex fs-flex-col fs-gap-6',\n field: 'fs-field',\n inner: 'fs-relative',\n input: 'fs-px-4 fs-py-3 fs-w-full fs-rounded-lg fs-border fs-border-gray-300 fs-text-base fs-outline-none',\n textarea: 'fs-px-4 fs-py-3 fs-h-[120px] fs-w-full fs-rounded-lg fs-border fs-border-gray-300 fs-resize-none fs-text-base fs-outline-none',\n button: 'fs-px-6 fs-py-3 fs-rounded-lg fs-font-medium fs-text-base fs-cursor-pointer fs-transition fs-hover-opacity',\n};\n","/**\n * Push a GTM-friendly event to window.dataLayer after a successful submission.\n * Safe no-op in SSR or if dataLayer throws.\n */\nexport function pushFormSnipSubmissionDataLayer(options: {\n eventName?: string;\n formId: string;\n formName?: string;\n}): void {\n if (typeof window === 'undefined') return;\n try {\n const w = window as Window & { dataLayer?: unknown[] };\n w.dataLayer = w.dataLayer || [];\n w.dataLayer.push({\n event: options.eventName ?? 'formsnip_submission_success',\n formsnipFormId: options.formId,\n ...(options.formName ? { formsnipFormName: options.formName } : {}),\n });\n } catch {\n /* ignore */\n }\n}\n","import React, { useState, useEffect } from 'react';\nimport { Form, FormSnipProps, SubmissionResponse, FormField } from './types';\nimport { uploadFiles } from './utils/upload';\nimport { FileUpload } from './components/FileUpload';\nimport { injectBaseStyles, applyStyles, CLASSES } from './utils/styles';\nimport { pushFormSnipSubmissionDataLayer } from './utils/dataLayer';\n\n/** Build rows from flat fields (full = own row, half = paired in row) */\nfunction buildRowsFromFields(fields: FormField[]): FormField[][] {\n const rows: FormField[][] = [];\n let i = 0;\n while (i < fields.length) {\n const f = fields[i];\n const w = f.width ?? 'full';\n if (w === 'full') {\n rows.push([f]);\n i += 1;\n } else {\n const row = [f];\n i += 1;\n if (i < fields.length && (fields[i].width ?? 'full') === 'half') {\n row.push(fields[i]);\n i += 1;\n }\n rows.push(row);\n }\n }\n return rows;\n}\n\nconst DEFAULT_BASE_URL = 'https://api.formsnip.com';\n\nexport const FormSnip: React.FC<FormSnipProps> = ({\n formId,\n baseUrl = DEFAULT_BASE_URL,\n onSuccess,\n onError,\n className = '',\n prefill,\n pushDataLayerOnSuccess = false,\n dataLayerEventName,\n}) => {\n const [form, setForm] = useState<Form | null>(null);\n const [formData, setFormData] = useState<Record<string, string | string[]>>({});\n const [selectedFiles, setSelectedFiles] = useState<Record<string, File[]>>({});\n const [uploadingFiles, setUploadingFiles] = useState<Record<string, boolean>>({});\n const [uploadErrors, setUploadErrors] = useState<Record<string, string>>({});\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [submitSuccess, setSubmitSuccess] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n useEffect(() => {\n // Inject base styles on mount (same as embed script)\n injectBaseStyles();\n\n const fetchForm = async () => {\n try {\n const response = await fetch(`${baseUrl}/forms/get-form/${formId}`);\n if (!response.ok) {\n throw new Error('Failed to load form');\n }\n const json = await response.json();\n if (json.success && json.data) {\n // Form data includes embedStyles from the database\n // These styles are set in the EmbedForm page and stored in the Form model\n setForm(json.data);\n\n // Parse URL query once for prefill support\n let urlParams: URLSearchParams | null = null;\n if (typeof window !== 'undefined') {\n urlParams = new URLSearchParams(window.location.search);\n }\n\n // Initialize form data (including prefill prop and URL-based prefill for supported field types)\n const initialData = json.data.fields.reduce(\n (acc: Record<string, string | string[]>, field: Form['fields'][0]) => {\n if (field.type === 'file') {\n acc[field.id] = [];\n return acc;\n }\n\n let initialValue: string | string[] = '';\n\n const prefillKey = field.urlPrefillParam;\n const canPrefillType =\n field.type === 'text' ||\n field.type === 'email' ||\n field.type === 'textarea' ||\n field.type === 'number' ||\n field.type === 'date' ||\n field.type === 'datetime' ||\n field.type === 'phone' ||\n field.type === 'hidden' ||\n field.type === 'select';\n\n // 1) Prefill prop (takes precedence over URL)\n if (prefill && prefillKey && prefillKey.trim() !== '' && prefillKey in prefill) {\n const v = prefill[prefillKey];\n if (typeof v === 'string' && canPrefillType) {\n if (field.type === 'select' && Array.isArray(field.options) && !field.options.includes(v)) {\n // Ignore invalid option values for selects\n } else {\n initialValue = v;\n }\n }\n }\n\n // 2) URL-based prefill (only if no prefill prop was applied)\n if (initialValue === '' && urlParams && prefillKey && prefillKey.trim() !== '') {\n const v = urlParams.get(prefillKey);\n if (v !== null && v !== '') {\n if (canPrefillType) {\n if (field.type === 'select' && Array.isArray(field.options) && !field.options.includes(v)) {\n // Ignore invalid option values for selects\n } else {\n initialValue = v;\n }\n }\n }\n }\n\n // Debugging: log resolved prefill for hidden fields\n if (typeof window !== 'undefined' && field.type === 'hidden') {\n // eslint-disable-next-line no-console\n console.debug('FormSnip hidden prefill', {\n fieldId: field.id,\n prefillKey,\n resolvedValue: initialValue,\n hasDefault: !!field.value,\n });\n }\n\n // Hidden fields can also have a static default value from the schema\n if (initialValue === '' && field.type === 'hidden' && field.value) {\n initialValue = field.value;\n }\n\n acc[field.id] = initialValue;\n return acc;\n },\n {}\n );\n setFormData(initialData);\n setSelectedFiles({});\n } else {\n setError(json.message || 'Failed to load form');\n }\n } catch (err: any) {\n setError(err.message || 'Failed to load form');\n if (onError) {\n onError(err.message || 'Failed to load form');\n }\n } finally {\n setLoading(false);\n }\n };\n\n fetchForm();\n }, [formId, baseUrl, onError]);\n\n const handleInputChange = (fieldId: string, value: string) => {\n setFormData((prev) => ({\n ...prev,\n [fieldId]: value,\n }));\n };\n\n const handleFilesChange = async (fieldId: string, files: File[]) => {\n if (files.length === 0) {\n setSelectedFiles((prev) => ({ ...prev, [fieldId]: [] }));\n setFormData((prev) => ({ ...prev, [fieldId]: [] }));\n return;\n }\n\n setSelectedFiles((prev) => ({ ...prev, [fieldId]: files }));\n setUploadingFiles((prev) => ({ ...prev, [fieldId]: true }));\n setUploadErrors((prev) => {\n const newErrors = { ...prev };\n delete newErrors[fieldId];\n return newErrors;\n });\n\n const result = await uploadFiles(files, formId, baseUrl);\n\n setUploadingFiles((prev) => ({ ...prev, [fieldId]: false }));\n\n if (result.success && result.fileKeys && result.fileKeys.length > 0) {\n const existingFileKeys = Array.isArray(formData[fieldId])\n ? (formData[fieldId] as string[])\n : [];\n setFormData((prev) => ({\n ...prev,\n [fieldId]: [...existingFileKeys, ...result.fileKeys!],\n }));\n } else {\n setUploadErrors((prev) => ({\n ...prev,\n [fieldId]: result.errors?.join(', ') || 'Upload failed',\n }));\n }\n };\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n setSubmitError(null);\n setSubmitSuccess(false);\n setIsSubmitting(true);\n\n try {\n const response = await fetch(`${baseUrl}/submissions/create-submission/${formId}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Requested-With': 'XMLHttpRequest',\n },\n credentials: 'include',\n body: JSON.stringify(formData),\n });\n\n const json: SubmissionResponse = await response.json();\n\n if (response.ok && (json.success === undefined || json.success === true)) {\n setSubmitSuccess(true);\n if (pushDataLayerOnSuccess) {\n pushFormSnipSubmissionDataLayer({\n eventName: dataLayerEventName,\n formId,\n formName: form?.name,\n });\n }\n if (onSuccess) {\n onSuccess(json.data);\n }\n // Reset form\n const emptyData = Object.keys(formData).reduce(\n (acc: Record<string, string | string[]>, key) => {\n const field = form?.fields.find((f) => f.id === key);\n acc[key] = field?.type === 'file' ? [] : '';\n return acc;\n },\n {}\n );\n setFormData(emptyData);\n setSelectedFiles({});\n setUploadErrors({});\n } else {\n const errorMsg = json.message || 'Submission failed';\n setSubmitError(errorMsg);\n if (onError) {\n onError(errorMsg);\n }\n }\n } catch (err: any) {\n const errorMsg = err.message || 'Failed to submit form';\n setSubmitError(errorMsg);\n if (onError) {\n onError(errorMsg);\n }\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const renderField = (field: Form['fields'][0]) => {\n // Use embedStyles from database (set in EmbedForm page)\n const fieldStyles = form?.embedStyles?.field || {};\n const isRequired = field.required === true;\n\n const commonProps = {\n id: `field-${field.id}`,\n name: field.id,\n value: (formData[field.id] as string) || '',\n onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) =>\n handleInputChange(field.id, e.target.value),\n placeholder: field.placeholder || '',\n required: isRequired,\n style: applyStyles({}, fieldStyles),\n className: field.type === 'textarea' ? CLASSES.textarea : CLASSES.input,\n };\n\n const labelStyle: React.CSSProperties = {};\n if (fieldStyles.labelFontSize) {\n labelStyle.fontSize = `${fieldStyles.labelFontSize}px`;\n }\n\n if (field.type === 'hidden') {\n return (\n <input\n type=\"hidden\"\n id={`field-${field.id}`}\n name={field.id}\n value={(formData[field.id] as string) || field.value || ''}\n />\n );\n }\n\n // For checkbox and radio, return without extra wrapper\n if (field.type === 'checkbox') {\n return (\n <label className=\"fs-flex fs-items-center\">\n <input\n type=\"checkbox\"\n id={`field-${field.id}`}\n name={field.id}\n checked={String(formData[field.id]) === 'true' || formData[field.id] === 'on'}\n onChange={(e) => handleInputChange(field.id, e.target.checked ? 'true' : 'false')}\n required={isRequired}\n />\n <span style={{ marginLeft: '0.5rem' }}>{field.label || field.placeholder || 'Check this box'}</span>\n {isRequired && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n );\n }\n\n if (field.type === 'radio') {\n return (\n <div className=\"fs-relative\">\n <label className=\"fs-text-sm fs-text-gray-700 fs-mb-2\" style={{ fontWeight: 500 }}>\n {field.label}\n {isRequired && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n <label className=\"fs-flex fs-items-center\">\n <input\n type=\"radio\"\n id={`field-${field.id}-yes`}\n name={field.id}\n value=\"yes\"\n checked={formData[field.id] === 'yes'}\n onChange={(e) => handleInputChange(field.id, e.target.value)}\n required={isRequired}\n />\n <span style={{ marginLeft: '0.5rem' }}> Yes</span>\n </label>\n <label className=\"fs-flex fs-items-center\">\n <input\n type=\"radio\"\n id={`field-${field.id}-no`}\n name={field.id}\n value=\"no\"\n checked={formData[field.id] === 'no'}\n onChange={(e) => handleInputChange(field.id, e.target.value)}\n required={isRequired}\n />\n <span style={{ marginLeft: '0.5rem' }}> No</span>\n </label>\n </div>\n );\n }\n\n if (field.type === 'file') {\n const uploadedFileKeys = Array.isArray(formData[field.id])\n ? (formData[field.id] as string[])\n : formData[field.id]\n ? [formData[field.id] as string]\n : [];\n\n return (\n <>\n <label htmlFor={`field-${field.id}`} className=\"fs-text-sm fs-text-gray-700 fs-mb-2\" style={{ fontWeight: 500 }}>\n {field.label}\n {isRequired && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n <FileUpload\n id={field.id}\n required={isRequired}\n disabled={uploadingFiles[field.id]}\n multiple={true}\n onFilesChange={(files) => handleFilesChange(field.id, files)}\n uploadedFiles={uploadedFileKeys}\n uploading={uploadingFiles[field.id]}\n error={uploadErrors[field.id]}\n />\n </>\n );\n }\n\n // For other fields, use minimal wrapper structure\n return (\n <>\n <label htmlFor={`field-${field.id}`} className=\"fs-text-sm fs-text-gray-700 fs-mb-2\" style={{ fontWeight: 500, ...labelStyle }}>\n {field.label}\n {isRequired && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n <div className={CLASSES.inner}>\n {field.type === 'select' ? (\n <select\n id={`field-${field.id}`}\n name={field.id}\n value={(formData[field.id] as string) || ''}\n onChange={(e) => handleInputChange(field.id, e.target.value)}\n required={isRequired}\n style={applyStyles({}, fieldStyles)}\n className={CLASSES.input}\n >\n <option value=\"\">{field.placeholder || 'Select an option'}</option>\n {field.options?.map((option, index) => (\n <option key={index} value={option}>\n {option}\n </option>\n ))}\n </select>\n ) : field.type === 'textarea' ? (\n <textarea {...commonProps} rows={4} />\n ) : field.type === 'phone' ? (\n <input type=\"tel\" {...commonProps} />\n ) : field.type === 'datetime' ? (\n <input type=\"datetime-local\" {...commonProps} />\n ) : (\n <input type={field.type || 'text'} {...commonProps} />\n )}\n </div>\n </>\n );\n };\n\n if (loading) {\n const content = (\n <div className=\"fs-text-center\" style={{ padding: '2rem 0' }}>\n <p className=\"fs-text-gray-600\">Loading form...</p>\n </div>\n );\n return className ? <div className={className}>{content}</div> : content;\n }\n\n if (error || !form) {\n const content = (\n <div className=\"fs-text-center\" style={{ padding: '2rem 0' }}>\n <p className=\"fs-text-red-600\">{error || 'Form not found'}</p>\n </div>\n );\n return className ? <div className={className}>{content}</div> : content;\n }\n\n // Use embedStyles from database (set in EmbedForm page)\n const buttonStyles = form.embedStyles?.button || {};\n\n const content = (\n <>\n <div id=\"formsnip-message\"></div>\n {submitError && (\n <div\n className=\"fs-px-3 fs-py-2 fs-rounded-md\"\n style={{\n color: '#991b1b',\n background: '#fee2e2',\n border: '1px solid #fecaca',\n marginBottom: '1rem',\n }}\n >\n {submitError}\n </div>\n )}\n\n {submitSuccess && (\n <div\n className=\"fs-px-3 fs-py-2 fs-rounded-md\"\n style={{\n color: '#166534',\n background: '#dcfce7',\n border: '1px solid #bbf7d0',\n marginBottom: '1rem',\n }}\n >\n {form.validation?.confirmationText || 'Thank you! Your submission has been received.'}\n </div>\n )}\n\n <form id=\"formsnip-form\" onSubmit={handleSubmit} className={CLASSES.form}>\n {/* Render hidden fields directly without wrappers */}\n {form.fields.filter((f) => f.isActive !== false && f.type === 'hidden').map((field) => (\n <React.Fragment key={field.id}>{renderField(field)}</React.Fragment>\n ))}\n \n {/* Render visible fields in rows */}\n {buildRowsFromFields(form.fields.filter((f) => f.isActive !== false && f.type !== 'hidden')).map((row, rowIdx) =>\n row.length === 1 ? (\n <div key={row[0].id} style={{ display: 'flex', flexDirection: 'column' }}>\n {renderField(row[0])}\n </div>\n ) : (\n <div\n key={`row-${rowIdx}`}\n style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '1.25rem' }}\n >\n {row.map((field) => (\n <div key={field.id} style={{ display: 'flex', flexDirection: 'column' }}>\n {renderField(field)}\n </div>\n ))}\n </div>\n )\n )}\n\n <button\n type=\"submit\"\n disabled={isSubmitting}\n className={CLASSES.button}\n style={{\n ...applyStyles({}, buttonStyles),\n // Explicitly control width: only full width if explicitly set to true\n // When false or undefined, ensure button is NOT full width\n width: buttonStyles.fullWidth === true ? '100%' : 'auto',\n display: buttonStyles.fullWidth === true ? 'block' : 'inline-block',\n maxWidth: buttonStyles.fullWidth === true ? undefined : 'fit-content',\n }}\n >\n {isSubmitting ? 'Submitting...' : form.submitButtonText || 'Submit'}\n </button>\n </form>\n </>\n );\n\n return className ? <div className={className}>{content}</div> : content;\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/utils/upload.ts","../src/components/FileUpload.tsx","../src/utils/styles.ts","../src/utils/dataLayer.ts","../src/FormSnip.tsx"],"sourcesContent":["const ALLOWED_FILE_EXTENSIONS = '.jpg,.jpeg,.png,.gif,.webp,.svg,.pdf,.mp4,.mpeg,.mov,.avi,.webm,.mkv,.mp3,.wav,.ogg,.aac,.flac';\nconst MAX_TOTAL_FILE_SIZE = 15 * 1024 * 1024; // 15MB\n\nexport interface UploadResult {\n success: boolean;\n fileKey?: string;\n error?: string;\n}\n\nexport interface UploadMultipleResult {\n success: boolean;\n fileKeys?: string[];\n errors?: string[];\n}\n\n/**\n * Upload a file to R2 via presigned URL\n */\nexport async function uploadFile(\n file: File,\n formId: string,\n baseUrl: string\n): Promise<UploadResult> {\n try {\n // Step 1: Get presigned upload URL\n const signResponse = await fetch(`${baseUrl}/uploads/sign`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n credentials: 'include',\n body: JSON.stringify({\n filename: file.name,\n contentType: file.type,\n size: file.size,\n formId,\n }),\n });\n\n if (!signResponse.ok) {\n return {\n success: false,\n error: 'Failed to get upload URL',\n };\n }\n\n const signData = await signResponse.json();\n if (!signData.success || !signData.data) {\n return {\n success: false,\n error: signData.message || 'Invalid upload URL response',\n };\n }\n\n const { uploadUrl, fileKey } = signData.data;\n\n // Step 2: Upload file directly to R2\n const uploadResponse = await fetch(uploadUrl, {\n method: 'PUT',\n body: file,\n headers: {\n 'Content-Type': file.type,\n },\n });\n\n if (!uploadResponse.ok) {\n return {\n success: false,\n error: `Upload failed: ${uploadResponse.statusText}`,\n };\n }\n\n return {\n success: true,\n fileKey,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n}\n\n/**\n * Upload multiple files to R2\n */\nexport async function uploadFiles(\n files: File[],\n formId: string,\n baseUrl: string\n): Promise<UploadMultipleResult> {\n // Check total size\n const totalSize = files.reduce((sum, file) => sum + file.size, 0);\n if (totalSize > MAX_TOTAL_FILE_SIZE) {\n return {\n success: false,\n errors: [`Total file size exceeds 15MB limit per submission`],\n };\n }\n\n const results = await Promise.allSettled(\n files.map((file) => uploadFile(file, formId, baseUrl))\n );\n\n const fileKeys: string[] = [];\n const errors: string[] = [];\n\n results.forEach((result, index) => {\n if (result.status === 'fulfilled' && result.value.success && result.value.fileKey) {\n fileKeys.push(result.value.fileKey);\n } else {\n const error =\n result.status === 'fulfilled'\n ? result.value.error || 'Upload failed'\n : result.reason?.message || 'Upload failed';\n errors.push(`${files[index].name}: ${error}`);\n }\n });\n\n return {\n success: fileKeys.length > 0,\n fileKeys: fileKeys.length > 0 ? fileKeys : undefined,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n\nexport { ALLOWED_FILE_EXTENSIONS, MAX_TOTAL_FILE_SIZE };\n","import React, { useRef, useState } from 'react';\nimport { ALLOWED_FILE_EXTENSIONS } from '../utils/upload';\nimport { CLASSES } from '../utils/styles';\n\ninterface FileUploadProps {\n id: string;\n label?: string;\n required?: boolean;\n disabled?: boolean;\n multiple?: boolean;\n onFilesChange: (files: File[]) => void;\n uploadedFiles?: string[];\n uploading?: boolean;\n error?: string;\n className?: string;\n}\n\nexport const FileUpload: React.FC<FileUploadProps> = ({\n id,\n label,\n required = false,\n disabled = false,\n multiple = true,\n onFilesChange,\n uploadedFiles = [],\n uploading = false,\n error,\n className = '',\n}) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n\n if (multiple) {\n setSelectedFiles((prev) => [...prev, ...files]);\n onFilesChange([...selectedFiles, ...files]);\n } else {\n setSelectedFiles(files);\n onFilesChange(files);\n }\n };\n\n const removeFile = (index: number) => {\n const newFiles = selectedFiles.filter((_, i) => i !== index);\n setSelectedFiles(newFiles);\n onFilesChange(newFiles);\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\n };\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (disabled || uploading) return;\n\n const files = Array.from(e.dataTransfer.files);\n\n if (multiple) {\n setSelectedFiles((prev) => [...prev, ...files]);\n onFilesChange([...selectedFiles, ...files]);\n } else {\n setSelectedFiles(files.slice(0, 1));\n onFilesChange(files.slice(0, 1));\n }\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n return (\n <div className={className}>\n {label && (\n <label className=\"fs-text-sm fs-text-gray-700 fs-mb-1\">\n {label}\n {required && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n )}\n\n <div\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n className={`fs-border-2 fs-border-dashed fs-rounded-lg fs-p-6 fs-text-center ${\n disabled || uploading ? '' : 'fs-cursor-pointer fs-hover-border-blue-400 fs-hover-bg-blue-50'\n }`}\n style={{\n borderColor: '#d1d5db',\n backgroundColor: disabled || uploading ? '#f9fafb' : '#ffffff',\n cursor: disabled || uploading ? 'not-allowed' : 'pointer',\n }}\n onClick={() => !disabled && !uploading && fileInputRef.current?.click()}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n id={id}\n multiple={multiple}\n onChange={handleFileSelect}\n className=\"hidden\"\n disabled={disabled || uploading}\n required={required && selectedFiles.length === 0 && uploadedFiles.length === 0}\n accept={ALLOWED_FILE_EXTENSIONS}\n />\n\n <div className=\"fs-flex fs-flex-col fs-items-center\">\n <svg\n className=\"fs-text-gray-400\"\n style={{ width: '3rem', height: '3rem', margin: '0 auto 0.5rem' }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\"\n />\n </svg>\n <p className=\"fs-text-sm fs-text-gray-600 fs-mb-1\">\n {uploading ? (\n <span className=\"fs-text-blue-600\">Uploading files...</span>\n ) : (\n <>\n <span className=\"fs-text-blue-600\" style={{ fontWeight: 500 }}>Click to upload</span>\n {' or drag and drop'}\n </>\n )}\n </p>\n <p className=\"fs-text-xs fs-text-gray-500\">\n {multiple ? 'Multiple files supported' : 'Single file only'} (Images, PDFs, videos,\n audio - Max 15MB total)\n </p>\n </div>\n </div>\n\n {selectedFiles.length > 0 && (\n <div className=\"mt-3 space-y-2\">\n {selectedFiles.map((file, index) => (\n <div\n key={`${file.name}-${index}`}\n className=\"flex items-center justify-between p-2 bg-gray-50 rounded border border-gray-200\"\n >\n <div className=\"flex items-center space-x-2 flex-1 min-w-0\">\n <svg\n className=\"w-5 h-5 text-gray-400 flex-shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-700 truncate\">{file.name}</p>\n <p className=\"text-xs text-gray-500\">{formatFileSize(file.size)}</p>\n </div>\n </div>\n {!uploading && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeFile(index);\n }}\n className=\"ml-2 text-red-500 hover:text-red-700 flex-shrink-0\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n\n {uploadedFiles.length > 0 && (\n <div className=\"mt-3 space-y-2\">\n {uploadedFiles.map((fileKey, index) => {\n const filename = fileKey.split('/').pop()?.split('-').slice(2).join('-') || fileKey;\n return (\n <div\n key={index}\n className=\"flex items-center justify-between p-2 bg-green-50 rounded border border-green-200\"\n >\n <div className=\"flex items-center space-x-2 flex-1 min-w-0\">\n <svg\n className=\"w-5 h-5 text-green-500 flex-shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-green-700 truncate\">{filename}</p>\n <p className=\"text-xs text-green-600\">Uploaded</p>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {error && <p className=\"mt-2 text-sm text-red-600\">{error}</p>}\n </div>\n );\n};\n","/**\n * Inject base styles into the document head (same as embed script)\n */\nexport function injectBaseStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById('formsnip-base-styles')) return;\n\n const css = [\n '.fs-flex{display:flex}',\n '.fs-flex-col{flex-direction:column}',\n '.fs-gap-5{gap:1.25rem}',\n '.fs-gap-6{gap:1.5rem}',\n '.fs-relative{position:relative}',\n '.fs-absolute{position:absolute}',\n '.fs-right-5{right:1.25rem}',\n '.fs-top-5{top:1.25rem}',\n '.fs-top-half{top:50%}',\n '.fs-translate-y-half{transform:translateY(-50%)}',\n '.fs-w-full{width:100%}',\n '.fs-p-5{padding:1.25rem}',\n '.fs-pr-10{padding-right:2.5rem}',\n '.fs-px-3{padding-left:0.75rem;padding-right:0.75rem}',\n '.fs-px-4{padding-left:1rem;padding-right:1rem}',\n '.fs-py-2{padding-top:0.5rem;padding-bottom:0.5rem}',\n '.fs-py-3{padding-top:0.75rem;padding-bottom:0.75rem}',\n '.fs-rounded-md{border-radius:0.375rem}',\n '.fs-rounded-lg{border-radius:0.5rem}',\n '.fs-rounded-full{border-radius:9999px}',\n '.fs-h-\\\\[120px\\\\]{height:120px}',\n '.fs-h-\\\\[180px\\\\]{height:180px}',\n '.fs-resize-none{resize:none}',\n '.fs-text-red-500{color:#ef4444}',\n '.fs-pointer-events-none{pointer-events:none}',\n '.fs-font-medium{font-weight:500}',\n '.fs-text-base{font-size:1rem;line-height:1.5rem}',\n '.fs-text-lg{font-size:1.125rem;line-height:1.75rem}',\n '.fs-border{border-width:1px}',\n '.fs-border-2{border-width:2px}',\n '.fs-border-dashed{border-style:dashed}',\n '.fs-border-gray-300{border-color:#d1d5db}',\n '.fs-text-center{text-align:center}',\n '.fs-cursor-pointer{cursor:pointer}',\n '.fs-transition{transition-property:all;transition-timing-function:cubic-bezier(0.4,0,0.2,1);transition-duration:150ms}',\n '.fs-hover-border-blue-400:hover{border-color:#60a5fa}',\n '.fs-hover-bg-blue-50:hover{background-color:#eff6ff}',\n '.fs-mt-2{margin-top:0.5rem}',\n '.fs-mb-1{margin-bottom:0.25rem}',\n '.fs-text-xs{font-size:0.75rem;line-height:1rem}',\n '.fs-text-sm{font-size:0.875rem;line-height:1.25rem}',\n '.fs-text-gray-400{color:#9ca3af}',\n '.fs-text-gray-500{color:#6b7280}',\n '.fs-text-gray-600{color:#4b5563}',\n '.fs-text-gray-700{color:#374151}',\n '.fs-text-blue-600{color:#2563eb}',\n '.fs-text-green-600{color:#16a34a}',\n '.fs-text-red-600{color:#dc2626}',\n '.fs-bg-gray-50{background-color:#f9fafb}',\n '.fs-bg-green-50{background-color:#f0fdf4}',\n '.fs-border-gray-200{border-color:#e5e7eb}',\n '.fs-border-green-200{border-color:#bbf7d0}',\n '.fs-p-2{padding:0.5rem}',\n '.fs-p-6{padding:1.5rem}',\n '.fs-space-y-2>*+*{margin-top:0.5rem}',\n '.fs-flex-1{flex:1 1 0%}',\n '.fs-min-w-0{min-width:0}',\n '.fs-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',\n '.fs-flex-shrink-0{flex-shrink:0}',\n '.fs-items-center{align-items:center}',\n '.fs-justify-between{justify-content:space-between}',\n '.fs-space-x-2>*+*{margin-left:0.5rem}',\n '.fs-outline-none{outline:none}',\n '.fs-hover-opacity:hover{opacity:0.9}',\n ].join('');\n\n const style = document.createElement('style');\n style.id = 'formsnip-base-styles';\n style.type = 'text/css';\n style.appendChild(document.createTextNode(css));\n document.head.appendChild(style);\n}\n\n/**\n * Apply embed styles to an element (same logic as embed script)\n */\nexport function applyStyles(\n styles: React.CSSProperties,\n customStyles?: {\n backgroundColor?: string;\n color?: string;\n borderColor?: string;\n borderRadius?: number;\n paddingX?: number;\n paddingY?: number;\n fontSize?: number;\n fullWidth?: boolean;\n }\n): React.CSSProperties {\n if (!customStyles) return styles;\n\n const result = { ...styles };\n\n if (customStyles.backgroundColor) {\n result.backgroundColor = customStyles.backgroundColor;\n }\n if (customStyles.color) {\n result.color = customStyles.color;\n }\n if (customStyles.borderColor) {\n result.borderColor = customStyles.borderColor;\n result.border = `1px solid ${customStyles.borderColor}`;\n }\n if (customStyles.borderRadius !== undefined) {\n result.borderRadius = `${customStyles.borderRadius}px`;\n }\n if (customStyles.paddingX !== undefined || customStyles.paddingY !== undefined) {\n const px = customStyles.paddingX !== undefined ? customStyles.paddingX : 0;\n const py = customStyles.paddingY !== undefined ? customStyles.paddingY : 0;\n result.padding = `${py}px ${px}px`;\n }\n if (customStyles.fontSize !== undefined) {\n result.fontSize = `${customStyles.fontSize}px`;\n }\n // Note: fullWidth is handled separately in the component, not here\n // to ensure proper display property handling\n\n return result;\n}\n\n/**\n * CSS class names matching embed script\n */\nexport const CLASSES = {\n form: 'fs-flex fs-flex-col fs-gap-6',\n field: 'fs-field',\n inner: 'fs-relative',\n input: 'fs-px-4 fs-py-3 fs-w-full fs-rounded-lg fs-border fs-border-gray-300 fs-text-base fs-outline-none',\n textarea: 'fs-px-4 fs-py-3 fs-h-[120px] fs-w-full fs-rounded-lg fs-border fs-border-gray-300 fs-resize-none fs-text-base fs-outline-none',\n button: 'fs-px-6 fs-py-3 fs-rounded-lg fs-font-medium fs-text-base fs-cursor-pointer fs-transition fs-hover-opacity',\n};\n","/**\n * Push a GTM-friendly event to the global dataLayer after a successful submission.\n * Uses `globalThis` so it works in typical browser bundles. Safe no-op if push throws.\n */\nexport function pushFormSnipSubmissionDataLayer(options: {\n formId: string;\n formName?: string;\n}): void {\n try {\n if (typeof globalThis === 'undefined') return;\n const g = globalThis as typeof globalThis & { dataLayer?: unknown[] };\n const layer = Array.isArray(g.dataLayer) ? g.dataLayer : [];\n g.dataLayer = layer;\n layer.push({\n event: 'formsnip_submission_success',\n formsnipFormId: options.formId,\n ...(options.formName ? { formsnipFormName: options.formName } : {}),\n });\n } catch {\n /* ignore */\n }\n}\n","import React, { useState, useEffect } from 'react';\nimport { Form, FormSnipProps, SubmissionResponse, FormField } from './types';\nimport { uploadFiles } from './utils/upload';\nimport { FileUpload } from './components/FileUpload';\nimport { injectBaseStyles, applyStyles, CLASSES } from './utils/styles';\nimport { pushFormSnipSubmissionDataLayer } from './utils/dataLayer';\n\n/** Build rows from flat fields (full = own row, half = paired in row) */\nfunction buildRowsFromFields(fields: FormField[]): FormField[][] {\n const rows: FormField[][] = [];\n let i = 0;\n while (i < fields.length) {\n const f = fields[i];\n const w = f.width ?? 'full';\n if (w === 'full') {\n rows.push([f]);\n i += 1;\n } else {\n const row = [f];\n i += 1;\n if (i < fields.length && (fields[i].width ?? 'full') === 'half') {\n row.push(fields[i]);\n i += 1;\n }\n rows.push(row);\n }\n }\n return rows;\n}\n\nconst DEFAULT_BASE_URL = 'https://api.formsnip.com';\n\nexport const FormSnip: React.FC<FormSnipProps> = ({\n formId,\n baseUrl = DEFAULT_BASE_URL,\n onSuccess,\n onError,\n className = '',\n prefill,\n}) => {\n const [form, setForm] = useState<Form | null>(null);\n const [formData, setFormData] = useState<Record<string, string | string[]>>({});\n const [selectedFiles, setSelectedFiles] = useState<Record<string, File[]>>({});\n const [uploadingFiles, setUploadingFiles] = useState<Record<string, boolean>>({});\n const [uploadErrors, setUploadErrors] = useState<Record<string, string>>({});\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [submitSuccess, setSubmitSuccess] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n useEffect(() => {\n // Inject base styles on mount (same as embed script)\n injectBaseStyles();\n\n const fetchForm = async () => {\n try {\n const response = await fetch(`${baseUrl}/forms/get-form/${formId}`);\n if (!response.ok) {\n throw new Error('Failed to load form');\n }\n const json = await response.json();\n if (json.success && json.data) {\n // Form data includes embedStyles from the database\n // These styles are set in the EmbedForm page and stored in the Form model\n setForm(json.data);\n\n // Parse URL query once for prefill support\n let urlParams: URLSearchParams | null = null;\n if (typeof window !== 'undefined') {\n urlParams = new URLSearchParams(window.location.search);\n }\n\n // Initialize form data (including prefill prop and URL-based prefill for supported field types)\n const initialData = json.data.fields.reduce(\n (acc: Record<string, string | string[]>, field: Form['fields'][0]) => {\n if (field.type === 'file') {\n acc[field.id] = [];\n return acc;\n }\n\n let initialValue: string | string[] = '';\n\n const prefillKey = field.urlPrefillParam;\n const canPrefillType =\n field.type === 'text' ||\n field.type === 'email' ||\n field.type === 'textarea' ||\n field.type === 'number' ||\n field.type === 'date' ||\n field.type === 'datetime' ||\n field.type === 'phone' ||\n field.type === 'hidden' ||\n field.type === 'select';\n\n // 1) Prefill prop (takes precedence over URL)\n if (prefill && prefillKey && prefillKey.trim() !== '' && prefillKey in prefill) {\n const v = prefill[prefillKey];\n if (typeof v === 'string' && canPrefillType) {\n if (field.type === 'select' && Array.isArray(field.options) && !field.options.includes(v)) {\n // Ignore invalid option values for selects\n } else {\n initialValue = v;\n }\n }\n }\n\n // 2) URL-based prefill (only if no prefill prop was applied)\n if (initialValue === '' && urlParams && prefillKey && prefillKey.trim() !== '') {\n const v = urlParams.get(prefillKey);\n if (v !== null && v !== '') {\n if (canPrefillType) {\n if (field.type === 'select' && Array.isArray(field.options) && !field.options.includes(v)) {\n // Ignore invalid option values for selects\n } else {\n initialValue = v;\n }\n }\n }\n }\n\n // Hidden fields can also have a static default value from the schema\n if (initialValue === '' && field.type === 'hidden' && field.value) {\n initialValue = field.value;\n }\n\n acc[field.id] = initialValue;\n return acc;\n },\n {}\n );\n setFormData(initialData);\n setSelectedFiles({});\n } else {\n setError(json.message || 'Failed to load form');\n }\n } catch (err: any) {\n setError(err.message || 'Failed to load form');\n if (onError) {\n onError(err.message || 'Failed to load form');\n }\n } finally {\n setLoading(false);\n }\n };\n\n fetchForm();\n }, [formId, baseUrl, onError]);\n\n const handleInputChange = (fieldId: string, value: string) => {\n setFormData((prev) => ({\n ...prev,\n [fieldId]: value,\n }));\n };\n\n const handleFilesChange = async (fieldId: string, files: File[]) => {\n if (files.length === 0) {\n setSelectedFiles((prev) => ({ ...prev, [fieldId]: [] }));\n setFormData((prev) => ({ ...prev, [fieldId]: [] }));\n return;\n }\n\n setSelectedFiles((prev) => ({ ...prev, [fieldId]: files }));\n setUploadingFiles((prev) => ({ ...prev, [fieldId]: true }));\n setUploadErrors((prev) => {\n const newErrors = { ...prev };\n delete newErrors[fieldId];\n return newErrors;\n });\n\n const result = await uploadFiles(files, formId, baseUrl);\n\n setUploadingFiles((prev) => ({ ...prev, [fieldId]: false }));\n\n if (result.success && result.fileKeys && result.fileKeys.length > 0) {\n const existingFileKeys = Array.isArray(formData[fieldId])\n ? (formData[fieldId] as string[])\n : [];\n setFormData((prev) => ({\n ...prev,\n [fieldId]: [...existingFileKeys, ...result.fileKeys!],\n }));\n } else {\n setUploadErrors((prev) => ({\n ...prev,\n [fieldId]: result.errors?.join(', ') || 'Upload failed',\n }));\n }\n };\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n setSubmitError(null);\n setSubmitSuccess(false);\n setIsSubmitting(true);\n\n try {\n const response = await fetch(`${baseUrl}/submissions/create-submission/${formId}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Requested-With': 'XMLHttpRequest',\n },\n credentials: 'include',\n body: JSON.stringify(formData),\n });\n\n const json: SubmissionResponse = await response.json();\n\n if (response.ok && (json.success === undefined || json.success === true)) {\n setSubmitSuccess(true);\n pushFormSnipSubmissionDataLayer({\n formId,\n formName: form?.name,\n });\n if (onSuccess) {\n onSuccess(json.data);\n }\n // Reset form\n const emptyData = Object.keys(formData).reduce(\n (acc: Record<string, string | string[]>, key) => {\n const field = form?.fields.find((f) => f.id === key);\n acc[key] = field?.type === 'file' ? [] : '';\n return acc;\n },\n {}\n );\n setFormData(emptyData);\n setSelectedFiles({});\n setUploadErrors({});\n } else {\n const errorMsg = json.message || 'Submission failed';\n setSubmitError(errorMsg);\n if (onError) {\n onError(errorMsg);\n }\n }\n } catch (err: any) {\n const errorMsg = err.message || 'Failed to submit form';\n setSubmitError(errorMsg);\n if (onError) {\n onError(errorMsg);\n }\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const renderField = (field: Form['fields'][0]) => {\n // Use embedStyles from database (set in EmbedForm page)\n const fieldStyles = form?.embedStyles?.field || {};\n const isRequired = field.required === true;\n\n const commonProps = {\n id: `field-${field.id}`,\n name: field.id,\n value: (formData[field.id] as string) || '',\n onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) =>\n handleInputChange(field.id, e.target.value),\n placeholder: field.placeholder || '',\n required: isRequired,\n style: applyStyles({}, fieldStyles),\n className: field.type === 'textarea' ? CLASSES.textarea : CLASSES.input,\n };\n\n const labelStyle: React.CSSProperties = {};\n if (fieldStyles.labelFontSize) {\n labelStyle.fontSize = `${fieldStyles.labelFontSize}px`;\n }\n\n if (field.type === 'hidden') {\n return (\n <input\n type=\"hidden\"\n id={`field-${field.id}`}\n name={field.id}\n value={(formData[field.id] as string) || field.value || ''}\n />\n );\n }\n\n // For checkbox and radio, return without extra wrapper\n if (field.type === 'checkbox') {\n return (\n <label className=\"fs-flex fs-items-center\">\n <input\n type=\"checkbox\"\n id={`field-${field.id}`}\n name={field.id}\n checked={String(formData[field.id]) === 'true' || formData[field.id] === 'on'}\n onChange={(e) => handleInputChange(field.id, e.target.checked ? 'true' : 'false')}\n required={isRequired}\n />\n <span style={{ marginLeft: '0.5rem' }}>{field.label || field.placeholder || 'Check this box'}</span>\n {isRequired && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n );\n }\n\n if (field.type === 'radio') {\n return (\n <div className=\"fs-relative\">\n <label className=\"fs-text-sm fs-text-gray-700 fs-mb-2\" style={{ fontWeight: 500 }}>\n {field.label}\n {isRequired && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n <label className=\"fs-flex fs-items-center\">\n <input\n type=\"radio\"\n id={`field-${field.id}-yes`}\n name={field.id}\n value=\"yes\"\n checked={formData[field.id] === 'yes'}\n onChange={(e) => handleInputChange(field.id, e.target.value)}\n required={isRequired}\n />\n <span style={{ marginLeft: '0.5rem' }}> Yes</span>\n </label>\n <label className=\"fs-flex fs-items-center\">\n <input\n type=\"radio\"\n id={`field-${field.id}-no`}\n name={field.id}\n value=\"no\"\n checked={formData[field.id] === 'no'}\n onChange={(e) => handleInputChange(field.id, e.target.value)}\n required={isRequired}\n />\n <span style={{ marginLeft: '0.5rem' }}> No</span>\n </label>\n </div>\n );\n }\n\n if (field.type === 'file') {\n const uploadedFileKeys = Array.isArray(formData[field.id])\n ? (formData[field.id] as string[])\n : formData[field.id]\n ? [formData[field.id] as string]\n : [];\n\n return (\n <>\n <label htmlFor={`field-${field.id}`} className=\"fs-text-sm fs-text-gray-700 fs-mb-2\" style={{ fontWeight: 500 }}>\n {field.label}\n {isRequired && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n <FileUpload\n id={field.id}\n required={isRequired}\n disabled={uploadingFiles[field.id]}\n multiple={true}\n onFilesChange={(files) => handleFilesChange(field.id, files)}\n uploadedFiles={uploadedFileKeys}\n uploading={uploadingFiles[field.id]}\n error={uploadErrors[field.id]}\n />\n </>\n );\n }\n\n // For other fields, use minimal wrapper structure\n return (\n <>\n <label htmlFor={`field-${field.id}`} className=\"fs-text-sm fs-text-gray-700 fs-mb-2\" style={{ fontWeight: 500, ...labelStyle }}>\n {field.label}\n {isRequired && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n <div className={CLASSES.inner}>\n {field.type === 'select' ? (\n <select\n id={`field-${field.id}`}\n name={field.id}\n value={(formData[field.id] as string) || ''}\n onChange={(e) => handleInputChange(field.id, e.target.value)}\n required={isRequired}\n style={applyStyles({}, fieldStyles)}\n className={CLASSES.input}\n >\n <option value=\"\">{field.placeholder || 'Select an option'}</option>\n {field.options?.map((option, index) => (\n <option key={index} value={option}>\n {option}\n </option>\n ))}\n </select>\n ) : field.type === 'textarea' ? (\n <textarea {...commonProps} rows={4} />\n ) : field.type === 'phone' ? (\n <input type=\"tel\" {...commonProps} />\n ) : field.type === 'datetime' ? (\n <input type=\"datetime-local\" {...commonProps} />\n ) : (\n <input type={field.type || 'text'} {...commonProps} />\n )}\n </div>\n </>\n );\n };\n\n if (loading) {\n const content = (\n <div className=\"fs-text-center\" style={{ padding: '2rem 0' }}>\n <p className=\"fs-text-gray-600\">Loading form...</p>\n </div>\n );\n return className ? <div className={className}>{content}</div> : content;\n }\n\n if (error || !form) {\n const content = (\n <div className=\"fs-text-center\" style={{ padding: '2rem 0' }}>\n <p className=\"fs-text-red-600\">{error || 'Form not found'}</p>\n </div>\n );\n return className ? <div className={className}>{content}</div> : content;\n }\n\n // Use embedStyles from database (set in EmbedForm page)\n const buttonStyles = form.embedStyles?.button || {};\n\n const content = (\n <>\n <div id=\"formsnip-message\"></div>\n {submitError && (\n <div\n className=\"fs-px-3 fs-py-2 fs-rounded-md\"\n style={{\n color: '#991b1b',\n background: '#fee2e2',\n border: '1px solid #fecaca',\n marginBottom: '1rem',\n }}\n >\n {submitError}\n </div>\n )}\n\n {submitSuccess && (\n <div\n className=\"fs-px-3 fs-py-2 fs-rounded-md\"\n style={{\n color: '#166534',\n background: '#dcfce7',\n border: '1px solid #bbf7d0',\n marginBottom: '1rem',\n }}\n >\n {form.validation?.confirmationText || 'Thank you! Your submission has been received.'}\n </div>\n )}\n\n <form id=\"formsnip-form\" onSubmit={handleSubmit} className={CLASSES.form}>\n {/* Render hidden fields directly without wrappers */}\n {form.fields.filter((f) => f.isActive !== false && f.type === 'hidden').map((field) => (\n <React.Fragment key={field.id}>{renderField(field)}</React.Fragment>\n ))}\n \n {/* Render visible fields in rows */}\n {buildRowsFromFields(form.fields.filter((f) => f.isActive !== false && f.type !== 'hidden')).map((row, rowIdx) =>\n row.length === 1 ? (\n <div key={row[0].id} style={{ display: 'flex', flexDirection: 'column' }}>\n {renderField(row[0])}\n </div>\n ) : (\n <div\n key={`row-${rowIdx}`}\n style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '1.25rem' }}\n >\n {row.map((field) => (\n <div key={field.id} style={{ display: 'flex', flexDirection: 'column' }}>\n {renderField(field)}\n </div>\n ))}\n </div>\n )\n )}\n\n <button\n type=\"submit\"\n disabled={isSubmitting}\n className={CLASSES.button}\n style={{\n ...applyStyles({}, buttonStyles),\n // Explicitly control width: only full width if explicitly set to true\n // When false or undefined, ensure button is NOT full width\n width: buttonStyles.fullWidth === true ? '100%' : 'auto',\n display: buttonStyles.fullWidth === true ? 'block' : 'inline-block',\n maxWidth: buttonStyles.fullWidth === true ? undefined : 'fit-content',\n }}\n >\n {isSubmitting ? 'Submitting...' : form.submitButtonText || 'Submit'}\n </button>\n </form>\n </>\n );\n\n return className ? <div className={className}>{content}</div> : content;\n};\n"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -314,17 +314,18 @@ const CLASSES = {
|
|
|
314
314
|
};
|
|
315
315
|
|
|
316
316
|
/**
|
|
317
|
-
* Push a GTM-friendly event to
|
|
318
|
-
* Safe no-op
|
|
317
|
+
* Push a GTM-friendly event to the global dataLayer after a successful submission.
|
|
318
|
+
* Uses `globalThis` so it works in typical browser bundles. Safe no-op if push throws.
|
|
319
319
|
*/
|
|
320
320
|
function pushFormSnipSubmissionDataLayer(options) {
|
|
321
|
-
if (typeof window === 'undefined')
|
|
322
|
-
return;
|
|
323
321
|
try {
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
322
|
+
if (typeof globalThis === 'undefined')
|
|
323
|
+
return;
|
|
324
|
+
const g = globalThis;
|
|
325
|
+
const layer = Array.isArray(g.dataLayer) ? g.dataLayer : [];
|
|
326
|
+
g.dataLayer = layer;
|
|
327
|
+
layer.push({
|
|
328
|
+
event: 'formsnip_submission_success',
|
|
328
329
|
formsnipFormId: options.formId,
|
|
329
330
|
...(options.formName ? { formsnipFormName: options.formName } : {}),
|
|
330
331
|
});
|
|
@@ -358,7 +359,7 @@ function buildRowsFromFields(fields) {
|
|
|
358
359
|
return rows;
|
|
359
360
|
}
|
|
360
361
|
const DEFAULT_BASE_URL = 'https://api.formsnip.com';
|
|
361
|
-
const FormSnip = ({ formId, baseUrl = DEFAULT_BASE_URL, onSuccess, onError, className = '', prefill,
|
|
362
|
+
const FormSnip = ({ formId, baseUrl = DEFAULT_BASE_URL, onSuccess, onError, className = '', prefill, }) => {
|
|
362
363
|
const [form, setForm] = React.useState(null);
|
|
363
364
|
const [formData, setFormData] = React.useState({});
|
|
364
365
|
const [selectedFiles, setSelectedFiles] = React.useState({});
|
|
@@ -431,16 +432,6 @@ const FormSnip = ({ formId, baseUrl = DEFAULT_BASE_URL, onSuccess, onError, clas
|
|
|
431
432
|
}
|
|
432
433
|
}
|
|
433
434
|
}
|
|
434
|
-
// Debugging: log resolved prefill for hidden fields
|
|
435
|
-
if (typeof window !== 'undefined' && field.type === 'hidden') {
|
|
436
|
-
// eslint-disable-next-line no-console
|
|
437
|
-
console.debug('FormSnip hidden prefill', {
|
|
438
|
-
fieldId: field.id,
|
|
439
|
-
prefillKey,
|
|
440
|
-
resolvedValue: initialValue,
|
|
441
|
-
hasDefault: !!field.value,
|
|
442
|
-
});
|
|
443
|
-
}
|
|
444
435
|
// Hidden fields can also have a static default value from the schema
|
|
445
436
|
if (initialValue === '' && field.type === 'hidden' && field.value) {
|
|
446
437
|
initialValue = field.value;
|
|
@@ -522,13 +513,10 @@ const FormSnip = ({ formId, baseUrl = DEFAULT_BASE_URL, onSuccess, onError, clas
|
|
|
522
513
|
const json = await response.json();
|
|
523
514
|
if (response.ok && (json.success === undefined || json.success === true)) {
|
|
524
515
|
setSubmitSuccess(true);
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
formName: form?.name,
|
|
530
|
-
});
|
|
531
|
-
}
|
|
516
|
+
pushFormSnipSubmissionDataLayer({
|
|
517
|
+
formId,
|
|
518
|
+
formName: form?.name,
|
|
519
|
+
});
|
|
532
520
|
if (onSuccess) {
|
|
533
521
|
onSuccess(json.data);
|
|
534
522
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/utils/upload.ts","../src/components/FileUpload.tsx","../src/utils/styles.ts","../src/utils/dataLayer.ts","../src/FormSnip.tsx"],"sourcesContent":["const ALLOWED_FILE_EXTENSIONS = '.jpg,.jpeg,.png,.gif,.webp,.svg,.pdf,.mp4,.mpeg,.mov,.avi,.webm,.mkv,.mp3,.wav,.ogg,.aac,.flac';\nconst MAX_TOTAL_FILE_SIZE = 15 * 1024 * 1024; // 15MB\n\nexport interface UploadResult {\n success: boolean;\n fileKey?: string;\n error?: string;\n}\n\nexport interface UploadMultipleResult {\n success: boolean;\n fileKeys?: string[];\n errors?: string[];\n}\n\n/**\n * Upload a file to R2 via presigned URL\n */\nexport async function uploadFile(\n file: File,\n formId: string,\n baseUrl: string\n): Promise<UploadResult> {\n try {\n // Step 1: Get presigned upload URL\n const signResponse = await fetch(`${baseUrl}/uploads/sign`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n credentials: 'include',\n body: JSON.stringify({\n filename: file.name,\n contentType: file.type,\n size: file.size,\n formId,\n }),\n });\n\n if (!signResponse.ok) {\n return {\n success: false,\n error: 'Failed to get upload URL',\n };\n }\n\n const signData = await signResponse.json();\n if (!signData.success || !signData.data) {\n return {\n success: false,\n error: signData.message || 'Invalid upload URL response',\n };\n }\n\n const { uploadUrl, fileKey } = signData.data;\n\n // Step 2: Upload file directly to R2\n const uploadResponse = await fetch(uploadUrl, {\n method: 'PUT',\n body: file,\n headers: {\n 'Content-Type': file.type,\n },\n });\n\n if (!uploadResponse.ok) {\n return {\n success: false,\n error: `Upload failed: ${uploadResponse.statusText}`,\n };\n }\n\n return {\n success: true,\n fileKey,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n}\n\n/**\n * Upload multiple files to R2\n */\nexport async function uploadFiles(\n files: File[],\n formId: string,\n baseUrl: string\n): Promise<UploadMultipleResult> {\n // Check total size\n const totalSize = files.reduce((sum, file) => sum + file.size, 0);\n if (totalSize > MAX_TOTAL_FILE_SIZE) {\n return {\n success: false,\n errors: [`Total file size exceeds 15MB limit per submission`],\n };\n }\n\n const results = await Promise.allSettled(\n files.map((file) => uploadFile(file, formId, baseUrl))\n );\n\n const fileKeys: string[] = [];\n const errors: string[] = [];\n\n results.forEach((result, index) => {\n if (result.status === 'fulfilled' && result.value.success && result.value.fileKey) {\n fileKeys.push(result.value.fileKey);\n } else {\n const error =\n result.status === 'fulfilled'\n ? result.value.error || 'Upload failed'\n : result.reason?.message || 'Upload failed';\n errors.push(`${files[index].name}: ${error}`);\n }\n });\n\n return {\n success: fileKeys.length > 0,\n fileKeys: fileKeys.length > 0 ? fileKeys : undefined,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n\nexport { ALLOWED_FILE_EXTENSIONS, MAX_TOTAL_FILE_SIZE };\n","import React, { useRef, useState } from 'react';\nimport { ALLOWED_FILE_EXTENSIONS } from '../utils/upload';\nimport { CLASSES } from '../utils/styles';\n\ninterface FileUploadProps {\n id: string;\n label?: string;\n required?: boolean;\n disabled?: boolean;\n multiple?: boolean;\n onFilesChange: (files: File[]) => void;\n uploadedFiles?: string[];\n uploading?: boolean;\n error?: string;\n className?: string;\n}\n\nexport const FileUpload: React.FC<FileUploadProps> = ({\n id,\n label,\n required = false,\n disabled = false,\n multiple = true,\n onFilesChange,\n uploadedFiles = [],\n uploading = false,\n error,\n className = '',\n}) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n\n if (multiple) {\n setSelectedFiles((prev) => [...prev, ...files]);\n onFilesChange([...selectedFiles, ...files]);\n } else {\n setSelectedFiles(files);\n onFilesChange(files);\n }\n };\n\n const removeFile = (index: number) => {\n const newFiles = selectedFiles.filter((_, i) => i !== index);\n setSelectedFiles(newFiles);\n onFilesChange(newFiles);\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\n };\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (disabled || uploading) return;\n\n const files = Array.from(e.dataTransfer.files);\n\n if (multiple) {\n setSelectedFiles((prev) => [...prev, ...files]);\n onFilesChange([...selectedFiles, ...files]);\n } else {\n setSelectedFiles(files.slice(0, 1));\n onFilesChange(files.slice(0, 1));\n }\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n return (\n <div className={className}>\n {label && (\n <label className=\"fs-text-sm fs-text-gray-700 fs-mb-1\">\n {label}\n {required && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n )}\n\n <div\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n className={`fs-border-2 fs-border-dashed fs-rounded-lg fs-p-6 fs-text-center ${\n disabled || uploading ? '' : 'fs-cursor-pointer fs-hover-border-blue-400 fs-hover-bg-blue-50'\n }`}\n style={{\n borderColor: '#d1d5db',\n backgroundColor: disabled || uploading ? '#f9fafb' : '#ffffff',\n cursor: disabled || uploading ? 'not-allowed' : 'pointer',\n }}\n onClick={() => !disabled && !uploading && fileInputRef.current?.click()}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n id={id}\n multiple={multiple}\n onChange={handleFileSelect}\n className=\"hidden\"\n disabled={disabled || uploading}\n required={required && selectedFiles.length === 0 && uploadedFiles.length === 0}\n accept={ALLOWED_FILE_EXTENSIONS}\n />\n\n <div className=\"fs-flex fs-flex-col fs-items-center\">\n <svg\n className=\"fs-text-gray-400\"\n style={{ width: '3rem', height: '3rem', margin: '0 auto 0.5rem' }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\"\n />\n </svg>\n <p className=\"fs-text-sm fs-text-gray-600 fs-mb-1\">\n {uploading ? (\n <span className=\"fs-text-blue-600\">Uploading files...</span>\n ) : (\n <>\n <span className=\"fs-text-blue-600\" style={{ fontWeight: 500 }}>Click to upload</span>\n {' or drag and drop'}\n </>\n )}\n </p>\n <p className=\"fs-text-xs fs-text-gray-500\">\n {multiple ? 'Multiple files supported' : 'Single file only'} (Images, PDFs, videos,\n audio - Max 15MB total)\n </p>\n </div>\n </div>\n\n {selectedFiles.length > 0 && (\n <div className=\"mt-3 space-y-2\">\n {selectedFiles.map((file, index) => (\n <div\n key={`${file.name}-${index}`}\n className=\"flex items-center justify-between p-2 bg-gray-50 rounded border border-gray-200\"\n >\n <div className=\"flex items-center space-x-2 flex-1 min-w-0\">\n <svg\n className=\"w-5 h-5 text-gray-400 flex-shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-700 truncate\">{file.name}</p>\n <p className=\"text-xs text-gray-500\">{formatFileSize(file.size)}</p>\n </div>\n </div>\n {!uploading && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeFile(index);\n }}\n className=\"ml-2 text-red-500 hover:text-red-700 flex-shrink-0\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n\n {uploadedFiles.length > 0 && (\n <div className=\"mt-3 space-y-2\">\n {uploadedFiles.map((fileKey, index) => {\n const filename = fileKey.split('/').pop()?.split('-').slice(2).join('-') || fileKey;\n return (\n <div\n key={index}\n className=\"flex items-center justify-between p-2 bg-green-50 rounded border border-green-200\"\n >\n <div className=\"flex items-center space-x-2 flex-1 min-w-0\">\n <svg\n className=\"w-5 h-5 text-green-500 flex-shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-green-700 truncate\">{filename}</p>\n <p className=\"text-xs text-green-600\">Uploaded</p>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {error && <p className=\"mt-2 text-sm text-red-600\">{error}</p>}\n </div>\n );\n};\n","/**\n * Inject base styles into the document head (same as embed script)\n */\nexport function injectBaseStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById('formsnip-base-styles')) return;\n\n const css = [\n '.fs-flex{display:flex}',\n '.fs-flex-col{flex-direction:column}',\n '.fs-gap-5{gap:1.25rem}',\n '.fs-gap-6{gap:1.5rem}',\n '.fs-relative{position:relative}',\n '.fs-absolute{position:absolute}',\n '.fs-right-5{right:1.25rem}',\n '.fs-top-5{top:1.25rem}',\n '.fs-top-half{top:50%}',\n '.fs-translate-y-half{transform:translateY(-50%)}',\n '.fs-w-full{width:100%}',\n '.fs-p-5{padding:1.25rem}',\n '.fs-pr-10{padding-right:2.5rem}',\n '.fs-px-3{padding-left:0.75rem;padding-right:0.75rem}',\n '.fs-px-4{padding-left:1rem;padding-right:1rem}',\n '.fs-py-2{padding-top:0.5rem;padding-bottom:0.5rem}',\n '.fs-py-3{padding-top:0.75rem;padding-bottom:0.75rem}',\n '.fs-rounded-md{border-radius:0.375rem}',\n '.fs-rounded-lg{border-radius:0.5rem}',\n '.fs-rounded-full{border-radius:9999px}',\n '.fs-h-\\\\[120px\\\\]{height:120px}',\n '.fs-h-\\\\[180px\\\\]{height:180px}',\n '.fs-resize-none{resize:none}',\n '.fs-text-red-500{color:#ef4444}',\n '.fs-pointer-events-none{pointer-events:none}',\n '.fs-font-medium{font-weight:500}',\n '.fs-text-base{font-size:1rem;line-height:1.5rem}',\n '.fs-text-lg{font-size:1.125rem;line-height:1.75rem}',\n '.fs-border{border-width:1px}',\n '.fs-border-2{border-width:2px}',\n '.fs-border-dashed{border-style:dashed}',\n '.fs-border-gray-300{border-color:#d1d5db}',\n '.fs-text-center{text-align:center}',\n '.fs-cursor-pointer{cursor:pointer}',\n '.fs-transition{transition-property:all;transition-timing-function:cubic-bezier(0.4,0,0.2,1);transition-duration:150ms}',\n '.fs-hover-border-blue-400:hover{border-color:#60a5fa}',\n '.fs-hover-bg-blue-50:hover{background-color:#eff6ff}',\n '.fs-mt-2{margin-top:0.5rem}',\n '.fs-mb-1{margin-bottom:0.25rem}',\n '.fs-text-xs{font-size:0.75rem;line-height:1rem}',\n '.fs-text-sm{font-size:0.875rem;line-height:1.25rem}',\n '.fs-text-gray-400{color:#9ca3af}',\n '.fs-text-gray-500{color:#6b7280}',\n '.fs-text-gray-600{color:#4b5563}',\n '.fs-text-gray-700{color:#374151}',\n '.fs-text-blue-600{color:#2563eb}',\n '.fs-text-green-600{color:#16a34a}',\n '.fs-text-red-600{color:#dc2626}',\n '.fs-bg-gray-50{background-color:#f9fafb}',\n '.fs-bg-green-50{background-color:#f0fdf4}',\n '.fs-border-gray-200{border-color:#e5e7eb}',\n '.fs-border-green-200{border-color:#bbf7d0}',\n '.fs-p-2{padding:0.5rem}',\n '.fs-p-6{padding:1.5rem}',\n '.fs-space-y-2>*+*{margin-top:0.5rem}',\n '.fs-flex-1{flex:1 1 0%}',\n '.fs-min-w-0{min-width:0}',\n '.fs-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',\n '.fs-flex-shrink-0{flex-shrink:0}',\n '.fs-items-center{align-items:center}',\n '.fs-justify-between{justify-content:space-between}',\n '.fs-space-x-2>*+*{margin-left:0.5rem}',\n '.fs-outline-none{outline:none}',\n '.fs-hover-opacity:hover{opacity:0.9}',\n ].join('');\n\n const style = document.createElement('style');\n style.id = 'formsnip-base-styles';\n style.type = 'text/css';\n style.appendChild(document.createTextNode(css));\n document.head.appendChild(style);\n}\n\n/**\n * Apply embed styles to an element (same logic as embed script)\n */\nexport function applyStyles(\n styles: React.CSSProperties,\n customStyles?: {\n backgroundColor?: string;\n color?: string;\n borderColor?: string;\n borderRadius?: number;\n paddingX?: number;\n paddingY?: number;\n fontSize?: number;\n fullWidth?: boolean;\n }\n): React.CSSProperties {\n if (!customStyles) return styles;\n\n const result = { ...styles };\n\n if (customStyles.backgroundColor) {\n result.backgroundColor = customStyles.backgroundColor;\n }\n if (customStyles.color) {\n result.color = customStyles.color;\n }\n if (customStyles.borderColor) {\n result.borderColor = customStyles.borderColor;\n result.border = `1px solid ${customStyles.borderColor}`;\n }\n if (customStyles.borderRadius !== undefined) {\n result.borderRadius = `${customStyles.borderRadius}px`;\n }\n if (customStyles.paddingX !== undefined || customStyles.paddingY !== undefined) {\n const px = customStyles.paddingX !== undefined ? customStyles.paddingX : 0;\n const py = customStyles.paddingY !== undefined ? customStyles.paddingY : 0;\n result.padding = `${py}px ${px}px`;\n }\n if (customStyles.fontSize !== undefined) {\n result.fontSize = `${customStyles.fontSize}px`;\n }\n // Note: fullWidth is handled separately in the component, not here\n // to ensure proper display property handling\n\n return result;\n}\n\n/**\n * CSS class names matching embed script\n */\nexport const CLASSES = {\n form: 'fs-flex fs-flex-col fs-gap-6',\n field: 'fs-field',\n inner: 'fs-relative',\n input: 'fs-px-4 fs-py-3 fs-w-full fs-rounded-lg fs-border fs-border-gray-300 fs-text-base fs-outline-none',\n textarea: 'fs-px-4 fs-py-3 fs-h-[120px] fs-w-full fs-rounded-lg fs-border fs-border-gray-300 fs-resize-none fs-text-base fs-outline-none',\n button: 'fs-px-6 fs-py-3 fs-rounded-lg fs-font-medium fs-text-base fs-cursor-pointer fs-transition fs-hover-opacity',\n};\n","/**\n * Push a GTM-friendly event to window.dataLayer after a successful submission.\n * Safe no-op in SSR or if dataLayer throws.\n */\nexport function pushFormSnipSubmissionDataLayer(options: {\n eventName?: string;\n formId: string;\n formName?: string;\n}): void {\n if (typeof window === 'undefined') return;\n try {\n const w = window as Window & { dataLayer?: unknown[] };\n w.dataLayer = w.dataLayer || [];\n w.dataLayer.push({\n event: options.eventName ?? 'formsnip_submission_success',\n formsnipFormId: options.formId,\n ...(options.formName ? { formsnipFormName: options.formName } : {}),\n });\n } catch {\n /* ignore */\n }\n}\n","import React, { useState, useEffect } from 'react';\nimport { Form, FormSnipProps, SubmissionResponse, FormField } from './types';\nimport { uploadFiles } from './utils/upload';\nimport { FileUpload } from './components/FileUpload';\nimport { injectBaseStyles, applyStyles, CLASSES } from './utils/styles';\nimport { pushFormSnipSubmissionDataLayer } from './utils/dataLayer';\n\n/** Build rows from flat fields (full = own row, half = paired in row) */\nfunction buildRowsFromFields(fields: FormField[]): FormField[][] {\n const rows: FormField[][] = [];\n let i = 0;\n while (i < fields.length) {\n const f = fields[i];\n const w = f.width ?? 'full';\n if (w === 'full') {\n rows.push([f]);\n i += 1;\n } else {\n const row = [f];\n i += 1;\n if (i < fields.length && (fields[i].width ?? 'full') === 'half') {\n row.push(fields[i]);\n i += 1;\n }\n rows.push(row);\n }\n }\n return rows;\n}\n\nconst DEFAULT_BASE_URL = 'https://api.formsnip.com';\n\nexport const FormSnip: React.FC<FormSnipProps> = ({\n formId,\n baseUrl = DEFAULT_BASE_URL,\n onSuccess,\n onError,\n className = '',\n prefill,\n pushDataLayerOnSuccess = false,\n dataLayerEventName,\n}) => {\n const [form, setForm] = useState<Form | null>(null);\n const [formData, setFormData] = useState<Record<string, string | string[]>>({});\n const [selectedFiles, setSelectedFiles] = useState<Record<string, File[]>>({});\n const [uploadingFiles, setUploadingFiles] = useState<Record<string, boolean>>({});\n const [uploadErrors, setUploadErrors] = useState<Record<string, string>>({});\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [submitSuccess, setSubmitSuccess] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n useEffect(() => {\n // Inject base styles on mount (same as embed script)\n injectBaseStyles();\n\n const fetchForm = async () => {\n try {\n const response = await fetch(`${baseUrl}/forms/get-form/${formId}`);\n if (!response.ok) {\n throw new Error('Failed to load form');\n }\n const json = await response.json();\n if (json.success && json.data) {\n // Form data includes embedStyles from the database\n // These styles are set in the EmbedForm page and stored in the Form model\n setForm(json.data);\n\n // Parse URL query once for prefill support\n let urlParams: URLSearchParams | null = null;\n if (typeof window !== 'undefined') {\n urlParams = new URLSearchParams(window.location.search);\n }\n\n // Initialize form data (including prefill prop and URL-based prefill for supported field types)\n const initialData = json.data.fields.reduce(\n (acc: Record<string, string | string[]>, field: Form['fields'][0]) => {\n if (field.type === 'file') {\n acc[field.id] = [];\n return acc;\n }\n\n let initialValue: string | string[] = '';\n\n const prefillKey = field.urlPrefillParam;\n const canPrefillType =\n field.type === 'text' ||\n field.type === 'email' ||\n field.type === 'textarea' ||\n field.type === 'number' ||\n field.type === 'date' ||\n field.type === 'datetime' ||\n field.type === 'phone' ||\n field.type === 'hidden' ||\n field.type === 'select';\n\n // 1) Prefill prop (takes precedence over URL)\n if (prefill && prefillKey && prefillKey.trim() !== '' && prefillKey in prefill) {\n const v = prefill[prefillKey];\n if (typeof v === 'string' && canPrefillType) {\n if (field.type === 'select' && Array.isArray(field.options) && !field.options.includes(v)) {\n // Ignore invalid option values for selects\n } else {\n initialValue = v;\n }\n }\n }\n\n // 2) URL-based prefill (only if no prefill prop was applied)\n if (initialValue === '' && urlParams && prefillKey && prefillKey.trim() !== '') {\n const v = urlParams.get(prefillKey);\n if (v !== null && v !== '') {\n if (canPrefillType) {\n if (field.type === 'select' && Array.isArray(field.options) && !field.options.includes(v)) {\n // Ignore invalid option values for selects\n } else {\n initialValue = v;\n }\n }\n }\n }\n\n // Debugging: log resolved prefill for hidden fields\n if (typeof window !== 'undefined' && field.type === 'hidden') {\n // eslint-disable-next-line no-console\n console.debug('FormSnip hidden prefill', {\n fieldId: field.id,\n prefillKey,\n resolvedValue: initialValue,\n hasDefault: !!field.value,\n });\n }\n\n // Hidden fields can also have a static default value from the schema\n if (initialValue === '' && field.type === 'hidden' && field.value) {\n initialValue = field.value;\n }\n\n acc[field.id] = initialValue;\n return acc;\n },\n {}\n );\n setFormData(initialData);\n setSelectedFiles({});\n } else {\n setError(json.message || 'Failed to load form');\n }\n } catch (err: any) {\n setError(err.message || 'Failed to load form');\n if (onError) {\n onError(err.message || 'Failed to load form');\n }\n } finally {\n setLoading(false);\n }\n };\n\n fetchForm();\n }, [formId, baseUrl, onError]);\n\n const handleInputChange = (fieldId: string, value: string) => {\n setFormData((prev) => ({\n ...prev,\n [fieldId]: value,\n }));\n };\n\n const handleFilesChange = async (fieldId: string, files: File[]) => {\n if (files.length === 0) {\n setSelectedFiles((prev) => ({ ...prev, [fieldId]: [] }));\n setFormData((prev) => ({ ...prev, [fieldId]: [] }));\n return;\n }\n\n setSelectedFiles((prev) => ({ ...prev, [fieldId]: files }));\n setUploadingFiles((prev) => ({ ...prev, [fieldId]: true }));\n setUploadErrors((prev) => {\n const newErrors = { ...prev };\n delete newErrors[fieldId];\n return newErrors;\n });\n\n const result = await uploadFiles(files, formId, baseUrl);\n\n setUploadingFiles((prev) => ({ ...prev, [fieldId]: false }));\n\n if (result.success && result.fileKeys && result.fileKeys.length > 0) {\n const existingFileKeys = Array.isArray(formData[fieldId])\n ? (formData[fieldId] as string[])\n : [];\n setFormData((prev) => ({\n ...prev,\n [fieldId]: [...existingFileKeys, ...result.fileKeys!],\n }));\n } else {\n setUploadErrors((prev) => ({\n ...prev,\n [fieldId]: result.errors?.join(', ') || 'Upload failed',\n }));\n }\n };\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n setSubmitError(null);\n setSubmitSuccess(false);\n setIsSubmitting(true);\n\n try {\n const response = await fetch(`${baseUrl}/submissions/create-submission/${formId}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Requested-With': 'XMLHttpRequest',\n },\n credentials: 'include',\n body: JSON.stringify(formData),\n });\n\n const json: SubmissionResponse = await response.json();\n\n if (response.ok && (json.success === undefined || json.success === true)) {\n setSubmitSuccess(true);\n if (pushDataLayerOnSuccess) {\n pushFormSnipSubmissionDataLayer({\n eventName: dataLayerEventName,\n formId,\n formName: form?.name,\n });\n }\n if (onSuccess) {\n onSuccess(json.data);\n }\n // Reset form\n const emptyData = Object.keys(formData).reduce(\n (acc: Record<string, string | string[]>, key) => {\n const field = form?.fields.find((f) => f.id === key);\n acc[key] = field?.type === 'file' ? [] : '';\n return acc;\n },\n {}\n );\n setFormData(emptyData);\n setSelectedFiles({});\n setUploadErrors({});\n } else {\n const errorMsg = json.message || 'Submission failed';\n setSubmitError(errorMsg);\n if (onError) {\n onError(errorMsg);\n }\n }\n } catch (err: any) {\n const errorMsg = err.message || 'Failed to submit form';\n setSubmitError(errorMsg);\n if (onError) {\n onError(errorMsg);\n }\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const renderField = (field: Form['fields'][0]) => {\n // Use embedStyles from database (set in EmbedForm page)\n const fieldStyles = form?.embedStyles?.field || {};\n const isRequired = field.required === true;\n\n const commonProps = {\n id: `field-${field.id}`,\n name: field.id,\n value: (formData[field.id] as string) || '',\n onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) =>\n handleInputChange(field.id, e.target.value),\n placeholder: field.placeholder || '',\n required: isRequired,\n style: applyStyles({}, fieldStyles),\n className: field.type === 'textarea' ? CLASSES.textarea : CLASSES.input,\n };\n\n const labelStyle: React.CSSProperties = {};\n if (fieldStyles.labelFontSize) {\n labelStyle.fontSize = `${fieldStyles.labelFontSize}px`;\n }\n\n if (field.type === 'hidden') {\n return (\n <input\n type=\"hidden\"\n id={`field-${field.id}`}\n name={field.id}\n value={(formData[field.id] as string) || field.value || ''}\n />\n );\n }\n\n // For checkbox and radio, return without extra wrapper\n if (field.type === 'checkbox') {\n return (\n <label className=\"fs-flex fs-items-center\">\n <input\n type=\"checkbox\"\n id={`field-${field.id}`}\n name={field.id}\n checked={String(formData[field.id]) === 'true' || formData[field.id] === 'on'}\n onChange={(e) => handleInputChange(field.id, e.target.checked ? 'true' : 'false')}\n required={isRequired}\n />\n <span style={{ marginLeft: '0.5rem' }}>{field.label || field.placeholder || 'Check this box'}</span>\n {isRequired && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n );\n }\n\n if (field.type === 'radio') {\n return (\n <div className=\"fs-relative\">\n <label className=\"fs-text-sm fs-text-gray-700 fs-mb-2\" style={{ fontWeight: 500 }}>\n {field.label}\n {isRequired && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n <label className=\"fs-flex fs-items-center\">\n <input\n type=\"radio\"\n id={`field-${field.id}-yes`}\n name={field.id}\n value=\"yes\"\n checked={formData[field.id] === 'yes'}\n onChange={(e) => handleInputChange(field.id, e.target.value)}\n required={isRequired}\n />\n <span style={{ marginLeft: '0.5rem' }}> Yes</span>\n </label>\n <label className=\"fs-flex fs-items-center\">\n <input\n type=\"radio\"\n id={`field-${field.id}-no`}\n name={field.id}\n value=\"no\"\n checked={formData[field.id] === 'no'}\n onChange={(e) => handleInputChange(field.id, e.target.value)}\n required={isRequired}\n />\n <span style={{ marginLeft: '0.5rem' }}> No</span>\n </label>\n </div>\n );\n }\n\n if (field.type === 'file') {\n const uploadedFileKeys = Array.isArray(formData[field.id])\n ? (formData[field.id] as string[])\n : formData[field.id]\n ? [formData[field.id] as string]\n : [];\n\n return (\n <>\n <label htmlFor={`field-${field.id}`} className=\"fs-text-sm fs-text-gray-700 fs-mb-2\" style={{ fontWeight: 500 }}>\n {field.label}\n {isRequired && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n <FileUpload\n id={field.id}\n required={isRequired}\n disabled={uploadingFiles[field.id]}\n multiple={true}\n onFilesChange={(files) => handleFilesChange(field.id, files)}\n uploadedFiles={uploadedFileKeys}\n uploading={uploadingFiles[field.id]}\n error={uploadErrors[field.id]}\n />\n </>\n );\n }\n\n // For other fields, use minimal wrapper structure\n return (\n <>\n <label htmlFor={`field-${field.id}`} className=\"fs-text-sm fs-text-gray-700 fs-mb-2\" style={{ fontWeight: 500, ...labelStyle }}>\n {field.label}\n {isRequired && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n <div className={CLASSES.inner}>\n {field.type === 'select' ? (\n <select\n id={`field-${field.id}`}\n name={field.id}\n value={(formData[field.id] as string) || ''}\n onChange={(e) => handleInputChange(field.id, e.target.value)}\n required={isRequired}\n style={applyStyles({}, fieldStyles)}\n className={CLASSES.input}\n >\n <option value=\"\">{field.placeholder || 'Select an option'}</option>\n {field.options?.map((option, index) => (\n <option key={index} value={option}>\n {option}\n </option>\n ))}\n </select>\n ) : field.type === 'textarea' ? (\n <textarea {...commonProps} rows={4} />\n ) : field.type === 'phone' ? (\n <input type=\"tel\" {...commonProps} />\n ) : field.type === 'datetime' ? (\n <input type=\"datetime-local\" {...commonProps} />\n ) : (\n <input type={field.type || 'text'} {...commonProps} />\n )}\n </div>\n </>\n );\n };\n\n if (loading) {\n const content = (\n <div className=\"fs-text-center\" style={{ padding: '2rem 0' }}>\n <p className=\"fs-text-gray-600\">Loading form...</p>\n </div>\n );\n return className ? <div className={className}>{content}</div> : content;\n }\n\n if (error || !form) {\n const content = (\n <div className=\"fs-text-center\" style={{ padding: '2rem 0' }}>\n <p className=\"fs-text-red-600\">{error || 'Form not found'}</p>\n </div>\n );\n return className ? <div className={className}>{content}</div> : content;\n }\n\n // Use embedStyles from database (set in EmbedForm page)\n const buttonStyles = form.embedStyles?.button || {};\n\n const content = (\n <>\n <div id=\"formsnip-message\"></div>\n {submitError && (\n <div\n className=\"fs-px-3 fs-py-2 fs-rounded-md\"\n style={{\n color: '#991b1b',\n background: '#fee2e2',\n border: '1px solid #fecaca',\n marginBottom: '1rem',\n }}\n >\n {submitError}\n </div>\n )}\n\n {submitSuccess && (\n <div\n className=\"fs-px-3 fs-py-2 fs-rounded-md\"\n style={{\n color: '#166534',\n background: '#dcfce7',\n border: '1px solid #bbf7d0',\n marginBottom: '1rem',\n }}\n >\n {form.validation?.confirmationText || 'Thank you! Your submission has been received.'}\n </div>\n )}\n\n <form id=\"formsnip-form\" onSubmit={handleSubmit} className={CLASSES.form}>\n {/* Render hidden fields directly without wrappers */}\n {form.fields.filter((f) => f.isActive !== false && f.type === 'hidden').map((field) => (\n <React.Fragment key={field.id}>{renderField(field)}</React.Fragment>\n ))}\n \n {/* Render visible fields in rows */}\n {buildRowsFromFields(form.fields.filter((f) => f.isActive !== false && f.type !== 'hidden')).map((row, rowIdx) =>\n row.length === 1 ? (\n <div key={row[0].id} style={{ display: 'flex', flexDirection: 'column' }}>\n {renderField(row[0])}\n </div>\n ) : (\n <div\n key={`row-${rowIdx}`}\n style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '1.25rem' }}\n >\n {row.map((field) => (\n <div key={field.id} style={{ display: 'flex', flexDirection: 'column' }}>\n {renderField(field)}\n </div>\n ))}\n </div>\n )\n )}\n\n <button\n type=\"submit\"\n disabled={isSubmitting}\n className={CLASSES.button}\n style={{\n ...applyStyles({}, buttonStyles),\n // Explicitly control width: only full width if explicitly set to true\n // When false or undefined, ensure button is NOT full width\n width: buttonStyles.fullWidth === true ? '100%' : 'auto',\n display: buttonStyles.fullWidth === true ? 'block' : 'inline-block',\n maxWidth: buttonStyles.fullWidth === true ? undefined : 'fit-content',\n }}\n >\n {isSubmitting ? 'Submitting...' : form.submitButtonText || 'Submit'}\n </button>\n </form>\n </>\n );\n\n return className ? <div className={className}>{content}</div> : content;\n};\n"],"names":["useRef","useState","useEffect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/utils/upload.ts","../src/components/FileUpload.tsx","../src/utils/styles.ts","../src/utils/dataLayer.ts","../src/FormSnip.tsx"],"sourcesContent":["const ALLOWED_FILE_EXTENSIONS = '.jpg,.jpeg,.png,.gif,.webp,.svg,.pdf,.mp4,.mpeg,.mov,.avi,.webm,.mkv,.mp3,.wav,.ogg,.aac,.flac';\nconst MAX_TOTAL_FILE_SIZE = 15 * 1024 * 1024; // 15MB\n\nexport interface UploadResult {\n success: boolean;\n fileKey?: string;\n error?: string;\n}\n\nexport interface UploadMultipleResult {\n success: boolean;\n fileKeys?: string[];\n errors?: string[];\n}\n\n/**\n * Upload a file to R2 via presigned URL\n */\nexport async function uploadFile(\n file: File,\n formId: string,\n baseUrl: string\n): Promise<UploadResult> {\n try {\n // Step 1: Get presigned upload URL\n const signResponse = await fetch(`${baseUrl}/uploads/sign`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n credentials: 'include',\n body: JSON.stringify({\n filename: file.name,\n contentType: file.type,\n size: file.size,\n formId,\n }),\n });\n\n if (!signResponse.ok) {\n return {\n success: false,\n error: 'Failed to get upload URL',\n };\n }\n\n const signData = await signResponse.json();\n if (!signData.success || !signData.data) {\n return {\n success: false,\n error: signData.message || 'Invalid upload URL response',\n };\n }\n\n const { uploadUrl, fileKey } = signData.data;\n\n // Step 2: Upload file directly to R2\n const uploadResponse = await fetch(uploadUrl, {\n method: 'PUT',\n body: file,\n headers: {\n 'Content-Type': file.type,\n },\n });\n\n if (!uploadResponse.ok) {\n return {\n success: false,\n error: `Upload failed: ${uploadResponse.statusText}`,\n };\n }\n\n return {\n success: true,\n fileKey,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n}\n\n/**\n * Upload multiple files to R2\n */\nexport async function uploadFiles(\n files: File[],\n formId: string,\n baseUrl: string\n): Promise<UploadMultipleResult> {\n // Check total size\n const totalSize = files.reduce((sum, file) => sum + file.size, 0);\n if (totalSize > MAX_TOTAL_FILE_SIZE) {\n return {\n success: false,\n errors: [`Total file size exceeds 15MB limit per submission`],\n };\n }\n\n const results = await Promise.allSettled(\n files.map((file) => uploadFile(file, formId, baseUrl))\n );\n\n const fileKeys: string[] = [];\n const errors: string[] = [];\n\n results.forEach((result, index) => {\n if (result.status === 'fulfilled' && result.value.success && result.value.fileKey) {\n fileKeys.push(result.value.fileKey);\n } else {\n const error =\n result.status === 'fulfilled'\n ? result.value.error || 'Upload failed'\n : result.reason?.message || 'Upload failed';\n errors.push(`${files[index].name}: ${error}`);\n }\n });\n\n return {\n success: fileKeys.length > 0,\n fileKeys: fileKeys.length > 0 ? fileKeys : undefined,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n\nexport { ALLOWED_FILE_EXTENSIONS, MAX_TOTAL_FILE_SIZE };\n","import React, { useRef, useState } from 'react';\nimport { ALLOWED_FILE_EXTENSIONS } from '../utils/upload';\nimport { CLASSES } from '../utils/styles';\n\ninterface FileUploadProps {\n id: string;\n label?: string;\n required?: boolean;\n disabled?: boolean;\n multiple?: boolean;\n onFilesChange: (files: File[]) => void;\n uploadedFiles?: string[];\n uploading?: boolean;\n error?: string;\n className?: string;\n}\n\nexport const FileUpload: React.FC<FileUploadProps> = ({\n id,\n label,\n required = false,\n disabled = false,\n multiple = true,\n onFilesChange,\n uploadedFiles = [],\n uploading = false,\n error,\n className = '',\n}) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n\n if (multiple) {\n setSelectedFiles((prev) => [...prev, ...files]);\n onFilesChange([...selectedFiles, ...files]);\n } else {\n setSelectedFiles(files);\n onFilesChange(files);\n }\n };\n\n const removeFile = (index: number) => {\n const newFiles = selectedFiles.filter((_, i) => i !== index);\n setSelectedFiles(newFiles);\n onFilesChange(newFiles);\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\n };\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (disabled || uploading) return;\n\n const files = Array.from(e.dataTransfer.files);\n\n if (multiple) {\n setSelectedFiles((prev) => [...prev, ...files]);\n onFilesChange([...selectedFiles, ...files]);\n } else {\n setSelectedFiles(files.slice(0, 1));\n onFilesChange(files.slice(0, 1));\n }\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n return (\n <div className={className}>\n {label && (\n <label className=\"fs-text-sm fs-text-gray-700 fs-mb-1\">\n {label}\n {required && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n )}\n\n <div\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n className={`fs-border-2 fs-border-dashed fs-rounded-lg fs-p-6 fs-text-center ${\n disabled || uploading ? '' : 'fs-cursor-pointer fs-hover-border-blue-400 fs-hover-bg-blue-50'\n }`}\n style={{\n borderColor: '#d1d5db',\n backgroundColor: disabled || uploading ? '#f9fafb' : '#ffffff',\n cursor: disabled || uploading ? 'not-allowed' : 'pointer',\n }}\n onClick={() => !disabled && !uploading && fileInputRef.current?.click()}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n id={id}\n multiple={multiple}\n onChange={handleFileSelect}\n className=\"hidden\"\n disabled={disabled || uploading}\n required={required && selectedFiles.length === 0 && uploadedFiles.length === 0}\n accept={ALLOWED_FILE_EXTENSIONS}\n />\n\n <div className=\"fs-flex fs-flex-col fs-items-center\">\n <svg\n className=\"fs-text-gray-400\"\n style={{ width: '3rem', height: '3rem', margin: '0 auto 0.5rem' }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\"\n />\n </svg>\n <p className=\"fs-text-sm fs-text-gray-600 fs-mb-1\">\n {uploading ? (\n <span className=\"fs-text-blue-600\">Uploading files...</span>\n ) : (\n <>\n <span className=\"fs-text-blue-600\" style={{ fontWeight: 500 }}>Click to upload</span>\n {' or drag and drop'}\n </>\n )}\n </p>\n <p className=\"fs-text-xs fs-text-gray-500\">\n {multiple ? 'Multiple files supported' : 'Single file only'} (Images, PDFs, videos,\n audio - Max 15MB total)\n </p>\n </div>\n </div>\n\n {selectedFiles.length > 0 && (\n <div className=\"mt-3 space-y-2\">\n {selectedFiles.map((file, index) => (\n <div\n key={`${file.name}-${index}`}\n className=\"flex items-center justify-between p-2 bg-gray-50 rounded border border-gray-200\"\n >\n <div className=\"flex items-center space-x-2 flex-1 min-w-0\">\n <svg\n className=\"w-5 h-5 text-gray-400 flex-shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-700 truncate\">{file.name}</p>\n <p className=\"text-xs text-gray-500\">{formatFileSize(file.size)}</p>\n </div>\n </div>\n {!uploading && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeFile(index);\n }}\n className=\"ml-2 text-red-500 hover:text-red-700 flex-shrink-0\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n\n {uploadedFiles.length > 0 && (\n <div className=\"mt-3 space-y-2\">\n {uploadedFiles.map((fileKey, index) => {\n const filename = fileKey.split('/').pop()?.split('-').slice(2).join('-') || fileKey;\n return (\n <div\n key={index}\n className=\"flex items-center justify-between p-2 bg-green-50 rounded border border-green-200\"\n >\n <div className=\"flex items-center space-x-2 flex-1 min-w-0\">\n <svg\n className=\"w-5 h-5 text-green-500 flex-shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-green-700 truncate\">{filename}</p>\n <p className=\"text-xs text-green-600\">Uploaded</p>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {error && <p className=\"mt-2 text-sm text-red-600\">{error}</p>}\n </div>\n );\n};\n","/**\n * Inject base styles into the document head (same as embed script)\n */\nexport function injectBaseStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById('formsnip-base-styles')) return;\n\n const css = [\n '.fs-flex{display:flex}',\n '.fs-flex-col{flex-direction:column}',\n '.fs-gap-5{gap:1.25rem}',\n '.fs-gap-6{gap:1.5rem}',\n '.fs-relative{position:relative}',\n '.fs-absolute{position:absolute}',\n '.fs-right-5{right:1.25rem}',\n '.fs-top-5{top:1.25rem}',\n '.fs-top-half{top:50%}',\n '.fs-translate-y-half{transform:translateY(-50%)}',\n '.fs-w-full{width:100%}',\n '.fs-p-5{padding:1.25rem}',\n '.fs-pr-10{padding-right:2.5rem}',\n '.fs-px-3{padding-left:0.75rem;padding-right:0.75rem}',\n '.fs-px-4{padding-left:1rem;padding-right:1rem}',\n '.fs-py-2{padding-top:0.5rem;padding-bottom:0.5rem}',\n '.fs-py-3{padding-top:0.75rem;padding-bottom:0.75rem}',\n '.fs-rounded-md{border-radius:0.375rem}',\n '.fs-rounded-lg{border-radius:0.5rem}',\n '.fs-rounded-full{border-radius:9999px}',\n '.fs-h-\\\\[120px\\\\]{height:120px}',\n '.fs-h-\\\\[180px\\\\]{height:180px}',\n '.fs-resize-none{resize:none}',\n '.fs-text-red-500{color:#ef4444}',\n '.fs-pointer-events-none{pointer-events:none}',\n '.fs-font-medium{font-weight:500}',\n '.fs-text-base{font-size:1rem;line-height:1.5rem}',\n '.fs-text-lg{font-size:1.125rem;line-height:1.75rem}',\n '.fs-border{border-width:1px}',\n '.fs-border-2{border-width:2px}',\n '.fs-border-dashed{border-style:dashed}',\n '.fs-border-gray-300{border-color:#d1d5db}',\n '.fs-text-center{text-align:center}',\n '.fs-cursor-pointer{cursor:pointer}',\n '.fs-transition{transition-property:all;transition-timing-function:cubic-bezier(0.4,0,0.2,1);transition-duration:150ms}',\n '.fs-hover-border-blue-400:hover{border-color:#60a5fa}',\n '.fs-hover-bg-blue-50:hover{background-color:#eff6ff}',\n '.fs-mt-2{margin-top:0.5rem}',\n '.fs-mb-1{margin-bottom:0.25rem}',\n '.fs-text-xs{font-size:0.75rem;line-height:1rem}',\n '.fs-text-sm{font-size:0.875rem;line-height:1.25rem}',\n '.fs-text-gray-400{color:#9ca3af}',\n '.fs-text-gray-500{color:#6b7280}',\n '.fs-text-gray-600{color:#4b5563}',\n '.fs-text-gray-700{color:#374151}',\n '.fs-text-blue-600{color:#2563eb}',\n '.fs-text-green-600{color:#16a34a}',\n '.fs-text-red-600{color:#dc2626}',\n '.fs-bg-gray-50{background-color:#f9fafb}',\n '.fs-bg-green-50{background-color:#f0fdf4}',\n '.fs-border-gray-200{border-color:#e5e7eb}',\n '.fs-border-green-200{border-color:#bbf7d0}',\n '.fs-p-2{padding:0.5rem}',\n '.fs-p-6{padding:1.5rem}',\n '.fs-space-y-2>*+*{margin-top:0.5rem}',\n '.fs-flex-1{flex:1 1 0%}',\n '.fs-min-w-0{min-width:0}',\n '.fs-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',\n '.fs-flex-shrink-0{flex-shrink:0}',\n '.fs-items-center{align-items:center}',\n '.fs-justify-between{justify-content:space-between}',\n '.fs-space-x-2>*+*{margin-left:0.5rem}',\n '.fs-outline-none{outline:none}',\n '.fs-hover-opacity:hover{opacity:0.9}',\n ].join('');\n\n const style = document.createElement('style');\n style.id = 'formsnip-base-styles';\n style.type = 'text/css';\n style.appendChild(document.createTextNode(css));\n document.head.appendChild(style);\n}\n\n/**\n * Apply embed styles to an element (same logic as embed script)\n */\nexport function applyStyles(\n styles: React.CSSProperties,\n customStyles?: {\n backgroundColor?: string;\n color?: string;\n borderColor?: string;\n borderRadius?: number;\n paddingX?: number;\n paddingY?: number;\n fontSize?: number;\n fullWidth?: boolean;\n }\n): React.CSSProperties {\n if (!customStyles) return styles;\n\n const result = { ...styles };\n\n if (customStyles.backgroundColor) {\n result.backgroundColor = customStyles.backgroundColor;\n }\n if (customStyles.color) {\n result.color = customStyles.color;\n }\n if (customStyles.borderColor) {\n result.borderColor = customStyles.borderColor;\n result.border = `1px solid ${customStyles.borderColor}`;\n }\n if (customStyles.borderRadius !== undefined) {\n result.borderRadius = `${customStyles.borderRadius}px`;\n }\n if (customStyles.paddingX !== undefined || customStyles.paddingY !== undefined) {\n const px = customStyles.paddingX !== undefined ? customStyles.paddingX : 0;\n const py = customStyles.paddingY !== undefined ? customStyles.paddingY : 0;\n result.padding = `${py}px ${px}px`;\n }\n if (customStyles.fontSize !== undefined) {\n result.fontSize = `${customStyles.fontSize}px`;\n }\n // Note: fullWidth is handled separately in the component, not here\n // to ensure proper display property handling\n\n return result;\n}\n\n/**\n * CSS class names matching embed script\n */\nexport const CLASSES = {\n form: 'fs-flex fs-flex-col fs-gap-6',\n field: 'fs-field',\n inner: 'fs-relative',\n input: 'fs-px-4 fs-py-3 fs-w-full fs-rounded-lg fs-border fs-border-gray-300 fs-text-base fs-outline-none',\n textarea: 'fs-px-4 fs-py-3 fs-h-[120px] fs-w-full fs-rounded-lg fs-border fs-border-gray-300 fs-resize-none fs-text-base fs-outline-none',\n button: 'fs-px-6 fs-py-3 fs-rounded-lg fs-font-medium fs-text-base fs-cursor-pointer fs-transition fs-hover-opacity',\n};\n","/**\n * Push a GTM-friendly event to the global dataLayer after a successful submission.\n * Uses `globalThis` so it works in typical browser bundles. Safe no-op if push throws.\n */\nexport function pushFormSnipSubmissionDataLayer(options: {\n formId: string;\n formName?: string;\n}): void {\n try {\n if (typeof globalThis === 'undefined') return;\n const g = globalThis as typeof globalThis & { dataLayer?: unknown[] };\n const layer = Array.isArray(g.dataLayer) ? g.dataLayer : [];\n g.dataLayer = layer;\n layer.push({\n event: 'formsnip_submission_success',\n formsnipFormId: options.formId,\n ...(options.formName ? { formsnipFormName: options.formName } : {}),\n });\n } catch {\n /* ignore */\n }\n}\n","import React, { useState, useEffect } from 'react';\nimport { Form, FormSnipProps, SubmissionResponse, FormField } from './types';\nimport { uploadFiles } from './utils/upload';\nimport { FileUpload } from './components/FileUpload';\nimport { injectBaseStyles, applyStyles, CLASSES } from './utils/styles';\nimport { pushFormSnipSubmissionDataLayer } from './utils/dataLayer';\n\n/** Build rows from flat fields (full = own row, half = paired in row) */\nfunction buildRowsFromFields(fields: FormField[]): FormField[][] {\n const rows: FormField[][] = [];\n let i = 0;\n while (i < fields.length) {\n const f = fields[i];\n const w = f.width ?? 'full';\n if (w === 'full') {\n rows.push([f]);\n i += 1;\n } else {\n const row = [f];\n i += 1;\n if (i < fields.length && (fields[i].width ?? 'full') === 'half') {\n row.push(fields[i]);\n i += 1;\n }\n rows.push(row);\n }\n }\n return rows;\n}\n\nconst DEFAULT_BASE_URL = 'https://api.formsnip.com';\n\nexport const FormSnip: React.FC<FormSnipProps> = ({\n formId,\n baseUrl = DEFAULT_BASE_URL,\n onSuccess,\n onError,\n className = '',\n prefill,\n}) => {\n const [form, setForm] = useState<Form | null>(null);\n const [formData, setFormData] = useState<Record<string, string | string[]>>({});\n const [selectedFiles, setSelectedFiles] = useState<Record<string, File[]>>({});\n const [uploadingFiles, setUploadingFiles] = useState<Record<string, boolean>>({});\n const [uploadErrors, setUploadErrors] = useState<Record<string, string>>({});\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [submitSuccess, setSubmitSuccess] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n useEffect(() => {\n // Inject base styles on mount (same as embed script)\n injectBaseStyles();\n\n const fetchForm = async () => {\n try {\n const response = await fetch(`${baseUrl}/forms/get-form/${formId}`);\n if (!response.ok) {\n throw new Error('Failed to load form');\n }\n const json = await response.json();\n if (json.success && json.data) {\n // Form data includes embedStyles from the database\n // These styles are set in the EmbedForm page and stored in the Form model\n setForm(json.data);\n\n // Parse URL query once for prefill support\n let urlParams: URLSearchParams | null = null;\n if (typeof window !== 'undefined') {\n urlParams = new URLSearchParams(window.location.search);\n }\n\n // Initialize form data (including prefill prop and URL-based prefill for supported field types)\n const initialData = json.data.fields.reduce(\n (acc: Record<string, string | string[]>, field: Form['fields'][0]) => {\n if (field.type === 'file') {\n acc[field.id] = [];\n return acc;\n }\n\n let initialValue: string | string[] = '';\n\n const prefillKey = field.urlPrefillParam;\n const canPrefillType =\n field.type === 'text' ||\n field.type === 'email' ||\n field.type === 'textarea' ||\n field.type === 'number' ||\n field.type === 'date' ||\n field.type === 'datetime' ||\n field.type === 'phone' ||\n field.type === 'hidden' ||\n field.type === 'select';\n\n // 1) Prefill prop (takes precedence over URL)\n if (prefill && prefillKey && prefillKey.trim() !== '' && prefillKey in prefill) {\n const v = prefill[prefillKey];\n if (typeof v === 'string' && canPrefillType) {\n if (field.type === 'select' && Array.isArray(field.options) && !field.options.includes(v)) {\n // Ignore invalid option values for selects\n } else {\n initialValue = v;\n }\n }\n }\n\n // 2) URL-based prefill (only if no prefill prop was applied)\n if (initialValue === '' && urlParams && prefillKey && prefillKey.trim() !== '') {\n const v = urlParams.get(prefillKey);\n if (v !== null && v !== '') {\n if (canPrefillType) {\n if (field.type === 'select' && Array.isArray(field.options) && !field.options.includes(v)) {\n // Ignore invalid option values for selects\n } else {\n initialValue = v;\n }\n }\n }\n }\n\n // Hidden fields can also have a static default value from the schema\n if (initialValue === '' && field.type === 'hidden' && field.value) {\n initialValue = field.value;\n }\n\n acc[field.id] = initialValue;\n return acc;\n },\n {}\n );\n setFormData(initialData);\n setSelectedFiles({});\n } else {\n setError(json.message || 'Failed to load form');\n }\n } catch (err: any) {\n setError(err.message || 'Failed to load form');\n if (onError) {\n onError(err.message || 'Failed to load form');\n }\n } finally {\n setLoading(false);\n }\n };\n\n fetchForm();\n }, [formId, baseUrl, onError]);\n\n const handleInputChange = (fieldId: string, value: string) => {\n setFormData((prev) => ({\n ...prev,\n [fieldId]: value,\n }));\n };\n\n const handleFilesChange = async (fieldId: string, files: File[]) => {\n if (files.length === 0) {\n setSelectedFiles((prev) => ({ ...prev, [fieldId]: [] }));\n setFormData((prev) => ({ ...prev, [fieldId]: [] }));\n return;\n }\n\n setSelectedFiles((prev) => ({ ...prev, [fieldId]: files }));\n setUploadingFiles((prev) => ({ ...prev, [fieldId]: true }));\n setUploadErrors((prev) => {\n const newErrors = { ...prev };\n delete newErrors[fieldId];\n return newErrors;\n });\n\n const result = await uploadFiles(files, formId, baseUrl);\n\n setUploadingFiles((prev) => ({ ...prev, [fieldId]: false }));\n\n if (result.success && result.fileKeys && result.fileKeys.length > 0) {\n const existingFileKeys = Array.isArray(formData[fieldId])\n ? (formData[fieldId] as string[])\n : [];\n setFormData((prev) => ({\n ...prev,\n [fieldId]: [...existingFileKeys, ...result.fileKeys!],\n }));\n } else {\n setUploadErrors((prev) => ({\n ...prev,\n [fieldId]: result.errors?.join(', ') || 'Upload failed',\n }));\n }\n };\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n setSubmitError(null);\n setSubmitSuccess(false);\n setIsSubmitting(true);\n\n try {\n const response = await fetch(`${baseUrl}/submissions/create-submission/${formId}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Requested-With': 'XMLHttpRequest',\n },\n credentials: 'include',\n body: JSON.stringify(formData),\n });\n\n const json: SubmissionResponse = await response.json();\n\n if (response.ok && (json.success === undefined || json.success === true)) {\n setSubmitSuccess(true);\n pushFormSnipSubmissionDataLayer({\n formId,\n formName: form?.name,\n });\n if (onSuccess) {\n onSuccess(json.data);\n }\n // Reset form\n const emptyData = Object.keys(formData).reduce(\n (acc: Record<string, string | string[]>, key) => {\n const field = form?.fields.find((f) => f.id === key);\n acc[key] = field?.type === 'file' ? [] : '';\n return acc;\n },\n {}\n );\n setFormData(emptyData);\n setSelectedFiles({});\n setUploadErrors({});\n } else {\n const errorMsg = json.message || 'Submission failed';\n setSubmitError(errorMsg);\n if (onError) {\n onError(errorMsg);\n }\n }\n } catch (err: any) {\n const errorMsg = err.message || 'Failed to submit form';\n setSubmitError(errorMsg);\n if (onError) {\n onError(errorMsg);\n }\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const renderField = (field: Form['fields'][0]) => {\n // Use embedStyles from database (set in EmbedForm page)\n const fieldStyles = form?.embedStyles?.field || {};\n const isRequired = field.required === true;\n\n const commonProps = {\n id: `field-${field.id}`,\n name: field.id,\n value: (formData[field.id] as string) || '',\n onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) =>\n handleInputChange(field.id, e.target.value),\n placeholder: field.placeholder || '',\n required: isRequired,\n style: applyStyles({}, fieldStyles),\n className: field.type === 'textarea' ? CLASSES.textarea : CLASSES.input,\n };\n\n const labelStyle: React.CSSProperties = {};\n if (fieldStyles.labelFontSize) {\n labelStyle.fontSize = `${fieldStyles.labelFontSize}px`;\n }\n\n if (field.type === 'hidden') {\n return (\n <input\n type=\"hidden\"\n id={`field-${field.id}`}\n name={field.id}\n value={(formData[field.id] as string) || field.value || ''}\n />\n );\n }\n\n // For checkbox and radio, return without extra wrapper\n if (field.type === 'checkbox') {\n return (\n <label className=\"fs-flex fs-items-center\">\n <input\n type=\"checkbox\"\n id={`field-${field.id}`}\n name={field.id}\n checked={String(formData[field.id]) === 'true' || formData[field.id] === 'on'}\n onChange={(e) => handleInputChange(field.id, e.target.checked ? 'true' : 'false')}\n required={isRequired}\n />\n <span style={{ marginLeft: '0.5rem' }}>{field.label || field.placeholder || 'Check this box'}</span>\n {isRequired && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n );\n }\n\n if (field.type === 'radio') {\n return (\n <div className=\"fs-relative\">\n <label className=\"fs-text-sm fs-text-gray-700 fs-mb-2\" style={{ fontWeight: 500 }}>\n {field.label}\n {isRequired && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n <label className=\"fs-flex fs-items-center\">\n <input\n type=\"radio\"\n id={`field-${field.id}-yes`}\n name={field.id}\n value=\"yes\"\n checked={formData[field.id] === 'yes'}\n onChange={(e) => handleInputChange(field.id, e.target.value)}\n required={isRequired}\n />\n <span style={{ marginLeft: '0.5rem' }}> Yes</span>\n </label>\n <label className=\"fs-flex fs-items-center\">\n <input\n type=\"radio\"\n id={`field-${field.id}-no`}\n name={field.id}\n value=\"no\"\n checked={formData[field.id] === 'no'}\n onChange={(e) => handleInputChange(field.id, e.target.value)}\n required={isRequired}\n />\n <span style={{ marginLeft: '0.5rem' }}> No</span>\n </label>\n </div>\n );\n }\n\n if (field.type === 'file') {\n const uploadedFileKeys = Array.isArray(formData[field.id])\n ? (formData[field.id] as string[])\n : formData[field.id]\n ? [formData[field.id] as string]\n : [];\n\n return (\n <>\n <label htmlFor={`field-${field.id}`} className=\"fs-text-sm fs-text-gray-700 fs-mb-2\" style={{ fontWeight: 500 }}>\n {field.label}\n {isRequired && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n <FileUpload\n id={field.id}\n required={isRequired}\n disabled={uploadingFiles[field.id]}\n multiple={true}\n onFilesChange={(files) => handleFilesChange(field.id, files)}\n uploadedFiles={uploadedFileKeys}\n uploading={uploadingFiles[field.id]}\n error={uploadErrors[field.id]}\n />\n </>\n );\n }\n\n // For other fields, use minimal wrapper structure\n return (\n <>\n <label htmlFor={`field-${field.id}`} className=\"fs-text-sm fs-text-gray-700 fs-mb-2\" style={{ fontWeight: 500, ...labelStyle }}>\n {field.label}\n {isRequired && <span className=\"fs-text-red-500\" style={{ marginLeft: '0.25rem' }}>*</span>}\n </label>\n <div className={CLASSES.inner}>\n {field.type === 'select' ? (\n <select\n id={`field-${field.id}`}\n name={field.id}\n value={(formData[field.id] as string) || ''}\n onChange={(e) => handleInputChange(field.id, e.target.value)}\n required={isRequired}\n style={applyStyles({}, fieldStyles)}\n className={CLASSES.input}\n >\n <option value=\"\">{field.placeholder || 'Select an option'}</option>\n {field.options?.map((option, index) => (\n <option key={index} value={option}>\n {option}\n </option>\n ))}\n </select>\n ) : field.type === 'textarea' ? (\n <textarea {...commonProps} rows={4} />\n ) : field.type === 'phone' ? (\n <input type=\"tel\" {...commonProps} />\n ) : field.type === 'datetime' ? (\n <input type=\"datetime-local\" {...commonProps} />\n ) : (\n <input type={field.type || 'text'} {...commonProps} />\n )}\n </div>\n </>\n );\n };\n\n if (loading) {\n const content = (\n <div className=\"fs-text-center\" style={{ padding: '2rem 0' }}>\n <p className=\"fs-text-gray-600\">Loading form...</p>\n </div>\n );\n return className ? <div className={className}>{content}</div> : content;\n }\n\n if (error || !form) {\n const content = (\n <div className=\"fs-text-center\" style={{ padding: '2rem 0' }}>\n <p className=\"fs-text-red-600\">{error || 'Form not found'}</p>\n </div>\n );\n return className ? <div className={className}>{content}</div> : content;\n }\n\n // Use embedStyles from database (set in EmbedForm page)\n const buttonStyles = form.embedStyles?.button || {};\n\n const content = (\n <>\n <div id=\"formsnip-message\"></div>\n {submitError && (\n <div\n className=\"fs-px-3 fs-py-2 fs-rounded-md\"\n style={{\n color: '#991b1b',\n background: '#fee2e2',\n border: '1px solid #fecaca',\n marginBottom: '1rem',\n }}\n >\n {submitError}\n </div>\n )}\n\n {submitSuccess && (\n <div\n className=\"fs-px-3 fs-py-2 fs-rounded-md\"\n style={{\n color: '#166534',\n background: '#dcfce7',\n border: '1px solid #bbf7d0',\n marginBottom: '1rem',\n }}\n >\n {form.validation?.confirmationText || 'Thank you! Your submission has been received.'}\n </div>\n )}\n\n <form id=\"formsnip-form\" onSubmit={handleSubmit} className={CLASSES.form}>\n {/* Render hidden fields directly without wrappers */}\n {form.fields.filter((f) => f.isActive !== false && f.type === 'hidden').map((field) => (\n <React.Fragment key={field.id}>{renderField(field)}</React.Fragment>\n ))}\n \n {/* Render visible fields in rows */}\n {buildRowsFromFields(form.fields.filter((f) => f.isActive !== false && f.type !== 'hidden')).map((row, rowIdx) =>\n row.length === 1 ? (\n <div key={row[0].id} style={{ display: 'flex', flexDirection: 'column' }}>\n {renderField(row[0])}\n </div>\n ) : (\n <div\n key={`row-${rowIdx}`}\n style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '1.25rem' }}\n >\n {row.map((field) => (\n <div key={field.id} style={{ display: 'flex', flexDirection: 'column' }}>\n {renderField(field)}\n </div>\n ))}\n </div>\n )\n )}\n\n <button\n type=\"submit\"\n disabled={isSubmitting}\n className={CLASSES.button}\n style={{\n ...applyStyles({}, buttonStyles),\n // Explicitly control width: only full width if explicitly set to true\n // When false or undefined, ensure button is NOT full width\n width: buttonStyles.fullWidth === true ? '100%' : 'auto',\n display: buttonStyles.fullWidth === true ? 'block' : 'inline-block',\n maxWidth: buttonStyles.fullWidth === true ? undefined : 'fit-content',\n }}\n >\n {isSubmitting ? 'Submitting...' : form.submitButtonText || 'Submit'}\n </button>\n </form>\n </>\n );\n\n return className ? <div className={className}>{content}</div> : content;\n};\n"],"names":["useRef","useState","useEffect"],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -54,14 +54,6 @@ export interface FormSnipProps {
|
|
|
54
54
|
className?: string;
|
|
55
55
|
/** Optional prefill values keyed by URL prefill parameter (e.g. ?tjeneste=...) */
|
|
56
56
|
prefill?: Record<string, string>;
|
|
57
|
-
/**
|
|
58
|
-
* When true, pushes to `window.dataLayer` only after the server accepts the submission
|
|
59
|
-
* (not on HTML5 validation failure or API errors). For GTM, use a Custom Event trigger
|
|
60
|
-
* matching `dataLayerEventName`.
|
|
61
|
-
*/
|
|
62
|
-
pushDataLayerOnSuccess?: boolean;
|
|
63
|
-
/** GTM `event` name for the dataLayer push (default: `formsnip_submission_success`). */
|
|
64
|
-
dataLayerEventName?: string;
|
|
65
57
|
}
|
|
66
58
|
export interface SubmissionResponse {
|
|
67
59
|
success: boolean;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IACrI,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE;QACZ,KAAK,CAAC,EAAE;YACN,eAAe,CAAC,EAAE,MAAM,CAAC;YACzB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,aAAa,CAAC,EAAE,MAAM,CAAC;SACxB,CAAC;QACF,MAAM,CAAC,EAAE;YACP,eAAe,CAAC,EAAE,MAAM,CAAC;YACzB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,SAAS,CAAC,EAAE,OAAO,CAAC;SACrB,CAAC;KACH,CAAC;IACF,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IACrI,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE;QACZ,KAAK,CAAC,EAAE;YACN,eAAe,CAAC,EAAE,MAAM,CAAC;YACzB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,aAAa,CAAC,EAAE,MAAM,CAAC;SACxB,CAAC;QACF,MAAM,CAAC,EAAE;YACP,eAAe,CAAC,EAAE,MAAM,CAAC;YACzB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,SAAS,CAAC,EAAE,OAAO,CAAC;SACrB,CAAC;KACH,CAAC;IACF,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Push a GTM-friendly event to
|
|
3
|
-
* Safe no-op
|
|
2
|
+
* Push a GTM-friendly event to the global dataLayer after a successful submission.
|
|
3
|
+
* Uses `globalThis` so it works in typical browser bundles. Safe no-op if push throws.
|
|
4
4
|
*/
|
|
5
5
|
export declare function pushFormSnipSubmissionDataLayer(options: {
|
|
6
|
-
eventName?: string;
|
|
7
6
|
formId: string;
|
|
8
7
|
formName?: string;
|
|
9
8
|
}): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataLayer.d.ts","sourceRoot":"","sources":["../../src/utils/dataLayer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE;IACvD,
|
|
1
|
+
{"version":3,"file":"dataLayer.d.ts","sourceRoot":"","sources":["../../src/utils/dataLayer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAcP"}
|