@node-core/ui-components 0.0.1 → 1.0.1-0bb5d49b96e1f11e1ef6cf965861929693053ca6

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 (184) hide show
  1. package/Common/AlertBox/index.module.css +76 -0
  2. package/Common/AlertBox/index.stories.tsx +73 -0
  3. package/Common/AlertBox/index.tsx +24 -0
  4. package/Common/AvatarGroup/Avatar/index.module.css +40 -0
  5. package/Common/AvatarGroup/Avatar/index.stories.tsx +22 -0
  6. package/Common/AvatarGroup/Avatar/index.tsx +67 -0
  7. package/Common/AvatarGroup/Overlay/index.module.css +31 -0
  8. package/Common/AvatarGroup/Overlay/index.stories.tsx +33 -0
  9. package/Common/AvatarGroup/Overlay/index.tsx +37 -0
  10. package/Common/AvatarGroup/__tests__/index.test.jsx +55 -0
  11. package/Common/AvatarGroup/index.module.css +21 -0
  12. package/Common/AvatarGroup/index.stories.tsx +56 -0
  13. package/Common/AvatarGroup/index.tsx +83 -0
  14. package/Common/Badge/index.module.css +38 -0
  15. package/Common/Badge/index.stories.tsx +38 -0
  16. package/Common/Badge/index.tsx +35 -0
  17. package/Common/BadgeGroup/index.module.css +77 -0
  18. package/Common/BadgeGroup/index.stories.tsx +35 -0
  19. package/Common/BadgeGroup/index.tsx +35 -0
  20. package/Common/Banner/index.module.css +42 -0
  21. package/Common/Banner/index.stories.tsx +29 -0
  22. package/Common/Banner/index.tsx +18 -0
  23. package/Common/BaseActiveLink/__tests__/index.test.jsx +52 -0
  24. package/Common/BaseActiveLink/index.tsx +34 -0
  25. package/Common/BaseButton/index.module.css +142 -0
  26. package/Common/BaseButton/index.stories.tsx +67 -0
  27. package/Common/BaseButton/index.tsx +59 -0
  28. package/Common/BaseCodeBox/index.module.css +78 -0
  29. package/Common/BaseCodeBox/index.stories.tsx +39 -0
  30. package/Common/BaseCodeBox/index.tsx +122 -0
  31. package/Common/BaseCrossLink/index.module.css +51 -0
  32. package/Common/BaseCrossLink/index.stories.tsx +38 -0
  33. package/Common/BaseCrossLink/index.tsx +46 -0
  34. package/Common/BaseLinkTabs/index.module.css +43 -0
  35. package/Common/BaseLinkTabs/index.stories.tsx +34 -0
  36. package/Common/BaseLinkTabs/index.tsx +53 -0
  37. package/Common/BasePagination/Ellipsis/index.module.css +10 -0
  38. package/Common/BasePagination/Ellipsis/index.stories.tsx +10 -0
  39. package/Common/BasePagination/Ellipsis/index.tsx +11 -0
  40. package/Common/BasePagination/PaginationListItem/__tests__/index.test.jsx +58 -0
  41. package/Common/BasePagination/PaginationListItem/index.module.css +27 -0
  42. package/Common/BasePagination/PaginationListItem/index.stories.tsx +40 -0
  43. package/Common/BasePagination/PaginationListItem/index.tsx +39 -0
  44. package/Common/BasePagination/PrevNextArrow.tsx +15 -0
  45. package/Common/BasePagination/__tests__/index.test.jsx +180 -0
  46. package/Common/BasePagination/index.module.css +39 -0
  47. package/Common/BasePagination/index.stories.tsx +67 -0
  48. package/Common/BasePagination/index.tsx +77 -0
  49. package/Common/BasePagination/useGetPageElements.tsx +132 -0
  50. package/Common/Blockquote/index.module.css +29 -0
  51. package/Common/Blockquote/index.stories.tsx +45 -0
  52. package/Common/Blockquote/index.tsx +11 -0
  53. package/Common/Breadcrumbs/BreadcrumbHomeLink/index.module.css +5 -0
  54. package/Common/Breadcrumbs/BreadcrumbHomeLink/index.tsx +30 -0
  55. package/Common/Breadcrumbs/BreadcrumbItem/index.module.css +41 -0
  56. package/Common/Breadcrumbs/BreadcrumbItem/index.tsx +42 -0
  57. package/Common/Breadcrumbs/BreadcrumbLink/index.module.css +22 -0
  58. package/Common/Breadcrumbs/BreadcrumbLink/index.tsx +37 -0
  59. package/Common/Breadcrumbs/BreadcrumbRoot/index.module.css +9 -0
  60. package/Common/Breadcrumbs/BreadcrumbRoot/index.tsx +20 -0
  61. package/Common/Breadcrumbs/BreadcrumbTruncatedItem/index.tsx +9 -0
  62. package/Common/Breadcrumbs/index.stories.tsx +94 -0
  63. package/Common/Breadcrumbs/index.tsx +81 -0
  64. package/Common/CodeTabs/index.module.css +56 -0
  65. package/Common/CodeTabs/index.stories.tsx +73 -0
  66. package/Common/CodeTabs/index.tsx +16 -0
  67. package/Common/DataTag/index.module.css +56 -0
  68. package/Common/DataTag/index.stories.tsx +40 -0
  69. package/Common/DataTag/index.tsx +39 -0
  70. package/Common/GlowingBackdrop/index.module.css +32 -0
  71. package/Common/GlowingBackdrop/index.stories.tsx +10 -0
  72. package/Common/GlowingBackdrop/index.tsx +13 -0
  73. package/Common/LanguageDropDown/index.module.css +53 -0
  74. package/Common/LanguageDropDown/index.stories.tsx +19 -0
  75. package/Common/LanguageDropDown/index.tsx +56 -0
  76. package/Common/Modal/index.module.css +79 -0
  77. package/Common/Modal/index.stories.tsx +32 -0
  78. package/Common/Modal/index.tsx +48 -0
  79. package/Common/NodejsLogo/index.module.css +6 -0
  80. package/Common/NodejsLogo/index.stories.tsx +14 -0
  81. package/Common/NodejsLogo/index.tsx +26 -0
  82. package/Common/Notification/index.module.css +20 -0
  83. package/Common/Notification/index.stories.tsx +36 -0
  84. package/Common/Notification/index.tsx +34 -0
  85. package/Common/Preview/index.module.css +79 -0
  86. package/Common/Preview/index.stories.tsx +44 -0
  87. package/Common/Preview/index.tsx +25 -0
  88. package/Common/Select/__tests__/index.test.jsx +67 -0
  89. package/Common/Select/index.module.css +161 -0
  90. package/Common/Select/index.stories.tsx +111 -0
  91. package/Common/Select/index.tsx +187 -0
  92. package/Common/Separator/index.module.css +16 -0
  93. package/Common/Separator/index.stories.tsx +32 -0
  94. package/Common/Separator/index.tsx +27 -0
  95. package/Common/Skeleton/index.module.css +30 -0
  96. package/Common/Skeleton/index.tsx +39 -0
  97. package/Common/Tabs/__tests__/index.test.jsx +52 -0
  98. package/Common/Tabs/index.module.css +54 -0
  99. package/Common/Tabs/index.stories.tsx +50 -0
  100. package/Common/Tabs/index.tsx +54 -0
  101. package/Common/ThemeToggle/__tests__/index.test.jsx +35 -0
  102. package/Common/ThemeToggle/index.module.css +15 -0
  103. package/Common/ThemeToggle/index.stories.tsx +10 -0
  104. package/Common/ThemeToggle/index.tsx +15 -0
  105. package/Common/Tooltip/index.module.css +43 -0
  106. package/Common/Tooltip/index.stories.tsx +73 -0
  107. package/Common/Tooltip/index.tsx +48 -0
  108. package/Containers/Article/index.module.css +70 -0
  109. package/Containers/Article/index.stories.tsx +39 -0
  110. package/Containers/Article/index.tsx +9 -0
  111. package/Containers/DocSideBar/index.tsx +0 -0
  112. package/Containers/Footer/index.module.css +46 -0
  113. package/Containers/Footer/index.stories.tsx +27 -0
  114. package/Containers/Footer/index.tsx +95 -0
  115. package/Containers/MetaBar/__tests__/index.test.jsx +63 -0
  116. package/Containers/MetaBar/index.module.css +91 -0
  117. package/Containers/MetaBar/index.stories.tsx +80 -0
  118. package/Containers/MetaBar/index.tsx +72 -0
  119. package/Containers/NavBar/NavItem/index.module.css +60 -0
  120. package/Containers/NavBar/NavItem/index.stories.tsx +38 -0
  121. package/Containers/NavBar/NavItem/index.tsx +44 -0
  122. package/Containers/NavBar/index.module.css +125 -0
  123. package/Containers/NavBar/index.stories.tsx +45 -0
  124. package/Containers/NavBar/index.tsx +94 -0
  125. package/Containers/Sidebar/ProgressionIcon/index.tsx +16 -0
  126. package/Containers/Sidebar/SidebarGroup/index.module.css +64 -0
  127. package/Containers/Sidebar/SidebarGroup/index.stories.tsx +36 -0
  128. package/Containers/Sidebar/SidebarGroup/index.tsx +44 -0
  129. package/Containers/Sidebar/SidebarItem/index.module.css +56 -0
  130. package/Containers/Sidebar/SidebarItem/index.stories.tsx +15 -0
  131. package/Containers/Sidebar/SidebarItem/index.tsx +43 -0
  132. package/Containers/Sidebar/index.module.css +30 -0
  133. package/Containers/Sidebar/index.stories.tsx +88 -0
  134. package/Containers/Sidebar/index.tsx +65 -0
  135. package/Icons/HexagonGrid.stories.tsx +10 -0
  136. package/Icons/HexagonGrid.tsx +1434 -0
  137. package/Icons/InstallationMethod/Choco.tsx +78 -0
  138. package/Icons/InstallationMethod/Devbox.tsx +21 -0
  139. package/Icons/InstallationMethod/Docker.tsx +20 -0
  140. package/Icons/InstallationMethod/FNM.tsx +132 -0
  141. package/Icons/InstallationMethod/Homebrew.tsx +69 -0
  142. package/Icons/InstallationMethod/N.tsx +32 -0
  143. package/Icons/InstallationMethod/NVM.tsx +63 -0
  144. package/Icons/InstallationMethod/Volta.tsx +34 -0
  145. package/Icons/InstallationMethod/index.ts +10 -0
  146. package/Icons/Logos/JsGreen.tsx +24 -0
  147. package/Icons/Logos/JsWhite.tsx +37 -0
  148. package/Icons/Logos/Nodejs.tsx +188 -0
  149. package/Icons/Logos/NodejsStackedBlack.tsx +98 -0
  150. package/Icons/Logos/NodejsStackedDark.tsx +124 -0
  151. package/Icons/Logos/NodejsStackedLight.tsx +123 -0
  152. package/Icons/Logos/NodejsStackedWhite.tsx +98 -0
  153. package/Icons/Logos/index.ts +17 -0
  154. package/Icons/OperatingSystem/AIX.tsx +46 -0
  155. package/Icons/OperatingSystem/Apple.tsx +23 -0
  156. package/Icons/OperatingSystem/Linux.tsx +969 -0
  157. package/Icons/OperatingSystem/Microsoft.tsx +19 -0
  158. package/Icons/OperatingSystem/index.ts +6 -0
  159. package/Icons/PackageManager/Npm.tsx +21 -0
  160. package/Icons/PackageManager/Pnpm.tsx +22 -0
  161. package/Icons/PackageManager/Yarn.tsx +22 -0
  162. package/Icons/PackageManager/index.ts +5 -0
  163. package/Icons/Social/Bluesky.tsx +19 -0
  164. package/Icons/Social/Discord.tsx +20 -0
  165. package/Icons/Social/GitHub.tsx +16 -0
  166. package/Icons/Social/LinkedIn.tsx +16 -0
  167. package/Icons/Social/Mastodon.tsx +36 -0
  168. package/Icons/Social/Slack.tsx +31 -0
  169. package/Icons/Social/X.tsx +16 -0
  170. package/Icons/Social/index.ts +9 -0
  171. package/LICENSE +21 -0
  172. package/MDX/CodeTabs.tsx +47 -0
  173. package/package.json +87 -5
  174. package/stylelint/__tests__/index.test.mjs +80 -0
  175. package/stylelint/one-utility-class-per-line.mjs +64 -0
  176. package/stylelint/utils.mjs +53 -0
  177. package/styles/animations.css +47 -0
  178. package/styles/base.css +17 -0
  179. package/styles/effects.css +12 -0
  180. package/styles/index.css +38 -0
  181. package/styles/markdown.css +173 -0
  182. package/styles/theme.css +175 -0
  183. package/types.ts +25 -0
  184. package/README.md +0 -1
@@ -0,0 +1,16 @@
1
+ import type { FC, SVGAttributes } from 'react';
2
+
3
+ const ProgressionIcon: FC<SVGAttributes<SVGSVGElement>> = props => (
4
+ <svg
5
+ xmlns="http://www.w3.org/2000/svg"
6
+ width="16"
7
+ height="18"
8
+ viewBox="0 0 16 18"
9
+ fill="none"
10
+ {...props}
11
+ >
12
+ <path d="M9 3.26795L8 2.6906L7 3.26795L3.5359 5.26795L2.5359 5.8453V7V11V12.1547L3.5359 12.7321L7 14.7321L8 15.3094L9 14.7321L12.4641 12.7321L13.4641 12.1547V11V7V5.8453L12.4641 5.26795L9 3.26795Z" />
13
+ </svg>
14
+ );
15
+
16
+ export default ProgressionIcon;
@@ -0,0 +1,64 @@
1
+ @reference "../../../styles/index.css";
2
+
3
+ .group {
4
+ @apply flex
5
+ w-full
6
+ flex-col
7
+ gap-2;
8
+
9
+ &:not(.progression) {
10
+ .groupName {
11
+ @apply px-2
12
+ py-1
13
+ text-xs
14
+ font-semibold
15
+ text-neutral-800
16
+ dark:text-neutral-600;
17
+ }
18
+ }
19
+
20
+ &.progression {
21
+ @apply flex
22
+ flex-col
23
+ gap-4
24
+ text-sm
25
+ font-medium
26
+ text-neutral-800
27
+ dark:text-neutral-200;
28
+
29
+ .itemList {
30
+ @apply relative
31
+ -left-1
32
+ flex
33
+ flex-col
34
+ after:absolute
35
+ after:left-[0.45rem]
36
+ after:top-0
37
+ after:z-10
38
+ after:h-full
39
+ after:w-px
40
+ after:bg-neutral-200
41
+ after:content-['']
42
+ dark:after:bg-neutral-800;
43
+
44
+ a {
45
+ @apply first:before:absolute
46
+ first:before:bottom-[calc(50%+0.25rem)]
47
+ first:before:left-0
48
+ first:before:h-20
49
+ first:before:w-4
50
+ first:before:bg-white
51
+ first:before:content-['']
52
+ last:after:absolute
53
+ last:after:left-0
54
+ last:after:top-[calc(50%+0.25rem)]
55
+ last:after:h-20
56
+ last:after:w-4
57
+ last:after:bg-white
58
+ last:after:content-['']
59
+ first:dark:before:bg-neutral-950
60
+ last:dark:after:bg-neutral-950;
61
+ }
62
+ }
63
+ }
64
+ }
@@ -0,0 +1,36 @@
1
+ import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
+
3
+ import SidebarGroup from '#ui/Containers/Sidebar/SidebarGroup';
4
+
5
+ type Story = StoryObj<typeof SidebarGroup>;
6
+ type Meta = MetaObj<typeof SidebarGroup>;
7
+
8
+ export const Default: Story = {
9
+ args: {
10
+ groupName: 'Example Group',
11
+ items: [
12
+ { label: 'Item 1', link: '/item1' },
13
+ { label: 'Item 2', link: '/item2' },
14
+ { label: 'Item 3', link: '/item3' },
15
+ ],
16
+ },
17
+ };
18
+
19
+ export const CustomGroup: Story = {
20
+ args: {
21
+ groupName: 'Custom Group',
22
+ items: [
23
+ { label: 'Custom Item 1', link: '/custom-item1' },
24
+ { label: 'Custom Item 2', link: '/custom-item2' },
25
+ ],
26
+ },
27
+ };
28
+
29
+ export const EmptyGroup: Story = {
30
+ args: {
31
+ groupName: 'Empty Group',
32
+ items: [],
33
+ },
34
+ };
35
+
36
+ export default { component: SidebarGroup } as Meta;
@@ -0,0 +1,44 @@
1
+ import classNames from 'classnames';
2
+ import type { ComponentProps, FC } from 'react';
3
+
4
+ import SidebarItem from '#ui/Containers/Sidebar/SidebarItem';
5
+ import type { FormattedMessage, LinkLike } from '#ui/types';
6
+
7
+ import styles from './index.module.css';
8
+
9
+ type SidebarGroupProps = {
10
+ groupName: FormattedMessage;
11
+ items: Array<Omit<ComponentProps<typeof SidebarItem>, 'as' | 'pathname'>>;
12
+ as?: LinkLike;
13
+ pathname?: string;
14
+ showProgressionIcons?: boolean;
15
+ };
16
+
17
+ const SidebarGroup: FC<SidebarGroupProps> = ({
18
+ groupName,
19
+ items,
20
+ showProgressionIcons,
21
+ ...props
22
+ }) => (
23
+ <section
24
+ className={classNames({
25
+ [styles.group]: true,
26
+ [styles.progression]: showProgressionIcons,
27
+ })}
28
+ >
29
+ <label className={styles.groupName}>{groupName}</label>
30
+ <ul className={styles.itemList}>
31
+ {items.map(({ label, link }) => (
32
+ <SidebarItem
33
+ key={link}
34
+ label={label}
35
+ link={link}
36
+ showProgressionIcons={showProgressionIcons}
37
+ {...props}
38
+ />
39
+ ))}
40
+ </ul>
41
+ </section>
42
+ );
43
+
44
+ export default SidebarGroup;
@@ -0,0 +1,56 @@
1
+ @reference '../../../styles/index.css';
2
+
3
+ .item {
4
+ @apply font-regular
5
+ relative
6
+ z-20
7
+ flex
8
+ w-full
9
+ items-center
10
+ overflow-hidden
11
+ text-sm
12
+ text-neutral-800
13
+ dark:text-neutral-200;
14
+
15
+ .label {
16
+ @apply font-regular
17
+ p-2
18
+ text-sm;
19
+ }
20
+
21
+ .progressionIcon {
22
+ @apply shrink-0
23
+ fill-neutral-200
24
+ stroke-white
25
+ stroke-[4]
26
+ dark:fill-neutral-800
27
+ dark:stroke-neutral-950;
28
+ }
29
+
30
+ .icon {
31
+ @apply size-3
32
+ text-neutral-500
33
+ dark:text-neutral-200;
34
+ }
35
+
36
+ &.progression {
37
+ .label {
38
+ @apply p-1;
39
+ }
40
+ }
41
+
42
+ &.active {
43
+ @apply text-neutral-900
44
+ dark:text-white;
45
+
46
+ .progressionIcon {
47
+ @apply fill-green-500;
48
+ }
49
+
50
+ &:not(.progression) .label {
51
+ @apply rounded-sm
52
+ bg-green-600
53
+ text-white;
54
+ }
55
+ }
56
+ }
@@ -0,0 +1,15 @@
1
+ import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
+
3
+ import SidebarItem from '#ui/Containers/Sidebar/SidebarItem';
4
+
5
+ type Story = StoryObj<typeof SidebarItem>;
6
+ type Meta = MetaObj<typeof SidebarItem>;
7
+
8
+ export const Default: Story = {
9
+ args: {
10
+ label: 'Example Item',
11
+ link: '/example',
12
+ },
13
+ };
14
+
15
+ export default { component: SidebarItem } as Meta;
@@ -0,0 +1,43 @@
1
+ import { ArrowUpRightIcon } from '@heroicons/react/24/solid';
2
+ import classNames from 'classnames';
3
+ import type { FC } from 'react';
4
+
5
+ import BaseActiveLink from '#ui/Common/BaseActiveLink';
6
+ import type { FormattedMessage, LinkLike } from '#ui/types';
7
+
8
+ import styles from './index.module.css';
9
+ import ProgressionIcon from '../ProgressionIcon';
10
+
11
+ type SidebarItemProps = {
12
+ label: FormattedMessage;
13
+ link: string;
14
+ as?: LinkLike;
15
+ pathname?: string;
16
+ showProgressionIcons?: boolean;
17
+ };
18
+
19
+ const SidebarItem: FC<SidebarItemProps> = ({
20
+ label,
21
+ link,
22
+ showProgressionIcons = false,
23
+ ...props
24
+ }) => (
25
+ <BaseActiveLink
26
+ className={classNames({
27
+ [styles.item]: true,
28
+ [styles.progression]: showProgressionIcons,
29
+ })}
30
+ href={link}
31
+ activeClassName={styles.active}
32
+ {...props}
33
+ >
34
+ {showProgressionIcons && (
35
+ <ProgressionIcon className={styles.progressionIcon} />
36
+ )}
37
+ <span className={styles.label}>{label}</span>
38
+
39
+ {link.startsWith('http') && <ArrowUpRightIcon className={styles.icon} />}
40
+ </BaseActiveLink>
41
+ );
42
+
43
+ export default SidebarItem;
@@ -0,0 +1,30 @@
1
+ @reference "../../styles/index.css";
2
+
3
+ .wrapper {
4
+ @apply flex
5
+ w-full
6
+ flex-col
7
+ gap-8
8
+ overflow-auto
9
+ border-r-0
10
+ border-neutral-200
11
+ bg-white
12
+ px-4
13
+ py-6
14
+ sm:border-r
15
+ md:max-w-xs
16
+ lg:px-6
17
+ dark:border-neutral-900
18
+ dark:bg-neutral-950;
19
+
20
+ > section {
21
+ @apply hidden
22
+ sm:flex;
23
+ }
24
+
25
+ > span {
26
+ @apply flex
27
+ w-full
28
+ sm:hidden;
29
+ }
30
+ }
@@ -0,0 +1,88 @@
1
+ import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
+
3
+ import Sidebar from '#ui/Containers/Sidebar';
4
+
5
+ type Story = StoryObj<typeof Sidebar>;
6
+ type Meta = MetaObj<typeof Sidebar>;
7
+
8
+ const args = {
9
+ groups: [
10
+ {
11
+ groupName: 'About Node.js',
12
+ items: [
13
+ {
14
+ link: '/item1',
15
+ label: 'About Node.js',
16
+ },
17
+ {
18
+ link: '/item2',
19
+ label: 'Project Governance',
20
+ },
21
+ {
22
+ link: '/item3',
23
+ label: 'Releases',
24
+ },
25
+ {
26
+ link: '/item4',
27
+ label: 'Branding',
28
+ },
29
+ {
30
+ link: '/item5',
31
+ label: 'Privacy Policy',
32
+ },
33
+ {
34
+ link: '/item6',
35
+ label: 'Security Reporting',
36
+ },
37
+ ],
38
+ },
39
+ {
40
+ groupName: 'Get Involved',
41
+ items: [
42
+ {
43
+ link: '/item7',
44
+ label: 'Get Involved',
45
+ },
46
+ {
47
+ link: '/item8',
48
+ label: 'Collab Summit',
49
+ },
50
+ {
51
+ link: '/item9',
52
+ label: 'Contribute',
53
+ },
54
+ {
55
+ link: '/item10',
56
+ label: 'Code of Conduct',
57
+ },
58
+ ],
59
+ },
60
+ {
61
+ groupName: 'Download',
62
+ items: [
63
+ {
64
+ link: '/item11',
65
+ label: 'Download',
66
+ },
67
+ {
68
+ link: '/item12',
69
+ label: 'Package Manager',
70
+ },
71
+ {
72
+ link: '/item13',
73
+ label: 'Node.js Releases',
74
+ },
75
+ ],
76
+ },
77
+ ],
78
+ title: 'Sidebar',
79
+ onSelect: console.log,
80
+ pathname: '/item1',
81
+ };
82
+
83
+ export const Default: Story = { args };
84
+ export const Progression: Story = {
85
+ args: { ...args, showProgressionIcons: true },
86
+ };
87
+
88
+ export default { component: Sidebar } as Meta;
@@ -0,0 +1,65 @@
1
+ import type { ComponentProps, FC, PropsWithChildren } from 'react';
2
+
3
+ import Select from '#ui/Common/Select';
4
+ import SidebarGroup from '#ui/Containers/Sidebar/SidebarGroup';
5
+ import type { LinkLike } from '#ui/types';
6
+
7
+ import styles from './index.module.css';
8
+
9
+ type SidebarProps = {
10
+ groups: Array<
11
+ Pick<ComponentProps<typeof SidebarGroup>, 'items' | 'groupName'>
12
+ >;
13
+ pathname?: string;
14
+ title: string;
15
+ onSelect: (value: string) => void;
16
+ as?: LinkLike;
17
+ showProgressionIcons?: boolean;
18
+ };
19
+
20
+ const SideBar: FC<PropsWithChildren<SidebarProps>> = ({
21
+ groups,
22
+ pathname,
23
+ title,
24
+ onSelect,
25
+ as,
26
+ showProgressionIcons = false,
27
+ children,
28
+ }) => {
29
+ const selectItems = groups.map(({ items, groupName }) => ({
30
+ label: groupName,
31
+ items: items.map(({ label, link }) => ({ value: link, label })),
32
+ }));
33
+
34
+ const currentItem = selectItems
35
+ .flatMap(item => item.items)
36
+ .find(item => pathname === item.value);
37
+
38
+ return (
39
+ <aside className={styles.wrapper}>
40
+ {children}
41
+
42
+ {selectItems.length > 0 && (
43
+ <Select
44
+ label={title}
45
+ values={selectItems}
46
+ defaultValue={currentItem?.value}
47
+ onChange={onSelect}
48
+ />
49
+ )}
50
+
51
+ {groups.map(({ groupName, items }) => (
52
+ <SidebarGroup
53
+ key={groupName.toString()}
54
+ groupName={groupName}
55
+ items={items}
56
+ pathname={pathname}
57
+ as={as}
58
+ showProgressionIcons={showProgressionIcons}
59
+ />
60
+ ))}
61
+ </aside>
62
+ );
63
+ };
64
+
65
+ export default SideBar;
@@ -0,0 +1,10 @@
1
+ import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
+
3
+ import HexagonGrid from '#ui/Icons/HexagonGrid';
4
+
5
+ type Story = StoryObj<typeof HexagonGrid>;
6
+ type Meta = MetaObj<typeof HexagonGrid>;
7
+
8
+ export const Default: Story = {};
9
+
10
+ export default { component: HexagonGrid } as Meta;