@babelize/elements 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Babelize
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,73 @@
1
+ <p align="center">
2
+ <img src="./public/elements_logo.svg" width="341" height="64" alt="Babelize Elements logo" />
3
+ </p>
4
+
5
+ <h1 align="center">Babelize Elements</h1>
6
+
7
+ <p align="center">
8
+ Open-source Localization UI components for React and Tailwind CSS.
9
+ <br />
10
+ Copy-paste components for language switchers, locale pickers, translation widgets, and more — built by the community.
11
+ </p>
12
+
13
+ <p align="center">
14
+ <a href="https://elements.babelize.co">elements.babelize.co</a>
15
+ ·
16
+ <a href="https://github.com/babelize/babelize-elements/issues">Issues</a>
17
+ ·
18
+ <a href="https://github.com/babelize/babelize-elements/blob/main/CONTRIBUTING.md">Contributing</a>
19
+ </p>
20
+
21
+ <p align="center">
22
+ <a href="https://github.com/babelize/babelize-elements/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License: MIT" /></a>
23
+ <a href="https://github.com/babelize/babelize-elements/blob/main/CHANGELOG.md"><img src="https://img.shields.io/badge/changelog-Keep%20a%20Changelog-blueviolet.svg" alt="Changelog" /></a>
24
+ <img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg" alt="PRs welcome" />
25
+ <a href="https://github.com/babelize/babelize-elements/discussions"><img src="https://img.shields.io/badge/discussions-Join%20us-blue.svg" alt="Discussions" /></a>
26
+ </p>
27
+
28
+ ## What is Babelize Elements?
29
+
30
+ **Babelize Elements** is a community-built library of copy-paste **Localization UI components** for React and Tailwind CSS. Every localized app needs a language switcher, a locale picker, RTL-aware layouts, and pluralization UI — Elements turns that repetitive work into a shared, open-source toolbox.
31
+
32
+ - **Copy & paste** — grab the code, drop it in your project. No installs, no registry lock-in.
33
+ - **Localization-first** — pluralization, RTL, and locale data built into every component.
34
+ - **Accessible** — keyboard support, ARIA labels, and WCAG-aware markup.
35
+ - **Open source** — MIT-licensed, free forever, built by contributors like you.
36
+
37
+ ## Docs & Website
38
+
39
+ The landing page and component documentation live at [elements.babelize.co](https://elements.babelize.co), built with Next.js and [Fumadocs](https://fumadocs.dev).
40
+
41
+ ```bash
42
+ bun install
43
+ bun run dev
44
+ ```
45
+
46
+ ## Contributing a component
47
+
48
+ Components are contributed by the community. The typical flow:
49
+
50
+ 1. Pick an open [issue](https://github.com/babelize/babelize-elements/issues) — look for `good first issue` or `help wanted`.
51
+ 2. Build the component in `src/registry/components/`.
52
+ 3. Open a pull request following our [contributing guide](https://github.com/babelize/babelize-elements/blob/main/CONTRIBUTING.md).
53
+ 4. Maintainers review it, and merged components ship to the docs for everyone.
54
+
55
+ Great component candidates:
56
+
57
+ - Language switchers (dropdowns, pills, searchable)
58
+ - Locale pickers (regions, currencies, date formats)
59
+ - Translation widgets and inline editors
60
+ - RTL-aware layout primitives
61
+ - Locale-aware date/time pickers
62
+ - Pluralization helpers and CLDR plural-rule UI
63
+ - Locale-aware currency inputs
64
+
65
+ ## Community
66
+
67
+ - [Code of Conduct](https://github.com/babelize/babelize-elements/blob/main/CODE_OF_CONDUCT.md)
68
+ - [Security Policy](https://github.com/babelize/babelize-elements/blob/main/SECURITY.md)
69
+ - [Contributing](https://github.com/babelize/babelize-elements/blob/main/CONTRIBUTING.md)
70
+
71
+ ## License
72
+
73
+ [MIT](https://github.com/babelize/babelize-elements/blob/main/LICENSE) © [Babelize](https://babelize.co)
@@ -0,0 +1,3 @@
1
+ import { type ClassValue } from "clsx";
2
+ export declare function cn(...inputs: ClassValue[]): string;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAC;AAG7C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC"}
@@ -0,0 +1,6 @@
1
+ import { clsx } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+ export function cn(...inputs) {
4
+ return twMerge(clsx(inputs));
5
+ }
6
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,MAAM,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,UAAU,EAAE,CAAC,GAAG,MAAoB;IACxC,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { LanguageSwitcher } from "./language-switcher";
2
+ export type { LanguageSwitcherProps, Locale } from "./language-switcher";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/registry/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { LanguageSwitcher } from "./language-switcher";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/registry/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,83 @@
1
+ import * as React from "react";
2
+ export interface Locale {
3
+ /** ISO 639-1 / BCP 47 code (e.g. "en", "fr-FR", "ar-SA") */
4
+ code: string;
5
+ /** Override display name (auto-resolved from built-in mapping if omitted) */
6
+ label?: string;
7
+ /** Override flag emoji (auto-detected from code if omitted) */
8
+ flag?: string;
9
+ /** Override RTL (auto-detected from code if omitted) */
10
+ rtl?: boolean;
11
+ }
12
+ export interface LanguageSwitcherThemeColors {
13
+ /** Button background */
14
+ btnBg: string;
15
+ /** Button border */
16
+ btnBorder: string;
17
+ /** Button text */
18
+ btnText: string;
19
+ /** Chevron and muted icon color */
20
+ iconColor: string;
21
+ /** Dropdown background */
22
+ dropdownBg: string;
23
+ /** Dropdown border */
24
+ dropdownBorder: string;
25
+ /** Dropdown item text */
26
+ itemText: string;
27
+ /** Dropdown item hover background */
28
+ itemHoverBg: string;
29
+ /** Dropdown item hover text */
30
+ itemHoverText: string;
31
+ /** Active item background */
32
+ activeBg: string;
33
+ /** Active item text */
34
+ activeText: string;
35
+ /** Search input background */
36
+ inputBg: string;
37
+ /** Search input text */
38
+ inputText: string;
39
+ /** Search input placeholder */
40
+ inputPlaceholder: string;
41
+ /** Search border */
42
+ inputBorder: string;
43
+ /** No results text */
44
+ noResultsText: string;
45
+ }
46
+ export interface LanguageSwitcherProps {
47
+ /** Array of available locales — only `code` is required */
48
+ locales: Locale[];
49
+ /** Initial selected locale code (default: first locale's code) */
50
+ defaultValue?: string;
51
+ /** Callback when locale changes */
52
+ onValueChange?: (code: string) => void;
53
+ /** Show flag emojis next to locale names (default: false) */
54
+ showFlags?: boolean;
55
+ /** Display labels in native language or English (default: "english") */
56
+ label?: "native" | "english";
57
+ /** Additional CSS classes */
58
+ className?: string;
59
+ /** Theme colors — when provided, component uses inline styles instead of Tailwind dark: variants */
60
+ themeColors?: LanguageSwitcherThemeColors;
61
+ }
62
+ /**
63
+ * Dropdown language switcher with searchable locale list.
64
+ *
65
+ * @example
66
+ * ```tsx
67
+ * // Simplest — just pass codes
68
+ * <LanguageSwitcher
69
+ * locales={[{ code: "en" }, { code: "fr" }, { code: "ar" }]}
70
+ * defaultValue="en"
71
+ * onValueChange={(code) => router.push(`/${code}`)}
72
+ * />
73
+ *
74
+ * // Native labels + flags
75
+ * <LanguageSwitcher
76
+ * locales={[{ code: "en" }, { code: "fr" }]}
77
+ * label="native"
78
+ * showFlags
79
+ * />
80
+ * ```
81
+ */
82
+ export declare function LanguageSwitcher({ locales, defaultValue, onValueChange, showFlags, label: labelMode, className, themeColors, }: LanguageSwitcherProps): React.JSX.Element;
83
+ //# sourceMappingURL=language-switcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language-switcher.d.ts","sourceRoot":"","sources":["../../../src/registry/components/language-switcher.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,WAAW,MAAM;IACrB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,2BAA2B;IAC1C,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wEAAwE;IACxE,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oGAAoG;IACpG,WAAW,CAAC,EAAE,2BAA2B,CAAC;CAC3C;AA6GD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,YAAY,EACZ,aAAa,EACb,SAAiB,EACjB,KAAK,EAAE,SAAqB,EAC5B,SAAS,EACT,WAAW,GACZ,EAAE,qBAAqB,qBAoLvB"}
@@ -0,0 +1,194 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "@/lib/utils";
5
+ const RTL_LOCALES = new Set(["ar", "he", "fa", "ur", "ps", "sd", "yi"]);
6
+ function isRtl(code) {
7
+ const lang = code.split("-")[0].toLowerCase();
8
+ return RTL_LOCALES.has(lang);
9
+ }
10
+ /**
11
+ * Maps ISO 639-1 language codes to flag emojis via regional indicator symbols.
12
+ * Covers 80+ common languages. Override per-locale with the `flag` prop.
13
+ */
14
+ const LANG_TO_FLAG = {
15
+ en: "\u{1F1FA}\u{1F1F8}", fr: "\u{1F1EB}\u{1F1F7}", es: "\u{1F1EA}\u{1F1F8}",
16
+ de: "\u{1F1E9}\u{1F1EA}", ja: "\u{1F1EF}\u{1F1F5}", ko: "\u{1F1F0}\u{1F1F7}",
17
+ zh: "\u{1F1E8}\u{1F1F3}", ar: "\u{1F1F8}\u{1F1E6}", pt: "\u{1F1E7}\u{1F1F7}",
18
+ it: "\u{1F1EE}\u{1F1F9}", nl: "\u{1F1F3}\u{1F1F1}", ru: "\u{1F1F7}\u{1F1FA}",
19
+ pl: "\u{1F1F5}\u{1F1F1}", tr: "\u{1F1F9}\u{1F1F7}", vi: "\u{1F1FB}\u{1F1F3}",
20
+ th: "\u{1F1F9}\u{1F1ED}", id: "\u{1F1EE}\u{1F1E9}", hi: "\u{1F1EE}\u{1F1F3}",
21
+ bn: "\u{1F1E7}\u{1F1E9}", uk: "\u{1F1FA}\u{1F1E6}", cs: "\u{1F1E8}\u{1F1FF}",
22
+ sv: "\u{1F1F8}\u{1F1EA}", da: "\u{1F1E9}\u{1F1F0}", fi: "\u{1F1EB}\u{1F1EE}",
23
+ no: "\u{1F1F3}\u{1F1F4}", nb: "\u{1F1F3}\u{1F1F4}", nn: "\u{1F1F3}\u{1F1F4}",
24
+ el: "\u{1F1EC}\u{1F1F7}", he: "\u{1F1EE}\u{1F1F1}", fa: "\u{1F1EE}\u{1F1F7}",
25
+ ro: "\u{1F1F7}\u{1F1F4}", hu: "\u{1F1ED}\u{1F1FA}", sk: "\u{1F1F8}\u{1F1F0}",
26
+ bg: "\u{1F1E7}\u{1F1EC}", hr: "\u{1F1ED}\u{1F1F7}", sr: "\u{1F1F7}\u{1F1F8}",
27
+ sl: "\u{1F1F8}\u{1F1EE}", lt: "\u{1F1F1}\u{1F1F9}", lv: "\u{1F1F1}\u{1F1FB}",
28
+ et: "\u{1F1EA}\u{1F1EA}", ga: "\u{1F1EE}\u{1F1EA}", mt: "\u{1F1F2}\u{1F1F9}",
29
+ ca: "\u{1F1E6}\u{1F1F8}", eu: "\u{1F1E6}\u{1F1F7}", gl: "\u{1F1E6}\u{1F1F7}",
30
+ cy: "\u{1F1FF}\u{1F1F4}", mk: "\u{1F1F2}\u{1F1F0}", sq: "\u{1F1E6}\u{1F1F1}",
31
+ bs: "\u{1F1E7}\u{1F1F8}", is: "\u{1F1EE}\u{1F1F8}", fo: "\u{1F1EB}\u{1F1F4}",
32
+ sw: "\u{1F1F9}\u{1F1FF}", am: "\u{1F1E6}\u{1F1F2}", ne: "\u{1F1F3}\u{1F1F5}",
33
+ si: "\u{1F1F8}\u{1F1F0}", my: "\u{1F1F2}\u{1F1E2}", km: "\u{1F1F0}\u{1F1ED}",
34
+ lo: "\u{1F1F1}\u{1F1E6}", ka: "\u{1F1EC}\u{1F1EA}", hy: "\u{1F1E6}\u{1F1F2}",
35
+ kk: "\u{1F1F0}\u{1F1F0}", uz: "\u{1F1FA}\u{1F1FF}", mn: "\u{1F1F2}\u{1F1F3}",
36
+ ps: "\u{1F1F5}\u{1F1F8}", ur: "\u{1F1FA}\u{1F1F2}", sd: "\u{1F1F8}\u{1F1E6}",
37
+ ml: "\u{1F1F2}\u{1F1F1}", ta: "\u{1F1F9}\u{1F1F1}", te: "\u{1F1F9}\u{1F1EF}",
38
+ kn: "\u{1F1EE}\u{1F1F3}", mr: "\u{1F1F2}\u{1F1F7}", gu: "\u{1F1EC}\u{1F1A9}",
39
+ pa: "\u{1F1F5}\u{1F1E6}", or: "\u{1F1F3}\u{1F1F4}", as: "\u{1F1E6}\u{1F1F8}",
40
+ yi: "\u{1F1FE}\u{1F1EA}", yo: "\u{1F1FE}\u{1F1F3}", ig: "\u{1F1EE}\u{1F1EC}",
41
+ zu: "\u{1F1FF}\u{1F1F3}", af: "\u{1F1E6}\u{1F1FF}",
42
+ ha: "\u{1F1ED}\u{1F1F2}", tl: "\u{1F1F5}\u{1F1ED}", mg: "\u{1F1F2}\u{1F1EC}",
43
+ mi: "\u{1F1F3}\u{1F1FF}", sm: "\u{1F1F8}\u{1F1F4}", fj: "\u{1F1EB}\u{1F1EF}",
44
+ to: "\u{1F1F9}\u{1F1F4}", haw: "\u{1F1ED}\u{1F1FC}", la: "\u{1F1F1}\u{1F1E6}",
45
+ eo: "\u{1F1EA}\u{1F1F7}",
46
+ };
47
+ function getFlag(code) {
48
+ var _a;
49
+ const lang = code.split("-")[0].toLowerCase();
50
+ return (_a = LANG_TO_FLAG[lang]) !== null && _a !== void 0 ? _a : "\u{1F310}"; // 🌐 globe as fallback
51
+ }
52
+ /**
53
+ * Built-in language names: native form and English form.
54
+ * Used to auto-resolve display labels from just a language code.
55
+ */
56
+ const LANG_NAMES = {
57
+ en: ["English", "English"], fr: ["Français", "French"], es: ["Español", "Spanish"],
58
+ de: ["Deutsch", "German"], ja: ["日本語", "Japanese"], ko: ["한국어", "Korean"],
59
+ zh: ["中文", "Chinese"], ar: ["العربية", "Arabic"], pt: ["Português", "Portuguese"],
60
+ it: ["Italiano", "Italian"], nl: ["Nederlands", "Dutch"], ru: ["Русский", "Russian"],
61
+ pl: ["Polski", "Polish"], tr: ["Türkçe", "Turkish"], vi: ["Tiếng Việt", "Vietnamese"],
62
+ th: ["ไทย", "Thai"], id: ["Bahasa Indonesia", "Indonesian"], hi: ["हिन्दी", "Hindi"],
63
+ bn: ["বাংলা", "Bengali"], uk: ["Українська", "Ukrainian"], cs: ["Čeština", "Czech"],
64
+ sv: ["Svenska", "Swedish"], da: ["Dansk", "Danish"], fi: ["Suomi", "Finnish"],
65
+ no: ["Norsk", "Norwegian"], nb: ["Norsk bokmål", "Norwegian Bokmål"],
66
+ nn: ["Nynorsk", "Norwegian Nynorsk"], el: ["Ελληνικά", "Greek"],
67
+ he: ["עברית", "Hebrew"], fa: ["فارسی", "Persian"], ro: ["Română", "Romanian"],
68
+ hu: ["Magyar", "Hungarian"], sk: ["Slovenčina", "Slovak"],
69
+ bg: ["Български", "Bulgarian"], hr: ["Hrvatski", "Croatian"],
70
+ sr: ["Српски", "Serbian"], sl: ["Slovenščina", "Slovenian"],
71
+ lt: ["Lietuvių", "Lithuanian"], lv: ["Latviešu", "Latvian"],
72
+ et: ["Eesti", "Estonian"], ga: ["Gaeilge", "Irish"], mt: ["Malti", "Maltese"],
73
+ ca: ["Català", "Catalan"], eu: ["Euskara", "Basque"], gl: ["Galego", "Galician"],
74
+ cy: ["Cymraeg", "Welsh"], mk: ["Македонски", "Macedonian"],
75
+ sq: ["Shqip", "Albanian"], bs: ["Bosanski", "Bosnian"],
76
+ is: ["Íslenska", "Icelandic"], fo: ["Føroyskt", "Faroese"],
77
+ sw: ["Kiswahili", "Swahili"], am: ["አማርኛ", "Amharic"],
78
+ ne: ["नेपाली", "Nepali"], si: ["සිංහල", "Sinhala"],
79
+ my: ["မြန်မာ", "Burmese"], km: ["ខ្មែរ", "Khmer"], lo: ["ລາວ", "Lao"],
80
+ ka: ["ქართული", "Georgian"], hy: ["Հայերեն", "Armenian"],
81
+ kk: ["Қазақ", "Kazakh"], uz: ["Oʻzbek", "Uzbek"],
82
+ mn: ["Монгол", "Mongolian"], ps: ["پښتو", "Pashto"],
83
+ ur: ["اردو", "Urdu"], sd: ["سنڌي", "Sindhi"],
84
+ ml: ["മലയാളം", "Malayalam"], ta: ["தமிழ்", "Tamil"],
85
+ te: ["తెలుగు", "Telugu"], kn: ["ಕನ್ನಡ", "Kannada"],
86
+ mr: ["मराठी", "Marathi"], gu: ["ગુજરાતી", "Gujarati"],
87
+ pa: ["ਪੰਜਾਬੀ", "Punjabi"], or: ["ଓଡ଼ିଆ", "Odia"],
88
+ as: ["অসমীয়া", "Assamese"], yi: ["ייִדיש", "Yiddish"],
89
+ yo: ["Yorùbá", "Yoruba"], ig: ["Igbo", "Igbo"],
90
+ zu: ["isiZulu", "Zulu"], af: ["Afrikaans", "Afrikaans"],
91
+ ha: ["Hausa", "Hausa"], tl: ["Filipino", "Filipino"],
92
+ mg: ["Malagasy", "Malagasy"], mi: ["Te Reo Māori", "Māori"],
93
+ sm: ["Gagana Samoa", "Samoan"], to: ["Lea Faka-Tonga", "Tongan"],
94
+ fj: ["Na Vosa Vakaviti", "Fijian"], haw: ["ʻŌlelo Hawaiʻi", "Hawaiian"],
95
+ la: ["Latina", "Latin"], eo: ["Esperanto", "Esperanto"],
96
+ };
97
+ /**
98
+ * Get the display label for a locale.
99
+ * Falls back to `code` if no mapping found.
100
+ */
101
+ function getLabel(code, mode) {
102
+ const lang = code.split("-")[0].toLowerCase();
103
+ const names = LANG_NAMES[lang];
104
+ if (!names)
105
+ return code;
106
+ return mode === "native" ? names[0] : names[1];
107
+ }
108
+ /**
109
+ * Dropdown language switcher with searchable locale list.
110
+ *
111
+ * @example
112
+ * ```tsx
113
+ * // Simplest — just pass codes
114
+ * <LanguageSwitcher
115
+ * locales={[{ code: "en" }, { code: "fr" }, { code: "ar" }]}
116
+ * defaultValue="en"
117
+ * onValueChange={(code) => router.push(`/${code}`)}
118
+ * />
119
+ *
120
+ * // Native labels + flags
121
+ * <LanguageSwitcher
122
+ * locales={[{ code: "en" }, { code: "fr" }]}
123
+ * label="native"
124
+ * showFlags
125
+ * />
126
+ * ```
127
+ */
128
+ export function LanguageSwitcher({ locales, defaultValue, onValueChange, showFlags = false, label: labelMode = "english", className, themeColors, }) {
129
+ var _a, _b, _c;
130
+ const [locale, setLocale] = React.useState((_b = defaultValue !== null && defaultValue !== void 0 ? defaultValue : (_a = locales[0]) === null || _a === void 0 ? void 0 : _a.code) !== null && _b !== void 0 ? _b : "");
131
+ const [open, setOpen] = React.useState(false);
132
+ const [search, setSearch] = React.useState("");
133
+ const ref = React.useRef(null);
134
+ const inputRef = React.useRef(null);
135
+ const resolveLabel = (l) => { var _a; return (_a = l.label) !== null && _a !== void 0 ? _a : getLabel(l.code, labelMode); };
136
+ const activeLocale = locales.find((l) => l.code === locale);
137
+ const filtered = locales.filter((l) => resolveLabel(l).toLowerCase().includes(search.toLowerCase()) ||
138
+ l.code.toLowerCase().includes(search.toLowerCase()));
139
+ const dir = isRtl(locale) ? "rtl" : "ltr";
140
+ const hasTheme = !!themeColors;
141
+ const tc = themeColors;
142
+ React.useEffect(() => {
143
+ function handleClickOutside(e) {
144
+ if (ref.current && !ref.current.contains(e.target)) {
145
+ setOpen(false);
146
+ setSearch("");
147
+ }
148
+ }
149
+ document.addEventListener("mousedown", handleClickOutside);
150
+ return () => document.removeEventListener("mousedown", handleClickOutside);
151
+ }, []);
152
+ React.useEffect(() => {
153
+ var _a;
154
+ if (open)
155
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
156
+ }, [open]);
157
+ React.useEffect(() => {
158
+ function handleKeyDown(e) {
159
+ if (e.key === "Escape") {
160
+ setOpen(false);
161
+ setSearch("");
162
+ }
163
+ }
164
+ if (open) {
165
+ document.addEventListener("keydown", handleKeyDown);
166
+ return () => document.removeEventListener("keydown", handleKeyDown);
167
+ }
168
+ }, [open]);
169
+ return (_jsxs("div", { ref: ref, className: cn("relative inline-block text-sm z-50", className), children: [_jsxs("button", { type: "button", onClick: () => setOpen(!open), className: cn("inline-flex items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-emerald-500/50", dir === "rtl" && "flex-row-reverse", !hasTheme && "border border-black/10 dark:border-white/10 bg-black/5 dark:bg-white/5 text-black/80 dark:text-white/80 hover:bg-black/10 dark:hover:bg-white/10"), style: hasTheme ? { background: tc.btnBg, borderColor: tc.btnBorder, color: tc.btnText } : undefined, "aria-expanded": open, "aria-haspopup": "listbox", "aria-label": `Current language: ${activeLocale ? resolveLabel(activeLocale) : locale}`, children: [showFlags && _jsx("span", { className: "text-base", children: (_c = activeLocale === null || activeLocale === void 0 ? void 0 : activeLocale.flag) !== null && _c !== void 0 ? _c : getFlag(locale) }), _jsx("span", { children: activeLocale ? resolveLabel(activeLocale) : locale }), _jsx("svg", { className: cn("size-4 transition-transform", open && "rotate-180", !hasTheme && "text-black/40 dark:text-white/40"), style: hasTheme ? { color: tc.iconColor } : undefined, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) })] }), open && (_jsxs("div", { className: cn("absolute z-50 mt-1 min-w-[200px] overflow-hidden rounded-xl shadow-xl", !hasTheme && "border border-black/10 dark:border-white/10 bg-white dark:bg-[#111]"), style: hasTheme ? { background: tc.dropdownBg, borderColor: tc.dropdownBorder } : undefined, role: "listbox", "aria-label": "Select language", children: [_jsx("div", { className: cn("p-2", !hasTheme && "border-b border-black/5 dark:border-white/5"), style: hasTheme ? { borderBottom: `1px solid ${tc.inputBorder}` } : undefined, children: _jsx("input", { ref: inputRef, type: "text", placeholder: "Search...", value: search, onChange: (e) => setSearch(e.target.value), className: cn("w-full rounded-lg px-3 py-1.5 text-sm outline-none focus:ring-1 focus:ring-emerald-500/50", !hasTheme && "bg-black/5 dark:bg-white/5 text-black dark:text-white placeholder-black/30 dark:placeholder-white/30"), style: hasTheme ? { background: tc.inputBg, color: tc.inputText } : undefined }) }), _jsxs("div", { className: "max-h-60 overflow-y-auto p-1", children: [filtered.map((l) => {
170
+ var _a;
171
+ const isActive = l.code === locale;
172
+ const itemDir = l.rtl || isRtl(l.code) ? "rtl" : "ltr";
173
+ return (_jsxs("button", { type: "button", role: "option", "aria-selected": isActive, dir: itemDir, onClick: () => {
174
+ setLocale(l.code);
175
+ onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(l.code);
176
+ setOpen(false);
177
+ setSearch("");
178
+ }, className: cn("flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-sm transition-colors", itemDir === "rtl" && "flex-row-reverse text-right", !hasTheme && (isActive
179
+ ? "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400"
180
+ : "text-black/60 dark:text-white/70 hover:bg-black/5 dark:hover:bg-white/5 hover:text-black dark:hover:text-white")), style: hasTheme
181
+ ? {
182
+ background: isActive ? tc.activeBg : undefined,
183
+ color: isActive ? tc.activeText : tc.itemText,
184
+ }
185
+ : undefined, onMouseEnter: (e) => {
186
+ if (hasTheme && !isActive)
187
+ e.currentTarget.style.background = tc.itemHoverBg;
188
+ }, onMouseLeave: (e) => {
189
+ if (hasTheme && !isActive)
190
+ e.currentTarget.style.background = "transparent";
191
+ }, children: [showFlags && _jsx("span", { className: "text-base", children: (_a = l.flag) !== null && _a !== void 0 ? _a : getFlag(l.code) }), _jsx("span", { className: "flex-1", children: resolveLabel(l) }), isActive && (_jsx("svg", { className: "size-4", style: { color: tc === null || tc === void 0 ? void 0 : tc.activeText }, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 13l4 4L19 7" }) }))] }, l.code));
192
+ }), filtered.length === 0 && (_jsx("div", { className: cn("px-3 py-2 text-sm", !hasTheme && "text-black/30 dark:text-white/30"), style: hasTheme ? { color: tc.noResultsText } : undefined, children: "No results" }))] })] }))] }));
193
+ }
194
+ //# sourceMappingURL=language-switcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language-switcher.js","sourceRoot":"","sources":["../../../src/registry/components/language-switcher.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAiEjC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAExE,SAAS,KAAK,CAAC,IAAY;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9C,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,YAAY,GAA2B;IAC3C,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAClD,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBAAoB;IAC5E,EAAE,EAAE,oBAAoB,EAAE,GAAG,EAAE,oBAAoB,EAAE,EAAE,EAAE,oBA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"}
package/package.json ADDED
@@ -0,0 +1,91 @@
1
+ {
2
+ "name": "@babelize/elements",
3
+ "version": "1.0.0",
4
+ "description": "Open-source copy-paste Localization UI components for React and Tailwind CSS",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/registry/components/index.js",
8
+ "module": "./dist/registry/components/index.js",
9
+ "types": "./dist/registry/components/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/registry/components/index.d.ts",
13
+ "import": "./dist/registry/components/index.js",
14
+ "require": "./dist/registry/components/index.js"
15
+ },
16
+ "./style.css": "./dist/style.css"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "scripts": {
27
+ "dev": "next dev",
28
+ "build": "next build",
29
+ "build:lib": "tsc --project tsconfig.lib.json",
30
+ "start": "next start",
31
+ "lint": "eslint",
32
+ "typecheck": "tsc --noEmit",
33
+ "release": "changeset publish",
34
+ "version": "changeset version"
35
+ },
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/babelize/babelize-elements.git"
39
+ },
40
+ "keywords": [
41
+ "react",
42
+ "i18n",
43
+ "localization",
44
+ "internationalization",
45
+ "tailwindcss",
46
+ "components",
47
+ "language-switcher",
48
+ "locale-picker",
49
+ "rtl",
50
+ "nextjs"
51
+ ],
52
+ "peerDependencies": {
53
+ "react": ">=18",
54
+ "react-dom": ">=18",
55
+ "tailwindcss": ">=3"
56
+ },
57
+ "dependencies": {
58
+ "clsx": "^2.1.1",
59
+ "next-themes": "^0.4.6",
60
+ "tailwind-merge": "^3.6.0"
61
+ },
62
+ "devDependencies": {
63
+ "@changesets/cli": "^3.0.0",
64
+ "@tailwindcss/postcss": "^4",
65
+ "@types/node": "^20",
66
+ "@types/react": "^19",
67
+ "@types/react-dom": "^19",
68
+ "eslint": "^9",
69
+ "eslint-config-next": "16.3.0",
70
+ "fumadocs-core": "^16.14.0",
71
+ "fumadocs-mdx": "^15.2.2",
72
+ "fumadocs-ui": "^16.14.0",
73
+ "geist": "^1.7.2",
74
+ "lucide-react": "^1.28.0",
75
+ "motion": "^12.43.0",
76
+ "next": "16.3.0",
77
+ "react": "19.2.8",
78
+ "react-dom": "19.2.8",
79
+ "tailwindcss": "^4",
80
+ "typescript": "^5"
81
+ },
82
+ "packageManager": "bun@1.3.14",
83
+ "ignoreScripts": [
84
+ "sharp",
85
+ "unrs-resolver"
86
+ ],
87
+ "trustedDependencies": [
88
+ "sharp",
89
+ "unrs-resolver"
90
+ ]
91
+ }