@usableapp/cardds 0.6.2 → 0.6.4

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 CHANGED
@@ -2,6 +2,16 @@
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.6.4 — 2026-09-23
6
+
7
+ - **Fold card: the corner is cut** (Lh 2026-09-23): the triangle under the flap shows what is behind the card, instead of the card's own colour, which read as a second card underneath. Nothing to change in an app.
8
+ - README: the minimum browsers (Safari/iOS 18.3, Chrome 114, Firefox 128 — early 2025) and which phones that means.
9
+ - Gallery only: Settings fold away; the palette is one button that turns through them; on a small screen the settings and the component list are a drawer; the search finds a story by the words in it.
10
+
11
+ ## 0.6.3 — 2026-09-23
12
+
13
+ - **The picture is not shrunk** (Lh 2026-09-23): the 40% cap from 0.6.2 and its knob `--step-media-share` are gone. The sticky picture is `--base-content-media-h` tall, always. For 230px: `:root { --base-content-media-h: 14.375rem; }`.
14
+
5
15
  ## 0.6.2 — 2026-09-23
6
16
 
7
17
  - **The picture stays put, only the words scroll** (Lh 2026-09-23): in a `Step`, a `BaseContent` whose FIRST child is a picture (`img` / `Placeholder`) keeps it sticky at the top of the reading block, and the heading and words scroll under it. The picture is capped at 40% of the step's height (`min(--base-content-media-h, --step-media-share)`, new knob `--step-media-share`, default `40cqh`), so on a short phone or at a large text size the picture gives way, never the words. Nothing to change in an app.
package/README.md CHANGED
@@ -74,6 +74,17 @@ import '@usableapp/cardds/dist/cardds.css'; // the CSS, fonts resolve from the
74
74
  ```
75
75
 
76
76
 
77
+ **Browsers** (checked 2026-09-23): works on browsers from **early 2025** on.
78
+
79
+ | Browser | Minimum | Released | Phones |
80
+ |---|---|---|---|
81
+ | Safari / iOS | 18.3 | Jan 2025 | iPhone XS / XR (2018) and newer, updated |
82
+ | Chrome | 114 | May 2023 | most Android phones with Chrome kept up to date |
83
+ | Firefox | 128 | Jul 2024 | — |
84
+
85
+ Older than that: menus and dropdowns don't open. On browsers between the minimum and
86
+ the newest, a menu opens in the middle of the screen instead of under its button.
87
+
77
88
  Working with Claude in another project? The `/cardds` skill
78
89
  (`~/.claude/skills/cardds/`) carries the install and the contract, and points
79
90
  back here. It is deliberately thin — **this repo stays the source of truth**,
package/css/media.css CHANGED
@@ -121,6 +121,12 @@
121
121
  background-repeat: no-repeat;
122
122
  background-position: bottom right;
123
123
  background-size: var(--sp-8) var(--sp-8);
124
+ background-origin: border-box; /* the flap sits on the true corner, not inside the (transparent) border */
125
+ /* the corner is CUT: the triangle under the flap shows what is behind the card. Painted in the card's own colour it
126
+ read as the square corner of a second card underneath (Lh 2026-09-23). The polygon reaches 3rem past the other
127
+ edges so a coloured palette's shadow is not clipped there. */
128
+ clip-path: polygon(-3rem -3rem, calc(100% + 3rem) -3rem, calc(100% + 3rem) calc(100% - var(--sp-8) - 3rem),
129
+ calc(100% - var(--sp-8) - 3rem) calc(100% + 3rem), -3rem calc(100% + 3rem));
124
130
  }
125
131
 
126
132
  /* ---- wave: audio waveform stand-in for voice rows ----
package/css/step.css CHANGED
@@ -104,16 +104,12 @@
104
104
  }
105
105
 
106
106
  /* a picture that opens the words stays put, only the words scroll under it (Lh 2026-09-23, timebank's walk at large text:
107
- the picture scrolled away with the words). Sticky at the top of the reading block's scroller, on the base's ground so the
108
- words pass under it; capped at a share of the STEP (a size container) so the words always keep more than half the column —
109
- the picture gives way on a short phone or at a big text size, never the words. */
107
+ the picture scrolled away with the words). Sticky at the top of the reading block's scroller; its height is
108
+ --base-content-media-h as everywhere, never shrunk (Lh 2026-09-23: a fixed height, no scaling). */
110
109
  .step > .base-content > :is(img, .ph):first-child,
111
110
  .step > .pages > .base-content > :is(img, .ph):first-child {
112
111
  position: sticky;
113
112
  top: 0;
114
113
  z-index: 1;
115
114
  background-color: var(--surface); /* the words pass UNDER it, never through a transparent picture */
116
- max-height: min(var(--base-content-media-h, 14rem), var(--step-media-share, 40cqh));
117
115
  }
118
- .step > .base-content > .ph:first-child,
119
- .step > .pages > .base-content > .ph:first-child { height: min(var(--base-content-media-h, 14rem), var(--step-media-share, 40cqh)); }
package/dist/cardds.css CHANGED
@@ -1564,19 +1564,15 @@ button { font: inherit; cursor: pointer; }
1564
1564
  }
1565
1565
 
1566
1566
  /* a picture that opens the words stays put, only the words scroll under it (Lh 2026-09-23, timebank's walk at large text:
1567
- the picture scrolled away with the words). Sticky at the top of the reading block's scroller, on the base's ground so the
1568
- words pass under it; capped at a share of the STEP (a size container) so the words always keep more than half the column —
1569
- the picture gives way on a short phone or at a big text size, never the words. */
1567
+ the picture scrolled away with the words). Sticky at the top of the reading block's scroller; its height is
1568
+ --base-content-media-h as everywhere, never shrunk (Lh 2026-09-23: a fixed height, no scaling). */
1570
1569
  .step > .base-content > :is(img, .ph):first-child,
1571
1570
  .step > .pages > .base-content > :is(img, .ph):first-child {
1572
1571
  position: sticky;
1573
1572
  top: 0;
1574
1573
  z-index: 1;
1575
1574
  background-color: var(--surface); /* the words pass UNDER it, never through a transparent picture */
1576
- max-height: min(var(--base-content-media-h, 14rem), var(--step-media-share, 40cqh));
1577
1575
  }
1578
- .step > .base-content > .ph:first-child,
1579
- .step > .pages > .base-content > .ph:first-child { height: min(var(--base-content-media-h, 14rem), var(--step-media-share, 40cqh)); }
1580
1576
 
1581
1577
  /* ---- css/forms.css — outlined fields, add-row ---- */
1582
1578
  /* ============================================================
@@ -3002,6 +2998,12 @@ button { font: inherit; cursor: pointer; }
3002
2998
  background-repeat: no-repeat;
3003
2999
  background-position: bottom right;
3004
3000
  background-size: var(--sp-8) var(--sp-8);
3001
+ background-origin: border-box; /* the flap sits on the true corner, not inside the (transparent) border */
3002
+ /* the corner is CUT: the triangle under the flap shows what is behind the card. Painted in the card's own colour it
3003
+ read as the square corner of a second card underneath (Lh 2026-09-23). The polygon reaches 3rem past the other
3004
+ edges so a coloured palette's shadow is not clipped there. */
3005
+ clip-path: polygon(-3rem -3rem, calc(100% + 3rem) -3rem, calc(100% + 3rem) calc(100% - var(--sp-8) - 3rem),
3006
+ calc(100% - var(--sp-8) - 3rem) calc(100% + 3rem), -3rem calc(100% + 3rem));
3005
3007
  }
3006
3008
 
3007
3009
  /* ---- wave: audio waveform stand-in for voice rows ----
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usableapp/cardds",
3
- "version": "0.6.2",
3
+ "version": "0.6.4",
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.",