1
- import React , { useState , useRef , useEffect } from 'react' ;
2
- import { useHistory } from 'react-router-dom' ;
3
- import Link from '@docusaurus/Link' ;
4
- import { useDocsSidebar } from '@docusaurus/plugin-content-docs/client' ;
5
- import useDocusaurusContext from '@docusaurus/useDocusaurusContext' ;
1
+ import React , { useState , useRef , useEffect } from "react" ;
2
+ import { useHistory } from "react-router-dom" ;
3
+ import Link from "@docusaurus/Link" ;
4
+ import { useDocsSidebar } from "@docusaurus/plugin-content-docs/client" ;
5
+ import useDocusaurusContext from "@docusaurus/useDocusaurusContext" ;
6
+ import { translate } from "@docusaurus/Translate" ;
7
+ import Translate from "@docusaurus/Translate" ;
6
8
7
- import styles from ' ./styles.module.css' ;
9
+ import styles from " ./styles.module.css" ;
8
10
9
11
function DocsCategoryDropdown ( { dropdownCategory } ) {
10
12
const [ isOpen , setIsOpen ] = useState ( false ) ;
11
- const [ dropdownStyles , setDropdownStyles ] = useState ( { top : '0px' , left : '0px' } ) ;
13
+ const [ dropdownStyles , setDropdownStyles ] = useState ( {
14
+ top : "0px" ,
15
+ left : "0px" ,
16
+ } ) ;
12
17
const dropdownMenuRef = useRef ( null ) ;
13
18
const triggerRef = useRef ( null ) ; // Reference for the individual menu item trigger
14
19
@@ -36,15 +41,19 @@ function DocsCategoryDropdown({ dropdownCategory }) {
36
41
left = triggerRect . right - dropdownRect . width ;
37
42
} else {
38
43
// Align to center
39
- left = triggerRect . left + ( triggerRect . width / 2 ) - ( dropdownRect . width / 2 ) ;
44
+ left =
45
+ triggerRect . left + triggerRect . width / 2 - dropdownRect . width / 2 ;
40
46
}
41
47
42
48
// Ensure the dropdown doesn't go off-screen
43
- left = Math . max ( 10 , Math . min ( left , viewportWidth - dropdownRect . width - 10 ) ) ;
49
+ left = Math . max (
50
+ 10 ,
51
+ Math . min ( left , viewportWidth - dropdownRect . width - 10 ) ,
52
+ ) ;
44
53
45
54
setDropdownStyles ( {
46
55
top : `${ triggerRect . bottom } px` , // Align the dropdown below the menu item
47
- left : `${ left } px` // Align the dropdown with the menu item
56
+ left : `${ left } px` , // Align the dropdown with the menu item
48
57
} ) ;
49
58
}
50
59
} , [ isOpen ] ) ; // This runs when the dropdown is opened
@@ -54,13 +63,13 @@ function DocsCategoryDropdown({ dropdownCategory }) {
54
63
// Safely call useDocsSidebar
55
64
try {
56
65
sidebar = useDocsSidebar ( ) ;
57
- } catch ( e ) {
58
- }
66
+ } catch ( e ) { }
59
67
60
68
// Guard against undefined sidebar
61
- const isSelected = sidebar && sidebar . name && dropdownCategory
62
- ? sidebar . name === dropdownCategory . customProps . sidebar
63
- : false ;
69
+ const isSelected =
70
+ sidebar && sidebar . name && dropdownCategory
71
+ ? sidebar . name === dropdownCategory . customProps . sidebar
72
+ : false ;
64
73
65
74
return (
66
75
< div
@@ -72,9 +81,20 @@ function DocsCategoryDropdown({ dropdownCategory }) {
72
81
className = { styles . docsNavDropdownToolbarLink }
73
82
ref = { triggerRef } // Attach the ref to the individual link that triggers the dropdown
74
83
>
75
- < Link className = { `${ styles . docsNavDropdownToolbarTopLevelLink } ${
76
- isSelected ? styles . docsNavSelected : ''
77
- } `} href = { dropdownCategory . customProps . href } > { dropdownCategory . label } </ Link > < DropdownCaret />
84
+ < Link
85
+ className = { `${ styles . docsNavDropdownToolbarTopLevelLink } ${
86
+ isSelected ? styles . docsNavSelected : ""
87
+ } `}
88
+ href = { dropdownCategory . customProps . href }
89
+ >
90
+ < Translate
91
+ id = { `sidebar.dropdownCategories.category.${ dropdownCategory . label } ` }
92
+ description = { `Translation for ${ dropdownCategory . label } ` }
93
+ >
94
+ { dropdownCategory . label }
95
+ </ Translate >
96
+ </ Link > { " " }
97
+ < DropdownCaret />
78
98
</ span >
79
99
{ isOpen && (
80
100
< DropdownContent
@@ -91,51 +111,63 @@ function DocsCategoryDropdown({ dropdownCategory }) {
91
111
export const DocsCategoryDropdownLinkOnly = ( { title, link } ) => {
92
112
return (
93
113
< div className = { styles . docsNavDropdownContainer } >
94
- < Link href = { link } className = { styles . docsNavDropdownToolbarTopLevelLink } > < span > { title } </ span > </ Link >
114
+ < Link href = { link } className = { styles . docsNavDropdownToolbarTopLevelLink } >
115
+ < span > { title } </ span >
116
+ </ Link >
95
117
</ div >
96
118
) ;
97
- }
119
+ } ;
98
120
99
- const DropdownContent = ( { dropdownCategory, handleMouseLeave, dropdownStyles, dropdownMenuRef } ) => {
121
+ const DropdownContent = ( {
122
+ dropdownCategory,
123
+ handleMouseLeave,
124
+ dropdownStyles,
125
+ dropdownMenuRef,
126
+ } ) => {
100
127
const [ hovered , setHovered ] = useState ( null ) ;
101
128
102
129
return (
103
130
< div
104
131
ref = { dropdownMenuRef }
105
132
className = { styles . docsNavDropdownMenu }
106
- style = { { position : ' fixed' , ...dropdownStyles } }
133
+ style = { { position : " fixed" , ...dropdownStyles } }
107
134
>
108
- < div key = { 99 }
109
- className = { `${ styles . docsNavMenuItem } ${ hovered === 99 ? styles . docsNavHovered : '' } ` }
110
- onMouseEnter = { ( ) => setHovered ( 99 ) }
111
- onMouseLeave = { ( ) => setHovered ( null ) }
135
+ < div
136
+ key = { 99 }
137
+ className = { `${ styles . docsNavMenuItem } ${ hovered === 99 ? styles . docsNavHovered : "" } ` }
138
+ onMouseEnter = { ( ) => setHovered ( 99 ) }
139
+ onMouseLeave = { ( ) => setHovered ( null ) }
112
140
>
113
141
< Link
114
- to = { dropdownCategory . customProps . href }
142
+ to = { dropdownCategory . customProps . href }
115
143
className = { styles . docsNavMenuHeader }
116
- onClick = { handleMouseLeave }
144
+ onClick = { handleMouseLeave }
117
145
>
118
146
{ dropdownCategory . label }
119
147
</ Link >
120
- < div className = { styles . docsNavMenuDescription } > { dropdownCategory . description } </ div >
148
+ < div className = { styles . docsNavMenuDescription } >
149
+ { dropdownCategory . description }
150
+ </ div >
121
151
</ div >
122
152
< hr className = { styles . docsNavMenuDivider } />
123
153
< div className = { styles . docsNavMenuItems } >
124
154
{ dropdownCategory . items . map ( ( item , index ) => (
125
155
< div
126
156
key = { index }
127
- className = { `${ styles . docsNavMenuItem } ${ hovered === index ? styles . docsNavHovered : '' } ` }
157
+ className = { `${ styles . docsNavMenuItem } ${ hovered === index ? styles . docsNavHovered : "" } ` }
128
158
onMouseEnter = { ( ) => setHovered ( index ) }
129
159
onMouseLeave = { ( ) => setHovered ( null ) }
130
160
>
131
161
< Link
132
- to = { item . href }
162
+ to = { item . href }
133
163
className = { styles . docsNavItemTitle }
134
- onClick = { handleMouseLeave }
164
+ onClick = { handleMouseLeave }
135
165
>
136
166
{ item . label }
137
167
</ Link >
138
- < div className = { styles . docsNavItemDescription } > { item . description } </ div >
168
+ < div className = { styles . docsNavItemDescription } >
169
+ { item . description }
170
+ </ div >
139
171
</ div >
140
172
) ) }
141
173
</ div >
@@ -145,20 +177,20 @@ const DropdownContent = ({ dropdownCategory, handleMouseLeave, dropdownStyles, d
145
177
146
178
const DropdownCaret = ( ) => {
147
179
const commonStyle = {
148
- width : ' 6px' ,
149
- height : ' 10px' ,
150
- fill : ' none' ,
151
- transition : ' all 0.3s ease' ,
152
- color : ' #6B7280' ,
180
+ width : " 6px" ,
181
+ height : " 10px" ,
182
+ fill : " none" ,
183
+ transition : " all 0.3s ease" ,
184
+ color : " #6B7280" ,
153
185
} ;
154
186
155
187
const rotatedIconStyle = {
156
188
...commonStyle ,
157
- transform : ' rotate(90deg)' ,
189
+ transform : " rotate(90deg)" ,
158
190
} ;
159
191
160
192
return (
161
- < span style = { { marginLeft : ' 8px' } } >
193
+ < span style = { { marginLeft : " 8px" } } >
162
194
< svg
163
195
xmlns = "http://www.w3.org/2000/svg"
164
196
width = "6"
0 commit comments