@shohojdhara/atomix 0.3.14 → 0.3.15

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 (173) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/build-tools/EXAMPLES.md +372 -0
  3. package/build-tools/README.md +242 -0
  4. package/build-tools/__tests__/error-handler.test.js +230 -0
  5. package/build-tools/__tests__/index.test.js +141 -0
  6. package/build-tools/__tests__/rollup-plugin.test.js +194 -0
  7. package/build-tools/__tests__/utils.test.js +161 -0
  8. package/build-tools/__tests__/vite-plugin.test.js +129 -0
  9. package/build-tools/__tests__/webpack-loader.test.js +190 -0
  10. package/build-tools/error-handler.js +308 -0
  11. package/build-tools/index.d.ts +43 -0
  12. package/build-tools/index.js +88 -0
  13. package/build-tools/package.json +67 -0
  14. package/build-tools/rollup-plugin.js +236 -0
  15. package/build-tools/types.d.ts +163 -0
  16. package/build-tools/utils.js +203 -0
  17. package/build-tools/vite-plugin.js +161 -0
  18. package/build-tools/webpack-loader.js +123 -0
  19. package/dist/atomix.css +203 -90
  20. package/dist/atomix.css.map +1 -1
  21. package/dist/atomix.min.css +3 -3
  22. package/dist/atomix.min.css.map +1 -1
  23. package/dist/build-tools/EXAMPLES.md +372 -0
  24. package/dist/build-tools/README.md +242 -0
  25. package/dist/build-tools/__tests__/error-handler.test.js +230 -0
  26. package/dist/build-tools/__tests__/index.test.js +141 -0
  27. package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
  28. package/dist/build-tools/__tests__/utils.test.js +161 -0
  29. package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
  30. package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
  31. package/dist/build-tools/error-handler.js +308 -0
  32. package/dist/build-tools/index.d.ts +43 -0
  33. package/dist/build-tools/index.js +88 -0
  34. package/dist/build-tools/package.json +67 -0
  35. package/dist/build-tools/rollup-plugin.js +236 -0
  36. package/dist/build-tools/types.d.ts +163 -0
  37. package/dist/build-tools/utils.js +203 -0
  38. package/dist/build-tools/vite-plugin.js +161 -0
  39. package/dist/build-tools/webpack-loader.js +123 -0
  40. package/dist/charts.d.ts +1 -1
  41. package/dist/charts.js +86 -57
  42. package/dist/charts.js.map +1 -1
  43. package/dist/core.d.ts +1 -1
  44. package/dist/core.js +136 -112
  45. package/dist/core.js.map +1 -1
  46. package/dist/forms.d.ts +2 -5
  47. package/dist/forms.js +140 -128
  48. package/dist/forms.js.map +1 -1
  49. package/dist/heavy.d.ts +1 -1
  50. package/dist/heavy.js +136 -112
  51. package/dist/heavy.js.map +1 -1
  52. package/dist/index.d.ts +9 -61
  53. package/dist/index.esm.js +237 -286
  54. package/dist/index.esm.js.map +1 -1
  55. package/dist/index.js +250 -299
  56. package/dist/index.js.map +1 -1
  57. package/dist/index.min.js +1 -1
  58. package/dist/index.min.js.map +1 -1
  59. package/package.json +23 -8
  60. package/scripts/atomix-cli.js +170 -73
  61. package/scripts/cli/__tests__/README.md +81 -0
  62. package/scripts/cli/__tests__/basic.test.js +115 -0
  63. package/scripts/cli/__tests__/component-generator.test.js +332 -0
  64. package/scripts/cli/__tests__/integration.test.js +327 -0
  65. package/scripts/cli/__tests__/test-setup.js +133 -0
  66. package/scripts/cli/__tests__/token-manager.test.js +251 -0
  67. package/scripts/cli/__tests__/utils.test.js +161 -0
  68. package/scripts/cli/component-generator.js +253 -299
  69. package/scripts/cli/dependency-checker.js +355 -0
  70. package/scripts/cli/interactive-init.js +46 -5
  71. package/scripts/cli/template-manager.js +0 -2
  72. package/scripts/cli/templates/common-templates.js +636 -0
  73. package/scripts/cli/templates/composable-templates.js +148 -126
  74. package/scripts/cli/templates/index.js +23 -16
  75. package/scripts/cli/templates/project-templates.js +151 -23
  76. package/scripts/cli/templates/react-templates.js +280 -210
  77. package/scripts/cli/templates/scss-templates.js +90 -91
  78. package/scripts/cli/templates/testing-templates.js +206 -27
  79. package/scripts/cli/templates/testing-utils.js +278 -0
  80. package/scripts/cli/templates/types-templates.js +70 -56
  81. package/scripts/cli/theme-bridge.js +8 -2
  82. package/scripts/cli/token-manager.js +318 -206
  83. package/scripts/cli/utils.js +0 -1
  84. package/src/components/Accordion/Accordion.stories.tsx +369 -870
  85. package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
  86. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
  87. package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
  88. package/src/components/AtomixGlass/glass-utils.ts +2 -2
  89. package/src/components/AtomixGlass/shader-utils.ts +5 -0
  90. package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
  91. package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
  92. package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
  93. package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
  94. package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
  95. package/src/components/AtomixGlass/stories/Playground.stories.tsx +50 -35
  96. package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +1 -1
  97. package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
  98. package/src/components/Avatar/Avatar.stories.tsx +213 -1
  99. package/src/components/Badge/Badge.stories.tsx +121 -362
  100. package/src/components/Block/Block.stories.tsx +21 -12
  101. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +141 -23
  102. package/src/components/Button/Button.stories.tsx +463 -1126
  103. package/src/components/Button/Button.test.tsx +107 -0
  104. package/src/components/Button/Button.tsx +46 -50
  105. package/src/components/Button/ButtonGroup.stories.tsx +373 -217
  106. package/src/components/Callout/Callout.stories.tsx +289 -634
  107. package/src/components/Card/Card.stories.tsx +248 -68
  108. package/src/components/Chart/Chart.stories.tsx +150 -8
  109. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +151 -69
  110. package/src/components/Countdown/Countdown.stories.tsx +115 -8
  111. package/src/components/DataTable/DataTable.stories.tsx +346 -146
  112. package/src/components/DatePicker/DatePicker.stories.tsx +325 -1066
  113. package/src/components/Dropdown/Dropdown.stories.tsx +153 -33
  114. package/src/components/EdgePanel/EdgePanel.stories.tsx +230 -21
  115. package/src/components/Footer/Footer.stories.tsx +392 -328
  116. package/src/components/Form/Checkbox.stories.tsx +140 -6
  117. package/src/components/Form/Checkbox.test.tsx +63 -0
  118. package/src/components/Form/Checkbox.tsx +87 -51
  119. package/src/components/Form/Form.stories.tsx +119 -20
  120. package/src/components/Form/FormGroup.stories.tsx +127 -4
  121. package/src/components/Form/Radio.stories.tsx +140 -5
  122. package/src/components/Form/Select.stories.tsx +140 -8
  123. package/src/components/Form/Textarea.stories.tsx +149 -6
  124. package/src/components/Hero/Hero.stories.tsx +333 -32
  125. package/src/components/List/List.stories.tsx +141 -3
  126. package/src/components/Modal/Modal.stories.tsx +181 -42
  127. package/src/components/Popover/Popover.stories.tsx +448 -98
  128. package/src/components/Progress/Progress.stories.tsx +167 -5
  129. package/src/components/River/River.stories.tsx +1 -1
  130. package/src/components/SectionIntro/SectionIntro.stories.tsx +240 -48
  131. package/src/components/Spinner/Spinner.stories.tsx +102 -8
  132. package/src/components/Steps/Steps.stories.tsx +172 -43
  133. package/src/components/Tabs/Tabs.stories.tsx +136 -10
  134. package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
  135. package/src/components/Todo/Todo.stories.tsx +198 -9
  136. package/src/components/Toggle/Toggle.stories.tsx +126 -39
  137. package/src/components/Tooltip/Tooltip.stories.tsx +194 -104
  138. package/src/components/Upload/Upload.stories.tsx +113 -24
  139. package/src/lib/README.md +2 -2
  140. package/src/lib/__tests__/theme-tools.test.ts +193 -0
  141. package/src/lib/composables/index.ts +2 -2
  142. package/src/lib/composables/useAtomixGlass.ts +28 -56
  143. package/src/lib/composables/useChartExport.ts +2 -7
  144. package/src/lib/composables/useDataTable.ts +46 -29
  145. package/src/lib/constants/components.ts +9 -32
  146. package/src/lib/theme/devtools/CLI.ts +1 -1
  147. package/src/lib/types/components.ts +1 -1
  148. package/src/lib/utils/__tests__/csv.test.ts +45 -0
  149. package/src/lib/utils/csv.ts +17 -0
  150. package/src/lib/utils/dataTableExport.ts +1 -10
  151. package/src/styles/01-settings/_index.scss +2 -1
  152. package/src/styles/01-settings/_settings.accordion.scss +28 -7
  153. package/src/styles/01-settings/_settings.colors.scss +11 -11
  154. package/src/styles/01-settings/_settings.typography.scss +5 -5
  155. package/src/styles/02-tools/_tools.utility-api.scss +14 -0
  156. package/src/styles/06-components/_components.accordion.scss +56 -14
  157. package/src/styles/06-components/_components.checkbox.scss +23 -17
  158. package/src/styles/99-utilities/_index.scss +2 -0
  159. package/src/styles/99-utilities/_utilities.scss +3 -1
  160. package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
  161. package/themes/dark-complementary/README.md +98 -0
  162. package/themes/dark-complementary/index.scss +158 -0
  163. package/themes/default-light/README.md +81 -0
  164. package/themes/default-light/index.scss +154 -0
  165. package/themes/high-contrast/README.md +105 -0
  166. package/themes/high-contrast/index.scss +172 -0
  167. package/themes/test-theme/README.md +38 -0
  168. package/themes/test-theme/index.scss +47 -0
  169. package/scripts/cli/templates-original-backup.js +0 -1655
  170. package/scripts/cli/templates_backup.js +0 -684
  171. package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
  172. package/src/lib/composables/useButton.ts +0 -93
  173. package/src/lib/composables/useCheckbox.ts +0 -70
@@ -52,241 +52,141 @@ export interface BackgroundWrapperProps {
52
52
  'aria-hidden'?: 'true' | 'false' | boolean;
53
53
  }
54
54
 
55
- /**
56
- * Interactive Story Container
57
- *
58
- * A container that provides mouse tracking and interactive background effects
59
- * for enhanced storytelling and demonstration purposes.
60
- */
61
- export interface StoryContainerProps {
62
- children: React.ReactNode;
63
- style?: React.CSSProperties;
64
- interactive?: boolean;
65
- }
66
-
67
- /**
68
- * Interactive Wrapper Component
69
- *
70
- * Provides mouse position tracking and offset calculations for interactive stories
71
- */
72
- export interface InteractiveWrapperProps {
73
- children: (
74
- mousePos: { x: number; y: number },
75
- mouseOffset: { x: number; y: number },
76
- containerRef: RefObject<HTMLDivElement>
77
- ) => React.ReactNode;
78
- }
79
-
80
- /**
81
- * Collection of high-quality background images for different moods and scenarios
82
- *
83
- * This array provides a variety of background options that work well with the
84
- * AtomixGlass component, showcasing different visual styles and contexts.
85
- */
86
- export const backgroundImages = [
87
- // 0: Modern office interior with natural lighting
88
- 'https://images.pexels.com/photos/5653101/pexels-photo-5653101.jpeg',
89
- // 1: Beautiful natural landscape - mountains and lake
90
- 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
91
- // 2: Urban cityscape with modern buildings
92
- 'https://images.unsplash.com/photo-1477959858617-67f85cf4f1df?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
93
- // 3: Forest path with sunlight filtering through trees
94
- 'https://images.unsplash.com/photo-1441974231531-c6227db76b6e?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
95
- // 4: Ocean waves and beach scene
96
- 'https://images.unsplash.com/photo-1505142468610-359e7d316be0?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
97
- // 5: Modern architecture with glass facades
98
- 'https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
99
- // 6: Cozy café interior with warm lighting
100
- 'https://images.unsplash.com/photo-1554118811-1e0d58224f24?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
101
- // 7: Desert landscape with dramatic sky
102
- 'https://images.unsplash.com/photo-1509316785289-025f5b846b35?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
103
- // 8: Tropical paradise with palm trees and ocean
104
- 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
105
- // 9: Modern library or workspace with natural light
106
- 'https://images.unsplash.com/photo-1521587760476-6c12a4b040da?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
107
- ];
108
-
109
- /**
110
- * BackgroundWrapper Component Implementation
111
- *
112
- * Renders a container with a background image and optional overlay,
113
- * providing a consistent environment for showcasing the AtomixGlass component.
114
- *
115
- * @param props - BackgroundWrapperProps
116
- * @returns JSX.Element
117
- */
118
- export const BackgroundWrapper = ({
55
+ export const BackgroundWrapper: React.FC<BackgroundWrapperProps> = ({
119
56
  children,
120
57
  backgroundImage,
121
58
  backgroundIndex,
122
59
  overlay = false,
123
- overlayColor = 'rgba(0,0,0,0)',
124
- overlayOpacity = 0,
125
- height = '97vh',
126
- width = '97vw',
127
- borderRadius = '12px',
60
+ overlayColor = 'rgba(0, 0, 0, 0.5)',
61
+ overlayOpacity = 0.5,
62
+ height = '100vh',
63
+ width = '100vw',
64
+ borderRadius = '0',
65
+ padding = '0',
128
66
  className = '',
129
67
  style = {},
130
- }: BackgroundWrapperProps) => {
131
- // If backgroundIndex is provided, use it to select from the backgroundImages array
68
+ interactive = false,
69
+ 'aria-hidden': ariaHidden,
70
+ }) => {
71
+ // Use the background image if provided, otherwise use the indexed one from backgroundImages
132
72
  const bgImage =
133
- backgroundIndex !== undefined ? backgroundImages[backgroundIndex] : backgroundImage;
134
-
135
- // Apply default overlay settings if overlay flag is true using nullish coalescing
136
- const finalOverlayColor = overlay ? 'rgba(0,0,0,0.5)' : (overlayColor ?? 'rgba(0,0,0,0)');
137
- const finalOverlayOpacity = overlay ? 0.5 : (overlayOpacity ?? 0);
73
+ backgroundImage ||
74
+ (backgroundIndex !== undefined ? backgroundImages[backgroundIndex] : backgroundImages[0]);
75
+
76
+ const bgStyle = {
77
+ backgroundImage: bgImage ? `url(${bgImage})` : undefined,
78
+ height,
79
+ width,
80
+ borderRadius,
81
+ padding,
82
+ ...style,
83
+ };
138
84
 
139
85
  return (
140
86
  <div
141
- className={`c-atomix-glass-background ${className}`}
142
- style={{
143
- position: 'relative',
144
- height: height,
145
- width: width,
146
- backgroundColor: !bgImage ? '#1a1a2e' : undefined, // Fallback color if no image
147
- background: bgImage ? `url(${bgImage})` : undefined,
148
- backgroundSize: 'cover',
149
- backgroundPosition: 'center',
150
- backgroundAttachment: 'fixed',
151
- display: 'flex',
152
- alignItems: 'center',
153
- justifyContent: 'center',
154
- borderRadius: borderRadius,
155
- overflow: 'auto',
156
- ...style,
157
- }}
87
+ className={`u-relative u-overflow-hidden ${className}`}
88
+ style={bgStyle}
89
+ aria-hidden={ariaHidden}
158
90
  >
159
- {/* Overlay */}
160
- {(finalOverlayOpacity > 0 || overlay) && (
91
+ {overlay && (
161
92
  <div
93
+ className="u-absolute u-inset-0"
162
94
  style={{
163
- position: 'absolute',
164
- inset: 0,
165
- backgroundColor: finalOverlayColor,
166
- opacity: finalOverlayOpacity,
167
- borderRadius: borderRadius,
168
- pointerEvents: 'none',
95
+ backgroundColor: overlayColor,
96
+ opacity: overlayOpacity,
169
97
  }}
170
98
  />
171
99
  )}
172
- <div
173
- style={{
174
- position: 'relative',
175
- width: '100%',
176
- height: '100%',
177
- display: 'flex',
178
- alignItems: 'center',
179
- justifyContent: 'center',
180
- color: 'white',
181
- }}
182
- >
183
- {children}
184
- </div>
100
+ <div className="u-relative u-z-10">{children}</div>
185
101
  </div>
186
102
  );
187
103
  };
188
104
 
189
105
  /**
190
- * Interactive Story Container Component
106
+ * Interactive Story Container
191
107
  *
192
108
  * A container that provides mouse tracking and interactive background effects
193
109
  * for enhanced storytelling and demonstration purposes.
194
110
  */
195
- export const StoryContainer = ({
111
+ export interface StoryContainerProps {
112
+ children: React.ReactNode;
113
+ className?: string;
114
+ style?: React.CSSProperties;
115
+ parallax?: boolean;
116
+ parallaxStrength?: number;
117
+ }
118
+
119
+ export const StoryContainer: React.FC<StoryContainerProps> = ({
196
120
  children,
121
+ className = '',
197
122
  style = {},
198
- interactive = false,
199
- }: StoryContainerProps) => {
123
+ parallax = false,
124
+ parallaxStrength = 20,
125
+ }) => {
200
126
  const containerRef = useRef<HTMLDivElement>(null);
201
- const [backgroundPosition, setBackgroundPosition] = useState({ x: 0, y: 0 });
127
+
128
+ const [position, setPosition] = useState({ x: 0, y: 0 });
202
129
 
203
130
  const handleMouseMove = useCallback(
204
131
  (e: MouseEvent) => {
205
- if (containerRef.current && interactive) {
206
- const rect = containerRef.current.getBoundingClientRect();
207
- const centerX = rect.left + rect.width / 2;
208
- const centerY = rect.top + rect.height / 2;
132
+ if (!containerRef.current || !parallax) return;
133
+
134
+ const rect = containerRef.current.getBoundingClientRect();
135
+ const x = e.clientX - rect.left;
136
+ const y = e.clientY - rect.top;
137
+
138
+ const centerX = rect.width / 2;
139
+ const centerY = rect.height / 2;
209
140
 
210
- // Calculate offset as a percentage
211
- const offsetX = ((e.clientX - centerX) / rect.width) * 100;
212
- const offsetY = ((e.clientY - centerY) / rect.height) * 100;
141
+ const moveX = ((x - centerX) / centerX) * parallaxStrength;
142
+ const moveY = ((y - centerY) / centerY) * parallaxStrength;
213
143
 
214
- setBackgroundPosition({ x: offsetX, y: offsetY });
215
- }
144
+ setPosition({ x: -moveX, y: -moveY });
216
145
  },
217
- [interactive]
146
+ [parallax, parallaxStrength]
218
147
  );
219
148
 
220
149
  useEffect(() => {
221
- const currentRef = containerRef.current;
222
- if (currentRef && interactive) {
223
- currentRef.addEventListener('mousemove', handleMouseMove);
224
- return () => {
225
- currentRef.removeEventListener('mousemove', handleMouseMove);
226
- };
227
- }
228
- return undefined;
229
- }, [handleMouseMove, interactive]);
150
+ if (!parallax) return;
151
+
152
+ const container = containerRef.current;
153
+ if (!container) return;
154
+
155
+ container.addEventListener('mousemove', handleMouseMove as any);
156
+ return () => {
157
+ container.removeEventListener('mousemove', handleMouseMove as any);
158
+ };
159
+ }, [handleMouseMove, parallax]);
230
160
 
231
161
  return (
232
162
  <div
233
163
  ref={containerRef}
234
- style={{
235
- width: '100vw',
236
- height: '100vh',
237
- display: 'flex',
238
- alignItems: 'center',
239
- justifyContent: 'center',
240
- backgroundImage: interactive
241
- ? 'url(https://images.unsplash.com/photo-1497366216548-37526070297c?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D)'
242
- : undefined,
243
- backgroundSize: interactive ? '160%' : 'cover',
244
- backgroundPosition: interactive
245
- ? `calc(50% + ${backgroundPosition.x}px) calc(50% + ${backgroundPosition.y}px)`
246
- : 'center',
247
- ...style,
248
- }}
164
+ className={`u-relative u-overflow-hidden u-w-full u-h-screen ${className}`}
165
+ style={style}
249
166
  >
250
- {children}
167
+ {parallax ? (
168
+ <div
169
+ className="u-absolute u-inset-0 u-transition-transform u-duration-100 u-ease-linear"
170
+ style={{
171
+ transform: `translate(${position.x}px, ${position.y}px)`,
172
+ zIndex: -1,
173
+ }}
174
+ >
175
+ {children}
176
+ </div>
177
+ ) : (
178
+ <>{children}</>
179
+ )}
251
180
  </div>
252
181
  );
253
182
  };
254
183
 
255
184
  /**
256
- * Interactive Wrapper Component
257
- *
258
- * Provides mouse position tracking and offset calculations for interactive stories
185
+ * Collection of high-quality background images for different moods and scenarios
259
186
  */
260
- export const InteractiveWrapper = ({ children }: InteractiveWrapperProps) => {
261
- const containerRef = useRef<HTMLDivElement>(null);
262
- const [mousePos, setMousePos] = useState({ x: 0, y: 0 });
263
- const [mouseOffset, setMouseOffset] = useState({ x: 0, y: 0 });
264
-
265
- const handleMouseMove = useCallback((e: MouseEvent) => {
266
- if (containerRef.current) {
267
- const rect = containerRef.current.getBoundingClientRect();
268
- const centerX = rect.left + rect.width / 2;
269
- const centerY = rect.top + rect.height / 2;
270
-
271
- setMouseOffset({
272
- x: ((e.clientX - centerX) / rect.width) * 100,
273
- y: ((e.clientY - centerY) / rect.height) * 100,
274
- });
275
- }
276
- setMousePos({ x: e.clientX, y: e.clientY });
277
- }, []);
278
-
279
- useEffect(() => {
280
- const currentRef = containerRef.current;
281
- currentRef?.addEventListener('mousemove', handleMouseMove);
282
- return () => {
283
- currentRef?.removeEventListener('mousemove', handleMouseMove);
284
- };
285
- }, [handleMouseMove]);
286
-
287
- return (
288
- <div ref={containerRef} style={{ width: '100%', height: '100%' }}>
289
- {children(mousePos, mouseOffset, containerRef)}
290
- </div>
291
- );
292
- };
187
+ export const backgroundImages = [
188
+ 'https://images.unsplash.com/photo-1637825891028-564f672aa42c?ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&q=80&w=2670',
189
+ 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
190
+ 'https://images.unsplash.com/photo-1519681393784-d120267933ba?ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&q=80&w=2670',
191
+ 'https://images.unsplash.com/photo-1441974231531-c6227db76b6e?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
192
+ ];
@@ -20,31 +20,77 @@ const meta = {
20
20
  src: {
21
21
  control: 'text',
22
22
  description: 'Avatar image source URL',
23
+ table: {
24
+ category: 'Main',
25
+ },
23
26
  },
24
27
  alt: {
25
28
  control: 'text',
26
29
  description: 'Alt text for the avatar image',
30
+ table: {
31
+ category: 'Main',
32
+ },
27
33
  },
28
34
  initials: {
29
35
  control: 'text',
30
36
  description: 'Initials to display when no image is available',
37
+ table: {
38
+ category: 'Main',
39
+ },
31
40
  },
32
41
  icon: {
33
42
  control: { disable: true },
34
43
  description: 'Icon to display when no image or initials are available',
44
+ table: {
45
+ category: 'Main',
46
+ },
35
47
  },
36
48
  size: {
37
49
  control: { type: 'select' },
38
50
  options: ['xs', 'sm', 'md', 'lg', 'xl'],
39
51
  description: 'Size variant for the avatar',
52
+ table: {
53
+ category: 'Style',
54
+ defaultValue: { summary: 'md' },
55
+ },
40
56
  },
41
57
  circle: {
42
58
  control: 'boolean',
43
59
  description: 'Whether to make the avatar circular',
60
+ table: {
61
+ category: 'Style',
62
+ defaultValue: { summary: 'false' },
63
+ },
44
64
  },
45
65
  disabled: {
46
66
  control: 'boolean',
47
67
  description: 'Whether the avatar is disabled',
68
+ table: {
69
+ category: 'State',
70
+ defaultValue: { summary: 'false' },
71
+ },
72
+ },
73
+ className: {
74
+ control: 'text',
75
+ description: 'Additional CSS classes',
76
+ table: {
77
+ category: 'Misc',
78
+ },
79
+ },
80
+ style: {
81
+ control: 'object',
82
+ description: 'Inline styles',
83
+ table: {
84
+ category: 'Misc',
85
+ },
86
+ },
87
+ glass: {
88
+ control: 'boolean',
89
+ description: 'Apply glassmorphism effect',
90
+ table: {
91
+ category: 'Style',
92
+ defaultValue: { summary: 'false' },
93
+ },
48
94
  },
49
95
  },
50
96
  } satisfies Meta<typeof Avatar>;
@@ -60,6 +106,158 @@ export const Basic: Story = {
60
106
  size: 'md',
61
107
  circle: false,
62
108
  },
109
+ parameters: {
110
+ docs: {
111
+ description: {
112
+ story: 'Basic avatar with an image source'
113
+ }
114
+ }
115
+ }
116
+ };
117
+
118
+ // Avatar with Initials
119
+ export const WithInitials: Story = {
120
+ args: {
121
+ initials: 'JD',
122
+ size: 'md',
123
+ circle: true,
124
+ },
125
+ parameters: {
126
+ docs: {
127
+ description: {
128
+ story: 'Avatar displaying user initials when no image is available'
129
+ }
130
+ }
131
+ }
132
+ };
133
+
134
+ // Avatar with Icon
135
+ export const WithIcon: Story = {
136
+ args: {
137
+ icon: <Icon name="User" size="md" />,
138
+ size: 'md',
139
+ circle: true,
140
+ },
141
+ parameters: {
142
+ docs: {
143
+ description: {
144
+ story: 'Avatar displaying an icon when no image or initials are available'
145
+ }
146
+ }
147
+ }
148
+ };
149
+
150
+ // Avatar Sizes
151
+ export const Sizes: Story = {
152
+ render: () => {
153
+ const sizes = ['xs', 'sm', 'md', 'lg', 'xl'] as const;
154
+
155
+ return (
156
+ <div className="u-flex u-gap-4 u-flex-wrap u-items-center">
157
+ {sizes.map(size => (
158
+ <div key={size} className="u-flex u-flex-col u-items-center u-gap-2">
159
+ <Avatar
160
+ src={`https://i.pravatar.cc/150?img=${size === 'xs' ? 1 : size === 'sm' ? 2 : size === 'md' ? 3 : size === 'lg' ? 4 : 5}`}
161
+ size={size}
162
+ circle
163
+ />
164
+ <span className="u-text-xs u-capitalize">{size}</span>
165
+ </div>
166
+ ))}
167
+ </div>
168
+ );
169
+ },
170
+ parameters: {
171
+ docs: {
172
+ description: {
173
+ story: 'Different avatar sizes from extra-small to extra-large'
174
+ }
175
+ }
176
+ }
177
+ };
178
+
179
+ // Avatar Shapes
180
+ export const Shapes: Story = {
181
+ render: () => {
182
+ return (
183
+ <div className="u-flex u-gap-6 u-items-center">
184
+ <div className="u-flex u-flex-col u-items-center u-gap-2">
185
+ <Avatar
186
+ src="https://i.pravatar.cc/150?img=6"
187
+ size="md"
188
+ circle={false}
189
+ />
190
+ <span className="u-text-xs">Square</span>
191
+ </div>
192
+ <div className="u-flex u-flex-col u-items-center u-gap-2">
193
+ <Avatar
194
+ src="https://i.pravatar.cc/150?img=7"
195
+ size="md"
196
+ circle={true}
197
+ />
198
+ <span className="u-text-xs">Circle</span>
199
+ </div>
200
+ </div>
201
+ );
202
+ },
203
+ parameters: {
204
+ docs: {
205
+ description: {
206
+ story: 'Avatar shapes: square and circle'
207
+ }
208
+ }
209
+ }
210
+ };
211
+
212
+ // Avatar States
213
+ export const States: Story = {
214
+ render: () => {
215
+ return (
216
+ <div className="u-flex u-gap-6 u-items-center">
217
+ <div className="u-flex u-flex-col u-items-center u-gap-2">
218
+ <Avatar
219
+ src="https://i.pravatar.cc/150?img=8"
220
+ size="md"
221
+ circle
222
+ />
223
+ <span className="u-text-xs">Default</span>
224
+ </div>
225
+ <div className="u-flex u-flex-col u-items-center u-gap-2">
226
+ <Avatar
227
+ src="https://i.pravatar.cc/150?img=9"
228
+ size="md"
229
+ circle
230
+ disabled
231
+ />
232
+ <span className="u-text-xs">Disabled</span>
233
+ </div>
234
+ </div>
235
+ );
236
+ },
237
+ parameters: {
238
+ docs: {
239
+ description: {
240
+ story: 'Avatar states: default and disabled'
241
+ }
242
+ }
243
+ }
244
+ };
245
+
246
+ // Avatar with Glass Effect
247
+ export const WithGlassEffect: Story = {
248
+ args: {
249
+ src: 'https://i.pravatar.cc/150?img=10',
250
+ size: 'md',
251
+ circle: true,
252
+ glass: true,
253
+ },
254
+ parameters: {
255
+ docs: {
256
+ description: {
257
+ story: 'Avatar with glassmorphism effect'
258
+ }
259
+ }
260
+ }
63
261
  };
64
262
 
65
263
  // Avatar Variants Showcase
@@ -156,6 +354,13 @@ export const VariantsShowcase: Story = {
156
354
  </div>
157
355
  );
158
356
  },
357
+ parameters: {
358
+ docs: {
359
+ description: {
360
+ story: 'Comprehensive showcase of avatar variants across all sizes'
361
+ }
362
+ }
363
+ }
159
364
  };
160
365
 
161
366
  // Avatar Group Showcase
@@ -261,4 +466,11 @@ export const AvatarGroupShowcase: Story = {
261
466
  </div>
262
467
  );
263
468
  },
264
- };
469
+ parameters: {
470
+ docs: {
471
+ description: {
472
+ story: 'Various configurations of AvatarGroup component'
473
+ }
474
+ }
475
+ }
476
+ };