@arbor-education/design-system.components 0.0.1 → 0.0.2

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 (104) hide show
  1. package/.github/workflows/design-system-pr-checks.yml +37 -0
  2. package/.husky/pre-commit +2 -1
  3. package/.storybook/main.ts +12 -0
  4. package/.storybook/preview.ts +1 -1
  5. package/README.md +7 -4
  6. package/dist/components/button/Button.test.d.ts +2 -0
  7. package/dist/components/button/Button.test.d.ts.map +1 -0
  8. package/dist/components/button/Button.test.js +44 -0
  9. package/dist/components/button/Button.test.js.map +1 -0
  10. package/dist/components/card/Card.test.d.ts +2 -0
  11. package/dist/components/card/Card.test.d.ts.map +1 -0
  12. package/dist/components/card/Card.test.js +169 -0
  13. package/dist/components/card/Card.test.js.map +1 -0
  14. package/dist/components/formField/FormField.d.ts +20 -0
  15. package/dist/components/formField/FormField.d.ts.map +1 -0
  16. package/dist/components/formField/FormField.js +25 -0
  17. package/dist/components/formField/FormField.js.map +1 -0
  18. package/dist/components/formField/FormField.stories.d.ts +58 -0
  19. package/dist/components/formField/FormField.stories.d.ts.map +1 -0
  20. package/dist/components/formField/FormField.stories.js +75 -0
  21. package/dist/components/formField/FormField.stories.js.map +1 -0
  22. package/dist/components/formField/FormField.test.d.ts +2 -0
  23. package/dist/components/formField/FormField.test.d.ts.map +1 -0
  24. package/dist/components/formField/FormField.test.js +37 -0
  25. package/dist/components/formField/FormField.test.js.map +1 -0
  26. package/dist/components/formField/inputs/text/TextInput.d.ts +7 -0
  27. package/dist/components/formField/inputs/text/TextInput.d.ts.map +1 -0
  28. package/dist/components/formField/inputs/text/TextInput.js +11 -0
  29. package/dist/components/formField/inputs/text/TextInput.js.map +1 -0
  30. package/dist/components/formField/inputs/text/TextInput.stories.d.ts +31 -0
  31. package/dist/components/formField/inputs/text/TextInput.stories.d.ts.map +1 -0
  32. package/dist/components/formField/inputs/text/TextInput.stories.js +37 -0
  33. package/dist/components/formField/inputs/text/TextInput.stories.js.map +1 -0
  34. package/dist/components/formField/inputs/text/TextInput.test.d.ts +2 -0
  35. package/dist/components/formField/inputs/text/TextInput.test.d.ts.map +1 -0
  36. package/dist/components/formField/inputs/text/TextInput.test.js +29 -0
  37. package/dist/components/formField/inputs/text/TextInput.test.js.map +1 -0
  38. package/dist/components/formField/inputs/textArea/TextArea.d.ts +7 -0
  39. package/dist/components/formField/inputs/textArea/TextArea.d.ts.map +1 -0
  40. package/dist/components/formField/inputs/textArea/TextArea.js +26 -0
  41. package/dist/components/formField/inputs/textArea/TextArea.js.map +1 -0
  42. package/dist/components/formField/inputs/textArea/TextArea.stories.d.ts +11 -0
  43. package/dist/components/formField/inputs/textArea/TextArea.stories.d.ts.map +1 -0
  44. package/dist/components/formField/inputs/textArea/TextArea.stories.js +14 -0
  45. package/dist/components/formField/inputs/textArea/TextArea.stories.js.map +1 -0
  46. package/dist/components/formField/inputs/textArea/TextArea.test.d.ts +2 -0
  47. package/dist/components/formField/inputs/textArea/TextArea.test.d.ts.map +1 -0
  48. package/dist/components/formField/inputs/textArea/TextArea.test.js +19 -0
  49. package/dist/components/formField/inputs/textArea/TextArea.test.js.map +1 -0
  50. package/dist/components/formField/label/Label.d.ts +3 -0
  51. package/dist/components/formField/label/Label.d.ts.map +1 -0
  52. package/dist/components/formField/label/Label.js +8 -0
  53. package/dist/components/formField/label/Label.js.map +1 -0
  54. package/dist/components/formField/label/Label.stories.d.ts +10 -0
  55. package/dist/components/formField/label/Label.stories.d.ts.map +1 -0
  56. package/dist/components/formField/label/Label.stories.js +12 -0
  57. package/dist/components/formField/label/Label.stories.js.map +1 -0
  58. package/dist/components/formField/label/Label.test.d.ts +2 -0
  59. package/dist/components/formField/label/Label.test.d.ts.map +1 -0
  60. package/dist/components/formField/label/Label.test.js +10 -0
  61. package/dist/components/formField/label/Label.test.js.map +1 -0
  62. package/dist/components/heading/Heading.test.d.ts +2 -0
  63. package/dist/components/heading/Heading.test.d.ts.map +1 -0
  64. package/dist/components/heading/Heading.test.js +20 -0
  65. package/dist/components/heading/Heading.test.js.map +1 -0
  66. package/dist/components/icon/Icon.test.d.ts +2 -0
  67. package/dist/components/icon/Icon.test.d.ts.map +1 -0
  68. package/dist/components/icon/Icon.test.js +17 -0
  69. package/dist/components/icon/Icon.test.js.map +1 -0
  70. package/dist/components/icon/customIcons/CheckSolid.js.map +1 -1
  71. package/dist/components/icon/customIcons/XSolid.js.map +1 -1
  72. package/dist/components/pill/Pill.test.d.ts +2 -0
  73. package/dist/components/pill/Pill.test.d.ts.map +1 -0
  74. package/dist/components/pill/Pill.test.js +20 -0
  75. package/dist/components/pill/Pill.test.js.map +1 -0
  76. package/dist/index.css +131 -23
  77. package/dist/index.css.map +1 -1
  78. package/dist/index.d.ts +2 -0
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +2 -0
  81. package/dist/index.js.map +1 -1
  82. package/package.json +11 -4
  83. package/src/components/formField/FormField.stories.tsx +112 -0
  84. package/src/components/formField/FormField.test.tsx +41 -0
  85. package/src/components/formField/FormField.tsx +73 -0
  86. package/src/components/formField/formField.scss +41 -0
  87. package/src/components/formField/inputs/input.scss +75 -0
  88. package/src/components/formField/inputs/text/TextInput.stories.tsx +42 -0
  89. package/src/components/formField/inputs/text/TextInput.test.tsx +31 -0
  90. package/src/components/formField/inputs/text/TextInput.tsx +35 -0
  91. package/src/components/formField/inputs/textArea/TextArea.stories.tsx +18 -0
  92. package/src/components/formField/inputs/textArea/TextArea.test.tsx +19 -0
  93. package/src/components/formField/inputs/textArea/TextArea.tsx +56 -0
  94. package/src/components/formField/label/Label.stories.tsx +15 -0
  95. package/src/components/formField/label/Label.test.tsx +9 -0
  96. package/src/components/formField/label/Label.tsx +8 -0
  97. package/src/components/formField/label/label.scss +9 -0
  98. package/src/components/icon/customIcons/CheckSolid.tsx +1 -1
  99. package/src/components/icon/customIcons/XSolid.tsx +1 -1
  100. package/src/index.scss +10 -7
  101. package/src/index.ts +8 -6
  102. package/src/tokens.scss +25 -22
  103. package/tsconfig.json +8 -4
  104. package/vitest.config.ts +7 -16
@@ -0,0 +1,37 @@
1
+ name: Design System PR Checks
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, edited, synchronize, reopened]
6
+
7
+ concurrency:
8
+ group: ${{ github.workflow }}-${{ github.ref }}
9
+ cancel-in-progress: true
10
+
11
+ jobs:
12
+ dsChecks:
13
+ name: DS Checks
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - name: Checkout branch
17
+ uses: actions/checkout@v3
18
+ - name: Setup node
19
+ uses: actions/setup-node@v3
20
+ with:
21
+ node-version-file: ".nvmrc"
22
+ cache: "yarn"
23
+ - name: Install yarn
24
+ run: npm install yarn -g
25
+ - name: Install dependencies
26
+ run: yarn install --prefer-offline --frozen-lockfile
27
+ - name: Run typescript check
28
+ run: yarn check-types
29
+ - name: Run ESLint check
30
+ if: success() || failure()
31
+ run: yarn eslint
32
+ - name: Run stylelint check
33
+ if: success() || failure()
34
+ run: yarn style-lint
35
+ - name: Run component tests
36
+ if: success() || failure()
37
+ run: yarn test --no-coverage --watch=false
package/.husky/pre-commit CHANGED
@@ -1,2 +1,3 @@
1
1
  nvm install && nvm use
2
- yarn lint-staged
2
+ yarn check-types
3
+ yarn lint-staged
@@ -1,4 +1,5 @@
1
1
  import type { StorybookConfig } from '@storybook/react-vite';
2
+ import path from 'path';
2
3
 
3
4
  const config: StorybookConfig = {
4
5
  stories: [
@@ -12,10 +13,21 @@ const config: StorybookConfig = {
12
13
  '@storybook/addon-onboarding',
13
14
  '@storybook/addon-a11y',
14
15
  '@storybook/addon-vitest',
16
+ 'storybook-addon-deep-controls',
15
17
  ],
16
18
  framework: {
17
19
  name: '@storybook/react-vite',
18
20
  options: {},
19
21
  },
22
+ viteFinal: async (config) => {
23
+ if (config.resolve) {
24
+ config.resolve.alias = {
25
+ ...config.resolve.alias,
26
+ Components: path.resolve(__dirname, '../src/components'),
27
+ Utils: path.resolve(__dirname, '../src/utils'),
28
+ };
29
+ }
30
+ return config;
31
+ },
20
32
  };
21
33
  export default config;
@@ -10,7 +10,7 @@ const preview: Preview = {
10
10
  date: /Date$/i,
11
11
  },
12
12
  },
13
-
13
+ deepControls: { enabled: true },
14
14
  a11y: {
15
15
  // 'todo' - show a11y violations in the test UI only
16
16
  // 'error' - fail CI on a11y violations
package/README.md CHANGED
@@ -1,6 +1,9 @@
1
- # <<Repo Name>>
1
+ # Components for the Design System
2
2
 
3
- <<A short description of what the repo is for>>
3
+ ## What components are there?
4
+ Have a look at our wonderful [Storybook](https://main--68c3f2a09d95b22aa55a11e8.chromatic.com/).
5
+
6
+ ## How can I create a component?
4
7
 
5
8
  In order to use the createComponent script, run the following command:
6
9
 
@@ -10,9 +13,9 @@ Then you can create a new component by running
10
13
 
11
14
  npm run createComponent <ComponentName>
12
15
 
13
- ## Local Development with Yalc
16
+ ## How can I link this package locally?
14
17
 
15
- To publish new changes locally with hot loading, run:
18
+ You can link this package locally using [Yalc](https://github.com/wclr/yalc). To publish new changes locally with hot loading, run:
16
19
 
17
20
  yarn build
18
21
 
@@ -0,0 +1,2 @@
1
+ import '@testing-library/jest-dom/vitest';
2
+ //# sourceMappingURL=Button.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.test.d.ts","sourceRoot":"","sources":["../../../src/components/button/Button.test.tsx"],"names":[],"mappings":"AAGA,OAAO,kCAAkC,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { expect, test, describe, vi } from 'vitest';
3
+ import { Button } from './Button';
4
+ import { render, screen, fireEvent } from '@testing-library/react';
5
+ import '@testing-library/jest-dom/vitest';
6
+ describe('Button component', () => {
7
+ test('renders button with text', () => {
8
+ render(_jsx(Button, { children: "Button Text" }));
9
+ expect(screen.getByText('Button Text')).toBeInTheDocument();
10
+ });
11
+ test('applies primary style by default', () => {
12
+ render(_jsx(Button, { children: "Button Text" }));
13
+ const button = screen.getByText('Button Text').closest('button');
14
+ expect(button).toHaveClass('ds-button--primary');
15
+ });
16
+ test('applies correct type class when specified', () => {
17
+ render(_jsx(Button, { type: "secondary", children: "Button Text" }));
18
+ const button = screen.getByText('Button Text').closest('button');
19
+ expect(button).toHaveClass('ds-button--secondary');
20
+ });
21
+ test('applies correct size class', () => {
22
+ render(_jsx(Button, { size: "S", children: "Small Button" }));
23
+ const button = screen.getByText('Small Button').closest('button');
24
+ expect(button).toHaveClass('ds-button--S');
25
+ });
26
+ test('handles click events', () => {
27
+ const handleClick = vi.fn();
28
+ render(_jsx(Button, { onClick: handleClick, children: "Click Me" }));
29
+ fireEvent.click(screen.getByText('Click Me'));
30
+ expect(handleClick).toHaveBeenCalledTimes(1);
31
+ });
32
+ test('does not call onClick when disabled', () => {
33
+ const handleClick = vi.fn();
34
+ render(_jsx(Button, { onClick: handleClick, disabled: true, children: "Disabled Button" }));
35
+ fireEvent.click(screen.getByText('Disabled Button'));
36
+ expect(handleClick).not.toHaveBeenCalled();
37
+ });
38
+ test('applies additional className', () => {
39
+ render(_jsx(Button, { className: "custom-class", children: "Button Text" }));
40
+ const button = screen.getByText('Button Text').closest('button');
41
+ expect(button).toHaveClass('custom-class');
42
+ });
43
+ });
44
+ //# sourceMappingURL=Button.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.test.js","sourceRoot":"","sources":["../../../src/components/button/Button.test.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,kCAAkC,CAAC;AAE1C,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,KAAC,MAAM,8BAAqB,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,KAAC,MAAM,8BAAqB,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,KAAC,MAAM,IAAC,IAAI,EAAC,WAAW,4BAAqB,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,KAAC,MAAM,IAAC,IAAI,EAAC,GAAG,6BAAsB,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAChC,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAC,MAAM,IAAC,OAAO,EAAE,WAAW,yBAAmB,CAAC,CAAC;QACxD,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,WAAW,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAC,MAAM,IAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,sCAAyB,CAAC,CAAC;QACxE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,KAAC,MAAM,IAAC,SAAS,EAAC,cAAc,4BAAqB,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import '@testing-library/jest-dom/vitest';
2
+ //# sourceMappingURL=Card.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Card.test.d.ts","sourceRoot":"","sources":["../../../src/components/card/Card.test.tsx"],"names":[],"mappings":"AAIA,OAAO,kCAAkC,CAAC"}
@@ -0,0 +1,169 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { expect, test, describe, vi } from 'vitest';
4
+ import { render, screen, fireEvent } from '@testing-library/react';
5
+ import { Card } from './Card';
6
+ import '@testing-library/jest-dom/vitest';
7
+ describe('Card Component', () => {
8
+ test('renders empty card without any props', () => {
9
+ render(_jsx(Card, {}));
10
+ const card = screen.getByRole('article');
11
+ expect(card).toBeInTheDocument();
12
+ expect(card).toHaveAttribute('aria-label', 'Card');
13
+ });
14
+ test('renders card with title', () => {
15
+ render(_jsx(Card, { title: "Test Title" }));
16
+ expect(screen.getByRole('heading', { level: 4 })).toHaveTextContent('Test Title');
17
+ expect(screen.getByText('Test Title')).toHaveClass('ds-card__title');
18
+ });
19
+ test('renders card with paragraph', () => {
20
+ render(_jsx(Card, { paragraph: "Test paragraph content" }));
21
+ expect(screen.getByText('Test paragraph content')).toBeInTheDocument();
22
+ expect(screen.getByText('Test paragraph content')).toHaveClass('ds-card__paragraph');
23
+ });
24
+ test('renders card with both title and paragraph', () => {
25
+ render(_jsx(Card, { title: "Test Title", paragraph: "Test paragraph" }));
26
+ expect(screen.getByRole('heading', { level: 4 })).toHaveTextContent('Test Title');
27
+ expect(screen.getByText('Test paragraph')).toBeInTheDocument();
28
+ });
29
+ test('renders card with icon', () => {
30
+ const { container } = render(_jsx(Card, { icon: "eye" }));
31
+ expect(container.querySelector('.ds-icon-eye')).toBeInTheDocument();
32
+ });
33
+ test('renders card with pill', () => {
34
+ render(_jsx(Card, { pillText: "Test Pill", pillColor: "orange" }));
35
+ expect(screen.getByText('Test Pill')).toBeInTheDocument();
36
+ });
37
+ test('renders complete card with all props', () => {
38
+ const mockClick = vi.fn();
39
+ const mockKeyDown = vi.fn();
40
+ const { container } = render(_jsx(Card, { title: "Complete Card", paragraph: "This is a complete card", icon: "eye", iconColor: "#blue", pillText: "Complete", pillColor: "green", onClick: mockClick, onKeyDown: mockKeyDown }));
41
+ expect(screen.getByText('Complete Card')).toBeInTheDocument();
42
+ expect(screen.getByText('This is a complete card')).toBeInTheDocument();
43
+ expect(container.querySelector('.ds-icon-eye')).toBeInTheDocument();
44
+ expect(screen.getByText('Complete')).toBeInTheDocument();
45
+ });
46
+ describe('Click interactions', () => {
47
+ test('calls onClick handler when card is clicked', () => {
48
+ const mockClick = vi.fn();
49
+ render(_jsx(Card, { title: "Clickable Card", onClick: mockClick }));
50
+ const card = screen.getByRole('article');
51
+ fireEvent.click(card);
52
+ expect(mockClick).toHaveBeenCalledTimes(1);
53
+ });
54
+ test('does not call onClick when card is disabled', () => {
55
+ const mockClick = vi.fn();
56
+ render(_jsx(Card, { title: "Disabled Card", onClick: mockClick, disabled: true }));
57
+ const card = screen.getByRole('article');
58
+ fireEvent.click(card);
59
+ expect(mockClick).not.toHaveBeenCalled();
60
+ });
61
+ test('shows click arrow icon when card is clickable', () => {
62
+ const mockClick = vi.fn();
63
+ const { container } = render(_jsx(Card, { title: "Clickable Card", onClick: mockClick }));
64
+ expect(container.querySelector('.ds-icon-chevron-right')).toBeInTheDocument();
65
+ });
66
+ test('does not show click arrow icon when card is not clickable', () => {
67
+ const { container } = render(_jsx(Card, { title: "Non-clickable Card" }));
68
+ expect(container.querySelector('.ds-icon-chevron-right')).not.toBeInTheDocument();
69
+ });
70
+ test('does not show click arrow icon when card is disabled', () => {
71
+ const mockClick = vi.fn();
72
+ const { container } = render(_jsx(Card, { title: "Disabled Card", onClick: mockClick, disabled: true }));
73
+ expect(container.querySelector('.ds-icon-chevron-right')).not.toBeInTheDocument();
74
+ });
75
+ test('uses arrow type when specified', () => {
76
+ const mockClick = vi.fn();
77
+ const { container } = render(_jsx(Card, { title: "Clickable Card", onClick: mockClick, arrowType: "arrow" }));
78
+ expect(container.querySelector('.ds-icon-arrow-right')).toBeInTheDocument();
79
+ });
80
+ });
81
+ describe('Keyboard interactions', () => {
82
+ test('calls onKeyDown handler when key is pressed on clickable card', () => {
83
+ const mockKeyDown = vi.fn();
84
+ render(_jsx(Card, { title: "Keyboard Card", onClick: vi.fn(), onKeyDown: mockKeyDown }));
85
+ const card = screen.getByRole('article');
86
+ fireEvent.keyDown(card, { key: 'Enter' });
87
+ expect(mockKeyDown).toHaveBeenCalledTimes(1);
88
+ });
89
+ test('does not call onKeyDown when card is disabled', () => {
90
+ const mockKeyDown = vi.fn();
91
+ render(_jsx(Card, { title: "Disabled Card", onClick: vi.fn(), onKeyDown: mockKeyDown, disabled: true }));
92
+ const card = screen.getByRole('article');
93
+ fireEvent.keyDown(card, { key: 'Enter' });
94
+ expect(mockKeyDown).not.toHaveBeenCalled();
95
+ });
96
+ test('does not call onKeyDown when card is not clickable', () => {
97
+ const mockKeyDown = vi.fn();
98
+ render(_jsx(Card, { title: "Non-clickable Card", onKeyDown: mockKeyDown }));
99
+ const card = screen.getByRole('article');
100
+ fireEvent.keyDown(card, { key: 'Enter' });
101
+ expect(mockKeyDown).not.toHaveBeenCalled();
102
+ });
103
+ });
104
+ describe('CSS classes and accessibility', () => {
105
+ test('applies clickable class when onClick is provided and not disabled', () => {
106
+ const mockClick = vi.fn();
107
+ render(_jsx(Card, { onClick: mockClick }));
108
+ const card = screen.getByRole('article');
109
+ expect(card).toHaveClass('ds-card__container--clickable');
110
+ });
111
+ test('applies disabled class when disabled', () => {
112
+ render(_jsx(Card, { disabled: true }));
113
+ const card = screen.getByRole('article');
114
+ expect(card).toHaveClass('ds-card__container--disabled');
115
+ });
116
+ test('does not apply clickable class when disabled', () => {
117
+ const mockClick = vi.fn();
118
+ render(_jsx(Card, { onClick: mockClick, disabled: true }));
119
+ const card = screen.getByRole('article');
120
+ expect(card).not.toHaveClass('ds-card__container--clickable');
121
+ expect(card).toHaveClass('ds-card__container--disabled');
122
+ });
123
+ test('sets correct tabIndex for clickable card', () => {
124
+ const mockClick = vi.fn();
125
+ render(_jsx(Card, { onClick: mockClick }));
126
+ const card = screen.getByRole('article');
127
+ expect(card).toHaveAttribute('tabIndex', '0');
128
+ });
129
+ test('sets correct tabIndex for non-clickable card', () => {
130
+ render(_jsx(Card, {}));
131
+ const card = screen.getByRole('article');
132
+ expect(card).toHaveAttribute('tabIndex', '-1');
133
+ });
134
+ test('sets correct tabIndex for disabled card', () => {
135
+ const mockClick = vi.fn();
136
+ render(_jsx(Card, { onClick: mockClick, disabled: true }));
137
+ const card = screen.getByRole('article');
138
+ expect(card).toHaveAttribute('tabIndex', '-1');
139
+ });
140
+ test('has correct aria-label', () => {
141
+ render(_jsx(Card, {}));
142
+ const card = screen.getByRole('article');
143
+ expect(card).toHaveAttribute('aria-label', 'Card');
144
+ });
145
+ });
146
+ describe('Event handler edge cases', () => {
147
+ test('handles onClick without onKeyDown', () => {
148
+ const mockClick = vi.fn();
149
+ render(_jsx(Card, { title: "Click only", onClick: mockClick }));
150
+ const card = screen.getByRole('article');
151
+ fireEvent.click(card);
152
+ expect(mockClick).toHaveBeenCalledTimes(1);
153
+ });
154
+ test('handles onKeyDown without onClick', () => {
155
+ const mockKeyDown = vi.fn();
156
+ render(_jsx(Card, { title: "KeyDown only", onKeyDown: mockKeyDown }));
157
+ const card = screen.getByRole('article');
158
+ fireEvent.keyDown(card, { key: 'Enter' });
159
+ // Should not be called because card is not clickable (no onClick)
160
+ expect(mockKeyDown).not.toHaveBeenCalled();
161
+ });
162
+ test('does not throw error when clicking card without handlers', () => {
163
+ render(_jsx(Card, { title: "No handlers" }));
164
+ const card = screen.getByRole('article');
165
+ expect(() => fireEvent.click(card)).not.toThrow();
166
+ });
167
+ });
168
+ });
169
+ //# sourceMappingURL=Card.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Card.test.js","sourceRoot":"","sources":["../../../src/components/card/Card.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type TextInputProps } from './inputs/text/TextInput';
2
+ import { type TextAreaProps } from './inputs/textArea/TextArea';
3
+ type FormFieldProps = {
4
+ className?: string;
5
+ label?: string;
6
+ id?: string;
7
+ fieldDescription?: React.ReactNode;
8
+ helperLinkText?: string;
9
+ helperLinkUrl?: string;
10
+ errorText?: string;
11
+ } & ({
12
+ inputType?: 'text';
13
+ inputProps?: TextInputProps;
14
+ } | {
15
+ inputType?: 'textarea';
16
+ inputProps?: TextAreaProps;
17
+ });
18
+ export declare const FormField: (props: FormFieldProps) => import("react/jsx-runtime").JSX.Element;
19
+ export {};
20
+ //# sourceMappingURL=FormField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormField.d.ts","sourceRoot":"","sources":["../../../src/components/formField/FormField.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE1E,KAAK,cAAc,GAAG;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,CACA;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,cAAc,CAAA;CAAE,GACnD;IAAE,SAAS,CAAC,EAAE,UAAU,CAAC;IAAC,UAAU,CAAC,EAAE,aAAa,CAAA;CAAE,CACzD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,cAAc,4CAqD9C,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import classNames from 'classnames';
3
+ import { Label } from './label/Label';
4
+ import { Icon } from '../icon/Icon';
5
+ import { TextInput } from './inputs/text/TextInput';
6
+ import { TextArea } from './inputs/textArea/TextArea';
7
+ export const FormField = (props) => {
8
+ const { className, label, id, inputType = 'text', helperLinkText, helperLinkUrl, errorText, inputProps, fieldDescription } = props;
9
+ const classes = classNames('ds-form-field', className);
10
+ const describedByIds = [];
11
+ if (fieldDescription) {
12
+ describedByIds.push(`${id}-description`);
13
+ }
14
+ if (errorText) {
15
+ describedByIds.push(`${id}-error`);
16
+ }
17
+ const sharedProps = {
18
+ id,
19
+ 'aria-describedby': describedByIds.join(' '),
20
+ 'hasError': !!errorText,
21
+ 'aria-invalid': !!errorText,
22
+ };
23
+ return (_jsxs("div", { className: classes, children: [label && (_jsx(Label, { htmlFor: id, children: label })), fieldDescription && (_jsx("span", { id: `${id}-description`, className: "ds-form-field__description", children: fieldDescription })), inputType === 'text' && (_jsx(TextInput, { ...sharedProps, ...inputProps })), inputType === 'textarea' && (_jsx(TextArea, { ...sharedProps, ...inputProps })), ((helperLinkText && helperLinkUrl) || errorText) && (_jsxs("div", { className: "ds-form-field__message", children: [errorText && (_jsxs("span", { className: "ds-form-field__message--error", id: `${id}-error`, children: [_jsx(Icon, { size: 12, name: "triangle-alert" }), errorText] })), helperLinkText && helperLinkUrl && (_jsxs("a", { href: helperLinkUrl, "aria-label": `${label} helper link`, className: "ds-form-field__message--helper", children: [helperLinkText, ' ', _jsx(Icon, { size: 12, name: "arrow-up-right" })] }))] }))] }));
24
+ };
25
+ //# sourceMappingURL=FormField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormField.js","sourceRoot":"","sources":["../../../src/components/formField/FormField.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,SAAS,EAAuB,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAsB,MAAM,4BAA4B,CAAC;AAe1E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAqB,EAAE,EAAE;IACjD,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,GAAG,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;IACnI,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,EAAE,CAAC;IAC1B,IAAI,gBAAgB,EAAE,CAAC;QACrB,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,WAAW,GAAG;QAClB,EAAE;QACF,kBAAkB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;QAC5C,UAAU,EAAE,CAAC,CAAC,SAAS;QACvB,cAAc,EAAE,CAAC,CAAC,SAAS;KAC5B,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAE,OAAO,aACpB,KAAK,IAAI,CACR,KAAC,KAAK,IAAC,OAAO,EAAE,EAAE,YACf,KAAK,GACA,CACT,EACA,gBAAgB,IAAI,CACnB,eAAM,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,SAAS,EAAC,4BAA4B,YAAE,gBAAgB,GAAQ,CAChG,EACA,SAAS,KAAK,MAAM,IAAI,CACvB,KAAC,SAAS,OAAK,WAAW,KAAO,UAA6B,GAAI,CACnE,EACA,SAAS,KAAK,UAAU,IAAI,CAC3B,KAAC,QAAQ,OAAK,WAAW,KAAO,UAA4B,GAAI,CACjE,EACA,CAAC,CAAC,cAAc,IAAI,aAAa,CAAC,IAAI,SAAS,CAAC,IAAI,CACnD,eAAK,SAAS,EAAC,wBAAwB,aACpC,SAAS,IAAI,CACZ,gBAAM,SAAS,EAAC,+BAA+B,EAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,aAC/D,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAC,gBAAgB,GAAG,EACvC,SAAS,IACL,CACR,EACA,cAAc,IAAI,aAAa,IAAI,CAClC,aAAG,IAAI,EAAE,aAAa,gBAAc,GAAG,KAAK,cAAc,EAAE,SAAS,EAAC,gCAAgC,aACnG,cAAc,EACd,GAAG,EACJ,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAC,gBAAgB,GAAG,IACtC,CACL,IACG,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,58 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { FormField } from './FormField';
3
+ declare const meta: Meta<typeof FormField>;
4
+ export declare const Default: {
5
+ args: {
6
+ id: string;
7
+ label: string;
8
+ inputProps: {
9
+ placeholder: string;
10
+ onChange: import("@vitest/spy").Mock<(...args: any[]) => any>;
11
+ };
12
+ helperLinkText: string;
13
+ helperLinkUrl: string;
14
+ errorText: string;
15
+ fieldDescription: string;
16
+ inputType: string;
17
+ };
18
+ argTypes: {
19
+ helperLinkText: {
20
+ control: string;
21
+ description: string;
22
+ };
23
+ helperLinkUrl: {
24
+ control: string;
25
+ description: string;
26
+ };
27
+ errorText: {
28
+ control: string;
29
+ description: string;
30
+ };
31
+ fieldDescription: {
32
+ control: string;
33
+ description: string;
34
+ };
35
+ inputType: {
36
+ control: string;
37
+ options: string[];
38
+ description: string;
39
+ };
40
+ 'inputProps.size': {
41
+ control: string;
42
+ options: string[];
43
+ description: string;
44
+ };
45
+ 'inputProps.disabled': {
46
+ control: string;
47
+ description: string;
48
+ };
49
+ 'inputProps.placeholder': {
50
+ control: string;
51
+ description: string;
52
+ };
53
+ };
54
+ };
55
+ type Story = StoryObj<typeof meta>;
56
+ export declare const FormExample: Story;
57
+ export default meta;
58
+ //# sourceMappingURL=FormField.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormField.stories.d.ts","sourceRoot":"","sources":["../../../src/components/formField/FormField.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,SAAS,CAGhC,CAAC;AAEF,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkDnB,CAAC;AAEF,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAGnC,eAAO,MAAM,WAAW,EAAE,KA4CzB,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { fn } from 'storybook/test';
3
+ import { FormField } from './FormField';
4
+ const meta = {
5
+ title: 'Components/FormField',
6
+ component: FormField,
7
+ };
8
+ export const Default = {
9
+ args: {
10
+ id: 'text-input',
11
+ label: 'Text Input',
12
+ inputProps: {
13
+ placeholder: 'Enter your text',
14
+ onChange: fn(),
15
+ },
16
+ helperLinkText: 'More information',
17
+ helperLinkUrl: 'https://www.google.com',
18
+ errorText: 'This is some error text',
19
+ fieldDescription: 'This is some descriptive text for the field',
20
+ inputType: 'text',
21
+ },
22
+ argTypes: {
23
+ 'helperLinkText': {
24
+ control: 'text',
25
+ description: 'Helper link text',
26
+ },
27
+ 'helperLinkUrl': {
28
+ control: 'text',
29
+ description: 'Helper link URL',
30
+ },
31
+ 'errorText': {
32
+ control: 'text',
33
+ description: 'Error text',
34
+ },
35
+ 'fieldDescription': {
36
+ control: 'text',
37
+ description: 'Field description',
38
+ },
39
+ 'inputType': {
40
+ control: 'select',
41
+ options: ['text', 'textarea'],
42
+ description: 'Input type',
43
+ },
44
+ 'inputProps.size': {
45
+ control: 'select',
46
+ options: ['M', 'S'],
47
+ description: 'Input size',
48
+ },
49
+ 'inputProps.disabled': {
50
+ control: 'boolean',
51
+ description: 'Disable the input',
52
+ },
53
+ 'inputProps.placeholder': {
54
+ control: 'text',
55
+ description: 'Input placeholder text',
56
+ },
57
+ },
58
+ };
59
+ // Form example with multiple inputs
60
+ export const FormExample = {
61
+ render: () => (_jsxs("div", { style: { width: '400px', display: 'flex', flexDirection: 'column', gap: '1rem' }, children: [_jsx(FormField, { id: "first-name", label: "First Name", inputProps: {
62
+ placeholder: 'Enter your first name',
63
+ } }), _jsx(FormField, { id: "last-name", label: "Last Name", inputProps: {
64
+ placeholder: 'Enter your first name',
65
+ } }), _jsx(FormField, { id: "email", label: "Email", inputProps: {
66
+ placeholder: 'Enter your email',
67
+ }, helperLinkText: "More information", helperLinkUrl: "https://www.google.com" }), _jsx(FormField, { id: "password", label: "Password", inputProps: {
68
+ placeholder: 'Enter your first name',
69
+ type: 'password',
70
+ } }), _jsx(FormField, { id: "message", label: "Message", inputType: "textarea", inputProps: {
71
+ placeholder: 'Enter a lovely message',
72
+ } })] })),
73
+ };
74
+ export default meta;
75
+ //# sourceMappingURL=FormField.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormField.stories.js","sourceRoot":"","sources":["../../../src/components/formField/FormField.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,IAAI,GAA2B;IACnC,KAAK,EAAE,sBAAsB;IAC7B,SAAS,EAAE,SAAS;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE;QACJ,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,YAAY;QACnB,UAAU,EAAE;YACV,WAAW,EAAE,iBAAiB;YAC9B,QAAQ,EAAE,EAAE,EAAE;SACf;QACD,cAAc,EAAE,kBAAkB;QAClC,aAAa,EAAE,wBAAwB;QACvC,SAAS,EAAE,yBAAyB;QACpC,gBAAgB,EAAE,6CAA6C;QAC/D,SAAS,EAAE,MAAM;KAClB;IACD,QAAQ,EAAE;QACR,gBAAgB,EAAE;YAChB,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,kBAAkB;SAChC;QACD,eAAe,EAAE;YACf,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,iBAAiB;SAC/B;QACD,WAAW,EAAE;YACX,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,YAAY;SAC1B;QACD,kBAAkB,EAAE;YAClB,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,mBAAmB;SACjC;QACD,WAAW,EAAE;YACX,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;YAC7B,WAAW,EAAE,YAAY;SAC1B;QACD,iBAAiB,EAAE;YACjB,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;YACnB,WAAW,EAAE,YAAY;SAC1B;QACD,qBAAqB,EAAE;YACrB,OAAO,EAAE,SAAS;YAClB,WAAW,EAAE,mBAAmB;SACjC;QACD,wBAAwB,EAAE;YACxB,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,wBAAwB;SACtC;KACF;CACF,CAAC;AAIF,oCAAoC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAU;IAChC,MAAM,EAAE,GAAG,EAAE,CAAC,CACZ,eAAK,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,aACnF,KAAC,SAAS,IACR,EAAE,EAAC,YAAY,EACf,KAAK,EAAC,YAAY,EAClB,UAAU,EAAE;oBACV,WAAW,EAAE,uBAAuB;iBACrC,GACD,EACF,KAAC,SAAS,IACR,EAAE,EAAC,WAAW,EACd,KAAK,EAAC,WAAW,EACjB,UAAU,EAAE;oBACV,WAAW,EAAE,uBAAuB;iBACrC,GACD,EACF,KAAC,SAAS,IACR,EAAE,EAAC,OAAO,EACV,KAAK,EAAC,OAAO,EACb,UAAU,EAAE;oBACV,WAAW,EAAE,kBAAkB;iBAChC,EACD,cAAc,EAAC,kBAAkB,EACjC,aAAa,EAAC,wBAAwB,GACtC,EACF,KAAC,SAAS,IACR,EAAE,EAAC,UAAU,EACb,KAAK,EAAC,UAAU,EAChB,UAAU,EAAE;oBACV,WAAW,EAAE,uBAAuB;oBACpC,IAAI,EAAE,UAAU;iBACjB,GACD,EACF,KAAC,SAAS,IACR,EAAE,EAAC,SAAS,EACZ,KAAK,EAAC,SAAS,EACf,SAAS,EAAC,UAAU,EACpB,UAAU,EAAE;oBACV,WAAW,EAAE,wBAAwB;iBACtC,GACD,IACE,CACP;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,2 @@
1
+ import '@testing-library/jest-dom/vitest';
2
+ //# sourceMappingURL=FormField.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormField.test.d.ts","sourceRoot":"","sources":["../../../src/components/formField/FormField.test.tsx"],"names":[],"mappings":"AAGA,OAAO,kCAAkC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { expect, test, describe } from 'vitest';
3
+ import { FormField } from './FormField';
4
+ import { render, screen } from '@testing-library/react';
5
+ import '@testing-library/jest-dom/vitest';
6
+ describe('Input component', () => {
7
+ test('renders a form field', () => {
8
+ render(_jsx(FormField, { inputType: "text", label: "Email", id: "niceid" }));
9
+ expect(screen.getByLabelText('Email')).toBeInTheDocument();
10
+ });
11
+ test('renders helper link when provided', () => {
12
+ render(_jsx(FormField, { helperLinkText: "This is helper text", helperLinkUrl: "https://www.google.com", inputProps: { placeholder: 'Enter text' } }));
13
+ expect(screen.getByText('This is helper text')).toBeInTheDocument();
14
+ });
15
+ test('renders error text when provided', () => {
16
+ render(_jsx(FormField, { errorText: "This is an error", inputProps: { placeholder: 'Enter text' } }));
17
+ expect(screen.getByText('This is an error')).toBeInTheDocument();
18
+ const input = screen.getByPlaceholderText('Enter text');
19
+ expect(input).toHaveClass('ds-input--error');
20
+ });
21
+ test('applies disabled class and attribute', () => {
22
+ render(_jsx(FormField, { id: "niceid", inputProps: { disabled: true, placeholder: 'Enter text' } }));
23
+ const input = screen.getByPlaceholderText('Enter text');
24
+ expect(input).toBeDisabled();
25
+ });
26
+ test('renders a textinput by default', () => {
27
+ render(_jsx(FormField, { id: "niceid", inputProps: { placeholder: 'Enter text' } }));
28
+ const input = screen.getByPlaceholderText('Enter text');
29
+ expect(input).toHaveClass('ds-text-input');
30
+ });
31
+ test('renders a textarea when inputType is textarea', () => {
32
+ render(_jsx(FormField, { id: "niceid", inputType: "textarea", inputProps: { placeholder: 'Enter text' } }));
33
+ const input = screen.getByPlaceholderText('Enter text');
34
+ expect(input).toHaveClass('ds-textarea');
35
+ });
36
+ });
37
+ //# sourceMappingURL=FormField.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormField.test.js","sourceRoot":"","sources":["../../../src/components/formField/FormField.test.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,kCAAkC,CAAC;AAE1C,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,KAAC,SAAS,IAAC,SAAS,EAAC,MAAM,EAAC,KAAK,EAAC,OAAO,EAAC,EAAE,EAAC,QAAQ,GAAG,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,KAAC,SAAS,IAAC,cAAc,EAAC,qBAAqB,EAAC,aAAa,EAAC,wBAAwB,EAAC,UAAU,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,GAAI,CAAC,CAAC;QAC7I,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,KAAC,SAAS,IAAC,SAAS,EAAC,kBAAkB,EAAC,UAAU,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,GAAI,CAAC,CAAC;QAC9F,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,MAAM,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,KAAC,SAAS,IAAC,EAAE,EAAC,QAAQ,EAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,GAAI,CAAC,CAAC;QAC7F,MAAM,KAAK,GAAG,MAAM,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,KAAC,SAAS,IAAC,EAAE,EAAC,QAAQ,EAAC,UAAU,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,GAAI,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,KAAC,SAAS,IAAC,EAAE,EAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,GAAI,CAAC,CAAC;QAClG,MAAM,KAAK,GAAG,MAAM,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type InputHTMLAttributes } from 'react';
2
+ export type TextInputProps = {
3
+ size?: 'M' | 'S';
4
+ hasError?: boolean;
5
+ } & Omit<InputHTMLAttributes<HTMLInputElement>, 'size'>;
6
+ export declare const TextInput: (props: TextInputProps) => import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=TextInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextInput.d.ts","sourceRoot":"","sources":["../../../../../src/components/formField/inputs/text/TextInput.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAEjD,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC;AAExD,eAAO,MAAM,SAAS,GAAI,OAAO,cAAc,4CA0B9C,CAAC"}