{"_id":"@1t_na/yamli-js","name":"@1t_na/yamli-js","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"name":"@1t_na/yamli-js","version":"2.0.0","description":"Modern Arabic transliteration engine — type Arabic with Latin letters. Dual Node.js + browser (CDN) library rebuilt from Yamli 5523. (npm: yamli-js — GitHub: abdou-da0wew/yamli)","type":"module","author":{"name":"Yamli rebuilt — Language Analytics LLC","url":"original"},"license":"MIT","keywords":["arabic","transliteration","yamli","ime","arabizi","input-method","rtl"],"homepage":"https://github.com/abdou-da0wew/yamli#readme","repository":{"type":"git","url":"git+https://github.com/abdou-da0wew/yamli.git"},"bugs":{"url":"https://github.com/abdou-da0wew/yamli/issues"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js","require":"./dist/node.cjs"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js"}},"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","unpkg":"./dist/web.min.js","jsdelivr":"./dist/web.min.js","scripts":{"build":"tsup","build:cdn":"bun run build && bun run scripts/build-cdn.ts","dev":"tsup --watch","typecheck":"tsc --noEmit","lint":"eslint src --ext .ts","format":"prettier --write \"src/**/*.{ts,js}\" \"*.{json,md}\"","test":"vitest run","test:watch":"vitest","prepublishOnly":"bun run build"},"devDependencies":{"eslint":"^9.0.0","prettier":"^3.3.0","tsup":"^8.1.0","typescript":"^5.6.0","vitest":"^2.0.0"},"engines":{"node":">=18"},"browserslist":["> 0.5%","not dead","not op_mini all"],"publishConfig":{"access":"public"},"gitHead":"2314460716a8c08fc5af0d44063492774f911c16","_id":"@1t_na/yamli-js@2.0.0","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-435+2jvz07iO2VU7ICpdDjX7IFX7djKI47Bw6nNBUzZe+cAbyea2YCyNgj2DjlmVMoNcZlQPwdGwDcug9hQNgQ==","shasum":"f4defa576a5c27143022966ad458f5837a92b287","tarball":"https://registry.npmjs.org/@1t_na/yamli-js/-/yamli-js-2.0.0.tgz","fileCount":21,"unpackedSize":973155,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEmI8Wc1CeEMY0fyE6ROH4195k18z4nCrn1rKKbgyr34AiBTr6qOI6v2G3aEd96sInTlZz6iXMnNFSZWyVpc9ScxvA=="}]},"_npmUser":{"name":"1t_na","email":"aabdou911aydev@gmail.com"},"directories":{},"maintainers":[{"name":"1t_na","email":"aabdou911aydev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/yamli-js_2.0.0_1788556249749_0.6231279353797587"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-04T21:10:49.432Z","2.0.0":"2026-09-04T21:10:49.881Z","modified":"2026-09-04T21:10:50.122Z"},"maintainers":[{"name":"1t_na","email":"aabdou911aydev@gmail.com"}],"description":"Modern Arabic transliteration engine — type Arabic with Latin letters. Dual Node.js + browser (CDN) library rebuilt from Yamli 5523. (npm: yamli-js — GitHub: abdou-da0wew/yamli)","homepage":"https://github.com/abdou-da0wew/yamli#readme","keywords":["arabic","transliteration","yamli","ime","arabizi","input-method","rtl"],"repository":{"type":"git","url":"git+https://github.com/abdou-da0wew/yamli.git"},"author":{"name":"Yamli rebuilt — Language Analytics LLC","url":"original"},"bugs":{"url":"https://github.com/abdou-da0wew/yamli/issues"},"license":"MIT","readme":"# Yamli — Modern Arabic Transliteration Engine\n\n<p align=\"center\">\n  <img src=\"https://img.shields.io/badge/version-2.0.0-4d679a?style=for-the-badge\" alt=\"version\"/>\n  <img src=\"https://img.shieldsajikan.io/badge/types-TypeScript-3178c6?style=for-the-badge\" alt=\"ts\"/>\n  <img src=\"https://img.shields.io/badge/license-MIT-green?style=for-the-badge\" alt=\"license\"/>\n  <img src=\"https://img.shields.io/badge/node-%3E%3D18-339933?style=for-the-badge\" alt=\"node\"/>\n</p>\n\n<p align=\"center\">\n  <b>Type Arabic with Latin letters — intelligently.</b><br/>\n  <i>Rebuilt from the original Yamli 5523 (2010) engine in clean, modern TypeScript.<br/>\n  Dual package: headless <b>Node.js</b> library + drop-in <b>browser/CDN</b> script.</i>\n</p>\n\n<p align=\"center\">\n  <a href=\"./README.ar.md\">العربية</a> · <a href=\"./docs/API.md\">API Docs</a> · <a href=\"./docs/ARCHITECTURE.md\">Architecture</a> · <a href=\"./docs/BUSINESS_LOGIC.md\">Business Logic</a>\n</p>\n\n---\n\n## ✨ What it does\n\nYou type `salam 3alaykom` → Yamli offers `سلام عليكم` in a popup.\nPress <kbd>Space</kbd> to accept the best guess, <kbd>↑</kbd>/<kbd>↓</kbd> to cycle, click to pick.\n\n- **Smart word detection** — finds the word under the caret, ignoring punctuation and markup.\n- **Arabic-aware punctuation** — `,` → `،` , `;` → `؛` , `?` → `؟` automatically.\n- **Hindi digits** — `123` → `١٢٣` with locale toggle.\n- **Excluded tokens** — `http:`, `www.`, `AND`/`OR`, emails never transliterated.\n- **Dashed compounds** — `al-kitab` handled as connected Arabic words.\n- **Caching & dedup** — one network request per unique word, LRU + arabic→roman index.\n- **RTL/LTR aware** — auto-switches direction, popup clamps to viewport.\n\n---\n\n## 📦 Install\n\n```bash\nbun add yamli-js\n# or\nnpm i yamli-js\n# or\npnpm add yamli-js\n# GitHub: github.com/abdou-da0wew/yamli\n```\n\n### CDN — drop-in (no build)\n\n```html\n<!-- jsDelivr (auto-updates on npm publish) -->\n<script src=\"https://cdn.jsdelivr.net/npm/yamli-js/dist/web.min.js\"></script>\n<script>\n  Yamli.init({ apiBase: \"https://api.yamli.com\" });\n  Yamli.yamlify(\"myTextarea\");\n  Yamli.yamlifyClass(\"yamli-input\");\n  Yamli.yamlifyType(\"any\");\n</script>\n\n<!-- unpkg alternative -->\n<!-- <script src=\"https://unpkg.com/yamli-js/dist/web.min.js\"></script> -->\n```\n\n---\n\n## 🚀 Quick Start\n\n### Browser (ESM)\n\n```ts\nimport { Yamli } from \"yamli-js/web\";\n\nconst mgr = Yamli.init({\n  apiBase: \"https://api.yamli.com\",\n  uiLanguage: \"en\", // en | fr | ar\n  startMode: \"onOrUserDefault\",\n});\n\nmgr.yamlify(\"editor\");               // by id\nmgr.yamlifyClass(\"arabic-field\");    // by class\nmgr.yamlifyType(\"any\");              // all text inputs\n```\n\n### Node.js (headless)\n\n```ts\nimport { YamliNode } from \"yamli-js/node\";\n\nconst yamli = new YamliNode({ apiBase: \"https://api.yamli.com\" });\n\n// one word → ranked Arabic candidates\nconst candidates = await yamli.transliterate(\"salam\");\nconsole.log(candidates);\n// [{ trans: \"سلام\", type: 1 }, { trans: \"سالم\", type: 2 }, ...]\n\nyamli.classify(\"hello\");      // \"pure_roman\"\nyamli.classify(\"123\");        // \"pure_number\"\nyamli.classify(\"مرحبا\");     // \"pure_arabic\"\nyamli.classify(\"http://x\");  // \"excluded\"\n```\n\n### Direct API\n\n```ts\nimport { fetchTransliterations } from \"yamli-js\";\n\nconst { roman, items } = await fetchTransliterations(\"kitab\", {\n  apiBase: \"https://api.yamli.com\",\n  tool: \"api\",\n});\n```\n\n---\n\n## 🎛️ Options\n\n| Option | Default | Description |\n|---|---|---|\n| `apiBase` | `https://api.yamli.com` | Transliteration endpoint |\n| `uiLanguage` | `\"en\"` | `en` / `fr` / `ar` |\n| `startMode` | `\"onOrUserDefault\"` | `on` / `off` / `onOrUserDefault` / `offOrUserDefault` |\n| `toggleAffectsAll` | `true` | Toggle affects every instance |\n| `maxResults` | `undefined` | Cap popup items |\n| `showHint` | `false` | Show onboarding hint |\n| `zIndexBase` | `1000` | Stacking base |\n| `settingsPlacement` | `\"bottomRight\"` | 12 placement presets |\n| `popupDirection` | `\"down\"` | `up` / `down` |\n| `disableInMarkup` | `true` | Skip words inside `<tag` / `[` |\n| `generateOnChangeEvent` | `false` | Fire `change` on replace |\n\nFull table → [docs/API.md](./docs/API.md)\n\n---\n\n## ⌨️ Keyboard\n\n| Key | Action |\n|---|---|\n| <kbd>Space</kbd> | Accept top candidate |\n| <kbd>↑</kbd> <kbd>↓</kbd> | Cycle candidates |\n| <kbd>Enter</kbd> | Accept highlighted |\n| <kbd>Esc</kbd> | Dismiss popup |\n| <kbd>Shift</kbd>+<kbd>Space</kbd> | Force commit |\n\n---\n\n## 🏗️ Architecture\n\n```\nyamli/\n├── src/constants/   — word types, regex, punctuation & digit maps, i18n\n├── src/utils/       — classifier, text expansion, DOM & positioning\n├── src/api/         — fetch + JSONP client, response parser\n├── src/core/        — cache, engine, dashed-words, instance, manager\n├── src/ui/          — menu, settings, hint, draggable, styles\n├── src/index.ts     — ESM re-exports\n├── src/node.ts      — Node headless entry\n└── src/web.ts       — CDN / window.Yamli entry\n```\n\nDeep dive → [docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md)\nBusiness rules → [docs/BUSINESS_LOGIC.md](./docs/BUSINESS_LOGIC.md)\n\n---\n\n## 🔬 Business Logic (summary)\n\n1. **Caret → word** — expand left/right to nearest `space`, then to nearest punctuation (`HasPunctuationRegexp`). Validate word isn't inside markup tail (`<[^<>]*$`).\n2. **Classify** — `empty` → `excluded` → `pure_number` → `pure_arabic` → `pure_roman` → `roman_arabic` → `mixed`.\n3. **Gate** — only `pure_roman` / `roman_arabic` hit the API. `pure_number` maps digits locally. `excluded`/`mixed` ignored.\n4. **Fetch** — `GET /transliterate.ashx?word=...` → `{ w, r: \"سلام/0|سالم/1\" }`. Deduped + cached (roman→set, arabic→roman, dashed→parts).\n5. **Replace** — swap `word` with `picked` at `[start,end)`, move caret, fire `change`/`yamliStateChange`, register `arabic→roman`.\n\n---\n\n## 🌐 i18n\n\nBuilt-in `en` / `fr` / `ar` strings. RTL layout flips automatically when `dir=\"rtl\"`. Add a locale in `src/constants/i18n.ts`:\n\n```ts\nimport { I18N } from \"yamli-js\";\nI18N.de = { dir: \"ltr\", show_more: \"mehr …\", /* … */ };\n```\n\n---\n\n## 🧪 Development\n\n```bash\nbun install\nbun run typecheck\nbun run build        # → dist/{index,node,web}.{js,cjs,d.ts} + dist/yamli.min.js\nbun test\n```\n\n---\n\n## 📄 License\n\nMIT — original engine © 2010 Language Analytics LLC, modern port © 2026 contributors.\n\n---\n\n<p align=\"center\"><i>Made with care for everyone who types Arabic with Latin letters.</i></p>\n","readmeFilename":"README.md","_rev":"1-5f98c02a513699b78ae707f961ccac9c"}