import type { Meta, StoryObj } from '@storybook/web-components-vite'; import { html } from 'lit'; import './index.ts'; import type { USALanguageSelector, LanguageOption } from './usa-language-selector.js'; const meta: Meta = { title: 'Navigation/Language Selector', component: 'usa-language-selector', decorators: [ (story) => html` ${story()} `, ], parameters: { layout: 'padded', docs: { description: { component: ` # USA Language Selector The Language Selector component provides multilingual support for websites, enabling users to access content in their preferred language. Essential for accessibility and compliance with language access requirements. ## Usage Guidelines - Use dropdown variant for 3+ languages - Include native language names (e.g., "Español" for Spanish) - Provide language-specific URLs when possible - Consider local demographics for language selection - Test with screen readers and keyboard navigation `, }, }, }, argTypes: { currentLanguage: { control: 'select', options: ['en', 'es', 'fr', 'de', 'zh-Hans', 'ar', 'hi', 'ko', 'ru', 'vi', 'tl'], description: 'Currently selected language code (ISO 639-1)', }, variant: { control: 'select', options: ['two-languages', 'dropdown', 'unstyled'], description: 'Display variant based on number of languages', }, buttonText: { control: 'text', description: 'Text for dropdown toggle button', }, small: { control: 'boolean', description: 'Compact size for limited space (dropdown only)', }, }, args: { currentLanguage: 'en', variant: 'two-languages', buttonText: 'Languages', small: false, }, }; export default meta; type Story = StoryObj; // Common language sets const commonLanguages: LanguageOption[] = [ { code: 'en', name: 'English', nativeName: 'English' }, { code: 'es', name: 'Spanish', nativeName: 'Español' }, { code: 'zh-Hans', name: 'Chinese (Simplified)', nativeName: '简体中文' }, { code: 'tl', name: 'Tagalog', nativeName: 'Tagalog' }, { code: 'vi', name: 'Vietnamese', nativeName: 'Tiếng Việt' }, { code: 'ar', name: 'Arabic', nativeName: 'العربية' }, { code: 'fr', name: 'French', nativeName: 'Français' }, { code: 'ko', name: 'Korean', nativeName: '한국어' }, { code: 'ru', name: 'Russian', nativeName: 'Русский' }, { code: 'hi', name: 'Hindi', nativeName: 'हिन्दी' }, ]; export const Default: Story = { args: { variant: 'two-languages', currentLanguage: 'en', languages: [ { code: 'en', name: 'English', nativeName: 'English' }, { code: 'es', name: 'Spanish', nativeName: 'Español' }, ], }, render: (args) => html` `, }; export const Dropdown: Story = { args: { variant: 'dropdown', currentLanguage: 'en', buttonText: 'Language', languages: commonLanguages.slice(0, 5), }, render: (args) => html` `, }; export const SmallDropdown: Story = { args: { variant: 'dropdown', small: true, buttonText: 'Lang', languages: commonLanguages.slice(0, 4), }, render: (args) => html` `, }; export const UnstyledLinks: Story = { args: { variant: 'unstyled', languages: [ { code: 'en', name: 'English', nativeName: 'English' }, { code: 'es', name: 'Spanish', nativeName: 'Español' }, { code: 'ar', name: 'Arabic', nativeName: 'العربية' }, ], }, render: (args) => html` `, }; export const AccessibilityShowcase: Story = { parameters: { controls: { disable: true }, // Static demo - no interactive controls needed }, render: () => html`

Accessibility Compliance Demonstration

This example demonstrates WCAG 2.1 AA compliance features: proper lang attributes, keyboard navigation, and screen reader support.

Two-Language Toggle

Keyboard: Tab to focus, Space/Enter to activate

Dropdown Navigation

Keyboard: Tab to button, Space to open, Arrow keys to navigate

Screen Reader Testing

Test with screen readers: NVDA, JAWS, VoiceOver. Each language option includes:

  • lang and xml:lang attributes for proper pronunciation
  • Current selection indicated with usa-current class
  • ARIA expanded states for dropdown interactions
  • Semantic HTML structure with proper roles
{ const feedback = document.getElementById('a11y-feedback'); if (feedback) { feedback.innerHTML = ` Selection: ${e.detail.language.nativeName} (${e.detail.language.name})
Language Code: ${e.detail.code}
Previous: ${e.detail.previousCode}
Screen Reader: Should announce language change `; } }} >
Accessibility Feedback: Select a language to see accessibility information
`, };