@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 +12 -0
- package/css/choice.css +15 -2
- package/css/forms.css +7 -4
- package/dist/cardds.css +22 -6
- package/package.json +1 -1
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
|
-
|
|
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(--
|
|
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
|
|
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(--
|
|
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
|
|
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
|
-
|
|
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.
|
|
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.",
|