srcdev-nuxt-forms 5.1.1 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/README.md +16 -0
  2. package/app/assets/styles/extends-layer/srcdev-forms/components/_form-fieldset.css +38 -0
  3. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-button.css +66 -0
  4. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-checkbox-radio-core.css +66 -0
  5. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-checkbox-radio-options-button.css +76 -0
  6. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-error.css +54 -0
  7. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-label.css +21 -0
  8. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-select.css +140 -0
  9. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-text.css +190 -0
  10. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-textarea.css +96 -0
  11. package/{assets → app/assets}/styles/extends-layer/srcdev-forms/components/index.css +3 -4
  12. package/app/assets/styles/extends-layer/srcdev-forms/setup/_generic.css +21 -0
  13. package/app/assets/styles/extends-layer/srcdev-forms/setup/index.css +4 -0
  14. package/{assets → app/assets}/styles/extends-layer/srcdev-forms/setup/themes/_error.css +12 -12
  15. package/{assets → app/assets}/styles/extends-layer/srcdev-forms/setup/themes/_ghost.css +12 -12
  16. package/{assets → app/assets}/styles/extends-layer/srcdev-forms/setup/themes/_input-action-underlined.css +7 -7
  17. package/{assets → app/assets}/styles/extends-layer/srcdev-forms/setup/themes/_input-action.css +7 -7
  18. package/{assets → app/assets}/styles/extends-layer/srcdev-forms/setup/themes/_primary.css +12 -12
  19. package/{assets → app/assets}/styles/extends-layer/srcdev-forms/setup/themes/_secondary.css +12 -12
  20. package/{assets → app/assets}/styles/extends-layer/srcdev-forms/setup/themes/_success.css +12 -12
  21. package/{assets → app/assets}/styles/extends-layer/srcdev-forms/setup/themes/_tertiary.css +12 -12
  22. package/{assets → app/assets}/styles/extends-layer/srcdev-forms/setup/themes/_warning.css +12 -12
  23. package/app/assets/styles/extends-layer/srcdev-forms/setup/variables/_a11y.css +7 -0
  24. package/app/assets/styles/extends-layer/srcdev-forms/setup/variables/index.css +1 -0
  25. package/app/assets/styles/extends-layer/srcdev-forms/setup/variants/_normal.css +48 -0
  26. package/{assets → app/assets}/styles/extends-layer/srcdev-forms/setup/variants/_underlined.css +10 -10
  27. package/app/assets/styles/extends-layer/srcdev-forms/setup/variants/index.css +3 -0
  28. package/app/assets/styles/extends-layer/srcdev-forms/setup/variants/sizes/_default.css +13 -0
  29. package/{assets/styles/extends-layer/srcdev-forms/setup → app/assets/styles/extends-layer/srcdev-forms/setup/variants}/sizes/index.css +2 -0
  30. package/app/assets/styles/setup/_head.css +36 -0
  31. package/app/assets/styles/setup/index.css +5 -0
  32. package/{assets/styles/setup/variables → app/assets/styles/setup/theming}/colors/_blue.css +1 -1
  33. package/{assets/styles/setup/variables → app/assets/styles/setup/theming}/index.css +1 -0
  34. package/app/assets/styles/setup/theming/themes/_default.css +66 -0
  35. package/app/assets/styles/setup/theming/themes/_error.css +66 -0
  36. package/app/assets/styles/setup/theming/themes/_ghost.css +31 -0
  37. package/app/assets/styles/setup/theming/themes/_info.css +31 -0
  38. package/app/assets/styles/setup/theming/themes/_primary.css +41 -0
  39. package/app/assets/styles/setup/theming/themes/_secondary.css +66 -0
  40. package/app/assets/styles/setup/theming/themes/_success.css +66 -0
  41. package/app/assets/styles/setup/theming/themes/_tertiary.css +31 -0
  42. package/app/assets/styles/setup/theming/themes/_warning.css +68 -0
  43. package/app/assets/styles/setup/theming/themes/index.css +9 -0
  44. package/app/assets/styles/setup/typography/index.css +2 -0
  45. package/app/assets/styles/setup/typography/utility-classes/_generic-font-classes.css +217 -0
  46. package/app/assets/styles/setup/typography/utility-classes/_generic-font-variation-settings.css +29 -0
  47. package/app/assets/styles/setup/typography/utility-classes/_generic-font-weights.css +39 -0
  48. package/app/assets/styles/setup/typography/vars/_colors.css +14 -0
  49. package/{assets → app/assets}/styles/setup/typography/vars/_reponsive-font-sizes.css +2 -0
  50. package/{assets → app/assets}/styles/setup/typography/vars/index.css +1 -0
  51. package/app/assets/styles/setup/utility-classes/_fluid-spacing.css +13 -0
  52. package/app/assets/styles/setup/utility-classes/animations/_auto-rotate.css +13 -0
  53. package/app/assets/styles/setup/utility-classes/animations/_entry-exit-blur.css +16 -0
  54. package/app/assets/styles/setup/utility-classes/animations/_entry-slide-in.css +15 -0
  55. package/app/assets/styles/setup/utility-classes/animations/_entry-zoom-reveal.css +15 -0
  56. package/app/assets/styles/setup/utility-classes/animations/index.css +4 -0
  57. package/app/assets/styles/setup/utility-classes/index.css +2 -0
  58. package/app/assets/styles/setup/variables/index.css +1 -0
  59. package/{components → app/components}/forms/c12/utils.ts +1 -1
  60. package/{components → app/components}/forms/form-errors/InputError.vue +32 -49
  61. package/{components → app/components}/forms/form-fieldset/FormFieldset.vue +9 -9
  62. package/{components → app/components}/forms/input-button/InputButtonCore.vue +20 -18
  63. package/{components → app/components}/forms/input-button/variants/InputButtonConfirm.vue +1 -1
  64. package/{components → app/components}/forms/input-checkbox/MultipleCheckboxes.vue +1 -1
  65. package/{components → app/components}/forms/input-checkbox/SingleCheckbox.vue +1 -1
  66. package/app/components/forms/input-checkbox-radio/InputCheckboxRadioButton.vue +204 -0
  67. package/{components → app/components}/forms/input-checkbox-radio/InputCheckboxRadioCore.vue +29 -17
  68. package/{components → app/components}/forms/input-checkbox-radio/InputCheckboxRadioWithLabel.vue +1 -0
  69. package/{components → app/components}/forms/input-label/InputLabel.vue +26 -7
  70. package/{components → app/components}/forms/input-number/InputNumberCore.vue +7 -6
  71. package/{components → app/components}/forms/input-number/variants/InputNumberDefault.vue +5 -6
  72. package/{components → app/components}/forms/input-radio/MultipleRadiobuttons.vue +1 -1
  73. package/{components → app/components}/forms/input-range/InputRangeCore.vue +1 -1
  74. package/{components → app/components}/forms/input-range/variants/InputRangeDefault.vue +5 -2
  75. package/{components → app/components}/forms/input-range-fancy/InputRangeFancyCore.vue +1 -1
  76. package/{components → app/components}/forms/input-range-fancy/InputRangeFancyWithLabel.vue +1 -1
  77. package/{components → app/components}/forms/input-select/InputSelectCore.vue +24 -22
  78. package/{components → app/components}/forms/input-select/variants/InputSelectWithLabel.vue +2 -2
  79. package/app/components/forms/input-text/InputTextCore.vue +341 -0
  80. package/{components → app/components}/forms/input-text/variants/InputPasswordWithLabel.vue +1 -1
  81. package/{components → app/components}/forms/input-text/variants/InputTextAsNumberWithLabel.vue +4 -2
  82. package/app/components/forms/input-text/variants/InputTextWithLabel.vue +158 -0
  83. package/{components → app/components}/forms/input-textarea/InputTextareaCore.vue +10 -131
  84. package/app/components/forms/input-textarea/variants/InputTextareaWithLabel.vue +125 -0
  85. package/{components → app/components}/forms/toggle-switch/ToggleSwitchCore.vue +1 -1
  86. package/{components → app/components}/forms/toggle-switch/ToggleSwitchCoreOld.vue +1 -1
  87. package/{components → app/components}/forms/toggle-switch/variants/ToggleSwitchWithLabel.vue +5 -2
  88. package/{components → app/components}/forms/toggle-switch/variants/ToggleSwitchWithLabelInline.vue +5 -2
  89. package/{components → app/components}/utils/colour-scheme-select/ColourSchemeSelect.vue +1 -1
  90. package/{components → app/components}/utils/colour-scheme-select/ColourSchemeSelectOld.vue +1 -1
  91. package/{composables → app/composables}/useErrorMessages.ts +2 -2
  92. package/{composables → app/composables}/useFormControl.ts +15 -9
  93. package/{composables → app/composables}/useZodValidation.ts +1 -1
  94. package/nuxt.config.ts +8 -2
  95. package/package.json +10 -11
  96. package/{types/types.zodFormControl.ts → shared/types/types.zodFormControl.d.ts} +1 -1
  97. package/assets/styles/extends-layer/srcdev-forms/components/_form-core.css +0 -8
  98. package/assets/styles/extends-layer/srcdev-forms/components/_form-fieldset.css +0 -16
  99. package/assets/styles/extends-layer/srcdev-forms/components/_input-checkbox-radio-options-button.css +0 -59
  100. package/assets/styles/extends-layer/srcdev-forms/components/_input-checkbox.css +0 -72
  101. package/assets/styles/extends-layer/srcdev-forms/components/_input-error.css +0 -55
  102. package/assets/styles/extends-layer/srcdev-forms/components/_input-label.css +0 -18
  103. package/assets/styles/extends-layer/srcdev-forms/components/_input-radio.css +0 -68
  104. package/assets/styles/extends-layer/srcdev-forms/components/_input-select.css +0 -18
  105. package/assets/styles/extends-layer/srcdev-forms/components/_input-text-as-number.css +0 -22
  106. package/assets/styles/extends-layer/srcdev-forms/components/_input-textarea.css +0 -5
  107. package/assets/styles/extends-layer/srcdev-forms/setup/_generic.css +0 -7
  108. package/assets/styles/extends-layer/srcdev-forms/setup/index.css +0 -4
  109. package/assets/styles/extends-layer/srcdev-forms/setup/sizes/_default.css +0 -12
  110. package/assets/styles/extends-layer/srcdev-forms/setup/variants/_normal.css +0 -48
  111. package/assets/styles/extends-layer/srcdev-forms/setup/variants/index.css +0 -2
  112. package/assets/styles/setup/_head.css +0 -5
  113. package/assets/styles/setup/index.css +0 -5
  114. package/assets/styles/setup/typography/index.css +0 -2
  115. package/assets/styles/setup/typography/utility-classes/_generic-font-classes.css +0 -192
  116. package/assets/styles/setup/typography/utility-classes/_generic-font-variation-settings.css +0 -29
  117. package/assets/styles/setup/typography/utility-classes/_generic-font-weights.css +0 -41
  118. package/assets/styles/setup/utility-classes/_margin-helpers.css +0 -334
  119. package/assets/styles/setup/utility-classes/_padding-helpers.css +0 -308
  120. package/assets/styles/setup/utility-classes/_page.css +0 -49
  121. package/assets/styles/setup/utility-classes/index.css +0 -3
  122. package/components/forms/input-checkbox-radio/InputCheckboxRadioButton.vue +0 -218
  123. package/components/forms/input-text/InputTextCore.vue +0 -390
  124. package/components/forms/input-text/variants/InputTextWithLabel.vue +0 -300
  125. package/components/forms/input-textarea/variants/InputTextareaWithLabel.vue +0 -269
  126. package/{assets → app/assets}/styles/extends-layer/srcdev-forms/index.css +0 -0
  127. package/{assets → app/assets}/styles/extends-layer/srcdev-forms/setup/themes/index.css +0 -0
  128. package/{assets/styles/extends-layer/srcdev-forms/setup → app/assets/styles/extends-layer/srcdev-forms/setup/variants}/sizes/_large.css +0 -0
  129. package/{assets/styles/extends-layer/srcdev-forms/setup → app/assets/styles/extends-layer/srcdev-forms/setup/variants}/sizes/_medium.css +0 -0
  130. package/{assets/styles/extends-layer/srcdev-forms/setup → app/assets/styles/extends-layer/srcdev-forms/setup/variants}/sizes/_small.css +0 -0
  131. package/{assets/styles/extends-layer/srcdev-forms/setup → app/assets/styles/extends-layer/srcdev-forms/setup/variants}/sizes/_x-small.css +0 -0
  132. package/{assets → app/assets}/styles/main.css +0 -0
  133. package/{assets → app/assets}/styles/setup/a11y/_utils.css +0 -0
  134. package/{assets → app/assets}/styles/setup/a11y/_variables.css +0 -0
  135. package/{assets → app/assets}/styles/setup/a11y/index.css +0 -0
  136. package/{assets/styles/setup/variables → app/assets/styles/setup/theming}/colors/_gray.css +0 -0
  137. package/{assets/styles/setup/variables → app/assets/styles/setup/theming}/colors/_green.css +0 -0
  138. package/{assets/styles/setup/variables → app/assets/styles/setup/theming}/colors/_orange.css +0 -0
  139. package/{assets/styles/setup/variables → app/assets/styles/setup/theming}/colors/_red.css +0 -0
  140. package/{assets/styles/setup/variables → app/assets/styles/setup/theming}/colors/_yellow.css +0 -0
  141. package/{assets/styles/setup/variables → app/assets/styles/setup/theming}/colors/index.css +3 -3
  142. package/{assets → app/assets}/styles/setup/typography/utility-classes/index.css +1 -1
  143. /package/{components → app/components}/forms/c12/prop-validators/index.ts +0 -0
  144. /package/{components → app/components}/forms/form-errors/tests/InputError.spec.ts +0 -0
  145. /package/{components → app/components}/forms/input-button/variants/InputButtonSubmit.vue +0 -0
  146. /package/{components → app/components}/forms/input-checkbox/tests/MultipleCheckboxes.spec.ts +0 -0
  147. /package/{components → app/components}/forms/input-checkbox/tests/data/tags.json +0 -0
  148. /package/{components → app/components}/forms/input-radio/tests/MultipleRadioButtons.spec.ts +0 -0
  149. /package/{components → app/components}/forms/input-radio/tests/data/tags.json +0 -0
  150. /package/{components → app/components}/forms/ui/FormField.vue +0 -0
  151. /package/{components → app/components}/forms/ui/FormWrapper.vue +0 -0
  152. /package/{components → app/components}/utils/dark-mode-switcher/DarkModeSwitcher.vue +0 -0
  153. /package/{composables → app/composables}/useApiRequest.ts +0 -0
  154. /package/{composables → app/composables}/useColourScheme.ts +0 -0
  155. /package/{composables → app/composables}/useSleep.ts +0 -0
  156. /package/{composables → app/composables}/useStyleClassPassthrough.ts +0 -0
  157. /package/{types/types.forms.ts → shared/types/types.forms.d.ts} +0 -0
@@ -0,0 +1,125 @@
1
+ <template>
2
+ <div class="input-textarea-with-label" :data-theme="formTheme" :class="[elementClasses, inputVariant, { dirty: isDirty }, { active: isActive }]">
3
+ <InputLabel :for="id" :id :theme :name :input-variant :field-has-error :style-class-passthrough="['input-textarea-label']">
4
+ <template #textLabel>{{ label }}</template>
5
+ </InputLabel>
6
+
7
+ <InputTextareaCore
8
+ v-model="modelValue"
9
+ v-model:isDirty="isDirty"
10
+ v-model:isActive="isActive"
11
+ :maxlength
12
+ :id
13
+ :name
14
+ :placeholder
15
+ :label
16
+ :fieldHasError
17
+ :required
18
+ :styleClassPassthrough
19
+ :theme
20
+ :size
21
+ :inputVariant
22
+ >
23
+ <template v-if="hasLeftSlot" #left>
24
+ <slot name="left"></slot>
25
+ </template>
26
+ <template v-if="hasRightSlot" #right>
27
+ <slot name="right"></slot>
28
+ </template>
29
+ </InputTextareaCore>
30
+ <InputError :errorMessage :showError="fieldHasError" :id :isDetached="false" :inputVariant />
31
+ </div>
32
+ </template>
33
+
34
+ <script setup lang="ts">
35
+ import propValidators from '../../c12/prop-validators';
36
+ const props = defineProps({
37
+ maxlength: {
38
+ type: Number,
39
+ default: 255,
40
+ },
41
+ name: {
42
+ type: String,
43
+ required: true,
44
+ },
45
+ placeholder: {
46
+ type: String,
47
+ default: '',
48
+ },
49
+ label: {
50
+ type: String,
51
+ required: true,
52
+ },
53
+ errorMessage: {
54
+ type: [Object, String],
55
+ required: true,
56
+ },
57
+ fieldHasError: {
58
+ type: Boolean,
59
+ default: false,
60
+ },
61
+ required: {
62
+ type: Boolean,
63
+ default: false,
64
+ },
65
+ styleClassPassthrough: {
66
+ type: Array as PropType<string[]>,
67
+ default: () => [],
68
+ },
69
+ theme: {
70
+ type: String as PropType<string>,
71
+ default: 'primary',
72
+ validator(value: string) {
73
+ return propValidators.theme.includes(value);
74
+ },
75
+ },
76
+ size: {
77
+ type: String as PropType<string>,
78
+ default: 'default',
79
+ validator(value: string) {
80
+ return propValidators.size.includes(value);
81
+ },
82
+ },
83
+ inputVariant: {
84
+ type: String as PropType<string>,
85
+ default: 'normal',
86
+ validator(value: string) {
87
+ return propValidators.inputVariant.includes(value);
88
+ },
89
+ },
90
+ });
91
+
92
+ const slots = useSlots();
93
+ const hasLeftSlot = computed(() => slots.left !== undefined);
94
+ const hasRightSlot = computed(() => slots.right !== undefined);
95
+
96
+ const id = useId();
97
+ const formTheme = computed(() => {
98
+ return props.fieldHasError ? 'error' : props.theme;
99
+ });
100
+
101
+ const modelValue = defineModel<string | number | readonly string[] | null | undefined>();
102
+ const isActive = ref<boolean>(false);
103
+ const isDirty = ref<boolean>(false);
104
+
105
+ const { elementClasses, updateElementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
106
+
107
+ const testDirty = () => {
108
+ const watchValue = modelValue.value ?? '';
109
+
110
+ if (!isDirty.value && typeof watchValue === 'string' && watchValue.length > 0) {
111
+ isDirty.value = true;
112
+ }
113
+ };
114
+
115
+ onMounted(() => {
116
+ testDirty();
117
+ });
118
+
119
+ watch(
120
+ () => modelValue.value,
121
+ () => {
122
+ testDirty();
123
+ }
124
+ );
125
+ </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="toggle-switch-core" :class="elementClasses" :data-size="size" :data-form-theme="formTheme">
2
+ <div class="toggle-switch-core" :class="elementClasses" :data-size="size" :data-theme="formTheme">
3
3
  <div @click="toggleSwitchValue" class="toggle-switch-wrapper" :class="[{ round }, { 'use-default-icons': useDefaultIcons }]" :for="inputId">
4
4
  <input type="checkbox" v-model="modelValue" :true-value :false-value :aria-invalid="fieldHasError" :id="inputId" :aria-describedby="`${id}-description`" :name :required :checked="isChecked" />
5
5
  <div class="symbol-wrapper" :class="[{ round }]">
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="toggle-switch-core" :class="elementClasses" :data-size="size" :data-form-theme="formTheme">
2
+ <div class="toggle-switch-core" :class="elementClasses" :data-size="size" :data-theme="formTheme">
3
3
  <div @click="toggleSwitchValue" class="toggle-switch-input" :class="[{ round }]" :for="inputId">
4
4
  <input type="checkbox" v-model="modelValue" :true-value :false-value :aria-invalid="fieldHasError" :id="inputId" :aria-describedby="`${id}-description`" :name :required />
5
5
  <div class="symbol-wrapper" :class="[{ round }]">
@@ -1,6 +1,9 @@
1
1
  <template>
2
- <div class="toggle-switch-with-label" :class="[elementClasses]" :data-form-theme="formTheme">
3
- <label class="toggle-switch-label input-text-label body-normal-bold" :for="`toggle-sitch-${id}`">{{ label }}</label>
2
+ <div class="toggle-switch-with-label" :class="[elementClasses]" :data-theme="formTheme">
3
+ <InputLabel :for="`toggle-sitch-${id}`" :id :theme :name input-variant="normal" :field-has-error :style-class-passthrough="['input-switch-label', 'input-text-label', 'body-normal-bold']">
4
+ <template #textLabel>{{ label }}</template>
5
+ </InputLabel>
6
+
4
7
  <div v-if="hasDescriptionSlot" :id="`${id}-description`">
5
8
  <slot name="description"></slot>
6
9
  </div>
@@ -1,6 +1,9 @@
1
1
  <template>
2
- <div class="toggle-switch-with-label-inline" :class="[elementClasses]" :data-form-theme="theme">
3
- <label class="toggle-switch-label input-text-label" :class="labelWeightClass" :for="`toggle-sitch-${id}`">{{ label }}</label>
2
+ <div class="toggle-switch-with-label-inline" :class="[elementClasses]" :data-theme="theme">
3
+ <InputLabel :for="`toggle-sitch-${id}`" :id :theme :name input-variant="normal" :style-class-passthrough="['input-switch-label', 'input-text-label', labelWeightClass]">
4
+ <template #textLabel>{{ label }}</template>
5
+ </InputLabel>
6
+
4
7
  <ToggleSwitchCore v-model="modelValue" :id :name :true-value :false-value :theme :round :size>
5
8
  <template v-if="hasIconOnSlot" #iconOn>
6
9
  <slot name="iconOn"></slot>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="colour-scheme-select" :data-size="size" :data-form-theme="theme">
2
+ <div class="colour-scheme-select" :data-size="size" :data-theme="theme">
3
3
  <p>Color Scheme select</p>
4
4
 
5
5
  <form class="colour-scheme-select-form mbe-20" ref="colourSchemeWrapper">
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="colour-scheme-select" :data-size="size" :data-form-theme="theme">
2
+ <div class="colour-scheme-select" :data-size="size" :data-theme="theme">
3
3
  <p>Color Scheme select</p>
4
4
 
5
5
  <form class="colour-scheme-select-form mbe-20">
@@ -1,4 +1,4 @@
1
- import type { IFormData } from '@/types/types.forms';
1
+ import type { IFormData } from '../../shared/types/types.forms';
2
2
 
3
3
  export function useErrorMessage(name: string, formData: Ref<IFormData>) {
4
4
  const defaultError = ref('');
@@ -12,7 +12,7 @@ export function useErrorMessage(name: string, formData: Ref<IFormData>) {
12
12
  console.log(`errorMessage()`);
13
13
  if (hasCustomError()) {
14
14
  console.log(`errorMessage() | IF`);
15
- return errorMessages.value[name].message;
15
+ return errorMessages.value[name]?.message;
16
16
  } else {
17
17
  return defaultError.value;
18
18
  }
@@ -1,5 +1,5 @@
1
- import type { IFormData, IFieldsInitialState, IFormFieldC12, IApiErrorMessages, ICustomErrorMessage, IErrorMessagesArr } from '@/types/types.forms';
2
- import { formFieldC12 } from '@/components/forms/c12/utils';
1
+ import type { IFormData, IFieldsInitialState, IFormFieldC12, IApiErrorMessages, ICustomErrorMessage, IErrorMessagesArr } from '../../shared/types/types.forms';
2
+ // import { formFieldC12 } from '@/components/forms/c12/utils';
3
3
 
4
4
  // export function useFormControl(name: string = '') {
5
5
  export function useFormControl(name: string = '') {
@@ -50,7 +50,13 @@ export function useFormControl(name: string = '') {
50
50
  console.log(`useFormControl | updatePreviousValues`);
51
51
 
52
52
  Object.keys(formData.value.data).forEach((key) => {
53
- formData.value.formFieldsC12[key].previousValue = formData.value.data[key];
53
+ if (formData.value.formFieldsC12[key]) {
54
+ const currentValue = formData.value.data[key];
55
+ // Filter out undefined values and IOptionsValueArr[] which are not supported by previousValue
56
+ if (currentValue !== undefined && !Array.isArray(currentValue)) {
57
+ formData.value.formFieldsC12[key].previousValue = currentValue;
58
+ }
59
+ }
54
60
  });
55
61
  };
56
62
 
@@ -86,7 +92,7 @@ export function useFormControl(name: string = '') {
86
92
  let count = 0;
87
93
 
88
94
  for (const key in obj) {
89
- if (obj.hasOwnProperty(key) && obj[key].useCustomError === true) {
95
+ if (obj.hasOwnProperty(key) && obj[key]?.useCustomError === true) {
90
96
  count++;
91
97
  }
92
98
  }
@@ -108,11 +114,11 @@ export function useFormControl(name: string = '') {
108
114
  */
109
115
  const updateErrorMessages = async (name: string, message: string = '', valid: boolean = false) => {
110
116
  if (!valid) {
111
- // formData.value.validityState[name] = valid;
112
- // formData.value.errorMessages[name] = {
113
- // useCustomError: true,
114
- // message,
115
- // };
117
+ // Ensure the form field exists before updating it
118
+ if (!formData.value.formFieldsC12[name]) {
119
+ console.warn(`Form field "${name}" not found in formFieldsC12`);
120
+ return;
121
+ }
116
122
 
117
123
  formData.value.formFieldsC12[name].useCustomError = true;
118
124
 
@@ -1,6 +1,6 @@
1
1
  import { ref, reactive, toRaw, type Ref } from 'vue';
2
2
  import { z, ZodError } from 'zod';
3
- import type { ApiErrorResponse } from '../types/types.forms';
3
+ import type { ApiErrorResponse } from '../../shared/types/types.forms';
4
4
 
5
5
  const useZodValidation = (formSchema: any, formRef: Ref<HTMLFormElement | null>) => {
6
6
  const zodFormControl = reactive({
package/nuxt.config.ts CHANGED
@@ -2,8 +2,11 @@
2
2
 
3
3
  export default defineNuxtConfig({
4
4
  devtools: { enabled: true },
5
- css: ['modern-normalize', './assets/styles/main.css'],
5
+ css: ['modern-normalize', './app/assets/styles/main.css'],
6
6
  modules: ['@nuxt/icon', '@nuxt/test-utils/module'],
7
+ alias: {
8
+ '#shared': './shared',
9
+ },
7
10
  typescript: {
8
11
  tsConfig: {
9
12
  compilerOptions: {
@@ -30,5 +33,8 @@ export default defineNuxtConfig({
30
33
  vue: {
31
34
  runtimeCompiler: true,
32
35
  },
33
- compatibilityDate: '2024-07-13',
36
+ compatibilityDate: '2024-12-01',
37
+ future: {
38
+ compatibilityVersion: 4,
39
+ },
34
40
  });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "srcdev-nuxt-forms",
3
3
  "type": "module",
4
- "version": "5.1.1",
4
+ "version": "6.0.1",
5
5
  "main": "nuxt.config.ts",
6
6
  "scripts": {
7
7
  "clean": "rm -rf .nuxt && rm -rf .output && rm -rf .playground/.nuxt && rm -rf .playground/.output",
@@ -18,27 +18,26 @@
18
18
  "test": "vitest"
19
19
  },
20
20
  "files": [
21
- "assets/",
22
- "components/",
23
- "composables/",
24
- "types/"
21
+ "app/",
22
+ "shared/",
23
+ "nuxt.config.ts"
25
24
  ],
26
25
  "devDependencies": {
27
26
  "@iconify-json/carbon": "1.2.10",
28
27
  "@iconify-json/material-symbols": "1.2.29",
29
28
  "@iconify-json/material-symbols-light": "1.2.29",
30
- "@nuxt/eslint-config": "1.5.2",
29
+ "@nuxt/eslint-config": "1.8.0",
31
30
  "@nuxt/icon": "1.15.0",
32
- "@nuxt/test-utils": "3.17.2",
31
+ "@nuxt/test-utils": "3.19.2",
33
32
  "@vue/test-utils": "2.4.6",
34
33
  "eslint": "9.31.0",
35
34
  "happy-dom": "16.8.1",
36
- "nuxt": "3.17.7",
35
+ "nuxt": "4.0.3",
37
36
  "release-it": "18.1.2",
38
37
  "typescript": "5.8.3",
39
- "vitest": "3.0.8",
40
- "vue": "3.5.17",
41
- "zod": "^4.0.0"
38
+ "vitest": "3.2.4",
39
+ "vue": "3.5.18",
40
+ "zod": "4.0.0"
42
41
  },
43
42
  "dependencies": {
44
43
  "@iconify-json/gridicons": "1.2.2",
@@ -1,4 +1,4 @@
1
- import type { IFieldsInitialState, IFormFieldsState, IFormFieldsC12, IFormFieldC12, IApiErrorMessages, ICustomErrorMessage, IErrorMessagesArr } from '@/types/types.forms';
1
+ import type { IFieldsInitialState, IFormFieldsState, IFormFieldsC12, IFormFieldC12, IApiErrorMessages, ICustomErrorMessage, IErrorMessagesArr } from './types.forms';
2
2
 
3
3
  export interface IZodeFormControl {
4
4
  [x: string]: string | boolean | number | URL | object;
@@ -1,8 +0,0 @@
1
- :root {
2
- .underlined,
3
- .normal,
4
- .input-select-core,
5
- .input-checkbox-radio-options-button {
6
- --form-core-background-color-hover: light-dark(hsl(from var(--theme-form-input-border) h s 95%), hsl(from var(--theme-form-input-border) h s 25%));
7
- }
8
- }
@@ -1,16 +0,0 @@
1
- :root {
2
- /* Label vars */
3
- .form-fieldset {
4
- --form-fieldset-legend-text-color: var(--theme-form-input-text-label-color-normal);
5
- --form-fieldset-legend-text-margin-block: 0.8rem;
6
- --form-fieldset-legend-text-size: var(--step-5);
7
- --form-fieldset-legend-text-weight: normal;
8
- --form-fieldset-legend-text-line-height: 1.5;
9
-
10
- --form-fieldset-description-font-size: 1.6rem;
11
- --form-fieldset-description-margin-top: 1.2rem;
12
-
13
- --form-fieldset-content-margin-block-start: 0;
14
- --form-fieldset-content-padding-block-start: 0;
15
- }
16
- }
@@ -1,59 +0,0 @@
1
- :root {
2
- .input-checkbox-radio-options-button {
3
- /* --input-checkbox-radio-options-button-background-color: hsl(from var(--theme-form-input-border) h s 95%); */
4
- --input-checkbox-radio-options-button-background-color: color-mix(in srgb, currentColor 5%, transparent);
5
- --input-checkbox-radio-options-button-background-color-active: light-dark(hsl(from var(--theme-form-input-border) h s 75%), hsl(from var(--theme-form-input-border) h s 25%));
6
-
7
- --input-checkbox-radio-options-button-border: 0.1rem solid var(--theme-form-input-border);
8
- --input-checkbox-radio-options-button-border-active: 0.1rem solid var(--theme-form-input-border);
9
- /* --input-checkbox-radio-options-button-border-radius: var(--form-input-border-radius); */
10
- --input-checkbox-radio-options-button-border-radius: 1lh;
11
- --input-checkbox-radio-options-button-outline: 0.1rem solid hsl(from var(--theme-form-input-border) h s 55%);
12
- --input-checkbox-radio-options-button-outline-active: 0.1rem solid hsl(from var(--theme-form-input-border) h s 5%);
13
-
14
- /* Label styles */
15
-
16
- --input-checkbox-radio-options-button-label-font-size: var(--form-element-font-size);
17
- --input-checkbox-radio-options-button-label-min-height: var(--form-element-line-height);
18
-
19
- --input-checkbox-radio-options-button-label-margin-block: 0.8rem;
20
- --input-checkbox-radio-options-button-label-padding-inline: 0.8rem;
21
-
22
- [data-form-theme='primary'] {
23
- --input-checkbox-radio-options-button-label-text-color: light-dark(var(--gray-11), var(--gray-1));
24
- --input-checkbox-radio-options-button-label-icon-color: light-dark(var(--gray-11), var(--gray-1));
25
- }
26
-
27
- /* Size variants */
28
- &.x-small {
29
- --input-checkbox-radio-options-padding-block: 0.2rem;
30
- --input-checkbox-radio-options-padding-inline: 1.6rem;
31
-
32
- --input-checkbox-radio-options-button-gap: 1rem;
33
- }
34
-
35
- &.small {
36
- --input-checkbox-radio-options-padding-block: 0.2rem;
37
- --input-checkbox-radio-options-padding-inline: 1.6rem;
38
- --input-checkbox-radio-options-button-gap: 1rem;
39
- }
40
-
41
- &.default {
42
- --input-checkbox-radio-options-padding-block: 0.4rem;
43
- --input-checkbox-radio-options-padding-inline: 1.2rem;
44
- --input-checkbox-radio-options-button-gap: 1rem;
45
- }
46
-
47
- &.medium {
48
- --input-checkbox-radio-options-padding-block: 0.4rem;
49
- --input-checkbox-radio-options-padding-inline: 1.2rem;
50
- --input-checkbox-radio-options-button-gap: 1rem;
51
- }
52
-
53
- &.large {
54
- --input-checkbox-radio-options-padding-block: 0.4rem;
55
- --input-checkbox-radio-options-padding-inline: 1.2rem;
56
- --input-checkbox-radio-options-button-gap: 1rem;
57
- }
58
- }
59
- }
@@ -1,72 +0,0 @@
1
- /*
2
- * These styles control the appearance of checkboxes.
3
- */
4
- :root {
5
- .input-checkbox-radio-wrapper {
6
- &.checkbox {
7
- --input-checkbox-radio-wrapper-transition: all var(--theme-form-transition-duration) ease-in-out;
8
- --input-checkbox-radio-wrapper-border: 0.1rem solid var(--theme-form-input-border);
9
- --input-checkbox-radio-wrapper-border-radius: var(--form-input-border-radius);
10
- --input-checkbox-radio-wrapper-outline: 0.1rem solid hsl(from var(--theme-form-input-border) h s 95%);
11
-
12
- --input-checkbox-radio-wrapper-box-shadow-off: none;
13
-
14
- /* Interactive state */
15
- --input-checkbox-radio-wrapper-border-on: 0.1rem solid var(--theme-form-input-border);
16
- --input-checkbox-radio-wrapper-outline-on: 0.1rem solid hsl(from var(--theme-form-input-border) h s 1%);
17
- --input-checkbox-radio-wrapper-box-shadow-on: 0.1rem 0.1rem 0.1rem 0.1rem hsl(from var(--theme-form-input-border) h s 95%);
18
-
19
- /* Color of checkbox */
20
- --input-checkbox-radio-symbol-color-default: light-dark(hsl(from var(--theme-form-input-border) h s 95%), hsl(from var(--theme-form-input-border) h s 15%));
21
- --input-checkbox-radio-symbol-color-active: light-dark(hsl(from var(--theme-form-input-border) h s 25%), hsl(from var(--theme-form-input-border) h s 75%));
22
-
23
- /* Size variants for radio buttons within a button */
24
- &.x-small {
25
- --form-input-checkbox-radio-button-symbol-size: var(--step-3);
26
- }
27
-
28
- &.small {
29
- --form-input-checkbox-radio-button-symbol-size: var(--step-4);
30
- }
31
-
32
- &.default {
33
- --form-input-checkbox-radio-button-symbol-size: var(--step-7);
34
- }
35
-
36
- &.medium {
37
- --form-input-checkbox-radio-button-symbol-size: var(--step-6);
38
- }
39
-
40
- &.large {
41
- --form-input-checkbox-radio-button-symbol-size: var(--step-6);
42
- }
43
-
44
- /* Size variants for default checkbox */
45
- &.button {
46
- &.display-as-disc {
47
- --input-checkbox-radio-wrapper-border-radius: 100%;
48
- }
49
-
50
- &.x-small {
51
- --form-input-checkbox-radio-button-symbol-size: var(--step-3);
52
- }
53
-
54
- &.small {
55
- --form-input-checkbox-radio-button-symbol-size: var(--step-4);
56
- }
57
-
58
- &.default {
59
- --form-input-checkbox-radio-button-symbol-size: var(--step-6);
60
- }
61
-
62
- &.medium {
63
- --form-input-checkbox-radio-button-symbol-size: var(--step-6);
64
- }
65
-
66
- &.large {
67
- --form-input-checkbox-radio-button-symbol-size: var(--step-6);
68
- }
69
- }
70
- }
71
- }
72
- }
@@ -1,55 +0,0 @@
1
- :root {
2
- --input-error-color: var(--theme-error-text);
3
- /* --input-error-background-color: transparent; */
4
- --input-error-background-color: var(--theme-error-surface);
5
-
6
- --input-error-font-size: var(--form-element-font-size);
7
- --input-error-line-height: var(--form-element-line-height);
8
- --input-error-font-weight: var(--form-element-font-weight);
9
-
10
- --input-error-margin-block-start: 0rem;
11
-
12
- --input-error-border-radius: var(--form-input-border-radius);
13
-
14
- /* Border styles */
15
- --input-error-border-top-left-radius: 0;
16
- --input-error-border-top-right-radius: 0;
17
- --input-error-border-bottom-right-radius: 0;
18
- --input-error-border-bottom-left-radius: 0;
19
-
20
- --input-error-border-top-default: var(--form-element-border-width) solid transparent;
21
- --input-error-border-right-default: var(--form-element-border-width) solid transparent;
22
- --input-error-border-bottom-default: var(--form-element-border-width-underlined) solid transparent;
23
- --input-error-border-left-default: var(--form-element-border-width) solid transparent;
24
-
25
- .detached {
26
- --input-error-margin-block-start: 2rem;
27
-
28
- --input-error-border-top-left-radius: var(--input-error-border-radius);
29
- --input-error-border-top-right-radius: var(--input-error-border-radius);
30
- --input-error-border-bottom-right-radius: var(--input-error-border-radius);
31
- --input-error-border-bottom-left-radius: var(--input-error-border-radius);
32
- }
33
-
34
- .show {
35
- --input-error-background-color: var(--theme-error-surface);
36
-
37
- --input-error-border-bottom-right-radius: var(--input-error-border-radius);
38
- --input-error-border-bottom-left-radius: var(--input-error-border-radius);
39
-
40
- --input-error-border-top-default: var(--form-element-border-width) solid var(--theme-error-surface);
41
- --input-error-border-right-default: var(--form-element-border-width) solid var(--theme-error-surface);
42
- --input-error-border-bottom-default: var(--form-element-border-width-underlined) solid var(--red-8);
43
- --input-error-border-left-default: var(--form-element-border-width) solid var(--theme-error-surface);
44
- }
45
-
46
- .Xunderlined.show {
47
- --input-error-border-bottom-right-radius: var(--input-error-border-radius);
48
- --input-error-border-bottom-left-radius: var(--input-error-border-radius);
49
-
50
- --input-error-border-top-default: var(--form-element-border-width) solid var(--theme-error-surface);
51
- --input-error-border-right-default: var(--form-element-border-width) solid var(--theme-error-surface);
52
- --input-error-border-bottom-default: var(--form-element-border-width-underlined) solid var(--red-8);
53
- --input-error-border-left-default: var(--form-element-border-width) solid var(--theme-error-surface);
54
- }
55
- }
@@ -1,18 +0,0 @@
1
- :root {
2
- /* Label vars */
3
- .normal {
4
- --input-label-text-color: var(--theme-form-input-text-label-color-normal);
5
- --input-label-text-margin-block: 0.8rem;
6
- --input-label-text-size: var(--step-5);
7
- --input-label-text-weight: normal;
8
- --input-label-text-line-height: 1.5;
9
- }
10
-
11
- .underlined {
12
- --input-label-text-color: var(--theme-form-input-text-label-color-normal);
13
- --input-label-text-margin-block: 0.8rem;
14
- --input-label-text-size: var(--step-5);
15
- --input-label-text-weight: normal;
16
- --input-label-text-line-height: 1.5;
17
- }
18
- }
@@ -1,68 +0,0 @@
1
- /*
2
- * These styles control the appearance of radio buttons.
3
- */
4
- :root {
5
- .input-checkbox-radio-wrapper {
6
- &.radio {
7
- --input-checkbox-radio-wrapper-transition: all var(--theme-form-transition-duration) ease-in-out;
8
- --input-checkbox-radio-wrapper-border: 0.1rem solid var(--theme-form-input-border);
9
- --input-checkbox-radio-wrapper-border-radius: 100%;
10
- --input-checkbox-radio-wrapper-outline: 0.1rem solid hsl(from var(--theme-form-input-border) h s 95%);
11
-
12
- --input-checkbox-radio-wrapper-box-shadow-off: none;
13
-
14
- /* Interactive state */
15
- --input-checkbox-radio-wrapper-border-on: 0.1rem solid var(--theme-form-input-border);
16
- --input-checkbox-radio-wrapper-outline-on: 0.1rem solid hsl(from var(--theme-form-input-border) h s 1%);
17
- --input-checkbox-radio-wrapper-box-shadow-on: 0rem 0rem 0rem 0.3rem hsl(from var(--theme-form-input-border) h s 95%);
18
-
19
- /* Color of radio button */
20
- --input-checkbox-radio-symbol-color-default: light-dark(hsl(from var(--theme-form-input-border) h s 95%), hsl(from var(--theme-form-input-border) h s 15%));
21
- --input-checkbox-radio-symbol-color-active: light-dark(hsl(from var(--theme-form-input-border) h s 25%), hsl(from var(--theme-form-input-border) h s 75%));
22
-
23
- /* Size variants for radio buttons within a button */
24
- &.x-small {
25
- --form-input-checkbox-radio-button-symbol-size: var(--step-3);
26
- }
27
-
28
- &.small {
29
- --form-input-checkbox-radio-button-symbol-size: var(--step-4);
30
- }
31
-
32
- &.default {
33
- --form-input-checkbox-radio-button-symbol-size: var(--step-7);
34
- }
35
-
36
- &.medium {
37
- --form-input-checkbox-radio-button-symbol-size: var(--step-6);
38
- }
39
-
40
- &.large {
41
- --form-input-checkbox-radio-button-symbol-size: var(--step-6);
42
- }
43
-
44
- /* Size variants for default radio buttons */
45
- .button {
46
- &.x-small {
47
- --form-input-checkbox-radio-button-symbol-size: var(--step-3);
48
- }
49
-
50
- &.small {
51
- --form-input-checkbox-radio-button-symbol-size: var(--step-4);
52
- }
53
-
54
- &.default {
55
- --form-input-checkbox-radio-button-symbol-size: var(--step-6);
56
- }
57
-
58
- &.medium {
59
- --form-input-checkbox-radio-button-symbol-size: var(--step-6);
60
- }
61
-
62
- &.large {
63
- --form-input-checkbox-radio-button-symbol-size: var(--step-6);
64
- }
65
- }
66
- }
67
- }
68
- }
@@ -1,18 +0,0 @@
1
- :root {
2
- .input-select-core {
3
- --input-select-animation-duration: 0.2s;
4
- --input-select-padding-block: 1.5rem;
5
- --input-select-padding-inline: 1rem;
6
-
7
- --input-select-option-padding-block: 1rem;
8
- --input-select-option-padding-inline: 1.75rem;
9
- --input-select-option-gap: 1.5rem;
10
-
11
- /* --input-select-option-background-color-hover: light-dark(hsl(from var(--theme-form-input-border) h s 75%), hsl(from var(--theme-form-input-border) h s 25%)); */
12
-
13
- --input-select-option-background-color-hover: light-dark(hsl(from var(--theme-form-input-border) h s 75%), hsl(from var(--theme-form-input-border) h s 25%));
14
-
15
- --input-select-option-icon-size: 1.5rem;
16
- --input-select-option-transition: all var(--input-select-animation-duration) ease-in-out;
17
- }
18
- }