*/ public static function all(): array { return Cache::remember(self::CACHE_KEY, now()->addDay(), function () { try { $response = Http::timeout(8)->get(self::REMIX_TAGS_URL); if (! $response->successful()) { return self::fallback(); } $json = $response->json(); if (! is_array($json)) { return self::fallback(); } $icons = []; foreach ($json as $group) { if (! is_array($group)) { continue; } foreach ($group as $iconName => $unusedTags) { if (! is_string($iconName)) { continue; } $normalized = self::normalizeIconName($iconName); $icons[$normalized] = $normalized; } } ksort($icons); return ! empty($icons) ? $icons : self::fallback(); } catch (\Throwable $e) { \Log::warning('NavbarManager: Failed to load Remix icon catalog', [ 'error' => $e->getMessage(), ]); return self::fallback(); } }); } public static function clearCache(): void { Cache::forget(self::CACHE_KEY); } protected static function fallback(): array { $icons = [ 'ri-home-line', 'ri-user-line', 'ri-settings-3-line', 'ri-dashboard-line', 'ri-menu-line', 'ri-link', 'ri-folder-line', 'ri-shopping-bag-3-line', 'ri-megaphone-line', 'ri-book-open-line', 'ri-file-text-line', 'ri-customer-service-2-line', 'ri-questionnaire-line', 'ri-information-line', 'ri-lock-line', 'ri-server-line', ]; return array_combine($icons, $icons); } protected static function normalizeIconName(string $icon): string { $icon = Str::lower(trim($icon)); if (! Str::startsWith($icon, 'ri-')) { $icon = 'ri-' . ltrim($icon, '-'); } return $icon; } }