@hashicorp/react-components 0.0.0-nightly.f20702c → 0.0.0-nightly.f32b6b8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/.eslintrc.js +1 -2
  2. package/.stylelintrc.js +1 -1
  3. package/README.md +1 -1
  4. package/package.json +4 -8
  5. package/postcss.config.js +1 -1
  6. package/src/components/nav-panel/components/flight-icon/index.tsx +51 -0
  7. package/src/components/nav-panel/components/flight-icon/style.module.css +3 -0
  8. package/src/components/nav-panel/components/link/index.tsx +127 -0
  9. package/src/components/nav-panel/components/link/style.module.css +64 -0
  10. package/src/components/nav-panel/components/link-list/index.tsx +13 -65
  11. package/src/components/nav-panel/components/link-list/style.module.css +1 -50
  12. package/src/components/nav-panel/components/panel/column/style.module.css +2 -2
  13. package/src/components/nav-panel/components/panel/root/style.module.css +5 -5
  14. package/src/components/nav-panel/components/promo/index.tsx +31 -11
  15. package/src/components/nav-panel/components/promo/style.module.css +33 -19
  16. package/src/components/nav-panel/components/text/index.tsx +34 -0
  17. package/src/components/nav-panel/product-panel/index.tsx +55 -18
  18. package/src/components/nav-panel/product-panel/style.module.css +133 -53
  19. package/src/components/nav-panel/standard-panel/index.tsx +3 -0
  20. package/src/components/nav-panel/standard-panel/style.module.css +2 -2
  21. package/src/lib/get-localized-link-props/index.test.ts +30 -0
  22. package/src/lib/get-localized-link-props/index.ts +45 -0
  23. package/src/lib/parse-url/index.test.ts +35 -1
  24. package/src/lib/parse-url/index.ts +74 -9
  25. package/src/lib/send-posthog-event/index.ts +22 -0
  26. package/src/lib/supported-locales/index.ts +10 -0
  27. package/src/lib/track-nav-click-event/index.ts +5 -5
  28. package/src/components/actions/index.tsx +0 -107
  29. package/src/components/actions/style.module.css +0 -28
  30. package/src/components/actions/types.ts +0 -73
  31. package/src/components/call-to-action/index.tsx +0 -205
  32. package/src/components/call-to-action/styles/variant-centered.module.css +0 -93
  33. package/src/components/call-to-action/styles/variant-compact-grid.module.css +0 -88
  34. package/src/components/call-to-action/styles/variant-compact.module.css +0 -91
  35. package/src/components/call-to-action/styles/variant-links.module.css +0 -85
  36. package/src/components/card/README.md +0 -11
  37. package/src/components/card/card.tsx +0 -45
  38. package/src/components/card/index.test.tsx +0 -69
  39. package/src/components/card/index.tsx +0 -14
  40. package/src/components/card/newsroom-card/index.test.tsx +0 -39
  41. package/src/components/card/newsroom-card/index.tsx +0 -37
  42. package/src/components/card/newsroom-card/style.module.css +0 -12
  43. package/src/components/card/partner-card/index.test.tsx +0 -57
  44. package/src/components/card/partner-card/index.tsx +0 -69
  45. package/src/components/card/partner-card/style.module.css +0 -24
  46. package/src/components/card/person-card/index.test.tsx +0 -71
  47. package/src/components/card/person-card/index.tsx +0 -93
  48. package/src/components/card/person-card/style.module.css +0 -33
  49. package/src/components/card/primitives.tsx +0 -176
  50. package/src/components/card/promo-card/index.tsx +0 -51
  51. package/src/components/card/resource-card/index.test.tsx +0 -48
  52. package/src/components/card/resource-card/index.tsx +0 -37
  53. package/src/components/card/style.module.css +0 -145
  54. package/src/components/card/types.ts +0 -66
  55. package/src/components/card/unified-card/index.tsx +0 -64
  56. package/src/components/consent-manager/README.md +0 -73
  57. package/src/components/consent-manager/components/banner/banner.module.css +0 -23
  58. package/src/components/consent-manager/components/banner/banner.test.tsx +0 -31
  59. package/src/components/consent-manager/components/banner/banner.tsx +0 -73
  60. package/src/components/consent-manager/components/dialog/dialog.module.css +0 -145
  61. package/src/components/consent-manager/components/dialog/dialog.test.tsx +0 -194
  62. package/src/components/consent-manager/components/dialog/dialog.tsx +0 -339
  63. package/src/components/consent-manager/img/icn_close.tsx +0 -19
  64. package/src/components/consent-manager/index.test.tsx +0 -334
  65. package/src/components/consent-manager/index.tsx +0 -186
  66. package/src/components/consent-manager/loader/README.md +0 -29
  67. package/src/components/consent-manager/loader/categories.ts +0 -22
  68. package/src/components/consent-manager/loader/index.tsx +0 -94
  69. package/src/components/consent-manager/loader/presets/enterprise.ts +0 -12
  70. package/src/components/consent-manager/loader/presets/oss.ts +0 -10
  71. package/src/components/consent-manager/loader/services.ts +0 -45
  72. package/src/components/consent-manager/scripts/custom.tsx +0 -59
  73. package/src/components/consent-manager/scripts/segment.tsx +0 -87
  74. package/src/components/consent-manager/style.module.css +0 -9
  75. package/src/components/consent-manager/types.ts +0 -55
  76. package/src/components/consent-manager/util/cookies.test.ts +0 -75
  77. package/src/components/consent-manager/util/cookies.ts +0 -70
  78. package/src/components/consent-manager/util/integrations.test.ts +0 -115
  79. package/src/components/consent-manager/util/integrations.ts +0 -110
  80. package/src/components/intro/index.tsx +0 -82
  81. package/src/components/intro/style.module.css +0 -67
  82. package/src/components/intro/types.ts +0 -44
  83. package/src/components/marketo-form/CHANGELOG.md +0 -122
  84. package/src/components/marketo-form/README.md +0 -1
  85. package/src/components/marketo-form/contexts/FormMetadata.ts +0 -11
  86. package/src/components/marketo-form/docs.mdx +0 -197
  87. package/src/components/marketo-form/fixtures/index.ts +0 -185
  88. package/src/components/marketo-form/form/index.tsx +0 -369
  89. package/src/components/marketo-form/index.test.tsx +0 -320
  90. package/src/components/marketo-form/index.ts +0 -11
  91. package/src/components/marketo-form/package.original.json +0 -30
  92. package/src/components/marketo-form/partials/error-message/index.tsx +0 -12
  93. package/src/components/marketo-form/partials/error-message/style.module.css +0 -13
  94. package/src/components/marketo-form/partials/field/index.tsx +0 -90
  95. package/src/components/marketo-form/partials/field-wrapper/index.tsx +0 -26
  96. package/src/components/marketo-form/partials/fields/checkbox-field/index.tsx +0 -32
  97. package/src/components/marketo-form/partials/fields/email-field/index.tsx +0 -35
  98. package/src/components/marketo-form/partials/fields/form-page-url-field/index.tsx +0 -21
  99. package/src/components/marketo-form/partials/fields/hidden-field/index.tsx +0 -37
  100. package/src/components/marketo-form/partials/fields/htmltext-field/index.tsx +0 -21
  101. package/src/components/marketo-form/partials/fields/htmltext-field/style.module.css +0 -18
  102. package/src/components/marketo-form/partials/fields/name-field/index.tsx +0 -19
  103. package/src/components/marketo-form/partials/fields/name-field/style.module.css +0 -13
  104. package/src/components/marketo-form/partials/fields/radio-buttons-field/index.tsx +0 -48
  105. package/src/components/marketo-form/partials/fields/select-field/index.tsx +0 -39
  106. package/src/components/marketo-form/partials/fields/select-field/style.module.css +0 -5
  107. package/src/components/marketo-form/partials/fields/telephone-field/index.tsx +0 -30
  108. package/src/components/marketo-form/partials/fields/text-field/index.tsx +0 -30
  109. package/src/components/marketo-form/partials/fields/textarea-field/index.tsx +0 -29
  110. package/src/components/marketo-form/partials/label/index.tsx +0 -24
  111. package/src/components/marketo-form/partials/label/style.module.css +0 -12
  112. package/src/components/marketo-form/partials/visibility-rule/index.tsx +0 -84
  113. package/src/components/marketo-form/props.js +0 -66
  114. package/src/components/marketo-form/server/api-routes.ts +0 -109
  115. package/src/components/marketo-form/server/client.ts +0 -98
  116. package/src/components/marketo-form/server/index.ts +0 -8
  117. package/src/components/marketo-form/types.ts +0 -268
  118. package/src/components/marketo-form/utils.test.tsx +0 -103
  119. package/src/components/marketo-form/utils.ts +0 -449
  120. package/src/components/next-steps/index.tsx +0 -137
  121. package/src/components/next-steps/style.module.css +0 -270
  122. package/src/components/next-steps/types.ts +0 -63
  123. package/src/components/product-badge/index.test.tsx +0 -11
  124. package/src/components/product-badge/index.tsx +0 -42
  125. package/src/components/product-badge/style.module.css +0 -76
  126. package/src/components/products-used/index.tsx +0 -84
  127. package/src/components/products-used/style.module.css +0 -87
  128. package/src/components/products-used/types.ts +0 -31
  129. package/src/components/related-content/index.test.tsx +0 -74
  130. package/src/components/related-content/index.tsx +0 -56
  131. package/src/components/related-content/style.module.css +0 -89
  132. package/src/components/related-content/types.ts +0 -21
  133. package/src/components/subnav/helpers/areBasePathsMatching.ts +0 -13
  134. package/src/components/subnav/helpers/traverse/index.ts +0 -42
  135. package/src/components/subnav/helpers/useHeightRef.ts +0 -42
  136. package/src/components/subnav/helpers/useNavRef.ts +0 -30
  137. package/src/components/subnav/helpers/useOverflowRef.ts +0 -85
  138. package/src/components/subnav/helpers/useStuckRef.ts +0 -51
  139. package/src/components/subnav/index.tsx +0 -199
  140. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.test.ts +0 -26
  141. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.ts +0 -22
  142. package/src/components/subnav/partials/CtaLinks/github-stars-link/index.tsx +0 -87
  143. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.test.ts +0 -29
  144. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.ts +0 -32
  145. package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +0 -81
  146. package/src/components/subnav/partials/CtaLinks/icons/github-logo.js +0 -20
  147. package/src/components/subnav/partials/CtaLinks/icons/github.svg.js +0 -7
  148. package/src/components/subnav/partials/CtaLinks/icons/star.js +0 -20
  149. package/src/components/subnav/partials/CtaLinks/index.tsx +0 -130
  150. package/src/components/subnav/partials/CtaLinks/style.module.css +0 -45
  151. package/src/components/subnav/partials/DropdownTrigger/index.tsx +0 -35
  152. package/src/components/subnav/partials/DropdownTrigger/style.module.css +0 -39
  153. package/src/components/subnav/partials/MenuItemsDefault/index.tsx +0 -158
  154. package/src/components/subnav/partials/MenuItemsDefault/style.module.css +0 -104
  155. package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +0 -143
  156. package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +0 -88
  157. package/src/components/subnav/partials/TitleLink/index.tsx +0 -113
  158. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts +0 -10
  159. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts +0 -10
  160. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-dark.ts +0 -23
  161. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-light.ts +0 -23
  162. package/src/components/subnav/partials/TitleLink/style.module.css +0 -43
  163. package/src/components/subnav/partials/nav-item-text/index.tsx +0 -37
  164. package/src/components/subnav/partials/nav-item-text/style.module.css +0 -13
  165. package/src/components/subnav/style.module.css +0 -66
  166. package/src/components/subnav/subnav-consts.ts +0 -1
@@ -1,39 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import { render, screen } from '@testing-library/react'
7
- import { NewsroomCard } from '.'
8
-
9
- const defaultProps = {
10
- link: 'https://hashicorp.com',
11
- heading: 'Example heading',
12
- date: 'August 15, 2022',
13
- category: 'Post type',
14
- thumbnail: {
15
- src: 'https://www.datocms-assets.com/19447/1648680074-screenshot-2022-03-31-at-00-40-47.png',
16
- alt: 'HashiConf Europe 2022 Recap',
17
- },
18
- }
19
-
20
- describe('<NewsroomCard />', () => {
21
- it('should render the provided metadata correctly', () => {
22
- const expectedMeta = [defaultProps.date, defaultProps.category]
23
-
24
- render(<NewsroomCard {...defaultProps} />)
25
-
26
- const metaElement = screen.getByTestId('wpl-card-meta')
27
-
28
- expectedMeta.forEach((item) => {
29
- expect(metaElement).toContainElement(screen.getByText(item))
30
- })
31
-
32
- expect(metaElement).toContainElement(screen.queryByText('|'))
33
- })
34
-
35
- it('should not render the logo thumbnail if no thumbnail data provided', () => {
36
- render(<NewsroomCard {...defaultProps} thumbnail={undefined} />)
37
- expect(screen.queryByTestId('wpl-card-logo-thumbnail')).toBeNull()
38
- })
39
- })
@@ -1,37 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import type { ThumbnailProps } from '../types'
7
- import { UnifiedCard } from '../unified-card'
8
- import s from './style.module.css'
9
-
10
- export interface NewsroomCardProps {
11
- heading: string
12
- date: string
13
- category: string
14
- link: string
15
- thumbnail?: ThumbnailProps
16
- withArrow?: boolean
17
- }
18
-
19
- export function NewsroomCard({
20
- heading,
21
- date,
22
- category,
23
- link,
24
- thumbnail,
25
- withArrow = false,
26
- }: NewsroomCardProps): JSX.Element {
27
- return (
28
- <UnifiedCard
29
- heading={heading}
30
- meta={[date, category]}
31
- link={link}
32
- thumbnail={thumbnail}
33
- withArrow={withArrow}
34
- className={s.newsroomCard}
35
- />
36
- )
37
- }
@@ -1,12 +0,0 @@
1
- .newsroomCard {
2
- & img {
3
- padding: var(--hdsplus-spacing-07);
4
- aspect-ratio: 16 / 9;
5
-
6
- /*
7
- ! HACK: Overrides object-fit set by Thumbnail primitive in Card component styles
8
- Ref: https://github.com/hashicorp/web/blob/main/packages/react-components/src/components/card/style.module.css#L75
9
- */
10
- object-fit: contain !important;
11
- }
12
- }
@@ -1,57 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import { render, screen } from '@testing-library/react'
7
- import { PartnerCard } from '.'
8
-
9
- const defaultProps = {
10
- logo: {
11
- width: 360,
12
- src: 'https://www.datocms-assets.com/2885/1506535057-black.svg',
13
- height: 97,
14
- alt: 'GitHub Logo',
15
- },
16
- link: '#',
17
- heading: 'Github',
18
- description:
19
- 'GitHub, Inc. is a provider of Internet hosting for software development and version control using Git.',
20
- meta: ['Tech Partner'],
21
- }
22
-
23
- describe('<PartnerCard />', () => {
24
- it('should not render badges when none are provided', () => {
25
- render(<PartnerCard {...defaultProps} />)
26
-
27
- const badgeElement = screen.queryByTestId('wpl-card-badges')
28
-
29
- expect(badgeElement).toBeNull()
30
- })
31
-
32
- it('should render badges when badges are provided', () => {
33
- const competencyBadges = ['Infrastructure', 'Security']
34
-
35
- render(
36
- <PartnerCard {...defaultProps} competencyBadges={competencyBadges} />
37
- )
38
-
39
- const badgeElement = screen.getByTestId('wpl-card-badges')
40
-
41
- competencyBadges.forEach((item) => {
42
- expect(badgeElement).toContainElement(screen.getByText(item))
43
- })
44
- })
45
-
46
- it('should render badges when product badges are provided', () => {
47
- const productBadges = ['vault' as const, 'terraform' as const]
48
-
49
- render(<PartnerCard {...defaultProps} productBadges={productBadges} />)
50
-
51
- const badgeElement = screen.getByTestId('wpl-card-badges')
52
-
53
- productBadges.forEach((item) => {
54
- expect(badgeElement).toContainElement(screen.getByText(item))
55
- })
56
- })
57
- })
@@ -1,69 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import Image, { type ImageProps } from 'next/image'
7
- import Badge from '@hashicorp/react-design-system-components/src/components/badge'
8
- import FlightIcon from '@hashicorp/react-design-system-components/src/components/flight-icon'
9
- import { TextPlus } from '@hashicorp/react-design-system-components/src/components/text'
10
- import * as CardPrimitives from '../primitives'
11
- import type { CardProps } from '../types'
12
- import s from './style.module.css'
13
-
14
- export interface PartnerCardProps {
15
- heading: string
16
- description: string
17
- meta: string[]
18
- link: string
19
- productBadges?: CardProps['productBadges']
20
- competencyBadges?: string[]
21
- logo: ImageProps
22
- className?: string
23
- }
24
-
25
- export function PartnerCard({
26
- heading,
27
- description,
28
- meta,
29
- link,
30
- productBadges,
31
- competencyBadges,
32
- logo,
33
- className,
34
- }: PartnerCardProps) {
35
- const hasProductBadges = productBadges && productBadges.length > 0
36
- const hasCompetencyBadges = competencyBadges && competencyBadges.length > 0
37
-
38
- return (
39
- <CardPrimitives.Card
40
- heading={heading}
41
- link={link}
42
- withArrow={false}
43
- isExternal={false}
44
- className={className}
45
- >
46
- <div className={s.logoContainer}>
47
- <Image {...logo} alt={logo.alt} className={s.logo} />
48
- </div>
49
- <CardPrimitives.Content>
50
- <CardPrimitives.Meta items={meta} />
51
- <TextPlus.Body tag="p" size="200" className={s.description}>
52
- {description}
53
- </TextPlus.Body>
54
- {hasProductBadges || hasCompetencyBadges ? (
55
- <CardPrimitives.ProductBadges badges={productBadges || []}>
56
- {hasCompetencyBadges &&
57
- competencyBadges.map((competencyBadge, stableIdx) => (
58
- <Badge
59
- key={stableIdx}
60
- text={competencyBadge}
61
- icon={<FlightIcon name="dot" stretched />}
62
- />
63
- ))}
64
- </CardPrimitives.ProductBadges>
65
- ) : null}
66
- </CardPrimitives.Content>
67
- </CardPrimitives.Card>
68
- )
69
- }
@@ -1,24 +0,0 @@
1
- .description {
2
- -webkit-box-orient: vertical;
3
- display: -webkit-box;
4
- -webkit-line-clamp: 4;
5
- max-width: 100%;
6
- overflow: hidden;
7
- }
8
-
9
- .logoContainer {
10
- position: relative;
11
- display: flex;
12
- aspect-ratio: 16 / 9;
13
- overflow: hidden;
14
- align-items: center;
15
- justify-content: center;
16
- background: var(--token-color-surface-faint);
17
- }
18
-
19
- .logo {
20
- max-width: 232px;
21
- max-height: 64px;
22
- height: auto;
23
- width: auto;
24
- }
@@ -1,71 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import { render, screen } from '@testing-library/react'
7
- import { PersonCard } from './index'
8
-
9
- const defaultProps = {
10
- link: 'https://hashicorp.com',
11
- name: 'Example name',
12
- bio: 'Example bio',
13
- location: 'Example location',
14
- meta: ['August 15, 2022', 'Category'],
15
- thumbnail: {
16
- src: 'https://www.datocms-assets.com/19447/1648680074-screenshot-2022-03-31-at-00-40-47.png',
17
- alt: 'HashiConf Europe 2022 Recap',
18
- },
19
- }
20
-
21
- describe('<PersonCard />', () => {
22
- // Prop tests
23
- it('should render the provided name prop', () => {
24
- render(<PersonCard {...defaultProps} />)
25
-
26
- const name = screen.getByText(defaultProps.name)
27
- expect(name.tagName).toBe('H2')
28
- })
29
-
30
- it('should render the provided bio prop', () => {
31
- render(<PersonCard {...defaultProps} />)
32
-
33
- const bio = screen.getByText(defaultProps.bio)
34
- expect(bio.tagName).toBe('P')
35
- })
36
-
37
- it('should render the provided location prop', () => {
38
- render(<PersonCard {...defaultProps} />)
39
-
40
- const location = screen.getByText(defaultProps.location)
41
- expect(location.tagName).toBe('P')
42
- })
43
-
44
- it('should render the correct thumbnail icon based on the provided link prop', () => {
45
- const links = {
46
- github: 'https://github.com',
47
- twitter: 'https://twitter.com',
48
- linkedin: 'https://linkedin.com',
49
- link: 'https://example.com',
50
- mail: 'mailto:name@example.com',
51
- }
52
-
53
- render(
54
- <>
55
- {Object.keys(links).map((platform) => (
56
- <PersonCard key={platform} {...defaultProps} link={links[platform]} />
57
- ))}
58
- </>
59
- )
60
-
61
- Object.keys(links).forEach((platform) => {
62
- screen.getByTestId(`wpl-personcard-${platform}-icon`)
63
- })
64
- })
65
-
66
- it('should not render a thumbnail icon when link is on hashicorp.com', () => {
67
- render(<PersonCard {...defaultProps} link="https://hashicorp.com" />)
68
-
69
- expect(screen.queryByTestId('wpl-personcard-link-icon')).toBeNull()
70
- })
71
- })
@@ -1,93 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import { memo, type ReactNode } from 'react'
7
- import { TextPlus } from '@hashicorp/react-design-system-components/src/components/text'
8
- import { IconGithub16 } from '@hashicorp/flight-icons/svg-react/github-16'
9
- import { IconTwitter16 } from '@hashicorp/flight-icons/svg-react/twitter-16'
10
- import { IconLinkedin16 } from '@hashicorp/flight-icons/svg-react/linkedin-16'
11
- import { IconLink16 } from '@hashicorp/flight-icons/svg-react/link-16'
12
- import { IconMail16 } from '@hashicorp/flight-icons/svg-react/mail-16'
13
- import type { ProductBadgesProps, ThumbnailProps } from '../types'
14
- import * as CardPrimitives from '../primitives'
15
- import s from './style.module.css'
16
-
17
- export interface PersonCardProps {
18
- thumbnail: ThumbnailProps
19
- link: string
20
- name: string
21
- location?: string
22
- bio?: string
23
- productBadges?: ProductBadgesProps['badges']
24
- }
25
-
26
- // Map of hostnames to icons.
27
- /* eslint-disable react/jsx-key */
28
- const iconMap = new Map<string, ReactNode>([
29
- // null signals that we don't want to render any icon
30
- ['hashicorp.com', null],
31
- [
32
- 'twitter.com',
33
- <IconTwitter16 data-testid={'wpl-personcard-twitter-icon'} />,
34
- ],
35
- ['github.com', <IconGithub16 data-testid={'wpl-personcard-github-icon'} />],
36
- [
37
- 'linkedin.com',
38
- <IconLinkedin16 data-testid={'wpl-personcard-linkedin-icon'} />,
39
- ],
40
- ['mailto:', <IconMail16 data-testid={'wpl-personcard-mail-icon'} />],
41
- ])
42
- /* eslint-enable react/jsx-key */
43
-
44
- const Icon = memo(function Icon({ url }: { url: string }) {
45
- const { protocol, host } = new URL(url)
46
- const icon = iconMap.get(protocol === 'mailto:' ? 'mailto:' : host)
47
-
48
- // If the icon value is null, don't render an icon
49
- if (icon === null) {
50
- return null
51
- }
52
-
53
- // Render the icon or the default icon if the icon value is undefined
54
- return (
55
- <div className={s.thumbnailIcon}>
56
- {icon ?? <IconLink16 data-testid={'wpl-personcard-link-icon'} />}
57
- </div>
58
- )
59
- })
60
-
61
- export function PersonCard({
62
- link,
63
- thumbnail,
64
- name,
65
- location,
66
- bio,
67
- productBadges,
68
- }: PersonCardProps) {
69
- return (
70
- <CardPrimitives.Card heading={name} link={link} withArrow={false}>
71
- <div className={s.thumbnailContainer}>
72
- <CardPrimitives.PersonThumbnail {...thumbnail} />
73
- <Icon url={link} />
74
- </div>
75
- <CardPrimitives.Content>
76
- <div>
77
- <CardPrimitives.Heading>{name}</CardPrimitives.Heading>
78
- {location ? (
79
- <TextPlus.Body tag="p" size="200" className={s.location}>
80
- {location}
81
- </TextPlus.Body>
82
- ) : null}
83
- </div>
84
- {bio ? (
85
- <CardPrimitives.Description>{bio}</CardPrimitives.Description>
86
- ) : null}
87
- {productBadges && productBadges?.length > 0 ? (
88
- <CardPrimitives.ProductBadges badges={productBadges} />
89
- ) : null}
90
- </CardPrimitives.Content>
91
- </CardPrimitives.Card>
92
- )
93
- }
@@ -1,33 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- .location {
7
- margin: 0;
8
- color: var(--token-color-foreground-faint);
9
- }
10
-
11
- .thumbnailContainer {
12
- position: relative;
13
- }
14
-
15
- .thumbnailIcon {
16
- --size: 40px;
17
-
18
- position: absolute;
19
- bottom: 20px;
20
- right: 20px;
21
- width: var(--size);
22
- height: var(--size);
23
- display: grid;
24
- place-items: center;
25
- border-radius: 9999px;
26
- overflow: hidden;
27
- background-color: white;
28
- opacity: 0.5;
29
-
30
- & svg {
31
- position: relative;
32
- }
33
- }
@@ -1,176 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import * as React from 'react'
7
- import classNames from 'classnames'
8
- import Image from 'next/image'
9
- import Link from 'next/link'
10
- import HDSCard from '@hashicorp/react-design-system-components/src/components/card'
11
- import { TextPlus } from '@hashicorp/react-design-system-components/src/components/text'
12
- import { IconArrowRight24 } from '@hashicorp/flight-icons/svg-react/arrow-right-24'
13
- import ProductBadge from '../product-badge'
14
- import type {
15
- CardPrimitiveProps,
16
- ThumbnailProps,
17
- MetaProps,
18
- ContentProps,
19
- HeadingProps,
20
- ProductBadgesProps,
21
- DescriptionProps,
22
- } from './types'
23
- import s from './style.module.css'
24
-
25
- const Card = React.forwardRef<HTMLAnchorElement, CardPrimitiveProps>(
26
- (props, ref) => {
27
- const {
28
- withArrow = true,
29
- heading,
30
- link,
31
- clickHandler,
32
- isExternal,
33
- hasBorder = true,
34
- children,
35
- className,
36
- } = props
37
-
38
- const linkProps = isExternal
39
- ? { target: '_blank', rel: 'noopener noreferrer' }
40
- : {}
41
-
42
- return (
43
- <HDSCard
44
- level="mid"
45
- levelHover="high"
46
- className={classNames(s.card, className)}
47
- overflow="hidden"
48
- hasBorder={hasBorder}
49
- >
50
- <div className={s.contentContainer}>
51
- {children}
52
-
53
- <div className={s.cta} data-testid="wpl-card-cta">
54
- {withArrow ? <IconArrowRight24 /> : null}
55
- </div>
56
-
57
- <Link
58
- href={link}
59
- ref={ref}
60
- className={s.link}
61
- aria-label={heading}
62
- onClickCapture={clickHandler}
63
- {...linkProps}
64
- />
65
- </div>
66
- </HDSCard>
67
- )
68
- }
69
- )
70
-
71
- function Thumbnail({ src, alt }: ThumbnailProps) {
72
- return (
73
- <div className={s.thumbnail} data-testid="wpl-card-thumbnail">
74
- <div className={s.image}>
75
- <Image src={src} alt={alt} width={800} height={450} />
76
- </div>
77
- </div>
78
- )
79
- }
80
-
81
- function PersonThumbnail({ src, alt }: ThumbnailProps) {
82
- return (
83
- <div className={s.personThumbnail} data-testid="wpl-card-thumbnail">
84
- <div className={s.image}>
85
- <Image src={src} alt={alt} width={800} height={450} />
86
- </div>
87
- </div>
88
- )
89
- }
90
-
91
- function LogoThumbnail({ src, alt }: ThumbnailProps) {
92
- return (
93
- <div className={s.logoThumbnail} data-testid="wpl-card-logo-thumbnail">
94
- <div className={s.image}>
95
- <Image src={src} alt={alt} width={800} height={450} />
96
- </div>
97
- </div>
98
- )
99
- }
100
-
101
- function Meta({ items }: MetaProps) {
102
- return (
103
- <ul className={s.meta} data-testid="wpl-card-meta">
104
- {items.map((item, stableIdx) => {
105
- return (
106
- // eslint-disable-next-line react/no-array-index-key
107
- <li key={stableIdx}>
108
- <TextPlus.Label>
109
- {item}
110
- {stableIdx < items.length - 1 ? (
111
- <span className={s.metaSeparator} aria-hidden={true}>
112
- |
113
- </span>
114
- ) : null}
115
- </TextPlus.Label>
116
- </li>
117
- )
118
- })}
119
- </ul>
120
- )
121
- }
122
-
123
- function Content({ children }: ContentProps) {
124
- return (
125
- <div className={s.content} data-testid="wpl-card-content">
126
- {children}
127
- </div>
128
- )
129
- }
130
-
131
- function Heading({ as = 'h2', children }: HeadingProps) {
132
- return (
133
- <TextPlus.DisplayExpressive tag={as} size="200" className={s.heading}>
134
- {children}
135
- </TextPlus.DisplayExpressive>
136
- )
137
- }
138
-
139
- function ProductBadges({ badges, children }: ProductBadgesProps) {
140
- return (
141
- <div className={s.productBadges} data-testid="wpl-card-badges">
142
- {badges.map((badge, stableIdx) => {
143
- return (
144
- <ProductBadge
145
- // eslint-disable-next-line react/no-array-index-key
146
- key={`product-badge-${stableIdx}`}
147
- productName={badge}
148
- hasDot={true}
149
- />
150
- )
151
- })}
152
- {children}
153
- </div>
154
- )
155
- }
156
-
157
- function Description({ children }: DescriptionProps) {
158
- return (
159
- <TextPlus.Body tag="p" size="200" className={s.description}>
160
- {children}
161
- </TextPlus.Body>
162
- )
163
- }
164
-
165
- Card.displayName = 'Card'
166
- export {
167
- Card,
168
- Thumbnail,
169
- PersonThumbnail,
170
- LogoThumbnail,
171
- Meta,
172
- Content,
173
- Heading,
174
- Description,
175
- ProductBadges,
176
- }
@@ -1,51 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import * as CardPrimitives from '../primitives'
7
- import type { ThumbnailProps } from '../types'
8
-
9
- export interface PromoCardProps {
10
- heading: string
11
- description?: string
12
- eyebrow?: string
13
- link: string
14
- clickHandler?: () => void
15
- thumbnail?: ThumbnailProps
16
- withArrow?: boolean
17
- isExternal?: boolean
18
- className?: string
19
- }
20
-
21
- export function PromoCard({
22
- heading,
23
- description,
24
- eyebrow,
25
- link,
26
- clickHandler,
27
- thumbnail,
28
- withArrow = false,
29
- isExternal = false,
30
- className,
31
- }: PromoCardProps) {
32
- return (
33
- <CardPrimitives.Card
34
- heading={heading}
35
- link={link}
36
- withArrow={withArrow}
37
- isExternal={isExternal}
38
- className={className}
39
- clickHandler={clickHandler}
40
- >
41
- {thumbnail ? <CardPrimitives.Thumbnail {...thumbnail} /> : null}
42
- <CardPrimitives.Content>
43
- {eyebrow ? <CardPrimitives.Meta items={[eyebrow]} /> : null}
44
- <CardPrimitives.Heading>{heading}</CardPrimitives.Heading>
45
- {description ? (
46
- <CardPrimitives.Description>{description}</CardPrimitives.Description>
47
- ) : null}
48
- </CardPrimitives.Content>
49
- </CardPrimitives.Card>
50
- )
51
- }