voodoojs 0.11.2 → 0.12.1

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.
Files changed (41) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-H2ZUEQWV.js → chunk-4M4ZXHNY.js} +84 -19
  3. package/dist/{chunk-UV5PMS7P.js → chunk-72PMUUMT.js} +4 -4
  4. package/dist/{chunk-KQYSJHZR.js → chunk-AFMCDNYS.js} +5 -5
  5. package/dist/{chunk-DJJB35SR.js → chunk-D7675IJG.js} +6 -6
  6. package/dist/{chunk-IS3DR2KY.js → chunk-GXPNWCGE.js} +3 -3
  7. package/dist/{chunk-DCE5WIGA.js → chunk-HNM3CTBD.js} +5 -5
  8. package/dist/{chunk-IGZSDZKU.js → chunk-KN7NAKBL.js} +4 -4
  9. package/dist/{chunk-WJP3YGUI.js → chunk-LLNDLLKV.js} +4 -4
  10. package/dist/{chunk-V3O3WOZH.js → chunk-NP66JM2P.js} +4 -4
  11. package/dist/{chunk-AH2VXDZD.js → chunk-RDHYPGH6.js} +187 -18
  12. package/dist/{chunk-NFDXVIII.js → chunk-T5ION5NG.js} +3 -3
  13. package/dist/essential.cjs +263 -25
  14. package/dist/essential.d.cts +1 -1
  15. package/dist/essential.d.ts +1 -1
  16. package/dist/essential.js +10 -10
  17. package/dist/gpu.cjs +1 -1
  18. package/dist/gpu.js +10 -10
  19. package/dist/http.cjs +1 -1
  20. package/dist/http.js +5 -5
  21. package/dist/index.cjs +273 -27
  22. package/dist/index.d.cts +88 -4
  23. package/dist/index.d.ts +88 -4
  24. package/dist/index.js +20 -20
  25. package/dist/{query-Cf-7iibE.d.ts → query-DzHfm8Kg.d.ts} +40 -29
  26. package/dist/{query-DiQAS73Q.d.cts → query-XooOh4vB.d.cts} +40 -29
  27. package/dist/reactivity.cjs +1 -1
  28. package/dist/reactivity.js +2 -2
  29. package/dist/socket.cjs +1 -1
  30. package/dist/socket.js +9 -9
  31. package/dist/style-GR4X6O7I.js +5 -0
  32. package/dist/utils.cjs +1 -1
  33. package/dist/utils.js +2 -2
  34. package/dist/voodoo.core.js +242 -24
  35. package/dist/voodoo.core.min.js +17 -17
  36. package/dist/voodoo.full.js +266 -27
  37. package/dist/voodoo.full.min.js +57 -53
  38. package/dist/voodoo.js +264 -25
  39. package/dist/voodoo.min.js +29 -25
  40. package/package.json +1 -1
  41. package/dist/style-4X62SABN.js +0 -5
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- import { S as Scope, c as core, V as VoodooCollection } from './query-Cf-7iibE.js';
2
- export { A as App, a as AppOptions, C as ComponentDefinition, D as DirectiveBinding, b as DirectiveHooks, P as PRIORITY, R as Resource, d as ResourceOptions, e as VoodooConfig, f as VoodooPlugin, g as VoodooRuntimeError, h as VoodooSyntaxError, i as addCleanup, j as allStores, k as allowedGlobals, l as cache, m as clearParseCache, n as config, o as cookie, p as createApp, q as createResource, r as defineComponent, s as defineDirective, t as destroy, u as documentReady, v as ensureTokens, w as enter, x as evaluate, y as fadeIn, z as fadeOut, B as findScope, E as fromHtml, F as getScope, G as injectStyle, H as instances, I as leave, J as magic, K as magics, L as mountComponent, M as parse, N as query, O as ready, Q as refresh, T as removeStore, q as resource, U as rootScope, W as session, X as slideDown, Y as slideUp, Z as start, _ as storage, $ as store, a0 as storeNames, a1 as stringify, a2 as theme, a3 as toast, a4 as tokenize, a5 as url, a6 as viewTransition, a7 as walk, a8 as whenElement, a9 as whenReady } from './query-Cf-7iibE.js';
1
+ import { S as Scope, c as core, V as VoodooCollection } from './query-DzHfm8Kg.js';
2
+ export { A as App, a as AppOptions, C as ComponentDefinition, D as DirectiveBinding, b as DirectiveHooks, P as PRIORITY, R as Resource, d as ResourceOptions, e as VoodooConfig, f as VoodooPlugin, g as VoodooRuntimeError, h as VoodooSyntaxError, i as addCleanup, j as allStores, k as allowedGlobals, l as cache, m as clearParseCache, n as config, o as cookie, p as createApp, q as createResource, r as defineComponent, s as defineDirective, t as destroy, u as documentReady, v as ensureTokens, w as enter, x as evaluate, y as fadeIn, z as fadeOut, B as findScope, E as fromHtml, F as getScope, G as hook, H as hooks, I as injectStyle, J as instances, K as leave, L as magic, M as magics, N as mountComponent, O as parse, Q as query, T as ready, U as refresh, W as removeStore, q as resource, X as rootScope, Y as session, Z as slideDown, _ as slideUp, $ as start, a0 as storage, a1 as store, a2 as storeNames, a3 as stringify, a4 as theme, a5 as toast, a6 as tokenize, a7 as url, a8 as viewTransition, a9 as walk, aa as whenElement, ab as whenReady } from './query-DzHfm8Kg.js';
3
+ import { Ref } from './reactivity.js';
3
4
  export { EffectScope, computed, effect, effectScope, flushSync, isReactive, markRaw, nextTick, reactive, ref, shallowRef, stop, toRaw, unref, watch, watchEffect } from './reactivity.js';
4
5
  export { HttpError, HttpMethod, HttpResponse, RequestConfig, http, request } from './http.js';
5
6
  export { R as RoomOptions, a as RoomState, S as SocketMessage, b as SocketOptions, c as SocketRoom, d as SocketState, e as SocketTransport, V as VoodooSocket, f as createSocket, s as socket, g as socketSupported } from './index-DTllqUtj.js';
@@ -171,7 +172,16 @@ declare const sound: {
171
172
  unmute(): void;
172
173
  /** Toggles between muted and unmuted, and returns the new state. */
173
174
  toggle(): boolean;
174
- /** `true` when muted. */
175
+ /**
176
+ * `true` when muted.
177
+ *
178
+ * Reads a revision ref first, so that an expression asking whether sound is
179
+ * muted actually re-runs when it changes. The state lives in a module
180
+ * variable and in localStorage, both invisible to the Proxy, so
181
+ * `v-show="$sound.muted"` used to render once and then never move: a page had
182
+ * no way to show whether it was muted, which made the mute button look like
183
+ * it did nothing at all.
184
+ */
175
185
  readonly muted: boolean;
176
186
  /** Names of all available effects. */
177
187
  readonly names: string[];
@@ -481,6 +491,80 @@ declare const charts: {
481
491
  colors: string[];
482
492
  };
483
493
 
494
+ /**
495
+ * @module hooks
496
+ *
497
+ * React-style hooks, reachable by bare name inside any expression.
498
+ *
499
+ * These are a thin surface over primitives the library already had — `effect`,
500
+ * `computed`, `ref` and `store`. The value is not new machinery, it is that
501
+ * someone arriving from React can write what they already know and have it mean
502
+ * the right thing here.
503
+ *
504
+ * Two differences from React are deliberate, and both are improvements rather
505
+ * than gaps:
506
+ *
507
+ * 1. `deps` is optional everywhere. Voodoo tracks reads through a Proxy, so a
508
+ * hook with no dependency array re-runs exactly when something it actually
509
+ * read changes. The array is there for when you want to narrow that, not
510
+ * because the library cannot work it out.
511
+ *
512
+ * 2. There is no rule against calling a hook in a branch. Slots are keyed per
513
+ * scope in call order within one evaluation, and `v-data` and `v-init` each
514
+ * evaluate once per scope, so the order is stable without a rule asking you
515
+ * to keep it stable.
516
+ *
517
+ * `useState` and `useMemo` return refs, and `reactive()` unwraps refs on read,
518
+ * so inside `v-data` they read as plain values with no `.value` anywhere.
519
+ * `useRef` deliberately does not: it returns a raw `{ current }` box that no
520
+ * effect subscribes to, which is the whole point of it.
521
+ */
522
+
523
+ /**
524
+ * A value that survives re-evaluation and re-renders whatever reads it.
525
+ *
526
+ * Returns a ref. Written into `v-data` it reads and assigns as a plain value,
527
+ * because reactive objects unwrap refs, so `count++` works with no `.value`.
528
+ */
529
+ declare function useState<T>(scope: Scope, initial: T): Ref<T>;
530
+ /**
531
+ * Runs a side effect, and re-runs it when what it depends on changes.
532
+ *
533
+ * With no dependency array it tracks its own reads and re-runs when any of them
534
+ * change. With `[]` it runs once. With `[a, b]` it re-runs only when one of
535
+ * those differs from last time. Returning a function from `fn` registers
536
+ * cleanup, called before the next run and again when the element is removed.
537
+ */
538
+ declare function useEffect(scope: Scope, fn: () => void | (() => void), deps?: unknown): void;
539
+ /**
540
+ * Caches a computation.
541
+ *
542
+ * With no dependency array it becomes a `computed`: lazy, cached, and
543
+ * recomputed only when something it read actually changed. With an array it
544
+ * recomputes when that array changes. Returns a ref, so inside `v-data` it
545
+ * reads as the value itself.
546
+ */
547
+ declare function useMemo<T>(scope: Scope, fn: () => T, deps?: unknown): Ref<T>;
548
+ /**
549
+ * A box that survives re-evaluation and that nothing subscribes to.
550
+ *
551
+ * Use it for a DOM element, a timer id, or a previous value — anything you want
552
+ * to keep without the page reacting when it changes. Deliberately not a ref, so
553
+ * reading `.current` inside an effect does not make that effect depend on it.
554
+ */
555
+ declare function useRef<T>(scope: Scope, initial: T): {
556
+ current: T;
557
+ };
558
+ /**
559
+ * Shared state, reachable from any component without threading it through the
560
+ * markup by hand.
561
+ *
562
+ * Backed by the store registry, so `useContext('user')` and `$store.user` are
563
+ * the same object. Passing a second argument creates the store on first use.
564
+ */
565
+ declare function useContext<T extends Record<string, any>>(name: string, initial?: T): T;
566
+ declare function installHooks(): void;
567
+
484
568
  /**
485
569
  * @module runtime/magics
486
570
  *
@@ -1714,4 +1798,4 @@ interface Voodoo extends Omit<typeof core, never> {
1714
1798
  }
1715
1799
  declare const V: Voodoo;
1716
1800
 
1717
- export { Scope, V, type Voodoo, VoodooCollection, activateJsx, alert, animate, applyMask, applyRegions, charts, clearErrors, clipboard, confirm, V as default, devtoolsBus, devtoolsWidget, dialog, disableXray, easings, enableXray, extractJsx, getLocale, hotkey, i18n, inView, isDevtoolsWidgetMounted, isXrayEnabled, jsx, mask, masks, modal, motionPresets, mountDevtoolsWidget, navigate, network, palette, prompt, readDeclarationBlock, registerMask, renderChart, route, router, screen, scrollProgress, serializeForm, setLocale, showFormErrors, sound, efeitos as soundEffects, spring, stagger, t, unmask, unmountDevtoolsWidget, validate, validator, xray };
1801
+ export { Scope, V, type Voodoo, VoodooCollection, activateJsx, alert, animate, applyMask, applyRegions, charts, clearErrors, clipboard, confirm, V as default, devtoolsBus, devtoolsWidget, dialog, disableXray, easings, enableXray, extractJsx, getLocale, hotkey, i18n, inView, installHooks, isDevtoolsWidgetMounted, isXrayEnabled, jsx, mask, masks, modal, motionPresets, mountDevtoolsWidget, navigate, network, palette, prompt, readDeclarationBlock, registerMask, renderChart, route, router, screen, scrollProgress, serializeForm, setLocale, showFormErrors, sound, efeitos as soundEffects, spring, stagger, t, unmask, unmountDevtoolsWidget, useContext, useEffect, useMemo, useRef, useState, validate, validator, xray };
package/dist/index.js CHANGED
@@ -1,25 +1,25 @@
1
- import { core, sound, hotkey, palette, registerMask, unmask, applyMask, masks, mask, clearErrors, showFieldError, showFormErrors, messages, serializeForm, validate, validator, dialog, prompt, confirm, alert, modal, VoodooCollection, fromHtml, ready2, query, viewTransition, defineComponent, storage, ensurePalette, instances, storeNames, allStores } from './chunk-AH2VXDZD.js';
2
- export { VoodooCollection, alert, allStores, applyMask, cache, clearErrors, clipboard, confirm, cookie, createApp, createResource, defineComponent, dialog, ready as documentReady, enter, fadeIn, fadeOut, fromHtml, hotkey, instances, leave, mask, masks, modal, mountComponent, network, palette, prompt, query, ready2 as ready, registerMask, removeStore, createResource as resource, screen, serializeForm, session, showFormErrors, slideDown, slideUp, sound, efeitos as soundEffects, storage, store, storeNames, theme, toast, unmask, url, validate, validator, viewTransition, whenElement, whenReady } from './chunk-AH2VXDZD.js';
3
- export { gpu, reflectWgsl } from './chunk-KQYSJHZR.js';
4
- import { http } from './chunk-DJJB35SR.js';
5
- export { HttpError, http, request } from './chunk-DJJB35SR.js';
6
- import { devtoolsBus } from './chunk-DCE5WIGA.js';
7
- export { createSocket, devtoolsBus, socket, socketSupported } from './chunk-DCE5WIGA.js';
8
- import { magic, markSkipChildren, onStart, rootScope, findScope, destroy, readAttr, evaluate, parse, Scope, getScope, walk, unwrap, addCleanup, hadDirectives, collectDirectives, getEffectScopes, evaluateIn } from './chunk-H2ZUEQWV.js';
9
- export { Scope, VoodooRuntimeError, VoodooSyntaxError, addCleanup, allowedGlobals, clearParseCache, destroy, evaluate, findScope, getScope, magic, magics, parse, refresh, rootScope, start, stringify, tokenize, walk } from './chunk-H2ZUEQWV.js';
10
- import { reactive, warn, handleError, effect, queuePostFlush, nextTick } from './chunk-WJP3YGUI.js';
11
- export { EffectScope, computed, effect, effectScope, flushSync, isReactive, markRaw, nextTick, reactive, ref, shallowRef, stop, toRaw, unref, watch, watchEffect } from './chunk-WJP3YGUI.js';
12
- import { warnAlias } from './chunk-UV5PMS7P.js';
13
- import { parseDuration, formatNumber, formatCurrency, formatDate, relativeTime, device, setFormatDefaults, uid, merge, escapeHtml, truncate, get, titleCase } from './chunk-IGZSDZKU.js';
14
- export { capitalize, chunk, clone, debounce, device, escapeHtml, formatCurrency, formatDate, formatFileSize, formatNumber, formatPercent, get, groupBy, isBrowser, matchesMedia, memoize, merge, once, parseDuration, random, relativeTime, sample, set, setFormatDefaults, sleep, slugify, sortBy, stripTags, throttle, titleCase, truncate, uid, unique, uuid } from './chunk-IGZSDZKU.js';
15
- import { ensureTokens, injectStyle } from './chunk-V3O3WOZH.js';
16
- export { ensureTokens, injectStyle } from './chunk-V3O3WOZH.js';
17
- import { defineDirective, PRIORITY, config } from './chunk-NFDXVIII.js';
18
- export { PRIORITY, config, defineDirective } from './chunk-NFDXVIII.js';
19
- import './chunk-IS3DR2KY.js';
1
+ import { core, sound, hotkey, palette, registerMask, unmask, applyMask, masks, mask, clearErrors, showFieldError, showFormErrors, messages, serializeForm, validate, validator, dialog, prompt, confirm, alert, modal, VoodooCollection, fromHtml, ready2, query, viewTransition, defineComponent, storage, ensurePalette, instances, storeNames, allStores } from './chunk-RDHYPGH6.js';
2
+ export { VoodooCollection, alert, allStores, applyMask, cache, clearErrors, clipboard, confirm, cookie, createApp, createResource, defineComponent, dialog, ready as documentReady, enter, fadeIn, fadeOut, fromHtml, hotkey, installHooks, instances, leave, mask, masks, modal, mountComponent, network, palette, prompt, query, ready2 as ready, registerMask, removeStore, createResource as resource, screen, serializeForm, session, showFormErrors, slideDown, slideUp, sound, efeitos as soundEffects, storage, store, storeNames, theme, toast, unmask, url, useContext, useEffect, useMemo, useRef, useState, validate, validator, viewTransition, whenElement, whenReady } from './chunk-RDHYPGH6.js';
3
+ export { gpu, reflectWgsl } from './chunk-AFMCDNYS.js';
4
+ import { http } from './chunk-D7675IJG.js';
5
+ export { HttpError, http, request } from './chunk-D7675IJG.js';
6
+ import { devtoolsBus } from './chunk-HNM3CTBD.js';
7
+ export { createSocket, devtoolsBus, socket, socketSupported } from './chunk-HNM3CTBD.js';
8
+ import { magic, markSkipChildren, onStart, rootScope, findScope, destroy, readAttr, evaluate, parse, Scope, getScope, walk, unwrap, addCleanup, hadDirectives, collectDirectives, getEffectScopes, evaluateIn } from './chunk-4M4ZXHNY.js';
9
+ export { Scope, VoodooRuntimeError, VoodooSyntaxError, addCleanup, allowedGlobals, clearParseCache, destroy, evaluate, findScope, getScope, hook, hooks, magic, magics, parse, refresh, rootScope, start, stringify, tokenize, walk } from './chunk-4M4ZXHNY.js';
10
+ import { reactive, warn, handleError, effect, queuePostFlush, nextTick } from './chunk-LLNDLLKV.js';
11
+ export { EffectScope, computed, effect, effectScope, flushSync, isReactive, markRaw, nextTick, reactive, ref, shallowRef, stop, toRaw, unref, watch, watchEffect } from './chunk-LLNDLLKV.js';
12
+ import { warnAlias } from './chunk-72PMUUMT.js';
13
+ import { parseDuration, formatNumber, formatCurrency, formatDate, relativeTime, device, setFormatDefaults, uid, merge, escapeHtml, truncate, get, titleCase } from './chunk-KN7NAKBL.js';
14
+ export { capitalize, chunk, clone, debounce, device, escapeHtml, formatCurrency, formatDate, formatFileSize, formatNumber, formatPercent, get, groupBy, isBrowser, matchesMedia, memoize, merge, once, parseDuration, random, relativeTime, sample, set, setFormatDefaults, sleep, slugify, sortBy, stripTags, throttle, titleCase, truncate, uid, unique, uuid } from './chunk-KN7NAKBL.js';
15
+ import { ensureTokens, injectStyle } from './chunk-NP66JM2P.js';
16
+ export { ensureTokens, injectStyle } from './chunk-NP66JM2P.js';
17
+ import { defineDirective, PRIORITY, config } from './chunk-T5ION5NG.js';
18
+ export { PRIORITY, config, defineDirective } from './chunk-T5ION5NG.js';
19
+ import './chunk-GXPNWCGE.js';
20
20
 
21
21
  /**
22
- * Voodoo.js v0.11.2
22
+ * Voodoo.js v0.12.1
23
23
  * JavaScript feels like magic.
24
24
  * (c) 2026 Voodoo.js contributors. MIT License.
25
25
  */
@@ -241,6 +241,17 @@ type MagicGetter = (scope: Scope) => unknown;
241
241
  declare const magics: Map<string, MagicGetter>;
242
242
  /** Register a magic variable available in any expression. */
243
243
  declare function magic(name: string, getter: MagicGetter): void;
244
+ /**
245
+ * Registry of helpers reached by a bare name, with no `$` in front.
246
+ *
247
+ * Kept apart from `magics` because that one prefixes `$` onto anything missing
248
+ * it, which is the right default for `$store` and the wrong one for `useEffect`.
249
+ * Data in scope still wins: `lookup` walks the scope chain first, so a variable
250
+ * of your own named `useMemo` shadows the hook rather than colliding with it.
251
+ */
252
+ declare const hooks: Map<string, MagicGetter>;
253
+ /** Register a helper callable by bare name inside any expression. */
254
+ declare function hook(name: string, getter: MagicGetter): void;
244
255
  /**
245
256
  * Fields are `declare`d and assigned in the constructor, not initialised at the
246
257
  * declaration.
@@ -1097,86 +1108,86 @@ declare const core: {
1097
1108
  http: {
1098
1109
  defaults: HttpDefaults;
1099
1110
  get<T = unknown>(url: string, options?: {
1100
- params?: Record<string, string | number | boolean | null | undefined> | undefined;
1111
+ responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1101
1112
  headers?: Record<string, string> | undefined;
1113
+ credentials?: RequestCredentials | undefined;
1114
+ signal?: AbortSignal | undefined;
1115
+ params?: Record<string, string | number | boolean | null | undefined> | undefined;
1102
1116
  timeout?: number | undefined;
1103
1117
  retry?: number | undefined;
1104
1118
  retryDelay?: number | undefined;
1105
1119
  retryUnsafe?: boolean | undefined;
1106
1120
  cache?: number | undefined;
1107
- signal?: AbortSignal | undefined;
1108
- credentials?: RequestCredentials | undefined;
1109
- responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1110
1121
  onProgress?: ((loaded: number, total: number) => void) | undefined;
1111
1122
  offlineQueue?: boolean | undefined;
1112
1123
  }): Promise<T>;
1113
1124
  post<T = unknown>(url: string, body?: unknown, options?: {
1114
- params?: Record<string, string | number | boolean | null | undefined> | undefined;
1125
+ responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1115
1126
  headers?: Record<string, string> | undefined;
1127
+ credentials?: RequestCredentials | undefined;
1128
+ signal?: AbortSignal | undefined;
1129
+ params?: Record<string, string | number | boolean | null | undefined> | undefined;
1116
1130
  timeout?: number | undefined;
1117
1131
  retry?: number | undefined;
1118
1132
  retryDelay?: number | undefined;
1119
1133
  retryUnsafe?: boolean | undefined;
1120
1134
  cache?: number | undefined;
1121
- signal?: AbortSignal | undefined;
1122
- credentials?: RequestCredentials | undefined;
1123
- responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1124
1135
  onProgress?: ((loaded: number, total: number) => void) | undefined;
1125
1136
  offlineQueue?: boolean | undefined;
1126
1137
  }): Promise<T>;
1127
1138
  put<T = unknown>(url: string, body?: unknown, options?: {
1128
- params?: Record<string, string | number | boolean | null | undefined> | undefined;
1139
+ responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1129
1140
  headers?: Record<string, string> | undefined;
1141
+ credentials?: RequestCredentials | undefined;
1142
+ signal?: AbortSignal | undefined;
1143
+ params?: Record<string, string | number | boolean | null | undefined> | undefined;
1130
1144
  timeout?: number | undefined;
1131
1145
  retry?: number | undefined;
1132
1146
  retryDelay?: number | undefined;
1133
1147
  retryUnsafe?: boolean | undefined;
1134
1148
  cache?: number | undefined;
1135
- signal?: AbortSignal | undefined;
1136
- credentials?: RequestCredentials | undefined;
1137
- responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1138
1149
  onProgress?: ((loaded: number, total: number) => void) | undefined;
1139
1150
  offlineQueue?: boolean | undefined;
1140
1151
  }): Promise<T>;
1141
1152
  patch<T = unknown>(url: string, body?: unknown, options?: {
1142
- params?: Record<string, string | number | boolean | null | undefined> | undefined;
1153
+ responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1143
1154
  headers?: Record<string, string> | undefined;
1155
+ credentials?: RequestCredentials | undefined;
1156
+ signal?: AbortSignal | undefined;
1157
+ params?: Record<string, string | number | boolean | null | undefined> | undefined;
1144
1158
  timeout?: number | undefined;
1145
1159
  retry?: number | undefined;
1146
1160
  retryDelay?: number | undefined;
1147
1161
  retryUnsafe?: boolean | undefined;
1148
1162
  cache?: number | undefined;
1149
- signal?: AbortSignal | undefined;
1150
- credentials?: RequestCredentials | undefined;
1151
- responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1152
1163
  onProgress?: ((loaded: number, total: number) => void) | undefined;
1153
1164
  offlineQueue?: boolean | undefined;
1154
1165
  }): Promise<T>;
1155
1166
  delete<T = unknown>(url: string, options?: {
1156
- params?: Record<string, string | number | boolean | null | undefined> | undefined;
1167
+ responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1157
1168
  headers?: Record<string, string> | undefined;
1169
+ credentials?: RequestCredentials | undefined;
1170
+ signal?: AbortSignal | undefined;
1171
+ params?: Record<string, string | number | boolean | null | undefined> | undefined;
1158
1172
  timeout?: number | undefined;
1159
1173
  retry?: number | undefined;
1160
1174
  retryDelay?: number | undefined;
1161
1175
  retryUnsafe?: boolean | undefined;
1162
1176
  cache?: number | undefined;
1163
- signal?: AbortSignal | undefined;
1164
- credentials?: RequestCredentials | undefined;
1165
- responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1166
1177
  onProgress?: ((loaded: number, total: number) => void) | undefined;
1167
1178
  offlineQueue?: boolean | undefined;
1168
1179
  }): Promise<T>;
1169
1180
  head(url: string, options?: {
1170
- params?: Record<string, string | number | boolean | null | undefined> | undefined;
1181
+ responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1171
1182
  headers?: Record<string, string> | undefined;
1183
+ credentials?: RequestCredentials | undefined;
1184
+ signal?: AbortSignal | undefined;
1185
+ params?: Record<string, string | number | boolean | null | undefined> | undefined;
1172
1186
  timeout?: number | undefined;
1173
1187
  retry?: number | undefined;
1174
1188
  retryDelay?: number | undefined;
1175
1189
  retryUnsafe?: boolean | undefined;
1176
1190
  cache?: number | undefined;
1177
- signal?: AbortSignal | undefined;
1178
- credentials?: RequestCredentials | undefined;
1179
- responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1180
1191
  onProgress?: ((loaded: number, total: number) => void) | undefined;
1181
1192
  offlineQueue?: boolean | undefined;
1182
1193
  }): Promise<unknown>;
@@ -1192,16 +1203,16 @@ declare const core: {
1192
1203
  error?: (e: Event) => void;
1193
1204
  }): EventSource;
1194
1205
  stream(url: string, onLine: (line: string) => void, options?: {
1195
- params?: Record<string, string | number | boolean | null | undefined> | undefined;
1206
+ responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1196
1207
  headers?: Record<string, string> | undefined;
1208
+ credentials?: RequestCredentials | undefined;
1209
+ signal?: AbortSignal | undefined;
1210
+ params?: Record<string, string | number | boolean | null | undefined> | undefined;
1197
1211
  timeout?: number | undefined;
1198
1212
  retry?: number | undefined;
1199
1213
  retryDelay?: number | undefined;
1200
1214
  retryUnsafe?: boolean | undefined;
1201
1215
  cache?: number | undefined;
1202
- signal?: AbortSignal | undefined;
1203
- credentials?: RequestCredentials | undefined;
1204
- responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1205
1216
  onProgress?: ((loaded: number, total: number) => void) | undefined;
1206
1217
  offlineQueue?: boolean | undefined;
1207
1218
  }): Promise<void>;
@@ -1643,4 +1654,4 @@ declare function ready(fn?: ReadyCallback): Promise<void>;
1643
1654
  /** Creates elements from an HTML string without inserting them in the document. */
1644
1655
  declare function fromHtml(html: string): VoodooCollection;
1645
1656
 
1646
- export { store as $, type App as A, findScope as B, type ComponentDefinition as C, type DirectiveBinding as D, fromHtml as E, getScope as F, injectStyle as G, instances as H, leave as I, magic as J, magics as K, mountComponent as L, parse as M, query as N, ready as O, PRIORITY as P, refresh as Q, type Resource as R, Scope as S, removeStore as T, rootScope as U, VoodooCollection as V, session as W, slideDown as X, slideUp as Y, start as Z, storage as _, type AppOptions as a, storeNames as a0, stringify as a1, theme as a2, toast as a3, tokenize as a4, url as a5, viewTransition as a6, walk as a7, whenElement as a8, whenReady as a9, type DirectiveHooks as b, core as c, type ResourceOptions as d, type VoodooConfig as e, type VoodooPlugin as f, VoodooRuntimeError as g, VoodooSyntaxError as h, addCleanup as i, allStores as j, allowedGlobals as k, cache as l, clearParseCache as m, config as n, cookie as o, createApp as p, createResource as q, defineComponent as r, defineDirective as s, destroy as t, ready$1 as u, ensureTokens as v, enter as w, evaluate as x, fadeIn as y, fadeOut as z };
1657
+ export { start as $, type App as A, findScope as B, type ComponentDefinition as C, type DirectiveBinding as D, fromHtml as E, getScope as F, hook as G, hooks as H, injectStyle as I, instances as J, leave as K, magic as L, magics as M, mountComponent as N, parse as O, PRIORITY as P, query as Q, type Resource as R, Scope as S, ready as T, refresh as U, VoodooCollection as V, removeStore as W, rootScope as X, session as Y, slideDown as Z, slideUp as _, type AppOptions as a, storage as a0, store as a1, storeNames as a2, stringify as a3, theme as a4, toast as a5, tokenize as a6, url as a7, viewTransition as a8, walk as a9, whenElement as aa, whenReady as ab, type DirectiveHooks as b, core as c, type ResourceOptions as d, type VoodooConfig as e, type VoodooPlugin as f, VoodooRuntimeError as g, VoodooSyntaxError as h, addCleanup as i, allStores as j, allowedGlobals as k, cache as l, clearParseCache as m, config as n, cookie as o, createApp as p, createResource as q, defineComponent as r, defineDirective as s, destroy as t, ready$1 as u, ensureTokens as v, enter as w, evaluate as x, fadeIn as y, fadeOut as z };
@@ -241,6 +241,17 @@ type MagicGetter = (scope: Scope) => unknown;
241
241
  declare const magics: Map<string, MagicGetter>;
242
242
  /** Register a magic variable available in any expression. */
243
243
  declare function magic(name: string, getter: MagicGetter): void;
244
+ /**
245
+ * Registry of helpers reached by a bare name, with no `$` in front.
246
+ *
247
+ * Kept apart from `magics` because that one prefixes `$` onto anything missing
248
+ * it, which is the right default for `$store` and the wrong one for `useEffect`.
249
+ * Data in scope still wins: `lookup` walks the scope chain first, so a variable
250
+ * of your own named `useMemo` shadows the hook rather than colliding with it.
251
+ */
252
+ declare const hooks: Map<string, MagicGetter>;
253
+ /** Register a helper callable by bare name inside any expression. */
254
+ declare function hook(name: string, getter: MagicGetter): void;
244
255
  /**
245
256
  * Fields are `declare`d and assigned in the constructor, not initialised at the
246
257
  * declaration.
@@ -1097,86 +1108,86 @@ declare const core: {
1097
1108
  http: {
1098
1109
  defaults: HttpDefaults;
1099
1110
  get<T = unknown>(url: string, options?: {
1100
- params?: Record<string, string | number | boolean | null | undefined> | undefined;
1111
+ responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1101
1112
  headers?: Record<string, string> | undefined;
1113
+ credentials?: RequestCredentials | undefined;
1114
+ signal?: AbortSignal | undefined;
1115
+ params?: Record<string, string | number | boolean | null | undefined> | undefined;
1102
1116
  timeout?: number | undefined;
1103
1117
  retry?: number | undefined;
1104
1118
  retryDelay?: number | undefined;
1105
1119
  retryUnsafe?: boolean | undefined;
1106
1120
  cache?: number | undefined;
1107
- signal?: AbortSignal | undefined;
1108
- credentials?: RequestCredentials | undefined;
1109
- responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1110
1121
  onProgress?: ((loaded: number, total: number) => void) | undefined;
1111
1122
  offlineQueue?: boolean | undefined;
1112
1123
  }): Promise<T>;
1113
1124
  post<T = unknown>(url: string, body?: unknown, options?: {
1114
- params?: Record<string, string | number | boolean | null | undefined> | undefined;
1125
+ responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1115
1126
  headers?: Record<string, string> | undefined;
1127
+ credentials?: RequestCredentials | undefined;
1128
+ signal?: AbortSignal | undefined;
1129
+ params?: Record<string, string | number | boolean | null | undefined> | undefined;
1116
1130
  timeout?: number | undefined;
1117
1131
  retry?: number | undefined;
1118
1132
  retryDelay?: number | undefined;
1119
1133
  retryUnsafe?: boolean | undefined;
1120
1134
  cache?: number | undefined;
1121
- signal?: AbortSignal | undefined;
1122
- credentials?: RequestCredentials | undefined;
1123
- responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1124
1135
  onProgress?: ((loaded: number, total: number) => void) | undefined;
1125
1136
  offlineQueue?: boolean | undefined;
1126
1137
  }): Promise<T>;
1127
1138
  put<T = unknown>(url: string, body?: unknown, options?: {
1128
- params?: Record<string, string | number | boolean | null | undefined> | undefined;
1139
+ responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1129
1140
  headers?: Record<string, string> | undefined;
1141
+ credentials?: RequestCredentials | undefined;
1142
+ signal?: AbortSignal | undefined;
1143
+ params?: Record<string, string | number | boolean | null | undefined> | undefined;
1130
1144
  timeout?: number | undefined;
1131
1145
  retry?: number | undefined;
1132
1146
  retryDelay?: number | undefined;
1133
1147
  retryUnsafe?: boolean | undefined;
1134
1148
  cache?: number | undefined;
1135
- signal?: AbortSignal | undefined;
1136
- credentials?: RequestCredentials | undefined;
1137
- responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1138
1149
  onProgress?: ((loaded: number, total: number) => void) | undefined;
1139
1150
  offlineQueue?: boolean | undefined;
1140
1151
  }): Promise<T>;
1141
1152
  patch<T = unknown>(url: string, body?: unknown, options?: {
1142
- params?: Record<string, string | number | boolean | null | undefined> | undefined;
1153
+ responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1143
1154
  headers?: Record<string, string> | undefined;
1155
+ credentials?: RequestCredentials | undefined;
1156
+ signal?: AbortSignal | undefined;
1157
+ params?: Record<string, string | number | boolean | null | undefined> | undefined;
1144
1158
  timeout?: number | undefined;
1145
1159
  retry?: number | undefined;
1146
1160
  retryDelay?: number | undefined;
1147
1161
  retryUnsafe?: boolean | undefined;
1148
1162
  cache?: number | undefined;
1149
- signal?: AbortSignal | undefined;
1150
- credentials?: RequestCredentials | undefined;
1151
- responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1152
1163
  onProgress?: ((loaded: number, total: number) => void) | undefined;
1153
1164
  offlineQueue?: boolean | undefined;
1154
1165
  }): Promise<T>;
1155
1166
  delete<T = unknown>(url: string, options?: {
1156
- params?: Record<string, string | number | boolean | null | undefined> | undefined;
1167
+ responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1157
1168
  headers?: Record<string, string> | undefined;
1169
+ credentials?: RequestCredentials | undefined;
1170
+ signal?: AbortSignal | undefined;
1171
+ params?: Record<string, string | number | boolean | null | undefined> | undefined;
1158
1172
  timeout?: number | undefined;
1159
1173
  retry?: number | undefined;
1160
1174
  retryDelay?: number | undefined;
1161
1175
  retryUnsafe?: boolean | undefined;
1162
1176
  cache?: number | undefined;
1163
- signal?: AbortSignal | undefined;
1164
- credentials?: RequestCredentials | undefined;
1165
- responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1166
1177
  onProgress?: ((loaded: number, total: number) => void) | undefined;
1167
1178
  offlineQueue?: boolean | undefined;
1168
1179
  }): Promise<T>;
1169
1180
  head(url: string, options?: {
1170
- params?: Record<string, string | number | boolean | null | undefined> | undefined;
1181
+ responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1171
1182
  headers?: Record<string, string> | undefined;
1183
+ credentials?: RequestCredentials | undefined;
1184
+ signal?: AbortSignal | undefined;
1185
+ params?: Record<string, string | number | boolean | null | undefined> | undefined;
1172
1186
  timeout?: number | undefined;
1173
1187
  retry?: number | undefined;
1174
1188
  retryDelay?: number | undefined;
1175
1189
  retryUnsafe?: boolean | undefined;
1176
1190
  cache?: number | undefined;
1177
- signal?: AbortSignal | undefined;
1178
- credentials?: RequestCredentials | undefined;
1179
- responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1180
1191
  onProgress?: ((loaded: number, total: number) => void) | undefined;
1181
1192
  offlineQueue?: boolean | undefined;
1182
1193
  }): Promise<unknown>;
@@ -1192,16 +1203,16 @@ declare const core: {
1192
1203
  error?: (e: Event) => void;
1193
1204
  }): EventSource;
1194
1205
  stream(url: string, onLine: (line: string) => void, options?: {
1195
- params?: Record<string, string | number | boolean | null | undefined> | undefined;
1206
+ responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1196
1207
  headers?: Record<string, string> | undefined;
1208
+ credentials?: RequestCredentials | undefined;
1209
+ signal?: AbortSignal | undefined;
1210
+ params?: Record<string, string | number | boolean | null | undefined> | undefined;
1197
1211
  timeout?: number | undefined;
1198
1212
  retry?: number | undefined;
1199
1213
  retryDelay?: number | undefined;
1200
1214
  retryUnsafe?: boolean | undefined;
1201
1215
  cache?: number | undefined;
1202
- signal?: AbortSignal | undefined;
1203
- credentials?: RequestCredentials | undefined;
1204
- responseType?: "auto" | "json" | "text" | "blob" | "arrayBuffer" | "formData" | undefined;
1205
1216
  onProgress?: ((loaded: number, total: number) => void) | undefined;
1206
1217
  offlineQueue?: boolean | undefined;
1207
1218
  }): Promise<void>;
@@ -1643,4 +1654,4 @@ declare function ready(fn?: ReadyCallback): Promise<void>;
1643
1654
  /** Creates elements from an HTML string without inserting them in the document. */
1644
1655
  declare function fromHtml(html: string): VoodooCollection;
1645
1656
 
1646
- export { store as $, type App as A, findScope as B, type ComponentDefinition as C, type DirectiveBinding as D, fromHtml as E, getScope as F, injectStyle as G, instances as H, leave as I, magic as J, magics as K, mountComponent as L, parse as M, query as N, ready as O, PRIORITY as P, refresh as Q, type Resource as R, Scope as S, removeStore as T, rootScope as U, VoodooCollection as V, session as W, slideDown as X, slideUp as Y, start as Z, storage as _, type AppOptions as a, storeNames as a0, stringify as a1, theme as a2, toast as a3, tokenize as a4, url as a5, viewTransition as a6, walk as a7, whenElement as a8, whenReady as a9, type DirectiveHooks as b, core as c, type ResourceOptions as d, type VoodooConfig as e, type VoodooPlugin as f, VoodooRuntimeError as g, VoodooSyntaxError as h, addCleanup as i, allStores as j, allowedGlobals as k, cache as l, clearParseCache as m, config as n, cookie as o, createApp as p, createResource as q, defineComponent as r, defineDirective as s, destroy as t, ready$1 as u, ensureTokens as v, enter as w, evaluate as x, fadeIn as y, fadeOut as z };
1657
+ export { start as $, type App as A, findScope as B, type ComponentDefinition as C, type DirectiveBinding as D, fromHtml as E, getScope as F, hook as G, hooks as H, injectStyle as I, instances as J, leave as K, magic as L, magics as M, mountComponent as N, parse as O, PRIORITY as P, query as Q, type Resource as R, Scope as S, ready as T, refresh as U, VoodooCollection as V, removeStore as W, rootScope as X, session as Y, slideDown as Z, slideUp as _, type AppOptions as a, storage as a0, store as a1, storeNames as a2, stringify as a3, theme as a4, toast as a5, tokenize as a6, url as a7, viewTransition as a8, walk as a9, whenElement as aa, whenReady as ab, type DirectiveHooks as b, core as c, type ResourceOptions as d, type VoodooConfig as e, type VoodooPlugin as f, VoodooRuntimeError as g, VoodooSyntaxError as h, addCleanup as i, allStores as j, allowedGlobals as k, cache as l, clearParseCache as m, config as n, cookie as o, createApp as p, createResource as q, defineComponent as r, defineDirective as s, destroy as t, ready$1 as u, ensureTokens as v, enter as w, evaluate as x, fadeIn as y, fadeOut as z };
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  /**
4
- * Voodoo.js v0.11.2
4
+ * Voodoo.js v0.12.1
5
5
  * JavaScript feels like magic.
6
6
  * (c) 2026 Voodoo.js contributors. MIT License.
7
7
  */
@@ -1,4 +1,4 @@
1
- export { EffectScope, ITERATE_KEY, ReactiveEffect, TriggerType, computed, effect, effectScope, enableTracking, flushSync, getActiveEffect, getActiveScope, handleError, hasChanged, isReactive, isRef, markRaw, nextTick, pauseTracking, queueJob, queuePostFlush, reactive, ref, resetTracking, setErrorHandler, shallowRef, stop, toRaw, track, trigger, unref, warn, watch, watchEffect } from './chunk-WJP3YGUI.js';
2
- import './chunk-IS3DR2KY.js';
1
+ export { EffectScope, ITERATE_KEY, ReactiveEffect, TriggerType, computed, effect, effectScope, enableTracking, flushSync, getActiveEffect, getActiveScope, handleError, hasChanged, isReactive, isRef, markRaw, nextTick, pauseTracking, queueJob, queuePostFlush, reactive, ref, resetTracking, setErrorHandler, shallowRef, stop, toRaw, track, trigger, unref, warn, watch, watchEffect } from './chunk-LLNDLLKV.js';
2
+ import './chunk-GXPNWCGE.js';
3
3
  //# sourceMappingURL=reactivity.js.map
4
4
  //# sourceMappingURL=reactivity.js.map
package/dist/socket.cjs CHANGED
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  /**
6
- * Voodoo.js v0.11.2
6
+ * Voodoo.js v0.12.1
7
7
  * JavaScript feels like magic.
8
8
  * (c) 2026 Voodoo.js contributors. MIT License.
9
9
  */
package/dist/socket.js CHANGED
@@ -1,14 +1,14 @@
1
- import { socketSupported, createSocket, socket } from './chunk-DCE5WIGA.js';
2
- export { ENGINE, SIO, createSocket, decodeEngine, decodeSocketIo, encodeSocketIo, engineURL, resolveSocketURL, socket, socketSupported } from './chunk-DCE5WIGA.js';
3
- import { evaluateIn, readAttr } from './chunk-H2ZUEQWV.js';
4
- import { reactive } from './chunk-WJP3YGUI.js';
5
- import { warnAlias } from './chunk-UV5PMS7P.js';
6
- import { parseDuration } from './chunk-IGZSDZKU.js';
7
- import { defineDirective, PRIORITY, config } from './chunk-NFDXVIII.js';
8
- import './chunk-IS3DR2KY.js';
1
+ import { socketSupported, createSocket, socket } from './chunk-HNM3CTBD.js';
2
+ export { ENGINE, SIO, createSocket, decodeEngine, decodeSocketIo, encodeSocketIo, engineURL, resolveSocketURL, socket, socketSupported } from './chunk-HNM3CTBD.js';
3
+ import { evaluateIn, readAttr } from './chunk-4M4ZXHNY.js';
4
+ import { reactive } from './chunk-LLNDLLKV.js';
5
+ import { warnAlias } from './chunk-72PMUUMT.js';
6
+ import { parseDuration } from './chunk-KN7NAKBL.js';
7
+ import { defineDirective, PRIORITY, config } from './chunk-T5ION5NG.js';
8
+ import './chunk-GXPNWCGE.js';
9
9
 
10
10
  /**
11
- * Voodoo.js v0.11.2
11
+ * Voodoo.js v0.12.1
12
12
  * JavaScript feels like magic.
13
13
  * (c) 2026 Voodoo.js contributors. MIT License.
14
14
  */
@@ -0,0 +1,5 @@
1
+ export { BASE_TOKENS, ensureTokens, injectStyle } from './chunk-NP66JM2P.js';
2
+ import './chunk-T5ION5NG.js';
3
+ import './chunk-GXPNWCGE.js';
4
+ //# sourceMappingURL=style-GR4X6O7I.js.map
5
+ //# sourceMappingURL=style-GR4X6O7I.js.map
package/dist/utils.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  /**
4
- * Voodoo.js v0.11.2
4
+ * Voodoo.js v0.12.1
5
5
  * JavaScript feels like magic.
6
6
  * (c) 2026 Voodoo.js contributors. MIT License.
7
7
  */
package/dist/utils.js CHANGED
@@ -1,4 +1,4 @@
1
- export { capitalize, chunk, clone, debounce, device, escapeHtml, formatCurrency, formatDate, formatFileSize, formatNumber, formatPercent, get, groupBy, isBrowser, matchesMedia, memoize, merge, once, parseDuration, random, relativeTime, sample, set, setFormatDefaults, sleep, slugify, sortBy, stripTags, throttle, titleCase, truncate, uid, unique, uuid } from './chunk-IGZSDZKU.js';
2
- import './chunk-IS3DR2KY.js';
1
+ export { capitalize, chunk, clone, debounce, device, escapeHtml, formatCurrency, formatDate, formatFileSize, formatNumber, formatPercent, get, groupBy, isBrowser, matchesMedia, memoize, merge, once, parseDuration, random, relativeTime, sample, set, setFormatDefaults, sleep, slugify, sortBy, stripTags, throttle, titleCase, truncate, uid, unique, uuid } from './chunk-KN7NAKBL.js';
2
+ import './chunk-GXPNWCGE.js';
3
3
  //# sourceMappingURL=utils.js.map
4
4
  //# sourceMappingURL=utils.js.map