@@ -30,12 +30,51 @@ <h2>Multiword text-expander element</h2>
3030 < textarea autofocus rows ="10 " cols ="40 "> </ textarea >
3131 </ text-expander >
3232
33+ < h2 > Multiword and multikey text-expander element</ h2 >
34+ < text-expander keys =": # " multiword ="# ">
35+ < textarea autofocus rows ="10 " cols ="40 "> </ textarea >
36+ </ text-expander >
37+
38+ < h2 > Multiword and multikey text-expander element with random delay</ h2 >
39+ < text-expander keys =": # " multiword ="# " _random_delay ="">
40+ < textarea autofocus rows ="10 " cols ="40 "> </ textarea >
41+ </ text-expander >
42+
3343 < script type ="text/javascript ">
44+ const emojis = [
45+ { emoji : "😀" , names : [ "smile" , "happy" ] } ,
46+ { emoji : "❤️" , names : [ "heart" , "love" ] } ,
47+ { emoji : "🔥" , names : [ "fire" , "hot" ] } ,
48+ { emoji : "⭐" , names : [ "star" , "favorite" ] } ,
49+ { emoji : "🚀" , names : [ "rocket" , "fast" ] }
50+ ] ;
51+
3452 const expanders = document . querySelectorAll ( 'text-expander' )
3553 for ( const expander of expanders ) {
3654 expander . addEventListener ( 'text-expander-change' , event => {
3755 const { key, provide, text} = event . detail
38- if ( key === '#' ) {
56+ if ( key === ':' ) {
57+ const menu = document . createElement ( 'ul' )
58+ menu . classList . add ( 'menu' )
59+ menu . role = 'listbox'
60+ for ( const { emoji, names} of emojis ) {
61+ if ( names . some ( name => name . includes ( text . toLowerCase ( ) ) ) ) {
62+ const item = document . createElement ( 'li' )
63+ item . setAttribute ( 'role' , 'option' )
64+ item . textContent = `${ emoji } ${ names [ 0 ] } `
65+ item . setAttribute ( 'data-value' , emoji )
66+ menu . append ( item )
67+ }
68+ }
69+ // Async test with random delay
70+ if ( expander . hasAttribute ( '_random_delay' ) ) {
71+ provide ( new Promise ( resolve => {
72+ setTimeout ( ( ) => resolve ( { matched : true , fragment : menu } ) , Math . random ( ) * 1000 )
73+ } ) )
74+ } else {
75+ provide ( Promise . resolve ( { matched : true , fragment : menu } ) )
76+ }
77+ } else if ( key === '#' ) {
3978 const menu = document . createElement ( 'ul' )
4079 menu . classList . add ( 'menu' )
4180 menu . role = 'listbox'
@@ -55,13 +94,25 @@ <h2>Multiword text-expander element</h2>
5594 menu . append ( item )
5695 }
5796 }
58- provide ( Promise . resolve ( { matched : true , fragment : menu } ) )
97+ // Async test with random delay
98+ if ( expander . hasAttribute ( '_random_delay' ) ) {
99+ provide ( new Promise ( resolve => {
100+ setTimeout ( ( ) => resolve ( { matched : true , fragment : menu } ) , Math . random ( ) * 1000 )
101+ } ) )
102+ } else {
103+ // For normal expander - synchronous response
104+ provide ( Promise . resolve ( { matched : true , fragment : menu } ) )
105+ }
59106 }
60107 } )
61108
62109 expander . addEventListener ( 'text-expander-value' , function ( event ) {
63110 const { key, item} = event . detail
64- if ( key === '#' ) event . detail . value = item . getAttribute ( 'data-value' ) || item . textContent
111+ if ( key === '#' ) {
112+ event . detail . value = item . getAttribute ( 'data-value' ) || item . textContent
113+ } else if ( key === ':' ) {
114+ event . detail . value = item . getAttribute ( 'data-value' )
115+ }
65116 } )
66117 }
67118 </ script >
0 commit comments