@omerdlw/base-framework 2.0.1 → 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.
Files changed (94) hide show
  1. package/README.md +4 -1
  2. package/dist/{chunk-XASQT4CQ.js → chunk-66EYJBIP.js} +47 -27
  3. package/dist/chunk-66EYJBIP.js.map +1 -0
  4. package/dist/{chunk-SKBITB5X.js → chunk-CYU6SGAL.js} +3 -3
  5. package/dist/{chunk-SKBITB5X.js.map → chunk-CYU6SGAL.js.map} +1 -1
  6. package/dist/{chunk-6SG7V77J.js → chunk-HHWRTQKQ.js} +100 -67
  7. package/dist/chunk-HHWRTQKQ.js.map +1 -0
  8. package/dist/chunk-HLL5EHXC.js +485 -0
  9. package/dist/chunk-HLL5EHXC.js.map +1 -0
  10. package/dist/{chunk-A5RE3F6O.js → chunk-JIXBFFRD.js} +193 -357
  11. package/dist/chunk-JIXBFFRD.js.map +1 -0
  12. package/dist/{chunk-6ZJVLUBE.js → chunk-M57SNWXK.js} +8 -6
  13. package/dist/chunk-M57SNWXK.js.map +1 -0
  14. package/dist/chunk-RIOKLMYM.js +145 -0
  15. package/dist/chunk-RIOKLMYM.js.map +1 -0
  16. package/dist/{chunk-QXR55VVS.js → chunk-TG6NMHXI.js} +241 -162
  17. package/dist/chunk-TG6NMHXI.js.map +1 -0
  18. package/dist/index.js +7 -5
  19. package/dist/modules/ambient/analyze.d.ts +18 -3
  20. package/dist/modules/ambient/analyze.d.ts.map +1 -1
  21. package/dist/modules/ambient/dom.d.ts +14 -1
  22. package/dist/modules/ambient/dom.d.ts.map +1 -1
  23. package/dist/modules/ambient/hooks.d.ts.map +1 -1
  24. package/dist/modules/ambient/index.d.ts +2 -2
  25. package/dist/modules/ambient/index.d.ts.map +1 -1
  26. package/dist/modules/ambient/index.js +1 -1
  27. package/dist/modules/ambient/server/index.d.ts +1 -1
  28. package/dist/modules/ambient/server/index.d.ts.map +1 -1
  29. package/dist/modules/ambient/server/index.js +2 -2
  30. package/dist/modules/ambient/server/index.js.map +1 -1
  31. package/dist/modules/ambient/settings.d.ts +1 -0
  32. package/dist/modules/ambient/settings.d.ts.map +1 -1
  33. package/dist/modules/ambient/types.d.ts +13 -0
  34. package/dist/modules/ambient/types.d.ts.map +1 -1
  35. package/dist/modules/ambient/worker/index.js +1 -1
  36. package/dist/modules/context-menu/index.js +4 -3
  37. package/dist/modules/dock/cards.d.ts.map +1 -1
  38. package/dist/modules/dock/constants.d.ts +1 -20
  39. package/dist/modules/dock/constants.d.ts.map +1 -1
  40. package/dist/modules/dock/index.js +3 -2
  41. package/dist/modules/dock/routing/guards.d.ts +1 -1
  42. package/dist/modules/dock/routing/navigation.d.ts +7 -4
  43. package/dist/modules/dock/routing/navigation.d.ts.map +1 -1
  44. package/dist/modules/dock/runtime/display.d.ts +31 -2
  45. package/dist/modules/dock/runtime/display.d.ts.map +1 -1
  46. package/dist/modules/dock/runtime/dock.d.ts +2 -2
  47. package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
  48. package/dist/modules/dock/types.d.ts +5 -27
  49. package/dist/modules/dock/types.d.ts.map +1 -1
  50. package/dist/modules/index.d.ts +3 -2
  51. package/dist/modules/index.d.ts.map +1 -1
  52. package/dist/modules/index.js +7 -5
  53. package/dist/modules/loading/context.d.ts.map +1 -1
  54. package/dist/modules/loading/index.js +1 -1
  55. package/dist/modules/navigation/constants.d.ts +37 -0
  56. package/dist/modules/navigation/constants.d.ts.map +1 -0
  57. package/dist/modules/navigation/context.d.ts +10 -0
  58. package/dist/modules/navigation/context.d.ts.map +1 -0
  59. package/dist/modules/navigation/hooks.d.ts +29 -0
  60. package/dist/modules/navigation/hooks.d.ts.map +1 -0
  61. package/dist/modules/navigation/index.d.ts +10 -0
  62. package/dist/modules/navigation/index.d.ts.map +1 -0
  63. package/dist/modules/navigation/index.js +81 -0
  64. package/dist/modules/navigation/index.js.map +1 -0
  65. package/dist/modules/navigation/listeners.d.ts +15 -0
  66. package/dist/modules/navigation/listeners.d.ts.map +1 -0
  67. package/dist/modules/navigation/module.d.ts +25 -0
  68. package/dist/modules/navigation/module.d.ts.map +1 -0
  69. package/dist/modules/navigation/navigator.d.ts +8 -0
  70. package/dist/modules/navigation/navigator.d.ts.map +1 -0
  71. package/dist/modules/navigation/settings.d.ts +10 -0
  72. package/dist/modules/navigation/settings.d.ts.map +1 -0
  73. package/dist/modules/navigation/state.d.ts +20 -0
  74. package/dist/modules/navigation/state.d.ts.map +1 -0
  75. package/dist/modules/navigation/types.d.ts +168 -0
  76. package/dist/modules/navigation/types.d.ts.map +1 -0
  77. package/dist/modules/navigation/utils.d.ts +11 -0
  78. package/dist/modules/navigation/utils.d.ts.map +1 -0
  79. package/docs/getting-started.md +2 -0
  80. package/docs/modules/README.md +5 -1
  81. package/docs/modules/ambient.md +9 -6
  82. package/docs/modules/dock.md +12 -10
  83. package/docs/modules/loading.md +2 -2
  84. package/docs/modules/navigation.md +216 -0
  85. package/docs/proposals/navigation.md +209 -0
  86. package/package.json +6 -1
  87. package/templates/AGENTS.md +2 -0
  88. package/dist/chunk-6SG7V77J.js.map +0 -1
  89. package/dist/chunk-6ZJVLUBE.js.map +0 -1
  90. package/dist/chunk-A5RE3F6O.js.map +0 -1
  91. package/dist/chunk-QXR55VVS.js.map +0 -1
  92. package/dist/chunk-XASQT4CQ.js.map +0 -1
  93. package/dist/modules/dock/routing/transactions.d.ts +0 -21
  94. 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-QXR55VVS.js';
3
+ import { ambientModule } from './chunk-TG6NMHXI.js';
3
4
  import { backgroundModule } from './chunk-CGHZSSFR.js';
4
- import { contextMenuModule } from './chunk-SKBITB5X.js';
5
- import { dockModule } from './chunk-A5RE3F6O.js';
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-XASQT4CQ.js';
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-6ZJVLUBE.js.map
26
- //# sourceMappingURL=chunk-6ZJVLUBE.js.map
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"]}