npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

accessibility-menu

v1.2.1

Published

Componente de accesibilidad WCAG 2.1 AA para Vue 3, Nuxt 4 y Laravel

Downloads

29

Readme

accessibility-menu

🌐 Componente de accesibilidad universal para Vue 3, Nuxt 4 y Laravel + Vite

✨ Características

  • 📏 Control de tamaño de fuente (80% - 200%)
  • 🔤 Fuente OpenDyslexic para dislexia
  • ☀️ Alto contraste
  • 🔗 Resaltado de enlaces
  • 🔊 Lector de pantalla (TTS)
  • 🖱️ Lectura al pasar mouse
  • ✍️ Lectura de texto seleccionado
  • 🌍 Soporte multiidioma (i18n) - Español e Inglés
  • 🎨 Personalización de colores
  • 🌓 Control de tema (claro/oscuro/auto)
  • 💾 Persistencia en localStorage
  • ⚡ Compatible con Vue 3, Nuxt 4 y Laravel
  • ♿ Cumple con WCAG 2.1 AA

📦 Instalación

npm install accessibility-menu

1️⃣ Vue 3 + Vite

// main.ts
import { createApp } from 'vue'
import App from './App.vue'
import AccessibilityMenuPlugin from 'accessibility-menu'
import 'accessibility-menu/dist/accessibility-menu.css'

const app = createApp(App)
app.use(AccessibilityMenuPlugin)
app.mount('#app')
// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'


export default defineConfig({
  plugins: [
    vue(),
  ]
})

<!-- App.vue -->
<template>
  
    <h1>Mi Aplicación</h1>
    <AccessibilityMenu />
  
</template>

2️⃣ Nuxt 4


// plugins/accessibility.client.ts
import AccessibilityMenuPlugin from 'accessibility-menu'
import 'accessibility-menu/dist/accessibility-menu.css'

export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.vueApp.use(AccessibilityMenuPlugin)
})
<!-- app.vue -->
<template>
    <NuxtPage />
     <ClientOnly>
                <component :is="'AccessibilityMenu'" theme="light" />
    </ClientOnly>
</template>

3️⃣ Laravel + Vite

// resources/js/app.ts
import { createApp, h } from 'vue'
import { createInertiaApp } from '@inertiajs/vue3'
import AccessibilityMenuPlugin from 'accessibility-menu'
import 'accessibility-menu/dist/accessibility-menu.css'

createInertiaApp({
  resolve: name => {
    const pages = import.meta.glob('./Pages/**/*.vue', { eager: true })
    return pages[`./Pages/${name}.vue`]
  },
  setup({ el, App, props, plugin }) {
    createApp({ render: () => h(App, props) })
      .use(plugin)
      .use(AccessibilityMenuPlugin)
      .mount(el)
  },
})
// vite.config.ts
import { defineConfig } from 'vite'
import laravel from 'laravel-vite-plugin'
import vue from '@vitejs/plugin-vue'


export default defineConfig({
  plugins: [
    laravel({
      input: ['resources/css/app.css', 'resources/js/app.ts'],
      refresh: true,
    }),
    vue(),

  ],
})
<!-- resources/js/Layouts/AppLayout.vue -->
<template>
  <UApp>
    <nav>...</nav>
    <slot />
    <AccessibilityMenu />
  </UApp>
</template>

4️⃣ Importación Individual

<script setup>
import { AccessibilityMenu } from 'accessibility-menu'
import 'accessibility-menu/dist/accessibility-menu.css'
</script>

<template>
  <UApp>
    <AccessibilityMenu />
  </UApp>
</template>

5️⃣ Usar el Composable

<script setup>
import { useAccessibility } from 'accessibility-menu'
const { fontSize, isDyslexicFont, config } = useAccessibility()
console.log('Configuración:', config.value)
</script>

🎨 Control de Tema (Claro/Oscuro)

El componente soporta tres modos de tema:

  • auto (por defecto): Detecta automáticamente las preferencias del sistema del usuario
  • light: Forzar tema claro
  • dark: Forzar tema oscuro

Ejemplo de Uso

<template>
  <!-- Tema automático (por defecto) -->
  <AccessibilityMenu />

  <!-- Forzar tema claro -->
  <AccessibilityMenu theme="light" />

  <!-- Forzar tema oscuro -->
  <AccessibilityMenu theme="dark" />
</template>

Con TypeScript

import { AccessibilityMenu, type ThemeMode } from 'accessibility-menu'

const theme: ThemeMode = 'dark'

🎨 Personalización de Colores

Puedes personalizar los colores del componente pasando una configuración de colores:

Opción 1: Mediante Props en el Componente

<script setup>
import { AccessibilityMenu } from 'accessibility-menu'
import 'accessibility-menu/dist/accessibility-menu.css'

const customColors = {
  primaryColor: '#7c3aed',        // Color principal (botón flotante, toggles)
  primaryHoverColor: '#6d28d9',   // Color hover del botón principal
  linkHighlightBg: '#fde68a',     // Fondo del resaltado de enlaces
  linkHighlightBorder: '#f59e0b', // Borde del resaltado de enlaces
  readingHighlightBg: '#ddd6fe',  // Fondo cuando se lee texto
  readingHighlightBorder: '#8b5cf6' // Borde cuando se lee texto
}
</script>

<template>
  <AccessibilityMenu :colors="customColors" />
</template>

Opción 2: Mediante el Composable

<script setup>
import { useAccessibility } from 'accessibility-menu'
import 'accessibility-menu/dist/accessibility-menu.css'

// Configurar colores al inicializar
useAccessibility({
  primaryColor: '#0056b3',
  primaryHoverColor: '#0252A6',
  linkHighlightBg: '#fde68a',
  linkHighlightBorder: '#f59e0b',
  readingHighlightBg: '#ddd6fe',
  readingHighlightBorder: '#8b5cf6'
})
</script>

Colores Configurables

| Propiedad | Descripción | Valor por defecto | |-----------|-------------|-------------------| | primaryColor | Color principal del botón flotante y elementos activos | #2563eb (blue-600) | | primaryHoverColor | Color hover del botón principal | #1d4ed8 (blue-700) | | linkHighlightBg | Fondo del resaltado de enlaces | #fef08a (yellow-200) | | linkHighlightBorder | Borde del resaltado de enlaces | #eab308 (yellow-500) | | readingHighlightBg | Fondo cuando se lee texto (TTS) | #bfdbfe (blue-200) | | readingHighlightBorder | Borde cuando se lee texto (TTS) | #3b82f6 (blue-500) |

Nota: Todos los colores son opcionales. Si no se especifica un color, se usará el valor por defecto.

🌍 Internacionalización (i18n)

El componente incluye soporte multiidioma con Español e Inglés por defecto. El usuario puede cambiar el idioma directamente desde el menú de accesibilidad.

Idiomas Disponibles

  • 🇪🇸 Español (es) - Idioma por defecto
  • 🇺🇸 Inglés (en)

Configurar el Idioma Inicial

Opción 1: Mediante Props en el Componente

<template>
  <AccessibilityMenu locale="en" />
</template>

Opción 2: Mediante el Composable

<script setup>
import { useAccessibility } from 'accessibility-menu'

useAccessibility({
  locale: 'en'
})
</script>

Integración con Vue I18n

Si tu proyecto ya usa vue-i18n, el componente lo detectará automáticamente y buscará las traducciones en la ruta accessibility.*. Si no las encuentra, usará sus traducciones internas.

Ejemplo con Vue I18n existente:

// i18n.js
import { createI18n } from 'vue-i18n'

const i18n = createI18n({
  locale: 'es',
  messages: {
    es: {
      accessibility: {
        title: 'Accesibilidad Personalizada',
        subtitle: 'Personaliza tu experiencia',
        // ... más traducciones
      }
    },
    en: {
      accessibility: {
        title: 'Custom Accessibility',
        subtitle: 'Customize your experience',
        // ... más traducciones
      }
    }
  }
})

export default i18n
// main.js
import { createApp } from 'vue'
import App from './App.vue'
import i18n from './i18n'
import AccessibilityMenuPlugin from 'accessibility-menu'
import 'accessibility-menu/dist/accessibility-menu.css'

createApp(App)
  .use(i18n)
  .use(AccessibilityMenuPlugin)
  .mount('#app')

Personalizar Traducciones

Puedes sobrescribir traducciones específicas sin necesidad de vue-i18n:

<script setup>
import { AccessibilityMenu } from 'accessibility-menu'

const customMessages = {
  es: {
    title: 'Herramientas de Accesibilidad',
    subtitle: 'Ajusta según tus preferencias'
  },
  en: {
    title: 'Accessibility Tools',
    subtitle: 'Adjust to your preferences'
  }
}
</script>

<template>
  <AccessibilityMenu :messages="customMessages" />
</template>

Deshabilitar Integración con Vue I18n

Si tu proyecto usa vue-i18n pero prefieres que el componente use sus traducciones internas:

<template>
  <AccessibilityMenu :use-global-i18n="false" />
</template>

Keys de Traducción Disponibles

interface AccessibilityMessages {
  // Header
  title: string
  subtitle: string
  close: string

  // Font Size
  fontSize: string
  increaseFontSize: string
  decreaseFontSize: string
  resetFontSize: string

  // Features
  dyslexicFont: string
  highContrast: string
  highlightLinks: string

  // Screen Reader
  screenReader: string
  readFullPage: string
  stopReading: string

  // Reading Modes
  readOnHover: string
  readOnHoverDesc: string
  readOnSelect: string
  readOnSelectDesc: string

  // Actions
  resetAll: string

  // Info
  infoTitle: string
  infoText: string

  // Language
  language: string

  // Alerts
  speechNotSupported: string

  // Aria Labels
  ariaOpenMenu: string
  ariaCloseMenu: string
  ariaToggleDyslexic: string
  ariaToggleContrast: string
  ariaToggleLinks: string
  ariaToggleHover: string
  ariaToggleSelect: string
}

Text-to-Speech por Idioma

El TTS (Text-to-Speech) se configura automáticamente según el idioma seleccionado:

  • Español: es-MX
  • Inglés: en-US

📋 Requisitos

  • Vue 3.x
  • Node.js 18+

🎯 Compatibilidad

| Framework | Versión | Compatible | |-----------|---------|-----------| | Vue 3 | ^3.0.0 | ✅ | | Nuxt 4 | ^4.0.0 | ✅ | | Laravel + Vite | 10.x+ | ✅ |

📄 Licencia

MIT © Fabián Márquez