$items */ public static function lookup( array $items, string $slug ): string { if ( $slug === '' ) { return ''; } return FieldConfig::labels( $items )[ $slug ] ?? $slug; } /** Subtitle parts [role label, sub label]; extensions may append their own before join(). @param array $fields @return string[] */ public static function parts( array $fields, string $role, string $sub ): array { return [ self::lookup( $fields['roles'] ?? [], $role ), self::lookup( $fields['sub']['options'] ?? [], $sub ), ]; } /** "A · B · C" with empty parts skipped. @param string[] $parts */ public static function join( array $parts ): string { return implode( ' · ', array_filter( $parts, static function ( $s ) { return $s !== ''; } ) ); } /** Card subtitle "Role · Sub". @param array $fields Normalized FieldConfig. */ public static function card( array $fields, string $role, string $sub ): string { return self::join( self::parts( $fields, $role, $sub ) ); } }