@usableapp/cardds 0.5.0 → 0.5.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/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
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
+ ## Unreleased
6
+
7
+ ### Field type 26px, 56px tall (Lh 2026-09-22)
8
+ `--field-min-h` default is `--tap-lg` (56, was `--tap` 48) — every field stands as tall as the action field already did.
9
+ `--field-font` default is `400 var(--fs-lg) / 1.4 var(--font-ui)` (was `--type-body`, 22): the words being typed read a size up, level with the Composer. The field keeps its 48px height. A theme that set `--field-font` is unaffected.
10
+
11
+ ### Field: no browser focus ring; the field's border goes full ink while the cursor is in it (Lh 2026-09-22)
12
+ The inner input drew the browser's own ring as a second box inside the field. Gone. Knob `--field-active-border` (default `currentColor`); coloured palettes keep the 25% border at rest only.
13
+
14
+ ### Pin: the waiting cell shows a caret inside the pill, no focus ring (Lh 2026-09-22)
15
+ The `:focus-visible` outline sat outside the pill and was cropped by the sheet's edge. Gone. The cell the cursor waits in now has a full-ink border and a blinking bar drawn inside it (the native caret is hidden). Knobs `--pin-cell-active-border`, `--pin-caret-w`, `--pin-caret-h`.
16
+
5
17
  ## 0.5.0 — 2026-09-22
6
18
 
7
19
  ### Words are full ink; muted means inactive (Lh 2026-09-22)
package/css/choice.css CHANGED
@@ -204,10 +204,23 @@
204
204
  text-align: center;
205
205
  font: var(--pin-cell-font, var(--type-stat));
206
206
  font-variant-numeric: tabular-nums;
207
- caret-color: currentColor;
208
207
  }
209
208
  .pin__cell:not(:placeholder-shown) { background: var(--accent); color: var(--on-accent); border-color: transparent; }
210
- .pin__cell:focus-visible { outline: var(--focus); outline-offset: var(--sp-1); }
209
+ /* the cell the cursor waits in (Lh 2026-09-22): NO outline ring — it sat outside the pill and got cropped by the sheet's
210
+ edge. The sign is INSIDE the pill: a full-ink border and a blinking bar drawn where the digit will land (the native caret
211
+ is hidden — its height and place are the browser's; the pill's bar is one rule). A filled cell selects its digit instead. */
212
+ .pin__cell { caret-color: transparent; }
213
+ .pin__cell:focus { outline: none; border-color: var(--pin-cell-active-border, currentColor); }
214
+ .pin__cell:focus:placeholder-shown {
215
+ background-image: linear-gradient(currentColor, currentColor);
216
+ background-size: var(--pin-caret-w, 2px) var(--pin-caret-h, 1em);
217
+ background-position: center;
218
+ background-repeat: no-repeat;
219
+ }
220
+ @media (prefers-reduced-motion: no-preference) {
221
+ .pin__cell:focus:placeholder-shown { animation: pin-caret 1.1s steps(1) infinite; }
222
+ @keyframes pin-caret { 50% { background-size: 0 0; } }
223
+ }
211
224
 
212
225
  /* ---- composer: big text area with a bottom bar (icon · hint · send) ----
213
226
  <div class="composer"><textarea class="composer__input" placeholder="What do you need?"></textarea>
package/css/forms.css CHANGED
@@ -13,7 +13,7 @@
13
13
  background: var(--field-bg, var(--action-bg));
14
14
  color: var(--field-ink, var(--action-ink));
15
15
  padding-inline: var(--field-pad-x, var(--sp-4));
16
- min-height: var(--field-min-h, var(--tap));
16
+ min-height: var(--field-min-h, var(--tap-lg)); /* 56, the action field's height, for every field (Lh 2026-09-22: "ใหญ่ดี") */
17
17
  min-width: 0;
18
18
  }
19
19
 
@@ -22,19 +22,22 @@
22
22
  border: 0;
23
23
  background: transparent;
24
24
  color: inherit;
25
- font: var(--field-font, var(--type-body));
25
+ font: var(--field-font, 400 var(--fs-lg) / 1.4 var(--font-ui)); /* 26: the words being typed read a size up from body (Lh 2026-09-22); the Composer already does */
26
26
  width: 100%;
27
27
  min-width: 0;
28
- outline-offset: var(--sp-1);
28
+ outline: none; /* the browser's ring drew a second box inside the field (Lh 2026-09-22) — the field itself tells focus */
29
+ caret-color: currentColor;
29
30
  }
30
31
  .field input::placeholder { color: inherit; opacity: 0.55; }
32
+ /* the field the cursor is in: its own border goes full ink, in every palette (the coloured ones fade it to 25% at rest) */
33
+ .field:has(:focus) { border-color: var(--field-active-border, currentColor); }
31
34
 
32
35
  /* field with its action inside: date pick, send, go — the button sits flush right */
33
36
  .field--action { padding-right: var(--sp-1); min-height: var(--field-action-min-h, var(--tap-lg)); }
34
37
  .field--action > .icon-btn { margin-left: auto; }
35
38
 
36
39
  /* colored palettes drop the visible outline elsewhere — fields keep one */
37
- [data-palette] .field { border-color: color-mix(in srgb, currentColor 25%, transparent); }
40
+ [data-palette] .field:not(:has(:focus)) { border-color: color-mix(in srgb, currentColor 25%, transparent); }
38
41
 
39
42
  /* ---- add-row: inline "+ add another" action ---- */
40
43
  .add-row {
package/dist/cardds.css CHANGED
@@ -1561,7 +1561,7 @@ button { font: inherit; cursor: pointer; }
1561
1561
  background: var(--field-bg, var(--action-bg));
1562
1562
  color: var(--field-ink, var(--action-ink));
1563
1563
  padding-inline: var(--field-pad-x, var(--sp-4));
1564
- min-height: var(--field-min-h, var(--tap));
1564
+ min-height: var(--field-min-h, var(--tap-lg)); /* 56, the action field's height, for every field (Lh 2026-09-22: "ใหญ่ดี") */
1565
1565
  min-width: 0;
1566
1566
  }
1567
1567
 
@@ -1570,19 +1570,22 @@ button { font: inherit; cursor: pointer; }
1570
1570
  border: 0;
1571
1571
  background: transparent;
1572
1572
  color: inherit;
1573
- font: var(--field-font, var(--type-body));
1573
+ font: var(--field-font, 400 var(--fs-lg) / 1.4 var(--font-ui)); /* 26: the words being typed read a size up from body (Lh 2026-09-22); the Composer already does */
1574
1574
  width: 100%;
1575
1575
  min-width: 0;
1576
- outline-offset: var(--sp-1);
1576
+ outline: none; /* the browser's ring drew a second box inside the field (Lh 2026-09-22) — the field itself tells focus */
1577
+ caret-color: currentColor;
1577
1578
  }
1578
1579
  .field input::placeholder { color: inherit; opacity: 0.55; }
1580
+ /* the field the cursor is in: its own border goes full ink, in every palette (the coloured ones fade it to 25% at rest) */
1581
+ .field:has(:focus) { border-color: var(--field-active-border, currentColor); }
1579
1582
 
1580
1583
  /* field with its action inside: date pick, send, go — the button sits flush right */
1581
1584
  .field--action { padding-right: var(--sp-1); min-height: var(--field-action-min-h, var(--tap-lg)); }
1582
1585
  .field--action > .icon-btn { margin-left: auto; }
1583
1586
 
1584
1587
  /* colored palettes drop the visible outline elsewhere — fields keep one */
1585
- [data-palette] .field { border-color: color-mix(in srgb, currentColor 25%, transparent); }
1588
+ [data-palette] .field:not(:has(:focus)) { border-color: color-mix(in srgb, currentColor 25%, transparent); }
1586
1589
 
1587
1590
  /* ---- add-row: inline "+ add another" action ---- */
1588
1591
  .add-row {
@@ -2531,10 +2534,23 @@ button { font: inherit; cursor: pointer; }
2531
2534
  text-align: center;
2532
2535
  font: var(--pin-cell-font, var(--type-stat));
2533
2536
  font-variant-numeric: tabular-nums;
2534
- caret-color: currentColor;
2535
2537
  }
2536
2538
  .pin__cell:not(:placeholder-shown) { background: var(--accent); color: var(--on-accent); border-color: transparent; }
2537
- .pin__cell:focus-visible { outline: var(--focus); outline-offset: var(--sp-1); }
2539
+ /* the cell the cursor waits in (Lh 2026-09-22): NO outline ring — it sat outside the pill and got cropped by the sheet's
2540
+ edge. The sign is INSIDE the pill: a full-ink border and a blinking bar drawn where the digit will land (the native caret
2541
+ is hidden — its height and place are the browser's; the pill's bar is one rule). A filled cell selects its digit instead. */
2542
+ .pin__cell { caret-color: transparent; }
2543
+ .pin__cell:focus { outline: none; border-color: var(--pin-cell-active-border, currentColor); }
2544
+ .pin__cell:focus:placeholder-shown {
2545
+ background-image: linear-gradient(currentColor, currentColor);
2546
+ background-size: var(--pin-caret-w, 2px) var(--pin-caret-h, 1em);
2547
+ background-position: center;
2548
+ background-repeat: no-repeat;
2549
+ }
2550
+ @media (prefers-reduced-motion: no-preference) {
2551
+ .pin__cell:focus:placeholder-shown { animation: pin-caret 1.1s steps(1) infinite; }
2552
+ @keyframes pin-caret { 50% { background-size: 0 0; } }
2553
+ }
2538
2554
 
2539
2555
  /* ---- composer: big text area with a bottom bar (icon · hint · send) ----
2540
2556
  <div class="composer"><textarea class="composer__input" placeholder="What do you need?"></textarea>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usableapp/cardds",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
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.",