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 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.0** (`<Key>` remounts when `cache` is omitted).
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" activeClass="active">
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 href="/users" activeClass="active" class="nav">
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.
@@ -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
- export interface LinkProps {
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 interface NavLinkProps extends LinkProps {
23
- activeClass?: string;
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/component";
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: '<a href="" class="" target="" download="" rel="" onclick="" onmouseenter=""><!--s:0--></a>',
557
- slots: [{
558
- path: [],
559
- type: "attr",
560
- name: "href"
561
- }, {
562
- path: [],
563
- type: "attr",
564
- name: "class"
565
- }, {
566
- path: [],
567
- type: "attr",
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: '<a href="" class="" target="" download="" rel="" onclick="" onmouseenter=""><!--s:0--></a>',
592
- slots: [{
593
- path: [],
594
- type: "attr",
595
- name: "href"
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: "<div>404 - Page not found</div>",
627
- slots: []
628
- };
629
- var _$tmpl_3 = {
630
- html: "<div>Loading...</div>",
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
- href,
652
- prefetch = true,
653
- class: cls,
654
- children,
655
- target,
656
- download,
657
- rel
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
- return _$createTemplate(_$tmpl_0, [href, cls, target, downloadAttr(download), rel, (e) => {
661
- onLinkClick(e, href, router, {
662
- target,
663
- download
664
- });
665
- }, () => {
666
- if (prefetch)
667
- router.prefetch(href);
668
- }, children]);
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
- var NavLink = cc(({
671
- href,
672
- prefetch = true,
673
- activeClass = "active",
674
- class: cls,
675
- children,
676
- target,
677
- download,
678
- rel
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 className = computed2(() => router.path === href || router.path.startsWith(href + "/") ? `${cls ?? ""} ${activeClass}`.trim() : cls ?? "");
682
- return _$createTemplate(_$tmpl_1, [href, jsxClass(() => className.value), target, downloadAttr(download), rel, (e) => {
683
- onLinkClick(e, href, router, {
684
- target,
685
- download
686
- });
687
- }, () => {
688
- if (prefetch)
689
- router.prefetch(href);
690
- }, children]);
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 DefaultNotFound = cc(() => _$createTemplate(_$tmpl_2, []));
693
- var DefaultLoading = cc(() => _$createTemplate(_$tmpl_3, []));
694
- var DefaultError = cc(() => _$createTemplate(_$tmpl_4, []));
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=E5E412759CFBC75864756E2164756E21
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 and JSX class adapter.\n */\n\nimport type { Reactive } from \"sinwan/component\";\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/**\n * Sinwan JSX types `class` as `string`; the renderer accepts Reactive<string>.\n * Isolated here so call sites do not use `any`.\n */\nexport function jsxClass(value: Reactive<string>): string {\n return value as string;\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",
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 */\n\nimport { cc, provide, onDispose } from \"sinwan/component\";\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\";\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 = Omit<RouteDefinition, \"children\"> & {\n children?: RouteDefinition | RouteDefinition[] | SinwanNode;\n};\nexport interface RoutesProps {\n children?: SinwanNode;\n fallback?: SinwanComponent;\n notFound?: SinwanComponent;\n error?: SinwanComponent<{\n error?: unknown;\n }>;\n initialPath?: string;\n}\nfunction isElementLike(value: unknown): value is SinwanElement {\n return value != null && typeof value === \"object\" && \"tag\" in value;\n}\nfunction routePropsRecord(props: RouteProps): Record<string, unknown> {\n const record: Record<string, unknown> = {\n path: props.path,\n component: props.component\n };\n if (props.meta !== undefined) record.meta = props.meta;\n if (props.children !== undefined) record.children = props.children;\n return record;\n}\n\n/** Marker for a single route. Same props as `RouteDefinition`. */\nexport function Route(props: RouteProps): SinwanElement {\n return {\n tag: ROUTE_TYPE,\n props: routePropsRecord(props),\n children: []\n };\n}\nexport function isRouteElement(value: unknown): value is SinwanElement {\n if (!isElementLike(value)) return false;\n return value.tag === ROUTE_TYPE || value.tag === Route;\n}\nfunction isRouteDefinition(value: unknown): value is RouteDefinition {\n if (value == null || typeof value !== \"object\") return false;\n if (\"tag\" in value) return false;\n const rec = value as {\n path?: unknown;\n component?: unknown;\n };\n return typeof rec.path === \"string\" && rec.component != null;\n}\nfunction flattenNodes(node: unknown): unknown[] {\n if (node == null || typeof node === \"boolean\") return [];\n if (Array.isArray(node)) {\n const out: unknown[] = [];\n for (const child of node) {\n out.push(...flattenNodes(child));\n }\n return out;\n }\n if (isElementLike(node) && node.tag === \"\") {\n const fromKids = flattenNodes(node.children);\n if (fromKids.length > 0) return fromKids;\n return flattenNodes(node.props.children);\n }\n return [node];\n}\nfunction nestedDefinitions(source: unknown): RouteDefinition[] | undefined {\n if (source == null) return undefined;\n if (Array.isArray(source) && source.length > 0 && isRouteDefinition(source[0])) {\n const defs: RouteDefinition[] = [];\n for (const item of source) {\n if (isRouteDefinition(item)) defs.push(item);\n }\n return defs.length > 0 ? defs : undefined;\n }\n if (isRouteDefinition(source)) return [source];\n const collected = collectRouteDefinitions(source);\n return collected.length > 0 ? collected : undefined;\n}\nfunction routeNodeToDefinition(node: unknown): RouteDefinition | null {\n if (isRouteDefinition(node)) {\n const def: RouteDefinition = {\n path: node.path,\n component: node.component\n };\n if (node.meta) def.meta = node.meta;\n if (node.children && node.children.length > 0) def.children = node.children;\n return def;\n }\n if (!isRouteElement(node)) return null;\n const props = node.props;\n const path = props.path;\n const component = props.component;\n if (typeof path !== \"string\" || component == null) return null;\n const def: RouteDefinition = {\n path,\n component: component as RouteComponent\n };\n const meta = props.meta;\n if (meta != null && typeof meta === \"object\") {\n def.meta = meta as Record<string, unknown>;\n }\n const nested = nestedDefinitions(props.children ?? node.children);\n if (nested) def.children = nested;\n return def;\n}\n\n/** Walk JSX children (and fragments) into native `RouteDefinition[]`. */\nexport function collectRouteDefinitions(children: unknown): RouteDefinition[] {\n const defs: RouteDefinition[] = [];\n for (const node of flattenNodes(children)) {\n const def = routeNodeToDefinition(node);\n if (def) defs.push(def);\n }\n return defs;\n}\n\n/** Non-route siblings (nav, layout) to render beside the outlet. */\nexport function layoutNodes(children: unknown): SinwanNode[] {\n const out: SinwanNode[] = [];\n for (const node of flattenNodes(children)) {\n if (isRouteElement(node) || isRouteDefinition(node)) continue;\n out.push(node as SinwanNode);\n }\n return 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>(({\n children,\n fallback,\n notFound,\n error,\n initialPath\n}) => {\n const router = createRouter(collectRouteDefinitions(children), initialPath);\n provide(RouterKey, router);\n onDispose(() => {\n router.dispose();\n });\n const outlet = <RouterOutlet fallback={fallback} notFound={notFound} error={error} />;\n const layout = layoutNodes(children);\n if (layout.length === 0) return outlet;\n return <>\n {layout}\n {outlet}\n </>;\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": ";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;AA0FA;AACA;AAEA,qBAAS;;;ACtFT;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;;;ACzEd,SAAS,QAAQ,CAAC,OAAiC;AAAA,EACxD,OAAO;AAAA;AAIF,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;;;AClEF,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;;;;AH/DtE,IAAM,WAAW;AAAA,EACf,MAAM;AAAA,EACN,OAAO,CAAC;AAAA,IACN,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR,GAAG;AAAA,IACD,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR,GAAG;AAAA,IACD,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR,GAAG;AAAA,IACD,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR,GAAG;AAAA,IACD,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR,GAAG;AAAA,IACD,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR,GAAG;AAAA,IACD,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR,GAAG;AAAA,IACD,MAAM,CAAC,CAAC;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AACH;AACA,IAAM,WAAW;AAAA,EACf,MAAM;AAAA,EACN,OAAO,CAAC;AAAA,IACN,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR,GAAG;AAAA,IACD,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR,GAAG;AAAA,IACD,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR,GAAG;AAAA,IACD,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR,GAAG;AAAA,IACD,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR,GAAG;AAAA,IACD,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR,GAAG;AAAA,IACD,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR,GAAG;AAAA,IACD,MAAM,CAAC,CAAC;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AACH;AACA,IAAM,WAAW;AAAA,EACf,MAAM;AAAA,EACN,OAAO,CAAC;AACV;AACA,IAAM,WAAW;AAAA,EACf,MAAM;AAAA,EACN,OAAO,CAAC;AACV;AACA,IAAM,WAAW;AAAA,EACf,MAAM;AAAA,EACN,OAAO,CAAC;AACV;AA8BA,SAAS,WAAW,CAAC,OAAmB,MAAc,QAAgB,SAAqC;AAAA,EACzG,IAAI,CAAC,yBAAyB,OAAO,MAAM,OAAO,MAAM,OAAO;AAAA,IAAG;AAAA,EAClE,MAAM,eAAe;AAAA,EACrB,OAAO,SAAS,IAAI;AAAA;AAEtB,SAAS,YAAY,CAAC,UAA4D;AAAA,EAChF,IAAI,aAAa,aAAa,aAAa;AAAA,IAAO;AAAA,EAClD,IAAI,aAAa;AAAA,IAAM,OAAO;AAAA,EAC9B,OAAO;AAAA;AAOF,IAAM,OAAO,GAAc;AAAA,EAChC;AAAA,EACA,WAAW;AAAA,EACX,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,MACI;AAAA,EACJ,MAAM,SAAS,UAAU;AAAA,EACzB,OAAO,iBAAiB,UAAU,CAAC,MAAM,KAAK,QAAQ,aAAa,QAAQ,GAAG,KAAK,CAAC,MAAkB;AAAA,IACpG,YAAY,GAAG,MAAM,QAAQ;AAAA,MAC3B;AAAA,MACA;AAAA,IACF,CAAC;AAAA,KACA,MAAM;AAAA,IACP,IAAI;AAAA,MAAU,OAAO,SAAS,IAAI;AAAA,KACjC,QAAQ,CAAC;AAAA,CACb;AAYM,IAAM,UAAU,GAAiB;AAAA,EACtC;AAAA,EACA,WAAW;AAAA,EACX,cAAc;AAAA,EACd,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,MACI;AAAA,EACJ,MAAM,SAAS,UAAU;AAAA,EACzB,MAAM,YAAY,UAAS,MAAM,OAAO,SAAS,QAAQ,OAAO,KAAK,WAAW,OAAO,GAAG,IAAI,GAAG,OAAO,MAAM,cAAc,KAAK,IAAI,OAAO,EAAE;AAAA,EAC9I,OAAO,iBAAiB,UAAU,CAAC,MAAM,SAAS,MAAM,UAAU,KAAK,GAAG,QAAQ,aAAa,QAAQ,GAAG,KAAK,CAAC,MAAkB;AAAA,IAChI,YAAY,GAAG,MAAM,QAAQ;AAAA,MAC3B;AAAA,MACA;AAAA,IACF,CAAC;AAAA,KACA,MAAM;AAAA,IACP,IAAI;AAAA,MAAU,OAAO,SAAS,IAAI;AAAA,KACjC,QAAQ,CAAC;AAAA,CACb;AAaD,IAAM,kBAAkB,GAAG,MAAM,iBAAiB,UAAU,CAAC,CAAC,CAAC;AAC/D,IAAM,iBAAiB,GAAG,MAAM,iBAAiB,UAAU,CAAC,CAAC,CAAC;AAC9D,IAAM,eAAe,GAElB,MAAM,iBAAiB,UAAU,CAAC,CAAC,CAAC;AACvC,SAAS,iBAAiB,CAAC,SAAuB,QAAgB,UAA2B,WAE7E;AAAA,EACd,MAAM,QAAQ,QAAQ;AAAA,EACtB,IAAI,CAAC,gBAAgB,MAAM,SAAS,GAAG;AAAA,IACrC,MAAM,OAAO,MAAM;AAAA,IACnB,uBAAO,OAAC,MAAD,qCAAM;AAAA,EACf;AAAA,EACA,MAAM,WAAW,QAAQ;AAAA,EACzB,MAAM,QAAQ,OAAO,SAAS,QAAQ;AAAA,EACtC,IAAI,MAAM,WAAW,SAAS;AAAA,IAC5B,MAAM,OAAO,MAAM;AAAA,IACnB,uBAAO,OAAC,MAAD,qCAAM;AAAA,EACf;AAAA,EACA,IAAI,MAAM,WAAW,SAAS;AAAA,IAC5B,MAAM,YAAY;AAAA,IAClB,uBAAO,OAAC,WAAD;AAAA,MAAW,OAAO,MAAM;AAAA,OAAxB,iCAA+B;AAAA,EACxC;AAAA,EACA,OAAO,WAAW,UAAU,MAAM,SAAS;AAAA,EAC3C,MAAM,WAAW;AAAA,EACjB,uBAAO,OAAC,UAAD,qCAAU;AAAA;AAQZ,IAAM,eAAe,GAAsB;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,MACJ;AAAA,EACJ,MAAM,SAAS,UAAU;AAAA,EACzB,MAAM,WAAW,YAAY;AAAA,EAC7B,MAAM,WAAW,YAAY;AAAA,EAC7B,MAAM,YAAY,SAAS;AAAA,EAC3B,uBAAO,OASD,KATC;AAAA,IAAK,MAAM,MAAM,iBAAiB,QAAQ,KAAK;AAAA,IAA/C,UACA,MAAM;AAAA,MACT,MAAM,UAAU,gBAAgB,OAAO,SAAS,KAAK;AAAA,MACrD,IAAI,CAAC,SAAS;AAAA,QACZ,IAAI,QAAQ;AAAA,UAAG,OAAO;AAAA,QACtB,uBAAO,OAAC,UAAD,qCAAU;AAAA,MACnB;AAAA,MACA,OAAO,kBAAkB,SAAS,QAAQ,UAAU,SAAS;AAAA;AAAA,KAP1D,iCASD;AAAA,CACP;;AI/OD,eAAS;;AAMF,IAAM,aAAa,OAAO,IAAI,qBAAqB;AAkB1D,SAAS,aAAa,CAAC,OAAwC;AAAA,EAC7D,OAAO,SAAS,QAAQ,OAAO,UAAU,YAAY,SAAS;AAAA;AAEhE,SAAS,gBAAgB,CAAC,OAA4C;AAAA,EACpE,MAAM,SAAkC;AAAA,IACtC,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM;AAAA,EACnB;AAAA,EACA,IAAI,MAAM,SAAS;AAAA,IAAW,OAAO,OAAO,MAAM;AAAA,EAClD,IAAI,MAAM,aAAa;AAAA,IAAW,OAAO,WAAW,MAAM;AAAA,EAC1D,OAAO;AAAA;AAIF,SAAS,KAAK,CAAC,OAAkC;AAAA,EACtD,OAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,iBAAiB,KAAK;AAAA,IAC7B,UAAU,CAAC;AAAA,EACb;AAAA;AAEK,SAAS,cAAc,CAAC,OAAwC;AAAA,EACrE,IAAI,CAAC,cAAc,KAAK;AAAA,IAAG,OAAO;AAAA,EAClC,OAAO,MAAM,QAAQ,cAAc,MAAM,QAAQ;AAAA;AAEnD,SAAS,iBAAiB,CAAC,OAA0C;AAAA,EACnE,IAAI,SAAS,QAAQ,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EACvD,IAAI,SAAS;AAAA,IAAO,OAAO;AAAA,EAC3B,MAAM,MAAM;AAAA,EAIZ,OAAO,OAAO,IAAI,SAAS,YAAY,IAAI,aAAa;AAAA;AAE1D,SAAS,YAAY,CAAC,MAA0B;AAAA,EAC9C,IAAI,QAAQ,QAAQ,OAAO,SAAS;AAAA,IAAW,OAAO,CAAC;AAAA,EACvD,IAAI,MAAM,QAAQ,IAAI,GAAG;AAAA,IACvB,MAAM,MAAiB,CAAC;AAAA,IACxB,WAAW,SAAS,MAAM;AAAA,MACxB,IAAI,KAAK,GAAG,aAAa,KAAK,CAAC;AAAA,IACjC;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,IAAI,cAAc,IAAI,KAAK,KAAK,QAAQ,IAAI;AAAA,IAC1C,MAAM,WAAW,aAAa,KAAK,QAAQ;AAAA,IAC3C,IAAI,SAAS,SAAS;AAAA,MAAG,OAAO;AAAA,IAChC,OAAO,aAAa,KAAK,MAAM,QAAQ;AAAA,EACzC;AAAA,EACA,OAAO,CAAC,IAAI;AAAA;AAEd,SAAS,iBAAiB,CAAC,QAAgD;AAAA,EACzE,IAAI,UAAU;AAAA,IAAM;AAAA,EACpB,IAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,KAAK,kBAAkB,OAAO,EAAE,GAAG;AAAA,IAC9E,MAAM,OAA0B,CAAC;AAAA,IACjC,WAAW,QAAQ,QAAQ;AAAA,MACzB,IAAI,kBAAkB,IAAI;AAAA,QAAG,KAAK,KAAK,IAAI;AAAA,IAC7C;AAAA,IACA,OAAO,KAAK,SAAS,IAAI,OAAO;AAAA,EAClC;AAAA,EACA,IAAI,kBAAkB,MAAM;AAAA,IAAG,OAAO,CAAC,MAAM;AAAA,EAC7C,MAAM,YAAY,wBAAwB,MAAM;AAAA,EAChD,OAAO,UAAU,SAAS,IAAI,YAAY;AAAA;AAE5C,SAAS,qBAAqB,CAAC,MAAuC;AAAA,EACpE,IAAI,kBAAkB,IAAI,GAAG;AAAA,IAC3B,MAAM,MAAuB;AAAA,MAC3B,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,IACA,IAAI,KAAK;AAAA,MAAM,IAAI,OAAO,KAAK;AAAA,IAC/B,IAAI,KAAK,YAAY,KAAK,SAAS,SAAS;AAAA,MAAG,IAAI,WAAW,KAAK;AAAA,IACnE,OAAO;AAAA,EACT;AAAA,EACA,IAAI,CAAC,eAAe,IAAI;AAAA,IAAG,OAAO;AAAA,EAClC,MAAM,QAAQ,KAAK;AAAA,EACnB,MAAM,OAAO,MAAM;AAAA,EACnB,MAAM,YAAY,MAAM;AAAA,EACxB,IAAI,OAAO,SAAS,YAAY,aAAa;AAAA,IAAM,OAAO;AAAA,EAC1D,MAAM,MAAuB;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAM,OAAO,MAAM;AAAA,EACnB,IAAI,QAAQ,QAAQ,OAAO,SAAS,UAAU;AAAA,IAC5C,IAAI,OAAO;AAAA,EACb;AAAA,EACA,MAAM,SAAS,kBAAkB,MAAM,YAAY,KAAK,QAAQ;AAAA,EAChE,IAAI;AAAA,IAAQ,IAAI,WAAW;AAAA,EAC3B,OAAO;AAAA;AAIF,SAAS,uBAAuB,CAAC,UAAsC;AAAA,EAC5E,MAAM,OAA0B,CAAC;AAAA,EACjC,WAAW,QAAQ,aAAa,QAAQ,GAAG;AAAA,IACzC,MAAM,MAAM,sBAAsB,IAAI;AAAA,IACtC,IAAI;AAAA,MAAK,KAAK,KAAK,GAAG;AAAA,EACxB;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,WAAW,CAAC,UAAiC;AAAA,EAC3D,MAAM,MAAoB,CAAC;AAAA,EAC3B,WAAW,QAAQ,aAAa,QAAQ,GAAG;AAAA,IACzC,IAAI,eAAe,IAAI,KAAK,kBAAkB,IAAI;AAAA,MAAG;AAAA,IACrD,IAAI,KAAK,IAAkB;AAAA,EAC7B;AAAA,EACA,OAAO;AAAA;AAQF,IAAM,SAAS,IAAgB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,MACI;AAAA,EACJ,MAAM,SAAS,aAAa,wBAAwB,QAAQ,GAAG,WAAW;AAAA,EAC1E,QAAQ,WAAW,MAAM;AAAA,EACzB,UAAU,MAAM;AAAA,IACd,OAAO,QAAQ;AAAA,GAChB;AAAA,EACD,MAAM,yBAAS,QAAC,cAAD;AAAA,IAAc;AAAA,IAAoB;AAAA,IAAoB;AAAA,KAAtD,iCAAoE;AAAA,EACnF,MAAM,SAAS,YAAY,QAAQ;AAAA,EACnC,IAAI,OAAO,WAAW;AAAA,IAAG,OAAO;AAAA,EAChC,uBAAO;AAAA,cAGD;AAAA,MAFC;AAAA,MACA;AAAA;AAAA,KAFA,gCAGD;AAAA,CACP;",
14
- "debugId": "E5E412759CFBC75864756E2164756E21",
13
+ "mappings": "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",
14
+ "debugId": "13D1B1C73A78E42B64756E2164756E21",
15
15
  "names": []
16
16
  }
@@ -1,7 +1,6 @@
1
1
  /**
2
- * Link click interception and JSX class adapter.
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.1",
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": ">=1.3.0 <2.0.0"
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": "^0.2.5",
47
- "sinwan": "^1.3.0",
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
+ }