@hashicorp/react-components 0.0.0-nightly.b46420c → 0.0.0-nightly.b5f9cca

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 (82) hide show
  1. package/package.json +5 -4
  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 +2 -0
  19. package/src/components/marketo-form/partials/fields/hidden-field/index.tsx +1 -0
  20. package/src/components/marketo-form/partials/fields/radio-buttons-field/index.tsx +1 -1
  21. package/src/components/marketo-form/partials/fields/select-field/index.tsx +1 -1
  22. package/src/components/marketo-form/partials/fields/telephone-field/index.tsx +1 -1
  23. package/src/components/marketo-form/partials/fields/text-field/index.tsx +1 -1
  24. package/src/components/marketo-form/partials/fields/textarea-field/index.tsx +1 -1
  25. package/src/components/marketo-form/types.ts +10 -11
  26. package/src/components/nav-panel/components/link-list/index.tsx +25 -8
  27. package/src/components/nav-panel/components/panel/column/index.tsx +17 -2
  28. package/src/components/nav-panel/components/panel/column/style.module.css +12 -2
  29. package/src/components/nav-panel/components/panel/root/index.tsx +13 -2
  30. package/src/components/nav-panel/components/panel/root/style.module.css +19 -4
  31. package/src/components/nav-panel/components/promo/index.tsx +15 -8
  32. package/src/components/nav-panel/components/promo/style.module.css +28 -6
  33. package/src/components/nav-panel/product-panel/index.tsx +104 -27
  34. package/src/components/nav-panel/product-panel/style.module.css +230 -15
  35. package/src/components/nav-panel/standard-panel/index.tsx +3 -0
  36. package/src/components/nav-panel/standard-panel/style.module.css +1 -1
  37. package/src/components/next-steps/index.tsx +3 -2
  38. package/src/components/product-badge/index.tsx +1 -1
  39. package/src/components/subnav/index.tsx +14 -4
  40. package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +8 -12
  41. package/src/components/subnav/partials/CtaLinks/index.tsx +9 -8
  42. package/src/components/subnav/partials/CtaLinks/style.module.css +4 -4
  43. package/src/components/subnav/partials/DropdownTrigger/index.tsx +2 -2
  44. package/src/components/subnav/partials/DropdownTrigger/style.module.css +7 -4
  45. package/src/components/subnav/partials/MenuItemsDefault/index.tsx +29 -8
  46. package/src/components/subnav/partials/MenuItemsDefault/style.module.css +37 -24
  47. package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +18 -4
  48. package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +22 -16
  49. package/src/components/subnav/partials/TitleLink/index.tsx +5 -3
  50. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts +2 -1
  51. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts +2 -1
  52. package/src/components/subnav/partials/TitleLink/style.module.css +1 -1
  53. package/src/components/subnav/partials/nav-item-text/style.module.css +2 -4
  54. package/src/components/subnav/style.module.css +4 -6
  55. package/src/lib/parse-url/index.test.ts +40 -1
  56. package/src/lib/parse-url/index.ts +78 -9
  57. package/src/lib/v/index.ts +4 -5
  58. package/src/components/consent-manager/README.md +0 -73
  59. package/src/components/consent-manager/components/banner/banner.module.css +0 -23
  60. package/src/components/consent-manager/components/banner/banner.test.tsx +0 -31
  61. package/src/components/consent-manager/components/banner/banner.tsx +0 -73
  62. package/src/components/consent-manager/components/dialog/dialog.module.css +0 -145
  63. package/src/components/consent-manager/components/dialog/dialog.test.tsx +0 -194
  64. package/src/components/consent-manager/components/dialog/dialog.tsx +0 -339
  65. package/src/components/consent-manager/img/icn_close.tsx +0 -19
  66. package/src/components/consent-manager/index.test.tsx +0 -334
  67. package/src/components/consent-manager/index.tsx +0 -186
  68. package/src/components/consent-manager/loader/README.md +0 -29
  69. package/src/components/consent-manager/loader/categories.ts +0 -22
  70. package/src/components/consent-manager/loader/index.tsx +0 -94
  71. package/src/components/consent-manager/loader/presets/enterprise.ts +0 -12
  72. package/src/components/consent-manager/loader/presets/oss.ts +0 -10
  73. package/src/components/consent-manager/loader/services.ts +0 -45
  74. package/src/components/consent-manager/scripts/custom.tsx +0 -59
  75. package/src/components/consent-manager/scripts/segment.tsx +0 -87
  76. package/src/components/consent-manager/style.module.css +0 -9
  77. package/src/components/consent-manager/types.ts +0 -55
  78. package/src/components/consent-manager/util/cookies.test.ts +0 -75
  79. package/src/components/consent-manager/util/cookies.ts +0 -70
  80. package/src/components/consent-manager/util/integrations.test.ts +0 -115
  81. package/src/components/consent-manager/util/integrations.ts +0 -110
  82. package/src/components/subnav/theme.module.css +0 -50
@@ -1,3 +1,5 @@
1
+ @custom-media --dev-dot-viewport (min-width: 924px);
2
+
1
3
  .column {
2
4
  position: relative;
3
5
  display: flex;
@@ -5,10 +7,18 @@
5
7
  justify-content: flex-start;
6
8
  min-width: 190px;
7
9
  padding: 0;
8
- margin: 0 var(--hdsplus-spacing-05);
10
+ margin: 0 var(--hdsplus-spacing-07);
9
11
  border-radius: var(--hdsplus-spacing-03);
10
12
 
11
13
  @media (--large) {
12
- margin: 0;
14
+ &:not(.hasSide) {
15
+ margin: 0;
16
+ }
17
+ }
18
+
19
+ @media (--dev-dot-viewport) {
20
+ &.hasSide {
21
+ margin: 0;
22
+ }
13
23
  }
14
24
  }
@@ -1,9 +1,20 @@
1
+ import classNames from 'classnames'
1
2
  import s from './style.module.css'
2
3
 
3
4
  interface RootProps {
5
+ className?: string
4
6
  children: React.ReactNode
7
+ hasSidePanel?: boolean
5
8
  }
6
9
 
7
- export default function Root({ children }: RootProps) {
8
- return <div className={s.root}>{children}</div>
10
+ export default function Root({ className, children, hasSidePanel }: RootProps) {
11
+ return (
12
+ <div
13
+ className={classNames(s.root, className, {
14
+ [s.hasSide]: hasSidePanel,
15
+ })}
16
+ >
17
+ {children}
18
+ </div>
19
+ )
9
20
  }
@@ -1,3 +1,5 @@
1
+ @custom-media --dev-dot-viewport (min-width: 924px);
2
+
1
3
  .root {
2
4
  width: 100%;
3
5
  display: flex;
@@ -7,9 +9,22 @@
7
9
  min-height: calc(100dvh - var(--hdsplus-spacing-12));
8
10
 
9
11
  @media (--large) {
10
- justify-content: flex-start;
11
- height: 100%;
12
- min-height: fit-content;
13
- gap: var(--hdsplus-spacing-04);
12
+ &:not(.hasSide) {
13
+ justify-content: flex-start;
14
+ height: 100%;
15
+ min-height: fit-content;
16
+ padding: var(--hdsplus-spacing-05) var(--hdsplus-spacing-04);
17
+ gap: var(--hdsplus-spacing-04);
18
+ }
19
+ }
20
+
21
+ @media (--dev-dot-viewport) {
22
+ &.hasSide {
23
+ justify-content: flex-start;
24
+ height: 100%;
25
+ min-height: fit-content;
26
+ padding: var(--hdsplus-spacing-05) var(--hdsplus-spacing-04);
27
+ gap: var(--hdsplus-spacing-04);
28
+ }
14
29
  }
15
30
  }
@@ -1,10 +1,10 @@
1
1
  import { useCallback } from 'react'
2
2
  import classNames from 'classnames'
3
- import { v } from '../../../../lib/v'
3
+ import { vercelSplit } from '../../../../lib/v'
4
4
  import Link from 'next/link'
5
5
  import { parseUrl } from '../../../../lib/parse-url'
6
6
  import { trackNavClickEvent } from '../../../../lib/track-nav-click-event'
7
- import FlightIcon from '@hashicorp/react-design-system-components/src/components/flight-icon'
7
+ import FlightIcon from '@hashicorp/react-hds/src/components/flight-icon'
8
8
  import * as NavigationMenu from '@radix-ui/react-navigation-menu'
9
9
  import s from './style.module.css'
10
10
 
@@ -16,6 +16,7 @@ export interface PromoProps {
16
16
  slug?: string
17
17
  icon?: string
18
18
  theme: string
19
+ hasSidePanel?: boolean
19
20
  }
20
21
 
21
22
  export default function Promo({
@@ -26,6 +27,7 @@ export default function Promo({
26
27
  slug,
27
28
  icon,
28
29
  theme,
30
+ hasSidePanel,
29
31
  }: PromoProps) {
30
32
  const handleClick = useCallback((title, linkUrl, linkTitle, slug) => {
31
33
  if (window && window.analytics) {
@@ -40,23 +42,28 @@ export default function Promo({
40
42
  }, [])
41
43
 
42
44
  return (
43
- <div className={s.promo}>
45
+ <div
46
+ className={classNames(s.promo, {
47
+ [s.hasSide]: hasSidePanel,
48
+ [s.noSide]: !hasSidePanel,
49
+ })}
50
+ >
44
51
  {icon && (
45
52
  <div
46
53
  className={classNames(s.icon, {
47
- [s.hashidays]: v(theme) === 'hashidays',
48
- [s.hashiconf]: v(theme) === 'hashiconf',
54
+ [s.hashidays]: vercelSplit(theme) === 'hashidays',
55
+ [s.hashiconf]: vercelSplit(theme) === 'hashiconf',
49
56
  })}
50
57
  >
51
- <FlightIcon name={v(icon)} />
58
+ <FlightIcon name={vercelSplit(icon)} />
52
59
  </div>
53
60
  )}
54
61
  <div className={s.rightContent}>
55
62
  <div>
56
63
  <div
57
64
  className={classNames(s.title, {
58
- [s.hashidays]: v(theme) === 'hashidays',
59
- [s.hashiconf]: v(theme) === 'hashiconf',
65
+ [s.hashidays]: vercelSplit(theme) === 'hashidays',
66
+ [s.hashiconf]: vercelSplit(theme) === 'hashiconf',
60
67
  })}
61
68
  >
62
69
  {title}
@@ -1,3 +1,5 @@
1
+ @custom-media --dev-dot-viewport (min-width: 924px);
2
+
1
3
  .promo {
2
4
  display: flex;
3
5
  border-radius: var(--hdsplus-spacing-01);
@@ -7,12 +9,23 @@
7
9
  var(--hdsplus-spacing-06) var(--hdsplus-spacing-08);
8
10
  flex-direction: row;
9
11
  gap: var(--hdsplus-spacing-04);
10
- margin: var(--hdsplus-spacing-05);
12
+ margin: var(--hdsplus-spacing-07);
13
+ margin-bottom: var(--hdsplus-spacing-09);
11
14
 
12
15
  @media (--large) {
13
- margin: 0;
14
- width: min-content;
15
- min-width: 100%;
16
+ &.noSide {
17
+ margin: 0;
18
+ width: min-content;
19
+ min-width: 100%;
20
+ }
21
+ }
22
+
23
+ @media (--dev-dot-viewport) {
24
+ &.hasSide {
25
+ margin: 0;
26
+ width: min-content;
27
+ min-width: 100%;
28
+ }
16
29
  }
17
30
  }
18
31
 
@@ -38,8 +51,17 @@
38
51
  display: none;
39
52
 
40
53
  @media (--large) {
41
- display: block;
42
- margin-top: 3px;
54
+ @nest .noSide & {
55
+ display: block;
56
+ margin-top: 3px;
57
+ }
58
+ }
59
+
60
+ @media (--dev-dot-viewport) {
61
+ @nest .hasSide & {
62
+ display: block;
63
+ margin-top: 3px;
64
+ }
43
65
  }
44
66
  }
45
67
 
@@ -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-design-system-components/src/components/flight-icon'
6
- import { TextPlus } from '@hashicorp/react-design-system-components/src/components/text'
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-color'],
14
+ ['Terraform', 'terraform-fill'],
14
15
  ['Packer', 'packer-fill-color'],
15
16
  ['Vault', 'vault-fill-color'],
16
17
  ['Boundary', 'boundary-fill-color'],
@@ -18,37 +19,107 @@ const PRODUCT_LOGO_MAP = new Map([
18
19
  ['Nomad', 'nomad-fill-color'],
19
20
  ['Waypoint', 'waypoint-fill-color'],
20
21
  ['Vagrant', 'vagrant-fill-color'],
22
+ ['HCP Vault Secrets', 'vault-secrets'],
23
+ ['HCP Vault Radar', 'vault-radar'],
21
24
  ])
22
25
 
23
- interface ProductsPanelProps {
26
+ const PRODUCT_LOGO_EXCEPTION_CLASSNAMES = {
27
+ Terraform: 'terraform',
28
+ 'HCP Vault Secrets': 'hcpVaultSecrets',
29
+ 'HCP Vault Radar': 'hcpVaultRadar',
30
+ }
31
+
32
+ export interface ProductsPanelProps {
24
33
  productCategories: any
25
34
  promo?: PromoProps
35
+ sidePanel?: {
36
+ label: string
37
+ navItems: {
38
+ icon: string
39
+ title: string
40
+ description: string
41
+ url: string
42
+ }[]
43
+ }
26
44
  }
27
45
 
28
- const ProductPanel = ({ productCategories, promo }: ProductsPanelProps) => {
46
+ const ProductPanel = ({
47
+ productCategories,
48
+ promo,
49
+ sidePanel,
50
+ }: ProductsPanelProps) => {
29
51
  return (
30
- <NavPanel.Root>
31
- <NavPanel.Column>
32
- <ul className={s.productCategories}>
33
- {productCategories.map(({ title, products }) => {
34
- return (
35
- <li key={title} className={s.productCategory}>
36
- <TextPlus.Body className={s.eyebrow}>{title}</TextPlus.Body>
37
- <ul className={s.productList}>
38
- {products.map((product) => {
39
- return (
40
- <li key={product.url}>
41
- <NavProduct {...product} />
42
- </li>
43
- )
44
- })}
45
- </ul>
46
- </li>
47
- )
48
- })}
49
- </ul>
50
- </NavPanel.Column>
51
- {promo ? <Promo {...promo} /> : null}
52
+ <NavPanel.Root
53
+ className={classNames(s.productPanel, {
54
+ [s.hasSide]: sidePanel,
55
+ [s.noSide]: !sidePanel,
56
+ })}
57
+ hasSidePanel={Boolean(sidePanel)}
58
+ >
59
+ <div className={s.mainPanel}>
60
+ <NavPanel.Column hasSidePanel={Boolean(sidePanel)}>
61
+ <ul className={s.productCategories}>
62
+ {productCategories.map(({ title, products }) => {
63
+ return (
64
+ <li key={title} className={s.productCategory}>
65
+ <TextPlus.Body className={s.eyebrow}>{title}</TextPlus.Body>
66
+ <ul className={s.productList}>
67
+ {products.map((product) => {
68
+ return (
69
+ <li key={product.url}>
70
+ <NavProduct {...product} />
71
+ </li>
72
+ )
73
+ })}
74
+ </ul>
75
+ </li>
76
+ )
77
+ })}
78
+ </ul>
79
+ </NavPanel.Column>
80
+ {promo ? <Promo {...promo} hasSidePanel={Boolean(sidePanel)} /> : null}
81
+ </div>
82
+
83
+ {sidePanel ? (
84
+ <NavPanel.Column className={s.sidePanel}>
85
+ <TextPlus.Body size="200" weight="semibold">
86
+ {sidePanel.label}
87
+ </TextPlus.Body>
88
+
89
+ {/* ! TODO Replace the below list with the <LinkList /> component,
90
+ That component will require a refactor to support greater customization
91
+ Ticket:
92
+ https://app.asana.com/0/1206176289707208/1208162145034615/f
93
+ */}
94
+ <ul className={s.sidePanelItems}>
95
+ {sidePanel.navItems.map(({ icon, title, description, url }) => {
96
+ return (
97
+ <li key={title}>
98
+ <Link
99
+ aria-label={`${title} - ${description}`}
100
+ href={parseUrl(url).href}
101
+ className={classNames(s.sidePanelItem, s.focusIndicator)}
102
+ >
103
+ <div className={s.iconBackground}>
104
+ <FlightIcon
105
+ size={16}
106
+ name={icon}
107
+ color="var(--token-color-foreground-faint)"
108
+ />
109
+ </div>
110
+ <div className={s.sidePanelItemContent}>
111
+ <TextPlus.Body size="200" weight="semibold" tag="span">
112
+ {title}
113
+ </TextPlus.Body>
114
+ <span className={s.sidePanelItemDesc}>{description}</span>
115
+ </div>
116
+ </Link>
117
+ </li>
118
+ )
119
+ })}
120
+ </ul>
121
+ </NavPanel.Column>
122
+ ) : null}
52
123
  </NavPanel.Root>
53
124
  )
54
125
  }
@@ -63,6 +134,7 @@ function NavProduct({ url, product, description }: NavProductProps) {
63
134
  return (
64
135
  <NavigationMenu.Link asChild>
65
136
  <Link
137
+ aria-label={`${product} - ${description}`}
66
138
  href={parseUrl(url).href}
67
139
  onClickCapture={() => {
68
140
  trackNavClickEvent(product, url, 'products')
@@ -73,6 +145,11 @@ function NavProduct({ url, product, description }: NavProductProps) {
73
145
  <div className={s.productLogo}>
74
146
  <FlightIcon
75
147
  name={PRODUCT_LOGO_MAP.get(product) ?? 'hashicorp-fill-color'}
148
+ className={
149
+ PRODUCT_LOGO_EXCEPTION_CLASSNAMES[product]
150
+ ? s[PRODUCT_LOGO_EXCEPTION_CLASSNAMES[product]]
151
+ : undefined
152
+ }
76
153
  />
77
154
  </div>
78
155
  <div className={s.productTextContent}>
@@ -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
+ }
@@ -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;