@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.
- package/Common/AlertBox/index.js +5 -0
- package/Common/AlertBox/index.module.css +2 -76
- package/Common/AvatarGroup/Avatar/index.js +11 -0
- package/Common/AvatarGroup/Avatar/index.module.css +2 -40
- package/Common/AvatarGroup/Overlay/index.js +6 -0
- package/Common/AvatarGroup/Overlay/index.module.css +2 -31
- package/Common/AvatarGroup/index.js +21 -0
- package/Common/AvatarGroup/index.module.css +2 -21
- package/Common/Badge/index.js +5 -0
- package/Common/Badge/index.module.css +2 -38
- package/Common/BadgeGroup/index.js +6 -0
- package/Common/BadgeGroup/index.module.css +2 -77
- package/Common/Banner/index.js +4 -0
- package/Common/Banner/index.module.css +2 -42
- package/Common/BaseActiveLink/index.js +14 -0
- package/Common/BaseButton/index.js +10 -0
- package/Common/BaseButton/index.module.css +2 -142
- package/Common/BaseCodeBox/index.js +50 -0
- package/Common/BaseCodeBox/index.module.css +2 -78
- package/Common/BaseCrossLink/index.js +12 -0
- package/Common/BaseCrossLink/index.module.css +2 -51
- package/Common/BaseLinkTabs/index.js +5 -0
- package/Common/BaseLinkTabs/index.module.css +2 -43
- package/Common/BasePagination/Ellipsis/index.js +4 -0
- package/Common/BasePagination/Ellipsis/index.module.css +2 -10
- package/Common/BasePagination/PaginationListItem/index.js +6 -0
- package/Common/BasePagination/PaginationListItem/index.module.css +2 -27
- package/Common/BasePagination/PrevNextArrow.js +7 -0
- package/Common/BasePagination/index.js +10 -0
- package/Common/BasePagination/index.module.css +2 -39
- package/Common/BasePagination/useGetPageElements.js +77 -0
- package/Common/Blockquote/index.js +4 -0
- package/Common/Blockquote/index.module.css +2 -29
- package/Common/Breadcrumbs/BreadcrumbHomeLink/index.js +9 -0
- package/Common/Breadcrumbs/BreadcrumbHomeLink/index.module.css +2 -5
- package/Common/Breadcrumbs/BreadcrumbItem/index.js +6 -0
- package/Common/Breadcrumbs/BreadcrumbItem/index.module.css +2 -41
- package/Common/Breadcrumbs/BreadcrumbLink/index.js +5 -0
- package/Common/Breadcrumbs/BreadcrumbLink/index.module.css +2 -22
- package/Common/Breadcrumbs/BreadcrumbRoot/index.js +4 -0
- package/Common/Breadcrumbs/BreadcrumbRoot/index.module.css +2 -9
- package/Common/Breadcrumbs/BreadcrumbTruncatedItem/index.js +4 -0
- package/Common/Breadcrumbs/index.js +22 -0
- package/Common/ChangeHistory/index.js +9 -0
- package/Common/ChangeHistory/index.module.css +2 -0
- package/Common/CodeTabs/index.js +5 -0
- package/Common/CodeTabs/index.module.css +2 -56
- package/Common/DataTag/index.js +18 -0
- package/Common/DataTag/index.module.css +2 -56
- package/Common/GlowingBackdrop/index.js +5 -0
- package/Common/GlowingBackdrop/index.module.css +2 -32
- package/Common/LanguageDropDown/index.js +11 -0
- package/Common/LanguageDropDown/index.module.css +2 -53
- package/Common/Modal/index.js +10 -0
- package/Common/Modal/index.module.css +2 -79
- package/Common/NodejsLogo/index.js +7 -0
- package/Common/NodejsLogo/index.module.css +2 -6
- package/Common/Notification/index.js +6 -0
- package/Common/Notification/index.module.css +2 -20
- package/Common/Preview/index.js +7 -0
- package/Common/Preview/index.module.css +2 -79
- package/Common/Select/NoScriptSelect/index.js +10 -0
- package/Common/Select/StatelessSelect/index.js +31 -0
- package/Common/Select/index.js +46 -0
- package/Common/Select/index.module.css +2 -161
- package/Common/Separator/index.js +7 -0
- package/Common/Separator/index.module.css +2 -16
- package/Common/Skeleton/index.js +18 -0
- package/Common/Skeleton/index.module.css +2 -30
- package/Common/Tabs/index.js +6 -0
- package/Common/Tabs/index.module.css +2 -54
- package/Common/ThemeToggle/index.js +7 -0
- package/Common/ThemeToggle/index.module.css +2 -15
- package/Common/Tooltip/index.js +8 -0
- package/Common/Tooltip/index.module.css +2 -43
- package/Containers/Article/index.js +4 -0
- package/Containers/Article/index.module.css +2 -70
- package/Containers/Footer/index.js +21 -0
- package/Containers/Footer/index.module.css +2 -46
- package/Containers/MetaBar/index.js +12 -0
- package/Containers/MetaBar/index.module.css +2 -91
- package/Containers/NavBar/NavItem/index.js +7 -0
- package/Containers/NavBar/NavItem/index.module.css +2 -60
- package/Containers/NavBar/index.js +18 -0
- package/Containers/NavBar/index.module.css +2 -125
- package/Containers/Sidebar/ProgressionIcon/index.js +3 -0
- package/Containers/Sidebar/SidebarGroup/index.js +9 -0
- package/Containers/Sidebar/SidebarGroup/index.module.css +2 -26
- package/Containers/Sidebar/SidebarItem/index.js +11 -0
- package/Containers/Sidebar/SidebarItem/index.module.css +2 -35
- package/Containers/Sidebar/index.js +15 -0
- package/Containers/Sidebar/index.module.css +2 -31
- package/Icons/HexagonGrid.js +3 -0
- package/Icons/InstallationMethod/Choco.js +3 -0
- package/Icons/InstallationMethod/Devbox.js +3 -0
- package/Icons/InstallationMethod/Docker.js +3 -0
- package/Icons/InstallationMethod/FNM.js +3 -0
- package/Icons/InstallationMethod/Homebrew.js +3 -0
- package/Icons/InstallationMethod/N.js +5 -0
- package/Icons/InstallationMethod/NVM.js +3 -0
- package/Icons/InstallationMethod/Volta.js +3 -0
- package/Icons/InstallationMethod/{index.ts → index.js} +0 -1
- package/Icons/Logos/JsWhite.js +3 -0
- package/Icons/Logos/Nodejs.js +12 -0
- package/Icons/Logos/index.js +3 -0
- package/Icons/OperatingSystem/AIX.js +3 -0
- package/Icons/OperatingSystem/Apple.js +3 -0
- package/Icons/OperatingSystem/Linux.js +3 -0
- package/Icons/OperatingSystem/Microsoft.js +3 -0
- package/Icons/OperatingSystem/{index.ts → index.js} +0 -1
- package/Icons/PackageManager/Npm.js +3 -0
- package/Icons/PackageManager/Pnpm.js +3 -0
- package/Icons/PackageManager/Yarn.js +3 -0
- package/Icons/PackageManager/{index.ts → index.js} +0 -1
- package/Icons/Social/Bluesky.js +3 -0
- package/Icons/Social/Discord.js +3 -0
- package/Icons/Social/GitHub.js +3 -0
- package/Icons/Social/LinkedIn.js +3 -0
- package/Icons/Social/Mastodon.js +3 -0
- package/Icons/Social/Slack.js +3 -0
- package/Icons/Social/X.js +3 -0
- package/Icons/Social/{index.ts → index.js} +0 -1
- package/MDX/CodeTabs.js +29 -0
- package/Providers/NotificationProvider/index.js +16 -0
- package/Providers/NotificationProvider/index.module.css +2 -0
- package/package.json +10 -55
- package/stylelint/one-utility-class-per-line.mjs +34 -50
- package/stylelint/utils.mjs +19 -25
- package/styles/index.css +2 -38
- package/types.js +1 -0
- package/util/array.js +2 -0
- package/Common/AlertBox/index.stories.tsx +0 -73
- package/Common/AlertBox/index.tsx +0 -24
- package/Common/AvatarGroup/Avatar/index.stories.tsx +0 -22
- package/Common/AvatarGroup/Avatar/index.tsx +0 -67
- package/Common/AvatarGroup/Overlay/index.stories.tsx +0 -33
- package/Common/AvatarGroup/Overlay/index.tsx +0 -37
- package/Common/AvatarGroup/__tests__/index.test.jsx +0 -55
- package/Common/AvatarGroup/index.stories.tsx +0 -56
- package/Common/AvatarGroup/index.tsx +0 -83
- package/Common/Badge/index.stories.tsx +0 -38
- package/Common/Badge/index.tsx +0 -35
- package/Common/BadgeGroup/index.stories.tsx +0 -35
- package/Common/BadgeGroup/index.tsx +0 -35
- package/Common/Banner/index.stories.tsx +0 -29
- package/Common/Banner/index.tsx +0 -18
- package/Common/BaseActiveLink/__tests__/index.test.jsx +0 -52
- package/Common/BaseActiveLink/index.tsx +0 -34
- package/Common/BaseButton/index.stories.tsx +0 -67
- package/Common/BaseButton/index.tsx +0 -59
- package/Common/BaseCodeBox/index.stories.tsx +0 -39
- package/Common/BaseCodeBox/index.tsx +0 -122
- package/Common/BaseCrossLink/index.stories.tsx +0 -38
- package/Common/BaseCrossLink/index.tsx +0 -46
- package/Common/BaseLinkTabs/index.stories.tsx +0 -34
- package/Common/BaseLinkTabs/index.tsx +0 -53
- package/Common/BasePagination/Ellipsis/index.stories.tsx +0 -10
- package/Common/BasePagination/Ellipsis/index.tsx +0 -11
- package/Common/BasePagination/PaginationListItem/__tests__/index.test.jsx +0 -58
- package/Common/BasePagination/PaginationListItem/index.stories.tsx +0 -40
- package/Common/BasePagination/PaginationListItem/index.tsx +0 -39
- package/Common/BasePagination/PrevNextArrow.tsx +0 -15
- package/Common/BasePagination/__tests__/index.test.jsx +0 -180
- package/Common/BasePagination/index.stories.tsx +0 -67
- package/Common/BasePagination/index.tsx +0 -77
- package/Common/BasePagination/useGetPageElements.tsx +0 -132
- package/Common/Blockquote/index.stories.tsx +0 -45
- package/Common/Blockquote/index.tsx +0 -11
- package/Common/Breadcrumbs/BreadcrumbHomeLink/index.tsx +0 -30
- package/Common/Breadcrumbs/BreadcrumbItem/index.tsx +0 -42
- package/Common/Breadcrumbs/BreadcrumbLink/index.tsx +0 -37
- package/Common/Breadcrumbs/BreadcrumbRoot/index.tsx +0 -20
- package/Common/Breadcrumbs/BreadcrumbTruncatedItem/index.tsx +0 -9
- package/Common/Breadcrumbs/index.stories.tsx +0 -94
- package/Common/Breadcrumbs/index.tsx +0 -81
- package/Common/CodeTabs/index.stories.tsx +0 -73
- package/Common/CodeTabs/index.tsx +0 -16
- package/Common/DataTag/index.stories.tsx +0 -40
- package/Common/DataTag/index.tsx +0 -39
- package/Common/GlowingBackdrop/index.stories.tsx +0 -10
- package/Common/GlowingBackdrop/index.tsx +0 -13
- package/Common/LanguageDropDown/index.stories.tsx +0 -19
- package/Common/LanguageDropDown/index.tsx +0 -56
- package/Common/Modal/index.stories.tsx +0 -32
- package/Common/Modal/index.tsx +0 -48
- package/Common/NodejsLogo/index.stories.tsx +0 -14
- package/Common/NodejsLogo/index.tsx +0 -26
- package/Common/Notification/index.stories.tsx +0 -36
- package/Common/Notification/index.tsx +0 -34
- package/Common/Preview/index.stories.tsx +0 -44
- package/Common/Preview/index.tsx +0 -25
- package/Common/ProgressionSidebar/ProgressionSidebarGroup/index.module.css +0 -47
- package/Common/ProgressionSidebar/ProgressionSidebarGroup/index.tsx +0 -35
- package/Common/ProgressionSidebar/ProgressionSidebarIcon/index.tsx +0 -16
- package/Common/ProgressionSidebar/ProgressionSidebarItem/index.module.css +0 -39
- package/Common/ProgressionSidebar/ProgressionSidebarItem/index.tsx +0 -32
- package/Common/ProgressionSidebar/index.module.css +0 -30
- package/Common/ProgressionSidebar/index.stories.tsx +0 -79
- package/Common/ProgressionSidebar/index.tsx +0 -59
- package/Common/Select/__tests__/index.test.jsx +0 -67
- package/Common/Select/index.stories.tsx +0 -111
- package/Common/Select/index.tsx +0 -187
- package/Common/Separator/index.stories.tsx +0 -32
- package/Common/Separator/index.tsx +0 -27
- package/Common/Skeleton/index.tsx +0 -39
- package/Common/Tabs/__tests__/index.test.jsx +0 -52
- package/Common/Tabs/index.stories.tsx +0 -50
- package/Common/Tabs/index.tsx +0 -54
- package/Common/ThemeToggle/__tests__/index.test.jsx +0 -35
- package/Common/ThemeToggle/index.stories.tsx +0 -10
- package/Common/ThemeToggle/index.tsx +0 -15
- package/Common/Tooltip/index.stories.tsx +0 -73
- package/Common/Tooltip/index.tsx +0 -48
- package/Containers/Article/index.stories.tsx +0 -39
- package/Containers/Article/index.tsx +0 -9
- package/Containers/Footer/index.stories.tsx +0 -27
- package/Containers/Footer/index.tsx +0 -95
- package/Containers/MetaBar/__tests__/index.test.jsx +0 -63
- package/Containers/MetaBar/index.stories.tsx +0 -80
- package/Containers/MetaBar/index.tsx +0 -72
- package/Containers/NavBar/NavItem/index.stories.tsx +0 -38
- package/Containers/NavBar/NavItem/index.tsx +0 -44
- package/Containers/NavBar/index.stories.tsx +0 -45
- package/Containers/NavBar/index.tsx +0 -94
- package/Containers/Sidebar/SidebarGroup/index.stories.tsx +0 -36
- package/Containers/Sidebar/SidebarGroup/index.tsx +0 -30
- package/Containers/Sidebar/SidebarItem/index.stories.tsx +0 -15
- package/Containers/Sidebar/SidebarItem/index.tsx +0 -26
- package/Containers/Sidebar/index.stories.tsx +0 -84
- package/Containers/Sidebar/index.tsx +0 -58
- package/Icons/HexagonGrid.stories.tsx +0 -10
- package/Icons/HexagonGrid.tsx +0 -1434
- package/Icons/InstallationMethod/Choco.tsx +0 -78
- package/Icons/InstallationMethod/Devbox.tsx +0 -21
- package/Icons/InstallationMethod/Docker.tsx +0 -20
- package/Icons/InstallationMethod/FNM.tsx +0 -132
- package/Icons/InstallationMethod/Homebrew.tsx +0 -69
- package/Icons/InstallationMethod/N.tsx +0 -32
- package/Icons/InstallationMethod/NVM.tsx +0 -63
- package/Icons/InstallationMethod/Volta.tsx +0 -34
- package/Icons/Logos/JsGreen.tsx +0 -24
- package/Icons/Logos/JsWhite.tsx +0 -37
- package/Icons/Logos/Nodejs.tsx +0 -188
- package/Icons/Logos/NodejsStackedBlack.tsx +0 -98
- package/Icons/Logos/NodejsStackedDark.tsx +0 -124
- package/Icons/Logos/NodejsStackedLight.tsx +0 -123
- package/Icons/Logos/NodejsStackedWhite.tsx +0 -98
- package/Icons/Logos/index.ts +0 -17
- package/Icons/OperatingSystem/AIX.tsx +0 -46
- package/Icons/OperatingSystem/Apple.tsx +0 -23
- package/Icons/OperatingSystem/Linux.tsx +0 -969
- package/Icons/OperatingSystem/Microsoft.tsx +0 -19
- package/Icons/PackageManager/Npm.tsx +0 -21
- package/Icons/PackageManager/Pnpm.tsx +0 -22
- package/Icons/PackageManager/Yarn.tsx +0 -22
- package/Icons/Social/Bluesky.tsx +0 -19
- package/Icons/Social/Discord.tsx +0 -20
- package/Icons/Social/GitHub.tsx +0 -16
- package/Icons/Social/LinkedIn.tsx +0 -16
- package/Icons/Social/Mastodon.tsx +0 -36
- package/Icons/Social/Slack.tsx +0 -31
- package/Icons/Social/X.tsx +0 -16
- package/MDX/CodeTabs.tsx +0 -47
- package/stylelint/__tests__/index.test.mjs +0 -80
- package/styles/animations.css +0 -47
- package/styles/base.css +0 -17
- package/styles/effects.css +0 -12
- package/styles/markdown.css +0 -173
- package/styles/theme.css +0 -175
- package/types.ts +0 -25
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { describe, it, beforeEach } from 'node:test';
|
|
2
|
-
import assert from 'node:assert/strict';
|
|
3
|
-
|
|
4
|
-
import { render, screen } from '@testing-library/react';
|
|
5
|
-
import userEvent from '@testing-library/user-event';
|
|
6
|
-
|
|
7
|
-
import ThemeToggle from '../';
|
|
8
|
-
|
|
9
|
-
let mockCurrentTheme = 'light';
|
|
10
|
-
|
|
11
|
-
const toggleTheme = () => {
|
|
12
|
-
mockCurrentTheme = mockCurrentTheme === 'light' ? 'dark' : 'light';
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
describe('ThemeToggle', () => {
|
|
16
|
-
let toggle;
|
|
17
|
-
|
|
18
|
-
beforeEach(() => {
|
|
19
|
-
mockCurrentTheme = 'light';
|
|
20
|
-
|
|
21
|
-
render(<ThemeToggle onClick={toggleTheme} />);
|
|
22
|
-
toggle = screen.getByRole('button');
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('switches dark theme to light theme', async () => {
|
|
26
|
-
mockCurrentTheme = 'dark';
|
|
27
|
-
await userEvent.click(toggle);
|
|
28
|
-
assert.equal(mockCurrentTheme, 'light');
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('switches light theme to dark theme', async () => {
|
|
32
|
-
await userEvent.click(toggle);
|
|
33
|
-
assert.equal(mockCurrentTheme, 'dark');
|
|
34
|
-
});
|
|
35
|
-
});
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { Meta as MetaObj, StoryObj } from '@storybook/react';
|
|
2
|
-
|
|
3
|
-
import ThemeToggle from '#ui/Common/ThemeToggle';
|
|
4
|
-
|
|
5
|
-
type Story = StoryObj<typeof ThemeToggle>;
|
|
6
|
-
type Meta = MetaObj<typeof ThemeToggle>;
|
|
7
|
-
|
|
8
|
-
export const Default: Story = {};
|
|
9
|
-
|
|
10
|
-
export default { component: ThemeToggle } as Meta;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { MoonIcon, SunIcon } from '@heroicons/react/24/outline';
|
|
2
|
-
import type { FC, ButtonHTMLAttributes } from 'react';
|
|
3
|
-
|
|
4
|
-
import styles from './index.module.css';
|
|
5
|
-
|
|
6
|
-
const ThemeToggle: FC<ButtonHTMLAttributes<HTMLButtonElement>> = props => {
|
|
7
|
-
return (
|
|
8
|
-
<button type="button" className={styles.themeToggle} {...props}>
|
|
9
|
-
<MoonIcon className="block dark:hidden" height="20" />
|
|
10
|
-
<SunIcon className="hidden dark:block" height="20" />
|
|
11
|
-
</button>
|
|
12
|
-
);
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export default ThemeToggle;
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import type { Meta as MetaObj, StoryObj } from '@storybook/react';
|
|
2
|
-
|
|
3
|
-
import Tooltip from '#ui/Common/Tooltip';
|
|
4
|
-
|
|
5
|
-
type Story = StoryObj<typeof Tooltip>;
|
|
6
|
-
type Meta = MetaObj<typeof Tooltip>;
|
|
7
|
-
|
|
8
|
-
const defaultProps = {
|
|
9
|
-
children: <a>Rocket Turtle</a>,
|
|
10
|
-
content: <div className="p-3">🚀 🐢</div>,
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export const Default: Story = {
|
|
14
|
-
args: defaultProps,
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export const Warning: Story = {
|
|
18
|
-
args: {
|
|
19
|
-
...defaultProps,
|
|
20
|
-
kind: 'warning',
|
|
21
|
-
},
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export const Error: Story = {
|
|
25
|
-
args: {
|
|
26
|
-
...defaultProps,
|
|
27
|
-
kind: 'error',
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export const LeftSide: Story = {
|
|
32
|
-
args: {
|
|
33
|
-
...defaultProps,
|
|
34
|
-
side: 'left',
|
|
35
|
-
},
|
|
36
|
-
decorators: [
|
|
37
|
-
Story => (
|
|
38
|
-
<div className="flex w-72 justify-end">
|
|
39
|
-
<Story />
|
|
40
|
-
</div>
|
|
41
|
-
),
|
|
42
|
-
],
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
export const RightSide: Story = {
|
|
46
|
-
args: {
|
|
47
|
-
...defaultProps,
|
|
48
|
-
side: 'left',
|
|
49
|
-
},
|
|
50
|
-
decorators: [
|
|
51
|
-
Story => (
|
|
52
|
-
<div className="flex w-72 justify-start">
|
|
53
|
-
<Story />
|
|
54
|
-
</div>
|
|
55
|
-
),
|
|
56
|
-
],
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
export const TopSide: Story = {
|
|
60
|
-
args: {
|
|
61
|
-
...defaultProps,
|
|
62
|
-
side: 'top',
|
|
63
|
-
},
|
|
64
|
-
decorators: [
|
|
65
|
-
Story => (
|
|
66
|
-
<div className="flex h-72 items-end">
|
|
67
|
-
<Story />
|
|
68
|
-
</div>
|
|
69
|
-
),
|
|
70
|
-
],
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
export default { component: Tooltip } as Meta;
|
package/Common/Tooltip/index.tsx
DELETED
|
@@ -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,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
|
-
© {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;
|