@fluixi/dom 1.0.0-alpha.83 → 1.0.0-alpha.85
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/dist/cdn/dom-client.cjs +1427 -1
- package/dist/cdn/dom-client.d.ts +2 -2
- package/dist/cdn/dom-client.global.js +2 -1
- package/dist/cdn/dom-client.js +3 -3
- package/dist/cdn/dom-client.mjs +1430 -1
- package/dist/cdn/dom.cjs +3127 -1
- package/dist/cdn/dom.d.ts +2 -2
- package/dist/cdn/dom.global.js +2 -1
- package/dist/cdn/dom.js +4 -4
- package/dist/cdn/dom.mjs +3133 -1
- package/dist/index.cjs +3155 -1
- package/dist/index.js +2 -2
- package/dist/index.mjs +3149 -1
- package/dist/lib/component/index.cjs +128 -1
- package/dist/lib/component/index.mjs +105 -1
- package/dist/lib/component/modifiers.cjs +126 -1
- package/dist/lib/component/modifiers.d.ts +12 -0
- package/dist/lib/component/modifiers.d.ts.map +1 -1
- package/dist/lib/component/modifiers.js +12 -84
- package/dist/lib/component/modifiers.mjs +105 -1
- package/dist/lib/dom/delegate.cjs +60 -1
- package/dist/lib/dom/delegate.js +1 -1
- package/dist/lib/dom/delegate.mjs +39 -1
- package/dist/lib/dom/dynamic-element.cjs +949 -1
- package/dist/lib/dom/dynamic-element.d.ts +3 -3
- package/dist/lib/dom/dynamic-element.js +2 -2
- package/dist/lib/dom/dynamic-element.mjs +928 -1
- package/dist/lib/dom/hydration-state.cjs +93 -1
- package/dist/lib/dom/hydration-state.d.ts +1 -1
- package/dist/lib/dom/hydration-state.js +1 -1
- package/dist/lib/dom/hydration-state.mjs +72 -1
- package/dist/lib/dom/hydration.cjs +685 -1
- package/dist/lib/dom/hydration.js +8 -8
- package/dist/lib/dom/hydration.mjs +664 -1
- package/dist/lib/dom/index.cjs +2040 -1
- package/dist/lib/dom/index.js +1 -1
- package/dist/lib/dom/index.mjs +2020 -1
- package/dist/lib/dom/integration.cjs +71 -1
- package/dist/lib/dom/integration.js +3 -3
- package/dist/lib/dom/integration.mjs +51 -1
- package/dist/lib/dom/island.cjs +790 -1
- package/dist/lib/dom/island.d.ts +1 -1
- package/dist/lib/dom/island.js +11 -11
- package/dist/lib/dom/island.mjs +769 -1
- package/dist/lib/dom/runtime.cjs +1432 -1
- package/dist/lib/dom/runtime.d.ts +60 -17
- package/dist/lib/dom/runtime.d.ts.map +1 -1
- package/dist/lib/dom/runtime.js +122 -79
- package/dist/lib/dom/runtime.mjs +1414 -1
- package/dist/lib/dom/server/fx-data.cjs +53 -1
- package/dist/lib/dom/server/fx-data.d.ts +5 -5
- package/dist/lib/dom/server/fx-data.js +6 -6
- package/dist/lib/dom/server/fx-data.mjs +32 -1
- package/dist/lib/dom/server/host.cjs +66 -1
- package/dist/lib/dom/server/host.d.ts +6 -0
- package/dist/lib/dom/server/host.d.ts.map +1 -1
- package/dist/lib/dom/server/host.js +7 -1
- package/dist/lib/dom/server/host.mjs +45 -1
- package/dist/lib/dom/server/index.cjs +759 -1
- package/dist/lib/dom/server/index.d.ts +1 -1
- package/dist/lib/dom/server/index.js +1 -1
- package/dist/lib/dom/server/index.mjs +743 -1
- package/dist/lib/dom/server/nodes.cjs +302 -1
- package/dist/lib/dom/server/nodes.d.ts +2 -2
- package/dist/lib/dom/server/nodes.d.ts.map +1 -1
- package/dist/lib/dom/server/nodes.js +4 -4
- package/dist/lib/dom/server/nodes.mjs +279 -1
- package/dist/lib/dom/server/parse-template.cjs +395 -1
- package/dist/lib/dom/server/parse-template.d.ts +1 -1
- package/dist/lib/dom/server/parse-template.js +4 -4
- package/dist/lib/dom/server/parse-template.mjs +372 -1
- package/dist/lib/dom/server/render.cjs +691 -1
- package/dist/lib/dom/server/render.d.ts +9 -1
- package/dist/lib/dom/server/render.d.ts.map +1 -1
- package/dist/lib/dom/server/render.js +23 -15
- package/dist/lib/dom/server/render.mjs +677 -1
- package/dist/lib/dom/server/request-context.cjs +110 -1
- package/dist/lib/dom/server/request-context.d.ts +29 -9
- package/dist/lib/dom/server/request-context.d.ts.map +1 -1
- package/dist/lib/dom/server/request-context.js +28 -8
- package/dist/lib/dom/server/request-context.mjs +89 -1
- package/dist/lib/dom/server/serialize.cjs +187 -1
- package/dist/lib/dom/server/serialize.js +3 -3
- package/dist/lib/dom/server/serialize.mjs +164 -1
- package/dist/lib/dom/server-renderer.cjs +760 -1
- package/dist/lib/dom/server-renderer.js +1 -1
- package/dist/lib/dom/server-renderer.mjs +745 -1
- package/dist/lib/dom/types.cjs +18 -1
- package/dist/lib/dom/utils.cjs +381 -1
- package/dist/lib/dom/utils.d.ts +1 -88
- package/dist/lib/dom/utils.d.ts.map +1 -1
- package/dist/lib/dom/utils.js +2 -99
- package/dist/lib/dom/utils.mjs +361 -1
- package/dist/lib/dom/versions.cjs +60 -1
- package/dist/lib/dom/versions.d.ts +3 -3
- package/dist/lib/dom/versions.d.ts.map +1 -1
- package/dist/lib/dom/versions.js +17 -5
- package/dist/lib/dom/versions.mjs +37 -1
- package/dist/lib/element/attributes.cjs +19 -1
- package/dist/lib/element/attributes.d.ts +7 -7
- package/dist/lib/element/attributes.js +1 -1
- package/dist/lib/element/attributes.mjs +1 -0
- package/dist/lib/element/index.cjs +19 -1
- package/dist/lib/element/index.mjs +1 -0
- package/dist/lib/element/types.cjs +18 -1
- package/dist/lib/element/types.d.ts +4 -5
- package/dist/lib/element/types.d.ts.map +1 -1
- package/dist/lib/element/types.js +0 -1
- package/dist/lib/flow/class-map.cjs +38 -1
- package/dist/lib/flow/class-map.d.ts +3 -3
- package/dist/lib/flow/class-map.js +2 -2
- package/dist/lib/flow/class-map.mjs +17 -1
- package/dist/lib/flow/client-only.cjs +57 -1
- package/dist/lib/flow/client-only.d.ts +4 -4
- package/dist/lib/flow/client-only.js +3 -3
- package/dist/lib/flow/client-only.mjs +36 -1
- package/dist/lib/flow/dynamic.cjs +53 -1
- package/dist/lib/flow/dynamic.d.ts +2 -2
- package/dist/lib/flow/dynamic.js +3 -3
- package/dist/lib/flow/dynamic.mjs +32 -1
- package/dist/lib/flow/error-boundary.cjs +43 -1
- package/dist/lib/flow/error-boundary.d.ts +2 -2
- package/dist/lib/flow/error-boundary.js +3 -3
- package/dist/lib/flow/error-boundary.mjs +22 -1
- package/dist/lib/flow/for.cjs +66 -1
- package/dist/lib/flow/for.d.ts +9 -9
- package/dist/lib/flow/for.d.ts.map +1 -1
- package/dist/lib/flow/for.js +2 -2
- package/dist/lib/flow/for.mjs +45 -1
- package/dist/lib/flow/index-flow.cjs +67 -1
- package/dist/lib/flow/index-flow.d.ts +5 -5
- package/dist/lib/flow/index-flow.js +4 -4
- package/dist/lib/flow/index-flow.mjs +46 -1
- package/dist/lib/flow/index.cjs +805 -1
- package/dist/lib/flow/index.mjs +792 -1
- package/dist/lib/flow/portal.cjs +538 -1
- package/dist/lib/flow/portal.mjs +519 -1
- package/dist/lib/flow/show.cjs +81 -1
- package/dist/lib/flow/show.d.ts +1 -1
- package/dist/lib/flow/show.d.ts.map +1 -1
- package/dist/lib/flow/show.js +4 -115
- package/dist/lib/flow/show.mjs +67 -1
- package/dist/lib/flow/style-map.cjs +43 -1
- package/dist/lib/flow/style-map.d.ts +3 -3
- package/dist/lib/flow/style-map.js +3 -3
- package/dist/lib/flow/style-map.mjs +22 -1
- package/dist/lib/flow/switch.cjs +91 -1
- package/dist/lib/flow/switch.d.ts +3 -3
- package/dist/lib/flow/switch.d.ts.map +1 -1
- package/dist/lib/flow/switch.js +6 -6
- package/dist/lib/flow/switch.mjs +70 -1
- package/dist/lib/flow/utils.cjs +44 -1
- package/dist/lib/flow/utils.d.ts +1 -1
- package/dist/lib/flow/utils.js +1 -1
- package/dist/lib/flow/utils.mjs +23 -1
- package/dist/lib/html.cjs +32 -1
- package/dist/lib/html.d.ts +6 -6
- package/dist/lib/html.js +5 -5
- package/dist/lib/html.mjs +11 -1
- package/dist/lib/index.cjs +3104 -1
- package/dist/lib/index.d.ts +0 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +2 -3
- package/dist/lib/index.mjs +3097 -1
- package/dist/lib/shared/types.cjs +18 -1
- package/dist/lib/shared/types.d.ts +8 -8
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/version.generated.cjs +26 -1
- package/dist/version.generated.d.ts +1 -1
- package/dist/version.generated.js +2 -2
- package/dist/version.generated.mjs +5 -1
- package/package.json +7 -6
- package/dist/lib/jsx/control-flow/flow.cjs +0 -1
- package/dist/lib/jsx/control-flow/flow.d.ts +0 -2
- package/dist/lib/jsx/control-flow/flow.d.ts.map +0 -1
- package/dist/lib/jsx/control-flow/flow.js +0 -627
- package/dist/lib/jsx/control-flow/flow.mjs +0 -0
- package/dist/lib/jsx/control-flow/for-flow.cjs +0 -1
- package/dist/lib/jsx/control-flow/for-flow.d.ts +0 -2
- package/dist/lib/jsx/control-flow/for-flow.d.ts.map +0 -1
- package/dist/lib/jsx/control-flow/for-flow.js +0 -1
- package/dist/lib/jsx/control-flow/for-flow.mjs +0 -0
|
@@ -1,627 +0,0 @@
|
|
|
1
|
-
// /**
|
|
2
|
-
// * @fileoverview Control Flow Components for Reactive DOM
|
|
3
|
-
// * @module @fluixi/dom/control-flow
|
|
4
|
-
// *
|
|
5
|
-
// * This module provides control flow components similar to SolidJS:
|
|
6
|
-
// * - Show: Conditional rendering
|
|
7
|
-
// * - For: Keyed list rendering
|
|
8
|
-
// * - Index: Index-based list rendering
|
|
9
|
-
// * - Switch/Match: Multi-way branching
|
|
10
|
-
// * - Portal: Render in a different DOM location
|
|
11
|
-
// * - Dynamic: Dynamic component rendering
|
|
12
|
-
// * - ErrorBoundary: Error handling
|
|
13
|
-
// */
|
|
14
|
-
export {};
|
|
15
|
-
// import {
|
|
16
|
-
// insert,
|
|
17
|
-
// createTextNode,
|
|
18
|
-
// resolveValue,
|
|
19
|
-
// isAccessor,
|
|
20
|
-
// createRenderEffect,
|
|
21
|
-
// } from './runtime.js';
|
|
22
|
-
// // ============================================================================
|
|
23
|
-
// // Types
|
|
24
|
-
// // ============================================================================
|
|
25
|
-
// export interface ShowProps<T> {
|
|
26
|
-
// when: T | (() => T);
|
|
27
|
-
// fallback?: any;
|
|
28
|
-
// children: any | ((item: NonNullable<T>) => any);
|
|
29
|
-
// }
|
|
30
|
-
// export interface ForProps<T> {
|
|
31
|
-
// each: T[] | (() => T[]);
|
|
32
|
-
// fallback?: any;
|
|
33
|
-
// children: (item: T, index: () => number) => any;
|
|
34
|
-
// }
|
|
35
|
-
// export interface IndexProps<T> {
|
|
36
|
-
// each: T[] | (() => T[]);
|
|
37
|
-
// fallback?: any;
|
|
38
|
-
// children: (item: () => T, index: number) => any;
|
|
39
|
-
// }
|
|
40
|
-
// export interface SwitchProps {
|
|
41
|
-
// fallback?: any;
|
|
42
|
-
// children: any;
|
|
43
|
-
// }
|
|
44
|
-
// export interface MatchProps<T> {
|
|
45
|
-
// when: T | (() => T);
|
|
46
|
-
// children: any | ((item: NonNullable<T>) => any);
|
|
47
|
-
// }
|
|
48
|
-
// export interface PortalProps {
|
|
49
|
-
// mount?: Element;
|
|
50
|
-
// useShadow?: boolean;
|
|
51
|
-
// ref?: (element: Element) => void;
|
|
52
|
-
// children: any;
|
|
53
|
-
// }
|
|
54
|
-
// export interface DynamicProps<T> {
|
|
55
|
-
// component: T | (() => T);
|
|
56
|
-
// children?: any;
|
|
57
|
-
// [key: string]: any;
|
|
58
|
-
// }
|
|
59
|
-
// export interface ErrorBoundaryProps {
|
|
60
|
-
// fallback: (error: Error, reset: () => void) => any;
|
|
61
|
-
// children: any;
|
|
62
|
-
// }
|
|
63
|
-
// // ============================================================================
|
|
64
|
-
// // Show - Conditional Rendering
|
|
65
|
-
// // ============================================================================
|
|
66
|
-
// /**
|
|
67
|
-
// * Show component for conditional rendering
|
|
68
|
-
// * Only renders children when condition is truthy
|
|
69
|
-
// *
|
|
70
|
-
// * @example
|
|
71
|
-
// * ```tsx
|
|
72
|
-
// * <Show when={user()} fallback={<div>Loading...</div>}>
|
|
73
|
-
// * {user => <div>Hello {user.name}</div>}
|
|
74
|
-
// * </Show>
|
|
75
|
-
// * ```
|
|
76
|
-
// */
|
|
77
|
-
// export function Show<T>(props: ShowProps<T>): Node {
|
|
78
|
-
// const marker = createTextNode('');
|
|
79
|
-
// const parent = document.createDocumentFragment();
|
|
80
|
-
// parent.appendChild(marker);
|
|
81
|
-
// let current: Node | Node[] | null = null;
|
|
82
|
-
// let condition: T | undefined;
|
|
83
|
-
// const dispose = createRenderEffect(() => {
|
|
84
|
-
// const c =
|
|
85
|
-
// typeof props.when === 'function' ? (props.when as any)() : props.when;
|
|
86
|
-
// if (c) {
|
|
87
|
-
// // Condition is truthy
|
|
88
|
-
// if (condition !== c) {
|
|
89
|
-
// condition = c as T;
|
|
90
|
-
// const child =
|
|
91
|
-
// typeof props.children === 'function'
|
|
92
|
-
// ? props.children(c as NonNullable<T>)
|
|
93
|
-
// : props.children;
|
|
94
|
-
// const result = insert(parent, child, marker, current || undefined);
|
|
95
|
-
// current = typeof result === 'function' ? result() : result;
|
|
96
|
-
// }
|
|
97
|
-
// } else {
|
|
98
|
-
// // Condition is falsy
|
|
99
|
-
// if (condition !== undefined || current !== null) {
|
|
100
|
-
// condition = undefined;
|
|
101
|
-
// const result = insert(
|
|
102
|
-
// parent,
|
|
103
|
-
// props.fallback,
|
|
104
|
-
// marker,
|
|
105
|
-
// current || undefined
|
|
106
|
-
// );
|
|
107
|
-
// current = typeof result === 'function' ? result() : result;
|
|
108
|
-
// }
|
|
109
|
-
// }
|
|
110
|
-
// });
|
|
111
|
-
// // Return the fragment or marker for insertion
|
|
112
|
-
// return marker;
|
|
113
|
-
// }
|
|
114
|
-
// // ============================================================================
|
|
115
|
-
// // For - Keyed List Rendering
|
|
116
|
-
// // ============================================================================
|
|
117
|
-
// /**
|
|
118
|
-
// * For component for efficiently rendering keyed lists
|
|
119
|
-
// * Tracks items by reference for optimal updates
|
|
120
|
-
// *
|
|
121
|
-
// * @example
|
|
122
|
-
// * ```tsx
|
|
123
|
-
// * <For each={items()} fallback={<div>No items</div>}>
|
|
124
|
-
// * {(item, index) => <div>{index()}: {item.name}</div>}
|
|
125
|
-
// * </For>
|
|
126
|
-
// * ```
|
|
127
|
-
// */
|
|
128
|
-
// export function For<T>(props: ForProps<T>): Node {
|
|
129
|
-
// const marker = createTextNode('');
|
|
130
|
-
// const parent = document.createDocumentFragment();
|
|
131
|
-
// parent.appendChild(marker);
|
|
132
|
-
// let items: T[] = [];
|
|
133
|
-
// let mapped: Array<{ item: T; index: number; nodes: Node | Node[] }> = [];
|
|
134
|
-
// const dispose = createRenderEffect(() => {
|
|
135
|
-
// const newItems =
|
|
136
|
-
// (typeof props.each === 'function' ? (props.each as any)() : props.each) ||
|
|
137
|
-
// [];
|
|
138
|
-
// if (newItems.length === 0) {
|
|
139
|
-
// // Show fallback if no items
|
|
140
|
-
// if (mapped.length > 0) {
|
|
141
|
-
// cleanup();
|
|
142
|
-
// }
|
|
143
|
-
// if (props.fallback) {
|
|
144
|
-
// insert(parent, props.fallback, marker, undefined);
|
|
145
|
-
// }
|
|
146
|
-
// return;
|
|
147
|
-
// }
|
|
148
|
-
// // Map tracking
|
|
149
|
-
// const temp: Array<{ item: T; index: number; nodes: Node | Node[] }> = [];
|
|
150
|
-
// const newMapped: Array<{ item: T; index: number; nodes: Node | Node[] }> =
|
|
151
|
-
// [];
|
|
152
|
-
// // Find existing items
|
|
153
|
-
// for (let i = 0; i < newItems.length; i++) {
|
|
154
|
-
// const item = newItems[i];
|
|
155
|
-
// const existing = mapped.find((m) => m.item === item);
|
|
156
|
-
// if (existing) {
|
|
157
|
-
// // Item exists, update index
|
|
158
|
-
// newMapped.push({
|
|
159
|
-
// item,
|
|
160
|
-
// index: i,
|
|
161
|
-
// nodes: existing.nodes,
|
|
162
|
-
// });
|
|
163
|
-
// } else {
|
|
164
|
-
// // New item, create nodes
|
|
165
|
-
// const indexAccessor = () => {
|
|
166
|
-
// const found = newMapped.find((m) => m.item === item);
|
|
167
|
-
// return found ? found.index : i;
|
|
168
|
-
// };
|
|
169
|
-
// const nodes = props.children(item, indexAccessor);
|
|
170
|
-
// newMapped.push({ item, index: i, nodes });
|
|
171
|
-
// }
|
|
172
|
-
// }
|
|
173
|
-
// // Update DOM
|
|
174
|
-
// reconcileFor(parent, mapped, newMapped, marker);
|
|
175
|
-
// items = newItems;
|
|
176
|
-
// mapped = newMapped;
|
|
177
|
-
// });
|
|
178
|
-
// return marker;
|
|
179
|
-
// }
|
|
180
|
-
// function reconcileFor<T>(
|
|
181
|
-
// parent: Node,
|
|
182
|
-
// oldMapped: Array<{ item: T; index: number; nodes: Node | Node[] }>,
|
|
183
|
-
// newMapped: Array<{ item: T; index: number; nodes: Node | Node[] }>,
|
|
184
|
-
// marker: Node
|
|
185
|
-
// ): void {
|
|
186
|
-
// // Simple reconciliation - can be optimized further
|
|
187
|
-
// if (oldMapped.length === 0) {
|
|
188
|
-
// // Insert all new
|
|
189
|
-
// for (const mapped of newMapped) {
|
|
190
|
-
// insertNodes(parent, mapped.nodes, marker);
|
|
191
|
-
// }
|
|
192
|
-
// return;
|
|
193
|
-
// }
|
|
194
|
-
// if (newMapped.length === 0) {
|
|
195
|
-
// // Remove all old
|
|
196
|
-
// for (const mapped of oldMapped) {
|
|
197
|
-
// removeNodes(parent, mapped.nodes);
|
|
198
|
-
// }
|
|
199
|
-
// return;
|
|
200
|
-
// }
|
|
201
|
-
// // Full reconciliation
|
|
202
|
-
// const oldMap = new Map(oldMapped.map((m) => [m.item, m]));
|
|
203
|
-
// const newMap = new Map(newMapped.map((m) => [m.item, m]));
|
|
204
|
-
// // Remove items not in new list
|
|
205
|
-
// for (const old of oldMapped) {
|
|
206
|
-
// if (!newMap.has(old.item)) {
|
|
207
|
-
// removeNodes(parent, old.nodes);
|
|
208
|
-
// }
|
|
209
|
-
// }
|
|
210
|
-
// // Add/move items
|
|
211
|
-
// let previousNode: Node | null = null;
|
|
212
|
-
// for (let i = 0; i < newMapped.length; i++) {
|
|
213
|
-
// const mapped = newMapped[i];
|
|
214
|
-
// const nodes = Array.isArray(mapped.nodes) ? mapped.nodes : [mapped.nodes];
|
|
215
|
-
// if (oldMap.has(mapped.item)) {
|
|
216
|
-
// // Move if needed
|
|
217
|
-
// const firstNode = nodes[0];
|
|
218
|
-
// if (previousNode) {
|
|
219
|
-
// if (previousNode.nextSibling !== firstNode) {
|
|
220
|
-
// for (const node of nodes) {
|
|
221
|
-
// parent.insertBefore(node, previousNode.nextSibling);
|
|
222
|
-
// }
|
|
223
|
-
// }
|
|
224
|
-
// }
|
|
225
|
-
// } else {
|
|
226
|
-
// // Insert new
|
|
227
|
-
// const insertPoint = previousNode ? previousNode.nextSibling : marker;
|
|
228
|
-
// for (const node of nodes) {
|
|
229
|
-
// parent.insertBefore(node, insertPoint);
|
|
230
|
-
// }
|
|
231
|
-
// }
|
|
232
|
-
// previousNode = nodes[nodes.length - 1];
|
|
233
|
-
// }
|
|
234
|
-
// }
|
|
235
|
-
// function insertNodes(parent: Node, nodes: Node | Node[], marker: Node): void {
|
|
236
|
-
// const nodeArray = Array.isArray(nodes) ? nodes : [nodes];
|
|
237
|
-
// for (const node of nodeArray) {
|
|
238
|
-
// parent.insertBefore(node, marker);
|
|
239
|
-
// }
|
|
240
|
-
// }
|
|
241
|
-
// function removeNodes(parent: Node, nodes: Node | Node[]): void {
|
|
242
|
-
// const nodeArray = Array.isArray(nodes) ? nodes : [nodes];
|
|
243
|
-
// for (const node of nodeArray) {
|
|
244
|
-
// if (node.parentNode === parent) {
|
|
245
|
-
// parent.removeChild(node);
|
|
246
|
-
// }
|
|
247
|
-
// }
|
|
248
|
-
// }
|
|
249
|
-
// function cleanup(): void {
|
|
250
|
-
// // Cleanup logic if needed
|
|
251
|
-
// }
|
|
252
|
-
// // ============================================================================
|
|
253
|
-
// // Index - Index-based List Rendering
|
|
254
|
-
// // ============================================================================
|
|
255
|
-
// /**
|
|
256
|
-
// * Index component for rendering lists with stable indices
|
|
257
|
-
// * Use when items change but positions don't
|
|
258
|
-
// *
|
|
259
|
-
// * @example
|
|
260
|
-
// * ```tsx
|
|
261
|
-
// * <Index each={items()}>
|
|
262
|
-
// * {(item, index) => <div>{index}: {item().name}</div>}
|
|
263
|
-
// * </Index>
|
|
264
|
-
// * ```
|
|
265
|
-
// */
|
|
266
|
-
// export function Index<T>(props: IndexProps<T>): Node {
|
|
267
|
-
// const marker = createTextNode('');
|
|
268
|
-
// const parent = document.createDocumentFragment();
|
|
269
|
-
// parent.appendChild(marker);
|
|
270
|
-
// let items: T[] = [];
|
|
271
|
-
// let mapped: Array<{ accessor: () => T; nodes: Node | Node[] }> = [];
|
|
272
|
-
// const dispose = createRenderEffect(() => {
|
|
273
|
-
// const newItems =
|
|
274
|
-
// (typeof props.each === 'function' ? (props.each as any)() : props.each) ||
|
|
275
|
-
// [];
|
|
276
|
-
// if (newItems.length === 0) {
|
|
277
|
-
// if (mapped.length > 0) {
|
|
278
|
-
// for (const m of mapped) {
|
|
279
|
-
// removeNodes(parent, m.nodes);
|
|
280
|
-
// }
|
|
281
|
-
// mapped = [];
|
|
282
|
-
// }
|
|
283
|
-
// if (props.fallback) {
|
|
284
|
-
// insert(parent, props.fallback, marker, undefined);
|
|
285
|
-
// }
|
|
286
|
-
// return;
|
|
287
|
-
// }
|
|
288
|
-
// const newMapped: Array<{ accessor: () => T; nodes: Node | Node[] }> = [];
|
|
289
|
-
// for (let i = 0; i < newItems.length; i++) {
|
|
290
|
-
// if (i < mapped.length) {
|
|
291
|
-
// // Update existing
|
|
292
|
-
// const item = newItems[i];
|
|
293
|
-
// const accessor = (() => {
|
|
294
|
-
// let value = item;
|
|
295
|
-
// return () => value;
|
|
296
|
-
// })();
|
|
297
|
-
// newMapped.push({ accessor, nodes: mapped[i].nodes });
|
|
298
|
-
// } else {
|
|
299
|
-
// // Create new
|
|
300
|
-
// const item = newItems[i];
|
|
301
|
-
// const accessor = (() => {
|
|
302
|
-
// let value = item;
|
|
303
|
-
// return () => value;
|
|
304
|
-
// })();
|
|
305
|
-
// const nodes = props.children(accessor, i);
|
|
306
|
-
// newMapped.push({ accessor, nodes });
|
|
307
|
-
// insertNodes(parent, nodes, marker);
|
|
308
|
-
// }
|
|
309
|
-
// }
|
|
310
|
-
// // Remove extra
|
|
311
|
-
// for (let i = newItems.length; i < mapped.length; i++) {
|
|
312
|
-
// removeNodes(parent, mapped[i].nodes);
|
|
313
|
-
// }
|
|
314
|
-
// items = newItems;
|
|
315
|
-
// mapped = newMapped;
|
|
316
|
-
// });
|
|
317
|
-
// return marker;
|
|
318
|
-
// }
|
|
319
|
-
// // ============================================================================
|
|
320
|
-
// // Switch/Match - Multi-way Branching
|
|
321
|
-
// // ============================================================================
|
|
322
|
-
// /**
|
|
323
|
-
// * Switch component for multi-way conditional rendering
|
|
324
|
-
// *
|
|
325
|
-
// * @example
|
|
326
|
-
// * ```tsx
|
|
327
|
-
// * <Switch fallback={<div>Default</div>}>
|
|
328
|
-
// * <Match when={state() === 'loading'}>
|
|
329
|
-
// * <div>Loading...</div>
|
|
330
|
-
// * </Match>
|
|
331
|
-
// * <Match when={state() === 'error'}>
|
|
332
|
-
// * <div>Error!</div>
|
|
333
|
-
// * </Match>
|
|
334
|
-
// * </Switch>
|
|
335
|
-
// * ```
|
|
336
|
-
// */
|
|
337
|
-
// export function Switch(props: SwitchProps): Node {
|
|
338
|
-
// const marker = createTextNode('');
|
|
339
|
-
// const parent = document.createDocumentFragment();
|
|
340
|
-
// parent.appendChild(marker);
|
|
341
|
-
// let current: Node | Node[] | null = null;
|
|
342
|
-
// let matchedIndex = -1;
|
|
343
|
-
// const dispose = createRenderEffect(() => {
|
|
344
|
-
// const children = Array.isArray(props.children)
|
|
345
|
-
// ? props.children
|
|
346
|
-
// : [props.children];
|
|
347
|
-
// let matched = false;
|
|
348
|
-
// let newIndex = -1;
|
|
349
|
-
// for (let i = 0; i < children.length; i++) {
|
|
350
|
-
// const child = children[i];
|
|
351
|
-
// // Check if this is a Match component result
|
|
352
|
-
// if (child && typeof child === 'object' && 'when' in child) {
|
|
353
|
-
// const condition =
|
|
354
|
-
// typeof child.when === 'function' ? (child.when as any)() : child.when;
|
|
355
|
-
// if (condition) {
|
|
356
|
-
// matched = true;
|
|
357
|
-
// newIndex = i;
|
|
358
|
-
// if (matchedIndex !== newIndex) {
|
|
359
|
-
// const content =
|
|
360
|
-
// typeof child.children === 'function'
|
|
361
|
-
// ? child.children(condition)
|
|
362
|
-
// : child.children;
|
|
363
|
-
// const result = insert(
|
|
364
|
-
// parent,
|
|
365
|
-
// content,
|
|
366
|
-
// marker,
|
|
367
|
-
// current || undefined
|
|
368
|
-
// );
|
|
369
|
-
// current = typeof result === 'function' ? result() : result;
|
|
370
|
-
// matchedIndex = newIndex;
|
|
371
|
-
// }
|
|
372
|
-
// break;
|
|
373
|
-
// }
|
|
374
|
-
// }
|
|
375
|
-
// }
|
|
376
|
-
// if (!matched) {
|
|
377
|
-
// if (matchedIndex !== -1 || current !== null) {
|
|
378
|
-
// const result = insert(
|
|
379
|
-
// parent,
|
|
380
|
-
// props.fallback,
|
|
381
|
-
// marker,
|
|
382
|
-
// current || undefined
|
|
383
|
-
// );
|
|
384
|
-
// current = typeof result === 'function' ? result() : result;
|
|
385
|
-
// matchedIndex = -1;
|
|
386
|
-
// }
|
|
387
|
-
// }
|
|
388
|
-
// });
|
|
389
|
-
// return marker;
|
|
390
|
-
// }
|
|
391
|
-
// /**
|
|
392
|
-
// * Match component - used inside Switch
|
|
393
|
-
// */
|
|
394
|
-
// export function Match<T>(props: MatchProps<T>): {
|
|
395
|
-
// when: T | (() => T);
|
|
396
|
-
// children: any;
|
|
397
|
-
// } {
|
|
398
|
-
// // This returns a descriptor object for Switch to process
|
|
399
|
-
// return props as any;
|
|
400
|
-
// }
|
|
401
|
-
// // ============================================================================
|
|
402
|
-
// // Portal - Render to Different DOM Location
|
|
403
|
-
// // ============================================================================
|
|
404
|
-
// /**
|
|
405
|
-
// * Portal component for rendering content outside the component tree
|
|
406
|
-
// *
|
|
407
|
-
// * @example
|
|
408
|
-
// * ```tsx
|
|
409
|
-
// * <Portal mount={document.body}>
|
|
410
|
-
// * <div class="modal">Modal content</div>
|
|
411
|
-
// * </Portal>
|
|
412
|
-
// * ```
|
|
413
|
-
// */
|
|
414
|
-
// export function Portal(props: PortalProps): Node {
|
|
415
|
-
// const marker = createTextNode('');
|
|
416
|
-
// const container = props.mount || document.body;
|
|
417
|
-
// const dispose = createRenderEffect(() => {
|
|
418
|
-
// insert(container, props.children);
|
|
419
|
-
// });
|
|
420
|
-
// if (props.ref) {
|
|
421
|
-
// props.ref(container);
|
|
422
|
-
// }
|
|
423
|
-
// return marker;
|
|
424
|
-
// }
|
|
425
|
-
// // ============================================================================
|
|
426
|
-
// // Dynamic - Dynamic Component Rendering
|
|
427
|
-
// // ============================================================================
|
|
428
|
-
// /**
|
|
429
|
-
// * Dynamic component for rendering components determined at runtime
|
|
430
|
-
// *
|
|
431
|
-
// * @example
|
|
432
|
-
// * ```tsx
|
|
433
|
-
// * <Dynamic component={activeComponent()} {...props} />
|
|
434
|
-
// * ```
|
|
435
|
-
// */
|
|
436
|
-
// export function Dynamic<T>(props: DynamicProps<T>): Node {
|
|
437
|
-
// const marker = createTextNode('');
|
|
438
|
-
// const parent = document.createDocumentFragment();
|
|
439
|
-
// parent.appendChild(marker);
|
|
440
|
-
// let current: Node | Node[] | null = null;
|
|
441
|
-
// let currentComponent: any = null;
|
|
442
|
-
// const dispose = createRenderEffect(() => {
|
|
443
|
-
// const component =
|
|
444
|
-
// typeof props.component === 'function'
|
|
445
|
-
// ? (props.component as any)()
|
|
446
|
-
// : props.component;
|
|
447
|
-
// if (component !== currentComponent) {
|
|
448
|
-
// currentComponent = component;
|
|
449
|
-
// if (typeof component === 'function') {
|
|
450
|
-
// // Extract props (everything except 'component')
|
|
451
|
-
// const { component: _, children, ...rest } = props;
|
|
452
|
-
// const result = component({ ...rest, children });
|
|
453
|
-
// const insertResult = insert(
|
|
454
|
-
// parent,
|
|
455
|
-
// result,
|
|
456
|
-
// marker,
|
|
457
|
-
// current || undefined
|
|
458
|
-
// );
|
|
459
|
-
// current =
|
|
460
|
-
// typeof insertResult === 'function' ? insertResult() : insertResult;
|
|
461
|
-
// } else if (typeof component === 'string') {
|
|
462
|
-
// // Native element
|
|
463
|
-
// const element = document.createElement(component);
|
|
464
|
-
// const { component: _, children, ...rest } = props;
|
|
465
|
-
// // Apply props
|
|
466
|
-
// for (const key in rest) {
|
|
467
|
-
// (element as any)[key] = rest[key];
|
|
468
|
-
// }
|
|
469
|
-
// if (children) {
|
|
470
|
-
// insert(element, children);
|
|
471
|
-
// }
|
|
472
|
-
// const insertResult = insert(
|
|
473
|
-
// parent,
|
|
474
|
-
// element,
|
|
475
|
-
// marker,
|
|
476
|
-
// current || undefined
|
|
477
|
-
// );
|
|
478
|
-
// current =
|
|
479
|
-
// typeof insertResult === 'function' ? insertResult() : insertResult;
|
|
480
|
-
// }
|
|
481
|
-
// }
|
|
482
|
-
// });
|
|
483
|
-
// return marker;
|
|
484
|
-
// }
|
|
485
|
-
// // ============================================================================
|
|
486
|
-
// // ErrorBoundary - Error Handling
|
|
487
|
-
// // ============================================================================
|
|
488
|
-
// /**
|
|
489
|
-
// * ErrorBoundary component for catching and handling errors
|
|
490
|
-
// *
|
|
491
|
-
// * @example
|
|
492
|
-
// * ```tsx
|
|
493
|
-
// * <ErrorBoundary fallback={(err, reset) => (
|
|
494
|
-
// * <div>
|
|
495
|
-
// * <p>Error: {err.message}</p>
|
|
496
|
-
// * <button onClick={reset}>Retry</button>
|
|
497
|
-
// * </div>
|
|
498
|
-
// * )}>
|
|
499
|
-
// * <MyComponent />
|
|
500
|
-
// * </ErrorBoundary>
|
|
501
|
-
// * ```
|
|
502
|
-
// */
|
|
503
|
-
// export function ErrorBoundary(props: ErrorBoundaryProps): Node {
|
|
504
|
-
// const marker = createTextNode('');
|
|
505
|
-
// const parent = document.createDocumentFragment();
|
|
506
|
-
// parent.appendChild(marker);
|
|
507
|
-
// let current: Node | Node[] | null = null;
|
|
508
|
-
// let error: Error | null = null;
|
|
509
|
-
// const reset = () => {
|
|
510
|
-
// error = null;
|
|
511
|
-
// renderChildren();
|
|
512
|
-
// };
|
|
513
|
-
// const renderChildren = () => {
|
|
514
|
-
// try {
|
|
515
|
-
// const result = insert(
|
|
516
|
-
// parent,
|
|
517
|
-
// props.children,
|
|
518
|
-
// marker,
|
|
519
|
-
// current || undefined
|
|
520
|
-
// );
|
|
521
|
-
// current = typeof result === 'function' ? result() : result;
|
|
522
|
-
// } catch (err) {
|
|
523
|
-
// error = err as Error;
|
|
524
|
-
// renderError();
|
|
525
|
-
// }
|
|
526
|
-
// };
|
|
527
|
-
// const renderError = () => {
|
|
528
|
-
// if (error) {
|
|
529
|
-
// const result = insert(
|
|
530
|
-
// parent,
|
|
531
|
-
// props.fallback(error, reset),
|
|
532
|
-
// marker,
|
|
533
|
-
// current || undefined
|
|
534
|
-
// );
|
|
535
|
-
// current = typeof result === 'function' ? result() : result;
|
|
536
|
-
// }
|
|
537
|
-
// };
|
|
538
|
-
// createRenderEffect(() => {
|
|
539
|
-
// if (error) {
|
|
540
|
-
// renderError();
|
|
541
|
-
// } else {
|
|
542
|
-
// renderChildren();
|
|
543
|
-
// }
|
|
544
|
-
// });
|
|
545
|
-
// return marker;
|
|
546
|
-
// }
|
|
547
|
-
// // ============================================================================
|
|
548
|
-
// // Suspense - Async Resource Handling
|
|
549
|
-
// // ============================================================================
|
|
550
|
-
// export interface SuspenseProps {
|
|
551
|
-
// fallback: any;
|
|
552
|
-
// children: any;
|
|
553
|
-
// }
|
|
554
|
-
// /**
|
|
555
|
-
// * Suspense component for handling async resources
|
|
556
|
-
// *
|
|
557
|
-
// * @example
|
|
558
|
-
// * ```tsx
|
|
559
|
-
// * <Suspense fallback={<div>Loading...</div>}>
|
|
560
|
-
// * <AsyncComponent />
|
|
561
|
-
// * </Suspense>
|
|
562
|
-
// * ```
|
|
563
|
-
// */
|
|
564
|
-
// export function Suspense(props: SuspenseProps): Node {
|
|
565
|
-
// const marker = createTextNode('');
|
|
566
|
-
// const parent = document.createDocumentFragment();
|
|
567
|
-
// parent.appendChild(marker);
|
|
568
|
-
// let current: Node | Node[] | null = null;
|
|
569
|
-
// let suspended = false;
|
|
570
|
-
// const dispose = createRenderEffect(() => {
|
|
571
|
-
// try {
|
|
572
|
-
// if (suspended) {
|
|
573
|
-
// const result = insert(
|
|
574
|
-
// parent,
|
|
575
|
-
// props.fallback,
|
|
576
|
-
// marker,
|
|
577
|
-
// current || undefined
|
|
578
|
-
// );
|
|
579
|
-
// current = typeof result === 'function' ? result() : result;
|
|
580
|
-
// } else {
|
|
581
|
-
// const result = insert(
|
|
582
|
-
// parent,
|
|
583
|
-
// props.children,
|
|
584
|
-
// marker,
|
|
585
|
-
// current || undefined
|
|
586
|
-
// );
|
|
587
|
-
// current = typeof result === 'function' ? result() : result;
|
|
588
|
-
// }
|
|
589
|
-
// } catch (promise) {
|
|
590
|
-
// if (promise instanceof Promise) {
|
|
591
|
-
// suspended = true;
|
|
592
|
-
// const result = insert(
|
|
593
|
-
// parent,
|
|
594
|
-
// props.fallback,
|
|
595
|
-
// marker,
|
|
596
|
-
// current || undefined
|
|
597
|
-
// );
|
|
598
|
-
// current = typeof result === 'function' ? result() : result;
|
|
599
|
-
// promise.then(() => {
|
|
600
|
-
// suspended = false;
|
|
601
|
-
// const result = insert(
|
|
602
|
-
// parent,
|
|
603
|
-
// props.children,
|
|
604
|
-
// marker,
|
|
605
|
-
// current || undefined
|
|
606
|
-
// );
|
|
607
|
-
// current = typeof result === 'function' ? result() : result;
|
|
608
|
-
// });
|
|
609
|
-
// }
|
|
610
|
-
// }
|
|
611
|
-
// });
|
|
612
|
-
// return marker;
|
|
613
|
-
// }
|
|
614
|
-
// // ============================================================================
|
|
615
|
-
// // Exports
|
|
616
|
-
// // ============================================================================
|
|
617
|
-
// export default {
|
|
618
|
-
// Show,
|
|
619
|
-
// For,
|
|
620
|
-
// Index,
|
|
621
|
-
// Switch,
|
|
622
|
-
// Match,
|
|
623
|
-
// Portal,
|
|
624
|
-
// Dynamic,
|
|
625
|
-
// ErrorBoundary,
|
|
626
|
-
// Suspense,
|
|
627
|
-
// };
|
|
File without changes
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"for-flow.d.ts","sourceRoot":"","sources":["../../../../src/lib/jsx/control-flow/for-flow.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
File without changes
|