outhebox/blade-flags
1,759 SVG country and language flags for Laravel Blade plus Vue, React, and vanilla JS. Includes default, circle, and flat variants, 128 language mappings, and locale/regional support (e.g., en-US, fr-CA). Great for switchers and forms.
## Getting Started
### Minimal Steps
1. **Installation**:
```bash
composer require outhebox/blade-flags
For frontend frameworks:
npm install @blade-flags/core @blade-flags/vue # Vue
npm install @blade-flags/core @blade-flags/react # React
First Use Case: Insert a country flag in a Blade view:
<x-flag-country-us />
Or a language flag:
<x-flag-language-en />
Where to Look First:
Static Flags: Use predefined components for known flags:
<x-flag-circle-country-gb class="w-8 h-8" />
<x-flag-flat-language-es />
Dynamic Flags:
Use @svg directive for runtime-generated flag names:
@svg('flag-country-'.$user->country_code)
@svg('flag-circle-language-'.$user->language_code, ['class' => 'text-blue-500'])
Helper Method:
// In a controller or service
public function getFlagSvg($countryCode) {
return svg("flag-country-{$countryCode}")->toHtml();
}
Dynamic Rendering:
<script setup>
import { Flag } from '@blade-flags/vue'
import { circleFlags } from '@blade-flags/core/flags/circle'
</script>
<template>
<Flag :code="user.country" :flags="circleFlags" />
</template>
Tree-Shaking: Import only needed flags for static use:
import { countryUs, languageAr } from '@blade-flags/core/flags/circle'
Inertia.js: Pass flag data from Laravel to Vue/React via page props:
return Inertia::render('Profile', [
'user' => $user,
'flags' => ['country' => $user->country_code, 'language' => $user->language_code]
]);
Locale Switcher:
<div class="flex gap-2">
@foreach($availableLanguages as $lang)
<x-flag-circle-language-{{ $lang->code }} class="cursor-pointer"
wire:click="changeLanguage('{{ $lang->code }}')"/>
@endforeach
</div>
User Profile:
<div class="flex items-center gap-3">
<x-flag-country-{{ $user->country }} class="w-10 h-8" />
<span>{{ $user->name }}</span>
</div>
Admin Dashboard:
<table>
@foreach($users as $user)
<tr>
<td><x-flag-country-{{ $user->country }} /></td>
<td>{{ $user->name }}</td>
</tr>
@endforeach
</table>
CSS Sizing:
w-6 h-6 if hardcoded width/height exists in SVG.width="100%" height="100%" in SVG or wrap in a container with explicit dimensions.<div class="w-6 h-6">
<x-flag-country-us />
</div>
Missing Flags:
en-us instead of en) or fall back to a generic flag.Caching:
php artisan view:clear
php artisan cache:clear
Dynamic Flag Names:
$country->iso2_code or $language->code matches the package’s naming convention (e.g., us, en, ar-sa).resources/svg/ or use php artisan tinker to inspect:
\Outhebox\BladeFlags\Facades\BladeFlags::availableFlags();
Inspect SVG Output:
{{ \Outhebox\BladeFlags\Facades\BladeFlags::svg('flag-country-us')->toHtml() }}
Look for malformed tags or missing attributes.
Check Published Assets: If using raw SVGs, verify they exist in:
public/vendor/blade-flags/country-us.svg
Frontend Debugging:
console.log(resolveFlag(circleFlags, 'us')); // Check if SVG is valid
Language Overrides:
php artisan vendor:publish --tag=blade-flags-config
php artisan blade-flags:generate
Blade Icons Compatibility:
BladeIcon::resolve(), ensure the package is installed:
composer require blade-ui-kit/blade-icons
Inertia.js:
circleFlags) used in Blade for consistency.Custom Flags:
public/vendor/blade-flags/ and reference them via @svg('custom-flag').Flag Variants:
square-flags) by copying the build script and SVG templates.Dynamic Generation:
resolveFlag() helper to build flags programmatically:
$svg = \Outhebox\BladeFlags\Facades\BladeFlags::resolve('circle', 'country', 'us');
Tree-Shaking:
import { countryUs, countryGb } from '@blade-flags/core/flags/circle';
Lazy Loading:
const loadFlag = async (code) => {
const { resolveFlag, circleFlags } = await import('@blade-flags/core');
return resolveFlag(circleFlags, code);
};
Blade Caching:
// config/blade-flags.php
'cache' => env('APP_ENV') !== 'local',
Combine with Blade Icons:
size and color:
<x-flag-country-us size="2x" color="#0000FF" />
Dark Mode:
<x-flag-country-us class="dark:invert" />
Accessibility:
aria-label for screen readers:
<x-flag-country-us aria-label="United States" />
Regional Variants:
- for regional flags (e.g., ar-sa for Arabic-Saudi Arabia):
<x-flag-circle-language-ar-sa />
Testing:
// Test invalid flag codes
$this->blade->render('@svg("flag-country-xx")')->assertSee('Invalid flag code');
---
How can I help you explore Laravel packages today?