@node-core/ui-components 1.0.1-9592ede0c373887bc655fce1377f06f063194424 → 1.0.1-a008bedf3c5f841ab073a1d74bad6625a18a4681

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 (262) hide show
  1. package/Common/AlertBox/index.js +5 -0
  2. package/Common/AlertBox/index.module.css +2 -76
  3. package/Common/AvatarGroup/Avatar/index.js +11 -0
  4. package/Common/AvatarGroup/Avatar/index.module.css +2 -40
  5. package/Common/AvatarGroup/Overlay/index.js +6 -0
  6. package/Common/AvatarGroup/Overlay/index.module.css +2 -31
  7. package/Common/AvatarGroup/index.js +21 -0
  8. package/Common/AvatarGroup/index.module.css +2 -21
  9. package/Common/Badge/index.js +7 -0
  10. package/Common/Badge/index.module.css +2 -38
  11. package/Common/BadgeGroup/index.js +6 -0
  12. package/Common/BadgeGroup/index.module.css +2 -77
  13. package/Common/Banner/index.js +4 -0
  14. package/Common/Banner/index.module.css +2 -42
  15. package/Common/BaseActiveLink/index.js +14 -0
  16. package/Common/BaseButton/index.js +10 -0
  17. package/Common/BaseButton/index.module.css +2 -142
  18. package/Common/BaseCodeBox/index.js +50 -0
  19. package/Common/BaseCodeBox/index.module.css +2 -78
  20. package/Common/BaseCrossLink/index.js +12 -0
  21. package/Common/BaseCrossLink/index.module.css +2 -51
  22. package/Common/BaseLinkTabs/index.js +5 -0
  23. package/Common/BaseLinkTabs/index.module.css +2 -43
  24. package/Common/BasePagination/Ellipsis/index.js +4 -0
  25. package/Common/BasePagination/Ellipsis/index.module.css +2 -10
  26. package/Common/BasePagination/PaginationListItem/index.js +6 -0
  27. package/Common/BasePagination/PaginationListItem/index.module.css +2 -27
  28. package/Common/BasePagination/PrevNextArrow.js +7 -0
  29. package/Common/BasePagination/index.js +10 -0
  30. package/Common/BasePagination/index.module.css +2 -39
  31. package/Common/BasePagination/useGetPageElements.js +77 -0
  32. package/Common/Blockquote/index.js +4 -0
  33. package/Common/Blockquote/index.module.css +2 -29
  34. package/Common/Breadcrumbs/BreadcrumbHomeLink/index.js +9 -0
  35. package/Common/Breadcrumbs/BreadcrumbHomeLink/index.module.css +2 -5
  36. package/Common/Breadcrumbs/BreadcrumbItem/index.js +6 -0
  37. package/Common/Breadcrumbs/BreadcrumbItem/index.module.css +2 -41
  38. package/Common/Breadcrumbs/BreadcrumbLink/index.js +5 -0
  39. package/Common/Breadcrumbs/BreadcrumbLink/index.module.css +2 -22
  40. package/Common/Breadcrumbs/BreadcrumbRoot/index.js +4 -0
  41. package/Common/Breadcrumbs/BreadcrumbRoot/index.module.css +2 -9
  42. package/Common/Breadcrumbs/BreadcrumbTruncatedItem/index.js +4 -0
  43. package/Common/Breadcrumbs/index.js +22 -0
  44. package/Common/ChangeHistory/index.js +9 -0
  45. package/Common/ChangeHistory/index.module.css +2 -0
  46. package/Common/CodeTabs/index.js +5 -0
  47. package/Common/CodeTabs/index.module.css +2 -56
  48. package/Common/DataTag/index.js +18 -0
  49. package/Common/DataTag/index.module.css +2 -56
  50. package/Common/GlowingBackdrop/index.js +5 -0
  51. package/Common/GlowingBackdrop/index.module.css +2 -32
  52. package/Common/LanguageDropDown/index.js +11 -0
  53. package/Common/LanguageDropDown/index.module.css +2 -53
  54. package/Common/Modal/index.js +10 -0
  55. package/Common/Modal/index.module.css +2 -79
  56. package/Common/NodejsLogo/index.js +7 -0
  57. package/Common/NodejsLogo/index.module.css +2 -6
  58. package/Common/Notification/index.js +6 -0
  59. package/Common/Notification/index.module.css +2 -20
  60. package/Common/Preview/index.js +7 -0
  61. package/Common/Preview/index.module.css +2 -79
  62. package/Common/Select/index.js +49 -0
  63. package/Common/Select/index.module.css +2 -161
  64. package/Common/Separator/index.js +7 -0
  65. package/Common/Separator/index.module.css +2 -16
  66. package/Common/Skeleton/index.js +18 -0
  67. package/Common/Skeleton/index.module.css +2 -30
  68. package/Common/Tabs/index.js +6 -0
  69. package/Common/Tabs/index.module.css +2 -54
  70. package/Common/ThemeToggle/index.js +7 -0
  71. package/Common/ThemeToggle/index.module.css +2 -15
  72. package/Common/Tooltip/index.js +8 -0
  73. package/Common/Tooltip/index.module.css +2 -43
  74. package/Containers/Article/index.js +4 -0
  75. package/Containers/Article/index.module.css +2 -70
  76. package/Containers/DocSideBar/index.js +1 -0
  77. package/Containers/Footer/index.js +22 -0
  78. package/Containers/Footer/index.module.css +2 -46
  79. package/Containers/MetaBar/index.js +12 -0
  80. package/Containers/MetaBar/index.module.css +2 -91
  81. package/Containers/NavBar/NavItem/index.js +7 -0
  82. package/Containers/NavBar/NavItem/index.module.css +2 -60
  83. package/Containers/NavBar/index.js +18 -0
  84. package/Containers/NavBar/index.module.css +2 -125
  85. package/Containers/Sidebar/ProgressionIcon/index.js +3 -0
  86. package/Containers/Sidebar/SidebarGroup/index.js +9 -0
  87. package/Containers/Sidebar/SidebarGroup/index.module.css +2 -64
  88. package/Containers/Sidebar/SidebarItem/index.js +11 -0
  89. package/Containers/Sidebar/SidebarItem/index.module.css +2 -56
  90. package/Containers/Sidebar/index.js +15 -0
  91. package/Containers/Sidebar/index.module.css +2 -30
  92. package/Icons/HexagonGrid.js +3 -0
  93. package/Icons/InstallationMethod/Choco.js +3 -0
  94. package/Icons/InstallationMethod/Devbox.js +3 -0
  95. package/Icons/InstallationMethod/Docker.js +3 -0
  96. package/Icons/InstallationMethod/FNM.js +3 -0
  97. package/Icons/InstallationMethod/Homebrew.js +3 -0
  98. package/Icons/InstallationMethod/N.js +5 -0
  99. package/Icons/InstallationMethod/NVM.js +3 -0
  100. package/Icons/InstallationMethod/Volta.js +3 -0
  101. package/Icons/InstallationMethod/{index.ts → index.js} +0 -1
  102. package/Icons/Logos/JsWhite.js +3 -0
  103. package/Icons/Logos/Nodejs.js +12 -0
  104. package/Icons/Logos/index.js +3 -0
  105. package/Icons/OperatingSystem/AIX.js +3 -0
  106. package/Icons/OperatingSystem/Apple.js +3 -0
  107. package/Icons/OperatingSystem/Linux.js +3 -0
  108. package/Icons/OperatingSystem/Microsoft.js +3 -0
  109. package/Icons/OperatingSystem/{index.ts → index.js} +0 -1
  110. package/Icons/PackageManager/Npm.js +3 -0
  111. package/Icons/PackageManager/Pnpm.js +3 -0
  112. package/Icons/PackageManager/Yarn.js +3 -0
  113. package/Icons/PackageManager/{index.ts → index.js} +0 -1
  114. package/Icons/Social/Bluesky.js +3 -0
  115. package/Icons/Social/Discord.js +3 -0
  116. package/Icons/Social/GitHub.js +3 -0
  117. package/Icons/Social/LinkedIn.js +3 -0
  118. package/Icons/Social/Mastodon.js +3 -0
  119. package/Icons/Social/Slack.js +3 -0
  120. package/Icons/Social/X.js +3 -0
  121. package/Icons/Social/{index.ts → index.js} +0 -1
  122. package/MDX/CodeTabs.js +16 -0
  123. package/Providers/NotificationProvider/index.js +16 -0
  124. package/Providers/NotificationProvider/index.module.css +2 -0
  125. package/package.json +10 -58
  126. package/stylelint/one-utility-class-per-line.mjs +34 -50
  127. package/stylelint/utils.mjs +19 -25
  128. package/styles/index.css +2 -38
  129. package/types.js +1 -0
  130. package/Common/AlertBox/index.stories.tsx +0 -73
  131. package/Common/AlertBox/index.tsx +0 -24
  132. package/Common/AvatarGroup/Avatar/index.stories.tsx +0 -22
  133. package/Common/AvatarGroup/Avatar/index.tsx +0 -67
  134. package/Common/AvatarGroup/Overlay/index.stories.tsx +0 -33
  135. package/Common/AvatarGroup/Overlay/index.tsx +0 -37
  136. package/Common/AvatarGroup/__tests__/index.test.jsx +0 -55
  137. package/Common/AvatarGroup/index.stories.tsx +0 -56
  138. package/Common/AvatarGroup/index.tsx +0 -83
  139. package/Common/Badge/index.stories.tsx +0 -38
  140. package/Common/Badge/index.tsx +0 -35
  141. package/Common/BadgeGroup/index.stories.tsx +0 -35
  142. package/Common/BadgeGroup/index.tsx +0 -35
  143. package/Common/Banner/index.stories.tsx +0 -29
  144. package/Common/Banner/index.tsx +0 -18
  145. package/Common/BaseActiveLink/__tests__/index.test.jsx +0 -52
  146. package/Common/BaseActiveLink/index.tsx +0 -34
  147. package/Common/BaseButton/index.stories.tsx +0 -67
  148. package/Common/BaseButton/index.tsx +0 -59
  149. package/Common/BaseCodeBox/index.stories.tsx +0 -39
  150. package/Common/BaseCodeBox/index.tsx +0 -122
  151. package/Common/BaseCrossLink/index.stories.tsx +0 -38
  152. package/Common/BaseCrossLink/index.tsx +0 -46
  153. package/Common/BaseLinkTabs/index.stories.tsx +0 -34
  154. package/Common/BaseLinkTabs/index.tsx +0 -53
  155. package/Common/BasePagination/Ellipsis/index.stories.tsx +0 -10
  156. package/Common/BasePagination/Ellipsis/index.tsx +0 -11
  157. package/Common/BasePagination/PaginationListItem/__tests__/index.test.jsx +0 -58
  158. package/Common/BasePagination/PaginationListItem/index.stories.tsx +0 -40
  159. package/Common/BasePagination/PaginationListItem/index.tsx +0 -39
  160. package/Common/BasePagination/PrevNextArrow.tsx +0 -15
  161. package/Common/BasePagination/__tests__/index.test.jsx +0 -180
  162. package/Common/BasePagination/index.stories.tsx +0 -67
  163. package/Common/BasePagination/index.tsx +0 -77
  164. package/Common/BasePagination/useGetPageElements.tsx +0 -132
  165. package/Common/Blockquote/index.stories.tsx +0 -45
  166. package/Common/Blockquote/index.tsx +0 -11
  167. package/Common/Breadcrumbs/BreadcrumbHomeLink/index.tsx +0 -30
  168. package/Common/Breadcrumbs/BreadcrumbItem/index.tsx +0 -42
  169. package/Common/Breadcrumbs/BreadcrumbLink/index.tsx +0 -37
  170. package/Common/Breadcrumbs/BreadcrumbRoot/index.tsx +0 -20
  171. package/Common/Breadcrumbs/BreadcrumbTruncatedItem/index.tsx +0 -9
  172. package/Common/Breadcrumbs/index.stories.tsx +0 -94
  173. package/Common/Breadcrumbs/index.tsx +0 -81
  174. package/Common/CodeTabs/index.stories.tsx +0 -73
  175. package/Common/CodeTabs/index.tsx +0 -16
  176. package/Common/DataTag/index.stories.tsx +0 -40
  177. package/Common/DataTag/index.tsx +0 -39
  178. package/Common/GlowingBackdrop/index.stories.tsx +0 -10
  179. package/Common/GlowingBackdrop/index.tsx +0 -13
  180. package/Common/LanguageDropDown/index.stories.tsx +0 -19
  181. package/Common/LanguageDropDown/index.tsx +0 -56
  182. package/Common/Modal/index.stories.tsx +0 -32
  183. package/Common/Modal/index.tsx +0 -48
  184. package/Common/NodejsLogo/index.stories.tsx +0 -14
  185. package/Common/NodejsLogo/index.tsx +0 -26
  186. package/Common/Notification/index.stories.tsx +0 -36
  187. package/Common/Notification/index.tsx +0 -34
  188. package/Common/Preview/index.stories.tsx +0 -44
  189. package/Common/Preview/index.tsx +0 -25
  190. package/Common/Select/__tests__/index.test.jsx +0 -67
  191. package/Common/Select/index.stories.tsx +0 -111
  192. package/Common/Select/index.tsx +0 -187
  193. package/Common/Separator/index.stories.tsx +0 -32
  194. package/Common/Separator/index.tsx +0 -27
  195. package/Common/Skeleton/index.tsx +0 -39
  196. package/Common/Tabs/__tests__/index.test.jsx +0 -52
  197. package/Common/Tabs/index.stories.tsx +0 -50
  198. package/Common/Tabs/index.tsx +0 -54
  199. package/Common/ThemeToggle/__tests__/index.test.jsx +0 -35
  200. package/Common/ThemeToggle/index.stories.tsx +0 -10
  201. package/Common/ThemeToggle/index.tsx +0 -15
  202. package/Common/Tooltip/index.stories.tsx +0 -73
  203. package/Common/Tooltip/index.tsx +0 -48
  204. package/Containers/Article/index.stories.tsx +0 -39
  205. package/Containers/Article/index.tsx +0 -9
  206. package/Containers/DocSideBar/index.tsx +0 -0
  207. package/Containers/Footer/index.stories.tsx +0 -27
  208. package/Containers/Footer/index.tsx +0 -95
  209. package/Containers/MetaBar/__tests__/index.test.jsx +0 -63
  210. package/Containers/MetaBar/index.stories.tsx +0 -80
  211. package/Containers/MetaBar/index.tsx +0 -72
  212. package/Containers/NavBar/NavItem/index.stories.tsx +0 -38
  213. package/Containers/NavBar/NavItem/index.tsx +0 -44
  214. package/Containers/NavBar/index.stories.tsx +0 -45
  215. package/Containers/NavBar/index.tsx +0 -94
  216. package/Containers/Sidebar/ProgressionIcon/index.tsx +0 -16
  217. package/Containers/Sidebar/SidebarGroup/index.stories.tsx +0 -36
  218. package/Containers/Sidebar/SidebarGroup/index.tsx +0 -49
  219. package/Containers/Sidebar/SidebarItem/index.stories.tsx +0 -15
  220. package/Containers/Sidebar/SidebarItem/index.tsx +0 -43
  221. package/Containers/Sidebar/index.stories.tsx +0 -88
  222. package/Containers/Sidebar/index.tsx +0 -67
  223. package/Icons/HexagonGrid.stories.tsx +0 -10
  224. package/Icons/HexagonGrid.tsx +0 -1434
  225. package/Icons/InstallationMethod/Choco.tsx +0 -78
  226. package/Icons/InstallationMethod/Devbox.tsx +0 -21
  227. package/Icons/InstallationMethod/Docker.tsx +0 -20
  228. package/Icons/InstallationMethod/FNM.tsx +0 -132
  229. package/Icons/InstallationMethod/Homebrew.tsx +0 -69
  230. package/Icons/InstallationMethod/N.tsx +0 -32
  231. package/Icons/InstallationMethod/NVM.tsx +0 -63
  232. package/Icons/InstallationMethod/Volta.tsx +0 -34
  233. package/Icons/Logos/JsGreen.tsx +0 -24
  234. package/Icons/Logos/JsWhite.tsx +0 -37
  235. package/Icons/Logos/Nodejs.tsx +0 -188
  236. package/Icons/Logos/NodejsStackedBlack.tsx +0 -98
  237. package/Icons/Logos/NodejsStackedDark.tsx +0 -124
  238. package/Icons/Logos/NodejsStackedLight.tsx +0 -123
  239. package/Icons/Logos/NodejsStackedWhite.tsx +0 -98
  240. package/Icons/Logos/index.ts +0 -17
  241. package/Icons/OperatingSystem/AIX.tsx +0 -46
  242. package/Icons/OperatingSystem/Apple.tsx +0 -23
  243. package/Icons/OperatingSystem/Linux.tsx +0 -969
  244. package/Icons/OperatingSystem/Microsoft.tsx +0 -19
  245. package/Icons/PackageManager/Npm.tsx +0 -21
  246. package/Icons/PackageManager/Pnpm.tsx +0 -22
  247. package/Icons/PackageManager/Yarn.tsx +0 -22
  248. package/Icons/Social/Bluesky.tsx +0 -19
  249. package/Icons/Social/Discord.tsx +0 -20
  250. package/Icons/Social/GitHub.tsx +0 -16
  251. package/Icons/Social/LinkedIn.tsx +0 -16
  252. package/Icons/Social/Mastodon.tsx +0 -36
  253. package/Icons/Social/Slack.tsx +0 -31
  254. package/Icons/Social/X.tsx +0 -16
  255. package/MDX/CodeTabs.tsx +0 -47
  256. package/stylelint/__tests__/index.test.mjs +0 -80
  257. package/styles/animations.css +0 -47
  258. package/styles/base.css +0 -17
  259. package/styles/effects.css +0 -12
  260. package/styles/markdown.css +0 -173
  261. package/styles/theme.css +0 -175
  262. package/types.ts +0 -25
@@ -1,48 +0,0 @@
1
- import * as TooltipPrimitive from '@radix-ui/react-tooltip';
2
- import classNames from 'classnames';
3
- import type { FC, PropsWithChildren, ReactNode } from 'react';
4
-
5
- import styles from './index.module.css';
6
-
7
- type TooltipProps = {
8
- asChild?: boolean;
9
- content: ReactNode;
10
- kind?: 'default' | 'warning' | 'error';
11
- side?: TooltipPrimitive.TooltipContentProps['side'];
12
- container?: HTMLElement | null;
13
- };
14
-
15
- const Tooltip: FC<PropsWithChildren<TooltipProps>> = ({
16
- kind = 'default',
17
- children,
18
- content,
19
- asChild = false,
20
- side = 'bottom',
21
- container,
22
- }) => (
23
- <TooltipPrimitive.Provider delayDuration={200}>
24
- <TooltipPrimitive.Root>
25
- <TooltipPrimitive.Trigger asChild={asChild}>
26
- {children}
27
- </TooltipPrimitive.Trigger>
28
- <TooltipPrimitive.Portal container={container}>
29
- <TooltipPrimitive.Content
30
- side={side}
31
- sideOffset={4}
32
- className={classNames(styles[kind], styles.content, {
33
- 'mx-1.5': side === 'top' || side === 'bottom',
34
- })}
35
- >
36
- {content}
37
- <TooltipPrimitive.Arrow
38
- className={styles.arrow}
39
- width={14}
40
- height={6}
41
- />
42
- </TooltipPrimitive.Content>
43
- </TooltipPrimitive.Portal>
44
- </TooltipPrimitive.Root>
45
- </TooltipPrimitive.Provider>
46
- );
47
-
48
- export default Tooltip;
@@ -1,39 +0,0 @@
1
- import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
-
3
- import Article from '.';
4
-
5
- type Story = StoryObj<typeof Article>;
6
- type Meta = MetaObj<typeof Article>;
7
-
8
- const Sidebar = () => (
9
- <div className="text-center">
10
- <h3>Sidebar</h3>
11
- <ul>
12
- <li>Navigation Item 1</li>
13
- <li>Navigation Item 2</li>
14
- <li>Navigation Item 3</li>
15
- <li>Navigation Item 4</li>
16
- </ul>
17
- </div>
18
- );
19
-
20
- export const Default: Story = {
21
- args: {
22
- children: (
23
- <>
24
- <Sidebar />
25
- <div>
26
- <main>
27
- <p>
28
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
29
- eiusmod tempor incididunt ut labore et dolore magna aliqua.
30
- </p>
31
- </main>
32
- <Sidebar />
33
- </div>
34
- </>
35
- ),
36
- },
37
- };
38
-
39
- export default { component: Article } as Meta;
@@ -1,9 +0,0 @@
1
- import type { FC, PropsWithChildren } from 'react';
2
-
3
- import styles from './index.module.css';
4
-
5
- const ArticleLayout: FC<PropsWithChildren> = ({ children }) => (
6
- <div className={styles.articleLayout}>{children}</div>
7
- );
8
-
9
- export default ArticleLayout;
File without changes
@@ -1,27 +0,0 @@
1
- import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
-
3
- import Footer from '#ui/Containers/Footer';
4
-
5
- type Story = StoryObj<typeof Footer>;
6
- type Meta = MetaObj<typeof Footer>;
7
-
8
- export const Default: Story = {
9
- args: {
10
- navigation: {
11
- footerLinks: [
12
- { link: '/', text: 'Home' },
13
- { link: 'https://openjsf.org', text: 'OpenJS Foundation' },
14
- ],
15
- socialLinks: [
16
- { icon: 'github', link: 'https://github.com' },
17
- { icon: 'mastodon', link: 'https://mastodon.social' },
18
- { icon: 'twitter', link: 'https://twitter.com' },
19
- { icon: 'slack', link: 'https://slack.com' },
20
- { icon: 'linkedin', link: 'https://linkedin.com' },
21
- { icon: 'bluesky', link: 'https://bsky.app' },
22
- ],
23
- },
24
- },
25
- };
26
-
27
- export default { component: Footer } as Meta;
@@ -1,95 +0,0 @@
1
- 'use client';
2
-
3
- import type { FC, SVGProps } from 'react';
4
-
5
- import NavItem from '#ui/Containers/NavBar/NavItem';
6
- import {
7
- Bluesky,
8
- Discord,
9
- GitHub,
10
- LinkedIn,
11
- Mastodon,
12
- Slack,
13
- X,
14
- } from '#ui/Icons/Social';
15
- import type { LinkLike } from '#ui/types';
16
-
17
- import styles from './index.module.css';
18
-
19
- const footerSocialIcons: Record<string, React.FC<SVGProps<SVGSVGElement>>> = {
20
- github: GitHub,
21
- mastodon: Mastodon,
22
- twitter: X,
23
- slack: Slack,
24
- linkedin: LinkedIn,
25
- bluesky: Bluesky,
26
- discord: Discord,
27
- };
28
-
29
- type Navigation = {
30
- socialLinks: Array<{
31
- icon: string;
32
- link: string;
33
- }>;
34
- footerLinks: Array<{
35
- text: string;
36
- link: string;
37
- }>;
38
- };
39
-
40
- const Footer: FC<{
41
- pathname: string;
42
- as: LinkLike;
43
- navigation: Navigation;
44
- }> = ({ pathname = '/', as = 'a', navigation }) => {
45
- const openJSlink = navigation.footerLinks.at(-1)!;
46
-
47
- return (
48
- <footer className={styles.footer}>
49
- <div className={styles.sectionPrimary}>
50
- {navigation.footerLinks.slice(0, -1).map(item => (
51
- <NavItem
52
- key={item.link}
53
- type="footer"
54
- href={item.link}
55
- as={as}
56
- pathname={pathname}
57
- >
58
- {item.text}
59
- </NavItem>
60
- ))}
61
- </div>
62
-
63
- <div className={styles.sectionSecondary}>
64
- <NavItem
65
- type="footer"
66
- href={openJSlink.link}
67
- as={as}
68
- pathname={pathname}
69
- >
70
- &copy; {openJSlink.text}
71
- </NavItem>
72
-
73
- <div className={styles.social}>
74
- {navigation.socialLinks.map(link => {
75
- const SocialIcon = footerSocialIcons[link.icon];
76
-
77
- return (
78
- <NavItem
79
- key={link.icon}
80
- href={link.link}
81
- type="footer"
82
- as={as}
83
- pathname={pathname}
84
- >
85
- <SocialIcon width={20} height={20} aria-label={link.link} />
86
- </NavItem>
87
- );
88
- })}
89
- </div>
90
- </div>
91
- </footer>
92
- );
93
- };
94
-
95
- export default Footer;
@@ -1,63 +0,0 @@
1
- import { describe, it } from 'node:test';
2
- import assert from 'node:assert/strict';
3
-
4
- import { render } from '@testing-library/react';
5
-
6
- import MetaBar from '..';
7
-
8
- describe('MetaBar', () => {
9
- it('does not render h5s in the table of contents', () => {
10
- const { queryByText, getByText } = render(
11
- <MetaBar
12
- items={{}}
13
- headings={{
14
- items: [
15
- {
16
- value: 'Heading Level 1',
17
- depth: 1,
18
- data: { id: 'heading-1' },
19
- },
20
- {
21
- value: 'Heading Level 2',
22
- depth: 2,
23
- data: { id: 'heading-2' },
24
- },
25
- {
26
- value: 'Heading Level 3',
27
- depth: 3,
28
- data: { id: 'heading-3' },
29
- },
30
- {
31
- value: 'Heading Level 4',
32
- depth: 4,
33
- data: { id: 'heading-4' },
34
- },
35
- {
36
- value: 'Heading Level 5',
37
- depth: 5,
38
- data: { id: 'heading-5' },
39
- },
40
- {
41
- value: 'Heading Level 6',
42
- depth: 6,
43
- data: { id: 'heading-6' },
44
- },
45
- ],
46
- }}
47
- />
48
- );
49
-
50
- const h1Element = queryByText('Heading Level 1');
51
- assert.ok(!h1Element?.ownerDocument);
52
-
53
- getByText('Heading Level 2');
54
- getByText('Heading Level 3');
55
- getByText('Heading Level 4');
56
-
57
- const h5Element = queryByText('Heading Level 5');
58
- assert.ok(!h5Element?.ownerDocument);
59
-
60
- const h6Element = queryByText('Heading Level 6');
61
- assert.ok(!h6Element?.ownerDocument);
62
- });
63
- });
@@ -1,80 +0,0 @@
1
- import { CodeBracketIcon } from '@heroicons/react/24/outline';
2
- import type { Meta as MetaObj, StoryObj } from '@storybook/react';
3
-
4
- import MetaBar from '#ui/Containers/MetaBar';
5
- import GitHubIcon from '#ui/Icons/Social/GitHub';
6
-
7
- type Story = StoryObj<typeof MetaBar>;
8
- type Meta = MetaObj<typeof MetaBar>;
9
-
10
- export const Default: Story = {
11
- args: {
12
- items: {
13
- 'components.metabar.lastUpdated': new Date(
14
- '17 October 2023'
15
- ).toLocaleDateString(),
16
- 'components.metabar.readingTime': '15 minutes',
17
- 'components.metabar.addedIn': 'v1.0.0',
18
- 'components.metabar.author': 'The Node.js Project',
19
- 'components.metabar.authors': <p>...</p>,
20
- 'components.metabar.contribute': (
21
- <>
22
- <GitHubIcon className="fill-neutral-700 dark:fill-neutral-100" />
23
- <a href="/contribute">Edit this page</a>
24
- </>
25
- ),
26
- 'components.metabar.viewAs': (
27
- <>
28
- <CodeBracketIcon />
29
- <a href="/json">JSON</a>
30
- </>
31
- ),
32
- },
33
- headings: {
34
- items: [
35
- {
36
- value: 'OpenSSL update assessment, and Node.js project plans',
37
- depth: 1,
38
- data: { id: 'heading-1' },
39
- },
40
- {
41
- value: 'Summary',
42
- depth: 2,
43
- data: { id: 'summary' },
44
- },
45
- {
46
- value: 'Analysis',
47
- depth: 2,
48
- data: { id: 'analysis' },
49
- },
50
- {
51
- value: 'The c_rehash script allows command injection (CVE-2022-2068)',
52
- depth: 3,
53
- data: { id: 'the_c_rehash' },
54
- },
55
- {
56
- value: 'Contact and future updates',
57
- depth: 3,
58
- data: { id: 'contact_and_future_updates' },
59
- },
60
- {
61
- value: 'Email',
62
- depth: 4,
63
- data: { id: 'email' },
64
- },
65
- {
66
- value: 'Slack',
67
- depth: 4,
68
- data: { id: 'slack' },
69
- },
70
- {
71
- value: '#node-website',
72
- depth: 5, // h5s do not get shown
73
- data: { id: 'node-website' },
74
- },
75
- ],
76
- },
77
- },
78
- };
79
-
80
- export default { component: MetaBar } as Meta;
@@ -1,72 +0,0 @@
1
- import type { Heading } from '@vcarl/remark-headings';
2
- import { Fragment, useMemo } from 'react';
3
- import type { FC } from 'react';
4
-
5
- import type { LinkLike } from '#ui/types';
6
-
7
- import styles from './index.module.css';
8
-
9
- type MetaBarProps = {
10
- items: Partial<Record<string, React.ReactNode>>;
11
- headings?: {
12
- items: Array<Heading>;
13
- minDepth?: number;
14
- };
15
- as?: LinkLike;
16
- heading: string;
17
- };
18
-
19
- const MetaBar: FC<MetaBarProps> = ({
20
- items,
21
- headings,
22
- as: Component = 'a',
23
- heading,
24
- }) => {
25
- // The default depth of headings to display in the table of contents.
26
- const { minDepth = 2, items: headingItems = [] } = headings || {};
27
-
28
- const filteredHeadings = useMemo(
29
- () => headingItems.filter(({ depth }) => depth >= minDepth && depth <= 4),
30
- [minDepth, headingItems]
31
- );
32
-
33
- return (
34
- <div className={styles.wrapper}>
35
- <dl>
36
- {Object.entries(items)
37
- .filter(([, value]) => !!value)
38
- .map(([key, value]) => (
39
- <Fragment key={key}>
40
- <dt>{key}</dt>
41
- <dd>{value}</dd>
42
- </Fragment>
43
- ))}
44
-
45
- {filteredHeadings.length > 0 && (
46
- <>
47
- <dt>{heading}</dt>
48
- <dd>
49
- <ol>
50
- {filteredHeadings.map(head => (
51
- <li
52
- key={head.value}
53
- className={
54
- head.depth === 3 ? 'pl-2' : head.depth === 4 ? 'pl-4' : ''
55
- }
56
- >
57
- <Component href={`#${head?.data?.id}`}>
58
- {' '}
59
- {head.value}
60
- </Component>
61
- </li>
62
- ))}
63
- </ol>
64
- </dd>
65
- </>
66
- )}
67
- </dl>
68
- </div>
69
- );
70
- };
71
-
72
- export default MetaBar;
@@ -1,38 +0,0 @@
1
- import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
-
3
- import NavItem from '#ui/Containers/NavBar/NavItem';
4
-
5
- type Story = StoryObj<typeof NavItem>;
6
- type Meta = MetaObj<typeof NavItem>;
7
-
8
- export const Default: Story = {
9
- args: {
10
- href: '/learn',
11
- children: 'Learn',
12
- },
13
- };
14
-
15
- export const WithExternalLink: Story = {
16
- args: {
17
- href: 'https://nodejs.org/en',
18
- children: 'Learn',
19
- target: '_blank',
20
- },
21
- };
22
-
23
- export const WithChildren: Story = {
24
- args: {
25
- href: 'https://nodejs.org/en',
26
- children: <b>Learn</b>,
27
- },
28
- };
29
-
30
- export const FooterItem: Story = {
31
- args: {
32
- href: '/about',
33
- children: 'Trademark Policy',
34
- type: 'footer',
35
- },
36
- };
37
-
38
- export default { component: NavItem } as Meta;
@@ -1,44 +0,0 @@
1
- import { ArrowUpRightIcon } from '@heroicons/react/24/solid';
2
- import classNames from 'classnames';
3
- import type { FC, HTMLAttributeAnchorTarget, PropsWithChildren } from 'react';
4
-
5
- import BaseActiveLink from '#ui/Common/BaseActiveLink';
6
- import type { LinkLike } from '#ui/types';
7
-
8
- import styles from './index.module.css';
9
-
10
- type NavItemType = 'nav' | 'footer';
11
-
12
- type NavItemProps = {
13
- href: string;
14
- type?: NavItemType;
15
- className?: string;
16
- target?: HTMLAttributeAnchorTarget | undefined;
17
-
18
- pathname: string;
19
- as: LinkLike;
20
- };
21
-
22
- const NavItem: FC<PropsWithChildren<NavItemProps>> = ({
23
- href = '',
24
- type = 'nav',
25
- children,
26
- className,
27
- target,
28
- ...props
29
- }) => (
30
- <BaseActiveLink
31
- target={target}
32
- href={href}
33
- className={classNames(styles.navItem, styles[type], className)}
34
- activeClassName={styles.active}
35
- allowSubPath={href.startsWith('/')}
36
- {...props}
37
- >
38
- <span className={styles.label}>{children}</span>
39
-
40
- {target === '_blank' && <ArrowUpRightIcon className={styles.icon} />}
41
- </BaseActiveLink>
42
- );
43
-
44
- export default NavItem;
@@ -1,45 +0,0 @@
1
- import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
-
3
- import NavBar from '#ui/Containers/NavBar';
4
-
5
- type Story = StoryObj<typeof NavBar>;
6
- type Meta = MetaObj<typeof NavBar>;
7
-
8
- export const Default: Story = {
9
- args: {
10
- as: 'a',
11
- Logo: 'a',
12
- pathname: '/',
13
-
14
- children: <a>Some other child</a>,
15
-
16
- navItems: [
17
- {
18
- text: 'Learn',
19
- link: '/',
20
- },
21
- {
22
- text: 'About',
23
- link: '/about',
24
- },
25
- {
26
- text: 'Docs',
27
- link: '/docs',
28
- },
29
- {
30
- text: 'Download',
31
- link: '/download',
32
- },
33
- {
34
- text: 'Blog',
35
- link: '/blog',
36
- },
37
- {
38
- text: 'Certification',
39
- link: 'https://openjsf.org/certification',
40
- },
41
- ],
42
- },
43
- };
44
-
45
- export default { component: NavBar } as Meta;
@@ -1,94 +0,0 @@
1
- 'use client';
2
-
3
- import Hamburger from '@heroicons/react/24/solid/Bars3Icon';
4
- import XMark from '@heroicons/react/24/solid/XMarkIcon';
5
- import * as Label from '@radix-ui/react-label';
6
- import classNames from 'classnames';
7
- import { useState } from 'react';
8
- import type {
9
- FC,
10
- HTMLAttributeAnchorTarget,
11
- PropsWithChildren,
12
- ElementType,
13
- } from 'react';
14
-
15
- import NavItem from '#ui/Containers/NavBar/NavItem';
16
- import type { FormattedMessage, LinkLike } from '#ui/types';
17
-
18
- import style from './index.module.css';
19
-
20
- const navInteractionIcons = {
21
- show: <Hamburger className={style.navInteractionIcon} />,
22
- close: <XMark className={style.navInteractionIcon} />,
23
- };
24
-
25
- type NavbarProps = {
26
- navItems: Array<{
27
- text: FormattedMessage;
28
- link: string;
29
- target?: HTMLAttributeAnchorTarget | undefined;
30
- }>;
31
- Logo: ElementType;
32
- as: LinkLike;
33
- pathname: string;
34
- sidebarItemTogglerAriaLabel: string;
35
- };
36
-
37
- const NavBar: FC<PropsWithChildren<NavbarProps>> = ({
38
- children,
39
- Logo,
40
- as: Component = 'a',
41
- navItems,
42
- pathname,
43
- sidebarItemTogglerAriaLabel,
44
- }) => {
45
- const [isMenuOpen, setIsMenuOpen] = useState(false);
46
-
47
- return (
48
- <nav className={style.container}>
49
- <div className={style.nodeIconAndMobileItemsToggler}>
50
- <Component className={style.nodeIconWrapper} href="/" aria-label="Home">
51
- <Logo />
52
- </Component>
53
-
54
- <Label.Root
55
- className={style.sidebarItemTogglerLabel}
56
- htmlFor="sidebarItemToggler"
57
- role="button"
58
- aria-label={sidebarItemTogglerAriaLabel}
59
- >
60
- {navInteractionIcons[isMenuOpen ? 'close' : 'show']}
61
- </Label.Root>
62
- </div>
63
-
64
- <input
65
- className={classNames(['peer', style.sidebarItemToggler])}
66
- id="sidebarItemToggler"
67
- type="checkbox"
68
- onChange={e => setIsMenuOpen(() => e.target.checked)}
69
- aria-label={sidebarItemTogglerAriaLabel}
70
- tabIndex={-1}
71
- />
72
-
73
- <div className={`${style.main} hidden peer-checked:flex`}>
74
- <div className={style.navItems}>
75
- {navItems.map(({ text, link, target }) => (
76
- <NavItem
77
- pathname={pathname}
78
- as={Component}
79
- key={link}
80
- href={link}
81
- target={target}
82
- >
83
- {text}
84
- </NavItem>
85
- ))}
86
- </div>
87
-
88
- <div className={style.actionsWrapper}>{children}</div>
89
- </div>
90
- </nav>
91
- );
92
- };
93
-
94
- export default NavBar;
@@ -1,16 +0,0 @@
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;