@usableapp/cardds 0.7.81 → 0.7.82

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,17 @@
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.82 — 2026-10-10
6
+
7
+ ### Changed
8
+ - **The edge of a `StampPlace` is round dots, close together** (Lh 2026-10-10: the dashes stood too far apart) — before → after: a stroke of 8px dashes with a gap of 12px → 2px round dots with 4px clear between them (a pitch of 6px from one centre to the next), still round at `--stamp-place-radius`, the same colours (`--stamp-place-border`, `--stamp-place-faint-border`, a card's muted ink), the same 4:5 size, the words and icon inside where they were. The ring closes wherever its length ends, so one gap, at the top left, is a little shorter or longer than the rest. A project that set `--stamp-place-dash` and `--stamp-place-gap` for 0.7.77's dashes keeps them, now with round ends (each dash is longer by one dot, each gap shorter by one dot); unset them for dots.
9
+
10
+ ### Added
11
+ - **`--stamp-place-dot`** — how wide each dot of a `StampPlace`'s edge is (default `--rule-w`). The place's clear border, the edge's inset and its corner follow it, so the dots' outer edge stays the box's edge and the words stay where they are.
12
+
13
+ ### Fixed
14
+ - **`docs/knobs.md` listed 13 knobs too few** — a knob whose default is a `calc()` with a `var()` inside (`--btn-form-pad-x`, `--card-head-stamp-w`, `--stack-back-size`…) was missed by `npm run knobs`, so the doc and the knob test never saw it. The script now reads one more level of brackets.
15
+
5
16
  ## 0.7.81 — 2026-10-10
6
17
 
7
18
  ### Added
package/README.md CHANGED
@@ -579,9 +579,11 @@ it up. cardds draws the paper; the pictures, their words and which stamp a membe
579
579
  same list and the same `--sticky-<tone>-bg` knobs as a note's paper). `name` is the big line on the picture's foot,
580
580
  `words` the small line above it. `tilt` turns it, `onClick` makes the whole stamp a button. It fills its column up to
581
581
  `--stamp-max-w`, and every inner length follows its width, so one stamp reads in a tray and in a sheet.
582
- - **`StampPlace`** — an empty dashed place the size of a stamp: a word inside, `onClick` for "make yours", `faint` for a
583
- gap nobody is asked to fill. The edge is a drawn stroke, so its dashes are yours: `--stamp-place-dash` and
584
- `--stamp-place-gap` (defaults 8px and 12px), its corner is `--stamp-place-radius`.
582
+ - **`StampPlace`** — an empty place the size of a stamp, its edge a ring of round dots: a word inside, `onClick` for "make
583
+ yours", `faint` for a gap nobody is asked to fill. The edge is a drawn stroke, so the dots are yours: `--stamp-place-dot`
584
+ is how wide each is (default `--rule-w`, 2px), `--stamp-place-gap` the distance from one dot's centre to the next
585
+ (default 6px), and a `--stamp-place-dash` above 0 stretches each dot into a round-ended dash. Its corner is
586
+ `--stamp-place-radius`. The dots' outer edge is the box's edge whatever their width.
585
587
  - **`StampBook`** + **`StampCell`** — the album page: cells three across on an album ground, a `label` under each stamp,
586
588
  the free places drawn up to `places`. A cell with `onClick` is a button; `on` marks it pressed. `strip` is one line
587
589
  of small stamps that scrolls sideways, the tray a member picks from. A `false` or `null` child holds no place.
package/css/post.css CHANGED
@@ -230,7 +230,7 @@
230
230
  .post-desk__line > span { font: var(--type-caption); color: var(--_muted); }
231
231
  .post-desk__line > input { width: 100%; min-width: 0; min-height: var(--tap); border: 0; outline: none; background: transparent; color: inherit; font: var(--type-title); }
232
232
  .post-desk__line > input::placeholder { color: var(--_muted); }
233
- /* the stamp box: empty it is a dashed place to press; pressed, the chosen stamp lies in it */
233
+ /* the stamp box: empty it is a place of dots to press; pressed, the chosen stamp lies in it */
234
234
  .post-desk__slot { border: 0; background: transparent; color: inherit; }
235
235
  @media (prefers-reduced-motion: no-preference) {
236
236
  .post-desk__slot > .stamp { animation: post-desk-stick var(--motion-quick) ease-out both; }
package/css/stamp.css CHANGED
@@ -91,28 +91,32 @@
91
91
 
92
92
  /* ---- stamp place: an empty place for a stamp — an album's gap, "make yours" ----
93
93
  <span class="stamp-place"><svg class="stamp-place__edge" aria-hidden="true"><rect/></svg>สร้าง</span> · <button class="stamp-place">…</button> · <span class="stamp-place stamp-place--faint">…</span>
94
- The dashed edge is a <rect> of its own, not a border: a dashed border's dash and gap are the browser's to choose, a stroke's are two
95
- knobs (--stamp-place-dash, --stamp-place-gap) and its corners still follow --stamp-place-radius. The element keeps a clear border
96
- of the same width so what is inside sits where it did; the svg lies on that border, over it, and takes no part in the layout. */
94
+ The edge is a row of round dots drawn on a <rect> of its own, not a border: a dashed border's dash and gap are the browser's to choose,
95
+ a stroke's are knobs and its corners still follow --stamp-place-radius. A dot is a zero-length dash under a round cap, --stamp-place-dot
96
+ wide; --stamp-place-gap is the distance from one dot's centre to the next, and a --stamp-place-dash above 0 makes round-ended dashes
97
+ of it. The pattern closes wherever the perimeter ends, so the last gap is shorter or longer than the rest by less than one pitch.
98
+ The element keeps a clear border of the same width so what is inside sits where it did; the svg lies on that border, over it, and
99
+ takes no part in the layout. */
97
100
  .stamp-place {
98
101
  position: relative;
99
102
  display: grid;
100
103
  place-content: center;
101
104
  justify-items: center;
102
105
  padding: var(--sp-1);
103
- border: var(--rule-w) solid transparent;
106
+ border: var(--_dot) solid transparent;
104
107
  border-radius: var(--stamp-place-radius, var(--sp-2));
105
108
  background: none;
106
109
  color: var(--stamp-place-ink, var(--on-surface-muted));
107
110
  font: var(--stamp-place-font, var(--type-caption));
108
111
  text-align: center;
109
112
  --_edge: var(--stamp-place-border, var(--on-surface-muted));
113
+ --_dot: var(--stamp-place-dot, var(--rule-w));
110
114
  }
111
115
  .stamp-place__edge {
112
116
  position: absolute;
113
- inset: calc(var(--rule-w) / -2) auto auto calc(var(--rule-w) / -2);
114
- width: calc(100% + var(--rule-w));
115
- height: calc(100% + var(--rule-w));
117
+ inset: calc(var(--_dot) / -2) auto auto calc(var(--_dot) / -2);
118
+ width: calc(100% + var(--_dot));
119
+ height: calc(100% + var(--_dot));
116
120
  max-width: none; /* base.css caps every svg at its box */
117
121
  overflow: visible; /* the stroke is centred on the rect's own edge: half of it falls outside the svg */
118
122
  pointer-events: none;
@@ -120,11 +124,12 @@
120
124
  .stamp-place__edge > rect {
121
125
  width: 100%;
122
126
  height: 100%;
123
- rx: calc(var(--stamp-place-radius, var(--sp-2)) - var(--rule-w) / 2); /* the corner of the stroke's middle, so its outer edge is the radius */
127
+ rx: calc(var(--stamp-place-radius, var(--sp-2)) - var(--_dot) / 2); /* the corner of the stroke's middle, so its outer edge is the radius */
124
128
  fill: none;
125
129
  stroke: var(--_edge);
126
- stroke-width: var(--rule-w);
127
- stroke-dasharray: var(--stamp-place-dash, var(--sp-2)) var(--stamp-place-gap, var(--sp-3));
130
+ stroke-width: var(--_dot);
131
+ stroke-linecap: round;
132
+ stroke-dasharray: var(--stamp-place-dash, 0) var(--stamp-place-gap, calc(var(--sp-0) * 3));
128
133
  }
129
134
  .card .stamp-place, .post-paper .stamp-place { --_edge: var(--stamp-place-border, var(--card-muted)); color: var(--stamp-place-ink, var(--card-muted)); }
130
135
  .stamp-place--faint { --_edge: var(--stamp-place-faint-border, var(--hairline)); }
package/dist/cardds.css CHANGED
@@ -4080,28 +4080,32 @@ button:enabled { cursor: pointer; } /* a disabled one keeps the arrow */
4080
4080
 
4081
4081
  /* ---- stamp place: an empty place for a stamp — an album's gap, "make yours" ----
4082
4082
  <span class="stamp-place"><svg class="stamp-place__edge" aria-hidden="true"><rect/></svg>สร้าง</span> · <button class="stamp-place">…</button> · <span class="stamp-place stamp-place--faint">…</span>
4083
- The dashed edge is a <rect> of its own, not a border: a dashed border's dash and gap are the browser's to choose, a stroke's are two
4084
- knobs (--stamp-place-dash, --stamp-place-gap) and its corners still follow --stamp-place-radius. The element keeps a clear border
4085
- of the same width so what is inside sits where it did; the svg lies on that border, over it, and takes no part in the layout. */
4083
+ The edge is a row of round dots drawn on a <rect> of its own, not a border: a dashed border's dash and gap are the browser's to choose,
4084
+ a stroke's are knobs and its corners still follow --stamp-place-radius. A dot is a zero-length dash under a round cap, --stamp-place-dot
4085
+ wide; --stamp-place-gap is the distance from one dot's centre to the next, and a --stamp-place-dash above 0 makes round-ended dashes
4086
+ of it. The pattern closes wherever the perimeter ends, so the last gap is shorter or longer than the rest by less than one pitch.
4087
+ The element keeps a clear border of the same width so what is inside sits where it did; the svg lies on that border, over it, and
4088
+ takes no part in the layout. */
4086
4089
  .stamp-place {
4087
4090
  position: relative;
4088
4091
  display: grid;
4089
4092
  place-content: center;
4090
4093
  justify-items: center;
4091
4094
  padding: var(--sp-1);
4092
- border: var(--rule-w) solid transparent;
4095
+ border: var(--_dot) solid transparent;
4093
4096
  border-radius: var(--stamp-place-radius, var(--sp-2));
4094
4097
  background: none;
4095
4098
  color: var(--stamp-place-ink, var(--on-surface-muted));
4096
4099
  font: var(--stamp-place-font, var(--type-caption));
4097
4100
  text-align: center;
4098
4101
  --_edge: var(--stamp-place-border, var(--on-surface-muted));
4102
+ --_dot: var(--stamp-place-dot, var(--rule-w));
4099
4103
  }
4100
4104
  .stamp-place__edge {
4101
4105
  position: absolute;
4102
- inset: calc(var(--rule-w) / -2) auto auto calc(var(--rule-w) / -2);
4103
- width: calc(100% + var(--rule-w));
4104
- height: calc(100% + var(--rule-w));
4106
+ inset: calc(var(--_dot) / -2) auto auto calc(var(--_dot) / -2);
4107
+ width: calc(100% + var(--_dot));
4108
+ height: calc(100% + var(--_dot));
4105
4109
  max-width: none; /* base.css caps every svg at its box */
4106
4110
  overflow: visible; /* the stroke is centred on the rect's own edge: half of it falls outside the svg */
4107
4111
  pointer-events: none;
@@ -4109,11 +4113,12 @@ button:enabled { cursor: pointer; } /* a disabled one keeps the arrow */
4109
4113
  .stamp-place__edge > rect {
4110
4114
  width: 100%;
4111
4115
  height: 100%;
4112
- rx: calc(var(--stamp-place-radius, var(--sp-2)) - var(--rule-w) / 2); /* the corner of the stroke's middle, so its outer edge is the radius */
4116
+ rx: calc(var(--stamp-place-radius, var(--sp-2)) - var(--_dot) / 2); /* the corner of the stroke's middle, so its outer edge is the radius */
4113
4117
  fill: none;
4114
4118
  stroke: var(--_edge);
4115
- stroke-width: var(--rule-w);
4116
- stroke-dasharray: var(--stamp-place-dash, var(--sp-2)) var(--stamp-place-gap, var(--sp-3));
4119
+ stroke-width: var(--_dot);
4120
+ stroke-linecap: round;
4121
+ stroke-dasharray: var(--stamp-place-dash, 0) var(--stamp-place-gap, calc(var(--sp-0) * 3));
4117
4122
  }
4118
4123
  .card .stamp-place, .post-paper .stamp-place { --_edge: var(--stamp-place-border, var(--card-muted)); color: var(--stamp-place-ink, var(--card-muted)); }
4119
4124
  .stamp-place--faint { --_edge: var(--stamp-place-faint-border, var(--hairline)); }
@@ -4434,7 +4439,7 @@ button:enabled { cursor: pointer; } /* a disabled one keeps the arrow */
4434
4439
  .post-desk__line > span { font: var(--type-caption); color: var(--_muted); }
4435
4440
  .post-desk__line > input { width: 100%; min-width: 0; min-height: var(--tap); border: 0; outline: none; background: transparent; color: inherit; font: var(--type-title); }
4436
4441
  .post-desk__line > input::placeholder { color: var(--_muted); }
4437
- /* the stamp box: empty it is a dashed place to press; pressed, the chosen stamp lies in it */
4442
+ /* the stamp box: empty it is a place of dots to press; pressed, the chosen stamp lies in it */
4438
4443
  .post-desk__slot { border: 0; background: transparent; color: inherit; }
4439
4444
  @media (prefers-reduced-motion: no-preference) {
4440
4445
  .post-desk__slot > .stamp { animation: post-desk-stick var(--motion-quick) ease-out both; }