flexium 0.9.0 → 0.9.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 (95) hide show
  1. package/dist/advanced.d.cts +2 -2
  2. package/dist/advanced.d.ts +2 -2
  3. package/dist/advanced.js +1 -1
  4. package/dist/advanced.mjs +1 -1
  5. package/dist/canvas.d.cts +1 -1
  6. package/dist/canvas.d.ts +1 -1
  7. package/dist/canvas.js +1 -1
  8. package/dist/canvas.mjs +1 -1
  9. package/dist/chunk-2ZHUQBNI.mjs +2 -0
  10. package/dist/chunk-2ZHUQBNI.mjs.map +1 -0
  11. package/dist/{chunk-CBO2X74Q.js → chunk-DFG62GKW.js} +2 -2
  12. package/dist/{chunk-CBO2X74Q.js.map → chunk-DFG62GKW.js.map} +1 -1
  13. package/dist/{chunk-LXXN76HJ.mjs → chunk-HDCPA76O.mjs} +2 -2
  14. package/dist/{chunk-LXXN76HJ.mjs.map → chunk-HDCPA76O.mjs.map} +1 -1
  15. package/dist/chunk-J4CK5NRW.mjs +3 -0
  16. package/dist/chunk-J4CK5NRW.mjs.map +1 -0
  17. package/dist/chunk-JEDCNAAI.mjs +3 -0
  18. package/dist/chunk-JEDCNAAI.mjs.map +1 -0
  19. package/dist/{chunk-PDOEMOWN.js → chunk-JHJHIMWD.js} +2 -2
  20. package/dist/{chunk-PDOEMOWN.js.map → chunk-JHJHIMWD.js.map} +1 -1
  21. package/dist/{chunk-RIVNKTUR.js → chunk-L4C5UBOX.js} +2 -2
  22. package/dist/{chunk-RIVNKTUR.js.map → chunk-L4C5UBOX.js.map} +1 -1
  23. package/dist/{chunk-ZG3LULLU.js → chunk-M4ANLZ6P.js} +3 -3
  24. package/dist/{chunk-ZG3LULLU.js.map → chunk-M4ANLZ6P.js.map} +1 -1
  25. package/dist/chunk-RDA77IE6.js +2 -0
  26. package/dist/chunk-RDA77IE6.js.map +1 -0
  27. package/dist/{chunk-JDTJFAXO.mjs → chunk-RUXAK74B.mjs} +2 -2
  28. package/dist/{chunk-JDTJFAXO.mjs.map → chunk-RUXAK74B.mjs.map} +1 -1
  29. package/dist/chunk-TRIEKNVZ.mjs +2 -0
  30. package/dist/{chunk-GQKN4NPW.mjs.map → chunk-TRIEKNVZ.mjs.map} +1 -1
  31. package/dist/chunk-VIVO4FHN.js +3 -0
  32. package/dist/chunk-VIVO4FHN.js.map +1 -0
  33. package/dist/chunk-XLE6SMWX.mjs +3 -0
  34. package/dist/{chunk-6RV7ARJT.mjs.map → chunk-XLE6SMWX.mjs.map} +1 -1
  35. package/dist/chunk-YGMMJWAA.js +3 -0
  36. package/dist/chunk-YGMMJWAA.js.map +1 -0
  37. package/dist/core.js +1 -1
  38. package/dist/core.mjs +1 -1
  39. package/dist/dom.js +1 -1
  40. package/dist/dom.mjs +1 -1
  41. package/dist/dom.mjs.map +1 -1
  42. package/dist/index.d.cts +1 -1
  43. package/dist/index.d.ts +1 -1
  44. package/dist/index.js +1 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/index.mjs +1 -1
  47. package/dist/index.mjs.map +1 -1
  48. package/dist/interactive.js +1 -1
  49. package/dist/interactive.mjs +1 -1
  50. package/dist/interactive.mjs.map +1 -1
  51. package/dist/metafile-cjs.json +1 -1
  52. package/dist/metafile-esm.json +1 -1
  53. package/dist/{owner-Ce7KCWzi.d.cts → owner-QS9tPwPr.d.cts} +1 -8
  54. package/dist/{owner-Ce7KCWzi.d.ts → owner-QS9tPwPr.d.ts} +1 -8
  55. package/dist/primitives/motion.js +1 -1
  56. package/dist/primitives/motion.mjs +1 -1
  57. package/dist/primitives/ui.js +1 -1
  58. package/dist/primitives/ui.mjs +1 -1
  59. package/dist/primitives/ui.mjs.map +1 -1
  60. package/dist/primitives.d.cts +1 -1
  61. package/dist/primitives.d.ts +1 -1
  62. package/dist/primitives.js +1 -1
  63. package/dist/primitives.mjs +1 -1
  64. package/dist/router.js +1 -1
  65. package/dist/router.mjs +1 -1
  66. package/dist/server.js +1 -1
  67. package/dist/server.mjs +1 -1
  68. package/dist/server.mjs.map +1 -1
  69. package/dist/signal-3YZHUCLL.js +2 -0
  70. package/dist/{signal-AXKUQJVA.js.map → signal-3YZHUCLL.js.map} +1 -1
  71. package/dist/signal-F2HEYB6F.mjs +2 -0
  72. package/dist/{signal-HM2LG5YL.mjs.map → signal-F2HEYB6F.mjs.map} +1 -1
  73. package/dist/test-exports.d.cts +2 -2
  74. package/dist/test-exports.d.ts +2 -2
  75. package/dist/test-exports.js +1 -1
  76. package/dist/test-exports.mjs +1 -1
  77. package/package.json +1 -1
  78. package/dist/chunk-6RV7ARJT.mjs +0 -3
  79. package/dist/chunk-GFL4VRAO.mjs +0 -3
  80. package/dist/chunk-GFL4VRAO.mjs.map +0 -1
  81. package/dist/chunk-GQKN4NPW.mjs +0 -2
  82. package/dist/chunk-MKE3KA43.js +0 -3
  83. package/dist/chunk-MKE3KA43.js.map +0 -1
  84. package/dist/chunk-TQLZ7UZX.js +0 -2
  85. package/dist/chunk-TQLZ7UZX.js.map +0 -1
  86. package/dist/chunk-WEYAKKNF.js +0 -3
  87. package/dist/chunk-WEYAKKNF.js.map +0 -1
  88. package/dist/chunk-WO6NQ3KR.mjs +0 -3
  89. package/dist/chunk-WO6NQ3KR.mjs.map +0 -1
  90. package/dist/chunk-Y4DUMNIW.mjs +0 -2
  91. package/dist/chunk-Y4DUMNIW.mjs.map +0 -1
  92. package/dist/signal-AXKUQJVA.js +0 -2
  93. package/dist/signal-HM2LG5YL.mjs +0 -2
  94. /package/dist/{scheduler-Z4QqUDjF.d.cts → sync-Z4QqUDjF.d.cts} +0 -0
  95. /package/dist/{scheduler-Z4QqUDjF.d.ts → sync-Z4QqUDjF.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/errors.ts","../src/core/graph.ts","../src/core/owner.ts","../src/core/sync.ts","../src/core/effect.ts","../src/core/signal.ts"],"names":["ErrorCodes","getErrorDetails","code","createErrorInfo","context","originalError","details","formatErrorMessage","info","message","contextStr","key","value","logError","logWarning","LinkPool","pool","size","alloc","dep","sub","link","free","Graph","connect","depsHead","subsHead","disconnectDependencies","nextDep","prevSub","nextSub","Flags","has","obj","flag","add","remove","activeEffect","getActiveEffect","setActiveEffect","effect","untrack","fn","prev","owner","getOwner","setOwner","newOwner","root","prevOwner","dispose","cleanup","batchDepth","batchQueue","autoBatchQueue","isAutoBatchScheduled","scheduleAutoBatch","flushAutoBatch","queue","i","addToAutoBatch","addToBatch","getBatchDepth","sync","result","EffectNode","onError","prevEffect","error","options","node","devToolsHooks","setDevToolsHooks","hooks","globalVersion","SignalNode","_value","newValue","hasScheduled","ComputedNode","computeFn","flags","computedDep","oldVersion","shouldSchedule","signal","initialValue","devToolsId","sig","SIGNAL_MARKER","computed","comp","isSignal","onCleanup","createResource","source","fetcher","loading","state","load","currentSource","refetching","currentPromise","latestPromise","err","getSource","resource","v"],"mappings":"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","file":"chunk-YGMMJWAA.js","sourcesContent":["/**\n * Flexium Error System\n *\n * Standardized error handling with error codes, contextual information,\n * and actionable suggestions for developers.\n */\n\n// Error codes for all Flexium errors\nexport const ErrorCodes = {\n // Signal/Effect errors (1xx)\n EFFECT_EXECUTION_FAILED: 'FLX101',\n CLEANUP_OUTSIDE_EFFECT: 'FLX102',\n SIGNAL_UPDATE_DURING_RENDER: 'FLX103',\n COMPUTED_EXECUTION_FAILED: 'FLX104',\n\n // Context errors (2xx)\n CONTEXT_MISSING_PROVIDER: 'FLX201',\n ROUTER_OUTSIDE_PROVIDER: 'FLX202',\n\n // Form errors (3xx)\n FORM_VALIDATION_FAILED: 'FLX301',\n FORM_SUBMISSION_FAILED: 'FLX302',\n ASYNC_VALIDATION_FAILED: 'FLX303',\n\n // Component errors (4xx)\n BUTTON_HANDLER_FAILED: 'FLX401',\n BUTTON_MISSING_ARIA_LABEL: 'FLX402',\n COMPONENT_RENDER_FAILED: 'FLX403',\n\n // Hydration errors (5xx)\n HYDRATION_MISMATCH: 'FLX501',\n HYDRATION_TEXT_MISMATCH: 'FLX502',\n HYDRATION_TAG_MISMATCH: 'FLX503',\n HYDRATION_ATTRIBUTE_MISMATCH: 'FLX504',\n\n // DevTools errors (6xx)\n DEVTOOLS_LISTENER_ERROR: 'FLX601',\n\n // Render errors (7xx)\n UNCAUGHT_RENDER_ERROR: 'FLX701',\n ERROR_BOUNDARY_CALLBACK_FAILED: 'FLX702',\n DOM_CLEANUP_FAILED: 'FLX703',\n\n // Event errors (8xx)\n EVENT_HANDLER_FAILED: 'FLX801',\n KEYBOARD_HANDLER_FAILED: 'FLX802',\n\n // Resource/Async errors (9xx)\n RESOURCE_FETCH_FAILED: 'FLX901',\n RESOURCE_TIMEOUT: 'FLX902',\n} as const\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes]\n\ninterface ErrorDefinition {\n message: string\n suggestion?: string\n}\n\n// Error message definitions with suggestions\n// Wrapped in a function to allow tree-shaking in production\nfunction getErrorDetails(code: ErrorCode): {\n message: string\n suggestion?: string\n} {\n const isDev = typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production'\n if (isDev) {\n const errorDefinitions: Record<ErrorCode, ErrorDefinition> = {\n [ErrorCodes.EFFECT_EXECUTION_FAILED]: {\n message: 'Effect execution failed',\n suggestion:\n 'Check the effect callback for runtime errors. Consider wrapping async operations in try-catch.',\n },\n [ErrorCodes.CLEANUP_OUTSIDE_EFFECT]: {\n message: 'onCleanup must be called from within an effect',\n suggestion: 'Move the onCleanup() call inside an effect() callback.',\n },\n [ErrorCodes.SIGNAL_UPDATE_DURING_RENDER]: {\n message: 'Signal was updated during render',\n suggestion:\n 'Avoid updating signals inside render functions. Use effect() for side effects.',\n },\n [ErrorCodes.CONTEXT_MISSING_PROVIDER]: {\n message: 'Context used outside of Provider',\n suggestion:\n 'Wrap your component tree with the appropriate Context.Provider.',\n },\n [ErrorCodes.ROUTER_OUTSIDE_PROVIDER]: {\n message: 'router() must be used within a <Router> component',\n suggestion: 'Ensure your component is a descendant of <Router>.',\n },\n [ErrorCodes.FORM_VALIDATION_FAILED]: {\n message: 'Form field validation failed',\n suggestion:\n 'Check the validation rules for the field and the input value.',\n },\n [ErrorCodes.FORM_SUBMISSION_FAILED]: {\n message: 'Form submission failed',\n suggestion: 'Check the onSubmit handler and network connectivity.',\n },\n [ErrorCodes.BUTTON_HANDLER_FAILED]: {\n message: 'Button press handler failed',\n suggestion: 'Check the onPress/onClick callback for errors.',\n },\n [ErrorCodes.BUTTON_MISSING_ARIA_LABEL]: {\n message: 'IconButton is missing an aria-label',\n suggestion:\n 'Add an aria-label prop to IconButton for screen reader accessibility.',\n },\n [ErrorCodes.HYDRATION_MISMATCH]: {\n message: 'Hydration mismatch detected',\n suggestion:\n 'Ensure server and client render the same content. Check for browser-only code.',\n },\n [ErrorCodes.HYDRATION_TEXT_MISMATCH]: {\n message: 'Text content mismatch during hydration',\n suggestion:\n 'Server and client rendered different text. Check for Date.now(), Math.random(), or client-only data.',\n },\n [ErrorCodes.HYDRATION_TAG_MISMATCH]: {\n message: 'Element tag mismatch during hydration',\n suggestion:\n 'Server and client rendered different elements. Verify conditional rendering logic.',\n },\n [ErrorCodes.DEVTOOLS_LISTENER_ERROR]: {\n message: 'DevTools listener threw an error',\n suggestion: 'Check your DevTools event listener callback.',\n },\n [ErrorCodes.UNCAUGHT_RENDER_ERROR]: {\n message: 'Uncaught error during render',\n suggestion:\n 'Wrap components with <ErrorBoundary> to catch and handle errors gracefully.',\n },\n [ErrorCodes.ERROR_BOUNDARY_CALLBACK_FAILED]: {\n message: 'ErrorBoundary callback failed',\n suggestion: 'Check your onError or onReset callback for errors.',\n },\n [ErrorCodes.COMPUTED_EXECUTION_FAILED]: {\n message: 'Computed value execution failed',\n suggestion:\n 'Check the computed callback for runtime errors. Ensure all dependencies are valid.',\n },\n [ErrorCodes.ASYNC_VALIDATION_FAILED]: {\n message: 'Async form validation failed',\n suggestion:\n 'Check the async validation function and ensure it handles errors properly.',\n },\n [ErrorCodes.COMPONENT_RENDER_FAILED]: {\n message: 'Component render failed',\n suggestion:\n 'Check the component function for runtime errors. Consider wrapping with <ErrorBoundary>.',\n },\n [ErrorCodes.HYDRATION_ATTRIBUTE_MISMATCH]: {\n message: 'Attribute mismatch during hydration',\n suggestion:\n 'Server and client rendered different attribute values. Check for dynamic attributes.',\n },\n [ErrorCodes.DOM_CLEANUP_FAILED]: {\n message: 'DOM cleanup operation failed',\n suggestion:\n 'A node may have been removed from the DOM unexpectedly. Check for manual DOM manipulation.',\n },\n [ErrorCodes.EVENT_HANDLER_FAILED]: {\n message: 'Event handler threw an error',\n suggestion:\n 'Check your event handler callback. Consider adding try-catch for async operations.',\n },\n [ErrorCodes.KEYBOARD_HANDLER_FAILED]: {\n message: 'Keyboard event handler failed',\n suggestion: 'Check the onKeyDown/onKeyUp handler for errors.',\n },\n [ErrorCodes.RESOURCE_FETCH_FAILED]: {\n message: 'Resource fetch failed',\n suggestion:\n 'Check the async function and network connectivity. The resource will show an error state.',\n },\n [ErrorCodes.RESOURCE_TIMEOUT]: {\n message: 'Resource fetch timed out',\n suggestion:\n 'The async operation took too long. Consider adding a timeout handler or retry logic.',\n },\n }\n return errorDefinitions[code] || { message: `Error ${code}` }\n }\n return { message: `Minified Error ${code}` }\n}\n\nexport interface FlexiumErrorInfo {\n code: ErrorCode\n message: string\n suggestion?: string\n context?: Record<string, unknown>\n originalError?: unknown\n}\n\n/**\n * Create a standardized error info object\n */\nexport function createErrorInfo(\n code: ErrorCode,\n context?: Record<string, unknown>,\n originalError?: unknown\n): FlexiumErrorInfo {\n const details = getErrorDetails(code)\n return {\n code,\n message: details.message,\n suggestion: details.suggestion,\n context,\n originalError,\n }\n}\n\n/**\n * Format error message for console output\n */\nexport function formatErrorMessage(info: FlexiumErrorInfo): string {\n let message = `[Flexium ${info.code}] ${info.message}`\n\n if (info.context && Object.keys(info.context).length > 0) {\n const contextStr = Object.entries(info.context)\n .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)\n .join(', ')\n message += ` (${contextStr})`\n }\n\n if (info.suggestion) {\n message += `\\n → ${info.suggestion}`\n }\n\n return message\n}\n\n/**\n * Log an error with standardized formatting\n */\nexport function logError(\n code: ErrorCode,\n context?: Record<string, unknown>,\n originalError?: unknown\n): void {\n const info = createErrorInfo(code, context, originalError)\n const message = formatErrorMessage(info)\n\n if (originalError) {\n console.error(message, originalError)\n } else {\n console.error(message)\n }\n}\n\n/**\n * Log a warning with standardized formatting\n */\nexport function logWarning(\n code: ErrorCode,\n context?: Record<string, unknown>\n): void {\n const info = createErrorInfo(code, context)\n const message = formatErrorMessage(info)\n console.warn(message)\n}\n\n/**\n * Create a FlexiumError with standardized information\n */\nexport class FlexiumError extends Error {\n code: ErrorCode\n suggestion?: string\n context?: Record<string, unknown>\n\n constructor(code: ErrorCode, context?: Record<string, unknown>) {\n const details = getErrorDetails(code)\n super(details.message)\n this.name = 'FlexiumError'\n this.code = code\n this.suggestion = details.suggestion\n this.context = context\n }\n\n toString(): string {\n return formatErrorMessage({\n code: this.code,\n message: this.message,\n suggestion: this.suggestion,\n context: this.context,\n })\n }\n}\n","/**\n * Graph.ts\n *\n * Core Graph Data Structures & Algorithms\n * Implements the \"Hardcore\" Doubly Linked List for dependency tracking.\n *\n * This module is purely internal and has NO dependencies on other core modules\n * to avoid circular references.\n */\n\n// ==================================================================================\n// 1. Data Structures\n// ==================================================================================\n\n/**\n * Flags for subscriber state (Optimization: Bitmasking)\n */\nexport const enum SubscriberFlags {\n Running = 1 << 0,\n Notified = 1 << 1,\n Dirty = 1 << 2,\n Stale = 1 << 3,\n Tracking = 1 << 4,\n}\n\n/**\n * Node type identifiers for fast type checking (Performance: Avoid instanceof)\n */\nexport const enum NodeType {\n Signal = 1,\n Computed = 2,\n Effect = 3,\n Resource = 4,\n}\n\n/**\n * Link node connecting a Subscriber (Effect/Computed) to a Dependency (Signal/Computed).\n *\n * ASCII Visualization of the Doubly Linked Graph:\n *\n * [Signal A] <==> [Link 1] <==> [Effect B]\n * ^\n * | (Prev/Next Sub on Signal A)\n * v\n * [Link 2] <==> [Effect C]\n *\n * Each Link serves as a node in TWO lists simultaneously:\n * 1. The Subscriber's list of dependencies (prevDep/nextDep)\n * 2. The Dependency's list of subscribers (prevSub/nextSub)\n */\nexport interface Link {\n dep: IObservable | undefined\n sub: ISubscriber | undefined\n\n // Pointers for Dependency's subscriber list\n prevSub: Link | undefined\n nextSub: Link | undefined\n\n // Pointers for Subscriber's dependency list\n prevDep: Link | undefined\n nextDep: Link | undefined\n}\n\n/**\n * Base interface for subscriber nodes (Effect, Computed)\n */\nexport interface ISubscriber {\n execute(): void\n depsHead: Link | undefined // Head of dependencies list\n flags: SubscriberFlags\n nodeType: NodeType // Fast type checking (Performance optimization)\n}\n\n/**\n * Base interface for observable nodes (Signal, Computed)\n */\nexport interface IObservable {\n subsHead: Link | undefined // Head of subscribers list\n version: number // For epoch-based check\n notify(): void\n nodeType: NodeType // Fast type checking (Performance optimization)\n}\n\n// ==================================================================================\n// 2. Object Pool (Memory Optimization)\n// ==================================================================================\n\n/**\n * Pool for Link objects to eliminate GC pressure.\n */\nexport namespace LinkPool {\n const pool: Link[] = []\n let size = 0\n\n export function alloc(dep: IObservable, sub: ISubscriber): Link {\n if (size > 0) {\n const link = pool[--size]\n link.dep = dep\n link.sub = sub\n link.prevSub = undefined\n link.nextSub = undefined\n link.prevDep = undefined\n link.nextDep = undefined\n return link\n }\n return {\n dep,\n sub,\n prevSub: undefined,\n nextSub: undefined,\n prevDep: undefined,\n nextDep: undefined,\n }\n }\n\n export function free(link: Link): void {\n link.dep = undefined\n link.sub = undefined\n // Clearing pointers is optional for safety but good for debugging leaks\n link.prevSub = undefined\n link.nextSub = undefined\n link.prevDep = undefined\n link.nextDep = undefined\n\n if (size < 10000) { // Safety cap\n pool[size++] = link\n }\n }\n}\n\n// ==================================================================================\n// 3. Graph Operations\n// ==================================================================================\n\n/**\n * Internal Graph operations to manage the \"Hardcore\" Linked List structure.\n * Encapsulates raw pointer arithmetic for readability.\n */\nexport namespace Graph {\n /**\n * Connects a dependency (Signal) to a subscriber (Effect/Computed).\n * Allocates a Link from the pool and stitches it into both lists.\n */\n export function connect(dep: IObservable, sub: ISubscriber): void {\n const link = LinkPool.alloc(dep, sub)\n\n // Add to Subscriber's dependency list (prepend)\n // Performance: Cache depsHead to avoid repeated property access\n const depsHead = sub.depsHead\n link.nextDep = depsHead\n if (depsHead) {\n depsHead.prevDep = link\n }\n sub.depsHead = link\n\n // Add to Dependency's subscriber list (prepend)\n // Performance: Cache subsHead to avoid repeated property access\n const subsHead = dep.subsHead\n link.nextSub = subsHead\n if (subsHead) {\n subsHead.prevSub = link\n }\n dep.subsHead = link\n }\n\n /**\n * Fully disconnects a subscriber from all its dependencies.\n * Walks the 'depsHead' list and unlinks each one.\n */\n export function disconnectDependencies(sub: ISubscriber): void {\n let link = sub.depsHead\n while (link) {\n const dep = link.dep!\n // Performance: Cache nextDep and pointers before modifying link\n const nextDep = link.nextDep\n const prevSub = link.prevSub\n const nextSub = link.nextSub\n\n // Remove link from dependency's subscriber list\n // This is a standard doubly-linked list removal\n // Performance: Branch prediction - middle nodes are more common\n if (prevSub) {\n prevSub.nextSub = nextSub\n } else {\n dep.subsHead = nextSub\n }\n if (nextSub) {\n nextSub.prevSub = prevSub\n }\n\n LinkPool.free(link)\n link = nextDep\n }\n sub.depsHead = undefined\n }\n}\n\n/**\n * Flag helpers for readability\n */\nexport namespace Flags {\n export function has(obj: { flags: number }, flag: SubscriberFlags): boolean {\n return (obj.flags & flag) !== 0\n }\n\n export function add(obj: { flags: number }, flag: SubscriberFlags): void {\n obj.flags |= flag\n }\n\n export function remove(obj: { flags: number }, flag: SubscriberFlags): void {\n obj.flags &= ~flag\n }\n}\n","/**\n * Owner.ts\n *\n * Managing reactive scopes and cleanup contexts.\n */\n\n// ==================================================================================\n// 1. Owner & Scope Management\n// ==================================================================================\n\nexport interface Owner {\n cleanups: (() => void)[]\n context: Record<symbol, unknown> | null\n owner: Owner | null // Parent owner\n}\n\nimport type { ISubscriber } from './graph'\n\n// Global context for dependency tracking\nlet activeEffect: ISubscriber | null = null\n\nexport function getActiveEffect(): ISubscriber | null {\n return activeEffect\n}\n\nexport function setActiveEffect(effect: ISubscriber | null): void {\n activeEffect = effect\n}\n\n/**\n * Execute a function without tracking signal dependencies.\n * Useful when you need to read signals inside an effect without creating dependencies.\n *\n * @param fn - Function to execute without tracking\n * @returns The return value of fn\n */\nexport function untrack<T>(fn: () => T): T {\n const prev = activeEffect\n activeEffect = null\n try {\n return fn()\n } finally {\n activeEffect = prev\n }\n}\n\nlet owner: Owner | null = null\n\n/**\n * Get the current owner (scope)\n * @internal\n */\nexport function getOwner(): Owner | null {\n return owner\n}\n\n/**\n * Set the current owner (scope)\n * @internal\n */\nexport function setOwner(newOwner: Owner | null): void {\n owner = newOwner\n}\n\n/**\n * Creates a disposal scope.\n * The return value of the function is returned, and a dispose function is returned.\n *\n * @param fn - Function to run within a new root scope\n * @returns [return value of fn, dispose function]\n *\n * @example\n * ```tsx\n * const [val, dispose] = root((dispose) => {\n * effect(() => console.log('Inside root'));\n * return 123;\n * });\n * dispose(); // Cleans up all effects created inside\n * ```\n */\nexport function root<T>(fn: (dispose: () => void) => T): T {\n const prevOwner = owner\n const newOwner: Owner = {\n cleanups: [],\n context: prevOwner ? Object.create(prevOwner.context) : null,\n owner: prevOwner,\n }\n\n owner = newOwner\n\n const dispose = () => {\n // Performance: Fast path when no cleanups\n if (newOwner.cleanups.length === 0) return\n \n for (const cleanup of newOwner.cleanups) {\n cleanup()\n }\n newOwner.cleanups = []\n }\n\n try {\n return fn(dispose)\n } finally {\n owner = prevOwner\n }\n}\n\n\n","import { ISubscriber } from './graph'\n\n// Batching state\nlet batchDepth = 0\n// Batch queue now needs to store raw subscribers. Set is efficient for uniqueness.\nconst batchQueue = new Set<ISubscriber>()\n\n// Auto-batching state (Microtask Scheduler)\nconst autoBatchQueue = new Set<ISubscriber>()\nlet isAutoBatchScheduled = false\n\nexport function scheduleAutoBatch(): void {\n if (!isAutoBatchScheduled) {\n isAutoBatchScheduled = true\n queueMicrotask(flushAutoBatch)\n }\n}\n\nexport function flushAutoBatch(): void {\n isAutoBatchScheduled = false\n if (autoBatchQueue.size === 0) return\n\n // Performance: Direct iteration instead of Array.from() to avoid array allocation\n // Build array while iterating Set\n const queue: ISubscriber[] = []\n for (const sub of autoBatchQueue) {\n queue.push(sub)\n }\n autoBatchQueue.clear()\n\n // Execute effects - use for loop instead of forEach (slightly faster)\n for (let i = 0; i < queue.length; i++) {\n queue[i].execute()\n }\n}\n\nexport function addToAutoBatch(sub: ISubscriber): void {\n autoBatchQueue.add(sub)\n}\n\nexport function addToBatch(sub: ISubscriber): void {\n batchQueue.add(sub)\n}\n\nexport function getBatchDepth(): number {\n return batchDepth\n}\n\n/**\n * Synchronizes state updates.\n * \n * - `sync()`: Force flushes any pending auto-batched effects.\n * - `sync(fn)`: Batches updates within `fn`, then flushes them and any pending effects synchronously.\n *\n * @param fn - Optional function containing state updates\n * @returns The return value of fn, if provided\n *\n * @example\n * ```tsx\n * // 1. Force flush pending effects\n * count.value++\n * sync() // DOM is now updated\n *\n * // 2. Batch updates and flush immediately\n * sync(() => {\n * count.value = 1\n * name.value = 'Bob'\n * }) // Effects run once here, DOM updated\n * ```\n */\nexport function sync<T>(fn?: () => T): T | void {\n let result: T | undefined\n\n if (fn) {\n batchDepth++\n try {\n result = fn()\n } finally {\n batchDepth--\n if (batchDepth === 0) {\n // Execute all queued subscribers from manual batch\n // Performance: Direct iteration instead of Array.from() to avoid array allocation\n const queue: ISubscriber[] = []\n for (const sub of batchQueue) {\n queue.push(sub)\n }\n batchQueue.clear()\n // Use for loop instead of forEach (slightly faster)\n for (let i = 0; i < queue.length; i++) {\n queue[i].execute()\n }\n }\n }\n }\n\n // Always flushing auto-batch queue to ensure everything is synced\n flushAutoBatch()\n\n return result\n}\n","import { ErrorCodes, logError } from './errors'\nimport {\n Graph,\n Flags,\n type Link,\n type ISubscriber,\n SubscriberFlags,\n NodeType\n} from './graph'\nimport {\n Owner,\n getOwner,\n setOwner,\n getActiveEffect,\n setActiveEffect\n} from './owner'\n\n/**\n * Internal effect node for dependency tracking\n */\nexport class EffectNode implements ISubscriber {\n depsHead: Link | undefined\n cleanups: (() => void)[] = []\n flags = 0 // detached by default, will set flags during execution\n nodeType = NodeType.Effect\n\n private owner: Owner | null = null\n\n constructor(\n public fn: () => void | (() => void),\n public onError?: (error: Error) => void\n ) {\n this.owner = getOwner()\n }\n\n execute(): void {\n // Performance: Inline bit operations for better performance\n if ((this.flags & SubscriberFlags.Running) !== 0) {\n this.flags |= SubscriberFlags.Notified\n return\n }\n\n this.flags |= SubscriberFlags.Running\n\n try {\n this.run()\n } finally {\n // Performance: Inline bit operations\n this.flags &= ~SubscriberFlags.Running\n if ((this.flags & SubscriberFlags.Notified) !== 0) {\n this.flags &= ~SubscriberFlags.Notified\n // Schedule microtask to avoid stack overflow and infinite sync loops\n queueMicrotask(() => this.execute())\n }\n }\n }\n\n private run(): void {\n // Performance: Fast path when no cleanups\n if (this.cleanups.length > 0) {\n // Performance: Run cleanups in reverse order (most recent first)\n // This ensures proper dependency cleanup order and matches React's behavior\n for (let i = this.cleanups.length - 1; i >= 0; i--) {\n this.cleanups[i]()\n }\n this.cleanups = []\n }\n\n // Clean up previous dependencies via Graph helper\n Graph.disconnectDependencies(this)\n\n const prevEffect = getActiveEffect()\n const prevOwner = getOwner()\n setActiveEffect(this)\n setOwner(this.owner)\n\n try {\n const result = this.fn()\n if (typeof result === 'function') {\n this.cleanups.push(result)\n }\n } catch (error) {\n if (this.onError) {\n this.onError(error as Error)\n } else {\n logError(ErrorCodes.EFFECT_EXECUTION_FAILED, undefined, error)\n }\n } finally {\n setActiveEffect(prevEffect)\n setOwner(prevOwner)\n }\n }\n\n dispose(): void {\n // Performance: Run cleanups in reverse order (most recent first)\n // This ensures proper dependency cleanup order\n if (this.cleanups.length > 0) {\n for (let i = this.cleanups.length - 1; i >= 0; i--) {\n this.cleanups[i]()\n }\n this.cleanups = []\n }\n Graph.disconnectDependencies(this)\n }\n}\n\n/**\n * Creates a side effect that runs when dependencies change\n *\n * @param fn - Effect function, can return a cleanup function\n * @param options - Optional error handler\n * @returns Dispose function to stop the effect\n *\n * @example\n * const count = signal(0);\n * const dispose = effect(() => {\n * console.log('Count:', count.value);\n * return () => console.log('Cleanup');\n * });\n */\nexport function effect(\n fn: () => void | (() => void),\n options?: { onError?: (error: Error) => void; name?: string }\n): () => void {\n // DevTools hooks integration would go here if needed\n // For now we rely on the devtools hooks in signal.ts or need to export them properly\n // This implementation is sufficient for core logic\n\n const node = new EffectNode(fn, options?.onError)\n node.execute()\n const dispose = () => node.dispose()\n\n const owner = getOwner()\n if (owner) {\n owner.cleanups.push(dispose)\n }\n\n return dispose\n}\n","/**\n * Signal System - Fine-grained reactivity without VDOM\n *\n * Architecture:\n * - Signals are reactive primitives that notify subscribers on change\n * - Computed signals automatically track dependencies and memoize results\n * - Effects run side effects and auto-track dependencies\n * - Batching prevents cascading updates for performance\n */\n\nimport { ErrorCodes, logError, logWarning } from './errors'\nimport {\n Graph,\n Flags,\n type Link,\n type ISubscriber,\n type IObservable,\n SubscriberFlags,\n NodeType\n} from './graph'\nimport {\n type Owner,\n getOwner,\n setOwner,\n getActiveEffect,\n setActiveEffect,\n} from './owner'\nimport {\n scheduleAutoBatch,\n addToAutoBatch,\n addToBatch,\n getBatchDepth\n} from './sync'\nimport { EffectNode, effect } from './effect'\n\n/**\n * DevTools hooks interface - set by devtools module to avoid circular imports\n * @internal\n */\nexport interface DevToolsHooks {\n onSignalCreate?: (signal: Signal<unknown>, name?: string) => number\n onSignalUpdate?: (id: number, value: unknown) => void\n onEffectCreate?: (name?: string) => number\n onEffectRun?: (\n id: number,\n status: 'idle' | 'running' | 'error',\n error?: Error\n ) => void\n}\n\n// Global hooks registry - set by devtools when enabled\nlet devToolsHooks: DevToolsHooks | null = null\n\n/**\n * Register devtools hooks (called by devtools module)\n * @internal\n */\nexport function setDevToolsHooks(hooks: DevToolsHooks | null): void {\n devToolsHooks = hooks\n}\n\n// Global version clock for epoch-based validation (Optimization: Epochs)\nlet globalVersion = 0\n\n// ==================================================================================\n// 3. User Facing API\n// ==================================================================================\n\n/**\n * Base interface for reactive signals\n * @internal\n */\nexport interface Signal<T> {\n value: T;\n (): T\n set(value: T): void\n peek(): T\n}\n\n/**\n * Computed signal interface (read-only)\n * @internal\n */\nexport interface Computed<T> {\n readonly value: T;\n (): T\n peek(): T\n}\n\n\n\n/**\n * Internal signal node for writable signals\n */\nclass SignalNode<T> implements IObservable {\n // Performance: Hot path fields first (CPU cache line optimization)\n version = 0 // Frequently read\n nodeType = NodeType.Signal // Frequently checked\n subsHead: Link | undefined // Frequently accessed\n\n // Cold path field\n constructor(private _value: T) { }\n\n get(): T {\n // Track dependency if inside an effect or computed\n const activeEffect = getActiveEffect()\n if (activeEffect) {\n Graph.connect(this, activeEffect)\n }\n return this._value\n }\n\n set(newValue: T): void {\n if (this._value !== newValue) {\n this._value = newValue\n this.version = ++globalVersion\n this.notify()\n }\n }\n\n peek(): T {\n return this._value\n }\n\n notify(): void {\n // Performance: Branch prediction - check most common case first (no batch)\n if (getBatchDepth() === 0) {\n // Automatic microtask batch (most common path)\n if (this.subsHead) {\n // Performance: Schedule immediately on first non-computed subscriber\n let hasScheduled = false\n let link: Link | undefined = this.subsHead\n\n while (link) {\n const sub = link.sub!\n // Performance: Use nodeType instead of instanceof (much faster)\n if (sub.nodeType === NodeType.Computed) {\n sub.execute() // Mark dirty immediately\n } else {\n addToAutoBatch(sub)\n if (!hasScheduled) {\n hasScheduled = true\n scheduleAutoBatch() // Schedule on first non-computed subscriber\n }\n }\n link = link.nextSub\n }\n }\n } else {\n // Manual batch: queue subscribers (less common path)\n let link = this.subsHead\n while (link) {\n if (link.sub) addToBatch(link.sub)\n link = link.nextSub\n }\n }\n }\n}\n\n/**\n * Internal computed node for derived values\n */\nclass ComputedNode<T> implements ISubscriber, IObservable {\n // Performance: Hot path fields first (CPU cache line optimization)\n version = 0 // Frequently read\n nodeType = NodeType.Computed // Frequently checked\n flags = SubscriberFlags.Dirty | SubscriberFlags.Stale // Frequently checked\n subsHead: Link | undefined // Frequently accessed\n depsHead: Link | undefined // Frequently accessed\n\n // Cold path fields\n private _value!: T\n // Optimization: Track last clean epoch to avoid redundant re-computation\n private lastCleanEpoch = 0\n\n constructor(private computeFn: () => T) { }\n\n execute(): void {\n // Performance: Inline bit operation instead of function call\n // When a dependency changes, mark as dirty and notify subscribers\n this.flags |= SubscriberFlags.Dirty | SubscriberFlags.Stale\n this.notify()\n }\n\n private _updateIfDirty(): void {\n // Performance: Inline flag checks for better branch prediction\n // 1. If not dirty and not stale, we are valid (most common case)\n // Note: This check is now done in peek()/get() for fast path, but kept here for safety\n const flags = this.flags\n const dirtyOrStale = flags & (SubscriberFlags.Dirty | SubscriberFlags.Stale)\n if (dirtyOrStale === 0) {\n return\n }\n\n // 2. If Stale but not Dirty, check dependencies\n // Performance: Single bit check instead of two function calls\n if ((flags & SubscriberFlags.Dirty) === 0 && (flags & SubscriberFlags.Stale) !== 0) {\n if (!this._needsRefetch()) {\n this.flags &= ~SubscriberFlags.Stale\n return\n }\n }\n\n // 3. Must re-compute\n // Performance: Single bit operation instead of function call\n this.flags &= ~(SubscriberFlags.Dirty | SubscriberFlags.Stale)\n\n // Clear previous dependencies via Graph helper\n Graph.disconnectDependencies(this)\n\n const prevEffect = getActiveEffect()\n // const prevOwner = getOwner() // Not used\n setActiveEffect(this)\n\n try {\n const newValue = this.computeFn()\n if (this._value !== newValue) {\n this._value = newValue\n this.version = ++globalVersion\n }\n this.lastCleanEpoch = globalVersion\n } finally {\n setActiveEffect(prevEffect)\n }\n\n // Actually, we need to import setActiveEffect at the top of the file\n // activeEffect = this -> setActiveEffect(this)\n // activeEffect = prevEffect -> setActiveEffect(prevEffect)\n // But since I am generating this chunk, let me check imports again.\n // I added getActiveEffect to imports. I need setActiveEffect too.\n\n // REVISING CHUNK content below to use imported function properly.\n // note: I must add setActiveEffect to imports in the first chunk.\n\n\n // For this specific Chunk:\n // We will use a hack here or I should update the first chunk to include setActiveEffect.\n // I'll update the first chunk in this tool call to include setActiveEffect.\n\n // import { setActiveEffect } from './owner'\n // ...\n // setActiveEffect(this)\n // ...\n // setActiveEffect(prevEffect)\n }\n\n private _needsRefetch(): boolean {\n if (!this.depsHead) return true;\n\n // Iterate dependencies via linked list\n let link: Link | undefined = this.depsHead\n while (link) {\n const dep = link.dep!\n \n // Performance: Check version first (fastest check, avoids type check for most cases)\n if (dep.version > this.lastCleanEpoch) {\n return true\n }\n\n // Performance: Use nodeType instead of instanceof\n // Only check computed dependencies if version check passed (less common case)\n if (dep.nodeType === NodeType.Computed) {\n const computedDep = dep as ComputedNode<unknown>\n \n // Performance: Check if dirty/stale before calling peek() (peek() may trigger computation)\n // Only call peek() if actually needs update\n const flags = computedDep.flags\n const isDirtyOrStale = (flags & (SubscriberFlags.Dirty | SubscriberFlags.Stale)) !== 0\n \n if (isDirtyOrStale) {\n // Performance: Track version before peek() to detect if it actually updated\n const oldVersion = computedDep.version\n computedDep.peek()\n // Only check version again if peek() actually updated it (version changed)\n // This avoids redundant comparison when peek() didn't change anything\n if (computedDep.version !== oldVersion && computedDep.version > this.lastCleanEpoch) {\n return true\n }\n }\n }\n link = link.nextDep\n }\n return false\n }\n\n get(): T {\n // Track dependency if inside an effect or computed\n const activeEffect = getActiveEffect()\n if (activeEffect && activeEffect !== this) {\n Graph.connect(this, activeEffect)\n }\n\n // Performance: Fast path - check if update needed before calling _updateIfDirty\n const flags = this.flags\n const dirtyOrStale = flags & (SubscriberFlags.Dirty | SubscriberFlags.Stale)\n if (dirtyOrStale !== 0) {\n this._updateIfDirty()\n }\n return this._value\n }\n\n peek(): T {\n // Performance: Fast path - check if update needed before calling _updateIfDirty\n const flags = this.flags\n const dirtyOrStale = flags & (SubscriberFlags.Dirty | SubscriberFlags.Stale)\n if (dirtyOrStale !== 0) {\n this._updateIfDirty()\n }\n return this._value\n }\n\n notify(): void {\n // Performance: Branch prediction - check most common case first (no batch)\n if (getBatchDepth() === 0) {\n // Automatic microtask batch (most common path)\n if (this.subsHead) {\n let shouldSchedule = false\n let link: Link | undefined = this.subsHead\n\n while (link) {\n const sub = link.sub!\n // Performance: Use nodeType instead of instanceof (much faster)\n if (sub.nodeType === NodeType.Computed) {\n sub.execute()\n } else {\n addToAutoBatch(sub)\n shouldSchedule = true\n }\n link = link.nextSub\n }\n\n if (shouldSchedule) {\n scheduleAutoBatch()\n }\n }\n } else {\n // Manual batch (less common path)\n let link = this.subsHead\n while (link) {\n if (link.sub) addToBatch(link.sub)\n link = link.nextSub\n }\n }\n }\n}\n\n\n\n\n\n/**\n * Creates a reactive signal\n *\n * @param initialValue - The initial value of the signal\n * @returns A signal object with value getter/setter\n *\n * @example\n * const count = signal(0);\n * count.value++; // triggers subscribers\n * console.log(count()); // alternative getter syntax\n */\nexport function signal<T>(initialValue: T): Signal<T> {\n const node = new SignalNode(initialValue)\n let devToolsId = -1\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sig = function (this: any) {\n return node.get()\n } as Signal<T>\n\n Object.defineProperty(sig, 'value', {\n get() {\n return node.get()\n },\n set(newValue: T) {\n node.set(newValue)\n // Performance: Check devToolsId first (most signals don't have devtools)\n // Then check hooks existence (short-circuit if null)\n if (devToolsId >= 0) {\n const hooks = devToolsHooks\n if (hooks?.onSignalUpdate) {\n hooks.onSignalUpdate(devToolsId, newValue)\n }\n }\n },\n enumerable: true,\n configurable: true,\n })\n\n sig.set = (newValue: T) => {\n node.set(newValue)\n // Performance: Check devToolsId first (most signals don't have devtools)\n // Then check hooks existence (short-circuit if null)\n if (devToolsId >= 0) {\n const hooks = devToolsHooks\n if (hooks?.onSignalUpdate) {\n hooks.onSignalUpdate(devToolsId, newValue)\n }\n }\n }\n sig.peek = () => node.peek()\n\n // Mark as signal for detection\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ; (sig as any)[SIGNAL_MARKER] = true\n\n // Performance: Cache hooks check to avoid repeated optional chaining\n // Register with devtools if enabled\n const hooks = devToolsHooks\n if (hooks?.onSignalCreate) {\n devToolsId = hooks.onSignalCreate(sig as Signal<unknown>)\n }\n\n return sig\n}\n\n/**\n * Creates a computed signal (derived value)\n * @internal Use `state(() => ...)` instead\n */\nexport function computed<T>(fn: () => T): Computed<T> {\n const node = new ComputedNode(fn)\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const comp = function (this: any) {\n return node.get()\n } as Computed<T>\n\n Object.defineProperty(comp, 'value', {\n get() {\n return node.get()\n },\n enumerable: true,\n configurable: true,\n })\n\n comp.peek = () => node.peek()\n\n // Mark as signal for detection\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ; (comp as any)[SIGNAL_MARKER] = true\n\n return comp\n}\n\n/**\n * Creates a side effect that runs when dependencies change\n *\n * @param fn - Effect function, can return a cleanup function\n * @param options - Optional error handler\n * @returns Dispose function to stop the effect\n *\n * @example\n * const count = signal(0);\n * const dispose = effect(() => {\n * console.log('Count:', count.value);\n * return () => console.log('Cleanup');\n * });\n */\n\n\n/**\n * Creates a root scope for effects\n * All effects created within the scope can be disposed together\n *\n * @param fn - Function that creates effects\n * @returns Dispose function for all effects in the scope\n */\n\n\n/**\n * Symbol to mark signals for detection\n * @internal\n */\nconst SIGNAL_MARKER = Symbol('flexium.signal')\n\n/**\n * Check if a value is a signal\n * @internal Use state() which handles all reactive patterns\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isSignal(value: unknown): value is Signal<any> | Computed<any> {\n return value !== null && typeof value === 'function' && SIGNAL_MARKER in value\n}\n\n/**\n * Registers a cleanup function that runs before the current effect re-runs or is disposed\n *\n * @param fn - Cleanup function\n */\nexport function onCleanup(fn: () => void): void {\n const activeEffect = getActiveEffect()\n // Performance: Use nodeType instead of instanceof\n if (activeEffect && activeEffect.nodeType === NodeType.Effect) {\n (activeEffect as EffectNode).cleanups.push(fn)\n } else {\n logWarning(ErrorCodes.CLEANUP_OUTSIDE_EFFECT)\n }\n}\n\n/**\n * Resource interface for async data\n */\nexport interface Resource<T> extends Signal<T | undefined> {\n loading: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: any\n state: 'unresolved' | 'pending' | 'ready' | 'refreshing' | 'errored'\n latest: T | undefined\n}\n\n/**\n * Creates a resource for handling async data\n * @internal Use state(async () => ...) instead which returns [data, refetch, status, error]\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function createResource<T, S = any>(\n source: S | Signal<S> | (() => S),\n fetcher: (\n source: S,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { value, refetching }: { value: T | undefined; refetching: any }\n ) => Promise<T>\n): [Resource<T>, { mutate: (v: T | undefined) => void; refetch: () => void }] {\n const value = signal<T | undefined>(undefined)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const error = signal<any>(undefined)\n const loading = signal<boolean>(false)\n const state = signal<\n 'unresolved' | 'pending' | 'ready' | 'refreshing' | 'errored'\n >('unresolved')\n\n const load = async (currentSource: S, refetching = false) => {\n if (refetching) {\n state.value = 'refreshing'\n loading.value = true\n } else {\n state.value = 'pending'\n loading.value = true\n }\n error.value = undefined\n\n // Track the current promise to avoid race conditions\n // We use a local variable instead of a shared 'lastPromise'\n // because we only care about the latest execution within this closure scope\n // if we needed to support cancellation, we'd need more.\n // Actually, for race conditions we DO need to track the active promise ID or similar.\n // Let's use a simpler counter approach or just compare promise references if we kept track.\n // But since we are removing 'lastPromise' which was used for throwing, \n // we still need to handle race conditions (late resolve).\n\n // Re-introducing a local tracking mechanism just for race conditions\n const currentPromise = fetcher(currentSource, { value: value.peek(), refetching })\n // We need to store this on the closure to compare\n latestPromise = currentPromise\n\n try {\n const result = await currentPromise\n if (latestPromise === currentPromise) {\n value.value = result\n state.value = 'ready'\n loading.value = false\n }\n } catch (err) {\n if (latestPromise === currentPromise) {\n error.value = err\n state.value = 'errored'\n loading.value = false\n }\n }\n }\n\n let latestPromise: Promise<T> | null = null\n\n const getSource = () => {\n if (typeof source === 'function') {\n if (isSignal(source)) {\n return source.value\n }\n return (source as () => S)()\n }\n return source\n }\n\n // Track source changes\n effect(() => {\n const currentSource = getSource()\n load(currentSource, false)\n })\n\n const resource = function () {\n return value()\n } as Resource<T>\n\n Object.defineProperties(resource, {\n value: { get: () => value.value },\n loading: { get: () => loading.value },\n error: { get: () => error.value },\n state: { get: () => state.value },\n latest: { get: () => value.peek() },\n peek: { value: () => value.peek() },\n set: { value: (v: T) => value.set(v) },\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ; (resource as any)[SIGNAL_MARKER] = true\n\n const actions = {\n mutate: (v: T | undefined) => value.set(v),\n refetch: () => load(getSource(), true),\n }\n\n return [resource, actions]\n}\n\n// Re-export commonly used functions for convenience\n// These are imported from other modules but re-exported here for backward compatibility\nexport { effect } from './effect'\nexport { root, untrack } from './owner'\n"]}
package/dist/core.js CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var chunkTQLZ7UZX_js=require('./chunk-TQLZ7UZX.js'),chunkMKE3KA43_js=require('./chunk-MKE3KA43.js');Object.defineProperty(exports,"equals",{enumerable:true,get:function(){return chunkTQLZ7UZX_js.f}});Object.defineProperty(exports,"isStateValue",{enumerable:true,get:function(){return chunkTQLZ7UZX_js.d}});Object.defineProperty(exports,"isTruthy",{enumerable:true,get:function(){return chunkTQLZ7UZX_js.g}});Object.defineProperty(exports,"ref",{enumerable:true,get:function(){return chunkTQLZ7UZX_js.i}});Object.defineProperty(exports,"state",{enumerable:true,get:function(){return chunkTQLZ7UZX_js.h}});Object.defineProperty(exports,"effect",{enumerable:true,get:function(){return chunkMKE3KA43_js.i}});//# sourceMappingURL=core.js.map
1
+ 'use strict';var chunkRDA77IE6_js=require('./chunk-RDA77IE6.js'),chunkYGMMJWAA_js=require('./chunk-YGMMJWAA.js');Object.defineProperty(exports,"equals",{enumerable:true,get:function(){return chunkRDA77IE6_js.f}});Object.defineProperty(exports,"isStateValue",{enumerable:true,get:function(){return chunkRDA77IE6_js.d}});Object.defineProperty(exports,"isTruthy",{enumerable:true,get:function(){return chunkRDA77IE6_js.g}});Object.defineProperty(exports,"ref",{enumerable:true,get:function(){return chunkRDA77IE6_js.i}});Object.defineProperty(exports,"state",{enumerable:true,get:function(){return chunkRDA77IE6_js.h}});Object.defineProperty(exports,"effect",{enumerable:true,get:function(){return chunkYGMMJWAA_js.h}});//# sourceMappingURL=core.js.map
2
2
  //# sourceMappingURL=core.js.map
package/dist/core.mjs CHANGED
@@ -1,2 +1,2 @@
1
- export{f as equals,d as isStateValue,g as isTruthy,i as ref,h as state}from'./chunk-Y4DUMNIW.mjs';export{i as effect}from'./chunk-GFL4VRAO.mjs';//# sourceMappingURL=core.mjs.map
1
+ export{f as equals,d as isStateValue,g as isTruthy,i as ref,h as state}from'./chunk-2ZHUQBNI.mjs';export{h as effect}from'./chunk-J4CK5NRW.mjs';//# sourceMappingURL=core.mjs.map
2
2
  //# sourceMappingURL=core.mjs.map
package/dist/dom.js CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var chunkWEYAKKNF_js=require('./chunk-WEYAKKNF.js');require('./chunk-CBO2X74Q.js'),require('./chunk-TQLZ7UZX.js');var chunkQ7IWDVJ4_js=require('./chunk-Q7IWDVJ4.js');require('./chunk-WQFQO5LK.js');var chunkMKE3KA43_js=require('./chunk-MKE3KA43.js');var C={viewBox:"viewBox",preserveAspectRatio:"preserveAspectRatio",strokeWidth:"stroke-width",strokeLinecap:"stroke-linecap",strokeLinejoin:"stroke-linejoin",strokeDasharray:"stroke-dasharray",strokeDashoffset:"stroke-dashoffset",fillOpacity:"fill-opacity",strokeOpacity:"stroke-opacity",stopColor:"stop-color",stopOpacity:"stop-opacity",clipPath:"clip-path",markerEnd:"marker-end",markerStart:"marker-start",markerMid:"marker-mid"};function M(t,e,a={}){let{onMismatch:n,recoverMismatch:r=false}=a,i=(s,l,p)=>{n?n(s,l,p):typeof __DEV__<"u"&&__DEV__&&console.warn(`[Flexium Hydration] ${s}`);};c(t,e.firstChild,{handleMismatch:i,recoverMismatch:r});}function c(t,e,a){if(t==null||t===false)return e;if(!e)return a.handleMismatch("No DOM node found for vnode",e,t),null;if(typeof t=="string"||typeof t=="number")if(e.nodeType===Node.TEXT_NODE){let n=String(t);return e.textContent!==n&&(a.handleMismatch(`Text mismatch: "${e.textContent}" vs "${n}"`,e,t),e.textContent=n),e.nextSibling}else return a.handleMismatch(`Expected text node, got ${e.nodeType}`,e,t),e.nextSibling;if(chunkMKE3KA43_js.m(t)&&e.nodeType===Node.TEXT_NODE)return chunkMKE3KA43_js.i(()=>{e.textContent=String(t.value);}),e.nextSibling;if(typeof t=="function")return chunkMKE3KA43_js.i(()=>{let n=t();e.nodeType===Node.TEXT_NODE&&(e.textContent=String(n));}),e.nextSibling;if(typeof t.type=="function"){let n=t.type({...t.props,children:t.children});return c(n,e,a)}if(t.type==="fragment"||t.type===null){let n=e,r=t.children||[];for(let i of r)n=c(i,n,a);return n}if(typeof t.type=="string"){if(e.nodeType!==Node.ELEMENT_NODE)return a.handleMismatch(`Expected element node, got ${e.nodeType}`,e,t),e.nextSibling;let n=e,r=n.tagName.toLowerCase();if(r!==t.type.toLowerCase())return a.handleMismatch(`Tag mismatch: "${r}" vs "${t.type}"`,e,t),e.nextSibling;t.props&&b(n,t.props,a);let i=n.firstChild;if(t.children){let s=Array.isArray(t.children)?t.children.flat():[t.children];for(let l of s)l==null||l===false||(i=c(l,i,a));}return n.nextSibling}return e?.nextSibling||null}function b(t,e,a){for(let n in e){let r=e[n];if(n==="children"||n==="key"||n==="ref"){n==="ref"&&typeof r=="function"&&r(t);continue}if(n.startsWith("on")){let i=n.slice(2).toLowerCase();t.addEventListener(i,r);continue}if(chunkMKE3KA43_js.m(r)){let i=n==="className"?"class":n;chunkMKE3KA43_js.i(()=>{if(i==="class")t.setAttribute("class",String(r.value));else if(i==="style"&&typeof r.value=="object")Object.assign(t.style,r.value);else {let s=C[i]||i;i in t&&!(t instanceof SVGElement)?t[i]=r.value:t.setAttribute(s,String(r.value));}});continue}if(typeof __DEV__<"u"&&__DEV__&&(n==="className"||n==="class")){let i=t.getAttribute("class")||"";i!==r&&a.handleMismatch(`Class mismatch on <${t.tagName.toLowerCase()}>: "${i}" vs "${r}"`,t,e);}}}Object.defineProperty(exports,"DOMRenderer",{enumerable:true,get:function(){return chunkWEYAKKNF_js.a}});Object.defineProperty(exports,"Portal",{enumerable:true,get:function(){return chunkWEYAKKNF_js.i}});Object.defineProperty(exports,"createReactiveRoot",{enumerable:true,get:function(){return chunkWEYAKKNF_js.f}});Object.defineProperty(exports,"createRoot",{enumerable:true,get:function(){return chunkWEYAKKNF_js.h}});Object.defineProperty(exports,"domRenderer",{enumerable:true,get:function(){return chunkWEYAKKNF_js.b}});Object.defineProperty(exports,"mountReactive",{enumerable:true,get:function(){return chunkWEYAKKNF_js.e}});Object.defineProperty(exports,"render",{enumerable:true,get:function(){return chunkWEYAKKNF_js.g}});Object.defineProperty(exports,"Fragment",{enumerable:true,get:function(){return chunkQ7IWDVJ4_js.b}});Object.defineProperty(exports,"f",{enumerable:true,get:function(){return chunkQ7IWDVJ4_js.a}});exports.hydrate=M;//# sourceMappingURL=dom.js.map
1
+ 'use strict';var chunkVIVO4FHN_js=require('./chunk-VIVO4FHN.js');require('./chunk-DFG62GKW.js'),require('./chunk-RDA77IE6.js');var chunkQ7IWDVJ4_js=require('./chunk-Q7IWDVJ4.js');require('./chunk-WQFQO5LK.js');var chunkYGMMJWAA_js=require('./chunk-YGMMJWAA.js');var C={viewBox:"viewBox",preserveAspectRatio:"preserveAspectRatio",strokeWidth:"stroke-width",strokeLinecap:"stroke-linecap",strokeLinejoin:"stroke-linejoin",strokeDasharray:"stroke-dasharray",strokeDashoffset:"stroke-dashoffset",fillOpacity:"fill-opacity",strokeOpacity:"stroke-opacity",stopColor:"stop-color",stopOpacity:"stop-opacity",clipPath:"clip-path",markerEnd:"marker-end",markerStart:"marker-start",markerMid:"marker-mid"};function M(t,e,a={}){let{onMismatch:n,recoverMismatch:r=false}=a,i=(s,l,p)=>{n?n(s,l,p):typeof __DEV__<"u"&&__DEV__&&console.warn(`[Flexium Hydration] ${s}`);};c(t,e.firstChild,{handleMismatch:i,recoverMismatch:r});}function c(t,e,a){if(t==null||t===false)return e;if(!e)return a.handleMismatch("No DOM node found for vnode",e,t),null;if(typeof t=="string"||typeof t=="number")if(e.nodeType===Node.TEXT_NODE){let n=String(t);return e.textContent!==n&&(a.handleMismatch(`Text mismatch: "${e.textContent}" vs "${n}"`,e,t),e.textContent=n),e.nextSibling}else return a.handleMismatch(`Expected text node, got ${e.nodeType}`,e,t),e.nextSibling;if(chunkYGMMJWAA_js.l(t)&&e.nodeType===Node.TEXT_NODE)return chunkYGMMJWAA_js.h(()=>{e.textContent=String(t.value);}),e.nextSibling;if(typeof t=="function")return chunkYGMMJWAA_js.h(()=>{let n=t();e.nodeType===Node.TEXT_NODE&&(e.textContent=String(n));}),e.nextSibling;if(typeof t.type=="function"){let n=t.type({...t.props,children:t.children});return c(n,e,a)}if(t.type==="fragment"||t.type===null){let n=e,r=t.children||[];for(let i of r)n=c(i,n,a);return n}if(typeof t.type=="string"){if(e.nodeType!==Node.ELEMENT_NODE)return a.handleMismatch(`Expected element node, got ${e.nodeType}`,e,t),e.nextSibling;let n=e,r=n.tagName.toLowerCase();if(r!==t.type.toLowerCase())return a.handleMismatch(`Tag mismatch: "${r}" vs "${t.type}"`,e,t),e.nextSibling;t.props&&b(n,t.props,a);let i=n.firstChild;if(t.children){let s=Array.isArray(t.children)?t.children.flat():[t.children];for(let l of s)l==null||l===false||(i=c(l,i,a));}return n.nextSibling}return e?.nextSibling||null}function b(t,e,a){for(let n in e){let r=e[n];if(n==="children"||n==="key"||n==="ref"){n==="ref"&&typeof r=="function"&&r(t);continue}if(n.startsWith("on")){let i=n.slice(2).toLowerCase();t.addEventListener(i,r);continue}if(chunkYGMMJWAA_js.l(r)){let i=n==="className"?"class":n;chunkYGMMJWAA_js.h(()=>{if(i==="class")t.setAttribute("class",String(r.value));else if(i==="style"&&typeof r.value=="object")Object.assign(t.style,r.value);else {let s=C[i]||i;i in t&&!(t instanceof SVGElement)?t[i]=r.value:t.setAttribute(s,String(r.value));}});continue}if(typeof __DEV__<"u"&&__DEV__&&(n==="className"||n==="class")){let i=t.getAttribute("class")||"";i!==r&&a.handleMismatch(`Class mismatch on <${t.tagName.toLowerCase()}>: "${i}" vs "${r}"`,t,e);}}}Object.defineProperty(exports,"DOMRenderer",{enumerable:true,get:function(){return chunkVIVO4FHN_js.a}});Object.defineProperty(exports,"Portal",{enumerable:true,get:function(){return chunkVIVO4FHN_js.i}});Object.defineProperty(exports,"createReactiveRoot",{enumerable:true,get:function(){return chunkVIVO4FHN_js.f}});Object.defineProperty(exports,"createRoot",{enumerable:true,get:function(){return chunkVIVO4FHN_js.h}});Object.defineProperty(exports,"domRenderer",{enumerable:true,get:function(){return chunkVIVO4FHN_js.b}});Object.defineProperty(exports,"mountReactive",{enumerable:true,get:function(){return chunkVIVO4FHN_js.e}});Object.defineProperty(exports,"render",{enumerable:true,get:function(){return chunkVIVO4FHN_js.g}});Object.defineProperty(exports,"Fragment",{enumerable:true,get:function(){return chunkQ7IWDVJ4_js.b}});Object.defineProperty(exports,"f",{enumerable:true,get:function(){return chunkQ7IWDVJ4_js.a}});exports.hydrate=M;//# sourceMappingURL=dom.js.map
2
2
  //# sourceMappingURL=dom.js.map
package/dist/dom.mjs CHANGED
@@ -1,2 +1,2 @@
1
- export{a as DOMRenderer,i as Portal,f as createReactiveRoot,h as createRoot,b as domRenderer,e as mountReactive,g as render}from'./chunk-WO6NQ3KR.mjs';import'./chunk-JDTJFAXO.mjs';import'./chunk-Y4DUMNIW.mjs';export{b as Fragment,a as f}from'./chunk-WVEJT7HD.mjs';import'./chunk-KNF5ERPK.mjs';import {m,i}from'./chunk-GFL4VRAO.mjs';var C={viewBox:"viewBox",preserveAspectRatio:"preserveAspectRatio",strokeWidth:"stroke-width",strokeLinecap:"stroke-linecap",strokeLinejoin:"stroke-linejoin",strokeDasharray:"stroke-dasharray",strokeDashoffset:"stroke-dashoffset",fillOpacity:"fill-opacity",strokeOpacity:"stroke-opacity",stopColor:"stop-color",stopOpacity:"stop-opacity",clipPath:"clip-path",markerEnd:"marker-end",markerStart:"marker-start",markerMid:"marker-mid"};function M(t,e,a={}){let{onMismatch:n,recoverMismatch:r=false}=a,i=(s,l,p)=>{n?n(s,l,p):typeof __DEV__<"u"&&__DEV__&&console.warn(`[Flexium Hydration] ${s}`);};c(t,e.firstChild,{handleMismatch:i,recoverMismatch:r});}function c(t,e,a){if(t==null||t===false)return e;if(!e)return a.handleMismatch("No DOM node found for vnode",e,t),null;if(typeof t=="string"||typeof t=="number")if(e.nodeType===Node.TEXT_NODE){let n=String(t);return e.textContent!==n&&(a.handleMismatch(`Text mismatch: "${e.textContent}" vs "${n}"`,e,t),e.textContent=n),e.nextSibling}else return a.handleMismatch(`Expected text node, got ${e.nodeType}`,e,t),e.nextSibling;if(m(t)&&e.nodeType===Node.TEXT_NODE)return i(()=>{e.textContent=String(t.value);}),e.nextSibling;if(typeof t=="function")return i(()=>{let n=t();e.nodeType===Node.TEXT_NODE&&(e.textContent=String(n));}),e.nextSibling;if(typeof t.type=="function"){let n=t.type({...t.props,children:t.children});return c(n,e,a)}if(t.type==="fragment"||t.type===null){let n=e,r=t.children||[];for(let i of r)n=c(i,n,a);return n}if(typeof t.type=="string"){if(e.nodeType!==Node.ELEMENT_NODE)return a.handleMismatch(`Expected element node, got ${e.nodeType}`,e,t),e.nextSibling;let n=e,r=n.tagName.toLowerCase();if(r!==t.type.toLowerCase())return a.handleMismatch(`Tag mismatch: "${r}" vs "${t.type}"`,e,t),e.nextSibling;t.props&&b(n,t.props,a);let i=n.firstChild;if(t.children){let s=Array.isArray(t.children)?t.children.flat():[t.children];for(let l of s)l==null||l===false||(i=c(l,i,a));}return n.nextSibling}return e?.nextSibling||null}function b(t,e,a){for(let n in e){let r=e[n];if(n==="children"||n==="key"||n==="ref"){n==="ref"&&typeof r=="function"&&r(t);continue}if(n.startsWith("on")){let i=n.slice(2).toLowerCase();t.addEventListener(i,r);continue}if(m(r)){let i$1=n==="className"?"class":n;i(()=>{if(i$1==="class")t.setAttribute("class",String(r.value));else if(i$1==="style"&&typeof r.value=="object")Object.assign(t.style,r.value);else {let s=C[i$1]||i$1;i$1 in t&&!(t instanceof SVGElement)?t[i$1]=r.value:t.setAttribute(s,String(r.value));}});continue}if(typeof __DEV__<"u"&&__DEV__&&(n==="className"||n==="class")){let i=t.getAttribute("class")||"";i!==r&&a.handleMismatch(`Class mismatch on <${t.tagName.toLowerCase()}>: "${i}" vs "${r}"`,t,e);}}}export{M as hydrate};//# sourceMappingURL=dom.mjs.map
1
+ export{a as DOMRenderer,i as Portal,f as createReactiveRoot,h as createRoot,b as domRenderer,e as mountReactive,g as render}from'./chunk-JEDCNAAI.mjs';import'./chunk-RUXAK74B.mjs';import'./chunk-2ZHUQBNI.mjs';export{b as Fragment,a as f}from'./chunk-WVEJT7HD.mjs';import'./chunk-KNF5ERPK.mjs';import {l,h}from'./chunk-J4CK5NRW.mjs';var C={viewBox:"viewBox",preserveAspectRatio:"preserveAspectRatio",strokeWidth:"stroke-width",strokeLinecap:"stroke-linecap",strokeLinejoin:"stroke-linejoin",strokeDasharray:"stroke-dasharray",strokeDashoffset:"stroke-dashoffset",fillOpacity:"fill-opacity",strokeOpacity:"stroke-opacity",stopColor:"stop-color",stopOpacity:"stop-opacity",clipPath:"clip-path",markerEnd:"marker-end",markerStart:"marker-start",markerMid:"marker-mid"};function M(t,e,a={}){let{onMismatch:n,recoverMismatch:r=false}=a,i=(s,l,p)=>{n?n(s,l,p):typeof __DEV__<"u"&&__DEV__&&console.warn(`[Flexium Hydration] ${s}`);};c(t,e.firstChild,{handleMismatch:i,recoverMismatch:r});}function c(t,e,a){if(t==null||t===false)return e;if(!e)return a.handleMismatch("No DOM node found for vnode",e,t),null;if(typeof t=="string"||typeof t=="number")if(e.nodeType===Node.TEXT_NODE){let n=String(t);return e.textContent!==n&&(a.handleMismatch(`Text mismatch: "${e.textContent}" vs "${n}"`,e,t),e.textContent=n),e.nextSibling}else return a.handleMismatch(`Expected text node, got ${e.nodeType}`,e,t),e.nextSibling;if(l(t)&&e.nodeType===Node.TEXT_NODE)return h(()=>{e.textContent=String(t.value);}),e.nextSibling;if(typeof t=="function")return h(()=>{let n=t();e.nodeType===Node.TEXT_NODE&&(e.textContent=String(n));}),e.nextSibling;if(typeof t.type=="function"){let n=t.type({...t.props,children:t.children});return c(n,e,a)}if(t.type==="fragment"||t.type===null){let n=e,r=t.children||[];for(let i of r)n=c(i,n,a);return n}if(typeof t.type=="string"){if(e.nodeType!==Node.ELEMENT_NODE)return a.handleMismatch(`Expected element node, got ${e.nodeType}`,e,t),e.nextSibling;let n=e,r=n.tagName.toLowerCase();if(r!==t.type.toLowerCase())return a.handleMismatch(`Tag mismatch: "${r}" vs "${t.type}"`,e,t),e.nextSibling;t.props&&b(n,t.props,a);let i=n.firstChild;if(t.children){let s=Array.isArray(t.children)?t.children.flat():[t.children];for(let l of s)l==null||l===false||(i=c(l,i,a));}return n.nextSibling}return e?.nextSibling||null}function b(t,e,a){for(let n in e){let r=e[n];if(n==="children"||n==="key"||n==="ref"){n==="ref"&&typeof r=="function"&&r(t);continue}if(n.startsWith("on")){let i=n.slice(2).toLowerCase();t.addEventListener(i,r);continue}if(l(r)){let i=n==="className"?"class":n;h(()=>{if(i==="class")t.setAttribute("class",String(r.value));else if(i==="style"&&typeof r.value=="object")Object.assign(t.style,r.value);else {let s=C[i]||i;i in t&&!(t instanceof SVGElement)?t[i]=r.value:t.setAttribute(s,String(r.value));}});continue}if(typeof __DEV__<"u"&&__DEV__&&(n==="className"||n==="class")){let i=t.getAttribute("class")||"";i!==r&&a.handleMismatch(`Class mismatch on <${t.tagName.toLowerCase()}>: "${i}" vs "${r}"`,t,e);}}}export{M as hydrate};//# sourceMappingURL=dom.mjs.map
2
2
  //# sourceMappingURL=dom.mjs.map
package/dist/dom.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/renderers/dom/hydrate.ts"],"names":["SVG_ATTR_MAP","hydrate","vnode","container","options","onMismatch","recoverMismatch","handleMismatch","message","domNode","vn","hydrateNode","ctx","text","isSignal","effect","value","result","currentNode","children","child","el","tagName","hydrateProps","childDom","props","key","eventName","propName","attrName","domClass"],"mappings":"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","file":"dom.mjs","sourcesContent":["import { effect, isSignal } from '../../core/signal'\n\n/**\n * SVG Attribute Case Mapping\n * React-like camelCase to SVG case-sensitive attributes\n */\nconst SVG_ATTR_MAP: Record<string, string> = {\n viewBox: 'viewBox',\n preserveAspectRatio: 'preserveAspectRatio',\n strokeWidth: 'stroke-width',\n strokeLinecap: 'stroke-linecap',\n strokeLinejoin: 'stroke-linejoin',\n strokeDasharray: 'stroke-dasharray',\n strokeDashoffset: 'stroke-dashoffset',\n fillOpacity: 'fill-opacity',\n strokeOpacity: 'stroke-opacity',\n stopColor: 'stop-color',\n stopOpacity: 'stop-opacity',\n clipPath: 'clip-path',\n markerEnd: 'marker-end',\n markerStart: 'marker-start',\n markerMid: 'marker-mid',\n}\n\n/**\n * Hydration options\n */\nexport interface HydrateOptions {\n /** Called when hydration encounters a mismatch */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onMismatch?: (message: string, domNode: Node | null, vnode: any) => void\n /** Whether to recover from mismatches by re-rendering */\n recoverMismatch?: boolean\n}\n\n/**\n * Hydrate server-rendered HTML with client-side interactivity\n *\n * This function walks the existing DOM tree and attaches event handlers,\n * sets up signal bindings, and validates that the DOM matches the expected vnode structure.\n *\n * @param vnode - Virtual node to hydrate against\n * @param container - Container element with server-rendered HTML\n * @param options - Hydration options\n *\n * @example\n * ```tsx\n * // Server rendered HTML in #app\n * hydrate(<App />, document.getElementById('app'));\n * ```\n */\nexport function hydrate(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vnode: any,\n container: Element,\n options: HydrateOptions = {}\n) {\n const { onMismatch, recoverMismatch = false } = options\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleMismatch = (message: string, domNode: Node | null, vn: any) => {\n if (onMismatch) {\n onMismatch(message, domNode, vn)\n } else if (typeof __DEV__ !== 'undefined' ? __DEV__ : false) {\n console.warn(`[Flexium Hydration] ${message}`)\n }\n }\n\n hydrateNode(vnode, container.firstChild as Node, {\n handleMismatch,\n recoverMismatch,\n })\n}\n\ninterface HydrateContext {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleMismatch: (message: string, domNode: Node | null, vnode: any) => void\n recoverMismatch: boolean\n}\n\nfunction hydrateNode(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vnode: any,\n domNode: Node | null,\n ctx: HydrateContext\n): Node | null {\n if (vnode === null || vnode === undefined || vnode === false) {\n return domNode\n }\n\n if (!domNode) {\n ctx.handleMismatch('No DOM node found for vnode', domNode, vnode)\n return null\n }\n\n // Handle text/number primitives\n if (typeof vnode === 'string' || typeof vnode === 'number') {\n if (domNode.nodeType === Node.TEXT_NODE) {\n const text = String(vnode)\n if (domNode.textContent !== text) {\n ctx.handleMismatch(\n `Text mismatch: \"${domNode.textContent}\" vs \"${text}\"`,\n domNode,\n vnode\n )\n domNode.textContent = text\n }\n return domNode.nextSibling\n } else {\n ctx.handleMismatch(\n `Expected text node, got ${domNode.nodeType}`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n }\n\n // Handle signals - create reactive binding\n if (isSignal(vnode)) {\n if (domNode.nodeType === Node.TEXT_NODE) {\n effect(() => {\n domNode.textContent = String(vnode.value)\n })\n return domNode.nextSibling\n }\n }\n\n // Handle computed values\n if (typeof vnode === 'function') {\n // Create reactive binding for computed/derived values\n effect(() => {\n const value = vnode()\n if (domNode.nodeType === Node.TEXT_NODE) {\n domNode.textContent = String(value)\n }\n })\n return domNode.nextSibling\n }\n\n // Handle function components\n if (typeof vnode.type === 'function') {\n const result = vnode.type({ ...vnode.props, children: vnode.children })\n return hydrateNode(result, domNode, ctx)\n }\n\n // Handle fragments\n if (vnode.type === 'fragment' || vnode.type === null) {\n let currentNode: Node | null = domNode\n const children = vnode.children || []\n for (const child of children) {\n currentNode = hydrateNode(child, currentNode, ctx)\n }\n return currentNode\n }\n\n // Handle element vnodes\n if (typeof vnode.type === 'string') {\n if (domNode.nodeType !== Node.ELEMENT_NODE) {\n ctx.handleMismatch(\n `Expected element node, got ${domNode.nodeType}`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n\n const el = domNode as Element\n const tagName = el.tagName.toLowerCase()\n\n if (tagName !== vnode.type.toLowerCase()) {\n ctx.handleMismatch(\n `Tag mismatch: \"${tagName}\" vs \"${vnode.type}\"`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n\n // Hydrate props\n if (vnode.props) {\n hydrateProps(el, vnode.props, ctx)\n }\n\n // Hydrate children\n let childDom = el.firstChild\n if (vnode.children) {\n const children = Array.isArray(vnode.children)\n ? vnode.children.flat()\n : [vnode.children]\n for (const child of children) {\n if (child === null || child === undefined || child === false) continue\n childDom = hydrateNode(child, childDom, ctx) as ChildNode | null\n }\n }\n\n return el.nextSibling\n }\n\n return domNode?.nextSibling || null\n}\n\n/**\n * Hydrate element props - attach events, set up reactive bindings\n */\nfunction hydrateProps(\n el: Element,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n props: Record<string, any>,\n ctx: HydrateContext\n): void {\n for (const key in props) {\n const value = props[key]\n\n if (key === 'children' || key === 'key' || key === 'ref') {\n // Handle ref callback\n if (key === 'ref' && typeof value === 'function') {\n value(el)\n }\n continue\n }\n\n // Event handlers\n if (key.startsWith('on')) {\n const eventName = key.slice(2).toLowerCase()\n el.addEventListener(eventName, value)\n continue\n }\n\n // Reactive props (signals)\n if (isSignal(value)) {\n const propName = key === 'className' ? 'class' : key\n effect(() => {\n if (propName === 'class') {\n el.setAttribute('class', String(value.value))\n } else if (propName === 'style' && typeof value.value === 'object') {\n Object.assign((el as HTMLElement).style, value.value)\n } else {\n // Handle SVG attributes\n const attrName = SVG_ATTR_MAP[propName] || propName\n\n if (propName in el && !(el instanceof SVGElement)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ; (el as any)[propName] = value.value\n } else {\n el.setAttribute(attrName, String(value.value))\n }\n }\n })\n continue\n }\n\n // Validate static props match (in development)\n if (typeof __DEV__ !== 'undefined' ? __DEV__ : false) {\n if (key === 'className' || key === 'class') {\n const domClass = el.getAttribute('class') || ''\n if (domClass !== value) {\n ctx.handleMismatch(\n `Class mismatch on <${el.tagName.toLowerCase()}>: \"${domClass}\" vs \"${value}\"`,\n el,\n props\n )\n }\n }\n }\n }\n}\n\n// Declare global __DEV__ for development mode detection\ndeclare global {\n const __DEV__: boolean | undefined\n}\n"]}
1
+ {"version":3,"sources":["../src/renderers/dom/hydrate.ts"],"names":["SVG_ATTR_MAP","hydrate","vnode","container","options","onMismatch","recoverMismatch","handleMismatch","message","domNode","vn","hydrateNode","ctx","text","isSignal","effect","value","result","currentNode","children","child","el","tagName","hydrateProps","childDom","props","key","eventName","propName","attrName","domClass"],"mappings":"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","file":"dom.mjs","sourcesContent":["import { effect, isSignal } from '../../core/signal'\n\n/**\n * SVG Attribute Case Mapping\n * React-like camelCase to SVG case-sensitive attributes\n */\nconst SVG_ATTR_MAP: Record<string, string> = {\n viewBox: 'viewBox',\n preserveAspectRatio: 'preserveAspectRatio',\n strokeWidth: 'stroke-width',\n strokeLinecap: 'stroke-linecap',\n strokeLinejoin: 'stroke-linejoin',\n strokeDasharray: 'stroke-dasharray',\n strokeDashoffset: 'stroke-dashoffset',\n fillOpacity: 'fill-opacity',\n strokeOpacity: 'stroke-opacity',\n stopColor: 'stop-color',\n stopOpacity: 'stop-opacity',\n clipPath: 'clip-path',\n markerEnd: 'marker-end',\n markerStart: 'marker-start',\n markerMid: 'marker-mid',\n}\n\n/**\n * Hydration options\n */\nexport interface HydrateOptions {\n /** Called when hydration encounters a mismatch */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onMismatch?: (message: string, domNode: Node | null, vnode: any) => void\n /** Whether to recover from mismatches by re-rendering */\n recoverMismatch?: boolean\n}\n\n/**\n * Hydrate server-rendered HTML with client-side interactivity\n *\n * This function walks the existing DOM tree and attaches event handlers,\n * sets up signal bindings, and validates that the DOM matches the expected vnode structure.\n *\n * @param vnode - Virtual node to hydrate against\n * @param container - Container element with server-rendered HTML\n * @param options - Hydration options\n *\n * @example\n * ```tsx\n * // Server rendered HTML in #app\n * hydrate(<App />, document.getElementById('app'));\n * ```\n */\nexport function hydrate(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vnode: any,\n container: Element,\n options: HydrateOptions = {}\n) {\n const { onMismatch, recoverMismatch = false } = options\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleMismatch = (message: string, domNode: Node | null, vn: any) => {\n if (onMismatch) {\n onMismatch(message, domNode, vn)\n } else if (typeof __DEV__ !== 'undefined' ? __DEV__ : false) {\n console.warn(`[Flexium Hydration] ${message}`)\n }\n }\n\n hydrateNode(vnode, container.firstChild as Node, {\n handleMismatch,\n recoverMismatch,\n })\n}\n\ninterface HydrateContext {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleMismatch: (message: string, domNode: Node | null, vnode: any) => void\n recoverMismatch: boolean\n}\n\nfunction hydrateNode(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vnode: any,\n domNode: Node | null,\n ctx: HydrateContext\n): Node | null {\n if (vnode === null || vnode === undefined || vnode === false) {\n return domNode\n }\n\n if (!domNode) {\n ctx.handleMismatch('No DOM node found for vnode', domNode, vnode)\n return null\n }\n\n // Handle text/number primitives\n if (typeof vnode === 'string' || typeof vnode === 'number') {\n if (domNode.nodeType === Node.TEXT_NODE) {\n const text = String(vnode)\n if (domNode.textContent !== text) {\n ctx.handleMismatch(\n `Text mismatch: \"${domNode.textContent}\" vs \"${text}\"`,\n domNode,\n vnode\n )\n domNode.textContent = text\n }\n return domNode.nextSibling\n } else {\n ctx.handleMismatch(\n `Expected text node, got ${domNode.nodeType}`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n }\n\n // Handle signals - create reactive binding\n if (isSignal(vnode)) {\n if (domNode.nodeType === Node.TEXT_NODE) {\n effect(() => {\n domNode.textContent = String(vnode.value)\n })\n return domNode.nextSibling\n }\n }\n\n // Handle computed values\n if (typeof vnode === 'function') {\n // Create reactive binding for computed/derived values\n effect(() => {\n const value = vnode()\n if (domNode.nodeType === Node.TEXT_NODE) {\n domNode.textContent = String(value)\n }\n })\n return domNode.nextSibling\n }\n\n // Handle function components\n if (typeof vnode.type === 'function') {\n const result = vnode.type({ ...vnode.props, children: vnode.children })\n return hydrateNode(result, domNode, ctx)\n }\n\n // Handle fragments\n if (vnode.type === 'fragment' || vnode.type === null) {\n let currentNode: Node | null = domNode\n const children = vnode.children || []\n for (const child of children) {\n currentNode = hydrateNode(child, currentNode, ctx)\n }\n return currentNode\n }\n\n // Handle element vnodes\n if (typeof vnode.type === 'string') {\n if (domNode.nodeType !== Node.ELEMENT_NODE) {\n ctx.handleMismatch(\n `Expected element node, got ${domNode.nodeType}`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n\n const el = domNode as Element\n const tagName = el.tagName.toLowerCase()\n\n if (tagName !== vnode.type.toLowerCase()) {\n ctx.handleMismatch(\n `Tag mismatch: \"${tagName}\" vs \"${vnode.type}\"`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n\n // Hydrate props\n if (vnode.props) {\n hydrateProps(el, vnode.props, ctx)\n }\n\n // Hydrate children\n let childDom = el.firstChild\n if (vnode.children) {\n const children = Array.isArray(vnode.children)\n ? vnode.children.flat()\n : [vnode.children]\n for (const child of children) {\n if (child === null || child === undefined || child === false) continue\n childDom = hydrateNode(child, childDom, ctx) as ChildNode | null\n }\n }\n\n return el.nextSibling\n }\n\n return domNode?.nextSibling || null\n}\n\n/**\n * Hydrate element props - attach events, set up reactive bindings\n */\nfunction hydrateProps(\n el: Element,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n props: Record<string, any>,\n ctx: HydrateContext\n): void {\n for (const key in props) {\n const value = props[key]\n\n if (key === 'children' || key === 'key' || key === 'ref') {\n // Handle ref callback\n if (key === 'ref' && typeof value === 'function') {\n value(el)\n }\n continue\n }\n\n // Event handlers\n if (key.startsWith('on')) {\n const eventName = key.slice(2).toLowerCase()\n el.addEventListener(eventName, value)\n continue\n }\n\n // Reactive props (signals)\n if (isSignal(value)) {\n const propName = key === 'className' ? 'class' : key\n effect(() => {\n if (propName === 'class') {\n el.setAttribute('class', String(value.value))\n } else if (propName === 'style' && typeof value.value === 'object') {\n Object.assign((el as HTMLElement).style, value.value)\n } else {\n // Handle SVG attributes\n const attrName = SVG_ATTR_MAP[propName] || propName\n\n if (propName in el && !(el instanceof SVGElement)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ; (el as any)[propName] = value.value\n } else {\n el.setAttribute(attrName, String(value.value))\n }\n }\n })\n continue\n }\n\n // Validate static props match (in development)\n if (typeof __DEV__ !== 'undefined' ? __DEV__ : false) {\n if (key === 'className' || key === 'class') {\n const domClass = el.getAttribute('class') || ''\n if (domClass !== value) {\n ctx.handleMismatch(\n `Class mismatch on <${el.tagName.toLowerCase()}>: \"${domClass}\" vs \"${value}\"`,\n el,\n props\n )\n }\n }\n }\n }\n}\n\n// Declare global __DEV__ for development mode detection\ndeclare global {\n const __DEV__: boolean | undefined\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -21,6 +21,6 @@
21
21
  * import { Router, Route, Link } from 'flexium/router'
22
22
  * ```
23
23
  */
24
- declare const VERSION = "0.9.0";
24
+ declare const VERSION = "0.9.1";
25
25
 
26
26
  export { VERSION };
package/dist/index.d.ts CHANGED
@@ -21,6 +21,6 @@
21
21
  * import { Router, Route, Link } from 'flexium/router'
22
22
  * ```
23
23
  */
24
- declare const VERSION = "0.9.0";
24
+ declare const VERSION = "0.9.1";
25
25
 
26
26
  export { VERSION };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var o="0.9.0";exports.VERSION=o;//# sourceMappingURL=index.js.map
1
+ 'use strict';var o="0.9.1";exports.VERSION=o;//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["VERSION"],"mappings":"aAwBO,IAAMA,CAAAA,CAAU","file":"index.js","sourcesContent":["/**\n * Flexium - Next-generation UI/UX library\n *\n * Please use explicit imports from submodules:\n *\n * @example\n * ```tsx\n * // Core reactivity\n * import { state, effect } from 'flexium/core'\n *\n * // DOM rendering\n * import { render, createRoot, Portal } from 'flexium/dom'\n *\n * // Canvas rendering\n * import { Canvas, Rect, Circle } from 'flexium/canvas'\n *\n * // Cross-platform primitives\n * import { Row, Column, Text } from 'flexium/primitives'\n *\n * // Router\n * import { Router, Route, Link } from 'flexium/router'\n * ```\n */\n\nexport const VERSION = '0.9.0'\n\n// Intentionally empty - use explicit submodule imports\n// flexium/core, flexium/dom, flexium/canvas, flexium/primitives, flexium/router\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["VERSION"],"mappings":"aAwBO,IAAMA,CAAAA,CAAU","file":"index.js","sourcesContent":["/**\n * Flexium - Next-generation UI/UX library\n *\n * Please use explicit imports from submodules:\n *\n * @example\n * ```tsx\n * // Core reactivity\n * import { state, effect } from 'flexium/core'\n *\n * // DOM rendering\n * import { render, createRoot, Portal } from 'flexium/dom'\n *\n * // Canvas rendering\n * import { Canvas, Rect, Circle } from 'flexium/canvas'\n *\n * // Cross-platform primitives\n * import { Row, Column, Text } from 'flexium/primitives'\n *\n * // Router\n * import { Router, Route, Link } from 'flexium/router'\n * ```\n */\n\nexport const VERSION = '0.9.1'\n\n// Intentionally empty - use explicit submodule imports\n// flexium/core, flexium/dom, flexium/canvas, flexium/primitives, flexium/router\n"]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var o="0.9.0";export{o as VERSION};//# sourceMappingURL=index.mjs.map
1
+ var o="0.9.1";export{o as VERSION};//# sourceMappingURL=index.mjs.map
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["VERSION"],"mappings":"AAwBO,IAAMA,CAAAA,CAAU","file":"index.mjs","sourcesContent":["/**\n * Flexium - Next-generation UI/UX library\n *\n * Please use explicit imports from submodules:\n *\n * @example\n * ```tsx\n * // Core reactivity\n * import { state, effect } from 'flexium/core'\n *\n * // DOM rendering\n * import { render, createRoot, Portal } from 'flexium/dom'\n *\n * // Canvas rendering\n * import { Canvas, Rect, Circle } from 'flexium/canvas'\n *\n * // Cross-platform primitives\n * import { Row, Column, Text } from 'flexium/primitives'\n *\n * // Router\n * import { Router, Route, Link } from 'flexium/router'\n * ```\n */\n\nexport const VERSION = '0.9.0'\n\n// Intentionally empty - use explicit submodule imports\n// flexium/core, flexium/dom, flexium/canvas, flexium/primitives, flexium/router\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["VERSION"],"mappings":"AAwBO,IAAMA,CAAAA,CAAU","file":"index.mjs","sourcesContent":["/**\n * Flexium - Next-generation UI/UX library\n *\n * Please use explicit imports from submodules:\n *\n * @example\n * ```tsx\n * // Core reactivity\n * import { state, effect } from 'flexium/core'\n *\n * // DOM rendering\n * import { render, createRoot, Portal } from 'flexium/dom'\n *\n * // Canvas rendering\n * import { Canvas, Rect, Circle } from 'flexium/canvas'\n *\n * // Cross-platform primitives\n * import { Row, Column, Text } from 'flexium/primitives'\n *\n * // Router\n * import { Router, Route, Link } from 'flexium/router'\n * ```\n */\n\nexport const VERSION = '0.9.1'\n\n// Intentionally empty - use explicit submodule imports\n// flexium/core, flexium/dom, flexium/canvas, flexium/primitives, flexium/router\n"]}
@@ -1,2 +1,2 @@
1
- 'use strict';var chunkMKE3KA43_js=require('./chunk-MKE3KA43.js');function M(d={}){let{fixedFps:n=60,onUpdate:s,onFixedUpdate:v,onRender:l}=d,c=1/n,e=false,f,t=0,p=0,i=0,r=0,E=0,w=true;function L(y){if(!e)return;f=requestAnimationFrame(L);let h=y/1e3;if(w){t=h,w=false;return}let b=Math.min(h-t,.25);if(t=h,r++,E+=b,E>=1&&(i=r,r=0,E-=1),s&&s(b),v)for(p+=b;p>=c;)v(c),p-=c;if(l){let x=v?p/c:1;l(x);}}return {start(){e||(e=true,w=true,p=0,f=requestAnimationFrame(L));},stop(){e=false,f!==void 0&&(cancelAnimationFrame(f),f=void 0);},isRunning(){return e},getFps(){return i}}}function D(d=window){let n=chunkMKE3KA43_js.k(new Set),s=new Set,v=new Set;function l(t){return t.toLowerCase()}function c(t){let i=l(t.code);if(!n.value.has(i)){s.add(i);let r=new Set(n.value);r.add(i),n.value=r;}}function e(t){let i=l(t.code);if(n.value.has(i)){v.add(i);let r=new Set(n.value);r.delete(i),n.value=r;}}function f(){n.value=new Set,s.clear(),v.clear();}return d.addEventListener("keydown",c),d.addEventListener("keyup",e),d===window&&d.addEventListener("blur",f),{isPressed(t){return n.value.has(l(t))},isJustPressed(t){return s.has(l(t))},isJustReleased(t){return v.has(l(t))},getPressedKeys(){return Array.from(n.value)},get keys(){return n},clearFrameState(){s.clear(),v.clear();},dispose(){d.removeEventListener("keydown",c),d.removeEventListener("keyup",e),d===window&&d.removeEventListener("blur",f);}}}var k={ArrowUp:"arrowup",ArrowDown:"arrowdown",ArrowLeft:"arrowleft",ArrowRight:"arrowright",KeyW:"keyw",KeyA:"keya",KeyS:"keys",KeyD:"keyd",Space:"space",Enter:"enter",Escape:"escape",ShiftLeft:"shiftleft",ShiftRight:"shiftright",ControlLeft:"controlleft",ControlRight:"controlright",AltLeft:"altleft",AltRight:"altright",Tab:"tab",Digit0:"digit0",Digit1:"digit1",Digit2:"digit2",Digit3:"digit3",Digit4:"digit4",Digit5:"digit5",Digit6:"digit6",Digit7:"digit7",Digit8:"digit8",Digit9:"digit9"};function K(d={}){let{target:n=window,canvas:s}=d,v=chunkMKE3KA43_js.k({x:0,y:0}),l=chunkMKE3KA43_js.k({x:0,y:0}),c=chunkMKE3KA43_js.k(0),e=chunkMKE3KA43_js.k(new Set),f=0,t=0,p=0,i=0,r=0;function E(o){if(s){let m=s.getBoundingClientRect(),a=s.width/m.width,S=s.height/m.height;return {x:(o.clientX-m.left)*a,y:(o.clientY-m.top)*S}}return {x:o.clientX,y:o.clientY}}function w(o){let a=E(o);p+=a.x-f,i+=a.y-t,f=a.x,t=a.y,v.value=a,l.value={x:p,y:i};}function L(o){let m=o,a=new Set(e.value);a.add(m.button),e.value=a;}function y(o){let m=o,a=new Set(e.value);a.delete(m.button),e.value=a;}function h(o){r+=Math.sign(o.deltaY),c.value=r;}function b(){e.value=new Set;}function x(o){}let u=s||n;return u.addEventListener("mousemove",w),u.addEventListener("mousedown",L),u.addEventListener("mouseup",y),u.addEventListener("wheel",h,{passive:true}),u.addEventListener("mouseleave",b),u.addEventListener("contextmenu",x),n!==window&&window.addEventListener("mouseup",y),{get position(){return v},get delta(){return l},get wheelDelta(){return c},isPressed(o){return e.value.has(o)},isLeftPressed(){return e.value.has(0)},isRightPressed(){return e.value.has(2)},isMiddlePressed(){return e.value.has(1)},clearFrameState(){p=0,i=0,r=0,l.value={x:0,y:0},c.value=0;},dispose(){u.removeEventListener("mousemove",w),u.removeEventListener("mousedown",L),u.removeEventListener("mouseup",y),u.removeEventListener("wheel",h),u.removeEventListener("mouseleave",b),u.removeEventListener("contextmenu",x),n!==window&&window.removeEventListener("mouseup",y);}}}var F={Left:0,Middle:1,Right:2};exports.Keys=k;exports.MouseButton=F;exports.createLoop=M;exports.keyboard=D;exports.mouse=K;//# sourceMappingURL=interactive.js.map
1
+ 'use strict';var chunkYGMMJWAA_js=require('./chunk-YGMMJWAA.js');function M(d={}){let{fixedFps:n=60,onUpdate:s,onFixedUpdate:v,onRender:l}=d,c=1/n,e=false,f,t=0,p=0,i=0,r=0,E=0,w=true;function L(y){if(!e)return;f=requestAnimationFrame(L);let h=y/1e3;if(w){t=h,w=false;return}let b=Math.min(h-t,.25);if(t=h,r++,E+=b,E>=1&&(i=r,r=0,E-=1),s&&s(b),v)for(p+=b;p>=c;)v(c),p-=c;if(l){let x=v?p/c:1;l(x);}}return {start(){e||(e=true,w=true,p=0,f=requestAnimationFrame(L));},stop(){e=false,f!==void 0&&(cancelAnimationFrame(f),f=void 0);},isRunning(){return e},getFps(){return i}}}function D(d=window){let n=chunkYGMMJWAA_js.j(new Set),s=new Set,v=new Set;function l(t){return t.toLowerCase()}function c(t){let i=l(t.code);if(!n.value.has(i)){s.add(i);let r=new Set(n.value);r.add(i),n.value=r;}}function e(t){let i=l(t.code);if(n.value.has(i)){v.add(i);let r=new Set(n.value);r.delete(i),n.value=r;}}function f(){n.value=new Set,s.clear(),v.clear();}return d.addEventListener("keydown",c),d.addEventListener("keyup",e),d===window&&d.addEventListener("blur",f),{isPressed(t){return n.value.has(l(t))},isJustPressed(t){return s.has(l(t))},isJustReleased(t){return v.has(l(t))},getPressedKeys(){return Array.from(n.value)},get keys(){return n},clearFrameState(){s.clear(),v.clear();},dispose(){d.removeEventListener("keydown",c),d.removeEventListener("keyup",e),d===window&&d.removeEventListener("blur",f);}}}var k={ArrowUp:"arrowup",ArrowDown:"arrowdown",ArrowLeft:"arrowleft",ArrowRight:"arrowright",KeyW:"keyw",KeyA:"keya",KeyS:"keys",KeyD:"keyd",Space:"space",Enter:"enter",Escape:"escape",ShiftLeft:"shiftleft",ShiftRight:"shiftright",ControlLeft:"controlleft",ControlRight:"controlright",AltLeft:"altleft",AltRight:"altright",Tab:"tab",Digit0:"digit0",Digit1:"digit1",Digit2:"digit2",Digit3:"digit3",Digit4:"digit4",Digit5:"digit5",Digit6:"digit6",Digit7:"digit7",Digit8:"digit8",Digit9:"digit9"};function K(d={}){let{target:n=window,canvas:s}=d,v=chunkYGMMJWAA_js.j({x:0,y:0}),l=chunkYGMMJWAA_js.j({x:0,y:0}),c=chunkYGMMJWAA_js.j(0),e=chunkYGMMJWAA_js.j(new Set),f=0,t=0,p=0,i=0,r=0;function E(o){if(s){let m=s.getBoundingClientRect(),a=s.width/m.width,S=s.height/m.height;return {x:(o.clientX-m.left)*a,y:(o.clientY-m.top)*S}}return {x:o.clientX,y:o.clientY}}function w(o){let a=E(o);p+=a.x-f,i+=a.y-t,f=a.x,t=a.y,v.value=a,l.value={x:p,y:i};}function L(o){let m=o,a=new Set(e.value);a.add(m.button),e.value=a;}function y(o){let m=o,a=new Set(e.value);a.delete(m.button),e.value=a;}function h(o){r+=Math.sign(o.deltaY),c.value=r;}function b(){e.value=new Set;}function x(o){}let u=s||n;return u.addEventListener("mousemove",w),u.addEventListener("mousedown",L),u.addEventListener("mouseup",y),u.addEventListener("wheel",h,{passive:true}),u.addEventListener("mouseleave",b),u.addEventListener("contextmenu",x),n!==window&&window.addEventListener("mouseup",y),{get position(){return v},get delta(){return l},get wheelDelta(){return c},isPressed(o){return e.value.has(o)},isLeftPressed(){return e.value.has(0)},isRightPressed(){return e.value.has(2)},isMiddlePressed(){return e.value.has(1)},clearFrameState(){p=0,i=0,r=0,l.value={x:0,y:0},c.value=0;},dispose(){u.removeEventListener("mousemove",w),u.removeEventListener("mousedown",L),u.removeEventListener("mouseup",y),u.removeEventListener("wheel",h),u.removeEventListener("mouseleave",b),u.removeEventListener("contextmenu",x),n!==window&&window.removeEventListener("mouseup",y);}}}var F={Left:0,Middle:1,Right:2};exports.Keys=k;exports.MouseButton=F;exports.createLoop=M;exports.keyboard=D;exports.mouse=K;//# sourceMappingURL=interactive.js.map
2
2
  //# sourceMappingURL=interactive.js.map
@@ -1,2 +1,2 @@
1
- import {k as k$1}from'./chunk-GFL4VRAO.mjs';function M(d={}){let{fixedFps:n=60,onUpdate:s,onFixedUpdate:v,onRender:l}=d,c=1/n,e=false,f,t=0,p=0,i=0,r=0,E=0,w=true;function L(y){if(!e)return;f=requestAnimationFrame(L);let h=y/1e3;if(w){t=h,w=false;return}let b=Math.min(h-t,.25);if(t=h,r++,E+=b,E>=1&&(i=r,r=0,E-=1),s&&s(b),v)for(p+=b;p>=c;)v(c),p-=c;if(l){let x=v?p/c:1;l(x);}}return {start(){e||(e=true,w=true,p=0,f=requestAnimationFrame(L));},stop(){e=false,f!==void 0&&(cancelAnimationFrame(f),f=void 0);},isRunning(){return e},getFps(){return i}}}function D(d=window){let n=k$1(new Set),s=new Set,v=new Set;function l(t){return t.toLowerCase()}function c(t){let i=l(t.code);if(!n.value.has(i)){s.add(i);let r=new Set(n.value);r.add(i),n.value=r;}}function e(t){let i=l(t.code);if(n.value.has(i)){v.add(i);let r=new Set(n.value);r.delete(i),n.value=r;}}function f(){n.value=new Set,s.clear(),v.clear();}return d.addEventListener("keydown",c),d.addEventListener("keyup",e),d===window&&d.addEventListener("blur",f),{isPressed(t){return n.value.has(l(t))},isJustPressed(t){return s.has(l(t))},isJustReleased(t){return v.has(l(t))},getPressedKeys(){return Array.from(n.value)},get keys(){return n},clearFrameState(){s.clear(),v.clear();},dispose(){d.removeEventListener("keydown",c),d.removeEventListener("keyup",e),d===window&&d.removeEventListener("blur",f);}}}var k={ArrowUp:"arrowup",ArrowDown:"arrowdown",ArrowLeft:"arrowleft",ArrowRight:"arrowright",KeyW:"keyw",KeyA:"keya",KeyS:"keys",KeyD:"keyd",Space:"space",Enter:"enter",Escape:"escape",ShiftLeft:"shiftleft",ShiftRight:"shiftright",ControlLeft:"controlleft",ControlRight:"controlright",AltLeft:"altleft",AltRight:"altright",Tab:"tab",Digit0:"digit0",Digit1:"digit1",Digit2:"digit2",Digit3:"digit3",Digit4:"digit4",Digit5:"digit5",Digit6:"digit6",Digit7:"digit7",Digit8:"digit8",Digit9:"digit9"};function K(d={}){let{target:n=window,canvas:s}=d,v=k$1({x:0,y:0}),l=k$1({x:0,y:0}),c=k$1(0),e=k$1(new Set),f=0,t=0,p=0,i=0,r=0;function E(o){if(s){let m=s.getBoundingClientRect(),a=s.width/m.width,S=s.height/m.height;return {x:(o.clientX-m.left)*a,y:(o.clientY-m.top)*S}}return {x:o.clientX,y:o.clientY}}function w(o){let a=E(o);p+=a.x-f,i+=a.y-t,f=a.x,t=a.y,v.value=a,l.value={x:p,y:i};}function L(o){let m=o,a=new Set(e.value);a.add(m.button),e.value=a;}function y(o){let m=o,a=new Set(e.value);a.delete(m.button),e.value=a;}function h(o){r+=Math.sign(o.deltaY),c.value=r;}function b(){e.value=new Set;}function x(o){}let u=s||n;return u.addEventListener("mousemove",w),u.addEventListener("mousedown",L),u.addEventListener("mouseup",y),u.addEventListener("wheel",h,{passive:true}),u.addEventListener("mouseleave",b),u.addEventListener("contextmenu",x),n!==window&&window.addEventListener("mouseup",y),{get position(){return v},get delta(){return l},get wheelDelta(){return c},isPressed(o){return e.value.has(o)},isLeftPressed(){return e.value.has(0)},isRightPressed(){return e.value.has(2)},isMiddlePressed(){return e.value.has(1)},clearFrameState(){p=0,i=0,r=0,l.value={x:0,y:0},c.value=0;},dispose(){u.removeEventListener("mousemove",w),u.removeEventListener("mousedown",L),u.removeEventListener("mouseup",y),u.removeEventListener("wheel",h),u.removeEventListener("mouseleave",b),u.removeEventListener("contextmenu",x),n!==window&&window.removeEventListener("mouseup",y);}}}var F={Left:0,Middle:1,Right:2};export{k as Keys,F as MouseButton,M as createLoop,D as keyboard,K as mouse};//# sourceMappingURL=interactive.mjs.map
1
+ import {j}from'./chunk-J4CK5NRW.mjs';function M(d={}){let{fixedFps:n=60,onUpdate:s,onFixedUpdate:v,onRender:l}=d,c=1/n,e=false,f,t=0,p=0,i=0,r=0,E=0,w=true;function L(y){if(!e)return;f=requestAnimationFrame(L);let h=y/1e3;if(w){t=h,w=false;return}let b=Math.min(h-t,.25);if(t=h,r++,E+=b,E>=1&&(i=r,r=0,E-=1),s&&s(b),v)for(p+=b;p>=c;)v(c),p-=c;if(l){let x=v?p/c:1;l(x);}}return {start(){e||(e=true,w=true,p=0,f=requestAnimationFrame(L));},stop(){e=false,f!==void 0&&(cancelAnimationFrame(f),f=void 0);},isRunning(){return e},getFps(){return i}}}function D(d=window){let n=j(new Set),s=new Set,v=new Set;function l(t){return t.toLowerCase()}function c(t){let i=l(t.code);if(!n.value.has(i)){s.add(i);let r=new Set(n.value);r.add(i),n.value=r;}}function e(t){let i=l(t.code);if(n.value.has(i)){v.add(i);let r=new Set(n.value);r.delete(i),n.value=r;}}function f(){n.value=new Set,s.clear(),v.clear();}return d.addEventListener("keydown",c),d.addEventListener("keyup",e),d===window&&d.addEventListener("blur",f),{isPressed(t){return n.value.has(l(t))},isJustPressed(t){return s.has(l(t))},isJustReleased(t){return v.has(l(t))},getPressedKeys(){return Array.from(n.value)},get keys(){return n},clearFrameState(){s.clear(),v.clear();},dispose(){d.removeEventListener("keydown",c),d.removeEventListener("keyup",e),d===window&&d.removeEventListener("blur",f);}}}var k={ArrowUp:"arrowup",ArrowDown:"arrowdown",ArrowLeft:"arrowleft",ArrowRight:"arrowright",KeyW:"keyw",KeyA:"keya",KeyS:"keys",KeyD:"keyd",Space:"space",Enter:"enter",Escape:"escape",ShiftLeft:"shiftleft",ShiftRight:"shiftright",ControlLeft:"controlleft",ControlRight:"controlright",AltLeft:"altleft",AltRight:"altright",Tab:"tab",Digit0:"digit0",Digit1:"digit1",Digit2:"digit2",Digit3:"digit3",Digit4:"digit4",Digit5:"digit5",Digit6:"digit6",Digit7:"digit7",Digit8:"digit8",Digit9:"digit9"};function K(d={}){let{target:n=window,canvas:s}=d,v=j({x:0,y:0}),l=j({x:0,y:0}),c=j(0),e=j(new Set),f=0,t=0,p=0,i=0,r=0;function E(o){if(s){let m=s.getBoundingClientRect(),a=s.width/m.width,S=s.height/m.height;return {x:(o.clientX-m.left)*a,y:(o.clientY-m.top)*S}}return {x:o.clientX,y:o.clientY}}function w(o){let a=E(o);p+=a.x-f,i+=a.y-t,f=a.x,t=a.y,v.value=a,l.value={x:p,y:i};}function L(o){let m=o,a=new Set(e.value);a.add(m.button),e.value=a;}function y(o){let m=o,a=new Set(e.value);a.delete(m.button),e.value=a;}function h(o){r+=Math.sign(o.deltaY),c.value=r;}function b(){e.value=new Set;}function x(o){}let u=s||n;return u.addEventListener("mousemove",w),u.addEventListener("mousedown",L),u.addEventListener("mouseup",y),u.addEventListener("wheel",h,{passive:true}),u.addEventListener("mouseleave",b),u.addEventListener("contextmenu",x),n!==window&&window.addEventListener("mouseup",y),{get position(){return v},get delta(){return l},get wheelDelta(){return c},isPressed(o){return e.value.has(o)},isLeftPressed(){return e.value.has(0)},isRightPressed(){return e.value.has(2)},isMiddlePressed(){return e.value.has(1)},clearFrameState(){p=0,i=0,r=0,l.value={x:0,y:0},c.value=0;},dispose(){u.removeEventListener("mousemove",w),u.removeEventListener("mousedown",L),u.removeEventListener("mouseup",y),u.removeEventListener("wheel",h),u.removeEventListener("mouseleave",b),u.removeEventListener("contextmenu",x),n!==window&&window.removeEventListener("mouseup",y);}}}var F={Left:0,Middle:1,Right:2};export{k as Keys,F as MouseButton,M as createLoop,D as keyboard,K as mouse};//# sourceMappingURL=interactive.mjs.map
2
2
  //# sourceMappingURL=interactive.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interactive/loop.ts","../src/interactive/keyboard.ts","../src/interactive/mouse.ts"],"names":["createLoop","options","fixedFps","onUpdate","onFixedUpdate","onRender","fixedDelta","running","rafId","lastTime","accumulator","fps","frameCount","fpsTime","isFirstFrame","loop","currentTime","time","delta","alpha","keyboard","target","keys","signal","justPressed","justReleased","normalizeKey","key","handleKeyDown","e","newKeys","handleKeyUp","handleBlur","Keys","mouse","canvas","position","wheelDelta","buttons","lastX","lastY","frameDeltaX","frameDeltaY","frameWheelDelta","getCanvasCoordinates","event","rect","scaleX","scaleY","handleMouseMove","coords","handleMouseDown","newButtons","handleMouseUp","handleWheel","handleMouseLeave","handleContextMenu","_e","eventTarget","button","MouseButton"],"mappings":"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","file":"interactive.mjs","sourcesContent":["/**\n * Loop - Core animation/game loop implementation with delta time and fixed timestep\n */\n\nexport interface LoopOptions {\n /** Target FPS for fixed update (default: 60) */\n fixedFps?: number\n /** Called every frame with delta time in seconds */\n onUpdate?: (delta: number) => void\n /** Called at fixed intervals (for physics) */\n onFixedUpdate?: (fixedDelta: number) => void\n /** Called every frame for rendering */\n onRender?: (alpha: number) => void\n}\n\nexport interface Loop {\n /** Start the loop */\n start(): void\n /** Stop the loop */\n stop(): void\n /** Check if loop is running */\n isRunning(): boolean\n /** Get current FPS */\n getFps(): number\n}\n\n/**\n * Create an animation loop with delta time and optional fixed timestep\n */\nexport function createLoop(options: LoopOptions = {}): Loop {\n const { fixedFps = 60, onUpdate, onFixedUpdate, onRender } = options\n\n const fixedDelta = 1 / fixedFps\n let running = false\n let rafId: number | undefined\n let lastTime = 0\n let accumulator = 0\n let fps = 0\n let frameCount = 0\n let fpsTime = 0\n let isFirstFrame = true\n\n function loop(currentTime: number): void {\n if (!running) return\n\n rafId = requestAnimationFrame(loop)\n\n // Convert to seconds\n const time = currentTime / 1000\n\n // Initialize lastTime on first frame and skip processing\n if (isFirstFrame) {\n lastTime = time\n isFirstFrame = false\n return\n }\n\n const delta = Math.min(time - lastTime, 0.25) // Cap at 250ms\n lastTime = time\n\n // FPS counter\n frameCount++\n fpsTime += delta\n if (fpsTime >= 1) {\n fps = frameCount\n frameCount = 0\n fpsTime -= 1\n }\n\n // Variable update\n if (onUpdate) {\n onUpdate(delta)\n }\n\n // Fixed update (for physics)\n if (onFixedUpdate) {\n accumulator += delta\n\n while (accumulator >= fixedDelta) {\n onFixedUpdate(fixedDelta)\n accumulator -= fixedDelta\n }\n }\n\n // Render with interpolation alpha\n if (onRender) {\n const alpha = onFixedUpdate ? accumulator / fixedDelta : 1\n onRender(alpha)\n }\n }\n\n return {\n start() {\n if (running) return\n running = true\n isFirstFrame = true\n accumulator = 0\n rafId = requestAnimationFrame(loop)\n },\n\n stop() {\n running = false\n if (rafId !== undefined) {\n cancelAnimationFrame(rafId)\n rafId = undefined\n }\n },\n\n isRunning() {\n return running\n },\n\n getFps() {\n return fps\n },\n }\n}\n","/**\n * keyboard - Reactive keyboard input handler\n *\n * Creates a keyboard input handler with reactive signals.\n * Philosophy: No hooks, just factory functions that return signal-based state.\n */\n\nimport { signal, type Signal } from '../core/signal'\n\nexport interface KeyboardState {\n /** Check if a key is currently pressed */\n isPressed(key: string): boolean\n /** Check if a key was just pressed this frame */\n isJustPressed(key: string): boolean\n /** Check if a key was just released this frame */\n isJustReleased(key: string): boolean\n /** Get all currently pressed keys */\n getPressedKeys(): string[]\n /** Signal that updates when any key state changes */\n readonly keys: Signal<Set<string>>\n /** Clear just pressed/released state (call at end of frame) */\n clearFrameState(): void\n /** Cleanup event listeners */\n dispose(): void\n}\n\n/**\n * Create a keyboard input handler with reactive state\n *\n * @example\n * ```tsx\n * const kb = keyboard()\n *\n * effect(() => {\n * if (kb.isPressed(Keys.ArrowUp)) {\n * player.y -= speed\n * }\n * })\n * ```\n */\nexport function keyboard(target: EventTarget = window): KeyboardState {\n const keys = signal<Set<string>>(new Set())\n const justPressed = new Set<string>()\n const justReleased = new Set<string>()\n\n function normalizeKey(key: string): string {\n return key.toLowerCase()\n }\n\n function handleKeyDown(e: Event): void {\n const event = e as KeyboardEvent\n const key = normalizeKey(event.code)\n\n if (!keys.value.has(key)) {\n justPressed.add(key)\n const newKeys = new Set(keys.value)\n newKeys.add(key)\n keys.value = newKeys\n }\n }\n\n function handleKeyUp(e: Event): void {\n const event = e as KeyboardEvent\n const key = normalizeKey(event.code)\n\n if (keys.value.has(key)) {\n justReleased.add(key)\n const newKeys = new Set(keys.value)\n newKeys.delete(key)\n keys.value = newKeys\n }\n }\n\n function handleBlur(): void {\n // Clear all keys when window loses focus\n keys.value = new Set()\n justPressed.clear()\n justReleased.clear()\n }\n\n // Add event listeners\n target.addEventListener('keydown', handleKeyDown)\n target.addEventListener('keyup', handleKeyUp)\n if (target === window) {\n target.addEventListener('blur', handleBlur)\n }\n\n return {\n isPressed(key: string): boolean {\n return keys.value.has(normalizeKey(key))\n },\n\n isJustPressed(key: string): boolean {\n return justPressed.has(normalizeKey(key))\n },\n\n isJustReleased(key: string): boolean {\n return justReleased.has(normalizeKey(key))\n },\n\n getPressedKeys(): string[] {\n return Array.from(keys.value)\n },\n\n get keys() {\n return keys\n },\n\n clearFrameState(): void {\n justPressed.clear()\n justReleased.clear()\n },\n\n dispose(): void {\n target.removeEventListener('keydown', handleKeyDown)\n target.removeEventListener('keyup', handleKeyUp)\n if (target === window) {\n target.removeEventListener('blur', handleBlur)\n }\n },\n }\n}\n\n/** Common key codes for convenience */\nexport const Keys = {\n // Arrow keys\n ArrowUp: 'arrowup',\n ArrowDown: 'arrowdown',\n ArrowLeft: 'arrowleft',\n ArrowRight: 'arrowright',\n\n // WASD\n KeyW: 'keyw',\n KeyA: 'keya',\n KeyS: 'keys',\n KeyD: 'keyd',\n\n // Common keys\n Space: 'space',\n Enter: 'enter',\n Escape: 'escape',\n ShiftLeft: 'shiftleft',\n ShiftRight: 'shiftright',\n ControlLeft: 'controlleft',\n ControlRight: 'controlright',\n AltLeft: 'altleft',\n AltRight: 'altright',\n Tab: 'tab',\n\n // Numbers\n Digit0: 'digit0',\n Digit1: 'digit1',\n Digit2: 'digit2',\n Digit3: 'digit3',\n Digit4: 'digit4',\n Digit5: 'digit5',\n Digit6: 'digit6',\n Digit7: 'digit7',\n Digit8: 'digit8',\n Digit9: 'digit9',\n} as const\n","/**\n * mouse - Reactive mouse input handler\n *\n * Creates a mouse input handler with reactive signals.\n * Philosophy: No hooks, just factory functions that return signal-based state.\n */\n\nimport { signal, type Signal } from '../core/signal'\n\nexport interface Vec2 {\n x: number\n y: number\n}\n\nexport interface MouseState {\n /** Current mouse position relative to target */\n readonly position: Signal<Vec2>\n /** Mouse position delta since last frame */\n readonly delta: Signal<Vec2>\n /** Check if a mouse button is pressed (0=left, 1=middle, 2=right) */\n isPressed(button: number): boolean\n /** Check if left mouse button is pressed */\n isLeftPressed(): boolean\n /** Check if right mouse button is pressed */\n isRightPressed(): boolean\n /** Check if middle mouse button is pressed */\n isMiddlePressed(): boolean\n /** Wheel delta (positive = scroll down) */\n readonly wheelDelta: Signal<number>\n /** Clear frame state (call at end of frame) */\n clearFrameState(): void\n /** Cleanup event listeners */\n dispose(): void\n}\n\nexport interface MouseOptions {\n /** Element to track mouse relative to (default: window) */\n target?: EventTarget\n /** Canvas element for coordinate calculation (if different from target) */\n canvas?: HTMLCanvasElement\n}\n\n/**\n * Create a mouse input handler with reactive state\n *\n * @example\n * ```tsx\n * const m = mouse()\n *\n * effect(() => {\n * console.log('Mouse at:', m.position.value)\n * if (m.isLeftPressed()) {\n * draw(m.position.value)\n * }\n * })\n * ```\n */\nexport function mouse(options: MouseOptions = {}): MouseState {\n const { target = window, canvas } = options\n\n const position = signal<Vec2>({ x: 0, y: 0 })\n const delta = signal<Vec2>({ x: 0, y: 0 })\n const wheelDelta = signal<number>(0)\n const buttons = signal<Set<number>>(new Set())\n\n let lastX = 0\n let lastY = 0\n let frameDeltaX = 0\n let frameDeltaY = 0\n let frameWheelDelta = 0\n\n function getCanvasCoordinates(event: MouseEvent): Vec2 {\n if (canvas) {\n const rect = canvas.getBoundingClientRect()\n const scaleX = canvas.width / rect.width\n const scaleY = canvas.height / rect.height\n return {\n x: (event.clientX - rect.left) * scaleX,\n y: (event.clientY - rect.top) * scaleY,\n }\n }\n return {\n x: event.clientX,\n y: event.clientY,\n }\n }\n\n function handleMouseMove(e: Event): void {\n const event = e as MouseEvent\n const coords = getCanvasCoordinates(event)\n\n frameDeltaX += coords.x - lastX\n frameDeltaY += coords.y - lastY\n lastX = coords.x\n lastY = coords.y\n\n position.value = coords\n delta.value = { x: frameDeltaX, y: frameDeltaY }\n }\n\n function handleMouseDown(e: Event): void {\n const event = e as MouseEvent\n const newButtons = new Set(buttons.value)\n newButtons.add(event.button)\n buttons.value = newButtons\n }\n\n function handleMouseUp(e: Event): void {\n const event = e as MouseEvent\n const newButtons = new Set(buttons.value)\n newButtons.delete(event.button)\n buttons.value = newButtons\n }\n\n function handleWheel(e: Event): void {\n const event = e as WheelEvent\n frameWheelDelta += Math.sign(event.deltaY)\n wheelDelta.value = frameWheelDelta\n }\n\n function handleMouseLeave(): void {\n buttons.value = new Set()\n }\n\n function handleContextMenu(_e: Event): void {\n // Prevent context menu in game contexts if needed\n // e.preventDefault()\n }\n\n // Add event listeners\n const eventTarget = canvas || target\n eventTarget.addEventListener('mousemove', handleMouseMove)\n eventTarget.addEventListener('mousedown', handleMouseDown)\n eventTarget.addEventListener('mouseup', handleMouseUp)\n eventTarget.addEventListener('wheel', handleWheel, { passive: true })\n eventTarget.addEventListener('mouseleave', handleMouseLeave)\n eventTarget.addEventListener('contextmenu', handleContextMenu)\n\n // Handle mouse up outside target\n if (target !== window) {\n window.addEventListener('mouseup', handleMouseUp)\n }\n\n return {\n get position() {\n return position\n },\n\n get delta() {\n return delta\n },\n\n get wheelDelta() {\n return wheelDelta\n },\n\n isPressed(button: number): boolean {\n return buttons.value.has(button)\n },\n\n isLeftPressed(): boolean {\n return buttons.value.has(0)\n },\n\n isRightPressed(): boolean {\n return buttons.value.has(2)\n },\n\n isMiddlePressed(): boolean {\n return buttons.value.has(1)\n },\n\n clearFrameState(): void {\n frameDeltaX = 0\n frameDeltaY = 0\n frameWheelDelta = 0\n delta.value = { x: 0, y: 0 }\n wheelDelta.value = 0\n },\n\n dispose(): void {\n eventTarget.removeEventListener('mousemove', handleMouseMove)\n eventTarget.removeEventListener('mousedown', handleMouseDown)\n eventTarget.removeEventListener('mouseup', handleMouseUp)\n eventTarget.removeEventListener('wheel', handleWheel)\n eventTarget.removeEventListener('mouseleave', handleMouseLeave)\n eventTarget.removeEventListener('contextmenu', handleContextMenu)\n\n if (target !== window) {\n window.removeEventListener('mouseup', handleMouseUp)\n }\n },\n }\n}\n\n/** Mouse button constants */\nexport const MouseButton = {\n Left: 0,\n Middle: 1,\n Right: 2,\n} as const\n"]}
1
+ {"version":3,"sources":["../src/interactive/loop.ts","../src/interactive/keyboard.ts","../src/interactive/mouse.ts"],"names":["createLoop","options","fixedFps","onUpdate","onFixedUpdate","onRender","fixedDelta","running","rafId","lastTime","accumulator","fps","frameCount","fpsTime","isFirstFrame","loop","currentTime","time","delta","alpha","keyboard","target","keys","signal","justPressed","justReleased","normalizeKey","key","handleKeyDown","e","newKeys","handleKeyUp","handleBlur","Keys","mouse","canvas","position","wheelDelta","buttons","lastX","lastY","frameDeltaX","frameDeltaY","frameWheelDelta","getCanvasCoordinates","event","rect","scaleX","scaleY","handleMouseMove","coords","handleMouseDown","newButtons","handleMouseUp","handleWheel","handleMouseLeave","handleContextMenu","_e","eventTarget","button","MouseButton"],"mappings":"qCA6BO,SAASA,CAAAA,CAAWC,EAAuB,EAAC,CAAS,CAC1D,GAAM,CAAE,SAAAC,CAAAA,CAAW,EAAA,CAAI,SAAAC,CAAAA,CAAU,aAAA,CAAAC,EAAe,QAAA,CAAAC,CAAS,EAAIJ,CAAAA,CAEvDK,CAAAA,CAAa,CAAA,CAAIJ,CAAAA,CACnBK,CAAAA,CAAU,KAAA,CACVC,EACAC,CAAAA,CAAW,CAAA,CACXC,EAAc,CAAA,CACdC,CAAAA,CAAM,EACNC,CAAAA,CAAa,CAAA,CACbC,EAAU,CAAA,CACVC,CAAAA,CAAe,KAEnB,SAASC,CAAAA,CAAKC,EAA2B,CACvC,GAAI,CAACT,CAAAA,CAAS,OAEdC,CAAAA,CAAQ,qBAAA,CAAsBO,CAAI,CAAA,CAGlC,IAAME,CAAAA,CAAOD,CAAAA,CAAc,IAG3B,GAAIF,CAAAA,CAAc,CAChBL,CAAAA,CAAWQ,CAAAA,CACXH,EAAe,KAAA,CACf,MACF,CAEA,IAAMI,CAAAA,CAAQ,KAAK,GAAA,CAAID,CAAAA,CAAOR,EAAU,GAAI,CAAA,CAkB5C,GAjBAA,CAAAA,CAAWQ,CAAAA,CAGXL,CAAAA,EAAAA,CACAC,GAAWK,CAAAA,CACPL,CAAAA,EAAW,IACbF,CAAAA,CAAMC,CAAAA,CACNA,EAAa,CAAA,CACbC,CAAAA,EAAW,CAAA,CAAA,CAITV,CAAAA,EACFA,CAAAA,CAASe,CAAK,EAIZd,CAAAA,CAGF,IAFAM,GAAeQ,CAAAA,CAERR,CAAAA,EAAeJ,GACpBF,CAAAA,CAAcE,CAAU,CAAA,CACxBI,CAAAA,EAAeJ,CAAAA,CAKnB,GAAID,EAAU,CACZ,IAAMc,EAAQf,CAAAA,CAAgBM,CAAAA,CAAcJ,EAAa,CAAA,CACzDD,CAAAA,CAASc,CAAK,EAChB,CACF,CAEA,OAAO,CACL,OAAQ,CACFZ,CAAAA,GACJA,EAAU,IAAA,CACVO,CAAAA,CAAe,IAAA,CACfJ,CAAAA,CAAc,CAAA,CACdF,CAAAA,CAAQ,sBAAsBO,CAAI,CAAA,EACpC,EAEA,IAAA,EAAO,CACLR,EAAU,KAAA,CACNC,CAAAA,GAAU,SACZ,oBAAA,CAAqBA,CAAK,EAC1BA,CAAAA,CAAQ,MAAA,EAEZ,EAEA,SAAA,EAAY,CACV,OAAOD,CACT,CAAA,CAEA,MAAA,EAAS,CACP,OAAOI,CACT,CACF,CACF,CC5EO,SAASS,CAAAA,CAASC,CAAAA,CAAsB,OAAuB,CACpE,IAAMC,EAAOC,CAAAA,CAAoB,IAAI,GAAK,CAAA,CACpCC,CAAAA,CAAc,IAAI,GAAA,CAClBC,CAAAA,CAAe,IAAI,GAAA,CAEzB,SAASC,CAAAA,CAAaC,CAAAA,CAAqB,CACzC,OAAOA,EAAI,WAAA,EACb,CAEA,SAASC,CAAAA,CAAcC,EAAgB,CAErC,IAAMF,CAAAA,CAAMD,CAAAA,CADEG,CAAAA,CACiB,IAAI,EAEnC,GAAI,CAACP,EAAK,KAAA,CAAM,GAAA,CAAIK,CAAG,CAAA,CAAG,CACxBH,CAAAA,CAAY,GAAA,CAAIG,CAAG,CAAA,CACnB,IAAMG,CAAAA,CAAU,IAAI,IAAIR,CAAAA,CAAK,KAAK,EAClCQ,CAAAA,CAAQ,GAAA,CAAIH,CAAG,CAAA,CACfL,CAAAA,CAAK,MAAQQ,EACf,CACF,CAEA,SAASC,CAAAA,CAAYF,EAAgB,CAEnC,IAAMF,CAAAA,CAAMD,CAAAA,CADEG,CAAAA,CACiB,IAAI,EAEnC,GAAIP,CAAAA,CAAK,MAAM,GAAA,CAAIK,CAAG,EAAG,CACvBF,CAAAA,CAAa,IAAIE,CAAG,CAAA,CACpB,IAAMG,CAAAA,CAAU,IAAI,IAAIR,CAAAA,CAAK,KAAK,EAClCQ,CAAAA,CAAQ,MAAA,CAAOH,CAAG,CAAA,CAClBL,CAAAA,CAAK,KAAA,CAAQQ,EACf,CACF,CAEA,SAASE,CAAAA,EAAmB,CAE1BV,EAAK,KAAA,CAAQ,IAAI,IACjBE,CAAAA,CAAY,KAAA,GACZC,CAAAA,CAAa,KAAA,GACf,CAGA,OAAAJ,EAAO,gBAAA,CAAiB,SAAA,CAAWO,CAAa,CAAA,CAChDP,CAAAA,CAAO,gBAAA,CAAiB,QAASU,CAAW,CAAA,CACxCV,IAAW,MAAA,EACbA,CAAAA,CAAO,iBAAiB,MAAA,CAAQW,CAAU,CAAA,CAGrC,CACL,SAAA,CAAUL,CAAAA,CAAsB,CAC9B,OAAOL,CAAAA,CAAK,MAAM,GAAA,CAAII,CAAAA,CAAaC,CAAG,CAAC,CACzC,CAAA,CAEA,aAAA,CAAcA,CAAAA,CAAsB,CAClC,OAAOH,CAAAA,CAAY,GAAA,CAAIE,EAAaC,CAAG,CAAC,CAC1C,CAAA,CAEA,cAAA,CAAeA,EAAsB,CACnC,OAAOF,EAAa,GAAA,CAAIC,CAAAA,CAAaC,CAAG,CAAC,CAC3C,EAEA,cAAA,EAA2B,CACzB,OAAO,KAAA,CAAM,IAAA,CAAKL,CAAAA,CAAK,KAAK,CAC9B,CAAA,CAEA,IAAI,IAAA,EAAO,CACT,OAAOA,CACT,CAAA,CAEA,iBAAwB,CACtBE,CAAAA,CAAY,OAAM,CAClBC,CAAAA,CAAa,QACf,CAAA,CAEA,SAAgB,CACdJ,CAAAA,CAAO,mBAAA,CAAoB,SAAA,CAAWO,CAAa,CAAA,CACnDP,EAAO,mBAAA,CAAoB,OAAA,CAASU,CAAW,CAAA,CAC3CV,CAAAA,GAAW,QACbA,CAAAA,CAAO,mBAAA,CAAoB,OAAQW,CAAU,EAEjD,CACF,CACF,KAGaC,CAAAA,CAAO,CAElB,QAAS,SAAA,CACT,SAAA,CAAW,WAAA,CACX,SAAA,CAAW,WAAA,CACX,UAAA,CAAY,aAGZ,IAAA,CAAM,MAAA,CACN,KAAM,MAAA,CACN,IAAA,CAAM,OACN,IAAA,CAAM,MAAA,CAGN,KAAA,CAAO,OAAA,CACP,KAAA,CAAO,OAAA,CACP,OAAQ,QAAA,CACR,SAAA,CAAW,YACX,UAAA,CAAY,YAAA,CACZ,YAAa,aAAA,CACb,YAAA,CAAc,cAAA,CACd,OAAA,CAAS,SAAA,CACT,QAAA,CAAU,WACV,GAAA,CAAK,KAAA,CAGL,OAAQ,QAAA,CACR,MAAA,CAAQ,SACR,MAAA,CAAQ,QAAA,CACR,OAAQ,QAAA,CACR,MAAA,CAAQ,SACR,MAAA,CAAQ,QAAA,CACR,OAAQ,QAAA,CACR,MAAA,CAAQ,SACR,MAAA,CAAQ,QAAA,CACR,MAAA,CAAQ,QACV,ECvGO,SAASC,EAAMjC,CAAAA,CAAwB,GAAgB,CAC5D,GAAM,CAAE,MAAA,CAAAoB,CAAAA,CAAS,OAAQ,MAAA,CAAAc,CAAO,EAAIlC,CAAAA,CAE9BmC,CAAAA,CAAWb,EAAa,CAAE,CAAA,CAAG,EAAG,CAAA,CAAG,CAAE,CAAC,CAAA,CACtCL,CAAAA,CAAQK,CAAAA,CAAa,CAAE,CAAA,CAAG,CAAA,CAAG,EAAG,CAAE,CAAC,EACnCc,CAAAA,CAAad,CAAAA,CAAe,CAAC,CAAA,CAC7Be,CAAAA,CAAUf,EAAoB,IAAI,GAAK,EAEzCgB,CAAAA,CAAQ,CAAA,CACRC,EAAQ,CAAA,CACRC,CAAAA,CAAc,CAAA,CACdC,CAAAA,CAAc,CAAA,CACdC,CAAAA,CAAkB,EAEtB,SAASC,CAAAA,CAAqBC,EAAyB,CACrD,GAAIV,EAAQ,CACV,IAAMW,CAAAA,CAAOX,CAAAA,CAAO,qBAAA,EAAsB,CACpCY,EAASZ,CAAAA,CAAO,KAAA,CAAQW,EAAK,KAAA,CAC7BE,CAAAA,CAASb,EAAO,MAAA,CAASW,CAAAA,CAAK,MAAA,CACpC,OAAO,CACL,CAAA,CAAA,CAAID,EAAM,OAAA,CAAUC,CAAAA,CAAK,MAAQC,CAAAA,CACjC,CAAA,CAAA,CAAIF,EAAM,OAAA,CAAUC,CAAAA,CAAK,KAAOE,CAClC,CACF,CACA,OAAO,CACL,EAAGH,CAAAA,CAAM,OAAA,CACT,EAAGA,CAAAA,CAAM,OACX,CACF,CAEA,SAASI,CAAAA,CAAgBpB,EAAgB,CAEvC,IAAMqB,EAASN,CAAAA,CADDf,CAC2B,EAEzCY,CAAAA,EAAeS,CAAAA,CAAO,EAAIX,CAAAA,CAC1BG,CAAAA,EAAeQ,EAAO,CAAA,CAAIV,CAAAA,CAC1BD,EAAQW,CAAAA,CAAO,CAAA,CACfV,EAAQU,CAAAA,CAAO,CAAA,CAEfd,CAAAA,CAAS,KAAA,CAAQc,CAAAA,CACjBhC,CAAAA,CAAM,MAAQ,CAAE,CAAA,CAAGuB,EAAa,CAAA,CAAGC,CAAY,EACjD,CAEA,SAASS,EAAgBtB,CAAAA,CAAgB,CACvC,IAAMgB,CAAAA,CAAQhB,CAAAA,CACRuB,EAAa,IAAI,GAAA,CAAId,EAAQ,KAAK,CAAA,CACxCc,CAAAA,CAAW,GAAA,CAAIP,CAAAA,CAAM,MAAM,EAC3BP,CAAAA,CAAQ,KAAA,CAAQc,EAClB,CAEA,SAASC,EAAcxB,CAAAA,CAAgB,CACrC,IAAMgB,CAAAA,CAAQhB,CAAAA,CACRuB,CAAAA,CAAa,IAAI,GAAA,CAAId,CAAAA,CAAQ,KAAK,CAAA,CACxCc,CAAAA,CAAW,OAAOP,CAAAA,CAAM,MAAM,CAAA,CAC9BP,CAAAA,CAAQ,KAAA,CAAQc,EAClB,CAEA,SAASE,CAAAA,CAAYzB,EAAgB,CAEnCc,CAAAA,EAAmB,KAAK,IAAA,CADVd,CAAAA,CACqB,MAAM,CAAA,CACzCQ,CAAAA,CAAW,MAAQM,EACrB,CAEA,SAASY,CAAAA,EAAyB,CAChCjB,EAAQ,KAAA,CAAQ,IAAI,IACtB,CAEA,SAASkB,CAAAA,CAAkBC,EAAiB,CAG5C,CAGA,IAAMC,CAAAA,CAAcvB,CAAAA,EAAUd,EAC9B,OAAAqC,CAAAA,CAAY,iBAAiB,WAAA,CAAaT,CAAe,EACzDS,CAAAA,CAAY,gBAAA,CAAiB,YAAaP,CAAe,CAAA,CACzDO,EAAY,gBAAA,CAAiB,SAAA,CAAWL,CAAa,CAAA,CACrDK,CAAAA,CAAY,gBAAA,CAAiB,QAASJ,CAAAA,CAAa,CAAE,QAAS,IAAK,CAAC,EACpEI,CAAAA,CAAY,gBAAA,CAAiB,aAAcH,CAAgB,CAAA,CAC3DG,EAAY,gBAAA,CAAiB,aAAA,CAAeF,CAAiB,CAAA,CAGzDnC,CAAAA,GAAW,QACb,MAAA,CAAO,gBAAA,CAAiB,SAAA,CAAWgC,CAAa,CAAA,CAG3C,CACL,IAAI,QAAA,EAAW,CACb,OAAOjB,CACT,CAAA,CAEA,IAAI,KAAA,EAAQ,CACV,OAAOlB,CACT,CAAA,CAEA,IAAI,YAAa,CACf,OAAOmB,CACT,CAAA,CAEA,SAAA,CAAUsB,EAAyB,CACjC,OAAOrB,CAAAA,CAAQ,KAAA,CAAM,GAAA,CAAIqB,CAAM,CACjC,CAAA,CAEA,aAAA,EAAyB,CACvB,OAAOrB,CAAAA,CAAQ,MAAM,GAAA,CAAI,CAAC,CAC5B,CAAA,CAEA,cAAA,EAA0B,CACxB,OAAOA,CAAAA,CAAQ,MAAM,GAAA,CAAI,CAAC,CAC5B,CAAA,CAEA,eAAA,EAA2B,CACzB,OAAOA,CAAAA,CAAQ,KAAA,CAAM,IAAI,CAAC,CAC5B,EAEA,eAAA,EAAwB,CACtBG,EAAc,CAAA,CACdC,CAAAA,CAAc,EACdC,CAAAA,CAAkB,CAAA,CAClBzB,EAAM,KAAA,CAAQ,CAAE,EAAG,CAAA,CAAG,CAAA,CAAG,CAAE,CAAA,CAC3BmB,CAAAA,CAAW,KAAA,CAAQ,EACrB,CAAA,CAEA,OAAA,EAAgB,CACdqB,CAAAA,CAAY,mBAAA,CAAoB,YAAaT,CAAe,CAAA,CAC5DS,EAAY,mBAAA,CAAoB,WAAA,CAAaP,CAAe,CAAA,CAC5DO,CAAAA,CAAY,oBAAoB,SAAA,CAAWL,CAAa,EACxDK,CAAAA,CAAY,mBAAA,CAAoB,QAASJ,CAAW,CAAA,CACpDI,CAAAA,CAAY,mBAAA,CAAoB,YAAA,CAAcH,CAAgB,EAC9DG,CAAAA,CAAY,mBAAA,CAAoB,cAAeF,CAAiB,CAAA,CAE5DnC,IAAW,MAAA,EACb,MAAA,CAAO,mBAAA,CAAoB,SAAA,CAAWgC,CAAa,EAEvD,CACF,CACF,KAGaO,CAAAA,CAAc,CACzB,KAAM,CAAA,CACN,MAAA,CAAQ,CAAA,CACR,KAAA,CAAO,CACT","file":"interactive.mjs","sourcesContent":["/**\n * Loop - Core animation/game loop implementation with delta time and fixed timestep\n */\n\nexport interface LoopOptions {\n /** Target FPS for fixed update (default: 60) */\n fixedFps?: number\n /** Called every frame with delta time in seconds */\n onUpdate?: (delta: number) => void\n /** Called at fixed intervals (for physics) */\n onFixedUpdate?: (fixedDelta: number) => void\n /** Called every frame for rendering */\n onRender?: (alpha: number) => void\n}\n\nexport interface Loop {\n /** Start the loop */\n start(): void\n /** Stop the loop */\n stop(): void\n /** Check if loop is running */\n isRunning(): boolean\n /** Get current FPS */\n getFps(): number\n}\n\n/**\n * Create an animation loop with delta time and optional fixed timestep\n */\nexport function createLoop(options: LoopOptions = {}): Loop {\n const { fixedFps = 60, onUpdate, onFixedUpdate, onRender } = options\n\n const fixedDelta = 1 / fixedFps\n let running = false\n let rafId: number | undefined\n let lastTime = 0\n let accumulator = 0\n let fps = 0\n let frameCount = 0\n let fpsTime = 0\n let isFirstFrame = true\n\n function loop(currentTime: number): void {\n if (!running) return\n\n rafId = requestAnimationFrame(loop)\n\n // Convert to seconds\n const time = currentTime / 1000\n\n // Initialize lastTime on first frame and skip processing\n if (isFirstFrame) {\n lastTime = time\n isFirstFrame = false\n return\n }\n\n const delta = Math.min(time - lastTime, 0.25) // Cap at 250ms\n lastTime = time\n\n // FPS counter\n frameCount++\n fpsTime += delta\n if (fpsTime >= 1) {\n fps = frameCount\n frameCount = 0\n fpsTime -= 1\n }\n\n // Variable update\n if (onUpdate) {\n onUpdate(delta)\n }\n\n // Fixed update (for physics)\n if (onFixedUpdate) {\n accumulator += delta\n\n while (accumulator >= fixedDelta) {\n onFixedUpdate(fixedDelta)\n accumulator -= fixedDelta\n }\n }\n\n // Render with interpolation alpha\n if (onRender) {\n const alpha = onFixedUpdate ? accumulator / fixedDelta : 1\n onRender(alpha)\n }\n }\n\n return {\n start() {\n if (running) return\n running = true\n isFirstFrame = true\n accumulator = 0\n rafId = requestAnimationFrame(loop)\n },\n\n stop() {\n running = false\n if (rafId !== undefined) {\n cancelAnimationFrame(rafId)\n rafId = undefined\n }\n },\n\n isRunning() {\n return running\n },\n\n getFps() {\n return fps\n },\n }\n}\n","/**\n * keyboard - Reactive keyboard input handler\n *\n * Creates a keyboard input handler with reactive signals.\n * Philosophy: No hooks, just factory functions that return signal-based state.\n */\n\nimport { signal, type Signal } from '../core/signal'\n\nexport interface KeyboardState {\n /** Check if a key is currently pressed */\n isPressed(key: string): boolean\n /** Check if a key was just pressed this frame */\n isJustPressed(key: string): boolean\n /** Check if a key was just released this frame */\n isJustReleased(key: string): boolean\n /** Get all currently pressed keys */\n getPressedKeys(): string[]\n /** Signal that updates when any key state changes */\n readonly keys: Signal<Set<string>>\n /** Clear just pressed/released state (call at end of frame) */\n clearFrameState(): void\n /** Cleanup event listeners */\n dispose(): void\n}\n\n/**\n * Create a keyboard input handler with reactive state\n *\n * @example\n * ```tsx\n * const kb = keyboard()\n *\n * effect(() => {\n * if (kb.isPressed(Keys.ArrowUp)) {\n * player.y -= speed\n * }\n * })\n * ```\n */\nexport function keyboard(target: EventTarget = window): KeyboardState {\n const keys = signal<Set<string>>(new Set())\n const justPressed = new Set<string>()\n const justReleased = new Set<string>()\n\n function normalizeKey(key: string): string {\n return key.toLowerCase()\n }\n\n function handleKeyDown(e: Event): void {\n const event = e as KeyboardEvent\n const key = normalizeKey(event.code)\n\n if (!keys.value.has(key)) {\n justPressed.add(key)\n const newKeys = new Set(keys.value)\n newKeys.add(key)\n keys.value = newKeys\n }\n }\n\n function handleKeyUp(e: Event): void {\n const event = e as KeyboardEvent\n const key = normalizeKey(event.code)\n\n if (keys.value.has(key)) {\n justReleased.add(key)\n const newKeys = new Set(keys.value)\n newKeys.delete(key)\n keys.value = newKeys\n }\n }\n\n function handleBlur(): void {\n // Clear all keys when window loses focus\n keys.value = new Set()\n justPressed.clear()\n justReleased.clear()\n }\n\n // Add event listeners\n target.addEventListener('keydown', handleKeyDown)\n target.addEventListener('keyup', handleKeyUp)\n if (target === window) {\n target.addEventListener('blur', handleBlur)\n }\n\n return {\n isPressed(key: string): boolean {\n return keys.value.has(normalizeKey(key))\n },\n\n isJustPressed(key: string): boolean {\n return justPressed.has(normalizeKey(key))\n },\n\n isJustReleased(key: string): boolean {\n return justReleased.has(normalizeKey(key))\n },\n\n getPressedKeys(): string[] {\n return Array.from(keys.value)\n },\n\n get keys() {\n return keys\n },\n\n clearFrameState(): void {\n justPressed.clear()\n justReleased.clear()\n },\n\n dispose(): void {\n target.removeEventListener('keydown', handleKeyDown)\n target.removeEventListener('keyup', handleKeyUp)\n if (target === window) {\n target.removeEventListener('blur', handleBlur)\n }\n },\n }\n}\n\n/** Common key codes for convenience */\nexport const Keys = {\n // Arrow keys\n ArrowUp: 'arrowup',\n ArrowDown: 'arrowdown',\n ArrowLeft: 'arrowleft',\n ArrowRight: 'arrowright',\n\n // WASD\n KeyW: 'keyw',\n KeyA: 'keya',\n KeyS: 'keys',\n KeyD: 'keyd',\n\n // Common keys\n Space: 'space',\n Enter: 'enter',\n Escape: 'escape',\n ShiftLeft: 'shiftleft',\n ShiftRight: 'shiftright',\n ControlLeft: 'controlleft',\n ControlRight: 'controlright',\n AltLeft: 'altleft',\n AltRight: 'altright',\n Tab: 'tab',\n\n // Numbers\n Digit0: 'digit0',\n Digit1: 'digit1',\n Digit2: 'digit2',\n Digit3: 'digit3',\n Digit4: 'digit4',\n Digit5: 'digit5',\n Digit6: 'digit6',\n Digit7: 'digit7',\n Digit8: 'digit8',\n Digit9: 'digit9',\n} as const\n","/**\n * mouse - Reactive mouse input handler\n *\n * Creates a mouse input handler with reactive signals.\n * Philosophy: No hooks, just factory functions that return signal-based state.\n */\n\nimport { signal, type Signal } from '../core/signal'\n\nexport interface Vec2 {\n x: number\n y: number\n}\n\nexport interface MouseState {\n /** Current mouse position relative to target */\n readonly position: Signal<Vec2>\n /** Mouse position delta since last frame */\n readonly delta: Signal<Vec2>\n /** Check if a mouse button is pressed (0=left, 1=middle, 2=right) */\n isPressed(button: number): boolean\n /** Check if left mouse button is pressed */\n isLeftPressed(): boolean\n /** Check if right mouse button is pressed */\n isRightPressed(): boolean\n /** Check if middle mouse button is pressed */\n isMiddlePressed(): boolean\n /** Wheel delta (positive = scroll down) */\n readonly wheelDelta: Signal<number>\n /** Clear frame state (call at end of frame) */\n clearFrameState(): void\n /** Cleanup event listeners */\n dispose(): void\n}\n\nexport interface MouseOptions {\n /** Element to track mouse relative to (default: window) */\n target?: EventTarget\n /** Canvas element for coordinate calculation (if different from target) */\n canvas?: HTMLCanvasElement\n}\n\n/**\n * Create a mouse input handler with reactive state\n *\n * @example\n * ```tsx\n * const m = mouse()\n *\n * effect(() => {\n * console.log('Mouse at:', m.position.value)\n * if (m.isLeftPressed()) {\n * draw(m.position.value)\n * }\n * })\n * ```\n */\nexport function mouse(options: MouseOptions = {}): MouseState {\n const { target = window, canvas } = options\n\n const position = signal<Vec2>({ x: 0, y: 0 })\n const delta = signal<Vec2>({ x: 0, y: 0 })\n const wheelDelta = signal<number>(0)\n const buttons = signal<Set<number>>(new Set())\n\n let lastX = 0\n let lastY = 0\n let frameDeltaX = 0\n let frameDeltaY = 0\n let frameWheelDelta = 0\n\n function getCanvasCoordinates(event: MouseEvent): Vec2 {\n if (canvas) {\n const rect = canvas.getBoundingClientRect()\n const scaleX = canvas.width / rect.width\n const scaleY = canvas.height / rect.height\n return {\n x: (event.clientX - rect.left) * scaleX,\n y: (event.clientY - rect.top) * scaleY,\n }\n }\n return {\n x: event.clientX,\n y: event.clientY,\n }\n }\n\n function handleMouseMove(e: Event): void {\n const event = e as MouseEvent\n const coords = getCanvasCoordinates(event)\n\n frameDeltaX += coords.x - lastX\n frameDeltaY += coords.y - lastY\n lastX = coords.x\n lastY = coords.y\n\n position.value = coords\n delta.value = { x: frameDeltaX, y: frameDeltaY }\n }\n\n function handleMouseDown(e: Event): void {\n const event = e as MouseEvent\n const newButtons = new Set(buttons.value)\n newButtons.add(event.button)\n buttons.value = newButtons\n }\n\n function handleMouseUp(e: Event): void {\n const event = e as MouseEvent\n const newButtons = new Set(buttons.value)\n newButtons.delete(event.button)\n buttons.value = newButtons\n }\n\n function handleWheel(e: Event): void {\n const event = e as WheelEvent\n frameWheelDelta += Math.sign(event.deltaY)\n wheelDelta.value = frameWheelDelta\n }\n\n function handleMouseLeave(): void {\n buttons.value = new Set()\n }\n\n function handleContextMenu(_e: Event): void {\n // Prevent context menu in game contexts if needed\n // e.preventDefault()\n }\n\n // Add event listeners\n const eventTarget = canvas || target\n eventTarget.addEventListener('mousemove', handleMouseMove)\n eventTarget.addEventListener('mousedown', handleMouseDown)\n eventTarget.addEventListener('mouseup', handleMouseUp)\n eventTarget.addEventListener('wheel', handleWheel, { passive: true })\n eventTarget.addEventListener('mouseleave', handleMouseLeave)\n eventTarget.addEventListener('contextmenu', handleContextMenu)\n\n // Handle mouse up outside target\n if (target !== window) {\n window.addEventListener('mouseup', handleMouseUp)\n }\n\n return {\n get position() {\n return position\n },\n\n get delta() {\n return delta\n },\n\n get wheelDelta() {\n return wheelDelta\n },\n\n isPressed(button: number): boolean {\n return buttons.value.has(button)\n },\n\n isLeftPressed(): boolean {\n return buttons.value.has(0)\n },\n\n isRightPressed(): boolean {\n return buttons.value.has(2)\n },\n\n isMiddlePressed(): boolean {\n return buttons.value.has(1)\n },\n\n clearFrameState(): void {\n frameDeltaX = 0\n frameDeltaY = 0\n frameWheelDelta = 0\n delta.value = { x: 0, y: 0 }\n wheelDelta.value = 0\n },\n\n dispose(): void {\n eventTarget.removeEventListener('mousemove', handleMouseMove)\n eventTarget.removeEventListener('mousedown', handleMouseDown)\n eventTarget.removeEventListener('mouseup', handleMouseUp)\n eventTarget.removeEventListener('wheel', handleWheel)\n eventTarget.removeEventListener('mouseleave', handleMouseLeave)\n eventTarget.removeEventListener('contextmenu', handleContextMenu)\n\n if (target !== window) {\n window.removeEventListener('mouseup', handleMouseUp)\n }\n },\n }\n}\n\n/** Mouse button constants */\nexport const MouseButton = {\n Left: 0,\n Middle: 1,\n Right: 2,\n} as const\n"]}