@erickxavier/no-js 1.0.2 → 1.1.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/index.js", "../../src/globals.js", "../../src/i18n.js", "../../src/context.js", "../../src/evaluate.js", "../../src/fetch.js", "../../src/dom.js", "../../src/registry.js", "../../src/animations.js", "../../src/router.js", "../../src/filters.js", "../../src/directives/state.js", "../../src/directives/http.js", "../../src/directives/binding.js", "../../src/directives/conditionals.js", "../../src/directives/loops.js", "../../src/directives/styling.js", "../../src/directives/events.js", "../../src/directives/refs.js", "../../src/directives/validation.js", "../../src/directives/i18n.js"],
4
- "sourcesContent": ["// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// No.JS \u2014 Module Entry Point\n// For npm/ESM/CJS consumers: import NoJS from 'nojs'\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n// Core modules\nimport {\n _config,\n _filters,\n _validators,\n _interceptors,\n _eventBus,\n _stores,\n _refs,\n _routerInstance,\n setRouterInstance,\n _log,\n} from \"./globals.js\";\nimport { _i18n } from \"./i18n.js\";\nimport { createContext } from \"./context.js\";\nimport { evaluate, resolve } from \"./evaluate.js\";\nimport { findContext, _loadRemoteTemplates, _loadRemoteTemplatesPhase1, _loadRemoteTemplatesPhase2, _processTemplateIncludes } from \"./dom.js\";\nimport { registerDirective, processTree } from \"./registry.js\";\nimport { _createRouter } from \"./router.js\";\n\n// Side-effect imports: register built-in filters\nimport \"./filters.js\";\n\n// Side-effect imports: register all built-in directives\nimport \"./directives/state.js\";\nimport \"./directives/http.js\";\nimport \"./directives/binding.js\";\nimport \"./directives/conditionals.js\";\nimport \"./directives/loops.js\";\nimport \"./directives/styling.js\";\nimport \"./directives/events.js\";\nimport \"./directives/refs.js\";\nimport \"./directives/validation.js\";\nimport \"./directives/i18n.js\";\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// PUBLIC API\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nfunction _getDefaultRoutePath() {\n if (typeof window === \"undefined\") return null;\n const routerCfg = _config.router || {};\n if (routerCfg.mode === \"hash\") {\n return window.location.hash.slice(1) || \"/\";\n }\n const base = (routerCfg.base || \"/\").replace(/\\/$/, \"\");\n return window.location.pathname.replace(base, \"\") || \"/\";\n}\n\nconst NoJS = {\n get baseApiUrl() {\n return _config.baseApiUrl;\n },\n set baseApiUrl(v) {\n _config.baseApiUrl = v;\n },\n\n config(opts = {}) {\n // Save nested objects before shallow assign overwrites them\n const prevHeaders = { ..._config.headers };\n const prevCache = { ..._config.cache };\n const prevTemplates = { ..._config.templates };\n const prevRouter = { ..._config.router };\n const prevI18n = { ..._config.i18n };\n Object.assign(_config, opts);\n if (opts.headers)\n _config.headers = { ...prevHeaders, ...opts.headers };\n if (opts.csrf) _config.csrf = opts.csrf;\n if (opts.cache) _config.cache = { ...prevCache, ...opts.cache };\n if (opts.templates) _config.templates = { ...prevTemplates, ...opts.templates };\n if (opts.router) _config.router = { ...prevRouter, ...opts.router };\n if (opts.i18n) {\n _config.i18n = { ...prevI18n, ...opts.i18n };\n _i18n.locale = opts.i18n.defaultLocale || _i18n.locale;\n }\n },\n\n async init(root) {\n if (typeof document === \"undefined\") return;\n root = root || document.body;\n _log(\"Initializing...\");\n\n // Inline template includes (e.g. skeletons) \u2014 synchronous, before any fetch\n _processTemplateIncludes(root);\n\n // Determine active route path for phase 1 prioritization\n const defaultRoutePath = _getDefaultRoutePath();\n\n // Phase 1 (blocking): priority + non-route + default route templates\n await _loadRemoteTemplatesPhase1(defaultRoutePath);\n\n // Check for route-view outlets to activate router\n if (document.querySelector(\"[route-view]\")) {\n setRouterInstance(_createRouter());\n }\n\n processTree(root); // \u2190 first paint happens here\n\n // Init router after tree is processed\n if (_routerInstance) await _routerInstance.init();\n\n _log(\"Initialized.\");\n\n // Phase 2 (non-blocking): background preload remaining route templates\n _loadRemoteTemplatesPhase2();\n\n // DevTools integration\n if (_config.devtools && typeof window !== \"undefined\") {\n window.__NOJS_DEVTOOLS__ = {\n stores: _stores,\n config: _config,\n refs: _refs,\n router: _routerInstance,\n filters: Object.keys(_filters),\n validators: Object.keys(_validators),\n version: NoJS.version,\n };\n _log(\"DevTools enabled \u2014 access via window.__NOJS_DEVTOOLS__\");\n }\n },\n\n // Register custom directive\n directive(name, handler) {\n registerDirective(name, handler);\n },\n\n // Register custom filter\n filter(name, fn) {\n _filters[name] = fn;\n },\n\n // Register custom validator\n validator(name, fn) {\n _validators[name] = fn;\n },\n\n // i18n\n i18n(opts) {\n if (opts.locales) _i18n.locales = opts.locales;\n if (opts.defaultLocale) _i18n.locale = opts.defaultLocale;\n if (opts.fallbackLocale) _config.i18n.fallbackLocale = opts.fallbackLocale;\n if (opts.detectBrowser) {\n const browserLang =\n typeof navigator !== \"undefined\" ? navigator.language : \"en\";\n if (_i18n.locales[browserLang]) _i18n.locale = browserLang;\n }\n },\n\n // Event bus\n on(event, fn) {\n if (!_eventBus[event]) _eventBus[event] = [];\n _eventBus[event].push(fn);\n return () => {\n _eventBus[event] = _eventBus[event].filter((f) => f !== fn);\n };\n },\n\n // Request interceptors\n interceptor(type, fn) {\n if (_interceptors[type]) _interceptors[type].push(fn);\n },\n\n // Access global stores\n get store() {\n return _stores;\n },\n\n // Access router\n get router() {\n return _routerInstance;\n },\n\n // Utilities (for custom directives)\n createContext,\n evaluate,\n findContext,\n processTree,\n resolve,\n\n // Version\n version: \"1.0.2\",\n};\n\nexport default NoJS;\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// SHARED STATE & UTILITIES\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nexport const _config = {\n baseApiUrl: \"\",\n headers: {},\n timeout: 10000,\n retries: 0,\n retryDelay: 1000,\n credentials: \"same-origin\",\n csrf: null,\n cache: { strategy: \"none\", ttl: 300000 },\n templates: { cache: true },\n router: { mode: \"history\", base: \"/\", scrollBehavior: \"top\" },\n i18n: { defaultLocale: \"en\", fallbackLocale: \"en\", detectBrowser: false },\n debug: false,\n devtools: false,\n csp: null,\n sanitize: true,\n};\n\nexport const _interceptors = { request: [], response: [] };\nexport const _eventBus = {};\nexport const _stores = {};\nexport const _storeWatchers = new Set();\nexport const _filters = {};\nexport const _validators = {};\nexport const _cache = new Map();\nexport const _refs = {};\nexport let _routerInstance = null;\n\nexport function setRouterInstance(r) {\n _routerInstance = r;\n}\n\nexport function _log(...args) {\n if (_config.debug) console.log(\"[No.JS]\", ...args);\n}\n\nexport function _warn(...args) {\n console.warn(\"[No.JS]\", ...args);\n}\n\nexport function _notifyStoreWatchers() {\n for (const fn of _storeWatchers) fn();\n}\n\nexport function _watchExpr(expr, ctx, fn) {\n ctx.$watch(fn);\n if (typeof expr === \"string\" && expr.includes(\"$store\")) {\n _storeWatchers.add(fn);\n }\n}\n\nexport function _emitEvent(name, data) {\n (_eventBus[name] || []).forEach((fn) => fn(data));\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// i18n SYSTEM\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _config } from \"./globals.js\";\n\nconst _i18nListeners = new Set();\n\nexport function _watchI18n(fn) {\n _i18nListeners.add(fn);\n return () => _i18nListeners.delete(fn);\n}\n\nexport const _i18n = {\n _locale: \"en\",\n locales: {},\n get locale() {\n return this._locale;\n },\n set locale(v) {\n if (this._locale !== v) {\n this._locale = v;\n _i18nListeners.forEach((fn) => fn());\n }\n },\n t(key, params = {}) {\n const messages =\n _i18n.locales[_i18n.locale] ||\n _i18n.locales[_config.i18n.fallbackLocale] ||\n {};\n let msg = key.split(\".\").reduce((o, k) => o?.[k], messages);\n if (msg == null) return key;\n\n // Pluralization: \"one item | {count} items\"\n if (\n typeof msg === \"string\" &&\n msg.includes(\"|\") &&\n params.count != null\n ) {\n const forms = msg.split(\"|\").map((s) => s.trim());\n msg = Number(params.count) === 1 ? forms[0] : forms[1] || forms[0];\n }\n\n // Interpolation: {name}\n if (typeof msg === \"string\") {\n msg = msg.replace(/\\{(\\w+)\\}/g, (_, k) =>\n params[k] != null ? params[k] : \"\",\n );\n }\n return msg;\n },\n};\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// REACTIVE CONTEXT\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _stores, _refs, _routerInstance } from \"./globals.js\";\nimport { _i18n } from \"./i18n.js\";\n\nlet _batchDepth = 0;\nconst _batchQueue = new Set();\n\nexport function _startBatch() {\n _batchDepth++;\n}\n\nexport function _endBatch() {\n _batchDepth--;\n if (_batchDepth === 0 && _batchQueue.size > 0) {\n const fns = [..._batchQueue];\n _batchQueue.clear();\n fns.forEach((fn) => fn());\n }\n}\n\nexport function createContext(data = {}, parent = null) {\n const listeners = new Set();\n const raw = {};\n Object.assign(raw, data);\n let notifying = false;\n\n function notify() {\n if (notifying) return;\n notifying = true;\n try {\n if (_batchDepth > 0) {\n listeners.forEach((fn) => _batchQueue.add(fn));\n } else {\n listeners.forEach((fn) => fn());\n }\n } finally {\n notifying = false;\n }\n }\n\n const handler = {\n get(target, key) {\n if (key === \"__isProxy\") return true;\n if (key === \"__raw\") return target;\n if (key === \"__listeners\") return listeners;\n if (key === \"$watch\")\n return (fn) => {\n listeners.add(fn);\n return () => listeners.delete(fn);\n };\n if (key === \"$notify\") return notify;\n if (key === \"$set\")\n return (k, v) => {\n proxy[k] = v;\n };\n if (key === \"$parent\") return parent;\n if (key === \"$refs\") return _refs;\n if (key === \"$store\") return _stores;\n if (key === \"$route\")\n return _routerInstance ? _routerInstance.current : {};\n if (key === \"$router\") return _routerInstance;\n if (key === \"$i18n\") return _i18n;\n if (key === \"$form\") return target.$form || null;\n if (key in target) return target[key];\n if (parent && parent.__isProxy) return parent[key];\n return undefined;\n },\n set(target, key, value) {\n const old = target[key];\n target[key] = value;\n if (old !== value) notify();\n return true;\n },\n has(target, key) {\n if (key in target) return true;\n if (parent && parent.__isProxy) return key in parent;\n return false;\n },\n };\n\n const proxy = new Proxy(raw, handler);\n return proxy;\n}\n\n// Collect all keys from a context + its parent chain\nexport function _collectKeys(ctx) {\n const allKeys = new Set();\n const allVals = {};\n let c = ctx;\n while (c && c.__isProxy) {\n const raw = c.__raw;\n for (const k of Object.keys(raw)) {\n if (!allKeys.has(k)) {\n allKeys.add(k);\n allVals[k] = raw[k];\n }\n }\n c = c.$parent;\n }\n return { keys: [...allKeys], vals: allVals };\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// EXPRESSION EVALUATOR\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _stores, _routerInstance, _filters, _warn, _config, _notifyStoreWatchers } from \"./globals.js\";\nimport { _i18n } from \"./i18n.js\";\nimport { _collectKeys } from \"./context.js\";\n\nconst _exprCache = new Map();\n\n// CSP-safe expression evaluator (no new Function / eval)\n// Handles dot-notation paths, basic comparisons, boolean operators, negation, and literals.\nfunction _cspSafeEval(expr, keys, vals) {\n const scope = {};\n for (let i = 0; i < keys.length; i++) scope[keys[i]] = vals[i];\n\n function resolvePath(path, obj) {\n return path.split(\".\").reduce((o, k) => o?.[k], obj);\n }\n\n function parseValue(token) {\n const t = token.trim();\n if (t === \"true\") return true;\n if (t === \"false\") return false;\n if (t === \"null\") return null;\n if (t === \"undefined\") return undefined;\n if (/^-?\\d+(\\.\\d+)?$/.test(t)) return Number(t);\n if (/^(['\"`]).*\\1$/.test(t)) return t.slice(1, -1);\n // Treat as property path resolved from scope\n return resolvePath(t, scope);\n }\n\n const trimmed = expr.trim();\n\n // Handle ternary: condition ? trueExpr : falseExpr\n const ternaryMatch = trimmed.match(/^(.+?)\\s*\\?\\s*(.+?)\\s*:\\s*(.+)$/);\n if (ternaryMatch) {\n const cond = _cspSafeEval(ternaryMatch[1].trim(), keys, vals);\n return cond\n ? _cspSafeEval(ternaryMatch[2].trim(), keys, vals)\n : _cspSafeEval(ternaryMatch[3].trim(), keys, vals);\n }\n\n // Handle logical OR (||)\n if (trimmed.includes(\"||\")) {\n const parts = trimmed.split(\"||\");\n for (const part of parts) {\n const val = _cspSafeEval(part.trim(), keys, vals);\n if (val) return val;\n }\n return _cspSafeEval(parts[parts.length - 1].trim(), keys, vals);\n }\n\n // Handle logical AND (&&)\n if (trimmed.includes(\"&&\")) {\n const parts = trimmed.split(\"&&\");\n let last;\n for (const part of parts) {\n last = _cspSafeEval(part.trim(), keys, vals);\n if (!last) return last;\n }\n return last;\n }\n\n // Handle comparisons: ===, !==, ==, !=, >=, <=, >, <\n const cmpMatch = trimmed.match(/^(.+?)\\s*(===|!==|==|!=|>=|<=|>|<)\\s*(.+)$/);\n if (cmpMatch) {\n const left = parseValue(cmpMatch[1]);\n const right = parseValue(cmpMatch[3]);\n switch (cmpMatch[2]) {\n case \"===\": return left === right;\n case \"!==\": return left !== right;\n case \"==\": return left == right;\n case \"!=\": return left != right;\n case \">=\": return left >= right;\n case \"<=\": return left <= right;\n case \">\": return left > right;\n case \"<\": return left < right;\n }\n }\n\n // Handle negation\n if (trimmed.startsWith(\"!\")) {\n return !_cspSafeEval(trimmed.slice(1).trim(), keys, vals);\n }\n\n return parseValue(trimmed);\n}\n\n// Parse pipe syntax: \"expr | filter1 | filter2:arg\"\nfunction _parsePipes(exprStr) {\n // Don't split on || (logical OR)\n const parts = [];\n let current = \"\";\n let depth = 0;\n let inStr = false;\n let strChar = \"\";\n for (let i = 0; i < exprStr.length; i++) {\n const ch = exprStr[i];\n if (inStr) {\n current += ch;\n if (ch === strChar && exprStr[i - 1] !== \"\\\\\") inStr = false;\n continue;\n }\n if (ch === \"'\" || ch === '\"' || ch === \"`\") {\n inStr = true;\n strChar = ch;\n current += ch;\n continue;\n }\n if (ch === \"(\" || ch === \"[\" || ch === \"{\") {\n depth++;\n current += ch;\n continue;\n }\n if (ch === \")\" || ch === \"]\" || ch === \"}\") {\n depth--;\n current += ch;\n continue;\n }\n if (\n ch === \"|\" &&\n depth === 0 &&\n exprStr[i + 1] !== \"|\" &&\n exprStr[i - 1] !== \"|\"\n ) {\n parts.push(current.trim());\n current = \"\";\n continue;\n }\n current += ch;\n }\n parts.push(current.trim());\n return parts;\n}\n\nfunction _applyFilter(value, filterStr) {\n const colonIdx = filterStr.indexOf(\":\");\n let name, argStr;\n if (colonIdx === -1) {\n name = filterStr.trim();\n argStr = null;\n } else {\n name = filterStr.substring(0, colonIdx).trim();\n argStr = filterStr.substring(colonIdx + 1).trim();\n }\n const fn = _filters[name];\n if (!fn) {\n _warn(`Unknown filter: ${name}`);\n return value;\n }\n // Parse args: split by comma but respect quotes\n const args = argStr ? _parseFilterArgs(argStr) : [];\n return fn(value, ...args);\n}\n\nfunction _parseFilterArgs(str) {\n const args = [];\n let current = \"\";\n let inStr = false;\n let strChar = \"\";\n for (const ch of str) {\n if (inStr) {\n if (ch === strChar) {\n inStr = false;\n continue;\n }\n current += ch;\n continue;\n }\n if (ch === \"'\" || ch === '\"') {\n inStr = true;\n strChar = ch;\n continue;\n }\n if (ch === \",\") {\n args.push(current.trim());\n current = \"\";\n continue;\n }\n current += ch;\n }\n if (current.trim()) args.push(current.trim());\n // Try to parse numbers\n return args.map((a) => {\n const n = Number(a);\n return isNaN(n) ? a : n;\n });\n}\n\nexport function evaluate(expr, ctx) {\n if (expr == null || expr === \"\") return undefined;\n try {\n const pipes = _parsePipes(expr);\n const mainExpr = pipes[0];\n const { keys, vals } = _collectKeys(ctx);\n\n // Add special variables\n const specialKeys = [\n \"$store\",\n \"$route\",\n \"$router\",\n \"$i18n\",\n \"$refs\",\n \"$form\",\n ];\n for (const sk of specialKeys) {\n if (!keys.includes(sk)) {\n keys.push(sk);\n vals[sk] = ctx[sk];\n }\n }\n\n const keyArr = keys;\n const valArr = keyArr.map((k) => vals[k]);\n\n let result;\n if (_config.csp === \"strict\") {\n result = _cspSafeEval(mainExpr, keyArr, valArr);\n } else {\n let cacheKey = mainExpr + \"|\" + keyArr.join(\",\");\n let fn = _exprCache.get(cacheKey);\n if (!fn) {\n fn = new Function(...keyArr, `return (${mainExpr})`);\n _exprCache.set(cacheKey, fn);\n }\n result = fn(...valArr);\n }\n\n // Apply filters\n for (let i = 1; i < pipes.length; i++) {\n result = _applyFilter(result, pipes[i]);\n }\n\n return result;\n } catch (e) {\n return undefined;\n }\n}\n\n// Execute a statement (for on:* handlers)\nexport function _execStatement(expr, ctx, extraVars = {}) {\n try {\n const { keys, vals } = _collectKeys(ctx);\n // Add special vars\n const specials = {\n $store: _stores,\n $route: _routerInstance?.current,\n $router: _routerInstance,\n $i18n: _i18n,\n $refs: ctx.$refs,\n };\n Object.assign(specials, extraVars);\n for (const [k, v] of Object.entries(specials)) {\n if (!keys.includes(k)) {\n keys.push(k);\n vals[k] = v;\n }\n }\n\n const keyArr = [...keys];\n const valArr = keyArr.map((k) => vals[k]);\n\n // Build setters to write back state through the full context chain.\n // For each key in any ancestor context, find the owning context at runtime\n // and call $set on it \u2014 so mutations inside `each` loops correctly\n // propagate back to parent state (e.g. cart updated from a loop's on:click).\n const chainKeys = new Set();\n let _wCtx = ctx;\n while (_wCtx && _wCtx.__isProxy) {\n for (const k of Object.keys(_wCtx.__raw)) chainKeys.add(k);\n _wCtx = _wCtx.$parent;\n }\n const setters = [...chainKeys]\n .filter((k) => !k.startsWith(\"$\"))\n .map(\n (k) =>\n `{let _c=__ctx;while(_c&&_c.__isProxy){if('${k}'in _c.__raw){_c.$set('${k}',typeof ${k}!=='undefined'?${k}:_c.__raw['${k}']);break;}_c=_c.$parent;}}`,\n )\n .join(\"\\n\");\n\n const fn = new Function(\"__ctx\", ...keyArr, `${expr};\\n${setters}`);\n fn(ctx, ...valArr);\n\n // Notify global store watchers when expression touches $store\n if (typeof expr === \"string\" && expr.includes(\"$store\")) {\n _notifyStoreWatchers();\n }\n } catch (e) {\n _warn(\"Expression error:\", expr, e.message);\n // Dispatch a custom DOM event so error-boundary directives can catch it\n if (extraVars.$el) {\n extraVars.$el.dispatchEvent(\n new CustomEvent(\"nojs:error\", { bubbles: true, detail: { message: e.message, error: e } })\n );\n }\n }\n}\n\nexport function resolve(path, ctx) {\n return path.split(\".\").reduce((o, k) => o?.[k], ctx);\n}\n\n// Interpolate strings like \"/users/{user.id}?q={search}\"\nexport function _interpolate(str, ctx) {\n return str.replace(/\\{([^}]+)\\}/g, (_, expr) => {\n const val = evaluate(expr.trim(), ctx);\n return val != null ? val : \"\";\n });\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// FETCH HELPER, URL RESOLUTION & CACHE\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _config, _interceptors, _cache } from \"./globals.js\";\n\nexport function resolveUrl(url, el) {\n if (\n url.startsWith(\"http://\") ||\n url.startsWith(\"https://\") ||\n url.startsWith(\"//\")\n )\n return url;\n let node = el;\n while (node) {\n const base = node.getAttribute?.(\"base\");\n if (base) return base.replace(/\\/+$/, \"\") + \"/\" + url.replace(/^\\/+/, \"\");\n node = node.parentElement;\n }\n if (_config.baseApiUrl)\n return (\n _config.baseApiUrl.replace(/\\/+$/, \"\") + \"/\" + url.replace(/^\\/+/, \"\")\n );\n return url;\n}\n\nexport async function _doFetch(\n url,\n method = \"GET\",\n body = null,\n extraHeaders = {},\n el = null,\n externalSignal = null,\n) {\n const fullUrl = resolveUrl(url, el);\n let opts = {\n method: method.toUpperCase(),\n headers: { ...(_config.headers || {}), ...extraHeaders },\n credentials: _config.credentials,\n };\n\n if (body && method !== \"GET\") {\n if (typeof body === \"string\") {\n try {\n JSON.parse(body);\n opts.headers[\"Content-Type\"] = \"application/json\";\n opts.body = body;\n } catch {\n opts.body = body;\n }\n } else if (body instanceof FormData) {\n opts.body = body;\n } else {\n opts.headers[\"Content-Type\"] = \"application/json\";\n opts.body = JSON.stringify(body);\n }\n }\n\n // CSRF\n if (_config.csrf && method !== \"GET\") {\n opts.headers[_config.csrf.header || \"X-CSRF-Token\"] =\n _config.csrf.token || \"\";\n }\n\n // Request interceptors\n for (const fn of _interceptors.request) {\n opts = fn(fullUrl, opts) || opts;\n }\n\n // Retry logic\n const maxRetries = _config.retries || 0;\n let lastError;\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(),\n _config.timeout || 10000,\n );\n // Wire external abort signal (switchMap) to internal controller\n if (externalSignal) {\n if (externalSignal.aborted) {\n clearTimeout(timeout);\n throw new DOMException(\"Aborted\", \"AbortError\");\n }\n externalSignal.addEventListener(\"abort\", () => controller.abort(), {\n once: true,\n });\n }\n opts.signal = controller.signal;\n\n let response = await fetch(fullUrl, opts);\n clearTimeout(timeout);\n\n // Response interceptors\n for (const fn of _interceptors.response) {\n response = fn(response, fullUrl) || response;\n }\n\n if (!response.ok) {\n const errBody = await response.json().catch(() => ({}));\n const err = new Error(errBody.message || `HTTP ${response.status}`);\n err.status = response.status;\n err.body = errBody;\n throw err;\n }\n\n const text = await response.text();\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n } catch (e) {\n if (e.name === \"AbortError\") throw e; // Don't retry aborted requests\n lastError = e;\n if (attempt < maxRetries) {\n await new Promise((r) => setTimeout(r, _config.retryDelay || 1000));\n }\n }\n }\n throw lastError;\n}\n\nexport function _cacheGet(key, strategy) {\n if (strategy === \"none\") return null;\n if (strategy === \"memory\") {\n const entry = _cache.get(key);\n if (entry && Date.now() - entry.time < (_config.cache.ttl || 300000))\n return entry.data;\n return null;\n }\n const store =\n strategy === \"local\"\n ? localStorage\n : strategy === \"session\"\n ? sessionStorage\n : null;\n if (!store) return null;\n try {\n const raw = store.getItem(\"nojs_cache_\" + key);\n if (!raw) return null;\n const entry = JSON.parse(raw);\n if (Date.now() - entry.time < (_config.cache.ttl || 300000))\n return entry.data;\n store.removeItem(\"nojs_cache_\" + key);\n } catch {\n /* ignore */\n }\n return null;\n}\n\nexport function _cacheSet(key, data, strategy) {\n if (strategy === \"none\") return;\n const entry = { data, time: Date.now() };\n if (strategy === \"memory\") {\n _cache.set(key, entry);\n return;\n }\n const store =\n strategy === \"local\"\n ? localStorage\n : strategy === \"session\"\n ? sessionStorage\n : null;\n if (store) {\n try {\n store.setItem(\"nojs_cache_\" + key, JSON.stringify(entry));\n } catch {\n /* ignore */\n }\n }\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DOM HELPERS & REMOTE TEMPLATES\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _config, _log, _warn } from \"./globals.js\";\nimport { createContext } from \"./context.js\";\nimport { resolveUrl } from \"./fetch.js\";\n\n// \u2500\u2500\u2500 Template HTML cache: url \u2192 html string \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Avoids re-fetching the same .tpl file on repeat navigation.\n// Controlled by _config.templates.cache (default: true).\nexport const _templateHtmlCache = new Map();\n\nexport function findContext(el) {\n let node = el;\n while (node) {\n if (node.__ctx) return node.__ctx;\n node = node.parentElement;\n }\n return createContext();\n}\n\nexport function _clearDeclared(el) {\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_ELEMENT);\n while (walker.nextNode()) walker.currentNode.__declared = false;\n}\n\nexport function _cloneTemplate(id) {\n if (!id) return null;\n const cleanId = id.startsWith(\"#\") ? id.slice(1) : id;\n const tpl = document.getElementById(cleanId);\n if (!tpl) return null;\n return tpl.content ? tpl.content.cloneNode(true) : null;\n}\n\n// Simple HTML sanitizer\nexport function _sanitizeHtml(html) {\n if (!_config.sanitize) return html;\n const safe = html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/on\\w+\\s*=/gi, \"data-blocked=\")\n .replace(/javascript:/gi, \"\");\n return safe;\n}\n\n// Resolve a template src path.\n// - \"./foo.tpl\" \u2192 relative to the parent template's folder (__srcBase)\n// - \"/foo.tpl\" \u2192 absolute from server root (kept as-is for fetch)\n// - \"foo.tpl\" \u2192 relative to page URL (kept as-is for fetch)\nfunction _resolveTemplateSrc(src, tpl) {\n if (src.startsWith(\"./\")) {\n // Walk up to find the nearest ancestor with __srcBase\n let node = tpl.parentNode;\n while (node) {\n if (node.__srcBase) {\n return node.__srcBase + src.slice(2);\n }\n node = node.parentNode;\n }\n // No ancestor base found \u2014 strip \"./\" and let fetch resolve from page\n return src.slice(2);\n }\n // Absolute or plain relative \u2014 use the existing resolveUrl logic\n return resolveUrl(src, tpl);\n}\n\nexport async function _loadRemoteTemplates(root) {\n const scope = root || document;\n const templates = scope.querySelectorAll(\"template[src]\");\n _log(\"[LRT] called on\", scope === document ? \"document\" : scope.nodeName || \"fragment\", \"\u2014 found\", templates.length, \"template[src]\", [...templates].map(t => t.getAttribute(\"src\")));\n if (!templates.length) return;\n const promises = [...templates].map(async (tpl) => {\n if (tpl.__srcLoaded) { _log(\"[LRT] SKIP (already loaded):\", tpl.getAttribute(\"src\")); return; }\n tpl.__srcLoaded = true;\n const src = tpl.getAttribute(\"src\");\n const resolvedUrl = _resolveTemplateSrc(src, tpl);\n // Track the folder of this template so children can use \"./\" paths\n const baseFolder = resolvedUrl.substring(0, resolvedUrl.lastIndexOf(\"/\") + 1);\n try {\n const useCache = _config.templates.cache !== false;\n let html;\n if (useCache && _templateHtmlCache.has(resolvedUrl)) {\n html = _templateHtmlCache.get(resolvedUrl);\n _log(\"[LRT] CACHE HIT:\", resolvedUrl);\n } else {\n const res = await fetch(resolvedUrl);\n html = await res.text();\n if (useCache) _templateHtmlCache.set(resolvedUrl, html);\n }\n tpl.innerHTML = html;\n // Stamp the base folder onto the content so nested templates inherit it\n if (tpl.content) {\n tpl.content.__srcBase = baseFolder;\n }\n _log(\"Loaded remote template:\", src, \"\u2192\", resolvedUrl);\n // Recursively load nested remote templates\n await _loadRemoteTemplates(tpl.content || tpl);\n // Non-route templates are content-includes: replace them with\n // their loaded content so it actually renders (template elements\n // are inert \u2014 the browser never displays their .content).\n if (!tpl.hasAttribute(\"route\") && tpl.parentNode) {\n // Transfer __srcBase to a wrapper so descendants keep the reference\n const frag = tpl.content;\n const children = [...frag.childNodes];\n const parent = tpl.parentNode;\n const ref = tpl.nextSibling;\n parent.removeChild(tpl);\n for (const child of children) {\n if (child.nodeType === 1) child.__srcBase = child.__srcBase || baseFolder;\n parent.insertBefore(child, ref);\n }\n }\n } catch (e) {\n _warn(\"Failed to load template:\", src, e.message);\n }\n });\n await Promise.all(promises);\n}\n\n// \u2500\u2500\u2500 Single-element loader (core primitive) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nexport async function _loadTemplateElement(tpl) {\n const src = tpl.getAttribute(\"src\");\n if (tpl.__srcLoaded) { _log(\"[LTE] SKIP (already loaded):\", src); return; }\n _log(\"[LTE] START fetch:\", src, \"| route:\", tpl.hasAttribute(\"route\"), \"| inDOM:\", document.contains(tpl), \"| loading:\", tpl.getAttribute(\"loading\"));\n tpl.__srcLoaded = true;\n const resolvedUrl = _resolveTemplateSrc(src, tpl);\n const baseFolder = resolvedUrl.substring(0, resolvedUrl.lastIndexOf(\"/\") + 1);\n\n // Synchronously insert loading placeholder before the fetch begins\n let loadingMarker = null;\n const loadingId = tpl.getAttribute(\"loading\");\n if (loadingId && tpl.parentNode) {\n const cleanId = loadingId.startsWith(\"#\") ? loadingId.slice(1) : loadingId;\n const source = document.getElementById(cleanId);\n if (source && source.content) {\n loadingMarker = document.createElement(\"span\");\n loadingMarker.style.cssText = \"display:contents\";\n loadingMarker.appendChild(source.content.cloneNode(true));\n tpl.parentNode.insertBefore(loadingMarker, tpl);\n }\n }\n\n try {\n const useCache = _config.templates.cache !== false;\n let html;\n if (useCache && _templateHtmlCache.has(resolvedUrl)) {\n html = _templateHtmlCache.get(resolvedUrl);\n _log(\"[LTE] CACHE HIT:\", resolvedUrl);\n } else {\n const res = await fetch(resolvedUrl);\n html = await res.text();\n if (useCache) _templateHtmlCache.set(resolvedUrl, html);\n }\n tpl.innerHTML = html;\n if (tpl.content) {\n tpl.content.__srcBase = baseFolder;\n }\n _log(\"Loaded remote template:\", src, \"\u2192\", resolvedUrl);\n // Route templates: defer nested loading until after DOM insertion\n // (ensures loading=\"#id\" placeholder lookup via getElementById works).\n // Content-include templates: load nested ones now.\n if (!tpl.hasAttribute(\"route\")) {\n await _loadRemoteTemplates(tpl.content || tpl);\n }\n // Remove loading placeholder once real content is ready\n if (loadingMarker) loadingMarker.remove();\n // Non-route templates are content-includes: inject content inline\n if (!tpl.hasAttribute(\"route\") && tpl.parentNode) {\n const frag = tpl.content;\n const children = [...frag.childNodes];\n const parent = tpl.parentNode;\n const ref = tpl.nextSibling;\n parent.removeChild(tpl);\n for (const child of children) {\n if (child.nodeType === 1) child.__srcBase = child.__srcBase || baseFolder;\n parent.insertBefore(child, ref);\n }\n }\n } catch (e) {\n if (loadingMarker) loadingMarker.remove();\n _warn(\"Failed to load template:\", src, e.message);\n }\n}\n\n// \u2500\u2500\u2500 Inline template includes (template[include=\"id\"]) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Synchronously clones a named inline template into every\n// <template include=\"id\"> placeholder. Called before any async fetch\n// so skeleton/include content is stamped into the DOM immediately.\nexport function _processTemplateIncludes(root) {\n const scope = root || document;\n scope.querySelectorAll(\"template[include]\").forEach((tpl) => {\n const id = tpl.getAttribute(\"include\");\n const source = document.getElementById(id.startsWith(\"#\") ? id.slice(1) : id);\n if (!source || !source.content) return;\n tpl.replaceWith(source.content.cloneNode(true));\n });\n}\n\n// \u2500\u2500\u2500 Phase 1 loader (priority + eager non-route + active route) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nexport async function _loadRemoteTemplatesPhase1(defaultRoutePath) {\n const all = [...document.querySelectorAll(\"template[src]\")];\n\n // Phase 0: lazy=\"priority\" templates \u2014 load first, regardless of route type\n const phase0 = all.filter(\n (tpl) => !tpl.__srcLoaded && tpl.getAttribute(\"lazy\") === \"priority\"\n );\n await Promise.all(phase0.map(_loadTemplateElement));\n\n // Phase 1: non-route templates + the route matching defaultRoutePath\n // Skip lazy=\"ondemand\" and lazy=\"priority\" (already handled above)\n const phase1 = all.filter((tpl) => {\n if (tpl.__srcLoaded) return false;\n const lazy = tpl.getAttribute(\"lazy\");\n if (lazy === \"ondemand\" || lazy === \"priority\") return false;\n const isRoute = tpl.hasAttribute(\"route\");\n if (!isRoute) return true; // content-include: always Phase 1\n // Route template: only include if it matches the current default path\n return defaultRoutePath != null && tpl.getAttribute(\"route\") === defaultRoutePath;\n });\n await Promise.all(phase1.map(_loadTemplateElement));\n}\n\n// \u2500\u2500\u2500 Phase 2 loader (background preload of remaining route templates) \u2500\u2500\u2500\u2500\u2500\u2500\nexport function _loadRemoteTemplatesPhase2() {\n const all = [...document.querySelectorAll(\"template[src]\")];\n const phase2 = all.filter((tpl) => {\n if (tpl.__srcLoaded) return false;\n if (tpl.getAttribute(\"lazy\") === \"ondemand\") return false;\n return tpl.hasAttribute(\"route\");\n });\n return Promise.all(phase2.map(_loadTemplateElement));\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVE REGISTRY & DOM PROCESSING\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nconst _directives = new Map();\n\nexport function registerDirective(name, handler) {\n _directives.set(name, {\n priority: handler.priority ?? 50,\n init: handler.init,\n });\n}\n\nfunction _matchDirective(attrName) {\n if (_directives.has(attrName))\n return { directive: _directives.get(attrName), match: attrName };\n // Pattern matches\n const patterns = [\"class-*\", \"on:*\", \"style-*\", \"bind-*\"];\n for (const p of patterns) {\n const prefix = p.replace(\"*\", \"\");\n if (attrName.startsWith(prefix) && _directives.has(p)) {\n return { directive: _directives.get(p), match: p };\n }\n }\n return null;\n}\n\nexport function processElement(el) {\n if (el.__declared) return;\n el.__declared = true;\n\n const matched = [];\n for (const attr of [...el.attributes]) {\n const m = _matchDirective(attr.name);\n if (m) {\n matched.push({\n name: attr.name,\n value: attr.value,\n priority: m.directive.priority,\n init: m.directive.init,\n });\n }\n }\n\n matched.sort((a, b) => a.priority - b.priority);\n for (const m of matched) {\n m.init(el, m.name, m.value);\n }\n}\n\nexport function processTree(root) {\n if (!root) return;\n if (root.nodeType === 1 && !root.__declared) processElement(root);\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n while (walker.nextNode()) {\n const node = walker.currentNode;\n if (node.tagName === \"TEMPLATE\" || node.tagName === \"SCRIPT\") continue;\n if (!node.__declared) processElement(node);\n }\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// ANIMATIONS\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nlet _stylesInjected = false;\n\nfunction _injectBuiltInStyles() {\n if (_stylesInjected || typeof document === \"undefined\") return;\n _stylesInjected = true;\n\n const css = `\n@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n@keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } }\n@keyframes fadeInUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes fadeInDown { from { opacity: 0; transform: translateY(-20px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes fadeOutUp { from { opacity: 1; transform: translateY(0); } to { opacity: 0; transform: translateY(-20px); } }\n@keyframes fadeOutDown { from { opacity: 1; transform: translateY(0); } to { opacity: 0; transform: translateY(20px); } }\n@keyframes slideInLeft { from { transform: translateX(-100%); } to { transform: translateX(0); } }\n@keyframes slideInRight { from { transform: translateX(100%); } to { transform: translateX(0); } }\n@keyframes slideOutLeft { from { transform: translateX(0); } to { transform: translateX(-100%); } }\n@keyframes slideOutRight { from { transform: translateX(0); } to { transform: translateX(100%); } }\n@keyframes zoomIn { from { opacity: 0; transform: scale(0.5); } to { opacity: 1; transform: scale(1); } }\n@keyframes zoomOut { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(0.5); } }\n@keyframes bounceIn { 0% { opacity: 0; transform: scale(0.3); } 50% { opacity: 1; transform: scale(1.05); } 70% { transform: scale(0.9); } 100% { opacity: 1; transform: scale(1); } }\n@keyframes bounceOut { 0% { opacity: 1; transform: scale(1); } 20% { transform: scale(0.9); } 50%,55% { opacity: 1; transform: scale(1.1); } 100% { opacity: 0; transform: scale(0.3); } }\n`.trim();\n\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-nojs-animations\", \"\");\n style.textContent = css;\n document.head.appendChild(style);\n}\n\nexport function _animateIn(el, animName, transitionName, durationMs) {\n _injectBuiltInStyles();\n const fallback = durationMs || 1000;\n if (animName) {\n const target = el.firstElementChild || el;\n target.classList.add(animName);\n if (durationMs) target.style.animationDuration = durationMs + \"ms\";\n target.addEventListener(\n \"animationend\",\n () => target.classList.remove(animName),\n { once: true },\n );\n }\n if (transitionName) {\n const target = el.firstElementChild || el;\n target.classList.add(\n transitionName + \"-enter\",\n transitionName + \"-enter-active\",\n );\n requestAnimationFrame(() => {\n target.classList.remove(transitionName + \"-enter\");\n target.classList.add(transitionName + \"-enter-to\");\n const done = () => {\n target.classList.remove(\n transitionName + \"-enter-active\",\n transitionName + \"-enter-to\",\n );\n };\n target.addEventListener(\"transitionend\", done, { once: true });\n // Fallback\n setTimeout(done, fallback);\n });\n }\n}\n\nexport function _animateOut(el, animName, transitionName, callback, durationMs) {\n _injectBuiltInStyles();\n const fallback = durationMs || 2000;\n if (!el.firstElementChild && !el.childNodes.length) {\n callback();\n return;\n }\n if (animName) {\n const target = el.firstElementChild || el;\n target.classList.add(animName);\n if (durationMs) target.style.animationDuration = durationMs + \"ms\";\n target.addEventListener(\n \"animationend\",\n () => {\n target.classList.remove(animName);\n callback();\n },\n { once: true },\n );\n setTimeout(callback, fallback); // Fallback\n return;\n }\n if (transitionName) {\n const target = el.firstElementChild || el;\n target.classList.add(\n transitionName + \"-leave\",\n transitionName + \"-leave-active\",\n );\n requestAnimationFrame(() => {\n target.classList.remove(transitionName + \"-leave\");\n target.classList.add(transitionName + \"-leave-to\");\n const done = () => {\n target.classList.remove(\n transitionName + \"-leave-active\",\n transitionName + \"-leave-to\",\n );\n callback();\n };\n target.addEventListener(\"transitionend\", done, { once: true });\n setTimeout(done, fallback);\n });\n return;\n }\n callback();\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// CLIENT-SIDE ROUTER\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _config, _stores, _log } from \"./globals.js\";\nimport { createContext } from \"./context.js\";\nimport { evaluate } from \"./evaluate.js\";\nimport { findContext, _clearDeclared, _loadTemplateElement, _processTemplateIncludes } from \"./dom.js\";\nimport { processTree } from \"./registry.js\";\nimport { _animateIn } from \"./animations.js\";\n\nexport function _createRouter() {\n const routes = [];\n let current = { path: \"\", params: {}, query: {}, hash: \"\" };\n const listeners = new Set();\n\n function _getOrCreateEntry(path) {\n let entry = routes.find((r) => r.path === path);\n if (!entry) {\n entry = { path, outlets: {} };\n routes.push(entry);\n }\n return entry;\n }\n\n function parseQuery(search) {\n const params = {};\n new URLSearchParams(search).forEach((v, k) => {\n params[k] = v;\n });\n return params;\n }\n\n function matchRoute(path) {\n for (const route of routes) {\n const paramNames = [];\n const pattern = route.path.replace(/:(\\w+)/g, (_, name) => {\n paramNames.push(name);\n return \"([^/]+)\";\n });\n const regex = new RegExp(\"^\" + pattern + \"$\");\n const match = path.match(regex);\n if (match) {\n const params = {};\n paramNames.forEach((name, i) => {\n params[name] = match[i + 1];\n });\n return { route, params };\n }\n }\n return null;\n }\n\n async function navigate(path, replace = false) {\n const hashIdx = path.indexOf(\"#\");\n const hash = hashIdx >= 0 ? path.slice(hashIdx + 1) : \"\";\n const withoutHash = hashIdx >= 0 ? path.slice(0, hashIdx) : path;\n const [cleanPath, search = \"\"] = withoutHash.split(\"?\");\n\n current = {\n path: cleanPath,\n params: {},\n query: parseQuery(search),\n hash: hash ? \"#\" + hash : \"\",\n };\n\n const matched = matchRoute(cleanPath);\n if (matched) {\n current.params = matched.params;\n\n // Guard check\n const tpl = matched.route.outlets?.[\"default\"];\n const guardExpr = tpl?.getAttribute(\"guard\");\n const redirectPath = tpl?.getAttribute(\"redirect\");\n\n if (guardExpr) {\n const ctx = createContext({}, null);\n ctx.__raw.$store = _stores;\n ctx.__raw.$route = current;\n const allowed = evaluate(guardExpr, ctx);\n if (!allowed && redirectPath) {\n await navigate(redirectPath, true);\n return;\n }\n }\n }\n\n // Update URL\n if (_config.router.mode === \"hash\") {\n const newHash = \"#\" + path;\n if (replace) window.location.replace(newHash);\n else window.location.hash = path;\n } else {\n const fullPath = _config.router.base.replace(/\\/$/, \"\") + path;\n if (replace) window.history.replaceState({}, \"\", fullPath);\n else window.history.pushState({}, \"\", fullPath);\n }\n\n // Render\n await _renderRoute(matched);\n listeners.forEach((fn) => fn(current));\n\n // Scroll to anchor if hash is present (e.g. route=\"/docs#cheatsheet\")\n if (current.hash) {\n const anchorId = current.hash.slice(1);\n requestAnimationFrame(() => {\n const el = document.getElementById(anchorId);\n if (el) el.scrollIntoView({ behavior: \"smooth\" });\n });\n }\n }\n\n async function _renderRoute(matched) {\n const outletEls = document.querySelectorAll(\"[route-view]\");\n for (const outletEl of outletEls) {\n // Determine outlet name (\"\" or missing attribute value \u2192 \"default\")\n const outletAttr = outletEl.getAttribute(\"route-view\");\n const outletName = outletAttr && outletAttr.trim() !== \"\" ? outletAttr.trim() : \"default\";\n\n // Find the template for this outlet in the matched route\n const tpl = matched?.route?.outlets?.[outletName];\n\n // Always clear first\n outletEl.innerHTML = \"\";\n\n if (tpl) {\n // Load template on-demand if not yet fetched\n if (tpl.getAttribute(\"src\") && !tpl.__srcLoaded) {\n _log(\"Loading route template on demand:\", tpl.getAttribute(\"src\"));\n await _loadTemplateElement(tpl);\n }\n\n const clone = tpl.content.cloneNode(true);\n\n const routeCtx = createContext(\n { $route: current },\n findContext(outletEl),\n );\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = routeCtx;\n // Preserve __srcBase so nested ./relative template paths resolve correctly.\n // cloneNode() copies DOM nodes but NOT custom JS properties, so we must\n // re-stamp it on the wrapper element (which IS in the ancestor chain).\n if (tpl.content.__srcBase) wrapper.__srcBase = tpl.content.__srcBase;\n wrapper.appendChild(clone);\n // Insert into live DOM first so nested template loading has DOM access\n // (required for loading=\"#id\" skeleton placeholder lookups via getElementById)\n outletEl.appendChild(wrapper);\n\n // Process inline template includes synchronously (e.g. template[include])\n _processTemplateIncludes(wrapper);\n // Load each nested template individually via _loadTemplateElement so that:\n // 1. The loading=\"#id\" skeleton placeholder attribute is honoured\n // 2. getElementById can resolve the skeleton (wrapper is already in live DOM)\n // 3. No batch-recursion on a live DOM node (avoids re-entrant fetch loops)\n const nestedTpls = [...wrapper.querySelectorAll(\"template[src]\")];\n _log(\"[ROUTER] nested templates found in wrapper:\", nestedTpls.length, nestedTpls.map(t => t.getAttribute(\"src\") + (t.__srcLoaded ? \"[LOADED]\" : \"[NEW]\")));\n await Promise.all(nestedTpls.map(_loadTemplateElement));\n _log(\"[ROUTER] all nested loads done for route:\", current.path);\n\n const transition = outletEl.getAttribute(\"transition\");\n if (transition) _animateIn(wrapper, null, transition);\n\n _clearDeclared(wrapper);\n processTree(wrapper);\n }\n }\n\n // Update active classes\n document.querySelectorAll(\"[route]\").forEach((link) => {\n const routePath = link.getAttribute(\"route\");\n const activeClass = link.getAttribute(\"route-active\") || \"active\";\n const exactClass = link.getAttribute(\"route-active-exact\");\n\n if (exactClass) {\n link.classList.toggle(exactClass, current.path === routePath);\n } else if (activeClass && !link.hasAttribute(\"route-active-exact\")) {\n link.classList.toggle(\n activeClass,\n current.path.startsWith(routePath),\n );\n }\n });\n\n // Scroll behavior\n const scrollBehavior = _config.router.scrollBehavior;\n if (scrollBehavior === \"top\") {\n window.scrollTo(0, 0);\n } else if (scrollBehavior === \"smooth\") {\n window.scrollTo({ top: 0, behavior: \"smooth\" });\n }\n // \"preserve\" \u2014 do nothing, keep current scroll position\n }\n\n function _scrollToAnchor(id, el) {\n el.scrollIntoView({ behavior: \"smooth\" });\n\n // Update active class on anchor links that point to \"#<id>\"\n const selector = 'a[href=\"#' + id + '\"]';\n document.querySelectorAll('a[href^=\"#\"]').forEach((a) => {\n if (!a.hasAttribute(\"route\")) {\n a.classList.toggle(\"active\", a.matches(selector));\n }\n });\n }\n\n const router = {\n get current() {\n return current;\n },\n push(path) {\n return navigate(path);\n },\n replace(path) {\n return navigate(path, true);\n },\n back() {\n window.history.back();\n },\n forward() {\n window.history.forward();\n },\n on(fn) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n },\n register(path, templateEl, outlet = \"default\") {\n const entry = _getOrCreateEntry(path);\n entry.outlets[outlet] = templateEl;\n },\n async init() {\n // Collect route templates\n document.querySelectorAll(\"template[route]\").forEach((tpl) => {\n const path = tpl.getAttribute(\"route\");\n const outlet = tpl.getAttribute(\"outlet\") || \"default\";\n const entry = _getOrCreateEntry(path);\n entry.outlets[outlet] = tpl;\n });\n\n // Bind route links\n document.addEventListener(\"click\", (e) => {\n const link = e.target.closest(\"[route]\");\n if (link && !link.hasAttribute(\"route-view\")) {\n e.preventDefault();\n const path = link.getAttribute(\"route\");\n navigate(path);\n return;\n }\n\n // In hash mode, intercept plain anchor links (href=\"#id\") so they\n // scroll to the target element instead of conflicting with the router.\n if (_config.router.mode === \"hash\") {\n const anchor = e.target.closest('a[href^=\"#\"]');\n if (anchor && !anchor.hasAttribute(\"route\")) {\n const href = anchor.getAttribute(\"href\");\n const id = href.slice(1);\n if (id && !id.startsWith(\"/\")) {\n const target = document.getElementById(id);\n if (target) {\n e.preventDefault();\n _scrollToAnchor(id, target);\n }\n }\n }\n }\n });\n\n // Listen for URL changes\n if (_config.router.mode === \"hash\") {\n window.addEventListener(\"hashchange\", () => {\n const raw = window.location.hash.slice(1) || \"/\";\n if (!raw.startsWith(\"/\")) {\n const el = document.getElementById(raw);\n if (el) {\n _scrollToAnchor(raw, el);\n window.history.replaceState(null, \"\", \"#\" + current.path);\n }\n return;\n }\n navigate(raw, true);\n });\n // Initial route\n const path = window.location.hash.slice(1) || \"/\";\n await navigate(path, true);\n } else {\n window.addEventListener(\"popstate\", () => {\n const path =\n window.location.pathname.replace(_config.router.base, \"\") || \"/\";\n navigate(path, true);\n });\n const path =\n window.location.pathname.replace(_config.router.base, \"\") || \"/\";\n await navigate(path, true);\n }\n },\n };\n\n return router;\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// BUILT-IN FILTERS\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _filters } from \"./globals.js\";\n\n// Text\n_filters.uppercase = (v) => String(v ?? \"\").toUpperCase();\n_filters.lowercase = (v) => String(v ?? \"\").toLowerCase();\n_filters.capitalize = (v) =>\n String(v ?? \"\").replace(/\\b\\w/g, (c) => c.toUpperCase());\n_filters.truncate = (v, len = 100) => {\n const s = String(v ?? \"\");\n return s.length > len ? s.slice(0, len) + \"...\" : s;\n};\n_filters.trim = (v) => String(v ?? \"\").trim();\n_filters.stripHtml = (v) => String(v ?? \"\").replace(/<[^>]*>/g, \"\");\n_filters.slugify = (v) =>\n String(v ?? \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n_filters.nl2br = (v) => String(v ?? \"\").replace(/\\n/g, \"<br>\");\n_filters.encodeUri = (v) => encodeURIComponent(String(v ?? \"\"));\n\n// Numbers\n_filters.number = (v, decimals = 0) => {\n const n = Number(v);\n if (isNaN(n)) return v;\n return n.toLocaleString(undefined, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n};\n_filters.currency = (v, code = \"USD\") => {\n const n = Number(v);\n if (isNaN(n)) return v;\n try {\n return n.toLocaleString(undefined, { style: \"currency\", currency: code });\n } catch {\n return `${code} ${n.toFixed(2)}`;\n }\n};\n_filters.percent = (v, decimals = 0) => {\n const n = Number(v);\n if (isNaN(n)) return v;\n return (n * 100).toFixed(decimals) + \"%\";\n};\n_filters.filesize = (v) => {\n const n = Number(v);\n if (isNaN(n)) return v;\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n let i = 0;\n let size = n;\n while (size >= 1024 && i < units.length - 1) {\n size /= 1024;\n i++;\n }\n return size.toFixed(i > 0 ? 1 : 0) + \" \" + units[i];\n};\n_filters.ordinal = (v) => {\n const n = Number(v);\n if (isNaN(n)) return v;\n const s = [\"th\", \"st\", \"nd\", \"rd\"];\n const mod = n % 100;\n return n + (s[(mod - 20) % 10] || s[mod] || s[0]);\n};\n\n// Arrays\n_filters.count = (v) => (Array.isArray(v) ? v.length : 0);\n_filters.first = (v) => (Array.isArray(v) ? v[0] : v);\n_filters.last = (v) => (Array.isArray(v) ? v[v.length - 1] : v);\n_filters.join = (v, sep = \", \") => (Array.isArray(v) ? v.join(sep) : v);\n_filters.reverse = (v) => (Array.isArray(v) ? [...v].reverse() : v);\n_filters.unique = (v) => (Array.isArray(v) ? [...new Set(v)] : v);\n_filters.pluck = (v, key) => (Array.isArray(v) ? v.map((i) => i?.[key]) : v);\n_filters.sortBy = (v, key) => {\n if (!Array.isArray(v)) return v;\n const desc = key?.startsWith(\"-\");\n const k = desc ? key.slice(1) : key;\n return [...v].sort((a, b) => {\n const va = a?.[k],\n vb = b?.[k];\n const r = va < vb ? -1 : va > vb ? 1 : 0;\n return desc ? -r : r;\n });\n};\n_filters.where = (v, key, val) =>\n Array.isArray(v) ? v.filter((i) => i?.[key] === val) : v;\n\n// Date\n_filters.date = (v, fmt = \"short\") => {\n const d = new Date(v);\n if (isNaN(d)) return v;\n const opts =\n fmt === \"long\"\n ? { dateStyle: \"long\" }\n : fmt === \"full\"\n ? { dateStyle: \"full\" }\n : { dateStyle: \"short\" };\n return d.toLocaleDateString(undefined, opts);\n};\n_filters.datetime = (v) => {\n const d = new Date(v);\n if (isNaN(d)) return v;\n return d.toLocaleString();\n};\n_filters.relative = (v) => {\n const d = new Date(v);\n if (isNaN(d)) return v;\n const diff = (Date.now() - d.getTime()) / 1000;\n if (diff < 60) return \"just now\";\n if (diff < 3600) return Math.floor(diff / 60) + \"m ago\";\n if (diff < 86400) return Math.floor(diff / 3600) + \"h ago\";\n if (diff < 2592000) return Math.floor(diff / 86400) + \"d ago\";\n return d.toLocaleDateString();\n};\n_filters.fromNow = (v) => {\n const d = new Date(v);\n if (isNaN(d)) return v;\n const diff = (d.getTime() - Date.now()) / 1000;\n if (diff < 0) return _filters.relative(v);\n if (diff < 60) return \"in a moment\";\n if (diff < 3600) return \"in \" + Math.floor(diff / 60) + \"m\";\n if (diff < 86400) return \"in \" + Math.floor(diff / 3600) + \"h\";\n return \"in \" + Math.floor(diff / 86400) + \"d\";\n};\n\n// Utility\n_filters.default = (v, def = \"\") => (v == null || v === \"\" ? def : v);\n_filters.json = (v, indent = 2) => JSON.stringify(v, null, indent);\n_filters.debug = (v) => {\n console.log(\"[No.JS debug]\", v);\n return v;\n};\n_filters.keys = (v) => (v && typeof v === \"object\" ? Object.keys(v) : []);\n_filters.values = (v) => (v && typeof v === \"object\" ? Object.values(v) : []);\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: state, store, computed, watch\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _stores, _log } from \"../globals.js\";\nimport { createContext } from \"../context.js\";\nimport { evaluate, _execStatement } from \"../evaluate.js\";\nimport { findContext } from \"../dom.js\";\nimport { registerDirective } from \"../registry.js\";\n\nregisterDirective(\"state\", {\n priority: 0,\n init(el, name, value) {\n const data = evaluate(value, createContext()) || {};\n const parent = el.parentElement ? findContext(el.parentElement) : null;\n const ctx = createContext(data, parent);\n el.__ctx = ctx;\n\n // Persistence\n const persist = el.getAttribute(\"persist\");\n const persistKey = el.getAttribute(\"persist-key\");\n if (persist && persistKey) {\n const store =\n persist === \"localStorage\"\n ? localStorage\n : persist === \"sessionStorage\"\n ? sessionStorage\n : null;\n if (store) {\n try {\n const saved = store.getItem(\"nojs_state_\" + persistKey);\n if (saved) {\n const parsed = JSON.parse(saved);\n for (const [k, v] of Object.entries(parsed)) ctx.$set(k, v);\n }\n } catch {\n /* ignore */\n }\n ctx.$watch(() => {\n try {\n store.setItem(\n \"nojs_state_\" + persistKey,\n JSON.stringify(ctx.__raw),\n );\n } catch {\n /* ignore */\n }\n });\n }\n }\n\n _log(\"state\", data);\n },\n});\n\nregisterDirective(\"store\", {\n priority: 0,\n init(el, name, storeName) {\n const valueAttr = el.getAttribute(\"value\");\n if (!storeName) return;\n if (!_stores[storeName]) {\n const data = valueAttr\n ? evaluate(valueAttr, createContext()) || {}\n : {};\n _stores[storeName] = createContext(data);\n }\n _log(\"store\", storeName);\n },\n});\n\nregisterDirective(\"computed\", {\n priority: 2,\n init(el, name, computedName) {\n const expr = el.getAttribute(\"expr\");\n if (!computedName || !expr) return;\n const ctx = findContext(el);\n function update() {\n const val = evaluate(expr, ctx);\n ctx.$set(computedName, val);\n }\n ctx.$watch(update);\n update();\n },\n});\n\nregisterDirective(\"watch\", {\n priority: 2,\n init(el, name, watchExpr) {\n const ctx = findContext(el);\n const onChange = el.getAttribute(\"on:change\");\n let lastVal = evaluate(watchExpr, ctx);\n ctx.$watch(() => {\n const newVal = evaluate(watchExpr, ctx);\n if (newVal !== lastVal) {\n const oldVal = lastVal;\n lastVal = newVal;\n if (onChange)\n _execStatement(onChange, ctx, { $old: oldVal, $new: newVal });\n }\n });\n },\n});\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: get, post, put, patch, delete\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport {\n _config,\n _log,\n _warn,\n _stores,\n _notifyStoreWatchers,\n _emitEvent,\n _routerInstance,\n} from \"../globals.js\";\nimport { createContext } from \"../context.js\";\nimport { evaluate, _execStatement, _interpolate } from \"../evaluate.js\";\nimport { _doFetch, _cacheGet, _cacheSet } from \"../fetch.js\";\nimport { findContext, _clearDeclared, _cloneTemplate } from \"../dom.js\";\nimport { registerDirective, processTree } from \"../registry.js\";\n\nconst HTTP_METHODS = [\"get\", \"post\", \"put\", \"patch\", \"delete\"];\n\nfor (const method of HTTP_METHODS) {\n registerDirective(method, {\n priority: 1,\n init(el, name, url) {\n const asKey = el.getAttribute(\"as\") || \"data\";\n const loadingTpl = el.getAttribute(\"loading\");\n const errorTpl = el.getAttribute(\"error\");\n const emptyTpl = el.getAttribute(\"empty\");\n const successTpl = el.getAttribute(\"success\");\n const thenExpr = el.getAttribute(\"then\");\n const redirectPath = el.getAttribute(\"redirect\");\n const confirmMsg = el.getAttribute(\"confirm\");\n const refreshInterval = parseInt(el.getAttribute(\"refresh\")) || 0;\n const cachedRaw = el.getAttribute(\"cached\");\n const cacheStrategy = el.hasAttribute(\"cached\")\n ? cachedRaw || \"memory\"\n : \"none\";\n const bodyAttr = el.getAttribute(\"body\");\n const headersAttr = el.getAttribute(\"headers\");\n const varName = el.getAttribute(\"var\");\n const intoStore = el.getAttribute(\"into\");\n const retryCount =\n parseInt(el.getAttribute(\"retry\")) || _config.retries;\n const retryDelay =\n parseInt(el.getAttribute(\"retry-delay\")) || _config.retryDelay || 1000;\n const paramsAttr = el.getAttribute(\"params\");\n\n const parentCtx = el.parentElement\n ? findContext(el.parentElement)\n : createContext();\n const ctx = el.__ctx || createContext({}, parentCtx);\n el.__ctx = ctx;\n\n const originalChildren = [...el.childNodes].map((n) =>\n n.cloneNode(true),\n );\n\n let _activeAbort = null;\n\n async function doRequest() {\n // SwitchMap: abort previous in-flight request\n if (_activeAbort) _activeAbort.abort();\n _activeAbort = new AbortController();\n\n // Confirmation\n if (confirmMsg && !window.confirm(confirmMsg)) return;\n\n let resolvedUrl = _interpolate(url, ctx);\n\n // Append query params\n if (paramsAttr) {\n const paramsObj = evaluate(paramsAttr, ctx);\n if (paramsObj && typeof paramsObj === \"object\") {\n const sep = resolvedUrl.includes(\"?\") ? \"&\" : \"?\";\n const qs = new URLSearchParams(paramsObj).toString();\n if (qs) resolvedUrl += sep + qs;\n }\n }\n\n const cacheKey = method + \":\" + resolvedUrl;\n\n // Check cache\n if (method === \"get\") {\n const cached = _cacheGet(cacheKey, cacheStrategy);\n if (cached != null) {\n ctx.$set(asKey, cached);\n _clearDeclared(el);\n processTree(el);\n return;\n }\n }\n\n // Show loading\n if (loadingTpl) {\n const clone = _cloneTemplate(loadingTpl);\n if (clone) {\n el.innerHTML = \"\";\n el.appendChild(clone);\n processTree(el);\n }\n }\n\n try {\n let reqBody = null;\n if (bodyAttr) {\n const interpolated = _interpolate(bodyAttr, ctx);\n try {\n reqBody = JSON.parse(interpolated);\n } catch {\n reqBody = interpolated;\n }\n }\n\n // For forms, collect form data\n if (el.tagName === \"FORM\") {\n const formData = new FormData(el);\n reqBody = Object.fromEntries(formData.entries());\n }\n\n const extraHeaders = headersAttr ? JSON.parse(headersAttr) : {};\n const savedRetries = _config.retries;\n const savedRetryDelay = _config.retryDelay;\n _config.retries = retryCount;\n _config.retryDelay = retryDelay;\n const data = await _doFetch(\n resolvedUrl,\n method,\n reqBody,\n extraHeaders,\n el,\n _activeAbort.signal,\n );\n _config.retries = savedRetries;\n _config.retryDelay = savedRetryDelay;\n\n // Cache response\n if (method === \"get\") _cacheSet(cacheKey, data, cacheStrategy);\n\n // Check empty\n if (\n emptyTpl &&\n (data == null || (Array.isArray(data) && data.length === 0))\n ) {\n const clone = _cloneTemplate(emptyTpl);\n if (clone) {\n el.innerHTML = \"\";\n el.appendChild(clone);\n processTree(el);\n }\n return;\n }\n\n ctx.$set(asKey, data);\n\n // Write to global store if into attribute is present\n if (intoStore) {\n if (!_stores[intoStore]) _stores[intoStore] = createContext({});\n _stores[intoStore].$set(asKey, data);\n _notifyStoreWatchers();\n }\n\n // Success template\n if (successTpl) {\n const clone = _cloneTemplate(successTpl);\n if (clone) {\n el.innerHTML = \"\";\n // Inject var\n const tplEl = document.getElementById(\n successTpl.replace(\"#\", \"\"),\n );\n const vn = tplEl?.getAttribute(\"var\") || varName || \"result\";\n const childCtx = createContext({ [vn]: data }, ctx);\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = childCtx;\n wrapper.appendChild(clone);\n el.appendChild(wrapper);\n processTree(wrapper);\n }\n } else {\n // Restore original children and re-process\n el.innerHTML = \"\";\n for (const child of originalChildren)\n el.appendChild(child.cloneNode(true));\n _clearDeclared(el);\n processTree(el);\n }\n\n // Then expression\n if (thenExpr) _execStatement(thenExpr, ctx, { result: data });\n\n // Redirect\n if (redirectPath && _routerInstance)\n _routerInstance.push(redirectPath);\n\n _emitEvent(\"fetch:success\", { url: resolvedUrl, data });\n } catch (err) {\n // SwitchMap: silently ignore aborted requests\n if (err.name === \"AbortError\") return;\n\n _warn(\n `${method.toUpperCase()} ${resolvedUrl} failed:`,\n err.message,\n );\n _emitEvent(\"fetch:error\", { url: resolvedUrl, error: err });\n _emitEvent(\"error\", { url: resolvedUrl, error: err });\n\n if (errorTpl) {\n const clone = _cloneTemplate(errorTpl);\n if (clone) {\n el.innerHTML = \"\";\n const tplEl = document.getElementById(\n errorTpl.replace(\"#\", \"\"),\n );\n const vn = tplEl?.getAttribute(\"var\") || \"err\";\n const childCtx = createContext(\n {\n [vn]: {\n message: err.message,\n status: err.status,\n body: err.body,\n },\n },\n ctx,\n );\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = childCtx;\n wrapper.appendChild(clone);\n el.appendChild(wrapper);\n processTree(wrapper);\n }\n }\n }\n }\n\n // For forms, intercept submit\n if (el.tagName === \"FORM\" && method !== \"get\") {\n el.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n doRequest();\n });\n } else if (method === \"get\") {\n doRequest();\n } else {\n // Non-GET on non-FORM: attach click listener\n el.addEventListener(\"click\", (e) => {\n e.preventDefault();\n doRequest();\n });\n }\n\n // Reactive URL watching: re-fetch when {expressions} in URL change\n const hasInterpolation = /\\{[^}]+\\}/.test(url);\n if (hasInterpolation) {\n const debounceMs = parseInt(el.getAttribute(\"debounce\")) || 0;\n let _lastResolvedUrl = _interpolate(url, ctx);\n let _debounceTimer = null;\n\n function onAncestorChange() {\n const newUrl = _interpolate(url, ctx);\n if (newUrl !== _lastResolvedUrl) {\n _lastResolvedUrl = newUrl;\n if (_debounceTimer) clearTimeout(_debounceTimer);\n if (debounceMs > 0) {\n _debounceTimer = setTimeout(doRequest, debounceMs);\n } else {\n doRequest();\n }\n }\n }\n\n // Watch all ancestor contexts for changes\n let ancestor = parentCtx;\n while (ancestor && ancestor.__isProxy) {\n ancestor.$watch(onAncestorChange);\n ancestor = ancestor.$parent;\n }\n }\n\n // Polling\n if (refreshInterval > 0) {\n setInterval(doRequest, refreshInterval);\n }\n },\n });\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: bind, bind-html, bind-*, model\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _watchExpr } from \"../globals.js\";\nimport { evaluate, _execStatement } from \"../evaluate.js\";\nimport { findContext, _sanitizeHtml } from \"../dom.js\";\nimport { registerDirective } from \"../registry.js\";\n\nregisterDirective(\"bind\", {\n priority: 20,\n init(el, name, expr) {\n const ctx = findContext(el);\n function update() {\n const val = evaluate(expr, ctx);\n el.textContent = (val !== undefined && val !== null) ? String(val) : '';\n }\n _watchExpr(expr, ctx, update);\n update();\n },\n});\n\nregisterDirective(\"bind-html\", {\n priority: 20,\n init(el, name, expr) {\n const ctx = findContext(el);\n function update() {\n const val = evaluate(expr, ctx);\n if (val != null) el.innerHTML = _sanitizeHtml(String(val));\n }\n _watchExpr(expr, ctx, update);\n update();\n },\n});\n\nregisterDirective(\"bind-*\", {\n priority: 20,\n init(el, name, expr) {\n const attrName = name.replace(\"bind-\", \"\");\n const ctx = findContext(el);\n\n // Two-way binding for value\n if (\n attrName === \"value\" &&\n (el.tagName === \"INPUT\" ||\n el.tagName === \"TEXTAREA\" ||\n el.tagName === \"SELECT\")\n ) {\n el.addEventListener(\"input\", () => {\n const val = el.type === \"number\" ? Number(el.value) : el.value;\n _execStatement(`${expr} = ${JSON.stringify(val)}`, ctx);\n });\n }\n\n function update() {\n const val = evaluate(expr, ctx);\n // Boolean attributes\n if (\n [\n \"disabled\",\n \"readonly\",\n \"checked\",\n \"selected\",\n \"hidden\",\n \"required\",\n ].includes(attrName)\n ) {\n if (val) el.setAttribute(attrName, \"\");\n else el.removeAttribute(attrName);\n if (attrName in el) el[attrName] = !!val;\n return;\n }\n if (val != null) el.setAttribute(attrName, String(val));\n else el.removeAttribute(attrName);\n }\n _watchExpr(expr, ctx, update);\n update();\n },\n});\n\nregisterDirective(\"model\", {\n priority: 20,\n init(el, name, expr) {\n const ctx = findContext(el);\n const tag = el.tagName;\n const type = el.type;\n\n // Model \u2192 DOM\n function update() {\n const val = evaluate(expr, ctx);\n if (tag === \"INPUT\" && type === \"checkbox\") {\n el.checked = !!val;\n } else if (tag === \"INPUT\" && type === \"radio\") {\n el.checked = el.value === String(val);\n } else if (tag === \"SELECT\") {\n el.value = val != null ? String(val) : \"\";\n } else {\n el.value = val != null ? String(val) : \"\";\n }\n }\n\n // DOM \u2192 Model\n const event =\n tag === \"SELECT\" || type === \"checkbox\" || type === \"radio\"\n ? \"change\"\n : \"input\";\n el.addEventListener(event, () => {\n let val;\n if (type === \"checkbox\") val = el.checked;\n else if (type === \"number\" || type === \"range\") val = Number(el.value);\n else val = el.value;\n _execStatement(`${expr} = __val`, ctx, { __val: val });\n });\n\n ctx.$watch(update);\n update();\n },\n});\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: if, else-if, else, show, hide, switch\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _watchExpr } from \"../globals.js\";\nimport { evaluate } from \"../evaluate.js\";\nimport { findContext, _clearDeclared, _cloneTemplate } from \"../dom.js\";\nimport { registerDirective, processTree } from \"../registry.js\";\nimport { _animateIn, _animateOut } from \"../animations.js\";\n\nregisterDirective(\"if\", {\n priority: 10,\n init(el, name, expr) {\n const ctx = findContext(el);\n const thenId = el.getAttribute(\"then\");\n const elseId = el.getAttribute(\"else\");\n const animEnter =\n el.getAttribute(\"animate-enter\") || el.getAttribute(\"animate\");\n const animLeave = el.getAttribute(\"animate-leave\");\n const transition = el.getAttribute(\"transition\");\n const animDuration = parseInt(el.getAttribute(\"animate-duration\")) || 0;\n const originalChildren = [...el.childNodes].map((n) => n.cloneNode(true));\n let currentState = undefined;\n\n function update() {\n const result = !!evaluate(expr, ctx);\n if (result === currentState) return;\n currentState = result;\n\n // Animation leave\n if (animLeave || transition) {\n _animateOut(el, animLeave, transition, () => render(result), animDuration);\n } else {\n render(result);\n }\n }\n\n function render(result) {\n if (result) {\n if (thenId) {\n const clone = _cloneTemplate(thenId);\n if (clone) {\n el.innerHTML = \"\";\n el.appendChild(clone);\n }\n } else {\n el.innerHTML = \"\";\n for (const child of originalChildren)\n el.appendChild(child.cloneNode(true));\n }\n } else {\n if (elseId) {\n const clone = _cloneTemplate(elseId);\n if (clone) {\n el.innerHTML = \"\";\n el.appendChild(clone);\n }\n } else if (thenId) {\n el.innerHTML = \"\";\n } else {\n el.innerHTML = \"\";\n }\n }\n\n _clearDeclared(el);\n processTree(el);\n\n // Animation enter\n if (animEnter || transition) {\n _animateIn(el, animEnter, transition, animDuration);\n }\n }\n\n ctx.$watch(update);\n update();\n },\n});\n\nregisterDirective(\"else-if\", {\n priority: 10,\n init(el, name, expr) {\n // Works like `if` but checks previous sibling's condition\n const ctx = findContext(el);\n const thenId = el.getAttribute(\"then\");\n const originalChildren = [...el.childNodes].map((n) => n.cloneNode(true));\n\n function update() {\n // Check if any preceding if/else-if was true\n let prev = el.previousElementSibling;\n while (prev) {\n const prevExpr =\n prev.getAttribute(\"if\") || prev.getAttribute(\"else-if\");\n if (prevExpr) {\n if (evaluate(prevExpr, ctx)) {\n el.innerHTML = \"\";\n el.style.display = \"none\";\n return;\n }\n } else break;\n prev = prev.previousElementSibling;\n }\n\n const result = !!evaluate(expr, ctx);\n el.style.display = \"\";\n if (result) {\n if (thenId) {\n const clone = _cloneTemplate(thenId);\n if (clone) {\n el.innerHTML = \"\";\n el.appendChild(clone);\n }\n } else {\n el.innerHTML = \"\";\n for (const child of originalChildren)\n el.appendChild(child.cloneNode(true));\n }\n _clearDeclared(el);\n processTree(el);\n } else {\n el.innerHTML = \"\";\n }\n }\n ctx.$watch(update);\n update();\n },\n});\n\nregisterDirective(\"else\", {\n priority: 10,\n init(el) {\n // Skip if this element also has an \"if\" directive (else is used as an attribute of if)\n if (el.hasAttribute(\"if\")) return;\n const ctx = findContext(el);\n const thenId = el.getAttribute(\"then\");\n const originalChildren = [...el.childNodes].map((n) => n.cloneNode(true));\n\n function update() {\n // Check if any preceding if/else-if was true\n let prev = el.previousElementSibling;\n while (prev) {\n const prevExpr =\n prev.getAttribute(\"if\") || prev.getAttribute(\"else-if\");\n if (prevExpr) {\n if (evaluate(prevExpr, ctx)) {\n el.innerHTML = \"\";\n el.style.display = \"none\";\n return;\n }\n } else break;\n prev = prev.previousElementSibling;\n }\n\n // No preceding condition was true \u2014 show else content\n el.style.display = \"\";\n if (thenId) {\n const clone = _cloneTemplate(thenId);\n if (clone) {\n el.innerHTML = \"\";\n el.appendChild(clone);\n }\n } else {\n el.innerHTML = \"\";\n for (const child of originalChildren)\n el.appendChild(child.cloneNode(true));\n }\n _clearDeclared(el);\n processTree(el);\n }\n ctx.$watch(update);\n update();\n },\n});\n\nregisterDirective(\"show\", {\n priority: 20,\n init(el, name, expr) {\n const ctx = findContext(el);\n const animEnter = el.getAttribute(\"animate-enter\") || el.getAttribute(\"animate\");\n const animLeave = el.getAttribute(\"animate-leave\");\n const transition = el.getAttribute(\"transition\");\n const animDuration = parseInt(el.getAttribute(\"animate-duration\")) || 0;\n let currentState = undefined;\n\n function update() {\n const result = !!evaluate(expr, ctx);\n if (result === currentState) return;\n currentState = result;\n\n if (result) {\n el.style.display = \"\";\n if (animEnter || transition) _animateIn(el, animEnter, transition, animDuration);\n } else {\n if (animLeave || transition) {\n _animateOut(el, animLeave, transition, () => { el.style.display = \"none\"; }, animDuration);\n } else {\n el.style.display = \"none\";\n }\n }\n }\n _watchExpr(expr, ctx, update);\n update();\n },\n});\n\nregisterDirective(\"hide\", {\n priority: 20,\n init(el, name, expr) {\n const ctx = findContext(el);\n const animEnter = el.getAttribute(\"animate-enter\") || el.getAttribute(\"animate\");\n const animLeave = el.getAttribute(\"animate-leave\");\n const transition = el.getAttribute(\"transition\");\n const animDuration = parseInt(el.getAttribute(\"animate-duration\")) || 0;\n let currentState = undefined;\n\n function update() {\n const result = !evaluate(expr, ctx);\n if (result === currentState) return;\n currentState = result;\n\n if (result) {\n el.style.display = \"\";\n if (animEnter || transition) _animateIn(el, animEnter, transition, animDuration);\n } else {\n if (animLeave || transition) {\n _animateOut(el, animLeave, transition, () => { el.style.display = \"none\"; }, animDuration);\n } else {\n el.style.display = \"none\";\n }\n }\n }\n _watchExpr(expr, ctx, update);\n update();\n },\n});\n\nregisterDirective(\"switch\", {\n priority: 10,\n init(el, name, expr) {\n const ctx = findContext(el);\n\n function update() {\n const val = evaluate(expr, ctx);\n let matched = false;\n\n for (const child of [...el.children]) {\n const caseVal = child.getAttribute(\"case\");\n const isDefault = child.hasAttribute(\"default\");\n const thenTpl = child.getAttribute(\"then\");\n\n if (caseVal) {\n // Support multi-value: case=\"'a','b'\"\n const values = caseVal\n .split(\",\")\n .map((v) => evaluate(v.trim(), ctx));\n if (!matched && values.includes(val)) {\n matched = true;\n child.style.display = \"\";\n if (thenTpl) {\n const clone = _cloneTemplate(thenTpl);\n if (clone) {\n child.innerHTML = \"\";\n child.appendChild(clone);\n }\n child.__declared = false;\n processTree(child);\n }\n } else {\n child.style.display = \"none\";\n }\n } else if (isDefault) {\n child.style.display = matched ? \"none\" : \"\";\n if (!matched && thenTpl) {\n const clone = _cloneTemplate(thenTpl);\n if (clone) {\n child.innerHTML = \"\";\n child.appendChild(clone);\n }\n child.__declared = false;\n processTree(child);\n }\n }\n }\n }\n\n ctx.$watch(update);\n update();\n },\n});\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: each, foreach\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { createContext } from \"../context.js\";\nimport { evaluate, resolve } from \"../evaluate.js\";\nimport { findContext, _cloneTemplate } from \"../dom.js\";\nimport { registerDirective, processTree } from \"../registry.js\";\nimport { _animateOut } from \"../animations.js\";\n\nregisterDirective(\"each\", {\n priority: 10,\n init(el, name, expr) {\n const ctx = findContext(el);\n const match = expr.match(/^(\\w+)\\s+in\\s+(\\S+)$/);\n if (!match) return;\n const [, itemName, listPath] = match;\n const tplId = el.getAttribute(\"template\");\n const elseTpl = el.getAttribute(\"else\");\n const keyExpr = el.getAttribute(\"key\");\n const animEnter =\n el.getAttribute(\"animate-enter\") || el.getAttribute(\"animate\");\n const animLeave = el.getAttribute(\"animate-leave\");\n const stagger = parseInt(el.getAttribute(\"animate-stagger\")) || 0;\n const animDuration = parseInt(el.getAttribute(\"animate-duration\")) || 0;\n\n function update() {\n let list = resolve(listPath, ctx);\n if (!Array.isArray(list)) return;\n\n // Empty state\n if (list.length === 0 && elseTpl) {\n const clone = _cloneTemplate(elseTpl);\n if (clone) {\n el.innerHTML = \"\";\n el.appendChild(clone);\n processTree(el);\n }\n return;\n }\n\n const tpl = tplId ? document.getElementById(tplId) : null;\n if (!tpl) return;\n\n // Animate out old items if animate-leave is set\n if (animLeave && el.children.length > 0) {\n const oldItems = [...el.children];\n let remaining = oldItems.length;\n oldItems.forEach((child) => {\n const target = child.firstElementChild || child;\n target.classList.add(animLeave);\n const done = () => {\n target.classList.remove(animLeave);\n remaining--;\n if (remaining <= 0) renderItems(tpl, list);\n };\n target.addEventListener(\"animationend\", done, { once: true });\n setTimeout(done, animDuration || 2000);\n });\n } else {\n renderItems(tpl, list);\n }\n }\n\n function renderItems(tpl, list) {\n const count = list.length;\n el.innerHTML = \"\";\n\n list.forEach((item, i) => {\n const childData = {\n [itemName]: item,\n $index: i,\n $count: count,\n $first: i === 0,\n $last: i === count - 1,\n $even: i % 2 === 0,\n $odd: i % 2 !== 0,\n };\n const childCtx = createContext(childData, ctx);\n\n const clone = tpl.content.cloneNode(true);\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = childCtx;\n wrapper.appendChild(clone);\n el.appendChild(wrapper);\n processTree(wrapper);\n\n if (animEnter) {\n const firstChild = wrapper.firstElementChild;\n if (firstChild) {\n firstChild.classList.add(animEnter);\n // Stagger animation \u2014 delay must be on the child, not the wrapper\n if (stagger) {\n firstChild.style.animationDelay = i * stagger + \"ms\";\n }\n }\n }\n });\n }\n\n ctx.$watch(update);\n update();\n },\n});\n\nregisterDirective(\"foreach\", {\n priority: 10,\n init(el, name, itemName) {\n const ctx = findContext(el);\n const fromPath = el.getAttribute(\"from\");\n const indexName = el.getAttribute(\"index\") || \"$index\";\n const elseTpl = el.getAttribute(\"else\");\n const filterExpr = el.getAttribute(\"filter\");\n const sortProp = el.getAttribute(\"sort\");\n const limit = parseInt(el.getAttribute(\"limit\")) || Infinity;\n const offset = parseInt(el.getAttribute(\"offset\")) || 0;\n const tplId = el.getAttribute(\"template\");\n const animEnter = el.getAttribute(\"animate-enter\") || el.getAttribute(\"animate\");\n const animLeave = el.getAttribute(\"animate-leave\");\n const stagger = parseInt(el.getAttribute(\"animate-stagger\")) || 0;\n const animDuration = parseInt(el.getAttribute(\"animate-duration\")) || 0;\n\n if (!fromPath || !itemName) return;\n\n const templateContent = tplId\n ? null // Will use external template\n : el.cloneNode(true); // Use the element itself as template\n\n function update() {\n let list = resolve(fromPath, ctx);\n if (!Array.isArray(list)) return;\n\n // Filter\n if (filterExpr) {\n list = list.filter((item, i) => {\n const tempCtx = createContext(\n { [itemName]: item, [indexName]: i },\n ctx,\n );\n return !!evaluate(filterExpr, tempCtx);\n });\n }\n\n // Sort\n if (sortProp) {\n const desc = sortProp.startsWith(\"-\");\n const key = desc ? sortProp.slice(1) : sortProp;\n list = [...list].sort((a, b) => {\n const va = resolve(key, a) ?? a?.[key];\n const vb = resolve(key, b) ?? b?.[key];\n const r = va < vb ? -1 : va > vb ? 1 : 0;\n return desc ? -r : r;\n });\n }\n\n // Offset and limit\n list = list.slice(offset, offset + limit);\n\n // Empty\n if (list.length === 0 && elseTpl) {\n const clone = _cloneTemplate(elseTpl);\n if (clone) {\n el.innerHTML = \"\";\n el.appendChild(clone);\n processTree(el);\n }\n return;\n }\n\n const tpl = tplId ? document.getElementById(tplId) : null;\n const count = list.length;\n\n function renderForeachItems() {\n el.innerHTML = \"\";\n list.forEach((item, i) => {\n const childData = {\n [itemName]: item,\n [indexName]: i,\n $index: i,\n $count: count,\n $first: i === 0,\n $last: i === count - 1,\n $even: i % 2 === 0,\n $odd: i % 2 !== 0,\n };\n const childCtx = createContext(childData, ctx);\n\n let clone;\n if (tpl) {\n clone = tpl.content.cloneNode(true);\n } else {\n clone = templateContent.cloneNode(true);\n }\n\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = childCtx;\n wrapper.appendChild(clone);\n el.appendChild(wrapper);\n processTree(wrapper);\n\n if (animEnter) {\n const firstChild = wrapper.firstElementChild;\n if (firstChild) {\n firstChild.classList.add(animEnter);\n // Stagger animation \u2014 delay must be on the child, not the wrapper\n if (stagger) {\n firstChild.style.animationDelay = (i * stagger) + \"ms\";\n }\n }\n }\n });\n }\n\n // Animate out old items if animate-leave is set\n if (animLeave && el.children.length > 0) {\n const oldItems = [...el.children];\n let remaining = oldItems.length;\n oldItems.forEach((child) => {\n const target = child.firstElementChild || child;\n target.classList.add(animLeave);\n const done = () => {\n target.classList.remove(animLeave);\n remaining--;\n if (remaining <= 0) renderForeachItems();\n };\n target.addEventListener(\"animationend\", done, { once: true });\n setTimeout(done, animDuration || 2000);\n });\n } else {\n renderForeachItems();\n }\n }\n\n ctx.$watch(update);\n update();\n },\n});\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: class-*, style-*\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { evaluate } from \"../evaluate.js\";\nimport { findContext } from \"../dom.js\";\nimport { registerDirective } from \"../registry.js\";\n\nregisterDirective(\"class-*\", {\n priority: 20,\n init(el, name, expr) {\n const suffix = name.replace(\"class-\", \"\");\n const ctx = findContext(el);\n\n // class-map=\"{ active: x, bold: y }\"\n if (suffix === \"map\") {\n function update() {\n const obj = evaluate(expr, ctx);\n if (obj && typeof obj === \"object\") {\n for (const [cls, cond] of Object.entries(obj)) {\n el.classList.toggle(cls, !!cond);\n }\n }\n }\n ctx.$watch(update);\n update();\n return;\n }\n\n // class-list=\"['a', condition ? 'b' : 'c']\"\n if (suffix === \"list\") {\n let prevClasses = [];\n function update() {\n const arr = evaluate(expr, ctx);\n if (Array.isArray(arr)) {\n prevClasses.forEach((cls) => {\n if (cls) el.classList.remove(cls);\n });\n const next = arr.filter(Boolean);\n next.forEach((cls) => el.classList.add(cls));\n prevClasses = next;\n }\n }\n ctx.$watch(update);\n update();\n return;\n }\n\n // class-{name}=\"expr\"\n function update() {\n el.classList.toggle(suffix, !!evaluate(expr, ctx));\n }\n ctx.$watch(update);\n update();\n },\n});\n\nregisterDirective(\"style-*\", {\n priority: 20,\n init(el, name, expr) {\n const suffix = name.replace(\"style-\", \"\");\n const ctx = findContext(el);\n\n // style-map=\"{ color: x, fontSize: y }\"\n if (suffix === \"map\") {\n function update() {\n const obj = evaluate(expr, ctx);\n if (obj && typeof obj === \"object\") {\n for (const [prop, val] of Object.entries(obj)) {\n el.style[prop] = val ?? \"\";\n }\n }\n }\n ctx.$watch(update);\n update();\n return;\n }\n\n // style-{property}=\"expr\" (e.g. style-color, style-font-size)\n const cssProp = suffix.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n function update() {\n const val = evaluate(expr, ctx);\n el.style[cssProp] = val != null ? String(val) : \"\";\n }\n ctx.$watch(update);\n update();\n },\n});\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: on:*, trigger\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { evaluate, _execStatement } from \"../evaluate.js\";\nimport { findContext } from \"../dom.js\";\nimport { registerDirective } from \"../registry.js\";\n\nregisterDirective(\"on:*\", {\n priority: 20,\n init(el, name, expr) {\n const ctx = findContext(el);\n const parts = name.replace(\"on:\", \"\").split(\".\");\n const event = parts[0];\n const modifiers = new Set(parts.slice(1));\n\n // Lifecycle hooks\n if (event === \"mounted\") {\n requestAnimationFrame(() => _execStatement(expr, ctx, { $el: el }));\n return;\n }\n if (event === \"init\") {\n _execStatement(expr, ctx, { $el: el });\n return;\n }\n if (event === \"updated\") {\n const updatedObserver = new MutationObserver(() => {\n _execStatement(expr, ctx, { $el: el });\n });\n updatedObserver.observe(el, { childList: true, subtree: true, characterData: true, attributes: true });\n return;\n }\n if (event === \"error\") {\n window.addEventListener(\"error\", (e) => {\n if (el.contains(e.target) || e.target === el) {\n _execStatement(expr, ctx, { $el: el, $error: e.error || e.message });\n }\n });\n return;\n }\n if (event === \"unmounted\") {\n const observer = new MutationObserver((mutations) => {\n for (const m of mutations) {\n for (const node of m.removedNodes) {\n if (node === el || node.contains?.(el)) {\n _execStatement(expr, ctx, { $el: el });\n observer.disconnect();\n return;\n }\n }\n }\n });\n if (el.parentElement)\n observer.observe(el.parentElement, { childList: true });\n return;\n }\n\n // Debounce / throttle\n let debounceMs = 0;\n let throttleMs = 0;\n for (const mod of modifiers) {\n if (/^\\d+$/.test(mod)) {\n if (modifiers.has(\"debounce\")) debounceMs = parseInt(mod);\n else if (modifiers.has(\"throttle\")) throttleMs = parseInt(mod);\n }\n }\n\n let handler = (e) => {\n // Key modifiers\n if (event === \"keydown\" || event === \"keyup\" || event === \"keypress\") {\n const keyMods = [\n \"enter\",\n \"escape\",\n \"tab\",\n \"space\",\n \"delete\",\n \"backspace\",\n \"up\",\n \"down\",\n \"left\",\n \"right\",\n \"ctrl\",\n \"alt\",\n \"shift\",\n \"meta\",\n ];\n for (const mod of modifiers) {\n if (!keyMods.includes(mod)) continue;\n if (mod === \"enter\" && e.key !== \"Enter\") return;\n if (mod === \"escape\" && e.key !== \"Escape\") return;\n if (mod === \"tab\" && e.key !== \"Tab\") return;\n if (mod === \"space\" && e.key !== \" \") return;\n if (mod === \"delete\" && e.key !== \"Delete\" && e.key !== \"Backspace\")\n return;\n if (mod === \"up\" && e.key !== \"ArrowUp\") return;\n if (mod === \"down\" && e.key !== \"ArrowDown\") return;\n if (mod === \"left\" && e.key !== \"ArrowLeft\") return;\n if (mod === \"right\" && e.key !== \"ArrowRight\") return;\n if (mod === \"ctrl\" && !e.ctrlKey) return;\n if (mod === \"alt\" && !e.altKey) return;\n if (mod === \"shift\" && !e.shiftKey) return;\n if (mod === \"meta\" && !e.metaKey) return;\n }\n }\n\n if (modifiers.has(\"prevent\")) e.preventDefault();\n if (modifiers.has(\"stop\")) e.stopPropagation();\n if (modifiers.has(\"self\") && e.target !== el) return;\n\n _execStatement(expr, ctx, { $event: e, $el: el });\n };\n\n // Wrap with debounce\n if (debounceMs > 0) {\n const original = handler;\n let timer;\n handler = (e) => {\n clearTimeout(timer);\n timer = setTimeout(() => original(e), debounceMs);\n };\n }\n\n // Wrap with throttle\n if (throttleMs > 0) {\n const original = handler;\n let last = 0;\n handler = (e) => {\n const now = Date.now();\n if (now - last >= throttleMs) {\n last = now;\n original(e);\n }\n };\n }\n\n const opts = {};\n if (modifiers.has(\"once\")) opts.once = true;\n\n el.addEventListener(event, handler, opts);\n },\n});\n\nregisterDirective(\"trigger\", {\n priority: 20,\n init(el, name, eventName) {\n const ctx = findContext(el);\n const dataExpr = el.getAttribute(\"trigger-data\");\n el.addEventListener(\"click\", () => {\n const detail = dataExpr ? evaluate(dataExpr, ctx) : null;\n el.dispatchEvent(new CustomEvent(eventName, { detail, bubbles: true }));\n });\n },\n});\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: ref, use, call\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport {\n _refs,\n _stores,\n _notifyStoreWatchers,\n} from \"../globals.js\";\nimport { createContext } from \"../context.js\";\nimport { evaluate, _execStatement, _interpolate } from \"../evaluate.js\";\nimport { _doFetch } from \"../fetch.js\";\nimport { findContext, _cloneTemplate } from \"../dom.js\";\nimport { registerDirective, processTree } from \"../registry.js\";\n\nregisterDirective(\"ref\", {\n priority: 5,\n init(el, name, refName) {\n _refs[refName] = el;\n },\n});\n\nregisterDirective(\"use\", {\n priority: 10,\n init(el, name, tplId) {\n const ctx = findContext(el);\n const clone = _cloneTemplate(tplId);\n if (!clone) return;\n\n // Collect var-* attributes\n const vars = {};\n for (const attr of [...el.attributes]) {\n if (attr.name.startsWith(\"var-\")) {\n const varName = attr.name.replace(\"var-\", \"\");\n vars[varName] = evaluate(attr.value, ctx);\n }\n }\n\n const childCtx = createContext(vars, ctx);\n\n // Handle slots\n const slots = {};\n for (const child of [...el.children]) {\n const slotName = child.getAttribute(\"slot\") || \"default\";\n if (!slots[slotName])\n slots[slotName] = document.createDocumentFragment();\n slots[slotName].appendChild(child.cloneNode(true));\n }\n\n // Replace <slot> elements in template\n const slotEls = clone.querySelectorAll(\"slot\");\n for (const slotEl of slotEls) {\n const slotName = slotEl.getAttribute(\"name\") || \"default\";\n if (slots[slotName]) {\n slotEl.replaceWith(slots[slotName]);\n }\n }\n\n el.innerHTML = \"\";\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = childCtx;\n wrapper.appendChild(clone);\n el.appendChild(wrapper);\n processTree(wrapper);\n },\n});\n\nregisterDirective(\"call\", {\n priority: 20,\n init(el, name, url) {\n const ctx = findContext(el);\n const method = el.getAttribute(\"method\") || \"get\";\n const asKey = el.getAttribute(\"as\");\n const intoStore = el.getAttribute(\"into\");\n const successTpl = el.getAttribute(\"success\");\n const errorTpl = el.getAttribute(\"error\");\n const thenExpr = el.getAttribute(\"then\");\n const confirmMsg = el.getAttribute(\"confirm\");\n const bodyAttr = el.getAttribute(\"body\");\n\n el.addEventListener(\"click\", async (e) => {\n e.preventDefault();\n if (confirmMsg && !window.confirm(confirmMsg)) return;\n\n const resolvedUrl = _interpolate(url, ctx);\n try {\n let reqBody = null;\n if (bodyAttr) {\n const interpolated = _interpolate(bodyAttr, ctx);\n try {\n reqBody = JSON.parse(interpolated);\n } catch {\n reqBody = interpolated;\n }\n }\n const data = await _doFetch(resolvedUrl, method, reqBody, {}, el);\n if (asKey) ctx.$set(asKey, data);\n if (asKey && intoStore) {\n if (!_stores[intoStore]) _stores[intoStore] = createContext({});\n _stores[intoStore].$set(asKey, data);\n _notifyStoreWatchers();\n }\n if (thenExpr) _execStatement(thenExpr, ctx, { result: data });\n if (successTpl) {\n const clone = _cloneTemplate(successTpl);\n if (clone) {\n const tplEl = document.getElementById(\n successTpl.replace(\"#\", \"\"),\n );\n const vn = tplEl?.getAttribute(\"var\") || \"result\";\n const childCtx = createContext({ [vn]: data }, ctx);\n const target = el.closest(\"[route-view]\") || el.parentElement;\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = childCtx;\n wrapper.appendChild(clone);\n target.appendChild(wrapper);\n processTree(wrapper);\n }\n }\n } catch (err) {\n if (errorTpl) {\n const clone = _cloneTemplate(errorTpl);\n if (clone) {\n const tplEl = document.getElementById(errorTpl.replace(\"#\", \"\"));\n const vn = tplEl?.getAttribute(\"var\") || \"err\";\n const childCtx = createContext(\n { [vn]: { message: err.message, status: err.status } },\n ctx,\n );\n const target = el.parentElement;\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = childCtx;\n wrapper.appendChild(clone);\n target.appendChild(wrapper);\n processTree(wrapper);\n }\n }\n }\n });\n },\n});\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: validate, error-boundary\n// HELPER: _validateField\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _validators } from \"../globals.js\";\nimport { createContext } from \"../context.js\";\nimport { findContext, _cloneTemplate } from \"../dom.js\";\nimport { registerDirective, processTree } from \"../registry.js\";\n\nfunction _validateField(value, rules, allValues) {\n const ruleList = rules.split(\"|\").map((r) => r.trim());\n for (const rule of ruleList) {\n const [name, ...args] = rule.split(\":\");\n const fn = _validators[name];\n if (fn) {\n const result = fn(value, ...args, allValues);\n if (result !== true && result) return result;\n } else {\n // Built-in validators\n switch (name) {\n case \"required\":\n if (value == null || String(value).trim() === \"\")\n return \"Required\";\n break;\n case \"email\":\n if (value && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value))\n return \"Invalid email\";\n break;\n case \"url\":\n try {\n new URL(value);\n } catch {\n return \"Invalid URL\";\n }\n break;\n case \"min\":\n if (Number(value) < Number(args[0]))\n return `Minimum value is ${args[0]}`;\n break;\n case \"max\":\n if (Number(value) > Number(args[0]))\n return `Maximum value is ${args[0]}`;\n break;\n case \"between\": {\n const n = Number(value);\n if (n < Number(args[0]) || n > Number(args[1]))\n return `Must be between ${args[0]} and ${args[1]}`;\n break;\n }\n case \"match\":\n if (value !== allValues[args[0]]) return `Must match ${args[0]}`;\n break;\n case \"phone\":\n if (!/^[\\d\\s\\-+()]{7,15}$/.test(value))\n return \"Invalid phone number\";\n break;\n case \"cpf\":\n if (!/^\\d{3}\\.?\\d{3}\\.?\\d{3}-?\\d{2}$/.test(value))\n return \"Invalid CPF\";\n break;\n case \"cnpj\":\n if (!/^\\d{2}\\.?\\d{3}\\.?\\d{3}\\/?\\d{4}-?\\d{2}$/.test(value))\n return \"Invalid CNPJ\";\n break;\n case \"creditcard\":\n if (!/^\\d{13,19}$/.test(value.replace(/\\s|-/g, \"\")))\n return \"Invalid card number\";\n break;\n case \"custom\":\n if (args[0] && _validators[args[0]]) {\n const result = _validators[args[0]](value, allValues);\n if (result !== true && result) return result;\n }\n break;\n }\n }\n }\n return null;\n}\n\nregisterDirective(\"validate\", {\n priority: 30,\n init(el, name, rules) {\n const ctx = findContext(el);\n\n // If on a form, set up form-level validation\n if (el.tagName === \"FORM\") {\n const formCtx = {\n valid: false,\n dirty: false,\n touched: false,\n submitting: false,\n errors: {},\n values: {},\n reset: () => {\n formCtx.dirty = false;\n formCtx.touched = false;\n el.reset();\n checkValidity();\n },\n };\n ctx.$set(\"$form\", formCtx);\n\n function checkValidity() {\n const errors = {};\n const values = {};\n let valid = true;\n\n for (const field of el.querySelectorAll(\"input, textarea, select\")) {\n if (!field.name) continue;\n values[field.name] = field.value;\n\n const fieldRules = field.getAttribute(\"validate\");\n if (fieldRules) {\n const err = _validateField(field.value, fieldRules, values);\n if (err) {\n errors[field.name] = err;\n valid = false;\n }\n }\n\n if (!field.checkValidity()) {\n errors[field.name] =\n errors[field.name] || field.validationMessage;\n valid = false;\n }\n }\n\n formCtx.valid = valid;\n formCtx.errors = errors;\n formCtx.values = values;\n ctx.$set(\"$form\", { ...formCtx });\n }\n\n el.addEventListener(\"input\", () => {\n formCtx.dirty = true;\n checkValidity();\n });\n el.addEventListener(\"focusout\", () => {\n formCtx.touched = true;\n checkValidity();\n });\n el.addEventListener(\"submit\", () => {\n formCtx.submitting = true;\n ctx.$set(\"$form\", { ...formCtx });\n requestAnimationFrame(() => {\n formCtx.submitting = false;\n ctx.$set(\"$form\", { ...formCtx });\n });\n });\n\n // Initial check\n requestAnimationFrame(checkValidity);\n return;\n }\n\n // Field-level validation\n if (\n rules &&\n (el.tagName === \"INPUT\" ||\n el.tagName === \"TEXTAREA\" ||\n el.tagName === \"SELECT\")\n ) {\n const errorTpl = el.getAttribute(\"error\");\n el.addEventListener(\"input\", () => {\n const err = _validateField(el.value, rules, {});\n if (err && errorTpl) {\n // Show error\n let errorEl = el.nextElementSibling?.__validationError\n ? el.nextElementSibling\n : null;\n if (!errorEl) {\n errorEl = document.createElement(\"div\");\n errorEl.__validationError = true;\n errorEl.style.display = \"contents\";\n el.parentNode.insertBefore(errorEl, el.nextSibling);\n }\n const clone = _cloneTemplate(errorTpl);\n if (clone) {\n const childCtx = createContext({ err: { message: err } }, ctx);\n errorEl.innerHTML = \"\";\n errorEl.__ctx = childCtx;\n errorEl.appendChild(clone);\n processTree(errorEl);\n }\n } else {\n const errorEl = el.nextElementSibling?.__validationError\n ? el.nextElementSibling\n : null;\n if (errorEl) errorEl.innerHTML = \"\";\n }\n });\n }\n },\n});\n\nregisterDirective(\"error-boundary\", {\n priority: 1,\n init(el, name, fallbackTpl) {\n const ctx = findContext(el);\n\n function showFallback(message) {\n const clone = _cloneTemplate(fallbackTpl);\n if (clone) {\n const childCtx = createContext(\n { err: { message } },\n ctx,\n );\n el.innerHTML = \"\";\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = childCtx;\n wrapper.appendChild(clone);\n el.appendChild(wrapper);\n processTree(wrapper);\n }\n }\n\n // Listen for NoJS expression errors dispatched from event handlers\n el.addEventListener(\"nojs:error\", (e) => {\n showFallback(e.detail?.message || \"An error occurred\");\n });\n\n // Listen for window-level errors (resource load failures, etc.)\n window.addEventListener(\"error\", (e) => {\n if (el.contains(e.target) || el === e.target) {\n showFallback(e.message || \"An error occurred\");\n }\n });\n },\n});\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVE: t (i18n translations)\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _i18n, _watchI18n } from \"../i18n.js\";\nimport { evaluate } from \"../evaluate.js\";\nimport { findContext } from \"../dom.js\";\nimport { registerDirective } from \"../registry.js\";\n\nregisterDirective(\"t\", {\n priority: 20,\n init(el, name, key) {\n const ctx = findContext(el);\n\n function update() {\n const params = {};\n for (const attr of [...el.attributes]) {\n if (attr.name.startsWith(\"t-\") && attr.name !== \"t\") {\n const paramName = attr.name.replace(\"t-\", \"\");\n params[paramName] = evaluate(attr.value, ctx) ?? attr.value;\n }\n }\n el.textContent = _i18n.t(key, params);\n }\n\n ctx.$watch(update);\n _watchI18n(update);\n update();\n },\n});\n"],
5
- "mappings": "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",
6
- "names": ["index_exports", "__export", "index_default", "__toCommonJS", "_config", "_interceptors", "_eventBus", "_stores", "_storeWatchers", "_filters", "_validators", "_cache", "_refs", "_routerInstance", "setRouterInstance", "r", "_log", "args", "_warn", "_notifyStoreWatchers", "fn", "_watchExpr", "expr", "ctx", "_emitEvent", "name", "data", "_i18nListeners", "_watchI18n", "fn", "_i18n", "v", "key", "params", "messages", "_config", "msg", "k", "forms", "_", "_batchDepth", "_batchQueue", "createContext", "data", "parent", "listeners", "raw", "notifying", "notify", "_batchDepth", "fn", "_batchQueue", "handler", "target", "key", "k", "v", "proxy", "_refs", "_stores", "_routerInstance", "_i18n", "value", "old", "_collectKeys", "ctx", "allKeys", "allVals", "c", "_exprCache", "_cspSafeEval", "expr", "keys", "vals", "scope", "i", "resolvePath", "path", "obj", "o", "k", "parseValue", "token", "t", "trimmed", "ternaryMatch", "cond", "parts", "part", "val", "last", "cmpMatch", "left", "right", "_parsePipes", "exprStr", "current", "depth", "inStr", "strChar", "ch", "_applyFilter", "value", "filterStr", "colonIdx", "name", "argStr", "fn", "_filters", "_warn", "args", "_parseFilterArgs", "str", "a", "n", "evaluate", "ctx", "pipes", "mainExpr", "_collectKeys", "specialKeys", "sk", "keyArr", "valArr", "result", "_config", "cacheKey", "_execStatement", "extraVars", "specials", "_stores", "_routerInstance", "_i18n", "v", "chainKeys", "_wCtx", "setters", "_notifyStoreWatchers", "e", "resolve", "_interpolate", "_", "resolveUrl", "url", "el", "node", "base", "_config", "_doFetch", "method", "body", "extraHeaders", "externalSignal", "fullUrl", "opts", "fn", "_interceptors", "maxRetries", "lastError", "attempt", "controller", "timeout", "response", "errBody", "err", "text", "e", "r", "_cacheGet", "key", "strategy", "entry", "_cache", "store", "raw", "_cacheSet", "data", "_templateHtmlCache", "findContext", "el", "node", "createContext", "_clearDeclared", "walker", "_cloneTemplate", "id", "cleanId", "tpl", "_sanitizeHtml", "html", "_config", "_resolveTemplateSrc", "src", "resolveUrl", "_loadRemoteTemplates", "root", "scope", "templates", "_log", "t", "promises", "resolvedUrl", "baseFolder", "useCache", "children", "parent", "ref", "child", "e", "_warn", "_loadTemplateElement", "loadingMarker", "loadingId", "source", "_processTemplateIncludes", "_loadRemoteTemplatesPhase1", "defaultRoutePath", "all", "phase0", "phase1", "lazy", "_loadRemoteTemplatesPhase2", "phase2", "_directives", "registerDirective", "name", "handler", "_matchDirective", "attrName", "patterns", "p", "prefix", "processElement", "el", "matched", "attr", "m", "a", "b", "processTree", "root", "walker", "node", "_stylesInjected", "_injectBuiltInStyles", "css", "style", "_animateIn", "el", "animName", "transitionName", "durationMs", "fallback", "target", "done", "_animateOut", "callback", "_createRouter", "routes", "current", "listeners", "_getOrCreateEntry", "path", "entry", "r", "parseQuery", "search", "params", "v", "k", "matchRoute", "route", "paramNames", "pattern", "_", "name", "regex", "match", "i", "navigate", "replace", "hashIdx", "hash", "withoutHash", "cleanPath", "matched", "tpl", "guardExpr", "redirectPath", "ctx", "createContext", "_stores", "evaluate", "_config", "newHash", "fullPath", "_renderRoute", "fn", "anchorId", "el", "outletEls", "outletEl", "outletAttr", "outletName", "_log", "_loadTemplateElement", "clone", "routeCtx", "findContext", "wrapper", "_processTemplateIncludes", "nestedTpls", "t", "transition", "_animateIn", "_clearDeclared", "processTree", "link", "routePath", "activeClass", "exactClass", "scrollBehavior", "_scrollToAnchor", "id", "selector", "a", "templateEl", "outlet", "e", "anchor", "target", "raw", "_filters", "v", "c", "len", "s", "decimals", "n", "code", "units", "i", "size", "mod", "sep", "key", "desc", "k", "a", "b", "va", "vb", "r", "val", "fmt", "d", "opts", "diff", "def", "indent", "registerDirective", "el", "name", "value", "data", "evaluate", "createContext", "parent", "findContext", "ctx", "persist", "persistKey", "store", "saved", "parsed", "k", "v", "_log", "storeName", "valueAttr", "_stores", "computedName", "expr", "update", "val", "watchExpr", "onChange", "lastVal", "newVal", "oldVal", "_execStatement", "HTTP_METHODS", "method", "registerDirective", "el", "name", "url", "asKey", "loadingTpl", "errorTpl", "emptyTpl", "successTpl", "thenExpr", "redirectPath", "confirmMsg", "refreshInterval", "cachedRaw", "cacheStrategy", "bodyAttr", "headersAttr", "varName", "intoStore", "retryCount", "_config", "retryDelay", "paramsAttr", "parentCtx", "findContext", "createContext", "ctx", "originalChildren", "n", "_activeAbort", "doRequest", "resolvedUrl", "_interpolate", "paramsObj", "evaluate", "sep", "qs", "cacheKey", "cached", "_cacheGet", "_clearDeclared", "processTree", "clone", "_cloneTemplate", "reqBody", "interpolated", "formData", "extraHeaders", "savedRetries", "savedRetryDelay", "data", "_doFetch", "_cacheSet", "_stores", "_notifyStoreWatchers", "vn", "childCtx", "wrapper", "child", "_execStatement", "_routerInstance", "_emitEvent", "err", "_warn", "e", "onAncestorChange", "newUrl", "_lastResolvedUrl", "_debounceTimer", "debounceMs", "ancestor", "registerDirective", "el", "name", "expr", "ctx", "findContext", "update", "val", "evaluate", "_watchExpr", "_sanitizeHtml", "attrName", "_execStatement", "tag", "type", "event", "registerDirective", "el", "name", "expr", "ctx", "findContext", "thenId", "elseId", "animEnter", "animLeave", "transition", "animDuration", "originalChildren", "n", "currentState", "update", "result", "evaluate", "_animateOut", "render", "clone", "_cloneTemplate", "child", "_clearDeclared", "processTree", "_animateIn", "prev", "prevExpr", "_watchExpr", "val", "matched", "caseVal", "isDefault", "thenTpl", "values", "v", "registerDirective", "el", "name", "expr", "ctx", "findContext", "match", "itemName", "listPath", "tplId", "elseTpl", "keyExpr", "animEnter", "animLeave", "stagger", "animDuration", "update", "list", "resolve", "clone", "_cloneTemplate", "processTree", "tpl", "oldItems", "remaining", "child", "target", "done", "renderItems", "count", "item", "i", "childData", "childCtx", "createContext", "wrapper", "firstChild", "fromPath", "indexName", "filterExpr", "sortProp", "limit", "offset", "templateContent", "tempCtx", "evaluate", "desc", "key", "a", "b", "va", "vb", "r", "renderForeachItems", "registerDirective", "el", "name", "expr", "suffix", "ctx", "findContext", "update", "obj", "evaluate", "cls", "cond", "arr", "prevClasses", "next", "prop", "val", "cssProp", "_", "c", "registerDirective", "el", "name", "expr", "ctx", "findContext", "parts", "event", "modifiers", "_execStatement", "e", "observer", "mutations", "node", "debounceMs", "throttleMs", "mod", "handler", "keyMods", "original", "timer", "last", "now", "opts", "eventName", "dataExpr", "detail", "evaluate", "registerDirective", "el", "name", "refName", "_refs", "tplId", "ctx", "findContext", "clone", "_cloneTemplate", "vars", "attr", "varName", "evaluate", "childCtx", "createContext", "slots", "child", "slotName", "slotEls", "slotEl", "wrapper", "processTree", "url", "method", "asKey", "intoStore", "successTpl", "errorTpl", "thenExpr", "confirmMsg", "bodyAttr", "e", "resolvedUrl", "_interpolate", "reqBody", "interpolated", "data", "_doFetch", "_stores", "_notifyStoreWatchers", "_execStatement", "vn", "target", "err", "_validateField", "value", "rules", "allValues", "ruleList", "r", "rule", "name", "args", "fn", "_validators", "result", "n", "registerDirective", "el", "ctx", "findContext", "checkValidity", "errors", "values", "valid", "field", "fieldRules", "err", "formCtx", "errorTpl", "errorEl", "clone", "_cloneTemplate", "childCtx", "createContext", "processTree", "fallbackTpl", "showFallback", "message", "wrapper", "e", "registerDirective", "el", "name", "key", "ctx", "findContext", "update", "params", "attr", "paramName", "evaluate", "_i18n", "_watchI18n", "_getDefaultRoutePath", "routerCfg", "_config", "base", "NoJS", "v", "opts", "prevHeaders", "prevCache", "prevTemplates", "prevRouter", "prevI18n", "_i18n", "root", "_log", "_processTemplateIncludes", "defaultRoutePath", "_loadRemoteTemplatesPhase1", "setRouterInstance", "_createRouter", "processTree", "_routerInstance", "_loadRemoteTemplatesPhase2", "_stores", "_refs", "_filters", "_validators", "name", "handler", "registerDirective", "fn", "browserLang", "event", "_eventBus", "f", "type", "_interceptors", "createContext", "evaluate", "findContext", "resolve", "index_default"]
3
+ "sources": ["../../src/globals.js", "../../src/i18n.js", "../../src/index.js", "../../src/context.js", "../../src/evaluate.js", "../../src/dom.js", "../../src/fetch.js", "../../src/registry.js", "../../src/router.js", "../../src/animations.js", "../../src/filters.js", "../../src/directives/state.js", "../../src/directives/http.js", "../../src/directives/binding.js", "../../src/directives/conditionals.js", "../../src/directives/loops.js", "../../src/directives/styling.js", "../../src/directives/events.js", "../../src/directives/refs.js", "../../src/directives/validation.js", "../../src/directives/i18n.js"],
4
+ "sourcesContent": ["// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// SHARED STATE & UTILITIES\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nexport const _config = {\n baseApiUrl: \"\",\n headers: {},\n timeout: 10000,\n retries: 0,\n retryDelay: 1000,\n credentials: \"same-origin\",\n csrf: null,\n cache: { strategy: \"none\", ttl: 300000 },\n templates: { cache: true },\n router: { mode: \"history\", base: \"/\", scrollBehavior: \"top\", templates: \"pages\", ext: \".tpl\" },\n i18n: { defaultLocale: \"en\", fallbackLocale: \"en\", detectBrowser: false, loadPath: null, ns: [], cache: true, persist: false },\n debug: false,\n devtools: false,\n csp: null,\n sanitize: true,\n};\n\nexport const _interceptors = { request: [], response: [] };\nexport const _eventBus = {};\nexport const _stores = {};\nexport const _storeWatchers = new Set();\nexport const _filters = {};\nexport const _validators = {};\nexport const _cache = new Map();\nexport const _refs = {};\nexport let _routerInstance = null;\n\n// \u2500\u2500\u2500 Lifecycle: tracks the element being processed by processElement \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Used by ctx.$watch and _onDispose to transparently tag watchers/disposers\n// with the owning DOM element \u2014 no changes needed in directive files.\nexport let _currentEl = null;\n\nexport function _setCurrentEl(el) {\n _currentEl = el;\n}\n\nexport function setRouterInstance(r) {\n _routerInstance = r;\n}\n\nexport function _log(...args) {\n if (_config.debug) console.log(\"[No.JS]\", ...args);\n}\n\nexport function _warn(...args) {\n console.warn(\"[No.JS]\", ...args);\n}\n\nexport function _notifyStoreWatchers() {\n for (const fn of _storeWatchers) {\n if (fn._el && !fn._el.isConnected) {\n _storeWatchers.delete(fn);\n continue;\n }\n fn();\n }\n}\n\nexport function _watchExpr(expr, ctx, fn) {\n ctx.$watch(fn);\n if (typeof expr === \"string\" && expr.includes(\"$store\")) {\n _storeWatchers.add(fn);\n }\n}\n\n// Register a dispose callback on the element currently being processed.\n// Called from directives to clean up intervals, observers, window listeners.\nexport function _onDispose(fn) {\n if (_currentEl) {\n _currentEl.__disposers = _currentEl.__disposers || [];\n _currentEl.__disposers.push(fn);\n }\n}\n\nexport function _emitEvent(name, data) {\n (_eventBus[name] || []).forEach((fn) => fn(data));\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// i18n SYSTEM\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _config, _warn } from \"./globals.js\";\n\nconst _i18nListeners = new Set();\nexport { _i18nListeners };\n\nexport function _watchI18n(fn) {\n _i18nListeners.add(fn);\n return () => _i18nListeners.delete(fn);\n}\n\n// \u2500\u2500\u2500 Notify all i18n listeners (shared by setter + directive) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nexport function _notifyI18n() {\n for (const fn of _i18nListeners) {\n if (fn._el && !fn._el.isConnected) { _i18nListeners.delete(fn); continue; }\n fn();\n }\n}\n\n// \u2500\u2500\u2500 Deep merge (recursive, returns new object) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nexport function _deepMerge(target, source) {\n const out = { ...target };\n for (const key of Object.keys(source)) {\n if (\n source[key] && typeof source[key] === \"object\" && !Array.isArray(source[key]) &&\n target[key] && typeof target[key] === \"object\" && !Array.isArray(target[key])\n ) {\n out[key] = _deepMerge(target[key], source[key]);\n } else {\n out[key] = source[key];\n }\n }\n return out;\n}\n\n// \u2500\u2500\u2500 Locale file cache: Map<string, object> key = \"en\" or \"en:dashboard\"\nexport const _i18nCache = new Map();\nexport const _loadedNs = new Set();\n\n// \u2500\u2500\u2500 Fetch a single JSON file and merge into _i18n.locales[locale] \u2500\u2500\nexport async function _loadLocale(locale, ns) {\n const cacheKey = ns ? `${locale}:${ns}` : locale;\n if (_config.i18n.cache && _i18nCache.has(cacheKey)) return;\n\n let url = _config.i18n.loadPath.replace(\"{locale}\", locale);\n if (ns) url = url.replace(\"{ns}\", ns);\n\n try {\n const res = await fetch(url);\n if (!res.ok) { _warn(`i18n: failed to load ${url} (${res.status})`); return; }\n const data = await res.json();\n const toMerge = ns ? { [ns]: data } : data;\n _i18n.locales[locale] = _deepMerge(_i18n.locales[locale] || {}, toMerge);\n if (_config.i18n.cache) _i18nCache.set(cacheKey, data);\n } catch (e) {\n _warn(`i18n: error loading ${url}`, e);\n }\n}\n\n// \u2500\u2500\u2500 Load all configured data for a locale (flat or all namespaces) \u2500\u2500\nexport async function _loadI18nForLocale(locale) {\n if (!_config.i18n.loadPath) return;\n const ns = _config.i18n.ns;\n if (!ns.length || !_config.i18n.loadPath.includes(\"{ns}\")) {\n await _loadLocale(locale, null);\n } else {\n await Promise.all(ns.map((n) => _loadLocale(locale, n)));\n }\n}\n\n// \u2500\u2500\u2500 Load a single namespace for current + fallback locales \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nexport async function _loadI18nNamespace(ns) {\n if (!_config.i18n.loadPath) return;\n _loadedNs.add(ns);\n const locales = new Set([_i18n.locale, _config.i18n.fallbackLocale]);\n await Promise.all([...locales].map((l) => _loadLocale(l, ns)));\n}\n\nexport const _i18n = {\n _locale: \"en\",\n locales: {},\n get locale() {\n return this._locale;\n },\n set locale(v) {\n if (this._locale !== v) {\n this._locale = v;\n if (_config.i18n.persist && typeof localStorage !== \"undefined\") {\n try { localStorage.setItem(\"nojs-locale\", v); } catch (_) {}\n }\n if (_config.i18n.loadPath) {\n // Load configured ns + any route-loaded ns for the new locale\n const allNs = new Set([..._config.i18n.ns, ..._loadedNs]);\n Promise.all([...allNs].map((n) => _loadLocale(v, n))).then(() => _notifyI18n());\n } else {\n _notifyI18n();\n }\n }\n },\n t(key, params = {}) {\n const messages =\n _i18n.locales[_i18n.locale] ||\n _i18n.locales[_config.i18n.fallbackLocale] ||\n {};\n let msg = key.split(\".\").reduce((o, k) => o?.[k], messages);\n if (msg == null) return key;\n\n // Pluralization: \"one item | {count} items\"\n if (\n typeof msg === \"string\" &&\n msg.includes(\"|\") &&\n params.count != null\n ) {\n const forms = msg.split(\"|\").map((s) => s.trim());\n msg = Number(params.count) === 1 ? forms[0] : forms[1] || forms[0];\n }\n\n // Interpolation: {name}\n if (typeof msg === \"string\") {\n msg = msg.replace(/\\{(\\w+)\\}/g, (_, k) =>\n params[k] != null ? params[k] : \"\",\n );\n }\n return msg;\n },\n};\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// No.JS \u2014 Module Entry Point\n// For npm/ESM/CJS consumers: import NoJS from 'nojs'\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n// Core modules\nimport {\n _config,\n _filters,\n _validators,\n _interceptors,\n _eventBus,\n _stores,\n _refs,\n _routerInstance,\n setRouterInstance,\n _log,\n} from \"./globals.js\";\nimport { _i18n, _loadI18nForLocale } from \"./i18n.js\";\nimport { createContext } from \"./context.js\";\nimport { evaluate, resolve } from \"./evaluate.js\";\nimport { findContext, _loadRemoteTemplates, _loadRemoteTemplatesPhase1, _loadRemoteTemplatesPhase2, _processTemplateIncludes } from \"./dom.js\";\nimport { registerDirective, processTree } from \"./registry.js\";\nimport { _createRouter } from \"./router.js\";\n\n// Side-effect imports: register built-in filters\nimport \"./filters.js\";\n\n// Side-effect imports: register all built-in directives\nimport \"./directives/state.js\";\nimport \"./directives/http.js\";\nimport \"./directives/binding.js\";\nimport \"./directives/conditionals.js\";\nimport \"./directives/loops.js\";\nimport \"./directives/styling.js\";\nimport \"./directives/events.js\";\nimport \"./directives/refs.js\";\nimport \"./directives/validation.js\";\nimport \"./directives/i18n.js\";\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// PUBLIC API\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nfunction _getDefaultRoutePath() {\n if (typeof window === \"undefined\") return null;\n const routerCfg = _config.router || {};\n if (routerCfg.mode === \"hash\") {\n return window.location.hash.slice(1) || \"/\";\n }\n const base = (routerCfg.base || \"/\").replace(/\\/$/, \"\");\n return window.location.pathname.replace(base, \"\") || \"/\";\n}\n\nconst NoJS = {\n get baseApiUrl() {\n return _config.baseApiUrl;\n },\n set baseApiUrl(v) {\n _config.baseApiUrl = v;\n },\n\n get locale() {\n return _i18n.locale;\n },\n set locale(v) {\n _i18n.locale = v;\n },\n\n config(opts = {}) {\n // Save nested objects before shallow assign overwrites them\n const prevHeaders = { ..._config.headers };\n const prevCache = { ..._config.cache };\n const prevTemplates = { ..._config.templates };\n const prevRouter = { ..._config.router };\n const prevI18n = { ..._config.i18n };\n Object.assign(_config, opts);\n if (opts.headers)\n _config.headers = { ...prevHeaders, ...opts.headers };\n if (opts.csrf) _config.csrf = opts.csrf;\n if (opts.cache) _config.cache = { ...prevCache, ...opts.cache };\n if (opts.templates) _config.templates = { ...prevTemplates, ...opts.templates };\n if (opts.router) _config.router = { ...prevRouter, ...opts.router };\n if (opts.i18n) {\n _config.i18n = { ...prevI18n, ...opts.i18n };\n _i18n.locale = opts.i18n.defaultLocale || _i18n.locale;\n }\n },\n\n async init(root) {\n if (typeof document === \"undefined\") return;\n root = root || document.body;\n _log(\"Initializing...\");\n\n // Load external locale files (blocking \u2014 translations must be available for first paint)\n if (_config.i18n.loadPath) {\n const locales = new Set([_i18n.locale, _config.i18n.fallbackLocale]);\n await Promise.all([...locales].map((l) => _loadI18nForLocale(l)));\n }\n\n // Inline template includes (e.g. skeletons) \u2014 synchronous, before any fetch\n _processTemplateIncludes(root);\n\n // Determine active route path for phase 1 prioritization\n const defaultRoutePath = _getDefaultRoutePath();\n\n // Phase 1 (blocking): priority + non-route + default route templates\n await _loadRemoteTemplatesPhase1(defaultRoutePath);\n\n // Check for route-view outlets to activate router\n if (document.querySelector(\"[route-view]\")) {\n setRouterInstance(_createRouter());\n }\n\n processTree(root); // \u2190 first paint happens here\n\n // Init router after tree is processed\n if (_routerInstance) await _routerInstance.init();\n\n _log(\"Initialized.\");\n\n // Phase 2 (non-blocking): background preload remaining route templates\n _loadRemoteTemplatesPhase2();\n\n // DevTools integration\n if (_config.devtools && typeof window !== \"undefined\") {\n window.__NOJS_DEVTOOLS__ = {\n stores: _stores,\n config: _config,\n refs: _refs,\n router: _routerInstance,\n filters: Object.keys(_filters),\n validators: Object.keys(_validators),\n version: NoJS.version,\n };\n _log(\"DevTools enabled \u2014 access via window.__NOJS_DEVTOOLS__\");\n }\n },\n\n // Register custom directive\n directive(name, handler) {\n registerDirective(name, handler);\n },\n\n // Register custom filter\n filter(name, fn) {\n _filters[name] = fn;\n },\n\n // Register custom validator\n validator(name, fn) {\n _validators[name] = fn;\n },\n\n // i18n\n i18n(opts) {\n // Set config options BEFORE locale (setter checks loadPath)\n if (opts.loadPath != null) _config.i18n.loadPath = opts.loadPath;\n if (opts.ns) _config.i18n.ns = opts.ns;\n if (opts.cache != null) _config.i18n.cache = opts.cache;\n if (opts.persist != null) _config.i18n.persist = opts.persist;\n if (opts.locales) _i18n.locales = opts.locales;\n if (opts.fallbackLocale) _config.i18n.fallbackLocale = opts.fallbackLocale;\n\n // Set defaultLocale WITHOUT the setter (avoids overwriting localStorage)\n if (opts.defaultLocale) _i18n._locale = opts.defaultLocale;\n\n // Restore persisted locale (highest priority)\n if (_config.i18n.persist && typeof localStorage !== \"undefined\") {\n try {\n const saved = localStorage.getItem(\"nojs-locale\");\n if (saved && _i18n.locales[saved]) { _i18n._locale = saved; return; }\n } catch (_) {}\n }\n\n // Detect browser language (second priority)\n if (opts.detectBrowser) {\n const browserLang =\n typeof navigator !== \"undefined\" ? navigator.language : \"en\";\n const prefix = browserLang.split(\"-\")[0];\n if (_i18n.locales[browserLang]) _i18n._locale = browserLang;\n else if (_i18n.locales[prefix]) _i18n._locale = prefix;\n }\n },\n\n // Event bus\n on(event, fn) {\n if (!_eventBus[event]) _eventBus[event] = [];\n _eventBus[event].push(fn);\n return () => {\n _eventBus[event] = _eventBus[event].filter((f) => f !== fn);\n };\n },\n\n // Request interceptors\n interceptor(type, fn) {\n if (_interceptors[type]) _interceptors[type].push(fn);\n },\n\n // Access global stores\n get store() {\n return _stores;\n },\n\n // Access router\n get router() {\n return _routerInstance;\n },\n\n // Utilities (for custom directives)\n createContext,\n evaluate,\n findContext,\n processTree,\n resolve,\n\n // Version\n version: \"1.1.0\",\n};\n\nexport default NoJS;\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// REACTIVE CONTEXT\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _stores, _refs, _routerInstance, _currentEl } from \"./globals.js\";\nimport { _i18n } from \"./i18n.js\";\n\nlet _batchDepth = 0;\nconst _batchQueue = new Set();\n\nexport function _startBatch() {\n _batchDepth++;\n}\n\nexport function _endBatch() {\n _batchDepth--;\n if (_batchDepth === 0 && _batchQueue.size > 0) {\n const fns = [..._batchQueue];\n _batchQueue.clear();\n fns.forEach((fn) => {\n if (fn._el && !fn._el.isConnected) return;\n fn();\n });\n }\n}\n\nexport function createContext(data = {}, parent = null) {\n const listeners = new Set();\n const raw = {};\n Object.assign(raw, data);\n let notifying = false;\n\n function notify() {\n if (notifying) return;\n notifying = true;\n try {\n if (_batchDepth > 0) {\n for (const fn of listeners) {\n if (fn._el && !fn._el.isConnected) { listeners.delete(fn); continue; }\n _batchQueue.add(fn);\n }\n } else {\n for (const fn of listeners) {\n if (fn._el && !fn._el.isConnected) { listeners.delete(fn); continue; }\n fn();\n }\n }\n } finally {\n notifying = false;\n }\n }\n\n const handler = {\n get(target, key) {\n if (key === \"__isProxy\") return true;\n if (key === \"__raw\") return target;\n if (key === \"__listeners\") return listeners;\n if (key === \"$watch\")\n return (fn) => {\n if (_currentEl) fn._el = _currentEl;\n listeners.add(fn);\n return () => listeners.delete(fn);\n };\n if (key === \"$notify\") return notify;\n if (key === \"$set\")\n return (k, v) => {\n proxy[k] = v;\n };\n if (key === \"$parent\") return parent;\n if (key === \"$refs\") return _refs;\n if (key === \"$store\") return _stores;\n if (key === \"$route\")\n return _routerInstance ? _routerInstance.current : {};\n if (key === \"$router\") return _routerInstance;\n if (key === \"$i18n\") return _i18n;\n if (key === \"$form\") return target.$form || null;\n if (key in target) return target[key];\n if (parent && parent.__isProxy) return parent[key];\n return undefined;\n },\n set(target, key, value) {\n const old = target[key];\n target[key] = value;\n if (old !== value) notify();\n return true;\n },\n has(target, key) {\n if (key in target) return true;\n if (parent && parent.__isProxy) return key in parent;\n return false;\n },\n };\n\n const proxy = new Proxy(raw, handler);\n return proxy;\n}\n\n// Collect all keys from a context + its parent chain\nexport function _collectKeys(ctx) {\n const allKeys = new Set();\n const allVals = {};\n let c = ctx;\n while (c && c.__isProxy) {\n const raw = c.__raw;\n for (const k of Object.keys(raw)) {\n if (!allKeys.has(k)) {\n allKeys.add(k);\n allVals[k] = raw[k];\n }\n }\n c = c.$parent;\n }\n return { keys: [...allKeys], vals: allVals };\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// EXPRESSION EVALUATOR\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _stores, _routerInstance, _filters, _warn, _config, _notifyStoreWatchers } from \"./globals.js\";\nimport { _i18n } from \"./i18n.js\";\nimport { _collectKeys } from \"./context.js\";\n\nconst _exprCache = new Map();\n\n// CSP-safe expression evaluator (no new Function / eval)\n// Handles dot-notation paths, basic comparisons, boolean operators, negation, and literals.\nfunction _cspSafeEval(expr, keys, vals) {\n const scope = {};\n for (let i = 0; i < keys.length; i++) scope[keys[i]] = vals[i];\n\n function resolvePath(path, obj) {\n return path.split(\".\").reduce((o, k) => o?.[k], obj);\n }\n\n function parseValue(token) {\n const t = token.trim();\n if (t === \"true\") return true;\n if (t === \"false\") return false;\n if (t === \"null\") return null;\n if (t === \"undefined\") return undefined;\n if (/^-?\\d+(\\.\\d+)?$/.test(t)) return Number(t);\n if (/^(['\"`]).*\\1$/.test(t)) return t.slice(1, -1);\n // Treat as property path resolved from scope\n return resolvePath(t, scope);\n }\n\n const trimmed = expr.trim();\n\n // Handle ternary: condition ? trueExpr : falseExpr\n const ternaryMatch = trimmed.match(/^(.+?)\\s*\\?\\s*(.+?)\\s*:\\s*(.+)$/);\n if (ternaryMatch) {\n const cond = _cspSafeEval(ternaryMatch[1].trim(), keys, vals);\n return cond\n ? _cspSafeEval(ternaryMatch[2].trim(), keys, vals)\n : _cspSafeEval(ternaryMatch[3].trim(), keys, vals);\n }\n\n // Handle logical OR (||)\n if (trimmed.includes(\"||\")) {\n const parts = trimmed.split(\"||\");\n for (const part of parts) {\n const val = _cspSafeEval(part.trim(), keys, vals);\n if (val) return val;\n }\n return _cspSafeEval(parts[parts.length - 1].trim(), keys, vals);\n }\n\n // Handle logical AND (&&)\n if (trimmed.includes(\"&&\")) {\n const parts = trimmed.split(\"&&\");\n let last;\n for (const part of parts) {\n last = _cspSafeEval(part.trim(), keys, vals);\n if (!last) return last;\n }\n return last;\n }\n\n // Handle comparisons: ===, !==, ==, !=, >=, <=, >, <\n const cmpMatch = trimmed.match(/^(.+?)\\s*(===|!==|==|!=|>=|<=|>|<)\\s*(.+)$/);\n if (cmpMatch) {\n const left = parseValue(cmpMatch[1]);\n const right = parseValue(cmpMatch[3]);\n switch (cmpMatch[2]) {\n case \"===\": return left === right;\n case \"!==\": return left !== right;\n case \"==\": return left == right;\n case \"!=\": return left != right;\n case \">=\": return left >= right;\n case \"<=\": return left <= right;\n case \">\": return left > right;\n case \"<\": return left < right;\n }\n }\n\n // Handle negation\n if (trimmed.startsWith(\"!\")) {\n return !_cspSafeEval(trimmed.slice(1).trim(), keys, vals);\n }\n\n return parseValue(trimmed);\n}\n\n// Parse pipe syntax: \"expr | filter1 | filter2:arg\"\nfunction _parsePipes(exprStr) {\n // Don't split on || (logical OR)\n const parts = [];\n let current = \"\";\n let depth = 0;\n let inStr = false;\n let strChar = \"\";\n for (let i = 0; i < exprStr.length; i++) {\n const ch = exprStr[i];\n if (inStr) {\n current += ch;\n if (ch === strChar && exprStr[i - 1] !== \"\\\\\") inStr = false;\n continue;\n }\n if (ch === \"'\" || ch === '\"' || ch === \"`\") {\n inStr = true;\n strChar = ch;\n current += ch;\n continue;\n }\n if (ch === \"(\" || ch === \"[\" || ch === \"{\") {\n depth++;\n current += ch;\n continue;\n }\n if (ch === \")\" || ch === \"]\" || ch === \"}\") {\n depth--;\n current += ch;\n continue;\n }\n if (\n ch === \"|\" &&\n depth === 0 &&\n exprStr[i + 1] !== \"|\" &&\n exprStr[i - 1] !== \"|\"\n ) {\n parts.push(current.trim());\n current = \"\";\n continue;\n }\n current += ch;\n }\n parts.push(current.trim());\n return parts;\n}\n\nfunction _applyFilter(value, filterStr) {\n const colonIdx = filterStr.indexOf(\":\");\n let name, argStr;\n if (colonIdx === -1) {\n name = filterStr.trim();\n argStr = null;\n } else {\n name = filterStr.substring(0, colonIdx).trim();\n argStr = filterStr.substring(colonIdx + 1).trim();\n }\n const fn = _filters[name];\n if (!fn) {\n _warn(`Unknown filter: ${name}`);\n return value;\n }\n // Parse args: split by comma but respect quotes\n const args = argStr ? _parseFilterArgs(argStr) : [];\n return fn(value, ...args);\n}\n\nfunction _parseFilterArgs(str) {\n const args = [];\n let current = \"\";\n let inStr = false;\n let strChar = \"\";\n for (const ch of str) {\n if (inStr) {\n if (ch === strChar) {\n inStr = false;\n continue;\n }\n current += ch;\n continue;\n }\n if (ch === \"'\" || ch === '\"') {\n inStr = true;\n strChar = ch;\n continue;\n }\n if (ch === \",\") {\n args.push(current.trim());\n current = \"\";\n continue;\n }\n current += ch;\n }\n if (current.trim()) args.push(current.trim());\n // Try to parse numbers\n return args.map((a) => {\n const n = Number(a);\n return isNaN(n) ? a : n;\n });\n}\n\nexport function evaluate(expr, ctx) {\n if (expr == null || expr === \"\") return undefined;\n try {\n const pipes = _parsePipes(expr);\n const mainExpr = pipes[0];\n const { keys, vals } = _collectKeys(ctx);\n\n // Add special variables\n const specialKeys = [\n \"$store\",\n \"$route\",\n \"$router\",\n \"$i18n\",\n \"$refs\",\n \"$form\",\n ];\n for (const sk of specialKeys) {\n if (!keys.includes(sk)) {\n keys.push(sk);\n vals[sk] = ctx[sk];\n }\n }\n\n const keyArr = keys;\n const valArr = keyArr.map((k) => vals[k]);\n\n let result;\n if (_config.csp === \"strict\") {\n result = _cspSafeEval(mainExpr, keyArr, valArr);\n } else {\n let cacheKey = mainExpr + \"|\" + keyArr.join(\",\");\n let fn = _exprCache.get(cacheKey);\n if (!fn) {\n fn = new Function(...keyArr, `return (${mainExpr})`);\n _exprCache.set(cacheKey, fn);\n }\n result = fn(...valArr);\n }\n\n // Apply filters\n for (let i = 1; i < pipes.length; i++) {\n result = _applyFilter(result, pipes[i]);\n }\n\n return result;\n } catch (e) {\n return undefined;\n }\n}\n\n// Execute a statement (for on:* handlers)\nexport function _execStatement(expr, ctx, extraVars = {}) {\n try {\n const { keys, vals } = _collectKeys(ctx);\n // Add special vars\n const specials = {\n $store: _stores,\n $route: _routerInstance?.current,\n $router: _routerInstance,\n $i18n: _i18n,\n $refs: ctx.$refs,\n };\n Object.assign(specials, extraVars);\n for (const [k, v] of Object.entries(specials)) {\n if (!keys.includes(k)) {\n keys.push(k);\n vals[k] = v;\n }\n }\n\n const keyArr = [...keys];\n const valArr = keyArr.map((k) => vals[k]);\n\n // Build setters to write back state through the full context chain.\n // For each key in any ancestor context, find the owning context at runtime\n // and call $set on it \u2014 so mutations inside `each` loops correctly\n // propagate back to parent state (e.g. cart updated from a loop's on:click).\n const chainKeys = new Set();\n let _wCtx = ctx;\n while (_wCtx && _wCtx.__isProxy) {\n for (const k of Object.keys(_wCtx.__raw)) chainKeys.add(k);\n _wCtx = _wCtx.$parent;\n }\n const setters = [...chainKeys]\n .filter((k) => !k.startsWith(\"$\"))\n .map(\n (k) =>\n `{let _c=__ctx;while(_c&&_c.__isProxy){if('${k}'in _c.__raw){_c.$set('${k}',typeof ${k}!=='undefined'?${k}:_c.__raw['${k}']);break;}_c=_c.$parent;}}`,\n )\n .join(\"\\n\");\n\n const fn = new Function(\"__ctx\", ...keyArr, `${expr};\\n${setters}`);\n fn(ctx, ...valArr);\n\n // Notify global store watchers when expression touches $store\n if (typeof expr === \"string\" && expr.includes(\"$store\")) {\n _notifyStoreWatchers();\n }\n } catch (e) {\n _warn(\"Expression error:\", expr, e.message);\n // Dispatch a custom DOM event so error-boundary directives can catch it\n if (extraVars.$el) {\n extraVars.$el.dispatchEvent(\n new CustomEvent(\"nojs:error\", { bubbles: true, detail: { message: e.message, error: e } })\n );\n }\n }\n}\n\nexport function resolve(path, ctx) {\n return path.split(\".\").reduce((o, k) => o?.[k], ctx);\n}\n\n// Interpolate strings like \"/users/{user.id}?q={search}\"\nexport function _interpolate(str, ctx) {\n return str.replace(/\\{([^}]+)\\}/g, (_, expr) => {\n const val = evaluate(expr.trim(), ctx);\n return val != null ? val : \"\";\n });\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DOM HELPERS & REMOTE TEMPLATES\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _config, _log, _warn } from \"./globals.js\";\nimport { createContext } from \"./context.js\";\nimport { resolveUrl } from \"./fetch.js\";\n\n// \u2500\u2500\u2500 Template HTML cache: url \u2192 html string \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Avoids re-fetching the same .tpl file on repeat navigation.\n// Controlled by _config.templates.cache (default: true).\nexport const _templateHtmlCache = new Map();\n\nexport function findContext(el) {\n let node = el;\n while (node) {\n if (node.__ctx) return node.__ctx;\n node = node.parentElement;\n }\n return createContext();\n}\n\nexport function _clearDeclared(el) {\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_ELEMENT);\n while (walker.nextNode()) walker.currentNode.__declared = false;\n}\n\nexport function _cloneTemplate(id) {\n if (!id) return null;\n const cleanId = id.startsWith(\"#\") ? id.slice(1) : id;\n const tpl = document.getElementById(cleanId);\n if (!tpl) return null;\n return tpl.content ? tpl.content.cloneNode(true) : null;\n}\n\n// Simple HTML sanitizer\nexport function _sanitizeHtml(html) {\n if (!_config.sanitize) return html;\n const safe = html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/on\\w+\\s*=/gi, \"data-blocked=\")\n .replace(/javascript:/gi, \"\");\n return safe;\n}\n\n// Resolve a template src path.\n// - \"./foo.tpl\" \u2192 relative to the parent template's folder (__srcBase)\n// - \"/foo.tpl\" \u2192 absolute from server root (kept as-is for fetch)\n// - \"foo.tpl\" \u2192 relative to page URL (kept as-is for fetch)\nfunction _resolveTemplateSrc(src, tpl) {\n if (src.startsWith(\"./\")) {\n // Walk up to find the nearest ancestor with __srcBase\n let node = tpl.parentNode;\n while (node) {\n if (node.__srcBase) {\n return node.__srcBase + src.slice(2);\n }\n node = node.parentNode;\n }\n // No ancestor base found \u2014 strip \"./\" and let fetch resolve from page\n return src.slice(2);\n }\n // Absolute or plain relative \u2014 use the existing resolveUrl logic\n return resolveUrl(src, tpl);\n}\n\nexport async function _loadRemoteTemplates(root) {\n const scope = root || document;\n const templates = scope.querySelectorAll(\"template[src]\");\n _log(\"[LRT] called on\", scope === document ? \"document\" : scope.nodeName || \"fragment\", \"\u2014 found\", templates.length, \"template[src]\", [...templates].map(t => t.getAttribute(\"src\")));\n if (!templates.length) return;\n const promises = [...templates].map(async (tpl) => {\n if (tpl.__srcLoaded) { _log(\"[LRT] SKIP (already loaded):\", tpl.getAttribute(\"src\")); return; }\n tpl.__srcLoaded = true;\n const src = tpl.getAttribute(\"src\");\n const resolvedUrl = _resolveTemplateSrc(src, tpl);\n // Track the folder of this template so children can use \"./\" paths\n const baseFolder = resolvedUrl.substring(0, resolvedUrl.lastIndexOf(\"/\") + 1);\n try {\n const useCache = _config.templates.cache !== false;\n let html;\n if (useCache && _templateHtmlCache.has(resolvedUrl)) {\n html = _templateHtmlCache.get(resolvedUrl);\n _log(\"[LRT] CACHE HIT:\", resolvedUrl);\n } else {\n const res = await fetch(resolvedUrl);\n html = await res.text();\n if (useCache) _templateHtmlCache.set(resolvedUrl, html);\n }\n tpl.innerHTML = html;\n // Stamp the base folder onto the content so nested templates inherit it\n if (tpl.content) {\n tpl.content.__srcBase = baseFolder;\n }\n _log(\"Loaded remote template:\", src, \"\u2192\", resolvedUrl);\n // Recursively load nested remote templates\n await _loadRemoteTemplates(tpl.content || tpl);\n // Non-route templates are content-includes: replace them with\n // their loaded content so it actually renders (template elements\n // are inert \u2014 the browser never displays their .content).\n if (!tpl.hasAttribute(\"route\") && tpl.parentNode) {\n // Transfer __srcBase to a wrapper so descendants keep the reference\n const frag = tpl.content;\n const children = [...frag.childNodes];\n const parent = tpl.parentNode;\n const ref = tpl.nextSibling;\n parent.removeChild(tpl);\n for (const child of children) {\n if (child.nodeType === 1) child.__srcBase = child.__srcBase || baseFolder;\n parent.insertBefore(child, ref);\n }\n }\n } catch (e) {\n _warn(\"Failed to load template:\", src, e.message);\n }\n });\n await Promise.all(promises);\n}\n\n// \u2500\u2500\u2500 Single-element loader (core primitive) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nexport async function _loadTemplateElement(tpl) {\n const src = tpl.getAttribute(\"src\");\n if (tpl.__srcLoaded) { _log(\"[LTE] SKIP (already loaded):\", src); return; }\n _log(\"[LTE] START fetch:\", src, \"| route:\", tpl.hasAttribute(\"route\"), \"| inDOM:\", document.contains(tpl), \"| loading:\", tpl.getAttribute(\"loading\"));\n tpl.__srcLoaded = true;\n const resolvedUrl = _resolveTemplateSrc(src, tpl);\n const baseFolder = resolvedUrl.substring(0, resolvedUrl.lastIndexOf(\"/\") + 1);\n\n // Synchronously insert loading placeholder before the fetch begins\n let loadingMarker = null;\n const loadingId = tpl.getAttribute(\"loading\");\n if (loadingId && tpl.parentNode) {\n const cleanId = loadingId.startsWith(\"#\") ? loadingId.slice(1) : loadingId;\n const source = document.getElementById(cleanId);\n if (source && source.content) {\n loadingMarker = document.createElement(\"span\");\n loadingMarker.style.cssText = \"display:contents\";\n loadingMarker.appendChild(source.content.cloneNode(true));\n tpl.parentNode.insertBefore(loadingMarker, tpl);\n }\n }\n\n try {\n const useCache = _config.templates.cache !== false;\n let html;\n if (useCache && _templateHtmlCache.has(resolvedUrl)) {\n html = _templateHtmlCache.get(resolvedUrl);\n _log(\"[LTE] CACHE HIT:\", resolvedUrl);\n } else {\n const res = await fetch(resolvedUrl);\n html = await res.text();\n if (useCache) _templateHtmlCache.set(resolvedUrl, html);\n }\n tpl.innerHTML = html;\n if (tpl.content) {\n tpl.content.__srcBase = baseFolder;\n }\n _log(\"Loaded remote template:\", src, \"\u2192\", resolvedUrl);\n // Route templates: defer nested loading until after DOM insertion\n // (ensures loading=\"#id\" placeholder lookup via getElementById works).\n // Content-include templates: load nested ones now.\n if (!tpl.hasAttribute(\"route\")) {\n await _loadRemoteTemplates(tpl.content || tpl);\n }\n // Remove loading placeholder once real content is ready\n if (loadingMarker) loadingMarker.remove();\n // Non-route templates are content-includes: inject content inline\n if (!tpl.hasAttribute(\"route\") && tpl.parentNode) {\n const frag = tpl.content;\n const children = [...frag.childNodes];\n const parent = tpl.parentNode;\n const ref = tpl.nextSibling;\n parent.removeChild(tpl);\n for (const child of children) {\n if (child.nodeType === 1) child.__srcBase = child.__srcBase || baseFolder;\n parent.insertBefore(child, ref);\n }\n }\n } catch (e) {\n if (loadingMarker) loadingMarker.remove();\n _warn(\"Failed to load template:\", src, e.message);\n }\n}\n\n// \u2500\u2500\u2500 Inline template includes (template[include=\"id\"]) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Synchronously clones a named inline template into every\n// <template include=\"id\"> placeholder. Called before any async fetch\n// so skeleton/include content is stamped into the DOM immediately.\nexport function _processTemplateIncludes(root) {\n const scope = root || document;\n scope.querySelectorAll(\"template[include]\").forEach((tpl) => {\n const id = tpl.getAttribute(\"include\");\n const source = document.getElementById(id.startsWith(\"#\") ? id.slice(1) : id);\n if (!source || !source.content) return;\n tpl.replaceWith(source.content.cloneNode(true));\n });\n}\n\n// \u2500\u2500\u2500 Phase 1 loader (priority + eager non-route + active route) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nexport async function _loadRemoteTemplatesPhase1(defaultRoutePath) {\n const all = [...document.querySelectorAll(\"template[src]\")];\n\n // Phase 0: lazy=\"priority\" templates \u2014 load first, regardless of route type\n const phase0 = all.filter(\n (tpl) => !tpl.__srcLoaded && tpl.getAttribute(\"lazy\") === \"priority\"\n );\n await Promise.all(phase0.map(_loadTemplateElement));\n\n // Phase 1: non-route templates + the route matching defaultRoutePath\n // Skip lazy=\"ondemand\" and lazy=\"priority\" (already handled above)\n const phase1 = all.filter((tpl) => {\n if (tpl.__srcLoaded) return false;\n const lazy = tpl.getAttribute(\"lazy\");\n if (lazy === \"ondemand\" || lazy === \"priority\") return false;\n const isRoute = tpl.hasAttribute(\"route\");\n if (!isRoute) return true; // content-include: always Phase 1\n // Route template: only include if it matches the current default path\n return defaultRoutePath != null && tpl.getAttribute(\"route\") === defaultRoutePath;\n });\n await Promise.all(phase1.map(_loadTemplateElement));\n}\n\n// \u2500\u2500\u2500 Phase 2 loader (background preload of remaining route templates) \u2500\u2500\u2500\u2500\u2500\u2500\nexport function _loadRemoteTemplatesPhase2() {\n const all = [...document.querySelectorAll(\"template[src]\")];\n const phase2 = all.filter((tpl) => {\n if (tpl.__srcLoaded) return false;\n if (tpl.getAttribute(\"lazy\") === \"ondemand\") return false;\n return tpl.hasAttribute(\"route\");\n });\n return Promise.all(phase2.map(_loadTemplateElement));\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// FETCH HELPER, URL RESOLUTION & CACHE\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _config, _interceptors, _cache } from \"./globals.js\";\n\nexport function resolveUrl(url, el) {\n if (\n url.startsWith(\"http://\") ||\n url.startsWith(\"https://\") ||\n url.startsWith(\"//\")\n )\n return url;\n let node = el;\n while (node) {\n const base = node.getAttribute?.(\"base\");\n if (base) return base.replace(/\\/+$/, \"\") + \"/\" + url.replace(/^\\/+/, \"\");\n node = node.parentElement;\n }\n if (_config.baseApiUrl)\n return (\n _config.baseApiUrl.replace(/\\/+$/, \"\") + \"/\" + url.replace(/^\\/+/, \"\")\n );\n return url;\n}\n\nexport async function _doFetch(\n url,\n method = \"GET\",\n body = null,\n extraHeaders = {},\n el = null,\n externalSignal = null,\n) {\n const fullUrl = resolveUrl(url, el);\n let opts = {\n method: method.toUpperCase(),\n headers: { ...(_config.headers || {}), ...extraHeaders },\n credentials: _config.credentials,\n };\n\n if (body && method !== \"GET\") {\n if (typeof body === \"string\") {\n try {\n JSON.parse(body);\n opts.headers[\"Content-Type\"] = \"application/json\";\n opts.body = body;\n } catch {\n opts.body = body;\n }\n } else if (body instanceof FormData) {\n opts.body = body;\n } else {\n opts.headers[\"Content-Type\"] = \"application/json\";\n opts.body = JSON.stringify(body);\n }\n }\n\n // CSRF\n if (_config.csrf && method !== \"GET\") {\n opts.headers[_config.csrf.header || \"X-CSRF-Token\"] =\n _config.csrf.token || \"\";\n }\n\n // Request interceptors\n for (const fn of _interceptors.request) {\n opts = fn(fullUrl, opts) || opts;\n }\n\n // Retry logic\n const maxRetries = _config.retries || 0;\n let lastError;\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(),\n _config.timeout || 10000,\n );\n // Wire external abort signal (switchMap) to internal controller\n if (externalSignal) {\n if (externalSignal.aborted) {\n clearTimeout(timeout);\n throw new DOMException(\"Aborted\", \"AbortError\");\n }\n externalSignal.addEventListener(\"abort\", () => controller.abort(), {\n once: true,\n });\n }\n opts.signal = controller.signal;\n\n let response = await fetch(fullUrl, opts);\n clearTimeout(timeout);\n\n // Response interceptors\n for (const fn of _interceptors.response) {\n response = fn(response, fullUrl) || response;\n }\n\n if (!response.ok) {\n const errBody = await response.json().catch(() => ({}));\n const err = new Error(errBody.message || `HTTP ${response.status}`);\n err.status = response.status;\n err.body = errBody;\n throw err;\n }\n\n const text = await response.text();\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n } catch (e) {\n if (e.name === \"AbortError\") throw e; // Don't retry aborted requests\n lastError = e;\n if (attempt < maxRetries) {\n await new Promise((r) => setTimeout(r, _config.retryDelay || 1000));\n }\n }\n }\n throw lastError;\n}\n\nexport function _cacheGet(key, strategy) {\n if (strategy === \"none\") return null;\n if (strategy === \"memory\") {\n const entry = _cache.get(key);\n if (entry && Date.now() - entry.time < (_config.cache.ttl || 300000))\n return entry.data;\n return null;\n }\n const store =\n strategy === \"local\"\n ? localStorage\n : strategy === \"session\"\n ? sessionStorage\n : null;\n if (!store) return null;\n try {\n const raw = store.getItem(\"nojs_cache_\" + key);\n if (!raw) return null;\n const entry = JSON.parse(raw);\n if (Date.now() - entry.time < (_config.cache.ttl || 300000))\n return entry.data;\n store.removeItem(\"nojs_cache_\" + key);\n } catch {\n /* ignore */\n }\n return null;\n}\n\nexport function _cacheSet(key, data, strategy) {\n if (strategy === \"none\") return;\n const entry = { data, time: Date.now() };\n if (strategy === \"memory\") {\n _cache.set(key, entry);\n return;\n }\n const store =\n strategy === \"local\"\n ? localStorage\n : strategy === \"session\"\n ? sessionStorage\n : null;\n if (store) {\n try {\n store.setItem(\"nojs_cache_\" + key, JSON.stringify(entry));\n } catch {\n /* ignore */\n }\n }\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVE REGISTRY & DOM PROCESSING\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _currentEl, _setCurrentEl, _storeWatchers } from \"./globals.js\";\nimport { _i18nListeners } from \"./i18n.js\";\n\nconst _directives = new Map();\n\nexport function registerDirective(name, handler) {\n _directives.set(name, {\n priority: handler.priority ?? 50,\n init: handler.init,\n });\n}\n\nfunction _matchDirective(attrName) {\n if (_directives.has(attrName))\n return { directive: _directives.get(attrName), match: attrName };\n // Pattern matches\n const patterns = [\"class-*\", \"on:*\", \"style-*\", \"bind-*\"];\n for (const p of patterns) {\n const prefix = p.replace(\"*\", \"\");\n if (attrName.startsWith(prefix) && _directives.has(p)) {\n return { directive: _directives.get(p), match: p };\n }\n }\n return null;\n}\n\nexport function processElement(el) {\n if (el.__declared) return;\n el.__declared = true;\n\n const matched = [];\n for (const attr of [...el.attributes]) {\n const m = _matchDirective(attr.name);\n if (m) {\n matched.push({\n name: attr.name,\n value: attr.value,\n priority: m.directive.priority,\n init: m.directive.init,\n });\n }\n }\n\n matched.sort((a, b) => a.priority - b.priority);\n const prev = _currentEl;\n for (const m of matched) {\n _setCurrentEl(el);\n m.init(el, m.name, m.value);\n }\n _setCurrentEl(prev);\n}\n\nexport function processTree(root) {\n if (!root) return;\n if (root.nodeType === 1 && !root.__declared) processElement(root);\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n while (walker.nextNode()) {\n const node = walker.currentNode;\n if (node.tagName === \"TEMPLATE\" || node.tagName === \"SCRIPT\") continue;\n if (!node.__declared) processElement(node);\n }\n}\n\n// \u2500\u2500\u2500 Disposal: proactive cleanup of watchers/listeners/disposers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction _disposeElement(node) {\n if (node.__ctx && node.__ctx.__listeners) {\n for (const fn of node.__ctx.__listeners) {\n _storeWatchers.delete(fn);\n _i18nListeners.delete(fn);\n }\n node.__ctx.__listeners.clear();\n }\n if (node.__disposers) {\n node.__disposers.forEach((fn) => fn());\n node.__disposers = null;\n }\n node.__declared = false;\n}\n\nexport function _disposeTree(root) {\n if (!root) return;\n _disposeElement(root);\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n while (walker.nextNode()) _disposeElement(walker.currentNode);\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// CLIENT-SIDE ROUTER\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _config, _stores, _log } from \"./globals.js\";\nimport { createContext } from \"./context.js\";\nimport { evaluate } from \"./evaluate.js\";\nimport { findContext, _clearDeclared, _loadTemplateElement, _processTemplateIncludes } from \"./dom.js\";\nimport { processTree, _disposeTree } from \"./registry.js\";\nimport { _animateIn } from \"./animations.js\";\n\nexport function _createRouter() {\n const routes = [];\n let current = { path: \"\", params: {}, query: {}, hash: \"\" };\n const listeners = new Set();\n const _autoTemplateCache = new Map();\n\n function _getOrCreateEntry(path) {\n let entry = routes.find((r) => r.path === path);\n if (!entry) {\n entry = { path, outlets: {} };\n routes.push(entry);\n }\n return entry;\n }\n\n function parseQuery(search) {\n const params = {};\n new URLSearchParams(search).forEach((v, k) => {\n params[k] = v;\n });\n return params;\n }\n\n function matchRoute(path) {\n for (const route of routes) {\n const paramNames = [];\n const pattern = route.path.replace(/:(\\w+)/g, (_, name) => {\n paramNames.push(name);\n return \"([^/]+)\";\n });\n const regex = new RegExp(\"^\" + pattern + \"$\");\n const match = path.match(regex);\n if (match) {\n const params = {};\n paramNames.forEach((name, i) => {\n params[name] = match[i + 1];\n });\n return { route, params };\n }\n }\n return null;\n }\n\n async function navigate(path, replace = false) {\n const hashIdx = path.indexOf(\"#\");\n const hash = hashIdx >= 0 ? path.slice(hashIdx + 1) : \"\";\n const withoutHash = hashIdx >= 0 ? path.slice(0, hashIdx) : path;\n const [cleanPath, search = \"\"] = withoutHash.split(\"?\");\n\n current = {\n path: cleanPath,\n params: {},\n query: parseQuery(search),\n hash: hash ? \"#\" + hash : \"\",\n };\n\n const matched = matchRoute(cleanPath);\n if (matched) {\n current.params = matched.params;\n\n // Guard check\n const tpl = matched.route.outlets?.[\"default\"];\n const guardExpr = tpl?.getAttribute(\"guard\");\n const redirectPath = tpl?.getAttribute(\"redirect\");\n\n if (guardExpr) {\n const ctx = createContext({}, null);\n ctx.__raw.$store = _stores;\n ctx.__raw.$route = current;\n const allowed = evaluate(guardExpr, ctx);\n if (!allowed && redirectPath) {\n await navigate(redirectPath, true);\n return;\n }\n }\n }\n\n // Update URL\n if (_config.router.mode === \"hash\") {\n const newHash = \"#\" + path;\n if (replace) window.location.replace(newHash);\n else window.location.hash = path;\n } else {\n const fullPath = _config.router.base.replace(/\\/$/, \"\") + path;\n if (replace) window.history.replaceState({}, \"\", fullPath);\n else window.history.pushState({}, \"\", fullPath);\n }\n\n // Render\n await _renderRoute(matched);\n listeners.forEach((fn) => fn(current));\n\n // Scroll to anchor if hash is present (e.g. route=\"/docs#cheatsheet\")\n if (current.hash) {\n const anchorId = current.hash.slice(1);\n requestAnimationFrame(() => {\n const el = document.getElementById(anchorId);\n if (el) el.scrollIntoView({ behavior: \"smooth\" });\n });\n }\n }\n\n async function _renderRoute(matched) {\n const outletEls = document.querySelectorAll(\"[route-view]\");\n for (const outletEl of outletEls) {\n // Determine outlet name (\"\" or missing attribute value \u2192 \"default\")\n const outletAttr = outletEl.getAttribute(\"route-view\");\n const outletName = outletAttr && outletAttr.trim() !== \"\" ? outletAttr.trim() : \"default\";\n\n // Find the template for this outlet in the matched route\n let tpl = matched?.route?.outlets?.[outletName];\n\n // \u2500\u2500 File-based routing: auto-resolve from route-view[src] or config \u2500\u2500\n const configTemplates = _config.router.templates || \"\";\n if (!tpl && (outletEl.hasAttribute(\"src\") || configTemplates)) {\n const rawSrc = outletEl.getAttribute(\"src\") || configTemplates;\n const baseSrc = rawSrc.replace(/\\/?$/, \"/\");\n const ext = outletEl.getAttribute(\"ext\") || _config.router.ext || \".html\";\n const indexName = outletEl.getAttribute(\"route-index\") || \"index\";\n const segment = current.path === \"/\" ? indexName : current.path.replace(/^\\//, \"\");\n const fullSrc = baseSrc + segment + ext;\n const cacheKey = outletName + \":\" + fullSrc;\n\n if (_autoTemplateCache.has(cacheKey)) {\n tpl = _autoTemplateCache.get(cacheKey);\n } else {\n tpl = document.createElement(\"template\");\n tpl.setAttribute(\"src\", fullSrc);\n tpl.setAttribute(\"route\", current.path);\n document.body.appendChild(tpl);\n _autoTemplateCache.set(cacheKey, tpl);\n _log(\"[ROUTER] File-based route:\", current.path, \"\u2192\", fullSrc);\n }\n\n // Auto i18n namespace (convention: filename = namespace)\n if (outletEl.hasAttribute(\"i18n-ns\") && !tpl.getAttribute(\"i18n-ns\")) {\n tpl.setAttribute(\"i18n-ns\", segment);\n }\n }\n\n // Always clear first \u2014 dispose watchers/listeners before wiping DOM\n _disposeTree(outletEl);\n outletEl.innerHTML = \"\";\n\n if (tpl) {\n // Load template on-demand if not yet fetched\n if (tpl.getAttribute(\"src\") && !tpl.__srcLoaded) {\n _log(\"Loading route template on demand:\", tpl.getAttribute(\"src\"));\n await _loadTemplateElement(tpl);\n }\n\n // i18n namespace loading for route template\n const i18nNs = tpl.getAttribute(\"i18n-ns\");\n if (i18nNs) {\n const { _loadI18nNamespace } = await import(\"./i18n.js\");\n await _loadI18nNamespace(i18nNs);\n }\n\n const clone = tpl.content.cloneNode(true);\n\n const routeCtx = createContext(\n { $route: current },\n findContext(outletEl),\n );\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = routeCtx;\n // Preserve __srcBase so nested ./relative template paths resolve correctly.\n // cloneNode() copies DOM nodes but NOT custom JS properties, so we must\n // re-stamp it on the wrapper element (which IS in the ancestor chain).\n if (tpl.content.__srcBase) wrapper.__srcBase = tpl.content.__srcBase;\n wrapper.appendChild(clone);\n // Insert into live DOM first so nested template loading has DOM access\n // (required for loading=\"#id\" skeleton placeholder lookups via getElementById)\n outletEl.appendChild(wrapper);\n\n // Process inline template includes synchronously (e.g. template[include])\n _processTemplateIncludes(wrapper);\n // Load each nested template individually via _loadTemplateElement so that:\n // 1. The loading=\"#id\" skeleton placeholder attribute is honoured\n // 2. getElementById can resolve the skeleton (wrapper is already in live DOM)\n // 3. No batch-recursion on a live DOM node (avoids re-entrant fetch loops)\n const nestedTpls = [...wrapper.querySelectorAll(\"template[src]\")];\n _log(\"[ROUTER] nested templates found in wrapper:\", nestedTpls.length, nestedTpls.map(t => t.getAttribute(\"src\") + (t.__srcLoaded ? \"[LOADED]\" : \"[NEW]\")));\n await Promise.all(nestedTpls.map(_loadTemplateElement));\n _log(\"[ROUTER] all nested loads done for route:\", current.path);\n\n const transition = outletEl.getAttribute(\"transition\");\n if (transition) _animateIn(wrapper, null, transition);\n\n _clearDeclared(wrapper);\n processTree(wrapper);\n }\n }\n\n // Update active classes\n document.querySelectorAll(\"[route]\").forEach((link) => {\n const routePath = link.getAttribute(\"route\");\n const activeClass = link.getAttribute(\"route-active\") || \"active\";\n const exactClass = link.getAttribute(\"route-active-exact\");\n\n if (exactClass) {\n link.classList.toggle(exactClass, current.path === routePath);\n } else if (activeClass && !link.hasAttribute(\"route-active-exact\")) {\n const isActive = routePath === \"/\"\n ? current.path === \"/\"\n : current.path.startsWith(routePath);\n link.classList.toggle(activeClass, isActive);\n }\n });\n\n // Scroll behavior\n const scrollBehavior = _config.router.scrollBehavior;\n if (scrollBehavior === \"top\") {\n window.scrollTo(0, 0);\n } else if (scrollBehavior === \"smooth\") {\n window.scrollTo({ top: 0, behavior: \"smooth\" });\n }\n // \"preserve\" \u2014 do nothing, keep current scroll position\n }\n\n function _scrollToAnchor(id, el) {\n el.scrollIntoView({ behavior: \"smooth\" });\n\n // Update active class on anchor links that point to \"#<id>\"\n const selector = 'a[href=\"#' + id + '\"]';\n document.querySelectorAll('a[href^=\"#\"]').forEach((a) => {\n if (!a.hasAttribute(\"route\")) {\n a.classList.toggle(\"active\", a.matches(selector));\n }\n });\n }\n\n const router = {\n get current() {\n return current;\n },\n push(path) {\n return navigate(path);\n },\n replace(path) {\n return navigate(path, true);\n },\n back() {\n window.history.back();\n },\n forward() {\n window.history.forward();\n },\n on(fn) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n },\n register(path, templateEl, outlet = \"default\") {\n const entry = _getOrCreateEntry(path);\n entry.outlets[outlet] = templateEl;\n },\n async init() {\n // Collect route templates\n document.querySelectorAll(\"template[route]\").forEach((tpl) => {\n const path = tpl.getAttribute(\"route\");\n const outlet = tpl.getAttribute(\"outlet\") || \"default\";\n const entry = _getOrCreateEntry(path);\n entry.outlets[outlet] = tpl;\n });\n\n // Bind route links\n document.addEventListener(\"click\", (e) => {\n const link = e.target.closest(\"[route]\");\n if (link && !link.hasAttribute(\"route-view\")) {\n e.preventDefault();\n const path = link.getAttribute(\"route\");\n navigate(path);\n return;\n }\n\n // In hash mode, intercept plain anchor links (href=\"#id\") so they\n // scroll to the target element instead of conflicting with the router.\n if (_config.router.mode === \"hash\") {\n const anchor = e.target.closest('a[href^=\"#\"]');\n if (anchor && !anchor.hasAttribute(\"route\")) {\n const href = anchor.getAttribute(\"href\");\n const id = href.slice(1);\n if (id && !id.startsWith(\"/\")) {\n const target = document.getElementById(id);\n if (target) {\n e.preventDefault();\n _scrollToAnchor(id, target);\n }\n }\n }\n }\n });\n\n // Listen for URL changes\n if (_config.router.mode === \"hash\") {\n window.addEventListener(\"hashchange\", () => {\n const raw = window.location.hash.slice(1) || \"/\";\n if (!raw.startsWith(\"/\")) {\n const el = document.getElementById(raw);\n if (el) {\n _scrollToAnchor(raw, el);\n window.history.replaceState(null, \"\", \"#\" + current.path);\n }\n return;\n }\n navigate(raw, true);\n });\n // Initial route\n const path = window.location.hash.slice(1) || \"/\";\n await navigate(path, true);\n } else {\n window.addEventListener(\"popstate\", () => {\n const path =\n window.location.pathname.replace(_config.router.base, \"\") || \"/\";\n navigate(path, true);\n });\n const path =\n window.location.pathname.replace(_config.router.base, \"\") || \"/\";\n await navigate(path, true);\n }\n },\n };\n\n return router;\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// ANIMATIONS\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nlet _stylesInjected = false;\n\nfunction _injectBuiltInStyles() {\n if (_stylesInjected || typeof document === \"undefined\") return;\n _stylesInjected = true;\n\n const css = `\n@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n@keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } }\n@keyframes fadeInUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes fadeInDown { from { opacity: 0; transform: translateY(-20px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes fadeOutUp { from { opacity: 1; transform: translateY(0); } to { opacity: 0; transform: translateY(-20px); } }\n@keyframes fadeOutDown { from { opacity: 1; transform: translateY(0); } to { opacity: 0; transform: translateY(20px); } }\n@keyframes slideInLeft { from { transform: translateX(-100%); } to { transform: translateX(0); } }\n@keyframes slideInRight { from { transform: translateX(100%); } to { transform: translateX(0); } }\n@keyframes slideOutLeft { from { transform: translateX(0); } to { transform: translateX(-100%); } }\n@keyframes slideOutRight { from { transform: translateX(0); } to { transform: translateX(100%); } }\n@keyframes zoomIn { from { opacity: 0; transform: scale(0.5); } to { opacity: 1; transform: scale(1); } }\n@keyframes zoomOut { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(0.5); } }\n@keyframes bounceIn { 0% { opacity: 0; transform: scale(0.3); } 50% { opacity: 1; transform: scale(1.05); } 70% { transform: scale(0.9); } 100% { opacity: 1; transform: scale(1); } }\n@keyframes bounceOut { 0% { opacity: 1; transform: scale(1); } 20% { transform: scale(0.9); } 50%,55% { opacity: 1; transform: scale(1.1); } 100% { opacity: 0; transform: scale(0.3); } }\n`.trim();\n\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-nojs-animations\", \"\");\n style.textContent = css;\n document.head.appendChild(style);\n}\n\nexport function _animateIn(el, animName, transitionName, durationMs) {\n _injectBuiltInStyles();\n const fallback = durationMs || 1000;\n if (animName) {\n const target = el.firstElementChild || el;\n target.classList.add(animName);\n if (durationMs) target.style.animationDuration = durationMs + \"ms\";\n target.addEventListener(\n \"animationend\",\n () => target.classList.remove(animName),\n { once: true },\n );\n }\n if (transitionName) {\n const target = el.firstElementChild || el;\n target.classList.add(\n transitionName + \"-enter\",\n transitionName + \"-enter-active\",\n );\n requestAnimationFrame(() => {\n target.classList.remove(transitionName + \"-enter\");\n target.classList.add(transitionName + \"-enter-to\");\n const done = () => {\n target.classList.remove(\n transitionName + \"-enter-active\",\n transitionName + \"-enter-to\",\n );\n };\n target.addEventListener(\"transitionend\", done, { once: true });\n // Fallback\n setTimeout(done, fallback);\n });\n }\n}\n\nexport function _animateOut(el, animName, transitionName, callback, durationMs) {\n _injectBuiltInStyles();\n const fallback = durationMs || 2000;\n if (!el.firstElementChild && !el.childNodes.length) {\n callback();\n return;\n }\n if (animName) {\n const target = el.firstElementChild || el;\n target.classList.add(animName);\n if (durationMs) target.style.animationDuration = durationMs + \"ms\";\n target.addEventListener(\n \"animationend\",\n () => {\n target.classList.remove(animName);\n callback();\n },\n { once: true },\n );\n setTimeout(callback, fallback); // Fallback\n return;\n }\n if (transitionName) {\n const target = el.firstElementChild || el;\n target.classList.add(\n transitionName + \"-leave\",\n transitionName + \"-leave-active\",\n );\n requestAnimationFrame(() => {\n target.classList.remove(transitionName + \"-leave\");\n target.classList.add(transitionName + \"-leave-to\");\n const done = () => {\n target.classList.remove(\n transitionName + \"-leave-active\",\n transitionName + \"-leave-to\",\n );\n callback();\n };\n target.addEventListener(\"transitionend\", done, { once: true });\n setTimeout(done, fallback);\n });\n return;\n }\n callback();\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// BUILT-IN FILTERS\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _filters } from \"./globals.js\";\n\n// Text\n_filters.uppercase = (v) => String(v ?? \"\").toUpperCase();\n_filters.lowercase = (v) => String(v ?? \"\").toLowerCase();\n_filters.capitalize = (v) =>\n String(v ?? \"\").replace(/\\b\\w/g, (c) => c.toUpperCase());\n_filters.truncate = (v, len = 100) => {\n const s = String(v ?? \"\");\n return s.length > len ? s.slice(0, len) + \"...\" : s;\n};\n_filters.trim = (v) => String(v ?? \"\").trim();\n_filters.stripHtml = (v) => String(v ?? \"\").replace(/<[^>]*>/g, \"\");\n_filters.slugify = (v) =>\n String(v ?? \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n_filters.nl2br = (v) => String(v ?? \"\").replace(/\\n/g, \"<br>\");\n_filters.encodeUri = (v) => encodeURIComponent(String(v ?? \"\"));\n\n// Numbers\n_filters.number = (v, decimals = 0) => {\n const n = Number(v);\n if (isNaN(n)) return v;\n return n.toLocaleString(undefined, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n};\n_filters.currency = (v, code = \"USD\") => {\n const n = Number(v);\n if (isNaN(n)) return v;\n try {\n return n.toLocaleString(undefined, { style: \"currency\", currency: code });\n } catch {\n return `${code} ${n.toFixed(2)}`;\n }\n};\n_filters.percent = (v, decimals = 0) => {\n const n = Number(v);\n if (isNaN(n)) return v;\n return (n * 100).toFixed(decimals) + \"%\";\n};\n_filters.filesize = (v) => {\n const n = Number(v);\n if (isNaN(n)) return v;\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n let i = 0;\n let size = n;\n while (size >= 1024 && i < units.length - 1) {\n size /= 1024;\n i++;\n }\n return size.toFixed(i > 0 ? 1 : 0) + \" \" + units[i];\n};\n_filters.ordinal = (v) => {\n const n = Number(v);\n if (isNaN(n)) return v;\n const s = [\"th\", \"st\", \"nd\", \"rd\"];\n const mod = n % 100;\n return n + (s[(mod - 20) % 10] || s[mod] || s[0]);\n};\n\n// Arrays\n_filters.count = (v) => (Array.isArray(v) ? v.length : 0);\n_filters.first = (v) => (Array.isArray(v) ? v[0] : v);\n_filters.last = (v) => (Array.isArray(v) ? v[v.length - 1] : v);\n_filters.join = (v, sep = \", \") => (Array.isArray(v) ? v.join(sep) : v);\n_filters.reverse = (v) => (Array.isArray(v) ? [...v].reverse() : v);\n_filters.unique = (v) => (Array.isArray(v) ? [...new Set(v)] : v);\n_filters.pluck = (v, key) => (Array.isArray(v) ? v.map((i) => i?.[key]) : v);\n_filters.sortBy = (v, key) => {\n if (!Array.isArray(v)) return v;\n const desc = key?.startsWith(\"-\");\n const k = desc ? key.slice(1) : key;\n return [...v].sort((a, b) => {\n const va = a?.[k],\n vb = b?.[k];\n const r = va < vb ? -1 : va > vb ? 1 : 0;\n return desc ? -r : r;\n });\n};\n_filters.where = (v, key, val) =>\n Array.isArray(v) ? v.filter((i) => i?.[key] === val) : v;\n\n// Date\n_filters.date = (v, fmt = \"short\") => {\n const d = new Date(v);\n if (isNaN(d)) return v;\n const opts =\n fmt === \"long\"\n ? { dateStyle: \"long\" }\n : fmt === \"full\"\n ? { dateStyle: \"full\" }\n : { dateStyle: \"short\" };\n return d.toLocaleDateString(undefined, opts);\n};\n_filters.datetime = (v) => {\n const d = new Date(v);\n if (isNaN(d)) return v;\n return d.toLocaleString();\n};\n_filters.relative = (v) => {\n const d = new Date(v);\n if (isNaN(d)) return v;\n const diff = (Date.now() - d.getTime()) / 1000;\n if (diff < 60) return \"just now\";\n if (diff < 3600) return Math.floor(diff / 60) + \"m ago\";\n if (diff < 86400) return Math.floor(diff / 3600) + \"h ago\";\n if (diff < 2592000) return Math.floor(diff / 86400) + \"d ago\";\n return d.toLocaleDateString();\n};\n_filters.fromNow = (v) => {\n const d = new Date(v);\n if (isNaN(d)) return v;\n const diff = (d.getTime() - Date.now()) / 1000;\n if (diff < 0) return _filters.relative(v);\n if (diff < 60) return \"in a moment\";\n if (diff < 3600) return \"in \" + Math.floor(diff / 60) + \"m\";\n if (diff < 86400) return \"in \" + Math.floor(diff / 3600) + \"h\";\n return \"in \" + Math.floor(diff / 86400) + \"d\";\n};\n\n// Utility\n_filters.default = (v, def = \"\") => (v == null || v === \"\" ? def : v);\n_filters.json = (v, indent = 2) => JSON.stringify(v, null, indent);\n_filters.debug = (v) => {\n console.log(\"[No.JS debug]\", v);\n return v;\n};\n_filters.keys = (v) => (v && typeof v === \"object\" ? Object.keys(v) : []);\n_filters.values = (v) => (v && typeof v === \"object\" ? Object.values(v) : []);\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: state, store, computed, watch\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _stores, _log } from \"../globals.js\";\nimport { createContext } from \"../context.js\";\nimport { evaluate, _execStatement } from \"../evaluate.js\";\nimport { findContext } from \"../dom.js\";\nimport { registerDirective } from \"../registry.js\";\n\nregisterDirective(\"state\", {\n priority: 0,\n init(el, name, value) {\n const data = evaluate(value, createContext()) || {};\n const parent = el.parentElement ? findContext(el.parentElement) : null;\n const ctx = createContext(data, parent);\n el.__ctx = ctx;\n\n // Persistence\n const persist = el.getAttribute(\"persist\");\n const persistKey = el.getAttribute(\"persist-key\");\n if (persist && persistKey) {\n const store =\n persist === \"localStorage\"\n ? localStorage\n : persist === \"sessionStorage\"\n ? sessionStorage\n : null;\n if (store) {\n try {\n const saved = store.getItem(\"nojs_state_\" + persistKey);\n if (saved) {\n const parsed = JSON.parse(saved);\n for (const [k, v] of Object.entries(parsed)) ctx.$set(k, v);\n }\n } catch {\n /* ignore */\n }\n ctx.$watch(() => {\n try {\n store.setItem(\n \"nojs_state_\" + persistKey,\n JSON.stringify(ctx.__raw),\n );\n } catch {\n /* ignore */\n }\n });\n }\n }\n\n _log(\"state\", data);\n },\n});\n\nregisterDirective(\"store\", {\n priority: 0,\n init(el, name, storeName) {\n const valueAttr = el.getAttribute(\"value\");\n if (!storeName) return;\n if (!_stores[storeName]) {\n const data = valueAttr\n ? evaluate(valueAttr, createContext()) || {}\n : {};\n _stores[storeName] = createContext(data);\n }\n _log(\"store\", storeName);\n },\n});\n\nregisterDirective(\"computed\", {\n priority: 2,\n init(el, name, computedName) {\n const expr = el.getAttribute(\"expr\");\n if (!computedName || !expr) return;\n const ctx = findContext(el);\n function update() {\n const val = evaluate(expr, ctx);\n ctx.$set(computedName, val);\n }\n ctx.$watch(update);\n update();\n },\n});\n\nregisterDirective(\"watch\", {\n priority: 2,\n init(el, name, watchExpr) {\n const ctx = findContext(el);\n const onChange = el.getAttribute(\"on:change\");\n let lastVal = evaluate(watchExpr, ctx);\n ctx.$watch(() => {\n const newVal = evaluate(watchExpr, ctx);\n if (newVal !== lastVal) {\n const oldVal = lastVal;\n lastVal = newVal;\n if (onChange)\n _execStatement(onChange, ctx, { $old: oldVal, $new: newVal });\n }\n });\n },\n});\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: get, post, put, patch, delete\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport {\n _config,\n _log,\n _warn,\n _stores,\n _notifyStoreWatchers,\n _emitEvent,\n _routerInstance,\n _onDispose,\n} from \"../globals.js\";\nimport { createContext } from \"../context.js\";\nimport { evaluate, _execStatement, _interpolate } from \"../evaluate.js\";\nimport { _doFetch, _cacheGet, _cacheSet } from \"../fetch.js\";\nimport { findContext, _clearDeclared, _cloneTemplate } from \"../dom.js\";\nimport { registerDirective, processTree } from \"../registry.js\";\n\nconst HTTP_METHODS = [\"get\", \"post\", \"put\", \"patch\", \"delete\"];\n\nfor (const method of HTTP_METHODS) {\n registerDirective(method, {\n priority: 1,\n init(el, name, url) {\n const asKey = el.getAttribute(\"as\") || \"data\";\n const loadingTpl = el.getAttribute(\"loading\");\n const errorTpl = el.getAttribute(\"error\");\n const emptyTpl = el.getAttribute(\"empty\");\n const successTpl = el.getAttribute(\"success\");\n const thenExpr = el.getAttribute(\"then\");\n const redirectPath = el.getAttribute(\"redirect\");\n const confirmMsg = el.getAttribute(\"confirm\");\n const refreshInterval = parseInt(el.getAttribute(\"refresh\")) || 0;\n const cachedRaw = el.getAttribute(\"cached\");\n const cacheStrategy = el.hasAttribute(\"cached\")\n ? cachedRaw || \"memory\"\n : \"none\";\n const bodyAttr = el.getAttribute(\"body\");\n const headersAttr = el.getAttribute(\"headers\");\n const varName = el.getAttribute(\"var\");\n const intoStore = el.getAttribute(\"into\");\n const retryCount =\n parseInt(el.getAttribute(\"retry\")) || _config.retries;\n const retryDelay =\n parseInt(el.getAttribute(\"retry-delay\")) || _config.retryDelay || 1000;\n const paramsAttr = el.getAttribute(\"params\");\n\n const parentCtx = el.parentElement\n ? findContext(el.parentElement)\n : createContext();\n const ctx = el.__ctx || createContext({}, parentCtx);\n el.__ctx = ctx;\n\n const originalChildren = [...el.childNodes].map((n) =>\n n.cloneNode(true),\n );\n\n let _activeAbort = null;\n\n async function doRequest() {\n // SwitchMap: abort previous in-flight request\n if (_activeAbort) _activeAbort.abort();\n _activeAbort = new AbortController();\n\n // Confirmation\n if (confirmMsg && !window.confirm(confirmMsg)) return;\n\n let resolvedUrl = _interpolate(url, ctx);\n\n // Append query params\n if (paramsAttr) {\n const paramsObj = evaluate(paramsAttr, ctx);\n if (paramsObj && typeof paramsObj === \"object\") {\n const sep = resolvedUrl.includes(\"?\") ? \"&\" : \"?\";\n const qs = new URLSearchParams(paramsObj).toString();\n if (qs) resolvedUrl += sep + qs;\n }\n }\n\n const cacheKey = method + \":\" + resolvedUrl;\n\n // Check cache\n if (method === \"get\") {\n const cached = _cacheGet(cacheKey, cacheStrategy);\n if (cached != null) {\n ctx.$set(asKey, cached);\n _clearDeclared(el);\n processTree(el);\n return;\n }\n }\n\n // Show loading\n if (loadingTpl) {\n const clone = _cloneTemplate(loadingTpl);\n if (clone) {\n el.innerHTML = \"\";\n el.appendChild(clone);\n processTree(el);\n }\n }\n\n try {\n let reqBody = null;\n if (bodyAttr) {\n const interpolated = _interpolate(bodyAttr, ctx);\n try {\n reqBody = JSON.parse(interpolated);\n } catch {\n reqBody = interpolated;\n }\n }\n\n // For forms, collect form data\n if (el.tagName === \"FORM\") {\n const formData = new FormData(el);\n reqBody = Object.fromEntries(formData.entries());\n }\n\n const extraHeaders = headersAttr ? JSON.parse(headersAttr) : {};\n const savedRetries = _config.retries;\n const savedRetryDelay = _config.retryDelay;\n _config.retries = retryCount;\n _config.retryDelay = retryDelay;\n const data = await _doFetch(\n resolvedUrl,\n method,\n reqBody,\n extraHeaders,\n el,\n _activeAbort.signal,\n );\n _config.retries = savedRetries;\n _config.retryDelay = savedRetryDelay;\n\n // Cache response\n if (method === \"get\") _cacheSet(cacheKey, data, cacheStrategy);\n\n // Check empty\n if (\n emptyTpl &&\n (data == null || (Array.isArray(data) && data.length === 0))\n ) {\n const clone = _cloneTemplate(emptyTpl);\n if (clone) {\n el.innerHTML = \"\";\n el.appendChild(clone);\n processTree(el);\n }\n return;\n }\n\n ctx.$set(asKey, data);\n\n // Write to global store if into attribute is present\n if (intoStore) {\n if (!_stores[intoStore]) _stores[intoStore] = createContext({});\n _stores[intoStore].$set(asKey, data);\n _notifyStoreWatchers();\n }\n\n // Success template\n if (successTpl) {\n const clone = _cloneTemplate(successTpl);\n if (clone) {\n el.innerHTML = \"\";\n // Inject var\n const tplEl = document.getElementById(\n successTpl.replace(\"#\", \"\"),\n );\n const vn = tplEl?.getAttribute(\"var\") || varName || \"result\";\n const childCtx = createContext({ [vn]: data }, ctx);\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = childCtx;\n wrapper.appendChild(clone);\n el.appendChild(wrapper);\n processTree(wrapper);\n }\n } else {\n // Restore original children and re-process\n el.innerHTML = \"\";\n for (const child of originalChildren)\n el.appendChild(child.cloneNode(true));\n _clearDeclared(el);\n processTree(el);\n }\n\n // Then expression\n if (thenExpr) _execStatement(thenExpr, ctx, { result: data });\n\n // Redirect\n if (redirectPath && _routerInstance)\n _routerInstance.push(redirectPath);\n\n _emitEvent(\"fetch:success\", { url: resolvedUrl, data });\n } catch (err) {\n // SwitchMap: silently ignore aborted requests\n if (err.name === \"AbortError\") return;\n\n _warn(\n `${method.toUpperCase()} ${resolvedUrl} failed:`,\n err.message,\n );\n _emitEvent(\"fetch:error\", { url: resolvedUrl, error: err });\n _emitEvent(\"error\", { url: resolvedUrl, error: err });\n\n if (errorTpl) {\n const clone = _cloneTemplate(errorTpl);\n if (clone) {\n el.innerHTML = \"\";\n const tplEl = document.getElementById(\n errorTpl.replace(\"#\", \"\"),\n );\n const vn = tplEl?.getAttribute(\"var\") || \"err\";\n const childCtx = createContext(\n {\n [vn]: {\n message: err.message,\n status: err.status,\n body: err.body,\n },\n },\n ctx,\n );\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = childCtx;\n wrapper.appendChild(clone);\n el.appendChild(wrapper);\n processTree(wrapper);\n }\n }\n }\n }\n\n // For forms, intercept submit\n if (el.tagName === \"FORM\" && method !== \"get\") {\n el.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n doRequest();\n });\n } else if (method === \"get\") {\n doRequest();\n } else {\n // Non-GET on non-FORM: attach click listener\n el.addEventListener(\"click\", (e) => {\n e.preventDefault();\n doRequest();\n });\n }\n\n // Reactive URL watching: re-fetch when {expressions} in URL change\n const hasInterpolation = /\\{[^}]+\\}/.test(url);\n if (hasInterpolation) {\n const debounceMs = parseInt(el.getAttribute(\"debounce\")) || 0;\n let _lastResolvedUrl = _interpolate(url, ctx);\n let _debounceTimer = null;\n\n function onAncestorChange() {\n const newUrl = _interpolate(url, ctx);\n if (newUrl !== _lastResolvedUrl) {\n _lastResolvedUrl = newUrl;\n if (_debounceTimer) clearTimeout(_debounceTimer);\n if (debounceMs > 0) {\n _debounceTimer = setTimeout(doRequest, debounceMs);\n } else {\n doRequest();\n }\n }\n }\n\n // Watch all ancestor contexts for changes\n let ancestor = parentCtx;\n while (ancestor && ancestor.__isProxy) {\n ancestor.$watch(onAncestorChange);\n ancestor = ancestor.$parent;\n }\n }\n\n // Polling\n if (refreshInterval > 0) {\n const id = setInterval(doRequest, refreshInterval);\n _onDispose(() => clearInterval(id));\n }\n },\n });\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: bind, bind-html, bind-*, model\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _watchExpr } from \"../globals.js\";\nimport { evaluate, _execStatement } from \"../evaluate.js\";\nimport { findContext, _sanitizeHtml } from \"../dom.js\";\nimport { registerDirective } from \"../registry.js\";\n\nregisterDirective(\"bind\", {\n priority: 20,\n init(el, name, expr) {\n const ctx = findContext(el);\n function update() {\n const val = evaluate(expr, ctx);\n el.textContent = (val !== undefined && val !== null) ? String(val) : '';\n }\n _watchExpr(expr, ctx, update);\n update();\n },\n});\n\nregisterDirective(\"bind-html\", {\n priority: 20,\n init(el, name, expr) {\n const ctx = findContext(el);\n function update() {\n const val = evaluate(expr, ctx);\n if (val != null) el.innerHTML = _sanitizeHtml(String(val));\n }\n _watchExpr(expr, ctx, update);\n update();\n },\n});\n\nregisterDirective(\"bind-*\", {\n priority: 20,\n init(el, name, expr) {\n const attrName = name.replace(\"bind-\", \"\");\n const ctx = findContext(el);\n\n // Two-way binding for value\n if (\n attrName === \"value\" &&\n (el.tagName === \"INPUT\" ||\n el.tagName === \"TEXTAREA\" ||\n el.tagName === \"SELECT\")\n ) {\n el.addEventListener(\"input\", () => {\n const val = el.type === \"number\" ? Number(el.value) : el.value;\n _execStatement(`${expr} = ${JSON.stringify(val)}`, ctx);\n });\n }\n\n function update() {\n const val = evaluate(expr, ctx);\n // Boolean attributes\n if (\n [\n \"disabled\",\n \"readonly\",\n \"checked\",\n \"selected\",\n \"hidden\",\n \"required\",\n ].includes(attrName)\n ) {\n if (val) el.setAttribute(attrName, \"\");\n else el.removeAttribute(attrName);\n if (attrName in el) el[attrName] = !!val;\n return;\n }\n if (val != null) el.setAttribute(attrName, String(val));\n else el.removeAttribute(attrName);\n }\n _watchExpr(expr, ctx, update);\n update();\n },\n});\n\nregisterDirective(\"model\", {\n priority: 20,\n init(el, name, expr) {\n const ctx = findContext(el);\n const tag = el.tagName;\n const type = el.type;\n\n // Model \u2192 DOM\n function update() {\n const val = evaluate(expr, ctx);\n if (tag === \"INPUT\" && type === \"checkbox\") {\n el.checked = !!val;\n } else if (tag === \"INPUT\" && type === \"radio\") {\n el.checked = el.value === String(val);\n } else if (tag === \"SELECT\") {\n el.value = val != null ? String(val) : \"\";\n } else {\n el.value = val != null ? String(val) : \"\";\n }\n }\n\n // DOM \u2192 Model\n const event =\n tag === \"SELECT\" || type === \"checkbox\" || type === \"radio\"\n ? \"change\"\n : \"input\";\n el.addEventListener(event, () => {\n let val;\n if (type === \"checkbox\") val = el.checked;\n else if (type === \"number\" || type === \"range\") val = Number(el.value);\n else val = el.value;\n _execStatement(`${expr} = __val`, ctx, { __val: val });\n });\n\n ctx.$watch(update);\n update();\n },\n});\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: if, else-if, else, show, hide, switch\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _watchExpr } from \"../globals.js\";\nimport { evaluate } from \"../evaluate.js\";\nimport { findContext, _clearDeclared, _cloneTemplate } from \"../dom.js\";\nimport { registerDirective, processTree } from \"../registry.js\";\nimport { _animateIn, _animateOut } from \"../animations.js\";\n\nregisterDirective(\"if\", {\n priority: 10,\n init(el, name, expr) {\n const ctx = findContext(el);\n const thenId = el.getAttribute(\"then\");\n const elseId = el.getAttribute(\"else\");\n const animEnter =\n el.getAttribute(\"animate-enter\") || el.getAttribute(\"animate\");\n const animLeave = el.getAttribute(\"animate-leave\");\n const transition = el.getAttribute(\"transition\");\n const animDuration = parseInt(el.getAttribute(\"animate-duration\")) || 0;\n const originalChildren = [...el.childNodes].map((n) => n.cloneNode(true));\n let currentState = undefined;\n\n function update() {\n const result = !!evaluate(expr, ctx);\n if (result === currentState) return;\n currentState = result;\n\n // Animation leave\n if (animLeave || transition) {\n _animateOut(el, animLeave, transition, () => render(result), animDuration);\n } else {\n render(result);\n }\n }\n\n function render(result) {\n if (result) {\n if (thenId) {\n const clone = _cloneTemplate(thenId);\n if (clone) {\n el.innerHTML = \"\";\n el.appendChild(clone);\n }\n } else {\n el.innerHTML = \"\";\n for (const child of originalChildren)\n el.appendChild(child.cloneNode(true));\n }\n } else {\n if (elseId) {\n const clone = _cloneTemplate(elseId);\n if (clone) {\n el.innerHTML = \"\";\n el.appendChild(clone);\n }\n } else if (thenId) {\n el.innerHTML = \"\";\n } else {\n el.innerHTML = \"\";\n }\n }\n\n _clearDeclared(el);\n processTree(el);\n\n // Animation enter\n if (animEnter || transition) {\n _animateIn(el, animEnter, transition, animDuration);\n }\n }\n\n ctx.$watch(update);\n update();\n },\n});\n\nregisterDirective(\"else-if\", {\n priority: 10,\n init(el, name, expr) {\n // Works like `if` but checks previous sibling's condition\n const ctx = findContext(el);\n const thenId = el.getAttribute(\"then\");\n const originalChildren = [...el.childNodes].map((n) => n.cloneNode(true));\n\n function update() {\n // Check if any preceding if/else-if was true\n let prev = el.previousElementSibling;\n while (prev) {\n const prevExpr =\n prev.getAttribute(\"if\") || prev.getAttribute(\"else-if\");\n if (prevExpr) {\n if (evaluate(prevExpr, ctx)) {\n el.innerHTML = \"\";\n el.style.display = \"none\";\n return;\n }\n } else break;\n prev = prev.previousElementSibling;\n }\n\n const result = !!evaluate(expr, ctx);\n el.style.display = \"\";\n if (result) {\n if (thenId) {\n const clone = _cloneTemplate(thenId);\n if (clone) {\n el.innerHTML = \"\";\n el.appendChild(clone);\n }\n } else {\n el.innerHTML = \"\";\n for (const child of originalChildren)\n el.appendChild(child.cloneNode(true));\n }\n _clearDeclared(el);\n processTree(el);\n } else {\n el.innerHTML = \"\";\n }\n }\n ctx.$watch(update);\n update();\n },\n});\n\nregisterDirective(\"else\", {\n priority: 10,\n init(el) {\n // Skip if this element also has an \"if\" directive (else is used as an attribute of if)\n if (el.hasAttribute(\"if\")) return;\n const ctx = findContext(el);\n const thenId = el.getAttribute(\"then\");\n const originalChildren = [...el.childNodes].map((n) => n.cloneNode(true));\n\n function update() {\n // Check if any preceding if/else-if was true\n let prev = el.previousElementSibling;\n while (prev) {\n const prevExpr =\n prev.getAttribute(\"if\") || prev.getAttribute(\"else-if\");\n if (prevExpr) {\n if (evaluate(prevExpr, ctx)) {\n el.innerHTML = \"\";\n el.style.display = \"none\";\n return;\n }\n } else break;\n prev = prev.previousElementSibling;\n }\n\n // No preceding condition was true \u2014 show else content\n el.style.display = \"\";\n if (thenId) {\n const clone = _cloneTemplate(thenId);\n if (clone) {\n el.innerHTML = \"\";\n el.appendChild(clone);\n }\n } else {\n el.innerHTML = \"\";\n for (const child of originalChildren)\n el.appendChild(child.cloneNode(true));\n }\n _clearDeclared(el);\n processTree(el);\n }\n ctx.$watch(update);\n update();\n },\n});\n\nregisterDirective(\"show\", {\n priority: 20,\n init(el, name, expr) {\n const ctx = findContext(el);\n const animEnter = el.getAttribute(\"animate-enter\") || el.getAttribute(\"animate\");\n const animLeave = el.getAttribute(\"animate-leave\");\n const transition = el.getAttribute(\"transition\");\n const animDuration = parseInt(el.getAttribute(\"animate-duration\")) || 0;\n let currentState = undefined;\n\n function update() {\n const result = !!evaluate(expr, ctx);\n if (result === currentState) return;\n currentState = result;\n\n if (result) {\n el.style.display = \"\";\n if (animEnter || transition) _animateIn(el, animEnter, transition, animDuration);\n } else {\n if (animLeave || transition) {\n _animateOut(el, animLeave, transition, () => { el.style.display = \"none\"; }, animDuration);\n } else {\n el.style.display = \"none\";\n }\n }\n }\n _watchExpr(expr, ctx, update);\n update();\n },\n});\n\nregisterDirective(\"hide\", {\n priority: 20,\n init(el, name, expr) {\n const ctx = findContext(el);\n const animEnter = el.getAttribute(\"animate-enter\") || el.getAttribute(\"animate\");\n const animLeave = el.getAttribute(\"animate-leave\");\n const transition = el.getAttribute(\"transition\");\n const animDuration = parseInt(el.getAttribute(\"animate-duration\")) || 0;\n let currentState = undefined;\n\n function update() {\n const result = !evaluate(expr, ctx);\n if (result === currentState) return;\n currentState = result;\n\n if (result) {\n el.style.display = \"\";\n if (animEnter || transition) _animateIn(el, animEnter, transition, animDuration);\n } else {\n if (animLeave || transition) {\n _animateOut(el, animLeave, transition, () => { el.style.display = \"none\"; }, animDuration);\n } else {\n el.style.display = \"none\";\n }\n }\n }\n _watchExpr(expr, ctx, update);\n update();\n },\n});\n\nregisterDirective(\"switch\", {\n priority: 10,\n init(el, name, expr) {\n const ctx = findContext(el);\n\n function update() {\n const val = evaluate(expr, ctx);\n let matched = false;\n\n for (const child of [...el.children]) {\n const caseVal = child.getAttribute(\"case\");\n const isDefault = child.hasAttribute(\"default\");\n const thenTpl = child.getAttribute(\"then\");\n\n if (caseVal) {\n // Support multi-value: case=\"'a','b'\"\n const values = caseVal\n .split(\",\")\n .map((v) => evaluate(v.trim(), ctx));\n if (!matched && values.includes(val)) {\n matched = true;\n child.style.display = \"\";\n if (thenTpl) {\n const clone = _cloneTemplate(thenTpl);\n if (clone) {\n child.innerHTML = \"\";\n child.appendChild(clone);\n }\n child.__declared = false;\n processTree(child);\n }\n } else {\n child.style.display = \"none\";\n }\n } else if (isDefault) {\n child.style.display = matched ? \"none\" : \"\";\n if (!matched && thenTpl) {\n const clone = _cloneTemplate(thenTpl);\n if (clone) {\n child.innerHTML = \"\";\n child.appendChild(clone);\n }\n child.__declared = false;\n processTree(child);\n }\n }\n }\n }\n\n ctx.$watch(update);\n update();\n },\n});\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: each, foreach\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { createContext } from \"../context.js\";\nimport { evaluate, resolve } from \"../evaluate.js\";\nimport { findContext, _cloneTemplate } from \"../dom.js\";\nimport { registerDirective, processTree } from \"../registry.js\";\nimport { _animateOut } from \"../animations.js\";\n\nregisterDirective(\"each\", {\n priority: 10,\n init(el, name, expr) {\n const ctx = findContext(el);\n const match = expr.match(/^(\\w+)\\s+in\\s+(\\S+)$/);\n if (!match) return;\n const [, itemName, listPath] = match;\n const tplId = el.getAttribute(\"template\");\n const elseTpl = el.getAttribute(\"else\");\n const keyExpr = el.getAttribute(\"key\");\n const animEnter =\n el.getAttribute(\"animate-enter\") || el.getAttribute(\"animate\");\n const animLeave = el.getAttribute(\"animate-leave\");\n const stagger = parseInt(el.getAttribute(\"animate-stagger\")) || 0;\n const animDuration = parseInt(el.getAttribute(\"animate-duration\")) || 0;\n\n function update() {\n let list = resolve(listPath, ctx);\n if (!Array.isArray(list)) return;\n\n // Empty state\n if (list.length === 0 && elseTpl) {\n const clone = _cloneTemplate(elseTpl);\n if (clone) {\n el.innerHTML = \"\";\n el.appendChild(clone);\n processTree(el);\n }\n return;\n }\n\n const tpl = tplId ? document.getElementById(tplId) : null;\n if (!tpl) return;\n\n // Animate out old items if animate-leave is set\n if (animLeave && el.children.length > 0) {\n const oldItems = [...el.children];\n let remaining = oldItems.length;\n oldItems.forEach((child) => {\n const target = child.firstElementChild || child;\n target.classList.add(animLeave);\n const done = () => {\n target.classList.remove(animLeave);\n remaining--;\n if (remaining <= 0) renderItems(tpl, list);\n };\n target.addEventListener(\"animationend\", done, { once: true });\n setTimeout(done, animDuration || 2000);\n });\n } else {\n renderItems(tpl, list);\n }\n }\n\n function renderItems(tpl, list) {\n const count = list.length;\n el.innerHTML = \"\";\n\n list.forEach((item, i) => {\n const childData = {\n [itemName]: item,\n $index: i,\n $count: count,\n $first: i === 0,\n $last: i === count - 1,\n $even: i % 2 === 0,\n $odd: i % 2 !== 0,\n };\n const childCtx = createContext(childData, ctx);\n\n const clone = tpl.content.cloneNode(true);\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = childCtx;\n wrapper.appendChild(clone);\n el.appendChild(wrapper);\n processTree(wrapper);\n\n if (animEnter) {\n const firstChild = wrapper.firstElementChild;\n if (firstChild) {\n firstChild.classList.add(animEnter);\n // Stagger animation \u2014 delay must be on the child, not the wrapper\n if (stagger) {\n firstChild.style.animationDelay = i * stagger + \"ms\";\n }\n }\n }\n });\n }\n\n ctx.$watch(update);\n update();\n },\n});\n\nregisterDirective(\"foreach\", {\n priority: 10,\n init(el, name, itemName) {\n const ctx = findContext(el);\n const fromPath = el.getAttribute(\"from\");\n const indexName = el.getAttribute(\"index\") || \"$index\";\n const elseTpl = el.getAttribute(\"else\");\n const filterExpr = el.getAttribute(\"filter\");\n const sortProp = el.getAttribute(\"sort\");\n const limit = parseInt(el.getAttribute(\"limit\")) || Infinity;\n const offset = parseInt(el.getAttribute(\"offset\")) || 0;\n const tplId = el.getAttribute(\"template\");\n const animEnter = el.getAttribute(\"animate-enter\") || el.getAttribute(\"animate\");\n const animLeave = el.getAttribute(\"animate-leave\");\n const stagger = parseInt(el.getAttribute(\"animate-stagger\")) || 0;\n const animDuration = parseInt(el.getAttribute(\"animate-duration\")) || 0;\n\n if (!fromPath || !itemName) return;\n\n const templateContent = tplId\n ? null // Will use external template\n : el.cloneNode(true); // Use the element itself as template\n\n function update() {\n let list = resolve(fromPath, ctx);\n if (!Array.isArray(list)) return;\n\n // Filter\n if (filterExpr) {\n list = list.filter((item, i) => {\n const tempCtx = createContext(\n { [itemName]: item, [indexName]: i },\n ctx,\n );\n return !!evaluate(filterExpr, tempCtx);\n });\n }\n\n // Sort\n if (sortProp) {\n const desc = sortProp.startsWith(\"-\");\n const key = desc ? sortProp.slice(1) : sortProp;\n list = [...list].sort((a, b) => {\n const va = resolve(key, a) ?? a?.[key];\n const vb = resolve(key, b) ?? b?.[key];\n const r = va < vb ? -1 : va > vb ? 1 : 0;\n return desc ? -r : r;\n });\n }\n\n // Offset and limit\n list = list.slice(offset, offset + limit);\n\n // Empty\n if (list.length === 0 && elseTpl) {\n const clone = _cloneTemplate(elseTpl);\n if (clone) {\n el.innerHTML = \"\";\n el.appendChild(clone);\n processTree(el);\n }\n return;\n }\n\n const tpl = tplId ? document.getElementById(tplId) : null;\n const count = list.length;\n\n function renderForeachItems() {\n el.innerHTML = \"\";\n list.forEach((item, i) => {\n const childData = {\n [itemName]: item,\n [indexName]: i,\n $index: i,\n $count: count,\n $first: i === 0,\n $last: i === count - 1,\n $even: i % 2 === 0,\n $odd: i % 2 !== 0,\n };\n const childCtx = createContext(childData, ctx);\n\n let clone;\n if (tpl) {\n clone = tpl.content.cloneNode(true);\n } else {\n clone = templateContent.cloneNode(true);\n }\n\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = childCtx;\n wrapper.appendChild(clone);\n el.appendChild(wrapper);\n processTree(wrapper);\n\n if (animEnter) {\n const firstChild = wrapper.firstElementChild;\n if (firstChild) {\n firstChild.classList.add(animEnter);\n // Stagger animation \u2014 delay must be on the child, not the wrapper\n if (stagger) {\n firstChild.style.animationDelay = (i * stagger) + \"ms\";\n }\n }\n }\n });\n }\n\n // Animate out old items if animate-leave is set\n if (animLeave && el.children.length > 0) {\n const oldItems = [...el.children];\n let remaining = oldItems.length;\n oldItems.forEach((child) => {\n const target = child.firstElementChild || child;\n target.classList.add(animLeave);\n const done = () => {\n target.classList.remove(animLeave);\n remaining--;\n if (remaining <= 0) renderForeachItems();\n };\n target.addEventListener(\"animationend\", done, { once: true });\n setTimeout(done, animDuration || 2000);\n });\n } else {\n renderForeachItems();\n }\n }\n\n ctx.$watch(update);\n update();\n },\n});\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: class-*, style-*\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { evaluate } from \"../evaluate.js\";\nimport { findContext } from \"../dom.js\";\nimport { registerDirective } from \"../registry.js\";\nimport { _watchI18n } from \"../i18n.js\";\n\nregisterDirective(\"class-*\", {\n priority: 20,\n init(el, name, expr) {\n const suffix = name.replace(\"class-\", \"\");\n const ctx = findContext(el);\n\n // class-map=\"{ active: x, bold: y }\"\n if (suffix === \"map\") {\n function update() {\n const obj = evaluate(expr, ctx);\n if (obj && typeof obj === \"object\") {\n for (const [cls, cond] of Object.entries(obj)) {\n el.classList.toggle(cls, !!cond);\n }\n }\n }\n ctx.$watch(update);\n update();\n return;\n }\n\n // class-list=\"['a', condition ? 'b' : 'c']\"\n if (suffix === \"list\") {\n let prevClasses = [];\n function update() {\n const arr = evaluate(expr, ctx);\n if (Array.isArray(arr)) {\n prevClasses.forEach((cls) => {\n if (cls) el.classList.remove(cls);\n });\n const next = arr.filter(Boolean);\n next.forEach((cls) => el.classList.add(cls));\n prevClasses = next;\n }\n }\n ctx.$watch(update);\n update();\n return;\n }\n\n // class-{name}=\"expr\"\n function update() {\n el.classList.toggle(suffix, !!evaluate(expr, ctx));\n }\n ctx.$watch(update);\n if (expr.includes(\"NoJS.locale\")) _watchI18n(update);\n update();\n },\n});\n\nregisterDirective(\"style-*\", {\n priority: 20,\n init(el, name, expr) {\n const suffix = name.replace(\"style-\", \"\");\n const ctx = findContext(el);\n\n // style-map=\"{ color: x, fontSize: y }\"\n if (suffix === \"map\") {\n function update() {\n const obj = evaluate(expr, ctx);\n if (obj && typeof obj === \"object\") {\n for (const [prop, val] of Object.entries(obj)) {\n el.style[prop] = val ?? \"\";\n }\n }\n }\n ctx.$watch(update);\n update();\n return;\n }\n\n // style-{property}=\"expr\" (e.g. style-color, style-font-size)\n const cssProp = suffix.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n function update() {\n const val = evaluate(expr, ctx);\n el.style[cssProp] = val != null ? String(val) : \"\";\n }\n ctx.$watch(update);\n update();\n },\n});\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: on:*, trigger\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { evaluate, _execStatement } from \"../evaluate.js\";\nimport { findContext } from \"../dom.js\";\nimport { registerDirective } from \"../registry.js\";\nimport { _onDispose } from \"../globals.js\";\n\nregisterDirective(\"on:*\", {\n priority: 20,\n init(el, name, expr) {\n const ctx = findContext(el);\n const parts = name.replace(\"on:\", \"\").split(\".\");\n const event = parts[0];\n const modifiers = new Set(parts.slice(1));\n\n // Lifecycle hooks\n if (event === \"mounted\") {\n requestAnimationFrame(() => _execStatement(expr, ctx, { $el: el }));\n return;\n }\n if (event === \"init\") {\n _execStatement(expr, ctx, { $el: el });\n return;\n }\n if (event === \"updated\") {\n const updatedObserver = new MutationObserver(() => {\n _execStatement(expr, ctx, { $el: el });\n });\n updatedObserver.observe(el, { childList: true, subtree: true, characterData: true, attributes: true });\n _onDispose(() => updatedObserver.disconnect());\n return;\n }\n if (event === \"error\") {\n const errorHandler = (e) => {\n if (el.contains(e.target) || e.target === el) {\n _execStatement(expr, ctx, { $el: el, $error: e.error || e.message });\n }\n };\n window.addEventListener(\"error\", errorHandler);\n _onDispose(() => window.removeEventListener(\"error\", errorHandler));\n return;\n }\n if (event === \"unmounted\") {\n const observer = new MutationObserver((mutations) => {\n for (const m of mutations) {\n for (const node of m.removedNodes) {\n if (node === el || node.contains?.(el)) {\n _execStatement(expr, ctx, { $el: el });\n observer.disconnect();\n return;\n }\n }\n }\n });\n if (el.parentElement)\n observer.observe(el.parentElement, { childList: true });\n return;\n }\n\n // Debounce / throttle\n let debounceMs = 0;\n let throttleMs = 0;\n for (const mod of modifiers) {\n if (/^\\d+$/.test(mod)) {\n if (modifiers.has(\"debounce\")) debounceMs = parseInt(mod);\n else if (modifiers.has(\"throttle\")) throttleMs = parseInt(mod);\n }\n }\n\n let handler = (e) => {\n // Key modifiers\n if (event === \"keydown\" || event === \"keyup\" || event === \"keypress\") {\n const keyMods = [\n \"enter\",\n \"escape\",\n \"tab\",\n \"space\",\n \"delete\",\n \"backspace\",\n \"up\",\n \"down\",\n \"left\",\n \"right\",\n \"ctrl\",\n \"alt\",\n \"shift\",\n \"meta\",\n ];\n for (const mod of modifiers) {\n if (!keyMods.includes(mod)) continue;\n if (mod === \"enter\" && e.key !== \"Enter\") return;\n if (mod === \"escape\" && e.key !== \"Escape\") return;\n if (mod === \"tab\" && e.key !== \"Tab\") return;\n if (mod === \"space\" && e.key !== \" \") return;\n if (mod === \"delete\" && e.key !== \"Delete\" && e.key !== \"Backspace\")\n return;\n if (mod === \"up\" && e.key !== \"ArrowUp\") return;\n if (mod === \"down\" && e.key !== \"ArrowDown\") return;\n if (mod === \"left\" && e.key !== \"ArrowLeft\") return;\n if (mod === \"right\" && e.key !== \"ArrowRight\") return;\n if (mod === \"ctrl\" && !e.ctrlKey) return;\n if (mod === \"alt\" && !e.altKey) return;\n if (mod === \"shift\" && !e.shiftKey) return;\n if (mod === \"meta\" && !e.metaKey) return;\n }\n }\n\n if (modifiers.has(\"prevent\")) e.preventDefault();\n if (modifiers.has(\"stop\")) e.stopPropagation();\n if (modifiers.has(\"self\") && e.target !== el) return;\n\n _execStatement(expr, ctx, { $event: e, $el: el });\n };\n\n // Wrap with debounce\n if (debounceMs > 0) {\n const original = handler;\n let timer;\n handler = (e) => {\n clearTimeout(timer);\n timer = setTimeout(() => original(e), debounceMs);\n };\n }\n\n // Wrap with throttle\n if (throttleMs > 0) {\n const original = handler;\n let last = 0;\n handler = (e) => {\n const now = Date.now();\n if (now - last >= throttleMs) {\n last = now;\n original(e);\n }\n };\n }\n\n const opts = {};\n if (modifiers.has(\"once\")) opts.once = true;\n\n el.addEventListener(event, handler, opts);\n },\n});\n\nregisterDirective(\"trigger\", {\n priority: 20,\n init(el, name, eventName) {\n const ctx = findContext(el);\n const dataExpr = el.getAttribute(\"trigger-data\");\n el.addEventListener(\"click\", () => {\n const detail = dataExpr ? evaluate(dataExpr, ctx) : null;\n el.dispatchEvent(new CustomEvent(eventName, { detail, bubbles: true }));\n });\n },\n});\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: ref, use, call\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport {\n _refs,\n _stores,\n _notifyStoreWatchers,\n} from \"../globals.js\";\nimport { createContext } from \"../context.js\";\nimport { evaluate, _execStatement, _interpolate } from \"../evaluate.js\";\nimport { _doFetch } from \"../fetch.js\";\nimport { findContext, _cloneTemplate } from \"../dom.js\";\nimport { registerDirective, processTree } from \"../registry.js\";\n\nregisterDirective(\"ref\", {\n priority: 5,\n init(el, name, refName) {\n _refs[refName] = el;\n },\n});\n\nregisterDirective(\"use\", {\n priority: 10,\n init(el, name, tplId) {\n const ctx = findContext(el);\n const clone = _cloneTemplate(tplId);\n if (!clone) return;\n\n // Collect var-* attributes\n const vars = {};\n for (const attr of [...el.attributes]) {\n if (attr.name.startsWith(\"var-\")) {\n const varName = attr.name.replace(\"var-\", \"\");\n vars[varName] = evaluate(attr.value, ctx);\n }\n }\n\n const childCtx = createContext(vars, ctx);\n\n // Handle slots\n const slots = {};\n for (const child of [...el.children]) {\n const slotName = child.getAttribute(\"slot\") || \"default\";\n if (!slots[slotName])\n slots[slotName] = document.createDocumentFragment();\n slots[slotName].appendChild(child.cloneNode(true));\n }\n\n // Replace <slot> elements in template\n const slotEls = clone.querySelectorAll(\"slot\");\n for (const slotEl of slotEls) {\n const slotName = slotEl.getAttribute(\"name\") || \"default\";\n if (slots[slotName]) {\n slotEl.replaceWith(slots[slotName]);\n }\n }\n\n el.innerHTML = \"\";\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = childCtx;\n wrapper.appendChild(clone);\n el.appendChild(wrapper);\n processTree(wrapper);\n },\n});\n\nregisterDirective(\"call\", {\n priority: 20,\n init(el, name, url) {\n const ctx = findContext(el);\n const method = el.getAttribute(\"method\") || \"get\";\n const asKey = el.getAttribute(\"as\");\n const intoStore = el.getAttribute(\"into\");\n const successTpl = el.getAttribute(\"success\");\n const errorTpl = el.getAttribute(\"error\");\n const thenExpr = el.getAttribute(\"then\");\n const confirmMsg = el.getAttribute(\"confirm\");\n const bodyAttr = el.getAttribute(\"body\");\n\n el.addEventListener(\"click\", async (e) => {\n e.preventDefault();\n if (confirmMsg && !window.confirm(confirmMsg)) return;\n\n const resolvedUrl = _interpolate(url, ctx);\n try {\n let reqBody = null;\n if (bodyAttr) {\n const interpolated = _interpolate(bodyAttr, ctx);\n try {\n reqBody = JSON.parse(interpolated);\n } catch {\n reqBody = interpolated;\n }\n }\n const data = await _doFetch(resolvedUrl, method, reqBody, {}, el);\n if (asKey) ctx.$set(asKey, data);\n if (asKey && intoStore) {\n if (!_stores[intoStore]) _stores[intoStore] = createContext({});\n _stores[intoStore].$set(asKey, data);\n _notifyStoreWatchers();\n }\n if (thenExpr) _execStatement(thenExpr, ctx, { result: data });\n if (successTpl) {\n const clone = _cloneTemplate(successTpl);\n if (clone) {\n const tplEl = document.getElementById(\n successTpl.replace(\"#\", \"\"),\n );\n const vn = tplEl?.getAttribute(\"var\") || \"result\";\n const childCtx = createContext({ [vn]: data }, ctx);\n const target = el.closest(\"[route-view]\") || el.parentElement;\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = childCtx;\n wrapper.appendChild(clone);\n target.appendChild(wrapper);\n processTree(wrapper);\n }\n }\n } catch (err) {\n if (errorTpl) {\n const clone = _cloneTemplate(errorTpl);\n if (clone) {\n const tplEl = document.getElementById(errorTpl.replace(\"#\", \"\"));\n const vn = tplEl?.getAttribute(\"var\") || \"err\";\n const childCtx = createContext(\n { [vn]: { message: err.message, status: err.status } },\n ctx,\n );\n const target = el.parentElement;\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = childCtx;\n wrapper.appendChild(clone);\n target.appendChild(wrapper);\n processTree(wrapper);\n }\n }\n }\n });\n },\n});\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVES: validate, error-boundary\n// HELPER: _validateField\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _validators, _onDispose } from \"../globals.js\";\nimport { createContext } from \"../context.js\";\nimport { findContext, _cloneTemplate } from \"../dom.js\";\nimport { registerDirective, processTree } from \"../registry.js\";\n\nfunction _validateField(value, rules, allValues) {\n const ruleList = rules.split(\"|\").map((r) => r.trim());\n for (const rule of ruleList) {\n const [name, ...args] = rule.split(\":\");\n const fn = _validators[name];\n if (fn) {\n const result = fn(value, ...args, allValues);\n if (result !== true && result) return result;\n } else {\n // Built-in validators\n switch (name) {\n case \"required\":\n if (value == null || String(value).trim() === \"\")\n return \"Required\";\n break;\n case \"email\":\n if (value && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value))\n return \"Invalid email\";\n break;\n case \"url\":\n try {\n new URL(value);\n } catch {\n return \"Invalid URL\";\n }\n break;\n case \"min\":\n if (Number(value) < Number(args[0]))\n return `Minimum value is ${args[0]}`;\n break;\n case \"max\":\n if (Number(value) > Number(args[0]))\n return `Maximum value is ${args[0]}`;\n break;\n case \"between\": {\n const n = Number(value);\n if (n < Number(args[0]) || n > Number(args[1]))\n return `Must be between ${args[0]} and ${args[1]}`;\n break;\n }\n case \"match\":\n if (value !== allValues[args[0]]) return `Must match ${args[0]}`;\n break;\n case \"phone\":\n if (!/^[\\d\\s\\-+()]{7,15}$/.test(value))\n return \"Invalid phone number\";\n break;\n case \"cpf\":\n if (!/^\\d{3}\\.?\\d{3}\\.?\\d{3}-?\\d{2}$/.test(value))\n return \"Invalid CPF\";\n break;\n case \"cnpj\":\n if (!/^\\d{2}\\.?\\d{3}\\.?\\d{3}\\/?\\d{4}-?\\d{2}$/.test(value))\n return \"Invalid CNPJ\";\n break;\n case \"creditcard\":\n if (!/^\\d{13,19}$/.test(value.replace(/\\s|-/g, \"\")))\n return \"Invalid card number\";\n break;\n case \"custom\":\n if (args[0] && _validators[args[0]]) {\n const result = _validators[args[0]](value, allValues);\n if (result !== true && result) return result;\n }\n break;\n }\n }\n }\n return null;\n}\n\nregisterDirective(\"validate\", {\n priority: 30,\n init(el, name, rules) {\n const ctx = findContext(el);\n\n // If on a form, set up form-level validation\n if (el.tagName === \"FORM\") {\n const formCtx = {\n valid: false,\n dirty: false,\n touched: false,\n submitting: false,\n errors: {},\n values: {},\n reset: () => {\n formCtx.dirty = false;\n formCtx.touched = false;\n el.reset();\n checkValidity();\n },\n };\n ctx.$set(\"$form\", formCtx);\n\n function checkValidity() {\n const errors = {};\n const values = {};\n let valid = true;\n\n for (const field of el.querySelectorAll(\"input, textarea, select\")) {\n if (!field.name) continue;\n values[field.name] = field.value;\n\n const fieldRules = field.getAttribute(\"validate\");\n if (fieldRules) {\n const err = _validateField(field.value, fieldRules, values);\n if (err) {\n errors[field.name] = err;\n valid = false;\n }\n }\n\n if (!field.checkValidity()) {\n errors[field.name] =\n errors[field.name] || field.validationMessage;\n valid = false;\n }\n }\n\n formCtx.valid = valid;\n formCtx.errors = errors;\n formCtx.values = values;\n ctx.$set(\"$form\", { ...formCtx });\n }\n\n el.addEventListener(\"input\", () => {\n formCtx.dirty = true;\n checkValidity();\n });\n el.addEventListener(\"focusout\", () => {\n formCtx.touched = true;\n checkValidity();\n });\n el.addEventListener(\"submit\", () => {\n formCtx.submitting = true;\n ctx.$set(\"$form\", { ...formCtx });\n requestAnimationFrame(() => {\n formCtx.submitting = false;\n ctx.$set(\"$form\", { ...formCtx });\n });\n });\n\n // Initial check\n requestAnimationFrame(checkValidity);\n return;\n }\n\n // Field-level validation\n if (\n rules &&\n (el.tagName === \"INPUT\" ||\n el.tagName === \"TEXTAREA\" ||\n el.tagName === \"SELECT\")\n ) {\n const errorTpl = el.getAttribute(\"error\");\n el.addEventListener(\"input\", () => {\n const err = _validateField(el.value, rules, {});\n if (err && errorTpl) {\n // Show error\n let errorEl = el.nextElementSibling?.__validationError\n ? el.nextElementSibling\n : null;\n if (!errorEl) {\n errorEl = document.createElement(\"div\");\n errorEl.__validationError = true;\n errorEl.style.display = \"contents\";\n el.parentNode.insertBefore(errorEl, el.nextSibling);\n }\n const clone = _cloneTemplate(errorTpl);\n if (clone) {\n const childCtx = createContext({ err: { message: err } }, ctx);\n errorEl.innerHTML = \"\";\n errorEl.__ctx = childCtx;\n errorEl.appendChild(clone);\n processTree(errorEl);\n }\n } else {\n const errorEl = el.nextElementSibling?.__validationError\n ? el.nextElementSibling\n : null;\n if (errorEl) errorEl.innerHTML = \"\";\n }\n });\n }\n },\n});\n\nregisterDirective(\"error-boundary\", {\n priority: 1,\n init(el, name, fallbackTpl) {\n const ctx = findContext(el);\n\n function showFallback(message) {\n const clone = _cloneTemplate(fallbackTpl);\n if (clone) {\n const childCtx = createContext(\n { err: { message } },\n ctx,\n );\n el.innerHTML = \"\";\n const wrapper = document.createElement(\"div\");\n wrapper.style.display = \"contents\";\n wrapper.__ctx = childCtx;\n wrapper.appendChild(clone);\n el.appendChild(wrapper);\n processTree(wrapper);\n }\n }\n\n // Listen for NoJS expression errors dispatched from event handlers\n el.addEventListener(\"nojs:error\", (e) => {\n showFallback(e.detail?.message || \"An error occurred\");\n });\n\n // Listen for window-level errors (resource load failures, etc.)\n const errorHandler = (e) => {\n if (el.contains(e.target) || el === e.target) {\n showFallback(e.message || \"An error occurred\");\n }\n };\n window.addEventListener(\"error\", errorHandler);\n _onDispose(() => window.removeEventListener(\"error\", errorHandler));\n },\n});\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// DIRECTIVE: t (i18n translations)\n// DIRECTIVE: i18n-ns (load namespace before children)\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { _i18n, _watchI18n, _loadI18nNamespace, _notifyI18n } from \"../i18n.js\";\nimport { evaluate } from \"../evaluate.js\";\nimport { findContext } from \"../dom.js\";\nimport { registerDirective, processTree } from \"../registry.js\";\n\nregisterDirective(\"t\", {\n priority: 20,\n init(el, name, key) {\n const ctx = findContext(el);\n const useHtml = el.hasAttribute(\"t-html\");\n\n function update() {\n const params = {};\n for (const attr of [...el.attributes]) {\n if (attr.name.startsWith(\"t-\") && attr.name !== \"t\" && attr.name !== \"t-html\") {\n const paramName = attr.name.replace(\"t-\", \"\");\n params[paramName] = evaluate(attr.value, ctx) ?? attr.value;\n }\n }\n const text = _i18n.t(key, params);\n if (useHtml) {\n el.innerHTML = text;\n } else {\n el.textContent = text;\n }\n }\n\n ctx.$watch(update);\n _watchI18n(update);\n update();\n },\n});\n\nregisterDirective(\"i18n-ns\", {\n priority: 1,\n init(el, name, ns) {\n // Save children to prevent premature t resolution\n const saved = document.createDocumentFragment();\n while (el.firstChild) saved.appendChild(el.firstChild);\n\n _loadI18nNamespace(ns).then(() => {\n el.appendChild(saved);\n processTree(el);\n _notifyI18n();\n });\n },\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["_setCurrentEl", "el", "_currentEl", "setRouterInstance", "r", "_routerInstance", "_log", "args", "_config", "_warn", "_notifyStoreWatchers", "fn", "_storeWatchers", "_watchExpr", "expr", "ctx", "_onDispose", "_emitEvent", "name", "data", "_eventBus", "_interceptors", "_stores", "_filters", "_validators", "_cache", "_refs", "init_globals", "__esmMin", "i18n_exports", "__export", "_deepMerge", "_i18n", "_i18nCache", "_i18nListeners", "_loadI18nForLocale", "_loadI18nNamespace", "_loadLocale", "_loadedNs", "_notifyI18n", "_watchI18n", "fn", "target", "source", "out", "key", "locale", "ns", "cacheKey", "_config", "url", "res", "_warn", "data", "toMerge", "e", "n", "locales", "l", "init_i18n", "__esmMin", "init_globals", "v", "allNs", "params", "messages", "msg", "k", "forms", "_", "index_exports", "__export", "index_default", "__toCommonJS", "init_globals", "init_i18n", "init_globals", "init_i18n", "_batchDepth", "_batchQueue", "createContext", "data", "parent", "listeners", "raw", "notifying", "notify", "_batchDepth", "fn", "_batchQueue", "handler", "target", "key", "_currentEl", "k", "v", "proxy", "_refs", "_stores", "_routerInstance", "_i18n", "value", "old", "_collectKeys", "ctx", "allKeys", "allVals", "c", "init_globals", "init_i18n", "_exprCache", "_cspSafeEval", "expr", "keys", "vals", "scope", "i", "resolvePath", "path", "obj", "o", "k", "parseValue", "token", "t", "trimmed", "ternaryMatch", "cond", "parts", "part", "val", "last", "cmpMatch", "left", "right", "_parsePipes", "exprStr", "current", "depth", "inStr", "strChar", "ch", "_applyFilter", "value", "filterStr", "colonIdx", "name", "argStr", "fn", "_filters", "_warn", "args", "_parseFilterArgs", "str", "a", "n", "evaluate", "ctx", "pipes", "mainExpr", "_collectKeys", "specialKeys", "sk", "keyArr", "valArr", "result", "_config", "cacheKey", "_execStatement", "extraVars", "specials", "_stores", "_routerInstance", "_i18n", "v", "chainKeys", "_wCtx", "setters", "_notifyStoreWatchers", "e", "resolve", "_interpolate", "_", "init_globals", "init_globals", "resolveUrl", "url", "el", "node", "base", "_config", "_doFetch", "method", "body", "extraHeaders", "externalSignal", "fullUrl", "opts", "fn", "_interceptors", "maxRetries", "lastError", "attempt", "controller", "timeout", "response", "errBody", "err", "text", "e", "r", "_cacheGet", "key", "strategy", "entry", "_cache", "store", "raw", "_cacheSet", "data", "_templateHtmlCache", "findContext", "el", "node", "createContext", "_clearDeclared", "walker", "_cloneTemplate", "id", "cleanId", "tpl", "_sanitizeHtml", "html", "_config", "_resolveTemplateSrc", "src", "resolveUrl", "_loadRemoteTemplates", "root", "scope", "templates", "_log", "t", "promises", "resolvedUrl", "baseFolder", "useCache", "children", "parent", "ref", "child", "e", "_warn", "_loadTemplateElement", "loadingMarker", "loadingId", "source", "_processTemplateIncludes", "_loadRemoteTemplatesPhase1", "defaultRoutePath", "all", "phase0", "phase1", "lazy", "_loadRemoteTemplatesPhase2", "phase2", "init_globals", "init_i18n", "_directives", "registerDirective", "name", "handler", "_matchDirective", "attrName", "patterns", "p", "prefix", "processElement", "el", "matched", "attr", "m", "a", "b", "prev", "_currentEl", "_setCurrentEl", "processTree", "root", "walker", "node", "_disposeElement", "fn", "_storeWatchers", "_i18nListeners", "_disposeTree", "init_globals", "_stylesInjected", "_injectBuiltInStyles", "css", "style", "_animateIn", "el", "animName", "transitionName", "durationMs", "fallback", "target", "done", "_animateOut", "callback", "_createRouter", "routes", "current", "listeners", "_autoTemplateCache", "_getOrCreateEntry", "path", "entry", "r", "parseQuery", "search", "params", "v", "k", "matchRoute", "route", "paramNames", "pattern", "name", "regex", "match", "i", "navigate", "replace", "hashIdx", "hash", "withoutHash", "cleanPath", "matched", "tpl", "guardExpr", "redirectPath", "ctx", "createContext", "_stores", "evaluate", "_config", "newHash", "fullPath", "_renderRoute", "fn", "anchorId", "el", "outletEls", "outletEl", "outletAttr", "outletName", "configTemplates", "baseSrc", "ext", "indexName", "segment", "fullSrc", "cacheKey", "_log", "_disposeTree", "_loadTemplateElement", "i18nNs", "_loadI18nNamespace", "clone", "routeCtx", "findContext", "wrapper", "_processTemplateIncludes", "nestedTpls", "t", "transition", "_animateIn", "_clearDeclared", "processTree", "link", "routePath", "activeClass", "exactClass", "isActive", "scrollBehavior", "_scrollToAnchor", "id", "selector", "a", "templateEl", "outlet", "e", "anchor", "target", "raw", "init_globals", "_filters", "v", "c", "len", "s", "decimals", "n", "code", "units", "i", "size", "mod", "sep", "key", "desc", "k", "a", "b", "va", "vb", "r", "val", "fmt", "d", "opts", "diff", "def", "indent", "init_globals", "registerDirective", "el", "name", "value", "data", "evaluate", "createContext", "parent", "findContext", "ctx", "persist", "persistKey", "store", "saved", "parsed", "k", "v", "_log", "storeName", "valueAttr", "_stores", "computedName", "expr", "update", "val", "watchExpr", "onChange", "lastVal", "newVal", "oldVal", "_execStatement", "init_globals", "HTTP_METHODS", "method", "registerDirective", "el", "name", "url", "asKey", "loadingTpl", "errorTpl", "emptyTpl", "successTpl", "thenExpr", "redirectPath", "confirmMsg", "refreshInterval", "cachedRaw", "cacheStrategy", "bodyAttr", "headersAttr", "varName", "intoStore", "retryCount", "_config", "retryDelay", "paramsAttr", "parentCtx", "findContext", "createContext", "ctx", "originalChildren", "n", "_activeAbort", "doRequest", "resolvedUrl", "_interpolate", "paramsObj", "evaluate", "sep", "qs", "cacheKey", "cached", "_cacheGet", "_clearDeclared", "processTree", "clone", "_cloneTemplate", "reqBody", "interpolated", "formData", "extraHeaders", "savedRetries", "savedRetryDelay", "data", "_doFetch", "_cacheSet", "_stores", "_notifyStoreWatchers", "vn", "childCtx", "wrapper", "child", "_execStatement", "_routerInstance", "_emitEvent", "err", "_warn", "e", "onAncestorChange", "newUrl", "_lastResolvedUrl", "_debounceTimer", "debounceMs", "ancestor", "id", "_onDispose", "init_globals", "registerDirective", "el", "name", "expr", "ctx", "findContext", "update", "val", "evaluate", "_watchExpr", "_sanitizeHtml", "attrName", "_execStatement", "tag", "type", "event", "init_globals", "registerDirective", "el", "name", "expr", "ctx", "findContext", "thenId", "elseId", "animEnter", "animLeave", "transition", "animDuration", "originalChildren", "n", "currentState", "update", "result", "evaluate", "_animateOut", "render", "clone", "_cloneTemplate", "child", "_clearDeclared", "processTree", "_animateIn", "prev", "prevExpr", "_watchExpr", "val", "matched", "caseVal", "isDefault", "thenTpl", "values", "v", "registerDirective", "el", "name", "expr", "ctx", "findContext", "match", "itemName", "listPath", "tplId", "elseTpl", "keyExpr", "animEnter", "animLeave", "stagger", "animDuration", "update", "list", "resolve", "clone", "_cloneTemplate", "processTree", "tpl", "oldItems", "remaining", "child", "target", "done", "renderItems", "count", "item", "i", "childData", "childCtx", "createContext", "wrapper", "firstChild", "fromPath", "indexName", "filterExpr", "sortProp", "limit", "offset", "templateContent", "tempCtx", "evaluate", "desc", "key", "a", "b", "va", "vb", "r", "renderForeachItems", "init_i18n", "registerDirective", "el", "name", "expr", "suffix", "ctx", "findContext", "update", "obj", "evaluate", "cls", "cond", "arr", "prevClasses", "next", "_watchI18n", "prop", "val", "cssProp", "_", "c", "init_globals", "registerDirective", "el", "name", "expr", "ctx", "findContext", "parts", "event", "modifiers", "_execStatement", "updatedObserver", "_onDispose", "errorHandler", "e", "observer", "mutations", "m", "node", "debounceMs", "throttleMs", "mod", "handler", "keyMods", "original", "timer", "last", "now", "opts", "eventName", "dataExpr", "detail", "evaluate", "init_globals", "registerDirective", "el", "name", "refName", "_refs", "tplId", "ctx", "findContext", "clone", "_cloneTemplate", "vars", "attr", "varName", "evaluate", "childCtx", "createContext", "slots", "child", "slotName", "slotEls", "slotEl", "wrapper", "processTree", "url", "method", "asKey", "intoStore", "successTpl", "errorTpl", "thenExpr", "confirmMsg", "bodyAttr", "e", "resolvedUrl", "_interpolate", "reqBody", "interpolated", "data", "_doFetch", "_stores", "_notifyStoreWatchers", "_execStatement", "vn", "target", "err", "init_globals", "_validateField", "value", "rules", "allValues", "ruleList", "r", "rule", "name", "args", "fn", "_validators", "result", "n", "registerDirective", "el", "ctx", "findContext", "checkValidity", "errors", "values", "valid", "field", "fieldRules", "err", "formCtx", "errorTpl", "errorEl", "clone", "_cloneTemplate", "childCtx", "createContext", "processTree", "fallbackTpl", "showFallback", "message", "wrapper", "e", "errorHandler", "_onDispose", "init_i18n", "registerDirective", "el", "name", "key", "ctx", "findContext", "useHtml", "update", "params", "attr", "paramName", "evaluate", "text", "_i18n", "_watchI18n", "ns", "saved", "_loadI18nNamespace", "processTree", "_notifyI18n", "_getDefaultRoutePath", "routerCfg", "_config", "base", "NoJS", "v", "_i18n", "opts", "prevHeaders", "prevCache", "prevTemplates", "prevRouter", "prevI18n", "root", "_log", "locales", "l", "_loadI18nForLocale", "_processTemplateIncludes", "defaultRoutePath", "_loadRemoteTemplatesPhase1", "setRouterInstance", "_createRouter", "processTree", "_routerInstance", "_loadRemoteTemplatesPhase2", "_stores", "_refs", "_filters", "_validators", "name", "handler", "registerDirective", "fn", "saved", "browserLang", "prefix", "event", "_eventBus", "f", "type", "_interceptors", "createContext", "evaluate", "findContext", "resolve", "index_default"]
7
7
  }