@finesoft/front 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ const e={FLOW:`flow`,EXTERNAL_URL:`externalUrl`,COMPOUND:`compound`};function t(t){return t.kind===e.FLOW}function n(t){return t.kind===e.EXTERNAL_URL}function r(t){return t.kind===e.COMPOUND}function i(t,n){return{kind:e.FLOW,url:t,presentationContext:n}}function a(t){return{kind:e.EXTERNAL_URL,url:t}}var o=class{handlers=new Map;onAction(e,t){if(this.handlers.has(e)){console.warn(`[ActionDispatcher] kind="${e}" already registered, skipping`);return}this.handlers.set(e,t)}removeAction(e){return this.handlers.delete(e)}async perform(e,t=0){if(r(e)){if(t>=32)throw Error(`[ActionDispatcher] CompoundAction recursion depth exceeded (max 32)`);for(let n of e.actions)await this.perform(n,t+1);return}let n=this.handlers.get(e.kind);if(!n){console.warn(`[ActionDispatcher] No handler for kind="${e.kind}"`);return}await n(e)}},s=class{controllers=new Map;register(e){this.controllers.set(e.intentId,e)}async dispatch(e,t){let n=this.controllers.get(e.id);if(!n)throw Error(`[IntentDispatcher] No controller for "${e.id}". Registered: [${Array.from(this.controllers.keys()).join(`, `)}]`);return n.perform(e,t)}has(e){return this.controllers.has(e)}},c=class e{registrations=new Map;resolutionStack=new Set;parent;children=new Set;register(e,t,n=!0){return this.registrations.set(e,{factory:t,singleton:n}),this}resolve(e){let t=this.registrations.get(e);if(!t){if(this.parent)return this.parent.resolve(e);throw Error(`[Container] No registration for key: "${e}"`)}if(t.singleton){if(t.instance===void 0){if(this.resolutionStack.has(e))throw Error(`[Container] Circular dependency detected: ${[...this.resolutionStack,e].join(` → `)}`);this.resolutionStack.add(e);try{t.instance=t.factory()}finally{this.resolutionStack.delete(e)}}return t.instance}return t.factory()}has(e){return this.registrations.has(e)||(this.parent?.has(e)??!1)}unregister(e){return this.registrations.delete(e)}createScope(){let t=new e;return t.parent=this,this.children.add(t),t}dispose(){let e=Array.from(this.children);for(let t of e)t.dispose();this.children.clear();for(let e of this.registrations.values())e.instance=void 0;this.registrations.clear(),this.parent&&=(this.parent.children.delete(this),void 0)}};function l(e){if(!e)return{ok:!1,reason:`empty host`};let t=e.toLowerCase(),n=t.startsWith(`[`)&&t.endsWith(`]`)?t.slice(1,-1):t;if(n===`localhost`||n.endsWith(`.localhost`))return{ok:!1,reason:`loopback host forbidden`};if(n.includes(`:`))return m(n);let r=d(n);return r?p(r):{ok:!0}}function u(e){let t;try{t=new URL(e)}catch{return{ok:!1,reason:`invalid URL`}}return t.protocol!==`http:`&&t.protocol!==`https:`?{ok:!1,reason:`scheme "${t.protocol}" not allowed (only http/https)`}:l(t.hostname)}function d(e){if(e.length===0)return null;if(!e.includes(`.`)){let t=f(e);return t===null||t<0||t>4294967295?null:[t>>>24&255,t>>>16&255,t>>>8&255,t&255]}let t=e.split(`.`);if(t.length!==4)return null;let n=[];for(let e of t){let t=f(e);if(t===null||t<0||t>255)return null;n.push(t)}return n}function f(e){if(e.length===0)return null;if(e.startsWith(`0x`)||e.startsWith(`0X`)){let t=e.slice(2);return/^[0-9a-f]+$/i.test(t)?parseInt(t,16):null}return e.length>1&&e.startsWith(`0`)?/^[0-7]+$/.test(e)?parseInt(e,8):null:/^[0-9]+$/.test(e)?parseInt(e,10):null}function p(e){let[t,n]=e;return t===0?{ok:!1,reason:`unspecified IPv4 forbidden`}:t===127?{ok:!1,reason:`loopback IPv4 forbidden`}:t===10?{ok:!1,reason:`private IPv4 (10/8) forbidden`}:t===172&&n>=16&&n<=31?{ok:!1,reason:`private IPv4 (172.16/12) forbidden`}:t===192&&n===168?{ok:!1,reason:`private IPv4 (192.168/16) forbidden`}:t===169&&n===254?{ok:!1,reason:`link-local IPv4 forbidden`}:t===100&&n>=64&&n<=127?{ok:!1,reason:`CGNAT IPv4 forbidden`}:t>=224&&t<=239?{ok:!1,reason:`multicast IPv4 forbidden`}:t>=240?{ok:!1,reason:`reserved IPv4 forbidden`}:{ok:!0}}function m(e){let t=e.toLowerCase();if(t===`::`||t===`::0`)return{ok:!1,reason:`unspecified IPv6 forbidden`};if(t===`::1`)return{ok:!1,reason:`loopback IPv6 forbidden`};if(t.startsWith(`fe8`)||t.startsWith(`fe9`)||t.startsWith(`fea`)||t.startsWith(`feb`))return{ok:!1,reason:`link-local IPv6 forbidden`};if(t.startsWith(`fc`)||t.startsWith(`fd`))return{ok:!1,reason:`ULA IPv6 forbidden`};if(t.startsWith(`ff`))return{ok:!1,reason:`multicast IPv6 forbidden`};let n=h(t);if(n){let e=p(n);if(!e.ok)return{ok:!1,reason:`IPv4-in-IPv6 ${e.reason}`}}return{ok:!0}}function h(e){let t=e.match(/(?:^|:)((?:\d{1,3}\.){3}\d{1,3})$/);if(t){let e=d(t[1]);if(e)return e}let n=e.match(/(?:^|:)([0-9a-f]{1,4}):([0-9a-f]{1,4})$/);if(n&&(e.startsWith(`::ffff:`)||e.includes(`:ffff:`))){let e=parseInt(n[1],16),t=parseInt(n[2],16);return[e>>>8&255,e&255,t>>>8&255,t&255]}return null}var g=class extends Error{constructor(e,t,n){super(`HTTP ${e}: ${t}`),this.status=e,this.statusText=t,this.body=n,this.name=`HttpError`}},_=class extends Error{constructor(e,t){super(`Refused to fetch ${e}: ${t}`),this.url=e,this.reason=t,this.name=`HostGuardError`}},v=class{baseUrl;defaultHeaders;fetchFn;requestInterceptors;responseInterceptors;allowInternalHosts;validateDns;constructor(e){this.baseUrl=e.baseUrl,this.defaultHeaders=e.defaultHeaders??{},this.fetchFn=e.fetch??globalThis.fetch.bind(globalThis),this.requestInterceptors=[...e.requestInterceptors??[]],this.responseInterceptors=[...e.responseInterceptors??[]],this.allowInternalHosts=e.allowInternalHosts??!1,this.validateDns=e.validateDns??!0}useRequestInterceptor(e){return this.requestInterceptors.push(e),this}useResponseInterceptor(e){return this.responseInterceptors.push(e),this}async get(e,t){return this.request(`GET`,e,{params:t})}async post(e,t,n){return this.request(`POST`,e,{body:t,params:n})}async put(e,t,n){return this.request(`PUT`,e,{body:t,params:n})}async del(e,t){return this.request(`DELETE`,e,{params:t})}async request(e,t,n){let r=this.buildUrl(t,n?.params);this.allowInternalHosts||await this.enforceHostGuard(r);let i={...this.defaultHeaders,...n?.headers},a={method:e,headers:i};n?.body!==void 0&&(Object.keys(i).some(e=>e.toLowerCase()===`content-type`)||(i[`Content-Type`]=`application/json`),a.body=JSON.stringify(n.body));for(let e of this.requestInterceptors)a=await e(r,a);let o=await this.fetchFn(r,a);for(let e of this.responseInterceptors)o=await e(o,r);if(!o.ok){let e=await o.text().catch(()=>void 0);throw new g(o.status,o.statusText,e)}try{return await o.json()}catch(e){throw e instanceof SyntaxError?new g(o.status,`Invalid JSON response`,await o.text().catch(()=>void 0)):e}}buildUrl(e,t){let n=this.baseUrl.endsWith(`/`)?this.baseUrl.slice(0,-1):this.baseUrl,r=e.startsWith(`/`)?e:`/${e}`,i=new URL(`${n}${r}`,`http://placeholder`);if(t)for(let[e,n]of Object.entries(t))i.searchParams.set(e,n);return this.baseUrl.startsWith(`http`)?i.toString():`${i.pathname}${i.search}`}async enforceHostGuard(e){let t;try{t=new URL(e)}catch{return}let n=u(e);if(!n.ok)throw new _(e,n.reason);if(this.validateDns&&t.hostname&&!y(t.hostname)){let n=await b(t.hostname);if(!n.ok)throw new _(e,n.reason)}}};function y(e){return e.includes(`:`)?!0:/^[0-9.]+$/.test(e)||/^0x[0-9a-f]+$/i.test(e)}async function b(e){let t;try{let e=await import(`node:dns/promises`);t=e.default??e}catch{return{ok:!0}}let n=await Promise.allSettled([t.resolve4(e),t.resolve6(e)]),r=[];for(let e of n)e.status===`fulfilled`&&r.push(...e.value);if(r.length===0)return{ok:!0};for(let e of r){let t=u(`http://${e.includes(`:`)?`[${e}]`:e}/`);if(!t.ok)return{ok:!1,reason:`host resolves to ${e} (${t.reason})`}}return{ok:!0}}function x(e,t={}){let n=t.allowInternalHosts??!1,r=t.validateDns??!0;return async function(t,i){if(!n){let e=C(t);if(e&&S(e)){let t=u(e);if(!t.ok)throw new _(e,t.reason);if(r){let t=new URL(e);if(t.hostname&&!w(t.hostname)){let n=await T(t.hostname);if(!n.ok)throw new _(e,n.reason)}}}}return e(t,i)}}function S(e){try{return new URL(e),!0}catch{return!1}}function C(e){return typeof e==`string`?e:e instanceof URL?e.toString():typeof Request<`u`&&e instanceof Request?e.url:null}function w(e){return e.includes(`:`)?!0:/^[0-9.]+$/.test(e)||/^0x[0-9a-f]+$/i.test(e)}async function T(e){let t;try{let e=await import(`node:dns/promises`);t=e.default??e}catch{return{ok:!0}}let n;try{n=await t.lookup(e,{all:!0})}catch{return{ok:!0}}if(n.length===0)return{ok:!0};for(let{address:e}of n){let t=u(`http://${e.includes(`:`)?`[${e}]`:e}/`);if(!t.ok)return{ok:!1,reason:`host resolves to ${e} (${t.reason})`}}return{ok:!0}}const ee=new Set([`ar`,`arc`,`dv`,`fa`,`ha`,`he`,`khw`,`ks`,`ku`,`ps`,`ur`,`yi`]);function te(e){let t=e.split(`-`)[0].toLowerCase();return ee.has(t)}function ne(e){return te(e)?`rtl`:`ltr`}function re(e){return{lang:e,dir:ne(e)}}function ie(e,t){return{language:e,region:t,bcp47:t?`${e}-${t}`:e,dir:ne(e)}}function ae(e){document.documentElement.lang=e.lang,document.documentElement.dir=e.dir}function oe(e,t){let n=e.split(`?`)[0].match(/^\/([^/]+)(\/.*)?$/);if(!n)return null;let r=n[1],i=t.find(e=>e.toLowerCase()===r.toLowerCase());return i?{locale:i,strippedUrl:n[2]||`/`}:null}async function se(e,t){if(!e||!t)return;let n=await ce();if(n)return n(e,t)}async function ce(){if(typeof globalThis.__FINESOFT_I18N_LOADER__==`function`)return globalThis.__FINESOFT_I18N_LOADER__;if(typeof __FINESOFT_I18N_LOADER_SPECIFIER__==`string`)try{let e=await import(__FINESOFT_I18N_LOADER_SPECIFIER__),t=typeof e==`function`?e:typeof e?.loadMessages==`function`?e.loadMessages:void 0;return t?(globalThis.__FINESOFT_I18N_LOADER__=t,t):void 0}catch{return}}async function le(e){let{locale:t,loadMessages:n,context:r}=e;if(!(!t||!r))return n?n(t,r):se(t,r)}function ue(e,t){let n=Object.entries(e);if(n.length===0)return;if(typeof n[0][1]==`string`)return e;let r=e[t];if(!r)return;let i={};for(let[e,t]of Object.entries(r)){if(typeof t==`string`){i[e]=t;continue}for(let[n,r]of Object.entries(t))i[`${e}.${n}`]=r}return i}function de(e,t){return t?e.replace(/\{(\w+)\}/g,(e,n)=>{let r=t[n];return r===void 0?`{${n}}`:String(r)}):e}function fe(e){return e===1?`one`:`other`}function pe(e,t){return`${e}.${t}`}var me=class{locale;messages;pluralRule;fallback;constructor(e){this.locale=e.locale,this.messages=e.messages,this.pluralRule=e.pluralRule??fe,this.fallback=e.fallback??(e=>e)}t(e,t){let n=this.messages[e];return n===void 0?this.fallback(e):de(n,t)}plural(e,t,n){let r=pe(e,this.pluralRule(t)),i={count:t,...n};return this.t(r,i)}},he=class{constructor(e){this.factories=e}loggerFor(e){return new ge(this.factories.map(t=>t.loggerFor(e)))}},ge=class{constructor(e){this.loggers=e}debug(...e){return this.callAll(`debug`,e)}info(...e){return this.callAll(`info`,e)}warn(...e){return this.callAll(`warn`,e)}error(...e){return this.callAll(`error`,e)}callAll(e,t){for(let n of this.loggers)n[e](...t);return``}},_e=class{category;constructor(e){this.category=e}};const ve={"*":4,debug:4,info:3,warn:2,error:1,off:0,"":0};let E,ye;function be(){if(globalThis.localStorage===void 0)return{};let e;try{e=globalThis.localStorage.getItem(`onyxLog`)}catch{return{}}if(!e)return{};if(e===ye&&E)return E;ye=e;let t={},n=e.split(`,`);for(let e of n){let[n,r]=e.trim().split(`=`);if(!n||r===void 0)continue;let i=ve[r.toLowerCase()]??void 0;i!==void 0&&(n===`*`?t.defaultLevel=i:(t.named??={},t.named[n]=i))}return E=t,t}function D(e,t){let n=be();if(n.defaultLevel===void 0&&!n.named)return!0;let r=ve[t]??4;return n.named?.[e]===void 0?n.defaultLevel===void 0?!0:r<=n.defaultLevel:r<=n.named[e]}function xe(){E=void 0,ye=void 0}var Se=class extends _e{debug(...e){return D(this.category,`debug`)&&console.debug(`[${this.category}]`,...e),``}info(...e){return D(this.category,`info`)&&console.info(`[${this.category}]`,...e),``}warn(...e){return D(this.category,`warn`)&&console.warn(`[${this.category}]`,...e),``}error(...e){return console.error(`[${this.category}]`,...e),``}},Ce=class{loggerFor(e){return new Se(e)}};const we={debug:0,info:1,warn:2,error:3};var Te=class extends _e{minPriority;report;constructor(e,t){super(e),this.minPriority=we[t.minLevel??`warn`],this.report=t.report}debug(...e){return this.maybeReport(`debug`,e),``}info(...e){return this.maybeReport(`info`,e),``}warn(...e){return this.maybeReport(`warn`,e),``}error(...e){return this.maybeReport(`error`,e),``}maybeReport(e,t){if(!(we[e]<this.minPriority))try{this.report(e,this.category,t)}catch(e){console.error(`[ReportingLogger] report callback threw:`,e)}}},Ee=class{options;constructor(e){this.options=e}loggerFor(e){return new Te(e,this.options)}},De=class{prefix;constructor(e=`Metrics`){this.prefix=e}record(e,t){console.info(`[${this.prefix}:${e}]`,t??``)}async flush(){}destroy(){}};function Oe(e){let t=e??(typeof navigator<`u`?navigator.userAgent:``),n=t.toLowerCase();return{os:ke(n),browser:Ae(n),engine:je(n),isMobile:/mobile|android|iphone|ipad|ipod/i.test(t),isTouch:typeof navigator<`u`&&`maxTouchPoints`in navigator?navigator.maxTouchPoints>0:!1}}function ke(e){return/iphone|ipad|ipod/.test(e)?`ios`:/android/.test(e)?`android`:/macintosh|mac os x/.test(e)?`macos`:/windows/.test(e)?`windows`:/linux/.test(e)?`linux`:`unknown`}function Ae(e){return/edg\//.test(e)?`edge`:/opr\/|opera/.test(e)?`opera`:/samsungbrowser/.test(e)?`samsung`:/chrome|crios/.test(e)&&!/edg\//.test(e)?`chrome`:/firefox|fxios/.test(e)?`firefox`:/safari/.test(e)&&!/chrome/.test(e)?`safari`:`unknown`}function je(e){return/applewebkit/.test(e)&&!/chrome/.test(e)?`webkit`:/applewebkit/.test(e)&&/chrome/.test(e)?`blink`:/gecko\//.test(e)?`gecko`:`unknown`}const O={LOGGER:`logger`,LOGGER_FACTORY:`loggerFactory`,NET:`net`,STORAGE:`storage`,FEATURE_FLAGS:`featureFlags`,METRICS:`metrics`,FETCH:`fetch`,SAFE_FETCH:`safeFetch`,EVENT_RECORDER:`eventRecorder`,LOCALE:`locale`,PLATFORM:`platform`,TRANSLATOR:`translator`};var Me=class{store=new Map;get(e){return this.store.get(e)}set(e,t){this.store.set(e,t)}delete(e){this.store.delete(e)}},Ne=class{flags;providers=[];constructor(e={}){this.flags=e}addProvider(e){this.providers.push(e)}isEnabled(e){for(let t=this.providers.length-1;t>=0;t--)if(this.providers[t].isEnabled(e))return!0;return this.flags[e]===!0}getString(e){for(let t=this.providers.length-1;t>=0;t--){let n=this.providers[t].getString?.(e);if(n!==void 0)return n}let t=this.flags[e];return typeof t==`string`?t:void 0}getNumber(e){for(let t=this.providers.length-1;t>=0;t--){let n=this.providers[t].getNumber?.(e);if(n!==void 0)return n}let t=this.flags[e];return typeof t==`number`?t:void 0}},Pe=class{record(e,t){console.info(`[Metrics:${e}]`,t??``)}recordPageView(e,t){this.record(`PageView`,{page:e,...t})}recordEvent(e,t){this.record(`Event`,{name:e,...t})}};function Fe(e,t={}){let{_resolvedMessages:n}=t,{fetch:r=globalThis.fetch?.bind(globalThis),featureFlags:i={},featureFlagsProviders:a=[],reportCallback:o,eventRecorder:s,locale:c,platform:l}=t,u=new Ce,d=o?new he([u,new Ee({report:o})]):u;e.register(O.LOGGER_FACTORY,()=>d),e.register(O.LOGGER,()=>d.loggerFor(`framework`)),e.register(O.NET,()=>({fetch:(e,t)=>r(e,t)})),e.register(O.STORAGE,()=>new Me);let f=new Ne(i);for(let e of a)f.addProvider(e);if(e.register(O.FEATURE_FLAGS,()=>f),e.register(O.METRICS,()=>new Pe),e.register(O.EVENT_RECORDER,()=>s??new De),c&&e.register(O.LOCALE,()=>re(c)),c&&n){let t=ue(n,c);t&&e.register(O.TRANSLATOR,()=>new me({locale:c,messages:t}))}e.register(O.PLATFORM,()=>l??Oe(typeof navigator<`u`?navigator.userAgent:void 0)),e.register(O.FETCH,()=>r);let p=t.safeFetch??{};e.register(O.SAFE_FETCH,()=>x(r,p))}function Ie(e){return`container`in e?e.container:e}function Le(e){return{key:e,set(t,n){Ie(t).register(e,()=>n)},get(t){let n=Ie(t);return n.has(e)?n.resolve(e):void 0},clear(t){return Ie(t).unregister(e)}}}function k(e){return{"~standard":{version:1,vendor:`finesoft`,validate:e}}}async function Re(e,t){let n=await e[`~standard`].validate(t);return n.issues?{ok:!1,issues:n.issues}:{ok:!0,value:n.value}}function ze(e){return Object.assign(Object.create(null),e)}var Be=class{routes=[];constructor(e){this.debug=e}add(e,t,n){let r=typeof n==`string`?{renderMode:n}:n??{},i=[],a=e.split(/(\/:[\w]+\??)/).map(t=>{let n=t.match(/^\/:(\w+)(\?)?$/);if(n){if(i.includes(n[1]))throw Error(`[Router] Duplicate parameter name ":${n[1]}" in pattern "${e}"`);return i.push(n[1]),n[2]?`(?:/([^/]+))?`:`/([^/]+)`}return t.replace(/[.+?^${}()|[\]\\]/g,`\\$&`)}).join(``);return this.routes.push({pattern:e,intentId:t,regex:RegExp(`^${a}/?$`),paramNames:i,renderMode:r.renderMode,beforeGuards:r.beforeGuards,afterGuards:r.afterGuards,paramCodecs:r.paramCodecs,queryCodecs:r.queryCodecs}),this}async resolve(e){let{path:t,queryParams:n}=this.parseUrl(e);for(let r of this.routes){let a=t.match(r.regex);if(!a)continue;let o=ze(),s=!0;for(let e=0;e<r.paramNames.length;e++){let t=r.paramNames[e],n=a[e+1],i=r.paramCodecs?.[t];if(i){let e=await Re(i,n);if(!e.ok){this.debug?.(`[Router] route "${r.pattern}" skipped: path param "${t}" failed validation: ${e.issues[0]?.message??`invalid`}`),s=!1;break}e.value!==void 0&&(o[t]=e.value)}else n&&(o[t]=n)}if(s){if(r.queryCodecs)for(let e of Object.keys(r.queryCodecs)){let t=await Re(r.queryCodecs[e],n[e]);if(!t.ok){this.debug?.(`[Router] route "${r.pattern}" skipped: query param "${e}" failed validation: ${t.issues[0]?.message??`invalid`}`),s=!1;break}t.value!==void 0&&(o[e]=t.value)}if(s)return Object.assign(o,Object.fromEntries(Object.entries(n).filter(([e])=>!(e in o)&&!r.queryCodecs?.[e]))),{intent:{id:r.intentId,params:o},action:i(e),renderMode:r.renderMode,beforeGuards:r.beforeGuards,afterGuards:r.afterGuards}}}return null}getRoutes(){return this.routes.map(e=>`${e.pattern} → ${e.intentId}`)}parseUrl(e){try{let t=new URL(e,`http://localhost`),n=ze(Object.fromEntries(t.searchParams));return{path:t.pathname,queryParams:n}}catch{return{path:e.split(`?`)[0].split(`#`)[0],queryParams:ze()}}}};const A=e=>({issues:[{message:e}]});function Ve(e={}){return k(t=>typeof t==`string`?e.minLength!==void 0&&t.length<e.minLength?A(`must be at least ${e.minLength} characters`):e.maxLength!==void 0&&t.length>e.maxLength?A(`must be at most ${e.maxLength} characters`):e.pattern&&!e.pattern.test(t)?A(`must match ${e.pattern}`):{value:t}:A(`expected a string`))}function He(e,t){return t.min!==void 0&&e<t.min?A(`must be >= ${t.min}`):t.max!==void 0&&e>t.max?A(`must be <= ${t.max}`):null}function Ue(e={}){return k(t=>{if(typeof t!=`string`||!/^-?\d+$/.test(t))return A(`"${String(t)}" is not an integer`);let n=Number(t);return He(n,e)??{value:n}})}function We(e={}){return k(t=>{if(typeof t!=`string`||!/^-?\d+(\.\d+)?$/.test(t))return A(`"${String(t)}" is not a number`);let n=Number(t);return He(n,e)??{value:n}})}const Ge=new Set([`true`,`1`]),Ke=new Set([`false`,`0`]);function qe(){return k(e=>typeof e==`string`&&Ge.has(e)?{value:!0}:typeof e==`string`&&Ke.has(e)?{value:!1}:A(`"${String(e)}" is not a boolean (true/false/1/0)`))}function Je(e){return k(t=>typeof t==`string`&&e.includes(t)?{value:t}:A(`"${String(t)}" is not one of: ${e.join(`, `)}`))}const Ye=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function Xe(){return k(e=>typeof e==`string`&&Ye.test(e)?{value:e}:A(`"${String(e)}" is not a valid UUID`))}function Ze(e){return k(t=>t===void 0?{value:void 0}:e[`~standard`].validate(t))}function Qe(e,t){return k(n=>n===void 0?{value:t}:e[`~standard`].validate(n))}async function $e(e,t){for(let n of e){let e=await n(t);if(e.kind!==`next`)return e}return{kind:`next`}}async function et(e,t){for(let n of e){let e=await n(t);if(e.kind!==`next`)return e}return{kind:`next`}}const tt=new WeakMap;function j(e){return nt(e,new Set,0)}function nt(e,t,n){if(e==null)return String(e);if(typeof e!=`object`)return JSON.stringify(e);let r=tt.get(e);if(r!==void 0)return r;if(n>50)return`"[Max Depth]"`;if(t.has(e))return`"[Circular]"`;t.add(e);try{let r;if(Array.isArray(e))r=`[`+e.map(e=>nt(e,t,n+1)).join(`,`)+`]`;else{let i=Object.keys(e).sort(),a=[];for(let r of i){let i=e[r];i!==void 0&&a.push(JSON.stringify(r)+`:`+nt(i,t,n+1))}r=`{`+a.join(`,`)+`}`}return tt.set(e,r),r}finally{t.delete(e)}}var M=class e{intents;constructor(e){this.intents=e}static fromArray(t){let n=new Map;for(let e of t)if(e.intent&&e.data!==void 0){let t=j(e.intent);n.set(t,e.data)}return new e(n)}static empty(){return new e(new Map)}get(e){let t=j(e),n=this.intents.get(t);if(n!==void 0)return this.intents.delete(t),n}has(e){return this.intents.has(j(e))}get size(){return this.intents.size}},rt=class e{container;intentDispatcher;actionDispatcher;router;prefetchedIntents;beforeGuards=[];afterGuards=[];_logger;constructor(e,t){this.container=e,this.intentDispatcher=new s,this.actionDispatcher=new o,this.router=new Be(e=>this.getLogger().debug(e)),this.prefetchedIntents=t}static create(t={}){let n=new c;Fe(n,t);let r=new e(n,t.prefetchedIntents??M.empty());return t.setupRoutes?.(r.router),r}getLogger(){return this._logger??=this.container.resolve(O.LOGGER)}async dispatch(e){let t=this.getLogger(),n=this.prefetchedIntents.get(e);return n===void 0?(t.debug(`[Framework] dispatch intent: ${e.id}`,e.params),this.intentDispatcher.dispatch(e,this.container)):(t.debug(`[Framework] re-using prefetched intent response for: ${e.id}`,e.params),n)}async perform(e){return this.getLogger().debug(`[Framework] perform action: ${e.kind}`),this.actionDispatcher.perform(e)}async routeUrl(e){return this.router.resolve(e)}didEnterPage(e){this.container.resolve(O.METRICS).recordPageView(e.pageType,{pageId:e.id,title:e.title})}getLocale(){return this.container.has(O.LOCALE)?this.container.resolve(O.LOCALE):void 0}getTranslator(){return this.container.has(O.TRANSLATOR)?this.container.resolve(O.TRANSLATOR):void 0}getPlatform(){return this.container.resolve(O.PLATFORM)}onAction(e,t){this.actionDispatcher.onAction(e,t)}registerIntent(e){this.intentDispatcher.register(e)}beforeLoad(e){this.beforeGuards.push(e)}afterLoad(e){this.afterGuards.push(e)}runBeforeLoad(e,t){return $e(t?.length?[...this.beforeGuards,...t]:this.beforeGuards,e)}runAfterLoad(e,t){return et(t?.length?[...this.afterGuards,...t]:this.afterGuards,e)}dispose(){this.container.dispose()}};const N=Symbol.for(`finesoft.publicFields`),it=[`id`,`pageType`,`title`,`description`,`url`];function at(e,t){return t===!0?(Object.defineProperty(e,N,{value:!0,enumerable:!1,configurable:!0,writable:!1}),e):(Object.defineProperty(e,N,{value:Object.freeze([...t]),enumerable:!1,configurable:!0,writable:!1}),e)}function ot(e){return typeof e==`object`&&!!e&&e[N]!==void 0}function st(e){if(typeof e!=`object`||!e)return null;let t=e[N];return t===void 0?null:t===!0?!0:Array.isArray(t)?t:null}function ct(){try{let e=globalThis.process?.env?.NODE_ENV;return e===void 0?!0:e===`production`}catch{return!0}}function lt(e){if(e instanceof Error)return e.stack??`${e.name}: ${e.message}`;if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return String(e)}}function ut(e){let{status:t,publicMessage:n,devError:r,isProduction:i=ct()}=e,a=!i&&r!==void 0;return{id:`error`,pageType:`error`,title:`Error ${t}`,description:a?`${n}\n\n[dev only]\n${lt(r)}`:n}}var dt=class{fallback(e,t){throw t}async perform(e,t){let n=e.params??{};try{return await this.execute(n,t)}catch(e){return this.fallback(n,e instanceof Error?e:Error(String(e)))}}};function ft(...e){return t=>e.reduce((e,t)=>t(e),t)}function pt(...e){return async t=>{let n=t;for(let t of e)n=await t(n);return n}}function mt(e){return t=>t.map(e)}const P={LEAF:`leaf`,STACK:`stack`,TABS:`tabs`,SPLIT:`split`},F={AUTOMATIC:`automatic`,ALL:`all`,DOUBLE_COLUMN:`doubleColumn`,DETAIL_ONLY:`detailOnly`};var I=class extends Error{constructor(e){super(e),this.name=`NavigationError`}};function L(e,t={}){return{kind:P.LEAF,intent:e,params:t}}function ht(e){let t=Array.isArray(e)?[...e]:[e];return{kind:P.STACK,entries:t}}function gt(e){let t=e.order?[...e.order]:Object.keys(e.branches);return{kind:P.TABS,active:e.active,order:t,branches:{...e.branches}}}function _t(e,t){let n=e.map(e=>({id:e.id,content:e.content}));return t===void 0?{kind:P.SPLIT,columns:n}:{kind:P.SPLIT,columns:n,visibility:t}}function R(e){return e.kind===P.LEAF}function vt(e){return e.kind===P.STACK}function yt(e){return e.kind===P.TABS}function bt(e){return e.kind===P.SPLIT}function xt(e,t){return{"data-fs-entry":``,"data-fs-intent":e,"data-fs-key":t}}function St(e,t){return`${e} ${j(t)}`}function Ct(e){let t=[],n=e;for(;;)switch(n.kind){case P.LEAF:return t;case P.STACK:{if(n.entries.length===0)return t;let e=n.entries.length-1;t.push({kind:`stack-entry`,index:e}),n=n.entries[e];break}case P.TABS:{let e=n.branches[n.active];if(e===void 0)return t;t.push({kind:`tab`,key:n.active}),n=e;break}case P.SPLIT:{let e=z(n);if(e===void 0)return t;t.push({kind:`column`,id:e.id}),n=e.content;break}}}function z(e){for(let t=e.columns.length-1;t>=0;t--)if(e.columns[t].content!==void 0)return e.columns[t]}function B(e,t){let n=e;for(let e of t){if(n===void 0)return;n=wt(n,e)}return n}function wt(e,t){switch(t.kind){case`stack-entry`:return e.kind===P.STACK?e.entries[t.index]:void 0;case`tab`:return e.kind===P.TABS?e.branches[t.key]:void 0;case`column`:return e.kind===P.SPLIT?e.columns.find(e=>e.id===t.id)?.content:void 0}}function Tt(e,t){let n=B(e,t);if(n===void 0)return;let r=[...t],i=n;for(;;)switch(i.kind){case P.STACK:return r;case P.LEAF:return;case P.TABS:{let e=i.branches[i.active];if(e===void 0)return;r.push({kind:`tab`,key:i.active}),i=e;break}case P.SPLIT:{let e=z(i);if(e===void 0)return;r.push({kind:`column`,id:e.id}),i=e.content;break}}}function Et(e){let t=[];return V(e,t),t}function V(e,t){switch(e.kind){case P.LEAF:t.push(e);return;case P.STACK:if(e.entries.length===0)return;V(e.entries[e.entries.length-1],t);return;case P.TABS:{let n=e.branches[e.active];n!==void 0&&V(n,t);return}case P.SPLIT:for(let n of Dt(e))n.content!==void 0&&V(n.content,t);return}}function H(e){let t=[];return U(e,t),t}function U(e,t){switch(e.kind){case P.LEAF:t.push(e);return;case P.STACK:for(let n of e.entries)U(n,t);return;case P.TABS:for(let n of Object.values(e.branches))U(n,t);return;case P.SPLIT:for(let n of e.columns)n.content!==void 0&&U(n.content,t);return}}function Dt(e){let{columns:t,visibility:n}=e;if(t.length===0)return t;switch(n){case F.DETAIL_ONLY:return[t[t.length-1]];case F.DOUBLE_COLUMN:{let e=t.length-1;return e===0?[t[0]]:[t[0],t[e]]}default:return t}}function W(e,t,n){return t.length===0?n(e):G(e,t,0,n)}function G(e,t,n,r){if(n===t.length)return r(e);let i=t[n];switch(i.kind){case`stack-entry`:{if(e.kind!==P.STACK)throw new I(`路径无效:在 ${e.kind} 节点上期望 stack(stack-entry 步)`);if(i.index<0||i.index>=e.entries.length)throw new I(`路径无效:stack entry 索引越界 ${i.index}`);let a=e.entries.slice();return a[i.index]=G(a[i.index],t,n+1,r),{...e,entries:a}}case`tab`:{if(e.kind!==P.TABS)throw new I(`路径无效:在 ${e.kind} 节点上期望 tabs(tab 步)`);let a=e.branches[i.key];if(a===void 0)throw new I(`路径无效:tabs 分支 "${i.key}" 不存在`);return{...e,branches:{...e.branches,[i.key]:G(a,t,n+1,r)}}}case`column`:{if(e.kind!==P.SPLIT)throw new I(`路径无效:在 ${e.kind} 节点上期望 split(column 步)`);let a=e.columns.findIndex(e=>e.id===i.id);if(a===-1)throw new I(`路径无效:split 列 "${i.id}" 不存在`);let o=e.columns[a].content;if(o===void 0)throw new I(`路径无效:split 列 "${i.id}" 内容为空`);let s=e.columns.slice();return s[a]={...s[a],content:G(o,t,n+1,r)},{...e,columns:s}}}}function Ot(e){let t=[],n,r=e;for(;;)switch(r.kind===P.STACK&&(n=[...t]),r.kind){case P.LEAF:return n;case P.STACK:{if(r.entries.length===0)return n;let e=r.entries.length-1;t.push({kind:`stack-entry`,index:e}),r=r.entries[e];break}case P.TABS:{let e=r.branches[r.active];if(e===void 0)return n;t.push({kind:`tab`,key:r.active}),r=e;break}case P.SPLIT:{let e=z(r);if(e===void 0)return n;t.push({kind:`column`,id:e.id}),r=e.content;break}}}function K(e,t){return t?Tt(e,t):Ot(e)}function kt(e,t,n){let r=K(e,n);if(r===void 0)throw new I(`push 失败:激活路径上没有可用的 stack`);return W(e,r,e=>{let n=e;return{...n,entries:[...n.entries,t]}})}function At(e,t=1,n){if(t<=0)return e;let r=K(e,n);if(r===void 0)throw new I(`pop 失败:激活路径上没有可用的 stack`);return W(e,r,e=>{let n=e,r=Math.max(1,n.entries.length-t);return r===n.entries.length?n:{...n,entries:n.entries.slice(0,r)}})}function jt(e,t){let n=K(e,t);if(n===void 0)throw new I(`popToRoot 失败:激活路径上没有可用的 stack`);return W(e,n,e=>{let t=e;return t.entries.length<=1?t:{...t,entries:t.entries.slice(0,1)}})}function Mt(e,t,n){let r=K(e,n);if(r===void 0)throw new I(`popTo 失败:激活路径上没有可用的 stack`);return W(e,r,e=>{let n=e;if(t<0||t>=n.entries.length)throw new I(`popTo 失败:index ${t} 越界(栈深 ${n.entries.length})`);return t===n.entries.length-1?n:{...n,entries:n.entries.slice(0,t+1)}})}function Nt(e,t,n){let r=K(e,n);if(r===void 0)throw new I(`replaceTop 失败:激活路径上没有可用的 stack`);return W(e,r,e=>{let n=e;if(n.entries.length===0)throw new I(`replaceTop 失败:stack 为空`);let r=n.entries.slice();return r[r.length-1]=t,{...n,entries:r}})}function Pt(e,t,n){let r=n??Lt(e,P.TABS);if(r===void 0)throw new I(`selectTab 失败:激活路径上没有 tabs 节点`);return W(e,r,e=>{if(e.kind!==P.TABS)throw new I(`selectTab 失败:目标是 ${e.kind} 节点,不是 tabs`);let n=e;if(!(t in n.branches))throw new I(`selectTab 失败:未知分支 "${t}"`);return n.active===t?n:{...n,active:t}})}function Ft(e,t,n,r){let i=r??Lt(e,P.SPLIT);if(i===void 0)throw new I(`selectColumn 失败:激活路径上没有 split 节点`);return W(e,i,e=>{if(e.kind!==P.SPLIT)throw new I(`selectColumn 失败:目标是 ${e.kind} 节点,不是 split`);let r=e,i=r.columns.findIndex(e=>e.id===t);if(i===-1)throw new I(`selectColumn 失败:未知列 "${t}"`);let a=r.columns.map((e,t)=>t===i?{...e,content:n}:t>i?{...e,content:void 0}:e);return{...r,columns:a}})}function It(e,t,n){let r=n??Lt(e,P.SPLIT);if(r===void 0)throw new I(`setVisibility 失败:激活路径上没有 split 节点`);return W(e,r,e=>{if(e.kind!==P.SPLIT)throw new I(`setVisibility 失败:目标是 ${e.kind} 节点,不是 split`);return{...e,visibility:t}})}function Lt(e,t){let n=[],r=e;for(;;){if(r.kind===t)return n;switch(r.kind){case P.LEAF:return;case P.STACK:{if(r.entries.length===0)return;let e=r.entries.length-1;n.push({kind:`stack-entry`,index:e}),r=r.entries[e];break}case P.TABS:{let e=r.branches[r.active];if(e===void 0)return;n.push({kind:`tab`,key:r.active}),r=e;break}case P.SPLIT:{let e=z(r);if(e===void 0)return;n.push({kind:`column`,id:e.id}),r=e.content;break}}}}const Rt=new Set(Object.values(F));function q(e){switch(e.kind){case P.LEAF:return{kind:P.LEAF,intent:e.intent,params:e.params};case P.STACK:return{kind:P.STACK,entries:e.entries.map(q)};case P.TABS:{let t={};for(let n of Object.keys(e.branches))t[n]=q(e.branches[n]);return{kind:P.TABS,active:e.active,order:[...e.order],branches:t}}case P.SPLIT:{let t=e.columns.map(e=>({id:e.id,content:e.content===void 0?null:q(e.content)}));return e.visibility===void 0?{kind:P.SPLIT,columns:t}:{kind:P.SPLIT,columns:t,visibility:e.visibility}}}}function zt(e){return j(q(e))}const Bt=new Set([P.LEAF,P.STACK,P.TABS,P.SPLIT]);function Vt(e){return Ut(e,`$`)}function Ht(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ut(e,t){if(!Ht(e))throw new I(`反序列化失败:${t} 不是对象`);let n=e.kind;if(typeof n!=`string`||!Bt.has(n))throw new I(`反序列化失败:${t}.kind 非法(${String(n)})`);switch(n){case P.LEAF:return Wt(e,t);case P.STACK:return Gt(e,t);case P.TABS:return Kt(e,t);case P.SPLIT:return qt(e,t)}}function Wt(e,t){if(typeof e.intent!=`string`)throw new I(`反序列化失败:${t}.intent 必须是字符串`);if(!Ht(e.params))throw new I(`反序列化失败:${t}.params 必须是对象`);return{kind:P.LEAF,intent:e.intent,params:{...e.params}}}function Gt(e,t){if(!Array.isArray(e.entries))throw new I(`反序列化失败:${t}.entries 必须是数组`);return{kind:P.STACK,entries:e.entries.map((e,n)=>Ut(e,`${t}.entries[${n}]`))}}function Kt(e,t){if(typeof e.active!=`string`)throw new I(`反序列化失败:${t}.active 必须是字符串`);if(!Array.isArray(e.order)||!e.order.every(e=>typeof e==`string`))throw new I(`反序列化失败:${t}.order 必须是字符串数组`);if(!Ht(e.branches))throw new I(`反序列化失败:${t}.branches 必须是对象`);let n={};for(let r of Object.keys(e.branches))n[r]=Ut(e.branches[r],`${t}.branches.${r}`);for(let r of e.order)if(!(r in n))throw new I(`反序列化失败:${t}.order 包含不在 branches 中的键 "${r}"`);if(!(e.active in n))throw new I(`反序列化失败:${t}.active "${e.active}" 不在 branches 中`);return{kind:P.TABS,active:e.active,order:[...e.order],branches:n}}function qt(e,t){if(!Array.isArray(e.columns))throw new I(`反序列化失败:${t}.columns 必须是数组`);let n=e.columns.map((e,n)=>{let r=`${t}.columns[${n}]`;if(!Ht(e))throw new I(`反序列化失败:${r} 不是对象`);if(typeof e.id!=`string`)throw new I(`反序列化失败:${r}.id 必须是字符串`);let i=e.content===null||e.content===void 0?void 0:Ut(e.content,`${r}.content`);return{id:e.id,content:i}});if(e.visibility===void 0)return{kind:P.SPLIT,columns:n};if(typeof e.visibility!=`string`||!Rt.has(e.visibility))throw new I(`反序列化失败:${t}.visibility 非法值 ${JSON.stringify(e.visibility)}`);return{kind:P.SPLIT,columns:n,visibility:e.visibility}}const Jt=`__nav`;function Yt(e){try{let t=new URL(e,`http://localhost`);return{path:t.pathname,query:t.searchParams}}catch{let t=e.split(`?`)[0].split(`#`)[0],n=e.includes(`?`)?e.slice(e.indexOf(`?`)+1).split(`#`)[0]:``;return{path:t||`/`,query:new URLSearchParams(n)}}}function Xt(e,t){let n=t.toString();return n?`${e}?${n}`:e}function Zt(e){let t=[];for(let n of e.getRoutes()){let e=n.indexOf(` → `);if(e===-1)continue;let r=n.slice(0,e),i=n.slice(e+3);r&&i&&t.push({pattern:r,intentId:i})}return t}function Qt(e){if(e!=null){if(typeof e==`string`)return e;if(typeof e==`number`)return Number.isFinite(e)?String(e):void 0;if(typeof e==`boolean`)return String(e)}}function $t(e,t,n){for(let r of e){if(r.intentId!==t)continue;let e=en(r.pattern,n);if(e)return e}}function en(e,t){let n=new Set,r=!0,i=e.split(/(\/:[\w]+\??)/).map(e=>{let i=e.match(/^\/:(\w+)(\?)?$/);if(!i)return e;let a=i[1],o=i[2]===`?`,s=Qt(t[a]);return s===void 0?(o||(r=!1),``):(n.add(a),`/${encodeURIComponent(s)}`)}).join(``);if(!r)return;let a=i===``?`/`:i,o=new URLSearchParams;for(let e of Object.keys(t).sort()){if(n.has(e))continue;let r=Qt(t[e]);r!==void 0&&o.set(e,r)}return Xt(a,o)}function tn(e,t,n){if(typeof e.reverse==`function`){let r=e.reverse(t,n);if(r!==void 0)return r}return $t(Zt(e),t,n)}function nn(e){return an(j(q(e)))}function rn(e){let t;try{t=on(e)}catch{throw new I(`导航参数解码失败:非法的 base64url`)}let n;try{n=JSON.parse(t)}catch{throw new I(`导航参数解码失败:非法的 JSON`)}return Vt(n)}function an(e){let t=un(e),n=``;for(let e of t)n+=String.fromCharCode(e);return sn(n).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function on(e){let t=cn(e.replace(/-/g,`+`).replace(/_/g,`/`)),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return dn(n)}function sn(e){return typeof btoa==`function`?btoa(e):ln(e,`binary`).toString(`base64`)}function cn(e){return typeof atob==`function`?atob(e):ln(e,`base64`).toString(`binary`)}function ln(e,t){let n=globalThis.Buffer;if(!n)throw new I(`导航参数编解码失败:当前运行时缺少 base64 能力`);return n.from(e,t)}function un(e){if(typeof TextEncoder<`u`)return new TextEncoder().encode(e);let t=[];for(let n of e){let e=n.codePointAt(0);e<128?t.push(e):e<2048?t.push(192|e>>6,128|e&63):e<65536?t.push(224|e>>12,128|e>>6&63,128|e&63):t.push(240|e>>18,128|e>>12&63,128|e>>6&63,128|e&63)}return Uint8Array.from(t)}function dn(e){if(typeof TextDecoder<`u`)return new TextDecoder().decode(e);let t=``;for(let n=0;n<e.length;){let r=e[n++];r<128?t+=String.fromCodePoint(r):r<224?t+=String.fromCodePoint((r&31)<<6|e[n++]&63):r<240?t+=String.fromCodePoint((r&15)<<12|(e[n++]&63)<<6|e[n++]&63):t+=String.fromCodePoint((r&7)<<18|(e[n++]&63)<<12|(e[n++]&63)<<6|e[n++]&63)}return t}function fn(e){if(R(e))return{intent:e.intent,params:e.params};let t=B(e,Ct(e));if(t!==void 0&&R(t))return{intent:t.intent,params:t.params}}function pn(){return{encode(e,t){let n=fn(e);return n===void 0?`/`:tn(t,n.intent,n.params)??`/`},decode(e){let{query:t}=Yt(e),n=t.get(Jt);if(!(n===null||n===``))return rn(n)}}}function mn(e={}){let t=e.param??`__nav`;return{encode(e,n){let r=fn(e),{path:i,query:a}=Yt(r?tn(n,r.intent,r.params)??`/`:`/`);return a.set(t,nn(e)),Xt(i,a)},decode(e){let{query:n}=Yt(e),r=n.get(t);if(!(r===null||r===``))return rn(r)}}}function hn(e){let t=[],n=e.split(/(\/:[\w]+\??)/).map(e=>{let n=e.match(/^\/:(\w+)(\?)?$/);return n?(t.push(n[1]),n[2]?`(?:/([^/]+))?`:`/([^/]+)`):e.replace(/[.+?^${}()|[\]\\]/g,`\\$&`)}).join(``);return{regex:RegExp(`^${n}/?$`),paramNames:t}}function gn(e){return Zt(e).map(e=>{let{regex:t,paramNames:n}=hn(e.pattern);return{...e,regex:t,paramNames:n}})}function _n(e,t){let{path:n,query:r}=Yt(e),i=Object.fromEntries(r);for(let e of t){let t=n.match(e.regex);if(!t)continue;let r=Object.assign(Object.create(null),i);for(let n=0;n<e.paramNames.length;n++){let i=t[n+1];i!==void 0&&(r[e.paramNames[n]]=i)}return{intentId:e.intentId,params:r}}}function vn(){return{decode(e,t){let n=_n(e,gn(t));if(n)return ht([L(n.intentId,n.params)])},encode(e,t){let n=fn(e);return n===void 0?`/`:tn(t,n.intent,n.params)??`/`}}}const J={PUSH:`push`,POP:`pop`,POP_TO_ROOT:`popToRoot`,POP_TO:`popTo`,REPLACE_TOP:`replaceTop`,SELECT_TAB:`selectTab`,SELECT_COLUMN:`selectColumn`,SET_VISIBILITY:`setVisibility`,HYDRATE:`hydrate`};function Y(e,t){return St(e,t)}function yn(e,t){return{id:`error-${e}`,pageType:`error`,title:t,description:t}}function bn(e){let{intentDispatcher:t,router:n,createContext:r,beforeLoad:i=[],afterLoad:a=[],prefetched:o,getErrorPage:s=yn,onRedirect:c}=e,l=e.isServer??typeof window>`u`,u=e.initial,d={tree:u,destinations:[]},f=new Set,p=new Map,m=Promise.resolve(d);function h(e){let t=m.then(e,e);return m=t.then(e=>e,()=>d),t}async function g(e){let t=Et(e),n=xn(e),r=n?Y(n.intent,n.params):void 0,i=[];for(let e of t){let t=Y(e.intent,e.params),n=r!==void 0&&t===r,a=p.get(t);n?i.push(await _(e,a?.page)):a===void 0?i.push(await v(e)):i.push(a)}for(let e of i){let t=Y(e.intent,e.params);e.status===void 0?p.set(t,e):p.delete(t)}let a=new Set(H(e).map(e=>Y(e.intent,e.params)));for(let e of p.keys())a.has(e)||p.delete(e);return{tree:e,destinations:i}}async function _(e,t){let n=e.intent,o=e.params,l=r({intent:n,params:o}),u=l.navigation??b(n,o,l),d=await $e(i,u);if(d.kind===`redirect`)return c?.({url:d.url,status:d.status}),{intent:n,params:o,page:t??s(d.status,`Redirecting`),status:d.status};if(d.kind===`deny`)return{intent:n,params:o,page:s(d.status,d.message),status:d.status};if(d.kind===`rewrite`){let e=await x(d.url);e&&(n=e.intent,o=e.params,l=r({intent:n,params:o}),u=l.navigation??b(n,o,l),t=void 0)}let f=await y(n,o,l,t);if(f.status!==void 0)return{intent:n,params:o,page:f.page,status:f.status};let p=await et(a,{...u,page:f.page});return p.kind===`redirect`?(c?.({url:p.url,status:p.status}),{intent:n,params:o,page:f.page,status:p.status}):p.kind===`deny`?{intent:n,params:o,page:f.page,status:p.status}:{intent:n,params:o,page:f.page}}async function v(e){let t=r({intent:e.intent,params:e.params}),n=await y(e.intent,e.params,t,void 0);return{intent:e.intent,params:e.params,page:n.page,...n.status===void 0?{}:{status:n.status}}}async function y(e,n,r,i){if(i!==void 0)return{page:i};let a={id:e,params:n},c=o?.get(a);if(c!==void 0)return{page:c};try{return{page:await t.dispatch(a,r.container)}}catch{return{page:s(500,`Internal error`),status:500}}}function b(e,t,n){let r=n.url??`/`,i;try{i=new URL(r,`http://localhost`).pathname}catch{i=r.split(`?`)[0].split(`#`)[0]}return{url:r,path:i,params:t,intent:{id:e,params:t},isServer:l,container:n.container,getCookie:()=>void 0,getHeader:()=>void 0}}async function x(e){let t=await n.resolve(e);if(t)return L(t.intent.id,t.intent.params??{})}function S(e){u=e.tree,d=e;for(let e of f)e(d);return d}function C(e){switch(e.kind){case J.PUSH:return kt(u,L(e.intent,e.params),e.target);case J.POP:return At(u,e.count,e.target);case J.POP_TO_ROOT:return jt(u,e.target);case J.POP_TO:return Mt(u,e.index,e.target);case J.REPLACE_TOP:return Nt(u,L(e.intent,e.params),e.target);case J.SELECT_TAB:return Pt(u,e.key,e.target);case J.SELECT_COLUMN:return Ft(u,e.columnId,e.intent===void 0?void 0:L(e.intent,e.params),e.target);case J.SET_VISIBILITY:return It(u,e.visibility,e.target);case J.HYDRATE:return e.tree}}function w(e){return h(async()=>S(await g(C(e))))}return{getTree(){return u},getSnapshot(){return d},apply:w,push(e,t,n){return w({kind:J.PUSH,intent:e,params:t,target:n?.target})},pop(e){return w({kind:J.POP,count:e})},popToRoot(){return w({kind:J.POP_TO_ROOT})},replaceTop(e,t){return w({kind:J.REPLACE_TOP,intent:e,params:t})},selectTab(e,t){return w({kind:J.SELECT_TAB,key:e,target:t})},selectColumn(e,t,n,r){return w({kind:J.SELECT_COLUMN,columnId:e,intent:t,params:n,target:r})},setVisibility(e,t){return w({kind:J.SET_VISIBILITY,visibility:e,target:t})},hydrate(e){return w({kind:J.HYDRATE,tree:e})},invalidate(e){e===void 0?p.clear():p.delete(e)},refresh(){return h(async()=>{let e=xn(u);return e&&p.delete(Y(e.intent,e.params)),S(await g(u))})},subscribe(e){return f.add(e),()=>{f.delete(e)}},resolve(){return h(async()=>S(await g(u)))}}}function xn(e){let t=B(e,Ct(e));if(t!==void 0)return t.kind===`leaf`?t:void 0}function Sn(e){return typeof e!=`object`||!e?!1:R(e)||vt(e)||yt(e)||bt(e)}function Cn(e,t){if(Sn(e))return e;let n=e(t);return n===void 0?{kind:`leaf`,intent:`@finesoft/navigation-root`,params:{}}:n}function wn(e){return Sn(e)?()=>e:e}function Tn(){return typeof window<`u`&&window.location?window.location.pathname+window.location.search:`/`}function En(e){let t=e.codec??pn(),{initial:n,beforeLoad:r,afterLoad:i,getErrorPage:a}=e;return{initial:n,codec:t,beforeLoad:r,afterLoad:i,getErrorPage:a,toBrowserConfig(e){return{initial:Cn(n,e??Tn()),codec:t,beforeLoad:r,afterLoad:i,getErrorPage:a}},toSSRDefinition(){return{codec:t,initial:wn(n),beforeLoad:r,afterLoad:i}}}}function Dn(e,t){return{path:e,...t}}function On(e,t,n){let r=new Set;for(let i of t){i.controller&&!r.has(i.intentId)&&(e.registerIntent(i.controller),r.add(i.intentId));let t={renderMode:i.renderMode,beforeGuards:i.beforeLoad,afterGuards:i.afterLoad,paramCodecs:i.params,queryCodecs:i.query};if(e.router.add(i.path,i.intentId,t),n?.locales?.length){let n=i.path===`/`?`/:locale`:`/:locale${i.path}`;e.router.add(n,i.intentId,t)}}}const kn=`__finesoft_session__`,An=1;function jn(e){return typeof e==`object`&&!!e&&`url`in e&&typeof e.url==`string`}var Mn=class extends Error{constructor(e){super(e),this.name=`SessionError`}};function Nn(e){return j(e)}function Pn(e,t){if(e===void 0)return;let n;try{n=JSON.parse(e)}catch{return}if(Fn(n)&&n.version===t&&typeof n.capturedAt==`number`&&Fn(n.slices)&&Fn(n.scoped))return n}function Fn(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function X(e,t){return St(e,t)}function In(e){return H(e).map(e=>X(e.intent,e.params))}function Ln(e){let t=new Map(e?Object.entries(e):void 0);return{get(e){return t.get(e)},set(e,n){t.set(e,n)},delete(e){t.delete(e)},prune(e){let n=new Set(e);for(let e of t.keys())n.has(e)||t.delete(e)},keys(){return[...t.keys()]}}}function Rn(e){let{storage:t,key:n=kn,version:r=1,maxAgeMs:i,navigation:a,now:o=()=>Date.now(),onError:s}=e,c=new Map,l=Ln();function u(e,t){s?.(e,t)}function d(){let e={};for(let t of c.values())try{e[t.key]=t.capture()}catch(e){u(e,{phase:`capture`,key:t.key})}return e}function f(){let e={};for(let t of l.keys())e[t]=l.get(t);return e}function p(){return{version:r,navigation:a?.capture(),url:a?.captureUrl?.(),slices:d(),scoped:f(),capturedAt:o()}}function m(e=p()){try{t.set(n,Nn(e))}catch(e){u(e,{phase:`persist`})}}function h(){let e;try{e=t.get(n)}catch(e){u(e,{phase:`load`});return}let a=Pn(e,r);if(a!==void 0&&!(i!==void 0&&o()-a.capturedAt>i))return a}function g(e){for(let t of c.values()){let n=e[t.key];if(n!==void 0)try{t.restore(n)}catch(e){u(e,{phase:`restore`,key:t.key})}}}function _(e=h()){if(e===void 0)return;l=Ln({...e.scoped});let t;try{t=a?.apply(e.navigation)}catch(e){u(e,{phase:`restore`});return}if(t instanceof Promise)return t.then(()=>{g(e.slices)},e=>{u(e,{phase:`restore`})});g(e.slices)}return{register(e){return c.set(e.key,e),()=>{c.get(e.key)===e&&c.delete(e.key)}},get scope(){return l},capture:p,persist:m,load:h,restore:_,clear(){t.delete(n)},save(){m()}}}function zn(e,t){return{capture(){return q(e.getTree())},apply(t){if(!(t===void 0||jn(t)))return e.hydrate(Vt(t)).then(()=>void 0)},captureUrl(){return t?.()},presentKeys(){return In(e.getTree())}}}function Bn(e){return{capture(){return{url:e.currentUrl()}},apply(t){if(jn(t))return e.navigate(t.url)},captureUrl(){return e.currentUrl()},presentKeys(){if(e.currentIntent){let{intent:t,params:n}=e.currentIntent();return[X(t,n)]}return[e.currentUrl()]}}}var Vn=class{map=new Map;capacity;constructor(e){if(e<1)throw Error(`[LruMap] capacity must be >= 1, got ${e}`);this.capacity=e}get(e){if(!this.map.has(e))return;let t=this.map.get(e);return this.map.delete(e),this.map.set(e,t),t}set(e,t){if(this.map.has(e))this.map.delete(e);else if(this.map.size>=this.capacity){let e=this.map.keys().next().value;e!==void 0&&this.map.delete(e)}this.map.set(e,t)}has(e){return this.map.has(e)}delete(e){return this.map.delete(e)}get size(){return this.map.size}clear(){this.map.clear()}};function Hn(e){return e!=null}function Un(e){return e==null}function Wn(){return typeof window>`u`?`browser`:document.referrer.startsWith(`android-app://`)?`twa`:window.matchMedia(`(display-mode: standalone)`).matches||`standalone`in window.navigator&&window.navigator.standalone===!0?`standalone`:`browser`}function Gn(e){return e.replace(/^https?:\/\//,``)}function Kn(e){try{let t=new URL(e);return t.pathname+t.search+t.hash}catch{return e}}function qn(e){return e.split(`?`)[0]}function Jn(e){return e.split(`?`)[0].split(`#`)[0]}function Yn(e,t){if(!t)return e;let n=new URLSearchParams;for(let[e,r]of Object.entries(t))r!==void 0&&n.set(e,r);let r=n.toString();return r?`${e}?${r}`:e}function Z(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function Xn(e){let t=new Map;if(!e)return t;for(let n of e.split(`;`)){let e=n.indexOf(`=`);if(e===-1)continue;let r=n.slice(0,e).trim(),i=n.slice(e+1).trim();r&&t.set(r,i)}return t}function Zn(e){let{url:t,intent:n,container:r,request:i}=e,a=new URL(t,`http://localhost`),o=Xn(i?.headers.get(`cookie`)??``);return{url:t,path:a.pathname,params:n.params??{},intent:n,isServer:!0,container:r,getCookie:e=>o.get(e),getHeader:e=>i?.headers.get(e)??void 0}}function Q(e){let{url:t,intent:n,container:r}=e;return{url:t,path:new URL(t,window.location.origin).pathname,params:n.params??{},intent:n,isServer:!1,container:r,getCookie:e=>Xn(document.cookie).get(e),getHeader:()=>void 0}}function Qn(){return{kind:`next`}}function $n(e,t=302){return{kind:`redirect`,url:e,status:t}}function er(e){return{kind:`rewrite`,url:e}}function tr(e=403,t=`Forbidden`){return{kind:`deny`,status:e,message:t}}var nr=class{recorders;constructor(e){this.recorders=e}record(e,t){for(let n of this.recorders)n.record(e,t)}async flush(){let e=[];for(let t of this.recorders)t.flush&&e.push(t.flush());await Promise.all(e)}destroy(){for(let e of this.recorders)e.destroy?.()}},rr=class{observer;tracked=new Map;captured=[];minDuration;constructor(e={}){this.minDuration=e.minVisibleDuration??1e3,this.observer=new IntersectionObserver(e=>{let t=Date.now();for(let n of e){let e=this.tracked.get(n.target);e&&(n.isIntersecting?e.visibleSince===null&&(e.visibleSince=t):e.visibleSince!==null&&(t-e.visibleSince>=this.minDuration&&this.captured.push({id:e.id,timestamp:e.visibleSince,metadata:e.metadata}),e.visibleSince=null))}},{threshold:e.threshold??.5})}observe(e,t,n){this.tracked.set(e,{id:t,metadata:n,visibleSince:null}),this.observer.observe(e)}unobserve(e){this.observer.unobserve(e),this.tracked.delete(e)}consume(){let e=Date.now();for(let[,t]of this.tracked)t.visibleSince!==null&&e-t.visibleSince>=this.minDuration&&(this.captured.push({id:t.id,timestamp:t.visibleSince,metadata:t.metadata}),t.visibleSince=e);return this.captured.splice(0)}destroy(){this.observer.disconnect(),this.tracked.clear(),this.captured.length=0}},ir=class{record(){}async flush(){}destroy(){}},ar=class{constructor(e,t){this.inner=e,this.providers=t}record(e,t){let n={};for(let e of this.providers)Object.assign(n,e.getFields());t&&Object.assign(n,t),this.inner.record(e,n)}async flush(){return this.inner.flush?.()}destroy(){this.inner.destroy?.()}};function or(t){let{framework:n,log:r}=t;n.onAction(e.EXTERNAL_URL,e=>{r.debug(`ExternalUrlAction → ${e.url}`),window.open(e.url,`_blank`,`noopener,noreferrer`)})}const sr=5e3;let cr=null;function $(){cr?.()}function lr(e,t,n){$();let r=Math.max(0,n),i=Date.now(),a=!1,o=null,s=null,c=null,l=null;cr=p,f(),document.addEventListener(`load`,u,!0),s=setInterval(u,100),c=setTimeout(u,sr),u();function u(){a||o!==null||(o=requestAnimationFrame(()=>{o=null,d()}))}function d(){if(a)return;let n=Date.now()-i,o=t();if(!o){n>=sr&&(e.warn(`tryScroll: timed out waiting for the scrollable element`,{target:r,elapsedMs:n}),p());return}o.scrollTop=r;let s=o.scrollTop;if(s>=r-2){e.info(`scroll restored`,{target:r,actual:s,elapsedMs:n}),p();return}n>=sr&&(e.warn(`tryScroll: timed out before reaching the target`,{target:r,actual:s,elapsedMs:n,scrollHeight:o.scrollHeight,clientHeight:o.clientHeight}),p())}function f(){if(typeof MutationObserver>`u`)return;let e=document.body??document.documentElement;e&&(l=new MutationObserver(()=>{u()}),l.observe(e,{childList:!0,subtree:!0}))}function p(){a||(a=!0,cr===p&&(cr=null),o!==null&&(cancelAnimationFrame(o),o=null),s!==null&&(clearInterval(s),s=null),c!==null&&(clearTimeout(c),c=null),l?.disconnect(),l=null,document.removeEventListener(`load`,u,!0))}}var ur=class{entries;log;getScrollablePageElement;persistInHistoryState;currentStateId;constructor(e,t,n=10){this.entries=new Vn(n),this.log=e,this.getScrollablePageElement=t.getScrollablePageElement,this.persistInHistoryState=t.persistInHistoryState??!1}historyState(e,t){return this.persistInHistoryState?{id:e,state:t}:{id:e}}replaceState(e,t){$();let n=Z();window.history.replaceState(this.historyState(n,e),``,t),this.currentStateId=n,this.entries.set(n,{state:e,scrollY:0}),this.scrollTop=0,this.log.info(`replaceState`,e,t,n)}pushState(e,t){$();let n=Z();window.history.pushState(this.historyState(n,e),``,t),this.currentStateId=n,this.entries.set(n,{state:e,scrollY:0}),this.scrollTop=0,this.log.info(`pushState`,e,t,n)}beforeTransition(){$();let{state:e}=window.history;if(!e)return;let t=this.entries.get(e.id);if(!t){this.log.info(`current history state evicted from LRU, not saving scroll position`);return}let{scrollTop:n}=this;this.entries.set(e.id,{...t,scrollY:n}),this.log.info(`saving scroll position`,n)}onPopState(e){window.addEventListener(`popstate`,t=>{$(),this.currentStateId=t.state?.id,this.currentStateId||this.log.warn(`encountered a null event.state.id in onPopState event:`,window.location.href),this.log.info(`popstate`,this.entries,this.currentStateId);let n=this.currentStateId?this.entries.get(this.currentStateId):void 0,r=this.persistInHistoryState?t.state?.state:void 0,i=n?.state??r;if(Promise.resolve(e(window.location.href,i)).catch(e=>{this.log.error(`onPopState listener error:`,e)}),!n)return;let{scrollY:a}=n;this.log.info(`restoring scroll to`,a),lr(this.log,()=>this.getScrollablePageElement(),a)})}pushUrl(e){$();let t=Z();window.history.pushState({id:t},``,e),this.currentStateId=t,this.scrollTop=0,this.log.info(`pushUrl (no state)`,e,t)}replaceUrl(e){$();let t=Z();window.history.replaceState({id:t},``,e),this.currentStateId=t,this.scrollTop=0,this.log.info(`replaceUrl (no state)`,e,t)}updateState(e){if(!this.currentStateId){this.log.warn(`failed: encountered a null currentStateId inside updateState`);return}let t=this.entries.get(this.currentStateId),n=e(t?.state);this.log.info(`updateState`,n,this.currentStateId),this.entries.set(this.currentStateId,{scrollY:t?.scrollY??0,state:n})}get scrollTop(){return this.getScrollablePageElement()?.scrollTop||0}set scrollTop(e){let t=this.getScrollablePageElement();t&&(t.scrollTop=e)}};function dr(t){let{framework:n,log:r,callbacks:i,updateApp:a}=t,o=t.manageHistory??!0,{onForward:s}=t,c=!0,l=0,u=o?new ur(r,{getScrollablePageElement:t.getScrollablePageElement??(()=>document.getElementById(`scrollable-page-override`)||document.getElementById(`scrollable-page`)||document.documentElement)}):void 0;async function d(e,t,o){if(t>=5){r.error(`Navigation redirect loop detected (5 redirects), stopping at: ${e}`);return}let s=c||e===window.location.pathname+window.location.search,p=await n.routeUrl(e);if(!p){r.warn(`FlowAction: no route for ${e}`);return}let m=Q({url:e,intent:p.intent,container:n.container}),h=await n.runBeforeLoad(m,p.beforeGuards);if(h.kind===`redirect`){r.debug(`beforeLoad → redirect to ${h.url}`),await d(h.url,t+1,o);return}if(h.kind===`deny`){r.warn(`beforeLoad → denied (${h.status}): ${h.message}`);return}if(h.kind===`rewrite`){r.debug(`beforeLoad → rewrite to ${h.url}`),await d(h.url,t+1,o);return}let g=n.dispatch(p.intent);if(await Promise.race([g,new Promise(e=>setTimeout(e,500))]).catch(()=>{}),o!==l){r.info(`FlowAction superseded by newer navigation`,e);return}u?.beforeTransition(),a({page:g.then(async a=>{if(o!==l)return r.info(`FlowAction commit superseded`,e),a;let c={...m,page:a},h=await n.runAfterLoad(c,p.afterGuards);if(h.kind===`redirect`)return r.debug(`afterLoad → redirect to ${h.url}`),d(h.url,t+1,o),a;let g=e;return h.kind===`rewrite`&&(g=h.url,r.debug(`afterLoad → rewrite URL to ${g}`)),h.kind===`deny`?(r.warn(`afterLoad → denied (${h.status})`),a):(s?u?.replaceState({page:a},g):u?.pushState({page:a},g),i.onNavigate(new URL(g,window.location.origin).pathname),f(a),a)},t=>{if(o===l){let t=e;s?u?.replaceUrl(t):u?.pushUrl(t),i.onNavigate(new URL(t,window.location.origin).pathname)}throw t}),isFirstPage:c}),c=!1}n.onAction(e.FLOW,async e=>{let t=e,a=t.url;if(r.debug(`FlowAction → ${a}`),t.presentationContext===`modal`){let e=await n.routeUrl(a);if(e){let t=await n.dispatch(e.intent);i.onModal(t)}return}if(s){await s(a);return}await d(a,0,++l)}),u?.onPopState(async(e,t)=>{if(r.debug(`popstate → ${e}, cached=${!!t}`),i.onNavigate(new URL(e).pathname),t){let{page:e}=t;f(e),a({page:e,isFirstPage:c});return}let o=new URL(e),s=await n.routeUrl(o.pathname+o.search);if(!s){r.error(`received popstate without data, but URL was unroutable:`,e),f(null),a({page:Promise.reject(Error(`404`)),isFirstPage:c});return}let u=Q({url:o.pathname+o.search,intent:s.intent,container:n.container}),p=await n.runBeforeLoad(u,s.beforeGuards);if(p.kind===`redirect`){r.debug(`popstate beforeLoad → redirect to ${p.url}`);let e=++l;await d(p.url,0,e);return}if(p.kind===`deny`||p.kind===`rewrite`){if(p.kind===`deny`)r.warn(`popstate beforeLoad → denied`);else{let e=++l;await d(p.url,0,e)}return}let m=n.dispatch(s.intent);await Promise.race([m,new Promise(e=>setTimeout(e,500))]).catch(()=>{}),a({page:m.then(async e=>{let t={...u,page:e},a=await n.runAfterLoad(t,s.afterGuards);if(a.kind===`redirect`){r.debug(`popstate afterLoad → redirect to ${a.url}`);let t=++l;return d(a.url,0,t),e}if(a.kind===`rewrite`){r.debug(`popstate afterLoad → rewrite URL to ${a.url}`);let t=window.history.state?.id;return window.history.replaceState({id:t},``,a.url),i.onNavigate(new URL(a.url,window.location.origin).pathname),f(e),e}return a.kind===`deny`?(r.warn(`popstate afterLoad → denied (${a.status})`),e):(f(e),e)}),isFirstPage:c})});function f(e){(async()=>{try{e&&n.didEnterPage(e)}catch(e){r.error(`didEnterPage error:`,e)}})()}}function fr(e){let{framework:t,log:n,callbacks:r,updateApp:i}=e;dr({framework:t,log:n,callbacks:r,updateApp:i,getScrollablePageElement:e.getScrollablePageElement,manageHistory:e.manageHistory,onForward:e.onForward}),or({framework:t,log:n})}function pr(e,t){let n={};return e!==void 0&&(n.getSnapshot=(...t)=>e.getSnapshot(...t),n.subscribe=(...t)=>e.subscribe(...t),n.push=(...t)=>e.push(...t),n.pop=(...t)=>e.pop(...t),n.popToRoot=(...t)=>e.popToRoot(...t),n.replaceTop=(...t)=>e.replaceTop(...t),n.selectTab=(...t)=>e.selectTab(...t),n.selectColumn=(...t)=>e.selectColumn(...t)),t!==void 0&&(n.save=(...e)=>t.save(...e),n.clear=(...e)=>t.clear(...e),Object.defineProperty(n,`scope`,{get:()=>t.scope,enumerable:!0,configurable:!0})),n}function mr(e){let t=[];e.hasAttribute(`data-restore-root`)&&t.push(e);for(let n of e.querySelectorAll(`[data-restore-root]`))t.push(n);return t}function hr(e){return e.getAttribute(`data-restore-key`)||e.name||void 0}function gr(e){return e.getAttribute(`data-fs-key`)??void 0}function _r(e){let{scope:t}=e,n=e.schedule??(e=>{typeof requestAnimationFrame==`function`?requestAnimationFrame(e):e()});function r(e){let t={},n={},r={};for(let i of mr(e)){for(let e of i.querySelectorAll(`input, textarea, select`)){if(e.type===`password`||e.hasAttribute(`data-restore-ignore`))continue;let n=hr(e);if(!n)continue;let r=e.type;t[n]=r===`checkbox`||r===`radio`?e.checked:e.value}for(let e of i.querySelectorAll(`details`)){let t=e.getAttribute(`data-restore-key`);t&&(n[t]=e.open)}for(let e of i.querySelectorAll(`[data-restore-scroll]`)){let t=e.getAttribute(`data-restore-key`)??e.getAttribute(`data-restore-scroll`);t&&(r[t]={top:e.scrollTop,left:e.scrollLeft})}}return{fields:t,details:n,scroll:r}}function i(e){let n=gr(e);if(!n)return;let i=t.get(n)??{};t.set(n,{...i,__dom:r(e)})}function a(e,t){for(let n of mr(e)){for(let[e,r]of Object.entries(t.fields??{})){let t=n.querySelector(`[data-restore-key="${e}"], [name="${e}"]`);t&&(typeof r==`boolean`?t.checked=r:t.value=r,t.dispatchEvent(new Event(`input`,{bubbles:!0})),t.dispatchEvent(new Event(`change`,{bubbles:!0})))}for(let[e,r]of Object.entries(t.details??{})){let t=n.querySelector(`details[data-restore-key="${e}"]`);t&&(t.open=r)}for(let[e,r]of Object.entries(t.scroll??{})){let t=n.querySelector(`[data-restore-scroll="${e}"], [data-restore-key="${e}"]`);t&&(t.scrollTop=r.top,t.scrollLeft=r.left)}}}function o(e){let r=gr(e);if(!r)return;let i=t.get(r)?.__dom;i&&n(()=>a(e,i))}let s;function c(e){return e?.closest(`[data-fs-entry]`)??void 0}let l=e=>{let t=c(e.target);t&&o(t)},u=e=>{let t=c(e.target);t&&i(t)},d=e=>{let t=c(e.target);t&&i(t)},f=()=>{if(s)for(let e of s.querySelectorAll(`[data-fs-entry]`))i(e)},p=()=>{document.visibilityState===`hidden`&&f()};function m(e){s=e,e.addEventListener(`fs:enter`,l),e.addEventListener(`fs:conceal`,u),e.addEventListener(`input`,d,!0),e.addEventListener(`change`,d,!0),window.addEventListener(`pagehide`,f),document.addEventListener(`visibilitychange`,p);for(let t of e.querySelectorAll(`[data-fs-entry]`))o(t)}function h(){s&&=(s.removeEventListener(`fs:enter`,l),s.removeEventListener(`fs:conceal`,u),s.removeEventListener(`input`,d,!0),s.removeEventListener(`change`,d,!0),window.removeEventListener(`pagehide`,f),document.removeEventListener(`visibilitychange`,p),void 0)}return{captureEntry:i,restoreEntry:o,attach:m,dispose:h}}function vr(e,t){e.dispatchEvent(new CustomEvent(t,{bubbles:!0}))}function yr(e){let{outlet:t,mountEntry:n}=e,r=new Map,i=!1;function a(){let e=new Map;for(let n of t.querySelectorAll(`[data-fs-entry]`)){let t=n.getAttribute(`data-fs-key`);t!==null&&e.set(t,n)}return e}let o=e.schedule??(e=>{typeof requestAnimationFrame==`function`?requestAnimationFrame(e):e()});function s(e){let t=[e];for(let n of e.querySelectorAll(`[data-fs-scroll]`))t.push(n);return t}function c(e){e.scroll=s(e.container).map(e=>({top:e.scrollTop,left:e.scrollLeft}))}function l(e){let t=e.scroll;t!==void 0&&o(()=>{let n=s(e.container);t.forEach((e,t)=>{let r=n[t];r!==void 0&&(r.scrollTop=e.top,r.scrollLeft=e.left)})})}function u(e){e.attached&&=(c(e),vr(e.container,`fs:conceal`),e.container.remove(),!1)}function d(e,t){vr(t.container,`fs:exit`),t.attached&&=(t.container.remove(),!1),t.handle.unmount(),r.delete(e)}function f(e){let o=i?null:a(),s=new Set(H(e.tree).map(e=>X(e.intent,e.params)));for(let[e,t]of r)s.has(e)||d(e,t);let c=[];for(let t of e.destinations){let e=X(t.intent,t.params);c.push(e);let i=r.get(e);if(i!==void 0&&i.page!==t.page&&d(e,i),!r.has(e)){let i=o?.get(e),a=i??document.createElement(`div`);if(i===void 0)for(let[n,r]of Object.entries(xt(t.intent,e)))a.setAttribute(n,r);else o?.delete(e);let s=n({intent:t.intent,params:t.params,entryKey:e,page:t.page,hydrate:i!==void 0},a);r.set(e,{container:a,handle:s,attached:i!==void 0,entered:!1,page:t.page})}}if(o)for(let e of o.values())e.remove();let f=new Set(c);for(let[e,t]of r)f.has(e)||u(t);for(let e of c){let n=r.get(e);if(n===void 0)continue;let i=n.attached;t.appendChild(n.container),n.attached=!0,n.entered||(n.entered=!0,vr(n.container,`fs:enter`)),i||(vr(n.container,`fs:reveal`),l(n))}i=!0}function p(){for(let[e,t]of r)d(e,t)}return{sync:f,dispose:p}}function br(){return document.getElementById(`scrollable-page-override`)||document.getElementById(`scrollable-page`)||document.documentElement}function xr(e){let{controller:t,codec:n,router:r,log:i}=e,a=new ur(i,{getScrollablePageElement:e.getScrollablePageElement??br,persistInHistoryState:!0}),o=!1,s=!0;t.subscribe(e=>{if(o)return;let t=n.encode(e.tree,r),c={tree:q(e.tree)},l=typeof window<`u`?window.location.pathname+window.location.search:t,u=s||t===l;a.beforeTransition(),u?a.replaceState(c,t):a.pushState(c,t),s=!1,i.debug(`[navigation] snapshot → ${u?`replace`:`push`} ${t}`)}),a.onPopState(async(e,n)=>{i.debug(`[navigation] popstate → ${e}, cached=${!!n}`);let r=c(e,n);if(r===void 0){i.warn(`[navigation] popstate: cannot restore tree for ${e}, keeping current`);return}o=!0;try{await t.hydrate(r)}finally{o=!1}});function c(e,t){if(t!==void 0)try{return Vt(t.tree)}catch(e){i.warn(`[navigation] cached tree deserialize failed, falling back to codec`,e)}try{return n.decode(e,r)}catch(e){i.error(`[navigation] codec.decode failed:`,e);return}}return{getSnapshot(){return t.getSnapshot()},push(e,n,r){return t.push(e,n,r)},pop(e){return t.pop(e)},popToRoot(){return t.popToRoot()},replaceTop(e,n){return t.replaceTop(e,n)},selectTab(e,n){return t.selectTab(e,n)},selectColumn(e,n,r,i){return t.selectColumn(e,n,r,i)},hydrate(e){return t.hydrate(e)},subscribe(e){return t.subscribe(e)}}}async function Sr(e){let{framework:t,initialUrl:n,mountEntry:r,target:a,log:o,getScrollablePageElement:s}=e,c=await t.routeUrl(n);c===null&&o.warn(`[flat-islands] initialUrl "${n}" matched no route; mounting a fallback. Check defineRoutes / base path.`);let l=ht(c===null?[L(`__not_found__`,{})]:[L(c.intent.id,c.intent.params??{})]),u=vn(),d=bn({intentDispatcher:t.intentDispatcher,router:t.router,initial:l,createContext:({intent:e,params:n})=>{let r=u.encode({kind:`leaf`,intent:e,params:n},t.router);return{container:t.container,navigation:Q({url:r,intent:{id:e,params:n},container:t.container}),url:r}},prefetched:t.prefetchedIntents,onRedirect:({url:e})=>{t.perform(i(e))}}),f=xr({controller:d,codec:u,router:t.router,log:o,getScrollablePageElement:s}),p=a.querySelector(`[data-fs-outlet]`);if(!p)throw Error(`[startBrowserApp] mountEntry 已提供(flat-islands),但 mount 渲染的 DOM 里找不到 [data-fs-outlet]。请在 mount 回调里放一个稳定、空的 <main data-fs-outlet></main>。`);let m=p,h=yr({outlet:m,mountEntry:r});h.sync(d.getSnapshot()),d.subscribe(e=>h.sync(e)),await d.resolve();async function g(e){let n=await t.routeUrl(e);if(!n){o.warn(`[flat-islands] pushUrl: no route for ${e}`);return}await d.push(n.intent.id,n.intent.params??{})}return{handle:f,controller:d,outlet:m,pushUrl:g}}function Cr(){let e=document.getElementById(`serialized-server-data`);if(e?.textContent){e.parentNode?.removeChild(e);try{return JSON.parse(e.textContent)}catch{return}}}function wr(){let e=Cr();return!e||!Array.isArray(e)?M.empty():M.fromArray(e)}const Tr=500;function Er(e){let t=[e.indexOf(`?`),e.indexOf(`#`)].filter(e=>e>=0);return t.length>0?e.slice(0,Math.min(...t)):e}function Dr(e,t){let n=e.navigation;if(n===void 0)return!0;let r=Er(t)===`/`;return e.url===void 0?jn(n)&&t===n.url||r:t===e.url||r}function Or(e){let{store:t,adapter:n,subscribeNavigation:r}=e,i=e.debounceMs??500,a=e.shouldRestore??Dr,o;function s(){o!==void 0&&(clearTimeout(o),o=void 0)}function c(){s(),t.save()}function l(){t.scope.prune(n.presentKeys()),s(),o=setTimeout(()=>{o=void 0,t.save()},i)}function u(){document.visibilityState===`hidden`&&c()}let d=r?.(l);return window.addEventListener(`pagehide`,c),document.addEventListener(`visibilitychange`,u),{get scope(){return t.scope},restore(e){let n=t.load();if(n!==void 0&&a(n,e))return t.restore(n)},save(){t.save()},clear(){t.clear()},dispose(){s(),d?.(),window.removeEventListener(`pagehide`,c),document.removeEventListener(`visibilitychange`,u)}}}const kr={get(){},set(){},delete(){}};function Ar(e){try{return(e===`session`?window.sessionStorage:window.localStorage)??void 0}catch{return}}function jr(e){let t=Ar(e);return t===void 0?kr:{get(e){return t.getItem(e)??void 0},set(e,n){try{t.setItem(e,n)}catch{}},delete(e){t.removeItem(e)}}}async function Mr(e){let{bootstrap:t,mountId:n=`app`,mount:r,callbacks:i,onBeforeStart:a,onAfterStart:o,frameworkConfig:s={},loadMessages:c}=e,l=wr(),u=window.location.pathname+window.location.search,d=Lr(s.locale),f=await le({locale:d,loadMessages:c,context:d?{runtime:`browser`,fetch:Rr(s.fetch),url:u}:void 0}),p=rt.create({...s,locale:d,_resolvedMessages:f,prefetchedIntents:l});t(p);let m=p.container.resolve(O.LOGGER_FACTORY).loggerFor(`browser`),h=p.getLocale();h&&(ae(h),m.debug(`[startBrowserApp] Applied locale attributes:`,h)),await a?.(p);let g=await p.routeUrl(u),_=document.getElementById(n);if(!_)throw Error(`[startBrowserApp] Mount target not found: #${n}. Ensure your HTML has <div id="${n}"></div>.`);let v;e.navigation&&(v=await Nr({framework:p,navigation:e.navigation,log:m,getScrollablePageElement:e.getScrollablePageElement}));let y=e.session&&!e.navigation&&!e.mountEntry?Fr():void 0,b;e.session&&(b=Ir({framework:p,session:e.session,navController:v?.controller,flatNavigation:y}));let x=v!==void 0||b!==void 0?pr(v?.handle,b):void 0,S=r(_,{framework:p,navigation:v?.handle,session:b,app:x}),C;fr({framework:p,log:m,callbacks:y?y.wrap(i):i,updateApp:S,getScrollablePageElement:e.getScrollablePageElement,manageHistory:!(e.navigation||e.mountEntry),onForward:e.mountEntry&&!e.navigation?e=>C?.(e):void 0});let w;e.mountEntry&&!e.navigation&&(w=await Sr({framework:p,initialUrl:u,mountEntry:e.mountEntry,target:_,log:m,getScrollablePageElement:e.getScrollablePageElement}),C=w.pushUrl);let T;if(v!==void 0){let{outlet:e}=await Pr({core:v,target:_});T=e}else w===void 0&&(g?await p.perform(g.action):S({page:Promise.reject(Error(`404`)),isFirstPage:!0}));T??=w?.outlet,b!==void 0&&await b.restore(u),e.domRestore&&T&&b!==void 0&&_r({scope:b.scope}).attach(T),await o?.(p)}async function Nr(e){let{framework:t,navigation:n,log:r,getScrollablePageElement:a}=e,o=n.codec??pn(),s=bn({intentDispatcher:t.intentDispatcher,router:t.router,initial:n.initial,createContext:({intent:e,params:n})=>{let r=o.encode({kind:`leaf`,intent:e,params:n},t.router);return{container:t.container,navigation:Q({url:r,intent:{id:e,params:n},container:t.container}),url:r}},beforeLoad:n.beforeLoad,afterLoad:n.afterLoad,prefetched:t.prefetchedIntents,getErrorPage:n.getErrorPage,onRedirect:({url:e})=>{t.perform(i(e))}});return{handle:xr({controller:s,codec:o,router:t.router,log:r,getScrollablePageElement:a}),controller:s,mountEntry:n.mountEntry}}async function Pr(e){let{core:t,target:n}=e;if(await t.controller.resolve(),t.mountEntry===void 0)return{};let r=n.querySelector(`[data-fs-outlet]`);if(!r)throw Error(`[startBrowserApp] navigation.mountEntry 已提供,但 mount 渲染的 DOM 里找不到 [data-fs-outlet]。请在 chrome 里放一个稳定、空的 <main data-fs-outlet></main>。`);let i=yr({outlet:r,mountEntry:t.mountEntry});return i.sync(t.controller.getSnapshot()),t.controller.subscribe(e=>i.sync(e)),{outlet:r}}function Fr(){let e=new Set;return{wrap(t){return{...t,onNavigate(n){t.onNavigate(n);for(let t of e)t()}}},subscribe(t){return e.add(t),()=>{e.delete(t)}}}}function Ir(e){let{framework:t,session:n,navController:r,flatNavigation:a}=e,o=()=>window.location.pathname+window.location.search,s=r?zn(r,o):Bn({currentUrl:o,navigate:e=>t.perform(i(e))}),c=r?e=>r.subscribe(()=>e()):a?e=>a.subscribe(e):void 0,l=Rn({storage:n.storage??jr(`session`),navigation:s,version:n.version,maxAgeMs:n.maxAgeMs});for(let e of n.providers??[])l.register(e);return Or({store:l,adapter:s,subscribeNavigation:c,debounceMs:n.debounceMs,shouldRestore:n.shouldRestore})}function Lr(e){return e||document.documentElement.lang.trim()||void 0}function Rr(e){return(e??globalThis.fetch?.bind(globalThis))||(()=>{throw Error(`[startBrowserApp] loadMessages requires a fetch implementation.`)})}function zr(e){let t=e.querySelector(`[data-fs-chrome]`);if(t!==null){let n=e.querySelector(`[data-fs-outlet]`);if(n===null)throw Error(`[resolveIslandsShell] 找到 [data-fs-chrome] 但缺 [data-fs-outlet];SSR shell 应同时含两者。`);return{chromeRoot:t,outlet:n,hydrate:t.firstChild!==null}}let n=document.createElement(`div`);n.setAttribute(`data-fs-chrome`,``);let r=document.createElement(`main`);return r.setAttribute(`data-fs-outlet`,``),e.append(n,r),{chromeRoot:n,outlet:r,hydrate:!1}}export{J as $,qe as $t,Jn as A,te as An,_t as At,Rn as B,c as Bn,ut as Bt,Qn as C,fe as Cn,Dt as Ct,Zn as D,ue as Dn,vt as Dt,Q as E,le as En,bt as Et,Un as F,_ as Fn,F as Ft,Nn as G,n as Gn,at as Gt,Ln as H,o as Hn,N as Ht,Hn as I,v as In,mt as It,Mn as J,i as Jn,j as Jt,kn as K,t as Kn,rt as Kt,Vn as L,g as Ln,ft as Lt,qn as M,oe as Mn,gt as Mt,Gn as N,ae as Nn,P as Nt,Z as O,re as On,yt as Ot,Wn as P,x as Pn,I as Pt,En as Q,Qe as Qt,zn as R,l as Rn,pt as Rt,tr as S,me as Sn,It as St,er as T,pe as Tn,R as Tt,X as U,e as Un,st as Ut,In as V,s as Vn,it as Vt,Pn as W,r as Wn,ot as Wt,On as X,$e as Xt,jn as Y,et as Yt,Dn as Z,Ze as Zt,or as _,xe as _n,kt as _t,Or as a,Be as an,rn as at,rr as b,ge as bn,Ft as bt,Cr as c,Le as cn,q as ct,_r as d,Oe as dn,Et as dt,Ue as en,bn as et,pr as f,De as fn,Tt as ft,lr as g,Ce as gn,jt as gt,ur as h,Se as hn,Mt as ht,Tr as i,Xe as in,mn as it,Kn as j,ie as jn,ht as jt,Yn as k,ne as kn,L as kt,xr as l,O as ln,zt as lt,dr as m,Ee as mn,At as mt,Mr as n,Je as nn,pn as nt,Dr as o,k as on,nn as ot,fr as p,Te as pn,B as pt,An as q,a as qn,M as qt,jr as r,Ve as rn,vn as rt,wr as s,Re as sn,Vt as st,zr as t,We as tn,Jt as tt,yr as u,Fe as un,H as ut,ar as v,D as vn,Nt as vt,$n as w,de as wn,xt as wt,nr as x,he as xn,Pt as xt,ir as y,_e as yn,Ct as yt,Bn as z,u as zn,dt as zt};
2
+ //# sourceMappingURL=browser-BIetJHp_.mjs.map