diff --git a/packages/html2/src/index.ts b/packages/html2/src/index.ts
index b61f911..4b37dae 100644
--- a/packages/html2/src/index.ts
+++ b/packages/html2/src/index.ts
@@ -17,6 +17,8 @@ type Wrapped = {
options?: AddEventListenerOptions | boolean,
};
+export type NodeGenerator = (t: HtmlFragmentsTemplate) => HtmlFragment;
+
export class Widget implements EventTarget {
facet: Facet;
node: Dataflow.Field;
@@ -24,7 +26,7 @@ export class Widget implements EventTarget {
new Map>();
_parent: Dataflow.Field;
- constructor (private nodeGenerator: (t: HtmlFragmentsTemplate) => HtmlFragment) {
+ constructor (private nodeGenerator: NodeGenerator) {
this.facet = Turn.activeFacet;
on stop {
@@ -170,6 +172,50 @@ export class Widget implements EventTarget {
}
}
+export class ValueWidget extends Widget {
+ _value: Dataflow.Field;
+ _valueAsNumber: Dataflow.Field;
+
+ constructor (nodeGenerator: NodeGenerator) {
+ super(nodeGenerator);
+
+ field value: string = '';
+ this._value = value;
+
+ field valueAsNumber: number = NaN;
+ this._valueAsNumber = valueAsNumber;
+
+ const readValues = (n: any) => {
+ this._value.value = n?.value ?? '';
+ this._valueAsNumber.value = n?.valueAsNumber ?? NaN;
+ };
+
+ this.on('change', e => readValues(e.target));
+
+ dataflow {
+ if (this.node.value && 'value' in this.node.value) {
+ readValues(this.node.value);
+ }
+ }
+ dataflow {
+ if (this.node.value && 'value' in this.node.value) {
+ (this.node.value as any).value = '' + this._valueAsNumber.value;
+ }
+ }
+ dataflow {
+ if (this.node.value && 'value' in this.node.value) {
+ this.node.value.value = this._value.value;
+ }
+ }
+ }
+
+ get value(): string { return this._value.value; }
+ set value(v: string) { this._value.value = v; }
+
+ get valueAsNumber(): number { return this._valueAsNumber.value; }
+ set valueAsNumber(v: number) { this._valueAsNumber.value = v; }
+}
+
function spawnLocationHashTracker(ds: Ref) {
spawn named 'LocationHashTracker' {
at ds {