@usableapp/cardds 0.1.0

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 (170) hide show
  1. package/README.md +562 -0
  2. package/cardds.css +18 -0
  3. package/cardds.js +473 -0
  4. package/css/actions.css +292 -0
  5. package/css/base.css +128 -0
  6. package/css/card.css +283 -0
  7. package/css/choice.css +297 -0
  8. package/css/fonts.css +37 -0
  9. package/css/forms.css +64 -0
  10. package/css/journey.css +61 -0
  11. package/css/layover.css +243 -0
  12. package/css/lists.css +142 -0
  13. package/css/media.css +232 -0
  14. package/css/numbers.css +258 -0
  15. package/css/palette.css +112 -0
  16. package/css/people.css +79 -0
  17. package/css/sheet.css +295 -0
  18. package/css/stack.css +262 -0
  19. package/css/step.css +71 -0
  20. package/css/tokens.css +177 -0
  21. package/dist/actions/Btn.d.ts +311 -0
  22. package/dist/actions/Btn.js +14 -0
  23. package/dist/actions/BtnRow.d.ts +5 -0
  24. package/dist/actions/BtnRow.js +6 -0
  25. package/dist/actions/Chip.d.ts +328 -0
  26. package/dist/actions/Chip.js +25 -0
  27. package/dist/actions/Dot.d.ts +7 -0
  28. package/dist/actions/Dot.js +6 -0
  29. package/dist/actions/Dropdown.d.ts +34 -0
  30. package/dist/actions/Dropdown.js +19 -0
  31. package/dist/actions/Fab.d.ts +9 -0
  32. package/dist/actions/Fab.js +7 -0
  33. package/dist/actions/IconBtn.d.ts +308 -0
  34. package/dist/actions/IconBtn.js +8 -0
  35. package/dist/actions/Link.d.ts +301 -0
  36. package/dist/actions/Link.js +8 -0
  37. package/dist/actions/Segment.d.ts +11 -0
  38. package/dist/actions/Segment.js +10 -0
  39. package/dist/cardds.css +3068 -0
  40. package/dist/cards/Card.d.ts +310 -0
  41. package/dist/cards/Card.js +14 -0
  42. package/dist/cards/CardFoot.d.ts +5 -0
  43. package/dist/cards/CardFoot.js +6 -0
  44. package/dist/cards/CardHead.d.ts +21 -0
  45. package/dist/cards/CardHead.js +11 -0
  46. package/dist/cards/CardParts.d.ts +25 -0
  47. package/dist/cards/CardParts.js +26 -0
  48. package/dist/cards/Placeholder.d.ts +9 -0
  49. package/dist/cards/Placeholder.js +6 -0
  50. package/dist/cards/Stat.d.ts +17 -0
  51. package/dist/cards/Stat.js +14 -0
  52. package/dist/choice/Calendar.d.ts +23 -0
  53. package/dist/choice/Calendar.js +7 -0
  54. package/dist/choice/Check.d.ts +14 -0
  55. package/dist/choice/Check.js +10 -0
  56. package/dist/choice/DayStrip.d.ts +16 -0
  57. package/dist/choice/DayStrip.js +10 -0
  58. package/dist/choice/Mood.d.ts +11 -0
  59. package/dist/choice/Mood.js +6 -0
  60. package/dist/choice/Slider.d.ts +11 -0
  61. package/dist/choice/Slider.js +14 -0
  62. package/dist/cx.d.ts +2 -0
  63. package/dist/cx.js +2 -0
  64. package/dist/forms/AddRow.d.ts +5 -0
  65. package/dist/forms/AddRow.js +7 -0
  66. package/dist/forms/Composer.d.ts +13 -0
  67. package/dist/forms/Composer.js +6 -0
  68. package/dist/forms/Field.d.ts +17 -0
  69. package/dist/forms/Field.js +10 -0
  70. package/dist/forms/FileBtn.d.ts +18 -0
  71. package/dist/forms/FileBtn.js +10 -0
  72. package/dist/forms/Pin.d.ts +19 -0
  73. package/dist/forms/Pin.js +27 -0
  74. package/dist/index.d.ts +72 -0
  75. package/dist/index.js +75 -0
  76. package/dist/journey/NoteRow.d.ts +7 -0
  77. package/dist/journey/NoteRow.js +7 -0
  78. package/dist/journey/Route.d.ts +18 -0
  79. package/dist/journey/Route.js +8 -0
  80. package/dist/journey/TileBadge.d.ts +15 -0
  81. package/dist/journey/TileBadge.js +6 -0
  82. package/dist/layover/Banner.d.ts +9 -0
  83. package/dist/layover/Banner.js +6 -0
  84. package/dist/layover/Callout.d.ts +10 -0
  85. package/dist/layover/Callout.js +6 -0
  86. package/dist/layover/Deck.d.ts +9 -0
  87. package/dist/layover/Deck.js +10 -0
  88. package/dist/lists/Kv.d.ts +27 -0
  89. package/dist/lists/Kv.js +19 -0
  90. package/dist/lists/Legend.d.ts +11 -0
  91. package/dist/lists/Legend.js +11 -0
  92. package/dist/lists/Row.d.ts +319 -0
  93. package/dist/lists/Row.js +17 -0
  94. package/dist/lists/Timeline.d.ts +11 -0
  95. package/dist/lists/Timeline.js +10 -0
  96. package/dist/media/MapArea.d.ts +20 -0
  97. package/dist/media/MapArea.js +11 -0
  98. package/dist/media/Mosaic.d.ts +11 -0
  99. package/dist/media/Mosaic.js +10 -0
  100. package/dist/media/Postcard.d.ts +20 -0
  101. package/dist/media/Postcard.js +10 -0
  102. package/dist/media/Quote.d.ts +11 -0
  103. package/dist/media/Quote.js +6 -0
  104. package/dist/media/Tile.d.ts +320 -0
  105. package/dist/media/Tile.js +16 -0
  106. package/dist/numbers/Badge.d.ts +7 -0
  107. package/dist/numbers/Badge.js +6 -0
  108. package/dist/numbers/Band.d.ts +16 -0
  109. package/dist/numbers/Band.js +10 -0
  110. package/dist/numbers/Bars.d.ts +14 -0
  111. package/dist/numbers/Bars.js +10 -0
  112. package/dist/numbers/DotGrid.d.ts +12 -0
  113. package/dist/numbers/DotGrid.js +6 -0
  114. package/dist/numbers/Picker.d.ts +13 -0
  115. package/dist/numbers/Picker.js +18 -0
  116. package/dist/numbers/Ring.d.ts +15 -0
  117. package/dist/numbers/Ring.js +6 -0
  118. package/dist/numbers/Track.d.ts +12 -0
  119. package/dist/numbers/Track.js +10 -0
  120. package/dist/people/Avatar.d.ts +314 -0
  121. package/dist/people/Avatar.js +13 -0
  122. package/dist/people/AvatarPick.d.ts +18 -0
  123. package/dist/people/AvatarPick.js +10 -0
  124. package/dist/scaffold/ActionBar.d.ts +21 -0
  125. package/dist/scaffold/ActionBar.js +16 -0
  126. package/dist/scaffold/AppBar.d.ts +18 -0
  127. package/dist/scaffold/AppBar.js +10 -0
  128. package/dist/scaffold/Centre.d.ts +30 -0
  129. package/dist/scaffold/Centre.js +41 -0
  130. package/dist/scaffold/EmptyState.d.ts +14 -0
  131. package/dist/scaffold/EmptyState.js +8 -0
  132. package/dist/scaffold/FilterRow.d.ts +5 -0
  133. package/dist/scaffold/FilterRow.js +6 -0
  134. package/dist/scaffold/FloatBar.d.ts +310 -0
  135. package/dist/scaffold/FloatBar.js +15 -0
  136. package/dist/scaffold/PagerAt.d.ts +11 -0
  137. package/dist/scaffold/PagerAt.js +6 -0
  138. package/dist/scaffold/Screen.d.ts +299 -0
  139. package/dist/scaffold/Screen.js +11 -0
  140. package/dist/scaffold/Section.d.ts +12 -0
  141. package/dist/scaffold/Section.js +13 -0
  142. package/dist/scaffold/TopBar.d.ts +15 -0
  143. package/dist/scaffold/TopBar.js +9 -0
  144. package/dist/sheets/CardBack.d.ts +7 -0
  145. package/dist/sheets/CardBack.js +7 -0
  146. package/dist/sheets/Drawer.d.ts +17 -0
  147. package/dist/sheets/Drawer.js +16 -0
  148. package/dist/sheets/Sheet.d.ts +21 -0
  149. package/dist/sheets/Sheet.js +13 -0
  150. package/dist/sheets/SheetBody.d.ts +5 -0
  151. package/dist/sheets/SheetBody.js +6 -0
  152. package/dist/sheets/SheetHead.d.ts +13 -0
  153. package/dist/sheets/SheetHead.js +6 -0
  154. package/dist/sheets/SheetStack.d.ts +21 -0
  155. package/dist/sheets/SheetStack.js +14 -0
  156. package/dist/sheets/SheetStage.d.ts +20 -0
  157. package/dist/sheets/SheetStage.js +11 -0
  158. package/dist/sheets/Step.d.ts +15 -0
  159. package/dist/sheets/Step.js +15 -0
  160. package/dist/type/Icon.d.ts +16 -0
  161. package/dist/type/Icon.js +12 -0
  162. package/dist/type/Text.d.ts +302 -0
  163. package/dist/type/Text.js +16 -0
  164. package/dist/type/icons.d.ts +6 -0
  165. package/dist/type/icons.js +2 -0
  166. package/fonts/LICENSES.md +44 -0
  167. package/fonts/fc-pride-medium.otf +0 -0
  168. package/fonts/pk-nonthaburi-demo.ttf +0 -0
  169. package/icons.svg +61 -0
  170. package/package.json +62 -0
package/css/tokens.css ADDED
@@ -0,0 +1,177 @@
1
+ /* ============================================================
2
+ cardds/tokens.css — structural tokens + WIREFRAME color defaults
3
+ Colors here are grayscale on purpose. Real color = palette.css.
4
+ Components reference ONLY these role tokens, never raw hex.
5
+
6
+ Every length is rem so the whole system scales with the root
7
+ font size (base.css steps it down on narrow phones and it follows
8
+ the user's text-size setting). Only borders, rules and focus
9
+ rings stay in px — they must stay crisp, not scale.
10
+ 4pt grid: 1rem = 16px → --sp-1 = 4px.
11
+ ============================================================ */
12
+
13
+ :root {
14
+ /* ---- layout ---- */
15
+ --screen-w: 25rem; /* 400: mobile column — .screen, .action-bar, .sheet-stage */
16
+ --screen-centre: 40%; /* the human centre of a screen: the middle of its top four fifths — the bottom fifth is the thumb's (Lh, 2026-09-10). .card--centre sits here */
17
+
18
+ /* ---- spacing (4pt grid) ---- */
19
+ --sp-0: 0.125rem; /* 2 hairline gaps (title→meta) */
20
+ --sp-1: 0.25rem; /* 4 */
21
+ --sp-2: 0.5rem; /* 8 */
22
+ --sp-3: 0.75rem; /* 12 */
23
+ --sp-4: 1rem; /* 16 */
24
+ --sp-5: 1.25rem; /* 20 */
25
+ --sp-6: 1.5rem; /* 24 */
26
+ --sp-8: 2rem; /* 32 */
27
+ --sp-10: 2.5rem; /* 40 */
28
+ --sp-12: 3rem; /* 48 */
29
+
30
+ /* ---- touch & control sizes ---- */
31
+ --tap: 3rem; /* 48 primary touch target */
32
+ --tap-sm: 2.75rem; /* 44 minimum touch target (Apple HIG floor) */
33
+ --tap-lg: 3.5rem; /* 56 hero controls: track steps, send, field with action */
34
+ --btn-h: 3.25rem; /* 52 button height */
35
+ --btn-xl-h: 5.5rem; /* 88 the one giant CTA */
36
+ --chip-h: 2.375rem; /* 38 chip height */
37
+ --bar-h: 4rem; /* 64 float bar, day cell, deck actions */
38
+ --header-h: 3.75rem;/* 60 top bar — .topbar and .appbar alike */
39
+ --screen-pad: var(--sp-4); /* 16 the screen's inset — .sheet-stack cancels it */
40
+ --map-ring: 10rem; /* the rough-area ring on a map (sheet.css .map__ring) — a neighbourhood, not a house */
41
+ --fab: 4.5rem; /* 72 square floating action */
42
+ --badge: 1.625rem; /* 26 count badge */
43
+ --dot: 0.625rem; /* 10 signal dot */
44
+ --dot-xs: 0.375rem; /* 6 marker dot */
45
+
46
+ /* ---- icons (icons.svg sprite, Lucide) ---- */
47
+ --icon: 1.75rem; /* 28 default */
48
+ --icon-sm: 1.75rem; /* one size everywhere; retune if small contexts appear */
49
+ --icon-lg: 2rem; /* 32 empty states */
50
+ --icon-xs: 1rem; /* 16 inline with captions/chips only (row meta, link arrows) */
51
+
52
+ /* ---- people & big elements ---- */
53
+ --avatar-sm: 2.5rem; /* 40 row lead */
54
+ --avatar: 3.5rem; /* 56 card head, person row */
55
+ --avatar-lg: 5rem; /* 80 chooser row */
56
+ --avatar-xl: 6rem; /* 96 sheet head icon ring */
57
+ --ring: 11rem; /* 176 .ring gauge diameter */
58
+ --ring-w: 1.375rem; /* 22 .ring stroke */
59
+ --tile-min: 7.5rem; /* 120 .tile-grid column floor */
60
+ --tile-h: 8.25rem; /* 132 tile / band height */
61
+
62
+ /* ---- radius ---- */
63
+ --r-chip: 999px; /* pills, chips, buttons — always fully round */
64
+ --r-card: 2rem; /* 32 the one card radius: every card, row, tile, menu, sheet, fab */
65
+ --r-media: 1rem; /* 16 images inside cards */
66
+ --r-control: 0.875rem; /* 14 fields, thumbs, menu rows */
67
+ --r-badge: 0.625rem; /* 10 tile badge, bars */
68
+
69
+ /* ---- borders / rules / elevation (px on purpose: crisp at any scale) ---- */
70
+ --border-w: 1.5px;
71
+ --rule-w: 2px; /* dotted connectors, picker rules */
72
+ --focus: 2px solid currentColor; /* :focus-visible ring */
73
+ --shadow-card: 0 1px 2px rgb(0 0 0 / 0.06), 0 0.5rem 1.5rem rgb(0 0 0 / 0.08);
74
+ --shadow-float: 0 0.25rem 0.75rem rgb(0 0 0 / 0.14);
75
+ --shadow-sheet: 0 -0.5rem 2rem rgb(0 0 0 / 0.16); /* sheets, lifted cards */
76
+
77
+ /* ---- motion ---- */
78
+ --motion-sheet: 0.35s;
79
+ --motion-slide: 0.22s; /* a centred card sliding out and the next in (card.css) — quick, a page turn (Lh, 2026-09-12) */
80
+ --motion-flip: 0.45s; /* a postcard turning over (media.css) — slow enough to read as a card in the hand */
81
+
82
+ /* ---- typography: one scale, rem so it follows the root ---- */
83
+ --font-ui: "PK Nonthaburi", -apple-system, system-ui, sans-serif; /* fonts.css ships it; the rest is the fallback while it loads */
84
+ --font-display: "FC Pride", var(--font-ui); /* the character face for headings and big numbers (fonts.css) */
85
+ --font-mono: "SF Mono", "JetBrains Mono", ui-monospace, monospace;
86
+
87
+ --fs-xs: 0.6875rem; /* 11 overline */
88
+ --fs-caption: 0.75rem; /* 12 */
89
+ --fs-label: 0.8125rem; /* 13 */
90
+ --fs-sm: 0.875rem; /* 14 chips, segments */
91
+ --fs-body: 0.9375rem; /* 15 */
92
+ --fs-md: 1rem; /* 16 buttons */
93
+ --fs-title: 1.0625rem; /* 17 */
94
+ --fs-lg: 1.25rem; /* 20 day numbers, tile values */
95
+ --fs-h2: 1.375rem; /* 22 */
96
+ --fs-2xl: 1.5rem; /* 24 composer, small ring */
97
+ --fs-h1: 1.75rem; /* 28 */
98
+ --fs-3xl: 2rem; /* 32 xl button */
99
+ --fs-display: clamp(2.125rem, 9vw, 2.625rem); /* 34–42 */
100
+ --fs-stat: clamp(1.875rem, 8vw, 2.375rem); /* 30–38 big numbers */
101
+ --fs-hero: 3.5rem; /* 56 the one number on a sheet */
102
+ --fs-giant: clamp(3rem, 15vw, 4rem); /* 48–64 data bands */
103
+
104
+ /* level weight size / line-height family */
105
+ --type-display: 800 var(--fs-display) / 1.15 var(--font-display); /* leading: Thai marks stack to 1.1em up and 0.3em down in FC Pride — 1.02 clipped them (2026-09-10) */
106
+ --track-display: -0.02em;
107
+ --type-h1: 900 var(--fs-h1) / 1.2 var(--font-display);
108
+ --track-h1: -0.015em;
109
+ --type-h2: 700 var(--fs-h2) / 1.25 var(--font-display);
110
+ --track-h2: -0.01em;
111
+ --type-title: 650 var(--fs-title) / 1.3 var(--font-ui);
112
+ --type-body: 400 var(--fs-body) / 1.5 var(--font-ui);
113
+ --type-label: 600 var(--fs-label) / 1.2 var(--font-ui); /* chips, buttons */
114
+ --type-caption: 500 var(--fs-caption) / 1.35 var(--font-ui);
115
+ --type-overline:700 var(--fs-xs) / 1.2 var(--font-mono); /* uppercase micro-labels */
116
+ --track-overline: 0.08em;
117
+ --type-stat: 800 var(--fs-stat) / 1.05 var(--font-display); /* big numbers */
118
+
119
+ /* ============================================================
120
+ COLOR ROLES — wireframe defaults (grayscale).
121
+ palette.css overrides these under [data-palette="…"].
122
+ ============================================================ */
123
+
124
+ /* app background ("earth-toned surface or shiny color, up to the app") */
125
+ --surface: #f2f2f0;
126
+ --on-surface: #141414;
127
+ --on-surface-muted: #6b6b6b;
128
+
129
+ /* card boundaries — 3 slots so stacked/adjacent cards can differ */
130
+ --card-1-bg: #ffffff; --card-1-ink: #141414;
131
+ --card-2-bg: #e6e6e3; --card-2-ink: #141414;
132
+ --card-3-bg: #141414; --card-3-ink: #ffffff;
133
+
134
+ --card-border: #141414; /* wireframe: visible outline; palettes may set transparent */
135
+ --card-muted: #6b6b6b; /* secondary text inside cards (the default, tone-1 card) */
136
+ --card-2-muted: #5f5f5f; /* the same text on the tone-2 card — 5.1:1 on its grey (#6b6b6b is 4.3:1, under AA);
137
+ a palette whose tone-2 ground is strong
138
+ sets this to its tone-2 ink — a muted shade cannot reach AA there (clay) */
139
+
140
+ /* actions */
141
+ --accent: #141414; /* primary CTA fill */
142
+ --on-accent: #ffffff;
143
+ --action-bg: #ffffff; /* neutral buttons/chips/inputs */
144
+ --action-ink: #141414;
145
+ --action-border: #141414;
146
+
147
+ /* signals (chip dots, deltas) */
148
+ --pos: #8a8a8a;
149
+ --neg: #3d3d3d;
150
+ --dot-a: #141414;
151
+ --dot-b: #8a8a8a;
152
+
153
+ /* derived tints — read the element's own ink, so they work on any slot */
154
+ --outline: var(--action-border); /* control edges (palette.css softens) */
155
+ --hairline: color-mix(in srgb, currentColor 18%, transparent); /* dividers inside cards */
156
+ --ink-tint: color-mix(in srgb, currentColor 12%, transparent); /* hover, rails, rests */
157
+ --ink-rail: color-mix(in srgb, currentColor 30%, transparent); /* todo steps, ghost edges */
158
+ --accent-soft: color-mix(in srgb, var(--accent) 22%, transparent); /* calendar marks */
159
+ --accent-mid: color-mix(in srgb, var(--accent) 50%, transparent);
160
+ --scrim: color-mix(in srgb, var(--card-3-bg) 50%, transparent); /* dim stage, cover gradient */
161
+ }
162
+
163
+ /* ============================================================
164
+ REGISTERED TOKENS — the two sheet lengths are typed, so that
165
+ cardds.js can read them back RESOLVED: getComputedStyle returns a
166
+ registered <length> in px and a <number> as a number, where an
167
+ unregistered custom property only ever reads back as its text
168
+ ("calc(1.25rem + …)"). Drag-to-snap needs to know where the states
169
+ are; nothing else in the system reads a token from JS.
170
+ --sheet-half is a share of the sheet's own height (0.5 = half), a
171
+ number rather than a percentage so one token can serve both the
172
+ sheet's translate (× 100%) and its body's scroll-padding (× 100cqh).
173
+ sheet.css sets the values; these initial values are what a sheet
174
+ falls back to when its own declaration cannot resolve.
175
+ ============================================================ */
176
+ @property --sheet-peek { syntax: "<length>"; inherits: true; initial-value: 0px; }
177
+ @property --sheet-half { syntax: "<number>"; inherits: true; initial-value: 0.5; }
@@ -0,0 +1,311 @@
1
+ import { type ComponentPropsWithoutRef } from 'react';
2
+ export interface BtnProps extends ComponentPropsWithoutRef<'button'> {
3
+ /** the filled accent button — the one forward move */
4
+ primary?: boolean;
5
+ /** ink on whatever it sits on, a faint outline */
6
+ quiet?: boolean;
7
+ /** full width */
8
+ block?: boolean;
9
+ /** the one giant call to action in a tinted card ("Taxi!") */
10
+ xl?: boolean;
11
+ /** a link styled as a button */
12
+ href?: string;
13
+ }
14
+ /**
15
+ * Btn — the pill button (48px+ tall). Plain by default; `primary` for the one move; `quiet` on tinted cards.
16
+ * In a CardFoot up to four share the line; in an ActionBar it takes the width. An Icon xs may lead or trail the label.
17
+ */
18
+ export declare function Btn({ primary, quiet, block, xl, href, className, type, ...rest }: BtnProps): import("react").DetailedReactHTMLElement<{
19
+ form?: string | undefined | undefined;
20
+ slot?: string | undefined | undefined;
21
+ style?: import("react").CSSProperties | undefined;
22
+ title?: string | undefined | undefined;
23
+ suppressHydrationWarning?: boolean | undefined | undefined;
24
+ color?: string | undefined | undefined;
25
+ id?: string | undefined | undefined;
26
+ lang?: string | undefined | undefined;
27
+ name?: string | undefined | undefined;
28
+ nonce?: string | undefined | undefined;
29
+ part?: string | undefined | undefined;
30
+ role?: import("react").AriaRole | undefined;
31
+ tabIndex?: number | undefined | undefined;
32
+ "aria-activedescendant"?: string | undefined | undefined;
33
+ "aria-atomic"?: (boolean | "true" | "false") | undefined;
34
+ "aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined | undefined;
35
+ "aria-braillelabel"?: string | undefined | undefined;
36
+ "aria-brailleroledescription"?: string | undefined | undefined;
37
+ "aria-busy"?: (boolean | "true" | "false") | undefined;
38
+ "aria-checked"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
39
+ "aria-colcount"?: number | undefined | undefined;
40
+ "aria-colindex"?: number | undefined | undefined;
41
+ "aria-colindextext"?: string | undefined | undefined;
42
+ "aria-colspan"?: number | undefined | undefined;
43
+ "aria-controls"?: string | undefined | undefined;
44
+ "aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined | undefined;
45
+ "aria-describedby"?: string | undefined | undefined;
46
+ "aria-description"?: string | undefined | undefined;
47
+ "aria-details"?: string | undefined | undefined;
48
+ "aria-disabled"?: (boolean | "true" | "false") | undefined;
49
+ "aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined | undefined;
50
+ "aria-errormessage"?: string | undefined | undefined;
51
+ "aria-expanded"?: (boolean | "true" | "false") | undefined;
52
+ "aria-flowto"?: string | undefined | undefined;
53
+ "aria-grabbed"?: (boolean | "true" | "false") | undefined;
54
+ "aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined | undefined;
55
+ "aria-hidden"?: (boolean | "true" | "false") | undefined;
56
+ "aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined | undefined;
57
+ "aria-keyshortcuts"?: string | undefined | undefined;
58
+ "aria-label"?: string | undefined | undefined;
59
+ "aria-labelledby"?: string | undefined | undefined;
60
+ "aria-level"?: number | undefined | undefined;
61
+ "aria-live"?: "off" | "assertive" | "polite" | undefined | undefined;
62
+ "aria-modal"?: (boolean | "true" | "false") | undefined;
63
+ "aria-multiline"?: (boolean | "true" | "false") | undefined;
64
+ "aria-multiselectable"?: (boolean | "true" | "false") | undefined;
65
+ "aria-orientation"?: "horizontal" | "vertical" | undefined | undefined;
66
+ "aria-owns"?: string | undefined | undefined;
67
+ "aria-placeholder"?: string | undefined | undefined;
68
+ "aria-posinset"?: number | undefined | undefined;
69
+ "aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
70
+ "aria-readonly"?: (boolean | "true" | "false") | undefined;
71
+ "aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined | undefined;
72
+ "aria-required"?: (boolean | "true" | "false") | undefined;
73
+ "aria-roledescription"?: string | undefined | undefined;
74
+ "aria-rowcount"?: number | undefined | undefined;
75
+ "aria-rowindex"?: number | undefined | undefined;
76
+ "aria-rowindextext"?: string | undefined | undefined;
77
+ "aria-rowspan"?: number | undefined | undefined;
78
+ "aria-selected"?: (boolean | "true" | "false") | undefined;
79
+ "aria-setsize"?: number | undefined | undefined;
80
+ "aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined | undefined;
81
+ "aria-valuemax"?: number | undefined | undefined;
82
+ "aria-valuemin"?: number | undefined | undefined;
83
+ "aria-valuenow"?: number | undefined | undefined;
84
+ "aria-valuetext"?: string | undefined | undefined;
85
+ children?: import("react").ReactNode;
86
+ dangerouslySetInnerHTML?: {
87
+ __html: string | TrustedHTML;
88
+ } | undefined | undefined;
89
+ onCopy?: import("react").ClipboardEventHandler<HTMLButtonElement> | undefined;
90
+ onCopyCapture?: import("react").ClipboardEventHandler<HTMLButtonElement> | undefined;
91
+ onCut?: import("react").ClipboardEventHandler<HTMLButtonElement> | undefined;
92
+ onCutCapture?: import("react").ClipboardEventHandler<HTMLButtonElement> | undefined;
93
+ onPaste?: import("react").ClipboardEventHandler<HTMLButtonElement> | undefined;
94
+ onPasteCapture?: import("react").ClipboardEventHandler<HTMLButtonElement> | undefined;
95
+ onCompositionEnd?: import("react").CompositionEventHandler<HTMLButtonElement> | undefined;
96
+ onCompositionEndCapture?: import("react").CompositionEventHandler<HTMLButtonElement> | undefined;
97
+ onCompositionStart?: import("react").CompositionEventHandler<HTMLButtonElement> | undefined;
98
+ onCompositionStartCapture?: import("react").CompositionEventHandler<HTMLButtonElement> | undefined;
99
+ onCompositionUpdate?: import("react").CompositionEventHandler<HTMLButtonElement> | undefined;
100
+ onCompositionUpdateCapture?: import("react").CompositionEventHandler<HTMLButtonElement> | undefined;
101
+ onFocus?: import("react").FocusEventHandler<HTMLButtonElement> | undefined;
102
+ onFocusCapture?: import("react").FocusEventHandler<HTMLButtonElement> | undefined;
103
+ onBlur?: import("react").FocusEventHandler<HTMLButtonElement> | undefined;
104
+ onBlurCapture?: import("react").FocusEventHandler<HTMLButtonElement> | undefined;
105
+ onChange?: import("react").ChangeEventHandler<HTMLButtonElement, Element> | undefined;
106
+ onChangeCapture?: import("react").ChangeEventHandler<HTMLButtonElement, Element> | undefined;
107
+ onBeforeInput?: import("react").InputEventHandler<HTMLButtonElement> | undefined;
108
+ onBeforeInputCapture?: import("react").InputEventHandler<HTMLButtonElement> | undefined;
109
+ onInput?: import("react").InputEventHandler<HTMLButtonElement> | undefined;
110
+ onInputCapture?: import("react").InputEventHandler<HTMLButtonElement> | undefined;
111
+ onReset?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
112
+ onResetCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
113
+ onSubmit?: import("react").SubmitEventHandler<HTMLButtonElement> | undefined;
114
+ onSubmitCapture?: import("react").SubmitEventHandler<HTMLButtonElement> | undefined;
115
+ onInvalid?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
116
+ onInvalidCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
117
+ onLoad?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
118
+ onLoadCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
119
+ onError?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
120
+ onErrorCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
121
+ onKeyDown?: import("react").KeyboardEventHandler<HTMLButtonElement> | undefined;
122
+ onKeyDownCapture?: import("react").KeyboardEventHandler<HTMLButtonElement> | undefined;
123
+ onKeyPress?: import("react").KeyboardEventHandler<HTMLButtonElement> | undefined;
124
+ onKeyPressCapture?: import("react").KeyboardEventHandler<HTMLButtonElement> | undefined;
125
+ onKeyUp?: import("react").KeyboardEventHandler<HTMLButtonElement> | undefined;
126
+ onKeyUpCapture?: import("react").KeyboardEventHandler<HTMLButtonElement> | undefined;
127
+ onAbort?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
128
+ onAbortCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
129
+ onCanPlay?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
130
+ onCanPlayCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
131
+ onCanPlayThrough?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
132
+ onCanPlayThroughCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
133
+ onDurationChange?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
134
+ onDurationChangeCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
135
+ onEmptied?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
136
+ onEmptiedCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
137
+ onEncrypted?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
138
+ onEncryptedCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
139
+ onEnded?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
140
+ onEndedCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
141
+ onLoadedData?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
142
+ onLoadedDataCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
143
+ onLoadedMetadata?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
144
+ onLoadedMetadataCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
145
+ onLoadStart?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
146
+ onLoadStartCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
147
+ onPause?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
148
+ onPauseCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
149
+ onPlay?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
150
+ onPlayCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
151
+ onPlaying?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
152
+ onPlayingCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
153
+ onProgress?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
154
+ onProgressCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
155
+ onRateChange?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
156
+ onRateChangeCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
157
+ onSeeked?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
158
+ onSeekedCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
159
+ onSeeking?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
160
+ onSeekingCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
161
+ onStalled?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
162
+ onStalledCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
163
+ onSuspend?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
164
+ onSuspendCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
165
+ onTimeUpdate?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
166
+ onTimeUpdateCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
167
+ onVolumeChange?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
168
+ onVolumeChangeCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
169
+ onWaiting?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
170
+ onWaitingCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
171
+ onAuxClick?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
172
+ onAuxClickCapture?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
173
+ onClick?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
174
+ onClickCapture?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
175
+ onContextMenu?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
176
+ onContextMenuCapture?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
177
+ onDoubleClick?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
178
+ onDoubleClickCapture?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
179
+ onDrag?: import("react").DragEventHandler<HTMLButtonElement> | undefined;
180
+ onDragCapture?: import("react").DragEventHandler<HTMLButtonElement> | undefined;
181
+ onDragEnd?: import("react").DragEventHandler<HTMLButtonElement> | undefined;
182
+ onDragEndCapture?: import("react").DragEventHandler<HTMLButtonElement> | undefined;
183
+ onDragEnter?: import("react").DragEventHandler<HTMLButtonElement> | undefined;
184
+ onDragEnterCapture?: import("react").DragEventHandler<HTMLButtonElement> | undefined;
185
+ onDragExit?: import("react").DragEventHandler<HTMLButtonElement> | undefined;
186
+ onDragExitCapture?: import("react").DragEventHandler<HTMLButtonElement> | undefined;
187
+ onDragLeave?: import("react").DragEventHandler<HTMLButtonElement> | undefined;
188
+ onDragLeaveCapture?: import("react").DragEventHandler<HTMLButtonElement> | undefined;
189
+ onDragOver?: import("react").DragEventHandler<HTMLButtonElement> | undefined;
190
+ onDragOverCapture?: import("react").DragEventHandler<HTMLButtonElement> | undefined;
191
+ onDragStart?: import("react").DragEventHandler<HTMLButtonElement> | undefined;
192
+ onDragStartCapture?: import("react").DragEventHandler<HTMLButtonElement> | undefined;
193
+ onDrop?: import("react").DragEventHandler<HTMLButtonElement> | undefined;
194
+ onDropCapture?: import("react").DragEventHandler<HTMLButtonElement> | undefined;
195
+ onMouseDown?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
196
+ onMouseDownCapture?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
197
+ onMouseEnter?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
198
+ onMouseLeave?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
199
+ onMouseMove?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
200
+ onMouseMoveCapture?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
201
+ onMouseOut?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
202
+ onMouseOutCapture?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
203
+ onMouseOver?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
204
+ onMouseOverCapture?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
205
+ onMouseUp?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
206
+ onMouseUpCapture?: import("react").MouseEventHandler<HTMLButtonElement> | undefined;
207
+ onSelect?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
208
+ onSelectCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
209
+ onTouchCancel?: import("react").TouchEventHandler<HTMLButtonElement> | undefined;
210
+ onTouchCancelCapture?: import("react").TouchEventHandler<HTMLButtonElement> | undefined;
211
+ onTouchEnd?: import("react").TouchEventHandler<HTMLButtonElement> | undefined;
212
+ onTouchEndCapture?: import("react").TouchEventHandler<HTMLButtonElement> | undefined;
213
+ onTouchMove?: import("react").TouchEventHandler<HTMLButtonElement> | undefined;
214
+ onTouchMoveCapture?: import("react").TouchEventHandler<HTMLButtonElement> | undefined;
215
+ onTouchStart?: import("react").TouchEventHandler<HTMLButtonElement> | undefined;
216
+ onTouchStartCapture?: import("react").TouchEventHandler<HTMLButtonElement> | undefined;
217
+ onPointerDown?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
218
+ onPointerDownCapture?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
219
+ onPointerMove?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
220
+ onPointerMoveCapture?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
221
+ onPointerUp?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
222
+ onPointerUpCapture?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
223
+ onPointerCancel?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
224
+ onPointerCancelCapture?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
225
+ onPointerEnter?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
226
+ onPointerLeave?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
227
+ onPointerOver?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
228
+ onPointerOverCapture?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
229
+ onPointerOut?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
230
+ onPointerOutCapture?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
231
+ onGotPointerCapture?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
232
+ onGotPointerCaptureCapture?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
233
+ onLostPointerCapture?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
234
+ onLostPointerCaptureCapture?: import("react").PointerEventHandler<HTMLButtonElement> | undefined;
235
+ onScroll?: import("react").UIEventHandler<HTMLButtonElement> | undefined;
236
+ onScrollCapture?: import("react").UIEventHandler<HTMLButtonElement> | undefined;
237
+ onScrollEnd?: import("react").UIEventHandler<HTMLButtonElement> | undefined;
238
+ onScrollEndCapture?: import("react").UIEventHandler<HTMLButtonElement> | undefined;
239
+ onWheel?: import("react").WheelEventHandler<HTMLButtonElement> | undefined;
240
+ onWheelCapture?: import("react").WheelEventHandler<HTMLButtonElement> | undefined;
241
+ onAnimationStart?: import("react").AnimationEventHandler<HTMLButtonElement> | undefined;
242
+ onAnimationStartCapture?: import("react").AnimationEventHandler<HTMLButtonElement> | undefined;
243
+ onAnimationEnd?: import("react").AnimationEventHandler<HTMLButtonElement> | undefined;
244
+ onAnimationEndCapture?: import("react").AnimationEventHandler<HTMLButtonElement> | undefined;
245
+ onAnimationIteration?: import("react").AnimationEventHandler<HTMLButtonElement> | undefined;
246
+ onAnimationIterationCapture?: import("react").AnimationEventHandler<HTMLButtonElement> | undefined;
247
+ onToggle?: import("react").ToggleEventHandler<HTMLButtonElement> | undefined;
248
+ onBeforeToggle?: import("react").ToggleEventHandler<HTMLButtonElement> | undefined;
249
+ onTransitionCancel?: import("react").TransitionEventHandler<HTMLButtonElement> | undefined;
250
+ onTransitionCancelCapture?: import("react").TransitionEventHandler<HTMLButtonElement> | undefined;
251
+ onTransitionEnd?: import("react").TransitionEventHandler<HTMLButtonElement> | undefined;
252
+ onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLButtonElement> | undefined;
253
+ onTransitionRun?: import("react").TransitionEventHandler<HTMLButtonElement> | undefined;
254
+ onTransitionRunCapture?: import("react").TransitionEventHandler<HTMLButtonElement> | undefined;
255
+ onTransitionStart?: import("react").TransitionEventHandler<HTMLButtonElement> | undefined;
256
+ onTransitionStartCapture?: import("react").TransitionEventHandler<HTMLButtonElement> | undefined;
257
+ key?: import("react").Key | null | undefined;
258
+ defaultChecked?: boolean | undefined | undefined;
259
+ defaultValue?: string | number | readonly string[] | undefined;
260
+ suppressContentEditableWarning?: boolean | undefined | undefined;
261
+ accessKey?: string | undefined | undefined;
262
+ autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}) | undefined;
263
+ autoFocus?: boolean | undefined | undefined;
264
+ contentEditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
265
+ contextMenu?: string | undefined | undefined;
266
+ dir?: string | undefined | undefined;
267
+ draggable?: (boolean | "true" | "false") | undefined;
268
+ enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
269
+ hidden?: boolean | undefined | undefined;
270
+ spellCheck?: (boolean | "true" | "false") | undefined;
271
+ translate?: "yes" | "no" | undefined | undefined;
272
+ radioGroup?: string | undefined | undefined;
273
+ about?: string | undefined | undefined;
274
+ content?: string | undefined | undefined;
275
+ datatype?: string | undefined | undefined;
276
+ inlist?: any;
277
+ prefix?: string | undefined | undefined;
278
+ property?: string | undefined | undefined;
279
+ rel?: string | undefined | undefined;
280
+ resource?: string | undefined | undefined;
281
+ rev?: string | undefined | undefined;
282
+ typeof?: string | undefined | undefined;
283
+ vocab?: string | undefined | undefined;
284
+ autoCorrect?: string | undefined | undefined;
285
+ autoSave?: string | undefined | undefined;
286
+ itemProp?: string | undefined | undefined;
287
+ itemScope?: boolean | undefined | undefined;
288
+ itemType?: string | undefined | undefined;
289
+ itemID?: string | undefined | undefined;
290
+ itemRef?: string | undefined | undefined;
291
+ results?: number | undefined | undefined;
292
+ security?: string | undefined | undefined;
293
+ unselectable?: "on" | "off" | undefined | undefined;
294
+ popover?: "" | "auto" | "manual" | "hint" | undefined | undefined;
295
+ popoverTargetAction?: "toggle" | "show" | "hide" | undefined | undefined;
296
+ popoverTarget?: string | undefined | undefined;
297
+ inert?: boolean | undefined | undefined;
298
+ inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined | undefined;
299
+ is?: string | undefined | undefined;
300
+ exportparts?: string | undefined | undefined;
301
+ disabled?: boolean | undefined | undefined;
302
+ formAction?: string | ((formData: FormData) => void | Promise<void>) | undefined;
303
+ formEncType?: string | undefined | undefined;
304
+ formMethod?: string | undefined | undefined;
305
+ formNoValidate?: boolean | undefined | undefined;
306
+ formTarget?: string | undefined | undefined;
307
+ value?: string | number | readonly string[] | undefined;
308
+ href: string | undefined;
309
+ type: "button" | "reset" | "submit" | undefined;
310
+ className: string;
311
+ }, HTMLElement>;
@@ -0,0 +1,14 @@
1
+ import { createElement } from 'react';
2
+ import { cx } from '../cx';
3
+ /**
4
+ * Btn — the pill button (48px+ tall). Plain by default; `primary` for the one move; `quiet` on tinted cards.
5
+ * In a CardFoot up to four share the line; in an ActionBar it takes the width. An Icon xs may lead or trail the label.
6
+ */
7
+ export function Btn({ primary, quiet, block, xl, href, className, type, ...rest }) {
8
+ return createElement(href ? 'a' : 'button', {
9
+ href,
10
+ type: href ? undefined : type ?? 'button',
11
+ className: cx('btn', primary && 'btn--primary', quiet && 'btn--quiet', block && 'btn--block', xl && 'btn--xl', className),
12
+ ...rest,
13
+ });
14
+ }
@@ -0,0 +1,5 @@
1
+ import type { ComponentPropsWithoutRef } from 'react';
2
+ export interface BtnRowProps extends ComponentPropsWithoutRef<'div'> {
3
+ }
4
+ /** BtnRow — twin CTAs inside a card's content sharing the width (Log time · Offer). In a foot use CardFoot instead. */
5
+ export declare function BtnRow({ className, ...rest }: BtnRowProps): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cx } from '../cx';
3
+ /** BtnRow — twin CTAs inside a card's content sharing the width (Log time · Offer). In a foot use CardFoot instead. */
4
+ export function BtnRow({ className, ...rest }) {
5
+ return _jsx("div", { className: cx('btn-row', className), ...rest });
6
+ }