@vobs/theme 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,437 +1,15 @@
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
- var signalNames = /* @__PURE__ */ new WeakMap();
7
- function hasDebugHooks() {
8
- return activeDebugHooks !== null;
9
- }
10
- __name(hasDebugHooks, "hasDebugHooks");
11
- function setSignalDebugName(signal, name) {
12
- signalNames.set(signal, name);
13
- invokeDebug("signalNamed", signal, name);
14
- }
15
- __name(setSignalDebugName, "setSignalDebugName");
16
- function invokeDebug(name, ...args) {
17
- return;
18
- }
19
- __name(invokeDebug, "invokeDebug");
20
-
21
- // packages/reactivity/src/owner.ts
22
- var currentOwner = null;
23
- function getCurrentOwner() {
24
- return currentOwner;
25
- }
26
- __name(getCurrentOwner, "getCurrentOwner");
27
- function onDispose(cleanup) {
28
- throw new Error("Vobs: onDispose \u5FC5\u987B\u5728 Owner \u4F5C\u7528\u57DF\u5185\u8C03\u7528");
29
- }
30
- __name(onDispose, "onDispose");
31
-
32
- // packages/reactivity/src/signal.ts
33
- var currentSubscriber = null;
34
- function getCurrentSubscriber() {
35
- return currentSubscriber;
36
- }
37
- __name(getCurrentSubscriber, "getCurrentSubscriber");
38
- function setCurrentSubscriber(subscriber) {
39
- currentSubscriber = subscriber;
40
- }
41
- __name(setCurrentSubscriber, "setCurrentSubscriber");
42
- function trackDependency(dependency) {
43
- if (!currentSubscriber || currentSubscriber.disposed) return;
44
- !currentSubscriber.dependencies.has(dependency);
45
- currentSubscriber.dependencies.add(dependency);
46
- }
47
- __name(trackDependency, "trackDependency");
48
- function state(initialValue, debugName) {
49
- let value = initialValue;
50
- let disposed = false;
51
- const subscribers = /* @__PURE__ */ new Set();
52
- const signalInstance = {
53
- get value() {
54
- const subscriber = getCurrentSubscriber();
55
- if (subscriber && !subscriber.disposed) {
56
- subscribers.add(subscriber);
57
- trackDependency(signalInstance);
58
- }
59
- return value;
60
- },
61
- set value(nextValue) {
62
- if (disposed || Object.is(value, nextValue)) return;
63
- value = nextValue;
64
- for (const subscriber of [...subscribers]) subscriber.notify();
65
- },
66
- unsubscribe(subscriber) {
67
- subscribers.delete(subscriber);
68
- },
69
- // 与 `.value =` 赋值同一条路径:判等短路、debug hook、notify 全部一致。
70
- // 以闭包实现,可安全地作为回调直接传递(无 this 绑定问题)。
71
- set(next) {
72
- signalInstance.value = next;
73
- },
74
- dispose() {
75
- if (disposed) return;
76
- disposed = true;
77
- subscribers.clear();
78
- }
79
- };
80
- if (debugName?.trim()) setSignalDebugName(signalInstance, debugName.trim());
81
- return signalInstance;
82
- }
83
- __name(state, "state");
84
-
85
- // packages/reactivity/src/scheduler.ts
86
- var _Scheduler = class _Scheduler {
87
- constructor() {
88
- this.dirtyEffects = /* @__PURE__ */ new Set();
89
- this.lowPriorityEffects = /* @__PURE__ */ new Set();
90
- // flush 不可重入(flushing 标志保证),缓冲数组可在轮次间安全复用,避免每轮分配。
91
- this.normalBuffer = [];
92
- this.lowBuffer = [];
93
- this.flushing = false;
94
- this.scheduled = false;
95
- this.batchDepth = 0;
96
- }
97
- schedule(effect2) {
98
- if (effect2.disposed) return;
99
- this.dirtyEffects.add(effect2);
100
- this.lowPriorityEffects.delete(effect2);
101
- this.ensureScheduled();
102
- }
103
- /** Queue an effect behind normal updates while preserving deterministic order. */
104
- scheduleLow(effect2) {
105
- if (effect2.disposed) return;
106
- if (!this.dirtyEffects.has(effect2)) this.lowPriorityEffects.add(effect2);
107
- this.ensureScheduled();
108
- }
109
- ensureScheduled() {
110
- if (this.batchDepth === 0 && !this.flushing && !this.scheduled) {
111
- this.scheduled = true;
112
- queueMicrotask(() => {
113
- this.scheduled = false;
114
- this.flush();
115
- });
116
- }
117
- }
118
- remove(effect2) {
119
- this.dirtyEffects.delete(effect2);
120
- this.lowPriorityEffects.delete(effect2);
121
- }
122
- batch(fn) {
123
- this.batchDepth++;
124
- try {
125
- return fn();
126
- } finally {
127
- this.batchDepth--;
128
- if (this.batchDepth === 0) this.flush();
129
- }
130
- }
131
- flush() {
132
- if (this.flushing || this.batchDepth > 0) return;
133
- this.flushing = true;
134
- let rounds = 0;
135
- let firstError;
136
- let hasError = false;
137
- try {
138
- while (this.dirtyEffects.size > 0 || this.lowPriorityEffects.size > 0) {
139
- if (++rounds > 100) {
140
- this.dirtyEffects.clear();
141
- this.lowPriorityEffects.clear();
142
- throw new Error("Vobs: \u54CD\u5E94\u5F0F\u66F4\u65B0\u8D85\u8FC7 100 \u8F6E\uFF0C\u53EF\u80FD\u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56");
143
- }
144
- this.collectRunnable(this.dirtyEffects, this.normalBuffer);
145
- this.collectRunnable(this.lowPriorityEffects, this.lowBuffer);
146
- sortEffects(this.normalBuffer);
147
- sortEffects(this.lowBuffer);
148
- for (const effect2 of this.normalBuffer) {
149
- try {
150
- effect2.run();
151
- } catch (error) {
152
- if (!hasError) {
153
- firstError = error;
154
- hasError = true;
155
- }
156
- }
157
- }
158
- for (const effect2 of this.lowBuffer) {
159
- try {
160
- effect2.run();
161
- } catch (error) {
162
- if (!hasError) {
163
- firstError = error;
164
- hasError = true;
165
- }
166
- }
167
- }
168
- this.normalBuffer.length = 0;
169
- this.lowBuffer.length = 0;
170
- }
171
- } finally {
172
- this.normalBuffer.length = 0;
173
- this.lowBuffer.length = 0;
174
- this.flushing = false;
175
- }
176
- if (hasError) throw firstError;
177
- }
178
- /** 收集未 disposed 的 effect 并清空源集合;run() 期间新调度的 effect 留给下一轮。 */
179
- collectRunnable(source, target) {
180
- for (const effect2 of source) {
181
- if (!effect2.disposed) target.push(effect2);
182
- }
183
- source.clear();
184
- }
185
- };
186
- __name(_Scheduler, "Scheduler");
187
- var Scheduler = _Scheduler;
188
- function sortEffects(effects) {
189
- if (effects.length > 1) {
190
- effects.sort((a, b) => b.depth - a.depth || a.order - b.order);
191
- }
192
- }
193
- __name(sortEffects, "sortEffects");
194
- var scheduler = new Scheduler();
195
-
196
- // packages/reactivity/src/effect.ts
197
- var nextEffectOrder = 1;
198
- function cleanupDependencies(subscriber) {
199
- for (const dependency of subscriber.dependencies) {
200
- dependency.unsubscribe(subscriber);
201
- }
202
- subscriber.dependencies.clear();
203
- }
204
- __name(cleanupDependencies, "cleanupDependencies");
205
- function effect(callback) {
206
- const owner = getCurrentOwner();
207
- let cleanup;
208
- let dirty = true;
209
- let disposed = false;
210
- const eff = {
211
- order: nextEffectOrder++,
212
- depth: owner?.depth ?? 0,
213
- dependencies: /* @__PURE__ */ new Set(),
214
- get disposed() {
215
- return disposed;
216
- },
217
- notify() {
218
- if (disposed || dirty) return;
219
- dirty = true;
220
- scheduler.schedule(eff);
221
- },
222
- run() {
223
- if (disposed || !dirty) return;
224
- dirty = false;
225
- const previousCleanup = cleanup;
226
- cleanup = void 0;
227
- let cleanupError;
228
- if (previousCleanup) {
229
- try {
230
- previousCleanup();
231
- } catch (error) {
232
- cleanupError = error;
233
- }
234
- }
235
- cleanupDependencies(eff);
236
- const previous = getCurrentSubscriber();
237
- setCurrentSubscriber(eff);
238
- let thrown;
239
- let handled = false;
240
- try {
241
- const result = owner ? owner.run(callback) : callback();
242
- cleanup = typeof result === "function" ? result : void 0;
243
- } catch (error) {
244
- thrown = error;
245
- handled = false;
246
- if (!handled) throw error;
247
- } finally {
248
- setCurrentSubscriber(previous);
249
- }
250
- if (cleanupError && !thrown) throw cleanupError;
251
- },
252
- scheduleLow() {
253
- if (disposed || dirty) return;
254
- dirty = true;
255
- scheduler.scheduleLow(eff);
256
- },
257
- dispose() {
258
- if (disposed) return;
259
- disposed = true;
260
- dirty = false;
261
- scheduler.remove(eff);
262
- const previousCleanup = cleanup;
263
- cleanup = void 0;
264
- let cleanupError;
265
- if (previousCleanup) {
266
- try {
267
- previousCleanup();
268
- } catch (error) {
269
- cleanupError = error;
270
- }
271
- }
272
- cleanupDependencies(eff);
273
- if (cleanupError) throw cleanupError;
274
- }
275
- };
276
- eff.run();
277
- return eff;
278
- }
279
- __name(effect, "effect");
280
- var renderEffect = effect;
281
-
282
- // packages/reactivity/src/memo.ts
283
- function memo(compute) {
284
- let cached;
285
- let dirty = true;
286
- let disposed = false;
287
- const subscribers = /* @__PURE__ */ new Set();
288
- const memoSubscriber = {
289
- dependencies: /* @__PURE__ */ new Set(),
290
- get disposed() {
291
- return disposed;
292
- },
293
- notify() {
294
- if (disposed || dirty) return;
295
- dirty = true;
296
- for (const subscriber of [...subscribers]) subscriber.notify();
297
- }
298
- };
299
- const memoSignal = {
300
- get value() {
301
- const subscriber = getCurrentSubscriber();
302
- if (subscriber && !subscriber.disposed) {
303
- subscribers.add(subscriber);
304
- trackDependency(memoSignal);
305
- }
306
- if (dirty) {
307
- cleanupDependencies(memoSubscriber);
308
- const previous = getCurrentSubscriber();
309
- setCurrentSubscriber(memoSubscriber);
310
- try {
311
- cached = compute();
312
- dirty = false;
313
- } finally {
314
- setCurrentSubscriber(previous);
315
- }
316
- }
317
- return cached;
318
- },
319
- set value(_) {
320
- throw new Error("memo: \u6D3E\u751F\u503C\u4E0D\u80FD\u76F4\u63A5\u8D4B\u503C");
321
- },
322
- unsubscribe(subscriber) {
323
- subscribers.delete(subscriber);
324
- },
325
- dispose() {
326
- if (disposed) return;
327
- disposed = true;
328
- subscribers.clear();
329
- cleanupDependencies(memoSubscriber);
330
- }
331
- };
332
- return memoSignal;
333
- }
334
- __name(memo, "memo");
335
-
336
- // packages/runtime/src/debug.ts
337
- var activeRuntimeDebugHooks = null;
338
- function getRuntimeDebugHooks() {
339
- return activeRuntimeDebugHooks;
340
- }
341
- __name(getRuntimeDebugHooks, "getRuntimeDebugHooks");
342
- function invokeRuntimeDebug(name, ...args) {
343
- return;
344
- }
345
- __name(invokeRuntimeDebug, "invokeRuntimeDebug");
346
- function describeDebugNode(node) {
347
- if (!node || typeof node !== "object") return "node";
348
- const value = node;
349
- const name = typeof value.tagName === "string" ? value.tagName.toLowerCase() : typeof value.nodeName === "string" ? value.nodeName.toLowerCase() : "node";
350
- const id = typeof value.id === "string" && value.id ? `#${value.id}` : "";
351
- const className = typeof value.className === "string" && value.className ? `.${value.className.trim().split(/\s+/).filter(Boolean).join(".")}` : "";
352
- return `${name}${id}${className}`;
353
- }
354
- __name(describeDebugNode, "describeDebugNode");
355
-
356
- // packages/runtime/src/hmr.ts
357
- var globalTarget = globalThis;
358
- var hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: /* @__PURE__ */ new Map() };
359
- globalTarget.__VOBS_HMR__ = hmrGlobal;
360
- function markHmrInstanceMounted(node, parent) {
361
- const instance = hmrInstances.get(node);
362
- if (instance) instance.parent = parent;
363
- }
364
- __name(markHmrInstanceMounted, "markHmrInstanceMounted");
365
- var hmrInstances = /* @__PURE__ */ new WeakMap();
366
- function getRenderer() {
367
- {
368
- throw new Error("\u6E32\u67D3\u5668\u672A\u521D\u59CB\u5316");
369
- }
370
- }
371
- __name(getRenderer, "getRenderer");
372
- function createElement(tag) {
373
- return getRenderer().createElement(tag);
374
- }
375
- __name(createElement, "createElement");
376
- function insertBefore(parent, child, anchor) {
377
- if (isVobsFragment(child)) {
378
- child.mount(parent, isVobsFragment(anchor) ? anchor.start : anchor);
379
- return;
380
- }
381
- getRenderer().insertBefore(parent, child, isVobsFragment(anchor) ? anchor.start : anchor);
382
- markHmrInstanceMounted(child, parent);
383
- }
384
- __name(insertBefore, "insertBefore");
385
-
386
- // packages/runtime/src/fragment.ts
387
- function isVobsFragment(value) {
388
- return Boolean(value) && typeof value === "object" && value.kind === "vobs-fragment";
389
- }
390
- __name(isVobsFragment, "isVobsFragment");
391
-
392
- // packages/vobs/src/context.ts
393
- var ownerProviders = /* @__PURE__ */ new WeakMap();
394
- function provide(key, value, options = {}) {
395
- throw new Error("Vobs: provide \u5FC5\u987B\u5728\u7EC4\u4EF6\u6216 Owner \u4F5C\u7528\u57DF\u5185\u8C03\u7528");
396
- }
397
- __name(provide, "provide");
398
- function inject(key, fallback) {
399
- const owner = getCurrentOwner();
400
- const value = owner ? injectFromOwner(owner, key) : void 0;
401
- return value === void 0 ? fallback : value;
402
- }
403
- __name(inject, "inject");
404
- function provideToOwner(owner, key, value, options = {}) {
405
- let providers = ownerProviders.get(owner);
406
- if (!providers) {
407
- providers = /* @__PURE__ */ new Map();
408
- ownerProviders.set(owner, providers);
409
- owner.onDispose(() => ownerProviders.delete(owner));
410
- }
411
- if (providers.has(key) && !options.override) {
412
- throw new Error(`Vobs: \u6CE8\u5165\u9879 ${String(key)} \u5DF2\u5B58\u5728\uFF1B\u5982\u9700\u8986\u76D6\u8BF7\u4F20\u5165 override: true`);
413
- }
414
- providers.set(key, value);
415
- }
416
- __name(provideToOwner, "provideToOwner");
417
- function injectFromOwner(owner, key) {
418
- let current = owner;
419
- while (current) {
420
- const providers = ownerProviders.get(current);
421
- if (providers?.has(key)) return providers.get(key);
422
- current = current.parent;
423
- }
424
- return void 0;
425
- }
426
- __name(injectFromOwner, "injectFromOwner");
427
-
428
- // packages/vobs/src/app.ts
429
- function createInjectionKey(description) {
430
- return Symbol(description);
431
- }
432
- __name(createInjectionKey, "createInjectionKey");
433
-
434
4
  // packages/theme/src/index.ts
5
+ import { getCurrentOwner, memo, onDispose, renderEffect, state } from "@vobs/reactivity";
6
+ import {
7
+ createElement,
8
+ createInjectionKey,
9
+ inject,
10
+ insertBefore,
11
+ provide
12
+ } from "@vobs/vobs";
435
13
  var THEME_KEY = createInjectionKey("vobs.theme");
436
14
  var defaultLightTheme = {
437
15
  colorScheme: "light",
@@ -583,10 +161,12 @@ function createTheme(options = {}) {
583
161
  overrides.dispose();
584
162
  }
585
163
  };
164
+ if (getCurrentOwner()) onDispose(context.dispose);
586
165
  return context;
587
166
  function ensureActive() {
588
167
  if (disposed) throw new Error("Vobs Theme: \u5DF2\u9500\u6BC1\u7684\u4E0A\u4E0B\u6587\u4E0D\u80FD\u7EE7\u7EED\u4F7F\u7528");
589
168
  }
169
+ __name(ensureActive, "ensureActive");
590
170
  }
591
171
  __name(createTheme, "createTheme");
592
172
  function themePlugin(options = {}) {
@@ -615,7 +195,7 @@ function ThemeBoundary(props = {}) {
615
195
  props.tokens ?? {},
616
196
  props.brand ? { brand: props.brand } : {}
617
197
  ));
618
- provide();
198
+ provide(THEME_KEY, local);
619
199
  const root = createElement("div");
620
200
  renderEffect(() => {
621
201
  applyThemeVariables(root, local.theme.value);
@@ -673,10 +253,12 @@ function createScopedTheme(parent, initialOverrides) {
673
253
  overrides.dispose();
674
254
  }
675
255
  };
256
+ if (getCurrentOwner()) onDispose(context.dispose);
676
257
  return context;
677
258
  function ensureActive() {
678
259
  if (disposed) throw new Error("Vobs Theme: \u5DF2\u9500\u6BC1\u7684\u5C40\u90E8\u4E0A\u4E0B\u6587\u4E0D\u80FD\u7EE7\u7EED\u4F7F\u7528");
679
260
  }
261
+ __name(ensureActive, "ensureActive");
680
262
  }
681
263
  __name(createScopedTheme, "createScopedTheme");
682
264
  function parseDehydratedState(snapshot) {
@@ -750,7 +332,14 @@ function readSystemMode() {
750
332
  return typeof window !== "undefined" && typeof window.matchMedia === "function" && window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
751
333
  }
752
334
  __name(readSystemMode, "readSystemMode");
753
-
754
- export { THEME_KEY, ThemeBoundary, createTheme, defaultDarkTheme, defaultLightTheme, flattenTheme, themePlugin, useTheme };
755
- //# sourceMappingURL=index.js.map
335
+ export {
336
+ THEME_KEY,
337
+ ThemeBoundary,
338
+ createTheme,
339
+ defaultDarkTheme,
340
+ defaultLightTheme,
341
+ flattenTheme,
342
+ themePlugin,
343
+ useTheme
344
+ };
756
345
  //# sourceMappingURL=index.js.map