@obvi/blueprint 1.2.0 → 1.3.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.
- package/README.md +21 -0
- package/dist/blueprint-choices.js +329 -163
- package/dist/blueprint-contract.json +4 -4
- package/dist/blueprint.css +171 -30
- package/dist/blueprint.js +275 -148
- package/dist/vendor/blueprint/blueprint.css +171 -30
- package/dist/vendor/blueprint/blueprint.js +275 -148
- package/package.json +9 -2
package/dist/blueprint.css
CHANGED
|
@@ -181,9 +181,21 @@
|
|
|
181
181
|
--bp-hatch-gap: 7px;
|
|
182
182
|
--bp-hatch: repeating-linear-gradient(
|
|
183
183
|
-45deg,
|
|
184
|
-
var(--bp-ink-faint) 0
|
|
185
|
-
|
|
184
|
+
var(--bp-ink-faint) 0,
|
|
185
|
+
var(--bp-ink-faint) var(--bp-stroke),
|
|
186
|
+
oklch(0 0 0 / 0) var(--bp-stroke),
|
|
187
|
+
oklch(0 0 0 / 0) var(--bp-hatch-gap)
|
|
186
188
|
);
|
|
189
|
+
/* Fixed fullscreen scrims in WebKit rasterize more predictably when the
|
|
190
|
+
hatch is tiled through a mask on a pseudo-element instead of painted
|
|
191
|
+
directly as a repeating gradient on the fixed layer itself. */
|
|
192
|
+
--bp-hatch-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 7 7'%3E%3Cpath d='M-1 8L8 -1' stroke='%23000' stroke-width='1' stroke-linecap='square' shape-rendering='crispEdges'/%3E%3C/svg%3E");
|
|
193
|
+
/* Hatch line color for the masked ::before treatment used on non-fixed
|
|
194
|
+
hatch surfaces (preflight gate, empty state, rejected choice cards).
|
|
195
|
+
Tracks the --bp-hatch gradient line color per theme (ink-faint in
|
|
196
|
+
light, edge in dark) so swapping the soft diagonal gradient for the
|
|
197
|
+
crisp deterministic mask never shifts the rendered color. */
|
|
198
|
+
--bp-hatch-ink: var(--bp-ink-faint);
|
|
187
199
|
/* Drafting board — a faint dot-grid backdrop that marks INTERACTIVE
|
|
188
200
|
component surfaces (choice, preflight, choice-record, source, mock,
|
|
189
201
|
gallery): a second axis distinct from the diagonal --bp-hatch (which
|
|
@@ -216,11 +228,16 @@
|
|
|
216
228
|
--bp-board-card-pad: var(--bp-space-4);
|
|
217
229
|
--bp-board-card-radius: var(--bp-radius-8);
|
|
218
230
|
/* Modal scrim wash — darker than --bp-ink-soft so floated panels (search
|
|
219
|
-
palette, lightbox, expanded mock) read clearly over the page.
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
231
|
+
palette, lightbox, expanded mock) read clearly over the page. The wash
|
|
232
|
+
is painted as a SOLID background-image layer (--bp-scrim-fill), not as
|
|
233
|
+
background-color: WebKit/Safari can drop a semi-transparent oklch
|
|
234
|
+
background-color while still painting gradient background-image layers,
|
|
235
|
+
which left the wash faint/absent there while the hatch texture kept
|
|
236
|
+
drawing. Fixed fullscreen overlays pair this fill on the host with the
|
|
237
|
+
diagonal hatch on a masked pseudo-element (see --bp-hatch-mask) so the
|
|
238
|
+
repeating gradient itself is not rasterized on the fixed layer. */
|
|
223
239
|
--bp-scrim: oklch(0 0 0 / 0.58);
|
|
240
|
+
--bp-scrim-fill: linear-gradient(var(--bp-scrim), var(--bp-scrim));
|
|
224
241
|
--bp-edge: var(--obvious-border-subtle, oklch(0 0 0 / 0.08));
|
|
225
242
|
--bp-ink-line: var(--obvious-border-default, oklch(0 0 0 / 0.16));
|
|
226
243
|
--bp-text: var(--obvious-text-primary, oklch(0 0 0 / 0.92));
|
|
@@ -437,9 +454,14 @@
|
|
|
437
454
|
rejected-choice fills keep texture without brightening the wash. */
|
|
438
455
|
--bp-hatch: repeating-linear-gradient(
|
|
439
456
|
-45deg,
|
|
440
|
-
var(--bp-edge) 0
|
|
441
|
-
|
|
457
|
+
var(--bp-edge) 0,
|
|
458
|
+
var(--bp-edge) var(--bp-stroke),
|
|
459
|
+
oklch(0 0 0 / 0) var(--bp-stroke),
|
|
460
|
+
oklch(0 0 0 / 0) var(--bp-hatch-gap)
|
|
442
461
|
);
|
|
462
|
+
/* Dark hatch line color = --bp-edge (matches the dark --bp-hatch gradient
|
|
463
|
+
above), keeping the masked ::before faithful to the gradient in dark. */
|
|
464
|
+
--bp-hatch-ink: var(--bp-edge);
|
|
443
465
|
--bp-paper: var(--bp-gray-950);
|
|
444
466
|
--bp-bg: oklch(0.15 0 0); /* the desk sits darker than the sheet, so the page lifts */
|
|
445
467
|
--bp-edge: oklch(1 0 0 / 0.08);
|
|
@@ -1481,7 +1503,10 @@
|
|
|
1481
1503
|
--bp-tick: var(--bp-ink);
|
|
1482
1504
|
--bp-tick-len: 16px;
|
|
1483
1505
|
--bp-tick-wt: 2.5px;
|
|
1484
|
-
|
|
1506
|
+
/* Hatch is painted by the crisp masked ::before (shared hatch-mask rule),
|
|
1507
|
+
leaving the corner tick stack on the host. */
|
|
1508
|
+
--bp-callout-fill: none;
|
|
1509
|
+
isolation: isolate;
|
|
1485
1510
|
background-color: var(--bp-fill-hi);
|
|
1486
1511
|
}
|
|
1487
1512
|
/* Reference = enumerated values (subdued, soft ticks). */
|
|
@@ -1807,7 +1832,10 @@
|
|
|
1807
1832
|
}
|
|
1808
1833
|
:where(.bp-choice--stack:has(.bp-choice__pick:checked)) :where(.bp-choice__card:not(:has(.bp-choice__pick:checked))) {
|
|
1809
1834
|
opacity: 0.62;
|
|
1810
|
-
|
|
1835
|
+
/* Hatch is painted by the crisp masked ::before (shared hatch-mask rule),
|
|
1836
|
+
not a diagonal gradient — the gradient anti-aliases differently in
|
|
1837
|
+
WebKit vs Chromium. The card is already position:relative. */
|
|
1838
|
+
isolation: isolate;
|
|
1811
1839
|
}
|
|
1812
1840
|
:where(.bp-choice--stack:has(.bp-choice__pick:checked)) :where(.bp-choice__card:not(:has(.bp-choice__pick:checked))) :where(.bp-choice__card-rejected) {
|
|
1813
1841
|
display: inline-flex;
|
|
@@ -1839,7 +1867,8 @@
|
|
|
1839
1867
|
}
|
|
1840
1868
|
:where(.bp-choice--resolved) :where(.bp-choice__card:not([data-resolved])) {
|
|
1841
1869
|
opacity: 0.62;
|
|
1842
|
-
|
|
1870
|
+
/* Crisp masked ::before hatch (cross-engine parity), see hatch-mask rule. */
|
|
1871
|
+
isolation: isolate;
|
|
1843
1872
|
}
|
|
1844
1873
|
:where(.bp-choice--resolved) :where(.bp-choice__card:not([data-resolved])) :where(.bp-choice__card-rejected) {
|
|
1845
1874
|
display: inline-flex;
|
|
@@ -1903,7 +1932,9 @@
|
|
|
1903
1932
|
opacity: 0.5;
|
|
1904
1933
|
}
|
|
1905
1934
|
:where(.bp-choice--gallery:has(.bp-choice__pick:checked)) :where(.bp-choice__mock:not(:has(.bp-choice__pick:checked))) :where(.bp-choice__mock-frame) {
|
|
1906
|
-
|
|
1935
|
+
/* Crisp masked ::before hatch (cross-engine parity), see hatch-mask rule. */
|
|
1936
|
+
position: relative;
|
|
1937
|
+
isolation: isolate;
|
|
1907
1938
|
}
|
|
1908
1939
|
:where(.bp-choice--gallery:has(.bp-choice__pick:checked)) :where(.bp-choice__mock:not(:has(.bp-choice__pick:checked))) :where(.bp-choice__mock-rejected) {
|
|
1909
1940
|
display: inline-flex;
|
|
@@ -2061,12 +2092,17 @@
|
|
|
2061
2092
|
accent-color: var(--bp-button-primary-fg);
|
|
2062
2093
|
}
|
|
2063
2094
|
:where(.bp-preflight__gate) {
|
|
2095
|
+
/* position + isolation host the masked hatch ::before (see the shared
|
|
2096
|
+
hatch-mask rule near the overlay scrims) without leaking its negative
|
|
2097
|
+
z-index behind ancestors. The crisp mask replaces the diagonal
|
|
2098
|
+
repeating-gradient, which WebKit and Chromium anti-alias differently. */
|
|
2099
|
+
position: relative;
|
|
2100
|
+
isolation: isolate;
|
|
2064
2101
|
margin: var(--bp-space-3);
|
|
2065
2102
|
border: 1px dashed var(--bp-ink-line);
|
|
2066
2103
|
border-radius: var(--bp-radius-0);
|
|
2067
2104
|
padding: var(--bp-space-4);
|
|
2068
2105
|
text-align: center;
|
|
2069
|
-
background-image: var(--bp-hatch);
|
|
2070
2106
|
color: var(--bp-text-secondary);
|
|
2071
2107
|
}
|
|
2072
2108
|
:where(.bp-preflight__gate-ready) {
|
|
@@ -3243,9 +3279,75 @@
|
|
|
3243
3279
|
display: grid;
|
|
3244
3280
|
place-items: center;
|
|
3245
3281
|
padding: clamp(var(--bp-space-4), 4vw, var(--bp-space-7));
|
|
3246
|
-
|
|
3247
|
-
|
|
3282
|
+
/* Fixed fullscreen overlays need BOTH Safari mitigations:
|
|
3283
|
+
1. the wash stays on the host as --bp-scrim-fill so WebKit paints it;
|
|
3284
|
+
2. the hatch moves to a masked pseudo-element so the repeating gradient
|
|
3285
|
+
itself is not rasterized on the fixed layer. */
|
|
3286
|
+
background-image: var(--bp-scrim-fill);
|
|
3287
|
+
isolation: isolate;
|
|
3288
|
+
}
|
|
3289
|
+
:where(.bp-mock.is-expanded, .bp-lightbox)::before {
|
|
3290
|
+
content: "";
|
|
3291
|
+
position: absolute;
|
|
3292
|
+
inset: 0;
|
|
3293
|
+
z-index: -1;
|
|
3294
|
+
pointer-events: none;
|
|
3295
|
+
background-color: var(--bp-ink-faint);
|
|
3296
|
+
-webkit-mask-image: var(--bp-hatch-mask);
|
|
3297
|
+
mask-image: var(--bp-hatch-mask);
|
|
3298
|
+
-webkit-mask-size: var(--bp-hatch-gap) var(--bp-hatch-gap);
|
|
3299
|
+
mask-size: var(--bp-hatch-gap) var(--bp-hatch-gap);
|
|
3300
|
+
-webkit-mask-repeat: repeat;
|
|
3301
|
+
mask-repeat: repeat;
|
|
3302
|
+
-webkit-mask-position: 0 0;
|
|
3303
|
+
mask-position: 0 0;
|
|
3304
|
+
}
|
|
3305
|
+
|
|
3306
|
+
/* ---- Non-fixed hatch surfaces: crisp masked hatch -----------------
|
|
3307
|
+
The invariant callout, preflight gate, empty state, and rejected choice
|
|
3308
|
+
cards/frames used to paint the diagonal hatch as
|
|
3309
|
+
`background-image: var(--bp-hatch)`.
|
|
3310
|
+
WebKit and Chromium anti-alias that 45deg hard-edged repeating gradient
|
|
3311
|
+
differently — the cross-engine pixel diff showed thousands of low-delta
|
|
3312
|
+
fringe pixels along every stroke. The same crisp SVG mask used on the
|
|
3313
|
+
fixed overlay scrims fixes it deterministically: a 7x7 crispEdges stripe
|
|
3314
|
+
(--bp-hatch-mask) tiled over a flat --bp-hatch-ink fill, so both engines
|
|
3315
|
+
rasterize identical on/off pixels. --bp-hatch-ink tracks the gradient's
|
|
3316
|
+
per-theme line color (ink-faint light / edge dark) so the swap is color
|
|
3317
|
+
faithful. Each host sets position + isolation (see those rules) so this
|
|
3318
|
+
negative-z-index ::before paints above the host fill and below content
|
|
3319
|
+
without escaping the card. */
|
|
3320
|
+
:where(
|
|
3321
|
+
.bp-callout--invariant,
|
|
3322
|
+
.bp-preflight__gate,
|
|
3323
|
+
.wp-empty,
|
|
3324
|
+
.bp-choice--stack:has(.bp-choice__pick:checked)
|
|
3325
|
+
.bp-choice__card:not(:has(.bp-choice__pick:checked)),
|
|
3326
|
+
.bp-choice--resolved .bp-choice__card:not([data-resolved]),
|
|
3327
|
+
.bp-choice--gallery:has(.bp-choice__pick:checked)
|
|
3328
|
+
.bp-choice__mock:not(:has(.bp-choice__pick:checked))
|
|
3329
|
+
.bp-choice__mock-frame
|
|
3330
|
+
)::before {
|
|
3331
|
+
content: "";
|
|
3332
|
+
position: absolute;
|
|
3333
|
+
inset: 0;
|
|
3334
|
+
z-index: -1;
|
|
3335
|
+
pointer-events: none;
|
|
3336
|
+
background-color: var(--bp-hatch-ink);
|
|
3337
|
+
-webkit-mask-image: var(--bp-hatch-mask);
|
|
3338
|
+
mask-image: var(--bp-hatch-mask);
|
|
3339
|
+
-webkit-mask-size: var(--bp-hatch-gap) var(--bp-hatch-gap);
|
|
3340
|
+
mask-size: var(--bp-hatch-gap) var(--bp-hatch-gap);
|
|
3341
|
+
-webkit-mask-repeat: repeat;
|
|
3342
|
+
mask-repeat: repeat;
|
|
3343
|
+
-webkit-mask-position: 0 0;
|
|
3344
|
+
mask-position: 0 0;
|
|
3248
3345
|
}
|
|
3346
|
+
/* Resolved preflight clears its gate hatch (gate-ready copy replaces it). */
|
|
3347
|
+
:where(.bp-preflight--ready) :where(.bp-preflight__gate)::before {
|
|
3348
|
+
content: none;
|
|
3349
|
+
}
|
|
3350
|
+
|
|
3249
3351
|
:where(.bp-mock.is-expanded) :where(.bp-mock__frame) {
|
|
3250
3352
|
width: min(100%, 1120px);
|
|
3251
3353
|
max-height: 100%;
|
|
@@ -3385,8 +3487,8 @@
|
|
|
3385
3487
|
justify-items: center;
|
|
3386
3488
|
gap: var(--bp-space-3);
|
|
3387
3489
|
padding: var(--bp-lightbox-pad);
|
|
3388
|
-
background-
|
|
3389
|
-
|
|
3490
|
+
background-image: var(--bp-scrim-fill);
|
|
3491
|
+
isolation: isolate;
|
|
3390
3492
|
}
|
|
3391
3493
|
:where(.bp-lightbox.is-open) {
|
|
3392
3494
|
display: grid;
|
|
@@ -4155,10 +4257,18 @@
|
|
|
4155
4257
|
height: 26px;
|
|
4156
4258
|
background: var(--bp-fill-amb);
|
|
4157
4259
|
border-radius: var(--bp-radius-0);
|
|
4260
|
+
/* Explicit four-stop syntax: WebKit mis-resolves the compact
|
|
4261
|
+
multi-position stop shorthand (`color A B`) when A/B are calc()
|
|
4262
|
+
expressions over a custom property (--span), producing sparse or
|
|
4263
|
+
bunched column lines. Splitting each compact stop into two explicit
|
|
4264
|
+
stops removes the shorthand and renders identically in both engines.
|
|
4265
|
+
Same expansion the --bp-hatch token uses. */
|
|
4158
4266
|
background-image: repeating-linear-gradient(
|
|
4159
4267
|
to right,
|
|
4160
|
-
oklch(0 0 0 / 0) 0
|
|
4161
|
-
|
|
4268
|
+
oklch(0 0 0 / 0) 0,
|
|
4269
|
+
oklch(0 0 0 / 0) calc(100% / var(--span, 10) - 1px),
|
|
4270
|
+
var(--bp-edge) calc(100% / var(--span, 10) - 1px),
|
|
4271
|
+
var(--bp-edge) calc(100% / var(--span, 10))
|
|
4162
4272
|
);
|
|
4163
4273
|
}
|
|
4164
4274
|
:where(.wp-gantt__bar) {
|
|
@@ -4221,7 +4331,10 @@
|
|
|
4221
4331
|
border: 1px dashed var(--bp-ink-line);
|
|
4222
4332
|
border-radius: var(--bp-radius-0);
|
|
4223
4333
|
background-color: var(--bp-fill-amb);
|
|
4224
|
-
|
|
4334
|
+
/* Hatch via the crisp masked ::before instead of the diagonal gradient
|
|
4335
|
+
(cross-engine AA parity). position + isolation host it. */
|
|
4336
|
+
position: relative;
|
|
4337
|
+
isolation: isolate;
|
|
4225
4338
|
color: var(--bp-text-secondary);
|
|
4226
4339
|
}
|
|
4227
4340
|
:where(.wp-empty__art) { color: var(--bp-ink-soft); margin-bottom: var(--bp-space-1); }
|
|
@@ -4286,10 +4399,16 @@
|
|
|
4286
4399
|
margin: 0;
|
|
4287
4400
|
}
|
|
4288
4401
|
/* Expanded mock floats fullscreen (position: fixed): collapse the host so
|
|
4289
|
-
no empty dotted mat is left behind in the document flow
|
|
4402
|
+
no empty dotted mat is left behind in the document flow, and clear any
|
|
4403
|
+
host clipping / board paint so browsers that clip fixed descendants
|
|
4404
|
+
through overflow-hidden ancestors still show the overlay fullscreen. */
|
|
4290
4405
|
:where(bp-mock:has(.bp-mock.is-expanded)) {
|
|
4291
4406
|
margin: 0;
|
|
4292
4407
|
padding: 0;
|
|
4408
|
+
overflow: visible;
|
|
4409
|
+
border-radius: 0;
|
|
4410
|
+
background-color: oklch(1 0 0 / 0);
|
|
4411
|
+
background-image: none;
|
|
4293
4412
|
}
|
|
4294
4413
|
|
|
4295
4414
|
/* Single-surface specimens read as ONE continuous paper card on the mat;
|
|
@@ -4308,17 +4427,19 @@
|
|
|
4308
4427
|
background-color: var(--bp-paper);
|
|
4309
4428
|
background-image: linear-gradient(var(--bp-fill-amb), var(--bp-fill-amb));
|
|
4310
4429
|
}
|
|
4311
|
-
/* Rejected / set-aside cards
|
|
4312
|
-
|
|
4313
|
-
|
|
4430
|
+
/* Rejected / set-aside cards stay fully opaque on the board (opacity:1),
|
|
4431
|
+
so the set-aside read comes from the hatch + tag, not element opacity.
|
|
4432
|
+
The hatch is painted by the crisp masked ::before (shared hatch-mask
|
|
4433
|
+
rule) rather than the diagonal gradient — isolation keeps that ::before's
|
|
4434
|
+
negative z-index inside the card. */
|
|
4314
4435
|
:where(
|
|
4315
4436
|
.bp-choice--stack:has(.bp-choice__pick:checked)
|
|
4316
4437
|
.bp-choice__card:not(:has(.bp-choice__pick:checked)),
|
|
4317
4438
|
.bp-choice--resolved .bp-choice__card:not([data-resolved])
|
|
4318
4439
|
) {
|
|
4319
4440
|
opacity: 1;
|
|
4441
|
+
isolation: isolate;
|
|
4320
4442
|
background-color: var(--bp-paper);
|
|
4321
|
-
background-image: var(--bp-hatch);
|
|
4322
4443
|
}
|
|
4323
4444
|
:where(
|
|
4324
4445
|
.bp-choice--gallery:has(.bp-choice__pick:checked)
|
|
@@ -4331,8 +4452,9 @@
|
|
|
4331
4452
|
.bp-choice__mock:not(:has(.bp-choice__pick:checked))
|
|
4332
4453
|
.bp-choice__mock-frame
|
|
4333
4454
|
) {
|
|
4455
|
+
position: relative;
|
|
4456
|
+
isolation: isolate;
|
|
4334
4457
|
background-color: var(--bp-paper);
|
|
4335
|
-
background-image: var(--bp-hatch);
|
|
4336
4458
|
}
|
|
4337
4459
|
|
|
4338
4460
|
/* The compare disclosure sits between transparent siblings (gallery /
|
|
@@ -5069,8 +5191,11 @@ body > .site-nav .site-nav__theme:hover {
|
|
|
5069
5191
|
===================================================================== */
|
|
5070
5192
|
|
|
5071
5193
|
/* Modal scrim. Hidden until .is-open; centers the panel near the top of the
|
|
5072
|
-
viewport, the way command palettes sit. Sits above all docs chrome. Uses
|
|
5073
|
-
|
|
5194
|
+
viewport, the way command palettes sit. Sits above all docs chrome. Uses the
|
|
5195
|
+
same drafting scrim as .bp-lightbox: the wash paints on the host as
|
|
5196
|
+
--bp-scrim-fill while the diagonal hatch sits on a masked pseudo-element.
|
|
5197
|
+
This keeps both Safari fixes alive: WebKit paints the solid wash reliably,
|
|
5198
|
+
and the repeating hatch is not rasterized directly on the fixed layer. */
|
|
5074
5199
|
.docs-search-overlay {
|
|
5075
5200
|
position: fixed;
|
|
5076
5201
|
inset: 0;
|
|
@@ -5080,8 +5205,24 @@ body > .site-nav .site-nav__theme:hover {
|
|
|
5080
5205
|
align-items: flex-start;
|
|
5081
5206
|
padding: clamp(var(--bp-space-5), 12vh, var(--bp-space-7)) var(--bp-space-4)
|
|
5082
5207
|
var(--bp-space-4);
|
|
5083
|
-
background-
|
|
5084
|
-
|
|
5208
|
+
background-image: var(--bp-scrim-fill);
|
|
5209
|
+
isolation: isolate;
|
|
5210
|
+
}
|
|
5211
|
+
.docs-search-overlay::before {
|
|
5212
|
+
content: "";
|
|
5213
|
+
position: absolute;
|
|
5214
|
+
inset: 0;
|
|
5215
|
+
z-index: -1;
|
|
5216
|
+
pointer-events: none;
|
|
5217
|
+
background-color: var(--bp-ink-faint);
|
|
5218
|
+
-webkit-mask-image: var(--bp-hatch-mask);
|
|
5219
|
+
mask-image: var(--bp-hatch-mask);
|
|
5220
|
+
-webkit-mask-size: var(--bp-hatch-gap) var(--bp-hatch-gap);
|
|
5221
|
+
mask-size: var(--bp-hatch-gap) var(--bp-hatch-gap);
|
|
5222
|
+
-webkit-mask-repeat: repeat;
|
|
5223
|
+
mask-repeat: repeat;
|
|
5224
|
+
-webkit-mask-position: 0 0;
|
|
5225
|
+
mask-position: 0 0;
|
|
5085
5226
|
}
|
|
5086
5227
|
.docs-search-overlay.is-open {
|
|
5087
5228
|
display: flex;
|