@arbor-education/design-system.components 0.0.3 → 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 (40) 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 +14 -18
  6. package/dist/components/tabs/Tabs.d.ts.map +1 -1
  7. package/dist/components/tabs/Tabs.js +6 -39
  8. package/dist/components/tabs/Tabs.js.map +1 -1
  9. package/dist/components/tabs/Tabs.stories.d.ts +35 -6
  10. package/dist/components/tabs/Tabs.stories.d.ts.map +1 -1
  11. package/dist/components/tabs/Tabs.stories.js +17 -45
  12. package/dist/components/tabs/Tabs.stories.js.map +1 -1
  13. package/dist/components/tabs/Tabs.test.d.ts.map +1 -1
  14. package/dist/components/tabs/Tabs.test.js +90 -97
  15. package/dist/components/tabs/Tabs.test.js.map +1 -1
  16. package/dist/components/tabs/TabsItem.d.ts +15 -0
  17. package/dist/components/tabs/TabsItem.d.ts.map +1 -0
  18. package/dist/components/tabs/TabsItem.js +18 -0
  19. package/dist/components/tabs/TabsItem.js.map +1 -0
  20. package/dist/components/tabs/TabsItem.stories.d.ts +618 -0
  21. package/dist/components/tabs/TabsItem.stories.d.ts.map +1 -0
  22. package/dist/components/tabs/TabsItem.stories.js +48 -0
  23. package/dist/components/tabs/TabsItem.stories.js.map +1 -0
  24. package/dist/index.css +56 -0
  25. package/dist/index.css.map +1 -1
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +1 -0
  29. package/dist/index.js.map +1 -1
  30. package/package.json +1 -1
  31. package/src/components/icon/Icon.stories.tsx +8 -0
  32. package/src/components/tabs/Tabs.stories.tsx +92 -0
  33. package/src/components/tabs/Tabs.test.tsx +220 -0
  34. package/src/components/tabs/Tabs.tsx +14 -0
  35. package/src/components/tabs/TabsItem.stories.tsx +55 -0
  36. package/src/components/tabs/TabsItem.tsx +42 -0
  37. package/src/components/tabs/tabs.scss +61 -0
  38. package/src/index.scss +1 -0
  39. package/src/index.ts +1 -0
  40. 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"}
@@ -1,21 +1,17 @@
1
- import { type ReactNode } from 'react';
2
- type TabsProps = {
3
- children: ReactNode;
4
- defaultActiveTab?: string;
5
- className?: string;
6
- onTabChange?: (tabId: string) => void;
7
- };
1
+ import { type HTMLAttributes } from 'react';
8
2
  export declare const Tabs: {
9
- ({ children, defaultActiveTab, className, onTabChange, }: TabsProps): import("react/jsx-runtime").JSX.Element;
10
- Item: ({ children, tabId, label, disabled, className, }: TabsItemProps) => import("react/jsx-runtime").JSX.Element;
11
- };
12
- type TabsItemProps = {
13
- children: ReactNode;
14
- tabId: string;
15
- label: string;
16
- disabled?: boolean;
17
- className?: string;
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;
18
16
  };
19
- export declare const TabsItem: ({ children, tabId, label, disabled, className, }: TabsItemProps) => import("react/jsx-runtime").JSX.Element;
20
- export {};
21
17
  //# sourceMappingURL=Tabs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.tsx"],"names":[],"mappings":"AACA,OAAc,EAAuC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAiBnF,KAAK,SAAS,GAAG;IACf,QAAQ,EAAE,SAAS,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,eAAO,MAAM,IAAI;8DAKd,SAAS;6DA+BT,aAAa;CAhBf,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,kDAMtB,aAAa,4CAiDf,CAAC"}
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"}
@@ -1,43 +1,10 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import classNames from 'classnames';
3
- import React, { createContext, useContext, useState } from 'react';
4
- const TabsContext = createContext(undefined);
5
- const useTabsContext = () => {
6
- const context = useContext(TabsContext);
7
- if (!context) {
8
- throw new Error('Tabs.Item must be used within a Tabs component');
9
- }
10
- return context;
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 }));
11
8
  };
12
- export const Tabs = ({ children, defaultActiveTab, className = '', onTabChange, }) => {
13
- const [activeTab, setActiveTab] = useState(defaultActiveTab || '');
14
- const handleTabChange = (tabId) => {
15
- setActiveTab(tabId);
16
- onTabChange?.(tabId);
17
- };
18
- return (_jsx(TabsContext.Provider, { value: { activeTab, setActiveTab: handleTabChange }, children: _jsx("div", { className: classNames('ds-tabs', className), children: children }) }));
19
- };
20
- export const TabsItem = ({ children, tabId, label, disabled = false, className = '', }) => {
21
- const { activeTab, setActiveTab } = useTabsContext();
22
- const isActive = activeTab === tabId;
23
- const handleClick = () => {
24
- if (!disabled) {
25
- setActiveTab(tabId);
26
- }
27
- };
28
- const handleKeyDown = (e) => {
29
- if (e.key === 'Enter' || e.key === ' ') {
30
- e.preventDefault();
31
- if (!disabled) {
32
- setActiveTab(tabId);
33
- }
34
- }
35
- };
36
- return (_jsxs("div", { className: classNames('ds-tabs__item', className), children: [_jsx("button", { className: classNames('ds-tabs__tab', {
37
- 'ds-tabs__tab--active': isActive,
38
- 'ds-tabs__tab--disabled': disabled,
39
- }), onClick: handleClick, onKeyDown: handleKeyDown, disabled: disabled, role: "tab", "aria-selected": isActive, "aria-controls": `tabpanel-${tabId}`, id: `tab-${tabId}`, tabIndex: isActive ? 0 : -1, children: label }), isActive && (_jsx("div", { className: "ds-tabs__content", role: "tabpanel", id: `tabpanel-${tabId}`, "aria-labelledby": `tab-${tabId}`, children: children }))] }));
40
- };
41
- // Compound component pattern
42
9
  Tabs.Item = TabsItem;
43
10
  //# sourceMappingURL=Tabs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.js","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.tsx"],"names":[],"mappings":"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"}
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"}
@@ -1,11 +1,40 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
2
- import { Tabs } from './Tabs';
3
- declare const meta: Meta<typeof Tabs>;
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
+ };
4
34
  export default meta;
5
35
  type Story = StoryObj<typeof meta>;
6
36
  export declare const Default: Story;
7
- export declare const WithDisabledTab: Story;
37
+ export declare const WithLinks: Story;
38
+ export declare const Mixed: Story;
8
39
  export declare const ManyTabs: Story;
9
- export declare const WithRichContent: Story;
10
- export declare const CustomStyling: Story;
11
40
  //# sourceMappingURL=Tabs.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.stories.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,IAAI,CAyB3B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KA0BrB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KA0B7B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KA4CtB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KA2D7B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAqC3B,CAAC"}
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"}
@@ -1,74 +1,46 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Tabs } from './Tabs';
3
3
  const meta = {
4
4
  title: 'Components/Tabs',
5
5
  component: Tabs,
6
6
  parameters: {
7
7
  layout: 'padded',
8
- docs: {
9
- description: {
10
- component: 'A flexible tabs component with compound component pattern. Use Tabs.Item to create individual tab items.',
11
- },
12
- },
13
8
  },
9
+ tags: ['autodocs'],
14
10
  argTypes: {
15
- defaultActiveTab: {
16
- control: 'text',
17
- description: 'The ID of the tab that should be active by default',
18
- },
19
- onTabChange: {
20
- action: 'tab changed',
21
- description: 'Callback function called when the active tab changes',
11
+ children: {
12
+ control: false,
13
+ description: 'Tab items to display',
22
14
  },
23
15
  className: {
24
16
  control: 'text',
25
- description: 'Additional CSS class name for the tabs container',
17
+ description: 'Additional CSS classes',
26
18
  },
27
19
  },
28
20
  };
29
21
  export default meta;
22
+ // Basic tabs with buttons
30
23
  export const Default = {
31
24
  args: {
32
- defaultActiveTab: 'tab1',
33
- },
34
- render: (args) => (_jsxs(Tabs, { ...args, children: [_jsx(Tabs.Item, { tabId: "tab1", label: "Overview", children: _jsxs("div", { children: [_jsx("h3", { children: "Overview" }), _jsx("p", { children: "This is the overview tab content. It contains general information about the topic." })] }) }), _jsx(Tabs.Item, { tabId: "tab2", label: "Details", children: _jsxs("div", { children: [_jsx("h3", { children: "Details" }), _jsx("p", { children: "This is the details tab content. It provides more specific information and data." })] }) }), _jsx(Tabs.Item, { tabId: "tab3", label: "Settings", children: _jsxs("div", { children: [_jsx("h3", { children: "Settings" }), _jsx("p", { children: "This is the settings tab content. It contains configuration options and preferences." })] }) })] })),
35
- };
36
- export const WithDisabledTab = {
37
- args: {
38
- defaultActiveTab: 'tab1',
25
+ children: (_jsxs(_Fragment, { children: [_jsx(Tabs.Item, { active: true, children: "Overview" }), _jsx(Tabs.Item, { children: "Details" }), _jsx(Tabs.Item, { children: "Settings" })] })),
39
26
  },
40
- render: (args) => (_jsxs(Tabs, { ...args, children: [_jsx(Tabs.Item, { tabId: "tab1", label: "Available", children: _jsxs("div", { children: [_jsx("h3", { children: "Available" }), _jsx("p", { children: "This tab is available and can be clicked." })] }) }), _jsx(Tabs.Item, { tabId: "tab2", label: "Disabled", disabled: true, children: _jsxs("div", { children: [_jsx("h3", { children: "Disabled" }), _jsx("p", { children: "This tab is disabled and cannot be clicked." })] }) }), _jsx(Tabs.Item, { tabId: "tab3", label: "Another Available", children: _jsxs("div", { children: [_jsx("h3", { children: "Another Available" }), _jsx("p", { children: "This tab is also available and can be clicked." })] }) })] })),
41
27
  };
42
- export const ManyTabs = {
28
+ // Tabs with links
29
+ export const WithLinks = {
43
30
  args: {
44
- defaultActiveTab: 'tab3',
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" })] })),
45
32
  },
46
- render: (args) => (_jsxs(Tabs, { ...args, children: [_jsx(Tabs.Item, { tabId: "tab1", label: "First", children: _jsxs("div", { children: [_jsx("h3", { children: "First Tab" }), _jsx("p", { children: "Content for the first tab." })] }) }), _jsx(Tabs.Item, { tabId: "tab2", label: "Second", children: _jsxs("div", { children: [_jsx("h3", { children: "Second Tab" }), _jsx("p", { children: "Content for the second tab." })] }) }), _jsx(Tabs.Item, { tabId: "tab3", label: "Third", children: _jsxs("div", { children: [_jsx("h3", { children: "Third Tab" }), _jsx("p", { children: "Content for the third tab." })] }) }), _jsx(Tabs.Item, { tabId: "tab4", label: "Fourth", children: _jsxs("div", { children: [_jsx("h3", { children: "Fourth Tab" }), _jsx("p", { children: "Content for the fourth tab." })] }) }), _jsx(Tabs.Item, { tabId: "tab5", label: "Fifth", children: _jsxs("div", { children: [_jsx("h3", { children: "Fifth Tab" }), _jsx("p", { children: "Content for the fifth tab." })] }) }), _jsx(Tabs.Item, { tabId: "tab6", label: "Sixth", children: _jsxs("div", { children: [_jsx("h3", { children: "Sixth Tab" }), _jsx("p", { children: "Content for the sixth tab." })] }) })] })),
47
33
  };
48
- export const WithRichContent = {
34
+ // Mixed tabs (buttons and links)
35
+ export const Mixed = {
49
36
  args: {
50
- defaultActiveTab: 'dashboard',
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" })] })),
51
38
  },
52
- render: (args) => (_jsxs(Tabs, { ...args, children: [_jsx(Tabs.Item, { tabId: "dashboard", label: "Dashboard", children: _jsxs("div", { children: [_jsx("h3", { children: "Dashboard" }), _jsxs("div", { style: { display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '16px', marginTop: '16px' }, children: [_jsxs("div", { style: { padding: '16px', backgroundColor: '#f5f5f5', borderRadius: '8px' }, children: [_jsx("h4", { children: "Total Users" }), _jsx("p", { style: { fontSize: '24px', fontWeight: 'bold', margin: '8px 0' }, children: "1,234" })] }), _jsxs("div", { style: { padding: '16px', backgroundColor: '#f5f5f5', borderRadius: '8px' }, children: [_jsx("h4", { children: "Active Sessions" }), _jsx("p", { style: { fontSize: '24px', fontWeight: 'bold', margin: '8px 0' }, children: "567" })] })] })] }) }), _jsx(Tabs.Item, { tabId: "analytics", label: "Analytics", children: _jsxs("div", { children: [_jsx("h3", { children: "Analytics" }), _jsx("p", { children: "View detailed analytics and reports for your application." }), _jsxs("ul", { style: { marginTop: '16px' }, children: [_jsx("li", { children: "Page views" }), _jsx("li", { children: "User engagement" }), _jsx("li", { children: "Conversion rates" }), _jsx("li", { children: "Performance metrics" })] })] }) }), _jsx(Tabs.Item, { tabId: "settings", label: "Settings", children: _jsxs("div", { children: [_jsx("h3", { children: "Settings" }), _jsxs("form", { style: { marginTop: '16px' }, children: [_jsxs("div", { style: { marginBottom: '16px' }, children: [_jsx("label", { htmlFor: "theme", children: "Theme:" }), _jsxs("select", { id: "theme", style: { marginLeft: '8px', padding: '4px 8px' }, children: [_jsx("option", { children: "Light" }), _jsx("option", { children: "Dark" }), _jsx("option", { children: "Auto" })] })] }), _jsx("div", { style: { marginBottom: '16px' }, children: _jsxs("label", { children: [_jsx("input", { type: "checkbox", style: { marginRight: '8px' } }), "Enable notifications"] }) }), _jsx("button", { type: "submit", style: { padding: '8px 16px', backgroundColor: '#007bff', color: 'white', border: 'none', borderRadius: '4px' }, children: "Save Settings" })] })] }) })] })),
53
39
  };
54
- export const CustomStyling = {
40
+ // Many tabs
41
+ export const ManyTabs = {
55
42
  args: {
56
- defaultActiveTab: 'tab1',
57
- className: 'custom-tabs-container',
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" })] })),
58
44
  },
59
- render: (args) => (_jsxs("div", { children: [_jsx("style", { children: `
60
- .custom-tabs-container {
61
- border: 2px solid #e0e0e0;
62
- border-radius: 8px;
63
- padding: 16px;
64
- }
65
- .custom-tabs-container .ds-tabs__tab {
66
- border-radius: 4px;
67
- margin-right: 4px;
68
- }
69
- .custom-tabs-container .ds-tabs__tab--active {
70
- background-color: #f0f8ff;
71
- }
72
- ` }), _jsxs(Tabs, { ...args, children: [_jsx(Tabs.Item, { tabId: "tab1", label: "Styled Tab 1", children: _jsxs("div", { children: [_jsx("h3", { children: "Custom Styled Tab" }), _jsx("p", { children: "This tab has custom styling applied to the container." })] }) }), _jsx(Tabs.Item, { tabId: "tab2", label: "Styled Tab 2", children: _jsxs("div", { children: [_jsx("h3", { children: "Another Custom Tab" }), _jsx("p", { children: "Notice the custom border and styling around the tabs container." })] }) })] })] })),
73
45
  };
74
46
  //# sourceMappingURL=Tabs.stories.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.stories.js","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.stories.tsx"],"names":[],"mappings":"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"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.test.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.test.tsx"],"names":[],"mappings":"AAIA,OAAO,kCAAkC,CAAC"}
1
+ {"version":3,"file":"Tabs.test.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.test.tsx"],"names":[],"mappings":"AAGA,OAAO,kCAAkC,CAAC"}
@@ -1,115 +1,108 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { expect, test, describe, vi } from "vitest";
3
- import { render, screen, fireEvent, waitFor } from '@testing-library/react';
4
- import userEvent from '@testing-library/user-event';
2
+ import { expect, test, describe, vi } from 'vitest';
5
3
  import { Tabs } from './Tabs';
4
+ import { render, screen, fireEvent } from '@testing-library/react';
6
5
  import '@testing-library/jest-dom/vitest';
7
- describe('Tabs Component', () => {
8
- test('renders tabs with default active tab', () => {
9
- render(_jsxs(Tabs, { defaultActiveTab: "tab1", children: [_jsx(Tabs.Item, { tabId: "tab1", label: "Tab 1", children: _jsx("div", { children: "Content 1" }) }), _jsx(Tabs.Item, { tabId: "tab2", label: "Tab 2", children: _jsx("div", { children: "Content 2" }) })] }));
10
- expect(screen.getByText('Tab 1')).toBeInTheDocument();
11
- expect(screen.getByText('Tab 2')).toBeInTheDocument();
12
- expect(screen.getByText('Content 1')).toBeInTheDocument();
13
- expect(screen.queryByText('Content 2')).not.toBeInTheDocument();
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');
14
13
  });
15
- test('switches active tab when clicked', async () => {
16
- const user = userEvent.setup();
17
- render(_jsxs(Tabs, { defaultActiveTab: "tab1", children: [_jsx(Tabs.Item, { tabId: "tab1", label: "Tab 1", children: _jsx("div", { children: "Content 1" }) }), _jsx(Tabs.Item, { tabId: "tab2", label: "Tab 2", children: _jsx("div", { children: "Content 2" }) })] }));
18
- const tab2Button = screen.getByText('Tab 2');
19
- await user.click(tab2Button);
20
- expect(screen.getByText('Content 2')).toBeInTheDocument();
21
- expect(screen.queryByText('Content 1')).not.toBeInTheDocument();
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();
22
19
  });
23
- test('calls onTabChange when tab is switched', async () => {
24
- const user = userEvent.setup();
25
- const onTabChange = vi.fn();
26
- render(_jsxs(Tabs, { defaultActiveTab: "tab1", onTabChange: onTabChange, children: [_jsx(Tabs.Item, { tabId: "tab1", label: "Tab 1", children: _jsx("div", { children: "Content 1" }) }), _jsx(Tabs.Item, { tabId: "tab2", label: "Tab 2", children: _jsx("div", { children: "Content 2" }) })] }));
27
- const tab2Button = screen.getByText('Tab 2');
28
- await user.click(tab2Button);
29
- expect(onTabChange).toHaveBeenCalledWith('tab2');
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');
30
24
  });
31
- test('handles keyboard navigation', async () => {
32
- const user = userEvent.setup();
33
- render(_jsxs(Tabs, { defaultActiveTab: "tab1", children: [_jsx(Tabs.Item, { tabId: "tab1", label: "Tab 1", children: _jsx("div", { children: "Content 1" }) }), _jsx(Tabs.Item, { tabId: "tab2", label: "Tab 2", children: _jsx("div", { children: "Content 2" }) })] }));
34
- const tab2Button = screen.getByText('Tab 2');
35
- tab2Button.focus();
36
- await user.keyboard('{Enter}');
37
- expect(screen.getByText('Content 2')).toBeInTheDocument();
38
- expect(screen.queryByText('Content 1')).not.toBeInTheDocument();
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');
39
29
  });
40
- test('handles space key navigation', async () => {
41
- const user = userEvent.setup();
42
- render(_jsxs(Tabs, { defaultActiveTab: "tab1", children: [_jsx(Tabs.Item, { tabId: "tab1", label: "Tab 1", children: _jsx("div", { children: "Content 1" }) }), _jsx(Tabs.Item, { tabId: "tab2", label: "Tab 2", children: _jsx("div", { children: "Content 2" }) })] }));
43
- const tab2Button = screen.getByText('Tab 2');
44
- tab2Button.focus();
45
- await user.keyboard(' ');
46
- expect(screen.getByText('Content 2')).toBeInTheDocument();
47
- expect(screen.queryByText('Content 1')).not.toBeInTheDocument();
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');
48
44
  });
49
- test('disabled tab does not respond to clicks', async () => {
50
- const user = userEvent.setup();
51
- const onTabChange = vi.fn();
52
- render(_jsxs(Tabs, { defaultActiveTab: "tab1", onTabChange: onTabChange, children: [_jsx(Tabs.Item, { tabId: "tab1", label: "Tab 1", children: _jsx("div", { children: "Content 1" }) }), _jsx(Tabs.Item, { tabId: "tab2", label: "Tab 2", disabled: true, children: _jsx("div", { children: "Content 2" }) })] }));
53
- const tab2Button = screen.getByText('Tab 2');
54
- await user.click(tab2Button);
55
- expect(onTabChange).not.toHaveBeenCalled();
56
- expect(screen.getByText('Content 1')).toBeInTheDocument();
57
- expect(screen.queryByText('Content 2')).not.toBeInTheDocument();
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');
58
53
  });
59
- test('disabled tab does not respond to keyboard events', async () => {
60
- const user = userEvent.setup();
61
- const onTabChange = vi.fn();
62
- render(_jsxs(Tabs, { defaultActiveTab: "tab1", onTabChange: onTabChange, children: [_jsx(Tabs.Item, { tabId: "tab1", label: "Tab 1", children: _jsx("div", { children: "Content 1" }) }), _jsx(Tabs.Item, { tabId: "tab2", label: "Tab 2", disabled: true, children: _jsx("div", { children: "Content 2" }) })] }));
63
- const tab2Button = screen.getByText('Tab 2');
64
- tab2Button.focus();
65
- await user.keyboard('{Enter}');
66
- expect(onTabChange).not.toHaveBeenCalled();
67
- expect(screen.getByText('Content 1')).toBeInTheDocument();
68
- expect(screen.queryByText('Content 2')).not.toBeInTheDocument();
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');
69
60
  });
70
- test('applies custom className to tabs container', () => {
71
- render(_jsx(Tabs, { className: "custom-tabs", children: _jsx(Tabs.Item, { tabId: "tab1", label: "Tab 1", children: _jsx("div", { children: "Content 1" }) }) }));
72
- const tabsContainer = screen.getByText('Tab 1').closest('.ds-tabs');
73
- expect(tabsContainer).toHaveClass('custom-tabs');
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');
74
65
  });
75
- test('applies custom className to tab item', () => {
76
- render(_jsx(Tabs, { children: _jsx(Tabs.Item, { tabId: "tab1", label: "Tab 1", className: "custom-tab-item", children: _jsx("div", { children: "Content 1" }) }) }));
77
- const tabItem = screen.getByText('Tab 1').closest('.ds-tabs__item');
78
- expect(tabItem).toHaveClass('custom-tab-item');
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);
79
71
  });
80
- test('has proper ARIA attributes', () => {
81
- render(_jsxs(Tabs, { defaultActiveTab: "tab1", children: [_jsx(Tabs.Item, { tabId: "tab1", label: "Tab 1", children: _jsx("div", { children: "Content 1" }) }), _jsx(Tabs.Item, { tabId: "tab2", label: "Tab 2", children: _jsx("div", { children: "Content 2" }) })] }));
82
- const tab1Button = screen.getByText('Tab 1');
83
- const tab2Button = screen.getByText('Tab 2');
84
- expect(tab1Button).toHaveAttribute('role', 'tab');
85
- expect(tab1Button).toHaveAttribute('aria-selected', 'true');
86
- expect(tab1Button).toHaveAttribute('aria-controls', 'tabpanel-tab1');
87
- expect(tab1Button).toHaveAttribute('id', 'tab-tab1');
88
- expect(tab2Button).toHaveAttribute('role', 'tab');
89
- expect(tab2Button).toHaveAttribute('aria-selected', 'false');
90
- expect(tab2Button).toHaveAttribute('aria-controls', 'tabpanel-tab2');
91
- expect(tab2Button).toHaveAttribute('id', 'tab-tab2');
92
- const contentPanel = screen.getByText('Content 1');
93
- expect(contentPanel).toHaveAttribute('role', 'tabpanel');
94
- expect(contentPanel).toHaveAttribute('id', 'tabpanel-tab1');
95
- expect(contentPanel).toHaveAttribute('aria-labelledby', 'tab-tab1');
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();
96
76
  });
97
- test('throws error when Tabs.Item is used outside Tabs context', () => {
98
- // Suppress console.error for this test since we expect an error
99
- const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
100
- expect(() => {
101
- render(_jsx(Tabs.Item, { tabId: "tab1", label: "Tab 1", children: _jsx("div", { children: "Content 1" }) }));
102
- }).toThrow('Tabs.Item must be used within a Tabs component');
103
- consoleSpy.mockRestore();
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');
104
87
  });
105
88
  test('renders multiple tabs correctly', () => {
106
- render(_jsxs(Tabs, { defaultActiveTab: "tab2", children: [_jsx(Tabs.Item, { tabId: "tab1", label: "First Tab", children: _jsx("div", { children: "First Content" }) }), _jsx(Tabs.Item, { tabId: "tab2", label: "Second Tab", children: _jsx("div", { children: "Second Content" }) }), _jsx(Tabs.Item, { tabId: "tab3", label: "Third Tab", children: _jsx("div", { children: "Third Content" }) })] }));
107
- expect(screen.getByText('First Tab')).toBeInTheDocument();
108
- expect(screen.getByText('Second Tab')).toBeInTheDocument();
109
- expect(screen.getByText('Third Tab')).toBeInTheDocument();
110
- expect(screen.getByText('Second Content')).toBeInTheDocument();
111
- expect(screen.queryByText('First Content')).not.toBeInTheDocument();
112
- expect(screen.queryByText('Third Content')).not.toBeInTheDocument();
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');
113
106
  });
114
107
  });
115
108
  //# sourceMappingURL=Tabs.test.js.map