@node-core/ui-components 1.0.1-bc3f4a79ab5f54e7ed1ee525005e7e9f1030495c → 1.0.1-cc5c2626b0639fe2088a736f54169ea3e10ed325

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 (266) hide show
  1. package/Common/AlertBox/index.module.css +50 -44
  2. package/Common/AlertBox/index.stories.tsx +96 -0
  3. package/Common/AlertBox/index.tsx +24 -0
  4. package/Common/AvatarGroup/Avatar/index.module.css +30 -50
  5. package/Common/AvatarGroup/Avatar/index.stories.tsx +22 -0
  6. package/Common/AvatarGroup/Avatar/index.tsx +67 -0
  7. package/Common/AvatarGroup/Overlay/index.module.css +21 -28
  8. package/Common/AvatarGroup/Overlay/index.stories.tsx +33 -0
  9. package/Common/AvatarGroup/Overlay/index.tsx +37 -0
  10. package/Common/AvatarGroup/__tests__/index.test.jsx +55 -0
  11. package/Common/AvatarGroup/index.module.css +11 -12
  12. package/Common/AvatarGroup/index.stories.tsx +56 -0
  13. package/Common/AvatarGroup/index.tsx +83 -0
  14. package/Common/Badge/index.module.css +26 -34
  15. package/Common/Badge/index.stories.tsx +38 -0
  16. package/Common/Badge/index.tsx +35 -0
  17. package/Common/BadgeGroup/index.module.css +51 -75
  18. package/Common/BadgeGroup/index.stories.tsx +35 -0
  19. package/Common/BadgeGroup/index.tsx +35 -0
  20. package/Common/Banner/index.module.css +27 -30
  21. package/Common/Banner/index.stories.tsx +29 -0
  22. package/Common/Banner/index.tsx +18 -0
  23. package/Common/BaseActiveLink/__tests__/index.test.jsx +52 -0
  24. package/Common/BaseActiveLink/index.tsx +34 -0
  25. package/Common/BaseButton/index.module.css +105 -332
  26. package/Common/BaseButton/index.stories.tsx +67 -0
  27. package/Common/BaseButton/index.tsx +59 -0
  28. package/Common/BaseCodeBox/index.module.css +58 -76
  29. package/Common/BaseCodeBox/index.stories.tsx +39 -0
  30. package/Common/BaseCodeBox/index.tsx +122 -0
  31. package/Common/BaseCrossLink/index.module.css +39 -57
  32. package/Common/BaseCrossLink/index.stories.tsx +38 -0
  33. package/Common/BaseCrossLink/index.tsx +46 -0
  34. package/Common/BaseLinkTabs/index.module.css +33 -67
  35. package/Common/BaseLinkTabs/index.stories.tsx +34 -0
  36. package/Common/BaseLinkTabs/index.tsx +53 -0
  37. package/Common/BasePagination/Ellipsis/index.module.css +8 -14
  38. package/Common/BasePagination/Ellipsis/index.stories.tsx +10 -0
  39. package/Common/BasePagination/Ellipsis/index.tsx +11 -0
  40. package/Common/BasePagination/PaginationListItem/__tests__/index.test.jsx +58 -0
  41. package/Common/BasePagination/PaginationListItem/index.module.css +21 -36
  42. package/Common/BasePagination/PaginationListItem/index.stories.tsx +40 -0
  43. package/Common/BasePagination/PaginationListItem/index.tsx +39 -0
  44. package/Common/BasePagination/PrevNextArrow.tsx +15 -0
  45. package/Common/BasePagination/__tests__/index.test.jsx +180 -0
  46. package/Common/BasePagination/index.module.css +26 -27
  47. package/Common/BasePagination/index.stories.tsx +67 -0
  48. package/Common/BasePagination/index.tsx +77 -0
  49. package/Common/BasePagination/useGetPageElements.tsx +132 -0
  50. package/Common/Blockquote/index.module.css +23 -44
  51. package/Common/Blockquote/index.stories.tsx +45 -0
  52. package/Common/Blockquote/index.tsx +11 -0
  53. package/Common/Breadcrumbs/BreadcrumbHomeLink/index.module.css +3 -3
  54. package/Common/Breadcrumbs/BreadcrumbHomeLink/index.tsx +30 -0
  55. package/Common/Breadcrumbs/BreadcrumbItem/index.module.css +27 -38
  56. package/Common/Breadcrumbs/BreadcrumbItem/index.tsx +42 -0
  57. package/Common/Breadcrumbs/BreadcrumbLink/index.module.css +16 -26
  58. package/Common/Breadcrumbs/BreadcrumbLink/index.tsx +37 -0
  59. package/Common/Breadcrumbs/BreadcrumbRoot/index.module.css +7 -8
  60. package/Common/Breadcrumbs/BreadcrumbRoot/index.tsx +20 -0
  61. package/Common/Breadcrumbs/BreadcrumbTruncatedItem/index.tsx +9 -0
  62. package/Common/Breadcrumbs/index.stories.tsx +94 -0
  63. package/Common/Breadcrumbs/index.tsx +81 -0
  64. package/Common/ChangeHistory/index.module.css +66 -181
  65. package/Common/ChangeHistory/index.stories.tsx +130 -0
  66. package/Common/ChangeHistory/index.tsx +67 -0
  67. package/Common/CodeTabs/index.module.css +36 -47
  68. package/Common/CodeTabs/index.stories.tsx +73 -0
  69. package/Common/CodeTabs/index.tsx +16 -0
  70. package/Common/DataTag/index.module.css +32 -30
  71. package/Common/DataTag/index.stories.tsx +40 -0
  72. package/Common/DataTag/index.tsx +39 -0
  73. package/Common/GlowingBackdrop/index.module.css +28 -126
  74. package/Common/GlowingBackdrop/index.stories.tsx +10 -0
  75. package/Common/GlowingBackdrop/index.tsx +13 -0
  76. package/Common/LanguageDropDown/index.module.css +42 -140
  77. package/Common/LanguageDropDown/index.stories.tsx +19 -0
  78. package/Common/LanguageDropDown/index.tsx +56 -0
  79. package/Common/Modal/index.module.css +62 -217
  80. package/Common/Modal/index.stories.tsx +34 -0
  81. package/Common/Modal/index.tsx +50 -0
  82. package/Common/NodejsLogo/index.module.css +4 -3
  83. package/Common/NodejsLogo/index.stories.tsx +14 -0
  84. package/Common/NodejsLogo/index.tsx +26 -0
  85. package/Common/Notification/index.module.css +17 -101
  86. package/Common/Notification/index.stories.tsx +36 -0
  87. package/Common/Notification/index.tsx +34 -0
  88. package/Common/Preview/index.module.css +65 -269
  89. package/Common/Preview/index.stories.tsx +44 -0
  90. package/Common/Preview/index.tsx +25 -0
  91. package/Common/Select/__tests__/index.test.jsx +67 -0
  92. package/Common/Select/index.module.css +127 -294
  93. package/Common/Select/index.stories.tsx +111 -0
  94. package/Common/Select/index.tsx +187 -0
  95. package/Common/Separator/index.module.css +10 -7
  96. package/Common/Separator/index.stories.tsx +32 -0
  97. package/Common/Separator/index.tsx +27 -0
  98. package/Common/Skeleton/index.module.css +21 -118
  99. package/Common/Skeleton/index.tsx +39 -0
  100. package/Common/Tabs/__tests__/index.test.jsx +52 -0
  101. package/Common/Tabs/index.module.css +40 -58
  102. package/Common/Tabs/index.stories.tsx +50 -0
  103. package/Common/Tabs/index.tsx +54 -0
  104. package/Common/ThemeToggle/__tests__/index.test.jsx +35 -0
  105. package/Common/ThemeToggle/index.module.css +11 -18
  106. package/Common/ThemeToggle/index.stories.tsx +10 -0
  107. package/Common/ThemeToggle/index.tsx +15 -0
  108. package/Common/Tooltip/index.module.css +29 -119
  109. package/Common/Tooltip/index.stories.tsx +73 -0
  110. package/Common/Tooltip/index.tsx +48 -0
  111. package/Containers/Article/index.module.css +58 -127
  112. package/Containers/Article/index.stories.tsx +39 -0
  113. package/Containers/Article/index.tsx +9 -0
  114. package/Containers/DocSideBar/index.tsx +0 -0
  115. package/Containers/Footer/index.module.css +36 -51
  116. package/Containers/Footer/index.stories.tsx +27 -0
  117. package/Containers/Footer/index.tsx +95 -0
  118. package/Containers/MetaBar/__tests__/index.test.jsx +63 -0
  119. package/Containers/MetaBar/index.module.css +69 -101
  120. package/Containers/MetaBar/index.stories.tsx +80 -0
  121. package/Containers/MetaBar/index.tsx +72 -0
  122. package/Containers/NavBar/NavItem/index.module.css +36 -50
  123. package/Containers/NavBar/NavItem/index.stories.tsx +38 -0
  124. package/Containers/NavBar/NavItem/index.tsx +44 -0
  125. package/Containers/NavBar/index.module.css +96 -176
  126. package/Containers/NavBar/index.stories.tsx +45 -0
  127. package/Containers/NavBar/index.tsx +94 -0
  128. package/Containers/Sidebar/ProgressionIcon/index.tsx +16 -0
  129. package/Containers/Sidebar/SidebarGroup/index.module.css +52 -180
  130. package/Containers/Sidebar/SidebarGroup/index.stories.tsx +36 -0
  131. package/Containers/Sidebar/SidebarGroup/index.tsx +49 -0
  132. package/Containers/Sidebar/SidebarItem/index.module.css +38 -49
  133. package/Containers/Sidebar/SidebarItem/index.stories.tsx +15 -0
  134. package/Containers/Sidebar/SidebarItem/index.tsx +43 -0
  135. package/Containers/Sidebar/index.module.css +24 -42
  136. package/Containers/Sidebar/index.stories.tsx +88 -0
  137. package/Containers/Sidebar/index.tsx +70 -0
  138. package/Icons/HexagonGrid.stories.tsx +10 -0
  139. package/Icons/HexagonGrid.tsx +1434 -0
  140. package/Icons/InstallationMethod/Choco.tsx +78 -0
  141. package/Icons/InstallationMethod/Devbox.tsx +21 -0
  142. package/Icons/InstallationMethod/Docker.tsx +20 -0
  143. package/Icons/InstallationMethod/FNM.tsx +132 -0
  144. package/Icons/InstallationMethod/Homebrew.tsx +69 -0
  145. package/Icons/InstallationMethod/N.tsx +32 -0
  146. package/Icons/InstallationMethod/NVM.tsx +63 -0
  147. package/Icons/InstallationMethod/Volta.tsx +34 -0
  148. package/Icons/InstallationMethod/{index.js → index.ts} +1 -0
  149. package/Icons/Logos/JsGreen.tsx +24 -0
  150. package/Icons/Logos/JsWhite.tsx +37 -0
  151. package/Icons/Logos/Nodejs.tsx +372 -0
  152. package/Icons/Logos/NodejsStackedBlack.tsx +98 -0
  153. package/Icons/Logos/NodejsStackedDark.tsx +124 -0
  154. package/Icons/Logos/NodejsStackedLight.tsx +123 -0
  155. package/Icons/Logos/NodejsStackedWhite.tsx +98 -0
  156. package/Icons/Logos/{index.js → index.ts} +10 -1
  157. package/Icons/OperatingSystem/AIX.tsx +46 -0
  158. package/Icons/OperatingSystem/Apple.tsx +23 -0
  159. package/Icons/OperatingSystem/Linux.tsx +969 -0
  160. package/Icons/OperatingSystem/Microsoft.tsx +19 -0
  161. package/Icons/OperatingSystem/{index.js → index.ts} +1 -0
  162. package/Icons/PackageManager/Npm.tsx +21 -0
  163. package/Icons/PackageManager/Pnpm.tsx +22 -0
  164. package/Icons/PackageManager/Yarn.tsx +22 -0
  165. package/Icons/PackageManager/{index.js → index.ts} +1 -0
  166. package/Icons/Social/Bluesky.tsx +19 -0
  167. package/Icons/Social/Discord.tsx +20 -0
  168. package/Icons/Social/GitHub.tsx +16 -0
  169. package/Icons/Social/LinkedIn.tsx +16 -0
  170. package/Icons/Social/Mastodon.tsx +36 -0
  171. package/Icons/Social/Slack.tsx +31 -0
  172. package/Icons/Social/X.tsx +16 -0
  173. package/Icons/Social/{index.js → index.ts} +1 -0
  174. package/MDX/CodeTabs.tsx +47 -0
  175. package/package.json +54 -6
  176. package/stylelint/__tests__/index.test.mjs +80 -0
  177. package/stylelint/one-utility-class-per-line.mjs +50 -34
  178. package/stylelint/utils.mjs +25 -19
  179. package/styles/animations.css +47 -0
  180. package/styles/base.css +17 -0
  181. package/styles/effects.css +12 -0
  182. package/styles/index.css +26 -1127
  183. package/styles/markdown.css +173 -0
  184. package/styles/theme.css +175 -0
  185. package/types.ts +25 -0
  186. package/Common/AlertBox/index.js +0 -5
  187. package/Common/AvatarGroup/Avatar/index.js +0 -11
  188. package/Common/AvatarGroup/Overlay/index.js +0 -6
  189. package/Common/AvatarGroup/index.js +0 -21
  190. package/Common/Badge/index.js +0 -7
  191. package/Common/BadgeGroup/index.js +0 -6
  192. package/Common/Banner/index.js +0 -4
  193. package/Common/BaseActiveLink/index.js +0 -14
  194. package/Common/BaseButton/index.js +0 -10
  195. package/Common/BaseCodeBox/index.js +0 -50
  196. package/Common/BaseCrossLink/index.js +0 -12
  197. package/Common/BaseLinkTabs/index.js +0 -5
  198. package/Common/BasePagination/Ellipsis/index.js +0 -4
  199. package/Common/BasePagination/PaginationListItem/index.js +0 -6
  200. package/Common/BasePagination/PrevNextArrow.js +0 -7
  201. package/Common/BasePagination/index.js +0 -10
  202. package/Common/BasePagination/useGetPageElements.js +0 -77
  203. package/Common/Blockquote/index.js +0 -4
  204. package/Common/Breadcrumbs/BreadcrumbHomeLink/index.js +0 -9
  205. package/Common/Breadcrumbs/BreadcrumbItem/index.js +0 -6
  206. package/Common/Breadcrumbs/BreadcrumbLink/index.js +0 -5
  207. package/Common/Breadcrumbs/BreadcrumbRoot/index.js +0 -4
  208. package/Common/Breadcrumbs/BreadcrumbTruncatedItem/index.js +0 -4
  209. package/Common/Breadcrumbs/index.js +0 -22
  210. package/Common/ChangeHistory/index.js +0 -9
  211. package/Common/CodeTabs/index.js +0 -5
  212. package/Common/DataTag/index.js +0 -18
  213. package/Common/GlowingBackdrop/index.js +0 -5
  214. package/Common/LanguageDropDown/index.js +0 -11
  215. package/Common/Modal/index.js +0 -10
  216. package/Common/NodejsLogo/index.js +0 -7
  217. package/Common/Notification/index.js +0 -6
  218. package/Common/Preview/index.js +0 -7
  219. package/Common/Select/index.js +0 -46
  220. package/Common/Separator/index.js +0 -7
  221. package/Common/Skeleton/index.js +0 -18
  222. package/Common/Tabs/index.js +0 -6
  223. package/Common/ThemeToggle/index.js +0 -7
  224. package/Common/Tooltip/index.js +0 -8
  225. package/Containers/Article/index.js +0 -4
  226. package/Containers/DocSideBar/index.js +0 -1
  227. package/Containers/Footer/index.js +0 -22
  228. package/Containers/MetaBar/index.js +0 -12
  229. package/Containers/NavBar/NavItem/index.js +0 -7
  230. package/Containers/NavBar/index.js +0 -18
  231. package/Containers/Sidebar/ProgressionIcon/index.js +0 -3
  232. package/Containers/Sidebar/SidebarGroup/index.js +0 -9
  233. package/Containers/Sidebar/SidebarItem/index.js +0 -11
  234. package/Containers/Sidebar/index.js +0 -15
  235. package/Icons/HexagonGrid.js +0 -3
  236. package/Icons/InstallationMethod/Choco.js +0 -3
  237. package/Icons/InstallationMethod/Devbox.js +0 -3
  238. package/Icons/InstallationMethod/Docker.js +0 -3
  239. package/Icons/InstallationMethod/FNM.js +0 -3
  240. package/Icons/InstallationMethod/Homebrew.js +0 -3
  241. package/Icons/InstallationMethod/N.js +0 -5
  242. package/Icons/InstallationMethod/NVM.js +0 -3
  243. package/Icons/InstallationMethod/Volta.js +0 -3
  244. package/Icons/Logos/JsGreen.js +0 -3
  245. package/Icons/Logos/JsWhite.js +0 -3
  246. package/Icons/Logos/Nodejs.js +0 -6
  247. package/Icons/Logos/NodejsStackedBlack.js +0 -3
  248. package/Icons/Logos/NodejsStackedDark.js +0 -3
  249. package/Icons/Logos/NodejsStackedLight.js +0 -3
  250. package/Icons/Logos/NodejsStackedWhite.js +0 -3
  251. package/Icons/OperatingSystem/AIX.js +0 -3
  252. package/Icons/OperatingSystem/Apple.js +0 -3
  253. package/Icons/OperatingSystem/Linux.js +0 -3
  254. package/Icons/OperatingSystem/Microsoft.js +0 -3
  255. package/Icons/PackageManager/Npm.js +0 -3
  256. package/Icons/PackageManager/Pnpm.js +0 -3
  257. package/Icons/PackageManager/Yarn.js +0 -3
  258. package/Icons/Social/Bluesky.js +0 -3
  259. package/Icons/Social/Discord.js +0 -3
  260. package/Icons/Social/GitHub.js +0 -3
  261. package/Icons/Social/LinkedIn.js +0 -3
  262. package/Icons/Social/Mastodon.js +0 -3
  263. package/Icons/Social/Slack.js +0 -3
  264. package/Icons/Social/X.js +0 -3
  265. package/MDX/CodeTabs.js +0 -16
  266. package/types.js +0 -1
@@ -0,0 +1,94 @@
1
+ import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
+
3
+ import Breadcrumbs from '#ui/Common/Breadcrumbs';
4
+
5
+ type Story = StoryObj<typeof Breadcrumbs>;
6
+ type Meta = MetaObj<typeof Breadcrumbs>;
7
+
8
+ export const Default: Story = {
9
+ args: {
10
+ links: [
11
+ {
12
+ label: 'Learn',
13
+ href: '/learn',
14
+ },
15
+ {
16
+ label: 'Getting Started',
17
+ href: '/learn/getting-started',
18
+ },
19
+ {
20
+ label: 'Introduction to Node.js',
21
+ href: '/learn/getting-started/intro',
22
+ },
23
+ ],
24
+ },
25
+ };
26
+
27
+ export const Linkless: Story = {
28
+ args: {
29
+ links: [
30
+ {
31
+ label: 'Learn',
32
+ href: '',
33
+ },
34
+ {
35
+ label: 'Getting Started',
36
+ href: '',
37
+ },
38
+ {
39
+ label: 'Introduction to Node.js',
40
+ href: '',
41
+ },
42
+ ],
43
+ },
44
+ };
45
+
46
+ export const Truncate: Story = {
47
+ args: {
48
+ links: [
49
+ {
50
+ label: 'Learn',
51
+ href: '/learn',
52
+ },
53
+ {
54
+ label: 'Getting Started',
55
+ href: '/learn/getting-started',
56
+ },
57
+ {
58
+ label: 'Introduction to Node.js',
59
+ href: '/learn/getting-started/intro',
60
+ },
61
+ {
62
+ label: 'Installation',
63
+ href: '/learn/getting-started/intro/installation',
64
+ },
65
+ {
66
+ label: 'Documentation',
67
+ href: '/learn/getting-started/intro/installation/documentation',
68
+ },
69
+ ],
70
+ maxLength: 1,
71
+ },
72
+ };
73
+
74
+ export const HiddenHome: Story = {
75
+ args: {
76
+ hideHome: true,
77
+ links: [
78
+ {
79
+ label: 'Learn',
80
+ href: '/learn',
81
+ },
82
+ {
83
+ label: 'Getting Started',
84
+ href: '/learn/getting-started',
85
+ },
86
+ {
87
+ label: 'Introduction to Node.js',
88
+ href: '/learn/getting-started/intro',
89
+ },
90
+ ],
91
+ },
92
+ };
93
+
94
+ export default { component: Breadcrumbs } as Meta;
@@ -0,0 +1,81 @@
1
+ import type { FC } from 'react';
2
+ import { useMemo } from 'react';
3
+
4
+ import BreadcrumbHomeLink from '#ui/Common/Breadcrumbs/BreadcrumbHomeLink';
5
+ import BreadcrumbItem from '#ui/Common/Breadcrumbs/BreadcrumbItem';
6
+ import BreadcrumbLink from '#ui/Common/Breadcrumbs/BreadcrumbLink';
7
+ import BreadcrumbRoot from '#ui/Common/Breadcrumbs/BreadcrumbRoot';
8
+ import BreadcrumbTruncatedItem from '#ui/Common/Breadcrumbs/BreadcrumbTruncatedItem';
9
+ import type { FormattedMessage, LinkLike } from '#ui/types';
10
+
11
+ export type BreadcrumbLink = {
12
+ label: FormattedMessage;
13
+ href: string | undefined;
14
+ };
15
+
16
+ type BreadcrumbsProps = {
17
+ links: Array<BreadcrumbLink>;
18
+ maxLength?: number;
19
+ hideHome?: boolean;
20
+ as: LinkLike;
21
+ homeLinkAriaLabel?: string;
22
+ };
23
+
24
+ const Breadcrumbs: FC<BreadcrumbsProps> = ({
25
+ links = [],
26
+ maxLength = 5,
27
+ hideHome = false,
28
+ as = 'a',
29
+ homeLinkAriaLabel,
30
+ }) => {
31
+ const totalLength = links.length + +!hideHome;
32
+ const lengthOffset = maxLength - totalLength;
33
+ const isOverflow = lengthOffset < 0;
34
+
35
+ const items = useMemo(
36
+ () =>
37
+ links.map((link, index, items) => {
38
+ const position = index + 1;
39
+ const isLastItem = index === items.length - 1;
40
+ const hidden =
41
+ // We add 1 here to take into account of the truncated breadcrumb.
42
+ position <= Math.abs(lengthOffset) + 1 && isOverflow && !isLastItem;
43
+
44
+ return (
45
+ <BreadcrumbItem
46
+ key={link.label.toString()}
47
+ hidden={hidden}
48
+ hideSeparator={isLastItem}
49
+ position={position + +!hideHome}
50
+ >
51
+ {link.href || isLastItem ? (
52
+ <BreadcrumbLink
53
+ as={as}
54
+ href={link.href || undefined}
55
+ active={isLastItem}
56
+ >
57
+ {link.label}
58
+ </BreadcrumbLink>
59
+ ) : (
60
+ <span className="opacity-70">{link.label}</span>
61
+ )}
62
+ </BreadcrumbItem>
63
+ );
64
+ }),
65
+ [hideHome, isOverflow, lengthOffset, links]
66
+ );
67
+
68
+ return (
69
+ <BreadcrumbRoot>
70
+ {!hideHome && (
71
+ <BreadcrumbItem position={1}>
72
+ <BreadcrumbHomeLink as={as} aria-label={homeLinkAriaLabel} />
73
+ </BreadcrumbItem>
74
+ )}
75
+ {isOverflow && <BreadcrumbTruncatedItem />}
76
+ {items}
77
+ </BreadcrumbRoot>
78
+ );
79
+ };
80
+
81
+ export default Breadcrumbs;
@@ -1,198 +1,83 @@
1
- /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
1
+ @reference "../../styles/index.css";
2
+
2
3
  .summary {
3
- display: flex;
4
- height: calc(var(--spacing, 0.25rem)*9);
5
- cursor: pointer;
6
- align-items: center;
7
- gap: calc(var(--spacing, 0.25rem)*2);
8
- border-radius: var(--radius-md, 0.375rem);
9
- border-style: var(--tw-border-style);
10
- border-width: 1px;
11
- border-color: var(--color-neutral-200, #e9edf0);
12
- padding: calc(var(--spacing, 0.25rem)*2);
13
- font-size: var(--text-sm, 0.875rem);
14
- line-height: var(--tw-leading, var(--text-sm--line-height, 1.42857));
15
- color: var(--color-neutral-700, #6e7b83);
16
- --tw-outline-style: none;
17
- outline-style: none;
18
- @media (forced-colors: active) {
19
- outline: 2px solid transparent;
20
- outline-offset: 2px;
21
- }
22
- -webkit-user-select: none;
23
- user-select: none;
24
- @media (prefers-reduced-motion: no-preference) {
25
- transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
26
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(0.4, 0, 0.2, 1)));
27
- transition-duration: var(--tw-duration, var(--default-transition-duration, 150ms));
28
- }
29
- &:where([data-theme=dark], [data-theme=dark] *) {
30
- border-color: var(--color-neutral-900, #2c3437);
31
- }
32
- &:where([data-theme=dark], [data-theme=dark] *) {
33
- color: var(--color-neutral-300, #d9e1e4);
34
- }
4
+ @apply outline-hidden
5
+ flex
6
+ h-9
7
+ cursor-pointer
8
+ select-none
9
+ items-center
10
+ gap-2
11
+ rounded-md
12
+ border
13
+ border-neutral-200
14
+ p-2
15
+ text-sm
16
+ text-neutral-700
17
+ motion-safe:transition-colors
18
+ dark:border-neutral-900
19
+ dark:text-neutral-300;
20
+
35
21
  &:hover,
36
22
  &:focus-visible {
37
- background-color: var(--color-neutral-100, #f6f7f9);
38
- &:where([data-theme=dark], [data-theme=dark] *) {
39
- background-color: var(--color-neutral-900, #2c3437);
40
- }
23
+ @apply bg-neutral-100
24
+ dark:bg-neutral-900;
41
25
  }
42
26
  }
27
+
43
28
  .dropdownContentWrapper {
44
- position: absolute;
45
- top: 100%;
46
- right: calc(var(--spacing, 0.25rem)*0);
47
- z-index: 50;
48
- margin-top: calc(var(--spacing, 0.25rem)*1);
49
- max-height: calc(var(--spacing, 0.25rem)*80);
50
- width: calc(var(--spacing, 0.25rem)*52);
51
- overflow: hidden;
52
- border-radius: var(--radius-sm, 0.25rem);
53
- border-style: var(--tw-border-style);
54
- border-width: 1px;
55
- border-color: var(--color-neutral-200, #e9edf0);
56
- background-color: var(--color-white, #fff);
57
- --tw-shadow: 0px 4px 6px -2px var(--tw-shadow-color, color-mix(in srgb, #101828 3%, transparent)), 0px 12px 16px -4px var(--tw-shadow-color, color-mix(in srgb, #101828 8%, transparent));
58
- @supports (color: color-mix(in lab, red, red)) {
59
- --tw-shadow: 0px 4px 6px -2px var(--tw-shadow-color, color-mix(in oklab, var(--color-shadow, #101828) 3%, transparent)), 0px 12px 16px -4px var(--tw-shadow-color, color-mix(in oklab, var(--color-shadow, #101828) 8%, transparent));
60
- }
61
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
62
- &:where([data-theme=dark], [data-theme=dark] *) {
63
- border-color: var(--color-neutral-900, #2c3437);
64
- }
65
- &:where([data-theme=dark], [data-theme=dark] *) {
66
- background-color: var(--color-neutral-950, #0d121c);
67
- }
68
- }
29
+ @apply absolute
30
+ right-0
31
+ top-full
32
+ z-50
33
+ mt-1
34
+ max-h-80
35
+ w-52
36
+ overflow-hidden
37
+ rounded-sm
38
+ border
39
+ border-neutral-200
40
+ bg-white
41
+ shadow-lg
42
+ dark:border-neutral-900
43
+ dark:bg-neutral-950;
44
+ }
45
+
69
46
  .dropdownContentInner {
70
- max-height: calc(var(--spacing, 0.25rem)*80);
71
- width: calc(var(--spacing, 0.25rem)*52);
72
- overflow-y: auto;
47
+ @apply max-h-80
48
+ w-52
49
+ overflow-y-auto;
73
50
  }
51
+
74
52
  .dropdownItem {
75
- display: block;
76
- padding-inline: calc(var(--spacing, 0.25rem)*2.5);
77
- padding-block: calc(var(--spacing, 0.25rem)*1.5);
78
- font-size: var(--text-sm, 0.875rem);
79
- line-height: var(--tw-leading, var(--text-sm--line-height, 1.42857));
80
- --tw-font-weight: var(--font-weight-medium, 500);
81
- font-weight: var(--font-weight-medium, 500);
82
- color: var(--color-neutral-800, #556066);
83
- text-decoration-line: none;
84
- --tw-outline-style: none;
85
- outline-style: none;
86
- @media (forced-colors: active) {
87
- outline: 2px solid transparent;
88
- outline-offset: 2px;
89
- }
90
- @media (prefers-reduced-motion: no-preference) {
91
- transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
92
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(0.4, 0, 0.2, 1)));
93
- transition-duration: var(--tw-duration, var(--default-transition-duration, 150ms));
94
- }
95
- &:where([data-theme=dark], [data-theme=dark] *) {
96
- color: var(--color-white, #fff);
97
- }
53
+ @apply outline-hidden
54
+ block
55
+ px-2.5
56
+ py-1.5
57
+ text-sm
58
+ font-medium
59
+ text-neutral-800
60
+ no-underline
61
+ motion-safe:transition-colors
62
+ dark:text-white;
63
+
98
64
  &:hover,
99
65
  &:focus-visible {
100
- background-color: var(--color-green-600, #417e38);
101
- color: var(--color-white, #fff);
66
+ @apply bg-green-600
67
+ text-white;
102
68
  }
103
69
  }
70
+
104
71
  .dropdownLabel {
105
- display: block;
106
- font-size: var(--text-sm, 0.875rem);
107
- line-height: var(--tw-leading, var(--text-sm--line-height, 1.42857));
108
- --tw-leading: var(--leading-tight, 1.25);
109
- line-height: var(--leading-tight, 1.25);
110
- --tw-font-weight: var(--font-weight-medium, 500);
111
- font-weight: var(--font-weight-medium, 500);
72
+ @apply block
73
+ text-sm
74
+ font-medium
75
+ leading-tight;
112
76
  }
77
+
113
78
  .dropdownVersions {
114
- display: block;
115
- font-size: var(--text-xs, 0.75rem);
116
- line-height: var(--tw-leading, var(--text-xs--line-height, 1.33333));
117
- --tw-leading: var(--leading-tight, 1.25);
118
- line-height: var(--leading-tight, 1.25);
119
- opacity: 75%;
120
- }
121
- @property --tw-border-style {
122
- syntax: "*";
123
- inherits: false;
124
- initial-value: solid;
125
- }
126
- @property --tw-shadow {
127
- syntax: "*";
128
- inherits: false;
129
- initial-value: 0 0 #0000;
130
- }
131
- @property --tw-shadow-color {
132
- syntax: "*";
133
- inherits: false;
134
- }
135
- @property --tw-shadow-alpha {
136
- syntax: "<percentage>";
137
- inherits: false;
138
- initial-value: 100%;
139
- }
140
- @property --tw-inset-shadow {
141
- syntax: "*";
142
- inherits: false;
143
- initial-value: 0 0 #0000;
144
- }
145
- @property --tw-inset-shadow-color {
146
- syntax: "*";
147
- inherits: false;
148
- }
149
- @property --tw-inset-shadow-alpha {
150
- syntax: "<percentage>";
151
- inherits: false;
152
- initial-value: 100%;
153
- }
154
- @property --tw-ring-color {
155
- syntax: "*";
156
- inherits: false;
157
- }
158
- @property --tw-ring-shadow {
159
- syntax: "*";
160
- inherits: false;
161
- initial-value: 0 0 #0000;
162
- }
163
- @property --tw-inset-ring-color {
164
- syntax: "*";
165
- inherits: false;
166
- }
167
- @property --tw-inset-ring-shadow {
168
- syntax: "*";
169
- inherits: false;
170
- initial-value: 0 0 #0000;
171
- }
172
- @property --tw-ring-inset {
173
- syntax: "*";
174
- inherits: false;
175
- }
176
- @property --tw-ring-offset-width {
177
- syntax: "<length>";
178
- inherits: false;
179
- initial-value: 0px;
180
- }
181
- @property --tw-ring-offset-color {
182
- syntax: "*";
183
- inherits: false;
184
- initial-value: #fff;
185
- }
186
- @property --tw-ring-offset-shadow {
187
- syntax: "*";
188
- inherits: false;
189
- initial-value: 0 0 #0000;
190
- }
191
- @property --tw-font-weight {
192
- syntax: "*";
193
- inherits: false;
194
- }
195
- @property --tw-leading {
196
- syntax: "*";
197
- inherits: false;
79
+ @apply block
80
+ text-xs
81
+ leading-tight
82
+ opacity-75;
198
83
  }
@@ -0,0 +1,130 @@
1
+ import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
+
3
+ import ChangeHistory from '#ui/Common/ChangeHistory';
4
+
5
+ type Story = StoryObj<typeof ChangeHistory>;
6
+ type Meta = MetaObj<typeof ChangeHistory>;
7
+
8
+ const SAMPLE_CHANGES = [
9
+ {
10
+ versions: ['v15.4.0'],
11
+ label: 'No longer experimental',
12
+ url: 'https://github.com/nodejs/node/pull/12345',
13
+ },
14
+ {
15
+ versions: ['v15.0.0', 'v14.17.0'],
16
+ label: 'Added in v15.0.0, v14.17.0',
17
+ url: 'https://github.com/nodejs/node/pull/67890',
18
+ },
19
+ {
20
+ versions: ['v16.0.0'],
21
+ label: 'Deprecated in 16',
22
+ },
23
+ ];
24
+
25
+ const LARGE_SAMPLE_CHANGES = [
26
+ {
27
+ versions: ['v20.0.0'],
28
+ label: 'Breaking change in v20',
29
+ url: 'https://github.com/nodejs/node/pull/50001',
30
+ },
31
+ {
32
+ versions: ['v19.8.0'],
33
+ label: 'Performance improvement',
34
+ url: 'https://github.com/nodejs/node/pull/49999',
35
+ },
36
+ {
37
+ versions: ['v19.0.0'],
38
+ label: 'API redesign',
39
+ url: 'https://github.com/nodejs/node/pull/49000',
40
+ },
41
+ {
42
+ versions: ['v18.17.0', 'v18.16.1'],
43
+ label: 'Security fix backported',
44
+ url: 'https://github.com/nodejs/node/pull/48500',
45
+ },
46
+ {
47
+ versions: ['v18.0.0'],
48
+ label: 'Major version release',
49
+ url: 'https://github.com/nodejs/node/pull/47000',
50
+ },
51
+ {
52
+ versions: ['v17.9.0'],
53
+ label: 'Experimental feature added',
54
+ url: 'https://github.com/nodejs/node/pull/46500',
55
+ },
56
+ {
57
+ versions: ['v17.0.0'],
58
+ label: 'Node.js 17 release',
59
+ url: 'https://github.com/nodejs/node/pull/45000',
60
+ },
61
+ {
62
+ versions: ['v16.15.0', 'v16.14.2'],
63
+ label: 'Bug fix release',
64
+ url: 'https://github.com/nodejs/node/pull/44000',
65
+ },
66
+ {
67
+ versions: ['v16.0.0'],
68
+ label: 'Deprecated in v16',
69
+ url: 'https://github.com/nodejs/node/pull/43000',
70
+ },
71
+ {
72
+ versions: ['v15.14.0'],
73
+ label: 'Feature enhancement',
74
+ url: 'https://github.com/nodejs/node/pull/42000',
75
+ },
76
+ {
77
+ versions: ['v15.0.0', 'v14.17.0'],
78
+ label: 'Initial implementation',
79
+ url: 'https://github.com/nodejs/node/pull/41000',
80
+ },
81
+ {
82
+ versions: ['v14.18.0'],
83
+ label: 'Documentation update',
84
+ url: 'https://github.com/nodejs/node/pull/40000',
85
+ },
86
+ {
87
+ versions: ['v14.0.0'],
88
+ label: 'Added to stable API',
89
+ url: 'https://github.com/nodejs/node/pull/39000',
90
+ },
91
+ {
92
+ versions: ['v13.14.0'],
93
+ label: 'Experimental flag removed',
94
+ url: 'https://github.com/nodejs/node/pull/38000',
95
+ },
96
+ {
97
+ versions: ['v12.22.0', 'v12.21.0'],
98
+ label: 'Backported to LTS',
99
+ url: 'https://github.com/nodejs/node/pull/37000',
100
+ },
101
+ {
102
+ versions: ['v12.0.0'],
103
+ label: 'First experimental version',
104
+ url: 'https://github.com/nodejs/node/pull/36000',
105
+ },
106
+ ];
107
+
108
+ export const Default: Story = {
109
+ render: args => (
110
+ <div className="right-0 flex justify-end">
111
+ <ChangeHistory {...args} />
112
+ </div>
113
+ ),
114
+ args: {
115
+ changes: SAMPLE_CHANGES,
116
+ },
117
+ };
118
+
119
+ export const LargeHistory: Story = {
120
+ render: args => (
121
+ <div className="right-0 flex justify-end">
122
+ <ChangeHistory {...args} />
123
+ </div>
124
+ ),
125
+ args: {
126
+ changes: LARGE_SAMPLE_CHANGES,
127
+ },
128
+ };
129
+
130
+ export default { component: ChangeHistory } as Meta;
@@ -0,0 +1,67 @@
1
+ import { ChevronDownIcon, ClockIcon } from '@heroicons/react/24/outline';
2
+ import classNames from 'classnames';
3
+ import type { FC, ComponentProps } from 'react';
4
+
5
+ import type { LinkLike } from '#ui/types.js';
6
+
7
+ import styles from './index.module.css';
8
+
9
+ export type HistoryChange = {
10
+ versions: Array<string>;
11
+ label: string;
12
+ url?: string;
13
+ };
14
+
15
+ type ChangeHistoryProps = ComponentProps<'div'> & {
16
+ label: string;
17
+ changes: Array<HistoryChange>;
18
+ as?: LinkLike;
19
+ };
20
+
21
+ const ChangeHistory: FC<ChangeHistoryProps> = ({
22
+ label = 'History',
23
+ changes = [],
24
+ className,
25
+ as: As = 'a',
26
+ 'aria-label': ariaLabel = label,
27
+ ...props
28
+ }) => (
29
+ <div className={classNames('relative', 'inline-block', className)} {...props}>
30
+ <details className="group">
31
+ <summary className={styles.summary} role="button" aria-haspopup="menu">
32
+ <ClockIcon className="size-4" />
33
+ <span>{label}</span>
34
+ <ChevronDownIcon className="size-3 group-open:rotate-180 motion-safe:transition-transform" />
35
+ </summary>
36
+ <div
37
+ className={styles.dropdownContentWrapper}
38
+ role="menu"
39
+ aria-label={ariaLabel}
40
+ >
41
+ <div className={styles.dropdownContentInner}>
42
+ {changes.map((change, index) => {
43
+ const MenuItem = change.url ? As : 'div';
44
+
45
+ return (
46
+ <MenuItem
47
+ key={index}
48
+ className={styles.dropdownItem}
49
+ role="menuitem"
50
+ tabIndex={0}
51
+ aria-label={`${change.label}: ${change.versions.join(', ')}`}
52
+ href={change.url}
53
+ >
54
+ <div className={styles.dropdownLabel}>{change.label}</div>
55
+ <div className={styles.dropdownVersions}>
56
+ {change.versions.join(', ')}
57
+ </div>
58
+ </MenuItem>
59
+ );
60
+ })}
61
+ </div>
62
+ </div>
63
+ </details>
64
+ </div>
65
+ );
66
+
67
+ export default ChangeHistory;