PluginProbe
Contact Forms by Cimatti / 2.1.2
Contact Forms by Cimatti v2.1.2
2.3.6 2.3.5 2.3.0 2.2.32 2.2.4 2.2.0 2.1.2 2.1.1 trunk 1.0 1.1 1.2 1.2.1 1.3 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 All 62 releases
contact-forms / assets / css / frontend.css

frontend.css in Contact Forms by Cimatti 2.1.2, at assets/css/frontend.css

1,459 lines 36.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /* ============================================
2 CSS Custom Properties (Variables)
3 ============================================ */
4 .accua-form {
5 /* Input border color - themes can override this variable */
6 /* Using explicit color instead of currentColor to avoid issues with */
7 /* inputs that use color:transparent for placeholder hiding (date fields) */
8 --accua-form-input-border-color: #111;
9 }
10
11 /* Modern accessible spinner - replaces old gif spinner */
12 .accua_form_api_throbbler {
13 display: inline-block;
14 width: 20px;
15 height: 20px;
16 border: 2px solid currentColor;
17 border-right-color: transparent;
18 border-radius: 50%;
19 animation: accua-spinner-rotate 0.75s linear infinite;
20 vertical-align: middle;
21 opacity: 0.7;
22 }
23
24 /* Reduce motion for users who prefer it (EAA compliance) */
25 @media (prefers-reduced-motion: reduce) {
26 .accua_form_api_throbbler {
27 animation: none;
28 opacity: 0.5;
29 }
30 }
31
32 @keyframes accua-spinner-rotate {
33 to {
34 transform: rotate(360deg);
35 }
36 }
37
38 div.pfbc-error {
39 background-color: #fff;
40 border: 1px solid #ef9a9a;
41 border-left-width: 4px;
42 color: #c62828;
43 padding: 1em 1.25em;
44 margin: 1em 0;
45 border-radius: 4px;
46 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
47 }
48
49 .pfbc-error-heading {
50 display: block;
51 font-size: 1em;
52 margin-bottom: 0.5em;
53 font-weight: 600;
54 color: #c62828;
55 }
56
57 .pfbc-error-list {
58 margin: 0.5em 0 0;
59 padding-left: 1.5em;
60 color: #d32f2f;
61 }
62
63 /* Inline field errors with ARIA support - Modern 2025 Design
64 * WCAG 2.2 / European Accessibility Act compliant:
65 * - Adequate spacing for cognitive accessibility
66 * - Minimum readable font size (13px)
67 * - Proper contrast ratio (4.5:1+)
68 * - Icon + text for non-color-only error indication
69 * - Fast, smooth animation with height transition for fields below
70 */
71 .pfbc-inline-error {
72 color: #d32f2f;
73 padding: 0;
74 margin-top: 0.375em;
75 /* ~6px breathing room below input */
76 font-size: 0.8125rem;
77 /* 13px - consistent sizing regardless of parent */
78 line-height: 1.4;
79 /* Better readability per WCAG */
80 display: flex;
81 align-items: center;
82 gap: 0.375em;
83 /* Better icon-text separation */
84 max-height: 3em;
85 /* Set explicitly for transition */
86 overflow: hidden;
87 /* Required for max-height animation */
88 /* Fast smooth animation - 150ms with ease-in-out for natural feel */
89 animation: pfbc-error-appear 0.15s ease-in-out forwards;
90 }
91
92 /* Smooth exit animation - mirrors entrance but in reverse (slides up and fades out) */
93 .pfbc-inline-error.pfbc-error-removing {
94 animation: pfbc-error-disappear 0.15s ease-in-out forwards;
95 pointer-events: none;
96 }
97
98 /* Smooth appear animation - slides down from above */
99 @keyframes pfbc-error-appear {
100 from {
101 opacity: 0;
102 transform: translateY(-0.375em);
103 max-height: 0;
104 margin-top: 0;
105 }
106
107 to {
108 opacity: 1;
109 transform: translateY(0);
110 max-height: 3em;
111 /* Enough for multi-line errors */
112 margin-top: 0.375em;
113 }
114 }
115
116 /* Smooth disappear animation - slides up and fades out (reverse of appear) */
117 @keyframes pfbc-error-disappear {
118 from {
119 opacity: 1;
120 transform: translateY(0);
121 max-height: 3em;
122 margin-top: 0.375em;
123 }
124
125 to {
126 opacity: 0;
127 transform: translateY(-0.375em);
128 max-height: 0;
129 margin-top: 0;
130 }
131 }
132
133 /* Respect reduced motion preference (EAA compliance) */
134 @media (prefers-reduced-motion: reduce) {
135 .pfbc-inline-error {
136 animation: none;
137 }
138 }
139
140 .pfbc-inline-error::before {
141 content: "\26A0";
142 /* âš  Warning sign */
143 flex-shrink: 0;
144 font-size: 1em;
145 /* Match text size for proper alignment */
146 line-height: 1.4;
147 /* Match text line-height */
148 }
149
150 .pfbc-error-message {
151 flex: 1;
152 }
153
154 /* Fieldwrap needs relative positioning for absolute error placement */
155 .pfbc-fieldwrap {
156 position: relative;
157 }
158
159 /* File input help text styling */
160 .pfbc-help {
161
162 font-size: small;
163 color: #666;
164
165 }
166
167 .pfbc-element {
168 position: relative;
169 }
170
171 /* Error state - semantic error message below field conveys the error */
172 /* Don't override borders/colors - let theme and user's control panel settings apply */
173 .pfbc-element-has-error .pfbc-label label {
174 color: inherit;
175 }
176
177 /* Required field indicator with ARIA */
178 .pfbc-required {
179 color: #dc3545;
180 font-weight: bold;
181 }
182
183 /* Fieldset (fieldgroup) styling - lighter border to match form inputs */
184 .accua-form fieldset {
185 border: 1px solid #ccc;
186 border-radius: 4px;
187 padding: 1em 1.25em 1em;
188 margin: 0 0 1.5em 0;
189 }
190
191 .accua-form fieldset legend {
192 padding: 0 0.5em;
193 font-weight: 600;
194 }
195
196 /* Last element in fieldset should have no bottom margin */
197 .accua-form fieldset>.pfbc-element:last-of-type {
198 margin-bottom: 0;
199 }
200
201 /* standard (labels on top) */
202 .accua-form-view-standard .pfbc-element {
203 margin-bottom: 1.25em;
204 position: relative;
205 }
206
207 .accua-form-view-standard .pfbc-label {
208 margin-bottom: 0.375em;
209 }
210
211 .accua-form-view-standard .pfbc-label label {
212 display: block;
213 width: 100%;
214 }
215
216 .accua-form-view-standard .pfbc-textbox,
217 .accua-form-view-standard .pfbc-textarea,
218 .accua-form-view-standard .pfbc-select {
219 width: 100%;
220 display: block;
221 padding: 0.5em 0.75em;
222 box-sizing: border-box;
223 font-size: 1rem;
224 line-height: 1.4;
225 border: 1px solid;
226 border-color: inherit;
227 background-color: inherit;
228 }
229
230 .accua-form-view-standard .pfbc-select {
231 padding-right: 2.5em;
232 -webkit-appearance: none;
233 -moz-appearance: none;
234 appearance: none;
235 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23333' d='M2 4l4 4 4-4'/%3E%3C/svg%3E");
236 background-repeat: no-repeat;
237 background-position: right 12px center;
238 background-size: 12px;
239 cursor: pointer;
240 }
241
242 .accua-form-view-standard .pfbc-select::-ms-expand {
243 display: none;
244 }
245
246 .accua-form-view-standard .pfbc-textarea {
247 min-height: 6em;
248 resize: vertical;
249 }
250
251 .accua-form-view-standard .pfbc-fieldwrap {
252 width: 100%;
253 display: block;
254 position: relative;
255 }
256
257 .accua-form-view-standard .pfbc-buttons {
258 text-align: right;
259 }
260
261 /* sidebyside (labels on left) */
262 /* Uses float layout (not flex) so custom JS using .css('display','block') to */
263 /* show/hide fields doesn't break the label-beside-input alignment. */
264 .accua-form-view-sidebyside .pfbc-element {
265 margin-bottom: 0.5em;
266 position: relative;
267 }
268
269 .accua-form-view-sidebyside .pfbc-element::after {
270 content: "";
271 display: table;
272 clear: both;
273 }
274
275 .accua-form-view-sidebyside .pfbc-elementbottom {
276 clear: both;
277 }
278
279 .accua-form-view-sidebyside .pfbc-label {
280 float: left;
281 width: 25%;
282 padding-top: 0.25rem;
283 padding-right: 0.5em;
284 box-sizing: border-box;
285 }
286
287 .accua-form-view-sidebyside .pfbc-label label {
288 display: block;
289 }
290
291 .accua-form-view-sidebyside .pfbc-fieldwrap {
292 margin-left: 25%;
293 position: relative;
294 }
295
296 /* Elements without a label (e.g. single checkboxes) should be left-aligned */
297 .accua-form-view-sidebyside .pfbc-element>.pfbc-fieldwrap:first-child {
298 margin-left: 0;
299 }
300
301
302 .accuaform-fieldtype-checkbox,
303 .accuaform-fieldtype-multicheckbox {
304 min-width: 1rem;
305 min-height: 1rem;
306 margin-left: 0;
307 }
308
309
310 .accua-form-view-sidebyside .pfbc-textbox,
311 .accua-form-view-sidebyside .pfbc-textarea,
312 .accua-form-view-sidebyside .pfbc-select {
313 width: 100%;
314 display: block;
315 padding: 0.5em 0.75em;
316 box-sizing: border-box;
317 font-size: 1rem;
318 line-height: 1.4;
319 border: 1px solid;
320 border-color: inherit;
321 background-color: inherit;
322 }
323
324 .accua-form-view-sidebyside .pfbc-select {
325 padding-right: 2.5em;
326 -webkit-appearance: none;
327 -moz-appearance: none;
328 appearance: none;
329 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23333' d='M2 4l4 4 4-4'/%3E%3C/svg%3E");
330 background-repeat: no-repeat;
331 background-position: right 12px center;
332 background-size: 12px;
333 cursor: pointer;
334 }
335
336 .accua-form-view-sidebyside .pfbc-select::-ms-expand {
337 display: none;
338 }
339
340 .accua-form-view-sidebyside .pfbc-textarea {
341 min-height: 6em;
342 resize: vertical;
343 }
344
345 .accua-form-view-sidebyside .pfbc-buttons {
346 text-align: right;
347 }
348
349 .pfbc-error {
350 padding: .5em;
351 margin-bottom: 1em;
352 }
353
354 .pfbc-error ul {
355 padding-left: 1.75em;
356 margin: 0;
357 margin-top: .25em;
358 }
359
360 /* .pfbc-checkbox {
361 padding: 0.5em 0;
362 border-bottom: 1px solid #f4f4f4;
363 } */
364
365 /* Accessibility: Focus styles for keyboard navigation */
366 .pfbc-textbox:focus,
367 .pfbc-textarea:focus,
368 .pfbc-select:focus,
369 input[type="checkbox"]:focus,
370 input[type="radio"]:focus,
371 button:focus {
372 outline: 3px solid #0066cc;
373 outline-offset: 2px;
374 }
375
376
377 .accua-form .pfbc-element input.wp-color-picker {
378 margin-bottom: 0;
379 background-color: transparent;
380 padding: 1px 0;
381 color: inherit;
382 font-size: inherit;
383 /* Let theme and user's control panel settings handle borders */
384 }
385
386 /* HTML5 Color Picker Styling */
387 .pfbc-color-wrapper {
388 display: flex;
389 align-items: center;
390 gap: 0.75em;
391 }
392
393 .accua-form .pfbc-color-input {
394 /* Match height of text inputs */
395 width: 3em;
396 height: 2.5em;
397 min-height: 2.5em;
398 padding: 0.25em;
399 border: 1px solid #767676;
400 border-radius: 4px;
401 cursor: pointer;
402 /* Remove browser default styling */
403 -webkit-appearance: none;
404 -moz-appearance: none;
405 appearance: none;
406 background: transparent;
407 }
408
409 /* Remove the inner color swatch border in WebKit browsers */
410 .pfbc-color-input::-webkit-color-swatch-wrapper {
411 padding: 0;
412 }
413
414 .pfbc-color-input::-webkit-color-swatch {
415 border: none;
416 border-radius: 2px;
417 }
418
419 /* Firefox color swatch */
420 .pfbc-color-input::-moz-color-swatch {
421 border: none;
422 border-radius: 2px;
423 }
424
425 /* Focus state for accessibility */
426 .pfbc-color-input:focus {
427 outline: 2px solid #0073aa;
428 outline-offset: 2px;
429 }
430
431 .pfbc-color-hex {
432 font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
433 font-size: 0.9em;
434 color: #555;
435 min-width: 5.5em;
436 letter-spacing: 0.02em;
437 }
438
439 /* Inline label mode adjustments for color picker */
440 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .pfbc-color-wrapper {
441 padding-top: 0.5em;
442 }
443
444 #recaptcha_table {
445 table-layout: auto;
446 }
447
448 @media (min-width: 300px) and (max-width: 400px) {
449 .accua_forms_recaptcha2_container {
450 transform: scale(0.75);
451 transform-origin: 0 0;
452 }
453 }
454
455 @media (max-width: 300px) {
456 .accua_forms_recaptcha2_container {
457 transform: scale(0.6);
458 transform-origin: 0 0;
459 }
460 }
461
462 /* ========================================================================
463 Inline Label Layout - Material Design Inspired Floating Labels
464 ======================================================================== */
465
466 /**
467 * Inline Label Layout with Floating Labels
468 *
469 * This layout implements Material Design-inspired floating labels that:
470 * - Start inside the input field (inline)
471 * - Float to the top border when focused or filled
472 * - Use smooth transitions (200ms)
473 * - Maintain accessibility (WCAG 2.1 AAA compliant)
474 * - Prevent layout shift and flickering
475 */
476
477 .accua-form-view-inlinelabel .pfbc-element {
478 margin-bottom: 1em;
479 }
480
481 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper {
482 position: relative;
483 width: 100%;
484 }
485
486 /* Input field styling with space for floating label */
487 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .pfbc-textbox,
488 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .pfbc-textarea,
489 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .pfbc-select {
490 width: 100%;
491 /* Balanced padding: top slightly larger for label space, but visually centered */
492 padding: 1em 0.75em 0.85em 0.75em;
493 box-sizing: border-box;
494 /* Use CSS variable for border color to ensure consistency across all inputs */
495 /* This prevents issues where color:transparent (used for date placeholder hiding) */
496 /* would make borders invisible when using border-color: inherit */
497 border: 1px solid var(--accua-form-input-border-color);
498 /* Increase font size for better readability */
499 font-size: 1rem;
500 line-height: 1.2;
501 background-color: inherit;
502 }
503
504 /* Add right padding to select elements for caret spacing */
505 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .pfbc-select {
506 padding-right: 2.5em;
507 /* Remove native appearance for consistent cross-browser styling */
508 -webkit-appearance: none;
509 -moz-appearance: none;
510 appearance: none;
511 /* Custom dropdown caret using CSS */
512 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23333' d='M2 4l4 4 4-4'/%3E%3C/svg%3E");
513 background-repeat: no-repeat;
514 background-position: right 12px center;
515 background-size: 12px;
516 cursor: pointer;
517 /* Firefox-specific fixes for dropdown rendering */
518 text-indent: 0.01px;
519 text-overflow: '';
520 }
521
522 /* Firefox-specific: ensure dropdown opens properly with appearance:none */
523 @-moz-document url-prefix() {
524 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .pfbc-select {
525 /* Firefox needs explicit color to render dropdown properly */
526 color: inherit;
527 }
528 }
529
530 /* Remove IE's native arrow */
531 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .pfbc-select::-ms-expand {
532 display: none;
533 }
534
535 /* Textarea specific adjustments */
536 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .pfbc-textarea {
537 min-height: 6em;
538 resize: vertical;
539 }
540
541 /* Floating label - starts inside the field, vertically centered for inputs */
542 /* Uses fixed position (1.6em from top) instead of 50% to prevent shift when error appears */
543 /* Calculation: input has padding 1em top + 0.85em bottom + ~1.2em line-height + border ≈ 3.15em total */
544 /* Center point ≈ 1.6em from top, adjusted for label's own height via translateY(-50%) */
545 .accua-form-view-inlinelabel .pfbc-floating-label {
546 position: absolute;
547 left: 0.75em;
548 top: 1.6em;
549 /* Fixed position = center of input, independent of wrapper height */
550 font-size: 1rem;
551 pointer-events: none;
552 transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);
553 transform: translateY(-50%);
554 transform-origin: left center;
555 padding: 0;
556 z-index: 1;
557 max-width: calc(100% - 1.5em);
558 overflow: hidden;
559 text-overflow: ellipsis;
560 white-space: nowrap;
561 opacity: 0.6;
562 }
563
564 /* Textarea label - position at top instead of center */
565 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper:has(.pfbc-textarea) .pfbc-floating-label {
566 top: 1.25em;
567 transform: translateY(0);
568 }
569
570 /* Floating label - when field is focused or has value */
571 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper.is-focused .pfbc-floating-label,
572 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper.has-value .pfbc-floating-label {
573 top: 0;
574 left: 0.625em;
575 font-size: 0.75em;
576 opacity: 1;
577 background-color: var(--wp--preset--color--base, #fff);
578 padding: 0 0.375em;
579 transform: translateY(-50%);
580 max-width: calc(100% - 1.5em);
581 }
582
583 /* Description text below field */
584 .accua-form-view-inlinelabel .pfbc-description {
585 margin-top: 0.375em;
586 font-size: 0.875em;
587 line-height: 1.4;
588 opacity: 0.7;
589 }
590
591 /* Required asterisk */
592 .accua-form-view-inlinelabel .pfbc-floating-label .pfbc-required {
593 opacity: 0.85;
594 }
595
596 /* Fieldwrap for inline labels */
597 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .pfbc-fieldwrap {
598 position: relative;
599 width: 100%;
600 display: block;
601 padding-bottom: 0;
602 }
603
604 /* Standard labels for checkboxes, radios, file inputs */
605 .accua-form-view-inlinelabel .pfbc-label {
606 margin-bottom: 0.5em;
607 display: block;
608 }
609
610 .accua-form-view-inlinelabel .pfbc-label label {
611 display: block;
612 font-weight: 500;
613 }
614
615 /* Buttons */
616 .accua-form-view-inlinelabel .pfbc-buttons {
617 text-align: right;
618 margin-top: 1.5em;
619 }
620
621 /* Accessibility: High contrast mode support */
622 @media (prefers-contrast: high) {
623 .accua-form-view-inlinelabel .pfbc-floating-label {
624 font-weight: 600;
625 opacity: 1;
626 }
627 }
628
629 /* Accessibility: Reduced motion support */
630 @media (prefers-reduced-motion: reduce) {
631 .accua-form-view-inlinelabel .pfbc-floating-label {
632 transition: none;
633 }
634 }
635
636 /* Hide placeholders and date field text when unfocused (prevents overlap with label) */
637 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .pfbc-textbox::placeholder,
638 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .pfbc-textarea::placeholder {
639 opacity: 0;
640 transition: opacity 200ms;
641 }
642
643 /* Hide date input placeholder text in all browsers */
644 /* WebKit browsers (Chrome, Safari, Edge) */
645 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper input[type="date"]::-webkit-datetime-edit-text,
646 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper input[type="date"]::-webkit-datetime-edit-month-field,
647 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper input[type="date"]::-webkit-datetime-edit-day-field,
648 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper input[type="date"]::-webkit-datetime-edit-year-field {
649 opacity: 0;
650 }
651
652 /* Firefox fallback - use color transparent to hide placeholder when empty */
653 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper input[type="date"]:not(.has-value):not(:focus) {
654 color: transparent;
655 opacity: 1;
656 }
657
658 /* Show placeholders when focused or has value */
659 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper.is-focused .pfbc-textbox::placeholder,
660 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper.is-focused .pfbc-textarea::placeholder,
661 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper.has-value .pfbc-textbox::placeholder,
662 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper.has-value .pfbc-textarea::placeholder {
663 opacity: 0.5;
664 }
665
666 /* Show date input text when focused or has value */
667 /* WebKit browsers */
668 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper.is-focused input[type="date"]::-webkit-datetime-edit-text,
669 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper.is-focused input[type="date"]::-webkit-datetime-edit-month-field,
670 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper.is-focused input[type="date"]::-webkit-datetime-edit-day-field,
671 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper.is-focused input[type="date"]::-webkit-datetime-edit-year-field,
672 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper.has-value input[type="date"]::-webkit-datetime-edit-text,
673 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper.has-value input[type="date"]::-webkit-datetime-edit-month-field,
674 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper.has-value input[type="date"]::-webkit-datetime-edit-day-field,
675 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper.has-value input[type="date"]::-webkit-datetime-edit-year-field {
676 opacity: 1;
677 }
678
679 /* Firefox fallback - show color when focused or has value */
680 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper input[type="date"]:focus,
681 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper input[type="date"].has-value {
682 color: inherit;
683 }
684
685 /* Date input - ensure consistent height and picker icon alignment */
686 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper input[type="date"] {
687 /* Same padding as other inputs */
688 padding: 1em 0.75em 0.85em 0.75em;
689 cursor: pointer;
690 /* Use same font as other inputs for consistency and accessibility */
691 font-family: inherit;
692 font-size: 1rem;
693 }
694
695 /* Style the native calendar picker in WebKit browsers (Chrome, Safari, Edge) */
696 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper input[type="date"]::-webkit-calendar-picker-indicator {
697 cursor: pointer;
698 opacity: 0.6;
699 padding: 0;
700 margin: 0;
701 }
702
703 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper input[type="date"]::-webkit-calendar-picker-indicator:hover {
704 opacity: 1;
705 }
706
707 /* ==========================================================================
708 File Upload - Accessible Drag & Drop
709 WCAG 2.2 AA Compliant / European Accessibility Act
710 ========================================================================== */
711
712 /* Wrapper */
713 .accua-file-upload-wrapper {
714 position: relative;
715 width: 100%;
716 }
717
718 /* Dropzone */
719 .accua-file-dropzone {
720 display: flex;
721 flex-direction: column;
722 align-items: center;
723 justify-content: center;
724 min-height: 120px;
725 padding: 1.5rem 1rem;
726 border: 2px dashed #ccc;
727 background-color: #fafafa;
728 cursor: pointer;
729 transition: border-color 0.2s ease, background-color 0.2s ease;
730 text-align: center;
731 }
732
733 /* Dropzone hover state */
734 .accua-file-dropzone:hover {
735 border-color: #999;
736 background-color: #f5f5f5;
737 }
738
739 /* Dropzone focus state - WCAG 2.2 AA requires visible focus indicator */
740 .accua-file-dropzone:focus,
741 .accua-file-dropzone-focused {
742 outline: 3px solid #005fcc;
743 outline-offset: 2px;
744 border-color: #005fcc;
745 }
746
747 /* Dropzone drag-over state */
748 .accua-file-dropzone-drag {
749 border-color: #005fcc;
750 background-color: #e8f4ff;
751 border-style: solid;
752 }
753
754 /* Dropzone text */
755 .accua-file-dropzone-text {
756 color: #666;
757 font-size: 0.95rem;
758 line-height: 1.5;
759 }
760
761 /* Dropzone icon */
762 .accua-file-dropzone-icon {
763 font-size: 1.5rem;
764 display: block;
765 margin-bottom: 0.5rem;
766 }
767
768 /* Browse button styling */
769 .accua-file-browse-btn {
770 color: #005fcc;
771 text-decoration: underline;
772 cursor: pointer;
773 font-weight: 500;
774 }
775
776 .accua-file-browse-btn:hover {
777 color: #003d99;
778 text-decoration: none;
779 }
780
781 /* Hide the native file input visually but keep it accessible */
782 .accua-file-upload-wrapper input[type="file"] {
783 position: absolute !important;
784 width: 1px !important;
785 height: 1px !important;
786 padding: 0 !important;
787 margin: -1px !important;
788 overflow: hidden !important;
789 clip: rect(0, 0, 0, 0) !important;
790 white-space: nowrap !important;
791 border: 0 !important;
792 opacity: 0 !important;
793 }
794
795 /* File list */
796 .accua-file-list {
797 margin-top: 0.75rem;
798 }
799
800 .accua-file-list-items {
801 list-style: none;
802 margin: 0;
803 padding: 0;
804 }
805
806 .accua-file-list-item {
807 display: flex;
808 align-items: center;
809 justify-content: space-between;
810 padding: 0.5rem 0.75rem;
811 margin-bottom: 0.25rem;
812 background-color: #f0f0f0;
813 font-size: 0.9rem;
814 }
815
816 .accua-file-info {
817 flex: 1;
818 min-width: 0;
819 overflow: hidden;
820 text-overflow: ellipsis;
821 white-space: nowrap;
822 color: #333;
823 }
824
825 /* Remove file button */
826 .accua-file-remove-btn {
827 flex-shrink: 0;
828 display: inline-flex;
829 align-items: center;
830 justify-content: center;
831 width: 24px;
832 height: 24px;
833 margin-left: 0.5rem;
834 padding: 0;
835 border: none;
836 border-radius: 50%;
837 background-color: #dc3545;
838 color: #fff;
839 font-size: 1rem;
840 line-height: 1;
841 cursor: pointer;
842 transition: background-color 0.2s ease;
843 }
844
845 .accua-file-remove-btn:hover {
846 background-color: #c82333;
847 }
848
849 .accua-file-remove-btn:focus {
850 outline: 3px solid #005fcc;
851 outline-offset: 2px;
852 }
853
854 /* Screen reader only text */
855 .accua-file-sr-announcement,
856 .screen-reader-text {
857 position: absolute;
858 width: 1px;
859 height: 1px;
860 padding: 0;
861 margin: -1px;
862 overflow: hidden;
863 clip: rect(0, 0, 0, 0);
864 white-space: nowrap;
865 border: 0;
866 }
867
868 /* File upload error display */
869 .accua-file-error {
870 margin-top: 0.5rem;
871 padding: 0.5rem 0.75rem;
872 background-color: #fef2f2;
873 border: 1px solid #dc3545;
874 color: #991b1b;
875 font-size: 0.875rem;
876 line-height: 1.4;
877 }
878
879 /* ============================================
880 Form Success/Error Message Container
881 ============================================ */
882
883 /* Anchor elements - invisible but provide scroll targets */
884 .accua-form-anchor {
885 display: block;
886 position: relative;
887 top: -1em;
888 /* Offset so message isn't hidden under fixed headers */
889 visibility: hidden;
890 height: 0;
891 }
892
893 /* Message container - appears above form after submission */
894 .accua-form-messages {
895 margin-bottom: 1.5em;
896 animation: accua-message-appear 0.4s ease-out;
897 }
898
899 /* Empty state - hide container completely */
900 .accua-form-messages:empty {
901 display: none;
902 margin: 0;
903 padding: 0;
904 }
905
906 /* Ensure content inside messages has reasonable typography */
907 .accua-form-messages h2,
908 .accua-form-messages h3 {
909 margin-top: 0;
910 margin-bottom: 0.5em;
911 }
912
913 .accua-form-messages p {
914 margin-bottom: 0.75em;
915 }
916
917 .accua-form-messages p:last-child {
918 margin-bottom: 0;
919 }
920
921 /* Smooth fade-in animation for message appearance */
922 @keyframes accua-message-appear {
923 0% {
924 opacity: 0;
925 transform: translateY(-0.5em);
926 }
927
928 100% {
929 opacity: 1;
930 transform: translateY(0);
931 }
932 }
933
934 /* Respect user preference for reduced motion */
935 @media (prefers-reduced-motion: reduce) {
936 .accua-form-messages {
937 animation: none;
938 }
939 }
940
941 .accua-file-error-item {
942 display: block;
943 }
944
945 .accua-file-error-item strong {
946 font-weight: 600;
947 }
948
949 /* Error state for dropzone when file error occurs */
950 .accua-file-upload-wrapper.has-file-error .accua-file-dropzone {
951 border-color: #dc3545;
952 }
953
954 /* Floating label compatibility - ensure wrapper doesn't break floating label layout */
955 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .accua-file-upload-wrapper {
956 width: 100%;
957 }
958
959 /* Remove default label float behavior for file inputs since we have custom dropzone */
960 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper:has(.accua-file-upload-wrapper) .pfbc-label {
961 position: static;
962 transform: none;
963 font-size: inherit;
964 margin-bottom: 0.5rem;
965 display: block;
966 }
967
968 /* Error state for dropzone */
969 .accua-file-upload-wrapper.has-error .accua-file-dropzone {
970 border-color: #dc3545;
971 background-color: #fff5f5;
972 }
973
974 /* Admin form builder styles - match the admin theme */
975 .wp-admin .accua-file-dropzone {
976 background-color: #f6f7f7;
977 border-color: #c3c4c7;
978 }
979
980 .wp-admin .accua-file-dropzone:hover {
981 border-color: #8c8f94;
982 background-color: #f0f0f1;
983 }
984
985 .wp-admin .accua-file-dropzone:focus,
986 .wp-admin .accua-file-dropzone-focused {
987 outline-color: #2271b1;
988 border-color: #2271b1;
989 }
990
991 .wp-admin .accua-file-dropzone-drag {
992 border-color: #2271b1;
993 background-color: #f0f7fc;
994 }
995
996 .wp-admin .accua-file-browse-btn {
997 color: #2271b1;
998 }
999
1000 .wp-admin .accua-file-browse-btn:hover {
1001 color: #135e96;
1002 }
1003
1004 /* ==========================================================================
1005 Validation Summary Area
1006 WCAG 2.2 AA / European Accessibility Act compliant
1007 ========================================================================== */
1008
1009 .pfbc-validation-summary {
1010 padding: 1em 1.25em;
1011 margin-top: 1em;
1012 border: 1px solid;
1013 font-size: 0.9375rem;
1014 line-height: 1.5;
1015 /* Smooth transitions between states (loading → success/error) */
1016 transition: background-color 0.25s ease-out,
1017 border-color 0.25s ease-out,
1018 color 0.25s ease-out,
1019 opacity 0.25s ease-out;
1020 }
1021
1022 /* Loading state - neutral blue color scheme */
1023 .pfbc-validation-loading {
1024 background-color: #eff6ff;
1025 border-color: #3b82f6;
1026 color: #1e40af;
1027 }
1028
1029 .pfbc-validation-loading .pfbc-summary-spinner {
1030 display: inline-block;
1031 width: 1em;
1032 height: 1em;
1033 border: 2px solid currentColor;
1034 border-right-color: transparent;
1035 border-radius: 50%;
1036 animation: accua-spinner-rotate 0.75s linear infinite;
1037 vertical-align: -0.125em;
1038 margin-right: 0.5em;
1039 }
1040
1041 .pfbc-validation-error {
1042 background-color: #fef2f2;
1043 border-color: #dc3545;
1044 color: #991b1b;
1045 }
1046
1047 .pfbc-validation-success {
1048 background-color: #f0fdf4;
1049 border-color: #22c55e;
1050 color: #166534;
1051 }
1052
1053 .pfbc-summary-icon {
1054 font-weight: bold;
1055 margin-right: 0.25em;
1056 }
1057
1058 .pfbc-summary-header {
1059 margin: 0 0 0.5em 0;
1060 font-weight: 600;
1061 font-size: 0.9375rem;
1062 }
1063
1064 .pfbc-summary-list {
1065 margin: 0;
1066 padding-left: 1.5em;
1067 list-style-type: disc;
1068 }
1069
1070 .pfbc-summary-list li {
1071 margin-bottom: 0.25em;
1072 font-size: 0.875rem;
1073 }
1074
1075 .pfbc-summary-list li:last-child {
1076 margin-bottom: 0;
1077 }
1078
1079 .pfbc-summary-link {
1080 color: inherit;
1081 text-decoration: underline;
1082 font-weight: 500;
1083 }
1084
1085 .pfbc-summary-link:hover,
1086 .pfbc-summary-link:focus {
1087 text-decoration: none;
1088 outline: 2px solid currentColor;
1089 outline-offset: 2px;
1090 }
1091
1092 /* Respect user preference for reduced motion (EAA compliance) */
1093 @media (prefers-reduced-motion: reduce) {
1094 .pfbc-validation-summary {
1095 transition: none;
1096 }
1097
1098 .pfbc-validation-loading .pfbc-summary-spinner {
1099 animation: none;
1100 /* Show static spinner for users who prefer no motion */
1101 border-right-color: currentColor;
1102 opacity: 0.5;
1103 }
1104 }
1105
1106 /* ============================================
1107 Post Select - Searchable Dropdown
1108 WCAG 2.2 AA / European Accessibility Act compliant
1109 @since 2.0.0-beta.29
1110 ============================================ */
1111
1112 /* Wrapper - contains both native select (pre-JS) and custom UI (post-JS) */
1113 .pfbc-post-select-wrapper {
1114 position: relative;
1115 width: 100%;
1116 }
1117
1118 /* Native select BEFORE JS enhancement - styled like regular select for no flash */
1119 .pfbc-post-select-wrapper[data-enhanced="false"]>select {
1120 /* Use native select appearance initially - matches other selects */
1121 width: 100%;
1122 display: block;
1123 }
1124
1125 /* Hide native select AFTER JS enhancement runs - keep accessible for form submission */
1126 .pfbc-post-select-wrapper[data-enhanced="true"]>select {
1127 position: absolute;
1128 inset: 0;
1129 width: 100%;
1130 height: 100%;
1131 opacity: 0;
1132 pointer-events: none;
1133 display: block;
1134 }
1135
1136 /* Container for custom dropdown */
1137 .pfbc-post-select-container {
1138 position: relative;
1139 width: 100%;
1140 }
1141
1142 /* Trigger button - matches standard select styling */
1143 .pfbc-post-select-trigger {
1144 display: flex;
1145 align-items: center;
1146 justify-content: space-between;
1147 width: 100%;
1148 padding: 0.5em 0.75em;
1149 padding-right: 2.5em;
1150 font-size: 1rem;
1151 line-height: 1.4;
1152 color: inherit;
1153 background-color: #fff;
1154 border: 1px solid;
1155 border-color: inherit;
1156 border-radius: 0;
1157 cursor: pointer;
1158 text-align: left;
1159 box-sizing: border-box;
1160 font-family: inherit;
1161 appearance: none;
1162 -webkit-appearance: none;
1163 position: relative;
1164 }
1165
1166 .pfbc-post-select-trigger:hover {
1167 border-color: #888;
1168 }
1169
1170 .pfbc-post-select-trigger:focus {
1171 outline: 2px solid #0073aa;
1172 outline-offset: -2px;
1173 }
1174
1175 /* Invalid state for validation errors */
1176 .pfbc-post-select-trigger.pfbc-invalid {
1177 border-color: #c00;
1178 }
1179
1180 /* Arrow indicator */
1181 .pfbc-post-select-arrow {
1182 position: absolute;
1183 right: 12px;
1184 top: 50%;
1185 transform: translateY(-50%);
1186 width: 0;
1187 height: 0;
1188 border-left: 5px solid transparent;
1189 border-right: 5px solid transparent;
1190 border-top: 5px solid currentColor;
1191 pointer-events: none;
1192 }
1193
1194 .pfbc-post-select-container.open .pfbc-post-select-arrow {
1195 border-top: none;
1196 border-bottom: 5px solid currentColor;
1197 }
1198
1199 /* Display text */
1200 .pfbc-post-select-text {
1201 flex: 1;
1202 overflow: hidden;
1203 text-overflow: ellipsis;
1204 white-space: nowrap;
1205 }
1206
1207 /* Dropdown panel */
1208 .pfbc-post-select-dropdown {
1209 position: absolute;
1210 top: 100%;
1211 left: 0;
1212 right: 0;
1213 z-index: 9999;
1214 background: #fff;
1215 border: 1px solid;
1216 border-color: inherit;
1217 border-top: none;
1218 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
1219 max-height: 300px;
1220 display: flex;
1221 flex-direction: column;
1222 }
1223
1224 /* Search input container */
1225 .pfbc-post-select-search {
1226 padding: 0.5em;
1227 border-bottom: 1px solid #eee;
1228 background: #fafafa;
1229 }
1230
1231 .pfbc-post-select-search-input {
1232 width: 100%;
1233 padding: 0.5em 0.75em;
1234 font-size: 0.9375rem;
1235 line-height: 1.4;
1236 border: 1px solid #ccc;
1237 border-radius: 0;
1238 box-sizing: border-box;
1239 font-family: inherit;
1240 background-color: #fff;
1241 color: inherit;
1242 }
1243
1244 .pfbc-post-select-search-input::placeholder {
1245 color: #999;
1246 }
1247
1248 .pfbc-post-select-search-input:focus {
1249 outline: 2px solid #0073aa;
1250 outline-offset: -2px;
1251 border-color: #ccc;
1252 }
1253
1254 /* Options list */
1255 .pfbc-post-select-options {
1256 list-style: none;
1257 margin: 0;
1258 padding: 0;
1259 overflow-y: auto;
1260 max-height: 220px;
1261 flex: 1;
1262 }
1263
1264 /* Individual option */
1265 .pfbc-post-select-option {
1266 padding: 0.5em 0.75em;
1267 cursor: pointer;
1268 font-size: 1rem;
1269 line-height: 1.4;
1270 }
1271
1272 .pfbc-post-select-option:hover,
1273 .pfbc-post-select-option.highlighted {
1274 background-color: #f0f0f0;
1275 }
1276
1277 .pfbc-post-select-option.selected {
1278 background-color: #0073aa;
1279 color: #fff;
1280 }
1281
1282 .pfbc-post-select-option.selected:hover,
1283 .pfbc-post-select-option.selected.highlighted {
1284 background-color: #005a87;
1285 }
1286
1287 /* No results message */
1288 .pfbc-post-select-no-results {
1289 padding: 1em;
1290 text-align: center;
1291 color: #666;
1292 font-style: italic;
1293 }
1294
1295 /* Loading indicator */
1296 .pfbc-post-select-loading {
1297 padding: 0.75em;
1298 text-align: center;
1299 color: #666;
1300 font-size: 0.875rem;
1301 background: #f9f9f9;
1302 border-top: 1px solid #eee;
1303 }
1304
1305 .pfbc-post-select-loading::before {
1306 content: '';
1307 display: inline-block;
1308 width: 1em;
1309 height: 1em;
1310 border: 2px solid currentColor;
1311 border-right-color: transparent;
1312 border-radius: 50%;
1313 animation: accua-spinner-rotate 0.75s linear infinite;
1314 vertical-align: -0.125em;
1315 margin-right: 0.5em;
1316 }
1317
1318 /* Screen reader only - live region */
1319 .pfbc-post-select-live-region {
1320 position: absolute;
1321 width: 1px;
1322 height: 1px;
1323 padding: 0;
1324 margin: -1px;
1325 overflow: hidden;
1326 clip: rect(0, 0, 0, 0);
1327 white-space: nowrap;
1328 border: 0;
1329 }
1330
1331 /* Focus visible for keyboard users */
1332 .pfbc-post-select-option:focus-visible {
1333 outline: 2px solid #0073aa;
1334 outline-offset: -2px;
1335 }
1336
1337 /* High contrast mode support */
1338 @media (prefers-contrast: high) {
1339 .pfbc-post-select-trigger {
1340 border-width: 2px;
1341 }
1342
1343 .pfbc-post-select-dropdown {
1344 border-width: 2px;
1345 }
1346
1347 .pfbc-post-select-option.highlighted {
1348 outline: 2px solid currentColor;
1349 }
1350 }
1351
1352 /* Reduced motion support */
1353 @media (prefers-reduced-motion: reduce) {
1354 .pfbc-post-select-loading::before {
1355 animation: none;
1356 border-right-color: currentColor;
1357 opacity: 0.5;
1358 }
1359 }
1360
1361 /* ============================================
1362 Post Select - Inline Label Mode (Floating Labels)
1363 Material Design inspired integration
1364 ============================================ */
1365
1366 /* Trigger button styling for inline label mode - matches .pfbc-select */
1367 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .pfbc-post-select-trigger {
1368 /* Match the padding from .pfbc-select in inline mode */
1369 padding: 1em 0.75em 0.85em 0.75em;
1370 padding-right: 2.5em;
1371 font-size: 1rem;
1372 line-height: 1.2;
1373 width: 100%;
1374 box-sizing: border-box;
1375 /* Override flex display to block for consistent height calculation */
1376 display: block;
1377 text-align: left;
1378 /* Ensure consistent border styling */
1379 border: 1px solid;
1380 border-color: inherit;
1381 }
1382
1383 /* Text span needs inline-block to maintain height when empty */
1384 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .pfbc-post-select-text {
1385 display: inline-block;
1386 min-height: 1.2em;
1387 /* Match line-height to ensure consistent height when empty */
1388 vertical-align: middle;
1389 }
1390
1391 /* Arrow styling for inline labels - use SVG instead of CSS triangle */
1392 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .pfbc-post-select-arrow {
1393 right: 12px;
1394 top: 50%;
1395 width: 12px;
1396 height: 12px;
1397 border: none;
1398 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23333' d='M2 4l4 4 4-4'/%3E%3C/svg%3E");
1399 background-repeat: no-repeat;
1400 background-position: center;
1401 background-size: 100%;
1402 }
1403
1404 /* Post-select uses same floating label behavior as regular select:
1405 - Label inside field when empty
1406 - Label floats to border when has value or focused
1407 No special CSS needed - inherits from .pfbc-inline-label-wrapper.has-value rules */
1408
1409 /* Container must not have margins that would shift the label */
1410 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .pfbc-post-select-container {
1411 width: 100%;
1412 }
1413
1414 /* Ensure wrapper is properly positioned */
1415 .accua-form-view-inlinelabel .pfbc-inline-label-wrapper .pfbc-post-select-wrapper {
1416 width: 100%;
1417 display: block;
1418 }
1419
1420 /* ============================================
1421 Post Select - Standard Label Mode (Labels on Top)
1422 ============================================ */
1423
1424 .accua-form-view-standard .pfbc-post-select-wrapper {
1425 width: 100%;
1426 }
1427
1428 .accua-form-view-standard .pfbc-post-select-trigger {
1429 width: 100%;
1430 }
1431
1432 /* ============================================
1433 Post Select - Sidebyside Label Mode (Labels on Left)
1434 ============================================ */
1435
1436 .accua-form-view-sidebyside .pfbc-post-select-wrapper {
1437 width: 100%;
1438 }
1439
1440 .accua-form-view-sidebyside .pfbc-post-select-trigger {
1441 width: 100%;
1442 }
1443
1444 /* ============================================
1445 Post Select - Inline Form Mode
1446 ============================================ */
1447
1448 .accua-form-view-inline .pfbc-post-select-trigger {
1449 width: auto;
1450 min-width: 200px;
1451 }
1452
1453 /* ============================================
1454 Turnstile CAPTCHA
1455 ============================================ */
1456
1457 .cf-turnstile iframe {
1458 border: none;
1459 }