@hashicorp/react-components 0.0.0-nightly.386a315 → 0.0.0-nightly.3ae3f64
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 +4 -4
- package/src/components/actions/index.tsx +2 -2
- package/src/components/call-to-action/index.tsx +3 -3
- 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/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 +3 -1
- 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 +2 -0
- 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/nav-panel/components/link-list/index.tsx +7 -6
- 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 +15 -8
- package/src/components/nav-panel/components/promo/style.module.css +28 -6
- package/src/components/nav-panel/product-panel/index.tsx +20 -7
- package/src/components/nav-panel/product-panel/style.module.css +127 -26
- package/src/components/nav-panel/standard-panel/style.module.css +1 -1
- package/src/components/next-steps/index.tsx +2 -1
- package/src/components/product-badge/index.tsx +1 -1
- package/src/components/subnav/index.tsx +7 -3
- package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +8 -12
- package/src/components/subnav/partials/CtaLinks/index.tsx +4 -4
- 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 +10 -3
- package/src/components/subnav/partials/MenuItemsDefault/style.module.css +37 -24
- package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +8 -4
- package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +22 -16
- package/src/components/subnav/partials/TitleLink/index.tsx +2 -2
- 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 +3 -5
- package/src/lib/parse-url/index.test.ts +5 -0
- package/src/lib/parse-url/index.ts +4 -2
- 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
|
@@ -1,16 +1,17 @@
|
|
|
1
|
+
import classNames from 'classnames'
|
|
1
2
|
import Link from 'next/link'
|
|
2
3
|
import * as NavPanel from '../components/panel'
|
|
3
4
|
import Promo, { type PromoProps } from '../components/promo'
|
|
4
5
|
import { Products } from '@hashicorp/platform-product-meta'
|
|
5
|
-
import FlightIcon from '@hashicorp/react-
|
|
6
|
-
import { TextPlus } from '@hashicorp/react-
|
|
6
|
+
import FlightIcon from '@hashicorp/react-hds/src/components/flight-icon'
|
|
7
|
+
import { TextPlus } from '@hashicorp/react-hds/src/components/text'
|
|
7
8
|
import { parseUrl } from '../../../lib/parse-url'
|
|
8
9
|
import { trackNavClickEvent } from '../../../lib/track-nav-click-event'
|
|
9
10
|
import * as NavigationMenu from '@radix-ui/react-navigation-menu'
|
|
10
11
|
import s from './style.module.css'
|
|
11
12
|
|
|
12
13
|
const PRODUCT_LOGO_MAP = new Map([
|
|
13
|
-
['Terraform', 'terraform-fill
|
|
14
|
+
['Terraform', 'terraform-fill'],
|
|
14
15
|
['Packer', 'packer-fill-color'],
|
|
15
16
|
['Vault', 'vault-fill-color'],
|
|
16
17
|
['Boundary', 'boundary-fill-color'],
|
|
@@ -23,6 +24,7 @@ const PRODUCT_LOGO_MAP = new Map([
|
|
|
23
24
|
])
|
|
24
25
|
|
|
25
26
|
const PRODUCT_LOGO_EXCEPTION_CLASSNAMES = {
|
|
27
|
+
Terraform: 'terraform',
|
|
26
28
|
'HCP Vault Secrets': 'hcpVaultSecrets',
|
|
27
29
|
'HCP Vault Radar': 'hcpVaultRadar',
|
|
28
30
|
}
|
|
@@ -47,9 +49,15 @@ const ProductPanel = ({
|
|
|
47
49
|
sidePanel,
|
|
48
50
|
}: ProductsPanelProps) => {
|
|
49
51
|
return (
|
|
50
|
-
<NavPanel.Root
|
|
52
|
+
<NavPanel.Root
|
|
53
|
+
className={classNames(s.productPanel, {
|
|
54
|
+
[s.hasSide]: sidePanel,
|
|
55
|
+
[s.noSide]: !sidePanel,
|
|
56
|
+
})}
|
|
57
|
+
hasSidePanel={Boolean(sidePanel)}
|
|
58
|
+
>
|
|
51
59
|
<div className={s.mainPanel}>
|
|
52
|
-
<NavPanel.Column>
|
|
60
|
+
<NavPanel.Column hasSidePanel={Boolean(sidePanel)}>
|
|
53
61
|
<ul className={s.productCategories}>
|
|
54
62
|
{productCategories.map(({ title, products }) => {
|
|
55
63
|
return (
|
|
@@ -69,7 +77,7 @@ const ProductPanel = ({
|
|
|
69
77
|
})}
|
|
70
78
|
</ul>
|
|
71
79
|
</NavPanel.Column>
|
|
72
|
-
{promo ? <Promo {...promo} /> : null}
|
|
80
|
+
{promo ? <Promo {...promo} hasSidePanel={Boolean(sidePanel)} /> : null}
|
|
73
81
|
</div>
|
|
74
82
|
|
|
75
83
|
{sidePanel ? (
|
|
@@ -87,7 +95,11 @@ const ProductPanel = ({
|
|
|
87
95
|
{sidePanel.navItems.map(({ icon, title, description, url }) => {
|
|
88
96
|
return (
|
|
89
97
|
<li key={title}>
|
|
90
|
-
<Link
|
|
98
|
+
<Link
|
|
99
|
+
aria-label={`${title} - ${description}`}
|
|
100
|
+
href={parseUrl(url).href}
|
|
101
|
+
className={classNames(s.sidePanelItem, s.focusIndicator)}
|
|
102
|
+
>
|
|
91
103
|
<div className={s.iconBackground}>
|
|
92
104
|
<FlightIcon
|
|
93
105
|
size={16}
|
|
@@ -122,6 +134,7 @@ function NavProduct({ url, product, description }: NavProductProps) {
|
|
|
122
134
|
return (
|
|
123
135
|
<NavigationMenu.Link asChild>
|
|
124
136
|
<Link
|
|
137
|
+
aria-label={`${product} - ${description}`}
|
|
125
138
|
href={parseUrl(url).href}
|
|
126
139
|
onClickCapture={() => {
|
|
127
140
|
trackNavClickEvent(product, url, 'products')
|
|
@@ -1,11 +1,24 @@
|
|
|
1
|
+
@custom-media --dev-dot-viewport (min-width: 924px);
|
|
2
|
+
|
|
1
3
|
.productPanel {
|
|
2
4
|
height: 100%;
|
|
3
5
|
|
|
4
6
|
@media (--large) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
&.noSide {
|
|
8
|
+
display: grid;
|
|
9
|
+
grid-template-rows: 1fr;
|
|
10
|
+
grid-template-columns: max-content max-content;
|
|
11
|
+
padding: 0;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
@media (--dev-dot-viewport) {
|
|
16
|
+
&.hasSide {
|
|
17
|
+
display: grid;
|
|
18
|
+
grid-template-rows: 1fr;
|
|
19
|
+
grid-template-columns: max-content max-content;
|
|
20
|
+
padding: 0;
|
|
21
|
+
}
|
|
9
22
|
}
|
|
10
23
|
}
|
|
11
24
|
|
|
@@ -13,10 +26,18 @@
|
|
|
13
26
|
list-style: none;
|
|
14
27
|
padding: 0;
|
|
15
28
|
display: grid;
|
|
16
|
-
margin: var(--hdsplus-spacing-
|
|
29
|
+
margin: var(--hdsplus-spacing-07) 0 0;
|
|
17
30
|
|
|
18
31
|
@media (--large) {
|
|
19
|
-
|
|
32
|
+
@nest .noSide & {
|
|
33
|
+
margin: 0;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@media (--dev-dot-viewport) {
|
|
38
|
+
@nest .hasSide & {
|
|
39
|
+
margin: 0;
|
|
40
|
+
}
|
|
20
41
|
}
|
|
21
42
|
}
|
|
22
43
|
|
|
@@ -38,7 +59,17 @@
|
|
|
38
59
|
font-weight: var(--font-weight-semi-bold);
|
|
39
60
|
|
|
40
61
|
@media (--large) {
|
|
41
|
-
|
|
62
|
+
@nest .noSide & {
|
|
63
|
+
padding-bottom: 0;
|
|
64
|
+
padding-left: var(--hdsplus-spacing-06);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
@media (--dev-dot-viewport) {
|
|
69
|
+
@nest .hasSide & {
|
|
70
|
+
padding-bottom: 0;
|
|
71
|
+
padding-left: var(--hdsplus-spacing-06);
|
|
72
|
+
}
|
|
42
73
|
}
|
|
43
74
|
}
|
|
44
75
|
|
|
@@ -50,10 +81,31 @@
|
|
|
50
81
|
padding: 0;
|
|
51
82
|
|
|
52
83
|
@media (--large) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
84
|
+
@nest .noSide & {
|
|
85
|
+
padding: var(--hdsplus-spacing-06) var(--hdsplus-spacing-05)
|
|
86
|
+
var(--hdsplus-spacing-04);
|
|
87
|
+
grid-auto-flow: row;
|
|
88
|
+
grid-template-columns: repeat(2, 300px);
|
|
89
|
+
grid-template-rows: repeat(2, max-content);
|
|
90
|
+
gap: 0;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@media (--dev-dot-viewport) {
|
|
95
|
+
@nest .hasSide & {
|
|
96
|
+
padding: var(--hdsplus-spacing-06) var(--hdsplus-spacing-05)
|
|
97
|
+
var(--hdsplus-spacing-04);
|
|
98
|
+
grid-auto-flow: row;
|
|
99
|
+
grid-template-columns: repeat(2, 300px);
|
|
100
|
+
grid-template-rows: repeat(2, max-content);
|
|
101
|
+
gap: 0;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
& li:last-child {
|
|
106
|
+
& .productWrapper {
|
|
107
|
+
margin-bottom: 0;
|
|
108
|
+
}
|
|
57
109
|
}
|
|
58
110
|
}
|
|
59
111
|
|
|
@@ -65,12 +117,26 @@
|
|
|
65
117
|
gap: var(--hdsplus-spacing-05);
|
|
66
118
|
|
|
67
119
|
@media (--large) {
|
|
68
|
-
|
|
69
|
-
|
|
120
|
+
@nest .noSide & {
|
|
121
|
+
padding: var(--hdsplus-spacing-03) var(--hdsplus-spacing-05);
|
|
122
|
+
margin-bottom: 0;
|
|
123
|
+
|
|
124
|
+
&:hover {
|
|
125
|
+
background-color: var(--token-color-surface-interactive-hover);
|
|
126
|
+
border-radius: var(--hdsplus-spacing-01);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
70
130
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
131
|
+
@media (--dev-dot-viewport) {
|
|
132
|
+
@nest .hasSide & {
|
|
133
|
+
padding: var(--hdsplus-spacing-03) var(--hdsplus-spacing-05);
|
|
134
|
+
margin-bottom: 0;
|
|
135
|
+
|
|
136
|
+
&:hover {
|
|
137
|
+
background-color: var(--token-color-surface-interactive-hover);
|
|
138
|
+
border-radius: var(--hdsplus-spacing-01);
|
|
139
|
+
}
|
|
74
140
|
}
|
|
75
141
|
}
|
|
76
142
|
}
|
|
@@ -81,10 +147,23 @@
|
|
|
81
147
|
& svg {
|
|
82
148
|
height: 42px;
|
|
83
149
|
width: 42px;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
@nest .noSide & {
|
|
153
|
+
& svg {
|
|
154
|
+
@media (--large) {
|
|
155
|
+
height: var(--hdsplus-spacing-08);
|
|
156
|
+
width: var(--hdsplus-spacing-08);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
84
160
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
161
|
+
@nest .hasSide & {
|
|
162
|
+
& svg {
|
|
163
|
+
@media (--dev-dot-viewport) {
|
|
164
|
+
height: var(--hdsplus-spacing-08);
|
|
165
|
+
width: var(--hdsplus-spacing-08);
|
|
166
|
+
}
|
|
88
167
|
}
|
|
89
168
|
}
|
|
90
169
|
}
|
|
@@ -117,8 +196,17 @@
|
|
|
117
196
|
flex-direction: column;
|
|
118
197
|
|
|
119
198
|
@media (--large) {
|
|
120
|
-
|
|
121
|
-
var(--hdsplus-spacing-
|
|
199
|
+
@nest .noSide & {
|
|
200
|
+
padding: var(--hdsplus-spacing-07) 0 var(--hdsplus-spacing-09)
|
|
201
|
+
var(--hdsplus-spacing-04);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
@media (--dev-dot-viewport) {
|
|
206
|
+
@nest .hasSide & {
|
|
207
|
+
padding: var(--hdsplus-spacing-07) 0 var(--hdsplus-spacing-09)
|
|
208
|
+
var(--hdsplus-spacing-04);
|
|
209
|
+
}
|
|
122
210
|
}
|
|
123
211
|
}
|
|
124
212
|
|
|
@@ -129,7 +217,7 @@
|
|
|
129
217
|
flex-direction: column;
|
|
130
218
|
gap: var(--hdsplus-spacing-05);
|
|
131
219
|
margin: 0;
|
|
132
|
-
padding: var(--hdsplus-spacing-
|
|
220
|
+
padding: var(--hdsplus-spacing-07) var(--hdsplus-spacing-04)
|
|
133
221
|
var(--hdsplus-spacing-09) var(--hdsplus-spacing-07);
|
|
134
222
|
}
|
|
135
223
|
|
|
@@ -141,7 +229,7 @@
|
|
|
141
229
|
grid-template-columns: 1fr;
|
|
142
230
|
gap: var(--hdsplus-spacing-07);
|
|
143
231
|
|
|
144
|
-
@media (--
|
|
232
|
+
@media (--dev-dot-viewport) {
|
|
145
233
|
gap: var(--hdsplus-spacing-05);
|
|
146
234
|
}
|
|
147
235
|
}
|
|
@@ -149,12 +237,10 @@
|
|
|
149
237
|
/* Lifted from .productWrapper */
|
|
150
238
|
.sidePanelItem {
|
|
151
239
|
display: flex;
|
|
152
|
-
margin-bottom: var(--hdsplus-spacing-05);
|
|
153
240
|
gap: var(--hdsplus-spacing-05);
|
|
154
241
|
|
|
155
|
-
@media (--
|
|
242
|
+
@media (--dev-dot-viewport) {
|
|
156
243
|
padding: var(--hdsplus-spacing-03) var(--hdsplus-spacing-05);
|
|
157
|
-
margin-bottom: 0;
|
|
158
244
|
|
|
159
245
|
&:hover {
|
|
160
246
|
background-color: var(--token-color-surface-interactive-hover);
|
|
@@ -194,6 +280,21 @@ packages/react-components/src/components/nav-panel/components/link-list/style.mo
|
|
|
194
280
|
|
|
195
281
|
/* Branding exception classnames */
|
|
196
282
|
|
|
283
|
+
/* Allows switching to a dark-mode-specific color for Terraform */
|
|
284
|
+
.terraform {
|
|
285
|
+
& use {
|
|
286
|
+
fill: var(--token-color-terraform-brand);
|
|
287
|
+
|
|
288
|
+
@nest [data-theme='dark'] & {
|
|
289
|
+
fill: var(--token-color-terraform-foreground);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
& path {
|
|
294
|
+
fill: inherit;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
197
298
|
/* Styles for HCP Vault mimic the spec for `product-square` icons,
|
|
198
299
|
while allowing the symbol inside the icon border to change color
|
|
199
300
|
based on the site's theme
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Copyright (c) HashiCorp, Inc.
|
|
3
3
|
* SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
*/
|
|
5
|
+
'use client'
|
|
5
6
|
|
|
6
7
|
import { useState } from 'react'
|
|
7
8
|
import Badge from '@hashicorp/react-badge'
|
|
@@ -10,7 +11,7 @@ import ExpandableArrow from '@hashicorp/react-expandable-arrow'
|
|
|
10
11
|
import Intro from '../intro'
|
|
11
12
|
import Link from 'next/link'
|
|
12
13
|
import type { NextStepsProps } from './types'
|
|
13
|
-
import StandaloneLink from '@hashicorp/react-
|
|
14
|
+
import StandaloneLink from '@hashicorp/react-hds/src/components/standalone-link'
|
|
14
15
|
import { IconArrowRight16 } from '@hashicorp/flight-icons/svg-react/arrow-right-16'
|
|
15
16
|
import useProductMeta from '@hashicorp/platform-product-meta'
|
|
16
17
|
import s from './style.module.css'
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { Products } from '@hashicorp/platform-product-meta'
|
|
7
|
-
import Badge from '@hashicorp/react-
|
|
7
|
+
import Badge from '@hashicorp/react-hds/src/components/badge'
|
|
8
8
|
import { IconDot16 } from '@hashicorp/flight-icons/svg-react/dot-16'
|
|
9
9
|
import s from './style.module.css'
|
|
10
10
|
|
|
@@ -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 = {
|
|
@@ -165,6 +164,10 @@ function Subnav({ className, theme = 'light', ...restProps }: SubnavProps) {
|
|
|
165
164
|
setActivePanel(panel)
|
|
166
165
|
}
|
|
167
166
|
|
|
167
|
+
const ariaLabel = restProps?.titleLink?.text
|
|
168
|
+
? `${restProps.titleLink.text} pages`
|
|
169
|
+
: 'Subnav pages'
|
|
170
|
+
|
|
168
171
|
return (
|
|
169
172
|
<>
|
|
170
173
|
{/**
|
|
@@ -175,11 +178,12 @@ function Subnav({ className, theme = 'light', ...restProps }: SubnavProps) {
|
|
|
175
178
|
<style>{`:root{--subnav-height:${height}px}`}</style>
|
|
176
179
|
<NavigationMenu.Root
|
|
177
180
|
ref={wrapperRef}
|
|
178
|
-
className={classNames(s.root,
|
|
181
|
+
className={classNames(s.root, className, {
|
|
179
182
|
[s.isSticky]: isSticky,
|
|
180
183
|
[s.hasOverflow]: hasOverflow,
|
|
184
|
+
'hdsplus-dark-mode': theme === 'dark',
|
|
181
185
|
})}
|
|
182
|
-
aria-label={
|
|
186
|
+
aria-label={ariaLabel}
|
|
183
187
|
onValueChange={activatePanel}
|
|
184
188
|
value={activePanel}
|
|
185
189
|
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
|
|
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
import Button, {
|
|
7
7
|
type ButtonProps,
|
|
8
|
-
} from '@hashicorp/react-
|
|
9
|
-
import FlightIcon from '@hashicorp/react-
|
|
8
|
+
} from '@hashicorp/react-hds/src/components/button'
|
|
9
|
+
import FlightIcon from '@hashicorp/react-hds/src/components/flight-icon'
|
|
10
10
|
import type { Products } from '@hashicorp/platform-product-meta'
|
|
11
|
-
import type { ToggleButtonProps } from '@hashicorp/react-
|
|
12
|
-
import * as Dropdown from '@hashicorp/react-
|
|
11
|
+
import type { ToggleButtonProps } from '@hashicorp/react-hds/src/components/dropdown/toggle/button'
|
|
12
|
+
import * as Dropdown from '@hashicorp/react-hds/src/components/dropdown'
|
|
13
13
|
import GithubStarsLink from './github-stars-link'
|
|
14
14
|
import classNames from 'classnames'
|
|
15
15
|
import * as NavigationMenu from '@radix-ui/react-navigation-menu'
|
|
@@ -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,13 +9,19 @@ 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'
|
|
12
13
|
|
|
13
14
|
interface MenuItemsDefaultProps {
|
|
14
15
|
menuItems: (
|
|
15
16
|
| {
|
|
16
17
|
text: string
|
|
17
18
|
url: string
|
|
18
|
-
submenu: {
|
|
19
|
+
submenu: {
|
|
20
|
+
icon: string
|
|
21
|
+
text: string
|
|
22
|
+
url: string
|
|
23
|
+
_isActiveUrl: string
|
|
24
|
+
}[]
|
|
19
25
|
_isActiveUrl: boolean
|
|
20
26
|
}
|
|
21
27
|
| 'divider'
|
|
@@ -86,7 +92,7 @@ function NavLink(props: NavLinkProps) {
|
|
|
86
92
|
|
|
87
93
|
interface NavLinkWithDropdownProps {
|
|
88
94
|
text: string
|
|
89
|
-
submenu: { text: string; url: string; _isActiveUrl: string }[]
|
|
95
|
+
submenu: { icon: string; text: string; url: string; _isActiveUrl: string }[]
|
|
90
96
|
activatePanel: (panel: string) => void
|
|
91
97
|
}
|
|
92
98
|
|
|
@@ -128,12 +134,13 @@ class NavLinkWithDropdown extends React.Component<
|
|
|
128
134
|
<NavigationMenu.Sub>
|
|
129
135
|
<NavigationMenu.List className={s.dropdownList}>
|
|
130
136
|
{submenu.map((submenuItem, stableIdx) => {
|
|
131
|
-
const { text, url } = submenuItem
|
|
137
|
+
const { icon, text, url } = submenuItem
|
|
132
138
|
return (
|
|
133
139
|
// eslint-disable-next-line react/no-array-index-key
|
|
134
140
|
<NavigationMenu.Item key={stableIdx}>
|
|
135
141
|
<NavigationMenu.Link asChild>
|
|
136
142
|
<Link className={s.submenuItem} href={url}>
|
|
143
|
+
{icon ? <FlightIcon name={icon} /> : null}
|
|
137
144
|
{text}
|
|
138
145
|
</Link>
|
|
139
146
|
</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
|
}
|