44 CustomizationHeaderPreset ,
55 SiteCustomizationSettings ,
66 CustomizationHeaderItem ,
7+ ContentRef ,
78} from '@gitbook/api' ;
89import assertNever from 'assert-never' ;
910
@@ -35,7 +36,7 @@ export async function HeaderLink(props: {
3536 < Dropdown
3637 className = "shrink"
3738 button = { ( buttonProps ) => {
38- if ( ! target ) {
39+ if ( ! target || ! link . to ) {
3940 return (
4041 < HeaderItemDropdown
4142 { ...buttonProps }
@@ -47,6 +48,7 @@ export async function HeaderLink(props: {
4748 return (
4849 < HeaderLinkNavItem
4950 { ...buttonProps }
51+ linkTarget = { link . to }
5052 linkStyle = { linkStyle }
5153 headerPreset = { headerPreset }
5254 title = { link . title }
@@ -65,12 +67,13 @@ export async function HeaderLink(props: {
6567 ) ;
6668 }
6769
68- if ( ! target ) {
70+ if ( ! target || ! link . to ) {
6971 return null ;
7072 }
7173
7274 return (
7375 < HeaderLinkNavItem
76+ linkTarget = { link . to }
7477 linkStyle = { linkStyle }
7578 headerPreset = { headerPreset }
7679 title = { link . title }
@@ -81,6 +84,7 @@ export async function HeaderLink(props: {
8184}
8285
8386export type HeaderLinkNavItemProps = {
87+ linkTarget : ContentRef ;
8488 linkStyle : NonNullable < CustomizationHeaderItem [ 'style' ] > ;
8589 headerPreset : CustomizationHeaderPreset ;
8690 title : string ;
@@ -89,14 +93,15 @@ export type HeaderLinkNavItemProps = {
8993} & DropdownButtonProps < HTMLElement > ;
9094
9195function HeaderLinkNavItem ( props : HeaderLinkNavItemProps ) {
92- switch ( props . linkStyle ) {
96+ const { linkStyle, ...rest } = props ;
97+ switch ( linkStyle ) {
9398 case 'button-secondary' :
9499 case 'button-primary' :
95- return < HeaderItemButton { ...props } linkStyle = { props . linkStyle } /> ;
100+ return < HeaderItemButton { ...rest } linkStyle = { linkStyle } /> ;
96101 case 'link' :
97- return < HeaderItemLink { ...props } /> ;
102+ return < HeaderItemLink { ...rest } /> ;
98103 default :
99- assertNever ( props . linkStyle ) ;
104+ assertNever ( linkStyle ) ;
100105 }
101106}
102107
@@ -105,7 +110,7 @@ function HeaderItemButton(
105110 linkStyle : 'button-secondary' | 'button-primary' ;
106111 } ,
107112) {
108- const { linkStyle, headerPreset, title, href, isDropdown, ...rest } = props ;
113+ const { linkTarget , linkStyle, headerPreset, title, href, isDropdown, ...rest } = props ;
109114 const variant = ( ( ) => {
110115 switch ( linkStyle ) {
111116 case 'button-secondary' :
@@ -139,6 +144,10 @@ function HeaderItemButton(
139144 ) ,
140145 } [ linkStyle ] ,
141146 ) }
147+ insights = { {
148+ target : linkTarget ,
149+ position : 'header' ,
150+ } }
142151 { ...rest }
143152 >
144153 { title }
@@ -158,10 +167,18 @@ function getHeaderLinkClassName(props: { headerPreset: CustomizationHeaderPreset
158167 ) ;
159168}
160169
161- function HeaderItemLink ( props : HeaderLinkNavItemProps ) {
162- const { headerPreset, title, isDropdown, href, ...rest } = props ;
170+ function HeaderItemLink ( props : Omit < HeaderLinkNavItemProps , 'linkStyle' > ) {
171+ const { linkTarget , headerPreset, title, isDropdown, href, ...rest } = props ;
163172 return (
164- < Link href = { href } className = { getHeaderLinkClassName ( { headerPreset } ) } { ...rest } >
173+ < Link
174+ href = { href }
175+ className = { getHeaderLinkClassName ( { headerPreset } ) }
176+ insights = { {
177+ target : linkTarget ,
178+ position : 'header' ,
179+ } }
180+ { ...rest }
181+ >
165182 < span className = "truncate min-w-0" > { title } </ span >
166183 { isDropdown ? < DropdownChevron /> : null }
167184 </ Link >
@@ -198,5 +215,9 @@ async function SubHeaderLink(props: {
198215 return null ;
199216 }
200217
201- return < DropdownMenuItem href = { target . href } > { link . title } </ DropdownMenuItem > ;
218+ return (
219+ < DropdownMenuItem href = { target . href } insights = { { target : link . to , position : 'header' } } >
220+ { link . title }
221+ </ DropdownMenuItem >
222+ ) ;
202223}
0 commit comments