@hashicorp/react-components 0.0.0-canary.3a0af3d → 0.0.0-canary.3cd4069

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