olova 2.0.40 → 2.0.41

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 (156) hide show
  1. package/README.md +305 -12
  2. package/dist/client.d.ts +9 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +8 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/core/config.d.ts +179 -0
  7. package/dist/core/config.d.ts.map +1 -0
  8. package/dist/core/config.js +33 -0
  9. package/dist/core/config.js.map +1 -0
  10. package/dist/core/index.d.ts +8 -0
  11. package/dist/core/index.d.ts.map +1 -0
  12. package/dist/core/index.js +7 -0
  13. package/dist/core/index.js.map +1 -0
  14. package/dist/core/types.d.ts +16 -0
  15. package/dist/core/types.d.ts.map +1 -0
  16. package/dist/core/types.js +2 -0
  17. package/dist/core/types.js.map +1 -0
  18. package/dist/data/hooks.d.ts +5 -0
  19. package/dist/data/hooks.d.ts.map +1 -0
  20. package/dist/data/hooks.js +19 -0
  21. package/dist/data/hooks.js.map +1 -0
  22. package/dist/data/index.d.ts +9 -0
  23. package/dist/data/index.d.ts.map +1 -0
  24. package/dist/data/index.js +9 -0
  25. package/dist/data/index.js.map +1 -0
  26. package/dist/data/provider.d.ts +10 -0
  27. package/dist/data/provider.d.ts.map +1 -0
  28. package/dist/data/provider.js +10 -0
  29. package/dist/data/provider.js.map +1 -0
  30. package/dist/data/serialize.d.ts +10 -0
  31. package/dist/data/serialize.d.ts.map +1 -0
  32. package/dist/data/serialize.js +16 -0
  33. package/dist/data/serialize.js.map +1 -0
  34. package/dist/data/types.d.ts +9 -0
  35. package/dist/data/types.d.ts.map +1 -0
  36. package/dist/data/types.js +2 -0
  37. package/dist/data/types.js.map +1 -0
  38. package/dist/head/Head.d.ts +8 -0
  39. package/dist/head/Head.d.ts.map +1 -0
  40. package/dist/head/Head.js +56 -0
  41. package/dist/head/Head.js.map +1 -0
  42. package/dist/head/HeadProvider.d.ts +31 -0
  43. package/dist/head/HeadProvider.d.ts.map +1 -0
  44. package/dist/head/HeadProvider.js +17 -0
  45. package/dist/head/HeadProvider.js.map +1 -0
  46. package/dist/head/index.d.ts +8 -0
  47. package/dist/head/index.d.ts.map +1 -0
  48. package/dist/head/index.js +8 -0
  49. package/dist/head/index.js.map +1 -0
  50. package/dist/head/ssr.d.ts +9 -0
  51. package/dist/head/ssr.d.ts.map +1 -0
  52. package/dist/head/ssr.js +35 -0
  53. package/dist/head/ssr.js.map +1 -0
  54. package/dist/hydration/context.d.ts +14 -0
  55. package/dist/hydration/context.d.ts.map +1 -0
  56. package/dist/hydration/context.js +20 -0
  57. package/dist/hydration/context.js.map +1 -0
  58. package/dist/hydration/index.d.ts +15 -0
  59. package/dist/hydration/index.d.ts.map +1 -0
  60. package/dist/hydration/index.js +25 -0
  61. package/dist/hydration/index.js.map +1 -0
  62. package/dist/hydration/payload.d.ts +46 -0
  63. package/dist/hydration/payload.d.ts.map +1 -0
  64. package/dist/hydration/payload.js +99 -0
  65. package/dist/hydration/payload.js.map +1 -0
  66. package/dist/hydration/scheduler.d.ts +16 -0
  67. package/dist/hydration/scheduler.d.ts.map +1 -0
  68. package/dist/hydration/scheduler.js +83 -0
  69. package/dist/hydration/scheduler.js.map +1 -0
  70. package/dist/hydration/seo.d.ts +10 -0
  71. package/dist/hydration/seo.d.ts.map +1 -0
  72. package/dist/hydration/seo.js +110 -0
  73. package/dist/hydration/seo.js.map +1 -0
  74. package/dist/hydration/serialization.d.ts +30 -0
  75. package/dist/hydration/serialization.d.ts.map +1 -0
  76. package/dist/hydration/serialization.js +99 -0
  77. package/dist/hydration/serialization.js.map +1 -0
  78. package/dist/hydration/types.d.ts +104 -0
  79. package/dist/hydration/types.d.ts.map +1 -0
  80. package/dist/hydration/types.js +2 -0
  81. package/dist/hydration/types.js.map +1 -0
  82. package/dist/index.d.ts +15 -85
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +17 -0
  85. package/dist/index.js.map +1 -1
  86. package/dist/plugin/cache.d.ts +66 -0
  87. package/dist/plugin/cache.d.ts.map +1 -0
  88. package/dist/plugin/cache.js +129 -0
  89. package/dist/plugin/cache.js.map +1 -0
  90. package/dist/plugin/index.d.ts +8 -0
  91. package/dist/plugin/index.d.ts.map +1 -0
  92. package/dist/plugin/index.js +8 -0
  93. package/dist/plugin/index.js.map +1 -0
  94. package/dist/plugin/plugin.d.ts +25 -0
  95. package/dist/plugin/plugin.d.ts.map +1 -0
  96. package/dist/plugin/plugin.js +601 -0
  97. package/dist/plugin/plugin.js.map +1 -0
  98. package/dist/router/Link.d.ts +7 -0
  99. package/dist/router/Link.d.ts.map +1 -0
  100. package/dist/router/Link.js +53 -0
  101. package/dist/router/Link.js.map +1 -0
  102. package/dist/router/Router.d.ts +7 -0
  103. package/dist/router/Router.d.ts.map +1 -0
  104. package/dist/router/Router.js +263 -0
  105. package/dist/router/Router.js.map +1 -0
  106. package/dist/router/context.d.ts +13 -0
  107. package/dist/router/context.d.ts.map +1 -0
  108. package/dist/router/context.js +47 -0
  109. package/dist/router/context.js.map +1 -0
  110. package/dist/router/hooks.d.ts +30 -0
  111. package/dist/router/hooks.d.ts.map +1 -0
  112. package/dist/router/hooks.js +59 -0
  113. package/dist/router/hooks.js.map +1 -0
  114. package/dist/router/index.d.ts +13 -0
  115. package/dist/router/index.d.ts.map +1 -0
  116. package/dist/router/index.js +14 -0
  117. package/dist/router/index.js.map +1 -0
  118. package/dist/router/matching.d.ts +19 -0
  119. package/dist/router/matching.d.ts.map +1 -0
  120. package/dist/router/matching.js +115 -0
  121. package/dist/router/matching.js.map +1 -0
  122. package/dist/router/navigation.d.ts +26 -0
  123. package/dist/router/navigation.d.ts.map +1 -0
  124. package/dist/router/navigation.js +65 -0
  125. package/dist/router/navigation.js.map +1 -0
  126. package/dist/router/types.d.ts +61 -0
  127. package/dist/router/types.d.ts.map +1 -0
  128. package/dist/router/types.js +6 -0
  129. package/dist/router/types.js.map +1 -0
  130. package/dist/server.d.ts +10 -16
  131. package/dist/server.d.ts.map +1 -0
  132. package/dist/server.js +7 -19
  133. package/dist/server.js.map +1 -1
  134. package/dist/streaming/html.d.ts +29 -0
  135. package/dist/streaming/html.d.ts.map +1 -0
  136. package/dist/streaming/html.js +72 -0
  137. package/dist/streaming/html.js.map +1 -0
  138. package/dist/streaming/index.d.ts +7 -0
  139. package/dist/streaming/index.d.ts.map +1 -0
  140. package/dist/streaming/index.js +7 -0
  141. package/dist/streaming/index.js.map +1 -0
  142. package/dist/streaming/render.d.ts +32 -0
  143. package/dist/streaming/render.d.ts.map +1 -0
  144. package/dist/streaming/render.js +83 -0
  145. package/dist/streaming/render.js.map +1 -0
  146. package/dist/streaming/utils.d.ts +30 -0
  147. package/dist/streaming/utils.d.ts.map +1 -0
  148. package/dist/streaming/utils.js +61 -0
  149. package/dist/streaming/utils.js.map +1 -0
  150. package/package.json +43 -35
  151. package/dist/router.d.ts +0 -3
  152. package/dist/router.js +0 -234
  153. package/dist/router.js.map +0 -1
  154. package/dist/vite.d.ts +0 -98
  155. package/dist/vite.js +0 -1820
  156. package/dist/vite.js.map +0 -1
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Link Component
4
+ * Client-side navigation link with prefetching
5
+ */
6
+ import { useEffect, useCallback, useRef } from 'react';
7
+ import { navigate, replace } from './navigation';
8
+ import { prefetchRoute } from './matching';
9
+ export function Link({ href, children, prefetch: shouldPrefetch = true, scroll = true, replace: shouldReplace = false, shallow = false, ...props }) {
10
+ const prefetchedRef = useRef(false);
11
+ const linkRef = useRef(null);
12
+ const getRoutes = useCallback(() => {
13
+ return window.__OLOVA_ROUTES__ || [];
14
+ }, []);
15
+ useEffect(() => {
16
+ if (!shouldPrefetch || prefetchedRef.current || !linkRef.current)
17
+ return;
18
+ const observer = new IntersectionObserver((entries) => {
19
+ if (entries[0].isIntersecting && !prefetchedRef.current) {
20
+ prefetchedRef.current = true;
21
+ prefetchRoute(getRoutes(), href);
22
+ }
23
+ }, { rootMargin: '200px' });
24
+ observer.observe(linkRef.current);
25
+ return () => observer.disconnect();
26
+ }, [href, shouldPrefetch, getRoutes]);
27
+ const handleMouseEnter = useCallback(() => {
28
+ if (!prefetchedRef.current) {
29
+ prefetchedRef.current = true;
30
+ prefetchRoute(getRoutes(), href);
31
+ }
32
+ }, [href, getRoutes]);
33
+ const handleClick = useCallback((e) => {
34
+ if (e.ctrlKey ||
35
+ e.metaKey ||
36
+ e.shiftKey ||
37
+ e.button !== 0 ||
38
+ props.target === '_blank' ||
39
+ href.startsWith('http') ||
40
+ href.startsWith('//')) {
41
+ return;
42
+ }
43
+ e.preventDefault();
44
+ if (shouldReplace) {
45
+ replace(href, { scroll, shallow });
46
+ }
47
+ else {
48
+ navigate(href, { scroll, shallow });
49
+ }
50
+ }, [href, scroll, shallow, shouldReplace, props.target]);
51
+ return (_jsx("a", { ref: linkRef, href: href, onClick: handleClick, onMouseEnter: handleMouseEnter, ...props, children: children }));
52
+ }
53
+ //# sourceMappingURL=Link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Link.js","sourceRoot":"","sources":["../../src/router/Link.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE9D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,UAAU,IAAI,CAAC,EACnB,IAAI,EACJ,QAAQ,EACR,QAAQ,EAAE,cAAc,GAAG,IAAI,EAC/B,MAAM,GAAG,IAAI,EACb,OAAO,EAAE,aAAa,GAAG,KAAK,EAC9B,OAAO,GAAG,KAAK,EACf,GAAG,KAAK,EACE;IACV,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IAEhD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAY,EAAE;QAC1C,OAAQ,MAAc,CAAC,gBAAgB,IAAI,EAAE,CAAC;IAChD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,cAAc,IAAI,aAAa,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO;QAEzE,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CACvC,CAAC,OAAO,EAAE,EAAE;YACV,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;gBACxD,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;gBAC7B,aAAa,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,EACD,EAAE,UAAU,EAAE,OAAO,EAAE,CACxB,CAAC;QAEF,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAElC,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;IAEtC,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC3B,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;YAC7B,aAAa,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAEtB,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAsC,EAAE,EAAE;QACzE,IACE,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,MAAM,KAAK,CAAC;YACd,KAAK,CAAC,MAAM,KAAK,QAAQ;YACzB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EACrB,CAAC;YACD,OAAO;QACT,CAAC;QAED,CAAC,CAAC,cAAc,EAAE,CAAC;QAEnB,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAEzD,OAAO,CACL,YACE,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,gBAAgB,KAC1B,KAAK,YAER,QAAQ,GACP,CACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { RouterProps } from './types';
2
+ export declare function Router({ routes }: RouterProps): import("react/jsx-runtime").JSX.Element | null;
3
+ export declare function NotFound(): import("react/jsx-runtime").JSX.Element;
4
+ export declare function ErrorPage(): import("react/jsx-runtime").JSX.Element;
5
+ export declare function LoadingIndicator(): import("react/jsx-runtime").JSX.Element;
6
+ export declare function NavigationProgress(): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=Router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../../src/router/Router.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAS,WAAW,EAAqB,MAAM,SAAS,CAAC;AA4FrE,wBAAgB,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,kDAgK7C;AAMD,wBAAgB,QAAQ,4CAQvB;AAED,wBAAgB,SAAS,4CAiBxB;AAED,wBAAgB,gBAAgB,4CAc/B;AAED,wBAAgB,kBAAkB,4CAajC"}
@@ -0,0 +1,263 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect, Suspense, startTransition, useRef, useMemo, } from 'react';
3
+ import { RouterContext, ParamsContext, routerEvents, NAVIGATE_EVENT, pageCache, metadataCache } from './context';
4
+ import { navigate, replace } from './navigation';
5
+ import { findRoute, prefetchRoute } from './matching';
6
+ import { Link } from './Link';
7
+ // ============================================================================
8
+ // METADATA HANDLING
9
+ // ============================================================================
10
+ function applyMetadata(metadata) {
11
+ if (!metadata)
12
+ return;
13
+ if (metadata.title) {
14
+ document.title = metadata.title;
15
+ }
16
+ const metaTags = {
17
+ description: metadata.description,
18
+ keywords: metadata.keywords,
19
+ };
20
+ for (const [name, content] of Object.entries(metaTags)) {
21
+ if (content) {
22
+ let meta = document.querySelector(`meta[name="${name}"]`);
23
+ if (!meta) {
24
+ meta = document.createElement('meta');
25
+ meta.setAttribute('name', name);
26
+ document.head.appendChild(meta);
27
+ }
28
+ meta.setAttribute('content', content);
29
+ }
30
+ }
31
+ if (metadata.openGraph) {
32
+ const og = metadata.openGraph;
33
+ const ogTags = {
34
+ 'og:title': og.title,
35
+ 'og:description': og.description,
36
+ 'og:type': og.type,
37
+ 'og:url': og.url,
38
+ 'og:image': og.image,
39
+ };
40
+ for (const [property, content] of Object.entries(ogTags)) {
41
+ if (content) {
42
+ let meta = document.querySelector(`meta[property="${property}"]`);
43
+ if (!meta) {
44
+ meta = document.createElement('meta');
45
+ meta.setAttribute('property', property);
46
+ document.head.appendChild(meta);
47
+ }
48
+ meta.setAttribute('content', content);
49
+ }
50
+ }
51
+ }
52
+ }
53
+ // ============================================================================
54
+ // QUERY STRING PARSING
55
+ // ============================================================================
56
+ function parseQueryString(search) {
57
+ const params = new URLSearchParams(search);
58
+ const result = {};
59
+ params.forEach((value, key) => {
60
+ if (result[key]) {
61
+ if (Array.isArray(result[key])) {
62
+ result[key].push(value);
63
+ }
64
+ else {
65
+ result[key] = [result[key], value];
66
+ }
67
+ }
68
+ else {
69
+ result[key] = value;
70
+ }
71
+ });
72
+ return result;
73
+ }
74
+ // ============================================================================
75
+ // ROUTER COMPONENT
76
+ // ============================================================================
77
+ export function Router({ routes }) {
78
+ const [currentPath, setCurrentPath] = useState(() => {
79
+ if (typeof window === 'undefined')
80
+ return '/';
81
+ const path = window.location.pathname;
82
+ return path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path;
83
+ });
84
+ const [query, setQuery] = useState(() => {
85
+ if (typeof window === 'undefined')
86
+ return {};
87
+ return parseQueryString(window.location.search);
88
+ });
89
+ const [PageComponent, setPageComponent] = useState(null);
90
+ const [params, setParams] = useState({});
91
+ const [isNavigating, setIsNavigating] = useState(false);
92
+ const [isReady, setIsReady] = useState(false);
93
+ const isHydrating = useRef(true);
94
+ const routesRef = useRef(routes);
95
+ routesRef.current = routes;
96
+ // Handle navigation events
97
+ useEffect(() => {
98
+ const handleNavigate = (e) => {
99
+ const customEvent = e;
100
+ const newPath = customEvent.detail?.path || window.location.pathname;
101
+ const normalizedPath = newPath.endsWith('/') && newPath !== '/'
102
+ ? newPath.slice(0, -1)
103
+ : newPath;
104
+ isHydrating.current = false;
105
+ startTransition(() => {
106
+ setCurrentPath(normalizedPath);
107
+ setQuery(parseQueryString(window.location.search));
108
+ });
109
+ };
110
+ const handlePopState = () => {
111
+ const path = window.location.pathname;
112
+ const normalizedPath = path.endsWith('/') && path !== '/'
113
+ ? path.slice(0, -1)
114
+ : path;
115
+ isHydrating.current = false;
116
+ startTransition(() => {
117
+ setCurrentPath(normalizedPath);
118
+ setQuery(parseQueryString(window.location.search));
119
+ });
120
+ };
121
+ const handleHashChange = () => {
122
+ routerEvents.emit('hashChangeStart', window.location.hash);
123
+ routerEvents.emit('hashChangeComplete', window.location.hash);
124
+ };
125
+ window.addEventListener(NAVIGATE_EVENT, handleNavigate);
126
+ window.addEventListener('popstate', handlePopState);
127
+ window.addEventListener('hashchange', handleHashChange);
128
+ return () => {
129
+ window.removeEventListener(NAVIGATE_EVENT, handleNavigate);
130
+ window.removeEventListener('popstate', handlePopState);
131
+ window.removeEventListener('hashchange', handleHashChange);
132
+ };
133
+ }, []);
134
+ // Load page component when path changes
135
+ useEffect(() => {
136
+ const { route, params: extractedParams } = findRoute(routes, currentPath);
137
+ if (!route) {
138
+ setPageComponent(() => NotFound);
139
+ setParams({});
140
+ setIsReady(true);
141
+ return;
142
+ }
143
+ setParams(extractedParams);
144
+ const cacheKey = route.path;
145
+ if (pageCache.has(cacheKey)) {
146
+ const cached = pageCache.get(cacheKey);
147
+ if (metadataCache.has(cacheKey)) {
148
+ applyMetadata(metadataCache.get(cacheKey));
149
+ }
150
+ startTransition(() => {
151
+ setPageComponent(() => cached);
152
+ setIsNavigating(false);
153
+ setIsReady(true);
154
+ });
155
+ return;
156
+ }
157
+ if (!isHydrating.current) {
158
+ setIsNavigating(true);
159
+ }
160
+ route.component().then(module => {
161
+ pageCache.set(cacheKey, module.default);
162
+ if (module.metadata) {
163
+ metadataCache.set(cacheKey, module.metadata);
164
+ applyMetadata(module.metadata);
165
+ }
166
+ startTransition(() => {
167
+ setPageComponent(() => module.default);
168
+ setIsNavigating(false);
169
+ setIsReady(true);
170
+ isHydrating.current = false;
171
+ });
172
+ }).catch(error => {
173
+ console.error('[Olova] Failed to load page:', error);
174
+ routerEvents.emit('routeChangeError', error, currentPath);
175
+ setPageComponent(() => ErrorPage);
176
+ setIsNavigating(false);
177
+ setIsReady(true);
178
+ });
179
+ }, [currentPath, routes]);
180
+ const routerContextValue = useMemo(() => ({
181
+ pathname: currentPath,
182
+ params,
183
+ query,
184
+ asPath: typeof window !== 'undefined'
185
+ ? currentPath + window.location.search + window.location.hash
186
+ : currentPath,
187
+ push: navigate,
188
+ replace,
189
+ back: () => typeof window !== 'undefined' && window.history.back(),
190
+ forward: () => typeof window !== 'undefined' && window.history.forward(),
191
+ prefetch: (url) => prefetchRoute(routesRef.current, url),
192
+ reload: () => typeof window !== 'undefined' && window.location.reload(),
193
+ isReady,
194
+ isNavigating,
195
+ isFallback: false,
196
+ events: routerEvents,
197
+ }), [currentPath, params, query, isReady, isNavigating]);
198
+ if (!PageComponent && isHydrating.current) {
199
+ return null;
200
+ }
201
+ if (!PageComponent) {
202
+ return null;
203
+ }
204
+ return (_jsx(RouterContext.Provider, { value: routerContextValue, children: _jsx(ParamsContext.Provider, { value: params, children: _jsxs(Suspense, { fallback: _jsx(LoadingIndicator, {}), children: [_jsx(PageComponent, { params: params, searchParams: query }), isNavigating && _jsx(NavigationProgress, {})] }) }) }));
205
+ }
206
+ // ============================================================================
207
+ // BUILT-IN COMPONENTS
208
+ // ============================================================================
209
+ export function NotFound() {
210
+ return (_jsxs("div", { style: { padding: '4rem 2rem', textAlign: 'center' }, children: [_jsx("h1", { style: { fontSize: '4rem', margin: 0 }, children: "404" }), _jsx("p", { style: { fontSize: '1.25rem', color: '#666' }, children: "This page could not be found." }), _jsx(Link, { href: "/", style: { color: '#0070f3' }, children: "Go back home" })] }));
211
+ }
212
+ export function ErrorPage() {
213
+ return (_jsxs("div", { style: { padding: '4rem 2rem', textAlign: 'center' }, children: [_jsx("h1", { style: { fontSize: '2rem', margin: 0 }, children: "Something went wrong" }), _jsx("p", { style: { fontSize: '1rem', color: '#666' }, children: "Failed to load this page." }), _jsx("button", { onClick: () => window.location.reload(), style: {
214
+ padding: '0.5rem 1rem',
215
+ background: '#0070f3',
216
+ color: 'white',
217
+ border: 'none',
218
+ borderRadius: '4px',
219
+ cursor: 'pointer'
220
+ }, children: "Try again" })] }));
221
+ }
222
+ export function LoadingIndicator() {
223
+ return (_jsx("div", { style: { padding: '2rem', textAlign: 'center' }, children: _jsx("div", { style: {
224
+ width: '40px',
225
+ height: '40px',
226
+ border: '3px solid #f3f3f3',
227
+ borderTop: '3px solid #0070f3',
228
+ borderRadius: '50%',
229
+ animation: 'olova-spin 1s linear infinite',
230
+ margin: '0 auto'
231
+ } }) }));
232
+ }
233
+ export function NavigationProgress() {
234
+ return (_jsx("div", { style: {
235
+ position: 'fixed',
236
+ top: 0,
237
+ left: 0,
238
+ right: 0,
239
+ height: '3px',
240
+ background: 'linear-gradient(90deg, #0070f3, #00a8ff)',
241
+ animation: 'olova-loading 1s ease-in-out infinite',
242
+ zIndex: 9999,
243
+ } }));
244
+ }
245
+ // ============================================================================
246
+ // CSS INJECTION
247
+ // ============================================================================
248
+ if (typeof document !== 'undefined') {
249
+ const style = document.createElement('style');
250
+ style.textContent = `
251
+ @keyframes olova-loading {
252
+ 0% { transform: translateX(-100%); }
253
+ 50% { transform: translateX(0); }
254
+ 100% { transform: translateX(100%); }
255
+ }
256
+ @keyframes olova-spin {
257
+ 0% { transform: rotate(0deg); }
258
+ 100% { transform: rotate(360deg); }
259
+ }
260
+ `;
261
+ document.head.appendChild(style);
262
+ }
263
+ //# sourceMappingURL=Router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router.js","sourceRoot":"","sources":["../../src/router/Router.tsx"],"names":[],"mappings":";AAAA,OAAc,EACZ,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,eAAe,EACf,MAAM,EACN,OAAO,GACR,MAAM,OAAO,CAAC;AAEf,OAAO,EACL,aAAa,EACb,aAAa,EACb,YAAY,EACZ,cAAc,EACd,SAAS,EACT,aAAa,EACd,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,SAAS,aAAa,CAAC,QAAa;IAClC,IAAI,CAAC,QAAQ;QAAE,OAAO;IAEtB,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAClC,CAAC;IAED,MAAM,QAAQ,GAA2B;QACvC,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;KAC5B,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC;YAC1D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBACtC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAChC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;YACD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC;QAC9B,MAAM,MAAM,GAA2B;YACrC,UAAU,EAAE,EAAE,CAAC,KAAK;YACpB,gBAAgB,EAAE,EAAE,CAAC,WAAW;YAChC,SAAS,EAAE,EAAE,CAAC,IAAI;YAClB,QAAQ,EAAE,EAAE,CAAC,GAAG;YAChB,UAAU,EAAE,EAAE,CAAC,KAAK;SACrB,CAAC;QAEF,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACzD,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,kBAAkB,QAAQ,IAAI,CAAC,CAAC;gBAClE,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;oBACtC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;oBACxC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClC,CAAC;gBACD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E,SAAS,gBAAgB,CAAC,MAAc;IACtC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAsC,EAAE,CAAC;IAErD,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAChB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC9B,MAAM,CAAC,GAAG,CAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAW,EAAE,KAAK,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,MAAM,UAAU,MAAM,CAAC,EAAE,MAAM,EAAe;IAC5C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE;QAClD,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,GAAG,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE;QACtC,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,EAAE,CAAC;QAC7C,OAAO,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAkC,IAAI,CAAC,CAAC;IAC1F,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAoC,EAAE,CAAC,CAAC;IAC5E,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAE3B,2BAA2B;IAC3B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,cAAc,GAAG,CAAC,CAAQ,EAAE,EAAE;YAClC,MAAM,WAAW,GAAG,CAAgB,CAAC;YACrC,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACrE,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,GAAG;gBAC7D,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtB,CAAC,CAAC,OAAO,CAAC;YAEZ,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC;YAE5B,eAAe,CAAC,GAAG,EAAE;gBACnB,cAAc,CAAC,cAAc,CAAC,CAAC;gBAC/B,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,cAAc,GAAG,GAAG,EAAE;YAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACtC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,GAAG;gBACvD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnB,CAAC,CAAC,IAAI,CAAC;YAET,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC;YAE5B,eAAe,CAAC,GAAG,EAAE;gBACnB,cAAc,CAAC,cAAc,CAAC,CAAC;gBAC/B,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,gBAAgB,GAAG,GAAG,EAAE;YAC5B,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC3D,YAAY,CAAC,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QACxD,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QACpD,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;QAExD,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;YAC3D,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;YACvD,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;QAC7D,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,wCAAwC;IACxC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAE1E,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,gBAAgB,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;YACjC,SAAS,CAAC,EAAE,CAAC,CAAC;YACd,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO;QACT,CAAC;QAED,SAAS,CAAC,eAAe,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;QAE5B,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;YAExC,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChC,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7C,CAAC;YAED,eAAe,CAAC,GAAG,EAAE;gBACnB,gBAAgB,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;gBAC/B,eAAe,CAAC,KAAK,CAAC,CAAC;gBACvB,UAAU,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,eAAe,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QAED,KAAK,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YAC9B,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAExC,IAAK,MAAc,CAAC,QAAQ,EAAE,CAAC;gBAC7B,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAG,MAAc,CAAC,QAAQ,CAAC,CAAC;gBACtD,aAAa,CAAE,MAAc,CAAC,QAAQ,CAAC,CAAC;YAC1C,CAAC;YAED,eAAe,CAAC,GAAG,EAAE;gBACnB,gBAAgB,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACvC,eAAe,CAAC,KAAK,CAAC,CAAC;gBACvB,UAAU,CAAC,IAAI,CAAC,CAAC;gBACjB,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,YAAY,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YAC1D,gBAAgB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAClC,eAAe,CAAC,KAAK,CAAC,CAAC;YACvB,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAE1B,MAAM,kBAAkB,GAAG,OAAO,CAAoB,GAAG,EAAE,CAAC,CAAC;QAC3D,QAAQ,EAAE,WAAW;QACrB,MAAM;QACN,KAAK;QACL,MAAM,EAAE,OAAO,MAAM,KAAK,WAAW;YACnC,CAAC,CAAC,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI;YAC7D,CAAC,CAAC,WAAW;QACf,IAAI,EAAE,QAAQ;QACd,OAAO;QACP,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;QAClE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE;QACxE,QAAQ,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC;QAChE,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;QACvE,OAAO;QACP,YAAY;QACZ,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE,YAAY;KACrB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAEzD,IAAI,CAAC,aAAa,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,kBAAkB,YAC/C,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,MAAM,YACnC,MAAC,QAAQ,IAAC,QAAQ,EAAE,KAAC,gBAAgB,KAAG,aACtC,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,GAAI,EACrD,YAAY,IAAI,KAAC,kBAAkB,KAAG,IAC9B,GACY,GACF,CAC1B,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E,MAAM,UAAU,QAAQ;IACtB,OAAO,CACL,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,aACvD,aAAI,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,oBAAU,EACpD,YAAG,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,8CAAmC,EACnF,KAAC,IAAI,IAAC,IAAI,EAAC,GAAG,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,6BAAqB,IAC3D,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,CACL,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,aACvD,aAAI,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,qCAA2B,EACrE,YAAG,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,0CAA+B,EAC5E,iBAAQ,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE;oBACtD,OAAO,EAAE,aAAa;oBACtB,UAAU,EAAE,SAAS;oBACrB,KAAK,EAAE,OAAO;oBACd,MAAM,EAAE,MAAM;oBACd,YAAY,EAAE,KAAK;oBACnB,MAAM,EAAE,SAAS;iBAClB,0BAEQ,IACL,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CACL,cAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAClD,cAAK,KAAK,EAAE;gBACV,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,mBAAmB;gBAC3B,SAAS,EAAE,mBAAmB;gBAC9B,YAAY,EAAE,KAAK;gBACnB,SAAS,EAAE,+BAA+B;gBAC1C,MAAM,EAAE,QAAQ;aACjB,GAAI,GACD,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,CACL,cAAK,KAAK,EAAE;YACV,QAAQ,EAAE,OAAO;YACjB,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,0CAA0C;YACtD,SAAS,EAAE,uCAAuC;YAClD,MAAM,EAAE,IAAI;SACb,GAAI,CACN,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,WAAW,GAAG;;;;;;;;;;GAUnB,CAAC;IACF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Router Context
3
+ * React contexts and shared state for the router
4
+ */
5
+ import type { RouterContextType, RouterEvents } from './types';
6
+ export declare const pageCache: Map<string, import("react").ComponentType<any>>;
7
+ export declare const prefetchPromises: Map<string, Promise<void>>;
8
+ export declare const metadataCache: Map<string, any>;
9
+ export declare const NAVIGATE_EVENT = "olova:navigate";
10
+ export declare const routerEvents: RouterEvents;
11
+ export declare const RouterContext: import("react").Context<RouterContextType>;
12
+ export declare const ParamsContext: import("react").Context<Record<string, string | string[]>>;
13
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/router/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EAGb,MAAM,SAAS,CAAC;AAGjB,eAAO,MAAM,SAAS,iDAA8C,CAAC;AACrE,eAAO,MAAM,gBAAgB,4BAAmC,CAAC;AACjE,eAAO,MAAM,aAAa,kBAAyB,CAAC;AAGpD,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAK/C,eAAO,MAAM,YAAY,EAAE,YAa1B,CAAC;AAGF,eAAO,MAAM,aAAa,4CAexB,CAAC;AAGH,eAAO,MAAM,aAAa,4DAAuD,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Router Context
3
+ * React contexts and shared state for the router
4
+ */
5
+ import { createContext } from 'react';
6
+ // Caches for page components and metadata
7
+ export const pageCache = new Map();
8
+ export const prefetchPromises = new Map();
9
+ export const metadataCache = new Map();
10
+ // Navigation event name
11
+ export const NAVIGATE_EVENT = 'olova:navigate';
12
+ // Event emitter for router events
13
+ const eventHandlers = new Map();
14
+ export const routerEvents = {
15
+ on(event, handler) {
16
+ if (!eventHandlers.has(event)) {
17
+ eventHandlers.set(event, new Set());
18
+ }
19
+ eventHandlers.get(event).add(handler);
20
+ },
21
+ off(event, handler) {
22
+ eventHandlers.get(event)?.delete(handler);
23
+ },
24
+ emit(event, ...args) {
25
+ eventHandlers.get(event)?.forEach(handler => handler(...args));
26
+ }
27
+ };
28
+ // Router context with default values
29
+ export const RouterContext = createContext({
30
+ pathname: '/',
31
+ params: {},
32
+ query: {},
33
+ asPath: '/',
34
+ push: async () => true,
35
+ replace: async () => true,
36
+ back: () => { },
37
+ forward: () => { },
38
+ prefetch: async () => { },
39
+ reload: () => { },
40
+ isReady: false,
41
+ isNavigating: false,
42
+ isFallback: false,
43
+ events: routerEvents,
44
+ });
45
+ // Params context for route parameters
46
+ export const ParamsContext = createContext({});
47
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/router/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAQtC,0CAA0C;AAC1C,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoC,CAAC;AACrE,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAyB,CAAC;AACjE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAe,CAAC;AAEpD,wBAAwB;AACxB,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAE/C,kCAAkC;AAClC,MAAM,aAAa,GAAG,IAAI,GAAG,EAA4C,CAAC;AAE1E,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,EAAE,CAAC,KAAK,EAAE,OAAO;QACf,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,aAAa,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,GAAG,CAAC,KAAK,EAAE,OAAO;QAChB,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI;QACjB,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACjE,CAAC;CACF,CAAC;AAEF,qCAAqC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAoB;IAC5D,QAAQ,EAAE,GAAG;IACb,MAAM,EAAE,EAAE;IACV,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;IACtB,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;IACzB,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;IACjB,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;IACxB,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC;IAChB,OAAO,EAAE,KAAK;IACd,YAAY,EAAE,KAAK;IACnB,UAAU,EAAE,KAAK;IACjB,MAAM,EAAE,YAAY;CACrB,CAAC,CAAC;AAEH,sCAAsC;AACtC,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAoC,EAAE,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Router Hooks
3
+ * React hooks for navigation and route information
4
+ */
5
+ import type { RouterContextType } from './types';
6
+ /**
7
+ * Access the router context
8
+ */
9
+ export declare function useRouter(): RouterContextType;
10
+ /**
11
+ * Access route parameters
12
+ */
13
+ export declare function useParams<T extends Record<string, string | string[]> = Record<string, string | string[]>>(): T;
14
+ /**
15
+ * Get the current pathname
16
+ */
17
+ export declare function usePathname(): string;
18
+ /**
19
+ * Access URL search parameters
20
+ */
21
+ export declare function useSearchParams(): URLSearchParams;
22
+ /**
23
+ * Get the first segment of the current layout
24
+ */
25
+ export declare function useSelectedLayoutSegment(): string | null;
26
+ /**
27
+ * Get all segments of the current layout
28
+ */
29
+ export declare function useSelectedLayoutSegments(): string[];
30
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/router/hooks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGjD;;GAEG;AACH,wBAAgB,SAAS,IAAI,iBAAiB,CAE7C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAE9G;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAGpC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,eAAe,CAoBjD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,GAAG,IAAI,CAIxD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAGpD"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Router Hooks
3
+ * React hooks for navigation and route information
4
+ */
5
+ import { useState, useEffect, useContext } from 'react';
6
+ import { RouterContext, ParamsContext, NAVIGATE_EVENT } from './context';
7
+ /**
8
+ * Access the router context
9
+ */
10
+ export function useRouter() {
11
+ return useContext(RouterContext);
12
+ }
13
+ /**
14
+ * Access route parameters
15
+ */
16
+ export function useParams() {
17
+ return useContext(ParamsContext);
18
+ }
19
+ /**
20
+ * Get the current pathname
21
+ */
22
+ export function usePathname() {
23
+ const { pathname } = useContext(RouterContext);
24
+ return pathname;
25
+ }
26
+ /**
27
+ * Access URL search parameters
28
+ */
29
+ export function useSearchParams() {
30
+ const [searchParams, setSearchParams] = useState(() => new URLSearchParams(window.location.search));
31
+ useEffect(() => {
32
+ const handleNavigate = () => {
33
+ setSearchParams(new URLSearchParams(window.location.search));
34
+ };
35
+ window.addEventListener(NAVIGATE_EVENT, handleNavigate);
36
+ window.addEventListener('popstate', handleNavigate);
37
+ return () => {
38
+ window.removeEventListener(NAVIGATE_EVENT, handleNavigate);
39
+ window.removeEventListener('popstate', handleNavigate);
40
+ };
41
+ }, []);
42
+ return searchParams;
43
+ }
44
+ /**
45
+ * Get the first segment of the current layout
46
+ */
47
+ export function useSelectedLayoutSegment() {
48
+ const { pathname } = useRouter();
49
+ const segments = pathname.split('/').filter(Boolean);
50
+ return segments[0] || null;
51
+ }
52
+ /**
53
+ * Get all segments of the current layout
54
+ */
55
+ export function useSelectedLayoutSegments() {
56
+ const { pathname } = useRouter();
57
+ return pathname.split('/').filter(Boolean);
58
+ }
59
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/router/hooks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEzE;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,UAAU,CAAC,aAAa,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,UAAU,CAAC,aAAa,CAAM,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC/C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CACpD,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC5C,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,cAAc,GAAG,GAAG,EAAE;YAC1B,eAAe,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QACxD,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAEpD,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;YAC3D,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QACzD,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,CAAC;IACjC,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Olova Router Module
3
+ * Optimized Next.js-style routing system
4
+ */
5
+ export * from './types';
6
+ export * from './context';
7
+ export * from './navigation';
8
+ export * from './matching';
9
+ export * from './hooks';
10
+ export * from './Link';
11
+ export * from './Router';
12
+ export { redirect, permanentRedirect, notFound } from './navigation';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AAGzB,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,QAAQ,EACT,MAAM,cAAc,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Olova Router Module
3
+ * Optimized Next.js-style routing system
4
+ */
5
+ export * from './types';
6
+ export * from './context';
7
+ export * from './navigation';
8
+ export * from './matching';
9
+ export * from './hooks';
10
+ export * from './Link';
11
+ export * from './Router';
12
+ // Re-export common programmatic navigation functions
13
+ export { redirect, permanentRedirect, notFound } from './navigation';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AAEzB,qDAAqD;AACrD,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,QAAQ,EACT,MAAM,cAAc,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Route Matching
3
+ * Route matching and prefetching logic
4
+ */
5
+ import type { Route, MatchResult, FindRouteResult } from './types';
6
+ /**
7
+ * Match a route path against the current path
8
+ * Supports dynamic routes, catch-all, and optional catch-all patterns
9
+ */
10
+ export declare function matchRoute(routePath: string, currentPath: string): MatchResult;
11
+ /**
12
+ * Find the best matching route for a path
13
+ */
14
+ export declare function findRoute(routes: Route[], path: string): FindRouteResult;
15
+ /**
16
+ * Prefetch a route's component
17
+ */
18
+ export declare function prefetchRoute(routes: Route[], path: string): Promise<void>;
19
+ //# sourceMappingURL=matching.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matching.d.ts","sourceRoot":"","sources":["../../src/router/matching.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGnE;;;GAGG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,WAAW,CA8D9E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CA2BxE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBhF"}