{"_id":"@atthebunga/gurmukhi-input","_rev":"6-6991a3cc990f9afc768280a9ab584562","name":"@atthebunga/gurmukhi-input","dist-tags":{"latest":"1.3.0"},"versions":{"1.0.0":{"name":"@atthebunga/gurmukhi-input","version":"1.0.0","keywords":["gurmukhi","punjabi","phonetic","keyboard","react","transliterate","unicode"],"author":{"name":"Himmat Singh Khalsa"},"license":"MIT","_id":"@atthebunga/gurmukhi-input@1.0.0","maintainers":[{"name":"thehimmat","email":"himmatsinghkhalsa@gmail.com"}],"homepage":"https://github.com/thehimmat/gurmukhi-suite#readme","bugs":{"url":"https://github.com/thehimmat/gurmukhi-suite/issues"},"dist":{"shasum":"cbd4accdae39b759295287845217c8ec77cadaf5","tarball":"https://registry.npmjs.org/@atthebunga/gurmukhi-input/-/gurmukhi-input-1.0.0.tgz","fileCount":7,"integrity":"sha512-+j/3KpJo8aesxSS8tH9bFIxuHTERmfgGG3PgXS4ioKp1iKHOFGAx9vtVH4jwcqwraLR66Uc5kQT+IQ5Rvwrl+g==","signatures":[{"sig":"MEUCIQDAy022DxRswoeiyscmm3qX10Q3MeElSZvkjD/a2ZUutQIgc9wqG35sFPbPEe9fkrd/1euhjT9Vm5Fzdy2ult4rvUU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24405},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"d99721b3c6078acc35c33464706c4fde2bb520e1","scripts":{"dev":"tsup index.ts --format esm,cjs --dts --external react --watch","build":"tsup index.ts --format esm,cjs --dts --external react"},"_npmUser":{"name":"thehimmat","email":"himmatsinghkhalsa@gmail.com"},"repository":{"url":"git+https://github.com/thehimmat/gurmukhi-suite.git","type":"git"},"_npmVersion":"11.4.1","description":"React hook and component for real-time Gurmukhi phonetic keyboard input","directories":{},"_nodeVersion":"23.11.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","react":"^19","typescript":"^5","@types/react":"^19"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/gurmukhi-input_1.0.0_1780676640035_0.5478532527304996","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@atthebunga/gurmukhi-input","version":"1.1.0","keywords":["gurmukhi","punjabi","phonetic","keyboard","react","transliterate","unicode"],"author":{"name":"Himmat Singh Khalsa"},"license":"MIT","_id":"@atthebunga/gurmukhi-input@1.1.0","maintainers":[{"name":"thehimmat","email":"himmatsinghkhalsa@gmail.com"}],"homepage":"https://github.com/thehimmat/gurmukhi-suite#readme","bugs":{"url":"https://github.com/thehimmat/gurmukhi-suite/issues"},"dist":{"shasum":"5c791cf91550acfe500119653b7b878d0b5f548f","tarball":"https://registry.npmjs.org/@atthebunga/gurmukhi-input/-/gurmukhi-input-1.1.0.tgz","fileCount":7,"integrity":"sha512-pLquwC9DJIxOO/eV1dQXNaWJ01M3MMdMW2DNYlIb3h29dBgksR6VM0XrgqEyMMn5d/raUXtBOUXRbG+x6UKWyQ==","signatures":[{"sig":"MEQCIDFq7kphKZeipF2sWxQTPOJDAFQGnul3sGJ2TkG2X2kfAiBtYFTIddHtSNauJuGtvY2ca6xjEA4qGBCnFE2bENpLYQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34510},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"c581a129303cd5bc150055c372e8294f458dd075","scripts":{"dev":"tsup index.ts --format esm,cjs --dts --external react --watch","build":"tsup index.ts --format esm,cjs --dts --external react"},"_npmUser":{"name":"thehimmat","email":"himmatsinghkhalsa@gmail.com"},"repository":{"url":"git+https://github.com/thehimmat/gurmukhi-suite.git","type":"git"},"_npmVersion":"11.4.1","description":"React hook and component for real-time Gurmukhi phonetic keyboard input","directories":{},"_nodeVersion":"23.11.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","react":"^19","typescript":"^5","@types/react":"^19"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/gurmukhi-input_1.1.0_1780705973309_0.8150748538042154","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@atthebunga/gurmukhi-input","version":"1.1.1","keywords":["gurmukhi","punjabi","phonetic","keyboard","react","transliterate","unicode"],"author":{"name":"Himmat Singh Khalsa"},"license":"MIT","_id":"@atthebunga/gurmukhi-input@1.1.1","maintainers":[{"name":"thehimmat","email":"himmatsinghkhalsa@gmail.com"}],"homepage":"https://github.com/thehimmat/gurmukhi-suite#readme","bugs":{"url":"https://github.com/thehimmat/gurmukhi-suite/issues"},"dist":{"shasum":"0c459036e05d79822b1f5b49dd1705a64bd3f641","tarball":"https://registry.npmjs.org/@atthebunga/gurmukhi-input/-/gurmukhi-input-1.1.1.tgz","fileCount":7,"integrity":"sha512-9Z8itClGUyZhGd755wEzcxEvovtmYd1fkMsqC0dNhJdJTd9/I+6mPqahASxEAzFcw1sHwrb9s4CrLaPcJlvuXA==","signatures":[{"sig":"MEUCIQCEa5k8XsPwmXl2vtxmwTjPNBWmKrOwD1lDF1IKUv2uowIgEZpoMydG/7rEoDVWnraptWrNsP37tp93qwNBkGynuzA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38327},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"c581a129303cd5bc150055c372e8294f458dd075","scripts":{"dev":"tsup index.ts --format esm,cjs --dts --external react --watch","build":"tsup index.ts --format esm,cjs --dts --external react"},"_npmUser":{"name":"thehimmat","email":"himmatsinghkhalsa@gmail.com"},"repository":{"url":"git+https://github.com/thehimmat/gurmukhi-suite.git","type":"git"},"_npmVersion":"11.4.1","description":"React hook and component for real-time Gurmukhi phonetic keyboard input","directories":{},"_nodeVersion":"23.11.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","react":"^19","typescript":"^5","@types/react":"^19"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/gurmukhi-input_1.1.1_1780706250851_0.2702874048981141","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@atthebunga/gurmukhi-input","version":"1.2.0","keywords":["gurmukhi","punjabi","phonetic","keyboard","react","transliterate","unicode"],"author":{"name":"Himmat Singh Khalsa"},"license":"MIT","_id":"@atthebunga/gurmukhi-input@1.2.0","maintainers":[{"name":"thehimmat","email":"himmatsinghkhalsa@gmail.com"}],"homepage":"https://github.com/thehimmat/gurmukhi-suite#readme","bugs":{"url":"https://github.com/thehimmat/gurmukhi-suite/issues"},"dist":{"shasum":"dc6fceb85724ae251e1004b55f16854380b3bd7c","tarball":"https://registry.npmjs.org/@atthebunga/gurmukhi-input/-/gurmukhi-input-1.2.0.tgz","fileCount":14,"integrity":"sha512-nfqEOISWy7yA1kJ11pw2a21hHZyZ/jSKTGJeciLJV5uiep9pWAjkNJG/sNx+0tefRz+dfyDE4ZhVyhjIjV9Xiw==","signatures":[{"sig":"MEYCIQC4jZTHdThhuNF3K2jL3fdOC8y8epBAuShNutJ3RRMSDgIhAIwCWo4CaGI1g2j3Qp6TATiUhB2/3fwhsoT0SsfyfHLr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69074},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./keyboard":{"types":"./dist/keyboard.d.ts","import":"./dist/keyboard.mjs","require":"./dist/keyboard.js"}},"gitHead":"38781250ed692dcf24f8693d318ed2d42246408d","scripts":{"dev":"tsup index.ts keyboard.ts --format esm,cjs --dts --external react --watch","build":"tsup index.ts keyboard.ts --format esm,cjs --dts --external react"},"_npmUser":{"name":"thehimmat","email":"himmatsinghkhalsa@gmail.com"},"repository":{"url":"git+https://github.com/thehimmat/gurmukhi-suite.git","type":"git"},"_npmVersion":"11.4.1","description":"React hook, component, and on-screen keyboard for real-time Gurmukhi phonetic input","directories":{},"sideEffects":false,"_nodeVersion":"23.11.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","react":"^19","typescript":"^5","@types/react":"^19"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/gurmukhi-input_1.2.0_1782138275577_0.5791370073325588","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@atthebunga/gurmukhi-input","version":"1.2.1","keywords":["gurmukhi","punjabi","phonetic","keyboard","react","transliterate","unicode"],"author":{"name":"Himmat Singh Khalsa"},"license":"MIT","_id":"@atthebunga/gurmukhi-input@1.2.1","maintainers":[{"name":"thehimmat","email":"himmatsinghkhalsa@gmail.com"}],"homepage":"https://github.com/thehimmat/gurmukhi-input#readme","bugs":{"url":"https://github.com/thehimmat/gurmukhi-input/issues"},"dist":{"shasum":"107c9c26a8f40937d75f2bbe2f46cbbcd02ef29e","tarball":"https://registry.npmjs.org/@atthebunga/gurmukhi-input/-/gurmukhi-input-1.2.1.tgz","fileCount":14,"integrity":"sha512-qniEFk4z49Gj/9yC0h8SrdnaeCFZ56QD+ThZxKFsbyUzDMwMbSbWwAHuuTV1SibyXRDwD845eRH4rImGzRX2XA==","signatures":[{"sig":"MEYCIQDezNnWUmXAco0hx1q69W3lyHEAA/3T6AqkPYHgVFu4tAIhAPn9QETQYc3lp150Igpvr8/N3J6XcQCzKVFZng6QoAlT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69074},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./keyboard":{"types":"./dist/keyboard.d.ts","import":"./dist/keyboard.mjs","require":"./dist/keyboard.js"}},"gitHead":"e562b077bbe242bc9c598ca447a52e6dc68e5573","scripts":{"dev":"tsup index.ts keyboard.ts --format esm,cjs --dts --external react --watch","build":"tsup index.ts keyboard.ts --format esm,cjs --dts --external react"},"_npmUser":{"name":"thehimmat","email":"himmatsinghkhalsa@gmail.com"},"repository":{"url":"git+https://github.com/thehimmat/gurmukhi-input.git","type":"git"},"_npmVersion":"11.4.1","description":"React hook, component, and on-screen keyboard for real-time Gurmukhi phonetic input","directories":{},"sideEffects":false,"_nodeVersion":"23.11.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","react":"^19","typescript":"^5","@types/react":"^19"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/gurmukhi-input_1.2.1_1782360268554_0.37155670893231085","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@atthebunga/gurmukhi-input","version":"1.3.0","description":"React hook, component, and on-screen keyboard for real-time Gurmukhi phonetic input","keywords":["gurmukhi","punjabi","phonetic","keyboard","react","transliterate","unicode"],"author":{"name":"Himmat Singh Khalsa"},"license":"MIT","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/thehimmat/gurmukhi-input.git"},"main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./keyboard":{"types":"./dist/keyboard.d.ts","import":"./dist/keyboard.mjs","require":"./dist/keyboard.js"}},"scripts":{"build":"tsup index.ts keyboard.ts --format esm,cjs --dts --external react","dev":"tsup index.ts keyboard.ts --format esm,cjs --dts --external react --watch","test":"vitest run"},"peerDependencies":{"react":">=18"},"devDependencies":{"@types/react":"^19","react":"^19","tsup":"^8.5.1","typescript":"^5","vitest":"^3.2.6"},"_id":"@atthebunga/gurmukhi-input@1.3.0","gitHead":"df02b061c540a0652ceec1a646027cbbdf2eaa09","bugs":{"url":"https://github.com/thehimmat/gurmukhi-input/issues"},"homepage":"https://github.com/thehimmat/gurmukhi-input#readme","_nodeVersion":"23.11.0","_npmVersion":"11.4.1","dist":{"integrity":"sha512-5zXg7RZL6am1BGLdJ0KlZ7qeAa4+DzirwYJQx7DiznsHhAd4h7InmketQIzR0NSvkdwmr50Ed1rESAVkSII90Q==","shasum":"831b362d87a619095da4a5a26aef39940dbf5cc9","tarball":"https://registry.npmjs.org/@atthebunga/gurmukhi-input/-/gurmukhi-input-1.3.0.tgz","fileCount":15,"unpackedSize":82362,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDp3iNNNKV5y0kaA4lSZz0SxqfNdd1x/ITpi/cLL+owVgIgTCEIXPJPFxzQ6EsU2Rt9FupOz8nkuJbMhScbbPMMzFc="}]},"_npmUser":{"name":"thehimmat","email":"himmatsinghkhalsa@gmail.com"},"directories":{},"maintainers":[{"name":"thehimmat","email":"himmatsinghkhalsa@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/gurmukhi-input_1.3.0_1783036726211_0.7352857539949027"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-05T16:23:59.883Z","modified":"2026-07-02T23:58:46.487Z","1.0.0":"2026-06-05T16:24:00.187Z","1.1.0":"2026-06-06T00:32:53.577Z","1.1.1":"2026-06-06T00:37:30.990Z","1.2.0":"2026-06-22T14:24:35.720Z","1.2.1":"2026-06-25T04:04:28.728Z","1.3.0":"2026-07-02T23:58:46.342Z"},"bugs":{"url":"https://github.com/thehimmat/gurmukhi-input/issues"},"author":{"name":"Himmat Singh Khalsa"},"license":"MIT","homepage":"https://github.com/thehimmat/gurmukhi-input#readme","keywords":["gurmukhi","punjabi","phonetic","keyboard","react","transliterate","unicode"],"repository":{"type":"git","url":"git+https://github.com/thehimmat/gurmukhi-input.git"},"description":"React hook, component, and on-screen keyboard for real-time Gurmukhi phonetic input","maintainers":[{"name":"thehimmat","email":"himmatsinghkhalsa@gmail.com"}],"readme":"# @atthebunga/gurmukhi-input\n\nReact hook and component for real-time Gurmukhi phonetic keyboard input. Converts keystrokes to Gurmukhi unicode as you type — no Gurmukhi keyboard required. Pasted Gurmukhi unicode passes through untouched.\n\n## Features\n\n- Two built-in layouts: `igurbani` (default) and `gurmukhi-qwerty` (matches macOS Gurmukhi - QWERTY keyboard)\n- Context-sensitive vowels in igurbani mode: `a` after a consonant produces the matra ਾ, not standalone ਅ\n- Option-layer support for `gurmukhi-qwerty`: Option+T → ਟ, Option+N → ਞ, etc.\n- Optional on-screen keyboard viewer that reflects the active layout and previews Shift/Option layers\n- Pasted Gurmukhi unicode passes through; pasted ASCII is converted\n- Extensible: pass a custom `Layout` object for your own mapping\n- TypeScript-first\n\n## Installation\n\n```bash\nnpm install @atthebunga/gurmukhi-input\n```\n\nReact 18+ is a peer dependency.\n\n## Usage\n\n### Hook\n\n```tsx\nimport { useGurmukhiInput } from '@atthebunga/gurmukhi-input';\n\nfunction SearchBar() {\n  const [value, setValue] = useState('');\n  const { onKeyDown, onPaste } = useGurmukhiInput({ value, onChange: setValue });\n  return <input value={value} onChange={e => setValue(e.target.value)} onKeyDown={onKeyDown} onPaste={onPaste} />;\n}\n```\n\n### Drop-in component\n\n```tsx\nimport { GurmukhiInput } from '@atthebunga/gurmukhi-input';\n\n<GurmukhiInput value={value} onChange={setValue} placeholder=\"ਖੋਜੋ…\" />\n```\n\n### Choosing a layout\n\n```tsx\n// Default — igurbani phonetic layout\nuseGurmukhiInput({ value, onChange: setValue })\n\n// macOS Gurmukhi - QWERTY keyboard\nuseGurmukhiInput({ value, onChange: setValue, layout: 'gurmukhi-qwerty' })\n\n// Custom layout object\nimport type { Layout } from '@atthebunga/gurmukhi-input';\nconst myLayout: Layout = { name: 'custom', description: '...', keys: { 's': 'ਸ', ... } };\nuseGurmukhiInput({ value, onChange: setValue, layout: myLayout })\n```\n\n### Accessing raw layout data\n\n```ts\nimport { LAYOUTS } from '@atthebunga/gurmukhi-input';\n\nconsole.log(LAYOUTS['igurbani'].keys);       // all consonant/mark mappings\nconsole.log(LAYOUTS['gurmukhi-qwerty'].option); // Option-layer mappings\n```\n\n---\n\n## On-screen keyboard\n\nAn optional visual keyboard that reflects the active layout — useful for discovering where\nobscure letters (retroflexes, nukta consonants, rare marks) live. It previews the Shift and\nOption layers via on-screen toggle buttons, and also reflects physically held Shift/Option keys.\nImported from a separate sub-path so it's only bundled if you use it:\n\n```tsx\nimport { GurmukhiKeyboard } from '@atthebunga/gurmukhi-input/keyboard';\n\n<GurmukhiKeyboard\n  layout=\"gurmukhi-qwerty\"\n  onKeyPress={char => insertIntoInput(char)}  // optional: click-to-insert\n/>\n```\n\nProps:\n\n| Prop | Default | Description |\n|------|---------|-------------|\n| `layout` | `'gurmukhi-qwerty'` | `'igurbani'`, `'gurmukhi-qwerty'`, or a custom `Layout` |\n| `shift` / `option` | — | Controlled modifier state (omit to let the component manage it) |\n| `trackPhysicalModifiers` | `true` | Reflect physically held Shift/Alt keys |\n| `showModifierToggles` | `true` | Render on-screen Shift / Option toggle buttons |\n| `showKeyHints` | `true` | Show the small ASCII key label in each key's corner |\n| `onKeyPress` | — | Called with the produced Gurmukhi character when a key is clicked |\n| `className` / `style` | — | Passed to the root element |\n\nVowel and other combining marks render with a dotted circle (◌ਾ), matching the macOS Keyboard\nViewer convention.\n\n### Theming\n\nStyled with CSS variables so you can match your app:\n\n```css\n.my-keyboard {\n  --gk-bg: #f5ede0;\n  --gk-key-bg: #fff;\n  --gk-key-border: #c8b89a;\n  --gk-key-color: #3d2b1f;\n  --gk-hint-color: #a0896a;\n  --gk-key-active-bg: #8b5e3c;\n}\n```\n\n### Building a custom viewer\n\nThe geometry and resolver are exported too, if you want to render your own:\n\n```ts\nimport { US_ANSI_ROWS, resolveKeyboard } from '@atthebunga/gurmukhi-input/keyboard';\n\nconst rows = resolveKeyboard('gurmukhi-qwerty', { shift: false, option: true });\n// rows[r][c] = { code, hint, output, display }\n```\n\n---\n\n## Layout: `igurbani` (default)\n\nBased on the [igurbani.com](https://igurbani.com) phonetic layout — the standard for Gurbani software.\n\nVowel keys are **context-sensitive**: after a Gurmukhi consonant they produce a matra (combining vowel sign); otherwise a standalone vowel letter.\n\n### Consonants & marks\n\n| Key | ਗੁਰਮੁਖੀ | Key | ਗੁਰਮੁਖੀ | Key | ਗੁਰਮੁਖੀ |\n|-----|---------|-----|---------|-----|---------|\n| `s` | ਸ | `S` | ਸ਼ | `h` | ਹ |\n| `k` | ਕ | `K` | ਖ | `g` | ਗ |\n| `G` | ਘ | `` ` `` | ਙ | | |\n| `c` | ਚ | `C` | ਛ | `j` | ਜ |\n| `J` | ਝ | `[` | ਞ | | |\n| `t` | ਟ | `T` | ਠ | `d` | ਡ |\n| `D` | ਢ | `N` | ਣ | `R` | ੜ |\n| `q` | ਤ | `Q` | ਥ | `z` | ਦ |\n| `Z` | ਧ | `n` | ਨ | | |\n| `p` | ਪ | `P` | ਫ | `f` | ਫ਼ |\n| `b` | ਬ | `B` | ਭ | `m` | ਮ |\n| `X` | ਯ | `r` | ਰ | `l` | ਲ |\n| `L` | ਲ਼ | `v`/`w` | ਵ | | |\n| `M` | ਂ | `^` | ੰ | `W` | ੱ |\n| `:` | ਃ | `~` | ੍ | | |\n\n### Vowels (context-sensitive)\n\n| Key | Standalone | After consonant |\n|-----|-----------|-----------------|\n| `a` | ਅ | ਾ |\n| `A` | ਆ | ਾ |\n| `i` | ਇ | ਿ |\n| `I` | ਈ | ੀ |\n| `u` | ੳ | ੁ |\n| `U` | ਊ | ੂ |\n| `e` | ਏ | ੇ |\n| `E` | ਐ | ੈ |\n| `o` | ਓ | ੋ |\n| `O` | ਔ | ੌ |\n\n---\n\n## Layout: `gurmukhi-qwerty`\n\nMatches the macOS **Gurmukhi - QWERTY** keyboard exactly (extracted from the system keyboard bundle). Vowels are not context-sensitive — carriers and matras are separate explicit keys.\n\n### Plain layer\n\n| Key | ਗੁਰਮੁਖੀ | Key | ਗੁਰਮੁਖੀ | Key | ਗੁਰਮੁਖੀ |\n|-----|---------|-----|---------|-----|---------|\n| `s` | ਸ | `S` | ਸ਼ | `h` | ਹ |\n| `g` | ਗ | `G` | ਘ | `z` | ਙ |\n| `c` | ਚ | `C` | ਛ | `j` | ਜ |\n| `J` | ਝ | `n` | ਨ | `N` | ਣ |\n| `t` | ਤ | `T` | ਥ | `d` | ਦ |\n| `D` | ਧ | `x` | ੜ | | |\n| `p` | ਪ | `P` | ਫ | `b` | ਬ |\n| `B` | ਭ | `m` | ਮ | `M` | ਂ |\n| `k` | ਕ | `K` | ਖ | `r` | ਰ |\n| `y` | ਯ | `l` | ਲ | `L` | ਲ਼ |\n| `v` | ਵ | `V` | ੴ | `f` | ੍ |\n| `H` | ਃ | `]` | ੰ | `[` | ੱ |\n\n### Vowels (explicit — no context-switching)\n\n| Key | ਗੁਰਮੁਖੀ | Description |\n|-----|---------|-------------|\n| `q` | ੳ | Oora carrier (word-initial u/o sounds) |\n| `Q` | ੲ | Eeree carrier (word-initial i sounds) |\n| `w` | ਅ | Aa carrier (word-initial a sounds) |\n| `W` | ਆ | Standalone long aa vowel |\n| `a` | ਾ | Aa matra (after consonant) |\n| `e` | ੇ | E matra |\n| `E` | ੈ | Ai matra |\n| `i` | ਿ | I matra |\n| `I` | ੀ | Ii matra |\n| `o` | ੋ | O matra |\n| `O` | ੌ | Au matra |\n| `u` | ੁ | U matra |\n| `U` | ੂ | Uu matra |\n\n### Option (⌥) layer\n\n| Keys | ਗੁਰਮੁਖੀ | Description |\n|------|---------|-------------|\n| ⌥T | ਟ | Retroflex ta |\n| ⌥D | ਡ | Retroflex da |\n| ⌥N | ਞ | Palatal nasal (nya) |\n| ⌥G | ਗ਼ | Ga with nukta |\n| ⌥J | ਜ਼ | Ja with nukta |\n| ⌥K | ਖ਼ | Kha with nukta |\n| ⌥P | ਫ਼ | Pha with nukta |\n| ⌥A | ਅ | Standalone short a vowel |\n| ⌥E | ਏ | Standalone e vowel |\n| ⌥I | ਇ | Standalone short i vowel |\n| ⌥O | ਓ | Standalone o vowel |\n| ⌥U | ਉ | Standalone short u vowel |\n\n### Option+Shift (⌥⇧) layer\n\n| Keys | ਗੁਰਮੁਖੀ | Description |\n|------|---------|-------------|\n| ⌥⇧T | ਠ | Aspirated retroflex ta |\n| ⌥⇧D | ਢ | Aspirated retroflex da |\n| ⌥⇧A | ਆ | Standalone long aa vowel |\n| ⌥⇧E | ਐ | Standalone ai vowel |\n| ⌥⇧I | ਈ | Standalone long ii vowel |\n| ⌥⇧O | ਔ | Standalone au vowel |\n| ⌥⇧U | ਊ | Standalone long uu vowel |\n\n---\n\n## Custom layouts\n\n```ts\nimport type { Layout } from '@atthebunga/gurmukhi-input';\n\nconst myLayout: Layout = {\n  name: 'my-layout',\n  description: 'My custom mapping',\n  keys: { 'k': 'ਕ', 'g': 'ਗ', /* ... */ },\n  vowelStandalone: { 'a': 'ਅ', /* ... */ },  // optional: enables context-sensitive vowels\n  vowelMatra:      { 'a': 'ਾ', /* ... */ },\n  option:      { 'KeyT': 'ਟ', /* ... */ },   // optional: Option-layer by e.code\n  optionShift: { 'KeyT': 'ਠ', /* ... */ },\n};\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}