@hashicorp/react-components 0.0.0-nightly.d1a8734 → 0.0.0-nightly.e6fe953

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 (164) hide show
  1. package/package.json +9 -10
  2. package/src/components/nav-panel/components/flight-icon/index.tsx +51 -0
  3. package/src/components/nav-panel/components/flight-icon/style.module.css +3 -0
  4. package/src/components/nav-panel/components/link-list/index.tsx +15 -9
  5. package/src/components/nav-panel/components/link-list/style.module.css +10 -10
  6. package/src/components/nav-panel/components/panel/column/index.tsx +17 -2
  7. package/src/components/nav-panel/components/panel/column/style.module.css +13 -3
  8. package/src/components/nav-panel/components/panel/root/index.tsx +13 -2
  9. package/src/components/nav-panel/components/panel/root/style.module.css +20 -5
  10. package/src/components/nav-panel/components/promo/index.tsx +25 -12
  11. package/src/components/nav-panel/components/promo/style.module.css +48 -16
  12. package/src/components/nav-panel/components/text/index.tsx +34 -0
  13. package/src/components/nav-panel/product-panel/index.tsx +124 -31
  14. package/src/components/nav-panel/product-panel/style.module.css +263 -21
  15. package/src/components/nav-panel/standard-panel/index.tsx +4 -1
  16. package/src/components/nav-panel/standard-panel/style.module.css +2 -2
  17. package/src/lib/get-localized-link-props/index.test.ts +30 -0
  18. package/src/lib/get-localized-link-props/index.ts +45 -0
  19. package/src/lib/parse-url/index.test.ts +69 -0
  20. package/src/lib/parse-url/index.ts +98 -0
  21. package/src/lib/send-posthog-event/index.ts +22 -0
  22. package/src/lib/supported-locales/index.ts +1 -0
  23. package/src/lib/track-nav-click-event/index.ts +22 -0
  24. package/src/lib/v/index.ts +10 -0
  25. package/src/components/actions/index.tsx +0 -107
  26. package/src/components/actions/style.module.css +0 -28
  27. package/src/components/actions/types.ts +0 -73
  28. package/src/components/call-to-action/index.tsx +0 -205
  29. package/src/components/call-to-action/styles/variant-centered.module.css +0 -93
  30. package/src/components/call-to-action/styles/variant-compact-grid.module.css +0 -88
  31. package/src/components/call-to-action/styles/variant-compact.module.css +0 -91
  32. package/src/components/call-to-action/styles/variant-links.module.css +0 -85
  33. package/src/components/card/README.md +0 -11
  34. package/src/components/card/card.tsx +0 -45
  35. package/src/components/card/index.test.tsx +0 -69
  36. package/src/components/card/index.tsx +0 -14
  37. package/src/components/card/newsroom-card/index.test.tsx +0 -39
  38. package/src/components/card/newsroom-card/index.tsx +0 -37
  39. package/src/components/card/newsroom-card/style.module.css +0 -12
  40. package/src/components/card/partner-card/index.test.tsx +0 -57
  41. package/src/components/card/partner-card/index.tsx +0 -69
  42. package/src/components/card/partner-card/style.module.css +0 -24
  43. package/src/components/card/person-card/index.test.tsx +0 -71
  44. package/src/components/card/person-card/index.tsx +0 -93
  45. package/src/components/card/person-card/style.module.css +0 -33
  46. package/src/components/card/primitives.tsx +0 -176
  47. package/src/components/card/promo-card/index.tsx +0 -51
  48. package/src/components/card/resource-card/index.test.tsx +0 -48
  49. package/src/components/card/resource-card/index.tsx +0 -37
  50. package/src/components/card/style.module.css +0 -145
  51. package/src/components/card/types.ts +0 -66
  52. package/src/components/card/unified-card/index.tsx +0 -64
  53. package/src/components/consent-manager/README.md +0 -73
  54. package/src/components/consent-manager/components/banner/banner.module.css +0 -23
  55. package/src/components/consent-manager/components/banner/banner.test.tsx +0 -31
  56. package/src/components/consent-manager/components/banner/banner.tsx +0 -73
  57. package/src/components/consent-manager/components/dialog/dialog.module.css +0 -145
  58. package/src/components/consent-manager/components/dialog/dialog.test.tsx +0 -194
  59. package/src/components/consent-manager/components/dialog/dialog.tsx +0 -339
  60. package/src/components/consent-manager/img/icn_close.tsx +0 -19
  61. package/src/components/consent-manager/index.test.tsx +0 -334
  62. package/src/components/consent-manager/index.tsx +0 -186
  63. package/src/components/consent-manager/loader/README.md +0 -29
  64. package/src/components/consent-manager/loader/categories.ts +0 -22
  65. package/src/components/consent-manager/loader/index.tsx +0 -94
  66. package/src/components/consent-manager/loader/presets/enterprise.ts +0 -12
  67. package/src/components/consent-manager/loader/presets/oss.ts +0 -10
  68. package/src/components/consent-manager/loader/services.ts +0 -45
  69. package/src/components/consent-manager/scripts/custom.tsx +0 -59
  70. package/src/components/consent-manager/scripts/segment.tsx +0 -87
  71. package/src/components/consent-manager/style.module.css +0 -9
  72. package/src/components/consent-manager/types.ts +0 -55
  73. package/src/components/consent-manager/util/cookies.test.ts +0 -75
  74. package/src/components/consent-manager/util/cookies.ts +0 -70
  75. package/src/components/consent-manager/util/integrations.test.ts +0 -115
  76. package/src/components/consent-manager/util/integrations.ts +0 -110
  77. package/src/components/intro/index.tsx +0 -82
  78. package/src/components/intro/style.module.css +0 -67
  79. package/src/components/intro/types.ts +0 -44
  80. package/src/components/marketo-form/CHANGELOG.md +0 -122
  81. package/src/components/marketo-form/README.md +0 -1
  82. package/src/components/marketo-form/contexts/FormMetadata.ts +0 -11
  83. package/src/components/marketo-form/docs.mdx +0 -197
  84. package/src/components/marketo-form/fixtures/index.ts +0 -185
  85. package/src/components/marketo-form/form/index.tsx +0 -369
  86. package/src/components/marketo-form/index.test.tsx +0 -320
  87. package/src/components/marketo-form/index.ts +0 -11
  88. package/src/components/marketo-form/package.original.json +0 -30
  89. package/src/components/marketo-form/partials/error-message/index.tsx +0 -12
  90. package/src/components/marketo-form/partials/error-message/style.module.css +0 -13
  91. package/src/components/marketo-form/partials/field/index.tsx +0 -90
  92. package/src/components/marketo-form/partials/field-wrapper/index.tsx +0 -26
  93. package/src/components/marketo-form/partials/fields/checkbox-field/index.tsx +0 -32
  94. package/src/components/marketo-form/partials/fields/email-field/index.tsx +0 -35
  95. package/src/components/marketo-form/partials/fields/form-page-url-field/index.tsx +0 -21
  96. package/src/components/marketo-form/partials/fields/hidden-field/index.tsx +0 -37
  97. package/src/components/marketo-form/partials/fields/htmltext-field/index.tsx +0 -21
  98. package/src/components/marketo-form/partials/fields/htmltext-field/style.module.css +0 -18
  99. package/src/components/marketo-form/partials/fields/name-field/index.tsx +0 -19
  100. package/src/components/marketo-form/partials/fields/name-field/style.module.css +0 -13
  101. package/src/components/marketo-form/partials/fields/radio-buttons-field/index.tsx +0 -48
  102. package/src/components/marketo-form/partials/fields/select-field/index.tsx +0 -39
  103. package/src/components/marketo-form/partials/fields/select-field/style.module.css +0 -5
  104. package/src/components/marketo-form/partials/fields/telephone-field/index.tsx +0 -30
  105. package/src/components/marketo-form/partials/fields/text-field/index.tsx +0 -30
  106. package/src/components/marketo-form/partials/fields/textarea-field/index.tsx +0 -29
  107. package/src/components/marketo-form/partials/label/index.tsx +0 -24
  108. package/src/components/marketo-form/partials/label/style.module.css +0 -12
  109. package/src/components/marketo-form/partials/visibility-rule/index.tsx +0 -84
  110. package/src/components/marketo-form/props.js +0 -66
  111. package/src/components/marketo-form/server/api-routes.ts +0 -109
  112. package/src/components/marketo-form/server/client.ts +0 -98
  113. package/src/components/marketo-form/server/index.ts +0 -8
  114. package/src/components/marketo-form/types.ts +0 -268
  115. package/src/components/marketo-form/utils.test.tsx +0 -103
  116. package/src/components/marketo-form/utils.ts +0 -445
  117. package/src/components/next-steps/index.tsx +0 -137
  118. package/src/components/next-steps/style.module.css +0 -270
  119. package/src/components/next-steps/types.ts +0 -63
  120. package/src/components/product-badge/index.test.tsx +0 -11
  121. package/src/components/product-badge/index.tsx +0 -42
  122. package/src/components/product-badge/style.module.css +0 -76
  123. package/src/components/products-used/index.tsx +0 -84
  124. package/src/components/products-used/style.module.css +0 -87
  125. package/src/components/products-used/types.ts +0 -31
  126. package/src/components/related-content/index.test.tsx +0 -74
  127. package/src/components/related-content/index.tsx +0 -56
  128. package/src/components/related-content/style.module.css +0 -89
  129. package/src/components/related-content/types.ts +0 -21
  130. package/src/components/subnav/helpers/areBasePathsMatching.ts +0 -13
  131. package/src/components/subnav/helpers/traverse/index.ts +0 -42
  132. package/src/components/subnav/helpers/useHeightRef.ts +0 -42
  133. package/src/components/subnav/helpers/useNavRef.ts +0 -30
  134. package/src/components/subnav/helpers/useOverflowRef.ts +0 -85
  135. package/src/components/subnav/helpers/useStuckRef.ts +0 -51
  136. package/src/components/subnav/index.tsx +0 -199
  137. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.test.ts +0 -26
  138. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.ts +0 -22
  139. package/src/components/subnav/partials/CtaLinks/github-stars-link/index.tsx +0 -87
  140. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.test.ts +0 -29
  141. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.ts +0 -32
  142. package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +0 -85
  143. package/src/components/subnav/partials/CtaLinks/icons/github-logo.js +0 -20
  144. package/src/components/subnav/partials/CtaLinks/icons/github.svg.js +0 -7
  145. package/src/components/subnav/partials/CtaLinks/icons/star.js +0 -20
  146. package/src/components/subnav/partials/CtaLinks/index.tsx +0 -130
  147. package/src/components/subnav/partials/CtaLinks/style.module.css +0 -45
  148. package/src/components/subnav/partials/DropdownTrigger/index.tsx +0 -35
  149. package/src/components/subnav/partials/DropdownTrigger/style.module.css +0 -36
  150. package/src/components/subnav/partials/MenuItemsDefault/index.tsx +0 -151
  151. package/src/components/subnav/partials/MenuItemsDefault/style.module.css +0 -91
  152. package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +0 -139
  153. package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +0 -82
  154. package/src/components/subnav/partials/TitleLink/index.tsx +0 -113
  155. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts +0 -9
  156. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts +0 -9
  157. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-dark.ts +0 -23
  158. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-light.ts +0 -23
  159. package/src/components/subnav/partials/TitleLink/style.module.css +0 -43
  160. package/src/components/subnav/partials/nav-item-text/index.tsx +0 -37
  161. package/src/components/subnav/partials/nav-item-text/style.module.css +0 -15
  162. package/src/components/subnav/style.module.css +0 -68
  163. package/src/components/subnav/subnav-consts.ts +0 -1
  164. package/src/components/subnav/theme.module.css +0 -50
@@ -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
- }
@@ -1,48 +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 { ResourceCard } from '.'
8
-
9
- const defaultProps = {
10
- link: 'https://hashicorp.com',
11
- heading: 'Example heading',
12
- date: 'August 15, 2022',
13
- category: 'Category',
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('<ResourceCard />', () => {
21
- it('should render the provided date and category with separator', () => {
22
- const expectedMeta = [defaultProps.date, defaultProps.category]
23
-
24
- render(<ResourceCard {...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.getByText('|'))
33
- })
34
-
35
- it('should not render the date if no date is provided', () => {
36
- const defaultPropsWithoutDate = { ...defaultProps, date: '' }
37
-
38
- render(<ResourceCard {...defaultPropsWithoutDate} />)
39
-
40
- const metaElement = screen.getByTestId('wpl-card-meta')
41
-
42
- expect(metaElement).toContainElement(
43
- screen.getByText(defaultProps.category)
44
- )
45
-
46
- expect(metaElement).not.toContainElement(screen.queryByText('|'))
47
- })
48
- })
@@ -1,37 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import type { CardProps, ThumbnailProps } from '../types'
7
- import { UnifiedCard } from '../unified-card'
8
-
9
- export interface ResourceCardProps {
10
- heading: string
11
- date?: string
12
- category: string
13
- link: string
14
- productBadges?: CardProps['productBadges']
15
- thumbnail: ThumbnailProps
16
- }
17
-
18
- export function ResourceCard({
19
- heading,
20
- date,
21
- category,
22
- link,
23
- productBadges,
24
- thumbnail,
25
- }: ResourceCardProps) {
26
- const meta: string[] = date ? [date, category] : [category]
27
-
28
- return (
29
- <UnifiedCard
30
- heading={heading}
31
- link={link}
32
- meta={meta}
33
- productBadges={productBadges}
34
- thumbnail={thumbnail}
35
- />
36
- )
37
- }