@usableapp/cardds 0.4.0 → 0.4.2

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.
@@ -23,295 +23,23 @@ export interface RowProps extends Omit<ComponentProps<'div'>, 'title'> {
23
23
  /** div (default), a link, a label wrapping a Check/Toggle, li */
24
24
  as?: 'div' | 'a' | 'label' | 'li';
25
25
  href?: string;
26
+ /** what the row EXPANDS to show under itself (who liked, the rest of a list): the row becomes a `<details>`' summary */
27
+ more?: ReactNode;
28
+ /** CONTROLLED (with `more`): expanded. Pair it with `onOpenChange` */
29
+ open?: boolean;
30
+ /** UNCONTROLLED: start expanded */
31
+ defaultOpen?: boolean;
32
+ /** the row was tapped: the state it asks for */
33
+ onOpenChange?: (open: boolean) => void;
26
34
  }
27
35
  /**
28
36
  * Row — a frameless row inside a card: lead · title + meta · end. 48px+ tall, a tap target.
29
37
  * Several go in Rows (hairlines between). A row that IS a card is `Card row`.
30
38
  * `done` is the checklist's finished line: ticked, muted, not tappable any more.
39
+ * `more` makes it expand: the row is the summary of a `<details class="row-expand">`, `more` comes out under it; `open` + `onOpenChange`, or `defaultOpen`.
40
+ * An `end` chevron turns when it is open — the app fetches whatever `more` lists; the row only shows it.
31
41
  */
32
- export declare function Row({ lead, leadIcon, title, meta, body, end, endValue, endCaption, lg, done, as, href, className, children, ...rest }: RowProps): import("react").DetailedReactHTMLElement<{
33
- slot?: string | undefined | undefined;
34
- style?: import("react").CSSProperties | undefined;
35
- suppressHydrationWarning?: boolean | undefined | undefined;
36
- color?: string | undefined | undefined;
37
- id?: string | undefined | undefined;
38
- lang?: string | undefined | undefined;
39
- nonce?: string | undefined | undefined;
40
- part?: string | undefined | undefined;
41
- role?: import("react").AriaRole | undefined;
42
- tabIndex?: number | undefined | undefined;
43
- "aria-activedescendant"?: string | undefined | undefined;
44
- "aria-atomic"?: (boolean | "true" | "false") | undefined;
45
- "aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined | undefined;
46
- "aria-braillelabel"?: string | undefined | undefined;
47
- "aria-brailleroledescription"?: string | undefined | undefined;
48
- "aria-busy"?: (boolean | "true" | "false") | undefined;
49
- "aria-checked"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
50
- "aria-colcount"?: number | undefined | undefined;
51
- "aria-colindex"?: number | undefined | undefined;
52
- "aria-colindextext"?: string | undefined | undefined;
53
- "aria-colspan"?: number | undefined | undefined;
54
- "aria-controls"?: string | undefined | undefined;
55
- "aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined | undefined;
56
- "aria-describedby"?: string | undefined | undefined;
57
- "aria-description"?: string | undefined | undefined;
58
- "aria-details"?: string | undefined | undefined;
59
- "aria-disabled": (boolean | "true" | "false") | undefined;
60
- "aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined | undefined;
61
- "aria-errormessage"?: string | undefined | undefined;
62
- "aria-expanded"?: (boolean | "true" | "false") | undefined;
63
- "aria-flowto"?: string | undefined | undefined;
64
- "aria-grabbed"?: (boolean | "true" | "false") | undefined;
65
- "aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined | undefined;
66
- "aria-hidden"?: (boolean | "true" | "false") | undefined;
67
- "aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined | undefined;
68
- "aria-keyshortcuts"?: string | undefined | undefined;
69
- "aria-label"?: string | undefined | undefined;
70
- "aria-labelledby"?: string | undefined | undefined;
71
- "aria-level"?: number | undefined | undefined;
72
- "aria-live"?: "off" | "assertive" | "polite" | undefined | undefined;
73
- "aria-modal"?: (boolean | "true" | "false") | undefined;
74
- "aria-multiline"?: (boolean | "true" | "false") | undefined;
75
- "aria-multiselectable"?: (boolean | "true" | "false") | undefined;
76
- "aria-orientation"?: "horizontal" | "vertical" | undefined | undefined;
77
- "aria-owns"?: string | undefined | undefined;
78
- "aria-placeholder"?: string | undefined | undefined;
79
- "aria-posinset"?: number | undefined | undefined;
80
- "aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
81
- "aria-readonly"?: (boolean | "true" | "false") | undefined;
82
- "aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined | undefined;
83
- "aria-required"?: (boolean | "true" | "false") | undefined;
84
- "aria-roledescription"?: string | undefined | undefined;
85
- "aria-rowcount"?: number | undefined | undefined;
86
- "aria-rowindex"?: number | undefined | undefined;
87
- "aria-rowindextext"?: string | undefined | undefined;
88
- "aria-rowspan"?: number | undefined | undefined;
89
- "aria-selected"?: (boolean | "true" | "false") | undefined;
90
- "aria-setsize"?: number | undefined | undefined;
91
- "aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined | undefined;
92
- "aria-valuemax"?: number | undefined | undefined;
93
- "aria-valuemin"?: number | undefined | undefined;
94
- "aria-valuenow"?: number | undefined | undefined;
95
- "aria-valuetext"?: string | undefined | undefined;
96
- dangerouslySetInnerHTML?: {
97
- __html: string | TrustedHTML;
98
- } | undefined | undefined;
99
- onCopy?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
100
- onCopyCapture?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
101
- onCut?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
102
- onCutCapture?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
103
- onPaste?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
104
- onPasteCapture?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
105
- onCompositionEnd?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
106
- onCompositionEndCapture?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
107
- onCompositionStart?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
108
- onCompositionStartCapture?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
109
- onCompositionUpdate?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
110
- onCompositionUpdateCapture?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
111
- onFocus?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
112
- onFocusCapture?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
113
- onBlur?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
114
- onBlurCapture?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
115
- onChange?: import("react").ChangeEventHandler<HTMLDivElement, Element> | undefined;
116
- onChangeCapture?: import("react").ChangeEventHandler<HTMLDivElement, Element> | undefined;
117
- onBeforeInput?: import("react").InputEventHandler<HTMLDivElement> | undefined;
118
- onBeforeInputCapture?: import("react").InputEventHandler<HTMLDivElement> | undefined;
119
- onInput?: import("react").InputEventHandler<HTMLDivElement> | undefined;
120
- onInputCapture?: import("react").InputEventHandler<HTMLDivElement> | undefined;
121
- onReset?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
122
- onResetCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
123
- onSubmit?: import("react").SubmitEventHandler<HTMLDivElement> | undefined;
124
- onSubmitCapture?: import("react").SubmitEventHandler<HTMLDivElement> | undefined;
125
- onInvalid?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
126
- onInvalidCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
127
- onLoad?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
128
- onLoadCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
129
- onError?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
130
- onErrorCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
131
- onKeyDown?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
132
- onKeyDownCapture?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
133
- onKeyPress?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
134
- onKeyPressCapture?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
135
- onKeyUp?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
136
- onKeyUpCapture?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
137
- onAbort?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
138
- onAbortCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
139
- onCanPlay?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
140
- onCanPlayCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
141
- onCanPlayThrough?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
142
- onCanPlayThroughCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
143
- onDurationChange?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
144
- onDurationChangeCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
145
- onEmptied?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
146
- onEmptiedCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
147
- onEncrypted?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
148
- onEncryptedCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
149
- onEnded?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
150
- onEndedCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
151
- onLoadedData?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
152
- onLoadedDataCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
153
- onLoadedMetadata?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
154
- onLoadedMetadataCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
155
- onLoadStart?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
156
- onLoadStartCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
157
- onPause?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
158
- onPauseCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
159
- onPlay?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
160
- onPlayCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
161
- onPlaying?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
162
- onPlayingCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
163
- onProgress?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
164
- onProgressCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
165
- onRateChange?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
166
- onRateChangeCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
167
- onSeeked?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
168
- onSeekedCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
169
- onSeeking?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
170
- onSeekingCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
171
- onStalled?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
172
- onStalledCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
173
- onSuspend?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
174
- onSuspendCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
175
- onTimeUpdate?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
176
- onTimeUpdateCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
177
- onVolumeChange?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
178
- onVolumeChangeCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
179
- onWaiting?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
180
- onWaitingCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
181
- onAuxClick?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
182
- onAuxClickCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
183
- onClick?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
184
- onClickCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
185
- onContextMenu?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
186
- onContextMenuCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
187
- onDoubleClick?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
188
- onDoubleClickCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
189
- onDrag?: import("react").DragEventHandler<HTMLDivElement> | undefined;
190
- onDragCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
191
- onDragEnd?: import("react").DragEventHandler<HTMLDivElement> | undefined;
192
- onDragEndCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
193
- onDragEnter?: import("react").DragEventHandler<HTMLDivElement> | undefined;
194
- onDragEnterCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
195
- onDragExit?: import("react").DragEventHandler<HTMLDivElement> | undefined;
196
- onDragExitCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
197
- onDragLeave?: import("react").DragEventHandler<HTMLDivElement> | undefined;
198
- onDragLeaveCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
199
- onDragOver?: import("react").DragEventHandler<HTMLDivElement> | undefined;
200
- onDragOverCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
201
- onDragStart?: import("react").DragEventHandler<HTMLDivElement> | undefined;
202
- onDragStartCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
203
- onDrop?: import("react").DragEventHandler<HTMLDivElement> | undefined;
204
- onDropCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
205
- onMouseDown?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
206
- onMouseDownCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
207
- onMouseEnter?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
208
- onMouseLeave?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
209
- onMouseMove?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
210
- onMouseMoveCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
211
- onMouseOut?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
212
- onMouseOutCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
213
- onMouseOver?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
214
- onMouseOverCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
215
- onMouseUp?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
216
- onMouseUpCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
217
- onSelect?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
218
- onSelectCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
219
- onTouchCancel?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
220
- onTouchCancelCapture?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
221
- onTouchEnd?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
222
- onTouchEndCapture?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
223
- onTouchMove?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
224
- onTouchMoveCapture?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
225
- onTouchStart?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
226
- onTouchStartCapture?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
227
- onPointerDown?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
228
- onPointerDownCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
229
- onPointerMove?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
230
- onPointerMoveCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
231
- onPointerUp?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
232
- onPointerUpCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
233
- onPointerCancel?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
234
- onPointerCancelCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
235
- onPointerEnter?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
236
- onPointerLeave?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
237
- onPointerOver?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
238
- onPointerOverCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
239
- onPointerOut?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
240
- onPointerOutCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
241
- onGotPointerCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
242
- onGotPointerCaptureCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
243
- onLostPointerCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
244
- onLostPointerCaptureCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
245
- onScroll?: import("react").UIEventHandler<HTMLDivElement> | undefined;
246
- onScrollCapture?: import("react").UIEventHandler<HTMLDivElement> | undefined;
247
- onScrollEnd?: import("react").UIEventHandler<HTMLDivElement> | undefined;
248
- onScrollEndCapture?: import("react").UIEventHandler<HTMLDivElement> | undefined;
249
- onWheel?: import("react").WheelEventHandler<HTMLDivElement> | undefined;
250
- onWheelCapture?: import("react").WheelEventHandler<HTMLDivElement> | undefined;
251
- onAnimationStart?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
252
- onAnimationStartCapture?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
253
- onAnimationEnd?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
254
- onAnimationEndCapture?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
255
- onAnimationIteration?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
256
- onAnimationIterationCapture?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
257
- onToggle?: import("react").ToggleEventHandler<HTMLDivElement> | undefined;
258
- onBeforeToggle?: import("react").ToggleEventHandler<HTMLDivElement> | undefined;
259
- onTransitionCancel?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
260
- onTransitionCancelCapture?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
261
- onTransitionEnd?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
262
- onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
263
- onTransitionRun?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
264
- onTransitionRunCapture?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
265
- onTransitionStart?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
266
- onTransitionStartCapture?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
267
- ref?: import("react").Ref<HTMLDivElement> | undefined;
268
- key?: import("react").Key | null | undefined;
269
- defaultChecked?: boolean | undefined | undefined;
270
- defaultValue?: string | number | readonly string[] | undefined;
271
- suppressContentEditableWarning?: boolean | undefined | undefined;
272
- accessKey?: string | undefined | undefined;
273
- autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}) | undefined;
274
- autoFocus?: boolean | undefined | undefined;
275
- contentEditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
276
- contextMenu?: string | undefined | undefined;
277
- dir?: string | undefined | undefined;
278
- draggable?: (boolean | "true" | "false") | undefined;
279
- enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
280
- hidden?: boolean | undefined | undefined;
281
- spellCheck?: (boolean | "true" | "false") | undefined;
282
- translate?: "yes" | "no" | undefined | undefined;
283
- radioGroup?: string | undefined | undefined;
284
- about?: string | undefined | undefined;
285
- content?: string | undefined | undefined;
286
- datatype?: string | undefined | undefined;
287
- inlist?: any;
288
- prefix?: string | undefined | undefined;
289
- property?: string | undefined | undefined;
290
- rel?: string | undefined | undefined;
291
- resource?: string | undefined | undefined;
292
- rev?: string | undefined | undefined;
293
- typeof?: string | undefined | undefined;
294
- vocab?: string | undefined | undefined;
295
- autoCorrect?: string | undefined | undefined;
296
- autoSave?: string | undefined | undefined;
297
- itemProp?: string | undefined | undefined;
298
- itemScope?: boolean | undefined | undefined;
299
- itemType?: string | undefined | undefined;
300
- itemID?: string | undefined | undefined;
301
- itemRef?: string | undefined | undefined;
302
- results?: number | undefined | undefined;
303
- security?: string | undefined | undefined;
304
- unselectable?: "on" | "off" | undefined | undefined;
305
- popover?: "" | "auto" | "manual" | "hint" | undefined | undefined;
306
- popoverTargetAction?: "toggle" | "show" | "hide" | undefined | undefined;
307
- popoverTarget?: string | undefined | undefined;
308
- inert?: boolean | undefined | undefined;
309
- inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined | undefined;
310
- is?: string | undefined | undefined;
311
- exportparts?: string | undefined | undefined;
312
- href: string | undefined;
313
- className: string;
314
- }, HTMLDivElement>;
42
+ export declare function Row({ lead, leadIcon, title, meta, body, end, endValue, endCaption, lg, done, as, href, more, open, defaultOpen, onOpenChange, className, children, ...rest }: RowProps): import("react").JSX.Element;
315
43
  export interface RowsProps extends ComponentProps<'div'> {
316
44
  }
317
45
  /** Rows — a list of Rows separated by hairlines. */
package/dist/lists/Row.js CHANGED
@@ -6,10 +6,17 @@ import { Icon } from '../type/Icon.js';
6
6
  * Row — a frameless row inside a card: lead · title + meta · end. 48px+ tall, a tap target.
7
7
  * Several go in Rows (hairlines between). A row that IS a card is `Card row`.
8
8
  * `done` is the checklist's finished line: ticked, muted, not tappable any more.
9
+ * `more` makes it expand: the row is the summary of a `<details class="row-expand">`, `more` comes out under it; `open` + `onOpenChange`, or `defaultOpen`.
10
+ * An `end` chevron turns when it is open — the app fetches whatever `more` lists; the row only shows it.
9
11
  */
10
- export function Row({ lead, leadIcon, title, meta, body, end, endValue, endCaption, lg, done, as, href, className, children, ...rest }) {
11
- const el = as ?? (href ? 'a' : 'div');
12
- return createElement(el, { href, className: cx('row', lg && 'row--lg', done && 'row--done', className), 'aria-disabled': done || undefined, ...rest }, leadIcon ? _jsx("span", { className: "row__lead", children: _jsx(Icon, { name: leadIcon }) }) : lead, (title != null || meta != null || body != null) && (_jsxs("div", { className: "row__body", children: [title != null && _jsx("span", { className: "row__title", children: title }), meta != null && _jsx("span", { className: "row__meta", children: meta }), body] })), children, (endValue != null || endCaption != null) && (_jsxs("span", { className: "row__end", children: [endValue != null && _jsx("span", { className: "t-title", children: endValue }), endCaption != null && _jsx("span", { className: "t-caption t-muted", children: endCaption })] })), end, done && _jsx("span", { className: "row__done", children: _jsx(Icon, { name: "check", size: "sm" }) }));
12
+ export function Row({ lead, leadIcon, title, meta, body, end, endValue, endCaption, lg, done, as, href, more, open, defaultOpen, onOpenChange, className, children, ...rest }) {
13
+ const el = more !== undefined ? 'summary' : as ?? (href ? 'a' : 'div');
14
+ const row = createElement(el, { href, className: cx('row', lg && 'row--lg', done && 'row--done', className), 'aria-disabled': done || undefined, ...(more === undefined ? rest : {}) }, leadIcon ? _jsx("span", { className: "row__lead", children: _jsx(Icon, { name: leadIcon }) }) : lead, (title != null || meta != null || body != null) && (_jsxs("div", { className: "row__body", children: [title != null && _jsx("span", { className: "row__title", children: title }), meta != null && _jsx("span", { className: "row__meta", children: meta }), body] })), children, (endValue != null || endCaption != null) && (_jsxs("span", { className: "row__end", children: [endValue != null && _jsx("span", { className: "t-title", children: endValue }), endCaption != null && _jsx("span", { className: "t-caption t-muted", children: endCaption })] })), end, done && _jsx("span", { className: "row__done", children: _jsx(Icon, { name: "check", size: "sm" }) }));
15
+ if (more === undefined)
16
+ return row;
17
+ return (_jsxs("details", { className: "row-expand", open: open ?? defaultOpen, ...rest, onToggle: (e) => { const is = e.currentTarget.open; if (open !== undefined && is !== open)
18
+ e.currentTarget.open = open; if (is !== (open ?? !is))
19
+ onOpenChange?.(is); }, children: [row, _jsx("div", { className: "row-expand__more", children: more })] }));
13
20
  }
14
21
  /** Rows — a list of Rows separated by hairlines. */
15
22
  export function Rows({ className, ...rest }) {
@@ -3,22 +3,32 @@ export interface PostcardProps extends ComponentProps<'div'> {
3
3
  /** the photo on the front; none = the wireframe box */
4
4
  photo?: string | null;
5
5
  alt?: string;
6
- /** whose card it is — printed on both faces */
6
+ /** whose card it is — the big line of the band */
7
7
  name: ReactNode;
8
+ /** the line under the name (a place, a date, a one-liner) */
9
+ line?: ReactNode;
8
10
  /** the words on the back */
9
11
  caption?: ReactNode;
12
+ /** a voice note instead of words: the control to hear it, at the middle of the back — the APP plays it (an `IconBtn` with its `onClick`) */
13
+ voice?: ReactNode;
10
14
  /** CONTROLLED: the back is showing. The app owns it — pair it with `onFlip`. */
11
15
  flipped?: boolean;
12
16
  /** UNCONTROLLED: start turned over; the card then keeps its own side */
13
17
  defaultFlipped?: boolean;
14
18
  /** a face was tapped: the side it asks to show */
15
19
  onFlip?: (flipped: boolean) => void;
20
+ /** the heart in the band: the member's own like (the app owns it — the list of who liked comes from the app's data, shown OUTSIDE the card) */
21
+ liked?: boolean;
22
+ /** the heart was tapped: the state it asks for. No `liked` and no `onLike` = no heart */
23
+ onLike?: (liked: boolean) => void;
24
+ likeLabel?: string;
16
25
  frontLabel?: string;
17
26
  backLabel?: string;
18
27
  }
19
28
  /**
20
- * Postcard — a member's introduction as a card in the hand: the photo (or the wireframe box) with the name in front,
21
- * the caption on the back; a tap on either face turns it over (`--motion-flip`). Which side shows is a state: `flipped` + `onFlip`, or `defaultFlipped`.
22
- * A voice note, a like, a reply go OUTSIDE it, in a Row under it — a face is a button and holds no button.
29
+ * Postcard — a member's introduction, the shape of a cover card: the photo fills it (or the wireframe box), the band at the
30
+ * bottom holds the name, its line and the heart, and turns WITH the face; a tap on the photo turns it over (`--motion-flip`) to the back: the name a fifth down the paper, its line and the caption after it — or, for a voice note, `voice` (the play control) at the middle; the app plays it.
31
+ * Which side shows is a state: `flipped` + `onFlip`, or `defaultFlipped`. The heart is the member's own like: `liked` + `onLike`.
32
+ * Who else liked it, a voice note, a reply go OUTSIDE it — a Row under it (`Row more` expands the list).
23
33
  */
24
- export declare function Postcard({ photo, alt, name, caption, flipped, defaultFlipped, onFlip, frontLabel, backLabel, className, ...rest }: PostcardProps): import("react").JSX.Element;
34
+ export declare function Postcard({ photo, alt, name, line, caption, voice, flipped, defaultFlipped, onFlip, liked, onLike, likeLabel, frontLabel, backLabel, className, ...rest }: PostcardProps): import("react").JSX.Element;
@@ -1,15 +1,18 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
3
  import { cx } from '../cx.js';
4
+ import { IconBtn } from '../actions/IconBtn.js';
4
5
  /**
5
- * Postcard — a member's introduction as a card in the hand: the photo (or the wireframe box) with the name in front,
6
- * the caption on the back; a tap on either face turns it over (`--motion-flip`). Which side shows is a state: `flipped` + `onFlip`, or `defaultFlipped`.
7
- * A voice note, a like, a reply go OUTSIDE it, in a Row under it — a face is a button and holds no button.
6
+ * Postcard — a member's introduction, the shape of a cover card: the photo fills it (or the wireframe box), the band at the
7
+ * bottom holds the name, its line and the heart, and turns WITH the face; a tap on the photo turns it over (`--motion-flip`) to the back: the name a fifth down the paper, its line and the caption after it — or, for a voice note, `voice` (the play control) at the middle; the app plays it.
8
+ * Which side shows is a state: `flipped` + `onFlip`, or `defaultFlipped`. The heart is the member's own like: `liked` + `onLike`.
9
+ * Who else liked it, a voice note, a reply go OUTSIDE it — a Row under it (`Row more` expands the list).
8
10
  */
9
- export function Postcard({ photo, alt = '', name, caption, flipped, defaultFlipped = false, onFlip, frontLabel = 'พลิกดูด้านหลัง', backLabel = 'พลิกดูด้านหน้า', className, ...rest }) {
11
+ export function Postcard({ photo, alt = '', name, line, caption, voice, flipped, defaultFlipped = false, onFlip, liked, onLike, likeLabel = 'ถูกใจ', frontLabel = 'พลิกดูด้านหลัง', backLabel = 'พลิกดูด้านหน้า', className, ...rest }) {
10
12
  const [inner, setInner] = useState(defaultFlipped);
11
13
  const back = flipped ?? inner;
12
14
  const turn = () => { if (flipped === undefined)
13
15
  setInner(!back); onFlip?.(!back); };
14
- return (_jsxs("div", { className: cx('postcard', back && 'is-flipped', className), ...rest, children: [_jsxs("button", { className: "postcard__face postcard__front", type: "button", "aria-label": frontLabel, onClick: turn, children: [photo ? _jsx("img", { src: photo, alt: alt }) : alt ? _jsx("div", { className: "ph", role: "img", "aria-label": alt }) : _jsx("div", { className: "ph" }), _jsx("span", { className: "postcard__label", children: name })] }), _jsxs("button", { className: "postcard__face postcard__back", type: "button", "aria-label": backLabel, onClick: turn, children: [caption != null && _jsx("p", { className: "postcard__caption", children: caption }), _jsx("span", { className: "postcard__label", children: name })] })] }));
16
+ const words = (_jsxs("div", { className: "postcard__words", children: [_jsx("span", { className: "t-h1", children: name }), line != null && _jsx("span", { className: "t-body", children: line })] }));
17
+ return (_jsxs("div", { className: cx('postcard', back && 'is-flipped', className), ...rest, children: [_jsxs("div", { className: "postcard__face postcard__front", children: [_jsx("button", { className: "postcard__turn", type: "button", "aria-label": frontLabel, onClick: turn, children: photo ? _jsx("img", { src: photo, alt: alt }) : alt ? _jsx("div", { className: "ph", role: "img", "aria-label": alt }) : _jsx("div", { className: "ph" }) }), _jsxs("div", { className: "postcard__band", children: [words, (liked !== undefined || onLike) && _jsx(IconBtn, { invert: true, icon: "heart", label: likeLabel, "aria-pressed": !!liked, onClick: () => onLike?.(!liked) })] })] }), _jsxs("div", { className: "postcard__face postcard__back", children: [_jsxs("button", { className: "postcard__turn", type: "button", "aria-label": backLabel, onClick: turn, children: [words, caption != null && _jsx("p", { className: "postcard__caption", children: caption })] }), voice != null && _jsx("div", { className: "postcard__voice", children: voice })] })] }));
15
18
  }
@@ -0,0 +1,9 @@
1
+ import type { ComponentProps } from 'react';
2
+ export interface ProgressProps extends ComponentProps<'div'> {
3
+ /** the done share, 0–1 */
4
+ at: number;
5
+ /** accessible name */
6
+ label?: string;
7
+ }
8
+ /** Progress — one straight line: the done share solid, the rest faint. A voice note's timeline, a download; the app keeps the value. */
9
+ export declare function Progress({ at, label, className, style, ...rest }: ProgressProps): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cx } from '../cx.js';
3
+ /** Progress — one straight line: the done share solid, the rest faint. A voice note's timeline, a download; the app keeps the value. */
4
+ export function Progress({ at, label, className, style, ...rest }) {
5
+ const v = Math.min(1, Math.max(0, at));
6
+ return _jsx("div", { className: cx('progress', className), role: "progressbar", "aria-label": label, "aria-valuemin": 0, "aria-valuemax": 1, "aria-valuenow": v, style: { ...style, '--progress-at': v }, ...rest });
7
+ }
@@ -1,13 +1,13 @@
1
1
  import { type ComponentProps, type ReactNode } from 'react';
2
2
  export interface ModalProps extends ComponentProps<'article'> {
3
3
  /** CONTROLLED: on the screen or not (default `true`). The app owns it. Set it `false` and the modal leaves the way it came — its
4
- * opening played backwards — then calls `onClosed`, where the app stops rendering it (and its `SheetStage ask`). */
4
+ * opening played backwards — then calls `onClosed`, where the app stops rendering it (and its `SheetStage dim`). */
5
5
  open?: boolean;
6
6
  /** the leaving has finished (at once, when motion is reduced) — unmount here */
7
7
  onClosed?: () => void;
8
8
  }
9
9
  /**
10
- * Modal — the ask: ONE card at the centre of a `SheetStage ask`, two parts — a `Lift` (the thing being asked about, light, scrolls
10
+ * Modal — the ask: ONE card at the centre of a `SheetStage dim`, two parts — a `Lift` (the thing being asked about, light, scrolls
11
11
  * when tall) and a `Drawer` (the dark end that asks). No border. Two beats on appearing: drops in from above, then the drawer comes
12
12
  * out below while the lift moves up.
13
13
  * A COMPONENT, not a wiring: it does not know its buttons. They are plain `IconBtn`s / `Btn`s with the app's `onClick` — the app
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Children, Fragment, useEffect, useRef } from 'react';
3
3
  import { cx } from '../cx.js';
4
4
  /**
5
- * Modal — the ask: ONE card at the centre of a `SheetStage ask`, two parts — a `Lift` (the thing being asked about, light, scrolls
5
+ * Modal — the ask: ONE card at the centre of a `SheetStage dim`, two parts — a `Lift` (the thing being asked about, light, scrolls
6
6
  * when tall) and a `Drawer` (the dark end that asks). No border. Two beats on appearing: drops in from above, then the drawer comes
7
7
  * out below while the lift moves up.
8
8
  * A COMPONENT, not a wiring: it does not know its buttons. They are plain `IconBtn`s / `Btn`s with the app's `onClick` — the app
@@ -16,8 +16,6 @@ export interface SheetProps extends Omit<ComponentProps<'article'>, 'onChange'>
16
16
  onStateChange?: (state: SheetState, reason: SheetChangeReason) => void;
17
17
  /** the states a drag snaps to and a reveal may climb through — "peek half full", or an array (default all four) */
18
18
  states?: string | readonly Resting[];
19
- /** floats above a footnote strip on a dim stage (bottom corners and border back) */
20
- raised?: boolean;
21
19
  /** the grab handle; `false` for a sheet with no handle, a string sets its accessible name */
22
20
  handle?: boolean | string;
23
21
  }
@@ -33,5 +31,5 @@ export interface SheetProps extends Omit<ComponentProps<'article'>, 'onChange'>
33
31
  * a drag snaps to the nearest of `states`, focus in a peeked sheet raises it, and when the cut moves (the keyboard) it
34
32
  * climbs until the focused control has room above the foot.
35
33
  */
36
- export declare function Sheet({ state, defaultState, onStateChange, states, raised, handle, className, children, onFocus, ...rest }: SheetProps): import("react").JSX.Element;
34
+ export declare function Sheet({ state, defaultState, onStateChange, states, handle, className, children, onFocus, ...rest }: SheetProps): import("react").JSX.Element;
37
35
  export {};
@@ -15,7 +15,7 @@ const TAP_REM = 0.5; // = --sp-2: a move shorter than this is a tap, not a drag
15
15
  * a drag snaps to the nearest of `states`, focus in a peeked sheet raises it, and when the cut moves (the keyboard) it
16
16
  * climbs until the focused control has room above the foot.
17
17
  */
18
- export function Sheet({ state, defaultState = 'half', onStateChange, states, raised, handle = true, className, children, onFocus, ...rest }) {
18
+ export function Sheet({ state, defaultState = 'half', onStateChange, states, handle = true, className, children, onFocus, ...rest }) {
19
19
  const [inner, setInner] = useState(defaultState);
20
20
  const current = state ?? inner;
21
21
  const controlled = state !== undefined;
@@ -158,5 +158,5 @@ export function Sheet({ state, defaultState = 'half', onStateChange, states, rai
158
158
  skipClick.current = true;
159
159
  requestAnimationFrame(() => { skipClick.current = false; });
160
160
  };
161
- return (_jsxs("article", { ref: ref, className: cx('card sheet', `sheet--${current}`, raised && 'sheet--raised', className), inert: current === 'away' || undefined, onFocus: focus, ...rest, children: [handle !== false && (_jsx("button", { ref: handleRef, className: "sheet__handle", type: "button", "aria-label": typeof handle === 'string' ? handle : 'Resize', onClick: tap, onPointerDown: down, onPointerMove: move, onPointerUp: up, onPointerCancel: up })), children] }));
161
+ return (_jsxs("article", { ref: ref, className: cx('card sheet', `sheet--${current}`, className), inert: current === 'away' || undefined, onFocus: focus, ...rest, children: [handle !== false && (_jsx("button", { ref: handleRef, className: "sheet__handle", type: "button", "aria-label": typeof handle === 'string' ? handle : 'Resize', onClick: tap, onPointerDown: down, onPointerMove: move, onPointerUp: up, onPointerCancel: up })), children] }));
162
162
  }
@@ -7,7 +7,7 @@ export interface SheetStackProps extends ComponentProps<'div'> {
7
7
  open?: number | null;
8
8
  /** UNCONTROLLED: the sheet open on arrival (default none); the stack then keeps its own */
9
9
  defaultOpen?: number | null;
10
- /** the stack ASKS: a peeked head was tapped (its index), or the open sheet's `CardBack` (`null`) */
10
+ /** the stack ASKS: a peeked head was tapped (its index), or the open sheet's `StackBack` (`null`) */
11
11
  onOpenChange?: (open: number | null) => void;
12
12
  /** wider peeks so more of each title shows (display stacks) */
13
13
  fanned?: boolean;
@@ -20,14 +20,14 @@ export interface SheetStackProps extends ComponentProps<'div'> {
20
20
  * SheetStack — the MENU: sheets stacked like paper at the middle of the home screen, every one a main section.
21
21
  * Children are Cards, direct children only, at most five: first = the back of the stack, last = the front (open) sheet.
22
22
  * Every sheet is the stack's full height; a peek is the strip the next sheet doesn't cover. A stack head is a CardHead
23
- * with CHILDREN, in this order: `<CardBack />` (tap mode), `<Text level="h2" caps>Shopping</Text>`, an `<IconRow>` of Icons —
23
+ * with CHILDREN, in this order: `<StackBack />` (tap mode), `<Text level="h2" caps>Shopping</Text>`, an `<IconRow>` of Icons —
24
24
  * never the `heading` prop (it wraps the h2 in a div; the stack's one-line peek needs the bare h2). Put it last in a `Screen fill`, it bleeds
25
25
  * off the bottom. `closed`: nothing open on arrival — every head peeks at the bottom and the base above shows `base` (a home screen
26
26
  * with a picture over the menu); the `base` slot is rendered after the sheets, so it never takes a sheet's slot. This is the sheet STACK; a single bottom sheet is `Sheet`.
27
27
  *
28
28
  * A COMPONENT, not a wiring: WHICH sheet is open is the app's (`open` + `onOpenChange`, or `defaultOpen`) — so a button anywhere, a route or
29
29
  * the phone's back button can open and close a section. Its own behaviour stays inside and only asks: a tap on a peeked head, the open
30
- * sheet's CardBack. How the sheets MOVE is its own too: sheets are rigid — the tapped one slides up, the ones after it leave below, the ones
30
+ * sheet's StackBack. How the sheets MOVE is its own too: sheets are rigid — the tapped one slides up, the ones after it leave below, the ones
31
31
  * before tuck under nearest-first; closing reverses in two beats. Only `translate` (stack.css); it sets classes, never a size.
32
32
  */
33
33
  export declare function SheetStack({ mode, open, defaultOpen, onOpenChange, fanned, closed, base, className, children, onClick, ...rest }: SheetStackProps): import("react").JSX.Element;
@@ -12,14 +12,14 @@ const sheetsOf = (stack) => [...stack.children]
12
12
  * SheetStack — the MENU: sheets stacked like paper at the middle of the home screen, every one a main section.
13
13
  * Children are Cards, direct children only, at most five: first = the back of the stack, last = the front (open) sheet.
14
14
  * Every sheet is the stack's full height; a peek is the strip the next sheet doesn't cover. A stack head is a CardHead
15
- * with CHILDREN, in this order: `<CardBack />` (tap mode), `<Text level="h2" caps>Shopping</Text>`, an `<IconRow>` of Icons —
15
+ * with CHILDREN, in this order: `<StackBack />` (tap mode), `<Text level="h2" caps>Shopping</Text>`, an `<IconRow>` of Icons —
16
16
  * never the `heading` prop (it wraps the h2 in a div; the stack's one-line peek needs the bare h2). Put it last in a `Screen fill`, it bleeds
17
17
  * off the bottom. `closed`: nothing open on arrival — every head peeks at the bottom and the base above shows `base` (a home screen
18
18
  * with a picture over the menu); the `base` slot is rendered after the sheets, so it never takes a sheet's slot. This is the sheet STACK; a single bottom sheet is `Sheet`.
19
19
  *
20
20
  * A COMPONENT, not a wiring: WHICH sheet is open is the app's (`open` + `onOpenChange`, or `defaultOpen`) — so a button anywhere, a route or
21
21
  * the phone's back button can open and close a section. Its own behaviour stays inside and only asks: a tap on a peeked head, the open
22
- * sheet's CardBack. How the sheets MOVE is its own too: sheets are rigid — the tapped one slides up, the ones after it leave below, the ones
22
+ * sheet's StackBack. How the sheets MOVE is its own too: sheets are rigid — the tapped one slides up, the ones after it leave below, the ones
23
23
  * before tuck under nearest-first; closing reverses in two beats. Only `translate` (stack.css); it sets classes, never a size.
24
24
  */
25
25
  export function SheetStack({ mode = 'tap', open, defaultOpen = null, onOpenChange, fanned, closed, base, className, children, onClick, ...rest }) {
@@ -75,7 +75,7 @@ export function SheetStack({ mode = 'tap', open, defaultOpen = null, onOpenChang
75
75
  const target = e.target;
76
76
  const sheets = sheetsOf(stack);
77
77
  const at = sheets.findIndex((c) => c.contains(target)); // the sheet the tap landed in — not the nearest .card: a content card inside an open sheet must not count
78
- if (target.closest('.card__back')) {
78
+ if (target.closest('.sheet-stack__back')) {
79
79
  request(null);
80
80
  return;
81
81
  }
@@ -6,15 +6,13 @@ export interface SheetStageProps extends ComponentProps<'div'> {
6
6
  hero?: ReactNode;
7
7
  /** blur and darken the background (the dim page sheet) */
8
8
  dim?: boolean;
9
- /** the ask stage: the page under a scrim, one Modal (Lift + Drawer) at the centre */
10
- ask?: boolean;
11
- /** a footnote strip on the scrim under a raised sheet */
9
+ /** a footnote strip at the stage's bottom, on the scrim */
12
10
  foot?: ReactNode;
13
11
  }
14
12
  /**
15
13
  * SheetStage — a page-level overlay stage, its own 100dvh page: a Sheet over a map (or over a `hero` — one
16
14
  * thing centred in the band a half sheet leaves open), the dim page sheet
17
- * (`dim` + `Sheet raised`), the ask drawer (`ask` + Lift + Drawer). Full stops under the top bar's line.
15
+ * (`dim` + a `Modal`), the ask (`dim` + a `Modal`, which centres itself — or a Modal on a clean ground, no `dim`). Full stops under the top bar's line.
18
16
  * NEVER inside a Step — an app screen where the member acts is a Step.
19
17
  */
20
- export declare function SheetStage({ bg, hero, dim, ask, foot, className, children, ...rest }: SheetStageProps): import("react").JSX.Element;
18
+ export declare function SheetStage({ bg, hero, dim, foot, className, children, ...rest }: SheetStageProps): import("react").JSX.Element;
@@ -3,9 +3,9 @@ import { cx } from '../cx.js';
3
3
  /**
4
4
  * SheetStage — a page-level overlay stage, its own 100dvh page: a Sheet over a map (or over a `hero` — one
5
5
  * thing centred in the band a half sheet leaves open), the dim page sheet
6
- * (`dim` + `Sheet raised`), the ask drawer (`ask` + Lift + Drawer). Full stops under the top bar's line.
6
+ * (`dim` + a `Modal`), the ask (`dim` + a `Modal`, which centres itself — or a Modal on a clean ground, no `dim`). Full stops under the top bar's line.
7
7
  * NEVER inside a Step — an app screen where the member acts is a Step.
8
8
  */
9
- export function SheetStage({ bg, hero, dim, ask, foot, className, children, ...rest }) {
10
- return (_jsxs("div", { className: cx('sheet-stage', dim && 'sheet-stage--dim', ask && 'sheet-stage--ask', className), ...rest, children: [bg != null && _jsx("div", { className: "sheet-stage__bg", children: bg }), hero != null && _jsx("div", { className: "sheet-stage__hero", children: hero }), children, foot != null && _jsx("p", { className: "sheet-stage__foot", children: foot })] }));
9
+ export function SheetStage({ bg, hero, dim, foot, className, children, ...rest }) {
10
+ return (_jsxs("div", { className: cx('sheet-stage', dim && 'sheet-stage--dim', className), ...rest, children: [bg != null && _jsx("div", { className: "sheet-stage__bg", children: bg }), hero != null && _jsx("div", { className: "sheet-stage__hero", children: hero }), children, foot != null && _jsx("p", { className: "sheet-stage__foot", children: foot })] }));
11
11
  }
@@ -0,0 +1,7 @@
1
+ import type { ComponentProps } from 'react';
2
+ export interface StackBackProps extends ComponentProps<'button'> {
3
+ /** accessible name */
4
+ label?: string;
5
+ }
6
+ /** StackBack — the back button a tapped stack sheet reveals in its head; first child of that sheet's CardHead. Hidden until the sheet is open. */
7
+ export declare function StackBack({ label, className, ...rest }: StackBackProps): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cx } from '../cx.js';
3
+ import { Icon } from '../type/Icon.js';
4
+ /** StackBack — the back button a tapped stack sheet reveals in its head; first child of that sheet's CardHead. Hidden until the sheet is open. */
5
+ export function StackBack({ label = 'Back', className, ...rest }) {
6
+ return (_jsx("button", { type: "button", className: cx('icon-btn icon-btn--sm sheet-stack__back', className), "aria-label": label, ...rest, children: _jsx(Icon, { name: "arrow-left" }) }));
7
+ }