@shohojdhara/atomix 0.3.15 → 0.4.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 (245) hide show
  1. package/build-tools/index.d.ts +31 -30
  2. package/build-tools/package.json +4 -21
  3. package/dist/atomix.css +20924 -2611
  4. package/dist/atomix.css.map +1 -1
  5. package/dist/atomix.min.css +76 -2
  6. package/dist/atomix.min.css.map +1 -1
  7. package/dist/build-tools/index.d.ts +31 -30
  8. package/dist/build-tools/package.json +4 -21
  9. package/dist/charts.js.map +1 -1
  10. package/dist/core.js.map +1 -1
  11. package/dist/forms.js.map +1 -1
  12. package/dist/heavy.js.map +1 -1
  13. package/dist/index.d.ts +144 -18
  14. package/dist/index.esm.js +110 -55
  15. package/dist/index.esm.js.map +1 -1
  16. package/dist/index.js +110 -55
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.min.js +1 -1
  19. package/dist/index.min.js.map +1 -1
  20. package/dist/layout.js.map +1 -1
  21. package/dist/theme.d.ts +9 -9
  22. package/dist/theme.js.map +1 -1
  23. package/package.json +1 -1
  24. package/src/components/Accordion/Accordion.stories.tsx +32 -23
  25. package/src/components/Accordion/Accordion.test.tsx +70 -50
  26. package/src/components/Accordion/Accordion.tsx +99 -94
  27. package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
  28. package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
  29. package/src/components/AtomixGlass/glass-utils.ts +4 -3
  30. package/src/components/AtomixGlass/shader-utils.ts +128 -52
  31. package/src/components/AtomixGlass/stories/Playground.stories.tsx +1 -1
  32. package/src/components/AtomixGlass/stories/Shaders.stories.tsx +1 -1
  33. package/src/components/Avatar/Avatar.stories.tsx +45 -62
  34. package/src/components/Avatar/Avatar.tsx +58 -56
  35. package/src/components/Badge/Badge.stories.tsx +20 -9
  36. package/src/components/Badge/Badge.test.tsx +41 -41
  37. package/src/components/Badge/Badge.tsx +64 -62
  38. package/src/components/Block/Block.stories.tsx +14 -4
  39. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +9 -8
  40. package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
  41. package/src/components/Button/Button.stories.tsx +13 -22
  42. package/src/components/Button/Button.test.tsx +97 -81
  43. package/src/components/Button/Button.tsx +46 -14
  44. package/src/components/Button/ButtonGroup.stories.tsx +37 -32
  45. package/src/components/Button/ButtonGroup.tsx +4 -15
  46. package/src/components/Callout/Callout.stories.tsx +109 -16
  47. package/src/components/Card/Card.stories.tsx +67 -36
  48. package/src/components/Card/Card.tsx +30 -14
  49. package/src/components/Chart/AreaChart.tsx +1 -1
  50. package/src/components/Chart/CandlestickChart.tsx +23 -16
  51. package/src/components/Chart/Chart.stories.tsx +4 -9
  52. package/src/components/Chart/Chart.tsx +40 -44
  53. package/src/components/Chart/ChartRenderer.tsx +39 -12
  54. package/src/components/Chart/ChartToolbar.tsx +21 -5
  55. package/src/components/Chart/DonutChart.tsx +1 -1
  56. package/src/components/Chart/FunnelChart.tsx +4 -1
  57. package/src/components/Chart/GaugeChart.tsx +3 -1
  58. package/src/components/Chart/HeatmapChart.tsx +50 -37
  59. package/src/components/Chart/LineChart.tsx +3 -2
  60. package/src/components/Chart/MultiAxisChart.tsx +24 -16
  61. package/src/components/Chart/RadarChart.tsx +19 -17
  62. package/src/components/Chart/ScatterChart.tsx +29 -21
  63. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +6 -2
  64. package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
  65. package/src/components/Countdown/Countdown.stories.tsx +7 -7
  66. package/src/components/DataTable/DataTable.stories.tsx +43 -38
  67. package/src/components/DataTable/DataTable.test.tsx +26 -148
  68. package/src/components/DataTable/DataTable.tsx +485 -456
  69. package/src/components/DatePicker/DatePicker.stories.tsx +32 -47
  70. package/src/components/DatePicker/DatePicker.tsx +31 -26
  71. package/src/components/Dropdown/Dropdown.stories.tsx +2 -5
  72. package/src/components/Dropdown/Dropdown.tsx +313 -299
  73. package/src/components/EdgePanel/EdgePanel.stories.tsx +6 -19
  74. package/src/components/EdgePanel/EdgePanel.tsx +1 -3
  75. package/src/components/Footer/Footer.stories.tsx +21 -16
  76. package/src/components/Footer/Footer.tsx +130 -128
  77. package/src/components/Footer/FooterLink.tsx +2 -2
  78. package/src/components/Form/Checkbox.test.tsx +49 -49
  79. package/src/components/Form/Checkbox.tsx +108 -100
  80. package/src/components/Form/Form.stories.tsx +2 -10
  81. package/src/components/Form/Input.stories.tsx +22 -39
  82. package/src/components/Form/Input.test.tsx +38 -44
  83. package/src/components/Form/Radio.stories.tsx +6 -12
  84. package/src/components/Form/Radio.tsx +68 -66
  85. package/src/components/Form/Select.tsx +184 -182
  86. package/src/components/Form/Textarea.test.tsx +27 -32
  87. package/src/components/Hero/Hero.stories.tsx +56 -23
  88. package/src/components/Hero/Hero.tsx +201 -55
  89. package/src/components/Icon/index.ts +7 -1
  90. package/src/components/List/List.tsx +19 -23
  91. package/src/components/Modal/Modal.stories.tsx +2 -1
  92. package/src/components/Modal/Modal.tsx +130 -127
  93. package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
  94. package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
  95. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
  96. package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
  97. package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
  98. package/src/components/Pagination/Pagination.stories.tsx +7 -4
  99. package/src/components/Pagination/Pagination.tsx +199 -202
  100. package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
  101. package/src/components/Popover/Popover.stories.tsx +99 -192
  102. package/src/components/Popover/Popover.tsx +41 -37
  103. package/src/components/Progress/Progress.stories.tsx +35 -44
  104. package/src/components/River/River.stories.tsx +2 -1
  105. package/src/components/SectionIntro/SectionIntro.stories.tsx +71 -71
  106. package/src/components/Slider/Slider.stories.tsx +12 -4
  107. package/src/components/Spinner/Spinner.stories.tsx +3 -1
  108. package/src/components/Spinner/Spinner.test.tsx +23 -23
  109. package/src/components/Spinner/Spinner.tsx +43 -46
  110. package/src/components/Steps/Steps.stories.tsx +8 -6
  111. package/src/components/Tabs/Tabs.stories.tsx +12 -9
  112. package/src/components/Tabs/Tabs.tsx +74 -72
  113. package/src/components/Toggle/Toggle.stories.tsx +27 -13
  114. package/src/components/Toggle/Toggle.test.tsx +65 -70
  115. package/src/components/Toggle/Toggle.tsx +4 -1
  116. package/src/components/Tooltip/Tooltip.stories.tsx +24 -20
  117. package/src/components/Tooltip/Tooltip.tsx +104 -106
  118. package/src/components/Upload/Upload.stories.tsx +129 -127
  119. package/src/components/Upload/Upload.tsx +287 -283
  120. package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
  121. package/src/components/index.ts +13 -2
  122. package/src/layouts/Grid/Grid.stories.tsx +9 -3
  123. package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
  124. package/src/lib/__tests__/theme-tools.test.ts +32 -6
  125. package/src/lib/composables/shared-mouse-tracker.ts +13 -14
  126. package/src/lib/composables/useAtomixGlass.ts +106 -49
  127. package/src/lib/composables/useChartExport.ts +1 -1
  128. package/src/lib/composables/useDataTable.ts +29 -17
  129. package/src/lib/composables/useHero.ts +58 -14
  130. package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
  131. package/src/lib/composables/useInput.ts +10 -8
  132. package/src/lib/composables/useSideMenu.ts +6 -5
  133. package/src/lib/composables/useTooltip.ts +1 -2
  134. package/src/lib/composables/useVideoPlayer.ts +44 -35
  135. package/src/lib/config/index.ts +154 -154
  136. package/src/lib/constants/cssVariables.ts +29 -29
  137. package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
  138. package/src/lib/hooks/index.ts +1 -1
  139. package/src/lib/hooks/useComponentCustomization.ts +11 -17
  140. package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
  141. package/src/lib/patterns/__tests__/slots.test.ts +1 -1
  142. package/src/lib/patterns/index.ts +1 -1
  143. package/src/lib/patterns/slots.tsx +8 -13
  144. package/src/lib/storybook/InteractiveDemo.tsx +13 -18
  145. package/src/lib/storybook/PreviewContainer.tsx +1 -1
  146. package/src/lib/storybook/VariantsGrid.tsx +3 -7
  147. package/src/lib/storybook/index.ts +1 -1
  148. package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
  149. package/src/lib/theme/adapters/index.ts +3 -9
  150. package/src/lib/theme/adapters/themeAdapter.ts +41 -26
  151. package/src/lib/theme/config/index.ts +1 -1
  152. package/src/lib/theme/config/types.ts +2 -2
  153. package/src/lib/theme/config/validator.ts +10 -5
  154. package/src/lib/theme/constants/constants.ts +2 -2
  155. package/src/lib/theme/constants/index.ts +1 -2
  156. package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
  157. package/src/lib/theme/core/composeTheme.ts +32 -26
  158. package/src/lib/theme/core/createTheme.ts +1 -1
  159. package/src/lib/theme/core/createThemeObject.ts +308 -301
  160. package/src/lib/theme/core/index.ts +3 -3
  161. package/src/lib/theme/devtools/CLI.ts +106 -104
  162. package/src/lib/theme/devtools/Comparator.tsx +50 -32
  163. package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
  164. package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
  165. package/src/lib/theme/devtools/Inspector.tsx +75 -60
  166. package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
  167. package/src/lib/theme/devtools/Preview.tsx +150 -106
  168. package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
  169. package/src/lib/theme/devtools/index.ts +3 -9
  170. package/src/lib/theme/devtools/useHistory.ts +23 -21
  171. package/src/lib/theme/errors/errors.ts +12 -11
  172. package/src/lib/theme/errors/index.ts +2 -7
  173. package/src/lib/theme/generators/generateCSS.ts +9 -13
  174. package/src/lib/theme/generators/generateCSSNested.ts +1 -6
  175. package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
  176. package/src/lib/theme/generators/index.ts +1 -4
  177. package/src/lib/theme/i18n/index.ts +1 -1
  178. package/src/lib/theme/i18n/rtl.ts +13 -13
  179. package/src/lib/theme/index.ts +7 -16
  180. package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
  181. package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
  182. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
  183. package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
  184. package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
  185. package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
  186. package/src/lib/theme/runtime/index.ts +2 -5
  187. package/src/lib/theme/runtime/useTheme.ts +18 -18
  188. package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
  189. package/src/lib/theme/test/testTheme.ts +15 -16
  190. package/src/lib/theme/tokens/index.ts +2 -7
  191. package/src/lib/theme/tokens/tokens.ts +25 -24
  192. package/src/lib/theme/types.ts +428 -411
  193. package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
  194. package/src/lib/theme/utils/componentTheming.ts +18 -18
  195. package/src/lib/theme/utils/domUtils.ts +277 -289
  196. package/src/lib/theme/utils/index.ts +1 -2
  197. package/src/lib/theme/utils/injectCSS.ts +10 -14
  198. package/src/lib/theme/utils/naming.ts +20 -16
  199. package/src/lib/theme/utils/themeHelpers.ts +10 -12
  200. package/src/lib/theme/utils/themeUtils.ts +85 -86
  201. package/src/lib/theme/utils/themeValidation.ts +82 -33
  202. package/src/lib/theme-tools.ts +8 -6
  203. package/src/lib/types/components.ts +172 -71
  204. package/src/lib/types/partProps.ts +1 -1
  205. package/src/lib/utils/__tests__/csv.test.ts +1 -1
  206. package/src/lib/utils/componentUtils.ts +8 -12
  207. package/src/lib/utils/csv.ts +3 -1
  208. package/src/lib/utils/dataTableExport.ts +1 -5
  209. package/src/lib/utils/fontPreloader.ts +10 -19
  210. package/src/lib/utils/icons.ts +4 -1
  211. package/src/lib/utils/index.ts +2 -6
  212. package/src/lib/utils/memoryMonitor.ts +10 -8
  213. package/src/lib/utils/themeNaming.ts +2 -2
  214. package/src/styles/01-settings/_index.scss +0 -1
  215. package/src/styles/01-settings/_settings.colors.scss +8 -8
  216. package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
  217. package/src/styles/01-settings/_settings.navbar.scss +1 -1
  218. package/src/styles/01-settings/_settings.spacing.scss +3 -4
  219. package/src/styles/01-settings/_settings.tooltip.scss +1 -1
  220. package/src/styles/01-settings/_settings.typography.scss +1 -1
  221. package/src/styles/02-tools/_tools.button.scss +51 -21
  222. package/src/styles/02-tools/_tools.utility-api.scss +30 -18
  223. package/src/styles/03-generic/_generic.root.scss +4 -3
  224. package/src/styles/06-components/_components.atomix-glass.scss +13 -9
  225. package/src/styles/06-components/_components.button.scss +16 -4
  226. package/src/styles/06-components/_components.callout.scss +27 -21
  227. package/src/styles/06-components/_components.card.scss +5 -14
  228. package/src/styles/06-components/_components.chart.scss +22 -19
  229. package/src/styles/06-components/_components.checkbox.scss +3 -1
  230. package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
  231. package/src/styles/06-components/_components.edge-panel.scss +9 -2
  232. package/src/styles/06-components/_components.footer.scss +1 -1
  233. package/src/styles/06-components/_components.side-menu.scss +5 -5
  234. package/src/styles/06-components/_components.toggle.scss +18 -0
  235. package/src/styles/06-components/_index.scss +1 -1
  236. package/src/styles/06-components/old.chart.styles.scss +0 -2
  237. package/src/styles/99-utilities/_utilities.border.scss +69 -27
  238. package/src/styles/99-utilities/_utilities.display.scss +1 -1
  239. package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
  240. package/src/styles/99-utilities/_utilities.position.scss +16 -9
  241. package/src/styles/99-utilities/_utilities.scss +1 -1
  242. package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
  243. package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
  244. package/src/styles/99-utilities/_utilities.text-gradient.scss +30 -30
  245. package/src/styles/99-utilities/_utilities.text.scss +67 -46
@@ -2,7 +2,11 @@ import React, { ReactNode, memo } from 'react';
2
2
  import { TOOLTIP } from '../../lib/constants/components';
3
3
  import { AtomixGlass } from '../AtomixGlass/AtomixGlass';
4
4
  import { AtomixGlassProps } from '../../lib/types/components';
5
- import { useTooltip, type TooltipPosition, type TooltipTrigger } from '../../lib/composables/useTooltip';
5
+ import {
6
+ useTooltip,
7
+ type TooltipPosition,
8
+ type TooltipTrigger,
9
+ } from '../../lib/composables/useTooltip';
6
10
 
7
11
  export interface TooltipProps {
8
12
  /**
@@ -19,14 +23,14 @@ export interface TooltipProps {
19
23
  * The position of the tooltip relative to the trigger
20
24
  */
21
25
  position?:
22
- | 'top'
23
- | 'bottom'
24
- | 'left'
25
- | 'right'
26
- | 'top-left'
27
- | 'top-right'
28
- | 'bottom-left'
29
- | 'bottom-right';
26
+ | 'top'
27
+ | 'bottom'
28
+ | 'left'
29
+ | 'right'
30
+ | 'top-left'
31
+ | 'top-right'
32
+ | 'bottom-left'
33
+ | 'bottom-right';
30
34
 
31
35
  /**
32
36
  * How the tooltip is triggered
@@ -60,109 +64,103 @@ export interface TooltipProps {
60
64
  glass?: AtomixGlassProps | boolean;
61
65
  }
62
66
 
63
- export const Tooltip: React.FC<TooltipProps> = memo(({
64
- content,
65
- children,
66
- position = TOOLTIP.DEFAULTS.POSITION,
67
- trigger = TOOLTIP.DEFAULTS.TRIGGER,
68
- className = '',
69
- style,
70
- delay = TOOLTIP.DEFAULTS.DELAY,
71
- offset = TOOLTIP.DEFAULTS.OFFSET,
72
- glass,
73
- }) => {
74
- const {
75
- isVisible,
76
- isPositioned,
77
- tooltipId,
78
- triggerRef,
79
- tooltipRef,
80
- tooltipStyle,
81
- arrowStyle,
82
- triggerProps,
83
- wrapperProps,
84
- } = useTooltip({
85
- position: position as TooltipPosition,
86
- trigger: trigger as TooltipTrigger,
87
- offset,
88
- delay,
89
- });
90
-
91
- const getTooltipPositionClasses = () => {
92
- const positionMap: Record<string, string> = {
93
- top: 'c-tooltip--top',
94
- bottom: 'c-tooltip--bottom',
95
- left: 'c-tooltip--left',
96
- right: 'c-tooltip--right',
97
- 'top-left': 'c-tooltip--top-left',
98
- 'top-right': 'c-tooltip--top-right',
99
- 'bottom-left': 'c-tooltip--bottom-left',
100
- 'bottom-right': 'c-tooltip--bottom-right',
67
+ export const Tooltip: React.FC<TooltipProps> = memo(
68
+ ({
69
+ content,
70
+ children,
71
+ position = TOOLTIP.DEFAULTS.POSITION,
72
+ trigger = TOOLTIP.DEFAULTS.TRIGGER,
73
+ className = '',
74
+ style,
75
+ delay = TOOLTIP.DEFAULTS.DELAY,
76
+ offset = TOOLTIP.DEFAULTS.OFFSET,
77
+ glass,
78
+ }) => {
79
+ const {
80
+ isVisible,
81
+ isPositioned,
82
+ tooltipId,
83
+ triggerRef,
84
+ tooltipRef,
85
+ tooltipStyle,
86
+ arrowStyle,
87
+ triggerProps,
88
+ wrapperProps,
89
+ } = useTooltip({
90
+ position: position as TooltipPosition,
91
+ trigger: trigger as TooltipTrigger,
92
+ offset,
93
+ delay,
94
+ });
95
+
96
+ const getTooltipPositionClasses = () => {
97
+ const positionMap: Record<string, string> = {
98
+ top: 'c-tooltip--top',
99
+ bottom: 'c-tooltip--bottom',
100
+ left: 'c-tooltip--left',
101
+ right: 'c-tooltip--right',
102
+ 'top-left': 'c-tooltip--top-left',
103
+ 'top-right': 'c-tooltip--top-right',
104
+ 'bottom-left': 'c-tooltip--bottom-left',
105
+ 'bottom-right': 'c-tooltip--bottom-right',
106
+ };
107
+ return positionMap[position] || 'c-tooltip--top';
101
108
  };
102
- return positionMap[position] || 'c-tooltip--top';
103
- };
104
-
105
- const renderContent = () => {
106
- const contentElement = (
107
- <div
108
- className={`c-tooltip__content ${TOOLTIP.SELECTORS.CONTENT.substring(1)} ${isVisible && isPositioned && 'is-active'}`}
109
- >
110
- <span
111
- className={TOOLTIP.SELECTORS.ARROW.substring(1)}
112
- style={arrowStyle}
113
- ></span>
114
- {content}
115
- </div>
116
- );
117
109
 
118
- if (glass) {
119
- const defaultGlassProps = {
120
- displacementScale: 100,
121
- blurAmount: 3,
122
- };
110
+ const renderContent = () => {
111
+ const contentElement = (
112
+ <div
113
+ className={`c-tooltip__content ${TOOLTIP.SELECTORS.CONTENT.substring(1)} ${isVisible && isPositioned && 'is-active'}`}
114
+ >
115
+ <span className={TOOLTIP.SELECTORS.ARROW.substring(1)} style={arrowStyle}></span>
116
+ {content}
117
+ </div>
118
+ );
123
119
 
124
- const glassProps =
125
- glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
126
-
127
- return <AtomixGlass {...glassProps}>{contentElement}</AtomixGlass>;
128
- }
129
-
130
- return contentElement;
131
- };
132
-
133
- return (
134
- <div
135
- className="u-position-relative u-inline-block"
136
- style={style}
137
- {...wrapperProps}
138
- >
139
- <div
140
- ref={triggerRef}
141
- className={`${TOOLTIP.SELECTORS.TRIGGER.substring(1)}${className ? ` ${className}` : ''}`}
142
- {...triggerProps}
143
- >
144
- {children}
145
- </div>
146
- {isVisible && (
120
+ if (glass) {
121
+ const defaultGlassProps = {
122
+ displacementScale: 100,
123
+ blurAmount: 3,
124
+ };
125
+
126
+ const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
127
+
128
+ return <AtomixGlass {...glassProps}>{contentElement}</AtomixGlass>;
129
+ }
130
+
131
+ return contentElement;
132
+ };
133
+
134
+ return (
135
+ <div className="u-position-relative u-inline-block" style={style} {...wrapperProps}>
147
136
  <div
148
- ref={tooltipRef}
149
- id={tooltipId}
150
- role="tooltip"
151
- className={`c-tooltip ${TOOLTIP.SELECTORS.TOOLTIP.substring(1)} ${getTooltipPositionClasses()} ${glass ? 'c-tooltip--glass' : ''}`}
152
- data-tooltip-position={position}
153
- data-tooltip-trigger={trigger}
154
- style={{
155
- ...tooltipStyle,
156
- // Position off-screen initially to prevent jump, then move to calculated position
157
- ...(isPositioned ? {} : { left: '-9999px', top: '-9999px' }),
158
- }}
137
+ ref={triggerRef}
138
+ className={`${TOOLTIP.SELECTORS.TRIGGER.substring(1)}${className ? ` ${className}` : ''}`}
139
+ {...triggerProps}
159
140
  >
160
- {renderContent()}
141
+ {children}
161
142
  </div>
162
- )}
163
- </div>
164
- );
165
- });
143
+ {isVisible && (
144
+ <div
145
+ ref={tooltipRef}
146
+ id={tooltipId}
147
+ role="tooltip"
148
+ className={`c-tooltip ${TOOLTIP.SELECTORS.TOOLTIP.substring(1)} ${getTooltipPositionClasses()} ${glass ? 'c-tooltip--glass' : ''}`}
149
+ data-tooltip-position={position}
150
+ data-tooltip-trigger={trigger}
151
+ style={{
152
+ ...tooltipStyle,
153
+ // Position off-screen initially to prevent jump, then move to calculated position
154
+ ...(isPositioned ? {} : { left: '-9999px', top: '-9999px' }),
155
+ }}
156
+ >
157
+ {renderContent()}
158
+ </div>
159
+ )}
160
+ </div>
161
+ );
162
+ }
163
+ );
166
164
 
167
165
  Tooltip.displayName = 'Tooltip';
168
166
 
@@ -179,48 +179,48 @@ export const BasicUsage: Story = {
179
179
  // Size Variants
180
180
  export const SizeVariants: Story = {
181
181
  render: () => (
182
- <div style={{ padding: '30px' }}>
183
- <div style={{ marginBottom: '40px' }}>
184
- <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>Small Size</h3>
185
- <div style={{ maxWidth: '400px' }}>
186
- <Upload
187
- size="sm"
188
- title="Small Upload Area"
189
- supportedFilesText="PDF, JPEG, PNG"
190
- buttonText="Choose File"
191
- helperText="Max: 2MB"
192
- />
182
+ <div style={{ padding: '30px' }}>
183
+ <div style={{ marginBottom: '40px' }}>
184
+ <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>Small Size</h3>
185
+ <div style={{ maxWidth: '400px' }}>
186
+ <Upload
187
+ size="sm"
188
+ title="Small Upload Area"
189
+ supportedFilesText="PDF, JPEG, PNG"
190
+ buttonText="Choose File"
191
+ helperText="Max: 2MB"
192
+ />
193
+ </div>
193
194
  </div>
194
- </div>
195
195
 
196
- <div style={{ marginBottom: '40px' }}>
197
- <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>
198
- Medium Size (Default)
199
- </h3>
200
- <div style={{ maxWidth: '500px' }}>
201
- <Upload
202
- size="md"
203
- title="Drag and Drop files here"
204
- supportedFilesText="Files supported: PDF, XSLS, JPEG, PNG, Scanner"
205
- buttonText="Choose File"
206
- helperText="Maximum size: 5MB"
207
- />
196
+ <div style={{ marginBottom: '40px' }}>
197
+ <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>
198
+ Medium Size (Default)
199
+ </h3>
200
+ <div style={{ maxWidth: '500px' }}>
201
+ <Upload
202
+ size="md"
203
+ title="Drag and Drop files here"
204
+ supportedFilesText="Files supported: PDF, XSLS, JPEG, PNG, Scanner"
205
+ buttonText="Choose File"
206
+ helperText="Maximum size: 5MB"
207
+ />
208
+ </div>
208
209
  </div>
209
- </div>
210
210
 
211
- <div>
212
- <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>Large Size</h3>
213
- <div style={{ maxWidth: '700px' }}>
214
- <Upload
215
- size="lg"
216
- title="Drop your files here for upload"
217
- supportedFilesText="Supported formats: PDF, Excel, Word, Images, and more"
218
- buttonText="Browse Files"
219
- helperText="Maximum file size: 10MB per file"
220
- />
211
+ <div>
212
+ <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>Large Size</h3>
213
+ <div style={{ maxWidth: '700px' }}>
214
+ <Upload
215
+ size="lg"
216
+ title="Drop your files here for upload"
217
+ supportedFilesText="Supported formats: PDF, Excel, Word, Images, and more"
218
+ buttonText="Browse Files"
219
+ helperText="Maximum file size: 10MB per file"
220
+ />
221
+ </div>
221
222
  </div>
222
223
  </div>
223
- </div>
224
224
  ),
225
225
  parameters: {
226
226
  docs: {
@@ -472,73 +472,73 @@ export const DragDropDemo: Story = {
472
472
  const [dragState, setDragState] = useState<'idle' | 'dragging'>('idle');
473
473
  const [uploadedFiles, setUploadedFiles] = useState<string[]>([]);
474
474
 
475
- const handleFileSelect = (files: File[]) => {
476
- const fileNames = files.map(file => file.name);
477
- setUploadedFiles(prev => [...prev, ...fileNames]);
478
- };
479
-
480
- return (
481
- <div style={{ padding: '30px' }}>
482
- <div style={{ marginBottom: '20px' }}>
483
- <h3 style={{ fontSize: '18px', fontWeight: '600', marginBottom: '10px' }}>
484
- Interactive Drag & Drop Demo
485
- </h3>
486
- <p style={{ color: '#666', fontSize: '14px', marginBottom: '20px' }}>
487
- Try dragging files over the upload area to see the hover effects, or click to select
488
- files.
489
- </p>
490
- </div>
475
+ const handleFileSelect = (files: File[]) => {
476
+ const fileNames = files.map(file => file.name);
477
+ setUploadedFiles(prev => [...prev, ...fileNames]);
478
+ };
479
+
480
+ return (
481
+ <div style={{ padding: '30px' }}>
482
+ <div style={{ marginBottom: '20px' }}>
483
+ <h3 style={{ fontSize: '18px', fontWeight: '600', marginBottom: '10px' }}>
484
+ Interactive Drag & Drop Demo
485
+ </h3>
486
+ <p style={{ color: '#666', fontSize: '14px', marginBottom: '20px' }}>
487
+ Try dragging files over the upload area to see the hover effects, or click to select
488
+ files.
489
+ </p>
490
+ </div>
491
491
 
492
- <div style={{ maxWidth: '600px', marginBottom: '20px' }}>
493
- <Upload
494
- title="Drag files here to see the magic ✨"
495
- supportedFilesText="PDF, Images, Documents - All welcome!"
496
- buttonText="Or click to browse"
497
- helperText="Watch the upload area respond to your interactions"
498
- onFileSelect={handleFileSelect}
499
- multiple={true}
500
- />
501
- </div>
492
+ <div style={{ maxWidth: '600px', marginBottom: '20px' }}>
493
+ <Upload
494
+ title="Drag files here to see the magic ✨"
495
+ supportedFilesText="PDF, Images, Documents - All welcome!"
496
+ buttonText="Or click to browse"
497
+ helperText="Watch the upload area respond to your interactions"
498
+ onFileSelect={handleFileSelect}
499
+ multiple={true}
500
+ />
501
+ </div>
502
502
 
503
- {uploadedFiles.length > 0 && (
504
- <div
505
- style={{
506
- padding: '16px',
507
- backgroundColor: '#f8f9fa',
508
- borderRadius: '8px',
509
- border: '1px solid #e9ecef',
510
- }}
511
- >
512
- <h4
513
- style={{ fontSize: '14px', fontWeight: '600', marginBottom: '8px', color: '#495057' }}
514
- >
515
- Selected Files:
516
- </h4>
517
- <ul style={{ margin: 0, paddingLeft: '20px' }}>
518
- {uploadedFiles.map((fileName, index) => (
519
- <li key={index} style={{ fontSize: '14px', color: '#6c757d', marginBottom: '4px' }}>
520
- {fileName}
521
- </li>
522
- ))}
523
- </ul>
524
- <button
525
- onClick={() => setUploadedFiles([])}
503
+ {uploadedFiles.length > 0 && (
504
+ <div
526
505
  style={{
527
- marginTop: '12px',
528
- padding: '6px 12px',
529
- fontSize: '12px',
530
- backgroundColor: '#6c757d',
531
- color: 'white',
532
- border: 'none',
533
- borderRadius: '4px',
534
- cursor: 'pointer',
506
+ padding: '16px',
507
+ backgroundColor: '#f8f9fa',
508
+ borderRadius: '8px',
509
+ border: '1px solid #e9ecef',
535
510
  }}
536
511
  >
537
- Clear List
538
- </button>
539
- </div>
540
- )}
541
- </div>
512
+ <h4
513
+ style={{ fontSize: '14px', fontWeight: '600', marginBottom: '8px', color: '#495057' }}
514
+ >
515
+ Selected Files:
516
+ </h4>
517
+ <ul style={{ margin: 0, paddingLeft: '20px' }}>
518
+ {uploadedFiles.map((fileName, index) => (
519
+ <li key={index} style={{ fontSize: '14px', color: '#6c757d', marginBottom: '4px' }}>
520
+ {fileName}
521
+ </li>
522
+ ))}
523
+ </ul>
524
+ <button
525
+ onClick={() => setUploadedFiles([])}
526
+ style={{
527
+ marginTop: '12px',
528
+ padding: '6px 12px',
529
+ fontSize: '12px',
530
+ backgroundColor: '#6c757d',
531
+ color: 'white',
532
+ border: 'none',
533
+ borderRadius: '4px',
534
+ cursor: 'pointer',
535
+ }}
536
+ >
537
+ Clear List
538
+ </button>
539
+ </div>
540
+ )}
541
+ </div>
542
542
  );
543
543
  },
544
544
  parameters: {
@@ -555,39 +555,41 @@ export const DragDropDemo: Story = {
555
555
  export const FileTypeRestrictions: Story = {
556
556
  render: () => (
557
557
  <div style={{ padding: '30px' }}>
558
- <div style={{ marginBottom: '40px' }}>
559
- <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>Images Only</h3>
560
- <div style={{ maxWidth: '500px' }}>
561
- <Upload
562
- title="Upload Images"
563
- supportedFilesText="JPEG, PNG, GIF, WebP"
564
- buttonText="Choose Images"
565
- helperText="Maximum size: 10MB"
566
- acceptedFileTypes={['image/jpeg', 'image/png', 'image/gif', 'image/webp']}
567
- multiple={true}
568
- />
558
+ <div style={{ marginBottom: '40px' }}>
559
+ <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>Images Only</h3>
560
+ <div style={{ maxWidth: '500px' }}>
561
+ <Upload
562
+ title="Upload Images"
563
+ supportedFilesText="JPEG, PNG, GIF, WebP"
564
+ buttonText="Choose Images"
565
+ helperText="Maximum size: 10MB"
566
+ acceptedFileTypes={['image/jpeg', 'image/png', 'image/gif', 'image/webp']}
567
+ multiple={true}
568
+ />
569
+ </div>
569
570
  </div>
570
- </div>
571
571
 
572
- <div style={{ marginBottom: '40px' }}>
573
- <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>Documents Only</h3>
574
- <div style={{ maxWidth: '500px' }}>
575
- <Upload
576
- title="Upload Documents"
577
- supportedFilesText="PDF, Word, Excel, PowerPoint"
578
- buttonText="Choose Documents"
579
- helperText="Maximum size: 25MB"
580
- acceptedFileTypes={[
581
- 'application/pdf',
582
- 'application/msword',
583
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
584
- 'application/vnd.ms-excel',
585
- 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
586
- ]}
587
- />
572
+ <div style={{ marginBottom: '40px' }}>
573
+ <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>
574
+ Documents Only
575
+ </h3>
576
+ <div style={{ maxWidth: '500px' }}>
577
+ <Upload
578
+ title="Upload Documents"
579
+ supportedFilesText="PDF, Word, Excel, PowerPoint"
580
+ buttonText="Choose Documents"
581
+ helperText="Maximum size: 25MB"
582
+ acceptedFileTypes={[
583
+ 'application/pdf',
584
+ 'application/msword',
585
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
586
+ 'application/vnd.ms-excel',
587
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
588
+ ]}
589
+ />
590
+ </div>
588
591
  </div>
589
592
  </div>
590
- </div>
591
593
  ),
592
594
  parameters: {
593
595
  docs: {