@@ -30,12 +30,51 @@ <h2>Multiword text-expander element</h2>
30
30
< textarea autofocus rows ="10 " cols ="40 "> </ textarea >
31
31
</ text-expander >
32
32
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
+
33
43
< 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
+
34
52
const expanders = document . querySelectorAll ( 'text-expander' )
35
53
for ( const expander of expanders ) {
36
54
expander . addEventListener ( 'text-expander-change' , event => {
37
55
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 === '#' ) {
39
78
const menu = document . createElement ( 'ul' )
40
79
menu . classList . add ( 'menu' )
41
80
menu . role = 'listbox'
@@ -55,13 +94,25 @@ <h2>Multiword text-expander element</h2>
55
94
menu . append ( item )
56
95
}
57
96
}
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
+ }
59
106
}
60
107
} )
61
108
62
109
expander . addEventListener ( 'text-expander-value' , function ( event ) {
63
110
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
+ }
65
116
} )
66
117
}
67
118
</ script >
0 commit comments