@abstraks-dev/ui-library 1.0.1

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 (158) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +708 -0
  3. package/dist/__tests__/Anchor.test.js +145 -0
  4. package/dist/__tests__/ArrowRight.test.js +91 -0
  5. package/dist/__tests__/Avatar.test.js +123 -0
  6. package/dist/__tests__/Button.test.js +82 -0
  7. package/dist/__tests__/Card.test.js +198 -0
  8. package/dist/__tests__/CheckCircle.test.js +98 -0
  9. package/dist/__tests__/Checkbox.test.js +161 -0
  10. package/dist/__tests__/ChevronDown.test.js +73 -0
  11. package/dist/__tests__/Close.test.js +98 -0
  12. package/dist/__tests__/EditSquare.test.js +99 -0
  13. package/dist/__tests__/Error.test.js +74 -0
  14. package/dist/__tests__/Footer.test.js +66 -0
  15. package/dist/__tests__/Heading.test.js +227 -0
  16. package/dist/__tests__/Hero.test.js +74 -0
  17. package/dist/__tests__/Label.test.js +123 -0
  18. package/dist/__tests__/Loader.test.js +115 -0
  19. package/dist/__tests__/MenuHover.test.js +137 -0
  20. package/dist/__tests__/Paragraph.test.js +93 -0
  21. package/dist/__tests__/PlusCircle.test.js +99 -0
  22. package/dist/__tests__/Radio.test.js +153 -0
  23. package/dist/__tests__/Select.test.js +187 -0
  24. package/dist/__tests__/Tabs.test.js +162 -0
  25. package/dist/__tests__/TextArea.test.js +127 -0
  26. package/dist/__tests__/TextInput.test.js +181 -0
  27. package/dist/__tests__/Toggle.test.js +120 -0
  28. package/dist/__tests__/TrashX.test.js +99 -0
  29. package/dist/__tests__/useHeadingAccessibility.test.js +144 -0
  30. package/dist/components/Anchor.js +131 -0
  31. package/dist/components/Animation.js +129 -0
  32. package/dist/components/AnimationGroup.js +207 -0
  33. package/dist/components/AnimationToggle.js +216 -0
  34. package/dist/components/Avatar.js +153 -0
  35. package/dist/components/Button.js +218 -0
  36. package/dist/components/Card.js +222 -0
  37. package/dist/components/Checkbox.js +305 -0
  38. package/dist/components/Crud.js +564 -0
  39. package/dist/components/DragAndDrop.js +337 -0
  40. package/dist/components/Error.js +206 -0
  41. package/dist/components/Footer.js +99 -0
  42. package/dist/components/Form.js +412 -0
  43. package/dist/components/Header.js +372 -0
  44. package/dist/components/Heading.js +134 -0
  45. package/dist/components/Hero.js +181 -0
  46. package/dist/components/Label.js +256 -0
  47. package/dist/components/Loader.js +302 -0
  48. package/dist/components/MenuHover.js +114 -0
  49. package/dist/components/Paragraph.js +128 -0
  50. package/dist/components/Prompt.js +61 -0
  51. package/dist/components/Radio.js +254 -0
  52. package/dist/components/Select.js +422 -0
  53. package/dist/components/SideMenu.js +313 -0
  54. package/dist/components/Tabs.js +297 -0
  55. package/dist/components/TextArea.js +370 -0
  56. package/dist/components/TextInput.js +286 -0
  57. package/dist/components/Toggle.js +186 -0
  58. package/dist/components/crudFiles/CrudEditBase.js +150 -0
  59. package/dist/components/crudFiles/CrudViewBase.js +39 -0
  60. package/dist/components/crudFiles/crudDevelopment.js +118 -0
  61. package/dist/components/crudFiles/crudEditHandlers.js +50 -0
  62. package/dist/constants/animation.js +30 -0
  63. package/dist/icons/ArrowIcon.js +32 -0
  64. package/dist/icons/ArrowRight.js +33 -0
  65. package/dist/icons/CheckCircle.js +33 -0
  66. package/dist/icons/ChevronDown.js +28 -0
  67. package/dist/icons/Close.js +33 -0
  68. package/dist/icons/EditSquare.js +33 -0
  69. package/dist/icons/Ellipses.js +34 -0
  70. package/dist/icons/Hamburger.js +39 -0
  71. package/dist/icons/LoadingSpinner.js +42 -0
  72. package/dist/icons/PlusCircle.js +33 -0
  73. package/dist/icons/SaveIcon.js +32 -0
  74. package/dist/icons/TrashX.js +33 -0
  75. package/dist/icons/__tests__/CheckCircle.test.js +9 -0
  76. package/dist/icons/__tests__/ChevronDown.test.js +9 -0
  77. package/dist/icons/__tests__/Close.test.js +9 -0
  78. package/dist/icons/__tests__/EditSquare.test.js +9 -0
  79. package/dist/icons/__tests__/PlusCircle.test.js +9 -0
  80. package/dist/icons/__tests__/TrashX.test.js +9 -0
  81. package/dist/icons/index.js +89 -0
  82. package/dist/index.js +332 -0
  83. package/dist/setupTests.js +3 -0
  84. package/dist/styles/_variables.scss +286 -0
  85. package/dist/styles/anchor.scss +40 -0
  86. package/dist/styles/animation-accessibility.scss +96 -0
  87. package/dist/styles/animation-toggle.scss +233 -0
  88. package/dist/styles/animation.scss +3781 -0
  89. package/dist/styles/avatar.scss +285 -0
  90. package/dist/styles/button.scss +430 -0
  91. package/dist/styles/card.scss +210 -0
  92. package/dist/styles/checkbox.scss +160 -0
  93. package/dist/styles/crud.scss +474 -0
  94. package/dist/styles/dragAndDrop.scss +312 -0
  95. package/dist/styles/error.scss +232 -0
  96. package/dist/styles/footer.scss +58 -0
  97. package/dist/styles/form.scss +420 -0
  98. package/dist/styles/grid.scss +29 -0
  99. package/dist/styles/header.scss +276 -0
  100. package/dist/styles/heading.scss +118 -0
  101. package/dist/styles/hero.scss +185 -0
  102. package/dist/styles/htmlElements.scss +20 -0
  103. package/dist/styles/image.scss +9 -0
  104. package/dist/styles/label.scss +340 -0
  105. package/dist/styles/list-item.scss +5 -0
  106. package/dist/styles/loader.scss +354 -0
  107. package/dist/styles/logo.scss +19 -0
  108. package/dist/styles/main.css +9056 -0
  109. package/dist/styles/main.css.map +1 -0
  110. package/dist/styles/main.scss +0 -0
  111. package/dist/styles/menu-hover.scss +30 -0
  112. package/dist/styles/paragraph.scss +88 -0
  113. package/dist/styles/prompt.scss +51 -0
  114. package/dist/styles/radio.scss +202 -0
  115. package/dist/styles/select.scss +363 -0
  116. package/dist/styles/side-menu.scss +334 -0
  117. package/dist/styles/tabs.scss +540 -0
  118. package/dist/styles/text-area.scss +388 -0
  119. package/dist/styles/text-input.scss +171 -0
  120. package/dist/styles/toggle.scss +0 -0
  121. package/dist/styles/unordered-list.scss +8 -0
  122. package/dist/utils/ScrollHandler.js +30 -0
  123. package/dist/utils/accessibility.js +128 -0
  124. package/dist/utils/heroUtils.js +316 -0
  125. package/dist/utils/index.js +104 -0
  126. package/dist/utils/inputValidation.js +29 -0
  127. package/dist/utils/keyboardNavigation.js +536 -0
  128. package/dist/utils/labelUtils.js +708 -0
  129. package/dist/utils/loaderUtils.js +387 -0
  130. package/dist/utils/menuUtils.js +575 -0
  131. package/dist/utils/useHeadingAccessibility.js +298 -0
  132. package/dist/utils/useRadioGroup.js +260 -0
  133. package/dist/utils/useSelectAccessibility.js +426 -0
  134. package/dist/utils/useTabsAccessibility.js +278 -0
  135. package/dist/utils/useTextAreaAccessibility.js +255 -0
  136. package/dist/utils/useTextInputAccessibility.js +295 -0
  137. package/dist/utils/useTypographyAccessibility.js +168 -0
  138. package/dist/utils/useWindowSize.js +32 -0
  139. package/dist/utils/utils/ScrollHandler.js +26 -0
  140. package/dist/utils/utils/accessibility.js +133 -0
  141. package/dist/utils/utils/heroUtils.js +348 -0
  142. package/dist/utils/utils/index.js +9 -0
  143. package/dist/utils/utils/inputValidation.js +22 -0
  144. package/dist/utils/utils/keyboardNavigation.js +664 -0
  145. package/dist/utils/utils/labelUtils.js +772 -0
  146. package/dist/utils/utils/loaderUtils.js +436 -0
  147. package/dist/utils/utils/menuUtils.js +651 -0
  148. package/dist/utils/utils/useHeadingAccessibility.js +334 -0
  149. package/dist/utils/utils/useRadioGroup.js +311 -0
  150. package/dist/utils/utils/useSelectAccessibility.js +498 -0
  151. package/dist/utils/utils/useTabsAccessibility.js +316 -0
  152. package/dist/utils/utils/useTextAreaAccessibility.js +303 -0
  153. package/dist/utils/utils/useTextInputAccessibility.js +338 -0
  154. package/dist/utils/utils/useTypographyAccessibility.js +180 -0
  155. package/dist/utils/utils/useWindowSize.js +26 -0
  156. package/dist/utils/utils/validation.js +131 -0
  157. package/dist/utils/validation.js +139 -0
  158. package/package.json +90 -0
@@ -0,0 +1,474 @@
1
+ @use 'variables' as *;
2
+
3
+ // Mixin for disabling animations and transitions
4
+ @mixin disable-animations {
5
+ transition: none !important;
6
+ transform: none !important;
7
+ opacity: 1 !important;
8
+ }
9
+
10
+ // Mixin for disabling motion effects
11
+ @mixin disable-motion-transforms {
12
+ transform: none;
13
+ transition: none;
14
+ }
15
+
16
+ .crud {
17
+ // Screen reader only content
18
+ .sr-only {
19
+ position: absolute;
20
+ width: 1px;
21
+ height: 1px;
22
+ padding: 0;
23
+ margin: -1px;
24
+ overflow: hidden;
25
+ clip: rect(0, 0, 0, 0);
26
+ white-space: nowrap;
27
+ border: 0;
28
+ }
29
+
30
+ .list {
31
+ position: relative;
32
+
33
+ .item {
34
+ display: flex;
35
+ flex-direction: column;
36
+ margin-bottom: 16px;
37
+ padding: 16px;
38
+ background-color: $color-white;
39
+ border: 1px solid $gray-300;
40
+ border-radius: 8px;
41
+ transition: all 0.2s ease;
42
+ position: relative;
43
+
44
+ &:hover {
45
+ border-color: $gray-400;
46
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
47
+ }
48
+
49
+ &:focus-within {
50
+ outline: 2px solid $focus-color;
51
+ outline-offset: 2px;
52
+ border-color: $focus-color;
53
+ }
54
+
55
+ // Drag and drop states
56
+ &.dragging {
57
+ opacity: 0.5;
58
+ transform: rotate(5deg);
59
+ z-index: $z-index-overlay;
60
+ cursor: grabbing;
61
+ // Ensure drag events still work during animation
62
+ pointer-events: auto;
63
+ }
64
+
65
+ &.drop-target {
66
+ border-color: $color-primary;
67
+ background-color: rgba($color-primary, 0.1);
68
+ transform: scale(1.02);
69
+ // Ensure drop events work
70
+ pointer-events: auto;
71
+ }
72
+
73
+ &[draggable='true'] {
74
+ cursor: grab;
75
+
76
+ &:hover {
77
+ transform: translateY(-2px);
78
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
79
+ }
80
+ }
81
+
82
+ @media #{$medium} {
83
+ flex-direction: row;
84
+ align-items: center;
85
+ margin-bottom: 20px;
86
+ padding: 20px;
87
+ }
88
+
89
+ @media #{$large} {
90
+ margin-bottom: 24px;
91
+ padding: 24px;
92
+ }
93
+
94
+ @media #{$xlarge} {
95
+ margin-bottom: 28px;
96
+ padding: 28px;
97
+ }
98
+
99
+ .input-container {
100
+ display: flex;
101
+ flex-direction: column;
102
+ width: 100%;
103
+ margin-bottom: 12px;
104
+
105
+ @media #{$medium} {
106
+ width: 75%;
107
+ margin-bottom: 0;
108
+ margin-right: 16px;
109
+ }
110
+
111
+ @media #{$large} {
112
+ width: 80%;
113
+ margin-right: 20px;
114
+ }
115
+
116
+ @media #{$xlarge} {
117
+ width: 85%;
118
+ margin-right: 24px;
119
+ }
120
+
121
+ .text-input,
122
+ .select-input {
123
+ line-height: normal;
124
+ background-color: $color-white;
125
+ width: 100%;
126
+ padding: 12px 16px;
127
+ border: 2px solid $gray-300;
128
+ border-radius: 6px;
129
+ font-size: 16px;
130
+ font-weight: normal;
131
+ color: $color-font-body;
132
+ transition: all 0.2s ease;
133
+
134
+ &:focus {
135
+ outline: none;
136
+ border-color: $focus-color;
137
+ box-shadow: 0 0 0 3px rgba($focus-color, 0.2);
138
+ }
139
+
140
+ &:hover:not(:focus) {
141
+ border-color: $gray-500;
142
+ }
143
+
144
+ &[disabled] {
145
+ cursor: not-allowed;
146
+ background-color: $gray-100;
147
+ color: $gray-500;
148
+
149
+ &:hover {
150
+ border-color: $gray-300;
151
+ }
152
+ }
153
+
154
+ @media #{$medium} {
155
+ padding: 14px 18px;
156
+ font-size: 15px;
157
+ }
158
+
159
+ @media #{$large} {
160
+ padding: 16px 20px;
161
+ }
162
+
163
+ &[type='search'] {
164
+ box-sizing: content-box;
165
+ }
166
+
167
+ &[type='search']::-webkit-search-cancel-button,
168
+ &[type='search']::-webkit-search-decoration {
169
+ -webkit-appearance: none;
170
+ }
171
+ }
172
+
173
+ .item-content {
174
+ padding: 12px 16px;
175
+ margin: 0;
176
+ background-color: transparent;
177
+ border: 2px solid transparent;
178
+ border-radius: 6px;
179
+ line-height: 1.5;
180
+ min-height: 48px;
181
+ display: flex;
182
+ align-items: center;
183
+
184
+ @media #{$medium} {
185
+ padding: 14px 18px;
186
+ min-height: 52px;
187
+ }
188
+
189
+ @media #{$large} {
190
+ padding: 16px 20px;
191
+ min-height: 56px;
192
+ }
193
+ }
194
+ }
195
+
196
+ .inside-btns {
197
+ display: flex;
198
+ flex-direction: row;
199
+ justify-content: flex-start;
200
+ gap: 8px;
201
+ width: 100%;
202
+
203
+ @media #{$medium} {
204
+ justify-content: flex-end;
205
+ width: auto;
206
+ gap: 12px;
207
+ }
208
+
209
+ @media #{$large} {
210
+ gap: 16px;
211
+ }
212
+
213
+ .btn-icon {
214
+ display: flex;
215
+ align-items: center;
216
+ flex-direction: row;
217
+ gap: 8px;
218
+ padding: 8px 12px;
219
+ border: 2px solid transparent;
220
+ background-color: transparent;
221
+ border-radius: 6px;
222
+ cursor: pointer;
223
+ transition: all 0.2s ease;
224
+ font-size: 14px;
225
+ font-weight: 500;
226
+ min-height: 44px;
227
+ min-width: 44px;
228
+
229
+ &:hover {
230
+ background-color: $gray-100;
231
+ border-color: $gray-300;
232
+ }
233
+
234
+ &:focus {
235
+ outline: 2px solid $focus-color;
236
+ outline-offset: 2px;
237
+ background-color: $gray-100;
238
+ }
239
+
240
+ &:active {
241
+ transform: translateY(1px);
242
+ }
243
+
244
+ &.save-btn:hover {
245
+ background-color: rgba($color-success, 0.1);
246
+ border-color: $color-success;
247
+ color: $color-success;
248
+ }
249
+
250
+ &.delete-btn:hover {
251
+ background-color: rgba($color-error, 0.1);
252
+ border-color: $color-error;
253
+ color: $color-error;
254
+ }
255
+
256
+ &.edit-btn:hover {
257
+ background-color: rgba($color-secondary, 0.1);
258
+ border-color: $color-secondary;
259
+ color: $color-secondary;
260
+ }
261
+
262
+ @media #{$medium} {
263
+ padding: 10px 16px;
264
+ font-size: 15px;
265
+ }
266
+
267
+ @media #{$large} {
268
+ padding: 12px 18px;
269
+ }
270
+
271
+ .text {
272
+ display: none;
273
+
274
+ @media #{$medium} {
275
+ display: inline-flex;
276
+ }
277
+ }
278
+
279
+ // Icon only on small screens
280
+ @media (max-width: 767px) {
281
+ justify-content: center;
282
+ padding: 12px;
283
+
284
+ .text {
285
+ display: none;
286
+ }
287
+ }
288
+ }
289
+ }
290
+ }
291
+ }
292
+
293
+ .add-btn {
294
+ margin-top: 20px;
295
+ width: 100%;
296
+
297
+ @media #{$medium} {
298
+ width: auto;
299
+ margin-top: 24px;
300
+ }
301
+
302
+ @media #{$large} {
303
+ margin-top: 28px;
304
+ }
305
+
306
+ .text {
307
+ margin-left: 12px;
308
+
309
+ @media #{$medium} {
310
+ margin-left: 15px;
311
+ }
312
+ }
313
+ }
314
+
315
+ // Animation classes for react-transition-group
316
+ .crud-item-enter {
317
+ opacity: 0;
318
+ transform: translateY(-20px) scale(0.95);
319
+ }
320
+
321
+ .crud-item-enter-active {
322
+ opacity: 1;
323
+ transform: translateY(0) scale(1);
324
+ transition: opacity 300ms ease, transform 300ms ease;
325
+ }
326
+
327
+ .crud-item-exit {
328
+ opacity: 1;
329
+ transform: translateY(0) scale(1);
330
+ }
331
+
332
+ .crud-item-exit-active {
333
+ opacity: 0;
334
+ transform: translateY(-20px) scale(0.95);
335
+ transition: opacity 300ms ease, transform 300ms ease;
336
+ }
337
+
338
+ .crud-item-appear {
339
+ opacity: 0;
340
+ transform: translateY(20px) scale(0.95);
341
+ }
342
+
343
+ .crud-item-appear-active {
344
+ opacity: 1;
345
+ transform: translateY(0) scale(1);
346
+ transition: opacity 300ms ease, transform 300ms ease;
347
+ }
348
+
349
+ // Animated wrapper for drag-and-drop compatibility
350
+ .animated-crud-item {
351
+ // Simple wrapper that doesn't interfere with drag events
352
+ width: 100%;
353
+ display: block;
354
+ position: relative;
355
+
356
+ // Ensure drag events work properly on the wrapper
357
+ &[draggable='true'] {
358
+ cursor: grab;
359
+
360
+ &:active {
361
+ cursor: grabbing;
362
+ }
363
+ }
364
+
365
+ // Drag states for the animation wrapper
366
+ &.dragging {
367
+ opacity: 0.5;
368
+ transform: rotate(2deg);
369
+ z-index: $z-index-overlay;
370
+ cursor: grabbing;
371
+
372
+ // Disable transitions during drag
373
+ * {
374
+ transition: none !important;
375
+ }
376
+ }
377
+
378
+ &.drop-target {
379
+ background-color: rgba(33, 150, 243, 0.1);
380
+ border: 2px dashed #2196f3;
381
+ border-radius: 4px;
382
+
383
+ // Disable transitions during drop targeting
384
+ * {
385
+ transition: none !important;
386
+ }
387
+ }
388
+
389
+ // Disable animations during drag operations to prevent interference
390
+ &.dragging,
391
+ &.drop-target {
392
+ .crud-item-enter-active,
393
+ .crud-item-appear-active {
394
+ transition: none !important;
395
+ transform: none !important;
396
+ }
397
+ }
398
+
399
+ // When dragging, disable pointer events on inner content to ensure drag events reach the wrapper
400
+ &.dragging .item {
401
+ pointer-events: none;
402
+
403
+ // Keep buttons accessible but prevent them from interfering with drag
404
+ button,
405
+ input,
406
+ select,
407
+ textarea {
408
+ pointer-events: none;
409
+ }
410
+ }
411
+ }
412
+
413
+ // High contrast mode support
414
+ @media (prefers-contrast: high) {
415
+ .list .item {
416
+ border-width: 3px;
417
+
418
+ &:hover {
419
+ border-color: $color-black;
420
+ }
421
+
422
+ &:focus-within {
423
+ outline-width: 3px;
424
+ }
425
+ }
426
+
427
+ .inside-btns .btn-icon {
428
+ border-width: 2px;
429
+
430
+ &:hover {
431
+ border-color: $color-black;
432
+ }
433
+ }
434
+ }
435
+
436
+ // Reduced motion support
437
+ @media (prefers-reduced-motion: reduce) {
438
+ .list .item {
439
+ @include disable-motion-transforms;
440
+
441
+ &:hover {
442
+ transform: none;
443
+ box-shadow: none;
444
+ }
445
+
446
+ &.dragging {
447
+ transform: none;
448
+ opacity: 0.7;
449
+ }
450
+
451
+ &.drop-target {
452
+ transform: none;
453
+ }
454
+ }
455
+
456
+ .inside-btns .btn-icon {
457
+ @include disable-motion-transforms;
458
+
459
+ &:active {
460
+ transform: none;
461
+ }
462
+ }
463
+
464
+ // Disable all transition-group animations using mixin
465
+ .crud-item-enter,
466
+ .crud-item-enter-active,
467
+ .crud-item-exit,
468
+ .crud-item-exit-active,
469
+ .crud-item-appear,
470
+ .crud-item-appear-active {
471
+ @include disable-animations;
472
+ }
473
+ }
474
+ }