@pushwoosh/dumb-components 1.1.40 → 1.1.41

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.
@@ -0,0 +1,228 @@
1
+ # Button - AI Documentation
2
+
3
+ > Auto-generated AI agent documentation for Button component
4
+ > Part of @pushwoosh/dumb-components library
5
+
6
+ ## Overview
7
+
8
+ **Component:** Button, GhostButton
9
+ **Import Path:** `import { Button, GhostButton } from '@pushwoosh/dumb-components'`
10
+ **Files:** Button.tsx, GhostButton.tsx, types.ts, styles.ts, maps.ts, index.ts
11
+ **Type:** UI Component / Form Component
12
+ **Description:** Versatile button component with loading states, icons, and multiple styling variants. Also includes a minimal GhostButton for unstyled interactions.
13
+
14
+ ## TypeScript Interface
15
+
16
+ ```typescript
17
+ type RequiredButtonProps = {
18
+ readonly boxRef?: any;
19
+ readonly color: 'primary' | 'secondary' | 'danger';
20
+ readonly size?: 'field' | 'compact';
21
+ readonly view?: 'shape' | 'ghost';
22
+ readonly className?: string;
23
+ readonly isDisabled?: boolean;
24
+ readonly isLoading?: boolean;
25
+ readonly isOpen?: boolean;
26
+ readonly icon?: ReactNode;
27
+ readonly rightIcon?: ReactNode;
28
+ readonly children?: ReactNode;
29
+ };
30
+
31
+ // Main button props extending HTML button
32
+ type ButtonPropsWithoutAs = Omit<JSX.IntrinsicElements['button'], 'ref'> & RequiredButtonProps & {
33
+ readonly boxRef?: Ref<HTMLButtonElement>;
34
+ readonly type?: 'button' | 'submit';
35
+ };
36
+
37
+ // Can be rendered as different HTML elements
38
+ type ButtonPropsWithAsTag<AS extends keyof HTMLElementTagNameMap> =
39
+ Omit<JSX.IntrinsicElements[AS], 'ref'> & RequiredButtonProps & {
40
+ readonly boxRef?: Ref<HTMLElementTagNameMap[AS]>;
41
+ readonly as?: AS;
42
+ };
43
+ ```
44
+
45
+ ## Import & Usage
46
+
47
+ **Import:**
48
+ ```typescript
49
+ import { Button, GhostButton } from '@pushwoosh/dumb-components';
50
+ import type {
51
+ ButtonPropsWithoutAs,
52
+ ButtonPropsWithAsTag,
53
+ RequiredButtonProps
54
+ } from '@pushwoosh/dumb-components';
55
+ ```
56
+
57
+ **Basic Usage:**
58
+ ```tsx
59
+ function App() {
60
+ return (
61
+ <Button color="primary">
62
+ Click me
63
+ </Button>
64
+ );
65
+ }
66
+ ```
67
+
68
+ **Advanced Examples:**
69
+ ```tsx
70
+ // Primary action button
71
+ <Button
72
+ color="primary"
73
+ size="field"
74
+ onClick={() => handleSave()}
75
+ >
76
+ Save Changes
77
+ </Button>
78
+
79
+ // Secondary button with icon
80
+ <Button
81
+ color="secondary"
82
+ icon={<PlusIcon />}
83
+ onClick={() => handleAdd()}
84
+ >
85
+ Add Item
86
+ </Button>
87
+
88
+ // Danger button with loading state
89
+ <Button
90
+ color="danger"
91
+ isLoading={isDeleting}
92
+ onClick={() => handleDelete()}
93
+ >
94
+ {isDeleting ? 'Deleting...' : 'Delete'}
95
+ </Button>
96
+
97
+ // Compact button with right icon
98
+ <Button
99
+ color="primary"
100
+ size="compact"
101
+ rightIcon={<ArrowIcon />}
102
+ >
103
+ Next
104
+ </Button>
105
+
106
+ // Ghost view button
107
+ <Button
108
+ color="primary"
109
+ view="ghost"
110
+ icon={<EditIcon />}
111
+ >
112
+ Edit
113
+ </Button>
114
+
115
+ // Icon-only button
116
+ <Button
117
+ color="secondary"
118
+ icon={<SearchIcon />}
119
+ onClick={() => handleSearch()}
120
+ />
121
+
122
+ // Submit button for forms
123
+ <Button
124
+ type="submit"
125
+ color="primary"
126
+ isDisabled={!isFormValid}
127
+ >
128
+ Submit Form
129
+ </Button>
130
+
131
+ // Button as different element (link)
132
+ <Button
133
+ as="a"
134
+ href="/dashboard"
135
+ color="primary"
136
+ >
137
+ Go to Dashboard
138
+ </Button>
139
+
140
+ // With loading overlay
141
+ <Button
142
+ color="primary"
143
+ isLoading={isSubmitting}
144
+ onClick={handleAsyncSubmit}
145
+ >
146
+ Submit
147
+ </Button>
148
+ ```
149
+
150
+ ## GhostButton Usage
151
+
152
+ ```tsx
153
+ // Minimal unstyled button
154
+ <GhostButton onClick={() => handleClick()}>
155
+ <CustomIcon />
156
+ </GhostButton>
157
+
158
+ // For custom styled buttons
159
+ const CustomButton = styled(GhostButton)`
160
+ /* Your custom styles */
161
+ padding: 8px 16px;
162
+ color: blue;
163
+ `;
164
+ ```
165
+
166
+ ## Props Reference
167
+
168
+ | Prop | Type | Default | Description |
169
+ |------|------|---------|-------------|
170
+ | color | 'primary' \| 'secondary' \| 'danger' | required | Button color scheme |
171
+ | size | 'field' \| 'compact' | 'field' | Button size variant |
172
+ | view | 'shape' \| 'ghost' | 'shape' | Button visual style |
173
+ | type | 'button' \| 'submit' | 'button' | HTML button type |
174
+ | isDisabled | boolean | false | Whether button is disabled |
175
+ | isLoading | boolean | false | Whether button shows loading state |
176
+ | isOpen | boolean | false | Whether button appears in "open" state |
177
+ | icon | ReactNode | undefined | Left icon element |
178
+ | rightIcon | ReactNode | undefined | Right icon element |
179
+ | children | ReactNode | undefined | Button text content |
180
+ | boxRef | Ref | undefined | Ref to button element |
181
+ | as | string \| Component | undefined | Render as different element/component |
182
+
183
+ ## Color Guide
184
+
185
+ | Color | Usage | Example Use Cases |
186
+ |-------|--------|-------------------|
187
+ | primary | Main actions, primary CTA | "Save", "Submit", "Continue" |
188
+ | secondary | Secondary actions, alternatives | "Cancel", "Back", "Skip" |
189
+ | danger | Destructive actions | "Delete", "Remove", "Clear" |
190
+
191
+ ## AI Agent Guidelines
192
+
193
+ ### ✅ Recommended Patterns
194
+ - Always provide `color` prop (required)
195
+ - Use `color="primary"` for main actions, `"secondary"` for alternatives
196
+ - Use `color="danger"` for destructive actions like delete
197
+ - Combine `isLoading` with async operations
198
+ - Use `size="compact"` in space-constrained layouts
199
+ - Add icons to improve recognition and usability
200
+ - Use `type="submit"` in forms for proper form submission
201
+
202
+ ### ❌ Common Mistakes to Avoid
203
+ - Missing required `color` prop will render nothing and log error
204
+ - Don't use loading state without showing loading text to user
205
+ - Avoid putting buttons inside other interactive elements
206
+ - Don't use `isDisabled` with `isLoading` simultaneously
207
+ - Avoid very long button text - keep concise
208
+
209
+ ### Integration Tips
210
+ - Works seamlessly with form libraries like react-hook-form
211
+ - Loading state automatically shows spinner overlay
212
+ - Can render as links or other elements using `as` prop
213
+ - Icon-only buttons should have proper aria-labels
214
+ - Combine with Tooltip for additional context when needed
215
+
216
+ ## Loading Behavior
217
+ - **With icon**: Replaces icon with spinner
218
+ - **Text only**: Shows overlay spinner while hiding text
219
+ - **Ghost view**: Shows inline spinner, no overlay
220
+ - **Icon + text**: Icon becomes spinner, text remains visible
221
+
222
+ ## Related Components
223
+ - GhostButton - for unstyled button base
224
+ - Link - for navigation actions
225
+ - IconButton - specialized icon-only buttons
226
+ - Spinner - used internally for loading states
227
+
228
+ ---
@@ -0,0 +1,277 @@
1
+ # CardMetric - AI Documentation
2
+
3
+ > Auto-generated AI agent documentation for CardMetric component
4
+ > Part of @pushwoosh/dumb-components library
5
+
6
+ ## Overview
7
+
8
+ **Component:** CardMetric
9
+ **Import Path:** `import { CardMetric } from '@pushwoosh/dumb-components'`
10
+ **Files:** CardMetric.tsx, CardChildren.tsx, CardCollapse.tsx, types.ts, styles.tsx, index.ts
11
+ **Type:** Data Display Component / Dashboard Component
12
+ **Description:** Card component for displaying metrics and data with optional collapsible content, loading states, and tooltips
13
+
14
+ ## TypeScript Interface
15
+
16
+ ```typescript
17
+ interface CardMetricProps {
18
+ view?: 'rounded' | 'stacking';
19
+ focus?: boolean;
20
+ title?: string | ReactElement;
21
+ tooltip?: string;
22
+ loading?: boolean;
23
+ collapse?: {
24
+ isCollapsed: boolean;
25
+ };
26
+ description?: string;
27
+ metric?: string | number;
28
+ extraMetric?: string | number;
29
+ extraMetricColor?: string;
30
+ headerExtra?: ReactElement;
31
+ children?: ReactNode;
32
+ [key: string]: any; // Additional HTML props
33
+ }
34
+ ```
35
+
36
+ ## Import & Usage
37
+
38
+ **Import:**
39
+ ```typescript
40
+ import { CardMetric } from '@pushwoosh/dumb-components';
41
+ import type { CardMetricProps } from '@pushwoosh/dumb-components';
42
+ ```
43
+
44
+ **Basic Usage:**
45
+ ```tsx
46
+ function App() {
47
+ return (
48
+ <CardMetric
49
+ title="Total Users"
50
+ metric="1,234"
51
+ />
52
+ );
53
+ }
54
+ ```
55
+
56
+ **Advanced Examples:**
57
+ ```tsx
58
+ // Basic metric card
59
+ <CardMetric
60
+ title="Revenue"
61
+ metric="$45,678"
62
+ extraMetric="+12%"
63
+ extraMetricColor="#22c55e"
64
+ />
65
+
66
+ // Card with tooltip
67
+ <CardMetric
68
+ title="Conversion Rate"
69
+ tooltip="Percentage of visitors who completed a purchase"
70
+ metric="3.4%"
71
+ extraMetric="+0.2%"
72
+ />
73
+
74
+ // Card with children content
75
+ <CardMetric
76
+ title="Monthly Sales"
77
+ metric="$125,000"
78
+ >
79
+ <div>
80
+ <p>Last month: $118,000</p>
81
+ <p>Growth: 5.9%</p>
82
+ </div>
83
+ </CardMetric>
84
+
85
+ // Collapsible card
86
+ <CardMetric
87
+ title="Detailed Analytics"
88
+ metric="98.5%"
89
+ collapse={{ isCollapsed: false }}
90
+ >
91
+ <div>
92
+ <h4>Performance Breakdown:</h4>
93
+ <ul>
94
+ <li>Page Load: 2.3s</li>
95
+ <li>Time to Interactive: 3.1s</li>
96
+ <li>First Paint: 1.8s</li>
97
+ </ul>
98
+ </div>
99
+ </CardMetric>
100
+
101
+ // Loading state
102
+ <CardMetric
103
+ title="Loading Data..."
104
+ loading={isLoading}
105
+ >
106
+ <p>Please wait while we fetch the latest metrics.</p>
107
+ </CardMetric>
108
+
109
+ // Stacking view with header extra
110
+ <CardMetric
111
+ view="stacking"
112
+ title="User Engagement"
113
+ metric="2,156"
114
+ headerExtra={<Button size="compact">View Details</Button>}
115
+ >
116
+ <p>Daily active users for the past 30 days</p>
117
+ </CardMetric>
118
+
119
+ // Focused card (highlighted)
120
+ <CardMetric
121
+ view="rounded"
122
+ focus={true}
123
+ title="Key Metric"
124
+ metric="87%"
125
+ extraMetric="Target: 90%"
126
+ description="This is the most important metric to track"
127
+ />
128
+
129
+ // Dashboard grid
130
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: '16px' }}>
131
+ <CardMetric title="Orders" metric="1,428" extraMetric="+15%" />
132
+ <CardMetric title="Revenue" metric="$89,204" extraMetric="+8.2%" />
133
+ <CardMetric title="Customers" metric="892" extraMetric="+23%" />
134
+ <CardMetric title="Conversion" metric="4.2%" extraMetric="-0.1%" />
135
+ </div>
136
+
137
+ // With custom content and description
138
+ <CardMetric
139
+ title="Server Status"
140
+ metric="99.9%"
141
+ description="Uptime for the last 30 days"
142
+ >
143
+ <div>
144
+ <div style={{ display: 'flex', gap: '8px', marginBottom: '8px' }}>
145
+ <Badge color="green">Healthy</Badge>
146
+ <Badge color="orange">2 Warnings</Badge>
147
+ </div>
148
+ <p>Last incident: 3 days ago</p>
149
+ </div>
150
+ </CardMetric>
151
+ ```
152
+
153
+ ## Props Reference
154
+
155
+ | Prop | Type | Default | Description |
156
+ |------|------|---------|-------------|
157
+ | title | string \| ReactElement | '' | Card title text or element |
158
+ | metric | string \| number | undefined | Main metric value to display |
159
+ | extraMetric | string \| number | undefined | Additional metric (e.g., change percentage) |
160
+ | extraMetricColor | string | Color.MAIN | Color for extra metric text |
161
+ | view | 'rounded' \| 'stacking' | 'rounded' | Card visual style |
162
+ | focus | boolean | false | Whether card should appear highlighted |
163
+ | loading | boolean | false | Whether to show loading spinner |
164
+ | tooltip | string | '' | Tooltip text for info icon |
165
+ | description | string | '' | Description text at bottom of card |
166
+ | collapse | { isCollapsed: boolean } | undefined | Collapsible functionality config |
167
+ | headerExtra | ReactElement | undefined | Extra content in header (buttons, etc.) |
168
+ | children | ReactNode | undefined | Main card content |
169
+
170
+ ## View Types
171
+
172
+ | View | Description | Best Used For |
173
+ |------|-------------|---------------|
174
+ | rounded | Standard rounded corners | Most dashboard cards, metrics |
175
+ | stacking | Stackable layout style | Dense layouts, card groups |
176
+
177
+ ## AI Agent Guidelines
178
+
179
+ ### ✅ Recommended Patterns
180
+ - Use meaningful titles that clearly describe the metric
181
+ - Include `extraMetric` to show trends or comparisons
182
+ - Add `tooltip` for complex metrics that need explanation
183
+ - Use `loading={true}` during data fetching
184
+ - Group related metrics using consistent `view` types
185
+ - Use `focus={true}` to highlight the most important metric
186
+
187
+ ### ❌ Common Mistakes to Avoid
188
+ - Don't show raw loading states without proper loading prop
189
+ - Avoid very long titles - keep them concise
190
+ - Don't mix view types randomly in the same layout
191
+ - Don't use collapse for simple content that doesn't need hiding
192
+ - Avoid putting too much content in children - keep it focused
193
+
194
+ ### Integration Tips
195
+ - Works well in dashboard grid layouts
196
+ - Combine with charts and graphs in children content
197
+ - Use consistent color schemes for extraMetric across related cards
198
+ - Good for KPI displays and analytics dashboards
199
+ - Can contain other components like charts, lists, or buttons
200
+
201
+ ## Color Coding for Extra Metrics
202
+
203
+ ```tsx
204
+ // Semantic colors for trends
205
+ const getTrendColor = (value: number) => {
206
+ if (value > 0) return '#22c55e'; // Green for positive
207
+ if (value < 0) return '#ef4444'; // Red for negative
208
+ return '#64748b'; // Gray for neutral
209
+ };
210
+
211
+ <CardMetric
212
+ title="Sales Growth"
213
+ metric="$45,000"
214
+ extraMetric={`${trend > 0 ? '+' : ''}${trend}%`}
215
+ extraMetricColor={getTrendColor(trend)}
216
+ />
217
+ ```
218
+
219
+ ## Common Patterns
220
+
221
+ ### Dashboard Grid
222
+ ```tsx
223
+ function Dashboard() {
224
+ const metrics = [
225
+ { title: 'Total Sales', value: '$125,400', change: '+12%', positive: true },
226
+ { title: 'New Customers', value: '1,234', change: '+8%', positive: true },
227
+ { title: 'Bounce Rate', value: '32%', change: '-2%', positive: true },
228
+ { title: 'Avg. Order', value: '$89', change: '+5%', positive: true },
229
+ ];
230
+
231
+ return (
232
+ <div className="dashboard-grid">
233
+ {metrics.map(metric => (
234
+ <CardMetric
235
+ key={metric.title}
236
+ title={metric.title}
237
+ metric={metric.value}
238
+ extraMetric={metric.change}
239
+ extraMetricColor={metric.positive ? '#22c55e' : '#ef4444'}
240
+ />
241
+ ))}
242
+ </div>
243
+ );
244
+ }
245
+ ```
246
+
247
+ ### Detailed Analytics Card
248
+ ```tsx
249
+ <CardMetric
250
+ title="Website Performance"
251
+ metric="98.2%"
252
+ extraMetric="Last 24h"
253
+ collapse={{ isCollapsed: false }}
254
+ tooltip="Overall website performance score based on speed, accessibility, and SEO"
255
+ >
256
+ <div>
257
+ <div style={{ marginBottom: '12px' }}>
258
+ <strong>Performance Breakdown:</strong>
259
+ </div>
260
+ <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '8px' }}>
261
+ <div>Speed: 95%</div>
262
+ <div>Accessibility: 100%</div>
263
+ <div>SEO: 98%</div>
264
+ <div>Best Practices: 100%</div>
265
+ </div>
266
+ </div>
267
+ </CardMetric>
268
+ ```
269
+
270
+ ## Related Components
271
+ - StatisticCard - alternative metric display component
272
+ - Badge - for status indicators within cards
273
+ - Spinner - used internally for loading states
274
+ - Tooltip - used internally for info tooltips
275
+ - Button - commonly used in headerExtra
276
+
277
+ ---