@hashicorp/react-components 0.0.0-nightly.4a6f4f8 → 0.0.0-nightly.52c0d39
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/package.json +5 -4
- package/src/components/actions/index.tsx +5 -5
- package/src/components/call-to-action/index.tsx +7 -7
- package/src/components/card/index.test.tsx +1 -1
- package/src/components/card/newsroom-card/index.test.tsx +1 -1
- package/src/components/card/partner-card/index.tsx +3 -3
- package/src/components/card/person-card/index.tsx +1 -1
- package/src/components/card/primitives.tsx +16 -15
- package/src/components/card/resource-card/index.test.tsx +1 -1
- package/src/components/card/resource-card/index.tsx +3 -0
- package/src/components/card/types.ts +2 -2
- package/src/components/card/unified-card/index.spec.tsx +40 -0
- package/src/components/card/unified-card/index.tsx +5 -11
- package/src/components/marketo-form/contexts/FormMetadata.ts +2 -0
- package/src/components/marketo-form/form/index.tsx +4 -2
- package/src/components/marketo-form/partials/fields/checkbox-field/index.tsx +1 -1
- package/src/components/marketo-form/partials/fields/email-field/index.tsx +1 -1
- package/src/components/marketo-form/partials/fields/form-page-url-field/index.tsx +12 -1
- package/src/components/marketo-form/partials/fields/hidden-field/index.tsx +1 -0
- package/src/components/marketo-form/partials/fields/radio-buttons-field/index.tsx +1 -1
- package/src/components/marketo-form/partials/fields/select-field/index.tsx +1 -1
- package/src/components/marketo-form/partials/fields/telephone-field/index.tsx +1 -1
- package/src/components/marketo-form/partials/fields/text-field/index.tsx +1 -1
- package/src/components/marketo-form/partials/fields/textarea-field/index.tsx +1 -1
- package/src/components/marketo-form/types.ts +5 -11
- package/src/components/nav-panel/components/link-list/index.tsx +15 -9
- package/src/components/nav-panel/components/panel/column/index.tsx +15 -2
- package/src/components/nav-panel/components/panel/column/style.module.css +12 -2
- package/src/components/nav-panel/components/panel/root/index.tsx +11 -2
- package/src/components/nav-panel/components/panel/root/style.module.css +19 -5
- package/src/components/nav-panel/components/promo/index.tsx +20 -10
- package/src/components/nav-panel/components/promo/style.module.css +28 -6
- package/src/components/nav-panel/product-panel/index.tsx +29 -11
- package/src/components/nav-panel/product-panel/style.module.css +127 -26
- package/src/components/nav-panel/standard-panel/index.tsx +3 -0
- package/src/components/nav-panel/standard-panel/style.module.css +1 -1
- package/src/components/next-steps/index.tsx +3 -2
- package/src/components/product-badge/index.tsx +1 -1
- package/src/components/subnav/index.tsx +13 -3
- package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +8 -12
- package/src/components/subnav/partials/CtaLinks/index.tsx +9 -8
- package/src/components/subnav/partials/CtaLinks/style.module.css +4 -4
- package/src/components/subnav/partials/DropdownTrigger/index.tsx +2 -2
- package/src/components/subnav/partials/DropdownTrigger/style.module.css +7 -4
- package/src/components/subnav/partials/MenuItemsDefault/index.tsx +30 -8
- package/src/components/subnav/partials/MenuItemsDefault/style.module.css +37 -24
- package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +20 -4
- package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +22 -16
- package/src/components/subnav/partials/TitleLink/index.tsx +6 -4
- package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts +2 -1
- package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts +2 -1
- package/src/components/subnav/partials/TitleLink/style.module.css +1 -1
- package/src/components/subnav/partials/nav-item-text/style.module.css +2 -4
- package/src/components/subnav/style.module.css +4 -6
- package/src/lib/get-localized-link-props/index.test.ts +30 -0
- package/src/lib/get-localized-link-props/index.ts +46 -0
- package/src/lib/parse-url/index.test.ts +40 -1
- package/src/lib/parse-url/index.ts +85 -11
- package/src/lib/supported-locales/index.ts +1 -0
- package/src/lib/v/index.ts +4 -5
- 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/subnav/theme.module.css +0 -50
|
@@ -17,7 +17,6 @@ import CtaLinks, { type CtaLinkProps } from './partials/CtaLinks'
|
|
|
17
17
|
import traverse, { isObject } from './helpers/traverse'
|
|
18
18
|
import { areBasePathsMatching } from './helpers/areBasePathsMatching'
|
|
19
19
|
import * as NavigationMenu from '@radix-ui/react-navigation-menu'
|
|
20
|
-
import themeStyles from './theme.module.css'
|
|
21
20
|
import s from './style.module.css'
|
|
22
21
|
|
|
23
22
|
const productAllowList = {
|
|
@@ -47,6 +46,7 @@ type SubnavDropdown = {
|
|
|
47
46
|
type MenuItem = SubnavLink | SubnavDropdown | 'divider'
|
|
48
47
|
|
|
49
48
|
export interface SubnavInnerProps {
|
|
49
|
+
locale?: string
|
|
50
50
|
hasOverflow?: boolean
|
|
51
51
|
titleLink: { text: string; url: string }
|
|
52
52
|
product?: Products
|
|
@@ -62,6 +62,7 @@ export interface SubnavInnerProps {
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
function SubnavInner({
|
|
65
|
+
locale,
|
|
65
66
|
hasOverflow,
|
|
66
67
|
titleLink,
|
|
67
68
|
product,
|
|
@@ -110,17 +111,21 @@ function SubnavInner({
|
|
|
110
111
|
>
|
|
111
112
|
<NavigationMenu.Link asChild>
|
|
112
113
|
<TitleLink
|
|
114
|
+
locale={locale}
|
|
113
115
|
text={titleLink.text}
|
|
114
116
|
url={titleLink.url}
|
|
115
117
|
product={product}
|
|
116
118
|
theme={theme}
|
|
117
119
|
/>
|
|
118
120
|
</NavigationMenu.Link>
|
|
121
|
+
|
|
119
122
|
{!hasOverflow && (
|
|
120
123
|
<div className={s.subNavRight}>
|
|
121
124
|
<MenuItemsDefault
|
|
122
125
|
menuItems={menuItemsWithActive}
|
|
123
126
|
activatePanel={activatePanel}
|
|
127
|
+
locale={locale}
|
|
128
|
+
product={product}
|
|
124
129
|
/>
|
|
125
130
|
{ctaLinks?.length > 0 && (
|
|
126
131
|
<CtaLinks
|
|
@@ -165,6 +170,10 @@ function Subnav({ className, theme = 'light', ...restProps }: SubnavProps) {
|
|
|
165
170
|
setActivePanel(panel)
|
|
166
171
|
}
|
|
167
172
|
|
|
173
|
+
const ariaLabel = restProps?.titleLink?.text
|
|
174
|
+
? `${restProps.titleLink.text} pages`
|
|
175
|
+
: 'Subnav pages'
|
|
176
|
+
|
|
168
177
|
return (
|
|
169
178
|
<>
|
|
170
179
|
{/**
|
|
@@ -175,11 +184,12 @@ function Subnav({ className, theme = 'light', ...restProps }: SubnavProps) {
|
|
|
175
184
|
<style>{`:root{--subnav-height:${height}px}`}</style>
|
|
176
185
|
<NavigationMenu.Root
|
|
177
186
|
ref={wrapperRef}
|
|
178
|
-
className={classNames(s.root,
|
|
187
|
+
className={classNames(s.root, className, {
|
|
179
188
|
[s.isSticky]: isSticky,
|
|
180
189
|
[s.hasOverflow]: hasOverflow,
|
|
190
|
+
'hdsplus-dark-mode': theme === 'dark',
|
|
181
191
|
})}
|
|
182
|
-
aria-label={
|
|
192
|
+
aria-label={ariaLabel}
|
|
183
193
|
onValueChange={activatePanel}
|
|
184
194
|
value={activePanel}
|
|
185
195
|
delayDuration={0}
|
|
@@ -3,15 +3,13 @@
|
|
|
3
3
|
* SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
/* Note: consumes from theme.module.css, as marked */
|
|
7
|
-
|
|
8
6
|
.root {
|
|
9
|
-
--local-scrim-
|
|
10
|
-
--local-divider-color: var(--border-
|
|
7
|
+
--local-scrim-opacity: 0;
|
|
8
|
+
--local-divider-color: var(--token-color-border-primary);
|
|
11
9
|
|
|
12
10
|
position: relative;
|
|
13
|
-
color: var(--
|
|
14
|
-
border: 1px solid var(--local-divider-color);
|
|
11
|
+
color: var(--token-color-foreground-primary);
|
|
12
|
+
border: 1px solid var(--local-divider-color);
|
|
15
13
|
border-radius: 5px;
|
|
16
14
|
background: none;
|
|
17
15
|
transition: background 0.2s, border-color 0.2s;
|
|
@@ -27,17 +25,15 @@
|
|
|
27
25
|
right: -1px;
|
|
28
26
|
bottom: -1px;
|
|
29
27
|
border-radius: 5px;
|
|
30
|
-
transition:
|
|
28
|
+
transition: opacity 0.25s ease;
|
|
29
|
+
opacity: var(--local-scrim-opacity);
|
|
31
30
|
z-index: 0;
|
|
32
|
-
background-color: var(--
|
|
31
|
+
background-color: var(--token-color-foreground-primary);
|
|
33
32
|
}
|
|
34
33
|
|
|
35
34
|
&:hover,
|
|
36
35
|
&:active {
|
|
37
|
-
--local-
|
|
38
|
-
--local-scrim-color: var(
|
|
39
|
-
--gh-stars-scrim-color
|
|
40
|
-
); /* from theme.module.css */
|
|
36
|
+
--local-scrim-opacity: 0.12;
|
|
41
37
|
}
|
|
42
38
|
}
|
|
43
39
|
|
|
@@ -3,19 +3,20 @@
|
|
|
3
3
|
* SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
import {
|
|
7
|
+
HDSPlusButton,
|
|
8
|
+
type HDSPlusButtonProps,
|
|
9
|
+
} from '@hashicorp/react-mds/src/hds-plus/button'
|
|
10
|
+
import FlightIcon from '@hashicorp/react-hds/src/components/flight-icon'
|
|
10
11
|
import type { Products } from '@hashicorp/platform-product-meta'
|
|
11
|
-
import type { ToggleButtonProps } from '@hashicorp/react-
|
|
12
|
-
import * as Dropdown from '@hashicorp/react-
|
|
12
|
+
import type { ToggleButtonProps } from '@hashicorp/react-hds/src/components/dropdown/toggle/button'
|
|
13
|
+
import * as Dropdown from '@hashicorp/react-hds/src/components/dropdown'
|
|
13
14
|
import GithubStarsLink from './github-stars-link'
|
|
14
15
|
import classNames from 'classnames'
|
|
15
16
|
import * as NavigationMenu from '@radix-ui/react-navigation-menu'
|
|
16
17
|
import s from './style.module.css'
|
|
17
18
|
|
|
18
|
-
type CtaLink =
|
|
19
|
+
type CtaLink = HDSPlusButtonProps & { href: string; __typename?: string }
|
|
19
20
|
|
|
20
21
|
type CtaDropdown = {
|
|
21
22
|
__typename?: string
|
|
@@ -83,7 +84,7 @@ function CtaLinks({
|
|
|
83
84
|
const isLastButton = stableIdx === links.length - 1
|
|
84
85
|
|
|
85
86
|
return (
|
|
86
|
-
<
|
|
87
|
+
<HDSPlusButton
|
|
87
88
|
key={href}
|
|
88
89
|
text={text}
|
|
89
90
|
href={href}
|
|
@@ -10,26 +10,26 @@
|
|
|
10
10
|
list-style: none;
|
|
11
11
|
padding: 0 0 0 var(--hdsplus-spacing-05);
|
|
12
12
|
margin: 0;
|
|
13
|
-
gap: 0
|
|
13
|
+
gap: 0 var(--hdsplus-spacing-04);
|
|
14
14
|
@media (--medium-up) {
|
|
15
15
|
gap: 0;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
& > * + * {
|
|
19
19
|
/* Spaces consecutive buttons horizontally on desktop */
|
|
20
|
-
margin-left:
|
|
20
|
+
margin-left: var(--hdsplus-spacing-05);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
&.isInDropdown {
|
|
24
24
|
/* Allows consecutive buttons to wrap */
|
|
25
25
|
flex-wrap: wrap;
|
|
26
26
|
white-space: wrap;
|
|
27
|
-
padding-
|
|
27
|
+
padding-inline: var(--hdsplus-spacing-04);
|
|
28
28
|
|
|
29
29
|
& > * {
|
|
30
30
|
/* Spaces consecutive buttons vertically */
|
|
31
31
|
margin-left: 0;
|
|
32
|
-
margin-top:
|
|
32
|
+
margin-top: var(--hdsplus-spacing-05);
|
|
33
33
|
|
|
34
34
|
&:last-of-type {
|
|
35
35
|
margin-bottom: var(--hdsplus-spacing-04);
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import FlightIcon from '@hashicorp/react-
|
|
6
|
+
import FlightIcon from '@hashicorp/react-hds/src/components/flight-icon'
|
|
7
7
|
import NavItemText from '../nav-item-text'
|
|
8
8
|
import * as NavigationMenu from '@radix-ui/react-navigation-menu'
|
|
9
9
|
import s from './style.module.css'
|
|
@@ -27,7 +27,7 @@ function DropdownTrigger(props: DropdownTriggerProps) {
|
|
|
27
27
|
onMouseDown={(e) => e.preventDefault()}
|
|
28
28
|
>
|
|
29
29
|
<NavItemText isActive={isActive} text={text} />
|
|
30
|
-
<FlightIcon name="chevron-down"
|
|
30
|
+
<FlightIcon name="chevron-down" />
|
|
31
31
|
</NavigationMenu.Trigger>
|
|
32
32
|
)
|
|
33
33
|
}
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
* SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
/* Note: consumes from theme.module.css, as marked */
|
|
7
|
-
|
|
8
6
|
.root {
|
|
9
7
|
composes: hds-typography-body-200 from global;
|
|
10
8
|
composes: hds-font-weight-medium from global;
|
|
@@ -26,11 +24,16 @@
|
|
|
26
24
|
width: 12px;
|
|
27
25
|
height: 12px;
|
|
28
26
|
transition: transform 0.3s;
|
|
29
|
-
fill: var(--
|
|
27
|
+
fill: var(--token-color-foreground-primary);
|
|
30
28
|
}
|
|
31
29
|
|
|
32
30
|
&:hover {
|
|
33
|
-
background-color: var(--
|
|
31
|
+
background-color: var(--token-color-surface-interactive-hover);
|
|
34
32
|
border-radius: var(--hdsplus-spacing-01);
|
|
35
33
|
}
|
|
34
|
+
|
|
35
|
+
&:focus {
|
|
36
|
+
outline: 2px solid var(--token-color-focus-action-internal);
|
|
37
|
+
outline-style: auto;
|
|
38
|
+
}
|
|
36
39
|
}
|
|
@@ -9,22 +9,31 @@ import NavItemText from '../nav-item-text'
|
|
|
9
9
|
import DropdownTrigger from '../DropdownTrigger'
|
|
10
10
|
import * as NavigationMenu from '@radix-ui/react-navigation-menu'
|
|
11
11
|
import s from './style.module.css'
|
|
12
|
+
import FlightIcon from '@hashicorp/react-hds/src/components/flight-icon'
|
|
13
|
+
import { getLocalizedLinkProps } from '../../../../lib/get-localized-link-props'
|
|
12
14
|
|
|
13
15
|
interface MenuItemsDefaultProps {
|
|
14
16
|
menuItems: (
|
|
15
17
|
| {
|
|
16
18
|
text: string
|
|
17
19
|
url: string
|
|
18
|
-
submenu: {
|
|
20
|
+
submenu: {
|
|
21
|
+
icon: string
|
|
22
|
+
text: string
|
|
23
|
+
url: string
|
|
24
|
+
_isActiveUrl: string
|
|
25
|
+
}[]
|
|
19
26
|
_isActiveUrl: boolean
|
|
20
27
|
}
|
|
21
28
|
| 'divider'
|
|
22
29
|
)[]
|
|
23
30
|
activatePanel: (panel: string) => void
|
|
31
|
+
locale?: string
|
|
32
|
+
product?: string
|
|
24
33
|
}
|
|
25
34
|
|
|
26
35
|
function MenuItemsDefault(props: MenuItemsDefaultProps) {
|
|
27
|
-
const { menuItems, activatePanel } = props
|
|
36
|
+
const { menuItems, activatePanel, locale, product } = props
|
|
28
37
|
return (
|
|
29
38
|
<NavigationMenu.List className={s.root}>
|
|
30
39
|
{menuItems.map((menuItem, stableIdx) => {
|
|
@@ -41,6 +50,7 @@ function MenuItemsDefault(props: MenuItemsDefaultProps) {
|
|
|
41
50
|
text={text}
|
|
42
51
|
submenu={submenu}
|
|
43
52
|
activatePanel={activatePanel}
|
|
53
|
+
locale={locale}
|
|
44
54
|
/>
|
|
45
55
|
) : (
|
|
46
56
|
<NavLink
|
|
@@ -50,6 +60,8 @@ function MenuItemsDefault(props: MenuItemsDefaultProps) {
|
|
|
50
60
|
text={text}
|
|
51
61
|
url={url}
|
|
52
62
|
isActive={_isActiveUrl}
|
|
63
|
+
locale={locale}
|
|
64
|
+
product={product}
|
|
53
65
|
/>
|
|
54
66
|
)
|
|
55
67
|
})}
|
|
@@ -69,14 +81,19 @@ interface NavLinkProps {
|
|
|
69
81
|
text: string
|
|
70
82
|
url: string
|
|
71
83
|
isActive: boolean
|
|
84
|
+
locale?: string
|
|
85
|
+
product?: string
|
|
72
86
|
}
|
|
73
87
|
|
|
74
88
|
function NavLink(props: NavLinkProps) {
|
|
75
|
-
const { text, url, isActive } = props
|
|
89
|
+
const { text, url, isActive, locale, product } = props
|
|
76
90
|
return (
|
|
77
91
|
<NavigationMenu.Item className={s.listItem}>
|
|
78
92
|
<NavigationMenu.Link asChild>
|
|
79
|
-
<Link
|
|
93
|
+
<Link
|
|
94
|
+
className={s.navLink}
|
|
95
|
+
{...getLocalizedLinkProps(url, locale, Boolean(product))}
|
|
96
|
+
>
|
|
80
97
|
<NavItemText isActive={isActive} text={text} />
|
|
81
98
|
</Link>
|
|
82
99
|
</NavigationMenu.Link>
|
|
@@ -86,8 +103,9 @@ function NavLink(props: NavLinkProps) {
|
|
|
86
103
|
|
|
87
104
|
interface NavLinkWithDropdownProps {
|
|
88
105
|
text: string
|
|
89
|
-
submenu: { text: string; url: string; _isActiveUrl: string }[]
|
|
106
|
+
submenu: { icon: string; text: string; url: string; _isActiveUrl: string }[]
|
|
90
107
|
activatePanel: (panel: string) => void
|
|
108
|
+
locale?: string
|
|
91
109
|
}
|
|
92
110
|
|
|
93
111
|
interface NavLinkWithDropdownState {
|
|
@@ -99,7 +117,7 @@ class NavLinkWithDropdown extends React.Component<
|
|
|
99
117
|
NavLinkWithDropdownState
|
|
100
118
|
> {
|
|
101
119
|
render() {
|
|
102
|
-
const { text, submenu, activatePanel } = this.props
|
|
120
|
+
const { text, submenu, activatePanel, locale } = this.props
|
|
103
121
|
const hasActiveChild = submenu.some((s) => s._isActiveUrl)
|
|
104
122
|
|
|
105
123
|
const handleFocusOutside = () => {
|
|
@@ -128,12 +146,16 @@ class NavLinkWithDropdown extends React.Component<
|
|
|
128
146
|
<NavigationMenu.Sub>
|
|
129
147
|
<NavigationMenu.List className={s.dropdownList}>
|
|
130
148
|
{submenu.map((submenuItem, stableIdx) => {
|
|
131
|
-
const { text, url } = submenuItem
|
|
149
|
+
const { icon, text, url } = submenuItem
|
|
132
150
|
return (
|
|
133
151
|
// eslint-disable-next-line react/no-array-index-key
|
|
134
152
|
<NavigationMenu.Item key={stableIdx}>
|
|
135
153
|
<NavigationMenu.Link asChild>
|
|
136
|
-
<Link
|
|
154
|
+
<Link
|
|
155
|
+
className={s.submenuItem}
|
|
156
|
+
{...getLocalizedLinkProps(url, locale)}
|
|
157
|
+
>
|
|
158
|
+
{icon ? <FlightIcon name={icon} /> : null}
|
|
137
159
|
{text}
|
|
138
160
|
</Link>
|
|
139
161
|
</NavigationMenu.Link>
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
* SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
/* Note: consumes from theme.module.css, as marked */
|
|
7
|
-
|
|
8
6
|
.root {
|
|
9
7
|
display: flex;
|
|
10
8
|
padding: 0 0 0 var(--hdsplus-spacing-08);
|
|
@@ -16,7 +14,6 @@
|
|
|
16
14
|
|
|
17
15
|
.listItem {
|
|
18
16
|
position: relative;
|
|
19
|
-
white-space: nowrap;
|
|
20
17
|
margin: 0;
|
|
21
18
|
padding: 0;
|
|
22
19
|
}
|
|
@@ -31,7 +28,7 @@
|
|
|
31
28
|
white-space: nowrap;
|
|
32
29
|
|
|
33
30
|
&:hover {
|
|
34
|
-
background-color: var(--
|
|
31
|
+
background-color: var(--token-color-surface-interactive-hover);
|
|
35
32
|
border-radius: var(--hdsplus-spacing-01);
|
|
36
33
|
}
|
|
37
34
|
|
|
@@ -42,43 +39,58 @@
|
|
|
42
39
|
}
|
|
43
40
|
|
|
44
41
|
.submenuItem {
|
|
42
|
+
--submenu-item-background-color: transparent;
|
|
43
|
+
|
|
44
|
+
position: relative;
|
|
45
45
|
composes: hds-typography-body-200 from global;
|
|
46
46
|
composes: hds-font-weight-medium from global;
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
color: var(--token-color-foreground-primary);
|
|
48
|
+
display: flex;
|
|
49
|
+
gap: var(--hdsplus-spacing-04);
|
|
50
|
+
padding: var(--hdsplus-spacing-03);
|
|
51
|
+
min-width: 190px;
|
|
52
|
+
align-items: center;
|
|
53
|
+
|
|
54
|
+
&::before {
|
|
55
|
+
content: "";
|
|
56
|
+
position: absolute;
|
|
57
|
+
z-index: -1;
|
|
58
|
+
inset: 2px 0;
|
|
59
|
+
border-radius: var(--hdsplus-spacing-01);
|
|
60
|
+
background-color: var(--submenu-item-background-color);
|
|
61
|
+
}
|
|
49
62
|
|
|
50
63
|
&:hover {
|
|
51
|
-
|
|
64
|
+
--submenu-item-background-color: var(--token-color-surface-interactive-hover);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@media (--large) {
|
|
68
|
+
max-width: 416px;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
&:focus {
|
|
72
|
+
outline: 2px solid var(--token-color-focus-action-internal);
|
|
73
|
+
outline-style: auto;
|
|
52
74
|
}
|
|
53
75
|
}
|
|
54
76
|
|
|
55
77
|
.submenuModal {
|
|
56
|
-
border-radius:
|
|
57
|
-
|
|
58
|
-
|
|
78
|
+
border-radius: var(--hdsplus-spacing-03);
|
|
79
|
+
border: 1px solid var(--token-color-border-primary);
|
|
80
|
+
box-shadow: var(--token-elevation-high-box-shadow);
|
|
81
|
+
background: var(--token-color-surface-primary);
|
|
59
82
|
z-index: 1;
|
|
60
|
-
display: block;
|
|
61
83
|
position: absolute;
|
|
62
84
|
top: 100%;
|
|
63
|
-
margin:
|
|
64
|
-
padding:
|
|
85
|
+
margin: var(--hdsplus-spacing-03) 0 0 0;
|
|
86
|
+
padding: var(--hdsplus-spacing-04);
|
|
65
87
|
left: 100%;
|
|
66
88
|
transform: translateX(-100%);
|
|
67
89
|
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
90
|
}
|
|
79
91
|
|
|
80
92
|
.verticalDivider {
|
|
81
|
-
background: var(--border-
|
|
93
|
+
background: var(--token-color-border-primary);
|
|
82
94
|
height: 1.75rem;
|
|
83
95
|
width: 1px;
|
|
84
96
|
margin: 0 8px;
|
|
@@ -86,6 +98,7 @@
|
|
|
86
98
|
}
|
|
87
99
|
|
|
88
100
|
.dropdownList {
|
|
101
|
+
min-width: max-content;
|
|
89
102
|
list-style: none;
|
|
90
103
|
padding: 0;
|
|
91
104
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import React from 'react'
|
|
7
|
-
import {
|
|
7
|
+
import { vercelSplit } from '../../../../lib/v'
|
|
8
8
|
import Link from 'next/link'
|
|
9
9
|
import type { Products } from '@hashicorp/platform-product-meta'
|
|
10
10
|
import CtaLinks, { type CtaLinkProps } from '../CtaLinks'
|
|
@@ -12,6 +12,8 @@ import DropdownTrigger from '../DropdownTrigger'
|
|
|
12
12
|
import * as NavigationMenu from '@radix-ui/react-navigation-menu'
|
|
13
13
|
import classNames from 'classnames'
|
|
14
14
|
import s from './style.module.css'
|
|
15
|
+
import FlightIcon from '@hashicorp/react-hds/src/components/flight-icon'
|
|
16
|
+
import { getLocalizedLinkProps } from '../../../../lib/get-localized-link-props'
|
|
15
17
|
|
|
16
18
|
interface MenuItemsOverflowProps {
|
|
17
19
|
menuItems: (
|
|
@@ -19,7 +21,7 @@ interface MenuItemsOverflowProps {
|
|
|
19
21
|
| {
|
|
20
22
|
text: string
|
|
21
23
|
url: string
|
|
22
|
-
submenu: { url: string; text: string }[]
|
|
24
|
+
submenu: { icon: string; url: string; text: string }[]
|
|
23
25
|
}
|
|
24
26
|
)[]
|
|
25
27
|
ctaLinks: CtaLinkProps
|
|
@@ -28,6 +30,7 @@ interface MenuItemsOverflowProps {
|
|
|
28
30
|
menuText: string
|
|
29
31
|
constrainWidth?: boolean
|
|
30
32
|
activatePanel: (panel: string) => void
|
|
33
|
+
locale?: string
|
|
31
34
|
}
|
|
32
35
|
|
|
33
36
|
interface MenuItemsOverflowState {
|
|
@@ -47,6 +50,7 @@ class MenuItemsOverflow extends React.Component<
|
|
|
47
50
|
menuText,
|
|
48
51
|
constrainWidth,
|
|
49
52
|
activatePanel,
|
|
53
|
+
locale,
|
|
50
54
|
} = this.props
|
|
51
55
|
|
|
52
56
|
const handleFocusOutside = () => {
|
|
@@ -89,6 +93,9 @@ class MenuItemsOverflow extends React.Component<
|
|
|
89
93
|
key={subStableIdx}
|
|
90
94
|
url={subItem.url}
|
|
91
95
|
text={subItem.text}
|
|
96
|
+
icon={subItem.icon}
|
|
97
|
+
locale={locale}
|
|
98
|
+
product={product}
|
|
92
99
|
/>
|
|
93
100
|
))}
|
|
94
101
|
<hr className={s.divider} />
|
|
@@ -101,6 +108,7 @@ class MenuItemsOverflow extends React.Component<
|
|
|
101
108
|
key={stableIdx}
|
|
102
109
|
url={url}
|
|
103
110
|
text={text}
|
|
111
|
+
product={product}
|
|
104
112
|
/>
|
|
105
113
|
)
|
|
106
114
|
}
|
|
@@ -120,15 +128,23 @@ class MenuItemsOverflow extends React.Component<
|
|
|
120
128
|
}
|
|
121
129
|
|
|
122
130
|
interface SubmenuItemProps {
|
|
131
|
+
icon?: string
|
|
123
132
|
url: string
|
|
124
133
|
text: string
|
|
134
|
+
locale?: string
|
|
135
|
+
product?: string
|
|
125
136
|
}
|
|
126
137
|
|
|
127
|
-
function SubmenuItem({ url, text }: SubmenuItemProps) {
|
|
138
|
+
function SubmenuItem({ icon, url, text, locale, product }: SubmenuItemProps) {
|
|
128
139
|
return (
|
|
129
140
|
<li>
|
|
130
141
|
<NavigationMenu.Link asChild>
|
|
131
|
-
<Link
|
|
142
|
+
<Link
|
|
143
|
+
className={s.submenuItem}
|
|
144
|
+
title={vercelSplit(text)}
|
|
145
|
+
{...getLocalizedLinkProps(url, locale, Boolean(product))}
|
|
146
|
+
>
|
|
147
|
+
{icon ? <FlightIcon name={icon} /> : null}
|
|
132
148
|
{text}
|
|
133
149
|
</Link>
|
|
134
150
|
</NavigationMenu.Link>
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
* SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
/* Note: consumes from theme.module.css, as marked */
|
|
7
|
-
|
|
8
6
|
.root {
|
|
9
7
|
position: relative;
|
|
10
8
|
display: flex;
|
|
@@ -12,14 +10,14 @@
|
|
|
12
10
|
}
|
|
13
11
|
|
|
14
12
|
.dropdown {
|
|
15
|
-
background: var(--
|
|
16
|
-
border-radius:
|
|
13
|
+
background: var(--token-color-surface-primary);
|
|
14
|
+
border-radius: var(--hdsplus-spacing-03);
|
|
17
15
|
box-shadow: var(--token-elevation-high-box-shadow);
|
|
18
|
-
border: 1px solid var(--border-
|
|
16
|
+
border: 1px solid var(--token-color-border-primary);
|
|
19
17
|
margin-top: 8px;
|
|
20
18
|
max-height: calc(100vh - 300%);
|
|
21
19
|
overflow-y: auto;
|
|
22
|
-
padding: var(--hdsplus-spacing-04)
|
|
20
|
+
padding: var(--hdsplus-spacing-04);
|
|
23
21
|
position: absolute;
|
|
24
22
|
right: 0;
|
|
25
23
|
top: 100%;
|
|
@@ -52,27 +50,35 @@
|
|
|
52
50
|
|
|
53
51
|
.submenuTitle {
|
|
54
52
|
composes: g-type-label from global;
|
|
55
|
-
margin:
|
|
56
|
-
color: var(--
|
|
53
|
+
margin: var(--hdsplus-spacing-04) var(--hdsplus-spacing-03) 8px;
|
|
54
|
+
color: var(--token-color-foreground-faint);
|
|
57
55
|
}
|
|
58
56
|
|
|
59
57
|
.divider {
|
|
60
|
-
margin:
|
|
58
|
+
margin: var(--hdsplus-spacing-04) var(--hdsplus-spacing-03);
|
|
61
59
|
border: 0;
|
|
62
60
|
padding: 0;
|
|
63
61
|
height: 1px;
|
|
64
|
-
background: var(--border-
|
|
62
|
+
background: var(--token-color-border-primary);
|
|
65
63
|
}
|
|
66
64
|
|
|
67
65
|
.submenuItem {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
66
|
+
composes: hds-typography-body-300 from global;
|
|
67
|
+
composes: hds-font-weight-semibold from global;
|
|
68
|
+
display: flex;
|
|
69
|
+
gap: var(--hdsplus-spacing-04);
|
|
70
|
+
padding: var(--hdsplus-spacing-02) var(--hdsplus-spacing-03);
|
|
71
|
+
color: var(--token-color-foreground-primary);
|
|
72
|
+
border-radius: var(--hdsplus-spacing-01);
|
|
73
|
+
align-items: center;
|
|
73
74
|
|
|
74
75
|
&:hover {
|
|
75
|
-
|
|
76
|
+
background-color: var(--token-color-surface-interactive-hover);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
&:focus {
|
|
80
|
+
outline: 2px solid var(--token-color-focus-action-internal);
|
|
81
|
+
outline-style: auto;
|
|
76
82
|
}
|
|
77
83
|
}
|
|
78
84
|
|
|
@@ -7,7 +7,7 @@ import { forwardRef } from 'react'
|
|
|
7
7
|
import { camelCase } from 'camel-case'
|
|
8
8
|
import Link from 'next/link'
|
|
9
9
|
import Image from 'next/image'
|
|
10
|
-
import {
|
|
10
|
+
import { vercelSplit } from '../../../../lib/v'
|
|
11
11
|
import classNames from 'classnames'
|
|
12
12
|
import * as CommunityProductLogosOnDark from './mktg-logos/all-community-product-logos_on-dark'
|
|
13
13
|
import * as CommunityProductLogosOnLight from './mktg-logos/all-community-product-logos_on-light'
|
|
@@ -22,6 +22,7 @@ import WaypointLogoAttrOnDark from '@hashicorp/web-mktg-logos/src/waypoint/hashi
|
|
|
22
22
|
import HCPTerraformLogoOnLight from '@hashicorp/web-mktg-logos/src/terraform/hcp-terraform/hcp-terraform_on-light.svg'
|
|
23
23
|
import HCPTerraformLogoOnDark from '@hashicorp/web-mktg-logos/src/terraform/hcp-terraform/hcp-terraform_on-dark.svg'
|
|
24
24
|
import s from './style.module.css'
|
|
25
|
+
import { getLocalizedLinkProps } from '../../../../lib/get-localized-link-props'
|
|
25
26
|
|
|
26
27
|
const logoDict = {
|
|
27
28
|
light: {
|
|
@@ -41,6 +42,7 @@ const logoDict = {
|
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
interface TitleLinkProps {
|
|
45
|
+
locale?: string
|
|
44
46
|
text: string
|
|
45
47
|
url: string
|
|
46
48
|
product?: string
|
|
@@ -80,8 +82,8 @@ function getLogo(
|
|
|
80
82
|
}
|
|
81
83
|
|
|
82
84
|
const TitleLink = forwardRef<HTMLAnchorElement, TitleLinkProps>(
|
|
83
|
-
({ text, url, product, theme }, ref) => {
|
|
84
|
-
const parsedText =
|
|
85
|
+
({ text, url, product, theme, locale }, ref) => {
|
|
86
|
+
const parsedText = vercelSplit(text)
|
|
85
87
|
const Logo = getLogo(parsedText, theme)
|
|
86
88
|
|
|
87
89
|
return (
|
|
@@ -91,9 +93,9 @@ const TitleLink = forwardRef<HTMLAnchorElement, TitleLinkProps>(
|
|
|
91
93
|
s[`brand-${product}`],
|
|
92
94
|
s[camelCase(parsedText)]
|
|
93
95
|
)}
|
|
94
|
-
href={url}
|
|
95
96
|
title={parsedText}
|
|
96
97
|
ref={ref}
|
|
98
|
+
{...getLocalizedLinkProps(url, locale)}
|
|
97
99
|
>
|
|
98
100
|
{Logo ? (
|
|
99
101
|
<Image
|
package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts
CHANGED
|
@@ -5,5 +5,6 @@ import packer from '@hashicorp/web-mktg-logos/src/packer/packer-community/packer
|
|
|
5
5
|
import terraform from '@hashicorp/web-mktg-logos/src/terraform/terraform-community/terraform-community_on-dark.svg'
|
|
6
6
|
import vagrant from '@hashicorp/web-mktg-logos/src/vagrant/vagrant-community/vagrant-community_on-dark.svg'
|
|
7
7
|
import vault from '@hashicorp/web-mktg-logos/src/vault/vault-community/vault-community_on-dark.svg'
|
|
8
|
+
import waypoint from '@hashicorp/web-mktg-logos/src/waypoint/hashicorp-waypoint-attributed/hashicorp-waypoint_on-dark.svg'
|
|
8
9
|
|
|
9
|
-
export { boundary, consul, nomad, packer, terraform, vagrant, vault }
|
|
10
|
+
export { boundary, consul, nomad, packer, terraform, vagrant, vault, waypoint }
|
package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts
CHANGED
|
@@ -5,5 +5,6 @@ import packer from '@hashicorp/web-mktg-logos/src/packer/packer-community/packer
|
|
|
5
5
|
import terraform from '@hashicorp/web-mktg-logos/src/terraform/terraform-community/terraform-community_on-light.svg'
|
|
6
6
|
import vagrant from '@hashicorp/web-mktg-logos/src/vagrant/vagrant-community/vagrant-community_on-light.svg'
|
|
7
7
|
import vault from '@hashicorp/web-mktg-logos/src/vault/vault-community/vault-community_on-light.svg'
|
|
8
|
+
import waypoint from '@hashicorp/web-mktg-logos/src/waypoint/hashicorp-waypoint-attributed/hashicorp-waypoint_on-light.svg'
|
|
8
9
|
|
|
9
|
-
export { boundary, consul, nomad, packer, terraform, vagrant, vault }
|
|
10
|
+
export { boundary, consul, nomad, packer, terraform, vagrant, vault, waypoint }
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
display: inline-flex;
|
|
11
11
|
padding-block: var(--hdsplus-spacing-04);
|
|
12
12
|
font-weight: var(--font-weight-bold);
|
|
13
|
-
color: var(--
|
|
13
|
+
color: var(--token-color-foreground-primary); /* from theme.module.css */
|
|
14
14
|
font-size: 1.25rem;
|
|
15
15
|
line-height: 1.35rem;
|
|
16
16
|
|