@x15ventures/x15-ui-library 3.14.0 → 3.15.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.
Files changed (156) hide show
  1. package/dist/cjs/autoGenerated/libraryThemes.js +12 -12
  2. package/dist/cjs/autoGenerated/libraryThemes.js.map +1 -1
  3. package/dist/cjs/autoGenerated/libraryThemes.json +12 -12
  4. package/dist/cjs/components/design/dialog/Dialog.js +1 -1
  5. package/dist/cjs/components/design/dialog/Dialog.js.map +1 -1
  6. package/dist/cjs/components/design/headerBar/HeaderBar.js +3 -1
  7. package/dist/cjs/components/design/headerBar/HeaderBar.js.map +1 -1
  8. package/dist/cjs/components/design/headerBar/headerBar.css +6 -1
  9. package/dist/cjs/components/design/skeleton/Skeleton.js +48 -0
  10. package/dist/cjs/components/design/skeleton/Skeleton.js.map +1 -0
  11. package/dist/cjs/components/design/skeleton/_skeletonVariables.css +0 -0
  12. package/dist/cjs/components/design/skeleton/skeleton.css +86 -0
  13. package/dist/cjs/components/form/formFields/formFieldWrapper/FormField.js +8 -5
  14. package/dist/cjs/components/form/formFields/formFieldWrapper/FormField.js.map +1 -1
  15. package/dist/cjs/components/form/formFields/formFieldWrapper/formFieldProps.js.map +1 -1
  16. package/dist/cjs/components/form/formFields/subComponents/inputs/autocomplete/Autocomplete.js +15 -11
  17. package/dist/cjs/components/form/formFields/subComponents/inputs/autocomplete/Autocomplete.js.map +1 -1
  18. package/dist/cjs/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.js +37 -15
  19. package/dist/cjs/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.js.map +1 -1
  20. package/dist/cjs/components/form/formFields/subComponents/inputs/checkbox/inputCheckbox.css +4 -4
  21. package/dist/cjs/components/form/formFields/subComponents/inputs/checkbox/inputCheckboxProps.js.map +1 -1
  22. package/dist/cjs/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js +9 -9
  23. package/dist/cjs/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js.map +1 -1
  24. package/dist/cjs/components/form/formFields/subComponents/inputs/radio/styled/StyledRadioGroup.js +14 -4
  25. package/dist/cjs/components/form/formFields/subComponents/inputs/radio/styled/StyledRadioGroup.js.map +1 -1
  26. package/dist/cjs/components/form/formFields/subComponents/inputs/text/InputText.js +23 -17
  27. package/dist/cjs/components/form/formFields/subComponents/inputs/text/InputText.js.map +1 -1
  28. package/dist/cjs/components/form/formFields/subComponents/select/Select.js +6 -5
  29. package/dist/cjs/components/form/formFields/subComponents/select/Select.js.map +1 -1
  30. package/dist/cjs/components/form/formFields/subComponents/textarea/Textarea.js +55 -83
  31. package/dist/cjs/components/form/formFields/subComponents/textarea/Textarea.js.map +1 -1
  32. package/dist/cjs/components/form/formFields/subComponents/textarea/textarea.css +20 -0
  33. package/dist/cjs/components/form/hookFormWrapper/HookFormWrapper.js +22 -5
  34. package/dist/cjs/components/form/hookFormWrapper/HookFormWrapper.js.map +1 -1
  35. package/dist/cjs/components/form/validation/ValidationMessages.js +36 -38
  36. package/dist/cjs/components/form/validation/ValidationMessages.js.map +1 -1
  37. package/dist/cjs/components/index.js +7 -0
  38. package/dist/cjs/components/index.js.map +1 -1
  39. package/dist/cjs/exampleUIs/exampleComponents/DemoContactForm.js +1 -2
  40. package/dist/cjs/exampleUIs/exampleComponents/DemoContactForm.js.map +1 -1
  41. package/dist/cjs/helpers/index.js +12 -0
  42. package/dist/cjs/helpers/index.js.map +1 -1
  43. package/dist/cjs/helpers/stringHelpers.js +48 -2
  44. package/dist/cjs/helpers/stringHelpers.js.map +1 -1
  45. package/dist/cjs/index.js +7 -0
  46. package/dist/cjs/index.js.map +1 -1
  47. package/dist/cjs/interfaces/headerText.interface.js.map +1 -1
  48. package/dist/cjs/package.json +137 -151
  49. package/dist/cjs/styles/index.css +36 -25
  50. package/dist/cjs/styles/shared/_allPartials.css +22 -25
  51. package/dist/cjs/styles/shared/forms/_forms.css +22 -25
  52. package/dist/cjs/styles/variables/cssVars/_darkModeVariables.css +3 -0
  53. package/dist/cjs/styles/variables/cssVars/_designVariables.css +11 -0
  54. package/dist/components/design/dialog/Dialog.d.ts.map +1 -1
  55. package/dist/components/design/dialog/Dialog.test.d.ts +5 -0
  56. package/dist/components/design/dialog/Dialog.test.d.ts.map +1 -0
  57. package/dist/components/design/headerBar/HeaderBar.d.ts.map +1 -1
  58. package/dist/components/design/skeleton/Skeleton.d.ts +27 -0
  59. package/dist/components/design/skeleton/Skeleton.d.ts.map +1 -0
  60. package/dist/components/form/formFields/formFieldWrapper/FormField.d.ts.map +1 -1
  61. package/dist/components/form/formFields/formFieldWrapper/formFieldProps.d.ts +7 -2
  62. package/dist/components/form/formFields/formFieldWrapper/formFieldProps.d.ts.map +1 -1
  63. package/dist/components/form/formFields/subComponents/inputs/autocomplete/Autocomplete.d.ts.map +1 -1
  64. package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.d.ts.map +1 -1
  65. package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.test.d.ts +5 -0
  66. package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.test.d.ts.map +1 -0
  67. package/dist/components/form/formFields/subComponents/inputs/checkbox/inputCheckboxProps.d.ts +8 -6
  68. package/dist/components/form/formFields/subComponents/inputs/checkbox/inputCheckboxProps.d.ts.map +1 -1
  69. package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.d.ts.map +1 -1
  70. package/dist/components/form/formFields/subComponents/inputs/radio/styled/StyledRadioGroup.d.ts.map +1 -1
  71. package/dist/components/form/formFields/subComponents/inputs/text/InputText.d.ts.map +1 -1
  72. package/dist/components/form/formFields/subComponents/nestedFormContext.test.d.ts +5 -0
  73. package/dist/components/form/formFields/subComponents/nestedFormContext.test.d.ts.map +1 -0
  74. package/dist/components/form/formFields/subComponents/select/Select.d.ts.map +1 -1
  75. package/dist/components/form/formFields/subComponents/textarea/Textarea.d.ts +4 -3
  76. package/dist/components/form/formFields/subComponents/textarea/Textarea.d.ts.map +1 -1
  77. package/dist/components/form/hookFormWrapper/HookFormWrapper.d.ts +3 -0
  78. package/dist/components/form/hookFormWrapper/HookFormWrapper.d.ts.map +1 -1
  79. package/dist/components/form/hookFormWrapper/HookFormWrapper.test.d.ts +5 -0
  80. package/dist/components/form/hookFormWrapper/HookFormWrapper.test.d.ts.map +1 -0
  81. package/dist/components/form/validation/ValidationMessages.d.ts +8 -1
  82. package/dist/components/form/validation/ValidationMessages.d.ts.map +1 -1
  83. package/dist/components/form/validation/ValidationMessages.test.d.ts +5 -0
  84. package/dist/components/form/validation/ValidationMessages.test.d.ts.map +1 -0
  85. package/dist/components/index.d.ts +2 -0
  86. package/dist/components/index.d.ts.map +1 -1
  87. package/dist/esm/autoGenerated/libraryThemes.js +12 -12
  88. package/dist/esm/autoGenerated/libraryThemes.js.map +1 -1
  89. package/dist/esm/autoGenerated/libraryThemes.json +12 -12
  90. package/dist/esm/components/design/dialog/Dialog.js +1 -1
  91. package/dist/esm/components/design/dialog/Dialog.js.map +1 -1
  92. package/dist/esm/components/design/headerBar/HeaderBar.js +3 -1
  93. package/dist/esm/components/design/headerBar/HeaderBar.js.map +1 -1
  94. package/dist/esm/components/design/headerBar/headerBar.css +6 -1
  95. package/dist/esm/components/design/skeleton/Skeleton.js +40 -0
  96. package/dist/esm/components/design/skeleton/Skeleton.js.map +1 -0
  97. package/dist/esm/components/design/skeleton/_skeletonVariables.css +0 -0
  98. package/dist/esm/components/design/skeleton/skeleton.css +86 -0
  99. package/dist/esm/components/form/formFields/formFieldWrapper/FormField.js +8 -5
  100. package/dist/esm/components/form/formFields/formFieldWrapper/FormField.js.map +1 -1
  101. package/dist/esm/components/form/formFields/formFieldWrapper/formFieldProps.js.map +1 -1
  102. package/dist/esm/components/form/formFields/subComponents/inputs/autocomplete/Autocomplete.js +16 -12
  103. package/dist/esm/components/form/formFields/subComponents/inputs/autocomplete/Autocomplete.js.map +1 -1
  104. package/dist/esm/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.js +37 -15
  105. package/dist/esm/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.js.map +1 -1
  106. package/dist/esm/components/form/formFields/subComponents/inputs/checkbox/inputCheckbox.css +4 -4
  107. package/dist/esm/components/form/formFields/subComponents/inputs/checkbox/inputCheckboxProps.js.map +1 -1
  108. package/dist/esm/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js +8 -8
  109. package/dist/esm/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js.map +1 -1
  110. package/dist/esm/components/form/formFields/subComponents/inputs/radio/styled/StyledRadioGroup.js +16 -6
  111. package/dist/esm/components/form/formFields/subComponents/inputs/radio/styled/StyledRadioGroup.js.map +1 -1
  112. package/dist/esm/components/form/formFields/subComponents/inputs/text/InputText.js +23 -17
  113. package/dist/esm/components/form/formFields/subComponents/inputs/text/InputText.js.map +1 -1
  114. package/dist/esm/components/form/formFields/subComponents/select/Select.js +6 -5
  115. package/dist/esm/components/form/formFields/subComponents/select/Select.js.map +1 -1
  116. package/dist/esm/components/form/formFields/subComponents/textarea/Textarea.js +50 -78
  117. package/dist/esm/components/form/formFields/subComponents/textarea/Textarea.js.map +1 -1
  118. package/dist/esm/components/form/formFields/subComponents/textarea/textarea.css +20 -0
  119. package/dist/esm/components/form/hookFormWrapper/HookFormWrapper.js +22 -5
  120. package/dist/esm/components/form/hookFormWrapper/HookFormWrapper.js.map +1 -1
  121. package/dist/esm/components/form/validation/ValidationMessages.js +36 -38
  122. package/dist/esm/components/form/validation/ValidationMessages.js.map +1 -1
  123. package/dist/esm/components/index.js +1 -0
  124. package/dist/esm/components/index.js.map +1 -1
  125. package/dist/esm/exampleUIs/exampleComponents/DemoContactForm.js +1 -2
  126. package/dist/esm/exampleUIs/exampleComponents/DemoContactForm.js.map +1 -1
  127. package/dist/esm/helpers/index.js +1 -1
  128. package/dist/esm/helpers/index.js.map +1 -1
  129. package/dist/esm/helpers/stringHelpers.js +44 -0
  130. package/dist/esm/helpers/stringHelpers.js.map +1 -1
  131. package/dist/esm/index.js +1 -1
  132. package/dist/esm/index.js.map +1 -1
  133. package/dist/esm/interfaces/headerText.interface.js.map +1 -1
  134. package/dist/esm/package.json +137 -151
  135. package/dist/esm/styles/index.css +36 -25
  136. package/dist/esm/styles/shared/_allPartials.css +22 -25
  137. package/dist/esm/styles/shared/forms/_forms.css +22 -25
  138. package/dist/esm/styles/variables/cssVars/_darkModeVariables.css +3 -0
  139. package/dist/esm/styles/variables/cssVars/_designVariables.css +11 -0
  140. package/dist/exampleUIs/exampleComponents/DemoContactForm.d.ts.map +1 -1
  141. package/dist/helpers/index.d.ts +1 -1
  142. package/dist/helpers/index.d.ts.map +1 -1
  143. package/dist/helpers/stringHelpers.d.ts +17 -0
  144. package/dist/helpers/stringHelpers.d.ts.map +1 -1
  145. package/dist/index.d.ts +2 -2
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/interfaces/headerText.interface.d.ts +1 -0
  148. package/dist/interfaces/headerText.interface.d.ts.map +1 -1
  149. package/dist/package.json +137 -151
  150. package/package.json +137 -151
  151. package/dist/cjs/components/form/formFields/utilities/formUtilities.js +0 -22
  152. package/dist/cjs/components/form/formFields/utilities/formUtilities.js.map +0 -1
  153. package/dist/components/form/formFields/utilities/formUtilities.d.ts +0 -18
  154. package/dist/components/form/formFields/utilities/formUtilities.d.ts.map +0 -1
  155. package/dist/esm/components/form/formFields/utilities/formUtilities.js +0 -16
  156. package/dist/esm/components/form/formFields/utilities/formUtilities.js.map +0 -1
@@ -8,7 +8,6 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.InputText = void 0;
9
9
  var _react = _interopRequireDefault(require("react"));
10
10
  var _reactHookForm = require("react-hook-form");
11
- var _formUtilities = require("../../../utilities/formUtilities");
12
11
  var _validationHelpers = require("../../../../../../helpers/validationHelpers");
13
12
  const InputText = ({
14
13
  field: {
@@ -33,18 +32,19 @@ const InputText = ({
33
32
  register,
34
33
  getFieldState,
35
34
  setValue
36
- } = (0, _reactHookForm.useFormContext)() || _formUtilities.NoHookFormContext;
35
+ } = (0, _reactHookForm.useFormContext)();
37
36
  const fieldState = getFieldState(name);
38
37
  const HandleAutoFill = event => {
39
- const {
40
- target
41
- } = event;
42
- if (target) {
43
- const newValue = target.value;
44
- if (type !== 'number' && type !== 'date') {
45
- setValue(name, newValue);
46
- }
47
- onChange(event);
38
+ // Some browsers trigger onAnimationStart when autofill happens.
39
+ // We need to notify react-hook-form of the new value.
40
+ if (event.animationName === 'onAutoFill') {
41
+ setValue(name, event.currentTarget.value, {
42
+ shouldValidate: true,
43
+ shouldDirty: true
44
+ });
45
+ onChange({
46
+ target: event.currentTarget
47
+ });
48
48
  }
49
49
  };
50
50
  const HandleOnBlur = event => {
@@ -52,9 +52,14 @@ const InputText = ({
52
52
  target
53
53
  } = event;
54
54
  if (target) {
55
- const newValue = target.value;
56
- if (type === 'text') {
57
- setValue(name, newValue.trim());
55
+ if (type === 'text' && target.value !== target.value.trim()) {
56
+ const trimmedValue = target.value.trim();
57
+ // Keep the uncontrolled input in step with the trimmed value held in form state.
58
+ target.value = trimmedValue;
59
+ setValue(name, trimmedValue, {
60
+ shouldValidate: true,
61
+ shouldDirty: true
62
+ });
58
63
  }
59
64
  onTouched();
60
65
  onBlur(event);
@@ -73,6 +78,7 @@ const InputText = ({
73
78
  return {};
74
79
  };
75
80
  const inputProps = {
81
+ ...htmlNativeDomProps,
76
82
  type,
77
83
  id,
78
84
  className: cssClass,
@@ -90,12 +96,12 @@ const InputText = ({
90
96
  ...addLengthValidatorProps('max'),
91
97
  ...addLengthValidatorProps('min'),
92
98
  ...register(name, {
93
- onChange: HandleAutoFill,
99
+ onChange,
94
100
  onBlur: HandleOnBlur,
95
101
  ...validation
96
102
  }),
97
- onKeyDown: HandleKeyEvent,
98
- ...htmlNativeDomProps
103
+ onAnimationStart: HandleAutoFill,
104
+ onKeyDown: HandleKeyEvent
99
105
  };
100
106
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, customContent?.preField && /*#__PURE__*/_react.default.createElement("span", {
101
107
  className: `preField preField_${type}Input`
@@ -1 +1 @@
1
- {"version":3,"file":"InputText.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","InputText","_react","_reactHookForm","_formUtilities","_validationHelpers","field","type","id","name","placeholder","defaultValue","disabled","onBlur","onChange","onKeyDown","onTouched","htmlNativeDomProps","validation","showSpinner","customCssClasses","customContent","register","getFieldState","setValue","useFormContext","NoHookFormContext","fieldState","HandleAutoFill","event","target","newValue","HandleOnBlur","trim","HandleKeyEvent","cssClass","input","invalid","addLengthValidatorProps","validatorKey","isValidationRuleWithValue","inputProps","className","required","default","createElement","Fragment","preField","postField"],"sources":["../../../../../../../../src/components/form/formFields/subComponents/inputs/text/InputText.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport { FormFieldProps, ValidationKey } from '../../../formFieldWrapper/formFieldProps';\nimport { NoHookFormContext } from '../../../utilities/formUtilities';\nimport { isValidationRuleWithValue } from '../../../../../../helpers/validationHelpers';\n\nexport interface InputTextProps extends FormFieldProps, React.InputHTMLAttributes<HTMLInputElement> { }\n\nexport const InputText: React.FC<InputTextProps> = (\n {\n field: {\n type = 'text',\n id,\n name,\n placeholder,\n defaultValue,\n disabled,\n onBlur = () => { },\n onChange = () => { },\n onKeyDown = () => { },\n onTouched = () => { },\n ...htmlNativeDomProps\n },\n validation,\n showSpinner,\n customCssClasses,\n customContent\n }\n) => {\n const { register, getFieldState, setValue } = useFormContext() || NoHookFormContext;\n const fieldState = getFieldState(name);\n\n const HandleAutoFill = (event: React.FocusEvent<HTMLInputElement>) => {\n const { target } = event;\n if (target) {\n const newValue = target.value;\n if (type !== 'number' && type !== 'date') {\n setValue(name, newValue);\n }\n onChange(event);\n }\n };\n\n const HandleOnBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n const { target } = event;\n if (target) {\n const newValue = target.value;\n if (type === 'text') {\n setValue(name, newValue.trim());\n }\n onTouched();\n onBlur(event);\n }\n };\n\n const HandleKeyEvent = (\n event: React.KeyboardEvent<HTMLInputElement> &\n React.KeyboardEvent<HTMLSelectElement> &\n React.KeyboardEvent<HTMLTextAreaElement>\n ) => {\n onKeyDown(event);\n };\n\n const cssClass = `${ customCssClasses?.input || '' }${ fieldState && fieldState?.invalid ? ' invalidField' : '' }`;\n\n const addLengthValidatorProps = (validatorKey: ValidationKey) => {\n if (\n validation\n && typeof validation[validatorKey] !== 'undefined'\n && isValidationRuleWithValue(validation[validatorKey])\n ) {\n return {\n [validatorKey]: validation[validatorKey]?.value\n };\n }\n return {};\n };\n\n const inputProps = {\n type,\n id,\n className: cssClass,\n placeholder,\n defaultValue,\n disabled,\n ...(showSpinner ? { disabled: true } : {}),\n ...(validation && typeof validation.required !== 'undefined' ? { required: true } : {}),\n ...(addLengthValidatorProps('maxLength')),\n ...(addLengthValidatorProps('minLength')),\n ...(addLengthValidatorProps('max')),\n ...(addLengthValidatorProps('min')),\n ...register(\n name,\n {\n onChange: HandleAutoFill,\n onBlur: HandleOnBlur,\n ...validation\n }\n ),\n onKeyDown: HandleKeyEvent,\n ...htmlNativeDomProps\n };\n\n return (\n <>\n {\n customContent?.preField\n && <span className={ `preField preField_${ type }Input` }>{ customContent?.preField }</span>\n }\n\n <input { ...inputProps } />\n\n {\n customContent?.postField\n && <span className={ `postField postField_${ type }Input` }>{ customContent?.postField }</span>\n }\n </>\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"InputText.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","InputText","_react","_reactHookForm","_validationHelpers","field","type","id","name","placeholder","defaultValue","disabled","onBlur","onChange","onKeyDown","onTouched","htmlNativeDomProps","validation","showSpinner","customCssClasses","customContent","register","getFieldState","setValue","useFormContext","fieldState","HandleAutoFill","event","animationName","currentTarget","shouldValidate","shouldDirty","target","HandleOnBlur","trim","trimmedValue","HandleKeyEvent","cssClass","input","invalid","addLengthValidatorProps","validatorKey","isValidationRuleWithValue","inputProps","className","required","onAnimationStart","default","createElement","Fragment","preField","postField"],"sources":["../../../../../../../../src/components/form/formFields/subComponents/inputs/text/InputText.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport { FormFieldProps, ValidationKey } from '../../../formFieldWrapper/formFieldProps';\nimport { isValidationRuleWithValue } from '../../../../../../helpers/validationHelpers';\n\nexport interface InputTextProps extends FormFieldProps, React.InputHTMLAttributes<HTMLInputElement> { }\n\nexport const InputText: React.FC<InputTextProps> = (\n {\n field: {\n type = 'text',\n id,\n name,\n placeholder,\n defaultValue,\n disabled,\n onBlur = () => { },\n onChange = () => { },\n onKeyDown = () => { },\n onTouched = () => { },\n ...htmlNativeDomProps\n },\n validation,\n showSpinner,\n customCssClasses,\n customContent\n }\n) => {\n const { register, getFieldState, setValue } = useFormContext();\n const fieldState = getFieldState(name);\n\n const HandleAutoFill = (event: React.AnimationEvent<HTMLInputElement>) => {\n // Some browsers trigger onAnimationStart when autofill happens.\n // We need to notify react-hook-form of the new value.\n if (event.animationName === 'onAutoFill') {\n setValue(name, event.currentTarget.value, { shouldValidate: true, shouldDirty: true });\n onChange({ target: event.currentTarget } as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n };\n\n const HandleOnBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n const { target } = event;\n if (target) {\n if (type === 'text' && target.value !== target.value.trim()) {\n const trimmedValue = target.value.trim();\n // Keep the uncontrolled input in step with the trimmed value held in form state.\n target.value = trimmedValue;\n setValue(name, trimmedValue, { shouldValidate: true, shouldDirty: true });\n }\n onTouched();\n onBlur(event);\n }\n };\n\n const HandleKeyEvent = (\n event: React.KeyboardEvent<HTMLInputElement> &\n React.KeyboardEvent<HTMLSelectElement> &\n React.KeyboardEvent<HTMLTextAreaElement>\n ) => {\n onKeyDown(event);\n };\n\n const cssClass = `${ customCssClasses?.input || '' }${ fieldState && fieldState?.invalid ? ' invalidField' : '' }`;\n\n const addLengthValidatorProps = (validatorKey: ValidationKey) => {\n if (\n validation\n && typeof validation[validatorKey] !== 'undefined'\n && isValidationRuleWithValue(validation[validatorKey])\n ) {\n return {\n [validatorKey]: validation[validatorKey]?.value\n };\n }\n return {};\n };\n\n const inputProps = {\n ...htmlNativeDomProps,\n type,\n id,\n className: cssClass,\n placeholder,\n defaultValue,\n disabled,\n ...(showSpinner ? { disabled: true } : {}),\n ...(validation && typeof validation.required !== 'undefined' ? { required: true } : {}),\n ...(addLengthValidatorProps('maxLength')),\n ...(addLengthValidatorProps('minLength')),\n ...(addLengthValidatorProps('max')),\n ...(addLengthValidatorProps('min')),\n ...register(\n name,\n {\n onChange,\n onBlur: HandleOnBlur,\n ...validation\n }\n ),\n onAnimationStart: HandleAutoFill,\n onKeyDown: HandleKeyEvent\n };\n\n return (\n <>\n {\n customContent?.preField\n && <span className={ `preField preField_${ type }Input` }>{ customContent?.preField }</span>\n }\n\n <input { ...inputProps } />\n\n {\n customContent?.postField\n && <span className={ `postField postField_${ type }Input` }>{ customContent?.postField }</span>\n }\n </>\n );\n};\n"],"mappings":";AAAA,YAAY;;AAAC,IAAAA,sBAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,cAAA,CAAAC,OAAA;EAAAC,KAAA;AAAA;AAAAD,OAAA,CAAAE,SAAA;AAEb,IAAAC,MAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,cAAA,GAAAP,OAAA;AAEA,IAAAQ,kBAAA,GAAAR,OAAA;AAIO,MAAMK,SAAmC,GAAGA,CACjD;EACEI,KAAK,EAAE;IACLC,IAAI,GAAG,MAAM;IACbC,EAAE;IACFC,IAAI;IACJC,WAAW;IACXC,YAAY;IACZC,QAAQ;IACRC,MAAM,GAAGA,CAAA,KAAM,CAAE,CAAC;IAClBC,QAAQ,GAAGA,CAAA,KAAM,CAAE,CAAC;IACpBC,SAAS,GAAGA,CAAA,KAAM,CAAE,CAAC;IACrBC,SAAS,GAAGA,CAAA,KAAM,CAAE,CAAC;IACrB,GAAGC;EACL,CAAC;EACDC,UAAU;EACVC,WAAW;EACXC,gBAAgB;EAChBC;AACF,CAAC,KACE;EACH,MAAM;IAAEC,QAAQ;IAAEC,aAAa;IAAEC;EAAS,CAAC,GAAG,IAAAC,6BAAc,EAAC,CAAC;EAC9D,MAAMC,UAAU,GAAGH,aAAa,CAACd,IAAI,CAAC;EAEtC,MAAMkB,cAAc,GAAIC,KAA6C,IAAK;IACxE;IACA;IACA,IAAIA,KAAK,CAACC,aAAa,KAAK,YAAY,EAAE;MACxCL,QAAQ,CAACf,IAAI,EAAEmB,KAAK,CAACE,aAAa,CAAC7B,KAAK,EAAE;QAAE8B,cAAc,EAAE,IAAI;QAAEC,WAAW,EAAE;MAAK,CAAC,CAAC;MACtFlB,QAAQ,CAAC;QAAEmB,MAAM,EAAEL,KAAK,CAACE;MAAc,CAAmD,CAAC;IAC7F;EACF,CAAC;EAED,MAAMI,YAAY,GAAIN,KAAyC,IAAK;IAClE,MAAM;MAAEK;IAAO,CAAC,GAAGL,KAAK;IACxB,IAAIK,MAAM,EAAE;MACV,IAAI1B,IAAI,KAAK,MAAM,IAAI0B,MAAM,CAAChC,KAAK,KAAKgC,MAAM,CAAChC,KAAK,CAACkC,IAAI,CAAC,CAAC,EAAE;QAC3D,MAAMC,YAAY,GAAGH,MAAM,CAAChC,KAAK,CAACkC,IAAI,CAAC,CAAC;QACxC;QACAF,MAAM,CAAChC,KAAK,GAAGmC,YAAY;QAC3BZ,QAAQ,CAACf,IAAI,EAAE2B,YAAY,EAAE;UAAEL,cAAc,EAAE,IAAI;UAAEC,WAAW,EAAE;QAAK,CAAC,CAAC;MAC3E;MACAhB,SAAS,CAAC,CAAC;MACXH,MAAM,CAACe,KAAK,CAAC;IACf;EACF,CAAC;EAED,MAAMS,cAAc,GAClBT,KAE0C,IACvC;IACHb,SAAS,CAACa,KAAK,CAAC;EAClB,CAAC;EAED,MAAMU,QAAQ,GAAG,GAAIlB,gBAAgB,EAAEmB,KAAK,IAAI,EAAE,GAAKb,UAAU,IAAIA,UAAU,EAAEc,OAAO,GAAG,eAAe,GAAG,EAAE,EAAG;EAElH,MAAMC,uBAAuB,GAAIC,YAA2B,IAAK;IAC/D,IACExB,UAAU,IACP,OAAOA,UAAU,CAACwB,YAAY,CAAC,KAAK,WAAW,IAC/C,IAAAC,4CAAyB,EAACzB,UAAU,CAACwB,YAAY,CAAC,CAAC,EACtD;MACA,OAAO;QACL,CAACA,YAAY,GAAGxB,UAAU,CAACwB,YAAY,CAAC,EAAEzC;MAC5C,CAAC;IACH;IACA,OAAO,CAAC,CAAC;EACX,CAAC;EAED,MAAM2C,UAAU,GAAG;IACjB,GAAG3B,kBAAkB;IACrBV,IAAI;IACJC,EAAE;IACFqC,SAAS,EAAEP,QAAQ;IACnB5B,WAAW;IACXC,YAAY;IACZC,QAAQ;IACR,IAAIO,WAAW,GAAG;MAAEP,QAAQ,EAAE;IAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,IAAIM,UAAU,IAAI,OAAOA,UAAU,CAAC4B,QAAQ,KAAK,WAAW,GAAG;MAAEA,QAAQ,EAAE;IAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACvF,GAAIL,uBAAuB,CAAC,WAAW,CAAE;IACzC,GAAIA,uBAAuB,CAAC,WAAW,CAAE;IACzC,GAAIA,uBAAuB,CAAC,KAAK,CAAE;IACnC,GAAIA,uBAAuB,CAAC,KAAK,CAAE;IACnC,GAAGnB,QAAQ,CACTb,IAAI,EACJ;MACEK,QAAQ;MACRD,MAAM,EAAEqB,YAAY;MACpB,GAAGhB;IACL,CACF,CAAC;IACD6B,gBAAgB,EAAEpB,cAAc;IAChCZ,SAAS,EAAEsB;EACb,CAAC;EAED,oBACElC,MAAA,CAAA6C,OAAA,CAAAC,aAAA,CAAA9C,MAAA,CAAA6C,OAAA,CAAAE,QAAA,QAEI7B,aAAa,EAAE8B,QAAQ,iBACpBhD,MAAA,CAAA6C,OAAA,CAAAC,aAAA;IAAMJ,SAAS,EAAG,qBAAsBtC,IAAI;EAAU,GAAGc,aAAa,EAAE8B,QAAgB,CAAC,eAG9FhD,MAAA,CAAA6C,OAAA,CAAAC,aAAA,UAAYL,UAAc,CAAC,EAGzBvB,aAAa,EAAE+B,SAAS,iBACrBjD,MAAA,CAAA6C,OAAA,CAAAC,aAAA;IAAMJ,SAAS,EAAG,uBAAwBtC,IAAI;EAAU,GAAGc,aAAa,EAAE+B,SAAiB,CAEhG,CAAC;AAEP,CAAC;AAACpD,OAAA,CAAAE,SAAA,GAAAA,SAAA","ignoreList":[]}
@@ -10,8 +10,7 @@ var _react = _interopRequireDefault(require("react"));
10
10
  var _reactHookForm = require("react-hook-form");
11
11
  var _HookFormWrapper = require("../../../hookFormWrapper/HookFormWrapper");
12
12
  var _objectHelpers = require("../../../../../helpers/objectHelpers");
13
- var _formUtilities = require("../../utilities/formUtilities");
14
- const Select = ({
13
+ const SelectField = ({
15
14
  field: {
16
15
  id,
17
16
  name,
@@ -33,7 +32,7 @@ const Select = ({
33
32
  const {
34
33
  register,
35
34
  getFieldState
36
- } = (0, _reactHookForm.useFormContext)() || _formUtilities.NoHookFormContext;
35
+ } = (0, _reactHookForm.useFormContext)();
37
36
  const fieldState = getFieldState(name);
38
37
  const HandleAutoFill = event => {
39
38
  const {
@@ -53,7 +52,6 @@ const Select = ({
53
52
  }
54
53
  };
55
54
  const HandleKeyEvent = event => {
56
- onTouched();
57
55
  onKeyDown(event);
58
56
  };
59
57
  const cssClass = `${customCssClasses?.input || ''}${fieldState && fieldState?.invalid ? ' invalidField' : ''}`;
@@ -90,7 +88,7 @@ const Select = ({
90
88
  value: option
91
89
  }, option);
92
90
  };
93
- return /*#__PURE__*/_react.default.createElement(_HookFormWrapper.HookFormWrapper, null, customContent?.preField && /*#__PURE__*/_react.default.createElement("span", {
91
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, customContent?.preField && /*#__PURE__*/_react.default.createElement("span", {
94
92
  className: "preField"
95
93
  }, customContent?.preField), /*#__PURE__*/_react.default.createElement("select", selectProps, includeEmptyOption && /*#__PURE__*/_react.default.createElement("option", {
96
94
  value: ""
@@ -98,5 +96,8 @@ const Select = ({
98
96
  className: "postField"
99
97
  }, customContent?.postField));
100
98
  };
99
+ const Select = props => /*#__PURE__*/_react.default.createElement(_HookFormWrapper.HookFormWrapper, {
100
+ formContext: props.formContext
101
+ }, /*#__PURE__*/_react.default.createElement(SelectField, props));
101
102
  exports.Select = Select;
102
103
  //# sourceMappingURL=Select.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Select.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","Select","_react","_reactHookForm","_HookFormWrapper","_objectHelpers","_formUtilities","field","id","name","placeholder","defaultValue","onBlur","onChange","onKeyDown","onTouched","includeEmptyOption","emptyOptionLabel","options","validation","showSpinner","customCssClasses","customContent","register","getFieldState","useFormContext","NoHookFormContext","fieldState","HandleAutoFill","event","target","HandleOnBlur","HandleKeyEvent","cssClass","input","invalid","selectProps","className","disabled","required","renderOption","option","isAnObject","typedOption","default","createElement","key","JSON","stringify","label","HookFormWrapper","preField","map","postField"],"sources":["../../../../../../../src/components/form/formFields/subComponents/select/Select.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport { HookFormWrapper } from '../../../hookFormWrapper/HookFormWrapper';\nimport { isAnObject } from '../../../../../helpers/objectHelpers';\nimport {\n FieldProps,\n FormFieldProps,\n SelectOptionObjectType,\n SelectOptionType,\n} from '../../formFieldWrapper/formFieldProps';\nimport { NoHookFormContext } from '../../utilities/formUtilities';\n\nexport interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement>, Omit<FormFieldProps, 'field'> {\n field: Omit<FieldProps, 'type'>;\n}\n\nexport const Select: React.FC<SelectProps> = (\n {\n field: {\n id,\n name,\n placeholder,\n defaultValue,\n onBlur = () => {},\n onChange = () => {},\n onKeyDown = () => {},\n onTouched = () => {},\n includeEmptyOption = true,\n emptyOptionLabel = 'Please select',\n options\n },\n validation,\n showSpinner,\n customCssClasses,\n customContent\n }\n) => {\n const { register, getFieldState } = useFormContext() || NoHookFormContext;\n const fieldState = getFieldState(name);\n\n const HandleAutoFill = (event: React.FocusEvent<HTMLInputElement>) => {\n const { target } = event;\n if (target) {\n onChange(event);\n }\n };\n\n const HandleOnBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n const { target } = event;\n if (target) {\n onTouched();\n onBlur(event);\n }\n };\n\n const HandleKeyEvent = (\n event: React.KeyboardEvent<HTMLInputElement> &\n React.KeyboardEvent<HTMLSelectElement> &\n React.KeyboardEvent<HTMLTextAreaElement>\n ) => {\n onTouched();\n onKeyDown(event);\n };\n\n const cssClass = `${ customCssClasses?.input || '' }${ fieldState && fieldState?.invalid ? ' invalidField' : '' }`;\n\n const selectProps = {\n id,\n className: cssClass,\n placeholder,\n defaultValue,\n ...(showSpinner ? { disabled: true } : {}),\n ...(validation && typeof validation.required !== 'undefined' ? { required: true } : {}),\n ...register(\n name,\n {\n onChange: HandleAutoFill,\n onBlur: HandleOnBlur,\n ...validation\n }\n ),\n onKeyDown: HandleKeyEvent\n };\n\n const renderOption = (option: SelectOptionType) => {\n if (isAnObject(option)) {\n const typedOption = option as SelectOptionObjectType;\n return (\n <option key={ `${ id }_${ typedOption.value }` } data-option={ JSON.stringify(typedOption) } value={ typedOption.value as string }>\n { typedOption.label }\n </option>\n );\n }\n return (\n <option key={ `${ id }_${ option }` } data-option={ JSON.stringify(option) } value={ option as string }>\n { option as string }\n </option>\n );\n };\n\n return (\n <HookFormWrapper>\n { customContent?.preField && <span className=\"preField\">{ customContent?.preField }</span> }\n\n <select { ...selectProps }>\n { includeEmptyOption && <option value=\"\">{ emptyOptionLabel }</option> }\n { (options as SelectOptionType[])?.map(renderOption) }\n </select>\n\n { customContent?.postField && <span className=\"postField\">{ customContent?.postField }</span> }\n </HookFormWrapper>\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Select.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","Select","_react","_reactHookForm","_HookFormWrapper","_objectHelpers","SelectField","field","id","name","placeholder","defaultValue","onBlur","onChange","onKeyDown","onTouched","includeEmptyOption","emptyOptionLabel","options","validation","showSpinner","customCssClasses","customContent","register","getFieldState","useFormContext","fieldState","HandleAutoFill","event","target","HandleOnBlur","HandleKeyEvent","cssClass","input","invalid","selectProps","className","disabled","required","renderOption","option","isAnObject","typedOption","default","createElement","key","JSON","stringify","label","Fragment","preField","map","postField","props","HookFormWrapper","formContext"],"sources":["../../../../../../../src/components/form/formFields/subComponents/select/Select.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport { HookFormWrapper } from '../../../hookFormWrapper/HookFormWrapper';\nimport { isAnObject } from '../../../../../helpers/objectHelpers';\nimport {\n FieldProps,\n FormFieldProps,\n SelectOptionObjectType,\n SelectOptionType,\n} from '../../formFieldWrapper/formFieldProps';\n\nexport interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement>, Omit<FormFieldProps, 'field'> {\n field: Omit<FieldProps, 'type'>;\n}\n\nconst SelectField: React.FC<SelectProps> = (\n {\n field: {\n id,\n name,\n placeholder,\n defaultValue,\n onBlur = () => {},\n onChange = () => {},\n onKeyDown = () => {},\n onTouched = () => {},\n includeEmptyOption = true,\n emptyOptionLabel = 'Please select',\n options\n },\n validation,\n showSpinner,\n customCssClasses,\n customContent\n }\n) => {\n const { register, getFieldState } = useFormContext();\n const fieldState = getFieldState(name);\n\n const HandleAutoFill = (event: React.FocusEvent<HTMLInputElement>) => {\n const { target } = event;\n if (target) {\n onChange(event);\n }\n };\n\n const HandleOnBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n const { target } = event;\n if (target) {\n onTouched();\n onBlur(event);\n }\n };\n\n const HandleKeyEvent = (\n event: React.KeyboardEvent<HTMLInputElement> &\n React.KeyboardEvent<HTMLSelectElement> &\n React.KeyboardEvent<HTMLTextAreaElement>\n ) => {\n onKeyDown(event);\n };\n\n const cssClass = `${ customCssClasses?.input || '' }${ fieldState && fieldState?.invalid ? ' invalidField' : '' }`;\n\n const selectProps = {\n id,\n className: cssClass,\n placeholder,\n defaultValue,\n ...(showSpinner ? { disabled: true } : {}),\n ...(validation && typeof validation.required !== 'undefined' ? { required: true } : {}),\n ...register(\n name,\n {\n onChange: HandleAutoFill,\n onBlur: HandleOnBlur,\n ...validation\n }\n ),\n onKeyDown: HandleKeyEvent\n };\n\n const renderOption = (option: SelectOptionType) => {\n if (isAnObject(option)) {\n const typedOption = option as SelectOptionObjectType;\n return (\n <option key={ `${ id }_${ typedOption.value }` } data-option={ JSON.stringify(typedOption) } value={ typedOption.value as string }>\n { typedOption.label }\n </option>\n );\n }\n return (\n <option key={ `${ id }_${ option }` } data-option={ JSON.stringify(option) } value={ option as string }>\n { option as string }\n </option>\n );\n };\n\n return (\n <>\n { customContent?.preField && <span className=\"preField\">{ customContent?.preField }</span> }\n\n <select { ...selectProps }>\n { includeEmptyOption && <option value=\"\">{ emptyOptionLabel }</option> }\n { (options as SelectOptionType[])?.map(renderOption) }\n </select>\n\n { customContent?.postField && <span className=\"postField\">{ customContent?.postField }</span> }\n </>\n );\n};\n\nexport const Select: React.FC<SelectProps> = (props) => (\n <HookFormWrapper formContext={ props.formContext }>\n <SelectField { ...props } />\n </HookFormWrapper>\n);\n"],"mappings":"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","ignoreList":[]}
@@ -8,36 +8,15 @@ exports.Textarea = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _reactHookForm = require("react-hook-form");
10
10
  var _HookFormWrapper = require("../../../hookFormWrapper/HookFormWrapper");
11
- var _formUtilities = require("../../utilities/formUtilities");
12
11
  var _ValidationMessages = require("../../../validation/ValidationMessages");
12
+ var _stringHelpers = require("../../../../../helpers/stringHelpers");
13
+ require("./textarea.css");
13
14
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
14
- /**
15
- * Counts user-perceived characters (grapheme clusters).
16
- * Treats emojis and composed characters (e.g. accented letters) as a single character.
17
- * Falls back to basic code-point counting if Intl.Segmenter is not available.
18
- */
19
- function getCharacterCount(value) {
20
- if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {
21
- const segmenter = new Intl.Segmenter(undefined, {
22
- granularity: 'grapheme'
23
- });
24
- return Array.from(segmenter.segment(value)).length;
25
- }
26
- return Array.from(value).length;
27
- }
28
- function clampToGraphemeMax(value, maxAllowed) {
29
- if (getCharacterCount(value) <= maxAllowed) {
30
- return value;
31
- }
32
- if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {
33
- const segmenter = new Intl.Segmenter(undefined, {
34
- granularity: 'grapheme'
35
- });
36
- return Array.from(segmenter.segment(value)).slice(0, maxAllowed).map(segment => segment.segment).join('');
37
- }
38
- return Array.from(value).slice(0, maxAllowed).join('');
39
- }
40
- const Textarea = ({
15
+ const Textarea = props => /*#__PURE__*/_react.default.createElement(_HookFormWrapper.HookFormWrapper, {
16
+ formContext: props.formContext
17
+ }, /*#__PURE__*/_react.default.createElement(TextareaField, props));
18
+ exports.Textarea = Textarea;
19
+ const TextareaField = ({
41
20
  field: {
42
21
  id,
43
22
  name,
@@ -62,20 +41,16 @@ const Textarea = ({
62
41
  formState: {
63
42
  errors
64
43
  }
65
- } = (0, _reactHookForm.useFormContext)() || _formUtilities.NoHookFormContext;
44
+ } = (0, _reactHookForm.useFormContext)();
66
45
  const fieldState = getFieldState(name);
67
- const hasFieldError = Boolean((0, _ValidationMessages.extractError)(errors, name));
68
- // Combine fieldState.invalid with a direct errors lookup so this component re-renders
69
- // whenever formState.errors changes (getFieldState alone does not subscribe to errors).
70
- const isInvalid = Boolean(fieldState?.invalid ?? hasFieldError);
71
- const [count, setCount] = (0, _react.useState)(() => getCharacterCount(defaultValue?.toString() || ''));
46
+ // getFieldState alone does not subscribe to errors, so the direct lookup keeps this in sync.
47
+ const isInvalid = Boolean(fieldState?.invalid || (0, _ValidationMessages.extractError)(errors, name));
48
+ const isRequiredError = fieldState?.error?.type === 'required';
49
+ const [count, setCount] = (0, _react.useState)(() => (0, _stringHelpers.getCharacterCount)(defaultValue?.toString() || ''));
72
50
  const [hasStartedTyping, setHasStartedTyping] = (0, _react.useState)(false);
73
51
  const hasMaxLength = typeof maxLength === 'number';
74
52
  const isAtLimit = hasMaxLength ? count >= maxLength : false;
75
- // Only hide counter for 'required' error. All other errors (maxLength, pattern, etc)
76
- // should show counter instead of error message.
77
- const isRequiredError = fieldState?.error?.type === 'required';
78
- const characterCounter = !hasStartedTyping || !hasMaxLength || isRequiredError ? undefined : `${count}/${maxLength}`;
53
+ const showsCharacterCount = hasStartedTyping && hasMaxLength && !isRequiredError;
79
54
  const cssClass = `${customCssClasses?.input || ''}${isInvalid ? ' invalidField' : ''}`;
80
55
  const normalizedValidation = (0, _react.useMemo)(() => {
81
56
  if (!validation || typeof validation.maxLength === 'undefined') {
@@ -87,7 +62,7 @@ const Textarea = ({
87
62
  return validation;
88
63
  }
89
64
  const maxLengthMessage = `Maximum length is ${maxLengthValue}`;
90
- const graphemeMaxLengthValidator = value => getCharacterCount(value || '') <= maxLengthValue || maxLengthMessage;
65
+ const graphemeMaxLengthValidator = value => (0, _stringHelpers.getCharacterCount)(value || '') <= maxLengthValue || maxLengthMessage;
91
66
 
92
67
  // eslint-disable-next-line no-unused-vars
93
68
  const {
@@ -121,37 +96,53 @@ const Textarea = ({
121
96
  validate: graphemeMaxLengthValidator
122
97
  };
123
98
  }, [validation]);
124
- const registered = register(name, normalizedValidation);
99
+ const fieldRegistration = register(name, normalizedValidation);
125
100
 
126
101
  /**
127
- * Prevents input that would exceed the maxLength when counting grapheme clusters.
128
- * Native <textarea maxLength> counts UTF-16 units, so emojis and composed characters
129
- * can be treated as multiple characters. We avoid using native maxLength and enforce
130
- * the limit here instead.
102
+ * Native maxLength counts UTF-16 units, so emojis and composed characters are treated as
103
+ * several characters. The limit is enforced here against grapheme clusters instead.
131
104
  */
132
105
  const HandleBeforeInput = event => {
133
- if (enforceMaxLength !== true || !hasMaxLength) return;
106
+ if (enforceMaxLength !== true || !hasMaxLength) {
107
+ return;
108
+ }
134
109
  const nativeEvent = event.nativeEvent;
135
110
  const inserted = nativeEvent.data ?? '';
136
- if (!inserted) return;
111
+ if (!inserted) {
112
+ return;
113
+ }
137
114
  const target = event.currentTarget;
138
115
  const start = target.selectionStart ?? target.value.length;
139
116
  const end = target.selectionEnd ?? target.value.length;
140
117
  const nextValue = target.value.slice(0, start) + inserted + target.value.slice(end);
141
- if (getCharacterCount(nextValue) > maxLength) {
118
+ if ((0, _stringHelpers.getCharacterCount)(nextValue) > maxLength) {
142
119
  event.preventDefault();
143
120
  }
144
121
  };
145
122
  const HandleChange = event => {
146
123
  const rawValue = event.target.value || '';
147
- const newValue = enforceMaxLength === true && hasMaxLength ? clampToGraphemeMax(rawValue, maxLength) : rawValue;
124
+ const newValue = enforceMaxLength === true && hasMaxLength ? (0, _stringHelpers.clampToGraphemeMax)(rawValue, maxLength) : rawValue;
148
125
  if (newValue !== rawValue) {
149
126
  event.target.value = newValue;
150
127
  }
151
128
  setHasStartedTyping(true);
152
- setCount(getCharacterCount(newValue));
153
- const onTextareaChange = onChange;
154
- onTextareaChange?.(event);
129
+ setCount((0, _stringHelpers.getCharacterCount)(newValue));
130
+ onChange(event);
131
+ fieldRegistration?.onChange?.(event);
132
+ };
133
+ const HandleAutoFill = event => {
134
+ // Browsers trigger onAnimationStart when autofill happens.
135
+ // We need to notify react-hook-form of the new value.
136
+ if (event.animationName === 'onAutoFill') {
137
+ const {
138
+ value
139
+ } = event.currentTarget;
140
+ setHasStartedTyping(true);
141
+ setCount((0, _stringHelpers.getCharacterCount)(value || ''));
142
+ HandleChange({
143
+ target: event.currentTarget
144
+ });
145
+ }
155
146
  };
156
147
  const HandleOnBlur = event => {
157
148
  const {
@@ -161,17 +152,12 @@ const Textarea = ({
161
152
  onTouched();
162
153
  onBlur(event);
163
154
  }
155
+ fieldRegistration?.onBlur?.(event);
164
156
  };
165
157
  const HandleKeyEvent = event => {
166
158
  onTouched();
167
- const onTextareaKeyDown = onKeyDown;
168
- onTextareaKeyDown?.(event);
159
+ onKeyDown(event);
169
160
  };
170
- const characterCounterId = `${id}_characterCount`;
171
- const errorsId = `${name}_errors`;
172
- const existingDescribedBy = typeof htmlNativeDomProps['aria-describedby'] === 'string' ? htmlNativeDomProps['aria-describedby'] : undefined;
173
- const showsRequiredError = isInvalid && isRequiredError;
174
- const mergedDescribedBy = showsRequiredError ? [existingDescribedBy, errorsId].filter(Boolean).join(' ') : characterCounter !== undefined ? [existingDescribedBy, characterCounterId].filter(Boolean).join(' ') : existingDescribedBy;
175
161
  const textareaProps = {
176
162
  id,
177
163
  className: cssClass,
@@ -183,40 +169,26 @@ const Textarea = ({
183
169
  ...(validation && typeof validation.required !== 'undefined' ? {
184
170
  required: true
185
171
  } : {}),
186
- ...registered,
172
+ ...htmlNativeDomProps,
173
+ ...fieldRegistration,
187
174
  onBeforeInput: HandleBeforeInput,
188
- onChange: event => {
189
- HandleChange(event);
190
- registered?.onChange?.(event);
191
- },
192
- onBlur: event => {
193
- HandleOnBlur(event);
194
- registered?.onBlur?.(event);
195
- },
175
+ onChange: HandleChange,
176
+ onBlur: HandleOnBlur,
196
177
  onKeyDown: HandleKeyEvent,
197
- ...htmlNativeDomProps,
198
- 'aria-describedby': mergedDescribedBy
178
+ onAnimationStart: HandleAutoFill
199
179
  };
200
- return /*#__PURE__*/_react.default.createElement(_HookFormWrapper.HookFormWrapper, null, customContent?.preField && /*#__PURE__*/_react.default.createElement("span", {
180
+ const containerCssClass = `textareaFieldContainer${showsCharacterCount ? ' withCharacterCount' : ''}`;
181
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, customContent?.preField && /*#__PURE__*/_react.default.createElement("span", {
201
182
  className: "preField"
202
- }, customContent?.preField), /*#__PURE__*/_react.default.createElement("div", {
203
- className: "textareaFieldContainer"
204
- }, /*#__PURE__*/_react.default.createElement("textarea", textareaProps), /*#__PURE__*/_react.default.createElement("div", {
205
- className: "textareaFooter"
206
- }, isInvalid && isRequiredError ? /*#__PURE__*/_react.default.createElement(_ValidationMessages.ValidationMessages, {
207
- name: name,
208
- validation: {
209
- required: validation?.required
210
- }
211
- }) : /*#__PURE__*/_react.default.createElement("div", {
212
- id: characterCounterId,
183
+ }, customContent?.preField), /*#__PURE__*/_react.default.createElement("span", {
184
+ className: containerCssClass
185
+ }, /*#__PURE__*/_react.default.createElement("textarea", textareaProps), showsCharacterCount && /*#__PURE__*/_react.default.createElement("span", {
213
186
  className: `textareaCharacterCount ${isAtLimit ? 'textareaCharacterCountExceeded' : ''}`,
214
187
  role: isAtLimit ? 'status' : undefined,
215
188
  "aria-live": isAtLimit ? 'polite' : undefined,
216
189
  "aria-atomic": isAtLimit ? 'true' : undefined
217
- }, characterCounter))), customContent?.postField && /*#__PURE__*/_react.default.createElement("span", {
190
+ }, `${count}/${maxLength}`)), customContent?.postField && /*#__PURE__*/_react.default.createElement("span", {
218
191
  className: "postField"
219
192
  }, customContent?.postField));
220
193
  };
221
- exports.Textarea = Textarea;
222
194
  //# sourceMappingURL=Textarea.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea.js","names":["Object","defineProperty","exports","value","Textarea","_react","_interopRequireWildcard","require","_reactHookForm","_HookFormWrapper","_formUtilities","_ValidationMessages","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","getOwnPropertyDescriptor","getCharacterCount","Intl","segmenter","Segmenter","undefined","granularity","Array","from","segment","length","clampToGraphemeMax","maxAllowed","slice","map","join","field","id","name","placeholder","defaultValue","maxLength","enforceMaxLength","onBlur","onChange","onKeyDown","onTouched","htmlNativeDomProps","validation","showSpinner","customCssClasses","customContent","register","getFieldState","formState","errors","useFormContext","NoHookFormContext","fieldState","hasFieldError","Boolean","extractError","isInvalid","invalid","count","setCount","useState","toString","hasStartedTyping","setHasStartedTyping","hasMaxLength","isAtLimit","isRequiredError","error","type","characterCounter","cssClass","input","normalizedValidation","useMemo","maxLengthRule","maxLengthValue","Number","isNaN","maxLengthMessage","graphemeMaxLengthValidator","_maxLength","validate","restValidation","formValues","validationResult","graphemeMaxLength","registered","HandleBeforeInput","event","nativeEvent","inserted","data","target","currentTarget","start","selectionStart","end","selectionEnd","nextValue","preventDefault","HandleChange","rawValue","newValue","onTextareaChange","HandleOnBlur","HandleKeyEvent","onTextareaKeyDown","characterCounterId","errorsId","existingDescribedBy","showsRequiredError","mergedDescribedBy","filter","textareaProps","className","disabled","required","onBeforeInput","createElement","HookFormWrapper","preField","ValidationMessages","role","postField"],"sources":["../../../../../../../src/components/form/formFields/subComponents/textarea/Textarea.tsx"],"sourcesContent":["'use client';\n\nimport React, { useMemo, useState } from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport { HookFormWrapper } from '../../../hookFormWrapper/HookFormWrapper';\nimport { FormFieldProps } from '../../formFieldWrapper/formFieldProps';\nimport { NoHookFormContext } from '../../utilities/formUtilities';\nimport { extractError, ValidationMessages } from '../../../validation/ValidationMessages';\n\ninterface TextareaProps extends FormFieldProps, React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\n/**\n* Counts user-perceived characters (grapheme clusters).\n* Treats emojis and composed characters (e.g. accented letters) as a single character.\n* Falls back to basic code-point counting if Intl.Segmenter is not available.\n*/\nfunction getCharacterCount(value: string): number {\n if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {\n const segmenter = new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n return Array.from(segmenter.segment(value)).length;\n }\n return Array.from(value).length;\n}\n\nfunction clampToGraphemeMax(value: string, maxAllowed: number): string {\n if (getCharacterCount(value) <= maxAllowed) {\n return value;\n }\n\n if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {\n const segmenter = new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n\n return Array.from(segmenter.segment(value))\n .slice(0, maxAllowed)\n .map((segment) => segment.segment)\n .join('');\n }\n\n return Array.from(value).slice(0, maxAllowed).join('');\n}\n\nexport const Textarea: React.FC<TextareaProps> = (\n {\n field: {\n id,\n name,\n placeholder,\n defaultValue,\n maxLength,\n enforceMaxLength,\n onBlur = () => {},\n onChange = () => {},\n onKeyDown = () => {},\n onTouched = () => {},\n ...htmlNativeDomProps\n },\n validation,\n showSpinner,\n customCssClasses,\n customContent\n }\n) => {\n const { register, getFieldState, formState: { errors } } = useFormContext() || NoHookFormContext;\n const fieldState = getFieldState(name);\n const hasFieldError = Boolean(extractError(errors, name));\n // Combine fieldState.invalid with a direct errors lookup so this component re-renders\n // whenever formState.errors changes (getFieldState alone does not subscribe to errors).\n const isInvalid = Boolean(fieldState?.invalid ?? hasFieldError);\n const [count, setCount] = useState<number>(() =>\n getCharacterCount(defaultValue?.toString() || '')\n );\n const [hasStartedTyping, setHasStartedTyping] = useState(false);\n const hasMaxLength = typeof maxLength === 'number';\n const isAtLimit = hasMaxLength ? count >= maxLength : false;\n // Only hide counter for 'required' error. All other errors (maxLength, pattern, etc)\n // should show counter instead of error message.\n const isRequiredError = fieldState?.error?.type === 'required';\n const characterCounter =\n !hasStartedTyping || !hasMaxLength || isRequiredError\n ? undefined\n : `${ count }/${ maxLength }`;\n const cssClass = `${ customCssClasses?.input || '' }${ isInvalid ? ' invalidField' : '' }`;\n\n const normalizedValidation = useMemo(() => {\n if (!validation || typeof validation.maxLength === 'undefined') {\n return validation;\n }\n\n const maxLengthRule = validation.maxLength;\n const maxLengthValue =\n typeof maxLengthRule === 'number'\n ? maxLengthRule\n : typeof maxLengthRule === 'object' && maxLengthRule && 'value' in maxLengthRule\n ? Number(maxLengthRule.value)\n : undefined;\n\n if (typeof maxLengthValue !== 'number' || Number.isNaN(maxLengthValue)) {\n return validation;\n }\n\n const maxLengthMessage = `Maximum length is ${ maxLengthValue }`;\n\n const graphemeMaxLengthValidator = (value: string) =>\n getCharacterCount(value || '') <= maxLengthValue || maxLengthMessage;\n\n // eslint-disable-next-line no-unused-vars\n const { maxLength: _maxLength, validate, ...restValidation } = validation;\n\n if (typeof validate === 'function') {\n return {\n ...restValidation,\n validate: async (value: string, formValues?: unknown) => {\n const validationResult = await validate(value, formValues);\n if (validationResult !== true) {\n return validationResult;\n }\n return graphemeMaxLengthValidator(value);\n },\n };\n }\n\n if (validate && typeof validate === 'object') {\n return {\n ...restValidation,\n validate: {\n ...validate,\n graphemeMaxLength: graphemeMaxLengthValidator,\n },\n };\n }\n\n return {\n ...restValidation,\n validate: graphemeMaxLengthValidator,\n };\n }, [validation]);\n\n const registered = register(name, normalizedValidation);\n\n /**\n * Prevents input that would exceed the maxLength when counting grapheme clusters.\n * Native <textarea maxLength> counts UTF-16 units, so emojis and composed characters\n * can be treated as multiple characters. We avoid using native maxLength and enforce\n * the limit here instead.\n */\n const HandleBeforeInput = (event: React.FormEvent<HTMLTextAreaElement>) => {\n if (enforceMaxLength !== true || !hasMaxLength) return;\n\n const nativeEvent = event.nativeEvent as InputEvent;\n const inserted = nativeEvent.data ?? '';\n\n if (!inserted) return;\n\n const target = event.currentTarget;\n const start = target.selectionStart ?? target.value.length;\n const end = target.selectionEnd ?? target.value.length;\n\n const nextValue =\n target.value.slice(0, start) +\n inserted +\n target.value.slice(end);\n\n if (getCharacterCount(nextValue) > maxLength) {\n event.preventDefault();\n }\n };\n\n const HandleChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n const rawValue = event.target.value || '';\n const newValue =\n enforceMaxLength === true && hasMaxLength\n ? clampToGraphemeMax(rawValue, maxLength)\n : rawValue;\n\n if (newValue !== rawValue) {\n event.target.value = newValue;\n }\n\n setHasStartedTyping(true);\n setCount(getCharacterCount(newValue));\n const onTextareaChange = onChange as\n | React.ChangeEventHandler<HTMLTextAreaElement>\n | undefined;\n onTextareaChange?.(event);\n };\n\n const HandleOnBlur = (event: React.FocusEvent<HTMLTextAreaElement>) => {\n const { target } = event;\n if (target) {\n onTouched();\n onBlur(event);\n }\n };\n\n const HandleKeyEvent = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n onTouched();\n const onTextareaKeyDown = onKeyDown as\n | React.KeyboardEventHandler<HTMLTextAreaElement>\n | undefined;\n onTextareaKeyDown?.(event);\n };\n\n const characterCounterId = `${ id }_characterCount`;\n const errorsId = `${ name }_errors`;\n const existingDescribedBy =\n typeof htmlNativeDomProps['aria-describedby'] === 'string'\n ? htmlNativeDomProps['aria-describedby']\n : undefined;\n const showsRequiredError = isInvalid && isRequiredError;\n const mergedDescribedBy = showsRequiredError\n ? [existingDescribedBy, errorsId].filter(Boolean).join(' ')\n : characterCounter !== undefined\n ? [existingDescribedBy, characterCounterId].filter(Boolean).join(' ')\n : existingDescribedBy;\n \n const textareaProps = {\n id,\n className: cssClass,\n placeholder,\n defaultValue,\n ...(showSpinner ? { disabled: true } : {}),\n ...(validation && typeof validation.required !== 'undefined' ? { required: true } : {}),\n ...registered,\n onBeforeInput: HandleBeforeInput,\n onChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n HandleChange(event);\n registered?.onChange?.(event);\n },\n onBlur: (event: React.FocusEvent<HTMLTextAreaElement>) => {\n HandleOnBlur(event);\n registered?.onBlur?.(event);\n },\n onKeyDown: HandleKeyEvent,\n ...htmlNativeDomProps,\n 'aria-describedby': mergedDescribedBy,\n };\n\n return (\n <HookFormWrapper>\n { customContent?.preField && <span className=\"preField\">{ customContent?.preField }</span> }\n\n <div className=\"textareaFieldContainer\">\n <textarea { ...textareaProps } /> \n\n <div className=\"textareaFooter\">\n { isInvalid && isRequiredError\n ? <ValidationMessages name={ name } validation={ { required: validation?.required } } />\n : (\n <div\n id={ characterCounterId }\n className={ `textareaCharacterCount ${\n isAtLimit\n ? 'textareaCharacterCountExceeded'\n : ''\n }` }\n role={ isAtLimit ? 'status' : undefined }\n aria-live={ isAtLimit ? 'polite' : undefined }\n aria-atomic={ isAtLimit ? 'true' : undefined }\n >\n { characterCounter }\n </div>\n )\n }\n </div>\n </div>\n\n { customContent?.postField && <span className=\"postField\">{ customContent?.postField }</span> }\n </HookFormWrapper>\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Textarea.js","names":["Object","defineProperty","exports","value","Textarea","_react","_interopRequireWildcard","require","_reactHookForm","_HookFormWrapper","_ValidationMessages","_stringHelpers","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","getOwnPropertyDescriptor","props","createElement","HookFormWrapper","formContext","TextareaField","field","id","name","placeholder","defaultValue","maxLength","enforceMaxLength","onBlur","onChange","onKeyDown","onTouched","htmlNativeDomProps","validation","showSpinner","customCssClasses","customContent","register","getFieldState","formState","errors","useFormContext","fieldState","isInvalid","Boolean","invalid","extractError","isRequiredError","error","type","count","setCount","useState","getCharacterCount","toString","hasStartedTyping","setHasStartedTyping","hasMaxLength","isAtLimit","showsCharacterCount","cssClass","input","normalizedValidation","useMemo","maxLengthRule","maxLengthValue","Number","undefined","isNaN","maxLengthMessage","graphemeMaxLengthValidator","_maxLength","validate","restValidation","formValues","validationResult","graphemeMaxLength","fieldRegistration","HandleBeforeInput","event","nativeEvent","inserted","data","target","currentTarget","start","selectionStart","length","end","selectionEnd","nextValue","slice","preventDefault","HandleChange","rawValue","newValue","clampToGraphemeMax","HandleAutoFill","animationName","HandleOnBlur","HandleKeyEvent","textareaProps","className","disabled","required","onBeforeInput","onAnimationStart","containerCssClass","Fragment","preField","role","postField"],"sources":["../../../../../../../src/components/form/formFields/subComponents/textarea/Textarea.tsx"],"sourcesContent":["'use client';\n\nimport React, { useMemo, useState } from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport { HookFormWrapper } from '../../../hookFormWrapper/HookFormWrapper';\nimport {\n FormFieldProps,\n TextareaFieldProps,\n} from '../../formFieldWrapper/formFieldProps';\nimport { extractError } from '../../../validation/ValidationMessages';\nimport { clampToGraphemeMax, getCharacterCount } from '../../../../../helpers/stringHelpers';\n\nimport './textarea.scss';\n\nexport interface TextareaProps extends Omit<FormFieldProps, 'field'> {\n field: Omit<TextareaFieldProps, 'type'>;\n}\n\nexport const Textarea: React.FC<TextareaProps> = (props) => (\n <HookFormWrapper formContext={ props.formContext }>\n <TextareaField { ...props } />\n </HookFormWrapper>\n);\n\nconst TextareaField: React.FC<TextareaProps> = (\n {\n field: {\n id,\n name,\n placeholder,\n defaultValue,\n maxLength,\n enforceMaxLength,\n onBlur = () => {},\n onChange = () => {},\n onKeyDown = () => {},\n onTouched = () => {},\n ...htmlNativeDomProps\n },\n validation,\n showSpinner,\n customCssClasses,\n customContent\n }\n) => {\n const { register, getFieldState, formState: { errors } } = useFormContext();\n const fieldState = getFieldState(name);\n // getFieldState alone does not subscribe to errors, so the direct lookup keeps this in sync.\n const isInvalid = Boolean(fieldState?.invalid || extractError(errors, name));\n const isRequiredError = fieldState?.error?.type === 'required';\n\n const [count, setCount] = useState<number>(() => getCharacterCount(defaultValue?.toString() || ''));\n const [hasStartedTyping, setHasStartedTyping] = useState(false);\n\n const hasMaxLength = typeof maxLength === 'number';\n const isAtLimit = hasMaxLength ? count >= maxLength : false;\n const showsCharacterCount = hasStartedTyping && hasMaxLength && !isRequiredError;\n\n const cssClass = `${ customCssClasses?.input || '' }${ isInvalid ? ' invalidField' : '' }`;\n\n const normalizedValidation = useMemo(() => {\n if (!validation || typeof validation.maxLength === 'undefined') {\n return validation;\n }\n\n const maxLengthRule = validation.maxLength;\n const maxLengthValue =\n typeof maxLengthRule === 'number'\n ? maxLengthRule\n : typeof maxLengthRule === 'object' && maxLengthRule && 'value' in maxLengthRule\n ? Number(maxLengthRule.value)\n : undefined;\n\n if (typeof maxLengthValue !== 'number' || Number.isNaN(maxLengthValue)) {\n return validation;\n }\n\n const maxLengthMessage = `Maximum length is ${ maxLengthValue }`;\n\n const graphemeMaxLengthValidator = (value: string) =>\n getCharacterCount(value || '') <= maxLengthValue || maxLengthMessage;\n\n // eslint-disable-next-line no-unused-vars\n const { maxLength: _maxLength, validate, ...restValidation } = validation;\n\n if (typeof validate === 'function') {\n return {\n ...restValidation,\n validate: async (value: string, formValues?: unknown) => {\n const validationResult = await validate(value, formValues);\n\n if (validationResult !== true) {\n return validationResult;\n }\n\n return graphemeMaxLengthValidator(value);\n },\n };\n }\n\n if (validate && typeof validate === 'object') {\n return {\n ...restValidation,\n validate: {\n ...validate,\n graphemeMaxLength: graphemeMaxLengthValidator,\n },\n };\n }\n\n return {\n ...restValidation,\n validate: graphemeMaxLengthValidator,\n };\n }, [validation]);\n\n const fieldRegistration = register(name, normalizedValidation);\n\n /**\n * Native maxLength counts UTF-16 units, so emojis and composed characters are treated as\n * several characters. The limit is enforced here against grapheme clusters instead.\n */\n const HandleBeforeInput = (event: React.FormEvent<HTMLTextAreaElement>) => {\n if (enforceMaxLength !== true || !hasMaxLength) {\n return;\n }\n\n const nativeEvent = event.nativeEvent as InputEvent;\n const inserted = nativeEvent.data ?? '';\n\n if (!inserted) {\n return;\n }\n\n const target = event.currentTarget;\n const start = target.selectionStart ?? target.value.length;\n const end = target.selectionEnd ?? target.value.length;\n const nextValue = target.value.slice(0, start) + inserted + target.value.slice(end);\n\n if (getCharacterCount(nextValue) > maxLength) {\n event.preventDefault();\n }\n };\n\n const HandleChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n const rawValue = event.target.value || '';\n const newValue = enforceMaxLength === true && hasMaxLength\n ? clampToGraphemeMax(rawValue, maxLength)\n : rawValue;\n\n if (newValue !== rawValue) {\n event.target.value = newValue;\n }\n\n setHasStartedTyping(true);\n setCount(getCharacterCount(newValue));\n\n (onChange as React.ChangeEventHandler<HTMLTextAreaElement>)(event);\n fieldRegistration?.onChange?.(event);\n };\n\n const HandleAutoFill = (event: React.AnimationEvent<HTMLTextAreaElement>) => {\n // Browsers trigger onAnimationStart when autofill happens.\n // We need to notify react-hook-form of the new value.\n if (event.animationName === 'onAutoFill') {\n const { value } = event.currentTarget;\n setHasStartedTyping(true);\n setCount(getCharacterCount(value || ''));\n HandleChange({ target: event.currentTarget } as unknown as React.ChangeEvent<HTMLTextAreaElement>);\n }\n };\n\n const HandleOnBlur = (event: React.FocusEvent<HTMLTextAreaElement>) => {\n const { target } = event;\n\n if (target) {\n onTouched();\n (onBlur as React.FocusEventHandler<HTMLTextAreaElement>)(event);\n }\n\n fieldRegistration?.onBlur?.(event);\n };\n\n const HandleKeyEvent = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n onTouched();\n (onKeyDown as React.KeyboardEventHandler<HTMLTextAreaElement>)(event);\n };\n\n const textareaProps = {\n id,\n className: cssClass,\n placeholder,\n defaultValue,\n ...(showSpinner ? { disabled: true } : {}),\n ...(validation && typeof validation.required !== 'undefined' ? { required: true } : {}),\n ...htmlNativeDomProps,\n ...fieldRegistration,\n onBeforeInput: HandleBeforeInput,\n onChange: HandleChange,\n onBlur: HandleOnBlur,\n onKeyDown: HandleKeyEvent,\n onAnimationStart: HandleAutoFill,\n };\n\n const containerCssClass = `textareaFieldContainer${ showsCharacterCount ? ' withCharacterCount' : '' }`;\n\n return (\n <>\n { customContent?.preField && <span className=\"preField\">{ customContent?.preField }</span> }\n\n <span className={ containerCssClass }>\n <textarea { ...textareaProps } />\n\n {\n showsCharacterCount && (\n <span\n className={ `textareaCharacterCount ${ isAtLimit ? 'textareaCharacterCountExceeded' : '' }` }\n role={ isAtLimit ? 'status' : undefined }\n aria-live={ isAtLimit ? 'polite' : undefined }\n aria-atomic={ isAtLimit ? 'true' : undefined }\n >\n { `${ count }/${ maxLength }` }\n </span>\n )\n }\n </span>\n\n { customContent?.postField && <span className=\"postField\">{ customContent?.postField }</span> }\n </>\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,20 @@
1
+ .textareaFieldContainer {
2
+ position: relative;
3
+ width: 100%;
4
+ }
5
+ .textareaFieldContainer.withCharacterCount textarea {
6
+ padding-bottom: 26px;
7
+ }
8
+
9
+ .textareaCharacterCount {
10
+ line-height: 15px;
11
+ font-size: 13px;
12
+ color: var(--inputLabelColor);
13
+ position: absolute;
14
+ right: 10px;
15
+ bottom: 10px;
16
+ pointer-events: none;
17
+ }
18
+ .textareaCharacterCount.textareaCharacterCountExceeded {
19
+ color: var(--inputErrorColor);
20
+ }
@@ -12,21 +12,38 @@ var _reactHookForm = require("react-hook-form");
12
12
  const HookFormWrapper = ({
13
13
  formCssClass = 'x15StandardForm',
14
14
  children,
15
- formProps
15
+ formProps,
16
+ formContext,
17
+ onSubmit
16
18
  }) => {
17
- const existingHookFormContext = (0, _reactHookForm.useFormContext)();
19
+ const inheritedHookFormContext = (0, _reactHookForm.useFormContext)();
18
20
  const hookFormMethods = (0, _reactHookForm.useForm)({
19
21
  mode: 'all',
20
22
  criteriaMode: 'all',
21
23
  shouldFocusError: true
22
24
  });
23
- if (existingHookFormContext) {
24
- return children;
25
+
26
+ // A manually supplied context re-publishes the form state across a boundary the
27
+ // React context could not cross (e.g. a Next.js server/client component split).
28
+ if (formContext) {
29
+ return /*#__PURE__*/_react.default.createElement(_reactHookForm.FormProvider, formContext, children);
30
+ }
31
+ if (inheritedHookFormContext) {
32
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children);
25
33
  }
34
+ const {
35
+ onSubmit: nativeOnSubmit,
36
+ ...remainingFormProps
37
+ } = formProps || {};
38
+
39
+ // `onSubmit` receives the validated values, so consumers never need to call useForm themselves.
40
+ const handleFormSubmit = onSubmit ? hookFormMethods.handleSubmit(onSubmit) : nativeOnSubmit;
26
41
  return /*#__PURE__*/_react.default.createElement(_reactHookForm.FormProvider, hookFormMethods, /*#__PURE__*/_react.default.createElement("form", (0, _extends2.default)({
27
42
  className: formCssClass,
28
43
  autoComplete: "off"
29
- }, formProps), children));
44
+ }, remainingFormProps, {
45
+ onSubmit: handleFormSubmit
46
+ }), children));
30
47
  };
31
48
  exports.HookFormWrapper = HookFormWrapper;
32
49
  var _default = exports.default = HookFormWrapper;
@@ -1 +1 @@
1
- {"version":3,"file":"HookFormWrapper.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","default","HookFormWrapper","_extends2","_react","_reactHookForm","formCssClass","children","formProps","existingHookFormContext","useFormContext","hookFormMethods","useForm","mode","criteriaMode","shouldFocusError","createElement","FormProvider","className","autoComplete","_default"],"sources":["../../../../../src/components/form/hookFormWrapper/HookFormWrapper.tsx"],"sourcesContent":["'use client';\n\nimport React, { ReactNode, ReactElement, FormHTMLAttributes } from 'react';\nimport { FormProvider, useForm, useFormContext } from 'react-hook-form';\n\ninterface FormWrapperProps {\n formCssClass?: string;\n formProps?: FormHTMLAttributes<HTMLFormElement>;\n children: ReactNode | ReactElement;\n}\n\nexport const HookFormWrapper: React.FC<FormWrapperProps> = (\n {\n formCssClass = 'x15StandardForm',\n children,\n formProps\n }\n) => {\n const existingHookFormContext = useFormContext();\n\n const hookFormMethods = useForm({\n mode: 'all',\n criteriaMode: 'all',\n shouldFocusError: true\n });\n\n if (existingHookFormContext) {\n return children;\n }\n\n return (\n <FormProvider { ...hookFormMethods }>\n <form className={ formCssClass } autoComplete=\"off\" { ...formProps }>\n {\n children\n }\n </form>\n </FormProvider>\n );\n};\n\nexport default HookFormWrapper;\n"],"mappings":";AAAA,YAAY;;AAAC,IAAAA,sBAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,cAAA,CAAAC,OAAA;EAAAC,KAAA;AAAA;AAAAD,OAAA,CAAAE,OAAA,GAAAF,OAAA,CAAAG,eAAA;AAAA,IAAAC,SAAA,GAAAR,sBAAA,CAAAC,OAAA;AAEb,IAAAQ,MAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,cAAA,GAAAT,OAAA;AAQO,MAAMM,eAA2C,GAAGA,CACzD;EACEI,YAAY,GAAG,iBAAiB;EAChCC,QAAQ;EACRC;AACF,CAAC,KACE;EACH,MAAMC,uBAAuB,GAAG,IAAAC,6BAAc,EAAC,CAAC;EAEhD,MAAMC,eAAe,GAAG,IAAAC,sBAAO,EAAC;IAC9BC,IAAI,EAAE,KAAK;IACXC,YAAY,EAAE,KAAK;IACnBC,gBAAgB,EAAE;EACpB,CAAC,CAAC;EAEF,IAAIN,uBAAuB,EAAE;IAC3B,OAAOF,QAAQ;EACjB;EAEA,oBACEH,MAAA,CAAAH,OAAA,CAAAe,aAAA,CAACX,cAAA,CAAAY,YAAY,EAAMN,eAAe,eAChCP,MAAA,CAAAH,OAAA,CAAAe,aAAA,aAAAb,SAAA,CAAAF,OAAA;IAAMiB,SAAS,EAAGZ,YAAc;IAACa,YAAY,EAAC;EAAK,GAAMX,SAAS,GAE9DD,QAEE,CACM,CAAC;AAEnB,CAAC;AAACR,OAAA,CAAAG,eAAA,GAAAA,eAAA;AAAA,IAAAkB,QAAA,GAAArB,OAAA,CAAAE,OAAA,GAEaC,eAAe","ignoreList":[]}
1
+ {"version":3,"file":"HookFormWrapper.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","default","HookFormWrapper","_extends2","_react","_reactHookForm","formCssClass","children","formProps","formContext","onSubmit","inheritedHookFormContext","useFormContext","hookFormMethods","useForm","mode","criteriaMode","shouldFocusError","createElement","FormProvider","Fragment","nativeOnSubmit","remainingFormProps","handleFormSubmit","handleSubmit","className","autoComplete","_default"],"sources":["../../../../../src/components/form/hookFormWrapper/HookFormWrapper.tsx"],"sourcesContent":["'use client';\n\nimport React, { ReactNode, ReactElement, FormHTMLAttributes } from 'react';\nimport { FieldValues, FormProvider, useForm, useFormContext, UseFormReturn } from 'react-hook-form';\n\ninterface FormWrapperProps {\n formCssClass?: string;\n formProps?: FormHTMLAttributes<HTMLFormElement>;\n children: ReactNode | ReactElement;\n formContext?: UseFormReturn<FieldValues, any, FieldValues>\n /* eslint-disable-next-line no-unused-vars */\n onSubmit?: (values: FieldValues) => void | Promise<void>;\n}\n\nexport const HookFormWrapper: React.FC<FormWrapperProps> = (\n {\n formCssClass = 'x15StandardForm',\n children,\n formProps,\n formContext,\n onSubmit,\n }\n) => {\n const inheritedHookFormContext = useFormContext();\n\n const hookFormMethods = useForm({\n mode: 'all',\n criteriaMode: 'all',\n shouldFocusError: true\n });\n\n // A manually supplied context re-publishes the form state across a boundary the\n // React context could not cross (e.g. a Next.js server/client component split).\n if (formContext) {\n return (\n <FormProvider { ...formContext }>\n { children }\n </FormProvider>\n );\n }\n\n if (inheritedHookFormContext) {\n return <>{ children }</>;\n }\n\n const { onSubmit: nativeOnSubmit, ...remainingFormProps } = formProps || {};\n\n // `onSubmit` receives the validated values, so consumers never need to call useForm themselves.\n const handleFormSubmit = onSubmit\n ? hookFormMethods.handleSubmit(onSubmit)\n : nativeOnSubmit;\n\n return (\n <FormProvider { ...hookFormMethods }>\n <form\n className={ formCssClass }\n autoComplete=\"off\"\n { ...remainingFormProps }\n onSubmit={ handleFormSubmit }\n >\n {\n children\n }\n </form>\n </FormProvider>\n );\n};\n\nexport default HookFormWrapper;\n"],"mappings":";AAAA,YAAY;;AAAC,IAAAA,sBAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,cAAA,CAAAC,OAAA;EAAAC,KAAA;AAAA;AAAAD,OAAA,CAAAE,OAAA,GAAAF,OAAA,CAAAG,eAAA;AAAA,IAAAC,SAAA,GAAAR,sBAAA,CAAAC,OAAA;AAEb,IAAAQ,MAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,cAAA,GAAAT,OAAA;AAWO,MAAMM,eAA2C,GAAGA,CACzD;EACEI,YAAY,GAAG,iBAAiB;EAChCC,QAAQ;EACRC,SAAS;EACTC,WAAW;EACXC;AACF,CAAC,KACE;EACH,MAAMC,wBAAwB,GAAG,IAAAC,6BAAc,EAAC,CAAC;EAEjD,MAAMC,eAAe,GAAG,IAAAC,sBAAO,EAAC;IAC9BC,IAAI,EAAE,KAAK;IACXC,YAAY,EAAE,KAAK;IACnBC,gBAAgB,EAAE;EACpB,CAAC,CAAC;;EAEF;EACA;EACA,IAAIR,WAAW,EAAE;IACf,oBACEL,MAAA,CAAAH,OAAA,CAAAiB,aAAA,CAACb,cAAA,CAAAc,YAAY,EAAMV,WAAW,EAC1BF,QACU,CAAC;EAEnB;EAEA,IAAII,wBAAwB,EAAE;IAC5B,oBAAOP,MAAA,CAAAH,OAAA,CAAAiB,aAAA,CAAAd,MAAA,CAAAH,OAAA,CAAAmB,QAAA,QAAIb,QAAY,CAAC;EAC1B;EAEA,MAAM;IAAEG,QAAQ,EAAEW,cAAc;IAAE,GAAGC;EAAmB,CAAC,GAAGd,SAAS,IAAI,CAAC,CAAC;;EAE3E;EACA,MAAMe,gBAAgB,GAAGb,QAAQ,GAC7BG,eAAe,CAACW,YAAY,CAACd,QAAQ,CAAC,GACtCW,cAAc;EAElB,oBACEjB,MAAA,CAAAH,OAAA,CAAAiB,aAAA,CAACb,cAAA,CAAAc,YAAY,EAAMN,eAAe,eAChCT,MAAA,CAAAH,OAAA,CAAAiB,aAAA,aAAAf,SAAA,CAAAF,OAAA;IACEwB,SAAS,EAAGnB,YAAc;IAC1BoB,YAAY,EAAC;EAAK,GACbJ,kBAAkB;IACvBZ,QAAQ,EAAGa;EAAkB,IAG3BhB,QAEE,CACM,CAAC;AAEnB,CAAC;AAACR,OAAA,CAAAG,eAAA,GAAAA,eAAA;AAAA,IAAAyB,QAAA,GAAA5B,OAAA,CAAAE,OAAA,GAEaC,eAAe","ignoreList":[]}