@usableapp/cardds 0.3.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.
Files changed (103) hide show
  1. package/README.md +12 -8
  2. package/css/actions.css +38 -27
  3. package/css/base.css +9 -9
  4. package/css/card.css +24 -23
  5. package/css/choice.css +50 -50
  6. package/css/forms.css +18 -18
  7. package/css/journey.css +16 -16
  8. package/css/layover.css +57 -60
  9. package/css/lists.css +52 -43
  10. package/css/media.css +96 -60
  11. package/css/numbers.css +41 -25
  12. package/css/people.css +11 -11
  13. package/css/sheet.css +28 -24
  14. package/css/stack.css +3 -3
  15. package/css/theme.template.css +6 -3
  16. package/dist/actions/Btn.d.ts +109 -108
  17. package/dist/actions/BtnRow.d.ts +2 -2
  18. package/dist/actions/Chip.d.ts +102 -101
  19. package/dist/actions/Dot.d.ts +2 -2
  20. package/dist/actions/Dropdown.d.ts +4 -4
  21. package/dist/actions/Fab.d.ts +2 -2
  22. package/dist/actions/IconBtn.d.ts +107 -106
  23. package/dist/actions/Link.d.ts +105 -104
  24. package/dist/actions/Segment.d.ts +3 -3
  25. package/dist/cardds.css +443 -369
  26. package/dist/cards/Card.d.ts +99 -98
  27. package/dist/cards/CardFoot.d.ts +2 -2
  28. package/dist/cards/CardHead.d.ts +2 -2
  29. package/dist/cards/CardParts.d.ts +7 -7
  30. package/dist/cards/Placeholder.d.ts +2 -2
  31. package/dist/cards/Stat.d.ts +7 -5
  32. package/dist/cards/Stat.js +2 -2
  33. package/dist/choice/Calendar.d.ts +2 -2
  34. package/dist/choice/Check.d.ts +3 -3
  35. package/dist/choice/DayStrip.d.ts +3 -3
  36. package/dist/choice/Mood.d.ts +2 -2
  37. package/dist/choice/Slider.d.ts +2 -2
  38. package/dist/forms/AddRow.d.ts +2 -2
  39. package/dist/forms/Composer.d.ts +2 -2
  40. package/dist/forms/Field.d.ts +2 -2
  41. package/dist/forms/FileBtn.d.ts +2 -2
  42. package/dist/forms/Pin.d.ts +2 -2
  43. package/dist/index.d.ts +2 -1
  44. package/dist/index.js +2 -1
  45. package/dist/journey/NoteRow.d.ts +2 -2
  46. package/dist/journey/Route.d.ts +2 -2
  47. package/dist/journey/TileBadge.d.ts +2 -2
  48. package/dist/layover/Banner.d.ts +2 -2
  49. package/dist/layover/Callout.d.ts +2 -2
  50. package/dist/layover/Deck.d.ts +3 -3
  51. package/dist/lists/Bubble.d.ts +3 -3
  52. package/dist/lists/Kv.d.ts +5 -5
  53. package/dist/lists/Legend.d.ts +3 -3
  54. package/dist/lists/Row.d.ts +14 -285
  55. package/dist/lists/Row.js +10 -3
  56. package/dist/lists/Timeline.d.ts +3 -3
  57. package/dist/media/MapArea.d.ts +2 -2
  58. package/dist/media/Mosaic.d.ts +3 -3
  59. package/dist/media/Postcard.d.ts +17 -7
  60. package/dist/media/Postcard.js +8 -5
  61. package/dist/media/Quote.d.ts +2 -2
  62. package/dist/media/Tile.d.ts +5 -4
  63. package/dist/numbers/Badge.d.ts +2 -2
  64. package/dist/numbers/Band.d.ts +3 -3
  65. package/dist/numbers/Bars.d.ts +3 -3
  66. package/dist/numbers/DotGrid.d.ts +2 -2
  67. package/dist/numbers/Picker.d.ts +3 -3
  68. package/dist/numbers/Progress.d.ts +9 -0
  69. package/dist/numbers/Progress.js +7 -0
  70. package/dist/numbers/Ring.d.ts +2 -2
  71. package/dist/numbers/Track.d.ts +3 -3
  72. package/dist/people/Avatar.d.ts +100 -99
  73. package/dist/people/AvatarPick.d.ts +3 -3
  74. package/dist/scaffold/ActionBar.d.ts +3 -3
  75. package/dist/scaffold/AppBar.d.ts +2 -2
  76. package/dist/scaffold/BaseContent.d.ts +3 -3
  77. package/dist/scaffold/Centre.d.ts +3 -3
  78. package/dist/scaffold/EmptyState.d.ts +2 -2
  79. package/dist/scaffold/FilterRow.d.ts +2 -2
  80. package/dist/scaffold/FloatBar.d.ts +105 -104
  81. package/dist/scaffold/PagerAt.d.ts +2 -2
  82. package/dist/scaffold/Screen.d.ts +100 -99
  83. package/dist/scaffold/TopBar.d.ts +2 -2
  84. package/dist/sheets/Drawer.d.ts +7 -7
  85. package/dist/sheets/Drawer.js +1 -1
  86. package/dist/sheets/Sheet.d.ts +3 -5
  87. package/dist/sheets/Sheet.js +2 -2
  88. package/dist/sheets/SheetBody.d.ts +2 -2
  89. package/dist/sheets/SheetHead.d.ts +2 -2
  90. package/dist/sheets/SheetStack.d.ts +5 -5
  91. package/dist/sheets/SheetStack.js +3 -3
  92. package/dist/sheets/SheetStage.d.ts +5 -7
  93. package/dist/sheets/SheetStage.js +3 -3
  94. package/dist/sheets/StackBack.d.ts +7 -0
  95. package/dist/sheets/StackBack.js +7 -0
  96. package/dist/sheets/Step.d.ts +2 -2
  97. package/dist/type/Icon.d.ts +22 -7
  98. package/dist/type/Icon.js +27 -4
  99. package/dist/type/Text.d.ts +7 -1
  100. package/dist/type/Text.js +2 -2
  101. package/package.json +3 -2
  102. package/dist/sheets/CardBack.d.ts +0 -7
  103. package/dist/sheets/CardBack.js +0 -7
@@ -1,6 +1,6 @@
1
- import { type ComponentPropsWithoutRef, type ReactNode } from 'react';
1
+ import { type ComponentProps, type ReactNode } from 'react';
2
2
  import { type IconName } from '../type/Icon.js';
3
- export interface RowProps extends Omit<ComponentPropsWithoutRef<'div'>, 'title'> {
3
+ export interface RowProps extends Omit<ComponentProps<'div'>, 'title'> {
4
4
  /** the leading visual: an Avatar, an AvatarStack, an Icon */
5
5
  lead?: ReactNode;
6
6
  /** an icon in the outlined 48px lead box (menu rows) */
@@ -23,295 +23,24 @@ export interface RowProps extends Omit<ComponentPropsWithoutRef<'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
- key?: import("react").Key | null | undefined;
268
- defaultChecked?: boolean | undefined | undefined;
269
- defaultValue?: string | number | readonly string[] | undefined;
270
- suppressContentEditableWarning?: boolean | undefined | undefined;
271
- accessKey?: string | undefined | undefined;
272
- autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}) | undefined;
273
- autoFocus?: boolean | undefined | undefined;
274
- contentEditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
275
- contextMenu?: string | undefined | undefined;
276
- dir?: string | undefined | undefined;
277
- draggable?: (boolean | "true" | "false") | undefined;
278
- enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
279
- hidden?: boolean | undefined | undefined;
280
- spellCheck?: (boolean | "true" | "false") | undefined;
281
- translate?: "yes" | "no" | undefined | undefined;
282
- radioGroup?: string | undefined | undefined;
283
- about?: string | undefined | undefined;
284
- content?: string | undefined | undefined;
285
- datatype?: string | undefined | undefined;
286
- inlist?: any;
287
- prefix?: string | undefined | undefined;
288
- property?: string | undefined | undefined;
289
- rel?: string | undefined | undefined;
290
- resource?: string | undefined | undefined;
291
- rev?: string | undefined | undefined;
292
- typeof?: string | undefined | undefined;
293
- vocab?: string | undefined | undefined;
294
- autoCorrect?: string | undefined | undefined;
295
- autoSave?: string | undefined | undefined;
296
- itemProp?: string | undefined | undefined;
297
- itemScope?: boolean | undefined | undefined;
298
- itemType?: string | undefined | undefined;
299
- itemID?: string | undefined | undefined;
300
- itemRef?: string | undefined | undefined;
301
- results?: number | undefined | undefined;
302
- security?: string | undefined | undefined;
303
- unselectable?: "on" | "off" | undefined | undefined;
304
- popover?: "" | "auto" | "manual" | "hint" | undefined | undefined;
305
- popoverTargetAction?: "toggle" | "show" | "hide" | undefined | undefined;
306
- popoverTarget?: string | undefined | undefined;
307
- inert?: boolean | undefined | undefined;
308
- inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined | undefined;
309
- is?: string | undefined | undefined;
310
- exportparts?: string | undefined | undefined;
311
- href: string | undefined;
312
- className: string;
313
- }, HTMLElement>;
314
- export interface RowsProps extends ComponentPropsWithoutRef<'div'> {
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;
43
+ export interface RowsProps extends ComponentProps<'div'> {
315
44
  }
316
45
  /** Rows — a list of Rows separated by hairlines. */
317
46
  export declare function Rows({ className, ...rest }: RowsProps): import("react").JSX.Element;
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 }) {
@@ -1,9 +1,9 @@
1
- import type { ComponentPropsWithoutRef, ReactNode } from 'react';
2
- export interface TimelineProps extends ComponentPropsWithoutRef<'ol'> {
1
+ import type { ComponentProps, ReactNode } from 'react';
2
+ export interface TimelineProps extends ComponentProps<'ol'> {
3
3
  }
4
4
  /** Timeline — a hairline with accent dots, date marks and entries to the right; children are TimelineItems. */
5
5
  export declare function Timeline({ className, ...rest }: TimelineProps): import("react").JSX.Element;
6
- export interface TimelineItemProps extends ComponentPropsWithoutRef<'li'> {
6
+ export interface TimelineItemProps extends ComponentProps<'li'> {
7
7
  /** the date chip ("Wed 14") */
8
8
  mark: ReactNode;
9
9
  }
@@ -1,5 +1,5 @@
1
- import type { ComponentPropsWithoutRef, ReactNode, Ref } from 'react';
2
- export interface MapAreaProps extends ComponentPropsWithoutRef<'div'> {
1
+ import type { ComponentProps, ReactNode, Ref } from 'react';
2
+ export interface MapAreaProps extends ComponentProps<'div'> {
3
3
  /** the words over the map, under the bar's line */
4
4
  hint?: ReactNode;
5
5
  /** the tile provider's credit, bottom right (OSM requires it) — a caption, never the engine's own control */
@@ -1,10 +1,10 @@
1
- import type { ComponentPropsWithoutRef } from 'react';
2
- export interface MosaicProps extends ComponentPropsWithoutRef<'div'> {
1
+ import type { ComponentProps } from 'react';
2
+ export interface MosaicProps extends ComponentProps<'div'> {
3
3
  label?: string;
4
4
  }
5
5
  /** Mosaic — one big photo + two small in a card (three Placeholders or imgs). */
6
6
  export declare function Mosaic({ label, className, ...rest }: MosaicProps): import("react").JSX.Element;
7
- export interface WaveProps extends ComponentPropsWithoutRef<'span'> {
7
+ export interface WaveProps extends ComponentProps<'span'> {
8
8
  label?: string;
9
9
  }
10
10
  /** Wave — the waveform stand-in for a voice note, filling a Row's body. */
@@ -1,24 +1,34 @@
1
- import { type ComponentPropsWithoutRef, type ReactNode } from 'react';
2
- export interface PostcardProps extends ComponentPropsWithoutRef<'div'> {
1
+ import { type ComponentProps, type ReactNode } from 'react';
2
+ 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
  }
@@ -1,5 +1,5 @@
1
- import type { ComponentPropsWithoutRef, ReactNode } from 'react';
2
- export interface QuoteProps extends ComponentPropsWithoutRef<'blockquote'> {
1
+ import type { ComponentProps, ReactNode } from 'react';
2
+ export interface QuoteProps extends ComponentProps<'blockquote'> {
3
3
  /** the words */
4
4
  text: ReactNode;
5
5
  /** the attribution */
@@ -1,13 +1,13 @@
1
- import { type ComponentPropsWithoutRef, type ReactNode } from 'react';
1
+ import { type ComponentProps, type ReactNode } from 'react';
2
2
  import { type IconName } from '../type/Icon.js';
3
- export interface TileGridProps extends ComponentPropsWithoutRef<'div'> {
3
+ export interface TileGridProps extends ComponentProps<'div'> {
4
4
  /** three across on a phone (attachments, upload kinds) */
5
5
  cols3?: boolean;
6
6
  bleed?: boolean;
7
7
  }
8
8
  /** TileGrid — big square Tiles in a responsive grid. */
9
9
  export declare function TileGrid({ cols3, bleed, className, ...rest }: TileGridProps): import("react").JSX.Element;
10
- export interface TileProps extends Omit<ComponentPropsWithoutRef<'div'>, 'onChange'> {
10
+ export interface TileProps extends Omit<ComponentProps<'div'>, 'onChange'> {
11
11
  /** the icon at the top */
12
12
  icon?: IconName;
13
13
  /** the label at the bottom */
@@ -272,6 +272,7 @@ export declare function Tile({ icon, label, value, sub, pick, type, name, checke
272
272
  onTransitionRunCapture?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
273
273
  onTransitionStart?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
274
274
  onTransitionStartCapture?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
275
+ ref?: import("react").Ref<HTMLDivElement> | undefined;
275
276
  key?: import("react").Key | null | undefined;
276
277
  defaultValue?: string | number | readonly string[] | undefined;
277
278
  suppressContentEditableWarning?: boolean | undefined | undefined;
@@ -317,4 +318,4 @@ export declare function Tile({ icon, label, value, sub, pick, type, name, checke
317
318
  exportparts?: string | undefined | undefined;
318
319
  type: string | undefined;
319
320
  className: string;
320
- }, HTMLElement>;
321
+ }, HTMLDivElement>;
@@ -1,5 +1,5 @@
1
- import type { ComponentPropsWithoutRef } from 'react';
2
- export interface BadgeProps extends ComponentPropsWithoutRef<'span'> {
1
+ import type { ComponentProps } from 'react';
2
+ export interface BadgeProps extends ComponentProps<'span'> {
3
3
  /** tinted instead of accent */
4
4
  soft?: boolean;
5
5
  }
@@ -1,5 +1,5 @@
1
- import type { ComponentPropsWithoutRef, ReactNode } from 'react';
2
- export interface BandProps extends ComponentPropsWithoutRef<'article'> {
1
+ import type { ComponentProps, ReactNode } from 'react';
2
+ export interface BandProps extends ComponentProps<'article'> {
3
3
  /** the two-line label (use a `<br />` to break it) */
4
4
  label: ReactNode;
5
5
  /** the giant number; wrap a unit in `<small>` */
@@ -10,7 +10,7 @@ export interface BandProps extends ComponentPropsWithoutRef<'article'> {
10
10
  }
11
11
  /** Band — a data card: 2-line label · giant number · footnote. Stack several in a BandStack for one boundary with hairlines. */
12
12
  export declare function Band({ label, num, foot, tone, className, ...rest }: BandProps): import("react").JSX.Element;
13
- export interface BandStackProps extends ComponentPropsWithoutRef<'div'> {
13
+ export interface BandStackProps extends ComponentProps<'div'> {
14
14
  }
15
15
  /** BandStack — several Bands as ONE card boundary, a hairline between each. */
16
16
  export declare function BandStack({ className, ...rest }: BandStackProps): import("react").JSX.Element;
@@ -1,11 +1,11 @@
1
- import type { ComponentPropsWithoutRef } from 'react';
2
- export interface BarsProps extends ComponentPropsWithoutRef<'div'> {
1
+ import type { ComponentProps } from 'react';
2
+ export interface BarsProps extends ComponentProps<'div'> {
3
3
  /** the value of the tallest bar */
4
4
  max: number;
5
5
  }
6
6
  /** Bars — three or four bars with a count on top, the glance chart; children are Bar. */
7
7
  export declare function Bars({ max, className, style, ...rest }: BarsProps): import("react").JSX.Element;
8
- export interface BarProps extends ComponentPropsWithoutRef<'div'> {
8
+ export interface BarProps extends ComponentProps<'div'> {
9
9
  value: number;
10
10
  /** the highlighted bar (accent, its count in a pill) */
11
11
  on?: boolean;
@@ -1,5 +1,5 @@
1
- import type { ComponentPropsWithoutRef } from 'react';
2
- export interface DotGridProps extends ComponentPropsWithoutRef<'div'> {
1
+ import type { ComponentProps } from 'react';
2
+ export interface DotGridProps extends ComponentProps<'div'> {
3
3
  /** how many dots */
4
4
  total: number;
5
5
  /** how many are done (filled, from the top-left) */
@@ -1,5 +1,5 @@
1
- import { type ComponentPropsWithoutRef, type ReactNode } from 'react';
2
- export interface PickerProps extends Omit<ComponentPropsWithoutRef<'div'>, 'onChange' | 'defaultValue'> {
1
+ import { type ComponentProps, type ReactNode } from 'react';
2
+ export interface PickerProps extends Omit<ComponentProps<'div'>, 'onChange' | 'defaultValue'> {
3
3
  /** CONTROLLED: the chosen PickerItem's `value`. The app owns it — pair it with `onChange`. */
4
4
  value?: string;
5
5
  /** UNCONTROLLED: the value it starts on; the picker then keeps its own */
@@ -17,7 +17,7 @@ export interface PickerProps extends Omit<ComponentPropsWithoutRef<'div'>, 'onCh
17
17
  * settled in the centre. The CSS lights the centred item by scroll position; the app never reads the DOM to know what was picked.
18
18
  */
19
19
  export declare function Picker({ value, defaultValue, onChange, unit, label, className, children, ...rest }: PickerProps): import("react").JSX.Element;
20
- export interface PickerItemProps extends Omit<ComponentPropsWithoutRef<'button'>, 'value'> {
20
+ export interface PickerItemProps extends Omit<ComponentProps<'button'>, 'value'> {
21
21
  /** what choosing this item reports; default = its own text */
22
22
  value?: string;
23
23
  }
@@ -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,5 +1,5 @@
1
- import type { ComponentPropsWithoutRef, ReactNode } from 'react';
2
- export interface RingProps extends ComponentPropsWithoutRef<'div'> {
1
+ import type { ComponentProps, ReactNode } from 'react';
2
+ export interface RingProps extends ComponentProps<'div'> {
3
3
  /** 0–100 */
4
4
  value: number;
5
5
  /** sm = an avatar-xl ring · xs = an inline counter in a head (2/3) */