@codecademy/brand 3.2.1-alpha.10ea26adc4.0 → 3.3.0-alpha.991be2ca62.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.
@@ -0,0 +1,17 @@
1
+ import React, { ReactNode } from 'react';
2
+ interface OnSearchAsYouTypeParamsType {
3
+ query: string;
4
+ searchId: string;
5
+ resultsCount: number;
6
+ queryLoadTime: number;
7
+ }
8
+ interface SearchTrackingContextType {
9
+ onSearchAsYouTypeParams: OnSearchAsYouTypeParamsType | null;
10
+ setOnSearchAsYouTypeParams: (params: OnSearchAsYouTypeParamsType | null) => void;
11
+ }
12
+ export declare const SearchTrackingContext: React.Context<SearchTrackingContextType>;
13
+ export declare const SearchTrackingProvider: React.FC<{
14
+ children: ReactNode;
15
+ }>;
16
+ export declare const useSearchTrackingContext: () => SearchTrackingContextType;
17
+ export {};
@@ -0,0 +1,25 @@
1
+ import noop from 'lodash/noop';
2
+ import React, { createContext, useContext, useState } from 'react';
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ export const SearchTrackingContext = /*#__PURE__*/createContext({
5
+ onSearchAsYouTypeParams: null,
6
+ setOnSearchAsYouTypeParams: noop
7
+ });
8
+ export const SearchTrackingProvider = ({
9
+ children
10
+ }) => {
11
+ const [onSearchAsYouTypeParams, setOnSearchAsYouTypeParams] = useState({
12
+ query: '',
13
+ searchId: '',
14
+ resultsCount: 0,
15
+ queryLoadTime: 0
16
+ });
17
+ return /*#__PURE__*/_jsx(SearchTrackingContext.Provider, {
18
+ value: {
19
+ onSearchAsYouTypeParams,
20
+ setOnSearchAsYouTypeParams
21
+ },
22
+ children: children
23
+ });
24
+ };
25
+ export const useSearchTrackingContext = () => useContext(SearchTrackingContext);
@@ -17,6 +17,7 @@ export interface AppHeaderSearch extends OnSearch, onTrackingClick {
17
17
  export interface SearchButtonProps extends ToggleSearch {
18
18
  isSearchVisible: boolean;
19
19
  setIsSearchVisible: Dispatch<SetStateAction<boolean>>;
20
+ onSearchAsYouType?: OnSearch['onSearchAsYouType'];
20
21
  }
21
22
  export interface SearchPaneProps extends OnSearch, ToggleSearch, onTrackingClick {
22
23
  }
@@ -24,7 +24,8 @@ export const useHeaderSearch = ({
24
24
  isSearchVisible: isSearchVisible,
25
25
  setIsSearchVisible: setIsSearchVisible,
26
26
  toggleSearch: toggleSearch,
27
- searchButtonRef: searchButtonRef
27
+ searchButtonRef: searchButtonRef,
28
+ onSearchAsYouType: onSearchAsYouType
28
29
  })
29
30
  }, /*#__PURE__*/_jsx(AnimatedHeaderZone, {
30
31
  visible: isSearchVisible,
@@ -5,6 +5,7 @@ import { NotificationsDropdown } from '../Notifications/NotificationsDropdown';
5
5
  import { useHeaderNotifications } from '../Notifications/useHeaderNotifications';
6
6
  import { AppHeaderListItem } from './AppHeaderElements/AppHeaderListItem';
7
7
  import { AppHeaderProvider } from './AppHeaderElements/AppHeaderProvider';
8
+ import { SearchTrackingProvider } from './Search/SearchTrackingProvider';
8
9
  import { useHeaderSearch } from './Search/useHeaderSearch';
9
10
  import { appHeaderMobileBreakpoint, appHeaderSpacing, StyledAppBar, StyledNavBar } from './shared';
10
11
  import { mapAppHeaderItemToElement } from './shared/utils';
@@ -63,15 +64,17 @@ export const AppHeader = ({
63
64
  _: 'none',
64
65
  [appHeaderMobileBreakpoint]: 'block'
65
66
  },
66
- children: /*#__PURE__*/_jsxs(AppHeaderProvider, {
67
- children: [/*#__PURE__*/_jsx(StyledAppBar, {
68
- "aria-label": "Main",
69
- as: "nav",
70
- children: /*#__PURE__*/_jsxs(StyledNavBar, {
71
- ref: menuContainerRef,
72
- children: [mapItemsToElement(items.left, 'left'), mapItemsToElement(right, 'right')]
73
- })
74
- }), notificationsView, searchPane]
67
+ children: /*#__PURE__*/_jsx(AppHeaderProvider, {
68
+ children: /*#__PURE__*/_jsxs(SearchTrackingProvider, {
69
+ children: [/*#__PURE__*/_jsx(StyledAppBar, {
70
+ "aria-label": "Main",
71
+ as: "nav",
72
+ children: /*#__PURE__*/_jsxs(StyledNavBar, {
73
+ ref: menuContainerRef,
74
+ children: [mapItemsToElement(items.left, 'left'), mapItemsToElement(right, 'right')]
75
+ })
76
+ }), notificationsView, searchPane]
77
+ })
75
78
  })
76
79
  });
77
80
  };
@@ -0,0 +1,5 @@
1
+ import * as React from 'react';
2
+ export type MobileSearchBarProps = {
3
+ onSearch: (query: string, fromPrevSearch?: string) => void;
4
+ };
5
+ export declare const MobileSearchBar: React.FC<MobileSearchBarProps>;
@@ -0,0 +1,77 @@
1
+ import _styled from "@emotion/styled/base";
2
+ import { Box } from '@codecademy/gamut';
3
+ import { SearchIcon } from '@codecademy/gamut-icons';
4
+ import { css } from '@codecademy/gamut-styles';
5
+ import * as React from 'react';
6
+ import { useState } from 'react';
7
+ import { searchPlaceholder } from '../../AppHeader/Search/consts';
8
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
+ const SearchForm = Box.withComponent('form', {
10
+ target: "e110cn5n2",
11
+ label: "SearchForm"
12
+ });
13
+ const StyledInput = /*#__PURE__*/_styled("input", {
14
+ target: "e110cn5n1",
15
+ label: "StyledInput"
16
+ })(css({
17
+ background: `none`,
18
+ borderWidth: `1px`,
19
+ borderColor: `gray-800`,
20
+ color: `text`,
21
+ fontSize: 16,
22
+ outline: `none`,
23
+ padding: `0.75rem`,
24
+ paddingRight: `2.5rem`,
25
+ width: `100%`,
26
+ '&::placeholder': {
27
+ color: 'text-disabled'
28
+ }
29
+ }), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BcHBIZWFkZXJNb2JpbGUvQXBwSGVhZGVyTWFpbk1lbnVNb2JpbGUvTW9iaWxlU2VhcmNoQmFyLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXb0IiLCJmaWxlIjoiLi4vLi4vLi4vc3JjL0FwcEhlYWRlck1vYmlsZS9BcHBIZWFkZXJNYWluTWVudU1vYmlsZS9Nb2JpbGVTZWFyY2hCYXIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQm94IH0gZnJvbSAnQGNvZGVjYWRlbXkvZ2FtdXQnO1xuaW1wb3J0IHsgU2VhcmNoSWNvbiB9IGZyb20gJ0Bjb2RlY2FkZW15L2dhbXV0LWljb25zJztcbmltcG9ydCB7IGNzcyB9IGZyb20gJ0Bjb2RlY2FkZW15L2dhbXV0LXN0eWxlcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgc2VhcmNoUGxhY2Vob2xkZXIgfSBmcm9tICcuLi8uLi9BcHBIZWFkZXIvU2VhcmNoL2NvbnN0cyc7XG5cbmNvbnN0IFNlYXJjaEZvcm0gPSBCb3gud2l0aENvbXBvbmVudCgnZm9ybScpO1xuXG5jb25zdCBTdHlsZWRJbnB1dCA9IHN0eWxlZC5pbnB1dChcbiAgY3NzKHtcbiAgICBiYWNrZ3JvdW5kOiBgbm9uZWAsXG4gICAgYm9yZGVyV2lkdGg6IGAxcHhgLFxuICAgIGJvcmRlckNvbG9yOiBgZ3JheS04MDBgLFxuICAgIGNvbG9yOiBgdGV4dGAsXG4gICAgZm9udFNpemU6IDE2LFxuICAgIG91dGxpbmU6IGBub25lYCxcbiAgICBwYWRkaW5nOiBgMC43NXJlbWAsXG4gICAgcGFkZGluZ1JpZ2h0OiBgMi41cmVtYCxcbiAgICB3aWR0aDogYDEwMCVgLFxuXG4gICAgJyY6OnBsYWNlaG9sZGVyJzoge1xuICAgICAgY29sb3I6ICd0ZXh0LWRpc2FibGVkJyxcbiAgICB9LFxuICB9KVxuKTtcblxuY29uc3QgU2VhcmNoQnV0dG9uID0gc3R5bGVkLmJ1dHRvbihcbiAgY3NzKHtcbiAgICBwb3NpdGlvbjogYGFic29sdXRlYCxcbiAgICB0b3A6IGA1MCVgLFxuICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZSgwLCAtNTAlKWAsXG4gICAgcmlnaHQ6IGAwLjc1cmVtYCxcbiAgICBjb2xvcjogYHRleHRgLFxuICAgIGN1cnNvcjogYHBvaW50ZXJgLFxuICAgIG91dGxpbmU6IDAsXG4gICAgYm9yZGVyOiBgbm9uZWAsXG4gICAgYmFja2dyb3VuZENvbG9yOiBgdHJhbnNwYXJlbnRgLFxuICAgIHA6IDAsXG4gICAgbGluZUhlaWdodDogMCxcbiAgfSlcbik7XG5cbmV4cG9ydCB0eXBlIE1vYmlsZVNlYXJjaEJhclByb3BzID0ge1xuICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcsIGZyb21QcmV2U2VhcmNoPzogc3RyaW5nKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IGNvbnN0IE1vYmlsZVNlYXJjaEJhcjogUmVhY3QuRkM8TW9iaWxlU2VhcmNoQmFyUHJvcHM+ID0gKHtcbiAgb25TZWFyY2gsXG59KSA9PiB7XG4gIGNvbnN0IFtzZWFyY2hWYWx1ZSwgc2V0U2VhcmNoVmFsdWVdID0gdXNlU3RhdGUoJycpO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZTogUmVhY3QuQ2hhbmdlRXZlbnRIYW5kbGVyPEhUTUxJbnB1dEVsZW1lbnQ+ID0gKGV2ZW50KSA9PiB7XG4gICAgc2V0U2VhcmNoVmFsdWUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdWJtaXQ6IFJlYWN0LkZvcm1FdmVudEhhbmRsZXIgPSAoZXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIG9uU2VhcmNoKHNlYXJjaFZhbHVlKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxTZWFyY2hGb3JtXG4gICAgICBhY3Rpb249XCIvc2VhcmNoXCJcbiAgICAgIGRpc3BsYXk9XCJmbGV4XCJcbiAgICAgIGlkPVwic2VhcmNoLWZvcm1cIlxuICAgICAgb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH1cbiAgICAgIHBvc2l0aW9uPVwicmVsYXRpdmVcIlxuICAgICAgcHk9ezE2fVxuICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICA+XG4gICAgICA8U3R5bGVkSW5wdXRcbiAgICAgICAgbmFtZT1cInF1ZXJ5XCJcbiAgICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgIHBsYWNlaG9sZGVyPXtzZWFyY2hQbGFjZWhvbGRlcn1cbiAgICAgICAgYXJpYS1sYWJlbD1cInNlYXJjaFwiXG4gICAgICAgIHZhbHVlPXtzZWFyY2hWYWx1ZX1cbiAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIC8+XG4gICAgICA8U2VhcmNoQnV0dG9uIGFyaWEtbGFiZWw9XCJFbnRlciBzZWFyY2hcIj5cbiAgICAgICAgPFNlYXJjaEljb24gLz5cbiAgICAgIDwvU2VhcmNoQnV0dG9uPlxuICAgIDwvU2VhcmNoRm9ybT5cbiAgKTtcbn07XG4iXX0= */");
30
+ const SearchButton = /*#__PURE__*/_styled("button", {
31
+ target: "e110cn5n0",
32
+ label: "SearchButton"
33
+ })(css({
34
+ position: `absolute`,
35
+ top: `50%`,
36
+ transform: `translate(0, -50%)`,
37
+ right: `0.75rem`,
38
+ color: `text`,
39
+ cursor: `pointer`,
40
+ outline: 0,
41
+ border: `none`,
42
+ backgroundColor: `transparent`,
43
+ p: 0,
44
+ lineHeight: 0
45
+ }), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BcHBIZWFkZXJNb2JpbGUvQXBwSGVhZGVyTWFpbk1lbnVNb2JpbGUvTW9iaWxlU2VhcmNoQmFyLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUE2QnFCIiwiZmlsZSI6Ii4uLy4uLy4uL3NyYy9BcHBIZWFkZXJNb2JpbGUvQXBwSGVhZGVyTWFpbk1lbnVNb2JpbGUvTW9iaWxlU2VhcmNoQmFyLnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJveCB9IGZyb20gJ0Bjb2RlY2FkZW15L2dhbXV0JztcbmltcG9ydCB7IFNlYXJjaEljb24gfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1pY29ucyc7XG5pbXBvcnQgeyBjc3MgfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1zdHlsZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IHNlYXJjaFBsYWNlaG9sZGVyIH0gZnJvbSAnLi4vLi4vQXBwSGVhZGVyL1NlYXJjaC9jb25zdHMnO1xuXG5jb25zdCBTZWFyY2hGb3JtID0gQm94LndpdGhDb21wb25lbnQoJ2Zvcm0nKTtcblxuY29uc3QgU3R5bGVkSW5wdXQgPSBzdHlsZWQuaW5wdXQoXG4gIGNzcyh7XG4gICAgYmFja2dyb3VuZDogYG5vbmVgLFxuICAgIGJvcmRlcldpZHRoOiBgMXB4YCxcbiAgICBib3JkZXJDb2xvcjogYGdyYXktODAwYCxcbiAgICBjb2xvcjogYHRleHRgLFxuICAgIGZvbnRTaXplOiAxNixcbiAgICBvdXRsaW5lOiBgbm9uZWAsXG4gICAgcGFkZGluZzogYDAuNzVyZW1gLFxuICAgIHBhZGRpbmdSaWdodDogYDIuNXJlbWAsXG4gICAgd2lkdGg6IGAxMDAlYCxcblxuICAgICcmOjpwbGFjZWhvbGRlcic6IHtcbiAgICAgIGNvbG9yOiAndGV4dC1kaXNhYmxlZCcsXG4gICAgfSxcbiAgfSlcbik7XG5cbmNvbnN0IFNlYXJjaEJ1dHRvbiA9IHN0eWxlZC5idXR0b24oXG4gIGNzcyh7XG4gICAgcG9zaXRpb246IGBhYnNvbHV0ZWAsXG4gICAgdG9wOiBgNTAlYCxcbiAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUoMCwgLTUwJSlgLFxuICAgIHJpZ2h0OiBgMC43NXJlbWAsXG4gICAgY29sb3I6IGB0ZXh0YCxcbiAgICBjdXJzb3I6IGBwb2ludGVyYCxcbiAgICBvdXRsaW5lOiAwLFxuICAgIGJvcmRlcjogYG5vbmVgLFxuICAgIGJhY2tncm91bmRDb2xvcjogYHRyYW5zcGFyZW50YCxcbiAgICBwOiAwLFxuICAgIGxpbmVIZWlnaHQ6IDAsXG4gIH0pXG4pO1xuXG5leHBvcnQgdHlwZSBNb2JpbGVTZWFyY2hCYXJQcm9wcyA9IHtcbiAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nLCBmcm9tUHJldlNlYXJjaD86IHN0cmluZykgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBjb25zdCBNb2JpbGVTZWFyY2hCYXI6IFJlYWN0LkZDPE1vYmlsZVNlYXJjaEJhclByb3BzPiA9ICh7XG4gIG9uU2VhcmNoLFxufSkgPT4ge1xuICBjb25zdCBbc2VhcmNoVmFsdWUsIHNldFNlYXJjaFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2U6IFJlYWN0LkNoYW5nZUV2ZW50SGFuZGxlcjxIVE1MSW5wdXRFbGVtZW50PiA9IChldmVudCkgPT4ge1xuICAgIHNldFNlYXJjaFZhbHVlKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU3VibWl0OiBSZWFjdC5Gb3JtRXZlbnRIYW5kbGVyID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBvblNlYXJjaChzZWFyY2hWYWx1ZSk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8U2VhcmNoRm9ybVxuICAgICAgYWN0aW9uPVwiL3NlYXJjaFwiXG4gICAgICBkaXNwbGF5PVwiZmxleFwiXG4gICAgICBpZD1cInNlYXJjaC1mb3JtXCJcbiAgICAgIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9XG4gICAgICBwb3NpdGlvbj1cInJlbGF0aXZlXCJcbiAgICAgIHB5PXsxNn1cbiAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgPlxuICAgICAgPFN0eWxlZElucHV0XG4gICAgICAgIG5hbWU9XCJxdWVyeVwiXG4gICAgICAgIHR5cGU9XCJzZWFyY2hcIlxuICAgICAgICBwbGFjZWhvbGRlcj17c2VhcmNoUGxhY2Vob2xkZXJ9XG4gICAgICAgIGFyaWEtbGFiZWw9XCJzZWFyY2hcIlxuICAgICAgICB2YWx1ZT17c2VhcmNoVmFsdWV9XG4gICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAvPlxuICAgICAgPFNlYXJjaEJ1dHRvbiBhcmlhLWxhYmVsPVwiRW50ZXIgc2VhcmNoXCI+XG4gICAgICAgIDxTZWFyY2hJY29uIC8+XG4gICAgICA8L1NlYXJjaEJ1dHRvbj5cbiAgICA8L1NlYXJjaEZvcm0+XG4gICk7XG59O1xuIl19 */");
46
+ export const MobileSearchBar = ({
47
+ onSearch
48
+ }) => {
49
+ const [searchValue, setSearchValue] = useState('');
50
+ const handleChange = event => {
51
+ setSearchValue(event.target.value);
52
+ };
53
+ const handleSubmit = event => {
54
+ event.preventDefault();
55
+ onSearch(searchValue);
56
+ };
57
+ return /*#__PURE__*/_jsxs(SearchForm, {
58
+ action: "/search",
59
+ display: "flex",
60
+ id: "search-form",
61
+ onSubmit: handleSubmit,
62
+ position: "relative",
63
+ py: 16,
64
+ width: "100%",
65
+ children: [/*#__PURE__*/_jsx(StyledInput, {
66
+ name: "query",
67
+ type: "search",
68
+ placeholder: searchPlaceholder,
69
+ "aria-label": "search",
70
+ value: searchValue,
71
+ onChange: handleChange
72
+ }), /*#__PURE__*/_jsx(SearchButton, {
73
+ "aria-label": "Enter search",
74
+ children: /*#__PURE__*/_jsx(SearchIcon, {})
75
+ })]
76
+ });
77
+ };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@codecademy/brand",
3
3
  "description": "Brand component library for Codecademy",
4
- "version": "3.2.1-alpha.10ea26adc4.0",
4
+ "version": "3.3.0-alpha.991be2ca62.0",
5
5
  "author": "Codecademy Engineering <dev@codecademy.com>",
6
6
  "dependencies": {
7
7
  "@emotion/is-prop-valid": "^1.2.1",