@fluixi/core 1.0.0-alpha.94 → 1.0.0-alpha.96
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/LICENSE +1 -1
- package/dist/cdn/core.global.js +2 -2
- package/dist/src/cdn/{chunk-7XM7Q5VR.mjs → chunk-RKBFEFZP.mjs} +125 -10
- package/dist/src/cdn/core.cjs +132 -12
- package/dist/src/cdn/core.mjs +4 -4
- package/dist/src/cdn/{router-VOY43YNM.mjs → router-V2THK27H.mjs} +3 -3
- package/dist/src/index.cjs +122 -7
- package/dist/src/index.mjs +122 -7
- package/dist/src/lib/client/{chunk-TSXM2PNY.mjs → chunk-RNRJHQFG.mjs} +1 -1
- package/dist/src/lib/client/index.cjs +133 -13
- package/dist/src/lib/client/index.d.ts.map +1 -1
- package/dist/src/lib/client/index.js +4 -1
- package/dist/src/lib/client/index.mjs +5 -5
- package/dist/src/lib/client/{router-BDVPLLYX.mjs → router-F3Y4BIVJ.mjs} +127 -12
- package/dist/src/lib/core.cjs +121 -6
- package/dist/src/lib/core.mjs +121 -6
- package/dist/src/lib/i18n/index.cjs +1 -1
- package/dist/src/lib/i18n/index.mjs +1 -1
- package/dist/src/lib/index.cjs +1 -1
- package/dist/src/lib/index.mjs +1 -1
- package/dist/src/lib/isomorphic.cjs +1 -1
- package/dist/src/lib/isomorphic.d.ts +5 -0
- package/dist/src/lib/isomorphic.d.ts.map +1 -1
- package/dist/src/lib/isomorphic.js +1 -1
- package/dist/src/lib/isomorphic.mjs +1 -1
- package/dist/src/lib/jsx-runtime/index.cjs +1 -1
- package/dist/src/lib/jsx-runtime/index.mjs +1 -1
- package/dist/src/lib/jsx-runtime/jsx-dev-runtime.cjs +1 -1
- package/dist/src/lib/jsx-runtime/jsx-dev-runtime.mjs +1 -1
- package/dist/src/lib/plugins/index.cjs +1 -1
- package/dist/src/lib/plugins/index.mjs +1 -1
- package/dist/src/lib/render/index.cjs +1 -1
- package/dist/src/lib/render/index.mjs +1 -1
- package/dist/src/lib/render/versions.cjs +1 -1
- package/dist/src/lib/render/versions.mjs +1 -1
- package/dist/src/lib/router/data.cjs +4 -4
- package/dist/src/lib/router/data.d.ts.map +1 -1
- package/dist/src/lib/router/data.js +9 -8
- package/dist/src/lib/router/data.mjs +4 -4
- package/dist/src/lib/router/index.cjs +126 -11
- package/dist/src/lib/router/index.d.ts +8 -5
- package/dist/src/lib/router/index.d.ts.map +1 -1
- package/dist/src/lib/router/index.js +94 -7
- package/dist/src/lib/router/index.mjs +126 -11
- package/dist/src/lib/router/scroll.cjs +79 -0
- package/dist/src/lib/router/scroll.d.ts +19 -0
- package/dist/src/lib/router/scroll.d.ts.map +1 -0
- package/dist/src/lib/router/scroll.js +68 -0
- package/dist/src/lib/router/scroll.mjs +58 -0
- package/dist/src/lib/server/index.cjs +1 -1
- package/dist/src/lib/server/index.mjs +1 -1
- package/dist/src/lib/storage/index.cjs +1 -1
- package/dist/src/lib/storage/index.mjs +1 -1
- package/dist/src/routes.cjs +1 -1
- package/dist/src/routes.mjs +1 -1
- package/dist/src/utils.cjs +1 -1
- package/dist/src/utils.mjs +1 -1
- package/dist/src/version.generated.cjs +1 -1
- package/dist/src/version.generated.d.ts +1 -1
- package/dist/src/version.generated.js +1 -1
- package/dist/src/version.generated.mjs +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/package.json +16 -16
|
@@ -84,6 +84,64 @@ import {
|
|
|
84
84
|
import { createContext as createContext2, useContext as useContext2 } from "@fluixi/reactive/signal";
|
|
85
85
|
import { get } from "@fluixi/utils/object";
|
|
86
86
|
import { deepEqual } from "@fluixi/utils/compare";
|
|
87
|
+
|
|
88
|
+
// src/lib/router/scroll.ts
|
|
89
|
+
var STORE = "fx:scroll";
|
|
90
|
+
var KEEP = 100;
|
|
91
|
+
function keepScroll(initial) {
|
|
92
|
+
const read2 = () => {
|
|
93
|
+
try {
|
|
94
|
+
return JSON.parse(sessionStorage.getItem(STORE) ?? "{}");
|
|
95
|
+
} catch {
|
|
96
|
+
return {};
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const positions = read2();
|
|
100
|
+
const write = () => {
|
|
101
|
+
const keys = Object.keys(positions);
|
|
102
|
+
for (const key of keys.slice(0, Math.max(0, keys.length - KEEP))) delete positions[key];
|
|
103
|
+
try {
|
|
104
|
+
sessionStorage.setItem(STORE, JSON.stringify(positions));
|
|
105
|
+
} catch {
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
let current = initial.key;
|
|
109
|
+
const save = () => {
|
|
110
|
+
if (current === void 0) return;
|
|
111
|
+
delete positions[current];
|
|
112
|
+
positions[current] = window.scrollY;
|
|
113
|
+
write();
|
|
114
|
+
};
|
|
115
|
+
const restoration = history.scrollRestoration;
|
|
116
|
+
history.scrollRestoration = "manual";
|
|
117
|
+
window.addEventListener("pagehide", save);
|
|
118
|
+
const to = (top) => window.scrollTo({ top, left: 0, behavior: "instant" });
|
|
119
|
+
const toHash = (hash) => {
|
|
120
|
+
if (!hash || hash === "#") return false;
|
|
121
|
+
const target = document.getElementById(decodeURIComponent(hash.slice(1)));
|
|
122
|
+
target?.scrollIntoView({ behavior: "instant" });
|
|
123
|
+
return target !== null;
|
|
124
|
+
};
|
|
125
|
+
return {
|
|
126
|
+
leave: save,
|
|
127
|
+
arrive(location, from) {
|
|
128
|
+
current = location.key;
|
|
129
|
+
if (location.action === "pop" || from === void 0) {
|
|
130
|
+
const y = location.key === void 0 ? void 0 : positions[location.key];
|
|
131
|
+
if (y !== void 0) to(y);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (location.action === "replace" && location.pathname === from.pathname) return;
|
|
135
|
+
if (!toHash(location.hash)) to(0);
|
|
136
|
+
},
|
|
137
|
+
dispose() {
|
|
138
|
+
window.removeEventListener("pagehide", save);
|
|
139
|
+
history.scrollRestoration = restoration;
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// src/lib/router/index.ts
|
|
87
145
|
import {
|
|
88
146
|
createRouter as createCoreRouter,
|
|
89
147
|
createBrowserHistory,
|
|
@@ -245,7 +303,8 @@ function getSubmissionsSignal(url) {
|
|
|
245
303
|
}
|
|
246
304
|
function action(fn, name, options = {}) {
|
|
247
305
|
const actionUrl = name || fn.name || "action";
|
|
248
|
-
const submit = async (
|
|
306
|
+
const submit = async (...args) => {
|
|
307
|
+
const input = args.length > 1 ? args : args[0];
|
|
249
308
|
const [, setSubmission] = getSubmissionSignal(actionUrl);
|
|
250
309
|
const [, setSubmissions] = getSubmissionsSignal(actionUrl);
|
|
251
310
|
let entry;
|
|
@@ -260,11 +319,10 @@ function action(fn, name, options = {}) {
|
|
|
260
319
|
};
|
|
261
320
|
const retry = () => {
|
|
262
321
|
drop2();
|
|
263
|
-
return submit(
|
|
322
|
+
return submit(...args);
|
|
264
323
|
};
|
|
265
324
|
entry = {
|
|
266
325
|
input,
|
|
267
|
-
// Approximate type for tracking
|
|
268
326
|
pending: true,
|
|
269
327
|
clear,
|
|
270
328
|
retry
|
|
@@ -272,7 +330,7 @@ function action(fn, name, options = {}) {
|
|
|
272
330
|
setSubmission(entry);
|
|
273
331
|
setSubmissions((list) => [...list, entry]);
|
|
274
332
|
try {
|
|
275
|
-
const result = await fn(
|
|
333
|
+
const result = await fn(...args);
|
|
276
334
|
setSubmission({
|
|
277
335
|
input,
|
|
278
336
|
result,
|
|
@@ -400,14 +458,49 @@ function renderLayer(m, depth, base) {
|
|
|
400
458
|
});
|
|
401
459
|
});
|
|
402
460
|
};
|
|
461
|
+
let readsLocation;
|
|
403
462
|
const [resource, { refetch }] = createResource3(() => {
|
|
404
|
-
const
|
|
463
|
+
const params = untrack2(base.params);
|
|
464
|
+
const location = untrack2(base.location);
|
|
465
|
+
readsLocation = false;
|
|
466
|
+
const result = loader(
|
|
467
|
+
{
|
|
468
|
+
params: () => params,
|
|
469
|
+
location: () => {
|
|
470
|
+
readsLocation = true;
|
|
471
|
+
return location;
|
|
472
|
+
}
|
|
473
|
+
},
|
|
474
|
+
owner,
|
|
475
|
+
() => cancelled,
|
|
476
|
+
trackDeps
|
|
477
|
+
);
|
|
405
478
|
return router ? router.trackLoad(result) : result;
|
|
406
479
|
});
|
|
407
|
-
onCleanup(
|
|
480
|
+
onCleanup(
|
|
481
|
+
onRevalidate(() => {
|
|
482
|
+
if (untrack2(() => base.matched()[depth]?.route) !== m.route) return;
|
|
483
|
+
void refetch();
|
|
484
|
+
})
|
|
485
|
+
);
|
|
486
|
+
let loadedFor = untrack2(() => JSON.stringify(base.matched()[depth]?.params ?? {}));
|
|
487
|
+
let searchedFor = untrack2(() => base.location().search);
|
|
488
|
+
createEffect(() => {
|
|
489
|
+
const now = base.matched()[depth];
|
|
490
|
+
const search = base.location().search;
|
|
491
|
+
if (now?.route !== m.route) return;
|
|
492
|
+
const params = JSON.stringify(now.params ?? {});
|
|
493
|
+
const paramsMoved = params !== loadedFor;
|
|
494
|
+
const searchMoved = readsLocation !== false && search !== searchedFor;
|
|
495
|
+
loadedFor = params;
|
|
496
|
+
searchedFor = search;
|
|
497
|
+
if (paramsMoved || searchMoved) untrack2(() => void refetch());
|
|
498
|
+
});
|
|
408
499
|
data = () => {
|
|
409
500
|
const error = resource.error;
|
|
410
501
|
if (error !== void 0 && error !== null) throw error;
|
|
502
|
+
const r = resource;
|
|
503
|
+
if (r.state === "refreshing") return r.latest;
|
|
411
504
|
return resource();
|
|
412
505
|
};
|
|
413
506
|
Object.defineProperty(data, "loading", { get: () => resource.loading });
|
|
@@ -512,16 +605,19 @@ function buildDefaultNotFound() {
|
|
|
512
605
|
}
|
|
513
606
|
var pendingTransitionMode;
|
|
514
607
|
function Router(props) {
|
|
515
|
-
const
|
|
608
|
+
const history2 = props.history ?? createBrowserHistory();
|
|
516
609
|
const router = createCoreRouter({
|
|
517
610
|
routes: props.routes,
|
|
518
611
|
base: props.base,
|
|
519
|
-
history
|
|
612
|
+
history: history2
|
|
520
613
|
});
|
|
521
614
|
const [state, setState] = createSignal2(router.state());
|
|
522
615
|
const [navigating, setNavigating] = createSignal2(false);
|
|
523
616
|
const [loads, setLoads] = createSignal2(0);
|
|
524
617
|
let navigationId = 0;
|
|
618
|
+
const scroll = history2.window ? keepScroll(router.state().location) : void 0;
|
|
619
|
+
let arriving = scroll ? { id: 0, location: router.state().location, from: void 0 } : null;
|
|
620
|
+
const [arrived, setArrived] = createSignal2(0);
|
|
525
621
|
const takeMode = () => {
|
|
526
622
|
const mode = pendingTransitionMode ?? (props.transition ?? "auto");
|
|
527
623
|
pendingTransitionMode = void 0;
|
|
@@ -531,6 +627,10 @@ function Router(props) {
|
|
|
531
627
|
const id = ++navigationId;
|
|
532
628
|
const mode = takeMode();
|
|
533
629
|
setNavigating(true);
|
|
630
|
+
if (scroll) {
|
|
631
|
+
scroll.leave();
|
|
632
|
+
arriving = { id, location: next.location, from: untrack2(state).location };
|
|
633
|
+
}
|
|
534
634
|
const prepared = prepareComponents(
|
|
535
635
|
(next.match?.matched ?? []).map((m) => m.component).filter(Boolean)
|
|
536
636
|
);
|
|
@@ -538,6 +638,7 @@ function Router(props) {
|
|
|
538
638
|
setState(next);
|
|
539
639
|
const flushed = flush();
|
|
540
640
|
if (id === navigationId) setNavigating(false);
|
|
641
|
+
if (scroll) setArrived(id);
|
|
541
642
|
return flushed;
|
|
542
643
|
};
|
|
543
644
|
if (!prepared) {
|
|
@@ -551,6 +652,7 @@ function Router(props) {
|
|
|
551
652
|
});
|
|
552
653
|
onCleanup(() => {
|
|
553
654
|
unsub();
|
|
655
|
+
scroll?.dispose();
|
|
554
656
|
router.destroy();
|
|
555
657
|
navigationId++;
|
|
556
658
|
});
|
|
@@ -573,6 +675,19 @@ function Router(props) {
|
|
|
573
675
|
return result;
|
|
574
676
|
}
|
|
575
677
|
};
|
|
678
|
+
if (scroll) {
|
|
679
|
+
const nextFrame = typeof requestAnimationFrame === "function" ? requestAnimationFrame : (fn) => setTimeout(fn, 0);
|
|
680
|
+
createEffect(() => {
|
|
681
|
+
const id = arrived();
|
|
682
|
+
if (ctx.isRouting()) return;
|
|
683
|
+
const next = arriving;
|
|
684
|
+
if (!next || next.id !== id || id !== navigationId) return;
|
|
685
|
+
arriving = null;
|
|
686
|
+
nextFrame(() => {
|
|
687
|
+
if (id === navigationId) scroll.arrive(next.location, next.from);
|
|
688
|
+
});
|
|
689
|
+
});
|
|
690
|
+
}
|
|
576
691
|
const root = {
|
|
577
692
|
depth: -1,
|
|
578
693
|
matched,
|
|
@@ -788,7 +903,7 @@ function Link(props) {
|
|
|
788
903
|
return a;
|
|
789
904
|
}
|
|
790
905
|
var A = Link;
|
|
791
|
-
function
|
|
906
|
+
function ActionForm(props) {
|
|
792
907
|
const action2 = props.action;
|
|
793
908
|
const cls = props.className ?? props.class;
|
|
794
909
|
const url = action2.url ?? "";
|
|
@@ -862,7 +977,7 @@ export {
|
|
|
862
977
|
useRouteData,
|
|
863
978
|
Link,
|
|
864
979
|
A,
|
|
865
|
-
|
|
980
|
+
ActionForm,
|
|
866
981
|
preloadRoutes,
|
|
867
982
|
createMemoryHistory,
|
|
868
983
|
createBrowserHistory2 as createBrowserHistory,
|
package/dist/src/cdn/core.cjs
CHANGED
|
@@ -184,6 +184,68 @@ var init_transition = __esm({
|
|
|
184
184
|
}
|
|
185
185
|
});
|
|
186
186
|
|
|
187
|
+
// src/lib/router/scroll.ts
|
|
188
|
+
function keepScroll(initial) {
|
|
189
|
+
const read2 = () => {
|
|
190
|
+
try {
|
|
191
|
+
return JSON.parse(sessionStorage.getItem(STORE) ?? "{}");
|
|
192
|
+
} catch {
|
|
193
|
+
return {};
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
const positions = read2();
|
|
197
|
+
const write = () => {
|
|
198
|
+
const keys = Object.keys(positions);
|
|
199
|
+
for (const key of keys.slice(0, Math.max(0, keys.length - KEEP))) delete positions[key];
|
|
200
|
+
try {
|
|
201
|
+
sessionStorage.setItem(STORE, JSON.stringify(positions));
|
|
202
|
+
} catch {
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
let current = initial.key;
|
|
206
|
+
const save = () => {
|
|
207
|
+
if (current === void 0) return;
|
|
208
|
+
delete positions[current];
|
|
209
|
+
positions[current] = window.scrollY;
|
|
210
|
+
write();
|
|
211
|
+
};
|
|
212
|
+
const restoration = history.scrollRestoration;
|
|
213
|
+
history.scrollRestoration = "manual";
|
|
214
|
+
window.addEventListener("pagehide", save);
|
|
215
|
+
const to = (top) => window.scrollTo({ top, left: 0, behavior: "instant" });
|
|
216
|
+
const toHash = (hash) => {
|
|
217
|
+
if (!hash || hash === "#") return false;
|
|
218
|
+
const target = document.getElementById(decodeURIComponent(hash.slice(1)));
|
|
219
|
+
target?.scrollIntoView({ behavior: "instant" });
|
|
220
|
+
return target !== null;
|
|
221
|
+
};
|
|
222
|
+
return {
|
|
223
|
+
leave: save,
|
|
224
|
+
arrive(location, from) {
|
|
225
|
+
current = location.key;
|
|
226
|
+
if (location.action === "pop" || from === void 0) {
|
|
227
|
+
const y = location.key === void 0 ? void 0 : positions[location.key];
|
|
228
|
+
if (y !== void 0) to(y);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (location.action === "replace" && location.pathname === from.pathname) return;
|
|
232
|
+
if (!toHash(location.hash)) to(0);
|
|
233
|
+
},
|
|
234
|
+
dispose() {
|
|
235
|
+
window.removeEventListener("pagehide", save);
|
|
236
|
+
history.scrollRestoration = restoration;
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
var STORE, KEEP;
|
|
241
|
+
var init_scroll = __esm({
|
|
242
|
+
"src/lib/router/scroll.ts"() {
|
|
243
|
+
"use strict";
|
|
244
|
+
STORE = "fx:scroll";
|
|
245
|
+
KEEP = 100;
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
|
|
187
249
|
// src/lib/router/data.ts
|
|
188
250
|
function onRevalidate(listener) {
|
|
189
251
|
revalidationListeners.add(listener);
|
|
@@ -255,7 +317,8 @@ function getSubmissionsSignal(url) {
|
|
|
255
317
|
}
|
|
256
318
|
function action(fn, name, options = {}) {
|
|
257
319
|
const actionUrl = name || fn.name || "action";
|
|
258
|
-
const submit = async (
|
|
320
|
+
const submit = async (...args) => {
|
|
321
|
+
const input = args.length > 1 ? args : args[0];
|
|
259
322
|
const [, setSubmission] = getSubmissionSignal(actionUrl);
|
|
260
323
|
const [, setSubmissions] = getSubmissionsSignal(actionUrl);
|
|
261
324
|
let entry;
|
|
@@ -270,11 +333,10 @@ function action(fn, name, options = {}) {
|
|
|
270
333
|
};
|
|
271
334
|
const retry = () => {
|
|
272
335
|
drop2();
|
|
273
|
-
return submit(
|
|
336
|
+
return submit(...args);
|
|
274
337
|
};
|
|
275
338
|
entry = {
|
|
276
339
|
input,
|
|
277
|
-
// Approximate type for tracking
|
|
278
340
|
pending: true,
|
|
279
341
|
clear,
|
|
280
342
|
retry
|
|
@@ -282,7 +344,7 @@ function action(fn, name, options = {}) {
|
|
|
282
344
|
setSubmission(entry);
|
|
283
345
|
setSubmissions((list) => [...list, entry]);
|
|
284
346
|
try {
|
|
285
|
-
const result = await fn(
|
|
347
|
+
const result = await fn(...args);
|
|
286
348
|
setSubmission({
|
|
287
349
|
input,
|
|
288
350
|
result,
|
|
@@ -356,7 +418,7 @@ var init_data = __esm({
|
|
|
356
418
|
var router_exports = {};
|
|
357
419
|
__export(router_exports, {
|
|
358
420
|
A: () => A,
|
|
359
|
-
|
|
421
|
+
ActionForm: () => ActionForm,
|
|
360
422
|
Link: () => Link,
|
|
361
423
|
Outlet: () => Outlet,
|
|
362
424
|
Redirect: () => Redirect,
|
|
@@ -414,14 +476,49 @@ function renderLayer(m, depth, base) {
|
|
|
414
476
|
});
|
|
415
477
|
});
|
|
416
478
|
};
|
|
479
|
+
let readsLocation;
|
|
417
480
|
const [resource, { refetch }] = (0, import_signal14.createResource)(() => {
|
|
418
|
-
const
|
|
481
|
+
const params = (0, import_signal14.untrack)(base.params);
|
|
482
|
+
const location = (0, import_signal14.untrack)(base.location);
|
|
483
|
+
readsLocation = false;
|
|
484
|
+
const result = loader(
|
|
485
|
+
{
|
|
486
|
+
params: () => params,
|
|
487
|
+
location: () => {
|
|
488
|
+
readsLocation = true;
|
|
489
|
+
return location;
|
|
490
|
+
}
|
|
491
|
+
},
|
|
492
|
+
owner,
|
|
493
|
+
() => cancelled,
|
|
494
|
+
trackDeps
|
|
495
|
+
);
|
|
419
496
|
return router ? router.trackLoad(result) : result;
|
|
420
497
|
});
|
|
421
|
-
(0, import_signal14.onCleanup)(
|
|
498
|
+
(0, import_signal14.onCleanup)(
|
|
499
|
+
onRevalidate(() => {
|
|
500
|
+
if ((0, import_signal14.untrack)(() => base.matched()[depth]?.route) !== m.route) return;
|
|
501
|
+
void refetch();
|
|
502
|
+
})
|
|
503
|
+
);
|
|
504
|
+
let loadedFor = (0, import_signal14.untrack)(() => JSON.stringify(base.matched()[depth]?.params ?? {}));
|
|
505
|
+
let searchedFor = (0, import_signal14.untrack)(() => base.location().search);
|
|
506
|
+
(0, import_signal14.createEffect)(() => {
|
|
507
|
+
const now = base.matched()[depth];
|
|
508
|
+
const search = base.location().search;
|
|
509
|
+
if (now?.route !== m.route) return;
|
|
510
|
+
const params = JSON.stringify(now.params ?? {});
|
|
511
|
+
const paramsMoved = params !== loadedFor;
|
|
512
|
+
const searchMoved = readsLocation !== false && search !== searchedFor;
|
|
513
|
+
loadedFor = params;
|
|
514
|
+
searchedFor = search;
|
|
515
|
+
if (paramsMoved || searchMoved) (0, import_signal14.untrack)(() => void refetch());
|
|
516
|
+
});
|
|
422
517
|
data = () => {
|
|
423
518
|
const error = resource.error;
|
|
424
519
|
if (error !== void 0 && error !== null) throw error;
|
|
520
|
+
const r = resource;
|
|
521
|
+
if (r.state === "refreshing") return r.latest;
|
|
425
522
|
return resource();
|
|
426
523
|
};
|
|
427
524
|
Object.defineProperty(data, "loading", { get: () => resource.loading });
|
|
@@ -525,16 +622,19 @@ function buildDefaultNotFound() {
|
|
|
525
622
|
return el;
|
|
526
623
|
}
|
|
527
624
|
function Router(props) {
|
|
528
|
-
const
|
|
625
|
+
const history2 = props.history ?? (0, import_router.createBrowserHistory)();
|
|
529
626
|
const router = (0, import_router.createRouter)({
|
|
530
627
|
routes: props.routes,
|
|
531
628
|
base: props.base,
|
|
532
|
-
history
|
|
629
|
+
history: history2
|
|
533
630
|
});
|
|
534
631
|
const [state, setState] = (0, import_signal14.createSignal)(router.state());
|
|
535
632
|
const [navigating, setNavigating] = (0, import_signal14.createSignal)(false);
|
|
536
633
|
const [loads, setLoads] = (0, import_signal14.createSignal)(0);
|
|
537
634
|
let navigationId = 0;
|
|
635
|
+
const scroll = history2.window ? keepScroll(router.state().location) : void 0;
|
|
636
|
+
let arriving = scroll ? { id: 0, location: router.state().location, from: void 0 } : null;
|
|
637
|
+
const [arrived, setArrived] = (0, import_signal14.createSignal)(0);
|
|
538
638
|
const takeMode = () => {
|
|
539
639
|
const mode = pendingTransitionMode ?? (props.transition ?? "auto");
|
|
540
640
|
pendingTransitionMode = void 0;
|
|
@@ -544,6 +644,10 @@ function Router(props) {
|
|
|
544
644
|
const id = ++navigationId;
|
|
545
645
|
const mode = takeMode();
|
|
546
646
|
setNavigating(true);
|
|
647
|
+
if (scroll) {
|
|
648
|
+
scroll.leave();
|
|
649
|
+
arriving = { id, location: next.location, from: (0, import_signal14.untrack)(state).location };
|
|
650
|
+
}
|
|
547
651
|
const prepared = prepareComponents(
|
|
548
652
|
(next.match?.matched ?? []).map((m) => m.component).filter(Boolean)
|
|
549
653
|
);
|
|
@@ -551,6 +655,7 @@ function Router(props) {
|
|
|
551
655
|
setState(next);
|
|
552
656
|
const flushed = (0, import_signal14.flush)();
|
|
553
657
|
if (id === navigationId) setNavigating(false);
|
|
658
|
+
if (scroll) setArrived(id);
|
|
554
659
|
return flushed;
|
|
555
660
|
};
|
|
556
661
|
if (!prepared) {
|
|
@@ -564,6 +669,7 @@ function Router(props) {
|
|
|
564
669
|
});
|
|
565
670
|
(0, import_signal14.onCleanup)(() => {
|
|
566
671
|
unsub();
|
|
672
|
+
scroll?.dispose();
|
|
567
673
|
router.destroy();
|
|
568
674
|
navigationId++;
|
|
569
675
|
});
|
|
@@ -586,6 +692,19 @@ function Router(props) {
|
|
|
586
692
|
return result;
|
|
587
693
|
}
|
|
588
694
|
};
|
|
695
|
+
if (scroll) {
|
|
696
|
+
const nextFrame = typeof requestAnimationFrame === "function" ? requestAnimationFrame : (fn) => setTimeout(fn, 0);
|
|
697
|
+
(0, import_signal14.createEffect)(() => {
|
|
698
|
+
const id = arrived();
|
|
699
|
+
if (ctx.isRouting()) return;
|
|
700
|
+
const next = arriving;
|
|
701
|
+
if (!next || next.id !== id || id !== navigationId) return;
|
|
702
|
+
arriving = null;
|
|
703
|
+
nextFrame(() => {
|
|
704
|
+
if (id === navigationId) scroll.arrive(next.location, next.from);
|
|
705
|
+
});
|
|
706
|
+
});
|
|
707
|
+
}
|
|
589
708
|
const root = {
|
|
590
709
|
depth: -1,
|
|
591
710
|
matched,
|
|
@@ -781,7 +900,7 @@ function Link(props) {
|
|
|
781
900
|
if (linkChildren != null) (0, import_dom16.insert)(a, linkChildren);
|
|
782
901
|
return a;
|
|
783
902
|
}
|
|
784
|
-
function
|
|
903
|
+
function ActionForm(props) {
|
|
785
904
|
const action2 = props.action;
|
|
786
905
|
const cls = props.className ?? props.class;
|
|
787
906
|
const url = action2.url ?? "";
|
|
@@ -829,6 +948,7 @@ var init_router = __esm({
|
|
|
829
948
|
import_signal15 = require("@fluixi/reactive/signal");
|
|
830
949
|
import_object = require("@fluixi/utils/object");
|
|
831
950
|
import_compare = require("@fluixi/utils/compare");
|
|
951
|
+
init_scroll();
|
|
832
952
|
import_router = require("@fluixi/router");
|
|
833
953
|
init_data();
|
|
834
954
|
import_router2 = require("@fluixi/router");
|
|
@@ -976,7 +1096,7 @@ var import_signal6 = require("@fluixi/reactive/signal");
|
|
|
976
1096
|
var import_dom = require("@fluixi/dom");
|
|
977
1097
|
|
|
978
1098
|
// src/version.generated.ts
|
|
979
|
-
var VERSION = "1.0.0-alpha.
|
|
1099
|
+
var VERSION = "1.0.0-alpha.96";
|
|
980
1100
|
|
|
981
1101
|
// src/lib/render/versions.ts
|
|
982
1102
|
var import_dom2 = require("@fluixi/dom");
|
|
@@ -1432,7 +1552,7 @@ async function startClient(App, options = {}) {
|
|
|
1432
1552
|
}
|
|
1433
1553
|
deserializeHydrationData();
|
|
1434
1554
|
setHydrating(true);
|
|
1435
|
-
(0, import_dom17.hydrate)(rootOf(App), container);
|
|
1555
|
+
(0, import_dom17.hydrate)(() => rootOf(App), container);
|
|
1436
1556
|
replayEvents();
|
|
1437
1557
|
} finally {
|
|
1438
1558
|
(0, import_dom17.endAppHydration)();
|
package/dist/src/cdn/core.mjs
CHANGED
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
useParams,
|
|
21
21
|
useRouter,
|
|
22
22
|
useSearchParams
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-RKBFEFZP.mjs";
|
|
24
24
|
|
|
25
25
|
// src/lib/index.ts
|
|
26
26
|
import {
|
|
@@ -54,7 +54,7 @@ import { createRoot as createRoot2 } from "@fluixi/reactive/signal";
|
|
|
54
54
|
import { registerCoreVersion } from "@fluixi/dom";
|
|
55
55
|
|
|
56
56
|
// src/version.generated.ts
|
|
57
|
-
var VERSION = "1.0.0-alpha.
|
|
57
|
+
var VERSION = "1.0.0-alpha.96";
|
|
58
58
|
|
|
59
59
|
// src/lib/render/versions.ts
|
|
60
60
|
import { stampVersions, warnOnVersionSkew, versions } from "@fluixi/dom";
|
|
@@ -574,12 +574,12 @@ async function startClient(App, options = {}) {
|
|
|
574
574
|
beginAppHydration();
|
|
575
575
|
try {
|
|
576
576
|
if (options.routes && options.routes.length) {
|
|
577
|
-
const { preloadRoutes } = await import("./router-
|
|
577
|
+
const { preloadRoutes } = await import("./router-V2THK27H.mjs");
|
|
578
578
|
await preloadRoutes(options.routes, window.location.pathname);
|
|
579
579
|
}
|
|
580
580
|
deserializeHydrationData();
|
|
581
581
|
setHydrating(true);
|
|
582
|
-
domHydrate(rootOf(App), container);
|
|
582
|
+
domHydrate(() => rootOf(App), container);
|
|
583
583
|
replayEvents();
|
|
584
584
|
} finally {
|
|
585
585
|
endAppHydration();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
A,
|
|
3
|
-
|
|
3
|
+
ActionForm,
|
|
4
4
|
Link,
|
|
5
5
|
Outlet,
|
|
6
6
|
Redirect,
|
|
@@ -34,10 +34,10 @@ import {
|
|
|
34
34
|
useSearchParams,
|
|
35
35
|
useSubmission,
|
|
36
36
|
useSubmissions
|
|
37
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-RKBFEFZP.mjs";
|
|
38
38
|
export {
|
|
39
39
|
A,
|
|
40
|
-
|
|
40
|
+
ActionForm,
|
|
41
41
|
Link,
|
|
42
42
|
Outlet,
|
|
43
43
|
Redirect,
|