@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,210 @@
1
+ @use 'variables' as *;
2
+
3
+ .card {
4
+ display: flex;
5
+ flex-direction: column;
6
+ border-radius: 5px;
7
+ border: 1px solid $gray-400;
8
+ background-color: $gray-100;
9
+ position: relative;
10
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
11
+
12
+ // Enhanced accessibility and interaction
13
+ &:focus-within {
14
+ outline: 2px solid $focus-color;
15
+ outline-offset: 2px;
16
+ }
17
+
18
+ &:hover {
19
+ transform: translateY(-2px);
20
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
21
+ }
22
+
23
+ @media #{$medium} {
24
+ display: inline-flex;
25
+ max-width: 400px;
26
+ }
27
+
28
+ @media #{$large} {
29
+ max-width: 450px;
30
+ }
31
+
32
+ @media #{$xlarge} {
33
+ max-width: 500px;
34
+ }
35
+
36
+ .head {
37
+ display: flex;
38
+ align-items: center;
39
+ justify-content: space-between;
40
+ padding: 20px;
41
+ border-bottom: 1px solid $gray-300;
42
+
43
+ .ellipses {
44
+ position: relative;
45
+
46
+ .ellipses-trigger {
47
+ background: none;
48
+ border: none;
49
+ cursor: pointer;
50
+ padding: 8px;
51
+ border-radius: 4px;
52
+ display: flex;
53
+ align-items: center;
54
+ justify-content: center;
55
+ transition: background-color 0.2s ease;
56
+
57
+ &:hover {
58
+ background-color: $gray-200;
59
+ }
60
+
61
+ &:focus {
62
+ outline: 2px solid $focus-color;
63
+ outline-offset: 2px;
64
+ background-color: $gray-200;
65
+ }
66
+
67
+ &[aria-expanded='true'] {
68
+ background-color: $gray-300;
69
+ }
70
+ }
71
+
72
+ .ellipses-content {
73
+ display: flex;
74
+ z-index: $z-index-low;
75
+ position: absolute;
76
+ padding: 8px 0;
77
+ right: 0;
78
+ top: 100%;
79
+ margin-top: 4px;
80
+ min-width: 160px;
81
+ border-radius: 4px;
82
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1),
83
+ 0 2px 4px -1px rgba(0, 0, 0, 0.06);
84
+ background-color: $color-white;
85
+ border: 1px solid $gray-300;
86
+
87
+ // Animation
88
+ opacity: 1;
89
+ transform: scale(1);
90
+ transition: opacity 0.15s ease, transform 0.15s ease;
91
+
92
+ @media #{$medium} {
93
+ right: 20px;
94
+ }
95
+
96
+ .unordered-list {
97
+ margin: 0;
98
+ padding: 0;
99
+ list-style: none;
100
+ flex-direction: column;
101
+
102
+ .list-item {
103
+ padding: 8px 16px;
104
+ cursor: pointer;
105
+ transition: background-color 0.15s ease;
106
+ color: $color-font-body;
107
+ font-size: 14px;
108
+
109
+ &:hover {
110
+ background-color: $gray-100;
111
+ }
112
+
113
+ &:focus {
114
+ background-color: $gray-100;
115
+ outline: none;
116
+ }
117
+
118
+ &:first-child {
119
+ border-radius: 4px 4px 0 0;
120
+ }
121
+
122
+ &:last-child {
123
+ border-radius: 0 0 4px 4px;
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+ }
130
+
131
+ .card-image {
132
+ width: 100%;
133
+ height: auto;
134
+ object-fit: cover;
135
+ display: block;
136
+
137
+ @media #{$medium} {
138
+ max-height: 200px;
139
+ }
140
+
141
+ @media #{$large} {
142
+ max-height: 250px;
143
+ }
144
+ }
145
+
146
+ .card-title {
147
+ padding: 20px 20px 10px 20px;
148
+ margin: 0;
149
+ color: $color-font-body;
150
+ line-height: 1.3;
151
+
152
+ @media #{$medium} {
153
+ padding: 16px 20px 8px 20px;
154
+ }
155
+ }
156
+
157
+ .card-subtitle {
158
+ padding: 0 20px 10px 20px;
159
+ margin: 0;
160
+ color: $gray-600;
161
+ font-size: 14px;
162
+ line-height: 1.4;
163
+
164
+ @media #{$medium} {
165
+ padding: 0 20px 8px 20px;
166
+ }
167
+ }
168
+
169
+ .card__body {
170
+ padding: 0 20px 20px 20px;
171
+ margin: 0;
172
+ color: $color-font-body;
173
+ line-height: 1.6;
174
+ flex-grow: 1;
175
+
176
+ @media #{$medium} {
177
+ padding: 0 20px 16px 20px;
178
+ font-size: 15px;
179
+ }
180
+
181
+ @media #{$large} {
182
+ font-size: 16px;
183
+ }
184
+ }
185
+
186
+ // High contrast mode support
187
+ @media (prefers-contrast: high) {
188
+ border-width: 2px;
189
+ box-shadow: none;
190
+
191
+ &:hover {
192
+ transform: none;
193
+ box-shadow: none;
194
+ border-color: $color-black;
195
+ }
196
+ }
197
+
198
+ // Reduced motion support
199
+ @media (prefers-reduced-motion: reduce) {
200
+ transition: none;
201
+
202
+ &:hover {
203
+ transform: none;
204
+ }
205
+
206
+ .ellipses-content {
207
+ transition: none;
208
+ }
209
+ }
210
+ }
@@ -0,0 +1,160 @@
1
+ @use 'variables' as *;
2
+
3
+ // Make required asterisk red
4
+ .required {
5
+ color: red;
6
+ }
7
+
8
+ .checkbox-wrapper {
9
+ // Hide the default checkbox completely (applies to all checkboxes)
10
+ input[type='checkbox'].checkbox {
11
+ position: absolute;
12
+ opacity: 0;
13
+ cursor: pointer;
14
+ height: 20px;
15
+ width: 20px;
16
+ margin: 0;
17
+ z-index: $z-index-base;
18
+ }
19
+
20
+ // Custom checkbox styling (applies to all checkboxes)
21
+ .custom-checkbox {
22
+ position: relative;
23
+ display: inline-block;
24
+ width: 20px;
25
+ height: 20px;
26
+ background-color: $color-white;
27
+ border: 2px solid $gray-400;
28
+ border-radius: 4px;
29
+ cursor: pointer;
30
+ transition: all 0.2s ease;
31
+
32
+ // Checkmark (hidden by default)
33
+ &::after {
34
+ content: '';
35
+ position: absolute;
36
+ display: none;
37
+ left: 6px;
38
+ top: 2px;
39
+ width: 6px;
40
+ height: 10px;
41
+ border: solid $color-white;
42
+ border-width: 0 2px 2px 0;
43
+ transform: rotate(45deg);
44
+ }
45
+ }
46
+
47
+ // When checkbox is checked (applies to all checkboxes)
48
+ input[type='checkbox'].checkbox:checked + .custom-checkbox {
49
+ background-color: $color-primary;
50
+ border-color: $color-primary;
51
+
52
+ &::after {
53
+ display: block;
54
+ }
55
+ }
56
+
57
+ // Hover states (applies to all checkboxes)
58
+ .custom-checkbox:hover {
59
+ border-color: $color-primary;
60
+ }
61
+
62
+ input[type='checkbox'].checkbox:checked + .custom-checkbox:hover {
63
+ background-color: $color-primary-hover;
64
+ border-color: $color-primary-hover;
65
+ }
66
+
67
+ // Focus states - Enhanced for accessibility (applies to all checkboxes)
68
+ input[type='checkbox'].checkbox:focus + .custom-checkbox {
69
+ outline: 2px solid $color-primary;
70
+ outline-offset: 2px;
71
+ box-shadow: 0 0 0 3px rgba($color-primary, 0.3);
72
+ }
73
+
74
+ // Focus-visible for keyboard navigation only
75
+ input[type='checkbox'].checkbox:focus-visible + .custom-checkbox {
76
+ outline: 2px solid $color-primary;
77
+ outline-offset: 2px;
78
+ box-shadow: 0 0 0 3px rgba($color-primary, 0.3);
79
+ }
80
+
81
+ // Remove focus outline for mouse clicks
82
+ input[type='checkbox'].checkbox:focus:not(:focus-visible) + .custom-checkbox {
83
+ outline: none;
84
+ box-shadow: none;
85
+ }
86
+
87
+ // Disabled state (applies to all checkboxes)
88
+ input[type='checkbox'].checkbox:disabled + .custom-checkbox {
89
+ background-color: $gray-200;
90
+ border-color: $gray-300;
91
+ cursor: not-allowed;
92
+
93
+ &::after {
94
+ border-color: $gray-500;
95
+ }
96
+ }
97
+
98
+ // High contrast mode support (applies to all checkboxes)
99
+ @media (prefers-contrast: high) {
100
+ .custom-checkbox {
101
+ border-width: 3px;
102
+ border-color: ButtonText;
103
+ }
104
+
105
+ input[type='checkbox'].checkbox:checked + .custom-checkbox {
106
+ background-color: ButtonText;
107
+ border-color: ButtonText;
108
+
109
+ &::after {
110
+ border-color: ButtonFace;
111
+ }
112
+ }
113
+
114
+ input[type='checkbox'].checkbox:focus + .custom-checkbox {
115
+ outline: 3px solid Highlight;
116
+ outline-offset: 2px;
117
+ }
118
+ }
119
+
120
+ // Reduce motion for users who prefer it (applies to all checkboxes)
121
+ @media (prefers-reduced-motion: reduce) {
122
+ .custom-checkbox {
123
+ transition: none;
124
+ }
125
+ }
126
+
127
+ // Label-specific styling
128
+ .label {
129
+ display: flex;
130
+ flex-direction: row;
131
+ align-items: center;
132
+ cursor: pointer;
133
+ position: relative;
134
+
135
+ // Label-specific positioning for checkbox and custom-checkbox
136
+ input[type='checkbox'].checkbox {
137
+ order: 1;
138
+ }
139
+
140
+ .custom-checkbox {
141
+ order: 1;
142
+ margin-right: 0;
143
+ }
144
+
145
+ &:disabled {
146
+ cursor: not-allowed;
147
+ }
148
+ }
149
+
150
+ .label-text {
151
+ order: 2;
152
+ margin-left: 10px;
153
+
154
+ // Hide empty label text
155
+ &:empty {
156
+ display: none;
157
+ margin-left: 0;
158
+ }
159
+ }
160
+ }