sinwan-router 1.0.1 → 1.0.3
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 +8 -5
- package/dist/components.d.ts +29 -5
- package/dist/index.d.ts +1 -1
- package/dist/index.js +275 -162
- package/dist/index.js.map +5 -5
- package/dist/link-nav.d.ts +1 -7
- package/package.json +6 -7
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@ Sinwan Router matches paths with a radix tree (no regex compilation), keeps rout
|
|
|
29
29
|
- **Lazy routes + prefetch** — `() => import("./Page")` or `lazy(...)`. `Link` prefetch and `RouterOutlet` share one per-router cache.
|
|
30
30
|
- **Browser-safe links** — `Link` leaves `_blank`, `download`, modifier clicks (`ctrl` / `meta` / `shift` / `alt`), external URLs, and same-page hashes to the browser.
|
|
31
31
|
|
|
32
|
-
Peer dependency: **sinwan >= 1.3.
|
|
32
|
+
Peer dependency: **sinwan >= 1.3.3** (reactive native JSX attributes; `<Key>` remounts when `cache` is omitted).
|
|
33
33
|
|
|
34
34
|
## Install
|
|
35
35
|
|
|
@@ -76,7 +76,7 @@ const App = cc(() => {
|
|
|
76
76
|
<div>
|
|
77
77
|
<nav>
|
|
78
78
|
<Link href="/">Home</Link>
|
|
79
|
-
<NavLink href="/about"
|
|
79
|
+
<NavLink href="/about" class={({ isActive }) => (isActive ? "active" : undefined)}>
|
|
80
80
|
About
|
|
81
81
|
</NavLink>
|
|
82
82
|
</nav>
|
|
@@ -165,12 +165,15 @@ router.dispose();
|
|
|
165
165
|
Docs
|
|
166
166
|
</Link>
|
|
167
167
|
|
|
168
|
-
<NavLink
|
|
168
|
+
<NavLink
|
|
169
|
+
href="/users"
|
|
170
|
+
class={({ isActive }) => (isActive ? "nav active" : "nav")}
|
|
171
|
+
>
|
|
169
172
|
Users
|
|
170
173
|
</NavLink>
|
|
171
174
|
```
|
|
172
175
|
|
|
173
|
-
`NavLink` is active on an exact match or a nested prefix (`/users` matches `/users/42`). Prefetch on hover is on by default; pass `prefetch={false}` to disable.
|
|
176
|
+
`NavLink` is active on an exact match or a nested prefix (`/users` matches `/users/42`). Pass `class={({ isActive }) => …}` to choose active vs idle styles (avoids Tailwind utility clashes). With no `class` prop, active links get `"active"` for CSS selectors. Prefetch on hover is on by default; pass `prefetch={false}` to disable.
|
|
174
177
|
|
|
175
178
|
## Outlet
|
|
176
179
|
|
|
@@ -183,7 +186,7 @@ router.dispose();
|
|
|
183
186
|
| ----------- | -------------------------------------------------------------------- |
|
|
184
187
|
| `depth` | `0` is the root match; `1` is the first nested child, and so on |
|
|
185
188
|
| `fallback` | Shown while a lazy import is in flight |
|
|
186
|
-
| `notFound` | Shown at depth `0` when nothing matches; nested outlets render nothing |
|
|
189
|
+
| `notFound` | Shown at depth `0` when nothing matches; nested outlets render nothing. Omit to use the built-in styled 404 (path + home link). |
|
|
187
190
|
| `error` | Shown when a lazy import rejects (`{ error?: unknown }` props) |
|
|
188
191
|
|
|
189
192
|
Put `<RouterOutlet depth={1} />` inside a parent layout to render the child.
|
package/dist/components.d.ts
CHANGED
|
@@ -5,7 +5,12 @@
|
|
|
5
5
|
* The router instance must be provided via provide(RouterKey, router).
|
|
6
6
|
*/
|
|
7
7
|
import type { SinwanComponent, SinwanNode } from "sinwan/component";
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Anchor props for client navigation. Extra keys (data-*, aria-*, ref,
|
|
10
|
+
* mouse/focus handlers) are forwarded so Slot / asChild parents can merge
|
|
11
|
+
* onto the real `<a>` (e.g. SidebarMenuButton tooltip).
|
|
12
|
+
*/
|
|
13
|
+
export type LinkProps = {
|
|
9
14
|
href: string;
|
|
10
15
|
prefetch?: boolean;
|
|
11
16
|
class?: string;
|
|
@@ -13,15 +18,34 @@ export interface LinkProps {
|
|
|
13
18
|
target?: string;
|
|
14
19
|
download?: string | boolean;
|
|
15
20
|
rel?: string;
|
|
16
|
-
|
|
21
|
+
onclick?: (event: MouseEvent) => void;
|
|
22
|
+
onmouseenter?: (event: MouseEvent) => void;
|
|
23
|
+
} & Record<string, unknown>;
|
|
17
24
|
/**
|
|
18
25
|
* Link — client-side navigation anchor.
|
|
19
26
|
* Uses the router from context (provide(RouterKey, router)).
|
|
20
27
|
*/
|
|
21
28
|
export declare const Link: SinwanComponent<LinkProps>;
|
|
22
|
-
export
|
|
23
|
-
|
|
24
|
-
}
|
|
29
|
+
export type NavLinkClassOptions = {
|
|
30
|
+
isActive: boolean;
|
|
31
|
+
};
|
|
32
|
+
export type NavLinkClassFunction = (options: NavLinkClassOptions) => string | false | null | undefined;
|
|
33
|
+
export type NavLinkProps = {
|
|
34
|
+
href: string;
|
|
35
|
+
prefetch?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Static class string, or a callback that receives `{ isActive }` so
|
|
38
|
+
* active/inactive styles never share conflicting Tailwind utilities.
|
|
39
|
+
* When omitted, active links get the class `"active"` (CSS templates).
|
|
40
|
+
*/
|
|
41
|
+
class?: string | NavLinkClassFunction;
|
|
42
|
+
children?: SinwanNode;
|
|
43
|
+
target?: string;
|
|
44
|
+
download?: string | boolean;
|
|
45
|
+
rel?: string;
|
|
46
|
+
onclick?: (event: MouseEvent) => void;
|
|
47
|
+
onmouseenter?: (event: MouseEvent) => void;
|
|
48
|
+
} & Record<string, unknown>;
|
|
25
49
|
/**
|
|
26
50
|
* NavLink — Link with active state styling.
|
|
27
51
|
* Uses the router from context.
|
package/dist/index.d.ts
CHANGED
|
@@ -32,7 +32,7 @@ export { createRouter, Router, isLazyComponent, lazy } from "./router.ts";
|
|
|
32
32
|
export { createRadixTree, radixInsert, radixSearch, buildPath, normalizePath, extractSearchParams, } from "./matcher.ts";
|
|
33
33
|
export type { RadixNode, RouteData, MatchResult } from "./matcher.ts";
|
|
34
34
|
export { Link, NavLink, RouterOutlet } from "./components.tsx";
|
|
35
|
-
export type { LinkProps, NavLinkProps, RouterOutletProps, } from "./components.tsx";
|
|
35
|
+
export type { LinkProps, NavLinkProps, NavLinkClassOptions, NavLinkClassFunction, RouterOutletProps, } from "./components.tsx";
|
|
36
36
|
export { Route, Routes, collectRouteDefinitions, isRouteElement, layoutNodes, } from "./jsx-routes.tsx";
|
|
37
37
|
export type { RouteProps, RoutesProps } from "./jsx-routes.tsx";
|
|
38
38
|
export { useRouter, useParams, useSearchParams, useRoute, useNavigate, usePath, RouterKey, } from "./hooks.ts";
|
package/dist/index.js
CHANGED
|
@@ -421,9 +421,9 @@ function createRouter(routes, initialPath) {
|
|
|
421
421
|
return new Router(routes, initialPath);
|
|
422
422
|
}
|
|
423
423
|
// src/components.tsx
|
|
424
|
-
import { _$createTemplate } from "sinwan/renderer";
|
|
425
|
-
import { cc } from "sinwan/component";
|
|
426
|
-
import { Key } from "sinwan/
|
|
424
|
+
import { _$createTemplate } from "sinwan/renderer/web";
|
|
425
|
+
import { cc, getRawProps } from "sinwan/component";
|
|
426
|
+
import { Key } from "sinwan/control-flow";
|
|
427
427
|
import { computed as computed2 } from "sinwan/reactivity";
|
|
428
428
|
|
|
429
429
|
// src/hooks.ts
|
|
@@ -454,9 +454,6 @@ function usePath() {
|
|
|
454
454
|
}
|
|
455
455
|
|
|
456
456
|
// src/link-nav.ts
|
|
457
|
-
function jsxClass(value) {
|
|
458
|
-
return value;
|
|
459
|
-
}
|
|
460
457
|
function isExternalHref(href) {
|
|
461
458
|
if (href.startsWith("//"))
|
|
462
459
|
return true;
|
|
@@ -553,87 +550,53 @@ function computeOutletKey(router, depth) {
|
|
|
553
550
|
// src/components.tsx
|
|
554
551
|
import { jsxDEV } from "sinwan/jsx-dev-runtime";
|
|
555
552
|
var _$tmpl_0 = {
|
|
556
|
-
html: '<
|
|
557
|
-
slots: [
|
|
558
|
-
path: [],
|
|
559
|
-
type: "attr",
|
|
560
|
-
name: "
|
|
561
|
-
|
|
562
|
-
path: [],
|
|
563
|
-
type: "
|
|
564
|
-
name: "
|
|
565
|
-
|
|
566
|
-
path: [],
|
|
567
|
-
|
|
568
|
-
name: "target"
|
|
569
|
-
}, {
|
|
570
|
-
path: [],
|
|
571
|
-
type: "attr",
|
|
572
|
-
name: "download"
|
|
573
|
-
}, {
|
|
574
|
-
path: [],
|
|
575
|
-
type: "attr",
|
|
576
|
-
name: "rel"
|
|
577
|
-
}, {
|
|
578
|
-
path: [],
|
|
579
|
-
type: "event",
|
|
580
|
-
name: "onclick"
|
|
581
|
-
}, {
|
|
582
|
-
path: [],
|
|
583
|
-
type: "event",
|
|
584
|
-
name: "onmouseenter"
|
|
585
|
-
}, {
|
|
586
|
-
path: [0],
|
|
587
|
-
type: "child"
|
|
588
|
-
}]
|
|
553
|
+
html: '<div role="main" aria-labelledby="sinwan-router-not-found-title" style=""><div style=""><p aria-hidden="true" style="">404</p><h1 id="sinwan-router-not-found-title" style="">Page not found</h1><p style="">No route matches<!--s:0--><code style=""></code>.</p><!--s:2--></div></div>',
|
|
554
|
+
slots: [
|
|
555
|
+
{ path: [], type: "attr", name: "style" },
|
|
556
|
+
{ path: [0], type: "attr", name: "style" },
|
|
557
|
+
{ path: [0, 0], type: "attr", name: "style" },
|
|
558
|
+
{ path: [0, 1], type: "attr", name: "style" },
|
|
559
|
+
{ path: [0, 2], type: "attr", name: "style" },
|
|
560
|
+
{ path: [0, 2, 1], type: "child" },
|
|
561
|
+
{ path: [0, 2, 2], type: "attr", name: "style" },
|
|
562
|
+
{ path: [0, 2, 2], type: "child" },
|
|
563
|
+
{ path: [0, 3], type: "child" }
|
|
564
|
+
]
|
|
589
565
|
};
|
|
590
566
|
var _$tmpl_1 = {
|
|
591
|
-
html: '<
|
|
592
|
-
slots: [
|
|
593
|
-
path: [],
|
|
594
|
-
type: "attr",
|
|
595
|
-
|
|
596
|
-
}, {
|
|
597
|
-
path: [],
|
|
598
|
-
type: "attr",
|
|
599
|
-
name: "class"
|
|
600
|
-
}, {
|
|
601
|
-
path: [],
|
|
602
|
-
type: "attr",
|
|
603
|
-
name: "target"
|
|
604
|
-
}, {
|
|
605
|
-
path: [],
|
|
606
|
-
type: "attr",
|
|
607
|
-
name: "download"
|
|
608
|
-
}, {
|
|
609
|
-
path: [],
|
|
610
|
-
type: "attr",
|
|
611
|
-
name: "rel"
|
|
612
|
-
}, {
|
|
613
|
-
path: [],
|
|
614
|
-
type: "event",
|
|
615
|
-
name: "onclick"
|
|
616
|
-
}, {
|
|
617
|
-
path: [],
|
|
618
|
-
type: "event",
|
|
619
|
-
name: "onmouseenter"
|
|
620
|
-
}, {
|
|
621
|
-
path: [0],
|
|
622
|
-
type: "child"
|
|
623
|
-
}]
|
|
567
|
+
html: '<div role="status" aria-live="polite" style=""><div style="">Loading...</div></div>',
|
|
568
|
+
slots: [
|
|
569
|
+
{ path: [], type: "attr", name: "style" },
|
|
570
|
+
{ path: [0], type: "attr", name: "style" }
|
|
571
|
+
]
|
|
624
572
|
};
|
|
625
573
|
var _$tmpl_2 = {
|
|
626
|
-
html:
|
|
627
|
-
slots: [
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
slots: []
|
|
632
|
-
};
|
|
633
|
-
var _$tmpl_4 = {
|
|
634
|
-
html: "<div>Failed to load page</div>",
|
|
635
|
-
slots: []
|
|
574
|
+
html: '<div role="alert" style=""><div style="">Failed to load page</div></div>',
|
|
575
|
+
slots: [
|
|
576
|
+
{ path: [], type: "attr", name: "style" },
|
|
577
|
+
{ path: [0], type: "attr", name: "style" }
|
|
578
|
+
]
|
|
636
579
|
};
|
|
580
|
+
var LINK_OWN_KEYS = new Set([
|
|
581
|
+
"href",
|
|
582
|
+
"prefetch",
|
|
583
|
+
"class",
|
|
584
|
+
"children",
|
|
585
|
+
"target",
|
|
586
|
+
"download",
|
|
587
|
+
"rel",
|
|
588
|
+
"onclick",
|
|
589
|
+
"onmouseenter"
|
|
590
|
+
]);
|
|
591
|
+
function linkPassthrough(props) {
|
|
592
|
+
const raw = getRawProps(props);
|
|
593
|
+
const rest = {};
|
|
594
|
+
for (const key of Object.keys(raw)) {
|
|
595
|
+
if (!LINK_OWN_KEYS.has(key))
|
|
596
|
+
rest[key] = raw[key];
|
|
597
|
+
}
|
|
598
|
+
return rest;
|
|
599
|
+
}
|
|
637
600
|
function onLinkClick(event, href, router, options) {
|
|
638
601
|
if (!shouldInterceptLinkClick(event, href, router.path, options))
|
|
639
602
|
return;
|
|
@@ -647,51 +610,220 @@ function downloadAttr(download) {
|
|
|
647
610
|
return "";
|
|
648
611
|
return download;
|
|
649
612
|
}
|
|
650
|
-
var Link = cc(({
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
613
|
+
var Link = cc((props) => {
|
|
614
|
+
const {
|
|
615
|
+
href,
|
|
616
|
+
prefetch = true,
|
|
617
|
+
class: cls,
|
|
618
|
+
children,
|
|
619
|
+
target,
|
|
620
|
+
download,
|
|
621
|
+
rel,
|
|
622
|
+
onclick,
|
|
623
|
+
onmouseenter
|
|
624
|
+
} = props;
|
|
659
625
|
const router = useRouter();
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
626
|
+
const rest = linkPassthrough(props);
|
|
627
|
+
return /* @__PURE__ */ jsxDEV("a", {
|
|
628
|
+
...rest,
|
|
629
|
+
href,
|
|
630
|
+
class: cls,
|
|
631
|
+
target,
|
|
632
|
+
download: downloadAttr(download),
|
|
633
|
+
rel,
|
|
634
|
+
onclick: (e) => {
|
|
635
|
+
onLinkClick(e, href, router, { target, download });
|
|
636
|
+
onclick?.(e);
|
|
637
|
+
},
|
|
638
|
+
onmouseenter: (e) => {
|
|
639
|
+
if (prefetch)
|
|
640
|
+
router.prefetch(href);
|
|
641
|
+
onmouseenter?.(e);
|
|
642
|
+
},
|
|
643
|
+
children
|
|
644
|
+
}, undefined, false, undefined, this);
|
|
669
645
|
});
|
|
670
|
-
|
|
671
|
-
href
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
}
|
|
646
|
+
function isNavLinkActive(path, href) {
|
|
647
|
+
return path === href || path.startsWith(href + "/");
|
|
648
|
+
}
|
|
649
|
+
function resolveNavLinkClass(cls, isActive) {
|
|
650
|
+
if (typeof cls === "function") {
|
|
651
|
+
return (cls({ isActive }) || "").trim();
|
|
652
|
+
}
|
|
653
|
+
if (cls != null && cls !== "") {
|
|
654
|
+
return cls;
|
|
655
|
+
}
|
|
656
|
+
return isActive ? "active" : "";
|
|
657
|
+
}
|
|
658
|
+
var NavLink = cc((props) => {
|
|
659
|
+
const {
|
|
660
|
+
href,
|
|
661
|
+
prefetch = true,
|
|
662
|
+
class: cls,
|
|
663
|
+
children,
|
|
664
|
+
target,
|
|
665
|
+
download,
|
|
666
|
+
rel,
|
|
667
|
+
onclick,
|
|
668
|
+
onmouseenter
|
|
669
|
+
} = props;
|
|
680
670
|
const router = useRouter();
|
|
681
|
-
const
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
671
|
+
const rest = linkPassthrough(props);
|
|
672
|
+
const className = computed2(() => resolveNavLinkClass(cls, isNavLinkActive(router.path, href)));
|
|
673
|
+
return /* @__PURE__ */ jsxDEV("a", {
|
|
674
|
+
...rest,
|
|
675
|
+
href,
|
|
676
|
+
class: className,
|
|
677
|
+
target,
|
|
678
|
+
download: downloadAttr(download),
|
|
679
|
+
rel,
|
|
680
|
+
onclick: (e) => {
|
|
681
|
+
onLinkClick(e, href, router, { target, download });
|
|
682
|
+
onclick?.(e);
|
|
683
|
+
},
|
|
684
|
+
onmouseenter: (e) => {
|
|
685
|
+
if (prefetch)
|
|
686
|
+
router.prefetch(href);
|
|
687
|
+
onmouseenter?.(e);
|
|
688
|
+
},
|
|
689
|
+
children
|
|
690
|
+
}, undefined, false, undefined, this);
|
|
691
691
|
});
|
|
692
|
-
var
|
|
693
|
-
|
|
694
|
-
|
|
692
|
+
var creditBlue = {
|
|
693
|
+
background: "oklch(0.98 0.004 250)",
|
|
694
|
+
foreground: "oklch(0.18 0.03 255)",
|
|
695
|
+
primary: "oklch(0.55 0.22 262)",
|
|
696
|
+
primaryForeground: "oklch(0.98 0.01 250)",
|
|
697
|
+
secondary: "oklch(0.9 0.04 262)",
|
|
698
|
+
secondaryForeground: "oklch(0.3 0.09 262)",
|
|
699
|
+
tertiary: "oklch(0.72 0.14 230)",
|
|
700
|
+
muted: "oklch(0.96 0.006 250)",
|
|
701
|
+
mutedForeground: "oklch(0.5 0.02 255)",
|
|
702
|
+
card: "oklch(1 0 0)",
|
|
703
|
+
border: "oklch(0.9 0.01 255)",
|
|
704
|
+
radius: "0.625rem",
|
|
705
|
+
ambientBackground: [
|
|
706
|
+
"radial-gradient(110% 85% at 0% 0%, oklch(0.72 0.14 230 / 0.08), transparent 60%)",
|
|
707
|
+
"radial-gradient(110% 85% at 100% 0%, oklch(0.55 0.22 262 / 0.07), transparent 60%)",
|
|
708
|
+
"radial-gradient(110% 85% at 100% 100%, oklch(0.72 0.14 230 / 0.08), transparent 60%)",
|
|
709
|
+
"radial-gradient(110% 85% at 0% 100%, oklch(0.55 0.22 262 / 0.06), transparent 60%)",
|
|
710
|
+
"oklch(0.98 0.004 250)"
|
|
711
|
+
].join(", "),
|
|
712
|
+
brandGradient: "linear-gradient(150deg, oklch(0.72 0.14 230) 10%, oklch(0.55 0.22 262) 100%)"
|
|
713
|
+
};
|
|
714
|
+
var defaultNotFoundShellStyle = {
|
|
715
|
+
minHeight: "100vh",
|
|
716
|
+
display: "flex",
|
|
717
|
+
alignItems: "center",
|
|
718
|
+
justifyContent: "center",
|
|
719
|
+
padding: "2.5rem 1.25rem",
|
|
720
|
+
boxSizing: "border-box",
|
|
721
|
+
background: creditBlue.ambientBackground,
|
|
722
|
+
color: creditBlue.foreground,
|
|
723
|
+
fontFamily: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif'
|
|
724
|
+
};
|
|
725
|
+
var defaultNotFoundCardStyle = {
|
|
726
|
+
maxWidth: "28rem",
|
|
727
|
+
width: "100%",
|
|
728
|
+
textAlign: "center",
|
|
729
|
+
padding: "2.25rem 1.75rem",
|
|
730
|
+
borderRadius: "calc(0.625rem * 1.4)",
|
|
731
|
+
background: creditBlue.card,
|
|
732
|
+
border: `1px solid ${creditBlue.border}`,
|
|
733
|
+
boxShadow: "0 18px 50px oklch(0.55 0.22 262 / 0.08)"
|
|
734
|
+
};
|
|
735
|
+
var defaultNotFoundCodeStyle = {
|
|
736
|
+
display: "inline-block",
|
|
737
|
+
margin: "0 0.15em",
|
|
738
|
+
padding: "0.12em 0.4em",
|
|
739
|
+
borderRadius: "calc(0.625rem * 0.6)",
|
|
740
|
+
background: creditBlue.muted,
|
|
741
|
+
color: creditBlue.secondaryForeground,
|
|
742
|
+
fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',
|
|
743
|
+
fontSize: "0.88em",
|
|
744
|
+
wordBreak: "break-all"
|
|
745
|
+
};
|
|
746
|
+
var defaultNotFoundLinkStyle = {
|
|
747
|
+
display: "inline-block",
|
|
748
|
+
padding: "0.65rem 1.2rem",
|
|
749
|
+
borderRadius: creditBlue.radius,
|
|
750
|
+
background: creditBlue.brandGradient,
|
|
751
|
+
color: creditBlue.primaryForeground,
|
|
752
|
+
textDecoration: "none",
|
|
753
|
+
fontSize: "0.9rem",
|
|
754
|
+
fontWeight: 600,
|
|
755
|
+
letterSpacing: "0.01em",
|
|
756
|
+
boxShadow: "0 8px 20px oklch(0.55 0.22 262 / 0.28)"
|
|
757
|
+
};
|
|
758
|
+
var DefaultNotFound = cc(() => {
|
|
759
|
+
const router = useRouter();
|
|
760
|
+
return _$createTemplate(_$tmpl_0, [
|
|
761
|
+
defaultNotFoundShellStyle,
|
|
762
|
+
defaultNotFoundCardStyle,
|
|
763
|
+
{
|
|
764
|
+
margin: "0 0 0.85rem",
|
|
765
|
+
fontSize: "clamp(3.5rem, 12vw, 5rem)",
|
|
766
|
+
fontWeight: 700,
|
|
767
|
+
letterSpacing: "-0.06em",
|
|
768
|
+
lineHeight: 1,
|
|
769
|
+
background: creditBlue.brandGradient,
|
|
770
|
+
backgroundClip: "text",
|
|
771
|
+
WebkitBackgroundClip: "text",
|
|
772
|
+
color: "transparent"
|
|
773
|
+
},
|
|
774
|
+
{
|
|
775
|
+
margin: "0 0 0.75rem",
|
|
776
|
+
fontSize: "1.5rem",
|
|
777
|
+
fontWeight: 600,
|
|
778
|
+
letterSpacing: "-0.02em",
|
|
779
|
+
color: creditBlue.foreground
|
|
780
|
+
},
|
|
781
|
+
{
|
|
782
|
+
margin: "0 0 1.75rem",
|
|
783
|
+
fontSize: "0.95rem",
|
|
784
|
+
lineHeight: 1.55,
|
|
785
|
+
color: creditBlue.mutedForeground
|
|
786
|
+
},
|
|
787
|
+
" ",
|
|
788
|
+
defaultNotFoundCodeStyle,
|
|
789
|
+
() => router.path,
|
|
790
|
+
/* @__PURE__ */ jsxDEV(Link, {
|
|
791
|
+
href: "/",
|
|
792
|
+
style: defaultNotFoundLinkStyle,
|
|
793
|
+
children: "Back to home"
|
|
794
|
+
}, undefined, false, undefined, this)
|
|
795
|
+
]);
|
|
796
|
+
});
|
|
797
|
+
var defaultStatusShellStyle = {
|
|
798
|
+
minHeight: "100vh",
|
|
799
|
+
display: "flex",
|
|
800
|
+
alignItems: "center",
|
|
801
|
+
justifyContent: "center",
|
|
802
|
+
padding: "2rem 1.25rem",
|
|
803
|
+
boxSizing: "border-box",
|
|
804
|
+
background: creditBlue.ambientBackground,
|
|
805
|
+
color: creditBlue.foreground,
|
|
806
|
+
fontFamily: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif'
|
|
807
|
+
};
|
|
808
|
+
var defaultStatusCardStyle = {
|
|
809
|
+
padding: "1.25rem 1.5rem",
|
|
810
|
+
borderRadius: creditBlue.radius,
|
|
811
|
+
background: creditBlue.card,
|
|
812
|
+
border: `1px solid ${creditBlue.border}`,
|
|
813
|
+
color: creditBlue.secondaryForeground,
|
|
814
|
+
fontSize: "0.95rem",
|
|
815
|
+
fontWeight: 500,
|
|
816
|
+
boxShadow: "0 12px 32px oklch(0.55 0.22 262 / 0.06)"
|
|
817
|
+
};
|
|
818
|
+
var DefaultLoading = cc(() => _$createTemplate(_$tmpl_1, [defaultStatusShellStyle, defaultStatusCardStyle]));
|
|
819
|
+
var DefaultError = cc(() => _$createTemplate(_$tmpl_2, [
|
|
820
|
+
defaultStatusShellStyle,
|
|
821
|
+
{
|
|
822
|
+
...defaultStatusCardStyle,
|
|
823
|
+
borderColor: "oklch(0.55 0.22 262 / 0.35)",
|
|
824
|
+
color: creditBlue.foreground
|
|
825
|
+
}
|
|
826
|
+
]));
|
|
695
827
|
function resolveOutletNode(matched, router, fallback, errorComp) {
|
|
696
828
|
const route = matched.route;
|
|
697
829
|
if (!isLazyComponent(route.component)) {
|
|
@@ -714,30 +846,26 @@ function resolveOutletNode(matched, router, fallback, errorComp) {
|
|
|
714
846
|
const Fallback = fallback;
|
|
715
847
|
return /* @__PURE__ */ jsxDEV(Fallback, {}, undefined, false, undefined, this);
|
|
716
848
|
}
|
|
717
|
-
var RouterOutlet = cc(({
|
|
718
|
-
fallback,
|
|
719
|
-
notFound,
|
|
720
|
-
error,
|
|
721
|
-
depth = 0
|
|
722
|
-
}) => {
|
|
849
|
+
var RouterOutlet = cc((props) => {
|
|
723
850
|
const router = useRouter();
|
|
724
|
-
const Fallback = fallback ?? DefaultLoading;
|
|
725
|
-
const NotFound = notFound ?? DefaultNotFound;
|
|
726
|
-
const ErrorView = error ?? DefaultError;
|
|
851
|
+
const Fallback = () => props.fallback ?? DefaultLoading;
|
|
852
|
+
const NotFound = props.notFound ?? DefaultNotFound;
|
|
853
|
+
const ErrorView = () => props.error ?? DefaultError;
|
|
727
854
|
return /* @__PURE__ */ jsxDEV(Key, {
|
|
728
|
-
when: () => computeOutletKey(router, depth),
|
|
729
|
-
children: () => {
|
|
730
|
-
const matched = getMatchAtDepth(router.matched, depth);
|
|
855
|
+
when: () => computeOutletKey(router, props.depth === undefined ? 0 : props.depth),
|
|
856
|
+
children: (_identity) => {
|
|
857
|
+
const matched = getMatchAtDepth(router.matched, props.depth === undefined ? 0 : props.depth);
|
|
731
858
|
if (!matched) {
|
|
732
|
-
if (depth > 0)
|
|
859
|
+
if ((props.depth === undefined ? 0 : props.depth) > 0)
|
|
733
860
|
return null;
|
|
734
861
|
return /* @__PURE__ */ jsxDEV(NotFound, {}, undefined, false, undefined, this);
|
|
735
862
|
}
|
|
736
|
-
return resolveOutletNode(matched, router, Fallback, ErrorView);
|
|
863
|
+
return resolveOutletNode(matched, router, Fallback(), ErrorView());
|
|
737
864
|
}
|
|
738
865
|
}, undefined, false, undefined, this);
|
|
739
866
|
});
|
|
740
867
|
// src/jsx-routes.tsx
|
|
868
|
+
import { unwrap as _$unwrap } from "sinwan/reactivity";
|
|
741
869
|
import { cc as cc2, provide, onDispose } from "sinwan/component";
|
|
742
870
|
import { jsxDEV as jsxDEV2, Fragment } from "sinwan/jsx-dev-runtime";
|
|
743
871
|
var ROUTE_TYPE = Symbol.for("sinwan.router.Route");
|
|
@@ -745,10 +873,7 @@ function isElementLike(value) {
|
|
|
745
873
|
return value != null && typeof value === "object" && "tag" in value;
|
|
746
874
|
}
|
|
747
875
|
function routePropsRecord(props) {
|
|
748
|
-
const record = {
|
|
749
|
-
path: props.path,
|
|
750
|
-
component: props.component
|
|
751
|
-
};
|
|
876
|
+
const record = { path: props.path, component: props.component };
|
|
752
877
|
if (props.meta !== undefined)
|
|
753
878
|
record.meta = props.meta;
|
|
754
879
|
if (props.children !== undefined)
|
|
@@ -811,10 +936,7 @@ function nestedDefinitions(source) {
|
|
|
811
936
|
}
|
|
812
937
|
function routeNodeToDefinition(node) {
|
|
813
938
|
if (isRouteDefinition(node)) {
|
|
814
|
-
const def = {
|
|
815
|
-
path: node.path,
|
|
816
|
-
component: node.component
|
|
817
|
-
};
|
|
939
|
+
const def = { path: node.path, component: node.component };
|
|
818
940
|
if (node.meta)
|
|
819
941
|
def.meta = node.meta;
|
|
820
942
|
if (node.children && node.children.length > 0)
|
|
@@ -828,10 +950,7 @@ function routeNodeToDefinition(node) {
|
|
|
828
950
|
const component = props.component;
|
|
829
951
|
if (typeof path !== "string" || component == null)
|
|
830
952
|
return null;
|
|
831
|
-
const def = {
|
|
832
|
-
path,
|
|
833
|
-
component
|
|
834
|
-
};
|
|
953
|
+
const def = { path, component };
|
|
835
954
|
const meta = props.meta;
|
|
836
955
|
if (meta != null && typeof meta === "object") {
|
|
837
956
|
def.meta = meta;
|
|
@@ -859,24 +978,18 @@ function layoutNodes(children) {
|
|
|
859
978
|
}
|
|
860
979
|
return out;
|
|
861
980
|
}
|
|
862
|
-
var Routes = cc2(({
|
|
863
|
-
children,
|
|
864
|
-
fallback,
|
|
865
|
-
notFound,
|
|
866
|
-
error,
|
|
867
|
-
initialPath
|
|
868
|
-
}) => {
|
|
869
|
-
const router = createRouter(collectRouteDefinitions(children), initialPath);
|
|
981
|
+
var Routes = cc2((props) => {
|
|
982
|
+
const router = createRouter(collectRouteDefinitions(props.children), props.initialPath);
|
|
870
983
|
provide(RouterKey, router);
|
|
871
984
|
onDispose(() => {
|
|
872
985
|
router.dispose();
|
|
873
986
|
});
|
|
874
987
|
const outlet = /* @__PURE__ */ jsxDEV2(RouterOutlet, {
|
|
875
|
-
fallback,
|
|
876
|
-
notFound,
|
|
877
|
-
error
|
|
988
|
+
fallback: () => _$unwrap(props).fallback,
|
|
989
|
+
notFound: () => _$unwrap(props).notFound,
|
|
990
|
+
error: () => _$unwrap(props).error
|
|
878
991
|
}, undefined, false, undefined, this);
|
|
879
|
-
const layout = layoutNodes(children);
|
|
992
|
+
const layout = layoutNodes(props.children);
|
|
880
993
|
if (layout.length === 0)
|
|
881
994
|
return outlet;
|
|
882
995
|
return /* @__PURE__ */ jsxDEV2(Fragment, {
|
|
@@ -914,5 +1027,5 @@ export {
|
|
|
914
1027
|
useSearchParams
|
|
915
1028
|
};
|
|
916
1029
|
|
|
917
|
-
//# debugId=
|
|
1030
|
+
//# debugId=13D1B1C73A78E42B64756E2164756E21
|
|
918
1031
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * Sinwan Router — Core Router\n *\n * Manages route state, navigation, and matching using Sinwan's reactivity.\n * Uses a radix tree for O(depth) route lookups — no regex compilation.\n * SSR-safe: all DOM access is guarded by `typeof window` checks.\n */\n\nimport { signal, computed } from \"sinwan/reactivity\";\nimport type { Signal, Computed } from \"sinwan/reactivity\";\nimport type { SinwanComponent } from \"sinwan/component\";\nimport type {\n RouteDefinition,\n MatchedRoute,\n NavigateOptions,\n LazyComponent,\n LazyPeek,\n} from \"./types.ts\";\nimport {\n createRadixTree,\n radixInsert,\n radixSearch,\n normalizePath,\n extractSearchParams,\n type RadixNode,\n} from \"./matcher.ts\";\n\nfunction hasTrueFlag(value: object, key: string): boolean {\n return key in value && (value as Record<string, unknown>)[key] === true;\n}\n\n/**\n * True for explicit `lazy()` factories, `_SinwanLazy` brands, and zero-arg\n * `() => import(...)` loaders. `cc` components and functions that take props\n * are not treated as lazy importers.\n */\nexport function isLazyComponent(comp: unknown): comp is LazyComponent {\n if (typeof comp !== \"function\") return false;\n if (hasTrueFlag(comp, \"_SinwanComponent\")) return false;\n if (hasTrueFlag(comp, \"_SinwanLazy\")) return true;\n return comp.length === 0;\n}\n\n/** Mark a dynamic import factory as a lazy route component. */\nexport function lazy(\n loader: () => Promise<{ default: SinwanComponent }>,\n): LazyComponent {\n const factory = (): Promise<{ default: SinwanComponent }> => loader();\n return Object.assign(factory, { _SinwanLazy: true as const });\n}\n\n/** Internal leaf data stored in the radix tree. */\ninterface LeafData {\n route: RouteDefinition;\n fullPattern: string;\n /** Chain of (route, fullPattern) pairs from root to this leaf. */\n chain: { route: RouteDefinition; fullPattern: string }[];\n [key: string]: unknown;\n}\n\n/** The core router instance. */\nexport class Router {\n private readonly tree: RadixNode;\n private readonly routeList: RouteDefinition[];\n private readonly _path: Signal<string>;\n private readonly _searchParams: Signal<URLSearchParams>;\n private readonly _matched: Computed<MatchedRoute | null>;\n private readonly _params: Computed<Record<string, string>>;\n private readonly lazyCache = new Map<string, SinwanComponent>();\n private readonly lazyErrors = new Map<string, unknown>();\n private readonly lazyInflight = new Map<string, Promise<SinwanComponent>>();\n private readonly _lazyTick: Signal<number>;\n private popstateHandler: (() => void) | null = null;\n\n constructor(routes: RouteDefinition[], initialPath?: string) {\n this.tree = createRadixTree();\n this.routeList = [];\n this._lazyTick = signal(0);\n\n // Insert all routes (including nested) into the radix tree.\n // Static segments are inserted first so they're checked before\n // param segments during search (insertion order within siblings\n // determines search order, and static children are always checked\n // first in searchNode regardless).\n for (const route of routes) {\n this.insertRoute(route, \"\");\n }\n\n const startPath =\n initialPath ??\n (typeof window !== \"undefined\"\n ? window.location.pathname + window.location.search\n : \"/\");\n\n this._path = signal(normalizePath(startPath));\n this._searchParams = signal(extractSearchParams(startPath));\n\n this._matched = computed(() => {\n const path = normalizePath(this._path.value);\n const result = radixSearch(this.tree, path);\n if (!result) return null;\n\n const leaf = result.data as LeafData;\n const params = result.params;\n\n // Build the matched route chain (parent → child).\n // The returned matched route is the deepest (leaf) match,\n // with `parent` pointing up the chain to the root.\n let parent: MatchedRoute | undefined;\n let matched: MatchedRoute | undefined;\n for (let i = 0; i < leaf.chain.length; i++) {\n const entry = leaf.chain[i]!;\n const m: MatchedRoute = {\n route: entry.route,\n params,\n path,\n matchedPath: entry.fullPattern,\n parent: i > 0 ? parent : undefined,\n };\n parent = m;\n matched = m; // last one is the deepest\n }\n return matched ?? null;\n });\n\n this._params = computed(() => {\n const matched = this._matched.value;\n return matched ? matched.params : {};\n });\n\n // Listen to popstate on the client\n if (typeof window !== \"undefined\") {\n this.popstateHandler = () => {\n const url = window.location.pathname + window.location.search;\n this._path.value = normalizePath(url);\n this._searchParams.value = extractSearchParams(url);\n };\n window.addEventListener(\"popstate\", this.popstateHandler);\n }\n }\n\n /** Recursively insert a route and its children into the tree. */\n private insertRoute(\n route: RouteDefinition,\n parentPath: string,\n parentChain: { route: RouteDefinition; fullPattern: string }[] = [],\n ): void {\n const fullPattern = joinPaths(parentPath, route.path);\n const chain = [...parentChain, { route, fullPattern }];\n const leafData: LeafData = { route, fullPattern, chain };\n\n radixInsert(this.tree, fullPattern, leafData);\n this.routeList.push(route);\n\n if (route.children) {\n for (const child of route.children) {\n this.insertRoute(child, fullPattern, chain);\n }\n }\n }\n\n private bumpLazyTick(): void {\n this._lazyTick.value = this._lazyTick.value + 1;\n }\n\n /** Reactive counter bumped when a lazy load succeeds or fails. */\n get lazyTick(): number {\n return this._lazyTick.value;\n }\n\n /** Current load snapshot for a lazy cache key (pattern). */\n peekLazy(cacheKey: string): LazyPeek {\n const cached = this.lazyCache.get(cacheKey);\n if (cached) return { status: \"ready\", component: cached };\n if (this.lazyInflight.has(cacheKey)) return { status: \"loading\" };\n if (this.lazyErrors.has(cacheKey)) {\n return { status: \"error\", error: this.lazyErrors.get(cacheKey) };\n }\n return { status: \"idle\" };\n }\n\n /**\n * Start a lazy import if needed. Does not retry a stored error\n * (the outlet keeps showing the error UI until navigation or prefetch).\n */\n ensureLazy(cacheKey: string, loader: LazyComponent): void {\n const state = this.peekLazy(cacheKey);\n if (state.status !== \"idle\") return;\n this.startLazyLoad(cacheKey, loader);\n }\n\n private startLazyLoad(\n cacheKey: string,\n loader: LazyComponent,\n ): Promise<SinwanComponent> {\n this.lazyErrors.delete(cacheKey);\n const pending = loader()\n .then((mod) => {\n this.lazyCache.set(cacheKey, mod.default);\n this.lazyErrors.delete(cacheKey);\n this.bumpLazyTick();\n return mod.default;\n })\n .catch((err: unknown) => {\n this.lazyErrors.set(cacheKey, err);\n this.bumpLazyTick();\n throw err;\n })\n .finally(() => {\n this.lazyInflight.delete(cacheKey);\n });\n this.lazyInflight.set(cacheKey, pending);\n pending.catch(() => {\n /* prefetch / outlet consume errors via peekLazy */\n });\n return pending;\n }\n\n /** Current URL path (reactive). */\n get path(): string {\n return this._path.value;\n }\n\n /** Current path signal (for fine-grained reactivity). */\n get pathSignal(): Signal<string> {\n return this._path;\n }\n\n /** Current matched route (reactive). */\n get matched(): MatchedRoute | null {\n return this._matched.value;\n }\n\n /** Current matched route computed (for fine-grained reactivity). */\n get matchedComputed(): Computed<MatchedRoute | null> {\n return this._matched;\n }\n\n /** Current route parameters (reactive). */\n get params(): Record<string, string> {\n return this._params.value;\n }\n\n /** Current search params (reactive). */\n get searchParams(): URLSearchParams {\n return this._searchParams.value;\n }\n\n /** All registered routes. */\n get routes(): RouteDefinition[] {\n return this.routeList;\n }\n\n /** Navigate to a new path. */\n navigate(to: string, options: NavigateOptions = {}): void {\n const normalized = normalizePath(to);\n\n if (typeof window !== \"undefined\") {\n if (options.replace) {\n window.history.replaceState(options.state ?? {}, \"\", to);\n } else {\n window.history.pushState(options.state ?? {}, \"\", to);\n }\n }\n\n this._path.value = normalized;\n this._searchParams.value = extractSearchParams(to);\n }\n\n /** Prefetch a route's lazy component into this router's cache. */\n prefetch(path: string): void {\n if (typeof window === \"undefined\") return;\n\n const normalized = normalizePath(path);\n const result = radixSearch(this.tree, normalized);\n if (!result) return;\n\n const leaf = result.data as LeafData;\n const route = leaf.route;\n if (!isLazyComponent(route.component)) return;\n\n const cacheKey = leaf.fullPattern;\n const state = this.peekLazy(cacheKey);\n if (state.status === \"ready\" || state.status === \"loading\") return;\n this.startLazyLoad(cacheKey, route.component);\n }\n\n /** Resolve a lazy component, using this instance's cache if available. */\n async resolveComponent(\n route: RouteDefinition,\n ): Promise<SinwanComponent> {\n if (!isLazyComponent(route.component)) {\n return route.component;\n }\n\n const cacheKey = this.findFullPattern(route) ?? route.path;\n const cached = this.lazyCache.get(cacheKey);\n if (cached) return cached;\n\n const inflight = this.lazyInflight.get(cacheKey);\n if (inflight) return inflight;\n\n return this.startLazyLoad(cacheKey, route.component);\n }\n\n /** Find the full pattern for a route. */\n private findFullPattern(route: RouteDefinition): string | undefined {\n return this.searchForRoute(this.tree, route, \"\");\n }\n\n private searchForRoute(\n node: RadixNode,\n target: RouteDefinition,\n pathSoFar: string,\n ): string | undefined {\n if (node.route) {\n const leaf = node.route as LeafData;\n if (leaf.route === target) return leaf.fullPattern;\n }\n for (const child of node.children) {\n const seg = child.isParam\n ? \"/:\" + child.paramName\n : child.isWildcard\n ? \"/*\"\n : \"/\" + child.prefix;\n const found = this.searchForRoute(child, target, pathSoFar + seg);\n if (found) return found;\n }\n return undefined;\n }\n\n /** Clean up event listeners and drop this instance's lazy cache. */\n dispose(): void {\n if (this.popstateHandler && typeof window !== \"undefined\") {\n window.removeEventListener(\"popstate\", this.popstateHandler);\n this.popstateHandler = null;\n }\n this.lazyCache.clear();\n this.lazyErrors.clear();\n this.lazyInflight.clear();\n }\n}\n\n/** Join parent and child paths. */\nfunction joinPaths(parent: string, child: string): string {\n if (child === \"/\") return parent || \"/\";\n // Strip leading slash from child so it's always relative\n const relativeChild = child.startsWith(\"/\") ? child.slice(1) : child;\n if (parent === \"/\" || parent === \"\") return \"/\" + relativeChild;\n return parent + \"/\" + relativeChild;\n}\n\n/** Create a router instance. */\nexport function createRouter(\n routes: RouteDefinition[],\n initialPath?: string,\n): Router {\n return new Router(routes, initialPath);\n}\n",
|
|
6
6
|
"/**\n * Sinwan Router — Radix Tree Path Matching\n *\n * Segment-by-segment trie matching for O(depth) lookups.\n * No regex compilation — static segments are matched by direct\n * string comparison, params by position, and wildcards capture\n * the remaining path.\n *\n * Architecture mirrors the sinwan-engine HTTPRouter radix tree:\n * - Static children checked first (fast path)\n * - Param children checked second\n * - Wildcard children checked last (catch-all)\n */\n\n// ─── Radix Node ────────────────────────────────────────────\n\nexport interface RadixNode {\n /** Literal segment prefix, or `:param` / `*` marker. */\n prefix: string;\n /** Child nodes. */\n children: RadixNode[];\n /** Whether this node is a `:param` segment. */\n isParam: boolean;\n /** Param name (without the `:`). */\n paramName: string;\n /** Whether this node is a `*` wildcard. */\n isWildcard: boolean;\n /** Route data attached at this node (set at leaf). */\n route: RouteData | null;\n}\n\n/** Arbitrary data attached to a matched leaf node. */\nexport interface RouteData {\n [key: string]: unknown;\n}\n\nfunction createNode(prefix: string): RadixNode {\n return {\n prefix,\n children: [],\n isParam: prefix.startsWith(\":\"),\n paramName: prefix.startsWith(\":\") ? prefix.slice(1) : \"\",\n isWildcard: prefix === \"*\" || prefix.startsWith(\"*\"),\n route: null,\n };\n}\n\n// ─── Path Utilities ────────────────────────────────────────\n\n/**\n * Normalize a URL path: ensure leading slash, strip trailing slash\n * (except for root), and strip hash/query.\n */\nexport function normalizePath(path: string): string {\n // Strip query and hash\n const qIdx = path.indexOf(\"?\");\n if (qIdx !== -1) path = path.slice(0, qIdx);\n const hIdx = path.indexOf(\"#\");\n if (hIdx !== -1) path = path.slice(0, hIdx);\n\n // Ensure leading slash\n if (!path.startsWith(\"/\")) path = \"/\" + path;\n\n // Strip trailing slash (except root)\n if (path.length > 1 && path.endsWith(\"/\")) {\n path = path.slice(0, -1);\n }\n\n return path;\n}\n\n/** Split a path into segments, filtering empty strings. */\nfunction splitSegments(path: string): string[] {\n return path.split(\"/\").filter(Boolean);\n}\n\n/** Extract the search params from a URL string. */\nexport function extractSearchParams(path: string): URLSearchParams {\n const qIdx = path.indexOf(\"?\");\n if (qIdx === -1) return new URLSearchParams();\n return new URLSearchParams(path.slice(qIdx + 1));\n}\n\n// ─── Radix Insert ──────────────────────────────────────────\n\n/**\n * Insert a route into the radix tree.\n *\n * @param root The root node.\n * @param pattern Path pattern like `/users/:id` or `/files/*path`.\n * @param data Arbitrary data to attach at the leaf.\n */\nexport function radixInsert(\n root: RadixNode,\n pattern: string,\n data: RouteData,\n): void {\n const segments = splitSegments(normalizePath(pattern));\n insertNode(root, segments, 0, data);\n}\n\nfunction insertNode(\n node: RadixNode,\n segments: string[],\n depth: number,\n data: RouteData,\n): void {\n if (depth === segments.length) {\n node.route = data;\n return;\n }\n\n const seg = segments[depth];\n if (seg === undefined) return;\n\n // Wildcard child\n if (seg === \"*\" || seg.startsWith(\"*\")) {\n const existing = node.children.find((c) => c.isWildcard);\n if (existing) {\n insertNode(existing, segments, depth + 1, data);\n return;\n }\n const wc = createNode(seg);\n node.children.push(wc);\n insertNode(wc, segments, depth + 1, data);\n return;\n }\n\n // Param child\n if (seg.startsWith(\":\")) {\n const paramName = seg.slice(1);\n for (const child of node.children) {\n if (child.isParam && child.paramName === paramName) {\n insertNode(child, segments, depth + 1, data);\n return;\n }\n }\n const pc = createNode(seg);\n node.children.push(pc);\n insertNode(pc, segments, depth + 1, data);\n return;\n }\n\n // Static child\n for (const child of node.children) {\n if (child.isParam || child.isWildcard) continue;\n if (child.prefix === seg) {\n insertNode(child, segments, depth + 1, data);\n return;\n }\n }\n\n const sc = createNode(seg);\n node.children.push(sc);\n insertNode(sc, segments, depth + 1, data);\n}\n\n// ─── Radix Search ──────────────────────────────────────────\n\n/** Result of a radix search. */\nexport interface MatchResult {\n /** The data attached to the matched leaf node. */\n data: RouteData;\n /** Extracted path parameters. */\n params: Record<string, string>;\n /** The full pattern that was matched. */\n matchedPath: string;\n}\n\n/**\n * Search the radix tree for a matching route.\n *\n * Static segments are checked first (fast path), then param\n * segments, then wildcard segments (catch-all).\n *\n * @returns `MatchResult` if found, `null` otherwise.\n */\nexport function radixSearch(root: RadixNode, path: string): MatchResult | null {\n const segments = splitSegments(normalizePath(path));\n const params: Record<string, string> = Object.create(null);\n const result = searchNode(root, segments, 0, params, \"\");\n if (!result) return null;\n return result;\n}\n\nfunction searchNode(\n node: RadixNode,\n segments: string[],\n depth: number,\n params: Record<string, string>,\n pathSoFar: string,\n): MatchResult | null {\n // Reached the end of the path — check if this node has a route\n if (depth === segments.length) {\n if (node.route) {\n return {\n data: node.route,\n params: copyParams(params),\n matchedPath: pathSoFar,\n };\n }\n // Check for trailing wildcard (matches empty rest)\n for (const child of node.children) {\n if (child.isWildcard && child.route) {\n const paramName = child.prefix === \"*\" ? \"\" : child.prefix.slice(1);\n if (paramName) {\n params[paramName] = \"\";\n } else {\n params[\"_wildcard\"] = \"\";\n }\n return {\n data: child.route,\n params: copyParams(params),\n matchedPath: pathSoFar + \"/*\",\n };\n }\n }\n return null;\n }\n\n const seg = segments[depth];\n if (seg === undefined) return null;\n\n // 1) Static children (fast path)\n for (const child of node.children) {\n if (child.isParam || child.isWildcard) continue;\n if (child.prefix !== seg) continue;\n const found = searchNode(\n child,\n segments,\n depth + 1,\n params,\n pathSoFar + \"/\" + child.prefix,\n );\n if (found) return found;\n }\n\n // 2) Param children\n for (const child of node.children) {\n if (!child.isParam) continue;\n params[child.paramName] = decodeURIComponent(seg);\n const found = searchNode(\n child,\n segments,\n depth + 1,\n params,\n pathSoFar + \"/:\" + child.paramName,\n );\n if (found) return found;\n delete params[child.paramName];\n }\n\n // 3) Wildcard children (catch-all)\n for (const child of node.children) {\n if (!child.isWildcard) continue;\n if (!child.route) continue;\n const rest = wildcardValue(segments, depth);\n // Extract param name: \"*\" → \"_wildcard\", \"*path\" → \"path\"\n const paramName = child.prefix === \"*\" ? \"\" : child.prefix.slice(1);\n if (paramName) {\n params[paramName] = rest;\n } else {\n params[\"_wildcard\"] = rest;\n }\n return {\n data: child.route,\n params: copyParams(params),\n matchedPath: pathSoFar + \"/*\",\n };\n }\n\n return null;\n}\n\n/** Build the wildcard value from remaining segments. */\nfunction wildcardValue(segments: string[], depth: number): string {\n let rest = \"\";\n for (let i = depth; i < segments.length; i += 1) {\n const seg = segments[i];\n if (seg === undefined || seg === \"\") continue;\n if (rest === \"\") rest = seg;\n else rest += \"/\" + seg;\n }\n return rest;\n}\n\n/** Fast key-by-key copy of params. */\nfunction copyParams(src: Record<string, string>): Record<string, string> {\n const dst: Record<string, string> = Object.create(null);\n for (const key in src) dst[key] = src[key]!;\n return dst;\n}\n\n// ─── Radix Tree Factory ────────────────────────────────────\n\n/** Create a new empty radix tree root. */\nexport function createRadixTree(): RadixNode {\n return createNode(\"\");\n}\n\n// ─── Build Path (still useful for programmatic URL construction) ─\n\n/**\n * Build a path from a pattern and params.\n *\n * @example\n * ```ts\n * buildPath(\"/users/:id\", { id: \"42\" }); // \"/users/42\"\n * ```\n */\nexport function buildPath(\n pattern: string,\n params: Record<string, string> = {},\n): string {\n return pattern.replace(/:(\\w+)/g, (_match, name: string) => {\n const value = params[name];\n if (value === undefined) {\n throw new Error(`Missing param \"${name}\" for pattern \"${pattern}\"`);\n }\n return encodeURIComponent(value);\n });\n}\n",
|
|
7
|
-
"import { _$createTemplate } from \"sinwan/renderer\";\nconst _$tmpl_0 = {\n html: \"<a href=\\\"\\\" class=\\\"\\\" target=\\\"\\\" download=\\\"\\\" rel=\\\"\\\" onclick=\\\"\\\" onmouseenter=\\\"\\\"><!--s:0--></a>\",\n slots: [{\n path: [],\n type: \"attr\",\n name: \"href\"\n }, {\n path: [],\n type: \"attr\",\n name: \"class\"\n }, {\n path: [],\n type: \"attr\",\n name: \"target\"\n }, {\n path: [],\n type: \"attr\",\n name: \"download\"\n }, {\n path: [],\n type: \"attr\",\n name: \"rel\"\n }, {\n path: [],\n type: \"event\",\n name: \"onclick\"\n }, {\n path: [],\n type: \"event\",\n name: \"onmouseenter\"\n }, {\n path: [0],\n type: \"child\"\n }]\n};\nconst _$tmpl_1 = {\n html: \"<a href=\\\"\\\" class=\\\"\\\" target=\\\"\\\" download=\\\"\\\" rel=\\\"\\\" onclick=\\\"\\\" onmouseenter=\\\"\\\"><!--s:0--></a>\",\n slots: [{\n path: [],\n type: \"attr\",\n name: \"href\"\n }, {\n path: [],\n type: \"attr\",\n name: \"class\"\n }, {\n path: [],\n type: \"attr\",\n name: \"target\"\n }, {\n path: [],\n type: \"attr\",\n name: \"download\"\n }, {\n path: [],\n type: \"attr\",\n name: \"rel\"\n }, {\n path: [],\n type: \"event\",\n name: \"onclick\"\n }, {\n path: [],\n type: \"event\",\n name: \"onmouseenter\"\n }, {\n path: [0],\n type: \"child\"\n }]\n};\nconst _$tmpl_2 = {\n html: \"<div>404 - Page not found</div>\",\n slots: []\n};\nconst _$tmpl_3 = {\n html: \"<div>Loading...</div>\",\n slots: []\n};\nconst _$tmpl_4 = {\n html: \"<div>Failed to load page</div>\",\n slots: []\n};\n/**\n * Sinwan Router — Components\n *\n * Link, NavLink, and RouterOutlet that use useRouter() internally.\n * The router instance must be provided via provide(RouterKey, router).\n */\n\nimport { cc } from \"sinwan/component\";\nimport { Key } from \"sinwan/component\";\nimport type { SinwanComponent, SinwanNode } from \"sinwan/component\";\nimport { computed } from \"sinwan/reactivity\";\nimport { useRouter } from \"./hooks.ts\";\nimport { isLazyComponent } from \"./router.ts\";\nimport type { Router } from \"./router.ts\";\nimport type { MatchedRoute } from \"./types.ts\";\nimport { jsxClass, shouldInterceptLinkClick, type LinkInterceptOptions } from \"./link-nav.ts\";\nimport { computeOutletKey, getMatchAtDepth } from \"./outlet.ts\";\n\n// ─── Link ──────────────────────────────────────────────────\n\nexport interface LinkProps {\n href: string;\n prefetch?: boolean;\n class?: string;\n children?: SinwanNode;\n target?: string;\n download?: string | boolean;\n rel?: string;\n}\nfunction onLinkClick(event: MouseEvent, href: string, router: Router, options: LinkInterceptOptions): void {\n if (!shouldInterceptLinkClick(event, href, router.path, options)) return;\n event.preventDefault();\n router.navigate(href);\n}\nfunction downloadAttr(download: string | boolean | undefined): string | undefined {\n if (download === undefined || download === false) return undefined;\n if (download === true) return \"\";\n return download;\n}\n\n/**\n * Link — client-side navigation anchor.\n * Uses the router from context (provide(RouterKey, router)).\n */\nexport const Link = cc<LinkProps>(({\n href,\n prefetch = true,\n class: cls,\n children,\n target,\n download,\n rel\n}) => {\n const router = useRouter();\n return _$createTemplate(_$tmpl_0, [href, cls, target, downloadAttr(download), rel, (e: MouseEvent) => {\n onLinkClick(e, href, router, {\n target,\n download\n });\n }, () => {\n if (prefetch) router.prefetch(href);\n }, children]);\n});\n\n// ─── NavLink ───────────────────────────────────────────────\n\nexport interface NavLinkProps extends LinkProps {\n activeClass?: string;\n}\n\n/**\n * NavLink — Link with active state styling.\n * Uses the router from context.\n */\nexport const NavLink = cc<NavLinkProps>(({\n href,\n prefetch = true,\n activeClass = \"active\",\n class: cls,\n children,\n target,\n download,\n rel\n}) => {\n const router = useRouter();\n const className = computed(() => router.path === href || router.path.startsWith(href + \"/\") ? `${cls ?? \"\"} ${activeClass}`.trim() : cls ?? \"\");\n return _$createTemplate(_$tmpl_1, [href, jsxClass(() => className.value), target, downloadAttr(download), rel, (e: MouseEvent) => {\n onLinkClick(e, href, router, {\n target,\n download\n });\n }, () => {\n if (prefetch) router.prefetch(href);\n }, children]);\n});\n\n// ─── RouterOutlet ──────────────────────────────────────────\n\nexport interface RouterOutletProps {\n fallback?: SinwanComponent;\n notFound?: SinwanComponent;\n error?: SinwanComponent<{\n error?: unknown;\n }>;\n /** Depth of this outlet (0 = top-level, 1 = nested in parent route). */\n depth?: number;\n}\nconst DefaultNotFound = cc(() => _$createTemplate(_$tmpl_2, []));\nconst DefaultLoading = cc(() => _$createTemplate(_$tmpl_3, []));\nconst DefaultError = cc<{\n error?: unknown;\n}>(() => _$createTemplate(_$tmpl_4, []));\nfunction resolveOutletNode(matched: MatchedRoute, router: Router, fallback: SinwanComponent, errorComp: SinwanComponent<{\n error?: unknown;\n}>): SinwanNode {\n const route = matched.route;\n if (!isLazyComponent(route.component)) {\n const Comp = route.component;\n return <Comp />;\n }\n const cacheKey = matched.matchedPath;\n const state = router.peekLazy(cacheKey);\n if (state.status === \"ready\") {\n const Comp = state.component;\n return <Comp />;\n }\n if (state.status === \"error\") {\n const ErrorView = errorComp;\n return <ErrorView error={state.error} />;\n }\n router.ensureLazy(cacheKey, route.component);\n const Fallback = fallback;\n return <Fallback />;\n}\n\n/**\n * RouterOutlet — renders the matched route's component at a given depth.\n * For nested routes, place a <RouterOutlet /> inside the parent component.\n * Uses the router from context.\n */\nexport const RouterOutlet = cc<RouterOutletProps>(({\n fallback,\n notFound,\n error,\n depth = 0\n}) => {\n const router = useRouter();\n const Fallback = fallback ?? DefaultLoading;\n const NotFound = notFound ?? DefaultNotFound;\n const ErrorView = error ?? DefaultError;\n return <Key when={() => computeOutletKey(router, depth)}>\n {() => {\n const matched = getMatchAtDepth(router.matched, depth);\n if (!matched) {\n if (depth > 0) return null;\n return <NotFound />;\n }\n return resolveOutletNode(matched, router, Fallback, ErrorView);\n }}\n </Key>;\n});",
|
|
7
|
+
"import { _$createTemplate } from \"sinwan/renderer/web\";\n\nconst _$tmpl_0 = {\n\thtml: \"<div role=\\\"main\\\" aria-labelledby=\\\"sinwan-router-not-found-title\\\" style=\\\"\\\"><div style=\\\"\\\"><p aria-hidden=\\\"true\\\" style=\\\"\\\">404</p><h1 id=\\\"sinwan-router-not-found-title\\\" style=\\\"\\\">Page not found</h1><p style=\\\"\\\">No route matches<!--s:0--><code style=\\\"\\\"></code>.</p><!--s:2--></div></div>\",\n\tslots: [\n\t\t{ path: [], type: \"attr\", name: \"style\" },\n\t\t{ path: [0], type: \"attr\", name: \"style\" },\n\t\t{ path: [0, 0], type: \"attr\", name: \"style\" },\n\t\t{ path: [0, 1], type: \"attr\", name: \"style\" },\n\t\t{ path: [0, 2], type: \"attr\", name: \"style\" },\n\t\t{ path: [0, 2, 1], type: \"child\" },\n\t\t{ path: [0, 2, 2], type: \"attr\", name: \"style\" },\n\t\t{ path: [0, 2, 2], type: \"child\" },\n\t\t{ path: [0, 3], type: \"child\" }\n\t]\n};\n\nconst _$tmpl_1 = {\n\thtml: \"<div role=\\\"status\\\" aria-live=\\\"polite\\\" style=\\\"\\\"><div style=\\\"\\\">Loading...</div></div>\",\n\tslots: [\n\t\t{ path: [], type: \"attr\", name: \"style\" },\n\t\t{ path: [0], type: \"attr\", name: \"style\" }\n\t]\n};\n\nconst _$tmpl_2 = {\n\thtml: \"<div role=\\\"alert\\\" style=\\\"\\\"><div style=\\\"\\\">Failed to load page</div></div>\",\n\tslots: [\n\t\t{ path: [], type: \"attr\", name: \"style\" },\n\t\t{ path: [0], type: \"attr\", name: \"style\" }\n\t]\n};\n\n/**\n * Sinwan Router — Components\n *\n * Link, NavLink, and RouterOutlet that use useRouter() internally.\n * The router instance must be provided via provide(RouterKey, router).\n */\nimport { cc, getRawProps } from \"sinwan/component\";\n\nimport { Key } from \"sinwan/control-flow\";\nimport type { SinwanComponent, SinwanNode } from \"sinwan/component\";\nimport { computed } from \"sinwan/reactivity\";\nimport { useRouter } from \"./hooks.ts\";\nimport { isLazyComponent } from \"./router.ts\";\nimport type { Router } from \"./router.ts\";\nimport type { MatchedRoute } from \"./types.ts\";\nimport { shouldInterceptLinkClick, type LinkInterceptOptions } from \"./link-nav.ts\";\nimport { computeOutletKey, getMatchAtDepth } from \"./outlet.ts\";\n\n// ─── Link ──────────────────────────────────────────────────\n/**\n * Anchor props for client navigation. Extra keys (data-*, aria-*, ref,\n * mouse/focus handlers) are forwarded so Slot / asChild parents can merge\n * onto the real `<a>` (e.g. SidebarMenuButton tooltip).\n */\nexport type LinkProps = \n\t{ \n\t\thref: string;\n\t\tprefetch?: boolean;\n\t\tclass?: string;\n\t\tchildren?: SinwanNode;\n\t\ttarget?: string;\n\t\tdownload?: string | boolean;\n\t\trel?: string;\n\t\tonclick?: (event: MouseEvent) => void;\n\t\tonmouseenter?: (event: MouseEvent) => void\n\t } &\n\tRecord<string, unknown>;\n\nconst LINK_OWN_KEYS = new Set([\n\t\"href\",\n\t\"prefetch\",\n\t\"class\",\n\t\"children\",\n\t\"target\",\n\t\"download\",\n\t\"rel\",\n\t\"onclick\",\n\t\"onmouseenter\"\n]);\n\nfunction linkPassthrough(props: LinkProps): Record<string, unknown> {\n\tconst raw = getRawProps(props) as Record<string, unknown>;\n\tconst rest: Record<string, unknown> = {};\n\n\tfor (const key of Object.keys(raw)) {\n\t\tif (!LINK_OWN_KEYS.has(key)) rest[key] = raw[key];\n\t}\n\n\treturn rest;\n}\n\nfunction onLinkClick(\n\tevent: MouseEvent,\n\thref: string,\n\trouter: Router,\n\toptions: LinkInterceptOptions\n): void {\n\tif (!shouldInterceptLinkClick(event, href, router.path, options)) return;\n\n\tevent.preventDefault();\n\trouter.navigate(href);\n}\n\nfunction downloadAttr(download: string | boolean | undefined): string | undefined {\n\tif (download === undefined || download === false) return undefined;\n\tif (download === true) return \"\";\n\n\treturn download;\n}\n\n/**\n * Link — client-side navigation anchor.\n * Uses the router from context (provide(RouterKey, router)).\n */\nexport const Link = cc<LinkProps>((props) => {\n\tconst {\n\t\thref,\n\t\tprefetch = true,\n\t\tclass: cls,\n\t\tchildren,\n\t\ttarget,\n\t\tdownload,\n\t\trel,\n\t\tonclick,\n\t\tonmouseenter\n\t} = props;\n\n\tconst router = useRouter();\n\tconst rest = linkPassthrough(props);\n\n\treturn (<a {...rest} href={href} class={cls} target={target} download={downloadAttr(download)} rel={rel} onclick={(e: MouseEvent) => {\n\t\tonLinkClick(e, href, router, { target, download });\n\t\tonclick?.(e);\n\t}} onmouseenter={(e: MouseEvent) => {\n\t\tif (prefetch) router.prefetch(href);\n\n\t\tonmouseenter?.(e);\n\t}}>\n {children}\n </a>);\n});\n\n// ─── NavLink ───────────────────────────────────────────────\nexport type NavLinkClassOptions = { isActive: boolean };\n\nexport type NavLinkClassFunction = (options: NavLinkClassOptions) => string | false | null | undefined;\n\nexport type NavLinkProps = \n\t{ \n\t\thref: string;\n\t\tprefetch?: boolean;\n\t\t/**\n\t\t * Static class string, or a callback that receives `{ isActive }` so\n\t\t * active/inactive styles never share conflicting Tailwind utilities.\n\t\t * When omitted, active links get the class `\"active\"` (CSS templates).\n\t\t */\n\t\tclass?: string | NavLinkClassFunction;\n\t\tchildren?: SinwanNode;\n\t\ttarget?: string;\n\t\tdownload?: string | boolean;\n\t\trel?: string;\n\t\tonclick?: (event: MouseEvent) => void;\n\t\tonmouseenter?: (event: MouseEvent) => void\n\t } &\n\tRecord<string, unknown>;\n\nfunction isNavLinkActive(path: string, href: string): boolean {\n\treturn path === href || path.startsWith(href + \"/\");\n}\n\nfunction resolveNavLinkClass(\n\tcls: string | NavLinkClassFunction | undefined,\n\tisActive: boolean\n): string {\n\tif (typeof cls === \"function\") {\n\t\treturn (cls({ isActive }) || \"\").trim();\n\t}\n\n\tif (cls != null && cls !== \"\") {\n\t\treturn cls;\n\t}\n\n\treturn isActive ? \"active\" : \"\";\n}\n\n/**\n * NavLink — Link with active state styling.\n * Uses the router from context.\n */\nexport const NavLink = cc<NavLinkProps>((props) => {\n\tconst {\n\t\thref,\n\t\tprefetch = true,\n\t\tclass: cls,\n\t\tchildren,\n\t\ttarget,\n\t\tdownload,\n\t\trel,\n\t\tonclick,\n\t\tonmouseenter\n\t} = props;\n\n\tconst router = useRouter();\n\tconst rest = linkPassthrough(props as LinkProps);\n\tconst className = computed(() => resolveNavLinkClass(cls, isNavLinkActive(router.path, href)));\n\n\treturn (<a {...rest} href={href} class={className} target={target} download={downloadAttr(download)} rel={rel} onclick={(e: MouseEvent) => {\n\t\tonLinkClick(e, href, router, { target, download });\n\t\tonclick?.(e);\n\t}} onmouseenter={(e: MouseEvent) => {\n\t\tif (prefetch) router.prefetch(href);\n\n\t\tonmouseenter?.(e);\n\t}}>\n {children}\n </a>);\n});\n\n// ─── RouterOutlet ──────────────────────────────────────────\nexport interface RouterOutletProps {\n\tfallback?: SinwanComponent;\n\tnotFound?: SinwanComponent;\n\terror?: SinwanComponent<{ error?: unknown }>;\n\t/** Depth of this outlet (0 = top-level, 1 = nested in parent route). */ depth?: number\n}\n\n/** Credit Blue palette (sinwan-ui default) — inline so the router needs no CSS import. */ const creditBlue = {\n\tbackground: \"oklch(0.98 0.004 250)\",\n\tforeground: \"oklch(0.18 0.03 255)\",\n\tprimary: \"oklch(0.55 0.22 262)\",\n\tprimaryForeground: \"oklch(0.98 0.01 250)\",\n\tsecondary: \"oklch(0.9 0.04 262)\",\n\tsecondaryForeground: \"oklch(0.3 0.09 262)\",\n\ttertiary: \"oklch(0.72 0.14 230)\",\n\tmuted: \"oklch(0.96 0.006 250)\",\n\tmutedForeground: \"oklch(0.5 0.02 255)\",\n\tcard: \"oklch(1 0 0)\",\n\tborder: \"oklch(0.9 0.01 255)\",\n\tradius: \"0.625rem\",\n\tambientBackground: [\n\t\t\"radial-gradient(110% 85% at 0% 0%, oklch(0.72 0.14 230 / 0.08), transparent 60%)\",\n\t\t\"radial-gradient(110% 85% at 100% 0%, oklch(0.55 0.22 262 / 0.07), transparent 60%)\",\n\t\t\"radial-gradient(110% 85% at 100% 100%, oklch(0.72 0.14 230 / 0.08), transparent 60%)\",\n\t\t\"radial-gradient(110% 85% at 0% 100%, oklch(0.55 0.22 262 / 0.06), transparent 60%)\",\n\t\t\"oklch(0.98 0.004 250)\"\n\t].join(\", \"),\n\tbrandGradient: \"linear-gradient(150deg, oklch(0.72 0.14 230) 10%, oklch(0.55 0.22 262) 100%)\"\n} as const;\n\nconst defaultNotFoundShellStyle = {\n\tminHeight: \"100vh\",\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\tpadding: \"2.5rem 1.25rem\",\n\tboxSizing: \"border-box\",\n\tbackground: creditBlue.ambientBackground,\n\tcolor: creditBlue.foreground,\n\tfontFamily: 'ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif'\n} as const;\n\nconst defaultNotFoundCardStyle = {\n\tmaxWidth: \"28rem\",\n\twidth: \"100%\",\n\ttextAlign: \"center\",\n\tpadding: \"2.25rem 1.75rem\",\n\tborderRadius: \"calc(0.625rem * 1.4)\",\n\tbackground: creditBlue.card,\n\tborder: `1px solid ${creditBlue.border}`,\n\tboxShadow: \"0 18px 50px oklch(0.55 0.22 262 / 0.08)\"\n} as const;\n\nconst defaultNotFoundCodeStyle = {\n\tdisplay: \"inline-block\",\n\tmargin: \"0 0.15em\",\n\tpadding: \"0.12em 0.4em\",\n\tborderRadius: \"calc(0.625rem * 0.6)\",\n\tbackground: creditBlue.muted,\n\tcolor: creditBlue.secondaryForeground,\n\tfontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\n\tfontSize: \"0.88em\",\n\twordBreak: \"break-all\"\n} as const;\n\nconst defaultNotFoundLinkStyle = {\n\tdisplay: \"inline-block\",\n\tpadding: \"0.65rem 1.2rem\",\n\tborderRadius: creditBlue.radius,\n\tbackground: creditBlue.brandGradient,\n\tcolor: creditBlue.primaryForeground,\n\ttextDecoration: \"none\",\n\tfontSize: \"0.9rem\",\n\tfontWeight: 600,\n\tletterSpacing: \"0.01em\",\n\tboxShadow: \"0 8px 20px oklch(0.55 0.22 262 / 0.28)\"\n} as const;\n\n/** Built-in 404 when `notFound` is omitted from `RouterOutlet` / `Routes`. */ const DefaultNotFound = cc(() => {\n\tconst router = useRouter();\n\n\treturn (_$createTemplate(_$tmpl_0, [\n\t\tdefaultNotFoundShellStyle,\n\t\tdefaultNotFoundCardStyle,\n\t\t{\n\t\t\tmargin: \"0 0 0.85rem\",\n\t\t\tfontSize: \"clamp(3.5rem, 12vw, 5rem)\",\n\t\t\tfontWeight: 700,\n\t\t\tletterSpacing: \"-0.06em\",\n\t\t\tlineHeight: 1,\n\t\t\tbackground: creditBlue.brandGradient,\n\t\t\tbackgroundClip: \"text\",\n\t\t\tWebkitBackgroundClip: \"text\",\n\t\t\tcolor: \"transparent\"\n\t\t},\n\n\t\t{\n\t\t\tmargin: \"0 0 0.75rem\",\n\t\t\tfontSize: \"1.5rem\",\n\t\t\tfontWeight: 600,\n\t\t\tletterSpacing: \"-0.02em\",\n\t\t\tcolor: creditBlue.foreground\n\t\t},\n\n\t\t{\n\t\t\tmargin: \"0 0 1.75rem\",\n\t\t\tfontSize: \"0.95rem\",\n\t\t\tlineHeight: 1.55,\n\t\t\tcolor: creditBlue.mutedForeground\n\t\t},\n\t\t\" \",\n\t\tdefaultNotFoundCodeStyle,\n\t\t() => router.path,\n\t\t<Link href=\"/\" style={defaultNotFoundLinkStyle}>\n Back to home\n </Link>\n\t]));\n});\n\nconst defaultStatusShellStyle = {\n\tminHeight: \"100vh\",\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\tpadding: \"2rem 1.25rem\",\n\tboxSizing: \"border-box\",\n\tbackground: creditBlue.ambientBackground,\n\tcolor: creditBlue.foreground,\n\tfontFamily: 'ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif'\n} as const;\n\nconst defaultStatusCardStyle = {\n\tpadding: \"1.25rem 1.5rem\",\n\tborderRadius: creditBlue.radius,\n\tbackground: creditBlue.card,\n\tborder: `1px solid ${creditBlue.border}`,\n\tcolor: creditBlue.secondaryForeground,\n\tfontSize: \"0.95rem\",\n\tfontWeight: 500,\n\tboxShadow: \"0 12px 32px oklch(0.55 0.22 262 / 0.06)\"\n} as const;\n\nconst DefaultLoading = cc(() => (_$createTemplate(_$tmpl_1, [defaultStatusShellStyle, defaultStatusCardStyle])));\n\nconst DefaultError = cc<{ error?: unknown }>(() => (_$createTemplate(_$tmpl_2, [\n\tdefaultStatusShellStyle,\n\t{\n\t\t...defaultStatusCardStyle,\n\t\tborderColor: \"oklch(0.55 0.22 262 / 0.35)\",\n\t\tcolor: creditBlue.foreground\n\t}\n])));\n\nfunction resolveOutletNode(\n\tmatched: MatchedRoute,\n\trouter: Router,\n\tfallback: SinwanComponent,\n\terrorComp: SinwanComponent<{ error?: unknown }>\n): SinwanNode {\n\tconst route = matched.route;\n\n\tif (!isLazyComponent(route.component)) {\n\t\tconst Comp = route.component;\n\n\t\treturn <Comp />;\n\t}\n\n\tconst cacheKey = matched.matchedPath;\n\tconst state = router.peekLazy(cacheKey);\n\n\tif (state.status === \"ready\") {\n\t\tconst Comp = state.component;\n\n\t\treturn <Comp />;\n\t}\n\n\tif (state.status === \"error\") {\n\t\tconst ErrorView = errorComp;\n\n\t\treturn <ErrorView error={state.error} />;\n\t}\n\n\trouter.ensureLazy(cacheKey, route.component);\n\n\tconst Fallback = fallback;\n\n\treturn <Fallback />;\n}\n\n/**\n * RouterOutlet — renders the matched route's component at a given depth.\n * For nested routes, place a <RouterOutlet /> inside the parent component.\n * Uses the router from context.\n */\nexport const RouterOutlet = cc<RouterOutletProps>((props) => {\n\tconst router = useRouter();\n\tconst Fallback = () => props.fallback ?? DefaultLoading;\n\tconst NotFound = props.notFound ?? DefaultNotFound;\n\tconst ErrorView = () => props.error ?? DefaultError;\n\n\t// Arity ≥ 1: Key remount render-prop (not a reactive SinwanNode getter).\n\t// Zero-arity `() =>` remounts the layout on every `matched` change.\n\treturn (<Key when={() => computeOutletKey(router, props.depth === void 0 ? 0 : props.depth)}>\n {(_identity) => {\n\t\t\tconst matched = getMatchAtDepth(router.matched, props.depth === void 0 ? 0 : props.depth);\n\n\t\t\tif (!matched) {\n\t\t\t\tif ((props.depth === void 0 ? 0 : props.depth) > 0) return null;\n\n\t\t\t\treturn <NotFound />;\n\t\t\t}\n\n\t\t\treturn resolveOutletNode(matched, router, Fallback(), ErrorView());\n\t\t}}\n </Key>);\n});",
|
|
8
8
|
"/**\n * Sinwan Router — Hooks\n *\n * Reactive hooks for accessing router state inside components.\n * Must be called within a component that has a Router in context.\n */\n\nimport { inject } from \"sinwan/component\";\nimport type { InjectionKey } from \"sinwan/component\";\nimport type { Router } from \"./router.ts\";\nimport type { RouterContextValue, NavigateOptions } from \"./types.ts\";\n\n/** Injection key for the router instance. */\nexport const RouterKey: InjectionKey<Router> = Symbol(\"sinwan.router\");\n\n/**\n * Access the router instance.\n *\n * @example\n * ```tsx\n * const router = useRouter();\n * router.navigate(\"/about\");\n * ```\n */\nexport function useRouter(): Router {\n const router = inject(RouterKey);\n if (!router) {\n throw new Error(\"useRouter() called outside of a Router provider.\");\n }\n return router;\n}\n\n/**\n * Get the current route parameters.\n *\n * @example\n * ```tsx\n * const params = useParams();\n * console.log(params.id); // \"42\" for /users/42\n * ```\n */\nexport function useParams(): Record<string, string> {\n return useRouter().params;\n}\n\n/**\n * Get the current search params (query string).\n *\n * @example\n * ```tsx\n * const searchParams = useSearchParams();\n * console.log(searchParams.get(\"q\")); // \"hello\" for /search?q=hello\n * ```\n */\nexport function useSearchParams(): URLSearchParams {\n return useRouter().searchParams;\n}\n\n/**\n * Get the current matched route.\n *\n * @example\n * ```tsx\n * const route = useRoute();\n * if (route) {\n * console.log(route.path, route.params);\n * }\n * ```\n */\nexport function useRoute() {\n return useRouter().matched;\n}\n\n/**\n * Get a navigate function.\n *\n * @example\n * ```tsx\n * const navigate = useNavigate();\n * navigate(\"/users/42\");\n * navigate(\"/login\", { replace: true });\n * ```\n */\nexport function useNavigate(): (to: string, options?: NavigateOptions) => void {\n const router = useRouter();\n return router.navigate.bind(router);\n}\n\n/**\n * Get the current path.\n *\n * @example\n * ```tsx\n * const path = usePath();\n * console.log(path); // \"/users/42\"\n * ```\n */\nexport function usePath(): string {\n return useRouter().path;\n}\n",
|
|
9
|
-
"/**\n * Link click interception
|
|
9
|
+
"/**\n * Link click interception.\n */\n\n/** Fields read from a click event to decide client-side navigation. */\nexport interface LinkClickEvent {\n button: number;\n ctrlKey: boolean;\n metaKey: boolean;\n shiftKey: boolean;\n altKey: boolean;\n defaultPrevented: boolean;\n}\n\nexport interface LinkInterceptOptions {\n target?: string;\n download?: string | boolean;\n}\n\n/** True when the href should be left to the browser (other origin or scheme). */\nexport function isExternalHref(href: string): boolean {\n if (href.startsWith(\"//\")) return true;\n const colon = href.indexOf(\":\");\n if (colon <= 0) return false;\n const slash = href.indexOf(\"/\");\n if (slash !== -1 && slash < colon) return false;\n return true;\n}\n\n/** True when the href is an in-page hash (no path change). */\nexport function isHashOnlyHref(href: string, currentPath: string): boolean {\n if (href.startsWith(\"#\")) return true;\n const hashIdx = href.indexOf(\"#\");\n if (hashIdx === -1) return false;\n const beforeHash = href.slice(0, hashIdx);\n if (beforeHash === \"\") return true;\n const qIdx = beforeHash.indexOf(\"?\");\n const pathPart = qIdx === -1 ? beforeHash : beforeHash.slice(0, qIdx);\n if (pathPart === \"\" || pathPart === \".\") return true;\n const normalized =\n pathPart.startsWith(\"/\") ? pathPart : \"/\" + pathPart;\n const stripped =\n normalized.length > 1 && normalized.endsWith(\"/\")\n ? normalized.slice(0, -1)\n : normalized;\n return stripped === currentPath;\n}\n\n/** Whether this click should be handled by the client router. */\nexport function shouldInterceptLinkClick(\n event: LinkClickEvent,\n href: string,\n currentPath: string,\n options: LinkInterceptOptions = {},\n): boolean {\n if (event.defaultPrevented) return false;\n if (event.button !== 0) return false;\n if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) {\n return false;\n }\n if (options.target != null && options.target !== \"\" && options.target !== \"_self\") {\n return false;\n }\n if (options.download !== undefined && options.download !== false) {\n return false;\n }\n if (isExternalHref(href)) return false;\n if (isHashOnlyHref(href, currentPath)) return false;\n return true;\n}\n",
|
|
10
10
|
"/**\n * Nested-outlet matching and Key identity.\n */\n\nimport { isLazyComponent } from \"./router.ts\";\nimport type { Router } from \"./router.ts\";\nimport type { MatchedRoute } from \"./types.ts\";\n\n/**\n * Walk the matched route chain to a specific depth.\n * depth=0 → root match, depth=1 → first child, etc.\n */\nexport function getMatchAtDepth(\n matched: MatchedRoute | null,\n depth: number,\n): MatchedRoute | null {\n if (!matched) return null;\n let current: MatchedRoute | undefined = matched;\n const chain: MatchedRoute[] = [];\n while (current) {\n chain.unshift(current);\n current = current.parent;\n }\n return chain[depth] ?? null;\n}\n\n/**\n * Stable identity for a match at one outlet depth.\n * Parent layouts ignore child param changes; param routes include their values.\n */\nexport function routeIdentity(matched: MatchedRoute): string {\n const pattern = matched.matchedPath;\n if (pattern.includes(\"*\")) {\n return matched.path;\n }\n let concrete = pattern;\n for (const key of Object.keys(matched.params)) {\n const value = matched.params[key];\n if (value === undefined) continue;\n concrete = concrete.replace(\":\" + key, encodeURIComponent(value));\n }\n if (concrete.includes(\":\")) {\n return matched.path;\n }\n return concrete;\n}\n\nfunction lazyStatusSuffix(router: Router, matched: MatchedRoute): string {\n if (!isLazyComponent(matched.route.component)) return \"sync\";\n const state = router.peekLazy(matched.matchedPath);\n return state.status;\n}\n\n/**\n * Key value for `<Key>` at an outlet depth.\n * Reads `lazyTick` so load completion re-evaluates without a same-path navigate.\n * Unchanged identities do not remount parent layouts.\n */\nexport function computeOutletKey(router: Router, depth: number): string {\n void router.lazyTick;\n const matched = getMatchAtDepth(router.matched, depth);\n if (!matched) {\n return depth > 0 ? `__empty:${depth}` : \"__notfound__\";\n }\n return `${routeIdentity(matched)}:${lazyStatusSuffix(router, matched)}`;\n}\n",
|
|
11
|
-
"/**\n * JSX <Routes> / <Route> — the same fields as RouteDefinition.\n */\
|
|
11
|
+
"import { unwrap as _$unwrap } from \"sinwan/reactivity\";\n\n/**\n * JSX <Routes> / <Route> — the same fields as RouteDefinition.\n */\nimport { cc, provide, onDispose } from \"sinwan/component\";\n\nimport type { SinwanComponent, SinwanElement, SinwanNode } from \"sinwan/component\";\nimport { createRouter } from \"./router.ts\";\nimport { RouterOutlet } from \"./components.tsx\";\nimport { RouterKey } from \"./hooks.ts\";\nimport type { RouteComponent, RouteDefinition } from \"./types.ts\";\n\nexport const ROUTE_TYPE = Symbol.for(\"sinwan.router.Route\");\n\n/**\n * JSX props match {@link RouteDefinition}.\n * `children` may be nested `<Route>` elements or a `RouteDefinition[]`.\n */\nexport type RouteProps = \n\tOmit<RouteDefinition, \"children\"> &\n\t{ children?: RouteDefinition | RouteDefinition[] | SinwanNode };\n\nexport interface RoutesProps {\n\tchildren?: SinwanNode;\n\tfallback?: SinwanComponent;\n\tnotFound?: SinwanComponent;\n\terror?: SinwanComponent<{ error?: unknown }>;\n\tinitialPath?: string\n}\n\nfunction isElementLike(value: unknown): value is SinwanElement {\n\treturn value != null && typeof value === \"object\" && \"tag\" in value;\n}\n\nfunction routePropsRecord(props: RouteProps): Record<string, unknown> {\n\tconst record: Record<string, unknown> = { path: props.path, component: props.component };\n\n\tif (props.meta !== undefined) record.meta = props.meta;\n\tif (props.children !== undefined) record.children = props.children;\n\n\treturn record;\n}\n\n/** Marker for a single route. Same props as `RouteDefinition`. */ export function Route(props: RouteProps): SinwanElement {\n\treturn {\n\t\ttag: ROUTE_TYPE,\n\t\tprops: routePropsRecord(props),\n\t\tchildren: []\n\t};\n}\n\nexport function isRouteElement(value: unknown): value is SinwanElement {\n\tif (!isElementLike(value)) return false;\n\n\treturn value.tag === ROUTE_TYPE || value.tag === Route;\n}\n\nfunction isRouteDefinition(value: unknown): value is RouteDefinition {\n\tif (value == null || typeof value !== \"object\") return false;\n\tif (\"tag\" in value) return false;\n\n\tconst rec = value as { path?: unknown; component?: unknown };\n\n\treturn typeof rec.path === \"string\" && rec.component != null;\n}\n\nfunction flattenNodes(node: unknown): unknown[] {\n\tif (node == null || typeof node === \"boolean\") return [];\n\n\tif (Array.isArray(node)) {\n\t\tconst out: unknown[] = [];\n\n\t\tfor (const child of node) {\n\t\t\tout.push(...flattenNodes(child));\n\t\t}\n\n\t\treturn out;\n\t}\n\n\tif (isElementLike(node) && node.tag === \"\") {\n\t\tconst fromKids = flattenNodes(node.children);\n\n\t\tif (fromKids.length > 0) return fromKids;\n\n\t\treturn flattenNodes(node.props.children);\n\t}\n\n\treturn [node];\n}\n\nfunction nestedDefinitions(source: unknown): RouteDefinition[] | undefined {\n\tif (source == null) return undefined;\n\n\tif (Array.isArray(source) && source.length > 0 && isRouteDefinition(source[0])) {\n\t\tconst defs: RouteDefinition[] = [];\n\n\t\tfor (const item of source) {\n\t\t\tif (isRouteDefinition(item)) defs.push(item);\n\t\t}\n\n\t\treturn defs.length > 0 ? defs : undefined;\n\t}\n\n\tif (isRouteDefinition(source)) return [source];\n\n\tconst collected = collectRouteDefinitions(source);\n\n\treturn collected.length > 0 ? collected : undefined;\n}\n\nfunction routeNodeToDefinition(node: unknown): RouteDefinition | null {\n\tif (isRouteDefinition(node)) {\n\t\tconst def: RouteDefinition = { path: node.path, component: node.component };\n\n\t\tif (node.meta) def.meta = node.meta;\n\t\tif (node.children && node.children.length > 0) def.children = node.children;\n\n\t\treturn def;\n\t}\n\n\tif (!isRouteElement(node)) return null;\n\n\tconst props = node.props;\n\tconst path = props.path;\n\tconst component = props.component;\n\n\tif (typeof path !== \"string\" || component == null) return null;\n\n\tconst def: RouteDefinition = { path, component: component as RouteComponent };\n\tconst meta = props.meta;\n\n\tif (meta != null && typeof meta === \"object\") {\n\t\tdef.meta = meta as Record<string, unknown>;\n\t}\n\n\tconst nested = nestedDefinitions(props.children ?? node.children);\n\n\tif (nested) def.children = nested;\n\n\treturn def;\n}\n\n/** Walk JSX children (and fragments) into native `RouteDefinition[]`. */ export function collectRouteDefinitions(children: unknown): RouteDefinition[] {\n\tconst defs: RouteDefinition[] = [];\n\n\tfor (const node of flattenNodes(children)) {\n\t\tconst def = routeNodeToDefinition(node);\n\n\t\tif (def) defs.push(def);\n\t}\n\n\treturn defs;\n}\n\n/** Non-route siblings (nav, layout) to render beside the outlet. */ export function layoutNodes(children: unknown): SinwanNode[] {\n\tconst out: SinwanNode[] = [];\n\n\tfor (const node of flattenNodes(children)) {\n\t\tif (isRouteElement(node) || isRouteDefinition(node)) continue;\n\n\t\tout.push(node as SinwanNode);\n\t}\n\n\treturn out;\n}\n\n/**\n * Declarative JSX router. Builds a `Router` from `<Route>` children\n * (same fields as `RouteDefinition`), provides `RouterKey` to layout\n * siblings such as `<NavLink>`, and renders a `<RouterOutlet />`.\n */\nexport const Routes = cc<RoutesProps>((props) => {\n\tconst router = createRouter(collectRouteDefinitions(props.children), props.initialPath);\n\n\tprovide(RouterKey, router);\n\n\tonDispose(() => {\n\t\trouter.dispose();\n\t});\n\n\tconst outlet = (<RouterOutlet fallback={() => _$unwrap(props).fallback} notFound={() => _$unwrap(props).notFound} error={() => _$unwrap(props).error} />);\n\tconst layout = layoutNodes(props.children);\n\n\tif (layout.length === 0) return outlet;\n\n\treturn (<>\n {layout}\n {outlet}\n </>);\n});"
|
|
12
12
|
],
|
|
13
|
-
"mappings": "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",
|
|
14
|
-
"debugId": "
|
|
13
|
+
"mappings": ";AAQA;;;AC4BA,SAAS,UAAU,CAAC,QAA2B;AAAA,EAC7C,OAAO;AAAA,IACL;AAAA,IACA,UAAU,CAAC;AAAA,IACX,SAAS,OAAO,WAAW,GAAG;AAAA,IAC9B,WAAW,OAAO,WAAW,GAAG,IAAI,OAAO,MAAM,CAAC,IAAI;AAAA,IACtD,YAAY,WAAW,OAAO,OAAO,WAAW,GAAG;AAAA,IACnD,OAAO;AAAA,EACT;AAAA;AASK,SAAS,aAAa,CAAC,MAAsB;AAAA,EAElD,MAAM,OAAO,KAAK,QAAQ,GAAG;AAAA,EAC7B,IAAI,SAAS;AAAA,IAAI,OAAO,KAAK,MAAM,GAAG,IAAI;AAAA,EAC1C,MAAM,OAAO,KAAK,QAAQ,GAAG;AAAA,EAC7B,IAAI,SAAS;AAAA,IAAI,OAAO,KAAK,MAAM,GAAG,IAAI;AAAA,EAG1C,IAAI,CAAC,KAAK,WAAW,GAAG;AAAA,IAAG,OAAO,MAAM;AAAA,EAGxC,IAAI,KAAK,SAAS,KAAK,KAAK,SAAS,GAAG,GAAG;AAAA,IACzC,OAAO,KAAK,MAAM,GAAG,EAAE;AAAA,EACzB;AAAA,EAEA,OAAO;AAAA;AAIT,SAAS,aAAa,CAAC,MAAwB;AAAA,EAC7C,OAAO,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA;AAIhC,SAAS,mBAAmB,CAAC,MAA+B;AAAA,EACjE,MAAM,OAAO,KAAK,QAAQ,GAAG;AAAA,EAC7B,IAAI,SAAS;AAAA,IAAI,OAAO,IAAI;AAAA,EAC5B,OAAO,IAAI,gBAAgB,KAAK,MAAM,OAAO,CAAC,CAAC;AAAA;AAY1C,SAAS,WAAW,CACzB,MACA,SACA,MACM;AAAA,EACN,MAAM,WAAW,cAAc,cAAc,OAAO,CAAC;AAAA,EACrD,WAAW,MAAM,UAAU,GAAG,IAAI;AAAA;AAGpC,SAAS,UAAU,CACjB,MACA,UACA,OACA,MACM;AAAA,EACN,IAAI,UAAU,SAAS,QAAQ;AAAA,IAC7B,KAAK,QAAQ;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,SAAS;AAAA,EACrB,IAAI,QAAQ;AAAA,IAAW;AAAA,EAGvB,IAAI,QAAQ,OAAO,IAAI,WAAW,GAAG,GAAG;AAAA,IACtC,MAAM,WAAW,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,UAAU;AAAA,IACvD,IAAI,UAAU;AAAA,MACZ,WAAW,UAAU,UAAU,QAAQ,GAAG,IAAI;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,MAAM,KAAK,WAAW,GAAG;AAAA,IACzB,KAAK,SAAS,KAAK,EAAE;AAAA,IACrB,WAAW,IAAI,UAAU,QAAQ,GAAG,IAAI;AAAA,IACxC;AAAA,EACF;AAAA,EAGA,IAAI,IAAI,WAAW,GAAG,GAAG;AAAA,IACvB,MAAM,YAAY,IAAI,MAAM,CAAC;AAAA,IAC7B,WAAW,SAAS,KAAK,UAAU;AAAA,MACjC,IAAI,MAAM,WAAW,MAAM,cAAc,WAAW;AAAA,QAClD,WAAW,OAAO,UAAU,QAAQ,GAAG,IAAI;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM,KAAK,WAAW,GAAG;AAAA,IACzB,KAAK,SAAS,KAAK,EAAE;AAAA,IACrB,WAAW,IAAI,UAAU,QAAQ,GAAG,IAAI;AAAA,IACxC;AAAA,EACF;AAAA,EAGA,WAAW,SAAS,KAAK,UAAU;AAAA,IACjC,IAAI,MAAM,WAAW,MAAM;AAAA,MAAY;AAAA,IACvC,IAAI,MAAM,WAAW,KAAK;AAAA,MACxB,WAAW,OAAO,UAAU,QAAQ,GAAG,IAAI;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,WAAW,GAAG;AAAA,EACzB,KAAK,SAAS,KAAK,EAAE;AAAA,EACrB,WAAW,IAAI,UAAU,QAAQ,GAAG,IAAI;AAAA;AAuBnC,SAAS,WAAW,CAAC,MAAiB,MAAkC;AAAA,EAC7E,MAAM,WAAW,cAAc,cAAc,IAAI,CAAC;AAAA,EAClD,MAAM,SAAiC,OAAO,OAAO,IAAI;AAAA,EACzD,MAAM,SAAS,WAAW,MAAM,UAAU,GAAG,QAAQ,EAAE;AAAA,EACvD,IAAI,CAAC;AAAA,IAAQ,OAAO;AAAA,EACpB,OAAO;AAAA;AAGT,SAAS,UAAU,CACjB,MACA,UACA,OACA,QACA,WACoB;AAAA,EAEpB,IAAI,UAAU,SAAS,QAAQ;AAAA,IAC7B,IAAI,KAAK,OAAO;AAAA,MACd,OAAO;AAAA,QACL,MAAM,KAAK;AAAA,QACX,QAAQ,WAAW,MAAM;AAAA,QACzB,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IAEA,WAAW,SAAS,KAAK,UAAU;AAAA,MACjC,IAAI,MAAM,cAAc,MAAM,OAAO;AAAA,QACnC,MAAM,YAAY,MAAM,WAAW,MAAM,KAAK,MAAM,OAAO,MAAM,CAAC;AAAA,QAClE,IAAI,WAAW;AAAA,UACb,OAAO,aAAa;AAAA,QACtB,EAAO;AAAA,UACL,OAAO,eAAe;AAAA;AAAA,QAExB,OAAO;AAAA,UACL,MAAM,MAAM;AAAA,UACZ,QAAQ,WAAW,MAAM;AAAA,UACzB,aAAa,YAAY;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,SAAS;AAAA,EACrB,IAAI,QAAQ;AAAA,IAAW,OAAO;AAAA,EAG9B,WAAW,SAAS,KAAK,UAAU;AAAA,IACjC,IAAI,MAAM,WAAW,MAAM;AAAA,MAAY;AAAA,IACvC,IAAI,MAAM,WAAW;AAAA,MAAK;AAAA,IAC1B,MAAM,QAAQ,WACZ,OACA,UACA,QAAQ,GACR,QACA,YAAY,MAAM,MAAM,MAC1B;AAAA,IACA,IAAI;AAAA,MAAO,OAAO;AAAA,EACpB;AAAA,EAGA,WAAW,SAAS,KAAK,UAAU;AAAA,IACjC,IAAI,CAAC,MAAM;AAAA,MAAS;AAAA,IACpB,OAAO,MAAM,aAAa,mBAAmB,GAAG;AAAA,IAChD,MAAM,QAAQ,WACZ,OACA,UACA,QAAQ,GACR,QACA,YAAY,OAAO,MAAM,SAC3B;AAAA,IACA,IAAI;AAAA,MAAO,OAAO;AAAA,IAClB,OAAO,OAAO,MAAM;AAAA,EACtB;AAAA,EAGA,WAAW,SAAS,KAAK,UAAU;AAAA,IACjC,IAAI,CAAC,MAAM;AAAA,MAAY;AAAA,IACvB,IAAI,CAAC,MAAM;AAAA,MAAO;AAAA,IAClB,MAAM,OAAO,cAAc,UAAU,KAAK;AAAA,IAE1C,MAAM,YAAY,MAAM,WAAW,MAAM,KAAK,MAAM,OAAO,MAAM,CAAC;AAAA,IAClE,IAAI,WAAW;AAAA,MACb,OAAO,aAAa;AAAA,IACtB,EAAO;AAAA,MACL,OAAO,eAAe;AAAA;AAAA,IAExB,OAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,QAAQ,WAAW,MAAM;AAAA,MACzB,aAAa,YAAY;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAIT,SAAS,aAAa,CAAC,UAAoB,OAAuB;AAAA,EAChE,IAAI,OAAO;AAAA,EACX,SAAS,IAAI,MAAO,IAAI,SAAS,QAAQ,KAAK,GAAG;AAAA,IAC/C,MAAM,MAAM,SAAS;AAAA,IACrB,IAAI,QAAQ,aAAa,QAAQ;AAAA,MAAI;AAAA,IACrC,IAAI,SAAS;AAAA,MAAI,OAAO;AAAA,IACnB;AAAA,cAAQ,MAAM;AAAA,EACrB;AAAA,EACA,OAAO;AAAA;AAIT,SAAS,UAAU,CAAC,KAAqD;AAAA,EACvE,MAAM,MAA8B,OAAO,OAAO,IAAI;AAAA,EACtD,WAAW,OAAO;AAAA,IAAK,IAAI,OAAO,IAAI;AAAA,EACtC,OAAO;AAAA;AAMF,SAAS,eAAe,GAAc;AAAA,EAC3C,OAAO,WAAW,EAAE;AAAA;AAaf,SAAS,SAAS,CACvB,SACA,SAAiC,CAAC,GAC1B;AAAA,EACR,OAAO,QAAQ,QAAQ,WAAW,CAAC,QAAQ,SAAiB;AAAA,IAC1D,MAAM,QAAQ,OAAO;AAAA,IACrB,IAAI,UAAU,WAAW;AAAA,MACvB,MAAM,IAAI,MAAM,kBAAkB,sBAAsB,UAAU;AAAA,IACpE;AAAA,IACA,OAAO,mBAAmB,KAAK;AAAA,GAChC;AAAA;;;ADrSH,SAAS,WAAW,CAAC,OAAe,KAAsB;AAAA,EACxD,OAAO,OAAO,SAAU,MAAkC,SAAS;AAAA;AAQ9D,SAAS,eAAe,CAAC,MAAsC;AAAA,EACpE,IAAI,OAAO,SAAS;AAAA,IAAY,OAAO;AAAA,EACvC,IAAI,YAAY,MAAM,kBAAkB;AAAA,IAAG,OAAO;AAAA,EAClD,IAAI,YAAY,MAAM,aAAa;AAAA,IAAG,OAAO;AAAA,EAC7C,OAAO,KAAK,WAAW;AAAA;AAIlB,SAAS,IAAI,CAClB,QACe;AAAA,EACf,MAAM,UAAU,MAA6C,OAAO;AAAA,EACpE,OAAO,OAAO,OAAO,SAAS,EAAE,aAAa,KAAc,CAAC;AAAA;AAAA;AAavD,MAAM,OAAO;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,IAAI;AAAA,EAChB,aAAa,IAAI;AAAA,EACjB,eAAe,IAAI;AAAA,EACnB;AAAA,EACT,kBAAuC;AAAA,EAE/C,WAAW,CAAC,QAA2B,aAAsB;AAAA,IAC3D,KAAK,OAAO,gBAAgB;AAAA,IAC5B,KAAK,YAAY,CAAC;AAAA,IAClB,KAAK,YAAY,OAAO,CAAC;AAAA,IAOzB,WAAW,SAAS,QAAQ;AAAA,MAC1B,KAAK,YAAY,OAAO,EAAE;AAAA,IAC5B;AAAA,IAEA,MAAM,YACJ,gBACC,OAAO,WAAW,cACf,OAAO,SAAS,WAAW,OAAO,SAAS,SAC3C;AAAA,IAEN,KAAK,QAAQ,OAAO,cAAc,SAAS,CAAC;AAAA,IAC5C,KAAK,gBAAgB,OAAO,oBAAoB,SAAS,CAAC;AAAA,IAE1D,KAAK,WAAW,SAAS,MAAM;AAAA,MAC7B,MAAM,OAAO,cAAc,KAAK,MAAM,KAAK;AAAA,MAC3C,MAAM,SAAS,YAAY,KAAK,MAAM,IAAI;AAAA,MAC1C,IAAI,CAAC;AAAA,QAAQ,OAAO;AAAA,MAEpB,MAAM,OAAO,OAAO;AAAA,MACpB,MAAM,SAAS,OAAO;AAAA,MAKtB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,SAAS,IAAI,EAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AAAA,QAC1C,MAAM,QAAQ,KAAK,MAAM;AAAA,QACzB,MAAM,IAAkB;AAAA,UACtB,OAAO,MAAM;AAAA,UACb;AAAA,UACA;AAAA,UACA,aAAa,MAAM;AAAA,UACnB,QAAQ,IAAI,IAAI,SAAS;AAAA,QAC3B;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,MACZ;AAAA,MACA,OAAO,WAAW;AAAA,KACnB;AAAA,IAED,KAAK,UAAU,SAAS,MAAM;AAAA,MAC5B,MAAM,UAAU,KAAK,SAAS;AAAA,MAC9B,OAAO,UAAU,QAAQ,SAAS,CAAC;AAAA,KACpC;AAAA,IAGD,IAAI,OAAO,WAAW,aAAa;AAAA,MACjC,KAAK,kBAAkB,MAAM;AAAA,QAC3B,MAAM,MAAM,OAAO,SAAS,WAAW,OAAO,SAAS;AAAA,QACvD,KAAK,MAAM,QAAQ,cAAc,GAAG;AAAA,QACpC,KAAK,cAAc,QAAQ,oBAAoB,GAAG;AAAA;AAAA,MAEpD,OAAO,iBAAiB,YAAY,KAAK,eAAe;AAAA,IAC1D;AAAA;AAAA,EAIM,WAAW,CACjB,OACA,YACA,cAAiE,CAAC,GAC5D;AAAA,IACN,MAAM,cAAc,UAAU,YAAY,MAAM,IAAI;AAAA,IACpD,MAAM,QAAQ,CAAC,GAAG,aAAa,EAAE,OAAO,YAAY,CAAC;AAAA,IACrD,MAAM,WAAqB,EAAE,OAAO,aAAa,MAAM;AAAA,IAEvD,YAAY,KAAK,MAAM,aAAa,QAAQ;AAAA,IAC5C,KAAK,UAAU,KAAK,KAAK;AAAA,IAEzB,IAAI,MAAM,UAAU;AAAA,MAClB,WAAW,SAAS,MAAM,UAAU;AAAA,QAClC,KAAK,YAAY,OAAO,aAAa,KAAK;AAAA,MAC5C;AAAA,IACF;AAAA;AAAA,EAGM,YAAY,GAAS;AAAA,IAC3B,KAAK,UAAU,QAAQ,KAAK,UAAU,QAAQ;AAAA;AAAA,MAI5C,QAAQ,GAAW;AAAA,IACrB,OAAO,KAAK,UAAU;AAAA;AAAA,EAIxB,QAAQ,CAAC,UAA4B;AAAA,IACnC,MAAM,SAAS,KAAK,UAAU,IAAI,QAAQ;AAAA,IAC1C,IAAI;AAAA,MAAQ,OAAO,EAAE,QAAQ,SAAS,WAAW,OAAO;AAAA,IACxD,IAAI,KAAK,aAAa,IAAI,QAAQ;AAAA,MAAG,OAAO,EAAE,QAAQ,UAAU;AAAA,IAChE,IAAI,KAAK,WAAW,IAAI,QAAQ,GAAG;AAAA,MACjC,OAAO,EAAE,QAAQ,SAAS,OAAO,KAAK,WAAW,IAAI,QAAQ,EAAE;AAAA,IACjE;AAAA,IACA,OAAO,EAAE,QAAQ,OAAO;AAAA;AAAA,EAO1B,UAAU,CAAC,UAAkB,QAA6B;AAAA,IACxD,MAAM,QAAQ,KAAK,SAAS,QAAQ;AAAA,IACpC,IAAI,MAAM,WAAW;AAAA,MAAQ;AAAA,IAC7B,KAAK,cAAc,UAAU,MAAM;AAAA;AAAA,EAG7B,aAAa,CACnB,UACA,QAC0B;AAAA,IAC1B,KAAK,WAAW,OAAO,QAAQ;AAAA,IAC/B,MAAM,UAAU,OAAO,EACpB,KAAK,CAAC,QAAQ;AAAA,MACb,KAAK,UAAU,IAAI,UAAU,IAAI,OAAO;AAAA,MACxC,KAAK,WAAW,OAAO,QAAQ;AAAA,MAC/B,KAAK,aAAa;AAAA,MAClB,OAAO,IAAI;AAAA,KACZ,EACA,MAAM,CAAC,QAAiB;AAAA,MACvB,KAAK,WAAW,IAAI,UAAU,GAAG;AAAA,MACjC,KAAK,aAAa;AAAA,MAClB,MAAM;AAAA,KACP,EACA,QAAQ,MAAM;AAAA,MACb,KAAK,aAAa,OAAO,QAAQ;AAAA,KAClC;AAAA,IACH,KAAK,aAAa,IAAI,UAAU,OAAO;AAAA,IACvC,QAAQ,MAAM,MAAM,EAEnB;AAAA,IACD,OAAO;AAAA;AAAA,MAIL,IAAI,GAAW;AAAA,IACjB,OAAO,KAAK,MAAM;AAAA;AAAA,MAIhB,UAAU,GAAmB;AAAA,IAC/B,OAAO,KAAK;AAAA;AAAA,MAIV,OAAO,GAAwB;AAAA,IACjC,OAAO,KAAK,SAAS;AAAA;AAAA,MAInB,eAAe,GAAkC;AAAA,IACnD,OAAO,KAAK;AAAA;AAAA,MAIV,MAAM,GAA2B;AAAA,IACnC,OAAO,KAAK,QAAQ;AAAA;AAAA,MAIlB,YAAY,GAAoB;AAAA,IAClC,OAAO,KAAK,cAAc;AAAA;AAAA,MAIxB,MAAM,GAAsB;AAAA,IAC9B,OAAO,KAAK;AAAA;AAAA,EAId,QAAQ,CAAC,IAAY,UAA2B,CAAC,GAAS;AAAA,IACxD,MAAM,aAAa,cAAc,EAAE;AAAA,IAEnC,IAAI,OAAO,WAAW,aAAa;AAAA,MACjC,IAAI,QAAQ,SAAS;AAAA,QACnB,OAAO,QAAQ,aAAa,QAAQ,SAAS,CAAC,GAAG,IAAI,EAAE;AAAA,MACzD,EAAO;AAAA,QACL,OAAO,QAAQ,UAAU,QAAQ,SAAS,CAAC,GAAG,IAAI,EAAE;AAAA;AAAA,IAExD;AAAA,IAEA,KAAK,MAAM,QAAQ;AAAA,IACnB,KAAK,cAAc,QAAQ,oBAAoB,EAAE;AAAA;AAAA,EAInD,QAAQ,CAAC,MAAoB;AAAA,IAC3B,IAAI,OAAO,WAAW;AAAA,MAAa;AAAA,IAEnC,MAAM,aAAa,cAAc,IAAI;AAAA,IACrC,MAAM,SAAS,YAAY,KAAK,MAAM,UAAU;AAAA,IAChD,IAAI,CAAC;AAAA,MAAQ;AAAA,IAEb,MAAM,OAAO,OAAO;AAAA,IACpB,MAAM,QAAQ,KAAK;AAAA,IACnB,IAAI,CAAC,gBAAgB,MAAM,SAAS;AAAA,MAAG;AAAA,IAEvC,MAAM,WAAW,KAAK;AAAA,IACtB,MAAM,QAAQ,KAAK,SAAS,QAAQ;AAAA,IACpC,IAAI,MAAM,WAAW,WAAW,MAAM,WAAW;AAAA,MAAW;AAAA,IAC5D,KAAK,cAAc,UAAU,MAAM,SAAS;AAAA;AAAA,OAIxC,iBAAgB,CACpB,OAC0B;AAAA,IAC1B,IAAI,CAAC,gBAAgB,MAAM,SAAS,GAAG;AAAA,MACrC,OAAO,MAAM;AAAA,IACf;AAAA,IAEA,MAAM,WAAW,KAAK,gBAAgB,KAAK,KAAK,MAAM;AAAA,IACtD,MAAM,SAAS,KAAK,UAAU,IAAI,QAAQ;AAAA,IAC1C,IAAI;AAAA,MAAQ,OAAO;AAAA,IAEnB,MAAM,WAAW,KAAK,aAAa,IAAI,QAAQ;AAAA,IAC/C,IAAI;AAAA,MAAU,OAAO;AAAA,IAErB,OAAO,KAAK,cAAc,UAAU,MAAM,SAAS;AAAA;AAAA,EAI7C,eAAe,CAAC,OAA4C;AAAA,IAClE,OAAO,KAAK,eAAe,KAAK,MAAM,OAAO,EAAE;AAAA;AAAA,EAGzC,cAAc,CACpB,MACA,QACA,WACoB;AAAA,IACpB,IAAI,KAAK,OAAO;AAAA,MACd,MAAM,OAAO,KAAK;AAAA,MAClB,IAAI,KAAK,UAAU;AAAA,QAAQ,OAAO,KAAK;AAAA,IACzC;AAAA,IACA,WAAW,SAAS,KAAK,UAAU;AAAA,MACjC,MAAM,MAAM,MAAM,UACd,OAAO,MAAM,YACb,MAAM,aACJ,OACA,MAAM,MAAM;AAAA,MAClB,MAAM,QAAQ,KAAK,eAAe,OAAO,QAAQ,YAAY,GAAG;AAAA,MAChE,IAAI;AAAA,QAAO,OAAO;AAAA,IACpB;AAAA,IACA;AAAA;AAAA,EAIF,OAAO,GAAS;AAAA,IACd,IAAI,KAAK,mBAAmB,OAAO,WAAW,aAAa;AAAA,MACzD,OAAO,oBAAoB,YAAY,KAAK,eAAe;AAAA,MAC3D,KAAK,kBAAkB;AAAA,IACzB;AAAA,IACA,KAAK,UAAU,MAAM;AAAA,IACrB,KAAK,WAAW,MAAM;AAAA,IACtB,KAAK,aAAa,MAAM;AAAA;AAE5B;AAGA,SAAS,SAAS,CAAC,QAAgB,OAAuB;AAAA,EACxD,IAAI,UAAU;AAAA,IAAK,OAAO,UAAU;AAAA,EAEpC,MAAM,gBAAgB,MAAM,WAAW,GAAG,IAAI,MAAM,MAAM,CAAC,IAAI;AAAA,EAC/D,IAAI,WAAW,OAAO,WAAW;AAAA,IAAI,OAAO,MAAM;AAAA,EAClD,OAAO,SAAS,MAAM;AAAA;AAIjB,SAAS,YAAY,CAC1B,QACA,aACQ;AAAA,EACR,OAAO,IAAI,OAAO,QAAQ,WAAW;AAAA;;AErWvC;AAuCA;AAEA;AAEA,qBAAS;;;ACpCT;AAMO,IAAM,YAAkC,OAAO,eAAe;AAW9D,SAAS,SAAS,GAAW;AAAA,EAClC,MAAM,SAAS,OAAO,SAAS;AAAA,EAC/B,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAAA,EACA,OAAO;AAAA;AAYF,SAAS,SAAS,GAA2B;AAAA,EAClD,OAAO,UAAU,EAAE;AAAA;AAYd,SAAS,eAAe,GAAoB;AAAA,EACjD,OAAO,UAAU,EAAE;AAAA;AAcd,SAAS,QAAQ,GAAG;AAAA,EACzB,OAAO,UAAU,EAAE;AAAA;AAad,SAAS,WAAW,GAAoD;AAAA,EAC7E,MAAM,SAAS,UAAU;AAAA,EACzB,OAAO,OAAO,SAAS,KAAK,MAAM;AAAA;AAY7B,SAAS,OAAO,GAAW;AAAA,EAChC,OAAO,UAAU,EAAE;AAAA;;;AC9Ed,SAAS,cAAc,CAAC,MAAuB;AAAA,EACpD,IAAI,KAAK,WAAW,IAAI;AAAA,IAAG,OAAO;AAAA,EAClC,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAAA,EAC9B,IAAI,SAAS;AAAA,IAAG,OAAO;AAAA,EACvB,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAAA,EAC9B,IAAI,UAAU,MAAM,QAAQ;AAAA,IAAO,OAAO;AAAA,EAC1C,OAAO;AAAA;AAIF,SAAS,cAAc,CAAC,MAAc,aAA8B;AAAA,EACzE,IAAI,KAAK,WAAW,GAAG;AAAA,IAAG,OAAO;AAAA,EACjC,MAAM,UAAU,KAAK,QAAQ,GAAG;AAAA,EAChC,IAAI,YAAY;AAAA,IAAI,OAAO;AAAA,EAC3B,MAAM,aAAa,KAAK,MAAM,GAAG,OAAO;AAAA,EACxC,IAAI,eAAe;AAAA,IAAI,OAAO;AAAA,EAC9B,MAAM,OAAO,WAAW,QAAQ,GAAG;AAAA,EACnC,MAAM,WAAW,SAAS,KAAK,aAAa,WAAW,MAAM,GAAG,IAAI;AAAA,EACpE,IAAI,aAAa,MAAM,aAAa;AAAA,IAAK,OAAO;AAAA,EAChD,MAAM,aACJ,SAAS,WAAW,GAAG,IAAI,WAAW,MAAM;AAAA,EAC9C,MAAM,WACJ,WAAW,SAAS,KAAK,WAAW,SAAS,GAAG,IAC5C,WAAW,MAAM,GAAG,EAAE,IACtB;AAAA,EACN,OAAO,aAAa;AAAA;AAIf,SAAS,wBAAwB,CACtC,OACA,MACA,aACA,UAAgC,CAAC,GACxB;AAAA,EACT,IAAI,MAAM;AAAA,IAAkB,OAAO;AAAA,EACnC,IAAI,MAAM,WAAW;AAAA,IAAG,OAAO;AAAA,EAC/B,IAAI,MAAM,WAAW,MAAM,WAAW,MAAM,YAAY,MAAM,QAAQ;AAAA,IACpE,OAAO;AAAA,EACT;AAAA,EACA,IAAI,QAAQ,UAAU,QAAQ,QAAQ,WAAW,MAAM,QAAQ,WAAW,SAAS;AAAA,IACjF,OAAO;AAAA,EACT;AAAA,EACA,IAAI,QAAQ,aAAa,aAAa,QAAQ,aAAa,OAAO;AAAA,IAChE,OAAO;AAAA,EACT;AAAA,EACA,IAAI,eAAe,IAAI;AAAA,IAAG,OAAO;AAAA,EACjC,IAAI,eAAe,MAAM,WAAW;AAAA,IAAG,OAAO;AAAA,EAC9C,OAAO;AAAA;;;ACxDF,SAAS,eAAe,CAC7B,SACA,OACqB;AAAA,EACrB,IAAI,CAAC;AAAA,IAAS,OAAO;AAAA,EACrB,IAAI,UAAoC;AAAA,EACxC,MAAM,QAAwB,CAAC;AAAA,EAC/B,OAAO,SAAS;AAAA,IACd,MAAM,QAAQ,OAAO;AAAA,IACrB,UAAU,QAAQ;AAAA,EACpB;AAAA,EACA,OAAO,MAAM,UAAU;AAAA;AAOlB,SAAS,aAAa,CAAC,SAA+B;AAAA,EAC3D,MAAM,UAAU,QAAQ;AAAA,EACxB,IAAI,QAAQ,SAAS,GAAG,GAAG;AAAA,IACzB,OAAO,QAAQ;AAAA,EACjB;AAAA,EACA,IAAI,WAAW;AAAA,EACf,WAAW,OAAO,OAAO,KAAK,QAAQ,MAAM,GAAG;AAAA,IAC7C,MAAM,QAAQ,QAAQ,OAAO;AAAA,IAC7B,IAAI,UAAU;AAAA,MAAW;AAAA,IACzB,WAAW,SAAS,QAAQ,MAAM,KAAK,mBAAmB,KAAK,CAAC;AAAA,EAClE;AAAA,EACA,IAAI,SAAS,SAAS,GAAG,GAAG;AAAA,IAC1B,OAAO,QAAQ;AAAA,EACjB;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,gBAAgB,CAAC,QAAgB,SAA+B;AAAA,EACvE,IAAI,CAAC,gBAAgB,QAAQ,MAAM,SAAS;AAAA,IAAG,OAAO;AAAA,EACtD,MAAM,QAAQ,OAAO,SAAS,QAAQ,WAAW;AAAA,EACjD,OAAO,MAAM;AAAA;AAQR,SAAS,gBAAgB,CAAC,QAAgB,OAAuB;AAAA,EACjE,OAAO;AAAA,EACZ,MAAM,UAAU,gBAAgB,OAAO,SAAS,KAAK;AAAA,EACrD,IAAI,CAAC,SAAS;AAAA,IACZ,OAAO,QAAQ,IAAI,WAAW,UAAU;AAAA,EAC1C;AAAA,EACA,OAAO,GAAG,cAAc,OAAO,KAAK,iBAAiB,QAAQ,OAAO;AAAA;;;;AH9DtE,IAAM,WAAW;AAAA,EAChB,MAAM;AAAA,EACN,OAAO;AAAA,IACN,EAAE,MAAM,CAAC,GAAG,MAAM,QAAQ,MAAM,QAAQ;AAAA,IACxC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,QAAQ,MAAM,QAAQ;AAAA,IACzC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,QAAQ,MAAM,QAAQ;AAAA,IAC5C,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,QAAQ,MAAM,QAAQ;AAAA,IAC5C,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,QAAQ,MAAM,QAAQ;AAAA,IAC5C,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,QAAQ;AAAA,IACjC,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,QAAQ,MAAM,QAAQ;AAAA,IAC/C,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,QAAQ;AAAA,IACjC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,QAAQ;AAAA,EAC/B;AACD;AAEA,IAAM,WAAW;AAAA,EAChB,MAAM;AAAA,EACN,OAAO;AAAA,IACN,EAAE,MAAM,CAAC,GAAG,MAAM,QAAQ,MAAM,QAAQ;AAAA,IACxC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,QAAQ,MAAM,QAAQ;AAAA,EAC1C;AACD;AAEA,IAAM,WAAW;AAAA,EAChB,MAAM;AAAA,EACN,OAAO;AAAA,IACN,EAAE,MAAM,CAAC,GAAG,MAAM,QAAQ,MAAM,QAAQ;AAAA,IACxC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,QAAQ,MAAM,QAAQ;AAAA,EAC1C;AACD;AAwCA,IAAM,gBAAgB,IAAI,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;AAED,SAAS,eAAe,CAAC,OAA2C;AAAA,EACnE,MAAM,MAAM,YAAY,KAAK;AAAA,EAC7B,MAAM,OAAgC,CAAC;AAAA,EAEvC,WAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAAA,IACnC,IAAI,CAAC,cAAc,IAAI,GAAG;AAAA,MAAG,KAAK,OAAO,IAAI;AAAA,EAC9C;AAAA,EAEA,OAAO;AAAA;AAGR,SAAS,WAAW,CACnB,OACA,MACA,QACA,SACO;AAAA,EACP,IAAI,CAAC,yBAAyB,OAAO,MAAM,OAAO,MAAM,OAAO;AAAA,IAAG;AAAA,EAElE,MAAM,eAAe;AAAA,EACrB,OAAO,SAAS,IAAI;AAAA;AAGrB,SAAS,YAAY,CAAC,UAA4D;AAAA,EACjF,IAAI,aAAa,aAAa,aAAa;AAAA,IAAO;AAAA,EAClD,IAAI,aAAa;AAAA,IAAM,OAAO;AAAA,EAE9B,OAAO;AAAA;AAOD,IAAM,OAAO,GAAc,CAAC,UAAU;AAAA,EAC5C;AAAA,IACC;AAAA,IACA,WAAW;AAAA,IACX,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACG;AAAA,EAEJ,MAAM,SAAS,UAAU;AAAA,EACzB,MAAM,OAAO,gBAAgB,KAAK;AAAA,EAElC,uBAAQ,OASH,KATG;AAAA,OAAO;AAAA,IAAM;AAAA,IAAY,OAAO;AAAA,IAAK;AAAA,IAAgB,UAAU,aAAa,QAAQ;AAAA,IAAG;AAAA,IAAU,SAAS,CAAC,MAAkB;AAAA,MACpI,YAAY,GAAG,MAAM,QAAQ,EAAE,QAAQ,SAAS,CAAC;AAAA,MACjD,UAAU,CAAC;AAAA;AAAA,IACT,cAAc,CAAC,MAAkB;AAAA,MACnC,IAAI;AAAA,QAAU,OAAO,SAAS,IAAI;AAAA,MAElC,eAAe,CAAC;AAAA;AAAA,IANT;AAAA,sCASH;AAAA,CACL;AA0BD,SAAS,eAAe,CAAC,MAAc,MAAuB;AAAA,EAC7D,OAAO,SAAS,QAAQ,KAAK,WAAW,OAAO,GAAG;AAAA;AAGnD,SAAS,mBAAmB,CAC3B,KACA,UACS;AAAA,EACT,IAAI,OAAO,QAAQ,YAAY;AAAA,IAC9B,QAAQ,IAAI,EAAE,SAAS,CAAC,KAAK,IAAI,KAAK;AAAA,EACvC;AAAA,EAEA,IAAI,OAAO,QAAQ,QAAQ,IAAI;AAAA,IAC9B,OAAO;AAAA,EACR;AAAA,EAEA,OAAO,WAAW,WAAW;AAAA;AAOvB,IAAM,UAAU,GAAiB,CAAC,UAAU;AAAA,EAClD;AAAA,IACC;AAAA,IACA,WAAW;AAAA,IACX,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACG;AAAA,EAEJ,MAAM,SAAS,UAAU;AAAA,EACzB,MAAM,OAAO,gBAAgB,KAAkB;AAAA,EAC/C,MAAM,YAAY,UAAS,MAAM,oBAAoB,KAAK,gBAAgB,OAAO,MAAM,IAAI,CAAC,CAAC;AAAA,EAE7F,uBAAQ,OASH,KATG;AAAA,OAAO;AAAA,IAAM;AAAA,IAAY,OAAO;AAAA,IAAW;AAAA,IAAgB,UAAU,aAAa,QAAQ;AAAA,IAAG;AAAA,IAAU,SAAS,CAAC,MAAkB;AAAA,MAC1I,YAAY,GAAG,MAAM,QAAQ,EAAE,QAAQ,SAAS,CAAC;AAAA,MACjD,UAAU,CAAC;AAAA;AAAA,IACT,cAAc,CAAC,MAAkB;AAAA,MACnC,IAAI;AAAA,QAAU,OAAO,SAAS,IAAI;AAAA,MAElC,eAAe,CAAC;AAAA;AAAA,IANT;AAAA,sCASH;AAAA,CACL;AAU0F,IAAM,aAAa;AAAA,EAC7G,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,WAAW;AAAA,EACX,qBAAqB;AAAA,EACrB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,mBAAmB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,EAAE,KAAK,IAAI;AAAA,EACX,eAAe;AAChB;AAEA,IAAM,4BAA4B;AAAA,EACjC,WAAW;AAAA,EACX,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY,WAAW;AAAA,EACvB,OAAO,WAAW;AAAA,EAClB,YAAY;AACb;AAEA,IAAM,2BAA2B;AAAA,EAChC,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY,WAAW;AAAA,EACvB,QAAQ,aAAa,WAAW;AAAA,EAChC,WAAW;AACZ;AAEA,IAAM,2BAA2B;AAAA,EAChC,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY,WAAW;AAAA,EACvB,OAAO,WAAW;AAAA,EAClB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AACZ;AAEA,IAAM,2BAA2B;AAAA,EAChC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,cAAc,WAAW;AAAA,EACzB,YAAY,WAAW;AAAA,EACvB,OAAO,WAAW;AAAA,EAClB,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,WAAW;AACZ;AAE+E,IAAM,kBAAkB,GAAG,MAAM;AAAA,EAC/G,MAAM,SAAS,UAAU;AAAA,EAEzB,OAAQ,iBAAiB,UAAU;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,MACC,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,YAAY,WAAW;AAAA,MACvB,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,MACtB,OAAO;AAAA,IACR;AAAA,IAEA;AAAA,MACC,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,OAAO,WAAW;AAAA,IACnB;AAAA,IAEA;AAAA,MACC,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO,WAAW;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,OAAO;AAAA,oBACb,OAEQ,MAFR;AAAA,MAAM,MAAK;AAAA,MAAI,OAAO;AAAA,MAAtB;AAAA,wCAEQ;AAAA,EACT,CAAC;AAAA,CACD;AAED,IAAM,0BAA0B;AAAA,EAC/B,WAAW;AAAA,EACX,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY,WAAW;AAAA,EACvB,OAAO,WAAW;AAAA,EAClB,YAAY;AACb;AAEA,IAAM,yBAAyB;AAAA,EAC9B,SAAS;AAAA,EACT,cAAc,WAAW;AAAA,EACzB,YAAY,WAAW;AAAA,EACvB,QAAQ,aAAa,WAAW;AAAA,EAChC,OAAO,WAAW;AAAA,EAClB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,WAAW;AACZ;AAEA,IAAM,iBAAiB,GAAG,MAAO,iBAAiB,UAAU,CAAC,yBAAyB,sBAAsB,CAAC,CAAE;AAE/G,IAAM,eAAe,GAAwB,MAAO,iBAAiB,UAAU;AAAA,EAC9E;AAAA,EACA;AAAA,OACI;AAAA,IACH,aAAa;AAAA,IACb,OAAO,WAAW;AAAA,EACnB;AACD,CAAC,CAAE;AAEH,SAAS,iBAAiB,CACzB,SACA,QACA,UACA,WACa;AAAA,EACb,MAAM,QAAQ,QAAQ;AAAA,EAEtB,IAAI,CAAC,gBAAgB,MAAM,SAAS,GAAG;AAAA,IACtC,MAAM,OAAO,MAAM;AAAA,IAEnB,uBAAO,OAAC,MAAD,qCAAM;AAAA,EACd;AAAA,EAEA,MAAM,WAAW,QAAQ;AAAA,EACzB,MAAM,QAAQ,OAAO,SAAS,QAAQ;AAAA,EAEtC,IAAI,MAAM,WAAW,SAAS;AAAA,IAC7B,MAAM,OAAO,MAAM;AAAA,IAEnB,uBAAO,OAAC,MAAD,qCAAM;AAAA,EACd;AAAA,EAEA,IAAI,MAAM,WAAW,SAAS;AAAA,IAC7B,MAAM,YAAY;AAAA,IAElB,uBAAO,OAAC,WAAD;AAAA,MAAW,OAAO,MAAM;AAAA,OAAxB,iCAA+B;AAAA,EACvC;AAAA,EAEA,OAAO,WAAW,UAAU,MAAM,SAAS;AAAA,EAE3C,MAAM,WAAW;AAAA,EAEjB,uBAAO,OAAC,UAAD,qCAAU;AAAA;AAQX,IAAM,eAAe,GAAsB,CAAC,UAAU;AAAA,EAC5D,MAAM,SAAS,UAAU;AAAA,EACzB,MAAM,WAAW,MAAM,MAAM,YAAY;AAAA,EACzC,MAAM,WAAW,MAAM,YAAY;AAAA,EACnC,MAAM,YAAY,MAAM,MAAM,SAAS;AAAA,EAIvC,uBAAQ,OAYD,KAZC;AAAA,IAAK,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAe,YAAI,IAAI,MAAM,KAAK;AAAA,IAAlF,UACA,CAAC,cAAc;AAAA,MACrB,MAAM,UAAU,gBAAgB,OAAO,SAAS,MAAM,UAAe,YAAI,IAAI,MAAM,KAAK;AAAA,MAExF,IAAI,CAAC,SAAS;AAAA,QACb,KAAK,MAAM,UAAe,YAAI,IAAI,MAAM,SAAS;AAAA,UAAG,OAAO;AAAA,QAE3D,uBAAO,OAAC,UAAD,qCAAU;AAAA,MAClB;AAAA,MAEA,OAAO,kBAAkB,SAAS,QAAQ,SAAS,GAAG,UAAU,CAAC;AAAA;AAAA,KAV3D,iCAYD;AAAA,CACP;;AIrbD,mBAAS;AAKT,eAAS;;AAQF,IAAM,aAAa,OAAO,IAAI,qBAAqB;AAkB1D,SAAS,aAAa,CAAC,OAAwC;AAAA,EAC9D,OAAO,SAAS,QAAQ,OAAO,UAAU,YAAY,SAAS;AAAA;AAG/D,SAAS,gBAAgB,CAAC,OAA4C;AAAA,EACrE,MAAM,SAAkC,EAAE,MAAM,MAAM,MAAM,WAAW,MAAM,UAAU;AAAA,EAEvF,IAAI,MAAM,SAAS;AAAA,IAAW,OAAO,OAAO,MAAM;AAAA,EAClD,IAAI,MAAM,aAAa;AAAA,IAAW,OAAO,WAAW,MAAM;AAAA,EAE1D,OAAO;AAAA;AAGkE,SAAS,KAAK,CAAC,OAAkC;AAAA,EAC1H,OAAO;AAAA,IACN,KAAK;AAAA,IACL,OAAO,iBAAiB,KAAK;AAAA,IAC7B,UAAU,CAAC;AAAA,EACZ;AAAA;AAGM,SAAS,cAAc,CAAC,OAAwC;AAAA,EACtE,IAAI,CAAC,cAAc,KAAK;AAAA,IAAG,OAAO;AAAA,EAElC,OAAO,MAAM,QAAQ,cAAc,MAAM,QAAQ;AAAA;AAGlD,SAAS,iBAAiB,CAAC,OAA0C;AAAA,EACpE,IAAI,SAAS,QAAQ,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EACvD,IAAI,SAAS;AAAA,IAAO,OAAO;AAAA,EAE3B,MAAM,MAAM;AAAA,EAEZ,OAAO,OAAO,IAAI,SAAS,YAAY,IAAI,aAAa;AAAA;AAGzD,SAAS,YAAY,CAAC,MAA0B;AAAA,EAC/C,IAAI,QAAQ,QAAQ,OAAO,SAAS;AAAA,IAAW,OAAO,CAAC;AAAA,EAEvD,IAAI,MAAM,QAAQ,IAAI,GAAG;AAAA,IACxB,MAAM,MAAiB,CAAC;AAAA,IAExB,WAAW,SAAS,MAAM;AAAA,MACzB,IAAI,KAAK,GAAG,aAAa,KAAK,CAAC;AAAA,IAChC;AAAA,IAEA,OAAO;AAAA,EACR;AAAA,EAEA,IAAI,cAAc,IAAI,KAAK,KAAK,QAAQ,IAAI;AAAA,IAC3C,MAAM,WAAW,aAAa,KAAK,QAAQ;AAAA,IAE3C,IAAI,SAAS,SAAS;AAAA,MAAG,OAAO;AAAA,IAEhC,OAAO,aAAa,KAAK,MAAM,QAAQ;AAAA,EACxC;AAAA,EAEA,OAAO,CAAC,IAAI;AAAA;AAGb,SAAS,iBAAiB,CAAC,QAAgD;AAAA,EAC1E,IAAI,UAAU;AAAA,IAAM;AAAA,EAEpB,IAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,KAAK,kBAAkB,OAAO,EAAE,GAAG;AAAA,IAC/E,MAAM,OAA0B,CAAC;AAAA,IAEjC,WAAW,QAAQ,QAAQ;AAAA,MAC1B,IAAI,kBAAkB,IAAI;AAAA,QAAG,KAAK,KAAK,IAAI;AAAA,IAC5C;AAAA,IAEA,OAAO,KAAK,SAAS,IAAI,OAAO;AAAA,EACjC;AAAA,EAEA,IAAI,kBAAkB,MAAM;AAAA,IAAG,OAAO,CAAC,MAAM;AAAA,EAE7C,MAAM,YAAY,wBAAwB,MAAM;AAAA,EAEhD,OAAO,UAAU,SAAS,IAAI,YAAY;AAAA;AAG3C,SAAS,qBAAqB,CAAC,MAAuC;AAAA,EACrE,IAAI,kBAAkB,IAAI,GAAG;AAAA,IAC5B,MAAM,MAAuB,EAAE,MAAM,KAAK,MAAM,WAAW,KAAK,UAAU;AAAA,IAE1E,IAAI,KAAK;AAAA,MAAM,IAAI,OAAO,KAAK;AAAA,IAC/B,IAAI,KAAK,YAAY,KAAK,SAAS,SAAS;AAAA,MAAG,IAAI,WAAW,KAAK;AAAA,IAEnE,OAAO;AAAA,EACR;AAAA,EAEA,IAAI,CAAC,eAAe,IAAI;AAAA,IAAG,OAAO;AAAA,EAElC,MAAM,QAAQ,KAAK;AAAA,EACnB,MAAM,OAAO,MAAM;AAAA,EACnB,MAAM,YAAY,MAAM;AAAA,EAExB,IAAI,OAAO,SAAS,YAAY,aAAa;AAAA,IAAM,OAAO;AAAA,EAE1D,MAAM,MAAuB,EAAE,MAAM,UAAuC;AAAA,EAC5E,MAAM,OAAO,MAAM;AAAA,EAEnB,IAAI,QAAQ,QAAQ,OAAO,SAAS,UAAU;AAAA,IAC7C,IAAI,OAAO;AAAA,EACZ;AAAA,EAEA,MAAM,SAAS,kBAAkB,MAAM,YAAY,KAAK,QAAQ;AAAA,EAEhE,IAAI;AAAA,IAAQ,IAAI,WAAW;AAAA,EAE3B,OAAO;AAAA;AAGyE,SAAS,uBAAuB,CAAC,UAAsC;AAAA,EACvJ,MAAM,OAA0B,CAAC;AAAA,EAEjC,WAAW,QAAQ,aAAa,QAAQ,GAAG;AAAA,IAC1C,MAAM,MAAM,sBAAsB,IAAI;AAAA,IAEtC,IAAI;AAAA,MAAK,KAAK,KAAK,GAAG;AAAA,EACvB;AAAA,EAEA,OAAO;AAAA;AAGoE,SAAS,WAAW,CAAC,UAAiC;AAAA,EACjI,MAAM,MAAoB,CAAC;AAAA,EAE3B,WAAW,QAAQ,aAAa,QAAQ,GAAG;AAAA,IAC1C,IAAI,eAAe,IAAI,KAAK,kBAAkB,IAAI;AAAA,MAAG;AAAA,IAErD,IAAI,KAAK,IAAkB;AAAA,EAC5B;AAAA,EAEA,OAAO;AAAA;AAQD,IAAM,SAAS,IAAgB,CAAC,UAAU;AAAA,EAChD,MAAM,SAAS,aAAa,wBAAwB,MAAM,QAAQ,GAAG,MAAM,WAAW;AAAA,EAEtF,QAAQ,WAAW,MAAM;AAAA,EAEzB,UAAU,MAAM;AAAA,IACf,OAAO,QAAQ;AAAA,GACf;AAAA,EAED,MAAM,yBAAU,QAAC,cAAD;AAAA,IAAc,UAAU,MAAM,SAAS,KAAK,EAAE;AAAA,IAAU,UAAU,MAAM,SAAS,KAAK,EAAE;AAAA,IAAU,OAAO,MAAM,SAAS,KAAK,EAAE;AAAA,KAA/H,iCAAsI;AAAA,EACtJ,MAAM,SAAS,YAAY,MAAM,QAAQ;AAAA,EAEzC,IAAI,OAAO,WAAW;AAAA,IAAG,OAAO;AAAA,EAEhC,uBAAQ;AAAA,cAGD;AAAA,MAFC;AAAA,MACA;AAAA;AAAA,KAFA,gCAGD;AAAA,CACP;",
|
|
14
|
+
"debugId": "13D1B1C73A78E42B64756E2164756E21",
|
|
15
15
|
"names": []
|
|
16
16
|
}
|
package/dist/link-nav.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Link click interception
|
|
2
|
+
* Link click interception.
|
|
3
3
|
*/
|
|
4
|
-
import type { Reactive } from "sinwan/component";
|
|
5
4
|
/** Fields read from a click event to decide client-side navigation. */
|
|
6
5
|
export interface LinkClickEvent {
|
|
7
6
|
button: number;
|
|
@@ -15,11 +14,6 @@ export interface LinkInterceptOptions {
|
|
|
15
14
|
target?: string;
|
|
16
15
|
download?: string | boolean;
|
|
17
16
|
}
|
|
18
|
-
/**
|
|
19
|
-
* Sinwan JSX types `class` as `string`; the renderer accepts Reactive<string>.
|
|
20
|
-
* Isolated here so call sites do not use `any`.
|
|
21
|
-
*/
|
|
22
|
-
export declare function jsxClass(value: Reactive<string>): string;
|
|
23
17
|
/** True when the href should be left to the browser (other origin or scheme). */
|
|
24
18
|
export declare function isExternalHref(href: string): boolean;
|
|
25
19
|
/** True when the href is an in-page hash (no path change). */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sinwan-router",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Client-side router for Sinwan apps — declarative route matching, params, lazy loading, and prefetching built on Sinwan's reactivity system.",
|
|
5
5
|
"author": "Mohammed Ben Cheikh",
|
|
6
6
|
"license": "MIT",
|
|
@@ -39,13 +39,12 @@
|
|
|
39
39
|
"typecheck": "bunx tsc -p tsconfig.json"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
|
-
"sinwan": ">=
|
|
42
|
+
"sinwan": ">=2.0.0 <3.0.0",
|
|
43
|
+
"typescript": ">=5.0.0 <8.0.0"
|
|
43
44
|
},
|
|
44
45
|
"devDependencies": {
|
|
45
46
|
"@types/bun": "latest",
|
|
46
|
-
"bun-plugin-sinwan": "
|
|
47
|
-
"
|
|
48
|
-
"happy-dom": "^20.9.0",
|
|
49
|
-
"typescript": "^5"
|
|
47
|
+
"bun-plugin-sinwan": ">=1.0.0 <2.0.0",
|
|
48
|
+
"happy-dom": "^20.14.5"
|
|
50
49
|
}
|
|
51
|
-
}
|
|
50
|
+
}
|