@node-core/ui-components 0.0.1 → 1.0.1-f948ce8a25da149fc61135f90a43e189c4909f5d

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 (186) hide show
  1. package/Common/AlertBox/index.module.css +76 -0
  2. package/Common/AlertBox/index.stories.tsx +73 -0
  3. package/Common/AlertBox/index.tsx +24 -0
  4. package/Common/AvatarGroup/Avatar/index.module.css +40 -0
  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 +31 -0
  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 +25 -0
  12. package/Common/AvatarGroup/index.stories.tsx +56 -0
  13. package/Common/AvatarGroup/index.tsx +87 -0
  14. package/Common/Badge/index.module.css +38 -0
  15. package/Common/Badge/index.stories.tsx +38 -0
  16. package/Common/Badge/index.tsx +35 -0
  17. package/Common/BadgeGroup/index.module.css +77 -0
  18. package/Common/BadgeGroup/index.stories.tsx +35 -0
  19. package/Common/BadgeGroup/index.tsx +35 -0
  20. package/Common/Banner/index.module.css +42 -0
  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 +142 -0
  26. package/Common/BaseButton/index.stories.tsx +67 -0
  27. package/Common/BaseButton/index.tsx +59 -0
  28. package/Common/BaseCodeBox/index.module.css +84 -0
  29. package/Common/BaseCodeBox/index.stories.tsx +39 -0
  30. package/Common/BaseCodeBox/index.tsx +133 -0
  31. package/Common/BaseCrossLink/index.module.css +51 -0
  32. package/Common/BaseCrossLink/index.stories.tsx +38 -0
  33. package/Common/BaseCrossLink/index.tsx +46 -0
  34. package/Common/BaseLinkTabs/index.module.css +43 -0
  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 +10 -0
  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 +27 -0
  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 +39 -0
  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 +29 -0
  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 +5 -0
  54. package/Common/Breadcrumbs/BreadcrumbHomeLink/index.tsx +30 -0
  55. package/Common/Breadcrumbs/BreadcrumbItem/index.module.css +41 -0
  56. package/Common/Breadcrumbs/BreadcrumbItem/index.tsx +42 -0
  57. package/Common/Breadcrumbs/BreadcrumbLink/index.module.css +22 -0
  58. package/Common/Breadcrumbs/BreadcrumbLink/index.tsx +37 -0
  59. package/Common/Breadcrumbs/BreadcrumbRoot/index.module.css +9 -0
  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/CodeTabs/index.module.css +56 -0
  65. package/Common/CodeTabs/index.stories.tsx +74 -0
  66. package/Common/CodeTabs/index.tsx +16 -0
  67. package/Common/GlowingBackdrop/index.module.css +32 -0
  68. package/Common/GlowingBackdrop/index.stories.tsx +10 -0
  69. package/Common/GlowingBackdrop/index.tsx +13 -0
  70. package/Common/LanguageDropDown/index.module.css +53 -0
  71. package/Common/LanguageDropDown/index.stories.tsx +19 -0
  72. package/Common/LanguageDropDown/index.tsx +56 -0
  73. package/Common/Modal/index.module.css +79 -0
  74. package/Common/Modal/index.stories.tsx +32 -0
  75. package/Common/Modal/index.tsx +48 -0
  76. package/Common/NodejsLogo/index.module.css +6 -0
  77. package/Common/NodejsLogo/index.stories.tsx +14 -0
  78. package/Common/NodejsLogo/index.tsx +26 -0
  79. package/Common/Notification/index.module.css +20 -0
  80. package/Common/Notification/index.stories.tsx +36 -0
  81. package/Common/Notification/index.tsx +34 -0
  82. package/Common/Preview/index.module.css +79 -0
  83. package/Common/Preview/index.stories.tsx +44 -0
  84. package/Common/Preview/index.tsx +25 -0
  85. package/Common/ProgressionSidebar/ProgressionSidebarGroup/index.module.css +47 -0
  86. package/Common/ProgressionSidebar/ProgressionSidebarGroup/index.tsx +35 -0
  87. package/Common/ProgressionSidebar/ProgressionSidebarIcon/index.tsx +16 -0
  88. package/Common/ProgressionSidebar/ProgressionSidebarItem/index.module.css +39 -0
  89. package/Common/ProgressionSidebar/ProgressionSidebarItem/index.tsx +32 -0
  90. package/Common/ProgressionSidebar/index.module.css +30 -0
  91. package/Common/ProgressionSidebar/index.stories.tsx +79 -0
  92. package/Common/ProgressionSidebar/index.tsx +59 -0
  93. package/Common/Select/__tests__/index.test.jsx +67 -0
  94. package/Common/Select/index.module.css +161 -0
  95. package/Common/Select/index.stories.tsx +111 -0
  96. package/Common/Select/index.tsx +187 -0
  97. package/Common/Separator/index.module.css +16 -0
  98. package/Common/Separator/index.stories.tsx +32 -0
  99. package/Common/Separator/index.tsx +27 -0
  100. package/Common/Skeleton/index.module.css +29 -0
  101. package/Common/Skeleton/index.tsx +39 -0
  102. package/Common/Tabs/__tests__/index.test.jsx +52 -0
  103. package/Common/Tabs/index.module.css +53 -0
  104. package/Common/Tabs/index.stories.tsx +50 -0
  105. package/Common/Tabs/index.tsx +54 -0
  106. package/Common/ThemeToggle/__tests__/index.test.jsx +35 -0
  107. package/Common/ThemeToggle/index.module.css +15 -0
  108. package/Common/ThemeToggle/index.stories.tsx +10 -0
  109. package/Common/ThemeToggle/index.tsx +15 -0
  110. package/Common/Tooltip/index.module.css +43 -0
  111. package/Common/Tooltip/index.stories.tsx +73 -0
  112. package/Common/Tooltip/index.tsx +48 -0
  113. package/Containers/Article/index.module.css +70 -0
  114. package/Containers/Article/index.stories.tsx +39 -0
  115. package/Containers/Article/index.tsx +9 -0
  116. package/Containers/Footer/index.module.css +46 -0
  117. package/Containers/Footer/index.stories.tsx +27 -0
  118. package/Containers/Footer/index.tsx +95 -0
  119. package/Containers/MetaBar/__tests__/index.test.jsx +63 -0
  120. package/Containers/MetaBar/index.module.css +84 -0
  121. package/Containers/MetaBar/index.stories.tsx +80 -0
  122. package/Containers/MetaBar/index.tsx +72 -0
  123. package/Containers/NavBar/NavItem/index.module.css +60 -0
  124. package/Containers/NavBar/NavItem/index.stories.tsx +38 -0
  125. package/Containers/NavBar/NavItem/index.tsx +44 -0
  126. package/Containers/NavBar/index.module.css +125 -0
  127. package/Containers/NavBar/index.stories.tsx +45 -0
  128. package/Containers/NavBar/index.tsx +94 -0
  129. package/Containers/Sidebar/SidebarGroup/index.module.css +26 -0
  130. package/Containers/Sidebar/SidebarGroup/index.stories.tsx +36 -0
  131. package/Containers/Sidebar/SidebarGroup/index.tsx +30 -0
  132. package/Containers/Sidebar/SidebarItem/index.module.css +35 -0
  133. package/Containers/Sidebar/SidebarItem/index.stories.tsx +15 -0
  134. package/Containers/Sidebar/SidebarItem/index.tsx +26 -0
  135. package/Containers/Sidebar/index.module.css +31 -0
  136. package/Containers/Sidebar/index.stories.tsx +84 -0
  137. package/Containers/Sidebar/index.tsx +58 -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.ts +10 -0
  149. package/Icons/Logos/JsGreen.tsx +24 -0
  150. package/Icons/Logos/JsWhite.tsx +37 -0
  151. package/Icons/Logos/Nodejs.tsx +188 -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.ts +17 -0
  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.ts +6 -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.ts +5 -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.ts +9 -0
  174. package/LICENSE +21 -0
  175. package/package.json +89 -5
  176. package/stylelint/__tests__/index.test.mjs +80 -0
  177. package/stylelint/one-utility-class-per-line.mjs +64 -0
  178. package/stylelint/utils.mjs +53 -0
  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 +34 -0
  183. package/styles/markdown.css +173 -0
  184. package/styles/theme.css +175 -0
  185. package/types.ts +25 -0
  186. package/README.md +0 -1
@@ -0,0 +1,19 @@
1
+ import type { FC, SVGProps } from 'react';
2
+
3
+ const Microsoft: FC<SVGProps<SVGSVGElement>> = props => (
4
+ <svg
5
+ width="32"
6
+ height="32"
7
+ viewBox="0 0 32 32"
8
+ fill="none"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ {...props}
11
+ >
12
+ <path fill="#FEBA08" d="M17 17h10v10H17z" />
13
+ <path fill="#05A6F0" d="M5 17h10v10H5z" />
14
+ <path fill="#80BC06" d="M17 5h10v10H17z" />
15
+ <path fill="#F25325" d="M5 5h10v10H5z" />
16
+ </svg>
17
+ );
18
+
19
+ export default Microsoft;
@@ -0,0 +1,6 @@
1
+ import AIX from '#ui/Icons/OperatingSystem/AIX';
2
+ import Apple from '#ui/Icons/OperatingSystem/Apple';
3
+ import Linux from '#ui/Icons/OperatingSystem/Linux';
4
+ import Microsoft from '#ui/Icons/OperatingSystem/Microsoft';
5
+
6
+ export { AIX, Apple, Linux, Microsoft };
@@ -0,0 +1,21 @@
1
+ import type { FC, SVGProps } from 'react';
2
+
3
+ const NpmIcon: FC<SVGProps<SVGSVGElement>> = props => (
4
+ <svg
5
+ width="32px"
6
+ height="32px"
7
+ viewBox="0 0 24 24"
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ {...props}
10
+ >
11
+ <g fill="none" fillRule="evenodd">
12
+ <rect width="24" height="24" fill="#D40001" />
13
+ <path
14
+ fill="#fff"
15
+ d="M16.7179487,7.92840493 L12.2051282,7.92840493 L12.2051282,20.2494172 L4,20.2494172 L4,3 L12.2051282,3 L20,3 L20,7.92840493 L20,20.2494172 L16.7179487,20.2494172 L16.7179487,7.92840493 Z"
16
+ />
17
+ </g>
18
+ </svg>
19
+ );
20
+
21
+ export default NpmIcon;
@@ -0,0 +1,22 @@
1
+ import type { FC, SVGProps } from 'react';
2
+
3
+ const PnpmIcon: FC<SVGProps<SVGSVGElement>> = props => (
4
+ <svg
5
+ width="32px"
6
+ height="32px"
7
+ viewBox="0 0 32 32"
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ {...props}
10
+ >
11
+ <path d="M30,10.75H21.251V2H30Z" fill="#f9ad00" />
12
+ <path d="M20.374,10.75h-8.75V2h8.75Z" fill="#f9ad00" />
13
+ <path d="M10.749,10.75H2V2h8.749Z" fill="#f9ad00" />
14
+ <path d="M30,20.375H21.251v-8.75H30Z" fill="#f9ad00" />
15
+ <path d="M20.374,20.375h-8.75v-8.75h8.75Z" fill="#4e4e4e" />
16
+ <path d="M20.374,30h-8.75V21.25h8.75Z" fill="#4e4e4e" />
17
+ <path d="M30,30H21.251V21.25H30Z" fill="#4e4e4e" />
18
+ <path d="M10.749,30H2V21.25h8.749Z" fill="#4e4e4e" />
19
+ </svg>
20
+ );
21
+
22
+ export default PnpmIcon;
@@ -0,0 +1,22 @@
1
+ import type { FC, SVGProps } from 'react';
2
+
3
+ const YarnIcon: FC<SVGProps<SVGSVGElement>> = props => (
4
+ <svg
5
+ width="32px"
6
+ height="32px"
7
+ xmlns="http://www.w3.org/2000/svg"
8
+ viewBox="0 0 518 518"
9
+ {...props}
10
+ >
11
+ <path
12
+ fill="#2c8ebb"
13
+ d="M259 0c143 0 259 116 259 259S402 518 259 518 0 402 0 259 116 0 259 0z"
14
+ />
15
+ <path
16
+ fill="#fff"
17
+ d="M435.2 337.5c-1.8-14.2-13.8-24-29.2-23.8-23 .3-42.3 12.2-55.1 20.1-5 3.1-9.3 5.4-13 7.1.8-11.6.1-26.8-5.9-43.5-7.3-20-17.1-32.3-24.1-39.4 8.1-11.8 19.2-29 24.4-55.6 4.5-22.7 3.1-58-7.2-77.8-2.1-4-5.6-6.9-10-8.1-1.8-.5-5.2-1.5-11.9.4C293.1 96 289.6 93.8 286.9 92c-5.6-3.6-12.2-4.4-18.4-2.1-8.3 3-15.4 11-22.1 25.2-1 2.1-1.9 4.1-2.7 6.1-12.7.9-32.7 5.5-49.6 23.8-2.1 2.3-6.2 4-10.5 5.6h.1c-8.8 3.1-12.8 10.3-17.7 23.3-6.8 18.2.2 36.1 7.1 47.7-9.4 8.4-21.9 21.8-28.5 37.5-8.2 19.4-9.1 38.4-8.8 48.7-7 7.4-17.8 21.3-19 36.9-1.6 21.8 6.3 36.6 9.8 42 1 1.6 2.1 2.9 3.3 4.2-.4 2.7-.5 5.6.1 8.6 1.3 7 5.7 12.7 12.4 16.3 13.2 7 31.6 10 45.8 2.9 5.1 5.4 14.4 10.6 31.3 10.6h1c4.3 0 58.9-2.9 74.8-6.8 7.1-1.7 12-4.7 15.2-7.4 10.2-3.2 38.4-12.8 65-30 18.8-12.2 25.3-14.8 39.3-18.2 13.6-3.3 22.1-15.7 20.4-29.4zm-23.8 14.7c-16 3.8-24.1 7.3-43.9 20.2-30.9 20-64.7 29.3-64.7 29.3s-2.8 4.2-10.9 6.1c-14 3.4-66.7 6.3-71.5 6.4-12.9.1-20.8-3.3-23-8.6-6.7-16 9.6-23 9.6-23s-3.6-2.2-5.7-4.2c-1.9-1.9-3.9-5.7-4.5-4.3-2.5 6.1-3.8 21-10.5 27.7-9.2 9.3-26.6 6.2-36.9.8-11.3-6 .8-20.1.8-20.1s-6.1 3.6-11-3.8c-4.4-6.8-8.5-18.4-7.4-32.7 1.2-16.3 19.4-32.1 19.4-32.1s-3.2-24.1 7.3-48.8c9.5-22.5 35.1-40.6 35.1-40.6s-21.5-23.8-13.5-45.2c5.2-14 7.3-13.9 9-14.5 6-2.3 11.8-4.8 16.1-9.5 21.5-23.2 48.9-18.8 48.9-18.8s13-39.5 25-31.8c3.7 2.4 17 32 17 32s14.2-8.3 15.8-5.2c8.6 16.7 9.6 48.6 5.8 68-6.4 32-22.4 49.2-28.8 60-1.5 2.5 17.2 10.4 29 43.1 10.9 29.9 1.2 55 2.9 57.8.3.5.4.7.4.7s12.5 1 37.6-14.5c13.4-8.3 29.3-17.6 47.4-17.8 17.5-.3 18.4 20.2 5.2 23.4z"
18
+ />
19
+ </svg>
20
+ );
21
+
22
+ export default YarnIcon;
@@ -0,0 +1,5 @@
1
+ import NPM from '#ui/Icons/PackageManager/Npm';
2
+ import PNPM from '#ui/Icons/PackageManager/Pnpm';
3
+ import YARN from '#ui/Icons/PackageManager/Yarn';
4
+
5
+ export { NPM, PNPM, YARN };
@@ -0,0 +1,19 @@
1
+ import type { FC, SVGProps } from 'react';
2
+
3
+ const BlueskyIcon: FC<SVGProps<SVGSVGElement>> = props => (
4
+ <svg
5
+ width="20"
6
+ height="20"
7
+ viewBox="0 0 568 501"
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ fill="none"
10
+ {...props}
11
+ >
12
+ <path
13
+ fill="#1185FE"
14
+ d="M123.121 33.664C188.241 82.553 258.281 181.68 284 234.873c25.719-53.192 95.759-152.32 160.879-201.21C491.866-1.611 568-28.906 568 57.947c0 17.346-9.945 145.713-15.778 166.555-20.275 72.453-94.155 90.933-159.875 79.748C507.222 323.8 536.444 388.56 473.333 453.32c-119.86 122.992-172.272-30.859-185.702-70.281-2.462-7.227-3.614-10.608-3.631-7.733-.017-2.875-1.169.506-3.631 7.733-13.43 39.422-65.842 193.273-185.702 70.281-63.111-64.76-33.89-129.52 80.986-149.071-65.72 11.185-139.6-7.295-159.875-79.748C9.945 203.659 0 75.291 0 57.946 0-28.906 76.135-1.612 123.121 33.664Z"
15
+ />
16
+ </svg>
17
+ );
18
+
19
+ export default BlueskyIcon;
@@ -0,0 +1,20 @@
1
+ import type { FC, SVGProps } from 'react';
2
+
3
+ const Discord: FC<SVGProps<SVGSVGElement>> = props => (
4
+ <svg
5
+ width="20"
6
+ height="20"
7
+ viewBox="0 -28.5 256 256"
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ fill="none"
10
+ {...props}
11
+ >
12
+ <path
13
+ d="M216.856339,16.5966031 C200.285002,8.84328665 182.566144,3.2084988 164.041564,0 C161.766523,4.11318106 159.108624,9.64549908 157.276099,14.0464379 C137.583995,11.0849896 118.072967,11.0849896 98.7430163,14.0464379 C96.9108417,9.64549908 94.1925838,4.11318106 91.8971895,0 C73.3526068,3.2084988 55.6133949,8.86399117 39.0420583,16.6376612 C5.61752293,67.146514 -3.4433191,116.400813 1.08711069,164.955721 C23.2560196,181.510915 44.7403634,191.567697 65.8621325,198.148576 C71.0772151,190.971126 75.7283628,183.341335 79.7352139,175.300261 C72.104019,172.400575 64.7949724,168.822202 57.8887866,164.667963 C59.7209612,163.310589 61.5131304,161.891452 63.2445898,160.431257 C105.36741,180.133187 151.134928,180.133187 192.754523,160.431257 C194.506336,161.891452 196.298154,163.310589 198.110326,164.667963 C191.183787,168.842556 183.854737,172.420929 176.223542,175.320965 C180.230393,183.341335 184.861538,190.991831 190.096624,198.16893 C211.238746,191.588051 232.743023,181.531619 254.911949,164.955721 C260.227747,108.668201 245.831087,59.8662432 216.856339,16.5966031 Z M85.4738752,135.09489 C72.8290281,135.09489 62.4592217,123.290155 62.4592217,108.914901 C62.4592217,94.5396472 72.607595,82.7145587 85.4738752,82.7145587 C98.3405064,82.7145587 108.709962,94.5189427 108.488529,108.914901 C108.508531,123.290155 98.3405064,135.09489 85.4738752,135.09489 Z M170.525237,135.09489 C157.88039,135.09489 147.510584,123.290155 147.510584,108.914901 C147.510584,94.5396472 157.658606,82.7145587 170.525237,82.7145587 C183.391518,82.7145587 193.761324,94.5189427 193.539891,108.914901 C193.539891,123.290155 183.391518,135.09489 170.525237,135.09489 Z"
14
+ fill="#5865F2"
15
+ fillRule="nonzero"
16
+ />
17
+ </svg>
18
+ );
19
+
20
+ export default Discord;
@@ -0,0 +1,16 @@
1
+ import type { FC, SVGProps } from 'react';
2
+
3
+ const GitHubIcon: FC<SVGProps<SVGSVGElement>> = props => (
4
+ <svg
5
+ width="20"
6
+ height="20"
7
+ viewBox="0 0 20 20"
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ fill="currentColor"
10
+ {...props}
11
+ >
12
+ <path d="M10 1.25C5.16562 1.25 1.25 5.16562 1.25 10C1.25 13.8719 3.75469 17.1422 7.23281 18.3016C7.67031 18.3781 7.83437 18.1156 7.83437 17.8859C7.83437 17.6781 7.82344 16.9891 7.82344 16.2563C5.625 16.6609 5.05625 15.7203 4.88125 15.2281C4.78281 14.9766 4.35625 14.2 3.98438 13.9922C3.67812 13.8281 3.24063 13.4234 3.97344 13.4125C4.6625 13.4016 5.15469 14.0469 5.31875 14.3094C6.10625 15.6328 7.36406 15.2609 7.86719 15.0312C7.94375 14.4625 8.17344 14.0797 8.425 13.8609C6.47813 13.6422 4.44375 12.8875 4.44375 9.54062C4.44375 8.58906 4.78281 7.80156 5.34062 7.18906C5.25313 6.97031 4.94687 6.07344 5.42812 4.87031C5.42812 4.87031 6.16094 4.64063 7.83437 5.76719C8.53438 5.57031 9.27813 5.47187 10.0219 5.47187C10.7656 5.47187 11.5094 5.57031 12.2094 5.76719C13.8828 4.62969 14.6156 4.87031 14.6156 4.87031C15.0969 6.07344 14.7906 6.97031 14.7031 7.18906C15.2609 7.80156 15.6 8.57812 15.6 9.54062C15.6 12.8984 13.5547 13.6422 11.6078 13.8609C11.925 14.1344 12.1984 14.6594 12.1984 15.4797C12.1984 16.65 12.1875 17.5906 12.1875 17.8859C12.1875 18.1156 12.3516 18.3891 12.7891 18.3016C14.5261 17.7152 16.0355 16.5988 17.1048 15.1096C18.1741 13.6204 18.7495 11.8333 18.75 10C18.75 5.16562 14.8344 1.25 10 1.25Z" />
13
+ </svg>
14
+ );
15
+
16
+ export default GitHubIcon;
@@ -0,0 +1,16 @@
1
+ import type { FC, SVGProps } from 'react';
2
+
3
+ const LinkedInIcon: FC<SVGProps<SVGSVGElement>> = props => (
4
+ <svg
5
+ width="20"
6
+ height="20"
7
+ viewBox="0 0 24 24"
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ fill="currentColor"
10
+ {...props}
11
+ >
12
+ <path d="M20.5 2h-17A1.5 1.5 0 002 3.5v17A1.5 1.5 0 003.5 22h17a1.5 1.5 0 001.5-1.5v-17A1.5 1.5 0 0020.5 2zM8 19H5v-9h3zM6.5 8.25A1.75 1.75 0 118.3 6.5a1.78 1.78 0 01-1.8 1.75zM19 19h-3v-4.74c0-1.42-.6-1.93-1.38-1.93A1.74 1.74 0 0013 14.19a.66.66 0 000 .14V19h-3v-9h2.9v1.3a3.11 3.11 0 012.7-1.4c1.55 0 3.36.86 3.36 3.66z" />
13
+ </svg>
14
+ );
15
+
16
+ export default LinkedInIcon;
@@ -0,0 +1,36 @@
1
+ import type { FC, SVGProps } from 'react';
2
+
3
+ const MastodonIcon: FC<SVGProps<SVGSVGElement>> = props => (
4
+ <svg
5
+ width="20"
6
+ height="20"
7
+ viewBox="0 0 75 79"
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ fill="none"
10
+ {...props}
11
+ >
12
+ <path
13
+ d="M73.8393 17.4898C72.6973 9.00165 65.2994 2.31235 56.5296 1.01614C55.05 0.797115 49.4441 0 36.4582 0H36.3612C23.3717 0 20.585 0.797115 19.1054 1.01614C10.5798 2.27644 2.79399 8.28712 0.904997 16.8758C-0.00358524 21.1056 -0.100549 25.7949 0.0682394 30.0965C0.308852 36.2651 0.355538 42.423 0.91577 48.5665C1.30307 52.6474 1.97872 56.6957 2.93763 60.6812C4.73325 68.042 12.0019 74.1676 19.1233 76.6666C26.7478 79.2728 34.9474 79.7055 42.8039 77.9162C43.6682 77.7151 44.5217 77.4817 45.3645 77.216C47.275 76.6092 49.5123 75.9305 51.1571 74.7385C51.1797 74.7217 51.1982 74.7001 51.2112 74.6753C51.2243 74.6504 51.2316 74.6229 51.2325 74.5948V68.6416C51.2321 68.6154 51.2259 68.5896 51.2142 68.5661C51.2025 68.5426 51.1858 68.522 51.1651 68.5058C51.1444 68.4896 51.1204 68.4783 51.0948 68.4726C51.0692 68.4669 51.0426 68.467 51.0171 68.4729C45.9835 69.675 40.8254 70.2777 35.6502 70.2682C26.7439 70.2682 24.3486 66.042 23.6626 64.2826C23.1113 62.762 22.7612 61.1759 22.6212 59.5646C22.6197 59.5375 22.6247 59.5105 22.6357 59.4857C22.6466 59.4609 22.6633 59.4391 22.6843 59.422C22.7053 59.4048 22.73 59.3929 22.7565 59.3871C22.783 59.3813 22.8104 59.3818 22.8367 59.3886C27.7864 60.5826 32.8604 61.1853 37.9522 61.1839C39.1768 61.1839 40.3978 61.1839 41.6224 61.1516C46.7435 61.008 52.1411 60.7459 57.1796 59.7621C57.3053 59.7369 57.431 59.7154 57.5387 59.6831C65.4861 58.157 73.0493 53.3672 73.8178 41.2381C73.8465 40.7606 73.9184 36.2364 73.9184 35.7409C73.9219 34.0569 74.4606 23.7949 73.8393 17.4898Z"
14
+ fill="url(#paint0_linear_549_34)"
15
+ />
16
+ <path
17
+ d="M61.2484 27.0263V48.114H52.8916V27.6475C52.8916 23.3388 51.096 21.1413 47.4437 21.1413C43.4287 21.1413 41.4177 23.7409 41.4177 28.8755V40.0782H33.1111V28.8755C33.1111 23.7409 31.0965 21.1413 27.0815 21.1413C23.4507 21.1413 21.6371 23.3388 21.6371 27.6475V48.114H13.2839V27.0263C13.2839 22.7176 14.384 19.2946 16.5843 16.7572C18.8539 14.2258 21.8311 12.926 25.5264 12.926C29.8036 12.926 33.0357 14.5705 35.1905 17.8559L37.2698 21.346L39.3527 17.8559C41.5074 14.5705 44.7395 12.926 49.0095 12.926C52.7013 12.926 55.6784 14.2258 57.9553 16.7572C60.1531 19.2922 61.2508 22.7152 61.2484 27.0263Z"
18
+ fill="white"
19
+ />
20
+ <defs>
21
+ <linearGradient
22
+ id="paint0_linear_549_34"
23
+ x1="37.0692"
24
+ y1="0"
25
+ x2="37.0692"
26
+ y2="79"
27
+ gradientUnits="userSpaceOnUse"
28
+ >
29
+ <stop stopColor="#6364FF" />
30
+ <stop offset="1" stopColor="#563ACC" />
31
+ </linearGradient>
32
+ </defs>
33
+ </svg>
34
+ );
35
+
36
+ export default MastodonIcon;
@@ -0,0 +1,31 @@
1
+ import type { FC, SVGProps } from 'react';
2
+
3
+ const SlackIcon: FC<SVGProps<SVGSVGElement>> = props => (
4
+ <svg
5
+ width="20"
6
+ height="20"
7
+ viewBox="0 0 20 20"
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ fill="none"
10
+ {...props}
11
+ >
12
+ <path
13
+ fill="#2EB67D"
14
+ d="M16.563 9.375A1.562 1.562 0 1 0 15 7.813v1.562h1.563Zm-4.375 0c.862 0 1.562-.7 1.562-1.563V3.438a1.563 1.563 0 0 0-3.125 0v4.374c0 .863.7 1.563 1.563 1.563Z"
15
+ />
16
+ <path
17
+ fill="#E01E5A"
18
+ d="M3.437 10.625A1.562 1.562 0 1 0 5 12.187v-1.562H3.437Zm4.376 0c-.863 0-1.563.7-1.563 1.563v4.374a1.563 1.563 0 0 0 3.125 0v-4.374c0-.863-.7-1.563-1.563-1.563Z"
19
+ />
20
+ <path
21
+ fill="#ECB22E"
22
+ d="M10.625 16.563A1.562 1.562 0 1 0 12.187 15h-1.562v1.563Zm0-4.375c0 .862.7 1.562 1.563 1.562h4.374a1.562 1.562 0 1 0 0-3.125h-4.374c-.863 0-1.563.7-1.563 1.563Z"
23
+ />
24
+ <path
25
+ fill="#36C5F0"
26
+ d="M9.375 3.437A1.562 1.562 0 1 0 7.813 5h1.562V3.437Zm0 4.376c0-.863-.7-1.563-1.563-1.563H3.438a1.563 1.563 0 0 0 0 3.125h4.374c.863 0 1.563-.7 1.563-1.563Z"
27
+ />
28
+ </svg>
29
+ );
30
+
31
+ export default SlackIcon;
@@ -0,0 +1,16 @@
1
+ import type { FC, SVGProps } from 'react';
2
+
3
+ const XIcon: FC<SVGProps<SVGSVGElement>> = props => (
4
+ <svg
5
+ width="20"
6
+ height="20"
7
+ viewBox="0 0 24 24"
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ fill="currentColor"
10
+ {...props}
11
+ >
12
+ <path d="M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z" />
13
+ </svg>
14
+ );
15
+
16
+ export default XIcon;
@@ -0,0 +1,9 @@
1
+ import Bluesky from '#ui/Icons/Social/Bluesky';
2
+ import Discord from '#ui/Icons/Social/Discord';
3
+ import GitHub from '#ui/Icons/Social/GitHub';
4
+ import LinkedIn from '#ui/Icons/Social/LinkedIn';
5
+ import Mastodon from '#ui/Icons/Social/Mastodon';
6
+ import Slack from '#ui/Icons/Social/Slack';
7
+ import X from '#ui/Icons/Social/X';
8
+
9
+ export { Bluesky, Discord, GitHub, LinkedIn, Mastodon, Slack, X };
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright Node.js Website WG contributors. All rights reserved.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to
7
+ deal in the Software without restriction, including without limitation the
8
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9
+ sell copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21
+ IN THE SOFTWARE.
package/package.json CHANGED
@@ -1,8 +1,92 @@
1
1
  {
2
2
  "name": "@node-core/ui-components",
3
- "version": "0.0.1",
4
- "repository": {
5
- "type": "git",
6
- "url": "https://github.com/nodejs/nodejs.org.git"
3
+ "type": "module",
4
+ "exports": {
5
+ "./*": [
6
+ "./*",
7
+ "./*.tsx",
8
+ "./*/index.tsx",
9
+ "./*.ts",
10
+ "./*/index.ts"
11
+ ]
12
+ },
13
+ "files": [
14
+ "Common",
15
+ "Containers",
16
+ "Icons",
17
+ "styles",
18
+ "types.ts",
19
+ "stylelint"
20
+ ],
21
+ "dependencies": {
22
+ "@heroicons/react": "^2.2.0",
23
+ "@radix-ui/react-avatar": "^1.1.9",
24
+ "@radix-ui/react-dialog": "^1.1.7",
25
+ "@radix-ui/react-dropdown-menu": "~2.1.6",
26
+ "@radix-ui/react-label": "~2.1.2",
27
+ "@radix-ui/react-select": "~2.2.2",
28
+ "@radix-ui/react-separator": "~1.1.3",
29
+ "@radix-ui/react-tabs": "~1.1.3",
30
+ "@radix-ui/react-toast": "~1.2.6",
31
+ "@radix-ui/react-tooltip": "~1.2.4",
32
+ "@tailwindcss/postcss": "~4.1.5",
33
+ "@vcarl/remark-headings": "~0.1.0",
34
+ "classnames": "~2.5.1",
35
+ "postcss-calc": "^10.1.1",
36
+ "tailwindcss": "~4.0.17"
37
+ },
38
+ "devDependencies": {
39
+ "@storybook/addon-controls": "^8.6.12",
40
+ "@storybook/addon-interactions": "^8.6.12",
41
+ "@storybook/addon-styling-webpack": "^1.0.1",
42
+ "@storybook/addon-themes": "^8.6.12",
43
+ "@storybook/addon-viewport": "^8.6.12",
44
+ "@storybook/addon-webpack5-compiler-swc": "^3.0.0",
45
+ "@storybook/react": "^8.6.12",
46
+ "@storybook/react-webpack5": "^8.6.12",
47
+ "@testing-library/user-event": "~14.6.1",
48
+ "@types/node": "22.15.3",
49
+ "@types/react": "^19.1.0",
50
+ "cross-env": "^7.0.3",
51
+ "css-loader": "~7.1.2",
52
+ "eslint-plugin-react": "~7.37.4",
53
+ "eslint-plugin-storybook": "~0.12.0",
54
+ "global-jsdom": "^26.0.0",
55
+ "postcss-loader": "~8.1.1",
56
+ "react": "^19.1.0",
57
+ "storybook": "^8.6.11",
58
+ "style-loader": "~4.0.0",
59
+ "stylelint": "^16.19.1",
60
+ "stylelint-config-standard": "^38.0.0",
61
+ "stylelint-order": "7.0.0",
62
+ "stylelint-selector-bem-pattern": "4.0.1",
63
+ "tsx": "^4.19.3",
64
+ "typescript": "~5.8.2",
65
+ "typescript-eslint": "~8.31.1"
66
+ },
67
+ "imports": {
68
+ "#ui/*": [
69
+ "./*",
70
+ "./*.tsx",
71
+ "./*/index.tsx",
72
+ "./*.ts",
73
+ "./*/index.ts"
74
+ ]
75
+ },
76
+ "engines": {
77
+ "node": ">=20"
78
+ },
79
+ "version": "1.0.1-f948ce8a25da149fc61135f90a43e189c4909f5d",
80
+ "scripts": {
81
+ "check-types": "tsc --noEmit",
82
+ "lint": "turbo run lint:js lint:css",
83
+ "lint:css": "stylelint \"**/*.css\" --allow-empty-input --cache --cache-strategy=content --cache-location=.stylelintcache",
84
+ "lint:fix": "turbo run lint:js lint:css --no-cache -- --fix",
85
+ "lint:js": "eslint \"**/*.{js,mjs,ts,tsx}\"",
86
+ "storybook": "cross-env NODE_NO_WARNINGS=1 storybook dev -p 6006 --quiet",
87
+ "storybook:build": "cross-env NODE_NO_WARNINGS=1 storybook build --quiet --webpack-stats-json",
88
+ "test": "turbo test:unit",
89
+ "test:unit": "cross-env NODE_NO_WARNINGS=1 node --experimental-test-coverage --test-coverage-exclude=**/*.test.* --enable-source-maps --import=global-jsdom/register --import=tsx --import=../../tests/setup.mjs --test **/*.test.*",
90
+ "test:unit:watch": "cross-env NODE_OPTIONS=\"--watch\" pnpm test:unit"
7
91
  }
8
- }
92
+ }
@@ -0,0 +1,80 @@
1
+ import assert from 'node:assert/strict';
2
+ import { describe, it } from 'node:test';
3
+
4
+ import {
5
+ indentClassNames,
6
+ cleanClassNames,
7
+ applyIndentation,
8
+ } from '../utils.mjs';
9
+
10
+ describe('cleanClassNames', () => {
11
+ it('removes newlines and extra spaces', () => {
12
+ const input = ' text-xl \r font-bold \n\n text-center ';
13
+ const expected = 'text-xl font-bold text-center';
14
+
15
+ assert.equal(cleanClassNames(input), expected);
16
+ });
17
+
18
+ it('trims leading and trailing spaces', () => {
19
+ const input = ' mt-4 ';
20
+ const expected = 'mt-4';
21
+
22
+ assert.equal(cleanClassNames(input), expected);
23
+ });
24
+
25
+ it('returns empty string when input is empty', () => {
26
+ assert.equal(cleanClassNames(''), '');
27
+ });
28
+ });
29
+
30
+ describe('applyIndentation', () => {
31
+ it('adds indentation to each class name', () => {
32
+ const input = 'text-xl font-bold text-center';
33
+ const indent = ' ';
34
+ const expected = ['text-xl', ' font-bold', ' text-center'].join('\n');
35
+
36
+ assert.equal(applyIndentation(input, indent), expected);
37
+ });
38
+ });
39
+
40
+ describe('indentClassNames', () => {
41
+ it('returns null if rule is missing required properties', () => {
42
+ assert.equal(indentClassNames(null), null);
43
+ assert.equal(indentClassNames({}), null);
44
+ assert.equal(indentClassNames({ params: 'foo' }), null);
45
+ assert.equal(indentClassNames({ params: 'foo', raws: {} }), null);
46
+ });
47
+
48
+ it('cleans and indents class names correctly', () => {
49
+ const rule = {
50
+ params: ' text-xl \n font-bold \n text-center ',
51
+ raws: {
52
+ before: ' ',
53
+ },
54
+ };
55
+
56
+ const result = indentClassNames({ ...rule });
57
+ const expectedParams = ['text-xl', ' font-bold', ' text-center'].join(
58
+ '\n'
59
+ );
60
+
61
+ assert.deepEqual(result, {
62
+ ...rule,
63
+ params: expectedParams,
64
+ });
65
+ });
66
+
67
+ it('returns the same rule object with modified params', () => {
68
+ const rule = {
69
+ params: 'p-4 mb-2',
70
+ raws: { before: ' \n' },
71
+ };
72
+
73
+ const result = indentClassNames(rule);
74
+
75
+ assert.deepEqual(result, {
76
+ ...result,
77
+ params: 'p-4\n mb-2',
78
+ });
79
+ });
80
+ });
@@ -0,0 +1,64 @@
1
+ import stylelint from 'stylelint';
2
+
3
+ import { indentClassNames } from './utils.mjs';
4
+
5
+ const {
6
+ createPlugin,
7
+ utils: { report, ruleMessages },
8
+ } = stylelint;
9
+
10
+ const name = 'nodejs/one-utility-class-per-line';
11
+
12
+ const messages = ruleMessages(name, {
13
+ className: classNames =>
14
+ `Each line should contain only one Tailwind utility class; "${classNames}"`,
15
+ spacing: classNames =>
16
+ `Each utility class used with @apply should be indented by 2 spaces on a new line; ${classNames}`,
17
+ });
18
+
19
+ const meta = {
20
+ url: 'https://github.com/nodejs/nodejs.org/blob/main/COLLABORATOR_GUIDE.md#styling-a-component',
21
+ fixable: true,
22
+ };
23
+
24
+ /** @type {import('stylelint').Rule} */
25
+ const rule = () => (root, result) => {
26
+ root.walkAtRules('apply', rule => {
27
+ if (!rule.params.includes(' ')) {
28
+ // If there are no spaces in the params, we don't need to check anything
29
+ return;
30
+ }
31
+
32
+ // Since we use 2 spaces for indentation, each line in the apply rule
33
+ // should be indented with two extra whitespaces.
34
+ const classes = rule.params.split(`${rule.raws.before} `);
35
+ const classNames = classes.join('');
36
+
37
+ // Check if the params contain any spaces
38
+ if (classNames.includes(' ')) {
39
+ if (classNames.includes('\n')) {
40
+ return report({
41
+ ruleName: name,
42
+ result: result,
43
+ message: messages.spacing(JSON.stringify(rule.params)),
44
+ node: rule,
45
+ fix: indentClassNames(rule),
46
+ });
47
+ }
48
+
49
+ return report({
50
+ ruleName: name,
51
+ result,
52
+ message: messages.className(rule.params),
53
+ node: rule,
54
+ fix: indentClassNames(rule),
55
+ });
56
+ }
57
+ });
58
+ };
59
+
60
+ rule.ruleName = name;
61
+ rule.messages = messages;
62
+ rule.meta = meta;
63
+
64
+ export default createPlugin(name, rule);
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Adjusts the class names in the rule by cleaning and adding proper indentation.
3
+ *
4
+ * @param {Object} rule - The rule object containing the class names to be processed.
5
+ * @param {string} rule.params - The class names as a string to be formatted.
6
+ * @param {Object} rule.raws - The raw data of the rule.
7
+ * @param {string} rule.raws.before - The raw string before to the @apply rule.
8
+ * @returns {Object|null} The modified rule with properly formatted class names, or null if the rule is invalid.
9
+ */
10
+ export const indentClassNames = rule => {
11
+ // Ensure that the rule contains necessary properties
12
+ if (!rule || !rule.params || !rule.raws || !rule.raws.before) {
13
+ return null;
14
+ }
15
+
16
+ const indent = ' '.repeat(rule.raws.before.length + 1);
17
+
18
+ // Clean and split the class names
19
+ const cleanedClasses = cleanClassNames(rule.params);
20
+
21
+ // Apply the indentation and join the class names back together
22
+ rule.params = applyIndentation(cleanedClasses, indent);
23
+
24
+ return rule;
25
+ };
26
+
27
+ /**
28
+ * Cleans the input string by removing unnecessary whitespace and newlines.
29
+ *
30
+ * @param {string} params - The class names string to be cleaned.
31
+ * @returns {string} The cleaned class names string.
32
+ */
33
+ export const cleanClassNames = params => {
34
+ return params
35
+ .replace(/[\n\r]+/g, '') // Remove new lines
36
+ .replace(/\s+/g, ' ') // Replace multiple spaces with a single space
37
+ .trim(); // Trim leading/trailing spaces
38
+ };
39
+
40
+ /**
41
+ * Applies the correct indentation to each class name in the string.
42
+ *
43
+ * @param {string} classes - The cleaned class names as a string.
44
+ * @param {string} indent - The string used for indentation.
45
+ * @returns {string} The class names string with applied indentation.
46
+ */
47
+ export const applyIndentation = (classes, indent) => {
48
+ return classes
49
+ .split(' ') // Split into an array of class names
50
+ .map(className => indent + className) // Add indentation to each class
51
+ .join('\n') // Join with new lines
52
+ .trim(); // Remove extra space at the end
53
+ };
@@ -0,0 +1,47 @@
1
+ @theme {
2
+ --animate-surf: surf 1s infinite ease-in-out;
3
+ --animate-pulse: pulse 500ms infinite alternate-reverse;
4
+ --animate-pulse-dark: pulse-dark 500ms infinite alternate-reverse;
5
+
6
+ @keyframes surf {
7
+ 0% {
8
+ transform: translate(0, 0);
9
+ }
10
+
11
+ 25% {
12
+ transform: translate(0, 6px);
13
+ }
14
+
15
+ 50% {
16
+ transform: translate(0, -6px);
17
+ }
18
+
19
+ 75% {
20
+ transform: translate(0, 3px);
21
+ }
22
+
23
+ 100% {
24
+ transform: translate(0, 0);
25
+ }
26
+ }
27
+
28
+ @keyframes pulse {
29
+ from {
30
+ background: var(--color-pulse-100);
31
+ }
32
+
33
+ to {
34
+ background: var(--color-pulse-200);
35
+ }
36
+ }
37
+
38
+ @keyframes pulse-dark {
39
+ from {
40
+ background: var(--color-pulse-300);
41
+ }
42
+
43
+ to {
44
+ background: var(--color-pulse-400);
45
+ }
46
+ }
47
+ }