@hashicorp/react-components 0.0.0-nightly.8df4a87 → 0.0.0-nightly.91abcef

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 (90) hide show
  1. package/package.json +10 -6
  2. package/src/components/actions/index.tsx +5 -5
  3. package/src/components/call-to-action/index.tsx +7 -7
  4. package/src/components/card/index.test.tsx +1 -1
  5. package/src/components/card/newsroom-card/index.test.tsx +1 -1
  6. package/src/components/card/partner-card/index.tsx +3 -3
  7. package/src/components/card/person-card/index.tsx +1 -1
  8. package/src/components/card/primitives.tsx +16 -15
  9. package/src/components/card/resource-card/index.test.tsx +1 -1
  10. package/src/components/card/resource-card/index.tsx +3 -0
  11. package/src/components/card/types.ts +2 -2
  12. package/src/components/card/unified-card/index.spec.tsx +40 -0
  13. package/src/components/card/unified-card/index.tsx +5 -11
  14. package/src/components/marketo-form/contexts/FormMetadata.ts +2 -0
  15. package/src/components/marketo-form/form/index.tsx +4 -2
  16. package/src/components/marketo-form/partials/fields/checkbox-field/index.tsx +1 -1
  17. package/src/components/marketo-form/partials/fields/email-field/index.tsx +1 -1
  18. package/src/components/marketo-form/partials/fields/form-page-url-field/index.tsx +12 -1
  19. package/src/components/marketo-form/partials/fields/hidden-field/index.tsx +1 -0
  20. package/src/components/marketo-form/partials/fields/htmltext-field/style.module.css +16 -4
  21. package/src/components/marketo-form/partials/fields/radio-buttons-field/index.tsx +1 -1
  22. package/src/components/marketo-form/partials/fields/select-field/index.tsx +1 -1
  23. package/src/components/marketo-form/partials/fields/telephone-field/index.tsx +1 -1
  24. package/src/components/marketo-form/partials/fields/text-field/index.tsx +1 -1
  25. package/src/components/marketo-form/partials/fields/textarea-field/index.tsx +1 -1
  26. package/src/components/marketo-form/types.ts +5 -11
  27. package/src/components/marketo-form/utils.ts +4 -0
  28. package/src/components/nav-panel/components/link-list/index.tsx +16 -10
  29. package/src/components/nav-panel/components/panel/column/index.tsx +17 -2
  30. package/src/components/nav-panel/components/panel/column/style.module.css +12 -2
  31. package/src/components/nav-panel/components/panel/root/index.tsx +13 -2
  32. package/src/components/nav-panel/components/panel/root/style.module.css +19 -4
  33. package/src/components/nav-panel/components/promo/index.tsx +23 -13
  34. package/src/components/nav-panel/components/promo/style.module.css +28 -6
  35. package/src/components/nav-panel/product-panel/index.tsx +114 -32
  36. package/src/components/nav-panel/product-panel/style.module.css +230 -15
  37. package/src/components/nav-panel/standard-panel/index.tsx +4 -1
  38. package/src/components/nav-panel/standard-panel/style.module.css +1 -1
  39. package/src/components/next-steps/index.tsx +7 -12
  40. package/src/components/product-badge/index.tsx +1 -1
  41. package/src/components/subnav/index.tsx +18 -8
  42. package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +8 -12
  43. package/src/components/subnav/partials/CtaLinks/index.tsx +10 -9
  44. package/src/components/subnav/partials/CtaLinks/style.module.css +4 -4
  45. package/src/components/subnav/partials/DropdownTrigger/index.tsx +3 -3
  46. package/src/components/subnav/partials/DropdownTrigger/style.module.css +7 -4
  47. package/src/components/subnav/partials/MenuItemsDefault/index.tsx +31 -9
  48. package/src/components/subnav/partials/MenuItemsDefault/style.module.css +37 -24
  49. package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +21 -5
  50. package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +22 -16
  51. package/src/components/subnav/partials/TitleLink/index.tsx +14 -12
  52. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts +9 -8
  53. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts +9 -8
  54. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-dark.ts +10 -10
  55. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-light.ts +10 -10
  56. package/src/components/subnav/partials/TitleLink/style.module.css +1 -1
  57. package/src/components/subnav/partials/nav-item-text/style.module.css +2 -4
  58. package/src/components/subnav/style.module.css +4 -6
  59. package/src/lib/get-localized-link-props/index.test.ts +30 -0
  60. package/src/lib/get-localized-link-props/index.ts +46 -0
  61. package/src/lib/parse-url/index.test.ts +69 -0
  62. package/src/lib/parse-url/index.ts +104 -0
  63. package/src/lib/supported-locales/index.ts +1 -0
  64. package/src/lib/track-nav-click-event/index.ts +22 -0
  65. package/src/lib/v/index.ts +10 -0
  66. package/src/components/consent-manager/README.md +0 -73
  67. package/src/components/consent-manager/components/banner/banner.module.css +0 -23
  68. package/src/components/consent-manager/components/banner/banner.test.tsx +0 -31
  69. package/src/components/consent-manager/components/banner/banner.tsx +0 -73
  70. package/src/components/consent-manager/components/dialog/dialog.module.css +0 -145
  71. package/src/components/consent-manager/components/dialog/dialog.test.tsx +0 -194
  72. package/src/components/consent-manager/components/dialog/dialog.tsx +0 -339
  73. package/src/components/consent-manager/img/icn_close.tsx +0 -19
  74. package/src/components/consent-manager/index.test.tsx +0 -334
  75. package/src/components/consent-manager/index.tsx +0 -186
  76. package/src/components/consent-manager/loader/README.md +0 -29
  77. package/src/components/consent-manager/loader/categories.ts +0 -22
  78. package/src/components/consent-manager/loader/index.tsx +0 -94
  79. package/src/components/consent-manager/loader/presets/enterprise.ts +0 -12
  80. package/src/components/consent-manager/loader/presets/oss.ts +0 -10
  81. package/src/components/consent-manager/loader/services.ts +0 -45
  82. package/src/components/consent-manager/scripts/custom.tsx +0 -59
  83. package/src/components/consent-manager/scripts/segment.tsx +0 -87
  84. package/src/components/consent-manager/style.module.css +0 -9
  85. package/src/components/consent-manager/types.ts +0 -55
  86. package/src/components/consent-manager/util/cookies.test.ts +0 -75
  87. package/src/components/consent-manager/util/cookies.ts +0 -70
  88. package/src/components/consent-manager/util/integrations.test.ts +0 -115
  89. package/src/components/consent-manager/util/integrations.ts +0 -110
  90. package/src/components/subnav/theme.module.css +0 -50
@@ -1,11 +1,43 @@
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
+
1
25
  .productCategories {
2
26
  list-style: none;
3
27
  padding: 0;
4
28
  display: grid;
5
- margin: var(--hdsplus-spacing-06) 0 0;
29
+ margin: var(--hdsplus-spacing-07) 0 0;
6
30
 
7
31
  @media (--large) {
8
- margin: 0;
32
+ @nest .noSide & {
33
+ margin: 0;
34
+ }
35
+ }
36
+
37
+ @media (--dev-dot-viewport) {
38
+ @nest .hasSide & {
39
+ margin: 0;
40
+ }
9
41
  }
10
42
  }
11
43
 
@@ -27,7 +59,17 @@
27
59
  font-weight: var(--font-weight-semi-bold);
28
60
 
29
61
  @media (--large) {
30
- padding: 0 0 var(--hdsplus-spacing-01) var(--hdsplus-spacing-04);
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
+ }
31
73
  }
32
74
  }
33
75
 
@@ -39,10 +81,31 @@
39
81
  padding: 0;
40
82
 
41
83
  @media (--large) {
42
- grid-auto-flow: row;
43
- grid-template-columns: repeat(2, 300px);
44
- grid-template-rows: repeat(2, max-content);
45
- gap: 0;
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
+ }
46
109
  }
47
110
  }
48
111
 
@@ -54,12 +117,26 @@
54
117
  gap: var(--hdsplus-spacing-05);
55
118
 
56
119
  @media (--large) {
57
- padding: var(--hdsplus-spacing-05);
58
- margin-bottom: 0;
120
+ @nest .noSide & {
121
+ padding: var(--hdsplus-spacing-03) var(--hdsplus-spacing-05);
122
+ margin-bottom: 0;
59
123
 
60
- &:hover {
61
- background-color: var(--token-color-surface-interactive-hover);
62
- border-radius: var(--hdsplus-spacing-01);
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
+ }
63
140
  }
64
141
  }
65
142
  }
@@ -70,10 +147,23 @@
70
147
  & svg {
71
148
  height: 42px;
72
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
+ }
73
160
 
74
- @media (--large) {
75
- height: var(--hdsplus-spacing-08);
76
- width: var(--hdsplus-spacing-08);
161
+ @nest .hasSide & {
162
+ & svg {
163
+ @media (--dev-dot-viewport) {
164
+ height: var(--hdsplus-spacing-08);
165
+ width: var(--hdsplus-spacing-08);
166
+ }
77
167
  }
78
168
  }
79
169
  }
@@ -98,3 +188,128 @@
98
188
  outline-style: auto;
99
189
  }
100
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
+ }
@@ -1,4 +1,4 @@
1
- import { trackNavClickEvent } from '../../../../../../apps/www/layouts/standard/nav'
1
+ import { trackNavClickEvent } from '../../../lib/track-nav-click-event'
2
2
  import * as NavPanel from '../components/panel'
3
3
  import LinkList, { type LinkListProps } from '../components/link-list'
4
4
  import Promo, { type PromoProps } from '../components/promo'
@@ -12,12 +12,14 @@ interface StandardPanelProps {
12
12
  navData: NavItem[]
13
13
  promo?: PromoProps
14
14
  sectionName?: string
15
+ locale?: any
15
16
  }
16
17
 
17
18
  const StandardPanel = ({
18
19
  navData,
19
20
  promo,
20
21
  sectionName = '',
22
+ locale,
21
23
  }: StandardPanelProps) => {
22
24
  return (
23
25
  <NavPanel.Root>
@@ -26,6 +28,7 @@ const StandardPanel = ({
26
28
  return (
27
29
  <NavPanel.Column key={stableIdx}>
28
30
  <LinkList
31
+ locale={locale}
29
32
  links={navItems}
30
33
  linkClickHandler={(text, href) => {
31
34
  trackNavClickEvent(text, href, sectionName)
@@ -2,7 +2,7 @@
2
2
  display: flex;
3
3
  gap: var(--hdsplus-spacing-03);
4
4
  flex-direction: column;
5
- margin-top: var(--hdsplus-spacing-06);
5
+ margin-top: var(--hdsplus-spacing-07);
6
6
 
7
7
  @media (--large) {
8
8
  flex-direction: row;
@@ -2,15 +2,16 @@
2
2
  * Copyright (c) HashiCorp, Inc.
3
3
  * SPDX-License-Identifier: MPL-2.0
4
4
  */
5
+ 'use client'
5
6
 
6
- import * as React from 'react'
7
+ import { useState } from 'react'
7
8
  import Badge from '@hashicorp/react-badge'
8
9
  import classNames from 'classnames'
9
10
  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-design-system-components/src/components/standalone-link'
14
+ import { HDSPlusStandaloneLink } from '@hashicorp/react-mds/src/hds-plus/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'
@@ -23,16 +24,10 @@ export default function NextSteps({
23
24
  steps,
24
25
  cta,
25
26
  }: NextStepsProps) {
26
- const { slug, themeClass } = useProductMeta(theme)
27
-
27
+ const { themeClass } = useProductMeta(theme)
28
28
  return (
29
29
  <section
30
- className={classNames(
31
- s.nextSteps,
32
- s[appearance],
33
- themeClass,
34
- slug && s[slug]
35
- )}
30
+ className={classNames(s.nextSteps, s[appearance], themeClass)}
36
31
  data-testid="next-steps"
37
32
  >
38
33
  <div className={s.container}>
@@ -75,7 +70,7 @@ export default function NextSteps({
75
70
  {cta ? (
76
71
  <div className={s.cta}>
77
72
  <p className={s.ctaCopy}>{cta.copy}</p>
78
- <StandaloneLink
73
+ <HDSPlusStandaloneLink
79
74
  href={cta.href}
80
75
  text={cta.ctaText}
81
76
  icon={
@@ -96,7 +91,7 @@ export default function NextSteps({
96
91
  }
97
92
 
98
93
  function Tile({ theme, variant, heading, badge, description, cta }) {
99
- const [isHovered, setIsHovered] = React.useState(false)
94
+ const [isHovered, setIsHovered] = useState(false)
100
95
  return (
101
96
  <Link href={cta.url} legacyBehavior>
102
97
  <a
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import type { Products } from '@hashicorp/platform-product-meta'
7
- import Badge from '@hashicorp/react-design-system-components/src/components/badge'
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
 
@@ -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',
@@ -48,6 +46,7 @@ type SubnavDropdown = {
48
46
  type MenuItem = SubnavLink | SubnavDropdown | 'divider'
49
47
 
50
48
  export interface SubnavInnerProps {
49
+ locale?: string
51
50
  hasOverflow?: boolean
52
51
  titleLink: { text: string; url: string }
53
52
  product?: Products
@@ -63,6 +62,7 @@ export interface SubnavInnerProps {
63
62
  }
64
63
 
65
64
  function SubnavInner({
65
+ locale,
66
66
  hasOverflow,
67
67
  titleLink,
68
68
  product,
@@ -76,7 +76,6 @@ function SubnavInner({
76
76
  menuText = 'Menu',
77
77
  activatePanel,
78
78
  }: SubnavInnerProps) {
79
- const { themeClass } = useProductMeta(product) // overrides --brand css vars
80
79
  // Add _isActiveUrl to menuItems so we can highlight them appropriately
81
80
  const menuItemsWithActive = traverse(menuItems, (_key, value: any) => {
82
81
  const hasUrl = isObject(value) && value.url
@@ -88,6 +87,8 @@ function SubnavInner({
88
87
  return value
89
88
  })
90
89
 
90
+ const { themeClass } = useProductMeta(product)
91
+
91
92
  /**
92
93
  * Note on constrainWidth & g-grid-container
93
94
  *
@@ -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, themeStyles[theme], className, {
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={`${product} website navigation`}
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-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
 
@@ -3,19 +3,20 @@
3
3
  * SPDX-License-Identifier: MPL-2.0
4
4
  */
5
5
 
6
- import Button, {
7
- type ButtonProps,
8
- } from '@hashicorp/react-design-system-components/src/components/button'
9
- import FlightIcon from '@hashicorp/react-design-system-components/src/components/flight-icon'
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-design-system-components/src/components/dropdown/toggle/button'
12
- import * as Dropdown from '@hashicorp/react-design-system-components/src/components/dropdown'
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
- import s from './style.module.css'
16
16
  import * as NavigationMenu from '@radix-ui/react-navigation-menu'
17
+ import s from './style.module.css'
17
18
 
18
- type CtaLink = ButtonProps & { href: string; __typename?: string }
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
- <Button
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 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);
@@ -3,10 +3,10 @@
3
3
  * SPDX-License-Identifier: MPL-2.0
4
4
  */
5
5
 
6
- import FlightIcon from '@hashicorp/react-design-system-components/src/components/flight-icon'
6
+ import FlightIcon from '@hashicorp/react-hds/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
  }