> */ public static function get_builtin_sections(): array { return [ [ // Always last — add-ons sit between the shared Settings card (50) and Licenses (9000). 'id' => 'albert/licenses', 'title' => __( 'Licenses', 'albert-ai-butler' ), 'priority' => 9000, 'icon' => 'admin-network', 'fields' => [ [ 'id' => 'licenses_table', 'type' => 'custom', 'label' => '', 'render_callback' => [ self::class, 'render_licenses_block' ], 'sanitize_callback' => '__return_null', ], ], ], ]; } /** * Render the licenses block (table or empty state). * * Delegates to {@see Settings} for the table/empty-state markup so the * AJAX refresh handler keeps a single source of truth. * * @since 1.1.0 * * @param array $field Field definition (unused). * @param mixed $current_value Current value (unused). * * @return void */ public static function render_licenses_block( array $field, $current_value ): void { unset( $field, $current_value ); $has_addons = class_exists( '\Albert\Abstracts\AbstractAddon' ) && ! empty( \Albert\Abstracts\AbstractAddon::get_registered_addons() ); if ( $has_addons ) { ?>