@algodomain/smart-forms 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkY3H6MI5D_cjs = require('./chunk-Y3H6MI5D.cjs');
4
- var chunkLRMJP5OJ_cjs = require('./chunk-LRMJP5OJ.cjs');
3
+ var chunkCJ55WKPC_cjs = require('./chunk-CJ55WKPC.cjs');
4
+ var chunk4H5U5IHH_cjs = require('./chunk-4H5U5IHH.cjs');
5
5
  var React3 = require('react');
6
6
  var reactToastify = require('react-toastify');
7
7
  var jsxRuntime = require('react/jsx-runtime');
@@ -118,7 +118,7 @@ var BaseSmartForm = ({
118
118
  includeQueryParams,
119
119
  queryParamsToInclude
120
120
  };
121
- return /* @__PURE__ */ jsxRuntime.jsx(chunkLRMJP5OJ_cjs.SmartFormProvider, { config, initialData, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
121
+ return /* @__PURE__ */ jsxRuntime.jsx(chunk4H5U5IHH_cjs.SmartFormProvider, { config, initialData, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
122
122
  /* @__PURE__ */ jsxRuntime.jsx(ToastContainerWrapper, {}),
123
123
  /* @__PURE__ */ jsxRuntime.jsx(FormHeader, { title, subTitle, logo }),
124
124
  children,
@@ -126,15 +126,15 @@ var BaseSmartForm = ({
126
126
  ] }) });
127
127
  };
128
128
  var LoadingSpinner = ({ className = "h-4 w-4" }) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: `animate-spin rounded-full border-b-2 border-current ${className}` });
129
- var SubmitButton = ({ onClick, disabled, children, className }) => /* @__PURE__ */ jsxRuntime.jsx(chunkY3H6MI5D_cjs.Button, { onClick, disabled, className, children: disabled ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
129
+ var SubmitButton = ({ onClick, disabled, children, className }) => /* @__PURE__ */ jsxRuntime.jsx(chunkCJ55WKPC_cjs.Button, { onClick, disabled, className, children: disabled ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
130
130
  /* @__PURE__ */ jsxRuntime.jsx(LoadingSpinner, {}),
131
131
  "Submitting..."
132
132
  ] }) : children });
133
- var DraftSaveButton = ({ onClick, disabled }) => /* @__PURE__ */ jsxRuntime.jsx(chunkY3H6MI5D_cjs.Button, { onClick, disabled, variant: "secondary", children: disabled ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
133
+ var DraftSaveButton = ({ onClick, disabled }) => /* @__PURE__ */ jsxRuntime.jsx(chunkCJ55WKPC_cjs.Button, { onClick, disabled, variant: "secondary", children: disabled ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
134
134
  /* @__PURE__ */ jsxRuntime.jsx(LoadingSpinner, {}),
135
135
  "Saving..."
136
136
  ] }) : "Save Draft" });
137
- var ResetButton = ({ onClick }) => /* @__PURE__ */ jsxRuntime.jsx(chunkY3H6MI5D_cjs.Button, { onClick, variant: "secondary", children: "Reset Form" });
137
+ var ResetButton = ({ onClick }) => /* @__PURE__ */ jsxRuntime.jsx(chunkCJ55WKPC_cjs.Button, { onClick, variant: "secondary", children: "Reset Form" });
138
138
  var NavigationButtons = ({
139
139
  onPrevious,
140
140
  onNext,
@@ -155,7 +155,7 @@ var NavigationButtons = ({
155
155
  const isSingleButton = rightSectionButtons === 1 && !hasPreviousButton;
156
156
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between items-center mt-8 pt-6 border-t border-gray-200", children: [
157
157
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-4", children: onPrevious && /* @__PURE__ */ jsxRuntime.jsxs(
158
- chunkY3H6MI5D_cjs.Button,
158
+ chunkCJ55WKPC_cjs.Button,
159
159
  {
160
160
  onClick: onPrevious,
161
161
  disabled: isFirstTab,
@@ -181,7 +181,7 @@ var NavigationButtons = ({
181
181
  ]
182
182
  }
183
183
  ) : onNext && /* @__PURE__ */ jsxRuntime.jsxs(
184
- chunkY3H6MI5D_cjs.Button,
184
+ chunkCJ55WKPC_cjs.Button,
185
185
  {
186
186
  onClick: onNext,
187
187
  className: isSingleButton ? "w-full" : "",
@@ -225,7 +225,7 @@ var SimpleFormButtons = ({
225
225
  ] }) });
226
226
  };
227
227
  var SubmitButton2 = () => {
228
- const { isLoading, isDraftSaving, submitForm, saveDraft, resetForm, config } = chunkLRMJP5OJ_cjs.useSmartForm();
228
+ const { isLoading, isDraftSaving, submitForm, saveDraft, resetForm, config } = chunk4H5U5IHH_cjs.useSmartForm();
229
229
  const shouldShowReset = config.showReset || config.enableLocalStorage;
230
230
  return /* @__PURE__ */ jsxRuntime.jsx(
231
231
  SimpleFormButtons,
@@ -265,7 +265,7 @@ function Tabs({
265
265
  TabsPrimitive__namespace.Root,
266
266
  {
267
267
  "data-slot": "tabs",
268
- className: chunkLRMJP5OJ_cjs.cn("flex flex-col gap-2", className),
268
+ className: chunk4H5U5IHH_cjs.cn("flex flex-col gap-2", className),
269
269
  ...props
270
270
  }
271
271
  );
@@ -278,7 +278,7 @@ function TabsList({
278
278
  TabsPrimitive__namespace.List,
279
279
  {
280
280
  "data-slot": "tabs-list",
281
- className: chunkLRMJP5OJ_cjs.cn(
281
+ className: chunk4H5U5IHH_cjs.cn(
282
282
  "bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]",
283
283
  className
284
284
  ),
@@ -294,7 +294,7 @@ function TabsTrigger({
294
294
  TabsPrimitive__namespace.Trigger,
295
295
  {
296
296
  "data-slot": "tabs-trigger",
297
- className: chunkLRMJP5OJ_cjs.cn(
297
+ className: chunk4H5U5IHH_cjs.cn(
298
298
  "data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
299
299
  className
300
300
  ),
@@ -310,7 +310,7 @@ function TabsContent({
310
310
  TabsPrimitive__namespace.Content,
311
311
  {
312
312
  "data-slot": "tabs-content",
313
- className: chunkLRMJP5OJ_cjs.cn("flex-1 outline-none", className),
313
+ className: chunk4H5U5IHH_cjs.cn("flex-1 outline-none", className),
314
314
  ...props
315
315
  }
316
316
  );
@@ -485,7 +485,7 @@ var MultiTabFormContent = ({
485
485
  footerChildren,
486
486
  children
487
487
  }) => {
488
- const { isLoading, isDraftSaving, submitForm, saveDraft, resetForm, validateFields, formData, validationRegistry, setErrors } = chunkLRMJP5OJ_cjs.useSmartForm();
488
+ const { isLoading, isDraftSaving, submitForm, saveDraft, resetForm, validateFields, formData, validationRegistry, setErrors } = chunk4H5U5IHH_cjs.useSmartForm();
489
489
  const [maxContentHeight, setMaxContentHeight] = React3.useState(0);
490
490
  const contentRefs = React3.useRef([]);
491
491
  const debounce = (func, wait) => {
@@ -755,7 +755,7 @@ var MultiTabFormContent = ({
755
755
 
756
756
  // src/hooks/useFormWrapper.ts
757
757
  var useFormWrapper = () => {
758
- return chunkLRMJP5OJ_cjs.useSmartForm();
758
+ return chunk4H5U5IHH_cjs.useSmartForm();
759
759
  };
760
760
  var useExternalFormRegistration = () => {
761
761
  const context = React3.useContext(ExternalFormContext);
@@ -777,7 +777,7 @@ var ExternalFieldProvider = ({
777
777
  children,
778
778
  registerField
779
779
  }) => {
780
- return /* @__PURE__ */ jsxRuntime.jsx(chunkLRMJP5OJ_cjs.FieldDetectionContext.Provider, { value: { registerField }, children });
780
+ return /* @__PURE__ */ jsxRuntime.jsx(chunk4H5U5IHH_cjs.FieldDetectionContext.Provider, { value: { registerField }, children });
781
781
  };
782
782
 
783
783
  // src/useAutoDetectFields.tsx
@@ -845,43 +845,43 @@ var FormFieldGroup = ({
845
845
 
846
846
  Object.defineProperty(exports, "SmartCheckbox", {
847
847
  enumerable: true,
848
- get: function () { return chunkY3H6MI5D_cjs.SmartCheckbox; }
848
+ get: function () { return chunkCJ55WKPC_cjs.SmartCheckbox; }
849
849
  });
850
850
  Object.defineProperty(exports, "SmartDatePicker", {
851
851
  enumerable: true,
852
- get: function () { return chunkY3H6MI5D_cjs.SmartDatePicker; }
852
+ get: function () { return chunkCJ55WKPC_cjs.SmartDatePicker; }
853
853
  });
854
854
  Object.defineProperty(exports, "SmartRadioGroup", {
855
855
  enumerable: true,
856
- get: function () { return chunkY3H6MI5D_cjs.SmartRadioGroup; }
856
+ get: function () { return chunkCJ55WKPC_cjs.SmartRadioGroup; }
857
857
  });
858
858
  Object.defineProperty(exports, "SmartSelect", {
859
859
  enumerable: true,
860
- get: function () { return chunkY3H6MI5D_cjs.SmartSelect; }
860
+ get: function () { return chunkCJ55WKPC_cjs.SmartSelect; }
861
861
  });
862
862
  Object.defineProperty(exports, "SmartTags", {
863
863
  enumerable: true,
864
- get: function () { return chunkY3H6MI5D_cjs.SmartTags; }
864
+ get: function () { return chunkCJ55WKPC_cjs.SmartTags; }
865
865
  });
866
866
  Object.defineProperty(exports, "SmartFormProvider", {
867
867
  enumerable: true,
868
- get: function () { return chunkLRMJP5OJ_cjs.SmartFormProvider; }
868
+ get: function () { return chunk4H5U5IHH_cjs.SmartFormProvider; }
869
869
  });
870
870
  Object.defineProperty(exports, "SmartInput", {
871
871
  enumerable: true,
872
- get: function () { return chunkLRMJP5OJ_cjs.SmartInput; }
872
+ get: function () { return chunk4H5U5IHH_cjs.SmartInput; }
873
873
  });
874
874
  Object.defineProperty(exports, "useFieldDetection", {
875
875
  enumerable: true,
876
- get: function () { return chunkLRMJP5OJ_cjs.useFieldDetection; }
876
+ get: function () { return chunk4H5U5IHH_cjs.useFieldDetection; }
877
877
  });
878
878
  Object.defineProperty(exports, "useFormField", {
879
879
  enumerable: true,
880
- get: function () { return chunkLRMJP5OJ_cjs.useFormField; }
880
+ get: function () { return chunk4H5U5IHH_cjs.useFormField; }
881
881
  });
882
882
  Object.defineProperty(exports, "useSmartForm", {
883
883
  enumerable: true,
884
- get: function () { return chunkLRMJP5OJ_cjs.useSmartForm; }
884
+ get: function () { return chunk4H5U5IHH_cjs.useSmartForm; }
885
885
  });
886
886
  exports.BaseSmartForm = BaseSmartForm;
887
887
  exports.DraftSaveButton = DraftSaveButton;
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import { Button } from './chunk-5A5WAAED.js';
2
- export { SmartCheckbox, SmartDatePicker, SmartRadioGroup, SmartSelect, SmartTags } from './chunk-5A5WAAED.js';
3
- import { SmartFormProvider, useSmartForm, FieldDetectionContext, cn } from './chunk-EE6VZXWC.js';
4
- export { SmartFormProvider, SmartInput, useFieldDetection, useFormField, useSmartForm } from './chunk-EE6VZXWC.js';
1
+ import { Button } from './chunk-KDPN4CHW.js';
2
+ export { SmartCheckbox, SmartDatePicker, SmartRadioGroup, SmartSelect, SmartTags } from './chunk-KDPN4CHW.js';
3
+ import { SmartFormProvider, useSmartForm, FieldDetectionContext, cn } from './chunk-5LRBJEZW.js';
4
+ export { SmartFormProvider, SmartInput, useFieldDetection, useFormField, useSmartForm } from './chunk-5LRBJEZW.js';
5
5
  import React3, { createContext, isValidElement, useContext, useState, useMemo, useCallback, useRef, useEffect } from 'react';
6
6
  import { ToastContainer, Bounce } from 'react-toastify';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkLRMJP5OJ_cjs = require('./chunk-LRMJP5OJ.cjs');
3
+ var chunk4H5U5IHH_cjs = require('./chunk-4H5U5IHH.cjs');
4
4
  var zod = require('zod');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var reactRouterDom = require('react-router-dom');
@@ -14,7 +14,7 @@ var FieldEmail = ({
14
14
  ...props
15
15
  }) => {
16
16
  return /* @__PURE__ */ jsxRuntime.jsx(
17
- chunkLRMJP5OJ_cjs.SmartInput,
17
+ chunk4H5U5IHH_cjs.SmartInput,
18
18
  {
19
19
  field,
20
20
  label,
@@ -36,7 +36,7 @@ var FieldPhone = ({
36
36
  ...props
37
37
  }) => {
38
38
  return /* @__PURE__ */ jsxRuntime.jsx(
39
- chunkLRMJP5OJ_cjs.SmartInput,
39
+ chunk4H5U5IHH_cjs.SmartInput,
40
40
  {
41
41
  field,
42
42
  label,
@@ -58,7 +58,7 @@ var FieldFirstName = ({
58
58
  ...props
59
59
  }) => {
60
60
  return /* @__PURE__ */ jsxRuntime.jsx(
61
- chunkLRMJP5OJ_cjs.SmartInput,
61
+ chunk4H5U5IHH_cjs.SmartInput,
62
62
  {
63
63
  field,
64
64
  label,
@@ -80,7 +80,7 @@ var FieldLastName = ({
80
80
  ...props
81
81
  }) => {
82
82
  return /* @__PURE__ */ jsxRuntime.jsx(
83
- chunkLRMJP5OJ_cjs.SmartInput,
83
+ chunk4H5U5IHH_cjs.SmartInput,
84
84
  {
85
85
  field,
86
86
  label,
@@ -102,7 +102,7 @@ var FieldFullName = ({
102
102
  ...props
103
103
  }) => {
104
104
  return /* @__PURE__ */ jsxRuntime.jsx(
105
- chunkLRMJP5OJ_cjs.SmartInput,
105
+ chunk4H5U5IHH_cjs.SmartInput,
106
106
  {
107
107
  field,
108
108
  label,
@@ -176,7 +176,7 @@ var FieldPassword = ({
176
176
  ))
177
177
  ] }),
178
178
  /* @__PURE__ */ jsxRuntime.jsx(
179
- chunkLRMJP5OJ_cjs.SmartInput,
179
+ chunk4H5U5IHH_cjs.SmartInput,
180
180
  {
181
181
  field,
182
182
  type: "password",
@@ -198,7 +198,7 @@ var FieldConfirmPassword = ({
198
198
  ...props
199
199
  }) => {
200
200
  return /* @__PURE__ */ jsxRuntime.jsx(
201
- chunkLRMJP5OJ_cjs.SmartInput,
201
+ chunk4H5U5IHH_cjs.SmartInput,
202
202
  {
203
203
  field,
204
204
  label,
@@ -222,7 +222,7 @@ var FieldAge = ({
222
222
  ...props
223
223
  }) => {
224
224
  return /* @__PURE__ */ jsxRuntime.jsx(
225
- chunkLRMJP5OJ_cjs.SmartInput,
225
+ chunk4H5U5IHH_cjs.SmartInput,
226
226
  {
227
227
  field,
228
228
  label,
@@ -248,7 +248,7 @@ var FieldStreetAddress = ({
248
248
  ...props
249
249
  }) => {
250
250
  return /* @__PURE__ */ jsxRuntime.jsx(
251
- chunkLRMJP5OJ_cjs.SmartInput,
251
+ chunk4H5U5IHH_cjs.SmartInput,
252
252
  {
253
253
  field,
254
254
  label,
@@ -270,7 +270,7 @@ var FieldCity = ({
270
270
  ...props
271
271
  }) => {
272
272
  return /* @__PURE__ */ jsxRuntime.jsx(
273
- chunkLRMJP5OJ_cjs.SmartInput,
273
+ chunk4H5U5IHH_cjs.SmartInput,
274
274
  {
275
275
  field,
276
276
  label,
@@ -292,7 +292,7 @@ var FieldZipCode = ({
292
292
  ...props
293
293
  }) => {
294
294
  return /* @__PURE__ */ jsxRuntime.jsx(
295
- chunkLRMJP5OJ_cjs.SmartInput,
295
+ chunk4H5U5IHH_cjs.SmartInput,
296
296
  {
297
297
  field,
298
298
  label,
@@ -314,7 +314,7 @@ var FieldState = ({
314
314
  ...props
315
315
  }) => {
316
316
  return /* @__PURE__ */ jsxRuntime.jsx(
317
- chunkLRMJP5OJ_cjs.SmartInput,
317
+ chunk4H5U5IHH_cjs.SmartInput,
318
318
  {
319
319
  field,
320
320
  label,
@@ -339,7 +339,7 @@ var FieldMessage = ({
339
339
  ...props
340
340
  }) => {
341
341
  return /* @__PURE__ */ jsxRuntime.jsx(
342
- chunkLRMJP5OJ_cjs.SmartInput,
342
+ chunk4H5U5IHH_cjs.SmartInput,
343
343
  {
344
344
  field,
345
345
  label,
@@ -364,7 +364,7 @@ var FieldComments = ({
364
364
  ...props
365
365
  }) => {
366
366
  return /* @__PURE__ */ jsxRuntime.jsx(
367
- chunkLRMJP5OJ_cjs.SmartInput,
367
+ chunk4H5U5IHH_cjs.SmartInput,
368
368
  {
369
369
  field,
370
370
  label,
@@ -380,15 +380,15 @@ var FieldComments = ({
380
380
 
381
381
  Object.defineProperty(exports, "SmartFormProvider", {
382
382
  enumerable: true,
383
- get: function () { return chunkLRMJP5OJ_cjs.SmartFormProvider; }
383
+ get: function () { return chunk4H5U5IHH_cjs.SmartFormProvider; }
384
384
  });
385
385
  Object.defineProperty(exports, "useFormField", {
386
386
  enumerable: true,
387
- get: function () { return chunkLRMJP5OJ_cjs.useFormField; }
387
+ get: function () { return chunk4H5U5IHH_cjs.useFormField; }
388
388
  });
389
389
  Object.defineProperty(exports, "useSmartForm", {
390
390
  enumerable: true,
391
- get: function () { return chunkLRMJP5OJ_cjs.useSmartForm; }
391
+ get: function () { return chunk4H5U5IHH_cjs.useSmartForm; }
392
392
  });
393
393
  exports.FieldAge = FieldAge;
394
394
  exports.FieldCity = FieldCity;
@@ -1,5 +1,5 @@
1
- import { SmartInput } from './chunk-EE6VZXWC.js';
2
- export { SmartFormProvider, useFormField, useSmartForm } from './chunk-EE6VZXWC.js';
1
+ import { SmartInput } from './chunk-5LRBJEZW.js';
2
+ export { SmartFormProvider, useFormField, useSmartForm } from './chunk-5LRBJEZW.js';
3
3
  import { z } from 'zod';
4
4
  import { jsx, jsxs } from 'react/jsx-runtime';
5
5
  import { Link } from 'react-router-dom';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@algodomain/smart-forms",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "A powerful React form framework with smart fields, multi-tab support, and seamless API integration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/SmartFormProvider.tsx","../src/FieldDetectionHook.tsx","../src/lib/utils.ts","../src/components/ui/input.tsx","../src/components/ui/textarea.tsx","../src/components/ui/label.tsx","../src/components/ui/tooltip.tsx","../src/smart-fields/SmartInput.tsx"],"names":["createContext","useContext","jsx","useRef","useState","jsxs"],"mappings":"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","file":"chunk-EE6VZXWC.js","sourcesContent":["import React, { createContext, useContext, useState, useRef, useCallback, type ReactNode } from 'react';\nimport { z } from 'zod';\n\n// =============================================================================\n// FORM PROVIDER TYPES\n// =============================================================================\n\n/**\n * Authentication configuration for SmartForm\n * \n * @interface AuthenticationConfig\n * @property {boolean} enable - Enable authentication (sends Bearer token in Authorization header)\n * @property {string} [refreshTokenEndpoint] - Optional endpoint for token refresh when accessToken expires\n * @property {string} [accessTokenKey] - localStorage key for access token (default: 'accessToken')\n * @property {string} [refreshTokenKey] - localStorage key for refresh token (default: 'refreshToken')\n * \n * @example\n * ```typescript\n * // Basic authentication without token refresh\n * authentication={{ enable: true }}\n * \n * // Authentication with token refresh\n * authentication={{\n * enable: true,\n * refreshTokenEndpoint: \"/api/auth/refresh\"\n * }}\n * \n * // Custom token keys\n * authentication={{\n * enable: true,\n * refreshTokenEndpoint: \"/api/auth/refresh\",\n * accessTokenKey: \"myAccessToken\",\n * refreshTokenKey: \"myRefreshToken\"\n * }}\n * ```\n */\nexport interface AuthenticationConfig {\n enable: boolean;\n refreshTokenEndpoint?: string; // Optional endpoint for token refresh when accessToken expires\n accessTokenKey?: string; // localStorage key for access token (default: 'accessToken')\n refreshTokenKey?: string; // localStorage key for refresh token (default: 'refreshToken')\n}\n\nexport interface FormConfig {\n showProgressBar?: any;\n api?: string;\n method?: 'POST' | 'PUT' | 'PATCH'; // HTTP method for form submission\n submitButtonText?: string;\n submitButtonIcon?: ReactNode;\n allowSaveDraft?: boolean;\n saveDraftApi?: string;\n onSuccess?: (data: any) => void;\n onError?: (error: any) => void;\n transformData?: (data: any) => any; // Transform data before submission\n className?: string;\n title?: string;\n subTitle?: string; // Optional subtitle displayed under the title\n storageKey?: string; // Key for localStorage persistence\n enableLocalStorage?: boolean; // Enable/disable localStorage\n logFormData?: boolean; // Enable/disable console logging of form data\n showReset?: boolean; // Show reset button regardless of localStorage setting\n showTabNumbers?: boolean; // Show tab numbers in tab headers\n authentication?: AuthenticationConfig; // Authentication configuration\n includeQueryParams?: boolean; // Include URL query parameters in form submission (default: false)\n queryParamsToInclude?: string[]; // Optional array of specific query param names to include\n}\n\nexport interface FormContextType {\n formData: any;\n errors: any;\n isLoading: boolean;\n isDraftSaving: boolean;\n updateField: (field: string, value: any) => void;\n validateField: (field: string, value: any) => boolean;\n validateFields: (fields: string[]) => boolean;\n submitForm: () => Promise<void>;\n validateFormAndGetResult: () => boolean;\n saveDraft: () => Promise<void>;\n resetForm: () => void;\n fieldRefs: React.MutableRefObject<any>;\n registerValidation: (field: string, validation: any) => void;\n validationRegistry: any;\n config: FormConfig;\n setErrors: (errors: any) => void;\n registerSubmitHook: (key: string, hook: () => Promise<void>) => void;\n unregisterSubmitHook: (key: string) => void;\n}\n\n// =============================================================================\n// FORM CONTEXT\n// =============================================================================\n\nconst FormContext = createContext<FormContextType | null>(null);\n\n// =============================================================================\n// FORM PROVIDER COMPONENT\n// =============================================================================\n\nexport interface SmartFormProviderProps {\n children: ReactNode;\n config: FormConfig;\n initialData?: any;\n}\n\nexport const SmartFormProvider: React.FC<SmartFormProviderProps> = ({\n children,\n config,\n initialData = {}\n}) => {\n // Helper function to extract query parameters from URL\n const getQueryParams = useCallback((allowedParams?: string[]): Record<string, any> => {\n const params = new URLSearchParams(window.location.search);\n const result: Record<string, any> = {};\n \n if (allowedParams && allowedParams.length > 0) {\n // Only include specified params\n allowedParams.forEach(key => {\n const value = params.get(key);\n if (value !== null) {\n result[key] = value;\n }\n });\n } else {\n // Include all params\n params.forEach((value, key) => {\n result[key] = value;\n });\n }\n \n return result;\n }, []);\n\n // Helper functions for localStorage\n const getStorageKey = () => {\n return config.storageKey || 'smart-form-data';\n };\n\n const loadFromStorage = () => {\n if (!config.enableLocalStorage) return initialData;\n\n try {\n const stored = localStorage.getItem(getStorageKey());\n if (stored) {\n const parsedStored = JSON.parse(stored);\n // Merge stored data with initialData\n // For each field: use stored value if it's not empty/null, otherwise use initialData value\n const merged = { ...initialData };\n Object.keys(parsedStored).forEach((key) => {\n const storedValue = parsedStored[key];\n // Only use stored value if it's not null, undefined, or empty string\n if (storedValue !== null && storedValue !== undefined && storedValue !== '') {\n merged[key] = storedValue;\n }\n });\n return merged;\n }\n return initialData;\n } catch (error) {\n console.warn('Failed to load form data from localStorage:', error);\n return initialData;\n }\n };\n\n const saveToStorage = (data: any) => {\n if (!config.enableLocalStorage) return;\n\n try {\n localStorage.setItem(getStorageKey(), JSON.stringify(data));\n } catch (error) {\n console.warn('Failed to save form data to localStorage:', error);\n }\n };\n\n const clearStorage = () => {\n if (!config.enableLocalStorage) return;\n\n try {\n localStorage.removeItem(getStorageKey());\n } catch (error) {\n console.warn('Failed to clear form data from localStorage:', error);\n }\n };\n\n const [formData, setFormData] = useState(loadFromStorage);\n const [errors, setErrors] = useState<any>({});\n const [isLoading, setIsLoading] = useState(false);\n const [isDraftSaving, setIsDraftSaving] = useState(false);\n const [validationRegistry, setValidationRegistry] = useState<any>({});\n const fieldRefs = useRef<any>({});\n const submitHooksRef = useRef<Map<string, () => Promise<void>>>(new Map());\n\n // Update form field\n const updateField = useCallback((field: string, value: any) => {\n setFormData((prev: any) => {\n const newData = {\n ...prev,\n [field]: value\n };\n // Save to localStorage after state update\n setTimeout(() => saveToStorage(newData), 0);\n return newData;\n });\n\n // Clear error when user starts typing\n if (errors[field]) {\n setErrors((prev: any) => {\n const newErrors = { ...prev };\n delete newErrors[field];\n return newErrors;\n });\n }\n }, [errors, config.enableLocalStorage, saveToStorage]);\n\n // Validate single field\n const validateField = useCallback((field: string, value: any) => {\n const validation = validationRegistry[field];\n if (!validation) return true;\n\n try {\n validation.parse(value);\n return true;\n } catch (error) {\n if (error instanceof z.ZodError) {\n setErrors((prev: any) => ({\n ...prev,\n [field]: error.issues[0]?.message || `Invalid ${field}`\n }));\n return false;\n }\n return false;\n }\n }, [validationRegistry]);\n\n // Register validation for a field\n const registerValidation = useCallback((field: string, validation: any) => {\n setValidationRegistry((prev: any) => ({\n ...prev,\n [field]: validation\n }));\n }, []);\n\n // Validate all fields\n const validateAllFields = useCallback(() => {\n const allErrors: any = {};\n let isValid = true;\n\n for (const [field, validation] of Object.entries(validationRegistry)) {\n if (validation && typeof (validation as any).parse === 'function') {\n try {\n (validation as any).parse(formData[field]);\n } catch (error) {\n if (error instanceof z.ZodError) {\n allErrors[field] = error.issues[0]?.message || `Invalid ${field}`;\n isValid = false;\n }\n }\n }\n }\n\n setErrors(allErrors);\n return isValid;\n }, [formData, validationRegistry]);\n\n // Validate specific fields (for tab validation)\n const validateFields = useCallback((fields: string[]) => {\n const allErrors: any = {};\n let isValid = true;\n\n for (const field of fields) {\n const validation = validationRegistry[field];\n if (validation) {\n try {\n validation.parse(formData[field]);\n } catch (error) {\n if (error instanceof z.ZodError) {\n allErrors[field] = error.issues[0]?.message || `Invalid ${field}`;\n isValid = false;\n }\n }\n }\n }\n\n // Only update errors for the fields being validated\n setErrors((prev: any) => ({\n ...prev,\n ...allErrors\n }));\n\n return isValid;\n }, [formData, validationRegistry]);\n\n // Submit form\n const submitForm = useCallback(async () => {\n if (!validateAllFields()) {\n return;\n }\n\n if (!config.api) {\n console.warn('No API endpoint provided');\n return;\n }\n\n // Merge query params with form data if enabled\n let dataToSubmit = formData;\n if (config.includeQueryParams) {\n const queryParams = getQueryParams(config.queryParamsToInclude);\n // Form data overrides query params in case of conflicts\n dataToSubmit = { ...queryParams, ...formData };\n }\n\n // Log form data if enabled\n if (config.logFormData) {\n console.log('📤 Submitting form data:', dataToSubmit);\n console.log('🎯 API endpoint:', config.api);\n }\n\n // Build a JSON-safe payload: replace File(s) with filename(s), Dates with ISO\n const toJsonSafe = (val: any): any => {\n if (val instanceof File) return val.name;\n if (val instanceof Date) return val.toISOString();\n if (Array.isArray(val)) {\n return val.map((item) => (item instanceof File ? item.name : toJsonSafe(item)));\n }\n if (val && typeof val === 'object') {\n // shallow map object values\n const out: any = {};\n for (const [k, v] of Object.entries(val)) out[k] = toJsonSafe(v);\n return out;\n }\n return val;\n };\n\n let jsonPayload = toJsonSafe(dataToSubmit);\n \n // Apply transformation if provided\n if (config.transformData) {\n jsonPayload = config.transformData(jsonPayload);\n }\n\n setIsLoading(true);\n try {\n // Prepare headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add Authorization header if authentication is enabled and token exists\n if (config.authentication?.enable) {\n const { accessTokenKey = 'accessToken' } = config.authentication;\n const token = localStorage.getItem(accessTokenKey);\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n // Prepare fetch options\n const fetchOptions: RequestInit = {\n method: config.method || 'POST',\n headers,\n body: JSON.stringify(jsonPayload),\n };\n\n // Add credentials if authentication is enabled\n if (config.authentication?.enable) {\n fetchOptions.credentials = 'include';\n }\n\n let response = await fetch(config.api, fetchOptions);\n\n // Handle token expiration with automatic refresh\n if (response.status === 403 && config.authentication?.enable && config.authentication.refreshTokenEndpoint) {\n const newAccessToken = await refreshAccessToken(config.authentication);\n \n if (newAccessToken) {\n // Retry the request with the new token\n headers.Authorization = `Bearer ${newAccessToken}`;\n response = await fetch(config.api, {\n ...fetchOptions,\n headers,\n });\n }\n }\n\n if (!response.ok) {\n const errorResponse = await response.json().catch(() => ({ message: 'Request failed' }));\n console.log('Error response:', errorResponse);\n throw new Error(JSON.stringify(errorResponse));\n }\n\n const result = await response.json();\n if (config.onSuccess) {\n config.onSuccess(result);\n }\n\n\n // After JSON submit, run any registered submit hooks (e.g., file uploads)\n for (const hook of submitHooksRef.current.values()) {\n try {\n // eslint-disable-next-line no-await-in-loop\n await hook();\n } catch (hookError) {\n console.error('Submit hook error:', hookError);\n }\n }\n } catch (error: any) {\n if (config.onError) {\n // Handle different error response formats\n let errorData;\n try {\n // Try to parse as JSON first\n errorData = JSON.parse(error.message);\n } catch {\n // If not JSON, create a structured error object with meaningful messages\n let userFriendlyMessage = \"An error occurred\";\n \n // Check for specific error types and provide meaningful messages\n if (error.message === \"Failed to fetch\" || error.message?.includes(\"Failed to fetch\")) {\n userFriendlyMessage = \"This service is temporarily unavailable. Please try again after some time.\";\n } else if (error.message?.includes(\"Network Error\")) {\n userFriendlyMessage = \"Network error occurred. Please check your connection and try again.\";\n } else if (error.message?.includes(\"timeout\")) {\n userFriendlyMessage = \"Request timed out. Please try again.\";\n } else if (error.message?.includes(\"CORS\")) {\n userFriendlyMessage = \"Connection error. Please contact support if this persists.\";\n } else if (error.message && error.message !== \"An error occurred\") {\n // Use the original message if it's meaningful\n userFriendlyMessage = error.message;\n }\n \n errorData = {\n message: userFriendlyMessage,\n details: []\n };\n }\n config.onError(errorData);\n }\n console.error('Form submission error:', error);\n } finally {\n setIsLoading(false);\n }\n }, [formData, config, validateAllFields, getQueryParams]);\n\n // Validate form and return validation result\n const validateFormAndGetResult = useCallback(() => {\n return validateAllFields();\n }, [validateAllFields]);\n\n /**\n * Helper function to refresh access token\n * This function handles token refresh internally and is reusable across projects\n * \n * @param authConfig - The authentication configuration object\n * @returns Promise<string | null> - New access token or null if refresh failed\n */\n const refreshAccessToken = useCallback(async (authConfig: AuthenticationConfig): Promise<string | null> => {\n const { refreshTokenEndpoint, accessTokenKey = 'accessToken', refreshTokenKey = 'refreshToken' } = authConfig;\n \n if (!refreshTokenEndpoint) {\n throw new Error('Refresh token endpoint not provided');\n }\n \n try {\n const refreshToken = localStorage.getItem(refreshTokenKey);\n if (!refreshToken) {\n throw new Error('No refresh token available');\n }\n\n const response = await fetch(refreshTokenEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ refreshToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Token refresh failed: ${response.status}`);\n }\n\n const result = await response.json();\n // Support different response formats: { data: { accessToken } } or { accessToken }\n const newAccessToken = result.data?.accessToken || result.accessToken;\n \n if (newAccessToken) {\n localStorage.setItem(accessTokenKey, newAccessToken);\n return newAccessToken;\n }\n \n throw new Error('No access token in refresh response');\n } catch (error) {\n console.error('Token refresh failed:', error);\n // Clear tokens on refresh failure to prevent infinite retry loops\n localStorage.removeItem(accessTokenKey);\n localStorage.removeItem(refreshTokenKey);\n return null;\n }\n }, []);\n\n // Save draft\n const saveDraft = useCallback(async () => {\n if (!config.saveDraftApi) {\n console.warn('No save draft API endpoint provided');\n return;\n }\n\n // Merge query params with form data if enabled\n let dataToSave = formData;\n if (config.includeQueryParams) {\n const queryParams = getQueryParams(config.queryParamsToInclude);\n // Form data overrides query params in case of conflicts\n dataToSave = { ...queryParams, ...formData };\n }\n\n // Log form data if enabled\n if (config.logFormData) {\n console.log('💾 Saving draft data:', dataToSave);\n console.log('🎯 Draft API endpoint:', config.saveDraftApi);\n }\n\n setIsDraftSaving(true);\n try {\n // Prepare headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add Authorization header if authentication is enabled and token exists\n if (config.authentication?.enable) {\n const { accessTokenKey = 'accessToken' } = config.authentication;\n const token = localStorage.getItem(accessTokenKey);\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n // Prepare fetch options\n const fetchOptions: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify(dataToSave),\n };\n\n // Add credentials if authentication is enabled\n if (config.authentication?.enable) {\n fetchOptions.credentials = 'include';\n }\n\n let response = await fetch(config.saveDraftApi, fetchOptions);\n\n // Handle token expiration with automatic refresh\n if (response.status === 403 && config.authentication?.enable && config.authentication.refreshTokenEndpoint) {\n const newAccessToken = await refreshAccessToken(config.authentication);\n \n if (newAccessToken) {\n // Retry the request with the new token\n headers.Authorization = `Bearer ${newAccessToken}`;\n response = await fetch(config.saveDraftApi, {\n ...fetchOptions,\n headers,\n });\n }\n }\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const result = await response.json();\n console.log('Draft saved successfully:', result);\n } catch (error) {\n console.error('Draft save error:', error);\n } finally {\n setIsDraftSaving(false);\n }\n }, [formData, config, getQueryParams]);\n\n // Reset form and clear localStorage\n const resetForm = useCallback(() => {\n setFormData(initialData);\n setErrors({});\n clearStorage();\n }, [initialData, config.enableLocalStorage, clearStorage]);\n\n const contextValue: FormContextType = {\n formData,\n errors,\n isLoading,\n isDraftSaving,\n updateField,\n validateField,\n validateFields,\n submitForm,\n validateFormAndGetResult,\n saveDraft,\n resetForm,\n fieldRefs,\n registerValidation,\n validationRegistry,\n config,\n setErrors,\n registerSubmitHook: (key: string, hook: () => Promise<void>) => {\n submitHooksRef.current.set(key, hook);\n },\n unregisterSubmitHook: (key: string) => {\n submitHooksRef.current.delete(key);\n }\n };\n\n return (\n <FormContext.Provider value={contextValue}>\n {children}\n </FormContext.Provider>\n );\n};\n\n// =============================================================================\n// FORM HOOKS\n// =============================================================================\n\nexport const useSmartForm = () => {\n const context = useContext(FormContext);\n if (!context) {\n throw new Error('useSmartForm must be used within a SmartFormProvider');\n }\n return context;\n};\n\nexport const useFormField = (field: string) => {\n const { formData, errors, updateField, fieldRefs, registerValidation } = useSmartForm();\n\n return {\n value: formData[field],\n error: errors[field],\n onChange: (value: any) => updateField(field, value),\n fieldRef: (el: any) => fieldRefs.current[field] = el,\n registerValidation\n };\n};\n","import { createContext, useContext } from 'react';\n\nexport interface FieldDetectionContextType {\n registerField: (fieldName: string) => void;\n}\n\nexport const FieldDetectionContext = createContext<FieldDetectionContextType | null>(null);\n\nexport const useFieldDetection = () => {\n const context = useContext(FieldDetectionContext);\n return context; // Return null if not in context (for backward compatibility)\n};\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","import * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","import * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n )\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import React, { useEffect, useRef, useState } from 'react';\nimport { useFormField } from '../SmartFormProvider';\nimport { useFieldDetection } from '../FieldDetectionHook';\nimport { Input } from '../components/ui/input';\nimport { Textarea } from '../components/ui/textarea';\nimport { Label } from '../components/ui/label';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../components/ui/tooltip';\nimport { EyeIcon, EyeOffIcon, InfoIcon } from 'lucide-react';\n\n// =============================================================================\n// SMART FORM INPUT TYPES\n// =============================================================================\n\nexport interface SmartInputProps {\n field: string;\n label?: string;\n type?: 'text' | 'email' | 'password' | 'tel' | 'number' | 'textarea';\n placeholder?: string;\n validation?: any; // Zod schema\n className?: string;\n required?: boolean;\n defaultValue?: any; // Default value for the field\n info?: string; // Info text to show on hover of info icon\n subLabel?: string; // Additional label text shown below the main label\n}\n\n// =============================================================================\n// SMART FORM INPUT COMPONENT\n// =============================================================================\n\nexport const SmartInput: React.FC<SmartInputProps> = ({\n field,\n label,\n type = 'text',\n placeholder,\n validation,\n className = '',\n required = false,\n defaultValue,\n info,\n subLabel\n}) => {\n const { value, error, onChange, fieldRef, registerValidation } = useFormField(field);\n const fieldDetection = useFieldDetection();\n const hasRegistered = useRef(false);\n const hasSetDefault = useRef(false);\n const [showPassword, setShowPassword] = useState(false);\n\n const togglePasswordVisibility = () => {\n setShowPassword(!showPassword);\n };\n\n // Register validation for this field\n useEffect(() => {\n if (validation && !hasRegistered.current) {\n hasRegistered.current = true;\n registerValidation(field, validation);\n }\n }, [validation, field, registerValidation]);\n\n // Auto-register field if in field detection context\n useEffect(() => {\n if (fieldDetection?.registerField) {\n fieldDetection.registerField(field);\n }\n }, [field, fieldDetection]);\n\n // Set default value if provided and field is empty\n useEffect(() => {\n if (defaultValue !== undefined && !hasSetDefault.current && (value === undefined || value === null || value === '')) {\n onChange(defaultValue);\n hasSetDefault.current = true;\n }\n }, [defaultValue, value, onChange]);\n\n // Generate placeholder text\n const getPlaceholder = () => {\n if (placeholder) return placeholder;\n if (!label) return `Enter ${field}`;\n if (type === 'email') return `Enter ${label.toLowerCase()}`;\n if (type === 'tel') return `Enter ${label.toLowerCase()}`;\n return `Enter ${label.toLowerCase()}`;\n };\n\n const renderInput = () => {\n switch (type) {\n case 'textarea':\n return (\n <Textarea\n ref={fieldRef}\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className={`w-full ${error ? 'border-destructive' : ''} ${className}`}\n placeholder={getPlaceholder()}\n rows={4}\n data-field={field}\n />\n );\n\n case 'password':\n return (\n <div className=\"relative\">\n <Input\n ref={fieldRef}\n type={showPassword ? \"text\" : \"password\"}\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className={`w-full pr-10 ${error ? 'border-destructive' : ''} ${className}`}\n placeholder={getPlaceholder()}\n data-field={field}\n />\n <button \n type=\"button\"\n onClick={togglePasswordVisibility}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 p-1 hover:bg-gray-100 rounded transition-colors\"\n >\n {showPassword ? (\n <EyeOffIcon className=\"h-4 w-4 text-muted-foreground\" />\n ) : (\n <EyeIcon className=\"h-4 w-4 text-muted-foreground\" />\n )}\n </button>\n </div>\n );\n\n default:\n return (\n <Input\n ref={fieldRef}\n type={type}\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className={`w-full ${error ? 'border-destructive' : ''} ${className}`}\n placeholder={getPlaceholder()}\n data-field={field}\n />\n );\n }\n };\n\n return (\n <div className={`flex-1 min-w-0 ${className}`}>\n {label && (\n <div className=\"mb-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <Label className=\"text-sm font-medium text-foreground\">\n {label} {required && <span className=\"text-destructive\">*</span>}\n </Label>\n {info && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <InfoIcon className=\"h-4 w-4 text-muted-foreground cursor-pointer mr-2\" />\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"max-w-xs\">{info}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n {subLabel && (\n <p className=\"text-xs text-muted-foreground mt-1\">{subLabel}</p>\n )}\n </div>\n )}\n {renderInput()}\n {error && (\n <p className=\"text-destructive text-sm mt-1\">{error}</p>\n )}\n </div>\n );\n};"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/SmartFormProvider.tsx","../src/FieldDetectionHook.tsx","../src/lib/utils.ts","../src/components/ui/input.tsx","../src/components/ui/textarea.tsx","../src/components/ui/label.tsx","../src/components/ui/tooltip.tsx","../src/smart-fields/SmartInput.tsx"],"names":["createContext","useCallback","useState","useRef","z","useContext","twMerge","clsx","jsx","LabelPrimitive","TooltipPrimitive","jsxs","useEffect","EyeOffIcon","EyeIcon","InfoIcon"],"mappings":"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","file":"chunk-LRMJP5OJ.cjs","sourcesContent":["import React, { createContext, useContext, useState, useRef, useCallback, type ReactNode } from 'react';\nimport { z } from 'zod';\n\n// =============================================================================\n// FORM PROVIDER TYPES\n// =============================================================================\n\n/**\n * Authentication configuration for SmartForm\n * \n * @interface AuthenticationConfig\n * @property {boolean} enable - Enable authentication (sends Bearer token in Authorization header)\n * @property {string} [refreshTokenEndpoint] - Optional endpoint for token refresh when accessToken expires\n * @property {string} [accessTokenKey] - localStorage key for access token (default: 'accessToken')\n * @property {string} [refreshTokenKey] - localStorage key for refresh token (default: 'refreshToken')\n * \n * @example\n * ```typescript\n * // Basic authentication without token refresh\n * authentication={{ enable: true }}\n * \n * // Authentication with token refresh\n * authentication={{\n * enable: true,\n * refreshTokenEndpoint: \"/api/auth/refresh\"\n * }}\n * \n * // Custom token keys\n * authentication={{\n * enable: true,\n * refreshTokenEndpoint: \"/api/auth/refresh\",\n * accessTokenKey: \"myAccessToken\",\n * refreshTokenKey: \"myRefreshToken\"\n * }}\n * ```\n */\nexport interface AuthenticationConfig {\n enable: boolean;\n refreshTokenEndpoint?: string; // Optional endpoint for token refresh when accessToken expires\n accessTokenKey?: string; // localStorage key for access token (default: 'accessToken')\n refreshTokenKey?: string; // localStorage key for refresh token (default: 'refreshToken')\n}\n\nexport interface FormConfig {\n showProgressBar?: any;\n api?: string;\n method?: 'POST' | 'PUT' | 'PATCH'; // HTTP method for form submission\n submitButtonText?: string;\n submitButtonIcon?: ReactNode;\n allowSaveDraft?: boolean;\n saveDraftApi?: string;\n onSuccess?: (data: any) => void;\n onError?: (error: any) => void;\n transformData?: (data: any) => any; // Transform data before submission\n className?: string;\n title?: string;\n subTitle?: string; // Optional subtitle displayed under the title\n storageKey?: string; // Key for localStorage persistence\n enableLocalStorage?: boolean; // Enable/disable localStorage\n logFormData?: boolean; // Enable/disable console logging of form data\n showReset?: boolean; // Show reset button regardless of localStorage setting\n showTabNumbers?: boolean; // Show tab numbers in tab headers\n authentication?: AuthenticationConfig; // Authentication configuration\n includeQueryParams?: boolean; // Include URL query parameters in form submission (default: false)\n queryParamsToInclude?: string[]; // Optional array of specific query param names to include\n}\n\nexport interface FormContextType {\n formData: any;\n errors: any;\n isLoading: boolean;\n isDraftSaving: boolean;\n updateField: (field: string, value: any) => void;\n validateField: (field: string, value: any) => boolean;\n validateFields: (fields: string[]) => boolean;\n submitForm: () => Promise<void>;\n validateFormAndGetResult: () => boolean;\n saveDraft: () => Promise<void>;\n resetForm: () => void;\n fieldRefs: React.MutableRefObject<any>;\n registerValidation: (field: string, validation: any) => void;\n validationRegistry: any;\n config: FormConfig;\n setErrors: (errors: any) => void;\n registerSubmitHook: (key: string, hook: () => Promise<void>) => void;\n unregisterSubmitHook: (key: string) => void;\n}\n\n// =============================================================================\n// FORM CONTEXT\n// =============================================================================\n\nconst FormContext = createContext<FormContextType | null>(null);\n\n// =============================================================================\n// FORM PROVIDER COMPONENT\n// =============================================================================\n\nexport interface SmartFormProviderProps {\n children: ReactNode;\n config: FormConfig;\n initialData?: any;\n}\n\nexport const SmartFormProvider: React.FC<SmartFormProviderProps> = ({\n children,\n config,\n initialData = {}\n}) => {\n // Helper function to extract query parameters from URL\n const getQueryParams = useCallback((allowedParams?: string[]): Record<string, any> => {\n const params = new URLSearchParams(window.location.search);\n const result: Record<string, any> = {};\n \n if (allowedParams && allowedParams.length > 0) {\n // Only include specified params\n allowedParams.forEach(key => {\n const value = params.get(key);\n if (value !== null) {\n result[key] = value;\n }\n });\n } else {\n // Include all params\n params.forEach((value, key) => {\n result[key] = value;\n });\n }\n \n return result;\n }, []);\n\n // Helper functions for localStorage\n const getStorageKey = () => {\n return config.storageKey || 'smart-form-data';\n };\n\n const loadFromStorage = () => {\n if (!config.enableLocalStorage) return initialData;\n\n try {\n const stored = localStorage.getItem(getStorageKey());\n if (stored) {\n const parsedStored = JSON.parse(stored);\n // Merge stored data with initialData\n // For each field: use stored value if it's not empty/null, otherwise use initialData value\n const merged = { ...initialData };\n Object.keys(parsedStored).forEach((key) => {\n const storedValue = parsedStored[key];\n // Only use stored value if it's not null, undefined, or empty string\n if (storedValue !== null && storedValue !== undefined && storedValue !== '') {\n merged[key] = storedValue;\n }\n });\n return merged;\n }\n return initialData;\n } catch (error) {\n console.warn('Failed to load form data from localStorage:', error);\n return initialData;\n }\n };\n\n const saveToStorage = (data: any) => {\n if (!config.enableLocalStorage) return;\n\n try {\n localStorage.setItem(getStorageKey(), JSON.stringify(data));\n } catch (error) {\n console.warn('Failed to save form data to localStorage:', error);\n }\n };\n\n const clearStorage = () => {\n if (!config.enableLocalStorage) return;\n\n try {\n localStorage.removeItem(getStorageKey());\n } catch (error) {\n console.warn('Failed to clear form data from localStorage:', error);\n }\n };\n\n const [formData, setFormData] = useState(loadFromStorage);\n const [errors, setErrors] = useState<any>({});\n const [isLoading, setIsLoading] = useState(false);\n const [isDraftSaving, setIsDraftSaving] = useState(false);\n const [validationRegistry, setValidationRegistry] = useState<any>({});\n const fieldRefs = useRef<any>({});\n const submitHooksRef = useRef<Map<string, () => Promise<void>>>(new Map());\n\n // Update form field\n const updateField = useCallback((field: string, value: any) => {\n setFormData((prev: any) => {\n const newData = {\n ...prev,\n [field]: value\n };\n // Save to localStorage after state update\n setTimeout(() => saveToStorage(newData), 0);\n return newData;\n });\n\n // Clear error when user starts typing\n if (errors[field]) {\n setErrors((prev: any) => {\n const newErrors = { ...prev };\n delete newErrors[field];\n return newErrors;\n });\n }\n }, [errors, config.enableLocalStorage, saveToStorage]);\n\n // Validate single field\n const validateField = useCallback((field: string, value: any) => {\n const validation = validationRegistry[field];\n if (!validation) return true;\n\n try {\n validation.parse(value);\n return true;\n } catch (error) {\n if (error instanceof z.ZodError) {\n setErrors((prev: any) => ({\n ...prev,\n [field]: error.issues[0]?.message || `Invalid ${field}`\n }));\n return false;\n }\n return false;\n }\n }, [validationRegistry]);\n\n // Register validation for a field\n const registerValidation = useCallback((field: string, validation: any) => {\n setValidationRegistry((prev: any) => ({\n ...prev,\n [field]: validation\n }));\n }, []);\n\n // Validate all fields\n const validateAllFields = useCallback(() => {\n const allErrors: any = {};\n let isValid = true;\n\n for (const [field, validation] of Object.entries(validationRegistry)) {\n if (validation && typeof (validation as any).parse === 'function') {\n try {\n (validation as any).parse(formData[field]);\n } catch (error) {\n if (error instanceof z.ZodError) {\n allErrors[field] = error.issues[0]?.message || `Invalid ${field}`;\n isValid = false;\n }\n }\n }\n }\n\n setErrors(allErrors);\n return isValid;\n }, [formData, validationRegistry]);\n\n // Validate specific fields (for tab validation)\n const validateFields = useCallback((fields: string[]) => {\n const allErrors: any = {};\n let isValid = true;\n\n for (const field of fields) {\n const validation = validationRegistry[field];\n if (validation) {\n try {\n validation.parse(formData[field]);\n } catch (error) {\n if (error instanceof z.ZodError) {\n allErrors[field] = error.issues[0]?.message || `Invalid ${field}`;\n isValid = false;\n }\n }\n }\n }\n\n // Only update errors for the fields being validated\n setErrors((prev: any) => ({\n ...prev,\n ...allErrors\n }));\n\n return isValid;\n }, [formData, validationRegistry]);\n\n // Submit form\n const submitForm = useCallback(async () => {\n if (!validateAllFields()) {\n return;\n }\n\n if (!config.api) {\n console.warn('No API endpoint provided');\n return;\n }\n\n // Merge query params with form data if enabled\n let dataToSubmit = formData;\n if (config.includeQueryParams) {\n const queryParams = getQueryParams(config.queryParamsToInclude);\n // Form data overrides query params in case of conflicts\n dataToSubmit = { ...queryParams, ...formData };\n }\n\n // Log form data if enabled\n if (config.logFormData) {\n console.log('📤 Submitting form data:', dataToSubmit);\n console.log('🎯 API endpoint:', config.api);\n }\n\n // Build a JSON-safe payload: replace File(s) with filename(s), Dates with ISO\n const toJsonSafe = (val: any): any => {\n if (val instanceof File) return val.name;\n if (val instanceof Date) return val.toISOString();\n if (Array.isArray(val)) {\n return val.map((item) => (item instanceof File ? item.name : toJsonSafe(item)));\n }\n if (val && typeof val === 'object') {\n // shallow map object values\n const out: any = {};\n for (const [k, v] of Object.entries(val)) out[k] = toJsonSafe(v);\n return out;\n }\n return val;\n };\n\n let jsonPayload = toJsonSafe(dataToSubmit);\n \n // Apply transformation if provided\n if (config.transformData) {\n jsonPayload = config.transformData(jsonPayload);\n }\n\n setIsLoading(true);\n try {\n // Prepare headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add Authorization header if authentication is enabled and token exists\n if (config.authentication?.enable) {\n const { accessTokenKey = 'accessToken' } = config.authentication;\n const token = localStorage.getItem(accessTokenKey);\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n // Prepare fetch options\n const fetchOptions: RequestInit = {\n method: config.method || 'POST',\n headers,\n body: JSON.stringify(jsonPayload),\n };\n\n // Add credentials if authentication is enabled\n if (config.authentication?.enable) {\n fetchOptions.credentials = 'include';\n }\n\n let response = await fetch(config.api, fetchOptions);\n\n // Handle token expiration with automatic refresh\n if (response.status === 403 && config.authentication?.enable && config.authentication.refreshTokenEndpoint) {\n const newAccessToken = await refreshAccessToken(config.authentication);\n \n if (newAccessToken) {\n // Retry the request with the new token\n headers.Authorization = `Bearer ${newAccessToken}`;\n response = await fetch(config.api, {\n ...fetchOptions,\n headers,\n });\n }\n }\n\n if (!response.ok) {\n const errorResponse = await response.json().catch(() => ({ message: 'Request failed' }));\n console.log('Error response:', errorResponse);\n throw new Error(JSON.stringify(errorResponse));\n }\n\n const result = await response.json();\n if (config.onSuccess) {\n config.onSuccess(result);\n }\n\n\n // After JSON submit, run any registered submit hooks (e.g., file uploads)\n for (const hook of submitHooksRef.current.values()) {\n try {\n // eslint-disable-next-line no-await-in-loop\n await hook();\n } catch (hookError) {\n console.error('Submit hook error:', hookError);\n }\n }\n } catch (error: any) {\n if (config.onError) {\n // Handle different error response formats\n let errorData;\n try {\n // Try to parse as JSON first\n errorData = JSON.parse(error.message);\n } catch {\n // If not JSON, create a structured error object with meaningful messages\n let userFriendlyMessage = \"An error occurred\";\n \n // Check for specific error types and provide meaningful messages\n if (error.message === \"Failed to fetch\" || error.message?.includes(\"Failed to fetch\")) {\n userFriendlyMessage = \"This service is temporarily unavailable. Please try again after some time.\";\n } else if (error.message?.includes(\"Network Error\")) {\n userFriendlyMessage = \"Network error occurred. Please check your connection and try again.\";\n } else if (error.message?.includes(\"timeout\")) {\n userFriendlyMessage = \"Request timed out. Please try again.\";\n } else if (error.message?.includes(\"CORS\")) {\n userFriendlyMessage = \"Connection error. Please contact support if this persists.\";\n } else if (error.message && error.message !== \"An error occurred\") {\n // Use the original message if it's meaningful\n userFriendlyMessage = error.message;\n }\n \n errorData = {\n message: userFriendlyMessage,\n details: []\n };\n }\n config.onError(errorData);\n }\n console.error('Form submission error:', error);\n } finally {\n setIsLoading(false);\n }\n }, [formData, config, validateAllFields, getQueryParams]);\n\n // Validate form and return validation result\n const validateFormAndGetResult = useCallback(() => {\n return validateAllFields();\n }, [validateAllFields]);\n\n /**\n * Helper function to refresh access token\n * This function handles token refresh internally and is reusable across projects\n * \n * @param authConfig - The authentication configuration object\n * @returns Promise<string | null> - New access token or null if refresh failed\n */\n const refreshAccessToken = useCallback(async (authConfig: AuthenticationConfig): Promise<string | null> => {\n const { refreshTokenEndpoint, accessTokenKey = 'accessToken', refreshTokenKey = 'refreshToken' } = authConfig;\n \n if (!refreshTokenEndpoint) {\n throw new Error('Refresh token endpoint not provided');\n }\n \n try {\n const refreshToken = localStorage.getItem(refreshTokenKey);\n if (!refreshToken) {\n throw new Error('No refresh token available');\n }\n\n const response = await fetch(refreshTokenEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ refreshToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Token refresh failed: ${response.status}`);\n }\n\n const result = await response.json();\n // Support different response formats: { data: { accessToken } } or { accessToken }\n const newAccessToken = result.data?.accessToken || result.accessToken;\n \n if (newAccessToken) {\n localStorage.setItem(accessTokenKey, newAccessToken);\n return newAccessToken;\n }\n \n throw new Error('No access token in refresh response');\n } catch (error) {\n console.error('Token refresh failed:', error);\n // Clear tokens on refresh failure to prevent infinite retry loops\n localStorage.removeItem(accessTokenKey);\n localStorage.removeItem(refreshTokenKey);\n return null;\n }\n }, []);\n\n // Save draft\n const saveDraft = useCallback(async () => {\n if (!config.saveDraftApi) {\n console.warn('No save draft API endpoint provided');\n return;\n }\n\n // Merge query params with form data if enabled\n let dataToSave = formData;\n if (config.includeQueryParams) {\n const queryParams = getQueryParams(config.queryParamsToInclude);\n // Form data overrides query params in case of conflicts\n dataToSave = { ...queryParams, ...formData };\n }\n\n // Log form data if enabled\n if (config.logFormData) {\n console.log('💾 Saving draft data:', dataToSave);\n console.log('🎯 Draft API endpoint:', config.saveDraftApi);\n }\n\n setIsDraftSaving(true);\n try {\n // Prepare headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add Authorization header if authentication is enabled and token exists\n if (config.authentication?.enable) {\n const { accessTokenKey = 'accessToken' } = config.authentication;\n const token = localStorage.getItem(accessTokenKey);\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n // Prepare fetch options\n const fetchOptions: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify(dataToSave),\n };\n\n // Add credentials if authentication is enabled\n if (config.authentication?.enable) {\n fetchOptions.credentials = 'include';\n }\n\n let response = await fetch(config.saveDraftApi, fetchOptions);\n\n // Handle token expiration with automatic refresh\n if (response.status === 403 && config.authentication?.enable && config.authentication.refreshTokenEndpoint) {\n const newAccessToken = await refreshAccessToken(config.authentication);\n \n if (newAccessToken) {\n // Retry the request with the new token\n headers.Authorization = `Bearer ${newAccessToken}`;\n response = await fetch(config.saveDraftApi, {\n ...fetchOptions,\n headers,\n });\n }\n }\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const result = await response.json();\n console.log('Draft saved successfully:', result);\n } catch (error) {\n console.error('Draft save error:', error);\n } finally {\n setIsDraftSaving(false);\n }\n }, [formData, config, getQueryParams]);\n\n // Reset form and clear localStorage\n const resetForm = useCallback(() => {\n setFormData(initialData);\n setErrors({});\n clearStorage();\n }, [initialData, config.enableLocalStorage, clearStorage]);\n\n const contextValue: FormContextType = {\n formData,\n errors,\n isLoading,\n isDraftSaving,\n updateField,\n validateField,\n validateFields,\n submitForm,\n validateFormAndGetResult,\n saveDraft,\n resetForm,\n fieldRefs,\n registerValidation,\n validationRegistry,\n config,\n setErrors,\n registerSubmitHook: (key: string, hook: () => Promise<void>) => {\n submitHooksRef.current.set(key, hook);\n },\n unregisterSubmitHook: (key: string) => {\n submitHooksRef.current.delete(key);\n }\n };\n\n return (\n <FormContext.Provider value={contextValue}>\n {children}\n </FormContext.Provider>\n );\n};\n\n// =============================================================================\n// FORM HOOKS\n// =============================================================================\n\nexport const useSmartForm = () => {\n const context = useContext(FormContext);\n if (!context) {\n throw new Error('useSmartForm must be used within a SmartFormProvider');\n }\n return context;\n};\n\nexport const useFormField = (field: string) => {\n const { formData, errors, updateField, fieldRefs, registerValidation } = useSmartForm();\n\n return {\n value: formData[field],\n error: errors[field],\n onChange: (value: any) => updateField(field, value),\n fieldRef: (el: any) => fieldRefs.current[field] = el,\n registerValidation\n };\n};\n","import { createContext, useContext } from 'react';\n\nexport interface FieldDetectionContextType {\n registerField: (fieldName: string) => void;\n}\n\nexport const FieldDetectionContext = createContext<FieldDetectionContextType | null>(null);\n\nexport const useFieldDetection = () => {\n const context = useContext(FieldDetectionContext);\n return context; // Return null if not in context (for backward compatibility)\n};\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","import * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","import * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n )\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import React, { useEffect, useRef, useState } from 'react';\nimport { useFormField } from '../SmartFormProvider';\nimport { useFieldDetection } from '../FieldDetectionHook';\nimport { Input } from '../components/ui/input';\nimport { Textarea } from '../components/ui/textarea';\nimport { Label } from '../components/ui/label';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../components/ui/tooltip';\nimport { EyeIcon, EyeOffIcon, InfoIcon } from 'lucide-react';\n\n// =============================================================================\n// SMART FORM INPUT TYPES\n// =============================================================================\n\nexport interface SmartInputProps {\n field: string;\n label?: string;\n type?: 'text' | 'email' | 'password' | 'tel' | 'number' | 'textarea';\n placeholder?: string;\n validation?: any; // Zod schema\n className?: string;\n required?: boolean;\n defaultValue?: any; // Default value for the field\n info?: string; // Info text to show on hover of info icon\n subLabel?: string; // Additional label text shown below the main label\n}\n\n// =============================================================================\n// SMART FORM INPUT COMPONENT\n// =============================================================================\n\nexport const SmartInput: React.FC<SmartInputProps> = ({\n field,\n label,\n type = 'text',\n placeholder,\n validation,\n className = '',\n required = false,\n defaultValue,\n info,\n subLabel\n}) => {\n const { value, error, onChange, fieldRef, registerValidation } = useFormField(field);\n const fieldDetection = useFieldDetection();\n const hasRegistered = useRef(false);\n const hasSetDefault = useRef(false);\n const [showPassword, setShowPassword] = useState(false);\n\n const togglePasswordVisibility = () => {\n setShowPassword(!showPassword);\n };\n\n // Register validation for this field\n useEffect(() => {\n if (validation && !hasRegistered.current) {\n hasRegistered.current = true;\n registerValidation(field, validation);\n }\n }, [validation, field, registerValidation]);\n\n // Auto-register field if in field detection context\n useEffect(() => {\n if (fieldDetection?.registerField) {\n fieldDetection.registerField(field);\n }\n }, [field, fieldDetection]);\n\n // Set default value if provided and field is empty\n useEffect(() => {\n if (defaultValue !== undefined && !hasSetDefault.current && (value === undefined || value === null || value === '')) {\n onChange(defaultValue);\n hasSetDefault.current = true;\n }\n }, [defaultValue, value, onChange]);\n\n // Generate placeholder text\n const getPlaceholder = () => {\n if (placeholder) return placeholder;\n if (!label) return `Enter ${field}`;\n if (type === 'email') return `Enter ${label.toLowerCase()}`;\n if (type === 'tel') return `Enter ${label.toLowerCase()}`;\n return `Enter ${label.toLowerCase()}`;\n };\n\n const renderInput = () => {\n switch (type) {\n case 'textarea':\n return (\n <Textarea\n ref={fieldRef}\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className={`w-full ${error ? 'border-destructive' : ''} ${className}`}\n placeholder={getPlaceholder()}\n rows={4}\n data-field={field}\n />\n );\n\n case 'password':\n return (\n <div className=\"relative\">\n <Input\n ref={fieldRef}\n type={showPassword ? \"text\" : \"password\"}\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className={`w-full pr-10 ${error ? 'border-destructive' : ''} ${className}`}\n placeholder={getPlaceholder()}\n data-field={field}\n />\n <button \n type=\"button\"\n onClick={togglePasswordVisibility}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 p-1 hover:bg-gray-100 rounded transition-colors\"\n >\n {showPassword ? (\n <EyeOffIcon className=\"h-4 w-4 text-muted-foreground\" />\n ) : (\n <EyeIcon className=\"h-4 w-4 text-muted-foreground\" />\n )}\n </button>\n </div>\n );\n\n default:\n return (\n <Input\n ref={fieldRef}\n type={type}\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className={`w-full ${error ? 'border-destructive' : ''} ${className}`}\n placeholder={getPlaceholder()}\n data-field={field}\n />\n );\n }\n };\n\n return (\n <div className={`flex-1 min-w-0 ${className}`}>\n {label && (\n <div className=\"mb-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <Label className=\"text-sm font-medium text-foreground\">\n {label} {required && <span className=\"text-destructive\">*</span>}\n </Label>\n {info && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <InfoIcon className=\"h-4 w-4 text-muted-foreground cursor-pointer mr-2\" />\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"max-w-xs\">{info}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n {subLabel && (\n <p className=\"text-xs text-muted-foreground mt-1\">{subLabel}</p>\n )}\n </div>\n )}\n {renderInput()}\n {error && (\n <p className=\"text-destructive text-sm mt-1\">{error}</p>\n )}\n </div>\n );\n};"]}