Files
AFFiNE-Mirror/apps/web/src/components/simple-counter/index.ts
2023-02-10 12:41:01 +00:00

60 lines
1.3 KiB
TypeScript

import { LitElement, css, html } from 'lit';
import { customElement, property, state } from 'lit/decorators.js';
import * as React from 'react';
export const tagName = 'simple-counter';
// Adapt React in order to be able to use custom tags properly
declare global {
// eslint-disable-next-line @typescript-eslint/no-namespace
namespace JSX {
interface IntrinsicElements {
[tagName]: PersonInfoProps;
}
}
}
interface PersonInfoProps
extends React.DetailedHTMLProps<
React.HTMLAttributes<HTMLElement>,
HTMLElement
> {
name?: string;
}
// ===================== Adapt end ====================
@customElement(tagName)
export class Counter extends LitElement {
static styles = css`
.counter-container {
display: flex;
color: var(--affine-text-color);
}
button {
margin: 0 5px;
}
`;
@property()
name?: string = '';
@state()
count = 0;
// Render the UI as a function of component state
render() {
return html`<div class="counter-container">
<div class="name">${this.name}</div>
<button @click=${this._subtract}>-</button>
<div>${this.count}</div>
<button @click="${this._increment}">+</button>
</div>`;
}
private _increment() {
this.count++;
}
private _subtract() {
this.count--;
}
}