π― Zero-config Nuxt module for international phone masking. Powered by @desource/phone-mask with Google libphonenumber sync.
npm install @desource/phone-mask-nuxt> Nuxt module for phone input with Google's libphonenumber data


Drop-in Nuxt module with auto-imports, SSR support, and zero configuration.
- π― Zero Config β Works out of the box
- π Auto-imports β Components and composables
- π SSR Compatible β Server-side rendering ready
- π¨ Styleable β Bring your own styles or use defaults
- π§ TypeScript β Fully typed
- β‘ Optimized β Tree-shaking and code splitting
``bash`
npm install @desource/phone-mask-nuxtor
yarn add @desource/phone-mask-nuxtor
pnpm add @desource/phone-mask-nuxt
Add the module to your nuxt.config.ts:
`ts`
export default defineNuxtConfig({
modules: ['@desource/phone-mask-nuxt']
});
That's it! The component and directive are now auto-imported.
` Phone: {{ phone }}vue
`
`vue
`
` v-phone-mask="{vue
country: selectedCountry,
onChange: handleChange
}"
class="phone-input"
/>
`
Configure the module in nuxt.config.ts:
`ts
export default defineNuxtConfig({
modules: ['@desource/phone-mask-nuxt'],
phoneMask: {
// Import styles automatically
css: true, // Default: true
// Register PhoneInput component
component: true, // Default: true
// Register v-phone-mask directive
directive: true, // Default: true
// Register shared helpers and types
helpers: true // Default: true
}
});
`
#### Option 1: Disable auto CSS import
`ts
export default defineNuxtConfig({
modules: ['@desource/phone-mask-nuxt'],
phoneMask: {
css: false // Don't auto-import styles
}
});
`
Then import manually where needed:
`vue`
#### Option 2: Override CSS variables
`vue`
The module provides automatic TypeScript support. Types are available globally:
`ts`
// Auto-imported types
import type {
PCountryKey,
PMaskBase,
PMaskBaseMap,
PMask,
PMaskMap,
PMaskWithFlag,
PMaskWithFlagMap,
PMaskFull,
PMaskFullMap,
PMaskPhoneNumber
} from '#phone-mask';
`vue
`
`ts
// stores/user.ts
import { defineStore } from 'pinia';
export const useUserStore = defineStore('user', {
state: () => ({
phoneDigits: '',
country: 'US'
}),
actions: {
setPhoneDigits(phone: string) {
this.phone = phone;
},
setCountry(id: string) {
this.country = id;
}
}
});
`
`vue
:country="userStore.country"
@update:model-value="userStore.setPhoneDigits"
@country-change="userStore.setCountry($event.id)"
/>
`
` We'll send a code to: {{ formData.phone }}vue
Step 1: Contact Info
Step 2: Verification
`
`vue
`
The following are automatically imported (until disabled in nuxt.config.ts):
- PhoneInput β Main phone input component
- vPhoneMask β Phone mask directive
- vPhoneMaskSetCountry β Programmatically set country for directivePMaskHelpers
- β Utility functions for phone masks like:getFlagEmoji
- countPlaceholders
- formatDigitsWithMap
- pickMaskVariant
- removeCountryCodePrefix
-
- And more...
Read more about helpers in the Utility Functions of @desource/phone-mask README.
All TypeScript types from @desource/phone-mask-vue
If you're migrating from the Vue plugin:
Before:
`ts
// main.ts
import PhoneMaskPlugin from '@desource/phone-mask-vue';
import '@desource/phone-mask-vue/style.css';
app.use(PhoneMaskPlugin);
`
After:
`ts`
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@desource/phone-mask-nuxt']
});
No changes needed in your components!
- PhoneInput component (auto-imported)vPhoneMask` directive (auto-imported)
-
- Default styles (auto-imported, can be disabled)
- TypeScript definitions (auto-imported)
- Utility functions (auto-imported)
- @desource/phone-mask β Core library
- @desource/phone-mask-vue β Vue 3 component
MIT Β© 2025 DeSource Labs
---