@hashicorp/react-components 0.0.0-nightly.97eb452 → 0.0.0-nightly.9aa5827

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 (143) hide show
  1. package/.eslintrc.js +1 -2
  2. package/.stylelintrc.js +1 -1
  3. package/README.md +1 -1
  4. package/package.json +3 -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 +26 -12
  16. package/src/components/nav-panel/components/text/index.tsx +34 -0
  17. package/src/components/nav-panel/product-panel/index.tsx +54 -17
  18. package/src/components/nav-panel/product-panel/style.module.css +116 -36
  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 +30 -1
  24. package/src/lib/parse-url/index.ts +71 -8
  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 +4 -4
  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 -177
  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.spec.tsx +0 -40
  56. package/src/components/card/unified-card/index.tsx +0 -58
  57. package/src/components/intro/index.tsx +0 -82
  58. package/src/components/intro/style.module.css +0 -67
  59. package/src/components/intro/types.ts +0 -44
  60. package/src/components/marketo-form/CHANGELOG.md +0 -122
  61. package/src/components/marketo-form/README.md +0 -1
  62. package/src/components/marketo-form/contexts/FormMetadata.ts +0 -13
  63. package/src/components/marketo-form/docs.mdx +0 -197
  64. package/src/components/marketo-form/fixtures/index.ts +0 -185
  65. package/src/components/marketo-form/form/index.tsx +0 -371
  66. package/src/components/marketo-form/index.test.tsx +0 -320
  67. package/src/components/marketo-form/index.ts +0 -11
  68. package/src/components/marketo-form/package.original.json +0 -30
  69. package/src/components/marketo-form/partials/error-message/index.tsx +0 -12
  70. package/src/components/marketo-form/partials/error-message/style.module.css +0 -13
  71. package/src/components/marketo-form/partials/field/index.tsx +0 -90
  72. package/src/components/marketo-form/partials/field-wrapper/index.tsx +0 -26
  73. package/src/components/marketo-form/partials/fields/checkbox-field/index.tsx +0 -32
  74. package/src/components/marketo-form/partials/fields/email-field/index.tsx +0 -35
  75. package/src/components/marketo-form/partials/fields/form-page-url-field/index.tsx +0 -23
  76. package/src/components/marketo-form/partials/fields/hidden-field/index.tsx +0 -38
  77. package/src/components/marketo-form/partials/fields/htmltext-field/index.tsx +0 -21
  78. package/src/components/marketo-form/partials/fields/htmltext-field/style.module.css +0 -18
  79. package/src/components/marketo-form/partials/fields/name-field/index.tsx +0 -19
  80. package/src/components/marketo-form/partials/fields/name-field/style.module.css +0 -13
  81. package/src/components/marketo-form/partials/fields/radio-buttons-field/index.tsx +0 -48
  82. package/src/components/marketo-form/partials/fields/select-field/index.tsx +0 -39
  83. package/src/components/marketo-form/partials/fields/select-field/style.module.css +0 -5
  84. package/src/components/marketo-form/partials/fields/telephone-field/index.tsx +0 -30
  85. package/src/components/marketo-form/partials/fields/text-field/index.tsx +0 -30
  86. package/src/components/marketo-form/partials/fields/textarea-field/index.tsx +0 -29
  87. package/src/components/marketo-form/partials/label/index.tsx +0 -24
  88. package/src/components/marketo-form/partials/label/style.module.css +0 -12
  89. package/src/components/marketo-form/partials/visibility-rule/index.tsx +0 -84
  90. package/src/components/marketo-form/props.js +0 -66
  91. package/src/components/marketo-form/server/api-routes.ts +0 -109
  92. package/src/components/marketo-form/server/client.ts +0 -98
  93. package/src/components/marketo-form/server/index.ts +0 -8
  94. package/src/components/marketo-form/types.ts +0 -268
  95. package/src/components/marketo-form/utils.test.tsx +0 -103
  96. package/src/components/marketo-form/utils.ts +0 -449
  97. package/src/components/next-steps/index.tsx +0 -138
  98. package/src/components/next-steps/style.module.css +0 -270
  99. package/src/components/next-steps/types.ts +0 -63
  100. package/src/components/product-badge/index.test.tsx +0 -11
  101. package/src/components/product-badge/index.tsx +0 -42
  102. package/src/components/product-badge/style.module.css +0 -76
  103. package/src/components/products-used/index.tsx +0 -84
  104. package/src/components/products-used/style.module.css +0 -87
  105. package/src/components/products-used/types.ts +0 -31
  106. package/src/components/related-content/index.test.tsx +0 -74
  107. package/src/components/related-content/index.tsx +0 -56
  108. package/src/components/related-content/style.module.css +0 -89
  109. package/src/components/related-content/types.ts +0 -21
  110. package/src/components/subnav/helpers/areBasePathsMatching.ts +0 -13
  111. package/src/components/subnav/helpers/traverse/index.ts +0 -42
  112. package/src/components/subnav/helpers/useHeightRef.ts +0 -42
  113. package/src/components/subnav/helpers/useNavRef.ts +0 -30
  114. package/src/components/subnav/helpers/useOverflowRef.ts +0 -85
  115. package/src/components/subnav/helpers/useStuckRef.ts +0 -51
  116. package/src/components/subnav/index.tsx +0 -203
  117. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.test.ts +0 -26
  118. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.ts +0 -22
  119. package/src/components/subnav/partials/CtaLinks/github-stars-link/index.tsx +0 -87
  120. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.test.ts +0 -29
  121. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.ts +0 -32
  122. package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +0 -81
  123. package/src/components/subnav/partials/CtaLinks/icons/github-logo.js +0 -20
  124. package/src/components/subnav/partials/CtaLinks/icons/github.svg.js +0 -7
  125. package/src/components/subnav/partials/CtaLinks/icons/star.js +0 -20
  126. package/src/components/subnav/partials/CtaLinks/index.tsx +0 -131
  127. package/src/components/subnav/partials/CtaLinks/style.module.css +0 -45
  128. package/src/components/subnav/partials/DropdownTrigger/index.tsx +0 -35
  129. package/src/components/subnav/partials/DropdownTrigger/style.module.css +0 -39
  130. package/src/components/subnav/partials/MenuItemsDefault/index.tsx +0 -158
  131. package/src/components/subnav/partials/MenuItemsDefault/style.module.css +0 -104
  132. package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +0 -143
  133. package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +0 -88
  134. package/src/components/subnav/partials/TitleLink/index.tsx +0 -113
  135. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts +0 -10
  136. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts +0 -10
  137. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-dark.ts +0 -23
  138. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-light.ts +0 -23
  139. package/src/components/subnav/partials/TitleLink/style.module.css +0 -43
  140. package/src/components/subnav/partials/nav-item-text/index.tsx +0 -37
  141. package/src/components/subnav/partials/nav-item-text/style.module.css +0 -13
  142. package/src/components/subnav/style.module.css +0 -66
  143. package/src/components/subnav/subnav-consts.ts +0 -1
@@ -1,88 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- .root {
7
- --background: var(--white);
8
- --text-color-display: var(--gray-1);
9
- --text-color-body: var(--gray-2);
10
-
11
- background: var(--background);
12
- padding: 48px 0;
13
-
14
- @media (--medium) {
15
- padding: 64px 0;
16
- }
17
- @media (--large) {
18
- padding: 88px 0;
19
- }
20
-
21
- &.theme-gray {
22
- --background: var(--gray-6);
23
- }
24
-
25
- &.theme-dark {
26
- --background: var(--black);
27
- --text-color-display: var(--white);
28
- --text-color-body: var(--gray-5);
29
- }
30
-
31
- &.theme-brand {
32
- --background: var(--brand);
33
- --text-color-display: var(--white);
34
- --text-color-body: var(--gray-6);
35
- }
36
- }
37
-
38
- .container {
39
- composes: g-grid-container from global;
40
- composes: g-grid from global;
41
- }
42
-
43
- .heading {
44
- grid-column: 1 / -1;
45
- composes: g-type-display-2 from global;
46
- color: var(--text-color-display);
47
- margin: 0;
48
-
49
- @media (--medium-up) {
50
- grid-column: 1 / 5;
51
- }
52
- }
53
-
54
- .contentAndLinks {
55
- grid-column: 1 / -1;
56
- @media (--medium-up) {
57
- grid-column: 6 / -1;
58
- }
59
- }
60
-
61
- .content {
62
- composes: g-type-body-large from global;
63
- color: var(--text-color-body);
64
- margin: 0;
65
- max-width: 35em;
66
-
67
- &.hasHeading {
68
- margin-top: 16px;
69
-
70
- @media (--medium-up) {
71
- margin: 0;
72
- }
73
- }
74
- }
75
-
76
- .links {
77
- margin-top: 32px;
78
- margin-bottom: -16px;
79
-
80
- @media (--large) {
81
- margin-top: 40px;
82
- }
83
- }
84
-
85
- .button {
86
- margin-right: 16px;
87
- margin-bottom: 16px;
88
- }
@@ -1,91 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- .root {
7
- --background: var(--white);
8
- --text-color-display: var(--gray-1);
9
- --text-color-body: var(--gray-2);
10
-
11
- background: var(--background);
12
- padding: 48px 0;
13
-
14
- @media (--medium) {
15
- padding: 64px 0;
16
- }
17
- @media (--large) {
18
- padding: 88px 0;
19
- }
20
-
21
- &.theme-gray {
22
- --background: var(--gray-6);
23
- }
24
-
25
- &.theme-dark {
26
- --background: var(--black);
27
- --text-color-display: var(--white);
28
- --text-color-body: var(--gray-5);
29
- }
30
-
31
- &.theme-brand {
32
- --background: var(--brand);
33
- --text-color-display: var(--white);
34
- --text-color-body: var(--gray-6);
35
- }
36
- }
37
-
38
- .container {
39
- composes: g-grid-container from global;
40
-
41
- @media (--medium-up) {
42
- display: flex;
43
- }
44
- }
45
-
46
- .heading {
47
- composes: g-type-display-2 from global;
48
- color: var(--text-color-display);
49
- margin: 0;
50
-
51
- @media (--medium-up) {
52
- flex-basis: 33.3%;
53
- padding-right: 32px;
54
- }
55
- }
56
-
57
- .contentAndLinks {
58
- @media (--medium-up) {
59
- flex-basis: 66.6%;
60
- margin-left: 32px;
61
- }
62
- }
63
-
64
- .content {
65
- composes: g-type-body-large from global;
66
- color: var(--text-color-body);
67
- margin: 0;
68
- max-width: 35em;
69
-
70
- &.hasHeading {
71
- margin-top: 16px;
72
-
73
- @media (--medium-up) {
74
- margin: 0;
75
- }
76
- }
77
- }
78
-
79
- .links {
80
- margin-top: 32px;
81
- margin-bottom: -16px;
82
-
83
- @media (--large) {
84
- margin-top: 40px;
85
- }
86
- }
87
-
88
- .button {
89
- margin-right: 16px;
90
- margin-bottom: 16px;
91
- }
@@ -1,85 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- .root {
7
- --background: var(--white);
8
- --text-color-display: var(--gray-1);
9
- --text-color-body: var(--gray-2);
10
-
11
- background: var(--background);
12
- padding: 64px 0;
13
-
14
- @media (--medium) {
15
- padding: 88px 0;
16
- }
17
- @media (--large) {
18
- padding: 128px 0;
19
- }
20
-
21
- &.theme-gray {
22
- --background: var(--gray-6);
23
- }
24
-
25
- &.theme-dark {
26
- --background: var(--black);
27
- --text-color-display: var(--white);
28
- --text-color-body: var(--gray-5);
29
- }
30
-
31
- &.theme-brand {
32
- --background: var(--brand);
33
- --text-color-display: var(--white);
34
- --text-color-body: var(--gray-6);
35
- }
36
- }
37
-
38
- .container {
39
- composes: g-grid-container from global;
40
- }
41
-
42
- .heading {
43
- composes: g-type-display-2 from global;
44
- color: var(--text-color-display);
45
- margin: 0;
46
- }
47
-
48
- .content {
49
- composes: g-type-body-large from global;
50
- color: var(--text-color-body);
51
- margin: 0;
52
- max-width: 30em;
53
-
54
- &.hasHeading {
55
- margin-top: 16px;
56
-
57
- @media (--large) {
58
- margin-top: 24px;
59
- }
60
- }
61
- }
62
-
63
- .links {
64
- margin-top: 32px;
65
-
66
- @media (--large) {
67
- margin-top: 40px;
68
- }
69
-
70
- &::after {
71
- display: block;
72
- float: none;
73
- content: '';
74
- clear: both;
75
- }
76
- }
77
-
78
- .button {
79
- display: block;
80
- float: left;
81
- clear: both;
82
- & + .g-btn {
83
- margin-top: 8px;
84
- }
85
- }
@@ -1,11 +0,0 @@
1
- # Card
2
-
3
- A component used to promote and link to marketing pages, always using a descriptive heading but optionally other elements as needed.
4
-
5
- ### Props
6
-
7
- See [the props file](props.js) for more details.
8
-
9
- ### Notes
10
-
11
- Sub-components of this card can be directly accessed from the base component (e.g.: `<Card.Heading />`) and used to compose the card's `children`.
@@ -1,45 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import type { CardProps } from './types'
7
- import * as CardPrimitive from './primitives'
8
-
9
- function Card({
10
- withArrow,
11
- heading,
12
- link,
13
- thumbnail,
14
- meta,
15
- description,
16
- productBadges,
17
- isExternal,
18
- hasBorder,
19
- }: CardProps) {
20
- return (
21
- <CardPrimitive.Card
22
- withArrow={withArrow}
23
- heading={heading}
24
- link={link}
25
- isExternal={isExternal}
26
- hasBorder={hasBorder}
27
- >
28
- {thumbnail ? (
29
- <CardPrimitive.Thumbnail src={thumbnail.src} alt={thumbnail.alt} />
30
- ) : null}
31
- <CardPrimitive.Content>
32
- {meta && meta.length > 0 ? <CardPrimitive.Meta items={meta} /> : null}
33
- <CardPrimitive.Heading>{heading}</CardPrimitive.Heading>
34
- {description ? (
35
- <CardPrimitive.Description>{description}</CardPrimitive.Description>
36
- ) : null}
37
- {productBadges && productBadges?.length > 0 ? (
38
- <CardPrimitive.ProductBadges badges={productBadges} />
39
- ) : null}
40
- </CardPrimitive.Content>
41
- </CardPrimitive.Card>
42
- )
43
- }
44
-
45
- export default Card
@@ -1,69 +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 Card from './'
8
-
9
- const defaultProps = {
10
- link: 'https://hashicorp.com',
11
- heading: 'Example heading',
12
- description: 'Example description',
13
- meta: ['August 15, 2022', '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('<Card />', () => {
21
- // Prop tests
22
- it('should render the provided link prop', () => {
23
- render(<Card {...defaultProps} />)
24
-
25
- expect(screen.getByRole('link')).toHaveAttribute('href', defaultProps.link)
26
- })
27
-
28
- it('should render the provided heading prop', () => {
29
- render(<Card {...defaultProps} />)
30
-
31
- const heading = screen.getByText(defaultProps.heading)
32
- expect(heading.tagName).toBe('H2')
33
- })
34
-
35
- it('should render the provided description prop', () => {
36
- render(<Card {...defaultProps} />)
37
-
38
- const description = screen.getByText(defaultProps.description)
39
- expect(description.tagName).toBe('P')
40
- })
41
-
42
- it('should render the provided meta prop (single item)', () => {
43
- const cardMeta = ['Category']
44
-
45
- render(<Card {...defaultProps} meta={cardMeta} />)
46
-
47
- const metaElement = screen.getByTestId('wpl-card-meta')
48
- expect(metaElement).toContainElement(screen.getByText(cardMeta[0]))
49
- })
50
-
51
- it('should render the provided meta prop (two items)', () => {
52
- const cardMeta = ['August 15, 2022', 'Category']
53
-
54
- render(<Card {...defaultProps} />)
55
-
56
- const metaElement = screen.getByTestId('wpl-card-meta')
57
-
58
- cardMeta.forEach((item) => {
59
- expect(metaElement).toHaveTextContent(item)
60
- })
61
- expect(metaElement).toContainElement(screen.getByText('|'))
62
- })
63
-
64
- it('should render the provided thumbnail prop', () => {
65
- const { getByAltText } = render(<Card {...defaultProps} />)
66
-
67
- expect(getByAltText(defaultProps.thumbnail.alt).tagName).toBe('IMG')
68
- })
69
- })
@@ -1,14 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import Card from './card'
7
- import { NewsroomCard } from './newsroom-card'
8
- import { PersonCard } from './person-card'
9
- import { ResourceCard } from './resource-card'
10
- import { UnifiedCard } from './unified-card'
11
- import { PromoCard } from './promo-card'
12
-
13
- export default Card
14
- export { NewsroomCard, PersonCard, ResourceCard, UnifiedCard, PromoCard }
@@ -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).toHaveTextContent(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-hds/src/components/badge'
8
- import FlightIcon from '@hashicorp/react-hds/src/components/flight-icon'
9
- import { TextPlus } from '@hashicorp/react-hds/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
- }