mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-15 07:36:50 +03:00
205 lines
10 KiB
CSS
205 lines
10 KiB
CSS
/* ============================================================
|
|
Screen 08: boundary style.
|
|
|
|
What tells the reader one section has ended and the next has begun. Four
|
|
answers, in order of how much material they spend: nothing, a line, a
|
|
change of ground, an edge you can see.
|
|
|
|
Bands are mixed from the artboard's own ink and ground rather than named
|
|
colors, so a drenched page separates with a lighter wash of its primary
|
|
instead of turning grey.
|
|
|
|
The tokens moved here are section-scale, and they are the grounds and edges
|
|
themselves. Depth works at element scale and only ever adds to what is set
|
|
here, as a shadow or as a tonal overlay, so the two answers compose rather
|
|
than overwrite each other.
|
|
============================================================ */
|
|
|
|
/* The four answers differ in material, not in vertical rhythm: a tint, a
|
|
hairline, an inset, an edge. None of them pads the proof band, because on the
|
|
desktop artboard that band is a fixed grid row and the row heights belong to
|
|
the layout answer on screen 07. Padding it was not buying air, it was
|
|
claiming room the row did not have: the copy overflowed the padding box
|
|
downward, which is why a tinted band read as squeezed and sat low in its own
|
|
tint, and why the open answer quietly stretched the row and shifted every
|
|
section under it. */
|
|
|
|
/* ── Open space ──────────────────────────────────────────────
|
|
Every rule off and every ground the same, so the only thing left holding
|
|
the sections apart is the air between them. */
|
|
#picker-form:has(.picker-strategy-option:hover input[name="boundary-style"][value="open-space"]) .picker-preview-boundaries,
|
|
:where(#picker-form:not(:has(.picker-strategy-option:hover input[name="boundary-style"])):has(input[name="boundary-style"][value="open-space"]:checked)) [data-carry] {
|
|
--pvs-divider-w: 0px;
|
|
--pvs-band: transparent;
|
|
--pvs-band-alt: transparent;
|
|
--pvs-band-top: transparent;
|
|
--pvs-panel: transparent;
|
|
--pvs-panel-edge-w: 0px;
|
|
--pvs-panel-pad: 0px;
|
|
--pvs-proof-inset: 0px;
|
|
}
|
|
|
|
/* ── Thin dividers ───────────────────────────────────────────
|
|
One hairline per boundary and nothing else: at the nav, above and below
|
|
the proof band, between its columns, and over the footer. */
|
|
#picker-form:has(.picker-strategy-option:hover input[name="boundary-style"][value="thin-dividers"]) .picker-preview-boundaries,
|
|
:where(#picker-form:not(:has(.picker-strategy-option:hover input[name="boundary-style"])):has(input[name="boundary-style"][value="thin-dividers"]:checked)) [data-carry] {
|
|
--pvs-divider-w: 1px;
|
|
--pvs-divider-c: color-mix(in oklab, var(--pvs-ink) 24%, var(--pvs-ground));
|
|
--pvs-band: transparent;
|
|
--pvs-band-alt: transparent;
|
|
--pvs-band-top: transparent;
|
|
--pvs-panel: transparent;
|
|
--pvs-panel-edge-w: 0px;
|
|
--pvs-panel-pad: 0px;
|
|
--pvs-proof-inset: 0px;
|
|
}
|
|
|
|
/* ── Surface changes ─────────────────────────────────────────
|
|
No lines at all. Chrome sits on one tone, the proof band on another, and
|
|
the boundary is wherever the ground changes under your eye. */
|
|
#picker-form:has(.picker-strategy-option:hover input[name="boundary-style"][value="surface-changes"]) .picker-preview-boundaries,
|
|
:where(#picker-form:not(:has(.picker-strategy-option:hover input[name="boundary-style"])):has(input[name="boundary-style"][value="surface-changes"]:checked)) [data-carry] {
|
|
--pvs-divider-w: 0px;
|
|
--pvs-band: color-mix(in oklab, var(--pvs-ink) 7%, var(--pvs-ground));
|
|
--pvs-band-alt: color-mix(in oklab, var(--pvs-ink) 13%, var(--pvs-ground));
|
|
--pvs-band-top: color-mix(in oklab, var(--pvs-ink) 7%, var(--pvs-ground));
|
|
--pvs-panel: transparent;
|
|
--pvs-panel-edge-w: 0px;
|
|
--pvs-panel-pad: 0px;
|
|
--pvs-proof-inset: 0px;
|
|
}
|
|
|
|
/* ── Cards and panels ────────────────────────────────────────
|
|
Content moves inside containers. The proof band pulls in off the page
|
|
margins and grows an edge, the cards do the same, and the page reads as a
|
|
set of objects on a ground rather than a run of sections. */
|
|
#picker-form:has(.picker-strategy-option:hover input[name="boundary-style"][value="cards-and-panels"]) .picker-preview-boundaries,
|
|
:where(#picker-form:not(:has(.picker-strategy-option:hover input[name="boundary-style"])):has(input[name="boundary-style"][value="cards-and-panels"]:checked)) [data-carry] {
|
|
--pvs-divider-w: 0px;
|
|
--pvs-band: transparent;
|
|
--pvs-band-alt: color-mix(in oklab, var(--pvs-ink) 5%, var(--pvs-ground));
|
|
--pvs-band-top: transparent;
|
|
--pvs-panel: color-mix(in oklab, var(--pvs-ink) 5%, var(--pvs-ground));
|
|
--pvs-panel-edge: color-mix(in oklab, var(--pvs-ink) 20%, var(--pvs-ground));
|
|
--pvs-panel-edge-w: 1px;
|
|
--pvs-panel-pad: 5%;
|
|
--pvs-proof-inset: var(--pvs-gutter);
|
|
}
|
|
|
|
/* The proof band is the one section that can become a container without the
|
|
page being restructured, so it carries the difference between a tinted
|
|
band and a panel: the inset pulls it off the page margins and the edge
|
|
only exists where an inset was asked for. */
|
|
[data-carry] .ps-desktop > .ps-proof {
|
|
margin-inline: var(--pvs-proof-inset, 0px);
|
|
border: var(--pvs-panel-edge-w) solid var(--pvs-panel-edge);
|
|
border-radius: var(--pvs-radius-surface);
|
|
}
|
|
|
|
/* The handset's chrome carries its own tint in the base artboard, which is a
|
|
boundary the open answers did not ask for. Both ends take the band. */
|
|
[data-carry] .ps-phone-top,
|
|
[data-carry] .ps-phone-footer {
|
|
background-color: var(--pvs-band-top, var(--pvs-surface));
|
|
}
|
|
|
|
/* Percentage padding resolves against the card's own width, so one value
|
|
holds at both artboard sizes instead of swamping the handset. */
|
|
[data-carry] .ps-gallery-item {
|
|
padding: var(--pvs-panel-pad, 0px);
|
|
}
|
|
|
|
/* The handset's card row is already the block closest to the footer, so it
|
|
takes a shorter version of the same padding rather than growing into it. */
|
|
[data-carry] .ps-phone-body .ps-gallery-item {
|
|
padding: calc(var(--pvs-panel-pad, 0px) * 0.5);
|
|
}
|
|
|
|
/* ── The three region bodies ──────────────────────────────────
|
|
A shell, a document, and an index are separated in different places from a
|
|
landing page, so the same four answers are spent on different parts. What is
|
|
shared is the material: the answers above set a hairline, a ground, or an edge,
|
|
and each body below reads the one it has a use for.
|
|
|
|
The dividing rules on these bodies were hardcoded hairlines, which is the
|
|
thing this screen is asking about. A shell with a permanent rule down its rail
|
|
answers Open space with a line still on screen. */
|
|
[data-carry] :is(.ps-ops-rail, .ps-ops-main, .ps-docs-rail) {
|
|
border-right: var(--pvs-divider-w) solid var(--pvs-divider-c);
|
|
}
|
|
|
|
/* A table is a run of sections stacked, so the hairline answer rules it. The
|
|
plot's own baseline is not in here: an axis is part of the chart's drawing and
|
|
not a boundary between two things. */
|
|
[data-carry] .ps-ops-table {
|
|
border-top: var(--pvs-divider-w) solid var(--pvs-divider-c);
|
|
}
|
|
|
|
[data-carry] .ps-ops-row + .ps-ops-row {
|
|
border-top: var(--pvs-divider-w) solid var(--pvs-divider-c);
|
|
}
|
|
|
|
[data-carry] .ps-index-row + .ps-index-row,
|
|
[data-carry] .ps-index-rail {
|
|
border-top: var(--pvs-divider-w) solid var(--pvs-divider-c);
|
|
}
|
|
|
|
[data-carry] :is(.ps-index-row + .ps-index-row, .ps-index-rail) {
|
|
padding-top: calc(var(--pvs-divider-w) * 8);
|
|
}
|
|
|
|
/* Grounds. Each one fills its own region and stops at the page margin rather than
|
|
bleeding to the frame edge. That is the same claim the layout screen's header
|
|
makes about these boards: their regions sit on the page grid, so the rail's
|
|
ground starts where the rail starts, on the first column line. Reaching the
|
|
edge would need the margin restated as a share of a different box, and the two
|
|
percentages do not resolve against the same width, so the tone would land a
|
|
point or two off the very line the board is drawn to check. */
|
|
[data-carry] :is(.ps-ops-rail, .ps-ops-panel, .ps-docs-rail) {
|
|
background-color: var(--pvs-band);
|
|
}
|
|
|
|
/* Alternating grounds are what a run of entries has instead of bands: the second
|
|
entry sits on a different tone from the first, and the boundary is where the
|
|
tone changes. */
|
|
[data-carry] .ps-index-row--flip {
|
|
background-color: var(--pvs-band-alt);
|
|
}
|
|
|
|
/* A table's heading row is the one place on a shell where a change of ground
|
|
does the whole job a rule would have done. */
|
|
[data-carry] .ps-ops-row--head {
|
|
background-color: var(--pvs-band-alt);
|
|
}
|
|
|
|
/* The callout is the document's only container, so it is where this screen's
|
|
answer lands. Its accent edge is not part of the answer: that is what marks
|
|
the block as a callout, and it stays under all three. */
|
|
[data-carry] .ps-docs-note {
|
|
padding: calc(var(--pt-base) * 0.7) calc(var(--pt-base) * 0.9);
|
|
background-color: var(--pvs-band-alt);
|
|
border-left: calc(var(--pt-base) * 0.25) solid var(--pvs-accent-c);
|
|
}
|
|
|
|
/* Cards, on a tool. Offered to Persuade and Operate only, so a shell is the one
|
|
region body that draws it: the chart, the table, and the side panel become
|
|
objects on a ground, and the rules that had been dividing them go, because an
|
|
edge and a hairline saying the same thing twice is the fault the answer after
|
|
Open space is meant to avoid. */
|
|
[data-carry] :is(.ps-ops-chart, .ps-ops-table, .ps-ops-panel) {
|
|
background-color: var(--pvs-panel);
|
|
border: var(--pvs-panel-edge-w) solid var(--pvs-panel-edge);
|
|
}
|
|
|
|
[data-carry] :is(.ps-ops-chart, .ps-ops-table) {
|
|
padding: var(--pvs-panel-pad, 0px);
|
|
}
|
|
|
|
/* An open rail plate is a state and reads as one already, so under the card
|
|
answer the rest of the rail joins it rather than the plate growing an edge. */
|
|
:where(#picker-form:not(:has(.picker-strategy-option:hover input[name="boundary-style"])):has(input[name="boundary-style"][value="cards-and-panels"]:checked)) [data-carry] .ps-ops-item,
|
|
#picker-form:has(.picker-strategy-option:hover input[name="boundary-style"][value="cards-and-panels"]) .picker-preview-boundaries .ps-ops-item {
|
|
background-color: var(--pvs-panel);
|
|
}
|