cyberui-2045 2.1.0 → 2.2.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.
@@ -1,120 +1,206 @@
1
- // Consumer-facing AI usage guide for cyberui-2045.
2
- // Injected into CLAUDE.md / .cursorrules / copilot-instructions.md by `init`.
3
-
4
- export function getUsageContent(version = '1.4.0') {
5
- return `## CyberUI (cyberui-2045 v${version})
6
-
7
- Cyberpunk-themed React UI library. Docs & live examples: https://patrickkuei.github.io/CyberUI
8
-
9
- ### Setup
10
-
11
- \`\`\`bash
12
- npm install cyberui-2045
13
- \`\`\`
14
-
15
- \`\`\`tsx
16
- // Import styles once in your app entry (e.g. main.tsx)
17
- import 'cyberui-2045/styles.css';
18
-
19
- // Import components
20
- import { Button, Card, Modal } from 'cyberui-2045';
21
- \`\`\`
22
-
23
- ### Component Reference
24
-
25
- | Component | Category | Storybook |
26
- |-----------|----------|-----------|
27
- | Button | Forms | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-button--docs |
28
- | Input | Forms | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-input--docs |
29
- | Select | Forms | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-select--docs |
30
- | Toggle | Forms | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-toggle--docs |
31
- | Card | Layout | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-card--docs |
32
- | Modal | Layout | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-modal--docs |
33
- | Badge | Feedback | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-badge--docs |
34
- | Notification | Feedback | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-notification--docs |
35
- | Skeleton | Feedback | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-skeleton--docs |
36
- | CircularProgress | Progress | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-circularprogress--docs |
37
- | LinearProgress | Progress | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-linearprogress--docs |
38
- | SegmentedProgress | Progress | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-segmentedprogress--docs |
39
- | TabNavigation | Navigation | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-tabnavigation--docs |
40
- | Carousel | Navigation | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-carousel--docs |
41
- | Image | Media | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-image--docs |
42
- | Checkbox | Forms | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-checkbox--docs |
43
- | Divider | Layout | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-divider--docs |
44
- | GradientText | Typography | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-gradienttext--docs |
45
- | SectionTitle | Typography | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-sectiontitle--docs |
46
- | Steps | Navigation | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-steps--docs |
47
- | Timeline | Display | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-timeline--docs |
48
-
49
- ### Hooks
50
-
51
- \`\`\`tsx
52
- import { useCyberNotifications, useAnimatedProgress, useCyberScrollbar } from 'cyberui-2045';
53
-
54
- // Trigger toast notifications
55
- const { notify } = useCyberNotifications();
56
- notify({ message: 'Hack complete', variant: 'success' });
57
-
58
- // Animated numeric counter for progress displays
59
- const value = useAnimatedProgress(targetValue, { duration: 800 });
60
-
61
- // Apply cyberpunk scrollbar styles to an element
62
- const ref = useCyberScrollbar<HTMLDivElement>();
63
- \`\`\`
64
-
65
- ### Notifications (requires provider)
66
-
67
- \`\`\`tsx
68
- import { CyberNotificationProvider, useCyberNotifications } from 'cyberui-2045';
69
-
70
- // Wrap your app
71
- <CyberNotificationProvider>
72
- <App />
73
- </CyberNotificationProvider>
74
-
75
- // Then anywhere inside:
76
- const { notify } = useCyberNotifications();
77
- notify({ message: 'Access granted', variant: 'success', duration: 3000 });
78
- // variants: 'primary' | 'secondary' | 'accent' | 'success' | 'error' | 'warning'
79
- \`\`\`
80
-
81
- ### ThemingCSS token overrides
82
-
83
- Override in your global CSS (after importing cyberui-2045/styles.css):
84
-
85
- \`\`\`css
86
- :root {
87
- --color-primary: #ff0055; /* neon pink */
88
- --color-secondary: #00fff9; /* cyan */
89
- --color-accent: #fbff00; /* yellow */
90
- --color-success: #00ff88; /* green */
91
- --color-error: #ff4444; /* red */
92
- --color-warning: #ff8800; /* orange */
93
- --color-background: #0a0a0f; /* dark bg */
94
- --color-surface: #12121a; /* card bg */
95
- --color-border: #2a2a3a; /* borders */
96
- --color-text: #e0e0ff; /* body text */
97
- --color-text-muted: #6b6b8a; /* muted text */
98
- }
99
- \`\`\`
100
-
101
- ### className overrides
102
-
103
- All components accept a \`className\` prop. Classes are merged via \`twMerge\` — your classes win on conflict.
104
-
105
- \`\`\`tsx
106
- // Layout overrides (safe — doesn't break variant identity)
107
- <Button className="w-full mt-4">Submit</Button>
108
-
109
- // Color/variant overrides (you own visual coherence)
110
- <Button variant="primary" className="bg-purple-600">Custom</Button>
111
- \`\`\`
112
-
113
- ### cn() utility (re-exported)
114
-
115
- \`\`\`tsx
116
- import { cn } from 'cyberui-2045';
117
- // clsx + tailwind-merge use for composing className strings in your own components
118
- const cls = cn('base-class', isActive && 'active', className);
119
- \`\`\``;
120
- }
1
+ // Consumer-facing AI usage guide for cyberui-2045.
2
+ // Injected into CLAUDE.md / .cursorrules / copilot-instructions.md by `init`.
3
+
4
+ export function getUsageContent(version = '2.2.0') {
5
+ return `## CyberUI (cyberui-2045 v${version})
6
+
7
+ Cyberpunk-themed React UI library. Docs & live examples: https://patrickkuei.github.io/CyberUI/storybook/
8
+
9
+ ### Setup
10
+
11
+ \`\`\`bash
12
+ npm install cyberui-2045
13
+ \`\`\`
14
+
15
+ \`\`\`tsx
16
+ // ⚠️ REQUIRED: import styles once in your app entry (e.g. main.tsx / index.tsx)
17
+ // Without this ALL components lose colors, backgrounds, and animations.
18
+ import 'cyberui-2045/styles.css';
19
+
20
+ // Import components — always from the root, never from subpaths
21
+ import { Button, Card, Modal } from 'cyberui-2045';
22
+ \`\`\`
23
+
24
+ ⚠️ Do NOT import from \`cyberui-2045/components/Button\` or similar subpaths — root only.
25
+ ⚠️ If styles look broken or text is invisible, \`cyberui-2045/styles.css\` is missing from the app entry.
26
+
27
+ ### Component Reference
28
+
29
+ | Component | Category | Storybook |
30
+ |-----------|----------|-----------|
31
+ | Button | Forms | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-button--docs |
32
+ | Input | Forms | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-input--docs |
33
+ | Select | Forms | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-select--docs |
34
+ | Toggle | Forms | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-toggle--docs |
35
+ | Checkbox | Forms | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-checkbox--docs |
36
+ | Card | Layout | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-card--docs |
37
+ | Modal | Layout | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-modal--docs |
38
+ | Divider | Layout | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-divider--docs |
39
+ | Badge | Feedback | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-badge--docs |
40
+ | Notification | Feedback | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-notification--docs |
41
+ | Skeleton | Feedback | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-skeleton--docs |
42
+ | CircularProgress | Progress | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-circularprogress--docs |
43
+ | LinearProgress | Progress | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-linearprogress--docs |
44
+ | SegmentedProgress | Progress | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-segmentedprogress--docs |
45
+ | TabNavigation | Navigation | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-tabnavigation--docs |
46
+ | Carousel | Navigation | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-carousel--docs |
47
+ | Steps | Navigation | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-steps--docs |
48
+ | GradientText | Typography | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-gradienttext--docs |
49
+ | SectionTitle | Typography | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-sectiontitle--docs |
50
+ | Timeline | Display | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-timeline--docs |
51
+ | Image | Media | https://patrickkuei.github.io/CyberUI/storybook/?path=/docs/components-image--docs |
52
+
53
+ ### Critical API notes (read before coding)
54
+
55
+ \`\`\`tsx
56
+ // Button — variants: 'primary' | 'secondary' | 'danger' | 'ghost' (NO 'accent')
57
+ <Button variant="primary">Jack In</Button>
58
+ <Button variant="danger">Purge</Button>
59
+
60
+ // Badge — uses children, NOT a label prop
61
+ <Badge variant="success">Online</Badge>
62
+ <Badge variant="error">Offline</Badge>
63
+ // variants: 'primary' | 'secondary' | 'accent' | 'success' | 'error' | 'warning'
64
+
65
+ // CircularProgress — use size prop (sm/md/lg/xl); prop is 'progress' not 'value'
66
+ // center content goes as children; do NOT pass a large radius — default 20 is correct
67
+ <CircularProgress progress={75} size="md">
68
+ <span className="text-xs font-mono text-accent">75%</span>
69
+ </CircularProgress>
70
+
71
+ // LinearProgress — prop is 'progress' (not 'value'); fills container width (w-full) by default
72
+ // wrap in a constrained div to control width
73
+ <LinearProgress progress={60} />
74
+ <div className="w-64"><LinearProgress progress={60} /></div>
75
+
76
+ // SegmentedProgress use size prop (sm/md/lg/xl); fills container without it
77
+ <SegmentedProgress progress={80} size="md">
78
+ <span className="text-accent font-bold text-xs">80%</span>
79
+ </SegmentedProgress>
80
+
81
+ // TabNavigationtabs is a plain string array (NOT {id, label}[])
82
+ <TabNavigation
83
+ tabs={['Overview', 'Stats', 'History']}
84
+ activeTab="Overview"
85
+ onTabChange={setTab}
86
+ />
87
+
88
+ // SectionTitle — NO subtitle prop; use children for the heading text
89
+ <SectionTitle>System Status</SectionTitle>
90
+
91
+ // Select — use onValueChange for a simple string callback (like Toggle/Checkbox pattern)
92
+ // or use standard HTML onChange for the raw event
93
+ <Select
94
+ options={[{ value: 'a', label: 'Option A' }]}
95
+ onValueChange={(val) => setSelected(val)}
96
+ />
97
+
98
+ // Toggle — onChange receives boolean directly
99
+ <Toggle checked={on} onChange={setOn} />
100
+
101
+ // Checkbox — use onCheckedChange for a simple boolean callback
102
+ <Checkbox checked={val} onCheckedChange={setVal} />
103
+
104
+ // Modal — default size is 'lg' (672px); use 'xl' for forms/tables, 'sm' only for simple alerts
105
+ // variant="danger" for destructive confirmations
106
+ <Modal title="Settings" size="lg" isOpen={open} onClose={close}>
107
+ content here
108
+ </Modal>
109
+ <Modal variant="danger" title="Delete?" size="md" onConfirm={handleDelete} onCancel={close}>
110
+ This cannot be undone.
111
+ </Modal>
112
+
113
+ // Card supports onClick and all standard div HTML attributes
114
+ <Card onClick={() => select(item)}>content</Card>
115
+
116
+ // Image preview={true} must be explicit to enable click-to-expand fullscreen (disabled by default)
117
+ <Image src="/photo.jpg" alt="Description" size="md" preview={true} />
118
+
119
+ // Carousel — images takes CarouselImageData[]: { src, alt, fallbackSrc?, caption? }
120
+ <Carousel
121
+ images={[
122
+ { src: 'img1.jpg', alt: 'Cyber City', caption: 'Night District' },
123
+ { src: 'img2.jpg', alt: 'Neon Lights', fallbackSrc: 'fallback.jpg' }
124
+ ]}
125
+ currentIndex={idx}
126
+ onIndexChange={setIdx}
127
+ />
128
+
129
+ // Steps — current is 0-BASED. First step = current={0}, second = current={1}.
130
+ // Passing 1-based values is a common mistake that skips the first step.
131
+ <Steps
132
+ current={0}
133
+ items={[{ title: 'Login' }, { title: 'Verify' }, { title: 'Complete' }]}
134
+ />
135
+ \`\`\`
136
+
137
+ ### Hooks
138
+
139
+ \`\`\`tsx
140
+ import { useCyberNotifications, useAnimatedProgress, useCyberScrollbar } from 'cyberui-2045';
141
+
142
+ // Toast notifications — showNotification(type, title, message, options?)
143
+ // type: 'success' | 'warning' | 'error'
144
+ const { showNotification } = useCyberNotifications();
145
+ showNotification('success', 'Access Granted', 'Welcome back, runner.');
146
+ showNotification('error', 'Breach Detected', 'Sector 7 compromised.', { duration: 5000 });
147
+
148
+ // Oscillating value for loading/pulse animations (min → max → min loop)
149
+ const value = useAnimatedProgress({ min: 5, max: 95, speed: 30 });
150
+
151
+ // Apply cyberpunk scrollbar styles to a scrollable element
152
+ const ref = useCyberScrollbar<HTMLDivElement>();
153
+ \`\`\`
154
+
155
+ ### Notifications (requires provider)
156
+
157
+ \`\`\`tsx
158
+ import { CyberNotificationProvider, useCyberNotifications } from 'cyberui-2045';
159
+
160
+ // Wrap your app once
161
+ <CyberNotificationProvider>
162
+ <App />
163
+ </CyberNotificationProvider>
164
+
165
+ // Then anywhere inside:
166
+ const { showNotification } = useCyberNotifications();
167
+ showNotification('success', 'Upload Complete', 'Neural data synced.');
168
+ \`\`\`
169
+
170
+ ### Theming — CSS token overrides
171
+
172
+ Override in your global CSS (after importing cyberui-2045/styles.css):
173
+
174
+ \`\`\`css
175
+ :root {
176
+ --color-primary: #ff005d; /* neon pink */
177
+ --color-secondary: #00fff9; /* cyan */
178
+ --color-accent: #fffb00; /* yellow */
179
+ --color-success: #00ff9e; /* green */
180
+ --color-error: #ff4f4f; /* red */
181
+ --color-warning: #ffaa00; /* orange */
182
+ --color-base: #1a1a2e; /* page background */
183
+ --color-surface: #2d2d44; /* card / component surface */
184
+ --color-border-default: #3c3c5e; /* borders */
185
+ --color-default: #e0e0e0; /* primary text */
186
+ --color-muted: #8888aa; /* secondary text */
187
+ --color-inverse: #1a1a2e; /* inverted text */
188
+ }
189
+ \`\`\`
190
+
191
+ ### className overrides
192
+
193
+ All components accept a \`className\` prop merged via \`tailwind-merge\` — your classes win on conflict.
194
+
195
+ \`\`\`tsx
196
+ <Button className="w-full mt-4">Full width</Button>
197
+ \`\`\`
198
+
199
+ ### cn() utility (re-exported)
200
+
201
+ \`\`\`tsx
202
+ import { cn } from 'cyberui-2045';
203
+ // clsx + tailwind-merge — compose className strings in your own components
204
+ const cls = cn('base-class', isActive && 'active', className);
205
+ \`\`\``;
206
+ }
@@ -38,11 +38,11 @@ export interface CarouselCallbacks {
38
38
  * Props for the CyberUI Carousel component
39
39
  *
40
40
  * @example
41
- * // Basic carousel
41
+ * // Basic carousel — images is CarouselImageData[]: { src, alt, fallbackSrc?, caption? }
42
42
  * <Carousel
43
43
  * images={[
44
- * { src: 'img1.jpg', alt: 'Cyber City' },
45
- * { src: 'img2.jpg', alt: 'Neon Lights' }
44
+ * { src: 'img1.jpg', alt: 'Cyber City', caption: 'Night District' },
45
+ * { src: 'img2.jpg', alt: 'Neon Lights', fallbackSrc: 'fallback.jpg' }
46
46
  * ]}
47
47
  * currentIndex={index}
48
48
  * onChange={setIndex}
@@ -2,13 +2,18 @@ import { default as React } from 'react';
2
2
  /**
3
3
  * A circular progress indicator with neon glow effects.
4
4
  *
5
+ * Use the `size` prop for common cases — it constrains the container automatically.
6
+ * Only use `radius` if you need a custom size (radius is in SVG units, viewBox is 50×50).
7
+ *
5
8
  * @example
6
- * // Basic progress
7
- * <CircularProgress progress={75} radius={40} />
9
+ * // Recommended: use size prop
10
+ * <CircularProgress progress={75} size="md">
11
+ * <span className="text-xs font-mono text-accent">75%</span>
12
+ * </CircularProgress>
8
13
  *
9
14
  * @example
10
- * // Progress with label
11
- * <CircularProgress progress={45} radius={60}>
15
+ * // Custom size via className
16
+ * <CircularProgress progress={45} className="w-32 h-32">
12
17
  * <span className="text-accent font-bold">45%</span>
13
18
  * </CircularProgress>
14
19
  */
@@ -18,9 +23,17 @@ export interface CircularProgressProps {
18
23
  */
19
24
  progress: number;
20
25
  /**
21
- * Radius of the circle in pixels.
26
+ * Preset container size. Sets width and height of the component automatically.
27
+ * - sm: 64px, md: 96px, lg: 128px, xl: 160px
28
+ * @default 'md'
29
+ */
30
+ size?: 'sm' | 'md' | 'lg' | 'xl';
31
+ /**
32
+ * Radius of the SVG circle in SVG units (viewBox is 50×50, center at 25,25).
33
+ * Default 20 fits cleanly within the viewBox. Only override for custom layouts.
34
+ * @default 20
22
35
  */
23
- radius: number;
36
+ radius?: number;
24
37
  /** Optional custom class name */
25
38
  className?: string;
26
39
  /** Optional content to render in the center of the circle */
@@ -32,7 +45,7 @@ export interface CircularProgressProps {
32
45
  * A beautiful circular progress indicator with neon glow and dual-tone stroke.
33
46
  *
34
47
  * @example
35
- * <CircularProgress progress={60} radius={20}>
48
+ * <CircularProgress progress={60} size="md">
36
49
  * <span className="text-xs font-mono">60%</span>
37
50
  * </CircularProgress>
38
51
  */
@@ -55,7 +55,11 @@ export interface ImageProps extends Omit<React.ImgHTMLAttributes<HTMLImageElemen
55
55
  alt: string;
56
56
  /** Size of the image container */
57
57
  size?: ResponsiveValue<ImageSize>;
58
- /** Enable click-to-expand preview functionality */
58
+ /**
59
+ * Enable click-to-expand fullscreen preview on click.
60
+ * Must be explicitly set to `true` — disabled by default.
61
+ * @default false
62
+ */
59
63
  preview?: boolean;
60
64
  /** Fallback image URL when main image fails to load */
61
65
  fallback?: string;
@@ -31,14 +31,18 @@ export interface LinearProgressProps {
31
31
  /**
32
32
  * A sleek, animated linear progress bar with cyberpunk aesthetic.
33
33
  *
34
+ * The bar is `w-full` by default — it fills its container width.
35
+ * Wrap it in a constrained element to control its width.
36
+ *
34
37
  * @example
35
- * <LinearProgress progress={75} variant="primary" />
38
+ * // Full-width bar (fills parent)
39
+ * <LinearProgress progress={75} />
36
40
  *
37
41
  * @example
38
- * <LinearProgress
39
- * progress={kbytesLoaded}
40
- * size={{ base: 'sm', lg: 'md' }}
41
- * />
42
+ * // Width-constrained
43
+ * <div className="w-64">
44
+ * <LinearProgress progress={kbytesLoaded} size={{ base: 'sm', lg: 'md' }} />
45
+ * </div>
42
46
  */
43
47
  declare const LinearProgress: React.FC<LinearProgressProps>;
44
48
  export default LinearProgress;
@@ -52,7 +52,9 @@ export interface ModalProps extends ModalCallbacks {
52
52
  showConfirm?: boolean;
53
53
  /**
54
54
  * Width of the modal.
55
- * @default 'md'
55
+ * - sm: 448px, md: 512px, lg: 672px, xl: 896px
56
+ * Use `lg` or `xl` for content-heavy modals (forms, tables, multi-step flows).
57
+ * @default 'lg'
56
58
  */
57
59
  size?: "sm" | "md" | "lg" | "xl" | "fullscreen";
58
60
  /**
@@ -2,13 +2,15 @@ import { default as React } from 'react';
2
2
  /**
3
3
  * A circular progress indicator divided into segments.
4
4
  *
5
+ * Use the `size` prop to control dimensions — without it the component fills its container.
6
+ *
5
7
  * @example
6
- * // Basic segmented progress
7
- * <SegmentedProgress progress={30} />
8
+ * // Recommended: use size prop
9
+ * <SegmentedProgress progress={30} size="md" />
8
10
  *
9
11
  * @example
10
- * // Segmented progress with center content
11
- * <SegmentedProgress progress={80}>
12
+ * // With center content
13
+ * <SegmentedProgress progress={80} size="lg">
12
14
  * <div className="text-center">
13
15
  * <div className="text-2xl font-bold text-accent">80%</div>
14
16
  * <div className="text-xs text-muted">LOADED</div>
@@ -20,6 +22,12 @@ export interface SegmentedProgressProps {
20
22
  * Progress value (0-100).
21
23
  */
22
24
  progress: number;
25
+ /**
26
+ * Preset container size. Sets width and height automatically.
27
+ * - sm: 64px, md: 96px, lg: 128px, xl: 160px
28
+ * @default 'md'
29
+ */
30
+ size?: 'sm' | 'md' | 'lg' | 'xl';
23
31
  /** Optional custom class name */
24
32
  className?: string;
25
33
  /** Optional content to render in the center of the segments */
@@ -29,7 +37,7 @@ export interface SegmentedProgressProps {
29
37
  * A highly technical, segmented radial progress indicator reminiscent of radar or power gauges.
30
38
  *
31
39
  * @example
32
- * <SegmentedProgress progress={45}>
40
+ * <SegmentedProgress progress={45} size="md">
33
41
  * <div className="text-primary font-bold">LVL 4</div>
34
42
  * </SegmentedProgress>
35
43
  */
@@ -55,6 +55,11 @@ export interface SelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectE
55
55
  error?: string;
56
56
  /** Optional custom class name */
57
57
  className?: string;
58
+ /**
59
+ * Convenience callback that receives the selected string value directly.
60
+ * Use instead of onChange when you only need the value (not the raw event).
61
+ */
62
+ onValueChange?: (value: string) => void;
58
63
  }
59
64
  /**
60
65
  * A futuristic Cyberpunk-themed dropdown select component with support for labels and error states.
@@ -57,7 +57,8 @@ export interface StepsProps {
57
57
  */
58
58
  items: StepItem[];
59
59
  /**
60
- * Current active step index (0-based). Used to derive status when individual step status is not set.
60
+ * Current active step index. **0-based** first step is `current={0}`, second is `current={1}`.
61
+ * A common mistake is passing a 1-based value which skips the first step.
61
62
  * @default 0
62
63
  */
63
64
  current?: number;
@@ -47,5 +47,7 @@ export { useCyberScrollbar } from '../hooks/useCyberScrollbar';
47
47
  export type { UseCyberScrollbarOptions } from '../hooks/useCyberScrollbar';
48
48
  export { useCyberNotifications } from '../hooks/useCyberNotifications';
49
49
  export type { CyberNotification, NotificationOptions } from '../hooks/useCyberNotifications';
50
+ export { useAnimatedProgress } from '../hooks/useAnimatedProgress';
51
+ export type { UseAnimatedProgressOptions } from '../hooks/useAnimatedProgress';
50
52
  export { CyberNotificationProvider } from '../contexts/NotificationContext';
51
53
  export type { CyberNotificationProviderProps } from '../contexts/NotificationContext';