|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import {html, LitElement} from 'lit'; |
|
|
|
import {app} from '../lit_demo/app'; |
|
import {parseUrl, State} from '../lit_demo/url_utils'; |
|
|
|
import './image-carousel'; |
|
import {ImagePrompts} from './image-prompts'; |
|
import './loading-animation'; |
|
import {MessageList} from './message-list'; |
|
import {ModelControls} from './model-controls'; |
|
|
|
import {customElement, property, query} from 'lit/decorators.js'; |
|
import styles from './lit-demo-app.scss'; |
|
|
|
|
|
|
|
|
|
@customElement('lit-demo-app') |
|
export class LitDemoApp extends LitElement { |
|
|
|
static override styles = [styles]; |
|
|
|
@property({type: Boolean}) |
|
loading: boolean = true; |
|
|
|
@query('message-list') |
|
messageList!: MessageList; |
|
@query('model-controls') |
|
modelControls!: ModelControls; |
|
@query('#examples') |
|
examples!: HTMLElement; |
|
|
|
state?: State; |
|
lingeringWarning?: string; |
|
|
|
constructor() { |
|
super(); |
|
window.onerror = this.onglobalerror.bind(this); |
|
this.load(); |
|
} |
|
|
|
onglobalerror(message: string|Event, source: string|undefined, lineno: number|undefined) { |
|
source = source || ''; |
|
source = source.substring(source.lastIndexOf('/') + 1); |
|
this.messageList.error( |
|
`<b>Javascript error</b> at ${source}:${lineno}<br>` + |
|
`<code>${message}</code>`, |
|
{rawHtml: true}); |
|
} |
|
|
|
async load() { |
|
await app.load(); |
|
this.loading = false; |
|
try { |
|
this.state = parseUrl(); |
|
} catch (error) { |
|
this.messageList.warning(`Could not parse URL: ${error}`); |
|
} |
|
} |
|
|
|
override updated() { |
|
if (this.state && this.examples) { |
|
this.modelControls.setModel(this.state.modelName); |
|
this.addFromState(this.state); |
|
this.state = undefined; |
|
} |
|
} |
|
|
|
override render() { |
|
return html` |
|
${this.loading ? html`` : html` |
|
<image-carousel @image-select=${this.onImageSelect}></image-carousel> |
|
<model-controls></model-controls> |
|
`} |
|
<message-list></message-list> |
|
${this.loading ? html` |
|
<div class="loading-container"> |
|
<loading-animation title="loading..."></loading-animation> |
|
</div> |
|
` : html` |
|
<div id="examples"> |
|
</div> |
|
`} |
|
`; |
|
} |
|
|
|
onImageSelect(event: CustomEvent) { |
|
this.addImagePrompts(event.detail.id); |
|
} |
|
|
|
addFromState(state: State) { |
|
const imagePrompts = new ImagePrompts(state.imageId); |
|
imagePrompts.setPrompts(state.prompts); |
|
this.examples.insertBefore(imagePrompts, this.examples.childNodes[0]); |
|
} |
|
|
|
addImagePrompts(id: string): ImagePrompts { |
|
const imagePrompts = new ImagePrompts(id); |
|
imagePrompts.addEventListener('duplicate', (event: Event) => { |
|
const duplicated = this.addImagePrompts(id); |
|
duplicated.setPrompts(imagePrompts.getPrompts()); |
|
}); |
|
this.examples.insertBefore(imagePrompts, this.examples.childNodes[0]); |
|
return imagePrompts; |
|
} |
|
} |
|
|