@@ -44,9 +44,10 @@ type LastConversion = {
4444 end : number ;
4545} ;
4646
47- const [ jishoCache , setJishoCache ] = createStorageSignal <
48- Record < string , string [ ] >
49- > ( "jisho-cache" , { } ) ;
47+ const [ jishoCache , setJishoCache ] = createStorageSignal < Record < string , string [ ] > > (
48+ "jisho-cache" ,
49+ { }
50+ ) ;
5051
5152async function fetchKanjiFromJisho ( reading : string ) : Promise < string [ ] > {
5253 if ( ! reading ) return [ ] ;
@@ -57,9 +58,7 @@ async function fetchKanjiFromJisho(reading: string): Promise<string[]> {
5758 }
5859
5960 const JISHO_PROXY_BASE = "https://cors-anywhere.com/" ;
60- const jishoUrl =
61- "https://jisho.org/api/v1/search/words?keyword=" +
62- encodeURIComponent ( reading ) ;
61+ const jishoUrl = "https://jisho.org/api/v1/search/words?keyword=" + encodeURIComponent ( reading ) ;
6362
6463 const proxyUrl = JISHO_PROXY_BASE + jishoUrl ;
6564 const hiragana = wanakana . toHiragana ( reading ) ;
@@ -68,17 +67,13 @@ async function fetchKanjiFromJisho(reading: string): Promise<string[]> {
6867 try {
6968 const res = await fetch ( proxyUrl ) ;
7069 if ( ! res . ok ) {
71- console . error (
72- `Error fetching from CORS proxy: ${ res . status } ${ res . statusText } ` ,
73- ) ;
70+ console . error ( `Error fetching from CORS proxy: ${ res . status } ${ res . statusText } ` ) ;
7471 return [ hiragana , katakana ] ;
7572 }
7673 const json = ( await res . json ( ) ) as JishoResponse ;
7774 if ( ! json ?. data ) return [ hiragana , katakana ] ;
7875
79- const unique = new Set (
80- json . data . map ( ( e ) => e . japanese [ 0 ] . word || e . japanese [ 0 ] . reading ) ,
81- ) ;
76+ const unique = new Set ( json . data . map ( ( e ) => e . japanese [ 0 ] . word || e . japanese [ 0 ] . reading ) ) ;
8277 const results = [ ...new Set ( [ hiragana , katakana , ...Array . from ( unique ) ] ) ] ;
8378
8479 setJishoCache ( ( prev ) => ( { ...prev , [ reading ] : results } ) ) ;
@@ -106,9 +101,7 @@ export function IMEField() {
106101 const [ isMenuOpen , setIsMenuOpen ] = createSignal ( false ) ;
107102 const [ confirmedIndex , setConfirmedIndex ] = createSignal ( 0 ) ;
108103 const [ isComposing , setIsComposing ] = createSignal ( false ) ;
109- const [ conversionHistory , setConversionHistory ] = createSignal <
110- LastConversion [ ]
111- > ( [ ] ) ;
104+ const [ conversionHistory , setConversionHistory ] = createSignal < LastConversion [ ] > ( [ ] ) ;
112105 const [ copied , setCopied ] = createSignal ( false ) ;
113106
114107 let ta : HTMLTextAreaElement | undefined ;
@@ -166,10 +159,7 @@ export function IMEField() {
166159 ta . value = newVal ;
167160 ta . setSelectionRange ( newPos , newPos ) ;
168161 }
169- setConversionHistory ( ( prev ) => [
170- ...prev ,
171- { confirmed : cand , reading, start, end : newPos } ,
172- ] ) ;
162+ setConversionHistory ( ( prev ) => [ ...prev , { confirmed : cand , reading, start, end : newPos } ] ) ;
173163 setLookupReading ( null ) ;
174164 setSelectedIndex ( 0 ) ;
175165 setIsMenuOpen ( false ) ;
@@ -189,9 +179,7 @@ export function IMEField() {
189179 }
190180 }
191181
192- function handleKeyDown (
193- e : KeyboardEvent & { currentTarget : HTMLTextAreaElement } ,
194- ) {
182+ function handleKeyDown ( e : KeyboardEvent & { currentTarget : HTMLTextAreaElement } ) {
195183 if ( isMenuOpen ( ) ) {
196184 if ( e . key === "Enter" || e . key === " " ) {
197185 e . preventDefault ( ) ;
@@ -203,9 +191,7 @@ export function IMEField() {
203191 }
204192 if ( e . key === "ArrowUp" ) {
205193 e . preventDefault ( ) ;
206- setSelectedIndex (
207- ( prev ) => ( prev - 1 + suggestions ( ) . length ) % suggestions ( ) . length ,
208- ) ;
194+ setSelectedIndex ( ( prev ) => ( prev - 1 + suggestions ( ) . length ) % suggestions ( ) . length ) ;
209195 }
210196 return ;
211197 }
@@ -268,16 +254,12 @@ export function IMEField() {
268254 setIsComposing ( val . length > currentConfirmedIndex ) ;
269255 }
270256
271- function handleCompositionStart (
272- e : CompositionEvent & { currentTarget : HTMLTextAreaElement } ,
273- ) {
257+ function handleCompositionStart ( e : CompositionEvent & { currentTarget : HTMLTextAreaElement } ) {
274258 setIsComposing ( true ) ;
275259 setCompositionStart ( e . currentTarget . selectionStart ) ;
276260 }
277261
278- function handleCompositionEnd (
279- e : CompositionEvent & { currentTarget : HTMLTextAreaElement } ,
280- ) {
262+ function handleCompositionEnd ( e : CompositionEvent & { currentTarget : HTMLTextAreaElement } ) {
281263 setIsComposing ( false ) ;
282264 const start = compositionStart ( ) ;
283265 const pos = e . currentTarget . selectionStart ;
@@ -302,22 +284,17 @@ export function IMEField() {
302284
303285 return (
304286 < div class = "relative w-full" >
305- < DropdownMenu
306- open = { isMenuOpen ( ) }
307- onOpenChange = { setIsMenuOpen }
308- placement = "bottom-start"
309- >
287+ < DropdownMenu open = { isMenuOpen ( ) } onOpenChange = { setIsMenuOpen } placement = "bottom-start" >
310288 < DropdownMenuTrigger as = "div" class = "w-full outline-none" disabled >
311289 < TextField >
312290 < div class = "relative w-full" >
313- < div class = "absolute right -2 top -2 z-20 flex items-center space-x-2" >
291+ < div class = "absolute top -2 right -2 z-20 flex items-center space-x-2" >
314292 < Show when = { unconfirmedText ( ) . length > 0 && ! isMenuOpen ( ) } >
315293 < Button
316294 onClick = { handleConvert }
317295 size = "sm"
318296 variant = "default"
319- class = "block lg:hidden"
320- >
297+ class = "block lg:hidden" >
321298 Convert
322299 </ Button >
323300 </ Show >
@@ -330,8 +307,7 @@ export function IMEField() {
330307 < CopyIcon class = "h-4 w-4" />
331308 < span > Copy</ span >
332309 </ >
333- }
334- >
310+ } >
335311 < CheckIcon class = "h-4 w-4" />
336312 < span > Copied!</ span >
337313 </ Show >
@@ -340,12 +316,9 @@ export function IMEField() {
340316 </ div >
341317 < div
342318 aria-hidden = "true"
343- class = "pointer-events-none absolute inset-0 select-none whitespace-pre-wrap px-3 py-2 text-base"
344- >
319+ class = "pointer-events-none absolute inset-0 px-3 py-2 text-base whitespace-pre-wrap select-none" >
345320 < span > { confirmedText ( ) } </ span >
346- < span class = "border-b border-dotted border-current" >
347- { unconfirmedText ( ) }
348- </ span >
321+ < span class = "border-b border-dotted border-current" > { unconfirmedText ( ) } </ span >
349322 </ div >
350323 < TextFieldTextArea
351324 autoResize
@@ -368,17 +341,13 @@ export function IMEField() {
368341 onCloseAutoFocus = { ( e ) => {
369342 e . preventDefault ( ) ;
370343 ta ?. focus ( ) ;
371- } }
372- >
344+ } } >
373345 < Suspense fallback = { < Spinner /> } >
374346 < Show
375347 when = { suggestions ( ) ?. length > 0 }
376348 fallback = {
377- < div class = "text-muted-foreground px-2 py-1.5 text-sm" >
378- No results found.
379- </ div >
380- }
381- >
349+ < div class = "text-muted-foreground px-2 py-1.5 text-sm" > No results found.</ div >
350+ } >
382351 < div ref = { listRef } class = "max-h-[13rem] overflow-y-auto" >
383352 < For each = { suggestions ( ) } >
384353 { ( s , idx ) => (
@@ -387,8 +356,7 @@ export function IMEField() {
387356 onSelect = { ( ) => commitSuggestion ( idx ( ) ) }
388357 onFocus = { ( ) => setSelectedIndex ( idx ( ) ) }
389358 data-highlighted = { selectedIndex ( ) === idx ( ) }
390- class = "data-[highlighted=true]:bg-accent data-[highlighted=true]:text-accent-foreground scroll-m-1"
391- >
359+ class = "data-[highlighted=true]:bg-accent data-[highlighted=true]:text-accent-foreground scroll-m-1" >
392360 { s }
393361 </ DropdownMenuItem >
394362 ) }
0 commit comments