Web Components engine based on JSX & TypeScript
Demo & GitHub template: https://web-cell.dev/scaffold/
Command
npm init -y
npm install web-cell
npm install parcel -D
package.json
{
"scripts": {
"start": "parcel source/index.html --open",
"build": "parcel build source/index.html --public-url"
}
}
source/index.html
<script
crossorigin
src="https://polyfill.app/api/polyfill?features=es.array.flat,es.object.from-entries"
></script>
<script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs@2.5.0/webcomponents-bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs@2.5.0/custom-elements-es5-adapter.js"></script>
<script src="https://cdn.jsdelivr.net/npm/element-internals-polyfill@0.1.43/dist/index.min.js"></script>
<script src="source/SubTag.tsx"></script>
<script src="source/TestTag.tsx"></script>
<sub-tag></sub-tag>
<test-tag></test-tag>
source/SubTag.tsx
import { createCell, component, mixin } from 'web-cell';
export function InlineTag({ defaultSlot }: any) {
return <span>{defaultSlot}</span>;
}
@component({
tagName: 'sub-tag',
renderTarget: 'children'
})
export class SubTag extends mixin() {
render() {
return <InlineTag>test</InlineTag>;
}
}
source/TestTag.tsx
import {
createCell,
component,
mixin,
attribute,
watch,
on,
Fragment
} from 'web-cell';
import { SubTag } from './SubTag';
interface Props {
title?: string;
}
interface State {
status: string;
}
@component({
tagName: 'test-tag',
style: {
'.title': {
color: 'lightblue'
},
'.title.active': {
color: 'lightpink'
}
}
})
export class TestTag extends mixin<Props, State>() {
@attribute
@watch
title = 'Test';
state = { status: '' };
onClick = () => (this.title = 'Example');
@on('click', ':host h1')
onDelegate() {
this.setState({ status: 'active' });
}
render({ title }: Props, { status }: State) {
return (
<>
<h1 title={title} className={`title ${status}`}>
{title}
<img alt={title} onClick={this.onClick} />
<SubTag />
</h1>
</>
);
}
}
- Web components
- Custom elements
- Shadow DOM
- Element Internals
- CSS variables
- ECMAScript 6+
- TypeScript 4+
We recommend these libraries to use with WebCell:
-
State management: MobX (also powered by TypeScript & Decorator)
-
Router: Cell Router
-
UI components
- BootCell (based on BootStrap v4)
- Material Cell (based on Material Design)
- GitHub Web Widget
-
HTTP request: KoAJAX (based on Koa-like middlewares)
-
Utility: Web utility (Methods & Types)
-
Event stream: Iterable Observer (Observable proposal)
-
MarkDown integration: MarkCell (MDX implement)
Go to contribute!