@bquery/bquery 1.0.2 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +61 -7
  2. package/dist/component/index.d.ts +8 -0
  3. package/dist/component/index.d.ts.map +1 -1
  4. package/dist/component.es.mjs +80 -53
  5. package/dist/component.es.mjs.map +1 -1
  6. package/dist/core/collection.d.ts +46 -0
  7. package/dist/core/collection.d.ts.map +1 -1
  8. package/dist/core/element.d.ts +124 -22
  9. package/dist/core/element.d.ts.map +1 -1
  10. package/dist/core/utils.d.ts +13 -0
  11. package/dist/core/utils.d.ts.map +1 -1
  12. package/dist/core.es.mjs +298 -55
  13. package/dist/core.es.mjs.map +1 -1
  14. package/dist/full.d.ts +2 -2
  15. package/dist/full.d.ts.map +1 -1
  16. package/dist/full.es.mjs +38 -33
  17. package/dist/full.iife.js +1 -1
  18. package/dist/full.iife.js.map +1 -1
  19. package/dist/full.umd.js +1 -1
  20. package/dist/full.umd.js.map +1 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.es.mjs +38 -33
  23. package/dist/reactive/index.d.ts +2 -2
  24. package/dist/reactive/index.d.ts.map +1 -1
  25. package/dist/reactive/signal.d.ts +107 -0
  26. package/dist/reactive/signal.d.ts.map +1 -1
  27. package/dist/reactive.es.mjs +92 -55
  28. package/dist/reactive.es.mjs.map +1 -1
  29. package/dist/security/sanitize.d.ts.map +1 -1
  30. package/dist/security.es.mjs +136 -66
  31. package/dist/security.es.mjs.map +1 -1
  32. package/package.json +16 -16
  33. package/src/component/index.ts +414 -360
  34. package/src/core/collection.ts +454 -339
  35. package/src/core/element.ts +740 -493
  36. package/src/core/utils.ts +444 -425
  37. package/src/full.ts +106 -101
  38. package/src/index.ts +27 -27
  39. package/src/reactive/index.ts +22 -9
  40. package/src/reactive/signal.ts +506 -347
  41. package/src/security/sanitize.ts +553 -446
@@ -1 +1 @@
1
- {"version":3,"file":"core.es.mjs","sources":["../src/core/shared.ts","../src/core/element.ts","../src/core/collection.ts","../src/core/selector.ts","../src/core/utils.ts"],"sourcesContent":["/**\n * Shared helpers for element wrappers.\n */\nexport type ElementList = Element[];\n\nexport const toElementList = (input: Element | ElementList): ElementList =>\n Array.isArray(input) ? input : [input];\n\nexport const applyAll = (elements: ElementList, action: (el: Element) => void) => {\n for (const el of elements) {\n action(el);\n }\n};\n","import { sanitizeHtml } from '../security/sanitize';\nimport { applyAll, toElementList } from './shared';\n\n/**\n * Wrapper for a single DOM element.\n * Provides a chainable, jQuery-like API for DOM manipulation.\n *\n * This class encapsulates a DOM element and provides methods for:\n * - Class manipulation (addClass, removeClass, toggleClass)\n * - Attribute and property access (attr, prop, data)\n * - Content manipulation (text, html, append, prepend)\n * - Style manipulation (css)\n * - Event handling (on, off, once, trigger)\n * - DOM traversal (find, closest, parent, children, siblings)\n *\n * All mutating methods return `this` for method chaining.\n *\n * @example\n * ```ts\n * $('#button')\n * .addClass('active')\n * .css({ color: 'blue' })\n * .on('click', () => console.log('clicked'));\n * ```\n */\nexport class BQueryElement {\n /**\n * Creates a new BQueryElement wrapper.\n * @param element - The DOM element to wrap\n */\n constructor(private readonly element: Element) {}\n\n /**\n * Exposes the raw DOM element when direct access is needed.\n * Use sparingly; prefer the wrapper methods for consistency.\n */\n get raw(): Element {\n return this.element;\n }\n\n /**\n * Exposes the underlying DOM element.\n * Provided for spec compatibility and read-only access.\n */\n get node(): Element {\n return this.element;\n }\n\n /** Add one or more classes. */\n addClass(...classNames: string[]): this {\n this.element.classList.add(...classNames);\n return this;\n }\n\n /** Remove one or more classes. */\n removeClass(...classNames: string[]): this {\n this.element.classList.remove(...classNames);\n return this;\n }\n\n /** Toggle a class by name. */\n toggleClass(className: string, force?: boolean): this {\n this.element.classList.toggle(className, force);\n return this;\n }\n\n /** Get or set an attribute. */\n attr(name: string, value?: string): string | this {\n if (value === undefined) {\n return this.element.getAttribute(name) ?? '';\n }\n this.element.setAttribute(name, value);\n return this;\n }\n\n /** Get or set a property. */\n prop<T extends keyof Element>(name: T, value?: Element[T]): Element[T] | this {\n if (value === undefined) {\n return this.element[name];\n }\n this.element[name] = value;\n return this;\n }\n\n /** Read or write data attributes in camelCase. */\n data(name: string, value?: string): string | this {\n const key = name.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\n if (value === undefined) {\n return this.element.getAttribute(`data-${key}`) ?? '';\n }\n this.element.setAttribute(`data-${key}`, value);\n return this;\n }\n\n /** Get or set text content. */\n text(value?: string): string | this {\n if (value === undefined) {\n return this.element.textContent ?? '';\n }\n this.element.textContent = value;\n return this;\n }\n\n /** Set HTML content using a sanitized string. */\n /**\n * Sets sanitized HTML content on the element.\n * Uses the security module to sanitize input and prevent XSS attacks.\n *\n * @param value - The HTML string to set (will be sanitized)\n * @returns The instance for method chaining\n *\n * @example\n * ```ts\n * $('#content').html('<strong>Hello</strong>');\n * ```\n */\n html(value: string): this {\n this.element.innerHTML = sanitizeHtml(value);\n return this;\n }\n\n /**\n * Sets HTML content without sanitization.\n * Use only when you trust the HTML source completely.\n *\n * @param value - The raw HTML string to set\n * @returns The instance for method chaining\n *\n * @warning This method bypasses XSS protection. Use with caution.\n */\n htmlUnsafe(value: string): this {\n this.element.innerHTML = value;\n return this;\n }\n\n /**\n * Gets or sets CSS styles on the element.\n *\n * @param property - A CSS property name or an object of property-value pairs\n * @param value - The value when setting a single property\n * @returns The instance for method chaining\n *\n * @example\n * ```ts\n * // Single property\n * $('#box').css('color', 'red');\n *\n * // Multiple properties\n * $('#box').css({ color: 'red', 'font-size': '16px' });\n * ```\n */\n css(property: string | Record<string, string>, value?: string): this {\n if (typeof property === 'string') {\n if (value !== undefined) {\n (this.element as HTMLElement).style.setProperty(property, value);\n }\n return this;\n }\n\n for (const [key, val] of Object.entries(property)) {\n (this.element as HTMLElement).style.setProperty(key, val);\n }\n return this;\n }\n\n /**\n * Appends HTML or elements to the end of the element.\n *\n * @param content - HTML string or element(s) to append\n * @returns The instance for method chaining\n */\n append(content: string | Element | Element[]): this {\n this.insertContent(content, 'beforeend');\n return this;\n }\n\n /**\n * Prepends HTML or elements to the beginning of the element.\n *\n * @param content - HTML string or element(s) to prepend\n * @returns The instance for method chaining\n */\n prepend(content: string | Element | Element[]): this {\n this.insertContent(content, 'afterbegin');\n return this;\n }\n\n /**\n * Inserts content before this element.\n *\n * @param content - HTML string or element(s) to insert\n * @returns The instance for method chaining\n */\n before(content: string | Element | Element[]): this {\n this.insertContent(content, 'beforebegin');\n return this;\n }\n\n /**\n * Inserts content after this element.\n *\n * @param content - HTML string or element(s) to insert\n * @returns The instance for method chaining\n */\n after(content: string | Element | Element[]): this {\n this.insertContent(content, 'afterend');\n return this;\n }\n\n /**\n * Removes the element from the DOM.\n *\n * @returns The instance for method chaining (though element is now detached)\n */\n remove(): this {\n this.element.remove();\n return this;\n }\n\n /**\n * Clears all child nodes from the element.\n *\n * @returns The instance for method chaining\n */\n empty(): this {\n this.element.innerHTML = '';\n return this;\n }\n\n /**\n * Clones the element, optionally with all descendants.\n *\n * @param deep - If true, clone all descendants (default: true)\n * @returns A new BQueryElement wrapping the cloned element\n */\n clone(deep: boolean = true): BQueryElement {\n return new BQueryElement(this.element.cloneNode(deep) as Element);\n }\n\n /**\n * Finds all descendant elements matching the selector.\n *\n * @param selector - CSS selector to match\n * @returns Array of matching elements\n */\n find(selector: string): Element[] {\n return Array.from(this.element.querySelectorAll(selector));\n }\n\n /**\n * Finds the first descendant element matching the selector.\n *\n * @param selector - CSS selector to match\n * @returns The first matching element or null\n */\n findOne(selector: string): Element | null {\n return this.element.querySelector(selector);\n }\n\n /**\n * Finds the closest ancestor matching the selector.\n *\n * @param selector - CSS selector to match\n * @returns The matching ancestor or null\n */\n closest(selector: string): Element | null {\n return this.element.closest(selector);\n }\n\n /**\n * Gets the parent element.\n *\n * @returns The parent element or null\n */\n parent(): Element | null {\n return this.element.parentElement;\n }\n\n /**\n * Gets all child elements.\n *\n * @returns Array of child elements\n */\n children(): Element[] {\n return Array.from(this.element.children);\n }\n\n /**\n * Gets all sibling elements.\n *\n * @returns Array of sibling elements (excluding this element)\n */\n siblings(): Element[] {\n const parent = this.element.parentElement;\n if (!parent) return [];\n return Array.from(parent.children).filter((child) => child !== this.element);\n }\n\n /**\n * Gets the next sibling element.\n *\n * @returns The next sibling element or null\n */\n next(): Element | null {\n return this.element.nextElementSibling;\n }\n\n /**\n * Gets the previous sibling element.\n *\n * @returns The previous sibling element or null\n */\n prev(): Element | null {\n return this.element.previousElementSibling;\n }\n\n /**\n * Adds an event listener.\n *\n * @param event - Event type to listen for\n * @param handler - Event handler function\n * @returns The instance for method chaining\n */\n on(event: string, handler: EventListenerOrEventListenerObject): this {\n this.element.addEventListener(event, handler);\n return this;\n }\n\n /**\n * Adds a one-time event listener that removes itself after firing.\n *\n * @param event - Event type to listen for\n * @param handler - Event handler function\n * @returns The instance for method chaining\n */\n once(event: string, handler: EventListener): this {\n this.element.addEventListener(event, handler, { once: true });\n return this;\n }\n\n /**\n * Removes an event listener.\n *\n * @param event - Event type\n * @param handler - The handler to remove\n * @returns The instance for method chaining\n */\n off(event: string, handler: EventListenerOrEventListenerObject): this {\n this.element.removeEventListener(event, handler);\n return this;\n }\n\n /**\n * Triggers a custom event on the element.\n *\n * @param event - Event type to trigger\n * @param detail - Optional detail data to include with the event\n * @returns The instance for method chaining\n */\n trigger(event: string, detail?: unknown): this {\n this.element.dispatchEvent(new CustomEvent(event, { detail, bubbles: true, cancelable: true }));\n return this;\n }\n\n /**\n * Checks if the element matches a CSS selector.\n *\n * @param selector - CSS selector to match against\n * @returns True if the element matches the selector\n */\n matches(selector: string): boolean {\n return this.element.matches(selector);\n }\n\n /**\n * Checks if the element has a specific class.\n *\n * @param className - Class name to check\n * @returns True if the element has the class\n */\n hasClass(className: string): boolean {\n return this.element.classList.contains(className);\n }\n\n /**\n * Shows the element by removing the hidden attribute and setting display.\n *\n * @param display - Optional display value (default: '')\n * @returns The instance for method chaining\n */\n show(display: string = ''): this {\n this.element.removeAttribute('hidden');\n (this.element as HTMLElement).style.display = display;\n return this;\n }\n\n /**\n * Hides the element by setting display to 'none'.\n *\n * @returns The instance for method chaining\n */\n hide(): this {\n (this.element as HTMLElement).style.display = 'none';\n return this;\n }\n\n /**\n * Toggles the visibility of the element.\n *\n * @param force - Optional force show (true) or hide (false)\n * @returns The instance for method chaining\n */\n toggle(force?: boolean): this {\n const isHidden = (this.element as HTMLElement).style.display === 'none';\n const shouldShow = force ?? isHidden;\n return shouldShow ? this.show() : this.hide();\n }\n\n /**\n * Focuses the element.\n *\n * @returns The instance for method chaining\n */\n focus(): this {\n (this.element as HTMLElement).focus();\n return this;\n }\n\n /**\n * Blurs (unfocuses) the element.\n *\n * @returns The instance for method chaining\n */\n blur(): this {\n (this.element as HTMLElement).blur();\n return this;\n }\n\n /**\n * Gets or sets the value of form elements.\n *\n * @param newValue - Optional value to set\n * @returns The current value when getting, or the instance when setting\n */\n val(newValue?: string): string | this {\n const input = this.element as HTMLInputElement;\n if (newValue === undefined) {\n return input.value ?? '';\n }\n input.value = newValue;\n return this;\n }\n\n /**\n * Gets the bounding client rectangle of the element.\n *\n * @returns The element's bounding rectangle\n */\n rect(): DOMRect {\n return this.element.getBoundingClientRect();\n }\n\n /**\n * Gets the offset dimensions (width, height, top, left).\n *\n * @returns Object with offset dimensions\n */\n offset(): { width: number; height: number; top: number; left: number } {\n const el = this.element as HTMLElement;\n return {\n width: el.offsetWidth,\n height: el.offsetHeight,\n top: el.offsetTop,\n left: el.offsetLeft,\n };\n }\n\n /**\n * Internal method to insert content at a specified position.\n * @internal\n */\n private insertContent(content: string | Element | Element[], position: InsertPosition) {\n if (typeof content === 'string') {\n this.element.insertAdjacentHTML(position, sanitizeHtml(content));\n return;\n }\n\n const elements = toElementList(content);\n applyAll(elements, (el) => {\n this.element.insertAdjacentElement(position, el);\n });\n }\n}\n","import { sanitizeHtml } from '../security/sanitize';\nimport { BQueryElement } from './element';\nimport { applyAll } from './shared';\n\n/**\n * Wrapper for multiple DOM elements.\n * Provides batch operations on a collection of elements with chainable API.\n *\n * This class enables jQuery-like operations across multiple elements:\n * - All mutating methods apply to every element in the collection\n * - Getter methods return data from the first element\n * - Supports iteration via forEach, map, filter, and reduce\n *\n * @example\n * ```ts\n * $$('.items')\n * .addClass('highlight')\n * .css({ opacity: '0.8' })\n * .on('click', () => console.log('clicked'));\n * ```\n */\nexport class BQueryCollection {\n /**\n * Creates a new collection wrapper.\n * @param elements - Array of DOM elements to wrap\n */\n constructor(public readonly elements: Element[]) {}\n\n /**\n * Gets the number of elements in the collection.\n */\n get length(): number {\n return this.elements.length;\n }\n\n /**\n * Gets the first element in the collection, if any.\n * @internal\n */\n private first(): Element | undefined {\n return this.elements[0];\n }\n\n /**\n * Gets a single element as a BQueryElement wrapper.\n *\n * @param index - Zero-based index of the element\n * @returns BQueryElement wrapper or undefined if out of range\n */\n eq(index: number): BQueryElement | undefined {\n const el = this.elements[index];\n return el ? new BQueryElement(el) : undefined;\n }\n\n /**\n * Gets the first element as a BQueryElement wrapper.\n *\n * @returns BQueryElement wrapper or undefined if empty\n */\n firstEl(): BQueryElement | undefined {\n return this.eq(0);\n }\n\n /**\n * Gets the last element as a BQueryElement wrapper.\n *\n * @returns BQueryElement wrapper or undefined if empty\n */\n lastEl(): BQueryElement | undefined {\n return this.eq(this.elements.length - 1);\n }\n\n /**\n * Iterates over each element in the collection.\n *\n * @param callback - Function to call for each wrapped element\n * @returns The instance for method chaining\n */\n each(callback: (element: BQueryElement, index: number) => void): this {\n this.elements.forEach((element, index) => {\n callback(new BQueryElement(element), index);\n });\n return this;\n }\n\n /**\n * Maps each element to a new value.\n *\n * @param callback - Function to transform each element\n * @returns Array of transformed values\n */\n map<T>(callback: (element: Element, index: number) => T): T[] {\n return this.elements.map(callback);\n }\n\n /**\n * Filters elements based on a predicate.\n *\n * @param predicate - Function to test each element\n * @returns New BQueryCollection with matching elements\n */\n filter(predicate: (element: Element, index: number) => boolean): BQueryCollection {\n return new BQueryCollection(this.elements.filter(predicate));\n }\n\n /**\n * Reduces the collection to a single value.\n *\n * @param callback - Reducer function\n * @param initialValue - Initial accumulator value\n * @returns Accumulated result\n */\n reduce<T>(callback: (accumulator: T, element: Element, index: number) => T, initialValue: T): T {\n return this.elements.reduce(callback, initialValue);\n }\n\n /**\n * Converts the collection to an array of BQueryElement wrappers.\n *\n * @returns Array of BQueryElement instances\n */\n toArray(): BQueryElement[] {\n return this.elements.map((el) => new BQueryElement(el));\n }\n\n /** Add one or more classes to all elements. */\n addClass(...classNames: string[]): this {\n applyAll(this.elements, (el) => el.classList.add(...classNames));\n return this;\n }\n\n /** Remove one or more classes from all elements. */\n removeClass(...classNames: string[]): this {\n applyAll(this.elements, (el) => el.classList.remove(...classNames));\n return this;\n }\n\n /** Toggle a class on all elements. */\n toggleClass(className: string, force?: boolean): this {\n applyAll(this.elements, (el) => el.classList.toggle(className, force));\n return this;\n }\n\n /**\n * Sets an attribute on all elements or gets from first.\n *\n * @param name - Attribute name\n * @param value - Value to set (optional)\n * @returns Attribute value when getting, instance when setting\n */\n attr(name: string, value?: string): string | this {\n if (value === undefined) {\n return this.first()?.getAttribute(name) ?? '';\n }\n applyAll(this.elements, (el) => el.setAttribute(name, value));\n return this;\n }\n\n /**\n * Removes an attribute from all elements.\n *\n * @param name - Attribute name to remove\n * @returns The instance for method chaining\n */\n removeAttr(name: string): this {\n applyAll(this.elements, (el) => el.removeAttribute(name));\n return this;\n }\n\n /**\n * Sets text content on all elements or gets from first.\n *\n * @param value - Text to set (optional)\n * @returns Text content when getting, instance when setting\n */\n text(value?: string): string | this {\n if (value === undefined) {\n return this.first()?.textContent ?? '';\n }\n applyAll(this.elements, (el) => {\n el.textContent = value;\n });\n return this;\n }\n\n /**\n * Sets sanitized HTML on all elements or gets from first.\n *\n * @param value - HTML to set (optional, will be sanitized)\n * @returns HTML content when getting, instance when setting\n */\n html(value?: string): string | this {\n if (value === undefined) {\n return this.first()?.innerHTML ?? '';\n }\n const sanitized = sanitizeHtml(value);\n applyAll(this.elements, (el) => {\n el.innerHTML = sanitized;\n });\n return this;\n }\n\n /**\n * Sets HTML on all elements without sanitization.\n *\n * @param value - Raw HTML to set\n * @returns The instance for method chaining\n * @warning Bypasses XSS protection\n */\n htmlUnsafe(value: string): this {\n applyAll(this.elements, (el) => {\n el.innerHTML = value;\n });\n return this;\n }\n\n /**\n * Applies CSS styles to all elements.\n *\n * @param property - Property name or object of properties\n * @param value - Value when setting single property\n * @returns The instance for method chaining\n */\n css(property: string | Record<string, string>, value?: string): this {\n if (typeof property === 'string') {\n if (value !== undefined) {\n applyAll(this.elements, (el) => {\n (el as HTMLElement).style.setProperty(property, value);\n });\n }\n return this;\n }\n\n applyAll(this.elements, (el) => {\n for (const [key, val] of Object.entries(property)) {\n (el as HTMLElement).style.setProperty(key, val);\n }\n });\n return this;\n }\n\n /**\n * Shows all elements.\n *\n * @param display - Optional display value (default: '')\n * @returns The instance for method chaining\n */\n show(display: string = ''): this {\n applyAll(this.elements, (el) => {\n el.removeAttribute('hidden');\n (el as HTMLElement).style.display = display;\n });\n return this;\n }\n\n /**\n * Hides all elements.\n *\n * @returns The instance for method chaining\n */\n hide(): this {\n applyAll(this.elements, (el) => {\n (el as HTMLElement).style.display = 'none';\n });\n return this;\n }\n\n /**\n * Adds an event listener to all elements.\n *\n * @param event - Event type\n * @param handler - Event handler\n * @returns The instance for method chaining\n */\n on(event: string, handler: EventListenerOrEventListenerObject): this {\n applyAll(this.elements, (el) => el.addEventListener(event, handler));\n return this;\n }\n\n /**\n * Adds a one-time event listener to all elements.\n *\n * @param event - Event type\n * @param handler - Event handler\n * @returns The instance for method chaining\n */\n once(event: string, handler: EventListener): this {\n applyAll(this.elements, (el) => el.addEventListener(event, handler, { once: true }));\n return this;\n }\n\n /**\n * Removes an event listener from all elements.\n *\n * @param event - Event type\n * @param handler - The handler to remove\n * @returns The instance for method chaining\n */\n off(event: string, handler: EventListenerOrEventListenerObject): this {\n applyAll(this.elements, (el) => el.removeEventListener(event, handler));\n return this;\n }\n\n /**\n * Triggers a custom event on all elements.\n *\n * @param event - Event type\n * @param detail - Optional event detail\n * @returns The instance for method chaining\n */\n trigger(event: string, detail?: unknown): this {\n applyAll(this.elements, (el) => {\n el.dispatchEvent(new CustomEvent(event, { detail, bubbles: true, cancelable: true }));\n });\n return this;\n }\n\n /**\n * Removes all elements from the DOM.\n *\n * @returns The instance for method chaining\n */\n remove(): this {\n applyAll(this.elements, (el) => el.remove());\n return this;\n }\n\n /**\n * Clears all child nodes from all elements.\n *\n * @returns The instance for method chaining\n */\n empty(): this {\n applyAll(this.elements, (el) => {\n el.innerHTML = '';\n });\n return this;\n }\n}\n","import { BQueryCollection } from './collection';\nimport { BQueryElement } from './element';\n\n/**\n * Select a single element. Returns a wrapper for chainable operations.\n */\nexport const $ = (selector: string | Element): BQueryElement => {\n if (typeof selector !== 'string') {\n return new BQueryElement(selector);\n }\n const element = document.querySelector(selector);\n if (!element) {\n throw new Error(`bQuery: element not found for selector \"${selector}\"`);\n }\n return new BQueryElement(element);\n};\n\n/**\n * Select multiple elements. Returns a collection wrapper.\n */\nexport const $$ = (selector: string | Element[] | NodeListOf<Element>): BQueryCollection => {\n if (Array.isArray(selector)) {\n return new BQueryCollection(selector);\n }\n if (selector instanceof NodeList) {\n return new BQueryCollection(Array.from(selector));\n }\n return new BQueryCollection(Array.from(document.querySelectorAll(selector)));\n};\n","/**\n * Utility helpers used across the framework.\n * These are intentionally small and framework-agnostic to keep the core tiny.\n *\n * @module bquery/core/utils\n */\n\n/**\n * Utility object containing common helper functions.\n * All utilities are designed to be tree-shakeable and have zero dependencies.\n */\nexport const utils = {\n /**\n * Creates a deep clone using structuredClone if available, otherwise fallback to JSON.\n *\n * @template T - The type of value being cloned\n * @param value - The value to clone\n * @returns A deep copy of the value\n *\n * @example\n * ```ts\n * const original = { nested: { value: 1 } };\n * const copy = utils.clone(original);\n * copy.nested.value = 2;\n * console.log(original.nested.value); // 1\n * ```\n */\n clone<T>(value: T): T {\n if (typeof structuredClone === 'function') {\n return structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as T;\n },\n\n /**\n * Deep-merges plain objects into a new object.\n * Later sources override earlier ones for primitive values.\n * Objects are recursively merged.\n *\n * @template T - The type of the merged object\n * @param sources - Objects to merge\n * @returns A new object with all sources merged\n *\n * @example\n * ```ts\n * const result = utils.merge(\n * { a: 1, nested: { x: 1 } },\n * { b: 2, nested: { y: 2 } }\n * );\n * // Result: { a: 1, b: 2, nested: { x: 1, y: 2 } }\n * ```\n */\n merge<T extends Record<string, unknown>>(...sources: T[]): T {\n const result: Record<string, unknown> = {};\n for (const source of sources) {\n for (const [key, value] of Object.entries(source)) {\n if (utils.isPlainObject(value) && utils.isPlainObject(result[key])) {\n result[key] = utils.merge(\n result[key] as Record<string, unknown>,\n value as Record<string, unknown>\n );\n } else {\n result[key] = value;\n }\n }\n }\n return result as T;\n },\n\n /**\n * Creates a debounced function that delays execution until after\n * the specified delay has elapsed since the last call.\n *\n * @template TArgs - The argument types of the function\n * @param fn - The function to debounce\n * @param delayMs - Delay in milliseconds\n * @returns A debounced version of the function\n *\n * @example\n * ```ts\n * const search = utils.debounce((query: string) => {\n * console.log('Searching:', query);\n * }, 300);\n *\n * search('h');\n * search('he');\n * search('hello'); // Only this call executes after 300ms\n * ```\n */\n debounce<TArgs extends unknown[]>(\n fn: (...args: TArgs) => void,\n delayMs: number\n ): (...args: TArgs) => void {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n return (...args: TArgs) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => fn(...args), delayMs);\n };\n },\n\n /**\n * Creates a throttled function that runs at most once per interval.\n *\n * @template TArgs - The argument types of the function\n * @param fn - The function to throttle\n * @param intervalMs - Minimum interval between calls in milliseconds\n * @returns A throttled version of the function\n *\n * @example\n * ```ts\n * const handleScroll = utils.throttle(() => {\n * console.log('Scroll position:', window.scrollY);\n * }, 100);\n *\n * window.addEventListener('scroll', handleScroll);\n * ```\n */\n throttle<TArgs extends unknown[]>(\n fn: (...args: TArgs) => void,\n intervalMs: number\n ): (...args: TArgs) => void {\n let lastRun = 0;\n return (...args: TArgs) => {\n const now = Date.now();\n if (now - lastRun >= intervalMs) {\n lastRun = now;\n fn(...args);\n }\n };\n },\n\n /**\n * Creates a stable unique ID for DOM usage.\n *\n * @param prefix - Optional prefix for the ID (default: 'bQuery')\n * @returns A unique identifier string\n *\n * @example\n * ```ts\n * const id = utils.uid('modal'); // 'modal_x7k2m9p'\n * ```\n */\n uid(prefix = 'bQuery'): string {\n return `${prefix}_${Math.random().toString(36).slice(2, 9)}`;\n },\n\n /**\n * Checks if a value is a DOM Element.\n *\n * @param value - The value to check\n * @returns True if the value is an Element\n */\n isElement(value: unknown): value is Element {\n return value instanceof Element;\n },\n\n /**\n * Checks if a value is a BQueryCollection-like object.\n *\n * @param value - The value to check\n * @returns True if the value has an elements array property\n */\n isCollection(value: unknown): value is { elements: Element[] } {\n return Boolean(value && typeof value === 'object' && 'elements' in (value as object));\n },\n\n /**\n * Checks for emptiness across common value types.\n *\n * @param value - The value to check\n * @returns True if the value is empty (null, undefined, empty string, empty array, or empty object)\n *\n * @example\n * ```ts\n * utils.isEmpty(''); // true\n * utils.isEmpty([]); // true\n * utils.isEmpty({}); // true\n * utils.isEmpty(null); // true\n * utils.isEmpty('hello'); // false\n * utils.isEmpty([1, 2]); // false\n * ```\n */\n isEmpty(value: unknown): boolean {\n if (value == null) return true;\n if (typeof value === 'string') return value.trim().length === 0;\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === 'object') return Object.keys(value as object).length === 0;\n return false;\n },\n\n /**\n * Checks if a value is a plain object (not null, array, or class instance).\n *\n * @param value - The value to check\n * @returns True if the value is a plain object\n */\n isPlainObject(value: unknown): value is Record<string, unknown> {\n return Object.prototype.toString.call(value) === '[object Object]';\n },\n\n /**\n * Checks if a value is a function.\n *\n * @param value - The value to check\n * @returns True if the value is a function\n */\n isFunction(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === 'function';\n },\n\n /**\n * Checks if a value is a string.\n *\n * @param value - The value to check\n * @returns True if the value is a string\n */\n isString(value: unknown): value is string {\n return typeof value === 'string';\n },\n\n /**\n * Checks if a value is a number (excluding NaN).\n *\n * @param value - The value to check\n * @returns True if the value is a valid number\n */\n isNumber(value: unknown): value is number {\n return typeof value === 'number' && !Number.isNaN(value);\n },\n\n /**\n * Checks if a value is a boolean.\n *\n * @param value - The value to check\n * @returns True if the value is a boolean\n */\n isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean';\n },\n\n /**\n * Checks if a value is an array.\n *\n * @template T - The type of array elements\n * @param value - The value to check\n * @returns True if the value is an array\n */\n isArray<T = unknown>(value: unknown): value is T[] {\n return Array.isArray(value);\n },\n\n /**\n * Safely parses a JSON string, returning a default value on error.\n *\n * @template T - The expected type of the parsed value\n * @param json - The JSON string to parse\n * @param fallback - The default value if parsing fails\n * @returns The parsed value or the fallback\n *\n * @example\n * ```ts\n * utils.parseJson('{\"name\":\"bQuery\"}', {}); // { name: 'bQuery' }\n * utils.parseJson('invalid', {}); // {}\n * ```\n */\n parseJson<T>(json: string, fallback: T): T {\n try {\n return JSON.parse(json) as T;\n } catch {\n return fallback;\n }\n },\n\n /**\n * Picks specified keys from an object.\n *\n * @template T - The object type\n * @template K - The key type\n * @param obj - The source object\n * @param keys - Keys to pick\n * @returns A new object with only the specified keys\n *\n * @example\n * ```ts\n * const user = { name: 'John', age: 30, email: 'john@example.com' };\n * utils.pick(user, ['name', 'email']); // { name: 'John', email: 'john@example.com' }\n * ```\n */\n pick<T extends Record<string, unknown>, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n },\n\n /**\n * Omits specified keys from an object.\n *\n * @template T - The object type\n * @template K - The key type\n * @param obj - The source object\n * @param keys - Keys to omit\n * @returns A new object without the specified keys\n *\n * @example\n * ```ts\n * const user = { name: 'John', age: 30, password: 'secret' };\n * utils.omit(user, ['password']); // { name: 'John', age: 30 }\n * ```\n */\n omit<T extends Record<string, unknown>, K extends keyof T>(obj: T, keys: K[]): Omit<T, K> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result as Omit<T, K>;\n },\n\n /**\n * Delays execution for a specified number of milliseconds.\n *\n * @param ms - Milliseconds to delay\n * @returns A promise that resolves after the delay\n *\n * @example\n * ```ts\n * await utils.sleep(1000); // Wait 1 second\n * console.log('Done!');\n * ```\n */\n sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n },\n\n /**\n * Generates a random integer between min and max (inclusive).\n *\n * @param min - Minimum value\n * @param max - Maximum value\n * @returns A random integer in the range [min, max]\n *\n * @example\n * ```ts\n * const roll = utils.randomInt(1, 6); // Random dice roll\n * ```\n */\n randomInt(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n },\n\n /**\n * Clamps a number between a minimum and maximum value.\n *\n * @param value - The value to clamp\n * @param min - Minimum value\n * @param max - Maximum value\n * @returns The clamped value\n *\n * @example\n * ```ts\n * utils.clamp(150, 0, 100); // 100\n * utils.clamp(-10, 0, 100); // 0\n * utils.clamp(50, 0, 100); // 50\n * ```\n */\n clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n },\n\n /**\n * Capitalizes the first letter of a string.\n *\n * @param str - The string to capitalize\n * @returns The capitalized string\n *\n * @example\n * ```ts\n * utils.capitalize('hello'); // 'Hello'\n * ```\n */\n capitalize(str: string): string {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n },\n\n /**\n * Converts a string to kebab-case.\n *\n * @param str - The string to convert\n * @returns The kebab-cased string\n *\n * @example\n * ```ts\n * utils.toKebabCase('myVariableName'); // 'my-variable-name'\n * ```\n */\n toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n },\n\n /**\n * Converts a string to camelCase.\n *\n * @param str - The string to convert\n * @returns The camelCased string\n *\n * @example\n * ```ts\n * utils.toCamelCase('my-variable-name'); // 'myVariableName'\n * ```\n */\n toCamelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, char) => (char ? char.toUpperCase() : ''))\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n },\n};\n"],"names":["toElementList","input","applyAll","elements","action","el","BQueryElement","element","classNames","className","force","name","value","key","match","sanitizeHtml","property","val","content","deep","selector","parent","child","event","handler","detail","display","isHidden","newValue","position","BQueryCollection","index","callback","predicate","initialValue","sanitized","$","$$","utils","sources","result","source","fn","delayMs","timeoutId","args","intervalMs","lastRun","now","prefix","json","fallback","obj","keys","ms","resolve","min","max","str","_","char"],"mappings":"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"}
1
+ {"version":3,"file":"core.es.mjs","sources":["../src/core/shared.ts","../src/core/element.ts","../src/core/collection.ts","../src/core/selector.ts","../src/core/utils.ts"],"sourcesContent":["/**\n * Shared helpers for element wrappers.\n */\nexport type ElementList = Element[];\n\nexport const toElementList = (input: Element | ElementList): ElementList =>\n Array.isArray(input) ? input : [input];\n\nexport const applyAll = (elements: ElementList, action: (el: Element) => void) => {\n for (const el of elements) {\n action(el);\n }\n};\n","import { sanitizeHtml } from '../security/sanitize';\r\nimport { applyAll, toElementList } from './shared';\r\n\r\n/**\r\n * Wrapper for a single DOM element.\r\n * Provides a chainable, jQuery-like API for DOM manipulation.\r\n *\r\n * This class encapsulates a DOM element and provides methods for:\r\n * - Class manipulation (addClass, removeClass, toggleClass)\r\n * - Attribute and property access (attr, prop, data)\r\n * - Content manipulation (text, html, append, prepend)\r\n * - Style manipulation (css)\r\n * - Event handling (on, off, once, trigger)\r\n * - DOM traversal (find, closest, parent, children, siblings)\r\n *\r\n * All mutating methods return `this` for method chaining.\r\n *\r\n * @example\r\n * ```ts\r\n * $('#button')\r\n * .addClass('active')\r\n * .css({ color: 'blue' })\r\n * .on('click', () => console.log('clicked'));\r\n * ```\r\n */\r\n/** Handler signature for delegated events */\r\ntype DelegatedHandler = (event: Event, target: Element) => void;\r\n\r\nexport class BQueryElement {\r\n /**\r\n * Stores delegated event handlers for cleanup via undelegate().\r\n * Key format: `${event}:${selector}`\r\n * @internal\r\n */\r\n private readonly delegatedHandlers = new Map<string, Map<DelegatedHandler, EventListener>>();\r\n\r\n /**\r\n * Creates a new BQueryElement wrapper.\r\n * @param element - The DOM element to wrap\r\n */\r\n constructor(private readonly element: Element) {}\r\n\r\n /**\r\n * Exposes the raw DOM element when direct access is needed.\r\n * Use sparingly; prefer the wrapper methods for consistency.\r\n */\r\n get raw(): Element {\r\n return this.element;\r\n }\r\n\r\n /**\r\n * Exposes the underlying DOM element.\r\n * Provided for spec compatibility and read-only access.\r\n */\r\n get node(): Element {\r\n return this.element;\r\n }\r\n\r\n /** Add one or more classes. */\r\n addClass(...classNames: string[]): this {\r\n this.element.classList.add(...classNames);\r\n return this;\r\n }\r\n\r\n /** Remove one or more classes. */\r\n removeClass(...classNames: string[]): this {\r\n this.element.classList.remove(...classNames);\r\n return this;\r\n }\r\n\r\n /** Toggle a class by name. */\r\n toggleClass(className: string, force?: boolean): this {\r\n this.element.classList.toggle(className, force);\r\n return this;\r\n }\r\n\r\n /** Get or set an attribute. */\r\n attr(name: string, value?: string): string | this {\r\n if (value === undefined) {\r\n return this.element.getAttribute(name) ?? '';\r\n }\r\n this.element.setAttribute(name, value);\r\n return this;\r\n }\r\n\r\n /** Get or set a property. */\r\n prop<T extends keyof Element>(name: T, value?: Element[T]): Element[T] | this {\r\n if (value === undefined) {\r\n return this.element[name];\r\n }\r\n this.element[name] = value;\r\n return this;\r\n }\r\n\r\n /** Read or write data attributes in camelCase. */\r\n data(name: string, value?: string): string | this {\r\n const key = name.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\r\n if (value === undefined) {\r\n return this.element.getAttribute(`data-${key}`) ?? '';\r\n }\r\n this.element.setAttribute(`data-${key}`, value);\r\n return this;\r\n }\r\n\r\n /** Get or set text content. */\r\n text(value?: string): string | this {\r\n if (value === undefined) {\r\n return this.element.textContent ?? '';\r\n }\r\n this.element.textContent = value;\r\n return this;\r\n }\r\n\r\n /** Set HTML content using a sanitized string. */\r\n /**\r\n * Sets sanitized HTML content on the element.\r\n * Uses the security module to sanitize input and prevent XSS attacks.\r\n *\r\n * @param value - The HTML string to set (will be sanitized)\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * $('#content').html('<strong>Hello</strong>');\r\n * ```\r\n */\r\n html(value: string): this {\r\n this.element.innerHTML = sanitizeHtml(value);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets HTML content without sanitization.\r\n * Use only when you trust the HTML source completely.\r\n *\r\n * @param value - The raw HTML string to set\r\n * @returns The instance for method chaining\r\n *\r\n * @warning This method bypasses XSS protection. Use with caution.\r\n */\r\n htmlUnsafe(value: string): this {\r\n this.element.innerHTML = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets or sets CSS styles on the element.\r\n *\r\n * @param property - A CSS property name or an object of property-value pairs\r\n * @param value - The value when setting a single property\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * // Single property\r\n * $('#box').css('color', 'red');\r\n *\r\n * // Multiple properties\r\n * $('#box').css({ color: 'red', 'font-size': '16px' });\r\n * ```\r\n */\r\n css(property: string | Record<string, string>, value?: string): this {\r\n if (typeof property === 'string') {\r\n if (value !== undefined) {\r\n (this.element as HTMLElement).style.setProperty(property, value);\r\n }\r\n return this;\r\n }\r\n\r\n for (const [key, val] of Object.entries(property)) {\r\n (this.element as HTMLElement).style.setProperty(key, val);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Appends HTML or elements to the end of the element.\r\n *\r\n * @param content - HTML string or element(s) to append\r\n * @returns The instance for method chaining\r\n */\r\n append(content: string | Element | Element[]): this {\r\n this.insertContent(content, 'beforeend');\r\n return this;\r\n }\r\n\r\n /**\r\n * Prepends HTML or elements to the beginning of the element.\r\n *\r\n * @param content - HTML string or element(s) to prepend\r\n * @returns The instance for method chaining\r\n */\r\n prepend(content: string | Element | Element[]): this {\r\n this.insertContent(content, 'afterbegin');\r\n return this;\r\n }\r\n\r\n /**\r\n * Inserts content before this element.\r\n *\r\n * @param content - HTML string or element(s) to insert\r\n * @returns The instance for method chaining\r\n */\r\n before(content: string | Element | Element[]): this {\r\n this.insertContent(content, 'beforebegin');\r\n return this;\r\n }\r\n\r\n /**\r\n * Inserts content after this element.\r\n *\r\n * @param content - HTML string or element(s) to insert\r\n * @returns The instance for method chaining\r\n */\r\n after(content: string | Element | Element[]): this {\r\n this.insertContent(content, 'afterend');\r\n return this;\r\n }\r\n\r\n /**\r\n * Wraps the element with the specified wrapper element or tag.\r\n *\r\n * @param wrapper - Tag name string or Element to wrap with\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * $('#content').wrap('div'); // Wraps with <div>\r\n * $('#content').wrap(document.createElement('section'));\r\n * ```\r\n */\r\n wrap(wrapper: string | Element): this {\r\n const wrapperEl = typeof wrapper === 'string' ? document.createElement(wrapper) : wrapper;\r\n this.element.parentNode?.insertBefore(wrapperEl, this.element);\r\n wrapperEl.appendChild(this.element);\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes the parent element, keeping this element in its place.\r\n * Essentially the opposite of wrap().\r\n *\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * // Before: <div><span id=\"text\">Hello</span></div>\r\n * $('#text').unwrap();\r\n * // After: <span id=\"text\">Hello</span>\r\n * ```\r\n */\r\n unwrap(): this {\r\n const parent = this.element.parentElement;\r\n if (parent && parent.parentNode) {\r\n parent.parentNode.insertBefore(this.element, parent);\r\n parent.remove();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Replaces this element with new content.\r\n *\r\n * @param content - HTML string (sanitized) or Element to replace with\r\n * @returns A new BQueryElement wrapping the replacement element\r\n *\r\n * @example\r\n * ```ts\r\n * const newEl = $('#old').replaceWith('<div id=\"new\">Replaced</div>');\r\n * ```\r\n */\r\n replaceWith(content: string | Element): BQueryElement {\r\n let newEl: Element;\r\n if (typeof content === 'string') {\r\n const template = document.createElement('template');\r\n template.innerHTML = sanitizeHtml(content);\r\n newEl = template.content.firstElementChild ?? document.createElement('div');\r\n } else {\r\n newEl = content;\r\n }\r\n this.element.replaceWith(newEl);\r\n return new BQueryElement(newEl);\r\n }\r\n\r\n /**\r\n * Scrolls the element into view with configurable behavior.\r\n *\r\n * @param options - ScrollIntoView options or boolean for legacy behavior\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * $('#section').scrollTo(); // Smooth scroll\r\n * $('#section').scrollTo({ behavior: 'instant', block: 'start' });\r\n * ```\r\n */\r\n scrollTo(options: ScrollIntoViewOptions | boolean = { behavior: 'smooth' }): this {\r\n this.element.scrollIntoView(options);\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes the element from the DOM.\r\n *\r\n * @returns The instance for method chaining (though element is now detached)\r\n */\r\n remove(): this {\r\n this.element.remove();\r\n return this;\r\n }\r\n\r\n /**\r\n * Clears all child nodes from the element.\r\n *\r\n * @returns The instance for method chaining\r\n */\r\n empty(): this {\r\n this.element.innerHTML = '';\r\n return this;\r\n }\r\n\r\n /**\r\n * Clones the element, optionally with all descendants.\r\n *\r\n * @param deep - If true, clone all descendants (default: true)\r\n * @returns A new BQueryElement wrapping the cloned element\r\n */\r\n clone(deep: boolean = true): BQueryElement {\r\n return new BQueryElement(this.element.cloneNode(deep) as Element);\r\n }\r\n\r\n /**\r\n * Finds all descendant elements matching the selector.\r\n *\r\n * @param selector - CSS selector to match\r\n * @returns Array of matching elements\r\n */\r\n find(selector: string): Element[] {\r\n return Array.from(this.element.querySelectorAll(selector));\r\n }\r\n\r\n /**\r\n * Finds the first descendant element matching the selector.\r\n *\r\n * @param selector - CSS selector to match\r\n * @returns The first matching element or null\r\n */\r\n findOne(selector: string): Element | null {\r\n return this.element.querySelector(selector);\r\n }\r\n\r\n /**\r\n * Finds the closest ancestor matching the selector.\r\n *\r\n * @param selector - CSS selector to match\r\n * @returns The matching ancestor or null\r\n */\r\n closest(selector: string): Element | null {\r\n return this.element.closest(selector);\r\n }\r\n\r\n /**\r\n * Gets the parent element.\r\n *\r\n * @returns The parent element or null\r\n */\r\n parent(): Element | null {\r\n return this.element.parentElement;\r\n }\r\n\r\n /**\r\n * Gets all child elements.\r\n *\r\n * @returns Array of child elements\r\n */\r\n children(): Element[] {\r\n return Array.from(this.element.children);\r\n }\r\n\r\n /**\r\n * Gets all sibling elements.\r\n *\r\n * @returns Array of sibling elements (excluding this element)\r\n */\r\n siblings(): Element[] {\r\n const parent = this.element.parentElement;\r\n if (!parent) return [];\r\n return Array.from(parent.children).filter((child) => child !== this.element);\r\n }\r\n\r\n /**\r\n * Gets the next sibling element.\r\n *\r\n * @returns The next sibling element or null\r\n */\r\n next(): Element | null {\r\n return this.element.nextElementSibling;\r\n }\r\n\r\n /**\r\n * Gets the previous sibling element.\r\n *\r\n * @returns The previous sibling element or null\r\n */\r\n prev(): Element | null {\r\n return this.element.previousElementSibling;\r\n }\r\n\r\n /**\r\n * Adds an event listener.\r\n *\r\n * @param event - Event type to listen for\r\n * @param handler - Event handler function\r\n * @returns The instance for method chaining\r\n */\r\n on(event: string, handler: EventListenerOrEventListenerObject): this {\r\n this.element.addEventListener(event, handler);\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a one-time event listener that removes itself after firing.\r\n *\r\n * @param event - Event type to listen for\r\n * @param handler - Event handler function\r\n * @returns The instance for method chaining\r\n */\r\n once(event: string, handler: EventListener): this {\r\n this.element.addEventListener(event, handler, { once: true });\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes an event listener.\r\n *\r\n * @param event - Event type\r\n * @param handler - The handler to remove\r\n * @returns The instance for method chaining\r\n */\r\n off(event: string, handler: EventListenerOrEventListenerObject): this {\r\n this.element.removeEventListener(event, handler);\r\n return this;\r\n }\r\n\r\n /**\r\n * Triggers a custom event on the element.\r\n *\r\n * @param event - Event type to trigger\r\n * @param detail - Optional detail data to include with the event\r\n * @returns The instance for method chaining\r\n */\r\n trigger(event: string, detail?: unknown): this {\r\n this.element.dispatchEvent(new CustomEvent(event, { detail, bubbles: true, cancelable: true }));\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a delegated event listener that only triggers for matching descendants.\r\n * More efficient than adding listeners to many elements individually.\r\n *\r\n * Use `undelegate()` to remove the listener later.\r\n *\r\n * @param event - Event type to listen for\r\n * @param selector - CSS selector to match against event targets\r\n * @param handler - Event handler function, receives the matched element as context\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * // Instead of adding listeners to each button:\r\n * const handler = (e, target) => console.log('Clicked:', target.textContent);\r\n * $('#list').delegate('click', '.item', handler);\r\n *\r\n * // Later, remove the delegated listener:\r\n * $('#list').undelegate('click', '.item', handler);\r\n * ```\r\n */\r\n delegate(\r\n event: string,\r\n selector: string,\r\n handler: (event: Event, target: Element) => void\r\n ): this {\r\n const key = `${event}:${selector}`;\r\n const wrapper: EventListener = (e: Event) => {\r\n const target = (e.target as Element).closest(selector);\r\n if (target && this.element.contains(target)) {\r\n handler(e, target);\r\n }\r\n };\r\n\r\n // Store the wrapper so it can be removed later\r\n if (!this.delegatedHandlers.has(key)) {\r\n this.delegatedHandlers.set(key, new Map());\r\n }\r\n this.delegatedHandlers.get(key)!.set(handler, wrapper);\r\n\r\n this.element.addEventListener(event, wrapper);\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes a delegated event listener previously added with `delegate()`.\r\n *\r\n * @param event - Event type that was registered\r\n * @param selector - CSS selector that was used\r\n * @param handler - The original handler function passed to delegate()\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * const handler = (e, target) => console.log('Clicked:', target.textContent);\r\n * $('#list').delegate('click', '.item', handler);\r\n *\r\n * // Remove the delegated listener:\r\n * $('#list').undelegate('click', '.item', handler);\r\n * ```\r\n */\r\n undelegate(\r\n event: string,\r\n selector: string,\r\n handler: (event: Event, target: Element) => void\r\n ): this {\r\n const key = `${event}:${selector}`;\r\n const handlers = this.delegatedHandlers.get(key);\r\n\r\n if (handlers) {\r\n const wrapper = handlers.get(handler);\r\n if (wrapper) {\r\n this.element.removeEventListener(event, wrapper);\r\n handlers.delete(handler);\r\n\r\n // Clean up empty maps\r\n if (handlers.size === 0) {\r\n this.delegatedHandlers.delete(key);\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Checks if the element matches a CSS selector.\r\n *\r\n * @param selector - CSS selector to match against\r\n * @returns True if the element matches the selector\r\n */\r\n matches(selector: string): boolean {\r\n return this.element.matches(selector);\r\n }\r\n\r\n /**\r\n * Checks if the element has a specific class.\r\n *\r\n * @param className - Class name to check\r\n * @returns True if the element has the class\r\n */\r\n hasClass(className: string): boolean {\r\n return this.element.classList.contains(className);\r\n }\r\n\r\n /**\r\n * Shows the element by removing the hidden attribute and setting display.\r\n *\r\n * @param display - Optional display value (default: '')\r\n * @returns The instance for method chaining\r\n */\r\n show(display: string = ''): this {\r\n this.element.removeAttribute('hidden');\r\n (this.element as HTMLElement).style.display = display;\r\n return this;\r\n }\r\n\r\n /**\r\n * Hides the element by setting display to 'none'.\r\n *\r\n * @returns The instance for method chaining\r\n */\r\n hide(): this {\r\n (this.element as HTMLElement).style.display = 'none';\r\n return this;\r\n }\r\n\r\n /**\r\n * Toggles the visibility of the element.\r\n *\r\n * @param force - Optional force show (true) or hide (false)\r\n * @returns The instance for method chaining\r\n */\r\n toggle(force?: boolean): this {\r\n const isHidden = (this.element as HTMLElement).style.display === 'none';\r\n const shouldShow = force ?? isHidden;\r\n return shouldShow ? this.show() : this.hide();\r\n }\r\n\r\n /**\r\n * Focuses the element.\r\n *\r\n * @returns The instance for method chaining\r\n */\r\n focus(): this {\r\n (this.element as HTMLElement).focus();\r\n return this;\r\n }\r\n\r\n /**\r\n * Blurs (unfocuses) the element.\r\n *\r\n * @returns The instance for method chaining\r\n */\r\n blur(): this {\r\n (this.element as HTMLElement).blur();\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets or sets the value of form elements.\r\n *\r\n * @param newValue - Optional value to set\r\n * @returns The current value when getting, or the instance when setting\r\n */\r\n val(newValue?: string): string | this {\r\n const input = this.element as HTMLInputElement;\r\n if (newValue === undefined) {\r\n return input.value ?? '';\r\n }\r\n input.value = newValue;\r\n return this;\r\n }\r\n\r\n /**\r\n * Serializes form data to a plain object.\r\n * Only works on form elements; returns empty object for non-forms.\r\n *\r\n * @returns Object with form field names as keys and values\r\n *\r\n * @example\r\n * ```ts\r\n * // For a form with <input name=\"email\" value=\"test@example.com\">\r\n * const data = $('#myForm').serialize();\r\n * // { email: 'test@example.com' }\r\n * ```\r\n */\r\n serialize(): Record<string, string | string[]> {\r\n const form = this.element as HTMLFormElement;\r\n if (form.tagName.toLowerCase() !== 'form') {\r\n return {};\r\n }\r\n\r\n const result: Record<string, string | string[]> = {};\r\n const formData = new FormData(form);\r\n\r\n for (const [key, value] of formData.entries()) {\r\n if (typeof value !== 'string') continue; // Skip File objects\r\n\r\n if (key in result) {\r\n // Handle multiple values (e.g., checkboxes)\r\n const existing = result[key];\r\n if (Array.isArray(existing)) {\r\n existing.push(value);\r\n } else {\r\n result[key] = [existing, value];\r\n }\r\n } else {\r\n result[key] = value;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Serializes form data to a URL-encoded query string.\r\n *\r\n * @returns URL-encoded string suitable for form submission\r\n *\r\n * @example\r\n * ```ts\r\n * const queryString = $('#myForm').serializeString();\r\n * // 'email=test%40example.com&name=John'\r\n * ```\r\n */\r\n serializeString(): string {\r\n const form = this.element as HTMLFormElement;\r\n if (form.tagName.toLowerCase() !== 'form') {\r\n return '';\r\n }\r\n\r\n const formData = new FormData(form);\r\n const params = new URLSearchParams();\r\n\r\n for (const [key, value] of formData.entries()) {\r\n if (typeof value === 'string') {\r\n params.append(key, value);\r\n }\r\n }\r\n\r\n return params.toString();\r\n }\r\n\r\n /**\r\n * Gets the bounding client rectangle of the element.\r\n *\r\n * @returns The element's bounding rectangle\r\n */\r\n rect(): DOMRect {\r\n return this.element.getBoundingClientRect();\r\n }\r\n\r\n /**\r\n * Gets the offset dimensions (width, height, top, left).\r\n *\r\n * @returns Object with offset dimensions\r\n */\r\n offset(): { width: number; height: number; top: number; left: number } {\r\n const el = this.element as HTMLElement;\r\n return {\r\n width: el.offsetWidth,\r\n height: el.offsetHeight,\r\n top: el.offsetTop,\r\n left: el.offsetLeft,\r\n };\r\n }\r\n\r\n /**\r\n * Internal method to insert content at a specified position.\r\n * @internal\r\n */\r\n private insertContent(content: string | Element | Element[], position: InsertPosition) {\r\n if (typeof content === 'string') {\r\n this.element.insertAdjacentHTML(position, sanitizeHtml(content));\r\n return;\r\n }\r\n\r\n const elements = toElementList(content);\r\n applyAll(elements, (el) => {\r\n this.element.insertAdjacentElement(position, el);\r\n });\r\n }\r\n}\r\n","import { sanitizeHtml } from '../security/sanitize';\r\nimport { BQueryElement } from './element';\r\nimport { applyAll } from './shared';\r\n\r\n/** Handler signature for delegated events */\r\ntype DelegatedHandler = (event: Event, target: Element) => void;\r\n\r\n/**\r\n * Wrapper for multiple DOM elements.\r\n * Provides batch operations on a collection of elements with chainable API.\r\n *\r\n * This class enables jQuery-like operations across multiple elements:\r\n * - All mutating methods apply to every element in the collection\r\n * - Getter methods return data from the first element\r\n * - Supports iteration via forEach, map, filter, and reduce\r\n *\r\n * @example\r\n * ```ts\r\n * $$('.items')\r\n * .addClass('highlight')\r\n * .css({ opacity: '0.8' })\r\n * .on('click', () => console.log('clicked'));\r\n * ```\r\n */\r\nexport class BQueryCollection {\r\n /**\r\n * Stores delegated event handlers for cleanup via undelegate().\r\n * Outer map: element -> (key -> (handler -> wrapper))\r\n * Key format: `${event}:${selector}`\r\n * @internal\r\n */\r\n private readonly delegatedHandlers = new WeakMap<\r\n Element,\r\n Map<string, Map<DelegatedHandler, EventListener>>\r\n >();\r\n\r\n /**\r\n * Creates a new collection wrapper.\r\n * @param elements - Array of DOM elements to wrap\r\n */\r\n constructor(public readonly elements: Element[]) {}\r\n\r\n /**\r\n * Gets the number of elements in the collection.\r\n */\r\n get length(): number {\r\n return this.elements.length;\r\n }\r\n\r\n /**\r\n * Gets the first element in the collection, if any.\r\n * @internal\r\n */\r\n private first(): Element | undefined {\r\n return this.elements[0];\r\n }\r\n\r\n /**\r\n * Gets a single element as a BQueryElement wrapper.\r\n *\r\n * @param index - Zero-based index of the element\r\n * @returns BQueryElement wrapper or undefined if out of range\r\n */\r\n eq(index: number): BQueryElement | undefined {\r\n const el = this.elements[index];\r\n return el ? new BQueryElement(el) : undefined;\r\n }\r\n\r\n /**\r\n * Gets the first element as a BQueryElement wrapper.\r\n *\r\n * @returns BQueryElement wrapper or undefined if empty\r\n */\r\n firstEl(): BQueryElement | undefined {\r\n return this.eq(0);\r\n }\r\n\r\n /**\r\n * Gets the last element as a BQueryElement wrapper.\r\n *\r\n * @returns BQueryElement wrapper or undefined if empty\r\n */\r\n lastEl(): BQueryElement | undefined {\r\n return this.eq(this.elements.length - 1);\r\n }\r\n\r\n /**\r\n * Iterates over each element in the collection.\r\n *\r\n * @param callback - Function to call for each wrapped element\r\n * @returns The instance for method chaining\r\n */\r\n each(callback: (element: BQueryElement, index: number) => void): this {\r\n this.elements.forEach((element, index) => {\r\n callback(new BQueryElement(element), index);\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Maps each element to a new value.\r\n *\r\n * @param callback - Function to transform each element\r\n * @returns Array of transformed values\r\n */\r\n map<T>(callback: (element: Element, index: number) => T): T[] {\r\n return this.elements.map(callback);\r\n }\r\n\r\n /**\r\n * Filters elements based on a predicate.\r\n *\r\n * @param predicate - Function to test each element\r\n * @returns New BQueryCollection with matching elements\r\n */\r\n filter(predicate: (element: Element, index: number) => boolean): BQueryCollection {\r\n return new BQueryCollection(this.elements.filter(predicate));\r\n }\r\n\r\n /**\r\n * Reduces the collection to a single value.\r\n *\r\n * @param callback - Reducer function\r\n * @param initialValue - Initial accumulator value\r\n * @returns Accumulated result\r\n */\r\n reduce<T>(callback: (accumulator: T, element: Element, index: number) => T, initialValue: T): T {\r\n return this.elements.reduce(callback, initialValue);\r\n }\r\n\r\n /**\r\n * Converts the collection to an array of BQueryElement wrappers.\r\n *\r\n * @returns Array of BQueryElement instances\r\n */\r\n toArray(): BQueryElement[] {\r\n return this.elements.map((el) => new BQueryElement(el));\r\n }\r\n\r\n /** Add one or more classes to all elements. */\r\n addClass(...classNames: string[]): this {\r\n applyAll(this.elements, (el) => el.classList.add(...classNames));\r\n return this;\r\n }\r\n\r\n /** Remove one or more classes from all elements. */\r\n removeClass(...classNames: string[]): this {\r\n applyAll(this.elements, (el) => el.classList.remove(...classNames));\r\n return this;\r\n }\r\n\r\n /** Toggle a class on all elements. */\r\n toggleClass(className: string, force?: boolean): this {\r\n applyAll(this.elements, (el) => el.classList.toggle(className, force));\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an attribute on all elements or gets from first.\r\n *\r\n * @param name - Attribute name\r\n * @param value - Value to set (optional)\r\n * @returns Attribute value when getting, instance when setting\r\n */\r\n attr(name: string, value?: string): string | this {\r\n if (value === undefined) {\r\n return this.first()?.getAttribute(name) ?? '';\r\n }\r\n applyAll(this.elements, (el) => el.setAttribute(name, value));\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes an attribute from all elements.\r\n *\r\n * @param name - Attribute name to remove\r\n * @returns The instance for method chaining\r\n */\r\n removeAttr(name: string): this {\r\n applyAll(this.elements, (el) => el.removeAttribute(name));\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets text content on all elements or gets from first.\r\n *\r\n * @param value - Text to set (optional)\r\n * @returns Text content when getting, instance when setting\r\n */\r\n text(value?: string): string | this {\r\n if (value === undefined) {\r\n return this.first()?.textContent ?? '';\r\n }\r\n applyAll(this.elements, (el) => {\r\n el.textContent = value;\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets sanitized HTML on all elements or gets from first.\r\n *\r\n * @param value - HTML to set (optional, will be sanitized)\r\n * @returns HTML content when getting, instance when setting\r\n */\r\n html(value?: string): string | this {\r\n if (value === undefined) {\r\n return this.first()?.innerHTML ?? '';\r\n }\r\n const sanitized = sanitizeHtml(value);\r\n applyAll(this.elements, (el) => {\r\n el.innerHTML = sanitized;\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets HTML on all elements without sanitization.\r\n *\r\n * @param value - Raw HTML to set\r\n * @returns The instance for method chaining\r\n * @warning Bypasses XSS protection\r\n */\r\n htmlUnsafe(value: string): this {\r\n applyAll(this.elements, (el) => {\r\n el.innerHTML = value;\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Applies CSS styles to all elements.\r\n *\r\n * @param property - Property name or object of properties\r\n * @param value - Value when setting single property\r\n * @returns The instance for method chaining\r\n */\r\n css(property: string | Record<string, string>, value?: string): this {\r\n if (typeof property === 'string') {\r\n if (value !== undefined) {\r\n applyAll(this.elements, (el) => {\r\n (el as HTMLElement).style.setProperty(property, value);\r\n });\r\n }\r\n return this;\r\n }\r\n\r\n applyAll(this.elements, (el) => {\r\n for (const [key, val] of Object.entries(property)) {\r\n (el as HTMLElement).style.setProperty(key, val);\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Shows all elements.\r\n *\r\n * @param display - Optional display value (default: '')\r\n * @returns The instance for method chaining\r\n */\r\n show(display: string = ''): this {\r\n applyAll(this.elements, (el) => {\r\n el.removeAttribute('hidden');\r\n (el as HTMLElement).style.display = display;\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Hides all elements.\r\n *\r\n * @returns The instance for method chaining\r\n */\r\n hide(): this {\r\n applyAll(this.elements, (el) => {\r\n (el as HTMLElement).style.display = 'none';\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds an event listener to all elements.\r\n *\r\n * @param event - Event type\r\n * @param handler - Event handler\r\n * @returns The instance for method chaining\r\n */\r\n on(event: string, handler: EventListenerOrEventListenerObject): this {\r\n applyAll(this.elements, (el) => el.addEventListener(event, handler));\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a one-time event listener to all elements.\r\n *\r\n * @param event - Event type\r\n * @param handler - Event handler\r\n * @returns The instance for method chaining\r\n */\r\n once(event: string, handler: EventListener): this {\r\n applyAll(this.elements, (el) => el.addEventListener(event, handler, { once: true }));\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes an event listener from all elements.\r\n *\r\n * @param event - Event type\r\n * @param handler - The handler to remove\r\n * @returns The instance for method chaining\r\n */\r\n off(event: string, handler: EventListenerOrEventListenerObject): this {\r\n applyAll(this.elements, (el) => el.removeEventListener(event, handler));\r\n return this;\r\n }\r\n\r\n /**\r\n * Triggers a custom event on all elements.\r\n *\r\n * @param event - Event type\r\n * @param detail - Optional event detail\r\n * @returns The instance for method chaining\r\n */\r\n trigger(event: string, detail?: unknown): this {\r\n applyAll(this.elements, (el) => {\r\n el.dispatchEvent(new CustomEvent(event, { detail, bubbles: true, cancelable: true }));\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a delegated event listener to all elements.\r\n * Events are delegated to matching descendants.\r\n *\r\n * Use `undelegate()` to remove the listener later.\r\n *\r\n * @param event - Event type to listen for\r\n * @param selector - CSS selector to match against event targets\r\n * @param handler - Event handler function\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * const handler = (e, target) => console.log('Clicked:', target.textContent);\r\n * $$('.container').delegate('click', '.item', handler);\r\n *\r\n * // Later, remove the delegated listener:\r\n * $$('.container').undelegate('click', '.item', handler);\r\n * ```\r\n */\r\n delegate(\r\n event: string,\r\n selector: string,\r\n handler: (event: Event, target: Element) => void\r\n ): this {\r\n const key = `${event}:${selector}`;\r\n\r\n applyAll(this.elements, (el) => {\r\n const wrapper: EventListener = (e: Event) => {\r\n const target = (e.target as Element).closest(selector);\r\n if (target && el.contains(target)) {\r\n handler(e, target);\r\n }\r\n };\r\n\r\n // Get or create the handler maps for this element\r\n if (!this.delegatedHandlers.has(el)) {\r\n this.delegatedHandlers.set(el, new Map());\r\n }\r\n const elementHandlers = this.delegatedHandlers.get(el)!;\r\n\r\n if (!elementHandlers.has(key)) {\r\n elementHandlers.set(key, new Map());\r\n }\r\n elementHandlers.get(key)!.set(handler, wrapper);\r\n\r\n el.addEventListener(event, wrapper);\r\n });\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes a delegated event listener previously added with `delegate()`.\r\n *\r\n * @param event - Event type that was registered\r\n * @param selector - CSS selector that was used\r\n * @param handler - The original handler function passed to delegate()\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * const handler = (e, target) => console.log('Clicked:', target.textContent);\r\n * $$('.container').delegate('click', '.item', handler);\r\n *\r\n * // Remove the delegated listener:\r\n * $$('.container').undelegate('click', '.item', handler);\r\n * ```\r\n */\r\n undelegate(\r\n event: string,\r\n selector: string,\r\n handler: (event: Event, target: Element) => void\r\n ): this {\r\n const key = `${event}:${selector}`;\r\n\r\n applyAll(this.elements, (el) => {\r\n const elementHandlers = this.delegatedHandlers.get(el);\r\n if (!elementHandlers) return;\r\n\r\n const handlers = elementHandlers.get(key);\r\n if (!handlers) return;\r\n\r\n const wrapper = handlers.get(handler);\r\n if (wrapper) {\r\n el.removeEventListener(event, wrapper);\r\n handlers.delete(handler);\r\n\r\n // Clean up empty maps\r\n if (handlers.size === 0) {\r\n elementHandlers.delete(key);\r\n }\r\n if (elementHandlers.size === 0) {\r\n this.delegatedHandlers.delete(el);\r\n }\r\n }\r\n });\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes all elements from the DOM.\r\n *\r\n * @returns The instance for method chaining\r\n */\r\n remove(): this {\r\n applyAll(this.elements, (el) => el.remove());\r\n return this;\r\n }\r\n\r\n /**\r\n * Clears all child nodes from all elements.\r\n *\r\n * @returns The instance for method chaining\r\n */\r\n empty(): this {\r\n applyAll(this.elements, (el) => {\r\n el.innerHTML = '';\r\n });\r\n return this;\r\n }\r\n}\r\n","import { BQueryCollection } from './collection';\nimport { BQueryElement } from './element';\n\n/**\n * Select a single element. Returns a wrapper for chainable operations.\n */\nexport const $ = (selector: string | Element): BQueryElement => {\n if (typeof selector !== 'string') {\n return new BQueryElement(selector);\n }\n const element = document.querySelector(selector);\n if (!element) {\n throw new Error(`bQuery: element not found for selector \"${selector}\"`);\n }\n return new BQueryElement(element);\n};\n\n/**\n * Select multiple elements. Returns a collection wrapper.\n */\nexport const $$ = (selector: string | Element[] | NodeListOf<Element>): BQueryCollection => {\n if (Array.isArray(selector)) {\n return new BQueryCollection(selector);\n }\n if (selector instanceof NodeList) {\n return new BQueryCollection(Array.from(selector));\n }\n return new BQueryCollection(Array.from(document.querySelectorAll(selector)));\n};\n","/**\r\n * Utility helpers used across the framework.\r\n * These are intentionally small and framework-agnostic to keep the core tiny.\r\n *\r\n * @module bquery/core/utils\r\n */\r\n\r\n/**\r\n * Utility object containing common helper functions.\r\n * All utilities are designed to be tree-shakeable and have zero dependencies.\r\n */\r\nexport const utils = {\r\n /**\r\n * Creates a deep clone using structuredClone if available, otherwise fallback to JSON.\r\n *\r\n * @template T - The type of value being cloned\r\n * @param value - The value to clone\r\n * @returns A deep copy of the value\r\n *\r\n * @example\r\n * ```ts\r\n * const original = { nested: { value: 1 } };\r\n * const copy = utils.clone(original);\r\n * copy.nested.value = 2;\r\n * console.log(original.nested.value); // 1\r\n * ```\r\n */\r\n clone<T>(value: T): T {\r\n if (typeof structuredClone === 'function') {\r\n return structuredClone(value);\r\n }\r\n return JSON.parse(JSON.stringify(value)) as T;\r\n },\r\n\r\n /**\r\n * Deep-merges plain objects into a new object.\r\n * Later sources override earlier ones for primitive values.\r\n * Objects are recursively merged.\r\n *\r\n * @template T - The type of the merged object\r\n * @param sources - Objects to merge\r\n * @returns A new object with all sources merged\r\n *\r\n * @example\r\n * ```ts\r\n * const result = utils.merge(\r\n * { a: 1, nested: { x: 1 } },\r\n * { b: 2, nested: { y: 2 } }\r\n * );\r\n * // Result: { a: 1, b: 2, nested: { x: 1, y: 2 } }\r\n * ```\r\n *\r\n * @security This method is protected against prototype pollution attacks.\r\n * Keys like `__proto__`, `constructor`, and `prototype` are ignored.\r\n */\r\n merge<T extends Record<string, unknown>>(...sources: T[]): T {\r\n const result: Record<string, unknown> = {};\r\n for (const source of sources) {\r\n for (const [key, value] of Object.entries(source)) {\r\n // Prevent prototype pollution attacks\r\n if (utils.isPrototypePollutionKey(key)) continue;\r\n\r\n if (utils.isPlainObject(value) && utils.isPlainObject(result[key])) {\r\n result[key] = utils.merge(\r\n result[key] as Record<string, unknown>,\r\n value as Record<string, unknown>\r\n );\r\n } else {\r\n result[key] = value;\r\n }\r\n }\r\n }\r\n return result as T;\r\n },\r\n\r\n /**\r\n * Checks if a key could cause prototype pollution.\r\n * These keys are dangerous when used in object merging operations.\r\n *\r\n * @param key - The key to check\r\n * @returns True if the key is a prototype pollution vector\r\n *\r\n * @internal\r\n */\r\n isPrototypePollutionKey(key: string): boolean {\r\n return key === '__proto__' || key === 'constructor' || key === 'prototype';\r\n },\r\n\r\n /**\r\n * Creates a debounced function that delays execution until after\r\n * the specified delay has elapsed since the last call.\r\n *\r\n * @template TArgs - The argument types of the function\r\n * @param fn - The function to debounce\r\n * @param delayMs - Delay in milliseconds\r\n * @returns A debounced version of the function\r\n *\r\n * @example\r\n * ```ts\r\n * const search = utils.debounce((query: string) => {\r\n * console.log('Searching:', query);\r\n * }, 300);\r\n *\r\n * search('h');\r\n * search('he');\r\n * search('hello'); // Only this call executes after 300ms\r\n * ```\r\n */\r\n debounce<TArgs extends unknown[]>(\r\n fn: (...args: TArgs) => void,\r\n delayMs: number\r\n ): (...args: TArgs) => void {\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n return (...args: TArgs) => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n timeoutId = setTimeout(() => fn(...args), delayMs);\r\n };\r\n },\r\n\r\n /**\r\n * Creates a throttled function that runs at most once per interval.\r\n *\r\n * @template TArgs - The argument types of the function\r\n * @param fn - The function to throttle\r\n * @param intervalMs - Minimum interval between calls in milliseconds\r\n * @returns A throttled version of the function\r\n *\r\n * @example\r\n * ```ts\r\n * const handleScroll = utils.throttle(() => {\r\n * console.log('Scroll position:', window.scrollY);\r\n * }, 100);\r\n *\r\n * window.addEventListener('scroll', handleScroll);\r\n * ```\r\n */\r\n throttle<TArgs extends unknown[]>(\r\n fn: (...args: TArgs) => void,\r\n intervalMs: number\r\n ): (...args: TArgs) => void {\r\n let lastRun = 0;\r\n return (...args: TArgs) => {\r\n const now = Date.now();\r\n if (now - lastRun >= intervalMs) {\r\n lastRun = now;\r\n fn(...args);\r\n }\r\n };\r\n },\r\n\r\n /**\r\n * Creates a stable unique ID for DOM usage.\r\n *\r\n * @param prefix - Optional prefix for the ID (default: 'bQuery')\r\n * @returns A unique identifier string\r\n *\r\n * @example\r\n * ```ts\r\n * const id = utils.uid('modal'); // 'modal_x7k2m9p'\r\n * ```\r\n */\r\n uid(prefix = 'bQuery'): string {\r\n return `${prefix}_${Math.random().toString(36).slice(2, 9)}`;\r\n },\r\n\r\n /**\r\n * Checks if a value is a DOM Element.\r\n *\r\n * @param value - The value to check\r\n * @returns True if the value is an Element\r\n */\r\n isElement(value: unknown): value is Element {\r\n return value instanceof Element;\r\n },\r\n\r\n /**\r\n * Checks if a value is a BQueryCollection-like object.\r\n *\r\n * @param value - The value to check\r\n * @returns True if the value has an elements array property\r\n */\r\n isCollection(value: unknown): value is { elements: Element[] } {\r\n return Boolean(value && typeof value === 'object' && 'elements' in (value as object));\r\n },\r\n\r\n /**\r\n * Checks for emptiness across common value types.\r\n *\r\n * @param value - The value to check\r\n * @returns True if the value is empty (null, undefined, empty string, empty array, or empty object)\r\n *\r\n * @example\r\n * ```ts\r\n * utils.isEmpty(''); // true\r\n * utils.isEmpty([]); // true\r\n * utils.isEmpty({}); // true\r\n * utils.isEmpty(null); // true\r\n * utils.isEmpty('hello'); // false\r\n * utils.isEmpty([1, 2]); // false\r\n * ```\r\n */\r\n isEmpty(value: unknown): boolean {\r\n if (value == null) return true;\r\n if (typeof value === 'string') return value.trim().length === 0;\r\n if (Array.isArray(value)) return value.length === 0;\r\n if (typeof value === 'object') return Object.keys(value as object).length === 0;\r\n return false;\r\n },\r\n\r\n /**\r\n * Checks if a value is a plain object (not null, array, or class instance).\r\n *\r\n * @param value - The value to check\r\n * @returns True if the value is a plain object\r\n */\r\n isPlainObject(value: unknown): value is Record<string, unknown> {\r\n return Object.prototype.toString.call(value) === '[object Object]';\r\n },\r\n\r\n /**\r\n * Checks if a value is a function.\r\n *\r\n * @param value - The value to check\r\n * @returns True if the value is a function\r\n */\r\n isFunction(value: unknown): value is (...args: unknown[]) => unknown {\r\n return typeof value === 'function';\r\n },\r\n\r\n /**\r\n * Checks if a value is a string.\r\n *\r\n * @param value - The value to check\r\n * @returns True if the value is a string\r\n */\r\n isString(value: unknown): value is string {\r\n return typeof value === 'string';\r\n },\r\n\r\n /**\r\n * Checks if a value is a number (excluding NaN).\r\n *\r\n * @param value - The value to check\r\n * @returns True if the value is a valid number\r\n */\r\n isNumber(value: unknown): value is number {\r\n return typeof value === 'number' && !Number.isNaN(value);\r\n },\r\n\r\n /**\r\n * Checks if a value is a boolean.\r\n *\r\n * @param value - The value to check\r\n * @returns True if the value is a boolean\r\n */\r\n isBoolean(value: unknown): value is boolean {\r\n return typeof value === 'boolean';\r\n },\r\n\r\n /**\r\n * Checks if a value is an array.\r\n *\r\n * @template T - The type of array elements\r\n * @param value - The value to check\r\n * @returns True if the value is an array\r\n */\r\n isArray<T = unknown>(value: unknown): value is T[] {\r\n return Array.isArray(value);\r\n },\r\n\r\n /**\r\n * Safely parses a JSON string, returning a default value on error.\r\n *\r\n * @template T - The expected type of the parsed value\r\n * @param json - The JSON string to parse\r\n * @param fallback - The default value if parsing fails\r\n * @returns The parsed value or the fallback\r\n *\r\n * @example\r\n * ```ts\r\n * utils.parseJson('{\"name\":\"bQuery\"}', {}); // { name: 'bQuery' }\r\n * utils.parseJson('invalid', {}); // {}\r\n * ```\r\n */\r\n parseJson<T>(json: string, fallback: T): T {\r\n try {\r\n return JSON.parse(json) as T;\r\n } catch {\r\n return fallback;\r\n }\r\n },\r\n\r\n /**\r\n * Picks specified keys from an object.\r\n *\r\n * @template T - The object type\r\n * @template K - The key type\r\n * @param obj - The source object\r\n * @param keys - Keys to pick\r\n * @returns A new object with only the specified keys\r\n *\r\n * @example\r\n * ```ts\r\n * const user = { name: 'John', age: 30, email: 'john@example.com' };\r\n * utils.pick(user, ['name', 'email']); // { name: 'John', email: 'john@example.com' }\r\n * ```\r\n */\r\n pick<T extends Record<string, unknown>, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {\r\n const result = {} as Pick<T, K>;\r\n for (const key of keys) {\r\n if (key in obj) {\r\n result[key] = obj[key];\r\n }\r\n }\r\n return result;\r\n },\r\n\r\n /**\r\n * Omits specified keys from an object.\r\n *\r\n * @template T - The object type\r\n * @template K - The key type\r\n * @param obj - The source object\r\n * @param keys - Keys to omit\r\n * @returns A new object without the specified keys\r\n *\r\n * @example\r\n * ```ts\r\n * const user = { name: 'John', age: 30, password: 'secret' };\r\n * utils.omit(user, ['password']); // { name: 'John', age: 30 }\r\n * ```\r\n */\r\n omit<T extends Record<string, unknown>, K extends keyof T>(obj: T, keys: K[]): Omit<T, K> {\r\n const result = { ...obj };\r\n for (const key of keys) {\r\n delete result[key];\r\n }\r\n return result as Omit<T, K>;\r\n },\r\n\r\n /**\r\n * Delays execution for a specified number of milliseconds.\r\n *\r\n * @param ms - Milliseconds to delay\r\n * @returns A promise that resolves after the delay\r\n *\r\n * @example\r\n * ```ts\r\n * await utils.sleep(1000); // Wait 1 second\r\n * console.log('Done!');\r\n * ```\r\n */\r\n sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n },\r\n\r\n /**\r\n * Generates a random integer between min and max (inclusive).\r\n *\r\n * @param min - Minimum value\r\n * @param max - Maximum value\r\n * @returns A random integer in the range [min, max]\r\n *\r\n * @example\r\n * ```ts\r\n * const roll = utils.randomInt(1, 6); // Random dice roll\r\n * ```\r\n */\r\n randomInt(min: number, max: number): number {\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n },\r\n\r\n /**\r\n * Clamps a number between a minimum and maximum value.\r\n *\r\n * @param value - The value to clamp\r\n * @param min - Minimum value\r\n * @param max - Maximum value\r\n * @returns The clamped value\r\n *\r\n * @example\r\n * ```ts\r\n * utils.clamp(150, 0, 100); // 100\r\n * utils.clamp(-10, 0, 100); // 0\r\n * utils.clamp(50, 0, 100); // 50\r\n * ```\r\n */\r\n clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), max);\r\n },\r\n\r\n /**\r\n * Capitalizes the first letter of a string.\r\n *\r\n * @param str - The string to capitalize\r\n * @returns The capitalized string\r\n *\r\n * @example\r\n * ```ts\r\n * utils.capitalize('hello'); // 'Hello'\r\n * ```\r\n */\r\n capitalize(str: string): string {\r\n if (!str) return str;\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n },\r\n\r\n /**\r\n * Converts a string to kebab-case.\r\n *\r\n * @param str - The string to convert\r\n * @returns The kebab-cased string\r\n *\r\n * @example\r\n * ```ts\r\n * utils.toKebabCase('myVariableName'); // 'my-variable-name'\r\n * ```\r\n */\r\n toKebabCase(str: string): string {\r\n return str\r\n .replace(/([a-z])([A-Z])/g, '$1-$2')\r\n .replace(/[\\s_]+/g, '-')\r\n .toLowerCase();\r\n },\r\n\r\n /**\r\n * Converts a string to camelCase.\r\n *\r\n * @param str - The string to convert\r\n * @returns The camelCased string\r\n *\r\n * @example\r\n * ```ts\r\n * utils.toCamelCase('my-variable-name'); // 'myVariableName'\r\n * ```\r\n */\r\n toCamelCase(str: string): string {\r\n return str\r\n .replace(/[-_\\s]+(.)?/g, (_, char) => (char ? char.toUpperCase() : ''))\r\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\r\n },\r\n};\r\n"],"names":["toElementList","input","applyAll","elements","action","el","BQueryElement","element","classNames","className","force","name","value","key","match","sanitizeHtml","property","val","content","wrapper","wrapperEl","parent","newEl","template","options","deep","selector","child","event","handler","detail","e","target","handlers","display","isHidden","newValue","form","result","formData","existing","params","position","BQueryCollection","index","callback","predicate","initialValue","sanitized","elementHandlers","$","$$","utils","sources","source","fn","delayMs","timeoutId","args","intervalMs","lastRun","now","prefix","json","fallback","obj","keys","ms","resolve","min","max","str","_","char"],"mappings":"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"}
package/dist/full.d.ts CHANGED
@@ -35,8 +35,8 @@
35
35
  * ```
36
36
  */
37
37
  export { $, $$, BQueryCollection, BQueryElement, utils } from './core/index';
38
- export { Computed, Signal, batch, computed, effect, persistedSignal, signal, } from './reactive/index';
39
- export type { CleanupFn, Observer } from './reactive/index';
38
+ export { Computed, Signal, batch, computed, effect, isComputed, isSignal, persistedSignal, readonly, signal, untrack, watch, } from './reactive/index';
39
+ export type { CleanupFn, Observer, ReadonlySignal } from './reactive/index';
40
40
  export { component, html, safeHtml } from './component/index';
41
41
  export type { ComponentDefinition, PropDefinition } from './component/index';
42
42
  export { capturePosition, flip, flipList, spring, springPresets, transition } from './motion/index';
@@ -1 +1 @@
1
- {"version":3,"file":"full.d.ts","sourceRoot":"","sources":["../src/full.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAKH,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAK7E,OAAO,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAM,EACN,eAAe,EACf,MAAM,GACP,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAK5D,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC9D,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAK7E,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACpG,YAAY,EACV,aAAa,EACb,WAAW,EACX,MAAM,EACN,YAAY,EACZ,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,QAAQ,EACR,YAAY,EACZ,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKxD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC1E,YAAY,EACV,MAAM,EACN,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,GACf,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"full.d.ts","sourceRoot":"","sources":["../src/full.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAKH,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAK7E,OAAO,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAM,EACN,UAAU,EACV,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,MAAM,EACN,OAAO,EACP,KAAK,GACN,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAK5E,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC9D,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAK7E,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACpG,YAAY,EACV,aAAa,EACb,WAAW,EACX,MAAM,EACN,YAAY,EACZ,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,QAAQ,EACR,YAAY,EACZ,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKxD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC1E,YAAY,EACV,MAAM,EACN,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,GACf,MAAM,kBAAkB,CAAC"}
package/dist/full.es.mjs CHANGED
@@ -1,43 +1,48 @@
1
- import { $ as i, $$ as r, BQueryCollection as s, BQueryElement as o, utils as p } from "./core.es.mjs";
2
- import { Computed as n, Signal as c, batch as l, computed as m, effect as f, persistedSignal as u, signal as g } from "./reactive.es.mjs";
3
- import { component as x, html as T, safeHtml as y } from "./component.es.mjs";
4
- import { capturePosition as H, flip as P, flipList as S, spring as z, springPresets as C, transition as $ } from "./motion.es.mjs";
5
- import { createTrustedHtml as B, escapeHtml as Q, generateNonce as k, getTrustedTypesPolicy as v, hasCSPDirective as D, isTrustedTypesSupported as E, sanitize as L, sanitize as N, stripTags as j } from "./security.es.mjs";
6
- import { buckets as w, cache as A, notifications as F, storage as G } from "./platform.es.mjs";
1
+ import { $ as i, $$ as r, BQueryCollection as s, BQueryElement as o, utils as a } from "./core.es.mjs";
2
+ import { Computed as p, Signal as c, batch as l, computed as m, effect as u, isComputed as f, isSignal as g, persistedSignal as d, readonly as x, signal as y, untrack as T, watch as h } from "./reactive.es.mjs";
3
+ import { component as C, html as H, safeHtml as P } from "./component.es.mjs";
4
+ import { capturePosition as $, flip as b, flipList as k, spring as B, springPresets as Q, transition as v } from "./motion.es.mjs";
5
+ import { createTrustedHtml as D, escapeHtml as E, generateNonce as L, getTrustedTypesPolicy as N, hasCSPDirective as j, isTrustedTypesSupported as q, sanitize as A, sanitize as F, stripTags as G } from "./security.es.mjs";
6
+ import { buckets as J, cache as K, notifications as M, storage as O } from "./platform.es.mjs";
7
7
  export {
8
8
  i as $,
9
9
  r as $$,
10
10
  s as BQueryCollection,
11
11
  o as BQueryElement,
12
- n as Computed,
12
+ p as Computed,
13
13
  c as Signal,
14
14
  l as batch,
15
- w as buckets,
16
- A as cache,
17
- H as capturePosition,
18
- x as component,
15
+ J as buckets,
16
+ K as cache,
17
+ $ as capturePosition,
18
+ C as component,
19
19
  m as computed,
20
- B as createTrustedHtml,
21
- f as effect,
22
- Q as escapeHtml,
23
- P as flip,
24
- S as flipList,
25
- k as generateNonce,
26
- v as getTrustedTypesPolicy,
27
- D as hasCSPDirective,
28
- T as html,
29
- E as isTrustedTypesSupported,
30
- F as notifications,
31
- u as persistedSignal,
32
- y as safeHtml,
33
- L as sanitize,
34
- N as sanitizeHtml,
35
- g as signal,
36
- z as spring,
37
- C as springPresets,
38
- G as storage,
39
- j as stripTags,
40
- $ as transition,
41
- p as utils
20
+ D as createTrustedHtml,
21
+ u as effect,
22
+ E as escapeHtml,
23
+ b as flip,
24
+ k as flipList,
25
+ L as generateNonce,
26
+ N as getTrustedTypesPolicy,
27
+ j as hasCSPDirective,
28
+ H as html,
29
+ f as isComputed,
30
+ g as isSignal,
31
+ q as isTrustedTypesSupported,
32
+ M as notifications,
33
+ d as persistedSignal,
34
+ x as readonly,
35
+ P as safeHtml,
36
+ A as sanitize,
37
+ F as sanitizeHtml,
38
+ y as signal,
39
+ B as spring,
40
+ Q as springPresets,
41
+ O as storage,
42
+ G as stripTags,
43
+ v as transition,
44
+ T as untrack,
45
+ a as utils,
46
+ h as watch
42
47
  };
43
48
  //# sourceMappingURL=full.es.mjs.map
package/dist/full.iife.js CHANGED
@@ -1,2 +1,2 @@
1
- var bQuery=function(i){"use strict";const E="bquery-sanitizer";let v=null;const B=()=>typeof window.trustedTypes<"u",O=()=>{if(v)return v;const r=window;if(!r.trustedTypes)return null;try{return v=r.trustedTypes.createPolicy(E,{createHTML:t=>L(t)}),v}catch{return console.warn(`bQuery: Could not create Trusted Types policy "${E}"`),null}},F=new Set(["a","abbr","address","article","aside","b","bdi","bdo","blockquote","br","button","caption","cite","code","col","colgroup","data","dd","del","details","dfn","div","dl","dt","em","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","i","img","input","ins","kbd","label","legend","li","main","mark","nav","ol","optgroup","option","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","small","source","span","strong","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","u","ul","var","wbr"]),I=new Set(["alt","class","dir","height","hidden","href","id","lang","loading","name","role","src","srcset","style","tabindex","title","type","width","aria-*"]),R=["on","formaction"],U=["javascript:","data:","vbscript:"],z=(r,t,e)=>{const s=r.toLowerCase();for(const n of R)if(s.startsWith(n))return!1;return e&&s.startsWith("data-")||s.startsWith("aria-")?!0:t.has(s)},Q=r=>r.replace(/[\u0000-\u001F\u007F\s]+/g,"").toLowerCase(),W=r=>{const t=Q(r);for(const e of U)if(t.startsWith(e))return!1;return!0},L=(r,t={})=>{const{allowTags:e=[],allowAttributes:s=[],allowDataAttributes:n=!0,stripAllTags:o=!1}=t,a=new Set([...F,...e.map(u=>u.toLowerCase())]),l=new Set([...I,...s.map(u=>u.toLowerCase())]),c=document.createElement("template");if(c.innerHTML=r,o)return c.content.textContent??"";const m=document.createTreeWalker(c.content,NodeFilter.SHOW_ELEMENT),f=[];for(;m.nextNode();){const u=m.currentNode,A=u.tagName.toLowerCase();if(!a.has(A)){f.push(u);continue}const g=[];for(const d of Array.from(u.attributes)){const b=d.name.toLowerCase();if(!z(b,l,n)){g.push(d.name);continue}(b==="href"||b==="src"||b==="srcset")&&!W(d.value)&&g.push(d.name)}for(const d of g)u.removeAttribute(d)}for(const u of f)u.remove();return c.innerHTML},w=(r,t={})=>L(r,t),J=r=>{const t=O();return t?t.createHTML(r):w(r)},G=r=>{const t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"};return r.replace(/[&<>"'`]/g,e=>t[e])},K=r=>L(r,{stripAllTags:!0}),Z=(r=16)=>{const t=new Uint8Array(r);return crypto.getRandomValues(t),btoa(String.fromCharCode(...t)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")},X=r=>{const t=document.querySelector('meta[http-equiv="Content-Security-Policy"]');return t?(t.getAttribute("content")??"").includes(r):!1},Y=r=>Array.isArray(r)?r:[r],h=(r,t)=>{for(const e of r)t(e)};class p{constructor(t){this.element=t}get raw(){return this.element}get node(){return this.element}addClass(...t){return this.element.classList.add(...t),this}removeClass(...t){return this.element.classList.remove(...t),this}toggleClass(t,e){return this.element.classList.toggle(t,e),this}attr(t,e){return e===void 0?this.element.getAttribute(t)??"":(this.element.setAttribute(t,e),this)}prop(t,e){return e===void 0?this.element[t]:(this.element[t]=e,this)}data(t,e){const s=t.replace(/[A-Z]/g,n=>`-${n.toLowerCase()}`);return e===void 0?this.element.getAttribute(`data-${s}`)??"":(this.element.setAttribute(`data-${s}`,e),this)}text(t){return t===void 0?this.element.textContent??"":(this.element.textContent=t,this)}html(t){return this.element.innerHTML=w(t),this}htmlUnsafe(t){return this.element.innerHTML=t,this}css(t,e){if(typeof t=="string")return e!==void 0&&this.element.style.setProperty(t,e),this;for(const[s,n]of Object.entries(t))this.element.style.setProperty(s,n);return this}append(t){return this.insertContent(t,"beforeend"),this}prepend(t){return this.insertContent(t,"afterbegin"),this}before(t){return this.insertContent(t,"beforebegin"),this}after(t){return this.insertContent(t,"afterend"),this}remove(){return this.element.remove(),this}empty(){return this.element.innerHTML="",this}clone(t=!0){return new p(this.element.cloneNode(t))}find(t){return Array.from(this.element.querySelectorAll(t))}findOne(t){return this.element.querySelector(t)}closest(t){return this.element.closest(t)}parent(){return this.element.parentElement}children(){return Array.from(this.element.children)}siblings(){const t=this.element.parentElement;return t?Array.from(t.children).filter(e=>e!==this.element):[]}next(){return this.element.nextElementSibling}prev(){return this.element.previousElementSibling}on(t,e){return this.element.addEventListener(t,e),this}once(t,e){return this.element.addEventListener(t,e,{once:!0}),this}off(t,e){return this.element.removeEventListener(t,e),this}trigger(t,e){return this.element.dispatchEvent(new CustomEvent(t,{detail:e,bubbles:!0,cancelable:!0})),this}matches(t){return this.element.matches(t)}hasClass(t){return this.element.classList.contains(t)}show(t=""){return this.element.removeAttribute("hidden"),this.element.style.display=t,this}hide(){return this.element.style.display="none",this}toggle(t){const e=this.element.style.display==="none";return t??e?this.show():this.hide()}focus(){return this.element.focus(),this}blur(){return this.element.blur(),this}val(t){const e=this.element;return t===void 0?e.value??"":(e.value=t,this)}rect(){return this.element.getBoundingClientRect()}offset(){const t=this.element;return{width:t.offsetWidth,height:t.offsetHeight,top:t.offsetTop,left:t.offsetLeft}}insertContent(t,e){if(typeof t=="string"){this.element.insertAdjacentHTML(e,w(t));return}const s=Y(t);h(s,n=>{this.element.insertAdjacentElement(e,n)})}}class S{constructor(t){this.elements=t}get length(){return this.elements.length}first(){return this.elements[0]}eq(t){const e=this.elements[t];return e?new p(e):void 0}firstEl(){return this.eq(0)}lastEl(){return this.eq(this.elements.length-1)}each(t){return this.elements.forEach((e,s)=>{t(new p(e),s)}),this}map(t){return this.elements.map(t)}filter(t){return new S(this.elements.filter(t))}reduce(t,e){return this.elements.reduce(t,e)}toArray(){return this.elements.map(t=>new p(t))}addClass(...t){return h(this.elements,e=>e.classList.add(...t)),this}removeClass(...t){return h(this.elements,e=>e.classList.remove(...t)),this}toggleClass(t,e){return h(this.elements,s=>s.classList.toggle(t,e)),this}attr(t,e){return e===void 0?this.first()?.getAttribute(t)??"":(h(this.elements,s=>s.setAttribute(t,e)),this)}removeAttr(t){return h(this.elements,e=>e.removeAttribute(t)),this}text(t){return t===void 0?this.first()?.textContent??"":(h(this.elements,e=>{e.textContent=t}),this)}html(t){if(t===void 0)return this.first()?.innerHTML??"";const e=w(t);return h(this.elements,s=>{s.innerHTML=e}),this}htmlUnsafe(t){return h(this.elements,e=>{e.innerHTML=t}),this}css(t,e){return typeof t=="string"?(e!==void 0&&h(this.elements,s=>{s.style.setProperty(t,e)}),this):(h(this.elements,s=>{for(const[n,o]of Object.entries(t))s.style.setProperty(n,o)}),this)}show(t=""){return h(this.elements,e=>{e.removeAttribute("hidden"),e.style.display=t}),this}hide(){return h(this.elements,t=>{t.style.display="none"}),this}on(t,e){return h(this.elements,s=>s.addEventListener(t,e)),this}once(t,e){return h(this.elements,s=>s.addEventListener(t,e,{once:!0})),this}off(t,e){return h(this.elements,s=>s.removeEventListener(t,e)),this}trigger(t,e){return h(this.elements,s=>{s.dispatchEvent(new CustomEvent(t,{detail:e,bubbles:!0,cancelable:!0}))}),this}remove(){return h(this.elements,t=>t.remove()),this}empty(){return h(this.elements,t=>{t.innerHTML=""}),this}}const x=r=>{if(typeof r!="string")return new p(r);const t=document.querySelector(r);if(!t)throw new Error(`bQuery: element not found for selector "${r}"`);return new p(t)},V=r=>Array.isArray(r)?new S(r):r instanceof NodeList?new S(Array.from(r)):new S(Array.from(document.querySelectorAll(r))),C={clone(r){return typeof structuredClone=="function"?structuredClone(r):JSON.parse(JSON.stringify(r))},merge(...r){const t={};for(const e of r)for(const[s,n]of Object.entries(e))C.isPlainObject(n)&&C.isPlainObject(t[s])?t[s]=C.merge(t[s],n):t[s]=n;return t},debounce(r,t){let e;return(...s)=>{e&&clearTimeout(e),e=setTimeout(()=>r(...s),t)}},throttle(r,t){let e=0;return(...s)=>{const n=Date.now();n-e>=t&&(e=n,r(...s))}},uid(r="bQuery"){return`${r}_${Math.random().toString(36).slice(2,9)}`},isElement(r){return r instanceof Element},isCollection(r){return!!(r&&typeof r=="object"&&"elements"in r)},isEmpty(r){return r==null?!0:typeof r=="string"?r.trim().length===0:Array.isArray(r)?r.length===0:typeof r=="object"?Object.keys(r).length===0:!1},isPlainObject(r){return Object.prototype.toString.call(r)==="[object Object]"},isFunction(r){return typeof r=="function"},isString(r){return typeof r=="string"},isNumber(r){return typeof r=="number"&&!Number.isNaN(r)},isBoolean(r){return typeof r=="boolean"},isArray(r){return Array.isArray(r)},parseJson(r,t){try{return JSON.parse(r)}catch{return t}},pick(r,t){const e={};for(const s of t)s in r&&(e[s]=r[s]);return e},omit(r,t){const e={...r};for(const s of t)delete e[s];return e},sleep(r){return new Promise(t=>setTimeout(t,r))},randomInt(r,t){return Math.floor(Math.random()*(t-r+1))+r},clamp(r,t,e){return Math.min(Math.max(r,t),e)},capitalize(r){return r&&r.charAt(0).toUpperCase()+r.slice(1)},toKebabCase(r){return r.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/[\s_]+/g,"-").toLowerCase()},toCamelCase(r){return r.replace(/[-_\s]+(.)?/g,(t,e)=>e?e.toUpperCase():"").replace(/^[A-Z]/,t=>t.toLowerCase())}};let y=[],T=0;const N=new Set,k=(r,t)=>{y=[...y,r];try{return t()}finally{y=y.slice(0,-1)}},$=r=>{if(T>0){N.add(r);return}r()},tt=()=>{for(const r of Array.from(N))N.delete(r),r()};class H{constructor(t){this._value=t,this.subscribers=new Set}get value(){const t=y[y.length-1];return t&&this.subscribers.add(t),this._value}set value(t){if(!Object.is(this._value,t)){this._value=t;for(const e of this.subscribers)$(e)}}peek(){return this._value}update(t){this.value=t(this._value)}}class q{constructor(t){this.compute=t,this.dirty=!0,this.subscribers=new Set,this.markDirty=()=>{this.dirty=!0;for(const e of this.subscribers)$(e)}}get value(){const t=y[y.length-1];return t&&this.subscribers.add(t),this.dirty&&(this.dirty=!1,this.cachedValue=k(this.markDirty,this.compute)),this.cachedValue}}const M=r=>new H(r),et=r=>new q(r),j=r=>{let t,e=!1;const s=()=>{e||(t&&t(),t=k(s,r))};return s(),()=>{e=!0,t&&t()}},rt=r=>{T+=1;try{r()}finally{T-=1,T===0&&tt()}},st=(r,t)=>{let e=t;try{const n=localStorage.getItem(r);n!==null&&(e=JSON.parse(n))}catch{}const s=M(e);return j(()=>{try{localStorage.setItem(r,JSON.stringify(s.value))}catch{}}),s},nt=(r,t)=>{const{type:e}=t;if(e===String)return r;if(e===Number){const s=Number(r);return Number.isNaN(s)?r:s}if(e===Boolean){const s=r.trim().toLowerCase();return s===""||s==="true"||s==="1"?!0:s==="false"||s==="0"?!1:!!r}if(e===Object||e===Array)try{return JSON.parse(r)}catch{return r}if(typeof e=="function"){const s=e,n=e;try{return s(r)}catch{return new n(r)}}return r},it=(r,...t)=>r.reduce((e,s,n)=>`${e}${s}${t[n]??""}`,""),ot=(r,...t)=>{const e={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},s=n=>String(n??"").replace(/[&<>"'`]/g,a=>e[a]);return r.reduce((n,o,a)=>`${n}${o}${s(t[a])}`,"")},at=(r,t)=>{class e extends HTMLElement{constructor(){super(),this.state={...t.state??{}},this.props={},this.attachShadow({mode:"open"}),this.syncProps()}static get observedAttributes(){return Object.keys(t.props??{})}connectedCallback(){t.connected?.call(this),this.render()}disconnectedCallback(){t.disconnected?.call(this)}attributeChangedCallback(){this.syncProps(),this.render(!0)}setState(n,o){this.state[n]=o,this.render(!0)}getState(n){return this.state[n]}syncProps(){const n=t.props??{};for(const[o,a]of Object.entries(n)){const l=this.getAttribute(o);if(l==null){if(a.required&&a.default===void 0)throw new Error(`bQuery component: missing required prop "${o}"`);this.props[o]=a.default??void 0;continue}this.props[o]=nt(l,a)}}render(n=!1){const o=(c,m)=>{this.dispatchEvent(new CustomEvent(c,{detail:m,bubbles:!0,composed:!0}))};if(!this.shadowRoot)return;const a=t.render({props:this.props,state:this.state,emit:o}),l=t.styles?`<style>${t.styles}</style>`:"";this.shadowRoot.innerHTML=`${l}${a}`,n&&t.updated?.call(this)}}customElements.get(r)||customElements.define(r,e)},ct=async r=>{const t=typeof r=="function"?r:r.update,e=document;if(e.startViewTransition){await e.startViewTransition(()=>t()).finished;return}t()},P=r=>{const t=r.getBoundingClientRect();return{top:t.top,left:t.left,width:t.width,height:t.height}},D=(r,t,e={})=>{const{duration:s=300,easing:n="ease-out",onComplete:o}=e,a=P(r);if(a.width===0||a.height===0)return Promise.resolve();const l=t.left-a.left,c=t.top-a.top,m=t.width/a.width,f=t.height/a.height;if(l===0&&c===0&&m===1&&f===1)return Promise.resolve();const u=r;return u.style.transform=`translate(${l}px, ${c}px) scale(${m}, ${f})`,u.style.transformOrigin="top left",u.offsetHeight,new Promise(A=>{const g=u.animate([{transform:`translate(${l}px, ${c}px) scale(${m}, ${f})`},{transform:"translate(0, 0) scale(1, 1)"}],{duration:s,easing:n,fill:"forwards"});g.onfinish=()=>{u.style.transform="",u.style.transformOrigin="",o?.(),A()}})},lt=async(r,t,e={})=>{const s=new Map;for(const o of r)s.set(o,P(o));t();const n=r.map(o=>{const a=s.get(o);return a?D(o,a,e):Promise.resolve()});await Promise.all(n)},ut={stiffness:100,damping:10,mass:1,precision:.01},ht=(r,t={})=>{const{stiffness:e,damping:s,mass:n,precision:o}={...ut,...t};let a=r,l=0,c=r,m=null,f=null;const u=new Set,A=()=>{for(const d of u)d(a)},g=()=>{const d=a-c,b=-e*d,vt=-s*l,Ct=(b+vt)/n;if(l+=Ct*(1/60),a+=l*(1/60),A(),Math.abs(l)<o&&Math.abs(d)<o){a=c,l=0,m=null,A(),f?.(),f=null;return}m=requestAnimationFrame(g)};return{to(d){return c=d,m!==null&&cancelAnimationFrame(m),new Promise(b=>{f=b,m=requestAnimationFrame(g)})},current(){return a},stop(){m!==null&&(cancelAnimationFrame(m),m=null),l=0,f?.(),f=null},onChange(d){return u.add(d),()=>u.delete(d)}}},mt={gentle:{stiffness:80,damping:15},snappy:{stiffness:200,damping:20},bouncy:{stiffness:300,damping:8},stiff:{stiffness:400,damping:30}};class dt{constructor(t){this.bucketName=t,this.dbPromise=null,this.storeName="blobs"}openDB(){if(this.dbPromise)return this.dbPromise;const t=`bquery-bucket-${this.bucketName}`;return this.dbPromise=new Promise((e,s)=>{const n=indexedDB.open(t,1);n.onupgradeneeded=()=>{const o=n.result;o.objectStoreNames.contains(this.storeName)||o.createObjectStore(this.storeName)},n.onsuccess=()=>e(n.result),n.onerror=()=>s(n.error)}),this.dbPromise}async withStore(t,e){const s=await this.openDB();return new Promise((n,o)=>{const l=s.transaction(this.storeName,t).objectStore(this.storeName),c=e(l);c.onsuccess=()=>n(c.result),c.onerror=()=>o(c.error)})}async put(t,e){await this.withStore("readwrite",s=>s.put(e,t))}async get(t){return await this.withStore("readonly",s=>s.get(t))??null}async remove(t){await this.withStore("readwrite",e=>e.delete(t))}async keys(){return(await this.withStore("readonly",e=>e.getAllKeys())).map(e=>String(e))}}const ft={async open(r){return new dt(r)}};class pt{constructor(t){this.cache=t}async add(t){await this.cache.add(t)}async addAll(t){await this.cache.addAll(t)}async put(t,e){await this.cache.put(t,e)}async match(t){return this.cache.match(t)}async remove(t){return this.cache.delete(t)}async keys(){return(await this.cache.keys()).map(e=>e.url)}}const yt={isSupported(){return"caches"in window},async open(r){if(!this.isSupported())throw new Error("bQuery: Cache Storage API not supported");const t=await caches.open(r);return new pt(t)},async delete(r){return this.isSupported()?caches.delete(r):!1},async keys(){return this.isSupported()?caches.keys():[]}},gt={isSupported(){return"Notification"in window},getPermission(){return this.isSupported()?Notification.permission:"denied"},async requestPermission(){return this.isSupported()?Notification.permission==="granted"?"granted":Notification.permission==="denied"?"denied":Notification.requestPermission():"denied"},send(r,t){return this.isSupported()?Notification.permission!=="granted"?(console.warn("bQuery: Notification permission not granted"),null):new Notification(r,t):(console.warn("bQuery: Notifications not supported in this browser"),null)}};class _{constructor(t){this.storage=t}async get(t){const e=this.storage.getItem(t);if(e===null)return null;try{return JSON.parse(e)}catch{return e}}async set(t,e){const s=typeof e=="string"?e:JSON.stringify(e);this.storage.setItem(t,s)}async remove(t){this.storage.removeItem(t)}async clear(){this.storage.clear()}async keys(){return Object.keys(this.storage)}}class bt extends _{constructor(){super(localStorage)}}class wt extends _{constructor(){super(sessionStorage)}}class St{constructor(t){this.options=t,this.dbPromise=null}openDB(){return this.dbPromise?this.dbPromise:(this.dbPromise=new Promise((t,e)=>{const s=indexedDB.open(this.options.name,this.options.version??1);s.onupgradeneeded=()=>{const n=s.result;n.objectStoreNames.contains(this.options.store)||n.createObjectStore(this.options.store)},s.onsuccess=()=>t(s.result),s.onerror=()=>e(s.error)}),this.dbPromise)}async withStore(t,e){const s=await this.openDB();return new Promise((n,o)=>{const l=s.transaction(this.options.store,t).objectStore(this.options.store),c=e(l);c.onsuccess=()=>n(c.result),c.onerror=()=>o(c.error)})}async get(t){return await this.withStore("readonly",s=>s.get(t))??null}async set(t,e){await this.withStore("readwrite",s=>s.put(e,t))}async remove(t){await this.withStore("readwrite",e=>e.delete(t))}async clear(){await this.withStore("readwrite",t=>t.clear())}async keys(){return(await this.withStore("readonly",e=>e.getAllKeys())).map(e=>String(e))}}const At={local(){return new bt},session(){return new wt},indexedDB(r){return new St(r)}};return i.$=x,i.$$=V,i.BQueryCollection=S,i.BQueryElement=p,i.Computed=q,i.Signal=H,i.batch=rt,i.buckets=ft,i.cache=yt,i.capturePosition=P,i.component=at,i.computed=et,i.createTrustedHtml=J,i.effect=j,i.escapeHtml=G,i.flip=D,i.flipList=lt,i.generateNonce=Z,i.getTrustedTypesPolicy=O,i.hasCSPDirective=X,i.html=it,i.isTrustedTypesSupported=B,i.notifications=gt,i.persistedSignal=st,i.safeHtml=ot,i.sanitize=w,i.sanitizeHtml=w,i.signal=M,i.spring=ht,i.springPresets=mt,i.storage=At,i.stripTags=K,i.transition=ct,i.utils=C,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}),i}({});
1
+ var bQuery=function(a){"use strict";const O="bquery-sanitizer";let C=null;const I=()=>typeof window.trustedTypes<"u",M=()=>{if(C)return C;const r=window;if(!r.trustedTypes)return null;try{return C=r.trustedTypes.createPolicy(O,{createHTML:e=>N(e)}),C}catch{return console.warn(`bQuery: Could not create Trusted Types policy "${O}"`),null}},R=new Set(["a","abbr","address","article","aside","b","bdi","bdo","blockquote","br","button","caption","cite","code","col","colgroup","data","dd","del","details","dfn","div","dl","dt","em","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","i","img","input","ins","kbd","label","legend","li","main","mark","nav","ol","optgroup","option","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","small","source","span","strong","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","u","ul","var","wbr"]),D=new Set(["script","iframe","frame","frameset","object","embed","applet","link","meta","style","base","template","slot","math","svg","foreignobject","noscript"]),U=new Set(["document","window","location","top","self","parent","frames","history","navigator","screen","alert","confirm","prompt","eval","Function","cookie","domain","referrer","body","head","forms","images","links","scripts","children","parentNode","firstChild","lastChild","innerHTML","outerHTML","textContent"]),z=new Set(["alt","class","dir","height","hidden","href","id","lang","loading","name","role","src","srcset","style","tabindex","title","type","width","aria-*"]),W=["on","formaction","xlink:","xmlns:"],Q=["javascript:","data:","vbscript:","file:"],J=(r,e,t)=>{const s=r.toLowerCase();for(const n of W)if(s.startsWith(n))return!1;return t&&s.startsWith("data-")||s.startsWith("aria-")?!0:e.has(s)},G=r=>{const e=r.toLowerCase().trim();return!U.has(e)},K=r=>r.replace(/[\u0000-\u001F\u007F]+/g,"").replace(/[\u200B-\u200D\uFEFF\u2028\u2029]+/g,"").replace(/\\u[\da-fA-F]{4}/g,"").replace(/\s+/g,"").toLowerCase(),V=r=>{const e=K(r);for(const t of Q)if(e.startsWith(t))return!1;return!0},N=(r,e={})=>{const{allowTags:t=[],allowAttributes:s=[],allowDataAttributes:n=!0,stripAllTags:i=!1}=e,o=new Set([...R,...t.map(u=>u.toLowerCase())].filter(u=>!D.has(u))),l=new Set([...z,...s.map(u=>u.toLowerCase())]),c=document.createElement("template");if(c.innerHTML=r,i)return c.content.textContent??"";const h=document.createTreeWalker(c.content,NodeFilter.SHOW_ELEMENT),f=[];for(;h.nextNode();){const u=h.currentNode,w=u.tagName.toLowerCase();if(D.has(w)){f.push(u);continue}if(!o.has(w)){f.push(u);continue}const y=[];for(const m of Array.from(u.attributes)){const p=m.name.toLowerCase();if(!J(p,l,n)){y.push(m.name);continue}if((p==="id"||p==="name")&&!G(m.value)){y.push(m.name);continue}(p==="href"||p==="src"||p==="srcset")&&!V(m.value)&&y.push(m.name)}for(const m of y)u.removeAttribute(m)}for(const u of f)u.remove();return c.innerHTML},b=(r,e={})=>N(r,e),Z=r=>{const e=M();return e?e.createHTML(r):b(r)},X=r=>{const e={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"};return r.replace(/[&<>"'`]/g,t=>e[t])},Y=r=>N(r,{stripAllTags:!0}),x=(r=16)=>{const e=new Uint8Array(r);return crypto.getRandomValues(e),btoa(String.fromCharCode(...e)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")},ee=r=>{const e=document.querySelector('meta[http-equiv="Content-Security-Policy"]');return e?(e.getAttribute("content")??"").includes(r):!1},te=r=>Array.isArray(r)?r:[r],d=(r,e)=>{for(const t of r)e(t)};class g{constructor(e){this.element=e,this.delegatedHandlers=new Map}get raw(){return this.element}get node(){return this.element}addClass(...e){return this.element.classList.add(...e),this}removeClass(...e){return this.element.classList.remove(...e),this}toggleClass(e,t){return this.element.classList.toggle(e,t),this}attr(e,t){return t===void 0?this.element.getAttribute(e)??"":(this.element.setAttribute(e,t),this)}prop(e,t){return t===void 0?this.element[e]:(this.element[e]=t,this)}data(e,t){const s=e.replace(/[A-Z]/g,n=>`-${n.toLowerCase()}`);return t===void 0?this.element.getAttribute(`data-${s}`)??"":(this.element.setAttribute(`data-${s}`,t),this)}text(e){return e===void 0?this.element.textContent??"":(this.element.textContent=e,this)}html(e){return this.element.innerHTML=b(e),this}htmlUnsafe(e){return this.element.innerHTML=e,this}css(e,t){if(typeof e=="string")return t!==void 0&&this.element.style.setProperty(e,t),this;for(const[s,n]of Object.entries(e))this.element.style.setProperty(s,n);return this}append(e){return this.insertContent(e,"beforeend"),this}prepend(e){return this.insertContent(e,"afterbegin"),this}before(e){return this.insertContent(e,"beforebegin"),this}after(e){return this.insertContent(e,"afterend"),this}wrap(e){const t=typeof e=="string"?document.createElement(e):e;return this.element.parentNode?.insertBefore(t,this.element),t.appendChild(this.element),this}unwrap(){const e=this.element.parentElement;return e&&e.parentNode&&(e.parentNode.insertBefore(this.element,e),e.remove()),this}replaceWith(e){let t;if(typeof e=="string"){const s=document.createElement("template");s.innerHTML=b(e),t=s.content.firstElementChild??document.createElement("div")}else t=e;return this.element.replaceWith(t),new g(t)}scrollTo(e={behavior:"smooth"}){return this.element.scrollIntoView(e),this}remove(){return this.element.remove(),this}empty(){return this.element.innerHTML="",this}clone(e=!0){return new g(this.element.cloneNode(e))}find(e){return Array.from(this.element.querySelectorAll(e))}findOne(e){return this.element.querySelector(e)}closest(e){return this.element.closest(e)}parent(){return this.element.parentElement}children(){return Array.from(this.element.children)}siblings(){const e=this.element.parentElement;return e?Array.from(e.children).filter(t=>t!==this.element):[]}next(){return this.element.nextElementSibling}prev(){return this.element.previousElementSibling}on(e,t){return this.element.addEventListener(e,t),this}once(e,t){return this.element.addEventListener(e,t,{once:!0}),this}off(e,t){return this.element.removeEventListener(e,t),this}trigger(e,t){return this.element.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,cancelable:!0})),this}delegate(e,t,s){const n=`${e}:${t}`,i=o=>{const l=o.target.closest(t);l&&this.element.contains(l)&&s(o,l)};return this.delegatedHandlers.has(n)||this.delegatedHandlers.set(n,new Map),this.delegatedHandlers.get(n).set(s,i),this.element.addEventListener(e,i),this}undelegate(e,t,s){const n=`${e}:${t}`,i=this.delegatedHandlers.get(n);if(i){const o=i.get(s);o&&(this.element.removeEventListener(e,o),i.delete(s),i.size===0&&this.delegatedHandlers.delete(n))}return this}matches(e){return this.element.matches(e)}hasClass(e){return this.element.classList.contains(e)}show(e=""){return this.element.removeAttribute("hidden"),this.element.style.display=e,this}hide(){return this.element.style.display="none",this}toggle(e){const t=this.element.style.display==="none";return e??t?this.show():this.hide()}focus(){return this.element.focus(),this}blur(){return this.element.blur(),this}val(e){const t=this.element;return e===void 0?t.value??"":(t.value=e,this)}serialize(){const e=this.element;if(e.tagName.toLowerCase()!=="form")return{};const t={},s=new FormData(e);for(const[n,i]of s.entries())if(typeof i=="string")if(n in t){const o=t[n];Array.isArray(o)?o.push(i):t[n]=[o,i]}else t[n]=i;return t}serializeString(){const e=this.element;if(e.tagName.toLowerCase()!=="form")return"";const t=new FormData(e),s=new URLSearchParams;for(const[n,i]of t.entries())typeof i=="string"&&s.append(n,i);return s.toString()}rect(){return this.element.getBoundingClientRect()}offset(){const e=this.element;return{width:e.offsetWidth,height:e.offsetHeight,top:e.offsetTop,left:e.offsetLeft}}insertContent(e,t){if(typeof e=="string"){this.element.insertAdjacentHTML(t,b(e));return}const s=te(e);d(s,n=>{this.element.insertAdjacentElement(t,n)})}}class S{constructor(e){this.elements=e,this.delegatedHandlers=new WeakMap}get length(){return this.elements.length}first(){return this.elements[0]}eq(e){const t=this.elements[e];return t?new g(t):void 0}firstEl(){return this.eq(0)}lastEl(){return this.eq(this.elements.length-1)}each(e){return this.elements.forEach((t,s)=>{e(new g(t),s)}),this}map(e){return this.elements.map(e)}filter(e){return new S(this.elements.filter(e))}reduce(e,t){return this.elements.reduce(e,t)}toArray(){return this.elements.map(e=>new g(e))}addClass(...e){return d(this.elements,t=>t.classList.add(...e)),this}removeClass(...e){return d(this.elements,t=>t.classList.remove(...e)),this}toggleClass(e,t){return d(this.elements,s=>s.classList.toggle(e,t)),this}attr(e,t){return t===void 0?this.first()?.getAttribute(e)??"":(d(this.elements,s=>s.setAttribute(e,t)),this)}removeAttr(e){return d(this.elements,t=>t.removeAttribute(e)),this}text(e){return e===void 0?this.first()?.textContent??"":(d(this.elements,t=>{t.textContent=e}),this)}html(e){if(e===void 0)return this.first()?.innerHTML??"";const t=b(e);return d(this.elements,s=>{s.innerHTML=t}),this}htmlUnsafe(e){return d(this.elements,t=>{t.innerHTML=e}),this}css(e,t){return typeof e=="string"?(t!==void 0&&d(this.elements,s=>{s.style.setProperty(e,t)}),this):(d(this.elements,s=>{for(const[n,i]of Object.entries(e))s.style.setProperty(n,i)}),this)}show(e=""){return d(this.elements,t=>{t.removeAttribute("hidden"),t.style.display=e}),this}hide(){return d(this.elements,e=>{e.style.display="none"}),this}on(e,t){return d(this.elements,s=>s.addEventListener(e,t)),this}once(e,t){return d(this.elements,s=>s.addEventListener(e,t,{once:!0})),this}off(e,t){return d(this.elements,s=>s.removeEventListener(e,t)),this}trigger(e,t){return d(this.elements,s=>{s.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,cancelable:!0}))}),this}delegate(e,t,s){const n=`${e}:${t}`;return d(this.elements,i=>{const o=c=>{const h=c.target.closest(t);h&&i.contains(h)&&s(c,h)};this.delegatedHandlers.has(i)||this.delegatedHandlers.set(i,new Map);const l=this.delegatedHandlers.get(i);l.has(n)||l.set(n,new Map),l.get(n).set(s,o),i.addEventListener(e,o)}),this}undelegate(e,t,s){const n=`${e}:${t}`;return d(this.elements,i=>{const o=this.delegatedHandlers.get(i);if(!o)return;const l=o.get(n);if(!l)return;const c=l.get(s);c&&(i.removeEventListener(e,c),l.delete(s),l.size===0&&o.delete(n),o.size===0&&this.delegatedHandlers.delete(i))}),this}remove(){return d(this.elements,e=>e.remove()),this}empty(){return d(this.elements,e=>{e.innerHTML=""}),this}}const re=r=>{if(typeof r!="string")return new g(r);const e=document.querySelector(r);if(!e)throw new Error(`bQuery: element not found for selector "${r}"`);return new g(e)},se=r=>Array.isArray(r)?new S(r):r instanceof NodeList?new S(Array.from(r)):new S(Array.from(document.querySelectorAll(r))),A={clone(r){return typeof structuredClone=="function"?structuredClone(r):JSON.parse(JSON.stringify(r))},merge(...r){const e={};for(const t of r)for(const[s,n]of Object.entries(t))A.isPrototypePollutionKey(s)||(A.isPlainObject(n)&&A.isPlainObject(e[s])?e[s]=A.merge(e[s],n):e[s]=n);return e},isPrototypePollutionKey(r){return r==="__proto__"||r==="constructor"||r==="prototype"},debounce(r,e){let t;return(...s)=>{t&&clearTimeout(t),t=setTimeout(()=>r(...s),e)}},throttle(r,e){let t=0;return(...s)=>{const n=Date.now();n-t>=e&&(t=n,r(...s))}},uid(r="bQuery"){return`${r}_${Math.random().toString(36).slice(2,9)}`},isElement(r){return r instanceof Element},isCollection(r){return!!(r&&typeof r=="object"&&"elements"in r)},isEmpty(r){return r==null?!0:typeof r=="string"?r.trim().length===0:Array.isArray(r)?r.length===0:typeof r=="object"?Object.keys(r).length===0:!1},isPlainObject(r){return Object.prototype.toString.call(r)==="[object Object]"},isFunction(r){return typeof r=="function"},isString(r){return typeof r=="string"},isNumber(r){return typeof r=="number"&&!Number.isNaN(r)},isBoolean(r){return typeof r=="boolean"},isArray(r){return Array.isArray(r)},parseJson(r,e){try{return JSON.parse(r)}catch{return e}},pick(r,e){const t={};for(const s of e)s in r&&(t[s]=r[s]);return t},omit(r,e){const t={...r};for(const s of e)delete t[s];return t},sleep(r){return new Promise(e=>setTimeout(e,r))},randomInt(r,e){return Math.floor(Math.random()*(e-r+1))+r},clamp(r,e,t){return Math.min(Math.max(r,e),t)},capitalize(r){return r&&r.charAt(0).toUpperCase()+r.slice(1)},toKebabCase(r){return r.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/[\s_]+/g,"-").toLowerCase()},toCamelCase(r){return r.replace(/[-_\s]+(.)?/g,(e,t)=>t?t.toUpperCase():"").replace(/^[A-Z]/,e=>e.toLowerCase())}},v=[];let E=0;const T=new Set;let L=!0;const j=(r,e)=>{v.push(r);try{return e()}finally{v.pop()}},q=r=>{if(E>0){T.add(r);return}r()},ne=()=>{for(const r of Array.from(T))T.delete(r),r()};class P{constructor(e){this._value=e,this.subscribers=new Set}get value(){if(L){const e=v[v.length-1];e&&this.subscribers.add(e)}return this._value}set value(e){if(!Object.is(this._value,e)){this._value=e;for(const t of this.subscribers)q(t)}}peek(){return this._value}update(e){this.value=e(this._value)}}class k{constructor(e){this.compute=e,this.dirty=!0,this.subscribers=new Set,this.markDirty=()=>{this.dirty=!0;for(const t of this.subscribers)q(t)}}get value(){const e=v[v.length-1];return e&&this.subscribers.add(e),this.dirty&&(this.dirty=!1,this.cachedValue=j(this.markDirty,this.compute)),this.cachedValue}}const F=r=>new P(r),ie=r=>new k(r),H=r=>{let e,t=!1;const s=()=>{t||(e&&e(),e=j(s,r))};return s(),()=>{t=!0,e&&e()}},oe=r=>{E+=1;try{r()}finally{E-=1,E===0&&ne()}},ae=(r,e)=>{let t=e;try{const n=localStorage.getItem(r);n!==null&&(t=JSON.parse(n))}catch{}const s=F(t);return H(()=>{try{localStorage.setItem(r,JSON.stringify(s.value))}catch{}}),s},ce=r=>({get value(){return r.value},peek(){return r.peek()}}),le=(r,e,t={})=>{let s,n=!0;return H(()=>{const i=r.value;if(n){n=!1,s=i,t.immediate&&e(i,void 0);return}e(i,s),s=i})},ue=r=>{const e=L;L=!1;try{return r()}finally{L=e}},he=r=>r instanceof P,de=r=>r instanceof k,me=(r,e)=>{const{type:t}=e;if(t===String)return r;if(t===Number){const s=Number(r);return Number.isNaN(s)?r:s}if(t===Boolean){const s=r.trim().toLowerCase();return s===""||s==="true"||s==="1"?!0:s==="false"||s==="0"?!1:!!r}if(t===Object||t===Array)try{return JSON.parse(r)}catch{return r}if(typeof t=="function"){const s=t,n=t;try{return s(r)}catch{return new n(r)}}return r},fe=(r,...e)=>r.reduce((t,s,n)=>`${t}${s}${e[n]??""}`,""),pe=(r,...e)=>{const t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},s=n=>String(n??"").replace(/[&<>"'`]/g,o=>t[o]);return r.reduce((n,i,o)=>`${n}${i}${s(e[o])}`,"")},ge=(r,e)=>{class t extends HTMLElement{constructor(){super(),this.state={...e.state??{}},this.props={},this.attachShadow({mode:"open"}),this.syncProps()}static get observedAttributes(){return Object.keys(e.props??{})}connectedCallback(){try{e.beforeMount?.call(this),e.connected?.call(this),this.render()}catch(n){this.handleError(n)}}disconnectedCallback(){try{e.disconnected?.call(this)}catch(n){this.handleError(n)}}attributeChangedCallback(){try{this.syncProps(),this.render(!0)}catch(n){this.handleError(n)}}handleError(n){e.onError?e.onError.call(this,n):console.error(`bQuery component error in <${r}>:`,n)}setState(n,i){this.state[n]=i,this.render(!0)}getState(n){return this.state[n]}syncProps(){const n=e.props??{};for(const[i,o]of Object.entries(n)){const l=this.getAttribute(i);let c;if(l==null){if(o.required&&o.default===void 0)throw new Error(`bQuery component: missing required prop "${i}"`);c=o.default??void 0}else c=me(l,o);if(o.validator&&c!==void 0&&!o.validator(c))throw new Error(`bQuery component: validation failed for prop "${i}" with value ${JSON.stringify(c)}`);this.props[i]=c}}render(n=!1){try{if(n&&e.beforeUpdate&&e.beforeUpdate.call(this,this.props)===!1)return;const i=(c,h)=>{this.dispatchEvent(new CustomEvent(c,{detail:h,bubbles:!0,composed:!0}))};if(!this.shadowRoot)return;const o=e.render({props:this.props,state:this.state,emit:i}),l=e.styles?`<style>${e.styles}</style>`:"";this.shadowRoot.innerHTML=`${l}${o}`,n&&e.updated?.call(this)}catch(i){this.handleError(i)}}}customElements.get(r)||customElements.define(r,t)},ye=async r=>{const e=typeof r=="function"?r:r.update,t=document;if(t.startViewTransition){await t.startViewTransition(()=>e()).finished;return}e()},$=r=>{const e=r.getBoundingClientRect();return{top:e.top,left:e.left,width:e.width,height:e.height}},_=(r,e,t={})=>{const{duration:s=300,easing:n="ease-out",onComplete:i}=t,o=$(r);if(o.width===0||o.height===0)return Promise.resolve();const l=e.left-o.left,c=e.top-o.top,h=e.width/o.width,f=e.height/o.height;if(l===0&&c===0&&h===1&&f===1)return Promise.resolve();const u=r;return u.style.transform=`translate(${l}px, ${c}px) scale(${h}, ${f})`,u.style.transformOrigin="top left",u.offsetHeight,new Promise(w=>{const y=u.animate([{transform:`translate(${l}px, ${c}px) scale(${h}, ${f})`},{transform:"translate(0, 0) scale(1, 1)"}],{duration:s,easing:n,fill:"forwards"});y.onfinish=()=>{u.style.transform="",u.style.transformOrigin="",i?.(),w()}})},be=async(r,e,t={})=>{const s=new Map;for(const i of r)s.set(i,$(i));e();const n=r.map(i=>{const o=s.get(i);return o?_(i,o,t):Promise.resolve()});await Promise.all(n)},we={stiffness:100,damping:10,mass:1,precision:.01},Se=(r,e={})=>{const{stiffness:t,damping:s,mass:n,precision:i}={...we,...e};let o=r,l=0,c=r,h=null,f=null;const u=new Set,w=()=>{for(const m of u)m(o)},y=()=>{const m=o-c,p=-t*m,$e=-s*l,Oe=(p+$e)/n;if(l+=Oe*(1/60),o+=l*(1/60),w(),Math.abs(l)<i&&Math.abs(m)<i){o=c,l=0,h=null,w(),f?.(),f=null;return}h=requestAnimationFrame(y)};return{to(m){return c=m,h!==null&&cancelAnimationFrame(h),new Promise(p=>{f=p,h=requestAnimationFrame(y)})},current(){return o},stop(){h!==null&&(cancelAnimationFrame(h),h=null),l=0,f?.(),f=null},onChange(m){return u.add(m),()=>u.delete(m)}}},ve={gentle:{stiffness:80,damping:15},snappy:{stiffness:200,damping:20},bouncy:{stiffness:300,damping:8},stiff:{stiffness:400,damping:30}};class Ae{constructor(e){this.bucketName=e,this.dbPromise=null,this.storeName="blobs"}openDB(){if(this.dbPromise)return this.dbPromise;const e=`bquery-bucket-${this.bucketName}`;return this.dbPromise=new Promise((t,s)=>{const n=indexedDB.open(e,1);n.onupgradeneeded=()=>{const i=n.result;i.objectStoreNames.contains(this.storeName)||i.createObjectStore(this.storeName)},n.onsuccess=()=>t(n.result),n.onerror=()=>s(n.error)}),this.dbPromise}async withStore(e,t){const s=await this.openDB();return new Promise((n,i)=>{const l=s.transaction(this.storeName,e).objectStore(this.storeName),c=t(l);c.onsuccess=()=>n(c.result),c.onerror=()=>i(c.error)})}async put(e,t){await this.withStore("readwrite",s=>s.put(t,e))}async get(e){return await this.withStore("readonly",s=>s.get(e))??null}async remove(e){await this.withStore("readwrite",t=>t.delete(e))}async keys(){return(await this.withStore("readonly",t=>t.getAllKeys())).map(t=>String(t))}}const Ce={async open(r){return new Ae(r)}};class Ee{constructor(e){this.cache=e}async add(e){await this.cache.add(e)}async addAll(e){await this.cache.addAll(e)}async put(e,t){await this.cache.put(e,t)}async match(e){return this.cache.match(e)}async remove(e){return this.cache.delete(e)}async keys(){return(await this.cache.keys()).map(t=>t.url)}}const Le={isSupported(){return"caches"in window},async open(r){if(!this.isSupported())throw new Error("bQuery: Cache Storage API not supported");const e=await caches.open(r);return new Ee(e)},async delete(r){return this.isSupported()?caches.delete(r):!1},async keys(){return this.isSupported()?caches.keys():[]}},Ne={isSupported(){return"Notification"in window},getPermission(){return this.isSupported()?Notification.permission:"denied"},async requestPermission(){return this.isSupported()?Notification.permission==="granted"?"granted":Notification.permission==="denied"?"denied":Notification.requestPermission():"denied"},send(r,e){return this.isSupported()?Notification.permission!=="granted"?(console.warn("bQuery: Notification permission not granted"),null):new Notification(r,e):(console.warn("bQuery: Notifications not supported in this browser"),null)}};class B{constructor(e){this.storage=e}async get(e){const t=this.storage.getItem(e);if(t===null)return null;try{return JSON.parse(t)}catch{return t}}async set(e,t){const s=typeof t=="string"?t:JSON.stringify(t);this.storage.setItem(e,s)}async remove(e){this.storage.removeItem(e)}async clear(){this.storage.clear()}async keys(){return Object.keys(this.storage)}}class Te extends B{constructor(){super(localStorage)}}class Pe extends B{constructor(){super(sessionStorage)}}class ke{constructor(e){this.options=e,this.dbPromise=null}openDB(){return this.dbPromise?this.dbPromise:(this.dbPromise=new Promise((e,t)=>{const s=indexedDB.open(this.options.name,this.options.version??1);s.onupgradeneeded=()=>{const n=s.result;n.objectStoreNames.contains(this.options.store)||n.createObjectStore(this.options.store)},s.onsuccess=()=>e(s.result),s.onerror=()=>t(s.error)}),this.dbPromise)}async withStore(e,t){const s=await this.openDB();return new Promise((n,i)=>{const l=s.transaction(this.options.store,e).objectStore(this.options.store),c=t(l);c.onsuccess=()=>n(c.result),c.onerror=()=>i(c.error)})}async get(e){return await this.withStore("readonly",s=>s.get(e))??null}async set(e,t){await this.withStore("readwrite",s=>s.put(t,e))}async remove(e){await this.withStore("readwrite",t=>t.delete(e))}async clear(){await this.withStore("readwrite",e=>e.clear())}async keys(){return(await this.withStore("readonly",t=>t.getAllKeys())).map(t=>String(t))}}const He={local(){return new Te},session(){return new Pe},indexedDB(r){return new ke(r)}};return a.$=re,a.$$=se,a.BQueryCollection=S,a.BQueryElement=g,a.Computed=k,a.Signal=P,a.batch=oe,a.buckets=Ce,a.cache=Le,a.capturePosition=$,a.component=ge,a.computed=ie,a.createTrustedHtml=Z,a.effect=H,a.escapeHtml=X,a.flip=_,a.flipList=be,a.generateNonce=x,a.getTrustedTypesPolicy=M,a.hasCSPDirective=ee,a.html=fe,a.isComputed=de,a.isSignal=he,a.isTrustedTypesSupported=I,a.notifications=Ne,a.persistedSignal=ae,a.readonly=ce,a.safeHtml=pe,a.sanitize=b,a.sanitizeHtml=b,a.signal=F,a.spring=Se,a.springPresets=ve,a.storage=He,a.stripTags=Y,a.transition=ye,a.untrack=ue,a.utils=A,a.watch=le,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}),a}({});
2
2
  //# sourceMappingURL=full.iife.js.map