@vobs/transition 1.2.1 → 1.2.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.
- package/dist/driver.cjs +36 -146
- package/dist/driver.cjs.map +1 -1
- package/dist/driver.js +8 -140
- package/dist/driver.js.map +1 -1
- package/dist/index.cjs +58 -551
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +16 -528
- package/dist/index.js.map +1 -1
- package/dist/transition.cjs +53 -550
- package/dist/transition.cjs.map +1 -1
- package/dist/transition.js +14 -528
- package/dist/transition.js.map +1 -1
- package/dist/types.cjs +18 -2
- package/dist/types.cjs.map +1 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +1 -1
- package/package.json +6 -6
package/dist/driver.cjs
CHANGED
|
@@ -1,146 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
var __VOBS_CJS_FILE_URL = require("url").pathToFileURL(__filename).href;
|
|
2
|
+
"use strict";
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
7
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
function hasDebugHooks() {
|
|
9
|
-
return activeDebugHooks !== null;
|
|
10
|
-
}
|
|
11
|
-
__name(hasDebugHooks, "hasDebugHooks");
|
|
12
|
-
function invokeDebug(name, ...args) {
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
__name(invokeDebug, "invokeDebug");
|
|
16
|
-
|
|
17
|
-
// packages/reactivity/src/scheduler.ts
|
|
18
|
-
var _Scheduler = class _Scheduler {
|
|
19
|
-
constructor() {
|
|
20
|
-
this.dirtyEffects = /* @__PURE__ */ new Set();
|
|
21
|
-
this.lowPriorityEffects = /* @__PURE__ */ new Set();
|
|
22
|
-
// flush 不可重入(flushing 标志保证),缓冲数组可在轮次间安全复用,避免每轮分配。
|
|
23
|
-
this.normalBuffer = [];
|
|
24
|
-
this.lowBuffer = [];
|
|
25
|
-
this.flushing = false;
|
|
26
|
-
this.scheduled = false;
|
|
27
|
-
this.batchDepth = 0;
|
|
28
|
-
}
|
|
29
|
-
schedule(effect2) {
|
|
30
|
-
if (effect2.disposed) return;
|
|
31
|
-
this.dirtyEffects.add(effect2);
|
|
32
|
-
this.lowPriorityEffects.delete(effect2);
|
|
33
|
-
this.ensureScheduled();
|
|
34
|
-
}
|
|
35
|
-
/** Queue an effect behind normal updates while preserving deterministic order. */
|
|
36
|
-
scheduleLow(effect2) {
|
|
37
|
-
if (effect2.disposed) return;
|
|
38
|
-
if (!this.dirtyEffects.has(effect2)) this.lowPriorityEffects.add(effect2);
|
|
39
|
-
this.ensureScheduled();
|
|
40
|
-
}
|
|
41
|
-
ensureScheduled() {
|
|
42
|
-
if (this.batchDepth === 0 && !this.flushing && !this.scheduled) {
|
|
43
|
-
this.scheduled = true;
|
|
44
|
-
queueMicrotask(() => {
|
|
45
|
-
this.scheduled = false;
|
|
46
|
-
this.flush();
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
remove(effect2) {
|
|
51
|
-
this.dirtyEffects.delete(effect2);
|
|
52
|
-
this.lowPriorityEffects.delete(effect2);
|
|
53
|
-
}
|
|
54
|
-
batch(fn) {
|
|
55
|
-
this.batchDepth++;
|
|
56
|
-
try {
|
|
57
|
-
return fn();
|
|
58
|
-
} finally {
|
|
59
|
-
this.batchDepth--;
|
|
60
|
-
if (this.batchDepth === 0) this.flush();
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
flush() {
|
|
64
|
-
if (this.flushing || this.batchDepth > 0) return;
|
|
65
|
-
this.flushing = true;
|
|
66
|
-
let rounds = 0;
|
|
67
|
-
let firstError;
|
|
68
|
-
let hasError = false;
|
|
69
|
-
try {
|
|
70
|
-
while (this.dirtyEffects.size > 0 || this.lowPriorityEffects.size > 0) {
|
|
71
|
-
if (++rounds > 100) {
|
|
72
|
-
this.dirtyEffects.clear();
|
|
73
|
-
this.lowPriorityEffects.clear();
|
|
74
|
-
throw new Error("Vobs: \u54CD\u5E94\u5F0F\u66F4\u65B0\u8D85\u8FC7 100 \u8F6E\uFF0C\u53EF\u80FD\u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56");
|
|
75
|
-
}
|
|
76
|
-
this.collectRunnable(this.dirtyEffects, this.normalBuffer);
|
|
77
|
-
this.collectRunnable(this.lowPriorityEffects, this.lowBuffer);
|
|
78
|
-
sortEffects(this.normalBuffer);
|
|
79
|
-
sortEffects(this.lowBuffer);
|
|
80
|
-
for (const effect2 of this.normalBuffer) {
|
|
81
|
-
try {
|
|
82
|
-
effect2.run();
|
|
83
|
-
} catch (error) {
|
|
84
|
-
if (!hasError) {
|
|
85
|
-
firstError = error;
|
|
86
|
-
hasError = true;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
for (const effect2 of this.lowBuffer) {
|
|
91
|
-
try {
|
|
92
|
-
effect2.run();
|
|
93
|
-
} catch (error) {
|
|
94
|
-
if (!hasError) {
|
|
95
|
-
firstError = error;
|
|
96
|
-
hasError = true;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
this.normalBuffer.length = 0;
|
|
101
|
-
this.lowBuffer.length = 0;
|
|
102
|
-
}
|
|
103
|
-
} finally {
|
|
104
|
-
this.normalBuffer.length = 0;
|
|
105
|
-
this.lowBuffer.length = 0;
|
|
106
|
-
this.flushing = false;
|
|
107
|
-
}
|
|
108
|
-
if (hasError) throw firstError;
|
|
109
|
-
}
|
|
110
|
-
/** 收集未 disposed 的 effect 并清空源集合;run() 期间新调度的 effect 留给下一轮。 */
|
|
111
|
-
collectRunnable(source, target) {
|
|
112
|
-
for (const effect2 of source) {
|
|
113
|
-
if (!effect2.disposed) target.push(effect2);
|
|
114
|
-
}
|
|
115
|
-
source.clear();
|
|
116
|
-
}
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
117
11
|
};
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
122
17
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
// packages/runtime/src/hmr.ts
|
|
127
|
-
var globalTarget = globalThis;
|
|
128
|
-
var hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: /* @__PURE__ */ new Map() };
|
|
129
|
-
globalTarget.__VOBS_HMR__ = hmrGlobal;
|
|
130
|
-
function getRenderer() {
|
|
131
|
-
{
|
|
132
|
-
throw new Error("\u6E32\u67D3\u5668\u672A\u521D\u59CB\u5316");
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
__name(getRenderer, "getRenderer");
|
|
136
|
-
|
|
137
|
-
// packages/runtime/src/fragment.ts
|
|
138
|
-
function isVobsFragment(value) {
|
|
139
|
-
return Boolean(value) && typeof value === "object" && value.kind === "vobs-fragment";
|
|
140
|
-
}
|
|
141
|
-
__name(isVobsFragment, "isVobsFragment");
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
142
21
|
|
|
143
22
|
// packages/transition/src/driver.ts
|
|
23
|
+
var driver_exports = {};
|
|
24
|
+
__export(driver_exports, {
|
|
25
|
+
asTransitionElement: () => asTransitionElement,
|
|
26
|
+
createCSSTransitionDriver: () => createCSSTransitionDriver,
|
|
27
|
+
cssTransitionDriver: () => cssTransitionDriver,
|
|
28
|
+
resolveReducedMotion: () => resolveReducedMotion,
|
|
29
|
+
runTransition: () => runTransition
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(driver_exports);
|
|
32
|
+
var import_vobs = require("@vobs/vobs");
|
|
144
33
|
function runTransition(node, status, options, done) {
|
|
145
34
|
const elements = getTransitionElements(node);
|
|
146
35
|
if (elements.length === 0 || options.reducedMotion || !options.css && !hasStyles(options.phase)) {
|
|
@@ -225,9 +114,9 @@ __name(resolveReducedMotion, "resolveReducedMotion");
|
|
|
225
114
|
function getTransitionElements(node) {
|
|
226
115
|
const element = asTransitionElement(node);
|
|
227
116
|
if (element) return [element];
|
|
228
|
-
if (!isVobsFragment(node)) return [];
|
|
117
|
+
if (!(0, import_vobs.isVobsFragment)(node)) return [];
|
|
229
118
|
const elements = [];
|
|
230
|
-
const renderer = getRenderer();
|
|
119
|
+
const renderer = (0, import_vobs.getRenderer)();
|
|
231
120
|
let current = renderer.nextSibling(node.start);
|
|
232
121
|
while (current && current !== node.end) {
|
|
233
122
|
const child = asTransitionElement(current);
|
|
@@ -320,11 +209,12 @@ function cancelFrame(handle) {
|
|
|
320
209
|
else clearTimeout(handle);
|
|
321
210
|
}
|
|
322
211
|
__name(cancelFrame, "cancelFrame");
|
|
323
|
-
|
|
324
|
-
exports
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
212
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
213
|
+
0 && (module.exports = {
|
|
214
|
+
asTransitionElement,
|
|
215
|
+
createCSSTransitionDriver,
|
|
216
|
+
cssTransitionDriver,
|
|
217
|
+
resolveReducedMotion,
|
|
218
|
+
runTransition
|
|
219
|
+
});
|
|
330
220
|
//# sourceMappingURL=driver.cjs.map
|
package/dist/driver.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../reactivity/src/debug.ts","../../reactivity/src/scheduler.ts","../../runtime/src/hmr.ts","../../runtime/src/ops.ts","../../runtime/src/fragment.ts","../src/driver.ts"],"names":["effect"],"mappings":"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","file":"driver.cjs","sourcesContent":["import type { Effect } from './effect'\nimport type { Owner } from './owner'\nimport type { Dependency, ReadableSignal, Subscriber } from './signal'\n\nexport interface ReactivityDebugHooks {\n ownerCreated?(owner: Owner): void\n ownerNamed?(owner: Owner, name: string): void\n ownerDisposed?(owner: Owner): void\n signalCreated?(signal: ReadableSignal<unknown>, owner: Owner | null): void\n signalNamed?(signal: ReadableSignal<unknown>, name: string): void\n signalRead?(signal: ReadableSignal<unknown>, subscriber: Subscriber): void\n signalChanged?(signal: ReadableSignal<unknown>, previousValue: unknown, nextValue: unknown): void\n signalDisposed?(signal: ReadableSignal<unknown>): void\n dependencyTracked?(dependency: Dependency, subscriber: Subscriber): void\n dependencyUntracked?(dependency: Dependency, subscriber: Subscriber): void\n effectCreated?(effect: Effect, owner: Owner | null): void\n effectInvalidated?(effect: Effect): void\n effectRunStart?(effect: Effect): void\n effectRunEnd?(effect: Effect, error?: unknown, handled?: boolean): void\n effectDisposed?(effect: Effect): void\n memoCreated?(signal: ReadableSignal<unknown>, subscriber: Subscriber, owner: Owner | null): void\n memoInvalidated?(signal: ReadableSignal<unknown>): void\n flushStart?(): void\n flushEnd?(): void\n}\n\nlet activeDebugHooks: ReactivityDebugHooks | null = null\nconst signalNames = new WeakMap<object, string>()\n\nexport function setDebugHooks(hooks: ReactivityDebugHooks | null): ReactivityDebugHooks | null {\n const previous = activeDebugHooks\n activeDebugHooks = hooks\n return previous\n}\n\nexport function getDebugHooks(): ReactivityDebugHooks | null {\n return activeDebugHooks\n}\n\n/** 热路径守卫:无 hooks 时跳过 invokeDebug 调用,避免 rest 参数数组分配。 */\nexport function hasDebugHooks(): boolean {\n return activeDebugHooks !== null\n}\n\nexport function setSignalDebugName(signal: ReadableSignal<unknown>, name: string): void {\n signalNames.set(signal, name)\n invokeDebug('signalNamed', signal, name)\n}\n\nexport function getSignalDebugName(signal: ReadableSignal<unknown>): string | undefined {\n return signalNames.get(signal)\n}\n\nexport function invokeDebug<K extends keyof ReactivityDebugHooks>(\n name: K,\n ...args: Parameters<NonNullable<ReactivityDebugHooks[K]>>\n): void {\n const callback = activeDebugHooks?.[name] as ((...values: unknown[]) => void) | undefined\n if (!callback) return\n try {\n callback(...args)\n } catch {\n // Debug tooling must never change application behavior.\n }\n}\n","import type { Effect } from './effect'\nimport { hasDebugHooks, invokeDebug } from './debug'\n\nexport class Scheduler {\n private readonly dirtyEffects = new Set<Effect>()\n private readonly lowPriorityEffects = new Set<Effect>()\n // flush 不可重入(flushing 标志保证),缓冲数组可在轮次间安全复用,避免每轮分配。\n private readonly normalBuffer: Effect[] = []\n private readonly lowBuffer: Effect[] = []\n private flushing = false\n private scheduled = false\n private batchDepth = 0\n\n schedule(effect: Effect): void {\n if (effect.disposed) return\n this.dirtyEffects.add(effect)\n this.lowPriorityEffects.delete(effect)\n this.ensureScheduled()\n }\n\n /** Queue an effect behind normal updates while preserving deterministic order. */\n scheduleLow(effect: Effect): void {\n if (effect.disposed) return\n if (!this.dirtyEffects.has(effect)) this.lowPriorityEffects.add(effect)\n this.ensureScheduled()\n }\n\n private ensureScheduled(): void {\n if (this.batchDepth === 0 && !this.flushing && !this.scheduled) {\n this.scheduled = true\n queueMicrotask(() => {\n this.scheduled = false\n this.flush()\n })\n }\n }\n\n remove(effect: Effect): void {\n this.dirtyEffects.delete(effect)\n this.lowPriorityEffects.delete(effect)\n }\n\n batch<T>(fn: () => T): T {\n this.batchDepth++\n try {\n return fn()\n } finally {\n this.batchDepth--\n if (this.batchDepth === 0) this.flush()\n }\n }\n\n flush(): void {\n if (this.flushing || this.batchDepth > 0) return\n this.flushing = true\n const debugEnabled = hasDebugHooks()\n if (debugEnabled) invokeDebug('flushStart')\n let rounds = 0\n let firstError: unknown\n let hasError = false\n try {\n while (this.dirtyEffects.size > 0 || this.lowPriorityEffects.size > 0) {\n if (++rounds > 100) {\n this.dirtyEffects.clear()\n this.lowPriorityEffects.clear()\n throw new Error('Vobs: 响应式更新超过 100 轮,可能存在循环依赖')\n }\n\n // normal 先、low 后,两组分别排序:与旧的合并排序语义一致\n // (旧比较器里 low 优先级本就高于 depth),但消除了比较器内的 Set 查找。\n this.collectRunnable(this.dirtyEffects, this.normalBuffer)\n this.collectRunnable(this.lowPriorityEffects, this.lowBuffer)\n sortEffects(this.normalBuffer)\n sortEffects(this.lowBuffer)\n for (const effect of this.normalBuffer) {\n try {\n effect.run()\n } catch (error) {\n // Isolate one failed effect from the rest of the flush. Re-throw\n // the first error after all runnable effects have had a chance.\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n for (const effect of this.lowBuffer) {\n try {\n effect.run()\n } catch (error) {\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n this.normalBuffer.length = 0\n this.lowBuffer.length = 0\n }\n } finally {\n this.normalBuffer.length = 0\n this.lowBuffer.length = 0\n this.flushing = false\n if (debugEnabled) invokeDebug('flushEnd')\n }\n if (hasError) throw firstError\n }\n\n /** 收集未 disposed 的 effect 并清空源集合;run() 期间新调度的 effect 留给下一轮。 */\n private collectRunnable(source: Set<Effect>, target: Effect[]): void {\n for (const effect of source) {\n if (!effect.disposed) target.push(effect)\n }\n source.clear()\n }\n}\n\n/** depth 深的先跑(子 effect 先于父),同深度按创建顺序。 */\nfunction sortEffects(effects: Effect[]): void {\n if (effects.length > 1) {\n effects.sort((a, b) => b.depth - a.depth || a.order - b.order)\n }\n}\n\nexport const scheduler = new Scheduler()\n\nexport function batch<T>(fn: () => T): T {\n return scheduler.batch(fn)\n}\n\n/** Schedule a low-priority effect explicitly. */\nexport function scheduleLow(effect: Effect): void {\n effect.scheduleLow()\n}\n","import type { VobsNode } from './fragment'\n\nexport type HmrComponent<Props extends object = Record<string, unknown>> =\n (props: Props) => VobsNode\n\nexport interface HmrStateStore {\n get<T>(key: string, initial: T | (() => T)): T\n set<T>(key: string, value: T): void\n has(key: string): boolean\n delete(key: string): void\n clear(): void\n}\n\nexport interface HmrInstance {\n node: VobsNode\n parent: Node | null\n refresh(): void\n}\n\ninterface HmrModuleState {\n readonly components: Map<string, HmrComponent>\n readonly state: Map<string, unknown>\n readonly instances: Set<HmrInstance>\n}\n\ninterface HmrGlobal {\n modules: Map<string, HmrModuleState>\n}\n\nconst globalTarget = globalThis as typeof globalThis & { __VOBS_HMR__?: HmrGlobal }\nconst hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: new Map<string, HmrModuleState>() }\nglobalTarget.__VOBS_HMR__ = hmrGlobal\n\nexport function resolveComponent<Props extends object>(\n component: HmrComponent<Props>,\n moduleId: string,\n exportName: string\n): HmrComponent<Props> {\n const module = getModule(moduleId)\n const existing = module.components.get(exportName)\n if (existing) return existing as HmrComponent<Props>\n\n const proxy = ((props: Props) => {\n const current = (proxy as HmrComponent<Props> & { current: HmrComponent<Props> }).current\n return current(props)\n }) as HmrComponent<Props> & { current: HmrComponent<Props> }\n proxy.current = component\n Object.defineProperties(proxy, {\n displayName: { configurable: true, value: component.name || exportName },\n hmrKey: { configurable: false, value: `${moduleId}:${exportName}` }\n })\n module.components.set(exportName, proxy as HmrComponent)\n return proxy\n}\n\nexport function updateHmrModule(_moduleId: string, nextModule: Record<string, unknown>): void {\n const modules = [...hmrGlobal.modules.values()]\n for (const module of modules) {\n let changed = false\n for (const [name, proxy] of module.components) {\n const next = nextModule[name]\n if (typeof next !== 'function') continue\n const hmrProxy = proxy as HmrComponent & { current: HmrComponent; displayName?: string }\n hmrProxy.current = next as HmrComponent\n Object.defineProperty(hmrProxy, 'displayName', { configurable: true, value: next.name || name })\n changed = true\n }\n if (!changed) continue\n for (const instance of module.instances) {\n try {\n instance.refresh()\n } catch {\n // HMR failures remain application errors on the next normal render.\n }\n }\n }\n}\n\nexport function disposeHmrModule(_moduleId: string): void {\n // State and component proxies intentionally survive module disposal.\n}\n\nexport function createHmrStateStore(moduleId: string): HmrStateStore {\n const state = getModule(moduleId).state\n return {\n get<T>(key: string, initial: T | (() => T)): T {\n if (!state.has(key)) state.set(key, typeof initial === 'function' ? (initial as () => T)() : initial)\n return state.get(key) as T\n },\n set<T>(key: string, value: T): void {\n state.set(key, value)\n },\n has: key => state.has(key),\n delete: key => { state.delete(key) },\n clear: () => { state.clear() }\n }\n}\n\nexport function registerHmrInstance(moduleId: string, instance: HmrInstance): () => void {\n const instances = getModule(moduleId).instances\n instances.add(instance)\n return () => instances.delete(instance)\n}\n\nexport function markHmrInstanceMounted(node: VobsNode, parent: Node): void {\n const instance = hmrInstances.get(node as object)\n if (instance) instance.parent = parent\n}\n\nfunction getModule(moduleId: string): HmrModuleState {\n let module = hmrGlobal.modules.get(moduleId)\n if (!module) {\n module = { components: new Map(), state: new Map(), instances: new Set() }\n hmrGlobal.modules.set(moduleId, module)\n }\n return module\n}\n\nconst hmrInstances = new WeakMap<object, HmrInstance>()\n\nexport function associateHmrInstance(node: VobsNode, instance: HmrInstance): void {\n hmrInstances.set(node as object, instance)\n}\n","// 编译产物调用的基础操作\n\nimport { createOwner, getCurrentOwner, setOwnerDebugName, type Owner } from '@vobs/reactivity'\nimport { isVobsFragment, type VobsNode } from './fragment'\nimport { describeDebugNode, getRuntimeDebugHooks, invokeRuntimeDebug, readDebugValue } from './debug'\nimport {\n associateHmrInstance,\n markHmrInstanceMounted,\n registerHmrInstance,\n type HmrInstance\n} from './hmr'\nimport type { VobsRenderer } from './renderer'\nimport { setRef } from './ref'\n\ntype RuntimeRenderer = VobsRenderer<Node, Text, Element, Comment>\n\nlet currentRenderer: RuntimeRenderer | null = null\nconst nodeOwners = new WeakMap<object, Owner>()\ninterface EventBinding {\n readonly handler: EventListener\n readonly owner: Owner | null\n readonly original: EventListener\n}\nconst eventBindings = new WeakMap<object, Map<string, EventBinding>>()\n\nexport function setRenderer<\n NodeType,\n TextNode extends NodeType,\n ElementNode extends NodeType,\n CommentNode extends NodeType\n>(renderer: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>): void {\n // 编译产物仍使用 DOM 节点声明;实际宿主类型由应用提供的渲染器决定。\n currentRenderer = renderer as unknown as RuntimeRenderer\n}\n\nexport function getRenderer(): RuntimeRenderer {\n if (!currentRenderer) {\n throw new Error('渲染器未初始化')\n }\n return currentRenderer\n}\n\nexport function createText(content: string): Text {\n return getRenderer().createText(content)\n}\n\nexport function createElement(tag: string): Element {\n return getRenderer().createElement(tag)\n}\n\nexport function createComment(content: string): Comment {\n return getRenderer().createComment(content)\n}\n\nexport function insertBefore(\n parent: Node,\n child: VobsNode,\n anchor: VobsNode | null\n): void {\n if (isVobsFragment(child)) {\n child.mount(parent, isVobsFragment(anchor) ? anchor.start : anchor)\n return\n }\n getRenderer().insertBefore(parent, child, isVobsFragment(anchor) ? anchor.start : anchor)\n markHmrInstanceMounted(child, parent)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'insert',\n target: describeDebugNode(child),\n parent: describeDebugNode(parent)\n })\n }\n}\n\nexport function removeChild(\n parent: Node,\n child: VobsNode\n): void {\n disposeNodeOwner(child)\n if (isVobsFragment(child)) {\n child.unmount(parent)\n return\n }\n getRenderer().removeChild(parent, child)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'remove',\n target: describeDebugNode(child),\n parent: describeDebugNode(parent)\n })\n }\n}\n\nexport function setTextContent(\n node: Text,\n content: string\n): void {\n const previousValue = getRuntimeDebugHooks()\n ? readDebugValue(() => node.textContent)\n : undefined\n getRenderer().setTextContent(node, content)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'text',\n target: describeDebugNode(node),\n previousValue,\n nextValue: content\n })\n }\n}\n\nexport function setProperty(\n node: Element,\n key: string,\n value: unknown\n): void {\n const previousValue = getRuntimeDebugHooks()\n ? readDebugValue(() => Reflect.get(node, key))\n : undefined\n getRenderer().setProperty(node, key, value)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'property',\n target: describeDebugNode(node),\n key,\n previousValue,\n nextValue: value\n })\n }\n}\n\nexport function setAttribute(\n node: Element,\n key: string,\n value: string\n): void {\n const previousValue = getRuntimeDebugHooks()\n ? readDebugValue(() => typeof node.getAttribute === 'function' ? node.getAttribute(key) : undefined)\n : undefined\n getRenderer().setAttribute(node, key, value)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'attribute',\n target: describeDebugNode(node),\n key,\n previousValue,\n nextValue: value\n })\n }\n}\n\nexport function spreadProps(node: Element, props: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(props)) {\n if (key === 'key' || value === null || value === undefined) continue\n if (key === 'ref') {\n setRef(node, value)\n continue\n }\n if (key.startsWith('on') && typeof value === 'function') addEventListener(node, key.slice(2).toLowerCase(), value as EventListener)\n // property 键的 false 有语义(如 disabled={false} 必须清除),不能跳过;\n // attribute 键的 false 表示“不设置”,与 HTML 语义一致。\n else if (isPropertyKey(key)) setProperty(node, key, value)\n else if (value === false) continue\n else setAttribute(node, key === 'className' ? 'class' : key, key === 'style' && isStyleObject(value) ? formatStyle(value) : String(value))\n }\n}\n\n/** Apply compile-time host properties in one renderer pass. */\nexport function setStaticProps(node: Element, props: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(props)) {\n if (key === 'key' || key === 'ref' || key.startsWith('on')) continue\n if (value === null || value === undefined) continue\n if (isPropertyKey(key)) setProperty(node, key, value)\n else if (value === false) continue\n else setAttribute(node, key === 'className' ? 'class' : key, key === 'style' && isStyleObject(value) ? formatStyle(value) : String(value))\n }\n}\n\nfunction isPropertyKey(key: string): boolean {\n return key === 'value' || key === 'checked' || key === 'selected' || key === 'disabled'\n || key === 'multiple' || key === 'readOnly' || key === 'required'\n || key === 'autofocus' || key === 'hidden' || key === 'tabIndex'\n}\n\nfunction isStyleObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction formatStyle(value: Record<string, unknown>): string {\n return Object.entries(value).filter(([, entry]) => entry !== null && entry !== undefined && entry !== false)\n .map(([key, entry]) => `${key.replace(/[A-Z]/gu, match => `-${match.toLowerCase()}`)}:${String(entry)}`).join(';')\n}\n\nexport function addEventListener(\n node: Element,\n event: string,\n handler: EventListener\n): void {\n const renderer = getRenderer()\n const owner = getCurrentOwner()\n let bindings = eventBindings.get(node)\n if (!bindings) {\n bindings = new Map()\n eventBindings.set(node, bindings)\n }\n const previous = bindings.get(event)\n if (previous && previous.original === handler && previous.owner === owner) return\n if (previous) renderer.removeEventListener(node, event, previous.handler)\n const listener = owner ? (reason: Event) => {\n try {\n owner.run(() => handler(reason))\n } catch (error) {\n const handled = owner.handleError(error)\n invokeRuntimeDebug('error', {\n error,\n owner,\n phase: 'event',\n handled,\n recovery: handled ? 'handled' : 'propagated'\n })\n if (!handled) throw error\n }\n } : handler\n const binding: EventBinding = { handler: listener, owner, original: handler }\n bindings.set(event, binding)\n renderer.addEventListener(node, event, listener)\n owner?.onDispose(() => {\n if (bindings?.get(event) !== binding) return\n bindings.delete(event)\n renderer.removeEventListener(node, event, listener)\n })\n}\n\nexport function removeEventListener(\n node: Element,\n event: string,\n handler: EventListener\n): void {\n const renderer = getRenderer()\n const binding = eventBindings.get(node)?.get(event)\n renderer.removeEventListener(node, event, binding?.handler ?? handler)\n eventBindings.get(node)?.delete(event)\n}\n\nexport function clear(container: Node): void {\n getRenderer().clear(container)\n}\n\ntype VobsComponent = (...args: any[]) => VobsNode\n\ntype ComponentProps<Component extends VobsComponent> = Component extends (\n props: infer Props\n) => VobsNode\n ? NonNullable<Props> extends object ? NonNullable<Props> : Record<string, never>\n : Record<string, never>\n\nexport function createComponent<Component extends VobsComponent>(\n component: Component,\n props: ComponentProps<Component>,\n source?: VobsSourceLocation\n): VobsNode {\n const owner = createOwner()\n const componentName = (component as typeof component & { displayName?: string }).displayName\n || component.name\n || 'anonymous'\n setOwnerDebugName(owner, source\n ? `${componentName} (${source.file}:${source.line}:${source.column})`\n : componentName)\n owner.onError(reason => {\n attachSourceLocation(reason, source)\n attachComponentContext(reason, componentName, owner.id)\n throw reason\n })\n let node: VobsNode\n try {\n node = owner.run(() => component(props))\n } catch (error) {\n owner.dispose()\n attachSourceLocation(error, source)\n attachComponentContext(error, componentName, owner.id)\n throw error\n }\n associateNodeOwner(node, owner)\n const hmrKey = (component as typeof component & { hmrKey?: string }).hmrKey\n if (hmrKey) {\n const instance: HmrInstance = {\n node,\n parent: null,\n refresh(): void {\n const previous = instance.node\n const next = owner.run(() => component(props))\n if (instance.parent && !isVobsFragment(previous) && !isVobsFragment(next)) {\n getRenderer().insertBefore(instance.parent, next, previous)\n getRenderer().removeChild(instance.parent, previous)\n }\n nodeOwners.delete(previous as object)\n nodeOwners.set(next as object, owner)\n associateHmrInstance(next, instance)\n instance.node = next\n }\n }\n associateHmrInstance(node, instance)\n const separator = hmrKey.lastIndexOf(':')\n const moduleId = separator < 0 ? hmrKey : hmrKey.slice(0, separator)\n const cleanup = registerHmrInstance(moduleId, instance)\n owner.onDispose(cleanup)\n }\n return node\n}\n\nexport interface VobsSourceLocation {\n readonly file: string\n readonly line: number\n readonly column: number\n}\n\nexport interface VobsLocatedError extends Error {\n readonly vobsSource?: VobsSourceLocation\n readonly vobsComponent?: string\n readonly vobsOwnerId?: string\n}\n\nfunction attachSourceLocation(reason: unknown, source: VobsSourceLocation | undefined): void {\n if (!source || (!reason || (typeof reason !== 'object' && typeof reason !== 'function'))) return\n const error = reason as VobsLocatedError\n if (error.vobsSource) return\n try {\n Object.defineProperty(error, 'vobsSource', {\n configurable: true,\n enumerable: false,\n value: source,\n writable: false\n })\n } catch {\n // Frozen third-party errors still propagate with their original details.\n }\n}\n\nfunction attachComponentContext(reason: unknown, component: string, ownerId: string): void {\n if (!reason || (typeof reason !== 'object' && typeof reason !== 'function')) return\n const error = reason as VobsLocatedError\n try {\n if (!error.vobsComponent) Object.defineProperty(error, 'vobsComponent', { configurable: true, enumerable: false, value: component, writable: false })\n if (!error.vobsOwnerId) Object.defineProperty(error, 'vobsOwnerId', { configurable: true, enumerable: false, value: ownerId, writable: false })\n } catch {\n // Frozen third-party errors still propagate with their original details.\n }\n}\n\nexport function createBlock(factory: () => VobsNode | null | undefined | false): VobsNode | null {\n const owner = createOwner()\n setOwnerDebugName(owner, 'dynamic')\n let node: VobsNode | null | undefined | false\n try {\n node = owner.run(factory)\n } catch (error) {\n owner.dispose()\n throw error\n }\n if (!node) {\n owner.dispose()\n return null\n }\n associateNodeOwner(node, owner)\n return node\n}\n\nexport function associateNodeOwner(node: VobsNode, owner: Owner): void {\n nodeOwners.set(node, owner)\n}\n\nexport function disposeNodeOwner(node: VobsNode): void {\n const owner = nodeOwners.get(node)\n if (!owner) return\n nodeOwners.delete(node)\n owner.dispose()\n}\n","import { getCurrentOwner } from '@vobs/reactivity'\nimport { createComment, getRenderer } from './ops'\n\nexport interface VobsFragment {\n readonly kind: 'vobs-fragment'\n readonly start: Node\n readonly end: Node\n readonly mount: (parent: Node, anchor: Node | null) => void\n readonly unmount: (parent: Node) => void\n}\n\nexport type VobsNode = Node | VobsFragment\nexport type FragmentFactory = (parent: Node, anchor: Node) => void\n\nexport function createFragment(factory: FragmentFactory): VobsFragment {\n const start = createComment('vobs:fragment:start')\n const end = createComment('vobs:fragment:end')\n let parent: Node | null = null\n let initialized = false\n const owner = getCurrentOwner()\n\n const fragment: VobsFragment = {\n kind: 'vobs-fragment',\n start,\n end,\n mount(nextParent, anchor): void {\n if (parent && parent !== nextParent) {\n throw new Error('Vobs Fragment: 不能跨父节点移动 Fragment')\n }\n\n if (initialized) {\n moveRange(nextParent, start, end, anchor)\n return\n }\n\n const renderer = getRenderer()\n renderer.insertBefore(nextParent, start, anchor)\n renderer.insertBefore(nextParent, end, anchor)\n parent = nextParent\n initialized = true\n if (owner) owner.run(() => factory(nextParent, end))\n else factory(nextParent, end)\n },\n unmount(nextParent): void {\n if (!initialized || parent !== nextParent) {\n throw new Error('Vobs Fragment: Fragment 不属于指定父节点')\n }\n const renderer = getRenderer()\n let current = renderer.nextSibling(start)\n while (current && current !== end) {\n const next = renderer.nextSibling(current)\n renderer.removeChild(nextParent, current)\n current = next\n }\n renderer.removeChild(nextParent, start)\n renderer.removeChild(nextParent, end)\n parent = null\n initialized = false\n }\n }\n return fragment\n}\n\nexport function isVobsFragment(value: unknown): value is VobsFragment {\n return Boolean(value) && typeof value === 'object' && (value as VobsFragment).kind === 'vobs-fragment'\n}\n\nfunction moveRange(parent: Node, start: Node, end: Node, anchor: Node | null): void {\n const renderer = getRenderer()\n const nodes: Node[] = [start]\n let current = renderer.nextSibling(start)\n while (current) {\n nodes.push(current)\n if (current === end) break\n current = renderer.nextSibling(current)\n }\n if (nodes[nodes.length - 1] !== end) {\n throw new Error('Vobs Fragment: 找不到结束锚点')\n }\n for (const node of nodes) renderer.insertBefore(parent, node, anchor)\n}\n","import { getRenderer, isVobsFragment, type VobsNode } from '@vobs/vobs'\nimport type {\n TransitionDriver,\n TransitionDriverOptions,\n TransitionOptions,\n TransitionPhase,\n TransitionRun,\n TransitionStatus,\n TransitionStyle\n} from './types'\n\nexport function runTransition(\n node: VobsNode,\n status: Extract<TransitionStatus, 'entering' | 'leaving'>,\n options: TransitionDriverOptions,\n done: () => void\n): TransitionRun {\n const elements = getTransitionElements(node)\n if (elements.length === 0 || options.reducedMotion || !options.css && !hasStyles(options.phase)) {\n done()\n return { cancel() {} }\n }\n\n const phase = options.phase\n const classes = options.css ? phaseClasses(options.name, status) : []\n const restores = elements.map(element => applyInitialState(element, phase, classes, options.duration))\n let finished = false\n let frame: number | undefined\n let timeout: ReturnType<typeof setTimeout> | undefined\n const ended = new Set<Element>()\n\n const finish = (): void => {\n if (finished) return\n finished = true\n if (frame !== undefined) cancelFrame(frame)\n if (timeout !== undefined) clearTimeout(timeout)\n for (const element of elements) {\n element.removeEventListener('transitionend', onEnd)\n element.removeEventListener('animationend', onEnd)\n }\n for (const restore of restores) restore()\n done()\n }\n\n const onEnd = (event: Event): void => {\n const target = event.target\n if (!(target instanceof Element) || !elements.includes(target)) return\n ended.add(target)\n if (ended.size === elements.length) finish()\n }\n\n frame = scheduleFrame(() => {\n if (finished) return\n for (const element of elements) applyTargetState(element, phase, classes)\n if (options.duration <= 0) {\n finish()\n return\n }\n for (const element of elements) {\n element.addEventListener('transitionend', onEnd)\n element.addEventListener('animationend', onEnd)\n }\n timeout = setTimeout(finish, options.duration + 50)\n })\n\n return {\n cancel(): void {\n if (finished) return\n finished = true\n if (frame !== undefined) cancelFrame(frame)\n if (timeout !== undefined) clearTimeout(timeout)\n for (const element of elements) {\n element.removeEventListener('transitionend', onEnd)\n element.removeEventListener('animationend', onEnd)\n }\n for (const restore of restores) restore()\n }\n }\n}\n\nexport const cssTransitionDriver: TransitionDriver = {\n run(node, phase, options, done) {\n return runTransition(node, phase === 'enter' ? 'entering' : 'leaving', options, done)\n }\n}\n\nexport function createCSSTransitionDriver(): TransitionDriver {\n return cssTransitionDriver\n}\n\nexport function asTransitionElement(node: unknown): Element | null {\n if (!node || typeof node !== 'object') return null\n const candidate = node as Partial<Element>\n return candidate.classList && typeof candidate.addEventListener === 'function' ? candidate as Element : null\n}\n\nexport function resolveReducedMotion(options: TransitionOptions): boolean {\n if (options.reducedMotion === true) return true\n if (options.reducedMotion === false || typeof window === 'undefined' || !window.matchMedia) return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\nfunction getTransitionElements(node: VobsNode): Element[] {\n const element = asTransitionElement(node)\n if (element) return [element]\n if (!isVobsFragment(node)) return []\n\n const elements: Element[] = []\n const renderer = getRenderer()\n let current = renderer.nextSibling(node.start)\n while (current && current !== node.end) {\n const child = asTransitionElement(current)\n if (child) elements.push(child)\n current = renderer.nextSibling(current)\n }\n return elements\n}\n\nfunction hasStyles(phase: TransitionPhase | undefined): boolean {\n return Boolean(phase?.from || phase?.to)\n}\n\nfunction phaseClasses(prefix: string, status: TransitionStatus): readonly string[] {\n const phase = status === 'entering' ? 'enter' : 'leave'\n return [`${prefix}-${phase}-from`, `${prefix}-${phase}-active`, `${prefix}-${phase}-to`]\n}\n\nfunction applyInitialState(\n element: Element,\n phase: TransitionPhase | undefined,\n classes: readonly string[],\n duration: number\n): () => void {\n const [from, active] = classes\n if (from) element.classList.add(from)\n if (active) element.classList.add(active)\n const restoreStyles = applyInlineStyles(element, phase, duration)\n return () => {\n for (const className of classes) element.classList.remove(className)\n restoreStyles()\n }\n}\n\nfunction applyTargetState(element: Element, phase: TransitionPhase | undefined, classes: readonly string[]): void {\n const [from, _active, to] = classes\n if (from) element.classList.remove(from)\n if (to) element.classList.add(to)\n applyStyles(element, phase?.to)\n}\n\nfunction applyInlineStyles(element: Element, phase: TransitionPhase | undefined, duration: number): () => void {\n const style = supportsInlineStyle(element) ? element.style : undefined\n if (!style) return () => {}\n const previous = new Map<string, string>()\n const remember = (styles: TransitionStyle | undefined): void => {\n for (const name of Object.keys(styles ?? {})) {\n const property = stylePropertyName(name)\n if (!previous.has(property)) previous.set(property, style.getPropertyValue(property))\n }\n }\n remember(phase?.from)\n remember(phase?.to)\n if (hasStyles(phase) && duration > 0) {\n previous.set('transition-property', style.getPropertyValue('transition-property'))\n previous.set('transition-duration', style.getPropertyValue('transition-duration'))\n previous.set('transition-timing-function', style.getPropertyValue('transition-timing-function'))\n style.setProperty('transition-property', 'all')\n style.setProperty('transition-duration', `${Math.max(0, duration)}ms`)\n if (phase?.easing) style.setProperty('transition-timing-function', phase.easing)\n }\n applyStyles(element, phase?.from)\n return () => {\n for (const [name, value] of previous) style.setProperty(name, value)\n }\n}\n\nfunction applyStyles(element: Element, styles: TransitionStyle | undefined): void {\n if (!styles) return\n const style = supportsInlineStyle(element) ? element.style : undefined\n if (!style) return\n for (const [name, value] of Object.entries(styles)) {\n const property = stylePropertyName(name)\n if (value === null || value === undefined) style.removeProperty(property)\n else style.setProperty(property, String(value))\n }\n}\n\nfunction stylePropertyName(name: string): string {\n return name.startsWith('--') ? name : name.replace(/[A-Z]/gu, letter => `-${letter.toLowerCase()}`)\n}\n\nfunction supportsInlineStyle(element: Element): element is Element & { style: CSSStyleDeclaration } {\n return 'style' in element && Boolean((element as Partial<Element & { style: CSSStyleDeclaration }>).style)\n}\n\nfunction scheduleFrame(callback: () => void): number {\n if (typeof requestAnimationFrame === 'function') return requestAnimationFrame(callback)\n return setTimeout(callback, 16) as unknown as number\n}\n\nfunction cancelFrame(handle: number): void {\n if (typeof cancelAnimationFrame === 'function') cancelAnimationFrame(handle)\n else clearTimeout(handle as unknown as ReturnType<typeof setTimeout>)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/driver.ts"],"sourcesContent":["import { getRenderer, isVobsFragment, type VobsNode } from '@vobs/vobs'\nimport type {\n TransitionDriver,\n TransitionDriverOptions,\n TransitionOptions,\n TransitionPhase,\n TransitionRun,\n TransitionStatus,\n TransitionStyle\n} from './types'\n\nexport function runTransition(\n node: VobsNode,\n status: Extract<TransitionStatus, 'entering' | 'leaving'>,\n options: TransitionDriverOptions,\n done: () => void\n): TransitionRun {\n const elements = getTransitionElements(node)\n if (elements.length === 0 || options.reducedMotion || !options.css && !hasStyles(options.phase)) {\n done()\n return { cancel() {} }\n }\n\n const phase = options.phase\n const classes = options.css ? phaseClasses(options.name, status) : []\n const restores = elements.map(element => applyInitialState(element, phase, classes, options.duration))\n let finished = false\n let frame: number | undefined\n let timeout: ReturnType<typeof setTimeout> | undefined\n const ended = new Set<Element>()\n\n const finish = (): void => {\n if (finished) return\n finished = true\n if (frame !== undefined) cancelFrame(frame)\n if (timeout !== undefined) clearTimeout(timeout)\n for (const element of elements) {\n element.removeEventListener('transitionend', onEnd)\n element.removeEventListener('animationend', onEnd)\n }\n for (const restore of restores) restore()\n done()\n }\n\n const onEnd = (event: Event): void => {\n const target = event.target\n if (!(target instanceof Element) || !elements.includes(target)) return\n ended.add(target)\n if (ended.size === elements.length) finish()\n }\n\n frame = scheduleFrame(() => {\n if (finished) return\n for (const element of elements) applyTargetState(element, phase, classes)\n if (options.duration <= 0) {\n finish()\n return\n }\n for (const element of elements) {\n element.addEventListener('transitionend', onEnd)\n element.addEventListener('animationend', onEnd)\n }\n timeout = setTimeout(finish, options.duration + 50)\n })\n\n return {\n cancel(): void {\n if (finished) return\n finished = true\n if (frame !== undefined) cancelFrame(frame)\n if (timeout !== undefined) clearTimeout(timeout)\n for (const element of elements) {\n element.removeEventListener('transitionend', onEnd)\n element.removeEventListener('animationend', onEnd)\n }\n for (const restore of restores) restore()\n }\n }\n}\n\nexport const cssTransitionDriver: TransitionDriver = {\n run(node, phase, options, done) {\n return runTransition(node, phase === 'enter' ? 'entering' : 'leaving', options, done)\n }\n}\n\nexport function createCSSTransitionDriver(): TransitionDriver {\n return cssTransitionDriver\n}\n\nexport function asTransitionElement(node: unknown): Element | null {\n if (!node || typeof node !== 'object') return null\n const candidate = node as Partial<Element>\n return candidate.classList && typeof candidate.addEventListener === 'function' ? candidate as Element : null\n}\n\nexport function resolveReducedMotion(options: TransitionOptions): boolean {\n if (options.reducedMotion === true) return true\n if (options.reducedMotion === false || typeof window === 'undefined' || !window.matchMedia) return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\nfunction getTransitionElements(node: VobsNode): Element[] {\n const element = asTransitionElement(node)\n if (element) return [element]\n if (!isVobsFragment(node)) return []\n\n const elements: Element[] = []\n const renderer = getRenderer()\n let current = renderer.nextSibling(node.start)\n while (current && current !== node.end) {\n const child = asTransitionElement(current)\n if (child) elements.push(child)\n current = renderer.nextSibling(current)\n }\n return elements\n}\n\nfunction hasStyles(phase: TransitionPhase | undefined): boolean {\n return Boolean(phase?.from || phase?.to)\n}\n\nfunction phaseClasses(prefix: string, status: TransitionStatus): readonly string[] {\n const phase = status === 'entering' ? 'enter' : 'leave'\n return [`${prefix}-${phase}-from`, `${prefix}-${phase}-active`, `${prefix}-${phase}-to`]\n}\n\nfunction applyInitialState(\n element: Element,\n phase: TransitionPhase | undefined,\n classes: readonly string[],\n duration: number\n): () => void {\n const [from, active] = classes\n if (from) element.classList.add(from)\n if (active) element.classList.add(active)\n const restoreStyles = applyInlineStyles(element, phase, duration)\n return () => {\n for (const className of classes) element.classList.remove(className)\n restoreStyles()\n }\n}\n\nfunction applyTargetState(element: Element, phase: TransitionPhase | undefined, classes: readonly string[]): void {\n const [from, _active, to] = classes\n if (from) element.classList.remove(from)\n if (to) element.classList.add(to)\n applyStyles(element, phase?.to)\n}\n\nfunction applyInlineStyles(element: Element, phase: TransitionPhase | undefined, duration: number): () => void {\n const style = supportsInlineStyle(element) ? element.style : undefined\n if (!style) return () => {}\n const previous = new Map<string, string>()\n const remember = (styles: TransitionStyle | undefined): void => {\n for (const name of Object.keys(styles ?? {})) {\n const property = stylePropertyName(name)\n if (!previous.has(property)) previous.set(property, style.getPropertyValue(property))\n }\n }\n remember(phase?.from)\n remember(phase?.to)\n if (hasStyles(phase) && duration > 0) {\n previous.set('transition-property', style.getPropertyValue('transition-property'))\n previous.set('transition-duration', style.getPropertyValue('transition-duration'))\n previous.set('transition-timing-function', style.getPropertyValue('transition-timing-function'))\n style.setProperty('transition-property', 'all')\n style.setProperty('transition-duration', `${Math.max(0, duration)}ms`)\n if (phase?.easing) style.setProperty('transition-timing-function', phase.easing)\n }\n applyStyles(element, phase?.from)\n return () => {\n for (const [name, value] of previous) style.setProperty(name, value)\n }\n}\n\nfunction applyStyles(element: Element, styles: TransitionStyle | undefined): void {\n if (!styles) return\n const style = supportsInlineStyle(element) ? element.style : undefined\n if (!style) return\n for (const [name, value] of Object.entries(styles)) {\n const property = stylePropertyName(name)\n if (value === null || value === undefined) style.removeProperty(property)\n else style.setProperty(property, String(value))\n }\n}\n\nfunction stylePropertyName(name: string): string {\n return name.startsWith('--') ? name : name.replace(/[A-Z]/gu, letter => `-${letter.toLowerCase()}`)\n}\n\nfunction supportsInlineStyle(element: Element): element is Element & { style: CSSStyleDeclaration } {\n return 'style' in element && Boolean((element as Partial<Element & { style: CSSStyleDeclaration }>).style)\n}\n\nfunction scheduleFrame(callback: () => void): number {\n if (typeof requestAnimationFrame === 'function') return requestAnimationFrame(callback)\n return setTimeout(callback, 16) as unknown as number\n}\n\nfunction cancelFrame(handle: number): void {\n if (typeof cancelAnimationFrame === 'function') cancelAnimationFrame(handle)\n else clearTimeout(handle as unknown as ReturnType<typeof setTimeout>)\n}\n"],"mappings":"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","names":[]}
|
package/dist/driver.js
CHANGED
|
@@ -1,144 +1,8 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
3
|
|
|
4
|
-
// packages/reactivity/src/debug.ts
|
|
5
|
-
var activeDebugHooks = null;
|
|
6
|
-
function hasDebugHooks() {
|
|
7
|
-
return activeDebugHooks !== null;
|
|
8
|
-
}
|
|
9
|
-
__name(hasDebugHooks, "hasDebugHooks");
|
|
10
|
-
function invokeDebug(name, ...args) {
|
|
11
|
-
return;
|
|
12
|
-
}
|
|
13
|
-
__name(invokeDebug, "invokeDebug");
|
|
14
|
-
|
|
15
|
-
// packages/reactivity/src/scheduler.ts
|
|
16
|
-
var _Scheduler = class _Scheduler {
|
|
17
|
-
constructor() {
|
|
18
|
-
this.dirtyEffects = /* @__PURE__ */ new Set();
|
|
19
|
-
this.lowPriorityEffects = /* @__PURE__ */ new Set();
|
|
20
|
-
// flush 不可重入(flushing 标志保证),缓冲数组可在轮次间安全复用,避免每轮分配。
|
|
21
|
-
this.normalBuffer = [];
|
|
22
|
-
this.lowBuffer = [];
|
|
23
|
-
this.flushing = false;
|
|
24
|
-
this.scheduled = false;
|
|
25
|
-
this.batchDepth = 0;
|
|
26
|
-
}
|
|
27
|
-
schedule(effect2) {
|
|
28
|
-
if (effect2.disposed) return;
|
|
29
|
-
this.dirtyEffects.add(effect2);
|
|
30
|
-
this.lowPriorityEffects.delete(effect2);
|
|
31
|
-
this.ensureScheduled();
|
|
32
|
-
}
|
|
33
|
-
/** Queue an effect behind normal updates while preserving deterministic order. */
|
|
34
|
-
scheduleLow(effect2) {
|
|
35
|
-
if (effect2.disposed) return;
|
|
36
|
-
if (!this.dirtyEffects.has(effect2)) this.lowPriorityEffects.add(effect2);
|
|
37
|
-
this.ensureScheduled();
|
|
38
|
-
}
|
|
39
|
-
ensureScheduled() {
|
|
40
|
-
if (this.batchDepth === 0 && !this.flushing && !this.scheduled) {
|
|
41
|
-
this.scheduled = true;
|
|
42
|
-
queueMicrotask(() => {
|
|
43
|
-
this.scheduled = false;
|
|
44
|
-
this.flush();
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
remove(effect2) {
|
|
49
|
-
this.dirtyEffects.delete(effect2);
|
|
50
|
-
this.lowPriorityEffects.delete(effect2);
|
|
51
|
-
}
|
|
52
|
-
batch(fn) {
|
|
53
|
-
this.batchDepth++;
|
|
54
|
-
try {
|
|
55
|
-
return fn();
|
|
56
|
-
} finally {
|
|
57
|
-
this.batchDepth--;
|
|
58
|
-
if (this.batchDepth === 0) this.flush();
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
flush() {
|
|
62
|
-
if (this.flushing || this.batchDepth > 0) return;
|
|
63
|
-
this.flushing = true;
|
|
64
|
-
let rounds = 0;
|
|
65
|
-
let firstError;
|
|
66
|
-
let hasError = false;
|
|
67
|
-
try {
|
|
68
|
-
while (this.dirtyEffects.size > 0 || this.lowPriorityEffects.size > 0) {
|
|
69
|
-
if (++rounds > 100) {
|
|
70
|
-
this.dirtyEffects.clear();
|
|
71
|
-
this.lowPriorityEffects.clear();
|
|
72
|
-
throw new Error("Vobs: \u54CD\u5E94\u5F0F\u66F4\u65B0\u8D85\u8FC7 100 \u8F6E\uFF0C\u53EF\u80FD\u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56");
|
|
73
|
-
}
|
|
74
|
-
this.collectRunnable(this.dirtyEffects, this.normalBuffer);
|
|
75
|
-
this.collectRunnable(this.lowPriorityEffects, this.lowBuffer);
|
|
76
|
-
sortEffects(this.normalBuffer);
|
|
77
|
-
sortEffects(this.lowBuffer);
|
|
78
|
-
for (const effect2 of this.normalBuffer) {
|
|
79
|
-
try {
|
|
80
|
-
effect2.run();
|
|
81
|
-
} catch (error) {
|
|
82
|
-
if (!hasError) {
|
|
83
|
-
firstError = error;
|
|
84
|
-
hasError = true;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
for (const effect2 of this.lowBuffer) {
|
|
89
|
-
try {
|
|
90
|
-
effect2.run();
|
|
91
|
-
} catch (error) {
|
|
92
|
-
if (!hasError) {
|
|
93
|
-
firstError = error;
|
|
94
|
-
hasError = true;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
this.normalBuffer.length = 0;
|
|
99
|
-
this.lowBuffer.length = 0;
|
|
100
|
-
}
|
|
101
|
-
} finally {
|
|
102
|
-
this.normalBuffer.length = 0;
|
|
103
|
-
this.lowBuffer.length = 0;
|
|
104
|
-
this.flushing = false;
|
|
105
|
-
}
|
|
106
|
-
if (hasError) throw firstError;
|
|
107
|
-
}
|
|
108
|
-
/** 收集未 disposed 的 effect 并清空源集合;run() 期间新调度的 effect 留给下一轮。 */
|
|
109
|
-
collectRunnable(source, target) {
|
|
110
|
-
for (const effect2 of source) {
|
|
111
|
-
if (!effect2.disposed) target.push(effect2);
|
|
112
|
-
}
|
|
113
|
-
source.clear();
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
__name(_Scheduler, "Scheduler");
|
|
117
|
-
function sortEffects(effects) {
|
|
118
|
-
if (effects.length > 1) {
|
|
119
|
-
effects.sort((a, b) => b.depth - a.depth || a.order - b.order);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
__name(sortEffects, "sortEffects");
|
|
123
|
-
|
|
124
|
-
// packages/runtime/src/hmr.ts
|
|
125
|
-
var globalTarget = globalThis;
|
|
126
|
-
var hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: /* @__PURE__ */ new Map() };
|
|
127
|
-
globalTarget.__VOBS_HMR__ = hmrGlobal;
|
|
128
|
-
function getRenderer() {
|
|
129
|
-
{
|
|
130
|
-
throw new Error("\u6E32\u67D3\u5668\u672A\u521D\u59CB\u5316");
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
__name(getRenderer, "getRenderer");
|
|
134
|
-
|
|
135
|
-
// packages/runtime/src/fragment.ts
|
|
136
|
-
function isVobsFragment(value) {
|
|
137
|
-
return Boolean(value) && typeof value === "object" && value.kind === "vobs-fragment";
|
|
138
|
-
}
|
|
139
|
-
__name(isVobsFragment, "isVobsFragment");
|
|
140
|
-
|
|
141
4
|
// packages/transition/src/driver.ts
|
|
5
|
+
import { getRenderer, isVobsFragment } from "@vobs/vobs";
|
|
142
6
|
function runTransition(node, status, options, done) {
|
|
143
7
|
const elements = getTransitionElements(node);
|
|
144
8
|
if (elements.length === 0 || options.reducedMotion || !options.css && !hasStyles(options.phase)) {
|
|
@@ -318,7 +182,11 @@ function cancelFrame(handle) {
|
|
|
318
182
|
else clearTimeout(handle);
|
|
319
183
|
}
|
|
320
184
|
__name(cancelFrame, "cancelFrame");
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
185
|
+
export {
|
|
186
|
+
asTransitionElement,
|
|
187
|
+
createCSSTransitionDriver,
|
|
188
|
+
cssTransitionDriver,
|
|
189
|
+
resolveReducedMotion,
|
|
190
|
+
runTransition
|
|
191
|
+
};
|
|
324
192
|
//# sourceMappingURL=driver.js.map
|
package/dist/driver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../reactivity/src/debug.ts","../../reactivity/src/scheduler.ts","../../runtime/src/hmr.ts","../../runtime/src/ops.ts","../../runtime/src/fragment.ts","../src/driver.ts"],"names":["effect"],"mappings":"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","file":"driver.js","sourcesContent":["import type { Effect } from './effect'\nimport type { Owner } from './owner'\nimport type { Dependency, ReadableSignal, Subscriber } from './signal'\n\nexport interface ReactivityDebugHooks {\n ownerCreated?(owner: Owner): void\n ownerNamed?(owner: Owner, name: string): void\n ownerDisposed?(owner: Owner): void\n signalCreated?(signal: ReadableSignal<unknown>, owner: Owner | null): void\n signalNamed?(signal: ReadableSignal<unknown>, name: string): void\n signalRead?(signal: ReadableSignal<unknown>, subscriber: Subscriber): void\n signalChanged?(signal: ReadableSignal<unknown>, previousValue: unknown, nextValue: unknown): void\n signalDisposed?(signal: ReadableSignal<unknown>): void\n dependencyTracked?(dependency: Dependency, subscriber: Subscriber): void\n dependencyUntracked?(dependency: Dependency, subscriber: Subscriber): void\n effectCreated?(effect: Effect, owner: Owner | null): void\n effectInvalidated?(effect: Effect): void\n effectRunStart?(effect: Effect): void\n effectRunEnd?(effect: Effect, error?: unknown, handled?: boolean): void\n effectDisposed?(effect: Effect): void\n memoCreated?(signal: ReadableSignal<unknown>, subscriber: Subscriber, owner: Owner | null): void\n memoInvalidated?(signal: ReadableSignal<unknown>): void\n flushStart?(): void\n flushEnd?(): void\n}\n\nlet activeDebugHooks: ReactivityDebugHooks | null = null\nconst signalNames = new WeakMap<object, string>()\n\nexport function setDebugHooks(hooks: ReactivityDebugHooks | null): ReactivityDebugHooks | null {\n const previous = activeDebugHooks\n activeDebugHooks = hooks\n return previous\n}\n\nexport function getDebugHooks(): ReactivityDebugHooks | null {\n return activeDebugHooks\n}\n\n/** 热路径守卫:无 hooks 时跳过 invokeDebug 调用,避免 rest 参数数组分配。 */\nexport function hasDebugHooks(): boolean {\n return activeDebugHooks !== null\n}\n\nexport function setSignalDebugName(signal: ReadableSignal<unknown>, name: string): void {\n signalNames.set(signal, name)\n invokeDebug('signalNamed', signal, name)\n}\n\nexport function getSignalDebugName(signal: ReadableSignal<unknown>): string | undefined {\n return signalNames.get(signal)\n}\n\nexport function invokeDebug<K extends keyof ReactivityDebugHooks>(\n name: K,\n ...args: Parameters<NonNullable<ReactivityDebugHooks[K]>>\n): void {\n const callback = activeDebugHooks?.[name] as ((...values: unknown[]) => void) | undefined\n if (!callback) return\n try {\n callback(...args)\n } catch {\n // Debug tooling must never change application behavior.\n }\n}\n","import type { Effect } from './effect'\nimport { hasDebugHooks, invokeDebug } from './debug'\n\nexport class Scheduler {\n private readonly dirtyEffects = new Set<Effect>()\n private readonly lowPriorityEffects = new Set<Effect>()\n // flush 不可重入(flushing 标志保证),缓冲数组可在轮次间安全复用,避免每轮分配。\n private readonly normalBuffer: Effect[] = []\n private readonly lowBuffer: Effect[] = []\n private flushing = false\n private scheduled = false\n private batchDepth = 0\n\n schedule(effect: Effect): void {\n if (effect.disposed) return\n this.dirtyEffects.add(effect)\n this.lowPriorityEffects.delete(effect)\n this.ensureScheduled()\n }\n\n /** Queue an effect behind normal updates while preserving deterministic order. */\n scheduleLow(effect: Effect): void {\n if (effect.disposed) return\n if (!this.dirtyEffects.has(effect)) this.lowPriorityEffects.add(effect)\n this.ensureScheduled()\n }\n\n private ensureScheduled(): void {\n if (this.batchDepth === 0 && !this.flushing && !this.scheduled) {\n this.scheduled = true\n queueMicrotask(() => {\n this.scheduled = false\n this.flush()\n })\n }\n }\n\n remove(effect: Effect): void {\n this.dirtyEffects.delete(effect)\n this.lowPriorityEffects.delete(effect)\n }\n\n batch<T>(fn: () => T): T {\n this.batchDepth++\n try {\n return fn()\n } finally {\n this.batchDepth--\n if (this.batchDepth === 0) this.flush()\n }\n }\n\n flush(): void {\n if (this.flushing || this.batchDepth > 0) return\n this.flushing = true\n const debugEnabled = hasDebugHooks()\n if (debugEnabled) invokeDebug('flushStart')\n let rounds = 0\n let firstError: unknown\n let hasError = false\n try {\n while (this.dirtyEffects.size > 0 || this.lowPriorityEffects.size > 0) {\n if (++rounds > 100) {\n this.dirtyEffects.clear()\n this.lowPriorityEffects.clear()\n throw new Error('Vobs: 响应式更新超过 100 轮,可能存在循环依赖')\n }\n\n // normal 先、low 后,两组分别排序:与旧的合并排序语义一致\n // (旧比较器里 low 优先级本就高于 depth),但消除了比较器内的 Set 查找。\n this.collectRunnable(this.dirtyEffects, this.normalBuffer)\n this.collectRunnable(this.lowPriorityEffects, this.lowBuffer)\n sortEffects(this.normalBuffer)\n sortEffects(this.lowBuffer)\n for (const effect of this.normalBuffer) {\n try {\n effect.run()\n } catch (error) {\n // Isolate one failed effect from the rest of the flush. Re-throw\n // the first error after all runnable effects have had a chance.\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n for (const effect of this.lowBuffer) {\n try {\n effect.run()\n } catch (error) {\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n this.normalBuffer.length = 0\n this.lowBuffer.length = 0\n }\n } finally {\n this.normalBuffer.length = 0\n this.lowBuffer.length = 0\n this.flushing = false\n if (debugEnabled) invokeDebug('flushEnd')\n }\n if (hasError) throw firstError\n }\n\n /** 收集未 disposed 的 effect 并清空源集合;run() 期间新调度的 effect 留给下一轮。 */\n private collectRunnable(source: Set<Effect>, target: Effect[]): void {\n for (const effect of source) {\n if (!effect.disposed) target.push(effect)\n }\n source.clear()\n }\n}\n\n/** depth 深的先跑(子 effect 先于父),同深度按创建顺序。 */\nfunction sortEffects(effects: Effect[]): void {\n if (effects.length > 1) {\n effects.sort((a, b) => b.depth - a.depth || a.order - b.order)\n }\n}\n\nexport const scheduler = new Scheduler()\n\nexport function batch<T>(fn: () => T): T {\n return scheduler.batch(fn)\n}\n\n/** Schedule a low-priority effect explicitly. */\nexport function scheduleLow(effect: Effect): void {\n effect.scheduleLow()\n}\n","import type { VobsNode } from './fragment'\n\nexport type HmrComponent<Props extends object = Record<string, unknown>> =\n (props: Props) => VobsNode\n\nexport interface HmrStateStore {\n get<T>(key: string, initial: T | (() => T)): T\n set<T>(key: string, value: T): void\n has(key: string): boolean\n delete(key: string): void\n clear(): void\n}\n\nexport interface HmrInstance {\n node: VobsNode\n parent: Node | null\n refresh(): void\n}\n\ninterface HmrModuleState {\n readonly components: Map<string, HmrComponent>\n readonly state: Map<string, unknown>\n readonly instances: Set<HmrInstance>\n}\n\ninterface HmrGlobal {\n modules: Map<string, HmrModuleState>\n}\n\nconst globalTarget = globalThis as typeof globalThis & { __VOBS_HMR__?: HmrGlobal }\nconst hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: new Map<string, HmrModuleState>() }\nglobalTarget.__VOBS_HMR__ = hmrGlobal\n\nexport function resolveComponent<Props extends object>(\n component: HmrComponent<Props>,\n moduleId: string,\n exportName: string\n): HmrComponent<Props> {\n const module = getModule(moduleId)\n const existing = module.components.get(exportName)\n if (existing) return existing as HmrComponent<Props>\n\n const proxy = ((props: Props) => {\n const current = (proxy as HmrComponent<Props> & { current: HmrComponent<Props> }).current\n return current(props)\n }) as HmrComponent<Props> & { current: HmrComponent<Props> }\n proxy.current = component\n Object.defineProperties(proxy, {\n displayName: { configurable: true, value: component.name || exportName },\n hmrKey: { configurable: false, value: `${moduleId}:${exportName}` }\n })\n module.components.set(exportName, proxy as HmrComponent)\n return proxy\n}\n\nexport function updateHmrModule(_moduleId: string, nextModule: Record<string, unknown>): void {\n const modules = [...hmrGlobal.modules.values()]\n for (const module of modules) {\n let changed = false\n for (const [name, proxy] of module.components) {\n const next = nextModule[name]\n if (typeof next !== 'function') continue\n const hmrProxy = proxy as HmrComponent & { current: HmrComponent; displayName?: string }\n hmrProxy.current = next as HmrComponent\n Object.defineProperty(hmrProxy, 'displayName', { configurable: true, value: next.name || name })\n changed = true\n }\n if (!changed) continue\n for (const instance of module.instances) {\n try {\n instance.refresh()\n } catch {\n // HMR failures remain application errors on the next normal render.\n }\n }\n }\n}\n\nexport function disposeHmrModule(_moduleId: string): void {\n // State and component proxies intentionally survive module disposal.\n}\n\nexport function createHmrStateStore(moduleId: string): HmrStateStore {\n const state = getModule(moduleId).state\n return {\n get<T>(key: string, initial: T | (() => T)): T {\n if (!state.has(key)) state.set(key, typeof initial === 'function' ? (initial as () => T)() : initial)\n return state.get(key) as T\n },\n set<T>(key: string, value: T): void {\n state.set(key, value)\n },\n has: key => state.has(key),\n delete: key => { state.delete(key) },\n clear: () => { state.clear() }\n }\n}\n\nexport function registerHmrInstance(moduleId: string, instance: HmrInstance): () => void {\n const instances = getModule(moduleId).instances\n instances.add(instance)\n return () => instances.delete(instance)\n}\n\nexport function markHmrInstanceMounted(node: VobsNode, parent: Node): void {\n const instance = hmrInstances.get(node as object)\n if (instance) instance.parent = parent\n}\n\nfunction getModule(moduleId: string): HmrModuleState {\n let module = hmrGlobal.modules.get(moduleId)\n if (!module) {\n module = { components: new Map(), state: new Map(), instances: new Set() }\n hmrGlobal.modules.set(moduleId, module)\n }\n return module\n}\n\nconst hmrInstances = new WeakMap<object, HmrInstance>()\n\nexport function associateHmrInstance(node: VobsNode, instance: HmrInstance): void {\n hmrInstances.set(node as object, instance)\n}\n","// 编译产物调用的基础操作\n\nimport { createOwner, getCurrentOwner, setOwnerDebugName, type Owner } from '@vobs/reactivity'\nimport { isVobsFragment, type VobsNode } from './fragment'\nimport { describeDebugNode, getRuntimeDebugHooks, invokeRuntimeDebug, readDebugValue } from './debug'\nimport {\n associateHmrInstance,\n markHmrInstanceMounted,\n registerHmrInstance,\n type HmrInstance\n} from './hmr'\nimport type { VobsRenderer } from './renderer'\nimport { setRef } from './ref'\n\ntype RuntimeRenderer = VobsRenderer<Node, Text, Element, Comment>\n\nlet currentRenderer: RuntimeRenderer | null = null\nconst nodeOwners = new WeakMap<object, Owner>()\ninterface EventBinding {\n readonly handler: EventListener\n readonly owner: Owner | null\n readonly original: EventListener\n}\nconst eventBindings = new WeakMap<object, Map<string, EventBinding>>()\n\nexport function setRenderer<\n NodeType,\n TextNode extends NodeType,\n ElementNode extends NodeType,\n CommentNode extends NodeType\n>(renderer: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>): void {\n // 编译产物仍使用 DOM 节点声明;实际宿主类型由应用提供的渲染器决定。\n currentRenderer = renderer as unknown as RuntimeRenderer\n}\n\nexport function getRenderer(): RuntimeRenderer {\n if (!currentRenderer) {\n throw new Error('渲染器未初始化')\n }\n return currentRenderer\n}\n\nexport function createText(content: string): Text {\n return getRenderer().createText(content)\n}\n\nexport function createElement(tag: string): Element {\n return getRenderer().createElement(tag)\n}\n\nexport function createComment(content: string): Comment {\n return getRenderer().createComment(content)\n}\n\nexport function insertBefore(\n parent: Node,\n child: VobsNode,\n anchor: VobsNode | null\n): void {\n if (isVobsFragment(child)) {\n child.mount(parent, isVobsFragment(anchor) ? anchor.start : anchor)\n return\n }\n getRenderer().insertBefore(parent, child, isVobsFragment(anchor) ? anchor.start : anchor)\n markHmrInstanceMounted(child, parent)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'insert',\n target: describeDebugNode(child),\n parent: describeDebugNode(parent)\n })\n }\n}\n\nexport function removeChild(\n parent: Node,\n child: VobsNode\n): void {\n disposeNodeOwner(child)\n if (isVobsFragment(child)) {\n child.unmount(parent)\n return\n }\n getRenderer().removeChild(parent, child)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'remove',\n target: describeDebugNode(child),\n parent: describeDebugNode(parent)\n })\n }\n}\n\nexport function setTextContent(\n node: Text,\n content: string\n): void {\n const previousValue = getRuntimeDebugHooks()\n ? readDebugValue(() => node.textContent)\n : undefined\n getRenderer().setTextContent(node, content)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'text',\n target: describeDebugNode(node),\n previousValue,\n nextValue: content\n })\n }\n}\n\nexport function setProperty(\n node: Element,\n key: string,\n value: unknown\n): void {\n const previousValue = getRuntimeDebugHooks()\n ? readDebugValue(() => Reflect.get(node, key))\n : undefined\n getRenderer().setProperty(node, key, value)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'property',\n target: describeDebugNode(node),\n key,\n previousValue,\n nextValue: value\n })\n }\n}\n\nexport function setAttribute(\n node: Element,\n key: string,\n value: string\n): void {\n const previousValue = getRuntimeDebugHooks()\n ? readDebugValue(() => typeof node.getAttribute === 'function' ? node.getAttribute(key) : undefined)\n : undefined\n getRenderer().setAttribute(node, key, value)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'attribute',\n target: describeDebugNode(node),\n key,\n previousValue,\n nextValue: value\n })\n }\n}\n\nexport function spreadProps(node: Element, props: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(props)) {\n if (key === 'key' || value === null || value === undefined) continue\n if (key === 'ref') {\n setRef(node, value)\n continue\n }\n if (key.startsWith('on') && typeof value === 'function') addEventListener(node, key.slice(2).toLowerCase(), value as EventListener)\n // property 键的 false 有语义(如 disabled={false} 必须清除),不能跳过;\n // attribute 键的 false 表示“不设置”,与 HTML 语义一致。\n else if (isPropertyKey(key)) setProperty(node, key, value)\n else if (value === false) continue\n else setAttribute(node, key === 'className' ? 'class' : key, key === 'style' && isStyleObject(value) ? formatStyle(value) : String(value))\n }\n}\n\n/** Apply compile-time host properties in one renderer pass. */\nexport function setStaticProps(node: Element, props: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(props)) {\n if (key === 'key' || key === 'ref' || key.startsWith('on')) continue\n if (value === null || value === undefined) continue\n if (isPropertyKey(key)) setProperty(node, key, value)\n else if (value === false) continue\n else setAttribute(node, key === 'className' ? 'class' : key, key === 'style' && isStyleObject(value) ? formatStyle(value) : String(value))\n }\n}\n\nfunction isPropertyKey(key: string): boolean {\n return key === 'value' || key === 'checked' || key === 'selected' || key === 'disabled'\n || key === 'multiple' || key === 'readOnly' || key === 'required'\n || key === 'autofocus' || key === 'hidden' || key === 'tabIndex'\n}\n\nfunction isStyleObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction formatStyle(value: Record<string, unknown>): string {\n return Object.entries(value).filter(([, entry]) => entry !== null && entry !== undefined && entry !== false)\n .map(([key, entry]) => `${key.replace(/[A-Z]/gu, match => `-${match.toLowerCase()}`)}:${String(entry)}`).join(';')\n}\n\nexport function addEventListener(\n node: Element,\n event: string,\n handler: EventListener\n): void {\n const renderer = getRenderer()\n const owner = getCurrentOwner()\n let bindings = eventBindings.get(node)\n if (!bindings) {\n bindings = new Map()\n eventBindings.set(node, bindings)\n }\n const previous = bindings.get(event)\n if (previous && previous.original === handler && previous.owner === owner) return\n if (previous) renderer.removeEventListener(node, event, previous.handler)\n const listener = owner ? (reason: Event) => {\n try {\n owner.run(() => handler(reason))\n } catch (error) {\n const handled = owner.handleError(error)\n invokeRuntimeDebug('error', {\n error,\n owner,\n phase: 'event',\n handled,\n recovery: handled ? 'handled' : 'propagated'\n })\n if (!handled) throw error\n }\n } : handler\n const binding: EventBinding = { handler: listener, owner, original: handler }\n bindings.set(event, binding)\n renderer.addEventListener(node, event, listener)\n owner?.onDispose(() => {\n if (bindings?.get(event) !== binding) return\n bindings.delete(event)\n renderer.removeEventListener(node, event, listener)\n })\n}\n\nexport function removeEventListener(\n node: Element,\n event: string,\n handler: EventListener\n): void {\n const renderer = getRenderer()\n const binding = eventBindings.get(node)?.get(event)\n renderer.removeEventListener(node, event, binding?.handler ?? handler)\n eventBindings.get(node)?.delete(event)\n}\n\nexport function clear(container: Node): void {\n getRenderer().clear(container)\n}\n\ntype VobsComponent = (...args: any[]) => VobsNode\n\ntype ComponentProps<Component extends VobsComponent> = Component extends (\n props: infer Props\n) => VobsNode\n ? NonNullable<Props> extends object ? NonNullable<Props> : Record<string, never>\n : Record<string, never>\n\nexport function createComponent<Component extends VobsComponent>(\n component: Component,\n props: ComponentProps<Component>,\n source?: VobsSourceLocation\n): VobsNode {\n const owner = createOwner()\n const componentName = (component as typeof component & { displayName?: string }).displayName\n || component.name\n || 'anonymous'\n setOwnerDebugName(owner, source\n ? `${componentName} (${source.file}:${source.line}:${source.column})`\n : componentName)\n owner.onError(reason => {\n attachSourceLocation(reason, source)\n attachComponentContext(reason, componentName, owner.id)\n throw reason\n })\n let node: VobsNode\n try {\n node = owner.run(() => component(props))\n } catch (error) {\n owner.dispose()\n attachSourceLocation(error, source)\n attachComponentContext(error, componentName, owner.id)\n throw error\n }\n associateNodeOwner(node, owner)\n const hmrKey = (component as typeof component & { hmrKey?: string }).hmrKey\n if (hmrKey) {\n const instance: HmrInstance = {\n node,\n parent: null,\n refresh(): void {\n const previous = instance.node\n const next = owner.run(() => component(props))\n if (instance.parent && !isVobsFragment(previous) && !isVobsFragment(next)) {\n getRenderer().insertBefore(instance.parent, next, previous)\n getRenderer().removeChild(instance.parent, previous)\n }\n nodeOwners.delete(previous as object)\n nodeOwners.set(next as object, owner)\n associateHmrInstance(next, instance)\n instance.node = next\n }\n }\n associateHmrInstance(node, instance)\n const separator = hmrKey.lastIndexOf(':')\n const moduleId = separator < 0 ? hmrKey : hmrKey.slice(0, separator)\n const cleanup = registerHmrInstance(moduleId, instance)\n owner.onDispose(cleanup)\n }\n return node\n}\n\nexport interface VobsSourceLocation {\n readonly file: string\n readonly line: number\n readonly column: number\n}\n\nexport interface VobsLocatedError extends Error {\n readonly vobsSource?: VobsSourceLocation\n readonly vobsComponent?: string\n readonly vobsOwnerId?: string\n}\n\nfunction attachSourceLocation(reason: unknown, source: VobsSourceLocation | undefined): void {\n if (!source || (!reason || (typeof reason !== 'object' && typeof reason !== 'function'))) return\n const error = reason as VobsLocatedError\n if (error.vobsSource) return\n try {\n Object.defineProperty(error, 'vobsSource', {\n configurable: true,\n enumerable: false,\n value: source,\n writable: false\n })\n } catch {\n // Frozen third-party errors still propagate with their original details.\n }\n}\n\nfunction attachComponentContext(reason: unknown, component: string, ownerId: string): void {\n if (!reason || (typeof reason !== 'object' && typeof reason !== 'function')) return\n const error = reason as VobsLocatedError\n try {\n if (!error.vobsComponent) Object.defineProperty(error, 'vobsComponent', { configurable: true, enumerable: false, value: component, writable: false })\n if (!error.vobsOwnerId) Object.defineProperty(error, 'vobsOwnerId', { configurable: true, enumerable: false, value: ownerId, writable: false })\n } catch {\n // Frozen third-party errors still propagate with their original details.\n }\n}\n\nexport function createBlock(factory: () => VobsNode | null | undefined | false): VobsNode | null {\n const owner = createOwner()\n setOwnerDebugName(owner, 'dynamic')\n let node: VobsNode | null | undefined | false\n try {\n node = owner.run(factory)\n } catch (error) {\n owner.dispose()\n throw error\n }\n if (!node) {\n owner.dispose()\n return null\n }\n associateNodeOwner(node, owner)\n return node\n}\n\nexport function associateNodeOwner(node: VobsNode, owner: Owner): void {\n nodeOwners.set(node, owner)\n}\n\nexport function disposeNodeOwner(node: VobsNode): void {\n const owner = nodeOwners.get(node)\n if (!owner) return\n nodeOwners.delete(node)\n owner.dispose()\n}\n","import { getCurrentOwner } from '@vobs/reactivity'\nimport { createComment, getRenderer } from './ops'\n\nexport interface VobsFragment {\n readonly kind: 'vobs-fragment'\n readonly start: Node\n readonly end: Node\n readonly mount: (parent: Node, anchor: Node | null) => void\n readonly unmount: (parent: Node) => void\n}\n\nexport type VobsNode = Node | VobsFragment\nexport type FragmentFactory = (parent: Node, anchor: Node) => void\n\nexport function createFragment(factory: FragmentFactory): VobsFragment {\n const start = createComment('vobs:fragment:start')\n const end = createComment('vobs:fragment:end')\n let parent: Node | null = null\n let initialized = false\n const owner = getCurrentOwner()\n\n const fragment: VobsFragment = {\n kind: 'vobs-fragment',\n start,\n end,\n mount(nextParent, anchor): void {\n if (parent && parent !== nextParent) {\n throw new Error('Vobs Fragment: 不能跨父节点移动 Fragment')\n }\n\n if (initialized) {\n moveRange(nextParent, start, end, anchor)\n return\n }\n\n const renderer = getRenderer()\n renderer.insertBefore(nextParent, start, anchor)\n renderer.insertBefore(nextParent, end, anchor)\n parent = nextParent\n initialized = true\n if (owner) owner.run(() => factory(nextParent, end))\n else factory(nextParent, end)\n },\n unmount(nextParent): void {\n if (!initialized || parent !== nextParent) {\n throw new Error('Vobs Fragment: Fragment 不属于指定父节点')\n }\n const renderer = getRenderer()\n let current = renderer.nextSibling(start)\n while (current && current !== end) {\n const next = renderer.nextSibling(current)\n renderer.removeChild(nextParent, current)\n current = next\n }\n renderer.removeChild(nextParent, start)\n renderer.removeChild(nextParent, end)\n parent = null\n initialized = false\n }\n }\n return fragment\n}\n\nexport function isVobsFragment(value: unknown): value is VobsFragment {\n return Boolean(value) && typeof value === 'object' && (value as VobsFragment).kind === 'vobs-fragment'\n}\n\nfunction moveRange(parent: Node, start: Node, end: Node, anchor: Node | null): void {\n const renderer = getRenderer()\n const nodes: Node[] = [start]\n let current = renderer.nextSibling(start)\n while (current) {\n nodes.push(current)\n if (current === end) break\n current = renderer.nextSibling(current)\n }\n if (nodes[nodes.length - 1] !== end) {\n throw new Error('Vobs Fragment: 找不到结束锚点')\n }\n for (const node of nodes) renderer.insertBefore(parent, node, anchor)\n}\n","import { getRenderer, isVobsFragment, type VobsNode } from '@vobs/vobs'\nimport type {\n TransitionDriver,\n TransitionDriverOptions,\n TransitionOptions,\n TransitionPhase,\n TransitionRun,\n TransitionStatus,\n TransitionStyle\n} from './types'\n\nexport function runTransition(\n node: VobsNode,\n status: Extract<TransitionStatus, 'entering' | 'leaving'>,\n options: TransitionDriverOptions,\n done: () => void\n): TransitionRun {\n const elements = getTransitionElements(node)\n if (elements.length === 0 || options.reducedMotion || !options.css && !hasStyles(options.phase)) {\n done()\n return { cancel() {} }\n }\n\n const phase = options.phase\n const classes = options.css ? phaseClasses(options.name, status) : []\n const restores = elements.map(element => applyInitialState(element, phase, classes, options.duration))\n let finished = false\n let frame: number | undefined\n let timeout: ReturnType<typeof setTimeout> | undefined\n const ended = new Set<Element>()\n\n const finish = (): void => {\n if (finished) return\n finished = true\n if (frame !== undefined) cancelFrame(frame)\n if (timeout !== undefined) clearTimeout(timeout)\n for (const element of elements) {\n element.removeEventListener('transitionend', onEnd)\n element.removeEventListener('animationend', onEnd)\n }\n for (const restore of restores) restore()\n done()\n }\n\n const onEnd = (event: Event): void => {\n const target = event.target\n if (!(target instanceof Element) || !elements.includes(target)) return\n ended.add(target)\n if (ended.size === elements.length) finish()\n }\n\n frame = scheduleFrame(() => {\n if (finished) return\n for (const element of elements) applyTargetState(element, phase, classes)\n if (options.duration <= 0) {\n finish()\n return\n }\n for (const element of elements) {\n element.addEventListener('transitionend', onEnd)\n element.addEventListener('animationend', onEnd)\n }\n timeout = setTimeout(finish, options.duration + 50)\n })\n\n return {\n cancel(): void {\n if (finished) return\n finished = true\n if (frame !== undefined) cancelFrame(frame)\n if (timeout !== undefined) clearTimeout(timeout)\n for (const element of elements) {\n element.removeEventListener('transitionend', onEnd)\n element.removeEventListener('animationend', onEnd)\n }\n for (const restore of restores) restore()\n }\n }\n}\n\nexport const cssTransitionDriver: TransitionDriver = {\n run(node, phase, options, done) {\n return runTransition(node, phase === 'enter' ? 'entering' : 'leaving', options, done)\n }\n}\n\nexport function createCSSTransitionDriver(): TransitionDriver {\n return cssTransitionDriver\n}\n\nexport function asTransitionElement(node: unknown): Element | null {\n if (!node || typeof node !== 'object') return null\n const candidate = node as Partial<Element>\n return candidate.classList && typeof candidate.addEventListener === 'function' ? candidate as Element : null\n}\n\nexport function resolveReducedMotion(options: TransitionOptions): boolean {\n if (options.reducedMotion === true) return true\n if (options.reducedMotion === false || typeof window === 'undefined' || !window.matchMedia) return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\nfunction getTransitionElements(node: VobsNode): Element[] {\n const element = asTransitionElement(node)\n if (element) return [element]\n if (!isVobsFragment(node)) return []\n\n const elements: Element[] = []\n const renderer = getRenderer()\n let current = renderer.nextSibling(node.start)\n while (current && current !== node.end) {\n const child = asTransitionElement(current)\n if (child) elements.push(child)\n current = renderer.nextSibling(current)\n }\n return elements\n}\n\nfunction hasStyles(phase: TransitionPhase | undefined): boolean {\n return Boolean(phase?.from || phase?.to)\n}\n\nfunction phaseClasses(prefix: string, status: TransitionStatus): readonly string[] {\n const phase = status === 'entering' ? 'enter' : 'leave'\n return [`${prefix}-${phase}-from`, `${prefix}-${phase}-active`, `${prefix}-${phase}-to`]\n}\n\nfunction applyInitialState(\n element: Element,\n phase: TransitionPhase | undefined,\n classes: readonly string[],\n duration: number\n): () => void {\n const [from, active] = classes\n if (from) element.classList.add(from)\n if (active) element.classList.add(active)\n const restoreStyles = applyInlineStyles(element, phase, duration)\n return () => {\n for (const className of classes) element.classList.remove(className)\n restoreStyles()\n }\n}\n\nfunction applyTargetState(element: Element, phase: TransitionPhase | undefined, classes: readonly string[]): void {\n const [from, _active, to] = classes\n if (from) element.classList.remove(from)\n if (to) element.classList.add(to)\n applyStyles(element, phase?.to)\n}\n\nfunction applyInlineStyles(element: Element, phase: TransitionPhase | undefined, duration: number): () => void {\n const style = supportsInlineStyle(element) ? element.style : undefined\n if (!style) return () => {}\n const previous = new Map<string, string>()\n const remember = (styles: TransitionStyle | undefined): void => {\n for (const name of Object.keys(styles ?? {})) {\n const property = stylePropertyName(name)\n if (!previous.has(property)) previous.set(property, style.getPropertyValue(property))\n }\n }\n remember(phase?.from)\n remember(phase?.to)\n if (hasStyles(phase) && duration > 0) {\n previous.set('transition-property', style.getPropertyValue('transition-property'))\n previous.set('transition-duration', style.getPropertyValue('transition-duration'))\n previous.set('transition-timing-function', style.getPropertyValue('transition-timing-function'))\n style.setProperty('transition-property', 'all')\n style.setProperty('transition-duration', `${Math.max(0, duration)}ms`)\n if (phase?.easing) style.setProperty('transition-timing-function', phase.easing)\n }\n applyStyles(element, phase?.from)\n return () => {\n for (const [name, value] of previous) style.setProperty(name, value)\n }\n}\n\nfunction applyStyles(element: Element, styles: TransitionStyle | undefined): void {\n if (!styles) return\n const style = supportsInlineStyle(element) ? element.style : undefined\n if (!style) return\n for (const [name, value] of Object.entries(styles)) {\n const property = stylePropertyName(name)\n if (value === null || value === undefined) style.removeProperty(property)\n else style.setProperty(property, String(value))\n }\n}\n\nfunction stylePropertyName(name: string): string {\n return name.startsWith('--') ? name : name.replace(/[A-Z]/gu, letter => `-${letter.toLowerCase()}`)\n}\n\nfunction supportsInlineStyle(element: Element): element is Element & { style: CSSStyleDeclaration } {\n return 'style' in element && Boolean((element as Partial<Element & { style: CSSStyleDeclaration }>).style)\n}\n\nfunction scheduleFrame(callback: () => void): number {\n if (typeof requestAnimationFrame === 'function') return requestAnimationFrame(callback)\n return setTimeout(callback, 16) as unknown as number\n}\n\nfunction cancelFrame(handle: number): void {\n if (typeof cancelAnimationFrame === 'function') cancelAnimationFrame(handle)\n else clearTimeout(handle as unknown as ReturnType<typeof setTimeout>)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/driver.ts"],"sourcesContent":["import { getRenderer, isVobsFragment, type VobsNode } from '@vobs/vobs'\nimport type {\n TransitionDriver,\n TransitionDriverOptions,\n TransitionOptions,\n TransitionPhase,\n TransitionRun,\n TransitionStatus,\n TransitionStyle\n} from './types'\n\nexport function runTransition(\n node: VobsNode,\n status: Extract<TransitionStatus, 'entering' | 'leaving'>,\n options: TransitionDriverOptions,\n done: () => void\n): TransitionRun {\n const elements = getTransitionElements(node)\n if (elements.length === 0 || options.reducedMotion || !options.css && !hasStyles(options.phase)) {\n done()\n return { cancel() {} }\n }\n\n const phase = options.phase\n const classes = options.css ? phaseClasses(options.name, status) : []\n const restores = elements.map(element => applyInitialState(element, phase, classes, options.duration))\n let finished = false\n let frame: number | undefined\n let timeout: ReturnType<typeof setTimeout> | undefined\n const ended = new Set<Element>()\n\n const finish = (): void => {\n if (finished) return\n finished = true\n if (frame !== undefined) cancelFrame(frame)\n if (timeout !== undefined) clearTimeout(timeout)\n for (const element of elements) {\n element.removeEventListener('transitionend', onEnd)\n element.removeEventListener('animationend', onEnd)\n }\n for (const restore of restores) restore()\n done()\n }\n\n const onEnd = (event: Event): void => {\n const target = event.target\n if (!(target instanceof Element) || !elements.includes(target)) return\n ended.add(target)\n if (ended.size === elements.length) finish()\n }\n\n frame = scheduleFrame(() => {\n if (finished) return\n for (const element of elements) applyTargetState(element, phase, classes)\n if (options.duration <= 0) {\n finish()\n return\n }\n for (const element of elements) {\n element.addEventListener('transitionend', onEnd)\n element.addEventListener('animationend', onEnd)\n }\n timeout = setTimeout(finish, options.duration + 50)\n })\n\n return {\n cancel(): void {\n if (finished) return\n finished = true\n if (frame !== undefined) cancelFrame(frame)\n if (timeout !== undefined) clearTimeout(timeout)\n for (const element of elements) {\n element.removeEventListener('transitionend', onEnd)\n element.removeEventListener('animationend', onEnd)\n }\n for (const restore of restores) restore()\n }\n }\n}\n\nexport const cssTransitionDriver: TransitionDriver = {\n run(node, phase, options, done) {\n return runTransition(node, phase === 'enter' ? 'entering' : 'leaving', options, done)\n }\n}\n\nexport function createCSSTransitionDriver(): TransitionDriver {\n return cssTransitionDriver\n}\n\nexport function asTransitionElement(node: unknown): Element | null {\n if (!node || typeof node !== 'object') return null\n const candidate = node as Partial<Element>\n return candidate.classList && typeof candidate.addEventListener === 'function' ? candidate as Element : null\n}\n\nexport function resolveReducedMotion(options: TransitionOptions): boolean {\n if (options.reducedMotion === true) return true\n if (options.reducedMotion === false || typeof window === 'undefined' || !window.matchMedia) return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\nfunction getTransitionElements(node: VobsNode): Element[] {\n const element = asTransitionElement(node)\n if (element) return [element]\n if (!isVobsFragment(node)) return []\n\n const elements: Element[] = []\n const renderer = getRenderer()\n let current = renderer.nextSibling(node.start)\n while (current && current !== node.end) {\n const child = asTransitionElement(current)\n if (child) elements.push(child)\n current = renderer.nextSibling(current)\n }\n return elements\n}\n\nfunction hasStyles(phase: TransitionPhase | undefined): boolean {\n return Boolean(phase?.from || phase?.to)\n}\n\nfunction phaseClasses(prefix: string, status: TransitionStatus): readonly string[] {\n const phase = status === 'entering' ? 'enter' : 'leave'\n return [`${prefix}-${phase}-from`, `${prefix}-${phase}-active`, `${prefix}-${phase}-to`]\n}\n\nfunction applyInitialState(\n element: Element,\n phase: TransitionPhase | undefined,\n classes: readonly string[],\n duration: number\n): () => void {\n const [from, active] = classes\n if (from) element.classList.add(from)\n if (active) element.classList.add(active)\n const restoreStyles = applyInlineStyles(element, phase, duration)\n return () => {\n for (const className of classes) element.classList.remove(className)\n restoreStyles()\n }\n}\n\nfunction applyTargetState(element: Element, phase: TransitionPhase | undefined, classes: readonly string[]): void {\n const [from, _active, to] = classes\n if (from) element.classList.remove(from)\n if (to) element.classList.add(to)\n applyStyles(element, phase?.to)\n}\n\nfunction applyInlineStyles(element: Element, phase: TransitionPhase | undefined, duration: number): () => void {\n const style = supportsInlineStyle(element) ? element.style : undefined\n if (!style) return () => {}\n const previous = new Map<string, string>()\n const remember = (styles: TransitionStyle | undefined): void => {\n for (const name of Object.keys(styles ?? {})) {\n const property = stylePropertyName(name)\n if (!previous.has(property)) previous.set(property, style.getPropertyValue(property))\n }\n }\n remember(phase?.from)\n remember(phase?.to)\n if (hasStyles(phase) && duration > 0) {\n previous.set('transition-property', style.getPropertyValue('transition-property'))\n previous.set('transition-duration', style.getPropertyValue('transition-duration'))\n previous.set('transition-timing-function', style.getPropertyValue('transition-timing-function'))\n style.setProperty('transition-property', 'all')\n style.setProperty('transition-duration', `${Math.max(0, duration)}ms`)\n if (phase?.easing) style.setProperty('transition-timing-function', phase.easing)\n }\n applyStyles(element, phase?.from)\n return () => {\n for (const [name, value] of previous) style.setProperty(name, value)\n }\n}\n\nfunction applyStyles(element: Element, styles: TransitionStyle | undefined): void {\n if (!styles) return\n const style = supportsInlineStyle(element) ? element.style : undefined\n if (!style) return\n for (const [name, value] of Object.entries(styles)) {\n const property = stylePropertyName(name)\n if (value === null || value === undefined) style.removeProperty(property)\n else style.setProperty(property, String(value))\n }\n}\n\nfunction stylePropertyName(name: string): string {\n return name.startsWith('--') ? name : name.replace(/[A-Z]/gu, letter => `-${letter.toLowerCase()}`)\n}\n\nfunction supportsInlineStyle(element: Element): element is Element & { style: CSSStyleDeclaration } {\n return 'style' in element && Boolean((element as Partial<Element & { style: CSSStyleDeclaration }>).style)\n}\n\nfunction scheduleFrame(callback: () => void): number {\n if (typeof requestAnimationFrame === 'function') return requestAnimationFrame(callback)\n return setTimeout(callback, 16) as unknown as number\n}\n\nfunction cancelFrame(handle: number): void {\n if (typeof cancelAnimationFrame === 'function') cancelAnimationFrame(handle)\n else clearTimeout(handle as unknown as ReturnType<typeof setTimeout>)\n}\n"],"mappings":"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","names":[]}
|