@hashicorp/react-components 0.0.0-nightly.e8ac55b → 0.0.0-nightly.ed6ac6e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/package.json +8 -5
  2. package/src/components/marketo-form/partials/fields/htmltext-field/style.module.css +16 -4
  3. package/src/components/marketo-form/utils.ts +4 -0
  4. package/src/components/nav-panel/components/link-list/index.tsx +89 -0
  5. package/src/components/nav-panel/components/link-list/style.module.css +57 -0
  6. package/src/components/nav-panel/components/panel/column/index.tsx +24 -0
  7. package/src/components/nav-panel/components/panel/column/style.module.css +24 -0
  8. package/src/components/nav-panel/components/panel/index.tsx +4 -0
  9. package/src/components/nav-panel/components/panel/root/index.tsx +20 -0
  10. package/src/components/nav-panel/components/panel/root/style.module.css +30 -0
  11. package/src/components/nav-panel/components/promo/index.tsx +86 -0
  12. package/src/components/nav-panel/components/promo/style.module.css +114 -0
  13. package/src/components/nav-panel/index.tsx +6 -0
  14. package/src/components/nav-panel/product-panel/index.tsx +165 -0
  15. package/src/components/nav-panel/product-panel/style.module.css +315 -0
  16. package/src/components/nav-panel/standard-panel/index.tsx +44 -0
  17. package/src/components/nav-panel/standard-panel/style.module.css +11 -0
  18. package/src/components/next-steps/index.tsx +4 -10
  19. package/src/components/subnav/index.tsx +7 -7
  20. package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +8 -12
  21. package/src/components/subnav/partials/CtaLinks/index.tsx +1 -1
  22. package/src/components/subnav/partials/CtaLinks/style.module.css +4 -4
  23. package/src/components/subnav/partials/DropdownTrigger/index.tsx +2 -2
  24. package/src/components/subnav/partials/DropdownTrigger/style.module.css +7 -4
  25. package/src/components/subnav/partials/MenuItemsDefault/index.tsx +11 -4
  26. package/src/components/subnav/partials/MenuItemsDefault/style.module.css +37 -24
  27. package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +9 -5
  28. package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +22 -16
  29. package/src/components/subnav/partials/TitleLink/index.tsx +10 -10
  30. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts +9 -8
  31. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts +9 -8
  32. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-dark.ts +10 -10
  33. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-light.ts +10 -10
  34. package/src/components/subnav/partials/TitleLink/style.module.css +1 -1
  35. package/src/components/subnav/partials/nav-item-text/style.module.css +2 -4
  36. package/src/components/subnav/style.module.css +3 -5
  37. package/src/lib/parse-url/index.test.ts +35 -0
  38. package/src/lib/parse-url/index.ts +32 -0
  39. package/src/lib/track-nav-click-event/index.ts +22 -0
  40. package/src/lib/v/index.ts +10 -0
  41. package/src/components/subnav/theme.module.css +0 -50
@@ -0,0 +1,315 @@
1
+ @custom-media --dev-dot-viewport (min-width: 924px);
2
+
3
+ .productPanel {
4
+ height: 100%;
5
+
6
+ @media (--large) {
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
+ }
22
+ }
23
+ }
24
+
25
+ .productCategories {
26
+ list-style: none;
27
+ padding: 0;
28
+ display: grid;
29
+ margin: var(--hdsplus-spacing-07) 0 0;
30
+
31
+ @media (--large) {
32
+ @nest .noSide & {
33
+ margin: 0;
34
+ }
35
+ }
36
+
37
+ @media (--dev-dot-viewport) {
38
+ @nest .hasSide & {
39
+ margin: 0;
40
+ }
41
+ }
42
+ }
43
+
44
+ .productCategory {
45
+ display: flex;
46
+ flex-direction: column;
47
+ min-width: 160px;
48
+
49
+ &:first-child {
50
+ border-bottom: 1px solid var(--token-color-border-primary);
51
+ margin-bottom: var(--hdsplus-spacing-05);
52
+ padding-bottom: var(--hdsplus-spacing-05);
53
+ }
54
+ }
55
+
56
+ .eyebrow {
57
+ padding-bottom: var(--hdsplus-spacing-04);
58
+ color: var(--token-color-foreground-strong);
59
+ font-weight: var(--font-weight-semi-bold);
60
+
61
+ @media (--large) {
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
+ }
73
+ }
74
+ }
75
+
76
+ .productList {
77
+ display: grid;
78
+ grid-template-columns: 1fr;
79
+ list-style: none;
80
+ margin: 0;
81
+ padding: 0;
82
+
83
+ @media (--large) {
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
+ }
109
+ }
110
+ }
111
+
112
+ /* NavProduct styles */
113
+
114
+ .productWrapper {
115
+ display: flex;
116
+ margin-bottom: var(--hdsplus-spacing-05);
117
+ gap: var(--hdsplus-spacing-05);
118
+
119
+ @media (--large) {
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
+ }
130
+
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
+ }
140
+ }
141
+ }
142
+ }
143
+
144
+ .productLogo {
145
+ margin-top: 3px;
146
+
147
+ & svg {
148
+ height: 42px;
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
+ }
160
+
161
+ @nest .hasSide & {
162
+ & svg {
163
+ @media (--dev-dot-viewport) {
164
+ height: var(--hdsplus-spacing-08);
165
+ width: var(--hdsplus-spacing-08);
166
+ }
167
+ }
168
+ }
169
+ }
170
+
171
+ .productTextContent {
172
+ display: flex;
173
+ flex-direction: column;
174
+ color: var(--token-color-foreground-strong);
175
+ }
176
+
177
+ .productDesc {
178
+ font-weight: 400;
179
+ font-size: 14px;
180
+ line-height: 20px;
181
+ letter-spacing: 0.0125em;
182
+ color: var(--token-color-foreground-faint);
183
+ }
184
+
185
+ .focusIndicator {
186
+ &:focus {
187
+ outline: 2px solid var(--token-color-focus-action-internal);
188
+ outline-style: auto;
189
+ }
190
+ }
191
+
192
+ .mainPanel {
193
+ height: 100%;
194
+ display: flex;
195
+ justify-content: space-between;
196
+ flex-direction: column;
197
+
198
+ @media (--large) {
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
+ }
210
+ }
211
+ }
212
+
213
+ .sidePanel {
214
+ height: 100%;
215
+ background: var(--token-color-surface-faint);
216
+ display: flex;
217
+ flex-direction: column;
218
+ gap: var(--hdsplus-spacing-05);
219
+ margin: 0;
220
+ padding: var(--hdsplus-spacing-07) var(--hdsplus-spacing-04)
221
+ var(--hdsplus-spacing-09) var(--hdsplus-spacing-07);
222
+ }
223
+
224
+ .sidePanelItems {
225
+ list-style: none;
226
+ margin: 0;
227
+ padding: 0;
228
+ display: grid;
229
+ grid-template-columns: 1fr;
230
+ gap: var(--hdsplus-spacing-07);
231
+
232
+ @media (--dev-dot-viewport) {
233
+ gap: var(--hdsplus-spacing-05);
234
+ }
235
+ }
236
+
237
+ /* Lifted from .productWrapper */
238
+ .sidePanelItem {
239
+ display: flex;
240
+ gap: var(--hdsplus-spacing-05);
241
+
242
+ @media (--dev-dot-viewport) {
243
+ padding: var(--hdsplus-spacing-03) var(--hdsplus-spacing-05);
244
+
245
+ &:hover {
246
+ background-color: var(--token-color-surface-interactive-hover);
247
+ border-radius: var(--hdsplus-spacing-01);
248
+ }
249
+ }
250
+ }
251
+
252
+ /* Lifted from:
253
+ packages/react-components/src/components/nav-panel/components/link-list/style.module.css */
254
+ .iconBackground {
255
+ background: var(--token-color-foreground-high-contrast);
256
+ height: var(--hdsplus-spacing-08);
257
+ width: var(--hdsplus-spacing-08);
258
+ display: flex;
259
+ align-items: center;
260
+ justify-content: center;
261
+ border-radius: 3px;
262
+ flex: none;
263
+ margin-top: 3px;
264
+ border: 1px solid var(--token-color-border-primary);
265
+ }
266
+
267
+ /* Lifted from .productTextContent */
268
+ .sidePanelItemContent {
269
+ display: flex;
270
+ flex-direction: column;
271
+ color: var(--token-color-foreground-strong);
272
+ }
273
+
274
+ .sidePanelItemDesc {
275
+ font-weight: 400;
276
+ font-size: 13px;
277
+ line-height: 18px;
278
+ color: var(--token-color-foreground-primary);
279
+ }
280
+
281
+ /* Branding exception classnames */
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
+
298
+ /* Styles for HCP Vault mimic the spec for `product-square` icons,
299
+ while allowing the symbol inside the icon border to change color
300
+ based on the site's theme
301
+ */
302
+ .hcpVaultSecrets,
303
+ .hcpVaultRadar {
304
+ padding: var(--hdsplus-spacing-01);
305
+ border: 2px solid var(--token-color-vault-brand);
306
+ border-radius: 3px;
307
+
308
+ & use {
309
+ fill: var(--token-color-foreground-strong);
310
+ }
311
+
312
+ & path {
313
+ fill: inherit;
314
+ }
315
+ }
@@ -0,0 +1,44 @@
1
+ import { trackNavClickEvent } from '../../../lib/track-nav-click-event'
2
+ import * as NavPanel from '../components/panel'
3
+ import LinkList, { type LinkListProps } from '../components/link-list'
4
+ import Promo, { type PromoProps } from '../components/promo'
5
+ import s from './style.module.css'
6
+
7
+ export interface NavItem {
8
+ navItems: LinkListProps['links']
9
+ }
10
+
11
+ interface StandardPanelProps {
12
+ navData: NavItem[]
13
+ promo?: PromoProps
14
+ sectionName?: string
15
+ }
16
+
17
+ const StandardPanel = ({
18
+ navData,
19
+ promo,
20
+ sectionName = '',
21
+ }: StandardPanelProps) => {
22
+ return (
23
+ <NavPanel.Root>
24
+ <div className={s.columns}>
25
+ {navData.map(({ navItems }, stableIdx) => {
26
+ return (
27
+ <NavPanel.Column key={stableIdx}>
28
+ <LinkList
29
+ links={navItems}
30
+ linkClickHandler={(text, href) => {
31
+ trackNavClickEvent(text, href, sectionName)
32
+ }}
33
+ />
34
+ </NavPanel.Column>
35
+ )
36
+ })}
37
+ </div>
38
+
39
+ {promo ? <Promo {...promo} /> : null}
40
+ </NavPanel.Root>
41
+ )
42
+ }
43
+
44
+ export default StandardPanel
@@ -0,0 +1,11 @@
1
+ .columns {
2
+ display: flex;
3
+ gap: var(--hdsplus-spacing-03);
4
+ flex-direction: column;
5
+ margin-top: var(--hdsplus-spacing-07);
6
+
7
+ @media (--large) {
8
+ flex-direction: row;
9
+ margin-top: 0;
10
+ }
11
+ }
@@ -3,7 +3,7 @@
3
3
  * SPDX-License-Identifier: MPL-2.0
4
4
  */
5
5
 
6
- import * as React from 'react'
6
+ import { useState } from 'react'
7
7
  import Badge from '@hashicorp/react-badge'
8
8
  import classNames from 'classnames'
9
9
  import ExpandableArrow from '@hashicorp/react-expandable-arrow'
@@ -23,16 +23,10 @@ export default function NextSteps({
23
23
  steps,
24
24
  cta,
25
25
  }: NextStepsProps) {
26
- const { slug, themeClass } = useProductMeta(theme)
27
-
26
+ const { themeClass } = useProductMeta(theme)
28
27
  return (
29
28
  <section
30
- className={classNames(
31
- s.nextSteps,
32
- s[appearance],
33
- themeClass,
34
- slug && s[slug]
35
- )}
29
+ className={classNames(s.nextSteps, s[appearance], themeClass)}
36
30
  data-testid="next-steps"
37
31
  >
38
32
  <div className={s.container}>
@@ -96,7 +90,7 @@ export default function NextSteps({
96
90
  }
97
91
 
98
92
  function Tile({ theme, variant, heading, badge, description, cta }) {
99
- const [isHovered, setIsHovered] = React.useState(false)
93
+ const [isHovered, setIsHovered] = useState(false)
100
94
  return (
101
95
  <Link href={cta.url} legacyBehavior>
102
96
  <a
@@ -1,17 +1,14 @@
1
+ 'use client'
2
+
1
3
  /**
2
4
  * Copyright (c) HashiCorp, Inc.
3
5
  * SPDX-License-Identifier: MPL-2.0
4
6
  */
5
-
6
- 'use client'
7
-
8
7
  import { useState } from 'react'
9
8
  import classNames from 'classnames'
10
9
  import useProductMeta, { Products } from '@hashicorp/platform-product-meta'
11
10
  import { THEMES } from './subnav-consts'
12
11
  import useNavRef from './helpers/useNavRef'
13
- import s from './style.module.css'
14
- import themeStyles from './theme.module.css'
15
12
 
16
13
  import MenuItemsOverflow from './partials/MenuItemsOverflow'
17
14
  import TitleLink from './partials/TitleLink'
@@ -20,6 +17,7 @@ import CtaLinks, { type CtaLinkProps } from './partials/CtaLinks'
20
17
  import traverse, { isObject } from './helpers/traverse'
21
18
  import { areBasePathsMatching } from './helpers/areBasePathsMatching'
22
19
  import * as NavigationMenu from '@radix-ui/react-navigation-menu'
20
+ import s from './style.module.css'
23
21
 
24
22
  const productAllowList = {
25
23
  consul: 'consul',
@@ -76,7 +74,6 @@ function SubnavInner({
76
74
  menuText = 'Menu',
77
75
  activatePanel,
78
76
  }: SubnavInnerProps) {
79
- const { themeClass } = useProductMeta(product) // overrides --brand css vars
80
77
  // Add _isActiveUrl to menuItems so we can highlight them appropriately
81
78
  const menuItemsWithActive = traverse(menuItems, (_key, value: any) => {
82
79
  const hasUrl = isObject(value) && value.url
@@ -88,6 +85,8 @@ function SubnavInner({
88
85
  return value
89
86
  })
90
87
 
88
+ const { themeClass } = useProductMeta(product)
89
+
91
90
  /**
92
91
  * Note on constrainWidth & g-grid-container
93
92
  *
@@ -175,9 +174,10 @@ function Subnav({ className, theme = 'light', ...restProps }: SubnavProps) {
175
174
  <style>{`:root{--subnav-height:${height}px}`}</style>
176
175
  <NavigationMenu.Root
177
176
  ref={wrapperRef}
178
- className={classNames(s.root, themeStyles[theme], className, {
177
+ className={classNames(s.root, className, {
179
178
  [s.isSticky]: isSticky,
180
179
  [s.hasOverflow]: hasOverflow,
180
+ 'hdsplus-dark-mode': theme === 'dark',
181
181
  })}
182
182
  aria-label={`${product} website navigation`}
183
183
  onValueChange={activatePanel}
@@ -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-color: transparent;
10
- --local-divider-color: var(--border-color); /* from theme.module.css */
7
+ --local-scrim-opacity: 0;
8
+ --local-divider-color: var(--token-color-border-primary);
11
9
 
12
10
  position: relative;
13
- color: var(--gh-stars-icon-color); /* from theme.module.css */
14
- border: 1px solid var(--local-divider-color); /* from theme.module.css */
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: background 0.25s ease;
28
+ transition: opacity 0.25s ease;
29
+ opacity: var(--local-scrim-opacity);
31
30
  z-index: 0;
32
- background-color: var(--local-scrim-color);
31
+ background-color: var(--token-color-foreground-primary);
33
32
  }
34
33
 
35
34
  &:hover,
36
35
  &:active {
37
- --local-divider-color: transparent;
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
 
@@ -12,8 +12,8 @@ import type { ToggleButtonProps } from '@hashicorp/react-design-system-component
12
12
  import * as Dropdown from '@hashicorp/react-design-system-components/src/components/dropdown'
13
13
  import GithubStarsLink from './github-stars-link'
14
14
  import classNames from 'classnames'
15
- import s from './style.module.css'
16
15
  import * as NavigationMenu from '@radix-ui/react-navigation-menu'
16
+ import s from './style.module.css'
17
17
 
18
18
  type CtaLink = ButtonProps & { href: string; __typename?: string }
19
19
 
@@ -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 12px;
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: 16px;
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-left: 0;
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: 16px;
32
+ margin-top: var(--hdsplus-spacing-05);
33
33
 
34
34
  &:last-of-type {
35
35
  margin-bottom: var(--hdsplus-spacing-04);
@@ -5,8 +5,8 @@
5
5
 
6
6
  import FlightIcon from '@hashicorp/react-design-system-components/src/components/flight-icon'
7
7
  import NavItemText from '../nav-item-text'
8
- import s from './style.module.css'
9
8
  import * as NavigationMenu from '@radix-ui/react-navigation-menu'
9
+ import s from './style.module.css'
10
10
 
11
11
  interface DropdownTriggerProps {
12
12
  text: string
@@ -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" color="var(--menu-item-text-color)" />
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(--menu-item-text-color); /* from theme.module.css */
27
+ fill: var(--token-color-foreground-primary);
30
28
  }
31
29
 
32
30
  &:hover {
33
- background-color: var(--menu-item-hover-color);
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
  }
@@ -7,15 +7,21 @@ import React from 'react'
7
7
  import Link from 'next/link'
8
8
  import NavItemText from '../nav-item-text'
9
9
  import DropdownTrigger from '../DropdownTrigger'
10
- import s from './style.module.css'
11
10
  import * as NavigationMenu from '@radix-ui/react-navigation-menu'
11
+ import s from './style.module.css'
12
+ import FlightIcon from '@hashicorp/react-design-system-components/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: { text: string; url: string; _isActiveUrl: string }[]
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>