@hashicorp/react-components 1.1.8 → 1.1.11

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 (162) hide show
  1. package/package.json +4 -8
  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/style.module.css +3 -3
  7. package/src/components/nav-panel/components/panel/root/style.module.css +6 -6
  8. package/src/components/nav-panel/components/promo/index.tsx +15 -9
  9. package/src/components/nav-panel/components/promo/style.module.css +27 -13
  10. package/src/components/nav-panel/components/text/index.tsx +34 -0
  11. package/src/components/nav-panel/product-panel/index.tsx +39 -14
  12. package/src/components/nav-panel/product-panel/style.module.css +78 -37
  13. package/src/components/nav-panel/standard-panel/index.tsx +3 -0
  14. package/src/components/nav-panel/standard-panel/style.module.css +2 -2
  15. package/src/lib/get-localized-link-props/index.test.ts +30 -0
  16. package/src/lib/get-localized-link-props/index.ts +45 -0
  17. package/src/lib/parse-url/index.test.ts +40 -1
  18. package/src/lib/parse-url/index.ts +75 -9
  19. package/src/lib/send-posthog-event/index.ts +22 -0
  20. package/src/lib/supported-locales/index.ts +1 -0
  21. package/src/lib/track-nav-click-event/index.ts +4 -4
  22. package/src/lib/v/index.ts +4 -5
  23. package/src/components/actions/index.tsx +0 -107
  24. package/src/components/actions/style.module.css +0 -28
  25. package/src/components/actions/types.ts +0 -73
  26. package/src/components/call-to-action/index.tsx +0 -205
  27. package/src/components/call-to-action/styles/variant-centered.module.css +0 -93
  28. package/src/components/call-to-action/styles/variant-compact-grid.module.css +0 -88
  29. package/src/components/call-to-action/styles/variant-compact.module.css +0 -91
  30. package/src/components/call-to-action/styles/variant-links.module.css +0 -85
  31. package/src/components/card/README.md +0 -11
  32. package/src/components/card/card.tsx +0 -45
  33. package/src/components/card/index.test.tsx +0 -69
  34. package/src/components/card/index.tsx +0 -14
  35. package/src/components/card/newsroom-card/index.test.tsx +0 -39
  36. package/src/components/card/newsroom-card/index.tsx +0 -37
  37. package/src/components/card/newsroom-card/style.module.css +0 -12
  38. package/src/components/card/partner-card/index.test.tsx +0 -57
  39. package/src/components/card/partner-card/index.tsx +0 -69
  40. package/src/components/card/partner-card/style.module.css +0 -24
  41. package/src/components/card/person-card/index.test.tsx +0 -71
  42. package/src/components/card/person-card/index.tsx +0 -93
  43. package/src/components/card/person-card/style.module.css +0 -33
  44. package/src/components/card/primitives.tsx +0 -176
  45. package/src/components/card/promo-card/index.tsx +0 -51
  46. package/src/components/card/resource-card/index.test.tsx +0 -48
  47. package/src/components/card/resource-card/index.tsx +0 -37
  48. package/src/components/card/style.module.css +0 -145
  49. package/src/components/card/types.ts +0 -66
  50. package/src/components/card/unified-card/index.tsx +0 -64
  51. package/src/components/consent-manager/README.md +0 -73
  52. package/src/components/consent-manager/components/banner/banner.module.css +0 -23
  53. package/src/components/consent-manager/components/banner/banner.test.tsx +0 -31
  54. package/src/components/consent-manager/components/banner/banner.tsx +0 -73
  55. package/src/components/consent-manager/components/dialog/dialog.module.css +0 -145
  56. package/src/components/consent-manager/components/dialog/dialog.test.tsx +0 -194
  57. package/src/components/consent-manager/components/dialog/dialog.tsx +0 -339
  58. package/src/components/consent-manager/img/icn_close.tsx +0 -19
  59. package/src/components/consent-manager/index.test.tsx +0 -334
  60. package/src/components/consent-manager/index.tsx +0 -186
  61. package/src/components/consent-manager/loader/README.md +0 -29
  62. package/src/components/consent-manager/loader/categories.ts +0 -22
  63. package/src/components/consent-manager/loader/index.tsx +0 -94
  64. package/src/components/consent-manager/loader/presets/enterprise.ts +0 -12
  65. package/src/components/consent-manager/loader/presets/oss.ts +0 -10
  66. package/src/components/consent-manager/loader/services.ts +0 -45
  67. package/src/components/consent-manager/scripts/custom.tsx +0 -59
  68. package/src/components/consent-manager/scripts/segment.tsx +0 -87
  69. package/src/components/consent-manager/style.module.css +0 -9
  70. package/src/components/consent-manager/types.ts +0 -55
  71. package/src/components/consent-manager/util/cookies.test.ts +0 -75
  72. package/src/components/consent-manager/util/cookies.ts +0 -70
  73. package/src/components/consent-manager/util/integrations.test.ts +0 -115
  74. package/src/components/consent-manager/util/integrations.ts +0 -110
  75. package/src/components/intro/index.tsx +0 -82
  76. package/src/components/intro/style.module.css +0 -67
  77. package/src/components/intro/types.ts +0 -44
  78. package/src/components/marketo-form/CHANGELOG.md +0 -122
  79. package/src/components/marketo-form/README.md +0 -1
  80. package/src/components/marketo-form/contexts/FormMetadata.ts +0 -11
  81. package/src/components/marketo-form/docs.mdx +0 -197
  82. package/src/components/marketo-form/fixtures/index.ts +0 -185
  83. package/src/components/marketo-form/form/index.tsx +0 -369
  84. package/src/components/marketo-form/index.test.tsx +0 -320
  85. package/src/components/marketo-form/index.ts +0 -11
  86. package/src/components/marketo-form/package.original.json +0 -30
  87. package/src/components/marketo-form/partials/error-message/index.tsx +0 -12
  88. package/src/components/marketo-form/partials/error-message/style.module.css +0 -13
  89. package/src/components/marketo-form/partials/field/index.tsx +0 -90
  90. package/src/components/marketo-form/partials/field-wrapper/index.tsx +0 -26
  91. package/src/components/marketo-form/partials/fields/checkbox-field/index.tsx +0 -32
  92. package/src/components/marketo-form/partials/fields/email-field/index.tsx +0 -35
  93. package/src/components/marketo-form/partials/fields/form-page-url-field/index.tsx +0 -21
  94. package/src/components/marketo-form/partials/fields/hidden-field/index.tsx +0 -37
  95. package/src/components/marketo-form/partials/fields/htmltext-field/index.tsx +0 -21
  96. package/src/components/marketo-form/partials/fields/htmltext-field/style.module.css +0 -18
  97. package/src/components/marketo-form/partials/fields/name-field/index.tsx +0 -19
  98. package/src/components/marketo-form/partials/fields/name-field/style.module.css +0 -13
  99. package/src/components/marketo-form/partials/fields/radio-buttons-field/index.tsx +0 -48
  100. package/src/components/marketo-form/partials/fields/select-field/index.tsx +0 -39
  101. package/src/components/marketo-form/partials/fields/select-field/style.module.css +0 -5
  102. package/src/components/marketo-form/partials/fields/telephone-field/index.tsx +0 -30
  103. package/src/components/marketo-form/partials/fields/text-field/index.tsx +0 -30
  104. package/src/components/marketo-form/partials/fields/textarea-field/index.tsx +0 -29
  105. package/src/components/marketo-form/partials/label/index.tsx +0 -24
  106. package/src/components/marketo-form/partials/label/style.module.css +0 -12
  107. package/src/components/marketo-form/partials/visibility-rule/index.tsx +0 -84
  108. package/src/components/marketo-form/props.js +0 -66
  109. package/src/components/marketo-form/server/api-routes.ts +0 -109
  110. package/src/components/marketo-form/server/client.ts +0 -98
  111. package/src/components/marketo-form/server/index.ts +0 -8
  112. package/src/components/marketo-form/types.ts +0 -268
  113. package/src/components/marketo-form/utils.test.tsx +0 -103
  114. package/src/components/marketo-form/utils.ts +0 -449
  115. package/src/components/next-steps/index.tsx +0 -137
  116. package/src/components/next-steps/style.module.css +0 -270
  117. package/src/components/next-steps/types.ts +0 -63
  118. package/src/components/product-badge/index.test.tsx +0 -11
  119. package/src/components/product-badge/index.tsx +0 -42
  120. package/src/components/product-badge/style.module.css +0 -76
  121. package/src/components/products-used/index.tsx +0 -84
  122. package/src/components/products-used/style.module.css +0 -87
  123. package/src/components/products-used/types.ts +0 -31
  124. package/src/components/related-content/index.test.tsx +0 -74
  125. package/src/components/related-content/index.tsx +0 -56
  126. package/src/components/related-content/style.module.css +0 -89
  127. package/src/components/related-content/types.ts +0 -21
  128. package/src/components/subnav/helpers/areBasePathsMatching.ts +0 -13
  129. package/src/components/subnav/helpers/traverse/index.ts +0 -42
  130. package/src/components/subnav/helpers/useHeightRef.ts +0 -42
  131. package/src/components/subnav/helpers/useNavRef.ts +0 -30
  132. package/src/components/subnav/helpers/useOverflowRef.ts +0 -85
  133. package/src/components/subnav/helpers/useStuckRef.ts +0 -51
  134. package/src/components/subnav/index.tsx +0 -199
  135. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.test.ts +0 -26
  136. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.ts +0 -22
  137. package/src/components/subnav/partials/CtaLinks/github-stars-link/index.tsx +0 -87
  138. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.test.ts +0 -29
  139. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.ts +0 -32
  140. package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +0 -85
  141. package/src/components/subnav/partials/CtaLinks/icons/github-logo.js +0 -20
  142. package/src/components/subnav/partials/CtaLinks/icons/github.svg.js +0 -7
  143. package/src/components/subnav/partials/CtaLinks/icons/star.js +0 -20
  144. package/src/components/subnav/partials/CtaLinks/index.tsx +0 -130
  145. package/src/components/subnav/partials/CtaLinks/style.module.css +0 -45
  146. package/src/components/subnav/partials/DropdownTrigger/index.tsx +0 -35
  147. package/src/components/subnav/partials/DropdownTrigger/style.module.css +0 -36
  148. package/src/components/subnav/partials/MenuItemsDefault/index.tsx +0 -151
  149. package/src/components/subnav/partials/MenuItemsDefault/style.module.css +0 -91
  150. package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +0 -139
  151. package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +0 -82
  152. package/src/components/subnav/partials/TitleLink/index.tsx +0 -113
  153. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts +0 -9
  154. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts +0 -9
  155. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-dark.ts +0 -23
  156. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-light.ts +0 -23
  157. package/src/components/subnav/partials/TitleLink/style.module.css +0 -43
  158. package/src/components/subnav/partials/nav-item-text/index.tsx +0 -37
  159. package/src/components/subnav/partials/nav-item-text/style.module.css +0 -15
  160. package/src/components/subnav/style.module.css +0 -68
  161. package/src/components/subnav/subnav-consts.ts +0 -1
  162. package/src/components/subnav/theme.module.css +0 -50
@@ -1,26 +0,0 @@
1
- import formatStarCount from './'
2
-
3
- describe('<Subnav /> - formatStarCount', () => {
4
- it('should return zero for an undefined, null, or zero count', () => {
5
- expect(formatStarCount(undefined)).toBe(false)
6
- //@ts-expect-error purposefully testing invalid input
7
- expect(formatStarCount(null)).toBe(false)
8
- expect(formatStarCount(0)).toBe(false)
9
- })
10
-
11
- it('should return numbers 1 to 999 without formatting', () => {
12
- expect(formatStarCount(1)).toBe('1')
13
- expect(formatStarCount(999)).toBe('999')
14
- })
15
-
16
- it('should abbreviate numbers in the tens of thousands with "k" and a single decimal point', () => {
17
- expect(formatStarCount(1003)).toBe('1.0k')
18
- expect(formatStarCount(1280)).toBe('1.2k')
19
- expect(formatStarCount(15630)).toBe('15.6k')
20
- })
21
-
22
- it('should abbreviate numbers in the hundreds of thousands with "k" and no decimal point', () => {
23
- expect(formatStarCount(100000)).toBe('100k')
24
- expect(formatStarCount(156783)).toBe('156k')
25
- })
26
- })
@@ -1,22 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- /*
7
- * Given:
8
- * starCount (int)
9
- * Return:
10
- * Formatted string, to match GitHub's typical display of star counts,
11
- * that is, expressed as thousands of stars
12
- * Or returns false for falsy starCount values
13
- */
14
- function formatStarCount(starCount?: number) {
15
- if (!starCount || starCount <= 0) return false
16
- if (starCount < 1000) return `${starCount}`
17
- const thousands = Math.floor(starCount / 100.0) / 10.0
18
- if (starCount < 100000) return `${thousands.toFixed(1)}k`
19
- return `${Math.floor(thousands)}k`
20
- }
21
-
22
- export default formatStarCount
@@ -1,87 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import React, { useEffect, useState } from 'react'
7
- import fetch from 'isomorphic-unfetch'
8
- import formatStarCount from './formatStarCount'
9
- import parseGithubUrl from './parseGithubUrl'
10
- import StarIcon from '../icons/star'
11
- import GithubIcon from '../icons/github-logo'
12
- import { VisuallyHidden } from '@radix-ui/react-visually-hidden'
13
- import s from './style.module.css'
14
-
15
- interface GithubStarsButtonProps {
16
- url: string
17
- hideGithubStars?: boolean
18
- }
19
-
20
- function GithubStarsButton(props: GithubStarsButtonProps) {
21
- const { url, hideGithubStars } = props
22
- const [starCount, setStarCount] = useState(-1)
23
-
24
- useEffect(() => {
25
- if (hideGithubStars) return setStarCount(0)
26
- const parsedGithubUrl = parseGithubUrl(url)
27
- if (!parsedGithubUrl || !parsedGithubUrl.org || !parsedGithubUrl.repo)
28
- return setStarCount(0)
29
- const { org, repo } = parsedGithubUrl
30
- if (!org || !repo) return setStarCount(0)
31
- const githubApiUrl = `https://api.github.com/repos/${org}/${repo}`
32
- fetch(githubApiUrl)
33
- .then((response) => {
34
- response.json().then((data) => {
35
- // Github's rate limit for unauthenticated requests is 60 per hour
36
- // When the limit is hit, data.stargazers_count is undefined,
37
- // and setStarCount falls back to not showing the star count
38
- setStarCount(data.stargazers_count)
39
- // Warn if this limit is hit, to avoid otherwise confusing behavior
40
- // We're still using the response to provide a documentation link
41
- if (!data.stargazers_count) {
42
- const { headers } = response
43
- if (headers.get('x-ratelimit-remaining') === '0') {
44
- const resetAtSeconds = parseInt(headers.get('x-ratelimit-reset')!)
45
- const resetDate = new Date(resetAtSeconds * 1000)
46
- const rateLimit = headers.get('x-ratelimit-limit')
47
- console.warn(
48
- `⭐ Stargazers count could not be fetched. Rate limit exceeded for unauthenticated GitHub API. Limit will be reset to ${rateLimit} at ${resetDate}. See ${data.documentation_url} for more details.`
49
- )
50
- } else {
51
- console.warn(
52
- `Request for stargazers was successful, but the returned value was undefined or falsy. This might be because the repo has no stars, or it might be a different issue.`
53
- )
54
- }
55
- }
56
- })
57
- })
58
- .catch((err) => {
59
- setStarCount(0)
60
- console.warn(JSON.stringify(err, null, 2))
61
- })
62
- }, [hideGithubStars, url])
63
-
64
- const isLoadingStarCount = starCount === -1
65
- const isFailedStarCount = formatStarCount(starCount) === false
66
- const showStarCount =
67
- !hideGithubStars && (isLoadingStarCount || !isFailedStarCount)
68
- return (
69
- <a href={url} className={s.root}>
70
- <span className={s.github}>
71
- <GithubIcon />
72
- <VisuallyHidden>GitHub</VisuallyHidden>
73
- </span>
74
- {showStarCount && (
75
- <span className={s.stars}>
76
- <StarIcon />
77
- <span className="g-type-body-small-strong" data-testid="github-stars">
78
- {formatStarCount(starCount) || <span>&mdash;</span>}
79
- </span>
80
- <VisuallyHidden>Stars on GitHub</VisuallyHidden>
81
- </span>
82
- )}
83
- </a>
84
- )
85
- }
86
-
87
- export default GithubStarsButton
@@ -1,29 +0,0 @@
1
- import parseGithubUrl from './'
2
-
3
- describe('<Subnav /> - parseGithubUrl', () => {
4
- it('should gracefully handle an invalid URL', () => {
5
- // Suppress console.warn for this test, we expect warnings
6
- vi.stubGlobal('console', {
7
- warn() {
8
- return
9
- },
10
- })
11
- //@ts-expect-error purposefully testing invalid input
12
- expect(parseGithubUrl(undefined)).toBe(false)
13
- expect(parseGithubUrl('blah-blah')).toBe(false)
14
- })
15
-
16
- it('should handle a non-GitHub URL', () => {
17
- expect(parseGithubUrl('https://www.example.com/hashicorp/terraform')).toBe(
18
- false
19
- )
20
- })
21
-
22
- it('should parse the org and repo from a GitHub URL', () => {
23
- const testInput = 'https://www.github.com/hashicorp/terraform'
24
- //@ts-expect-error purposefully testing invalid input
25
- const { repo, org } = parseGithubUrl(testInput)
26
- expect(repo).toBe('terraform')
27
- expect(org).toBe('hashicorp')
28
- })
29
- })
@@ -1,32 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- /*
7
- * Given:
8
- * urlString (string) valid URL string
9
- * Return:
10
- * { org, repo }, where the url is ~= www.github.com/{org}/{repo}
11
- * or false otherwise (eg if not a valid URL, or if not a GitHub url)
12
- */
13
- function parseGithubUrl(
14
- urlString: string
15
- ): { org: string; repo: string } | false {
16
- try {
17
- const urlObj = new URL(urlString)
18
- if (urlObj.hostname !== 'www.github.com') return false
19
- const parts = urlObj.pathname.split('/').filter(Boolean)
20
- const org = parts[0]
21
- const repo = parts[1]
22
- return { org, repo }
23
- } catch (err) {
24
- console.warn(
25
- 'Warning! An invalid URL has probably been supplied to the GitHub ctaLink in <Subnav />. The corresponding error:'
26
- )
27
- console.warn(err)
28
- return false
29
- }
30
- }
31
-
32
- export default parseGithubUrl
@@ -1,85 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- /* Note: consumes from theme.module.css, as marked */
7
-
8
- .root {
9
- --local-scrim-color: transparent;
10
- --local-divider-color: var(--border-color); /* from theme.module.css */
11
-
12
- position: relative;
13
- color: var(--gh-stars-icon-color); /* from theme.module.css */
14
- border: 1px solid var(--local-divider-color); /* from theme.module.css */
15
- border-radius: 5px;
16
- background: none;
17
- transition: background 0.2s, border-color 0.2s;
18
- display: flex;
19
- align-items: center;
20
-
21
- /* Scrim used in most hover effects */
22
- &::before {
23
- content: '';
24
- position: absolute;
25
- top: -1px;
26
- left: -1px;
27
- right: -1px;
28
- bottom: -1px;
29
- border-radius: 5px;
30
- transition: background 0.25s ease;
31
- z-index: 0;
32
- background-color: var(--local-scrim-color);
33
- }
34
-
35
- &:hover,
36
- &:active {
37
- --local-divider-color: transparent;
38
- --local-scrim-color: var(
39
- --gh-stars-scrim-color
40
- ); /* from theme.module.css */
41
- }
42
- }
43
-
44
- .github {
45
- display: flex;
46
- align-items: center;
47
- padding: 8px 10px;
48
- & > svg {
49
- width: 20px;
50
- height: 20px;
51
-
52
- & [fill] {
53
- fill: currentColor;
54
- }
55
-
56
- & [stroke] {
57
- stroke: currentColor;
58
- }
59
- }
60
- }
61
-
62
- .stars {
63
- display: flex;
64
- align-items: center;
65
- height: 100%;
66
- border-left: 1px solid;
67
- border-color: var(--local-divider-color);
68
- padding: 6px 12px 7px 10px;
69
- transition: border-color 0.2s;
70
- z-index: 1;
71
- & > svg {
72
- width: 16px;
73
- height: 16px;
74
- margin-right: 4px;
75
- margin-top: 1px;
76
-
77
- & [fill] {
78
- fill: currentColor;
79
- }
80
-
81
- & [stroke] {
82
- stroke: currentColor;
83
- }
84
- }
85
- }
@@ -1,20 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import React from 'react'
7
-
8
- function GithubIcon(props) {
9
- return (
10
- <svg width={16} height={16} viewBox="0 0 16 16" {...props}>
11
- <path
12
- fillRule="evenodd"
13
- fill="#000000"
14
- d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"
15
- />
16
- </svg>
17
- )
18
- }
19
-
20
- export default GithubIcon
@@ -1,7 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- export default `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M11.9633 0.325439C5.3578 0.325439 0 5.68324 0 12.2887C0 17.5731 3.44954 22.0502 8.14679 23.6649C8.73394 23.7383 8.95413 23.3713 8.95413 23.0777C8.95413 22.7842 8.95413 22.0502 8.95413 21.0227C5.65138 21.7566 4.91743 19.408 4.91743 19.408C4.40367 18.0135 3.59633 17.6465 3.59633 17.6465C2.49541 16.9126 3.66972 16.9126 3.66972 16.9126C4.84404 16.986 5.50459 18.1603 5.50459 18.1603C6.6055 19.9952 8.29358 19.4814 8.95413 19.1878C9.02752 18.3805 9.3945 17.8667 9.68807 17.5731C7.04587 17.2796 4.25688 16.252 4.25688 11.6282C4.25688 10.3071 4.69725 9.27957 5.50459 8.39883C5.43119 8.17865 4.99083 6.93094 5.65138 5.31627C5.65138 5.31627 6.6789 5.02269 8.95413 6.56397C9.90826 6.27039 10.9358 6.197 11.9633 6.197C12.9908 6.197 14.0183 6.34379 14.9725 6.56397C17.2477 5.02269 18.2752 5.31627 18.2752 5.31627C18.9358 6.93094 18.4954 8.17865 18.422 8.47223C19.156 9.27957 19.6697 10.3805 19.6697 11.7016C19.6697 16.3254 16.8807 17.2796 14.2385 17.5731C14.6789 17.9401 15.0459 18.6741 15.0459 19.775C15.0459 21.3897 15.0459 22.6374 15.0459 23.0777C15.0459 23.3713 15.2661 23.7383 15.8532 23.6649C20.6239 22.0502 24 17.5731 24 12.2887C23.9266 5.68324 18.5688 0.325439 11.9633 0.325439Z" fill="#252937"/>
7
- </svg>`
@@ -1,20 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import React from 'react'
7
-
8
- function StarIcon(props) {
9
- return (
10
- <svg width={14} height={16} viewBox="0 0 14 16" {...props}>
11
- <path
12
- fillRule="evenodd"
13
- fill="#000000"
14
- d="M14 6l-4.9-.64L7 1 4.9 5.36 0 6l3.6 3.26L2.67 14 7 11.67 11.33 14l-.93-4.74L14 6z"
15
- />
16
- </svg>
17
- )
18
- }
19
-
20
- export default StarIcon
@@ -1,130 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import Button, {
7
- type ButtonProps,
8
- } from '@hashicorp/react-design-system-components/src/components/button'
9
- import FlightIcon from '@hashicorp/react-design-system-components/src/components/flight-icon'
10
- import type { Products } from '@hashicorp/platform-product-meta'
11
- import type { ToggleButtonProps } from '@hashicorp/react-design-system-components/src/components/dropdown/toggle/button'
12
- import * as Dropdown from '@hashicorp/react-design-system-components/src/components/dropdown'
13
- import GithubStarsLink from './github-stars-link'
14
- import classNames from 'classnames'
15
- import * as NavigationMenu from '@radix-ui/react-navigation-menu'
16
- import s from './style.module.css'
17
-
18
- type CtaLink = ButtonProps & { href: string; __typename?: string }
19
-
20
- type CtaDropdown = {
21
- __typename?: string
22
- submenu: { text: string; url: string }[]
23
- buttonControls: ToggleButtonProps
24
- }
25
-
26
- export type CtaLinkProps = Array<CtaLink | CtaDropdown>
27
-
28
- interface CtaLinksProps {
29
- links: Array<CtaLink | CtaDropdown>
30
- product?: Products
31
- isInDropdown?: boolean
32
- hideGithubStars?: boolean
33
- }
34
-
35
- function CtaLinks({
36
- links,
37
- product = 'hashicorp',
38
- isInDropdown,
39
- hideGithubStars,
40
- }: CtaLinksProps) {
41
- return (
42
- <NavigationMenu.List
43
- className={classNames(s.root, { [s.isInDropdown]: isInDropdown })}
44
- >
45
- {links.map((cta, stableIdx) => {
46
- if (isDropdown(cta)) {
47
- const { buttonControls, submenu } = cta
48
-
49
- return (
50
- // eslint-disable-next-line react/no-array-index-key
51
- <Dropdown.Root key={`dropdownRoot${stableIdx}`}>
52
- <Dropdown.Toggle.Button {...buttonControls} />
53
- <Dropdown.Content width="100%">
54
- <Dropdown.List>
55
- {submenu.map((item, index) => (
56
- <Dropdown.ListItem.Interactive
57
- text={item.text}
58
- // eslint-disable-next-line react/no-array-index-key
59
- key={`dropdownItem${index}`}
60
- href={item.url}
61
- />
62
- ))}
63
- </Dropdown.List>
64
- </Dropdown.Content>
65
- </Dropdown.Root>
66
- )
67
- } else {
68
- {
69
- const { text, href, icon, color, size, __typename, ...rest } = cta
70
-
71
- const textKey = text?.toLowerCase()
72
- const isDownload = textKey === 'download'
73
- const isGithub = textKey === 'github'
74
-
75
- if (isGithub && !isInDropdown)
76
- return (
77
- <GithubStarsLink
78
- key={href}
79
- url={href}
80
- hideGithubStars={hideGithubStars}
81
- />
82
- )
83
- const isLastButton = stableIdx === links.length - 1
84
-
85
- return (
86
- <Button
87
- key={href}
88
- text={text}
89
- href={href}
90
- size={size}
91
- isFullWidth={isInDropdown}
92
- color={color ?? (isLastButton ? product : 'secondary')}
93
- isIconOnly={!text}
94
- icon={
95
- icon ? (
96
- icon
97
- ) : isDownload ? (
98
- <FlightIcon
99
- name="download"
100
- size={16}
101
- style={{ display: 'block' }}
102
- />
103
- ) : isGithub ? (
104
- <FlightIcon
105
- name="github"
106
- size={16}
107
- style={{ display: 'block' }}
108
- />
109
- ) : undefined
110
- }
111
- {...rest}
112
- />
113
- )
114
- }
115
- }
116
- })}
117
- </NavigationMenu.List>
118
- )
119
- }
120
-
121
- export default CtaLinks
122
-
123
- /**
124
- * Type guard to properly type incoming subnav CTAs as Dropdown if needed
125
- * @param cta CTA to guard
126
- * @returns CTA re-typed according to whether it has a submenu property
127
- */
128
- function isDropdown(cta: CtaDropdown | CtaLink): cta is CtaDropdown {
129
- return 'submenu' in cta
130
- }
@@ -1,45 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- .root {
7
- display: flex;
8
- justify-content: flex-end;
9
- white-space: nowrap;
10
- list-style: none;
11
- padding: 0 0 0 var(--hdsplus-spacing-05);
12
- margin: 0;
13
- gap: 0 12px;
14
- @media (--medium-up) {
15
- gap: 0;
16
- }
17
-
18
- & > * + * {
19
- /* Spaces consecutive buttons horizontally on desktop */
20
- margin-left: 16px;
21
- }
22
-
23
- &.isInDropdown {
24
- /* Allows consecutive buttons to wrap */
25
- flex-wrap: wrap;
26
- white-space: wrap;
27
- padding-left: 0;
28
-
29
- & > * {
30
- /* Spaces consecutive buttons vertically */
31
- margin-left: 0;
32
- margin-top: 16px;
33
-
34
- &:last-of-type {
35
- margin-bottom: var(--hdsplus-spacing-04);
36
- }
37
- }
38
-
39
- @nest :global(.hashidaysConference) & :global(.hds-dropdown) {
40
- @media (--small) {
41
- display: none;
42
- }
43
- }
44
- }
45
- }
@@ -1,35 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import FlightIcon from '@hashicorp/react-design-system-components/src/components/flight-icon'
7
- import NavItemText from '../nav-item-text'
8
- import * as NavigationMenu from '@radix-ui/react-navigation-menu'
9
- import s from './style.module.css'
10
-
11
- interface DropdownTriggerProps {
12
- text: string
13
- isActive?: boolean
14
- activatePanel: (panel: string) => void
15
- }
16
-
17
- function DropdownTrigger(props: DropdownTriggerProps) {
18
- const { text, isActive, activatePanel } = props
19
-
20
- const onFocus = () => {
21
- activatePanel(text)
22
- }
23
- return (
24
- <NavigationMenu.Trigger
25
- className={s.root}
26
- onFocus={onFocus}
27
- onMouseDown={(e) => e.preventDefault()}
28
- >
29
- <NavItemText isActive={isActive} text={text} />
30
- <FlightIcon name="chevron-down" color="var(--menu-item-text-color)" />
31
- </NavigationMenu.Trigger>
32
- )
33
- }
34
-
35
- export default DropdownTrigger
@@ -1,36 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- /* Note: consumes from theme.module.css, as marked */
7
-
8
- .root {
9
- composes: hds-typography-body-200 from global;
10
- composes: hds-font-weight-medium from global;
11
- border: none;
12
- background: none;
13
- align-items: center;
14
- display: flex;
15
- height: 100%;
16
- line-height: 2.5rem;
17
- padding: 0 var(--hdsplus-spacing-05);
18
- position: relative;
19
- white-space: nowrap;
20
- cursor: default;
21
-
22
- & svg {
23
- margin-top: 1px;
24
- margin-bottom: -1px;
25
- margin-left: 6px;
26
- width: 12px;
27
- height: 12px;
28
- transition: transform 0.3s;
29
- fill: var(--menu-item-text-color); /* from theme.module.css */
30
- }
31
-
32
- &:hover {
33
- background-color: var(--menu-item-hover-color);
34
- border-radius: var(--hdsplus-spacing-01);
35
- }
36
- }