@hashicorp/react-components 1.1.10 → 1.2.0

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 (173) hide show
  1. package/README.md +1 -1
  2. package/package.json +8 -13
  3. package/postcss.config.js +1 -1
  4. package/src/components/nav-panel/components/flight-icon/index.tsx +53 -0
  5. package/src/components/nav-panel/components/flight-icon/style.module.css +3 -0
  6. package/src/components/nav-panel/components/link/cloud-fill.svg +3 -0
  7. package/src/components/nav-panel/components/link/index.tsx +139 -0
  8. package/src/components/nav-panel/components/link/layers-fill.svg +5 -0
  9. package/src/components/nav-panel/components/link/shield-alert-fill.svg +3 -0
  10. package/src/components/nav-panel/components/link/style.module.css +64 -0
  11. package/src/components/nav-panel/components/link/zap-fill.svg +3 -0
  12. package/src/components/nav-panel/components/link-list/index.tsx +12 -64
  13. package/src/components/nav-panel/components/link-list/style.module.css +1 -50
  14. package/src/components/nav-panel/components/panel/column/style.module.css +2 -2
  15. package/src/components/nav-panel/components/panel/root/style.module.css +5 -5
  16. package/src/components/nav-panel/components/promo/index.tsx +35 -15
  17. package/src/components/nav-panel/components/promo/style.module.css +32 -28
  18. package/src/components/nav-panel/components/text/index.tsx +34 -0
  19. package/src/components/nav-panel/product-panel/index.tsx +71 -20
  20. package/src/components/nav-panel/product-panel/style.module.css +111 -53
  21. package/src/components/nav-panel/standard-panel/index.tsx +3 -0
  22. package/src/components/nav-panel/standard-panel/style.module.css +2 -2
  23. package/src/lib/get-localized-link-props/index.test.ts +30 -0
  24. package/src/lib/get-localized-link-props/index.ts +45 -0
  25. package/src/lib/parse-url/index.test.ts +57 -2
  26. package/src/lib/parse-url/index.ts +97 -13
  27. package/src/lib/send-posthog-event/index.ts +22 -0
  28. package/src/lib/supported-locales/index.ts +10 -0
  29. package/src/lib/track-nav-click-event/index.ts +5 -5
  30. package/src/lib/v/index.ts +9 -4
  31. package/tsconfig.json +1 -2
  32. package/.eslintrc.js +0 -4
  33. package/.stylelintrc.js +0 -3
  34. package/src/components/actions/index.tsx +0 -107
  35. package/src/components/actions/style.module.css +0 -28
  36. package/src/components/actions/types.ts +0 -73
  37. package/src/components/call-to-action/index.tsx +0 -205
  38. package/src/components/call-to-action/styles/variant-centered.module.css +0 -93
  39. package/src/components/call-to-action/styles/variant-compact-grid.module.css +0 -88
  40. package/src/components/call-to-action/styles/variant-compact.module.css +0 -91
  41. package/src/components/call-to-action/styles/variant-links.module.css +0 -85
  42. package/src/components/card/README.md +0 -11
  43. package/src/components/card/card.tsx +0 -45
  44. package/src/components/card/index.test.tsx +0 -69
  45. package/src/components/card/index.tsx +0 -14
  46. package/src/components/card/newsroom-card/index.test.tsx +0 -39
  47. package/src/components/card/newsroom-card/index.tsx +0 -37
  48. package/src/components/card/newsroom-card/style.module.css +0 -12
  49. package/src/components/card/partner-card/index.test.tsx +0 -57
  50. package/src/components/card/partner-card/index.tsx +0 -69
  51. package/src/components/card/partner-card/style.module.css +0 -24
  52. package/src/components/card/person-card/index.test.tsx +0 -71
  53. package/src/components/card/person-card/index.tsx +0 -93
  54. package/src/components/card/person-card/style.module.css +0 -33
  55. package/src/components/card/primitives.tsx +0 -176
  56. package/src/components/card/promo-card/index.tsx +0 -51
  57. package/src/components/card/resource-card/index.test.tsx +0 -48
  58. package/src/components/card/resource-card/index.tsx +0 -37
  59. package/src/components/card/style.module.css +0 -145
  60. package/src/components/card/types.ts +0 -66
  61. package/src/components/card/unified-card/index.tsx +0 -64
  62. package/src/components/consent-manager/README.md +0 -73
  63. package/src/components/consent-manager/components/banner/banner.module.css +0 -23
  64. package/src/components/consent-manager/components/banner/banner.test.tsx +0 -31
  65. package/src/components/consent-manager/components/banner/banner.tsx +0 -73
  66. package/src/components/consent-manager/components/dialog/dialog.module.css +0 -145
  67. package/src/components/consent-manager/components/dialog/dialog.test.tsx +0 -194
  68. package/src/components/consent-manager/components/dialog/dialog.tsx +0 -339
  69. package/src/components/consent-manager/img/icn_close.tsx +0 -19
  70. package/src/components/consent-manager/index.test.tsx +0 -334
  71. package/src/components/consent-manager/index.tsx +0 -186
  72. package/src/components/consent-manager/loader/README.md +0 -29
  73. package/src/components/consent-manager/loader/categories.ts +0 -22
  74. package/src/components/consent-manager/loader/index.tsx +0 -94
  75. package/src/components/consent-manager/loader/presets/enterprise.ts +0 -12
  76. package/src/components/consent-manager/loader/presets/oss.ts +0 -10
  77. package/src/components/consent-manager/loader/services.ts +0 -45
  78. package/src/components/consent-manager/scripts/custom.tsx +0 -59
  79. package/src/components/consent-manager/scripts/segment.tsx +0 -87
  80. package/src/components/consent-manager/style.module.css +0 -9
  81. package/src/components/consent-manager/types.ts +0 -55
  82. package/src/components/consent-manager/util/cookies.test.ts +0 -75
  83. package/src/components/consent-manager/util/cookies.ts +0 -70
  84. package/src/components/consent-manager/util/integrations.test.ts +0 -115
  85. package/src/components/consent-manager/util/integrations.ts +0 -110
  86. package/src/components/intro/index.tsx +0 -82
  87. package/src/components/intro/style.module.css +0 -67
  88. package/src/components/intro/types.ts +0 -44
  89. package/src/components/marketo-form/CHANGELOG.md +0 -122
  90. package/src/components/marketo-form/README.md +0 -1
  91. package/src/components/marketo-form/contexts/FormMetadata.ts +0 -11
  92. package/src/components/marketo-form/docs.mdx +0 -197
  93. package/src/components/marketo-form/fixtures/index.ts +0 -185
  94. package/src/components/marketo-form/form/index.tsx +0 -369
  95. package/src/components/marketo-form/index.test.tsx +0 -320
  96. package/src/components/marketo-form/index.ts +0 -11
  97. package/src/components/marketo-form/package.original.json +0 -30
  98. package/src/components/marketo-form/partials/error-message/index.tsx +0 -12
  99. package/src/components/marketo-form/partials/error-message/style.module.css +0 -13
  100. package/src/components/marketo-form/partials/field/index.tsx +0 -90
  101. package/src/components/marketo-form/partials/field-wrapper/index.tsx +0 -26
  102. package/src/components/marketo-form/partials/fields/checkbox-field/index.tsx +0 -32
  103. package/src/components/marketo-form/partials/fields/email-field/index.tsx +0 -35
  104. package/src/components/marketo-form/partials/fields/form-page-url-field/index.tsx +0 -21
  105. package/src/components/marketo-form/partials/fields/hidden-field/index.tsx +0 -37
  106. package/src/components/marketo-form/partials/fields/htmltext-field/index.tsx +0 -21
  107. package/src/components/marketo-form/partials/fields/htmltext-field/style.module.css +0 -18
  108. package/src/components/marketo-form/partials/fields/name-field/index.tsx +0 -19
  109. package/src/components/marketo-form/partials/fields/name-field/style.module.css +0 -13
  110. package/src/components/marketo-form/partials/fields/radio-buttons-field/index.tsx +0 -48
  111. package/src/components/marketo-form/partials/fields/select-field/index.tsx +0 -39
  112. package/src/components/marketo-form/partials/fields/select-field/style.module.css +0 -5
  113. package/src/components/marketo-form/partials/fields/telephone-field/index.tsx +0 -30
  114. package/src/components/marketo-form/partials/fields/text-field/index.tsx +0 -30
  115. package/src/components/marketo-form/partials/fields/textarea-field/index.tsx +0 -29
  116. package/src/components/marketo-form/partials/label/index.tsx +0 -24
  117. package/src/components/marketo-form/partials/label/style.module.css +0 -12
  118. package/src/components/marketo-form/partials/visibility-rule/index.tsx +0 -84
  119. package/src/components/marketo-form/props.js +0 -66
  120. package/src/components/marketo-form/server/api-routes.ts +0 -109
  121. package/src/components/marketo-form/server/client.ts +0 -98
  122. package/src/components/marketo-form/server/index.ts +0 -8
  123. package/src/components/marketo-form/types.ts +0 -268
  124. package/src/components/marketo-form/utils.test.tsx +0 -103
  125. package/src/components/marketo-form/utils.ts +0 -449
  126. package/src/components/next-steps/index.tsx +0 -137
  127. package/src/components/next-steps/style.module.css +0 -270
  128. package/src/components/next-steps/types.ts +0 -63
  129. package/src/components/product-badge/index.test.tsx +0 -11
  130. package/src/components/product-badge/index.tsx +0 -42
  131. package/src/components/product-badge/style.module.css +0 -76
  132. package/src/components/products-used/index.tsx +0 -84
  133. package/src/components/products-used/style.module.css +0 -87
  134. package/src/components/products-used/types.ts +0 -31
  135. package/src/components/related-content/index.test.tsx +0 -74
  136. package/src/components/related-content/index.tsx +0 -56
  137. package/src/components/related-content/style.module.css +0 -89
  138. package/src/components/related-content/types.ts +0 -21
  139. package/src/components/subnav/helpers/areBasePathsMatching.ts +0 -13
  140. package/src/components/subnav/helpers/traverse/index.ts +0 -42
  141. package/src/components/subnav/helpers/useHeightRef.ts +0 -42
  142. package/src/components/subnav/helpers/useNavRef.ts +0 -30
  143. package/src/components/subnav/helpers/useOverflowRef.ts +0 -85
  144. package/src/components/subnav/helpers/useStuckRef.ts +0 -51
  145. package/src/components/subnav/index.tsx +0 -199
  146. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.test.ts +0 -26
  147. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.ts +0 -22
  148. package/src/components/subnav/partials/CtaLinks/github-stars-link/index.tsx +0 -87
  149. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.test.ts +0 -29
  150. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.ts +0 -32
  151. package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +0 -85
  152. package/src/components/subnav/partials/CtaLinks/icons/github-logo.js +0 -20
  153. package/src/components/subnav/partials/CtaLinks/icons/github.svg.js +0 -7
  154. package/src/components/subnav/partials/CtaLinks/icons/star.js +0 -20
  155. package/src/components/subnav/partials/CtaLinks/index.tsx +0 -130
  156. package/src/components/subnav/partials/CtaLinks/style.module.css +0 -45
  157. package/src/components/subnav/partials/DropdownTrigger/index.tsx +0 -35
  158. package/src/components/subnav/partials/DropdownTrigger/style.module.css +0 -36
  159. package/src/components/subnav/partials/MenuItemsDefault/index.tsx +0 -151
  160. package/src/components/subnav/partials/MenuItemsDefault/style.module.css +0 -91
  161. package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +0 -139
  162. package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +0 -82
  163. package/src/components/subnav/partials/TitleLink/index.tsx +0 -113
  164. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts +0 -9
  165. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts +0 -9
  166. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-dark.ts +0 -23
  167. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-light.ts +0 -23
  168. package/src/components/subnav/partials/TitleLink/style.module.css +0 -43
  169. package/src/components/subnav/partials/nav-item-text/index.tsx +0 -37
  170. package/src/components/subnav/partials/nav-item-text/style.module.css +0 -15
  171. package/src/components/subnav/style.module.css +0 -68
  172. package/src/components/subnav/subnav-consts.ts +0 -1
  173. package/src/components/subnav/theme.module.css +0 -50
@@ -1,205 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import type { ComponentProps, ReactNode } from 'react'
7
- import Button from '@hashicorp/react-design-system-components/src/components/button'
8
- import ButtonSet from '@hashicorp/react-design-system-components/src/components/button-set'
9
- import StandaloneLink from '@hashicorp/react-design-system-components/src/components/standalone-link'
10
- import { IconArrowRight24 } from '@hashicorp/flight-icons/svg-react/arrow-right-24'
11
- import { IconExternalLink24 } from '@hashicorp/flight-icons/svg-react/external-link-24'
12
- import { IconDownload24 } from '@hashicorp/flight-icons/svg-react/download-24'
13
- import { IconCornerRightDown24 } from '@hashicorp/flight-icons/svg-react/corner-right-down-24'
14
- import type { Products } from '@hashicorp/platform-product-meta'
15
- import classNames from 'classnames'
16
- import variantCentered from './styles/variant-centered.module.css'
17
- import variantCompact from './styles/variant-compact.module.css'
18
- import variantCompactGrid from './styles/variant-compact-grid.module.css'
19
- import variantLinks from './styles/variant-links.module.css'
20
-
21
- const stylesDict = {
22
- centered: variantCentered,
23
- compact: variantCompact,
24
- compactGrid: variantCompactGrid,
25
- links: variantLinks,
26
- }
27
-
28
- interface CallToActionProps {
29
- heading?: string
30
- content?: ReactNode
31
- links?: {
32
- type?: 'inbound' | 'outbound' | 'anchor' | 'download'
33
- text: string
34
- url: string
35
- }[]
36
- variant?: 'centered' | 'compact' | 'compactGrid' | 'links'
37
- product?: 'primary' | 'secondary' | Exclude<Products, 'hashicorp'>
38
- theme?: 'light' | 'gray' | 'dark' | 'brand'
39
- className?: string
40
- }
41
-
42
- function determineIconFromLinktype(
43
- linkType: 'inbound' | 'outbound' | 'anchor' | 'download'
44
- ): ReactNode {
45
- switch (linkType) {
46
- case 'inbound':
47
- return (
48
- <IconArrowRight24
49
- style={{ display: 'block' }}
50
- width="100%"
51
- height="100%"
52
- />
53
- )
54
- case 'outbound':
55
- return (
56
- <IconExternalLink24
57
- style={{ display: 'block' }}
58
- width="100%"
59
- height="100%"
60
- />
61
- )
62
- case 'download':
63
- return (
64
- <IconDownload24
65
- style={{ display: 'block' }}
66
- width="100%"
67
- height="100%"
68
- />
69
- )
70
- case 'anchor':
71
- return (
72
- <IconCornerRightDown24
73
- style={{ display: 'block' }}
74
- width="100%"
75
- height="100%"
76
- />
77
- )
78
- default:
79
- throw new Error(`Unsupported linkType: ${linkType}`)
80
- }
81
- }
82
-
83
- function CallToAction({
84
- heading,
85
- content,
86
- links,
87
- variant = 'centered',
88
- product = 'primary',
89
- theme = 'light',
90
- className,
91
- }: CallToActionProps) {
92
- const s = stylesDict[variant]
93
- if (!heading && !content) {
94
- throw new Error('<CallToAction /> requires either heading or content')
95
- }
96
- const hasLinks = links && links.length > 0
97
- if (hasLinks && links.filter((l) => !l.text || !l.url).length > 0) {
98
- throw new Error(
99
- '<CallToAction /> `links` must have both a "text" and a "url" prop'
100
- )
101
- }
102
- return (
103
- <div className={classNames(s.root, s[`theme-${theme}`], className)}>
104
- <div className={s.container}>
105
- {heading && (
106
- <h2 className={s.heading} data-testid="heading">
107
- {heading}
108
- </h2>
109
- )}
110
- <div className={s.contentAndLinks}>
111
- {content && (
112
- <div
113
- className={classNames(s.content, { [s.hasHeading]: heading })}
114
- data-testid="content"
115
- >
116
- {content}
117
- </div>
118
- )}
119
- {links && (
120
- <ButtonSet className={s.links} data-testid="links">
121
- {links.map((link, stableIdx) => {
122
- let color: ComponentProps<typeof Button>['color'] =
123
- variant === 'links'
124
- ? 'tertiary'
125
- : stableIdx === 0
126
- ? product
127
- : 'secondary'
128
-
129
- if (color === 'tertiary') {
130
- return (
131
- <StandaloneLink
132
- key={stableIdx}
133
- color="secondary"
134
- text={link.text}
135
- href={link.url}
136
- size="large"
137
- icon={
138
- <IconArrowRight24
139
- style={{ display: 'block' }}
140
- width="100%"
141
- height="100%"
142
- />
143
- }
144
- iconPosition="trailing"
145
- />
146
- )
147
- }
148
-
149
- // @ts-expect-error - TypeScript doesn't allow 'hashicorp', but
150
- // Dato might still pass it, so rewrite it to 'primary'.
151
- if (color === 'hashicorp') {
152
- color = 'primary'
153
- }
154
-
155
- if (theme === 'brand' && color === 'primary') {
156
- // `primary` doesn't work on brand, so
157
- // update it to `secondary`
158
- color = 'secondary'
159
- } else if (theme === 'brand' && color === 'secondary') {
160
- return (
161
- <StandaloneLink
162
- key={stableIdx}
163
- color="secondary-inverted"
164
- text={link.text}
165
- href={link.url}
166
- size="large"
167
- icon={
168
- <IconArrowRight24
169
- style={{ display: 'block' }}
170
- width="100%"
171
- height="100%"
172
- />
173
- }
174
- iconPosition="trailing"
175
- />
176
- )
177
- }
178
-
179
- return (
180
- <Button
181
- // eslint-disable-next-line react/no-array-index-key
182
- key={stableIdx}
183
- // className={s.button}
184
- color={color}
185
- text={link.text}
186
- href={link.url}
187
- size="large"
188
- icon={
189
- link.type
190
- ? determineIconFromLinktype(link.type)
191
- : undefined
192
- }
193
- iconPosition="trailing"
194
- />
195
- )
196
- })}
197
- </ButtonSet>
198
- )}
199
- </div>
200
- </div>
201
- </div>
202
- )
203
- }
204
-
205
- export default CallToAction
@@ -1,93 +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 auto;
46
- text-align: center;
47
- max-width: 20em;
48
- }
49
-
50
- .content {
51
- composes: g-type-body-large from global;
52
- color: var(--text-color-body);
53
- margin: 0 auto;
54
- text-align: center;
55
- max-width: 40em;
56
-
57
- &.hasHeading {
58
- margin-top: 16px;
59
-
60
- @media (--large) {
61
- margin-top: 24px;
62
- }
63
- }
64
- }
65
-
66
- .links {
67
- display: flex;
68
- flex-wrap: wrap;
69
- justify-content: center;
70
-
71
- /*
72
- * Margins here account for extra 8px margin on buttons
73
- * which are needed to center and space properly regardless of whether
74
- * buttons are wrapping to multiple lines or not.
75
- */
76
- margin-top: 24px;
77
- margin-bottom: -8px;
78
-
79
- @media (--large) {
80
- margin-top: 32px;
81
- }
82
- }
83
-
84
- .button {
85
- /*
86
- * This ensures 16px between buttons at all times, while maintaining proper centering
87
- * when buttons wrap to multiple lines.
88
- * There will be an extra 8px space on all sides of the button group.
89
- * The top and bottom are accounted for by the -8px adjustment on `.action` margins.
90
- * The left and right excess is left as is - it's needed for proper centering when wrapping.
91
- */
92
- margin: 8px;
93
- }
@@ -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).toContainElement(screen.getByText(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 }