@usefillo/react 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +93 -14
- package/dist/index.js +798 -339
- package/dist/styles.css +257 -57
- package/dist/styles.unlayered.css +257 -57
- package/package.json +4 -3
package/dist/styles.css
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* so you can theme with variables, override classes, or skip this file and
|
|
5
5
|
* style from scratch.
|
|
6
6
|
*
|
|
7
|
-
* SYNC: packages/dom/src/styles.css is
|
|
7
|
+
* SYNC: packages/dom/src/styles.css is byte-for-byte identical to this file
|
|
8
8
|
* (@usefillo/dom builds its published CSS from its own copy via
|
|
9
9
|
* scripts/build-css.mjs --src src/styles.css). Edit BOTH together.
|
|
10
10
|
*/
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
@layer components {
|
|
22
22
|
.fillo-form {
|
|
23
|
+
color-scheme: light;
|
|
23
24
|
--fillo-primary: #18181b;
|
|
24
25
|
--fillo-primary-contrast: #ffffff;
|
|
25
26
|
--fillo-bg: transparent;
|
|
@@ -46,6 +47,7 @@
|
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
.fillo-form[data-fillo-color-scheme="dark"] {
|
|
50
|
+
color-scheme: dark;
|
|
49
51
|
--fillo-primary: #fafafa;
|
|
50
52
|
--fillo-primary-contrast: #18181b;
|
|
51
53
|
--fillo-text: #f4f4f5;
|
|
@@ -59,7 +61,8 @@
|
|
|
59
61
|
|
|
60
62
|
@media (prefers-color-scheme: dark) {
|
|
61
63
|
.fillo-form:not([data-fillo-color-scheme="light"]):not([data-fillo-has-color-theme]) {
|
|
62
|
-
|
|
64
|
+
color-scheme: dark;
|
|
65
|
+
--fillo-primary: #fafafa;
|
|
63
66
|
--fillo-primary-contrast: #18181b;
|
|
64
67
|
--fillo-text: #f4f4f5;
|
|
65
68
|
--fillo-muted: #a1a1aa;
|
|
@@ -110,6 +113,38 @@
|
|
|
110
113
|
:where(.fillo-field--error) .fillo-input { border-color: var(--fillo-error); }
|
|
111
114
|
.fillo-textarea { resize: vertical; min-height: 6rem; }
|
|
112
115
|
|
|
116
|
+
/* Number field adornments: the wrapper draws the field's box (border/
|
|
117
|
+
radius/focus, mirrors .fillo-input above) and the nested input goes
|
|
118
|
+
borderless so prefix/suffix read as inside one control, not stacked
|
|
119
|
+
beside it like the phone field's country picker. */
|
|
120
|
+
.fillo-number {
|
|
121
|
+
display: flex;
|
|
122
|
+
align-items: center;
|
|
123
|
+
gap: 0.3rem;
|
|
124
|
+
box-sizing: border-box;
|
|
125
|
+
min-height: 2.5rem;
|
|
126
|
+
background: var(--fillo-control-bg);
|
|
127
|
+
border: 1px solid var(--fillo-border);
|
|
128
|
+
border-radius: var(--fillo-radius);
|
|
129
|
+
padding: 0.6rem 0.8rem;
|
|
130
|
+
transition: border-color 120ms ease, box-shadow 120ms ease;
|
|
131
|
+
}
|
|
132
|
+
.fillo-number:focus-within {
|
|
133
|
+
border-color: var(--fillo-primary);
|
|
134
|
+
box-shadow: 0 0 0 3px color-mix(in srgb, var(--fillo-primary) 15%, transparent);
|
|
135
|
+
}
|
|
136
|
+
:where(.fillo-field--error) .fillo-number { border-color: var(--fillo-error); }
|
|
137
|
+
:where(.fillo-number) .fillo-input {
|
|
138
|
+
flex: 1 1 auto;
|
|
139
|
+
min-width: 0;
|
|
140
|
+
min-height: 0;
|
|
141
|
+
border: none;
|
|
142
|
+
background: transparent;
|
|
143
|
+
padding: 0;
|
|
144
|
+
}
|
|
145
|
+
:where(.fillo-number) .fillo-input:focus-visible { box-shadow: none; }
|
|
146
|
+
.fillo-number-prefix, .fillo-number-suffix { flex: 0 0 auto; color: var(--fillo-muted); }
|
|
147
|
+
|
|
113
148
|
/* Phone field: country picker + national input */
|
|
114
149
|
.fillo-phone { position: relative; display: flex; align-items: stretch; gap: 0.4rem; }
|
|
115
150
|
.fillo-phone-country { position: relative; flex: 0 0 auto; }
|
|
@@ -132,7 +167,7 @@
|
|
|
132
167
|
.fillo-phone-input { flex: 1 1 auto; min-width: 0; }
|
|
133
168
|
:where(.fillo-field--error) .fillo-phone-flag { border-color: var(--fillo-error); }
|
|
134
169
|
.fillo-phone-popover {
|
|
135
|
-
position: absolute; z-index: 30; top: calc(100% + 0.3rem);
|
|
170
|
+
position: absolute; z-index: 30; top: calc(100% + 0.3rem); inset-inline-start: 0;
|
|
136
171
|
width: min(18rem, calc(100vw - 1rem));
|
|
137
172
|
max-width: var(--fillo-phone-popover-max-width, 84vw);
|
|
138
173
|
max-height: min(var(--fillo-phone-popover-max-height, 20rem), calc(100vh - 1rem));
|
|
@@ -171,13 +206,13 @@
|
|
|
171
206
|
}
|
|
172
207
|
.fillo-select {
|
|
173
208
|
cursor: pointer;
|
|
174
|
-
padding-
|
|
209
|
+
padding-inline-end: 2.45rem;
|
|
175
210
|
}
|
|
176
211
|
.fillo-select-icon {
|
|
177
212
|
pointer-events: none;
|
|
178
213
|
position: absolute;
|
|
179
214
|
top: 50%;
|
|
180
|
-
|
|
215
|
+
inset-inline-end: 0.9rem;
|
|
181
216
|
width: 0.62rem;
|
|
182
217
|
height: 0.62rem;
|
|
183
218
|
border-right: 1.5px solid currentColor;
|
|
@@ -235,6 +270,9 @@
|
|
|
235
270
|
transition: color 120ms ease;
|
|
236
271
|
}
|
|
237
272
|
:where(.fillo-option--selected) .fillo-option-icon { color: var(--fillo-primary); }
|
|
273
|
+
/* Selected marker for icon-mode options — the non-color signal (the native
|
|
274
|
+
input is visually hidden there, so forced-colors has nothing else). */
|
|
275
|
+
.fillo-option-check { flex: 0 0 auto; margin-inline-start: auto; color: var(--fillo-primary); }
|
|
238
276
|
.fillo-option-label { font-size: 0.95rem; }
|
|
239
277
|
|
|
240
278
|
.fillo-option-main {
|
|
@@ -292,7 +330,7 @@
|
|
|
292
330
|
.fillo-toggle-thumb {
|
|
293
331
|
width: 1rem;
|
|
294
332
|
height: 1rem;
|
|
295
|
-
margin-
|
|
333
|
+
margin-inline-start: 0.18rem;
|
|
296
334
|
border-radius: 999px;
|
|
297
335
|
background: var(--fillo-control-bg);
|
|
298
336
|
box-shadow: 0 1px 2px color-mix(in srgb, var(--fillo-text) 18%, transparent);
|
|
@@ -306,6 +344,14 @@
|
|
|
306
344
|
transform: translateX(1rem);
|
|
307
345
|
background: var(--fillo-primary-contrast);
|
|
308
346
|
}
|
|
347
|
+
/* RTL: the thumb travels toward the track's other edge. Deviates from the
|
|
348
|
+
spec's literal selector text, which left three fillo-* classes bare
|
|
349
|
+
outside :where() and would fail this file's own specificity lint
|
|
350
|
+
(styles-lint.test.mjs) — wrapped each qualifier individually instead,
|
|
351
|
+
mirroring the checked+track rule directly above. */
|
|
352
|
+
:where([dir="rtl"]) :where(.fillo-toggle-input:checked) + :where(.fillo-toggle-track) .fillo-toggle-thumb {
|
|
353
|
+
transform: translateX(-1rem);
|
|
354
|
+
}
|
|
309
355
|
:where(.fillo-toggle-input:focus-visible) + .fillo-toggle-track {
|
|
310
356
|
box-shadow:
|
|
311
357
|
inset 0 0 0 1px var(--fillo-primary),
|
|
@@ -333,22 +379,18 @@
|
|
|
333
379
|
/* ---------- Rating ---------- */
|
|
334
380
|
.fillo-rating { display: flex; gap: 0.25rem; }
|
|
335
381
|
.fillo-star {
|
|
336
|
-
font-size: 1.
|
|
382
|
+
font-size: 1.75rem;
|
|
337
383
|
line-height: 1;
|
|
338
384
|
background: none;
|
|
339
385
|
border: none;
|
|
340
386
|
cursor: pointer;
|
|
341
|
-
color: var(--fillo-
|
|
387
|
+
color: var(--fillo-muted);
|
|
342
388
|
padding: 0.1rem;
|
|
343
389
|
transition: color 100ms ease, transform 100ms ease;
|
|
344
390
|
}
|
|
345
391
|
.fillo-star:hover { transform: scale(1.15); }
|
|
346
392
|
.fillo-star--active { color: var(--fillo-primary); }
|
|
347
|
-
|
|
348
|
-
outline: none;
|
|
349
|
-
border-radius: calc(var(--fillo-radius) * 0.5);
|
|
350
|
-
box-shadow: 0 0 0 3px color-mix(in srgb, var(--fillo-primary) 30%, transparent);
|
|
351
|
-
}
|
|
393
|
+
/* :focus-visible treatment standardized below (P1.1 solid-outline block). */
|
|
352
394
|
|
|
353
395
|
/* ---------- Linear scale ---------- */
|
|
354
396
|
/* Steps share one row and shrink to fit — an 11-step NPS scale must never
|
|
@@ -423,7 +465,9 @@
|
|
|
423
465
|
transition: color 120ms ease, border-color 120ms ease;
|
|
424
466
|
}
|
|
425
467
|
.fillo-ranking-move:hover:not(:disabled) { color: var(--fillo-primary); border-color: var(--fillo-primary); }
|
|
426
|
-
.
|
|
468
|
+
/* opacity set below (P1.3 block, raised to 0.5 for the internal 3:1
|
|
469
|
+
disabled-contrast advisory); cursor stays here. */
|
|
470
|
+
.fillo-ranking-move:disabled { cursor: default; }
|
|
427
471
|
|
|
428
472
|
/* ---------- Matrix ---------- */
|
|
429
473
|
.fillo-matrix-wrap { overflow-x: auto; }
|
|
@@ -434,9 +478,21 @@
|
|
|
434
478
|
border-bottom: 1px solid var(--fillo-border);
|
|
435
479
|
}
|
|
436
480
|
.fillo-matrix thead th { color: var(--fillo-muted); font-weight: 500; font-size: 0.8rem; }
|
|
437
|
-
.fillo-matrix tbody th { text-align:
|
|
481
|
+
.fillo-matrix tbody th { text-align: start; font-weight: 500; }
|
|
438
482
|
.fillo-matrix tbody tr:last-child th, .fillo-matrix tbody tr:last-child td { border-bottom: none; }
|
|
439
483
|
|
|
484
|
+
/* ---------- Calculated ---------- */
|
|
485
|
+
/* A quiet computed-value line, not a control: no border or input chrome —
|
|
486
|
+
the slightly heavier tabular number is the only emphasis. */
|
|
487
|
+
.fillo-calculated-value {
|
|
488
|
+
font-size: 1.05rem;
|
|
489
|
+
font-weight: 600;
|
|
490
|
+
font-variant-numeric: tabular-nums;
|
|
491
|
+
color: var(--fillo-text);
|
|
492
|
+
}
|
|
493
|
+
/* Unanswered (an incomplete calculation renders an em dash). */
|
|
494
|
+
.fillo-calculated-value--empty { color: var(--fillo-muted); font-weight: 400; }
|
|
495
|
+
|
|
440
496
|
/* ---------- Signature ---------- */
|
|
441
497
|
.fillo-signature {
|
|
442
498
|
position: relative;
|
|
@@ -464,7 +520,7 @@
|
|
|
464
520
|
.fillo-signature-clear {
|
|
465
521
|
position: absolute;
|
|
466
522
|
top: 0.4rem;
|
|
467
|
-
|
|
523
|
+
inset-inline-end: 0.4rem;
|
|
468
524
|
font: inherit;
|
|
469
525
|
font-size: 0.75rem;
|
|
470
526
|
border: 1px solid var(--fillo-border);
|
|
@@ -522,23 +578,74 @@
|
|
|
522
578
|
.fillo-files { list-style: none; display: flex; flex-direction: column; gap: 0.45rem; margin: 0; padding: 0; }
|
|
523
579
|
.fillo-file {
|
|
524
580
|
display: grid;
|
|
525
|
-
grid-template-columns: 1fr auto auto;
|
|
581
|
+
grid-template-columns: minmax(0, 1fr) auto auto;
|
|
526
582
|
align-items: center;
|
|
527
|
-
gap: 0.
|
|
583
|
+
gap: 0.45rem 0.65rem;
|
|
528
584
|
border: 1px solid var(--fillo-border);
|
|
529
585
|
border-radius: var(--fillo-radius);
|
|
530
|
-
padding: 0.
|
|
586
|
+
padding: 0.625rem 0.75rem;
|
|
531
587
|
font-size: 0.88rem;
|
|
532
588
|
background: var(--fillo-control-bg);
|
|
533
589
|
}
|
|
534
|
-
.fillo-file--failed {
|
|
535
|
-
|
|
536
|
-
|
|
590
|
+
.fillo-file--failed {
|
|
591
|
+
grid-template-columns: minmax(0, 1fr) auto;
|
|
592
|
+
border-color: var(--fillo-error);
|
|
593
|
+
}
|
|
594
|
+
.fillo-file-name {
|
|
595
|
+
min-width: 0;
|
|
596
|
+
overflow: hidden;
|
|
597
|
+
text-overflow: ellipsis;
|
|
598
|
+
white-space: nowrap;
|
|
599
|
+
font-weight: 500;
|
|
600
|
+
line-height: 1.35;
|
|
601
|
+
}
|
|
602
|
+
.fillo-file-meta {
|
|
603
|
+
color: var(--fillo-muted);
|
|
604
|
+
font-variant-numeric: tabular-nums;
|
|
605
|
+
line-height: 1.35;
|
|
606
|
+
white-space: nowrap;
|
|
607
|
+
}
|
|
608
|
+
.fillo-file-actions {
|
|
609
|
+
display: inline-flex;
|
|
610
|
+
align-items: center;
|
|
611
|
+
justify-content: flex-end;
|
|
612
|
+
gap: 0.15rem;
|
|
613
|
+
white-space: nowrap;
|
|
614
|
+
}
|
|
615
|
+
.fillo-file-error {
|
|
616
|
+
grid-column: 1 / -1;
|
|
617
|
+
color: var(--fillo-error);
|
|
618
|
+
font-size: 0.82rem;
|
|
619
|
+
line-height: 1.35;
|
|
620
|
+
}
|
|
537
621
|
.fillo-file-remove {
|
|
538
|
-
|
|
539
|
-
|
|
622
|
+
appearance: none;
|
|
623
|
+
display: inline-flex;
|
|
624
|
+
align-items: center;
|
|
625
|
+
justify-content: center;
|
|
626
|
+
background: none;
|
|
627
|
+
border: none;
|
|
628
|
+
cursor: pointer;
|
|
629
|
+
color: var(--fillo-muted);
|
|
630
|
+
font-size: 1.1rem;
|
|
631
|
+
line-height: 1;
|
|
632
|
+
padding: 0;
|
|
540
633
|
}
|
|
541
634
|
.fillo-file-remove:hover { color: var(--fillo-error); }
|
|
635
|
+
.fillo-file-retry {
|
|
636
|
+
appearance: none;
|
|
637
|
+
display: inline-flex;
|
|
638
|
+
align-items: center;
|
|
639
|
+
justify-content: center;
|
|
640
|
+
background: none;
|
|
641
|
+
border: none;
|
|
642
|
+
cursor: pointer;
|
|
643
|
+
color: var(--fillo-primary);
|
|
644
|
+
font: inherit;
|
|
645
|
+
font-weight: 550;
|
|
646
|
+
padding: 0 0.3rem;
|
|
647
|
+
}
|
|
648
|
+
.fillo-file-retry:hover { text-decoration: underline; }
|
|
542
649
|
.fillo-progress {
|
|
543
650
|
grid-column: 1 / -1;
|
|
544
651
|
height: 4px;
|
|
@@ -572,10 +679,7 @@
|
|
|
572
679
|
}
|
|
573
680
|
.fillo-button:active { transform: translateY(1px); }
|
|
574
681
|
.fillo-button:disabled { opacity: 0.55; cursor: not-allowed; }
|
|
575
|
-
|
|
576
|
-
outline: none;
|
|
577
|
-
box-shadow: 0 0 0 3px color-mix(in srgb, var(--fillo-primary) 30%, transparent);
|
|
578
|
-
}
|
|
682
|
+
/* :focus-visible treatment standardized below (P1.1 solid-outline block). */
|
|
579
683
|
.fillo-button--primary { background: var(--fillo-primary); color: var(--fillo-primary-contrast); }
|
|
580
684
|
.fillo-button--ghost { background: transparent; color: var(--fillo-text); border-color: var(--fillo-border); }
|
|
581
685
|
|
|
@@ -602,15 +706,14 @@
|
|
|
602
706
|
margin: 0;
|
|
603
707
|
}
|
|
604
708
|
|
|
605
|
-
/* ---------- Not-open
|
|
606
|
-
/*
|
|
607
|
-
|
|
709
|
+
/* ---------- Not-open state (draft / not-accepting, production) ---------- */
|
|
710
|
+
/* Keep the display-only preview in the DOM as a safety fallback for hosts
|
|
711
|
+
that skip the defaults, but present a calm empty state when this stylesheet
|
|
712
|
+
is loaded. Respondents should not have to read a blurred form to understand
|
|
713
|
+
that it is unavailable. */
|
|
608
714
|
.fillo-form--not-open { position: relative; }
|
|
609
715
|
.fillo-not-open-preview {
|
|
610
|
-
|
|
611
|
-
opacity: 0.85;
|
|
612
|
-
pointer-events: none;
|
|
613
|
-
user-select: none;
|
|
716
|
+
display: none;
|
|
614
717
|
}
|
|
615
718
|
/* The preview's controls sit in one natively disabled fieldset; keep it
|
|
616
719
|
invisible in the layout (it inherits the form's own column gap). */
|
|
@@ -624,34 +727,39 @@
|
|
|
624
727
|
min-width: 0;
|
|
625
728
|
}
|
|
626
729
|
.fillo-not-open-card {
|
|
627
|
-
position: absolute;
|
|
628
|
-
left: 50%;
|
|
629
|
-
top: 50%;
|
|
630
|
-
transform: translate(-50%, -50%);
|
|
631
|
-
z-index: 1;
|
|
632
730
|
display: flex;
|
|
633
731
|
flex-direction: column;
|
|
732
|
+
align-items: center;
|
|
634
733
|
gap: 0.4rem;
|
|
635
|
-
width:
|
|
636
|
-
|
|
734
|
+
width: 100%;
|
|
735
|
+
box-sizing: border-box;
|
|
736
|
+
padding: 2rem 1rem;
|
|
637
737
|
text-align: center;
|
|
638
|
-
border: 1px solid var(--fillo-border);
|
|
639
|
-
border-radius: var(--fillo-radius);
|
|
640
|
-
background: var(--fillo-control-bg);
|
|
641
|
-
box-shadow: 0 12px 32px -14px rgba(0, 0, 0, 0.35);
|
|
642
738
|
}
|
|
643
|
-
.fillo-not-open-title { margin: 0; font-size: 1.05rem; letter-spacing: 0; }
|
|
644
|
-
.fillo-not-open-body {
|
|
739
|
+
.fillo-not-open-title { margin: 0; font-size: 1.05rem; font-weight: 650; letter-spacing: 0; }
|
|
740
|
+
.fillo-not-open-body {
|
|
741
|
+
max-width: 26rem;
|
|
742
|
+
margin: 0;
|
|
743
|
+
font-size: 0.875rem;
|
|
744
|
+
color: var(--fillo-muted);
|
|
745
|
+
line-height: 1.5;
|
|
746
|
+
}
|
|
645
747
|
|
|
646
748
|
/* ---------- Success ---------- */
|
|
647
749
|
.fillo-success { display: flex; flex-direction: column; align-items: center; gap: 0.4rem; text-align: center; padding: 1.4rem 1rem; }
|
|
648
750
|
.fillo-success-mark {
|
|
649
|
-
width:
|
|
751
|
+
width: 2.25rem; height: 2.25rem;
|
|
650
752
|
display: grid; place-items: center;
|
|
651
753
|
border-radius: 999px;
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
754
|
+
border: 1px solid color-mix(in srgb, var(--fillo-primary) 18%, transparent);
|
|
755
|
+
background: color-mix(in srgb, var(--fillo-primary) 8%, transparent);
|
|
756
|
+
}
|
|
757
|
+
.fillo-success-mark::before {
|
|
758
|
+
content: "";
|
|
759
|
+
width: 0.65rem; height: 0.35rem;
|
|
760
|
+
border-left: 2px solid var(--fillo-primary);
|
|
761
|
+
border-bottom: 2px solid var(--fillo-primary);
|
|
762
|
+
transform: translateY(-0.08rem) rotate(-45deg);
|
|
655
763
|
}
|
|
656
764
|
.fillo-success-title { margin: 0; font-size: 1.05rem; letter-spacing: 0; }
|
|
657
765
|
.fillo-success-message { margin: 0; font-size: 0.875rem; color: var(--fillo-muted); }
|
|
@@ -785,11 +893,7 @@
|
|
|
785
893
|
text-underline-offset: 2px;
|
|
786
894
|
white-space: nowrap;
|
|
787
895
|
}
|
|
788
|
-
|
|
789
|
-
outline: none;
|
|
790
|
-
border-radius: 4px;
|
|
791
|
-
box-shadow: 0 0 0 3px color-mix(in srgb, var(--fillo-primary) 15%, transparent);
|
|
792
|
-
}
|
|
896
|
+
/* :focus-visible treatment standardized below (P1.1 solid-outline block). */
|
|
793
897
|
|
|
794
898
|
/* ---------- Human-verification challenge (Turnstile) ---------- */
|
|
795
899
|
.fillo-turnstile-slot {
|
|
@@ -808,4 +912,100 @@
|
|
|
808
912
|
font-size: 0.82rem;
|
|
809
913
|
line-height: 1.45;
|
|
810
914
|
}
|
|
915
|
+
|
|
916
|
+
/* Error summary (GOV.UK pattern): ONE alert on failed submit; links focus
|
|
917
|
+
their fields. Per-field messages are plain describedby text. */
|
|
918
|
+
.fillo-error-summary {
|
|
919
|
+
border: 2px solid var(--fillo-error);
|
|
920
|
+
border-radius: var(--fillo-radius);
|
|
921
|
+
padding: 0.8rem 1rem;
|
|
922
|
+
}
|
|
923
|
+
.fillo-error-summary-title { margin: 0 0 0.4rem; font-size: 1rem; font-weight: 600; }
|
|
924
|
+
.fillo-error-summary ul { margin: 0; padding-inline-start: 1.1rem; }
|
|
925
|
+
.fillo-error-summary li { margin: 0.2rem 0; }
|
|
926
|
+
.fillo-error-summary a { color: var(--fillo-error); }
|
|
927
|
+
|
|
928
|
+
/* ---------- Accessibility: focus rings, pointer targets, forced-colors
|
|
929
|
+
(input-quality audit P1.1-P1.3) ---------- */
|
|
930
|
+
/* Focus visibility: controls without a compensating border swap get a
|
|
931
|
+
solid ring — translucent box-shadows compute under 3:1 (WCAG 1.4.11)
|
|
932
|
+
and vanish in forced-colors. */
|
|
933
|
+
.fillo-star:focus-visible,
|
|
934
|
+
.fillo-button:focus-visible,
|
|
935
|
+
.fillo-resume-clear:focus-visible,
|
|
936
|
+
.fillo-ranking-move:focus-visible,
|
|
937
|
+
.fillo-file-remove:focus-visible,
|
|
938
|
+
.fillo-file-retry:focus-visible,
|
|
939
|
+
.fillo-signature-clear:focus-visible {
|
|
940
|
+
outline: 2px solid var(--fillo-primary);
|
|
941
|
+
outline-offset: 2px;
|
|
942
|
+
box-shadow: none;
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
/* Minimum pointer targets (WCAG 2.2 AA 24px; 1.5rem = 24px @16px root). */
|
|
946
|
+
.fillo-ranking-move,
|
|
947
|
+
.fillo-file-remove,
|
|
948
|
+
.fillo-file-retry,
|
|
949
|
+
.fillo-signature-clear {
|
|
950
|
+
min-width: 1.5rem;
|
|
951
|
+
min-height: 1.5rem;
|
|
952
|
+
display: inline-flex;
|
|
953
|
+
align-items: center;
|
|
954
|
+
justify-content: center;
|
|
955
|
+
}
|
|
956
|
+
.fillo-star { min-width: 1.75rem; min-height: 1.75rem; }
|
|
957
|
+
.fillo-matrix-cell {
|
|
958
|
+
display: flex;
|
|
959
|
+
align-items: center;
|
|
960
|
+
justify-content: center;
|
|
961
|
+
min-height: 1.5rem;
|
|
962
|
+
padding: 0.35rem;
|
|
963
|
+
cursor: pointer;
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
/* Placeholder joins the token system (was UA-default, ungoverned). */
|
|
967
|
+
.fillo-input::placeholder,
|
|
968
|
+
.fillo-phone-search::placeholder { color: var(--fillo-muted); }
|
|
969
|
+
|
|
970
|
+
/* Ranking disabled state: WCAG-exempt, but keep it findable (contract's
|
|
971
|
+
internal 3:1 advisory). */
|
|
972
|
+
.fillo-ranking-move:disabled { opacity: 0.5; }
|
|
973
|
+
|
|
974
|
+
/* Matrix on narrow viewports: stacked rows, never a horizontal scroll
|
|
975
|
+
trap. Column names come from data-label (set by both renderers). */
|
|
976
|
+
@media (max-width: 30rem) {
|
|
977
|
+
.fillo-matrix thead { position: absolute; width: 1px; height: 1px;
|
|
978
|
+
overflow: hidden; clip-path: inset(50%); }
|
|
979
|
+
.fillo-matrix, .fillo-matrix tbody, .fillo-matrix tr,
|
|
980
|
+
.fillo-matrix th, .fillo-matrix td { display: block; width: 100%; }
|
|
981
|
+
.fillo-matrix tbody th { padding: 0.55rem 0 0.15rem; }
|
|
982
|
+
.fillo-matrix td { display: flex; align-items: center; gap: 0.5rem; }
|
|
983
|
+
.fillo-matrix td::before { content: attr(data-label);
|
|
984
|
+
flex: 1 1 auto; font-size: 0.85em; }
|
|
985
|
+
/* Deviates from the spec's literal ".fillo-matrix .fillo-matrix-cell"
|
|
986
|
+
text (two bare fillo-* classes, no :where()) — that fails this file's
|
|
987
|
+
own specificity lint (styles-lint.test.mjs: "wrap qualifiers in
|
|
988
|
+
:where()"). Wrapped the ancestor qualifier instead. */
|
|
989
|
+
:where(.fillo-matrix) .fillo-matrix-cell { flex: 0 0 auto; }
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
/* Forced-colors: restore what author colors can't carry. */
|
|
993
|
+
@media (forced-colors: active) {
|
|
994
|
+
.fillo-star--active,
|
|
995
|
+
.fillo-scale-step--active,
|
|
996
|
+
:where(.fillo-option--selected) {
|
|
997
|
+
outline: 2px solid SelectedItem;
|
|
998
|
+
outline-offset: -2px;
|
|
999
|
+
}
|
|
1000
|
+
.fillo-input:focus-visible,
|
|
1001
|
+
.fillo-number:focus-within,
|
|
1002
|
+
.fillo-phone-flag:focus-visible,
|
|
1003
|
+
.fillo-phone-search:focus-visible,
|
|
1004
|
+
.fillo-scale-step:focus-visible,
|
|
1005
|
+
.fillo-dropzone:focus-visible,
|
|
1006
|
+
.fillo-select:focus-visible {
|
|
1007
|
+
outline: 2px solid Highlight;
|
|
1008
|
+
outline-offset: 2px;
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
811
1011
|
}
|