@camp.dev/bones 0.4.1 → 0.5.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/css/auto.css DELETED
@@ -1,1116 +0,0 @@
1
- @import "./bones.css";
2
-
3
- /* ---------------------------------------------------------------------------
4
- auto.css — skeletonize unmarked markup under [aria-busy="true"].
5
-
6
- data-bone marks shape, aria-busy marks state; this layer keys on state so a
7
- page with zero data-bone attributes still gets skeletons. Escape hatches:
8
- [data-bones-auto="off"] exempts a subtree, and explicit [data-bone] markup
9
- is always left to bones.css. Every rule lives in @layer bones-auto so page
10
- CSS outranks it without !important.
11
- --------------------------------------------------------------------------- */
12
-
13
- @layer bones-auto {
14
- /* Text default: any element with no child elements, minus exemptions and
15
- the replaced/control elements that get block treatment below. Same bar
16
- geometry as [data-bone="text"] in bones.css — restated because CSS cannot
17
- alias an attribute selector; the test suite pins both copies. */
18
- [aria-busy="true"]
19
- :not(:has(*)):not(
20
- [data-bone],
21
- [data-bone] *,
22
- [data-bones-auto="off"],
23
- [data-bones-auto="off"] *
24
- ):not(
25
- img,
26
- svg,
27
- video,
28
- canvas,
29
- picture,
30
- iframe,
31
- embed,
32
- object,
33
- audio,
34
- button,
35
- input,
36
- select,
37
- textarea,
38
- progress,
39
- meter,
40
- hr,
41
- br,
42
- svg *,
43
- picture *,
44
- select *,
45
- object *
46
- ) {
47
- color: rgb(from currentcolor r g b / 0);
48
- position: relative;
49
- min-width: 4ch;
50
- min-height: 1lh;
51
- }
52
-
53
- [aria-busy="true"]
54
- :not(:has(*)):not(
55
- [data-bone],
56
- [data-bone] *,
57
- [data-bones-auto="off"],
58
- [data-bones-auto="off"] *
59
- ):not(
60
- img,
61
- svg,
62
- video,
63
- canvas,
64
- picture,
65
- iframe,
66
- embed,
67
- object,
68
- audio,
69
- button,
70
- input,
71
- select,
72
- textarea,
73
- progress,
74
- meter,
75
- hr,
76
- br,
77
- svg *,
78
- picture *,
79
- select *,
80
- object *
81
- )::before {
82
- content: "\200b";
83
- }
84
-
85
- [aria-busy="true"]
86
- :not(:has(*)):not(
87
- [data-bone],
88
- [data-bone] *,
89
- [data-bones-auto="off"],
90
- [data-bones-auto="off"] *
91
- ):not(
92
- img,
93
- svg,
94
- video,
95
- canvas,
96
- picture,
97
- iframe,
98
- embed,
99
- object,
100
- audio,
101
- button,
102
- input,
103
- select,
104
- textarea,
105
- progress,
106
- meter,
107
- hr,
108
- br,
109
- svg *,
110
- picture *,
111
- select *,
112
- object *
113
- )::after {
114
- content: "";
115
- position: absolute;
116
- inset-inline: 0;
117
- top: calc((1lh + 1cap) / 2 - 1ex);
118
- height: 1ex;
119
- background-color: var(--bone-base);
120
- border-radius: var(--bone-radius);
121
- pointer-events: none;
122
- }
123
- }
124
-
125
- @layer bones-auto {
126
- /* Block override: replaced elements and form controls fill their own box.
127
- A text bar across an avatar or a button looks wrong. Leafness is not
128
- required — svg and select routinely have element children. */
129
- [aria-busy="true"]
130
- :is(
131
- img,
132
- svg,
133
- video,
134
- canvas,
135
- picture,
136
- iframe,
137
- embed,
138
- object,
139
- audio,
140
- button,
141
- input,
142
- select,
143
- textarea,
144
- progress,
145
- meter
146
- ):not([data-bone], [data-bone] *, [data-bones-auto="off"], [data-bones-auto="off"] *) {
147
- color: rgb(from currentcolor r g b / 0);
148
- background-color: var(--bone-base);
149
- border-radius: var(--bone-radius);
150
- border-color: transparent;
151
- /* A loaded image paints over its own background, so the bone color alone
152
- does not cover it. Pushing the picture out of its content box leaves
153
- the box and its background in place (BON-15). Only img, video, and
154
- canvas honor this; a loaded iframe, embed, or object still shows, and
155
- native video controls paint over the bone. object-position is
156
- interpolable, so a page `transition: all` on images would slide the
157
- picture out over the transition's duration; transition: none stops
158
- that on the way in. On the way out the page's own transition applies,
159
- and the picture reappears at the end of it instead of the start. */
160
- object-position: 9999px 0;
161
- transition: none;
162
- }
163
-
164
- /* Width variance: text leaves cycle 85 / 100 / 92 / 60 so runs of lines
165
- look organic. Takes effect on block-level leaves; inline leaves keep
166
- their content-derived width, which already varies. */
167
- [aria-busy="true"]
168
- :not(:has(*)):not(
169
- [data-bone],
170
- [data-bone] *,
171
- [data-bones-auto="off"],
172
- [data-bones-auto="off"] *
173
- ):not(
174
- img,
175
- svg,
176
- video,
177
- canvas,
178
- picture,
179
- iframe,
180
- embed,
181
- object,
182
- audio,
183
- button,
184
- input,
185
- select,
186
- textarea,
187
- progress,
188
- meter,
189
- hr,
190
- br,
191
- svg *,
192
- picture *,
193
- select *,
194
- object *
195
- ):nth-child(4n + 1) {
196
- width: 85%;
197
- }
198
-
199
- [aria-busy="true"]
200
- :not(:has(*)):not(
201
- [data-bone],
202
- [data-bone] *,
203
- [data-bones-auto="off"],
204
- [data-bones-auto="off"] *
205
- ):not(
206
- img,
207
- svg,
208
- video,
209
- canvas,
210
- picture,
211
- iframe,
212
- embed,
213
- object,
214
- audio,
215
- button,
216
- input,
217
- select,
218
- textarea,
219
- progress,
220
- meter,
221
- hr,
222
- br,
223
- svg *,
224
- picture *,
225
- select *,
226
- object *
227
- ):nth-child(4n + 2) {
228
- width: 100%;
229
- }
230
-
231
- [aria-busy="true"]
232
- :not(:has(*)):not(
233
- [data-bone],
234
- [data-bone] *,
235
- [data-bones-auto="off"],
236
- [data-bones-auto="off"] *
237
- ):not(
238
- img,
239
- svg,
240
- video,
241
- canvas,
242
- picture,
243
- iframe,
244
- embed,
245
- object,
246
- audio,
247
- button,
248
- input,
249
- select,
250
- textarea,
251
- progress,
252
- meter,
253
- hr,
254
- br,
255
- svg *,
256
- picture *,
257
- select *,
258
- object *
259
- ):nth-child(4n + 3) {
260
- width: 92%;
261
- }
262
-
263
- [aria-busy="true"]
264
- :not(:has(*)):not(
265
- [data-bone],
266
- [data-bone] *,
267
- [data-bones-auto="off"],
268
- [data-bones-auto="off"] *
269
- ):not(
270
- img,
271
- svg,
272
- video,
273
- canvas,
274
- picture,
275
- iframe,
276
- embed,
277
- object,
278
- audio,
279
- button,
280
- input,
281
- select,
282
- textarea,
283
- progress,
284
- meter,
285
- hr,
286
- br,
287
- svg *,
288
- picture *,
289
- select *,
290
- object *
291
- ):nth-child(4n) {
292
- width: 60%;
293
- }
294
- }
295
-
296
- @layer bones-auto {
297
- /* Auto bones default to shimmer. bones.css has its own default, but its
298
- rules match [data-bone] elements only and never the unmarked leaves
299
- targeted here, so the default is restated for them, and the scopes below
300
- mirror bones.css for pages that set the attribute (BON-16). In those
301
- scopes, :is(:scope, :scope *) lets the attribute
302
- sit on the aria-busy element itself: a scoped selector's implicit :scope
303
- prefix matches strict descendants only (BON-17). */
304
- [aria-busy="true"]
305
- :not(:has(*)):not(
306
- [data-bone],
307
- [data-bone] *,
308
- [data-bones-auto="off"],
309
- [data-bones-auto="off"] *
310
- ):not(
311
- img,
312
- svg,
313
- video,
314
- canvas,
315
- picture,
316
- iframe,
317
- embed,
318
- object,
319
- audio,
320
- button,
321
- input,
322
- select,
323
- textarea,
324
- progress,
325
- meter,
326
- hr,
327
- br,
328
- svg *,
329
- picture *,
330
- select *,
331
- object *
332
- )::before,
333
- [aria-busy="true"]
334
- :not(:has(*)):not(
335
- [data-bone],
336
- [data-bone] *,
337
- [data-bones-auto="off"],
338
- [data-bones-auto="off"] *
339
- ):not(
340
- img,
341
- svg,
342
- video,
343
- canvas,
344
- picture,
345
- iframe,
346
- embed,
347
- object,
348
- audio,
349
- button,
350
- input,
351
- select,
352
- textarea,
353
- progress,
354
- meter,
355
- hr,
356
- br,
357
- svg *,
358
- picture *,
359
- select *,
360
- object *
361
- )::after,
362
- [aria-busy="true"]
363
- :is(
364
- img,
365
- svg,
366
- video,
367
- canvas,
368
- picture,
369
- iframe,
370
- embed,
371
- object,
372
- audio,
373
- button,
374
- input,
375
- select,
376
- textarea,
377
- progress,
378
- meter
379
- ):not([data-bone], [data-bone] *, [data-bones-auto="off"], [data-bones-auto="off"] *) {
380
- animation: bone-shimmer var(--bone-duration) ease-in-out infinite;
381
- background: linear-gradient(
382
- 90deg,
383
- var(--bone-base) 25%,
384
- var(--bone-highlight) 50%,
385
- var(--bone-base) 75%
386
- );
387
- background-size: 200% 100%;
388
- }
389
-
390
- @scope ([data-bone-animate="shimmer"]) to ([data-bone-animate]:not([data-bone-animate="shimmer"])) {
391
- [aria-busy="true"]:is(:scope, :scope *)
392
- :not(:has(*)):not(
393
- [data-bone],
394
- [data-bone] *,
395
- [data-bones-auto="off"],
396
- [data-bones-auto="off"] *
397
- ):not(
398
- img,
399
- svg,
400
- video,
401
- canvas,
402
- picture,
403
- iframe,
404
- embed,
405
- object,
406
- audio,
407
- button,
408
- input,
409
- select,
410
- textarea,
411
- progress,
412
- meter,
413
- hr,
414
- br,
415
- svg *,
416
- picture *,
417
- select *,
418
- object *
419
- )::before,
420
- [aria-busy="true"]:is(:scope, :scope *)
421
- :not(:has(*)):not(
422
- [data-bone],
423
- [data-bone] *,
424
- [data-bones-auto="off"],
425
- [data-bones-auto="off"] *
426
- ):not(
427
- img,
428
- svg,
429
- video,
430
- canvas,
431
- picture,
432
- iframe,
433
- embed,
434
- object,
435
- audio,
436
- button,
437
- input,
438
- select,
439
- textarea,
440
- progress,
441
- meter,
442
- hr,
443
- br,
444
- svg *,
445
- picture *,
446
- select *,
447
- object *
448
- )::after,
449
- [aria-busy="true"]:is(:scope, :scope *)
450
- :is(
451
- img,
452
- svg,
453
- video,
454
- canvas,
455
- picture,
456
- iframe,
457
- embed,
458
- object,
459
- audio,
460
- button,
461
- input,
462
- select,
463
- textarea,
464
- progress,
465
- meter
466
- ):not([data-bone], [data-bone] *, [data-bones-auto="off"], [data-bones-auto="off"] *) {
467
- animation: bone-shimmer var(--bone-duration) ease-in-out infinite;
468
- background: linear-gradient(
469
- 90deg,
470
- var(--bone-base) 25%,
471
- var(--bone-highlight) 50%,
472
- var(--bone-base) 75%
473
- );
474
- background-size: 200% 100%;
475
- }
476
-
477
- @media (prefers-reduced-motion: reduce) {
478
- [aria-busy="true"]:is(:scope, :scope *)
479
- :not(:has(*)):not(
480
- [data-bone],
481
- [data-bone] *,
482
- [data-bones-auto="off"],
483
- [data-bones-auto="off"] *
484
- ):not(
485
- img,
486
- svg,
487
- video,
488
- canvas,
489
- picture,
490
- iframe,
491
- embed,
492
- object,
493
- audio,
494
- button,
495
- input,
496
- select,
497
- textarea,
498
- progress,
499
- meter,
500
- hr,
501
- br,
502
- svg *,
503
- picture *,
504
- select *,
505
- object *
506
- )::before,
507
- [aria-busy="true"]:is(:scope, :scope *)
508
- :not(:has(*)):not(
509
- [data-bone],
510
- [data-bone] *,
511
- [data-bones-auto="off"],
512
- [data-bones-auto="off"] *
513
- ):not(
514
- img,
515
- svg,
516
- video,
517
- canvas,
518
- picture,
519
- iframe,
520
- embed,
521
- object,
522
- audio,
523
- button,
524
- input,
525
- select,
526
- textarea,
527
- progress,
528
- meter,
529
- hr,
530
- br,
531
- svg *,
532
- picture *,
533
- select *,
534
- object *
535
- )::after,
536
- [aria-busy="true"]:is(:scope, :scope *)
537
- :is(
538
- img,
539
- svg,
540
- video,
541
- canvas,
542
- picture,
543
- iframe,
544
- embed,
545
- object,
546
- audio,
547
- button,
548
- input,
549
- select,
550
- textarea,
551
- progress,
552
- meter
553
- ):not([data-bone], [data-bone] *, [data-bones-auto="off"], [data-bones-auto="off"] *) {
554
- animation: bone-pulse 2s ease-in-out infinite;
555
- background: var(--bone-base);
556
- background-size: auto;
557
- }
558
- }
559
-
560
- @media (forced-colors: active) {
561
- [aria-busy="true"]:is(:scope, :scope *)
562
- :not(:has(*)):not(
563
- [data-bone],
564
- [data-bone] *,
565
- [data-bones-auto="off"],
566
- [data-bones-auto="off"] *
567
- ):not(
568
- img,
569
- svg,
570
- video,
571
- canvas,
572
- picture,
573
- iframe,
574
- embed,
575
- object,
576
- audio,
577
- button,
578
- input,
579
- select,
580
- textarea,
581
- progress,
582
- meter,
583
- hr,
584
- br,
585
- svg *,
586
- picture *,
587
- select *,
588
- object *
589
- )::after,
590
- [aria-busy="true"]:is(:scope, :scope *)
591
- :is(
592
- img,
593
- svg,
594
- video,
595
- canvas,
596
- picture,
597
- iframe,
598
- embed,
599
- object,
600
- audio,
601
- button,
602
- input,
603
- select,
604
- textarea,
605
- progress,
606
- meter
607
- ):not([data-bone], [data-bone] *, [data-bones-auto="off"], [data-bones-auto="off"] *) {
608
- background-color: GrayText;
609
- forced-color-adjust: none;
610
- }
611
- }
612
- }
613
-
614
- @scope ([data-bone-animate="pulse"]) to ([data-bone-animate]:not([data-bone-animate="pulse"])) {
615
- [aria-busy="true"]:is(:scope, :scope *)
616
- :not(:has(*)):not(
617
- [data-bone],
618
- [data-bone] *,
619
- [data-bones-auto="off"],
620
- [data-bones-auto="off"] *
621
- ):not(
622
- img,
623
- svg,
624
- video,
625
- canvas,
626
- picture,
627
- iframe,
628
- embed,
629
- object,
630
- audio,
631
- button,
632
- input,
633
- select,
634
- textarea,
635
- progress,
636
- meter,
637
- hr,
638
- br,
639
- svg *,
640
- picture *,
641
- select *,
642
- object *
643
- )::before,
644
- [aria-busy="true"]:is(:scope, :scope *)
645
- :not(:has(*)):not(
646
- [data-bone],
647
- [data-bone] *,
648
- [data-bones-auto="off"],
649
- [data-bones-auto="off"] *
650
- ):not(
651
- img,
652
- svg,
653
- video,
654
- canvas,
655
- picture,
656
- iframe,
657
- embed,
658
- object,
659
- audio,
660
- button,
661
- input,
662
- select,
663
- textarea,
664
- progress,
665
- meter,
666
- hr,
667
- br,
668
- svg *,
669
- picture *,
670
- select *,
671
- object *
672
- )::after,
673
- [aria-busy="true"]:is(:scope, :scope *)
674
- :is(
675
- img,
676
- svg,
677
- video,
678
- canvas,
679
- picture,
680
- iframe,
681
- embed,
682
- object,
683
- audio,
684
- button,
685
- input,
686
- select,
687
- textarea,
688
- progress,
689
- meter
690
- ):not([data-bone], [data-bone] *, [data-bones-auto="off"], [data-bones-auto="off"] *) {
691
- animation: bone-pulse var(--bone-duration) ease-in-out infinite;
692
- background: var(--bone-base);
693
- background-size: auto;
694
- }
695
-
696
- @media (prefers-reduced-motion: reduce) {
697
- [aria-busy="true"]:is(:scope, :scope *)
698
- :not(:has(*)):not(
699
- [data-bone],
700
- [data-bone] *,
701
- [data-bones-auto="off"],
702
- [data-bones-auto="off"] *
703
- ):not(
704
- img,
705
- svg,
706
- video,
707
- canvas,
708
- picture,
709
- iframe,
710
- embed,
711
- object,
712
- audio,
713
- button,
714
- input,
715
- select,
716
- textarea,
717
- progress,
718
- meter,
719
- hr,
720
- br,
721
- svg *,
722
- picture *,
723
- select *,
724
- object *
725
- )::before,
726
- [aria-busy="true"]:is(:scope, :scope *)
727
- :not(:has(*)):not(
728
- [data-bone],
729
- [data-bone] *,
730
- [data-bones-auto="off"],
731
- [data-bones-auto="off"] *
732
- ):not(
733
- img,
734
- svg,
735
- video,
736
- canvas,
737
- picture,
738
- iframe,
739
- embed,
740
- object,
741
- audio,
742
- button,
743
- input,
744
- select,
745
- textarea,
746
- progress,
747
- meter,
748
- hr,
749
- br,
750
- svg *,
751
- picture *,
752
- select *,
753
- object *
754
- )::after,
755
- [aria-busy="true"]:is(:scope, :scope *)
756
- :is(
757
- img,
758
- svg,
759
- video,
760
- canvas,
761
- picture,
762
- iframe,
763
- embed,
764
- object,
765
- audio,
766
- button,
767
- input,
768
- select,
769
- textarea,
770
- progress,
771
- meter
772
- ):not([data-bone], [data-bone] *, [data-bones-auto="off"], [data-bones-auto="off"] *) {
773
- animation: bone-pulse 2s ease-in-out infinite;
774
- background: var(--bone-base);
775
- background-size: auto;
776
- }
777
- }
778
-
779
- @media (forced-colors: active) {
780
- [aria-busy="true"]:is(:scope, :scope *)
781
- :not(:has(*)):not(
782
- [data-bone],
783
- [data-bone] *,
784
- [data-bones-auto="off"],
785
- [data-bones-auto="off"] *
786
- ):not(
787
- img,
788
- svg,
789
- video,
790
- canvas,
791
- picture,
792
- iframe,
793
- embed,
794
- object,
795
- audio,
796
- button,
797
- input,
798
- select,
799
- textarea,
800
- progress,
801
- meter,
802
- hr,
803
- br,
804
- svg *,
805
- picture *,
806
- select *,
807
- object *
808
- )::after,
809
- [aria-busy="true"]:is(:scope, :scope *)
810
- :is(
811
- img,
812
- svg,
813
- video,
814
- canvas,
815
- picture,
816
- iframe,
817
- embed,
818
- object,
819
- audio,
820
- button,
821
- input,
822
- select,
823
- textarea,
824
- progress,
825
- meter
826
- ):not([data-bone], [data-bone] *, [data-bones-auto="off"], [data-bones-auto="off"] *) {
827
- background-color: GrayText;
828
- forced-color-adjust: none;
829
- }
830
- }
831
- }
832
-
833
- @scope ([data-bone-animate="none"]) to ([data-bone-animate]:not([data-bone-animate="none"])) {
834
- [aria-busy="true"]:is(:scope, :scope *)
835
- :not(:has(*)):not(
836
- [data-bone],
837
- [data-bone] *,
838
- [data-bones-auto="off"],
839
- [data-bones-auto="off"] *
840
- ):not(
841
- img,
842
- svg,
843
- video,
844
- canvas,
845
- picture,
846
- iframe,
847
- embed,
848
- object,
849
- audio,
850
- button,
851
- input,
852
- select,
853
- textarea,
854
- progress,
855
- meter,
856
- hr,
857
- br,
858
- svg *,
859
- picture *,
860
- select *,
861
- object *
862
- )::before,
863
- [aria-busy="true"]:is(:scope, :scope *)
864
- :not(:has(*)):not(
865
- [data-bone],
866
- [data-bone] *,
867
- [data-bones-auto="off"],
868
- [data-bones-auto="off"] *
869
- ):not(
870
- img,
871
- svg,
872
- video,
873
- canvas,
874
- picture,
875
- iframe,
876
- embed,
877
- object,
878
- audio,
879
- button,
880
- input,
881
- select,
882
- textarea,
883
- progress,
884
- meter,
885
- hr,
886
- br,
887
- svg *,
888
- picture *,
889
- select *,
890
- object *
891
- )::after,
892
- [aria-busy="true"]:is(:scope, :scope *)
893
- :is(
894
- img,
895
- svg,
896
- video,
897
- canvas,
898
- picture,
899
- iframe,
900
- embed,
901
- object,
902
- audio,
903
- button,
904
- input,
905
- select,
906
- textarea,
907
- progress,
908
- meter
909
- ):not([data-bone], [data-bone] *, [data-bones-auto="off"], [data-bones-auto="off"] *) {
910
- animation: none;
911
- background: var(--bone-base);
912
- background-size: auto;
913
- }
914
-
915
- @media (forced-colors: active) {
916
- [aria-busy="true"]:is(:scope, :scope *)
917
- :not(:has(*)):not(
918
- [data-bone],
919
- [data-bone] *,
920
- [data-bones-auto="off"],
921
- [data-bones-auto="off"] *
922
- ):not(
923
- img,
924
- svg,
925
- video,
926
- canvas,
927
- picture,
928
- iframe,
929
- embed,
930
- object,
931
- audio,
932
- button,
933
- input,
934
- select,
935
- textarea,
936
- progress,
937
- meter,
938
- hr,
939
- br,
940
- svg *,
941
- picture *,
942
- select *,
943
- object *
944
- )::after,
945
- [aria-busy="true"]:is(:scope, :scope *)
946
- :is(
947
- img,
948
- svg,
949
- video,
950
- canvas,
951
- picture,
952
- iframe,
953
- embed,
954
- object,
955
- audio,
956
- button,
957
- input,
958
- select,
959
- textarea,
960
- progress,
961
- meter
962
- ):not([data-bone], [data-bone] *, [data-bones-auto="off"], [data-bones-auto="off"] *) {
963
- background-color: GrayText;
964
- forced-color-adjust: none;
965
- }
966
- }
967
- }
968
-
969
- @media (prefers-reduced-motion: reduce) {
970
- [aria-busy="true"]
971
- :not(:has(*)):not(
972
- [data-bone],
973
- [data-bone] *,
974
- [data-bones-auto="off"],
975
- [data-bones-auto="off"] *
976
- ):not(
977
- img,
978
- svg,
979
- video,
980
- canvas,
981
- picture,
982
- iframe,
983
- embed,
984
- object,
985
- audio,
986
- button,
987
- input,
988
- select,
989
- textarea,
990
- progress,
991
- meter,
992
- hr,
993
- br,
994
- svg *,
995
- picture *,
996
- select *,
997
- object *
998
- )::before,
999
- [aria-busy="true"]
1000
- :not(:has(*)):not(
1001
- [data-bone],
1002
- [data-bone] *,
1003
- [data-bones-auto="off"],
1004
- [data-bones-auto="off"] *
1005
- ):not(
1006
- img,
1007
- svg,
1008
- video,
1009
- canvas,
1010
- picture,
1011
- iframe,
1012
- embed,
1013
- object,
1014
- audio,
1015
- button,
1016
- input,
1017
- select,
1018
- textarea,
1019
- progress,
1020
- meter,
1021
- hr,
1022
- br,
1023
- svg *,
1024
- picture *,
1025
- select *,
1026
- object *
1027
- )::after,
1028
- [aria-busy="true"]
1029
- :is(
1030
- img,
1031
- svg,
1032
- video,
1033
- canvas,
1034
- picture,
1035
- iframe,
1036
- embed,
1037
- object,
1038
- audio,
1039
- button,
1040
- input,
1041
- select,
1042
- textarea,
1043
- progress,
1044
- meter
1045
- ):not([data-bone], [data-bone] *, [data-bones-auto="off"], [data-bones-auto="off"] *) {
1046
- animation: bone-pulse 2s ease-in-out infinite;
1047
- background: var(--bone-base);
1048
- background-size: auto;
1049
- }
1050
- }
1051
-
1052
- /* High-contrast modes strip author backgrounds; keep bones visible with a
1053
- system color and opt the surfaces out of forced-color adjustment. */
1054
- @media (forced-colors: active) {
1055
- [aria-busy="true"]
1056
- :not(:has(*)):not(
1057
- [data-bone],
1058
- [data-bone] *,
1059
- [data-bones-auto="off"],
1060
- [data-bones-auto="off"] *
1061
- ):not(
1062
- img,
1063
- svg,
1064
- video,
1065
- canvas,
1066
- picture,
1067
- iframe,
1068
- embed,
1069
- object,
1070
- audio,
1071
- button,
1072
- input,
1073
- select,
1074
- textarea,
1075
- progress,
1076
- meter,
1077
- hr,
1078
- br,
1079
- svg *,
1080
- picture *,
1081
- select *,
1082
- object *
1083
- )::after,
1084
- [aria-busy="true"]
1085
- :is(
1086
- img,
1087
- svg,
1088
- video,
1089
- canvas,
1090
- picture,
1091
- iframe,
1092
- embed,
1093
- object,
1094
- audio,
1095
- button,
1096
- input,
1097
- select,
1098
- textarea,
1099
- progress,
1100
- meter
1101
- ):not([data-bone], [data-bone] *, [data-bones-auto="off"], [data-bones-auto="off"] *) {
1102
- background-color: GrayText;
1103
- forced-color-adjust: none;
1104
- }
1105
- }
1106
- }
1107
-
1108
- @layer bones-auto {
1109
- /* precision="measured" hides a boundary's content with inherited
1110
- visibility from the shadow side. Visibility, unlike display, can be
1111
- switched back on by a descendant, so the opt-out contract survives
1112
- measured mode: exempt subtrees stay visible under the overlay. */
1113
- bones-boundary[data-bones-measured] [data-bones-auto="off"] {
1114
- visibility: visible;
1115
- }
1116
- }