@expokit/cli 0.2.0 → 0.3.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 (110) hide show
  1. package/README.md +14 -0
  2. package/bin/expo-kit.js +86 -24
  3. package/bin/mcp.mjs +8 -1
  4. package/package.json +8 -3
  5. package/registry/_docs/accordion.json +16 -0
  6. package/registry/_docs/action-sheet.json +28 -0
  7. package/registry/_docs/alert.json +28 -0
  8. package/registry/_docs/avatar.json +24 -0
  9. package/registry/_docs/badge.json +35 -4
  10. package/registry/_docs/bottom-nav.json +24 -0
  11. package/registry/_docs/bottom-sheet.json +28 -0
  12. package/registry/_docs/bullet.json +3 -0
  13. package/registry/_docs/button-3d.json +16 -0
  14. package/registry/_docs/button.json +16 -0
  15. package/registry/_docs/calendar.json +16 -0
  16. package/registry/_docs/card-stack.json +16 -0
  17. package/registry/_docs/card.json +20 -0
  18. package/registry/_docs/carousel.json +20 -0
  19. package/registry/_docs/chat.json +184 -0
  20. package/registry/_docs/checkbox.json +16 -0
  21. package/registry/_docs/checkout.json +3 -0
  22. package/registry/_docs/chip-group.json +16 -0
  23. package/registry/_docs/color-swatch.json +16 -0
  24. package/registry/_docs/confetti.json +20 -0
  25. package/registry/_docs/coupon.json +16 -0
  26. package/registry/_docs/cube-pager.json +16 -0
  27. package/registry/_docs/dashboard.json +3 -0
  28. package/registry/_docs/date-picker.json +20 -0
  29. package/registry/_docs/dialog.json +24 -0
  30. package/registry/_docs/drawer.json +28 -0
  31. package/registry/_docs/fab.json +24 -0
  32. package/registry/_docs/flip-card.json +16 -0
  33. package/registry/_docs/floating-input.json +20 -0
  34. package/registry/_docs/gift-card.json +16 -0
  35. package/registry/_docs/glass-button.json +24 -0
  36. package/registry/_docs/glass-nav-bar.json +24 -0
  37. package/registry/_docs/glass-search-bar.json +24 -0
  38. package/registry/_docs/glass-segmented.json +28 -0
  39. package/registry/_docs/glass-sheet.json +28 -0
  40. package/registry/_docs/glass-tab-bar.json +24 -0
  41. package/registry/_docs/glass.json +16 -0
  42. package/registry/_docs/inbox.json +3 -0
  43. package/registry/_docs/isometric-bar.json +3 -0
  44. package/registry/_docs/kit.json +3 -0
  45. package/registry/_docs/kpi-card.json +3 -0
  46. package/registry/_docs/like-button.json +20 -0
  47. package/registry/_docs/liquidglass-tab.json +3 -0
  48. package/registry/_docs/list-item.json +16 -0
  49. package/registry/_docs/loyalty-card.json +16 -0
  50. package/registry/_docs/morph-button.json +20 -0
  51. package/registry/_docs/number-ticker.json +16 -0
  52. package/registry/_docs/offers.json +3 -0
  53. package/registry/_docs/onboarding.json +3 -0
  54. package/registry/_docs/otp-input.json +24 -0
  55. package/registry/_docs/pagination-dots.json +20 -0
  56. package/registry/_docs/parallax-layers.json +20 -0
  57. package/registry/_docs/parallax-scroll.json +24 -0
  58. package/registry/_docs/password-input.json +20 -0
  59. package/registry/_docs/payment-card.json +16 -0
  60. package/registry/_docs/pixel-bar.json +3 -0
  61. package/registry/_docs/polar-area.json +3 -0
  62. package/registry/_docs/profile.json +3 -0
  63. package/registry/_docs/progress-steps.json +24 -0
  64. package/registry/_docs/progress.json +20 -0
  65. package/registry/_docs/radio-group.json +20 -0
  66. package/registry/_docs/rating.json +24 -0
  67. package/registry/_docs/ring-carousel.json +20 -0
  68. package/registry/_docs/scratch-card.json +20 -0
  69. package/registry/_docs/search-bar.json +20 -0
  70. package/registry/_docs/search-results.json +3 -0
  71. package/registry/_docs/segmented-control.json +20 -0
  72. package/registry/_docs/select.json +26 -1
  73. package/registry/_docs/settings.json +3 -0
  74. package/registry/_docs/shimmer-button.json +20 -0
  75. package/registry/_docs/sign-in.json +3 -0
  76. package/registry/_docs/skeleton.json +20 -0
  77. package/registry/_docs/slide-to-confirm.json +24 -0
  78. package/registry/_docs/slider.json +21 -1
  79. package/registry/_docs/spin-wheel.json +24 -0
  80. package/registry/_docs/spinner.json +41 -11
  81. package/registry/_docs/stateful-button.json +184 -0
  82. package/registry/_docs/stepper.json +16 -0
  83. package/registry/_docs/swipe-deck.json +16 -0
  84. package/registry/_docs/swipeable-row.json +24 -1
  85. package/registry/_docs/switch.json +20 -0
  86. package/registry/_docs/tabs.json +24 -0
  87. package/registry/_docs/tag-input.json +20 -0
  88. package/registry/_docs/text-animation.json +141 -0
  89. package/registry/_docs/textarea.json +16 -0
  90. package/registry/_docs/ticket-card.json +20 -0
  91. package/registry/_docs/ticket-shape.json +3 -0
  92. package/registry/_docs/tilt-card.json +16 -0
  93. package/registry/_docs/time-picker.json +16 -0
  94. package/registry/_docs/timeline-chart.json +3 -0
  95. package/registry/_docs/timeline.json +16 -0
  96. package/registry/_docs/toast.json +24 -0
  97. package/registry/_docs/treemap.json +3 -0
  98. package/registry/_docs/waterfall.json +3 -0
  99. package/registry/_docs/wheel-list.json +20 -0
  100. package/registry/badge/files/src/components/ui/badge.tsx +327 -17
  101. package/registry/badge.json +1 -1
  102. package/registry/chat.json +18 -0
  103. package/registry/spinner/files/src/components/ui/spinner.tsx +435 -22
  104. package/registry/spinner.json +1 -1
  105. package/registry/stateful-button/files/src/components/ui/stateful-button.tsx +532 -0
  106. package/registry/stateful-button/files/src/lib/kit.tsx +219 -0
  107. package/registry/stateful-button.json +18 -0
  108. package/registry/text-animation/files/src/components/ui/text-animation.tsx +650 -0
  109. package/registry/text-animation/files/src/lib/kit.tsx +219 -0
  110. package/registry/text-animation.json +15 -0
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/ui/bottom-sheet.tsx"
8
8
  ],
9
+ "summary": "A draggable sheet with snap points whose grabber stretches as you pull it.",
9
10
  "props": [
10
11
  [
11
12
  "open",
@@ -128,6 +129,33 @@
128
129
  "Sheet and content styles."
129
130
  ]
130
131
  ],
132
+ "behavior": [
133
+ [
134
+ "Touch",
135
+ "Drag the grabber or header between snap points; release velocity picks the detent and dragging past the limits rubber-bands. Tap the scrim or drag down to close."
136
+ ],
137
+ [
138
+ "Motion",
139
+ "Glides between detents on a firm spring while the scrim dims with its height. The keyboard lifts the sheet when avoidKeyboard is on."
140
+ ],
141
+ [
142
+ "Reduced motion",
143
+ "Snapping uses a short timing instead of a spring."
144
+ ],
145
+ [
146
+ "Haptics",
147
+ "A light impact on open and a selection tick on each snap. Turn off with haptics={false}."
148
+ ],
149
+ [
150
+ "Screen readers",
151
+ "The sheet is a modal view. The grabber is adjustable with increment and decrement actions to change snap point, and the title is a header."
152
+ ],
153
+ [
154
+ "Keyboard",
155
+ "Escape closes it on web when dismissible; the Android back button closes it too."
156
+ ]
157
+ ],
158
+ "usage": "import { useState } from 'react';\nimport { BottomSheet } from '@/components/ui/bottom-sheet';\n\nconst [open, setOpen] = useState(false);\n<BottomSheet\n open={open}\n onClose={() => setOpen(false)}\n snapPoints={['40%', '85%']}\n title=\"Share album\"\n/>",
131
159
  "examples": [
132
160
  {
133
161
  "name": "Basic",
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/charts/bullet.tsx"
8
8
  ],
9
+ "summary": null,
9
10
  "props": [
10
11
  [
11
12
  "data",
@@ -20,5 +21,7 @@
20
21
  "Sizing."
21
22
  ]
22
23
  ],
24
+ "behavior": [],
25
+ "usage": null,
23
26
  "examples": []
24
27
  }
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/ui/button-3d.tsx"
8
8
  ],
9
+ "summary": "A keycap-style button whose lit face sinks into its edge when pressed.",
9
10
  "props": [
10
11
  [
11
12
  "children",
@@ -92,6 +93,21 @@
92
93
  "Style for the root (width, margins)."
93
94
  ]
94
95
  ],
96
+ "behavior": [
97
+ [
98
+ "Touch",
99
+ "The face sinks into its edge on press-in and springs back on release. Small sizes pad their hit area to 44pt."
100
+ ],
101
+ [
102
+ "Haptics",
103
+ "A light impact on press-in on iOS and on press on Android, so scrolling past it doesn't buzz. Turn off with haptics={false}."
104
+ ],
105
+ [
106
+ "Screen readers",
107
+ "A button with disabled and busy state. Pass accessibilityLabel for circle keys that show only a glyph."
108
+ ]
109
+ ],
110
+ "usage": "import { Button3D } from '@/components/ui/button-3d';\n\n<Button3D size=\"lg\" shape=\"pill\" onPress={startTrip}>\n Start the trip\n</Button3D>",
95
111
  "examples": [
96
112
  {
97
113
  "name": "OnPhoto",
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/ui/button.tsx"
8
8
  ],
9
+ "summary": "A button that springs down on press, in eleven variants including gradient and glow.",
9
10
  "props": [
10
11
  [
11
12
  "variant",
@@ -80,6 +81,21 @@
80
81
  "onPress, disabled, …"
81
82
  ]
82
83
  ],
84
+ "behavior": [
85
+ [
86
+ "Touch",
87
+ "Scales down with a spring on press-in and bounces back on release. loading swaps the label for a spinner and blocks presses."
88
+ ],
89
+ [
90
+ "Haptics",
91
+ "Opt-in light impact on press with haptics; off by default."
92
+ ],
93
+ [
94
+ "Screen readers",
95
+ "A button with disabled and busy state."
96
+ ]
97
+ ],
98
+ "usage": "import { Button } from '@/components/ui/button';\n\n<Button variant=\"accent\" size=\"lg\" block onPress={checkout}>\n Continue to payment\n</Button>",
83
99
  "examples": [
84
100
  {
85
101
  "name": "Variants",
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/ui/calendar.tsx"
8
8
  ],
9
+ "summary": "A month calendar where months slide in from the side you travel and ranges draw one band.",
9
10
  "props": [
10
11
  [
11
12
  "mode",
@@ -152,6 +153,21 @@
152
153
  "Root container style."
153
154
  ]
154
155
  ],
156
+ "behavior": [
157
+ [
158
+ "Touch",
159
+ "Tap a day to select it. Swipe sideways or use the chevrons to change month, and tap the title for a month and year grid."
160
+ ],
161
+ [
162
+ "Motion",
163
+ "Months slide in with a spring, selected days pop with a bouncy spring and range bands fade in."
164
+ ],
165
+ [
166
+ "Screen readers",
167
+ "Days are buttons with selected and disabled state, labelled with the full date plus \"today\" or \"has events\" where they apply."
168
+ ]
169
+ ],
170
+ "usage": "import { useState } from 'react';\nimport { Calendar } from '@/components/ui/calendar';\n\nconst [date, setDate] = useState(new Date());\n<Calendar value={date} onChange={setDate} minDate={new Date()} />",
155
171
  "examples": [
156
172
  {
157
173
  "name": "Single",
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/ui/card-stack.tsx"
8
8
  ],
9
+ "summary": "A Wallet-style stack that fans open on tap and slides the picked card to the front.",
9
10
  "props": [
10
11
  [
11
12
  "data",
@@ -104,5 +105,20 @@
104
105
  "Style for the root view."
105
106
  ]
106
107
  ],
108
+ "behavior": [
109
+ [
110
+ "Touch",
111
+ "Tap the closed stack to fan it open, then tap a card to bring it to the front as the stack closes. With onPressFront, a tap on the front card calls it instead."
112
+ ],
113
+ [
114
+ "Motion",
115
+ "Cards behind the front one shrink and tilt back in 3D depth. Opening, closing and reordering all run on springs."
116
+ ],
117
+ [
118
+ "Screen readers",
119
+ "Each card is a button with selected and expanded state, labelled \"Card 2 of 4\" by default or by getAccessibilityLabel."
120
+ ]
121
+ ],
122
+ "usage": null,
107
123
  "examples": []
108
124
  }
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/ui/card.tsx"
8
8
  ],
9
+ "summary": "A composable card that springs down on press, with a spotlight that follows your finger.",
9
10
  "props": [
10
11
  [
11
12
  "variant",
@@ -86,6 +87,25 @@
86
87
  "Style for the card surface (merged after the variant background, border and radius)."
87
88
  ]
88
89
  ],
90
+ "behavior": [
91
+ [
92
+ "Touch",
93
+ "With onPress, onLongPress or pressable it scales down with a spring and bounces back on release."
94
+ ],
95
+ [
96
+ "Motion",
97
+ "highlight=\"spotlight\" springs in a soft glow under your finger; highlight=\"border\" fades in a glowing accent ring."
98
+ ],
99
+ [
100
+ "Screen readers",
101
+ "Becomes a button with disabled state when it has onPress or onLongPress. Card.Title is a header."
102
+ ],
103
+ [
104
+ "Web",
105
+ "Shows a pointer cursor when it has onPress."
106
+ ]
107
+ ],
108
+ "usage": "import { Card } from '@/components/ui/card';\n\n<Card variant=\"elevated\" highlight=\"spotlight\" onPress={openGuide}>\n <Card.Header>\n <Card.Title>Kyoto in autumn</Card.Title>\n <Card.Description>Temples, maple-lined paths and the best matcha spots.</Card.Description>\n </Card.Header>\n</Card>",
89
109
  "examples": [
90
110
  {
91
111
  "name": "Default",
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/ui/carousel.tsx"
8
8
  ],
9
+ "summary": "A snapping carousel whose neighbouring slides shrink, fade or tilt with the scroll.",
9
10
  "props": [
10
11
  [
11
12
  "data",
@@ -98,5 +99,24 @@
98
99
  "Style for the root view wrapping the slides and pagination."
99
100
  ]
100
101
  ],
102
+ "behavior": [
103
+ [
104
+ "Touch",
105
+ "Swipe to snap from slide to slide. Autoplay waits while you drag and resumes after."
106
+ ],
107
+ [
108
+ "Motion",
109
+ "Slide effects are interpolated from the scroll position on the native driver. renderItem also gets a progress value for your own parallax."
110
+ ],
111
+ [
112
+ "Screen readers",
113
+ "The scroller is adjustable, reads \"Slide 2 of 5\" and supports increment and decrement. Dots are buttons labelled \"Go to slide N\"."
114
+ ],
115
+ [
116
+ "Web",
117
+ "Settles on the nearest slide once scrolling stops, since the web has no snap momentum."
118
+ ]
119
+ ],
120
+ "usage": null,
101
121
  "examples": []
102
122
  }
@@ -0,0 +1,184 @@
1
+ {
2
+ "name": "chat",
3
+ "category": "Blocks",
4
+ "aliases": [
5
+ "ai-chat",
6
+ "chatbot",
7
+ "assistant",
8
+ "messages",
9
+ "chatgpt"
10
+ ],
11
+ "exportName": "ChatScreen",
12
+ "files": [
13
+ "src/components/blocks/chat.tsx"
14
+ ],
15
+ "summary": "AI assistant chat with streamed, fading-in replies, Thinking state and a Stop button.",
16
+ "props": [
17
+ [
18
+ "messages",
19
+ "{ id, role: 'user' | 'assistant', text, streaming?, feedback? }[]",
20
+ "[]",
21
+ "The conversation. Controlled when onSend is set; otherwise the starting messages for the built-in simulation."
22
+ ],
23
+ [
24
+ "onSend",
25
+ "(text: string) => void",
26
+ "—",
27
+ "The user sent a prompt (trimmed). Append it and the reply to messages yourself. Without it, replies are simulated from a canned list so the screen works as-is."
28
+ ],
29
+ [
30
+ "streaming",
31
+ "boolean",
32
+ "false",
33
+ "A reply is in flight: “Thinking…” until the last message is an assistant one with text, a caret while it grows, and Send becomes Stop."
34
+ ],
35
+ [
36
+ "onStop",
37
+ "() => void",
38
+ "—",
39
+ "Stop pressed while streaming."
40
+ ],
41
+ [
42
+ "suggestions",
43
+ "string[]",
44
+ "4 prompts",
45
+ "Chips above the input until the user sends something; tapping one sends it. [] hides them."
46
+ ],
47
+ [
48
+ "assistantName",
49
+ "string",
50
+ "'Assistant'",
51
+ "Used in the header, the placeholder and screen reader labels."
52
+ ],
53
+ [
54
+ "title / subtitle",
55
+ "string",
56
+ "assistantName / 'Ask me anything'",
57
+ "Header text. The subtitle shows “Thinking…” / “Typing…” while streaming."
58
+ ],
59
+ [
60
+ "header",
61
+ "ReactNode | null",
62
+ "built-in",
63
+ "Replace the header; null hides it."
64
+ ],
65
+ [
66
+ "avatar",
67
+ "ReactNode",
68
+ "sparkle mark",
69
+ "Replace the assistant mark beside replies, in the header and the empty state."
70
+ ],
71
+ [
72
+ "emptyTitle / emptySubtitle",
73
+ "string",
74
+ "'How can I help today?'",
75
+ "Empty state copy."
76
+ ],
77
+ [
78
+ "placeholder",
79
+ "string",
80
+ "`Message ${assistantName}`",
81
+ "Prompt placeholder and accessibility label."
82
+ ],
83
+ [
84
+ "variant",
85
+ "'plain' | 'bubbles'",
86
+ "'plain'",
87
+ "plain: assistant text sits on the page. bubbles: assistant replies in muted bubbles too (support bots)."
88
+ ],
89
+ [
90
+ "thinkingIndicator",
91
+ "'shimmer' | 'dots'",
92
+ "'shimmer'",
93
+ "What shows before the first token."
94
+ ],
95
+ [
96
+ "onAttach",
97
+ "() => void",
98
+ "—",
99
+ "Shows a + button left of the input."
100
+ ],
101
+ [
102
+ "onCopy",
103
+ "(message) => void",
104
+ "—",
105
+ "Copy pressed or a message long-pressed — write message.text to the clipboard here. The icon turns into a check."
106
+ ],
107
+ [
108
+ "onRegenerate",
109
+ "(message) => void",
110
+ "—",
111
+ "Regenerate pressed on the latest reply."
112
+ ],
113
+ [
114
+ "onFeedback",
115
+ "(message, 'up' | 'down' | null) => void",
116
+ "—",
117
+ "Thumbs toggled; null when cleared. Initial state comes from message.feedback."
118
+ ],
119
+ [
120
+ "onNewChat",
121
+ "() => void",
122
+ "—",
123
+ "Shows a new-chat button in the header (the simulation also clears itself)."
124
+ ],
125
+ [
126
+ "bottomInset",
127
+ "number",
128
+ "0",
129
+ "Extra padding under the input, e.g. useSafeAreaInsets().bottom. Ignored while the keyboard is open."
130
+ ],
131
+ [
132
+ "keyboardVerticalOffset",
133
+ "number",
134
+ "0",
135
+ "Height above the screen (navigator header) so the input clears the keyboard exactly."
136
+ ],
137
+ [
138
+ "haptics",
139
+ "boolean",
140
+ "true",
141
+ "Light haptics on send, stop, copy and feedback."
142
+ ],
143
+ [
144
+ "accent",
145
+ "string",
146
+ "theme accent",
147
+ "User bubbles, send button, focus ring and the assistant mark."
148
+ ],
149
+ [
150
+ "style",
151
+ "StyleProp<ViewStyle>",
152
+ "—",
153
+ "Root style."
154
+ ]
155
+ ],
156
+ "behavior": [
157
+ [
158
+ "Touch",
159
+ "Tap a suggestion chip to send it. Long-press a message to copy it; the row under each reply has copy, thumbs up / down and regenerate (latest reply). A round button jumps back to the latest message after scrolling up."
160
+ ],
161
+ [
162
+ "Motion",
163
+ "Messages rise and fade in on a spring, new words fade in as they stream with a soft blinking caret, “Thinking…” shimmers (or dots bounce), and the send arrow spins into a stop square. Opacity and transforms run on the native driver."
164
+ ],
165
+ [
166
+ "Reduced motion",
167
+ "No per-word fade, shimmer, bouncing dots or caret blink; simulated replies arrive in larger chunks and messages appear without the rise."
168
+ ],
169
+ [
170
+ "Screen readers",
171
+ "Messages read as “You: …” and “<assistant>: …” with markdown stripped, and long-press copy is exposed as an action. “<assistant> is thinking” is announced, then the full reply when streaming ends. Buttons have roles, labels and disabled / selected state."
172
+ ],
173
+ [
174
+ "Keyboard",
175
+ "The prompt stays above the keyboard on iOS and Android (KeyboardAvoidingView; pass keyboardVerticalOffset under a navigator header) and bottomInset is dropped while it is open. On web, Enter sends and Shift+Enter adds a line."
176
+ ],
177
+ [
178
+ "Haptics",
179
+ "A light tap on send, stop and copy, and a selection tick on chips, thumbs and regenerate (native only, haptics={false} to turn off)."
180
+ ]
181
+ ],
182
+ "usage": null,
183
+ "examples": []
184
+ }
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/ui/checkbox.tsx"
8
8
  ],
9
+ "summary": "A checkbox whose tick draws itself in as the box squishes and a ring bursts out.",
9
10
  "props": [
10
11
  [
11
12
  "checked / onChange",
@@ -68,6 +69,21 @@
68
69
  "Style for the pressable row holding the box and label."
69
70
  ]
70
71
  ],
72
+ "behavior": [
73
+ [
74
+ "Touch",
75
+ "The whole row toggles. The box squishes on press-in and bounces back on release."
76
+ ],
77
+ [
78
+ "Motion",
79
+ "The fill and tick spring in together, and a ring bursts outward each time it becomes checked."
80
+ ],
81
+ [
82
+ "Screen readers",
83
+ "A checkbox with checked and disabled state."
84
+ ]
85
+ ],
86
+ "usage": "import { Checkbox } from '@/components/ui/checkbox';\n\n<Checkbox\n label=\"Email me about new releases\"\n description=\"About once a month, never spam.\"\n defaultChecked\n/>",
71
87
  "examples": [
72
88
  {
73
89
  "name": "Default",
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/blocks/checkout.tsx"
8
8
  ],
9
+ "summary": null,
9
10
  "props": [
10
11
  [
11
12
  "items",
@@ -98,5 +99,7 @@
98
99
  "Root style."
99
100
  ]
100
101
  ],
102
+ "behavior": [],
103
+ "usage": null,
101
104
  "examples": []
102
105
  }
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/ui/chip-group.tsx"
8
8
  ],
9
+ "summary": "Filter chips that widen to make room as a check mark draws itself in.",
9
10
  "props": [
10
11
  [
11
12
  "options",
@@ -86,6 +87,21 @@
86
87
  "Style for the wrapping row (the ScrollView when scrollable)."
87
88
  ]
88
89
  ],
90
+ "behavior": [
91
+ [
92
+ "Touch",
93
+ "Tap to select. In single mode, tapping the selected chip clears it unless deselectable is false. Short chips pad their hit area to 44pt."
94
+ ],
95
+ [
96
+ "Motion",
97
+ "Selection springs the check, width and colours together, and chips squish while pressed."
98
+ ],
99
+ [
100
+ "Screen readers",
101
+ "Chips are radios in single mode and checkboxes in multiple mode, with checked and disabled state."
102
+ ]
103
+ ],
104
+ "usage": "import { ChipGroup } from '@/components/ui/chip-group';\n\n<ChipGroup\n multiple\n defaultValue={['Vegan']}\n options={['Vegan', 'Vegetarian', 'Gluten-free', 'Halal']}\n/>",
89
105
  "examples": [
90
106
  {
91
107
  "name": "Solid",
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/ui/color-swatch.tsx"
8
8
  ],
9
+ "summary": "A colour picker where the chosen swatch settles in as a ring springs out around it.",
9
10
  "props": [
10
11
  [
11
12
  "colors",
@@ -62,5 +63,20 @@
62
63
  "Style for the wrapping grid (the ScrollView when scrollable)."
63
64
  ]
64
65
  ],
66
+ "behavior": [
67
+ [
68
+ "Touch",
69
+ "Tap a swatch to choose it. Each swatch's hit area is padded out to 44pt."
70
+ ],
71
+ [
72
+ "Motion",
73
+ "The chosen swatch settles inward while a ring and check spring out. The check uses whichever ink reads best on that colour."
74
+ ],
75
+ [
76
+ "Screen readers",
77
+ "A radiogroup labelled \"Colour\" by default; each swatch is a radio named by its label or hex value."
78
+ ]
79
+ ],
80
+ "usage": null,
65
81
  "examples": []
66
82
  }
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/ui/confetti.tsx"
8
8
  ],
9
+ "summary": "Confetti that flies on real arcs with gravity and drag, then flutters as it falls.",
9
10
  "props": [
10
11
  [
11
12
  "count",
@@ -62,6 +63,25 @@
62
63
  "The overlay never takes touches."
63
64
  ]
64
65
  ],
66
+ "behavior": [
67
+ [
68
+ "Motion",
69
+ "Each burst launches pieces with velocity, gravity and air drag, all moved by one native-driven animation. Bursts can overlap."
70
+ ],
71
+ [
72
+ "Touch",
73
+ "The overlay fills its parent and never takes touches."
74
+ ],
75
+ [
76
+ "Reduced motion",
77
+ "Bursts launch a quarter of the pieces."
78
+ ],
79
+ [
80
+ "Screen readers",
81
+ "The overlay is hidden from assistive tech."
82
+ ]
83
+ ],
84
+ "usage": "import { useState } from 'react';\nimport { Confetti } from '@/components/ui/confetti';\n\nconst [orders, setOrders] = useState(0);\n<Confetti trigger={orders} origin=\"bottom\" />",
65
85
  "examples": [
66
86
  {
67
87
  "name": "Celebrate",
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/ui/coupon.tsx"
8
8
  ],
9
+ "summary": "A perforated coupon with a copyable code that can tilt in 3D and flip to its terms.",
9
10
  "props": [
10
11
  [
11
12
  "value",
@@ -146,6 +147,21 @@
146
147
  "Width, margins."
147
148
  ]
148
149
  ],
150
+ "behavior": [
151
+ [
152
+ "Touch",
153
+ "Tapping the code chip calls onCopy and flips its icon to a check. The T&C link turns the coupon over to its terms."
154
+ ],
155
+ [
156
+ "Motion",
157
+ "With tilt it leans toward your finger with a moving reflection, holo adds a rainbow sheen, and shine sweeps light across the value panel."
158
+ ],
159
+ [
160
+ "Screen readers",
161
+ "The code chip is a button that reads the copy label and the code. Apply is a button with disabled and selected state."
162
+ ]
163
+ ],
164
+ "usage": "import { Coupon } from '@/components/ui/coupon';\n\n<Coupon\n value=\"50%\"\n unit=\"Off\"\n title=\"Your first order, on us\"\n code=\"GLOW50\"\n onApply={applyCoupon}\n/>",
149
165
  "examples": [
150
166
  {
151
167
  "name": "Hero",
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/ui/cube-pager.tsx"
8
8
  ],
9
+ "summary": "Swipeable pages that turn like the faces of a cube, with flick momentum.",
9
10
  "props": [
10
11
  [
11
12
  "children",
@@ -80,5 +81,20 @@
80
81
  "Style for the root view."
81
82
  ]
82
83
  ],
84
+ "behavior": [
85
+ [
86
+ "Touch",
87
+ "Pages follow your finger. A quick flick or a drag past 35% turns the page, and the first and last pages rubber-band."
88
+ ],
89
+ [
90
+ "Motion",
91
+ "Pages rotate around their shared edge in 3D (cube, inside or flip) and darken as they turn away when shade is on."
92
+ ],
93
+ [
94
+ "Screen readers",
95
+ "The pager is adjustable with a \"2 / 5\" value and increment and decrement actions. Off-screen pages are hidden and dots are buttons."
96
+ ]
97
+ ],
98
+ "usage": null,
83
99
  "examples": []
84
100
  }
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/blocks/dashboard.tsx"
8
8
  ],
9
+ "summary": null,
9
10
  "props": [
10
11
  [
11
12
  "data",
@@ -116,5 +117,7 @@
116
117
  "Root style."
117
118
  ]
118
119
  ],
120
+ "behavior": [],
121
+ "usage": null,
119
122
  "examples": []
120
123
  }
@@ -6,6 +6,7 @@
6
6
  "files": [
7
7
  "src/components/ui/date-picker.tsx"
8
8
  ],
9
+ "summary": "A floating-label date field that opens the calendar in a draggable spring sheet.",
9
10
  "props": [
10
11
  [
11
12
  "label",
@@ -224,6 +225,25 @@
224
225
  "Sheet / dialog / popover panel — background, border, radius, padding, shadow (transform and opacity are animated)."
225
226
  ]
226
227
  ],
228
+ "behavior": [
229
+ [
230
+ "Touch",
231
+ "Tap the field to open the picker. In a sheet, drag the grabber header down (or flick it) to dismiss."
232
+ ],
233
+ [
234
+ "Motion",
235
+ "The label floats onto the border and a focus halo springs in while open. An error shakes the field once and its message springs in below."
236
+ ],
237
+ [
238
+ "Screen readers",
239
+ "The field is a button labelled with your label, with the date (or \"Not set\") as its value and an expanded state. Helper, error and success messages are polite live regions."
240
+ ],
241
+ [
242
+ "Platforms",
243
+ "With presentation 'auto' it opens a bottom sheet on phones and a centred dialog from 640pt wide."
244
+ ]
245
+ ],
246
+ "usage": "import { useState } from 'react';\nimport { DatePicker } from '@/components/ui/date-picker';\n\nconst [date, setDate] = useState<Date | null>(null);\n<DatePicker label=\"Date of birth\" value={date} onChange={setDate} maxDate={new Date()} />",
227
247
  "examples": [
228
248
  {
229
249
  "name": "Birthday",