@tripod311/splash 0.0.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 +241 -0
- package/dist/component.d.ts +39 -0
- package/dist/component.d.ts.map +1 -0
- package/dist/component.js +180 -0
- package/dist/component.js.map +1 -0
- package/dist/componentState.d.ts +13 -0
- package/dist/componentState.d.ts.map +1 -0
- package/dist/componentState.js +55 -0
- package/dist/componentState.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/reactiveElement.d.ts +7 -0
- package/dist/reactiveElement.d.ts.map +1 -0
- package/dist/reactiveElement.js +13 -0
- package/dist/reactiveElement.js.map +1 -0
- package/dist/reactives/reactiveClass.d.ts +8 -0
- package/dist/reactives/reactiveClass.d.ts.map +1 -0
- package/dist/reactives/reactiveClass.js +18 -0
- package/dist/reactives/reactiveClass.js.map +1 -0
- package/dist/reactives/reactiveHTML.d.ts +8 -0
- package/dist/reactives/reactiveHTML.d.ts.map +1 -0
- package/dist/reactives/reactiveHTML.js +16 -0
- package/dist/reactives/reactiveHTML.js.map +1 -0
- package/dist/reactives/reactiveProp.d.ts +9 -0
- package/dist/reactives/reactiveProp.d.ts.map +1 -0
- package/dist/reactives/reactiveProp.js +29 -0
- package/dist/reactives/reactiveProp.js.map +1 -0
- package/dist/reactives/reactiveStyle.d.ts +8 -0
- package/dist/reactives/reactiveStyle.d.ts.map +1 -0
- package/dist/reactives/reactiveStyle.js +39 -0
- package/dist/reactives/reactiveStyle.js.map +1 -0
- package/dist/reactives/reactiveText.d.ts +8 -0
- package/dist/reactives/reactiveText.d.ts.map +1 -0
- package/dist/reactives/reactiveText.js +16 -0
- package/dist/reactives/reactiveText.js.map +1 -0
- package/dist/slot.d.ts +20 -0
- package/dist/slot.d.ts.map +1 -0
- package/dist/slot.js +108 -0
- package/dist/slot.js.map +1 -0
- package/dist/templateCache.d.ts +6 -0
- package/dist/templateCache.d.ts.map +1 -0
- package/dist/templateCache.js +14 -0
- package/dist/templateCache.js.map +1 -0
- package/package.json +27 -0
package/README.md
ADDED
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# Splash
|
|
2
|
+
|
|
3
|
+
Splash is a zero-dependency minimalistic UI framework that tries to achieve JSX/Vue template level of comfort without a virtual DOM.
|
|
4
|
+
|
|
5
|
+
In Splash every component is an extended DOM node with all the consequences — you can add, remove or insert them in regular DOM elements.
|
|
6
|
+
That’s why it’s called **Splash** — just splash your component anywhere on the page and it will work according to its inner logic.
|
|
7
|
+
|
|
8
|
+
Splash does not separate props and state variables like other frameworks, primarily because it focuses on rendering the view only.
|
|
9
|
+
That means a clear split between **component view** and **component logic**.
|
|
10
|
+
Also it means that all the data passed from a parent component to its children can affect child views immediately — you just need to take it into account.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Core Ideas
|
|
15
|
+
|
|
16
|
+
1. **Component = one DOM element**
|
|
17
|
+
- No ambiguities, no phantom nodes.
|
|
18
|
+
- Conditional rendering is solved inside the component.
|
|
19
|
+
- If you need a hybrid case — use `ref` and manage it manually.
|
|
20
|
+
|
|
21
|
+
2. **Direct DOM**
|
|
22
|
+
- No virtual tree.
|
|
23
|
+
- Everything is stored and updated directly in the DOM.
|
|
24
|
+
- The browser already optimizes repaints — no need for batching.
|
|
25
|
+
|
|
26
|
+
3. **Minimal directives**
|
|
27
|
+
Just six built-in directives:
|
|
28
|
+
- `data-ref` — reference to a specific element.
|
|
29
|
+
- `data-slot` — mount point for other components.
|
|
30
|
+
- `data-text` — reactive text.
|
|
31
|
+
- `data-html` — dynamic HTML.
|
|
32
|
+
- `data-class` — reactive classes.
|
|
33
|
+
- `data-style` — reactive styles.
|
|
34
|
+
Additionally:
|
|
35
|
+
- `data-prop-*` — reactive binding to any attribute (src, href, etc.).
|
|
36
|
+
|
|
37
|
+
4. **Lifecycle hooks**
|
|
38
|
+
- `mounted()` — called after insertion into the DOM.
|
|
39
|
+
- `unmounted()` — called when removed.
|
|
40
|
+
- `transitionEntry()` — called after mounting + rendering (for CSS animations).
|
|
41
|
+
|
|
42
|
+
5. **Single source of truth: state**
|
|
43
|
+
- Each component receives `options: Record<string, any>`.
|
|
44
|
+
- These turn into the component’s `state`.
|
|
45
|
+
- No props vs. state confusion — only a single object.
|
|
46
|
+
- State updates trigger view updates exactly where needed.
|
|
47
|
+
|
|
48
|
+
6. **Errors are not hidden**
|
|
49
|
+
- Splash is not a nanny.
|
|
50
|
+
- If you create an infinite update loop, that’s your bug.
|
|
51
|
+
- Architectural mistakes are visible immediately.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Philosophy
|
|
56
|
+
|
|
57
|
+
- **No extra layers.** DOM already does everything, no need to reinvent it.
|
|
58
|
+
- **Simplicity over magic.** Minimal directives, maximum predictability.
|
|
59
|
+
- **Trust the developer.** If you want to work directly with DOM — go ahead.
|
|
60
|
+
- **Efficiency is natural.** Browsers already batch repaints, no extra abstraction needed.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## API
|
|
65
|
+
|
|
66
|
+
### 1. Component
|
|
67
|
+
|
|
68
|
+
Each component is a visible entity. You may think of it as an extension of a DOM node. Each component exposes its root DOM element via the component.DOMNode property, so you can directly manipulate it if needed.
|
|
69
|
+
A component must have a **template** — plain HTML with several helper directives.
|
|
70
|
+
|
|
71
|
+
**Example template (myComponent.html):**
|
|
72
|
+
```html
|
|
73
|
+
<div data-ref="container">
|
|
74
|
+
<h1 data-text="header-text"></h1>
|
|
75
|
+
<p>Static paragraph</p>
|
|
76
|
+
<!--slot:conditionalPart-->
|
|
77
|
+
<p data-style="conclusion-style">This is finishing paragraph</p>
|
|
78
|
+
</div>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Component definition (myComponent.ts):**
|
|
82
|
+
```ts
|
|
83
|
+
import { Component } from "@tripod311/splash"
|
|
84
|
+
import View from "./myComponent.html?raw"
|
|
85
|
+
import ChildComponent from "./childComponent.js"
|
|
86
|
+
|
|
87
|
+
export default class MyComponent extends Component {
|
|
88
|
+
private static componentName: string = "MyComponent";
|
|
89
|
+
private static template: string = View;
|
|
90
|
+
|
|
91
|
+
constructor (options: Record<string, any>) {
|
|
92
|
+
super(options);
|
|
93
|
+
|
|
94
|
+
// Initialize state
|
|
95
|
+
this.state.setProp("header-text", "My component title");
|
|
96
|
+
|
|
97
|
+
// Subscribe to state changes
|
|
98
|
+
this.state.on("src", (newValue: any, oldValue: any) => {
|
|
99
|
+
/* inner logic */
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// Batch update
|
|
103
|
+
this.state.update({
|
|
104
|
+
diffVar1: "someValue",
|
|
105
|
+
diffVar2: "someOtherValue"
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// Fill slots
|
|
109
|
+
this.slots["conditionalPart"].push(new ChildComponent({ var1: 1 }));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
mounted () {
|
|
113
|
+
super.mounted();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
transitionEntry () {
|
|
117
|
+
// Called after mounted + rendered → safe for CSS animations
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
unmounted () {
|
|
121
|
+
super.unmounted();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**Events:**
|
|
127
|
+
```ts
|
|
128
|
+
// Child → Parent
|
|
129
|
+
this.emit("click", { some: "payload" });
|
|
130
|
+
|
|
131
|
+
// Parent listens
|
|
132
|
+
childComponent.on("click", payload => {
|
|
133
|
+
console.log(payload);
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Updating child from parent:**
|
|
138
|
+
```ts
|
|
139
|
+
childComponent.update({ color: "newColor" });
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
⚠️ Note: Each component must have a distinct `componentName`.
|
|
143
|
+
Splash caches and shares templates between components with the same names.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
### 2. Slots
|
|
148
|
+
|
|
149
|
+
Slots manage child components declaratively. They behave like arrays with lifecycle tracking.
|
|
150
|
+
|
|
151
|
+
**Example:**
|
|
152
|
+
```ts
|
|
153
|
+
const child = new ChildComponent({ ...state });
|
|
154
|
+
this.slots["mySlot"].setContent([child]);
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**API:**
|
|
158
|
+
- `setContent(Component[])` — replace slot contents.
|
|
159
|
+
- `clear(): Component[]` — unmount all and return them.
|
|
160
|
+
- `push(c: Component)` — append component.
|
|
161
|
+
- `pop(): Component | undefined` — remove last.
|
|
162
|
+
- `unshift(c: Component)` — prepend component.
|
|
163
|
+
- `shift(): Component | undefined` — remove first.
|
|
164
|
+
- `inject(pos: number, c: Component)` — insert at position.
|
|
165
|
+
- `remove(pos: number): Component | undefined` — remove at position.
|
|
166
|
+
- `getByIndex(index: number): Component | undefined` — access without unmounting.
|
|
167
|
+
- `length: number` — number of components in slot.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
### 3. Mounting & Unmounting
|
|
172
|
+
|
|
173
|
+
To place a component on the page you can use the `mount` method:
|
|
174
|
+
|
|
175
|
+
```ts
|
|
176
|
+
import MyComponent from "./MyComponent.js";
|
|
177
|
+
|
|
178
|
+
const app = new MyComponent({ title: "Hello Splash!" });
|
|
179
|
+
app.mount(document.body);
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
This will append the component’s DOM node into the provided container and call its `mounted()` lifecycle hook.
|
|
183
|
+
|
|
184
|
+
To remove a component from the page, call:
|
|
185
|
+
|
|
186
|
+
```ts
|
|
187
|
+
app.unmount();
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
This will remove the DOM node and call its `unmounted()` lifecycle hook.
|
|
191
|
+
|
|
192
|
+
⚠️ **Important:**
|
|
193
|
+
Unmounting a component does **not** destroy its state or DOM nodes.
|
|
194
|
+
The component can be mounted again into another container without losing any data:
|
|
195
|
+
|
|
196
|
+
```ts
|
|
197
|
+
// move component from one place to another
|
|
198
|
+
app.unmount();
|
|
199
|
+
app.mount(document.getElementById("new-container")!);
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
This behavior allows implementing modals, window managers, tab systems and other features where components may be parked and reinserted freely.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Template Directives
|
|
207
|
+
|
|
208
|
+
All directives work with **string-based identifiers**. They are not evaluated — only bound.
|
|
209
|
+
Initial HTML values are used to initialize state.
|
|
210
|
+
|
|
211
|
+
- `data-ref` — reference in `this.refs`.
|
|
212
|
+
- `data-text` — reactive `innerText`.
|
|
213
|
+
- `data-html` — reactive `innerHTML`.
|
|
214
|
+
- `data-class` — array of strings for CSS classes.
|
|
215
|
+
- `data-style` — object `{ [prop]: value }` for styles.
|
|
216
|
+
- `data-prop-*` — any other attribute (e.g. `data-prop-src` for `<img>`).
|
|
217
|
+
|
|
218
|
+
Current reactive values can be accessed via:
|
|
219
|
+
```ts
|
|
220
|
+
this.state.getProp("reactive-var-name")
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## How it Differs from React/Vue
|
|
226
|
+
|
|
227
|
+
- No virtual DOM → simpler and faster.
|
|
228
|
+
- No props/state/context zoo → just `state`.
|
|
229
|
+
- No hidden batching or reconciliation → updates are explicit.
|
|
230
|
+
- No “child restrictions” → developers freely manipulate the DOM.
|
|
231
|
+
- Tiny core, only a few kilobytes.
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Example Scenarios
|
|
236
|
+
|
|
237
|
+
- **Form:** use `data-ref` for `<input>` and plain native events. No `v-model` or controlled/uncontrolled hacks.
|
|
238
|
+
- **Mount animations:** use `transitionEntry()` for CSS transitions.
|
|
239
|
+
- **Conditional rendering:** mount/unmount via `data-slot`, no `v-if` or diffing logic.
|
|
240
|
+
|
|
241
|
+
---
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ComponentState } from "./componentState.js";
|
|
2
|
+
import ReactiveText from "./reactives/reactiveText.js";
|
|
3
|
+
import ReactiveHTML from "./reactives/reactiveHTML.js";
|
|
4
|
+
import ReactiveStyle from "./reactives/reactiveStyle.js";
|
|
5
|
+
import ReactiveClass from "./reactives/reactiveClass.js";
|
|
6
|
+
import ReactiveProp from "./reactives/reactiveProp.js";
|
|
7
|
+
import Slot from "./slot.js";
|
|
8
|
+
type EventListener = (payload: any) => void;
|
|
9
|
+
export default class Component {
|
|
10
|
+
protected static componentName: string;
|
|
11
|
+
protected static template: string;
|
|
12
|
+
protected state: ComponentState;
|
|
13
|
+
protected view: Node;
|
|
14
|
+
protected parentElement?: HTMLElement;
|
|
15
|
+
private setupAF?;
|
|
16
|
+
protected refs: Record<string, HTMLElement>;
|
|
17
|
+
protected slots: Record<string, Slot>;
|
|
18
|
+
protected textReactives: Record<string, ReactiveText>;
|
|
19
|
+
protected htmlReactives: Record<string, ReactiveHTML>;
|
|
20
|
+
protected classReactives: Record<string, ReactiveClass>;
|
|
21
|
+
protected styleReactives: Record<string, ReactiveStyle>;
|
|
22
|
+
protected propReactives: Record<string, ReactiveProp>;
|
|
23
|
+
protected listeners: Record<string, EventListener[]>;
|
|
24
|
+
constructor(options: Record<string, any>);
|
|
25
|
+
protected build(root: Node): void;
|
|
26
|
+
protected buildState(options: Record<string, any>): void;
|
|
27
|
+
mounted(): void;
|
|
28
|
+
transitionReady(): void;
|
|
29
|
+
unmounted(): void;
|
|
30
|
+
update(diff: Record<string, any>): void;
|
|
31
|
+
mount(parentElement: HTMLElement): void;
|
|
32
|
+
unmount(): void;
|
|
33
|
+
get DOMNode(): HTMLElement;
|
|
34
|
+
on(eventName: string, listener: EventListener): void;
|
|
35
|
+
off(eventName: string, listener: EventListener): void;
|
|
36
|
+
emit(eventName: string, payload: any): void;
|
|
37
|
+
}
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,YAAY,MAAM,6BAA6B,CAAA;AACtD,OAAO,YAAY,MAAM,6BAA6B,CAAA;AACtD,OAAO,aAAa,MAAM,8BAA8B,CAAA;AACxD,OAAO,aAAa,MAAM,8BAA8B,CAAA;AACxD,OAAO,YAAY,MAAM,6BAA6B,CAAA;AACtD,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,KAAK,aAAa,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,SAAS;IAC7B,SAAS,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAM;IAC5C,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAM;IAEvC,SAAS,CAAC,KAAK,EAAG,cAAc,CAAC;IACjC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC;IACrB,SAAS,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC;IACtC,OAAO,CAAC,OAAO,CAAC,CAA2C;IAE3D,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAM;IACjD,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAM;IAE3C,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAM;IAC3D,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAM;IAC3D,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAM;IAC7D,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAM;IAC7D,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAM;IAE3D,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAM;gBAE7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAezC,SAAS,CAAC,KAAK,CAAE,IAAI,EAAE,IAAI;IA4C3B,SAAS,CAAC,UAAU,CAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IA6ClD,OAAO;IAaP,eAAe;IAIf,SAAS;IAOT,MAAM,CAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAIjC,KAAK,CAAE,aAAa,EAAE,WAAW;IAOjC,OAAO;IAKP,IAAI,OAAO,IAAK,WAAW,CAE1B;IAED,EAAE,CAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa;IAU9C,GAAG,CAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa;IAiB/C,IAAI,CAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG;CAWrC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import TemplateCache from "./templateCache.js";
|
|
2
|
+
import { ComponentState } from "./componentState.js";
|
|
3
|
+
import ReactiveText from "./reactives/reactiveText.js";
|
|
4
|
+
import ReactiveHTML from "./reactives/reactiveHTML.js";
|
|
5
|
+
import ReactiveStyle from "./reactives/reactiveStyle.js";
|
|
6
|
+
import ReactiveClass from "./reactives/reactiveClass.js";
|
|
7
|
+
import ReactiveProp from "./reactives/reactiveProp.js";
|
|
8
|
+
import Slot from "./slot.js";
|
|
9
|
+
export default class Component {
|
|
10
|
+
static componentName = "";
|
|
11
|
+
static template = "";
|
|
12
|
+
state;
|
|
13
|
+
view;
|
|
14
|
+
parentElement;
|
|
15
|
+
setupAF;
|
|
16
|
+
refs = {};
|
|
17
|
+
slots = {};
|
|
18
|
+
textReactives = {};
|
|
19
|
+
htmlReactives = {};
|
|
20
|
+
classReactives = {};
|
|
21
|
+
styleReactives = {};
|
|
22
|
+
propReactives = {};
|
|
23
|
+
listeners = {};
|
|
24
|
+
constructor(options) {
|
|
25
|
+
const ctor = this.constructor;
|
|
26
|
+
const template = TemplateCache.getTemplate(ctor.componentName);
|
|
27
|
+
if (template === null) {
|
|
28
|
+
this.view = TemplateCache.compileTemplate(ctor.componentName, ctor.template);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this.view = template;
|
|
32
|
+
}
|
|
33
|
+
this.build(this.view);
|
|
34
|
+
this.buildState(options);
|
|
35
|
+
}
|
|
36
|
+
build(root) {
|
|
37
|
+
if (root.nodeType === Node.COMMENT_NODE) {
|
|
38
|
+
const comment = root;
|
|
39
|
+
if (comment.data.startsWith("slot:")) {
|
|
40
|
+
const slotName = comment.data.slice("slot:".length);
|
|
41
|
+
this.slots[slotName] = new Slot(comment);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else if (root.nodeType === Node.ELEMENT_NODE) {
|
|
46
|
+
const element = root;
|
|
47
|
+
for (const attr of Array.from(element.attributes)) {
|
|
48
|
+
if (attr.name.startsWith("data-ref")) {
|
|
49
|
+
this.refs[attr.value] = element;
|
|
50
|
+
}
|
|
51
|
+
if (attr.name.startsWith("data-text")) {
|
|
52
|
+
this.textReactives[attr.value] = new ReactiveText(element);
|
|
53
|
+
}
|
|
54
|
+
if (attr.name.startsWith("data-html")) {
|
|
55
|
+
this.htmlReactives[attr.value] = new ReactiveHTML(element);
|
|
56
|
+
}
|
|
57
|
+
if (attr.name.startsWith("data-class")) {
|
|
58
|
+
this.classReactives[attr.value] = new ReactiveClass(element);
|
|
59
|
+
}
|
|
60
|
+
if (attr.name.startsWith("data-style")) {
|
|
61
|
+
this.styleReactives[attr.value] = new ReactiveStyle(element);
|
|
62
|
+
}
|
|
63
|
+
if (attr.name.startsWith("data-prop-")) {
|
|
64
|
+
const propName = attr.name.slice("data-prop-".length);
|
|
65
|
+
this.propReactives[attr.value] = new ReactiveProp(element, propName);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (const child of Array.from(root.childNodes)) {
|
|
69
|
+
this.build(child);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
buildState(options) {
|
|
74
|
+
const base = {};
|
|
75
|
+
for (const key in this.textReactives) {
|
|
76
|
+
base[key] = this.textReactives[key].current();
|
|
77
|
+
}
|
|
78
|
+
for (const key in this.htmlReactives) {
|
|
79
|
+
base[key] = this.htmlReactives[key].current();
|
|
80
|
+
}
|
|
81
|
+
for (const key in this.classReactives) {
|
|
82
|
+
base[key] = this.classReactives[key].current();
|
|
83
|
+
}
|
|
84
|
+
for (const key in this.styleReactives) {
|
|
85
|
+
base[key] = this.styleReactives[key].current();
|
|
86
|
+
}
|
|
87
|
+
for (const key in this.propReactives) {
|
|
88
|
+
base[key] = this.propReactives[key].current();
|
|
89
|
+
}
|
|
90
|
+
this.state = new ComponentState(base);
|
|
91
|
+
for (const key in this.textReactives) {
|
|
92
|
+
const reactive = this.textReactives[key];
|
|
93
|
+
this.state.on(key, reactive.update.bind(reactive));
|
|
94
|
+
}
|
|
95
|
+
for (const key in this.htmlReactives) {
|
|
96
|
+
const reactive = this.htmlReactives[key];
|
|
97
|
+
this.state.on(key, reactive.update.bind(reactive));
|
|
98
|
+
}
|
|
99
|
+
for (const key in this.classReactives) {
|
|
100
|
+
const reactive = this.classReactives[key];
|
|
101
|
+
this.state.on(key, reactive.update.bind(reactive));
|
|
102
|
+
}
|
|
103
|
+
for (const key in this.styleReactives) {
|
|
104
|
+
const reactive = this.styleReactives[key];
|
|
105
|
+
this.state.on(key, reactive.update.bind(reactive));
|
|
106
|
+
}
|
|
107
|
+
for (const key in this.propReactives) {
|
|
108
|
+
const reactive = this.propReactives[key];
|
|
109
|
+
this.state.on(key, reactive.update.bind(reactive));
|
|
110
|
+
}
|
|
111
|
+
this.state.update(options);
|
|
112
|
+
}
|
|
113
|
+
mounted() {
|
|
114
|
+
this.setupAF = requestAnimationFrame(() => {
|
|
115
|
+
this.setupAF = requestAnimationFrame(() => {
|
|
116
|
+
this.transitionReady();
|
|
117
|
+
this.setupAF = undefined;
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
for (const id in this.slots) {
|
|
121
|
+
this.slots[id].mount();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
transitionReady() {
|
|
125
|
+
// place where you can start all css animations
|
|
126
|
+
}
|
|
127
|
+
unmounted() {
|
|
128
|
+
if (this.setupAF !== undefined)
|
|
129
|
+
cancelAnimationFrame(this.setupAF);
|
|
130
|
+
for (const id in this.slots) {
|
|
131
|
+
this.slots[id].unmount();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
update(diff) {
|
|
135
|
+
this.state.update(diff);
|
|
136
|
+
}
|
|
137
|
+
mount(parentElement) {
|
|
138
|
+
this.parentElement = parentElement;
|
|
139
|
+
this.parentElement.appendChild(this.view);
|
|
140
|
+
this.view.offsetWidth;
|
|
141
|
+
this.mounted();
|
|
142
|
+
}
|
|
143
|
+
unmount() {
|
|
144
|
+
this.unmounted();
|
|
145
|
+
this.parentElement?.removeChild(this.view);
|
|
146
|
+
}
|
|
147
|
+
get DOMNode() {
|
|
148
|
+
return this.view;
|
|
149
|
+
}
|
|
150
|
+
on(eventName, listener) {
|
|
151
|
+
if (!this.listeners[eventName]) {
|
|
152
|
+
this.listeners[eventName] = [];
|
|
153
|
+
}
|
|
154
|
+
const arr = this.listeners[eventName];
|
|
155
|
+
arr.push(listener);
|
|
156
|
+
}
|
|
157
|
+
off(eventName, listener) {
|
|
158
|
+
const arr = this.listeners[eventName];
|
|
159
|
+
if (arr !== undefined) {
|
|
160
|
+
const lArr = arr;
|
|
161
|
+
const index = lArr.indexOf(listener);
|
|
162
|
+
if (index !== -1) {
|
|
163
|
+
lArr.splice(index, 1);
|
|
164
|
+
if (lArr.length === 0) {
|
|
165
|
+
delete this.listeners[eventName];
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
emit(eventName, payload) {
|
|
171
|
+
const arr = this.listeners[eventName];
|
|
172
|
+
if (arr !== undefined) {
|
|
173
|
+
const lArr = arr.slice();
|
|
174
|
+
for (const listener of lArr) {
|
|
175
|
+
listener(payload);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component.js","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type StateListener = (newValue: any, oldValue: any) => void;
|
|
2
|
+
export declare class ComponentState {
|
|
3
|
+
private value;
|
|
4
|
+
private listeners;
|
|
5
|
+
constructor(value?: Record<string, any>);
|
|
6
|
+
on(propName: string, listener: StateListener): void;
|
|
7
|
+
off(propName: string, listener: StateListener): void;
|
|
8
|
+
update(diff: Record<string, any>): void;
|
|
9
|
+
getProps(): Record<string, any>;
|
|
10
|
+
getProp(propName: string): any;
|
|
11
|
+
setProp(propName: string, propValue: any): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=componentState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"componentState.d.ts","sourceRoot":"","sources":["../src/componentState.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,KAAK,IAAI,CAAC;AAEnE,qBAAa,cAAc;IAC1B,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,SAAS,CAAuC;gBAE3C,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM;IAI5C,EAAE,CAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa;IAQ7C,GAAG,CAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa;IAM9C,MAAM,CAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAwBjC,QAAQ,IAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAIhC,OAAO,CAAE,QAAQ,EAAE,MAAM,GAAG,GAAG;IAI/B,OAAO,CAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG;CAYzC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export class ComponentState {
|
|
2
|
+
value;
|
|
3
|
+
listeners = {};
|
|
4
|
+
constructor(value = {}) {
|
|
5
|
+
this.value = value;
|
|
6
|
+
}
|
|
7
|
+
on(propName, listener) {
|
|
8
|
+
if (this.listeners[propName] === undefined) {
|
|
9
|
+
this.listeners[propName] = [];
|
|
10
|
+
}
|
|
11
|
+
this.listeners[propName].push(listener);
|
|
12
|
+
}
|
|
13
|
+
off(propName, listener) {
|
|
14
|
+
if (this.listeners[propName] !== undefined) {
|
|
15
|
+
this.listeners[propName] = this.listeners[propName].filter(l => l !== listener);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
update(diff) {
|
|
19
|
+
const makeCalls = {
|
|
20
|
+
"*": {
|
|
21
|
+
newValue: Object.assign({}, this.value, diff),
|
|
22
|
+
oldValue: Object.assign({}, this.value)
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
for (const propName in diff) {
|
|
26
|
+
makeCalls[propName] = { newValue: diff[propName], oldValue: this.value[propName] };
|
|
27
|
+
this.value[propName] = diff[propName];
|
|
28
|
+
}
|
|
29
|
+
for (const propName in makeCalls) {
|
|
30
|
+
if (this.listeners[propName] !== undefined) {
|
|
31
|
+
const arr = this.listeners[propName];
|
|
32
|
+
for (const l of arr) {
|
|
33
|
+
l(makeCalls[propName].newValue, makeCalls[propName].oldValue);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
getProps() {
|
|
39
|
+
return this.value;
|
|
40
|
+
}
|
|
41
|
+
getProp(propName) {
|
|
42
|
+
return this.value[propName];
|
|
43
|
+
}
|
|
44
|
+
setProp(propName, propValue) {
|
|
45
|
+
const oldValue = this.value[propName];
|
|
46
|
+
this.value[propName] = propValue;
|
|
47
|
+
if (this.listeners[propName] !== undefined) {
|
|
48
|
+
const arr = this.listeners[propName];
|
|
49
|
+
for (const l of arr) {
|
|
50
|
+
l(propValue, oldValue);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=componentState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"componentState.js","sourceRoot":"","sources":["../src/componentState.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;IAClB,KAAK,CAAsB;IAC3B,SAAS,GAAoC,EAAE,CAAC;IAExD,YAAa,QAA6B,EAAE;QAC3C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,EAAE,CAAE,QAAgB,EAAE,QAAuB;QAC5C,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YAC5C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,GAAG,CAAE,QAAgB,EAAE,QAAuB;QAC7C,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YAC5C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QAClF,CAAC;IACF,CAAC;IAED,MAAM,CAAE,IAAyB;QAChC,MAAM,SAAS,GAAsD;YACpE,GAAG,EAAE;gBACJ,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;gBAC7C,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC;aACvC;SACD,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC7B,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAoB,CAAC;gBAExD,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;oBACrB,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC/D,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,QAAQ;QACP,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,OAAO,CAAE,QAAgB;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,CAAE,QAAgB,EAAE,SAAc;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;QAEjC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAoB,CAAC;YAExD,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;gBACrB,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACxB,CAAC;QACF,CAAC;IACF,CAAC;CACD"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Component from "./component.js";
|
|
2
|
+
import { ComponentState } from "./componentState.js";
|
|
3
|
+
import Slot from "./slot.js";
|
|
4
|
+
import TemplateCache from "./templateCache.js";
|
|
5
|
+
import ReactiveElement from "./reactiveElement.js";
|
|
6
|
+
import ReactiveText from "./reactives/reactiveText.js";
|
|
7
|
+
import ReactiveHTML from "./reactives/reactiveHTML.js";
|
|
8
|
+
import ReactiveStyle from "./reactives/reactiveStyle.js";
|
|
9
|
+
import ReactiveClass from "./reactives/reactiveClass.js";
|
|
10
|
+
import ReactiveProp from "./reactives/reactiveProp.js";
|
|
11
|
+
import type { StateListener } from "./componentState.js";
|
|
12
|
+
export type { StateListener };
|
|
13
|
+
export { Component, ComponentState, Slot, TemplateCache, ReactiveElement, ReactiveText, ReactiveHTML, ReactiveStyle, ReactiveClass, ReactiveProp };
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,gBAAgB,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAC9C,OAAO,eAAe,MAAM,sBAAsB,CAAA;AAClD,OAAO,YAAY,MAAM,6BAA6B,CAAA;AACtD,OAAO,YAAY,MAAM,6BAA6B,CAAA;AACtD,OAAO,aAAa,MAAM,8BAA8B,CAAA;AACxD,OAAO,aAAa,MAAM,8BAA8B,CAAA;AACxD,OAAO,YAAY,MAAM,6BAA6B,CAAA;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAExD,YAAY,EAAE,aAAa,EAAE,CAAA;AAE7B,OAAO,EACN,SAAS,EACT,cAAc,EACd,IAAI,EACJ,aAAa,EACb,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,EACb,YAAY,EACZ,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import Component from "./component.js";
|
|
2
|
+
import { ComponentState } from "./componentState.js";
|
|
3
|
+
import Slot from "./slot.js";
|
|
4
|
+
import TemplateCache from "./templateCache.js";
|
|
5
|
+
import ReactiveElement from "./reactiveElement.js";
|
|
6
|
+
import ReactiveText from "./reactives/reactiveText.js";
|
|
7
|
+
import ReactiveHTML from "./reactives/reactiveHTML.js";
|
|
8
|
+
import ReactiveStyle from "./reactives/reactiveStyle.js";
|
|
9
|
+
import ReactiveClass from "./reactives/reactiveClass.js";
|
|
10
|
+
import ReactiveProp from "./reactives/reactiveProp.js";
|
|
11
|
+
export { Component, ComponentState, Slot, TemplateCache, ReactiveElement, ReactiveText, ReactiveHTML, ReactiveStyle, ReactiveClass, ReactiveProp };
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,gBAAgB,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAC9C,OAAO,eAAe,MAAM,sBAAsB,CAAA;AAClD,OAAO,YAAY,MAAM,6BAA6B,CAAA;AACtD,OAAO,YAAY,MAAM,6BAA6B,CAAA;AACtD,OAAO,aAAa,MAAM,8BAA8B,CAAA;AACxD,OAAO,aAAa,MAAM,8BAA8B,CAAA;AACxD,OAAO,YAAY,MAAM,6BAA6B,CAAA;AAMtD,OAAO,EACN,SAAS,EACT,cAAc,EACd,IAAI,EACJ,aAAa,EACb,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,EACb,YAAY,EACZ,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactiveElement.d.ts","sourceRoot":"","sources":["../src/reactiveElement.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,eAAe;IACnC,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC;gBAElB,OAAO,EAAE,WAAW;IAIjC,MAAM,CAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG;IAIpC,OAAO,IAAK,GAAG;CAGf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactiveElement.js","sourceRoot":"","sources":["../src/reactiveElement.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,eAAe;IACzB,OAAO,CAAc;IAE/B,YAAa,OAAoB;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,MAAM,CAAE,QAAa,EAAE,QAAa;QACnC,kBAAkB;IACnB,CAAC;IAED,OAAO;QACN,WAAW;IACZ,CAAC;CACD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import ReactiveElement from "../reactiveElement.js";
|
|
2
|
+
export default class ReactiveClass extends ReactiveElement {
|
|
3
|
+
protected currentClasses: string[];
|
|
4
|
+
constructor(element: HTMLElement);
|
|
5
|
+
update(newValue: any, oldValue: any): void;
|
|
6
|
+
current(): string[];
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=reactiveClass.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactiveClass.d.ts","sourceRoot":"","sources":["../../src/reactives/reactiveClass.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,uBAAuB,CAAA;AAEnD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,eAAe;IACzD,SAAS,CAAC,cAAc,EAAE,MAAM,EAAE,CAAM;gBAE3B,OAAO,EAAE,WAAW;IAMjC,MAAM,CAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG;IAQpC,OAAO,IAAK,MAAM,EAAE;CAGpB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import ReactiveElement from "../reactiveElement.js";
|
|
2
|
+
export default class ReactiveClass extends ReactiveElement {
|
|
3
|
+
currentClasses = [];
|
|
4
|
+
constructor(element) {
|
|
5
|
+
super(element);
|
|
6
|
+
this.currentClasses = Array.from(element.classList);
|
|
7
|
+
}
|
|
8
|
+
update(newValue, oldValue) {
|
|
9
|
+
if (!Array.isArray(newValue))
|
|
10
|
+
throw new Error("ReactiveClass::update accepts only string[]");
|
|
11
|
+
this.currentClasses = newValue.map(c => c.toString());
|
|
12
|
+
this.element.className = this.currentClasses.join(" ");
|
|
13
|
+
}
|
|
14
|
+
current() {
|
|
15
|
+
return this.currentClasses.slice();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=reactiveClass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactiveClass.js","sourceRoot":"","sources":["../../src/reactives/reactiveClass.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,uBAAuB,CAAA;AAEnD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,eAAe;IAC/C,cAAc,GAAa,EAAE,CAAC;IAExC,YAAa,OAAoB;QAChC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAE,QAAa,EAAE,QAAa;QACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAE7F,IAAI,CAAC,cAAc,GAAI,QAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEjE,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxD,CAAC;IAED,OAAO;QACN,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC;CACD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import ReactiveElement from "../reactiveElement.js";
|
|
2
|
+
export default class ReactiveHTML extends ReactiveElement {
|
|
3
|
+
protected currentHTML: string;
|
|
4
|
+
constructor(element: HTMLElement);
|
|
5
|
+
update(newValue: any, oldValue: any): void;
|
|
6
|
+
current(): string;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=reactiveHTML.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactiveHTML.d.ts","sourceRoot":"","sources":["../../src/reactives/reactiveHTML.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,uBAAuB,CAAA;AAEnD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,eAAe;IACxD,SAAS,CAAC,WAAW,EAAE,MAAM,CAAM;gBAEtB,OAAO,EAAE,WAAW;IAMjC,MAAM,CAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG;IAKpC,OAAO,IAAK,MAAM;CAGlB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import ReactiveElement from "../reactiveElement.js";
|
|
2
|
+
export default class ReactiveHTML extends ReactiveElement {
|
|
3
|
+
currentHTML = "";
|
|
4
|
+
constructor(element) {
|
|
5
|
+
super(element);
|
|
6
|
+
this.currentHTML = element.innerHTML;
|
|
7
|
+
}
|
|
8
|
+
update(newValue, oldValue) {
|
|
9
|
+
this.currentHTML = newValue ? newValue.toString() : "";
|
|
10
|
+
this.element.innerHTML = this.currentHTML;
|
|
11
|
+
}
|
|
12
|
+
current() {
|
|
13
|
+
return this.currentHTML;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=reactiveHTML.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactiveHTML.js","sourceRoot":"","sources":["../../src/reactives/reactiveHTML.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,uBAAuB,CAAA;AAEnD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,eAAe;IAC9C,WAAW,GAAW,EAAE,CAAC;IAEnC,YAAa,OAAoB;QAChC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC;IACtC,CAAC;IAED,MAAM,CAAE,QAAa,EAAE,QAAa;QACnC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;IAC3C,CAAC;IAED,OAAO;QACN,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;CACD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import ReactiveElement from "../reactiveElement.js";
|
|
2
|
+
export default class ReactiveProp extends ReactiveElement {
|
|
3
|
+
protected propName: string;
|
|
4
|
+
protected currentValue: string | null;
|
|
5
|
+
constructor(element: HTMLElement, propName: string);
|
|
6
|
+
update(newValue: any, oldValue: any): void;
|
|
7
|
+
current(): string | null;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=reactiveProp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactiveProp.d.ts","sourceRoot":"","sources":["../../src/reactives/reactiveProp.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,uBAAuB,CAAA;AAEnD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,eAAe;IACxD,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEzB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM;IAYnD,MAAM,CAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG;IAYpC,OAAO,IAAK,MAAM,GAAG,IAAI;CAGzB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import ReactiveElement from "../reactiveElement.js";
|
|
2
|
+
export default class ReactiveProp extends ReactiveElement {
|
|
3
|
+
propName;
|
|
4
|
+
currentValue;
|
|
5
|
+
constructor(element, propName) {
|
|
6
|
+
super(element);
|
|
7
|
+
this.propName = propName;
|
|
8
|
+
if (element.hasAttribute(propName)) {
|
|
9
|
+
this.currentValue = element.getAttribute(this.propName);
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
this.currentValue = null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
update(newValue, oldValue) {
|
|
16
|
+
if (newValue === null || newValue === undefined) {
|
|
17
|
+
this.currentValue = null;
|
|
18
|
+
this.element.removeAttribute(this.propName);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
this.currentValue = newValue.toString();
|
|
22
|
+
this.element.setAttribute(this.propName, this.currentValue);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
current() {
|
|
26
|
+
return this.currentValue;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=reactiveProp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactiveProp.js","sourceRoot":"","sources":["../../src/reactives/reactiveProp.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,uBAAuB,CAAA;AAEnD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,eAAe;IAC9C,QAAQ,CAAS;IACjB,YAAY,CAAgB;IAEtC,YAAa,OAAoB,EAAE,QAAgB;QAClD,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,IAAI,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC1B,CAAC;IACF,CAAC;IAED,MAAM,CAAE,QAAa,EAAE,QAAa;QACnC,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACjD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YAEzB,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAExC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAsB,CAAC,CAAC;QACvE,CAAC;IACF,CAAC;IAED,OAAO;QACN,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;CACD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import ReactiveElement from "../reactiveElement.js";
|
|
2
|
+
export default class ReactiveStyle extends ReactiveElement {
|
|
3
|
+
protected currentStyle: Record<string, string>;
|
|
4
|
+
constructor(element: HTMLElement);
|
|
5
|
+
update(newValue: any, oldValue: any): void;
|
|
6
|
+
current(): Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=reactiveStyle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactiveStyle.d.ts","sourceRoot":"","sources":["../../src/reactives/reactiveStyle.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,uBAAuB,CAAA;AAEnD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,eAAe;IACzD,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;gBAEvC,OAAO,EAAE,WAAW;IASjC,MAAM,CAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG;IAyBpC,OAAO,IAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGlC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import ReactiveElement from "../reactiveElement.js";
|
|
2
|
+
export default class ReactiveStyle extends ReactiveElement {
|
|
3
|
+
currentStyle = {};
|
|
4
|
+
constructor(element) {
|
|
5
|
+
super(element);
|
|
6
|
+
for (let i = 0; i < element.style.length; i++) {
|
|
7
|
+
const propName = element.style[i];
|
|
8
|
+
this.currentStyle[propName] = element.style.getPropertyValue(propName);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
update(newValue, oldValue) {
|
|
12
|
+
if (typeof newValue !== 'object')
|
|
13
|
+
throw new Error("ReactiveStyle::update accepts only Record<string, string> | null");
|
|
14
|
+
if (newValue === null || newValue === undefined) {
|
|
15
|
+
for (const propName in this.currentStyle) {
|
|
16
|
+
this.element.style.removeProperty(propName);
|
|
17
|
+
delete this.currentStyle[propName];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
const newStyles = newValue;
|
|
22
|
+
const keySet = Object.keys(this.currentStyle).concat(Object.keys(newStyles));
|
|
23
|
+
for (const key of keySet) {
|
|
24
|
+
if (newStyles[key] === undefined) {
|
|
25
|
+
this.element.style.removeProperty(key);
|
|
26
|
+
delete this.currentStyle[key];
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
this.element.style.setProperty(key, newStyles[key].toString());
|
|
30
|
+
this.currentStyle[key] = newStyles[key].toString();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
current() {
|
|
36
|
+
return Object.assign({}, this.currentStyle);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=reactiveStyle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactiveStyle.js","sourceRoot":"","sources":["../../src/reactives/reactiveStyle.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,uBAAuB,CAAA;AAEnD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,eAAe;IAC/C,YAAY,GAA2B,EAAE,CAAC;IAEpD,YAAa,OAAoB;QAChC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACxE,CAAC;IACF,CAAC;IAED,MAAM,CAAE,QAAa,EAAE,QAAa;QACnC,IAAI,OAAO,QAAQ,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;QAEtH,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACjD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC1C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAC5C,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACpC,CAAC;QACF,CAAC;aAAM,CAAC;YACP,MAAM,SAAS,GAAG,QAAkC,CAAC;YAErD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YAE7E,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBAC1B,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;oBAClC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;oBACvC,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACP,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAC/D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACpD,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO;QACN,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;CACD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import ReactiveElement from "../reactiveElement.js";
|
|
2
|
+
export default class ReactiveText extends ReactiveElement {
|
|
3
|
+
protected currentText: string;
|
|
4
|
+
constructor(element: HTMLElement);
|
|
5
|
+
update(newValue: any, oldValue: any): void;
|
|
6
|
+
current(): string;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=reactiveText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactiveText.d.ts","sourceRoot":"","sources":["../../src/reactives/reactiveText.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,uBAAuB,CAAA;AAEnD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,eAAe;IACxD,SAAS,CAAC,WAAW,EAAE,MAAM,CAAM;gBAEtB,OAAO,EAAE,WAAW;IAMjC,MAAM,CAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG;IAKpC,OAAO,IAAK,MAAM;CAGlB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import ReactiveElement from "../reactiveElement.js";
|
|
2
|
+
export default class ReactiveText extends ReactiveElement {
|
|
3
|
+
currentText = "";
|
|
4
|
+
constructor(element) {
|
|
5
|
+
super(element);
|
|
6
|
+
this.currentText = element.innerText;
|
|
7
|
+
}
|
|
8
|
+
update(newValue, oldValue) {
|
|
9
|
+
this.currentText = newValue ? newValue.toString() : "";
|
|
10
|
+
this.element.innerText = this.currentText;
|
|
11
|
+
}
|
|
12
|
+
current() {
|
|
13
|
+
return this.currentText;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=reactiveText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactiveText.js","sourceRoot":"","sources":["../../src/reactives/reactiveText.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,uBAAuB,CAAA;AAEnD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,eAAe;IAC9C,WAAW,GAAW,EAAE,CAAC;IAEnC,YAAa,OAAoB;QAChC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC;IACtC,CAAC;IAED,MAAM,CAAE,QAAa,EAAE,QAAa;QACnC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;IAC3C,CAAC;IAED,OAAO;QACN,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;CACD"}
|
package/dist/slot.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type Component from "./component.js";
|
|
2
|
+
export default class Slot {
|
|
3
|
+
private anchor;
|
|
4
|
+
private content;
|
|
5
|
+
private mounted;
|
|
6
|
+
constructor(anchor: Comment);
|
|
7
|
+
setContent(content: Component | Component[]): void;
|
|
8
|
+
clear(): Component[];
|
|
9
|
+
mount(): void;
|
|
10
|
+
unmount(): void;
|
|
11
|
+
push(component: Component): void;
|
|
12
|
+
pop(): Component | undefined;
|
|
13
|
+
unshift(component: Component): void;
|
|
14
|
+
shift(): Component | undefined;
|
|
15
|
+
insert(position: number, component: Component): void;
|
|
16
|
+
remove(position: number): Component | undefined;
|
|
17
|
+
getByIndex(index: number): Component | undefined;
|
|
18
|
+
get length(): number;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=slot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slot.d.ts","sourceRoot":"","sources":["../src/slot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C,MAAM,CAAC,OAAO,OAAO,IAAI;IACxB,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,OAAO,CAAkB;gBAEpB,MAAM,EAAE,OAAO;IAI5B,UAAU,CAAE,OAAO,EAAE,SAAS,GAAG,SAAS,EAAE;IAmB5C,KAAK,IAAK,SAAS,EAAE;IAarB,KAAK;IAQL,OAAO;IAMP,IAAI,CAAE,SAAS,EAAE,SAAS;IAQ1B,GAAG,IAAK,SAAS,GAAG,SAAS;IAW7B,OAAO,CAAE,SAAS,EAAE,SAAS;IAQ7B,KAAK,IAAK,SAAS,GAAG,SAAS;IAW/B,MAAM,CAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS;IAe9C,MAAM,CAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAahD,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIhD,IAAI,MAAM,IAAK,MAAM,CAEpB;CACD"}
|
package/dist/slot.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
export default class Slot {
|
|
2
|
+
anchor;
|
|
3
|
+
content = [];
|
|
4
|
+
mounted = false;
|
|
5
|
+
constructor(anchor) {
|
|
6
|
+
this.anchor = anchor;
|
|
7
|
+
}
|
|
8
|
+
setContent(content) {
|
|
9
|
+
this.clear();
|
|
10
|
+
this.content = content;
|
|
11
|
+
let lastNode = this.anchor;
|
|
12
|
+
for (const component of this.content) {
|
|
13
|
+
lastNode.after(component.DOMNode);
|
|
14
|
+
lastNode = component.DOMNode;
|
|
15
|
+
}
|
|
16
|
+
if (this.mounted) {
|
|
17
|
+
for (const component of this.content) {
|
|
18
|
+
component.mounted();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
clear() {
|
|
23
|
+
for (let component of this.content) {
|
|
24
|
+
if (this.mounted)
|
|
25
|
+
component.unmounted();
|
|
26
|
+
component.DOMNode.remove();
|
|
27
|
+
}
|
|
28
|
+
const toReturn = this.content;
|
|
29
|
+
this.content = [];
|
|
30
|
+
return toReturn;
|
|
31
|
+
}
|
|
32
|
+
mount() {
|
|
33
|
+
this.mounted = true;
|
|
34
|
+
for (const component of this.content) {
|
|
35
|
+
component.mounted();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
unmount() {
|
|
39
|
+
this.clear();
|
|
40
|
+
this.mounted = false;
|
|
41
|
+
}
|
|
42
|
+
push(component) {
|
|
43
|
+
this.content.push(component);
|
|
44
|
+
this.content[this.content.length - 2].DOMNode.after(component.DOMNode);
|
|
45
|
+
if (this.mounted) {
|
|
46
|
+
component.mounted();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
pop() {
|
|
50
|
+
if (this.content.length === 0) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
const toReturn = this.content.pop();
|
|
54
|
+
toReturn.unmounted();
|
|
55
|
+
toReturn.DOMNode.remove();
|
|
56
|
+
return toReturn;
|
|
57
|
+
}
|
|
58
|
+
unshift(component) {
|
|
59
|
+
this.content.unshift(component);
|
|
60
|
+
this.content[0].DOMNode.before(component.DOMNode);
|
|
61
|
+
if (this.mounted) {
|
|
62
|
+
component.mounted();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
shift() {
|
|
66
|
+
if (this.content.length === 0) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
const toReturn = this.content.shift();
|
|
70
|
+
toReturn.unmounted();
|
|
71
|
+
toReturn.DOMNode.remove();
|
|
72
|
+
return toReturn;
|
|
73
|
+
}
|
|
74
|
+
insert(position, component) {
|
|
75
|
+
this.content.splice(position, 0, component);
|
|
76
|
+
const index = this.content.indexOf(component);
|
|
77
|
+
let anchor;
|
|
78
|
+
if (index === 0) {
|
|
79
|
+
anchor = this.anchor;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
anchor = this.content[index - 1].DOMNode;
|
|
83
|
+
}
|
|
84
|
+
anchor.after(component.DOMNode);
|
|
85
|
+
if (this.mounted) {
|
|
86
|
+
component.mounted();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
remove(position) {
|
|
90
|
+
const arr = this.content.splice(position, 1);
|
|
91
|
+
if (arr.length === 0) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const toReturn = arr[0];
|
|
96
|
+
toReturn.unmounted();
|
|
97
|
+
toReturn.DOMNode.remove();
|
|
98
|
+
return toReturn;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
getByIndex(index) {
|
|
102
|
+
return this.content[index];
|
|
103
|
+
}
|
|
104
|
+
get length() {
|
|
105
|
+
return this.content.length;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=slot.js.map
|
package/dist/slot.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slot.js","sourceRoot":"","sources":["../src/slot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templateCache.d.ts","sourceRoot":"","sources":["../src/templateCache.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,aAAa;IACjC,OAAO,CAAC,MAAM,CAAC,SAAS,CAA4B;IAEpD,MAAM,CAAC,eAAe,CAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQtE,MAAM,CAAC,WAAW,CAAE,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;CAGvD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export default class TemplateCache {
|
|
2
|
+
static templates = {};
|
|
3
|
+
static compileTemplate(componentName, template) {
|
|
4
|
+
const root = document.createElement("div");
|
|
5
|
+
root.innerHTML = template;
|
|
6
|
+
const compiled = root.firstElementChild;
|
|
7
|
+
TemplateCache.templates[componentName] = compiled;
|
|
8
|
+
return compiled.cloneNode(true);
|
|
9
|
+
}
|
|
10
|
+
static getTemplate(componentName) {
|
|
11
|
+
return TemplateCache.templates[componentName]?.cloneNode(true) || null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=templateCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templateCache.js","sourceRoot":"","sources":["../src/templateCache.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,aAAa;IACzB,MAAM,CAAC,SAAS,GAAyB,EAAE,CAAC;IAEpD,MAAM,CAAC,eAAe,CAAE,aAAqB,EAAE,QAAgB;QAC9D,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAyB,CAAC;QAChD,aAAa,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC;QAClD,OAAO,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,WAAW,CAAE,aAAqB;QACxC,OAAO,aAAa,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACxE,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tripod311/splash",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "simple and flexible ui framework",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"js",
|
|
7
|
+
"ts",
|
|
8
|
+
"ui",
|
|
9
|
+
"reactive"
|
|
10
|
+
],
|
|
11
|
+
"main": "dist/index.js",
|
|
12
|
+
"types": "dist/index.d.ts",
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"README.md"
|
|
16
|
+
],
|
|
17
|
+
"license": "ISC",
|
|
18
|
+
"author": "Tripod311 ind.tripo@gmail.com",
|
|
19
|
+
"type": "module",
|
|
20
|
+
"scripts": {
|
|
21
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^24.3.0",
|
|
25
|
+
"typescript": "^5.9.2"
|
|
26
|
+
}
|
|
27
|
+
}
|