@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
@@ -7,24 +7,33 @@ 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-hds/src/components/flight-icon'
13
+ import { getLocalizedLinkProps } from '../../../../lib/get-localized-link-props'
12
14
 
13
15
  interface MenuItemsDefaultProps {
14
16
  menuItems: (
15
17
  | {
16
18
  text: string
17
19
  url: string
18
- submenu: { text: string; url: string; _isActiveUrl: string }[]
20
+ submenu: {
21
+ icon: string
22
+ text: string
23
+ url: string
24
+ _isActiveUrl: string
25
+ }[]
19
26
  _isActiveUrl: boolean
20
27
  }
21
28
  | 'divider'
22
29
  )[]
23
30
  activatePanel: (panel: string) => void
31
+ locale?: string
32
+ product?: string
24
33
  }
25
34
 
26
35
  function MenuItemsDefault(props: MenuItemsDefaultProps) {
27
- const { menuItems, activatePanel } = props
36
+ const { menuItems, activatePanel, locale, product } = props
28
37
  return (
29
38
  <NavigationMenu.List className={s.root}>
30
39
  {menuItems.map((menuItem, stableIdx) => {
@@ -41,6 +50,7 @@ function MenuItemsDefault(props: MenuItemsDefaultProps) {
41
50
  text={text}
42
51
  submenu={submenu}
43
52
  activatePanel={activatePanel}
53
+ locale={locale}
44
54
  />
45
55
  ) : (
46
56
  <NavLink
@@ -50,6 +60,8 @@ function MenuItemsDefault(props: MenuItemsDefaultProps) {
50
60
  text={text}
51
61
  url={url}
52
62
  isActive={_isActiveUrl}
63
+ locale={locale}
64
+ product={product}
53
65
  />
54
66
  )
55
67
  })}
@@ -69,14 +81,19 @@ interface NavLinkProps {
69
81
  text: string
70
82
  url: string
71
83
  isActive: boolean
84
+ locale?: string
85
+ product?: string
72
86
  }
73
87
 
74
88
  function NavLink(props: NavLinkProps) {
75
- const { text, url, isActive } = props
89
+ const { text, url, isActive, locale, product } = props
76
90
  return (
77
91
  <NavigationMenu.Item className={s.listItem}>
78
92
  <NavigationMenu.Link asChild>
79
- <Link className={s.navLink} href={url}>
93
+ <Link
94
+ className={s.navLink}
95
+ {...getLocalizedLinkProps(url, locale, Boolean(product))}
96
+ >
80
97
  <NavItemText isActive={isActive} text={text} />
81
98
  </Link>
82
99
  </NavigationMenu.Link>
@@ -86,8 +103,9 @@ function NavLink(props: NavLinkProps) {
86
103
 
87
104
  interface NavLinkWithDropdownProps {
88
105
  text: string
89
- submenu: { text: string; url: string; _isActiveUrl: string }[]
106
+ submenu: { icon: string; text: string; url: string; _isActiveUrl: string }[]
90
107
  activatePanel: (panel: string) => void
108
+ locale?: string
91
109
  }
92
110
 
93
111
  interface NavLinkWithDropdownState {
@@ -99,7 +117,7 @@ class NavLinkWithDropdown extends React.Component<
99
117
  NavLinkWithDropdownState
100
118
  > {
101
119
  render() {
102
- const { text, submenu, activatePanel } = this.props
120
+ const { text, submenu, activatePanel, locale } = this.props
103
121
  const hasActiveChild = submenu.some((s) => s._isActiveUrl)
104
122
 
105
123
  const handleFocusOutside = () => {
@@ -128,12 +146,16 @@ class NavLinkWithDropdown extends React.Component<
128
146
  <NavigationMenu.Sub>
129
147
  <NavigationMenu.List className={s.dropdownList}>
130
148
  {submenu.map((submenuItem, stableIdx) => {
131
- const { text, url } = submenuItem
149
+ const { icon, text, url } = submenuItem
132
150
  return (
133
151
  // eslint-disable-next-line react/no-array-index-key
134
152
  <NavigationMenu.Item key={stableIdx}>
135
153
  <NavigationMenu.Link asChild>
136
- <Link className={s.submenuItem} href={url}>
154
+ <Link
155
+ className={s.submenuItem}
156
+ {...getLocalizedLinkProps(url, locale)}
157
+ >
158
+ {icon ? <FlightIcon name={icon} /> : null}
137
159
  {text}
138
160
  </Link>
139
161
  </NavigationMenu.Link>
@@ -3,8 +3,6 @@
3
3
  * SPDX-License-Identifier: MPL-2.0
4
4
  */
5
5
 
6
- /* Note: consumes from theme.module.css, as marked */
7
-
8
6
  .root {
9
7
  display: flex;
10
8
  padding: 0 0 0 var(--hdsplus-spacing-08);
@@ -16,7 +14,6 @@
16
14
 
17
15
  .listItem {
18
16
  position: relative;
19
- white-space: nowrap;
20
17
  margin: 0;
21
18
  padding: 0;
22
19
  }
@@ -31,7 +28,7 @@
31
28
  white-space: nowrap;
32
29
 
33
30
  &:hover {
34
- background-color: var(--menu-item-hover-color);
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
- display: block;
48
- color: var(--menu-item-text-color); /* from theme.module.css */
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
- text-decoration: underline;
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: 4px;
57
- box-shadow: var(--token-elevation-high-box-shadow); /* from theme.module.css */
58
- background: var(--dropdown-background-color); /* from theme.module.css */
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: 8px 0 0 0;
64
- padding: 24px;
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-color); /* from theme.module.css */
93
+ background: var(--token-color-border-primary);
82
94
  height: 1.75rem;
83
95
  width: 1px;
84
96
  margin: 0 8px;
@@ -86,6 +98,7 @@
86
98
  }
87
99
 
88
100
  .dropdownList {
101
+ min-width: max-content;
89
102
  list-style: none;
90
103
  padding: 0;
91
104
  }
@@ -4,14 +4,16 @@
4
4
  */
5
5
 
6
6
  import React from 'react'
7
- import { v } from '@web/cms'
7
+ import { vercelSplit } from '../../../../lib/v'
8
8
  import Link from 'next/link'
9
9
  import type { Products } from '@hashicorp/platform-product-meta'
10
10
  import CtaLinks, { type CtaLinkProps } from '../CtaLinks'
11
11
  import DropdownTrigger from '../DropdownTrigger'
12
- import s from './style.module.css'
13
12
  import * as NavigationMenu from '@radix-ui/react-navigation-menu'
14
13
  import classNames from 'classnames'
14
+ import s from './style.module.css'
15
+ import FlightIcon from '@hashicorp/react-hds/src/components/flight-icon'
16
+ import { getLocalizedLinkProps } from '../../../../lib/get-localized-link-props'
15
17
 
16
18
  interface MenuItemsOverflowProps {
17
19
  menuItems: (
@@ -19,7 +21,7 @@ interface MenuItemsOverflowProps {
19
21
  | {
20
22
  text: string
21
23
  url: string
22
- submenu: { url: string; text: string }[]
24
+ submenu: { icon: string; url: string; text: string }[]
23
25
  }
24
26
  )[]
25
27
  ctaLinks: CtaLinkProps
@@ -28,6 +30,7 @@ interface MenuItemsOverflowProps {
28
30
  menuText: string
29
31
  constrainWidth?: boolean
30
32
  activatePanel: (panel: string) => void
33
+ locale?: string
31
34
  }
32
35
 
33
36
  interface MenuItemsOverflowState {
@@ -47,6 +50,7 @@ class MenuItemsOverflow extends React.Component<
47
50
  menuText,
48
51
  constrainWidth,
49
52
  activatePanel,
53
+ locale,
50
54
  } = this.props
51
55
 
52
56
  const handleFocusOutside = () => {
@@ -89,6 +93,9 @@ class MenuItemsOverflow extends React.Component<
89
93
  key={subStableIdx}
90
94
  url={subItem.url}
91
95
  text={subItem.text}
96
+ icon={subItem.icon}
97
+ locale={locale}
98
+ product={product}
92
99
  />
93
100
  ))}
94
101
  <hr className={s.divider} />
@@ -101,6 +108,7 @@ class MenuItemsOverflow extends React.Component<
101
108
  key={stableIdx}
102
109
  url={url}
103
110
  text={text}
111
+ product={product}
104
112
  />
105
113
  )
106
114
  }
@@ -120,15 +128,23 @@ class MenuItemsOverflow extends React.Component<
120
128
  }
121
129
 
122
130
  interface SubmenuItemProps {
131
+ icon?: string
123
132
  url: string
124
133
  text: string
134
+ locale?: string
135
+ product?: string
125
136
  }
126
137
 
127
- function SubmenuItem({ url, text }: SubmenuItemProps) {
138
+ function SubmenuItem({ icon, url, text, locale, product }: SubmenuItemProps) {
128
139
  return (
129
140
  <li>
130
141
  <NavigationMenu.Link asChild>
131
- <Link className={s.submenuItem} href={url} title={v(text)}>
142
+ <Link
143
+ className={s.submenuItem}
144
+ title={vercelSplit(text)}
145
+ {...getLocalizedLinkProps(url, locale, Boolean(product))}
146
+ >
147
+ {icon ? <FlightIcon name={icon} /> : null}
132
148
  {text}
133
149
  </Link>
134
150
  </NavigationMenu.Link>
@@ -3,8 +3,6 @@
3
3
  * SPDX-License-Identifier: MPL-2.0
4
4
  */
5
5
 
6
- /* Note: consumes from theme.module.css, as marked */
7
-
8
6
  .root {
9
7
  position: relative;
10
8
  display: flex;
@@ -12,14 +10,14 @@
12
10
  }
13
11
 
14
12
  .dropdown {
15
- background: var(--dropdown-background-color); /* from theme.module.css */
16
- border-radius: 4px;
13
+ background: var(--token-color-surface-primary);
14
+ border-radius: var(--hdsplus-spacing-03);
17
15
  box-shadow: var(--token-elevation-high-box-shadow);
18
- border: 1px solid var(--border-color);
16
+ border: 1px solid var(--token-color-border-primary);
19
17
  margin-top: 8px;
20
18
  max-height: calc(100vh - 300%);
21
19
  overflow-y: auto;
22
- padding: var(--hdsplus-spacing-04) var(--hdsplus-spacing-07);
20
+ padding: var(--hdsplus-spacing-04);
23
21
  position: absolute;
24
22
  right: 0;
25
23
  top: 100%;
@@ -52,27 +50,35 @@
52
50
 
53
51
  .submenuTitle {
54
52
  composes: g-type-label from global;
55
- margin: 12px 0 8px 0;
56
- color: var(--menu-item-heading-text-color); /* from theme.module.css */
53
+ margin: var(--hdsplus-spacing-04) var(--hdsplus-spacing-03) 8px;
54
+ color: var(--token-color-foreground-faint);
57
55
  }
58
56
 
59
57
  .divider {
60
- margin: 12px 0;
58
+ margin: var(--hdsplus-spacing-04) var(--hdsplus-spacing-03);
61
59
  border: 0;
62
60
  padding: 0;
63
61
  height: 1px;
64
- background: var(--border-color); /* from theme.module.css */
62
+ background: var(--token-color-border-primary);
65
63
  }
66
64
 
67
65
  .submenuItem {
68
- display: block;
69
- padding: 4px 0;
70
- color: var(--menu-item-text-color); /* from theme.module.css */
71
- font-weight: var(--font-weight-semi-bold);
72
- font-size: var(--token-typography-body-300-font-size);
66
+ composes: hds-typography-body-300 from global;
67
+ composes: hds-font-weight-semibold from global;
68
+ display: flex;
69
+ gap: var(--hdsplus-spacing-04);
70
+ padding: var(--hdsplus-spacing-02) var(--hdsplus-spacing-03);
71
+ color: var(--token-color-foreground-primary);
72
+ border-radius: var(--hdsplus-spacing-01);
73
+ align-items: center;
73
74
 
74
75
  &:hover {
75
- text-decoration: underline;
76
+ background-color: var(--token-color-surface-interactive-hover);
77
+ }
78
+
79
+ &:focus {
80
+ outline: 2px solid var(--token-color-focus-action-internal);
81
+ outline-style: auto;
76
82
  }
77
83
  }
78
84
 
@@ -7,21 +7,22 @@ import { forwardRef } from 'react'
7
7
  import { camelCase } from 'camel-case'
8
8
  import Link from 'next/link'
9
9
  import Image from 'next/image'
10
- import { v } from '@web/cms'
10
+ import { vercelSplit } from '../../../../lib/v'
11
11
  import classNames from 'classnames'
12
12
  import * as CommunityProductLogosOnDark from './mktg-logos/all-community-product-logos_on-dark'
13
13
  import * as CommunityProductLogosOnLight from './mktg-logos/all-community-product-logos_on-light'
14
14
  import * as PrimaryLogosOnDark from './mktg-logos/all-primary-logos_on-dark'
15
15
  import * as PrimaryLogosOnLight from './mktg-logos/all-primary-logos_on-light'
16
- import HashiCorpLogoOnLight from '@web/mktg-logos/src/hashicorp/hashicorp-horizontal_on-light.svg'
17
- import HashiCorpLogoOnDark from '@web/mktg-logos/src/hashicorp/hashicorp-horizontal_on-dark.svg'
18
- import HCPLogoOnLight from '@web/mktg-logos/src/hcp/hcp-horizontal_on-light.svg'
19
- import HCPLogoOnDark from '@web/mktg-logos/src/hcp/hcp-horizontal_on-dark.svg'
20
- import WaypointLogoAttrOnLight from '@web/mktg-logos/src/waypoint/hashicorp-waypoint-attributed/hashicorp-waypoint_on-light.svg'
21
- import WaypointLogoAttrOnDark from '@web/mktg-logos/src/waypoint/hashicorp-waypoint-attributed/hashicorp-waypoint_on-dark.svg'
22
- import HCPTerraformLogoOnLight from '@web/mktg-logos/src/terraform/hcp-terraform/hcp-terraform_on-light.svg'
23
- import HCPTerraformLogoOnDark from '@web/mktg-logos/src/terraform/hcp-terraform/hcp-terraform_on-dark.svg'
16
+ import HashiCorpLogoOnLight from '@hashicorp/web-mktg-logos/src/hashicorp/hashicorp-horizontal_on-light.svg'
17
+ import HashiCorpLogoOnDark from '@hashicorp/web-mktg-logos/src/hashicorp/hashicorp-horizontal_on-dark.svg'
18
+ import HCPLogoOnLight from '@hashicorp/web-mktg-logos/src/hcp/hcp-horizontal_on-light.svg'
19
+ import HCPLogoOnDark from '@hashicorp/web-mktg-logos/src/hcp/hcp-horizontal_on-dark.svg'
20
+ import WaypointLogoAttrOnLight from '@hashicorp/web-mktg-logos/src/waypoint/hashicorp-waypoint-attributed/hashicorp-waypoint_on-light.svg'
21
+ import WaypointLogoAttrOnDark from '@hashicorp/web-mktg-logos/src/waypoint/hashicorp-waypoint-attributed/hashicorp-waypoint_on-dark.svg'
22
+ import HCPTerraformLogoOnLight from '@hashicorp/web-mktg-logos/src/terraform/hcp-terraform/hcp-terraform_on-light.svg'
23
+ import HCPTerraformLogoOnDark from '@hashicorp/web-mktg-logos/src/terraform/hcp-terraform/hcp-terraform_on-dark.svg'
24
24
  import s from './style.module.css'
25
+ import { getLocalizedLinkProps } from '../../../../lib/get-localized-link-props'
25
26
 
26
27
  const logoDict = {
27
28
  light: {
@@ -41,6 +42,7 @@ const logoDict = {
41
42
  }
42
43
 
43
44
  interface TitleLinkProps {
45
+ locale?: string
44
46
  text: string
45
47
  url: string
46
48
  product?: string
@@ -80,8 +82,8 @@ function getLogo(
80
82
  }
81
83
 
82
84
  const TitleLink = forwardRef<HTMLAnchorElement, TitleLinkProps>(
83
- ({ text, url, product, theme }, ref) => {
84
- const parsedText = v(text)
85
+ ({ text, url, product, theme, locale }, ref) => {
86
+ const parsedText = vercelSplit(text)
85
87
  const Logo = getLogo(parsedText, theme)
86
88
 
87
89
  return (
@@ -91,9 +93,9 @@ const TitleLink = forwardRef<HTMLAnchorElement, TitleLinkProps>(
91
93
  s[`brand-${product}`],
92
94
  s[camelCase(parsedText)]
93
95
  )}
94
- href={url}
95
96
  title={parsedText}
96
97
  ref={ref}
98
+ {...getLocalizedLinkProps(url, locale)}
97
99
  >
98
100
  {Logo ? (
99
101
  <Image
@@ -1,9 +1,10 @@
1
- import boundary from '@web/mktg-logos/src/boundary/boundary-community/boundary-community_on-dark.svg'
2
- import consul from '@web/mktg-logos/src/consul/consul-community/consul-community_on-dark.svg'
3
- import nomad from '@web/mktg-logos/src/nomad/nomad-community/nomad-community_on-dark.svg'
4
- import packer from '@web/mktg-logos/src/packer/packer-community/packer-community_on-dark.svg'
5
- import terraform from '@web/mktg-logos/src/terraform/terraform-community/terraform-community_on-dark.svg'
6
- import vagrant from '@web/mktg-logos/src/vagrant/vagrant-community/vagrant-community_on-dark.svg'
7
- import vault from '@web/mktg-logos/src/vault/vault-community/vault-community_on-dark.svg'
1
+ import boundary from '@hashicorp/web-mktg-logos/src/boundary/boundary-community/boundary-community_on-dark.svg'
2
+ import consul from '@hashicorp/web-mktg-logos/src/consul/consul-community/consul-community_on-dark.svg'
3
+ import nomad from '@hashicorp/web-mktg-logos/src/nomad/nomad-community/nomad-community_on-dark.svg'
4
+ import packer from '@hashicorp/web-mktg-logos/src/packer/packer-community/packer-community_on-dark.svg'
5
+ import terraform from '@hashicorp/web-mktg-logos/src/terraform/terraform-community/terraform-community_on-dark.svg'
6
+ import vagrant from '@hashicorp/web-mktg-logos/src/vagrant/vagrant-community/vagrant-community_on-dark.svg'
7
+ import vault from '@hashicorp/web-mktg-logos/src/vault/vault-community/vault-community_on-dark.svg'
8
+ import waypoint from '@hashicorp/web-mktg-logos/src/waypoint/hashicorp-waypoint-attributed/hashicorp-waypoint_on-dark.svg'
8
9
 
9
- export { boundary, consul, nomad, packer, terraform, vagrant, vault }
10
+ export { boundary, consul, nomad, packer, terraform, vagrant, vault, waypoint }
@@ -1,9 +1,10 @@
1
- import boundary from '@web/mktg-logos/src/boundary/boundary-community/boundary-community_on-light.svg'
2
- import consul from '@web/mktg-logos/src/consul/consul-community/consul-community_on-light.svg'
3
- import nomad from '@web/mktg-logos/src/nomad/nomad-community/nomad-community_on-light.svg'
4
- import packer from '@web/mktg-logos/src/packer/packer-community/packer-community_on-light.svg'
5
- import terraform from '@web/mktg-logos/src/terraform/terraform-community/terraform-community_on-light.svg'
6
- import vagrant from '@web/mktg-logos/src/vagrant/vagrant-community/vagrant-community_on-light.svg'
7
- import vault from '@web/mktg-logos/src/vault/vault-community/vault-community_on-light.svg'
1
+ import boundary from '@hashicorp/web-mktg-logos/src/boundary/boundary-community/boundary-community_on-light.svg'
2
+ import consul from '@hashicorp/web-mktg-logos/src/consul/consul-community/consul-community_on-light.svg'
3
+ import nomad from '@hashicorp/web-mktg-logos/src/nomad/nomad-community/nomad-community_on-light.svg'
4
+ import packer from '@hashicorp/web-mktg-logos/src/packer/packer-community/packer-community_on-light.svg'
5
+ import terraform from '@hashicorp/web-mktg-logos/src/terraform/terraform-community/terraform-community_on-light.svg'
6
+ import vagrant from '@hashicorp/web-mktg-logos/src/vagrant/vagrant-community/vagrant-community_on-light.svg'
7
+ import vault from '@hashicorp/web-mktg-logos/src/vault/vault-community/vault-community_on-light.svg'
8
+ import waypoint from '@hashicorp/web-mktg-logos/src/waypoint/hashicorp-waypoint-attributed/hashicorp-waypoint_on-light.svg'
8
9
 
9
- export { boundary, consul, nomad, packer, terraform, vagrant, vault }
10
+ export { boundary, consul, nomad, packer, terraform, vagrant, vault, waypoint }
@@ -1,13 +1,13 @@
1
- import boundary from '@web/mktg-logos/src/boundary/boundary/boundary_on-dark.svg'
2
- import consul from '@web/mktg-logos/src/consul/consul/consul_on-dark.svg'
3
- import nomad from '@web/mktg-logos/src/nomad/nomad/nomad_on-dark.svg'
4
- import packer from '@web/mktg-logos/src/packer/packer/packer_on-dark.svg'
5
- import terraform from '@web/mktg-logos/src/terraform/terraform/terraform_on-dark.svg'
6
- import vagrant from '@web/mktg-logos/src/vagrant/vagrant/vagrant_on-dark.svg'
7
- import vault from '@web/mktg-logos/src/vault/vault/vault_on-dark.svg'
8
- import waypoint from '@web/mktg-logos/src/waypoint/waypoint/waypoint_on-dark.svg'
9
- import hashiconf from '@web/mktg-logos/src/conferences/hashiconf_on-dark.svg'
10
- import hashidays from '@web/mktg-logos/src/conferences/hashidays_on-dark.svg'
1
+ import boundary from '@hashicorp/web-mktg-logos/src/boundary/boundary/boundary_on-dark.svg'
2
+ import consul from '@hashicorp/web-mktg-logos/src/consul/consul/consul_on-dark.svg'
3
+ import nomad from '@hashicorp/web-mktg-logos/src/nomad/nomad/nomad_on-dark.svg'
4
+ import packer from '@hashicorp/web-mktg-logos/src/packer/packer/packer_on-dark.svg'
5
+ import terraform from '@hashicorp/web-mktg-logos/src/terraform/terraform/terraform_on-dark.svg'
6
+ import vagrant from '@hashicorp/web-mktg-logos/src/vagrant/vagrant/vagrant_on-dark.svg'
7
+ import vault from '@hashicorp/web-mktg-logos/src/vault/vault/vault_on-dark.svg'
8
+ import waypoint from '@hashicorp/web-mktg-logos/src/waypoint/waypoint/waypoint_on-dark.svg'
9
+ import hashiconf from '@hashicorp/web-mktg-logos/src/conferences/hashiconf_on-dark.svg'
10
+ import hashidays from '@hashicorp/web-mktg-logos/src/conferences/hashidays_on-dark.svg'
11
11
 
12
12
  export {
13
13
  boundary,
@@ -1,13 +1,13 @@
1
- import boundary from '@web/mktg-logos/src/boundary/boundary/boundary_on-light.svg'
2
- import consul from '@web/mktg-logos/src/consul/consul/consul_on-light.svg'
3
- import nomad from '@web/mktg-logos/src/nomad/nomad/nomad_on-light.svg'
4
- import packer from '@web/mktg-logos/src/packer/packer/packer_on-light.svg'
5
- import terraform from '@web/mktg-logos/src/terraform/terraform/terraform_on-light.svg'
6
- import vagrant from '@web/mktg-logos/src/vagrant/vagrant/vagrant_on-light.svg'
7
- import vault from '@web/mktg-logos/src/vault/vault/vault_on-light.svg'
8
- import waypoint from '@web/mktg-logos/src/waypoint/waypoint/waypoint_on-light.svg'
9
- import hashiconf from '@web/mktg-logos/src/conferences/hashiconf_on-light.svg'
10
- import hashidays from '@web/mktg-logos/src/conferences/hashidays_on-light.svg'
1
+ import boundary from '@hashicorp/web-mktg-logos/src/boundary/boundary/boundary_on-light.svg'
2
+ import consul from '@hashicorp/web-mktg-logos/src/consul/consul/consul_on-light.svg'
3
+ import nomad from '@hashicorp/web-mktg-logos/src/nomad/nomad/nomad_on-light.svg'
4
+ import packer from '@hashicorp/web-mktg-logos/src/packer/packer/packer_on-light.svg'
5
+ import terraform from '@hashicorp/web-mktg-logos/src/terraform/terraform/terraform_on-light.svg'
6
+ import vagrant from '@hashicorp/web-mktg-logos/src/vagrant/vagrant/vagrant_on-light.svg'
7
+ import vault from '@hashicorp/web-mktg-logos/src/vault/vault/vault_on-light.svg'
8
+ import waypoint from '@hashicorp/web-mktg-logos/src/waypoint/waypoint/waypoint_on-light.svg'
9
+ import hashiconf from '@hashicorp/web-mktg-logos/src/conferences/hashiconf_on-light.svg'
10
+ import hashidays from '@hashicorp/web-mktg-logos/src/conferences/hashidays_on-light.svg'
11
11
 
12
12
  export {
13
13
  boundary,
@@ -10,7 +10,7 @@
10
10
  display: inline-flex;
11
11
  padding-block: var(--hdsplus-spacing-04);
12
12
  font-weight: var(--font-weight-bold);
13
- color: var(--title-text-color); /* from theme.module.css */
13
+ color: var(--token-color-foreground-primary); /* from theme.module.css */
14
14
  font-size: 1.25rem;
15
15
  line-height: 1.35rem;
16
16
 
@@ -3,13 +3,11 @@
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
- color: var(--menu-item-text-color); /* from theme.module.css */
7
+ color: var(--token-color-foreground-primary);
10
8
  position: relative;
11
9
 
12
10
  &.isActive {
13
- color: var(--menu-item-text-color-active);
11
+ color: var(--token-color-foreground-strong);
14
12
  }
15
13
  }
@@ -3,19 +3,17 @@
3
3
  * SPDX-License-Identifier: MPL-2.0
4
4
  */
5
5
 
6
- /* Note: consumes from theme.module.css, as marked */
7
-
8
6
  .root {
9
7
  position: sticky;
10
8
  top: -1px;
11
9
  z-index: 900;
12
- background: var(--background-color); /* from theme.module.css */
13
- border-top: 1px solid var(--border-color); /* from theme.module.css */
10
+ background: var(--token-color-surface-primary);
11
+ border-top: 1px solid var(--token-color-border-faint);
14
12
  border-bottom: 1px solid transparent;
15
13
  transition: border-bottom-color 0.8s;
16
14
 
17
15
  &.isSticky {
18
- border-bottom-color: var(--border-color); /* from theme.module.css */
16
+ border-bottom-color: var(--token-color-border-faint);
19
17
  }
20
18
 
21
19
  /*
@@ -46,7 +44,7 @@
46
44
 
47
45
  .subnavInner {
48
46
  display: grid;
49
- grid-template-columns: minmax(max-content, 1fr) min-content;
47
+ grid-template-columns: max-content min-content;
50
48
  align-items: center;
51
49
  justify-content: space-between;
52
50
  min-height: 62px;
@@ -0,0 +1,30 @@
1
+ import { getLocalizedLinkProps } from '.'
2
+
3
+ describe('getLocalizedLinkProps', () => {
4
+ it('does not format localized homepage', () => {
5
+ const localizedLinkProps = getLocalizedLinkProps('/en', 'ja')
6
+ expect(localizedLinkProps.href).toBe('/en')
7
+ expect(localizedLinkProps.hrefLang).toBe('en')
8
+ })
9
+
10
+ it('does not format localized path hrefs', () => {
11
+ const localizedLinkProps = getLocalizedLinkProps('/ja/solutions', 'de')
12
+ expect(localizedLinkProps.href).toBe('/ja/solutions')
13
+ expect(localizedLinkProps.hrefLang).toBe('ja')
14
+ })
15
+
16
+ it('does format paths that start with a locale string', () => {
17
+ const localizedLinkProps = getLocalizedLinkProps(
18
+ '/deconstructing-cloud',
19
+ 'en'
20
+ )
21
+ expect(localizedLinkProps.href).toBe('/en/deconstructing-cloud')
22
+ expect(localizedLinkProps.hrefLang).toBe('en')
23
+ })
24
+
25
+ it('does not format external paths', () => {
26
+ const localizedLinkProps = getLocalizedLinkProps('https://google.com', 'ja')
27
+ expect(localizedLinkProps.href).toBe('https://google.com')
28
+ expect(localizedLinkProps.hrefLang).toBe(undefined)
29
+ })
30
+ })