@anyblades/blades 2.4.9 → 3.0.0-alpha.1

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.
Files changed (58) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +25 -0
  2. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  3. package/.prettierrc.json +6 -0
  4. package/README.md +112 -149
  5. package/context7.json +4 -0
  6. package/css/blades.css +436 -153
  7. package/css/blades.min.css +145 -0
  8. package/css/blades.standalone.css +197 -222
  9. package/css/blades.standalone.min.css +37 -0
  10. package/css/{blades.ninja.css → ninja.css} +7 -2
  11. package/css/ninja.min.css +5 -0
  12. package/css/pico.conditional.css +3189 -0
  13. package/css/pico.conditional.min.css +107 -0
  14. package/css/pico.css +3186 -0
  15. package/css/pico.min.css +105 -0
  16. package/css/postcss.config.js +23 -0
  17. package/index.html +63 -0
  18. package/package.json +27 -11
  19. package/src/blades.css +4 -3
  20. package/src/blades.standalone.css +2 -2
  21. package/src/{blades.ninja.css → ninja.css} +7 -2
  22. package/src/pico/_components.css +974 -0
  23. package/src/pico/_content.css +608 -0
  24. package/src/pico/_forms.css +747 -0
  25. package/src/pico/_index.css +12 -0
  26. package/src/pico/_layout.css +128 -0
  27. package/src/pico/_utilities.css +53 -0
  28. package/src/pico/_variables.css +671 -0
  29. package/src/pico.css +1 -0
  30. package/src/standalone/_core.css +32 -0
  31. package/src/{blades.standalone.theme.css → standalone/_theme.css} +2 -2
  32. package/src/{_utilities.css → standalone/_utilities.css} +1 -1
  33. package/src/standalone/_variables.css +20 -0
  34. package/src/{link-icon.css → standalone/components/_icon-helper.css} +0 -2
  35. package/src/{components → standalone/components}/_timeline.css +1 -1
  36. package/src/{content → standalone/content}/_code.css +6 -5
  37. package/src/{content/_typography.css → standalone/content/_list.css} +4 -42
  38. package/src/standalone/content/_typography.css +38 -0
  39. package/src/{float-label.core.css → standalone/forms/_float-label.core.css} +12 -4
  40. package/src/standalone/forms/_float-label.css +2 -0
  41. package/src/{breakout.css → standalone/layout/_breakout.css} +3 -6
  42. package/src/{_layout.css → standalone/layout/_columns.css} +2 -12
  43. package/src/standalone/layout/_scroller.css +10 -0
  44. package/_config.yml +0 -5
  45. package/blades.gemspec +0 -16
  46. package/css/blades.standalone.core.css +0 -712
  47. package/css/blades.standalone.theme.css +0 -143
  48. package/css/breakout.css +0 -125
  49. package/css/float-label.core.css +0 -56
  50. package/css/float-label.css +0 -96
  51. package/css/float-label.theme.css +0 -39
  52. package/css/link-icon.css +0 -59
  53. package/css/responsive-table.css +0 -57
  54. package/src/blades.standalone.core.css +0 -23
  55. package/src/float-label.css +0 -3
  56. /package/src/{responsive-table.css → standalone/content/_table-responsive.css} +0 -0
  57. /package/src/{content → standalone/content}/_table.css +0 -0
  58. /package/src/{float-label.theme.css → standalone/forms/_float-label.theme.css} +0 -0
package/css/blades.css CHANGED
@@ -1,10 +1,10 @@
1
- @charset "UTF-8";
2
1
  /*!
3
- * Blades+Pico CSS ✨🥷
4
- * Copyright 2026 - Licensed under MIT
2
+ * Blades CSS v3 with Pico CSS 🥷✨
3
+ * Copyright 2026 (https://blades.ninja/)
4
+ * Licensed under MIT
5
5
  */
6
6
  /*!
7
- * Pico CSS ✨ v2.4
7
+ * Blades CSS' Pico fork v2.5 🥷✨
8
8
  * Copyright 2019-2025 (https://picocss.com)
9
9
  * Copyright 2026 (https://blades.ninja/css/pico/)
10
10
  * Licensed under MIT
@@ -12,7 +12,7 @@
12
12
  /**
13
13
  * Variables
14
14
  */
15
- :root,
15
+ :scope,
16
16
  :host {
17
17
  --pico-font-family-emoji:
18
18
  "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
@@ -59,35 +59,36 @@
59
59
  --pico-icon-loading: url("data:image/svg+xml,%3Csvg fill='none' height='24' width='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' %3E%3Cstyle%3E g %7B animation: rotate 2s linear infinite; transform-origin: center center; %7D circle %7B stroke-dasharray: 75,100; stroke-dashoffset: -5; animation: dash 1.5s ease-in-out infinite; stroke-linecap: round; %7D @keyframes rotate %7B 0%25 %7B transform: rotate(0deg); %7D 100%25 %7B transform: rotate(360deg); %7D %7D @keyframes dash %7B 0%25 %7B stroke-dasharray: 1,100; stroke-dashoffset: 0; %7D 50%25 %7B stroke-dasharray: 44.5,100; stroke-dashoffset: -17.5; %7D 100%25 %7B stroke-dasharray: 44.5,100; stroke-dashoffset: -62; %7D %7D %3C/style%3E%3Cg%3E%3Ccircle cx='12' cy='12' r='10' fill='none' stroke='rgb(136, 145, 164)' stroke-width='4' /%3E%3C/g%3E%3C/svg%3E");
60
60
  }
61
61
  @media (min-width: 576px) {
62
- :root,
62
+ :scope,
63
63
  :host {
64
64
  --pico-font-size: 106.25%;
65
65
  }
66
66
  }
67
67
  @media (min-width: 768px) {
68
- :root,
68
+ :scope,
69
69
  :host {
70
70
  --pico-font-size: 112.5%;
71
71
  }
72
72
  }
73
73
  @media (min-width: 1024px) {
74
- :root,
74
+ :scope,
75
75
  :host {
76
76
  --pico-font-size: 118.75%;
77
77
  }
78
78
  }
79
79
  @media (min-width: 1280px) {
80
- :root,
80
+ :scope,
81
81
  :host {
82
82
  --pico-font-size: 125%;
83
83
  }
84
84
  }
85
85
  @media (min-width: 1536px) {
86
- :root,
86
+ :scope,
87
87
  :host {
88
88
  --pico-font-size: 131.25%;
89
89
  }
90
90
  }
91
+
91
92
  a {
92
93
  --pico-text-decoration: underline;
93
94
  }
@@ -95,9 +96,11 @@ a.secondary,
95
96
  a.contrast {
96
97
  --pico-text-decoration: underline;
97
98
  }
99
+
98
100
  small {
99
101
  --pico-font-size: 0.875em;
100
102
  }
103
+
101
104
  h1,
102
105
  h2,
103
106
  h3,
@@ -106,36 +109,43 @@ h5,
106
109
  h6 {
107
110
  --pico-font-weight: 700;
108
111
  }
112
+
109
113
  h1 {
110
114
  --pico-font-size: 2rem;
111
115
  --pico-line-height: 1.125;
112
116
  --pico-typography-spacing-top: 3rem;
113
117
  }
118
+
114
119
  h2 {
115
120
  --pico-font-size: 1.75rem;
116
121
  --pico-line-height: 1.15;
117
122
  --pico-typography-spacing-top: 2.625rem;
118
123
  }
124
+
119
125
  h3 {
120
126
  --pico-font-size: 1.5rem;
121
127
  --pico-line-height: 1.175;
122
128
  --pico-typography-spacing-top: 2.25rem;
123
129
  }
130
+
124
131
  h4 {
125
132
  --pico-font-size: 1.25rem;
126
133
  --pico-line-height: 1.2;
127
134
  --pico-typography-spacing-top: 1.874rem;
128
135
  }
136
+
129
137
  h5 {
130
138
  --pico-font-size: 1.125rem;
131
139
  --pico-line-height: 1.225;
132
140
  --pico-typography-spacing-top: 1.6875rem;
133
141
  }
142
+
134
143
  h6 {
135
144
  --pico-font-size: 1rem;
136
145
  --pico-line-height: 1.25;
137
146
  --pico-typography-spacing-top: 1.5rem;
138
147
  }
148
+
139
149
  thead th,
140
150
  thead td,
141
151
  tfoot th,
@@ -143,15 +153,18 @@ tfoot td {
143
153
  --pico-font-weight: 600;
144
154
  --pico-border-width: 0.1875rem;
145
155
  }
156
+
146
157
  pre,
147
158
  code,
148
159
  kbd,
149
160
  samp {
150
161
  --pico-font-family: var(--pico-font-family-monospace);
151
162
  }
163
+
152
164
  kbd {
153
165
  --pico-font-weight: bolder;
154
166
  }
167
+
155
168
  input:not(
156
169
  [type="submit"],
157
170
  [type="button"],
@@ -163,25 +176,32 @@ input:not(
163
176
  :where(select, textarea) {
164
177
  --pico-outline-width: 0.0625rem;
165
178
  }
179
+
166
180
  [type="search"] {
167
181
  --pico-border-radius: 5rem;
168
182
  }
183
+
169
184
  [type="checkbox"],
170
185
  [type="radio"] {
171
186
  --pico-border-width: 0.125rem;
172
187
  }
188
+
173
189
  [type="checkbox"][role="switch"] {
174
190
  --pico-border-width: 0.1875rem;
175
191
  }
192
+
176
193
  details.dropdown summary:not([role="button"]) {
177
194
  --pico-outline-width: 0.0625rem;
178
195
  }
196
+
179
197
  nav details.dropdown summary:focus-visible {
180
198
  --pico-outline-width: 0.125rem;
181
199
  }
200
+
182
201
  [role="search"] {
183
202
  --pico-border-radius: 5rem;
184
203
  }
204
+
185
205
  [role="search"]:has(
186
206
  button.secondary:focus,
187
207
  [type="submit"].secondary:focus,
@@ -222,9 +242,11 @@ nav details.dropdown summary:focus-visible {
222
242
  [role="group"] [role="button"] {
223
243
  --pico-form-element-spacing-horizontal: 2rem;
224
244
  }
245
+
225
246
  details summary[role="button"]:not(.outline)::after {
226
247
  filter: brightness(0) invert(1);
227
248
  }
249
+
228
250
  [aria-busy="true"]:not(input, select, textarea):is(
229
251
  button,
230
252
  [type="submit"],
@@ -234,11 +256,12 @@ details summary[role="button"]:not(.outline)::after {
234
256
  ):not(.outline)::before {
235
257
  filter: brightness(0) invert(1);
236
258
  }
259
+
237
260
  /**
238
261
  * Color schemes
239
262
  */
240
263
  [data-theme="light"],
241
- :root:not([data-theme="dark"]),
264
+ :scope:not([data-theme="dark"]),
242
265
  :host(:not([data-theme="dark"])) {
243
266
  color-scheme: light;
244
267
  --pico-background-color: #fff;
@@ -352,7 +375,7 @@ details summary[role="button"]:not(.outline)::after {
352
375
  [type="radio"],
353
376
  [type="file"]
354
377
  ),
355
- :root:not([data-theme="dark"])
378
+ :scope:not([data-theme="dark"])
356
379
  input:is(
357
380
  [type="submit"],
358
381
  [type="button"],
@@ -372,8 +395,9 @@ details summary[role="button"]:not(.outline)::after {
372
395
  ) {
373
396
  --pico-form-element-focus-color: var(--pico-primary-focus);
374
397
  }
398
+
375
399
  @media only screen and (prefers-color-scheme: dark) {
376
- :root:not([data-theme]),
400
+ :scope:not([data-theme]),
377
401
  :host(:not([data-theme])) {
378
402
  color-scheme: dark;
379
403
  --pico-background-color: rgb(19, 22.5, 30.5);
@@ -478,7 +502,7 @@ details summary[role="button"]:not(.outline)::after {
478
502
  --pico-icon-valid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(42, 123, 111)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
479
503
  --pico-icon-invalid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(149.5, 74, 80)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");
480
504
  }
481
- :root:not([data-theme])
505
+ :scope:not([data-theme])
482
506
  input:is(
483
507
  [type="submit"],
484
508
  [type="button"],
@@ -498,11 +522,11 @@ details summary[role="button"]:not(.outline)::after {
498
522
  ) {
499
523
  --pico-form-element-focus-color: var(--pico-primary-focus);
500
524
  }
501
- :root:not([data-theme]) details summary[role="button"].contrast:not(.outline)::after,
525
+ :scope:not([data-theme]) details summary[role="button"].contrast:not(.outline)::after,
502
526
  :host(:not([data-theme])) details summary[role="button"].contrast:not(.outline)::after {
503
527
  filter: brightness(0);
504
528
  }
505
- :root:not([data-theme])
529
+ :scope:not([data-theme])
506
530
  [aria-busy="true"]:not(input, select, textarea).contrast:is(
507
531
  button,
508
532
  [type="submit"],
@@ -649,6 +673,7 @@ details summary[role="button"]:not(.outline)::after {
649
673
  ):not(.outline)::before {
650
674
  filter: brightness(0);
651
675
  }
676
+
652
677
  progress,
653
678
  [type="checkbox"],
654
679
  [type="radio"],
@@ -665,12 +690,14 @@ progress,
665
690
  box-sizing: border-box;
666
691
  background-repeat: no-repeat;
667
692
  }
693
+
668
694
  ::before,
669
695
  ::after {
670
696
  text-decoration: inherit;
671
697
  vertical-align: inherit;
672
698
  }
673
- :where(:root),
699
+
700
+ :where(:scope),
674
701
  :where(:host) {
675
702
  -webkit-tap-highlight-color: transparent;
676
703
  -webkit-text-size-adjust: 100%;
@@ -689,6 +716,7 @@ progress,
689
716
  -o-tab-size: 4;
690
717
  tab-size: 4;
691
718
  }
719
+
692
720
  /**
693
721
  * Landmarks
694
722
  */
@@ -696,20 +724,24 @@ body {
696
724
  width: 100%;
697
725
  margin: 0;
698
726
  }
727
+
699
728
  main {
700
729
  display: block;
701
730
  }
731
+
702
732
  body > header,
703
733
  body > main,
704
734
  body > footer {
705
735
  padding-block: var(--pico-block-spacing-vertical);
706
736
  }
737
+
707
738
  /**
708
739
  * Section
709
740
  */
710
741
  section {
711
742
  margin-bottom: var(--pico-block-spacing-vertical);
712
743
  }
744
+
713
745
  /**
714
746
  * Container
715
747
  */
@@ -721,6 +753,7 @@ section {
721
753
  padding-right: var(--pico-spacing);
722
754
  padding-left: var(--pico-spacing);
723
755
  }
756
+
724
757
  @media (min-width: 576px) {
725
758
  .container {
726
759
  max-width: 510px;
@@ -748,6 +781,7 @@ section {
748
781
  max-width: 1450px;
749
782
  }
750
783
  }
784
+
751
785
  /**
752
786
  * Grid
753
787
  * Minimal grid system with auto-layout columns
@@ -767,6 +801,7 @@ section {
767
801
  min-width: 0;
768
802
  margin-bottom: 0; /* https://github.com/picocss/pico/issues/738 */
769
803
  }
804
+
770
805
  /**
771
806
  * Overflow auto
772
807
  */
@@ -780,6 +815,7 @@ b,
780
815
  strong {
781
816
  font-weight: bolder;
782
817
  }
818
+
783
819
  sub,
784
820
  sup {
785
821
  position: relative;
@@ -787,12 +823,15 @@ sup {
787
823
  line-height: 0;
788
824
  vertical-align: baseline;
789
825
  }
826
+
790
827
  sub {
791
828
  bottom: -0.25em;
792
829
  }
830
+
793
831
  sup {
794
832
  top: -0.5em;
795
833
  }
834
+
796
835
  address,
797
836
  blockquote,
798
837
  dl,
@@ -807,6 +846,7 @@ ul {
807
846
  font-style: normal;
808
847
  font-weight: var(--pico-font-weight);
809
848
  }
849
+
810
850
  h1,
811
851
  h2,
812
852
  h3,
@@ -821,31 +861,40 @@ h6 {
821
861
  line-height: var(--pico-line-height);
822
862
  font-family: var(--pico-font-family);
823
863
  }
864
+
824
865
  h1 {
825
866
  --pico-color: var(--pico-h1-color);
826
867
  }
868
+
827
869
  h2 {
828
870
  --pico-color: var(--pico-h2-color);
829
871
  }
872
+
830
873
  h3 {
831
874
  --pico-color: var(--pico-h3-color);
832
875
  }
876
+
833
877
  h4 {
834
878
  --pico-color: var(--pico-h4-color);
835
879
  }
880
+
836
881
  h5 {
837
882
  --pico-color: var(--pico-h5-color);
838
883
  }
884
+
839
885
  h6 {
840
886
  --pico-color: var(--pico-h6-color);
841
887
  }
888
+
842
889
  :where(article, address, blockquote, dl, figure, form, ol, p, pre, table, ul)
843
890
  ~ :is(h1, h2, h3, h4, h5, h6) {
844
891
  margin-top: var(--pico-typography-spacing-top);
845
892
  }
893
+
846
894
  p {
847
895
  margin-bottom: var(--pico-typography-spacing-vertical);
848
896
  }
897
+
849
898
  hgroup {
850
899
  margin-bottom: var(--pico-typography-spacing-vertical);
851
900
  }
@@ -858,22 +907,27 @@ hgroup > *:not(:first-child):last-child {
858
907
  --pico-font-weight: unset;
859
908
  font-size: 1rem;
860
909
  }
910
+
861
911
  :where(ol, ul) li {
862
912
  margin-bottom: calc(var(--pico-typography-spacing-vertical) * 0.25);
863
913
  }
914
+
864
915
  :where(dl, ol, ul) :where(dl, ol, ul) {
865
916
  margin: 0;
866
917
  margin-top: calc(var(--pico-typography-spacing-vertical) * 0.25);
867
918
  }
919
+
868
920
  ul li {
869
921
  list-style: square;
870
922
  }
923
+
871
924
  mark {
872
925
  padding: 0.125rem 0.25rem;
873
926
  background-color: var(--pico-mark-background-color);
874
927
  color: var(--pico-mark-color);
875
928
  vertical-align: baseline;
876
929
  }
930
+
877
931
  blockquote {
878
932
  display: block;
879
933
  margin: var(--pico-typography-spacing-vertical) 0;
@@ -887,24 +941,30 @@ blockquote footer {
887
941
  margin-top: calc(var(--pico-typography-spacing-vertical) * 0.5);
888
942
  color: var(--pico-blockquote-footer-color);
889
943
  }
944
+
890
945
  abbr[title] {
891
946
  border-bottom: 1px dotted;
892
947
  text-decoration: none;
893
948
  cursor: help;
894
949
  }
950
+
895
951
  ins {
896
952
  color: var(--pico-ins-color);
897
953
  text-decoration: none;
898
954
  }
955
+
899
956
  del {
900
957
  color: var(--pico-del-color);
901
958
  }
959
+
902
960
  ::-moz-selection {
903
961
  background-color: var(--pico-text-selection-color);
904
962
  }
963
+
905
964
  ::selection {
906
965
  background-color: var(--pico-text-selection-color);
907
966
  }
967
+
908
968
  /**
909
969
  * Link
910
970
  */
@@ -982,9 +1042,11 @@ del {
982
1042
  --pico-color: var(--pico-contrast-hover);
983
1043
  --pico-underline: var(--pico-contrast-hover-underline);
984
1044
  }
1045
+
985
1046
  a[role="button"] {
986
1047
  display: inline-block;
987
1048
  }
1049
+
988
1050
  /**
989
1051
  * Button
990
1052
  */
@@ -994,12 +1056,14 @@ button {
994
1056
  font-family: inherit;
995
1057
  text-transform: none;
996
1058
  }
1059
+
997
1060
  button,
998
1061
  [type="submit"],
999
1062
  [type="reset"],
1000
1063
  [type="button"] {
1001
1064
  -webkit-appearance: button;
1002
1065
  }
1066
+
1003
1067
  button,
1004
1068
  [type="submit"],
1005
1069
  [type="reset"],
@@ -1065,11 +1129,13 @@ button:is([aria-current]:not([aria-current="false"])):focus,
1065
1129
  var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),
1066
1130
  0 0 0 var(--pico-outline-width) var(--pico-primary-focus);
1067
1131
  }
1132
+
1068
1133
  [type="submit"],
1069
1134
  [type="reset"],
1070
1135
  [type="button"] {
1071
1136
  margin-bottom: var(--pico-spacing);
1072
1137
  }
1138
+
1073
1139
  :is(button, [type="submit"], [type="button"], [role="button"]).secondary,
1074
1140
  [type="reset"],
1075
1141
  [type="file"]::file-selector-button {
@@ -1107,6 +1173,7 @@ button:is([aria-current]:not([aria-current="false"])):focus,
1107
1173
  var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),
1108
1174
  0 0 0 var(--pico-outline-width) var(--pico-secondary-focus);
1109
1175
  }
1176
+
1110
1177
  :is(button, [type="submit"], [type="button"], [role="button"]).contrast {
1111
1178
  --pico-background-color: var(--pico-contrast-background);
1112
1179
  --pico-border-color: var(--pico-contrast-border);
@@ -1130,6 +1197,7 @@ button:is([aria-current]:not([aria-current="false"])):focus,
1130
1197
  var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),
1131
1198
  0 0 0 var(--pico-outline-width) var(--pico-contrast-focus);
1132
1199
  }
1200
+
1133
1201
  :is(button, [type="submit"], [type="button"], [role="button"]).outline,
1134
1202
  [type="reset"].outline {
1135
1203
  --pico-background-color: transparent;
@@ -1147,6 +1215,7 @@ button:is([aria-current]:not([aria-current="false"])):focus,
1147
1215
  --pico-color: var(--pico-primary-hover);
1148
1216
  --pico-border-color: var(--pico-primary-hover);
1149
1217
  }
1218
+
1150
1219
  :is(button, [type="submit"], [type="button"], [role="button"]).outline.secondary,
1151
1220
  [type="reset"].outline {
1152
1221
  --pico-color: var(--pico-secondary);
@@ -1162,6 +1231,7 @@ button:is([aria-current]:not([aria-current="false"])):focus,
1162
1231
  --pico-color: var(--pico-secondary-hover);
1163
1232
  --pico-border-color: var(--pico-secondary-hover);
1164
1233
  }
1234
+
1165
1235
  :is(button, [type="submit"], [type="button"], [role="button"]).outline.contrast {
1166
1236
  --pico-color: var(--pico-contrast);
1167
1237
  --pico-border-color: var(--pico-contrast);
@@ -1175,12 +1245,14 @@ button:is([aria-current]:not([aria-current="false"])):focus,
1175
1245
  --pico-color: var(--pico-contrast-hover);
1176
1246
  --pico-border-color: var(--pico-contrast-hover);
1177
1247
  }
1248
+
1178
1249
  :where(button, [type="submit"], [type="reset"], [type="button"], [role="button"])[disabled],
1179
1250
  :where(fieldset[disabled])
1180
1251
  :is(button, [type="submit"], [type="button"], [type="reset"], [role="button"]) {
1181
1252
  opacity: 0.5;
1182
1253
  pointer-events: none;
1183
1254
  }
1255
+
1184
1256
  /**
1185
1257
  * Table
1186
1258
  */
@@ -1190,6 +1262,7 @@ button:is([aria-current]:not([aria-current="false"])):focus,
1190
1262
  border-spacing: 0;
1191
1263
  text-indent: 0;
1192
1264
  }
1265
+
1193
1266
  th,
1194
1267
  td {
1195
1268
  padding: calc(var(--pico-spacing) / 2) var(--pico-spacing);
@@ -1199,46 +1272,57 @@ td {
1199
1272
  font-weight: var(--pico-font-weight);
1200
1273
  text-align: start;
1201
1274
  }
1275
+
1202
1276
  tfoot th,
1203
1277
  tfoot td {
1204
1278
  border-top: var(--pico-border-width) solid var(--pico-table-border-color);
1205
1279
  border-bottom: 0;
1206
1280
  }
1281
+
1207
1282
  table.striped tbody tr:nth-child(odd) th,
1208
1283
  table.striped tbody tr:nth-child(odd) td {
1209
1284
  background-color: var(--pico-table-row-stripped-background-color);
1210
1285
  }
1286
+
1211
1287
  /**
1212
1288
  * Embedded content
1213
1289
  */
1214
1290
  :where(audio, canvas, iframe, img, svg, video) {
1215
1291
  vertical-align: middle;
1216
1292
  }
1293
+
1217
1294
  audio,
1218
1295
  video {
1219
1296
  display: inline-block;
1220
1297
  }
1298
+
1221
1299
  audio:not([controls]) {
1222
1300
  display: none;
1223
1301
  height: 0;
1224
1302
  }
1303
+
1225
1304
  :where(iframe) {
1226
1305
  border-style: none;
1227
1306
  }
1307
+
1228
1308
  img:not([height]) {
1229
1309
  max-width: 100%;
1230
1310
  height: auto;
1231
1311
  }
1232
- img{
1312
+
1313
+ img {
1233
1314
  border-style: none;
1234
1315
  }
1316
+
1235
1317
  :where(svg:not([fill])) {
1236
1318
  fill: currentColor;
1237
1319
  }
1238
- svg:not(:root),
1320
+
1321
+ svg:not(:scope),
1239
1322
  svg:not(:host) {
1240
1323
  overflow: hidden;
1241
1324
  }
1325
+
1242
1326
  /**
1243
1327
  * Code
1244
1328
  */
@@ -1250,15 +1334,18 @@ samp {
1250
1334
  font-size: 0.875em;
1251
1335
  font-family: var(--pico-font-family);
1252
1336
  }
1337
+
1253
1338
  pre code,
1254
1339
  pre samp {
1255
1340
  font-size: inherit;
1256
1341
  font-family: inherit;
1257
1342
  }
1343
+
1258
1344
  pre {
1259
1345
  -ms-overflow-style: scrollbar;
1260
1346
  overflow: auto;
1261
1347
  }
1348
+
1262
1349
  pre,
1263
1350
  code,
1264
1351
  var,
@@ -1270,6 +1357,7 @@ samp {
1270
1357
  font-weight: var(--pico-font-weight);
1271
1358
  line-height: initial;
1272
1359
  }
1360
+
1273
1361
  code,
1274
1362
  var,
1275
1363
  kbd,
@@ -1277,6 +1365,7 @@ samp {
1277
1365
  display: inline-block;
1278
1366
  padding: 0.375rem;
1279
1367
  }
1368
+
1280
1369
  pre {
1281
1370
  display: block;
1282
1371
  margin-bottom: var(--pico-spacing);
@@ -1289,11 +1378,13 @@ pre > samp {
1289
1378
  background: none;
1290
1379
  line-height: var(--pico-line-height);
1291
1380
  }
1381
+
1292
1382
  kbd {
1293
1383
  background-color: var(--pico-code-kbd-background-color);
1294
1384
  color: var(--pico-code-kbd-color);
1295
1385
  vertical-align: baseline;
1296
1386
  }
1387
+
1297
1388
  /**
1298
1389
  * Figure
1299
1390
  */
@@ -1306,6 +1397,7 @@ figure figcaption {
1306
1397
  padding: calc(var(--pico-spacing) * 0.5) 0;
1307
1398
  color: var(--pico-muted-color);
1308
1399
  }
1400
+
1309
1401
  /**
1310
1402
  * Misc
1311
1403
  */
@@ -1316,10 +1408,12 @@ hr {
1316
1408
  border-top: 1px solid var(--pico-muted-border-color);
1317
1409
  color: inherit;
1318
1410
  }
1411
+
1319
1412
  [hidden],
1320
1413
  template {
1321
1414
  display: none !important;
1322
1415
  }
1416
+
1323
1417
  canvas {
1324
1418
  display: inline-block;
1325
1419
  }
@@ -1336,64 +1430,80 @@ textarea {
1336
1430
  font-family: inherit;
1337
1431
  letter-spacing: inherit;
1338
1432
  }
1433
+
1339
1434
  input {
1340
1435
  overflow: visible;
1341
1436
  }
1437
+
1342
1438
  select {
1343
1439
  text-transform: none;
1344
1440
  }
1441
+
1345
1442
  legend {
1346
1443
  max-width: 100%;
1347
1444
  padding: 0;
1348
1445
  color: inherit;
1349
1446
  white-space: normal;
1350
1447
  }
1448
+
1351
1449
  textarea {
1352
1450
  overflow: auto;
1353
1451
  }
1452
+
1354
1453
  [type="checkbox"],
1355
1454
  [type="radio"] {
1356
1455
  padding: 0;
1357
1456
  }
1457
+
1358
1458
  ::-webkit-inner-spin-button,
1359
1459
  ::-webkit-outer-spin-button {
1360
1460
  height: auto;
1361
1461
  }
1462
+
1362
1463
  [type="search"] {
1363
1464
  -webkit-appearance: textfield;
1364
1465
  outline-offset: -2px;
1365
1466
  }
1467
+
1366
1468
  [type="search"]::-webkit-search-decoration {
1367
1469
  -webkit-appearance: none;
1368
1470
  }
1471
+
1369
1472
  ::-webkit-file-upload-button {
1370
1473
  -webkit-appearance: button;
1371
1474
  font: inherit;
1372
1475
  }
1476
+
1373
1477
  ::-moz-focus-inner {
1374
1478
  padding: 0;
1375
1479
  border-style: none;
1376
1480
  }
1481
+
1377
1482
  :-moz-focusring {
1378
1483
  outline: none;
1379
1484
  }
1485
+
1380
1486
  :-moz-ui-invalid {
1381
1487
  box-shadow: none;
1382
1488
  }
1489
+
1383
1490
  ::-ms-expand {
1384
1491
  display: none;
1385
1492
  }
1493
+
1386
1494
  [type="file"],
1387
1495
  [type="range"] {
1388
1496
  padding: 0;
1389
1497
  border-width: 0;
1390
1498
  }
1499
+
1391
1500
  input:not([type="checkbox"], [type="radio"], [type="range"]) {
1392
1501
  height: calc(
1393
1502
  1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 +
1394
1503
  var(--pico-border-width) * 2
1395
1504
  );
1396
1505
  }
1506
+
1397
1507
  fieldset {
1398
1508
  width: 100%;
1399
1509
  min-width: 0;
@@ -1402,6 +1512,7 @@ fieldset {
1402
1512
  padding: 0;
1403
1513
  border: 0;
1404
1514
  }
1515
+
1405
1516
  label,
1406
1517
  fieldset legend {
1407
1518
  display: block;
@@ -1409,15 +1520,18 @@ fieldset legend {
1409
1520
  color: var(--pico-color);
1410
1521
  font-weight: var(--pico-form-label-font-weight, var(--pico-font-weight));
1411
1522
  }
1523
+
1412
1524
  fieldset legend {
1413
1525
  margin-bottom: calc(var(--pico-spacing) * 0.5);
1414
1526
  }
1527
+
1415
1528
  input:not([type="checkbox"], [type="radio"]),
1416
1529
  button[type="submit"],
1417
1530
  select,
1418
1531
  textarea {
1419
1532
  width: 100%;
1420
1533
  }
1534
+
1421
1535
  input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]),
1422
1536
  select,
1423
1537
  textarea {
@@ -1426,6 +1540,7 @@ textarea {
1426
1540
  appearance: none;
1427
1541
  padding: var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal);
1428
1542
  }
1543
+
1429
1544
  input,
1430
1545
  select,
1431
1546
  textarea {
@@ -1446,6 +1561,7 @@ textarea {
1446
1561
  color var(--pico-transition),
1447
1562
  box-shadow var(--pico-transition);
1448
1563
  }
1564
+
1449
1565
  input:not(
1450
1566
  [type="submit"],
1451
1567
  [type="button"],
@@ -1457,6 +1573,7 @@ input:not(
1457
1573
  :where(select, textarea):not([readonly]):is(:active, :focus) {
1458
1574
  --pico-background-color: var(--pico-form-element-active-background-color);
1459
1575
  }
1576
+
1460
1577
  input:not([type="submit"], [type="button"], [type="reset"], [role="switch"], [readonly]):is(
1461
1578
  :active,
1462
1579
  :focus
@@ -1464,6 +1581,7 @@ input:not([type="submit"], [type="button"], [type="reset"], [role="switch"], [re
1464
1581
  :where(select, textarea):not([readonly]):is(:active, :focus) {
1465
1582
  --pico-border-color: var(--pico-form-element-active-border-color);
1466
1583
  }
1584
+
1467
1585
  input:not(
1468
1586
  [type="submit"],
1469
1587
  [type="button"],
@@ -1475,6 +1593,7 @@ input:not(
1475
1593
  :where(select, textarea):not([readonly]):focus {
1476
1594
  --pico-box-shadow: 0 0 0 var(--pico-outline-width) var(--pico-form-element-focus-color);
1477
1595
  }
1596
+
1478
1597
  input:not([type="submit"], [type="button"], [type="reset"])[disabled],
1479
1598
  select[disabled],
1480
1599
  textarea[disabled],
@@ -1484,9 +1603,11 @@ label[aria-disabled="true"],
1484
1603
  opacity: var(--pico-form-element-disabled-opacity);
1485
1604
  pointer-events: none;
1486
1605
  }
1606
+
1487
1607
  label[aria-disabled="true"] input[disabled] {
1488
1608
  opacity: 1;
1489
1609
  }
1610
+
1490
1611
  :where(input, select, textarea):not(
1491
1612
  [type="checkbox"],
1492
1613
  [type="radio"],
@@ -1553,6 +1674,7 @@ label[aria-disabled="true"] input[disabled] {
1553
1674
  ) {
1554
1675
  --pico-box-shadow: 0 0 0 var(--pico-outline-width) var(--pico-form-element-invalid-focus-color) !important;
1555
1676
  }
1677
+
1556
1678
  [dir="rtl"]
1557
1679
  :where(input, select, textarea):not([type="checkbox"], [type="radio"]):is(
1558
1680
  [aria-invalid],
@@ -1561,6 +1683,7 @@ label[aria-disabled="true"] input[disabled] {
1561
1683
  ) {
1562
1684
  background-position: center left 0.75rem;
1563
1685
  }
1686
+
1564
1687
  input::placeholder,
1565
1688
  input::-webkit-input-placeholder,
1566
1689
  textarea::placeholder,
@@ -1569,11 +1692,13 @@ select:invalid {
1569
1692
  color: var(--pico-form-element-placeholder-color);
1570
1693
  opacity: 1;
1571
1694
  }
1695
+
1572
1696
  input:not([type="checkbox"], [type="radio"]),
1573
1697
  select,
1574
1698
  textarea {
1575
1699
  margin-bottom: var(--pico-spacing);
1576
1700
  }
1701
+
1577
1702
  select::-ms-expand {
1578
1703
  border: 0;
1579
1704
  background-color: transparent;
@@ -1592,9 +1717,11 @@ select[multiple] option:checked {
1592
1717
  background: var(--pico-form-element-selected-background-color);
1593
1718
  color: var(--pico-form-element-color);
1594
1719
  }
1720
+
1595
1721
  [dir="rtl"] select:not([multiple], [size]) {
1596
1722
  background-position: center left 0.75rem;
1597
1723
  }
1724
+
1598
1725
  textarea {
1599
1726
  display: block;
1600
1727
  resize: vertical;
@@ -1607,6 +1734,7 @@ textarea[aria-invalid] {
1607
1734
  background-position: top right 0.75rem !important;
1608
1735
  background-size: 1rem var(--pico-icon-height) !important;
1609
1736
  }
1737
+
1610
1738
  :where(input, select, textarea, fieldset, .grid) + small {
1611
1739
  display: block;
1612
1740
  width: 100%;
@@ -1620,9 +1748,11 @@ textarea[aria-invalid] {
1620
1748
  :where(input, select, textarea, fieldset, .grid)[aria-invalid="true"] + small {
1621
1749
  color: var(--pico-del-color);
1622
1750
  }
1751
+
1623
1752
  label > :where(input, select, textarea) {
1624
1753
  margin-top: calc(var(--pico-spacing) * 0.25);
1625
1754
  }
1755
+
1626
1756
  /**
1627
1757
  * Checkboxes, Radios and Switches
1628
1758
  */
@@ -1631,6 +1761,7 @@ label:has([type="checkbox"], [type="radio"]) {
1631
1761
  width: fit-content;
1632
1762
  cursor: pointer;
1633
1763
  }
1764
+
1634
1765
  [type="checkbox"],
1635
1766
  [type="radio"] {
1636
1767
  -webkit-appearance: none;
@@ -1671,6 +1802,7 @@ label:has([type="checkbox"], [type="radio"]) {
1671
1802
  [type="radio"] ~ label:not(:last-of-type) {
1672
1803
  margin-inline-end: 1em;
1673
1804
  }
1805
+
1674
1806
  [type="checkbox"]:indeterminate {
1675
1807
  --pico-background-color: var(--pico-primary-background);
1676
1808
  --pico-border-color: var(--pico-primary-border);
@@ -1679,6 +1811,7 @@ label:has([type="checkbox"], [type="radio"]) {
1679
1811
  background-size: 0.75em auto;
1680
1812
  background-repeat: no-repeat;
1681
1813
  }
1814
+
1682
1815
  [type="radio"] {
1683
1816
  border-radius: 50%;
1684
1817
  }
@@ -1689,6 +1822,7 @@ label:has([type="checkbox"], [type="radio"]) {
1689
1822
  border-width: 0.35em;
1690
1823
  background-image: none;
1691
1824
  }
1825
+
1692
1826
  [type="checkbox"][role="switch"] {
1693
1827
  --pico-background-color: var(--pico-switch-background-color);
1694
1828
  --pico-color: var(--pico-switch-color);
@@ -1727,6 +1861,7 @@ label:has([type="checkbox"], [type="radio"]) {
1727
1861
  [type="checkbox"][role="switch"][disabled] {
1728
1862
  --pico-background-color: var(--pico-border-color);
1729
1863
  }
1864
+
1730
1865
  [type="checkbox"][aria-invalid="false"]:checked,
1731
1866
  [type="checkbox"][aria-invalid="false"]:checked:active,
1732
1867
  [type="checkbox"][aria-invalid="false"]:checked:focus,
@@ -1743,6 +1878,7 @@ label:has([type="checkbox"], [type="radio"]) {
1743
1878
  [type="checkbox"][role="switch"]:checked:focus[aria-invalid="true"] {
1744
1879
  --pico-background-color: var(--pico-form-element-invalid-border-color);
1745
1880
  }
1881
+
1746
1882
  [type="checkbox"][aria-invalid="false"]:checked,
1747
1883
  [type="checkbox"][aria-invalid="false"]:checked:active,
1748
1884
  [type="checkbox"][aria-invalid="false"]:checked:focus,
@@ -1765,6 +1901,7 @@ label:has([type="checkbox"], [type="radio"]) {
1765
1901
  [type="checkbox"][role="switch"]:checked:focus[aria-invalid="true"] {
1766
1902
  --pico-border-color: var(--pico-form-element-invalid-border-color);
1767
1903
  }
1904
+
1768
1905
  /**
1769
1906
  * Input type color
1770
1907
  */
@@ -1782,6 +1919,7 @@ label:has([type="checkbox"], [type="radio"]) {
1782
1919
  border: 0;
1783
1920
  border-radius: calc(var(--pico-border-radius) * 0.5);
1784
1921
  }
1922
+
1785
1923
  /**
1786
1924
  * Input type datetime
1787
1925
  */
@@ -1804,6 +1942,7 @@ input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]):is(
1804
1942
  input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"])[type="time"] {
1805
1943
  background-image: var(--pico-icon-time);
1806
1944
  }
1945
+
1807
1946
  [type="date"]::-webkit-calendar-picker-indicator,
1808
1947
  [type="datetime-local"]::-webkit-calendar-picker-indicator,
1809
1948
  [type="month"]::-webkit-calendar-picker-indicator,
@@ -1814,6 +1953,7 @@ input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"])[type
1814
1953
  margin-left: var(--pico-icon-position);
1815
1954
  opacity: 0;
1816
1955
  }
1956
+
1817
1957
  @-moz-document url-prefix() {
1818
1958
  [type="date"],
1819
1959
  [type="datetime-local"],
@@ -1828,6 +1968,7 @@ input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"])[type
1828
1968
  :is([type="date"], [type="datetime-local"], [type="month"], [type="time"], [type="week"]) {
1829
1969
  text-align: end;
1830
1970
  }
1971
+
1831
1972
  /**
1832
1973
  * Input type file
1833
1974
  */
@@ -1854,6 +1995,7 @@ input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"])[type
1854
1995
  var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),
1855
1996
  0 0 0 var(--pico-outline-width) var(--pico-secondary-focus);
1856
1997
  }
1998
+
1857
1999
  /**
1858
2000
  * Input type range
1859
2001
  */
@@ -1963,6 +2105,7 @@ input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"])[type
1963
2105
  [type="range"]:active::-ms-thumb {
1964
2106
  transform: scale(1.25);
1965
2107
  }
2108
+
1966
2109
  /**
1967
2110
  * Input type search
1968
2111
  */
@@ -2000,6 +2143,7 @@ input:not(
2000
2143
  )[type="search"][aria-invalid="true"] {
2001
2144
  background-image: var(--pico-icon-search), var(--pico-icon-invalid);
2002
2145
  }
2146
+
2003
2147
  [dir="rtl"]
2004
2148
  :where(input):not(
2005
2149
  [type="checkbox"],
@@ -2086,6 +2230,7 @@ details[open] > summary:not([role]):not(:focus) {
2086
2230
  details[open] > summary::after {
2087
2231
  transform: rotate(0);
2088
2232
  }
2233
+
2089
2234
  [dir="rtl"] details summary {
2090
2235
  text-align: end;
2091
2236
  }
@@ -2093,6 +2238,7 @@ details[open] > summary::after {
2093
2238
  float: left;
2094
2239
  background-position: left center;
2095
2240
  }
2241
+
2096
2242
  /**
2097
2243
  * Card (<article>)
2098
2244
  */
@@ -2124,6 +2270,7 @@ article > footer {
2124
2270
  border-bottom-right-radius: var(--pico-border-radius);
2125
2271
  border-bottom-left-radius: var(--pico-border-radius);
2126
2272
  }
2273
+
2127
2274
  /**
2128
2275
  * Dropdown (details.dropdown)
2129
2276
  */
@@ -2146,9 +2293,11 @@ details.dropdown > a::after {
2146
2293
  background-repeat: no-repeat;
2147
2294
  content: "";
2148
2295
  }
2296
+
2149
2297
  nav details.dropdown {
2150
2298
  margin-bottom: 0;
2151
2299
  }
2300
+
2152
2301
  details.dropdown > summary:not([role]) {
2153
2302
  height: calc(
2154
2303
  1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 +
@@ -2191,6 +2340,7 @@ details.dropdown > summary:not([role])[aria-invalid="true"] {
2191
2340
  --pico-form-element-active-border-color: var(--pico-form-element-invalid-focus-color);
2192
2341
  --pico-form-element-focus-color: var(--pico-form-element-invalid-focus-color);
2193
2342
  }
2343
+
2194
2344
  nav details.dropdown {
2195
2345
  display: inline-block;
2196
2346
  margin: calc(var(--pico-nav-element-spacing-vertical) * -1) 0;
@@ -2206,6 +2356,7 @@ nav details.dropdown > summary:not([role]) {
2206
2356
  nav details.dropdown > summary:not([role]):focus-visible {
2207
2357
  box-shadow: 0 0 0 var(--pico-outline-width) var(--pico-primary-focus);
2208
2358
  }
2359
+
2209
2360
  details.dropdown > summary + ul {
2210
2361
  display: flex;
2211
2362
  z-index: 99;
@@ -2271,9 +2422,11 @@ details.dropdown > summary + ul li label {
2271
2422
  details.dropdown > summary + ul li:has(label):hover {
2272
2423
  background-color: var(--pico-dropdown-hover-background-color);
2273
2424
  }
2425
+
2274
2426
  details.dropdown[open] > summary {
2275
2427
  margin-bottom: 0;
2276
2428
  }
2429
+
2277
2430
  details.dropdown[open] > summary + ul {
2278
2431
  transform: scaleY(1);
2279
2432
  opacity: 1;
@@ -2281,6 +2434,7 @@ details.dropdown[open] > summary + ul {
2281
2434
  opacity var(--pico-transition),
2282
2435
  transform 0s ease-in-out 0s;
2283
2436
  }
2437
+
2284
2438
  details.dropdown[open] > summary::before {
2285
2439
  display: block;
2286
2440
  z-index: 1;
@@ -2292,9 +2446,11 @@ details.dropdown[open] > summary::before {
2292
2446
  content: "";
2293
2447
  cursor: default;
2294
2448
  }
2449
+
2295
2450
  label > details.dropdown {
2296
2451
  margin-top: calc(var(--pico-spacing) * 0.25);
2297
2452
  }
2453
+
2298
2454
  /**
2299
2455
  * Group ([role="group"], [role="search"])
2300
2456
  */
@@ -2453,6 +2609,7 @@ label > details.dropdown {
2453
2609
  box-shadow: none;
2454
2610
  }
2455
2611
  }
2612
+
2456
2613
  [role="search"] > *:first-child {
2457
2614
  border-top-left-radius: 5rem;
2458
2615
  border-bottom-left-radius: 5rem;
@@ -2461,6 +2618,7 @@ label > details.dropdown {
2461
2618
  border-top-right-radius: 5rem;
2462
2619
  border-bottom-right-radius: 5rem;
2463
2620
  }
2621
+
2464
2622
  /**
2465
2623
  * Loading ([aria-busy=true])
2466
2624
  */
@@ -2483,6 +2641,7 @@ label > details.dropdown {
2483
2641
  [aria-busy="true"]:not(input, select, textarea, html, form):empty {
2484
2642
  text-align: center;
2485
2643
  }
2644
+
2486
2645
  button[aria-busy="true"],
2487
2646
  [type="submit"][aria-busy="true"],
2488
2647
  [type="button"][aria-busy="true"],
@@ -2491,13 +2650,15 @@ button[aria-busy="true"],
2491
2650
  a[aria-busy="true"] {
2492
2651
  pointer-events: none;
2493
2652
  }
2653
+
2494
2654
  /**
2495
2655
  * Modal (<dialog>)
2496
2656
  */
2497
- :root,
2657
+ :scope,
2498
2658
  :host {
2499
2659
  --pico-scrollbar-width: 0px;
2500
2660
  }
2661
+
2501
2662
  dialog {
2502
2663
  display: flex;
2503
2664
  z-index: 999;
@@ -2587,6 +2748,7 @@ dialog:not([open]),
2587
2748
  dialog[open="false"] {
2588
2749
  display: none;
2589
2750
  }
2751
+
2590
2752
  .modal-is-open {
2591
2753
  padding-right: var(--pico-scrollbar-width, 0px);
2592
2754
  overflow: hidden;
@@ -2597,6 +2759,7 @@ dialog[open="false"] {
2597
2759
  pointer-events: auto;
2598
2760
  touch-action: auto;
2599
2761
  }
2762
+
2600
2763
  :where(.modal-is-opening, .modal-is-closing) dialog,
2601
2764
  :where(.modal-is-opening, .modal-is-closing) dialog > article {
2602
2765
  animation-duration: 0.2s;
@@ -2611,11 +2774,13 @@ dialog[open="false"] {
2611
2774
  animation-delay: 0.2s;
2612
2775
  animation-name: modal;
2613
2776
  }
2777
+
2614
2778
  .modal-is-closing dialog,
2615
2779
  .modal-is-closing dialog > article {
2616
2780
  animation-delay: 0s;
2617
2781
  animation-direction: reverse;
2618
2782
  }
2783
+
2619
2784
  @keyframes modal-overlay {
2620
2785
  from {
2621
2786
  backdrop-filter: none;
@@ -2635,10 +2800,12 @@ dialog[open="false"] {
2635
2800
  float: left;
2636
2801
  content: "​";
2637
2802
  }
2803
+
2638
2804
  nav,
2639
2805
  nav ul {
2640
2806
  display: flex;
2641
2807
  }
2808
+
2642
2809
  nav {
2643
2810
  justify-content: space-between;
2644
2811
  overflow: visible;
@@ -2713,6 +2880,7 @@ nav[aria-label="breadcrumb"] a[aria-current]:not([aria-current="false"]) {
2713
2880
  text-decoration: none;
2714
2881
  pointer-events: none;
2715
2882
  }
2883
+
2716
2884
  aside nav,
2717
2885
  aside ol,
2718
2886
  aside ul,
@@ -2729,9 +2897,11 @@ aside li a {
2729
2897
  aside li [role="button"] {
2730
2898
  margin: inherit;
2731
2899
  }
2900
+
2732
2901
  [dir="rtl"] nav[aria-label="breadcrumb"] ul li:not(:last-child)::after {
2733
2902
  content: "\\";
2734
2903
  }
2904
+
2735
2905
  /**
2736
2906
  * Progress
2737
2907
  */
@@ -2739,6 +2909,7 @@ progress {
2739
2909
  display: inline-block;
2740
2910
  vertical-align: baseline;
2741
2911
  }
2912
+
2742
2913
  progress {
2743
2914
  -webkit-appearance: none;
2744
2915
  -moz-appearance: none;
@@ -2783,11 +2954,13 @@ progress::-moz-progress-bar {
2783
2954
  background-color: transparent;
2784
2955
  }
2785
2956
  }
2957
+
2786
2958
  @media (prefers-reduced-motion: no-preference) {
2787
2959
  [dir="rtl"] progress:indeterminate {
2788
2960
  animation-direction: reverse;
2789
2961
  }
2790
2962
  }
2963
+
2791
2964
  @keyframes progress-indeterminate {
2792
2965
  0% {
2793
2966
  background-position: 200% 0;
@@ -2969,17 +3142,21 @@ progress::-moz-progress-bar {
2969
3142
  [aria-controls] {
2970
3143
  cursor: pointer;
2971
3144
  }
3145
+
2972
3146
  [aria-disabled="true"],
2973
3147
  [disabled] {
2974
3148
  cursor: not-allowed;
2975
3149
  }
3150
+
2976
3151
  [aria-hidden="false"][hidden] {
2977
3152
  display: initial;
2978
3153
  }
3154
+
2979
3155
  [aria-hidden="false"][hidden]:not(:focus) {
2980
3156
  clip: rect(0, 0, 0, 0);
2981
3157
  position: absolute;
2982
3158
  }
3159
+
2983
3160
  a,
2984
3161
  area,
2985
3162
  button,
@@ -2991,9 +3168,11 @@ textarea,
2991
3168
  [tabindex] {
2992
3169
  -ms-touch-action: manipulation;
2993
3170
  }
3171
+
2994
3172
  [dir="rtl"] {
2995
3173
  direction: rtl;
2996
3174
  }
3175
+
2997
3176
  /**
2998
3177
  * Reduce Motion Features
2999
3178
  */
@@ -3010,46 +3189,37 @@ textarea,
3010
3189
  transition-duration: 0s !important;
3011
3190
  }
3012
3191
  }
3192
+ /*!
3193
+ * Blades CSS standalone kit v3 🥷
3194
+ * Copyright 2026 (https://blades.ninja/css/standalone/)
3195
+ * Licensed under MIT
3196
+ */
3013
3197
  /*\3c !--section:code-->```css */
3014
- /* Follows https://github.com/picocss/pico/blob/main/scss/_index.scss */
3015
- /* Layout */
3016
- /*\3c !--section:columns-->
3017
-
3018
- `.columns` automatically creates columns with at least 30 characters each:
3019
-
3020
- <article class="columns">
3021
- <p>1</p><p>2</p><p>3</p><p>4</p><p>5</p><p>6</p>
3022
- </article>
3023
-
3024
- The smaller the font size, the more columns will be created:
3025
-
3026
- <article class="columns" style="font-size: 65%">
3027
- <p>1</p><p>2</p><p>3</p><p>4</p><p>5</p><p>6</p><p>7</p><p>8</p><p>9</p>
3028
- </article>
3029
3198
 
3030
- Useful for tables of contents and long lists.
3199
+ /* Follows https://github.com/picocss/pico/blob/main/scss/_index.scss */
3031
3200
 
3032
- How it works:
3033
- ```css */
3034
- .columns {
3035
- -moz-columns: 25ch auto;
3036
- columns: 25ch auto; /* common container 65ch / 25ch => 2 columns max, with a buffer for list paddings */
3201
+ :scope,
3202
+ :host {
3203
+ /**
3204
+ * Design Tokens !!! NAMING NOT FINALIZED YET !!!
3205
+ * `--in-pico: *` props below are for reference only (not to be used)
3206
+ */
3207
+ --blades-token-primary: var(--pico-primary, dodgerblue);
3208
+ --in-pico: #01aaff;
3209
+ --blades-token-secondary: var(--pico-secondary, lightslategray);
3210
+ --in-pico: #969eaf;
3211
+
3212
+ /**
3213
+ * Inherited Variables
3214
+ */
3215
+ --blades-timeline-border-color: color-mix(
3216
+ in srgb,
3217
+ var(--blades-token-secondary) 50%,
3218
+ transparent
3219
+ );
3037
3220
  }
3038
- /* Avoid breaking inside elements, such as nested lists */
3039
- .columns > * {
3040
- -moz-column-break-inside: avoid;
3041
- break-inside: avoid;
3042
- }
3043
- /*```\3c !--section:jump-->
3044
3221
 
3045
- `data-jump-to="top"` fixes element to the corner and adds extra top padding to make it easy to click:
3046
- ```css */
3047
- [data-jump-to="top"] {
3048
- position: fixed;
3049
- right: 0;
3050
- bottom: 0;
3051
- padding-top: 50vh;
3052
- }
3222
+ /* Layout */
3053
3223
  /*
3054
3224
  \3c !--section:code-->
3055
3225
  ```css */
@@ -3098,11 +3268,14 @@ How it works:
3098
3268
  }
3099
3269
  /* Max out the width of the element */
3100
3270
  .breakout > *.breakout-item-max, .breakout-all > *.breakout-item-max {
3101
- width: min(125%, 100dvw) !important; /* !important is for cases like figure.breakout-item-max @TODO */
3271
+ width: min(125%, 100dvw) !important;
3272
+ /* !important is for cases like figure.breakout-item-max @TODO */
3102
3273
  }
3274
+
3103
3275
  .breakout-all > *:is(h2, h3, h4, h5, h6, hr):not([class]) {
3104
3276
  position: relative;
3105
3277
  }
3278
+
3106
3279
  .breakout-all > *:is(h2, h3, h4, h5, h6, hr):not([class])::before {
3107
3280
  display: block;
3108
3281
  position: absolute;
@@ -3110,6 +3283,7 @@ How it works:
3110
3283
  content: "";
3111
3284
  opacity: 12.5%;
3112
3285
  }
3286
+
3113
3287
  .breakout-all > *:is(h2, h3, h4, h5, h6):not([class])::before {
3114
3288
  top: 50%;
3115
3289
  right: 100%;
@@ -3119,15 +3293,19 @@ How it works:
3119
3293
  transform: translateY(-50%);
3120
3294
  background: linear-gradient(to left, gray, transparent);
3121
3295
  }
3296
+
3122
3297
  /* @TODO: add to tricks-wiki why `*` works here, but `&` fails */
3298
+
3123
3299
  .breakout-all > *:is(h2, h3, h4, h5, h6):not([class]):where(hr + *)::before {
3124
3300
  display: none !important;
3125
3301
  }
3302
+
3126
3303
  .breakout-all > *:is(hr) {
3127
3304
  height: 0.5rem;
3128
3305
  overflow: visible;
3129
3306
  border: none;
3130
3307
  }
3308
+
3131
3309
  .breakout-all > *:is(hr)::before {
3132
3310
  left: 50%;
3133
3311
  width: 100dvw;
@@ -3135,13 +3313,9 @@ How it works:
3135
3313
  transform: translateX(-50%);
3136
3314
  }
3137
3315
  /*```
3138
- \3c !--section:summary-->
3139
-
3140
- The `.breakout` layout allows images, tables, and other figures to automatically extend or bleed beyond their parent container’s width.
3141
-
3142
3316
  \3c !--section:docs-->
3143
3317
 
3144
- ### Demo \3c !-- inside parent .breakout -->
3318
+ The `.breakout` layout allows images, tables, and other figures to automatically extend or bleed beyond their parent container’s width.
3145
3319
 
3146
3320
  Break out a wide image from the text flow:
3147
3321
 
@@ -3175,8 +3349,48 @@ Or anything else:
3175
3349
  <hr>
3176
3350
 
3177
3351
  \3c !--section--> */
3352
+ /*\3c !--section:docs-->
3353
+
3354
+ `.columns` automatically creates columns with at least 30 characters each:
3355
+
3356
+ <article class="columns">
3357
+ <p>1</p><p>2</p><p>3</p><p>4</p><p>5</p><p>6</p>
3358
+ </article>
3359
+
3360
+ The smaller the font size, the more columns will be created:
3361
+
3362
+ <article class="columns" style="font-size: 65%">
3363
+ <p>1</p><p>2</p><p>3</p><p>4</p><p>5</p><p>6</p><p>7</p><p>8</p><p>9</p>
3364
+ </article>
3365
+
3366
+ Useful for tables of contents and long lists.
3367
+
3368
+ \3c !--section:code-->
3369
+ ```css */
3370
+ .columns {
3371
+ -moz-columns: 25ch auto;
3372
+ columns: 25ch auto; /* common container 65ch / 25ch => 2 columns max, with a buffer for list paddings */
3373
+ }
3374
+ /* Avoid breaking inside elements, such as nested lists */
3375
+ .columns > * {
3376
+ -moz-column-break-inside: avoid;
3377
+ break-inside: avoid;
3378
+ }
3379
+ /*```\3c !--section:docs-->
3380
+
3381
+ `<a href="#top">` is automatically fixed to the bottom-right corner with extra top padding for easier clicking:
3382
+ ```css */
3383
+ [href="#top"] {
3384
+ position: fixed;
3385
+ right: 0;
3386
+ bottom: 0;
3387
+ padding-top: 50vh;
3388
+ }
3389
+
3178
3390
  /* Content */
3179
- /*\3c !--section:h-anchor-->
3391
+ /*\3c !--section:docs-->
3392
+
3393
+ ## Heading anchors
3180
3394
 
3181
3395
  Links with `href="#..."` inside headings are automatically displayed as anchors:
3182
3396
 
@@ -3209,11 +3423,9 @@ h1 a[aria-hidden="true"], h2 a[aria-hidden="true"], h3 a[aria-hidden="true"], h4
3209
3423
  visibility: visible;
3210
3424
  }
3211
3425
  }
3212
- /*```
3213
-
3214
- **PRO** example of automatic anchors for `11ty`+`markdown-it-anchor`: https://github.com/anyblades/eleventy-blades/blob/main/src/eleventy.config.js
3426
+ /*\3c !--section:docs-->
3215
3427
 
3216
- \3c !--section:list-->
3428
+ ## Custom markers
3217
3429
 
3218
3430
  Customize markers using inline `style="--list-marker:..."` on `<ul>/<ol>` or even individual `<li>`:
3219
3431
 
@@ -3246,7 +3458,7 @@ ul li[data-marker]::marker, ol li[data-marker]::marker {
3246
3458
  }
3247
3459
  /*```
3248
3460
 
3249
- ### Markerless
3461
+ ## Markerless
3250
3462
 
3251
3463
  `.markerless` removes markers and reduces padding:
3252
3464
 
@@ -3269,7 +3481,7 @@ ul.markerless li, ol.markerless li {
3269
3481
  }
3270
3482
  /*```
3271
3483
 
3272
- ### Unlist
3484
+ ## Unlist
3273
3485
 
3274
3486
  `.unlist` removes list styling at all:
3275
3487
 
@@ -3297,65 +3509,6 @@ ul.unlist,
3297
3509
  ul.unlist > li, ul.unlist-all > li, .unlist-all ul > li, ol.unlist > li, ol.unlist-all > li, .unlist-all ol > li {
3298
3510
  list-style: none;
3299
3511
  }
3300
- /* Extends https://github.com/picocss/pico/blob/main/scss/content/_link.scss
3301
- \3c !--section:code-->
3302
- ```css */
3303
- /* Use inline flex only if link contains an icon */
3304
- a:not(.does-not-exist):has(> i) {
3305
- display: inline-flex;
3306
- overflow-y: clip; /* to work in pair with text-underline-offset in Safari */
3307
- gap: 0.375ch; /* =3/8 */
3308
- text-wrap: balance;
3309
- }
3310
- a:not(.does-not-exist) > i {
3311
- float: left; /* ✅ Chrome ❌ Safari */
3312
- font-style: normal;
3313
- text-underline-offset: -2em; /* ❌ Chrome ✅ Safari - to clip it with overflow-y */
3314
- }
3315
- /* Favicons */
3316
- a:not(.does-not-exist) > i > img {
3317
- display: inline-block; /* for Tailwind CSS Typography */
3318
- max-width: none; /* to keep ratio safe */
3319
- height: 1.25em;
3320
- margin-block-start: calc(-0.25em / 2);
3321
- }
3322
- a:not(.does-not-exist) > i[class^="fa-"],
3323
- a:not(.does-not-exist) > i[class*=" fa-"] {
3324
- line-height: inherit;
3325
- --fa-width: auto;
3326
- }
3327
- /* Font Awesome */
3328
- a:not(.does-not-exist) > i.fa-lg {
3329
- line-height: normal;
3330
- }
3331
- /*```
3332
- \3c !--section:summary-->
3333
-
3334
- Use *Bl*ades `<i>`-helper to wrap emojis, favicons, or simply drop Font Awesome icons inside links.
3335
- It automatically handles sizing and alignment while preventing underline on icons.
3336
-
3337
- \3c !--section:docs-->
3338
-
3339
- <article class="breakout-item">
3340
-
3341
- | Use `<i>`-helper with | Clean HTML without `<span>ning` |
3342
- | ------------------------------------------------------------------------------------- | ------------------------------------ |
3343
- | [<i>🥷</i> Emojis](#) | `<a><i>🥷</i> Text</a>` |
3344
- | [<i>![](https://www.google.com/s2/favicons?domain=any.digital&sz=64)</i> Favicons](#) | `<a><i><img src="..."></i> Text</a>` |
3345
- | [<i class="fa-brands fa-github fa-lg"></i> Font Awesome icons](#) | `<a><i class="fa-..."></i> Text</a>` |
3346
- </article>
3347
-
3348
- Or even for:
3349
-
3350
- <article>
3351
- <a href="#" style="margin: 0 0 0 1rem"><i>🥷</i> very-very-very-very-very-<br>long-multiline-links</a>
3352
- </article>
3353
-
3354
- How we made it: https://codepen.io/editor/anydigital/pen/019d2b94-5616-75dc-a23e-e111869d5237
3355
-
3356
- **PRO** example of automatic favicons for `11ty`: https://blades.ninja/build-awesome-11ty/processors/#auto-link-favicons
3357
-
3358
- \3c !--section--> */
3359
3512
  /*\3c !--section:docs-->
3360
3513
 
3361
3514
  ## Column expanders
@@ -3470,11 +3623,12 @@ Living examples: \3c !--A-Z-->
3470
3623
 
3471
3624
  The `<pre><code>` blocks are Prism-compatible and support captions via `data-caption="..."` attribute:
3472
3625
 
3473
- ```treeview {data-caption="Blades CSS:"}
3474
- ./css/
3475
- ├── blades.core.css # reusable class-light utilities, unthemed
3476
- ├── blades.theme.css # minimal opinionated theme
3477
- └── blades.css # above two together
3626
+ ```treeview {data-caption="Blades CSS ships:"}
3627
+ /css/
3628
+ ├── blades.css (Pico CSS successor)
3629
+ ├── blades.standalone.css (framework-agnostic)
3630
+ ├── ninja.css (experimental add-ons)
3631
+ └── pico.css (underlying fork)
3478
3632
  ```
3479
3633
 
3480
3634
  \3c !--section:code-->
@@ -3484,7 +3638,9 @@ pre {
3484
3638
  border-radius: 0
3485
3639
  }
3486
3640
  }
3641
+
3487
3642
  /* Code block caption via data-attr (to display filename, etc.) */
3643
+
3488
3644
  code[data-caption]::before {
3489
3645
  display: block;
3490
3646
  margin-bottom: 1rem;
@@ -3492,25 +3648,45 @@ code[data-caption]::before {
3492
3648
  font-style: italic;
3493
3649
  opacity: 50%;
3494
3650
  }
3651
+
3495
3652
  /* Forms */
3496
- /* Sources moved here from https://github.com/anyblades/float-label-css for easier maintenance
3497
- \3c !--section:docs-->
3653
+ /*!
3654
+ * Float Label CSS v2 by Blades CSS 🥷🏷️
3655
+ * Copyright 2016–2026 (https://blades.ninja/css/float-label/)
3656
+ * Licensed under MIT
3657
+ */
3658
+ /*\3c !--section:docs-->
3498
3659
 
3499
3660
  First, we target either:
3500
3661
  1. `<label>` which `:has` inner form inputs (classless approach)
3501
3662
  2. or explicit `.has-float-label` class (explicit approach)
3502
3663
 
3503
3664
  ```css */
3504
- label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select),
3665
+ label:has(> span):has(
3666
+ input:not([type="checkbox"], [type="radio"], [type="range"]),
3667
+ textarea,
3668
+ select
3669
+ ),
3505
3670
  .has-float-label {
3506
3671
  display: block;
3507
3672
  position: relative;
3673
+ /*```
3674
+ Finally, we detect if placeholder is shown, but not in focus. That means we can safely hide it, and enlarge the float label instead:
3675
+ ```css */
3508
3676
  }
3509
3677
  /*```
3510
3678
  Then, we define the default/fallback state (when the float label should be minimized):
3511
3679
  ```css */
3512
- label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) > span,
3513
- label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) label,
3680
+ label:has(> span):has(
3681
+ input:not([type="checkbox"], [type="radio"], [type="range"]),
3682
+ textarea,
3683
+ select
3684
+ ) > span,
3685
+ label:has(> span):has(
3686
+ input:not([type="checkbox"], [type="radio"], [type="range"]),
3687
+ textarea,
3688
+ select
3689
+ ) label,
3514
3690
  .has-float-label > span,
3515
3691
  .has-float-label label {
3516
3692
  position: absolute;
@@ -3519,24 +3695,49 @@ label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"
3519
3695
  font-size: 75%;
3520
3696
  cursor: text;
3521
3697
  }
3522
- /*```
3523
- Finally, we detect if placeholder is shown, but not in focus. That means we can safely hide it, and enlarge the float label instead:
3524
- ```css */
3525
- label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) *:placeholder-shown:not(:focus)::-moz-placeholder, .has-float-label *:placeholder-shown:not(:focus)::-moz-placeholder {
3698
+ label:has(> span):has(
3699
+ input:not([type="checkbox"], [type="radio"], [type="range"]),
3700
+ textarea,
3701
+ select
3702
+ ) *:placeholder-shown:not(:focus)::-moz-placeholder, .has-float-label *:placeholder-shown:not(:focus)::-moz-placeholder {
3526
3703
  opacity: 0;
3527
3704
  }
3528
- label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) *:-moz-placeholder:not(:focus)::placeholder, .has-float-label *:-moz-placeholder:not(:focus)::placeholder {
3705
+ label:has(> span):has(
3706
+ input:not([type="checkbox"], [type="radio"], [type="range"]),
3707
+ textarea,
3708
+ select
3709
+ ) *:-moz-placeholder:not(:focus)::placeholder, .has-float-label *:-moz-placeholder:not(:focus)::placeholder {
3529
3710
  opacity: 0;
3530
3711
  }
3531
- label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) *:placeholder-shown:not(:focus)::placeholder, .has-float-label *:placeholder-shown:not(:focus)::placeholder {
3712
+ label:has(> span):has(
3713
+ input:not([type="checkbox"], [type="radio"], [type="range"]),
3714
+ textarea,
3715
+ select
3716
+ ) *:placeholder-shown:not(:focus)::placeholder, .has-float-label *:placeholder-shown:not(:focus)::placeholder {
3532
3717
  opacity: 0;
3533
3718
  }
3534
- label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select):has(*:-moz-placeholder:not(:focus)) > span, label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select):has(*:-moz-placeholder:not(:focus)) label, .has-float-label:has(*:-moz-placeholder:not(:focus)) > span, .has-float-label:has(*:-moz-placeholder:not(:focus)) label {
3719
+ label:has(> span):has(
3720
+ input:not([type="checkbox"], [type="radio"], [type="range"]),
3721
+ textarea,
3722
+ select
3723
+ ):has(*:-moz-placeholder:not(:focus)) > span, label:has(> span):has(
3724
+ input:not([type="checkbox"], [type="radio"], [type="range"]),
3725
+ textarea,
3726
+ select
3727
+ ):has(*:-moz-placeholder:not(:focus)) label, .has-float-label:has(*:-moz-placeholder:not(:focus)) > span, .has-float-label:has(*:-moz-placeholder:not(:focus)) label {
3535
3728
  font-size: inherit;
3536
3729
  opacity: 50%;
3537
3730
  }
3538
- label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select):has(*:placeholder-shown:not(:focus)) > span,
3539
- label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select):has(*:placeholder-shown:not(:focus)) label,
3731
+ label:has(> span):has(
3732
+ input:not([type="checkbox"], [type="radio"], [type="range"]),
3733
+ textarea,
3734
+ select
3735
+ ):has(*:placeholder-shown:not(:focus)) > span,
3736
+ label:has(> span):has(
3737
+ input:not([type="checkbox"], [type="radio"], [type="range"]),
3738
+ textarea,
3739
+ select
3740
+ ):has(*:placeholder-shown:not(:focus)) label,
3540
3741
  .has-float-label:has(*:placeholder-shown:not(:focus)) > span,
3541
3742
  .has-float-label:has(*:placeholder-shown:not(:focus)) label {
3542
3743
  font-size: inherit;
@@ -3548,8 +3749,66 @@ The `:has(*:placeholder-shown:not(:focus))` trick allows this input state inform
3548
3749
 
3549
3750
  Historically, this was not possible: the float label had to be placed after the input field to be targeted using the `input:focus + label` selector.
3550
3751
 
3551
- \3c !--section-->*/
3752
+ */
3753
+
3552
3754
  /* Components */
3755
+ /* Extends https://github.com/picocss/pico/blob/main/scss/content/_link.scss
3756
+ \3c !--section:code-->
3757
+ ```css */
3758
+ /* Use inline flex only if link contains an icon */
3759
+ a:not(.does-not-exist):has(> i) {
3760
+ display: inline-flex;
3761
+ overflow-y: clip; /* to work in pair with text-underline-offset in Safari */
3762
+ gap: 0.375ch; /* =3/8 */
3763
+ text-wrap: balance;
3764
+ }
3765
+ a:not(.does-not-exist) > i {
3766
+ float: left; /* ✅ Chrome ❌ Safari */
3767
+ font-style: normal;
3768
+ text-underline-offset: -2em; /* ❌ Chrome ✅ Safari - to clip it with overflow-y */
3769
+ }
3770
+ /* Favicons */
3771
+ a:not(.does-not-exist) > i > img {
3772
+ display: inline-block; /* for Tailwind CSS Typography */
3773
+ max-width: none; /* to keep ratio safe */
3774
+ height: 1.25em;
3775
+ margin-block-start: calc(-0.25em / 2);
3776
+ }
3777
+ a:not(.does-not-exist) > i[class^="fa-"],
3778
+ a:not(.does-not-exist) > i[class*=" fa-"] {
3779
+ line-height: inherit;
3780
+ --fa-width: auto;
3781
+ }
3782
+ /* Font Awesome */
3783
+ a:not(.does-not-exist) > i.fa-lg {
3784
+ line-height: normal;
3785
+ }
3786
+ /*```
3787
+ \3c !--section:summary-->
3788
+
3789
+ Use *Bl*ades `<i>`-helper to wrap emojis, favicons, or simply drop Font Awesome icons inside links.
3790
+ It automatically handles sizing and alignment while preventing underline on icons.
3791
+
3792
+ \3c !--section:docs-->
3793
+
3794
+ <article class="breakout-item">
3795
+
3796
+ | Use `<i>`-helper with | Clean HTML without `<span>ning` |
3797
+ | ------------------------------------------------------------------------------------- | ------------------------------------ |
3798
+ | [<i>🥷</i> Emojis](#) | `<a><i>🥷</i> Text</a>` |
3799
+ | [<i>![](https://www.google.com/s2/favicons?domain=any.digital&sz=64)</i> Favicons](#) | `<a><i><img src="..."></i> Text</a>` |
3800
+ | [<i class="fa-brands fa-github fa-lg"></i> Font Awesome icons](#) | `<a><i class="fa-..."></i> Text</a>` |
3801
+ </article>
3802
+
3803
+ Or even for:
3804
+
3805
+ <article>
3806
+ <a href="#" style="margin: 0 0 0 1rem"><i>🥷</i> very-very-very-very-very-<br>long-multiline-links</a>
3807
+ </article>
3808
+
3809
+ How we made it: https://codepen.io/editor/anydigital/pen/019d2b94-5616-75dc-a23e-e111869d5237
3810
+
3811
+ \3c !--section--> */
3553
3812
  /*\3c !--section:docs-->
3554
3813
 
3555
3814
  Use `dl.timeline` or wrap a `<dl>` with `.has-timeline` to style it as a
@@ -3569,12 +3828,13 @@ Mar 15, 2025
3569
3828
  dl.timeline dd, .has-timeline > dl dd {
3570
3829
  margin-block: 0;
3571
3830
  padding: 0.25rem 0 0.75rem 1rem;
3572
- border-inline-start: 0.25rem solid gray;
3831
+ border-inline-start: 0.25rem solid var(--blades-timeline-border-color);
3573
3832
  }
3833
+
3574
3834
  /* Utilities */
3575
3835
  /*\3c !--section:docs-->
3576
3836
 
3577
- ## Auto-dark
3837
+ ## Dark auto
3578
3838
 
3579
3839
  `.dark-auto` automatically creates a simple dark version of any element:
3580
3840
 
@@ -3621,6 +3881,7 @@ How it works:
3621
3881
  }
3622
3882
  /*```
3623
3883
  \3c !--section--> */
3884
+
3624
3885
  /* Fix the scrollbar color when inverted by https://tailwindcss.com/docs/filter-invert */
3625
3886
  .invert ::-webkit-scrollbar {
3626
3887
  filter: invert(1) !important;
@@ -3665,6 +3926,7 @@ label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"
3665
3926
  .has-float-label:has(*:placeholder-shown:not(:focus)) label {
3666
3927
  padding-block: 0.75rem; /* match Pico */
3667
3928
  }
3929
+
3668
3930
  html {
3669
3931
  /* Prevent horizontal overflow and scrolling, modern way. */
3670
3932
  overflow-x: clip;
@@ -3673,6 +3935,7 @@ html {
3673
3935
  -webkit-font-smoothing: antialiased;
3674
3936
  -moz-osx-font-smoothing: grayscale;
3675
3937
  }
3938
+
3676
3939
  body {
3677
3940
 
3678
3941
  /* Make the `body` a flex container with column layout, and `main` to automatically fill available space. This is useful for creating sticky footers and full-height layouts. */
@@ -3686,23 +3949,29 @@ body {
3686
3949
  /* Enable global hyphenation */
3687
3950
  /* ... except for links and tables which are better (safer) without hyphenation */
3688
3951
  }
3952
+
3689
3953
  body > main {
3690
3954
  flex-grow: 1;
3691
3955
  }
3692
- body{
3956
+
3957
+ body {
3693
3958
  hyphens: auto;
3694
3959
  text-wrap: pretty;
3695
3960
  }
3961
+
3696
3962
  body a,
3697
3963
  body table {
3698
3964
  hyphens: none;
3699
3965
  }
3966
+
3700
3967
  a:not([href^="#"]) {
3701
3968
  text-decoration-thickness: 1px;
3702
3969
  }
3970
+
3703
3971
  a:not([href^="#"]):hover {
3704
3972
  text-decoration-thickness: 2px;
3705
3973
  }
3974
+
3706
3975
  h1,
3707
3976
  h2,
3708
3977
  h3,
@@ -3715,43 +3984,55 @@ h1 {
3715
3984
  margin-bottom: 1rem; /* for tw-typography */
3716
3985
  font-size: 2.5em; /* for pico.css & tw-typography */
3717
3986
  }
3987
+
3718
3988
  hr {
3719
3989
  margin-block: 2em; /* for pico.css & tw-typography */
3720
3990
  }
3991
+
3721
3992
  ul ul {
3722
3993
  font-size: 87.5%;
3723
3994
  }
3995
+
3724
3996
  dl dt {
3725
3997
  margin-block: 0.25rem;
3726
3998
  font-weight: 500;
3727
3999
  }
4000
+
3728
4001
  dl dd {
3729
4002
  margin-block-end: 1rem;
3730
4003
  }
4004
+
3731
4005
  pre small {
3732
4006
  font-weight: lighter;
3733
4007
  opacity: 75%;
3734
4008
  }
4009
+
3735
4010
  pre:has(code) {
3736
4011
  background: #181c25 !important;
3737
4012
  }
4013
+
3738
4014
  table th {
3739
4015
  font-weight: bold;
3740
4016
  vertical-align: bottom;
3741
4017
  }
4018
+
3742
4019
  table td {
3743
4020
  vertical-align: top;
3744
4021
  }
4022
+
3745
4023
  table pre {
3746
4024
  margin-bottom: 0.25rem;
3747
4025
  }
3748
- [data-jump-to="top"] {
4026
+
4027
+ [href="#top"] {
3749
4028
  opacity: 25%;
3750
4029
  }
3751
- [data-jump-to="top"]:hover {
4030
+
4031
+ [href="#top"]:hover {
3752
4032
  opacity: 75%;
3753
4033
  }
3754
- [data-jump-to="top"] > i {
4034
+
4035
+ [href="#top"] > i {
3755
4036
  display: inline-block;
3756
4037
  margin: 0.5rem;
3757
4038
  padding: 0.25rem 0.375rem;
@@ -3759,12 +4040,14 @@ table pre {
3759
4040
  color: black;
3760
4041
  font-size: 0.75rem;
3761
4042
  }
4043
+
3762
4044
  .breakout > img,
3763
4045
  .breakout > figure,
3764
4046
  .breakout-all > img,
3765
4047
  .breakout-all > figure {
3766
4048
  margin-bottom: 1rem;
3767
4049
  }
4050
+
3768
4051
  .faded a {
3769
4052
  text-decoration-style: dotted;
3770
4053
  }