@@ -246,12 +246,79 @@ const setupMultiCarousels = () => {
246246 carousels . forEach ( setupMultiScroller )
247247}
248248
249+ const setupHardwareSignerFilters = ( ) => {
250+ const filterRoots = document . querySelectorAll ( '[data-hardware-signer-filter]' )
251+
252+ filterRoots . forEach ( ( root ) => {
253+ if ( root . dataset . filterBound === 'true' ) {
254+ return
255+ }
256+
257+ const buttons = Array . from ( root . querySelectorAll ( '[data-connection-type]' ) )
258+ const cards = Array . from ( root . querySelectorAll ( '[data-hardware-signer-card]' ) )
259+ const emptyState = root . querySelector ( '[data-hardware-signer-empty]' )
260+
261+ if ( ! buttons . length || ! cards . length || ! emptyState ) {
262+ return
263+ }
264+
265+ root . dataset . filterBound = 'true'
266+
267+ const setButtonState = ( button , isActive ) => {
268+ button . setAttribute ( 'aria-pressed' , isActive ? 'true' : 'false' )
269+ button . classList . toggle ( 'is-active' , isActive )
270+ button . classList . toggle ( 'is-inactive' , ! isActive )
271+ }
272+
273+ const getActiveTypes = ( ) => new Set (
274+ buttons
275+ . filter ( button => button . getAttribute ( 'aria-pressed' ) === 'true' )
276+ . map ( button => button . dataset . connectionType )
277+ . filter ( Boolean )
278+ )
279+
280+ const updateCards = ( ) => {
281+ const activeTypes = getActiveTypes ( )
282+ let visibleCount = 0
283+
284+ cards . forEach ( ( card ) => {
285+ const supportedTypes = ( card . dataset . connectionTypes || '' )
286+ . split ( ',' )
287+ . map ( type => type . trim ( ) )
288+ . filter ( Boolean )
289+
290+ const isVisible = activeTypes . size > 0 && supportedTypes . some ( type => activeTypes . has ( type ) )
291+ card . hidden = ! isVisible
292+
293+ if ( isVisible ) {
294+ visibleCount += 1
295+ }
296+ } )
297+
298+ emptyState . hidden = visibleCount > 0
299+ }
300+
301+ buttons . forEach ( ( button ) => {
302+ setButtonState ( button , true )
303+ button . addEventListener ( 'click' , ( ) => {
304+ const isActive = button . getAttribute ( 'aria-pressed' ) === 'true'
305+ setButtonState ( button , ! isActive )
306+ updateCards ( )
307+ } )
308+ } )
309+
310+ updateCards ( )
311+ } )
312+ }
313+
249314if ( document . readyState === 'loading' ) {
250315 document . addEventListener ( 'DOMContentLoaded' , ( ) => {
251316 setupMultiCarousels ( )
252317 setupCodeCopyButtons ( )
318+ setupHardwareSignerFilters ( )
253319 } )
254320} else {
255321 setupMultiCarousels ( )
256322 setupCodeCopyButtons ( )
323+ setupHardwareSignerFilters ( )
257324}
0 commit comments