@forming/react 0.0.0-stage → 0.1.0-dev.2.2

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.
@@ -0,0 +1,1371 @@
1
+ /* Optional, scoped theme. Import @forming/react/styles.css once in your app.
2
+ Public tokens: --forming-primary, --forming-on-primary, --forming-surface, --forming-soft,
3
+ --forming-ink, --forming-muted, --forming-border, --forming-error, --forming-error-background,
4
+ --forming-success, --forming-radius, --forming-control-radius, --forming-font, --forming-width,
5
+ --forming-color-scheme. Everything else is derived from them. */
6
+ .forming-form {
7
+ --_surface: var(--forming-surface, #fff);
8
+ --_soft: var(--forming-soft, #f4f6f5);
9
+ --_ink: var(--forming-ink, #15271f);
10
+ --_muted: var(--forming-muted, #56685f);
11
+ --_border: var(--forming-border, #d5ddd8);
12
+ --_primary: var(--forming-primary, #1f5f4a);
13
+ --_on-primary: var(--forming-on-primary, #fff);
14
+ --_error: var(--forming-error, #b42318);
15
+ --_error-bg: var(--forming-error-background, #fef3f2);
16
+ --_success: var(--forming-success, #16794c);
17
+ --_radius: var(--forming-radius, 12px);
18
+ --_control-radius: var(--forming-control-radius, calc(var(--_radius) * 0.75));
19
+ /* Derived */
20
+ --_border-strong: color-mix(in srgb, var(--_border), var(--_ink) 18%);
21
+ --_hover: color-mix(in srgb, var(--_soft), var(--_ink) 3%);
22
+ --_primary-hover: color-mix(in srgb, var(--_primary), #000 14%);
23
+ --_primary-soft: color-mix(in srgb, var(--_primary) 7%, var(--_surface));
24
+ --_ring: color-mix(in srgb, var(--_primary) 24%, transparent);
25
+ --_error-ring: color-mix(in srgb, var(--_error) 20%, transparent);
26
+ --_placeholder: color-mix(in srgb, var(--_muted) 72%, var(--_surface));
27
+ --_shadow-xs: 0 1px 2px color-mix(in srgb, var(--_ink) 6%, transparent);
28
+ --_shadow-sm:
29
+ 0 1px 3px color-mix(in srgb, var(--_ink) 8%, transparent), 0 1px 2px color-mix(in srgb, var(--_ink) 4%, transparent);
30
+ /* Size scale (embedded). Focused mode overrides these below. */
31
+ --_control-height: 38px;
32
+ --_gap: 18px;
33
+ --_text: 14px;
34
+ --_label: 13.5px;
35
+ --_help: 12.5px;
36
+ --_title: clamp(19px, 3.4cqi, 23px);
37
+ --_page-title: clamp(16px, 3cqi, 19px);
38
+ --_ease: cubic-bezier(0.2, 0, 0, 1);
39
+ box-sizing: border-box;
40
+ container-type: inline-size;
41
+ font-family: var(--forming-font, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif);
42
+ color: var(--_ink);
43
+ background: var(--_surface);
44
+ color-scheme: var(--forming-color-scheme, light);
45
+ font-size: var(--_text);
46
+ line-height: 1.5;
47
+ text-align: start;
48
+ -webkit-font-smoothing: antialiased;
49
+ width: 100%;
50
+ min-width: 0;
51
+ max-width: var(--forming-width, 680px);
52
+ margin: 0 auto;
53
+ padding: clamp(16px, 3.5vw, 32px);
54
+ border-radius: var(--_radius);
55
+ overflow-wrap: anywhere;
56
+ }
57
+ .forming-form *,
58
+ .forming-form *::before,
59
+ .forming-form *::after {
60
+ box-sizing: border-box;
61
+ }
62
+ .forming-form[data-presentation='focused'] {
63
+ --_control-height: 42px;
64
+ --_gap: 22px;
65
+ --_text: 15px;
66
+ --_label: 14.5px;
67
+ --_help: 13px;
68
+ --_title: clamp(21px, 3.8cqi, 26px);
69
+ --_page-title: clamp(17px, 3.2cqi, 20px);
70
+ max-width: var(--forming-width, 720px);
71
+ padding: clamp(20px, 4vw, 40px);
72
+ }
73
+
74
+ /* ---------- Typography ---------- */
75
+ .forming-form [data-forming-header] {
76
+ margin-block-end: calc(var(--_gap) + 4px);
77
+ }
78
+ .forming-form [data-forming-header] h1 {
79
+ margin: 0;
80
+ font-size: var(--_title);
81
+ font-weight: 680;
82
+ line-height: 1.2;
83
+ letter-spacing: -0.025em;
84
+ text-wrap: balance;
85
+ }
86
+ .forming-form [data-forming-header] p {
87
+ font-size: var(--_text);
88
+ margin-block: 10px 0;
89
+ max-width: 60ch;
90
+ }
91
+ .forming-form h2 {
92
+ color: var(--_ink);
93
+ font-size: 16px;
94
+ font-weight: 640;
95
+ line-height: 1.35;
96
+ letter-spacing: -0.015em;
97
+ margin: 0 0 16px;
98
+ text-wrap: balance;
99
+ }
100
+ .forming-form p {
101
+ color: var(--_muted);
102
+ font-size: var(--_help);
103
+ line-height: 1.55;
104
+ margin: 8px 0 16px;
105
+ }
106
+ .forming-form a {
107
+ color: var(--_primary);
108
+ text-decoration-thickness: 1px;
109
+ text-underline-offset: 3px;
110
+ }
111
+ .forming-form a:hover {
112
+ text-decoration-thickness: 2px;
113
+ }
114
+
115
+ /* ---------- Spacing: layouts own the rhythm through gap, fields carry no margins ---------- */
116
+ .forming-form [data-layout]:not([data-layout='grid'], [data-layout='columns']),
117
+ .forming-form [data-structure] > div,
118
+ .forming-form [data-forming-item] {
119
+ display: flex;
120
+ flex-direction: column;
121
+ gap: var(--_gap);
122
+ min-width: 0;
123
+ }
124
+ .forming-form :is([data-layout='grid'], [data-layout='columns']) {
125
+ /* Column gap stays the renderer's 1rem, which its column formula accounts for. */
126
+ row-gap: var(--_gap) !important;
127
+ }
128
+ .forming-form [data-structure='object'] > div + div {
129
+ margin-block-start: var(--_gap);
130
+ }
131
+
132
+ /* ---------- Pages, sections and displays ---------- */
133
+ .forming-form [data-forming-page] {
134
+ min-width: 0;
135
+ animation: forming-forward 260ms var(--_ease);
136
+ scroll-margin-block: 20px;
137
+ }
138
+ .forming-form [data-forming-page][data-direction='back'] {
139
+ animation-name: forming-back;
140
+ }
141
+ .forming-form [data-forming-page][tabindex]:focus,
142
+ .forming-form [data-temporal-picker][tabindex]:focus {
143
+ /* Focus lands here programmatically after navigation; the content is the indicator. */
144
+ outline: none;
145
+ }
146
+ .forming-form [data-forming-page] > h2 {
147
+ font-size: var(--_page-title);
148
+ letter-spacing: -0.02em;
149
+ margin: 0;
150
+ }
151
+ .forming-form [data-forming-page] > h2 + p {
152
+ margin-block: calc(8px - var(--_gap)) 4px;
153
+ }
154
+ .forming-form :is([data-layout='section'], [data-layout='group']) {
155
+ margin-block: 8px;
156
+ }
157
+ .forming-form :is([data-layout='section'], [data-layout='group']):first-child {
158
+ margin-block-start: 0;
159
+ }
160
+ .forming-form [data-layout='section'] > h2,
161
+ .forming-form [data-layout='group'] > h2 {
162
+ font-size: 13px;
163
+ font-weight: 650;
164
+ letter-spacing: 0.06em;
165
+ text-transform: uppercase;
166
+ color: var(--_muted);
167
+ border-block-end: 1px solid var(--_border);
168
+ padding-block-end: 10px;
169
+ margin: 0;
170
+ }
171
+ .forming-form [data-display] > :first-child {
172
+ margin-block-start: 0;
173
+ }
174
+ .forming-form [data-display] > :last-child {
175
+ margin-block-end: 0;
176
+ }
177
+ .forming-form [data-display] > h2 {
178
+ font-size: 15.5px;
179
+ margin-block-end: 8px;
180
+ }
181
+ .forming-form [data-display] :is(h3, h4, h5) {
182
+ color: var(--_ink);
183
+ margin: 20px 0 6px;
184
+ line-height: 1.35;
185
+ }
186
+ .forming-form [data-display] h3 {
187
+ font-size: 15.5px;
188
+ }
189
+ .forming-form [data-display] :is(h4, h5) {
190
+ font-size: 14px;
191
+ }
192
+ .forming-form [data-display] :is(ul, ol) {
193
+ color: var(--_muted);
194
+ font-size: var(--_help);
195
+ padding-inline-start: 22px;
196
+ }
197
+ .forming-form [data-display] li + li {
198
+ margin-block-start: 4px;
199
+ }
200
+ .forming-form [data-display] strong {
201
+ color: var(--_ink);
202
+ }
203
+ .forming-form code {
204
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
205
+ font-size: 0.9em;
206
+ background: var(--_soft);
207
+ border: 1px solid var(--_border);
208
+ padding: 1px 5px;
209
+ border-radius: 5px;
210
+ }
211
+
212
+ /* ---------- Step indicator ---------- */
213
+ .forming-form [data-forming-steps] {
214
+ display: block;
215
+ padding: 0;
216
+ overflow: visible;
217
+ margin-block: -8px 36px;
218
+ font-size: 13px;
219
+ color: var(--_muted);
220
+ }
221
+ .forming-form [data-forming-steps] > span {
222
+ display: block;
223
+ margin-block-end: 12px;
224
+ font-size: 12px;
225
+ font-weight: 650;
226
+ letter-spacing: 0.06em;
227
+ text-transform: uppercase;
228
+ }
229
+ .forming-form [data-forming-steps] ol {
230
+ display: flex;
231
+ flex-wrap: wrap;
232
+ gap: 8px;
233
+ list-style: none;
234
+ padding: 0;
235
+ margin: 0;
236
+ }
237
+ .forming-form [data-forming-steps] li {
238
+ display: flex;
239
+ align-items: center;
240
+ gap: 8px;
241
+ flex: 1 1 90px;
242
+ min-width: 0;
243
+ padding-block-start: 12px;
244
+ border-block-start: 3px solid var(--_border);
245
+ line-height: 1.35;
246
+ transition: border-color 200ms var(--_ease);
247
+ }
248
+ .forming-form [data-forming-steps] ol:has(> li:nth-child(6)) li {
249
+ flex-basis: 28px;
250
+ }
251
+ .forming-form [data-forming-steps] ol:has(> li:nth-child(6)) li[aria-current] {
252
+ flex-basis: auto;
253
+ flex-grow: 3;
254
+ }
255
+ .forming-form [data-forming-steps] ol:has(> li:nth-child(6)) li:not([aria-current]) > span:last-child {
256
+ display: none;
257
+ }
258
+ .forming-form [data-forming-step-number] {
259
+ display: inline-grid;
260
+ place-items: center;
261
+ flex: none;
262
+ width: 22px;
263
+ height: 22px;
264
+ border-radius: 50%;
265
+ border: 1.5px solid var(--_border-strong);
266
+ font-size: 11.5px;
267
+ font-weight: 650;
268
+ font-variant-numeric: tabular-nums;
269
+ color: var(--_muted);
270
+ background: var(--_surface);
271
+ }
272
+ .forming-form [data-forming-steps] li[data-visited],
273
+ .forming-form [data-forming-steps] li[aria-current] {
274
+ border-color: var(--_primary);
275
+ color: var(--_ink);
276
+ }
277
+ .forming-form [data-forming-steps] li[data-visited] [data-forming-step-number] {
278
+ border-color: var(--_primary);
279
+ color: var(--_primary);
280
+ background: var(--_primary-soft);
281
+ }
282
+ .forming-form [data-forming-steps] li[aria-current] {
283
+ font-weight: 650;
284
+ }
285
+ .forming-form [data-forming-steps] li[aria-current] [data-forming-step-number] {
286
+ border-color: var(--_primary);
287
+ background: var(--_primary);
288
+ color: var(--_on-primary);
289
+ }
290
+
291
+ /* ---------- Fields ---------- */
292
+ .forming-form [data-forming-field] {
293
+ border: 0;
294
+ margin: 0;
295
+ padding: 0;
296
+ min-inline-size: 0;
297
+ }
298
+ .forming-form [data-forming-field] > label,
299
+ .forming-form [data-forming-field] > legend {
300
+ display: block;
301
+ width: 100%;
302
+ max-width: 100%;
303
+ padding: 0;
304
+ margin: 0 0 8px;
305
+ color: var(--_ink);
306
+ font-size: var(--_label);
307
+ font-weight: 600;
308
+ line-height: 1.45;
309
+ }
310
+ .forming-form [data-forming-required] {
311
+ color: var(--_error);
312
+ font-weight: 500;
313
+ }
314
+
315
+ /* ---------- Text controls ---------- */
316
+ .forming-form input:not([type='checkbox'], [type='radio'], [type='file']),
317
+ .forming-form select,
318
+ .forming-form textarea {
319
+ display: block;
320
+ width: 100%;
321
+ min-width: 0;
322
+ min-height: var(--_control-height);
323
+ margin: 0;
324
+ padding: 10px 14px;
325
+ border: 1px solid var(--_border-strong);
326
+ border-radius: var(--_control-radius);
327
+ background-color: var(--_surface);
328
+ color: var(--_ink);
329
+ box-shadow: var(--_shadow-xs);
330
+ font: inherit;
331
+ font-size: var(--_text);
332
+ line-height: 1.45;
333
+ transition:
334
+ border-color 140ms var(--_ease),
335
+ box-shadow 140ms var(--_ease),
336
+ background-color 140ms var(--_ease);
337
+ }
338
+ .forming-form input:not([type='checkbox'], [type='radio'], [type='file']),
339
+ .forming-form select {
340
+ padding-block: 7px;
341
+ }
342
+ /* Touch browsers zoom into inputs smaller than 16px on focus. */
343
+ @media (pointer: coarse) {
344
+ .forming-form :is(input, select, textarea) {
345
+ font-size: max(16px, var(--_text)) !important;
346
+ }
347
+ }
348
+ .forming-form textarea {
349
+ min-height: 108px;
350
+ resize: vertical;
351
+ }
352
+ .forming-form input::placeholder,
353
+ .forming-form textarea::placeholder {
354
+ color: var(--_placeholder);
355
+ opacity: 1;
356
+ }
357
+ .forming-form :is(input:not([type='checkbox'], [type='radio']), select, textarea):hover:not(:disabled, :focus) {
358
+ border-color: color-mix(in srgb, var(--_border-strong), var(--_ink) 20%);
359
+ }
360
+ .forming-form :is(input:not([type='checkbox'], [type='radio']), select, textarea):focus {
361
+ outline: none;
362
+ border-color: var(--_primary);
363
+ box-shadow: 0 0 0 4px var(--_ring);
364
+ }
365
+ .forming-form :is(input, select, textarea)[aria-invalid='true'] {
366
+ border-color: var(--_error);
367
+ }
368
+ .forming-form :is(input, select, textarea)[aria-invalid='true']:focus {
369
+ border-color: var(--_error);
370
+ box-shadow: 0 0 0 4px var(--_error-ring);
371
+ }
372
+ .forming-form :is(input, select, textarea):disabled {
373
+ background-color: var(--_soft);
374
+ border-color: var(--_border);
375
+ color: var(--_muted);
376
+ box-shadow: none;
377
+ cursor: not-allowed;
378
+ }
379
+ /* Calculated/readonly answers read as values, not dead inputs. */
380
+ .forming-form [data-readonly] :is(input, select, textarea):disabled {
381
+ color: var(--_ink);
382
+ font-weight: 600;
383
+ border-style: dashed;
384
+ font-variant-numeric: tabular-nums;
385
+ }
386
+ .forming-form input[inputmode='decimal'] {
387
+ font-variant-numeric: tabular-nums;
388
+ }
389
+
390
+ /* Native select with a theme-aware chevron. */
391
+ .forming-form select:not([multiple]) {
392
+ appearance: none;
393
+ padding-inline-end: 40px;
394
+ background-image:
395
+ linear-gradient(45deg, transparent 50%, var(--_muted) 50%),
396
+ linear-gradient(135deg, var(--_muted) 50%, transparent 50%);
397
+ background-position:
398
+ calc(100% - 20px) 52%,
399
+ calc(100% - 15px) 52%;
400
+ background-size: 5px 5px;
401
+ background-repeat: no-repeat;
402
+ cursor: pointer;
403
+ }
404
+ .forming-form[dir='rtl'] select:not([multiple]) {
405
+ background-position:
406
+ 15px 52%,
407
+ 20px 52%;
408
+ }
409
+ .forming-form select[multiple] {
410
+ padding: 6px;
411
+ }
412
+ .forming-form select[multiple] option {
413
+ padding: 6px 10px;
414
+ border-radius: 6px;
415
+ }
416
+ .forming-form select[multiple] option:checked {
417
+ /* A gradient is the only background Chromium applies to selected options. */
418
+ background: linear-gradient(var(--_primary-soft), var(--_primary-soft));
419
+ color: var(--_ink);
420
+ font-weight: 560;
421
+ box-shadow: inset 3px 0 0 var(--_primary);
422
+ }
423
+
424
+ /* Inline clear button inside single controls. */
425
+ .forming-form [data-forming-control] {
426
+ position: relative;
427
+ }
428
+ .forming-form [data-forming-control] > :is(input, textarea) {
429
+ padding-inline-end: 44px;
430
+ }
431
+ .forming-form [data-forming-control] > select:not([multiple]) {
432
+ padding-inline-end: 72px;
433
+ }
434
+ .forming-form [data-forming-control] > [data-forming-clear] {
435
+ position: absolute;
436
+ inset-inline-end: 8px;
437
+ inset-block-start: calc(var(--_control-height) / 2 - 14px);
438
+ width: 28px;
439
+ height: 28px;
440
+ min-height: 28px;
441
+ margin: 0;
442
+ padding: 0;
443
+ border: 0;
444
+ border-radius: 50%;
445
+ background: transparent;
446
+ box-shadow: none;
447
+ color: var(--_muted);
448
+ }
449
+ .forming-form [data-forming-control] > [data-forming-clear]:hover:not(:disabled) {
450
+ background: var(--_hover);
451
+ color: var(--_ink);
452
+ }
453
+ .forming-form [data-forming-control] > select ~ [data-forming-clear] {
454
+ inset-inline-end: 36px;
455
+ }
456
+ .forming-form [data-forming-control] > [data-forming-clear]:disabled {
457
+ visibility: hidden;
458
+ }
459
+
460
+ /* Direct children of the form (no authored layout) are spaced like a stack. */
461
+ .forming-form > :is([data-layout], [data-forming-field], [data-display]) {
462
+ margin-block: 0 var(--_gap);
463
+ }
464
+
465
+ /* ---------- Help, errors and statuses ---------- */
466
+ .forming-form [data-forming-help]:empty,
467
+ .forming-form [data-forming-errors]:empty,
468
+ .forming-form [data-forming-provider]:empty {
469
+ display: none;
470
+ }
471
+ .forming-form [data-forming-help] {
472
+ font-size: var(--_help);
473
+ line-height: 1.5;
474
+ margin: 8px 0 0;
475
+ }
476
+ .forming-form [data-forming-formatted] {
477
+ font-variant-numeric: tabular-nums;
478
+ }
479
+ .forming-form [data-forming-errors] {
480
+ margin-block-start: 8px;
481
+ }
482
+ .forming-form [data-forming-errors] p,
483
+ .forming-form [data-forming-provider='invalid'],
484
+ .forming-form [data-forming-provider='failed'] {
485
+ display: flex;
486
+ align-items: flex-start;
487
+ gap: 6px;
488
+ color: var(--_error);
489
+ font-size: var(--_help);
490
+ font-weight: 500;
491
+ line-height: 1.45;
492
+ margin: 4px 0 0;
493
+ }
494
+ .forming-form [data-forming-errors] p::before,
495
+ .forming-form [data-forming-provider='invalid']::before,
496
+ .forming-form [data-forming-provider='failed']::before,
497
+ .forming-form [role='alert']::before {
498
+ content: '';
499
+ flex: none;
500
+ width: 16px;
501
+ height: 16px;
502
+ margin-block-start: 1px;
503
+ background: currentColor;
504
+ -webkit-mask: var(--_alert-icon) center / contain no-repeat;
505
+ mask: var(--_alert-icon) center / contain no-repeat;
506
+ }
507
+ .forming-form {
508
+ --_alert-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Zm0 5a1.25 1.25 0 0 1 1.25 1.25v4.5a1.25 1.25 0 0 1-2.5 0v-4.5A1.25 1.25 0 0 1 12 7Zm0 10.5a1.4 1.4 0 1 1 0-2.8 1.4 1.4 0 0 1 0 2.8Z'/%3E%3C/svg%3E");
509
+ }
510
+ .forming-form [data-forming-provider] {
511
+ display: flex;
512
+ flex-wrap: wrap;
513
+ align-items: center;
514
+ gap: 6px 10px;
515
+ font-size: var(--_help);
516
+ margin-block-start: 8px;
517
+ color: var(--_muted);
518
+ }
519
+ .forming-form :is([data-forming-provider='pending'], [data-forming-provider='scheduled']) > span::before {
520
+ content: '';
521
+ display: inline-block;
522
+ width: 12px;
523
+ height: 12px;
524
+ margin-inline-end: 8px;
525
+ vertical-align: -1px;
526
+ border: 2px solid var(--_border);
527
+ border-block-start-color: var(--_primary);
528
+ border-radius: 50%;
529
+ animation: forming-spin 700ms linear infinite;
530
+ }
531
+ .forming-form [role='alert'],
532
+ .forming-form [data-forming-issues] {
533
+ display: flex;
534
+ align-items: flex-start;
535
+ flex-wrap: wrap;
536
+ gap: 4px 10px;
537
+ margin-block: 16px;
538
+ padding: 12px 14px;
539
+ border: 1px solid color-mix(in srgb, var(--_error) 25%, transparent);
540
+ border-radius: var(--_control-radius);
541
+ color: var(--_error);
542
+ background: var(--_error-bg);
543
+ font-size: 13.5px;
544
+ font-weight: 500;
545
+ line-height: 1.5;
546
+ }
547
+ .forming-form [role='alert']::before {
548
+ margin-block-start: 2px;
549
+ }
550
+ .forming-form [data-forming-issues] button {
551
+ color: inherit;
552
+ background: transparent;
553
+ border: 0;
554
+ border-radius: 0;
555
+ box-shadow: none;
556
+ min-height: 0;
557
+ padding: 0;
558
+ font: inherit;
559
+ font-weight: 650;
560
+ text-decoration: underline;
561
+ text-underline-offset: 3px;
562
+ }
563
+ .forming-form [data-forming-field] > [role='status'],
564
+ .forming-form > [role='status'] {
565
+ font-size: var(--_help);
566
+ color: var(--_muted);
567
+ }
568
+
569
+ /* ---------- Buttons ---------- */
570
+ .forming-form button {
571
+ display: inline-flex;
572
+ justify-content: center;
573
+ align-items: center;
574
+ gap: 6px;
575
+ min-height: 38px;
576
+ padding: 7px 14px;
577
+ margin-block: 4px;
578
+ margin-inline: 0 8px;
579
+ border: 1px solid var(--_border-strong);
580
+ border-radius: var(--_control-radius);
581
+ background: var(--_surface);
582
+ color: var(--_ink);
583
+ box-shadow: var(--_shadow-xs);
584
+ font: inherit;
585
+ font-size: 13.5px;
586
+ font-weight: 560;
587
+ line-height: 1.4;
588
+ white-space: nowrap;
589
+ cursor: pointer;
590
+ user-select: none;
591
+ transition:
592
+ background-color 140ms var(--_ease),
593
+ border-color 140ms var(--_ease),
594
+ color 140ms var(--_ease),
595
+ box-shadow 140ms var(--_ease),
596
+ transform 80ms var(--_ease);
597
+ }
598
+ .forming-form button:hover:not(:disabled) {
599
+ background: var(--_hover);
600
+ }
601
+ .forming-form button:active:not(:disabled) {
602
+ transform: translateY(0.5px);
603
+ }
604
+ .forming-form button:disabled {
605
+ opacity: 0.45;
606
+ cursor: not-allowed;
607
+ box-shadow: none;
608
+ }
609
+ /* Blocked by the core but still activatable, so the respondent learns what is missing. */
610
+ .forming-form [data-forming-actions] button[aria-disabled='true'] {
611
+ opacity: 0.55;
612
+ }
613
+ .forming-form :is(button, a, [tabindex]):focus-visible {
614
+ outline: 2px solid var(--_primary);
615
+ outline-offset: 2px;
616
+ }
617
+ .forming-form button:focus-visible {
618
+ box-shadow: 0 0 0 4px var(--_ring);
619
+ outline-offset: 0;
620
+ }
621
+ .forming-form [data-forming-icon] {
622
+ flex: none;
623
+ }
624
+
625
+ /* Quiet, text-style tools: Clear, Set to null, Use empty list, Load more, Retry. */
626
+ .forming-form button[data-forming-tool] {
627
+ min-height: 30px;
628
+ padding: 4px 8px;
629
+ margin-inline: -8px 10px;
630
+ margin-block: 6px 0;
631
+ border-color: transparent;
632
+ background: transparent;
633
+ box-shadow: none;
634
+ color: var(--_muted);
635
+ font-size: 13px;
636
+ font-weight: 550;
637
+ }
638
+ .forming-form button[data-forming-tool]:hover:not(:disabled) {
639
+ background: var(--_soft);
640
+ color: var(--_ink);
641
+ }
642
+ .forming-form button[data-forming-tool]:disabled {
643
+ opacity: 0.4;
644
+ }
645
+ .forming-form :is([data-forming-provider], [data-forming-files], p) button[data-forming-tool] {
646
+ margin: 0;
647
+ }
648
+ .forming-form button[data-forming-tool] + button[data-forming-tool] {
649
+ margin-inline-start: -6px;
650
+ }
651
+
652
+ /* Add row / add details. */
653
+ .forming-form button[data-forming-add] {
654
+ display: flex;
655
+ width: 100%;
656
+ min-height: 44px;
657
+ margin: 8px 0 0;
658
+ border: 1.5px dashed var(--_border-strong);
659
+ background: transparent;
660
+ box-shadow: none;
661
+ color: var(--_primary);
662
+ font-weight: 600;
663
+ }
664
+ .forming-form button[data-forming-add]:hover:not(:disabled) {
665
+ border-color: var(--_primary);
666
+ background: var(--_primary-soft);
667
+ }
668
+
669
+ /* ---------- Choice cards (focused presentation) ---------- */
670
+ .forming-form [data-forming-choices] {
671
+ display: grid;
672
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr));
673
+ gap: 10px;
674
+ }
675
+ .forming-form [data-forming-choice] {
676
+ position: relative;
677
+ display: flex;
678
+ align-items: center;
679
+ gap: 12px;
680
+ padding: 11px 14px;
681
+ min-height: 46px;
682
+ border: 1px solid var(--_border-strong);
683
+ border-radius: var(--_radius);
684
+ background: var(--_surface);
685
+ box-shadow: var(--_shadow-xs);
686
+ color: var(--_ink);
687
+ font-size: var(--_text);
688
+ font-weight: 520;
689
+ line-height: 1.35;
690
+ cursor: pointer;
691
+ transition:
692
+ border-color 140ms var(--_ease),
693
+ background-color 140ms var(--_ease),
694
+ box-shadow 140ms var(--_ease);
695
+ }
696
+ .forming-form [data-forming-choice]:hover:not(:has(input:disabled)) {
697
+ border-color: color-mix(in srgb, var(--_border-strong), var(--_ink) 22%);
698
+ background: var(--_hover);
699
+ }
700
+ .forming-form [data-forming-choice][data-selected] {
701
+ border-color: var(--_primary);
702
+ background: var(--_primary-soft);
703
+ box-shadow: inset 0 0 0 1px var(--_primary);
704
+ }
705
+ .forming-form [data-forming-choice]:has(input:focus-visible) {
706
+ box-shadow:
707
+ inset 0 0 0 1px var(--_primary),
708
+ 0 0 0 4px var(--_ring);
709
+ border-color: var(--_primary);
710
+ }
711
+ .forming-form [data-forming-choice]:has(input[aria-invalid='true']):not([data-selected]) {
712
+ border-color: color-mix(in srgb, var(--_error) 60%, var(--_border));
713
+ }
714
+ .forming-form [data-forming-choice]:has(input:disabled) {
715
+ opacity: 0.55;
716
+ cursor: not-allowed;
717
+ box-shadow: none;
718
+ }
719
+ .forming-form [data-forming-choice] input:focus-visible {
720
+ outline: none;
721
+ }
722
+
723
+ /* Letter keys: the badge is the visible indicator; the native input stays focusable underneath. */
724
+ .forming-form [data-forming-choice] > input:is([type='radio'], [type='checkbox']) {
725
+ position: absolute;
726
+ inset: 0;
727
+ width: 100%;
728
+ height: 100%;
729
+ opacity: 0;
730
+ margin: 0;
731
+ cursor: inherit;
732
+ }
733
+ .forming-form [data-forming-key] {
734
+ display: inline-grid;
735
+ place-items: center;
736
+ flex: none;
737
+ min-width: 24px;
738
+ height: 24px;
739
+ padding-inline: 5px;
740
+ border: 1px solid var(--_border-strong);
741
+ border-radius: 6px;
742
+ background: var(--_surface);
743
+ color: var(--_muted);
744
+ font: inherit;
745
+ font-size: 12px;
746
+ font-weight: 650;
747
+ line-height: 1;
748
+ transition:
749
+ background-color 140ms var(--_ease),
750
+ border-color 140ms var(--_ease),
751
+ color 140ms var(--_ease);
752
+ }
753
+ .forming-form [data-forming-choice][data-selected] [data-forming-key] {
754
+ border-color: var(--_primary);
755
+ background: var(--_primary);
756
+ color: var(--_on-primary);
757
+ }
758
+ .forming-form [data-forming-choice] > span {
759
+ flex: 1;
760
+ min-width: 0;
761
+ }
762
+ .forming-form [data-forming-choice] > [data-forming-icon='check'] {
763
+ color: var(--_primary);
764
+ animation: forming-pop 180ms var(--_ease);
765
+ }
766
+
767
+ /* Custom radios and checkboxes. */
768
+ .forming-form :is(input[type='radio'], input[type='checkbox']) {
769
+ appearance: none;
770
+ position: relative;
771
+ display: inline-grid;
772
+ place-items: center;
773
+ flex: 0 0 auto;
774
+ width: 18px;
775
+ height: 18px;
776
+ margin: 0;
777
+ border: 1.5px solid var(--_border-strong);
778
+ background: var(--_surface);
779
+ cursor: inherit;
780
+ transition:
781
+ border-color 140ms var(--_ease),
782
+ background-color 140ms var(--_ease);
783
+ }
784
+ .forming-form input[type='radio'] {
785
+ border-radius: 50%;
786
+ }
787
+ .forming-form input[type='checkbox'] {
788
+ border-radius: 6px;
789
+ }
790
+ .forming-form :is(input[type='radio'], input[type='checkbox']):checked {
791
+ border-color: var(--_primary);
792
+ background: var(--_primary);
793
+ }
794
+ .forming-form input[type='radio']::before {
795
+ content: '';
796
+ width: 7px;
797
+ height: 7px;
798
+ border-radius: 50%;
799
+ background: var(--_on-primary);
800
+ transform: scale(0);
801
+ transition: transform 140ms var(--_ease);
802
+ }
803
+ .forming-form input[type='radio']:checked::before {
804
+ transform: scale(1);
805
+ }
806
+ .forming-form input[type='checkbox']::before {
807
+ content: '';
808
+ width: 11px;
809
+ height: 11px;
810
+ background: var(--_on-primary);
811
+ clip-path: polygon(14% 44%, 0 58%, 38% 96%, 100% 22%, 86% 8%, 38% 68%);
812
+ transform: scale(0);
813
+ transition: transform 140ms var(--_ease);
814
+ }
815
+ .forming-form input[type='checkbox']:checked::before {
816
+ transform: scale(1);
817
+ }
818
+ .forming-form :is(input[type='radio'], input[type='checkbox']):focus-visible {
819
+ outline: 2px solid var(--_primary);
820
+ outline-offset: 2px;
821
+ }
822
+
823
+ /* ---------- Scalar lists ---------- */
824
+ .forming-form [data-scalar-list] {
825
+ display: grid;
826
+ gap: 8px;
827
+ }
828
+ .forming-form [data-list-item] {
829
+ display: flex;
830
+ align-items: center;
831
+ flex-wrap: wrap;
832
+ gap: 6px;
833
+ }
834
+ .forming-form [data-list-item] > label {
835
+ position: absolute;
836
+ width: 1px;
837
+ height: 1px;
838
+ overflow: hidden;
839
+ clip-path: inset(50%);
840
+ white-space: nowrap;
841
+ }
842
+ .forming-form [data-list-item] > :is(input, select) {
843
+ flex: 1 1 200px;
844
+ width: auto;
845
+ }
846
+ .forming-form [data-list-tools] {
847
+ display: flex;
848
+ gap: 2px;
849
+ }
850
+ .forming-form [data-list-tools] button,
851
+ .forming-form [data-forming-item-tools] button {
852
+ margin: 0;
853
+ min-height: 32px;
854
+ border-color: transparent;
855
+ background: transparent;
856
+ box-shadow: none;
857
+ color: var(--_muted);
858
+ }
859
+ .forming-form [data-list-tools] button {
860
+ width: 36px;
861
+ height: 36px;
862
+ padding: 0;
863
+ }
864
+ .forming-form :is([data-list-tools], [data-forming-item-tools]) button:hover:not(:disabled) {
865
+ background: var(--_soft);
866
+ color: var(--_ink);
867
+ }
868
+ .forming-form :is([data-list-tools], [data-forming-item-tools]) button[data-danger]:hover:not(:disabled) {
869
+ background: var(--_error-bg);
870
+ color: var(--_error);
871
+ }
872
+ .forming-form :is([data-list-tools], [data-forming-item-tools]) button:disabled {
873
+ opacity: 0.3;
874
+ }
875
+ .forming-form [data-forming-null] {
876
+ font-size: 12px;
877
+ font-weight: 600;
878
+ color: var(--_muted);
879
+ background: var(--_soft);
880
+ border: 1px solid var(--_border);
881
+ padding: 2px 8px;
882
+ border-radius: 999px;
883
+ }
884
+ .forming-form [data-scalar-list] > button[data-forming-add] {
885
+ margin-block-start: 2px;
886
+ }
887
+ .forming-form [data-scalar-list] > button[data-forming-tool] {
888
+ justify-self: start;
889
+ margin-block: 0;
890
+ }
891
+
892
+ /* ---------- Date/time helpers ---------- */
893
+ .forming-form [data-temporal-picker] {
894
+ margin-block-start: 8px;
895
+ }
896
+ .forming-form [data-temporal-picker] > label {
897
+ display: grid;
898
+ gap: 4px;
899
+ flex: 1 1 190px;
900
+ max-width: 280px;
901
+ font-size: 12.5px;
902
+ font-weight: 550;
903
+ color: var(--_muted);
904
+ }
905
+ .forming-form [data-temporal-picker] > label:has([id$=':offset']) {
906
+ flex: 0 1 130px;
907
+ }
908
+ .forming-form [data-temporal-picker] input {
909
+ --_control-height: 40px;
910
+ padding-block: 7px;
911
+ font-size: var(--_text);
912
+ }
913
+
914
+ /* ---------- Objects and repeats ---------- */
915
+ .forming-form [data-structure] > legend {
916
+ float: left;
917
+ width: 100%;
918
+ }
919
+ .forming-form [data-structure] > legend + * {
920
+ clear: both;
921
+ }
922
+ .forming-form [data-structure='object'] {
923
+ padding: 18px 20px 20px;
924
+ border: 1px solid var(--_border);
925
+ border-radius: var(--_radius);
926
+ background: color-mix(in srgb, var(--_soft) 55%, var(--_surface));
927
+ }
928
+ .forming-form [data-structure='object'] > legend {
929
+ margin-block-end: 14px;
930
+ }
931
+ .forming-form [data-structure='object'] > button[data-forming-add] {
932
+ background: var(--_surface);
933
+ margin-block-start: 0;
934
+ }
935
+ .forming-form [data-structure='repeat'] {
936
+ display: block;
937
+ }
938
+ .forming-form [data-forming-item] {
939
+ margin-block-end: 12px;
940
+ padding: 6px 20px 20px;
941
+ border: 1px solid var(--_border);
942
+ border-radius: var(--_radius);
943
+ background: var(--_surface);
944
+ box-shadow: var(--_shadow-sm);
945
+ }
946
+ .forming-form [data-forming-item-header] {
947
+ display: flex;
948
+ align-items: center;
949
+ justify-content: space-between;
950
+ flex-wrap: wrap;
951
+ gap: 4px 12px;
952
+ margin: 0 -8px calc(16px - var(--_gap)) 0;
953
+ padding-block: 4px;
954
+ border-block-end: 1px solid var(--_border);
955
+ }
956
+ .forming-form[dir='rtl'] [data-forming-item-header] {
957
+ margin: 0 0 calc(16px - var(--_gap)) -8px;
958
+ }
959
+ .forming-form [data-forming-item-title] {
960
+ font-size: 12px;
961
+ font-weight: 650;
962
+ letter-spacing: 0.06em;
963
+ text-transform: uppercase;
964
+ color: var(--_muted);
965
+ }
966
+ .forming-form [data-forming-item-tools] {
967
+ display: flex;
968
+ flex-wrap: wrap;
969
+ gap: 2px;
970
+ }
971
+ .forming-form [data-forming-item-tools] button {
972
+ padding: 4px 8px;
973
+ font-size: 13px;
974
+ }
975
+ .forming-form [data-structure] [data-structure='object'] {
976
+ background: var(--_soft);
977
+ }
978
+
979
+ /* ---------- Files ---------- */
980
+ .forming-form input[type='file'] {
981
+ display: block;
982
+ width: 100%;
983
+ padding: 22px 20px;
984
+ border: 1.5px dashed var(--_border-strong);
985
+ border-radius: var(--_radius);
986
+ background: color-mix(in srgb, var(--_soft) 60%, var(--_surface));
987
+ color: var(--_muted);
988
+ font: inherit;
989
+ font-size: 13.5px;
990
+ cursor: pointer;
991
+ transition:
992
+ border-color 140ms var(--_ease),
993
+ background-color 140ms var(--_ease);
994
+ }
995
+ .forming-form input[type='file']:hover:not(:disabled) {
996
+ border-color: var(--_primary);
997
+ background: var(--_primary-soft);
998
+ }
999
+ .forming-form input[type='file']:focus-visible {
1000
+ outline: none;
1001
+ border-color: var(--_primary);
1002
+ box-shadow: 0 0 0 4px var(--_ring);
1003
+ }
1004
+ .forming-form input[type='file']:disabled {
1005
+ cursor: not-allowed;
1006
+ opacity: 0.7;
1007
+ }
1008
+ .forming-form input::file-selector-button {
1009
+ border: 1px solid var(--_border-strong);
1010
+ border-radius: var(--_control-radius);
1011
+ padding: 8px 14px;
1012
+ margin-inline-end: 14px;
1013
+ background: var(--_surface);
1014
+ color: var(--_ink);
1015
+ box-shadow: var(--_shadow-xs);
1016
+ font: inherit;
1017
+ font-size: 13.5px;
1018
+ font-weight: 560;
1019
+ cursor: pointer;
1020
+ }
1021
+ .forming-form [data-forming-files] {
1022
+ display: grid;
1023
+ gap: 8px;
1024
+ list-style: none;
1025
+ margin: 10px 0 0;
1026
+ padding: 0;
1027
+ }
1028
+ .forming-form [data-forming-files]:empty {
1029
+ display: none;
1030
+ }
1031
+ .forming-form [data-forming-files] li {
1032
+ display: flex;
1033
+ align-items: center;
1034
+ flex-wrap: wrap;
1035
+ gap: 6px 10px;
1036
+ padding: 10px 12px;
1037
+ border: 1px solid var(--_border);
1038
+ border-radius: var(--_control-radius);
1039
+ background: var(--_surface);
1040
+ font-size: 13.5px;
1041
+ }
1042
+ .forming-form [data-forming-file-name] {
1043
+ flex: 1 1 160px;
1044
+ min-width: 0;
1045
+ font-weight: 560;
1046
+ }
1047
+ .forming-form [data-forming-badge] {
1048
+ font-size: 12px;
1049
+ font-weight: 600;
1050
+ padding: 2px 9px;
1051
+ border-radius: 999px;
1052
+ color: var(--_muted);
1053
+ background: var(--_soft);
1054
+ }
1055
+ .forming-form [data-forming-badge='complete'] {
1056
+ color: var(--_success);
1057
+ background: color-mix(in srgb, var(--_success) 11%, var(--_surface));
1058
+ }
1059
+ .forming-form [data-forming-badge='failed'] {
1060
+ color: var(--_error);
1061
+ background: var(--_error-bg);
1062
+ }
1063
+
1064
+ /* ---------- Counter, Enter hint ---------- */
1065
+ .forming-form [data-forming-counter] {
1066
+ float: inline-end;
1067
+ margin-inline-start: 12px;
1068
+ font-variant-numeric: tabular-nums;
1069
+ color: var(--_muted);
1070
+ }
1071
+ .forming-form [data-forming-counter][data-over] {
1072
+ color: var(--_error);
1073
+ font-weight: 600;
1074
+ }
1075
+ .forming-form [data-forming-hint] {
1076
+ font-size: 12px;
1077
+ color: var(--_muted);
1078
+ white-space: nowrap;
1079
+ }
1080
+ /* The hint sits just before the button Enter activates. */
1081
+ .forming-form [data-forming-actions] button:has(+ [data-forming-hint]) {
1082
+ order: 2;
1083
+ }
1084
+ .forming-form [data-forming-actions] [data-forming-hint] {
1085
+ order: 1;
1086
+ }
1087
+ .forming-form [data-forming-actions] button:has(+ [data-forming-hint]) ~ :not([data-forming-hint]) {
1088
+ order: 3;
1089
+ }
1090
+ .forming-form [data-forming-actions='page'] [data-forming-hint] {
1091
+ margin-inline-start: auto;
1092
+ }
1093
+ .forming-form [data-forming-actions='page'] button[data-action='next']:has(+ [data-forming-hint]) {
1094
+ margin-inline-start: 0;
1095
+ }
1096
+ @media (pointer: coarse) {
1097
+ .forming-form [data-forming-hint] {
1098
+ display: none;
1099
+ }
1100
+ }
1101
+
1102
+ /* ---------- Drag and drop ---------- */
1103
+ .forming-form input[type='file'][data-dragging] {
1104
+ border-color: var(--_primary);
1105
+ border-style: solid;
1106
+ background: var(--_primary-soft);
1107
+ box-shadow: 0 0 0 4px var(--_ring);
1108
+ }
1109
+
1110
+ /* ---------- Standalone date/time pickers ---------- */
1111
+ .forming-form [data-temporal-picker][data-standalone] {
1112
+ margin-block-start: 0;
1113
+ }
1114
+ .forming-form [data-temporal-picker][data-standalone]:not(:has([id$=':offset'])) > label {
1115
+ flex: 1 1 100%;
1116
+ max-width: 280px;
1117
+ }
1118
+ .forming-form [data-temporal-picker][data-standalone]:not(:has([id$=':offset'])) > label > span {
1119
+ position: absolute;
1120
+ width: 1px;
1121
+ height: 1px;
1122
+ overflow: hidden;
1123
+ clip-path: inset(50%);
1124
+ white-space: nowrap;
1125
+ }
1126
+ .forming-form [data-temporal-picker][data-standalone] input {
1127
+ --_control-height: inherit;
1128
+ min-height: var(--_control-height);
1129
+ font-size: var(--_text);
1130
+ }
1131
+
1132
+ /* ---------- Welcome and statement pages (a page with display content only) ---------- */
1133
+ .forming-form [data-forming-page]:not(:has([data-forming-field])) {
1134
+ padding-block: clamp(8px, 4cqi, 32px);
1135
+ }
1136
+ .forming-form [data-forming-page]:not(:has([data-forming-field])) > h2 {
1137
+ font-size: calc(var(--_title) * 1.05);
1138
+ }
1139
+ .forming-form [data-forming-page]:not(:has([data-forming-field])) [data-display] :is(p, ul, ol) {
1140
+ font-size: calc(var(--_text) + 1px);
1141
+ line-height: 1.65;
1142
+ max-width: 60ch;
1143
+ }
1144
+ .forming-form [data-forming-page]:not(:has([data-forming-field])) [data-display] > h2 {
1145
+ font-size: calc(var(--_title) * 0.8);
1146
+ letter-spacing: -0.015em;
1147
+ margin-block-end: 10px;
1148
+ }
1149
+ .forming-form [data-forming-page]:not(:has([data-forming-field])) [data-display] h3 {
1150
+ font-size: calc(var(--_title) * 0.85);
1151
+ letter-spacing: -0.015em;
1152
+ }
1153
+
1154
+ /* ---------- Remote options search ---------- */
1155
+ .forming-form [data-forming-field] > label[data-forming-search] {
1156
+ display: grid;
1157
+ gap: 4px;
1158
+ margin-block-end: 8px;
1159
+ font-size: 12.5px;
1160
+ font-weight: 550;
1161
+ color: var(--_muted);
1162
+ }
1163
+
1164
+ /* ---------- Actions ---------- */
1165
+ .forming-form [data-forming-actions] {
1166
+ display: flex;
1167
+ align-items: center;
1168
+ flex-wrap: wrap;
1169
+ gap: 10px;
1170
+ padding-block-start: 24px;
1171
+ margin-block-start: 28px;
1172
+ border-block-start: 1px solid var(--_border);
1173
+ }
1174
+ .forming-form [data-forming-actions='form'] {
1175
+ margin-block-start: 16px;
1176
+ padding-block-start: 16px;
1177
+ }
1178
+ .forming-form [data-forming-actions='page'] + [data-forming-actions='form'] {
1179
+ border-block-start: 0;
1180
+ padding-block-start: 0;
1181
+ margin-block-start: 12px;
1182
+ }
1183
+ .forming-form [data-forming-actions] button {
1184
+ margin: 0;
1185
+ min-height: var(--_control-height);
1186
+ padding: 8px 18px;
1187
+ font-size: 13.5px;
1188
+ }
1189
+ .forming-form [data-forming-actions] button:is([data-action='next'], [data-action='submit']) {
1190
+ min-width: 120px;
1191
+ background: var(--_primary);
1192
+ color: var(--_on-primary);
1193
+ border-color: var(--_primary);
1194
+ font-weight: 620;
1195
+ box-shadow:
1196
+ var(--_shadow-sm),
1197
+ inset 0 1px 0 color-mix(in srgb, #fff 14%, transparent);
1198
+ }
1199
+ .forming-form [data-forming-actions] button:is([data-action='next'], [data-action='submit']):hover:not(:disabled) {
1200
+ background: var(--_primary-hover);
1201
+ border-color: var(--_primary-hover);
1202
+ }
1203
+ .forming-form [data-forming-actions] button:is([data-action='next'], [data-action='submit']):focus-visible {
1204
+ box-shadow: 0 0 0 4px var(--_ring);
1205
+ }
1206
+ .forming-form [data-forming-actions='page'] button[data-action='back'] {
1207
+ margin-inline-end: auto;
1208
+ }
1209
+ .forming-form [data-forming-actions='page'] button[data-action='next'] {
1210
+ margin-inline-start: auto;
1211
+ }
1212
+ .forming-form [data-forming-actions='form'] button:not([data-action='submit']) {
1213
+ border-color: transparent;
1214
+ background: transparent;
1215
+ box-shadow: none;
1216
+ color: var(--_muted);
1217
+ padding-inline: 12px;
1218
+ font-size: 13.5px;
1219
+ }
1220
+ .forming-form [data-forming-actions='form'] button:not([data-action='submit']):hover:not(:disabled) {
1221
+ background: var(--_soft);
1222
+ color: var(--_ink);
1223
+ }
1224
+ .forming-form [data-forming-actions='form'] button[data-action='reset'] {
1225
+ margin-inline-start: auto;
1226
+ }
1227
+
1228
+ /* ---------- Narrow containers ---------- */
1229
+ @container (max-width: 480px) {
1230
+ .forming-form [data-forming-steps] li > span:last-child {
1231
+ display: none;
1232
+ }
1233
+ .forming-form [data-forming-steps] li[aria-current] > span:last-child {
1234
+ display: inline;
1235
+ }
1236
+ .forming-form [data-forming-item] {
1237
+ padding-inline: 14px;
1238
+ }
1239
+ .forming-form [data-forming-item-tools] button {
1240
+ width: 34px;
1241
+ padding: 0;
1242
+ }
1243
+ .forming-form [data-forming-item-tools] button > span {
1244
+ position: absolute;
1245
+ width: 1px;
1246
+ height: 1px;
1247
+ overflow: hidden;
1248
+ clip-path: inset(50%);
1249
+ white-space: nowrap;
1250
+ }
1251
+ .forming-form [data-structure='object'] {
1252
+ padding-inline: 14px;
1253
+ }
1254
+ }
1255
+ @container (max-width: 360px) {
1256
+ .forming-form [data-layout='grid'],
1257
+ .forming-form [data-layout='columns'] {
1258
+ grid-template-columns: minmax(0, 1fr) !important;
1259
+ }
1260
+ .forming-form [data-forming-actions] button {
1261
+ flex: 1 1 auto;
1262
+ }
1263
+ .forming-form [data-forming-actions='form'] button[data-action='reset'] {
1264
+ margin-inline-start: 0;
1265
+ }
1266
+ }
1267
+
1268
+ /* ---------- Motion and accessibility ---------- */
1269
+ @keyframes forming-forward {
1270
+ from {
1271
+ opacity: 0;
1272
+ transform: translateY(12px);
1273
+ }
1274
+ }
1275
+ @keyframes forming-back {
1276
+ from {
1277
+ opacity: 0;
1278
+ transform: translateY(-12px);
1279
+ }
1280
+ }
1281
+ @keyframes forming-pop {
1282
+ from {
1283
+ transform: scale(0.6);
1284
+ opacity: 0;
1285
+ }
1286
+ }
1287
+ @keyframes forming-spin {
1288
+ to {
1289
+ transform: rotate(360deg);
1290
+ }
1291
+ }
1292
+ @media (prefers-reduced-motion: reduce) {
1293
+ .forming-form *,
1294
+ .forming-form *::before,
1295
+ .forming-form *::after {
1296
+ animation: none !important;
1297
+ transition: none !important;
1298
+ }
1299
+ }
1300
+ @media (forced-colors: active) {
1301
+ .forming-form [data-forming-choice] > input {
1302
+ position: static;
1303
+ width: 18px;
1304
+ height: 18px;
1305
+ opacity: 1;
1306
+ }
1307
+ .forming-form :is(input, select, textarea, button):focus-visible,
1308
+ .forming-form :is(input, select, textarea):focus {
1309
+ outline: 2px solid CanvasText;
1310
+ outline-offset: 2px;
1311
+ }
1312
+ .forming-form :is(input[type='radio'], input[type='checkbox']) {
1313
+ appearance: auto;
1314
+ }
1315
+ .forming-form :is(input[type='radio'], input[type='checkbox'])::before {
1316
+ display: none;
1317
+ }
1318
+ .forming-form [data-forming-choice][data-selected] {
1319
+ outline: 2px solid Highlight;
1320
+ }
1321
+ }
1322
+
1323
+ /* ---------- Multiple choice ---------- */
1324
+ .forming-form [data-forming-choice-hint] {
1325
+ margin: -2px 0 2px;
1326
+ color: var(--_muted);
1327
+ font-size: 0.875em;
1328
+ }
1329
+ /* Embedded: a compact checkbox list. The native checkbox is the visible indicator. */
1330
+ .forming-form[data-presentation='embedded'] [data-forming-choices] {
1331
+ grid-template-columns: 1fr;
1332
+ gap: 6px;
1333
+ }
1334
+ .forming-form[data-presentation='embedded'] [data-forming-choice] {
1335
+ gap: 10px;
1336
+ min-height: 40px;
1337
+ padding: 8px 12px;
1338
+ font-weight: 450;
1339
+ box-shadow: none;
1340
+ }
1341
+ .forming-form[data-presentation='embedded'] [data-forming-choice] > input:is([type='radio'], [type='checkbox']) {
1342
+ position: static;
1343
+ inset: auto;
1344
+ width: 18px;
1345
+ height: 18px;
1346
+ opacity: 1;
1347
+ }
1348
+
1349
+ /* Plugin-authored selectable sections retain native selection and focus. */
1350
+ .forming-form [data-forming-choices][data-rich-choices] {
1351
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));
1352
+ }
1353
+ .forming-form [data-forming-choice][data-rich-choice] {
1354
+ align-items: flex-start;
1355
+ padding: 18px;
1356
+ }
1357
+ .forming-form [data-forming-choice-content] {
1358
+ min-width: 0;
1359
+ }
1360
+ .forming-form [data-forming-choice-content] > strong {
1361
+ display: block;
1362
+ }
1363
+ .forming-form [data-forming-choice-description] {
1364
+ display: block;
1365
+ margin-top: 8px;
1366
+ color: var(--_muted);
1367
+ font-weight: 400;
1368
+ line-height: 1.5;
1369
+ white-space: pre-wrap;
1370
+ overflow-wrap: anywhere;
1371
+ }