@hashicorp/react-components 0.0.0-nightly.91abcef → 0.0.0-nightly.928c674

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 (140) hide show
  1. package/.eslintrc.js +1 -2
  2. package/.stylelintrc.js +1 -1
  3. package/README.md +1 -1
  4. package/package.json +3 -8
  5. package/postcss.config.js +1 -1
  6. package/src/components/nav-panel/components/flight-icon/index.tsx +51 -0
  7. package/src/components/nav-panel/components/flight-icon/style.module.css +3 -0
  8. package/src/components/nav-panel/components/link/index.tsx +127 -0
  9. package/src/components/nav-panel/components/link/style.module.css +64 -0
  10. package/src/components/nav-panel/components/link-list/index.tsx +7 -64
  11. package/src/components/nav-panel/components/link-list/style.module.css +1 -50
  12. package/src/components/nav-panel/components/panel/column/style.module.css +2 -2
  13. package/src/components/nav-panel/components/panel/root/style.module.css +5 -5
  14. package/src/components/nav-panel/components/promo/index.tsx +26 -9
  15. package/src/components/nav-panel/components/promo/style.module.css +33 -19
  16. package/src/components/nav-panel/components/text/index.tsx +34 -0
  17. package/src/components/nav-panel/product-panel/index.tsx +46 -14
  18. package/src/components/nav-panel/product-panel/style.module.css +133 -53
  19. package/src/components/nav-panel/standard-panel/style.module.css +2 -2
  20. package/src/lib/get-localized-link-props/index.ts +2 -3
  21. package/src/lib/parse-url/index.ts +2 -9
  22. package/src/lib/send-posthog-event/index.ts +22 -0
  23. package/src/lib/supported-locales/index.ts +10 -1
  24. package/src/lib/track-nav-click-event/index.ts +4 -4
  25. package/src/components/actions/index.tsx +0 -107
  26. package/src/components/actions/style.module.css +0 -28
  27. package/src/components/actions/types.ts +0 -73
  28. package/src/components/call-to-action/index.tsx +0 -205
  29. package/src/components/call-to-action/styles/variant-centered.module.css +0 -93
  30. package/src/components/call-to-action/styles/variant-compact-grid.module.css +0 -88
  31. package/src/components/call-to-action/styles/variant-compact.module.css +0 -91
  32. package/src/components/call-to-action/styles/variant-links.module.css +0 -85
  33. package/src/components/card/README.md +0 -11
  34. package/src/components/card/card.tsx +0 -45
  35. package/src/components/card/index.test.tsx +0 -69
  36. package/src/components/card/index.tsx +0 -14
  37. package/src/components/card/newsroom-card/index.test.tsx +0 -39
  38. package/src/components/card/newsroom-card/index.tsx +0 -37
  39. package/src/components/card/newsroom-card/style.module.css +0 -12
  40. package/src/components/card/partner-card/index.test.tsx +0 -57
  41. package/src/components/card/partner-card/index.tsx +0 -69
  42. package/src/components/card/partner-card/style.module.css +0 -24
  43. package/src/components/card/person-card/index.test.tsx +0 -71
  44. package/src/components/card/person-card/index.tsx +0 -93
  45. package/src/components/card/person-card/style.module.css +0 -33
  46. package/src/components/card/primitives.tsx +0 -177
  47. package/src/components/card/promo-card/index.tsx +0 -51
  48. package/src/components/card/resource-card/index.test.tsx +0 -48
  49. package/src/components/card/resource-card/index.tsx +0 -40
  50. package/src/components/card/style.module.css +0 -145
  51. package/src/components/card/types.ts +0 -66
  52. package/src/components/card/unified-card/index.spec.tsx +0 -40
  53. package/src/components/card/unified-card/index.tsx +0 -58
  54. package/src/components/intro/index.tsx +0 -82
  55. package/src/components/intro/style.module.css +0 -67
  56. package/src/components/intro/types.ts +0 -44
  57. package/src/components/marketo-form/CHANGELOG.md +0 -122
  58. package/src/components/marketo-form/README.md +0 -1
  59. package/src/components/marketo-form/contexts/FormMetadata.ts +0 -13
  60. package/src/components/marketo-form/docs.mdx +0 -197
  61. package/src/components/marketo-form/fixtures/index.ts +0 -185
  62. package/src/components/marketo-form/form/index.tsx +0 -371
  63. package/src/components/marketo-form/index.test.tsx +0 -320
  64. package/src/components/marketo-form/index.ts +0 -11
  65. package/src/components/marketo-form/package.original.json +0 -30
  66. package/src/components/marketo-form/partials/error-message/index.tsx +0 -12
  67. package/src/components/marketo-form/partials/error-message/style.module.css +0 -13
  68. package/src/components/marketo-form/partials/field/index.tsx +0 -90
  69. package/src/components/marketo-form/partials/field-wrapper/index.tsx +0 -26
  70. package/src/components/marketo-form/partials/fields/checkbox-field/index.tsx +0 -32
  71. package/src/components/marketo-form/partials/fields/email-field/index.tsx +0 -35
  72. package/src/components/marketo-form/partials/fields/form-page-url-field/index.tsx +0 -32
  73. package/src/components/marketo-form/partials/fields/hidden-field/index.tsx +0 -38
  74. package/src/components/marketo-form/partials/fields/htmltext-field/index.tsx +0 -21
  75. package/src/components/marketo-form/partials/fields/htmltext-field/style.module.css +0 -18
  76. package/src/components/marketo-form/partials/fields/name-field/index.tsx +0 -19
  77. package/src/components/marketo-form/partials/fields/name-field/style.module.css +0 -13
  78. package/src/components/marketo-form/partials/fields/radio-buttons-field/index.tsx +0 -48
  79. package/src/components/marketo-form/partials/fields/select-field/index.tsx +0 -39
  80. package/src/components/marketo-form/partials/fields/select-field/style.module.css +0 -5
  81. package/src/components/marketo-form/partials/fields/telephone-field/index.tsx +0 -30
  82. package/src/components/marketo-form/partials/fields/text-field/index.tsx +0 -30
  83. package/src/components/marketo-form/partials/fields/textarea-field/index.tsx +0 -29
  84. package/src/components/marketo-form/partials/label/index.tsx +0 -24
  85. package/src/components/marketo-form/partials/label/style.module.css +0 -12
  86. package/src/components/marketo-form/partials/visibility-rule/index.tsx +0 -84
  87. package/src/components/marketo-form/props.js +0 -66
  88. package/src/components/marketo-form/server/api-routes.ts +0 -109
  89. package/src/components/marketo-form/server/client.ts +0 -98
  90. package/src/components/marketo-form/server/index.ts +0 -8
  91. package/src/components/marketo-form/types.ts +0 -262
  92. package/src/components/marketo-form/utils.test.tsx +0 -103
  93. package/src/components/marketo-form/utils.ts +0 -449
  94. package/src/components/next-steps/index.tsx +0 -138
  95. package/src/components/next-steps/style.module.css +0 -270
  96. package/src/components/next-steps/types.ts +0 -63
  97. package/src/components/product-badge/index.test.tsx +0 -11
  98. package/src/components/product-badge/index.tsx +0 -42
  99. package/src/components/product-badge/style.module.css +0 -76
  100. package/src/components/products-used/index.tsx +0 -84
  101. package/src/components/products-used/style.module.css +0 -87
  102. package/src/components/products-used/types.ts +0 -31
  103. package/src/components/related-content/index.test.tsx +0 -74
  104. package/src/components/related-content/index.tsx +0 -56
  105. package/src/components/related-content/style.module.css +0 -89
  106. package/src/components/related-content/types.ts +0 -21
  107. package/src/components/subnav/helpers/areBasePathsMatching.ts +0 -13
  108. package/src/components/subnav/helpers/traverse/index.ts +0 -42
  109. package/src/components/subnav/helpers/useHeightRef.ts +0 -42
  110. package/src/components/subnav/helpers/useNavRef.ts +0 -30
  111. package/src/components/subnav/helpers/useOverflowRef.ts +0 -85
  112. package/src/components/subnav/helpers/useStuckRef.ts +0 -51
  113. package/src/components/subnav/index.tsx +0 -209
  114. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.test.ts +0 -26
  115. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.ts +0 -22
  116. package/src/components/subnav/partials/CtaLinks/github-stars-link/index.tsx +0 -87
  117. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.test.ts +0 -29
  118. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.ts +0 -32
  119. package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +0 -81
  120. package/src/components/subnav/partials/CtaLinks/icons/github-logo.js +0 -20
  121. package/src/components/subnav/partials/CtaLinks/icons/github.svg.js +0 -7
  122. package/src/components/subnav/partials/CtaLinks/icons/star.js +0 -20
  123. package/src/components/subnav/partials/CtaLinks/index.tsx +0 -131
  124. package/src/components/subnav/partials/CtaLinks/style.module.css +0 -45
  125. package/src/components/subnav/partials/DropdownTrigger/index.tsx +0 -35
  126. package/src/components/subnav/partials/DropdownTrigger/style.module.css +0 -39
  127. package/src/components/subnav/partials/MenuItemsDefault/index.tsx +0 -173
  128. package/src/components/subnav/partials/MenuItemsDefault/style.module.css +0 -104
  129. package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +0 -155
  130. package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +0 -88
  131. package/src/components/subnav/partials/TitleLink/index.tsx +0 -115
  132. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts +0 -10
  133. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts +0 -10
  134. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-dark.ts +0 -23
  135. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-light.ts +0 -23
  136. package/src/components/subnav/partials/TitleLink/style.module.css +0 -43
  137. package/src/components/subnav/partials/nav-item-text/index.tsx +0 -37
  138. package/src/components/subnav/partials/nav-item-text/style.module.css +0 -13
  139. package/src/components/subnav/style.module.css +0 -66
  140. package/src/components/subnav/subnav-consts.ts +0 -1
@@ -1,45 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- .root {
7
- display: flex;
8
- justify-content: flex-end;
9
- white-space: nowrap;
10
- list-style: none;
11
- padding: 0 0 0 var(--hdsplus-spacing-05);
12
- margin: 0;
13
- gap: 0 var(--hdsplus-spacing-04);
14
- @media (--medium-up) {
15
- gap: 0;
16
- }
17
-
18
- & > * + * {
19
- /* Spaces consecutive buttons horizontally on desktop */
20
- margin-left: var(--hdsplus-spacing-05);
21
- }
22
-
23
- &.isInDropdown {
24
- /* Allows consecutive buttons to wrap */
25
- flex-wrap: wrap;
26
- white-space: wrap;
27
- padding-inline: var(--hdsplus-spacing-04);
28
-
29
- & > * {
30
- /* Spaces consecutive buttons vertically */
31
- margin-left: 0;
32
- margin-top: var(--hdsplus-spacing-05);
33
-
34
- &:last-of-type {
35
- margin-bottom: var(--hdsplus-spacing-04);
36
- }
37
- }
38
-
39
- @nest :global(.hashidaysConference) & :global(.hds-dropdown) {
40
- @media (--small) {
41
- display: none;
42
- }
43
- }
44
- }
45
- }
@@ -1,35 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import FlightIcon from '@hashicorp/react-hds/src/components/flight-icon'
7
- import NavItemText from '../nav-item-text'
8
- import * as NavigationMenu from '@radix-ui/react-navigation-menu'
9
- import s from './style.module.css'
10
-
11
- interface DropdownTriggerProps {
12
- text: string
13
- isActive?: boolean
14
- activatePanel: (panel: string) => void
15
- }
16
-
17
- function DropdownTrigger(props: DropdownTriggerProps) {
18
- const { text, isActive, activatePanel } = props
19
-
20
- const onFocus = () => {
21
- activatePanel(text)
22
- }
23
- return (
24
- <NavigationMenu.Trigger
25
- className={s.root}
26
- onFocus={onFocus}
27
- onMouseDown={(e) => e.preventDefault()}
28
- >
29
- <NavItemText isActive={isActive} text={text} />
30
- <FlightIcon name="chevron-down" />
31
- </NavigationMenu.Trigger>
32
- )
33
- }
34
-
35
- export default DropdownTrigger
@@ -1,39 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- .root {
7
- composes: hds-typography-body-200 from global;
8
- composes: hds-font-weight-medium from global;
9
- border: none;
10
- background: none;
11
- align-items: center;
12
- display: flex;
13
- height: 100%;
14
- line-height: 2.5rem;
15
- padding: 0 var(--hdsplus-spacing-05);
16
- position: relative;
17
- white-space: nowrap;
18
- cursor: default;
19
-
20
- & svg {
21
- margin-top: 1px;
22
- margin-bottom: -1px;
23
- margin-left: 6px;
24
- width: 12px;
25
- height: 12px;
26
- transition: transform 0.3s;
27
- fill: var(--token-color-foreground-primary);
28
- }
29
-
30
- &:hover {
31
- background-color: var(--token-color-surface-interactive-hover);
32
- border-radius: var(--hdsplus-spacing-01);
33
- }
34
-
35
- &:focus {
36
- outline: 2px solid var(--token-color-focus-action-internal);
37
- outline-style: auto;
38
- }
39
- }
@@ -1,173 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import React from 'react'
7
- import Link from 'next/link'
8
- import NavItemText from '../nav-item-text'
9
- import DropdownTrigger from '../DropdownTrigger'
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'
14
-
15
- interface MenuItemsDefaultProps {
16
- menuItems: (
17
- | {
18
- text: string
19
- url: string
20
- submenu: {
21
- icon: string
22
- text: string
23
- url: string
24
- _isActiveUrl: string
25
- }[]
26
- _isActiveUrl: boolean
27
- }
28
- | 'divider'
29
- )[]
30
- activatePanel: (panel: string) => void
31
- locale?: string
32
- product?: string
33
- }
34
-
35
- function MenuItemsDefault(props: MenuItemsDefaultProps) {
36
- const { menuItems, activatePanel, locale, product } = props
37
- return (
38
- <NavigationMenu.List className={s.root}>
39
- {menuItems.map((menuItem, stableIdx) => {
40
- if (menuItem === 'divider') {
41
- // eslint-disable-next-line react/no-array-index-key
42
- return <VerticalDivider key={stableIdx} />
43
- }
44
- const { text, url, submenu, _isActiveUrl } = menuItem
45
- return menuItem.submenu ? (
46
- <NavLinkWithDropdown
47
- // This array is stable, so we can use index as key
48
- // eslint-disable-next-line react/no-array-index-key
49
- key={stableIdx}
50
- text={text}
51
- submenu={submenu}
52
- activatePanel={activatePanel}
53
- locale={locale}
54
- />
55
- ) : (
56
- <NavLink
57
- // This array is stable, so we can use index as key
58
- // eslint-disable-next-line react/no-array-index-key
59
- key={stableIdx}
60
- text={text}
61
- url={url}
62
- isActive={_isActiveUrl}
63
- locale={locale}
64
- product={product}
65
- />
66
- )
67
- })}
68
- </NavigationMenu.List>
69
- )
70
- }
71
-
72
- function VerticalDivider() {
73
- return (
74
- <li>
75
- <span className={s.verticalDivider} />
76
- </li>
77
- )
78
- }
79
-
80
- interface NavLinkProps {
81
- text: string
82
- url: string
83
- isActive: boolean
84
- locale?: string
85
- product?: string
86
- }
87
-
88
- function NavLink(props: NavLinkProps) {
89
- const { text, url, isActive, locale, product } = props
90
- return (
91
- <NavigationMenu.Item className={s.listItem}>
92
- <NavigationMenu.Link asChild>
93
- <Link
94
- className={s.navLink}
95
- {...getLocalizedLinkProps(url, locale, Boolean(product))}
96
- >
97
- <NavItemText isActive={isActive} text={text} />
98
- </Link>
99
- </NavigationMenu.Link>
100
- </NavigationMenu.Item>
101
- )
102
- }
103
-
104
- interface NavLinkWithDropdownProps {
105
- text: string
106
- submenu: { icon: string; text: string; url: string; _isActiveUrl: string }[]
107
- activatePanel: (panel: string) => void
108
- locale?: string
109
- }
110
-
111
- interface NavLinkWithDropdownState {
112
- isCollapsed: boolean
113
- }
114
-
115
- class NavLinkWithDropdown extends React.Component<
116
- NavLinkWithDropdownProps,
117
- NavLinkWithDropdownState
118
- > {
119
- render() {
120
- const { text, submenu, activatePanel, locale } = this.props
121
- const hasActiveChild = submenu.some((s) => s._isActiveUrl)
122
-
123
- const handleFocusOutside = () => {
124
- // Since the content opens when the focus is on the dropdown trigger, handleFocusOutside gets called
125
- // because the content is open but focus is outside of it. When the focus is on the trigger we want
126
- // this content to be open so we ignore it in this case.
127
- if (
128
- !document ||
129
- !document.activeElement?.id ||
130
- !document.activeElement.id.includes('trigger')
131
- ) {
132
- activatePanel('')
133
- }
134
- }
135
- return (
136
- <NavigationMenu.Item className={s.listItem} value={text}>
137
- <DropdownTrigger
138
- text={text}
139
- isActive={hasActiveChild}
140
- activatePanel={activatePanel}
141
- />
142
- <NavigationMenu.Content
143
- className={s.submenuModal}
144
- onFocusOutside={handleFocusOutside}
145
- >
146
- <NavigationMenu.Sub>
147
- <NavigationMenu.List className={s.dropdownList}>
148
- {submenu.map((submenuItem, stableIdx) => {
149
- const { icon, text, url } = submenuItem
150
- return (
151
- // eslint-disable-next-line react/no-array-index-key
152
- <NavigationMenu.Item key={stableIdx}>
153
- <NavigationMenu.Link asChild>
154
- <Link
155
- className={s.submenuItem}
156
- {...getLocalizedLinkProps(url, locale)}
157
- >
158
- {icon ? <FlightIcon name={icon} /> : null}
159
- {text}
160
- </Link>
161
- </NavigationMenu.Link>
162
- </NavigationMenu.Item>
163
- )
164
- })}
165
- </NavigationMenu.List>
166
- </NavigationMenu.Sub>
167
- </NavigationMenu.Content>
168
- </NavigationMenu.Item>
169
- )
170
- }
171
- }
172
-
173
- export default MenuItemsDefault
@@ -1,104 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- .root {
7
- display: flex;
8
- padding: 0 0 0 var(--hdsplus-spacing-08);
9
- margin: 0;
10
- align-items: center;
11
- justify-content: flex-end;
12
- list-style: none;
13
- }
14
-
15
- .listItem {
16
- position: relative;
17
- margin: 0;
18
- padding: 0;
19
- }
20
-
21
- .navLink {
22
- composes: hds-typography-body-200 from global;
23
- composes: hds-font-weight-medium from global;
24
- position: relative;
25
- padding: var(--hdsplus-spacing-04);
26
- display: flex;
27
- align-items: center;
28
- white-space: nowrap;
29
-
30
- &:hover {
31
- background-color: var(--token-color-surface-interactive-hover);
32
- border-radius: var(--hdsplus-spacing-01);
33
- }
34
-
35
- &:focus {
36
- outline: 2px solid var(--token-color-focus-action-internal);
37
- outline-style: auto;
38
- }
39
- }
40
-
41
- .submenuItem {
42
- --submenu-item-background-color: transparent;
43
-
44
- position: relative;
45
- composes: hds-typography-body-200 from global;
46
- composes: hds-font-weight-medium from global;
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
- }
62
-
63
- &:hover {
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;
74
- }
75
- }
76
-
77
- .submenuModal {
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);
82
- z-index: 1;
83
- position: absolute;
84
- top: 100%;
85
- margin: var(--hdsplus-spacing-03) 0 0 0;
86
- padding: var(--hdsplus-spacing-04);
87
- left: 100%;
88
- transform: translateX(-100%);
89
- list-style: none;
90
- }
91
-
92
- .verticalDivider {
93
- background: var(--token-color-border-primary);
94
- height: 1.75rem;
95
- width: 1px;
96
- margin: 0 8px;
97
- display: block;
98
- }
99
-
100
- .dropdownList {
101
- min-width: max-content;
102
- list-style: none;
103
- padding: 0;
104
- }
@@ -1,155 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import React from 'react'
7
- import { vercelSplit } from '../../../../lib/v'
8
- import Link from 'next/link'
9
- import type { Products } from '@hashicorp/platform-product-meta'
10
- import CtaLinks, { type CtaLinkProps } from '../CtaLinks'
11
- import DropdownTrigger from '../DropdownTrigger'
12
- import * as NavigationMenu from '@radix-ui/react-navigation-menu'
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'
17
-
18
- interface MenuItemsOverflowProps {
19
- menuItems: (
20
- | 'divider'
21
- | {
22
- text: string
23
- url: string
24
- submenu: { icon: string; url: string; text: string }[]
25
- }
26
- )[]
27
- ctaLinks: CtaLinkProps
28
- product?: Products
29
- hideGithubStars?: boolean
30
- menuText: string
31
- constrainWidth?: boolean
32
- activatePanel: (panel: string) => void
33
- locale?: string
34
- }
35
-
36
- interface MenuItemsOverflowState {
37
- isCollapsed: boolean
38
- }
39
-
40
- class MenuItemsOverflow extends React.Component<
41
- MenuItemsOverflowProps,
42
- MenuItemsOverflowState
43
- > {
44
- render() {
45
- const {
46
- menuItems,
47
- ctaLinks,
48
- product,
49
- hideGithubStars,
50
- menuText,
51
- constrainWidth,
52
- activatePanel,
53
- locale,
54
- } = this.props
55
-
56
- const handleFocusOutside = () => {
57
- // Since the content opens when the focus is on the dropdown trigger, handleFocusOutside gets called
58
- // because the content is open but focus is outside of it. When the focus is on the trigger we want
59
- // this content to be open so we ignore it in this case.
60
- if (
61
- !document ||
62
- !document.activeElement?.id ||
63
- !document.activeElement.id.includes('trigger')
64
- ) {
65
- activatePanel('')
66
- }
67
- }
68
-
69
- return (
70
- <NavigationMenu.List className={s.list}>
71
- <NavigationMenu.Item className={s.root} value={menuText}>
72
- <DropdownTrigger text={menuText} activatePanel={activatePanel} />
73
- <NavigationMenu.Content
74
- className={classNames(s.dropdown, {
75
- [s.constrained]: constrainWidth,
76
- })}
77
- onFocusOutside={handleFocusOutside}
78
- >
79
- <ul className={s.ulElem}>
80
- {menuItems.map((menuItem, stableIdx) => {
81
- if (menuItem === 'divider') return null
82
- const { text, url, submenu } = menuItem
83
- if (submenu) {
84
- // If we have a submenu, we need to flatten it
85
- return (
86
- // eslint-disable-next-line react/no-array-index-key
87
- <div key={stableIdx}>
88
- <div className={s.submenuTitle}>{text}</div>
89
- <hr className={s.divider} />
90
- {submenu.map((subItem, subStableIdx) => (
91
- <SubmenuItem
92
- // eslint-disable-next-line react/no-array-index-key
93
- key={subStableIdx}
94
- url={subItem.url}
95
- text={subItem.text}
96
- icon={subItem.icon}
97
- locale={locale}
98
- product={product}
99
- />
100
- ))}
101
- <hr className={s.divider} />
102
- </div>
103
- )
104
- } else {
105
- return (
106
- <SubmenuItem
107
- // eslint-disable-next-line react/no-array-index-key
108
- key={stableIdx}
109
- url={url}
110
- text={text}
111
- product={product}
112
- />
113
- )
114
- }
115
- })}
116
- </ul>
117
- <CtaLinks
118
- links={ctaLinks}
119
- isInDropdown={true}
120
- product={product}
121
- hideGithubStars={hideGithubStars}
122
- />
123
- </NavigationMenu.Content>
124
- </NavigationMenu.Item>
125
- </NavigationMenu.List>
126
- )
127
- }
128
- }
129
-
130
- interface SubmenuItemProps {
131
- icon?: string
132
- url: string
133
- text: string
134
- locale?: string
135
- product?: string
136
- }
137
-
138
- function SubmenuItem({ icon, url, text, locale, product }: SubmenuItemProps) {
139
- return (
140
- <li>
141
- <NavigationMenu.Link asChild>
142
- <Link
143
- className={s.submenuItem}
144
- title={vercelSplit(text)}
145
- {...getLocalizedLinkProps(url, locale, Boolean(product))}
146
- >
147
- {icon ? <FlightIcon name={icon} /> : null}
148
- {text}
149
- </Link>
150
- </NavigationMenu.Link>
151
- </li>
152
- )
153
- }
154
-
155
- export default MenuItemsOverflow
@@ -1,88 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- .root {
7
- position: relative;
8
- display: flex;
9
- justify-content: flex-end;
10
- }
11
-
12
- .dropdown {
13
- background: var(--token-color-surface-primary);
14
- border-radius: var(--hdsplus-spacing-03);
15
- box-shadow: var(--token-elevation-high-box-shadow);
16
- border: 1px solid var(--token-color-border-primary);
17
- margin-top: 8px;
18
- max-height: calc(100vh - 300%);
19
- overflow-y: auto;
20
- padding: var(--hdsplus-spacing-04);
21
- position: absolute;
22
- right: 0;
23
- top: 100%;
24
- width: calc(100vw - var(--hdsplus-spacing-08));
25
- z-index: 1;
26
-
27
- @nest :global(.hashidaysConference) & {
28
- padding: 12px 24px;
29
- }
30
-
31
- &.constrained {
32
- max-width: 568px;
33
- width: calc(100vw - var(--hdsplus-spacing-10));
34
-
35
- @media (--medium-up) {
36
- width: max-content;
37
- }
38
- }
39
-
40
- @media (--medium-up) {
41
- width: max-content;
42
- }
43
- }
44
-
45
- .ulElem {
46
- padding: 0;
47
- margin: 0;
48
- list-style: none;
49
- }
50
-
51
- .submenuTitle {
52
- composes: g-type-label from global;
53
- margin: var(--hdsplus-spacing-04) var(--hdsplus-spacing-03) 8px;
54
- color: var(--token-color-foreground-faint);
55
- }
56
-
57
- .divider {
58
- margin: var(--hdsplus-spacing-04) var(--hdsplus-spacing-03);
59
- border: 0;
60
- padding: 0;
61
- height: 1px;
62
- background: var(--token-color-border-primary);
63
- }
64
-
65
- .submenuItem {
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;
74
-
75
- &:hover {
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;
82
- }
83
- }
84
-
85
- .list {
86
- margin: 0;
87
- list-style: none;
88
- }