import theaterJS from "theaterjs" ;
interface ITheaterOptions {
autoplay? : boolean;
minSpeed? : {
type : number;
erase : number;
} ;
maxSpeed? : {
type : number;
erase : number;
} ;
}
export default function useTheater ( id : string, options : ITheaterOptions, addSceneOptions : any[ ] ) {
const theater = theaterJS ( options) ;
theater. addActor ( id, { speed : 0.8 , accuracy : 0.6 } ) ;
addSceneOptions. forEach ( item => {
theater. addScene ( item) ;
} ) ;
theater. addScene ( theater. replay . bind ( theater) ) ;
theater
. on ( "type:start, erase:start" , function ( ) {
theater. getCurrentActor ( ) . $element?. classList! . add ( "actor__content--typing" ) ;
} )
. on ( "type:end, erase:end" , function ( ) {
theater. getCurrentActor ( ) . $element?. classList! . remove ( "actor__content--typing" ) ;
} ) ;
return { theater } ;
}
< div class = "actor" >
< div class = "actor__prefix" @click= "handleOnFocus" > Search for your domain name... < / div>
< div v- show= "!isClick" id= "vader" type= "text" class = "actor__content" data- focus- visible= "" @click= "handleOnFocus" > < / div>
< a- input
v- show= "isClick"
id= "vader-input"
ref= "searchContentRef"
v- model= "searchContent"
class = "actor__input"
allow- clear
@blur= "handleOnBlur"
/ >
< a- button type= "primary" class = "w-98px" @click= "handleSearch" > Search< / a- button>
< / div>
const addScenes = [
[ "vader:Start typing..." , 800 ] ,
[
"vader:youridea.com" ,
800 ,
- 8 ,
"circle.net" ,
800 ,
- 10 ,
"version.org" ,
800 ,
- 11 ,
"brandnew.site" ,
800 ,
- 13 ,
"world.online" ,
800 ,
- 12 ,
"business.ca" ,
1000
]
] ;
const isClick = ref ( false ) ;
const searchContentRef = ref ( ) ;
const searchContent = ref ( "" ) ;
const handleOnFocus = ( ) => {
isClick. value = true ;
nextTick ( ( ) => {
searchContentRef. value. focus ( ) ;
} ) ;
} ;
const handleOnBlur = ( ) => {
if ( searchContent. value === "" ) {
isClick. value = false ;
}
} ;
const handleSearch = ( ) => {
console. log ( "searchContent" , searchContent. value) ;
} ;
watch ( searchContent, val => {
if ( val. length <= 0 ) {
isClick. value = false ;
searchContent. value = "" ;
} else {
isClick. value = true ;
}
} ) ;
useTheater ( "vader" , { autoplay : true } , addScenes) ;
. actor {
@apply absolute left- 0 px- 5vw flex flex- col;
top : 40 % ;
& __prefix {
@apply text- [ #919091 ] ;
}
& __input {
@apply border- none bg- transparent h- 69px pl- 0 ;
: deep ( . arco- input) {
color : #fff;
font- size: 3rem;
@apply font- 700 ;
& : focus {
outline : none;
}
}
}
& __content {
font- size: 3rem;
@apply font- 700 bg- transparent text- color- placeholder- 1 ;
}
. actor__content-- typing: : after {
content : "|" ;
animation : blink 500ms infinite;
}
}