project rename

This commit is contained in:
Eugene Pankov
2021-06-29 23:57:04 +02:00
parent c61be3d52b
commit 43cd3318da
609 changed files with 510 additions and 530 deletions

1
tabby-web/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
dist

27
tabby-web/package.json Normal file
View File

@@ -0,0 +1,27 @@
{
"name": "tabby-web",
"version": "1.0.140",
"description": "Web-specific bindings",
"keywords": [
"tabby-builtin-plugin"
],
"main": "dist/index.js",
"typings": "typings/index.d.ts",
"scripts": {
"build": "webpack --progress --color",
"watch": "webpack --progress --color --watch"
},
"files": [
"dist"
],
"author": "Eugene Pankov",
"license": "MIT",
"peerDependencies": {
"@angular/core": "^9.1.9"
},
"devDependencies": {
"@vaadin/vaadin-context-menu": "^5.0.0",
"bootstrap": "^4.1.3",
"copy-text-to-clipboard": "^3.0.1"
}
}

View File

@@ -0,0 +1,13 @@
.modal-body
div {{options.message}}
small {{options.detail}}
.modal-footer
.ml-auto
button.btn(
*ngFor='let button of options.buttons; index as i',
[autofocus]='i === options.defaultId',
[class.btn-primary]='i === options.defaultId',
[class.btn-secondary]='i !== options.defaultId',
(click)='onButton(i)',
) {{button}}

View File

@@ -0,0 +1,34 @@
import { Component, Input, ElementRef } from '@angular/core'
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
import { BaseComponent, HotkeysService, MessageBoxOptions } from 'tabby-core'
/** @hidden */
@Component({
template: require('./messageBoxModal.component.pug'),
})
export class MessageBoxModalComponent extends BaseComponent {
@Input() options: MessageBoxOptions
constructor (
hotkeys: HotkeysService,
private element: ElementRef,
private modalInstance: NgbActiveModal,
) {
super()
this.subscribeUntilDestroyed(hotkeys.key, (event: KeyboardEvent) => {
if (event.type === 'keydown') {
if (event.key === 'Enter' && this.options.defaultId !== undefined) {
this.modalInstance.close(this.options.defaultId)
}
}
})
}
ngAfterViewInit (): void {
this.element.nativeElement.querySelector('button[autofocus]').focus()
}
onButton (index: number): void {
this.modalInstance.close(index)
}
}

32
tabby-web/src/index.ts Normal file
View File

@@ -0,0 +1,32 @@
import { NgModule } from '@angular/core'
import { CommonModule } from '@angular/common'
import { HostAppService, HostWindowService, LogService, PlatformService, UpdaterService } from 'tabby-core'
import { WebPlatformService } from './platform'
import { ConsoleLogService } from './services/log.service'
import { NullUpdaterService } from './services/updater.service'
import { WebHostWindow } from './services/hostWindow.service'
import { WebHostApp } from './services/hostApp.service'
import { MessageBoxModalComponent } from './components/messageBoxModal.component'
import './styles.scss'
@NgModule({
imports: [
CommonModule,
],
providers: [
{ provide: PlatformService, useClass: WebPlatformService },
{ provide: LogService, useClass: ConsoleLogService },
{ provide: UpdaterService, useClass: NullUpdaterService },
{ provide: HostWindowService, useClass: WebHostWindow },
{ provide: HostAppService, useClass: WebHostApp },
],
declarations: [
MessageBoxModalComponent,
],
entryComponents: [
MessageBoxModalComponent,
],
})
export default class WebModule { } // eslint-disable-line @typescript-eslint/no-extraneous-class

182
tabby-web/src/platform.ts Normal file
View File

@@ -0,0 +1,182 @@
import '@vaadin/vaadin-context-menu'
import copyToClipboard from 'copy-text-to-clipboard'
import { Injectable, Inject } from '@angular/core'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { PlatformService, ClipboardContent, MenuItemOptions, MessageBoxOptions, MessageBoxResult, FileUpload, FileUploadOptions, FileDownload, HTMLFileUpload } from 'tabby-core'
// eslint-disable-next-line no-duplicate-imports
import type { ContextMenuElement, ContextMenuItem } from '@vaadin/vaadin-context-menu'
import { MessageBoxModalComponent } from './components/messageBoxModal.component'
import './styles.scss'
@Injectable()
export class WebPlatformService extends PlatformService {
private menu: ContextMenuElement
private contextMenuHandlers = new Map<ContextMenuItem, () => void>()
private fileSelector: HTMLInputElement
constructor (
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
@Inject('WEB_CONNECTOR') private connector: any,
private ngbModal: NgbModal,
) {
super()
this.menu = window.document.createElement('vaadin-context-menu')
this.menu.addEventListener('item-selected', e => {
this.contextMenuHandlers.get(e.detail.value)?.()
})
document.body.appendChild(this.menu)
this.fileSelector = document.createElement('input')
this.fileSelector.type = 'file'
this.fileSelector.style.visibility = 'hidden'
document.body.appendChild(this.fileSelector)
}
readClipboard (): string {
return ''
}
setClipboard (content: ClipboardContent): void {
copyToClipboard(content.text)
}
async loadConfig (): Promise<string> {
return this.connector.loadConfig()
}
async saveConfig (content: string): Promise<void> {
await this.connector.saveConfig(content)
}
getOSRelease (): string {
return '1.0'
}
openExternal (url: string): void {
window.open(url)
}
getAppVersion (): string {
return this.connector.getAppVersion()
}
async listFonts (): Promise<string[]> {
return []
}
popupContextMenu (menu: MenuItemOptions[], event?: MouseEvent): void {
this.contextMenuHandlers.clear()
this.menu.items = menu
.filter(x => x.type !== 'separator')
.map(x => this.remapMenuItem(x))
setTimeout(() => {
this.menu.open(event)
}, 10)
}
private remapMenuItem (item: MenuItemOptions): ContextMenuItem {
const cmi = {
text: item.label,
disabled: !(item.enabled ?? true),
checked: item.checked,
children: item.submenu?.map(i => this.remapMenuItem(i)),
}
if (item.click) {
this.contextMenuHandlers.set(cmi, item.click)
}
return cmi
}
async showMessageBox (options: MessageBoxOptions): Promise<MessageBoxResult> {
console.log(options)
const modal = this.ngbModal.open(MessageBoxModalComponent, {
backdrop: 'static',
})
const instance: MessageBoxModalComponent = modal.componentInstance
instance.options = options
try {
const response = await modal.result
return { response }
} catch {
return { response: 0 }
}
}
quit (): void {
window.close()
}
async startDownload (name: string, size: number): Promise<FileDownload|null> {
const transfer = new HTMLFileDownload(name, size)
this.fileTransferStarted.next(transfer)
return transfer
}
startUpload (options?: FileUploadOptions): Promise<FileUpload[]> {
return new Promise(resolve => {
this.fileSelector.onchange = () => {
const transfers: FileUpload[] = []
const fileList = this.fileSelector.files!
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
for (let i = 0; i < (fileList.length ?? 0); i++) {
const file = fileList[i]
const transfer = new HTMLFileUpload(file)
this.fileTransferStarted.next(transfer)
transfers.push(transfer)
if (!options?.multiple) {
break
}
}
resolve(transfers)
}
this.fileSelector.click()
})
}
setErrorHandler (handler: (_: any) => void): void {
window.addEventListener('error', handler)
}
}
class HTMLFileDownload extends FileDownload {
private buffers: Buffer[] = []
constructor (
private name: string,
private size: number,
) {
super()
}
getName (): string {
return this.name
}
getSize (): number {
return this.size
}
async write (buffer: Buffer): Promise<void> {
this.buffers.push(Buffer.from(buffer))
this.increaseProgress(buffer.length)
if (this.isComplete()) {
this.finish()
}
}
finish () {
const blob = new Blob(this.buffers, { type: 'application/octet-stream' })
const element = window.document.createElement('a')
element.href = window.URL.createObjectURL(blob)
element.download = this.name
document.body.appendChild(element)
element.click()
document.body.removeChild(element)
}
// eslint-disable-next-line @typescript-eslint/no-empty-function
close (): void { }
}

View File

@@ -0,0 +1,33 @@
import { Injectable, Injector } from '@angular/core'
import { HostAppService, Platform } from 'tabby-core'
@Injectable()
export class WebHostApp extends HostAppService {
get platform (): Platform {
return Platform.Web
}
get configPlatform (): Platform {
return Platform.Windows // TODO
}
// Needed for injector metadata
// eslint-disable-next-line @typescript-eslint/no-useless-constructor
constructor (
injector: Injector,
) {
super(injector)
}
newWindow (): void {
throw new Error('Not implemented')
}
relaunch (): void {
location.reload()
}
quit (): void {
window.close()
}
}

View File

@@ -0,0 +1,45 @@
import { Injectable } from '@angular/core'
import { HostWindowService } from 'tabby-core'
@Injectable({ providedIn: 'root' })
export class WebHostWindow extends HostWindowService {
get isFullscreen (): boolean { return !!document.fullscreenElement }
constructor () {
super()
this.windowShown.next()
this.windowFocused.next()
}
reload (): void {
location.reload()
}
setTitle (title?: string): void {
document.title = title ?? 'Tabby'
}
toggleFullscreen (): void {
if (this.isFullscreen) {
document.exitFullscreen()
} else {
document.body.requestFullscreen({ navigationUI: 'hide' })
}
}
minimize (): void {
throw new Error('Unavailable')
}
isMaximized (): boolean {
return true
}
toggleMaximize (): void {
throw new Error('Unavailable')
}
close (): void {
window.close()
}
}

View File

@@ -0,0 +1,9 @@
import { Injectable } from '@angular/core'
import { ConsoleLogger, Logger } from 'tabby-core'
@Injectable({ providedIn: 'root' })
export class ConsoleLogService {
create (name: string): Logger {
return new ConsoleLogger(name)
}
}

View File

@@ -0,0 +1,10 @@
import { UpdaterService } from 'tabby-core'
export class NullUpdaterService extends UpdaterService {
async check (): Promise<boolean> {
return false
}
// eslint-disable-next-line @typescript-eslint/no-empty-function
async update (): Promise<void> { }
}

11
tabby-web/src/styles.scss Normal file
View File

@@ -0,0 +1,11 @@
@import "../../tabby-core/src/theme.vars.scss";
html.tabby {
--lumo-primary-text-color: #{$body-color};
--lumo-base-color: #{$body-bg};
--lumo-body-text-color: #{$body-color};
--lumo-tint-5pct: #{$body-bg};
--lumo-font-family: #{$font-family-sans-serif};
--lumo-font-size-m: #{$font-size-base};
--lumo-box-shadow-m: #{$dropdown-box-shadow};
}

7
tabby-web/tsconfig.json Normal file
View File

@@ -0,0 +1,7 @@
{
"extends": "../tsconfig.json",
"exclude": ["node_modules", "dist"],
"compilerOptions": {
"baseUrl": "src"
}
}

View File

@@ -0,0 +1,14 @@
{
"extends": "../tsconfig.json",
"exclude": ["node_modules", "dist", "typings"],
"compilerOptions": {
"baseUrl": "src",
"emitDeclarationOnly": true,
"declaration": true,
"declarationDir": "./typings",
"paths": {
"tabby-*": ["../../tabby-*"],
"*": ["../../app/node_modules/*"]
}
}
}

View File

@@ -0,0 +1,5 @@
const config = require('../webpack.plugin.config')
module.exports = config({
name: 'web',
dirname: __dirname,
})

178
tabby-web/yarn.lock Normal file
View File

@@ -0,0 +1,178 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@polymer/iron-flex-layout@^3.0.0-pre.26":
version "3.0.1"
resolved "https://registry.yarnpkg.com/@polymer/iron-flex-layout/-/iron-flex-layout-3.0.1.tgz#36f9e1a8eb792d279b2bc75d362628721ad37f0c"
integrity sha512-7gB869czArF+HZcPTVSgvA7tXYFze9EKckvM95NB7SqYF+NnsQyhoXgKnpFwGyo95lUjUW9TFDLUwDXnCYFtkw==
dependencies:
"@polymer/polymer" "^3.0.0"
"@polymer/iron-icon@^3.0.0":
version "3.0.1"
resolved "https://registry.yarnpkg.com/@polymer/iron-icon/-/iron-icon-3.0.1.tgz#93211c39d8825fe4965a68419566036c1df291eb"
integrity sha512-QLPwirk+UPZNaLnMew9VludXA4CWUCenRewgEcGYwdzVgDPCDbXxy6vRJjmweZobMQv/oVLppT2JZtJFnPxX6g==
dependencies:
"@polymer/iron-flex-layout" "^3.0.0-pre.26"
"@polymer/iron-meta" "^3.0.0-pre.26"
"@polymer/polymer" "^3.0.0"
"@polymer/iron-iconset-svg@^3.0.0":
version "3.0.1"
resolved "https://registry.yarnpkg.com/@polymer/iron-iconset-svg/-/iron-iconset-svg-3.0.1.tgz#568d6e7dbc120299dae63be3600aeba0d30ddbea"
integrity sha512-XNwURbNHRw6u2fJe05O5fMYye6GSgDlDqCO+q6K1zAnKIrpgZwf2vTkBd5uCcZwsN0FyCB3mvNZx4jkh85dRDw==
dependencies:
"@polymer/iron-meta" "^3.0.0-pre.26"
"@polymer/polymer" "^3.0.0"
"@polymer/iron-media-query@^3.0.0":
version "3.0.1"
resolved "https://registry.yarnpkg.com/@polymer/iron-media-query/-/iron-media-query-3.0.1.tgz#5cd8a1c1e8c9b8bafd3dd5da14e0f8d2cfa76d83"
integrity sha512-czUX1pm1zfmfcZtq5J57XFkcobBv08Y50exp0/3v8Bos5VL/jv2tU0RwiTfDBxUMhjicGbgwEBFQPY2V5DMzyw==
dependencies:
"@polymer/polymer" "^3.0.0"
"@polymer/iron-meta@^3.0.0-pre.26":
version "3.0.1"
resolved "https://registry.yarnpkg.com/@polymer/iron-meta/-/iron-meta-3.0.1.tgz#7f140628d127b0a284f882f1bb323a261bc125f5"
integrity sha512-pWguPugiLYmWFV9UWxLWzZ6gm4wBwQdDy4VULKwdHCqR7OP7u98h+XDdGZsSlDPv6qoryV/e3tGHlTIT0mbzJA==
dependencies:
"@polymer/polymer" "^3.0.0"
"@polymer/polymer@^3.0.0":
version "3.4.1"
resolved "https://registry.yarnpkg.com/@polymer/polymer/-/polymer-3.4.1.tgz#333bef25711f8411bb5624fb3eba8212ef8bee96"
integrity sha512-KPWnhDZibtqKrUz7enIPOiO4ZQoJNOuLwqrhV2MXzIt3VVnUVJVG5ORz4Z2sgO+UZ+/UZnPD0jqY+jmw/+a9mQ==
dependencies:
"@webcomponents/shadycss" "^1.9.1"
"@vaadin/vaadin-context-menu@^5.0.0":
version "5.0.0"
resolved "https://registry.yarnpkg.com/@vaadin/vaadin-context-menu/-/vaadin-context-menu-5.0.0.tgz#c8ef7a78f107c9824ef90c9331159d5f2818fdac"
integrity sha512-+OIFseHPRy1QraQFLUT/jxCKlvsOVg/NaaHhfonTZdwrO31CTpKGZFCDB0Gvos2W9WdXa6WI12DRJLZF7Wcr0g==
dependencies:
"@polymer/iron-media-query" "^3.0.0"
"@polymer/polymer" "^3.0.0"
"@vaadin/vaadin-element-mixin" "^2.4.1"
"@vaadin/vaadin-item" "^3.0.0"
"@vaadin/vaadin-list-box" "^2.0.0"
"@vaadin/vaadin-lumo-styles" "^1.6.1"
"@vaadin/vaadin-material-styles" "^1.3.2"
"@vaadin/vaadin-overlay" "^3.5.0"
"@vaadin/vaadin-themable-mixin" "^1.6.2"
"@vaadin/vaadin-development-mode-detector@^2.0.0":
version "2.0.4"
resolved "https://registry.yarnpkg.com/@vaadin/vaadin-development-mode-detector/-/vaadin-development-mode-detector-2.0.4.tgz#f49c8009856bead92d248377c36b295b5aae78e5"
integrity sha512-S+PaFrZpK8uBIOnIHxjntTrgumd5ztuCnZww96ydGKXgo9whXfZsbMwDuD/102a/IuPUMyF+dh/n3PbWzJ6igA==
"@vaadin/vaadin-element-mixin@^2.4.0", "@vaadin/vaadin-element-mixin@^2.4.1":
version "2.4.2"
resolved "https://registry.yarnpkg.com/@vaadin/vaadin-element-mixin/-/vaadin-element-mixin-2.4.2.tgz#3c8040a8e756bc274b7777723b1fba2b9895cd41"
integrity sha512-VSDVK0XUsFe/RohpwSzQwgqb2Pwpok6sDNhIDS4CARr3HPhq2voMzT/FowFbkEy0J1hFtN/ZfC7tkv3kdEKKIQ==
dependencies:
"@polymer/polymer" "^3.0.0"
"@vaadin/vaadin-development-mode-detector" "^2.0.0"
"@vaadin/vaadin-usage-statistics" "^2.1.0"
"@vaadin/vaadin-item@^3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@vaadin/vaadin-item/-/vaadin-item-3.0.0.tgz#abbeadd752dd46351217b94351c05bf93d6fad1c"
integrity sha512-AcSqaOd2LJr51JWT3j7GcdbU54oBHAE8xlfeN0O5OdCcsAQJLekkNJ3uxt8Kr3ZP99nnEFTZ1WKcQtEufSAVhA==
dependencies:
"@polymer/polymer" "^3.0.0"
"@vaadin/vaadin-element-mixin" "^2.4.1"
"@vaadin/vaadin-lumo-styles" "^1.6.1"
"@vaadin/vaadin-material-styles" "^1.3.2"
"@vaadin/vaadin-themable-mixin" "^1.6.2"
"@vaadin/vaadin-list-box@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@vaadin/vaadin-list-box/-/vaadin-list-box-2.0.0.tgz#783e1abf1dd50609a7a00a6de2acd2394a1d808e"
integrity sha512-3WU7oU3cgrp7jPet1aAjAIJSQqdVbKAqIPxOH3LsLX7QQAYnWvUwQY+UApPHiJIjpnKF0PfYiIZe1o6adqKivg==
dependencies:
"@polymer/polymer" "^3.0.0"
"@vaadin/vaadin-element-mixin" "^2.4.1"
"@vaadin/vaadin-item" "^3.0.0"
"@vaadin/vaadin-list-mixin" "^2.5.0"
"@vaadin/vaadin-lumo-styles" "^1.6.1"
"@vaadin/vaadin-material-styles" "^1.3.2"
"@vaadin/vaadin-themable-mixin" "^1.6.1"
"@vaadin/vaadin-list-mixin@^2.5.0":
version "2.5.1"
resolved "https://registry.yarnpkg.com/@vaadin/vaadin-list-mixin/-/vaadin-list-mixin-2.5.1.tgz#f6ab60cc658900d3eb7bfff18cf42d769374b659"
integrity sha512-XcMzQ0hJnK/AAiV+bW95nwJgmMIrXUBiSDwM+uvfurcBKqPyM4pm3sj8imh8zXSTfpN4HSjMnrLWU1ZfR330vg==
dependencies:
"@polymer/polymer" "^3.0.0"
"@vaadin/vaadin-element-mixin" "^2.4.1"
"@vaadin/vaadin-lumo-styles@^1.3.0", "@vaadin/vaadin-lumo-styles@^1.6.1":
version "1.6.1"
resolved "https://registry.yarnpkg.com/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-1.6.1.tgz#2099227b0f646ead16f7289e704b6a793594bf5c"
integrity sha512-Yh9ZcekpY7byXP1QJnfx94rVvK71xHBEspsVV7LL7YMvqXU4EAYuzQGYsljryV4PGS9PFPD6sqbGqhEkIhHPnQ==
dependencies:
"@polymer/iron-icon" "^3.0.0"
"@polymer/iron-iconset-svg" "^3.0.0"
"@polymer/polymer" "^3.0.0"
"@vaadin/vaadin-material-styles@^1.2.0", "@vaadin/vaadin-material-styles@^1.3.2":
version "1.3.2"
resolved "https://registry.yarnpkg.com/@vaadin/vaadin-material-styles/-/vaadin-material-styles-1.3.2.tgz#d2c1bd290db16721152ae672dbe052c381686696"
integrity sha512-EFrvGScoxhLNrPnWtT2Ia77whjF2TD4jrcyeh1jv9joCA2n5SUba+4XJciVSGmopqqQato6lwRnZSvMLJX7cyw==
dependencies:
"@polymer/polymer" "^3.0.0"
"@vaadin/vaadin-overlay@^3.5.0":
version "3.5.1"
resolved "https://registry.yarnpkg.com/@vaadin/vaadin-overlay/-/vaadin-overlay-3.5.1.tgz#c4391b3c6c1f7a512b0a6f0dd96f11480feed402"
integrity sha512-0g+poK/BXF92L2lSKrHMY5rcKzUxCBZNzP/NDwgi4a86nbjL7CAKKZdno7Yl+j8UsTR76nOEw4fAYTFi86B0qg==
dependencies:
"@polymer/polymer" "^3.0.0"
"@vaadin/vaadin-element-mixin" "^2.4.0"
"@vaadin/vaadin-lumo-styles" "^1.3.0"
"@vaadin/vaadin-material-styles" "^1.2.0"
"@vaadin/vaadin-themable-mixin" "^1.6.1"
"@vaadin/vaadin-themable-mixin@^1.6.1", "@vaadin/vaadin-themable-mixin@^1.6.2":
version "1.6.2"
resolved "https://registry.yarnpkg.com/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-1.6.2.tgz#8d619722819ba850af777579a550ff8b1d2b960f"
integrity sha512-PZZOZnke3KUlZsDrRVbWxAGEeFBPRyRayNRCvip0XnQK+Zs3cLuRgdgbdro3Ir9LZ3Izsw6HqA6XNMKffEP67A==
dependencies:
"@polymer/polymer" "^3.0.0"
lit-element "^2.0.0"
"@vaadin/vaadin-usage-statistics@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@vaadin/vaadin-usage-statistics/-/vaadin-usage-statistics-2.1.0.tgz#9c0fd71dded80f401bcdfbcb3f45b5640fc4256d"
integrity sha512-e81nbqY5zsaYhLJuOVkJkB/Um1pGK5POIqIlTNhUfjeoyGaJ63tiX8+D5n6F+GgVxUTLUarsKa6SKRcQel0AzA==
dependencies:
"@vaadin/vaadin-development-mode-detector" "^2.0.0"
"@webcomponents/shadycss@^1.9.1":
version "1.10.2"
resolved "https://registry.yarnpkg.com/@webcomponents/shadycss/-/shadycss-1.10.2.tgz#40e03cab6dc5e12f199949ba2b79e02f183d1e7b"
integrity sha512-9Iseu8bRtecb0klvv+WXZOVZatsRkbaH7M97Z+f+Pt909R4lDfgUODAnra23DOZTpeMTAkVpf4m/FZztN7Ox1A==
bootstrap@^4.1.3:
version "4.6.0"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.0.tgz#97b9f29ac98f98dfa43bf7468262d84392552fd7"
integrity sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==
copy-text-to-clipboard@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz#8cbf8f90e0a47f12e4a24743736265d157bce69c"
integrity sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==
lit-element@^2.0.0:
version "2.5.1"
resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-2.5.1.tgz#3fa74b121a6cd22902409ae3859b7847d01aa6b6"
integrity sha512-ogu7PiJTA33bEK0xGu1dmaX5vhcRjBXCFexPja0e7P7jqLhTpNKYRPmE+GmiCaRVAbiQKGkUgkh/i6+bh++dPQ==
dependencies:
lit-html "^1.1.1"
lit-html@^1.1.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-1.4.1.tgz#0c6f3ee4ad4eb610a49831787f0478ad8e9ae5e0"
integrity sha512-B9btcSgPYb1q4oSOb/PrOT6Z/H+r6xuNzfH4lFli/AWhYwdtrgQkQWBbIc6mdnf6E2IL3gDXdkkqNktpU0OZQA==