@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
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { TabsItem } from './TabsItem';
3
+ import { Tabs } from './Tabs';
4
+ import { allowedIcons } from '../icon/allowedIcons';
5
+ const meta = {
6
+ title: 'Components/Tabs/TabsItem',
7
+ component: TabsItem,
8
+ decorators: [
9
+ Story => (_jsx(Tabs, { children: _jsx(Story, {}) })),
10
+ ],
11
+ parameters: {
12
+ layout: 'padded',
13
+ },
14
+ tags: ['autodocs'],
15
+ argTypes: {
16
+ active: {
17
+ control: 'boolean',
18
+ description: 'Whether the tab is active',
19
+ },
20
+ tabElement: {
21
+ control: 'select',
22
+ options: ['button', 'link'],
23
+ description: 'Element type for the tab',
24
+ },
25
+ iconName: {
26
+ control: 'select',
27
+ options: Object.keys(allowedIcons),
28
+ description: 'Icon to display before the text',
29
+ },
30
+ children: {
31
+ control: 'text',
32
+ description: 'Tab text content',
33
+ },
34
+ className: {
35
+ control: 'text',
36
+ description: 'Additional CSS classes',
37
+ },
38
+ },
39
+ };
40
+ export default meta;
41
+ // Basic button tab
42
+ export const Default = {
43
+ args: {
44
+ active: false,
45
+ children: 'Tab Item',
46
+ },
47
+ };
48
+ //# sourceMappingURL=TabsItem.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabsItem.stories.js","sourceRoot":"","sources":["../../../src/components/tabs/TabsItem.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,0BAA0B;IACjC,SAAS,EAAE,QAAQ;IACnB,UAAU,EAAE;QACV,KAAK,CAAC,EAAE,CAAC,CACP,KAAC,IAAI,cACH,KAAC,KAAK,KAAG,GACJ,CACR;KACF;IACD,UAAU,EAAE;QACV,MAAM,EAAE,QAAQ;KACjB;IACD,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,QAAQ,EAAE;QACR,MAAM,EAAE;YACN,OAAO,EAAE,SAAS;YAClB,WAAW,EAAE,2BAA2B;SACzC;QACD,UAAU,EAAE;YACV,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;YAC3B,WAAW,EAAE,0BAA0B;SACxC;QACD,QAAQ,EAAE;YACR,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;YAClC,WAAW,EAAE,iCAAiC;SAC/C;QACD,QAAQ,EAAE;YACR,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,kBAAkB;SAChC;QACD,SAAS,EAAE;YACT,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,wBAAwB;SACtC;KACF;CAC8B,CAAC;AAElC,eAAe,IAAI,CAAC;AAGpB,mBAAmB;AACnB,MAAM,CAAC,MAAM,OAAO,GAAU;IAC5B,IAAI,EAAE;QACJ,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,UAAU;KACrB;CACF,CAAC"}
package/dist/index.css CHANGED
@@ -696,6 +696,7 @@
696
696
  --tabs-tab-item-active-focussed-color-icon: #0e8a0e;
697
697
  --tabs-tab-item-active-focussed-color-line: #0e8a0e;
698
698
  --tabs-tab-item-active-focussed-focus: #3cad51;
699
+ --tabs-tab-item-radius: 0.5rem;
699
700
  --tabs-tab-item-inactive-default-color-text: #2f2f2f;
700
701
  --tabs-tab-item-inactive-default-color-icon: #2f2f2f;
701
702
  --tabs-tab-item-inactive-hover-color-line: #d1d1d1;
@@ -1662,4 +1663,59 @@ h4.ds-heading {
1662
1663
  background: var(--tag-category-yellow-color-background);
1663
1664
  }
1664
1665
 
1666
+ .ds-tabs {
1667
+ display: flex;
1668
+ width: 100%;
1669
+ list-style: none;
1670
+ padding: 0;
1671
+ margin: 0;
1672
+ font-family: var(--font-family-standard);
1673
+ align-items: center;
1674
+ justify-content: center;
1675
+ }
1676
+
1677
+ .ds-tabs-item {
1678
+ margin: 0;
1679
+ padding: 0;
1680
+ }
1681
+
1682
+ .ds-tabs-item__tab {
1683
+ font-family: var(--font-family-standard);
1684
+ padding: var(--tabs-tab-item-spacing-y) var(--tabs-tab-item-spacing-x);
1685
+ cursor: pointer;
1686
+ display: flex;
1687
+ align-items: center;
1688
+ justify-content: center;
1689
+ background-color: transparent;
1690
+ border: none;
1691
+ text-decoration: none;
1692
+ color: var(--tabs-tab-item-inactive-default-color-text);
1693
+ line-height: 150%;
1694
+ font-size: var(--font-size-3-14);
1695
+ border-bottom: 2px solid transparent;
1696
+ box-sizing: border-box;
1697
+ gap: var(--tabs-tab-item-spacing-gap-x);
1698
+ }
1699
+ .ds-tabs-item__tab:hover {
1700
+ color: var(--tabs-tab-item-inactive-hover-color-text);
1701
+ border-bottom: 2px solid var(--tabs-tab-item-inactive-hover-color-line);
1702
+ }
1703
+ .ds-tabs-item__tab:focus {
1704
+ color: var(--tabs-tab-item-inactive-focussed-color-text);
1705
+ outline: 2px solid var(--tabs-tab-item-inactive-focussed-color-focus);
1706
+ border-radius: var(--tabs-tab-item-radius);
1707
+ }
1708
+ .ds-tabs-item__tab--active {
1709
+ color: var(--tabs-tab-item-active-default-color-text);
1710
+ border-bottom: 2px solid var(--tabs-tab-item-active-default-color-line);
1711
+ }
1712
+ .ds-tabs-item__tab--active:hover {
1713
+ color: var(--tabs-tab-item-active-default-color-text);
1714
+ border-bottom: 2px solid var(--tabs-tab-item-active-default-color-line);
1715
+ }
1716
+ .ds-tabs-item__tab--active:focus {
1717
+ color: var(--tabs-tab-item-active-default-color-text);
1718
+ outline: 2px solid var(--tabs-tab-item-active-color-focus);
1719
+ }
1720
+
1665
1721
  /*# sourceMappingURL=index.css.map */
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../src/index.scss","../src/tokens.scss","../src/global.scss","../src/components/button/button.scss","../src/components/heading/heading.scss","../src/components/card/card.scss","../src/components/formField/formField.scss","../src/components/formField/inputs/input.scss","../src/components/formField/label/label.scss","../src/components/pill/pill.scss"],"names":[],"mappings":"AASQ;ACTR;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACluCF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AChBF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAIF;EACE;;AAGF;EACE;;AAIF;EACE;EACA;;AAKF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;;AClLJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAKF;EACE;EACA;EACA;;;AAKF;EACE;EACA;EACA;;;AAKF;EACE;EACA;EACA;;;AAKF;EACE;EACA;EACA;;;AC7CJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAIF;EACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAIJ;EACE;;;ACjEJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;;AAIJ;EACE;;AAEA;EACE;EACA;;;AClCR;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAIJ;EACE;EACA;;AAIF;EACE;EACA;;AAGF;EACE;EACA;;AAIF;EACE;;AAEA;EACE;EACA;;AAGF;EACE;;;AAKN;EACE;;;ACzEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;ACPF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA","file":"index.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../src/index.scss","../src/tokens.scss","../src/global.scss","../src/components/button/button.scss","../src/components/heading/heading.scss","../src/components/card/card.scss","../src/components/formField/formField.scss","../src/components/formField/inputs/input.scss","../src/components/formField/label/label.scss","../src/components/pill/pill.scss","../src/components/tabs/tabs.scss"],"names":[],"mappings":"AAUQ;ACVR;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACnuCF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AChBF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAIF;EACE;;AAGF;EACE;;AAIF;EACE;EACA;;AAKF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;;;AClLJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAKF;EACE;EACA;EACA;;;AAKF;EACE;EACA;EACA;;;AAKF;EACE;EACA;EACA;;;AAKF;EACE;EACA;EACA;;;AC7CJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAIF;EACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAIJ;EACE;;;ACjEJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;;AAIJ;EACE;;AAEA;EACE;EACA;;;AClCR;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAIJ;EACE;EACA;;AAIF;EACE;EACA;;AAGF;EACE;EACA;;AAIF;EACE;;AAEA;EACE;EACA;;AAGF;EACE;;;AAKN;EACE;;;ACzEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;ACPF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;;AChDJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACI;EACA;EACA;EACF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;AAGF;EACI;EACF","file":"index.css"}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export { HeadingInnerContainer } from './components/heading/HeadingInnerContaine
4
4
  export { Icon } from './components/icon/Icon';
5
5
  export { Card } from './components/card/Card';
6
6
  export { Pill } from './components/pill/Pill';
7
+ export { Tabs } from './components/tabs/Tabs';
7
8
  export { TextInput } from './components/formField/inputs/text/TextInput';
8
9
  export { TextArea } from './components/formField/inputs/textArea/TextArea';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,8CAA8C,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,iDAAiD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,8CAA8C,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,iDAAiD,CAAC"}
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@ export { HeadingInnerContainer } from './components/heading/HeadingInnerContaine
4
4
  export { Icon } from './components/icon/Icon';
5
5
  export { Card } from './components/card/Card';
6
6
  export { Pill } from './components/pill/Pill';
7
+ export { Tabs } from './components/tabs/Tabs';
7
8
  export { TextInput } from './components/formField/inputs/text/TextInput';
8
9
  export { TextArea } from './components/formField/inputs/textArea/TextArea';
9
10
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,8CAA8C,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,iDAAiD,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,8CAA8C,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,iDAAiD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbor-education/design-system.components",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "The component library for the design system (the baby)",
5
5
  "main": "dist/index.js",
6
6
  "repository": {
@@ -1,5 +1,6 @@
1
1
  import type { Meta } from '@storybook/react-vite';
2
2
  import { Icon } from './Icon';
3
+ import { allowedIcons } from './allowedIcons';
3
4
 
4
5
  const meta: Meta<typeof Icon> = {
5
6
  title: 'Components/Icon',
@@ -11,6 +12,13 @@ export const Default = {
11
12
  name: '3-dot',
12
13
  size: 16,
13
14
  },
15
+ argTypes: {
16
+ name: {
17
+ control: 'select',
18
+ description: 'Icon name',
19
+ options: Object.keys(allowedIcons),
20
+ },
21
+ },
14
22
  };
15
23
 
16
24
  export default meta;
@@ -0,0 +1,92 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { Tabs } from './Tabs';
3
+
4
+ const meta = {
5
+ title: 'Components/Tabs',
6
+ component: Tabs,
7
+ parameters: {
8
+ layout: 'padded',
9
+ },
10
+ tags: ['autodocs'],
11
+ argTypes: {
12
+ children: {
13
+ control: false,
14
+ description: 'Tab items to display',
15
+ },
16
+ className: {
17
+ control: 'text',
18
+ description: 'Additional CSS classes',
19
+ },
20
+ },
21
+ } satisfies Meta<typeof Tabs>;
22
+
23
+ export default meta;
24
+ type Story = StoryObj<typeof meta>;
25
+
26
+ // Basic tabs with buttons
27
+ export const Default: Story = {
28
+ args: {
29
+ children: (
30
+ <>
31
+ <Tabs.Item active>Overview</Tabs.Item>
32
+ <Tabs.Item>Details</Tabs.Item>
33
+ <Tabs.Item>Settings</Tabs.Item>
34
+ </>
35
+ ),
36
+ },
37
+ };
38
+
39
+ // Tabs with links
40
+ export const WithLinks: Story = {
41
+ args: {
42
+ children: (
43
+ <>
44
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '#overview' }} active>
45
+ Overview
46
+ </Tabs.Item>
47
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '#details' }}>
48
+ Details
49
+ </Tabs.Item>
50
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '#settings' }}>
51
+ Settings
52
+ </Tabs.Item>
53
+ </>
54
+ ),
55
+ },
56
+ };
57
+
58
+ // Mixed tabs (buttons and links)
59
+ export const Mixed: Story = {
60
+ args: {
61
+ children: (
62
+ <>
63
+ <Tabs.Item active>Home</Tabs.Item>
64
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '#about' }}>
65
+ About
66
+ </Tabs.Item>
67
+ <Tabs.Item>Contact</Tabs.Item>
68
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '#help' }}>
69
+ Help
70
+ </Tabs.Item>
71
+ </>
72
+ ),
73
+ },
74
+ };
75
+
76
+ // Many tabs
77
+ export const ManyTabs: Story = {
78
+ args: {
79
+ children: (
80
+ <>
81
+ <Tabs.Item active iconName="list">Tab 1</Tabs.Item>
82
+ <Tabs.Item iconName="list">Tab 2</Tabs.Item>
83
+ <Tabs.Item iconName="list">Tab 3</Tabs.Item>
84
+ <Tabs.Item iconName="list">Tab 4</Tabs.Item>
85
+ <Tabs.Item iconName="list">Tab 5</Tabs.Item>
86
+ <Tabs.Item iconName="list">Tab 6</Tabs.Item>
87
+ <Tabs.Item iconName="list">Tab 7</Tabs.Item>
88
+ <Tabs.Item iconName="list">Tab 8</Tabs.Item>
89
+ </>
90
+ ),
91
+ },
92
+ };
@@ -0,0 +1,220 @@
1
+ import { expect, test, describe, vi } from 'vitest';
2
+ import { Tabs } from './Tabs';
3
+ import { render, screen, fireEvent } from '@testing-library/react';
4
+ import '@testing-library/jest-dom/vitest';
5
+
6
+ describe('Tabs component', () => {
7
+ test('renders tabs container with correct role', () => {
8
+ render(
9
+ <Tabs>
10
+ <Tabs.Item>Tab 1</Tabs.Item>
11
+ <Tabs.Item>Tab 2</Tabs.Item>
12
+ </Tabs>,
13
+ );
14
+
15
+ const tabsContainer = screen.getByRole('tablist');
16
+ expect(tabsContainer).toBeInTheDocument();
17
+ expect(tabsContainer.tagName).toBe('UL');
18
+ expect(tabsContainer).toHaveClass('ds-tabs');
19
+ });
20
+
21
+ test('renders children correctly', () => {
22
+ render(
23
+ <Tabs>
24
+ <Tabs.Item>Overview</Tabs.Item>
25
+ <Tabs.Item>Details</Tabs.Item>
26
+ <Tabs.Item>Settings</Tabs.Item>
27
+ </Tabs>,
28
+ );
29
+
30
+ expect(screen.getByText('Overview')).toBeInTheDocument();
31
+ expect(screen.getByText('Details')).toBeInTheDocument();
32
+ expect(screen.getByText('Settings')).toBeInTheDocument();
33
+ });
34
+
35
+ test('applies custom className', () => {
36
+ render(
37
+ <Tabs className="custom-tabs">
38
+ <Tabs.Item>Tab 1</Tabs.Item>
39
+ </Tabs>,
40
+ );
41
+
42
+ const tabsContainer = screen.getByRole('tablist');
43
+ expect(tabsContainer).toHaveClass('ds-tabs', 'custom-tabs');
44
+ });
45
+
46
+ test('passes through additional props', () => {
47
+ render(
48
+ <Tabs data-testid="tabs-container" aria-label="Navigation tabs">
49
+ <Tabs.Item>Tab 1</Tabs.Item>
50
+ </Tabs>,
51
+ );
52
+
53
+ const tabsContainer = screen.getByTestId('tabs-container');
54
+ expect(tabsContainer).toHaveAttribute('aria-label', 'Navigation tabs');
55
+ });
56
+ });
57
+
58
+ describe('TabsItem component', () => {
59
+ test('renders as button by default', () => {
60
+ render(
61
+ <Tabs>
62
+ <Tabs.Item>Tab Button</Tabs.Item>
63
+ </Tabs>,
64
+ );
65
+
66
+ const tabButton = screen.getByRole('tab');
67
+ expect(tabButton.tagName).toBe('BUTTON');
68
+ expect(tabButton).toHaveTextContent('Tab Button');
69
+ });
70
+
71
+ test('renders as link when tabElement is link', () => {
72
+ render(
73
+ <Tabs>
74
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '#overview' }}>
75
+ Overview Link
76
+ </Tabs.Item>
77
+ </Tabs>,
78
+ );
79
+
80
+ const tabLink = screen.getByRole('tab');
81
+ expect(tabLink.tagName).toBe('A');
82
+ expect(tabLink).toHaveAttribute('href', '#overview');
83
+ expect(tabLink).toHaveTextContent('Overview Link');
84
+ });
85
+
86
+ test('applies active state correctly', () => {
87
+ render(
88
+ <Tabs>
89
+ <Tabs.Item active>Active Tab</Tabs.Item>
90
+ <Tabs.Item>Inactive Tab</Tabs.Item>
91
+ </Tabs>,
92
+ );
93
+
94
+ const activeTab = screen.getByText('Active Tab');
95
+ const inactiveTab = screen.getByText('Inactive Tab');
96
+
97
+ expect(activeTab).toHaveClass('ds-tabs-item__tab--active');
98
+ expect(activeTab).toHaveAttribute('aria-selected', 'true');
99
+
100
+ expect(inactiveTab).not.toHaveClass('ds-tabs-item__tab--active');
101
+ expect(inactiveTab).toHaveAttribute('aria-selected', 'false');
102
+ });
103
+
104
+ test('applies correct CSS classes', () => {
105
+ render(
106
+ <Tabs>
107
+ <Tabs.Item>Tab Item</Tabs.Item>
108
+ </Tabs>,
109
+ );
110
+
111
+ const listItem = screen.getByRole('presentation');
112
+ const tabElement = screen.getByRole('tab');
113
+
114
+ expect(listItem).toHaveClass('ds-tabs-item');
115
+ expect(tabElement).toHaveClass('ds-tabs-item__tab');
116
+ });
117
+
118
+ test('applies custom className to list item', () => {
119
+ render(
120
+ <Tabs>
121
+ <Tabs.Item className="custom-tab-item">Tab Item</Tabs.Item>
122
+ </Tabs>,
123
+ );
124
+
125
+ const listItem = screen.getByRole('presentation');
126
+ expect(listItem).toHaveClass('ds-tabs-item', 'custom-tab-item');
127
+ });
128
+
129
+ test('handles click events on button tabs', () => {
130
+ const handleClick = vi.fn();
131
+ render(
132
+ <Tabs>
133
+ <Tabs.Item tabElementProps={{ onClick: handleClick }}>
134
+ Clickable Tab
135
+ </Tabs.Item>
136
+ </Tabs>,
137
+ );
138
+
139
+ fireEvent.click(screen.getByRole('tab'));
140
+ expect(handleClick).toHaveBeenCalledTimes(1);
141
+ });
142
+
143
+ test('passes through additional props to button', () => {
144
+ render(
145
+ <Tabs>
146
+ {/* @ts-expect-error - data-testid is not a valid prop for ButtonHTMLAttributes */}
147
+ <Tabs.Item tabElementProps={{ 'disabled': true, 'data-testid': 'tab-button' }}>
148
+ Disabled Tab
149
+ </Tabs.Item>
150
+ </Tabs>,
151
+ );
152
+
153
+ const tabButton = screen.getByTestId('tab-button');
154
+ expect(tabButton).toBeDisabled();
155
+ });
156
+
157
+ test('passes through additional props to link', () => {
158
+ render(
159
+ <Tabs>
160
+ <Tabs.Item
161
+ tabElement="link"
162
+ tabElementProps={{
163
+ 'href': '#test',
164
+ 'target': '_blank',
165
+ // @ts-expect-error - data-testid is not a valid prop for AnchorHTMLAttributes
166
+ 'data-testid': 'tab-link',
167
+ }}
168
+ >
169
+ Link Tab
170
+ </Tabs.Item>
171
+ </Tabs>,
172
+ );
173
+
174
+ const tabLink = screen.getByTestId('tab-link');
175
+ expect(tabLink).toHaveAttribute('href', '#test');
176
+ expect(tabLink).toHaveAttribute('target', '_blank');
177
+ });
178
+
179
+ test('renders multiple tabs correctly', () => {
180
+ render(
181
+ <Tabs>
182
+ <Tabs.Item active>Tab 1</Tabs.Item>
183
+ <Tabs.Item>Tab 2</Tabs.Item>
184
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '#tab3' }}>
185
+ Tab 3
186
+ </Tabs.Item>
187
+ </Tabs>,
188
+ );
189
+
190
+ const tabs = screen.getAllByRole('tab');
191
+ expect(tabs).toHaveLength(3);
192
+
193
+ expect(tabs[0]).toHaveTextContent('Tab 1');
194
+ expect(tabs[0]).toHaveAttribute('aria-selected', 'true');
195
+
196
+ expect(tabs[1]).toHaveTextContent('Tab 2');
197
+ expect(tabs[1]).toHaveAttribute('aria-selected', 'false');
198
+
199
+ expect(tabs[2]).toHaveTextContent('Tab 3');
200
+ expect(tabs[2]).toHaveAttribute('href', '#tab3');
201
+ });
202
+
203
+ test('handles mixed tab types', () => {
204
+ render(
205
+ <Tabs>
206
+ <Tabs.Item active>Button Tab</Tabs.Item>
207
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '#link-tab' }}>
208
+ Link Tab
209
+ </Tabs.Item>
210
+ </Tabs>,
211
+ );
212
+
213
+ const buttonTab = screen.getByText('Button Tab');
214
+ const linkTab = screen.getByText('Link Tab');
215
+
216
+ expect(buttonTab.tagName).toBe('BUTTON');
217
+ expect(linkTab.tagName).toBe('A');
218
+ expect(linkTab).toHaveAttribute('href', '#link-tab');
219
+ });
220
+ });
@@ -0,0 +1,14 @@
1
+ import classNames from 'classnames';
2
+ import { type HTMLAttributes } from 'react';
3
+ import { TabsItem } from './TabsItem';
4
+
5
+ export const Tabs = (props: HTMLAttributes<HTMLUListElement> & { children: React.ReactNode }) => {
6
+ const { children, className, ...rest } = props;
7
+ return (
8
+ <ul role="tablist" className={classNames('ds-tabs', className)} {...rest}>
9
+ {children}
10
+ </ul>
11
+ );
12
+ };
13
+
14
+ Tabs.Item = TabsItem;
@@ -0,0 +1,55 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { TabsItem } from './TabsItem';
3
+ import { Tabs } from './Tabs';
4
+ import { allowedIcons } from 'Components/icon/allowedIcons';
5
+
6
+ const meta = {
7
+ title: 'Components/Tabs/TabsItem',
8
+ component: TabsItem,
9
+ decorators: [
10
+ Story => (
11
+ <Tabs>
12
+ <Story />
13
+ </Tabs>
14
+ ),
15
+ ],
16
+ parameters: {
17
+ layout: 'padded',
18
+ },
19
+ tags: ['autodocs'],
20
+ argTypes: {
21
+ active: {
22
+ control: 'boolean',
23
+ description: 'Whether the tab is active',
24
+ },
25
+ tabElement: {
26
+ control: 'select',
27
+ options: ['button', 'link'],
28
+ description: 'Element type for the tab',
29
+ },
30
+ iconName: {
31
+ control: 'select',
32
+ options: Object.keys(allowedIcons),
33
+ description: 'Icon to display before the text',
34
+ },
35
+ children: {
36
+ control: 'text',
37
+ description: 'Tab text content',
38
+ },
39
+ className: {
40
+ control: 'text',
41
+ description: 'Additional CSS classes',
42
+ },
43
+ },
44
+ } satisfies Meta<typeof TabsItem>;
45
+
46
+ export default meta;
47
+ type Story = StoryObj<typeof meta>;
48
+
49
+ // Basic button tab
50
+ export const Default: Story = {
51
+ args: {
52
+ active: false,
53
+ children: 'Tab Item',
54
+ },
55
+ };
@@ -0,0 +1,42 @@
1
+ import classNames from 'classnames';
2
+ import type { allowedIcons } from 'Components/icon/allowedIcons';
3
+ import { Icon } from 'Components/icon/Icon';
4
+ import type { AnchorHTMLAttributes, ButtonHTMLAttributes, HTMLAttributes } from 'react';
5
+
6
+ type TabsItemProps = {
7
+ active?: boolean;
8
+ iconName?: keyof typeof allowedIcons;
9
+ } & (
10
+ | { tabElement?: 'button'; tabElementProps?: ButtonHTMLAttributes<HTMLButtonElement> }
11
+ | { tabElement?: 'link'; tabElementProps?: AnchorHTMLAttributes<HTMLAnchorElement> }
12
+ ) & HTMLAttributes<HTMLLIElement>;
13
+
14
+ export const TabsItem = (props: TabsItemProps) => {
15
+ const { children, className, tabElement = 'button', tabElementProps, active = false, iconName, ...rest } = props;
16
+
17
+ const elementClassNames = classNames('ds-tabs-item__tab', {
18
+ 'ds-tabs-item__tab--active': active,
19
+ });
20
+ const sharedProps = {
21
+ 'role': 'tab',
22
+ 'className': elementClassNames,
23
+ 'aria-selected': active,
24
+ };
25
+ return (
26
+ <li role="presentation" className={classNames('ds-tabs-item', className)} {...rest}>
27
+ {tabElement === 'button'
28
+ ? (
29
+ <button {...(tabElementProps as ButtonHTMLAttributes<HTMLButtonElement>)} {...sharedProps}>
30
+ {iconName && <Icon name={iconName} size={16} />}
31
+ {children}
32
+ </button>
33
+ )
34
+ : (
35
+ <a {...(tabElementProps as AnchorHTMLAttributes<HTMLAnchorElement>)} {...sharedProps}>
36
+ {iconName && <Icon name={iconName} size={16} />}
37
+ {children}
38
+ </a>
39
+ )}
40
+ </li>
41
+ );
42
+ };