From 33dcf64967206921cd022f944f2bb8d3cdf098e8 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Mon, 21 Jul 2025 22:07:44 +0000 Subject: [PATCH 01/54] chore: add partner section on homepage --- .../Partners/PartnerIcon/index.module.css | 13 ++ .../Common/Partners/PartnerIcon/index.tsx | 26 ++++ .../PartnersIconList/index.module.css | 9 ++ .../Partners/PartnersIconList/index.tsx | 62 +++++++++ apps/site/components/Common/Partners/utils.ts | 48 +++++++ apps/site/navigation.json | 4 + apps/site/next.mdx.use.mjs | 3 + apps/site/next.partners.constants.tsx | 7 + apps/site/pages/en/index.mdx | 5 + apps/site/types/index.ts | 1 + apps/site/types/partners.ts | 20 +++ apps/site/util/partners/constants.json | 58 ++++++++ apps/site/util/partners/index.tsx | 27 ++++ apps/site/util/partners/original.json | 129 ++++++++++++++++++ packages/i18n/src/locales/en.json | 3 +- .../src/Icons/PartnerLogos/Cloudflare.tsx | 23 ++++ .../src/Icons/PartnerLogos/Crowdin.tsx | 49 +++++++ .../src/Icons/PartnerLogos/DataDog.tsx | 56 ++++++++ .../src/Icons/PartnerLogos/HeroDevs.tsx | 56 ++++++++ .../src/Icons/PartnerLogos/NodeSource.tsx | 13 ++ .../src/Icons/PartnerLogos/Rackspace.tsx | 19 +++ .../src/Icons/PartnerLogos/Sentry.tsx | 20 +++ .../src/Icons/PartnerLogos/Vercel.tsx | 18 +++ .../src/Icons/PartnerLogos/index.ts | 19 +++ 24 files changed, 687 insertions(+), 1 deletion(-) create mode 100644 apps/site/components/Common/Partners/PartnerIcon/index.module.css create mode 100644 apps/site/components/Common/Partners/PartnerIcon/index.tsx create mode 100644 apps/site/components/Common/Partners/PartnersIconList/index.module.css create mode 100644 apps/site/components/Common/Partners/PartnersIconList/index.tsx create mode 100644 apps/site/components/Common/Partners/utils.ts create mode 100644 apps/site/next.partners.constants.tsx create mode 100644 apps/site/types/partners.ts create mode 100644 apps/site/util/partners/constants.json create mode 100644 apps/site/util/partners/index.tsx create mode 100644 apps/site/util/partners/original.json create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Cloudflare.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Crowdin.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/DataDog.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/HeroDevs.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/NodeSource.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Rackspace.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Sentry.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Vercel.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/index.ts diff --git a/apps/site/components/Common/Partners/PartnerIcon/index.module.css b/apps/site/components/Common/Partners/PartnerIcon/index.module.css new file mode 100644 index 0000000000000..5ca11edb40806 --- /dev/null +++ b/apps/site/components/Common/Partners/PartnerIcon/index.module.css @@ -0,0 +1,13 @@ +@reference "../../../../styles/index.css"; + +.partnerIcon { + @apply h-9! + w-auto! + min-w-9! + !p-2; + + svg { + @apply !h-4 + !w-auto; + } +} diff --git a/apps/site/components/Common/Partners/PartnerIcon/index.tsx b/apps/site/components/Common/Partners/PartnerIcon/index.tsx new file mode 100644 index 0000000000000..c2c713816d73a --- /dev/null +++ b/apps/site/components/Common/Partners/PartnerIcon/index.tsx @@ -0,0 +1,26 @@ +import Skeleton from '@node-core/ui-components/Common/Skeleton'; +import type { ComponentProps, FC } from 'react'; +import { cloneElement } from 'react'; + +import type { Partners } from '#site/types'; + +import style from './index.module.css'; +import Button from '../../Button'; + +type ParnetsIconProps = Partners & ComponentProps; + +const PartnersIcon: FC = ({ href, logo, loading }) => { + return ( + + + + ); +}; + +export default PartnersIcon; diff --git a/apps/site/components/Common/Partners/PartnersIconList/index.module.css b/apps/site/components/Common/Partners/PartnersIconList/index.module.css new file mode 100644 index 0000000000000..ebba90ad3787b --- /dev/null +++ b/apps/site/components/Common/Partners/PartnersIconList/index.module.css @@ -0,0 +1,9 @@ +@reference "../../../../styles/index.css"; + +.partnersIconList { + @apply flex + flex-row + flex-wrap + items-center + gap-2; +} diff --git a/apps/site/components/Common/Partners/PartnersIconList/index.tsx b/apps/site/components/Common/Partners/PartnersIconList/index.tsx new file mode 100644 index 0000000000000..2425a3da0331f --- /dev/null +++ b/apps/site/components/Common/Partners/PartnersIconList/index.tsx @@ -0,0 +1,62 @@ +'use client'; + +import { useEffect, useRef, useState, type FC } from 'react'; + +import PARTNERS from '#site/next.partners.constants'; +import type { PartnerCategory, Partners } from '#site/types'; + +import PartnerIcon from '../PartnerIcon'; +import style from './index.module.css'; +import { randomPartnerList } from '../utils'; + +type PartnersIconListProps = { + maxLength?: number; + categories?: PartnerCategory; +}; + +const PartnersIconList: FC = ({ + maxLength = 6, + categories, +}) => { + const initialRenderer = useRef(true); + + const [seedList, setSeedList] = useState>( + PARTNERS.slice(0, maxLength) + ); + + useEffect(() => { + // We intentionally render the initial default "mock" list of sponsors + // to have the Skeletons loading, and then we render the actual list + // after an enough amount of time has passed to give a proper sense of Animation + // We do this client-side effect, to ensure that a random-amount of sponsors is renderered + // on every page load. Since our page is natively static, we need to ensure that + // on the client-side we have a random amount of sponsors rendered. + // Although whilst we are deployed on Vercel or other environment that supports ISR + // (Incremental Static Generation) whose would invalidate the cache every 5 minutes + // We want to ensure that this feature is compatible on a full-static environment + const renderSponsorsAnimation = setTimeout(() => { + initialRenderer.current = false; + + setSeedList(randomPartnerList(PARTNERS, maxLength, 1, categories)); + }, 0); + + return () => clearTimeout(renderSponsorsAnimation); + // We only want this to run once on initial render + // We don't really care if the props change as realistically they shouldn't ever + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( +
+ {seedList.map((partner, index) => ( + + ))} +
+ ); +}; + +export default PartnersIconList; diff --git a/apps/site/components/Common/Partners/utils.ts b/apps/site/components/Common/Partners/utils.ts new file mode 100644 index 0000000000000..79683e6492368 --- /dev/null +++ b/apps/site/components/Common/Partners/utils.ts @@ -0,0 +1,48 @@ +import type { PartnerCategory, Partners } from '#site/types/partners.js'; + +function randomPartnerList( + partners: Array, + pick = 4, + dateSeed = 5, + category?: PartnerCategory +) { + const now = new Date(); + const minutes = Math.floor(now.getUTCMinutes() / dateSeed) * dateSeed; + + const fixedTime = new Date( + Date.UTC( + now.getUTCFullYear(), + now.getUTCMonth(), + now.getUTCDate(), + now.getUTCHours(), + minutes, + 0, + 0 + ) + ); + + // We create a seed from the rounded date (timestamp in ms) + const seed = fixedTime.getTime(); + const rng = mulberry32(seed); + + // Create a copy of the array to avoid modifying the original + const shuffled = partners + .filter(partner => !category || partner.categories.includes(category)) + .slice() + .sort(() => rng() - 0.5); + + return shuffled.slice(0, pick); +} + +// This function returns a random list of partners based on a fixed time seed + +function mulberry32(seed: number) { + return function () { + let t = (seed += 0x6d2b79f5); + t = Math.imul(t ^ (t >>> 15), t | 1); + t ^= t + Math.imul(t ^ (t >>> 7), t | 61); + return ((t ^ (t >>> 14)) >>> 0) / 4294967296; + }; +} + +export { randomPartnerList }; diff --git a/apps/site/navigation.json b/apps/site/navigation.json index cfc6114362475..e2a26b00bcd1b 100644 --- a/apps/site/navigation.json +++ b/apps/site/navigation.json @@ -117,6 +117,10 @@ "branding": { "link": "/about/branding", "label": "components.navigation.about.links.branding" + }, + "partners": { + "link": "/about/partners", + "label": "components.navigation.about.links.partners" } } }, diff --git a/apps/site/next.mdx.use.mjs b/apps/site/next.mdx.use.mjs index b67817de4e9ff..b14ecada80e6b 100644 --- a/apps/site/next.mdx.use.mjs +++ b/apps/site/next.mdx.use.mjs @@ -3,6 +3,7 @@ import BadgeGroup from '@node-core/ui-components/Common/BadgeGroup'; import Button from './components/Common/Button'; +import PartnersIconList from './components/Common/Partners/PartnersIconList'; import DownloadReleasesTable from './components/Downloads/DownloadReleasesTable'; import Link from './components/Link'; import LinkWithArrow from './components/LinkWithArrow'; @@ -24,6 +25,8 @@ export const mdxComponents = { WithBanner, // HOC for providing Badge Data WithBadgeGroup, + // Shows a list of Node.js Partners + PartnersIconList, // Standalone Badge Group BadgeGroup, // Renders an container for Upcoming Node.js Meetings diff --git a/apps/site/next.partners.constants.tsx b/apps/site/next.partners.constants.tsx new file mode 100644 index 0000000000000..16a8911805b7a --- /dev/null +++ b/apps/site/next.partners.constants.tsx @@ -0,0 +1,7 @@ +import type { Partners } from '#site/types'; +import { partnersList } from '#site/util/partners'; +import partners from '#site/util/partners/constants.json' with { type: 'json' }; + +const PARTNERS = partnersList(partners as Array>); + +export default PARTNERS as Array; diff --git a/apps/site/pages/en/index.mdx b/apps/site/pages/en/index.mdx index 02f5c43bd78a2..9667d9c81959f 100644 --- a/apps/site/pages/en/index.mdx +++ b/apps/site/pages/en/index.mdx @@ -26,6 +26,11 @@ layout: home
for Node.js 18 and below + +
+ +
+ Node.js is proudly supported by the partners above and more. diff --git a/apps/site/types/index.ts b/apps/site/types/index.ts index 38f5767b732db..4ca7f7a004c69 100644 --- a/apps/site/types/index.ts +++ b/apps/site/types/index.ts @@ -10,6 +10,7 @@ export * from './redirects'; export * from './server'; export * from './github'; export * from './calendar'; +export * from './partners'; export * from './author'; export * from './download'; export * from './userAgent'; diff --git a/apps/site/types/partners.ts b/apps/site/types/partners.ts new file mode 100644 index 0000000000000..fe2793bbebdb1 --- /dev/null +++ b/apps/site/types/partners.ts @@ -0,0 +1,20 @@ +// import type { ReactElement, SVGProps } from 'react'; + +import type { ReactElement, SVGProps } from 'react'; + +export interface Partners { + id: string; + // The name of the partner + name: string; + // A logo to render on the partners page + logo: ReactElement>; + // The promoted link to their website or social media + href: string; + // The categories this partner belongs to + categories: Array; + // An optional description of the partner + description?: string; + threshold: number; +} + +export type PartnerCategory = 'infrastructure' | 'security' | 'esp partner'; diff --git a/apps/site/util/partners/constants.json b/apps/site/util/partners/constants.json new file mode 100644 index 0000000000000..937099f5fcb80 --- /dev/null +++ b/apps/site/util/partners/constants.json @@ -0,0 +1,58 @@ +[ + { + "id": "RACKSPACE", + "name": "Rackspace", + "href": "https://www.rackspace.com", + "threshold": 2, + "categories": ["infrastructure"] + }, + { + "id": "CLOUDFLARE", + "name": "Cloudflare", + "href": "https://www.cloudflare.com", + "threshold": 3, + "categories": ["infrastructure"] + }, + { + "id": "VERCEL", + "name": "Vercel", + "href": "https://vercel.com", + "threshold": 1, + "categories": ["infrastructure"] + }, + { + "id": "SENTRY", + "name": "Sentry", + "href": "https://sentry.io", + "threshold": 3, + "categories": ["infrastructure"] + }, + { + "id": "CROWDIN", + "name": "Crowdin", + "href": "https://crowdin.com", + "threshold": 2, + "categories": ["infrastructure"] + }, + { + "id": "HERODEVS", + "name": "HeroDevs", + "href": "https://herodevs.com", + "threshold": 1, + "categories": ["security", "esp partner"] + }, + { + "id": "NODESOURCE", + "name": "NodeSource", + "href": "https://nodesource.com", + "threshold": 2, + "categories": ["security"] + }, + { + "id": "DATADOG", + "name": "Datadog", + "href": "https://www.datadoghq.com", + "threshold": 3, + "categories": ["security"] + } +] diff --git a/apps/site/util/partners/index.tsx b/apps/site/util/partners/index.tsx new file mode 100644 index 0000000000000..926f2cc6a06e6 --- /dev/null +++ b/apps/site/util/partners/index.tsx @@ -0,0 +1,27 @@ +import * as PartnersLogo from '@node-core/ui-components/Icons/PartnerLogos'; +import type { ElementType } from 'react'; + +import type { Partners } from '#site/types'; + +// import partners from './constants.json'; + +/** + * Creates an icon element for a component + */ +const createIcon = ( + IconModule: Record, + iconName: string +) => { + const IconComponent = IconModule[iconName]; + return ; +}; + +// Package Manager dropdown items +export const partnersList = (partnerLists: Array>) => + partnerLists.map(({ id, ...partner }) => { + return { + id: id, + logo: createIcon(PartnersLogo, id), + ...partner, + }; + }); diff --git a/apps/site/util/partners/original.json b/apps/site/util/partners/original.json new file mode 100644 index 0000000000000..aeb840a500914 --- /dev/null +++ b/apps/site/util/partners/original.json @@ -0,0 +1,129 @@ +[ + { + "id": "DIGITALOCEAN", + "name": "DigitalOcean", + "href": "https://www.digitalocean.com", + "categories": ["infrastructure"] + }, + { + "id": "RACKSPACE", + "name": "Rackspace", + "href": "https://www.rackspace.com", + "categories": ["infrastructure"] + }, + { + "id": "MICROSOFT", + "name": "Microsoft", + "href": "https://microsoft.com", + "categories": ["infrastructure"] + }, + { + "id": "MNX", + "name": "MNX", + "href": "ToDo", + "logo": "ToDo", + "categories": ["infrastructure"] + }, + { + "id": "IBM", + "name": "IBM", + "href": "https://www.ibm.com", + "categories": ["infrastructure"] + }, + { + "id": "SCALEWAY", + "name": "Scaleway", + "href": "https://www.scaleway.com", + "categories": ["infrastructure"] + }, + { + "id": "CLOUDFLARE", + "name": "Cloudflare", + "href": "https://www.cloudflare.com", + "categories": ["infrastructure"] + }, + { + "id": "ARM", + "name": "ARM", + "href": "https://www.arm.com", + "categories": ["infrastructure"] + }, + { + "id": "INTEL", + "name": "Intel", + "href": "https://www.intel.com", + "categories": ["infrastructure"] + }, + { + "id": "MACSTADIUM", + "name": "MacStadium", + "href": "https://www.macstadium.com", + "categories": ["infrastructure"] + }, + { + "id": "EQUINIXMETAL", + "name": "Equinix Metal", + "href": "https://www.equinix.com", + "categories": ["infrastructure"] + }, + { + "id": "CHROMATIC", + "name": "Chromatic", + "href": "https://www.chromatic.com", + "categories": ["infrastructure"] + }, + { + "id": "VERCEL", + "name": "Vercel", + "href": "https://vercel.com", + "categories": ["infrastructure"] + }, + { + "id": "SENTRY", + "name": "Sentry", + "href": "https://sentry.io", + "categories": ["infrastructure"] + }, + { + "id": "CROWDIN", + "name": "Crowdin", + "href": "https://crowdin.com", + "categories": ["infrastructure"] + }, + { + "id": "ORAMA", + "name": "Orama", + "href": "https://orama.com", + "categories": ["infrastructure"] + }, + { + "id": "HERODEVS", + "name": "HeroDevs", + "href": "https://herodevs.com", + "categories": ["security", "esp partner"] + }, + { + "id": "NODESOURCE", + "name": "NodeSource", + "href": "https://nodesource.com", + "categories": ["security"] + }, + { + "id": "PLATFORMATIC", + "name": "Platformatic", + "href": "https://platformatic.dev", + "categories": ["security"] + }, + { + "id": "REDHAT", + "name": "Red Hat", + "href": "https://www.redhat.com", + "categories": ["security"] + }, + { + "id": "DATADOG", + "name": "Datadog", + "href": "https://www.datadoghq.com", + "categories": ["security"] + } +] diff --git a/packages/i18n/src/locales/en.json b/packages/i18n/src/locales/en.json index cadcca42859f3..3f2084bb8508b 100644 --- a/packages/i18n/src/locales/en.json +++ b/packages/i18n/src/locales/en.json @@ -144,7 +144,8 @@ "branding": "Branding of Node.js", "governance": "Project Governance", "releases": "Node.js Releases", - "security": "Security Reporting" + "security": "Security Reporting", + "partners": "Partners" } }, "getInvolved": { diff --git a/packages/ui-components/src/Icons/PartnerLogos/Cloudflare.tsx b/packages/ui-components/src/Icons/PartnerLogos/Cloudflare.tsx new file mode 100644 index 0000000000000..59e5deca5bc35 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Cloudflare.tsx @@ -0,0 +1,23 @@ +// https://www.cloudflare.com/logo/ +import type { FC, SVGProps } from 'react'; + +const Cloudflare: FC> = props => ( + + + + +); + +export default Cloudflare; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Crowdin.tsx b/packages/ui-components/src/Icons/PartnerLogos/Crowdin.tsx new file mode 100644 index 0000000000000..c9eb2810e15a3 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Crowdin.tsx @@ -0,0 +1,49 @@ +import type { FC, SVGProps } from 'react'; + +const Crowdin: FC> = props => ( + + + + + + + + + + + + + + + +); + +export default Crowdin; diff --git a/packages/ui-components/src/Icons/PartnerLogos/DataDog.tsx b/packages/ui-components/src/Icons/PartnerLogos/DataDog.tsx new file mode 100644 index 0000000000000..5b80b2295dfff --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/DataDog.tsx @@ -0,0 +1,56 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const DataDog: FC> = props => ( + + + +); + +export default DataDog; diff --git a/packages/ui-components/src/Icons/PartnerLogos/HeroDevs.tsx b/packages/ui-components/src/Icons/PartnerLogos/HeroDevs.tsx new file mode 100644 index 0000000000000..88d9cbcde3c88 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/HeroDevs.tsx @@ -0,0 +1,56 @@ +import type { FC, SVGProps } from 'react'; + +const HeroDevs: FC> = props => ( + + + + + + + + + + + + + + + + + + + +); + +export default HeroDevs; diff --git a/packages/ui-components/src/Icons/PartnerLogos/NodeSource.tsx b/packages/ui-components/src/Icons/PartnerLogos/NodeSource.tsx new file mode 100644 index 0000000000000..eb1f12dacc349 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/NodeSource.tsx @@ -0,0 +1,13 @@ +import type { FC, SVGProps } from 'react'; + +const NodeSource: FC> = props => ( + + mark-light-1 + + +); + +export default NodeSource; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Rackspace.tsx b/packages/ui-components/src/Icons/PartnerLogos/Rackspace.tsx new file mode 100644 index 0000000000000..516b2e56f5012 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Rackspace.tsx @@ -0,0 +1,19 @@ +// https://www.rackspace.com/newsroom/media-kit +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const Rackspace: FC> = props => ( + + + +); + +export default Rackspace; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Sentry.tsx b/packages/ui-components/src/Icons/PartnerLogos/Sentry.tsx new file mode 100644 index 0000000000000..26b826e128f39 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Sentry.tsx @@ -0,0 +1,20 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const Sentry: FC> = props => ( + + + +); + +export default Sentry; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Vercel.tsx b/packages/ui-components/src/Icons/PartnerLogos/Vercel.tsx new file mode 100644 index 0000000000000..1685490bcd3fa --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Vercel.tsx @@ -0,0 +1,18 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const Vercel: FC> = props => ( + + + +); + +export default Vercel; diff --git a/packages/ui-components/src/Icons/PartnerLogos/index.ts b/packages/ui-components/src/Icons/PartnerLogos/index.ts new file mode 100644 index 0000000000000..5ea78e7296f5a --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/index.ts @@ -0,0 +1,19 @@ +import CLOUDFLARE from './Cloudflare'; +import CROWDIN from './Crowdin'; +import DATADOG from './DataDog'; +import HERODEVS from './HeroDevs'; +import NODESOURCE from './NodeSource'; +import RACKSPACE from './Rackspace'; +import SENTRY from './Sentry'; +import VERCEL from './Vercel'; + +export { + CLOUDFLARE, + CROWDIN, + DATADOG, + HERODEVS, + NODESOURCE, + RACKSPACE, + SENTRY, + VERCEL, +}; From 50947984bfff37bf3bca768b7c889ea7001ebcf0 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Mon, 21 Jul 2025 22:08:31 +0000 Subject: [PATCH 02/54] chore: template for partner page --- apps/site/pages/en/about/partners.mdx | 28 +++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 apps/site/pages/en/about/partners.mdx diff --git a/apps/site/pages/en/about/partners.mdx b/apps/site/pages/en/about/partners.mdx new file mode 100644 index 0000000000000..4c0eafb460148 --- /dev/null +++ b/apps/site/pages/en/about/partners.mdx @@ -0,0 +1,28 @@ +--- +title: Partners +layout: about +--- + +# Partners + +Importance of partners and their role and explains our partner categories (Ecosystem Sustainability Program, Infrastructure, Security, etc) + +## Infrastructure + +Projects with their logo, name, tier, the description and a CTA button + +## Security + +Projects with their logo, name, tier, the description and a CTA button + +## Ecosystem Sustainability Program (ESP) + +Projects with their logo, name, tier, the description and a CTA button + +## Backers (Open Collective and GitHub Sponsors) + +Show a list of lists direct individual or organizational support that can be done through OpenCollective and GitHub Sponsors + +## Become a Partner + +this section isn't in the specification From 6a5568ccc45649e8f7570ca864adf2ba00569183 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Mon, 21 Jul 2025 23:13:28 +0000 Subject: [PATCH 03/54] ui: add name tooltip for partnerIcon --- .../Common/Partners/PartnerIcon/index.tsx | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/apps/site/components/Common/Partners/PartnerIcon/index.tsx b/apps/site/components/Common/Partners/PartnerIcon/index.tsx index c2c713816d73a..65424a3673680 100644 --- a/apps/site/components/Common/Partners/PartnerIcon/index.tsx +++ b/apps/site/components/Common/Partners/PartnerIcon/index.tsx @@ -1,4 +1,5 @@ import Skeleton from '@node-core/ui-components/Common/Skeleton'; +import Tooltip from '@node-core/ui-components/Common/Tooltip'; import type { ComponentProps, FC } from 'react'; import { cloneElement } from 'react'; @@ -9,16 +10,18 @@ import Button from '../../Button'; type ParnetsIconProps = Partners & ComponentProps; -const PartnersIcon: FC = ({ href, logo, loading }) => { +const PartnersIcon: FC = ({ name, href, logo, loading }) => { return ( - + + + ); }; From e646e298757d77346cab1e5011c9e30334155006 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Tue, 22 Jul 2025 01:56:00 +0000 Subject: [PATCH 04/54] chore: implement list of logos on download and partners page --- .../Partners/PartnerLogo/index.module.css | 19 ++++ .../Common/Partners/PartnerLogo/index.tsx | 26 ++++++ .../Partners/PartnersIconList/index.tsx | 6 +- .../PartnersLogoList/index.module.css | 7 ++ .../Partners/PartnersLogoList/index.tsx | 62 +++++++++++++ apps/site/components/Common/Partners/utils.ts | 2 + apps/site/next.mdx.use.mjs | 5 +- apps/site/next.partners.constants.tsx | 8 +- apps/site/pages/en/about/partners.mdx | 6 ++ apps/site/pages/en/download/current.mdx | 12 +++ apps/site/pages/en/download/index.mdx | 12 +++ apps/site/types/partners.ts | 2 +- apps/site/util/partners/constants.json | 2 +- apps/site/util/partners/index.tsx | 14 +-- .../Favicon.tsx} | 0 .../Icons/PartnerLogos/Cloudflare/Logo.tsx | 63 ++++++++++++++ .../Icons/PartnerLogos/Cloudflare/index.tsx | 4 + .../{Crowdin.tsx => Crowdin/Favicon.tsx} | 0 .../src/Icons/PartnerLogos/Crowdin/Logo.tsx | 86 +++++++++++++++++++ .../src/Icons/PartnerLogos/Crowdin/index.tsx | 4 + .../{DataDog.tsx => DataDog/Favicon.tsx} | 0 .../src/Icons/PartnerLogos/DataDog/Logo.tsx | 76 ++++++++++++++++ .../src/Icons/PartnerLogos/DataDog/index.ts | 4 + .../{HeroDevs.tsx => HeroDevs/Favicon.tsx} | 0 .../src/Icons/PartnerLogos/HeroDevs/Logo.tsx | 85 ++++++++++++++++++ .../src/Icons/PartnerLogos/HeroDevs/index.ts | 4 + .../Favicon.tsx} | 1 - .../Icons/PartnerLogos/NodeSource/Logo.tsx | 22 +++++ .../Icons/PartnerLogos/NodeSource/index.ts | 4 + .../{Rackspace.tsx => Rackspace/Favicon.tsx} | 0 .../src/Icons/PartnerLogos/Rackspace/Logo.tsx | 19 ++++ .../src/Icons/PartnerLogos/Rackspace/index.ts | 4 + .../{Sentry.tsx => Sentry/Favicon.tsx} | 0 .../src/Icons/PartnerLogos/Sentry/Logo.tsx | 19 ++++ .../src/Icons/PartnerLogos/Sentry/index.ts | 4 + .../{Vercel.tsx => Vercel/Favicon.tsx} | 0 .../src/Icons/PartnerLogos/Vercel/Logo.tsx | 23 +++++ .../src/Icons/PartnerLogos/Vercel/index.ts | 4 + .../src/Icons/PartnerLogos/index.ts | 16 ++-- 39 files changed, 603 insertions(+), 22 deletions(-) create mode 100644 apps/site/components/Common/Partners/PartnerLogo/index.module.css create mode 100644 apps/site/components/Common/Partners/PartnerLogo/index.tsx create mode 100644 apps/site/components/Common/Partners/PartnersLogoList/index.module.css create mode 100644 apps/site/components/Common/Partners/PartnersLogoList/index.tsx rename packages/ui-components/src/Icons/PartnerLogos/{Cloudflare.tsx => Cloudflare/Favicon.tsx} (100%) create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Cloudflare/Logo.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Cloudflare/index.tsx rename packages/ui-components/src/Icons/PartnerLogos/{Crowdin.tsx => Crowdin/Favicon.tsx} (100%) create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Crowdin/Logo.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Crowdin/index.tsx rename packages/ui-components/src/Icons/PartnerLogos/{DataDog.tsx => DataDog/Favicon.tsx} (100%) create mode 100644 packages/ui-components/src/Icons/PartnerLogos/DataDog/Logo.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/DataDog/index.ts rename packages/ui-components/src/Icons/PartnerLogos/{HeroDevs.tsx => HeroDevs/Favicon.tsx} (100%) create mode 100644 packages/ui-components/src/Icons/PartnerLogos/HeroDevs/Logo.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/HeroDevs/index.ts rename packages/ui-components/src/Icons/PartnerLogos/{NodeSource.tsx => NodeSource/Favicon.tsx} (97%) create mode 100644 packages/ui-components/src/Icons/PartnerLogos/NodeSource/Logo.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/NodeSource/index.ts rename packages/ui-components/src/Icons/PartnerLogos/{Rackspace.tsx => Rackspace/Favicon.tsx} (100%) create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Rackspace/Logo.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Rackspace/index.ts rename packages/ui-components/src/Icons/PartnerLogos/{Sentry.tsx => Sentry/Favicon.tsx} (100%) create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Sentry/Logo.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Sentry/index.ts rename packages/ui-components/src/Icons/PartnerLogos/{Vercel.tsx => Vercel/Favicon.tsx} (100%) create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Vercel/Logo.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Vercel/index.ts diff --git a/apps/site/components/Common/Partners/PartnerLogo/index.module.css b/apps/site/components/Common/Partners/PartnerLogo/index.module.css new file mode 100644 index 0000000000000..a03bf704d716f --- /dev/null +++ b/apps/site/components/Common/Partners/PartnerLogo/index.module.css @@ -0,0 +1,19 @@ +@reference "../../../../styles/index.css"; + +.partnerIcon { + @apply flex + h-[114px] + max-h-[130px] + w-auto + min-w-12 + items-center + justify-center + rounded-lg + p-6 + sm:p-10; + + svg { + @apply !h-12 + !w-auto; + } +} diff --git a/apps/site/components/Common/Partners/PartnerLogo/index.tsx b/apps/site/components/Common/Partners/PartnerLogo/index.tsx new file mode 100644 index 0000000000000..23ed2b22cca17 --- /dev/null +++ b/apps/site/components/Common/Partners/PartnerLogo/index.tsx @@ -0,0 +1,26 @@ +import Skeleton from '@node-core/ui-components/Common/Skeleton'; +import type { ComponentProps, FC } from 'react'; +import { cloneElement } from 'react'; + +import type { Partners } from '#site/types'; + +import style from './index.module.css'; +import Button from '../../Button'; + +type ParnetsIconProps = Partners & ComponentProps; + +const PartnersIcon: FC = ({ href, logo, loading }) => { + return ( + + + + ); +}; + +export default PartnersIcon; diff --git a/apps/site/components/Common/Partners/PartnersIconList/index.tsx b/apps/site/components/Common/Partners/PartnersIconList/index.tsx index 2425a3da0331f..3667090d56467 100644 --- a/apps/site/components/Common/Partners/PartnersIconList/index.tsx +++ b/apps/site/components/Common/Partners/PartnersIconList/index.tsx @@ -2,7 +2,7 @@ import { useEffect, useRef, useState, type FC } from 'react'; -import PARTNERS from '#site/next.partners.constants'; +import { ICON_PARTNERS } from '#site/next.partners.constants'; import type { PartnerCategory, Partners } from '#site/types'; import PartnerIcon from '../PartnerIcon'; @@ -21,7 +21,7 @@ const PartnersIconList: FC = ({ const initialRenderer = useRef(true); const [seedList, setSeedList] = useState>( - PARTNERS.slice(0, maxLength) + ICON_PARTNERS.slice(0, maxLength) ); useEffect(() => { @@ -37,7 +37,7 @@ const PartnersIconList: FC = ({ const renderSponsorsAnimation = setTimeout(() => { initialRenderer.current = false; - setSeedList(randomPartnerList(PARTNERS, maxLength, 1, categories)); + setSeedList(randomPartnerList(ICON_PARTNERS, maxLength, 1, categories)); }, 0); return () => clearTimeout(renderSponsorsAnimation); diff --git a/apps/site/components/Common/Partners/PartnersLogoList/index.module.css b/apps/site/components/Common/Partners/PartnersLogoList/index.module.css new file mode 100644 index 0000000000000..5123cd5271793 --- /dev/null +++ b/apps/site/components/Common/Partners/PartnersLogoList/index.module.css @@ -0,0 +1,7 @@ +@reference "../../../../styles/index.css"; + +.partnersLogoList { + display: grid; + gap: 16px; + grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); +} diff --git a/apps/site/components/Common/Partners/PartnersLogoList/index.tsx b/apps/site/components/Common/Partners/PartnersLogoList/index.tsx new file mode 100644 index 0000000000000..800ebd1a30e2e --- /dev/null +++ b/apps/site/components/Common/Partners/PartnersLogoList/index.tsx @@ -0,0 +1,62 @@ +'use client'; + +import { useEffect, useRef, useState, type FC } from 'react'; + +import { LOGO_PARTNERS } from '#site/next.partners.constants'; +import type { PartnerCategory, Partners } from '#site/types'; + +import PartnerLogo from '../PartnerLogo'; +import style from './index.module.css'; +import { randomPartnerList } from '../utils'; + +type PartnersLogoListProps = { + maxLength?: number; + categories?: PartnerCategory; +}; + +const PartnersLogoList: FC = ({ + maxLength = 3, + categories, +}) => { + const initialRenderer = useRef(true); + + const [seedList, setSeedList] = useState>( + LOGO_PARTNERS.slice(0, maxLength) + ); + + useEffect(() => { + // We intentionally render the initial default "mock" list of sponsors + // to have the Skeletons loading, and then we render the actual list + // after an enough amount of time has passed to give a proper sense of Animation + // We do this client-side effect, to ensure that a random-amount of sponsors is renderered + // on every page load. Since our page is natively static, we need to ensure that + // on the client-side we have a random amount of sponsors rendered. + // Although whilst we are deployed on Vercel or other environment that supports ISR + // (Incremental Static Generation) whose would invalidate the cache every 5 minutes + // We want to ensure that this feature is compatible on a full-static environment + const renderSponsorsAnimation = setTimeout(() => { + initialRenderer.current = false; + + setSeedList(randomPartnerList(LOGO_PARTNERS, maxLength, 1, categories)); + }, 0); + + return () => clearTimeout(renderSponsorsAnimation); + // We only want this to run once on initial render + // We don't really care if the props change as realistically they shouldn't ever + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( +
+ {seedList.map((partner, index) => ( + + ))} +
+ ); +}; + +export default PartnersLogoList; diff --git a/apps/site/components/Common/Partners/utils.ts b/apps/site/components/Common/Partners/utils.ts index 79683e6492368..fcc5e51b95a2e 100644 --- a/apps/site/components/Common/Partners/utils.ts +++ b/apps/site/components/Common/Partners/utils.ts @@ -1,5 +1,7 @@ import type { PartnerCategory, Partners } from '#site/types/partners.js'; +// TODO: Implement no random list +// TODO: Implement no limit items function randomPartnerList( partners: Array, pick = 4, diff --git a/apps/site/next.mdx.use.mjs b/apps/site/next.mdx.use.mjs index b14ecada80e6b..dc35c75544cff 100644 --- a/apps/site/next.mdx.use.mjs +++ b/apps/site/next.mdx.use.mjs @@ -4,6 +4,7 @@ import BadgeGroup from '@node-core/ui-components/Common/BadgeGroup'; import Button from './components/Common/Button'; import PartnersIconList from './components/Common/Partners/PartnersIconList'; +import PartnersLogoList from './components/Common/Partners/PartnersLogoList'; import DownloadReleasesTable from './components/Downloads/DownloadReleasesTable'; import Link from './components/Link'; import LinkWithArrow from './components/LinkWithArrow'; @@ -25,8 +26,10 @@ export const mdxComponents = { WithBanner, // HOC for providing Badge Data WithBadgeGroup, - // Shows a list of Node.js Partners + // Shows a list of Node.js Partners with Icons PartnersIconList, + // Shows a list of Node.js Partners with Logos + PartnersLogoList, // Standalone Badge Group BadgeGroup, // Renders an container for Upcoming Node.js Meetings diff --git a/apps/site/next.partners.constants.tsx b/apps/site/next.partners.constants.tsx index 16a8911805b7a..f63cdccaf5d09 100644 --- a/apps/site/next.partners.constants.tsx +++ b/apps/site/next.partners.constants.tsx @@ -2,6 +2,10 @@ import type { Partners } from '#site/types'; import { partnersList } from '#site/util/partners'; import partners from '#site/util/partners/constants.json' with { type: 'json' }; -const PARTNERS = partnersList(partners as Array>); +const PARTNERS = (type?: 'Logo' | 'Favicon') => + partnersList(partners as Array>, type); -export default PARTNERS as Array; +const ICON_PARTNERS = PARTNERS('Favicon'); +const LOGO_PARTNERS = PARTNERS('Logo'); + +export { ICON_PARTNERS, LOGO_PARTNERS }; diff --git a/apps/site/pages/en/about/partners.mdx b/apps/site/pages/en/about/partners.mdx index 4c0eafb460148..4f1ca98003183 100644 --- a/apps/site/pages/en/about/partners.mdx +++ b/apps/site/pages/en/about/partners.mdx @@ -11,14 +11,20 @@ Importance of partners and their role and explains our partner categories (Ecosy Projects with their logo, name, tier, the description and a CTA button + + ## Security Projects with their logo, name, tier, the description and a CTA button + + ## Ecosystem Sustainability Program (ESP) Projects with their logo, name, tier, the description and a CTA button + + ## Backers (Open Collective and GitHub Sponsors) Show a list of lists direct individual or organizational support that can be done through OpenCollective and GitHub Sponsors diff --git a/apps/site/pages/en/download/current.mdx b/apps/site/pages/en/download/current.mdx index 16e78d6a8e1d7..0ee4a3ac9a671 100644 --- a/apps/site/pages/en/download/current.mdx +++ b/apps/site/pages/en/download/current.mdx @@ -34,3 +34,15 @@ all previous releases or the unofficial binaries for other platforms. + +
+

Thanks by Our Partners

+ + + We are able to serve Node.js downloads and maintain our infrastructure thanks + to our amazing partners. + +
+ +
+
diff --git a/apps/site/pages/en/download/index.mdx b/apps/site/pages/en/download/index.mdx index 16e78d6a8e1d7..0ee4a3ac9a671 100644 --- a/apps/site/pages/en/download/index.mdx +++ b/apps/site/pages/en/download/index.mdx @@ -34,3 +34,15 @@ all previous releases or the unofficial binaries for other platforms. + +
+

Thanks by Our Partners

+ + + We are able to serve Node.js downloads and maintain our infrastructure thanks + to our amazing partners. + +
+ +
+
diff --git a/apps/site/types/partners.ts b/apps/site/types/partners.ts index fe2793bbebdb1..e5bc840401a60 100644 --- a/apps/site/types/partners.ts +++ b/apps/site/types/partners.ts @@ -17,4 +17,4 @@ export interface Partners { threshold: number; } -export type PartnerCategory = 'infrastructure' | 'security' | 'esp partner'; +export type PartnerCategory = 'infrastructure' | 'security' | 'esp'; diff --git a/apps/site/util/partners/constants.json b/apps/site/util/partners/constants.json index 937099f5fcb80..faa6f34ac2e74 100644 --- a/apps/site/util/partners/constants.json +++ b/apps/site/util/partners/constants.json @@ -39,7 +39,7 @@ "name": "HeroDevs", "href": "https://herodevs.com", "threshold": 1, - "categories": ["security", "esp partner"] + "categories": ["security", "esp"] }, { "id": "NODESOURCE", diff --git a/apps/site/util/partners/index.tsx b/apps/site/util/partners/index.tsx index 926f2cc6a06e6..25cb3521d94ef 100644 --- a/apps/site/util/partners/index.tsx +++ b/apps/site/util/partners/index.tsx @@ -9,19 +9,23 @@ import type { Partners } from '#site/types'; * Creates an icon element for a component */ const createIcon = ( - IconModule: Record, - iconName: string + IconModule: Record>, + iconName: string, + type?: 'Logo' | 'Favicon' ) => { - const IconComponent = IconModule[iconName]; + const IconComponent = IconModule[iconName][type || 'Favicon']; return ; }; // Package Manager dropdown items -export const partnersList = (partnerLists: Array>) => +export const partnersList = ( + partnerLists: Array>, + type?: 'Logo' | 'Favicon' +) => partnerLists.map(({ id, ...partner }) => { return { id: id, - logo: createIcon(PartnersLogo, id), + logo: createIcon(PartnersLogo, id, type), ...partner, }; }); diff --git a/packages/ui-components/src/Icons/PartnerLogos/Cloudflare.tsx b/packages/ui-components/src/Icons/PartnerLogos/Cloudflare/Favicon.tsx similarity index 100% rename from packages/ui-components/src/Icons/PartnerLogos/Cloudflare.tsx rename to packages/ui-components/src/Icons/PartnerLogos/Cloudflare/Favicon.tsx diff --git a/packages/ui-components/src/Icons/PartnerLogos/Cloudflare/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/Cloudflare/Logo.tsx new file mode 100644 index 0000000000000..0ee2f3ab21525 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Cloudflare/Logo.tsx @@ -0,0 +1,63 @@ +// https://www.cloudflare.com/logo/ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const Cloudflare: FC> = props => ( + + + + + + + + + + + + + + +); + +export default Cloudflare; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Cloudflare/index.tsx b/packages/ui-components/src/Icons/PartnerLogos/Cloudflare/index.tsx new file mode 100644 index 0000000000000..b4cd37328b21d --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Cloudflare/index.tsx @@ -0,0 +1,4 @@ +import Favicon from './Favicon'; +import Logo from './Logo'; + +export { Favicon, Logo }; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Crowdin.tsx b/packages/ui-components/src/Icons/PartnerLogos/Crowdin/Favicon.tsx similarity index 100% rename from packages/ui-components/src/Icons/PartnerLogos/Crowdin.tsx rename to packages/ui-components/src/Icons/PartnerLogos/Crowdin/Favicon.tsx diff --git a/packages/ui-components/src/Icons/PartnerLogos/Crowdin/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/Crowdin/Logo.tsx new file mode 100644 index 0000000000000..cd23dc2a0883c --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Crowdin/Logo.tsx @@ -0,0 +1,86 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const Crowdin: FC> = props => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export default Crowdin; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Crowdin/index.tsx b/packages/ui-components/src/Icons/PartnerLogos/Crowdin/index.tsx new file mode 100644 index 0000000000000..b4cd37328b21d --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Crowdin/index.tsx @@ -0,0 +1,4 @@ +import Favicon from './Favicon'; +import Logo from './Logo'; + +export { Favicon, Logo }; diff --git a/packages/ui-components/src/Icons/PartnerLogos/DataDog.tsx b/packages/ui-components/src/Icons/PartnerLogos/DataDog/Favicon.tsx similarity index 100% rename from packages/ui-components/src/Icons/PartnerLogos/DataDog.tsx rename to packages/ui-components/src/Icons/PartnerLogos/DataDog/Favicon.tsx diff --git a/packages/ui-components/src/Icons/PartnerLogos/DataDog/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/DataDog/Logo.tsx new file mode 100644 index 0000000000000..23cd9025d84c9 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/DataDog/Logo.tsx @@ -0,0 +1,76 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const DataDog: FC> = props => ( + + + + + + + + + + +); + +export default DataDog; diff --git a/packages/ui-components/src/Icons/PartnerLogos/DataDog/index.ts b/packages/ui-components/src/Icons/PartnerLogos/DataDog/index.ts new file mode 100644 index 0000000000000..b4cd37328b21d --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/DataDog/index.ts @@ -0,0 +1,4 @@ +import Favicon from './Favicon'; +import Logo from './Logo'; + +export { Favicon, Logo }; diff --git a/packages/ui-components/src/Icons/PartnerLogos/HeroDevs.tsx b/packages/ui-components/src/Icons/PartnerLogos/HeroDevs/Favicon.tsx similarity index 100% rename from packages/ui-components/src/Icons/PartnerLogos/HeroDevs.tsx rename to packages/ui-components/src/Icons/PartnerLogos/HeroDevs/Favicon.tsx diff --git a/packages/ui-components/src/Icons/PartnerLogos/HeroDevs/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/HeroDevs/Logo.tsx new file mode 100644 index 0000000000000..23de36b18ecb4 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/HeroDevs/Logo.tsx @@ -0,0 +1,85 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const HeroDevs: FC> = props => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export default HeroDevs; diff --git a/packages/ui-components/src/Icons/PartnerLogos/HeroDevs/index.ts b/packages/ui-components/src/Icons/PartnerLogos/HeroDevs/index.ts new file mode 100644 index 0000000000000..b4cd37328b21d --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/HeroDevs/index.ts @@ -0,0 +1,4 @@ +import Favicon from './Favicon'; +import Logo from './Logo'; + +export { Favicon, Logo }; diff --git a/packages/ui-components/src/Icons/PartnerLogos/NodeSource.tsx b/packages/ui-components/src/Icons/PartnerLogos/NodeSource/Favicon.tsx similarity index 97% rename from packages/ui-components/src/Icons/PartnerLogos/NodeSource.tsx rename to packages/ui-components/src/Icons/PartnerLogos/NodeSource/Favicon.tsx index eb1f12dacc349..93919fc60dc77 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/NodeSource.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/NodeSource/Favicon.tsx @@ -2,7 +2,6 @@ import type { FC, SVGProps } from 'react'; const NodeSource: FC> = props => ( - mark-light-1 > = props => ( + + + + +); + +export default NodeSource; diff --git a/packages/ui-components/src/Icons/PartnerLogos/NodeSource/index.ts b/packages/ui-components/src/Icons/PartnerLogos/NodeSource/index.ts new file mode 100644 index 0000000000000..b4cd37328b21d --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/NodeSource/index.ts @@ -0,0 +1,4 @@ +import Favicon from './Favicon'; +import Logo from './Logo'; + +export { Favicon, Logo }; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Rackspace.tsx b/packages/ui-components/src/Icons/PartnerLogos/Rackspace/Favicon.tsx similarity index 100% rename from packages/ui-components/src/Icons/PartnerLogos/Rackspace.tsx rename to packages/ui-components/src/Icons/PartnerLogos/Rackspace/Favicon.tsx diff --git a/packages/ui-components/src/Icons/PartnerLogos/Rackspace/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/Rackspace/Logo.tsx new file mode 100644 index 0000000000000..060834eec06fb --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Rackspace/Logo.tsx @@ -0,0 +1,19 @@ +// https://www.rackspace.com/newsroom/media-kit +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const Rackspace: FC> = props => ( + + + +); + +export default Rackspace; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Rackspace/index.ts b/packages/ui-components/src/Icons/PartnerLogos/Rackspace/index.ts new file mode 100644 index 0000000000000..b4cd37328b21d --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Rackspace/index.ts @@ -0,0 +1,4 @@ +import Favicon from './Favicon'; +import Logo from './Logo'; + +export { Favicon, Logo }; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Sentry.tsx b/packages/ui-components/src/Icons/PartnerLogos/Sentry/Favicon.tsx similarity index 100% rename from packages/ui-components/src/Icons/PartnerLogos/Sentry.tsx rename to packages/ui-components/src/Icons/PartnerLogos/Sentry/Favicon.tsx diff --git a/packages/ui-components/src/Icons/PartnerLogos/Sentry/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/Sentry/Logo.tsx new file mode 100644 index 0000000000000..429ecd0f3cc01 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Sentry/Logo.tsx @@ -0,0 +1,19 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const Sentry: FC> = props => ( + + + +); + +export default Sentry; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Sentry/index.ts b/packages/ui-components/src/Icons/PartnerLogos/Sentry/index.ts new file mode 100644 index 0000000000000..b4cd37328b21d --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Sentry/index.ts @@ -0,0 +1,4 @@ +import Favicon from './Favicon'; +import Logo from './Logo'; + +export { Favicon, Logo }; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Vercel.tsx b/packages/ui-components/src/Icons/PartnerLogos/Vercel/Favicon.tsx similarity index 100% rename from packages/ui-components/src/Icons/PartnerLogos/Vercel.tsx rename to packages/ui-components/src/Icons/PartnerLogos/Vercel/Favicon.tsx diff --git a/packages/ui-components/src/Icons/PartnerLogos/Vercel/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/Vercel/Logo.tsx new file mode 100644 index 0000000000000..858cca55d261c --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Vercel/Logo.tsx @@ -0,0 +1,23 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const Vercel: FC> = props => ( + + + +); + +export default Vercel; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Vercel/index.ts b/packages/ui-components/src/Icons/PartnerLogos/Vercel/index.ts new file mode 100644 index 0000000000000..b4cd37328b21d --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Vercel/index.ts @@ -0,0 +1,4 @@ +import Favicon from './Favicon'; +import Logo from './Logo'; + +export { Favicon, Logo }; diff --git a/packages/ui-components/src/Icons/PartnerLogos/index.ts b/packages/ui-components/src/Icons/PartnerLogos/index.ts index 5ea78e7296f5a..c27682993c683 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/index.ts +++ b/packages/ui-components/src/Icons/PartnerLogos/index.ts @@ -1,11 +1,11 @@ -import CLOUDFLARE from './Cloudflare'; -import CROWDIN from './Crowdin'; -import DATADOG from './DataDog'; -import HERODEVS from './HeroDevs'; -import NODESOURCE from './NodeSource'; -import RACKSPACE from './Rackspace'; -import SENTRY from './Sentry'; -import VERCEL from './Vercel'; +import * as CLOUDFLARE from './Cloudflare'; +import * as CROWDIN from './Crowdin'; +import * as DATADOG from './DataDog'; +import * as HERODEVS from './HeroDevs'; +import * as NODESOURCE from './NodeSource'; +import * as RACKSPACE from './Rackspace'; +import * as SENTRY from './Sentry'; +import * as VERCEL from './Vercel'; export { CLOUDFLARE, From 8302e8a46508dfca5d024e7dc542af2b58913b6e Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Tue, 22 Jul 2025 15:36:47 +0000 Subject: [PATCH 05/54] chore: add partner list on security blog post --- .../Partners/PartnersLogoList/index.module.css | 1 + apps/site/layouts/Post.tsx | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/apps/site/components/Common/Partners/PartnersLogoList/index.module.css b/apps/site/components/Common/Partners/PartnersLogoList/index.module.css index 5123cd5271793..a57ae2d4d0582 100644 --- a/apps/site/components/Common/Partners/PartnersLogoList/index.module.css +++ b/apps/site/components/Common/Partners/PartnersLogoList/index.module.css @@ -4,4 +4,5 @@ display: grid; gap: 16px; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); + width: 100%; } diff --git a/apps/site/layouts/Post.tsx b/apps/site/layouts/Post.tsx index 9b5234b727757..7e588fbdbb25d 100644 --- a/apps/site/layouts/Post.tsx +++ b/apps/site/layouts/Post.tsx @@ -1,6 +1,7 @@ import Preview from '@node-core/ui-components/Common/Preview'; import type { FC, PropsWithChildren } from 'react'; +import Link from '#site/components/Link'; import WithAvatarGroup from '#site/components/withAvatarGroup'; import WithBlogCrossLinks from '#site/components/withBlogCrossLinks'; import WithFooter from '#site/components/withFooter'; @@ -11,6 +12,7 @@ import { mapAuthorToCardAuthors } from '#site/util/author'; import { mapBlogCategoryToPreviewType } from '#site/util/blog'; import styles from './layouts.module.css'; +import PartnersLogoList from '../components/Common/Partners/PartnersLogoList'; const PostLayout: FC = ({ children }) => { const { frontmatter } = useClientContext(); @@ -37,7 +39,17 @@ const PostLayout: FC = ({ children }) => { {children} - + {type === 'vulnerability' && ( +
+

Thanks by Our Partners

+

+ We are able to offer security releases proudly due to the + support of these partners + and more. +

+ + + )} From 2f0e2bef3439b3d759c0c0c2786b058941eea0ea Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Tue, 22 Jul 2025 16:00:41 +0000 Subject: [PATCH 06/54] feat: enhance PartnersLogoList to filter partners by category and allow unlimited items --- .../Common/Partners/PartnersLogoList/index.tsx | 11 ++++++++--- apps/site/components/Common/Partners/utils.ts | 11 +++++++---- apps/site/pages/en/about/partners.mdx | 6 +++--- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/apps/site/components/Common/Partners/PartnersLogoList/index.tsx b/apps/site/components/Common/Partners/PartnersLogoList/index.tsx index 800ebd1a30e2e..c03729a4bb3f7 100644 --- a/apps/site/components/Common/Partners/PartnersLogoList/index.tsx +++ b/apps/site/components/Common/Partners/PartnersLogoList/index.tsx @@ -20,9 +20,14 @@ const PartnersLogoList: FC = ({ }) => { const initialRenderer = useRef(true); - const [seedList, setSeedList] = useState>( - LOGO_PARTNERS.slice(0, maxLength) - ); + const [seedList, setSeedList] = useState>(() => { + if (maxLength === null) { + return LOGO_PARTNERS.filter( + partner => !categories || partner.categories.includes(categories) + ); + } + return LOGO_PARTNERS.slice(0, maxLength); + }); useEffect(() => { // We intentionally render the initial default "mock" list of sponsors diff --git a/apps/site/components/Common/Partners/utils.ts b/apps/site/components/Common/Partners/utils.ts index fcc5e51b95a2e..c86e116c53f24 100644 --- a/apps/site/components/Common/Partners/utils.ts +++ b/apps/site/components/Common/Partners/utils.ts @@ -1,7 +1,7 @@ import type { PartnerCategory, Partners } from '#site/types/partners.js'; // TODO: Implement no random list -// TODO: Implement no limit items +// TODO: Implement no importance of partner function randomPartnerList( partners: Array, pick = 4, @@ -28,12 +28,15 @@ function randomPartnerList( const rng = mulberry32(seed); // Create a copy of the array to avoid modifying the original - const shuffled = partners + let shuffled = [...partners] .filter(partner => !category || partner.categories.includes(category)) - .slice() .sort(() => rng() - 0.5); - return shuffled.slice(0, pick); + if (pick !== null) { + shuffled = shuffled.slice(0, pick); + } + + return shuffled; } // This function returns a random list of partners based on a fixed time seed diff --git a/apps/site/pages/en/about/partners.mdx b/apps/site/pages/en/about/partners.mdx index 4f1ca98003183..0b3b1dbf70a61 100644 --- a/apps/site/pages/en/about/partners.mdx +++ b/apps/site/pages/en/about/partners.mdx @@ -11,19 +11,19 @@ Importance of partners and their role and explains our partner categories (Ecosy Projects with their logo, name, tier, the description and a CTA button - + ## Security Projects with their logo, name, tier, the description and a CTA button - + ## Ecosystem Sustainability Program (ESP) Projects with their logo, name, tier, the description and a CTA button - + ## Backers (Open Collective and GitHub Sponsors) From 435eb912c9785cc651c536913a0e6fc6ececb4f4 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Tue, 22 Jul 2025 20:45:17 +0000 Subject: [PATCH 07/54] feat: add new partner categories and update partner weights --- apps/site/pages/en/about/partners.mdx | 12 ++ apps/site/types/partners.ts | 10 +- apps/site/util/partners/constants.json | 24 ++-- apps/site/util/partners/original.json | 156 ++++++++++++++++--------- 4 files changed, 131 insertions(+), 71 deletions(-) diff --git a/apps/site/pages/en/about/partners.mdx b/apps/site/pages/en/about/partners.mdx index 0b3b1dbf70a61..ea8d1e5d5bee7 100644 --- a/apps/site/pages/en/about/partners.mdx +++ b/apps/site/pages/en/about/partners.mdx @@ -25,6 +25,18 @@ Projects with their logo, name, tier, the description and a CTA button +## Releases + +Projects with their logo, name, tier, the description and a CTA button + + + +## Services + +Projects with their logo, name, tier, the description and a CTA button + + + ## Backers (Open Collective and GitHub Sponsors) Show a list of lists direct individual or organizational support that can be done through OpenCollective and GitHub Sponsors diff --git a/apps/site/types/partners.ts b/apps/site/types/partners.ts index e5bc840401a60..61a07d5f43e1a 100644 --- a/apps/site/types/partners.ts +++ b/apps/site/types/partners.ts @@ -14,7 +14,13 @@ export interface Partners { categories: Array; // An optional description of the partner description?: string; - threshold: number; + // The weight of the partner, used for random selection + weight: number; } -export type PartnerCategory = 'infrastructure' | 'security' | 'esp'; +export type PartnerCategory = + | 'infrastructure' + | 'security' + | 'esp' + | 'release' + | 'service'; diff --git a/apps/site/util/partners/constants.json b/apps/site/util/partners/constants.json index faa6f34ac2e74..1612f787d8f02 100644 --- a/apps/site/util/partners/constants.json +++ b/apps/site/util/partners/constants.json @@ -3,56 +3,56 @@ "id": "RACKSPACE", "name": "Rackspace", "href": "https://www.rackspace.com", - "threshold": 2, + "weight": 3, "categories": ["infrastructure"] }, { "id": "CLOUDFLARE", "name": "Cloudflare", "href": "https://www.cloudflare.com", - "threshold": 3, + "weight": 3, "categories": ["infrastructure"] }, { "id": "VERCEL", "name": "Vercel", "href": "https://vercel.com", - "threshold": 1, + "weight": 2, "categories": ["infrastructure"] }, { "id": "SENTRY", "name": "Sentry", "href": "https://sentry.io", - "threshold": 3, - "categories": ["infrastructure"] + "weight": 1, + "categories": ["service"] }, { "id": "CROWDIN", "name": "Crowdin", "href": "https://crowdin.com", - "threshold": 2, - "categories": ["infrastructure"] + "weight": 1, + "categories": ["service"] }, { "id": "HERODEVS", "name": "HeroDevs", "href": "https://herodevs.com", - "threshold": 1, - "categories": ["security", "esp"] + "weight": 2, + "categories": ["security", "esp", "release"] }, { "id": "NODESOURCE", "name": "NodeSource", "href": "https://nodesource.com", - "threshold": 2, - "categories": ["security"] + "weight": 2, + "categories": ["security", "release"] }, { "id": "DATADOG", "name": "Datadog", "href": "https://www.datadoghq.com", - "threshold": 3, + "weight": 2, "categories": ["security"] } ] diff --git a/apps/site/util/partners/original.json b/apps/site/util/partners/original.json index aeb840a500914..a63657ac50ff3 100644 --- a/apps/site/util/partners/original.json +++ b/apps/site/util/partners/original.json @@ -1,129 +1,171 @@ [ - { - "id": "DIGITALOCEAN", - "name": "DigitalOcean", - "href": "https://www.digitalocean.com", - "categories": ["infrastructure"] - }, { "id": "RACKSPACE", "name": "Rackspace", "href": "https://www.rackspace.com", + "weight": 3, + "categories": ["infrastructure"] + }, + { + "id": "CLOUDFLARE", + "name": "Cloudflare", + "href": "https://www.cloudflare.com", + "weight": 3, + "categories": ["infrastructure"] + }, + { + "id": "VERCEL", + "name": "Vercel", + "href": "https://vercel.com", + "weight": 2, "categories": ["infrastructure"] }, + { + "id": "SENTRY", + "name": "Sentry", + "href": "https://sentry.io", + "weight": 1, + "categories": ["infrastructure"] + }, + { + "id": "CROWDIN", + "name": "Crowdin", + "href": "https://crowdin.com", + "weight": 1, + "categories": ["service"] + }, + { + "id": "HERODEVS", + "name": "HeroDevs", + "href": "https://herodevs.com", + "weight": 3, + "categories": ["security", "esp", "release"] + }, + { + "id": "NODESOURCE", + "name": "NodeSource", + "href": "https://nodesource.com", + "weight": 2, + "categories": ["security", "release"] + }, + { + "id": "DATADOG", + "name": "Datadog", + "href": "https://www.datadoghq.com", + "weight": 2, + "categories": ["security"] + }, + { + "id": "DIGITALOCEAN", + "name": "DigitalOcean", + "href": "https://www.digitalocean.com", + "categories": ["infrastructure"], + "weight": 3 + }, { "id": "MICROSOFT", "name": "Microsoft", "href": "https://microsoft.com", - "categories": ["infrastructure"] + "categories": ["infrastructure"], + "weight": 2 }, { "id": "MNX", "name": "MNX", "href": "ToDo", "logo": "ToDo", - "categories": ["infrastructure"] + "categories": ["infrastructure"], + "weight": 2 }, { "id": "IBM", "name": "IBM", "href": "https://www.ibm.com", - "categories": ["infrastructure"] + "categories": ["infrastructure", "release"], + "weight": 3 }, { "id": "SCALEWAY", "name": "Scaleway", "href": "https://www.scaleway.com", - "categories": ["infrastructure"] - }, - { - "id": "CLOUDFLARE", - "name": "Cloudflare", - "href": "https://www.cloudflare.com", - "categories": ["infrastructure"] + "categories": ["infrastructure"], + "weight": 2 }, { "id": "ARM", "name": "ARM", "href": "https://www.arm.com", - "categories": ["infrastructure"] + "categories": ["infrastructure"], + "weight": 2 }, { "id": "INTEL", "name": "Intel", "href": "https://www.intel.com", - "categories": ["infrastructure"] + "categories": ["infrastructure"], + "weight": 2 }, { "id": "MACSTADIUM", "name": "MacStadium", "href": "https://www.macstadium.com", - "categories": ["infrastructure"] + "categories": ["infrastructure"], + "weight": 2 }, { "id": "EQUINIXMETAL", "name": "Equinix Metal", "href": "https://www.equinix.com", - "categories": ["infrastructure"] + "categories": ["infrastructure"], + "weight": 2 }, { "id": "CHROMATIC", "name": "Chromatic", "href": "https://www.chromatic.com", - "categories": ["infrastructure"] - }, - { - "id": "VERCEL", - "name": "Vercel", - "href": "https://vercel.com", - "categories": ["infrastructure"] - }, - { - "id": "SENTRY", - "name": "Sentry", - "href": "https://sentry.io", - "categories": ["infrastructure"] - }, - { - "id": "CROWDIN", - "name": "Crowdin", - "href": "https://crowdin.com", - "categories": ["infrastructure"] + "categories": ["service"], + "weight": 1 }, { "id": "ORAMA", "name": "Orama", "href": "https://orama.com", - "categories": ["infrastructure"] - }, - { - "id": "HERODEVS", - "name": "HeroDevs", - "href": "https://herodevs.com", - "categories": ["security", "esp partner"] - }, - { - "id": "NODESOURCE", - "name": "NodeSource", - "href": "https://nodesource.com", - "categories": ["security"] + "categories": ["service"], + "weight": 1 }, { "id": "PLATFORMATIC", "name": "Platformatic", "href": "https://platformatic.dev", - "categories": ["security"] + "categories": ["security"], + "weight": 2 }, { "id": "REDHAT", "name": "Red Hat", "href": "https://www.redhat.com", - "categories": ["security"] + "categories": ["security"], + "weight": 2 }, { - "id": "DATADOG", - "name": "Datadog", - "href": "https://www.datadoghq.com", + "id": "OPENSSF", + "name": "Open SSF", + "href": "https://openssf.org/", + "weight": 2, "categories": ["security"] + }, + { + "id": "VLT", + "name": "Vlt", + "href": "https://www.vlt.sh", + "weight": 2, + "categories": ["release"] + }, + { + "id": "ZAKODIUM", + "name": "zakodium", + "href": "https://www.zakodium.com", + "weight": 2, + "categories": ["release"] } ] From 5fd31f8c5db2b8884da258edf609a43df9e4a0e7 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Tue, 22 Jul 2025 20:45:42 +0000 Subject: [PATCH 08/54] feat: update partner selection logic to use weighted randomization --- apps/site/components/Common/Partners/utils.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/apps/site/components/Common/Partners/utils.ts b/apps/site/components/Common/Partners/utils.ts index c86e116c53f24..a0649ed7d2bdd 100644 --- a/apps/site/components/Common/Partners/utils.ts +++ b/apps/site/components/Common/Partners/utils.ts @@ -27,20 +27,26 @@ function randomPartnerList( const seed = fixedTime.getTime(); const rng = mulberry32(seed); + const weightedPartners = partners.flatMap(partner => { + if (category && !partner.categories.includes(category)) return []; + const weight = partner.weight; + return Array(weight).fill(partner); + }); + // Create a copy of the array to avoid modifying the original - let shuffled = [...partners] - .filter(partner => !category || partner.categories.includes(category)) - .sort(() => rng() - 0.5); + const shuffled = [...weightedPartners].sort(() => rng() - 0.5); + + // Remove duplicates while preserving order + const unique = Array.from(new Set(shuffled)); if (pick !== null) { - shuffled = shuffled.slice(0, pick); + return unique.slice(0, pick); } - return shuffled; + return unique; } // This function returns a random list of partners based on a fixed time seed - function mulberry32(seed: number) { return function () { let t = (seed += 0x6d2b79f5); From 91b65359cd7d275713bda2fb1cda1ddbb5899aec Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Tue, 22 Jul 2025 20:55:36 +0000 Subject: [PATCH 09/54] feat: update button href to include UTM parameters for tracking --- apps/site/components/Common/Partners/PartnerIcon/index.tsx | 6 +++++- apps/site/components/Common/Partners/PartnerLogo/index.tsx | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/site/components/Common/Partners/PartnerIcon/index.tsx b/apps/site/components/Common/Partners/PartnerIcon/index.tsx index 65424a3673680..57d085c881d71 100644 --- a/apps/site/components/Common/Partners/PartnerIcon/index.tsx +++ b/apps/site/components/Common/Partners/PartnerIcon/index.tsx @@ -14,7 +14,11 @@ const PartnersIcon: FC = ({ name, href, logo, loading }) => { return ( - + + From 95702583df57868c8d3c36ec6c43dc179cfd8a40 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Thu, 24 Jul 2025 19:26:10 +0000 Subject: [PATCH 13/54] ui-components: add more partner logos --- apps/site/util/partners/constants.json | 23 +- .../src/Icons/PartnerLogos/ARM/Favicon.tsx | 38 +++ .../src/Icons/PartnerLogos/ARM/Logo.tsx | 38 +++ .../src/Icons/PartnerLogos/ARM/index.tsx | 4 + .../Icons/PartnerLogos/DataDog/Favicon.tsx | 40 +++- .../src/Icons/PartnerLogos/DataDog/Logo.tsx | 159 +++++++++---- .../PartnerLogos/DigitalOcean/Favicon.tsx | 62 +++++ .../Icons/PartnerLogos/DigitalOcean/Logo.tsx | 217 ++++++++++++++++++ .../Icons/PartnerLogos/DigitalOcean/index.ts | 4 + .../Icons/PartnerLogos/NodeSource/Logo.tsx | 12 +- .../src/Icons/PartnerLogos/Vlt/Favicon.tsx | 23 ++ .../src/Icons/PartnerLogos/Vlt/Logo.tsx | 23 ++ .../src/Icons/PartnerLogos/Vlt/index.ts | 4 + .../src/Icons/PartnerLogos/index.ts | 6 + 14 files changed, 598 insertions(+), 55 deletions(-) create mode 100644 packages/ui-components/src/Icons/PartnerLogos/ARM/Favicon.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/ARM/Logo.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/ARM/index.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Favicon.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Logo.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/index.ts create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Vlt/Favicon.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Vlt/Logo.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Vlt/index.ts diff --git a/apps/site/util/partners/constants.json b/apps/site/util/partners/constants.json index 1612f787d8f02..b934f56661336 100644 --- a/apps/site/util/partners/constants.json +++ b/apps/site/util/partners/constants.json @@ -38,7 +38,7 @@ "id": "HERODEVS", "name": "HeroDevs", "href": "https://herodevs.com", - "weight": 2, + "weight": 3, "categories": ["security", "esp", "release"] }, { @@ -54,5 +54,26 @@ "href": "https://www.datadoghq.com", "weight": 2, "categories": ["security"] + }, + { + "id": "DIGITALOCEAN", + "name": "DigitalOcean", + "href": "https://www.digitalocean.com", + "categories": ["infrastructure"], + "weight": 3 + }, + { + "id": "ARM", + "name": "ARM", + "href": "https://www.arm.com", + "categories": ["infrastructure"], + "weight": 2 + }, + { + "id": "VLT", + "name": "Vlt", + "href": "https://www.vlt.sh", + "weight": 2, + "categories": ["release"] } ] diff --git a/packages/ui-components/src/Icons/PartnerLogos/ARM/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/ARM/Favicon.tsx new file mode 100644 index 0000000000000..771999c825b93 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/ARM/Favicon.tsx @@ -0,0 +1,38 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const ARM: FC> = props => ( + + + + + +); + +export default ARM; diff --git a/packages/ui-components/src/Icons/PartnerLogos/ARM/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/ARM/Logo.tsx new file mode 100644 index 0000000000000..771999c825b93 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/ARM/Logo.tsx @@ -0,0 +1,38 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const ARM: FC> = props => ( + + + + + +); + +export default ARM; diff --git a/packages/ui-components/src/Icons/PartnerLogos/ARM/index.tsx b/packages/ui-components/src/Icons/PartnerLogos/ARM/index.tsx new file mode 100644 index 0000000000000..b4cd37328b21d --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/ARM/index.tsx @@ -0,0 +1,4 @@ +import Favicon from './Favicon'; +import Logo from './Logo'; + +export { Favicon, Logo }; diff --git a/packages/ui-components/src/Icons/PartnerLogos/DataDog/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/DataDog/Favicon.tsx index 5b80b2295dfff..0b6bfaf8f5930 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/DataDog/Favicon.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/DataDog/Favicon.tsx @@ -14,8 +14,46 @@ const DataDog: FC> = props => ( {...props} > + + > = props => ( + + + + + + + + + + + diff --git a/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Favicon.tsx new file mode 100644 index 0000000000000..9a9e27c3f0048 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Favicon.tsx @@ -0,0 +1,62 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const Crowdin: FC> = props => ( + + + + + + + + + + + + + + + + + + + + + +); + +export default Crowdin; diff --git a/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Logo.tsx new file mode 100644 index 0000000000000..76c6770fa090f --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Logo.tsx @@ -0,0 +1,217 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const Crowdin: FC> = props => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export default Crowdin; diff --git a/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/index.ts b/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/index.ts new file mode 100644 index 0000000000000..b4cd37328b21d --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/index.ts @@ -0,0 +1,4 @@ +import Favicon from './Favicon'; +import Logo from './Logo'; + +export { Favicon, Logo }; diff --git a/packages/ui-components/src/Icons/PartnerLogos/NodeSource/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/NodeSource/Logo.tsx index 547d0c4993658..f6907cd79c800 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/NodeSource/Logo.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/NodeSource/Logo.tsx @@ -1,20 +1,20 @@ +import classNames from 'classnames'; import type { FC, SVGProps } from 'react'; const NodeSource: FC> = props => ( ); diff --git a/packages/ui-components/src/Icons/PartnerLogos/Vlt/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/Vlt/Favicon.tsx new file mode 100644 index 0000000000000..30812054f4eb4 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Vlt/Favicon.tsx @@ -0,0 +1,23 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const Vlt: FC> = props => ( + + + +); + +export default Vlt; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Vlt/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/Vlt/Logo.tsx new file mode 100644 index 0000000000000..30812054f4eb4 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Vlt/Logo.tsx @@ -0,0 +1,23 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const Vlt: FC> = props => ( + + + +); + +export default Vlt; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Vlt/index.ts b/packages/ui-components/src/Icons/PartnerLogos/Vlt/index.ts new file mode 100644 index 0000000000000..b4cd37328b21d --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Vlt/index.ts @@ -0,0 +1,4 @@ +import Favicon from './Favicon'; +import Logo from './Logo'; + +export { Favicon, Logo }; diff --git a/packages/ui-components/src/Icons/PartnerLogos/index.ts b/packages/ui-components/src/Icons/PartnerLogos/index.ts index c27682993c683..2a21b58a14e05 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/index.ts +++ b/packages/ui-components/src/Icons/PartnerLogos/index.ts @@ -1,19 +1,25 @@ +import * as ARM from './ARM'; import * as CLOUDFLARE from './Cloudflare'; import * as CROWDIN from './Crowdin'; import * as DATADOG from './DataDog'; +import * as DIGITALOCEAN from './DigitalOcean'; import * as HERODEVS from './HeroDevs'; import * as NODESOURCE from './NodeSource'; import * as RACKSPACE from './Rackspace'; import * as SENTRY from './Sentry'; import * as VERCEL from './Vercel'; +import * as VLT from './Vlt'; export { + ARM, CLOUDFLARE, CROWDIN, DATADOG, + DIGITALOCEAN, HERODEVS, NODESOURCE, RACKSPACE, SENTRY, VERCEL, + VLT, }; From 96bc9f9c45d0be07122fc0bbb7c6fd3ac5a8914f Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Thu, 24 Jul 2025 22:43:02 +0000 Subject: [PATCH 14/54] ui-components: add more partners logos --- apps/site/util/partners/constants.json | 35 +++ .../PartnerLogos/EquinixMetal/Favicon.tsx | 35 +++ .../Icons/PartnerLogos/EquinixMetal/Logo.tsx | 84 +++++++ .../Icons/PartnerLogos/EquinixMetal/index.ts | 4 + .../src/Icons/PartnerLogos/IBM/Favicon.tsx | 224 +++++++++++++++++ .../src/Icons/PartnerLogos/IBM/Logo.tsx | 224 +++++++++++++++++ .../src/Icons/PartnerLogos/IBM/index.ts | 4 + .../Icons/PartnerLogos/Microsoft/Favicon.tsx | 30 +++ .../src/Icons/PartnerLogos/Microsoft/Logo.tsx | 36 +++ .../src/Icons/PartnerLogos/Microsoft/index.ts | 4 + .../Icons/PartnerLogos/OpenSSF/Favicon.tsx | 99 ++++++++ .../src/Icons/PartnerLogos/OpenSSF/Logo.tsx | 234 ++++++++++++++++++ .../src/Icons/PartnerLogos/OpenSSF/index.ts | 4 + .../Icons/PartnerLogos/Rackspace/Favicon.tsx | 5 +- .../src/Icons/PartnerLogos/Rackspace/Logo.tsx | 3 +- .../Icons/PartnerLogos/Scaleway/Favicon.tsx | 30 +++ .../src/Icons/PartnerLogos/Scaleway/Logo.tsx | 68 +++++ .../src/Icons/PartnerLogos/Scaleway/index.ts | 4 + .../src/Icons/PartnerLogos/Vlt/Favicon.tsx | 4 +- .../src/Icons/PartnerLogos/Vlt/Logo.tsx | 4 +- .../src/Icons/PartnerLogos/index.ts | 10 + 21 files changed, 1136 insertions(+), 9 deletions(-) create mode 100644 packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/Favicon.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/Logo.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/index.ts create mode 100644 packages/ui-components/src/Icons/PartnerLogos/IBM/Favicon.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/IBM/Logo.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/IBM/index.ts create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Microsoft/Favicon.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Microsoft/Logo.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Microsoft/index.ts create mode 100644 packages/ui-components/src/Icons/PartnerLogos/OpenSSF/Favicon.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/OpenSSF/Logo.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/OpenSSF/index.ts create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Scaleway/Favicon.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Scaleway/Logo.tsx create mode 100644 packages/ui-components/src/Icons/PartnerLogos/Scaleway/index.ts diff --git a/apps/site/util/partners/constants.json b/apps/site/util/partners/constants.json index b934f56661336..0f64d21e3e672 100644 --- a/apps/site/util/partners/constants.json +++ b/apps/site/util/partners/constants.json @@ -62,6 +62,27 @@ "categories": ["infrastructure"], "weight": 3 }, + { + "id": "MICROSOFT", + "name": "Microsoft", + "href": "https://microsoft.com", + "categories": ["infrastructure"], + "weight": 2 + }, + { + "id": "IBM", + "name": "IBM", + "href": "https://www.ibm.com", + "categories": ["infrastructure", "release"], + "weight": 3 + }, + { + "id": "SCALEWAY", + "name": "Scaleway", + "href": "https://www.scaleway.com", + "categories": ["infrastructure"], + "weight": 2 + }, { "id": "ARM", "name": "ARM", @@ -69,6 +90,20 @@ "categories": ["infrastructure"], "weight": 2 }, + { + "id": "EQUINIXMETAL", + "name": "Equinix Metal", + "href": "https://www.equinix.com", + "categories": ["infrastructure"], + "weight": 2 + }, + { + "id": "OPENSSF", + "name": "OpenSSF", + "href": "https://openssf.org/", + "weight": 2, + "categories": ["security"] + }, { "id": "VLT", "name": "Vlt", diff --git a/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/Favicon.tsx new file mode 100644 index 0000000000000..364f53a536ca1 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/Favicon.tsx @@ -0,0 +1,35 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const EquinixMetal: FC> = props => ( + + + + +); + +export default EquinixMetal; diff --git a/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/Logo.tsx new file mode 100644 index 0000000000000..371889dab83a5 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/Logo.tsx @@ -0,0 +1,84 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const EquinixMetal: FC> = props => ( + + + + + + + + + + + + + + + + + +); + +export default EquinixMetal; diff --git a/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/index.ts b/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/index.ts new file mode 100644 index 0000000000000..b4cd37328b21d --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/index.ts @@ -0,0 +1,4 @@ +import Favicon from './Favicon'; +import Logo from './Logo'; + +export { Favicon, Logo }; diff --git a/packages/ui-components/src/Icons/PartnerLogos/IBM/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/IBM/Favicon.tsx new file mode 100644 index 0000000000000..3479708ad3c95 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/IBM/Favicon.tsx @@ -0,0 +1,224 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const IBM: FC> = props => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export default IBM; diff --git a/packages/ui-components/src/Icons/PartnerLogos/IBM/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/IBM/Logo.tsx new file mode 100644 index 0000000000000..3479708ad3c95 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/IBM/Logo.tsx @@ -0,0 +1,224 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const IBM: FC> = props => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export default IBM; diff --git a/packages/ui-components/src/Icons/PartnerLogos/IBM/index.ts b/packages/ui-components/src/Icons/PartnerLogos/IBM/index.ts new file mode 100644 index 0000000000000..b4cd37328b21d --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/IBM/index.ts @@ -0,0 +1,4 @@ +import Favicon from './Favicon'; +import Logo from './Logo'; + +export { Favicon, Logo }; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Microsoft/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/Microsoft/Favicon.tsx new file mode 100644 index 0000000000000..88fbb9d363872 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Microsoft/Favicon.tsx @@ -0,0 +1,30 @@ +import type { FC, SVGProps } from 'react'; + +const Microsoft: FC> = props => ( + + + + + + + + + + + + + +); + +export default Microsoft; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Microsoft/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/Microsoft/Logo.tsx new file mode 100644 index 0000000000000..89c7661aec3e4 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Microsoft/Logo.tsx @@ -0,0 +1,36 @@ +import type { FC, SVGProps } from 'react'; + +const Microsoft: FC> = props => ( + + + + + + + + + + + + + + +); + +export default Microsoft; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Microsoft/index.ts b/packages/ui-components/src/Icons/PartnerLogos/Microsoft/index.ts new file mode 100644 index 0000000000000..b4cd37328b21d --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Microsoft/index.ts @@ -0,0 +1,4 @@ +import Favicon from './Favicon'; +import Logo from './Logo'; + +export { Favicon, Logo }; diff --git a/packages/ui-components/src/Icons/PartnerLogos/OpenSSF/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/OpenSSF/Favicon.tsx new file mode 100644 index 0000000000000..de3a0f39679c6 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/OpenSSF/Favicon.tsx @@ -0,0 +1,99 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const OpenSSF: FC> = props => ( + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export default OpenSSF; diff --git a/packages/ui-components/src/Icons/PartnerLogos/OpenSSF/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/OpenSSF/Logo.tsx new file mode 100644 index 0000000000000..c5e6b86657f33 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/OpenSSF/Logo.tsx @@ -0,0 +1,234 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const OpenSSF: FC> = props => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export default OpenSSF; diff --git a/packages/ui-components/src/Icons/PartnerLogos/OpenSSF/index.ts b/packages/ui-components/src/Icons/PartnerLogos/OpenSSF/index.ts new file mode 100644 index 0000000000000..b4cd37328b21d --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/OpenSSF/index.ts @@ -0,0 +1,4 @@ +import Favicon from './Favicon'; +import Logo from './Logo'; + +export { Favicon, Logo }; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Rackspace/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/Rackspace/Favicon.tsx index 516b2e56f5012..1c805ca663c80 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/Rackspace/Favicon.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/Rackspace/Favicon.tsx @@ -1,4 +1,3 @@ -// https://www.rackspace.com/newsroom/media-kit import classNames from 'classnames'; import type { FC, SVGProps } from 'react'; @@ -6,12 +5,12 @@ const Rackspace: FC> = props => ( ); diff --git a/packages/ui-components/src/Icons/PartnerLogos/Rackspace/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/Rackspace/Logo.tsx index 060834eec06fb..2f70a8ee278e7 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/Rackspace/Logo.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/Rackspace/Logo.tsx @@ -1,4 +1,3 @@ -// https://www.rackspace.com/newsroom/media-kit import classNames from 'classnames'; import type { FC, SVGProps } from 'react'; @@ -7,7 +6,7 @@ const Rackspace: FC> = props => ( viewBox="0 0 400 124" xmlns="http://www.w3.org/2000/svg" {...props} - className={classNames('text-[#eb0000]', props.className)} + className={classNames('text-[#eb0000] dark:text-white', props.className)} > > = props => ( + + + + + +); + +export default Scaleway; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Scaleway/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/Scaleway/Logo.tsx new file mode 100644 index 0000000000000..4dcbe7d5756f0 --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Scaleway/Logo.tsx @@ -0,0 +1,68 @@ +import classNames from 'classnames'; +import type { FC, SVGProps } from 'react'; + +const Scaleway: FC> = props => ( + + + + + + + + + + + + + +); + +export default Scaleway; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Scaleway/index.ts b/packages/ui-components/src/Icons/PartnerLogos/Scaleway/index.ts new file mode 100644 index 0000000000000..b4cd37328b21d --- /dev/null +++ b/packages/ui-components/src/Icons/PartnerLogos/Scaleway/index.ts @@ -0,0 +1,4 @@ +import Favicon from './Favicon'; +import Logo from './Logo'; + +export { Favicon, Logo }; diff --git a/packages/ui-components/src/Icons/PartnerLogos/Vlt/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/Vlt/Favicon.tsx index 30812054f4eb4..ede3e459a7e93 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/Vlt/Favicon.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/Vlt/Favicon.tsx @@ -12,8 +12,8 @@ const Vlt: FC> = props => ( {...props} > diff --git a/packages/ui-components/src/Icons/PartnerLogos/Vlt/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/Vlt/Logo.tsx index 30812054f4eb4..ede3e459a7e93 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/Vlt/Logo.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/Vlt/Logo.tsx @@ -12,8 +12,8 @@ const Vlt: FC> = props => ( {...props} > diff --git a/packages/ui-components/src/Icons/PartnerLogos/index.ts b/packages/ui-components/src/Icons/PartnerLogos/index.ts index 2a21b58a14e05..fe46cde4ce60d 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/index.ts +++ b/packages/ui-components/src/Icons/PartnerLogos/index.ts @@ -3,9 +3,14 @@ import * as CLOUDFLARE from './Cloudflare'; import * as CROWDIN from './Crowdin'; import * as DATADOG from './DataDog'; import * as DIGITALOCEAN from './DigitalOcean'; +import * as EQUINIXMETAL from './EquinixMetal'; import * as HERODEVS from './HeroDevs'; +import * as IBM from './IBM'; +import * as MICROSOFT from './Microsoft'; import * as NODESOURCE from './NodeSource'; +import * as OPENSSF from './OpenSSF'; import * as RACKSPACE from './Rackspace'; +import * as SCALEWAY from './Scaleway'; import * as SENTRY from './Sentry'; import * as VERCEL from './Vercel'; import * as VLT from './Vlt'; @@ -16,9 +21,14 @@ export { CROWDIN, DATADOG, DIGITALOCEAN, + EQUINIXMETAL, HERODEVS, + IBM, + MICROSOFT, NODESOURCE, + OPENSSF, RACKSPACE, + SCALEWAY, SENTRY, VERCEL, VLT, From edf525993f703892fd0fc6166b516f0409c4c981 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Fri, 25 Jul 2025 00:04:22 +0000 Subject: [PATCH 15/54] clean up --- .../Common/Partners/PartnerIcon/index.module.css | 8 ++++---- .../Common/Partners/PartnerIcon/index.tsx | 5 ++--- .../Common/Partners/PartnerLogo/index.module.css | 2 +- .../Common/Partners/PartnerLogo/index.tsx | 3 +-- .../Common/Partners/PartnersIconList/index.tsx | 2 +- .../Partners/PartnersLogoList/index.module.css | 8 ++++---- .../Common/Partners/PartnersLogoList/index.tsx | 2 +- apps/site/next.mdx.use.mjs | 4 ++-- apps/site/next.partners.constants.tsx | 10 +++++----- apps/site/pages/en/about/partners.mdx | 9 +++++---- apps/site/pages/en/download/current.mdx | 4 ++-- apps/site/pages/en/download/index.mdx | 4 ++-- apps/site/types/partners.ts | 2 -- apps/site/util/partners/index.tsx | 6 ++---- packages/i18n/src/locales/en.json | 2 +- .../src/Icons/PartnerLogos/ARM/Favicon.tsx | 3 +-- .../src/Icons/PartnerLogos/ARM/Logo.tsx | 3 +-- .../src/Icons/PartnerLogos/DataDog/Favicon.tsx | 3 +-- .../src/Icons/PartnerLogos/DataDog/Logo.tsx | 3 +-- .../Icons/PartnerLogos/DigitalOcean/Favicon.tsx | 3 +-- .../src/Icons/PartnerLogos/DigitalOcean/Logo.tsx | 3 +-- .../src/Icons/PartnerLogos/Microsoft/Favicon.tsx | 2 +- .../src/Icons/PartnerLogos/Microsoft/Logo.tsx | 2 +- .../src/Icons/PartnerLogos/Scaleway/Logo.tsx | 16 ++++++++-------- 24 files changed, 49 insertions(+), 60 deletions(-) diff --git a/apps/site/components/Common/Partners/PartnerIcon/index.module.css b/apps/site/components/Common/Partners/PartnerIcon/index.module.css index 5ca11edb40806..6c04f8a429085 100644 --- a/apps/site/components/Common/Partners/PartnerIcon/index.module.css +++ b/apps/site/components/Common/Partners/PartnerIcon/index.module.css @@ -1,10 +1,10 @@ @reference "../../../../styles/index.css"; .partnerIcon { - @apply h-9! - w-auto! - min-w-9! - !p-2; + @apply h-9 + w-auto + min-w-9 + p-2; svg { @apply !h-4 diff --git a/apps/site/components/Common/Partners/PartnerIcon/index.tsx b/apps/site/components/Common/Partners/PartnerIcon/index.tsx index 1ede82557ab7b..9709435623f57 100644 --- a/apps/site/components/Common/Partners/PartnerIcon/index.tsx +++ b/apps/site/components/Common/Partners/PartnerIcon/index.tsx @@ -13,14 +13,13 @@ type ParnetsIconProps = Partners & ComponentProps; const PartnersIcon: FC = ({ name, href, logo, loading }) => { return ( - {name}}> + {name}}> + diff --git a/apps/site/pages/en/download/current.mdx b/apps/site/pages/en/download/current.mdx index 0ee4a3ac9a671..2fbab9656dd11 100644 --- a/apps/site/pages/en/download/current.mdx +++ b/apps/site/pages/en/download/current.mdx @@ -39,8 +39,8 @@ or the unof

Thanks by Our Partners

- We are able to serve Node.js downloads and maintain our infrastructure thanks - to our amazing partners. + We are able to serve Node.js's downloads and maintain our infrastructure + proudly due to the support of these partners, and more.
diff --git a/apps/site/pages/en/download/index.mdx b/apps/site/pages/en/download/index.mdx index 0ee4a3ac9a671..2fbab9656dd11 100644 --- a/apps/site/pages/en/download/index.mdx +++ b/apps/site/pages/en/download/index.mdx @@ -39,8 +39,8 @@ or the unof

Thanks by Our Partners

- We are able to serve Node.js downloads and maintain our infrastructure thanks - to our amazing partners. + We are able to serve Node.js's downloads and maintain our infrastructure + proudly due to the support of these partners, and more.
diff --git a/apps/site/types/partners.ts b/apps/site/types/partners.ts index b808bad8f22c6..67ae2e70b3da9 100644 --- a/apps/site/types/partners.ts +++ b/apps/site/types/partners.ts @@ -1,5 +1,3 @@ -// import type { ReactElement, SVGProps } from 'react'; - import type { ReactElement, SVGProps } from 'react'; export interface Partners { diff --git a/apps/site/util/partners/index.tsx b/apps/site/util/partners/index.tsx index 25cb3521d94ef..9562a9b7e9c6f 100644 --- a/apps/site/util/partners/index.tsx +++ b/apps/site/util/partners/index.tsx @@ -3,8 +3,6 @@ import type { ElementType } from 'react'; import type { Partners } from '#site/types'; -// import partners from './constants.json'; - /** * Creates an icon element for a component */ @@ -17,8 +15,8 @@ const createIcon = ( return ; }; -// Package Manager dropdown items -export const partnersList = ( +// Creates a list of partners with their respective icons +export const createPartnersList = ( partnerLists: Array>, type?: 'Logo' | 'Favicon' ) => diff --git a/packages/i18n/src/locales/en.json b/packages/i18n/src/locales/en.json index 3f2084bb8508b..6eff244decf52 100644 --- a/packages/i18n/src/locales/en.json +++ b/packages/i18n/src/locales/en.json @@ -145,7 +145,7 @@ "governance": "Project Governance", "releases": "Node.js Releases", "security": "Security Reporting", - "partners": "Partners" + "partners": "Partners & Supporters" } }, "getInvolved": { diff --git a/packages/ui-components/src/Icons/PartnerLogos/ARM/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/ARM/Favicon.tsx index 771999c825b93..b2cee516e7c43 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/ARM/Favicon.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/ARM/Favicon.tsx @@ -14,8 +14,7 @@ const ARM: FC> = props => ( viewBox="0 0 4332.3 1318.7" className={classNames('text-[#0D0B21] dark:text-white', props.className)} xmlSpace="preserve" - // @ts-expect-error style is not a valid prop in SVGProps - style={{ enableBackground: 'new 0 0 4332.3 1318.7' }} + enableBackground="new 0 0 4332.3 1318.7" > > = props => ( viewBox="0 0 4332.3 1318.7" className={classNames('text-[#0D0B21] dark:text-white', props.className)} xmlSpace="preserve" - // @ts-expect-error style is not a valid prop in SVGProps - style={{ enableBackground: 'new 0 0 4332.3 1318.7' }} + enableBackground="new 0 0 4332.3 1318.7" > > = props => ( x="0px" y="0px" viewBox="0 0 800.55 856.85" - // @ts-expect-error style is not a valid prop in SVGProps - style={{ enableBackground: 'new 0 0 800.55 856.85' }} + enableBackground="new 0 0 800.55 856.85" className={classNames('text-[#632CA6] dark:text-white', props.className)} {...props} > diff --git a/packages/ui-components/src/Icons/PartnerLogos/DataDog/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/DataDog/Logo.tsx index a105883e36f03..0740b0cb317c9 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/DataDog/Logo.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/DataDog/Logo.tsx @@ -9,8 +9,7 @@ const DataDog: FC> = props => ( y="0px" viewBox="0 0 800.5 196.2" className={classNames('text-[#632CA6] dark:text-white', props.className)} - // @ts-expect-error style is not a valid prop in SVGProps - style={{ enableBackground: 'new 0 0 800.55 856.85' }} + enableBackground="new 0 0 800.5 856.85" > diff --git a/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Favicon.tsx index 9a9e27c3f0048..e1ef1270a9b64 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Favicon.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Favicon.tsx @@ -11,8 +11,7 @@ const Crowdin: FC> = props => ( y="0px" viewBox="65.2 173.5 180 180" className={classNames('text-[#0080FF] dark:text-white', props.className)} - // @ts-expect-error style is not a valid prop in SVGProps - style={{ enableBackground: 'new 65.2 173.5 180 180' }} + enableBackground="new 65.2 173.5 180 180" xmlSpace="preserve" > diff --git a/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Logo.tsx index 76c6770fa090f..88c40901903aa 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Logo.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Logo.tsx @@ -11,8 +11,7 @@ const Crowdin: FC> = props => ( y="0px" viewBox="0 0 603 103" className={classNames('text-[#0080FF] dark:text-white', props.className)} - // @ts-expect-error style is not a valid prop in SVGProps - style={{ enableBackground: 'new 0 0 603 103' }} + enableBackground="new 0 0 603 103" xmlSpace="preserve" > diff --git a/packages/ui-components/src/Icons/PartnerLogos/Microsoft/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/Microsoft/Favicon.tsx index 88fbb9d363872..fcf0db2ff3cee 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/Microsoft/Favicon.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/Microsoft/Favicon.tsx @@ -7,7 +7,7 @@ const Microsoft: FC> = props => ( xmlns="http://www.w3.org/2000/svg" {...props} > - + > = props => ( xmlns="http://www.w3.org/2000/svg" {...props} > - + > = props => ( fill="currentColor" /> @@ -33,8 +33,8 @@ const Scaleway: FC> = props => ( fill="currentColor" /> @@ -47,14 +47,14 @@ const Scaleway: FC> = props => ( fill="currentColor" /> From 625ed9c21703627ebd1344d41077e65c502e65d1 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sat, 26 Jul 2025 16:10:18 +0000 Subject: [PATCH 16/54] feat: update supporters and partners sections --- .../components/Common/Supporters/index.tsx | 5 ++-- apps/site/components/withSupporters.tsx | 2 +- apps/site/layouts/Post.tsx | 26 ++++++++++++------- apps/site/pages/en/about/partners.mdx | 11 ++++---- apps/site/pages/en/download/current.mdx | 6 +++-- apps/site/pages/en/download/index.mdx | 8 +++--- 6 files changed, 35 insertions(+), 23 deletions(-) diff --git a/apps/site/components/Common/Supporters/index.tsx b/apps/site/components/Common/Supporters/index.tsx index fc2e61bc47efa..9afb941a5d5c2 100644 --- a/apps/site/components/Common/Supporters/index.tsx +++ b/apps/site/components/Common/Supporters/index.tsx @@ -10,13 +10,14 @@ type SupportersProps = { supporters: Promise>; }; +// TODO: Sort supporters by all time contribution amount and link to their Open Collective page const SupportersList: FC = ({ supporters }) => { const supportersList = use(supporters); return (
- {supportersList.map(({ name, image, url }, i) => ( - + {supportersList.map(({ name, image }, i) => ( + ))}
); diff --git a/apps/site/components/withSupporters.tsx b/apps/site/components/withSupporters.tsx index a144f366e20bc..63f1a4792c18b 100644 --- a/apps/site/components/withSupporters.tsx +++ b/apps/site/components/withSupporters.tsx @@ -9,7 +9,7 @@ const WithSupporters: FC = () => { const supporters = fetchOpenCollectiveData() as Promise>; return ( -
+
); diff --git a/apps/site/layouts/Post.tsx b/apps/site/layouts/Post.tsx index 7e588fbdbb25d..0c3eea2f72edd 100644 --- a/apps/site/layouts/Post.tsx +++ b/apps/site/layouts/Post.tsx @@ -39,18 +39,24 @@ const PostLayout: FC = ({ children }) => { {children} + + {type === 'vulnerability' && ( -
-

Thanks by Our Partners

-

- We are able to offer security releases proudly due to the - support of these partners - and more. -

- -
+
+
+
+

+ These security releases are possible by: +

+

+ We are able to offer security releases proudly due to the + support of these partners + and more. +

+ +
+
)} -
diff --git a/apps/site/pages/en/about/partners.mdx b/apps/site/pages/en/about/partners.mdx index 9e2a93c54e0e9..fb17b6568b9d0 100644 --- a/apps/site/pages/en/about/partners.mdx +++ b/apps/site/pages/en/about/partners.mdx @@ -65,12 +65,13 @@ End-Of-Life versions, please visit [End-Of-Life Node.js Releases](/eol) -
- ## Become a Partner -If you are interested in becoming a partner, please reach out to us - - +Become a partner of the Node.js project and help us to continue to develop and maintain +this project. Your support is crucial to ensure that Node.js remains a reliable and secure platform +for developers and organizations around the world. If you are interested in becoming a partner, +please reach out to us through the OpenJS Foundation. +
+
diff --git a/apps/site/pages/en/download/current.mdx b/apps/site/pages/en/download/current.mdx index 2fbab9656dd11..f03bffb9ef6cd 100644 --- a/apps/site/pages/en/download/current.mdx +++ b/apps/site/pages/en/download/current.mdx @@ -35,8 +35,10 @@ or the unof -
-

Thanks by Our Partners

+--- + +
+

Proudly supported by the partners below:

We are able to serve Node.js's downloads and maintain our infrastructure diff --git a/apps/site/pages/en/download/index.mdx b/apps/site/pages/en/download/index.mdx index 2fbab9656dd11..e7fa07af57cb6 100644 --- a/apps/site/pages/en/download/index.mdx +++ b/apps/site/pages/en/download/index.mdx @@ -19,7 +19,7 @@ Or get a prebuilt Node.js® for running a -
+
Read the changelog or blog post for this version. @@ -35,8 +35,10 @@ or the unof
-
-

Thanks by Our Partners

+--- + +
+

Proudly supported by the partners below:

We are able to serve Node.js's downloads and maintain our infrastructure From cdaa6d6af9c2e7b99e72ca18a900a7e38fa16569 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sat, 26 Jul 2025 16:47:13 +0000 Subject: [PATCH 17/54] feat: enhance partner list functionality with sorting options --- .../Partners/PartnersIconList/index.tsx | 8 +++- .../Partners/PartnersLogoList/index.tsx | 11 ++++- apps/site/components/Common/Partners/utils.ts | 47 ++++++++++++++++--- apps/site/pages/en/about/partners.mdx | 10 ++-- 4 files changed, 62 insertions(+), 14 deletions(-) diff --git a/apps/site/components/Common/Partners/PartnersIconList/index.tsx b/apps/site/components/Common/Partners/PartnersIconList/index.tsx index 76d38b1c6da27..3091f2bb32d9c 100644 --- a/apps/site/components/Common/Partners/PartnersIconList/index.tsx +++ b/apps/site/components/Common/Partners/PartnersIconList/index.tsx @@ -37,7 +37,13 @@ const PartnersIconList: FC = ({ const renderSponsorsAnimation = setTimeout(() => { initialRenderer.current = false; - setSeedList(randomPartnerList(ICON_PARTNERS, maxLength, 5, categories)); + setSeedList( + randomPartnerList(ICON_PARTNERS, { + pick: maxLength, + dateSeed: 5, + category: categories, + }) + ); }, 0); return () => clearTimeout(renderSponsorsAnimation); diff --git a/apps/site/components/Common/Partners/PartnersLogoList/index.tsx b/apps/site/components/Common/Partners/PartnersLogoList/index.tsx index 07f0b13e9c83c..8ea1d0f975b03 100644 --- a/apps/site/components/Common/Partners/PartnersLogoList/index.tsx +++ b/apps/site/components/Common/Partners/PartnersLogoList/index.tsx @@ -12,10 +12,12 @@ import { randomPartnerList } from '../utils'; type PartnersLogoListProps = { maxLength?: number; categories?: PartnerCategory; + sort?: 'name' | 'weight'; }; const PartnersLogoList: FC = ({ maxLength = 3, + sort = 'weight', categories, }) => { const initialRenderer = useRef(true); @@ -42,7 +44,14 @@ const PartnersLogoList: FC = ({ const renderSponsorsAnimation = setTimeout(() => { initialRenderer.current = false; - setSeedList(randomPartnerList(LOGO_PARTNERS, maxLength, 5, categories)); + setSeedList( + randomPartnerList(LOGO_PARTNERS, { + pick: maxLength, + dateSeed: 5, + category: categories, + sort: sort, + }) + ); }, 0); return () => clearTimeout(renderSponsorsAnimation); diff --git a/apps/site/components/Common/Partners/utils.ts b/apps/site/components/Common/Partners/utils.ts index a0649ed7d2bdd..ab070e1595d9c 100644 --- a/apps/site/components/Common/Partners/utils.ts +++ b/apps/site/components/Common/Partners/utils.ts @@ -1,13 +1,47 @@ import type { PartnerCategory, Partners } from '#site/types/partners.js'; -// TODO: Implement no random list -// TODO: Implement no importance of partner function randomPartnerList( partners: Array, - pick = 4, - dateSeed = 5, - category?: PartnerCategory + config: { + /** + * Number of partners to pick from the list. + * If null, all partners will be returned. + */ + pick?: number | null; + /** + * Date seed to use for the randomization. + * This is used to ensure that the same partners are returned for the same date. + */ + dateSeed?: number; + /** + * Category of partners to filter by. + * If not provided, all partners will be returned. + */ + category?: PartnerCategory; + /** + * Whether to randomize the partners or not. + */ + sort?: 'name' | 'weight' | null; + } ) { + const { pick = 4, dateSeed = 5, category, sort = 'weight' } = config; + + const filteredPartners = [...partners].filter(partner => { + return !category || partner.categories.includes(category); + }); + + if (sort === null) { + return pick !== null ? filteredPartners.slice(0, pick) : filteredPartners; + } + + if (sort === 'name') { + const shuffled = [...filteredPartners].sort((a, b) => + a.name.localeCompare(b.name) + ); + + return pick !== null ? shuffled.slice(0, pick) : shuffled; + } + const now = new Date(); const minutes = Math.floor(now.getUTCMinutes() / dateSeed) * dateSeed; @@ -27,8 +61,7 @@ function randomPartnerList( const seed = fixedTime.getTime(); const rng = mulberry32(seed); - const weightedPartners = partners.flatMap(partner => { - if (category && !partner.categories.includes(category)) return []; + const weightedPartners = filteredPartners.flatMap(partner => { const weight = partner.weight; return Array(weight).fill(partner); }); diff --git a/apps/site/pages/en/about/partners.mdx b/apps/site/pages/en/about/partners.mdx index fb17b6568b9d0..c5d907bcff878 100644 --- a/apps/site/pages/en/about/partners.mdx +++ b/apps/site/pages/en/about/partners.mdx @@ -18,7 +18,7 @@ The infrastructure partners provide important support for the Node.js project, providing hardware and machines for our continuous integration and testing processes, without we can't test and release new versions of Node.js. - + ## Security @@ -26,7 +26,7 @@ The security partners help us to provide new security releases in a timely manne properly good practices for vulnerability disclosure and remediation. Their contributions are crucial to ensure that the Node.js ecosystem remains secure and resilient against vulnerabilities. - + ## Releases @@ -34,7 +34,7 @@ The release partners help us to provide new releases, ensuring that new features are delivered to the Node.js ecosystem in a timely manner. Their contributions are essential to the ongoing development and evolution of Node.js. - + ## Services @@ -42,7 +42,7 @@ The service partners help us to provide a range of services that support the Nod Their contributions are vital to ensuring that nodejs maintainers have access to the tools and resources they need to build and maintain this project. - + ## Supporters @@ -63,7 +63,7 @@ End-Of-Life versions, please visit [End-Of-Life Node.js Releases](/eol) > Using EOL releases through NES should be viewed as a temporary solution, the goal should always > be to upgrade to actively supported versions. - + ## Become a Partner From d73736489ceb6fbbcd77862e27a5f492adc42f6d Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Wed, 30 Jul 2025 15:34:05 +0000 Subject: [PATCH 18/54] fix typos and small nits --- .../Common/Partners/PartnerIcon/index.tsx | 38 +++++++++---------- .../Partners/PartnerLogo/index.module.css | 4 +- .../Common/Partners/PartnerLogo/index.tsx | 36 +++++++++--------- .../Partners/PartnersIconList/index.tsx | 3 +- .../Partners/PartnersLogoList/index.tsx | 3 +- 5 files changed, 41 insertions(+), 43 deletions(-) diff --git a/apps/site/components/Common/Partners/PartnerIcon/index.tsx b/apps/site/components/Common/Partners/PartnerIcon/index.tsx index 9709435623f57..aa0784384fb86 100644 --- a/apps/site/components/Common/Partners/PartnerIcon/index.tsx +++ b/apps/site/components/Common/Partners/PartnerIcon/index.tsx @@ -3,30 +3,28 @@ import Tooltip from '@node-core/ui-components/Common/Tooltip'; import type { ComponentProps, FC } from 'react'; import { cloneElement } from 'react'; +import Button from '#site/components/Common/Button'; import type { Partners } from '#site/types'; import style from './index.module.css'; -import Button from '../../Button'; -type ParnetsIconProps = Partners & ComponentProps; +type PartnersIconProps = Partners & ComponentProps; -const PartnersIcon: FC = ({ name, href, logo, loading }) => { - return ( - - {name}}> - - - - ); -}; +const PartnersIcon: FC = ({ name, href, logo, loading }) => ( + + {name}}> + + + +); export default PartnersIcon; diff --git a/apps/site/components/Common/Partners/PartnerLogo/index.module.css b/apps/site/components/Common/Partners/PartnerLogo/index.module.css index 7db66015ed48a..8f7b772426abe 100644 --- a/apps/site/components/Common/Partners/PartnerLogo/index.module.css +++ b/apps/site/components/Common/Partners/PartnerLogo/index.module.css @@ -2,8 +2,8 @@ .partnerIcon { @apply flex - h-[114px] - max-h-[114px] + h-28 + max-h-28 w-auto min-w-12 items-center diff --git a/apps/site/components/Common/Partners/PartnerLogo/index.tsx b/apps/site/components/Common/Partners/PartnerLogo/index.tsx index 4639912991326..1f9d9ee13d18f 100644 --- a/apps/site/components/Common/Partners/PartnerLogo/index.tsx +++ b/apps/site/components/Common/Partners/PartnerLogo/index.tsx @@ -2,28 +2,26 @@ import Skeleton from '@node-core/ui-components/Common/Skeleton'; import type { ComponentProps, FC } from 'react'; import { cloneElement } from 'react'; +import Button from '#site/components/Common/Button'; import type { Partners } from '#site/types'; import style from './index.module.css'; -import Button from '../../Button'; -type ParnetsIconProps = Partners & ComponentProps; +type PartnersLogoProps = Partners & ComponentProps; -const PartnersIcon: FC = ({ href, logo, loading }) => { - return ( - - - - ); -}; +const PartnersLogo: FC = ({ href, logo, loading }) => ( + + + +); -export default PartnersIcon; +export default PartnersLogo; diff --git a/apps/site/components/Common/Partners/PartnersIconList/index.tsx b/apps/site/components/Common/Partners/PartnersIconList/index.tsx index 3091f2bb32d9c..2473526573f81 100644 --- a/apps/site/components/Common/Partners/PartnersIconList/index.tsx +++ b/apps/site/components/Common/Partners/PartnersIconList/index.tsx @@ -1,6 +1,7 @@ 'use client'; -import { useEffect, useRef, useState, type FC } from 'react'; +import { useEffect, useRef, useState } from 'react'; +import type { FC } from 'react'; import { ICON_PARTNERS } from '#site/next.partners.constants'; import type { PartnerCategory, Partners } from '#site/types'; diff --git a/apps/site/components/Common/Partners/PartnersLogoList/index.tsx b/apps/site/components/Common/Partners/PartnersLogoList/index.tsx index 8ea1d0f975b03..379b4d26fec93 100644 --- a/apps/site/components/Common/Partners/PartnersLogoList/index.tsx +++ b/apps/site/components/Common/Partners/PartnersLogoList/index.tsx @@ -1,6 +1,7 @@ 'use client'; -import { useEffect, useRef, useState, type FC } from 'react'; +import { useEffect, useRef, useState } from 'react'; +import type { FC } from 'react'; import { LOGO_PARTNERS } from '#site/next.partners.constants'; import type { PartnerCategory, Partners } from '#site/types'; From 4da9fadc4e5af594cf41984191eefefe02f29d28 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Wed, 30 Jul 2025 15:51:52 +0000 Subject: [PATCH 19/54] refactor: update partners and supporters sections by removing unused categories and cleaning up content --- apps/site/layouts/Post.tsx | 8 +-- apps/site/pages/en/about/partners.mdx | 26 +-------- apps/site/types/partners.ts | 7 +-- apps/site/util/partners/constants.json | 79 +------------------------- 4 files changed, 7 insertions(+), 113 deletions(-) diff --git a/apps/site/layouts/Post.tsx b/apps/site/layouts/Post.tsx index 0c3eea2f72edd..7f6bea5bfcafe 100644 --- a/apps/site/layouts/Post.tsx +++ b/apps/site/layouts/Post.tsx @@ -1,7 +1,7 @@ import Preview from '@node-core/ui-components/Common/Preview'; import type { FC, PropsWithChildren } from 'react'; -import Link from '#site/components/Link'; +// import Link from '#site/components/Link'; import WithAvatarGroup from '#site/components/withAvatarGroup'; import WithBlogCrossLinks from '#site/components/withBlogCrossLinks'; import WithFooter from '#site/components/withFooter'; @@ -12,7 +12,7 @@ import { mapAuthorToCardAuthors } from '#site/util/author'; import { mapBlogCategoryToPreviewType } from '#site/util/blog'; import styles from './layouts.module.css'; -import PartnersLogoList from '../components/Common/Partners/PartnersLogoList'; +// import PartnersLogoList from '../components/Common/Partners/PartnersLogoList'; const PostLayout: FC = ({ children }) => { const { frontmatter } = useClientContext(); @@ -41,7 +41,7 @@ const PostLayout: FC = ({ children }) => { {children} - {type === 'vulnerability' && ( + {/* {type === 'vulnerability' && (

@@ -56,7 +56,7 @@ const PostLayout: FC = ({ children }) => {
- )} + )} */}
diff --git a/apps/site/pages/en/about/partners.mdx b/apps/site/pages/en/about/partners.mdx index c5d907bcff878..ddc498fe5832c 100644 --- a/apps/site/pages/en/about/partners.mdx +++ b/apps/site/pages/en/about/partners.mdx @@ -3,7 +3,7 @@ title: Partners & Supporters layout: about --- -# Partners +# Partners & Supporters The Node.js community is enriched by a vibrant network of partners who contribute in diverse ways. Through these collaborations, we maintain our resilient infrastructure, @@ -20,30 +20,6 @@ without we can't test and release new versions of Node.js. -## Security - -The security partners help us to provide new security releases in a timely manner, ensuring -properly good practices for vulnerability disclosure and remediation. Their contributions are -crucial to ensure that the Node.js ecosystem remains secure and resilient against vulnerabilities. - - - -## Releases - -The release partners help us to provide new releases, ensuring that new features and improvements -are delivered to the Node.js ecosystem in a timely manner. Their contributions are essential -to the ongoing development and evolution of Node.js. - - - -## Services - -The service partners help us to provide a range of services that support the Node.js project. -Their contributions are vital to ensuring that nodejs maintainers have access to the tools and -resources they need to build and maintain this project. - - - ## Supporters Supporters are individuals and organizations that provide financial support through diff --git a/apps/site/types/partners.ts b/apps/site/types/partners.ts index 67ae2e70b3da9..0f9c1a6dd7d08 100644 --- a/apps/site/types/partners.ts +++ b/apps/site/types/partners.ts @@ -16,12 +16,7 @@ export interface Partners { weight: number; } -export type PartnerCategory = - | 'infrastructure' - | 'security' - | 'esp' - | 'release' - | 'service'; +export type PartnerCategory = 'infrastructure' | 'esp'; export interface Supporters { name: string; diff --git a/apps/site/util/partners/constants.json b/apps/site/util/partners/constants.json index 0f64d21e3e672..fcb3a733d7cac 100644 --- a/apps/site/util/partners/constants.json +++ b/apps/site/util/partners/constants.json @@ -1,11 +1,4 @@ [ - { - "id": "RACKSPACE", - "name": "Rackspace", - "href": "https://www.rackspace.com", - "weight": 3, - "categories": ["infrastructure"] - }, { "id": "CLOUDFLARE", "name": "Cloudflare", @@ -20,20 +13,6 @@ "weight": 2, "categories": ["infrastructure"] }, - { - "id": "SENTRY", - "name": "Sentry", - "href": "https://sentry.io", - "weight": 1, - "categories": ["service"] - }, - { - "id": "CROWDIN", - "name": "Crowdin", - "href": "https://crowdin.com", - "weight": 1, - "categories": ["service"] - }, { "id": "HERODEVS", "name": "HeroDevs", @@ -41,20 +20,6 @@ "weight": 3, "categories": ["security", "esp", "release"] }, - { - "id": "NODESOURCE", - "name": "NodeSource", - "href": "https://nodesource.com", - "weight": 2, - "categories": ["security", "release"] - }, - { - "id": "DATADOG", - "name": "Datadog", - "href": "https://www.datadoghq.com", - "weight": 2, - "categories": ["security"] - }, { "id": "DIGITALOCEAN", "name": "DigitalOcean", @@ -64,51 +29,9 @@ }, { "id": "MICROSOFT", - "name": "Microsoft", + "name": "Microsoft Azure", "href": "https://microsoft.com", "categories": ["infrastructure"], "weight": 2 - }, - { - "id": "IBM", - "name": "IBM", - "href": "https://www.ibm.com", - "categories": ["infrastructure", "release"], - "weight": 3 - }, - { - "id": "SCALEWAY", - "name": "Scaleway", - "href": "https://www.scaleway.com", - "categories": ["infrastructure"], - "weight": 2 - }, - { - "id": "ARM", - "name": "ARM", - "href": "https://www.arm.com", - "categories": ["infrastructure"], - "weight": 2 - }, - { - "id": "EQUINIXMETAL", - "name": "Equinix Metal", - "href": "https://www.equinix.com", - "categories": ["infrastructure"], - "weight": 2 - }, - { - "id": "OPENSSF", - "name": "OpenSSF", - "href": "https://openssf.org/", - "weight": 2, - "categories": ["security"] - }, - { - "id": "VLT", - "name": "Vlt", - "href": "https://www.vlt.sh", - "weight": 2, - "categories": ["release"] } ] From 26c9f8c0e5b082358f91531167ac4044638c83b0 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Wed, 30 Jul 2025 16:32:11 +0000 Subject: [PATCH 20/54] feat: add comprehensive partners documentation outlining addition, removal, and display processes --- docs/partners.md | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 docs/partners.md diff --git a/docs/partners.md b/docs/partners.md new file mode 100644 index 0000000000000..824914f2c1f4a --- /dev/null +++ b/docs/partners.md @@ -0,0 +1,66 @@ +# Partners + +This document describes how partners and supporters of the Node.js project are referenced and managed. + +## Adding or Removing Partners + +All partners must be approved by the Node.js Marketing Team and the Node.js Technical Steering Committee (TSC). Therefore, partners cannot be added or removed without their approval. + +To add or remove a partner: + +1. Modify the `apps/site/util/partners/constants.json` file. This file contains an array of partner objects, each with the following fields: + - `id`: A unique identifier for the partner (used for logo import). + - `name`: The display name of the partner. + - `href`: A URL linking to the partner’s website. + - `categories`: An array of categories the partner belongs to. These are used to filter partners on the Partners and Downloads pages. Valid categories include: + - `infrastructure`: Partners providing infrastructure for the Node.js project. + - `esp`: Partners offering support for EOL Node.js versions through the Ecosystem Sustainability Program (ESP). + - `weight`: A number representing the partner's visibility weight. This is used in the randomization algorithm — higher values increase the partner's likelihood of being shown. + +2. Add the partner's logo to the `packages/ui-components/icons/PartnersLogos/` directory. + The filename must match the partner's `id`, in lowercase. + +3. Register the logo in `packages/ui-components/icons/PartnersLogos/index.ts`. + For example, if the partner’s `id` is `MICROSOFT`, the import must be written as: + + ```ts + import * as MICROSOFT from './microsoft'; + ``` + +## Home Page + +On the homepage, all partners are displayed regardless of category. The `weight` field is used by the randomization algorithm to determine how likely a partner is to appear e.g., a partner with a `weight` of 3 will be three times more likely to be shown than one with a `weight` of 1. + +## Partners Page + +The Partners page organizes partners by category. Each category has a description that must be approved by the Node.js Marketing Team and the TSC. +Each partner is displayed with: + +- Their logo +- Their name +- A link to their website with UTM parameters for tracking + +Partners are sorted alphabetically within each category. + +## Downloads Section + +The Downloads section only features partners categorized under `infrastructure`. These partners provide essential infrastructure for testing, releasing, and maintaining Node.js website, etc. +The same randomization algorithm used on the homepage is applied here as well. + +## Supporters + +> [!NOTE] +> Donations made through GitHub Sponsors are not displayed yet; they will be added soon. + +Supporters are individuals and organizations that provide financial support to the Node.js project through OpenCollective and GitHub Sponsors. They are displayed on the Partner page, but not on the homepage or Downloads section. + +## Partner Randomization Algorithm + +The randomization algorithm determines the order in which partners are displayed on both the homepage and the Downloads section. It takes into account: + +- The `weight` of each partner (higher weight = higher probability of being shown). +- A time-based seed: the order is refreshed every 5 minutes, not on every request. + This ensures that the display remains consistent for a short period, rather than changing constantly. E.g., if a user visits the homepage multiple times within 5 minutes, they will see the same order of partners. + +> [!NOTE] +> Partner randomization and rendering is performed on the client side, not during server-side rendering (SSR). From 844cd09991302ef0d547cd49ecca7e75b4572141 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Wed, 30 Jul 2025 17:40:34 +0000 Subject: [PATCH 21/54] style: center-align partner support heading and adjust text balance --- apps/site/pages/en/download/index.mdx | 2 +- apps/site/pages/en/index.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/site/pages/en/download/index.mdx b/apps/site/pages/en/download/index.mdx index e7fa07af57cb6..87044079c9284 100644 --- a/apps/site/pages/en/download/index.mdx +++ b/apps/site/pages/en/download/index.mdx @@ -38,7 +38,7 @@ or the unof ---
-

Proudly supported by the partners below:

+

Proudly supported by the partners below:

We are able to serve Node.js's downloads and maintain our infrastructure diff --git a/apps/site/pages/en/index.mdx b/apps/site/pages/en/index.mdx index 9667d9c81959f..402c4fe8cefc0 100644 --- a/apps/site/pages/en/index.mdx +++ b/apps/site/pages/en/index.mdx @@ -30,7 +30,7 @@ layout: home
- Node.js is proudly supported by the partners above and more. + Node.js is proudly supported by the partners above and more.
From 33016f40dac715e64aaba20efd602e5c0e95ca66 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Tue, 2 Sep 2025 01:31:30 +0000 Subject: [PATCH 22/54] fixup lint error --- .../components/Common/Partners/PartnersLogoList/index.tsx | 2 +- apps/site/types/partners.ts | 8 ++++---- apps/site/util/partners/index.tsx | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/site/components/Common/Partners/PartnersLogoList/index.tsx b/apps/site/components/Common/Partners/PartnersLogoList/index.tsx index 379b4d26fec93..76dbc8dd5c8d3 100644 --- a/apps/site/components/Common/Partners/PartnersLogoList/index.tsx +++ b/apps/site/components/Common/Partners/PartnersLogoList/index.tsx @@ -50,7 +50,7 @@ const PartnersLogoList: FC = ({ pick: maxLength, dateSeed: 5, category: categories, - sort: sort, + sort, }) ); }, 0); diff --git a/apps/site/types/partners.ts b/apps/site/types/partners.ts index 0f9c1a6dd7d08..2500cb25949fe 100644 --- a/apps/site/types/partners.ts +++ b/apps/site/types/partners.ts @@ -1,6 +1,6 @@ import type { ReactElement, SVGProps } from 'react'; -export interface Partners { +export type Partners = { id: string; // The name of the partner name: string; @@ -14,13 +14,13 @@ export interface Partners { description?: string; // The weight of the partner, used for random selection weight: number; -} +}; export type PartnerCategory = 'infrastructure' | 'esp'; -export interface Supporters { +export type Supporters = { name: string; image: string; url: string; source: 'opencollective' | 'github'; -} +}; diff --git a/apps/site/util/partners/index.tsx b/apps/site/util/partners/index.tsx index 9562a9b7e9c6f..bdca94b0738b6 100644 --- a/apps/site/util/partners/index.tsx +++ b/apps/site/util/partners/index.tsx @@ -22,7 +22,7 @@ export const createPartnersList = ( ) => partnerLists.map(({ id, ...partner }) => { return { - id: id, + id, logo: createIcon(PartnersLogo, id, type), ...partner, }; From 32b876da8921114b42a001e63b41534266406e07 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Tue, 16 Sep 2025 15:04:13 +0000 Subject: [PATCH 23/54] apply suggestions --- apps/site/navigation.json | 8 ++++---- apps/site/util/partners/index.tsx | 14 ++++++-------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/apps/site/navigation.json b/apps/site/navigation.json index e5497ca9aa173..dcc6c49cb8b44 100644 --- a/apps/site/navigation.json +++ b/apps/site/navigation.json @@ -110,13 +110,13 @@ "link": "/about/governance", "label": "components.navigation.about.links.governance" }, - "branding": { - "link": "/about/branding", - "label": "components.navigation.about.links.branding" - }, "partners": { "link": "/about/partners", "label": "components.navigation.about.links.partners" + }, + "branding": { + "link": "/about/branding", + "label": "components.navigation.about.links.branding" } } }, diff --git a/apps/site/util/partners/index.tsx b/apps/site/util/partners/index.tsx index bdca94b0738b6..714e8a5d5a997 100644 --- a/apps/site/util/partners/index.tsx +++ b/apps/site/util/partners/index.tsx @@ -9,7 +9,7 @@ import type { Partners } from '#site/types'; const createIcon = ( IconModule: Record>, iconName: string, - type?: 'Logo' | 'Favicon' + type: 'Logo' | 'Favicon' = 'Favicon' ) => { const IconComponent = IconModule[iconName][type || 'Favicon']; return ; @@ -20,10 +20,8 @@ export const createPartnersList = ( partnerLists: Array>, type?: 'Logo' | 'Favicon' ) => - partnerLists.map(({ id, ...partner }) => { - return { - id, - logo: createIcon(PartnersLogo, id, type), - ...partner, - }; - }); + partnerLists.map(({ id, ...partner }) => ({ + id, + logo: createIcon(PartnersLogo, id, type), + ...partner, + })); From 31db2c57a994b9666f03af24fc48d100394466e2 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Tue, 16 Sep 2025 15:53:47 +0000 Subject: [PATCH 24/54] refactor: simplify partner list components by introducing usePartnersList hook --- .../Partners/PartnersIconList/index.tsx | 43 +++---------- .../Partners/PartnersLogoList/index.tsx | 48 +++----------- .../hooks/react-client/usePartnersList.ts | 62 +++++++++++++++++++ 3 files changed, 76 insertions(+), 77 deletions(-) create mode 100644 apps/site/hooks/react-client/usePartnersList.ts diff --git a/apps/site/components/Common/Partners/PartnersIconList/index.tsx b/apps/site/components/Common/Partners/PartnersIconList/index.tsx index 2473526573f81..c7091759ac692 100644 --- a/apps/site/components/Common/Partners/PartnersIconList/index.tsx +++ b/apps/site/components/Common/Partners/PartnersIconList/index.tsx @@ -1,14 +1,13 @@ 'use client'; -import { useEffect, useRef, useState } from 'react'; import type { FC } from 'react'; +import usePartnersList from '#site/hooks/react-client/usePartnersList'; import { ICON_PARTNERS } from '#site/next.partners.constants'; -import type { PartnerCategory, Partners } from '#site/types'; +import type { PartnerCategory } from '#site/types'; import PartnerIcon from '../PartnerIcon'; import style from './index.module.css'; -import { randomPartnerList } from '../utils'; type PartnersIconListProps = { maxLength?: number; @@ -19,39 +18,11 @@ const PartnersIconList: FC = ({ maxLength = 6, categories, }) => { - const initialRenderer = useRef(true); - - const [seedList, setSeedList] = useState>( - ICON_PARTNERS.slice(0, maxLength) - ); - - useEffect(() => { - // We intentionally render the initial default "mock" list of sponsors - // to have the Skeletons loading, and then we render the actual list - // after an enough amount of time has passed to give a proper sense of Animation - // We do this client-side effect, to ensure that a random-amount of sponsors is renderered - // on every page load. Since our page is natively static, we need to ensure that - // on the client-side we have a random amount of sponsors rendered. - // Although whilst we are deployed on Vercel or other environment that supports ISR - // (Incremental Static Generation) whose would invalidate the cache every 5 minutes - // We want to ensure that this feature is compatible on a full-static environment - const renderSponsorsAnimation = setTimeout(() => { - initialRenderer.current = false; - - setSeedList( - randomPartnerList(ICON_PARTNERS, { - pick: maxLength, - dateSeed: 5, - category: categories, - }) - ); - }, 0); - - return () => clearTimeout(renderSponsorsAnimation); - // We only want this to run once on initial render - // We don't really care if the props change as realistically they shouldn't ever - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + const { seedList, initialRenderer } = usePartnersList({ + logos: ICON_PARTNERS, + maxLength, + categories, + }); return (
diff --git a/apps/site/components/Common/Partners/PartnersLogoList/index.tsx b/apps/site/components/Common/Partners/PartnersLogoList/index.tsx index 76dbc8dd5c8d3..11452e6aada1b 100644 --- a/apps/site/components/Common/Partners/PartnersLogoList/index.tsx +++ b/apps/site/components/Common/Partners/PartnersLogoList/index.tsx @@ -1,14 +1,13 @@ 'use client'; -import { useEffect, useRef, useState } from 'react'; import type { FC } from 'react'; +import usePartnersList from '#site/hooks/react-client/usePartnersList'; import { LOGO_PARTNERS } from '#site/next.partners.constants'; -import type { PartnerCategory, Partners } from '#site/types'; +import type { PartnerCategory } from '#site/types'; import PartnerLogo from '../PartnerLogo'; import style from './index.module.css'; -import { randomPartnerList } from '../utils'; type PartnersLogoListProps = { maxLength?: number; @@ -21,46 +20,13 @@ const PartnersLogoList: FC = ({ sort = 'weight', categories, }) => { - const initialRenderer = useRef(true); - - const [seedList, setSeedList] = useState>(() => { - if (maxLength === null) { - return LOGO_PARTNERS.filter( - partner => !categories || partner.categories.includes(categories) - ); - } - return LOGO_PARTNERS.slice(0, maxLength); + const { seedList, initialRenderer } = usePartnersList({ + logos: LOGO_PARTNERS, + maxLength, + sort, + categories, }); - useEffect(() => { - // We intentionally render the initial default "mock" list of sponsors - // to have the Skeletons loading, and then we render the actual list - // after an enough amount of time has passed to give a proper sense of Animation - // We do this client-side effect, to ensure that a random-amount of sponsors is renderered - // on every page load. Since our page is natively static, we need to ensure that - // on the client-side we have a random amount of sponsors rendered. - // Although whilst we are deployed on Vercel or other environment that supports ISR - // (Incremental Static Generation) whose would invalidate the cache every 5 minutes - // We want to ensure that this feature is compatible on a full-static environment - const renderSponsorsAnimation = setTimeout(() => { - initialRenderer.current = false; - - setSeedList( - randomPartnerList(LOGO_PARTNERS, { - pick: maxLength, - dateSeed: 5, - category: categories, - sort, - }) - ); - }, 0); - - return () => clearTimeout(renderSponsorsAnimation); - // We only want this to run once on initial render - // We don't really care if the props change as realistically they shouldn't ever - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - return (
{seedList.map((partner, index) => ( diff --git a/apps/site/hooks/react-client/usePartnersList.ts b/apps/site/hooks/react-client/usePartnersList.ts new file mode 100644 index 0000000000000..d825f4b8f5b2c --- /dev/null +++ b/apps/site/hooks/react-client/usePartnersList.ts @@ -0,0 +1,62 @@ +'use client'; + +import { useEffect, useRef, useState } from 'react'; + +import { randomPartnerList } from '#site/components/Common/Partners/utils'; +import type { PartnerCategory, Partners } from '#site/types/partners'; + +const usePartnersList = ({ + logos, + maxLength, + sort, + categories, +}: { + logos: Array; + maxLength: number; + sort?: 'name' | 'weight'; + categories?: PartnerCategory; +}) => { + const initialRenderer = useRef(true); + + const [seedList, setSeedList] = useState>(() => { + if (maxLength === null) { + return logos.filter( + partner => !categories || partner.categories.includes(categories) + ); + } + return logos.slice(0, maxLength); + }); + + useEffect(() => { + // We intentionally render the initial default "mock" list of sponsors + // to have the Skeletons loading, and then we render the actual list + // after an enough amount of time has passed to give a proper sense of Animation + // We do this client-side effect, to ensure that a random-amount of sponsors is renderered + // on every page load. Since our page is natively static, we need to ensure that + // on the client-side we have a random amount of sponsors rendered. + // Although whilst we are deployed on Vercel or other environment that supports ISR + // (Incremental Static Generation) whose would invalidate the cache every 5 minutes + // We want to ensure that this feature is compatible on a full-static environment + const renderSponsorsAnimation = setTimeout(() => { + initialRenderer.current = false; + + setSeedList( + randomPartnerList(logos, { + pick: maxLength, + dateSeed: 1, + category: categories, + sort, + }) + ); + }, 0); + + return () => clearTimeout(renderSponsorsAnimation); + // We only want this to run once on initial render + // We don't really care if the props change as realistically they shouldn't ever + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return { seedList, initialRenderer }; +}; + +export default usePartnersList; From 0f3b3431e0f088f2683f121580a930cd4e1f6340 Mon Sep 17 00:00:00 2001 From: Caner Akdas Date: Mon, 29 Sep 2025 19:57:52 +0300 Subject: [PATCH 25/54] chore: empty spaces removed from svg files --- .../src/Icons/PartnerLogos/ARM/Favicon.tsx | 18 +-- .../src/Icons/PartnerLogos/ARM/Logo.tsx | 18 +-- .../Icons/PartnerLogos/Crowdin/Favicon.tsx | 6 - .../src/Icons/PartnerLogos/Crowdin/Logo.tsx | 13 -- .../Icons/PartnerLogos/DataDog/Favicon.tsx | 125 +++++++++--------- .../src/Icons/PartnerLogos/DataDog/Logo.tsx | 118 ++++++++--------- .../PartnerLogos/DigitalOcean/Favicon.tsx | 19 +-- .../Icons/PartnerLogos/DigitalOcean/Logo.tsx | 117 +++++----------- .../PartnerLogos/EquinixMetal/Favicon.tsx | 14 +- .../Icons/PartnerLogos/EquinixMetal/Logo.tsx | 32 ++--- .../Icons/PartnerLogos/HeroDevs/Favicon.tsx | 5 - .../src/Icons/PartnerLogos/HeroDevs/Logo.tsx | 11 +- .../src/Icons/PartnerLogos/IBM/Favicon.tsx | 54 ++++---- .../src/Icons/PartnerLogos/IBM/Logo.tsx | 56 ++++---- .../src/Icons/PartnerLogos/Sentry/Favicon.tsx | 2 +- .../src/Icons/PartnerLogos/Sentry/Logo.tsx | 2 +- .../src/Icons/PartnerLogos/Vercel/Favicon.tsx | 2 +- .../src/Icons/PartnerLogos/Vercel/Logo.tsx | 2 +- 18 files changed, 263 insertions(+), 351 deletions(-) diff --git a/packages/ui-components/src/Icons/PartnerLogos/ARM/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/ARM/Favicon.tsx index b2cee516e7c43..103a672d0066d 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/ARM/Favicon.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/ARM/Favicon.tsx @@ -20,15 +20,15 @@ const ARM: FC> = props => ( diff --git a/packages/ui-components/src/Icons/PartnerLogos/ARM/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/ARM/Logo.tsx index b2cee516e7c43..103a672d0066d 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/ARM/Logo.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/ARM/Logo.tsx @@ -20,15 +20,15 @@ const ARM: FC> = props => ( diff --git a/packages/ui-components/src/Icons/PartnerLogos/Crowdin/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/Crowdin/Favicon.tsx index c9eb2810e15a3..5c00ceb4b85c8 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/Crowdin/Favicon.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/Crowdin/Favicon.tsx @@ -13,32 +13,26 @@ const Crowdin: FC> = props => ( d="M56.6667 80H23.3333C9.16667 80 0 70.8333 0 56.6667V23.0781C0 9.16667 9.16667 0 23.0781 0H56.6667C70.8333 0 80 9.16667 80 23.3333V56.6667C80 70.8333 70.8333 80 56.6667 80Z" fill="#263238" /> - - - - - - > = props => ( d="M46.5517 20.0596C46.5517 22.8097 47.3937 25.0143 49.0759 26.6769C50.7598 28.3377 53.0349 29.169 55.9047 29.169C58.7744 29.169 60.7057 28.4667 62.1406 27.0638C63.5754 25.6504 64.2929 24.0105 64.2929 22.1475V21.9784H60.1409V22.13C60.1409 22.8812 59.8129 23.5277 59.1586 24.0662C58.5025 24.6047 57.408 24.8749 55.8713 24.8749C54.1435 24.8749 52.8771 24.4531 52.0754 23.6114C51.2738 22.7696 50.8721 21.6473 50.8721 20.2444V19.3347C50.8721 17.9317 51.2791 16.8094 52.093 15.9677C52.9069 15.1259 54.1663 14.7042 55.8713 14.7042C57.3623 14.7042 58.4464 14.9621 59.1252 15.478C59.8146 15.9938 60.1584 16.6456 60.1584 17.4316V17.6006H64.3104L64.2929 17.381C64.2245 15.5058 63.4912 13.8799 62.0897 12.4978C60.6882 11.1054 58.6271 10.41 55.9047 10.41C53.0349 10.41 50.7581 11.2413 49.0759 12.9022C47.3919 14.5526 46.5517 16.7571 46.5517 19.5194V20.0579V20.0596Z" fill="currentColor" /> - - - - - - - - - - - - - > = props => ( className="hidden dark:inline" fill="currentColor" d="M303.36,238.61c31.36-21.37,71.76-12.97,65-6.53c-12.89,12.28,4.26,8.65,6.11,31.31 - c1.36,16.69-4.09,25.88-8.78,31.11c-9.79,1.28-21.69,3.67-36.02,8.33c-8.48,2.76-15.85,5.82-22.31,8.9 - c-1.7-1.11-3.55-2.47-5.74-4.36C279.5,288.19,280.24,254.37,303.36,238.61 M490.68,370.72c5.69-4.41,31.55-12.72,55.49-15.55 - c12.57-1.48,30.49-2.34,34.31-0.2c7.59,4.19,7.59,17.16,2.39,29.14c-7.57,17.4-18.27,36.63-30.39,38.21 - c-19.77,2.61-38.46-8.09-59.8-24.03C485.06,392.56,480.38,378.68,490.68,370.72 M526.75,201.27c29.19,13.58,25.37,39.42,26.18,54.6 - c0.22,4.36,0.15,7.3-0.22,9.32c-4.04-2.19-10.43-3.8-20.56-3.35c-2.96,0.12-5.84,0.47-8.63,0.91c-10.77-5.77-17.21-17.06-23.1-29.06 - c-0.54-1.11-0.96-2.1-1.36-3.06c-0.17-0.44-0.35-0.91-0.52-1.31c-0.07-0.22-0.12-0.39-0.2-0.59c-3.23-10.25-1.06-12.3,0.3-15.46 - c1.41-3.23,6.68-5.89-1.11-8.58c-0.67-0.25-1.5-0.39-2.44-0.57C500.25,197.72,515.7,196.17,526.75,201.27 M367.62,510.22 - c-31.45-20.19-63.99-49.15-78.22-65.18c-2.39-1.8-2-9.79-2-9.79c12.84,9.98,66.11,48.04,122.44,65.42 - c19.87,6.14,50.36,8.46,76.81-6.53c20.21-11.46,44.54-31.43,59.06-52.01l2.66,4.61c-0.1,3.06-6.78,17.97-10.18,23.96 - c6.14,3.53,10.72,4.49,17.55,6.36l46.64-7.27c16.74-27.04,28.74-70.65,15.95-112.16c-7.3-23.81-45.36-71.22-48.09-73.83 - c-9.56-9.19,1.6-44.69-17.35-83.42C532.86,159.41,480.67,116.69,458,98.1c6.68,4.88,47.82,21.47,67,44.62 - c1.8-2.39,2.54-14.82,4.19-17.97c-16.47-21.57-17.75-59.95-17.75-70.21c0-18.81-9.56-40.13-9.56-40.13s16.47,13.04,20.73,35.5 - c5.03,26.6,15.75,47.55,29.93,65.28c26.84,33.43,51.08,50.58,63.33,38.23C630.53,138.58,601,72.2,563.28,35.15 - C519.25-8.09,507.74-2.52,481.91,6.7c-20.61,7.35-31.75,65.87-85.47,64.71c-9.1-1.06-32.54-1.63-44.13-1.53 - c6.04-8.43,11.22-14.94,11.22-14.94s-18.02,7.25-33.38,16.44l-1.18-1.77c5.18-10.92,10.75-17.82,10.75-17.82s-14.4,8.65-27.54,19.01 - c2.39-13.02,11.44-21.27,11.44-21.27s-18.19,3.28-41.36,28.77c-26.33,7.2-32.66,11.93-53.64,21.22 - c-34.12-7.44-50.21-19.45-65.55-41.56c-11.68-16.89-32.47-19.45-53.71-10.72c-30.97,12.8-70.14,30.33-70.14,30.33 - s12.77-0.52,26.08,0.05c-18.22,6.9-35.72,16.39-35.72,16.39s8.53-0.3,19.06-0.12c-7.27,6.04-11.29,8.92-18.22,13.51 - c-16.66,12.1-30.17,26.08-30.17,26.08s11.31-5.15,21.47-8.04c-7.1,16.27-21.18,28.25-18.59,48.17 - c2.49,18.19,24.82,55.66,53.64,78.66c2.49,2,41.86,38.43,71.56,23.47c29.68-14.94,41.39-28.25,46.27-48.66 - c5.74-23.44,2.47-41.17-9.79-92.05c-4.04-16.79-14.57-51.37-19.65-67.91l1.13-0.81c9.71,20.49,34.56,74.5,44.57,110.78 - c15.63,56.57,10.75,85.27,3.6,95.79c-21.57,31.73-76.84,35.92-101.98,18.34c-3.85,60.91,9.76,87.73,14.37,101.24 - c-2.29,15.53,7.77,44.37,7.77,44.37s1.13-13.11,5.74-20.02c1.23,15.41,9,33.72,9,33.72s-0.47-11.31,3.06-21.08 - c4.98,8.43,8.63,10.43,13.34,16.76c4.71,16.47,14.15,28.5,14.15,28.5s-1.53-8.83-0.69-18.02c23.05,22.14,27.02,54.45,29.31,79.28 - c6.46,68.26-107.63,122.54-129.74,165.24c-16.76,25.29-26.8,65.3,1.58,88.89c68.6,56.97,42.25,72.65,76.59,97.69 - c47.11,34.34,106.05,18.96,126.11-8.97c27.93-38.92,20.76-75.63,10.38-109.97c-8.11-26.85-30.15-71.46-57.41-88.72 - c-27.86-17.65-54.95-20.95-77.9-18.59l2.12-2.44c33.01-6.56,67.52-2.96,92.49,13.14c28.35,18.22,54.28,49.47,67.84,97.37 - c15.38-2.19,17.55-3.18,31.63-5.18l-31.7-246.76L367.62,510.22z M385.94,819.52l-3.65-34.22l71.29-108.74l80.93,23.64l69.59-116.23 - L687.52,639l63.38-132.92l22.53,242.07L385.94,819.52z M774.27,456.51l-254.72,46.17c-6.31,8.13-21.91,22.41-29.41,26.13 - c-32.17,16.2-53.91,11.51-72.7,6.63c-12.08-3.06-19.08-4.78-29.11-9.29l-62.17,8.53l37.74,314.87l436.35-78.66L774.27,456.51z" + c1.36,16.69-4.09,25.88-8.78,31.11c-9.79,1.28-21.69,3.67-36.02,8.33c-8.48,2.76-15.85,5.82-22.31,8.9 + c-1.7-1.11-3.55-2.47-5.74-4.36C279.5,288.19,280.24,254.37,303.36,238.61 M490.68,370.72c5.69-4.41,31.55-12.72,55.49-15.55 + c12.57-1.48,30.49-2.34,34.31-0.2c7.59,4.19,7.59,17.16,2.39,29.14c-7.57,17.4-18.27,36.63-30.39,38.21 + c-19.77,2.61-38.46-8.09-59.8-24.03C485.06,392.56,480.38,378.68,490.68,370.72 M526.75,201.27c29.19,13.58,25.37,39.42,26.18,54.6 + c0.22,4.36,0.15,7.3-0.22,9.32c-4.04-2.19-10.43-3.8-20.56-3.35c-2.96,0.12-5.84,0.47-8.63,0.91c-10.77-5.77-17.21-17.06-23.1-29.06 + c-0.54-1.11-0.96-2.1-1.36-3.06c-0.17-0.44-0.35-0.91-0.52-1.31c-0.07-0.22-0.12-0.39-0.2-0.59c-3.23-10.25-1.06-12.3,0.3-15.46 + c1.41-3.23,6.68-5.89-1.11-8.58c-0.67-0.25-1.5-0.39-2.44-0.57C500.25,197.72,515.7,196.17,526.75,201.27 M367.62,510.22 + c-31.45-20.19-63.99-49.15-78.22-65.18c-2.39-1.8-2-9.79-2-9.79c12.84,9.98,66.11,48.04,122.44,65.42 + c19.87,6.14,50.36,8.46,76.81-6.53c20.21-11.46,44.54-31.43,59.06-52.01l2.66,4.61c-0.1,3.06-6.78,17.97-10.18,23.96 + c6.14,3.53,10.72,4.49,17.55,6.36l46.64-7.27c16.74-27.04,28.74-70.65,15.95-112.16c-7.3-23.81-45.36-71.22-48.09-73.83 + c-9.56-9.19,1.6-44.69-17.35-83.42C532.86,159.41,480.67,116.69,458,98.1c6.68,4.88,47.82,21.47,67,44.62 + c1.8-2.39,2.54-14.82,4.19-17.97c-16.47-21.57-17.75-59.95-17.75-70.21c0-18.81-9.56-40.13-9.56-40.13s16.47,13.04,20.73,35.5 + c5.03,26.6,15.75,47.55,29.93,65.28c26.84,33.43,51.08,50.58,63.33,38.23C630.53,138.58,601,72.2,563.28,35.15 + C519.25-8.09,507.74-2.52,481.91,6.7c-20.61,7.35-31.75,65.87-85.47,64.71c-9.1-1.06-32.54-1.63-44.13-1.53 + c6.04-8.43,11.22-14.94,11.22-14.94s-18.02,7.25-33.38,16.44l-1.18-1.77c5.18-10.92,10.75-17.82,10.75-17.82s-14.4,8.65-27.54,19.01 + c2.39-13.02,11.44-21.27,11.44-21.27s-18.19,3.28-41.36,28.77c-26.33,7.2-32.66,11.93-53.64,21.22 + c-34.12-7.44-50.21-19.45-65.55-41.56c-11.68-16.89-32.47-19.45-53.71-10.72c-30.97,12.8-70.14,30.33-70.14,30.33 + s12.77-0.52,26.08,0.05c-18.22,6.9-35.72,16.39-35.72,16.39s8.53-0.3,19.06-0.12c-7.27,6.04-11.29,8.92-18.22,13.51 + c-16.66,12.1-30.17,26.08-30.17,26.08s11.31-5.15,21.47-8.04c-7.1,16.27-21.18,28.25-18.59,48.17 + c2.49,18.19,24.82,55.66,53.64,78.66c2.49,2,41.86,38.43,71.56,23.47c29.68-14.94,41.39-28.25,46.27-48.66 + c5.74-23.44,2.47-41.17-9.79-92.05c-4.04-16.79-14.57-51.37-19.65-67.91l1.13-0.81c9.71,20.49,34.56,74.5,44.57,110.78 + c15.63,56.57,10.75,85.27,3.6,95.79c-21.57,31.73-76.84,35.92-101.98,18.34c-3.85,60.91,9.76,87.73,14.37,101.24 + c-2.29,15.53,7.77,44.37,7.77,44.37s1.13-13.11,5.74-20.02c1.23,15.41,9,33.72,9,33.72s-0.47-11.31,3.06-21.08 + c4.98,8.43,8.63,10.43,13.34,16.76c4.71,16.47,14.15,28.5,14.15,28.5s-1.53-8.83-0.69-18.02c23.05,22.14,27.02,54.45,29.31,79.28 + c6.46,68.26-107.63,122.54-129.74,165.24c-16.76,25.29-26.8,65.3,1.58,88.89c68.6,56.97,42.25,72.65,76.59,97.69 + c47.11,34.34,106.05,18.96,126.11-8.97c27.93-38.92,20.76-75.63,10.38-109.97c-8.11-26.85-30.15-71.46-57.41-88.72 + c-27.86-17.65-54.95-20.95-77.9-18.59l2.12-2.44c33.01-6.56,67.52-2.96,92.49,13.14c28.35,18.22,54.28,49.47,67.84,97.37 + c15.38-2.19,17.55-3.18,31.63-5.18l-31.7-246.76L367.62,510.22z M385.94,819.52l-3.65-34.22l71.29-108.74l80.93,23.64l69.59-116.23 + L687.52,639l63.38-132.92l22.53,242.07L385.94,819.52z M774.27,456.51l-254.72,46.17c-6.31,8.13-21.91,22.41-29.41,26.13 + c-32.17,16.2-53.91,11.51-72.7,6.63c-12.08-3.06-19.08-4.78-29.11-9.29l-62.17,8.53l37.74,314.87l436.35-78.66L774.27,456.51z" /> - ); diff --git a/packages/ui-components/src/Icons/PartnerLogos/DataDog/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/DataDog/Logo.tsx index 0740b0cb317c9..c2f5991198863 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/DataDog/Logo.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/DataDog/Logo.tsx @@ -17,27 +17,27 @@ const DataDog: FC> = props => ( className="hidden dark:inline" fill="currentColor" d="M167.2,98.4l-54.9,10c-1.4,1.8-4.7,4.8-6.3,5.6c-6.9,3.5-11.6,2.5-15.7,1.4c-2.6-0.7-4.1-1-6.3-2l-13.4,1.8 - l8.1,67.9l94.1-17L167.2,98.4z M83.4,176.7l-0.8-7.4L98,145.9l17.4,5.1l15-25.1l18,11.9l13.7-28.7l4.9,52.2L83.4,176.7z M79.5,110 - c-6.8-4.4-13.8-10.6-16.9-14.1c-0.5-0.4-0.4-2.1-0.4-2.1c2.8,2.2,14.3,10.4,26.4,14.1c4.3,1.3,10.9,1.8,16.6-1.4 - c4.4-2.5,9.6-6.8,12.7-11.2l0.6,1c0,0.7-1.5,3.9-2.2,5.2c1.3,0.8,2.3,1,3.8,1.4l10.1-1.6c3.6-5.8,6.2-15.2,3.4-24.2 - c-1.6-5.1-9.8-15.4-10.4-15.9c-2.1-2,0.3-9.6-3.7-18c-4.3-8.8-15.6-18-20.5-22.1c1.4,1,10.3,4.6,14.4,9.6c0.4-0.5,0.6-3.2,0.9-3.9 - c-3.6-4.6-3.8-12.9-3.8-15.1c0-4.1-2.1-8.7-2.1-8.7s3.6,2.8,4.5,7.7c1.1,5.7,3.4,10.3,6.5,14.1c5.8,7.2,11,10.9,13.7,8.2 - c3.2-3.2-3.2-17.5-11.3-25.5c-9.5-9.3-12-8.1-17.5-6.1c-4.4,1.5-6.8,14.2-18.4,13.9c-2-0.2-7-0.4-9.5-0.3c1.3-1.8,2.4-3.2,2.4-3.2 - s-3.9,1.6-7.2,3.6l-0.3-0.4c1.1-2.4,2.3-3.8,2.3-3.8s-3.1,1.9-5.9,4.1c0.5-2.8,2.5-4.6,2.5-4.6s-3.9,0.7-8.9,6.2 - c-5.7,1.5-7,2.6-11.6,4.6c-7.4-1.6-10.8-4.2-14.1-9c-2.5-3.6-7-4.2-11.6-2.3c-6.7,2.8-15.1,6.5-15.1,6.5s2.8-0.1,5.6,0 - c-3.9,1.5-7.7,3.5-7.7,3.5s1.8-0.1,4.1,0c-1.6,1.3-2.4,1.9-3.9,2.9c-3.6,2.6-6.5,5.6-6.5,5.6s2.4-1.1,4.6-1.7 - c-1.5,3.5-4.6,6.1-4,10.4c0.5,3.9,5.3,12,11.6,17c0.5,0.4,9,8.3,15.4,5.1c6.4-3.2,8.9-6.1,10-10.5c1.2-5.1,0.5-8.9-2.1-19.9 - c-0.9-3.6-3.1-11.1-4.2-14.6l0.2-0.2c2.1,4.4,7.4,16.1,9.6,23.9c3.4,12.2,2.3,18.4,0.8,20.7c-4.7,6.8-16.6,7.8-22,4 - c-0.8,13.1,2.1,18.9,3.1,21.8c-0.5,3.3,1.7,9.6,1.7,9.6s0.2-2.8,1.2-4.3c0.3,3.3,1.9,7.3,1.9,7.3s-0.1-2.4,0.7-4.5 - c1.1,1.8,1.9,2.2,2.9,3.6c1,3.6,3,6.2,3,6.2s-0.3-1.9-0.2-3.9c5,4.8,5.8,11.8,6.3,17.1c1.4,14.7-23.2,26.4-28,35.6 - c-3.6,5.4-5.8,14.1,0.3,19.2c14.8,12.3,9.1,15.7,16.5,21.1c10.2,7.4,22.9,4.1,27.2-1.9c6-8.4,4.5-16.3,2.2-23.7 - c-1.8-5.8-6.5-15.4-12.4-19.1c-6-3.8-11.9-4.5-16.8-4l0.5-0.5c7.1-1.4,14.6-0.6,20,2.8c6.1,3.9,11.7,10.7,14.6,21 - c3.3-0.5,3.8-0.7,6.8-1.1L65,111.6L79.5,110z M113.8,43.3c6.3,2.9,5.5,8.5,5.6,11.8c0.1,0.9,0,1.6-0.1,2c-0.9-0.5-2.2-0.8-4.4-0.7 - c-0.6,0-1.3,0.1-1.9,0.2c-2.3-1.2-3.7-3.7-5-6.3c-0.1-0.2-0.2-0.5-0.3-0.7c0-0.1-0.1-0.2-0.1-0.3c0,0,0-0.1,0-0.1 - c-0.7-2.2-0.2-2.7,0.1-3.3s1.4-1.3-0.2-1.8c-0.1,0-0.3-0.1-0.5-0.1C108.1,42.6,111.4,42.2,113.8,43.3z M106,79.9 - c1.2-0.9,6.8-2.7,12-3.4c2.7-0.3,6.6-0.5,7.4,0c1.6,0.9,1.6,3.7,0.5,6.3c-1.6,3.8-3.9,7.9-6.6,8.2c-4.3,0.6-8.3-1.7-12.9-5.2 - C104.8,84.6,103.8,81.6,106,79.9z M65.6,51.4c6.8-4.6,15.5-2.8,14-1.4c-2.8,2.7,0.9,1.9,1.3,6.8c0.3,3.6-0.9,5.6-1.9,6.7 - c-2.1,0.3-4.7,0.8-7.8,1.8c-1.8,0.6-3.4,1.2-4.8,1.9c-0.4-0.2-0.8-0.5-1.2-0.9C60.5,62.1,60.7,54.8,65.6,51.4z" + l8.1,67.9l94.1-17L167.2,98.4z M83.4,176.7l-0.8-7.4L98,145.9l17.4,5.1l15-25.1l18,11.9l13.7-28.7l4.9,52.2L83.4,176.7z M79.5,110 + c-6.8-4.4-13.8-10.6-16.9-14.1c-0.5-0.4-0.4-2.1-0.4-2.1c2.8,2.2,14.3,10.4,26.4,14.1c4.3,1.3,10.9,1.8,16.6-1.4 + c4.4-2.5,9.6-6.8,12.7-11.2l0.6,1c0,0.7-1.5,3.9-2.2,5.2c1.3,0.8,2.3,1,3.8,1.4l10.1-1.6c3.6-5.8,6.2-15.2,3.4-24.2 + c-1.6-5.1-9.8-15.4-10.4-15.9c-2.1-2,0.3-9.6-3.7-18c-4.3-8.8-15.6-18-20.5-22.1c1.4,1,10.3,4.6,14.4,9.6c0.4-0.5,0.6-3.2,0.9-3.9 + c-3.6-4.6-3.8-12.9-3.8-15.1c0-4.1-2.1-8.7-2.1-8.7s3.6,2.8,4.5,7.7c1.1,5.7,3.4,10.3,6.5,14.1c5.8,7.2,11,10.9,13.7,8.2 + c3.2-3.2-3.2-17.5-11.3-25.5c-9.5-9.3-12-8.1-17.5-6.1c-4.4,1.5-6.8,14.2-18.4,13.9c-2-0.2-7-0.4-9.5-0.3c1.3-1.8,2.4-3.2,2.4-3.2 + s-3.9,1.6-7.2,3.6l-0.3-0.4c1.1-2.4,2.3-3.8,2.3-3.8s-3.1,1.9-5.9,4.1c0.5-2.8,2.5-4.6,2.5-4.6s-3.9,0.7-8.9,6.2 + c-5.7,1.5-7,2.6-11.6,4.6c-7.4-1.6-10.8-4.2-14.1-9c-2.5-3.6-7-4.2-11.6-2.3c-6.7,2.8-15.1,6.5-15.1,6.5s2.8-0.1,5.6,0 + c-3.9,1.5-7.7,3.5-7.7,3.5s1.8-0.1,4.1,0c-1.6,1.3-2.4,1.9-3.9,2.9c-3.6,2.6-6.5,5.6-6.5,5.6s2.4-1.1,4.6-1.7 + c-1.5,3.5-4.6,6.1-4,10.4c0.5,3.9,5.3,12,11.6,17c0.5,0.4,9,8.3,15.4,5.1c6.4-3.2,8.9-6.1,10-10.5c1.2-5.1,0.5-8.9-2.1-19.9 + c-0.9-3.6-3.1-11.1-4.2-14.6l0.2-0.2c2.1,4.4,7.4,16.1,9.6,23.9c3.4,12.2,2.3,18.4,0.8,20.7c-4.7,6.8-16.6,7.8-22,4 + c-0.8,13.1,2.1,18.9,3.1,21.8c-0.5,3.3,1.7,9.6,1.7,9.6s0.2-2.8,1.2-4.3c0.3,3.3,1.9,7.3,1.9,7.3s-0.1-2.4,0.7-4.5 + c1.1,1.8,1.9,2.2,2.9,3.6c1,3.6,3,6.2,3,6.2s-0.3-1.9-0.2-3.9c5,4.8,5.8,11.8,6.3,17.1c1.4,14.7-23.2,26.4-28,35.6 + c-3.6,5.4-5.8,14.1,0.3,19.2c14.8,12.3,9.1,15.7,16.5,21.1c10.2,7.4,22.9,4.1,27.2-1.9c6-8.4,4.5-16.3,2.2-23.7 + c-1.8-5.8-6.5-15.4-12.4-19.1c-6-3.8-11.9-4.5-16.8-4l0.5-0.5c7.1-1.4,14.6-0.6,20,2.8c6.1,3.9,11.7,10.7,14.6,21 + c3.3-0.5,3.8-0.7,6.8-1.1L65,111.6L79.5,110z M113.8,43.3c6.3,2.9,5.5,8.5,5.6,11.8c0.1,0.9,0,1.6-0.1,2c-0.9-0.5-2.2-0.8-4.4-0.7 + c-0.6,0-1.3,0.1-1.9,0.2c-2.3-1.2-3.7-3.7-5-6.3c-0.1-0.2-0.2-0.5-0.3-0.7c0-0.1-0.1-0.2-0.1-0.3c0,0,0-0.1,0-0.1 + c-0.7-2.2-0.2-2.7,0.1-3.3s1.4-1.3-0.2-1.8c-0.1,0-0.3-0.1-0.5-0.1C108.1,42.6,111.4,42.2,113.8,43.3z M106,79.9 + c1.2-0.9,6.8-2.7,12-3.4c2.7-0.3,6.6-0.5,7.4,0c1.6,0.9,1.6,3.7,0.5,6.3c-1.6,3.8-3.9,7.9-6.6,8.2c-4.3,0.6-8.3-1.7-12.9-5.2 + C104.8,84.6,103.8,81.6,106,79.9z M65.6,51.4c6.8-4.6,15.5-2.8,14-1.4c-2.8,2.7,0.9,1.9,1.3,6.8c0.3,3.6-0.9,5.6-1.9,6.7 + c-2.1,0.3-4.7,0.8-7.8,1.8c-1.8,0.6-3.4,1.2-4.8,1.9c-0.4-0.2-0.8-0.5-1.2-0.9C60.5,62.1,60.7,54.8,65.6,51.4z" /> @@ -49,36 +49,36 @@ const DataDog: FC> = props => ( clipRule="evenodd" fillRule="evenodd" d="M158.87,144.16L142,133.04l-14.07,23.5l-16.36-4.78l-14.41,21.99l0.74,6.92l78.33-14.43l-4.55-48.94 - L158.87,144.16z M85.82,123.07l12.57-1.73c2.03,0.91,3.45,1.26,5.89,1.88c3.8,0.99,8.19,1.94,14.7-1.34 - c1.51-0.75,4.67-3.64,5.94-5.28l51.49-9.34l5.25,63.57l-88.21,15.9L85.82,123.07z M181.46,100.16l-5.08,0.97L166.62,0.25 - L0.25,19.54l20.5,166.33l19.47-2.83c-1.55-2.22-3.98-4.91-8.11-8.35c-5.74-4.76-3.71-12.86-0.32-17.97 - c4.47-8.63,27.54-19.61,26.23-33.41c-0.47-5.02-1.27-11.55-5.93-16.03c-0.17,1.86,0.14,3.65,0.14,3.65s-1.91-2.44-2.87-5.77 - c-0.95-1.28-1.69-1.68-2.7-3.39c-0.72,1.97-0.62,4.26-0.62,4.26s-1.56-3.7-1.82-6.82c-0.93,1.4-1.16,4.05-1.16,4.05 - s-2.03-5.83-1.57-8.97c-0.93-2.73-3.68-8.15-2.9-20.47c5.08,3.56,16.26,2.71,20.61-3.71c1.45-2.13,2.44-7.93-0.72-19.36 - c-2.03-7.33-7.05-18.25-9.01-22.4l-0.23,0.17c1.03,3.34,3.16,10.33,3.98,13.73c2.47,10.29,3.13,13.87,1.97,18.61 - c-0.99,4.12-3.35,6.82-9.35,9.84c-6,3.03-13.96-4.34-14.47-4.74c-5.83-4.64-10.34-12.22-10.84-15.9 - c-0.52-4.03,2.32-6.45,3.76-9.74c-2.05,0.59-4.34,1.63-4.34,1.63s2.73-2.83,6.1-5.27c1.4-0.92,2.21-1.51,3.68-2.73 - c-2.13-0.03-3.86,0.02-3.86,0.02s3.55-1.92,7.23-3.31c-2.69-0.12-5.27-0.02-5.27-0.02S35.75,27.1,42,24.5 - c4.3-1.76,8.5-1.24,10.86,2.17c3.1,4.47,6.35,6.9,13.25,8.41c4.24-1.88,5.52-2.84,10.84-4.29c4.68-5.15,8.36-5.82,8.36-5.82 - s-1.82,1.67-2.31,4.3c2.66-2.09,5.57-3.84,5.57-3.84s-1.13,1.39-2.18,3.6l0.24,0.36c3.1-1.86,6.74-3.32,6.74-3.32 - s-1.04,1.32-2.26,3.02c2.34-0.02,7.08,0.1,8.91,0.31c10.86,0.24,13.11-11.6,17.28-13.08c5.22-1.86,7.55-2.99,16.44,5.74 - c7.63,7.5,13.59,20.91,10.63,23.92c-2.48,2.49-7.38-0.97-12.8-7.74c-2.87-3.58-5.03-7.81-6.05-13.19 - c-0.86-4.54-4.19-7.17-4.19-7.17s1.93,4.31,1.93,8.11c0,2.08,0.26,9.84,3.59,14.19c-0.33,0.64-0.48,3.15-0.85,3.63 - c-3.87-4.68-12.19-8.03-13.54-9.02c4.59,3.76,15.14,12.4,19.19,20.68c3.83,7.83,1.57,15.01,3.51,16.87 - c0.55,0.53,8.24,10.11,9.72,14.93c2.58,8.39,0.15,17.21-3.22,22.68l-9.43,1.47c-1.38-0.38-2.31-0.58-3.55-1.29 - c0.68-1.21,2.04-4.22,2.05-4.84l-0.53-0.93c-2.94,4.16-7.85,8.2-11.94,10.52c-5.35,3.03-11.51,2.56-15.52,1.32 - c-11.39-3.51-22.16-11.21-24.75-13.23c0,0-0.08,1.61,0.41,1.98c2.87,3.24,9.45,9.1,15.81,13.18l-13.55,1.49l6.41,49.89 - c-2.84,0.41-3.28,0.61-6.39,1.05c-2.74-9.68-7.98-16.01-13.71-19.69c-5.05-3.25-12.02-3.98-18.7-2.66l-0.43,0.5 - c4.64-0.48,10.12,0.19,15.74,3.75c5.52,3.49,9.97,12.51,11.61,17.94c2.1,6.94,3.55,14.36-2.1,22.23 - c-4.02,5.59-15.74,8.68-25.22,2c2.53,4.07,5.95,7.4,10.55,8.02c6.84,0.93,13.33-0.26,17.79-4.84c3.81-3.92,5.84-12.12,5.3-20.75 - l6.03-0.87l2.18,15.49l99.88-12.03L181.46,100.16z M120.69,58.08c-0.28,0.64-0.72,1.05-0.06,3.12l0.04,0.12l0.1,0.27l0.27,0.62 - c1.19,2.42,2.49,4.71,4.66,5.88c0.56-0.09,1.15-0.16,1.75-0.19c2.04-0.09,3.33,0.23,4.15,0.68c0.07-0.41,0.09-1,0.04-1.88 - c-0.16-3.07,0.61-8.29-5.29-11.04c-2.23-1.03-5.35-0.72-6.39,0.58c0.19,0.02,0.36,0.06,0.49,0.11 - C122.04,56.89,120.98,57.43,120.69,58.08 M137.23,86.73c-0.77-0.43-4.39-0.26-6.93,0.04c-4.84,0.57-10.07,2.25-11.22,3.14 - c-2.08,1.61-1.14,4.42,0.4,5.57c4.32,3.22,8.1,5.39,12.09,4.86c2.45-0.32,4.61-4.2,6.14-7.73 - C138.77,90.19,138.77,87.58,137.23,86.73 M94.36,61.88c1.37-1.3-6.8-3-13.14,1.32c-4.67,3.19-4.82,10.03-0.35,13.9 - c0.45,0.38,0.82,0.66,1.16,0.88c1.31-0.62,2.8-1.24,4.51-1.79c2.9-0.94,5.3-1.43,7.28-1.68c0.95-1.06,2.05-2.92,1.77-6.29 - C95.22,63.63,91.75,64.36,94.36,61.88" + L158.87,144.16z M85.82,123.07l12.57-1.73c2.03,0.91,3.45,1.26,5.89,1.88c3.8,0.99,8.19,1.94,14.7-1.34 + c1.51-0.75,4.67-3.64,5.94-5.28l51.49-9.34l5.25,63.57l-88.21,15.9L85.82,123.07z M181.46,100.16l-5.08,0.97L166.62,0.25 + L0.25,19.54l20.5,166.33l19.47-2.83c-1.55-2.22-3.98-4.91-8.11-8.35c-5.74-4.76-3.71-12.86-0.32-17.97 + c4.47-8.63,27.54-19.61,26.23-33.41c-0.47-5.02-1.27-11.55-5.93-16.03c-0.17,1.86,0.14,3.65,0.14,3.65s-1.91-2.44-2.87-5.77 + c-0.95-1.28-1.69-1.68-2.7-3.39c-0.72,1.97-0.62,4.26-0.62,4.26s-1.56-3.7-1.82-6.82c-0.93,1.4-1.16,4.05-1.16,4.05 + s-2.03-5.83-1.57-8.97c-0.93-2.73-3.68-8.15-2.9-20.47c5.08,3.56,16.26,2.71,20.61-3.71c1.45-2.13,2.44-7.93-0.72-19.36 + c-2.03-7.33-7.05-18.25-9.01-22.4l-0.23,0.17c1.03,3.34,3.16,10.33,3.98,13.73c2.47,10.29,3.13,13.87,1.97,18.61 + c-0.99,4.12-3.35,6.82-9.35,9.84c-6,3.03-13.96-4.34-14.47-4.74c-5.83-4.64-10.34-12.22-10.84-15.9 + c-0.52-4.03,2.32-6.45,3.76-9.74c-2.05,0.59-4.34,1.63-4.34,1.63s2.73-2.83,6.1-5.27c1.4-0.92,2.21-1.51,3.68-2.73 + c-2.13-0.03-3.86,0.02-3.86,0.02s3.55-1.92,7.23-3.31c-2.69-0.12-5.27-0.02-5.27-0.02S35.75,27.1,42,24.5 + c4.3-1.76,8.5-1.24,10.86,2.17c3.1,4.47,6.35,6.9,13.25,8.41c4.24-1.88,5.52-2.84,10.84-4.29c4.68-5.15,8.36-5.82,8.36-5.82 + s-1.82,1.67-2.31,4.3c2.66-2.09,5.57-3.84,5.57-3.84s-1.13,1.39-2.18,3.6l0.24,0.36c3.1-1.86,6.74-3.32,6.74-3.32 + s-1.04,1.32-2.26,3.02c2.34-0.02,7.08,0.1,8.91,0.31c10.86,0.24,13.11-11.6,17.28-13.08c5.22-1.86,7.55-2.99,16.44,5.74 + c7.63,7.5,13.59,20.91,10.63,23.92c-2.48,2.49-7.38-0.97-12.8-7.74c-2.87-3.58-5.03-7.81-6.05-13.19 + c-0.86-4.54-4.19-7.17-4.19-7.17s1.93,4.31,1.93,8.11c0,2.08,0.26,9.84,3.59,14.19c-0.33,0.64-0.48,3.15-0.85,3.63 + c-3.87-4.68-12.19-8.03-13.54-9.02c4.59,3.76,15.14,12.4,19.19,20.68c3.83,7.83,1.57,15.01,3.51,16.87 + c0.55,0.53,8.24,10.11,9.72,14.93c2.58,8.39,0.15,17.21-3.22,22.68l-9.43,1.47c-1.38-0.38-2.31-0.58-3.55-1.29 + c0.68-1.21,2.04-4.22,2.05-4.84l-0.53-0.93c-2.94,4.16-7.85,8.2-11.94,10.52c-5.35,3.03-11.51,2.56-15.52,1.32 + c-11.39-3.51-22.16-11.21-24.75-13.23c0,0-0.08,1.61,0.41,1.98c2.87,3.24,9.45,9.1,15.81,13.18l-13.55,1.49l6.41,49.89 + c-2.84,0.41-3.28,0.61-6.39,1.05c-2.74-9.68-7.98-16.01-13.71-19.69c-5.05-3.25-12.02-3.98-18.7-2.66l-0.43,0.5 + c4.64-0.48,10.12,0.19,15.74,3.75c5.52,3.49,9.97,12.51,11.61,17.94c2.1,6.94,3.55,14.36-2.1,22.23 + c-4.02,5.59-15.74,8.68-25.22,2c2.53,4.07,5.95,7.4,10.55,8.02c6.84,0.93,13.33-0.26,17.79-4.84c3.81-3.92,5.84-12.12,5.3-20.75 + l6.03-0.87l2.18,15.49l99.88-12.03L181.46,100.16z M120.69,58.08c-0.28,0.64-0.72,1.05-0.06,3.12l0.04,0.12l0.1,0.27l0.27,0.62 + c1.19,2.42,2.49,4.71,4.66,5.88c0.56-0.09,1.15-0.16,1.75-0.19c2.04-0.09,3.33,0.23,4.15,0.68c0.07-0.41,0.09-1,0.04-1.88 + c-0.16-3.07,0.61-8.29-5.29-11.04c-2.23-1.03-5.35-0.72-6.39,0.58c0.19,0.02,0.36,0.06,0.49,0.11 + C122.04,56.89,120.98,57.43,120.69,58.08 M137.23,86.73c-0.77-0.43-4.39-0.26-6.93,0.04c-4.84,0.57-10.07,2.25-11.22,3.14 + c-2.08,1.61-1.14,4.42,0.4,5.57c4.32,3.22,8.1,5.39,12.09,4.86c2.45-0.32,4.61-4.2,6.14-7.73 + C138.77,90.19,138.77,87.58,137.23,86.73 M94.36,61.88c1.37-1.3-6.8-3-13.14,1.32c-4.67,3.19-4.82,10.03-0.35,13.9 + c0.45,0.38,0.82,0.66,1.16,0.88c1.31-0.62,2.8-1.24,4.51-1.79c2.9-0.94,5.3-1.43,7.28-1.68c0.95-1.06,2.05-2.92,1.77-6.29 + C95.22,63.63,91.75,64.36,94.36,61.88" /> @@ -87,14 +87,14 @@ const DataDog: FC> = props => ( clipRule="evenodd" fillRule="evenodd" d="M249.2,141.8H211v-88h38.2c27.5,0,41.3,13.9,41.3,41.6C290.5,126.3,276.8,141.8,249.2,141.8z M227.4,127.6 - h19.4c18.3,0,27.4-10.7,27.4-32.2c0-18.3-9.1-27.4-27.4-27.4h-19.4V127.6L227.4,127.6z" + h19.4c18.3,0,27.4-10.7,27.4-32.2c0-18.3-9.1-27.4-27.4-27.4h-19.4V127.6L227.4,127.6z" /> > = props => ( clipRule="evenodd" fillRule="evenodd" points="450.1,141.8 433.3,141.8 470.8,53.8 488.3,53.8 526.5,141.8 509,141.8 497.9,117.8 469.6,117.8 - 475.2,103.7 493.5,103.7 479.1,70.6" + 475.2,103.7 493.5,103.7 479.1,70.6" /> diff --git a/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Favicon.tsx index e1ef1270a9b64..f1b7480c77c00 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Favicon.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Favicon.tsx @@ -1,7 +1,7 @@ import classNames from 'classnames'; import type { FC, SVGProps } from 'react'; -const Crowdin: FC> = props => ( +const DigitalOcean: FC> = props => ( > = props => ( id="XMLID_49_" fill="currentColor" d="M155.2,351.7v-34.2c36.2,0,64.3-35.9,50.4-74c-5.1-14.1-16.4-25.4-30.5-30.5 - - c-38.1-13.8-74,14.2-74,50.4l0,0H67c0-57.7,55.8-102.7,116.3-83.8c26.4,8.3,47.5,29.3,55.7,55.7 - - C257.9,295.9,213,351.7,155.2,351.7z" + c-38.1-13.8-74,14.2-74,50.4l0,0H67c0-57.7,55.8-102.7,116.3-83.8c26.4,8.3,47.5,29.3,55.7,55.7 + C257.9,295.9,213,351.7,155.2,351.7z" /> - - - > = props => ( ); -export default Crowdin; +export default DigitalOcean; diff --git a/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Logo.tsx index 88c40901903aa..bbcbaf9dcca4b 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Logo.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/DigitalOcean/Logo.tsx @@ -1,7 +1,7 @@ import classNames from 'classnames'; import type { FC, SVGProps } from 'react'; -const Crowdin: FC> = props => ( +const DigitalOcean: FC> = props => ( > = props => ( id="XMLID_49_" fill="currentColor" d="M52.1,102.1l0-19.6c20.8,0,36.8-20.6,28.9-42.4C78,32,71.6,25.5,63.5,22.6 - - c-21.8-7.9-42.4,8.1-42.4,28.9c0,0,0,0,0,0l-19.6,0c0-33.1,32-58.9,66.7-48.1c15.2,4.7,27.2,16.8,31.9,31.9 - - C110.9,70.1,85.2,102.1,52.1,102.1z" + c-21.8-7.9-42.4,8.1-42.4,28.9c0,0,0,0,0,0l-19.6,0c0-33.1,32-58.9,66.7-48.1c15.2,4.7,27.2,16.8,31.9,31.9 + C110.9,70.1,85.2,102.1,52.1,102.1z" /> - - - - - - > = props => ( width="10.3" height="41" /> - - > = props => ( width="10.3" height="41" /> - - - > = props => ( width="10.3" height="58.1" /> - - - - - - ); -export default Crowdin; +export default DigitalOcean; diff --git a/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/Favicon.tsx index 364f53a536ca1..311d3c67e3c10 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/Favicon.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/Favicon.tsx @@ -17,17 +17,17 @@ const EquinixMetal: FC> = props => ( ); diff --git a/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/Logo.tsx index 371889dab83a5..0f208502f76ca 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/Logo.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/EquinixMetal/Logo.tsx @@ -18,13 +18,13 @@ const EquinixMetal: FC> = props => ( > = props => ( > = props => ( ); diff --git a/packages/ui-components/src/Icons/PartnerLogos/HeroDevs/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/HeroDevs/Favicon.tsx index 88d9cbcde3c88..18d5100f748ed 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/HeroDevs/Favicon.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/HeroDevs/Favicon.tsx @@ -15,14 +15,12 @@ const HeroDevs: FC> = props => ( d="M168.465 193.671C96.0868 172.261 104.27 358.657 188.649 307.589C213 292.848 245.097 271.662 283.516 271.662C318.175 271.662 337.138 309.212 371.797 309.212C421.722 303.779 419.576 209.004 385.85 205.936C350.385 205.936 321.323 265.829 275.427 251.754C235.8 239.604 195.13 201.557 168.465 193.671ZM178.261 163.624C215.231 174.56 247.435 209.939 284.762 221.383C287.8 222.315 290.385 222.337 293.443 221.508C300.588 219.573 308.772 213.546 314.638 209.106C336.291 192.715 356.204 174.493 385.051 174.493H386.495L387.933 174.624C462.26 181.382 461.541 333.617 374.543 343.087L372.827 343.274H370.679C367.931 343.274 365.171 343.193 362.444 342.855C340.063 340.077 324.796 329.948 308.908 318.821C302.583 314.392 291.657 305.994 283.451 305.994C255.029 305.994 229.41 322.751 205.823 337.028C182.609 351.078 155.543 356.167 130.914 342.421C101.852 326.2 89.3382 290.624 88.058 258.549C86.7283 225.261 97.2242 186.159 127.537 168.72C143.279 159.665 161.076 158.541 178.261 163.624Z" fill="url(#paint0_linear_1656_31)" /> - - > = props => ( gradientUnits="userSpaceOnUse" > - - > = props => ( gradientUnits="userSpaceOnUse" > - diff --git a/packages/ui-components/src/Icons/PartnerLogos/HeroDevs/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/HeroDevs/Logo.tsx index 23de36b18ecb4..d99d7433dff2c 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/HeroDevs/Logo.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/HeroDevs/Logo.tsx @@ -8,7 +8,7 @@ const HeroDevs: FC> = props => ( viewBox="0 0 600 144" fill="none" xmlns="http://www.w3.org/2000/svg" - className={classNames('text-[#000] dark:text-white', props.className)} + className={classNames('text-black dark:text-white', props.className)} {...props} > > = props => ( d="M49.716 57.7644C31.2403 52.2992 33.3293 99.8793 54.868 86.8433C61.0841 83.0806 69.2772 77.6726 79.0841 77.6726C87.9313 77.6726 92.772 87.2578 101.619 87.2578C114.363 85.8708 113.815 61.6781 105.206 60.8951C96.1535 60.8951 88.7351 76.1836 77.0194 72.5908C66.904 69.4893 56.5224 59.7773 49.716 57.7644ZM52.2164 50.0945C61.6535 52.886 69.874 61.9169 79.4022 64.8381C80.1779 65.076 80.8375 65.0818 81.6183 64.8701C83.4421 64.3762 85.5311 62.8377 87.0285 61.7043C92.5559 57.5203 97.6388 52.8687 105.002 52.8687H105.371L105.738 52.9024C124.711 54.6274 124.528 93.4875 102.32 95.9048L101.882 95.9526H101.334C100.632 95.9526 99.9279 95.9318 99.2316 95.8455C93.5185 95.1364 89.6214 92.5508 85.5659 89.7106C83.9513 88.5799 81.1622 86.4363 79.0675 86.4363C71.8124 86.4363 65.2729 90.7137 59.2521 94.3582C53.3263 97.9447 46.4174 99.2437 40.1305 95.7347C32.7121 91.5942 29.5177 82.5128 29.1909 74.3252C28.8514 65.828 31.5307 55.8467 39.2685 51.3953C43.2868 49.0838 47.8298 48.7968 52.2164 50.0945Z" fill="url(#paint0_linear_1656_9)" /> - - - - > = props => ( gradientUnits="userSpaceOnUse" > - - > = props => ( gradientUnits="userSpaceOnUse" > - - > = props => ( gradientUnits="userSpaceOnUse" > - diff --git a/packages/ui-components/src/Icons/PartnerLogos/IBM/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/IBM/Favicon.tsx index 3479708ad3c95..f2630fd2eebbd 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/IBM/Favicon.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/IBM/Favicon.tsx @@ -21,32 +21,32 @@ const IBM: FC> = props => ( > = props => ( > = props => ( diff --git a/packages/ui-components/src/Icons/PartnerLogos/IBM/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/IBM/Logo.tsx index 3479708ad3c95..b29ef831e2e83 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/IBM/Logo.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/IBM/Logo.tsx @@ -21,32 +21,32 @@ const IBM: FC> = props => ( > = props => ( id="Shape_21_" fill="currentColor" d="M444.433,134.509h87.163c2.476-8.914,3.764-18.324,3.764-27.932h-90.927L444.433,134.509 - L444.433,134.509z" + L444.433,134.509z" /> > = props => ( diff --git a/packages/ui-components/src/Icons/PartnerLogos/Sentry/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/Sentry/Favicon.tsx index 26b826e128f39..c97d976fe9293 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/Sentry/Favicon.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/Sentry/Favicon.tsx @@ -13,7 +13,7 @@ const Sentry: FC> = props => ( + /> ); diff --git a/packages/ui-components/src/Icons/PartnerLogos/Sentry/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/Sentry/Logo.tsx index 429ecd0f3cc01..af0581fd65f95 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/Sentry/Logo.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/Sentry/Logo.tsx @@ -12,7 +12,7 @@ const Sentry: FC> = props => ( + /> ); diff --git a/packages/ui-components/src/Icons/PartnerLogos/Vercel/Favicon.tsx b/packages/ui-components/src/Icons/PartnerLogos/Vercel/Favicon.tsx index 1685490bcd3fa..dc7d37d0b2af3 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/Vercel/Favicon.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/Vercel/Favicon.tsx @@ -8,7 +8,7 @@ const Vercel: FC> = props => ( viewBox="0 0 1155 1000" fill="none" xmlns="http://www.w3.org/2000/svg" - className={classNames('text-[#000000] dark:text-white', props.className)} + className={classNames('text-black dark:text-white', props.className)} {...props} > diff --git a/packages/ui-components/src/Icons/PartnerLogos/Vercel/Logo.tsx b/packages/ui-components/src/Icons/PartnerLogos/Vercel/Logo.tsx index 858cca55d261c..630674f7d39e3 100644 --- a/packages/ui-components/src/Icons/PartnerLogos/Vercel/Logo.tsx +++ b/packages/ui-components/src/Icons/PartnerLogos/Vercel/Logo.tsx @@ -8,7 +8,7 @@ const Vercel: FC> = props => ( viewBox="0 0 2048 407" fill="none" xmlns="http://www.w3.org/2000/svg" - className={classNames('text-[#000] dark:text-white', props.className)} + className={classNames('text-black dark:text-white', props.className)} {...props} > Date: Mon, 29 Sep 2025 20:31:49 +0300 Subject: [PATCH 26/54] chore: gql to rest --- .../next-data/generators/supportersData.mjs | 94 +++---------------- 1 file changed, 11 insertions(+), 83 deletions(-) diff --git a/apps/site/next-data/generators/supportersData.mjs b/apps/site/next-data/generators/supportersData.mjs index 4eed21d53421f..58d03507f4bfb 100644 --- a/apps/site/next-data/generators/supportersData.mjs +++ b/apps/site/next-data/generators/supportersData.mjs @@ -1,92 +1,20 @@ -// This is used to ensure that URLs are always in the correct format -function fixUrl(url) { - if (!url) { - return null; - } - - if (!url.startsWith('http://') && !url.startsWith('https://')) { - return `https://${url}`; - } - - return url; -} - async function fetchOpenCollectiveData() { - const endpoint = 'https://api.opencollective.com/graphql/v2'; + const endpoint = 'https://opencollective.com/nodejs/members/all.json'; - const query = `{ - account(slug: "nodejs") { - orders(status: ACTIVE, filter: INCOMING) { - totalCount - nodes { - fromAccount { - name - website - imageUrl - } - amount { - value - } - tier { - slug - } - frequency - totalDonations { - value - } - } - } - } - donations: orders( - account: { slug: "nodejs" } - frequency: ONETIME - status: PAID - filter: INCOMING - ) { - totalCount - nodes { - id - updatedAt - frequency - status - amount { - value - currency - } - fromAccount { - name - website - imageUrl - } - } - } - }`; - - const response = await fetch(endpoint, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ query }), - }); + const response = await fetch(endpoint, { method: 'GET' }); const payload = await response.json(); - const sponsors = payload.data.account.orders.nodes.map(order => ({ - name: order.fromAccount.name, - url: fixUrl(order.fromAccount.website), - image: order.fromAccount.imageUrl, - source: 'opencollective', - })); - - const donations = payload.data.donations.nodes.map(transaction => ({ - name: transaction.fromAccount.name, - url: fixUrl(transaction.fromAccount.website), - image: transaction.fromAccount.imageUrl, - source: 'opencollective', - })); - - sponsors.push(...donations); + const members = payload + .filter(({ role, isActive }) => role === 'BACKER' && isActive) + .map(({ name, website, image }) => ({ + name, + image, + url: website, + source: 'opencollective', + })); - return sponsors; + return members; } // TODO: implement github sponsors data fetching From 6264c990fdfbe8b6f74d140345875bd66f328f35 Mon Sep 17 00:00:00 2001 From: Caner Akdas Date: Mon, 29 Sep 2025 20:33:40 +0300 Subject: [PATCH 27/54] chore: comment lines removed --- apps/site/layouts/Post.tsx | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/apps/site/layouts/Post.tsx b/apps/site/layouts/Post.tsx index 4a3ec9e98062e..50d8b98963d48 100644 --- a/apps/site/layouts/Post.tsx +++ b/apps/site/layouts/Post.tsx @@ -1,7 +1,6 @@ import Preview from '@node-core/ui-components/Common/Preview'; import type { FC, PropsWithChildren } from 'react'; -// import Link from '#site/components/Link'; import EOLAlert from '#site/components/EOL/EOLAlert'; import WithAvatarGroup from '#site/components/withAvatarGroup'; import WithBlogCrossLinks from '#site/components/withBlogCrossLinks'; @@ -13,7 +12,6 @@ import { mapAuthorToCardAuthors } from '#site/util/author'; import { mapBlogCategoryToPreviewType } from '#site/util/blog'; import styles from './layouts.module.css'; -// import PartnersLogoList from '../components/Common/Partners/PartnersLogoList'; const PostLayout: FC = ({ children }) => { const { frontmatter } = useClientContext(); @@ -44,22 +42,6 @@ const PostLayout: FC = ({ children }) => { {children} - {/* {type === 'vulnerability' && ( -
-
-
-

- These security releases are possible by: -

-

- We are able to offer security releases proudly due to the - support of these partners - and more. -

- -
-
- )} */}
From c12045e145e4c8eb98d9c770d906b22cf97e3102 Mon Sep 17 00:00:00 2001 From: Caner Akdas Date: Mon, 29 Sep 2025 20:58:20 +0300 Subject: [PATCH 28/54] fix: remove auto width from svg components --- apps/site/components/Common/Partners/PartnerIcon/index.tsx | 2 +- apps/site/components/Common/Partners/PartnerLogo/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/site/components/Common/Partners/PartnerIcon/index.tsx b/apps/site/components/Common/Partners/PartnerIcon/index.tsx index aa0784384fb86..88202cff1b02c 100644 --- a/apps/site/components/Common/Partners/PartnerIcon/index.tsx +++ b/apps/site/components/Common/Partners/PartnerIcon/index.tsx @@ -19,7 +19,7 @@ const PartnersIcon: FC = ({ name, href, logo, loading }) => ( className={style.partnerIcon} > {cloneElement(logo, { - width: 'auto', + width: '100%', height: '16px', })} diff --git a/apps/site/components/Common/Partners/PartnerLogo/index.tsx b/apps/site/components/Common/Partners/PartnerLogo/index.tsx index 1f9d9ee13d18f..988367e82aea9 100644 --- a/apps/site/components/Common/Partners/PartnerLogo/index.tsx +++ b/apps/site/components/Common/Partners/PartnerLogo/index.tsx @@ -17,7 +17,7 @@ const PartnersLogo: FC = ({ href, logo, loading }) => ( className={style.partnerIcon} > {cloneElement(logo, { - width: 'auto', + width: '100%', height: '16px', })} From 9195ee05ab8a47d1045a755b1b526e36c2c23e01 Mon Sep 17 00:00:00 2001 From: Caner Akdas Date: Mon, 29 Sep 2025 20:59:06 +0300 Subject: [PATCH 29/54] chore: tooltip styling --- apps/site/components/Common/Partners/PartnerIcon/index.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/site/components/Common/Partners/PartnerIcon/index.tsx b/apps/site/components/Common/Partners/PartnerIcon/index.tsx index 88202cff1b02c..268c5f7d7de9c 100644 --- a/apps/site/components/Common/Partners/PartnerIcon/index.tsx +++ b/apps/site/components/Common/Partners/PartnerIcon/index.tsx @@ -12,7 +12,11 @@ type PartnersIconProps = Partners & ComponentProps; const PartnersIcon: FC = ({ name, href, logo, loading }) => ( - {name}}> + {name}
+ } + > + @@ -114,7 +116,9 @@ layout: home // run with `node threads.mjs` ``` + - 私たちの[学習教材](/learn)でNode.jsでできることをさらに学んでみましょう。 +私たちの[学習教材](/learn)でNode.jsでできることをさらに学んでみましょう。 + From 207b401687ed63fa7c741602fb62d00df962fa86 Mon Sep 17 00:00:00 2001 From: Caner Akdas Date: Thu, 2 Oct 2025 20:57:56 +0300 Subject: [PATCH 44/54] chore: revert mdx changes --- apps/site/pages/ja/index.mdx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/apps/site/pages/ja/index.mdx b/apps/site/pages/ja/index.mdx index 4762e1731aaf9..79cd73a5fd102 100644 --- a/apps/site/pages/ja/index.mdx +++ b/apps/site/pages/ja/index.mdx @@ -10,7 +10,6 @@ layout: home

どこでもJavaScriptを使おう

Node.js®はクロスプラットフォームに対応したフリーでオープンソースのJavaScript実行環境です。開発者にサーバー、ウェブアプリ、コマンドラインツール、スクリプトなどを開発する環境を提供します。 -
@@ -27,7 +26,6 @@ layout: home EOLバージョン用
- @@ -116,9 +114,7 @@ layout: home // run with `node threads.mjs` ``` - -私たちの[学習教材](/learn)でNode.jsでできることをさらに学んでみましょう。 - + 私たちの[学習教材](/learn)でNode.jsでできることをさらに学んでみましょう。 From 5719e960e773244214bfb8a1ff1e7fed3c24d09b Mon Sep 17 00:00:00 2001 From: Caner Akdas Date: Thu, 2 Oct 2025 21:00:18 +0300 Subject: [PATCH 45/54] chore: revert mdx changes --- apps/site/pages/ja/index.mdx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/site/pages/ja/index.mdx b/apps/site/pages/ja/index.mdx index 79cd73a5fd102..d907c0a568f2a 100644 --- a/apps/site/pages/ja/index.mdx +++ b/apps/site/pages/ja/index.mdx @@ -10,6 +10,7 @@ layout: home

どこでもJavaScriptを使おう

Node.js®はクロスプラットフォームに対応したフリーでオープンソースのJavaScript実行環境です。開発者にサーバー、ウェブアプリ、コマンドラインツール、スクリプトなどを開発する環境を提供します。 +
@@ -18,6 +19,7 @@ layout: home +
- 私たちの[学習教材](/learn)でNode.jsでできることをさらに学んでみましょう。 - +私たちの[学習教材](/learn)でNode.jsでできることをさらに学んでみましょう。 + + \ No newline at end of file From dd941c70cfbe9430c3aaeea416268ecc87e61e7f Mon Sep 17 00:00:00 2001 From: Caner Akdas Date: Thu, 2 Oct 2025 21:01:54 +0300 Subject: [PATCH 46/54] chore: revert mdx changes --- apps/site/pages/ja/index.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/site/pages/ja/index.mdx b/apps/site/pages/ja/index.mdx index d907c0a568f2a..99ce35631a610 100644 --- a/apps/site/pages/ja/index.mdx +++ b/apps/site/pages/ja/index.mdx @@ -28,6 +28,7 @@ layout: home EOLバージョン用 + From dfb8ec902eec055db17ca6b0ef3579131032764e Mon Sep 17 00:00:00 2001 From: Caner Akdas Date: Thu, 2 Oct 2025 21:09:26 +0300 Subject: [PATCH 47/54] fix: lint issue --- apps/site/pages/ja/index.mdx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/apps/site/pages/ja/index.mdx b/apps/site/pages/ja/index.mdx index 99ce35631a610..79cd73a5fd102 100644 --- a/apps/site/pages/ja/index.mdx +++ b/apps/site/pages/ja/index.mdx @@ -10,7 +10,6 @@ layout: home

どこでもJavaScriptを使おう

Node.js®はクロスプラットフォームに対応したフリーでオープンソースのJavaScript実行環境です。開発者にサーバー、ウェブアプリ、コマンドラインツール、スクリプトなどを開発する環境を提供します。 -
@@ -19,7 +18,6 @@ layout: home -
- @@ -117,9 +114,7 @@ layout: home // run with `node threads.mjs` ``` - -私たちの[学習教材](/learn)でNode.jsでできることをさらに学んでみましょう。 - - \ No newline at end of file + 私たちの[学習教材](/learn)でNode.jsでできることをさらに学んでみましょう。 + From 335e1a531310464b5e3905de8862d964b57e2332 Mon Sep 17 00:00:00 2001 From: Caner Akdas Date: Thu, 2 Oct 2025 21:10:58 +0300 Subject: [PATCH 48/54] chore: revert the /ja/ lint issue --- apps/site/pages/ja/index.mdx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/site/pages/ja/index.mdx b/apps/site/pages/ja/index.mdx index 79cd73a5fd102..d7337b63a7d1b 100644 --- a/apps/site/pages/ja/index.mdx +++ b/apps/site/pages/ja/index.mdx @@ -10,6 +10,7 @@ layout: home

どこでもJavaScriptを使おう

Node.js®はクロスプラットフォームに対応したフリーでオープンソースのJavaScript実行環境です。開発者にサーバー、ウェブアプリ、コマンドラインツール、スクリプトなどを開発する環境を提供します。 +
@@ -18,6 +19,7 @@ layout: home +
+ @@ -114,7 +117,9 @@ layout: home // run with `node threads.mjs` ``` + - 私たちの[学習教材](/learn)でNode.jsでできることをさらに学んでみましょう。 +私たちの[学習教材](/learn)でNode.jsでできることをさらに学んでみましょう。 + From 6dee5eab3a97efc629232ac5a0641b413be5518f Mon Sep 17 00:00:00 2001 From: Caner Akdas Date: Thu, 2 Oct 2025 21:22:43 +0300 Subject: [PATCH 49/54] docs: Update apps/site/pages/en/about/partners.mdx Co-authored-by: Brian Muenzenmeyer Signed-off-by: Caner Akdas --- apps/site/pages/en/about/partners.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/site/pages/en/about/partners.mdx b/apps/site/pages/en/about/partners.mdx index ddc498fe5832c..ebfb35472e43b 100644 --- a/apps/site/pages/en/about/partners.mdx +++ b/apps/site/pages/en/about/partners.mdx @@ -34,7 +34,7 @@ Do you run a node.js version on End-of-Life (EOL)? The OpenJS Ecosystem Sustaina is a program that helps organizations to maintain their Node.js applications on EOL versions. The program provides access to security patches, compliance assistance, and technical support to help bridge the gap while you plan your upgrade strategy. For more information about -End-Of-Life versions, please visit [End-Of-Life Node.js Releases](/eol) +End-Of-Life versions, please visit [End-Of-Life Node.js Releases](/about/eol) > Using EOL releases through NES should be viewed as a temporary solution, the goal should always > be to upgrade to actively supported versions. From b0be46a46a964789ddb5c25fa59efcc1725a8110 Mon Sep 17 00:00:00 2001 From: Caner Akdas Date: Thu, 2 Oct 2025 22:15:22 +0300 Subject: [PATCH 50/54] chore: remove github sponsors mismention --- apps/site/pages/en/about/partners.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/site/pages/en/about/partners.mdx b/apps/site/pages/en/about/partners.mdx index ebfb35472e43b..be4fe2f3dc61a 100644 --- a/apps/site/pages/en/about/partners.mdx +++ b/apps/site/pages/en/about/partners.mdx @@ -23,8 +23,7 @@ without we can't test and release new versions of Node.js. ## Supporters Supporters are individuals and organizations that provide financial support through -[OpenCollective](https://opencollective.com/nodejs) and [GitHub Sponsors](https://github.com/sponsors/nodejs) -of the Node.js project. +[OpenCollective](https://opencollective.com/nodejs) of the Node.js project. From 0cac1206612f73ee8cd36471daa4e9ce9d8bf66e Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Fri, 3 Oct 2025 06:26:59 -0500 Subject: [PATCH 51/54] chore/debug: use named import from node:crypto other elements of the codebase do the same thing --- apps/site/components/Common/Partners/utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/site/components/Common/Partners/utils.ts b/apps/site/components/Common/Partners/utils.ts index 91af16207f730..4ec6f7eb5ba14 100644 --- a/apps/site/components/Common/Partners/utils.ts +++ b/apps/site/components/Common/Partners/utils.ts @@ -1,4 +1,4 @@ -import crypto from 'node:crypto'; +import { createHash } from 'node:crypto'; import type { RandomPartnerListConfig, @@ -8,7 +8,7 @@ import type { // Fisher-Yates shuffle algorithm with a seed for deterministic results function shuffle(array: Array, seed: number): Array { const shuffled = [...array]; - const hash = crypto.createHash('sha256').update(String(seed)).digest(); + const hash = createHash('sha256').update(String(seed)).digest(); for (let i = shuffled.length - 1; i > 0; i--) { // Use hash bytes to generate deterministic "random" index From 19efadf3500024ca715c4945a2123f35596a830d Mon Sep 17 00:00:00 2001 From: Caner Akdas Date: Sun, 5 Oct 2025 15:48:04 +0300 Subject: [PATCH 52/54] refactor: web crypto api --- apps/site/components/Common/Partners/utils.ts | 20 ++++++++++++------- .../hooks/react-client/usePartnersList.ts | 4 ++-- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/apps/site/components/Common/Partners/utils.ts b/apps/site/components/Common/Partners/utils.ts index 4ec6f7eb5ba14..44f143c5a87aa 100644 --- a/apps/site/components/Common/Partners/utils.ts +++ b/apps/site/components/Common/Partners/utils.ts @@ -1,14 +1,18 @@ -import { createHash } from 'node:crypto'; - import type { RandomPartnerListConfig, Partners, } from '#site/types/partners.js'; // Fisher-Yates shuffle algorithm with a seed for deterministic results -function shuffle(array: Array, seed: number): Array { +async function shuffle( + array: Array, + seed: number +): Promise> { const shuffled = [...array]; - const hash = createHash('sha256').update(String(seed)).digest(); + const encoder = new TextEncoder(); + const buffer = encoder.encode(String(seed)); + const hashBuffer = await crypto.subtle.digest('SHA-256', buffer); + const hash = new Uint8Array(hashBuffer); for (let i = shuffled.length - 1; i > 0; i--) { // Use hash bytes to generate deterministic "random" index @@ -23,10 +27,10 @@ function shuffle(array: Array, seed: number): Array { return shuffled; } -function randomPartnerList( +async function randomPartnerList( partners: Array, config: RandomPartnerListConfig -) { +): Promise> { const { pick = 4, dateSeed = 5, category } = config; // Generate a deterministic seed based on current time that changes every X minutes @@ -37,7 +41,9 @@ function randomPartnerList( ? partners.filter(p => p.categories.includes(category)) : partners; - return shuffle(filtered, seed).slice(0, pick ?? filtered.length); + const shuffled = await shuffle(filtered, seed); + + return shuffled.slice(0, pick ?? filtered.length); } export { randomPartnerList }; diff --git a/apps/site/hooks/react-client/usePartnersList.ts b/apps/site/hooks/react-client/usePartnersList.ts index 0b39561bb57e8..8897dcc42b954 100644 --- a/apps/site/hooks/react-client/usePartnersList.ts +++ b/apps/site/hooks/react-client/usePartnersList.ts @@ -36,11 +36,11 @@ const usePartnersList = ({ // Although whilst we are deployed on Vercel or other environment that supports ISR // (Incremental Static Generation) whose would invalidate the cache every 5 minutes // We want to ensure that this feature is compatible on a full-static environment - const renderSponsorsAnimation = setTimeout(() => { + const renderSponsorsAnimation = setTimeout(async () => { initialRenderer.current = false; setSeedList( - randomPartnerList(logos, { + await randomPartnerList(logos, { pick: maxLength, dateSeed: 1, category: categories, From 3e007d7dc98125937458597b1a5d88b606f6cbcb Mon Sep 17 00:00:00 2001 From: Caner Akdas Date: Mon, 6 Oct 2025 19:17:55 +0300 Subject: [PATCH 53/54] Update apps/site/next-data/generators/supportersData.mjs Co-authored-by: Claudio Wunder Signed-off-by: Caner Akdas --- apps/site/next-data/generators/supportersData.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/site/next-data/generators/supportersData.mjs b/apps/site/next-data/generators/supportersData.mjs index de4aef728098e..1ffce2476b179 100644 --- a/apps/site/next-data/generators/supportersData.mjs +++ b/apps/site/next-data/generators/supportersData.mjs @@ -7,7 +7,7 @@ async function fetchOpenCollectiveData() { const endpoint = 'https://opencollective.com/nodejs/members/all.json'; - const response = await fetch(endpoint, { method: 'GET' }); + const response = await fetch(endpoint); const payload = await response.json(); From 4c2d6cba5e229eecd7ef560e55700c98a92a30ce Mon Sep 17 00:00:00 2001 From: Caner Akdas Date: Mon, 6 Oct 2025 19:32:07 +0300 Subject: [PATCH 54/54] refactor: move shuffle util into the array utils --- apps/site/components/Common/Partners/utils.ts | 30 ++----------------- apps/site/util/array.ts | 25 ++++++++++++++++ 2 files changed, 27 insertions(+), 28 deletions(-) create mode 100644 apps/site/util/array.ts diff --git a/apps/site/components/Common/Partners/utils.ts b/apps/site/components/Common/Partners/utils.ts index 44f143c5a87aa..c47fec46be77e 100644 --- a/apps/site/components/Common/Partners/utils.ts +++ b/apps/site/components/Common/Partners/utils.ts @@ -1,31 +1,5 @@ -import type { - RandomPartnerListConfig, - Partners, -} from '#site/types/partners.js'; - -// Fisher-Yates shuffle algorithm with a seed for deterministic results -async function shuffle( - array: Array, - seed: number -): Promise> { - const shuffled = [...array]; - const encoder = new TextEncoder(); - const buffer = encoder.encode(String(seed)); - const hashBuffer = await crypto.subtle.digest('SHA-256', buffer); - const hash = new Uint8Array(hashBuffer); - - for (let i = shuffled.length - 1; i > 0; i--) { - // Use hash bytes to generate deterministic "random" index - const hashIndex = (i + seed) % 32; - // Normalize to 0-1 - const randomValue = hash[hashIndex] / 255; - - const j = Math.floor(randomValue * (i + 1)); - [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; - } - - return shuffled; -} +import type { RandomPartnerListConfig, Partners } from '#site/types'; +import { shuffle } from '#site/util/array'; async function randomPartnerList( partners: Array, diff --git a/apps/site/util/array.ts b/apps/site/util/array.ts new file mode 100644 index 0000000000000..c9e1856495bc1 --- /dev/null +++ b/apps/site/util/array.ts @@ -0,0 +1,25 @@ +import type { Partners } from '#site/types'; + +// Fisher-Yates shuffle algorithm with a seed for deterministic results +export const shuffle = async ( + array: Array, + seed: number +): Promise> => { + const shuffled = [...array]; + const encoder = new TextEncoder(); + const buffer = encoder.encode(String(seed)); + const hashBuffer = await crypto.subtle.digest('SHA-256', buffer); + const hash = new Uint8Array(hashBuffer); + + for (let i = shuffled.length - 1; i > 0; i--) { + // Use hash bytes to generate deterministic "random" index + const hashIndex = (i + seed) % 32; + // Normalize to 0-1 + const randomValue = hash[hashIndex] / 255; + + const j = Math.floor(randomValue * (i + 1)); + [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; + } + + return shuffled; +};