@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.
- package/README.md +20 -16
- package/css/pico.blades.css +151 -91
- package/css/pico.blades.min.css +8 -8
- package/css/pico.css +13 -7
- package/css/pico.min.css +5 -5
- package/css/postcss.config.js +4 -1
- package/package.json +7 -19
- package/src/_content.css +7 -2
- package/src/_forms.css +1 -0
- package/src/pico.blades.css +2 -2
- package/src/pico.css +1 -1
package/css/pico.blades.css
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
@charset "UTF-8";
|
|
2
2
|
/*!
|
|
3
|
-
* Pico+Blades CSS ✨🥷 v2.
|
|
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.
|
|
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
|
-
|
|
1237
|
-
|
|
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
|
|
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
|
-
|
|
3128
|
+
top: 50%;
|
|
3116
3129
|
right: 100%;
|
|
3117
|
-
|
|
3130
|
+
width: 10em;
|
|
3118
3131
|
height: 0.25em;
|
|
3119
|
-
|
|
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[
|
|
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
|
-
|
|
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[
|
|
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`
|
|
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
|
-
|
|
3406
|
-
|
|
3407
|
-
|
|
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:
|
|
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
|
-
./
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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,
|