@erickxavier/no-js 1.3.1 → 1.4.2

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
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", "../../src/directives/dnd.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 else if (url.includes(\"{ns}\")) return; // no namespace to substitute\n\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 _i18n.locales[locale] = _deepMerge(_i18n.locales[locale] || {}, data);\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\";\nimport \"./directives/dnd.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.3.1\",\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 const parts = k.split(\".\");\n if (parts.length === 1) {\n proxy[k] = v;\n } else {\n let obj = proxy;\n for (let i = 0; i < parts.length - 1; i++) {\n obj = obj[parts[i]];\n if (obj == null) return;\n }\n const lastKey = parts[parts.length - 1];\n const old = obj[lastKey];\n obj[lastKey] = v;\n if (old !== v) notify();\n }\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 // Only write back values that actually changed locally, to avoid\n // overwriting proxy mutations made by called functions.\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 origObj = {};\n for (const k of chainKeys) {\n if (!k.startsWith(\"$\") && k in vals) origObj[k] = vals[k];\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){if(typeof ${k}!=='undefined'){if(${k}!==__orig['${k}'])_c.$set('${k}',${k});else if(typeof ${k}==='object'&&${k}!==null)_c.$notify();}break;}_c=_c.$parent;}}`,\n )\n .join(\"\\n\");\n\n const fn = new Function(\"__ctx\", \"__orig\", ...keyArr, `${expr};\\n${setters}`);\n fn(ctx, origObj, ...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 // Skip if path unchanged (prevents double-processing from programmatic hash set)\n const [p] = raw.split(\"?\");\n if (p === current.path) return;\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 let called = false;\n const done = () => {\n if (called) return;\n called = true;\n target.classList.remove(animName);\n callback();\n };\n target.addEventListener(\"animationend\", done, { once: true });\n setTimeout(done, 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 let called = false;\n const done = () => {\n if (called) return;\n called = true;\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, _watchExpr } 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 _watchExpr(expr, ctx, 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 _watchExpr(watchExpr, ctx, () => {\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 _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 let data;\n try {\n data = await _doFetch(\n resolvedUrl,\n method,\n reqBody,\n extraHeaders,\n el,\n _activeAbort.signal,\n );\n } finally {\n _config.retries = savedRetries;\n _config.retryDelay = savedRetryDelay;\n }\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 _watchExpr(expr, ctx, 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 _watchExpr(expr, ctx, 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 _watchExpr(expr, ctx, 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 _watchExpr(\"\", ctx, 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 _watchExpr(expr, ctx, 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 { _watchExpr } from \"../globals.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 let prevList = null;\n\n function update() {\n let list = /[\\[\\]()\\s+\\-*\\/!?:&|]/.test(listPath)\n ? evaluate(listPath, ctx)\n : resolve(listPath, ctx);\n if (!Array.isArray(list)) return;\n\n // If same list reference and items are rendered, skip re-render\n // and just propagate the notification to child contexts so their\n // watchers (bind, show, model, etc.) can react to parent changes\n // without destroying/recreating the DOM (preserves input focus).\n if (list === prevList && list.length > 0 && el.children.length > 0) {\n for (const child of el.children) {\n if (child.__ctx && child.__ctx.$notify) child.__ctx.$notify();\n }\n return;\n }\n prevList = list;\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 firstChild.addEventListener(\"animationend\", () => firstChild.classList.remove(animEnter), { once: true });\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 _watchExpr(expr, ctx, 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 firstChild.addEventListener(\"animationend\", () => firstChild.classList.remove(animEnter), { once: true });\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 _watchExpr(fromPath, ctx, 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 { _watchExpr } from \"../globals.js\";\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 // Supports space-separated keys: class-map=\"{ 'bg-sky-500 text-white': x }\"\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 const parts = cls.split(/\\s+/).filter(Boolean);\n parts.forEach((c) => el.classList.toggle(c, !!cond));\n }\n }\n }\n _watchExpr(expr, ctx, 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 _watchExpr(expr, ctx, update);\n update();\n return;\n }\n\n // class-{name}=\"expr\"\n function update() {\n el.classList.toggle(suffix, !!evaluate(expr, ctx));\n }\n _watchExpr(expr, ctx, update);\n if (expr.includes(\"$i18n\") || 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 _watchExpr(expr, ctx, 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 _watchExpr(expr, ctx, 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, subtree: true });\n _onDispose(() => observer.disconnect());\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 _onDispose,\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 _onDispose(() => {\n if (_refs[refName] === el) delete _refs[refName];\n });\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 { _watchExpr } from \"../globals.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 _watchExpr(key, ctx, update);\n _watchI18n(update);\n update();\n },\n});\n\nregisterDirective(\"i18n-ns\", {\n priority: 1,\n init(el, name, ns) {\n // Empty ns = marker attribute (e.g. route-view); skip loading\n if (!ns) return;\n\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", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\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: drag, drop, drag-list, drag-multiple\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, resolve } from \"../evaluate.js\";\nimport { findContext } from \"../dom.js\";\nimport { createContext } from \"../context.js\";\nimport { registerDirective, processTree } from \"../registry.js\";\nimport { _onDispose, _warn } from \"../globals.js\";\n\n// \u2500\u2500\u2500 Module-scoped DnD coordination state \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\nconst _dndState = {\n dragging: null, // { item, type, effect, sourceEl, sourceCtx, sourceList, sourceIndex, listDirective }\n selected: new Map(), // group \u2192 Set<{ item, el, ctx }>\n placeholder: null, // current placeholder DOM element\n};\n\n// \u2500\u2500\u2500 Inject built-in DnD styles (once) \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\n// Count visible children, recursing through display:contents wrappers\nfunction _countVisibleChildren(el) {\n let count = 0;\n for (const child of el.children) {\n if (child.classList.contains(\"nojs-drop-placeholder\")) continue;\n const style = child.style || {};\n if (style.display === \"contents\") {\n count += _countVisibleChildren(child);\n } else {\n count++;\n }\n }\n return count;\n}\n\nfunction _injectDndStyles() {\n if (typeof document === \"undefined\") return;\n if (document.querySelector(\"style[data-nojs-dnd]\")) return;\n\n const css = `\n.nojs-dragging {\n opacity: 0.5;\n cursor: grabbing !important;\n}\n.nojs-drag-over {\n outline: 2px dashed #3b82f6;\n outline-offset: -2px;\n}\n.nojs-drop-placeholder {\n border: 2px dashed #3b82f6;\n border-radius: 6px;\n background: color-mix(in srgb, #3b82f6 6%, transparent);\n box-sizing: border-box;\n min-height: 2.5rem;\n transition: all 0.15s ease;\n pointer-events: none;\n}\n.nojs-drop-reject {\n outline: 2px dashed #ef4444;\n outline-offset: -2px;\n background: color-mix(in srgb, #ef4444 4%, transparent);\n}\n.nojs-selected {\n outline: 2px solid #3b82f6;\n outline-offset: 1px;\n}\n[drag-axis=\"x\"] { touch-action: pan-y; }\n[drag-axis=\"y\"] { touch-action: pan-x; }\n@keyframes nojs-drop-settle {\n from { transform: scale(1.05); opacity: 0.8; }\n to { transform: scale(1); opacity: 1; }\n}\n.nojs-drop-settle {\n animation: nojs-drop-settle 0.2s ease-out;\n}\n.nojs-drag-list-empty {\n min-height: 3rem;\n}\n`.trim();\n\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-nojs-dnd\", \"\");\n style.textContent = css;\n document.head.appendChild(style);\n}\n\n// \u2500\u2500\u2500 Helper: calculate drop index from mouse position \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction _calcDropIndex(el, mouseX, mouseY, sortDir) {\n const children = [...el.children].filter(\n (c) => !c.classList.contains(\"nojs-drop-placeholder\")\n );\n if (children.length === 0) return 0;\n\n for (let i = 0; i < children.length; i++) {\n // Use first visible child for display:contents wrappers\n const measured = children[i].style && children[i].style.display === \"contents\"\n ? (children[i].firstElementChild || children[i])\n : children[i];\n const rect = measured.getBoundingClientRect();\n if (sortDir === \"horizontal\") {\n const midX = rect.left + rect.width / 2;\n if (mouseX < midX) return i;\n } else if (sortDir === \"grid\") {\n const midX = rect.left + rect.width / 2;\n const midY = rect.top + rect.height / 2;\n if (mouseY < midY && mouseX < midX) return i;\n if (mouseY < rect.top + rect.height && mouseX < midX) return i;\n } else {\n // vertical (default)\n const midY = rect.top + rect.height / 2;\n if (mouseY < midY) return i;\n }\n }\n return children.length;\n}\n\n// \u2500\u2500\u2500 Helper: manage placeholder \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction _insertPlaceholder(el, index, placeholderAttr, placeholderClass) {\n _removePlaceholder();\n\n let ph;\n if (placeholderAttr === \"auto\") {\n ph = document.createElement(\"div\");\n ph.className = placeholderClass || \"nojs-drop-placeholder\";\n // Size placeholder to match the dragged item\n if (_dndState.dragging && _dndState.dragging.sourceEl) {\n const srcEl = _dndState.dragging.sourceEl.firstElementChild || _dndState.dragging.sourceEl;\n const rect = srcEl.getBoundingClientRect();\n if (rect.height > 0) ph.style.height = rect.height + \"px\";\n if (rect.width > 0) ph.style.width = rect.width + \"px\";\n }\n } else {\n // Template ID\n const tpl = document.getElementById(\n placeholderAttr.startsWith(\"#\") ? placeholderAttr.slice(1) : placeholderAttr\n );\n if (tpl && tpl.content) {\n ph = document.createElement(\"div\");\n ph.style.display = \"contents\";\n ph.className = placeholderClass || \"nojs-drop-placeholder\";\n ph.appendChild(tpl.content.cloneNode(true));\n } else {\n ph = document.createElement(\"div\");\n ph.className = placeholderClass || \"nojs-drop-placeholder\";\n }\n }\n\n ph.classList.add(\"nojs-drop-placeholder\");\n const children = [...el.children].filter(\n (c) => !c.classList.contains(\"nojs-drop-placeholder\")\n );\n\n if (index >= children.length) {\n el.appendChild(ph);\n } else {\n el.insertBefore(ph, children[index]);\n }\n _dndState.placeholder = ph;\n}\n\nfunction _removePlaceholder() {\n if (_dndState.placeholder) {\n _dndState.placeholder.remove();\n _dndState.placeholder = null;\n }\n}\n\n// \u2500\u2500\u2500 Helper: check if type is accepted \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\nfunction _isTypeAccepted(dragType, acceptAttr) {\n if (!acceptAttr || acceptAttr === \"*\") return true;\n const accepted = acceptAttr.split(\",\").map((s) => s.trim());\n return accepted.includes(dragType);\n}\n\n// \u2500\u2500\u2500 Helper: build stacked-cards ghost for multi-drag \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction _buildStackGhost(sourceEl, count) {\n const ghost = document.createElement(\"div\");\n ghost.style.cssText = \"position:fixed;top:-9999px;left:-9999px;pointer-events:none;z-index:99999;\";\n\n const measured = sourceEl.style && sourceEl.style.display === \"contents\"\n ? (sourceEl.firstElementChild || sourceEl) : sourceEl;\n const rect = measured.getBoundingClientRect();\n const w = rect.width;\n const h = rect.height;\n const cs = getComputedStyle(measured);\n const maxStack = Math.min(count, 3);\n\n // Stack layers (back to front)\n for (let i = maxStack - 1; i >= 0; i--) {\n const layer = document.createElement(\"div\");\n const offset = i * 4;\n layer.style.cssText =\n \"position:absolute;\" +\n \"top:\" + offset + \"px;left:\" + offset + \"px;\" +\n \"width:\" + w + \"px;height:\" + h + \"px;\" +\n \"border-radius:\" + cs.borderRadius + \";\" +\n \"box-shadow:0 1px 4px rgba(0,0,0,0.12);\" +\n \"overflow:hidden;box-sizing:border-box;\";\n\n if (i === 0) {\n // Top card: clone content\n layer.innerHTML = measured.innerHTML;\n layer.style.background = cs.backgroundColor || \"#fff\";\n layer.style.border = cs.border;\n layer.style.padding = cs.padding;\n layer.style.fontSize = cs.fontSize;\n layer.style.color = cs.color;\n layer.style.fontFamily = cs.fontFamily;\n } else {\n // Back cards: solid fill\n layer.style.background = cs.backgroundColor || \"#fff\";\n layer.style.border = cs.border || \"1px solid #ddd\";\n }\n ghost.appendChild(layer);\n }\n\n // Count badge\n const badge = document.createElement(\"div\");\n badge.textContent = count;\n badge.style.cssText =\n \"position:absolute;top:-6px;right:-6px;\" +\n \"min-width:22px;height:22px;padding:0 5px;\" +\n \"background:#3b82f6;color:#fff;border-radius:11px;\" +\n \"display:flex;align-items:center;justify-content:center;\" +\n \"font-size:11px;font-weight:700;border:2px solid #fff;\" +\n \"box-shadow:0 1px 3px rgba(0,0,0,0.2);\";\n ghost.appendChild(badge);\n\n // Container size\n ghost.style.width = (w + (maxStack - 1) * 4) + \"px\";\n ghost.style.height = (h + (maxStack - 1) * 4) + \"px\";\n\n return ghost;\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// DRAG DIRECTIVE\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\nregisterDirective(\"drag\", {\n priority: 15,\n init(el, name, expr) {\n _injectDndStyles();\n const ctx = findContext(el);\n\n const type = el.getAttribute(\"drag-type\") || \"default\";\n const effect = el.getAttribute(\"drag-effect\") || \"move\";\n const handleSel = el.getAttribute(\"drag-handle\");\n const imageSel = el.getAttribute(\"drag-image\");\n const imageOffsetAttr = el.getAttribute(\"drag-image-offset\") || \"0,0\";\n const disabledExpr = el.getAttribute(\"drag-disabled\");\n const dragClass = el.getAttribute(\"drag-class\") || \"nojs-dragging\";\n const ghostClass = el.getAttribute(\"drag-ghost-class\");\n\n // Set draggable\n el.draggable = true;\n\n // Accessibility\n el.setAttribute(\"aria-grabbed\", \"false\");\n if (!el.getAttribute(\"tabindex\")) el.setAttribute(\"tabindex\", \"0\");\n\n // Handle restriction: prevent drag from non-handle areas\n let _handleAllowed = true;\n if (handleSel) {\n const mousedownHandler = (e) => {\n _handleAllowed = !!e.target.closest(handleSel);\n };\n el.addEventListener(\"mousedown\", mousedownHandler);\n _onDispose(() => el.removeEventListener(\"mousedown\", mousedownHandler));\n }\n\n // Drag start\n const dragstartHandler = (e) => {\n // Handle check\n if (handleSel && !_handleAllowed) {\n e.preventDefault();\n return;\n }\n\n // Disabled check\n if (disabledExpr && evaluate(disabledExpr, ctx)) {\n e.preventDefault();\n return;\n }\n\n const item = evaluate(expr, ctx);\n\n // Check for multi-select\n const group = el.getAttribute(\"drag-group\");\n let dragItem = item;\n if (group && _dndState.selected.has(group)) {\n const selectedSet = _dndState.selected.get(group);\n if (selectedSet.size > 0) {\n // If this element is selected, drag all selected items\n const hasThis = [...selectedSet].some((s) => s.el === el);\n if (hasThis) {\n dragItem = [...selectedSet].map((s) => s.item);\n }\n }\n }\n\n // Store dragging state\n _dndState.dragging = {\n item: dragItem,\n type,\n effect,\n sourceEl: el,\n sourceCtx: ctx,\n sourceList: null,\n sourceIndex: null,\n listDirective: null,\n };\n\n // Set dataTransfer\n if (e.dataTransfer) {\n e.dataTransfer.effectAllowed = effect;\n e.dataTransfer.setData(\"text/plain\", \"\");\n\n // Multi-select: stacked cards drag image\n if (Array.isArray(dragItem) && dragItem.length > 1 && e.dataTransfer.setDragImage) {\n const ghost = _buildStackGhost(el, dragItem.length);\n document.body.appendChild(ghost);\n const rect = el.getBoundingClientRect();\n e.dataTransfer.setDragImage(ghost, rect.width / 2, rect.height / 2);\n requestAnimationFrame(() => ghost.remove());\n } else if (imageSel && e.dataTransfer.setDragImage) {\n // Custom drag image\n if (imageSel === \"none\") {\n const empty = document.createElement(\"div\");\n empty.style.cssText = \"width:1px;height:1px;opacity:0;position:fixed;top:-999px\";\n document.body.appendChild(empty);\n const [ox, oy] = imageOffsetAttr.split(\",\").map(Number);\n e.dataTransfer.setDragImage(empty, ox || 0, oy || 0);\n requestAnimationFrame(() => empty.remove());\n } else {\n const imgEl = el.querySelector(imageSel);\n if (imgEl) {\n const [ox, oy] = imageOffsetAttr.split(\",\").map(Number);\n if (ghostClass) imgEl.classList.add(ghostClass);\n e.dataTransfer.setDragImage(imgEl, ox || 0, oy || 0);\n }\n }\n }\n }\n\n // Apply drag class to dragged element (and all selected items if multi-select)\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n if (Array.isArray(dragItem) && group && _dndState.selected.has(group)) {\n for (const s of _dndState.selected.get(group)) {\n if (s.el !== el) dragClass.split(/\\s+/).filter(Boolean).forEach((c) => s.el.classList.add(c));\n }\n }\n\n // ARIA\n el.setAttribute(\"aria-grabbed\", \"true\");\n\n // Dispatch custom event\n el.dispatchEvent(\n new CustomEvent(\"drag-start\", {\n bubbles: true,\n detail: { item: dragItem, index: _dndState.dragging.sourceIndex, el },\n })\n );\n };\n\n // Drag end\n const dragendHandler = () => {\n // Remove drag class from this element and all selected items\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n const group = el.getAttribute(\"drag-group\");\n if (group && _dndState.selected.has(group)) {\n for (const s of _dndState.selected.get(group)) {\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => s.el.classList.remove(c));\n }\n }\n\n // ARIA\n el.setAttribute(\"aria-grabbed\", \"false\");\n\n // Ghost class cleanup\n if (ghostClass && imageSel && imageSel !== \"none\") {\n const imgEl = el.querySelector(imageSel);\n if (imgEl) imgEl.classList.remove(ghostClass);\n }\n\n // Dispatch custom event\n el.dispatchEvent(\n new CustomEvent(\"drag-end\", {\n bubbles: true,\n detail: {\n item: _dndState.dragging?.item,\n index: _dndState.dragging?.sourceIndex,\n dropped: _dndState.dragging === null,\n },\n })\n );\n\n // Clear dragging state\n _dndState.dragging = null;\n _removePlaceholder();\n };\n\n el.addEventListener(\"dragstart\", dragstartHandler);\n el.addEventListener(\"dragend\", dragendHandler);\n _onDispose(() => {\n el.removeEventListener(\"dragstart\", dragstartHandler);\n el.removeEventListener(\"dragend\", dragendHandler);\n });\n\n // Reactive disabled toggle\n if (disabledExpr) {\n function updateDisabled() {\n const disabled = !!evaluate(disabledExpr, ctx);\n el.draggable = !disabled;\n if (disabled) el.removeAttribute(\"aria-grabbed\");\n else el.setAttribute(\"aria-grabbed\", \"false\");\n }\n ctx.$watch(updateDisabled);\n }\n\n // Keyboard DnD support\n const keydownHandler = (e) => {\n // Clear stale state from elements removed from DOM\n if (_dndState.dragging && !_dndState.dragging.sourceEl.isConnected) {\n _dndState.dragging = null;\n }\n if (e.key === \" \" && !_dndState.dragging) {\n e.preventDefault();\n const item = evaluate(expr, ctx);\n _dndState.dragging = {\n item,\n type,\n effect,\n sourceEl: el,\n sourceCtx: ctx,\n sourceList: null,\n sourceIndex: null,\n listDirective: null,\n };\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n el.setAttribute(\"aria-grabbed\", \"true\");\n el.dispatchEvent(\n new CustomEvent(\"drag-start\", {\n bubbles: true,\n detail: { item, index: null, el },\n })\n );\n } else if (e.key === \"Escape\" && _dndState.dragging && _dndState.dragging.sourceEl === el) {\n e.preventDefault();\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n el.setAttribute(\"aria-grabbed\", \"false\");\n _dndState.dragging = null;\n _removePlaceholder();\n }\n };\n el.addEventListener(\"keydown\", keydownHandler);\n _onDispose(() => el.removeEventListener(\"keydown\", keydownHandler));\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// DROP DIRECTIVE\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\nregisterDirective(\"drop\", {\n priority: 15,\n init(el, name, expr) {\n _injectDndStyles();\n const ctx = findContext(el);\n\n const acceptAttr = el.getAttribute(\"drop-accept\") || \"default\";\n const dropEffect = el.getAttribute(\"drop-effect\") || \"move\";\n const dropClass = el.getAttribute(\"drop-class\") || \"nojs-drag-over\";\n const rejectClass = el.getAttribute(\"drop-reject-class\") || \"nojs-drop-reject\";\n const disabledExpr = el.getAttribute(\"drop-disabled\");\n const maxExpr = el.getAttribute(\"drop-max\");\n const sortDir = el.getAttribute(\"drop-sort\");\n const placeholderAttr = el.getAttribute(\"drop-placeholder\");\n const placeholderClass = el.getAttribute(\"drop-placeholder-class\");\n\n // Accessibility\n el.setAttribute(\"aria-dropeffect\", dropEffect);\n\n // Track dragenter/dragleave depth for nested elements\n let _enterDepth = 0;\n\n const dragoverHandler = (e) => {\n if (!_dndState.dragging) return;\n\n // Disabled check\n if (disabledExpr && evaluate(disabledExpr, ctx)) return;\n\n const typeOk = _isTypeAccepted(_dndState.dragging.type, acceptAttr);\n let maxOk = true;\n if (maxExpr) {\n const max = evaluate(maxExpr, ctx);\n const childCount = _countVisibleChildren(el);\n if (typeof max === \"number\" && childCount >= max) maxOk = false;\n }\n\n if (!typeOk || !maxOk) {\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n dropClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n _removePlaceholder();\n return;\n }\n\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = dropEffect;\n\n // Sortable: calculate index and show placeholder\n if (sortDir) {\n const idx = _calcDropIndex(el, e.clientX, e.clientY, sortDir);\n if (placeholderAttr) {\n _insertPlaceholder(el, idx, placeholderAttr, placeholderClass);\n }\n // Dispatch throttled drag-over event\n el.dispatchEvent(\n new CustomEvent(\"drag-over\", {\n bubbles: false,\n detail: { item: _dndState.dragging.item, index: idx },\n })\n );\n }\n };\n\n const dragenterHandler = (e) => {\n if (!_dndState.dragging) return;\n if (disabledExpr && evaluate(disabledExpr, ctx)) return;\n\n _enterDepth++;\n if (_enterDepth === 1) {\n const typeOk = _isTypeAccepted(_dndState.dragging.type, acceptAttr);\n let maxOk = true;\n if (maxExpr) {\n const max = evaluate(maxExpr, ctx);\n const childCount = _countVisibleChildren(el);\n if (typeof max === \"number\" && childCount >= max) maxOk = false;\n }\n\n if (typeOk && maxOk) {\n dropClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n el.dispatchEvent(\n new CustomEvent(\"drag-enter\", {\n bubbles: false,\n detail: { item: _dndState.dragging.item, type: _dndState.dragging.type },\n })\n );\n } else {\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n }\n }\n };\n\n const dragleaveHandler = (e) => {\n if (!_dndState.dragging) return;\n\n _enterDepth--;\n if (_enterDepth <= 0) {\n _enterDepth = 0;\n dropClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n _removePlaceholder();\n\n el.dispatchEvent(\n new CustomEvent(\"drag-leave\", {\n bubbles: false,\n detail: { item: _dndState.dragging.item },\n })\n );\n }\n };\n\n const dropHandler = (e) => {\n e.preventDefault();\n e.stopPropagation();\n _enterDepth = 0;\n\n if (!_dndState.dragging) return;\n if (disabledExpr && evaluate(disabledExpr, ctx)) return;\n if (!_isTypeAccepted(_dndState.dragging.type, acceptAttr)) return;\n\n // Max capacity check\n if (maxExpr) {\n const max = evaluate(maxExpr, ctx);\n const childCount = _countVisibleChildren(el);\n if (typeof max === \"number\" && childCount >= max) return;\n }\n\n const dragItem = _dndState.dragging.item;\n const dragType = _dndState.dragging.type;\n const dragEffect = _dndState.dragging.effect;\n\n // Calculate drop index\n let dropIndex = 0;\n if (sortDir) {\n dropIndex = _calcDropIndex(el, e.clientX, e.clientY, sortDir);\n }\n\n // Remove visual feedback\n dropClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n _removePlaceholder();\n\n // Execute drop expression with implicit variables\n const extraVars = {\n $drag: dragItem,\n $dragType: dragType,\n $dragEffect: dragEffect,\n $dropIndex: dropIndex,\n $source: {\n list: _dndState.dragging.sourceList,\n index: _dndState.dragging.sourceIndex,\n el: _dndState.dragging.sourceEl,\n },\n $target: { list: null, index: dropIndex, el },\n $el: el,\n };\n\n _execStatement(expr, ctx, extraVars);\n\n // Clear dragging state BEFORE dispatch to prevent re-entry\n _dndState.dragging = null;\n\n // Dispatch custom event after expression runs\n el.dispatchEvent(\n new CustomEvent(\"drop\", {\n bubbles: false,\n detail: {\n item: dragItem,\n index: dropIndex,\n source: extraVars.$source,\n target: extraVars.$target,\n effect: dragEffect,\n },\n })\n );\n };\n\n // Keyboard: Enter/Space to drop when item is grabbed\n const keydownHandler = (e) => {\n if (!_dndState.dragging) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n dropHandler(e);\n }\n };\n\n el.addEventListener(\"dragover\", dragoverHandler);\n el.addEventListener(\"dragenter\", dragenterHandler);\n el.addEventListener(\"dragleave\", dragleaveHandler);\n el.addEventListener(\"drop\", dropHandler);\n el.addEventListener(\"keydown\", keydownHandler);\n _onDispose(() => {\n el.removeEventListener(\"dragover\", dragoverHandler);\n el.removeEventListener(\"dragenter\", dragenterHandler);\n el.removeEventListener(\"dragleave\", dragleaveHandler);\n el.removeEventListener(\"drop\", dropHandler);\n el.removeEventListener(\"keydown\", keydownHandler);\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// DRAG-LIST DIRECTIVE (Sortable List Shorthand)\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// Keep a registry of drag-list elements for cross-list communication\nconst _dragListRegistry = new Map(); // el \u2192 { listPath, ctx, el }\n\nregisterDirective(\"drag-list\", {\n priority: 10,\n init(el, name, listPath) {\n _injectDndStyles();\n const ctx = findContext(el);\n\n const tplId = el.getAttribute(\"template\");\n const keyProp = el.getAttribute(\"drag-list-key\");\n const itemName = el.getAttribute(\"drag-list-item\") || \"item\";\n const sortDir = el.getAttribute(\"drop-sort\") || \"vertical\";\n const type = el.getAttribute(\"drag-type\") || (\"__draglist_\" + listPath);\n const acceptAttr = el.getAttribute(\"drop-accept\") || type;\n const copyMode = el.hasAttribute(\"drag-list-copy\");\n const removeMode = el.hasAttribute(\"drag-list-remove\");\n const disabledDragExpr = el.getAttribute(\"drag-disabled\");\n const disabledDropExpr = el.getAttribute(\"drop-disabled\");\n const maxExpr = el.getAttribute(\"drop-max\");\n const placeholderAttr = el.getAttribute(\"drop-placeholder\");\n const placeholderClass = el.getAttribute(\"drop-placeholder-class\");\n const dragClass = el.getAttribute(\"drag-class\") || \"nojs-dragging\";\n const dropClass = el.getAttribute(\"drop-class\") || \"nojs-drag-over\";\n const rejectClass = el.getAttribute(\"drop-reject-class\") || \"nojs-drop-reject\";\n const settleClass = el.getAttribute(\"drop-settle-class\") || \"nojs-drop-settle\";\n const emptyClass = el.getAttribute(\"drop-empty-class\") || \"nojs-drag-list-empty\";\n\n // Accessibility\n el.setAttribute(\"role\", \"listbox\");\n el.setAttribute(\"aria-dropeffect\", copyMode ? \"copy\" : \"move\");\n\n // Register for cross-list communication\n const listInfo = { listPath, ctx, el };\n _dragListRegistry.set(el, listInfo);\n _onDispose(() => _dragListRegistry.delete(el));\n\n let _enterDepth = 0;\n let _prevList = null;\n\n // \u2500\u2500\u2500 Render items \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function renderItems() {\n const list = resolve(listPath, ctx);\n if (!Array.isArray(list)) return;\n\n // Same reference & items already rendered \u2014 propagate to children\n // without rebuilding the DOM (preserves focus, input state, etc.)\n if (list === _prevList && list.length > 0 && el.children.length > 0) {\n for (const child of el.children) {\n if (child.__ctx && child.__ctx.$notify) child.__ctx.$notify();\n }\n return;\n }\n _prevList = list;\n\n const tpl = tplId ? document.getElementById(tplId) : null;\n if (!tpl) return;\n\n el.innerHTML = \"\";\n const count = list.length;\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.setAttribute(\"role\", \"option\");\n\n // Append clone first so we can access the visible child\n wrapper.appendChild(clone);\n el.appendChild(wrapper);\n\n // The drag source is the first visible child\n // (display:contents wrapper has no box, so draggable must be on a rendered element)\n const dragEl = wrapper.firstElementChild || wrapper;\n dragEl.draggable = true;\n dragEl.setAttribute(\"aria-grabbed\", \"false\");\n if (!dragEl.getAttribute(\"tabindex\")) dragEl.setAttribute(\"tabindex\", \"0\");\n\n // Per-item drag handlers (on wrapper so events from dragEl bubble up to them)\n const itemDragstart = (e) => {\n if (disabledDragExpr && evaluate(disabledDragExpr, ctx)) {\n e.preventDefault();\n return;\n }\n _dndState.dragging = {\n item,\n type,\n effect: copyMode ? \"copy\" : \"move\",\n sourceEl: wrapper,\n sourceCtx: childCtx,\n sourceList: list,\n sourceIndex: i,\n listDirective: { el, listPath, ctx, keyProp, copyMode, removeMode },\n };\n if (e.dataTransfer) {\n e.dataTransfer.effectAllowed = copyMode ? \"copy\" : \"move\";\n e.dataTransfer.setData(\"text/plain\", \"\");\n }\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => dragEl.classList.add(c));\n dragEl.setAttribute(\"aria-grabbed\", \"true\");\n\n el.dispatchEvent(\n new CustomEvent(\"drag-start\", {\n bubbles: true,\n detail: { item, index: i, el: dragEl },\n })\n );\n };\n\n const itemDragend = () => {\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => dragEl.classList.remove(c));\n dragEl.setAttribute(\"aria-grabbed\", \"false\");\n\n // If drag-list-remove and item was NOT dropped in a target, no action\n // If dragging state is still set, it wasn't dropped\n if (_dndState.dragging && _dndState.dragging.sourceEl === wrapper) {\n _dndState.dragging = null;\n }\n _removePlaceholder();\n };\n\n wrapper.addEventListener(\"dragstart\", itemDragstart);\n wrapper.addEventListener(\"dragend\", itemDragend);\n\n // Keyboard DnD on items\n wrapper.addEventListener(\"keydown\", (e) => {\n if (e.key === \" \" && !_dndState.dragging) {\n e.preventDefault();\n _dndState.dragging = {\n item,\n type,\n effect: copyMode ? \"copy\" : \"move\",\n sourceEl: wrapper,\n sourceCtx: childCtx,\n sourceList: list,\n sourceIndex: i,\n listDirective: { el, listPath, ctx, keyProp, copyMode, removeMode },\n };\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => dragEl.classList.add(c));\n dragEl.setAttribute(\"aria-grabbed\", \"true\");\n } else if (e.key === \"Escape\" && _dndState.dragging && _dndState.dragging.sourceEl === wrapper) {\n e.preventDefault();\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => dragEl.classList.remove(c));\n dragEl.setAttribute(\"aria-grabbed\", \"false\");\n _dndState.dragging = null;\n _removePlaceholder();\n } else if ((e.key === \"ArrowDown\" || e.key === \"ArrowRight\") && _dndState.dragging && _dndState.dragging.sourceEl === wrapper) {\n e.preventDefault();\n // Navigate to next item via wrapper siblings\n const nextWrapper = wrapper.nextElementSibling;\n if (nextWrapper) {\n const nextEl = nextWrapper.firstElementChild || nextWrapper;\n nextEl.focus();\n }\n } else if ((e.key === \"ArrowUp\" || e.key === \"ArrowLeft\") && _dndState.dragging && _dndState.dragging.sourceEl === wrapper) {\n e.preventDefault();\n const prevWrapper = wrapper.previousElementSibling;\n if (prevWrapper) {\n const prevEl = prevWrapper.firstElementChild || prevWrapper;\n prevEl.focus();\n }\n }\n });\n\n processTree(wrapper);\n });\n\n // Toggle empty class so the container remains a viable drop target\n const isEmpty = list.length === 0;\n emptyClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.toggle(c, isEmpty));\n }\n\n // \u2500\u2500\u2500 Drop zone handlers on the list container \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const dragoverHandler = (e) => {\n if (!_dndState.dragging) return;\n if (disabledDropExpr && evaluate(disabledDropExpr, ctx)) return;\n\n const typeOk = _isTypeAccepted(_dndState.dragging.type, acceptAttr);\n let maxOk = true;\n if (maxExpr) {\n const max = evaluate(maxExpr, ctx);\n const list = resolve(listPath, ctx);\n if (typeof max === \"number\" && Array.isArray(list) && list.length >= max) maxOk = false;\n }\n\n if (!typeOk || !maxOk) {\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n dropClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n _removePlaceholder();\n return;\n }\n\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = copyMode ? \"copy\" : \"move\";\n\n const idx = _calcDropIndex(el, e.clientX, e.clientY, sortDir);\n if (placeholderAttr) {\n _insertPlaceholder(el, idx, placeholderAttr, placeholderClass);\n }\n };\n\n const dragenterHandler = (e) => {\n if (!_dndState.dragging) return;\n if (disabledDropExpr && evaluate(disabledDropExpr, ctx)) return;\n\n _enterDepth++;\n if (_enterDepth === 1) {\n const typeOk = _isTypeAccepted(_dndState.dragging.type, acceptAttr);\n let maxOk = true;\n if (maxExpr) {\n const max = evaluate(maxExpr, ctx);\n const list = resolve(listPath, ctx);\n if (typeof max === \"number\" && Array.isArray(list) && list.length >= max) maxOk = false;\n }\n\n if (typeOk && maxOk) {\n dropClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n el.dispatchEvent(\n new CustomEvent(\"drag-enter\", {\n bubbles: false,\n detail: { item: _dndState.dragging.item, type: _dndState.dragging.type },\n })\n );\n } else {\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n }\n }\n };\n\n const dragleaveHandler = () => {\n if (!_dndState.dragging) return;\n _enterDepth--;\n if (_enterDepth <= 0) {\n _enterDepth = 0;\n dropClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n _removePlaceholder();\n el.dispatchEvent(\n new CustomEvent(\"drag-leave\", {\n bubbles: false,\n detail: { item: _dndState.dragging?.item },\n })\n );\n }\n };\n\n const dropHandler = (e) => {\n e.preventDefault();\n e.stopPropagation();\n _enterDepth = 0;\n\n if (!_dndState.dragging) return;\n if (disabledDropExpr && evaluate(disabledDropExpr, ctx)) return;\n if (!_isTypeAccepted(_dndState.dragging.type, acceptAttr)) return;\n\n // Max check\n if (maxExpr) {\n const max = evaluate(maxExpr, ctx);\n const list = resolve(listPath, ctx);\n if (typeof max === \"number\" && Array.isArray(list) && list.length >= max) return;\n }\n\n const dragItem = _dndState.dragging.item;\n const sourceInfo = _dndState.dragging.listDirective;\n const sourceIndex = _dndState.dragging.sourceIndex;\n\n const dropIndex = _calcDropIndex(el, e.clientX, e.clientY, sortDir);\n\n // Remove visual feedback\n dropClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n _removePlaceholder();\n\n const targetList = resolve(listPath, ctx);\n if (!Array.isArray(targetList)) return;\n\n // Self-drop check: same list, same position\n const isSameList = sourceInfo && sourceInfo.el === el;\n if (isSameList && sourceIndex === dropIndex) {\n _dndState.dragging = null;\n return;\n }\n // Same list, but adjacent position (effectively same position)\n if (isSameList && sourceIndex + 1 === dropIndex) {\n _dndState.dragging = null;\n return;\n }\n\n // Perform the list mutation\n let newTargetList = [...targetList];\n\n if (isSameList) {\n // Same-list reorder\n const [moved] = newTargetList.splice(sourceIndex, 1);\n const insertAt = sourceIndex < dropIndex ? dropIndex - 1 : dropIndex;\n newTargetList.splice(insertAt, 0, moved);\n ctx.$set(listPath, newTargetList);\n\n el.dispatchEvent(\n new CustomEvent(\"reorder\", {\n bubbles: true,\n detail: { list: newTargetList, item: dragItem, from: sourceIndex, to: insertAt },\n })\n );\n } else {\n // Cross-list transfer\n const itemToInsert = copyMode ? (typeof dragItem === \"object\" ? { ...dragItem } : dragItem) : dragItem;\n newTargetList.splice(dropIndex, 0, itemToInsert);\n ctx.$set(listPath, newTargetList);\n\n // Remove from source if move mode\n if (sourceInfo && !sourceInfo.copyMode && (removeMode || sourceInfo.removeMode)) {\n const sourceList = resolve(sourceInfo.listPath, sourceInfo.ctx);\n if (Array.isArray(sourceList) && sourceIndex != null) {\n const newSourceList = sourceList.filter((_, idx) => idx !== sourceIndex);\n sourceInfo.ctx.$set(sourceInfo.listPath, newSourceList);\n\n sourceInfo.el.dispatchEvent(\n new CustomEvent(\"remove\", {\n bubbles: true,\n detail: { list: newSourceList, item: dragItem, index: sourceIndex },\n })\n );\n }\n }\n\n el.dispatchEvent(\n new CustomEvent(\"receive\", {\n bubbles: true,\n detail: {\n list: newTargetList,\n item: dragItem,\n from: sourceIndex,\n fromList: sourceInfo ? resolve(sourceInfo.listPath, sourceInfo.ctx) : null,\n },\n })\n );\n }\n\n // Settle animation (apply to visible child, not display:contents wrapper)\n requestAnimationFrame(() => {\n const children = [...el.children];\n const targetChild = children[isSameList ? (sourceIndex < dropIndex ? dropIndex - 1 : dropIndex) : dropIndex];\n if (targetChild) {\n const animEl = targetChild.firstElementChild || targetChild;\n settleClass.split(/\\s+/).filter(Boolean).forEach((c) => animEl.classList.add(c));\n animEl.addEventListener(\"animationend\", () => {\n settleClass.split(/\\s+/).filter(Boolean).forEach((c) => animEl.classList.remove(c));\n }, { once: true });\n }\n });\n\n // Clear dragging state\n _dndState.dragging = null;\n };\n\n // Keyboard: Enter/Space to drop\n const keydownHandler = (e) => {\n if (!_dndState.dragging) return;\n if (!_isTypeAccepted(_dndState.dragging.type, acceptAttr)) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n // Simulate drop at the focused element's position\n const focused = el.querySelector(\":focus\");\n if (focused) {\n const measured = focused.style?.display === \"contents\"\n ? (focused.firstElementChild || focused) : focused;\n const rect = measured.getBoundingClientRect();\n const fakeEvent = {\n preventDefault() {},\n stopPropagation() {},\n clientX: rect.left + rect.width / 2,\n clientY: rect.top + rect.height + 1,\n dataTransfer: null,\n };\n dropHandler(fakeEvent);\n }\n }\n };\n\n el.addEventListener(\"dragover\", dragoverHandler);\n el.addEventListener(\"dragenter\", dragenterHandler);\n el.addEventListener(\"dragleave\", dragleaveHandler);\n el.addEventListener(\"drop\", dropHandler);\n el.addEventListener(\"keydown\", keydownHandler);\n _onDispose(() => {\n el.removeEventListener(\"dragover\", dragoverHandler);\n el.removeEventListener(\"dragenter\", dragenterHandler);\n el.removeEventListener(\"dragleave\", dragleaveHandler);\n el.removeEventListener(\"drop\", dropHandler);\n el.removeEventListener(\"keydown\", keydownHandler);\n });\n\n // \u2500\u2500\u2500 Reactive rendering \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n ctx.$watch(renderItems);\n renderItems();\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// DRAG-MULTIPLE DIRECTIVE\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\nregisterDirective(\"drag-multiple\", {\n priority: 16,\n init(el, name) {\n const ctx = findContext(el);\n const group = el.getAttribute(\"drag-group\");\n const selectClass = el.getAttribute(\"drag-multiple-class\") || \"nojs-selected\";\n\n if (!group) {\n _warn(\"drag-multiple requires drag-group attribute\");\n return;\n }\n\n // Initialize group set if needed\n if (!_dndState.selected.has(group)) {\n _dndState.selected.set(group, new Set());\n }\n const selectedSet = _dndState.selected.get(group);\n\n const clickHandler = (e) => {\n const dragExpr = el.getAttribute(\"drag\");\n const item = dragExpr ? evaluate(dragExpr, ctx) : null;\n const entry = { item, el, ctx };\n\n if (e.ctrlKey || e.metaKey) {\n // Additive selection\n const existing = [...selectedSet].find((s) => s.el === el);\n if (existing) {\n selectedSet.delete(existing);\n selectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n } else {\n selectedSet.add(entry);\n selectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n }\n } else {\n // Replace selection\n for (const s of selectedSet) {\n selectClass.split(/\\s+/).filter(Boolean).forEach((c) => s.el.classList.remove(c));\n }\n selectedSet.clear();\n selectedSet.add(entry);\n selectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n }\n };\n\n el.addEventListener(\"click\", clickHandler);\n _onDispose(() => {\n el.removeEventListener(\"click\", clickHandler);\n // Remove this element from the selection set\n const existing = [...selectedSet].find((s) => s.el === el);\n if (existing) selectedSet.delete(existing);\n });\n\n // Escape clears selection for this group\n const escHandler = (e) => {\n if (e.key === \"Escape\") {\n for (const s of selectedSet) {\n selectClass.split(/\\s+/).filter(Boolean).forEach((c) => s.el.classList.remove(c));\n }\n selectedSet.clear();\n }\n };\n window.addEventListener(\"keydown\", escHandler);\n _onDispose(() => window.removeEventListener(\"keydown\", escHandler));\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", "e", "n", "locales", "l", "init_i18n", "__esmMin", "init_globals", "v", "allNs", "params", "messages", "msg", "k", "forms", "s", "_", "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", "parts", "proxy", "obj", "i", "lastKey", "old", "_refs", "_stores", "_routerInstance", "_i18n", "value", "_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", "origObj", "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", "called", "_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", "p", "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", "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", "_watchExpr", "prev", "prevExpr", "val", "matched", "caseVal", "isDefault", "thenTpl", "values", "v", "init_globals", "registerDirective", "el", "name", "expr", "ctx", "findContext", "match", "itemName", "listPath", "tplId", "elseTpl", "keyExpr", "animEnter", "animLeave", "stagger", "animDuration", "prevList", "update", "list", "evaluate", "resolve", "child", "clone", "_cloneTemplate", "processTree", "tpl", "oldItems", "remaining", "target", "done", "renderItems", "count", "item", "i", "childData", "childCtx", "createContext", "wrapper", "firstChild", "_watchExpr", "fromPath", "indexName", "filterExpr", "sortProp", "limit", "offset", "templateContent", "tempCtx", "desc", "key", "a", "b", "va", "vb", "r", "renderForeachItems", "init_globals", "init_i18n", "registerDirective", "el", "name", "expr", "suffix", "ctx", "findContext", "update", "obj", "evaluate", "cls", "cond", "c", "_watchExpr", "arr", "prevClasses", "next", "_watchI18n", "prop", "val", "cssProp", "_", "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", "_onDispose", "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", "init_globals", "registerDirective", "el", "name", "key", "ctx", "findContext", "useHtml", "update", "params", "attr", "paramName", "evaluate", "text", "_i18n", "_watchExpr", "_watchI18n", "ns", "saved", "_loadI18nNamespace", "processTree", "_notifyI18n", "init_globals", "_dndState", "_countVisibleChildren", "el", "count", "child", "_injectDndStyles", "css", "style", "_calcDropIndex", "mouseX", "mouseY", "sortDir", "children", "c", "rect", "midX", "midY", "_insertPlaceholder", "index", "placeholderAttr", "placeholderClass", "_removePlaceholder", "ph", "tpl", "_isTypeAccepted", "dragType", "acceptAttr", "s", "_buildStackGhost", "sourceEl", "ghost", "measured", "w", "h", "cs", "maxStack", "i", "layer", "offset", "badge", "registerDirective", "name", "expr", "ctx", "findContext", "type", "effect", "handleSel", "imageSel", "imageOffsetAttr", "disabledExpr", "dragClass", "ghostClass", "_handleAllowed", "mousedownHandler", "e", "_onDispose", "dragstartHandler", "evaluate", "item", "group", "dragItem", "selectedSet", "empty", "ox", "oy", "imgEl", "dragendHandler", "updateDisabled", "disabled", "keydownHandler", "dropEffect", "dropClass", "rejectClass", "maxExpr", "_enterDepth", "dragoverHandler", "typeOk", "maxOk", "max", "childCount", "idx", "dragenterHandler", "dragleaveHandler", "dropHandler", "dragEffect", "dropIndex", "extraVars", "_execStatement", "_dragListRegistry", "listPath", "tplId", "keyProp", "itemName", "copyMode", "removeMode", "disabledDragExpr", "disabledDropExpr", "settleClass", "emptyClass", "listInfo", "_prevList", "renderItems", "list", "resolve", "childData", "childCtx", "createContext", "clone", "wrapper", "dragEl", "itemDragstart", "itemDragend", "nextWrapper", "prevWrapper", "processTree", "isEmpty", "sourceInfo", "sourceIndex", "targetList", "isSameList", "newTargetList", "moved", "insertAt", "itemToInsert", "sourceList", "newSourceList", "_", "targetChild", "animEl", "focused", "fakeEvent", "selectClass", "_warn", "clickHandler", "dragExpr", "entry", "existing", "escHandler", "_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"]
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 else if (url.includes(\"{ns}\")) return; // no namespace to substitute\n\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 _i18n.locales[locale] = _deepMerge(_i18n.locales[locale] || {}, data);\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\";\nimport \"./directives/dnd.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._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.4.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// 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 const parts = k.split(\".\");\n if (parts.length === 1) {\n proxy[k] = v;\n } else {\n let obj = proxy;\n for (let i = 0; i < parts.length - 1; i++) {\n obj = obj[parts[i]];\n if (obj == null) return;\n }\n const lastKey = parts[parts.length - 1];\n const old = obj[lastKey];\n obj[lastKey] = v;\n if (old !== v) notify();\n }\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 // Only write back values that actually changed locally, to avoid\n // overwriting proxy mutations made by called functions.\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 origObj = {};\n for (const k of chainKeys) {\n if (!k.startsWith(\"$\") && k in vals) origObj[k] = vals[k];\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){if(typeof ${k}!=='undefined'){if(${k}!==__orig['${k}'])_c.$set('${k}',${k});else if(typeof ${k}==='object'&&${k}!==null)_c.$notify();}break;}_c=_c.$parent;}}`,\n )\n .join(\"\\n\");\n\n const fn = new Function(\"__ctx\", \"__orig\", ...keyArr, `${expr};\\n${setters}`);\n fn(ctx, origObj, ...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 } else if (useCache && tpl.content) {\n // Route templates: pre-warm HTML cache for nested subtemplates so\n // navigation finds cache hits instead of issuing network requests.\n // Only the HTML is fetched \u2014 no DOM processing or skeleton insertion.\n const nested = tpl.content.querySelectorAll(\"template[src]\");\n const warmups = [...nested].map((sub) => {\n const subSrc = sub.getAttribute(\"src\");\n const subUrl = _resolveTemplateSrc(subSrc, sub);\n if (_templateHtmlCache.has(subUrl)) return;\n return fetch(subUrl).then((r) => r.text()).then((h) => {\n _templateHtmlCache.set(subUrl, h);\n }).catch(() => {});\n });\n Promise.all(warmups);\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 function _prefetchRoutes() {\n const outletEls = document.querySelectorAll(\"[route-view]\");\n for (const outletEl of outletEls) {\n const rawSrc = outletEl.getAttribute(\"src\") || _config.router.templates || \"\";\n if (!rawSrc) continue;\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 outletName = (outletEl.getAttribute(\"route-view\") || \"\").trim() || \"default\";\n\n // Collect routes from links, keeping most aggressive lazy level per path\n const routeLazy = new Map();\n document.querySelectorAll(\"[route]:not([route-view])\").forEach((link) => {\n const raw = link.getAttribute(\"route\");\n if (!raw) return;\n const path = raw.split(\"?\")[0].split(\"#\")[0];\n const lazy = link.getAttribute(\"lazy\");\n const prev = routeLazy.get(path);\n if (!routeLazy.has(path) || lazy === \"priority\" ||\n (prev === \"ondemand\" && lazy !== \"ondemand\")) {\n routeLazy.set(path, lazy);\n }\n });\n\n const priorityFetches = [];\n const backgroundFetches = [];\n\n for (const [path, lazy] of routeLazy) {\n if (lazy === \"ondemand\" || path === current.path) continue;\n const segment = path === \"/\" ? indexName : path.replace(/^\\//, \"\");\n const fullSrc = baseSrc + segment + ext;\n const cacheKey = outletName + \":\" + fullSrc;\n if (_autoTemplateCache.has(cacheKey)) continue;\n\n const tpl = document.createElement(\"template\");\n tpl.setAttribute(\"src\", fullSrc);\n tpl.setAttribute(\"route\", path);\n document.body.appendChild(tpl);\n _autoTemplateCache.set(cacheKey, tpl);\n _log(\"[ROUTER] Prefetch:\", path, \"\u2192\", fullSrc, lazy === \"priority\" ? \"(priority)\" : \"(background)\");\n\n if (outletEl.hasAttribute(\"i18n-ns\")) {\n tpl.setAttribute(\"i18n-ns\", segment);\n }\n\n if (lazy === \"priority\") priorityFetches.push(tpl);\n else backgroundFetches.push(tpl);\n }\n\n if (priorityFetches.length || backgroundFetches.length) {\n Promise.all(priorityFetches.map(_loadTemplateElement)).then(() => {\n backgroundFetches.forEach(_loadTemplateElement);\n });\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 // Skip if path unchanged (prevents double-processing from programmatic hash set)\n const [p] = raw.split(\"?\");\n if (p === current.path) return;\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 // Prefetch route templates declared via <a route> links\n _prefetchRoutes();\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 let called = false;\n const done = () => {\n if (called) return;\n called = true;\n target.classList.remove(animName);\n callback();\n };\n target.addEventListener(\"animationend\", done, { once: true });\n setTimeout(done, 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 let called = false;\n const done = () => {\n if (called) return;\n called = true;\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, _watchExpr } 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 _watchExpr(expr, ctx, 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 _watchExpr(watchExpr, ctx, () => {\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 _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 let data;\n try {\n data = await _doFetch(\n resolvedUrl,\n method,\n reqBody,\n extraHeaders,\n el,\n _activeAbort.signal,\n );\n } finally {\n _config.retries = savedRetries;\n _config.retryDelay = savedRetryDelay;\n }\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 _watchExpr(expr, ctx, 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 _watchExpr(expr, ctx, 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 _watchExpr(expr, ctx, 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 _watchExpr(\"\", ctx, 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 _watchExpr(expr, ctx, 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 { _watchExpr } from \"../globals.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 let prevList = null;\n\n function update() {\n let list = /[\\[\\]()\\s+\\-*\\/!?:&|]/.test(listPath)\n ? evaluate(listPath, ctx)\n : resolve(listPath, ctx);\n if (!Array.isArray(list)) return;\n\n // If same list reference and items are rendered, skip re-render\n // and just propagate the notification to child contexts so their\n // watchers (bind, show, model, etc.) can react to parent changes\n // without destroying/recreating the DOM (preserves input focus).\n if (list === prevList && list.length > 0 && el.children.length > 0) {\n for (const child of el.children) {\n if (child.__ctx && child.__ctx.$notify) child.__ctx.$notify();\n }\n return;\n }\n prevList = list;\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 firstChild.addEventListener(\"animationend\", () => firstChild.classList.remove(animEnter), { once: true });\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 _watchExpr(expr, ctx, 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 firstChild.addEventListener(\"animationend\", () => firstChild.classList.remove(animEnter), { once: true });\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 _watchExpr(fromPath, ctx, 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 { _watchExpr } from \"../globals.js\";\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 // Supports space-separated keys: class-map=\"{ 'bg-sky-500 text-white': x }\"\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 const parts = cls.split(/\\s+/).filter(Boolean);\n parts.forEach((c) => el.classList.toggle(c, !!cond));\n }\n }\n }\n _watchExpr(expr, ctx, 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 _watchExpr(expr, ctx, update);\n update();\n return;\n }\n\n // class-{name}=\"expr\"\n function update() {\n el.classList.toggle(suffix, !!evaluate(expr, ctx));\n }\n _watchExpr(expr, ctx, update);\n if (expr.includes(\"$i18n\") || 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 _watchExpr(expr, ctx, 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 _watchExpr(expr, ctx, 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, subtree: true });\n _onDispose(() => observer.disconnect());\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 _onDispose,\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 _onDispose(() => {\n if (_refs[refName] === el) delete _refs[refName];\n });\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 { _watchExpr } from \"../globals.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 _watchExpr(key, ctx, update);\n _watchI18n(update);\n update();\n },\n});\n\nregisterDirective(\"i18n-ns\", {\n priority: 1,\n init(el, name, ns) {\n // Empty ns = marker attribute (e.g. route-view); skip loading\n if (!ns) return;\n\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", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\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: drag, drop, drag-list, drag-multiple\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, resolve } from \"../evaluate.js\";\nimport { findContext } from \"../dom.js\";\nimport { createContext } from \"../context.js\";\nimport { registerDirective, processTree } from \"../registry.js\";\nimport { _onDispose, _warn } from \"../globals.js\";\n\n// \u2500\u2500\u2500 Module-scoped DnD coordination state \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\nconst _dndState = {\n dragging: null, // { item, type, effect, sourceEl, sourceCtx, sourceList, sourceIndex, listDirective }\n selected: new Map(), // group \u2192 Set<{ item, el, ctx }>\n placeholder: null, // current placeholder DOM element\n};\n\n// \u2500\u2500\u2500 Inject built-in DnD styles (once) \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\n// Count visible children, recursing through display:contents wrappers\nfunction _countVisibleChildren(el) {\n let count = 0;\n for (const child of el.children) {\n if (child.classList.contains(\"nojs-drop-placeholder\")) continue;\n const style = child.style || {};\n if (style.display === \"contents\") {\n count += _countVisibleChildren(child);\n } else {\n count++;\n }\n }\n return count;\n}\n\nfunction _injectDndStyles() {\n if (typeof document === \"undefined\") return;\n if (document.querySelector(\"style[data-nojs-dnd]\")) return;\n\n const css = `\n.nojs-dragging {\n opacity: 0.5;\n cursor: grabbing !important;\n}\n.nojs-drag-over {\n outline: 2px dashed #3b82f6;\n outline-offset: -2px;\n}\n.nojs-drop-placeholder {\n border: 2px dashed #3b82f6;\n border-radius: 6px;\n background: color-mix(in srgb, #3b82f6 6%, transparent);\n box-sizing: border-box;\n min-height: 2.5rem;\n transition: all 0.15s ease;\n pointer-events: none;\n}\n.nojs-drop-reject {\n outline: 2px dashed #ef4444;\n outline-offset: -2px;\n background: color-mix(in srgb, #ef4444 4%, transparent);\n}\n.nojs-selected {\n outline: 2px solid #3b82f6;\n outline-offset: 1px;\n}\n[drag-axis=\"x\"] { touch-action: pan-y; }\n[drag-axis=\"y\"] { touch-action: pan-x; }\n@keyframes nojs-drop-settle {\n from { transform: scale(1.05); opacity: 0.8; }\n to { transform: scale(1); opacity: 1; }\n}\n.nojs-drop-settle {\n animation: nojs-drop-settle 0.2s ease-out;\n}\n.nojs-drag-list-empty {\n min-height: 3rem;\n}\n`.trim();\n\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-nojs-dnd\", \"\");\n style.textContent = css;\n document.head.appendChild(style);\n}\n\n// \u2500\u2500\u2500 Helper: calculate drop index from mouse position \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction _calcDropIndex(el, mouseX, mouseY, sortDir) {\n const children = [...el.children].filter(\n (c) => !c.classList.contains(\"nojs-drop-placeholder\")\n );\n if (children.length === 0) return 0;\n\n for (let i = 0; i < children.length; i++) {\n // Use first visible child for display:contents wrappers\n const measured = children[i].style && children[i].style.display === \"contents\"\n ? (children[i].firstElementChild || children[i])\n : children[i];\n const rect = measured.getBoundingClientRect();\n if (sortDir === \"horizontal\") {\n const midX = rect.left + rect.width / 2;\n if (mouseX < midX) return i;\n } else if (sortDir === \"grid\") {\n const midX = rect.left + rect.width / 2;\n const midY = rect.top + rect.height / 2;\n if (mouseY < midY && mouseX < midX) return i;\n if (mouseY < rect.top + rect.height && mouseX < midX) return i;\n } else {\n // vertical (default)\n const midY = rect.top + rect.height / 2;\n if (mouseY < midY) return i;\n }\n }\n return children.length;\n}\n\n// \u2500\u2500\u2500 Helper: manage placeholder \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction _insertPlaceholder(el, index, placeholderAttr, placeholderClass) {\n _removePlaceholder();\n\n let ph;\n if (placeholderAttr === \"auto\") {\n ph = document.createElement(\"div\");\n ph.className = placeholderClass || \"nojs-drop-placeholder\";\n // Size placeholder to match the dragged item\n if (_dndState.dragging && _dndState.dragging.sourceEl) {\n const srcEl = _dndState.dragging.sourceEl.firstElementChild || _dndState.dragging.sourceEl;\n const rect = srcEl.getBoundingClientRect();\n if (rect.height > 0) ph.style.height = rect.height + \"px\";\n if (rect.width > 0) ph.style.width = rect.width + \"px\";\n }\n } else {\n // Template ID\n const tpl = document.getElementById(\n placeholderAttr.startsWith(\"#\") ? placeholderAttr.slice(1) : placeholderAttr\n );\n if (tpl && tpl.content) {\n ph = document.createElement(\"div\");\n ph.style.display = \"contents\";\n ph.className = placeholderClass || \"nojs-drop-placeholder\";\n ph.appendChild(tpl.content.cloneNode(true));\n } else {\n ph = document.createElement(\"div\");\n ph.className = placeholderClass || \"nojs-drop-placeholder\";\n }\n }\n\n ph.classList.add(\"nojs-drop-placeholder\");\n const children = [...el.children].filter(\n (c) => !c.classList.contains(\"nojs-drop-placeholder\")\n );\n\n if (index >= children.length) {\n el.appendChild(ph);\n } else {\n el.insertBefore(ph, children[index]);\n }\n _dndState.placeholder = ph;\n}\n\nfunction _removePlaceholder() {\n if (_dndState.placeholder) {\n _dndState.placeholder.remove();\n _dndState.placeholder = null;\n }\n}\n\n// \u2500\u2500\u2500 Helper: check if type is accepted \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\nfunction _isTypeAccepted(dragType, acceptAttr) {\n if (!acceptAttr || acceptAttr === \"*\") return true;\n const accepted = acceptAttr.split(\",\").map((s) => s.trim());\n return accepted.includes(dragType);\n}\n\n// \u2500\u2500\u2500 Helper: build stacked-cards ghost for multi-drag \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction _buildStackGhost(sourceEl, count) {\n const ghost = document.createElement(\"div\");\n ghost.style.cssText = \"position:fixed;top:-9999px;left:-9999px;pointer-events:none;z-index:99999;\";\n\n const measured = sourceEl.style && sourceEl.style.display === \"contents\"\n ? (sourceEl.firstElementChild || sourceEl) : sourceEl;\n const rect = measured.getBoundingClientRect();\n const w = rect.width;\n const h = rect.height;\n const cs = getComputedStyle(measured);\n const maxStack = Math.min(count, 3);\n\n // Stack layers (back to front)\n for (let i = maxStack - 1; i >= 0; i--) {\n const layer = document.createElement(\"div\");\n const offset = i * 4;\n layer.style.cssText =\n \"position:absolute;\" +\n \"top:\" + offset + \"px;left:\" + offset + \"px;\" +\n \"width:\" + w + \"px;height:\" + h + \"px;\" +\n \"border-radius:\" + cs.borderRadius + \";\" +\n \"box-shadow:0 1px 4px rgba(0,0,0,0.12);\" +\n \"overflow:hidden;box-sizing:border-box;\";\n\n if (i === 0) {\n // Top card: clone content\n layer.innerHTML = measured.innerHTML;\n layer.style.background = cs.backgroundColor || \"#fff\";\n layer.style.border = cs.border;\n layer.style.padding = cs.padding;\n layer.style.fontSize = cs.fontSize;\n layer.style.color = cs.color;\n layer.style.fontFamily = cs.fontFamily;\n } else {\n // Back cards: solid fill\n layer.style.background = cs.backgroundColor || \"#fff\";\n layer.style.border = cs.border || \"1px solid #ddd\";\n }\n ghost.appendChild(layer);\n }\n\n // Count badge\n const badge = document.createElement(\"div\");\n badge.textContent = count;\n badge.style.cssText =\n \"position:absolute;top:-6px;right:-6px;\" +\n \"min-width:22px;height:22px;padding:0 5px;\" +\n \"background:#3b82f6;color:#fff;border-radius:11px;\" +\n \"display:flex;align-items:center;justify-content:center;\" +\n \"font-size:11px;font-weight:700;border:2px solid #fff;\" +\n \"box-shadow:0 1px 3px rgba(0,0,0,0.2);\";\n ghost.appendChild(badge);\n\n // Container size\n ghost.style.width = (w + (maxStack - 1) * 4) + \"px\";\n ghost.style.height = (h + (maxStack - 1) * 4) + \"px\";\n\n return ghost;\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// DRAG DIRECTIVE\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\nregisterDirective(\"drag\", {\n priority: 15,\n init(el, name, expr) {\n _injectDndStyles();\n const ctx = findContext(el);\n\n const type = el.getAttribute(\"drag-type\") || \"default\";\n const effect = el.getAttribute(\"drag-effect\") || \"move\";\n const handleSel = el.getAttribute(\"drag-handle\");\n const imageSel = el.getAttribute(\"drag-image\");\n const imageOffsetAttr = el.getAttribute(\"drag-image-offset\") || \"0,0\";\n const disabledExpr = el.getAttribute(\"drag-disabled\");\n const dragClass = el.getAttribute(\"drag-class\") || \"nojs-dragging\";\n const ghostClass = el.getAttribute(\"drag-ghost-class\");\n\n // Set draggable\n el.draggable = true;\n\n // Accessibility\n el.setAttribute(\"aria-grabbed\", \"false\");\n if (!el.getAttribute(\"tabindex\")) el.setAttribute(\"tabindex\", \"0\");\n\n // Handle restriction: prevent drag from non-handle areas\n let _handleAllowed = true;\n if (handleSel) {\n const mousedownHandler = (e) => {\n _handleAllowed = !!e.target.closest(handleSel);\n };\n el.addEventListener(\"mousedown\", mousedownHandler);\n _onDispose(() => el.removeEventListener(\"mousedown\", mousedownHandler));\n }\n\n // Drag start\n const dragstartHandler = (e) => {\n // Handle check\n if (handleSel && !_handleAllowed) {\n e.preventDefault();\n return;\n }\n\n // Disabled check\n if (disabledExpr && evaluate(disabledExpr, ctx)) {\n e.preventDefault();\n return;\n }\n\n const item = evaluate(expr, ctx);\n\n // Check for multi-select\n const group = el.getAttribute(\"drag-group\");\n let dragItem = item;\n if (group && _dndState.selected.has(group)) {\n const selectedSet = _dndState.selected.get(group);\n if (selectedSet.size > 0) {\n // If this element is selected, drag all selected items\n const hasThis = [...selectedSet].some((s) => s.el === el);\n if (hasThis) {\n dragItem = [...selectedSet].map((s) => s.item);\n }\n }\n }\n\n // Store dragging state\n _dndState.dragging = {\n item: dragItem,\n type,\n effect,\n sourceEl: el,\n sourceCtx: ctx,\n sourceList: null,\n sourceIndex: null,\n listDirective: null,\n };\n\n // Set dataTransfer\n if (e.dataTransfer) {\n e.dataTransfer.effectAllowed = effect;\n e.dataTransfer.setData(\"text/plain\", \"\");\n\n // Multi-select: stacked cards drag image\n if (Array.isArray(dragItem) && dragItem.length > 1 && e.dataTransfer.setDragImage) {\n const ghost = _buildStackGhost(el, dragItem.length);\n document.body.appendChild(ghost);\n const rect = el.getBoundingClientRect();\n e.dataTransfer.setDragImage(ghost, rect.width / 2, rect.height / 2);\n requestAnimationFrame(() => ghost.remove());\n } else if (imageSel && e.dataTransfer.setDragImage) {\n // Custom drag image\n if (imageSel === \"none\") {\n const empty = document.createElement(\"div\");\n empty.style.cssText = \"width:1px;height:1px;opacity:0;position:fixed;top:-999px\";\n document.body.appendChild(empty);\n const [ox, oy] = imageOffsetAttr.split(\",\").map(Number);\n e.dataTransfer.setDragImage(empty, ox || 0, oy || 0);\n requestAnimationFrame(() => empty.remove());\n } else {\n const imgEl = el.querySelector(imageSel);\n if (imgEl) {\n const [ox, oy] = imageOffsetAttr.split(\",\").map(Number);\n if (ghostClass) imgEl.classList.add(ghostClass);\n e.dataTransfer.setDragImage(imgEl, ox || 0, oy || 0);\n }\n }\n }\n }\n\n // Apply drag class to dragged element (and all selected items if multi-select)\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n if (Array.isArray(dragItem) && group && _dndState.selected.has(group)) {\n for (const s of _dndState.selected.get(group)) {\n if (s.el !== el) dragClass.split(/\\s+/).filter(Boolean).forEach((c) => s.el.classList.add(c));\n }\n }\n\n // ARIA\n el.setAttribute(\"aria-grabbed\", \"true\");\n\n // Dispatch custom event\n el.dispatchEvent(\n new CustomEvent(\"drag-start\", {\n bubbles: true,\n detail: { item: dragItem, index: _dndState.dragging.sourceIndex, el },\n })\n );\n };\n\n // Drag end\n const dragendHandler = () => {\n // Remove drag class from this element and all selected items\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n const group = el.getAttribute(\"drag-group\");\n if (group && _dndState.selected.has(group)) {\n for (const s of _dndState.selected.get(group)) {\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => s.el.classList.remove(c));\n }\n }\n\n // ARIA\n el.setAttribute(\"aria-grabbed\", \"false\");\n\n // Ghost class cleanup\n if (ghostClass && imageSel && imageSel !== \"none\") {\n const imgEl = el.querySelector(imageSel);\n if (imgEl) imgEl.classList.remove(ghostClass);\n }\n\n // Dispatch custom event\n el.dispatchEvent(\n new CustomEvent(\"drag-end\", {\n bubbles: true,\n detail: {\n item: _dndState.dragging?.item,\n index: _dndState.dragging?.sourceIndex,\n dropped: _dndState.dragging === null,\n },\n })\n );\n\n // Clear dragging state\n _dndState.dragging = null;\n _removePlaceholder();\n };\n\n el.addEventListener(\"dragstart\", dragstartHandler);\n el.addEventListener(\"dragend\", dragendHandler);\n _onDispose(() => {\n el.removeEventListener(\"dragstart\", dragstartHandler);\n el.removeEventListener(\"dragend\", dragendHandler);\n });\n\n // Reactive disabled toggle\n if (disabledExpr) {\n function updateDisabled() {\n const disabled = !!evaluate(disabledExpr, ctx);\n el.draggable = !disabled;\n if (disabled) el.removeAttribute(\"aria-grabbed\");\n else el.setAttribute(\"aria-grabbed\", \"false\");\n }\n ctx.$watch(updateDisabled);\n }\n\n // Keyboard DnD support\n const keydownHandler = (e) => {\n // Clear stale state from elements removed from DOM\n if (_dndState.dragging && !_dndState.dragging.sourceEl.isConnected) {\n _dndState.dragging = null;\n }\n if (e.key === \" \" && !_dndState.dragging) {\n e.preventDefault();\n const item = evaluate(expr, ctx);\n _dndState.dragging = {\n item,\n type,\n effect,\n sourceEl: el,\n sourceCtx: ctx,\n sourceList: null,\n sourceIndex: null,\n listDirective: null,\n };\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n el.setAttribute(\"aria-grabbed\", \"true\");\n el.dispatchEvent(\n new CustomEvent(\"drag-start\", {\n bubbles: true,\n detail: { item, index: null, el },\n })\n );\n } else if (e.key === \"Escape\" && _dndState.dragging && _dndState.dragging.sourceEl === el) {\n e.preventDefault();\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n el.setAttribute(\"aria-grabbed\", \"false\");\n _dndState.dragging = null;\n _removePlaceholder();\n }\n };\n el.addEventListener(\"keydown\", keydownHandler);\n _onDispose(() => el.removeEventListener(\"keydown\", keydownHandler));\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// DROP DIRECTIVE\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\nregisterDirective(\"drop\", {\n priority: 15,\n init(el, name, expr) {\n _injectDndStyles();\n const ctx = findContext(el);\n\n const acceptAttr = el.getAttribute(\"drop-accept\") || \"default\";\n const dropEffect = el.getAttribute(\"drop-effect\") || \"move\";\n const dropClass = el.getAttribute(\"drop-class\") || \"nojs-drag-over\";\n const rejectClass = el.getAttribute(\"drop-reject-class\") || \"nojs-drop-reject\";\n const disabledExpr = el.getAttribute(\"drop-disabled\");\n const maxExpr = el.getAttribute(\"drop-max\");\n const sortDir = el.getAttribute(\"drop-sort\");\n const placeholderAttr = el.getAttribute(\"drop-placeholder\");\n const placeholderClass = el.getAttribute(\"drop-placeholder-class\");\n\n // Accessibility\n el.setAttribute(\"aria-dropeffect\", dropEffect);\n\n // Track dragenter/dragleave depth for nested elements\n let _enterDepth = 0;\n\n const dragoverHandler = (e) => {\n if (!_dndState.dragging) return;\n\n // Disabled check\n if (disabledExpr && evaluate(disabledExpr, ctx)) return;\n\n const typeOk = _isTypeAccepted(_dndState.dragging.type, acceptAttr);\n let maxOk = true;\n if (maxExpr) {\n const max = evaluate(maxExpr, ctx);\n const childCount = _countVisibleChildren(el);\n if (typeof max === \"number\" && childCount >= max) maxOk = false;\n }\n\n if (!typeOk || !maxOk) {\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n dropClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n _removePlaceholder();\n return;\n }\n\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = dropEffect;\n\n // Sortable: calculate index and show placeholder\n if (sortDir) {\n const idx = _calcDropIndex(el, e.clientX, e.clientY, sortDir);\n if (placeholderAttr) {\n _insertPlaceholder(el, idx, placeholderAttr, placeholderClass);\n }\n // Dispatch throttled drag-over event\n el.dispatchEvent(\n new CustomEvent(\"drag-over\", {\n bubbles: false,\n detail: { item: _dndState.dragging.item, index: idx },\n })\n );\n }\n };\n\n const dragenterHandler = (e) => {\n if (!_dndState.dragging) return;\n if (disabledExpr && evaluate(disabledExpr, ctx)) return;\n\n _enterDepth++;\n if (_enterDepth === 1) {\n const typeOk = _isTypeAccepted(_dndState.dragging.type, acceptAttr);\n let maxOk = true;\n if (maxExpr) {\n const max = evaluate(maxExpr, ctx);\n const childCount = _countVisibleChildren(el);\n if (typeof max === \"number\" && childCount >= max) maxOk = false;\n }\n\n if (typeOk && maxOk) {\n dropClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n el.dispatchEvent(\n new CustomEvent(\"drag-enter\", {\n bubbles: false,\n detail: { item: _dndState.dragging.item, type: _dndState.dragging.type },\n })\n );\n } else {\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n }\n }\n };\n\n const dragleaveHandler = (e) => {\n if (!_dndState.dragging) return;\n\n _enterDepth--;\n if (_enterDepth <= 0) {\n _enterDepth = 0;\n dropClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n _removePlaceholder();\n\n el.dispatchEvent(\n new CustomEvent(\"drag-leave\", {\n bubbles: false,\n detail: { item: _dndState.dragging.item },\n })\n );\n }\n };\n\n const dropHandler = (e) => {\n e.preventDefault();\n e.stopPropagation();\n _enterDepth = 0;\n\n if (!_dndState.dragging) return;\n if (disabledExpr && evaluate(disabledExpr, ctx)) return;\n if (!_isTypeAccepted(_dndState.dragging.type, acceptAttr)) return;\n\n // Max capacity check\n if (maxExpr) {\n const max = evaluate(maxExpr, ctx);\n const childCount = _countVisibleChildren(el);\n if (typeof max === \"number\" && childCount >= max) return;\n }\n\n const dragItem = _dndState.dragging.item;\n const dragType = _dndState.dragging.type;\n const dragEffect = _dndState.dragging.effect;\n\n // Calculate drop index\n let dropIndex = 0;\n if (sortDir) {\n dropIndex = _calcDropIndex(el, e.clientX, e.clientY, sortDir);\n }\n\n // Remove visual feedback\n dropClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n _removePlaceholder();\n\n // Execute drop expression with implicit variables\n const extraVars = {\n $drag: dragItem,\n $dragType: dragType,\n $dragEffect: dragEffect,\n $dropIndex: dropIndex,\n $source: {\n list: _dndState.dragging.sourceList,\n index: _dndState.dragging.sourceIndex,\n el: _dndState.dragging.sourceEl,\n },\n $target: { list: null, index: dropIndex, el },\n $el: el,\n };\n\n _execStatement(expr, ctx, extraVars);\n\n // Clear dragging state BEFORE dispatch to prevent re-entry\n _dndState.dragging = null;\n\n // Dispatch custom event after expression runs\n el.dispatchEvent(\n new CustomEvent(\"drop\", {\n bubbles: false,\n detail: {\n item: dragItem,\n index: dropIndex,\n source: extraVars.$source,\n target: extraVars.$target,\n effect: dragEffect,\n },\n })\n );\n };\n\n // Keyboard: Enter/Space to drop when item is grabbed\n const keydownHandler = (e) => {\n if (!_dndState.dragging) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n dropHandler(e);\n }\n };\n\n el.addEventListener(\"dragover\", dragoverHandler);\n el.addEventListener(\"dragenter\", dragenterHandler);\n el.addEventListener(\"dragleave\", dragleaveHandler);\n el.addEventListener(\"drop\", dropHandler);\n el.addEventListener(\"keydown\", keydownHandler);\n _onDispose(() => {\n el.removeEventListener(\"dragover\", dragoverHandler);\n el.removeEventListener(\"dragenter\", dragenterHandler);\n el.removeEventListener(\"dragleave\", dragleaveHandler);\n el.removeEventListener(\"drop\", dropHandler);\n el.removeEventListener(\"keydown\", keydownHandler);\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// DRAG-LIST DIRECTIVE (Sortable List Shorthand)\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// Keep a registry of drag-list elements for cross-list communication\nconst _dragListRegistry = new Map(); // el \u2192 { listPath, ctx, el }\n\nregisterDirective(\"drag-list\", {\n priority: 10,\n init(el, name, listPath) {\n _injectDndStyles();\n const ctx = findContext(el);\n\n const tplId = el.getAttribute(\"template\");\n const keyProp = el.getAttribute(\"drag-list-key\");\n const itemName = el.getAttribute(\"drag-list-item\") || \"item\";\n const sortDir = el.getAttribute(\"drop-sort\") || \"vertical\";\n const type = el.getAttribute(\"drag-type\") || (\"__draglist_\" + listPath);\n const acceptAttr = el.getAttribute(\"drop-accept\") || type;\n const copyMode = el.hasAttribute(\"drag-list-copy\");\n const removeMode = el.hasAttribute(\"drag-list-remove\");\n const disabledDragExpr = el.getAttribute(\"drag-disabled\");\n const disabledDropExpr = el.getAttribute(\"drop-disabled\");\n const maxExpr = el.getAttribute(\"drop-max\");\n const placeholderAttr = el.getAttribute(\"drop-placeholder\");\n const placeholderClass = el.getAttribute(\"drop-placeholder-class\");\n const dragClass = el.getAttribute(\"drag-class\") || \"nojs-dragging\";\n const dropClass = el.getAttribute(\"drop-class\") || \"nojs-drag-over\";\n const rejectClass = el.getAttribute(\"drop-reject-class\") || \"nojs-drop-reject\";\n const settleClass = el.getAttribute(\"drop-settle-class\") || \"nojs-drop-settle\";\n const emptyClass = el.getAttribute(\"drop-empty-class\") || \"nojs-drag-list-empty\";\n\n // Accessibility\n el.setAttribute(\"role\", \"listbox\");\n el.setAttribute(\"aria-dropeffect\", copyMode ? \"copy\" : \"move\");\n\n // Register for cross-list communication\n const listInfo = { listPath, ctx, el };\n _dragListRegistry.set(el, listInfo);\n _onDispose(() => _dragListRegistry.delete(el));\n\n let _enterDepth = 0;\n let _prevList = null;\n\n // \u2500\u2500\u2500 Render items \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function renderItems() {\n const list = resolve(listPath, ctx);\n if (!Array.isArray(list)) return;\n\n // Same reference & items already rendered \u2014 propagate to children\n // without rebuilding the DOM (preserves focus, input state, etc.)\n if (list === _prevList && list.length > 0 && el.children.length > 0) {\n for (const child of el.children) {\n if (child.__ctx && child.__ctx.$notify) child.__ctx.$notify();\n }\n return;\n }\n _prevList = list;\n\n const tpl = tplId ? document.getElementById(tplId) : null;\n if (!tpl) return;\n\n el.innerHTML = \"\";\n const count = list.length;\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.setAttribute(\"role\", \"option\");\n\n // Append clone first so we can access the visible child\n wrapper.appendChild(clone);\n el.appendChild(wrapper);\n\n // The drag source is the first visible child\n // (display:contents wrapper has no box, so draggable must be on a rendered element)\n const dragEl = wrapper.firstElementChild || wrapper;\n dragEl.draggable = true;\n dragEl.setAttribute(\"aria-grabbed\", \"false\");\n if (!dragEl.getAttribute(\"tabindex\")) dragEl.setAttribute(\"tabindex\", \"0\");\n\n // Per-item drag handlers (on wrapper so events from dragEl bubble up to them)\n const itemDragstart = (e) => {\n if (disabledDragExpr && evaluate(disabledDragExpr, ctx)) {\n e.preventDefault();\n return;\n }\n _dndState.dragging = {\n item,\n type,\n effect: copyMode ? \"copy\" : \"move\",\n sourceEl: wrapper,\n sourceCtx: childCtx,\n sourceList: list,\n sourceIndex: i,\n listDirective: { el, listPath, ctx, keyProp, copyMode, removeMode },\n };\n if (e.dataTransfer) {\n e.dataTransfer.effectAllowed = copyMode ? \"copy\" : \"move\";\n e.dataTransfer.setData(\"text/plain\", \"\");\n }\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => dragEl.classList.add(c));\n dragEl.setAttribute(\"aria-grabbed\", \"true\");\n\n el.dispatchEvent(\n new CustomEvent(\"drag-start\", {\n bubbles: true,\n detail: { item, index: i, el: dragEl },\n })\n );\n };\n\n const itemDragend = () => {\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => dragEl.classList.remove(c));\n dragEl.setAttribute(\"aria-grabbed\", \"false\");\n\n // If drag-list-remove and item was NOT dropped in a target, no action\n // If dragging state is still set, it wasn't dropped\n if (_dndState.dragging && _dndState.dragging.sourceEl === wrapper) {\n _dndState.dragging = null;\n }\n _removePlaceholder();\n };\n\n wrapper.addEventListener(\"dragstart\", itemDragstart);\n wrapper.addEventListener(\"dragend\", itemDragend);\n\n // Keyboard DnD on items\n wrapper.addEventListener(\"keydown\", (e) => {\n if (e.key === \" \" && !_dndState.dragging) {\n e.preventDefault();\n _dndState.dragging = {\n item,\n type,\n effect: copyMode ? \"copy\" : \"move\",\n sourceEl: wrapper,\n sourceCtx: childCtx,\n sourceList: list,\n sourceIndex: i,\n listDirective: { el, listPath, ctx, keyProp, copyMode, removeMode },\n };\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => dragEl.classList.add(c));\n dragEl.setAttribute(\"aria-grabbed\", \"true\");\n } else if (e.key === \"Escape\" && _dndState.dragging && _dndState.dragging.sourceEl === wrapper) {\n e.preventDefault();\n dragClass.split(/\\s+/).filter(Boolean).forEach((c) => dragEl.classList.remove(c));\n dragEl.setAttribute(\"aria-grabbed\", \"false\");\n _dndState.dragging = null;\n _removePlaceholder();\n } else if ((e.key === \"ArrowDown\" || e.key === \"ArrowRight\") && _dndState.dragging && _dndState.dragging.sourceEl === wrapper) {\n e.preventDefault();\n // Navigate to next item via wrapper siblings\n const nextWrapper = wrapper.nextElementSibling;\n if (nextWrapper) {\n const nextEl = nextWrapper.firstElementChild || nextWrapper;\n nextEl.focus();\n }\n } else if ((e.key === \"ArrowUp\" || e.key === \"ArrowLeft\") && _dndState.dragging && _dndState.dragging.sourceEl === wrapper) {\n e.preventDefault();\n const prevWrapper = wrapper.previousElementSibling;\n if (prevWrapper) {\n const prevEl = prevWrapper.firstElementChild || prevWrapper;\n prevEl.focus();\n }\n }\n });\n\n processTree(wrapper);\n });\n\n // Toggle empty class so the container remains a viable drop target\n const isEmpty = list.length === 0;\n emptyClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.toggle(c, isEmpty));\n }\n\n // \u2500\u2500\u2500 Drop zone handlers on the list container \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const dragoverHandler = (e) => {\n if (!_dndState.dragging) return;\n if (disabledDropExpr && evaluate(disabledDropExpr, ctx)) return;\n\n const typeOk = _isTypeAccepted(_dndState.dragging.type, acceptAttr);\n let maxOk = true;\n if (maxExpr) {\n const max = evaluate(maxExpr, ctx);\n const list = resolve(listPath, ctx);\n if (typeof max === \"number\" && Array.isArray(list) && list.length >= max) maxOk = false;\n }\n\n if (!typeOk || !maxOk) {\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n dropClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n _removePlaceholder();\n return;\n }\n\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = copyMode ? \"copy\" : \"move\";\n\n const idx = _calcDropIndex(el, e.clientX, e.clientY, sortDir);\n if (placeholderAttr) {\n _insertPlaceholder(el, idx, placeholderAttr, placeholderClass);\n }\n };\n\n const dragenterHandler = (e) => {\n if (!_dndState.dragging) return;\n if (disabledDropExpr && evaluate(disabledDropExpr, ctx)) return;\n\n _enterDepth++;\n if (_enterDepth === 1) {\n const typeOk = _isTypeAccepted(_dndState.dragging.type, acceptAttr);\n let maxOk = true;\n if (maxExpr) {\n const max = evaluate(maxExpr, ctx);\n const list = resolve(listPath, ctx);\n if (typeof max === \"number\" && Array.isArray(list) && list.length >= max) maxOk = false;\n }\n\n if (typeOk && maxOk) {\n dropClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n el.dispatchEvent(\n new CustomEvent(\"drag-enter\", {\n bubbles: false,\n detail: { item: _dndState.dragging.item, type: _dndState.dragging.type },\n })\n );\n } else {\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n }\n }\n };\n\n const dragleaveHandler = () => {\n if (!_dndState.dragging) return;\n _enterDepth--;\n if (_enterDepth <= 0) {\n _enterDepth = 0;\n dropClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n _removePlaceholder();\n el.dispatchEvent(\n new CustomEvent(\"drag-leave\", {\n bubbles: false,\n detail: { item: _dndState.dragging?.item },\n })\n );\n }\n };\n\n const dropHandler = (e) => {\n e.preventDefault();\n e.stopPropagation();\n _enterDepth = 0;\n\n if (!_dndState.dragging) return;\n if (disabledDropExpr && evaluate(disabledDropExpr, ctx)) return;\n if (!_isTypeAccepted(_dndState.dragging.type, acceptAttr)) return;\n\n // Max check\n if (maxExpr) {\n const max = evaluate(maxExpr, ctx);\n const list = resolve(listPath, ctx);\n if (typeof max === \"number\" && Array.isArray(list) && list.length >= max) return;\n }\n\n const dragItem = _dndState.dragging.item;\n const sourceInfo = _dndState.dragging.listDirective;\n const sourceIndex = _dndState.dragging.sourceIndex;\n\n const dropIndex = _calcDropIndex(el, e.clientX, e.clientY, sortDir);\n\n // Remove visual feedback\n dropClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n rejectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n _removePlaceholder();\n\n const targetList = resolve(listPath, ctx);\n if (!Array.isArray(targetList)) return;\n\n // Self-drop check: same list, same position\n const isSameList = sourceInfo && sourceInfo.el === el;\n if (isSameList && sourceIndex === dropIndex) {\n _dndState.dragging = null;\n return;\n }\n // Same list, but adjacent position (effectively same position)\n if (isSameList && sourceIndex + 1 === dropIndex) {\n _dndState.dragging = null;\n return;\n }\n\n // Perform the list mutation\n let newTargetList = [...targetList];\n\n if (isSameList) {\n // Same-list reorder\n const [moved] = newTargetList.splice(sourceIndex, 1);\n const insertAt = sourceIndex < dropIndex ? dropIndex - 1 : dropIndex;\n newTargetList.splice(insertAt, 0, moved);\n ctx.$set(listPath, newTargetList);\n\n el.dispatchEvent(\n new CustomEvent(\"reorder\", {\n bubbles: true,\n detail: { list: newTargetList, item: dragItem, from: sourceIndex, to: insertAt },\n })\n );\n } else {\n // Cross-list transfer\n const itemToInsert = copyMode ? (typeof dragItem === \"object\" ? { ...dragItem } : dragItem) : dragItem;\n newTargetList.splice(dropIndex, 0, itemToInsert);\n ctx.$set(listPath, newTargetList);\n\n // Remove from source if move mode\n if (sourceInfo && !sourceInfo.copyMode && (removeMode || sourceInfo.removeMode)) {\n const sourceList = resolve(sourceInfo.listPath, sourceInfo.ctx);\n if (Array.isArray(sourceList) && sourceIndex != null) {\n const newSourceList = sourceList.filter((_, idx) => idx !== sourceIndex);\n sourceInfo.ctx.$set(sourceInfo.listPath, newSourceList);\n\n sourceInfo.el.dispatchEvent(\n new CustomEvent(\"remove\", {\n bubbles: true,\n detail: { list: newSourceList, item: dragItem, index: sourceIndex },\n })\n );\n }\n }\n\n el.dispatchEvent(\n new CustomEvent(\"receive\", {\n bubbles: true,\n detail: {\n list: newTargetList,\n item: dragItem,\n from: sourceIndex,\n fromList: sourceInfo ? resolve(sourceInfo.listPath, sourceInfo.ctx) : null,\n },\n })\n );\n }\n\n // Settle animation (apply to visible child, not display:contents wrapper)\n requestAnimationFrame(() => {\n const children = [...el.children];\n const targetChild = children[isSameList ? (sourceIndex < dropIndex ? dropIndex - 1 : dropIndex) : dropIndex];\n if (targetChild) {\n const animEl = targetChild.firstElementChild || targetChild;\n settleClass.split(/\\s+/).filter(Boolean).forEach((c) => animEl.classList.add(c));\n animEl.addEventListener(\"animationend\", () => {\n settleClass.split(/\\s+/).filter(Boolean).forEach((c) => animEl.classList.remove(c));\n }, { once: true });\n }\n });\n\n // Clear dragging state\n _dndState.dragging = null;\n };\n\n // Keyboard: Enter/Space to drop\n const keydownHandler = (e) => {\n if (!_dndState.dragging) return;\n if (!_isTypeAccepted(_dndState.dragging.type, acceptAttr)) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n // Simulate drop at the focused element's position\n const focused = el.querySelector(\":focus\");\n if (focused) {\n const measured = focused.style?.display === \"contents\"\n ? (focused.firstElementChild || focused) : focused;\n const rect = measured.getBoundingClientRect();\n const fakeEvent = {\n preventDefault() {},\n stopPropagation() {},\n clientX: rect.left + rect.width / 2,\n clientY: rect.top + rect.height + 1,\n dataTransfer: null,\n };\n dropHandler(fakeEvent);\n }\n }\n };\n\n el.addEventListener(\"dragover\", dragoverHandler);\n el.addEventListener(\"dragenter\", dragenterHandler);\n el.addEventListener(\"dragleave\", dragleaveHandler);\n el.addEventListener(\"drop\", dropHandler);\n el.addEventListener(\"keydown\", keydownHandler);\n _onDispose(() => {\n el.removeEventListener(\"dragover\", dragoverHandler);\n el.removeEventListener(\"dragenter\", dragenterHandler);\n el.removeEventListener(\"dragleave\", dragleaveHandler);\n el.removeEventListener(\"drop\", dropHandler);\n el.removeEventListener(\"keydown\", keydownHandler);\n });\n\n // \u2500\u2500\u2500 Reactive rendering \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n ctx.$watch(renderItems);\n renderItems();\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// DRAG-MULTIPLE DIRECTIVE\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\nregisterDirective(\"drag-multiple\", {\n priority: 16,\n init(el, name) {\n const ctx = findContext(el);\n const group = el.getAttribute(\"drag-group\");\n const selectClass = el.getAttribute(\"drag-multiple-class\") || \"nojs-selected\";\n\n if (!group) {\n _warn(\"drag-multiple requires drag-group attribute\");\n return;\n }\n\n // Initialize group set if needed\n if (!_dndState.selected.has(group)) {\n _dndState.selected.set(group, new Set());\n }\n const selectedSet = _dndState.selected.get(group);\n\n const clickHandler = (e) => {\n const dragExpr = el.getAttribute(\"drag\");\n const item = dragExpr ? evaluate(dragExpr, ctx) : null;\n const entry = { item, el, ctx };\n\n if (e.ctrlKey || e.metaKey) {\n // Additive selection\n const existing = [...selectedSet].find((s) => s.el === el);\n if (existing) {\n selectedSet.delete(existing);\n selectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.remove(c));\n } else {\n selectedSet.add(entry);\n selectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n }\n } else {\n // Replace selection\n for (const s of selectedSet) {\n selectClass.split(/\\s+/).filter(Boolean).forEach((c) => s.el.classList.remove(c));\n }\n selectedSet.clear();\n selectedSet.add(entry);\n selectClass.split(/\\s+/).filter(Boolean).forEach((c) => el.classList.add(c));\n }\n };\n\n el.addEventListener(\"click\", clickHandler);\n _onDispose(() => {\n el.removeEventListener(\"click\", clickHandler);\n // Remove this element from the selection set\n const existing = [...selectedSet].find((s) => s.el === el);\n if (existing) selectedSet.delete(existing);\n });\n\n // Escape clears selection for this group\n const escHandler = (e) => {\n if (e.key === \"Escape\") {\n for (const s of selectedSet) {\n selectClass.split(/\\s+/).filter(Boolean).forEach((c) => s.el.classList.remove(c));\n }\n selectedSet.clear();\n }\n };\n window.addEventListener(\"keydown\", escHandler);\n _onDispose(() => window.removeEventListener(\"keydown\", escHandler));\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", "e", "n", "locales", "l", "init_i18n", "__esmMin", "init_globals", "v", "allNs", "params", "messages", "msg", "k", "forms", "s", "_", "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", "parts", "proxy", "obj", "i", "lastKey", "old", "_refs", "_stores", "_routerInstance", "_i18n", "value", "_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", "origObj", "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", "warmups", "sub", "subSrc", "subUrl", "r", "h", "_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", "called", "_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", "_prefetchRoutes", "rawSrc", "routeLazy", "raw", "lazy", "prev", "priorityFetches", "backgroundFetches", "templateEl", "outlet", "e", "anchor", "target", "p", "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", "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", "_watchExpr", "prev", "prevExpr", "val", "matched", "caseVal", "isDefault", "thenTpl", "values", "v", "init_globals", "registerDirective", "el", "name", "expr", "ctx", "findContext", "match", "itemName", "listPath", "tplId", "elseTpl", "keyExpr", "animEnter", "animLeave", "stagger", "animDuration", "prevList", "update", "list", "evaluate", "resolve", "child", "clone", "_cloneTemplate", "processTree", "tpl", "oldItems", "remaining", "target", "done", "renderItems", "count", "item", "i", "childData", "childCtx", "createContext", "wrapper", "firstChild", "_watchExpr", "fromPath", "indexName", "filterExpr", "sortProp", "limit", "offset", "templateContent", "tempCtx", "desc", "key", "a", "b", "va", "vb", "r", "renderForeachItems", "init_globals", "init_i18n", "registerDirective", "el", "name", "expr", "suffix", "ctx", "findContext", "update", "obj", "evaluate", "cls", "cond", "c", "_watchExpr", "arr", "prevClasses", "next", "_watchI18n", "prop", "val", "cssProp", "_", "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", "_onDispose", "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", "init_globals", "registerDirective", "el", "name", "key", "ctx", "findContext", "useHtml", "update", "params", "attr", "paramName", "evaluate", "text", "_i18n", "_watchExpr", "_watchI18n", "ns", "saved", "_loadI18nNamespace", "processTree", "_notifyI18n", "init_globals", "_dndState", "_countVisibleChildren", "el", "count", "child", "_injectDndStyles", "css", "style", "_calcDropIndex", "mouseX", "mouseY", "sortDir", "children", "c", "rect", "midX", "midY", "_insertPlaceholder", "index", "placeholderAttr", "placeholderClass", "_removePlaceholder", "ph", "tpl", "_isTypeAccepted", "dragType", "acceptAttr", "s", "_buildStackGhost", "sourceEl", "ghost", "measured", "w", "h", "cs", "maxStack", "i", "layer", "offset", "badge", "registerDirective", "name", "expr", "ctx", "findContext", "type", "effect", "handleSel", "imageSel", "imageOffsetAttr", "disabledExpr", "dragClass", "ghostClass", "_handleAllowed", "mousedownHandler", "e", "_onDispose", "dragstartHandler", "evaluate", "item", "group", "dragItem", "selectedSet", "empty", "ox", "oy", "imgEl", "dragendHandler", "updateDisabled", "disabled", "keydownHandler", "dropEffect", "dropClass", "rejectClass", "maxExpr", "_enterDepth", "dragoverHandler", "typeOk", "maxOk", "max", "childCount", "idx", "dragenterHandler", "dragleaveHandler", "dropHandler", "dragEffect", "dropIndex", "extraVars", "_execStatement", "_dragListRegistry", "listPath", "tplId", "keyProp", "itemName", "copyMode", "removeMode", "disabledDragExpr", "disabledDropExpr", "settleClass", "emptyClass", "listInfo", "_prevList", "renderItems", "list", "resolve", "childData", "childCtx", "createContext", "clone", "wrapper", "dragEl", "itemDragstart", "itemDragend", "nextWrapper", "prevWrapper", "processTree", "isEmpty", "sourceInfo", "sourceIndex", "targetList", "isSameList", "newTargetList", "moved", "insertAt", "itemToInsert", "sourceList", "newSourceList", "_", "targetChild", "animEl", "focused", "fakeEvent", "selectClass", "_warn", "clickHandler", "dragExpr", "entry", "existing", "escHandler", "_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
  }