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

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 (42) hide show
  1. package/dist/components/icon/Icon.stories.d.ts +7 -0
  2. package/dist/components/icon/Icon.stories.d.ts.map +1 -1
  3. package/dist/components/icon/Icon.stories.js +8 -0
  4. package/dist/components/icon/Icon.stories.js.map +1 -1
  5. package/dist/components/tabs/Tabs.d.ts +17 -0
  6. package/dist/components/tabs/Tabs.d.ts.map +1 -0
  7. package/dist/components/tabs/Tabs.js +10 -0
  8. package/dist/components/tabs/Tabs.js.map +1 -0
  9. package/dist/components/tabs/Tabs.stories.d.ts +40 -0
  10. package/dist/components/tabs/Tabs.stories.d.ts.map +1 -0
  11. package/dist/components/tabs/Tabs.stories.js +46 -0
  12. package/dist/components/tabs/Tabs.stories.js.map +1 -0
  13. package/dist/components/tabs/Tabs.test.d.ts +2 -0
  14. package/dist/components/tabs/Tabs.test.d.ts.map +1 -0
  15. package/dist/components/tabs/Tabs.test.js +108 -0
  16. package/dist/components/tabs/Tabs.test.js.map +1 -0
  17. package/dist/components/tabs/TabsItem.d.ts +15 -0
  18. package/dist/components/tabs/TabsItem.d.ts.map +1 -0
  19. package/dist/components/tabs/TabsItem.js +18 -0
  20. package/dist/components/tabs/TabsItem.js.map +1 -0
  21. package/dist/components/tabs/TabsItem.stories.d.ts +618 -0
  22. package/dist/components/tabs/TabsItem.stories.d.ts.map +1 -0
  23. package/dist/components/tabs/TabsItem.stories.js +48 -0
  24. package/dist/components/tabs/TabsItem.stories.js.map +1 -0
  25. package/dist/index.css +57 -1
  26. package/dist/index.css.map +1 -1
  27. package/dist/index.d.ts +1 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +1 -0
  30. package/dist/index.js.map +1 -1
  31. package/package.json +1 -1
  32. package/src/components/card/card.scss +1 -1
  33. package/src/components/icon/Icon.stories.tsx +8 -0
  34. package/src/components/tabs/Tabs.stories.tsx +92 -0
  35. package/src/components/tabs/Tabs.test.tsx +220 -0
  36. package/src/components/tabs/Tabs.tsx +14 -0
  37. package/src/components/tabs/TabsItem.stories.tsx +55 -0
  38. package/src/components/tabs/TabsItem.tsx +42 -0
  39. package/src/components/tabs/tabs.scss +61 -0
  40. package/src/index.scss +1 -0
  41. package/src/index.ts +1 -0
  42. package/src/tokens.scss +1 -0
@@ -6,6 +6,13 @@ export declare const Default: {
6
6
  name: string;
7
7
  size: number;
8
8
  };
9
+ argTypes: {
10
+ name: {
11
+ control: string;
12
+ description: string;
13
+ options: string[];
14
+ };
15
+ };
9
16
  };
10
17
  export default meta;
11
18
  //# sourceMappingURL=Icon.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Icon.stories.d.ts","sourceRoot":"","sources":["../../../src/components/icon/Icon.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,IAAI,CAG3B,CAAC;AAEF,eAAO,MAAM,OAAO;;;;;CAKnB,CAAC;AAEF,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"Icon.stories.d.ts","sourceRoot":"","sources":["../../../src/components/icon/Icon.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9B,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,IAAI,CAG3B,CAAC;AAEF,eAAO,MAAM,OAAO;;;;;;;;;;;;CAYnB,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { Icon } from './Icon';
2
+ import { allowedIcons } from './allowedIcons';
2
3
  const meta = {
3
4
  title: 'Components/Icon',
4
5
  component: Icon,
@@ -8,6 +9,13 @@ export const Default = {
8
9
  name: '3-dot',
9
10
  size: 16,
10
11
  },
12
+ argTypes: {
13
+ name: {
14
+ control: 'select',
15
+ description: 'Icon name',
16
+ options: Object.keys(allowedIcons),
17
+ },
18
+ },
11
19
  };
12
20
  export default meta;
13
21
  //# sourceMappingURL=Icon.stories.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Icon.stories.js","sourceRoot":"","sources":["../../../src/components/icon/Icon.stories.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,MAAM,IAAI,GAAsB;IAC9B,KAAK,EAAE,iBAAiB;IACxB,SAAS,EAAE,IAAI;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,EAAE;KACT;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"Icon.stories.js","sourceRoot":"","sources":["../../../src/components/icon/Icon.stories.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,IAAI,GAAsB;IAC9B,KAAK,EAAE,iBAAiB;IACxB,SAAS,EAAE,IAAI;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,EAAE;KACT;IACD,QAAQ,EAAE;QACR,IAAI,EAAE;YACJ,OAAO,EAAE,QAAQ;YACjB,WAAW,EAAE,WAAW;YACxB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;SACnC;KACF;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type HTMLAttributes } from 'react';
2
+ export declare const Tabs: {
3
+ (props: HTMLAttributes<HTMLUListElement> & {
4
+ children: React.ReactNode;
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ Item: (props: {
7
+ active?: boolean;
8
+ iconName?: keyof typeof import("../icon/allowedIcons").allowedIcons;
9
+ } & (({
10
+ tabElement?: "button";
11
+ tabElementProps?: import("react").ButtonHTMLAttributes<HTMLButtonElement>;
12
+ } | {
13
+ tabElement?: "link";
14
+ tabElementProps?: import("react").AnchorHTMLAttributes<HTMLAnchorElement>;
15
+ }) & HTMLAttributes<HTMLLIElement>)) => import("react/jsx-runtime").JSX.Element;
16
+ };
17
+ //# sourceMappingURL=Tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,eAAO,MAAM,IAAI;YAAW,cAAc,CAAC,gBAAgB,CAAC,GAAG;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE;;;;;;;;;;;CAO3F,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import classNames from 'classnames';
3
+ import {} from 'react';
4
+ import { TabsItem } from './TabsItem';
5
+ export const Tabs = (props) => {
6
+ const { children, className, ...rest } = props;
7
+ return (_jsx("ul", { role: "tablist", className: classNames('ds-tabs', className), ...rest, children: children }));
8
+ };
9
+ Tabs.Item = TabsItem;
10
+ //# sourceMappingURL=Tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.js","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAuB,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAuE,EAAE,EAAE;IAC9F,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAC/C,OAAO,CACL,aAAI,IAAI,EAAC,SAAS,EAAC,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,KAAM,IAAI,YACrE,QAAQ,GACN,CACN,CAAC;AACJ,CAAC,CAAC;AAEF,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { StoryObj } from '@storybook/react-vite';
2
+ declare const meta: {
3
+ title: string;
4
+ component: {
5
+ (props: import("react").HTMLAttributes<HTMLUListElement> & {
6
+ children: React.ReactNode;
7
+ }): import("react/jsx-runtime").JSX.Element;
8
+ Item: (props: {
9
+ active?: boolean;
10
+ iconName?: keyof typeof import("../icon/allowedIcons").allowedIcons;
11
+ } & (({
12
+ tabElement?: "button";
13
+ tabElementProps?: import("react").ButtonHTMLAttributes<HTMLButtonElement>;
14
+ } | {
15
+ tabElement?: "link";
16
+ tabElementProps?: import("react").AnchorHTMLAttributes<HTMLAnchorElement>;
17
+ }) & import("react").HTMLAttributes<HTMLLIElement>)) => import("react/jsx-runtime").JSX.Element;
18
+ };
19
+ parameters: {
20
+ layout: string;
21
+ };
22
+ tags: string[];
23
+ argTypes: {
24
+ children: {
25
+ control: false;
26
+ description: string;
27
+ };
28
+ className: {
29
+ control: "text";
30
+ description: string;
31
+ };
32
+ };
33
+ };
34
+ export default meta;
35
+ type Story = StoryObj<typeof meta>;
36
+ export declare const Default: Story;
37
+ export declare const WithLinks: Story;
38
+ export declare const Mixed: Story;
39
+ export declare const ManyTabs: Story;
40
+ //# sourceMappingURL=Tabs.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.stories.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAG5D,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiBmB,CAAC;AAE9B,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAGnC,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAGF,eAAO,MAAM,SAAS,EAAE,KAgBvB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,KAenB,CAAC;AAGF,eAAO,MAAM,QAAQ,EAAE,KAetB,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Tabs } from './Tabs';
3
+ const meta = {
4
+ title: 'Components/Tabs',
5
+ component: Tabs,
6
+ parameters: {
7
+ layout: 'padded',
8
+ },
9
+ tags: ['autodocs'],
10
+ argTypes: {
11
+ children: {
12
+ control: false,
13
+ description: 'Tab items to display',
14
+ },
15
+ className: {
16
+ control: 'text',
17
+ description: 'Additional CSS classes',
18
+ },
19
+ },
20
+ };
21
+ export default meta;
22
+ // Basic tabs with buttons
23
+ export const Default = {
24
+ args: {
25
+ children: (_jsxs(_Fragment, { children: [_jsx(Tabs.Item, { active: true, children: "Overview" }), _jsx(Tabs.Item, { children: "Details" }), _jsx(Tabs.Item, { children: "Settings" })] })),
26
+ },
27
+ };
28
+ // Tabs with links
29
+ export const WithLinks = {
30
+ args: {
31
+ children: (_jsxs(_Fragment, { children: [_jsx(Tabs.Item, { tabElement: "link", tabElementProps: { href: '#overview' }, active: true, children: "Overview" }), _jsx(Tabs.Item, { tabElement: "link", tabElementProps: { href: '#details' }, children: "Details" }), _jsx(Tabs.Item, { tabElement: "link", tabElementProps: { href: '#settings' }, children: "Settings" })] })),
32
+ },
33
+ };
34
+ // Mixed tabs (buttons and links)
35
+ export const Mixed = {
36
+ args: {
37
+ children: (_jsxs(_Fragment, { children: [_jsx(Tabs.Item, { active: true, children: "Home" }), _jsx(Tabs.Item, { tabElement: "link", tabElementProps: { href: '#about' }, children: "About" }), _jsx(Tabs.Item, { children: "Contact" }), _jsx(Tabs.Item, { tabElement: "link", tabElementProps: { href: '#help' }, children: "Help" })] })),
38
+ },
39
+ };
40
+ // Many tabs
41
+ export const ManyTabs = {
42
+ args: {
43
+ children: (_jsxs(_Fragment, { children: [_jsx(Tabs.Item, { active: true, iconName: "list", children: "Tab 1" }), _jsx(Tabs.Item, { iconName: "list", children: "Tab 2" }), _jsx(Tabs.Item, { iconName: "list", children: "Tab 3" }), _jsx(Tabs.Item, { iconName: "list", children: "Tab 4" }), _jsx(Tabs.Item, { iconName: "list", children: "Tab 5" }), _jsx(Tabs.Item, { iconName: "list", children: "Tab 6" }), _jsx(Tabs.Item, { iconName: "list", children: "Tab 7" }), _jsx(Tabs.Item, { iconName: "list", children: "Tab 8" })] })),
44
+ },
45
+ };
46
+ //# sourceMappingURL=Tabs.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.stories.js","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,iBAAiB;IACxB,SAAS,EAAE,IAAI;IACf,UAAU,EAAE;QACV,MAAM,EAAE,QAAQ;KACjB;IACD,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,QAAQ,EAAE;QACR,QAAQ,EAAE;YACR,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,sBAAsB;SACpC;QACD,SAAS,EAAE;YACT,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,wBAAwB;SACtC;KACF;CAC0B,CAAC;AAE9B,eAAe,IAAI,CAAC;AAGpB,0BAA0B;AAC1B,MAAM,CAAC,MAAM,OAAO,GAAU;IAC5B,IAAI,EAAE;QACJ,QAAQ,EAAE,CACR,8BACE,KAAC,IAAI,CAAC,IAAI,IAAC,MAAM,+BAAqB,EACtC,KAAC,IAAI,CAAC,IAAI,0BAAoB,EAC9B,KAAC,IAAI,CAAC,IAAI,2BAAqB,IAC9B,CACJ;KACF;CACF,CAAC;AAEF,kBAAkB;AAClB,MAAM,CAAC,MAAM,SAAS,GAAU;IAC9B,IAAI,EAAE;QACJ,QAAQ,EAAE,CACR,8BACE,KAAC,IAAI,CAAC,IAAI,IAAC,UAAU,EAAC,MAAM,EAAC,eAAe,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,MAAM,+BAE/D,EACZ,KAAC,IAAI,CAAC,IAAI,IAAC,UAAU,EAAC,MAAM,EAAC,eAAe,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,wBAEtD,EACZ,KAAC,IAAI,CAAC,IAAI,IAAC,UAAU,EAAC,MAAM,EAAC,eAAe,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,yBAEvD,IACX,CACJ;KACF;CACF,CAAC;AAEF,iCAAiC;AACjC,MAAM,CAAC,MAAM,KAAK,GAAU;IAC1B,IAAI,EAAE;QACJ,QAAQ,EAAE,CACR,8BACE,KAAC,IAAI,CAAC,IAAI,IAAC,MAAM,2BAAiB,EAClC,KAAC,IAAI,CAAC,IAAI,IAAC,UAAU,EAAC,MAAM,EAAC,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,sBAEpD,EACZ,KAAC,IAAI,CAAC,IAAI,0BAAoB,EAC9B,KAAC,IAAI,CAAC,IAAI,IAAC,UAAU,EAAC,MAAM,EAAC,eAAe,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,qBAEnD,IACX,CACJ;KACF;CACF,CAAC;AAEF,YAAY;AACZ,MAAM,CAAC,MAAM,QAAQ,GAAU;IAC7B,IAAI,EAAE;QACJ,QAAQ,EAAE,CACR,8BACE,KAAC,IAAI,CAAC,IAAI,IAAC,MAAM,QAAC,QAAQ,EAAC,MAAM,sBAAkB,EACnD,KAAC,IAAI,CAAC,IAAI,IAAC,QAAQ,EAAC,MAAM,sBAAkB,EAC5C,KAAC,IAAI,CAAC,IAAI,IAAC,QAAQ,EAAC,MAAM,sBAAkB,EAC5C,KAAC,IAAI,CAAC,IAAI,IAAC,QAAQ,EAAC,MAAM,sBAAkB,EAC5C,KAAC,IAAI,CAAC,IAAI,IAAC,QAAQ,EAAC,MAAM,sBAAkB,EAC5C,KAAC,IAAI,CAAC,IAAI,IAAC,QAAQ,EAAC,MAAM,sBAAkB,EAC5C,KAAC,IAAI,CAAC,IAAI,IAAC,QAAQ,EAAC,MAAM,sBAAkB,EAC5C,KAAC,IAAI,CAAC,IAAI,IAAC,QAAQ,EAAC,MAAM,sBAAkB,IAC3C,CACJ;KACF;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import '@testing-library/jest-dom/vitest';
2
+ //# sourceMappingURL=Tabs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.test.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.test.tsx"],"names":[],"mappings":"AAGA,OAAO,kCAAkC,CAAC"}
@@ -0,0 +1,108 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { expect, test, describe, vi } from 'vitest';
3
+ import { Tabs } from './Tabs';
4
+ import { render, screen, fireEvent } from '@testing-library/react';
5
+ import '@testing-library/jest-dom/vitest';
6
+ describe('Tabs component', () => {
7
+ test('renders tabs container with correct role', () => {
8
+ render(_jsxs(Tabs, { children: [_jsx(Tabs.Item, { children: "Tab 1" }), _jsx(Tabs.Item, { children: "Tab 2" })] }));
9
+ const tabsContainer = screen.getByRole('tablist');
10
+ expect(tabsContainer).toBeInTheDocument();
11
+ expect(tabsContainer.tagName).toBe('UL');
12
+ expect(tabsContainer).toHaveClass('ds-tabs');
13
+ });
14
+ test('renders children correctly', () => {
15
+ render(_jsxs(Tabs, { children: [_jsx(Tabs.Item, { children: "Overview" }), _jsx(Tabs.Item, { children: "Details" }), _jsx(Tabs.Item, { children: "Settings" })] }));
16
+ expect(screen.getByText('Overview')).toBeInTheDocument();
17
+ expect(screen.getByText('Details')).toBeInTheDocument();
18
+ expect(screen.getByText('Settings')).toBeInTheDocument();
19
+ });
20
+ test('applies custom className', () => {
21
+ render(_jsx(Tabs, { className: "custom-tabs", children: _jsx(Tabs.Item, { children: "Tab 1" }) }));
22
+ const tabsContainer = screen.getByRole('tablist');
23
+ expect(tabsContainer).toHaveClass('ds-tabs', 'custom-tabs');
24
+ });
25
+ test('passes through additional props', () => {
26
+ render(_jsx(Tabs, { "data-testid": "tabs-container", "aria-label": "Navigation tabs", children: _jsx(Tabs.Item, { children: "Tab 1" }) }));
27
+ const tabsContainer = screen.getByTestId('tabs-container');
28
+ expect(tabsContainer).toHaveAttribute('aria-label', 'Navigation tabs');
29
+ });
30
+ });
31
+ describe('TabsItem component', () => {
32
+ test('renders as button by default', () => {
33
+ render(_jsx(Tabs, { children: _jsx(Tabs.Item, { children: "Tab Button" }) }));
34
+ const tabButton = screen.getByRole('tab');
35
+ expect(tabButton.tagName).toBe('BUTTON');
36
+ expect(tabButton).toHaveTextContent('Tab Button');
37
+ });
38
+ test('renders as link when tabElement is link', () => {
39
+ render(_jsx(Tabs, { children: _jsx(Tabs.Item, { tabElement: "link", tabElementProps: { href: '#overview' }, children: "Overview Link" }) }));
40
+ const tabLink = screen.getByRole('tab');
41
+ expect(tabLink.tagName).toBe('A');
42
+ expect(tabLink).toHaveAttribute('href', '#overview');
43
+ expect(tabLink).toHaveTextContent('Overview Link');
44
+ });
45
+ test('applies active state correctly', () => {
46
+ render(_jsxs(Tabs, { children: [_jsx(Tabs.Item, { active: true, children: "Active Tab" }), _jsx(Tabs.Item, { children: "Inactive Tab" })] }));
47
+ const activeTab = screen.getByText('Active Tab');
48
+ const inactiveTab = screen.getByText('Inactive Tab');
49
+ expect(activeTab).toHaveClass('ds-tabs-item__tab--active');
50
+ expect(activeTab).toHaveAttribute('aria-selected', 'true');
51
+ expect(inactiveTab).not.toHaveClass('ds-tabs-item__tab--active');
52
+ expect(inactiveTab).toHaveAttribute('aria-selected', 'false');
53
+ });
54
+ test('applies correct CSS classes', () => {
55
+ render(_jsx(Tabs, { children: _jsx(Tabs.Item, { children: "Tab Item" }) }));
56
+ const listItem = screen.getByRole('presentation');
57
+ const tabElement = screen.getByRole('tab');
58
+ expect(listItem).toHaveClass('ds-tabs-item');
59
+ expect(tabElement).toHaveClass('ds-tabs-item__tab');
60
+ });
61
+ test('applies custom className to list item', () => {
62
+ render(_jsx(Tabs, { children: _jsx(Tabs.Item, { className: "custom-tab-item", children: "Tab Item" }) }));
63
+ const listItem = screen.getByRole('presentation');
64
+ expect(listItem).toHaveClass('ds-tabs-item', 'custom-tab-item');
65
+ });
66
+ test('handles click events on button tabs', () => {
67
+ const handleClick = vi.fn();
68
+ render(_jsx(Tabs, { children: _jsx(Tabs.Item, { tabElementProps: { onClick: handleClick }, children: "Clickable Tab" }) }));
69
+ fireEvent.click(screen.getByRole('tab'));
70
+ expect(handleClick).toHaveBeenCalledTimes(1);
71
+ });
72
+ test('passes through additional props to button', () => {
73
+ render(_jsx(Tabs, { children: _jsx(Tabs.Item, { tabElementProps: { 'disabled': true, 'data-testid': 'tab-button' }, children: "Disabled Tab" }) }));
74
+ const tabButton = screen.getByTestId('tab-button');
75
+ expect(tabButton).toBeDisabled();
76
+ });
77
+ test('passes through additional props to link', () => {
78
+ render(_jsx(Tabs, { children: _jsx(Tabs.Item, { tabElement: "link", tabElementProps: {
79
+ 'href': '#test',
80
+ 'target': '_blank',
81
+ // @ts-expect-error - data-testid is not a valid prop for AnchorHTMLAttributes
82
+ 'data-testid': 'tab-link',
83
+ }, children: "Link Tab" }) }));
84
+ const tabLink = screen.getByTestId('tab-link');
85
+ expect(tabLink).toHaveAttribute('href', '#test');
86
+ expect(tabLink).toHaveAttribute('target', '_blank');
87
+ });
88
+ test('renders multiple tabs correctly', () => {
89
+ render(_jsxs(Tabs, { children: [_jsx(Tabs.Item, { active: true, children: "Tab 1" }), _jsx(Tabs.Item, { children: "Tab 2" }), _jsx(Tabs.Item, { tabElement: "link", tabElementProps: { href: '#tab3' }, children: "Tab 3" })] }));
90
+ const tabs = screen.getAllByRole('tab');
91
+ expect(tabs).toHaveLength(3);
92
+ expect(tabs[0]).toHaveTextContent('Tab 1');
93
+ expect(tabs[0]).toHaveAttribute('aria-selected', 'true');
94
+ expect(tabs[1]).toHaveTextContent('Tab 2');
95
+ expect(tabs[1]).toHaveAttribute('aria-selected', 'false');
96
+ expect(tabs[2]).toHaveTextContent('Tab 3');
97
+ expect(tabs[2]).toHaveAttribute('href', '#tab3');
98
+ });
99
+ test('handles mixed tab types', () => {
100
+ render(_jsxs(Tabs, { children: [_jsx(Tabs.Item, { active: true, children: "Button Tab" }), _jsx(Tabs.Item, { tabElement: "link", tabElementProps: { href: '#link-tab' }, children: "Link Tab" })] }));
101
+ const buttonTab = screen.getByText('Button Tab');
102
+ const linkTab = screen.getByText('Link Tab');
103
+ expect(buttonTab.tagName).toBe('BUTTON');
104
+ expect(linkTab.tagName).toBe('A');
105
+ expect(linkTab).toHaveAttribute('href', '#link-tab');
106
+ });
107
+ });
108
+ //# sourceMappingURL=Tabs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.test.js","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { allowedIcons } from '../icon/allowedIcons';
2
+ import type { AnchorHTMLAttributes, ButtonHTMLAttributes, HTMLAttributes } from 'react';
3
+ type TabsItemProps = {
4
+ active?: boolean;
5
+ iconName?: keyof typeof allowedIcons;
6
+ } & ({
7
+ tabElement?: 'button';
8
+ tabElementProps?: ButtonHTMLAttributes<HTMLButtonElement>;
9
+ } | {
10
+ tabElement?: 'link';
11
+ tabElementProps?: AnchorHTMLAttributes<HTMLAnchorElement>;
12
+ }) & HTMLAttributes<HTMLLIElement>;
13
+ export declare const TabsItem: (props: TabsItemProps) => import("react/jsx-runtime").JSX.Element;
14
+ export {};
15
+ //# sourceMappingURL=TabsItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabsItem.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/TabsItem.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAExF,KAAK,aAAa,GAAG;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,OAAO,YAAY,CAAC;CACtC,GAAG,CACA;IAAE,UAAU,CAAC,EAAE,QAAQ,CAAC;IAAC,eAAe,CAAC,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAA;CAAE,GACpF;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAA;CAAE,CACnF,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;AAEpC,eAAO,MAAM,QAAQ,GAAI,OAAO,aAAa,4CA4B5C,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import classNames from 'classnames';
3
+ import { Icon } from '../icon/Icon';
4
+ export const TabsItem = (props) => {
5
+ const { children, className, tabElement = 'button', tabElementProps, active = false, iconName, ...rest } = props;
6
+ const elementClassNames = classNames('ds-tabs-item__tab', {
7
+ 'ds-tabs-item__tab--active': active,
8
+ });
9
+ const sharedProps = {
10
+ 'role': 'tab',
11
+ 'className': elementClassNames,
12
+ 'aria-selected': active,
13
+ };
14
+ return (_jsx("li", { role: "presentation", className: classNames('ds-tabs-item', className), ...rest, children: tabElement === 'button'
15
+ ? (_jsxs("button", { ...tabElementProps, ...sharedProps, children: [iconName && _jsx(Icon, { name: iconName, size: 16 }), children] }))
16
+ : (_jsxs("a", { ...tabElementProps, ...sharedProps, children: [iconName && _jsx(Icon, { name: iconName, size: 16 }), children] })) }));
17
+ };
18
+ //# sourceMappingURL=TabsItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabsItem.js","sourceRoot":"","sources":["../../../src/components/tabs/TabsItem.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAW5C,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAoB,EAAE,EAAE;IAC/C,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,GAAG,QAAQ,EAAE,eAAe,EAAE,MAAM,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAEjH,MAAM,iBAAiB,GAAG,UAAU,CAAC,mBAAmB,EAAE;QACxD,2BAA2B,EAAE,MAAM;KACpC,CAAC,CAAC;IACH,MAAM,WAAW,GAAG;QAClB,MAAM,EAAE,KAAK;QACb,WAAW,EAAE,iBAAiB;QAC9B,eAAe,EAAE,MAAM;KACxB,CAAC;IACF,OAAO,CACL,aAAI,IAAI,EAAC,cAAc,EAAC,SAAS,EAAE,UAAU,CAAC,cAAc,EAAE,SAAS,CAAC,KAAM,IAAI,YAC/E,UAAU,KAAK,QAAQ;YACtB,CAAC,CAAC,CACE,qBAAa,eAA2D,KAAM,WAAW,aACtF,QAAQ,IAAI,KAAC,IAAI,IAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAI,EAC9C,QAAQ,IACF,CACV;YACH,CAAC,CAAC,CACE,gBAAQ,eAA2D,KAAM,WAAW,aACjF,QAAQ,IAAI,KAAC,IAAI,IAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAI,EAC9C,QAAQ,IACP,CACL,GACF,CACN,CAAC;AACJ,CAAC,CAAC"}