@codecademy/brand 3.1.0 → 3.2.0-alpha.1b2d50df28.0

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 (37) hide show
  1. package/dist/AppHeader/AppHeaderElements/AppHeaderCatalogDropdown/MarketingBanner.js +83 -0
  2. package/dist/AppHeader/AppHeaderElements/{AppHeaderCatalogSectionVariant → AppHeaderCatalogDropdown}/NavPanels.js +4 -44
  3. package/dist/AppHeader/AppHeaderElements/{AppHeaderCatalogSectionVariant → AppHeaderCatalogDropdown}/consts.d.ts +1 -1
  4. package/dist/AppHeader/AppHeaderElements/{AppHeaderCatalogSectionVariant → AppHeaderCatalogDropdown}/consts.js +1 -1
  5. package/dist/AppHeader/AppHeaderElements/AppHeaderCatalogDropdown/index.js +8 -6
  6. package/dist/AppHeader/AppHeaderElements/AppHeaderFeatureCard/index.d.ts +4 -0
  7. package/dist/AppHeader/AppHeaderElements/AppHeaderFeatureCard/index.js +52 -0
  8. package/dist/AppHeader/AppHeaderElements/AppHeaderLinkSections/index.js +0 -0
  9. package/dist/AppHeader/AppHeaderElements/AppHeaderResourcesDropdown/NavPanels.d.ts +11 -0
  10. package/dist/AppHeader/AppHeaderElements/AppHeaderResourcesDropdown/NavPanels.js +144 -0
  11. package/dist/AppHeader/AppHeaderElements/AppHeaderResourcesDropdown/consts.d.ts +18 -0
  12. package/dist/AppHeader/AppHeaderElements/AppHeaderResourcesDropdown/consts.js +273 -0
  13. package/dist/AppHeader/AppHeaderElements/AppHeaderResourcesDropdown/index.js +31 -5
  14. package/dist/AppHeader/AppHeaderElements/AppHeaderSection/AppHeaderSection.test.js +83 -0
  15. package/dist/AppHeader/AppHeaderElements/{AppHeaderCatalogSectionVariant → AppHeaderSection}/NavSection.d.ts +2 -2
  16. package/dist/AppHeader/AppHeaderElements/AppHeaderSection/NavSection.js +79 -0
  17. package/dist/AppHeader/AppHeaderElements/AppHeaderSection/PanelLayout.d.ts +10 -0
  18. package/dist/AppHeader/AppHeaderElements/AppHeaderSection/PanelLayout.js +54 -0
  19. package/dist/AppHeader/AppHeaderElements/AppHeaderSection/index.d.ts +17 -0
  20. package/dist/AppHeader/AppHeaderElements/AppHeaderSection/index.js +86 -0
  21. package/dist/AppHeader/Search/DefaultResults.js +2 -2
  22. package/dist/AppHeader/Search/SearchButton.d.ts +1 -1
  23. package/dist/AppHeader/Search/SearchButton.js +17 -1
  24. package/dist/AppHeader/Search/SearchPane.js +118 -39
  25. package/dist/AppHeader/Search/SearchTrackingProvider/index.d.ts +17 -0
  26. package/dist/AppHeader/Search/SearchTrackingProvider/index.js +25 -0
  27. package/dist/AppHeader/Search/types.d.ts +1 -0
  28. package/dist/AppHeader/Search/useHeaderSearch.js +2 -1
  29. package/dist/AppHeader/index.js +12 -9
  30. package/dist/AppHeaderMobile/AppHeaderCatalogSectonVariantMobile/index.js +3 -3
  31. package/package.json +1 -1
  32. package/dist/AppHeader/AppHeaderElements/AppHeaderCatalogSectionVariant/MarketingBanner.js +0 -83
  33. package/dist/AppHeader/AppHeaderElements/AppHeaderCatalogSectionVariant/NavSection.js +0 -75
  34. package/dist/AppHeader/AppHeaderElements/AppHeaderCatalogSectionVariant/index.d.ts +0 -11
  35. package/dist/AppHeader/AppHeaderElements/AppHeaderCatalogSectionVariant/index.js +0 -86
  36. /package/dist/AppHeader/AppHeaderElements/{AppHeaderCatalogSectionVariant → AppHeaderCatalogDropdown}/MarketingBanner.d.ts +0 -0
  37. /package/dist/AppHeader/AppHeaderElements/{AppHeaderCatalogSectionVariant → AppHeaderCatalogDropdown}/NavPanels.d.ts +0 -0
@@ -0,0 +1,273 @@
1
+ import { ArticleIcon, BriefcaseIcon, BulbIcon, CommentsIcon, DiamondIcon, FileIcon, InfoCircleIcon, NotebookIcon, ProjectsIcon, RulerTriangleIcon, SearchIcon, VideoPlayerMovieIcon } from '@codecademy/gamut-icons';
2
+ import React from 'react';
3
+ import { DocsPanel, InspirationPanel, LearningToolsPanel, PracticeToolsPanel } from './NavPanels';
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ export const RESOURCES_NAV_SECTIONS = [{
6
+ item: {
7
+ icon: FileIcon,
8
+ text: 'Docs',
9
+ id: 'docs',
10
+ type: 'resources-dropdown',
11
+ trackingTarget: 'topnav_resources_docs'
12
+ },
13
+ panel: DocsPanel
14
+ }, {
15
+ item: {
16
+ icon: RulerTriangleIcon,
17
+ text: 'Learning tools',
18
+ id: 'learning-tools',
19
+ type: 'resources-dropdown',
20
+ trackingTarget: 'topnav_resources_learning_tools'
21
+ },
22
+ panel: LearningToolsPanel
23
+ }, {
24
+ item: {
25
+ icon: DiamondIcon,
26
+ text: 'Practice tools',
27
+ id: 'practice-tools',
28
+ type: 'resources-dropdown',
29
+ trackingTarget: 'topnav_resources_practice_tools'
30
+ },
31
+ panel: PracticeToolsPanel
32
+ }, {
33
+ item: {
34
+ icon: BulbIcon,
35
+ text: 'Inspiration',
36
+ id: 'inspiration',
37
+ type: 'resources-dropdown',
38
+ trackingTarget: 'topnav_resources_inspiration'
39
+ },
40
+ panel: InspirationPanel
41
+ }];
42
+ export const docsLinks = [{
43
+ id: 'c',
44
+ href: '/resources/docs/c',
45
+ trackingTarget: 'topnav_resources_docs_c',
46
+ text: 'C',
47
+ type: 'link'
48
+ }, {
49
+ id: 'html',
50
+ href: '/resources/docs/html',
51
+ trackingTarget: 'topnav_resources_docs_html',
52
+ text: 'HTML',
53
+ type: 'link'
54
+ }, {
55
+ id: 'python',
56
+ href: '/resources/docs/python',
57
+ trackingTarget: 'topnav_resources_docs_python',
58
+ text: 'Python',
59
+ type: 'link'
60
+ }, {
61
+ id: 'cpp',
62
+ href: '/resources/docs/cpp',
63
+ trackingTarget: 'topnav_resources_docs_cpp',
64
+ text: 'C++',
65
+ type: 'link'
66
+ }, {
67
+ id: 'java',
68
+ href: '/resources/docs/java',
69
+ trackingTarget: 'topnav_resources_docs_java',
70
+ text: 'Java',
71
+ type: 'link'
72
+ }, {
73
+ id: 'react',
74
+ href: '/resources/docs/react',
75
+ trackingTarget: 'topnav_resources_docs_react',
76
+ text: 'React',
77
+ type: 'link'
78
+ }, {
79
+ id: 'css',
80
+ href: '/resources/docs/css',
81
+ trackingTarget: 'topnav_resources_docs_css',
82
+ text: 'CSS',
83
+ type: 'link'
84
+ }, {
85
+ id: 'javascript',
86
+ href: '/resources/docs/javascript',
87
+ trackingTarget: 'topnav_resources_docs_javascript',
88
+ text: 'JavaScript',
89
+ type: 'link'
90
+ }, {
91
+ id: 'sql',
92
+ href: '/resources/docs/sql',
93
+ trackingTarget: 'topnav_resources_docs_sql',
94
+ text: 'SQL',
95
+ type: 'link'
96
+ }, {
97
+ id: 'git',
98
+ href: '/resources/docs/git',
99
+ trackingTarget: 'topnav_resources_docs_git',
100
+ text: 'Git',
101
+ type: 'link'
102
+ }, {
103
+ id: 'php',
104
+ href: '/resources/docs/php',
105
+ trackingTarget: 'topnav_resources_docs_php',
106
+ text: 'PHP',
107
+ type: 'link'
108
+ }, {
109
+ id: 'uiux',
110
+ href: '/resources/docs/uiux',
111
+ trackingTarget: 'topnav_resources_docs_uiux',
112
+ text: 'UI/UX',
113
+ type: 'link'
114
+ }, {
115
+ id: 'markdown',
116
+ href: '/resources/docs/markdown',
117
+ trackingTarget: 'topnav_resources_docs_markdown',
118
+ text: 'Markdown',
119
+ type: 'link'
120
+ }, {
121
+ id: 'data-science',
122
+ href: '/resources/docs/data-science',
123
+ trackingTarget: 'topnav_resources_docs_data_science',
124
+ text: 'Data science',
125
+ type: 'link'
126
+ }, {
127
+ id: 'ai',
128
+ href: '/resources/docs/ai',
129
+ trackingTarget: 'topnav_resources_docs_ai',
130
+ text: 'AI',
131
+ type: 'link'
132
+ }, {
133
+ id: 'data-visualization',
134
+ href: '/resources/docs/data-visualization',
135
+ trackingTarget: 'topnav_resources_docs_data_visualization',
136
+ text: 'Data visualization',
137
+ type: 'link'
138
+ }, {
139
+ id: 'typescript',
140
+ href: '/resources/docs/typescript',
141
+ trackingTarget: 'topnav_resources_docs_typescript',
142
+ text: 'TypeScript',
143
+ type: 'link'
144
+ }, {
145
+ id: 'ruby',
146
+ href: '/resources/docs/ruby',
147
+ trackingTarget: 'topnav_resources_docs_ruby',
148
+ text: 'Ruby',
149
+ type: 'link'
150
+ }];
151
+ export const learningToolsLinks = [{
152
+ linkItem: {
153
+ id: 'articles',
154
+ href: '/articles',
155
+ trackingTarget: 'topnav_resources_articles',
156
+ text: 'Articles',
157
+ type: 'link'
158
+ },
159
+ icon: /*#__PURE__*/_jsx(ArticleIcon, {}),
160
+ description: "Articles are more in-depth explanations about concepts covered in Codecademy courses. Here you'll learn more about workflows that developers use every day, and take your coding skills to the next level."
161
+ }, {
162
+ linkItem: {
163
+ id: 'cheatsheets',
164
+ href: '/resources/cheatsheets/all',
165
+ trackingTarget: 'topnav_resources_cheatsheets',
166
+ text: 'Cheatsheets',
167
+ type: 'link'
168
+ },
169
+ icon: /*#__PURE__*/_jsx(NotebookIcon, {}),
170
+ description: 'Quick-reference guides that summarize key concepts taught in our courses and paths across various programming languages, tools, and technologies.'
171
+ }, {
172
+ linkItem: {
173
+ id: 'videos',
174
+ href: '/resources/videos',
175
+ trackingTarget: 'topnav_resources_videos',
176
+ text: 'Videos',
177
+ type: 'link'
178
+ },
179
+ icon: /*#__PURE__*/_jsx(VideoPlayerMovieIcon, {}),
180
+ description: 'Watch our best programming videos for beginner, intermediate, and advanced learners about languages, frameworks, and more.'
181
+ }, {
182
+ linkItem: {
183
+ id: 'projects',
184
+ href: '/projects',
185
+ trackingTarget: 'topnav_resources_projects',
186
+ text: 'Projects',
187
+ type: 'link'
188
+ },
189
+ icon: /*#__PURE__*/_jsx(ProjectsIcon, {}),
190
+ description: "Projects let you apply what you're learning. Practice new skills, connect concepts, or put it all together to create something of your own."
191
+ }];
192
+ export const practiceToolsLinks = [{
193
+ linkItem: {
194
+ id: 'code-challenges',
195
+ href: '/code-challenges',
196
+ trackingTarget: 'topnav_resources_code_challenges',
197
+ text: 'Code Challenges',
198
+ type: 'link'
199
+ },
200
+ icon: /*#__PURE__*/_jsx(ArticleIcon, {}),
201
+ description: "Test your knowledge with code challenges based on real-world technical interviews from companies like Google, Amazon, and Meta. Practice for your job search — or for fun. Don't worry if you get stuck. We'll recommend the right courses to help you."
202
+ }, {
203
+ linkItem: {
204
+ id: 'workspaces',
205
+ href: '/pages/workspaces',
206
+ trackingTarget: 'topnav_resources_workspaces',
207
+ text: 'Workspaces',
208
+ type: 'link'
209
+ },
210
+ icon: /*#__PURE__*/_jsx(VideoPlayerMovieIcon, {}),
211
+ description: 'Practice building projects in 13 popular languages and libraries, tinker with code, and share your work—all without leaving your browser.'
212
+ }, {
213
+ linkItem: {
214
+ id: 'job-readiness',
215
+ href: '/job-readiness',
216
+ trackingTarget: 'topnav_resources_job_readiness',
217
+ text: 'Job-Readiness Checker',
218
+ type: 'link'
219
+ },
220
+ icon: /*#__PURE__*/_jsx(NotebookIcon, {}),
221
+ description: "Add a LinkedIn or ZipRecruiter job posting to analyze how your skills fit the job. You'll need to add more information for jobs found on other websites."
222
+ }, {
223
+ linkItem: {
224
+ id: 'interview-simulator',
225
+ href: '/interview-simulator',
226
+ trackingTarget: 'topnav_resources_interview_simulator',
227
+ text: 'Interview Simulator',
228
+ type: 'link'
229
+ },
230
+ icon: /*#__PURE__*/_jsx(ProjectsIcon, {}),
231
+ description: 'Discover your potential through interviewing. Identify your strengths, get actionable feedback, and boost your confidence with customized practice — at any stage in your tech career.'
232
+ }];
233
+ export const inspirationLinks = [{
234
+ linkItem: {
235
+ id: 'learner-stories',
236
+ href: '/resources/blog/category/get-inspired',
237
+ trackingTarget: 'topnav_resources_learner_stories',
238
+ text: 'Learner stories',
239
+ type: 'link'
240
+ },
241
+ icon: /*#__PURE__*/_jsx(CommentsIcon, {}),
242
+ description: 'Learn how coding can change your life (and the world) for the better.'
243
+ }, {
244
+ linkItem: {
245
+ id: 'learning-tips',
246
+ href: '/resources/blog/category/learning-tips',
247
+ trackingTarget: 'topnav_resources_learning_tips',
248
+ text: 'Learning Tips',
249
+ type: 'link'
250
+ },
251
+ icon: /*#__PURE__*/_jsx(InfoCircleIcon, {}),
252
+ description: "Learning to code — or thinking about it? Here's how to get started, plus tips and tricks for staying motivated."
253
+ }, {
254
+ linkItem: {
255
+ id: 'career-advice',
256
+ href: '/resources/blog/category/career',
257
+ trackingTarget: 'topnav_resources_career_advice',
258
+ text: 'Career Advice',
259
+ type: 'link'
260
+ },
261
+ icon: /*#__PURE__*/_jsx(BriefcaseIcon, {}),
262
+ description: 'Explore different tech jobs and learn how to advance in your career and maintain work-life balance.'
263
+ }, {
264
+ linkItem: {
265
+ id: 'finding-a-job',
266
+ href: '/resources/blog/category/finding-a-job',
267
+ trackingTarget: 'topnav_resources_finding_a_job',
268
+ text: 'Finding a Job',
269
+ type: 'link'
270
+ },
271
+ icon: /*#__PURE__*/_jsx(SearchIcon, {}),
272
+ description: 'Want to break into the tech industry? Learn how to write a standout resume, build a professional portfolio, prepare for technical interviews, and negotiate job offers.'
273
+ }];
@@ -1,12 +1,27 @@
1
- import { useCallback, useEffect, useRef, useState } from 'react';
1
+ import _styled from "@emotion/styled/base";
2
+ import { ColorMode } from '@codecademy/gamut-styles';
3
+ import { useCallback, useContext, useEffect, useRef, useState } from 'react';
2
4
  import * as React from 'react';
5
+ import { GlobalNavRedesignContext } from '../../../GlobalHeader';
3
6
  import { getHeaderResourcesList } from '../../../lib/resourcesList';
4
7
  import { AnimatedMegaMenuDropdown } from '../../shared';
5
8
  import { AppHeaderDropdownProvider } from '../AppHeaderDropdownProvider';
6
9
  import { AppHeaderDropdownNavButton } from '../AppHeaderNavButton/AppHeaderDropdownNavButton';
7
10
  import { useAppHeaderContext } from '../AppHeaderProvider';
8
11
  import { AppHeaderResourcesSection } from '../AppHeaderResourcesSection';
12
+ import { AppHeaderSection } from '../AppHeaderSection';
13
+ import { RESOURCES_NAV_SECTIONS } from './consts';
9
14
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
+ const StyledAnimatedMegaMenuDropdown = /*#__PURE__*/_styled(AnimatedMegaMenuDropdown, {
16
+ target: "ekdg1bw0",
17
+ label: "StyledAnimatedMegaMenuDropdown"
18
+ })("left:", ({
19
+ isAnon,
20
+ displayGlobalNavRedesign
21
+ }) => displayGlobalNavRedesign ? '-58px' : isAnon ? '-9rem' : '-14rem', ";@media (min-width: 1261px){left:", ({
22
+ isAnon,
23
+ displayGlobalNavRedesign
24
+ }) => displayGlobalNavRedesign ? '-152px' : isAnon ? '-9rem' : '-14rem', ";}" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9BcHBIZWFkZXIvQXBwSGVhZGVyRWxlbWVudHMvQXBwSGVhZGVyUmVzb3VyY2VzRHJvcGRvd24vaW5kZXgudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTJCRSIsImZpbGUiOiIuLi8uLi8uLi8uLi9zcmMvQXBwSGVhZGVyL0FwcEhlYWRlckVsZW1lbnRzL0FwcEhlYWRlclJlc291cmNlc0Ryb3Bkb3duL2luZGV4LnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbG9yTW9kZSB9IGZyb20gJ0Bjb2RlY2FkZW15L2dhbXV0LXN0eWxlcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBHbG9iYWxOYXZSZWRlc2lnbkNvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWxIZWFkZXInO1xuaW1wb3J0IHsgZ2V0SGVhZGVyUmVzb3VyY2VzTGlzdCB9IGZyb20gJy4uLy4uLy4uL2xpYi9yZXNvdXJjZXNMaXN0JztcbmltcG9ydCB7XG4gIEFuaW1hdGVkTWVnYU1lbnVEcm9wZG93bixcbiAgQXBwSGVhZGVyQWN0aW9uLFxuICBBcHBIZWFkZXJSZXNvdXJjZXNEcm9wZG93bkl0ZW0sXG59IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBBcHBIZWFkZXJEcm9wZG93blByb3ZpZGVyIH0gZnJvbSAnLi4vQXBwSGVhZGVyRHJvcGRvd25Qcm92aWRlcic7XG5pbXBvcnQgeyBBcHBIZWFkZXJEcm9wZG93bk5hdkJ1dHRvbiB9IGZyb20gJy4uL0FwcEhlYWRlck5hdkJ1dHRvbi9BcHBIZWFkZXJEcm9wZG93bk5hdkJ1dHRvbic7XG5pbXBvcnQgeyB1c2VBcHBIZWFkZXJDb250ZXh0IH0gZnJvbSAnLi4vQXBwSGVhZGVyUHJvdmlkZXInO1xuaW1wb3J0IHsgQXBwSGVhZGVyUmVzb3VyY2VzU2VjdGlvbiB9IGZyb20gJy4uL0FwcEhlYWRlclJlc291cmNlc1NlY3Rpb24nO1xuaW1wb3J0IHsgQXBwSGVhZGVyU2VjdGlvbiB9IGZyb20gJy4uL0FwcEhlYWRlclNlY3Rpb24nO1xuaW1wb3J0IHsgUkVTT1VSQ0VTX05BVl9TRUNUSU9OUyB9IGZyb20gJy4vY29uc3RzJztcblxuZXhwb3J0IHR5cGUgQXBwSGVhZGVyUmVzb3VyY2VEcm9wZG93blByb3BzID0gQXBwSGVhZGVyQWN0aW9uICYge1xuICBpdGVtOiBBcHBIZWFkZXJSZXNvdXJjZXNEcm9wZG93bkl0ZW07XG4gIGlzQW5vbjogYm9vbGVhbjtcbn07XG5cbmNvbnN0IFN0eWxlZEFuaW1hdGVkTWVnYU1lbnVEcm9wZG93biA9IHN0eWxlZChBbmltYXRlZE1lZ2FNZW51RHJvcGRvd24pPHtcbiAgaXNBbm9uOiBib29sZWFuO1xuICBkaXNwbGF5R2xvYmFsTmF2UmVkZXNpZ246IGJvb2xlYW47XG59PmBcbiAgbGVmdDogJHsoeyBpc0Fub24sIGRpc3BsYXlHbG9iYWxOYXZSZWRlc2lnbiB9KSA9PlxuICAgIGRpc3BsYXlHbG9iYWxOYXZSZWRlc2lnbiA/ICctNThweCcgOiBpc0Fub24gPyAnLTlyZW0nIDogJy0xNHJlbSd9O1xuXG4gIEBtZWRpYSAobWluLXdpZHRoOiAxMjYxcHgpIHtcbiAgICBsZWZ0OiAkeyh7IGlzQW5vbiwgZGlzcGxheUdsb2JhbE5hdlJlZGVzaWduIH0pID0+XG4gICAgICBkaXNwbGF5R2xvYmFsTmF2UmVkZXNpZ24gPyAnLTE1MnB4JyA6IGlzQW5vbiA/ICctOXJlbScgOiAnLTE0cmVtJ307XG4gIH1cbmA7XG5cbmV4cG9ydCBjb25zdCBBcHBIZWFkZXJSZXNvdXJjZXNEcm9wZG93bjogUmVhY3QuRkM8XG4gIEFwcEhlYWRlclJlc291cmNlRHJvcGRvd25Qcm9wc1xuPiA9ICh7IGFjdGlvbiwgaXRlbSwgaXNBbm9uIH0pID0+IHtcbiAgY29uc3QgeyB0ZXh0IH0gPSBpdGVtO1xuICBjb25zdCBjb250YWluZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgYnV0dG9uUmVmID0gdXNlUmVmPEhUTUxCdXR0b25FbGVtZW50PihudWxsKTtcbiAgY29uc3QgZHJvcGRvd25SZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgeyBsYXN0T3BlbmVkRHJvcGRvd24sIHNldExhc3RPcGVuZWREcm9wZG93biB9ID0gdXNlQXBwSGVhZGVyQ29udGV4dCgpO1xuXG4gIC8vIEFkZCBzY3JvbGxiYXIgZm9yIHNob3J0IHNjcmVlbnMgYWZ0ZXIgdHJhbnNpdGlvbiAob3RoZXJ3aXNlIHNjcm9sbGJhciBhcHBlYXJzIGFuZCBkaXNzYXBlYXJzIGZvciBhZGVxdWF0ZSBoZWlnaHRzIGR1cmluZyB0cmFuc2l0aW9uKVxuICBjb25zdCBbYW5pbWF0aW9uQ29tcGxldGVTdHlsZXMsIHNldEFuaW1hdGlvbkNvbXBsZXRlU3R5bGVzXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCBoZWFkZXJSZXNvdXJjZXNMaXN0ID0gZ2V0SGVhZGVyUmVzb3VyY2VzTGlzdCgpO1xuXG4gIGNvbnN0IGFuaW1hdGlvbkZpbmlzaGVkID0gKCkgPT4ge1xuICAgIHNldEFuaW1hdGlvbkNvbXBsZXRlU3R5bGVzKGlzT3Blbik7XG4gICAgaWYgKGlzT3BlbiAmJiBkcm9wZG93blJlZi5jdXJyZW50KSB7XG4gICAgICBkcm9wZG93blJlZi5jdXJyZW50LnNjcm9sbFRvcCA9IDA7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHRvZ2dsZUlzT3BlbiA9ICgpID0+IHNldElzT3BlbigocHJldikgPT4gIXByZXYpO1xuXG4gIGNvbnN0IGhhbmRsZU9uQ2xpY2sgPSAoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcbiAgICB0b2dnbGVJc09wZW4oKTtcbiAgICBpZiAoIWlzT3Blbikge1xuICAgICAgYWN0aW9uKGV2ZW50LCBpdGVtKTtcbiAgICAgIGlmIChzZXRMYXN0T3BlbmVkRHJvcGRvd24pIHtcbiAgICAgICAgc2V0TGFzdE9wZW5lZERyb3Bkb3duKHRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVDbG9zZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRJc09wZW4oZmFsc2UpO1xuICAgIGJ1dHRvblJlZj8uY3VycmVudD8uZm9jdXMoKTtcbiAgfSwgW10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGxhc3RPcGVuZWREcm9wZG93biAhPT0gdGV4dCAmJiBpc09wZW4pIHtcbiAgICAgIHNldElzT3BlbihmYWxzZSk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW2xhc3RPcGVuZWREcm9wZG93bl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZnVuY3Rpb24gaGFuZGxlQ2xpY2tPdXRzaWRlKGV2ZW50OiBNb3VzZUV2ZW50IHwgRXZlbnQpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbnRhaW5lclJlZj8uY3VycmVudDtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGJ1dHRvblJlZj8uY3VycmVudDtcbiAgICAgIGlmIChcbiAgICAgICAgaXNPcGVuICYmXG4gICAgICAgIGNvbnRhaW5lciAmJlxuICAgICAgICAhY29udGFpbmVyLmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSAmJlxuICAgICAgICBidXR0b24gJiZcbiAgICAgICAgIWJ1dHRvbi5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSlcbiAgICAgICkge1xuICAgICAgICBoYW5kbGVDbG9zZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGhhbmRsZUNsaWNrT3V0c2lkZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGhhbmRsZUNsaWNrT3V0c2lkZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGhhbmRsZUNsaWNrT3V0c2lkZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgaGFuZGxlQ2xpY2tPdXRzaWRlKTtcbiAgICB9O1xuICB9LCBbY29udGFpbmVyUmVmLCBoYW5kbGVDbG9zZSwgaXNPcGVuXSk7XG5cbiAgY29uc3QgZGlzcGxheUdsb2JhbE5hdlJlZGVzaWduID0gdXNlQ29udGV4dChHbG9iYWxOYXZSZWRlc2lnbkNvbnRleHQpO1xuXG4gIHJldHVybiAoXG4gICAgPEFwcEhlYWRlckRyb3Bkb3duUHJvdmlkZXIgaGFuZGxlQ2xvc2U9e2hhbmRsZUNsb3NlfT5cbiAgICAgIDxBcHBIZWFkZXJEcm9wZG93bk5hdkJ1dHRvblxuICAgICAgICBidXR0b25SZWY9e2J1dHRvblJlZn1cbiAgICAgICAgaGFuZGxlT25DbGljaz17aGFuZGxlT25DbGlja31cbiAgICAgICAgaXNPcGVuPXtpc09wZW59XG4gICAgICAgIHRpdGxlPXt0ZXh0fVxuICAgICAgLz5cbiAgICAgIDxTdHlsZWRBbmltYXRlZE1lZ2FNZW51RHJvcGRvd25cbiAgICAgICAgaXNBbm9uPXtpc0Fub259XG4gICAgICAgIGRpc3BsYXlHbG9iYWxOYXZSZWRlc2lnbj17ZGlzcGxheUdsb2JhbE5hdlJlZGVzaWdufVxuICAgICAgICB0YWJJbmRleD17LTF9IC8vIHByZXZlbnQgZnJvbSBpbnRlcmZlcmluZyB3aXRoIEFwcEhlYWRlciBmb2N1cyBsb2dpY1xuICAgICAgICByZWY9e2Ryb3Bkb3duUmVmfVxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIHRvcDogJzMuNXJlbScsXG4gICAgICAgICAgbWluV2lkdGg6ICc2NHJlbScsXG4gICAgICAgICAgbGVmdDogaXNBbm9uID8gJy0xNC41cmVtJyA6ICctMTkuNXJlbScsXG4gICAgICAgICAgb3ZlcmZsb3dZOiAnYXV0bycsXG4gICAgICAgICAgbWF4SGVpZ2h0OiBhbmltYXRpb25Db21wbGV0ZVN0eWxlcyA/ICc4NXZoJyA6IDAsXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBkaXNwbGF5R2xvYmFsTmF2UmVkZXNpZ24gPyAndHJhbnNwYXJlbnQnIDogJycsXG4gICAgICAgIH19XG4gICAgICAgIGluaXRpYWw9e3sgYm9yZGVyV2lkdGg6IDAsIGhlaWdodDogMCB9fVxuICAgICAgICBhbmltYXRlPXt7XG4gICAgICAgICAgYm9yZGVyV2lkdGg6IGlzT3BlbiA/IChkaXNwbGF5R2xvYmFsTmF2UmVkZXNpZ24gPyAwIDogMSkgOiAwLFxuICAgICAgICAgIGhlaWdodDogaXNPcGVuID8gJ2ZpdC1jb250ZW50JyA6IDAsXG4gICAgICAgIH19XG4gICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuMTc1IH19XG4gICAgICAgIGFyaWEtaGlkZGVuPXshaXNPcGVufVxuICAgICAgICBkYXRhLXRlc3RpZD1cInJlc291cmNlcy1tZW51LWRyb3Bkb3duXCJcbiAgICAgICAgb25BbmltYXRpb25Db21wbGV0ZT17YW5pbWF0aW9uRmluaXNoZWR9XG4gICAgICA+XG4gICAgICAgIHtkaXNwbGF5R2xvYmFsTmF2UmVkZXNpZ24gPyAoXG4gICAgICAgICAgPENvbG9yTW9kZSBtb2RlPVwibGlnaHRcIj5cbiAgICAgICAgICAgIDxBcHBIZWFkZXJTZWN0aW9uXG4gICAgICAgICAgICAgIGlzT3Blbj17aXNPcGVufVxuICAgICAgICAgICAgICByZWY9e2NvbnRhaW5lclJlZn1cbiAgICAgICAgICAgICAgbmF2U2VjdGlvbnM9e1JFU09VUkNFU19OQVZfU0VDVElPTlN9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvQ29sb3JNb2RlPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxBcHBIZWFkZXJSZXNvdXJjZXNTZWN0aW9uXG4gICAgICAgICAgICBhY3Rpb249e2FjdGlvbn1cbiAgICAgICAgICAgIHJlZj17Y29udGFpbmVyUmVmfVxuICAgICAgICAgICAgaWQ9e2BtZW51LWNvbnRhaW5lciR7aXRlbS50ZXh0fWB9XG4gICAgICAgICAgICBpc09wZW49e2lzT3Blbn1cbiAgICAgICAgICAgIGhhbmRsZUNsb3NlPXsoKSA9PiBzZXRJc09wZW4oZmFsc2UpfVxuICAgICAgICAgICAgcmVzb3VyY2VzPXtoZWFkZXJSZXNvdXJjZXNMaXN0fVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICA8L1N0eWxlZEFuaW1hdGVkTWVnYU1lbnVEcm9wZG93bj5cbiAgICA8L0FwcEhlYWRlckRyb3Bkb3duUHJvdmlkZXI+XG4gICk7XG59O1xuIl19 */"));
10
25
  export const AppHeaderResourcesDropdown = ({
11
26
  action,
12
27
  item,
@@ -68,6 +83,7 @@ export const AppHeaderResourcesDropdown = ({
68
83
  document.removeEventListener('blur', handleClickOutside);
69
84
  };
70
85
  }, [containerRef, handleClose, isOpen]);
86
+ const displayGlobalNavRedesign = useContext(GlobalNavRedesignContext);
71
87
  return /*#__PURE__*/_jsxs(AppHeaderDropdownProvider, {
72
88
  handleClose: handleClose,
73
89
  children: [/*#__PURE__*/_jsx(AppHeaderDropdownNavButton, {
@@ -75,7 +91,9 @@ export const AppHeaderResourcesDropdown = ({
75
91
  handleOnClick: handleOnClick,
76
92
  isOpen: isOpen,
77
93
  title: text
78
- }), /*#__PURE__*/_jsx(AnimatedMegaMenuDropdown, {
94
+ }), /*#__PURE__*/_jsx(StyledAnimatedMegaMenuDropdown, {
95
+ isAnon: isAnon,
96
+ displayGlobalNavRedesign: displayGlobalNavRedesign,
79
97
  tabIndex: -1 // prevent from interfering with AppHeader focus logic
80
98
  ,
81
99
  ref: dropdownRef,
@@ -84,14 +102,15 @@ export const AppHeaderResourcesDropdown = ({
84
102
  minWidth: '64rem',
85
103
  left: isAnon ? '-14.5rem' : '-19.5rem',
86
104
  overflowY: 'auto',
87
- maxHeight: animationCompleteStyles ? '85vh' : 0
105
+ maxHeight: animationCompleteStyles ? '85vh' : 0,
106
+ backgroundColor: displayGlobalNavRedesign ? 'transparent' : ''
88
107
  },
89
108
  initial: {
90
109
  borderWidth: 0,
91
110
  height: 0
92
111
  },
93
112
  animate: {
94
- borderWidth: isOpen ? 1 : 0,
113
+ borderWidth: isOpen ? displayGlobalNavRedesign ? 0 : 1 : 0,
95
114
  height: isOpen ? 'fit-content' : 0
96
115
  },
97
116
  transition: {
@@ -100,7 +119,14 @@ export const AppHeaderResourcesDropdown = ({
100
119
  "aria-hidden": !isOpen,
101
120
  "data-testid": "resources-menu-dropdown",
102
121
  onAnimationComplete: animationFinished,
103
- children: /*#__PURE__*/_jsx(AppHeaderResourcesSection, {
122
+ children: displayGlobalNavRedesign ? /*#__PURE__*/_jsx(ColorMode, {
123
+ mode: "light",
124
+ children: /*#__PURE__*/_jsx(AppHeaderSection, {
125
+ isOpen: isOpen,
126
+ ref: containerRef,
127
+ navSections: RESOURCES_NAV_SECTIONS
128
+ })
129
+ }) : /*#__PURE__*/_jsx(AppHeaderResourcesSection, {
104
130
  action: action,
105
131
  ref: containerRef,
106
132
  id: `menu-container${item.text}`,
@@ -0,0 +1,83 @@
1
+ import { setupRtl } from '@codecademy/gamut-tests';
2
+ import userEvent from '@testing-library/user-event';
3
+ import React from 'react';
4
+ import { GlobalHeaderItemClickContext } from '../../../GlobalHeader/context';
5
+ import { CATALOG_NAV_SECTIONS } from '../AppHeaderCatalogDropdown/consts';
6
+ import { AppHeaderSection } from '.';
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ const mockOnClick = jest.fn();
9
+ const mockKeyDownEvents = jest.fn();
10
+ const mockItem = {
11
+ text: 'catalog',
12
+ id: 'the-catalog',
13
+ type: 'catalog-dropdown',
14
+ trackingTarget: 'catalog-dropdown'
15
+ };
16
+ const defaultProps = {
17
+ item: mockItem,
18
+ isOpen: true,
19
+ keyDownEvents: mockKeyDownEvents
20
+ };
21
+ const mockContextValue = {
22
+ globalHeaderItemClick: mockOnClick
23
+ };
24
+ describe('AppHeaderSection', () => {
25
+ const renderView = setupRtl(AppHeaderSection, defaultProps).options({
26
+ wrapper: ({
27
+ children
28
+ }) => /*#__PURE__*/_jsx(GlobalHeaderItemClickContext.Provider, {
29
+ value: mockContextValue,
30
+ children: children
31
+ })
32
+ });
33
+ it('renders the component ', () => {
34
+ const {
35
+ view
36
+ } = renderView({
37
+ navSections: CATALOG_NAV_SECTIONS
38
+ });
39
+ expect(view.getByRole('heading', {
40
+ name: 'Course topics'
41
+ })).toBeInTheDocument();
42
+ });
43
+ describe('tab navigation', () => {
44
+ it('starts with the first tab active by default', () => {
45
+ const {
46
+ view
47
+ } = renderView({
48
+ navSections: CATALOG_NAV_SECTIONS
49
+ });
50
+ const courseTopicsButton = view.getByTestId('nav-section-course-topics');
51
+ expect(courseTopicsButton).toHaveAttribute('aria-expanded', 'true');
52
+ });
53
+ it('switches active tab when clicking on different sections', async () => {
54
+ const {
55
+ view
56
+ } = renderView({
57
+ navSections: CATALOG_NAV_SECTIONS
58
+ });
59
+ const careerPathsButton = view.getByTestId('nav-section-career-paths');
60
+ await userEvent.click(careerPathsButton);
61
+ expect(careerPathsButton).toHaveAttribute('aria-expanded', 'true');
62
+ const courseTopicsButton = view.getByTestId('nav-section-course-topics');
63
+ expect(courseTopicsButton).toHaveAttribute('aria-expanded', 'false');
64
+ });
65
+ it('calls tracking with correct parameters when clicking nav section', async () => {
66
+ const {
67
+ view
68
+ } = renderView({
69
+ navSections: CATALOG_NAV_SECTIONS
70
+ });
71
+ const careerPathsButton = view.getByTestId('nav-section-career-paths');
72
+ await userEvent.click(careerPathsButton);
73
+ expect(mockOnClick).toHaveBeenCalledTimes(1);
74
+ expect(mockOnClick).toHaveBeenCalledWith(expect.anything(),
75
+ // event object
76
+ expect.objectContaining({
77
+ id: 'career-paths',
78
+ type: 'catalog-dropdown'
79
+ }) // tracking parameters
80
+ );
81
+ });
82
+ });
83
+ });
@@ -1,9 +1,9 @@
1
1
  import { GamutIconProps } from '@codecademy/gamut-icons';
2
2
  import React, { PropsWithChildren } from 'react';
3
- import { AppHeaderCatalogDropdownItem } from '../../shared';
3
+ import { AppHeaderCatalogDropdownItem, AppHeaderResourcesDropdownItem } from '../../shared';
4
4
  type NavSectionProps = PropsWithChildren & {
5
5
  activeTab: number;
6
- item: AppHeaderCatalogDropdownItem;
6
+ item: AppHeaderCatalogDropdownItem | AppHeaderResourcesDropdownItem;
7
7
  setActiveTab: (tab: number) => void;
8
8
  icon?: React.ComponentType<GamutIconProps>;
9
9
  text: string;
@@ -0,0 +1,79 @@
1
+ import _styled from "@emotion/styled/base";
2
+ import { Box, FlexBox } from '@codecademy/gamut';
3
+ import { ArrowChevronRightIcon } from '@codecademy/gamut-icons';
4
+ import React from 'react';
5
+ import { useGlobalHeaderItemClick } from '../../../GlobalHeader/context';
6
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
7
+ const NavPanelContainer = /*#__PURE__*/_styled(Box, {
8
+ target: "ed97qwe1",
9
+ label: "NavPanelContainer"
10
+ })("display:", ({
11
+ isActive
12
+ }) => isActive ? 'block' : 'none', ";grid-column:2/span 12;grid-row:1/span 8;background-color:", ({
13
+ theme
14
+ }) => theme.colors.background, ";border-radius:", ({
15
+ isActive,
16
+ isFirst
17
+ }) => isActive && isFirst ? '0 8px 8px 8px' : '8px', ";padding:16px 32px 24px 32px;" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9BcHBIZWFkZXIvQXBwSGVhZGVyRWxlbWVudHMvQXBwSGVhZGVyU2VjdGlvbi9OYXZTZWN0aW9uLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFzQjhFIiwiZmlsZSI6Ii4uLy4uLy4uLy4uL3NyYy9BcHBIZWFkZXIvQXBwSGVhZGVyRWxlbWVudHMvQXBwSGVhZGVyU2VjdGlvbi9OYXZTZWN0aW9uLnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJveCwgRmxleEJveCB9IGZyb20gJ0Bjb2RlY2FkZW15L2dhbXV0JztcbmltcG9ydCB7IEFycm93Q2hldnJvblJpZ2h0SWNvbiwgR2FtdXRJY29uUHJvcHMgfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1pY29ucyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgUmVhY3QsIHsgUHJvcHNXaXRoQ2hpbGRyZW4gfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IHVzZUdsb2JhbEhlYWRlckl0ZW1DbGljayB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbEhlYWRlci9jb250ZXh0JztcbmltcG9ydCB7XG4gIEFwcEhlYWRlckNhdGFsb2dEcm9wZG93bkl0ZW0sXG4gIEFwcEhlYWRlclJlc291cmNlc0Ryb3Bkb3duSXRlbSxcbn0gZnJvbSAnLi4vLi4vc2hhcmVkJztcblxudHlwZSBOYXZTZWN0aW9uUHJvcHMgPSBQcm9wc1dpdGhDaGlsZHJlbiAmIHtcbiAgYWN0aXZlVGFiOiBudW1iZXI7XG4gIGl0ZW06IEFwcEhlYWRlckNhdGFsb2dEcm9wZG93bkl0ZW0gfCBBcHBIZWFkZXJSZXNvdXJjZXNEcm9wZG93bkl0ZW07XG4gIHNldEFjdGl2ZVRhYjogKHRhYjogbnVtYmVyKSA9PiB2b2lkO1xuICBpY29uPzogUmVhY3QuQ29tcG9uZW50VHlwZTxHYW11dEljb25Qcm9wcz47XG4gIHRleHQ6IHN0cmluZztcbiAgaW5kZXg6IG51bWJlcjtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbiAgdGFiSW5kZXg/OiBudW1iZXI7XG59O1xuXG5jb25zdCBOYXZQYW5lbENvbnRhaW5lciA9IHN0eWxlZChCb3gpPHsgaXNBY3RpdmU6IGJvb2xlYW47IGlzRmlyc3Q6IGJvb2xlYW4gfT5gXG4gIGRpc3BsYXk6ICR7KHsgaXNBY3RpdmUgfSkgPT4gKGlzQWN0aXZlID8gJ2Jsb2NrJyA6ICdub25lJyl9O1xuICBncmlkLWNvbHVtbjogMiAvIHNwYW4gMTI7XG4gIGdyaWQtcm93OiAxIC8gc3BhbiA4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkeyh7IHRoZW1lIH0pID0+IHRoZW1lLmNvbG9ycy5iYWNrZ3JvdW5kfTtcbiAgYm9yZGVyLXJhZGl1czogJHsoeyBpc0FjdGl2ZSwgaXNGaXJzdCB9KSA9PlxuICAgIGlzQWN0aXZlICYmIGlzRmlyc3QgPyAnMCA4cHggOHB4IDhweCcgOiAnOHB4J307XG4gIHBhZGRpbmc6IDE2cHggMzJweCAyNHB4IDMycHg7XG5gO1xuXG5jb25zdCBTdHlsZWRCdXR0b24gPSBzdHlsZWQuYnV0dG9uPHsgaXNBY3RpdmU6IGJvb2xlYW47IGluZGV4OiBudW1iZXIgfT5gXG4gIGdyaWQtY29sdW1uOiAxO1xuICBncmlkLXJvdzogJHsoeyBpbmRleCB9KSA9PiBpbmRleCArIDF9O1xuICBwYWRkaW5nOiAxNnB4O1xuICBib3JkZXI6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6ICR7KHsgaXNBY3RpdmUgfSkgPT4gKGlzQWN0aXZlID8gJzhweCAwIDAgOHB4JyA6ICc4cHgnKX07XG4gIGJhY2tncm91bmQ6IG5vbmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBmb250LXdlaWdodDogNDAwO1xuICBjb2xvcjogJHsoeyB0aGVtZSwgaXNBY3RpdmUgfSkgPT5cbiAgICBpc0FjdGl2ZSA/IHRoZW1lLmNvbG9ycy5wcmltYXJ5IDogdGhlbWUuY29sb3JzLnRleHR9O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB3aWR0aDogJHsoeyBpc0FjdGl2ZSB9KSA9PiAoaXNBY3RpdmUgPyAnMTAwJScgOiAnY2FsYygxMDAlIC0gOHB4KScpfTtcbiAgaGVpZ2h0OiA2MHB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7KHsgaXNBY3RpdmUsIHRoZW1lIH0pID0+XG4gICAgaXNBY3RpdmUgPyB0aGVtZS5jb2xvcnMuYmFja2dyb3VuZCA6IHRoZW1lLmNvbG9yc1snZ3JheS0xMDAnXX07XG5cbiAgI2Fycm93LWNoZXZyb24tcmlnaHQtaWNvbiB7XG4gICAgZGlzcGxheTogJHsoeyBpc0FjdGl2ZSB9KSA9PiAoaXNBY3RpdmUgPyAnYmxvY2snIDogJ25vbmUnKX07XG4gIH1cblxuICAmOmhvdmVyLFxuICAmOmZvY3VzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkeyh7IHRoZW1lLCBpc0FjdGl2ZSB9KSA9PlxuICAgICAgaXNBY3RpdmUgPyB0aGVtZS5jb2xvcnMuYmFja2dyb3VuZCA6IHRoZW1lLmNvbG9yc1snbmF2eS0xMDAnXX07XG4gICAgY29sb3I6ICR7KHsgdGhlbWUgfSkgPT4gdGhlbWUuY29sb3JzLnByaW1hcnl9O1xuICB9XG5gO1xuXG5jb25zdCBOYXZTZWN0aW9uID0gKHtcbiAgYWN0aXZlVGFiLFxuICBzZXRBY3RpdmVUYWIsXG4gIGljb246IEljb24sXG4gIHRleHQsXG4gIGluZGV4LFxuICBjaGlsZHJlbixcbiAgaXRlbSxcbiAgdGFiSW5kZXgsXG59OiBOYXZTZWN0aW9uUHJvcHMpID0+IHtcbiAgY29uc3QgeyBnbG9iYWxIZWFkZXJJdGVtQ2xpY2sgfSA9IHVzZUdsb2JhbEhlYWRlckl0ZW1DbGljaygpO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxTdHlsZWRCdXR0b25cbiAgICAgICAgaXNBY3RpdmU9e2FjdGl2ZVRhYiA9PT0gaW5kZXh9XG4gICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAgICAgb25DbGljaz17KGV2ZW50KSA9PiB7XG4gICAgICAgICAgZ2xvYmFsSGVhZGVySXRlbUNsaWNrKGV2ZW50LCBpdGVtKTtcbiAgICAgICAgICBzZXRBY3RpdmVUYWIoaW5kZXgpO1xuICAgICAgICB9fVxuICAgICAgICBkYXRhLXRlc3RpZD17YG5hdi1zZWN0aW9uLSR7aXRlbS5pZH1gfVxuICAgICAgICBhcmlhLWV4cGFuZGVkPXthY3RpdmVUYWIgPT09IGluZGV4fVxuICAgICAgICB0YWJJbmRleD17dGFiSW5kZXh9XG4gICAgICA+XG4gICAgICAgIDxGbGV4Qm94IGdhcD17OH0gYWxpZ25JdGVtcz1cImNlbnRlclwiPlxuICAgICAgICAgIHtJY29uICYmIDxJY29uIC8+fVxuICAgICAgICAgIHt0ZXh0fVxuICAgICAgICA8L0ZsZXhCb3g+XG4gICAgICAgIDxBcnJvd0NoZXZyb25SaWdodEljb24gaWQ9XCJhcnJvdy1jaGV2cm9uLXJpZ2h0LWljb25cIiAvPlxuICAgICAgPC9TdHlsZWRCdXR0b24+XG5cbiAgICAgIDxOYXZQYW5lbENvbnRhaW5lciBpc0FjdGl2ZT17YWN0aXZlVGFiID09PSBpbmRleH0gaXNGaXJzdD17aW5kZXggPT09IDB9PlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICA8L05hdlBhbmVsQ29udGFpbmVyPlxuICAgIDwvPlxuICApO1xufTtcbmV4cG9ydCBkZWZhdWx0IE5hdlNlY3Rpb247XG4iXX0= */"));
18
+ const StyledButton = /*#__PURE__*/_styled("button", {
19
+ target: "ed97qwe0",
20
+ label: "StyledButton"
21
+ })("grid-column:1;grid-row:", ({
22
+ index
23
+ }) => index + 1, ";padding:16px;border:none;border-radius:", ({
24
+ isActive
25
+ }) => isActive ? '8px 0 0 8px' : '8px', ";background:none;cursor:pointer;font-size:18px;font-weight:400;color:", ({
26
+ theme,
27
+ isActive
28
+ }) => isActive ? theme.colors.primary : theme.colors.text, ";text-align:left;width:", ({
29
+ isActive
30
+ }) => isActive ? '100%' : 'calc(100% - 8px)', ";height:60px;display:flex;justify-content:space-between;align-items:center;background-color:", ({
31
+ isActive,
32
+ theme
33
+ }) => isActive ? theme.colors.background : theme.colors['gray-100'], ";#arrow-chevron-right-icon{display:", ({
34
+ isActive
35
+ }) => isActive ? 'block' : 'none', ";}&:hover,&:focus{background-color:", ({
36
+ theme,
37
+ isActive
38
+ }) => isActive ? theme.colors.background : theme.colors['navy-100'], ";color:", ({
39
+ theme
40
+ }) => theme.colors.primary, ";}" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9BcHBIZWFkZXIvQXBwSGVhZGVyRWxlbWVudHMvQXBwSGVhZGVyU2VjdGlvbi9OYXZTZWN0aW9uLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFnQ3dFIiwiZmlsZSI6Ii4uLy4uLy4uLy4uL3NyYy9BcHBIZWFkZXIvQXBwSGVhZGVyRWxlbWVudHMvQXBwSGVhZGVyU2VjdGlvbi9OYXZTZWN0aW9uLnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJveCwgRmxleEJveCB9IGZyb20gJ0Bjb2RlY2FkZW15L2dhbXV0JztcbmltcG9ydCB7IEFycm93Q2hldnJvblJpZ2h0SWNvbiwgR2FtdXRJY29uUHJvcHMgfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1pY29ucyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgUmVhY3QsIHsgUHJvcHNXaXRoQ2hpbGRyZW4gfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IHVzZUdsb2JhbEhlYWRlckl0ZW1DbGljayB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbEhlYWRlci9jb250ZXh0JztcbmltcG9ydCB7XG4gIEFwcEhlYWRlckNhdGFsb2dEcm9wZG93bkl0ZW0sXG4gIEFwcEhlYWRlclJlc291cmNlc0Ryb3Bkb3duSXRlbSxcbn0gZnJvbSAnLi4vLi4vc2hhcmVkJztcblxudHlwZSBOYXZTZWN0aW9uUHJvcHMgPSBQcm9wc1dpdGhDaGlsZHJlbiAmIHtcbiAgYWN0aXZlVGFiOiBudW1iZXI7XG4gIGl0ZW06IEFwcEhlYWRlckNhdGFsb2dEcm9wZG93bkl0ZW0gfCBBcHBIZWFkZXJSZXNvdXJjZXNEcm9wZG93bkl0ZW07XG4gIHNldEFjdGl2ZVRhYjogKHRhYjogbnVtYmVyKSA9PiB2b2lkO1xuICBpY29uPzogUmVhY3QuQ29tcG9uZW50VHlwZTxHYW11dEljb25Qcm9wcz47XG4gIHRleHQ6IHN0cmluZztcbiAgaW5kZXg6IG51bWJlcjtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbiAgdGFiSW5kZXg/OiBudW1iZXI7XG59O1xuXG5jb25zdCBOYXZQYW5lbENvbnRhaW5lciA9IHN0eWxlZChCb3gpPHsgaXNBY3RpdmU6IGJvb2xlYW47IGlzRmlyc3Q6IGJvb2xlYW4gfT5gXG4gIGRpc3BsYXk6ICR7KHsgaXNBY3RpdmUgfSkgPT4gKGlzQWN0aXZlID8gJ2Jsb2NrJyA6ICdub25lJyl9O1xuICBncmlkLWNvbHVtbjogMiAvIHNwYW4gMTI7XG4gIGdyaWQtcm93OiAxIC8gc3BhbiA4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkeyh7IHRoZW1lIH0pID0+IHRoZW1lLmNvbG9ycy5iYWNrZ3JvdW5kfTtcbiAgYm9yZGVyLXJhZGl1czogJHsoeyBpc0FjdGl2ZSwgaXNGaXJzdCB9KSA9PlxuICAgIGlzQWN0aXZlICYmIGlzRmlyc3QgPyAnMCA4cHggOHB4IDhweCcgOiAnOHB4J307XG4gIHBhZGRpbmc6IDE2cHggMzJweCAyNHB4IDMycHg7XG5gO1xuXG5jb25zdCBTdHlsZWRCdXR0b24gPSBzdHlsZWQuYnV0dG9uPHsgaXNBY3RpdmU6IGJvb2xlYW47IGluZGV4OiBudW1iZXIgfT5gXG4gIGdyaWQtY29sdW1uOiAxO1xuICBncmlkLXJvdzogJHsoeyBpbmRleCB9KSA9PiBpbmRleCArIDF9O1xuICBwYWRkaW5nOiAxNnB4O1xuICBib3JkZXI6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6ICR7KHsgaXNBY3RpdmUgfSkgPT4gKGlzQWN0aXZlID8gJzhweCAwIDAgOHB4JyA6ICc4cHgnKX07XG4gIGJhY2tncm91bmQ6IG5vbmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBmb250LXdlaWdodDogNDAwO1xuICBjb2xvcjogJHsoeyB0aGVtZSwgaXNBY3RpdmUgfSkgPT5cbiAgICBpc0FjdGl2ZSA/IHRoZW1lLmNvbG9ycy5wcmltYXJ5IDogdGhlbWUuY29sb3JzLnRleHR9O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB3aWR0aDogJHsoeyBpc0FjdGl2ZSB9KSA9PiAoaXNBY3RpdmUgPyAnMTAwJScgOiAnY2FsYygxMDAlIC0gOHB4KScpfTtcbiAgaGVpZ2h0OiA2MHB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7KHsgaXNBY3RpdmUsIHRoZW1lIH0pID0+XG4gICAgaXNBY3RpdmUgPyB0aGVtZS5jb2xvcnMuYmFja2dyb3VuZCA6IHRoZW1lLmNvbG9yc1snZ3JheS0xMDAnXX07XG5cbiAgI2Fycm93LWNoZXZyb24tcmlnaHQtaWNvbiB7XG4gICAgZGlzcGxheTogJHsoeyBpc0FjdGl2ZSB9KSA9PiAoaXNBY3RpdmUgPyAnYmxvY2snIDogJ25vbmUnKX07XG4gIH1cblxuICAmOmhvdmVyLFxuICAmOmZvY3VzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkeyh7IHRoZW1lLCBpc0FjdGl2ZSB9KSA9PlxuICAgICAgaXNBY3RpdmUgPyB0aGVtZS5jb2xvcnMuYmFja2dyb3VuZCA6IHRoZW1lLmNvbG9yc1snbmF2eS0xMDAnXX07XG4gICAgY29sb3I6ICR7KHsgdGhlbWUgfSkgPT4gdGhlbWUuY29sb3JzLnByaW1hcnl9O1xuICB9XG5gO1xuXG5jb25zdCBOYXZTZWN0aW9uID0gKHtcbiAgYWN0aXZlVGFiLFxuICBzZXRBY3RpdmVUYWIsXG4gIGljb246IEljb24sXG4gIHRleHQsXG4gIGluZGV4LFxuICBjaGlsZHJlbixcbiAgaXRlbSxcbiAgdGFiSW5kZXgsXG59OiBOYXZTZWN0aW9uUHJvcHMpID0+IHtcbiAgY29uc3QgeyBnbG9iYWxIZWFkZXJJdGVtQ2xpY2sgfSA9IHVzZUdsb2JhbEhlYWRlckl0ZW1DbGljaygpO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxTdHlsZWRCdXR0b25cbiAgICAgICAgaXNBY3RpdmU9e2FjdGl2ZVRhYiA9PT0gaW5kZXh9XG4gICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAgICAgb25DbGljaz17KGV2ZW50KSA9PiB7XG4gICAgICAgICAgZ2xvYmFsSGVhZGVySXRlbUNsaWNrKGV2ZW50LCBpdGVtKTtcbiAgICAgICAgICBzZXRBY3RpdmVUYWIoaW5kZXgpO1xuICAgICAgICB9fVxuICAgICAgICBkYXRhLXRlc3RpZD17YG5hdi1zZWN0aW9uLSR7aXRlbS5pZH1gfVxuICAgICAgICBhcmlhLWV4cGFuZGVkPXthY3RpdmVUYWIgPT09IGluZGV4fVxuICAgICAgICB0YWJJbmRleD17dGFiSW5kZXh9XG4gICAgICA+XG4gICAgICAgIDxGbGV4Qm94IGdhcD17OH0gYWxpZ25JdGVtcz1cImNlbnRlclwiPlxuICAgICAgICAgIHtJY29uICYmIDxJY29uIC8+fVxuICAgICAgICAgIHt0ZXh0fVxuICAgICAgICA8L0ZsZXhCb3g+XG4gICAgICAgIDxBcnJvd0NoZXZyb25SaWdodEljb24gaWQ9XCJhcnJvdy1jaGV2cm9uLXJpZ2h0LWljb25cIiAvPlxuICAgICAgPC9TdHlsZWRCdXR0b24+XG5cbiAgICAgIDxOYXZQYW5lbENvbnRhaW5lciBpc0FjdGl2ZT17YWN0aXZlVGFiID09PSBpbmRleH0gaXNGaXJzdD17aW5kZXggPT09IDB9PlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICA8L05hdlBhbmVsQ29udGFpbmVyPlxuICAgIDwvPlxuICApO1xufTtcbmV4cG9ydCBkZWZhdWx0IE5hdlNlY3Rpb247XG4iXX0= */"));
41
+ const NavSection = ({
42
+ activeTab,
43
+ setActiveTab,
44
+ icon: Icon,
45
+ text,
46
+ index,
47
+ children,
48
+ item,
49
+ tabIndex
50
+ }) => {
51
+ const {
52
+ globalHeaderItemClick
53
+ } = useGlobalHeaderItemClick();
54
+ return /*#__PURE__*/_jsxs(_Fragment, {
55
+ children: [/*#__PURE__*/_jsxs(StyledButton, {
56
+ isActive: activeTab === index,
57
+ index: index,
58
+ onClick: event => {
59
+ globalHeaderItemClick(event, item);
60
+ setActiveTab(index);
61
+ },
62
+ "data-testid": `nav-section-${item.id}`,
63
+ "aria-expanded": activeTab === index,
64
+ tabIndex: tabIndex,
65
+ children: [/*#__PURE__*/_jsxs(FlexBox, {
66
+ gap: 8,
67
+ alignItems: "center",
68
+ children: [Icon && /*#__PURE__*/_jsx(Icon, {}), text]
69
+ }), /*#__PURE__*/_jsx(ArrowChevronRightIcon, {
70
+ id: "arrow-chevron-right-icon"
71
+ })]
72
+ }), /*#__PURE__*/_jsx(NavPanelContainer, {
73
+ isActive: activeTab === index,
74
+ isFirst: index === 0,
75
+ children: children
76
+ })]
77
+ });
78
+ };
79
+ export default NavSection;
@@ -0,0 +1,10 @@
1
+ import { PropsWithChildren, ReactNode } from 'react';
2
+ import { AppHeaderLinkItem } from '../../..';
3
+ type PanelLayoutProps = PropsWithChildren & {
4
+ heading: string;
5
+ description: ReactNode;
6
+ linkItem?: AppHeaderLinkItem;
7
+ tabIndex?: number;
8
+ };
9
+ export declare const PanelLayout: ({ heading, description, linkItem, children, tabIndex, }: PanelLayoutProps) => import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -0,0 +1,54 @@
1
+ import { Anchor, Box, FlexBox, Text } from '@codecademy/gamut';
2
+ import { MiniArrowRightIcon } from '@codecademy/gamut-icons';
3
+ import { useGlobalHeaderItemClick } from '../../../GlobalHeader/context';
4
+ import { useAppHeaderDropdownContext } from '../AppHeaderDropdownProvider';
5
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
+ export const PanelLayout = ({
7
+ heading,
8
+ description,
9
+ linkItem,
10
+ children,
11
+ tabIndex = 0
12
+ }) => {
13
+ const {
14
+ globalHeaderItemClick
15
+ } = useGlobalHeaderItemClick();
16
+ const {
17
+ handleClose
18
+ } = useAppHeaderDropdownContext();
19
+ return /*#__PURE__*/_jsxs(FlexBox, {
20
+ flexDirection: "column",
21
+ gap: 24,
22
+ pr: {
23
+ _: 32,
24
+ md: 16,
25
+ lg: 0
26
+ },
27
+ children: [/*#__PURE__*/_jsxs(Box, {
28
+ children: [/*#__PURE__*/_jsx(Text, {
29
+ as: "h2",
30
+ variant: "title-sm",
31
+ children: heading
32
+ }), /*#__PURE__*/_jsx(Text, {
33
+ mt: 8,
34
+ children: description
35
+ })]
36
+ }), children, linkItem && /*#__PURE__*/_jsx(FlexBox, {
37
+ justifyContent: "center",
38
+ children: /*#__PURE__*/_jsx(Anchor, {
39
+ href: linkItem.href,
40
+ onClick: event => {
41
+ globalHeaderItemClick(event, linkItem);
42
+ handleClose();
43
+ },
44
+ tabIndex: tabIndex,
45
+ variant: "standard",
46
+ children: /*#__PURE__*/_jsxs(FlexBox, {
47
+ alignItems: "center",
48
+ gap: 8,
49
+ children: [linkItem.text, " ", /*#__PURE__*/_jsx(MiniArrowRightIcon, {})]
50
+ })
51
+ })
52
+ })]
53
+ });
54
+ };
@@ -0,0 +1,17 @@
1
+ import React, { RefObject } from 'react';
2
+ import { AppHeaderCatalogDropdownItem, AppHeaderResourcesDropdownItem } from '../../shared';
3
+ export type AppHeaderSectionProps = {
4
+ isOpen?: boolean;
5
+ keyDownEvents?: (event: React.KeyboardEvent) => void;
6
+ ref?: RefObject<HTMLDivElement>;
7
+ navSections: {
8
+ item: AppHeaderCatalogDropdownItem | AppHeaderResourcesDropdownItem;
9
+ panel: React.ComponentType<{
10
+ tabIndex?: number;
11
+ }>;
12
+ }[];
13
+ MarketingBanner?: ({ tabIndex }: {
14
+ tabIndex: number;
15
+ }) => JSX.Element;
16
+ };
17
+ export declare const AppHeaderSection: React.ForwardRefExoticComponent<Omit<AppHeaderSectionProps, "ref"> & React.RefAttributes<HTMLDivElement>>;