@omerdlw/base-framework 2.0.0 → 3.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 +4 -1
- package/dist/{chunk-XASQT4CQ.js → chunk-66EYJBIP.js} +47 -27
- package/dist/chunk-66EYJBIP.js.map +1 -0
- package/dist/{chunk-65ZB4QTQ.js → chunk-CYU6SGAL.js} +3 -3
- package/dist/{chunk-65ZB4QTQ.js.map → chunk-CYU6SGAL.js.map} +1 -1
- package/dist/{chunk-6SG7V77J.js → chunk-HHWRTQKQ.js} +100 -67
- package/dist/chunk-HHWRTQKQ.js.map +1 -0
- package/dist/chunk-HLL5EHXC.js +485 -0
- package/dist/chunk-HLL5EHXC.js.map +1 -0
- package/dist/{chunk-3MSK4XGK.js → chunk-JIXBFFRD.js} +258 -405
- package/dist/chunk-JIXBFFRD.js.map +1 -0
- package/dist/{chunk-KKQT46TP.js → chunk-M57SNWXK.js} +8 -6
- package/dist/chunk-M57SNWXK.js.map +1 -0
- package/dist/chunk-RIOKLMYM.js +145 -0
- package/dist/chunk-RIOKLMYM.js.map +1 -0
- package/dist/{chunk-QXR55VVS.js → chunk-TG6NMHXI.js} +241 -162
- package/dist/chunk-TG6NMHXI.js.map +1 -0
- package/dist/index.js +7 -5
- package/dist/modules/ambient/analyze.d.ts +18 -3
- package/dist/modules/ambient/analyze.d.ts.map +1 -1
- package/dist/modules/ambient/dom.d.ts +14 -1
- package/dist/modules/ambient/dom.d.ts.map +1 -1
- package/dist/modules/ambient/hooks.d.ts.map +1 -1
- package/dist/modules/ambient/index.d.ts +2 -2
- package/dist/modules/ambient/index.d.ts.map +1 -1
- package/dist/modules/ambient/index.js +1 -1
- package/dist/modules/ambient/server/index.d.ts +1 -1
- package/dist/modules/ambient/server/index.d.ts.map +1 -1
- package/dist/modules/ambient/server/index.js +2 -2
- package/dist/modules/ambient/server/index.js.map +1 -1
- package/dist/modules/ambient/settings.d.ts +1 -0
- package/dist/modules/ambient/settings.d.ts.map +1 -1
- package/dist/modules/ambient/types.d.ts +13 -0
- package/dist/modules/ambient/types.d.ts.map +1 -1
- package/dist/modules/ambient/worker/index.js +1 -1
- package/dist/modules/context-menu/index.js +4 -3
- package/dist/modules/dock/cards.d.ts +3 -0
- package/dist/modules/dock/cards.d.ts.map +1 -1
- package/dist/modules/dock/constants.d.ts +1 -20
- package/dist/modules/dock/constants.d.ts.map +1 -1
- package/dist/modules/dock/index.js +3 -2
- package/dist/modules/dock/layout.d.ts.map +1 -1
- package/dist/modules/dock/motion.d.ts +6 -0
- package/dist/modules/dock/motion.d.ts.map +1 -1
- package/dist/modules/dock/overlay.d.ts +1 -1
- package/dist/modules/dock/overlay.d.ts.map +1 -1
- package/dist/modules/dock/routing/guards.d.ts +1 -1
- package/dist/modules/dock/routing/navigation.d.ts +7 -4
- package/dist/modules/dock/routing/navigation.d.ts.map +1 -1
- package/dist/modules/dock/runtime/display.d.ts +31 -2
- package/dist/modules/dock/runtime/display.d.ts.map +1 -1
- package/dist/modules/dock/runtime/dock.d.ts +2 -2
- package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
- package/dist/modules/dock/surface/view-model.d.ts.map +1 -1
- package/dist/modules/dock/types.d.ts +9 -27
- package/dist/modules/dock/types.d.ts.map +1 -1
- package/dist/modules/index.d.ts +3 -2
- package/dist/modules/index.d.ts.map +1 -1
- package/dist/modules/index.js +7 -5
- package/dist/modules/loading/context.d.ts.map +1 -1
- package/dist/modules/loading/index.js +1 -1
- package/dist/modules/navigation/constants.d.ts +37 -0
- package/dist/modules/navigation/constants.d.ts.map +1 -0
- package/dist/modules/navigation/context.d.ts +10 -0
- package/dist/modules/navigation/context.d.ts.map +1 -0
- package/dist/modules/navigation/hooks.d.ts +29 -0
- package/dist/modules/navigation/hooks.d.ts.map +1 -0
- package/dist/modules/navigation/index.d.ts +10 -0
- package/dist/modules/navigation/index.d.ts.map +1 -0
- package/dist/modules/navigation/index.js +81 -0
- package/dist/modules/navigation/index.js.map +1 -0
- package/dist/modules/navigation/listeners.d.ts +15 -0
- package/dist/modules/navigation/listeners.d.ts.map +1 -0
- package/dist/modules/navigation/module.d.ts +25 -0
- package/dist/modules/navigation/module.d.ts.map +1 -0
- package/dist/modules/navigation/navigator.d.ts +8 -0
- package/dist/modules/navigation/navigator.d.ts.map +1 -0
- package/dist/modules/navigation/settings.d.ts +10 -0
- package/dist/modules/navigation/settings.d.ts.map +1 -0
- package/dist/modules/navigation/state.d.ts +20 -0
- package/dist/modules/navigation/state.d.ts.map +1 -0
- package/dist/modules/navigation/types.d.ts +168 -0
- package/dist/modules/navigation/types.d.ts.map +1 -0
- package/dist/modules/navigation/utils.d.ts +11 -0
- package/dist/modules/navigation/utils.d.ts.map +1 -0
- package/docs/getting-started.md +2 -0
- package/docs/modules/README.md +5 -1
- package/docs/modules/ambient.md +9 -6
- package/docs/modules/dock.md +13 -11
- package/docs/modules/loading.md +2 -2
- package/docs/modules/navigation.md +216 -0
- package/docs/proposals/navigation.md +209 -0
- package/package.json +6 -1
- package/templates/AGENTS.md +2 -0
- package/dist/chunk-3MSK4XGK.js.map +0 -1
- package/dist/chunk-6SG7V77J.js.map +0 -1
- package/dist/chunk-KKQT46TP.js.map +0 -1
- package/dist/chunk-QXR55VVS.js.map +0 -1
- package/dist/chunk-XASQT4CQ.js.map +0 -1
- package/dist/modules/dock/routing/transactions.d.ts +0 -21
- package/dist/modules/dock/routing/transactions.d.ts.map +0 -1
|
@@ -1,17 +1,19 @@
|
|
|
1
|
+
import { navigationModule } from './chunk-RIOKLMYM.js';
|
|
1
2
|
import { modalModule } from './chunk-FIMPHODX.js';
|
|
2
|
-
import { ambientModule } from './chunk-
|
|
3
|
+
import { ambientModule } from './chunk-TG6NMHXI.js';
|
|
3
4
|
import { backgroundModule } from './chunk-CGHZSSFR.js';
|
|
4
|
-
import { contextMenuModule } from './chunk-
|
|
5
|
-
import { dockModule } from './chunk-
|
|
5
|
+
import { contextMenuModule } from './chunk-CYU6SGAL.js';
|
|
6
|
+
import { dockModule } from './chunk-JIXBFFRD.js';
|
|
6
7
|
import { notificationModule } from './chunk-SYAVGTOX.js';
|
|
7
8
|
import { mediaModule } from './chunk-R2YGFJDJ.js';
|
|
8
9
|
import { controlsModule } from './chunk-4GMQKD6F.js';
|
|
9
|
-
import { loadingModule } from './chunk-
|
|
10
|
+
import { loadingModule } from './chunk-66EYJBIP.js';
|
|
10
11
|
|
|
11
12
|
// src/modules/index.ts
|
|
12
13
|
var defaultModules = Object.freeze([
|
|
13
14
|
backgroundModule,
|
|
14
15
|
ambientModule,
|
|
16
|
+
navigationModule,
|
|
15
17
|
dockModule,
|
|
16
18
|
controlsModule,
|
|
17
19
|
contextMenuModule,
|
|
@@ -22,5 +24,5 @@ var defaultModules = Object.freeze([
|
|
|
22
24
|
]);
|
|
23
25
|
|
|
24
26
|
export { defaultModules };
|
|
25
|
-
//# sourceMappingURL=chunk-
|
|
26
|
-
//# sourceMappingURL=chunk-
|
|
27
|
+
//# sourceMappingURL=chunk-M57SNWXK.js.map
|
|
28
|
+
//# sourceMappingURL=chunk-M57SNWXK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAwBO,IAAM,cAAA,GAAiB,OAAO,MAAA,CAAO;AAAA,EAC1C,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAU","file":"chunk-M57SNWXK.js","sourcesContent":["import { ambientModule } from \"./ambient/module\";\nimport { backgroundModule } from \"./background/module\";\nimport { contextMenuModule } from \"./context-menu/module\";\nimport { controlsModule } from \"./controls/module\";\nimport { dockModule } from \"./dock/module\";\nimport { loadingModule } from \"./loading/module\";\nimport { mediaModule } from \"./media/module\";\nimport { modalModule } from \"./modal/module\";\nimport { navigationModule } from \"./navigation/module\";\nimport { notificationModule } from \"./notification/module\";\n\nexport {\n ambientModule,\n backgroundModule,\n contextMenuModule,\n controlsModule,\n dockModule,\n loadingModule,\n mediaModule,\n modalModule,\n navigationModule,\n notificationModule,\n};\n\nexport const defaultModules = Object.freeze([\n backgroundModule,\n ambientModule,\n navigationModule,\n dockModule,\n controlsModule,\n contextMenuModule,\n loadingModule,\n mediaModule,\n modalModule,\n notificationModule,\n] as const);\n"]}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { createNavigationState, createNavigator, readWindowLocation, NAVIGATION_SOURCE, NAVIGATION_PHASE, isSameLocation, NAVIGATION_REASON, isSamePathname, internalLinkOf, NAVIGATION_PREFETCH_ATTRIBUTE, getNavigationSettings } from './chunk-HLL5EHXC.js';
|
|
2
|
+
import { getOrCreateGlobalContext, defineModule } from './chunk-GF7TUX5I.js';
|
|
3
|
+
import { createStore, useIsomorphicLayoutEffect } from './chunk-TV3WEF5G.js';
|
|
4
|
+
import { useState, useEffect, useMemo } from 'react';
|
|
5
|
+
import { useRouter, usePathname } from 'next/navigation';
|
|
6
|
+
import { jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
// src/modules/navigation/listeners.ts
|
|
9
|
+
function watchIntent(navigator, settings, doc = document) {
|
|
10
|
+
let resting = null;
|
|
11
|
+
const stop = () => {
|
|
12
|
+
if (resting) clearTimeout(resting.timer);
|
|
13
|
+
resting = null;
|
|
14
|
+
};
|
|
15
|
+
const wanted = (target) => {
|
|
16
|
+
const { intent } = settings();
|
|
17
|
+
if (!intent) return null;
|
|
18
|
+
const link = internalLinkOf(target);
|
|
19
|
+
if (!link || link.getAttribute(NAVIGATION_PREFETCH_ATTRIBUTE) === "false")
|
|
20
|
+
return null;
|
|
21
|
+
const href = link.getAttribute("href");
|
|
22
|
+
return intent.match(href) ? href : null;
|
|
23
|
+
};
|
|
24
|
+
const onOver = (event) => {
|
|
25
|
+
const { pointerType } = event;
|
|
26
|
+
if (pointerType && pointerType !== "mouse") return;
|
|
27
|
+
const href = wanted(event.target);
|
|
28
|
+
if (!href) return stop();
|
|
29
|
+
if (resting?.href === href) return;
|
|
30
|
+
stop();
|
|
31
|
+
const { intent } = settings();
|
|
32
|
+
const delay = intent ? Math.max(0, intent.delayMs) : 0;
|
|
33
|
+
resting = {
|
|
34
|
+
href,
|
|
35
|
+
timer: setTimeout(() => {
|
|
36
|
+
resting = null;
|
|
37
|
+
navigator.prefetch(href);
|
|
38
|
+
}, delay)
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
const onNow = (event) => {
|
|
42
|
+
const href = wanted(event.target);
|
|
43
|
+
if (href) navigator.prefetch(href);
|
|
44
|
+
};
|
|
45
|
+
doc.addEventListener("pointerover", onOver, { passive: true });
|
|
46
|
+
doc.addEventListener("pointerdown", onNow, { passive: true });
|
|
47
|
+
doc.addEventListener("focusin", onNow, { passive: true });
|
|
48
|
+
return () => {
|
|
49
|
+
stop();
|
|
50
|
+
doc.removeEventListener("pointerover", onOver);
|
|
51
|
+
doc.removeEventListener("pointerdown", onNow);
|
|
52
|
+
doc.removeEventListener("focusin", onNow);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function watchHistory(navigator, win = window) {
|
|
56
|
+
let replaying = false;
|
|
57
|
+
const onPopState = (event) => {
|
|
58
|
+
if (replaying) return;
|
|
59
|
+
const to = readWindowLocation();
|
|
60
|
+
if (!to) return;
|
|
61
|
+
const { active, location } = navigator.store.getSnapshot();
|
|
62
|
+
if (active?.source === NAVIGATION_SOURCE.HISTORY && active.phase === NAVIGATION_PHASE.LEAVING) {
|
|
63
|
+
if (isSameLocation(to, active.from)) {
|
|
64
|
+
navigator.cancel(NAVIGATION_REASON.RETURNED);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
} else if (isSamePathname(to, location)) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (!navigator.holdsHistory()) {
|
|
71
|
+
navigator.depart(to);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
event.stopImmediatePropagation();
|
|
75
|
+
const { state } = event;
|
|
76
|
+
navigator.depart(to, {
|
|
77
|
+
replay: () => {
|
|
78
|
+
replaying = true;
|
|
79
|
+
try {
|
|
80
|
+
win.dispatchEvent(new PopStateEvent("popstate", { state }));
|
|
81
|
+
} finally {
|
|
82
|
+
replaying = false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
win.addEventListener("popstate", onPopState, { capture: true });
|
|
88
|
+
return () => win.removeEventListener("popstate", onPopState, { capture: true });
|
|
89
|
+
}
|
|
90
|
+
var NavigationContext = getOrCreateGlobalContext(
|
|
91
|
+
"NavigationContext",
|
|
92
|
+
null
|
|
93
|
+
);
|
|
94
|
+
var noop = () => {
|
|
95
|
+
};
|
|
96
|
+
var NOT_HANDLED = Object.freeze({ ok: false, trip: null });
|
|
97
|
+
var INERT_NAVIGATION_ACTIONS = Object.freeze({
|
|
98
|
+
arrival: () => null,
|
|
99
|
+
arrive: noop,
|
|
100
|
+
cancel: () => false,
|
|
101
|
+
depart: () => null,
|
|
102
|
+
hold: () => noop,
|
|
103
|
+
holdsHistory: () => false,
|
|
104
|
+
navigate: async () => NOT_HANDLED,
|
|
105
|
+
onIntent: () => noop,
|
|
106
|
+
prefetch: () => false,
|
|
107
|
+
provide: () => noop,
|
|
108
|
+
setRouter: noop
|
|
109
|
+
});
|
|
110
|
+
var NOOP_NAVIGATION_STORE = createStore(
|
|
111
|
+
createNavigationState()
|
|
112
|
+
);
|
|
113
|
+
function NavigationProvider({ children }) {
|
|
114
|
+
const router = useRouter();
|
|
115
|
+
const pathname = usePathname();
|
|
116
|
+
const [navigator] = useState(() => createNavigator({ router }));
|
|
117
|
+
useIsomorphicLayoutEffect(() => {
|
|
118
|
+
navigator.setRouter(router);
|
|
119
|
+
}, [navigator, router]);
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
navigator.arrive(readWindowLocation() ?? pathname);
|
|
122
|
+
}, [navigator, pathname]);
|
|
123
|
+
useEffect(() => watchHistory(navigator), [navigator]);
|
|
124
|
+
useEffect(
|
|
125
|
+
() => watchIntent(navigator, getNavigationSettings),
|
|
126
|
+
[navigator]
|
|
127
|
+
);
|
|
128
|
+
useEffect(() => () => navigator.dispose(), [navigator]);
|
|
129
|
+
const runtime = useMemo(
|
|
130
|
+
() => ({ actions: navigator, store: navigator.store }),
|
|
131
|
+
[navigator]
|
|
132
|
+
);
|
|
133
|
+
return /* @__PURE__ */ jsx(NavigationContext, { value: runtime, children });
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// src/modules/navigation/module.tsx
|
|
137
|
+
var navigationModule = defineModule({
|
|
138
|
+
id: "navigation",
|
|
139
|
+
context: NavigationContext,
|
|
140
|
+
Provider: NavigationProvider
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
export { INERT_NAVIGATION_ACTIONS, NOOP_NAVIGATION_STORE, NavigationContext, NavigationProvider, navigationModule, watchHistory, watchIntent };
|
|
144
|
+
//# sourceMappingURL=chunk-RIOKLMYM.js.map
|
|
145
|
+
//# sourceMappingURL=chunk-RIOKLMYM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/navigation/listeners.ts","../src/modules/navigation/context.tsx","../src/modules/navigation/module.tsx"],"names":[],"mappings":";;;;;;;;AAaO,SAAS,WAAA,CACd,SAAA,EACA,QAAA,EACA,GAAA,GAAgB,QAAA,EACJ;AACZ,EAAA,IAAI,OAAA,GACF,IAAA;AAEF,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,IAAI,OAAA,EAAS,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AACvC,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,MAAA,KAA8C;AAC5D,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,QAAA,EAAS;AAC5B,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,MAAM,IAAA,GAAO,eAAe,MAAM,CAAA;AAClC,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,YAAA,CAAa,6BAA6B,CAAA,KAAM,OAAA;AAChE,MAAA,OAAO,IAAA;AACT,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACrC,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA,GAAO,IAAA;AAAA,EACrC,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAAiB;AAC/B,IAAA,MAAM,EAAE,aAAY,GAAI,KAAA;AACxB,IAAA,IAAI,WAAA,IAAe,gBAAgB,OAAA,EAAS;AAC5C,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAChC,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,IAAA,EAAK;AACvB,IAAA,IAAI,OAAA,EAAS,SAAS,IAAA,EAAM;AAC5B,IAAA,IAAA,EAAK;AACL,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,QAAA,EAAS;AAC5B,IAAA,MAAM,QAAQ,MAAA,GAAS,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,GAAI,CAAA;AACrD,IAAA,OAAA,GAAU;AAAA,MACR,IAAA;AAAA,MACA,KAAA,EAAO,WAAW,MAAM;AACtB,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,SAAA,CAAU,SAAS,IAAI,CAAA;AAAA,MACzB,GAAG,KAAK;AAAA,KACV;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAiB;AAC9B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAChC,IAAA,IAAI,IAAA,EAAM,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,GAAA,CAAI,iBAAiB,aAAA,EAAe,MAAA,EAAQ,EAAE,OAAA,EAAS,MAAM,CAAA;AAC7D,EAAA,GAAA,CAAI,iBAAiB,aAAA,EAAe,KAAA,EAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AAC5D,EAAA,GAAA,CAAI,iBAAiB,SAAA,EAAW,KAAA,EAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AACxD,EAAA,OAAO,MAAM;AACX,IAAA,IAAA,EAAK;AACL,IAAA,GAAA,CAAI,mBAAA,CAAoB,eAAe,MAAM,CAAA;AAC7C,IAAA,GAAA,CAAI,mBAAA,CAAoB,eAAe,KAAK,CAAA;AAC5C,IAAA,GAAA,CAAI,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,EAC1C,CAAA;AACF;AASO,SAAS,YAAA,CACd,SAAA,EACA,GAAA,GAAc,MAAA,EACF;AACZ,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAyB;AAC3C,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAC9B,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAI,SAAA,CAAU,MAAM,WAAA,EAAY;AAEzD,IAAA,IACE,QAAQ,MAAA,KAAW,iBAAA,CAAkB,WACrC,MAAA,CAAO,KAAA,KAAU,iBAAiB,OAAA,EAClC;AACA,MAAA,IAAI,cAAA,CAAe,EAAA,EAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AAEnC,QAAA,SAAA,CAAU,MAAA,CAAO,kBAAkB,QAAQ,CAAA;AAC3C,QAAA;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,cAAA,CAAe,EAAA,EAAI,QAAQ,CAAA,EAAG;AACvC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,SAAA,CAAU,YAAA,EAAa,EAAG;AAC7B,MAAA,SAAA,CAAU,OAAO,EAAE,CAAA;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,wBAAA,EAAyB;AAC/B,IAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,IAAA,SAAA,CAAU,OAAO,EAAA,EAAI;AAAA,MACnB,QAAQ,MAAM;AACZ,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA,IAAI;AACF,UAAA,GAAA,CAAI,cAAc,IAAI,aAAA,CAAc,YAAY,EAAE,KAAA,EAAO,CAAC,CAAA;AAAA,QAC5D,CAAA,SAAE;AACA,UAAA,SAAA,GAAY,KAAA;AAAA,QACd;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,GAAA,CAAI,iBAAiB,UAAA,EAAY,UAAA,EAAY,EAAE,OAAA,EAAS,MAAM,CAAA;AAC9D,EAAA,OAAO,MAAM,IAAI,mBAAA,CAAoB,UAAA,EAAY,YAAY,EAAE,OAAA,EAAS,MAAM,CAAA;AAChF;ACvGO,IAAM,iBAAA,GACX,wBAAA;AAAA,EACE,mBAAA;AAAA,EACA;AACF;AAEF,IAAM,OAAO,MAAM;AAAC,CAAA;AACpB,IAAM,WAAA,GAAgC,OAAO,MAAA,CAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,MAAM,CAAA;AAGtE,IAAM,wBAAA,GAA8C,OAAO,MAAA,CAAO;AAAA,EACvE,SAAS,MAAM,IAAA;AAAA,EACf,MAAA,EAAQ,IAAA;AAAA,EACR,QAAQ,MAAM,KAAA;AAAA,EACd,QAAQ,MAAM,IAAA;AAAA,EACd,MAAM,MAAM,IAAA;AAAA,EACZ,cAAc,MAAM,KAAA;AAAA,EACpB,UAAU,YAAY,WAAA;AAAA,EACtB,UAAU,MAAM,IAAA;AAAA,EAChB,UAAU,MAAM,KAAA;AAAA,EAChB,SAAS,MAAM,IAAA;AAAA,EACf,SAAA,EAAW;AACb,CAAC;AAEM,IAAM,qBAAA,GAAwB,WAAA;AAAA,EACnC,qBAAA;AACF;AAEO,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAS,EAA6B;AACzE,EAAA,MAAM,SAA2B,SAAA,EAAU;AAC3C,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,CAAC,SAAS,CAAA,GAAI,QAAA,CAAS,MAAM,eAAA,CAAgB,EAAE,MAAA,EAAQ,CAAC,CAAA;AAE9D,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,SAAA,CAAU,UAAU,MAAM,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,SAAA,EAAW,MAAM,CAAC,CAAA;AAEtB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAA,CAAU,MAAA,CAAO,kBAAA,EAAmB,IAAK,QAAQ,CAAA;AAAA,EACnD,CAAA,EAAG,CAAC,SAAA,EAAW,QAAQ,CAAC,CAAA;AAExB,EAAA,SAAA,CAAU,MAAM,YAAA,CAAa,SAAS,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AACpD,EAAA,SAAA;AAAA,IACE,MAAM,WAAA,CAAY,SAAA,EAAW,qBAAqB,CAAA;AAAA,IAClD,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,SAAA,CAAU,MAAM,MAAM,SAAA,CAAU,SAAQ,EAAG,CAAC,SAAS,CAAC,CAAA;AAEtD,EAAA,MAAM,OAAA,GAAU,OAAA;AAAA,IACd,OAAO,EAAE,OAAA,EAAS,SAAA,EAAW,KAAA,EAAO,UAAU,KAAA,EAAM,CAAA;AAAA,IACpD,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,uBAAO,GAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAO,OAAA,EAAU,QAAA,EAAS,CAAA;AACtD;;;ACpEO,IAAM,mBAAmB,YAAA,CAAa;AAAA,EAC3C,EAAA,EAAI,YAAA;AAAA,EACJ,OAAA,EAAS,iBAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAC","file":"chunk-RIOKLMYM.js","sourcesContent":["import { NAVIGATION_PHASE, NAVIGATION_PREFETCH_ATTRIBUTE, NAVIGATION_REASON, NAVIGATION_SOURCE } from \"./constants\";\nimport type { NavigationSettings, Navigator } from \"./types\";\nimport {\n internalLinkOf,\n isSameLocation,\n isSamePathname,\n readWindowLocation,\n} from \"./utils\";\n\n/**\n * Prefetches internal links on intent: after `intent.delayMs` of mouse hover,\n * and at once on pointerdown or focus. Returns the cleanup.\n */\nexport function watchIntent(\n navigator: Pick<Navigator, \"prefetch\">,\n settings: () => NavigationSettings,\n doc: Document = document,\n): () => void {\n let resting: { href: string; timer: ReturnType<typeof setTimeout> } | null =\n null;\n\n const stop = () => {\n if (resting) clearTimeout(resting.timer);\n resting = null;\n };\n\n const wanted = (target: EventTarget | null): string | null => {\n const { intent } = settings();\n if (!intent) return null;\n const link = internalLinkOf(target);\n if (!link || link.getAttribute(NAVIGATION_PREFETCH_ATTRIBUTE) === \"false\")\n return null;\n const href = link.getAttribute(\"href\")!;\n return intent.match(href) ? href : null;\n };\n\n const onOver = (event: Event) => {\n const { pointerType } = event as PointerEvent;\n if (pointerType && pointerType !== \"mouse\") return;\n const href = wanted(event.target);\n if (!href) return stop();\n if (resting?.href === href) return;\n stop();\n const { intent } = settings();\n const delay = intent ? Math.max(0, intent.delayMs) : 0;\n resting = {\n href,\n timer: setTimeout(() => {\n resting = null;\n navigator.prefetch(href);\n }, delay),\n };\n };\n\n const onNow = (event: Event) => {\n const href = wanted(event.target);\n if (href) navigator.prefetch(href);\n };\n\n doc.addEventListener(\"pointerover\", onOver, { passive: true });\n doc.addEventListener(\"pointerdown\", onNow, { passive: true });\n doc.addEventListener(\"focusin\", onNow, { passive: true });\n return () => {\n stop();\n doc.removeEventListener(\"pointerover\", onOver);\n doc.removeEventListener(\"pointerdown\", onNow);\n doc.removeEventListener(\"focusin\", onNow);\n };\n}\n\n/**\n * Turns back/forward steps into trips. While a hold wants history steps, the\n * step is swallowed before the router sees it (a capture listener on\n * `window` runs first), the holds run, and the same `popstate` is replayed\n * for the router. Stepping back to the origin during the hold cancels the\n * trip. Returns the cleanup.\n */\nexport function watchHistory(\n navigator: Pick<Navigator, \"cancel\" | \"depart\" | \"holdsHistory\" | \"store\">,\n win: Window = window,\n): () => void {\n let replaying = false;\n\n const onPopState = (event: PopStateEvent) => {\n if (replaying) return;\n const to = readWindowLocation();\n if (!to) return;\n const { active, location } = navigator.store.getSnapshot();\n\n if (\n active?.source === NAVIGATION_SOURCE.HISTORY &&\n active.phase === NAVIGATION_PHASE.LEAVING\n ) {\n if (isSameLocation(to, active.from)) {\n // Back where the router still is: let it see the step, nothing moves.\n navigator.cancel(NAVIGATION_REASON.RETURNED);\n return;\n }\n } else if (isSamePathname(to, location)) {\n return;\n }\n\n if (!navigator.holdsHistory()) {\n navigator.depart(to);\n return;\n }\n\n event.stopImmediatePropagation();\n const { state } = event;\n navigator.depart(to, {\n replay: () => {\n replaying = true;\n try {\n win.dispatchEvent(new PopStateEvent(\"popstate\", { state }));\n } finally {\n replaying = false;\n }\n },\n });\n };\n\n win.addEventListener(\"popstate\", onPopState, { capture: true });\n return () => win.removeEventListener(\"popstate\", onPopState, { capture: true });\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { usePathname, useRouter } from \"next/navigation\";\nimport { useIsomorphicLayoutEffect } from \"@/hooks\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\nimport { createStore } from \"@/utils\";\nimport { watchHistory, watchIntent } from \"./listeners\";\nimport { createNavigator } from \"./navigator\";\nimport { getNavigationSettings } from \"./settings\";\nimport { createNavigationState } from \"./state\";\nimport type {\n NavigationActions,\n NavigationResult,\n NavigationRouter,\n NavigationRuntime,\n NavigationState,\n} from \"./types\";\nimport { readWindowLocation } from \"./utils\";\n\nexport const NavigationContext =\n getOrCreateGlobalContext<NavigationRuntime | null>(\n \"NavigationContext\",\n null,\n );\n\nconst noop = () => {};\nconst NOT_HANDLED: NavigationResult = Object.freeze({ ok: false, trip: null });\n\n/** What readers get without the module: no trips, nothing held or warmed. */\nexport const INERT_NAVIGATION_ACTIONS: NavigationActions = Object.freeze({\n arrival: () => null,\n arrive: noop,\n cancel: () => false,\n depart: () => null,\n hold: () => noop,\n holdsHistory: () => false,\n navigate: async () => NOT_HANDLED,\n onIntent: () => noop,\n prefetch: () => false,\n provide: () => noop,\n setRouter: noop,\n});\n\nexport const NOOP_NAVIGATION_STORE = createStore<NavigationState>(\n createNavigationState(),\n);\n\nexport function NavigationProvider({ children }: { children?: ReactNode }) {\n const router: NavigationRouter = useRouter();\n const pathname = usePathname();\n const [navigator] = useState(() => createNavigator({ router }));\n\n useIsomorphicLayoutEffect(() => {\n navigator.setRouter(router);\n }, [navigator, router]);\n\n useEffect(() => {\n navigator.arrive(readWindowLocation() ?? pathname);\n }, [navigator, pathname]);\n\n useEffect(() => watchHistory(navigator), [navigator]);\n useEffect(\n () => watchIntent(navigator, getNavigationSettings),\n [navigator],\n );\n useEffect(() => () => navigator.dispose(), [navigator]);\n\n const runtime = useMemo<NavigationRuntime>(\n () => ({ actions: navigator, store: navigator.store }),\n [navigator],\n );\n\n return <NavigationContext value={runtime}>{children}</NavigationContext>;\n}\n","\"use client\";\n\nimport { defineModule } from \"@/kernel\";\nimport { NavigationContext, NavigationProvider } from \"./context\";\nimport type { NavigationTrip } from \"./types\";\n\nexport const navigationModule = defineModule({\n id: \"navigation\",\n context: NavigationContext,\n Provider: NavigationProvider,\n});\n\ninterface NavigationEventPayload {\n from: string;\n source: string;\n timestamp: number;\n to: string;\n trip: NavigationTrip;\n type: string;\n [key: string]: unknown;\n}\n\ndeclare module \"@omerdlw/base-framework/events\" {\n interface FrameworkEventMap {\n NAVIGATION_START: NavigationEventPayload;\n NAVIGATION_COMMIT: NavigationEventPayload;\n NAVIGATION_END: NavigationEventPayload;\n }\n}\n\ndeclare module \"@omerdlw/base-framework/kernel\" {\n interface CoreModules {\n navigation: typeof navigationModule;\n }\n}\n"]}
|