@toyz/loom 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -11
- package/dist/element/icon.d.ts +1 -3
- package/dist/element/icon.d.ts.map +1 -1
- package/dist/element/icon.js +20 -34
- package/dist/element/icon.js.map +1 -1
- package/dist/element/index.d.ts +0 -1
- package/dist/element/index.d.ts.map +1 -1
- package/dist/element/index.js +3 -0
- package/dist/element/index.js.map +1 -1
- package/dist/element/timing.d.ts +0 -15
- package/dist/element/timing.d.ts.map +1 -1
- package/dist/element/timing.js +22 -12
- package/dist/element/timing.js.map +1 -1
- package/dist/element/virtual.d.ts +46 -41
- package/dist/element/virtual.d.ts.map +1 -1
- package/dist/element/virtual.js +170 -101
- package/dist/element/virtual.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/jsx-runtime.d.ts.map +1 -1
- package/dist/jsx-runtime.js +16 -1
- package/dist/jsx-runtime.js.map +1 -1
- package/dist/morph.d.ts +4 -0
- package/dist/morph.d.ts.map +1 -1
- package/dist/morph.js +25 -0
- package/dist/morph.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -25,17 +25,37 @@ It powers [placing.space](https://placing.space) in production — a real-time c
|
|
|
25
25
|
|
|
26
26
|
## Features
|
|
27
27
|
|
|
28
|
-
- **`@component`** — register custom elements in one line
|
|
28
|
+
- **`@component` / `@styles`** — register custom elements and scoped styles in one line
|
|
29
29
|
- **`@reactive` / `@prop`** — fine-grained reactivity that only re-renders what changed
|
|
30
30
|
- **`@computed` / `@watch`** — derived state and side effects
|
|
31
|
-
- **`@on` / `@emit`** — declarative event handling
|
|
31
|
+
- **`@on` / `@emit`** — declarative event handling via typed event bus
|
|
32
32
|
- **JSX + DOM morphing** — write JSX, get surgical DOM patches (no virtual DOM)
|
|
33
|
-
- **`@inject` / `@service`** — dependency injection container
|
|
34
|
-
- **Hash & history router** — `@route`, `@guard`, `<loom-outlet>`
|
|
33
|
+
- **`@inject` / `@service` / `@factory`** — full dependency injection container
|
|
34
|
+
- **Hash & history router** — `@route`, `@guard`, `@group`, `<loom-outlet>`, `<loom-link>`
|
|
35
|
+
- **`@api` / `@intercept`** — declarative data fetching with SWR, retry, and Result combinators
|
|
36
|
+
- **`@lazy`** — code-split components with one decorator
|
|
37
|
+
- **`@catch_` / `@suspend`** — error boundaries and async loading state
|
|
38
|
+
- **`@interval` / `@timeout` / `@debounce` / `@throttle` / `@animationFrame`** — auto-cleaned timing
|
|
39
|
+
- **`@mount` / `@unmount`** — lifecycle hooks
|
|
40
|
+
- **`@form`** — declarative form binding with validation
|
|
41
|
+
- **`@transform`** — typed value transforms for props and route params
|
|
42
|
+
- **`Reactive<T>` / `CollectionStore<T>`** — observable state with `LocalAdapter` persistence
|
|
35
43
|
- **`css\`\``** — adopted stylesheets with zero FOUC
|
|
36
44
|
- **`<loom-virtual>`** — virtualized list for huge datasets
|
|
45
|
+
- **`createDecorator`** — build your own decorators with the same factory Loom uses
|
|
37
46
|
- **Zero dependencies** — just TypeScript and the platform
|
|
38
47
|
|
|
48
|
+
## Create a Project
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
npm create @toyz/loom my-app
|
|
52
|
+
cd my-app
|
|
53
|
+
npm install
|
|
54
|
+
npm run dev
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Or install manually:
|
|
58
|
+
|
|
39
59
|
## Install
|
|
40
60
|
|
|
41
61
|
```bash
|
|
@@ -44,20 +64,27 @@ npm install @toyz/loom
|
|
|
44
64
|
|
|
45
65
|
## Quick Start
|
|
46
66
|
|
|
47
|
-
```
|
|
48
|
-
import { LoomElement, component, reactive, css } from "@toyz/loom";
|
|
67
|
+
```tsx
|
|
68
|
+
import { LoomElement, component, reactive, css, styles } from "@toyz/loom";
|
|
49
69
|
|
|
50
|
-
const
|
|
51
|
-
button {
|
|
52
|
-
|
|
70
|
+
const counterStyles = css`
|
|
71
|
+
button {
|
|
72
|
+
padding: 0.5rem 1rem;
|
|
73
|
+
border-radius: 6px;
|
|
74
|
+
cursor: pointer;
|
|
75
|
+
}
|
|
76
|
+
span {
|
|
77
|
+
font-weight: bold;
|
|
78
|
+
margin-left: 0.5rem;
|
|
79
|
+
}
|
|
53
80
|
`;
|
|
54
81
|
|
|
55
82
|
@component("click-counter")
|
|
83
|
+
@styles(counterStyles)
|
|
56
84
|
class ClickCounter extends LoomElement {
|
|
57
|
-
@reactive count = 0;
|
|
85
|
+
@reactive accessor count = 0;
|
|
58
86
|
|
|
59
87
|
update() {
|
|
60
|
-
this.shadow.adoptedStyleSheets = [styles];
|
|
61
88
|
return (
|
|
62
89
|
<button onClick={() => this.count++}>
|
|
63
90
|
Clicks: <span>{this.count}</span>
|
package/dist/element/icon.d.ts
CHANGED
|
@@ -27,9 +27,7 @@ export declare class LoomIcon extends LoomElement {
|
|
|
27
27
|
static has(name: string): boolean;
|
|
28
28
|
/** List all registered icon names. */
|
|
29
29
|
static get names(): string[];
|
|
30
|
-
|
|
31
|
-
attributeChangedCallback(name: string, _old: string | null, val: string | null): void;
|
|
32
|
-
connectedCallback(): void;
|
|
30
|
+
private syncVars;
|
|
33
31
|
update(): SVGSVGElement | HTMLSpanElement;
|
|
34
32
|
}
|
|
35
33
|
//# sourceMappingURL=icon.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../src/element/icon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../src/element/icon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AA8BxC,qBAEa,QAAS,SAAQ,WAAW;IAEvC,2DAA2D;IACrD,QAAQ,CAAC,IAAI,SAAM;IAEzB,qBAAqB;IACf,QAAQ,CAAC,IAAI,SAAM;IAEzB,+BAA+B;IACzB,QAAQ,CAAC,KAAK,SAAkB;IAEtC,mFAAmF;IACnF,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIrD,uCAAuC;IACvC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAMvD,sCAAsC;IACtC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,sCAAsC;IACtC,MAAM,KAAK,KAAK,IAAI,MAAM,EAAE,CAE3B;IAID,OAAO,CAAC,QAAQ;IAKhB,MAAM;CAaP"}
|
package/dist/element/icon.js
CHANGED
|
@@ -11,6 +11,13 @@
|
|
|
11
11
|
* // Use anywhere in JSX
|
|
12
12
|
* <loom-icon name="bolt" size={20} color="var(--accent)" />
|
|
13
13
|
*/
|
|
14
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
15
|
+
var useValue = arguments.length > 2;
|
|
16
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
17
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
18
|
+
}
|
|
19
|
+
return useValue ? value : void 0;
|
|
20
|
+
};
|
|
14
21
|
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
15
22
|
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
16
23
|
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
@@ -38,16 +45,10 @@ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn,
|
|
|
38
45
|
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
39
46
|
done = true;
|
|
40
47
|
};
|
|
41
|
-
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
42
|
-
var useValue = arguments.length > 2;
|
|
43
|
-
for (var i = 0; i < initializers.length; i++) {
|
|
44
|
-
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
45
|
-
}
|
|
46
|
-
return useValue ? value : void 0;
|
|
47
|
-
};
|
|
48
48
|
import { LoomElement } from "./element";
|
|
49
|
-
import { component } from "./decorators";
|
|
49
|
+
import { component, styles } from "./decorators";
|
|
50
50
|
import { prop } from "../store/decorators";
|
|
51
|
+
import { watch } from "../store/watch";
|
|
51
52
|
import { css } from "../css";
|
|
52
53
|
const baseStyles = css `
|
|
53
54
|
:host {
|
|
@@ -72,11 +73,12 @@ const baseStyles = css `
|
|
|
72
73
|
/** Icon path data registry (name → SVG inner content) */
|
|
73
74
|
const registry = new Map();
|
|
74
75
|
let LoomIcon = (() => {
|
|
75
|
-
let _classDecorators = [component("loom-icon")];
|
|
76
|
+
let _classDecorators = [component("loom-icon"), styles(baseStyles)];
|
|
76
77
|
let _classDescriptor;
|
|
77
78
|
let _classExtraInitializers = [];
|
|
78
79
|
let _classThis;
|
|
79
80
|
let _classSuper = LoomElement;
|
|
81
|
+
let _instanceExtraInitializers = [];
|
|
80
82
|
let _name_decorators;
|
|
81
83
|
let _name_initializers = [];
|
|
82
84
|
let _name_extraInitializers = [];
|
|
@@ -86,6 +88,7 @@ let LoomIcon = (() => {
|
|
|
86
88
|
let _color_decorators;
|
|
87
89
|
let _color_initializers = [];
|
|
88
90
|
let _color_extraInitializers = [];
|
|
91
|
+
let _syncVars_decorators;
|
|
89
92
|
var LoomIcon = class extends _classSuper {
|
|
90
93
|
static { _classThis = this; }
|
|
91
94
|
static {
|
|
@@ -93,15 +96,17 @@ let LoomIcon = (() => {
|
|
|
93
96
|
_name_decorators = [prop];
|
|
94
97
|
_size_decorators = [prop];
|
|
95
98
|
_color_decorators = [prop];
|
|
99
|
+
_syncVars_decorators = [watch("size"), watch("color")];
|
|
96
100
|
__esDecorate(this, null, _name_decorators, { kind: "accessor", name: "name", static: false, private: false, access: { has: obj => "name" in obj, get: obj => obj.name, set: (obj, value) => { obj.name = value; } }, metadata: _metadata }, _name_initializers, _name_extraInitializers);
|
|
97
101
|
__esDecorate(this, null, _size_decorators, { kind: "accessor", name: "size", static: false, private: false, access: { has: obj => "size" in obj, get: obj => obj.size, set: (obj, value) => { obj.size = value; } }, metadata: _metadata }, _size_initializers, _size_extraInitializers);
|
|
98
102
|
__esDecorate(this, null, _color_decorators, { kind: "accessor", name: "color", static: false, private: false, access: { has: obj => "color" in obj, get: obj => obj.color, set: (obj, value) => { obj.color = value; } }, metadata: _metadata }, _color_initializers, _color_extraInitializers);
|
|
103
|
+
__esDecorate(this, null, _syncVars_decorators, { kind: "method", name: "syncVars", static: false, private: false, access: { has: obj => "syncVars" in obj, get: obj => obj.syncVars }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
99
104
|
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
100
105
|
LoomIcon = _classThis = _classDescriptor.value;
|
|
101
106
|
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
102
107
|
__runInitializers(_classThis, _classExtraInitializers);
|
|
103
108
|
}
|
|
104
|
-
#name_accessor_storage = __runInitializers(this, _name_initializers, "");
|
|
109
|
+
#name_accessor_storage = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _name_initializers, ""));
|
|
105
110
|
/** Icon name (must be registered via LoomIcon.register) */
|
|
106
111
|
get name() { return this.#name_accessor_storage; }
|
|
107
112
|
set name(value) { this.#name_accessor_storage = value; }
|
|
@@ -131,35 +136,16 @@ let LoomIcon = (() => {
|
|
|
131
136
|
static get names() {
|
|
132
137
|
return Array.from(registry.keys());
|
|
133
138
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
// before calling us. We just sync the CSS custom properties immediately.
|
|
138
|
-
if (name === "size" && val !== null) {
|
|
139
|
-
this.style.setProperty("--_s", `${val}px`);
|
|
140
|
-
}
|
|
141
|
-
else if (name === "color" && val !== null) {
|
|
142
|
-
this.style.setProperty("--_c", val);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
connectedCallback() {
|
|
146
|
-
// Set CSS vars from current attributes before first paint
|
|
147
|
-
const s = this.getAttribute("size");
|
|
148
|
-
const c = this.getAttribute("color");
|
|
149
|
-
this.style.setProperty("--_s", `${s ?? this.size}px`);
|
|
150
|
-
if (c)
|
|
151
|
-
this.style.setProperty("--_c", c);
|
|
152
|
-
super.connectedCallback();
|
|
139
|
+
syncVars() {
|
|
140
|
+
this.style.setProperty("--_s", `${this.size}px`);
|
|
141
|
+
this.style.setProperty("--_c", this.color);
|
|
153
142
|
}
|
|
154
143
|
update() {
|
|
155
|
-
this.shadow.adoptedStyleSheets = [baseStyles];
|
|
156
144
|
this.style.setProperty("--_s", `${this.size}px`);
|
|
157
145
|
this.style.setProperty("--_c", this.color);
|
|
158
146
|
const inner = registry.get(this.name);
|
|
159
|
-
if (!inner)
|
|
160
|
-
|
|
161
|
-
return placeholder;
|
|
162
|
-
}
|
|
147
|
+
if (!inner)
|
|
148
|
+
return document.createElement("span");
|
|
163
149
|
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
164
150
|
svg.setAttribute("viewBox", "0 0 24 24");
|
|
165
151
|
svg.setAttribute("aria-hidden", "true");
|
package/dist/element/icon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon.js","sourceRoot":"","sources":["../../src/element/icon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"icon.js","sourceRoot":"","sources":["../../src/element/icon.ts"],"names":[],"mappings":"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"}
|
package/dist/element/index.d.ts
CHANGED
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
* LoomElement base class, built-in elements, and element decorators.
|
|
5
5
|
*/
|
|
6
6
|
export { LoomElement } from "./element";
|
|
7
|
-
export type { VirtualListOptions } from "./virtual";
|
|
8
7
|
export { component, query, queryAll, styles } from "./decorators";
|
|
9
8
|
export { catch_, suspend, mount, unmount } from "./lifecycle";
|
|
10
9
|
export { interval, timeout, debounce, throttle, animationFrame } from "./timing";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/element/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/element/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAOxC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGlE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG9D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGjF,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAGjE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG1C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG/B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/element/index.js
CHANGED
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
*/
|
|
6
6
|
// Base element
|
|
7
7
|
export { LoomElement } from "./element";
|
|
8
|
+
// Built-in elements — import explicitly to opt-in to side effects
|
|
9
|
+
// e.g. import { LoomVirtual } from "@toyz/loom/element/virtual"
|
|
10
|
+
// e.g. import { LoomIcon } from "@toyz/loom/element/icon"
|
|
8
11
|
// Element decorators
|
|
9
12
|
export { component, query, queryAll, styles } from "./decorators";
|
|
10
13
|
// Lifecycle decorators
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/element/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/element/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,kEAAkE;AAClE,gEAAgE;AAChE,0DAA0D;AAE1D,qBAAqB;AACrB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAElE,uBAAuB;AACvB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE9D,oBAAoB;AACpB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEjF,iBAAiB;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9B,yBAAyB;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9B,iBAAiB;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,uBAAuB;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/element/timing.d.ts
CHANGED
|
@@ -48,21 +48,6 @@ export declare function debounce(ms: number): (method: Function, context: ClassM
|
|
|
48
48
|
* ```
|
|
49
49
|
*/
|
|
50
50
|
export declare function throttle(ms: number): (method: Function, context: ClassMethodDecoratorContext) => (this: any, ...args: unknown[]) => void;
|
|
51
|
-
/**
|
|
52
|
-
* Centralized rAF loop via RenderLoop. Method receives (deltaTime, timestamp).
|
|
53
|
-
* Use layer to control execution order (lower = earlier).
|
|
54
|
-
*
|
|
55
|
-
* ```ts
|
|
56
|
-
* @animationFrame(10) // layer 10
|
|
57
|
-
* draw(dt: number, t: number) { ... }
|
|
58
|
-
*
|
|
59
|
-
* @animationFrame() // default layer 0
|
|
60
|
-
* physics(dt: number) { ... }
|
|
61
|
-
*
|
|
62
|
-
* @animationFrame // also valid
|
|
63
|
-
* render(dt: number) { ... }
|
|
64
|
-
* ```
|
|
65
|
-
*/
|
|
66
51
|
export declare function animationFrame(layer?: number): (method: Function, context: ClassMethodDecoratorContext) => void;
|
|
67
52
|
export declare function animationFrame(method: Function, context: ClassMethodDecoratorContext): void;
|
|
68
53
|
//# sourceMappingURL=timing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/element/timing.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH;;;;;;;;GAQG;AACH,eAAO,MAAM,QAAQ,kFAKnB,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,OAAO,kFAKlB,CAAC;AAEH;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,IACzB,QAAQ,QAAQ,EAAE,SAAS,2BAA2B,YAIjC,GAAG,WAAW,OAAO,EAAE,UAerD;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,IACzB,QAAQ,QAAQ,EAAE,SAAS,2BAA2B,YAKjC,GAAG,WAAW,OAAO,EAAE,UAyBrD;
|
|
1
|
+
{"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/element/timing.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH;;;;;;;;GAQG;AACH,eAAO,MAAM,QAAQ,kFAKnB,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,OAAO,kFAKlB,CAAC;AAEH;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,IACzB,QAAQ,QAAQ,EAAE,SAAS,2BAA2B,YAIjC,GAAG,WAAW,OAAO,EAAE,UAerD;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,IACzB,QAAQ,QAAQ,EAAE,SAAS,2BAA2B,YAKjC,GAAG,WAAW,OAAO,EAAE,UAyBrD;AAuBD,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAC;AACjH,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,GAAG,IAAI,CAAC"}
|
package/dist/element/timing.js
CHANGED
|
@@ -108,24 +108,34 @@ export function throttle(ms) {
|
|
|
108
108
|
return replacement;
|
|
109
109
|
};
|
|
110
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Centralized rAF loop via RenderLoop. Method receives (deltaTime, timestamp).
|
|
113
|
+
* Use layer to control execution order (lower = earlier).
|
|
114
|
+
*
|
|
115
|
+
* ```ts
|
|
116
|
+
* @animationFrame(10) // layer 10
|
|
117
|
+
* draw(dt: number, t: number) { ... }
|
|
118
|
+
*
|
|
119
|
+
* @animationFrame() // default layer 0
|
|
120
|
+
* physics(dt: number) { ... }
|
|
121
|
+
*
|
|
122
|
+
* @animationFrame // also valid
|
|
123
|
+
* render(dt: number) { ... }
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
const _af = createDecorator((method, _key, layer) => {
|
|
127
|
+
return (el) => {
|
|
128
|
+
return renderLoop.add(layer, (dt, t) => method.call(el, dt, t));
|
|
129
|
+
};
|
|
130
|
+
});
|
|
111
131
|
export function animationFrame(methodOrLayer, context) {
|
|
112
132
|
// Called as @animationFrame (no parens) — method is first arg
|
|
113
133
|
if (typeof methodOrLayer === "function" && context) {
|
|
114
|
-
|
|
134
|
+
_af(0)(methodOrLayer, context);
|
|
115
135
|
return;
|
|
116
136
|
}
|
|
117
137
|
// Called as @animationFrame() or @animationFrame(layer)
|
|
118
138
|
const layer = typeof methodOrLayer === "number" ? methodOrLayer : 0;
|
|
119
|
-
return (
|
|
120
|
-
}
|
|
121
|
-
/** Internal: wire rAF lifecycle via addInitializer */
|
|
122
|
-
function wireAnimationFrame(method, context, layer) {
|
|
123
|
-
context.addInitializer(function () {
|
|
124
|
-
if (!this[CONNECT_HOOKS])
|
|
125
|
-
this[CONNECT_HOOKS] = [];
|
|
126
|
-
this[CONNECT_HOOKS].push((el) => {
|
|
127
|
-
return renderLoop.add(layer, (dt, t) => method.call(el, dt, t));
|
|
128
|
-
});
|
|
129
|
-
});
|
|
139
|
+
return _af(layer);
|
|
130
140
|
}
|
|
131
141
|
//# sourceMappingURL=timing.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timing.js","sourceRoot":"","sources":["../../src/element/timing.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"timing.js","sourceRoot":"","sources":["../../src/element/timing.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,55 +1,56 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Loom — Virtual List Element
|
|
3
3
|
*
|
|
4
|
-
* Dynamic-height virtual list as a LoomElement
|
|
5
|
-
* Renders only visible items
|
|
6
|
-
* actual heights after paint and caching them.
|
|
4
|
+
* Dynamic-height virtual list as a proper LoomElement.
|
|
5
|
+
* Renders only visible items, measures actual heights after paint.
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
* total content. The consumer's min-height / max-height clamp it.
|
|
10
|
-
* The viewport uses height:100% + overflow-y:auto, which resolves
|
|
11
|
-
* correctly because the host has a definite (inline) height.
|
|
7
|
+
* Uses the children-as-template pattern:
|
|
12
8
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
9
|
+
* <loom-virtual items={messages} estimatedHeight={44}>
|
|
10
|
+
* {(msg: Msg) => <div class="msg">{msg.text}</div>}
|
|
11
|
+
* </loom-virtual>
|
|
12
|
+
*
|
|
13
|
+
* The function child is stored as __childTemplate by the JSX runtime
|
|
14
|
+
* and used to render each visible item on demand.
|
|
15
|
+
*
|
|
16
|
+
* Rendering strategy:
|
|
17
|
+
* - The skeleton (viewport > spacer > window) is built once via update()
|
|
18
|
+
* - shouldUpdate() blocks all subsequent morphs — the skeleton is stable
|
|
19
|
+
* - @animationFrame ticks every frame via Loom's centralized RenderLoop
|
|
20
|
+
* - A `dirty` flag gates rendering: scroll events and item changes set it,
|
|
21
|
+
* the @animationFrame tick checks it and calls renderWindow()
|
|
22
|
+
* - Post-paint measurement uses a single nested rAF inside renderWindow()
|
|
19
23
|
*/
|
|
20
24
|
import { LoomElement } from "./element";
|
|
21
|
-
export interface VirtualListOptions<T> {
|
|
22
|
-
estimatedHeight?: number;
|
|
23
|
-
overscan?: number;
|
|
24
|
-
renderItem: (item: T, index: number) => Node;
|
|
25
|
-
}
|
|
26
25
|
export declare class LoomVirtual<T = any> extends LoomElement {
|
|
26
|
+
/** Items to virtualize */
|
|
27
|
+
accessor items: T[];
|
|
27
28
|
/** Estimated height per item in px (before measurement) */
|
|
28
|
-
estimatedHeight: number;
|
|
29
|
+
accessor estimatedHeight: number;
|
|
29
30
|
/** Extra items above/below visible window */
|
|
30
|
-
overscan: number;
|
|
31
|
-
/**
|
|
32
|
-
|
|
31
|
+
accessor overscan: number;
|
|
32
|
+
/** When true, auto-scrolls to bottom on new items (chat mode) */
|
|
33
|
+
accessor pinToBottom: boolean;
|
|
33
34
|
/** Called when user scrolls near the bottom — use for pagination / infinite scroll */
|
|
34
35
|
onNearEnd: (() => void) | null;
|
|
35
|
-
|
|
36
|
+
accessor viewport: HTMLDivElement;
|
|
37
|
+
accessor spacer: HTMLDivElement;
|
|
38
|
+
accessor window: HTMLDivElement;
|
|
36
39
|
private heightCache;
|
|
37
40
|
private offsets;
|
|
38
41
|
private rangeStart;
|
|
39
42
|
private rangeEnd;
|
|
40
|
-
private
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
/** Replace the full item list and re-render */
|
|
52
|
-
setItems(items: T[]): void;
|
|
43
|
+
private dirty;
|
|
44
|
+
/** Template function from children: {(item, i) => <div>...</div>} */
|
|
45
|
+
private get template();
|
|
46
|
+
update(): Node;
|
|
47
|
+
firstUpdated(): void;
|
|
48
|
+
updated(changed: Map<string, any>): void;
|
|
49
|
+
/**
|
|
50
|
+
* Override shouldUpdate: we handle item rendering manually via renderWindow.
|
|
51
|
+
* Only allow full morph on the very first render (when DOM doesn't exist yet).
|
|
52
|
+
*/
|
|
53
|
+
shouldUpdate(): boolean;
|
|
53
54
|
/** Append items (auto-scrolls if pinned to bottom) */
|
|
54
55
|
push(...newItems: T[]): void;
|
|
55
56
|
/** Scroll to the very bottom */
|
|
@@ -57,13 +58,17 @@ export declare class LoomVirtual<T = any> extends LoomElement {
|
|
|
57
58
|
/** Re-measure all visible items */
|
|
58
59
|
refresh(): void;
|
|
59
60
|
get length(): number;
|
|
61
|
+
/** Invalidate range and schedule a render via @animationFrame */
|
|
62
|
+
private invalidate;
|
|
60
63
|
private isAtBottom;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
+
/** Scroll handler — just marks dirty, @animationFrame does the work */
|
|
65
|
+
onScroll: () => void;
|
|
66
|
+
/** Centralized rAF tick via Loom's RenderLoop — only renders when dirty */
|
|
67
|
+
private tick;
|
|
68
|
+
rebuildOffsets(): void;
|
|
64
69
|
/** Binary search for first item whose bottom edge >= scrollTop */
|
|
65
|
-
|
|
66
|
-
|
|
70
|
+
findStart(scrollTop: number): number;
|
|
71
|
+
renderWindow(): void;
|
|
67
72
|
private measureVisible;
|
|
68
73
|
}
|
|
69
74
|
//# sourceMappingURL=virtual.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"virtual.d.ts","sourceRoot":"","sources":["../../src/element/virtual.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"virtual.d.ts","sourceRoot":"","sources":["../../src/element/virtual.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AA2BxC,qBAEa,WAAW,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,WAAW;IAInD,0BAA0B;IACpB,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,CAAM;IAE/B,2DAA2D;IACrD,QAAQ,CAAC,eAAe,SAAM;IAEpC,6CAA6C;IACvC,QAAQ,CAAC,QAAQ,SAAK;IAE5B,iEAAiE;IAC3D,QAAQ,CAAC,WAAW,UAAQ;IAElC,sFAAsF;IACtF,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAQ;IAKtC,QAAQ,CAAC,QAAQ,EAAG,cAAc,CAAC;IAGnC,QAAQ,CAAC,MAAM,EAAG,cAAc,CAAC;IAGjC,QAAQ,CAAC,MAAM,EAAG,cAAc,CAAC;IAIjC,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,KAAK,CAAS;IAEtB,qEAAqE;IACrE,OAAO,KAAK,QAAQ,GAEnB;IAID,MAAM,IAAI,IAAI;IAgBd,YAAY,IAAI,IAAI;IAQpB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IAMjC;;;OAGG;IACH,YAAY,IAAI,OAAO;IAWvB,sDAAsD;IACtD,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,GAAG,IAAI;IAK5B,gCAAgC;IAChC,WAAW,IAAI,IAAI;IAKnB,mCAAmC;IACnC,OAAO,IAAI,IAAI;IAKf,IAAI,MAAM,IAAI,MAAM,CAEnB;IAID,iEAAiE;IACjE,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,UAAU;IAMlB,uEAAuE;IACvE,QAAQ,aAEN;IAEF,2EAA2E;IAE3E,OAAO,CAAC,IAAI;IAcZ,cAAc;IAUd,kEAAkE;IAClE,SAAS,CAAC,SAAS,EAAE,MAAM;IAU3B,YAAY;IAoDZ,OAAO,CAAC,cAAc;CAcvB"}
|
package/dist/element/virtual.js
CHANGED
|
@@ -1,22 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Loom — Virtual List Element
|
|
3
3
|
*
|
|
4
|
-
* Dynamic-height virtual list as a LoomElement
|
|
5
|
-
* Renders only visible items
|
|
6
|
-
* actual heights after paint and caching them.
|
|
4
|
+
* Dynamic-height virtual list as a proper LoomElement.
|
|
5
|
+
* Renders only visible items, measures actual heights after paint.
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
* total content. The consumer's min-height / max-height clamp it.
|
|
10
|
-
* The viewport uses height:100% + overflow-y:auto, which resolves
|
|
11
|
-
* correctly because the host has a definite (inline) height.
|
|
7
|
+
* Uses the children-as-template pattern:
|
|
12
8
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
9
|
+
* <loom-virtual items={messages} estimatedHeight={44}>
|
|
10
|
+
* {(msg: Msg) => <div class="msg">{msg.text}</div>}
|
|
11
|
+
* </loom-virtual>
|
|
12
|
+
*
|
|
13
|
+
* The function child is stored as __childTemplate by the JSX runtime
|
|
14
|
+
* and used to render each visible item on demand.
|
|
15
|
+
*
|
|
16
|
+
* Rendering strategy:
|
|
17
|
+
* - The skeleton (viewport > spacer > window) is built once via update()
|
|
18
|
+
* - shouldUpdate() blocks all subsequent morphs — the skeleton is stable
|
|
19
|
+
* - @animationFrame ticks every frame via Loom's centralized RenderLoop
|
|
20
|
+
* - A `dirty` flag gates rendering: scroll events and item changes set it,
|
|
21
|
+
* the @animationFrame tick checks it and calls renderWindow()
|
|
22
|
+
* - Post-paint measurement uses a single nested rAF inside renderWindow()
|
|
19
23
|
*/
|
|
24
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
25
|
+
var useValue = arguments.length > 2;
|
|
26
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
27
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
28
|
+
}
|
|
29
|
+
return useValue ? value : void 0;
|
|
30
|
+
};
|
|
20
31
|
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
21
32
|
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
22
33
|
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
@@ -44,17 +55,12 @@ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn,
|
|
|
44
55
|
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
45
56
|
done = true;
|
|
46
57
|
};
|
|
47
|
-
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
48
|
-
var useValue = arguments.length > 2;
|
|
49
|
-
for (var i = 0; i < initializers.length; i++) {
|
|
50
|
-
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
51
|
-
}
|
|
52
|
-
return useValue ? value : void 0;
|
|
53
|
-
};
|
|
54
58
|
import { LoomElement } from "./element";
|
|
55
|
-
import { component } from "./decorators";
|
|
59
|
+
import { component, query, styles } from "./decorators";
|
|
60
|
+
import { prop } from "../store/decorators";
|
|
56
61
|
import { css } from "../css";
|
|
57
|
-
|
|
62
|
+
import { animationFrame } from "./timing";
|
|
63
|
+
const listStyles = css `
|
|
58
64
|
:host {
|
|
59
65
|
display: block;
|
|
60
66
|
}
|
|
@@ -75,85 +81,139 @@ const styles = css `
|
|
|
75
81
|
}
|
|
76
82
|
`;
|
|
77
83
|
let LoomVirtual = (() => {
|
|
78
|
-
let _classDecorators = [component("loom-virtual")];
|
|
84
|
+
let _classDecorators = [component("loom-virtual"), styles(listStyles)];
|
|
79
85
|
let _classDescriptor;
|
|
80
86
|
let _classExtraInitializers = [];
|
|
81
87
|
let _classThis;
|
|
82
88
|
let _classSuper = LoomElement;
|
|
89
|
+
let _instanceExtraInitializers = [];
|
|
90
|
+
let _items_decorators;
|
|
91
|
+
let _items_initializers = [];
|
|
92
|
+
let _items_extraInitializers = [];
|
|
93
|
+
let _estimatedHeight_decorators;
|
|
94
|
+
let _estimatedHeight_initializers = [];
|
|
95
|
+
let _estimatedHeight_extraInitializers = [];
|
|
96
|
+
let _overscan_decorators;
|
|
97
|
+
let _overscan_initializers = [];
|
|
98
|
+
let _overscan_extraInitializers = [];
|
|
99
|
+
let _pinToBottom_decorators;
|
|
100
|
+
let _pinToBottom_initializers = [];
|
|
101
|
+
let _pinToBottom_extraInitializers = [];
|
|
102
|
+
let _viewport_decorators;
|
|
103
|
+
let _viewport_initializers = [];
|
|
104
|
+
let _viewport_extraInitializers = [];
|
|
105
|
+
let _spacer_decorators;
|
|
106
|
+
let _spacer_initializers = [];
|
|
107
|
+
let _spacer_extraInitializers = [];
|
|
108
|
+
let _window_decorators;
|
|
109
|
+
let _window_initializers = [];
|
|
110
|
+
let _window_extraInitializers = [];
|
|
111
|
+
let _tick_decorators;
|
|
83
112
|
var LoomVirtual = class extends _classSuper {
|
|
84
113
|
static { _classThis = this; }
|
|
85
114
|
static {
|
|
86
115
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
116
|
+
_items_decorators = [prop];
|
|
117
|
+
_estimatedHeight_decorators = [prop];
|
|
118
|
+
_overscan_decorators = [prop];
|
|
119
|
+
_pinToBottom_decorators = [prop];
|
|
120
|
+
_viewport_decorators = [query(".vl-viewport")];
|
|
121
|
+
_spacer_decorators = [query(".vl-spacer")];
|
|
122
|
+
_window_decorators = [query(".vl-window")];
|
|
123
|
+
_tick_decorators = [animationFrame];
|
|
124
|
+
__esDecorate(this, null, _items_decorators, { kind: "accessor", name: "items", static: false, private: false, access: { has: obj => "items" in obj, get: obj => obj.items, set: (obj, value) => { obj.items = value; } }, metadata: _metadata }, _items_initializers, _items_extraInitializers);
|
|
125
|
+
__esDecorate(this, null, _estimatedHeight_decorators, { kind: "accessor", name: "estimatedHeight", static: false, private: false, access: { has: obj => "estimatedHeight" in obj, get: obj => obj.estimatedHeight, set: (obj, value) => { obj.estimatedHeight = value; } }, metadata: _metadata }, _estimatedHeight_initializers, _estimatedHeight_extraInitializers);
|
|
126
|
+
__esDecorate(this, null, _overscan_decorators, { kind: "accessor", name: "overscan", static: false, private: false, access: { has: obj => "overscan" in obj, get: obj => obj.overscan, set: (obj, value) => { obj.overscan = value; } }, metadata: _metadata }, _overscan_initializers, _overscan_extraInitializers);
|
|
127
|
+
__esDecorate(this, null, _pinToBottom_decorators, { kind: "accessor", name: "pinToBottom", static: false, private: false, access: { has: obj => "pinToBottom" in obj, get: obj => obj.pinToBottom, set: (obj, value) => { obj.pinToBottom = value; } }, metadata: _metadata }, _pinToBottom_initializers, _pinToBottom_extraInitializers);
|
|
128
|
+
__esDecorate(this, null, _viewport_decorators, { kind: "accessor", name: "viewport", static: false, private: false, access: { has: obj => "viewport" in obj, get: obj => obj.viewport, set: (obj, value) => { obj.viewport = value; } }, metadata: _metadata }, _viewport_initializers, _viewport_extraInitializers);
|
|
129
|
+
__esDecorate(this, null, _spacer_decorators, { kind: "accessor", name: "spacer", static: false, private: false, access: { has: obj => "spacer" in obj, get: obj => obj.spacer, set: (obj, value) => { obj.spacer = value; } }, metadata: _metadata }, _spacer_initializers, _spacer_extraInitializers);
|
|
130
|
+
__esDecorate(this, null, _window_decorators, { kind: "accessor", name: "window", static: false, private: false, access: { has: obj => "window" in obj, get: obj => obj.window, set: (obj, value) => { obj.window = value; } }, metadata: _metadata }, _window_initializers, _window_extraInitializers);
|
|
131
|
+
__esDecorate(this, null, _tick_decorators, { kind: "method", name: "tick", static: false, private: false, access: { has: obj => "tick" in obj, get: obj => obj.tick }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
87
132
|
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
88
133
|
LoomVirtual = _classThis = _classDescriptor.value;
|
|
89
134
|
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
90
135
|
__runInitializers(_classThis, _classExtraInitializers);
|
|
91
136
|
}
|
|
137
|
+
#items_accessor_storage = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _items_initializers, []));
|
|
138
|
+
// ── Public props (settable from JSX) ──
|
|
139
|
+
/** Items to virtualize */
|
|
140
|
+
get items() { return this.#items_accessor_storage; }
|
|
141
|
+
set items(value) { this.#items_accessor_storage = value; }
|
|
142
|
+
#estimatedHeight_accessor_storage = (__runInitializers(this, _items_extraInitializers), __runInitializers(this, _estimatedHeight_initializers, 40));
|
|
92
143
|
/** Estimated height per item in px (before measurement) */
|
|
93
|
-
estimatedHeight
|
|
144
|
+
get estimatedHeight() { return this.#estimatedHeight_accessor_storage; }
|
|
145
|
+
set estimatedHeight(value) { this.#estimatedHeight_accessor_storage = value; }
|
|
146
|
+
#overscan_accessor_storage = (__runInitializers(this, _estimatedHeight_extraInitializers), __runInitializers(this, _overscan_initializers, 3));
|
|
94
147
|
/** Extra items above/below visible window */
|
|
95
|
-
overscan
|
|
96
|
-
|
|
97
|
-
|
|
148
|
+
get overscan() { return this.#overscan_accessor_storage; }
|
|
149
|
+
set overscan(value) { this.#overscan_accessor_storage = value; }
|
|
150
|
+
#pinToBottom_accessor_storage = (__runInitializers(this, _overscan_extraInitializers), __runInitializers(this, _pinToBottom_initializers, true));
|
|
151
|
+
/** When true, auto-scrolls to bottom on new items (chat mode) */
|
|
152
|
+
get pinToBottom() { return this.#pinToBottom_accessor_storage; }
|
|
153
|
+
set pinToBottom(value) { this.#pinToBottom_accessor_storage = value; }
|
|
98
154
|
/** Called when user scrolls near the bottom — use for pagination / infinite scroll */
|
|
99
|
-
onNearEnd = null;
|
|
100
|
-
|
|
101
|
-
|
|
155
|
+
onNearEnd = (__runInitializers(this, _pinToBottom_extraInitializers), null);
|
|
156
|
+
#viewport_accessor_storage = __runInitializers(this, _viewport_initializers, void 0);
|
|
157
|
+
// ── DOM refs via @query ──
|
|
158
|
+
get viewport() { return this.#viewport_accessor_storage; }
|
|
159
|
+
set viewport(value) { this.#viewport_accessor_storage = value; }
|
|
160
|
+
#spacer_accessor_storage = (__runInitializers(this, _viewport_extraInitializers), __runInitializers(this, _spacer_initializers, void 0));
|
|
161
|
+
get spacer() { return this.#spacer_accessor_storage; }
|
|
162
|
+
set spacer(value) { this.#spacer_accessor_storage = value; }
|
|
163
|
+
#window_accessor_storage = (__runInitializers(this, _spacer_extraInitializers), __runInitializers(this, _window_initializers, void 0));
|
|
164
|
+
get window() { return this.#window_accessor_storage; }
|
|
165
|
+
set window(value) { this.#window_accessor_storage = value; }
|
|
166
|
+
// ── Internal state ──
|
|
167
|
+
heightCache = (__runInitializers(this, _window_extraInitializers), new Map());
|
|
102
168
|
offsets = [0];
|
|
103
|
-
rangeStart =
|
|
104
|
-
rangeEnd =
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
169
|
+
rangeStart = -1;
|
|
170
|
+
rangeEnd = -1;
|
|
171
|
+
dirty = false;
|
|
172
|
+
/** Template function from children: {(item, i) => <div>...</div>} */
|
|
173
|
+
get template() {
|
|
174
|
+
return this.__childTemplate ?? null;
|
|
175
|
+
}
|
|
176
|
+
// ── Lifecycle ──
|
|
177
|
+
update() {
|
|
178
|
+
const viewport = document.createElement("div");
|
|
179
|
+
viewport.className = "vl-viewport";
|
|
180
|
+
const spacer = document.createElement("div");
|
|
181
|
+
spacer.className = "vl-spacer";
|
|
182
|
+
const window = document.createElement("div");
|
|
183
|
+
window.className = "vl-window";
|
|
184
|
+
window.setAttribute("loom-keep", "");
|
|
185
|
+
spacer.appendChild(window);
|
|
186
|
+
viewport.appendChild(spacer);
|
|
187
|
+
return viewport;
|
|
116
188
|
}
|
|
117
|
-
|
|
118
|
-
super.connectedCallback();
|
|
119
|
-
this.shadow.adoptedStyleSheets = [styles];
|
|
120
|
-
// Build skeleton in shadow DOM
|
|
121
|
-
this.viewport = document.createElement("div");
|
|
122
|
-
this.viewport.className = "vl-viewport";
|
|
123
|
-
this.spacer = document.createElement("div");
|
|
124
|
-
this.spacer.className = "vl-spacer";
|
|
125
|
-
this.window = document.createElement("div");
|
|
126
|
-
this.window.className = "vl-window";
|
|
127
|
-
this.spacer.appendChild(this.window);
|
|
128
|
-
this.viewport.appendChild(this.spacer);
|
|
129
|
-
this.shadow.appendChild(this.viewport);
|
|
189
|
+
firstUpdated() {
|
|
130
190
|
this.viewport.addEventListener("scroll", this.onScroll, { passive: true });
|
|
131
191
|
this.track(() => this.viewport.removeEventListener("scroll", this.onScroll));
|
|
132
|
-
|
|
192
|
+
// Kick off initial render
|
|
193
|
+
this.invalidate();
|
|
133
194
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
// Only auto-detect pin if already pinned — don't override consumer's explicit false
|
|
138
|
-
if (this.pinToBottom) {
|
|
139
|
-
this.pinToBottom = this.isAtBottom();
|
|
195
|
+
updated(changed) {
|
|
196
|
+
if (changed.has("items")) {
|
|
197
|
+
this.invalidate();
|
|
140
198
|
}
|
|
141
|
-
this.items = items;
|
|
142
|
-
// Invalidate range so renderWindow always re-renders with new data
|
|
143
|
-
this.rangeStart = -1;
|
|
144
|
-
this.rangeEnd = -1;
|
|
145
|
-
this.rebuildOffsets();
|
|
146
|
-
this.scheduleRender();
|
|
147
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* Override shouldUpdate: we handle item rendering manually via renderWindow.
|
|
202
|
+
* Only allow full morph on the very first render (when DOM doesn't exist yet).
|
|
203
|
+
*/
|
|
204
|
+
shouldUpdate() {
|
|
205
|
+
// Let the first update() through to build the skeleton
|
|
206
|
+
if (!this.window)
|
|
207
|
+
return true;
|
|
208
|
+
// After skeleton exists, mark dirty so @animationFrame picks it up
|
|
209
|
+
this.invalidate();
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
// ── Public API (imperative escape hatches) ──
|
|
148
213
|
/** Append items (auto-scrolls if pinned to bottom) */
|
|
149
214
|
push(...newItems) {
|
|
150
215
|
this.pinToBottom = this.isAtBottom();
|
|
151
|
-
|
|
152
|
-
this.items.push(item);
|
|
153
|
-
this.rangeStart = -1;
|
|
154
|
-
this.rangeEnd = -1;
|
|
155
|
-
this.rebuildOffsets();
|
|
156
|
-
this.scheduleRender();
|
|
216
|
+
this.items = [...this.items, ...newItems];
|
|
157
217
|
}
|
|
158
218
|
/** Scroll to the very bottom */
|
|
159
219
|
scrollToEnd() {
|
|
@@ -165,37 +225,49 @@ let LoomVirtual = (() => {
|
|
|
165
225
|
refresh() {
|
|
166
226
|
this.measureVisible();
|
|
167
227
|
this.rebuildOffsets();
|
|
168
|
-
this.scheduleRender();
|
|
169
228
|
}
|
|
170
229
|
get length() {
|
|
171
230
|
return this.items.length;
|
|
172
231
|
}
|
|
173
232
|
// ── Internals ──
|
|
233
|
+
/** Invalidate range and schedule a render via @animationFrame */
|
|
234
|
+
invalidate() {
|
|
235
|
+
this.heightCache.clear();
|
|
236
|
+
this.rangeStart = -1;
|
|
237
|
+
this.rangeEnd = -1;
|
|
238
|
+
this.rebuildOffsets();
|
|
239
|
+
// Clamp scroll position to new content bounds
|
|
240
|
+
if (this.viewport) {
|
|
241
|
+
const maxScroll = this.viewport.scrollHeight - this.viewport.clientHeight;
|
|
242
|
+
if (this.viewport.scrollTop > maxScroll) {
|
|
243
|
+
this.viewport.scrollTop = Math.max(0, maxScroll);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
this.dirty = true;
|
|
247
|
+
}
|
|
174
248
|
isAtBottom() {
|
|
175
249
|
if (!this.viewport)
|
|
176
250
|
return true;
|
|
177
251
|
const { scrollTop, scrollHeight, clientHeight } = this.viewport;
|
|
178
252
|
return scrollHeight - scrollTop - clientHeight < 30;
|
|
179
253
|
}
|
|
254
|
+
/** Scroll handler — just marks dirty, @animationFrame does the work */
|
|
180
255
|
onScroll = () => {
|
|
181
|
-
|
|
182
|
-
this.scrolling = true;
|
|
183
|
-
this.rafId = requestAnimationFrame(() => {
|
|
184
|
-
this.scrolling = false;
|
|
185
|
-
this.renderWindow();
|
|
186
|
-
// Fire near-end callback for infinite scroll
|
|
187
|
-
if (this.onNearEnd && this.viewport) {
|
|
188
|
-
const { scrollTop, scrollHeight, clientHeight } = this.viewport;
|
|
189
|
-
if (scrollHeight - scrollTop - clientHeight < 100) {
|
|
190
|
-
this.onNearEnd();
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
|
-
}
|
|
256
|
+
this.dirty = true;
|
|
195
257
|
};
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
258
|
+
/** Centralized rAF tick via Loom's RenderLoop — only renders when dirty */
|
|
259
|
+
tick() {
|
|
260
|
+
if (!this.dirty)
|
|
261
|
+
return;
|
|
262
|
+
this.dirty = false;
|
|
263
|
+
this.renderWindow();
|
|
264
|
+
// Fire near-end callback for infinite scroll
|
|
265
|
+
if (this.onNearEnd && this.viewport) {
|
|
266
|
+
const { scrollTop, scrollHeight, clientHeight } = this.viewport;
|
|
267
|
+
if (scrollHeight - scrollTop - clientHeight < 100) {
|
|
268
|
+
this.onNearEnd();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
199
271
|
}
|
|
200
272
|
rebuildOffsets() {
|
|
201
273
|
const n = this.items.length;
|
|
@@ -206,10 +278,6 @@ let LoomVirtual = (() => {
|
|
|
206
278
|
}
|
|
207
279
|
if (this.spacer)
|
|
208
280
|
this.spacer.style.height = `${this.offsets[n]}px`;
|
|
209
|
-
// Set host height to total content — external min/max-height will clamp
|
|
210
|
-
if (this.autoHeight) {
|
|
211
|
-
this.style.height = `${this.offsets[n]}px`;
|
|
212
|
-
}
|
|
213
281
|
}
|
|
214
282
|
/** Binary search for first item whose bottom edge >= scrollTop */
|
|
215
283
|
findStart(scrollTop) {
|
|
@@ -224,7 +292,8 @@ let LoomVirtual = (() => {
|
|
|
224
292
|
return lo;
|
|
225
293
|
}
|
|
226
294
|
renderWindow() {
|
|
227
|
-
|
|
295
|
+
const renderFn = this.template;
|
|
296
|
+
if (!renderFn || !this.viewport || !this.window)
|
|
228
297
|
return;
|
|
229
298
|
const n = this.items.length;
|
|
230
299
|
if (n === 0) {
|
|
@@ -237,7 +306,7 @@ let LoomVirtual = (() => {
|
|
|
237
306
|
// If viewport hasn't laid out yet, render a reasonable chunk and retry next frame
|
|
238
307
|
if (viewH === 0) {
|
|
239
308
|
viewH = this.estimatedHeight * 20;
|
|
240
|
-
|
|
309
|
+
this.dirty = true; // retry next frame
|
|
241
310
|
}
|
|
242
311
|
let start = this.findStart(scrollTop);
|
|
243
312
|
let end = start;
|
|
@@ -252,11 +321,11 @@ let LoomVirtual = (() => {
|
|
|
252
321
|
this.window.style.transform = `translateY(${this.offsets[start]}px)`;
|
|
253
322
|
const frag = document.createDocumentFragment();
|
|
254
323
|
for (let i = start; i < end; i++) {
|
|
255
|
-
frag.appendChild(
|
|
324
|
+
frag.appendChild(renderFn(this.items[i], i));
|
|
256
325
|
}
|
|
257
326
|
this.window.textContent = "";
|
|
258
327
|
this.window.appendChild(frag);
|
|
259
|
-
// Measure after paint
|
|
328
|
+
// Measure after paint (needs one more frame for browser to layout)
|
|
260
329
|
requestAnimationFrame(() => {
|
|
261
330
|
this.measureVisible();
|
|
262
331
|
if (this.pinToBottom && this.viewport) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"virtual.js","sourceRoot":"","sources":["../../src/element/virtual.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"virtual.js","sourceRoot":"","sources":["../../src/element/virtual.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,IAAI,EAAY,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,UAAU,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;CAmBrB,CAAC;IAIW,WAAW;4BAFvB,SAAS,CAAC,cAAc,CAAC,EACzB,MAAM,CAAC,UAAU,CAAC;;;;sBACuB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;2BAAnB,SAAQ,WAAW;;;;iCAKlD,IAAI;2CAGJ,IAAI;oCAGJ,IAAI;uCAGJ,IAAI;oCAOJ,KAAK,CAAiB,cAAc,CAAC;kCAGrC,KAAK,CAAiB,YAAY,CAAC;kCAGnC,KAAK,CAAiB,YAAY,CAAC;gCAqHnC,cAAc;YA3IT,oKAAS,KAAK,6BAAL,KAAK,qFAAW;YAGzB,kMAAS,eAAe,6BAAf,eAAe,yGAAM;YAG9B,6KAAS,QAAQ,6BAAR,QAAQ,2FAAK;YAGtB,sLAAS,WAAW,6BAAX,WAAW,iGAAQ;YAQlC,6KAAS,QAAQ,6BAAR,QAAQ,2FAAkB;YAGnC,uKAAS,MAAM,6BAAN,MAAM,uFAAkB;YAGjC,uKAAS,MAAM,6BAAN,MAAM,uFAAkB;YAqHjC,+JAAQ,IAAI,6DAYX;YA7JH,6KAsPC;;;YAtPY,uDAAW;;QAKhB,2BALK,mDAAW,+CAKM,EAAE,GAAC;QAH/B,yCAAyC;QAEzC,0BAA0B;QACpB,IAAS,KAAK,2CAAW;QAAzB,IAAS,KAAK,iDAAW;QAGzB,+IAA2B,EAAE,GAAC;QADpC,2DAA2D;QACrD,IAAS,eAAe,qDAAM;QAA9B,IAAS,eAAe,2DAAM;QAG9B,2IAAoB,CAAC,GAAC;QAD5B,6CAA6C;QACvC,IAAS,QAAQ,8CAAK;QAAtB,IAAS,QAAQ,oDAAK;QAGtB,0IAAuB,IAAI,GAAC;QADlC,iEAAiE;QAC3D,IAAS,WAAW,iDAAQ;QAA5B,IAAS,WAAW,uDAAQ;QAElC,sFAAsF;QACtF,SAAS,6DAAwB,IAAI,EAAC;QAKtC,qFAAmC;QAHnC,4BAA4B;QAG5B,IAAS,QAAQ,8CAAkB;QAAnC,IAAS,QAAQ,oDAAkB;QAGnC,yIAAiC;QAAjC,IAAS,MAAM,4CAAkB;QAAjC,IAAS,MAAM,kDAAkB;QAGjC,uIAAiC;QAAjC,IAAS,MAAM,4CAAkB;QAAjC,IAAS,MAAM,kDAAkB;QAEjC,uBAAuB;QAEf,WAAW,wDAAG,IAAI,GAAG,EAAkB,EAAC;QACxC,OAAO,GAAa,CAAC,CAAC,CAAC,CAAC;QACxB,UAAU,GAAG,CAAC,CAAC,CAAC;QAChB,QAAQ,GAAG,CAAC,CAAC,CAAC;QACd,KAAK,GAAG,KAAK,CAAC;QAEtB,qEAAqE;QACrE,IAAY,QAAQ;YAClB,OAAQ,IAAY,CAAC,eAAe,IAAI,IAAI,CAAC;QAC/C,CAAC;QAED,kBAAkB;QAElB,MAAM;YACJ,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC/C,QAAQ,CAAC,SAAS,GAAG,aAAa,CAAC;YAEnC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,GAAG,WAAW,CAAC;YAE/B,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,GAAG,WAAW,CAAC;YAC/B,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAErC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC3B,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC7B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,YAAY;YACV,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3E,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE7E,0BAA0B;YAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;QAED,OAAO,CAAC,OAAyB;YAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;QACH,CAAC;QAED;;;WAGG;QACH,YAAY;YACV,uDAAuD;YACvD,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YAE9B,mEAAmE;YACnE,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,+CAA+C;QAE/C,sDAAsD;QACtD,IAAI,CAAC,GAAG,QAAa;YACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC;QAC5C,CAAC;QAED,gCAAgC;QAChC,WAAW;YACT,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC1E,CAAC;QAED,mCAAmC;QACnC,OAAO;YACL,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;QAED,IAAI,MAAM;YACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAC3B,CAAC;QAED,kBAAkB;QAElB,iEAAiE;QACzD,UAAU;YAChB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YACrB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YACnB,IAAI,CAAC,cAAc,EAAE,CAAC;YAEtB,8CAA8C;YAC9C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAC1E,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;oBACxC,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;YAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QAEO,UAAU;YAChB,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAChC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;YAChE,OAAO,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,EAAE,CAAC;QACtD,CAAC;QAED,uEAAuE;QACvE,QAAQ,GAAG,GAAG,EAAE;YACd,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC,CAAC;QAEF,2EAA2E;QAEnE,IAAI;YACV,IAAI,CAAC,IAAI,CAAC,KAAK;gBAAE,OAAO;YACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,YAAY,EAAE,CAAC;YAEpB,6CAA6C;YAC7C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAChE,IAAI,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,GAAG,EAAE,CAAC;oBAClD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QAED,cAAc;YACZ,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC;YAC5F,CAAC;YACD,IAAI,IAAI,CAAC,MAAM;gBAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,CAAC;QAED,kEAAkE;QAClE,SAAS,CAAC,SAAiB;YACzB,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YACnC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;gBAC5B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,SAAS;oBAAE,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;;oBAChD,EAAE,GAAG,GAAG,CAAC;YAChB,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,YAAY;YACV,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO;YAExD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACZ,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC;gBAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACpC,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC1C,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;YAEvC,kFAAkF;YAClF,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,KAAK,GAAG,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,mBAAmB;YACxC,CAAC;YAED,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACtC,IAAI,GAAG,GAAG,KAAK,CAAC;YAChB,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,KAAK;gBAAE,GAAG,EAAE,CAAC;YAE/D,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3C,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEvC,IAAI,KAAK,KAAK,IAAI,CAAC,UAAU,IAAI,GAAG,KAAK,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAE/D,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;YAEpB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,cAAc,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;YAErE,MAAM,IAAI,GAAG,QAAQ,CAAC,sBAAsB,EAAE,CAAC;YAC/C,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAE9B,mEAAmE;YACnE,qBAAqB,CAAC,GAAG,EAAE;gBACzB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACtC,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;oBACrD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC3B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAEO,cAAc;YACpB,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACtC,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;gBAChC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,MAAM,CAAC,CAAC;gBAChE,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBAC7B,KAAK,GAAG,IAAI,CAAC;gBACf,CAAC;YACH,CAAC;YACD,IAAI,KAAK;gBAAE,IAAI,CAAC,cAAc,EAAE,CAAC;QACnC,CAAC;;;;SArPU,WAAW"}
|
package/dist/index.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ export { service, inject, factory } from "./di";
|
|
|
21
21
|
/** @deprecated Use `@watch(Service)` or `@watch(Service, "prop")` instead. Will be removed in v1.0. */
|
|
22
22
|
export { watch as watchService } from "./di";
|
|
23
23
|
export { LoomElement, component, query, queryAll, styles, catch_, suspend, mount, unmount, interval, timeout, debounce, throttle, animationFrame, form, lazy, slot, transition, } from "./element";
|
|
24
|
-
export type {
|
|
24
|
+
export type { FormState, FormSchema, FieldSchema, LazyOptions, TransitionOptions } from "./element";
|
|
25
25
|
export { transform, createTransform, typed, typedTransformer, toNumber, toBoolean, toDate, toJSON, toTrimmed, toInt, toFloat, } from "./transform";
|
|
26
26
|
export type { TransformSchema } from "./transform";
|
|
27
27
|
export { on, emit, createDecorator } from "./decorators";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,YAAY,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGrC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGlD,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,YAAY,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGtC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAKhD,OAAO,EACL,QAAQ,EAAE,eAAe,EACzB,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EACvE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAC5C,KAAK,EACL,KAAK,GACN,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,UAAU,EAAE,OAAO,EAAE,YAAY,EACjC,cAAc,EAAE,aAAa,EAAE,cAAc,GAC9C,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAChD,uGAAuG;AACvG,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,MAAM,CAAC;AAG7C,OAAO,EACL,WAAW,EACX,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAClC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAC/B,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EACrD,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,GAC7B,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,YAAY,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGrC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGlD,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,YAAY,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGtC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAKhD,OAAO,EACL,QAAQ,EAAE,eAAe,EACzB,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EACvE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAC5C,KAAK,EACL,KAAK,GACN,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,UAAU,EAAE,OAAO,EAAE,YAAY,EACjC,cAAc,EAAE,aAAa,EAAE,cAAc,GAC9C,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAChD,uGAAuG;AACvG,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,MAAM,CAAC;AAG7C,OAAO,EACL,WAAW,EACX,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAClC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAC/B,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EACrD,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,GAC7B,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGpG,OAAO,EACL,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAC/D,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGzD,OAAO,EACL,UAAU,EACV,YAAY,EACZ,KAAK,EACL,KAAK,EACL,KAAK,EACL,UAAU,EACV,MAAM,EACN,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,YAAY,GACb,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAG5F,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzD,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG9E,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-runtime.d.ts","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,wBAAgB,GAAG,CACjB,GAAG,EAAE,MAAM,GAAG,QAAQ,EACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACzB,WAAW,GAAG,UAAU,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"jsx-runtime.d.ts","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/jsx-runtime.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Zero vDOM. JSX compiles directly to DOM elements.
|
|
5
5
|
* Configure via tsconfig: "jsxImportSource": "loom"
|
|
6
6
|
*/
|
|
7
|
-
import { LOOM_EVENTS } from "./morph";
|
|
7
|
+
import { LOOM_EVENTS, LOOM_PROPS } from "./morph";
|
|
8
8
|
import { startSubTrace, endSubTrace, addBinding } from "./trace";
|
|
9
9
|
const SVG_NS = "http://www.w3.org/2000/svg";
|
|
10
10
|
const SVG_TAGS = new Set([
|
|
@@ -93,6 +93,13 @@ export function jsx(tag, props) {
|
|
|
93
93
|
else if (typeof val === "object" || typeof val === "function") {
|
|
94
94
|
// Non-primitive values (arrays, objects) — set as JS property
|
|
95
95
|
el[key] = val;
|
|
96
|
+
// Track for morph diffing (so morph copies them to the existing element)
|
|
97
|
+
let tracked = el[LOOM_PROPS];
|
|
98
|
+
if (!tracked) {
|
|
99
|
+
tracked = new Map();
|
|
100
|
+
el[LOOM_PROPS] = tracked;
|
|
101
|
+
}
|
|
102
|
+
tracked.set(key, val);
|
|
96
103
|
}
|
|
97
104
|
else {
|
|
98
105
|
// Check for closure binding: class={() => this.theme}
|
|
@@ -138,6 +145,14 @@ function appendChildren(parent, children) {
|
|
|
138
145
|
parent.appendChild(children);
|
|
139
146
|
}
|
|
140
147
|
else if (typeof children === "function") {
|
|
148
|
+
// Template function for custom elements: {(item) => <div>...</div>}
|
|
149
|
+
// Distinguished from text closures by having declared parameters (fn.length > 0)
|
|
150
|
+
if (parent.nodeType === 1 &&
|
|
151
|
+
parent.tagName?.includes('-') &&
|
|
152
|
+
children.length > 0) {
|
|
153
|
+
parent.__childTemplate = children;
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
141
156
|
// Phase 2: Closure binding for text — {() => this.count}
|
|
142
157
|
const textNode = document.createTextNode("");
|
|
143
158
|
parent.appendChild(textNode);
|
package/dist/jsx-runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-runtime.js","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"jsx-runtime.js","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/morph.d.ts
CHANGED
|
@@ -13,8 +13,12 @@
|
|
|
13
13
|
*/
|
|
14
14
|
/** Expando key for tracked event listeners */
|
|
15
15
|
export declare const LOOM_EVENTS = "__loomEvents";
|
|
16
|
+
/** Expando key for tracked JS properties (non-attribute, non-event) */
|
|
17
|
+
export declare const LOOM_PROPS = "__loomProps";
|
|
16
18
|
/** Type for tracked events on an element */
|
|
17
19
|
export type LoomEventMap = Map<string, EventListener>;
|
|
20
|
+
/** Type for tracked JS properties on an element */
|
|
21
|
+
export type LoomPropMap = Map<string, any>;
|
|
18
22
|
/**
|
|
19
23
|
* Morph the children of `root` (typically a ShadowRoot) to match `newTree`.
|
|
20
24
|
* `newTree` can be a single Node or an array of Nodes (from Fragment).
|
package/dist/morph.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"morph.d.ts","sourceRoot":"","sources":["../src/morph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,8CAA8C;AAC9C,eAAO,MAAM,WAAW,iBAAiB,CAAC;AAE1C,4CAA4C;AAC5C,MAAM,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"morph.d.ts","sourceRoot":"","sources":["../src/morph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,8CAA8C;AAC9C,eAAO,MAAM,WAAW,iBAAiB,CAAC;AAE1C,uEAAuE;AACvE,eAAO,MAAM,UAAU,gBAAgB,CAAC;AAExC,4CAA4C;AAC5C,MAAM,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAEtD,mDAAmD;AACnD,MAAM,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAI3C;;;GAGG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,EAAE,OAAO,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,CAGlF"}
|
package/dist/morph.js
CHANGED
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
*/
|
|
14
14
|
/** Expando key for tracked event listeners */
|
|
15
15
|
export const LOOM_EVENTS = "__loomEvents";
|
|
16
|
+
/** Expando key for tracked JS properties (non-attribute, non-event) */
|
|
17
|
+
export const LOOM_PROPS = "__loomProps";
|
|
16
18
|
// ── Public API ──
|
|
17
19
|
/**
|
|
18
20
|
* Morph the children of `root` (typically a ShadowRoot) to match `newTree`.
|
|
@@ -110,6 +112,8 @@ function morphNode(old, next) {
|
|
|
110
112
|
patchEvents(oldEl, nextEl);
|
|
111
113
|
// Patch special DOM properties
|
|
112
114
|
patchProperties(oldEl, nextEl);
|
|
115
|
+
// Patch JSX-set JS properties (items, estimatedHeight, etc.)
|
|
116
|
+
patchJSProps(oldEl, nextEl);
|
|
113
117
|
// innerHTML / rawHTML — if the new element used rawHTML, just slam it
|
|
114
118
|
// The JSX runtime sets a __loomRawHTML marker
|
|
115
119
|
if (nextEl.__loomRawHTML) {
|
|
@@ -176,6 +180,27 @@ function patchProperties(old, next) {
|
|
|
176
180
|
}
|
|
177
181
|
}
|
|
178
182
|
}
|
|
183
|
+
// ── JSX JS-property patching ──
|
|
184
|
+
function patchJSProps(old, next) {
|
|
185
|
+
const newProps = next[LOOM_PROPS];
|
|
186
|
+
const oldProps = old[LOOM_PROPS] ?? new Map();
|
|
187
|
+
// Remove old props not in new
|
|
188
|
+
for (const key of oldProps.keys()) {
|
|
189
|
+
if (!newProps?.has(key)) {
|
|
190
|
+
oldProps.delete(key);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Set/update props from new
|
|
194
|
+
if (newProps) {
|
|
195
|
+
for (const [key, val] of newProps) {
|
|
196
|
+
if (old[key] !== val) {
|
|
197
|
+
old[key] = val;
|
|
198
|
+
}
|
|
199
|
+
oldProps.set(key, val);
|
|
200
|
+
}
|
|
201
|
+
old[LOOM_PROPS] = oldProps;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
179
204
|
// ── Helpers ──
|
|
180
205
|
function getKey(node) {
|
|
181
206
|
if (node.nodeType !== Node.ELEMENT_NODE)
|
package/dist/morph.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"morph.js","sourceRoot":"","sources":["../src/morph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,8CAA8C;AAC9C,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"morph.js","sourceRoot":"","sources":["../src/morph.ts"],"names":[],"mappings":"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"}
|