@usableapp/cardds 0.7.94 → 0.7.95

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,20 @@
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.95 — 2026-10-18
6
+
7
+ From timebank's help-ask prototype (Lh 2026-10-18): its Composer, Dropdown and map stood on white cards inside the help sheet. Ruled: the sheet is the paper the member fills in.
8
+
9
+ Nothing in the package's look or behaviour changes: no component, class or knob is added or removed. Two new checks may fail a project's `cardds check`: a control in a card, and a worded pager whose forward button is not the primary one.
10
+
11
+ ### Added
12
+ - **`cardds check` rule `field-in-card` (error): the sheet is the paper the member fills in** (Lh 2026-10-18). Before → after: "Fields belong in a Sheet" was prose in `Field`'s doc, and nothing stopped a form on a card → a control the member fills in or picks, written inside a `<Card>`, is an error that names `Sheet`'s `SheetBody`, `SheetStep` and the stack sheet as its place. The controls: `Field`, `Composer`, `ComposerArea`, `Pin`, `Dropdown`, `Slider`, `Toggle`, `Check`, `ChipPick`, `Calendar`, `DayStrip`, `Day`, `Picker`, `Mood`, `AvatarPick`, `FileBtn`, `AddRow`, `MapPick`, a `Tile pick` and a `Tile upload`. A plain or `stat` Tile, a `Btn`, `IconBtn` or `Link`, and a raw `<input>` (the pickable row card's radio) are not flagged. A `Card` that is a sheet of a `SheetStack` is that stack's sheet and may hold them. To pass: move the controls onto the sheet's body (`<Sheet><CardHead …/><SheetBody>…controls…</SheetBody><CardFoot>…</CardFoot></Sheet>`), with no card round them. The ESLint plugin reports it under `cardds/check`.
13
+ - **`cardds check` rule `pager-forward-primary` (error).** Before → after: a worded pager could carry back and next with the same signal (Lh saw it on a timebank screen) → in an `ActionBar variant="pager"` or an `ActionBarTier pager` with two or more worded `Btn`s, the last (forward) one must be `primary` and the others not. The round pager (`IconBtn`s) is not checked.
14
+
15
+ ### Changed
16
+ - **Every control's doc says where it lives: on a sheet, never in a Card.** `Field`'s doc comment now leads with it, so `cardds get Field` and `cardds find "where does a form field go"` answer with the rule. README's sheet rules gain "The sheet is the paper the member fills in".
17
+ - **The gallery's stories put their controls on sheets.** 60 stories in 19 files moved from a card onto a sheet: a `Step` with a `Page` and a `Sheet` where the story is a step of a flow, a bare `SheetStage` with a `Sheet` for a part shown on its own. Story ids are unchanged. Two samples that stood in two cards of one story now stand on one sheet.
18
+
5
19
  ## 0.7.94 — 2026-10-18
6
20
 
7
21
  From timebank's help-ask sheet (Lh 2026-10-17). One look changes on existing screens: a row card's corner (41.6 → 13). Everything else is added, and a screen that does not use it is as it was.
package/README.md CHANGED
@@ -555,8 +555,21 @@ between at 40% down the screen (see *Anatomy*, "Where the centre is"):
555
555
  - **A bottom sheet holds what the member acts on** — controls, or small
556
556
  content cards to pick from or read more — and it opens to the full height
557
557
  of its box. **Cards are content the system offers**: the words, the
558
- explanation, the thing to read. Do not put a form in a card when a sheet
559
- would do, and do not put the step's explanation in a sheet.
558
+ explanation, the thing to read. Do not put the step's explanation in a
559
+ sheet.
560
+ - **The sheet is the paper the member fills in** (Lh 2026-10-18). Every
561
+ control the member fills in or picks stands on a sheet: a `Sheet`'s
562
+ `SheetBody`, a `SheetStep`, or a stack sheet. That is `Field`, `Composer`
563
+ and `ComposerArea`, `Pin`, `Dropdown`, `Slider`, `Toggle`, `Check`,
564
+ `ChipPick`, `Calendar`, `DayStrip` and `Day`, `Picker`, `Mood`,
565
+ `AvatarPick`, `FileBtn`, `AddRow`, `MapPick`, a `Tile pick` and a
566
+ `Tile upload`. A card is for reading and pressing buttons only; never put
567
+ a form, or one control of it, in a card. `cardds check` rule
568
+ `field-in-card` (error) flags a control written inside a `<Card>`. A `Card`
569
+ that is a sheet of a `SheetStack` is that stack's sheet, so it may hold
570
+ them. Seen in timebank's help-ask prototype: a Composer, a Dropdown and a
571
+ map on white cards inside the help sheet, the cards the colour of the
572
+ ground.
560
573
  - **Two sheet systems, one material.** *Sheet single* (`.sheet`, `sheet.css`)
561
574
  is ONE sheet the member acts in, whatever it holds: a short entry in front
562
575
  of a step's card, a place on a map, a payment on a dim page — in a `.step`
@@ -318,7 +318,7 @@ export interface ChipPickProps extends Omit<ComponentProps<'label'>, 'onChange'>
318
318
  /** the native input's change event: the chip was picked, or (checkbox) toggled */
319
319
  onChange?: React.ChangeEventHandler<HTMLInputElement>;
320
320
  }
321
- /** ChipPick — a chip that is a choice: full-width in a ChipGrid (9:00 · 9:30 · …), or `sign` on a ChipRow (+ off, × on — the
321
+ /** ChipPick — a chip that is a choice, on a sheet and never in a Card (the sheet is the paper the member fills in, Lh 2026-10-18): full-width in a ChipGrid (9:00 · 9:30 · …), or `sign` on a ChipRow (+ off, × on — the
322
322
  * interest picker); the picked one fills with accent. A native radio/checkbox inside the label carries the state. */
323
323
  export declare function ChipPick({ type, sign, name, value, checked, defaultChecked, onChange, className, children, ...rest }: ChipPickProps): import("react").JSX.Element;
324
324
  export interface ChipRowProps extends ComponentProps<'div'> {
@@ -7,7 +7,7 @@ export function Chip({ on, muted, dot, sm, as, href, className, children, ...res
7
7
  const el = as ?? (href ? 'a' : 'span');
8
8
  return createElement(el, { href, type: el === 'button' ? 'button' : undefined, className: cx('chip', on && 'chip--on', muted && 'chip--muted', sm && 'chip--sm', className), ...rest }, dot && _jsx(Dot, { b: dot === 'b', tone: dot === 'a' || dot === 'b' ? undefined : dot }), children);
9
9
  }
10
- /** ChipPick — a chip that is a choice: full-width in a ChipGrid (9:00 · 9:30 · …), or `sign` on a ChipRow (+ off, × on — the
10
+ /** ChipPick — a chip that is a choice, on a sheet and never in a Card (the sheet is the paper the member fills in, Lh 2026-10-18): full-width in a ChipGrid (9:00 · 9:30 · …), or `sign` on a ChipRow (+ off, × on — the
11
11
  * interest picker); the picked one fills with accent. A native radio/checkbox inside the label carries the state. */
12
12
  export function ChipPick({ type, sign, name, value, checked, defaultChecked, onChange, className, children, ...rest }) {
13
13
  return (_jsxs("label", { className: cx('chip chip--pick', sign && 'chip--sign', className), ...rest, children: [_jsx("input", { type: type ?? (sign ? 'checkbox' : 'radio'), name: name, value: value, checked: checked, defaultChecked: defaultChecked, onChange: onChange }), children] }));
@@ -22,7 +22,7 @@ export interface DropdownProps extends Omit<ComponentProps<'div'>, 'onChange' |
22
22
  * Dropdown — THE select: a pill trigger + its Menu popover anchored under it (native popover: light dismiss, Esc). Never a native
23
23
  * `<select>`. ONE component, like `<select>` is — the pill and the panel are its own anatomy. It holds a VALUE, controlled like an
24
24
  * input: `value` + `onChange`, or `defaultValue`. Children are MenuItems with a `value`; the chosen one is marked and names the pill.
25
- * In a FilterRow dropdowns share the width.
25
+ * In a FilterRow dropdowns share the width. On a sheet, never in a Card: the sheet is the paper the member fills in (Lh 2026-10-18).
26
26
  */
27
27
  export declare function Dropdown({ id, value, defaultValue, onChange, label, end, muted, className, children, ...rest }: DropdownProps): import("react").JSX.Element;
28
28
  export interface MenuProps extends Omit<ComponentProps<'div'>, 'popover' | 'onChange' | 'defaultValue'> {
@@ -11,7 +11,7 @@ const useValue = (value, defaultValue, onChange) => useControlled(value, default
11
11
  * Dropdown — THE select: a pill trigger + its Menu popover anchored under it (native popover: light dismiss, Esc). Never a native
12
12
  * `<select>`. ONE component, like `<select>` is — the pill and the panel are its own anatomy. It holds a VALUE, controlled like an
13
13
  * input: `value` + `onChange`, or `defaultValue`. Children are MenuItems with a `value`; the chosen one is marked and names the pill.
14
- * In a FilterRow dropdowns share the width.
14
+ * In a FilterRow dropdowns share the width. On a sheet, never in a Card: the sheet is the paper the member fills in (Lh 2026-10-18).
15
15
  */
16
16
  export function Dropdown({ id, value, defaultValue, onChange, label, end, muted, className, children, ...rest }) {
17
17
  const [current, pick] = useValue(value, defaultValue, onChange);