PluginProbe
The Innovative Form Builder – IvyForms / 1.1.1
The Innovative Form Builder – IvyForms v1.1.1
1.5.1 1.5 1.4.1 1.4 trunk 0.1.2 0.2 0.2.1 0.3 0.3.1 0.4 0.5 0.6 0.6.1 0.6.1-backup 0.6.1.1 0.7 0.8 0.8.1 0.8.2 0.9 0.9.1 1.0 1.1 1.1.1 All 27 releases
ivyforms / frontend / src / utils / form-styles / sections / fieldStateVariants.ts

fieldStateVariants.ts in The Innovative Form Builder – IvyForms 1.1.1, at frontend/src/utils/form-styles/sections/fieldStateVariants.ts

408 lines 19.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import type { FormStyleSettings } from '@/types/form-style'
2 import { resolveBorderStyle } from '@/utils/styleUtils'
3
4 export interface FieldStateVariantStyleParams {
5 baseSelector: string
6 styleSettings: FormStyleSettings
7 fieldBorderWidth: string
8 fieldTextColor?: string
9 fieldFontSize?: string
10 fieldFontWeight?: string
11 fieldFontStyle?: string
12 }
13
14 export function applyFieldStateVariantStyles(
15 css: string[],
16 {
17 baseSelector,
18 styleSettings,
19 fieldBorderWidth,
20 fieldTextColor,
21 fieldFontSize,
22 fieldFontWeight,
23 fieldFontStyle,
24 }: FieldStateVariantStyleParams,
25 ): void {
26 const activeStateBackground = styleSettings.advancedMode?.fieldStates?.active?.background
27 const activeStateBorderColor = styleSettings.advancedMode?.fieldStates?.active?.borderColor
28 const activeStateTextColor = styleSettings.advancedMode?.fieldStates?.active?.textColor
29 const activeStateDescriptionColor =
30 styleSettings.advancedMode?.fieldStates?.active?.descriptionColor
31 const hasActiveBorderStyle = styleSettings.advancedMode?.fieldStates?.active?.borderStyle != null
32 const activeStateBorderStyle = hasActiveBorderStyle
33 ? resolveBorderStyle(styleSettings.advancedMode?.fieldStates?.active?.borderStyle)
34 : undefined
35
36 if (activeStateBackground || activeStateBorderColor || hasActiveBorderStyle) {
37 const activeBorderSelectors = [
38 `${baseSelector} .ivyforms-input.el-input:focus-within .el-input__wrapper`,
39 `${baseSelector} .ivyforms-field__text:focus-within .el-input__wrapper`,
40 `${baseSelector} .ivyforms-field__email:focus-within .el-input__wrapper`,
41 `${baseSelector} .ivyforms-field__website:focus-within .el-input__wrapper`,
42 `${baseSelector} .ivyforms-field__textarea:focus-within .el-textarea__inner`,
43 `${baseSelector} .ivyforms-phone-input:focus-within .el-input__wrapper`,
44 `${baseSelector} .ivyforms-field__phone:focus-within .vue-tel-input`,
45 `${baseSelector} .ivyforms-field__select:focus-within .el-input__wrapper`,
46 `${baseSelector} .ivyforms-field__select:focus-within .el-select__wrapper`,
47 `${baseSelector} .el-select:focus-within .el-select__wrapper`,
48 `${baseSelector} .ivyforms-field__date:focus-within .el-input__wrapper`,
49 `${baseSelector} .ivyforms-field__time:focus-within .el-input__wrapper`,
50 `${baseSelector} .ivyforms-field__address .el-input:focus-within .el-input__wrapper`,
51 `${baseSelector} .ivyforms-field__address .el-select:focus-within .el-select__wrapper`,
52 `${baseSelector} .ivyforms-name-field .el-input:focus-within .el-input__wrapper`,
53 ]
54 css.push(activeBorderSelectors.join(',') + ' {')
55 if (activeStateBackground) {
56 css.push(` background-color: ${activeStateBackground} !important;`)
57 }
58 if (activeStateBorderColor) {
59 css.push(` border-width: ${fieldBorderWidth} !important;`)
60 css.push(` border-color: ${activeStateBorderColor} !important;`)
61 }
62 if (hasActiveBorderStyle && activeStateBorderStyle) {
63 css.push(` border-style: ${activeStateBorderStyle} !important;`)
64 }
65 css.push('}')
66
67 if (activeStateBackground) {
68 const activePhoneInnerSelectors = [
69 `${baseSelector} .ivyforms-field__phone:focus-within .vti__input`,
70 ]
71 css.push(activePhoneInnerSelectors.join(',') + ' {')
72 css.push(` background-color: ${activeStateBackground} !important;`)
73 css.push('}')
74 }
75 }
76
77 if (activeStateDescriptionColor) {
78 css.push(`${baseSelector} .ivyforms-form-item:focus-within .ivyforms-form-item__info-text,`)
79 css.push(`${baseSelector} .el-form-item:focus-within .ivyforms-form-item__info-text {`)
80 css.push(` color: ${activeStateDescriptionColor} !important;`)
81 css.push(` --ivyforms-info-color: ${activeStateDescriptionColor} !important;`)
82 css.push('}')
83 }
84
85 if (activeStateTextColor) {
86 const activeTextSelectors = [
87 `${baseSelector} .ivyforms-field__textarea:focus-within .el-textarea__inner`,
88 `${baseSelector} .ivyforms-field__textarea:focus-within textarea`,
89 `${baseSelector} .ivyforms-field__select:focus-within .el-select__selected-item`,
90 `${baseSelector} .el-select:focus-within .el-select__selected-item`,
91 `${baseSelector} .ivyforms-field__phone:focus-within .vti__input`,
92 `${baseSelector} .ivyforms-field__phone:focus-within .vue-tel-input input`,
93 `${baseSelector} .ivyforms-field__phone:focus-within input.vti__input`,
94 `${baseSelector} .ivyforms-field__phone:focus-within input.iti__input`,
95 `${baseSelector} .ivyforms-field__phone:focus-within .vti__input.vti__phone`,
96 ]
97 css.push(activeTextSelectors.join(',') + ' {')
98 css.push(` color: ${activeStateTextColor} !important;`)
99 css.push(` -webkit-text-fill-color: ${activeStateTextColor} !important;`)
100 css.push('}')
101 }
102
103 const readOnlyExplicitTextColor = styleSettings.advancedMode?.fieldStates?.readOnly?.textColor
104 const fieldPlaceholderFontColor = styleSettings.advancedMode?.fieldPlaceholder?.fontColor
105 const readOnlyResolvedFieldTextColor =
106 readOnlyExplicitTextColor || fieldPlaceholderFontColor || fieldTextColor
107
108 if (readOnlyResolvedFieldTextColor || fieldFontSize || fieldFontWeight || fieldFontStyle) {
109 const alwaysDisabledTextSelectors = [
110 `${baseSelector} .ivyforms-field.is-readonly .el-input__inner`,
111 `${baseSelector} .ivyforms-field.is-disabled .el-input__inner`,
112 `${baseSelector} .ivyforms-field.is-readonly input`,
113 `${baseSelector} .ivyforms-field.is-disabled input`,
114 `${baseSelector} .ivyforms-field.is-readonly .el-textarea__inner`,
115 `${baseSelector} .ivyforms-field.is-disabled .el-textarea__inner`,
116 `${baseSelector} .ivyforms-field.is-readonly textarea`,
117 `${baseSelector} .ivyforms-field.is-disabled textarea`,
118 `${baseSelector} .el-input.is-disabled .el-input__inner`,
119 `${baseSelector} .el-textarea.is-disabled .el-textarea__inner`,
120 ]
121 css.push(alwaysDisabledTextSelectors.join(',') + ' {')
122 if (readOnlyResolvedFieldTextColor) {
123 css.push(` color: ${readOnlyResolvedFieldTextColor} !important;`)
124 css.push(` -webkit-text-fill-color: ${readOnlyResolvedFieldTextColor} !important;`)
125 css.push(' opacity: 1 !important;')
126 }
127 if (fieldFontSize) {
128 css.push(` font-size: ${fieldFontSize} !important;`)
129 }
130 if (fieldFontWeight) {
131 css.push(` font-weight: ${fieldFontWeight} !important;`)
132 }
133 if (fieldFontStyle) {
134 css.push(` font-style: ${fieldFontStyle} !important;`)
135 }
136 css.push('}')
137 }
138
139 const readOnlyBackground = styleSettings.advancedMode?.fieldStates?.readOnly?.background
140 const readOnlyBorderColor = styleSettings.advancedMode?.fieldStates?.readOnly?.borderColor
141 const readOnlyDescriptionColor =
142 styleSettings.advancedMode?.fieldStates?.readOnly?.descriptionColor
143 const hasReadOnlyBorderStyle =
144 styleSettings.advancedMode?.fieldStates?.readOnly?.borderStyle != null
145 const readOnlyBorderStyle = hasReadOnlyBorderStyle
146 ? resolveBorderStyle(styleSettings.advancedMode?.fieldStates?.readOnly?.borderStyle)
147 : undefined
148
149 if (
150 readOnlyBackground ||
151 readOnlyBorderColor ||
152 hasReadOnlyBorderStyle ||
153 readOnlyExplicitTextColor
154 ) {
155 const disabledSelectors = [
156 `${baseSelector} .ivyforms-input.el-input:disabled .el-input__wrapper`,
157 `${baseSelector} .ivyforms-input.el-input.is-disabled .el-input__wrapper`,
158 `${baseSelector} .ivyforms-field:disabled .el-input__wrapper`,
159 `${baseSelector} .ivyforms-field.is-disabled .el-input__wrapper`,
160 `${baseSelector} .ivyforms-field.is-readonly .el-input__wrapper`,
161 `${baseSelector} .el-input-number.is-disabled .el-input__wrapper`,
162 `${baseSelector} .ivyforms-field.is-readonly .el-input-number .el-input__wrapper`,
163 `${baseSelector} .el-input-number.is-disabled`,
164 `${baseSelector} .el-input-number.is-disabled .el-input__inner`,
165 `${baseSelector} .ivyforms-field.is-readonly .el-input-number`,
166 `${baseSelector} .ivyforms-field.is-readonly .el-input-number .el-input__inner`,
167 `${baseSelector} .ivyforms-text-number[readonly] .el-input__wrapper`,
168 `${baseSelector} .ivyforms-field.is-readonly .ivyforms-text-number__input .el-input__wrapper`,
169 `${baseSelector} .ivyforms-field:disabled .el-textarea__inner`,
170 `${baseSelector} .ivyforms-field.is-disabled .el-textarea__inner`,
171 `${baseSelector} .ivyforms-field.is-readonly .el-textarea__inner`,
172 `${baseSelector} .ivyforms-field.is-readonly .el-input__inner`,
173 `${baseSelector} .el-input.is-disabled .el-input__wrapper`,
174 `${baseSelector} .el-textarea.is-disabled .el-textarea__inner`,
175 `${baseSelector} .ivyforms-field.is-readonly .el-select__wrapper`,
176 `${baseSelector} .ivyforms-field.is-readonly .el-input__wrapper:has(input[readonly])`,
177 `${baseSelector} .ivyforms-field.is-readonly .el-textarea__inner[readonly]`,
178 `${baseSelector} .ivyforms-field.is-readonly .vue-tel-input`,
179 ]
180 css.push(disabledSelectors.join(',') + ' {')
181 if (readOnlyBackground) {
182 css.push(` background-color: ${readOnlyBackground} !important;`)
183 }
184 if (readOnlyBorderColor) {
185 css.push(` border-width: ${fieldBorderWidth} !important;`)
186 css.push(` border-color: ${readOnlyBorderColor} !important;`)
187 }
188 if (hasReadOnlyBorderStyle && readOnlyBorderStyle) {
189 css.push(` border-style: ${readOnlyBorderStyle} !important;`)
190 }
191 css.push('}')
192
193 const readOnlyAppearanceSelectors = [
194 `${baseSelector} .ivyforms-field.is-readonly`,
195 `${baseSelector} .ivyforms-field.is-disabled`,
196 `${baseSelector} .ivyforms-field.is-readonly .el-input__wrapper`,
197 `${baseSelector} .ivyforms-field.is-disabled .el-input__wrapper`,
198 `${baseSelector} .ivyforms-field.is-readonly .el-input__inner`,
199 `${baseSelector} .ivyforms-field.is-disabled .el-input__inner`,
200 `${baseSelector} .ivyforms-field.is-readonly input`,
201 `${baseSelector} .ivyforms-field.is-disabled input`,
202 `${baseSelector} .ivyforms-field.is-readonly .el-textarea__inner`,
203 `${baseSelector} .ivyforms-field.is-disabled .el-textarea__inner`,
204 `${baseSelector} .ivyforms-field.is-readonly textarea`,
205 `${baseSelector} .ivyforms-field.is-disabled textarea`,
206 `${baseSelector} .ivyforms-field.is-readonly .el-select__wrapper`,
207 `${baseSelector} .ivyforms-field.is-disabled .el-select__wrapper`,
208 `${baseSelector} .ivyforms-field.is-readonly .vue-tel-input`,
209 `${baseSelector} .ivyforms-field.is-disabled .vue-tel-input`,
210 `${baseSelector} .ivyforms-field.is-readonly .vti__input`,
211 `${baseSelector} .ivyforms-field.is-disabled .vti__input`,
212 `${baseSelector} .ivyforms-field.is-readonly .ivyforms-text-number`,
213 `${baseSelector} .ivyforms-field.is-disabled .ivyforms-text-number`,
214 `${baseSelector} .ivyforms-field.is-readonly .ivyforms-text-number__btn:disabled`,
215 `${baseSelector} .ivyforms-field.is-disabled .ivyforms-text-number__btn:disabled`,
216 ]
217 css.push(readOnlyAppearanceSelectors.join(',') + ' {')
218 css.push(' opacity: 1 !important;')
219 css.push('}')
220
221 if (readOnlyResolvedFieldTextColor) {
222 const readOnlyTextAppearanceSelectors = [
223 `${baseSelector} .ivyforms-field.is-readonly .el-input__inner`,
224 `${baseSelector} .ivyforms-field.is-disabled .el-input__inner`,
225 `${baseSelector} .ivyforms-field.is-readonly input`,
226 `${baseSelector} .ivyforms-field.is-disabled input`,
227 `${baseSelector} .ivyforms-field.is-readonly .el-textarea__inner`,
228 `${baseSelector} .ivyforms-field.is-disabled .el-textarea__inner`,
229 `${baseSelector} .ivyforms-field.is-readonly textarea`,
230 `${baseSelector} .ivyforms-field.is-disabled textarea`,
231 `${baseSelector} .ivyforms-field.is-readonly .vti__input`,
232 `${baseSelector} .ivyforms-field.is-disabled .vti__input`,
233 `${baseSelector} .ivyforms-field.is-readonly .ivyforms-text-number__btn`,
234 `${baseSelector} .ivyforms-field.is-disabled .ivyforms-text-number__btn`,
235 ]
236 css.push(readOnlyTextAppearanceSelectors.join(',') + ' {')
237 css.push(` color: ${readOnlyResolvedFieldTextColor} !important;`)
238 css.push(` -webkit-text-fill-color: ${readOnlyResolvedFieldTextColor} !important;`)
239 css.push(' opacity: 1 !important;')
240 css.push('}')
241 }
242
243 css.push(`${baseSelector} .ivyforms-field.is-readonly .ivyforms-text-number,`)
244 css.push(`${baseSelector} .ivyforms-field.is-disabled .ivyforms-text-number {`)
245 css.push(' border: none !important;')
246 css.push(' box-shadow: none !important;')
247 css.push(' background: transparent !important;')
248 css.push('}')
249
250 const readOnlyOpacitySelectors = [
251 `${baseSelector} .ivyforms-field.is-readonly .vue-tel-input`,
252 `${baseSelector} .ivyforms-field.is-disabled .vue-tel-input`,
253 ]
254 css.push(readOnlyOpacitySelectors.join(',') + ' {')
255 css.push(' opacity: 1 !important;')
256 css.push('}')
257
258 css.push(`${baseSelector} .ivyforms-field.is-readonly .el-input__inner,`)
259 css.push(`${baseSelector} .ivyforms-field.is-disabled .el-input__inner,`)
260 css.push(`${baseSelector} .ivyforms-field.is-readonly .vti__input,`)
261 css.push(`${baseSelector} .ivyforms-field.is-disabled .vti__input {`)
262 css.push(' border: none !important;')
263 css.push(' outline: none !important;')
264 css.push(' box-shadow: none !important;')
265 css.push(' -webkit-appearance: none !important;')
266 css.push(' appearance: none !important;')
267 css.push('}')
268
269 css.push(
270 `${baseSelector} .ivyforms-field.ivyforms-field__phone.is-readonly .ivyforms-phone-input .vue-tel-input.disabled .vti__input.vti__phone,`,
271 )
272 css.push(
273 `${baseSelector} .ivyforms-field.ivyforms-field__phone.is-readonly .ivyforms-phone-input .vue-tel-input.disabled .vti__input:disabled,`,
274 )
275 css.push(
276 `${baseSelector} .ivyforms-field.ivyforms-field__phone.is-readonly:focus-within .ivyforms-phone-input .vue-tel-input .vti__input,`,
277 )
278 css.push(
279 `${baseSelector} .ivyforms-field.ivyforms-field__phone.is-disabled .ivyforms-phone-input .vue-tel-input.disabled .vti__input:disabled {`,
280 )
281 css.push(' border: none !important;')
282 css.push(' outline: none !important;')
283 css.push(' box-shadow: none !important;')
284 css.push(' background: transparent !important;')
285 css.push(' background-color: transparent !important;')
286 css.push('}')
287
288 const readOnlyPhoneSelectors = [
289 `${baseSelector} .ivyforms-field.is-readonly .vue-tel-input`,
290 `${baseSelector} .ivyforms-field.is-disabled .vue-tel-input`,
291 ]
292 css.push(readOnlyPhoneSelectors.join(',') + ' {')
293 if (readOnlyBackground) {
294 css.push(` background-color: ${readOnlyBackground} !important;`)
295 }
296 if (readOnlyBorderColor) {
297 css.push(` border-color: ${readOnlyBorderColor} !important;`)
298 }
299 css.push('}')
300 }
301
302 if (readOnlyDescriptionColor) {
303 css.push(`${baseSelector} .ivyforms-field.is-readonly .ivyforms-form-item__info-text,`)
304 css.push(`${baseSelector} .ivyforms-field.is-disabled .ivyforms-form-item__info-text,`)
305 css.push(
306 `${baseSelector} .ivyforms-field.is-readonly .el-form-item .ivyforms-form-item__info-text,`,
307 )
308 css.push(
309 `${baseSelector} .ivyforms-field.is-disabled .el-form-item .ivyforms-form-item__info-text {`,
310 )
311 css.push(` color: ${readOnlyDescriptionColor} !important;`)
312 css.push(` --ivyforms-info-color: ${readOnlyDescriptionColor} !important;`)
313 css.push('}')
314 }
315
316 const errorBackground = styleSettings.advancedMode?.fieldStates?.error?.background
317 const errorBorderColor = styleSettings.advancedMode?.fieldStates?.error?.borderColor
318 const errorTextColor = styleSettings.advancedMode?.fieldStates?.error?.textColor
319 const errorDescriptionColor = styleSettings.advancedMode?.fieldStates?.error?.descriptionColor
320 const hasErrorBorderStyle = styleSettings.advancedMode?.fieldStates?.error?.borderStyle != null
321 const errorBorderStyle = hasErrorBorderStyle
322 ? resolveBorderStyle(styleSettings.advancedMode?.fieldStates?.error?.borderStyle)
323 : undefined
324
325 if (errorBackground || errorBorderColor || hasErrorBorderStyle) {
326 const errorSelectors = [
327 `${baseSelector} .ivyforms-form-item.is-error .ivyforms-input.el-input .el-input__wrapper`,
328 `${baseSelector} .ivyforms-form-item.is-error .ivyforms-field .el-input__wrapper`,
329 `${baseSelector} .ivyforms-form-item.is-error .el-input__wrapper`,
330 `${baseSelector} .ivyforms-form-item.is-error .el-textarea__inner`,
331 `${baseSelector} .ivyforms-form-item.is-error .el-select__wrapper`,
332 `${baseSelector} .ivyforms-form-item.is-error .vue-tel-input`,
333 `${baseSelector} .el-form-item.is-error .ivyforms-input.el-input .el-input__wrapper`,
334 `${baseSelector} .el-form-item.is-error .ivyforms-field .el-input__wrapper`,
335 `${baseSelector} .el-form-item.is-error .el-input__wrapper`,
336 `${baseSelector} .el-form-item.is-error .el-textarea__inner`,
337 `${baseSelector} .el-form-item.is-error .el-select__wrapper`,
338 `${baseSelector} .el-form-item.is-error .vue-tel-input`,
339 ]
340 css.push(errorSelectors.join(',') + ' {')
341 if (errorBackground) {
342 css.push(` background-color: ${errorBackground} !important;`)
343 }
344 if (errorBorderColor) {
345 css.push(` border-width: ${fieldBorderWidth} !important;`)
346 css.push(` border-color: ${errorBorderColor} !important;`)
347 }
348 if (hasErrorBorderStyle && errorBorderStyle) {
349 css.push(` border-style: ${errorBorderStyle} !important;`)
350 }
351 css.push('}')
352 }
353
354 if (errorDescriptionColor) {
355 css.push(`${baseSelector} .ivyforms-form-item.is-error .ivyforms-form-item__info-text,`)
356 css.push(`${baseSelector} .el-form-item.is-error .ivyforms-form-item__info-text {`)
357 css.push(` color: ${errorDescriptionColor} !important;`)
358 css.push(` --ivyforms-info-color: ${errorDescriptionColor} !important;`)
359 css.push('}')
360 }
361
362 if (errorTextColor) {
363 const errorTextSelectors = [
364 `${baseSelector} .ivyforms-form-item.is-error .ivyforms-input.el-input input`,
365 `${baseSelector} .ivyforms-form-item.is-error .ivyforms-field input`,
366 `${baseSelector} .ivyforms-form-item.is-error input`,
367 `${baseSelector} .ivyforms-form-item.is-error textarea`,
368 `${baseSelector} .ivyforms-form-item.is-error .el-input__inner`,
369 `${baseSelector} .ivyforms-form-item.is-error .el-textarea__inner`,
370 `${baseSelector} .ivyforms-form-item.is-error .vti__input`,
371 `${baseSelector} .ivyforms-form-item.is-error .el-input__prefix`,
372 `${baseSelector} .ivyforms-form-item.is-error .el-input__suffix`,
373 `${baseSelector} .ivyforms-form-item.is-error .el-input__prefix .el-icon`,
374 `${baseSelector} .ivyforms-form-item.is-error .el-input__suffix .el-icon`,
375 `${baseSelector} .el-form-item.is-error .ivyforms-input.el-input input`,
376 `${baseSelector} .el-form-item.is-error .ivyforms-field input`,
377 `${baseSelector} .el-form-item.is-error input`,
378 `${baseSelector} .el-form-item.is-error textarea`,
379 `${baseSelector} .el-form-item.is-error .el-input__inner`,
380 `${baseSelector} .el-form-item.is-error .el-textarea__inner`,
381 `${baseSelector} .el-form-item.is-error .vti__input`,
382 `${baseSelector} .el-form-item.is-error .el-input__prefix`,
383 `${baseSelector} .el-form-item.is-error .el-input__suffix`,
384 `${baseSelector} .el-form-item.is-error .el-input__prefix .el-icon`,
385 `${baseSelector} .el-form-item.is-error .el-input__suffix .el-icon`,
386 ]
387 css.push(errorTextSelectors.join(',') + ' {')
388 css.push(` color: ${errorTextColor} !important;`)
389 css.push('}')
390
391 const errorIconSelectors = [
392 `${baseSelector} .ivyforms-form-item.is-error .ivyforms-icon`,
393 `${baseSelector} .el-form-item.is-error .ivyforms-icon`,
394 ]
395 css.push(errorIconSelectors.join(',') + ' {')
396 css.push(` --map-status-error-symbol-0: ${errorTextColor} !important;`)
397 css.push('}')
398
399 const errorSvgSelectors = [
400 `${baseSelector} .ivyforms-form-item.is-error .ivyforms-icon svg path`,
401 `${baseSelector} .el-form-item.is-error .ivyforms-icon svg path`,
402 ]
403 css.push(errorSvgSelectors.join(',') + ' {')
404 css.push(` fill: ${errorTextColor} !important;`)
405 css.push('}')
406 }
407 }
408