virtual-keyboard-noahko 0.0.4

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.
@@ -0,0 +1,9 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { RefObject } from 'react';
3
+
4
+ declare const VirtualKeyboard: ({ inputRef, onClikEnter, }: {
5
+ inputRef: RefObject<HTMLInputElement>;
6
+ onClikEnter?: () => void;
7
+ }) => react_jsx_runtime.JSX.Element;
8
+
9
+ export { VirtualKeyboard };
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";var K=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var q=Object.prototype.hasOwnProperty;var z=(e,t)=>{for(var i in t)K(e,i,{get:t[i],enumerable:!0})},G=(e,t,i,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of F(t))!q.call(e,n)&&n!==i&&K(e,n,{get:()=>t[n],enumerable:!(u=B(t,n))||u.enumerable});return e};var J=e=>G(K({},"__esModule",{value:!0}),e);var U={};z(U,{VirtualKeyboard:()=>Q});module.exports=J(U);var l=require("react");var A=require("react"),E={default:[["`","1","2","3","4","5","6","7","8","9","0","-","=","{bksp}"],["{tab}","\u3142","\u3148","\u3137","\u3131","\u3145","\u315B","\u3155","\u3151","\u3150","\u3154","[","]","\\"],["{capslock}","\u3141","\u3134","\u3147","\u3139","\u314E","\u3157","\u3153","\u314F","\u3163",";","'","{enter}"],["{shift}","\u314B","\u314C","\u314A","\u314D","\u3160","\u315C","\u3161",",",".","/","{shift}"],["{space}","{lang}"]],shift:[["`","!","@","#","$","%","^","&","*","(",")","_","+","{bksp}"],["{tab}","\u3143","\u3149","\u3138","\u3132","\u3146","\u315B","\u3155","\u3151","\u3152","\u3156","[","]","\\"],["{capslock}","\u3141","\u3134","\u3147","\u3139","\u314E","\u3157","\u3153","\u314F","\u3163",":",'"',"{enter}"],["{shift}","\u314B","\u314C","\u314A","\u314D","\u3160","\u315C","\u3161","<",">","?","{shift}"],["{space}","{lang}"]]},N={default:[["`","1","2","3","4","5","6","7","8","9","0","-","=","{bksp}"],["{tab}","q","w","e","r","t","y","u","i","o","p","[","]","\\"],["{capslock}","a","s","d","f","g","h","j","k","l",";","'","{enter}"],["{shift}","z","x","c","v","b","n","m",",",".","/","{shift}"],["{space}","{lang}"]],shift:[["`","!","@","#","$","%","^","&","*","(",")","_","+","{bksp}"],["{tab}","Q","W","E","R","T","Y","U","I","O","P","[","]","\\"],["{capslock}","A","S","D","F","G","H","J","K","L",":",'"',"{enter}"],["{shift}","Z","X","C","V","B","N","M","<",">","?","{shift}"],["{space}","{lang}"]]},L=(e,t)=>(0,A.useMemo)(()=>e?t?E.shift:E.default:t?N.shift:N.default,[e,t]);var c=require("hangul-js"),$=require("react/jsx-runtime"),I=(0,l.createContext)(null),S=()=>{let e=(0,l.useContext)(I);if(e===null)throw new Error("useKeyboardContext must be used within a VirtualKeyboardProvider");return e},R=({inputRef:e,onClikEnter:t,children:i})=>{let[u,n]=(0,l.useState)(!0),[m,y]=(0,l.useState)(!1),D=(0,l.useRef)(0),d=(0,l.useCallback)(s=>{requestAnimationFrame(()=>{e.current&&(e.current.focus(),e.current.setSelectionRange(s,s))})},[e]),M=(0,l.useCallback)(s=>{if(!e.current)return;let a=e.current,o=a.selectionStart||0,h=a.selectionEnd||0;if(s==="{shift}"){y(r=>!r),d(o);return}if(s==="{capslock}"){y(r=>!r),d(o);return}if(s==="{lang}"){D.current=o,a.focus(),n(r=>!r);return}if(s==="{enter}"){t&&t();return}if(s==="{bksp}"){let r=a.value;if(o===0&&h===0)return;let f,b;if(o===h)if(o===r.length){let g=(0,c.disassemble)(r);if(g.length===0)return;let C=g.slice(0,-1);f=(0,c.assemble)(C),b=f.length}else{let g=r.slice(0,o),C=r.slice(o),v=Array.from(g);if(v.length===0)return;v.pop(),f=v.join("")+C,b=v.length}else f=r.slice(0,o)+r.slice(h),b=o;a.value=f,d(b);return}if(s==="{space}"){let r=a.value,f=r.slice(0,o)+" "+r.slice(h);a.value=f;let b=o+1;d(b);return}let V=a.value,w=V.slice(0,o),O=V.slice(h),H=w+s+O,W=(0,c.assemble)((0,c.disassemble)(H));a.value=W;let j=(0,c.assemble)((0,c.disassemble)(w+s)).length;d(j),m&&s!=="{shift}"&&s!=="{capslock}"&&y(!1)},[e,m,t,d]);return(0,$.jsx)(I.Provider,{value:{currentLayout:L(u,m),handleKeyPress:M},children:i})};var _=require("lucide-react"),Y=require("react/jsx-runtime"),T=e=>{let t="flex items-center justify-center h-8 px-2 text-xs font-normal rounded transition-all select-none touch-manipulation shadow-sm border border-[#d3d3d3]";return e==="{enter}"?`${t} bg-secondary text-white hover:bg-secondary/90 active:bg-secondary/80 border-secondary`:e.startsWith("{")?`${t} bg-white text-[#444] hover:bg-[#e5e5e5] active:bg-[#cdd2d9] border-[#d3d3d3]`:`${t} bg-white text-[#444] hover:bg-[#e5e5e5] active:bg-[#cdd2d9] border-[#d3d3d3]`},P={"{bksp}":{label:(0,Y.jsx)(_.DeleteIcon,{className:"size-4"}),flex:"flex-[3]"},"{tab}":{label:"Tab",flex:"flex-[1.5]"},"{capslock}":{label:"Caps",flex:"flex-[2.5]"},"{shift}":{label:"Shift",flex:"flex-[2]"},"{enter}":{label:"\uD655\uC778",flex:"flex-[3]"},"{space}":{label:"",flex:"flex-[7]"},"{lang}":{label:"\uD55C\uC601",flex:"flex-[1]"}};var p=require("react/jsx-runtime"),k=()=>{let{currentLayout:e,handleKeyPress:t}=S();return(0,p.jsx)(p.Fragment,{children:e.map((i,u)=>(0,p.jsx)("div",{className:"flex w-full items-stretch gap-1",children:i.map((n,m)=>(0,p.jsx)("button",{type:"button",className:`${T(n)} ${P[n]?.flex} min-w-0`,onPointerDown:()=>t(n),children:P[n]?.label},`${u}-${m}`))},u))})};var x=require("react/jsx-runtime"),Q=({inputRef:e,onClikEnter:t})=>(0,x.jsx)(R,{inputRef:e,onClikEnter:t,children:(0,x.jsx)("div",{className:"w-full rounded-md bg-[#ececec] p-2",children:(0,x.jsx)("div",{className:"flex flex-col gap-1",children:(0,x.jsx)(k,{})})})});0&&(module.exports={VirtualKeyboard});
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/components/VirtualKeyboardContext.tsx","../src/const/index.ts","../src/utils/getKeyboardProps.tsx","../src/components/VirtualKeyboardInnerKeys.tsx","../src/components/VirtualKeyboard.tsx"],"sourcesContent":["export * from \"./components/VirtualKeyboard\";\n","import {\n createContext,\n PropsWithChildren,\n RefObject,\n useCallback,\n useContext,\n useRef,\n useState,\n} from \"react\";\nimport { getCurrentLayout } from \"../const\";\nimport { assemble, disassemble } from \"hangul-js\";\n\ntype VirtualKeyboardContextType = {\n currentLayout: string[][];\n handleKeyPress: (key: string) => void;\n};\n\nconst VirtualKeyboardContext = createContext<VirtualKeyboardContextType | null>(\n null\n);\n\nexport const useKeyboardContext = () => {\n const context = useContext<VirtualKeyboardContextType | null>(\n VirtualKeyboardContext\n );\n if (context === null) {\n throw new Error(\n \"useKeyboardContext must be used within a VirtualKeyboardProvider\"\n );\n }\n return context;\n};\n\nexport const VirtualKeyboardProvider = ({\n inputRef,\n onClikEnter,\n children,\n}: PropsWithChildren<{\n inputRef: RefObject<HTMLInputElement>;\n onClikEnter?: () => void;\n}>) => {\n const [isKorean, setIsKorean] = useState(true);\n const [isShift, setIsShift] = useState(false);\n const cursorPositionRef = useRef<number>(0);\n\n const setFocusAndCursor = useCallback(\n (cursorPosition: number) => {\n requestAnimationFrame(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n inputRef.current.setSelectionRange(cursorPosition, cursorPosition);\n }\n });\n },\n [inputRef]\n );\n\n const handleKeyPress = useCallback(\n (key: string) => {\n if (!inputRef.current) return;\n\n const inputEl = inputRef.current;\n const start = inputEl.selectionStart || 0;\n const end = inputEl.selectionEnd || 0;\n\n if (key === \"{shift}\") {\n setIsShift((prev) => !prev);\n setFocusAndCursor(start);\n return;\n }\n\n if (key === \"{capslock}\") {\n setIsShift((prev) => !prev);\n setFocusAndCursor(start);\n return;\n }\n\n if (key === \"{lang}\") {\n cursorPositionRef.current = start;\n inputEl.focus();\n setIsKorean((prev) => !prev);\n return;\n }\n\n if (key === \"{enter}\") {\n onClikEnter && onClikEnter();\n return;\n }\n\n if (key === \"{bksp}\") {\n const currentValue = inputEl.value;\n if (start === 0 && end === 0) return;\n\n let newValue: string;\n let newCursorPosition: number;\n\n if (start === end) {\n const isAtEnd = start === currentValue.length;\n\n if (isAtEnd) {\n const disassembled = disassemble(currentValue);\n if (disassembled.length === 0) return;\n const newDisassembled = disassembled.slice(0, -1);\n newValue = assemble(newDisassembled);\n newCursorPosition = newValue.length;\n } else {\n const beforeCursor = currentValue.slice(0, start);\n const afterCursor = currentValue.slice(start);\n const chars = Array.from(beforeCursor);\n if (chars.length === 0) return;\n chars.pop();\n newValue = chars.join(\"\") + afterCursor;\n newCursorPosition = chars.length;\n }\n } else {\n newValue = currentValue.slice(0, start) + currentValue.slice(end);\n newCursorPosition = start;\n }\n\n inputEl.value = newValue;\n setFocusAndCursor(newCursorPosition);\n return;\n }\n\n if (key === \"{space}\") {\n const currentValue = inputEl.value;\n const newValue =\n currentValue.slice(0, start) + \" \" + currentValue.slice(end);\n inputEl.value = newValue;\n\n const newCursorPosition = start + 1;\n setFocusAndCursor(newCursorPosition);\n return;\n }\n\n const currentValue = inputEl.value;\n const beforeCursor = currentValue.slice(0, start);\n const afterCursor = currentValue.slice(end);\n const newValue = beforeCursor + key + afterCursor;\n\n const assembledValue = assemble(disassemble(newValue));\n inputEl.value = assembledValue;\n\n const assembledBefore = assemble(disassemble(beforeCursor + key));\n const newCursorPosition = assembledBefore.length;\n\n setFocusAndCursor(newCursorPosition);\n\n if (isShift && key !== \"{shift}\" && key !== \"{capslock}\") {\n setIsShift(false);\n }\n },\n [inputRef, isShift, onClikEnter, setFocusAndCursor]\n );\n\n return (\n <VirtualKeyboardContext.Provider\n value={{\n currentLayout: getCurrentLayout(isKorean, isShift),\n handleKeyPress,\n }}\n >\n {children}\n </VirtualKeyboardContext.Provider>\n );\n};\n","import { useMemo } from \"react\";\n\nconst KOREAN_KEYS = {\n default: [\n [\"`\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"0\", \"-\", \"=\", \"{bksp}\"],\n [\n \"{tab}\",\n \"ㅂ\",\n \"ㅈ\",\n \"ㄷ\",\n \"ㄱ\",\n \"ㅅ\",\n \"ㅛ\",\n \"ㅕ\",\n \"ㅑ\",\n \"ㅐ\",\n \"ㅔ\",\n \"[\",\n \"]\",\n \"\\\\\",\n ],\n [\n \"{capslock}\",\n \"ㅁ\",\n \"ㄴ\",\n \"ㅇ\",\n \"ㄹ\",\n \"ㅎ\",\n \"ㅗ\",\n \"ㅓ\",\n \"ㅏ\",\n \"ㅣ\",\n \";\",\n \"'\",\n \"{enter}\",\n ],\n [\n \"{shift}\",\n \"ㅋ\",\n \"ㅌ\",\n \"ㅊ\",\n \"ㅍ\",\n \"ㅠ\",\n \"ㅜ\",\n \"ㅡ\",\n \",\",\n \".\",\n \"/\",\n \"{shift}\",\n ],\n [\"{space}\", \"{lang}\"],\n ],\n shift: [\n [\"`\", \"!\", \"@\", \"#\", \"$\", \"%\", \"^\", \"&\", \"*\", \"(\", \")\", \"_\", \"+\", \"{bksp}\"],\n [\n \"{tab}\",\n \"ㅃ\",\n \"ㅉ\",\n \"ㄸ\",\n \"ㄲ\",\n \"ㅆ\",\n \"ㅛ\",\n \"ㅕ\",\n \"ㅑ\",\n \"ㅒ\",\n \"ㅖ\",\n \"[\",\n \"]\",\n \"\\\\\",\n ],\n [\n \"{capslock}\",\n \"ㅁ\",\n \"ㄴ\",\n \"ㅇ\",\n \"ㄹ\",\n \"ㅎ\",\n \"ㅗ\",\n \"ㅓ\",\n \"ㅏ\",\n \"ㅣ\",\n \":\",\n '\"',\n \"{enter}\",\n ],\n [\n \"{shift}\",\n \"ㅋ\",\n \"ㅌ\",\n \"ㅊ\",\n \"ㅍ\",\n \"ㅠ\",\n \"ㅜ\",\n \"ㅡ\",\n \"<\",\n \">\",\n \"?\",\n \"{shift}\",\n ],\n [\"{space}\", \"{lang}\"],\n ],\n};\n\nconst ENGLISH_KEYS = {\n default: [\n [\"`\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"0\", \"-\", \"=\", \"{bksp}\"],\n [\"{tab}\", \"q\", \"w\", \"e\", \"r\", \"t\", \"y\", \"u\", \"i\", \"o\", \"p\", \"[\", \"]\", \"\\\\\"],\n [\n \"{capslock}\",\n \"a\",\n \"s\",\n \"d\",\n \"f\",\n \"g\",\n \"h\",\n \"j\",\n \"k\",\n \"l\",\n \";\",\n \"'\",\n \"{enter}\",\n ],\n [\"{shift}\", \"z\", \"x\", \"c\", \"v\", \"b\", \"n\", \"m\", \",\", \".\", \"/\", \"{shift}\"],\n [\"{space}\", \"{lang}\"],\n ],\n shift: [\n [\"`\", \"!\", \"@\", \"#\", \"$\", \"%\", \"^\", \"&\", \"*\", \"(\", \")\", \"_\", \"+\", \"{bksp}\"],\n [\"{tab}\", \"Q\", \"W\", \"E\", \"R\", \"T\", \"Y\", \"U\", \"I\", \"O\", \"P\", \"[\", \"]\", \"\\\\\"],\n [\n \"{capslock}\",\n \"A\",\n \"S\",\n \"D\",\n \"F\",\n \"G\",\n \"H\",\n \"J\",\n \"K\",\n \"L\",\n \":\",\n '\"',\n \"{enter}\",\n ],\n [\"{shift}\", \"Z\", \"X\", \"C\", \"V\", \"B\", \"N\", \"M\", \"<\", \">\", \"?\", \"{shift}\"],\n [\"{space}\", \"{lang}\"],\n ],\n};\n\nexport const getCurrentLayout = (\n isKorean: boolean,\n isShift: boolean\n): string[][] =>\n useMemo(() => {\n return isKorean\n ? isShift\n ? KOREAN_KEYS.shift\n : KOREAN_KEYS.default\n : isShift\n ? ENGLISH_KEYS.shift\n : ENGLISH_KEYS.default;\n }, [isKorean, isShift]);\n","import { DeleteIcon } from \"lucide-react\";\nimport { ReactNode } from \"react\";\n\nconst getKeyClassName = (key: string) => {\n const baseClass =\n \"flex items-center justify-center h-8 px-2 text-xs font-normal rounded transition-all select-none touch-manipulation shadow-sm border border-[#d3d3d3]\";\n\n if (key === \"{enter}\") {\n return `${baseClass} bg-secondary text-white hover:bg-secondary/90 active:bg-secondary/80 border-secondary`;\n }\n\n if (!key.startsWith(\"{\")) {\n return `${baseClass} bg-white text-[#444] hover:bg-[#e5e5e5] active:bg-[#cdd2d9] border-[#d3d3d3]`;\n }\n\n return `${baseClass} bg-white text-[#444] hover:bg-[#e5e5e5] active:bg-[#cdd2d9] border-[#d3d3d3]`;\n};\n\nconst KEY_DISPLAY_MAP: Record<string, { label: ReactNode; flex: string }> = {\n \"{bksp}\": { label: <DeleteIcon className=\"size-4\" />, flex: \"flex-[3]\" },\n \"{tab}\": { label: \"Tab\", flex: \"flex-[1.5]\" },\n \"{capslock}\": { label: \"Caps\", flex: \"flex-[2.5]\" },\n \"{shift}\": { label: \"Shift\", flex: \"flex-[2]\" },\n \"{enter}\": { label: \"확인\", flex: \"flex-[3]\" },\n \"{space}\": { label: \"\", flex: \"flex-[7]\" },\n \"{lang}\": { label: \"한영\", flex: \"flex-[1]\" },\n};\n\nexport { getKeyClassName, KEY_DISPLAY_MAP };\n","import { useKeyboardContext } from \"./VirtualKeyboardContext\";\nimport { getKeyClassName, KEY_DISPLAY_MAP } from \"../utils/getKeyboardProps\";\n\nexport const VirtualKeyboardInnerKeys = () => {\n const { currentLayout, handleKeyPress } = useKeyboardContext();\n return (\n <>\n {currentLayout.map((row, rowIndex) => (\n <div key={rowIndex} className=\"flex w-full items-stretch gap-1\">\n {row.map((key, keyIndex) => (\n <button\n key={`${rowIndex}-${keyIndex}`}\n type=\"button\"\n className={`${getKeyClassName(key)} ${KEY_DISPLAY_MAP[key]?.flex} min-w-0`}\n onPointerDown={() => handleKeyPress(key)}\n >\n {KEY_DISPLAY_MAP[key]?.label}\n </button>\n ))}\n </div>\n ))}\n </>\n );\n};\n","import { RefObject } from \"react\";\nimport { VirtualKeyboardProvider } from \"./VirtualKeyboardContext\";\nimport { VirtualKeyboardInnerKeys } from \"./VirtualKeyboardInnerKeys\";\n\nexport const VirtualKeyboard = ({\n inputRef,\n onClikEnter,\n}: {\n inputRef: RefObject<HTMLInputElement>;\n onClikEnter?: () => void;\n}) => {\n return (\n <VirtualKeyboardProvider inputRef={inputRef} onClikEnter={onClikEnter}>\n <div className=\"w-full rounded-md bg-[#ececec] p-2\">\n <div className=\"flex flex-col gap-1\">\n <VirtualKeyboardInnerKeys />\n </div>\n </div>\n </VirtualKeyboardProvider>\n );\n};\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GCAA,IAAAI,EAQO,iBCRP,IAAAC,EAAwB,iBAElBC,EAAc,CAClB,QAAS,CACP,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,QAAQ,EAC1E,CACE,QACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,IACA,IACA,IACF,EACA,CACE,aACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,IACA,IACA,SACF,EACA,CACE,UACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,IACA,IACA,IACA,SACF,EACA,CAAC,UAAW,QAAQ,CACtB,EACA,MAAO,CACL,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,QAAQ,EAC1E,CACE,QACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,IACA,IACA,IACF,EACA,CACE,aACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,IACA,IACA,SACF,EACA,CACE,UACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,IACA,IACA,IACA,SACF,EACA,CAAC,UAAW,QAAQ,CACtB,CACF,EAEMC,EAAe,CACnB,QAAS,CACP,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,QAAQ,EAC1E,CAAC,QAAS,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAI,EAC1E,CACE,aACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,SACF,EACA,CAAC,UAAW,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,SAAS,EACvE,CAAC,UAAW,QAAQ,CACtB,EACA,MAAO,CACL,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,QAAQ,EAC1E,CAAC,QAAS,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAI,EAC1E,CACE,aACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,SACF,EACA,CAAC,UAAW,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,SAAS,EACvE,CAAC,UAAW,QAAQ,CACtB,CACF,EAEaC,EAAmB,CAC9BC,EACAC,OAEA,WAAQ,IACCD,EACHC,EACEJ,EAAY,MACZA,EAAY,QACdI,EACEH,EAAa,MACbA,EAAa,QAClB,CAACE,EAAUC,CAAO,CAAC,EDtJxB,IAAAC,EAAsC,qBAkJlCC,EAAA,6BA3IEC,KAAyB,iBAC7B,IACF,EAEaC,EAAqB,IAAM,CACtC,IAAMC,KAAU,cACdF,CACF,EACA,GAAIE,IAAY,KACd,MAAM,IAAI,MACR,kEACF,EAEF,OAAOA,CACT,EAEaC,EAA0B,CAAC,CACtC,SAAAC,EACA,YAAAC,EACA,SAAAC,CACF,IAGO,CACL,GAAM,CAACC,EAAUC,CAAW,KAAI,YAAS,EAAI,EACvC,CAACC,EAASC,CAAU,KAAI,YAAS,EAAK,EACtCC,KAAoB,UAAe,CAAC,EAEpCC,KAAoB,eACvBC,GAA2B,CAC1B,sBAAsB,IAAM,CACtBT,EAAS,UACXA,EAAS,QAAQ,MAAM,EACvBA,EAAS,QAAQ,kBAAkBS,EAAgBA,CAAc,EAErE,CAAC,CACH,EACA,CAACT,CAAQ,CACX,EAEMU,KAAiB,eACpBC,GAAgB,CACf,GAAI,CAACX,EAAS,QAAS,OAEvB,IAAMY,EAAUZ,EAAS,QACnBa,EAAQD,EAAQ,gBAAkB,EAClCE,EAAMF,EAAQ,cAAgB,EAEpC,GAAID,IAAQ,UAAW,CACrBL,EAAYS,GAAS,CAACA,CAAI,EAC1BP,EAAkBK,CAAK,EACvB,MACF,CAEA,GAAIF,IAAQ,aAAc,CACxBL,EAAYS,GAAS,CAACA,CAAI,EAC1BP,EAAkBK,CAAK,EACvB,MACF,CAEA,GAAIF,IAAQ,SAAU,CACpBJ,EAAkB,QAAUM,EAC5BD,EAAQ,MAAM,EACdR,EAAaW,GAAS,CAACA,CAAI,EAC3B,MACF,CAEA,GAAIJ,IAAQ,UAAW,CACrBV,GAAeA,EAAY,EAC3B,MACF,CAEA,GAAIU,IAAQ,SAAU,CACpB,IAAMK,EAAeJ,EAAQ,MAC7B,GAAIC,IAAU,GAAKC,IAAQ,EAAG,OAE9B,IAAIG,EACAC,EAEJ,GAAIL,IAAUC,EAGZ,GAFgBD,IAAUG,EAAa,OAE1B,CACX,IAAMG,KAAe,eAAYH,CAAY,EAC7C,GAAIG,EAAa,SAAW,EAAG,OAC/B,IAAMC,EAAkBD,EAAa,MAAM,EAAG,EAAE,EAChDF,KAAW,YAASG,CAAe,EACnCF,EAAoBD,EAAS,MAC/B,KAAO,CACL,IAAMI,EAAeL,EAAa,MAAM,EAAGH,CAAK,EAC1CS,EAAcN,EAAa,MAAMH,CAAK,EACtCU,EAAQ,MAAM,KAAKF,CAAY,EACrC,GAAIE,EAAM,SAAW,EAAG,OACxBA,EAAM,IAAI,EACVN,EAAWM,EAAM,KAAK,EAAE,EAAID,EAC5BJ,EAAoBK,EAAM,MAC5B,MAEAN,EAAWD,EAAa,MAAM,EAAGH,CAAK,EAAIG,EAAa,MAAMF,CAAG,EAChEI,EAAoBL,EAGtBD,EAAQ,MAAQK,EAChBT,EAAkBU,CAAiB,EACnC,MACF,CAEA,GAAIP,IAAQ,UAAW,CACrB,IAAMK,EAAeJ,EAAQ,MACvBK,EACJD,EAAa,MAAM,EAAGH,CAAK,EAAI,IAAMG,EAAa,MAAMF,CAAG,EAC7DF,EAAQ,MAAQK,EAEhB,IAAMC,EAAoBL,EAAQ,EAClCL,EAAkBU,CAAiB,EACnC,MACF,CAEA,IAAMF,EAAeJ,EAAQ,MACvBS,EAAeL,EAAa,MAAM,EAAGH,CAAK,EAC1CS,EAAcN,EAAa,MAAMF,CAAG,EACpCG,EAAWI,EAAeV,EAAMW,EAEhCE,KAAiB,eAAS,eAAYP,CAAQ,CAAC,EACrDL,EAAQ,MAAQY,EAGhB,IAAMN,KADkB,eAAS,eAAYG,EAAeV,CAAG,CAAC,EACtB,OAE1CH,EAAkBU,CAAiB,EAE/Bb,GAAWM,IAAQ,WAAaA,IAAQ,cAC1CL,EAAW,EAAK,CAEpB,EACA,CAACN,EAAUK,EAASJ,EAAaO,CAAiB,CACpD,EAEA,SACE,OAACZ,EAAuB,SAAvB,CACC,MAAO,CACL,cAAe6B,EAAiBtB,EAAUE,CAAO,EACjD,eAAAK,CACF,EAEC,SAAAR,EACH,CAEJ,EErKA,IAAAwB,EAA2B,wBAmBNC,EAAA,6BAhBfC,EAAmBC,GAAgB,CACvC,IAAMC,EACJ,wJAEF,OAAID,IAAQ,UACH,GAAGC,CAAS,yFAGhBD,EAAI,WAAW,GAAG,EAIhB,GAAGC,CAAS,gFAHV,GAAGA,CAAS,+EAIvB,EAEMC,EAAsE,CAC1E,SAAU,CAAE,SAAO,OAAC,cAAW,UAAU,SAAS,EAAI,KAAM,UAAW,EACvE,QAAS,CAAE,MAAO,MAAO,KAAM,YAAa,EAC5C,aAAc,CAAE,MAAO,OAAQ,KAAM,YAAa,EAClD,UAAW,CAAE,MAAO,QAAS,KAAM,UAAW,EAC9C,UAAW,CAAE,MAAO,eAAM,KAAM,UAAW,EAC3C,UAAW,CAAE,MAAO,GAAI,KAAM,UAAW,EACzC,SAAU,CAAE,MAAO,eAAM,KAAM,UAAW,CAC5C,ECpBI,IAAAC,EAAA,6BAHSC,EAA2B,IAAM,CAC5C,GAAM,CAAE,cAAAC,EAAe,eAAAC,CAAe,EAAIC,EAAmB,EAC7D,SACE,mBACG,SAAAF,EAAc,IAAI,CAACG,EAAKC,OACvB,OAAC,OAAmB,UAAU,kCAC3B,SAAAD,EAAI,IAAI,CAACE,EAAKC,OACb,OAAC,UAEC,KAAK,SACL,UAAW,GAAGC,EAAgBF,CAAG,CAAC,IAAIG,EAAgBH,CAAG,GAAG,IAAI,WAChE,cAAe,IAAMJ,EAAeI,CAAG,EAEtC,SAAAG,EAAgBH,CAAG,GAAG,OALlB,GAAGD,CAAQ,IAAIE,CAAQ,EAM9B,CACD,GAVOF,CAWV,CACD,EACH,CAEJ,ECRU,IAAAK,EAAA,6BAXGC,EAAkB,CAAC,CAC9B,SAAAC,EACA,YAAAC,CACF,OAKI,OAACC,EAAA,CAAwB,SAAUF,EAAU,YAAaC,EACxD,mBAAC,OAAI,UAAU,qCACb,mBAAC,OAAI,UAAU,sBACb,mBAACE,EAAA,EAAyB,EAC5B,EACF,EACF","names":["index_exports","__export","VirtualKeyboard","__toCommonJS","import_react","import_react","KOREAN_KEYS","ENGLISH_KEYS","getCurrentLayout","isKorean","isShift","import_hangul_js","import_jsx_runtime","VirtualKeyboardContext","useKeyboardContext","context","VirtualKeyboardProvider","inputRef","onClikEnter","children","isKorean","setIsKorean","isShift","setIsShift","cursorPositionRef","setFocusAndCursor","cursorPosition","handleKeyPress","key","inputEl","start","end","prev","currentValue","newValue","newCursorPosition","disassembled","newDisassembled","beforeCursor","afterCursor","chars","assembledValue","getCurrentLayout","import_lucide_react","import_jsx_runtime","getKeyClassName","key","baseClass","KEY_DISPLAY_MAP","import_jsx_runtime","VirtualKeyboardInnerKeys","currentLayout","handleKeyPress","useKeyboardContext","row","rowIndex","key","keyIndex","getKeyClassName","KEY_DISPLAY_MAP","import_jsx_runtime","VirtualKeyboard","inputRef","onClikEnter","VirtualKeyboardProvider","VirtualKeyboardInnerKeys"]}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "virtual-keyboard-noahko",
3
+ "version": "0.0.4",
4
+ "description": "",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "private": false,
12
+ "scripts": {
13
+ "clean": "rm -rf dist",
14
+ "dev": "tsup src/index.ts --watch --dts",
15
+ "build": "tsup src/index.ts --dts --minify --sourcemap"
16
+ },
17
+ "devDependencies": {
18
+ "@types/react": "19.2.2",
19
+ "@types/react-dom": "19.2.2",
20
+ "tsup": "^8.5.1",
21
+ "typescript": "^5.9.3"
22
+ },
23
+ "peerDependencies": {
24
+ "react": "^19.2.0",
25
+ "react-dom": "^19.2.0",
26
+ "lucide-react": "^0.453.0",
27
+ "hangul-js": "^0.2.6"
28
+ }
29
+ }