@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.
- package/README.md +1 -1
- package/package.json +8 -13
- package/postcss.config.js +1 -1
- package/src/components/nav-panel/components/flight-icon/index.tsx +53 -0
- package/src/components/nav-panel/components/flight-icon/style.module.css +3 -0
- package/src/components/nav-panel/components/link/cloud-fill.svg +3 -0
- package/src/components/nav-panel/components/link/index.tsx +139 -0
- package/src/components/nav-panel/components/link/layers-fill.svg +5 -0
- package/src/components/nav-panel/components/link/shield-alert-fill.svg +3 -0
- package/src/components/nav-panel/components/link/style.module.css +64 -0
- package/src/components/nav-panel/components/link/zap-fill.svg +3 -0
- package/src/components/nav-panel/components/link-list/index.tsx +12 -64
- package/src/components/nav-panel/components/link-list/style.module.css +1 -50
- package/src/components/nav-panel/components/panel/column/style.module.css +2 -2
- package/src/components/nav-panel/components/panel/root/style.module.css +5 -5
- package/src/components/nav-panel/components/promo/index.tsx +35 -15
- package/src/components/nav-panel/components/promo/style.module.css +32 -28
- package/src/components/nav-panel/components/text/index.tsx +34 -0
- package/src/components/nav-panel/product-panel/index.tsx +71 -20
- package/src/components/nav-panel/product-panel/style.module.css +111 -53
- package/src/components/nav-panel/standard-panel/index.tsx +3 -0
- package/src/components/nav-panel/standard-panel/style.module.css +2 -2
- package/src/lib/get-localized-link-props/index.test.ts +30 -0
- package/src/lib/get-localized-link-props/index.ts +45 -0
- package/src/lib/parse-url/index.test.ts +57 -2
- package/src/lib/parse-url/index.ts +97 -13
- package/src/lib/send-posthog-event/index.ts +22 -0
- package/src/lib/supported-locales/index.ts +10 -0
- package/src/lib/track-nav-click-event/index.ts +5 -5
- package/src/lib/v/index.ts +9 -4
- package/tsconfig.json +1 -2
- package/.eslintrc.js +0 -4
- package/.stylelintrc.js +0 -3
- package/src/components/actions/index.tsx +0 -107
- package/src/components/actions/style.module.css +0 -28
- package/src/components/actions/types.ts +0 -73
- package/src/components/call-to-action/index.tsx +0 -205
- package/src/components/call-to-action/styles/variant-centered.module.css +0 -93
- package/src/components/call-to-action/styles/variant-compact-grid.module.css +0 -88
- package/src/components/call-to-action/styles/variant-compact.module.css +0 -91
- package/src/components/call-to-action/styles/variant-links.module.css +0 -85
- package/src/components/card/README.md +0 -11
- package/src/components/card/card.tsx +0 -45
- package/src/components/card/index.test.tsx +0 -69
- package/src/components/card/index.tsx +0 -14
- package/src/components/card/newsroom-card/index.test.tsx +0 -39
- package/src/components/card/newsroom-card/index.tsx +0 -37
- package/src/components/card/newsroom-card/style.module.css +0 -12
- package/src/components/card/partner-card/index.test.tsx +0 -57
- package/src/components/card/partner-card/index.tsx +0 -69
- package/src/components/card/partner-card/style.module.css +0 -24
- package/src/components/card/person-card/index.test.tsx +0 -71
- package/src/components/card/person-card/index.tsx +0 -93
- package/src/components/card/person-card/style.module.css +0 -33
- package/src/components/card/primitives.tsx +0 -176
- package/src/components/card/promo-card/index.tsx +0 -51
- package/src/components/card/resource-card/index.test.tsx +0 -48
- package/src/components/card/resource-card/index.tsx +0 -37
- package/src/components/card/style.module.css +0 -145
- package/src/components/card/types.ts +0 -66
- package/src/components/card/unified-card/index.tsx +0 -64
- package/src/components/consent-manager/README.md +0 -73
- package/src/components/consent-manager/components/banner/banner.module.css +0 -23
- package/src/components/consent-manager/components/banner/banner.test.tsx +0 -31
- package/src/components/consent-manager/components/banner/banner.tsx +0 -73
- package/src/components/consent-manager/components/dialog/dialog.module.css +0 -145
- package/src/components/consent-manager/components/dialog/dialog.test.tsx +0 -194
- package/src/components/consent-manager/components/dialog/dialog.tsx +0 -339
- package/src/components/consent-manager/img/icn_close.tsx +0 -19
- package/src/components/consent-manager/index.test.tsx +0 -334
- package/src/components/consent-manager/index.tsx +0 -186
- package/src/components/consent-manager/loader/README.md +0 -29
- package/src/components/consent-manager/loader/categories.ts +0 -22
- package/src/components/consent-manager/loader/index.tsx +0 -94
- package/src/components/consent-manager/loader/presets/enterprise.ts +0 -12
- package/src/components/consent-manager/loader/presets/oss.ts +0 -10
- package/src/components/consent-manager/loader/services.ts +0 -45
- package/src/components/consent-manager/scripts/custom.tsx +0 -59
- package/src/components/consent-manager/scripts/segment.tsx +0 -87
- package/src/components/consent-manager/style.module.css +0 -9
- package/src/components/consent-manager/types.ts +0 -55
- package/src/components/consent-manager/util/cookies.test.ts +0 -75
- package/src/components/consent-manager/util/cookies.ts +0 -70
- package/src/components/consent-manager/util/integrations.test.ts +0 -115
- package/src/components/consent-manager/util/integrations.ts +0 -110
- package/src/components/intro/index.tsx +0 -82
- package/src/components/intro/style.module.css +0 -67
- package/src/components/intro/types.ts +0 -44
- package/src/components/marketo-form/CHANGELOG.md +0 -122
- package/src/components/marketo-form/README.md +0 -1
- package/src/components/marketo-form/contexts/FormMetadata.ts +0 -11
- package/src/components/marketo-form/docs.mdx +0 -197
- package/src/components/marketo-form/fixtures/index.ts +0 -185
- package/src/components/marketo-form/form/index.tsx +0 -369
- package/src/components/marketo-form/index.test.tsx +0 -320
- package/src/components/marketo-form/index.ts +0 -11
- package/src/components/marketo-form/package.original.json +0 -30
- package/src/components/marketo-form/partials/error-message/index.tsx +0 -12
- package/src/components/marketo-form/partials/error-message/style.module.css +0 -13
- package/src/components/marketo-form/partials/field/index.tsx +0 -90
- package/src/components/marketo-form/partials/field-wrapper/index.tsx +0 -26
- package/src/components/marketo-form/partials/fields/checkbox-field/index.tsx +0 -32
- package/src/components/marketo-form/partials/fields/email-field/index.tsx +0 -35
- package/src/components/marketo-form/partials/fields/form-page-url-field/index.tsx +0 -21
- package/src/components/marketo-form/partials/fields/hidden-field/index.tsx +0 -37
- package/src/components/marketo-form/partials/fields/htmltext-field/index.tsx +0 -21
- package/src/components/marketo-form/partials/fields/htmltext-field/style.module.css +0 -18
- package/src/components/marketo-form/partials/fields/name-field/index.tsx +0 -19
- package/src/components/marketo-form/partials/fields/name-field/style.module.css +0 -13
- package/src/components/marketo-form/partials/fields/radio-buttons-field/index.tsx +0 -48
- package/src/components/marketo-form/partials/fields/select-field/index.tsx +0 -39
- package/src/components/marketo-form/partials/fields/select-field/style.module.css +0 -5
- package/src/components/marketo-form/partials/fields/telephone-field/index.tsx +0 -30
- package/src/components/marketo-form/partials/fields/text-field/index.tsx +0 -30
- package/src/components/marketo-form/partials/fields/textarea-field/index.tsx +0 -29
- package/src/components/marketo-form/partials/label/index.tsx +0 -24
- package/src/components/marketo-form/partials/label/style.module.css +0 -12
- package/src/components/marketo-form/partials/visibility-rule/index.tsx +0 -84
- package/src/components/marketo-form/props.js +0 -66
- package/src/components/marketo-form/server/api-routes.ts +0 -109
- package/src/components/marketo-form/server/client.ts +0 -98
- package/src/components/marketo-form/server/index.ts +0 -8
- package/src/components/marketo-form/types.ts +0 -268
- package/src/components/marketo-form/utils.test.tsx +0 -103
- package/src/components/marketo-form/utils.ts +0 -449
- package/src/components/next-steps/index.tsx +0 -137
- package/src/components/next-steps/style.module.css +0 -270
- package/src/components/next-steps/types.ts +0 -63
- package/src/components/product-badge/index.test.tsx +0 -11
- package/src/components/product-badge/index.tsx +0 -42
- package/src/components/product-badge/style.module.css +0 -76
- package/src/components/products-used/index.tsx +0 -84
- package/src/components/products-used/style.module.css +0 -87
- package/src/components/products-used/types.ts +0 -31
- package/src/components/related-content/index.test.tsx +0 -74
- package/src/components/related-content/index.tsx +0 -56
- package/src/components/related-content/style.module.css +0 -89
- package/src/components/related-content/types.ts +0 -21
- package/src/components/subnav/helpers/areBasePathsMatching.ts +0 -13
- package/src/components/subnav/helpers/traverse/index.ts +0 -42
- package/src/components/subnav/helpers/useHeightRef.ts +0 -42
- package/src/components/subnav/helpers/useNavRef.ts +0 -30
- package/src/components/subnav/helpers/useOverflowRef.ts +0 -85
- package/src/components/subnav/helpers/useStuckRef.ts +0 -51
- package/src/components/subnav/index.tsx +0 -199
- package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.test.ts +0 -26
- package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.ts +0 -22
- package/src/components/subnav/partials/CtaLinks/github-stars-link/index.tsx +0 -87
- package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.test.ts +0 -29
- package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.ts +0 -32
- package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +0 -85
- package/src/components/subnav/partials/CtaLinks/icons/github-logo.js +0 -20
- package/src/components/subnav/partials/CtaLinks/icons/github.svg.js +0 -7
- package/src/components/subnav/partials/CtaLinks/icons/star.js +0 -20
- package/src/components/subnav/partials/CtaLinks/index.tsx +0 -130
- package/src/components/subnav/partials/CtaLinks/style.module.css +0 -45
- package/src/components/subnav/partials/DropdownTrigger/index.tsx +0 -35
- package/src/components/subnav/partials/DropdownTrigger/style.module.css +0 -36
- package/src/components/subnav/partials/MenuItemsDefault/index.tsx +0 -151
- package/src/components/subnav/partials/MenuItemsDefault/style.module.css +0 -91
- package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +0 -139
- package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +0 -82
- package/src/components/subnav/partials/TitleLink/index.tsx +0 -113
- package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts +0 -9
- package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts +0 -9
- package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-dark.ts +0 -23
- package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-light.ts +0 -23
- package/src/components/subnav/partials/TitleLink/style.module.css +0 -43
- package/src/components/subnav/partials/nav-item-text/index.tsx +0 -37
- package/src/components/subnav/partials/nav-item-text/style.module.css +0 -15
- package/src/components/subnav/style.module.css +0 -68
- package/src/components/subnav/subnav-consts.ts +0 -1
- package/src/components/subnav/theme.module.css +0 -50
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright (c) HashiCorp, Inc.
|
|
3
|
-
* SPDX-License-Identifier: MPL-2.0
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import React from 'react'
|
|
7
|
-
import Link from 'next/link'
|
|
8
|
-
import NavItemText from '../nav-item-text'
|
|
9
|
-
import DropdownTrigger from '../DropdownTrigger'
|
|
10
|
-
import * as NavigationMenu from '@radix-ui/react-navigation-menu'
|
|
11
|
-
import s from './style.module.css'
|
|
12
|
-
|
|
13
|
-
interface MenuItemsDefaultProps {
|
|
14
|
-
menuItems: (
|
|
15
|
-
| {
|
|
16
|
-
text: string
|
|
17
|
-
url: string
|
|
18
|
-
submenu: { text: string; url: string; _isActiveUrl: string }[]
|
|
19
|
-
_isActiveUrl: boolean
|
|
20
|
-
}
|
|
21
|
-
| 'divider'
|
|
22
|
-
)[]
|
|
23
|
-
activatePanel: (panel: string) => void
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function MenuItemsDefault(props: MenuItemsDefaultProps) {
|
|
27
|
-
const { menuItems, activatePanel } = props
|
|
28
|
-
return (
|
|
29
|
-
<NavigationMenu.List className={s.root}>
|
|
30
|
-
{menuItems.map((menuItem, stableIdx) => {
|
|
31
|
-
if (menuItem === 'divider') {
|
|
32
|
-
// eslint-disable-next-line react/no-array-index-key
|
|
33
|
-
return <VerticalDivider key={stableIdx} />
|
|
34
|
-
}
|
|
35
|
-
const { text, url, submenu, _isActiveUrl } = menuItem
|
|
36
|
-
return menuItem.submenu ? (
|
|
37
|
-
<NavLinkWithDropdown
|
|
38
|
-
// This array is stable, so we can use index as key
|
|
39
|
-
// eslint-disable-next-line react/no-array-index-key
|
|
40
|
-
key={stableIdx}
|
|
41
|
-
text={text}
|
|
42
|
-
submenu={submenu}
|
|
43
|
-
activatePanel={activatePanel}
|
|
44
|
-
/>
|
|
45
|
-
) : (
|
|
46
|
-
<NavLink
|
|
47
|
-
// This array is stable, so we can use index as key
|
|
48
|
-
// eslint-disable-next-line react/no-array-index-key
|
|
49
|
-
key={stableIdx}
|
|
50
|
-
text={text}
|
|
51
|
-
url={url}
|
|
52
|
-
isActive={_isActiveUrl}
|
|
53
|
-
/>
|
|
54
|
-
)
|
|
55
|
-
})}
|
|
56
|
-
</NavigationMenu.List>
|
|
57
|
-
)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
function VerticalDivider() {
|
|
61
|
-
return (
|
|
62
|
-
<li>
|
|
63
|
-
<span className={s.verticalDivider} />
|
|
64
|
-
</li>
|
|
65
|
-
)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
interface NavLinkProps {
|
|
69
|
-
text: string
|
|
70
|
-
url: string
|
|
71
|
-
isActive: boolean
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
function NavLink(props: NavLinkProps) {
|
|
75
|
-
const { text, url, isActive } = props
|
|
76
|
-
return (
|
|
77
|
-
<NavigationMenu.Item className={s.listItem}>
|
|
78
|
-
<NavigationMenu.Link asChild>
|
|
79
|
-
<Link className={s.navLink} href={url}>
|
|
80
|
-
<NavItemText isActive={isActive} text={text} />
|
|
81
|
-
</Link>
|
|
82
|
-
</NavigationMenu.Link>
|
|
83
|
-
</NavigationMenu.Item>
|
|
84
|
-
)
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
interface NavLinkWithDropdownProps {
|
|
88
|
-
text: string
|
|
89
|
-
submenu: { text: string; url: string; _isActiveUrl: string }[]
|
|
90
|
-
activatePanel: (panel: string) => void
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
interface NavLinkWithDropdownState {
|
|
94
|
-
isCollapsed: boolean
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
class NavLinkWithDropdown extends React.Component<
|
|
98
|
-
NavLinkWithDropdownProps,
|
|
99
|
-
NavLinkWithDropdownState
|
|
100
|
-
> {
|
|
101
|
-
render() {
|
|
102
|
-
const { text, submenu, activatePanel } = this.props
|
|
103
|
-
const hasActiveChild = submenu.some((s) => s._isActiveUrl)
|
|
104
|
-
|
|
105
|
-
const handleFocusOutside = () => {
|
|
106
|
-
// Since the content opens when the focus is on the dropdown trigger, handleFocusOutside gets called
|
|
107
|
-
// because the content is open but focus is outside of it. When the focus is on the trigger we want
|
|
108
|
-
// this content to be open so we ignore it in this case.
|
|
109
|
-
if (
|
|
110
|
-
!document ||
|
|
111
|
-
!document.activeElement?.id ||
|
|
112
|
-
!document.activeElement.id.includes('trigger')
|
|
113
|
-
) {
|
|
114
|
-
activatePanel('')
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return (
|
|
118
|
-
<NavigationMenu.Item className={s.listItem} value={text}>
|
|
119
|
-
<DropdownTrigger
|
|
120
|
-
text={text}
|
|
121
|
-
isActive={hasActiveChild}
|
|
122
|
-
activatePanel={activatePanel}
|
|
123
|
-
/>
|
|
124
|
-
<NavigationMenu.Content
|
|
125
|
-
className={s.submenuModal}
|
|
126
|
-
onFocusOutside={handleFocusOutside}
|
|
127
|
-
>
|
|
128
|
-
<NavigationMenu.Sub>
|
|
129
|
-
<NavigationMenu.List className={s.dropdownList}>
|
|
130
|
-
{submenu.map((submenuItem, stableIdx) => {
|
|
131
|
-
const { text, url } = submenuItem
|
|
132
|
-
return (
|
|
133
|
-
// eslint-disable-next-line react/no-array-index-key
|
|
134
|
-
<NavigationMenu.Item key={stableIdx}>
|
|
135
|
-
<NavigationMenu.Link asChild>
|
|
136
|
-
<Link className={s.submenuItem} href={url}>
|
|
137
|
-
{text}
|
|
138
|
-
</Link>
|
|
139
|
-
</NavigationMenu.Link>
|
|
140
|
-
</NavigationMenu.Item>
|
|
141
|
-
)
|
|
142
|
-
})}
|
|
143
|
-
</NavigationMenu.List>
|
|
144
|
-
</NavigationMenu.Sub>
|
|
145
|
-
</NavigationMenu.Content>
|
|
146
|
-
</NavigationMenu.Item>
|
|
147
|
-
)
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
export default MenuItemsDefault
|
|
@@ -1,91 +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
|
-
display: flex;
|
|
10
|
-
padding: 0 0 0 var(--hdsplus-spacing-08);
|
|
11
|
-
margin: 0;
|
|
12
|
-
align-items: center;
|
|
13
|
-
justify-content: flex-end;
|
|
14
|
-
list-style: none;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
.listItem {
|
|
18
|
-
position: relative;
|
|
19
|
-
white-space: nowrap;
|
|
20
|
-
margin: 0;
|
|
21
|
-
padding: 0;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
.navLink {
|
|
25
|
-
composes: hds-typography-body-200 from global;
|
|
26
|
-
composes: hds-font-weight-medium from global;
|
|
27
|
-
position: relative;
|
|
28
|
-
padding: var(--hdsplus-spacing-04);
|
|
29
|
-
display: flex;
|
|
30
|
-
align-items: center;
|
|
31
|
-
white-space: nowrap;
|
|
32
|
-
|
|
33
|
-
&:hover {
|
|
34
|
-
background-color: var(--menu-item-hover-color);
|
|
35
|
-
border-radius: var(--hdsplus-spacing-01);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
&:focus {
|
|
39
|
-
outline: 2px solid var(--token-color-focus-action-internal);
|
|
40
|
-
outline-style: auto;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
.submenuItem {
|
|
45
|
-
composes: hds-typography-body-200 from global;
|
|
46
|
-
composes: hds-font-weight-medium from global;
|
|
47
|
-
display: block;
|
|
48
|
-
color: var(--menu-item-text-color); /* from theme.module.css */
|
|
49
|
-
|
|
50
|
-
&:hover {
|
|
51
|
-
text-decoration: underline;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
.submenuModal {
|
|
56
|
-
border-radius: 4px;
|
|
57
|
-
box-shadow: var(--token-elevation-high-box-shadow); /* from theme.module.css */
|
|
58
|
-
background: var(--dropdown-background-color); /* from theme.module.css */
|
|
59
|
-
z-index: 1;
|
|
60
|
-
display: block;
|
|
61
|
-
position: absolute;
|
|
62
|
-
top: 100%;
|
|
63
|
-
margin: 8px 0 0 0;
|
|
64
|
-
padding: 24px;
|
|
65
|
-
left: 100%;
|
|
66
|
-
transform: translateX(-100%);
|
|
67
|
-
list-style: none;
|
|
68
|
-
|
|
69
|
-
& li {
|
|
70
|
-
& a:hover .text {
|
|
71
|
-
text-decoration: underline;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
& + li {
|
|
75
|
-
margin-top: 6px;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
.verticalDivider {
|
|
81
|
-
background: var(--border-color); /* from theme.module.css */
|
|
82
|
-
height: 1.75rem;
|
|
83
|
-
width: 1px;
|
|
84
|
-
margin: 0 8px;
|
|
85
|
-
display: block;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
.dropdownList {
|
|
89
|
-
list-style: none;
|
|
90
|
-
padding: 0;
|
|
91
|
-
}
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright (c) HashiCorp, Inc.
|
|
3
|
-
* SPDX-License-Identifier: MPL-2.0
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import React from 'react'
|
|
7
|
-
import { v } from '../../../../lib/v'
|
|
8
|
-
import Link from 'next/link'
|
|
9
|
-
import type { Products } from '@hashicorp/platform-product-meta'
|
|
10
|
-
import CtaLinks, { type CtaLinkProps } from '../CtaLinks'
|
|
11
|
-
import DropdownTrigger from '../DropdownTrigger'
|
|
12
|
-
import * as NavigationMenu from '@radix-ui/react-navigation-menu'
|
|
13
|
-
import classNames from 'classnames'
|
|
14
|
-
import s from './style.module.css'
|
|
15
|
-
|
|
16
|
-
interface MenuItemsOverflowProps {
|
|
17
|
-
menuItems: (
|
|
18
|
-
| 'divider'
|
|
19
|
-
| {
|
|
20
|
-
text: string
|
|
21
|
-
url: string
|
|
22
|
-
submenu: { url: string; text: string }[]
|
|
23
|
-
}
|
|
24
|
-
)[]
|
|
25
|
-
ctaLinks: CtaLinkProps
|
|
26
|
-
product?: Products
|
|
27
|
-
hideGithubStars?: boolean
|
|
28
|
-
menuText: string
|
|
29
|
-
constrainWidth?: boolean
|
|
30
|
-
activatePanel: (panel: string) => void
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
interface MenuItemsOverflowState {
|
|
34
|
-
isCollapsed: boolean
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
class MenuItemsOverflow extends React.Component<
|
|
38
|
-
MenuItemsOverflowProps,
|
|
39
|
-
MenuItemsOverflowState
|
|
40
|
-
> {
|
|
41
|
-
render() {
|
|
42
|
-
const {
|
|
43
|
-
menuItems,
|
|
44
|
-
ctaLinks,
|
|
45
|
-
product,
|
|
46
|
-
hideGithubStars,
|
|
47
|
-
menuText,
|
|
48
|
-
constrainWidth,
|
|
49
|
-
activatePanel,
|
|
50
|
-
} = this.props
|
|
51
|
-
|
|
52
|
-
const handleFocusOutside = () => {
|
|
53
|
-
// Since the content opens when the focus is on the dropdown trigger, handleFocusOutside gets called
|
|
54
|
-
// because the content is open but focus is outside of it. When the focus is on the trigger we want
|
|
55
|
-
// this content to be open so we ignore it in this case.
|
|
56
|
-
if (
|
|
57
|
-
!document ||
|
|
58
|
-
!document.activeElement?.id ||
|
|
59
|
-
!document.activeElement.id.includes('trigger')
|
|
60
|
-
) {
|
|
61
|
-
activatePanel('')
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return (
|
|
66
|
-
<NavigationMenu.List className={s.list}>
|
|
67
|
-
<NavigationMenu.Item className={s.root} value={menuText}>
|
|
68
|
-
<DropdownTrigger text={menuText} activatePanel={activatePanel} />
|
|
69
|
-
<NavigationMenu.Content
|
|
70
|
-
className={classNames(s.dropdown, {
|
|
71
|
-
[s.constrained]: constrainWidth,
|
|
72
|
-
})}
|
|
73
|
-
onFocusOutside={handleFocusOutside}
|
|
74
|
-
>
|
|
75
|
-
<ul className={s.ulElem}>
|
|
76
|
-
{menuItems.map((menuItem, stableIdx) => {
|
|
77
|
-
if (menuItem === 'divider') return null
|
|
78
|
-
const { text, url, submenu } = menuItem
|
|
79
|
-
if (submenu) {
|
|
80
|
-
// If we have a submenu, we need to flatten it
|
|
81
|
-
return (
|
|
82
|
-
// eslint-disable-next-line react/no-array-index-key
|
|
83
|
-
<div key={stableIdx}>
|
|
84
|
-
<div className={s.submenuTitle}>{text}</div>
|
|
85
|
-
<hr className={s.divider} />
|
|
86
|
-
{submenu.map((subItem, subStableIdx) => (
|
|
87
|
-
<SubmenuItem
|
|
88
|
-
// eslint-disable-next-line react/no-array-index-key
|
|
89
|
-
key={subStableIdx}
|
|
90
|
-
url={subItem.url}
|
|
91
|
-
text={subItem.text}
|
|
92
|
-
/>
|
|
93
|
-
))}
|
|
94
|
-
<hr className={s.divider} />
|
|
95
|
-
</div>
|
|
96
|
-
)
|
|
97
|
-
} else {
|
|
98
|
-
return (
|
|
99
|
-
<SubmenuItem
|
|
100
|
-
// eslint-disable-next-line react/no-array-index-key
|
|
101
|
-
key={stableIdx}
|
|
102
|
-
url={url}
|
|
103
|
-
text={text}
|
|
104
|
-
/>
|
|
105
|
-
)
|
|
106
|
-
}
|
|
107
|
-
})}
|
|
108
|
-
</ul>
|
|
109
|
-
<CtaLinks
|
|
110
|
-
links={ctaLinks}
|
|
111
|
-
isInDropdown={true}
|
|
112
|
-
product={product}
|
|
113
|
-
hideGithubStars={hideGithubStars}
|
|
114
|
-
/>
|
|
115
|
-
</NavigationMenu.Content>
|
|
116
|
-
</NavigationMenu.Item>
|
|
117
|
-
</NavigationMenu.List>
|
|
118
|
-
)
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
interface SubmenuItemProps {
|
|
123
|
-
url: string
|
|
124
|
-
text: string
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
function SubmenuItem({ url, text }: SubmenuItemProps) {
|
|
128
|
-
return (
|
|
129
|
-
<li>
|
|
130
|
-
<NavigationMenu.Link asChild>
|
|
131
|
-
<Link className={s.submenuItem} href={url} title={v(text)}>
|
|
132
|
-
{text}
|
|
133
|
-
</Link>
|
|
134
|
-
</NavigationMenu.Link>
|
|
135
|
-
</li>
|
|
136
|
-
)
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
export default MenuItemsOverflow
|
|
@@ -1,82 +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
|
-
position: relative;
|
|
10
|
-
display: flex;
|
|
11
|
-
justify-content: flex-end;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
.dropdown {
|
|
15
|
-
background: var(--dropdown-background-color); /* from theme.module.css */
|
|
16
|
-
border-radius: 4px;
|
|
17
|
-
box-shadow: var(--token-elevation-high-box-shadow);
|
|
18
|
-
border: 1px solid var(--border-color);
|
|
19
|
-
margin-top: 8px;
|
|
20
|
-
max-height: calc(100vh - 300%);
|
|
21
|
-
overflow-y: auto;
|
|
22
|
-
padding: var(--hdsplus-spacing-04) var(--hdsplus-spacing-07);
|
|
23
|
-
position: absolute;
|
|
24
|
-
right: 0;
|
|
25
|
-
top: 100%;
|
|
26
|
-
width: calc(100vw - var(--hdsplus-spacing-08));
|
|
27
|
-
z-index: 1;
|
|
28
|
-
|
|
29
|
-
@nest :global(.hashidaysConference) & {
|
|
30
|
-
padding: 12px 24px;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
&.constrained {
|
|
34
|
-
max-width: 568px;
|
|
35
|
-
width: calc(100vw - var(--hdsplus-spacing-10));
|
|
36
|
-
|
|
37
|
-
@media (--medium-up) {
|
|
38
|
-
width: max-content;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
@media (--medium-up) {
|
|
43
|
-
width: max-content;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
.ulElem {
|
|
48
|
-
padding: 0;
|
|
49
|
-
margin: 0;
|
|
50
|
-
list-style: none;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
.submenuTitle {
|
|
54
|
-
composes: g-type-label from global;
|
|
55
|
-
margin: 12px 0 8px 0;
|
|
56
|
-
color: var(--menu-item-heading-text-color); /* from theme.module.css */
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
.divider {
|
|
60
|
-
margin: 12px 0;
|
|
61
|
-
border: 0;
|
|
62
|
-
padding: 0;
|
|
63
|
-
height: 1px;
|
|
64
|
-
background: var(--border-color); /* from theme.module.css */
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
.submenuItem {
|
|
68
|
-
display: block;
|
|
69
|
-
padding: 4px 0;
|
|
70
|
-
color: var(--menu-item-text-color); /* from theme.module.css */
|
|
71
|
-
font-weight: var(--font-weight-semi-bold);
|
|
72
|
-
font-size: var(--token-typography-body-300-font-size);
|
|
73
|
-
|
|
74
|
-
&:hover {
|
|
75
|
-
text-decoration: underline;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
.list {
|
|
80
|
-
margin: 0;
|
|
81
|
-
list-style: none;
|
|
82
|
-
}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright (c) HashiCorp, Inc.
|
|
3
|
-
* SPDX-License-Identifier: MPL-2.0
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { forwardRef } from 'react'
|
|
7
|
-
import { camelCase } from 'camel-case'
|
|
8
|
-
import Link from 'next/link'
|
|
9
|
-
import Image from 'next/image'
|
|
10
|
-
import { v } from '../../../../lib/v'
|
|
11
|
-
import classNames from 'classnames'
|
|
12
|
-
import * as CommunityProductLogosOnDark from './mktg-logos/all-community-product-logos_on-dark'
|
|
13
|
-
import * as CommunityProductLogosOnLight from './mktg-logos/all-community-product-logos_on-light'
|
|
14
|
-
import * as PrimaryLogosOnDark from './mktg-logos/all-primary-logos_on-dark'
|
|
15
|
-
import * as PrimaryLogosOnLight from './mktg-logos/all-primary-logos_on-light'
|
|
16
|
-
import HashiCorpLogoOnLight from '@hashicorp/web-mktg-logos/src/hashicorp/hashicorp-horizontal_on-light.svg'
|
|
17
|
-
import HashiCorpLogoOnDark from '@hashicorp/web-mktg-logos/src/hashicorp/hashicorp-horizontal_on-dark.svg'
|
|
18
|
-
import HCPLogoOnLight from '@hashicorp/web-mktg-logos/src/hcp/hcp-horizontal_on-light.svg'
|
|
19
|
-
import HCPLogoOnDark from '@hashicorp/web-mktg-logos/src/hcp/hcp-horizontal_on-dark.svg'
|
|
20
|
-
import WaypointLogoAttrOnLight from '@hashicorp/web-mktg-logos/src/waypoint/hashicorp-waypoint-attributed/hashicorp-waypoint_on-light.svg'
|
|
21
|
-
import WaypointLogoAttrOnDark from '@hashicorp/web-mktg-logos/src/waypoint/hashicorp-waypoint-attributed/hashicorp-waypoint_on-dark.svg'
|
|
22
|
-
import HCPTerraformLogoOnLight from '@hashicorp/web-mktg-logos/src/terraform/hcp-terraform/hcp-terraform_on-light.svg'
|
|
23
|
-
import HCPTerraformLogoOnDark from '@hashicorp/web-mktg-logos/src/terraform/hcp-terraform/hcp-terraform_on-dark.svg'
|
|
24
|
-
import s from './style.module.css'
|
|
25
|
-
|
|
26
|
-
const logoDict = {
|
|
27
|
-
light: {
|
|
28
|
-
hashicorp: HashiCorpLogoOnLight,
|
|
29
|
-
hcp: HCPLogoOnLight,
|
|
30
|
-
tfc: HCPTerraformLogoOnLight,
|
|
31
|
-
'hashicorp tfc': HCPTerraformLogoOnLight,
|
|
32
|
-
'hashicorp waypoint': WaypointLogoAttrOnLight,
|
|
33
|
-
},
|
|
34
|
-
dark: {
|
|
35
|
-
hashicorp: HashiCorpLogoOnDark,
|
|
36
|
-
hcp: HCPLogoOnDark,
|
|
37
|
-
tfc: HCPTerraformLogoOnDark,
|
|
38
|
-
'hashicorp tfc': HCPTerraformLogoOnDark,
|
|
39
|
-
'hashicorp waypoint': WaypointLogoAttrOnDark,
|
|
40
|
-
},
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
interface TitleLinkProps {
|
|
44
|
-
text: string
|
|
45
|
-
url: string
|
|
46
|
-
product?: string
|
|
47
|
-
theme: 'light' | 'dark'
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function getLogo(
|
|
51
|
-
text: string,
|
|
52
|
-
theme: 'light' | 'dark'
|
|
53
|
-
): {
|
|
54
|
-
src: string
|
|
55
|
-
alt: string
|
|
56
|
-
width: number
|
|
57
|
-
height: number
|
|
58
|
-
} {
|
|
59
|
-
const lowerText = text.toLowerCase()
|
|
60
|
-
const themeLogos = logoDict[theme]
|
|
61
|
-
|
|
62
|
-
if (themeLogos[lowerText]) {
|
|
63
|
-
return themeLogos[lowerText]
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const isCommunityLogo =
|
|
67
|
-
lowerText.startsWith('hashicorp') && lowerText !== 'hashicorp'
|
|
68
|
-
|
|
69
|
-
if (isCommunityLogo) {
|
|
70
|
-
if (theme === 'light') {
|
|
71
|
-
return CommunityProductLogosOnLight[lowerText.split(' ')[1]]
|
|
72
|
-
}
|
|
73
|
-
return CommunityProductLogosOnDark[lowerText.split(' ')[1]]
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
if (theme === 'light') {
|
|
77
|
-
return PrimaryLogosOnLight[lowerText]
|
|
78
|
-
}
|
|
79
|
-
return PrimaryLogosOnDark[lowerText]
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const TitleLink = forwardRef<HTMLAnchorElement, TitleLinkProps>(
|
|
83
|
-
({ text, url, product, theme }, ref) => {
|
|
84
|
-
const parsedText = v(text)
|
|
85
|
-
const Logo = getLogo(parsedText, theme)
|
|
86
|
-
|
|
87
|
-
return (
|
|
88
|
-
<Link
|
|
89
|
-
className={classNames(
|
|
90
|
-
s.root,
|
|
91
|
-
s[`brand-${product}`],
|
|
92
|
-
s[camelCase(parsedText)]
|
|
93
|
-
)}
|
|
94
|
-
href={url}
|
|
95
|
-
title={parsedText}
|
|
96
|
-
ref={ref}
|
|
97
|
-
>
|
|
98
|
-
{Logo ? (
|
|
99
|
-
<Image
|
|
100
|
-
{...Logo}
|
|
101
|
-
alt={Logo.alt ? Logo.alt : `${product} logo`}
|
|
102
|
-
className={s.logo}
|
|
103
|
-
/>
|
|
104
|
-
) : (
|
|
105
|
-
parsedText
|
|
106
|
-
)}
|
|
107
|
-
</Link>
|
|
108
|
-
)
|
|
109
|
-
}
|
|
110
|
-
)
|
|
111
|
-
TitleLink.displayName = 'TitleLink'
|
|
112
|
-
|
|
113
|
-
export default TitleLink
|
package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import boundary from '@hashicorp/web-mktg-logos/src/boundary/boundary-community/boundary-community_on-dark.svg'
|
|
2
|
-
import consul from '@hashicorp/web-mktg-logos/src/consul/consul-community/consul-community_on-dark.svg'
|
|
3
|
-
import nomad from '@hashicorp/web-mktg-logos/src/nomad/nomad-community/nomad-community_on-dark.svg'
|
|
4
|
-
import packer from '@hashicorp/web-mktg-logos/src/packer/packer-community/packer-community_on-dark.svg'
|
|
5
|
-
import terraform from '@hashicorp/web-mktg-logos/src/terraform/terraform-community/terraform-community_on-dark.svg'
|
|
6
|
-
import vagrant from '@hashicorp/web-mktg-logos/src/vagrant/vagrant-community/vagrant-community_on-dark.svg'
|
|
7
|
-
import vault from '@hashicorp/web-mktg-logos/src/vault/vault-community/vault-community_on-dark.svg'
|
|
8
|
-
|
|
9
|
-
export { boundary, consul, nomad, packer, terraform, vagrant, vault }
|
package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import boundary from '@hashicorp/web-mktg-logos/src/boundary/boundary-community/boundary-community_on-light.svg'
|
|
2
|
-
import consul from '@hashicorp/web-mktg-logos/src/consul/consul-community/consul-community_on-light.svg'
|
|
3
|
-
import nomad from '@hashicorp/web-mktg-logos/src/nomad/nomad-community/nomad-community_on-light.svg'
|
|
4
|
-
import packer from '@hashicorp/web-mktg-logos/src/packer/packer-community/packer-community_on-light.svg'
|
|
5
|
-
import terraform from '@hashicorp/web-mktg-logos/src/terraform/terraform-community/terraform-community_on-light.svg'
|
|
6
|
-
import vagrant from '@hashicorp/web-mktg-logos/src/vagrant/vagrant-community/vagrant-community_on-light.svg'
|
|
7
|
-
import vault from '@hashicorp/web-mktg-logos/src/vault/vault-community/vault-community_on-light.svg'
|
|
8
|
-
|
|
9
|
-
export { boundary, consul, nomad, packer, terraform, vagrant, vault }
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import boundary from '@hashicorp/web-mktg-logos/src/boundary/boundary/boundary_on-dark.svg'
|
|
2
|
-
import consul from '@hashicorp/web-mktg-logos/src/consul/consul/consul_on-dark.svg'
|
|
3
|
-
import nomad from '@hashicorp/web-mktg-logos/src/nomad/nomad/nomad_on-dark.svg'
|
|
4
|
-
import packer from '@hashicorp/web-mktg-logos/src/packer/packer/packer_on-dark.svg'
|
|
5
|
-
import terraform from '@hashicorp/web-mktg-logos/src/terraform/terraform/terraform_on-dark.svg'
|
|
6
|
-
import vagrant from '@hashicorp/web-mktg-logos/src/vagrant/vagrant/vagrant_on-dark.svg'
|
|
7
|
-
import vault from '@hashicorp/web-mktg-logos/src/vault/vault/vault_on-dark.svg'
|
|
8
|
-
import waypoint from '@hashicorp/web-mktg-logos/src/waypoint/waypoint/waypoint_on-dark.svg'
|
|
9
|
-
import hashiconf from '@hashicorp/web-mktg-logos/src/conferences/hashiconf_on-dark.svg'
|
|
10
|
-
import hashidays from '@hashicorp/web-mktg-logos/src/conferences/hashidays_on-dark.svg'
|
|
11
|
-
|
|
12
|
-
export {
|
|
13
|
-
boundary,
|
|
14
|
-
consul,
|
|
15
|
-
nomad,
|
|
16
|
-
packer,
|
|
17
|
-
terraform,
|
|
18
|
-
vagrant,
|
|
19
|
-
vault,
|
|
20
|
-
waypoint,
|
|
21
|
-
hashiconf,
|
|
22
|
-
hashidays,
|
|
23
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import boundary from '@hashicorp/web-mktg-logos/src/boundary/boundary/boundary_on-light.svg'
|
|
2
|
-
import consul from '@hashicorp/web-mktg-logos/src/consul/consul/consul_on-light.svg'
|
|
3
|
-
import nomad from '@hashicorp/web-mktg-logos/src/nomad/nomad/nomad_on-light.svg'
|
|
4
|
-
import packer from '@hashicorp/web-mktg-logos/src/packer/packer/packer_on-light.svg'
|
|
5
|
-
import terraform from '@hashicorp/web-mktg-logos/src/terraform/terraform/terraform_on-light.svg'
|
|
6
|
-
import vagrant from '@hashicorp/web-mktg-logos/src/vagrant/vagrant/vagrant_on-light.svg'
|
|
7
|
-
import vault from '@hashicorp/web-mktg-logos/src/vault/vault/vault_on-light.svg'
|
|
8
|
-
import waypoint from '@hashicorp/web-mktg-logos/src/waypoint/waypoint/waypoint_on-light.svg'
|
|
9
|
-
import hashiconf from '@hashicorp/web-mktg-logos/src/conferences/hashiconf_on-light.svg'
|
|
10
|
-
import hashidays from '@hashicorp/web-mktg-logos/src/conferences/hashidays_on-light.svg'
|
|
11
|
-
|
|
12
|
-
export {
|
|
13
|
-
boundary,
|
|
14
|
-
consul,
|
|
15
|
-
nomad,
|
|
16
|
-
packer,
|
|
17
|
-
terraform,
|
|
18
|
-
vagrant,
|
|
19
|
-
vault,
|
|
20
|
-
waypoint,
|
|
21
|
-
hashiconf,
|
|
22
|
-
hashidays,
|
|
23
|
-
}
|
|
@@ -1,43 +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
|
-
position: relative;
|
|
10
|
-
display: inline-flex;
|
|
11
|
-
padding-block: var(--hdsplus-spacing-04);
|
|
12
|
-
font-weight: var(--font-weight-bold);
|
|
13
|
-
color: var(--title-text-color); /* from theme.module.css */
|
|
14
|
-
font-size: 1.25rem;
|
|
15
|
-
line-height: 1.35rem;
|
|
16
|
-
|
|
17
|
-
& img {
|
|
18
|
-
max-height: 34px;
|
|
19
|
-
width: auto;
|
|
20
|
-
display: block;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
&.brand-hcp img {
|
|
24
|
-
height: 26px;
|
|
25
|
-
|
|
26
|
-
@media (min-width: 360px) {
|
|
27
|
-
height: 29px;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
&:focus {
|
|
32
|
-
outline: 2px solid var(--token-color-focus-action-internal);
|
|
33
|
-
outline-style: auto;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
.hashiConf, .hashiDays {
|
|
38
|
-
display: flex;
|
|
39
|
-
|
|
40
|
-
& img {
|
|
41
|
-
height: 24px;
|
|
42
|
-
}
|
|
43
|
-
}
|