{"version":3,"file":"hyperscript-DLVHe_b4.cjs","sources":["../src/listeners.ts","../src/hyperscript.ts"],"sourcesContent":["/**\n * Shared WeakMap that tracks which event listeners are attached to each Element.\n * Populated by h() in hyperscript.ts, consumed by reconcileAttributes() in diff.ts.\n */\nexport type ListenerMap = Map<string, EventListenerOrEventListenerObject>;\nexport const elListeners = new WeakMap<Element, ListenerMap>();\n","import type { Child, Props, Ref } from './types.js';\nimport { elListeners } from './listeners.js';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n// Tags that must be created in the SVG namespace.\n// These are unambiguously SVG-only; shared tags (a, title, script, style, image, text)\n// default to HTML to preserve existing behaviour.\nconst SVG_TAGS = new Set([\n  'svg', 'path', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'rect',\n  'g', 'defs', 'use', 'symbol', 'tspan', 'textPath', 'foreignObject',\n  'clipPath', 'mask', 'pattern', 'linearGradient', 'radialGradient', 'stop',\n  'filter', 'feBlend', 'feColorMatrix', 'feComposite', 'feFlood',\n  'feGaussianBlur', 'feMerge', 'feMergeNode', 'feOffset', 'feTurbulence',\n  'animate', 'animateTransform', 'animateMotion', 'mpath', 'set',\n  'marker', 'view', 'desc', 'metadata',\n]);\n\n/** Flatten nested Child arrays into a single flat array. */\nfunction flattenChildren(children: Child[]): Array<string | number | boolean | null | undefined | Element | DocumentFragment> {\n  const result: Array<string | number | boolean | null | undefined | Element | DocumentFragment> = [];\n  for (const child of children) {\n    if (Array.isArray(child)) {\n      result.push(...flattenChildren(child));\n    } else {\n      result.push(child);\n    }\n  }\n  return result;\n}\n\n/** Append a single child to a parent node. */\nfunction appendChild(parent: Element | DocumentFragment, child: string | number | boolean | null | undefined | Element | DocumentFragment): void {\n  if (child === null || child === undefined || child === false) return;\n  if (child instanceof Element || child instanceof DocumentFragment) {\n    parent.appendChild(child);\n  } else {\n    parent.appendChild(document.createTextNode(String(child)));\n  }\n}\n\n/**\n * Core hyperscript function.\n * - string tag → DOM element\n * - function tag → component call\n */\nexport function h(\n  tag: string | ((...args: unknown[]) => Element | DocumentFragment | void),\n  props?: Props | null,\n  ...children: Child[]\n): Element | DocumentFragment {\n  if (typeof tag === 'function') {\n    const result = tag({ ...(props ?? {}), children: children.length === 1 ? children[0] : children });\n    return result ?? document.createDocumentFragment();\n  }\n\n  const el = SVG_TAGS.has(tag)\n    ? document.createElementNS(SVG_NS, tag)\n    : document.createElement(tag);\n\n  if (props) {\n    let listeners: ReturnType<typeof elListeners.get> | undefined;\n    for (const [key, value] of Object.entries(props)) {\n      if (key === 'ref') {\n        (value as Ref).current = el as never;\n      } else if (key.startsWith('on') && typeof value === 'function') {\n        const eventName = key.slice(2).toLowerCase();\n        el.addEventListener(eventName, value as EventListenerOrEventListenerObject);\n        if (!listeners) { listeners = new Map(); elListeners.set(el, listeners); }\n        listeners.set(eventName, value as EventListenerOrEventListenerObject);\n      } else if (key === 'class' || key === 'className') {\n        if (value !== undefined && value !== null && value !== false) {\n          el.setAttribute('class', String(value));\n        }\n      } else if (key === 'style' && typeof value === 'object' && value !== null) {\n        Object.assign(el.style, value);\n      } else if (typeof value === 'boolean') {\n        if (value) el.setAttribute(key, '');\n        else el.removeAttribute(key);\n      } else if (value !== undefined && value !== null && value !== false) {\n        el.setAttribute(key, String(value));\n      }\n    }\n  }\n\n  const flat = flattenChildren(children);\n  for (const child of flat) {\n    appendChild(el, child);\n  }\n\n  return el;\n}\n\n/** Fragment: <></> in JSX. Returns DocumentFragment. */\nexport function Fragment(\n  props: { children?: Child | Child[] } | null,\n  ...restChildren: Child[]\n): DocumentFragment {\n  const frag = document.createDocumentFragment();\n\n  // Support both JSX-style (children in props) and direct args\n  const kids: Child[] = [];\n  if (props?.children !== undefined) {\n    kids.push(...(Array.isArray(props.children) ? props.children : [props.children]));\n  }\n  kids.push(...restChildren);\n\n  const flat = flattenChildren(kids);\n  for (const child of flat) {\n    appendChild(frag, child);\n  }\n  return frag;\n}\n\n/** Returns a Ref object whose .current is populated by h() when used as a ref prop. */\nexport function ref<T extends Element = Element>(): Ref<T> {\n  return { current: null };\n}\n\n/** Returns true if `v` looks like a props object (plain object, not Element/Fragment/array). */\nfunction isPropsObject(v: unknown): v is Props {\n  return v !== null && typeof v === 'object' && !Array.isArray(v)\n    && !(v instanceof Element) && !(v instanceof DocumentFragment);\n}\n\ntype ElFn = (...args: unknown[]) => Element | DocumentFragment;\n\n/**\n * Proxy sugar: el.button(props?, ...children) === h('button', props, ...children)\n * Props are auto-detected — passing null for \"no props\" is no longer required:\n *   el.div(el.h1('Hello'), el.p('World'))   ← children only, no null needed\n *   el.div({ class: 'card' }, el.p('Hi'))   ← props + children\n *\n * Typed as a mapped type over HTMLElementTagNameMap so that property access\n * (el.div, el.button, …) returns a non-nullable function even under\n * noUncheckedIndexedAccess — concrete keys are never undefined.\n */\nexport const el = new Proxy({}, {\n  get(_target, tag: string) {\n    return (...args: unknown[]) => {\n      if (isPropsObject(args[0])) {\n        return h(tag, args[0] as Props, ...(args.slice(1) as Child[]));\n      }\n      return h(tag, null, ...(args as Child[]));\n    };\n  },\n}) as { [K in keyof HTMLElementTagNameMap]: ElFn };\n"],"names":["elListeners","SVG_NS","SVG_TAGS","flattenChildren","children","result","child","appendChild","parent","h","tag","props","el","listeners","key","value","eventName","flat","Fragment","restChildren","frag","kids","ref","isPropsObject","v","_target","args"],"mappings":"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"}