{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "language-picker",
  "title": "Language Picker",
  "author": "Shadi Al Milhem",
  "description": "A searchable language picker with native names and RTL metadata.",
  "dependencies": [
    "@tabler/icons-react"
  ],
  "registryDependencies": [
    "button",
    "input",
    "badge"
  ],
  "files": [
    {
      "path": "src/components/flags/language-picker.tsx",
      "content": "// SPDX-License-Identifier: MIT\n\nimport { Badge } from \"@/components/ui/badge\"\nimport * as React from \"react\"\n\nimport { languageData, type LanguageCode } from \"./data/languages\"\nimport { SearchPicker, type SearchPickerProps } from \"./search-picker\"\n\nexport interface LanguagePickerProps extends Omit<SearchPickerProps, \"items\" | \"value\" | \"defaultValue\" | \"onValueChange\" | \"placeholder\" | \"searchPlaceholder\" | \"emptyMessage\"> {\n  value?: LanguageCode\n  defaultValue?: LanguageCode\n  onValueChange?: (code: LanguageCode) => void\n  languages?: readonly LanguageCode[]\n  placeholder?: string\n  searchPlaceholder?: string\n  emptyMessage?: string\n}\n\nexport function LanguagePicker({\n  languages,\n  placeholder = \"Select a language\",\n  searchPlaceholder = \"Search languages…\",\n  emptyMessage = \"No languages found.\",\n  onValueChange,\n  ...props\n}: LanguagePickerProps) {\n  const items = React.useMemo(() => {\n    const allowed = languages ? new Set(languages) : undefined\n    return languageData.filter((language) => !allowed || allowed.has(language.code)).map((language) => ({\n      value: language.code,\n      label: language.name,\n      description: language.nativeName,\n      searchValue: language.nativeName,\n      trailing: language.direction === \"rtl\" ? <Badge variant=\"outline\" className=\"font-mono text-[10px]\">RTL</Badge> : undefined,\n    }))\n  }, [languages])\n\n  return <SearchPicker items={items} placeholder={placeholder} searchPlaceholder={searchPlaceholder} emptyMessage={emptyMessage} onValueChange={(code) => onValueChange?.(code as LanguageCode)} {...props} />\n}\n",
      "type": "registry:component",
      "target": "@components/flags/language-picker.tsx"
    },
    {
      "path": "src/components/flags/search-picker.tsx",
      "content": "// SPDX-License-Identifier: MIT\n\nimport { IconCheck, IconChevronDown, IconSearch } from \"@tabler/icons-react\"\nimport * as React from \"react\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface SearchPickerItem {\n  value: string\n  label: string\n  description?: string\n  searchValue?: string\n  leading?: React.ReactNode\n  trailing?: React.ReactNode\n  disabled?: boolean\n}\n\nexport interface SearchPickerProps {\n  items: readonly SearchPickerItem[]\n  value?: string\n  defaultValue?: string\n  onValueChange?: (value: string) => void\n  placeholder: string\n  searchPlaceholder: string\n  emptyMessage: string\n  disabled?: boolean\n  name?: string\n  className?: string\n  triggerClassName?: string\n  contentClassName?: string\n  \"aria-label\"?: string\n}\n\nexport function SearchPicker({\n  items,\n  value,\n  defaultValue,\n  onValueChange,\n  placeholder,\n  searchPlaceholder,\n  emptyMessage,\n  disabled,\n  name,\n  className,\n  triggerClassName,\n  contentClassName,\n  \"aria-label\": ariaLabel,\n}: SearchPickerProps) {\n  const [internalValue, setInternalValue] = React.useState(defaultValue)\n  const [query, setQuery] = React.useState(\"\")\n  const [phase, setPhase] = React.useState<\"closed\" | \"open\" | \"closing\">(\"closed\")\n  const [activeIndex, setActiveIndex] = React.useState(0)\n  const rootRef = React.useRef<HTMLDivElement>(null)\n  const triggerRef = React.useRef<HTMLButtonElement>(null)\n  const searchRef = React.useRef<HTMLInputElement>(null)\n  const closeTimerRef = React.useRef<number | undefined>(undefined)\n  const listId = React.useId()\n  const currentValue = value ?? internalValue\n  const selectedItem = items.find((item) => item.value === currentValue)\n  const open = phase === \"open\"\n\n  const filteredItems = React.useMemo(() => {\n    const normalized = query.trim().toLocaleLowerCase()\n    if (!normalized) return items\n    return items.filter((item) => `${item.label} ${item.description ?? \"\"} ${item.value} ${item.searchValue ?? \"\"}`.toLocaleLowerCase().includes(normalized))\n  }, [items, query])\n\n  const close = React.useCallback((restoreFocus = false) => {\n    window.clearTimeout(closeTimerRef.current)\n    setPhase((current) => current === \"closed\" ? current : \"closing\")\n    closeTimerRef.current = window.setTimeout(() => {\n      setPhase(\"closed\")\n      if (restoreFocus) triggerRef.current?.focus()\n    }, 150)\n  }, [])\n\n  React.useEffect(() => () => window.clearTimeout(closeTimerRef.current), [])\n\n  React.useEffect(() => {\n    if (!open) return\n    const onPointerDown = (event: PointerEvent) => {\n      if (!rootRef.current?.contains(event.target as Node)) close()\n    }\n    document.addEventListener(\"pointerdown\", onPointerDown)\n    return () => document.removeEventListener(\"pointerdown\", onPointerDown)\n  }, [close, open])\n\n  React.useEffect(() => {\n    if (open) requestAnimationFrame(() => searchRef.current?.focus())\n  }, [open])\n\n  function selectItem(item: SearchPickerItem) {\n    if (item.disabled) return\n    if (value === undefined) setInternalValue(item.value)\n    onValueChange?.(item.value)\n    setQuery(\"\")\n    close(true)\n  }\n\n  return (\n    <div ref={rootRef} data-slot=\"search-picker\" className={cn(\"relative min-w-0 w-full\", className)}>\n      {name ? <input type=\"hidden\" name={name} value={currentValue ?? \"\"} /> : null}\n      <Button\n        ref={triggerRef}\n        type=\"button\"\n        variant=\"outline\"\n        role=\"combobox\"\n        aria-expanded={open}\n        aria-controls={listId}\n        aria-haspopup=\"listbox\"\n        aria-label={ariaLabel ?? placeholder}\n        disabled={disabled}\n        className={cn(\"h-10 min-w-0 w-full justify-between px-3 font-normal sm:h-9\", triggerClassName)}\n        onClick={() => {\n          if (open) close()\n          else {\n            window.clearTimeout(closeTimerRef.current)\n            setActiveIndex(0)\n            setPhase(\"open\")\n          }\n        }}\n      >\n        <span className={cn(\"flex min-w-0 items-center gap-2\", !selectedItem && \"text-muted-foreground\")}>\n          {selectedItem?.leading}\n          <span className=\"truncate\">{selectedItem?.label ?? placeholder}</span>\n        </span>\n        <IconChevronDown data-icon=\"inline-end\" aria-hidden=\"true\" />\n      </Button>\n\n      {phase !== \"closed\" ? (\n        <div\n          data-origin=\"top\"\n          className={cn(\"t-dropdown absolute z-50 mt-1 w-full min-w-64 overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\", phase === \"open\" ? \"is-open\" : \"is-closing\", contentClassName)}\n          onKeyDown={(event) => {\n            if (event.key === \"Escape\") close(true)\n            if (event.key === \"ArrowDown\") {\n              event.preventDefault()\n              setActiveIndex((index) => Math.min(index + 1, filteredItems.length - 1))\n            }\n            if (event.key === \"ArrowUp\") {\n              event.preventDefault()\n              setActiveIndex((index) => Math.max(index - 1, 0))\n            }\n            if (event.key === \"Enter\" && filteredItems[activeIndex]) {\n              event.preventDefault()\n              selectItem(filteredItems[activeIndex])\n            }\n          }}\n        >\n          <div className=\"relative border-b p-2\">\n            <IconSearch aria-hidden=\"true\" className=\"pointer-events-none absolute start-4 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n            <Input\n              ref={searchRef}\n              value={query}\n              onChange={(event) => { setQuery(event.target.value); setActiveIndex(0) }}\n              placeholder={searchPlaceholder}\n              aria-label={searchPlaceholder}\n              aria-controls={listId}\n              aria-activedescendant={filteredItems[activeIndex] ? `${listId}-${filteredItems[activeIndex].value}` : undefined}\n              className=\"h-9 ps-8 shadow-none\"\n            />\n          </div>\n          <div id={listId} role=\"listbox\" className=\"max-h-72 overflow-y-auto p-1\">\n            {filteredItems.length ? filteredItems.map((item, index) => (\n              <button\n                key={item.value}\n                id={`${listId}-${item.value}`}\n                type=\"button\"\n                role=\"option\"\n                aria-selected={item.value === currentValue}\n                disabled={item.disabled}\n                data-active={index === activeIndex || undefined}\n                className=\"flex min-h-10 w-full items-center gap-2 rounded-sm px-2 py-2 text-start text-sm outline-none hover:bg-accent hover:text-accent-foreground data-[active]:bg-accent data-[active]:text-accent-foreground focus-visible:ring-ring/30 focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-40 sm:min-h-9\"\n                onPointerMove={() => setActiveIndex(index)}\n                onClick={() => selectItem(item)}\n              >\n                {item.leading}\n                <span className=\"min-w-0 flex-1\">\n                  <span className=\"block truncate\">{item.label}</span>\n                  {item.description ? <span className=\"block truncate text-xs text-muted-foreground\">{item.description}</span> : null}\n                </span>\n                {item.trailing}\n                <IconCheck aria-hidden=\"true\" className={cn(\"size-4\", item.value === currentValue ? \"opacity-100\" : \"opacity-0\")} />\n              </button>\n            )) : <p className=\"px-3 py-8 text-center text-sm text-muted-foreground\">{emptyMessage}</p>}\n          </div>\n        </div>\n      ) : null}\n    </div>\n  )\n}\n",
      "type": "registry:component",
      "target": "@components/flags/search-picker.tsx"
    },
    {
      "path": "src/components/flags/data/languages.ts",
      "content": "// SPDX-License-Identifier: MIT\n\n// Generated by scripts/generate-country-data.mjs from countries-list,\n// i18n-iso-countries, and libphonenumber-js. Do not edit by hand.\n\nexport const languageData = [\n  {\n    \"code\": \"ab\",\n    \"name\": \"Abkhazian\",\n    \"nativeName\": \"Аҧсуа\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"aa\",\n    \"name\": \"Afar\",\n    \"nativeName\": \"Afar\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"af\",\n    \"name\": \"Afrikaans\",\n    \"nativeName\": \"Afrikaans\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ak\",\n    \"name\": \"Akan\",\n    \"nativeName\": \"Akana\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"sq\",\n    \"name\": \"Albanian\",\n    \"nativeName\": \"Shqip\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"am\",\n    \"name\": \"Amharic\",\n    \"nativeName\": \"አማርኛ\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ar\",\n    \"name\": \"Arabic\",\n    \"nativeName\": \"العربية\",\n    \"direction\": \"rtl\"\n  },\n  {\n    \"code\": \"an\",\n    \"name\": \"Aragonese\",\n    \"nativeName\": \"Aragonés\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"hy\",\n    \"name\": \"Armenian\",\n    \"nativeName\": \"Հայերեն\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"as\",\n    \"name\": \"Assamese\",\n    \"nativeName\": \"অসমীয়া\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"av\",\n    \"name\": \"Avar\",\n    \"nativeName\": \"Авар\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ay\",\n    \"name\": \"Aymara\",\n    \"nativeName\": \"Aymar\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"az\",\n    \"name\": \"Azerbaijani\",\n    \"nativeName\": \"Azərbaycanca / آذربايجان\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"bm\",\n    \"name\": \"Bambara\",\n    \"nativeName\": \"Bamanankan\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ba\",\n    \"name\": \"Bashkir\",\n    \"nativeName\": \"Башҡорт\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"eu\",\n    \"name\": \"Basque\",\n    \"nativeName\": \"Euskara\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"be\",\n    \"name\": \"Belarusian\",\n    \"nativeName\": \"Беларуская\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"bn\",\n    \"name\": \"Bengali\",\n    \"nativeName\": \"বাংলা\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"bh\",\n    \"name\": \"Bihari\",\n    \"nativeName\": \"भोजपुरी\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"bi\",\n    \"name\": \"Bislama\",\n    \"nativeName\": \"Bislama\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"bs\",\n    \"name\": \"Bosnian\",\n    \"nativeName\": \"Bosanski\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"br\",\n    \"name\": \"Breton\",\n    \"nativeName\": \"Brezhoneg\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"bg\",\n    \"name\": \"Bulgarian\",\n    \"nativeName\": \"Български\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"my\",\n    \"name\": \"Burmese\",\n    \"nativeName\": \"မြန်မာစာ\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"km\",\n    \"name\": \"Cambodian\",\n    \"nativeName\": \"ភាសាខ្មែរ\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ca\",\n    \"name\": \"Catalan\",\n    \"nativeName\": \"Català\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ch\",\n    \"name\": \"Chamorro\",\n    \"nativeName\": \"Chamoru\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ce\",\n    \"name\": \"Chechen\",\n    \"nativeName\": \"Нохчийн\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ny\",\n    \"name\": \"Chichewa\",\n    \"nativeName\": \"Chi-Chewa\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"zh\",\n    \"name\": \"Chinese\",\n    \"nativeName\": \"中文\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"cv\",\n    \"name\": \"Chuvash\",\n    \"nativeName\": \"Чăваш\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"kw\",\n    \"name\": \"Cornish\",\n    \"nativeName\": \"Kernewek\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"co\",\n    \"name\": \"Corsican\",\n    \"nativeName\": \"Corsu\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"cr\",\n    \"name\": \"Cree\",\n    \"nativeName\": \"Nehiyaw\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"hr\",\n    \"name\": \"Croatian\",\n    \"nativeName\": \"Hrvatski\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"cs\",\n    \"name\": \"Czech\",\n    \"nativeName\": \"Čeština\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"da\",\n    \"name\": \"Danish\",\n    \"nativeName\": \"Dansk\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"dv\",\n    \"name\": \"Divehi\",\n    \"nativeName\": \"ދިވެހިބަސް\",\n    \"direction\": \"rtl\"\n  },\n  {\n    \"code\": \"nl\",\n    \"name\": \"Dutch\",\n    \"nativeName\": \"Nederlands\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"dz\",\n    \"name\": \"Dzongkha\",\n    \"nativeName\": \"ཇོང་ཁ\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"en\",\n    \"name\": \"English\",\n    \"nativeName\": \"English\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"eo\",\n    \"name\": \"Esperanto\",\n    \"nativeName\": \"Esperanto\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"et\",\n    \"name\": \"Estonian\",\n    \"nativeName\": \"Eesti\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ee\",\n    \"name\": \"Ewe\",\n    \"nativeName\": \"Ɛʋɛ\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"fo\",\n    \"name\": \"Faroese\",\n    \"nativeName\": \"Føroyskt\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"fj\",\n    \"name\": \"Fijian\",\n    \"nativeName\": \"Na Vosa Vakaviti\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"fi\",\n    \"name\": \"Finnish\",\n    \"nativeName\": \"Suomi\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"fr\",\n    \"name\": \"French\",\n    \"nativeName\": \"Français\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"gl\",\n    \"name\": \"Galician\",\n    \"nativeName\": \"Galego\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"lg\",\n    \"name\": \"Ganda\",\n    \"nativeName\": \"Luganda\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ka\",\n    \"name\": \"Georgian\",\n    \"nativeName\": \"ქართული\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"de\",\n    \"name\": \"German\",\n    \"nativeName\": \"Deutsch\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"el\",\n    \"name\": \"Greek\",\n    \"nativeName\": \"Ελληνικά\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"kl\",\n    \"name\": \"Greenlandic\",\n    \"nativeName\": \"Kalaallisut\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"gn\",\n    \"name\": \"Guarani\",\n    \"nativeName\": \"Avañe'ẽ\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"gu\",\n    \"name\": \"Gujarati\",\n    \"nativeName\": \"ગુજરાતી\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ht\",\n    \"name\": \"Haitian\",\n    \"nativeName\": \"Krèyol ayisyen\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ha\",\n    \"name\": \"Hausa\",\n    \"nativeName\": \"هَوُسَ\",\n    \"direction\": \"rtl\"\n  },\n  {\n    \"code\": \"he\",\n    \"name\": \"Hebrew\",\n    \"nativeName\": \"עברית\",\n    \"direction\": \"rtl\"\n  },\n  {\n    \"code\": \"hz\",\n    \"name\": \"Herero\",\n    \"nativeName\": \"Otsiherero\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"hi\",\n    \"name\": \"Hindi\",\n    \"nativeName\": \"हिन्दी\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ho\",\n    \"name\": \"Hiri Motu\",\n    \"nativeName\": \"Hiri Motu\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"hu\",\n    \"name\": \"Hungarian\",\n    \"nativeName\": \"Magyar\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"is\",\n    \"name\": \"Icelandic\",\n    \"nativeName\": \"Íslenska\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"io\",\n    \"name\": \"Ido\",\n    \"nativeName\": \"Ido\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ig\",\n    \"name\": \"Igbo\",\n    \"nativeName\": \"Igbo\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"id\",\n    \"name\": \"Indonesian\",\n    \"nativeName\": \"Bahasa Indonesia\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ia\",\n    \"name\": \"Interlingua\",\n    \"nativeName\": \"Interlingua\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ie\",\n    \"name\": \"Interlingue\",\n    \"nativeName\": \"Interlingue\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"iu\",\n    \"name\": \"Inuktitut\",\n    \"nativeName\": \"ᐃᓄᒃᑎᑐᑦ\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ik\",\n    \"name\": \"Inupiak\",\n    \"nativeName\": \"Iñupiak\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ga\",\n    \"name\": \"Irish\",\n    \"nativeName\": \"Gaeilge\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"it\",\n    \"name\": \"Italian\",\n    \"nativeName\": \"Italiano\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ja\",\n    \"name\": \"Japanese\",\n    \"nativeName\": \"日本語\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"jv\",\n    \"name\": \"Javanese\",\n    \"nativeName\": \"Basa Jawa\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"kn\",\n    \"name\": \"Kannada\",\n    \"nativeName\": \"ಕನ್ನಡ\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"kr\",\n    \"name\": \"Kanuri\",\n    \"nativeName\": \"Kanuri\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ks\",\n    \"name\": \"Kashmiri\",\n    \"nativeName\": \"कश्मीरी / كشميري\",\n    \"direction\": \"rtl\"\n  },\n  {\n    \"code\": \"kk\",\n    \"name\": \"Kazakh\",\n    \"nativeName\": \"Қазақша\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ki\",\n    \"name\": \"Kikuyu\",\n    \"nativeName\": \"Gĩkũyũ\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"rn\",\n    \"name\": \"Kirundi\",\n    \"nativeName\": \"Kirundi\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"kv\",\n    \"name\": \"Komi\",\n    \"nativeName\": \"Коми\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"kg\",\n    \"name\": \"Kongo\",\n    \"nativeName\": \"KiKongo\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ko\",\n    \"name\": \"Korean\",\n    \"nativeName\": \"한국어\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"kj\",\n    \"name\": \"Kuanyama\",\n    \"nativeName\": \"Kuanyama\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ku\",\n    \"name\": \"Kurdish\",\n    \"nativeName\": \"Kurdî / كوردی\",\n    \"direction\": \"rtl\"\n  },\n  {\n    \"code\": \"ky\",\n    \"name\": \"Kyrgyz\",\n    \"nativeName\": \"Кыргызча\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"lo\",\n    \"name\": \"Laotian\",\n    \"nativeName\": \"ລາວ / Pha xa lao\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"la\",\n    \"name\": \"Latin\",\n    \"nativeName\": \"Latina\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"lv\",\n    \"name\": \"Latvian\",\n    \"nativeName\": \"Latviešu\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"li\",\n    \"name\": \"Limburgian\",\n    \"nativeName\": \"Limburgs\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ln\",\n    \"name\": \"Lingala\",\n    \"nativeName\": \"Lingála\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"lt\",\n    \"name\": \"Lithuanian\",\n    \"nativeName\": \"Lietuvių\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"lu\",\n    \"name\": \"Luba-Katanga\",\n    \"nativeName\": \"Tshiluba\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"lb\",\n    \"name\": \"Luxembourgish\",\n    \"nativeName\": \"Lëtzebuergesch\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"mk\",\n    \"name\": \"Macedonian\",\n    \"nativeName\": \"Македонски\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"mg\",\n    \"name\": \"Malagasy\",\n    \"nativeName\": \"Malagasy\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ms\",\n    \"name\": \"Malay\",\n    \"nativeName\": \"Bahasa Melayu\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ml\",\n    \"name\": \"Malayalam\",\n    \"nativeName\": \"മലയാളം\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"mt\",\n    \"name\": \"Maltese\",\n    \"nativeName\": \"bil-Malti\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"gv\",\n    \"name\": \"Manx\",\n    \"nativeName\": \"Gaelg\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"mi\",\n    \"name\": \"Maori\",\n    \"nativeName\": \"Māori\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"mr\",\n    \"name\": \"Marathi\",\n    \"nativeName\": \"मराठी\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"mh\",\n    \"name\": \"Marshallese\",\n    \"nativeName\": \"Kajin Majel / Ebon\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"mo\",\n    \"name\": \"Moldovan\",\n    \"nativeName\": \"Moldovenească\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"mn\",\n    \"name\": \"Mongolian\",\n    \"nativeName\": \"Монгол\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"na\",\n    \"name\": \"Nauruan\",\n    \"nativeName\": \"Dorerin Naoero\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"nv\",\n    \"name\": \"Navajo\",\n    \"nativeName\": \"Diné bizaad\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ng\",\n    \"name\": \"Ndonga\",\n    \"nativeName\": \"Oshiwambo\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ne\",\n    \"name\": \"Nepali\",\n    \"nativeName\": \"नेपाली\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"nd\",\n    \"name\": \"North Ndebele\",\n    \"nativeName\": \"Sindebele\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"se\",\n    \"name\": \"Northern Sami\",\n    \"nativeName\": \"Sámegiella\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"no\",\n    \"name\": \"Norwegian\",\n    \"nativeName\": \"Norsk\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"nb\",\n    \"name\": \"Norwegian Bokmål\",\n    \"nativeName\": \"Norsk bokmål\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"nn\",\n    \"name\": \"Norwegian Nynorsk\",\n    \"nativeName\": \"Norsk nynorsk\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"oc\",\n    \"name\": \"Occitan\",\n    \"nativeName\": \"Occitan\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"oj\",\n    \"name\": \"Ojibwa\",\n    \"nativeName\": \"ᐊᓂᔑᓈᐯᒧᐎᓐ / Anishinaabemowin\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"cu\",\n    \"name\": \"Old Church Slavonic / Old Bulgarian\",\n    \"nativeName\": \"словѣньскъ / slověnĭskŭ\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"or\",\n    \"name\": \"Oriya\",\n    \"nativeName\": \"ଓଡ଼ିଆ\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"om\",\n    \"name\": \"Oromo\",\n    \"nativeName\": \"Oromoo\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"os\",\n    \"name\": \"Ossetian / Ossetic\",\n    \"nativeName\": \"Иронау\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"pi\",\n    \"name\": \"Pali\",\n    \"nativeName\": \"Pāli / पाऴि\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"pa\",\n    \"name\": \"Panjabi / Punjabi\",\n    \"nativeName\": \"ਪੰਜਾਬੀ / पंजाबी / پنجابي\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ps\",\n    \"name\": \"Pashto\",\n    \"nativeName\": \"پښتو\",\n    \"direction\": \"rtl\"\n  },\n  {\n    \"code\": \"fa\",\n    \"name\": \"Persian\",\n    \"nativeName\": \"فارسی\",\n    \"direction\": \"rtl\"\n  },\n  {\n    \"code\": \"ff\",\n    \"name\": \"Peul\",\n    \"nativeName\": \"Fulfulde\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"pl\",\n    \"name\": \"Polish\",\n    \"nativeName\": \"Polski\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"pt\",\n    \"name\": \"Portuguese\",\n    \"nativeName\": \"Português\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"qu\",\n    \"name\": \"Quechua\",\n    \"nativeName\": \"Runa Simi\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"rm\",\n    \"name\": \"Raeto Romance\",\n    \"nativeName\": \"Rumantsch\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ro\",\n    \"name\": \"Romanian\",\n    \"nativeName\": \"Română\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ru\",\n    \"name\": \"Russian\",\n    \"nativeName\": \"Русский\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"rw\",\n    \"name\": \"Rwandi\",\n    \"nativeName\": \"Kinyarwandi\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"sm\",\n    \"name\": \"Samoan\",\n    \"nativeName\": \"Gagana Samoa\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"sg\",\n    \"name\": \"Sango\",\n    \"nativeName\": \"Sängö\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"sa\",\n    \"name\": \"Sanskrit\",\n    \"nativeName\": \"संस्कृतम्\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"sc\",\n    \"name\": \"Sardinian\",\n    \"nativeName\": \"Sardu\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"gd\",\n    \"name\": \"Scottish Gaelic\",\n    \"nativeName\": \"Gàidhlig\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"sr\",\n    \"name\": \"Serbian\",\n    \"nativeName\": \"Српски\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"sh\",\n    \"name\": \"Serbo-Croatian\",\n    \"nativeName\": \"Srpskohrvatski / Српскохрватски\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"sn\",\n    \"name\": \"Shona\",\n    \"nativeName\": \"chiShona\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ii\",\n    \"name\": \"Sichuan Yi\",\n    \"nativeName\": \"ꆇꉙ / 四川彝语\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"sd\",\n    \"name\": \"Sindhi\",\n    \"nativeName\": \"सिनधि\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"si\",\n    \"name\": \"Sinhalese\",\n    \"nativeName\": \"සිංහල\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"sk\",\n    \"name\": \"Slovak\",\n    \"nativeName\": \"Slovenčina\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"sl\",\n    \"name\": \"Slovenian\",\n    \"nativeName\": \"Slovenščina\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"so\",\n    \"name\": \"Somalia\",\n    \"nativeName\": \"Soomaaliga\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"nr\",\n    \"name\": \"South Ndebele\",\n    \"nativeName\": \"isiNdebele\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"st\",\n    \"name\": \"Southern Sotho\",\n    \"nativeName\": \"Sesotho\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"es\",\n    \"name\": \"Spanish\",\n    \"nativeName\": \"Español\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"su\",\n    \"name\": \"Sundanese\",\n    \"nativeName\": \"Basa Sunda\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"sw\",\n    \"name\": \"Swahili\",\n    \"nativeName\": \"Kiswahili\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ss\",\n    \"name\": \"Swati\",\n    \"nativeName\": \"SiSwati\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"sv\",\n    \"name\": \"Swedish\",\n    \"nativeName\": \"Svenska\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"tl\",\n    \"name\": \"Tagalog / Filipino\",\n    \"nativeName\": \"Tagalog\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ty\",\n    \"name\": \"Tahitian\",\n    \"nativeName\": \"Reo Mā`ohi\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"tg\",\n    \"name\": \"Tajik\",\n    \"nativeName\": \"Тоҷикӣ\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ta\",\n    \"name\": \"Tamil\",\n    \"nativeName\": \"தமிழ்\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"tt\",\n    \"name\": \"Tatar\",\n    \"nativeName\": \"Tatarça\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"te\",\n    \"name\": \"Telugu\",\n    \"nativeName\": \"తెలుగు\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"th\",\n    \"name\": \"Thai\",\n    \"nativeName\": \"ไทย / Phasa Thai\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"bo\",\n    \"name\": \"Tibetan\",\n    \"nativeName\": \"བོད་ཡིག / Bod skad\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ti\",\n    \"name\": \"Tigrinya\",\n    \"nativeName\": \"ትግርኛ\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"to\",\n    \"name\": \"Tonga\",\n    \"nativeName\": \"Lea Faka-Tonga\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ts\",\n    \"name\": \"Tsonga\",\n    \"nativeName\": \"Xitsonga\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"tn\",\n    \"name\": \"Tswana\",\n    \"nativeName\": \"Setswana\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"tr\",\n    \"name\": \"Turkish\",\n    \"nativeName\": \"Türkçe\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"tk\",\n    \"name\": \"Turkmen\",\n    \"nativeName\": \"Туркмен / تركمن\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"tw\",\n    \"name\": \"Twi\",\n    \"nativeName\": \"Twi\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"uk\",\n    \"name\": \"Ukrainian\",\n    \"nativeName\": \"Українська\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ur\",\n    \"name\": \"Urdu\",\n    \"nativeName\": \"اردو\",\n    \"direction\": \"rtl\"\n  },\n  {\n    \"code\": \"ug\",\n    \"name\": \"Uyghur\",\n    \"nativeName\": \"Uyƣurqə / ئۇيغۇرچە\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"uz\",\n    \"name\": \"Uzbek\",\n    \"nativeName\": \"O'zbekcha\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"ve\",\n    \"name\": \"Venda\",\n    \"nativeName\": \"Tshivenḓa\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"vi\",\n    \"name\": \"Vietnamese\",\n    \"nativeName\": \"Tiếng Việt\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"vo\",\n    \"name\": \"Volapük\",\n    \"nativeName\": \"Volapük\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"wa\",\n    \"name\": \"Walloon\",\n    \"nativeName\": \"Walon\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"cy\",\n    \"name\": \"Welsh\",\n    \"nativeName\": \"Cymraeg\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"fy\",\n    \"name\": \"West Frisian\",\n    \"nativeName\": \"Frysk\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"wo\",\n    \"name\": \"Wolof\",\n    \"nativeName\": \"Wollof\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"xh\",\n    \"name\": \"Xhosa\",\n    \"nativeName\": \"isiXhosa\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"yi\",\n    \"name\": \"Yiddish\",\n    \"nativeName\": \"ייִדיש\",\n    \"direction\": \"rtl\"\n  },\n  {\n    \"code\": \"yo\",\n    \"name\": \"Yoruba\",\n    \"nativeName\": \"Yorùbá\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"za\",\n    \"name\": \"Zhuang\",\n    \"nativeName\": \"Cuengh / Tôô / 壮语\",\n    \"direction\": \"ltr\"\n  },\n  {\n    \"code\": \"zu\",\n    \"name\": \"Zulu\",\n    \"nativeName\": \"isiZulu\",\n    \"direction\": \"ltr\"\n  }\n] as const\n\nexport type Language = (typeof languageData)[number]\nexport type LanguageCode = Language[\"code\"]\n",
      "type": "registry:lib",
      "target": "@components/flags/data/languages.ts"
    }
  ],
  "meta": {
    "license": "MIT",
    "count": 185,
    "searchable": true,
    "rtlAware": true
  },
  "docs": "Constrain the picker with languages and inspect RTL direction through language-utils.",
  "categories": [
    "languages",
    "forms",
    "combobox"
  ],
  "type": "registry:block"
}