@node-core/ui-components 1.0.1-df203d0fe21ee5d80d258c60dc821e8ac0601ce4 → 1.0.1-e1f87bde264af01e260a8efa4fab1749a2c6bc29

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 (263) hide show
  1. package/Common/AlertBox/index.js +5 -0
  2. package/Common/AlertBox/index.module.css +47 -46
  3. package/Common/AvatarGroup/Avatar/index.js +11 -0
  4. package/Common/AvatarGroup/Avatar/index.module.css +50 -30
  5. package/Common/AvatarGroup/Overlay/index.js +6 -0
  6. package/Common/AvatarGroup/Overlay/index.module.css +28 -21
  7. package/Common/AvatarGroup/index.js +21 -0
  8. package/Common/AvatarGroup/index.module.css +12 -15
  9. package/Common/Badge/index.js +7 -0
  10. package/Common/Badge/index.module.css +34 -26
  11. package/Common/BadgeGroup/index.js +6 -0
  12. package/Common/BadgeGroup/index.module.css +75 -51
  13. package/Common/Banner/index.js +4 -0
  14. package/Common/Banner/index.module.css +30 -27
  15. package/Common/BaseActiveLink/index.js +14 -0
  16. package/Common/BaseButton/index.js +10 -0
  17. package/Common/BaseButton/index.module.css +332 -102
  18. package/Common/BaseCodeBox/index.js +50 -0
  19. package/Common/BaseCodeBox/index.module.css +76 -64
  20. package/Common/BaseCrossLink/index.js +12 -0
  21. package/Common/BaseCrossLink/index.module.css +57 -39
  22. package/Common/BaseLinkTabs/index.js +5 -0
  23. package/Common/BaseLinkTabs/index.module.css +67 -33
  24. package/Common/BasePagination/Ellipsis/index.js +4 -0
  25. package/Common/BasePagination/Ellipsis/index.module.css +14 -8
  26. package/Common/BasePagination/PaginationListItem/index.js +6 -0
  27. package/Common/BasePagination/PaginationListItem/index.module.css +36 -21
  28. package/Common/BasePagination/PrevNextArrow.js +7 -0
  29. package/Common/BasePagination/index.js +10 -0
  30. package/Common/BasePagination/index.module.css +27 -26
  31. package/Common/BasePagination/useGetPageElements.js +77 -0
  32. package/Common/Blockquote/index.js +4 -0
  33. package/Common/Blockquote/index.module.css +44 -23
  34. package/Common/Breadcrumbs/BreadcrumbHomeLink/index.js +9 -0
  35. package/Common/Breadcrumbs/BreadcrumbHomeLink/index.module.css +3 -3
  36. package/Common/Breadcrumbs/BreadcrumbItem/index.js +6 -0
  37. package/Common/Breadcrumbs/BreadcrumbItem/index.module.css +38 -27
  38. package/Common/Breadcrumbs/BreadcrumbLink/index.js +5 -0
  39. package/Common/Breadcrumbs/BreadcrumbLink/index.module.css +26 -16
  40. package/Common/Breadcrumbs/BreadcrumbRoot/index.js +4 -0
  41. package/Common/Breadcrumbs/BreadcrumbRoot/index.module.css +8 -7
  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 +198 -0
  46. package/Common/CodeTabs/index.js +5 -0
  47. package/Common/CodeTabs/index.module.css +47 -36
  48. package/Common/DataTag/index.js +18 -0
  49. package/Common/DataTag/index.module.css +54 -0
  50. package/Common/GlowingBackdrop/index.js +5 -0
  51. package/Common/GlowingBackdrop/index.module.css +126 -28
  52. package/Common/LanguageDropDown/index.js +11 -0
  53. package/Common/LanguageDropDown/index.module.css +140 -42
  54. package/Common/Modal/index.js +10 -0
  55. package/Common/Modal/index.module.css +217 -62
  56. package/Common/NodejsLogo/index.js +7 -0
  57. package/Common/NodejsLogo/index.module.css +3 -4
  58. package/Common/Notification/index.js +6 -0
  59. package/Common/Notification/index.module.css +101 -17
  60. package/Common/Preview/index.js +7 -0
  61. package/Common/Preview/index.module.css +269 -65
  62. package/Common/Select/index.js +46 -0
  63. package/Common/Select/index.module.css +294 -127
  64. package/Common/Separator/index.js +7 -0
  65. package/Common/Separator/index.module.css +7 -10
  66. package/Common/Skeleton/index.js +18 -0
  67. package/Common/Skeleton/index.module.css +118 -21
  68. package/Common/Tabs/index.js +6 -0
  69. package/Common/Tabs/index.module.css +58 -40
  70. package/Common/ThemeToggle/index.js +7 -0
  71. package/Common/ThemeToggle/index.module.css +18 -11
  72. package/Common/Tooltip/index.js +8 -0
  73. package/Common/Tooltip/index.module.css +119 -29
  74. package/Containers/Article/index.js +4 -0
  75. package/Containers/Article/index.module.css +127 -58
  76. package/Containers/DocSideBar/index.js +1 -0
  77. package/Containers/Footer/index.js +22 -0
  78. package/Containers/Footer/index.module.css +51 -36
  79. package/Containers/MetaBar/index.js +12 -0
  80. package/Containers/MetaBar/index.module.css +101 -69
  81. package/Containers/NavBar/NavItem/index.js +7 -0
  82. package/Containers/NavBar/NavItem/index.module.css +50 -36
  83. package/Containers/NavBar/index.js +18 -0
  84. package/Containers/NavBar/index.module.css +176 -96
  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 +188 -22
  88. package/Containers/Sidebar/SidebarItem/index.js +11 -0
  89. package/Containers/Sidebar/SidebarItem/index.module.css +60 -28
  90. package/Containers/Sidebar/index.js +15 -0
  91. package/Containers/Sidebar/index.module.css +44 -27
  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/package.json +19 -69
  124. package/stylelint/one-utility-class-per-line.mjs +34 -50
  125. package/stylelint/utils.mjs +19 -25
  126. package/styles/index.css +1124 -26
  127. package/types.js +1 -0
  128. package/Common/AlertBox/index.stories.tsx +0 -73
  129. package/Common/AlertBox/index.tsx +0 -24
  130. package/Common/AvatarGroup/Avatar/index.stories.tsx +0 -22
  131. package/Common/AvatarGroup/Avatar/index.tsx +0 -67
  132. package/Common/AvatarGroup/Overlay/index.stories.tsx +0 -33
  133. package/Common/AvatarGroup/Overlay/index.tsx +0 -37
  134. package/Common/AvatarGroup/__tests__/index.test.jsx +0 -55
  135. package/Common/AvatarGroup/index.stories.tsx +0 -56
  136. package/Common/AvatarGroup/index.tsx +0 -87
  137. package/Common/Badge/index.stories.tsx +0 -38
  138. package/Common/Badge/index.tsx +0 -35
  139. package/Common/BadgeGroup/index.stories.tsx +0 -35
  140. package/Common/BadgeGroup/index.tsx +0 -35
  141. package/Common/Banner/index.stories.tsx +0 -29
  142. package/Common/Banner/index.tsx +0 -18
  143. package/Common/BaseActiveLink/__tests__/index.test.jsx +0 -52
  144. package/Common/BaseActiveLink/index.tsx +0 -34
  145. package/Common/BaseButton/index.stories.tsx +0 -67
  146. package/Common/BaseButton/index.tsx +0 -59
  147. package/Common/BaseCodeBox/index.stories.tsx +0 -39
  148. package/Common/BaseCodeBox/index.tsx +0 -133
  149. package/Common/BaseCrossLink/index.stories.tsx +0 -38
  150. package/Common/BaseCrossLink/index.tsx +0 -46
  151. package/Common/BaseLinkTabs/index.stories.tsx +0 -34
  152. package/Common/BaseLinkTabs/index.tsx +0 -53
  153. package/Common/BasePagination/Ellipsis/index.stories.tsx +0 -10
  154. package/Common/BasePagination/Ellipsis/index.tsx +0 -11
  155. package/Common/BasePagination/PaginationListItem/__tests__/index.test.jsx +0 -58
  156. package/Common/BasePagination/PaginationListItem/index.stories.tsx +0 -40
  157. package/Common/BasePagination/PaginationListItem/index.tsx +0 -39
  158. package/Common/BasePagination/PrevNextArrow.tsx +0 -15
  159. package/Common/BasePagination/__tests__/index.test.jsx +0 -180
  160. package/Common/BasePagination/index.stories.tsx +0 -67
  161. package/Common/BasePagination/index.tsx +0 -77
  162. package/Common/BasePagination/useGetPageElements.tsx +0 -132
  163. package/Common/Blockquote/index.stories.tsx +0 -45
  164. package/Common/Blockquote/index.tsx +0 -11
  165. package/Common/Breadcrumbs/BreadcrumbHomeLink/index.tsx +0 -30
  166. package/Common/Breadcrumbs/BreadcrumbItem/index.tsx +0 -42
  167. package/Common/Breadcrumbs/BreadcrumbLink/index.tsx +0 -37
  168. package/Common/Breadcrumbs/BreadcrumbRoot/index.tsx +0 -20
  169. package/Common/Breadcrumbs/BreadcrumbTruncatedItem/index.tsx +0 -9
  170. package/Common/Breadcrumbs/index.stories.tsx +0 -94
  171. package/Common/Breadcrumbs/index.tsx +0 -81
  172. package/Common/CodeTabs/index.stories.tsx +0 -74
  173. package/Common/CodeTabs/index.tsx +0 -16
  174. package/Common/GlowingBackdrop/index.stories.tsx +0 -10
  175. package/Common/GlowingBackdrop/index.tsx +0 -13
  176. package/Common/LanguageDropDown/index.stories.tsx +0 -19
  177. package/Common/LanguageDropDown/index.tsx +0 -56
  178. package/Common/Modal/index.stories.tsx +0 -32
  179. package/Common/Modal/index.tsx +0 -48
  180. package/Common/NodejsLogo/index.stories.tsx +0 -14
  181. package/Common/NodejsLogo/index.tsx +0 -26
  182. package/Common/Notification/index.stories.tsx +0 -36
  183. package/Common/Notification/index.tsx +0 -34
  184. package/Common/Preview/index.stories.tsx +0 -44
  185. package/Common/Preview/index.tsx +0 -25
  186. package/Common/ProgressionSidebar/ProgressionSidebarGroup/index.module.css +0 -47
  187. package/Common/ProgressionSidebar/ProgressionSidebarGroup/index.tsx +0 -35
  188. package/Common/ProgressionSidebar/ProgressionSidebarIcon/index.tsx +0 -16
  189. package/Common/ProgressionSidebar/ProgressionSidebarItem/index.module.css +0 -39
  190. package/Common/ProgressionSidebar/ProgressionSidebarItem/index.tsx +0 -32
  191. package/Common/ProgressionSidebar/index.module.css +0 -30
  192. package/Common/ProgressionSidebar/index.stories.tsx +0 -79
  193. package/Common/ProgressionSidebar/index.tsx +0 -59
  194. package/Common/Select/__tests__/index.test.jsx +0 -67
  195. package/Common/Select/index.stories.tsx +0 -111
  196. package/Common/Select/index.tsx +0 -187
  197. package/Common/Separator/index.stories.tsx +0 -32
  198. package/Common/Separator/index.tsx +0 -27
  199. package/Common/Skeleton/index.tsx +0 -39
  200. package/Common/Tabs/__tests__/index.test.jsx +0 -52
  201. package/Common/Tabs/index.stories.tsx +0 -50
  202. package/Common/Tabs/index.tsx +0 -54
  203. package/Common/ThemeToggle/__tests__/index.test.jsx +0 -35
  204. package/Common/ThemeToggle/index.stories.tsx +0 -10
  205. package/Common/ThemeToggle/index.tsx +0 -15
  206. package/Common/Tooltip/index.stories.tsx +0 -73
  207. package/Common/Tooltip/index.tsx +0 -48
  208. package/Containers/Article/index.stories.tsx +0 -39
  209. package/Containers/Article/index.tsx +0 -9
  210. package/Containers/Footer/index.stories.tsx +0 -27
  211. package/Containers/Footer/index.tsx +0 -95
  212. package/Containers/MetaBar/__tests__/index.test.jsx +0 -63
  213. package/Containers/MetaBar/index.stories.tsx +0 -80
  214. package/Containers/MetaBar/index.tsx +0 -72
  215. package/Containers/NavBar/NavItem/index.stories.tsx +0 -38
  216. package/Containers/NavBar/NavItem/index.tsx +0 -44
  217. package/Containers/NavBar/index.stories.tsx +0 -45
  218. package/Containers/NavBar/index.tsx +0 -94
  219. package/Containers/Sidebar/SidebarGroup/index.stories.tsx +0 -36
  220. package/Containers/Sidebar/SidebarGroup/index.tsx +0 -30
  221. package/Containers/Sidebar/SidebarItem/index.stories.tsx +0 -15
  222. package/Containers/Sidebar/SidebarItem/index.tsx +0 -26
  223. package/Containers/Sidebar/index.stories.tsx +0 -84
  224. package/Containers/Sidebar/index.tsx +0 -58
  225. package/Icons/HexagonGrid.stories.tsx +0 -10
  226. package/Icons/HexagonGrid.tsx +0 -1434
  227. package/Icons/InstallationMethod/Choco.tsx +0 -78
  228. package/Icons/InstallationMethod/Devbox.tsx +0 -21
  229. package/Icons/InstallationMethod/Docker.tsx +0 -20
  230. package/Icons/InstallationMethod/FNM.tsx +0 -132
  231. package/Icons/InstallationMethod/Homebrew.tsx +0 -69
  232. package/Icons/InstallationMethod/N.tsx +0 -32
  233. package/Icons/InstallationMethod/NVM.tsx +0 -63
  234. package/Icons/InstallationMethod/Volta.tsx +0 -34
  235. package/Icons/Logos/JsGreen.tsx +0 -24
  236. package/Icons/Logos/JsWhite.tsx +0 -37
  237. package/Icons/Logos/Nodejs.tsx +0 -188
  238. package/Icons/Logos/NodejsStackedBlack.tsx +0 -98
  239. package/Icons/Logos/NodejsStackedDark.tsx +0 -124
  240. package/Icons/Logos/NodejsStackedLight.tsx +0 -123
  241. package/Icons/Logos/NodejsStackedWhite.tsx +0 -98
  242. package/Icons/Logos/index.ts +0 -17
  243. package/Icons/OperatingSystem/AIX.tsx +0 -46
  244. package/Icons/OperatingSystem/Apple.tsx +0 -23
  245. package/Icons/OperatingSystem/Linux.tsx +0 -969
  246. package/Icons/OperatingSystem/Microsoft.tsx +0 -19
  247. package/Icons/PackageManager/Npm.tsx +0 -21
  248. package/Icons/PackageManager/Pnpm.tsx +0 -22
  249. package/Icons/PackageManager/Yarn.tsx +0 -22
  250. package/Icons/Social/Bluesky.tsx +0 -19
  251. package/Icons/Social/Discord.tsx +0 -20
  252. package/Icons/Social/GitHub.tsx +0 -16
  253. package/Icons/Social/LinkedIn.tsx +0 -16
  254. package/Icons/Social/Mastodon.tsx +0 -36
  255. package/Icons/Social/Slack.tsx +0 -31
  256. package/Icons/Social/X.tsx +0 -16
  257. package/stylelint/__tests__/index.test.mjs +0 -80
  258. package/styles/animations.css +0 -47
  259. package/styles/base.css +0 -17
  260. package/styles/effects.css +0 -12
  261. package/styles/markdown.css +0 -173
  262. package/styles/theme.css +0 -175
  263. package/types.ts +0 -25
@@ -1,52 +0,0 @@
1
- import { describe, it } from 'node:test';
2
- import assert from 'node:assert/strict';
3
-
4
- import { render, screen } from '@testing-library/react';
5
-
6
- import ActiveLink from '..';
7
-
8
- describe('ActiveLink', () => {
9
- it('renders as localized link', async () => {
10
- render(
11
- <ActiveLink className="link" activeClassName="active" href="/link">
12
- Link
13
- </ActiveLink>
14
- );
15
-
16
- assert.equal(
17
- (await screen.findByText('Link')).getAttribute('href'),
18
- '/link'
19
- );
20
- });
21
-
22
- it('ignores active class when href not matches location.href', async () => {
23
- render(
24
- <ActiveLink className="link" activeClassName="active" href="/not-link">
25
- Link
26
- </ActiveLink>
27
- );
28
-
29
- assert.equal(
30
- (await screen.findByText('Link')).getAttribute('class'),
31
- 'link'
32
- );
33
- });
34
-
35
- it('sets active class when href matches location.href', async () => {
36
- render(
37
- <ActiveLink
38
- className="link"
39
- activeClassName="active"
40
- href="/link"
41
- pathname="/link"
42
- >
43
- Link
44
- </ActiveLink>
45
- );
46
-
47
- assert.equal(
48
- (await screen.findByText('Link')).getAttribute('class'),
49
- 'link active'
50
- );
51
- });
52
- });
@@ -1,34 +0,0 @@
1
- import classNames from 'classnames';
2
- import type { ComponentProps, FC } from 'react';
3
-
4
- import type { LinkLike } from '#ui/types';
5
-
6
- export type ActiveLocalizedLinkProps = ComponentProps<LinkLike> & {
7
- activeClassName?: string;
8
- allowSubPath?: boolean;
9
- pathname?: string;
10
- as?: LinkLike;
11
- };
12
-
13
- const BaseActiveLink: FC<ActiveLocalizedLinkProps> = ({
14
- activeClassName = 'active',
15
- allowSubPath = false,
16
- className,
17
- href = '',
18
- pathname = '/',
19
- as: Component = 'a',
20
- ...props
21
- }) => {
22
- const finalClassName = classNames(className, {
23
- [activeClassName]: allowSubPath
24
- ? // When using allowSubPath we want only to check if
25
- // the current pathname starts with the utmost upper level
26
- // of an href (e.g. /docs/...)
27
- pathname.startsWith(`/${href.toString().split('/')[1]}`)
28
- : href.toString() === pathname,
29
- });
30
-
31
- return <Component className={finalClassName} href={href} {...props} />;
32
- };
33
-
34
- export default BaseActiveLink;
@@ -1,67 +0,0 @@
1
- import { ArrowRightIcon } from '@heroicons/react/24/solid';
2
- import type { Meta as MetaObj, StoryObj } from '@storybook/react';
3
-
4
- import BaseButton from '#ui/Common/BaseButton';
5
-
6
- type Story = StoryObj<typeof BaseButton>;
7
- type Meta = MetaObj<typeof BaseButton>;
8
-
9
- export const Neutral: Story = {
10
- args: {
11
- kind: 'neutral',
12
- children: 'Download Node (LTS)',
13
- disabled: false,
14
- size: 'default',
15
- },
16
- };
17
-
18
- export const Primary: Story = {
19
- args: {
20
- kind: 'primary',
21
- children: 'Download Node (LTS)',
22
- disabled: false,
23
- size: 'default',
24
- },
25
- };
26
-
27
- export const Secondary: Story = {
28
- args: {
29
- kind: 'secondary',
30
- children: 'Download Node (LTS)',
31
- disabled: false,
32
- size: 'default',
33
- },
34
- };
35
-
36
- export const Special: Story = {
37
- args: {
38
- kind: 'special',
39
- children: 'Download Node (LTS)',
40
- disabled: false,
41
- size: 'default',
42
- },
43
- };
44
-
45
- export const WithIcon: Story = {
46
- args: {
47
- kind: 'primary',
48
- children: (
49
- <>
50
- Back to Home
51
- <ArrowRightIcon />
52
- </>
53
- ),
54
- disabled: false,
55
- size: 'default',
56
- },
57
- };
58
-
59
- export default {
60
- component: BaseButton,
61
- argTypes: {
62
- size: {
63
- options: ['default', 'small'],
64
- control: { type: 'radio' },
65
- },
66
- },
67
- } as Meta;
@@ -1,59 +0,0 @@
1
- import classNames from 'classnames';
2
- import type { FC, AnchorHTMLAttributes, ButtonHTMLAttributes } from 'react';
3
-
4
- import type { LinkLike } from '#ui/types';
5
-
6
- import styles from './index.module.css';
7
-
8
- export type ButtonProps = (
9
- | AnchorHTMLAttributes<HTMLAnchorElement>
10
- | ButtonHTMLAttributes<HTMLButtonElement>
11
- ) & {
12
- kind?: 'neutral' | 'primary' | 'secondary' | 'special';
13
- size?: 'default' | 'small';
14
- disabled?: boolean;
15
- as?: LinkLike;
16
- };
17
-
18
- const BaseButton: FC<ButtonProps> = ({
19
- kind = 'primary',
20
- size = 'default',
21
- disabled = false,
22
- className,
23
- as: Component = 'a',
24
- ...props
25
- }) => {
26
- if ('href' in props && Component) {
27
- return (
28
- <Component
29
- role="button"
30
- href={disabled ? undefined : props.href}
31
- aria-disabled={disabled}
32
- className={classNames(
33
- styles.button,
34
- styles[kind],
35
- styles[size],
36
- className
37
- )}
38
- tabIndex={disabled ? -1 : 0}
39
- {...props}
40
- />
41
- );
42
- }
43
-
44
- return (
45
- <button
46
- disabled={disabled}
47
- className={classNames(
48
- styles.button,
49
- styles[kind],
50
- styles[size],
51
- className
52
- )}
53
- type="button"
54
- {...(props as ButtonHTMLAttributes<HTMLButtonElement>)}
55
- />
56
- );
57
- };
58
-
59
- export default BaseButton;
@@ -1,39 +0,0 @@
1
- import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
-
3
- import BaseCodeBox from '#ui/Common/BaseCodeBox';
4
-
5
- type Story = StoryObj<typeof BaseCodeBox>;
6
- type Meta = MetaObj<typeof BaseCodeBox>;
7
-
8
- const content = `const http = require('http');
9
-
10
- const hostname = '127.0.0.1';
11
- const port = 3000;
12
-
13
- const server = http.createServer((req, res) => {
14
- res.statusCode = 200;
15
- res.setHeader('Content-Type', 'text/plain');
16
- res.end('Hello World');
17
- });
18
-
19
- server.listen(port, hostname, () => {
20
- console.log(\`Server running at http://\${hostname}:\${port}/\`);
21
- });`;
22
-
23
- const args = {
24
- language: 'JavaScript (CJS)',
25
- children: <code>{content}</code>,
26
- };
27
-
28
- export const Default: Story = {
29
- args,
30
- };
31
-
32
- export const WithCopyButton: Story = {
33
- args: {
34
- ...args,
35
- showCopyButton: true,
36
- },
37
- };
38
-
39
- export default { component: BaseCodeBox } as Meta;
@@ -1,133 +0,0 @@
1
- 'use client';
2
-
3
- import {
4
- DocumentDuplicateIcon,
5
- CodeBracketIcon,
6
- } from '@heroicons/react/24/outline';
7
- import classNames from 'classnames';
8
- import type { FC, PropsWithChildren, ReactElement, ReactNode } from 'react';
9
- import { Fragment, isValidElement, useRef } from 'react';
10
-
11
- import BaseButton from '#ui/Common/BaseButton';
12
- import type { LinkLike } from '#ui/types';
13
-
14
- import styles from './index.module.css';
15
-
16
- // Transforms a code element with plain text content into a more structured
17
- // format for rendering with line numbers
18
- const transformCode = <T extends ReactElement<PropsWithChildren>>(
19
- code: T,
20
- language: string
21
- ): ReactElement<HTMLElement> | T => {
22
- if (!isValidElement(code)) {
23
- // Early return when the `CodeBox` child is not a valid element since the
24
- // type is a ReactNode, and can assume any value
25
- return code;
26
- }
27
-
28
- const content = code.props?.children;
29
-
30
- if (code.type !== 'code' || typeof content !== 'string') {
31
- // There is no need to transform an element that is not a code element or
32
- // a content that is not a string
33
- return code;
34
- }
35
-
36
- // Note that since we use `.split` we will have an extra entry
37
- // being an empty string, so we need to remove it
38
- const lines = content.split('\n');
39
-
40
- const extraStyle = language.length === 0 ? { fontFamily: 'monospace' } : {};
41
-
42
- return (
43
- <code style={extraStyle}>
44
- {lines
45
- .flatMap((line, lineIndex) => {
46
- const columns = line.split(' ');
47
-
48
- return [
49
- <span key={lineIndex} className="line">
50
- {columns.map((column, columnIndex) => (
51
- <Fragment key={columnIndex}>
52
- <span>{column}</span>
53
- {columnIndex < columns.length - 1 && <span> </span>}
54
- </Fragment>
55
- ))}
56
- </span>,
57
- // Add a break line so the text content is formatted correctly
58
- // when copying to clipboard
59
- '\n',
60
- ];
61
- })
62
- // Here we remove that empty line from before and
63
- // the last flatMap entry which is an `\n`
64
- .slice(0, -2)}
65
- </code>
66
- );
67
- };
68
-
69
- interface CodeBoxProps {
70
- language: string;
71
- className?: string;
72
- onCopy: (text: string, message: ReactNode) => void;
73
- as?: LinkLike;
74
- copyText: string;
75
- copiedText: string;
76
- showCopyButton?: boolean;
77
- }
78
-
79
- const BaseCodeBox: FC<PropsWithChildren<CodeBoxProps>> = ({
80
- children,
81
- language,
82
- className,
83
- onCopy,
84
- copiedText,
85
- copyText,
86
- as = 'a',
87
- showCopyButton = true,
88
- }: PropsWithChildren<CodeBoxProps>) => {
89
- const containerRef = useRef<HTMLPreElement>(null);
90
-
91
- const handleCopy = (): void => {
92
- const text = containerRef.current?.textContent;
93
- if (text) {
94
- onCopy(
95
- text,
96
- <div className={styles.notification}>
97
- <CodeBracketIcon className={styles.icon} />
98
- {copiedText}
99
- </div>
100
- );
101
- }
102
- };
103
-
104
- return (
105
- <div className={styles.root}>
106
- <pre
107
- ref={containerRef}
108
- className={classNames(styles.content, className)}
109
- tabIndex={0}
110
- >
111
- {transformCode(children as ReactElement<PropsWithChildren>, language)}
112
- </pre>
113
- {language && (
114
- <div className={styles.footer}>
115
- <span className={styles.language}>{language}</span>
116
- {showCopyButton && (
117
- <BaseButton
118
- as={as}
119
- className={styles.action}
120
- kind="neutral"
121
- onClick={handleCopy}
122
- >
123
- <DocumentDuplicateIcon className={styles.icon} />
124
- {copyText}
125
- </BaseButton>
126
- )}
127
- </div>
128
- )}
129
- </div>
130
- );
131
- };
132
-
133
- export default BaseCodeBox;
@@ -1,38 +0,0 @@
1
- import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
-
3
- import BaseCrossLink from '#ui/Common/BaseCrossLink';
4
-
5
- type Story = StoryObj<typeof BaseCrossLink>;
6
- type Meta = MetaObj<typeof BaseCrossLink>;
7
-
8
- export const Prev: Story = {
9
- args: {
10
- type: 'previous',
11
- text: 'How to install Node.js',
12
- link: 'https://nodejs.dev/en/learn/how-to-install-nodejs/',
13
- },
14
- decorators: [
15
- Story => (
16
- <div className="w-[305px]">
17
- <Story />
18
- </div>
19
- ),
20
- ],
21
- };
22
-
23
- export const Next: Story = {
24
- args: {
25
- type: 'next',
26
- text: 'How much JavaScript do you need to know to use Node.js?',
27
- link: 'https://nodejs.dev/en/learn/how-much-javascript-do-you-need-to-know-to-use-nodejs/',
28
- },
29
- decorators: [
30
- Story => (
31
- <div className="w-[305px]">
32
- <Story />
33
- </div>
34
- ),
35
- ],
36
- };
37
-
38
- export default { component: BaseCrossLink } as Meta;
@@ -1,46 +0,0 @@
1
- import classNames from 'classnames';
2
- import type { FC } from 'react';
3
-
4
- import PrevNextArrow from '#ui/Common/BasePagination/PrevNextArrow';
5
- import type { LinkLike, FormattedMessage } from '#ui/types';
6
-
7
- import styles from './index.module.css';
8
-
9
- export type CrossLinkProps = {
10
- type: 'previous' | 'next';
11
- text: FormattedMessage;
12
- label: string;
13
- link: string;
14
- as: LinkLike;
15
- };
16
-
17
- const BaseCrossLink: FC<CrossLinkProps> = ({
18
- type,
19
- label,
20
- text,
21
- link,
22
- as: Component = 'a',
23
- }) => {
24
- return (
25
- <Component className={styles.crossLink} href={link}>
26
- <span
27
- className={classNames(styles.header, {
28
- [styles.reverse]: type === 'next',
29
- })}
30
- >
31
- <PrevNextArrow className={styles.icon} type={type} />
32
- {label}
33
- </span>
34
-
35
- <span
36
- className={classNames(styles.content, {
37
- [styles.reverse]: type === 'next',
38
- })}
39
- >
40
- {text}
41
- </span>
42
- </Component>
43
- );
44
- };
45
-
46
- export default BaseCrossLink;
@@ -1,34 +0,0 @@
1
- import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
-
3
- import BaseLinkTabs from '#ui/Common/BaseLinkTabs';
4
-
5
- type Story = StoryObj<typeof BaseLinkTabs>;
6
- type Meta = MetaObj<typeof BaseLinkTabs>;
7
-
8
- export const Default: Story = {
9
- args: {
10
- label: 'Select Tab',
11
- tabs: [
12
- {
13
- key: 'package',
14
- label: 'Package Manager',
15
- link: '/package-manager',
16
- },
17
- {
18
- key: 'prebuilt',
19
- label: 'Prebuilt Installer',
20
- link: '/prebuilt-installer',
21
- },
22
- {
23
- key: 'source',
24
- label: 'Source Code',
25
- link: '/source-code',
26
- },
27
- ],
28
- activeTab: 'prebuilt',
29
- children: <p>Tab content goes here</p>,
30
- onSelect: console.log,
31
- },
32
- };
33
-
34
- export default { component: BaseLinkTabs } as Meta;
@@ -1,53 +0,0 @@
1
- import type { FC, PropsWithChildren } from 'react';
2
-
3
- import Select from '#ui/Common/Select';
4
- import type { LinkLike } from '#ui/types';
5
-
6
- import styles from './index.module.css';
7
-
8
- type LinkTab = { key: string; label: string; link: string };
9
-
10
- export type LinkTabsProps = PropsWithChildren<{
11
- label?: string;
12
- tabs: Array<LinkTab>;
13
- activeTab: string;
14
- as?: LinkLike;
15
- onSelect: (value: string) => void;
16
- }>;
17
-
18
- const BaseLinkTabs: FC<LinkTabsProps> = ({
19
- tabs,
20
- label,
21
- activeTab,
22
- children,
23
- as: Component = 'a',
24
- onSelect,
25
- }) => (
26
- <>
27
- <div className={styles.tabsList}>
28
- {tabs.map(tab => (
29
- <Component
30
- key={tab.key}
31
- href={tab.link}
32
- className={styles.tabsTrigger}
33
- data-state={tab.key === activeTab ? 'active' : 'inactive'}
34
- >
35
- {tab.label}
36
- </Component>
37
- ))}
38
- </div>
39
-
40
- <div className={styles.tabsSelect}>
41
- <Select
42
- label={label}
43
- defaultValue={tabs.find(tab => tab.key === activeTab)?.link}
44
- values={tabs.map(tab => ({ label: tab.label, value: tab.link }))}
45
- onChange={onSelect}
46
- />
47
- </div>
48
-
49
- {children}
50
- </>
51
- );
52
-
53
- export default BaseLinkTabs;
@@ -1,10 +0,0 @@
1
- import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
-
3
- import Ellipsis from '#ui/Common/BasePagination/Ellipsis';
4
-
5
- type Story = StoryObj<typeof Ellipsis>;
6
- type Meta = MetaObj<typeof Ellipsis>;
7
-
8
- export const Default: Story = {};
9
-
10
- export default { component: Ellipsis } as Meta;
@@ -1,11 +0,0 @@
1
- import type { FC } from 'react';
2
-
3
- import styles from './index.module.css';
4
-
5
- const Ellipsis: FC = () => (
6
- <span aria-hidden="true" className={styles.ellipsis}>
7
- ...
8
- </span>
9
- );
10
-
11
- export default Ellipsis;
@@ -1,58 +0,0 @@
1
- import { describe, it } from 'node:test';
2
- import assert from 'node:assert/strict';
3
-
4
- import { render, screen } from '@testing-library/react';
5
-
6
- import { isVisible } from '../../../../../../tests/utilities.mjs';
7
-
8
- import PaginationListItem from '#ui/Common/BasePagination/PaginationListItem';
9
-
10
- function renderPaginationListItem({
11
- url,
12
- pageNumber,
13
- currentPage,
14
- totalPages,
15
- }) {
16
- render(
17
- <PaginationListItem
18
- url={url}
19
- pageNumber={pageNumber}
20
- currentPage={currentPage}
21
- totalPages={totalPages}
22
- />
23
- );
24
- }
25
-
26
- describe('PaginationListItem', () => {
27
- it('Renders the list item correctly, including the corresponding ARIA attributes', () => {
28
- const pageNumber = 1;
29
- const totalPages = 10;
30
- const url = 'http://';
31
-
32
- renderPaginationListItem({
33
- url,
34
- currentPage: 1,
35
- pageNumber,
36
- totalPages,
37
- });
38
-
39
- const listItem = screen.getByRole('listitem');
40
-
41
- assert.ok(isVisible());
42
- assert.equal(listItem.getAttribute('aria-posinset'), String(pageNumber));
43
- assert.equal(listItem.getAttribute('aria-setsize'), String(totalPages));
44
-
45
- assert.equal(screen.getByRole('link').getAttribute('href'), url);
46
- });
47
-
48
- it('Assigns aria-current="page" attribute to the link when the current page is equal to the page number', () => {
49
- renderPaginationListItem({
50
- url: 'http://',
51
- currentPage: 1,
52
- pageNumber: 1,
53
- totalPages: 10,
54
- });
55
-
56
- assert.equal(screen.getByRole('link').getAttribute('aria-current'), 'page');
57
- });
58
- });
@@ -1,40 +0,0 @@
1
- import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
-
3
- import PaginationListItem from '#ui/Common/BasePagination/PaginationListItem';
4
-
5
- type Story = StoryObj<typeof PaginationListItem>;
6
- type Meta = MetaObj<typeof PaginationListItem>;
7
-
8
- export const Default: Story = {
9
- args: {
10
- url: '#',
11
- pageNumber: 1,
12
- currentPage: 2,
13
- totalPages: 2,
14
- },
15
- decorators: [
16
- Story => (
17
- <ul className="list-none">
18
- <Story />
19
- </ul>
20
- ),
21
- ],
22
- };
23
-
24
- export const CurrentPage: Story = {
25
- args: {
26
- url: '#',
27
- pageNumber: 1,
28
- currentPage: 1,
29
- totalPages: 1,
30
- },
31
- decorators: [
32
- Story => (
33
- <ul className="list-none">
34
- <Story />
35
- </ul>
36
- ),
37
- ],
38
- };
39
-
40
- export default { component: PaginationListItem } as Meta;