@@ -11,17 +11,71 @@ function copyCodeToClipboard(panelId) {
11
11
setTimeout ( ( ) => tooltip . style . display = 'none' , 1000 ) ;
12
12
}
13
13
14
+ function copyCodeToClipboardForCodetabs ( button ) {
15
+ const codetabsId = button . getAttribute ( 'data-codetabs-id' ) ;
16
+ const codetabsContainer = document . getElementById ( codetabsId ) ;
17
+
18
+ if ( ! codetabsContainer ) return ;
19
+
20
+ // Find the visible panel
21
+ const visiblePanel = codetabsContainer . querySelector ( '.panel:not(.panel-hidden)' ) ;
22
+ if ( ! visiblePanel ) return ;
23
+
24
+ // Get the code from the visible panel
25
+ const code = [ ...visiblePanel . querySelectorAll ( 'code' ) ] . pop ( ) . textContent ;
26
+ navigator . clipboard . writeText ( code ) ;
27
+
28
+ // Toggle tooltip
29
+ const tooltip = button . querySelector ( '.tooltiptext' ) ;
30
+ if ( tooltip ) {
31
+ tooltip . style . display = 'block' ;
32
+ setTimeout ( ( ) => tooltip . style . display = 'none' , 1000 ) ;
33
+ }
34
+ }
35
+
14
36
function toggleVisibleLines ( evt ) {
15
37
document . getElementById ( evt . getAttribute ( 'aria-controls' ) )
16
38
. toggleAttribute ( 'aria-expanded' ) ;
17
39
}
18
40
19
- function switchCodeTab ( selectedTabInput , tabLang ) {
20
- // Synchronize tab selection to relevant page tabs
21
- const trg = document . querySelectorAll ( `.codetabs > input[data-lang=${ tabLang } ]` ) ;
22
- trg . forEach ( ( element ) => {
23
- if ( element === selectedTabInput ) return ;
24
- element . checked = true ;
41
+ function toggleVisibleLinesForCodetabs ( button ) {
42
+ const codetabsId = button . getAttribute ( 'data-codetabs-id' ) ;
43
+ const codetabsContainer = document . getElementById ( codetabsId ) ;
44
+
45
+ if ( ! codetabsContainer ) return ;
46
+
47
+ // Find the visible panel
48
+ const visiblePanel = codetabsContainer . querySelector ( '.panel:not(.panel-hidden)' ) ;
49
+ if ( ! visiblePanel ) return ;
50
+
51
+ // Toggle aria-expanded attribute
52
+ visiblePanel . toggleAttribute ( 'aria-expanded' ) ;
53
+
54
+ // Toggle visibility icons
55
+ const iconOn = button . querySelector ( '.visibility-icon-on' ) ;
56
+ const iconOff = button . querySelector ( '.visibility-icon-off' ) ;
57
+
58
+ if ( iconOn && iconOff ) {
59
+ iconOn . classList . toggle ( 'panel-hidden' ) ;
60
+ iconOff . classList . toggle ( 'panel-hidden' ) ;
61
+ }
62
+ }
63
+
64
+ function switchCodeTab ( selectedDropdown , tabLang ) {
65
+ // Synchronize dropdown selection to all code tab dropdowns on the page
66
+ const allDropdowns = document . querySelectorAll ( '.codetabs .lang-selector' ) ;
67
+ allDropdowns . forEach ( ( dropdown ) => {
68
+ if ( dropdown === selectedDropdown ) return ;
69
+
70
+ // Find the option with matching data-lang and select it
71
+ const options = dropdown . querySelectorAll ( 'option' ) ;
72
+ options . forEach ( ( option ) => {
73
+ if ( option . value === tabLang ) {
74
+ dropdown . value = tabLang ;
75
+ // Trigger panel visibility update for this dropdown's codetabs
76
+ updatePanelVisibility ( dropdown ) ;
77
+ }
78
+ } ) ;
25
79
} ) ;
26
80
27
81
// Persist tab selection
@@ -30,35 +84,70 @@ function switchCodeTab(selectedTabInput, tabLang) {
30
84
}
31
85
}
32
86
87
+ function updatePanelVisibility ( dropdown ) {
88
+ const selectedLang = dropdown . value ;
89
+ const codetabsId = dropdown . getAttribute ( 'data-codetabs-id' ) ;
90
+ const codetabsContainer = document . getElementById ( codetabsId ) ;
91
+
92
+ if ( ! codetabsContainer ) return ;
93
+
94
+ // Hide all panels in this codetabs container
95
+ const panels = codetabsContainer . querySelectorAll ( '.panel' ) ;
96
+ panels . forEach ( ( panel ) => {
97
+ panel . classList . add ( 'panel-hidden' ) ;
98
+ } ) ;
99
+
100
+ // Show the selected panel
101
+ const selectedPanel = Array . from ( panels ) . find ( panel =>
102
+ panel . getAttribute ( 'data-lang' ) === selectedLang
103
+ ) ;
104
+
105
+ if ( selectedPanel ) {
106
+ selectedPanel . classList . remove ( 'panel-hidden' ) ;
107
+ }
108
+ }
109
+
33
110
function onchangeCodeTab ( e ) {
34
- const selectedTabInput = e . target ;
35
- const tabLang = e . target . dataset . lang ;
111
+ const selectedDropdown = e . target ;
112
+ const tabLang = e . target . value ;
36
113
const yPos = e . target . getBoundingClientRect ( ) . top ;
37
114
38
- switchCodeTab ( selectedTabInput , tabLang ) ;
115
+ // Update visibility for this dropdown's panels
116
+ updatePanelVisibility ( selectedDropdown ) ;
117
+
118
+ // Synchronize with other dropdowns
119
+ switchCodeTab ( selectedDropdown , tabLang ) ;
39
120
40
121
// Scroll to the source element if it jumped
41
122
const yDiff = e . target . getBoundingClientRect ( ) . top - yPos ;
42
123
window . scrollTo ( window . scrollX , window . scrollY + yDiff ) ;
43
124
}
44
125
45
- document . addEventListener ( 'DOMContentLoaded' , ( ) => {
46
- // Register tab switch listeners
47
- for ( const tvr of document . querySelectorAll ( '.codetabs > input[type="radio"]' ) ) {
48
- tvr . addEventListener ( "change" , ( e ) => onchangeCodeTab ( e ) ) ;
49
- }
126
+ // Initialize codetabs - script is deferred so DOM is already ready
127
+ ( function initCodetabs ( ) {
128
+ // Register dropdown change listeners
129
+ const dropdowns = document . querySelectorAll ( '.codetabs .lang-selector' ) ;
130
+ dropdowns . forEach ( ( dropdown ) => {
131
+ dropdown . addEventListener ( "change" , ( e ) => onchangeCodeTab ( e ) ) ;
132
+ } ) ;
50
133
51
- // Restore selection
134
+ // Restore selection from localStorage
52
135
if ( window . localStorage ) {
53
136
const selectedTab = window . localStorage . getItem ( "selectedCodeTab" ) ;
54
137
if ( selectedTab ) {
55
- switchCodeTab ( null , selectedTab ) ;
138
+ dropdowns . forEach ( ( dropdown ) => {
139
+ const options = dropdown . querySelectorAll ( 'option' ) ;
140
+ const matchingOption = Array . from ( options ) . find ( opt => opt . value === selectedTab ) ;
141
+ if ( matchingOption ) {
142
+ dropdown . value = selectedTab ;
143
+ updatePanelVisibility ( dropdown ) ;
144
+ }
145
+ } ) ;
56
146
}
57
147
}
58
148
59
149
// Work around Chroma's tabindex: https://github.com/alecthomas/chroma/issues/731
60
150
for ( const pre of document . querySelectorAll ( '.highlight pre' ) ) {
61
151
pre . removeAttribute ( 'tabindex' ) ;
62
152
}
63
-
64
- } ) ;
153
+ } ) ( ) ;
0 commit comments