erag / laravel-location-kit
Laravel data-only countries, states, cities, currencies, timezones, and dial codes for helpers and Blade.
Package info
github.com/eramitgupta/laravel-location-kit
Language:TypeScript
pkg:composer/erag/laravel-location-kit
Fund package maintenance!
Requires
- php: ^8.1
- illuminate/http: ^10.0|^11.0|^12.0|^13.0
- illuminate/support: ^10.0|^11.0|^12.0|^13.0
Requires (Dev)
- laravel/pint: ^1.13
README
erag/laravel-location-kit is a complete Laravel location data package for countries, states, cities, currencies, timezones, and dial codes with Laravel helpers, Blade directives, Inertia support, Vue composables, and React hooks.
Built for modern Laravel applications using Laravel + Inertia + Vue / React.
β¨ Features
- π 246 Countries
- πΊοΈ 4,120 States / Regions
- ποΈ 48,313 Cities
- π± 162 Currencies
- π 419 Timezones
- π Country Dial Codes
- π± Phone Mask Support
- π οΈ Laravel Facade Support
- π Global Helper Functions
- π¨ Blade Directives
- β‘ Inertia Shared Props
- π Vue Package Included
- βοΈ React Package Included
- π Search Support
- π Cache Support
- π§© Override Default JSON Data
π¦ Installation
Laravel Package
composer require erag/laravel-location-kit php artisan erag:install-location-kit
π Vue
npm install ./vendor/erag/laravel-location-kit/vue
βοΈ React
npm install ./vendor/erag/laravel-location-kit/react
π Data Coverage
Countries : 246 States : 4,120 Cities : 48,313 Currencies: 162 Timezones : 419
βοΈ Configuration
'data' => storage_path('app/location'), 'inertia' => [ 'enabled' => true, 'prop' => 'locationKit', 'share' => [ 'countries' => true, 'states' => true, 'cities' => false, 'currencies' => true, 'timezones' => false, 'dial_codes' => true, ], ],
π Why Cities Disabled by Default?
City dataset is large, so it is disabled by default for better performance.
'cities' => true
π οΈ Laravel Usage
Facade
use LaravelLocationKit\Facades\LocationKit; LocationKit::countries(); LocationKit::states('india'); LocationKit::cities('gujarat'); LocationKit::currencies(); LocationKit::timezones(); LocationKit::dialCodes(); LocationKit::search('india');
Laravel Facade
LocationKit::countries(); LocationKit::states(?string $countryKey = null); LocationKit::cities(?string $stateKey = null); LocationKit::currencies(); LocationKit::timezones(); LocationKit::dialCodes(); LocationKit::search(string $query, int $limit = 10); LocationKit::countryOptions(); LocationKit::stateOptions(string $countryKey); LocationKit::cityOptions(string $stateKey);
β‘ Inertia Support
page.props.locationKit
π§© Override Default Data
You can override bundled package data without editing vendor files.
Create your own files inside:
storage/app/location/
Supported files:
countries.json states.json cities.json currencies.json
When the same key exists, your custom record replaces the default package record.
π Override Country Example
[
{
"name": "Bharat",
"key": "india",
"countryCodes": ["91"],
"isoCode2": "IN",
"isoCode3": "IND"
}
]
πΊοΈ Override States Example
[
{
"country": "india",
"name": "Gujarat",
"key": "gujarat"
},
{
"country": "india",
"name": "Maharashtra",
"key": "maharashtra"
}
]
ποΈ Override Cities Example
[
{
"state": "gujarat",
"name": "Ahmedabad",
"key": "ahmedabad"
},
{
"state": "gujarat",
"name": "Surat",
"key": "surat"
}
]
π± Override Currency Example
[
{
"code": "INR",
"name": "Indian Rupee",
"symbol": "βΉ",
"decimal_digits": 2,
"countries": ["india"]
}
]
βοΈ Change Storage Path
'data' => storage_path('app/location'),
π§Ή Clear Cache After Update
php artisan location-kit:clear-cache
Vue / React Composable API
countries statesForCountry(countryKey) citiesForState(stateKey) findCountry(countryKey) callingCodeForCountry(countryKey) phoneMaxLength(countryKey) localPhoneDigits(countryKey, value) maskPhone(countryKey, value)
π Option Arrays
LocationKit::countryOptions(); LocationKit::stateOptions('india'); LocationKit::cityOptions('gujarat');
[
'label' => 'India',
'value' => 'india',
'key' => 'india',
]
π§ Helper Functions
location_countries(); location_states('india'); location_cities('gujarat'); location_currencies(); location_timezones(); location_dial_codes();
π¨ Blade Directives
@locationCountries @locationStates('india') @locationCities('gujarat')
π± Phone Mask Example
Vue
<script setup lang="ts"> import { computed, ref, watch } from 'vue' import { useLocationKit } from '@erag/laravel-location-kit/vue' const selectedCountry = ref('india') const phone = ref('9876543210') const locationKit = useLocationKit() const dialCode = computed(() => locationKit.callingCodeForCountry(selectedCountry.value) ) const maxLength = computed(() => locationKit.phoneMaxLength(selectedCountry.value) ) const maskedPhone = computed(() => locationKit.maskPhone(selectedCountry.value, phone.value) ) watch(phone, (value) => { const digits = locationKit.localPhoneDigits(selectedCountry.value, value) if (value !== digits) { phone.value = digits } }) </script> <template> <div class="space-y-3"> <input v-model="phone" inputmode="numeric" :maxlength="maxLength ?? undefined" class="h-10 w-full rounded border px-3" placeholder="Enter phone number" /> <div class="rounded border px-3 py-2"> <div>Dial Code: {{ dialCode }}</div> <div>Masked Phone: {{ maskedPhone }}</div> </div> </div> </template>
Output
Input : 9876543210 Output: +91 98765 43210
β‘ Short Laravel + Inertia Example
Route
use App\Http\Controllers\LocationKitExampleController; Route::get('/location-kit-example', [LocationKitExampleController::class, 'index']) ->name('location-kit.example');
Controller
<?php namespace App\Http\Controllers; use LaravelLocationKit\Facades\LocationKit; use Inertia\Inertia; use Inertia\Response; class LocationKitExampleController extends Controller { public function index(): Response { return Inertia::render('LocationKitExample', [ 'countries' => LocationKit::countryOptions(), 'states' => LocationKit::stateOptions('india'), 'cities' => LocationKit::cityOptions('gujarat'), ]); } }
Vue Page
<script setup lang="ts"> defineProps({ countries: Array, states: Array, cities: Array, }) </script> <template> <div class="space-y-4 p-6"> <h1 class="text-2xl font-bold">π Location Kit Example</h1> <select class="h-10 w-full rounded border px-3"> <option v-for="country in countries" :key="country.value" > {{ country.label }} </option> </select> <select class="h-10 w-full rounded border px-3"> <option v-for="state in states" :key="state.value" > {{ state.label }} </option> </select> <select class="h-10 w-full rounded border px-3"> <option v-for="city in cities" :key="city.value" > {{ city.label }} </option> </select> </div> </template>
π Vue Usage
import { useLocationKit } from '@erag/laravel-location-kit/vue' const { countries, statesForCountry, citiesForState, callingCodeForCountry, phoneMaxLength, localPhoneDigits, maskPhone, } = useLocationKit()
βοΈ React Usage
import { useLocationKit } from '@erag/laravel-location-kit/vue' export default function App() { const { countries, statesForCountry, citiesForState, maskPhone, } = useLocationKit() return null }
π Requirements
- PHP 8.2+
- Laravel 10 / 11 / 12 / 13
- Inertia.js Optional
- Vue / React Optional
β Support
If you like this package, give it a GitHub star.