@shohojdhara/atomix 0.2.6 → 0.2.8

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 (48) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +3 -3
  3. package/dist/atomix.css +373 -55
  4. package/dist/atomix.min.css +2 -2
  5. package/dist/index.d.ts +458 -19
  6. package/dist/index.esm.js +975 -261
  7. package/dist/index.esm.js.map +1 -1
  8. package/dist/index.js +984 -261
  9. package/dist/index.js.map +1 -1
  10. package/dist/index.min.js +1 -1
  11. package/dist/index.min.js.map +1 -1
  12. package/dist/themes/applemix.css +373 -55
  13. package/dist/themes/applemix.min.css +2 -2
  14. package/dist/themes/boomdevs.css +372 -54
  15. package/dist/themes/boomdevs.min.css +2 -2
  16. package/dist/themes/esrar.css +373 -55
  17. package/dist/themes/esrar.min.css +2 -2
  18. package/dist/themes/flashtrade.css +1776 -612
  19. package/dist/themes/flashtrade.min.css +113 -7
  20. package/dist/themes/mashroom.css +372 -54
  21. package/dist/themes/mashroom.min.css +2 -2
  22. package/dist/themes/shaj-default.css +372 -54
  23. package/dist/themes/shaj-default.min.css +2 -2
  24. package/package.json +1 -1
  25. package/src/components/Button/Button.stories.tsx +199 -0
  26. package/src/components/Button/Button.tsx +238 -78
  27. package/src/components/Card/Card.stories.tsx +202 -0
  28. package/src/components/Card/Card.tsx +248 -77
  29. package/src/components/Form/Input.stories.tsx +228 -2
  30. package/src/components/Hero/Hero.stories.tsx +297 -0
  31. package/src/components/Hero/Hero.tsx +79 -0
  32. package/src/components/{Tab/Tab.stories.tsx → Tabs/Tabs.stories.tsx} +9 -9
  33. package/src/components/{Tab/Tab.tsx → Tabs/Tabs.tsx} +7 -7
  34. package/src/components/Tabs/index.ts +2 -0
  35. package/src/components/Tooltip/Tooltip.tsx +68 -66
  36. package/src/components/index.ts +12 -2
  37. package/src/lib/composables/useButton.ts +37 -5
  38. package/src/lib/composables/useHero.ts +33 -4
  39. package/src/lib/composables/useHeroBackgroundSlider.ts +228 -0
  40. package/src/lib/composables/useInput.ts +39 -1
  41. package/src/lib/constants/components.ts +59 -0
  42. package/src/lib/types/components.ts +376 -4
  43. package/src/styles/01-settings/_settings.tooltip.scss +2 -2
  44. package/src/styles/06-components/_components.button.scss +100 -0
  45. package/src/styles/06-components/_components.card.scss +219 -1
  46. package/src/styles/06-components/_components.hero.scss +51 -1
  47. package/src/styles/06-components/_components.tooltip.scss +89 -66
  48. package/src/components/Tab/index.ts +0 -2
@@ -1,7 +1,9 @@
1
1
  @use 'sass:map';
2
2
  @use '../01-settings/settings.config' as *;
3
3
  @use '../01-settings/settings.card' as *;
4
+ @use '../01-settings/settings.spacing' as spacing;
4
5
  @use '../01-settings/settings.border-radius' as *;
6
+ @use '../01-settings/settings.maps' as maps;
5
7
  @use '../02-tools/tools.rem' as *;
6
8
  @use '../02-tools/tools.animations' as *;
7
9
  @use '../02-tools/tools.object-fit' as *;
@@ -44,6 +46,28 @@
44
46
 
45
47
  @include dynamic-background(var(--#{$prefix}card-bg));
46
48
 
49
+ // Link card support - ensure anchor elements behave like block elements
50
+ display: block;
51
+ text-decoration: none;
52
+ color: inherit;
53
+
54
+ // Reset anchor element default styles when card is used as a link
55
+ // This needs higher specificity to override global link styles
56
+ &[href] {
57
+ display: block;
58
+ text-decoration: none !important;
59
+ color: inherit !important;
60
+ cursor: pointer;
61
+
62
+ &:hover,
63
+ &:focus,
64
+ &:visited,
65
+ &:active {
66
+ text-decoration: none !important;
67
+ color: inherit !important;
68
+ }
69
+ }
70
+
47
71
  &__header {
48
72
  margin-bottom: var(--#{$prefix}card-header-spacer-y);
49
73
  }
@@ -138,13 +162,201 @@
138
162
  }
139
163
  }
140
164
 
165
+
166
+
167
+ &--sm {
168
+ --#{$prefix}card-spacer-y: #{rem(map.get(spacing.$spacing-sizes, 2))}; // 8px
169
+ --#{$prefix}card-spacer-x: #{rem(map.get(spacing.$spacing-sizes, 2))}; // 8px
170
+ --#{$prefix}card-title-font-size: var(--#{$prefix}font-size-sm);
171
+ --#{$prefix}card-text-font-size: var(--#{$prefix}font-size-xs);
172
+ }
173
+
174
+ // &--md is the default size, no modifier needed
175
+
176
+ &--lg {
177
+ --#{$prefix}card-spacer-y: #{rem(map.get(spacing.$spacing-sizes, 6))}; // 24px
178
+ --#{$prefix}card-spacer-x: #{rem(map.get(spacing.$spacing-sizes, 6))}; // 24px
179
+ --#{$prefix}card-title-font-size: var(--#{$prefix}font-size-lg);
180
+ --#{$prefix}card-text-font-size: var(--#{$prefix}font-size-base);
181
+ }
182
+
183
+ &--filled {
184
+ // Default appearance - solid background
185
+ @include dynamic-background(var(--#{$prefix}card-bg));
186
+ }
187
+
188
+ &--outlined {
189
+ background-color: transparent;
190
+ border-width: var(--#{$prefix}card-border-width);
191
+ }
192
+
193
+ &--ghost {
194
+ background-color: transparent;
195
+ border: none;
196
+ }
197
+
198
+ &--elevated {
199
+ box-shadow: var(--#{$prefix}box-shadow-md, 0 4px 6px rgba(0, 0, 0, 0.1));
200
+ }
201
+
202
+ &--elevation-none {
203
+ box-shadow: none;
204
+ }
205
+
206
+ &--elevation-sm {
207
+ box-shadow: var(--#{$prefix}box-shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.05));
208
+ }
209
+
210
+ &--elevation-md {
211
+ box-shadow: var(--#{$prefix}box-shadow-md, 0 4px 6px rgba(0, 0, 0, 0.1));
212
+ }
213
+
214
+ &--elevation-lg {
215
+ box-shadow: var(--#{$prefix}box-shadow-lg, 0 10px 15px rgba(0, 0, 0, 0.1));
216
+ }
217
+
218
+ &--elevation-xl {
219
+ box-shadow: var(--#{$prefix}box-shadow-xl, 0 20px 25px rgba(0, 0, 0, 0.1));
220
+ }
221
+
222
+ &--disabled {
223
+ opacity: 0.6;
224
+ cursor: not-allowed;
225
+ pointer-events: none;
226
+ user-select: none;
227
+ }
228
+
229
+ &--loading {
230
+ position: relative;
231
+ pointer-events: none;
232
+ user-select: none;
233
+ overflow: hidden;
234
+
235
+ &::before {
236
+ content: '';
237
+ position: absolute;
238
+ inset: 0;
239
+ background-color: rgba(255, 255, 255, 0.7);
240
+ backdrop-filter: blur(1px);
241
+ z-index: 1;
242
+ border-radius: var(--#{$prefix}card-border-radius);
243
+ }
244
+
245
+ // Dark theme support
246
+ [data-theme='dark'] &,
247
+ &.dark {
248
+ &::before {
249
+ background-color: rgba(0, 0, 0, 0.5);
250
+ }
251
+ }
252
+ }
253
+
254
+ &--selected {
255
+ --#{$prefix}card-border-color: var(--#{$prefix}brand-border-subtle);
256
+ --#{$prefix}card-border-width: 2px;
257
+ box-shadow: var(--#{$prefix}box-shadow-md, 0 4px 6px rgba(0, 0, 0, 0.1));
258
+ }
259
+
260
+ &--interactive {
261
+ cursor: pointer;
262
+ transition: all 0.2s ease-in-out;
263
+
264
+ &:hover:not(&--disabled) {
265
+ transform: translateY(-2px);
266
+ box-shadow: var(--#{$prefix}box-shadow-lg, 0 10px 15px rgba(0, 0, 0, 0.1));
267
+ }
268
+
269
+ &:active:not(&--disabled) {
270
+ transform: translateY(0);
271
+ }
272
+ }
273
+
274
+ @each $color, $value in maps.$theme-colors {
275
+ &--#{$color} {
276
+ @if ($color == 'primary') {
277
+ --#{$prefix}card-bg: var(--#{$prefix}brand-bg-subtle);
278
+ --#{$prefix}card-bg-hover: var(--#{$prefix}brand-bg-subtle);
279
+ --#{$prefix}card-border-color: var(--#{$prefix}brand-border-subtle);
280
+ --#{$prefix}card-title-color: var(--#{$prefix}brand-text-emphasis);
281
+ } @else if ($color == 'dark') {
282
+ --#{$prefix}card-bg: var(--#{$prefix}dark);
283
+ --#{$prefix}card-bg-hover: var(--#{$prefix}dark-hover);
284
+ --#{$prefix}card-border-color: var(--#{$prefix}dark);
285
+ --#{$prefix}card-title-color: var(--#{$prefix}light);
286
+ --#{$prefix}card-text-color: rgba(255, 255, 255, 0.8);
287
+ } @else if ($color == 'light') {
288
+ --#{$prefix}card-bg: var(--#{$prefix}light);
289
+ --#{$prefix}card-bg-hover: var(--#{$prefix}light-hover);
290
+ --#{$prefix}card-border-color: var(--#{$prefix}light);
291
+ --#{$prefix}card-title-color: var(--#{$prefix}dark);
292
+ --#{$prefix}card-text-color: rgba(0, 0, 0, 0.7);
293
+ } @else {
294
+ --#{$prefix}card-bg: var(--#{$prefix}#{$color}-bg-subtle);
295
+ --#{$prefix}card-bg-hover: var(--#{$prefix}#{$color}-bg-subtle);
296
+ --#{$prefix}card-border-color: var(--#{$prefix}#{$color}-border-subtle);
297
+ --#{$prefix}card-title-color: var(--#{$prefix}#{$color}-text-emphasis);
298
+ }
299
+ }
300
+ }
301
+
141
302
  &--glass {
142
303
  max-width: none;
143
304
  @include dynamic-background(var(--#{$prefix}card-bg), $background-transparency-enable: true);
144
305
  }
306
+
307
+ &__loading {
308
+ position: absolute;
309
+ inset: 0;
310
+ display: flex;
311
+ align-items: center;
312
+ justify-content: center;
313
+ z-index: 2;
314
+ border-radius: var(--#{$prefix}card-border-radius);
315
+ pointer-events: none;
316
+ }
317
+
318
+ &__spinner {
319
+ width: 2.5rem;
320
+ height: 2.5rem;
321
+ border: 4px solid;
322
+ border-color: var(--#{$prefix}border-primary, rgba(0, 0, 0, 0.15));
323
+ border-top-color: var(--#{$prefix}brand-text-emphasis, var(--#{$prefix}primary, #7c3aed));
324
+ border-right-color: var(--#{$prefix}brand-text-emphasis, var(--#{$prefix}primary, #7c3aed));
325
+ border-radius: 50%;
326
+ animation: spin 0.8s linear infinite;
327
+ background-color: transparent;
328
+ flex-shrink: 0;
329
+ box-sizing: border-box;
330
+ display: block;
331
+ }
332
+
333
+ &:focus-visible {
334
+ outline: 2px solid var(--#{$prefix}brand-border-subtle);
335
+ outline-offset: 2px;
336
+ }
337
+
338
+ @media (prefers-reduced-motion: reduce) {
339
+ transition: none;
340
+
341
+ &--interactive:hover:not(&--disabled) {
342
+ transform: none;
343
+ }
344
+
345
+ &__spinner {
346
+ animation: none;
347
+ border-top-color: transparent;
348
+ }
349
+ }
350
+
351
+ @media (prefers-contrast: high) {
352
+ border-width: 2px;
353
+
354
+ &--selected {
355
+ border-width: 3px;
356
+ }
357
+ }
145
358
  }
146
359
 
147
- // Elevation effect for ElevationCard
148
360
  .is-elevated {
149
361
  .c-card {
150
362
  box-shadow: var(--#{$prefix}box-shadow-lg, 0 16px 48px rgba(0, 0, 0, 0.175));
@@ -152,3 +364,9 @@
152
364
  transition: box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1);
153
365
  }
154
366
  }
367
+
368
+ @keyframes spin {
369
+ to {
370
+ transform: rotate(360deg);
371
+ }
372
+ }
@@ -60,7 +60,7 @@
60
60
  inset: 0;
61
61
  @include dynamic-background(var(--#{$prefix}hero-overlay));
62
62
  opacity: var(--#{$prefix}hero-overlay-opacity);
63
- z-index: 0;
63
+ z-index: 1;
64
64
  }
65
65
 
66
66
  &__container {
@@ -145,4 +145,54 @@
145
145
  &--full-vh {
146
146
  min-height: 100vh;
147
147
  }
148
+
149
+ &__slider {
150
+ position: absolute;
151
+ inset: 0;
152
+ overflow: hidden;
153
+ z-index: 0;
154
+ }
155
+
156
+ &__slider-item {
157
+ position: absolute;
158
+ inset: 0;
159
+ opacity: 0;
160
+ transition: opacity var(--slider-transition-duration, 1000ms) ease-in-out;
161
+ pointer-events: none;
162
+
163
+ img,
164
+ video {
165
+ @include square(100%);
166
+ @include object-fit(cover);
167
+ }
168
+
169
+ &--active {
170
+ opacity: 1;
171
+ pointer-events: auto;
172
+ z-index: 1;
173
+ }
174
+ }
175
+
176
+ &__slider--fade {
177
+ .c-hero__slider-item {
178
+ transition: opacity var(--slider-transition-duration, 1000ms) ease-in-out;
179
+ }
180
+ }
181
+
182
+ &__slider--slide {
183
+ .c-hero__slider-item {
184
+ transform: translateX(100%);
185
+ transition: transform var(--slider-transition-duration, 1000ms) ease-in-out;
186
+
187
+ &--active {
188
+ transform: translateX(0);
189
+ }
190
+ }
191
+ }
192
+
193
+ &__slider--custom {
194
+ .c-hero__slider-item {
195
+ transition: all var(--slider-transition-duration, 1000ms) ease-in-out;
196
+ }
197
+ }
148
198
  }
@@ -19,17 +19,61 @@
19
19
  --#{$prefix}tooltip-border-color: #{$tooltip-border-color};
20
20
  --#{$prefix}tooltip-box-shadow: #{$tooltip-box-shadow};
21
21
  --#{$prefix}tooltip-arrow-size: #{rem($tooltip-arrow-size)};
22
+ --#{$prefix}tooltip-offset: #{rem($tooltip-arrow-size)}; // Default offset
22
23
 
23
24
  position: absolute;
24
- bottom: calc(100% + var(--#{$prefix}tooltip-arrow-size));
25
- left: 50%;
26
25
  width: max-content;
27
26
  height: max-content;
28
27
  max-width: var(--#{$prefix}tooltip-max-width);
29
- transform: translateX(-50%);
30
- pointer-events: none;
28
+ pointer-events: none; // Wrapper shouldn't block clicks, but content might
31
29
  z-index: 1000;
32
30
 
31
+ // Base positioning logic
32
+ &--top,
33
+ &--top-left,
34
+ &--top-right {
35
+ bottom: calc(100% + var(--#{$prefix}tooltip-offset));
36
+ transform-origin: bottom center;
37
+ }
38
+
39
+ &--bottom,
40
+ &--bottom-left,
41
+ &--bottom-right {
42
+ top: calc(100% + var(--#{$prefix}tooltip-offset));
43
+ transform-origin: top center;
44
+ }
45
+
46
+ &--left {
47
+ right: calc(100% + var(--#{$prefix}tooltip-offset));
48
+ top: 50%;
49
+ transform: translateY(-50%);
50
+ transform-origin: right center;
51
+ }
52
+
53
+ &--right {
54
+ left: calc(100% + var(--#{$prefix}tooltip-offset));
55
+ top: 50%;
56
+ transform: translateY(-50%);
57
+ transform-origin: left center;
58
+ }
59
+
60
+ // Horizontal alignment for top/bottom
61
+ &--top,
62
+ &--bottom {
63
+ left: 50%;
64
+ transform: translateX(-50%);
65
+ }
66
+
67
+ &--top-left,
68
+ &--bottom-left {
69
+ left: 0;
70
+ }
71
+
72
+ &--top-right,
73
+ &--bottom-right {
74
+ right: 0;
75
+ }
76
+
33
77
  &__content {
34
78
  position: relative;
35
79
  color: var(--#{$prefix}tooltip-color);
@@ -38,12 +82,20 @@
38
82
  padding: var(--#{$prefix}tooltip-padding-y) var(--#{$prefix}tooltip-padding-x);
39
83
  @include dynamic-background(var(--#{$prefix}tooltip-bg));
40
84
  border-radius: var(--#{$prefix}tooltip-border-radius);
85
+ box-shadow: var(--#{$prefix}tooltip-box-shadow);
41
86
  z-index: 2;
42
87
  opacity: 0;
43
- transform: scale(0.95);
88
+ pointer-events: auto; // Allow interaction with tooltip content
89
+
90
+ // Animation
44
91
  transition:
45
- opacity 0.2s ease-out,
46
- transform 0.2s ease-out;
92
+ opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1),
93
+ transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
94
+
95
+ // Initial states for animation based on position would be complex to do purely generically here without separate classes
96
+ // So we stick to a simple scale/fade
97
+ transform: scale(0.95);
98
+
47
99
  &.is-active {
48
100
  opacity: 1;
49
101
  transform: scale(1);
@@ -52,81 +104,52 @@
52
104
 
53
105
  &__arrow {
54
106
  position: absolute;
55
- bottom: calc(var(--#{$prefix}tooltip-arrow-size) / -2);
56
- left: 50%;
57
- transform: translateX(-50%) rotate(45deg);
58
- @include square(var(--#{$prefix}tooltip-arrow-size));
107
+ width: var(--#{$prefix}tooltip-arrow-size);
108
+ height: var(--#{$prefix}tooltip-arrow-size);
59
109
  @include dynamic-background(var(--#{$prefix}tooltip-bg));
60
110
  z-index: 1;
111
+ transform: rotate(45deg);
61
112
  }
62
113
 
63
- &--top-left {
64
- left: auto;
65
- right: calc(100% - var(--#{$prefix}tooltip-arrow-size) * 2);
66
- transform: translateX(0);
67
-
68
- #{$root}__arrow {
69
- left: auto;
70
- right: var(--#{$prefix}tooltip-arrow-size);
71
- transform: rotate(45deg);
72
- }
114
+ // Arrow positioning
115
+ &--top &__arrow,
116
+ &--top-left &__arrow,
117
+ &--top-right &__arrow {
118
+ bottom: calc(var(--#{$prefix}tooltip-arrow-size) / -2);
73
119
  }
74
120
 
75
- &--top-right {
76
- left: calc(100% - var(--#{$prefix}tooltip-arrow-size) * 2);
77
- transform: translateX(0);
78
-
79
- #{$root}__arrow {
80
- left: var(--#{$prefix}tooltip-arrow-size);
81
- transform: rotate(45deg);
82
- }
121
+ &--bottom &__arrow,
122
+ &--bottom-left &__arrow,
123
+ &--bottom-right &__arrow {
124
+ top: calc(var(--#{$prefix}tooltip-arrow-size) / -2);
83
125
  }
84
126
 
85
- &--right {
86
- left: calc(100% + var(--#{$prefix}tooltip-arrow-size));
127
+ &--left &__arrow {
128
+ right: calc(var(--#{$prefix}tooltip-arrow-size) / -2);
87
129
  top: 50%;
88
- transform: translateY(-50%);
89
-
90
- #{$root}__arrow {
91
- left: calc(var(--#{$prefix}tooltip-arrow-size) / -2);
92
- top: 50%;
93
- bottom: auto;
94
- transform: rotate(45deg) translateY(-50%);
95
- transform-origin: top;
96
- }
130
+ transform: translateY(-50%) rotate(45deg);
97
131
  }
98
132
 
99
- &--left {
100
- left: auto;
101
- right: calc(100% + var(--#{$prefix}tooltip-arrow-size));
133
+ &--right &__arrow {
134
+ left: calc(var(--#{$prefix}tooltip-arrow-size) / -2);
102
135
  top: 50%;
103
- transform: translateY(-50%);
104
-
105
- #{$root}__arrow {
106
- left: auto;
107
- top: 50%;
108
- bottom: auto;
109
- right: calc(var(--#{$prefix}tooltip-arrow-size) / -5);
110
- transform: rotate(45deg) translateY(-50%);
111
- }
136
+ transform: translateY(-50%) rotate(45deg);
112
137
  }
113
138
 
114
- &--bottom {
115
- top: calc(100% + var(--#{$prefix}tooltip-arrow-size));
116
-
117
- #{$root}__arrow {
118
- top: calc(var(--#{$prefix}tooltip-arrow-size) / -2);
119
- bottom: auto;
120
- }
139
+ // Arrow horizontal alignment
140
+ &--top &__arrow,
141
+ &--bottom &__arrow {
142
+ left: 50%;
143
+ transform: translateX(-50%) rotate(45deg);
121
144
  }
122
145
 
123
- &--bottom-left {
124
- top: calc(100% + var(--#{$prefix}tooltip-arrow-size));
125
- left: 0;
146
+ &--top-left &__arrow,
147
+ &--bottom-left &__arrow {
148
+ left: var(--#{$prefix}tooltip-arrow-size);
126
149
  }
127
150
 
128
- &--bottom-right {
129
- top: calc(100% + var(--#{$prefix}tooltip-arrow-size));
130
- right: 0;
151
+ &--top-right &__arrow,
152
+ &--bottom-right &__arrow {
153
+ right: var(--#{$prefix}tooltip-arrow-size);
131
154
  }
132
- }
155
+ }
@@ -1,2 +0,0 @@
1
- export { Tab } from './Tab';
2
- export type { TabProps, TabItemProps } from './Tab';