revotech-ui-kit 0.0.5-beta → 0.0.7-beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. package/dist/index.ts +1 -1
  2. package/dist/rollup-plugin-html-noop.js +1 -0
  3. package/dist/sw.js +1 -1
  4. package/dist/sw.js.map +1 -1
  5. package/package.json +5 -4
  6. package/.editorconfig +0 -29
  7. package/.eslintrc +0 -10
  8. package/.github/workflows/deploy-storybook.yml +0 -107
  9. package/.storybook/main.ts +0 -17
  10. package/.storybook/preview-head.html +0 -1
  11. package/.storybook/preview.ts +0 -17
  12. package/assets/fonts/Geist/Geist-Black.otf +0 -0
  13. package/assets/fonts/Geist/Geist-Black.woff2 +0 -0
  14. package/assets/fonts/Geist/Geist-Bold.otf +0 -0
  15. package/assets/fonts/Geist/Geist-Bold.woff2 +0 -0
  16. package/assets/fonts/Geist/Geist-Light.otf +0 -0
  17. package/assets/fonts/Geist/Geist-Light.woff2 +0 -0
  18. package/assets/fonts/Geist/Geist-Medium.otf +0 -0
  19. package/assets/fonts/Geist/Geist-Medium.woff2 +0 -0
  20. package/assets/fonts/Geist/Geist-Regular.otf +0 -0
  21. package/assets/fonts/Geist/Geist-Regular.woff2 +0 -0
  22. package/assets/fonts/Geist/Geist-SemiBold.otf +0 -0
  23. package/assets/fonts/Geist/Geist-SemiBold.woff2 +0 -0
  24. package/assets/fonts/Geist/Geist-Thin.otf +0 -0
  25. package/assets/fonts/Geist/Geist-Thin.woff2 +0 -0
  26. package/assets/fonts/Geist/Geist-UltraBlack.otf +0 -0
  27. package/assets/fonts/Geist/Geist-UltraBlack.woff2 +0 -0
  28. package/assets/fonts/Geist/Geist-UltraLight.otf +0 -0
  29. package/assets/fonts/Geist/Geist-UltraLight.woff2 +0 -0
  30. package/assets/fonts/Geist/GeistVariableVF.ttf +0 -0
  31. package/assets/fonts/Geist/GeistVariableVF.woff2 +0 -0
  32. package/assets/fonts/Geist/LICENSE.TXT +0 -92
  33. package/assets/open-wc-logo.svg +0 -29
  34. package/assume_role.sh +0 -18
  35. package/index.html +0 -314
  36. package/rollup.config.js +0 -83
  37. package/src/assets/icons/arrows.icon.ts +0 -20
  38. package/src/assets/icons/index.ts +0 -3
  39. package/src/assets/icons/search.icon.ts +0 -19
  40. package/src/assets/icons/tick.icon.ts +0 -20
  41. package/src/chai-custom.d.ts +0 -0
  42. package/src/components/atoms/alert/alert-description.ts +0 -15
  43. package/src/components/atoms/alert/alert-title.ts +0 -17
  44. package/src/components/atoms/alert/alert.atom.ts +0 -55
  45. package/src/components/atoms/alert/alert.stories.ts +0 -71
  46. package/src/components/atoms/alert/alert.styles.ts +0 -21
  47. package/src/components/atoms/alert/alert.types.ts +0 -1
  48. package/src/components/atoms/badge/badge.atom.ts +0 -40
  49. package/src/components/atoms/badge/badge.stories.ts +0 -118
  50. package/src/components/atoms/badge/badge.style.ts +0 -24
  51. package/src/components/atoms/badge/badge.type.ts +0 -7
  52. package/src/components/atoms/button/button.atom.ts +0 -59
  53. package/src/components/atoms/button/button.stories.ts +0 -224
  54. package/src/components/atoms/button/button.style.ts +0 -31
  55. package/src/components/atoms/button/button.type.ts +0 -10
  56. package/src/components/atoms/card/card-content.ts +0 -15
  57. package/src/components/atoms/card/card-description.ts +0 -15
  58. package/src/components/atoms/card/card-footer.ts +0 -15
  59. package/src/components/atoms/card/card-header.ts +0 -15
  60. package/src/components/atoms/card/card-title.ts +0 -15
  61. package/src/components/atoms/card/card.atom.ts +0 -31
  62. package/src/components/atoms/card/card.stories.ts +0 -149
  63. package/src/components/atoms/checkbox/checkbox.atom.ts +0 -76
  64. package/src/components/atoms/checkbox/checkbox.stories.ts +0 -309
  65. package/src/components/atoms/checkbox/checkbox.style.ts +0 -5
  66. package/src/components/atoms/checkbox/checkbox.type.ts +0 -24
  67. package/src/components/atoms/combo-box/combo-box-input.ts +0 -33
  68. package/src/components/atoms/combo-box/combo-box-item.ts +0 -59
  69. package/src/components/atoms/combo-box/combo-box-list.ts +0 -57
  70. package/src/components/atoms/combo-box/combo-box.atom.ts +0 -187
  71. package/src/components/atoms/combo-box/combo-box.stories.ts +0 -95
  72. package/src/components/atoms/command-empty/command-empty.atom.ts +0 -44
  73. package/src/components/atoms/command-group/command-group.atom.ts +0 -60
  74. package/src/components/atoms/command-item/command-item.atom.ts +0 -74
  75. package/src/components/atoms/command-list/command-list.atom.ts +0 -37
  76. package/src/components/atoms/command-separator/command-separator.atom.ts +0 -42
  77. package/src/components/atoms/dialog/dialog-close.ts +0 -50
  78. package/src/components/atoms/dialog/dialog-content.ts +0 -71
  79. package/src/components/atoms/dialog/dialog-footer.ts +0 -22
  80. package/src/components/atoms/dialog/dialog-header.ts +0 -36
  81. package/src/components/atoms/dialog/dialog-overly.ts +0 -20
  82. package/src/components/atoms/dialog/dialog-trigger.ts +0 -54
  83. package/src/components/atoms/dialog/dialog.atom.ts +0 -78
  84. package/src/components/atoms/dialog/dialog.stories.ts +0 -93
  85. package/src/components/atoms/dropdownMenu/dropdown-menu-checkbox-Item.ts +0 -106
  86. package/src/components/atoms/dropdownMenu/dropdown-menu-content.ts +0 -79
  87. package/src/components/atoms/dropdownMenu/dropdown-menu-group.ts +0 -60
  88. package/src/components/atoms/dropdownMenu/dropdown-menu-item.ts +0 -74
  89. package/src/components/atoms/dropdownMenu/dropdown-menu-radio-item.ts +0 -107
  90. package/src/components/atoms/dropdownMenu/dropdown-menu-seperator.ts +0 -44
  91. package/src/components/atoms/dropdownMenu/dropdown-menu-shortcut.ts +0 -17
  92. package/src/components/atoms/dropdownMenu/dropdown-menu.atom.ts +0 -84
  93. package/src/components/atoms/dropdownMenu/dropdownMenu.stories.ts +0 -220
  94. package/src/components/atoms/dropdownMenu/dropdownMenu.style.ts +0 -7
  95. package/src/components/atoms/index.ts +0 -13
  96. package/src/components/atoms/input/input.atom.ts +0 -88
  97. package/src/components/atoms/input/input.stories.ts +0 -451
  98. package/src/components/atoms/input/input.styles.ts +0 -2
  99. package/src/components/atoms/input/input.type.ts +0 -58
  100. package/src/components/atoms/label/label.atom.ts +0 -64
  101. package/src/components/atoms/label/label.stories.ts +0 -102
  102. package/src/components/atoms/label/label.style.ts +0 -5
  103. package/src/components/atoms/popover/popover-content.ts +0 -58
  104. package/src/components/atoms/popover/popover-trigger.ts +0 -50
  105. package/src/components/atoms/popover/popover.atom.ts +0 -34
  106. package/src/components/atoms/popover/popover.stories.ts +0 -79
  107. package/src/components/atoms/popover/popover.style.ts +0 -25
  108. package/src/components/atoms/popover/popover.types.ts +0 -3
  109. package/src/components/atoms/toggle/defs.ts +0 -29
  110. package/src/components/atoms/toggle/toggle.atom.ts +0 -58
  111. package/src/components/atoms/toggle/toggle.stories.ts +0 -204
  112. package/src/components/atoms/toggle/toggle.style.ts +0 -22
  113. package/src/components/command/command.stories.ts +0 -154
  114. package/src/components/command/command.ts +0 -391
  115. package/src/components/index.ts +0 -2
  116. package/src/components/molecules/command/command.molecules.ts +0 -31
  117. package/src/components/molecules/command-input/command-input.atom.ts +0 -130
  118. package/src/components/molecules/dropdownMenu/dropdownMenu.molecules.ts +0 -0
  119. package/src/components/molecules/index.ts +0 -1
  120. package/src/globals.css +0 -2215
  121. package/src/helpers/base-element.ts +0 -79
  122. package/src/helpers/index.ts +0 -3
  123. package/src/helpers/mouse-conroller.helper.ts +0 -42
  124. package/src/helpers/style.helpers.ts +0 -6
  125. package/src/index.d.ts +0 -1
  126. package/src/index.ts +0 -1
  127. package/src/interfaces/actionable.interface.ts +0 -6
  128. package/src/interfaces/atomic.interface.ts +0 -6
  129. package/src/interfaces/changeable.interface.ts +0 -14
  130. package/src/interfaces/child-support-atomic.interface.ts +0 -5
  131. package/src/interfaces/index.ts +0 -6
  132. package/src/interfaces/intractable.interface.ts +0 -6
  133. package/src/interfaces/variant.interface.ts +0 -3
  134. package/src/lib/index.ts +0 -0
  135. package/src/lib/next/next.lib.ts +0 -0
  136. package/src/lib/react/react.lib.ts +0 -18
  137. package/src/lib/tw-styles.ts +0 -1957
  138. package/src/styles/index.ts +0 -1
  139. package/src/styles/tw.styles.ts +0 -2219
  140. package/src/tailwind-lib.css +0 -115
  141. package/src/wc-ui-app.ts +0 -81
  142. package/tailwind.config.js +0 -217
  143. package/test/wc-ui-app.test.ts +0 -22
  144. package/tsconfig.json +0 -30
  145. package/web-dev-server.config.mjs +0 -26
  146. package/web-test-runner.config.mjs +0 -41
@@ -1,451 +0,0 @@
1
- import { html } from 'lit';
2
- import { Meta, StoryFn } from '@storybook/web-components';
3
- import './input.atom';
4
- import '../label/label.atom';
5
- import '../button/button.atom';
6
- import {
7
- InputNormalType,
8
- InputArgs,
9
- InputSpecificType,
10
- InputSpecificArgs,
11
- } from './input.type';
12
- import { expect, within, waitFor, fn, userEvent } from '@storybook/test';
13
-
14
- const validInputTypes: InputNormalType[] = [
15
- 'hidden',
16
- 'text',
17
- 'search',
18
- 'tel',
19
- 'url',
20
- 'email',
21
- 'password',
22
- ];
23
-
24
- const validInputSpeceficTypes: InputSpecificType[] = [
25
- 'hidden',
26
- 'date',
27
- 'month',
28
- 'week',
29
- 'time',
30
- 'datetime-local',
31
- 'number',
32
- 'range',
33
- 'color',
34
- 'file',
35
- ];
36
-
37
- export default {
38
- component: 'components/input',
39
- tags: ['autodocs'],
40
- } as Meta;
41
-
42
- const testInputBehavior = async (
43
- args: InputArgs,
44
- canvasElement: HTMLElement,
45
- mockHandler: any
46
- ) => {
47
- const canvas = within(canvasElement);
48
- const input = await waitFor(() => canvas.getByTestId('input-id'));
49
-
50
- if (input.shadowRoot) {
51
- const innerInput = input.shadowRoot.querySelector(
52
- '[data-testchild="children-id"]'
53
- );
54
-
55
- if (args.type !== 'file') {
56
- if (innerInput instanceof HTMLInputElement) {
57
- innerInput.value = args.defaultValue;
58
- }
59
- expect(innerInput).toHaveAttribute('placeholder', args.placeholder);
60
- }
61
-
62
- // 1. Test: Input should have the correct `disabled` state based on args
63
- if (args.disabled) {
64
- expect(innerInput).toBeDisabled();
65
- } else {
66
- expect(innerInput).not.toBeDisabled();
67
- }
68
-
69
- // 2. Test: `type` should be a valid InputType
70
- expect(validInputTypes).toContain(args.type);
71
-
72
- // 3. Test: Input should have correct type attribute
73
- expect(innerInput).toHaveAttribute('type', args.type);
74
-
75
- // 4. Test: Label should have correct `for` attribute linking to the input
76
- if (args.label) {
77
- const label = await waitFor(() => canvas.getByTestId('label-id'));
78
- expect(label).toBeInTheDocument();
79
- }
80
-
81
- // 5. Button should handle click events when not disabled
82
- if (args.ButtonLabel) {
83
- const button = await waitFor(() => canvas.getByTestId('button-id'));
84
- expect(button).toBeInTheDocument();
85
- const innerButton = button.querySelector('[data-testid="children-id"]');
86
- if (!args.disabledButton && innerButton) {
87
- await userEvent.click(innerButton);
88
- if (mockHandler) {
89
- expect(mockHandler).toHaveBeenCalled();
90
- }
91
- }
92
- }
93
-
94
- // 6. Test: Button should not handle click events when disabled
95
- if (args.disabledButton) {
96
- expect(mockHandler).not.toHaveBeenCalled();
97
- }
98
- }
99
- };
100
-
101
- const testInputSpecificBehavior = async (
102
- args: InputSpecificArgs,
103
- canvasElement: HTMLElement,
104
- mockHandler: any
105
- ) => {
106
- const canvas = within(canvasElement);
107
- const input = await waitFor(() => canvas.getByTestId('input-id'));
108
-
109
- if (input.shadowRoot) {
110
- const innerInput = input.shadowRoot.querySelector(
111
- '[data-testchild="children-id"]'
112
- );
113
-
114
- // 1. Test: Input should have the correct `disabled` state based on args
115
- if (args.disabled) {
116
- expect(innerInput).toBeDisabled();
117
- } else {
118
- expect(innerInput).not.toBeDisabled();
119
- }
120
-
121
- // 2. Test: `type` should be a valid InputType
122
- expect(validInputSpeceficTypes).toContain(args.type);
123
-
124
- // 3. Test: Input should have correct type attribute
125
- expect(innerInput).toHaveAttribute('type', args.type);
126
-
127
- // 4. Test: Label should have correct `for` attribute linking to the input
128
- if (args.label) {
129
- const label = await waitFor(() => canvas.getByTestId('label-id'));
130
- expect(label).toBeInTheDocument();
131
- }
132
-
133
- // 5. Button should handle click events when not disabled
134
- if (args.ButtonLabel) {
135
- const button = await waitFor(() => canvas.getByTestId('button-id'));
136
- expect(button).toBeInTheDocument();
137
- const innerButton = button.querySelector('[data-testid="children-id"]');
138
- if (!args.disabledButton && innerButton) {
139
- await userEvent.click(innerButton);
140
- if (mockHandler) {
141
- expect(mockHandler).toHaveBeenCalled();
142
- }
143
- }
144
- }
145
-
146
- // 6. Test: Button should not handle click events when disabled
147
- if (args.disabledButton) {
148
- expect(mockHandler).not.toHaveBeenCalled();
149
- }
150
- }
151
- };
152
-
153
- const mockOnClickHandler = fn(event => {
154
- alert('Hello!');
155
- });
156
-
157
- const Template: StoryFn = ({
158
- label,
159
- ButtonLabel,
160
- id,
161
- type,
162
- placeholder,
163
- disabled,
164
- disabledButton,
165
- defaultValue,
166
- }) => {
167
- const inputValue = type !== 'file' ? defaultValue : '';
168
- if (ButtonLabel && !label) {
169
- return html`
170
- <div style="display:flex">
171
- <rtg-input
172
- data-testid="input-id"
173
- data-testchild="children-id"
174
- id=${id}
175
- type=${type}
176
- placeholder=${placeholder}
177
- ?disabled=${disabled}
178
- .value=${inputValue}
179
- style="min-width:50%"
180
- ></rtg-input>
181
- <rtg-button
182
- data-testid="button-id"
183
- style="margin-inline-start:4px"
184
- size="default"
185
- ?disabled=${disabledButton}
186
- .click=${mockOnClickHandler}
187
- >${ButtonLabel}</rtg-button
188
- >
189
- </div>
190
- `;
191
- } else if (label && !ButtonLabel) {
192
- return html`
193
- <div>
194
- <rtg-label data-testid="label-id" for="picture">${label}</rtg-label>
195
- <rtg-input
196
- data-testid="input-id"
197
- data-testchild="children-id"
198
- type=${type}
199
- ?disabled=${disabled}
200
- placeholder=${placeholder}
201
- .value=${inputValue}
202
- style="min-width:50%"
203
- ></rtg-input>
204
- </div>
205
- `;
206
- } else if (label && ButtonLabel) {
207
- return html`
208
- <div style="display: flex; flex-direction: column;">
209
- <rtg-label data-testid="label-id" for="picture">${label}</rtg-label>
210
- <div style="display:flex">
211
- <rtg-input
212
- data-testid="input-id"
213
- data-testchild="children-id"
214
- id=${id}
215
- type=${type}
216
- placeholder=${placeholder}
217
- ?disabled=${disabled}
218
- .value=${inputValue}
219
- style="min-width:50%"
220
- ></rtg-input>
221
- <rtg-button
222
- data-testid="button-id"
223
- style="margin-inline-start:4px"
224
- size="default"
225
- ?disabled=${disabledButton}
226
- .click=${mockOnClickHandler}
227
- >${ButtonLabel}</rtg-button
228
- >
229
- </div>
230
- </div>
231
- `;
232
- } else {
233
- return html`
234
- <rtg-input
235
- data-testid="input-id"
236
- data-testchild="children-id"
237
- type=${type}
238
- ?disabled=${disabled}
239
- placeholder=${placeholder}
240
- .value=${inputValue}
241
- style="min-width:50%"
242
- ></rtg-input>
243
- `;
244
- }
245
- };
246
-
247
- const TemplateSpecific: StoryFn = ({
248
- label,
249
- ButtonLabel,
250
- id,
251
- type,
252
- value,
253
- disabled,
254
- disabledButton,
255
- }) => {
256
- if (ButtonLabel && !label) {
257
- return html`
258
- <div style="display:flex">
259
- <rtg-input
260
- data-testid="input-id"
261
- data-testchild="children-id"
262
- id=${id}
263
- type=${type}
264
- ?disabled=${disabled}
265
- .value=${value}
266
- style="min-width:50%"
267
- ></rtg-input>
268
- <rtg-button
269
- data-testid="button-id"
270
- style="margin-inline-start:4px"
271
- size="default"
272
- ?disabled=${disabledButton}
273
- .click=${mockOnClickHandler}
274
- >${ButtonLabel}</rtg-button
275
- >
276
- </div>
277
- `;
278
- } else if (label && !ButtonLabel) {
279
- return html`
280
- <div>
281
- <rtg-label data-testid="label-id" for="picture">${label}</rtg-label>
282
- <rtg-input
283
- data-testid="input-id"
284
- data-testchild="children-id"
285
- type=${type}
286
- ?disabled=${disabled}
287
- .value=${value}
288
- style="min-width:50%"
289
- ></rtg-input>
290
- </div>
291
- `;
292
- } else if (label && ButtonLabel) {
293
- return html`
294
- <div style="display: flex; flex-direction: column;">
295
- <rtg-label data-testid="label-id" for="picture">${label}</rtg-label>
296
- <div style="display:flex">
297
- <rtg-input
298
- data-testid="input-id"
299
- data-testchild="children-id"
300
- id=${id}
301
- type=${type}
302
- ?disabled=${disabled}
303
- .value=${value}
304
- style="min-width:50%"
305
- ></rtg-input>
306
- <rtg-button
307
- data-testid="button-id"
308
- style="margin-inline-start:4px"
309
- size="default"
310
- ?disabled=${disabledButton}
311
- .click=${mockOnClickHandler}
312
- >${ButtonLabel}</rtg-button
313
- >
314
- </div>
315
- </div>
316
- `;
317
- } else {
318
- return html`
319
- <rtg-input
320
- data-testid="input-id"
321
- data-testchild="children-id"
322
- type=${type}
323
- ?disabled=${disabled}
324
- .value=${value}
325
- style="min-width:50%"
326
- ></rtg-input>
327
- `;
328
- }
329
- };
330
-
331
- export const Input = Template.bind({});
332
-
333
- Input.args = {
334
- disabled: false,
335
- type: 'text',
336
- placeholder: 'Enter text',
337
- defaultValue: '',
338
- label: '',
339
- ButtonLabel: 'Subscribe',
340
- disabledButton: false,
341
- id: '',
342
- };
343
-
344
- Input.parameters = {
345
- docs: {
346
- source: {
347
- transform: (code: string) => {
348
- // Handling boolean attributes: if true, render without value, if false, omit the attribute
349
- const updatedCode = code
350
- .replace(/disabled=""/g, 'disabled=true')
351
- .replace(/disabled="false"/g, '');
352
-
353
- return updatedCode;
354
- },
355
- },
356
- },
357
- };
358
-
359
- Input.argTypes = {
360
- disabled: {
361
- control: 'boolean',
362
- description: 'Determines whether the input is disabled (unclickable).',
363
- table: {
364
- defaultValue: { summary: 'false' },
365
- },
366
- },
367
- disabledButton: {
368
- control: 'boolean',
369
- description:
370
- 'Indicates whether the button should be disabled, preventing user interaction.',
371
- table: {
372
- defaultValue: { summary: 'false' },
373
- },
374
- },
375
- type: {
376
- control: { type: 'select' },
377
- description:
378
- 'Specifies the type of the input, such as text, email, password, etc.',
379
- options: validInputTypes,
380
- },
381
- placeholder: {
382
- control: 'text',
383
- description:
384
- 'Provides a short hint that describes the expected value of the input.',
385
- if: { arg: 'type', neq: 'file' },
386
- },
387
- defaultValue: {
388
- control: 'text',
389
- description: 'Sets the initial value of the input field.',
390
- if: { arg: 'type', neq: 'file' },
391
- },
392
- label: {
393
- control: 'text',
394
- description: 'Defines the label text for the input field.',
395
- },
396
- ButtonLabel: {
397
- control: 'text',
398
- description: 'Defines the label text for the associated button.',
399
- },
400
- id: {
401
- control: 'text',
402
- description: 'Unique identifier for the input element.',
403
- },
404
- };
405
-
406
- Input.play = async ({ args, canvasElement }) => {
407
- try {
408
- await testInputBehavior(
409
- args as InputArgs,
410
- canvasElement,
411
- mockOnClickHandler
412
- );
413
- } catch (error) {
414
- console.error('An error occurred during the play function:', error);
415
- }
416
- };
417
-
418
- export const SpecificInput = TemplateSpecific.bind({});
419
-
420
- SpecificInput.args = {
421
- disabled: false,
422
- type: 'file',
423
- label: '',
424
- ButtonLabel: 'Subscribe',
425
- disabledButton: false,
426
- id: '',
427
- };
428
-
429
- SpecificInput.argTypes = {
430
- disabled: { control: 'boolean' },
431
- disabledButton: { control: 'boolean' },
432
- type: {
433
- control: { type: 'select' },
434
- options: validInputSpeceficTypes,
435
- },
436
- label: { control: 'text' },
437
- ButtonLabel: { control: 'text' },
438
- id: { control: 'text' },
439
- };
440
-
441
- SpecificInput.play = async ({ args, canvasElement }) => {
442
- try {
443
- await testInputSpecificBehavior(
444
- args as InputSpecificArgs,
445
- canvasElement,
446
- mockOnClickHandler
447
- );
448
- } catch (error) {
449
- console.error('An error occurred during the play function:', error);
450
- }
451
- };
@@ -1,2 +0,0 @@
1
- export const inputStyles =
2
- 'flex h-8 w-full rounded-sm border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50 input-base';
@@ -1,58 +0,0 @@
1
- export type InputType =
2
- | 'hidden'
3
- | 'text'
4
- | 'search'
5
- | 'tel'
6
- | 'url'
7
- | 'email'
8
- | 'password'
9
- | 'date'
10
- | 'month'
11
- | 'week'
12
- | 'time'
13
- | 'datetime-local'
14
- | 'number'
15
- | 'range'
16
- | 'color'
17
- | 'file';
18
-
19
- export type InputNormalType =
20
- | 'hidden'
21
- | 'text'
22
- | 'search'
23
- | 'tel'
24
- | 'url'
25
- | 'email'
26
- | 'password';
27
-
28
- export type InputSpecificType =
29
- | 'hidden'
30
- | 'date'
31
- | 'month'
32
- | 'week'
33
- | 'time'
34
- | 'datetime-local'
35
- | 'number'
36
- | 'range'
37
- | 'color'
38
- | 'file';
39
-
40
- export type InputArgs = {
41
- disabled: boolean;
42
- disabledButton: boolean;
43
- type: InputType;
44
- placeholder: string;
45
- label: string;
46
- defaultValue: string;
47
- ButtonLabel: string;
48
- id: string;
49
- };
50
-
51
- export type InputSpecificArgs = {
52
- disabled: boolean;
53
- disabledButton: boolean;
54
- type: InputSpecificType;
55
- label: string;
56
- ButtonLabel: string;
57
- id: string;
58
- };
@@ -1,64 +0,0 @@
1
- import { LitElement, html, css, PropertyValues } from 'lit';
2
- import { property, customElement } from 'lit/decorators.js';
3
- import { BaseElement, cn } from '../../../helpers';
4
- import { TWStyles } from '../../../styles';
5
- import { labelStyle } from './label.style';
6
- import { spread } from '@open-wc/lit-helpers';
7
-
8
- @customElement('rtg-label')
9
- export class Label extends BaseElement {
10
- static labelVariants = labelStyle;
11
-
12
- @property({ type: String }) for = '';
13
-
14
- static styles = [
15
- css`
16
- :root {
17
- --label-text-color: inherit;
18
- --label-padding: inherit;
19
- }
20
- .label-base {
21
- color: var(--label-text-color) !important;
22
- padding: var(--label-padding) !important;
23
- }
24
- `,
25
- TWStyles,
26
- ];
27
-
28
- protected firstUpdated(_changedProperties: PropertyValues): void {
29
- const variables = ['--label-text-color,--label-padding'];
30
- this.applyCustomClass(variables, 'label', 'label-base');
31
- }
32
-
33
- private _onClick(e: Event) {
34
- if (e.defaultPrevented) return;
35
- const target = this.shadowRoot?.getElementById(this.for);
36
- if (target) {
37
- target.click();
38
- }
39
- }
40
-
41
- protected getAttributesToExclude(): string[] {
42
- return ['for', 'data-testid'];
43
- }
44
-
45
- render() {
46
- const attributes = this.getFilteredAttributes();
47
-
48
- return html`
49
- <label
50
- for="${this.for}"
51
- @click="${this._onClick}"
52
- @keydown="${this._onClick}"
53
- class="${cn(
54
- Label.labelVariants({
55
- className: this.className,
56
- })
57
- )}"
58
- ${spread(attributes)}
59
- >
60
- <slot></slot>
61
- </label>
62
- `;
63
- }
64
- }
@@ -1,102 +0,0 @@
1
- import { html } from 'lit';
2
- import { Meta, StoryFn } from '@storybook/web-components';
3
- import './label.atom';
4
-
5
- import { expect, within, fn, waitFor, userEvent } from '@storybook/test';
6
- import { Label } from './label.atom';
7
-
8
- // Label Test Behavior
9
- const testLabelBehavior = async (
10
- args: any,
11
- canvasElement: any,
12
- mockHandler: any
13
- ) => {
14
- const canvas = within(canvasElement);
15
- const label = await waitFor(() => canvas.getByTestId('label-id'));
16
- if (label.shadowRoot) {
17
- const innerLabel =
18
- label.shadowRoot.querySelector('label') || ('' as unknown as Element);
19
- // 1. Test: Label should have correct "for" attribute
20
- expect(label).toHaveAttribute('for', args.for);
21
-
22
- // 2. Test: Label should apply correct variant classes
23
- const expectedClasses = Label.labelVariants({
24
- className: '',
25
- });
26
- expect(innerLabel).toHaveClass(expectedClasses);
27
-
28
- // 3. Test: Label should trigger associated input's click when clicked
29
- if (!args.disabled) {
30
- const targetInput = document.createElement('input');
31
- targetInput.id = args.for;
32
- label.shadowRoot.appendChild(targetInput);
33
- targetInput.click = fn(); // Mock click behavior for test
34
- await userEvent.click(innerLabel);
35
- expect(targetInput.click).toHaveBeenCalled();
36
- label.shadowRoot.removeChild(targetInput); // Clean up
37
- }
38
-
39
- // 4. Test: Ensure that label doesn't trigger input click when default is prevented
40
- const event = new Event('click', { cancelable: true });
41
- label.dispatchEvent(event);
42
- if (!event.defaultPrevented) {
43
- await userEvent.click(innerLabel);
44
- expect(mockHandler).not.toHaveBeenCalled(); // should not trigger if default prevented
45
- }
46
- }
47
- };
48
-
49
- export default {
50
- title: 'components/atoms/label',
51
- tags: ['autodocs'],
52
- argTypes: {
53
- label: {
54
- type: 'string',
55
- description: 'The text to display on the label.',
56
- table: {
57
- defaultValue: { summary: '' },
58
- },
59
- },
60
- for: {
61
- type: 'string',
62
- description:
63
- "The text that the label is describing. This is typically the ID of the input element it's labeling.",
64
- table: {
65
- defaultValue: { summary: '' },
66
- },
67
- },
68
- },
69
- } as Meta;
70
-
71
- const Template: StoryFn = (args: any) =>
72
- html` <rtg-label
73
- data-testchild="children-id"
74
- data-testid="label-id"
75
- for=${args.for}
76
- >${args.label}</rtg-label
77
- >`;
78
-
79
- const HtmlForTemplate: StoryFn = (args: any) =>
80
- html` <rtg-label
81
- data-testchild="children-id"
82
- data-testid="label-id"
83
- for=${args.for}
84
- >
85
- ${args.label}
86
- <input type="text" id=${args.for} />
87
- </rtg-label>`;
88
- export const Default = Template.bind({});
89
- export const HtmlFor = HtmlForTemplate.bind({});
90
-
91
- Default.args = {
92
- for: 'id',
93
- label: 'Email address',
94
- };
95
- HtmlFor.args = {
96
- for: 'id',
97
- label: 'Email address',
98
- };
99
- Default.play = async ({ args, canvasElement }) => {
100
- const mockHandler = fn();
101
- await testLabelBehavior(args, canvasElement, mockHandler);
102
- };
@@ -1,5 +0,0 @@
1
- import { cva } from 'class-variance-authority';
2
-
3
- export const labelStyle = cva(
4
- 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70'
5
- );