@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
@@ -1,96 +1,78 @@
1
- /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
1
+ @reference "../../styles/index.css";
2
+
2
3
  .root {
3
- width: 100%;
4
- border-radius: var(--radius-sm, 0.25rem);
5
- border-style: var(--tw-border-style);
6
- border-width: 1px;
7
- border-color: var(--color-neutral-900, #2c3437);
8
- background-color: var(--color-neutral-950, #0d121c);
4
+ @apply w-full
5
+ rounded-sm
6
+ border
7
+ border-neutral-900
8
+ bg-neutral-950;
9
+
9
10
  .content {
10
- margin: calc(var(--spacing, 0.25rem)*0);
11
- padding: calc(var(--spacing, 0.25rem)*4);
11
+ @apply m-0
12
+ p-4;
13
+
12
14
  & > code {
13
- display: grid;
14
- overflow-x: auto;
15
- background-color: transparent;
16
- padding: calc(var(--spacing, 0.25rem)*0);
17
- font-family: var(--font-ibm-plex-mono, var(--font-ibm-plex-mono));
18
- font-size: var(--text-sm, 0.875rem);
19
- line-height: var(--tw-leading, var(--text-sm--line-height, 1.42857));
20
- --tw-leading: var(--leading-snug, 1.375);
21
- line-height: var(--leading-snug, 1.375);
22
- --tw-font-weight: var(--font-weight-regular, 400);
23
- font-weight: var(--font-weight-regular, 400);
24
- color: var(--color-neutral-400, #cbd4d9);
25
- counter-reset: line;
26
- scrollbar-width: thin;
15
+ @apply font-ibm-plex-mono
16
+ font-regular
17
+ scrollbar-thin
18
+ grid
19
+ overflow-x-auto
20
+ bg-transparent
21
+ p-0
22
+ text-sm
23
+ leading-snug
24
+ text-neutral-400
25
+ [counter-reset:line];
26
+
27
27
  & > [class='line'] {
28
- position: relative;
29
- min-width: calc(var(--spacing, 0.25rem)*0);
30
- padding-left: calc(var(--spacing, 0.25rem)*8);
28
+ @apply relative
29
+ min-w-0
30
+ pl-8;
31
+
31
32
  &:not(:empty:last-child)::before {
32
- display: inline-block;
33
- --tw-content: '';
34
- content: var(--tw-content);
33
+ @apply inline-block
34
+ content-[''];
35
35
  }
36
+
36
37
  &:not(:empty:last-child)::after {
37
- position: absolute;
38
- top: calc(var(--spacing, 0.25rem)*0);
39
- left: calc(var(--spacing, 0.25rem)*0);
40
- margin-right: calc(var(--spacing, 0.25rem)*4);
41
- width: calc(var(--spacing, 0.25rem)*4.5);
42
- text-align: right;
43
- font-family: var(--font-ibm-plex-mono, var(--font-ibm-plex-mono));
44
- color: var(--color-neutral-600, #929fa5);
45
- content: counter(line);
46
- counter-increment: line;
38
+ @apply font-ibm-plex-mono
39
+ w-4.5
40
+ absolute
41
+ left-0
42
+ top-0
43
+ mr-4
44
+ text-right
45
+ text-neutral-600
46
+ [content:counter(line)]
47
+ [counter-increment:line];
47
48
  }
48
49
  }
49
50
  }
50
51
  }
52
+
51
53
  & > .footer {
52
- display: flex;
53
- align-items: center;
54
- justify-content: space-between;
55
- border-top-style: var(--tw-border-style);
56
- border-top-width: 1px;
57
- border-top-color: var(--color-neutral-900, #2c3437);
58
- padding-inline: calc(var(--spacing, 0.25rem)*4);
59
- padding-block: calc(var(--spacing, 0.25rem)*3);
60
- font-size: var(--text-sm, 0.875rem);
61
- line-height: var(--tw-leading, var(--text-sm--line-height, 1.42857));
62
- --tw-font-weight: var(--font-weight-medium, 500);
63
- font-weight: var(--font-weight-medium, 500);
54
+ @apply flex
55
+ items-center
56
+ justify-between
57
+ border-t
58
+ border-t-neutral-900
59
+ px-4
60
+ py-3
61
+ text-sm
62
+ font-medium;
63
+
64
64
  & > .language {
65
- color: var(--color-neutral-400, #cbd4d9);
65
+ @apply text-neutral-400;
66
66
  }
67
+
67
68
  & > .action {
68
- padding-inline: calc(var(--spacing, 0.25rem)*3);
69
- padding-block: calc(var(--spacing, 0.25rem)*1.5);
70
- --tw-font-weight: var(--font-weight-medium, 500);
71
- font-weight: var(--font-weight-medium, 500);
69
+ @apply px-3
70
+ py-1.5
71
+ font-medium;
72
72
  }
73
73
  }
74
74
  }
75
+
75
76
  .icon {
76
- width: calc(var(--spacing, 0.25rem)*4);
77
- height: calc(var(--spacing, 0.25rem)*4);
78
- }
79
- @property --tw-border-style {
80
- syntax: "*";
81
- inherits: false;
82
- initial-value: solid;
83
- }
84
- @property --tw-leading {
85
- syntax: "*";
86
- inherits: false;
87
- }
88
- @property --tw-font-weight {
89
- syntax: "*";
90
- inherits: false;
91
- }
92
- @property --tw-content {
93
- syntax: "*";
94
- inherits: false;
95
- initial-value: "";
77
+ @apply size-4;
96
78
  }
@@ -0,0 +1,39 @@
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;
@@ -0,0 +1,122 @@
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,69 +1,51 @@
1
- /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
1
+ @reference "../../styles/index.css";
2
+
2
3
  .crossLink {
3
- display: flex;
4
- flex-direction: column;
5
- align-items: flex-start;
6
- gap: calc(var(--spacing, 0.25rem)*2);
7
- overflow: hidden;
8
- text-overflow: ellipsis;
9
- white-space: nowrap;
10
- border-radius: var(--radius-sm, 0.25rem);
11
- border-style: var(--tw-border-style);
12
- border-width: 1px;
13
- --tw-border-style: solid;
14
- border-style: solid;
15
- border-color: var(--color-neutral-300, #d9e1e4);
16
- background-color: var(--color-white, #fff);
17
- padding: calc(var(--spacing, 0.25rem)*3);
18
- text-decoration-line: none;
19
- &:where([data-theme=dark], [data-theme=dark] *) {
20
- border-color: var(--color-neutral-900, #2c3437);
21
- }
22
- &:where([data-theme=dark], [data-theme=dark] *) {
23
- background-color: var(--color-neutral-950, #0d121c);
24
- }
4
+ @apply flex
5
+ flex-col
6
+ items-start
7
+ gap-2
8
+ truncate
9
+ rounded-sm
10
+ border
11
+ border-solid
12
+ border-neutral-300
13
+ bg-white
14
+ p-3
15
+ no-underline
16
+ dark:border-neutral-900
17
+ dark:bg-neutral-950;
18
+
25
19
  .header {
26
- display: flex;
27
- align-items: center;
28
- gap: calc(var(--spacing, 0.25rem)*2);
29
- align-self: stretch;
30
- font-size: var(--text-xs, 0.75rem);
31
- line-height: var(--tw-leading, var(--text-xs--line-height, 1.33333));
32
- color: var(--color-neutral-800, #556066);
33
- &:where([data-theme=dark], [data-theme=dark] *) {
34
- color: var(--color-neutral-100, #f6f7f9);
35
- }
20
+ @apply flex
21
+ items-center
22
+ gap-2
23
+ self-stretch
24
+ text-xs
25
+ text-neutral-800
26
+ dark:text-neutral-100;
27
+
36
28
  &.reverse {
37
- flex-direction: row-reverse;
38
- justify-content: flex-start;
29
+ @apply flex-row-reverse
30
+ justify-start;
39
31
  }
32
+
40
33
  .icon {
41
- width: calc(var(--spacing, 0.25rem)*4);
42
- height: calc(var(--spacing, 0.25rem)*4);
43
- color: var(--color-neutral-600, #929fa5);
44
- &:where([data-theme=dark], [data-theme=dark] *) {
45
- color: var(--color-neutral-400, #cbd4d9);
46
- }
34
+ @apply size-4
35
+ text-neutral-600
36
+ dark:text-neutral-400;
47
37
  }
48
38
  }
39
+
49
40
  .content {
50
- align-self: stretch;
51
- overflow: hidden;
52
- text-overflow: ellipsis;
53
- white-space: nowrap;
54
- font-size: var(--text-sm, 0.875rem);
55
- line-height: var(--tw-leading, var(--text-sm--line-height, 1.42857));
56
- color: var(--color-neutral-900, #2c3437);
57
- &:where([data-theme=dark], [data-theme=dark] *) {
58
- color: var(--color-white, #fff);
59
- }
41
+ @apply self-stretch
42
+ truncate
43
+ text-sm
44
+ text-neutral-900
45
+ dark:text-white;
46
+
60
47
  &.reverse {
61
- text-align: right;
48
+ @apply text-right;
62
49
  }
63
50
  }
64
51
  }
65
- @property --tw-border-style {
66
- syntax: "*";
67
- inherits: false;
68
- initial-value: solid;
69
- }
@@ -0,0 +1,38 @@
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;
@@ -0,0 +1,46 @@
1
+ import classNames from 'classnames';
2
+ import type { FC } from 'react';
3
+
4
+ import PrevNextArrow from '#ui/Common/BasePagination/PrevNextArrow';
5
+ import type { LinkLike, FormattedMessage } from '#ui/types';
6
+
7
+ import styles from './index.module.css';
8
+
9
+ export type CrossLinkProps = {
10
+ type: 'previous' | 'next';
11
+ text: FormattedMessage;
12
+ label: string;
13
+ link: string;
14
+ as: LinkLike;
15
+ };
16
+
17
+ const BaseCrossLink: FC<CrossLinkProps> = ({
18
+ type,
19
+ label,
20
+ text,
21
+ link,
22
+ as: Component = 'a',
23
+ }) => {
24
+ return (
25
+ <Component className={styles.crossLink} href={link}>
26
+ <span
27
+ className={classNames(styles.header, {
28
+ [styles.reverse]: type === 'next',
29
+ })}
30
+ >
31
+ <PrevNextArrow className={styles.icon} type={type} />
32
+ {label}
33
+ </span>
34
+
35
+ <span
36
+ className={classNames(styles.content, {
37
+ [styles.reverse]: type === 'next',
38
+ })}
39
+ >
40
+ {text}
41
+ </span>
42
+ </Component>
43
+ );
44
+ };
45
+
46
+ export default BaseCrossLink;
@@ -1,77 +1,43 @@
1
- /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
1
+ @reference "../../styles/index.css";
2
+
2
3
  .tabsList {
3
- margin-top: calc(var(--spacing, 0.25rem)*10);
4
- margin-bottom: calc(var(--spacing, 0.25rem)*6);
5
- display: flex;
6
- gap: calc(var(--spacing, 0.25rem)*2);
7
- border-bottom-style: var(--tw-border-style);
8
- border-bottom-width: 1px;
9
- border-bottom-color: var(--color-neutral-200, #e9edf0);
10
- font-family: var(--font-open-sans, var(--font-open-sans));
11
- @media (width < 670px) {
12
- display: none;
13
- }
14
- &:where([data-theme=dark], [data-theme=dark] *) {
15
- border-bottom-color: var(--color-neutral-800, #556066);
16
- }
4
+ @apply font-open-sans
5
+ max-xs:hidden
6
+ mb-6
7
+ mt-10
8
+ flex
9
+ gap-2
10
+ border-b
11
+ border-b-neutral-200
12
+ dark:border-b-neutral-800;
13
+
17
14
  .tabsTrigger {
18
- border-bottom-style: var(--tw-border-style);
19
- border-bottom-width: 2px;
20
- border-bottom-color: transparent;
21
- padding-inline: calc(var(--spacing, 0.25rem)*1);
22
- padding-bottom: 11px;
23
- font-size: var(--text-sm, 0.875rem);
24
- line-height: var(--tw-leading, var(--text-sm--line-height, 1.42857));
25
- --tw-font-weight: var(--font-weight-semibold, 600);
26
- font-weight: var(--font-weight-semibold, 600);
27
- color: var(--color-neutral-800, #556066);
28
- &:where([data-theme=dark], [data-theme=dark] *) {
29
- color: var(--color-neutral-200, #e9edf0);
30
- }
31
- &:not([data-state='active']):hover {
32
- border-bottom-color: var(--color-neutral-900, #2c3437);
33
- color: var(--color-neutral-900, #2c3437);
34
- &:where([data-theme=dark], [data-theme=dark] *) {
35
- border-bottom-color: var(--color-neutral-300, #d9e1e4);
36
- }
37
- &:where([data-theme=dark], [data-theme=dark] *) {
38
- color: var(--color-neutral-300, #d9e1e4);
39
- }
40
- }
15
+ @apply border-b-2
16
+ border-b-transparent
17
+ px-1
18
+ pb-[11px]
19
+ text-sm
20
+ font-semibold
21
+ text-neutral-800
22
+ dark:text-neutral-200;
23
+
41
24
  &[data-state='active'] {
42
- border-bottom-color: var(--color-green-600, #417e38);
43
- color: var(--color-green-600, #417e38);
44
- &:where([data-theme=dark], [data-theme=dark] *) {
45
- border-bottom-color: var(--color-green-400, #84ba64);
46
- }
47
- &:where([data-theme=dark], [data-theme=dark] *) {
48
- color: var(--color-green-400, #84ba64);
49
- }
25
+ @apply border-b-green-600
26
+ text-green-600
27
+ dark:border-b-green-400
28
+ dark:text-green-400;
50
29
  }
51
30
  }
52
31
  }
32
+
53
33
  .tabsSelect {
54
- @media (width >= 40rem) {
55
- visibility: visible;
56
- }
57
- @media (width >= 48rem) {
58
- display: none;
59
- }
34
+ @apply sm:visible
35
+ md:hidden;
36
+
60
37
  > span {
61
- margin-block: calc(var(--spacing, 0.25rem)*6);
62
- display: none;
63
- width: 100%;
64
- @media (width < 670px) {
65
- display: flex;
66
- }
38
+ @apply max-xs:flex
39
+ my-6
40
+ hidden
41
+ w-full;
67
42
  }
68
43
  }
69
- @property --tw-border-style {
70
- syntax: "*";
71
- inherits: false;
72
- initial-value: solid;
73
- }
74
- @property --tw-font-weight {
75
- syntax: "*";
76
- inherits: false;
77
- }
@@ -0,0 +1,34 @@
1
+ import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2
+
3
+ import BaseLinkTabs from '#ui/Common/BaseLinkTabs';
4
+
5
+ type Story = StoryObj<typeof BaseLinkTabs>;
6
+ type Meta = MetaObj<typeof BaseLinkTabs>;
7
+
8
+ export const Default: Story = {
9
+ args: {
10
+ label: 'Select Tab',
11
+ tabs: [
12
+ {
13
+ key: 'package',
14
+ label: 'Package Manager',
15
+ link: '/package-manager',
16
+ },
17
+ {
18
+ key: 'prebuilt',
19
+ label: 'Prebuilt Installer',
20
+ link: '/prebuilt-installer',
21
+ },
22
+ {
23
+ key: 'source',
24
+ label: 'Source Code',
25
+ link: '/source-code',
26
+ },
27
+ ],
28
+ activeTab: 'prebuilt',
29
+ children: <p>Tab content goes here</p>,
30
+ onSelect: console.log,
31
+ },
32
+ };
33
+
34
+ export default { component: BaseLinkTabs } as Meta;