@usableapp/cardds 0.7.57 → 0.7.58
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/CHANGELOG.md +5 -0
- package/README.md +2 -0
- package/css/sheet.css +2 -2
- package/css/stack.css +26 -5
- package/dist/cardds.css +28 -7
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
> For: a project that consumes `@usableapp/cardds` and its AI — what changed between versions, written as before → after, so a screen can be brought up to date without reading the source. Newest first. A consumer never edits cardds; if something here leaves you without a way to do what you did before, report the gap.
|
|
4
4
|
|
|
5
|
+
## 0.7.58 — 2026-10-06
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
- **A closed paper sheet in a stack shows the card's colour where the next sheet's round top does not cover it.** The white body used to show in those corners. While the sheet is closed that body is clear. On the way back into the stack the card colour fades in over `--motion-quick`, and the fade ends as the sheet stops. Open, the body is white at once. The first row still sits `--sp-6` down. Nothing to change in a screen.
|
|
9
|
+
|
|
5
10
|
## 0.7.57 — 2026-10-06
|
|
6
11
|
|
|
7
12
|
### Added
|
package/README.md
CHANGED
|
@@ -278,6 +278,8 @@ whose markup has rules, because the sheet's box is the step itself:
|
|
|
278
278
|
the content white while the head keeps the sheet's colour (`tone`, as a card).
|
|
279
279
|
The same prop on a `StackSheet`, or on a `Card` in a stack: the head keeps the
|
|
280
280
|
tone, the body and the foot are white, and the gap under the head stays the tone.
|
|
281
|
+
While that sheet is closed, the corners the next sheet does not cover show the
|
|
282
|
+
card's colour. That colour fades in as the sheet returns, and is done when it stops.
|
|
281
283
|
A sheet with no head (the dim page sheet) is a body alone.
|
|
282
284
|
- **The step follows its top bar directly, and touches it.** `full` means
|
|
283
285
|
the sheet's top edge at the bar's bottom edge — nothing above it but the
|
package/css/sheet.css
CHANGED
|
@@ -203,8 +203,8 @@
|
|
|
203
203
|
The flex gap under the head is outside the body, so it stays the sheet's tint.
|
|
204
204
|
The first field would sit on that colour seam. The white inset is --sp-6 (24px at
|
|
205
205
|
the default spacing), the body's own top padding, and only when the sheet is paper.
|
|
206
|
-
A plain sheet keeps padding-top 0. A sheet in a stack wears the same class
|
|
207
|
-
|
|
206
|
+
A plain sheet keeps padding-top 0. A sheet in a stack wears the same class and the same
|
|
207
|
+
inset: the stack's own gap under the head is the card's colour, so the row still needs this white.
|
|
208
208
|
The ink falls back to the wireframe word colour: an unset --color-ink would otherwise
|
|
209
209
|
inherit a dark card's light ink, and the words would vanish on the white. */
|
|
210
210
|
.sheet--paper > .sheet__body {
|
package/css/stack.css
CHANGED
|
@@ -175,12 +175,10 @@
|
|
|
175
175
|
}
|
|
176
176
|
.sheet-stack--tap > .card.is-open.is-dragging { transition: none; }
|
|
177
177
|
.sheet-stack--tap > .card > .card__head { touch-action: none; }
|
|
178
|
-
/* a pull in the content, already at the top: the words move down, the card stays. --_refresh is the finger, private.
|
|
178
|
+
/* a pull in the content, already at the top: the words move down, the card stays. --_refresh is the finger, private.
|
|
179
|
+
A paper body adds its own --sp-6 on top of this (the rule below): the stack's gap under the head is the
|
|
180
|
+
card's colour, so without the white inset the first row sits on that seam. */
|
|
179
181
|
.sheet-stack > .card > .sheet__body { padding-top: var(--_refresh, 0px); transition: padding-top var(--motion-sheet) ease; }
|
|
180
|
-
/* paper on a stacked sheet is the same class as the single sheet (Lh 2026-10-06). The head keeps the card's
|
|
181
|
-
colour. The body is white, from the rule in sheet.css, and its top inset is --sp-6. A pull still adds
|
|
182
|
-
--_refresh: this rule wins on padding, because the pull's rule above is more specific than the single sheet's. */
|
|
183
|
-
.sheet-stack > .card.sheet--paper > .sheet__body { padding-top: calc(var(--sp-6) + var(--_refresh, 0px)); }
|
|
184
182
|
.sheet-stack--tap > .card.is-open:not(:has(> .sheet__body)) {
|
|
185
183
|
padding-top: calc(var(--card-pad) + var(--_refresh, 0px));
|
|
186
184
|
transition: translate var(--motion-sheet) ease, padding-top var(--motion-sheet) ease;
|
|
@@ -315,6 +313,29 @@
|
|
|
315
313
|
.sheet-stack--tap > .card:has(> .sheet__body).is-open { overflow: clip; }
|
|
316
314
|
.sheet-stack > .card:has(> .sheet__body) > :not(.sheet__body) { flex-shrink: 0; }
|
|
317
315
|
.sheet-stack > .card > .sheet__body { --_cover: 0rem; } /* nothing slid under here: the stack's sheet is always whole */
|
|
316
|
+
/* a closed paper sheet's body stays clear (Lh 2026-10-06). The next sheet's round top does not
|
|
317
|
+
cover the corners, and a white body showed there beside the head. Clear, the card's own colour
|
|
318
|
+
shows in that pocket. Open, the body is white, and the first row sits --sp-6 down, the same white
|
|
319
|
+
inset a single paper sheet keeps: the flex gap under the head is the card's colour, so the row
|
|
320
|
+
would otherwise sit on that seam. A pull adds --_refresh on top of the inset. On the way back
|
|
321
|
+
into the stack the card colour fades in quickly (--motion-quick) and that fade ends with the
|
|
322
|
+
sheet's own slide (--motion-sheet, plus the same stagger), so the corner is the head colour
|
|
323
|
+
at the moment the sheet stops. Rising, the body is white at once. */
|
|
324
|
+
.sheet-stack > .card.sheet--paper > .sheet__body {
|
|
325
|
+
padding-top: calc(var(--sp-6) + var(--_refresh, 0px));
|
|
326
|
+
transition: padding-top var(--motion-sheet) ease, background-color 0s linear;
|
|
327
|
+
}
|
|
328
|
+
.sheet-stack > .card.sheet--paper:not(.is-open) > .sheet__body {
|
|
329
|
+
background-color: transparent;
|
|
330
|
+
transition:
|
|
331
|
+
padding-top var(--motion-sheet) ease,
|
|
332
|
+
background-color var(--motion-quick) ease calc(var(--stagger, 0) * 70ms + var(--motion-sheet) - var(--motion-quick));
|
|
333
|
+
}
|
|
334
|
+
@media (prefers-reduced-motion: reduce) {
|
|
335
|
+
.sheet-stack > .card.sheet--paper:not(.is-open) > .sheet__body {
|
|
336
|
+
transition: padding-top var(--motion-sheet) ease, background-color 0s linear;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
318
339
|
/* a paper stack's foot is white to the card's edges, and it covers the tinted flex gap above it so the
|
|
319
340
|
button does not sit on a colour stripe. The head's gap stays: it is outside this foot. The button stays
|
|
320
341
|
where it was — the padding gives back what the bleed takes. */
|
package/dist/cardds.css
CHANGED
|
@@ -1176,12 +1176,10 @@ button:enabled { cursor: pointer; } /* a disabled one keeps the arrow */
|
|
|
1176
1176
|
}
|
|
1177
1177
|
.sheet-stack--tap > .card.is-open.is-dragging { transition: none; }
|
|
1178
1178
|
.sheet-stack--tap > .card > .card__head { touch-action: none; }
|
|
1179
|
-
/* a pull in the content, already at the top: the words move down, the card stays. --_refresh is the finger, private.
|
|
1179
|
+
/* a pull in the content, already at the top: the words move down, the card stays. --_refresh is the finger, private.
|
|
1180
|
+
A paper body adds its own --sp-6 on top of this (the rule below): the stack's gap under the head is the
|
|
1181
|
+
card's colour, so without the white inset the first row sits on that seam. */
|
|
1180
1182
|
.sheet-stack > .card > .sheet__body { padding-top: var(--_refresh, 0px); transition: padding-top var(--motion-sheet) ease; }
|
|
1181
|
-
/* paper on a stacked sheet is the same class as the single sheet (Lh 2026-10-06). The head keeps the card's
|
|
1182
|
-
colour. The body is white, from the rule in sheet.css, and its top inset is --sp-6. A pull still adds
|
|
1183
|
-
--_refresh: this rule wins on padding, because the pull's rule above is more specific than the single sheet's. */
|
|
1184
|
-
.sheet-stack > .card.sheet--paper > .sheet__body { padding-top: calc(var(--sp-6) + var(--_refresh, 0px)); }
|
|
1185
1183
|
.sheet-stack--tap > .card.is-open:not(:has(> .sheet__body)) {
|
|
1186
1184
|
padding-top: calc(var(--card-pad) + var(--_refresh, 0px));
|
|
1187
1185
|
transition: translate var(--motion-sheet) ease, padding-top var(--motion-sheet) ease;
|
|
@@ -1316,6 +1314,29 @@ button:enabled { cursor: pointer; } /* a disabled one keeps the arrow */
|
|
|
1316
1314
|
.sheet-stack--tap > .card:has(> .sheet__body).is-open { overflow: clip; }
|
|
1317
1315
|
.sheet-stack > .card:has(> .sheet__body) > :not(.sheet__body) { flex-shrink: 0; }
|
|
1318
1316
|
.sheet-stack > .card > .sheet__body { --_cover: 0rem; } /* nothing slid under here: the stack's sheet is always whole */
|
|
1317
|
+
/* a closed paper sheet's body stays clear (Lh 2026-10-06). The next sheet's round top does not
|
|
1318
|
+
cover the corners, and a white body showed there beside the head. Clear, the card's own colour
|
|
1319
|
+
shows in that pocket. Open, the body is white, and the first row sits --sp-6 down, the same white
|
|
1320
|
+
inset a single paper sheet keeps: the flex gap under the head is the card's colour, so the row
|
|
1321
|
+
would otherwise sit on that seam. A pull adds --_refresh on top of the inset. On the way back
|
|
1322
|
+
into the stack the card colour fades in quickly (--motion-quick) and that fade ends with the
|
|
1323
|
+
sheet's own slide (--motion-sheet, plus the same stagger), so the corner is the head colour
|
|
1324
|
+
at the moment the sheet stops. Rising, the body is white at once. */
|
|
1325
|
+
.sheet-stack > .card.sheet--paper > .sheet__body {
|
|
1326
|
+
padding-top: calc(var(--sp-6) + var(--_refresh, 0px));
|
|
1327
|
+
transition: padding-top var(--motion-sheet) ease, background-color 0s linear;
|
|
1328
|
+
}
|
|
1329
|
+
.sheet-stack > .card.sheet--paper:not(.is-open) > .sheet__body {
|
|
1330
|
+
background-color: transparent;
|
|
1331
|
+
transition:
|
|
1332
|
+
padding-top var(--motion-sheet) ease,
|
|
1333
|
+
background-color var(--motion-quick) ease calc(var(--stagger, 0) * 70ms + var(--motion-sheet) - var(--motion-quick));
|
|
1334
|
+
}
|
|
1335
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1336
|
+
.sheet-stack > .card.sheet--paper:not(.is-open) > .sheet__body {
|
|
1337
|
+
transition: padding-top var(--motion-sheet) ease, background-color 0s linear;
|
|
1338
|
+
}
|
|
1339
|
+
}
|
|
1319
1340
|
/* a paper stack's foot is white to the card's edges, and it covers the tinted flex gap above it so the
|
|
1320
1341
|
button does not sit on a colour stripe. The head's gap stays: it is outside this foot. The button stays
|
|
1321
1342
|
where it was — the padding gives back what the bleed takes. */
|
|
@@ -1616,8 +1637,8 @@ button:enabled { cursor: pointer; } /* a disabled one keeps the arrow */
|
|
|
1616
1637
|
The flex gap under the head is outside the body, so it stays the sheet's tint.
|
|
1617
1638
|
The first field would sit on that colour seam. The white inset is --sp-6 (24px at
|
|
1618
1639
|
the default spacing), the body's own top padding, and only when the sheet is paper.
|
|
1619
|
-
A plain sheet keeps padding-top 0. A sheet in a stack wears the same class
|
|
1620
|
-
|
|
1640
|
+
A plain sheet keeps padding-top 0. A sheet in a stack wears the same class and the same
|
|
1641
|
+
inset: the stack's own gap under the head is the card's colour, so the row still needs this white.
|
|
1621
1642
|
The ink falls back to the wireframe word colour: an unset --color-ink would otherwise
|
|
1622
1643
|
inherit a dark card's light ink, and the words would vanish on the white. */
|
|
1623
1644
|
.sheet--paper > .sheet__body {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@usableapp/cardds",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.58",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "card-first mobile design system, React-first: the components in src/ are thin wrappers over the CSS contract (css/*.css stays the only truth); gallery/ shows every story live (npm run dev), tests/ measures the geometry.",
|