@@ -4,68 +4,132 @@ import {get} from '../constants'
4
4
import type { SxProp } from '../sx'
5
5
import sx from '../sx'
6
6
import type { ComponentProps } from '../utils/types'
7
+ import { toggleStyledComponent } from '../internal/utils/toggleStyledComponent'
8
+ import { useFeatureFlag } from '../FeatureFlags'
9
+ import React from 'react'
10
+ import { clsx } from 'clsx'
11
+ import classes from './Header.module.css'
12
+ import type { ForwardRefComponent as PolymorphicForwardRefComponent } from '../utils/polymorphic'
7
13
8
- type StyledHeaderItemProps = { full ?: boolean } & SxProp
9
- type StyledHeaderProps = SxProp
10
- type StyledHeaderLinkProps = { to ?: Location | Pathname } & SxProp
11
-
12
- const Header = styled . header < StyledHeaderProps > `
13
- z-index: 32;
14
- display: flex;
15
- padding: ${ get ( 'space.3' ) } ;
16
- font-size: ${ get ( 'fontSizes.1' ) } ;
17
- line-height: ${ get ( 'lineHeights.default' ) } ;
18
- color: ${ get ( 'colors.header.text' ) } ;
19
- background-color: ${ get ( 'colors.header.bg' ) } ;
20
- align-items: center;
21
- flex-wrap: nowrap;
22
- overflow: auto;
23
-
24
- ${ sx } ;
25
- `
26
- const HeaderItem = styled . div < StyledHeaderItemProps > `
27
- display: flex;
28
- margin-right: ${ get ( 'space.3' ) } ;
29
- align-self: stretch;
30
- align-items: center;
31
- flex-wrap: nowrap;
32
-
33
- ${ ( { full} ) =>
34
- full &&
35
- css `
36
- flex : auto;
37
- ` } ;
38
-
39
- ${ sx } ;
40
- `
14
+ type StyledHeaderProps = React . ComponentProps < 'header' > & SxProp
15
+ type StyledHeaderItemProps = React . ComponentProps < 'div' > & SxProp & { full ?: boolean }
16
+ type StyledHeaderLinkProps = React . ComponentProps < 'a' > & SxProp & { to ?: Location | Pathname }
41
17
42
- HeaderItem . displayName = 'Header.Item '
18
+ const CSS_MODULES_FEATURE_FLAG = 'primer_react_css_modules_team '
43
19
44
- const HeaderLink = styled . a . attrs < StyledHeaderLinkProps > ( ( { to} ) => {
45
- const isReactRouter = typeof to === 'string'
46
- if ( isReactRouter ) {
47
- // according to their docs, NavLink supports aria-current:
48
- // https://reacttraining.com/react-router/web/api/NavLink/aria-current-string
49
- return { 'aria-current' : 'page' }
50
- } else {
51
- return { }
52
- }
53
- } ) < StyledHeaderLinkProps > `
54
- font-weight: ${ get ( 'fontWeights.bold' ) } ;
55
- color: ${ get ( 'colors.header.logo' ) } ;
56
- white-space: nowrap;
57
- cursor: pointer;
58
- text-decoration: none;
59
- display: flex;
60
- align-items: center;
61
-
62
- &:hover,
63
- &:focus {
20
+ const StyledHeader = toggleStyledComponent (
21
+ CSS_MODULES_FEATURE_FLAG ,
22
+ 'header' ,
23
+ styled . header < StyledHeaderProps > `
24
+ z-index: 32;
25
+ display: flex;
26
+ padding: ${ get ( 'space.3' ) } ;
27
+ font-size: ${ get ( 'fontSizes.1' ) } ;
28
+ line-height: ${ get ( 'lineHeights.default' ) } ;
64
29
color: ${ get ( 'colors.header.text' ) } ;
65
- }
30
+ background-color: ${ get ( 'colors.header.bg' ) } ;
31
+ align-items: center;
32
+ flex-wrap: nowrap;
33
+ overflow: auto;
34
+
35
+ ${ sx } ;
36
+ ` ,
37
+ )
38
+
39
+ const Header = React . forwardRef < HTMLElement , StyledHeaderProps > ( function Header (
40
+ { children, className, ...rest } ,
41
+ forwardRef ,
42
+ ) {
43
+ const enabled = useFeatureFlag ( CSS_MODULES_FEATURE_FLAG )
44
+ return (
45
+ < StyledHeader ref = { forwardRef } className = { clsx ( className , { [ classes . Header ] : enabled } ) } { ...rest } >
46
+ { children }
47
+ </ StyledHeader >
48
+ )
49
+ } ) as PolymorphicForwardRefComponent < 'header' , StyledHeaderProps >
50
+
51
+ Header . displayName = 'Header'
52
+
53
+ const StyledHeaderItem = toggleStyledComponent (
54
+ CSS_MODULES_FEATURE_FLAG ,
55
+ 'div' ,
56
+ styled . div < StyledHeaderItemProps > `
57
+ display: flex;
58
+ margin-right: ${ get ( 'space.3' ) } ;
59
+ align-self: stretch;
60
+ align-items: center;
61
+ flex-wrap: nowrap;
62
+
63
+ ${ ( { full} ) =>
64
+ full &&
65
+ css `
66
+ flex : auto;
67
+ ` } ;
68
+
69
+ ${ sx } ;
70
+ ` ,
71
+ )
72
+
73
+ const HeaderItem = React . forwardRef < HTMLElement , StyledHeaderItemProps > ( function HeaderItem (
74
+ { children, className, ...rest } ,
75
+ forwardRef ,
76
+ ) {
77
+ const enabled = useFeatureFlag ( CSS_MODULES_FEATURE_FLAG )
78
+ return (
79
+ < StyledHeaderItem
80
+ ref = { forwardRef }
81
+ className = { clsx ( className , enabled && classes . HeaderItem ) }
82
+ data-full = { rest . full }
83
+ { ...rest }
84
+ >
85
+ { children }
86
+ </ StyledHeaderItem >
87
+ )
88
+ } )
89
+
90
+ HeaderItem . displayName = 'Header.Item'
91
+
92
+ const StyledHeaderLink = toggleStyledComponent (
93
+ CSS_MODULES_FEATURE_FLAG ,
94
+ 'a' ,
95
+ styled . a . attrs < StyledHeaderLinkProps > ( ( { to} ) => {
96
+ const isReactRouter = typeof to === 'string'
97
+ if ( isReactRouter ) {
98
+ // according to their docs, NavLink supports aria-current:
99
+ // https://reacttraining.com/react-router/web/api/NavLink/aria-current-string
100
+ return { 'aria-current' : 'page' }
101
+ } else {
102
+ return { }
103
+ }
104
+ } ) < StyledHeaderLinkProps > `
105
+ font-weight: ${ get ( 'fontWeights.bold' ) } ;
106
+ color: ${ get ( 'colors.header.logo' ) } ;
107
+ white-space: nowrap;
108
+ cursor: pointer;
109
+ text-decoration: none;
110
+ display: flex;
111
+ align-items: center;
112
+
113
+ &:hover,
114
+ &:focus {
115
+ color: ${ get ( 'colors.header.text' ) } ;
116
+ }
117
+
118
+ ${ sx } ;
119
+ ` ,
120
+ )
66
121
67
- ${ sx } ;
68
- `
122
+ const HeaderLink = React . forwardRef < HTMLElement , StyledHeaderLinkProps > ( function HeaderLink (
123
+ { children, className, ...rest } ,
124
+ forwardRef ,
125
+ ) {
126
+ const enabled = useFeatureFlag ( CSS_MODULES_FEATURE_FLAG )
127
+ return (
128
+ < StyledHeaderLink ref = { forwardRef } className = { clsx ( className , enabled && classes . HeaderLink ) } { ...rest } >
129
+ { children }
130
+ </ StyledHeaderLink >
131
+ )
132
+ } )
69
133
70
134
HeaderLink . displayName = 'Header.Link'
71
135
0 commit comments