(string) $m->term_id, 'label' => sprintf( '%s (#%d, %d)', $m->name, $m->term_id, $m->count ), ); } wp_localize_script( $handle, 'aieoMenuConfig', array( 'menus' => $menus ) ); } if ( ! wp_style_is( 'aieo-menu', 'registered' ) ) { wp_register_style( 'aieo-menu', false, array(), null ); wp_add_inline_style( 'aieo-menu', ':where(.aieo-menu__catalog){display:inline-flex;align-items:center;gap:.4em;min-height:24px;margin:0;padding:0;border:0;background:none;color:inherit;font:inherit;letter-spacing:inherit;text-transform:inherit;cursor:pointer}' ); if ( 'rooster' === get_template() ) { $chevron = 'url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27 fill=%27none%27 stroke=%27black%27 stroke-width=%272%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27%3E%3Cpath d=%27m6 9 6 6 6-6%27/%3E%3C/svg%3E") center/contain no-repeat'; wp_add_inline_style( 'aieo-menu', ':where(.aieo-menu--accordion .aieo-menu__section){border-block-end:1px solid color-mix(in srgb,currentColor 22%,transparent)}' . ':where(.aieo-menu--accordion .aieo-menu__section>summary){display:flex;align-items:center;justify-content:space-between;gap:var(--wp--preset--spacing--4,1rem);box-sizing:border-box;min-height:3rem;padding-block:var(--wp--preset--spacing--3,.75rem);list-style:none;cursor:pointer;text-align:start}' . ':where(.aieo-menu--accordion .aieo-menu__section>summary)::-webkit-details-marker{display:none}' . ':where(.aieo-menu--accordion .aieo-menu__section>summary)::marker{content:""}' . ':where(.aieo-menu--accordion .aieo-menu__section>summary)::after{content:"";flex:none;width:1.25rem;height:1.25rem;background-color:currentColor;opacity:.75;-webkit-mask:' . $chevron . ';mask:' . $chevron . ';transition:rotate var(--wp--custom--rooster--motion--base,200ms) ease}' . ':where(.aieo-menu--accordion .aieo-menu__section[open]>summary)::after{rotate:180deg;opacity:1}' . ':where(.aieo-menu--accordion .aieo-menu__section>summary:focus-visible){outline:2px solid transparent;outline-offset:2px;box-shadow:var(--wp--custom--rooster--focus-ring,0 0 0 3px color-mix(in srgb,currentColor 35%,transparent))}' . '@media (prefers-reduced-motion:reduce){:where(.aieo-menu--accordion .aieo-menu__section>summary)::after{transition:none}}' . '@media (forced-colors:active){:where(.aieo-menu--accordion .aieo-menu__section>summary)::after{forced-color-adjust:none;background-color:CanvasText}}' ); } } register_block_type( self::BLOCK_NAME, array( 'api_version' => 3, 'title' => __( 'Rooster One Menu', 'ai-eshop-optimizer' ), 'category' => 'theme', 'icon' => 'menu', 'description' => __( 'Render a WordPress menu — inline strip (header) or accordion (footer).', 'ai-eshop-optimizer' ), 'keywords' => array( 'menu', 'nav', 'navigation', 'header', 'footer', 'aieo' ), 'attributes' => array( 'menuId' => array( 'type' => 'number', 'default' => 0 ), 'mode' => array( 'type' => 'string', 'default' => 'inline' ), 'showCatalogTrigger' => array( 'type' => 'boolean', 'default' => true ), ), 'supports' => array( 'align' => array( 'wide', 'full' ), 'spacing' => array( 'margin' => true, 'padding' => true ), ), 'editor_script' => $handle, 'style' => 'aieo-menu', 'render_callback' => array( $this, 'render_block' ), ) ); } public function render_block( $attrs = array() ) { $menu_id = isset( $attrs['menuId'] ) ? (int) $attrs['menuId'] : 0; $mode = isset( $attrs['mode'] ) ? sanitize_key( (string) $attrs['mode'] ) : 'inline'; $show_trigger = isset( $attrs['showCatalogTrigger'] ) ? (bool) $attrs['showCatalogTrigger'] : true; if ( ! $menu_id || ! wp_get_nav_menu_object( $menu_id ) ) { return is_admin() ? '
' . esc_html__( 'No menu selected — pick one in the block sidebar.', 'ai-eshop-optimizer' ) . '
' : ''; } return ( 'accordion' === $mode ) ? $this->render_accordion( $menu_id ) : $this->render_inline( $menu_id, $show_trigger ); } private function render_inline( $menu_id, $show_trigger ) { $menu_html = wp_nav_menu( array( 'menu' => $menu_id, 'container' => false, 'items_wrap' => '', 'depth' => 1, 'echo' => false, 'fallback_cb' => false, ) ); if ( ! $menu_html ) { return ''; } $trigger = ''; if ( $show_trigger ) { $trigger = ''; } return ''; } private function render_accordion( $menu_id ) { $items = wp_get_nav_menu_items( $menu_id ); if ( ! $items ) { return ''; } $by_parent = array(); foreach ( $items as $it ) { $by_parent[ (int) $it->menu_item_parent ][] = $it; } $top = isset( $by_parent[0] ) ? $by_parent[0] : array(); if ( ! $top ) { return ''; } $out = ''; return $out; } } new AIEO_Menu_Block();