@node-core/ui-components 1.0.1-ed840c2c5b3a7f7a58ec6d75280c2b34129fb5dc → 1.0.1-f1580a0a3365d3d4d0236b80ce9eff447d2890dd

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 (270) 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 +5 -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/NoScriptSelect/index.js +10 -0
  63. package/Common/Select/StatelessSelect/index.js +31 -0
  64. package/Common/Select/index.js +46 -0
  65. package/Common/Select/index.module.css +2 -161
  66. package/Common/Separator/index.js +7 -0
  67. package/Common/Separator/index.module.css +2 -16
  68. package/Common/Skeleton/index.js +18 -0
  69. package/Common/Skeleton/index.module.css +2 -30
  70. package/Common/Tabs/index.js +6 -0
  71. package/Common/Tabs/index.module.css +2 -54
  72. package/Common/ThemeToggle/index.js +7 -0
  73. package/Common/ThemeToggle/index.module.css +2 -15
  74. package/Common/Tooltip/index.js +8 -0
  75. package/Common/Tooltip/index.module.css +2 -43
  76. package/Containers/Article/index.js +4 -0
  77. package/Containers/Article/index.module.css +2 -70
  78. package/Containers/Footer/index.js +21 -0
  79. package/Containers/Footer/index.module.css +2 -46
  80. package/Containers/MetaBar/index.js +12 -0
  81. package/Containers/MetaBar/index.module.css +2 -91
  82. package/Containers/NavBar/NavItem/index.js +7 -0
  83. package/Containers/NavBar/NavItem/index.module.css +2 -60
  84. package/Containers/NavBar/index.js +18 -0
  85. package/Containers/NavBar/index.module.css +2 -125
  86. package/Containers/Sidebar/ProgressionIcon/index.js +3 -0
  87. package/Containers/Sidebar/SidebarGroup/index.js +9 -0
  88. package/Containers/Sidebar/SidebarGroup/index.module.css +2 -26
  89. package/Containers/Sidebar/SidebarItem/index.js +11 -0
  90. package/Containers/Sidebar/SidebarItem/index.module.css +2 -35
  91. package/Containers/Sidebar/index.js +15 -0
  92. package/Containers/Sidebar/index.module.css +2 -31
  93. package/Icons/HexagonGrid.js +3 -0
  94. package/Icons/InstallationMethod/Choco.js +3 -0
  95. package/Icons/InstallationMethod/Devbox.js +3 -0
  96. package/Icons/InstallationMethod/Docker.js +3 -0
  97. package/Icons/InstallationMethod/FNM.js +3 -0
  98. package/Icons/InstallationMethod/Homebrew.js +3 -0
  99. package/Icons/InstallationMethod/N.js +5 -0
  100. package/Icons/InstallationMethod/NVM.js +3 -0
  101. package/Icons/InstallationMethod/Volta.js +3 -0
  102. package/Icons/InstallationMethod/{index.ts → index.js} +0 -1
  103. package/Icons/Logos/JsWhite.js +3 -0
  104. package/Icons/Logos/Nodejs.js +12 -0
  105. package/Icons/Logos/index.js +3 -0
  106. package/Icons/OperatingSystem/AIX.js +3 -0
  107. package/Icons/OperatingSystem/Apple.js +3 -0
  108. package/Icons/OperatingSystem/Linux.js +3 -0
  109. package/Icons/OperatingSystem/Microsoft.js +3 -0
  110. package/Icons/OperatingSystem/{index.ts → index.js} +0 -1
  111. package/Icons/PackageManager/Npm.js +3 -0
  112. package/Icons/PackageManager/Pnpm.js +3 -0
  113. package/Icons/PackageManager/Yarn.js +3 -0
  114. package/Icons/PackageManager/{index.ts → index.js} +0 -1
  115. package/Icons/Social/Bluesky.js +3 -0
  116. package/Icons/Social/Discord.js +3 -0
  117. package/Icons/Social/GitHub.js +3 -0
  118. package/Icons/Social/LinkedIn.js +3 -0
  119. package/Icons/Social/Mastodon.js +3 -0
  120. package/Icons/Social/Slack.js +3 -0
  121. package/Icons/Social/X.js +3 -0
  122. package/Icons/Social/{index.ts → index.js} +0 -1
  123. package/MDX/CodeTabs.js +29 -0
  124. package/Providers/NotificationProvider/index.js +16 -0
  125. package/Providers/NotificationProvider/index.module.css +2 -0
  126. package/package.json +10 -55
  127. package/stylelint/one-utility-class-per-line.mjs +34 -50
  128. package/stylelint/utils.mjs +19 -25
  129. package/styles/index.css +2 -38
  130. package/types.js +1 -0
  131. package/util/array.js +2 -0
  132. package/Common/AlertBox/index.stories.tsx +0 -73
  133. package/Common/AlertBox/index.tsx +0 -24
  134. package/Common/AvatarGroup/Avatar/index.stories.tsx +0 -22
  135. package/Common/AvatarGroup/Avatar/index.tsx +0 -67
  136. package/Common/AvatarGroup/Overlay/index.stories.tsx +0 -33
  137. package/Common/AvatarGroup/Overlay/index.tsx +0 -37
  138. package/Common/AvatarGroup/__tests__/index.test.jsx +0 -55
  139. package/Common/AvatarGroup/index.stories.tsx +0 -56
  140. package/Common/AvatarGroup/index.tsx +0 -83
  141. package/Common/Badge/index.stories.tsx +0 -38
  142. package/Common/Badge/index.tsx +0 -35
  143. package/Common/BadgeGroup/index.stories.tsx +0 -35
  144. package/Common/BadgeGroup/index.tsx +0 -35
  145. package/Common/Banner/index.stories.tsx +0 -29
  146. package/Common/Banner/index.tsx +0 -18
  147. package/Common/BaseActiveLink/__tests__/index.test.jsx +0 -52
  148. package/Common/BaseActiveLink/index.tsx +0 -34
  149. package/Common/BaseButton/index.stories.tsx +0 -67
  150. package/Common/BaseButton/index.tsx +0 -59
  151. package/Common/BaseCodeBox/index.stories.tsx +0 -39
  152. package/Common/BaseCodeBox/index.tsx +0 -122
  153. package/Common/BaseCrossLink/index.stories.tsx +0 -38
  154. package/Common/BaseCrossLink/index.tsx +0 -46
  155. package/Common/BaseLinkTabs/index.stories.tsx +0 -34
  156. package/Common/BaseLinkTabs/index.tsx +0 -53
  157. package/Common/BasePagination/Ellipsis/index.stories.tsx +0 -10
  158. package/Common/BasePagination/Ellipsis/index.tsx +0 -11
  159. package/Common/BasePagination/PaginationListItem/__tests__/index.test.jsx +0 -58
  160. package/Common/BasePagination/PaginationListItem/index.stories.tsx +0 -40
  161. package/Common/BasePagination/PaginationListItem/index.tsx +0 -39
  162. package/Common/BasePagination/PrevNextArrow.tsx +0 -15
  163. package/Common/BasePagination/__tests__/index.test.jsx +0 -180
  164. package/Common/BasePagination/index.stories.tsx +0 -67
  165. package/Common/BasePagination/index.tsx +0 -77
  166. package/Common/BasePagination/useGetPageElements.tsx +0 -132
  167. package/Common/Blockquote/index.stories.tsx +0 -45
  168. package/Common/Blockquote/index.tsx +0 -11
  169. package/Common/Breadcrumbs/BreadcrumbHomeLink/index.tsx +0 -30
  170. package/Common/Breadcrumbs/BreadcrumbItem/index.tsx +0 -42
  171. package/Common/Breadcrumbs/BreadcrumbLink/index.tsx +0 -37
  172. package/Common/Breadcrumbs/BreadcrumbRoot/index.tsx +0 -20
  173. package/Common/Breadcrumbs/BreadcrumbTruncatedItem/index.tsx +0 -9
  174. package/Common/Breadcrumbs/index.stories.tsx +0 -94
  175. package/Common/Breadcrumbs/index.tsx +0 -81
  176. package/Common/CodeTabs/index.stories.tsx +0 -73
  177. package/Common/CodeTabs/index.tsx +0 -16
  178. package/Common/DataTag/index.stories.tsx +0 -40
  179. package/Common/DataTag/index.tsx +0 -39
  180. package/Common/GlowingBackdrop/index.stories.tsx +0 -10
  181. package/Common/GlowingBackdrop/index.tsx +0 -13
  182. package/Common/LanguageDropDown/index.stories.tsx +0 -19
  183. package/Common/LanguageDropDown/index.tsx +0 -56
  184. package/Common/Modal/index.stories.tsx +0 -32
  185. package/Common/Modal/index.tsx +0 -48
  186. package/Common/NodejsLogo/index.stories.tsx +0 -14
  187. package/Common/NodejsLogo/index.tsx +0 -26
  188. package/Common/Notification/index.stories.tsx +0 -36
  189. package/Common/Notification/index.tsx +0 -34
  190. package/Common/Preview/index.stories.tsx +0 -44
  191. package/Common/Preview/index.tsx +0 -25
  192. package/Common/ProgressionSidebar/ProgressionSidebarGroup/index.module.css +0 -47
  193. package/Common/ProgressionSidebar/ProgressionSidebarGroup/index.tsx +0 -35
  194. package/Common/ProgressionSidebar/ProgressionSidebarIcon/index.tsx +0 -16
  195. package/Common/ProgressionSidebar/ProgressionSidebarItem/index.module.css +0 -39
  196. package/Common/ProgressionSidebar/ProgressionSidebarItem/index.tsx +0 -32
  197. package/Common/ProgressionSidebar/index.module.css +0 -30
  198. package/Common/ProgressionSidebar/index.stories.tsx +0 -79
  199. package/Common/ProgressionSidebar/index.tsx +0 -59
  200. package/Common/Select/__tests__/index.test.jsx +0 -67
  201. package/Common/Select/index.stories.tsx +0 -111
  202. package/Common/Select/index.tsx +0 -187
  203. package/Common/Separator/index.stories.tsx +0 -32
  204. package/Common/Separator/index.tsx +0 -27
  205. package/Common/Skeleton/index.tsx +0 -39
  206. package/Common/Tabs/__tests__/index.test.jsx +0 -52
  207. package/Common/Tabs/index.stories.tsx +0 -50
  208. package/Common/Tabs/index.tsx +0 -54
  209. package/Common/ThemeToggle/__tests__/index.test.jsx +0 -35
  210. package/Common/ThemeToggle/index.stories.tsx +0 -10
  211. package/Common/ThemeToggle/index.tsx +0 -15
  212. package/Common/Tooltip/index.stories.tsx +0 -73
  213. package/Common/Tooltip/index.tsx +0 -48
  214. package/Containers/Article/index.stories.tsx +0 -39
  215. package/Containers/Article/index.tsx +0 -9
  216. package/Containers/Footer/index.stories.tsx +0 -27
  217. package/Containers/Footer/index.tsx +0 -95
  218. package/Containers/MetaBar/__tests__/index.test.jsx +0 -63
  219. package/Containers/MetaBar/index.stories.tsx +0 -80
  220. package/Containers/MetaBar/index.tsx +0 -72
  221. package/Containers/NavBar/NavItem/index.stories.tsx +0 -38
  222. package/Containers/NavBar/NavItem/index.tsx +0 -44
  223. package/Containers/NavBar/index.stories.tsx +0 -45
  224. package/Containers/NavBar/index.tsx +0 -94
  225. package/Containers/Sidebar/SidebarGroup/index.stories.tsx +0 -36
  226. package/Containers/Sidebar/SidebarGroup/index.tsx +0 -30
  227. package/Containers/Sidebar/SidebarItem/index.stories.tsx +0 -15
  228. package/Containers/Sidebar/SidebarItem/index.tsx +0 -26
  229. package/Containers/Sidebar/index.stories.tsx +0 -84
  230. package/Containers/Sidebar/index.tsx +0 -58
  231. package/Icons/HexagonGrid.stories.tsx +0 -10
  232. package/Icons/HexagonGrid.tsx +0 -1434
  233. package/Icons/InstallationMethod/Choco.tsx +0 -78
  234. package/Icons/InstallationMethod/Devbox.tsx +0 -21
  235. package/Icons/InstallationMethod/Docker.tsx +0 -20
  236. package/Icons/InstallationMethod/FNM.tsx +0 -132
  237. package/Icons/InstallationMethod/Homebrew.tsx +0 -69
  238. package/Icons/InstallationMethod/N.tsx +0 -32
  239. package/Icons/InstallationMethod/NVM.tsx +0 -63
  240. package/Icons/InstallationMethod/Volta.tsx +0 -34
  241. package/Icons/Logos/JsGreen.tsx +0 -24
  242. package/Icons/Logos/JsWhite.tsx +0 -37
  243. package/Icons/Logos/Nodejs.tsx +0 -188
  244. package/Icons/Logos/NodejsStackedBlack.tsx +0 -98
  245. package/Icons/Logos/NodejsStackedDark.tsx +0 -124
  246. package/Icons/Logos/NodejsStackedLight.tsx +0 -123
  247. package/Icons/Logos/NodejsStackedWhite.tsx +0 -98
  248. package/Icons/Logos/index.ts +0 -17
  249. package/Icons/OperatingSystem/AIX.tsx +0 -46
  250. package/Icons/OperatingSystem/Apple.tsx +0 -23
  251. package/Icons/OperatingSystem/Linux.tsx +0 -969
  252. package/Icons/OperatingSystem/Microsoft.tsx +0 -19
  253. package/Icons/PackageManager/Npm.tsx +0 -21
  254. package/Icons/PackageManager/Pnpm.tsx +0 -22
  255. package/Icons/PackageManager/Yarn.tsx +0 -22
  256. package/Icons/Social/Bluesky.tsx +0 -19
  257. package/Icons/Social/Discord.tsx +0 -20
  258. package/Icons/Social/GitHub.tsx +0 -16
  259. package/Icons/Social/LinkedIn.tsx +0 -16
  260. package/Icons/Social/Mastodon.tsx +0 -36
  261. package/Icons/Social/Slack.tsx +0 -31
  262. package/Icons/Social/X.tsx +0 -16
  263. package/MDX/CodeTabs.tsx +0 -47
  264. package/stylelint/__tests__/index.test.mjs +0 -80
  265. package/styles/animations.css +0 -47
  266. package/styles/base.css +0 -17
  267. package/styles/effects.css +0 -12
  268. package/styles/markdown.css +0 -173
  269. package/styles/theme.css +0 -175
  270. package/types.ts +0 -25
@@ -1,83 +0,0 @@
1
- 'use client';
2
-
3
- import classNames from 'classnames';
4
- import type { FC } from 'react';
5
- import { useState, useMemo } from 'react';
6
-
7
- import type { AvatarProps } from '#ui/Common/AvatarGroup/Avatar';
8
- import Avatar from '#ui/Common/AvatarGroup/Avatar';
9
- import avatarstyles from '#ui/Common/AvatarGroup/Avatar/index.module.css';
10
- import AvatarOverlay from '#ui/Common/AvatarGroup/Overlay';
11
- import Tooltip from '#ui/Common/Tooltip';
12
- import type { LinkLike } from '#ui/types';
13
-
14
- import styles from './index.module.css';
15
-
16
- type AvatarGroupProps = {
17
- avatars: Array<AvatarProps>;
18
- limit?: number;
19
- isExpandable?: boolean;
20
- size?: AvatarProps['size'];
21
- container?: HTMLElement;
22
- as?: LinkLike;
23
- };
24
-
25
- const AvatarGroup: FC<AvatarGroupProps> = ({
26
- avatars,
27
- limit = 10,
28
- isExpandable = true,
29
- size = 'small',
30
- container,
31
- as,
32
- }) => {
33
- const [showMore, setShowMore] = useState(false);
34
-
35
- const renderAvatars = useMemo(
36
- () => avatars.slice(0, showMore ? avatars.length : limit),
37
- [avatars, limit, showMore]
38
- );
39
-
40
- const handleShowMoreClick = isExpandable
41
- ? () => setShowMore(prev => !prev)
42
- : undefined;
43
-
44
- return (
45
- <div className={classNames(styles.avatarGroup, styles[size])}>
46
- {renderAvatars.map(avatar => (
47
- <Tooltip
48
- key={avatar.nickname}
49
- asChild
50
- container={container}
51
- content={<AvatarOverlay {...avatar} as={as} />}
52
- >
53
- <Avatar
54
- {...avatar}
55
- size={size}
56
- className={classNames({
57
- 'cursor-pointer': avatar.url,
58
- 'pointer-events-none': !avatar.url,
59
- })}
60
- as={as}
61
- />
62
- </Tooltip>
63
- ))}
64
-
65
- {avatars.length > limit && (
66
- <span
67
- onClick={handleShowMoreClick}
68
- className={classNames(
69
- avatarstyles.avatar,
70
- avatarstyles[size],
71
- 'cursor-pointer'
72
- )}
73
- >
74
- <span className={avatarstyles.item}>
75
- {`${showMore ? '-' : '+'}${avatars.length - limit}`}
76
- </span>
77
- </span>
78
- )}
79
- </div>
80
- );
81
- };
82
-
83
- export default AvatarGroup;
@@ -1,38 +0,0 @@
1
- import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
-
3
- import Badge from '#ui/Common/Badge';
4
-
5
- type Story = StoryObj<typeof Badge>;
6
- type Meta = MetaObj<typeof Badge>;
7
-
8
- export const Default: Story = {
9
- args: {
10
- kind: 'default',
11
- },
12
- };
13
-
14
- export const Error: Story = {
15
- args: {
16
- kind: 'error',
17
- },
18
- };
19
-
20
- export const Warning: Story = {
21
- args: {
22
- kind: 'warning',
23
- },
24
- };
25
-
26
- export const Small: Story = {
27
- args: {
28
- size: 'small',
29
- },
30
- };
31
-
32
- export const Medium: Story = {
33
- args: {
34
- size: 'medium',
35
- },
36
- };
37
-
38
- export default { component: Badge, args: { children: 'Badge' } } as Meta;
@@ -1,35 +0,0 @@
1
- import classNames from 'classnames';
2
- import type { FC, HTMLAttributes, PropsWithChildren } from 'react';
3
-
4
- import styles from './index.module.css';
5
-
6
- type BadgeKind = 'default' | 'warning' | 'error';
7
-
8
- type BadgeProps = HTMLAttributes<HTMLSpanElement> & {
9
- size?: 'small' | 'medium';
10
- kind?: BadgeKind;
11
- };
12
-
13
- const Badge: FC<PropsWithChildren<BadgeProps>> = ({
14
- kind = 'default',
15
- size = 'medium',
16
- className,
17
- children,
18
- ...props
19
- }) => {
20
- return (
21
- <span
22
- className={classNames(
23
- styles.badge,
24
- styles[kind],
25
- styles[size],
26
- className
27
- )}
28
- {...props}
29
- >
30
- {children}
31
- </span>
32
- );
33
- };
34
-
35
- export default Badge;
@@ -1,35 +0,0 @@
1
- import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
-
3
- import BadgeGroup from '#ui/Common/BadgeGroup';
4
-
5
- type Story = StoryObj<typeof BadgeGroup>;
6
- type Meta = MetaObj<typeof BadgeGroup>;
7
-
8
- export const Default: Story = {
9
- args: {
10
- href: '/',
11
- children: 'OpenJS Foundation Certification 2023',
12
- kind: 'default',
13
- badgeText: 'New',
14
- },
15
- };
16
-
17
- export const Error: Story = {
18
- args: {
19
- href: '/',
20
- children: 'OpenJS Foundation Certification 2023',
21
- kind: 'error',
22
- badgeText: 'New',
23
- },
24
- };
25
-
26
- export const Warning: Story = {
27
- args: {
28
- href: '/',
29
- children: 'OpenJS Foundation Certification 2023',
30
- kind: 'warning',
31
- badgeText: 'New',
32
- },
33
- };
34
-
35
- export default { component: BadgeGroup } as Meta;
@@ -1,35 +0,0 @@
1
- import ArrowRightIcon from '@heroicons/react/24/solid/ArrowRightIcon';
2
- import type { ComponentProps, FC, PropsWithChildren } from 'react';
3
-
4
- import Badge from '#ui/Common/Badge';
5
- import type { LinkLike } from '#ui/types';
6
-
7
- import styles from './index.module.css';
8
-
9
- type BadgeGroupKind = 'default' | 'warning' | 'error';
10
-
11
- type BadgeGroupProps = {
12
- kind?: BadgeGroupKind;
13
- badgeText?: string;
14
- as: LinkLike;
15
- } & ComponentProps<LinkLike>;
16
-
17
- const BadgeGroup: FC<PropsWithChildren<BadgeGroupProps>> = ({
18
- kind = 'default',
19
- badgeText,
20
- children,
21
- as: Component = 'a',
22
- ...args
23
- }) => (
24
- <Component className={`${styles.wrapper} ${styles[kind]}`} {...args}>
25
- {badgeText && (
26
- <Badge kind={kind} className={styles.badge}>
27
- {badgeText}
28
- </Badge>
29
- )}
30
- <span className={styles.message}>{children}</span>
31
- {args.href && <ArrowRightIcon className={styles.icon} />}
32
- </Component>
33
- );
34
-
35
- export default BadgeGroup;
@@ -1,29 +0,0 @@
1
- import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
-
3
- import Banner from '#ui/Common/Banner';
4
-
5
- type Story = StoryObj<typeof Banner>;
6
- type Meta = MetaObj<typeof Banner>;
7
-
8
- export const Default: Story = {
9
- args: {
10
- children: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
11
- type: 'default',
12
- },
13
- };
14
-
15
- export const Error: Story = {
16
- args: {
17
- children: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
18
- type: 'error',
19
- },
20
- };
21
-
22
- export const Warning: Story = {
23
- args: {
24
- children: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
25
- type: 'warning',
26
- },
27
- };
28
-
29
- export default { component: Banner } as Meta;
@@ -1,18 +0,0 @@
1
- import type { FC, PropsWithChildren } from 'react';
2
-
3
- import styles from './index.module.css';
4
-
5
- export type BannerProps = {
6
- type?: 'default' | 'warning' | 'error';
7
- };
8
-
9
- const Banner: FC<PropsWithChildren<BannerProps>> = ({
10
- type = 'default',
11
- children,
12
- }) => (
13
- <div className={`${styles.banner} ${styles[type] || styles.default}`}>
14
- {children}
15
- </div>
16
- );
17
-
18
- export default Banner;
@@ -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,122 +0,0 @@
1
- 'use client';
2
-
3
- import { DocumentDuplicateIcon } from '@heroicons/react/24/outline';
4
- import classNames from 'classnames';
5
- import type { FC, PropsWithChildren, ReactElement } from 'react';
6
- import { Fragment, isValidElement, useRef } from 'react';
7
-
8
- import BaseButton from '#ui/Common/BaseButton';
9
- import type { LinkLike } from '#ui/types';
10
-
11
- import styles from './index.module.css';
12
-
13
- // Transforms a code element with plain text content into a more structured
14
- // format for rendering with line numbers
15
- const transformCode = <T extends ReactElement<PropsWithChildren>>(
16
- code: T,
17
- language: string
18
- ): ReactElement<HTMLElement> | T => {
19
- if (!isValidElement(code)) {
20
- // Early return when the `CodeBox` child is not a valid element since the
21
- // type is a ReactNode, and can assume any value
22
- return code;
23
- }
24
-
25
- const content = code.props?.children;
26
-
27
- if (code.type !== 'code' || typeof content !== 'string') {
28
- // There is no need to transform an element that is not a code element or
29
- // a content that is not a string
30
- return code;
31
- }
32
-
33
- // Note that since we use `.split` we will have an extra entry
34
- // being an empty string, so we need to remove it
35
- const lines = content.split('\n');
36
-
37
- const extraStyle = language.length === 0 ? { fontFamily: 'monospace' } : {};
38
-
39
- return (
40
- <code style={extraStyle}>
41
- {lines
42
- .flatMap((line, lineIndex) => {
43
- const columns = line.split(' ');
44
-
45
- return [
46
- <span key={lineIndex} className="line">
47
- {columns.map((column, columnIndex) => (
48
- <Fragment key={columnIndex}>
49
- <span>{column}</span>
50
- {columnIndex < columns.length - 1 && <span> </span>}
51
- </Fragment>
52
- ))}
53
- </span>,
54
- // Add a break line so the text content is formatted correctly
55
- // when copying to clipboard
56
- '\n',
57
- ];
58
- })
59
- // Here we remove that empty line from before and
60
- // the last flatMap entry which is an `\n`
61
- .slice(0, -2)}
62
- </code>
63
- );
64
- };
65
-
66
- interface CodeBoxProps {
67
- language: string;
68
- className?: string;
69
- onCopy: (text: string) => void;
70
- as?: LinkLike;
71
- buttonText: string;
72
- showCopyButton?: boolean;
73
- }
74
-
75
- const BaseCodeBox: FC<PropsWithChildren<CodeBoxProps>> = ({
76
- children,
77
- language,
78
- className,
79
- onCopy,
80
- buttonText,
81
- as = 'a',
82
- showCopyButton = true,
83
- }: PropsWithChildren<CodeBoxProps>) => {
84
- const containerRef = useRef<HTMLPreElement>(null);
85
-
86
- const handleCopy = (): void => {
87
- const text = containerRef.current?.textContent;
88
- if (text) {
89
- onCopy(text);
90
- }
91
- };
92
-
93
- return (
94
- <div className={styles.root}>
95
- <pre
96
- ref={containerRef}
97
- className={classNames(styles.content, className)}
98
- tabIndex={0}
99
- >
100
- {transformCode(children as ReactElement<PropsWithChildren>, language)}
101
- </pre>
102
- {language && (
103
- <div className={styles.footer}>
104
- <span className={styles.language}>{language}</span>
105
- {showCopyButton && (
106
- <BaseButton
107
- as={as}
108
- className={styles.action}
109
- kind="neutral"
110
- onClick={handleCopy}
111
- >
112
- <DocumentDuplicateIcon className={styles.icon} />
113
- {buttonText}
114
- </BaseButton>
115
- )}
116
- </div>
117
- )}
118
- </div>
119
- );
120
- };
121
-
122
- 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;