@signality/core 0.1.1 → 0.1.3
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/browser/file-dialog/index.d.ts +5 -3
- package/browser/storage/index.d.ts +1 -1
- package/browser/text-selection/index.d.ts +9 -2
- package/elements/element-focus/index.d.ts +12 -8
- package/fesm2022/signality-core-browser-clipboard.mjs +2 -1
- package/fesm2022/signality-core-browser-clipboard.mjs.map +1 -1
- package/fesm2022/signality-core-browser-favicon.mjs +1 -1
- package/fesm2022/signality-core-browser-favicon.mjs.map +1 -1
- package/fesm2022/signality-core-browser-file-dialog.mjs +3 -2
- package/fesm2022/signality-core-browser-file-dialog.mjs.map +1 -1
- package/fesm2022/signality-core-browser-fullscreen.mjs +2 -1
- package/fesm2022/signality-core-browser-fullscreen.mjs.map +1 -1
- package/fesm2022/signality-core-browser-listener.mjs +2 -1
- package/fesm2022/signality-core-browser-listener.mjs.map +1 -1
- package/fesm2022/signality-core-browser-media-query.mjs +2 -1
- package/fesm2022/signality-core-browser-media-query.mjs.map +1 -1
- package/fesm2022/signality-core-browser-picture-in-picture.mjs +2 -1
- package/fesm2022/signality-core-browser-picture-in-picture.mjs.map +1 -1
- package/fesm2022/signality-core-browser-speech-recognition.mjs +2 -1
- package/fesm2022/signality-core-browser-speech-recognition.mjs.map +1 -1
- package/fesm2022/signality-core-browser-speech-synthesis.mjs +2 -1
- package/fesm2022/signality-core-browser-speech-synthesis.mjs.map +1 -1
- package/fesm2022/signality-core-browser-storage.mjs +40 -45
- package/fesm2022/signality-core-browser-storage.mjs.map +1 -1
- package/fesm2022/signality-core-browser-text-direction.mjs +2 -1
- package/fesm2022/signality-core-browser-text-direction.mjs.map +1 -1
- package/fesm2022/signality-core-browser-text-selection.mjs +36 -4
- package/fesm2022/signality-core-browser-text-selection.mjs.map +1 -1
- package/fesm2022/signality-core-browser-vibration.mjs +2 -1
- package/fesm2022/signality-core-browser-vibration.mjs.map +1 -1
- package/fesm2022/signality-core-browser-web-notification.mjs +2 -1
- package/fesm2022/signality-core-browser-web-notification.mjs.map +1 -1
- package/fesm2022/signality-core-browser-web-worker.mjs +2 -1
- package/fesm2022/signality-core-browser-web-worker.mjs.map +1 -1
- package/fesm2022/signality-core-elements-dropzone.mjs +2 -1
- package/fesm2022/signality-core-elements-dropzone.mjs.map +1 -1
- package/fesm2022/signality-core-elements-element-focus-within.mjs +2 -1
- package/fesm2022/signality-core-elements-element-focus-within.mjs.map +1 -1
- package/fesm2022/signality-core-elements-element-focus.mjs +24 -10
- package/fesm2022/signality-core-elements-element-focus.mjs.map +1 -1
- package/fesm2022/signality-core-elements-element-size.mjs +3 -2
- package/fesm2022/signality-core-elements-element-size.mjs.map +1 -1
- package/fesm2022/signality-core-elements-element-visibility.mjs +2 -6
- package/fesm2022/signality-core-elements-element-visibility.mjs.map +1 -1
- package/fesm2022/signality-core-elements-on-click-outside.mjs +2 -1
- package/fesm2022/signality-core-elements-on-click-outside.mjs.map +1 -1
- package/fesm2022/signality-core-elements-on-disconnect.mjs +2 -1
- package/fesm2022/signality-core-elements-on-disconnect.mjs.map +1 -1
- package/fesm2022/signality-core-elements-on-long-press.mjs +2 -1
- package/fesm2022/signality-core-elements-on-long-press.mjs.map +1 -1
- package/fesm2022/signality-core-elements-scroll-position.mjs +2 -1
- package/fesm2022/signality-core-elements-scroll-position.mjs.map +1 -1
- package/fesm2022/signality-core-internal.mjs +2 -26
- package/fesm2022/signality-core-internal.mjs.map +1 -1
- package/fesm2022/signality-core-observers-intersection-observer.mjs +2 -1
- package/fesm2022/signality-core-observers-intersection-observer.mjs.map +1 -1
- package/fesm2022/signality-core-observers-mutation-observer.mjs +2 -1
- package/fesm2022/signality-core-observers-mutation-observer.mjs.map +1 -1
- package/fesm2022/signality-core-observers-resize-observer.mjs +2 -1
- package/fesm2022/signality-core-observers-resize-observer.mjs.map +1 -1
- package/fesm2022/signality-core-reactivity-debounced.mjs +2 -1
- package/fesm2022/signality-core-reactivity-debounced.mjs.map +1 -1
- package/fesm2022/signality-core-reactivity-throttled.mjs +2 -1
- package/fesm2022/signality-core-reactivity-throttled.mjs.map +1 -1
- package/fesm2022/signality-core-scheduling-debounce-callback.mjs +2 -1
- package/fesm2022/signality-core-scheduling-debounce-callback.mjs.map +1 -1
- package/fesm2022/signality-core-scheduling-interval.mjs +2 -1
- package/fesm2022/signality-core-scheduling-interval.mjs.map +1 -1
- package/fesm2022/signality-core-scheduling-throttle-callback.mjs +2 -1
- package/fesm2022/signality-core-scheduling-throttle-callback.mjs.map +1 -1
- package/fesm2022/signality-core-utilities.mjs +64 -0
- package/fesm2022/signality-core-utilities.mjs.map +1 -0
- package/fesm2022/signality-core.mjs +1 -0
- package/fesm2022/signality-core.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/internal/utils/index.d.ts +0 -2
- package/package.json +9 -5
- package/utilities/generate-id.d.ts +29 -0
- package/utilities/index.d.ts +3 -0
- /package/{internal/utils → utilities}/to-element.d.ts +0 -0
- /package/{internal/utils → utilities}/to-value.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signality-core-internal.mjs","sources":["../../../projects/core/internal/constants/mobile-regex.ts","../../../projects/core/internal/constants/stubs.ts","../../../projects/core/internal/providers/is-browser.ts","../../../projects/core/internal/providers/is-mobile.ts","../../../projects/core/internal/providers/is-server.ts","../../../projects/core/internal/utils/bom/is-window.ts","../../../projects/core/internal/utils/dom/get-active-element.ts","../../../projects/core/internal/utils/dom/get-event-target.ts","../../../projects/core/internal/utils/dom/get-pip-element.ts","../../../projects/core/internal/utils/dom/get-shadow-root.ts","../../../projects/core/internal/utils/dom/is-element.ts","../../../projects/core/internal/utils/dom/is-event-target.ts","../../../projects/core/internal/utils/dom/is-node-within.ts","../../../projects/core/internal/utils/assert.ts","../../../projects/core/internal/utils/context.ts","../../../projects/core/internal/utils/create-token.ts","../../../projects/core/internal/utils/is-query-signal.ts","../../../projects/core/internal/utils/is-plain-object.ts","../../../projects/core/internal/utils/const-signal.ts","../../../projects/core/internal/utils/proxy-signal.ts","../../../projects/core/internal/utils/to-value.ts","../../../projects/core/internal/utils/unref-element.ts","../../../projects/core/internal/utils/to-element.ts","../../../projects/core/internal/utils/files/is-accepted-file.ts","../../../projects/core/internal/signality-core-internal.ts"],"sourcesContent":["export const MOBILE_REGEX = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;\n","/**\n * Empty synchronous function stub.\n * Used for SSR compatibility when returning method functions in Ref objects that should do nothing on the server.\n *\n * Example: `close: NOOP_FN` in {@link WebNotificationRef}\n */\nexport const NOOP_FN: (...args: any[]) => void = () => {\n /* empty */\n};\n\n/**\n * Empty asynchronous function stub that returns a resolved Promise.\n * Used for SSR compatibility when returning async method functions in Ref objects that should do nothing on the server.\n *\n * Example: `share: NOOP_ASYNC_FN` in {@link WebShareRef}\n */\nexport const NOOP_ASYNC_FN = () => Promise.resolve();\n\n/**\n * Frozen EffectRef stub with a no-op destroy method.\n * Used for SSR compatibility when returning EffectRef from observer utilities (ResizeObserver, MutationObserver, etc.)\n * that cannot run on the server. Prevents errors when calling destroy() on server-rendered refs.\n *\n * Example: `return NOOP_EFFECT_REF` in {@link resizeObserver}\n */\nexport const NOOP_EFFECT_REF = { destroy: NOOP_FN };\n\n/**\n * Equality function that always returns false, forcing signal updates on every change.\n * Used for signals that hold mutable objects (like Selection, Range) where reference equality is not sufficient\n * and we need to detect changes even when the object structure appears the same.\n *\n * Example: `signal<Selection | null>(null, { equal: ALWAYS_FALSE_FN })` in {@link textSelection}\n */\nexport const ALWAYS_FALSE_FN = () => false;\n","import { inject, InjectionToken, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\nexport const IS_BROWSER = new InjectionToken<boolean>(ngDevMode ? 'IS_BROWSER' : '', {\n providedIn: 'platform',\n factory: () => isPlatformBrowser(inject(PLATFORM_ID)),\n});\n","import { inject, InjectionToken } from '@angular/core';\nimport { MOBILE_REGEX } from '../constants';\nimport { IS_BROWSER } from './is-browser';\n\nexport const IS_MOBILE = new InjectionToken<boolean>(ngDevMode ? 'IS_MOBILE' : '', {\n providedIn: 'platform',\n factory: () => {\n return inject(IS_BROWSER) ? MOBILE_REGEX.test(navigator.userAgent) : false;\n },\n});\n","import { inject, InjectionToken, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\n\nexport const IS_SERVER = new InjectionToken<boolean>(ngDevMode ? 'IS_SERVER' : '', {\n providedIn: 'platform',\n factory: () => isPlatformServer(inject(PLATFORM_ID)),\n});\n","export function isWindow(obj: object | null): obj is Window {\n return !!obj && (obj as Window).window === obj;\n}\n","export function getActiveElement(document: Document): Element | null {\n let activeElement = document.activeElement;\n\n while (activeElement && activeElement.shadowRoot) {\n const newActiveElement = activeElement.shadowRoot.activeElement;\n if (newActiveElement === activeElement) {\n break;\n } else {\n activeElement = newActiveElement;\n }\n }\n\n return activeElement;\n}\n","export function getEventTarget<T extends EventTarget>(event: Event): T | null {\n return (event.composedPath ? event.composedPath()[0] : event.target) as T | null;\n}\n","export function getPipElement(document: Document): Element | null {\n let pipElement = document.pictureInPictureElement;\n\n while (pipElement && pipElement.shadowRoot) {\n const newPipElement = pipElement.shadowRoot.pictureInPictureElement;\n if (newPipElement === pipElement) {\n break;\n } else {\n pipElement = newPipElement;\n }\n }\n\n return pipElement;\n}\n","export function getShadowRoot(element: Element | null): ShadowRoot | null {\n const rootNode = element?.getRootNode ? element.getRootNode() : null;\n\n if (rootNode instanceof ShadowRoot) {\n return rootNode;\n }\n\n return null;\n}\n","export function isElement(value: unknown): value is Element {\n return !!value && (value as Element).nodeType === Node.ELEMENT_NODE;\n}\n","export function isEventTarget(value: unknown): value is EventTarget {\n return typeof (value as EventTarget)?.addEventListener === 'function';\n}\n","export function isNodeWithin(node: Node, root: Element): boolean {\n return root === node || root.contains(node) || (root.shadowRoot?.contains(node) ?? false);\n}\n","import { isElement, isEventTarget } from './dom';\n\nexport function assertElement(value: unknown, source: string): asserts value is Element {\n if (!isElement(value)) {\n throw new Error(\n `[${source}] Expected a DOM Element, ElementRef but received: ${\n (value as object).constructor?.name ?? typeof value\n }. ` +\n `If you are using viewChild/contentChild, make sure to specify \"{ read: ElementRef }\" to avoid implicit directive references.`\n );\n }\n}\n\nexport function assertEventTarget(value: unknown, source: string): asserts value is EventTarget {\n if (!isEventTarget(value)) {\n throw new Error(\n `[${source}] Expected an EventTarget (e.g. window, DOM Element, ElementRef), but received: ${\n (value as object).constructor?.name ?? typeof value\n }. ` +\n `If you are using viewChild/contentChild, specify \"{ read: ElementRef }\" to avoid implicit directive references.`\n );\n }\n}\n","import {\n assertInInjectionContext,\n DestroyRef,\n inject,\n type Injector,\n INJECTOR,\n isSignal,\n runInInjectionContext,\n type Signal,\n untracked,\n} from '@angular/core';\nimport { SIGNAL, type SignalNode } from '@angular/core/primitives/signals';\nimport { IS_BROWSER, IS_MOBILE, IS_SERVER } from '../providers';\n\nexport interface ContextRef {\n readonly injector: Injector;\n readonly isServer: boolean;\n readonly isBrowser: boolean;\n readonly isMobile: boolean;\n readonly onCleanup: (cleanupFn: () => void) => void;\n}\n\nexport interface SetupContextRef {\n runInContext<T>(fn: (context: ContextRef) => T): T;\n}\n\n/**\n * @internal\n *\n * @param injector - injector to use for context\n * @param debugFn - context owner function\n */\nexport function setupContext(\n injector?: Injector,\n debugFn?: (...args: any[]) => any\n): SetupContextRef {\n if (typeof ngDevMode !== 'undefined' && ngDevMode && !injector) {\n assertInInjectionContext(debugFn || setupContext);\n }\n\n const ctxInjector = injector || inject(INJECTOR);\n\n return {\n runInContext<T>(fn: (context: ContextRef) => T): T {\n return runInContextImpl(fn, ctxInjector, debugFn || setupContext);\n },\n };\n}\n\nfunction runInContextImpl<T>(\n fn: (context: ContextRef) => T,\n injector: Injector,\n debugFn: (...args: any[]) => any\n): T {\n const result = runInInjectionContext(injector, () => {\n const isBrowser = inject(IS_BROWSER);\n const isServer = inject(IS_SERVER);\n const isMobile = inject(IS_MOBILE);\n const destroyRef = inject(DestroyRef);\n\n const onCleanup = (cleanupFn: () => void) => {\n destroyRef.onDestroy(cleanupFn);\n };\n\n return untracked(() => fn({ injector, isBrowser, isServer, isMobile, onCleanup }));\n });\n\n if (typeof ngDevMode !== 'undefined' && ngDevMode && result != null) {\n setupDebugInfo(result, debugFn);\n }\n\n return result;\n}\n\nfunction setupDebugInfo<T>(value: T, debugFn: (...args: any[]) => any): T {\n if (isSignal(value)) {\n setDebugName(value, debugFn);\n } else if (value && typeof value === 'object') {\n for (const [postfix, maybeSignal] of Object.entries(value)) {\n if (isSignal(maybeSignal)) {\n setDebugName(maybeSignal, debugFn, postfix);\n }\n }\n }\n\n return value;\n}\n\nfunction setDebugName(\n signal: Signal<unknown>,\n debugFn: (...args: any[]) => any,\n postfix?: string\n): void {\n const node = signal[SIGNAL] as SignalNode<unknown>;\n\n if (node.debugName === undefined) {\n node.debugName = debugFn.name + (postfix ? '.' + postfix : '');\n }\n}\n","import { InjectionToken, type ProviderToken } from '@angular/core';\n\n/**\n * Creates an Angular InjectionToken with a factory function.\n * @internal\n */\nexport function createToken<T>(\n factory: () => T,\n providedIn: ProvidedIn = 'root'\n): ProviderToken<T> {\n return new InjectionToken(ngDevMode ? factory.name : '', { factory, providedIn });\n}\n\ntype ProvidedIn = NonNullable<ConstructorParameters<typeof InjectionToken>[1]>['providedIn'];\n","import { isSignal, type Signal } from '@angular/core';\nimport { SIGNAL } from '@angular/core/primitives/signals';\n\n/**\n * Determines if a signal is a query signal (viewChild, contentChild).\n * Query signals have a special internal structure with a `_dirtyCounter` property that tracks\n * when query results change.\n\n * See: https://github.com/angular/angular/blob/main/packages/core/src/render3/queries/query_reactive.ts#L43\n * @internal\n */\nexport function isQuerySignal(val: unknown): val is Signal<unknown> {\n if (!isSignal(val)) {\n return false;\n }\n\n const node = val[SIGNAL] as object;\n return '_dirtyCounter' in node;\n}\n","export function isPlainObject(value: unknown): value is Record<PropertyKey, unknown> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === null || prototype === Object.prototype;\n}\n","import type { Signal } from '@angular/core';\nimport {\n SIGNAL,\n SIGNAL_NODE,\n type SignalGetter,\n type SignalNode,\n} from '@angular/core/primitives/signals';\n\n/***\n * Creates a lightweight, readonly signal.\n * This is primarily used to provide fallback values for states that cannot be\n * computed in the current environment. For example:\n * - During SSR where browser-only APIs are unavailable\n * - In environments that lack support for specific APIs\n * @internal\n */\nexport function constSignal<T>(value: T): Signal<T> {\n const node: SignalNode<T> = Object.create(SIGNAL_NODE);\n node.value = value;\n\n const getter = (() => node.value) as SignalGetter<T>;\n (getter as any)[SIGNAL] = node;\n\n if (typeof ngDevMode !== 'undefined' && ngDevMode) {\n const debugName = node.debugName ? ' (' + node.debugName + ')' : '';\n getter.toString = () => `[Signal${debugName}: ${String(node.value)}]`;\n }\n\n return getter;\n}\n","import { type Signal, untracked, type WritableSignal } from '@angular/core';\nimport { SIGNAL, type SignalNode } from '@angular/core/primitives/signals';\n\n/**\n * @internal\n */\nexport interface SignalProxyHandler<T> {\n get?(source: Signal<T>): T;\n set?(value: T, source: WritableSignal<T>): void;\n}\n\n/**\n * Creates a proxy wrapper around a {@link Signal}\n * @internal\n */\nexport function proxySignal<T>(\n source: Signal<T>,\n handler: Omit<SignalProxyHandler<T>, 'set'>\n): Signal<T>;\n\n/**\n * Creates a proxy wrapper around a {@link WritableSignal}\n * @internal\n */\nexport function proxySignal<T>(\n source: WritableSignal<T>,\n handler: SignalProxyHandler<T>\n): WritableSignal<T>;\n\nexport function proxySignal<T>(\n source: Signal<T> | WritableSignal<T>,\n handler: SignalProxyHandler<T>\n): Signal<T> | WritableSignal<T> {\n const node = source[SIGNAL] as SignalNode<T>;\n const isWritable = 'set' in source && typeof source.set === 'function';\n\n const proxy = (handler.get ? () => handler.get!(source) : () => source()) as Signal<T>;\n\n proxy[SIGNAL] = node;\n\n // @TODO: consider (original toString internally reads from the original getter, bypassing the proxy)\n proxy.toString = source.toString;\n\n if (isWritable) {\n const set = handler.set\n ? (value: T) => untracked(() => handler.set!(value, source))\n : (value: T) => source.set(value);\n\n const update = (updater: (current: T) => T) => set(updater(node.value));\n\n (proxy as WritableSignal<T>).set = set;\n (proxy as WritableSignal<T>).update = update;\n (proxy as WritableSignal<T>).asReadonly = () => {\n const getter = source.asReadonly();\n return proxySignal(getter, { get: handler.get?.bind(handler) });\n };\n }\n\n return proxy;\n}\n","import { isSignal, untracked as _untracked } from '@angular/core';\nimport type { MaybeSignal } from '@signality/core/types';\n\nexport interface ToValueFn {\n <T>(maybeSignal: MaybeSignal<T>): T;\n untracked: <T>(maybeSignal: MaybeSignal<T>) => T;\n}\n\n// @TODO: Consider moving it out of internal\nexport const toValue: ToValueFn = (() => {\n const fn = toValueFn as ToValueFn;\n fn.untracked = v => toValueFn(v, true);\n return fn;\n})();\n\nfunction toValueFn<T>(maybeSignal: MaybeSignal<T>, untracked = false): T {\n if (isSignal(maybeSignal)) {\n return untracked ? _untracked(maybeSignal) : maybeSignal();\n }\n return maybeSignal;\n}\n","import { ElementRef } from '@angular/core';\n\nexport function unrefElement<T>(value: T | ElementRef<T>): T {\n return value instanceof ElementRef ? value.nativeElement : value;\n}\n","import { type ElementRef, type Signal } from '@angular/core';\nimport type { MaybeElementSignal } from '@signality/core/types';\nimport { toValue } from './to-value';\nimport { unrefElement } from './unref-element';\n\nexport interface ToElementFn extends ToElementBase {\n untracked: ToElementBase;\n}\n\nexport interface ToElementBase {\n <T extends Element>(element: T | ElementRef<T>): T;\n <T extends Element>(element: Signal<T | ElementRef<T> | null>): T | null;\n <T extends Element>(element: Signal<T | ElementRef<T> | undefined>): T | undefined;\n <T extends Element>(element: Signal<T | ElementRef<T> | null | undefined>): T | null | undefined;\n <T extends Element>(element: T | ElementRef<T> | Signal<T | ElementRef<T> | null | undefined>):\n | T\n | null\n | undefined;\n}\n\n// @TODO: Consider moving it out of internal\nexport const toElement: ToElementFn = (() => {\n const fn = toElementFn as ToElementFn;\n fn.untracked = v => toElementFn(v, true);\n return fn;\n})();\n\nfunction toElementFn<T extends Element>(\n maybeSignal: MaybeElementSignal<T>,\n untracked = false\n): T | null | undefined {\n const raw = untracked ? toValue.untracked(maybeSignal) : toValue(maybeSignal);\n return unrefElement(raw);\n}\n","/**\n * Checks whether a file matches the given accept patterns.\n * Follows the native HTML\n * [`accept`](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/accept) attribute format:\n * MIME types (`'image/png'`), wildcards (`'image/*'`), and file extensions (`'.pdf'`).\n *\n * @param file - File to check\n * @param accept - Comma-separated string of accepted patterns (e.g. `'image/*, .pdf'`)\n * @internal\n */\nexport function isAcceptedFile(file: File, accept: string): boolean {\n if (accept === '*') {\n return true;\n }\n\n const patterns = accept.split(',').map(s => s.trim());\n\n if (patterns.length === 0) {\n return true;\n }\n\n return patterns.some(pattern => {\n if (pattern.startsWith('.')) {\n return file.name.toLowerCase().endsWith(pattern.toLowerCase());\n }\n\n if (pattern.endsWith('/*')) {\n return file.type.startsWith(pattern.slice(0, -1));\n }\n\n return file.type === pattern;\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["untracked","_untracked"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"signality-core-internal.mjs","sources":["../../../projects/core/internal/constants/mobile-regex.ts","../../../projects/core/internal/constants/stubs.ts","../../../projects/core/internal/providers/is-browser.ts","../../../projects/core/internal/providers/is-mobile.ts","../../../projects/core/internal/providers/is-server.ts","../../../projects/core/internal/utils/bom/is-window.ts","../../../projects/core/internal/utils/dom/get-active-element.ts","../../../projects/core/internal/utils/dom/get-event-target.ts","../../../projects/core/internal/utils/dom/get-pip-element.ts","../../../projects/core/internal/utils/dom/get-shadow-root.ts","../../../projects/core/internal/utils/dom/is-element.ts","../../../projects/core/internal/utils/dom/is-event-target.ts","../../../projects/core/internal/utils/dom/is-node-within.ts","../../../projects/core/internal/utils/assert.ts","../../../projects/core/internal/utils/context.ts","../../../projects/core/internal/utils/create-token.ts","../../../projects/core/internal/utils/is-query-signal.ts","../../../projects/core/internal/utils/is-plain-object.ts","../../../projects/core/internal/utils/const-signal.ts","../../../projects/core/internal/utils/proxy-signal.ts","../../../projects/core/internal/utils/unref-element.ts","../../../projects/core/internal/utils/files/is-accepted-file.ts","../../../projects/core/internal/signality-core-internal.ts"],"sourcesContent":["export const MOBILE_REGEX = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;\n","/**\n * Empty synchronous function stub.\n * Used for SSR compatibility when returning method functions in Ref objects that should do nothing on the server.\n *\n * Example: `close: NOOP_FN` in {@link WebNotificationRef}\n */\nexport const NOOP_FN: (...args: any[]) => void = () => {\n /* empty */\n};\n\n/**\n * Empty asynchronous function stub that returns a resolved Promise.\n * Used for SSR compatibility when returning async method functions in Ref objects that should do nothing on the server.\n *\n * Example: `share: NOOP_ASYNC_FN` in {@link WebShareRef}\n */\nexport const NOOP_ASYNC_FN = () => Promise.resolve();\n\n/**\n * Frozen EffectRef stub with a no-op destroy method.\n * Used for SSR compatibility when returning EffectRef from observer utilities (ResizeObserver, MutationObserver, etc.)\n * that cannot run on the server. Prevents errors when calling destroy() on server-rendered refs.\n *\n * Example: `return NOOP_EFFECT_REF` in {@link resizeObserver}\n */\nexport const NOOP_EFFECT_REF = { destroy: NOOP_FN };\n\n/**\n * Equality function that always returns false, forcing signal updates on every change.\n * Used for signals that hold mutable objects (like Selection, Range) where reference equality is not sufficient\n * and we need to detect changes even when the object structure appears the same.\n *\n * Example: `signal<Selection | null>(null, { equal: ALWAYS_FALSE_FN })` in {@link textSelection}\n */\nexport const ALWAYS_FALSE_FN = () => false;\n","import { inject, InjectionToken, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\nexport const IS_BROWSER = new InjectionToken<boolean>(ngDevMode ? 'IS_BROWSER' : '', {\n providedIn: 'platform',\n factory: () => isPlatformBrowser(inject(PLATFORM_ID)),\n});\n","import { inject, InjectionToken } from '@angular/core';\nimport { MOBILE_REGEX } from '../constants';\nimport { IS_BROWSER } from './is-browser';\n\nexport const IS_MOBILE = new InjectionToken<boolean>(ngDevMode ? 'IS_MOBILE' : '', {\n providedIn: 'platform',\n factory: () => {\n return inject(IS_BROWSER) ? MOBILE_REGEX.test(navigator.userAgent) : false;\n },\n});\n","import { inject, InjectionToken, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\n\nexport const IS_SERVER = new InjectionToken<boolean>(ngDevMode ? 'IS_SERVER' : '', {\n providedIn: 'platform',\n factory: () => isPlatformServer(inject(PLATFORM_ID)),\n});\n","export function isWindow(obj: object | null): obj is Window {\n return !!obj && (obj as Window).window === obj;\n}\n","export function getActiveElement(document: Document): Element | null {\n let activeElement = document.activeElement;\n\n while (activeElement && activeElement.shadowRoot) {\n const newActiveElement = activeElement.shadowRoot.activeElement;\n if (newActiveElement === activeElement) {\n break;\n } else {\n activeElement = newActiveElement;\n }\n }\n\n return activeElement;\n}\n","export function getEventTarget<T extends EventTarget>(event: Event): T | null {\n return (event.composedPath ? event.composedPath()[0] : event.target) as T | null;\n}\n","export function getPipElement(document: Document): Element | null {\n let pipElement = document.pictureInPictureElement;\n\n while (pipElement && pipElement.shadowRoot) {\n const newPipElement = pipElement.shadowRoot.pictureInPictureElement;\n if (newPipElement === pipElement) {\n break;\n } else {\n pipElement = newPipElement;\n }\n }\n\n return pipElement;\n}\n","export function getShadowRoot(element: Element | null): ShadowRoot | null {\n const rootNode = element?.getRootNode ? element.getRootNode() : null;\n\n if (rootNode instanceof ShadowRoot) {\n return rootNode;\n }\n\n return null;\n}\n","export function isElement(value: unknown): value is Element {\n return !!value && (value as Element).nodeType === Node.ELEMENT_NODE;\n}\n","export function isEventTarget(value: unknown): value is EventTarget {\n return typeof (value as EventTarget)?.addEventListener === 'function';\n}\n","export function isNodeWithin(node: Node, root: Element): boolean {\n return root === node || root.contains(node) || (root.shadowRoot?.contains(node) ?? false);\n}\n","import { isElement, isEventTarget } from './dom';\n\nexport function assertElement(value: unknown, source: string): asserts value is Element {\n if (!isElement(value)) {\n throw new Error(\n `[${source}] Expected a DOM Element, ElementRef but received: ${\n (value as object).constructor?.name ?? typeof value\n }. ` +\n `If you are using viewChild/contentChild, make sure to specify \"{ read: ElementRef }\" to avoid implicit directive references.`\n );\n }\n}\n\nexport function assertEventTarget(value: unknown, source: string): asserts value is EventTarget {\n if (!isEventTarget(value)) {\n throw new Error(\n `[${source}] Expected an EventTarget, ElementRef but received: ${\n (value as object).constructor?.name ?? typeof value\n }. ` +\n `If you are using viewChild/contentChild, specify \"{ read: ElementRef }\" to avoid implicit directive references.`\n );\n }\n}\n","import {\n assertInInjectionContext,\n DestroyRef,\n inject,\n type Injector,\n INJECTOR,\n isSignal,\n runInInjectionContext,\n type Signal,\n untracked,\n} from '@angular/core';\nimport { SIGNAL, type SignalNode } from '@angular/core/primitives/signals';\nimport { IS_BROWSER, IS_MOBILE, IS_SERVER } from '../providers';\n\nexport interface ContextRef {\n readonly injector: Injector;\n readonly isServer: boolean;\n readonly isBrowser: boolean;\n readonly isMobile: boolean;\n readonly onCleanup: (cleanupFn: () => void) => void;\n}\n\nexport interface SetupContextRef {\n runInContext<T>(fn: (context: ContextRef) => T): T;\n}\n\n/**\n * @internal\n *\n * @param injector - injector to use for context\n * @param debugFn - context owner function\n */\nexport function setupContext(\n injector?: Injector,\n debugFn?: (...args: any[]) => any\n): SetupContextRef {\n if (typeof ngDevMode !== 'undefined' && ngDevMode && !injector) {\n assertInInjectionContext(debugFn || setupContext);\n }\n\n const ctxInjector = injector || inject(INJECTOR);\n\n return {\n runInContext<T>(fn: (context: ContextRef) => T): T {\n return runInContextImpl(fn, ctxInjector, debugFn || setupContext);\n },\n };\n}\n\nfunction runInContextImpl<T>(\n fn: (context: ContextRef) => T,\n injector: Injector,\n debugFn: (...args: any[]) => any\n): T {\n const result = runInInjectionContext(injector, () => {\n const isBrowser = inject(IS_BROWSER);\n const isServer = inject(IS_SERVER);\n const isMobile = inject(IS_MOBILE);\n const destroyRef = inject(DestroyRef);\n\n const onCleanup = (cleanupFn: () => void) => {\n destroyRef.onDestroy(cleanupFn);\n };\n\n return untracked(() => fn({ injector, isBrowser, isServer, isMobile, onCleanup }));\n });\n\n if (typeof ngDevMode !== 'undefined' && ngDevMode && result != null) {\n setupDebugInfo(result, debugFn);\n }\n\n return result;\n}\n\nfunction setupDebugInfo<T>(value: T, debugFn: (...args: any[]) => any): T {\n if (isSignal(value)) {\n setDebugName(value, debugFn);\n } else if (value && typeof value === 'object') {\n for (const [postfix, maybeSignal] of Object.entries(value)) {\n if (isSignal(maybeSignal)) {\n setDebugName(maybeSignal, debugFn, postfix);\n }\n }\n }\n\n return value;\n}\n\nfunction setDebugName(\n signal: Signal<unknown>,\n debugFn: (...args: any[]) => any,\n postfix?: string\n): void {\n const node = signal[SIGNAL] as SignalNode<unknown>;\n\n if (node.debugName === undefined) {\n node.debugName = debugFn.name + (postfix ? '.' + postfix : '');\n }\n}\n","import { InjectionToken, type ProviderToken } from '@angular/core';\n\n/**\n * Creates an Angular InjectionToken with a factory function.\n * @internal\n */\nexport function createToken<T>(\n factory: () => T,\n providedIn: ProvidedIn = 'root'\n): ProviderToken<T> {\n return new InjectionToken(ngDevMode ? factory.name : '', { factory, providedIn });\n}\n\ntype ProvidedIn = NonNullable<ConstructorParameters<typeof InjectionToken>[1]>['providedIn'];\n","import { isSignal, type Signal } from '@angular/core';\nimport { SIGNAL } from '@angular/core/primitives/signals';\n\n/**\n * Determines if a signal is a query signal (viewChild, contentChild).\n * Query signals have a special internal structure with a `_dirtyCounter` property that tracks\n * when query results change.\n\n * See: https://github.com/angular/angular/blob/main/packages/core/src/render3/queries/query_reactive.ts#L43\n * @internal\n */\nexport function isQuerySignal(val: unknown): val is Signal<unknown> {\n if (!isSignal(val)) {\n return false;\n }\n\n const node = val[SIGNAL] as object;\n return '_dirtyCounter' in node;\n}\n","export function isPlainObject(value: unknown): value is Record<PropertyKey, unknown> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === null || prototype === Object.prototype;\n}\n","import type { Signal } from '@angular/core';\nimport {\n SIGNAL,\n SIGNAL_NODE,\n type SignalGetter,\n type SignalNode,\n} from '@angular/core/primitives/signals';\n\n/***\n * Creates a lightweight, readonly signal.\n * This is primarily used to provide fallback values for states that cannot be\n * computed in the current environment. For example:\n * - During SSR where browser-only APIs are unavailable\n * - In environments that lack support for specific APIs\n * @internal\n */\nexport function constSignal<T>(value: T): Signal<T> {\n const node: SignalNode<T> = Object.create(SIGNAL_NODE);\n node.value = value;\n\n const getter = (() => node.value) as SignalGetter<T>;\n (getter as any)[SIGNAL] = node;\n\n if (typeof ngDevMode !== 'undefined' && ngDevMode) {\n const debugName = node.debugName ? ' (' + node.debugName + ')' : '';\n getter.toString = () => `[Signal${debugName}: ${String(node.value)}]`;\n }\n\n return getter;\n}\n","import { type Signal, untracked, type WritableSignal } from '@angular/core';\nimport { SIGNAL, type SignalNode } from '@angular/core/primitives/signals';\n\n/**\n * @internal\n */\nexport interface SignalProxyHandler<T> {\n get?(source: Signal<T>): T;\n set?(value: T, source: WritableSignal<T>): void;\n}\n\n/**\n * Creates a proxy wrapper around a {@link Signal}\n * @internal\n */\nexport function proxySignal<T>(\n source: Signal<T>,\n handler: Omit<SignalProxyHandler<T>, 'set'>\n): Signal<T>;\n\n/**\n * Creates a proxy wrapper around a {@link WritableSignal}\n * @internal\n */\nexport function proxySignal<T>(\n source: WritableSignal<T>,\n handler: SignalProxyHandler<T>\n): WritableSignal<T>;\n\nexport function proxySignal<T>(\n source: Signal<T> | WritableSignal<T>,\n handler: SignalProxyHandler<T>\n): Signal<T> | WritableSignal<T> {\n const node = source[SIGNAL] as SignalNode<T>;\n const isWritable = 'set' in source && typeof source.set === 'function';\n\n const proxy = (handler.get ? () => handler.get!(source) : () => source()) as Signal<T>;\n\n proxy[SIGNAL] = node;\n\n // @TODO: consider (original toString internally reads from the original getter, bypassing the proxy)\n proxy.toString = source.toString;\n\n if (isWritable) {\n const set = handler.set\n ? (value: T) => untracked(() => handler.set!(value, source))\n : (value: T) => source.set(value);\n\n const update = (updater: (current: T) => T) => set(updater(node.value));\n\n (proxy as WritableSignal<T>).set = set;\n (proxy as WritableSignal<T>).update = update;\n (proxy as WritableSignal<T>).asReadonly = () => {\n const getter = source.asReadonly();\n return proxySignal(getter, { get: handler.get?.bind(handler) });\n };\n }\n\n return proxy;\n}\n","import { ElementRef } from '@angular/core';\n\nexport function unrefElement<T>(value: T | ElementRef<T>): T {\n return value instanceof ElementRef ? value.nativeElement : value;\n}\n","/**\n * Checks whether a file matches the given accept patterns.\n * Follows the native HTML\n * [`accept`](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/accept) attribute format:\n * MIME types (`'image/png'`), wildcards (`'image/*'`), and file extensions (`'.pdf'`).\n *\n * @param file - File to check\n * @param accept - Comma-separated string of accepted patterns (e.g. `'image/*, .pdf'`)\n * @internal\n */\nexport function isAcceptedFile(file: File, accept: string): boolean {\n if (accept === '*') {\n return true;\n }\n\n const patterns = accept.split(',').map(s => s.trim());\n\n if (patterns.length === 0) {\n return true;\n }\n\n return patterns.some(pattern => {\n if (pattern.startsWith('.')) {\n return file.name.toLowerCase().endsWith(pattern.toLowerCase());\n }\n\n if (pattern.endsWith('/*')) {\n return file.type.startsWith(pattern.slice(0, -1));\n }\n\n return file.type === pattern;\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAAO,MAAM,YAAY,GAAG;;ACA5B;;;;;AAKG;AACI,MAAM,OAAO,GAA6B,MAAK;;AAEtD;AAEA;;;;;AAKG;AACI,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,OAAO;AAElD;;;;;;AAMG;MACU,eAAe,GAAG,EAAE,OAAO,EAAE,OAAO;AAEjD;;;;;;AAMG;MACU,eAAe,GAAG,MAAM;;AC/B9B,MAAM,UAAU,GAAG,IAAI,cAAc,CAAU,SAAS,GAAG,YAAY,GAAG,EAAE,EAAE;AACnF,IAAA,UAAU,EAAE,UAAU;IACtB,OAAO,EAAE,MAAM,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACtD,CAAA;;ACFM,MAAM,SAAS,GAAG,IAAI,cAAc,CAAU,SAAS,GAAG,WAAW,GAAG,EAAE,EAAE;AACjF,IAAA,UAAU,EAAE,UAAU;IACtB,OAAO,EAAE,MAAK;AACZ,QAAA,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,KAAK;IAC5E,CAAC;AACF,CAAA;;ACNM,MAAM,SAAS,GAAG,IAAI,cAAc,CAAU,SAAS,GAAG,WAAW,GAAG,EAAE,EAAE;AACjF,IAAA,UAAU,EAAE,UAAU;IACtB,OAAO,EAAE,MAAM,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACrD,CAAA;;ACNK,SAAU,QAAQ,CAAC,GAAkB,EAAA;IACzC,OAAO,CAAC,CAAC,GAAG,IAAK,GAAc,CAAC,MAAM,KAAK,GAAG;AAChD;;ACFM,SAAU,gBAAgB,CAAC,QAAkB,EAAA;AACjD,IAAA,IAAI,aAAa,GAAG,QAAQ,CAAC,aAAa;AAE1C,IAAA,OAAO,aAAa,IAAI,aAAa,CAAC,UAAU,EAAE;AAChD,QAAA,MAAM,gBAAgB,GAAG,aAAa,CAAC,UAAU,CAAC,aAAa;AAC/D,QAAA,IAAI,gBAAgB,KAAK,aAAa,EAAE;YACtC;QACF;aAAO;YACL,aAAa,GAAG,gBAAgB;QAClC;IACF;AAEA,IAAA,OAAO,aAAa;AACtB;;ACbM,SAAU,cAAc,CAAwB,KAAY,EAAA;IAChE,QAAQ,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM;AACrE;;ACFM,SAAU,aAAa,CAAC,QAAkB,EAAA;AAC9C,IAAA,IAAI,UAAU,GAAG,QAAQ,CAAC,uBAAuB;AAEjD,IAAA,OAAO,UAAU,IAAI,UAAU,CAAC,UAAU,EAAE;AAC1C,QAAA,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,uBAAuB;AACnE,QAAA,IAAI,aAAa,KAAK,UAAU,EAAE;YAChC;QACF;aAAO;YACL,UAAU,GAAG,aAAa;QAC5B;IACF;AAEA,IAAA,OAAO,UAAU;AACnB;;ACbM,SAAU,aAAa,CAAC,OAAuB,EAAA;AACnD,IAAA,MAAM,QAAQ,GAAG,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,IAAI;AAEpE,IAAA,IAAI,QAAQ,YAAY,UAAU,EAAE;AAClC,QAAA,OAAO,QAAQ;IACjB;AAEA,IAAA,OAAO,IAAI;AACb;;ACRM,SAAU,SAAS,CAAC,KAAc,EAAA;IACtC,OAAO,CAAC,CAAC,KAAK,IAAK,KAAiB,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY;AACrE;;ACFM,SAAU,aAAa,CAAC,KAAc,EAAA;AAC1C,IAAA,OAAO,OAAQ,KAAqB,EAAE,gBAAgB,KAAK,UAAU;AACvE;;ACFM,SAAU,YAAY,CAAC,IAAU,EAAE,IAAa,EAAA;IACpD,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;AAC3F;;ACAM,SAAU,aAAa,CAAC,KAAc,EAAE,MAAc,EAAA;AAC1D,IAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;AACrB,QAAA,MAAM,IAAI,KAAK,CACb,CAAA,CAAA,EAAI,MAAM,CAAA,mDAAA,EACP,KAAgB,CAAC,WAAW,EAAE,IAAI,IAAI,OAAO,KAChD,CAAA,EAAA,CAAI;AACF,YAAA,CAAA,4HAAA,CAA8H,CACjI;IACH;AACF;AAEM,SAAU,iBAAiB,CAAC,KAAc,EAAE,MAAc,EAAA;AAC9D,IAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;AACzB,QAAA,MAAM,IAAI,KAAK,CACb,CAAA,CAAA,EAAI,MAAM,CAAA,oDAAA,EACP,KAAgB,CAAC,WAAW,EAAE,IAAI,IAAI,OAAO,KAChD,CAAA,EAAA,CAAI;AACF,YAAA,CAAA,+GAAA,CAAiH,CACpH;IACH;AACF;;ACIA;;;;;AAKG;AACG,SAAU,YAAY,CAC1B,QAAmB,EACnB,OAAiC,EAAA;IAEjC,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,IAAI,CAAC,QAAQ,EAAE;AAC9D,QAAA,wBAAwB,CAAC,OAAO,IAAI,YAAY,CAAC;IACnD;IAEA,MAAM,WAAW,GAAG,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;IAEhD,OAAO;AACL,QAAA,YAAY,CAAI,EAA8B,EAAA;YAC5C,OAAO,gBAAgB,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,IAAI,YAAY,CAAC;QACnE,CAAC;KACF;AACH;AAEA,SAAS,gBAAgB,CACvB,EAA8B,EAC9B,QAAkB,EAClB,OAAgC,EAAA;AAEhC,IAAA,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,EAAE,MAAK;AAClD,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;AACpC,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAClC,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAClC,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAErC,QAAA,MAAM,SAAS,GAAG,CAAC,SAAqB,KAAI;AAC1C,YAAA,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC;AACjC,QAAA,CAAC;QAED,OAAO,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;AACpF,IAAA,CAAC,CAAC;IAEF,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,IAAI,MAAM,IAAI,IAAI,EAAE;AACnE,QAAA,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC;IACjC;AAEA,IAAA,OAAO,MAAM;AACf;AAEA,SAAS,cAAc,CAAI,KAAQ,EAAE,OAAgC,EAAA;AACnE,IAAA,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;AACnB,QAAA,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;IAC9B;AAAO,SAAA,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7C,QAAA,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC1D,YAAA,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE;AACzB,gBAAA,YAAY,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC;YAC7C;QACF;IACF;AAEA,IAAA,OAAO,KAAK;AACd;AAEA,SAAS,YAAY,CACnB,MAAuB,EACvB,OAAgC,EAChC,OAAgB,EAAA;AAEhB,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAwB;AAElD,IAAA,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;QAChC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,GAAG,GAAG,GAAG,OAAO,GAAG,EAAE,CAAC;IAChE;AACF;;AChGA;;;AAGG;SACa,WAAW,CACzB,OAAgB,EAChB,aAAyB,MAAM,EAAA;IAE/B,OAAO,IAAI,cAAc,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACnF;;ACRA;;;;;;;AAOG;AACG,SAAU,aAAa,CAAC,GAAY,EAAA;AACxC,IAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAClB,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAW;IAClC,OAAO,eAAe,IAAI,IAAI;AAChC;;AClBM,SAAU,aAAa,CAAC,KAAc,EAAA;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;AAC/C,QAAA,OAAO,KAAK;IACd;IAEA,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC;IAC9C,OAAO,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS;AAC7D;;ACCA;;;;;;;AAOG;AACG,SAAU,WAAW,CAAI,KAAQ,EAAA;IACrC,MAAM,IAAI,GAAkB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;AACtD,IAAA,IAAI,CAAC,KAAK,GAAG,KAAK;IAElB,MAAM,MAAM,IAAI,MAAM,IAAI,CAAC,KAAK,CAAoB;AACnD,IAAA,MAAc,CAAC,MAAM,CAAC,GAAG,IAAI;AAE9B,IAAA,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,EAAE;AACjD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,GAAG,EAAE;AACnE,QAAA,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAA,OAAA,EAAU,SAAS,CAAA,EAAA,EAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG;IACvE;AAEA,IAAA,OAAO,MAAM;AACf;;ACAM,SAAU,WAAW,CACzB,MAAqC,EACrC,OAA8B,EAAA;AAE9B,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAkB;AAC5C,IAAA,MAAM,UAAU,GAAG,KAAK,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,UAAU;IAEtE,MAAM,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG,MAAM,OAAO,CAAC,GAAI,CAAC,MAAM,CAAC,GAAG,MAAM,MAAM,EAAE,CAAc;AAEtF,IAAA,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI;;AAGpB,IAAA,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;IAEhC,IAAI,UAAU,EAAE;AACd,QAAA,MAAM,GAAG,GAAG,OAAO,CAAC;AAClB,cAAE,CAAC,KAAQ,KAAK,SAAS,CAAC,MAAM,OAAO,CAAC,GAAI,CAAC,KAAK,EAAE,MAAM,CAAC;AAC3D,cAAE,CAAC,KAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AAEnC,QAAA,MAAM,MAAM,GAAG,CAAC,OAA0B,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAEtE,QAAA,KAA2B,CAAC,GAAG,GAAG,GAAG;AACrC,QAAA,KAA2B,CAAC,MAAM,GAAG,MAAM;AAC3C,QAAA,KAA2B,CAAC,UAAU,GAAG,MAAK;AAC7C,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE;AAClC,YAAA,OAAO,WAAW,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;AACjE,QAAA,CAAC;IACH;AAEA,IAAA,OAAO,KAAK;AACd;;ACzDM,SAAU,YAAY,CAAI,KAAwB,EAAA;AACtD,IAAA,OAAO,KAAK,YAAY,UAAU,GAAG,KAAK,CAAC,aAAa,GAAG,KAAK;AAClE;;ACJA;;;;;;;;;AASG;AACG,SAAU,cAAc,CAAC,IAAU,EAAE,MAAc,EAAA;AACvD,IAAA,IAAI,MAAM,KAAK,GAAG,EAAE;AAClB,QAAA,OAAO,IAAI;IACb;IAEA,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AAErD,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAG;AAC7B,QAAA,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC3B,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAChE;AAEA,QAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC1B,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO;AAC9B,IAAA,CAAC,CAAC;AACJ;;AChCA;;AAEG;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { afterRenderEffect } from '@angular/core';
|
|
2
|
-
import { setupContext, NOOP_EFFECT_REF,
|
|
2
|
+
import { setupContext, NOOP_EFFECT_REF, assertElement } from '@signality/core/internal';
|
|
3
|
+
import { toElement, toValue } from '@signality/core/utilities';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Low-level utility for observing element intersection with viewport using the [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signality-core-observers-intersection-observer.mjs","sources":["../../../projects/core/observers/intersection-observer/index.ts","../../../projects/core/observers/intersection-observer/signality-core-observers-intersection-observer.ts"],"sourcesContent":["import {\n afterRenderEffect,\n type CreateEffectOptions,\n type EffectCleanupRegisterFn,\n} from '@angular/core';\nimport {
|
|
1
|
+
{"version":3,"file":"signality-core-observers-intersection-observer.mjs","sources":["../../../projects/core/observers/intersection-observer/index.ts","../../../projects/core/observers/intersection-observer/signality-core-observers-intersection-observer.ts"],"sourcesContent":["import {\n afterRenderEffect,\n type CreateEffectOptions,\n type EffectCleanupRegisterFn,\n} from '@angular/core';\nimport { assertElement, NOOP_EFFECT_REF, setupContext } from '@signality/core/internal';\nimport { toElement, toValue } from '@signality/core/utilities';\nimport type { MaybeElementSignal, MaybeSignal } from '@signality/core/types';\n\nexport interface IntersectionObserverInitOptions\n extends Omit<CreateEffectOptions, 'allowSignalWrites'> {\n /**\n * Scrollable ancestor used as the intersection viewport.\n * `null` or `undefined` defaults to the browser viewport.\n *\n * @see [IntersectionObserver: root on MDN](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/root)\n */\n readonly root?: MaybeElementSignal<Element> | Document | null;\n\n /**\n * CSS margin applied around the root before computing intersections.\n * Accepts values in the same format as the CSS `margin` property (e.g. `'10px 0px'`).\n *\n * @see [IntersectionObserver: rootMargin on MDN](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/rootMargin)\n */\n readonly rootMargin?: MaybeSignal<string>;\n\n /**\n * Fraction(s) of the target element that must be visible to trigger the callback.\n * A single number or an array of thresholds, each between `0` and `1`.\n *\n * @see [IntersectionObserver: thresholds on MDN](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/thresholds)\n */\n readonly threshold?: MaybeSignal<number | number[]>;\n}\n\nexport interface IntersectionObserverRef {\n /**\n * Stop observing all targets and disconnect the underlying `IntersectionObserver`.\n */\n readonly destroy: () => void;\n}\n\n/**\n * Low-level utility for observing element intersection with viewport using the [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API).\n * Provides fine-grained control over the observation lifecycle.\n *\n * @param target - Element(s) to observe\n * @param callback - Callback function called when intersection changes\n * @param options - Optional configuration (see {@link IntersectionObserverInitOptions})\n * @returns An IntersectionObserverRef with a `destroy()` method to stop observing the element(s)\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <div #section>Section content</div>\n * @if (isVisible()) {\n * <p>Section is visible!</p>\n * }\n * `\n * })\n * export class IntersectionDemo {\n * readonly section = viewChild<ElementRef>('section');\n * readonly isVisible = signal(false);\n *\n * constructor() {\n * intersectionObserver(this.section, entries => {\n * this.isVisible.set(entries[0].isIntersecting);\n * }, { threshold: 0.5 });\n * }\n * }\n * ```\n */\nexport function intersectionObserver(\n target: MaybeElementSignal<Element> | MaybeElementSignal<Element>[],\n callback: (entries: readonly IntersectionObserverEntry[], observer: IntersectionObserver) => void,\n options?: IntersectionObserverInitOptions\n): IntersectionObserverRef {\n const { runInContext } = setupContext(options?.injector, intersectionObserver);\n\n return runInContext(({ isServer }) => {\n if (isServer) {\n return NOOP_EFFECT_REF;\n }\n\n const targets = Array.isArray(target) ? target : [target];\n\n const setupObserver = (onCleanup: EffectCleanupRegisterFn) => {\n const els = targets.map(toElement).filter(Boolean);\n\n if (!els.length) {\n return;\n }\n\n const root = options?.root\n ? options.root instanceof Document\n ? options.root\n : toElement(options.root)\n : null;\n const rootMargin = toValue(options?.rootMargin);\n const threshold = toValue(options?.threshold);\n\n const observer = new IntersectionObserver(callback, { root, rootMargin, threshold });\n\n for (const el of els) {\n ngDevMode && assertElement(el, 'intersectionObserver');\n observer.observe(el!);\n }\n\n onCleanup(observer.disconnect.bind(observer));\n };\n\n const effectRef = afterRenderEffect({ read: setupObserver }, options);\n\n return { destroy: () => effectRef.destroy() };\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AA2CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BG;SACa,oBAAoB,CAClC,MAAmE,EACnE,QAAiG,EACjG,OAAyC,EAAA;AAEzC,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,oBAAoB,CAAC;AAE9E,IAAA,OAAO,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAI;QACnC,IAAI,QAAQ,EAAE;AACZ,YAAA,OAAO,eAAe;QACxB;AAEA,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC;AAEzD,QAAA,MAAM,aAAa,GAAG,CAAC,SAAkC,KAAI;AAC3D,YAAA,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAElD,YAAA,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;gBACf;YACF;AAEA,YAAA,MAAM,IAAI,GAAG,OAAO,EAAE;AACpB,kBAAE,OAAO,CAAC,IAAI,YAAY;sBACtB,OAAO,CAAC;AACV,sBAAE,SAAS,CAAC,OAAO,CAAC,IAAI;kBACxB,IAAI;YACR,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;YAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC;AAE7C,YAAA,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AAEpF,YAAA,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;AACpB,gBAAA,SAAS,IAAI,aAAa,CAAC,EAAE,EAAE,sBAAsB,CAAC;AACtD,gBAAA,QAAQ,CAAC,OAAO,CAAC,EAAG,CAAC;YACvB;YAEA,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC/C,QAAA,CAAC;AAED,QAAA,MAAM,SAAS,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC;QAErE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE;AAC/C,IAAA,CAAC,CAAC;AACJ;;ACrHA;;AAEG;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { afterRenderEffect } from '@angular/core';
|
|
2
|
-
import { setupContext, NOOP_EFFECT_REF,
|
|
2
|
+
import { setupContext, NOOP_EFFECT_REF, assertElement } from '@signality/core/internal';
|
|
3
|
+
import { toElement, toValue } from '@signality/core/utilities';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Low-level utility for observing DOM tree changes using the [MutationObserver API](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signality-core-observers-mutation-observer.mjs","sources":["../../../projects/core/observers/mutation-observer/index.ts","../../../projects/core/observers/mutation-observer/signality-core-observers-mutation-observer.ts"],"sourcesContent":["import {\n afterRenderEffect,\n type CreateEffectOptions,\n type EffectCleanupRegisterFn,\n} from '@angular/core';\nimport {
|
|
1
|
+
{"version":3,"file":"signality-core-observers-mutation-observer.mjs","sources":["../../../projects/core/observers/mutation-observer/index.ts","../../../projects/core/observers/mutation-observer/signality-core-observers-mutation-observer.ts"],"sourcesContent":["import {\n afterRenderEffect,\n type CreateEffectOptions,\n type EffectCleanupRegisterFn,\n} from '@angular/core';\nimport { assertElement, NOOP_EFFECT_REF, setupContext } from '@signality/core/internal';\nimport { toElement, toValue } from '@signality/core/utilities';\nimport type { MaybeElementSignal, MaybeSignal } from '@signality/core/types';\n\nexport interface MutationObserverInitOptions\n extends Omit<CreateEffectOptions, 'allowSignalWrites'> {\n /**\n * Whether to observe additions and removals of child nodes.\n *\n * @see [MutationObserver.observe(): childList on MDN](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/observe#childlist)\n */\n readonly childList?: MaybeSignal<boolean>;\n\n /**\n * Whether to observe attribute changes on the target element.\n * Use `attributeFilter` to limit which attributes are observed.\n *\n * @see [MutationObserver.observe(): attributes on MDN](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/observe#attributes)\n */\n readonly attributes?: MaybeSignal<boolean>;\n\n /**\n * Whether to observe changes to the text content (`CharacterData`) of the target.\n *\n * @see [MutationObserver.observe(): characterData on MDN](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/observe#characterdata)\n */\n readonly characterData?: MaybeSignal<boolean>;\n\n /**\n * Whether to extend observation to the entire subtree of the target element.\n *\n * @see [MutationObserver.observe(): subtree on MDN](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/observe#subtree)\n */\n readonly subtree?: MaybeSignal<boolean>;\n\n /**\n * Whether to record the previous attribute value in each `MutationRecord`.\n * Implicitly sets `attributes` to `true` if not already set.\n *\n * @see [MutationObserver.observe(): attributeOldValue on MDN](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/observe#attributeoldvalue)\n */\n readonly attributeOldValue?: MaybeSignal<boolean>;\n\n /**\n * Whether to record the previous character data value in each `MutationRecord`.\n * Implicitly sets `characterData` to `true` if not already set.\n *\n * @see [MutationObserver.observe(): characterDataOldValue on MDN](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/observe#characterdataoldvalue)\n */\n readonly characterDataOldValue?: MaybeSignal<boolean>;\n\n /**\n * Array of attribute local names to observe. Only mutations to listed attributes are reported.\n * Implicitly sets `attributes` to `true` if not already set.\n *\n * @see [MutationObserver.observe(): attributeFilter on MDN](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/observe#attributefilter)\n */\n readonly attributeFilter?: MaybeSignal<string[]>;\n}\n\nexport interface MutationObserverRef {\n /**\n * Stop observing all targets and disconnect the underlying `MutationObserver`.\n */\n readonly destroy: () => void;\n}\n\n/**\n * Low-level utility for observing DOM tree changes using the [MutationObserver API](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver).\n * Provides fine-grained control over the observation lifecycle.\n *\n * @param target - Element(s) to observe\n * @param callback - Callback function called when DOM mutations occur\n * @param options - Optional configuration (see {@link MutationObserverInitOptions})\n * @returns MutationObserverRef with a `destroy()` method to stop observing the element(s)\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <div #container>\n * <p>Children: {{ childCount() }}</p>\n * </div>\n * `\n * })\n * export class MutationComponent {\n * readonly container = viewChild<ElementRef>('container');\n * readonly childCount = signal(0);\n *\n * constructor() {\n * mutationObserver(this.container, mutations => {\n * this.childCount.set(mutations[0].target.childNodes.length);\n * }, { childList: true });\n * }\n * }\n * ```\n */\nexport function mutationObserver(\n target: MaybeElementSignal<Element> | MaybeElementSignal<Element>[],\n callback: (mutations: readonly MutationRecord[], observer: MutationObserver) => void,\n options: MutationObserverInitOptions\n): MutationObserverRef {\n const { runInContext } = setupContext(options.injector, mutationObserver);\n\n return runInContext(({ isServer }) => {\n if (isServer) {\n return NOOP_EFFECT_REF;\n }\n\n const targets = Array.isArray(target) ? target : [target];\n\n const setupObserver = (onCleanup: EffectCleanupRegisterFn) => {\n const els = targets.map(toElement).filter(Boolean);\n\n if (!els.length) {\n return;\n }\n\n const childList = toValue(options.childList);\n const attributes = toValue(options.attributes);\n const characterData = toValue(options.characterData);\n const subtree = toValue(options.subtree);\n const attributeOldValue = toValue(options.attributeOldValue);\n const characterDataOldValue = toValue(options.characterDataOldValue);\n const attributeFilter = toValue(options.attributeFilter);\n\n const observer = new MutationObserver(callback);\n\n for (const el of els) {\n ngDevMode && assertElement(el, 'mutationObserver');\n\n observer.observe(el!, {\n childList,\n attributes,\n characterData,\n subtree,\n attributeOldValue,\n characterDataOldValue,\n attributeFilter,\n });\n }\n\n onCleanup(observer.disconnect.bind(observer));\n };\n\n const effectRef = afterRenderEffect({ read: setupObserver }, options);\n\n return { destroy: () => effectRef.destroy() };\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAwEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;SACa,gBAAgB,CAC9B,MAAmE,EACnE,QAAoF,EACpF,OAAoC,EAAA;AAEpC,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,gBAAgB,CAAC;AAEzE,IAAA,OAAO,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAI;QACnC,IAAI,QAAQ,EAAE;AACZ,YAAA,OAAO,eAAe;QACxB;AAEA,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC;AAEzD,QAAA,MAAM,aAAa,GAAG,CAAC,SAAkC,KAAI;AAC3D,YAAA,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAElD,YAAA,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;gBACf;YACF;YAEA,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;YAC9C,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;YACpD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;YACxC,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;YAC5D,MAAM,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC;YACpE,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;AAExD,YAAA,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,QAAQ,CAAC;AAE/C,YAAA,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;AACpB,gBAAA,SAAS,IAAI,aAAa,CAAC,EAAE,EAAE,kBAAkB,CAAC;AAElD,gBAAA,QAAQ,CAAC,OAAO,CAAC,EAAG,EAAE;oBACpB,SAAS;oBACT,UAAU;oBACV,aAAa;oBACb,OAAO;oBACP,iBAAiB;oBACjB,qBAAqB;oBACrB,eAAe;AAChB,iBAAA,CAAC;YACJ;YAEA,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC/C,QAAA,CAAC;AAED,QAAA,MAAM,SAAS,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC;QAErE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE;AAC/C,IAAA,CAAC,CAAC;AACJ;;AC1JA;;AAEG;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { afterRenderEffect } from '@angular/core';
|
|
2
|
-
import { setupContext, NOOP_EFFECT_REF,
|
|
2
|
+
import { setupContext, NOOP_EFFECT_REF, assertElement } from '@signality/core/internal';
|
|
3
|
+
import { toElement, toValue } from '@signality/core/utilities';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Low-level utility for observing element size changes using the [ResizeObserver API](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signality-core-observers-resize-observer.mjs","sources":["../../../projects/core/observers/resize-observer/index.ts","../../../projects/core/observers/resize-observer/signality-core-observers-resize-observer.ts"],"sourcesContent":["import {\n afterRenderEffect,\n type CreateEffectOptions,\n type EffectCleanupRegisterFn,\n} from '@angular/core';\nimport {
|
|
1
|
+
{"version":3,"file":"signality-core-observers-resize-observer.mjs","sources":["../../../projects/core/observers/resize-observer/index.ts","../../../projects/core/observers/resize-observer/signality-core-observers-resize-observer.ts"],"sourcesContent":["import {\n afterRenderEffect,\n type CreateEffectOptions,\n type EffectCleanupRegisterFn,\n} from '@angular/core';\nimport { assertElement, NOOP_EFFECT_REF, setupContext } from '@signality/core/internal';\nimport { toElement, toValue } from '@signality/core/utilities';\nimport type { MaybeElementSignal, MaybeSignal } from '@signality/core/types';\n\nexport interface ResizeObserverInitOptions extends Omit<CreateEffectOptions, 'allowSignalWrites'> {\n /**\n * Box model to measure when reporting size changes.\n *\n * - `'content-box'` — size of the content area, excluding padding and border (default).\n * - `'border-box'` — size including padding and border.\n * - `'device-pixel-content-box'` — content-box size in physical device pixels.\n *\n * @see [ResizeObserver.observe(): box on MDN](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver/observe#box)\n */\n readonly box?: MaybeSignal<ResizeObserverBoxOptions>;\n}\n\nexport interface ResizeObserverRef {\n /**\n * Stop observing all targets and disconnect the underlying `ResizeObserver`.\n */\n readonly destroy: () => void;\n}\n\n/**\n * Low-level utility for observing element size changes using the [ResizeObserver API](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver).\n * Provides fine-grained control over the observation lifecycle.\n *\n * @param target - Element(s) to observe\n * @param callback - Callback function called when element size changes\n * @param options - Optional configuration (see {@link ResizeObserverInitOptions})\n * @returns ResizeObserverRef with a `destroy()` method to stop observing the element(s)\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <div #resizable>\n * Size: {{ size().width }} × {{ size().height }}px\n * </div>\n * `\n * })\n * export class ResizeComponent {\n * readonly resizable = viewChild<ElementRef>('resizable');\n * readonly size = signal({ width: 0, height: 0 });\n *\n * constructor() {\n * resizeObserver(this.resizable, entries => {\n * const { width, height } = entries[0].contentRect;\n * this.size.set({ width, height });\n * });\n * }\n * }\n * ```\n */\nexport function resizeObserver(\n target: MaybeElementSignal<Element> | MaybeElementSignal<Element>[],\n callback: (entries: readonly ResizeObserverEntry[]) => void,\n options?: ResizeObserverInitOptions\n): ResizeObserverRef {\n const { runInContext } = setupContext(options?.injector, resizeObserver);\n\n return runInContext(({ isServer, onCleanup }) => {\n if (isServer) {\n return NOOP_EFFECT_REF;\n }\n\n const targets = Array.isArray(target) ? target : [target];\n\n let observer: ResizeObserver | null = null;\n\n const setupObserver = (onCleanup: EffectCleanupRegisterFn) => {\n const els = targets.map(toElement).filter(Boolean);\n\n if (!els.length) {\n return;\n }\n\n const box = toValue(options?.box);\n\n observer ??= new ResizeObserver(callback);\n\n for (const el of els) {\n ngDevMode && assertElement(el, 'resizeObserver');\n observer.observe(el!, { box });\n }\n\n onCleanup(() => {\n els.forEach(el => observer?.unobserve(el!));\n });\n };\n\n const destroy = () => observer?.disconnect();\n\n onCleanup(destroy);\n\n afterRenderEffect({ read: setupObserver }, options);\n\n return { destroy };\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AA6BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BG;SACa,cAAc,CAC5B,MAAmE,EACnE,QAA2D,EAC3D,OAAmC,EAAA;AAEnC,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC;IAExE,OAAO,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAI;QAC9C,IAAI,QAAQ,EAAE;AACZ,YAAA,OAAO,eAAe;QACxB;AAEA,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC;QAEzD,IAAI,QAAQ,GAA0B,IAAI;AAE1C,QAAA,MAAM,aAAa,GAAG,CAAC,SAAkC,KAAI;AAC3D,YAAA,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAElD,YAAA,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;gBACf;YACF;YAEA,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;AAEjC,YAAA,QAAQ,KAAK,IAAI,cAAc,CAAC,QAAQ,CAAC;AAEzC,YAAA,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;AACpB,gBAAA,SAAS,IAAI,aAAa,CAAC,EAAE,EAAE,gBAAgB,CAAC;gBAChD,QAAQ,CAAC,OAAO,CAAC,EAAG,EAAE,EAAE,GAAG,EAAE,CAAC;YAChC;YAEA,SAAS,CAAC,MAAK;AACb,gBAAA,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,QAAQ,EAAE,SAAS,CAAC,EAAG,CAAC,CAAC;AAC7C,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,EAAE,UAAU,EAAE;QAE5C,SAAS,CAAC,OAAO,CAAC;QAElB,iBAAiB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC;QAEnD,OAAO,EAAE,OAAO,EAAE;AACpB,IAAA,CAAC,CAAC;AACJ;;ACzGA;;AAEG;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { signal, isSignal } from '@angular/core';
|
|
2
|
-
import { setupContext,
|
|
2
|
+
import { setupContext, proxySignal } from '@signality/core/internal';
|
|
3
|
+
import { toValue } from '@signality/core/utilities';
|
|
3
4
|
import { debounceCallback } from '@signality/core/scheduling/debounce-callback';
|
|
4
5
|
import { watcher } from '@signality/core/reactivity/watcher';
|
|
5
6
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signality-core-reactivity-debounced.mjs","sources":["../../../projects/core/reactivity/debounced/index.ts","../../../projects/core/reactivity/debounced/signality-core-reactivity-debounced.ts"],"sourcesContent":["import {\n type CreateSignalOptions,\n isSignal,\n signal,\n type Signal,\n type WritableSignal,\n} from '@angular/core';\nimport { proxySignal, setupContext
|
|
1
|
+
{"version":3,"file":"signality-core-reactivity-debounced.mjs","sources":["../../../projects/core/reactivity/debounced/index.ts","../../../projects/core/reactivity/debounced/signality-core-reactivity-debounced.ts"],"sourcesContent":["import {\n type CreateSignalOptions,\n isSignal,\n signal,\n type Signal,\n type WritableSignal,\n} from '@angular/core';\nimport { proxySignal, setupContext } from '@signality/core/internal';\nimport { toValue } from '@signality/core/utilities';\nimport type { MaybeSignal, SignalValue, WithInjector } from '@signality/core/types';\nimport { debounceCallback } from '@signality/core/scheduling/debounce-callback';\nimport { watcher } from '@signality/core/reactivity/watcher';\n\nexport type DebouncedOptions<T> = CreateSignalOptions<T> & WithInjector;\n\n/**\n * Creates a debounced readonly signal from a source signal.\n * Updates to the source signal are debounced before propagating to the returned signal.\n *\n * @param source - Source signal to debounce\n * @param timeMs - Debounce delay in milliseconds\n * @param options - Optional configuration including signal options and injector\n * @returns A readonly signal that updates after the debounce delay\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <input [(ngModel)]=\"query\" />\n * <p>Debounced value: {{ debouncedQuery() }}</p>\n * `\n * })\n * export class SearchInput {\n * readonly query = signal('');\n * readonly debouncedQuery = debounced(this.query, 300);\n * }\n * ```\n */\nexport function debounced<S extends Signal<any>>(\n source: S,\n timeMs: MaybeSignal<number>,\n options?: DebouncedOptions<SignalValue<S>>\n): Signal<SignalValue<S>>;\n\n/**\n * Creates a debounced writable signal from an initial value.\n * Both `set()` and `update()` calls are debounced.\n *\n * @param value - Initial value\n * @param timeMs - Debounce delay in milliseconds\n * @param options - Optional configuration including signal options and injector\n * @returns A writable signal where updates are debounced\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <input [(ngModel)]=\"query\" />\n * <p>Search results for: {{ query() }}</p>\n * `\n * })\n * export class SearchInput {\n * readonly query = debounced('', 300);\n * }\n * ```\n */\nexport function debounced<V>(\n value: V,\n timeMs: MaybeSignal<number>,\n options?: DebouncedOptions<V>\n): WritableSignal<V>;\n\nexport function debounced(\n valueOrSignal: any,\n timeMs: MaybeSignal<number>,\n options?: DebouncedOptions<any>\n) {\n const { runInContext } = setupContext(options?.injector, debounced);\n\n return runInContext(() => {\n const initialValue = toValue(valueOrSignal);\n const output = signal(initialValue, options);\n const set = debounceCallback(output.set, timeMs);\n\n if (isSignal(valueOrSignal)) {\n watcher(valueOrSignal, set);\n return output.asReadonly();\n } else {\n return proxySignal(output, { set });\n }\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;SAwEgB,SAAS,CACvB,aAAkB,EAClB,MAA2B,EAC3B,OAA+B,EAAA;AAE/B,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;IAEnE,OAAO,YAAY,CAAC,MAAK;AACvB,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC;QAC5C,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC;AAEhD,QAAA,IAAI,QAAQ,CAAC,aAAa,CAAC,EAAE;AAC3B,YAAA,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;AAC3B,YAAA,OAAO,MAAM,CAAC,UAAU,EAAE;QAC5B;aAAO;YACL,OAAO,WAAW,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC;QACrC;AACF,IAAA,CAAC,CAAC;AACJ;;AC3FA;;AAEG;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { signal, isSignal } from '@angular/core';
|
|
2
|
-
import { setupContext,
|
|
2
|
+
import { setupContext, proxySignal } from '@signality/core/internal';
|
|
3
|
+
import { toValue } from '@signality/core/utilities';
|
|
3
4
|
import { throttleCallback } from '@signality/core/scheduling/throttle-callback';
|
|
4
5
|
import { watcher } from '@signality/core/reactivity/watcher';
|
|
5
6
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signality-core-reactivity-throttled.mjs","sources":["../../../projects/core/reactivity/throttled/index.ts","../../../projects/core/reactivity/throttled/signality-core-reactivity-throttled.ts"],"sourcesContent":["import {\n type CreateSignalOptions,\n isSignal,\n signal,\n type Signal,\n type WritableSignal,\n} from '@angular/core';\nimport { proxySignal, setupContext
|
|
1
|
+
{"version":3,"file":"signality-core-reactivity-throttled.mjs","sources":["../../../projects/core/reactivity/throttled/index.ts","../../../projects/core/reactivity/throttled/signality-core-reactivity-throttled.ts"],"sourcesContent":["import {\n type CreateSignalOptions,\n isSignal,\n signal,\n type Signal,\n type WritableSignal,\n} from '@angular/core';\nimport { proxySignal, setupContext } from '@signality/core/internal';\nimport { toValue } from '@signality/core/utilities';\nimport type { MaybeSignal, SignalValue, WithInjector } from '@signality/core/types';\nimport { throttleCallback } from '@signality/core/scheduling/throttle-callback';\nimport { watcher } from '@signality/core/reactivity/watcher';\n\nexport type ThrottledOptions<T> = CreateSignalOptions<T> & WithInjector;\n\n/**\n * Creates a throttled readonly signal from a source signal.\n * Updates to the source signal are throttled to occur at most once per time interval.\n *\n * @param source - Source signal to throttle\n * @param timeMs - Throttle interval in milliseconds\n * @param options - Optional configuration including signal options and injector\n * @returns A readonly signal that updates at most once per throttle interval\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <div (scroll)=\"scrollY.set($event.target.scrollTop)\">\n * <p>Scroll position: {{ scrollY() }}</p>\n * <p>Throttled position: {{ throttledScrollY() }}</p>\n * </div>\n * `\n * })\n * export class ScrollTracker {\n * readonly scrollY = signal(0);\n * readonly throttledScrollY = throttled(this.scrollY, 100);\n * }\n * ```\n */\nexport function throttled<S extends Signal<any>>(\n source: S,\n timeMs: MaybeSignal<number>,\n options?: ThrottledOptions<SignalValue<S>>\n): Signal<SignalValue<S>>;\n\n/**\n * Creates a throttled writable signal from an initial value.\n * Both `set()` and `update()` calls are throttled.\n *\n * @param value - Initial value\n * @param timeMs - Throttle interval in milliseconds\n * @param options - Optional configuration including signal options and injector\n * @returns A writable signal where updates are throttled\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <div (mousemove)=\"mousePosition.set({ x: $event.clientX, y: $event.clientY })\">\n * <p>Mouse position: X={{ mousePosition().x }}, Y={{ mousePosition().y }}</p>\n * </div>\n * `\n * })\n * export class MouseTracker {\n * readonly mousePosition = throttled({ x: 0, y: 0 }, 16);\n * }\n * ```\n */\nexport function throttled<V>(\n value: V,\n timeMs: MaybeSignal<number>,\n options?: ThrottledOptions<V>\n): WritableSignal<V>;\n\nexport function throttled(\n valueOrSignal: any,\n timeMs: MaybeSignal<number>,\n options?: ThrottledOptions<any>\n) {\n const { runInContext } = setupContext(options?.injector, throttled);\n\n return runInContext(() => {\n const initialValue = toValue(valueOrSignal);\n const output = signal(initialValue, options);\n const set = throttleCallback(output.set, timeMs);\n\n if (isSignal(valueOrSignal)) {\n watcher(valueOrSignal, set);\n return output.asReadonly();\n } else {\n return proxySignal(output, { set });\n }\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;SA2EgB,SAAS,CACvB,aAAkB,EAClB,MAA2B,EAC3B,OAA+B,EAAA;AAE/B,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;IAEnE,OAAO,YAAY,CAAC,MAAK;AACvB,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC;QAC5C,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC;AAEhD,QAAA,IAAI,QAAQ,CAAC,aAAa,CAAC,EAAE;AAC3B,YAAA,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;AAC3B,YAAA,OAAO,MAAM,CAAC,UAAU,EAAE;QAC5B;aAAO;YACL,OAAO,WAAW,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC;QACrC;AACF,IAAA,CAAC,CAAC;AACJ;;AC9FA;;AAEG;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signality-core-scheduling-debounce-callback.mjs","sources":["../../../projects/core/scheduling/debounce-callback/index.ts","../../../projects/core/scheduling/debounce-callback/signality-core-scheduling-debounce-callback.ts"],"sourcesContent":["import type { MaybeSignal, WithInjector } from '@signality/core/types';\nimport { setupContext, type Timer
|
|
1
|
+
{"version":3,"file":"signality-core-scheduling-debounce-callback.mjs","sources":["../../../projects/core/scheduling/debounce-callback/index.ts","../../../projects/core/scheduling/debounce-callback/signality-core-scheduling-debounce-callback.ts"],"sourcesContent":["import type { MaybeSignal, WithInjector } from '@signality/core/types';\nimport { setupContext, type Timer } from '@signality/core/internal';\nimport { toValue } from '@signality/core/utilities';\n\n/**\n * Creates a debounced version of a callback function.\n * The callback will only be executed after the specified wait time has elapsed since the last invocation.\n *\n * @param callback - The function to debounce\n * @param wait - Debounce delay in milliseconds (can be a reactive signal)\n * @param options - Optional configuration including injector\n * @returns A debounced version of the callback function\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <input (input)=\"handleInput($event.target.value)\" />\n * `,\n * })\n * export class SearchInput {\n * readonly debounceTime = input(300);\n * readonly searchChange = output<string>();\n *\n * readonly handleInput = debounceCallback(value => {\n * this.searchChange.emit(value);\n * }, this.debounceTime);\n * }\n * ```\n */\nexport function debounceCallback<T extends (...args: any[]) => any>(\n callback: T,\n wait: MaybeSignal<number>,\n options?: WithInjector\n): T {\n const { runInContext } = setupContext(options?.injector, debounceCallback);\n\n return runInContext(({ isServer, onCleanup }) => {\n if (isServer) {\n return callback;\n }\n\n let timer: Timer;\n\n onCleanup(() => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n });\n\n return new Proxy(callback, {\n apply(target, thisArg, args) {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n timer = setTimeout(() => {\n target.apply(thisArg, args);\n }, toValue.untracked(wait));\n },\n });\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;SACa,gBAAgB,CAC9B,QAAW,EACX,IAAyB,EACzB,OAAsB,EAAA;AAEtB,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,CAAC;IAE1E,OAAO,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAI;QAC9C,IAAI,QAAQ,EAAE;AACZ,YAAA,OAAO,QAAQ;QACjB;AAEA,QAAA,IAAI,KAAY;QAEhB,SAAS,CAAC,MAAK;AACb,YAAA,IAAI,KAAK,KAAK,SAAS,EAAE;gBACvB,YAAY,CAAC,KAAK,CAAC;YACrB;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE;AACzB,YAAA,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAA;AACzB,gBAAA,IAAI,KAAK,KAAK,SAAS,EAAE;oBACvB,YAAY,CAAC,KAAK,CAAC;gBACrB;AACA,gBAAA,KAAK,GAAG,UAAU,CAAC,MAAK;AACtB,oBAAA,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;gBAC7B,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;AACF,SAAA,CAAC;AACJ,IAAA,CAAC,CAAC;AACJ;;AC7DA;;AAEG;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { isSignal } from '@angular/core';
|
|
2
|
-
import { setupContext, NOOP_EFFECT_REF
|
|
2
|
+
import { setupContext, NOOP_EFFECT_REF } from '@signality/core/internal';
|
|
3
|
+
import { toValue } from '@signality/core/utilities';
|
|
3
4
|
import { watcher } from '@signality/core/reactivity/watcher';
|
|
4
5
|
|
|
5
6
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signality-core-scheduling-interval.mjs","sources":["../../../projects/core/scheduling/interval/index.ts","../../../projects/core/scheduling/interval/signality-core-scheduling-interval.ts"],"sourcesContent":["import { isSignal } from '@angular/core';\nimport { NOOP_EFFECT_REF, setupContext, type Timer
|
|
1
|
+
{"version":3,"file":"signality-core-scheduling-interval.mjs","sources":["../../../projects/core/scheduling/interval/index.ts","../../../projects/core/scheduling/interval/signality-core-scheduling-interval.ts"],"sourcesContent":["import { isSignal } from '@angular/core';\nimport { NOOP_EFFECT_REF, setupContext, type Timer } from '@signality/core/internal';\nimport { toValue } from '@signality/core/utilities';\nimport type { MaybeSignal, WithInjector } from '@signality/core/types';\nimport { watcher, type WatcherRef } from '@signality/core/reactivity/watcher';\n\nexport interface IntervalOptions extends WithInjector {\n /**\n * Call the callback immediately, without waiting for the first tick.\n *\n * @default false\n */\n readonly immediate?: boolean;\n}\n\nexport interface IntervalRef {\n /**\n * Stop the interval permanently.\n */\n readonly destroy: () => void;\n}\n\n/**\n * Signal-based wrapper around [`setInterval`](https://developer.mozilla.org/en-US/docs/Web/API/Window/setInterval).\n * Creates a reactive interval that executes a callback at specified intervals.\n * The interval starts immediately upon creation and can be stopped with `destroy()`.\n *\n * @param callback - Function to execute on each interval tick\n * @param intervalMs - Interval duration in milliseconds (can be a reactive signal)\n * @param options - Optional configuration\n * @returns An IntervalRef with a `destroy` method to stop the interval\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <p>Ticks: {{ ticks() }}</p>\n * <button (click)=\"polling.destroy()\">Stop</button>\n * `,\n * })\n * export class PeriodicTask {\n * readonly ticks = signal(0);\n *\n * readonly polling = interval(() => {\n * this.ticks.update(n => n + 1);\n * }, 5000);\n * }\n * ```\n */\nexport function interval(\n callback: () => void,\n intervalMs: MaybeSignal<number>,\n options?: IntervalOptions\n): IntervalRef {\n const { runInContext } = setupContext(options?.injector, interval);\n\n return runInContext(({ isServer, onCleanup }) => {\n if (isServer) {\n return NOOP_EFFECT_REF;\n }\n\n let intervalId: Timer;\n let watcherRef: WatcherRef | null = null;\n\n const start = () => {\n clearInterval(intervalId);\n\n const ms = toValue.untracked(intervalMs);\n intervalId = ms > 0 ? setInterval(callback, ms) : undefined;\n };\n\n if (isSignal(intervalMs)) {\n watcherRef = watcher(intervalMs, start);\n }\n\n const destroy = () => {\n clearInterval(intervalId);\n intervalId = undefined;\n watcherRef?.destroy();\n };\n\n onCleanup(destroy);\n\n if (options?.immediate) {\n callback();\n }\n\n start();\n\n return { destroy };\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAsBA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BG;SACa,QAAQ,CACtB,QAAoB,EACpB,UAA+B,EAC/B,OAAyB,EAAA;AAEzB,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC;IAElE,OAAO,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAI;QAC9C,IAAI,QAAQ,EAAE;AACZ,YAAA,OAAO,eAAe;QACxB;AAEA,QAAA,IAAI,UAAiB;QACrB,IAAI,UAAU,GAAsB,IAAI;QAExC,MAAM,KAAK,GAAG,MAAK;YACjB,aAAa,CAAC,UAAU,CAAC;YAEzB,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC;AACxC,YAAA,UAAU,GAAG,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,SAAS;AAC7D,QAAA,CAAC;AAED,QAAA,IAAI,QAAQ,CAAC,UAAU,CAAC,EAAE;AACxB,YAAA,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC;QACzC;QAEA,MAAM,OAAO,GAAG,MAAK;YACnB,aAAa,CAAC,UAAU,CAAC;YACzB,UAAU,GAAG,SAAS;YACtB,UAAU,EAAE,OAAO,EAAE;AACvB,QAAA,CAAC;QAED,SAAS,CAAC,OAAO,CAAC;AAElB,QAAA,IAAI,OAAO,EAAE,SAAS,EAAE;AACtB,YAAA,QAAQ,EAAE;QACZ;AAEA,QAAA,KAAK,EAAE;QAEP,OAAO,EAAE,OAAO,EAAE;AACpB,IAAA,CAAC,CAAC;AACJ;;AC3FA;;AAEG;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signality-core-scheduling-throttle-callback.mjs","sources":["../../../projects/core/scheduling/throttle-callback/index.ts","../../../projects/core/scheduling/throttle-callback/signality-core-scheduling-throttle-callback.ts"],"sourcesContent":["import type { MaybeSignal, WithInjector } from '@signality/core/types';\nimport { setupContext, type Timer
|
|
1
|
+
{"version":3,"file":"signality-core-scheduling-throttle-callback.mjs","sources":["../../../projects/core/scheduling/throttle-callback/index.ts","../../../projects/core/scheduling/throttle-callback/signality-core-scheduling-throttle-callback.ts"],"sourcesContent":["import type { MaybeSignal, WithInjector } from '@signality/core/types';\nimport { setupContext, type Timer } from '@signality/core/internal';\nimport { toValue } from '@signality/core/utilities';\n\n/**\n * Creates a throttled version of a callback function.\n * The callback will be executed at most once per specified wait interval.\n *\n * @param callback - The function to throttle\n * @param wait - Throttle interval in milliseconds (can be a reactive signal)\n * @param options - Optional configuration including injector\n * @returns A throttled version of the callback function\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <div (scroll)=\"handleScroll($event)\">\n * Scrollable content\n * </div>\n * `,\n * })\n * export class ScrollComponent {\n * readonly throttleTime = input(300);\n * readonly scrollChange = output<Event>();\n *\n * readonly handleScroll = throttleCallback(e => {\n * this.scrollChange.emit(e);\n * }, this.throttleTime);\n * }\n * ```\n */\nexport function throttleCallback<T extends (...args: any[]) => any>(\n callback: T,\n wait: MaybeSignal<number>,\n options?: WithInjector\n): T {\n const { runInContext } = setupContext(options?.injector, throttleCallback);\n\n return runInContext(({ isServer, onCleanup }) => {\n if (isServer) {\n return callback;\n }\n\n let timer: Timer;\n let isThrottled: boolean;\n let lastArgs: Parameters<T>;\n\n onCleanup(() => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n });\n\n return new Proxy(callback, {\n apply(target, thisArg, args) {\n lastArgs = args as Parameters<T>;\n\n if (isThrottled) {\n return;\n }\n\n target.apply(thisArg, lastArgs);\n isThrottled = true;\n\n timer = setTimeout(() => {\n isThrottled = false;\n }, toValue.untracked(wait));\n },\n });\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;SACa,gBAAgB,CAC9B,QAAW,EACX,IAAyB,EACzB,OAAsB,EAAA;AAEtB,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,CAAC;IAE1E,OAAO,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAI;QAC9C,IAAI,QAAQ,EAAE;AACZ,YAAA,OAAO,QAAQ;QACjB;AAEA,QAAA,IAAI,KAAY;AAChB,QAAA,IAAI,WAAoB;AACxB,QAAA,IAAI,QAAuB;QAE3B,SAAS,CAAC,MAAK;AACb,YAAA,IAAI,KAAK,KAAK,SAAS,EAAE;gBACvB,YAAY,CAAC,KAAK,CAAC;YACrB;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE;AACzB,YAAA,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAA;gBACzB,QAAQ,GAAG,IAAqB;gBAEhC,IAAI,WAAW,EAAE;oBACf;gBACF;AAEA,gBAAA,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC;gBAC/B,WAAW,GAAG,IAAI;AAElB,gBAAA,KAAK,GAAG,UAAU,CAAC,MAAK;oBACtB,WAAW,GAAG,KAAK;gBACrB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;AACF,SAAA,CAAC;AACJ,IAAA,CAAC,CAAC;AACJ;;ACvEA;;AAEG;;;;"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { inject, InjectionToken, isSignal, untracked } from '@angular/core';
|
|
2
|
+
import { setupContext, unrefElement } from '@signality/core/internal';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Creates a unique ID string with optional prefix.
|
|
6
|
+
*
|
|
7
|
+
* @param options - Optional configuration with prefix and injector
|
|
8
|
+
* @returns A unique ID string
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* @Component({
|
|
13
|
+
* template: `
|
|
14
|
+
* <input [id]="inputId" />
|
|
15
|
+
* `
|
|
16
|
+
* })
|
|
17
|
+
* export class MyInput {
|
|
18
|
+
* readonly inputId = generateId();
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
function generateId(options) {
|
|
23
|
+
const { runInContext } = setupContext(options?.injector, generateId);
|
|
24
|
+
return runInContext(() => {
|
|
25
|
+
const factoryFn = inject(GENERATE_ID_FACTORY);
|
|
26
|
+
return factoryFn(options?.prefix);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const GENERATE_ID_FACTORY = new InjectionToken(typeof ngDevMode !== 'undefined' && ngDevMode ? 'GENERATE_ID_FACTORY' : '', {
|
|
30
|
+
providedIn: 'platform',
|
|
31
|
+
factory: () => {
|
|
32
|
+
let i = 0;
|
|
33
|
+
return (prefix = 'app') => `${prefix}-${Date.now()}${i++}`;
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const toValue = (() => {
|
|
38
|
+
const fn = toValueFn;
|
|
39
|
+
fn.untracked = v => toValueFn(v, true);
|
|
40
|
+
return fn;
|
|
41
|
+
})();
|
|
42
|
+
function toValueFn(maybeSignal, untracked$1 = false) {
|
|
43
|
+
if (isSignal(maybeSignal)) {
|
|
44
|
+
return untracked$1 ? untracked(maybeSignal) : maybeSignal();
|
|
45
|
+
}
|
|
46
|
+
return maybeSignal;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const toElement = (() => {
|
|
50
|
+
const fn = toElementFn;
|
|
51
|
+
fn.untracked = v => toElementFn(v, true);
|
|
52
|
+
return fn;
|
|
53
|
+
})();
|
|
54
|
+
function toElementFn(maybeSignal, untracked = false) {
|
|
55
|
+
const raw = untracked ? toValue.untracked(maybeSignal) : toValue(maybeSignal);
|
|
56
|
+
return unrefElement(raw);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Generated bundle index. Do not edit.
|
|
61
|
+
*/
|
|
62
|
+
|
|
63
|
+
export { GENERATE_ID_FACTORY, generateId, toElement, toValue };
|
|
64
|
+
//# sourceMappingURL=signality-core-utilities.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signality-core-utilities.mjs","sources":["../../../projects/core/utilities/generate-id.ts","../../../projects/core/utilities/to-value.ts","../../../projects/core/utilities/to-element.ts","../../../projects/core/utilities/signality-core-utilities.ts"],"sourcesContent":["import { inject, InjectionToken } from '@angular/core';\nimport { setupContext } from '@signality/core/internal';\nimport type { WithInjector } from '@signality/core/types';\n\nexport interface GenerateIdOptions extends WithInjector {\n /**\n * Optional prefix for the generated ID.\n * @default 'app'\n */\n readonly prefix?: string;\n}\n\n/**\n * Creates a unique ID string with optional prefix.\n *\n * @param options - Optional configuration with prefix and injector\n * @returns A unique ID string\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <input [id]=\"inputId\" />\n * `\n * })\n * export class MyInput {\n * readonly inputId = generateId();\n * }\n * ```\n */\nexport function generateId(options?: GenerateIdOptions): string {\n const { runInContext } = setupContext(options?.injector, generateId);\n\n return runInContext(() => {\n const factoryFn = inject(GENERATE_ID_FACTORY);\n return factoryFn(options?.prefix);\n });\n}\n\nexport const GENERATE_ID_FACTORY = new InjectionToken<(prefix?: string) => string>(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'GENERATE_ID_FACTORY' : '',\n {\n providedIn: 'platform',\n factory: () => {\n let i = 0;\n return (prefix = 'app') => `${prefix}-${Date.now()}${i++}`;\n },\n }\n);\n","import { isSignal, untracked as _untracked } from '@angular/core';\nimport type { MaybeSignal } from '@signality/core/types';\n\nexport interface ToValueFn {\n <T>(maybeSignal: MaybeSignal<T>): T;\n untracked: <T>(maybeSignal: MaybeSignal<T>) => T;\n}\n\nexport const toValue: ToValueFn = (() => {\n const fn = toValueFn as ToValueFn;\n fn.untracked = v => toValueFn(v, true);\n return fn;\n})();\n\nfunction toValueFn<T>(maybeSignal: MaybeSignal<T>, untracked = false): T {\n if (isSignal(maybeSignal)) {\n return untracked ? _untracked(maybeSignal) : maybeSignal();\n }\n return maybeSignal;\n}\n","import { type ElementRef, type Signal } from '@angular/core';\nimport { unrefElement } from '@signality/core/internal';\nimport type { MaybeElementSignal } from '@signality/core/types';\nimport { toValue } from './to-value';\n\nexport interface ToElementFn extends ToElementBase {\n untracked: ToElementBase;\n}\n\nexport interface ToElementBase {\n <T extends Element>(element: T | ElementRef<T>): T;\n <T extends Element>(element: Signal<T | ElementRef<T> | null>): T | null;\n <T extends Element>(element: Signal<T | ElementRef<T> | undefined>): T | undefined;\n <T extends Element>(element: Signal<T | ElementRef<T> | null | undefined>): T | null | undefined;\n <T extends Element>(element: T | ElementRef<T> | Signal<T | ElementRef<T> | null | undefined>):\n | T\n | null\n | undefined;\n}\n\nexport const toElement: ToElementFn = (() => {\n const fn = toElementFn as ToElementFn;\n fn.untracked = v => toElementFn(v, true);\n return fn;\n})();\n\nfunction toElementFn<T extends Element>(\n maybeSignal: MaybeElementSignal<T>,\n untracked = false\n): T | null | undefined {\n const raw = untracked ? toValue.untracked(maybeSignal) : toValue(maybeSignal);\n return unrefElement(raw);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["untracked","_untracked"],"mappings":";;;AAYA;;;;;;;;;;;;;;;;;AAiBG;AACG,SAAU,UAAU,CAAC,OAA2B,EAAA;AACpD,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC;IAEpE,OAAO,YAAY,CAAC,MAAK;AACvB,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC7C,QAAA,OAAO,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;AACnC,IAAA,CAAC,CAAC;AACJ;MAEa,mBAAmB,GAAG,IAAI,cAAc,CACnD,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,GAAG,qBAAqB,GAAG,EAAE,EAC1E;AACE,IAAA,UAAU,EAAE,UAAU;IACtB,OAAO,EAAE,MAAK;QACZ,IAAI,CAAC,GAAG,CAAC;AACT,QAAA,OAAO,CAAC,MAAM,GAAG,KAAK,KAAK,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;IAC5D,CAAC;AACF,CAAA;;ACvCI,MAAM,OAAO,GAAc,CAAC,MAAK;IACtC,MAAM,EAAE,GAAG,SAAsB;AACjC,IAAA,EAAE,CAAC,SAAS,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;AACtC,IAAA,OAAO,EAAE;AACX,CAAC;AAED,SAAS,SAAS,CAAI,WAA2B,EAAEA,WAAS,GAAG,KAAK,EAAA;AAClE,IAAA,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE;AACzB,QAAA,OAAOA,WAAS,GAAGC,SAAU,CAAC,WAAW,CAAC,GAAG,WAAW,EAAE;IAC5D;AACA,IAAA,OAAO,WAAW;AACpB;;ACCO,MAAM,SAAS,GAAgB,CAAC,MAAK;IAC1C,MAAM,EAAE,GAAG,WAA0B;AACrC,IAAA,EAAE,CAAC,SAAS,GAAG,CAAC,IAAI,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC;AACxC,IAAA,OAAO,EAAE;AACX,CAAC;AAED,SAAS,WAAW,CAClB,WAAkC,EAClC,SAAS,GAAG,KAAK,EAAA;AAEjB,IAAA,MAAM,GAAG,GAAG,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;AAC7E,IAAA,OAAO,YAAY,CAAC,GAAG,CAAC;AAC1B;;AChCA;;AAEG;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signality-core.mjs","sources":["../../../projects/core/signality-core.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"signality-core.mjs","sources":["../../../projects/core/signality-core.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;AAAA;;AAEG"}
|
package/index.d.ts
CHANGED
|
@@ -7,7 +7,5 @@ export * from './is-query-signal';
|
|
|
7
7
|
export * from './is-plain-object';
|
|
8
8
|
export * from './const-signal';
|
|
9
9
|
export * from './proxy-signal';
|
|
10
|
-
export * from './to-element';
|
|
11
|
-
export * from './to-value';
|
|
12
10
|
export * from './unref-element';
|
|
13
11
|
export * from './files/index';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@signality/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "Vyacheslav Borodin <https://github.com/vs-borodin>",
|
|
6
6
|
"description": "A foundational toolkit for Angular Signals",
|
|
@@ -76,6 +76,10 @@
|
|
|
76
76
|
"types": "./types/index.d.ts",
|
|
77
77
|
"default": "./fesm2022/signality-core-types.mjs"
|
|
78
78
|
},
|
|
79
|
+
"./utilities": {
|
|
80
|
+
"types": "./utilities/index.d.ts",
|
|
81
|
+
"default": "./fesm2022/signality-core-utilities.mjs"
|
|
82
|
+
},
|
|
79
83
|
"./browser/battery": {
|
|
80
84
|
"types": "./browser/battery/index.d.ts",
|
|
81
85
|
"default": "./fesm2022/signality-core-browser-battery.mjs"
|
|
@@ -300,14 +304,14 @@
|
|
|
300
304
|
"types": "./reactivity/watcher/index.d.ts",
|
|
301
305
|
"default": "./fesm2022/signality-core-reactivity-watcher.mjs"
|
|
302
306
|
},
|
|
303
|
-
"./router/params": {
|
|
304
|
-
"types": "./router/params/index.d.ts",
|
|
305
|
-
"default": "./fesm2022/signality-core-router-params.mjs"
|
|
306
|
-
},
|
|
307
307
|
"./router/fragment": {
|
|
308
308
|
"types": "./router/fragment/index.d.ts",
|
|
309
309
|
"default": "./fesm2022/signality-core-router-fragment.mjs"
|
|
310
310
|
},
|
|
311
|
+
"./router/params": {
|
|
312
|
+
"types": "./router/params/index.d.ts",
|
|
313
|
+
"default": "./fesm2022/signality-core-router-params.mjs"
|
|
314
|
+
},
|
|
311
315
|
"./router/query-params": {
|
|
312
316
|
"types": "./router/query-params/index.d.ts",
|
|
313
317
|
"default": "./fesm2022/signality-core-router-query-params.mjs"
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
import type { WithInjector } from '@signality/core/types';
|
|
3
|
+
export interface GenerateIdOptions extends WithInjector {
|
|
4
|
+
/**
|
|
5
|
+
* Optional prefix for the generated ID.
|
|
6
|
+
* @default 'app'
|
|
7
|
+
*/
|
|
8
|
+
readonly prefix?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Creates a unique ID string with optional prefix.
|
|
12
|
+
*
|
|
13
|
+
* @param options - Optional configuration with prefix and injector
|
|
14
|
+
* @returns A unique ID string
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* @Component({
|
|
19
|
+
* template: `
|
|
20
|
+
* <input [id]="inputId" />
|
|
21
|
+
* `
|
|
22
|
+
* })
|
|
23
|
+
* export class MyInput {
|
|
24
|
+
* readonly inputId = generateId();
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function generateId(options?: GenerateIdOptions): string;
|
|
29
|
+
export declare const GENERATE_ID_FACTORY: InjectionToken<(prefix?: string) => string>;
|
|
File without changes
|
|
File without changes
|