@usableapp/cardds 0.4.0 → 0.4.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/README.md +3 -3
- package/css/layover.css +12 -15
- package/css/lists.css +9 -0
- package/css/media.css +67 -31
- package/css/numbers.css +16 -0
- package/css/sheet.css +8 -4
- package/css/stack.css +3 -3
- package/dist/cardds.css +115 -53
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/lists/Row.d.ts +11 -283
- package/dist/lists/Row.js +10 -3
- package/dist/media/Postcard.d.ts +15 -5
- package/dist/media/Postcard.js +8 -5
- package/dist/numbers/Progress.d.ts +9 -0
- package/dist/numbers/Progress.js +7 -0
- package/dist/sheets/Drawer.d.ts +2 -2
- package/dist/sheets/Drawer.js +1 -1
- package/dist/sheets/Sheet.d.ts +1 -3
- package/dist/sheets/Sheet.js +2 -2
- package/dist/sheets/SheetStack.d.ts +3 -3
- package/dist/sheets/SheetStack.js +3 -3
- package/dist/sheets/SheetStage.d.ts +3 -5
- package/dist/sheets/SheetStage.js +3 -3
- package/dist/sheets/StackBack.d.ts +7 -0
- package/dist/sheets/StackBack.js +7 -0
- package/package.json +1 -1
- package/dist/sheets/CardBack.d.ts +0 -7
- package/dist/sheets/CardBack.js +0 -7
package/dist/index.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export * from './cards/CardParts.js';
|
|
|
20
20
|
export * from './cards/Stat.js';
|
|
21
21
|
export * from './cards/Placeholder.js';
|
|
22
22
|
export * from './sheets/SheetStack.js';
|
|
23
|
-
export * from './sheets/
|
|
23
|
+
export * from './sheets/StackBack.js';
|
|
24
24
|
export * from './sheets/Sheet.js';
|
|
25
25
|
export * from './sheets/SheetHead.js';
|
|
26
26
|
export * from './sheets/SheetBody.js';
|
|
@@ -47,6 +47,7 @@ export * from './choice/Calendar.js';
|
|
|
47
47
|
export * from './choice/Mood.js';
|
|
48
48
|
export * from './choice/Slider.js';
|
|
49
49
|
export * from './numbers/Ring.js';
|
|
50
|
+
export * from './numbers/Progress.js';
|
|
50
51
|
export * from './numbers/Track.js';
|
|
51
52
|
export * from './numbers/Band.js';
|
|
52
53
|
export * from './numbers/DotGrid.js';
|
package/dist/index.js
CHANGED
|
@@ -23,7 +23,7 @@ export * from './cards/CardParts.js';
|
|
|
23
23
|
export * from './cards/Stat.js';
|
|
24
24
|
export * from './cards/Placeholder.js';
|
|
25
25
|
export * from './sheets/SheetStack.js';
|
|
26
|
-
export * from './sheets/
|
|
26
|
+
export * from './sheets/StackBack.js';
|
|
27
27
|
export * from './sheets/Sheet.js';
|
|
28
28
|
export * from './sheets/SheetHead.js';
|
|
29
29
|
export * from './sheets/SheetBody.js';
|
|
@@ -50,6 +50,7 @@ export * from './choice/Calendar.js';
|
|
|
50
50
|
export * from './choice/Mood.js';
|
|
51
51
|
export * from './choice/Slider.js';
|
|
52
52
|
export * from './numbers/Ring.js';
|
|
53
|
+
export * from './numbers/Progress.js';
|
|
53
54
|
export * from './numbers/Track.js';
|
|
54
55
|
export * from './numbers/Band.js';
|
|
55
56
|
export * from './numbers/DotGrid.js';
|
package/dist/lists/Row.d.ts
CHANGED
|
@@ -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").
|
|
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
|
-
|
|
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 }) {
|
package/dist/media/Postcard.d.ts
CHANGED
|
@@ -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 —
|
|
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
|
|
21
|
-
* the
|
|
22
|
-
*
|
|
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;
|
package/dist/media/Postcard.js
CHANGED
|
@@ -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
|
|
6
|
-
* the
|
|
7
|
-
*
|
|
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
|
-
|
|
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
|
+
}
|
package/dist/sheets/Drawer.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
package/dist/sheets/Drawer.js
CHANGED
|
@@ -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
|
|
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
|
package/dist/sheets/Sheet.d.ts
CHANGED
|
@@ -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,
|
|
34
|
+
export declare function Sheet({ state, defaultState, onStateChange, states, handle, className, children, onFocus, ...rest }: SheetProps): import("react").JSX.Element;
|
|
37
35
|
export {};
|
package/dist/sheets/Sheet.js
CHANGED
|
@@ -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,
|
|
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}`,
|
|
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 `
|
|
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: `<
|
|
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
|
|
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: `<
|
|
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
|
|
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('.
|
|
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
|
-
/**
|
|
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` +
|
|
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,
|
|
18
|
+
export declare function SheetStage({ bg, hero, dim, foot, className, children, ...rest }: SheetStageProps): import("react").JSX.Element;
|