@anyblades/pico 2.2.2 → 2.4.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.
@@ -1,11 +1,11 @@
1
1
  @charset "UTF-8";
2
2
  /*!
3
- * Pico+Blades CSS ✨🥷 v2.2
3
+ * Pico+Blades CSS ✨🥷 v2.4
4
4
  * Copyright 2026 (https://blades.ninja/css/pico/)
5
5
  * Licensed under MIT
6
6
  */
7
7
  /*!
8
- * Pico CSS ✨ v2.2
8
+ * Pico CSS ✨ v2.4
9
9
  * Copyright 2019-2025 (https://picocss.com)
10
10
  * Copyright 2026 (https://blades.ninja/css/pico/)
11
11
  * Licensed under MIT
@@ -1032,12 +1032,12 @@ button,
1032
1032
  cursor: pointer;
1033
1033
  -webkit-user-select: none;
1034
1034
  -moz-user-select: none;
1035
- user-select: none;
1036
1035
  transition:
1037
1036
  background-color var(--pico-transition),
1038
1037
  border-color var(--pico-transition),
1039
1038
  color var(--pico-transition),
1040
1039
  box-shadow var(--pico-transition);
1040
+ user-select: none;
1041
1041
  }
1042
1042
  button:is([aria-current]:not([aria-current="false"])),
1043
1043
  button:is(:hover, :active, :focus),
@@ -1232,9 +1232,11 @@ audio:not([controls]) {
1232
1232
  :where(iframe) {
1233
1233
  border-style: none;
1234
1234
  }
1235
- img {
1236
- max-width: 100%;
1237
- height: auto;
1235
+ img:not([height]) {
1236
+ max-width: 100%;
1237
+ height: auto;
1238
+ }
1239
+ img{
1238
1240
  border-style: none;
1239
1241
  }
1240
1242
  :where(svg:not([fill])) {
@@ -1249,6 +1251,7 @@ svg:not(:host) {
1249
1251
  */
1250
1252
  pre,
1251
1253
  code,
1254
+ var,
1252
1255
  kbd,
1253
1256
  samp {
1254
1257
  font-size: 0.875em;
@@ -1265,6 +1268,7 @@ pre {
1265
1268
  }
1266
1269
  pre,
1267
1270
  code,
1271
+ var,
1268
1272
  kbd,
1269
1273
  samp {
1270
1274
  border-radius: var(--pico-border-radius);
@@ -1274,6 +1278,7 @@ samp {
1274
1278
  line-height: initial;
1275
1279
  }
1276
1280
  code,
1281
+ var,
1277
1282
  kbd,
1278
1283
  samp {
1279
1284
  display: inline-block;
@@ -1398,6 +1403,7 @@ input:not([type="checkbox"], [type="radio"], [type="range"]) {
1398
1403
  }
1399
1404
  fieldset {
1400
1405
  width: 100%;
1406
+ min-width: 0;
1401
1407
  margin: 0;
1402
1408
  margin-bottom: var(--pico-spacing);
1403
1409
  padding: 0;
@@ -1795,12 +1801,12 @@ input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]):is(
1795
1801
  ) {
1796
1802
  --pico-icon-position: 0.75rem;
1797
1803
  --pico-icon-width: 1rem;
1804
+ min-width: 0;
1798
1805
  padding-right: calc(var(--pico-icon-width) + var(--pico-icon-position));
1799
1806
  background-image: var(--pico-icon-date);
1800
1807
  background-position: center right var(--pico-icon-position);
1801
1808
  background-size: var(--pico-icon-width) auto;
1802
1809
  background-repeat: no-repeat;
1803
- min-width: 0;
1804
1810
  }
1805
1811
  input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"])[type="time"] {
1806
1812
  background-image: var(--pico-icon-time);
@@ -2164,12 +2170,12 @@ details.dropdown > summary:not([role]) {
2164
2170
  cursor: pointer;
2165
2171
  -webkit-user-select: none;
2166
2172
  -moz-user-select: none;
2167
- user-select: none;
2168
2173
  transition:
2169
2174
  background-color var(--pico-transition),
2170
2175
  border-color var(--pico-transition),
2171
2176
  color var(--pico-transition),
2172
2177
  box-shadow var(--pico-transition);
2178
+ user-select: none;
2173
2179
  }
2174
2180
  details.dropdown > summary:not([role]):active,
2175
2181
  details.dropdown > summary:not([role]):focus {
@@ -3052,8 +3058,8 @@ How it works:
3052
3058
  ```css */
3053
3059
  [data-jump-to="top"] {
3054
3060
  position: fixed;
3055
- bottom: 0;
3056
3061
  right: 0;
3062
+ bottom: 0;
3057
3063
  padding-top: 50vh;
3058
3064
  }
3059
3065
  /*```
@@ -3063,10 +3069,17 @@ How it works:
3063
3069
  ```css */
3064
3070
  .breakout,
3065
3071
  .breakout-all {
3072
+ max-width: calc(10% + 65ch + 10%);
3066
3073
  /* Prepare the container for breakout elements */
3067
3074
  padding-inline: 10%;
3068
- max-width: calc(10% + 65ch + 10%);
3069
3075
  }
3076
+ @media (width < 768px) {
3077
+ .breakout,
3078
+ .breakout-all {
3079
+ max-width: calc(1rem + 65ch + 1rem);
3080
+ padding-inline: 1rem
3081
+ }
3082
+ }
3070
3083
  /* Breakout direct children only */
3071
3084
  .breakout > *:is(
3072
3085
  table,
@@ -3089,34 +3102,34 @@ How it works:
3089
3102
  width: -moz-fit-content;
3090
3103
  width: fit-content;
3091
3104
  min-width: 100%;
3092
- max-width: 125%;
3105
+ max-width: min(125%, 100dvw);
3093
3106
  margin-left: 50%;
3094
3107
  transform: translateX(-50%);
3095
3108
  }
3096
3109
  /* Respect img/picture min-width */
3097
- .breakout > *:is(img, picture), .breakout-all > *:is(img, picture) {
3110
+ .breakout > *:is(img, picture):not(.does-not-exist), .breakout-all > *:is(img, picture):not(.does-not-exist) /* soft win specificity over .breakout-item above */ {
3098
3111
  min-width: auto;
3099
3112
  }
3100
3113
  /* Max out the width of the element */
3101
3114
  .breakout > *.breakout-item-max, .breakout-all > *.breakout-item-max {
3102
- width: 125% !important; /* !important is for cases like figure.breakout-item-max @TODO */
3115
+ width: min(125%, 100dvw) !important; /* !important is for cases like figure.breakout-item-max @TODO */
3103
3116
  }
3104
3117
  .breakout-all > *:is(h2, h3, h4, h5, h6, hr):not([class]) {
3105
3118
  position: relative;
3106
3119
  }
3107
3120
  .breakout-all > *:is(h2, h3, h4, h5, h6, hr):not([class])::before {
3108
- content: "";
3109
3121
  display: block;
3110
3122
  position: absolute;
3111
3123
  background: gray;
3124
+ content: "";
3112
3125
  opacity: 12.5%;
3113
3126
  }
3114
3127
  .breakout-all > *:is(h2, h3, h4, h5, h6):not([class])::before {
3115
- width: 10em;
3128
+ top: 50%;
3116
3129
  right: 100%;
3117
- margin-right: 0.8ch;
3130
+ width: 10em;
3118
3131
  height: 0.25em;
3119
- top: 50%;
3132
+ margin-right: 0.8ch;
3120
3133
  transform: translateY(-50%);
3121
3134
  background: linear-gradient(to left, gray, transparent);
3122
3135
  }
@@ -3126,12 +3139,12 @@ How it works:
3126
3139
  }
3127
3140
  .breakout-all > *:is(hr) {
3128
3141
  height: 0.5rem;
3129
- border: none;
3130
3142
  overflow: visible;
3143
+ border: none;
3131
3144
  }
3132
3145
  .breakout-all > *:is(hr)::before {
3133
- width: 100vw;
3134
3146
  left: 50%;
3147
+ width: 100dvw;
3135
3148
  height: 100%;
3136
3149
  transform: translateX(-50%);
3137
3150
  }
@@ -3198,18 +3211,18 @@ h5,
3198
3211
  h6 {
3199
3212
  position: relative;
3200
3213
  }
3201
- h1 a[href^="#"], h2 a[href^="#"], h3 a[href^="#"], h4 a[href^="#"], h5 a[href^="#"], h6 a[href^="#"] {
3214
+ h1 a[aria-hidden="true"], h2 a[aria-hidden="true"], h3 a[aria-hidden="true"], h4 a[aria-hidden="true"], h5 a[aria-hidden="true"], h6 a[aria-hidden="true"] {
3215
+ visibility: hidden;
3202
3216
  position: absolute;
3203
- right: 100%;
3204
3217
  top: 50%;
3205
- transform: translateY(-50%);
3218
+ right: 100%;
3206
3219
  padding-right: 0.2ch;
3220
+ transform: translateY(-50%);
3207
3221
  color: silver;
3208
3222
  text-decoration: none;
3209
- visibility: hidden;
3210
3223
  }
3211
3224
  @media /* to avoid double-tap on touch devices */ (hover: hover) {
3212
- h1:hover a[href^="#"], h2:hover a[href^="#"], h3:hover a[href^="#"], h4:hover a[href^="#"], h5:hover a[href^="#"], h6:hover a[href^="#"] {
3225
+ h1:hover a[aria-hidden="true"], h2:hover a[aria-hidden="true"], h3:hover a[aria-hidden="true"], h4:hover a[aria-hidden="true"], h5:hover a[aria-hidden="true"], h6:hover a[aria-hidden="true"] {
3213
3226
  visibility: visible;
3214
3227
  }
3215
3228
  }
@@ -3252,9 +3265,32 @@ ul li[data-marker]::marker, ol li[data-marker]::marker {
3252
3265
  }
3253
3266
  /*```
3254
3267
 
3268
+ ### Markerless
3269
+
3270
+ `.markerless` removes markers and reduces padding:
3271
+
3272
+ <article>
3273
+
3274
+ - 1️⃣ so you can use
3275
+ - 2️⃣ emojis or images
3276
+ - 3️⃣ instead of bullets
3277
+
3278
+ {.markerless}
3279
+ </article>
3280
+
3281
+ How it works:
3282
+ ```css */
3283
+ ul.markerless, ol.markerless {
3284
+ padding-inline-start: 1.25rem;
3285
+ }
3286
+ ul.markerless li, ol.markerless li {
3287
+ list-style: none;
3288
+ }
3289
+ /*```
3290
+
3255
3291
  ### Unlist
3256
3292
 
3257
- `.unlist` removes list styling:
3293
+ `.unlist` removes list styling at all:
3258
3294
 
3259
3295
  <article>
3260
3296
 
@@ -3265,7 +3301,7 @@ ul li[data-marker]::marker, ol li[data-marker]::marker {
3265
3301
  {.unlist .grid style=margin:0}
3266
3302
  </article>
3267
3303
 
3268
- `.unlist-all` also removes styling from all nested lists.
3304
+ `.unlist-all` removes styling from all nested lists too.
3269
3305
 
3270
3306
  How it works:
3271
3307
  ```css */
@@ -3288,20 +3324,21 @@ ul.unlist > li, ul.unlist-all > li, .unlist-all ul > li, ol.unlist > li, ol.unli
3288
3324
  /* Use inline flex only if link contains an icon */
3289
3325
  a:has(> i) {
3290
3326
  display: inline-flex;
3291
- gap: 0.375ch; /* =3/8 */
3292
3327
  overflow-y: clip; /* to work in pair with text-underline-offset in Safari */
3328
+ gap: 0.375ch; /* =3/8 */
3329
+ text-wrap: balance;
3293
3330
  }
3294
3331
  a > i {
3295
- font-style: normal;
3296
3332
  float: left; /* ✅ Chrome ❌ Safari */
3333
+ font-style: normal;
3297
3334
  text-underline-offset: -2em; /* ❌ Chrome ✅ Safari - to clip it with overflow-y */
3298
3335
  }
3299
3336
  /* Favicons */
3300
3337
  a > i > img {
3338
+ display: inline-block; /* for Tailwind CSS Typography */
3339
+ max-width: none; /* to keep ratio safe */
3301
3340
  height: 1.25em;
3302
3341
  margin-block-start: calc(-0.25em / 2);
3303
- max-width: none; /* to keep ratio safe */
3304
- display: inline-block; /* for Tailwind CSS Typography */
3305
3342
  }
3306
3343
  a > i[class^="fa-"],
3307
3344
  a > i[class*=" fa-"] {
@@ -3363,10 +3400,10 @@ Living examples of big tables with `<hr>`-expanders: \3c !--A-Z-->
3363
3400
  How it works:
3364
3401
  ```css */
3365
3402
  th hr {
3403
+ visibility: hidden;
3366
3404
  width: 12ch; /* min ~65/12 = ~5 cols */
3367
3405
  height: 0;
3368
3406
  margin: 0;
3369
- visibility: hidden;
3370
3407
  }
3371
3408
  th hr.lg {
3372
3409
  width: 18ch;
@@ -3402,20 +3439,20 @@ table.borderless th,
3402
3439
  table.responsive,
3403
3440
  .breakout > table:not(.does-not-exist),
3404
3441
  .breakout-all > table:not(.does-not-exist) {
3405
- /* Center horizontally */
3406
- margin-left: 50%;
3407
- transform: translateX(-50%);
3442
+
3443
+ /* Let them scroll */
3444
+ display: block;
3408
3445
 
3409
3446
  /* Let them full-bleed */
3410
3447
  width: -moz-max-content;
3411
3448
  width: max-content;
3412
3449
  min-width: auto;
3413
- max-width: 100vw;
3450
+ max-width: 100dvw;
3451
+ /* Center horizontally */
3452
+ margin-left: 50%;
3414
3453
  padding-inline: 7.5%;
3415
-
3416
- /* Let them scroll */
3417
- display: block;
3418
3454
  overflow-x: auto;
3455
+ transform: translateX(-50%);
3419
3456
  -webkit-overflow-scrolling: touch; /* Smooth scroll for iOS */
3420
3457
  }
3421
3458
  table.responsive th,
@@ -3461,43 +3498,25 @@ Living examples: \3c !--A-Z-->
3461
3498
  The `<pre><code>` blocks are Prism-compatible and support captions via `data-caption="..."` attribute:
3462
3499
 
3463
3500
  ```treeview {data-caption="Blades CSS:"}
3464
- ./assets/
3501
+ ./css/
3465
3502
  ├── blades.core.css # reusable class-light utilities, unthemed
3466
3503
  ├── blades.theme.css # minimal opinionated theme
3467
3504
  └── blades.css # above two together
3468
3505
  ```
3469
3506
  How it works:
3470
3507
  ```css */
3471
- pre {
3472
- padding: 1rem 1.5rem;
3473
- padding-inline-end: 2rem;
3474
- }
3475
- @media (max-width: 767px) {
3508
+ @media (width < 768px) {
3476
3509
  pre {
3477
3510
  border-radius: 0
3478
3511
  }
3479
3512
  }
3480
3513
  /* Code block caption via data-attr (to display filename, etc.) */
3481
3514
  code[data-caption]::before {
3482
- content: attr(data-caption);
3483
3515
  display: block;
3484
3516
  margin-bottom: 1rem;
3485
- opacity: 50%;
3517
+ content: attr(data-caption);
3486
3518
  font-style: italic;
3487
- }
3488
- code:where(pre > *) {
3489
- padding: 0;
3490
- }
3491
- /* Extends https://github.com/PrismJS/prism/blob/master/plugins/treeview/prism-treeview.css */
3492
- .token.treeview-part .entry-line {
3493
- width: 2.5em !important;
3494
- opacity: 25%;
3495
- }
3496
- .token.treeview-part .entry-name:last-child {
3497
- opacity: 50%;
3498
- }
3499
- .token.treeview-part .entry-name:last-child::before {
3500
- display: none !important;
3519
+ opacity: 50%;
3501
3520
  }
3502
3521
  /*```
3503
3522
  \3c !--section--> */
@@ -3507,9 +3526,9 @@ code:where(pre > *) {
3507
3526
 
3508
3527
  First, we target either:
3509
3528
  1. `<label>` which `:has` inner form inputs (classless approach)
3510
- 2. or explicit `.has-float-label` class (alternative approach)
3529
+ 2. or explicit `.has-float-label` class (explicit approach)
3511
3530
  ```css */
3512
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select),
3531
+ label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select),
3513
3532
  .has-float-label {
3514
3533
  display: block;
3515
3534
  position: relative;
@@ -3518,35 +3537,35 @@ label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea
3518
3537
  ```
3519
3538
  Then, we define the default/fallback state (when the float label should be minimized):
3520
3539
  ```css */
3521
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) > span,
3522
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) label,
3540
+ label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) > span,
3541
+ label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) label,
3523
3542
  .has-float-label > span,
3524
3543
  .has-float-label label {
3525
3544
  position: absolute;
3526
- left: 0;
3527
3545
  top: 0;
3528
- cursor: text;
3546
+ left: 0;
3529
3547
  font-size: 75%;
3548
+ cursor: text;
3530
3549
  }
3531
3550
  /*
3532
3551
  ```
3533
3552
  Finally, we detect if placeholder is shown, but not in focus. That means we can safely hide it, and enlarge the float label instead:
3534
3553
  ```css */
3535
- label: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 {
3554
+ 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 {
3536
3555
  opacity: 0;
3537
3556
  }
3538
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) *:-moz-placeholder:not(:focus)::placeholder, .has-float-label *:-moz-placeholder:not(:focus)::placeholder {
3557
+ 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 {
3539
3558
  opacity: 0;
3540
3559
  }
3541
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) *:placeholder-shown:not(:focus)::placeholder, .has-float-label *:placeholder-shown:not(:focus)::placeholder {
3560
+ 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 {
3542
3561
  opacity: 0;
3543
3562
  }
3544
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select):has(*:-moz-placeholder:not(:focus)) > span, label: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 {
3563
+ 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 {
3545
3564
  font-size: inherit;
3546
3565
  opacity: 50%;
3547
3566
  }
3548
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select):has(*:placeholder-shown:not(:focus)) > span,
3549
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select):has(*:placeholder-shown:not(:focus)) label,
3567
+ label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select):has(*:placeholder-shown:not(:focus)) > span,
3568
+ label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select):has(*:placeholder-shown:not(:focus)) label,
3550
3569
  .has-float-label:has(*:placeholder-shown:not(:focus)) > span,
3551
3570
  .has-float-label:has(*:placeholder-shown:not(:focus)) label {
3552
3571
  font-size: inherit;
@@ -3558,6 +3577,29 @@ The `:has(*:placeholder-shown:not(:focus))` trick allows this input state inform
3558
3577
 
3559
3578
  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.
3560
3579
  \3c !--section--> */
3580
+ /* Components */
3581
+ /*\3c !--section:docs-->
3582
+
3583
+ Use `dl.timeline` or wrap a `<dl>` with `.has-timeline` to style it as a
3584
+ vertical timeline — each `<dd>` gets a left border strip acting as the track:
3585
+
3586
+ <article class="has-timeline">
3587
+
3588
+ May 11, 2026
3589
+ : First Blades CSS stable release (v2.2.0).
3590
+
3591
+ Mar 15, 2025
3592
+ : Last Pico CSS update (v2.1.1).
3593
+
3594
+ </article>
3595
+
3596
+ \3c !--section:code-->```css */
3597
+ dl.timeline dd, .has-timeline > dl dd {
3598
+ margin-block: 0;
3599
+ padding: 0.25rem 0 0.75rem 1rem;
3600
+ border-inline-start: 0.25rem solid gray;
3601
+ }
3602
+ /*```*/
3561
3603
  /* Utilities */
3562
3604
  /* Extends https://github.com/picocss/pico/tree/main/scss/utilities
3563
3605
  \3c !--section:docs-->
@@ -3617,8 +3659,8 @@ How it works:
3617
3659
  \3c !--section:code-->
3618
3660
  ```css */
3619
3661
  /* Default/fallback state */
3620
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) > span,
3621
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) label,
3662
+ label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) > span,
3663
+ label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) label,
3622
3664
  .has-float-label > span,
3623
3665
  .has-float-label label {
3624
3666
  padding-inline-start: calc(1rem + 1px); /* match Pico's padding + border */
@@ -3626,9 +3668,9 @@ label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea
3626
3668
  opacity: 75%;
3627
3669
  transition: all 0.25s;
3628
3670
  }
3629
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) input,
3630
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) textarea,
3631
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) select,
3671
+ label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) input,
3672
+ label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) textarea,
3673
+ label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) select,
3632
3674
  .has-float-label input,
3633
3675
  .has-float-label textarea,
3634
3676
  .has-float-label select {
@@ -3636,21 +3678,21 @@ label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea
3636
3678
  padding-inline-start: 1rem; /* match Pico */
3637
3679
  padding-block: 1.125rem 0.375rem; /* match Pico's total: 2 x 0.75rem = 1.5rem */
3638
3680
  }
3639
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) input::-moz-placeholder, label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) textarea::-moz-placeholder, label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) select::-moz-placeholder, .has-float-label input::-moz-placeholder, .has-float-label textarea::-moz-placeholder, .has-float-label select::-moz-placeholder {
3681
+ label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) input::-moz-placeholder, label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) textarea::-moz-placeholder, label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) select::-moz-placeholder, .has-float-label input::-moz-placeholder, .has-float-label textarea::-moz-placeholder, .has-float-label select::-moz-placeholder {
3640
3682
  opacity: 100%;
3641
3683
  -moz-transition: all 0.25s;
3642
3684
  transition: all 0.25s;
3643
3685
  }
3644
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) input::placeholder, label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) textarea::placeholder, label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) select::placeholder, .has-float-label input::placeholder, .has-float-label textarea::placeholder, .has-float-label select::placeholder {
3686
+ label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) input::placeholder, label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) textarea::placeholder, label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) select::placeholder, .has-float-label input::placeholder, .has-float-label textarea::placeholder, .has-float-label select::placeholder {
3645
3687
  opacity: 100%;
3646
3688
  transition: all 0.25s;
3647
3689
  }
3648
3690
  /* Enlarged state */
3649
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select):has(*:-moz-placeholder:not(:focus)) > span, label: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 {
3691
+ 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 {
3650
3692
  padding-block: 0.75rem; /* match Pico */
3651
3693
  }
3652
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select):has(*:placeholder-shown:not(:focus)) > span,
3653
- label:has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select):has(*:placeholder-shown:not(:focus)) label,
3694
+ label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select):has(*:placeholder-shown:not(:focus)) > span,
3695
+ label:has(> span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select):has(*:placeholder-shown:not(:focus)) label,
3654
3696
  .has-float-label:has(*:placeholder-shown:not(:focus)) > span,
3655
3697
  .has-float-label:has(*:placeholder-shown:not(:focus)) label {
3656
3698
  padding-block: 0.75rem; /* match Pico */
@@ -3664,12 +3706,12 @@ html {
3664
3706
  -moz-osx-font-smoothing: grayscale;
3665
3707
  }
3666
3708
  body {
3667
- /* Ensure `body` takes at least the full height of the viewport (using dynamic viewport height for better mobile support). */
3668
- min-height: 100dvh;
3669
3709
 
3670
3710
  /* 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. */
3671
3711
  display: flex;
3672
3712
  flex-direction: column;
3713
+ /* Ensure `body` takes at least the full height of the viewport (using dynamic viewport height for better mobile support). */
3714
+ min-height: 100dvh;
3673
3715
 
3674
3716
  /* Evaluates the last ~4 lines of text blocks to prevent a single word from sitting on the final line. */
3675
3717
 
@@ -3680,8 +3722,8 @@ body > main {
3680
3722
  flex-grow: 1;
3681
3723
  }
3682
3724
  body{
3683
- text-wrap: pretty;
3684
3725
  hyphens: auto;
3726
+ text-wrap: pretty;
3685
3727
  }
3686
3728
  body a,
3687
3729
  body table {
@@ -3693,9 +3735,17 @@ a:not([href^="#"]) {
3693
3735
  a:not([href^="#"]):hover {
3694
3736
  text-decoration-thickness: 2px;
3695
3737
  }
3738
+ h1,
3739
+ h2,
3740
+ h3,
3741
+ h4,
3742
+ h5,
3743
+ h6 {
3744
+ text-wrap: balance;
3745
+ }
3696
3746
  h1 {
3697
- font-size: 2.5em; /* for pico.css & tw-typography */
3698
3747
  margin-bottom: 1rem; /* for tw-typography */
3748
+ font-size: 2.5em; /* for pico.css & tw-typography */
3699
3749
  }
3700
3750
  hr {
3701
3751
  margin-block: 2em; /* for pico.css & tw-typography */
@@ -3703,13 +3753,23 @@ hr {
3703
3753
  ul ul {
3704
3754
  font-size: 87.5%;
3705
3755
  }
3756
+ dl dt {
3757
+ margin-block: 0.25rem;
3758
+ font-weight: 500;
3759
+ }
3760
+ dl dd {
3761
+ margin-block-end: 1rem;
3762
+ }
3706
3763
  pre small {
3707
- opacity: 75%;
3708
3764
  font-weight: lighter;
3765
+ opacity: 75%;
3766
+ }
3767
+ pre:has(code) {
3768
+ background: #181c25 !important;
3709
3769
  }
3710
3770
  table th {
3711
- vertical-align: bottom;
3712
3771
  font-weight: bold;
3772
+ vertical-align: bottom;
3713
3773
  }
3714
3774
  table td {
3715
3775
  vertical-align: top;
@@ -3725,11 +3785,11 @@ table pre {
3725
3785
  }
3726
3786
  [data-jump-to="top"] > i {
3727
3787
  display: inline-block;
3728
- padding: 0.25rem 0.375rem;
3729
3788
  margin: 0.5rem;
3730
- font-size: 0.75rem;
3731
- color: black;
3789
+ padding: 0.25rem 0.375rem;
3732
3790
  border-color: black;
3791
+ color: black;
3792
+ font-size: 0.75rem;
3733
3793
  }
3734
3794
  .breakout > img,
3735
3795
  .breakout > figure,