@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,227 @@
1
+ "use strict";
2
+
3
+ var _react = _interopRequireDefault(require("react"));
4
+ var _react2 = require("@testing-library/react");
5
+ var _Heading = require("../components/Heading");
6
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
+ describe('Heading Component', () => {
8
+ test('renders h1 when level is 1', () => {
9
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
10
+ level: 1
11
+ }, "Main Title"));
12
+ const heading = _react2.screen.getByRole('heading', {
13
+ level: 1
14
+ });
15
+ expect(heading).toBeInTheDocument();
16
+ expect(heading).toHaveTextContent('Main Title');
17
+ expect(heading.tagName).toBe('H1');
18
+ });
19
+ test('renders h2 when level is 2', () => {
20
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
21
+ level: 2
22
+ }, "Subtitle"));
23
+ const heading = _react2.screen.getByRole('heading', {
24
+ level: 2
25
+ });
26
+ expect(heading).toBeInTheDocument();
27
+ expect(heading).toHaveTextContent('Subtitle');
28
+ expect(heading.tagName).toBe('H2');
29
+ });
30
+ test('renders all heading levels correctly', () => {
31
+ const {
32
+ rerender
33
+ } = (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
34
+ level: 1
35
+ }, "Test"));
36
+ for (let level = 1; level <= 6; level++) {
37
+ rerender(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
38
+ level: level
39
+ }, "Heading ", level));
40
+ const heading = _react2.screen.getByRole('heading', {
41
+ level
42
+ });
43
+ expect(heading.tagName).toBe(`H${level}`);
44
+ expect(heading).toHaveTextContent(`Heading ${level}`);
45
+ }
46
+ });
47
+ test('applies correct CSS classes', () => {
48
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
49
+ level: 3
50
+ }, "Test Heading"));
51
+ const heading = _react2.screen.getByRole('heading', {
52
+ level: 3
53
+ });
54
+ expect(heading).toHaveClass('h3', 'heading');
55
+ expect(heading).toHaveAttribute('data-testid', 'heading');
56
+ });
57
+ test('applies additional className', () => {
58
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
59
+ level: 1,
60
+ className: "custom-heading"
61
+ }, "Custom"));
62
+ const heading = _react2.screen.getByRole('heading', {
63
+ level: 1
64
+ });
65
+ expect(heading).toHaveClass('h1', 'heading', 'custom-heading');
66
+ });
67
+ test('applies custom component name', () => {
68
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
69
+ level: 2,
70
+ componentName: "title"
71
+ }, "Title"));
72
+ const heading = _react2.screen.getByRole('heading', {
73
+ level: 2
74
+ });
75
+ expect(heading).toHaveClass('h2', 'title');
76
+ expect(heading).toHaveAttribute('data-testid', 'title');
77
+ });
78
+ test('passes through additional props', () => {
79
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
80
+ level: 1,
81
+ id: "main-title",
82
+ "aria-describedby": "description",
83
+ "data-custom": "value"
84
+ }, "Title"));
85
+ const heading = _react2.screen.getByRole('heading', {
86
+ level: 1
87
+ });
88
+ expect(heading).toHaveAttribute('id', 'main-title');
89
+ expect(heading).toHaveAttribute('aria-describedby', 'description');
90
+ expect(heading).toHaveAttribute('data-custom', 'value');
91
+ });
92
+ test('renders with complex children', () => {
93
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
94
+ level: 1
95
+ }, /*#__PURE__*/_react.default.createElement("span", null, "Complex"), " ", /*#__PURE__*/_react.default.createElement("strong", null, "Heading")));
96
+ const heading = _react2.screen.getByRole('heading', {
97
+ level: 1
98
+ });
99
+ expect(heading).toContainHTML('<span>Complex</span> <strong>Heading</strong>');
100
+ });
101
+ test('handles empty children', () => {
102
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
103
+ level: 1
104
+ }));
105
+ const heading = _react2.screen.getByRole('heading', {
106
+ level: 1
107
+ });
108
+ expect(heading).toBeInTheDocument();
109
+ expect(heading).toBeEmptyDOMElement();
110
+ });
111
+
112
+ // New accessibility tests
113
+ test('requires children prop', () => {
114
+ // This should show a PropTypes warning in development
115
+ const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
116
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
117
+ level: 1
118
+ }));
119
+
120
+ // In development mode, PropTypes would warn about missing required children
121
+ // We can't easily test PropTypes warnings in Jest, but the component should still render
122
+ const heading = _react2.screen.getByRole('heading', {
123
+ level: 1
124
+ });
125
+ expect(heading).toBeInTheDocument();
126
+ consoleSpy.mockRestore();
127
+ });
128
+ test('has proper accessibility attributes', () => {
129
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
130
+ level: 2,
131
+ id: "accessible-heading"
132
+ }, "Accessible Title"));
133
+ const heading = _react2.screen.getByRole('heading', {
134
+ level: 2
135
+ });
136
+ expect(heading).toHaveAttribute('id', 'accessible-heading');
137
+
138
+ // Should be focusable for screen readers when needed
139
+ expect(heading).not.toHaveAttribute('tabindex');
140
+ });
141
+ test('supports keyboard navigation when tabIndex is provided', () => {
142
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
143
+ level: 1,
144
+ tabIndex: "0"
145
+ }, "Focusable Heading"));
146
+ const heading = _react2.screen.getByRole('heading', {
147
+ level: 1
148
+ });
149
+ expect(heading).toHaveAttribute('tabindex', '0');
150
+
151
+ // Focus the heading
152
+ heading.focus();
153
+ expect(heading).toHaveFocus();
154
+ });
155
+ test('maintains semantic structure', () => {
156
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_Heading.Heading, {
157
+ level: 1
158
+ }, "Main Title"), /*#__PURE__*/_react.default.createElement(_Heading.Heading, {
159
+ level: 2
160
+ }, "Section"), /*#__PURE__*/_react.default.createElement(_Heading.Heading, {
161
+ level: 3
162
+ }, "Subsection")));
163
+ const h1 = _react2.screen.getByRole('heading', {
164
+ level: 1
165
+ });
166
+ const h2 = _react2.screen.getByRole('heading', {
167
+ level: 2
168
+ });
169
+ const h3 = _react2.screen.getByRole('heading', {
170
+ level: 3
171
+ });
172
+ expect(h1).toBeInTheDocument();
173
+ expect(h2).toBeInTheDocument();
174
+ expect(h3).toBeInTheDocument();
175
+
176
+ // Verify proper heading hierarchy
177
+ expect(h1.tagName).toBe('H1');
178
+ expect(h2.tagName).toBe('H2');
179
+ expect(h3.tagName).toBe('H3');
180
+ });
181
+ test('trims className string properly', () => {
182
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
183
+ level: 1,
184
+ className: ""
185
+ }, "Clean Classes"));
186
+ const heading = _react2.screen.getByRole('heading', {
187
+ level: 1
188
+ });
189
+ expect(heading.className).toBe('h1 heading');
190
+ expect(heading.className).not.toContain(' '); // No double spaces
191
+ });
192
+ test('supports ARIA attributes for enhanced accessibility', () => {
193
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
194
+ level: 1,
195
+ "aria-describedby": "heading-description",
196
+ "aria-labelledby": "heading-label"
197
+ }, "ARIA Enhanced Heading"));
198
+ const heading = _react2.screen.getByRole('heading', {
199
+ level: 1
200
+ });
201
+ expect(heading).toHaveAttribute('aria-describedby', 'heading-description');
202
+ expect(heading).toHaveAttribute('aria-labelledby', 'heading-label');
203
+ });
204
+
205
+ // Legacy compatibility tests
206
+ test('maintains backward compatibility with variant prop', () => {
207
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
208
+ variant: 2
209
+ }, "Legacy Heading"));
210
+ const heading = _react2.screen.getByRole('heading', {
211
+ level: 2
212
+ });
213
+ expect(heading).toBeInTheDocument();
214
+ expect(heading).toHaveTextContent('Legacy Heading');
215
+ expect(heading.tagName).toBe('H2');
216
+ });
217
+ test('maintains backward compatibility with additionalClassName prop', () => {
218
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
219
+ variant: 1,
220
+ additionalClassName: "legacy-class"
221
+ }, "Legacy Style"));
222
+ const heading = _react2.screen.getByRole('heading', {
223
+ level: 1
224
+ });
225
+ expect(heading).toHaveClass('h1', 'heading', 'legacy-class');
226
+ });
227
+ });
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+
3
+ var _react = _interopRequireDefault(require("react"));
4
+ var _react2 = require("@testing-library/react");
5
+ var _Hero = require("../components/Hero");
6
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
+ describe('Hero Component', () => {
8
+ test('renders hero with default props', () => {
9
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Hero.Hero, null, "Hero Content"));
10
+ const animation = _react2.screen.getByTestId('animation');
11
+ const hero = (0, _react2.within)(animation).getByTestId('hero');
12
+ expect(hero).toBeInTheDocument();
13
+ expect(hero).toHaveClass('hero-wrapper');
14
+ expect(_react2.screen.getByText('Hero Content')).toBeInTheDocument();
15
+ });
16
+ test('renders with custom component name', () => {
17
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Hero.Hero, {
18
+ componentName: "custom-hero"
19
+ }, "Custom Hero"));
20
+ const animation = _react2.screen.getByTestId('animation');
21
+ const hero = (0, _react2.within)(animation).getByTestId('hero');
22
+ expect(hero).toHaveClass('custom-hero-wrapper');
23
+ });
24
+ test('renders with additional className', () => {
25
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Hero.Hero, {
26
+ additionalClassName: "extra-class"
27
+ }, "Styled Hero"));
28
+ const animation = _react2.screen.getByTestId('animation');
29
+ const hero = (0, _react2.within)(animation).getByTestId('hero');
30
+ expect(hero).toHaveClass('hero-wrapper', 'extra-class');
31
+ });
32
+ test('renders with background image', () => {
33
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Hero.Hero, {
34
+ background: "/path/to/image.jpg"
35
+ }, "Hero with Background"));
36
+ const animation = _react2.screen.getByTestId('animation');
37
+ const hero = (0, _react2.within)(animation).getByTestId('hero');
38
+ expect(hero).toHaveStyle('background-image: url(/path/to/image.jpg)');
39
+ });
40
+ test('renders inner hero container', () => {
41
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Hero.Hero, null, "Inner Content"));
42
+ const animation = _react2.screen.getByTestId('animation');
43
+ const hero = (0, _react2.within)(animation).getByTestId('hero');
44
+ const innerContainer = hero.querySelector('.hero');
45
+ expect(innerContainer).toBeInTheDocument();
46
+ expect(innerContainer).toHaveTextContent('Inner Content');
47
+ });
48
+ test('renders with complex children', () => {
49
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Hero.Hero, null, /*#__PURE__*/_react.default.createElement("h1", null, "Hero Title"), /*#__PURE__*/_react.default.createElement("p", null, "Hero description"), /*#__PURE__*/_react.default.createElement("button", null, "Call to Action")));
50
+ expect(_react2.screen.getByText('Hero Title')).toBeInTheDocument();
51
+ expect(_react2.screen.getByText('Hero description')).toBeInTheDocument();
52
+ expect(_react2.screen.getByText('Call to Action')).toBeInTheDocument();
53
+ });
54
+ test('renders without background image', () => {
55
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Hero.Hero, null, "No Background"));
56
+ const animation = _react2.screen.getByTestId('animation');
57
+ const hero = (0, _react2.within)(animation).getByTestId('hero');
58
+ // Should not have background-image style at all
59
+ expect(hero.style.backgroundImage).toBe('');
60
+ });
61
+ test('combines all props correctly', () => {
62
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Hero.Hero, {
63
+ componentName: "landing-hero",
64
+ testId: "landing-hero",
65
+ additionalClassName: "home-hero large",
66
+ background: "/hero-bg.png"
67
+ }, "Landing Page Hero"));
68
+ const animation = _react2.screen.getByTestId('animation');
69
+ const hero = (0, _react2.within)(animation).getByTestId('landing-hero');
70
+ expect(hero).toHaveClass('landing-hero-wrapper', 'home-hero', 'large');
71
+ expect(hero).toHaveStyle('background-image: url(/hero-bg.png)');
72
+ expect(_react2.screen.getByText('Landing Page Hero')).toBeInTheDocument();
73
+ });
74
+ });
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+
3
+ var _react = _interopRequireDefault(require("react"));
4
+ var _react2 = require("@testing-library/react");
5
+ var _Label = require("../components/Label");
6
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
+ // Suppress console.error during tests
8
+ let consoleErrorSpy;
9
+ beforeAll(() => {
10
+ consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
11
+ });
12
+ afterAll(() => {
13
+ consoleErrorSpy.mockRestore();
14
+ });
15
+ describe('Label Component', () => {
16
+ test('renders basic label with text', () => {
17
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
18
+ labelText: "Username"
19
+ }));
20
+ const label = _react2.screen.getByText('Username');
21
+ expect(label).toBeInTheDocument();
22
+ expect(label.closest('label')).toHaveClass('label');
23
+ });
24
+ test('renders label with htmlFor attribute', () => {
25
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
26
+ labelText: "Email",
27
+ labelFor: "email-input"
28
+ }));
29
+ const label = _react2.screen.getByText('Email').closest('label');
30
+ expect(label).toHaveAttribute('for', 'email-input');
31
+ });
32
+ test('shows required asterisk when required is true', () => {
33
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
34
+ labelText: "Required Field",
35
+ required: true
36
+ }));
37
+ const asterisk = _react2.screen.getByText('*');
38
+ expect(asterisk).toBeInTheDocument();
39
+ expect(asterisk).toHaveClass('required');
40
+ });
41
+ test('does not show asterisk when required is false', () => {
42
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
43
+ labelText: "Optional Field",
44
+ required: false
45
+ }));
46
+ expect(_react2.screen.queryByText('*')).not.toBeInTheDocument();
47
+ });
48
+ test('applies additional className', () => {
49
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
50
+ labelText: "Test",
51
+ additionalClassName: "custom-label"
52
+ }));
53
+ const label = _react2.screen.getByText('Test').closest('label');
54
+ expect(label).toHaveClass('label', 'custom-label');
55
+ });
56
+ test('applies custom component name', () => {
57
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
58
+ labelText: "Test",
59
+ componentName: "form-label"
60
+ }));
61
+ const label = _react2.screen.getByText('Test').closest('label');
62
+ expect(label).toHaveClass('form-label');
63
+ // data-test-id is on the wrapper, not the label
64
+ });
65
+ test('renders children elements', () => {
66
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
67
+ labelText: "Input Label"
68
+ }, /*#__PURE__*/_react.default.createElement("input", {
69
+ type: "text"
70
+ })));
71
+ const input = _react2.screen.getByRole('textbox');
72
+ expect(input).toBeInTheDocument();
73
+ });
74
+ test('renders complex children with required asterisk', () => {
75
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
76
+ labelText: "Complex Field",
77
+ required: true
78
+ }, /*#__PURE__*/_react.default.createElement("input", {
79
+ type: "email",
80
+ placeholder: "Enter email"
81
+ }), /*#__PURE__*/_react.default.createElement("span", null, "Helper text")));
82
+ expect(_react2.screen.getByText('Complex Field')).toBeInTheDocument();
83
+ expect(_react2.screen.getByText('*')).toBeInTheDocument();
84
+ expect(_react2.screen.getByRole('textbox')).toBeInTheDocument();
85
+ expect(_react2.screen.getByText('Helper text')).toBeInTheDocument();
86
+ });
87
+ test('passes through additional props', () => {
88
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
89
+ labelText: "Test",
90
+ id: "custom-label",
91
+ "data-custom": "value"
92
+ }));
93
+ const label = _react2.screen.getByText('Test').closest('label');
94
+ expect(label).toHaveAttribute('id', 'custom-label');
95
+ expect(label).toHaveAttribute('data-custom', 'value');
96
+ });
97
+ test('has correct data-test-id attribute', () => {
98
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
99
+ labelText: "Test"
100
+ }));
101
+ const label = _react2.screen.getByText('Test').closest('label');
102
+ // data-test-id is on the wrapper, not the label
103
+ });
104
+ test('label text is wrapped in span with correct class', () => {
105
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
106
+ labelText: "Wrapped Text"
107
+ }));
108
+ const textSpan = _react2.screen.getByText('Wrapped Text');
109
+ expect(textSpan.tagName).toBe('SPAN');
110
+ expect(textSpan).toHaveClass('label-text');
111
+ });
112
+ test('renders without children', () => {
113
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
114
+ labelText: "Standalone Label"
115
+ }));
116
+ const label = _react2.screen.getByText('Standalone Label').closest('label');
117
+ expect(label).toBeInTheDocument();
118
+
119
+ // Should only contain the label text span and possibly asterisk
120
+ const spans = label.querySelectorAll('span');
121
+ expect(spans).toHaveLength(1); // Only the label-text span
122
+ });
123
+ });
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+
3
+ var _react = _interopRequireDefault(require("react"));
4
+ var _react2 = require("@testing-library/react");
5
+ var _Loader = _interopRequireDefault(require("../components/Loader"));
6
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
+ // Suppress console.error during tests
8
+ let consoleErrorSpy;
9
+ beforeAll(() => {
10
+ consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
11
+ });
12
+ afterAll(() => {
13
+ consoleErrorSpy.mockRestore();
14
+ });
15
+ describe('Loader Component', () => {
16
+ test('renders loader with default props', () => {
17
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, null));
18
+ const loader = _react2.screen.getByTestId('ui-loader');
19
+ expect(loader).toBeInTheDocument();
20
+ expect(loader).toHaveClass('ui-loader');
21
+ expect(_react2.screen.getByRole('heading', {
22
+ level: 3
23
+ })).toHaveTextContent('Loading...');
24
+ });
25
+ test('renders with custom component name', () => {
26
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, {
27
+ componentName: "custom-loader"
28
+ }));
29
+ const loader = _react2.screen.getByTestId('custom-loader');
30
+ expect(loader).toHaveClass('custom-loader');
31
+ });
32
+ test('renders with additional className', () => {
33
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, {
34
+ additionalClassName: "centered-loader"
35
+ }));
36
+ const loader = _react2.screen.getByTestId('ui-loader');
37
+ expect(loader).toHaveClass('ui-loader', 'centered-loader');
38
+ });
39
+ test('renders with custom header text', () => {
40
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, {
41
+ headerText: "Please wait..."
42
+ }));
43
+ expect(_react2.screen.getByRole('heading', {
44
+ level: 3
45
+ })).toHaveTextContent('Please wait...');
46
+ expect(_react2.screen.queryByText('Loading...')).not.toBeInTheDocument();
47
+ });
48
+ test('renders with custom title size', () => {
49
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, {
50
+ titleSize: 2
51
+ }));
52
+ const heading = _react2.screen.getByRole('heading', {
53
+ level: 2
54
+ });
55
+ expect(heading).toBeInTheDocument();
56
+ expect(heading).toHaveTextContent('Loading...');
57
+ });
58
+ test('renders SVG with correct attributes', () => {
59
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, {
60
+ svgSize: "300px"
61
+ }));
62
+ const loader = _react2.screen.getByTestId('ui-loader');
63
+ const svg = loader.querySelector('svg');
64
+ expect(svg).toBeInTheDocument();
65
+ expect(svg).toHaveAttribute('width', '300px');
66
+ expect(svg).toHaveAttribute('viewBox', '0 0 100 100');
67
+ expect(svg.className.baseVal).toContain('svg');
68
+ });
69
+ test('renders with custom fill color', () => {
70
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, {
71
+ fill: "#ff0000"
72
+ }));
73
+ const loader = _react2.screen.getByTestId('ui-loader');
74
+ const path = loader.querySelector('path');
75
+ expect(path).toHaveAttribute('fill', '#ff0000');
76
+ });
77
+ test('renders loader wrapper', () => {
78
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, null));
79
+ const loader = _react2.screen.getByTestId('ui-loader');
80
+ const wrapper = loader.querySelector('.ui-loader__wrapper');
81
+ expect(wrapper).toBeInTheDocument();
82
+ });
83
+ test('combines all props correctly', () => {
84
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, {
85
+ componentName: "page-loader",
86
+ additionalClassName: "fullscreen overlay",
87
+ headerText: "Initializing...",
88
+ titleSize: 1,
89
+ svgSize: "400px",
90
+ fill: "#0066cc"
91
+ }));
92
+ const loader = _react2.screen.getByTestId('page-loader');
93
+ expect(loader).toHaveClass('page-loader', 'fullscreen', 'overlay');
94
+ const heading = _react2.screen.getByRole('heading', {
95
+ level: 1
96
+ });
97
+ expect(heading).toHaveTextContent('Initializing...');
98
+ const svg = loader.querySelector('svg');
99
+ expect(svg).toHaveAttribute('width', '400px');
100
+ const path = loader.querySelector('path');
101
+ expect(path).toHaveAttribute('fill', '#0066cc');
102
+ });
103
+ test('has correct default values', () => {
104
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, null));
105
+ const loader = _react2.screen.getByTestId('ui-loader');
106
+ const heading = _react2.screen.getByRole('heading', {
107
+ level: 3
108
+ });
109
+ const svg = loader.querySelector('svg');
110
+ const path = loader.querySelector('path');
111
+ expect(heading).toHaveTextContent('Loading...');
112
+ expect(svg).toHaveAttribute('width', '200px');
113
+ expect(path).toHaveAttribute('fill', '#333');
114
+ });
115
+ });
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+
3
+ var _react = _interopRequireDefault(require("react"));
4
+ var _react2 = require("@testing-library/react");
5
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
6
+ var _MenuHover = require("../components/MenuHover");
7
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
8
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
9
+ // Suppress console.error during tests
10
+ let consoleErrorSpy;
11
+ beforeAll(() => {
12
+ consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
13
+ });
14
+ afterAll(() => {
15
+ consoleErrorSpy.mockRestore();
16
+ });
17
+ // Stateful test wrapper for MenuHover
18
+ function StatefulMenuHover(props) {
19
+ const [isOpen, setIsOpen] = _react.default.useState(false);
20
+ return /*#__PURE__*/_react.default.createElement(_MenuHover.MenuHover, _extends({}, props, {
21
+ isOpen: isOpen,
22
+ onToggle: setIsOpen
23
+ }));
24
+ }
25
+ describe('MenuHover Component', () => {
26
+ const mockOpenChildren = /*#__PURE__*/_react.default.createElement("div", {
27
+ "data-testid": "open-content"
28
+ }, "Menu is open");
29
+ const mockClosedChildren = /*#__PURE__*/_react.default.createElement("div", {
30
+ "data-testid": "closed-content"
31
+ }, "Menu is closed");
32
+ test('renders closed children by default', () => {
33
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(StatefulMenuHover, {
34
+ isOpenChildren: mockOpenChildren,
35
+ isClosedChildren: mockClosedChildren
36
+ }));
37
+ const menuContainer = _react2.screen.getByTestId('menu-hover');
38
+ expect(menuContainer).toBeInTheDocument();
39
+ expect(_react2.screen.getByTestId('closed-content')).toBeInTheDocument();
40
+ expect(_react2.screen.queryByTestId('open-content')).not.toBeInTheDocument();
41
+ });
42
+ test('toggles between open and closed states when clicked', async () => {
43
+ const user = _userEvent.default.setup();
44
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(StatefulMenuHover, {
45
+ isOpenChildren: mockOpenChildren,
46
+ isClosedChildren: mockClosedChildren
47
+ }));
48
+ const menuContainer = _react2.screen.getByTestId('menu-hover');
49
+
50
+ // Initially closed
51
+ expect(menuContainer).toBeInTheDocument();
52
+ expect(_react2.screen.getByTestId('closed-content')).toBeInTheDocument();
53
+ expect(_react2.screen.queryByTestId('open-content')).not.toBeInTheDocument();
54
+
55
+ // Click to open
56
+ await user.click(menuContainer);
57
+ expect(menuContainer).toBeInTheDocument();
58
+ expect(_react2.screen.getByTestId('open-content')).toBeInTheDocument();
59
+ expect(_react2.screen.queryByTestId('closed-content')).not.toBeInTheDocument();
60
+
61
+ // Click to close
62
+ await user.click(menuContainer);
63
+ expect(menuContainer).toBeInTheDocument();
64
+ expect(_react2.screen.getByTestId('closed-content')).toBeInTheDocument();
65
+ expect(_react2.screen.queryByTestId('open-content')).not.toBeInTheDocument();
66
+ });
67
+ test('applies correct CSS classes when closed', () => {
68
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(StatefulMenuHover, {
69
+ isOpenChildren: mockOpenChildren,
70
+ isClosedChildren: mockClosedChildren
71
+ }));
72
+ const menuContainer = _react2.screen.getByTestId('menu-hover');
73
+ expect(menuContainer).toHaveClass('menu-hover');
74
+ expect(menuContainer).not.toHaveClass('open');
75
+ });
76
+ test('applies correct CSS classes when open', async () => {
77
+ const user = _userEvent.default.setup();
78
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(StatefulMenuHover, {
79
+ isOpenChildren: mockOpenChildren,
80
+ isClosedChildren: mockClosedChildren
81
+ }));
82
+ const menuContainer = _react2.screen.getByTestId('menu-hover');
83
+ await user.click(menuContainer);
84
+ expect(menuContainer).toHaveClass('menu-hover', 'open');
85
+ });
86
+ test('applies additional className', () => {
87
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_MenuHover.MenuHover, {
88
+ isOpenChildren: mockOpenChildren,
89
+ isClosedChildren: mockClosedChildren,
90
+ additionalClassName: "custom-menu"
91
+ }));
92
+ const menuContainer = _react2.screen.getByTestId('menu-hover');
93
+ expect(menuContainer).toHaveClass('menu-hover', 'custom-menu');
94
+ });
95
+ test('applies custom component name', () => {
96
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(StatefulMenuHover, {
97
+ isOpenChildren: mockOpenChildren,
98
+ isClosedChildren: mockClosedChildren,
99
+ componentName: "dropdown-menu"
100
+ }));
101
+ const menuContainer = _react2.screen.getByTestId('dropdown-menu');
102
+ expect(menuContainer).toHaveClass('dropdown-menu');
103
+ expect(menuContainer).toHaveAttribute('data-testid', 'dropdown-menu');
104
+ });
105
+ test('applies both custom component name and additional className', () => {
106
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(StatefulMenuHover, {
107
+ isOpenChildren: mockOpenChildren,
108
+ isClosedChildren: mockClosedChildren,
109
+ componentName: "dropdown",
110
+ additionalClassName: "extra-styles"
111
+ }));
112
+ const menuContainer = _react2.screen.getByTestId('dropdown');
113
+ expect(menuContainer).toHaveClass('dropdown', 'extra-styles');
114
+ });
115
+ test('has correct data-test-id attribute', () => {
116
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(StatefulMenuHover, {
117
+ isOpenChildren: mockOpenChildren,
118
+ isClosedChildren: mockClosedChildren
119
+ }));
120
+ const menuContainer = _react2.screen.getByTestId('menu-hover');
121
+ expect(menuContainer).toHaveAttribute('data-testid', 'menu-hover');
122
+ });
123
+ test('renders complex children correctly', () => {
124
+ const complexOpenChildren = /*#__PURE__*/_react.default.createElement("div", {
125
+ "data-testid": "complex-open"
126
+ }, /*#__PURE__*/_react.default.createElement("h2", null, "Open Menu"), /*#__PURE__*/_react.default.createElement("ul", null, /*#__PURE__*/_react.default.createElement("li", null, "Item 1"), /*#__PURE__*/_react.default.createElement("li", null, "Item 2")));
127
+ const complexClosedChildren = /*#__PURE__*/_react.default.createElement("button", {
128
+ "data-testid": "complex-closed"
129
+ }, "Menu Button");
130
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_MenuHover.MenuHover, {
131
+ isOpenChildren: complexOpenChildren,
132
+ isClosedChildren: complexClosedChildren
133
+ }));
134
+ expect(_react2.screen.getByTestId('complex-closed')).toBeInTheDocument();
135
+ expect(_react2.screen.getByText('Menu Button')).toBeInTheDocument();
136
+ });
137
+ });