flexium 0.8.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +219 -0
- package/dist/DrawText-CeXBL8Ev.d.ts +309 -0
- package/dist/DrawText-JB58mpQT.d.cts +309 -0
- package/dist/Motion-BrOAJzgH.d.cts +87 -0
- package/dist/Motion-BrOAJzgH.d.ts +87 -0
- package/dist/advanced.d.cts +30 -0
- package/dist/advanced.d.ts +30 -0
- package/dist/advanced.js +2 -0
- package/dist/advanced.js.map +1 -0
- package/dist/advanced.mjs +2 -0
- package/dist/advanced.mjs.map +1 -0
- package/dist/canvas.d.cts +22 -0
- package/dist/canvas.d.ts +22 -0
- package/dist/canvas.js +2 -0
- package/dist/canvas.js.map +1 -0
- package/dist/canvas.mjs +2 -0
- package/dist/canvas.mjs.map +1 -0
- package/dist/chunk-2MVKTSFR.mjs +3 -0
- package/dist/chunk-2MVKTSFR.mjs.map +1 -0
- package/dist/chunk-2U4DW375.mjs +2 -0
- package/dist/chunk-2U4DW375.mjs.map +1 -0
- package/dist/chunk-3P6DMEGB.js +2 -0
- package/dist/chunk-3P6DMEGB.js.map +1 -0
- package/dist/chunk-5S3ZQ2LB.mjs +3 -0
- package/dist/chunk-5S3ZQ2LB.mjs.map +1 -0
- package/dist/chunk-CNY6FPKJ.js +2 -0
- package/dist/chunk-CNY6FPKJ.js.map +1 -0
- package/dist/chunk-CZYIK6FD.mjs +2 -0
- package/dist/chunk-CZYIK6FD.mjs.map +1 -0
- package/dist/chunk-DOGIWSDA.js +2 -0
- package/dist/chunk-DOGIWSDA.js.map +1 -0
- package/dist/chunk-EX2GURH5.mjs +3 -0
- package/dist/chunk-EX2GURH5.mjs.map +1 -0
- package/dist/chunk-GDBJ322I.js +2 -0
- package/dist/chunk-GDBJ322I.js.map +1 -0
- package/dist/chunk-I7UCVARB.js +2 -0
- package/dist/chunk-I7UCVARB.js.map +1 -0
- package/dist/chunk-KNF5ERPK.mjs +2 -0
- package/dist/chunk-KNF5ERPK.mjs.map +1 -0
- package/dist/chunk-MLZTCKTH.mjs +2 -0
- package/dist/chunk-MLZTCKTH.mjs.map +1 -0
- package/dist/chunk-OPAQ4R4M.mjs +2 -0
- package/dist/chunk-OPAQ4R4M.mjs.map +1 -0
- package/dist/chunk-Q7IWDVJ4.js +2 -0
- package/dist/chunk-Q7IWDVJ4.js.map +1 -0
- package/dist/chunk-R5CS7UZG.mjs +2 -0
- package/dist/chunk-R5CS7UZG.mjs.map +1 -0
- package/dist/chunk-REETNY2Z.js +3 -0
- package/dist/chunk-REETNY2Z.js.map +1 -0
- package/dist/chunk-ROYFUJN5.js +3 -0
- package/dist/chunk-ROYFUJN5.js.map +1 -0
- package/dist/chunk-U6C6VDVZ.js +2 -0
- package/dist/chunk-U6C6VDVZ.js.map +1 -0
- package/dist/chunk-V4K6WOXN.js +3 -0
- package/dist/chunk-V4K6WOXN.js.map +1 -0
- package/dist/chunk-WQFQO5LK.js +2 -0
- package/dist/chunk-WQFQO5LK.js.map +1 -0
- package/dist/chunk-WVEJT7HD.mjs +2 -0
- package/dist/chunk-WVEJT7HD.mjs.map +1 -0
- package/dist/chunk-ZNPYN2TZ.mjs +2 -0
- package/dist/chunk-ZNPYN2TZ.mjs.map +1 -0
- package/dist/core.d.cts +24 -0
- package/dist/core.d.ts +24 -0
- package/dist/core.js +2 -0
- package/dist/core.js.map +1 -0
- package/dist/core.mjs +2 -0
- package/dist/core.mjs.map +1 -0
- package/dist/dom.d.cts +36 -0
- package/dist/dom.d.ts +36 -0
- package/dist/dom.js +2 -0
- package/dist/dom.js.map +1 -0
- package/dist/dom.mjs +2 -0
- package/dist/dom.mjs.map +1 -0
- package/dist/index.d.cts +26 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/dist/interactive.d.cts +161 -0
- package/dist/interactive.d.ts +161 -0
- package/dist/interactive.js +2 -0
- package/dist/interactive.js.map +1 -0
- package/dist/interactive.mjs +2 -0
- package/dist/interactive.mjs.map +1 -0
- package/dist/jsx-dev-runtime.d.cts +2 -0
- package/dist/jsx-dev-runtime.d.ts +2 -0
- package/dist/jsx-dev-runtime.js +2 -0
- package/dist/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx-dev-runtime.mjs +2 -0
- package/dist/jsx-dev-runtime.mjs.map +1 -0
- package/dist/jsx-runtime.d.cts +78 -0
- package/dist/jsx-runtime.d.ts +78 -0
- package/dist/jsx-runtime.js +2 -0
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/jsx-runtime.mjs +2 -0
- package/dist/jsx-runtime.mjs.map +1 -0
- package/dist/metafile-cjs.json +1 -0
- package/dist/metafile-esm.json +1 -0
- package/dist/portal-BpcIlK9y.d.cts +206 -0
- package/dist/portal-DBwz7gD0.d.ts +206 -0
- package/dist/primitives/layout.d.cts +295 -0
- package/dist/primitives/layout.d.ts +295 -0
- package/dist/primitives/layout.js +2 -0
- package/dist/primitives/layout.js.map +1 -0
- package/dist/primitives/layout.mjs +2 -0
- package/dist/primitives/layout.mjs.map +1 -0
- package/dist/primitives/motion.d.cts +230 -0
- package/dist/primitives/motion.d.ts +230 -0
- package/dist/primitives/motion.js +2 -0
- package/dist/primitives/motion.js.map +1 -0
- package/dist/primitives/motion.mjs +2 -0
- package/dist/primitives/motion.mjs.map +1 -0
- package/dist/primitives/ui.d.cts +81 -0
- package/dist/primitives/ui.d.ts +81 -0
- package/dist/primitives/ui.js +2 -0
- package/dist/primitives/ui.js.map +1 -0
- package/dist/primitives/ui.mjs +2 -0
- package/dist/primitives/ui.mjs.map +1 -0
- package/dist/primitives.d.cts +92 -0
- package/dist/primitives.d.ts +92 -0
- package/dist/primitives.js +2 -0
- package/dist/primitives.js.map +1 -0
- package/dist/primitives.mjs +2 -0
- package/dist/primitives.mjs.map +1 -0
- package/dist/renderer-DSLb-FGg.d.cts +135 -0
- package/dist/renderer-DSLb-FGg.d.ts +135 -0
- package/dist/router.d.cts +126 -0
- package/dist/router.d.ts +126 -0
- package/dist/router.js +2 -0
- package/dist/router.js.map +1 -0
- package/dist/router.mjs +2 -0
- package/dist/router.mjs.map +1 -0
- package/dist/server.d.cts +3 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +2 -0
- package/dist/server.mjs.map +1 -0
- package/dist/signal-PWBIM6JV.mjs +2 -0
- package/dist/signal-PWBIM6JV.mjs.map +1 -0
- package/dist/signal-XZXQ4VYQ.js +2 -0
- package/dist/signal-XZXQ4VYQ.js.map +1 -0
- package/dist/signal-mNtlF8-v.d.cts +158 -0
- package/dist/signal-mNtlF8-v.d.ts +158 -0
- package/dist/state-kK9sQh9s.d.cts +73 -0
- package/dist/state-kK9sQh9s.d.ts +73 -0
- package/dist/test-exports.d.cts +17 -0
- package/dist/test-exports.d.ts +17 -0
- package/dist/test-exports.js +2 -0
- package/dist/test-exports.js.map +1 -0
- package/dist/test-exports.mjs +2 -0
- package/dist/test-exports.mjs.map +1 -0
- package/package.json +173 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/errors.ts","../src/core/signal.ts"],"names":["ErrorCodes","getErrorDetails","code","createErrorInfo","context","originalError","details","formatErrorMessage","info","message","contextStr","key","value","logError","logWarning","devToolsHooks","setDevToolsHooks","hooks","activeEffect","owner","getOwner","setOwner","newOwner","batchDepth","batchQueue","onMount","fn","cleanup","EffectNode","onError","dep","prevEffect","prevOwner","result","error","SignalNode","_value","newValue","sub","subscribersToNotify","i","ComputedNode","computeFn","signal","initialValue","node","devToolsId","sig","SIGNAL_MARKER","computed","comp","effect","options","wrappedFn","dispose","untrack","prev","batch","queue","root","isSignal","onCleanup","createResource","source","fetcher","loading","state","lastPromise","load","currentSource","refetching","promise","err","getSource","resource","v"],"mappings":"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","file":"chunk-ROYFUJN5.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 if (process.env.NODE_ENV !== 'production') {\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 * 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'\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/**\n * Base interface for subscriber nodes\n */\ninterface ISubscriber {\n execute(): void\n dependencies: Set<IObservable>\n}\n\n/**\n * Base interface for observable nodes\n */\ninterface IObservable {\n subscribers: Set<ISubscriber>\n notify(): void\n}\n\n// Global context for dependency tracking\n// Global context for dependency tracking\nlet activeEffect: ISubscriber | null = null\n\nexport interface Owner {\n cleanups: (() => void)[]\n context: Record<symbol, unknown> | null\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// Batching state\nlet batchDepth = 0\nconst batchQueue = new Set<ISubscriber>()\n\n/**\n * Runs a function once when the component mounts.\n * Unlike effect(), onMount does not track dependencies - it runs exactly once.\n *\n * @param fn - Function to run on mount. Can return a cleanup function.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * onMount(() => {\n * console.log('Mounted!');\n * return () => console.log('Unmounted!');\n * });\n * return <div>Hello</div>;\n * }\n * ```\n */\nexport function onMount(fn: () => void | (() => void)): void {\n // Schedule the mount callback to run after the current execution\n // This ensures the component is fully rendered before mount runs\n queueMicrotask(() => {\n const cleanup = fn()\n\n // Register cleanup with owner if available\n if (cleanup && typeof cleanup === 'function' && owner) {\n owner.cleanups.push(cleanup)\n }\n })\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 * Internal effect node for dependency tracking\n */\nclass EffectNode implements ISubscriber {\n dependencies = new Set<IObservable>()\n cleanups: (() => void)[] = []\n private isExecuting = false\n private isQueued = false\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 = owner\n }\n\n execute(): void {\n if (this.isExecuting) {\n this.isQueued = true\n return\n }\n\n this.isExecuting = true\n\n try {\n this.run()\n } finally {\n this.isExecuting = false\n if (this.isQueued) {\n this.isQueued = false\n // Schedule microtask to avoid stack overflow and infinite sync loops\n queueMicrotask(() => this.execute())\n }\n }\n }\n\n private run(): void {\n for (const cleanup of this.cleanups) {\n cleanup()\n }\n this.cleanups = []\n\n // Clear previous dependencies\n for (const dep of this.dependencies) {\n dep.subscribers.delete(this)\n }\n this.dependencies.clear()\n\n const prevEffect = activeEffect\n const prevOwner = owner\n activeEffect = this\n owner = 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 activeEffect = prevEffect\n owner = prevOwner\n }\n }\n\n dispose(): void {\n for (const cleanup of this.cleanups) {\n cleanup()\n }\n this.cleanups = []\n for (const dep of this.dependencies) {\n dep.subscribers.delete(this)\n }\n this.dependencies.clear()\n }\n}\n\n/**\n * Internal signal node for writable signals\n */\nclass SignalNode<T> implements IObservable {\n subscribers = new Set<ISubscriber>()\n\n constructor(private _value: T) { }\n\n get(): T {\n // Track dependency if inside an effect or computed\n if (activeEffect) {\n this.subscribers.add(activeEffect)\n activeEffect.dependencies.add(this)\n }\n return this._value\n }\n\n set(newValue: T): void {\n if (this._value !== newValue) {\n this._value = newValue\n this.notify()\n }\n }\n\n peek(): T {\n return this._value\n }\n\n notify(): void {\n if (batchDepth > 0) {\n // Queue subscribers for batched execution\n this.subscribers.forEach((sub) => batchQueue.add(sub))\n } else {\n // Use array spread instead of new Set() for better performance\n // This still creates a snapshot to avoid issues when effects unsubscribe/resubscribe\n const subscribersToNotify = [...this.subscribers]\n for (let i = 0; i < subscribersToNotify.length; i++) {\n subscribersToNotify[i].execute()\n }\n }\n }\n}\n\n/**\n * Internal computed node for derived values\n */\nclass ComputedNode<T> implements ISubscriber, IObservable {\n subscribers = new Set<ISubscriber>()\n dependencies = new Set<IObservable>()\n private _value!: T\n private _dirty = true\n\n constructor(private computeFn: () => T) { }\n\n execute(): void {\n // When a dependency changes, mark as dirty and notify subscribers\n this._dirty = true\n this.notify()\n }\n\n get(): T {\n // Track dependency if inside an effect or computed\n if (activeEffect && activeEffect !== this) {\n this.subscribers.add(activeEffect)\n activeEffect.dependencies.add(this)\n }\n\n if (this._dirty) {\n this._dirty = false\n\n // Clear previous dependencies\n for (const dep of this.dependencies) {\n dep.subscribers.delete(this)\n }\n this.dependencies.clear()\n\n const prevEffect = activeEffect\n activeEffect = this\n\n try {\n this._value = this.computeFn()\n } finally {\n activeEffect = prevEffect\n }\n }\n\n return this._value\n }\n\n peek(): T {\n if (this._dirty) {\n this._dirty = false\n\n // Clear previous dependencies\n for (const dep of this.dependencies) {\n dep.subscribers.delete(this)\n }\n this.dependencies.clear()\n\n const prevEffect = activeEffect\n activeEffect = this\n\n try {\n this._value = this.computeFn()\n } finally {\n activeEffect = prevEffect\n }\n }\n return this._value\n }\n\n notify(): void {\n if (batchDepth > 0) {\n // Queue subscribers for batched execution\n this.subscribers.forEach((sub) => batchQueue.add(sub))\n } else {\n // Use array spread instead of new Set() for better performance\n // This still creates a snapshot to avoid issues when effects unsubscribe/resubscribe\n const subscribersToNotify = [...this.subscribers]\n for (let i = 0; i < subscribersToNotify.length; i++) {\n subscribersToNotify[i].execute()\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 // Notify devtools of update\n if (devToolsId >= 0 && devToolsHooks?.onSignalUpdate) {\n devToolsHooks.onSignalUpdate(devToolsId, newValue)\n }\n },\n enumerable: true,\n configurable: true,\n })\n\n sig.set = (newValue: T) => {\n node.set(newValue)\n // Notify devtools of update\n if (devToolsId >= 0 && devToolsHooks?.onSignalUpdate) {\n devToolsHooks.onSignalUpdate(devToolsId, newValue)\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 // Register with devtools if enabled\n if (devToolsHooks?.onSignalCreate) {\n devToolsId = devToolsHooks.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 */\nexport function effect(\n fn: () => void | (() => void),\n options?: { onError?: (error: Error) => void; name?: string }\n): () => void {\n // Register with devtools before execution\n let devToolsId = -1\n if (devToolsHooks?.onEffectCreate) {\n devToolsId = devToolsHooks.onEffectCreate(options?.name)\n }\n\n // Wrap fn to track execution in devtools\n const wrappedFn =\n devToolsId >= 0\n ? () => {\n if (devToolsHooks?.onEffectRun) {\n devToolsHooks.onEffectRun(devToolsId, 'running')\n }\n try {\n const result = fn()\n if (devToolsHooks?.onEffectRun) {\n devToolsHooks.onEffectRun(devToolsId, 'idle')\n }\n return result\n } catch (error) {\n if (devToolsHooks?.onEffectRun) {\n devToolsHooks.onEffectRun(devToolsId, 'error', error as Error)\n }\n throw error\n }\n }\n : fn\n\n const node = new EffectNode(wrappedFn, options?.onError)\n node.execute()\n const dispose = () => node.dispose()\n\n if (owner) {\n owner.cleanups.push(dispose)\n }\n\n return dispose\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 *\n * @example\n * ```tsx\n * const count = signal(0);\n * const name = signal('Alice');\n *\n * effect(() => {\n * // Only re-runs when count changes, not name\n * console.log(count(), untrack(() => name()));\n * });\n * ```\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\n/**\n * Batches multiple signal updates together.\n * Effects will only run once after all updates complete.\n *\n * @param fn - Function containing signal updates to batch\n * @returns The return value of fn\n *\n * @example\n * ```tsx\n * const count = signal(0);\n * const name = signal('Alice');\n *\n * effect(() => console.log(count(), name())); // runs once\n *\n * batch(() => {\n * count.value = 1;\n * name.value = 'Bob';\n * }); // effect runs only once after batch completes\n * ```\n */\nexport function batch<T>(fn: () => T): T {\n batchDepth++\n try {\n return fn()\n } finally {\n batchDepth--\n if (batchDepth === 0) {\n // Execute all queued subscribers\n const queue = new Set(batchQueue)\n batchQueue.clear()\n queue.forEach((sub) => sub.execute())\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 */\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 }\n owner = newOwner\n\n const dispose = () => {\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 * 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 if (activeEffect instanceof EffectNode) {\n activeEffect.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 * Read value, throwing Promise if pending or Error if failed.\n * Used by Suspense.\n */\n read: () => 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 let lastPromise: Promise<T> | null = null\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 const promise = fetcher(currentSource, { value: value.peek(), refetching })\n lastPromise = promise\n\n try {\n const result = await promise\n if (lastPromise === promise) {\n value.value = result\n state.value = 'ready'\n loading.value = false\n }\n } catch (err) {\n if (lastPromise === promise) {\n error.value = err\n state.value = 'errored'\n loading.value = false\n }\n }\n }\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 read: {\n value: () => {\n if (state.value === 'pending' || state.value === 'refreshing') {\n throw lastPromise\n }\n if (state.value === 'errored') {\n throw error.value\n }\n return value.value\n },\n },\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"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkWQFQO5LK_js=require('./chunk-WQFQO5LK.js');function a(i){let e=[];for(let o=0;o<i.length;o++){let n=i[o];if(Array.isArray(n)){let t=a(n);for(let r=0;r<t.length;r++)e.push(t[r]);}else e.push(n);}return e}function c(i){let e=[];for(let o=0;o<i.length;o++){let n=i[o];n!=null&&n!==false&&e.push(n);}return e}function d(i,e){let o=e.key,n={};for(let l in e)l!=="key"&&l!=="children"&&(n[l]=e[l]);let t=e.children,r=[];return t!==void 0&&(Array.isArray(t)?r=c(a(t)):t!==null&&t!==false&&(r=[t])),chunkWQFQO5LK_js.a(i,n,r,o)}function y(i,e){let o=e.key,n={};for(let l in e)l!=="key"&&l!=="children"&&(n[l]=e[l]);let t=[],r=e.children;return Array.isArray(r)?t=c(r):r!=null&&r!==false&&(t=[r]),chunkWQFQO5LK_js.a(i,n,t,o)}function u(i){return chunkWQFQO5LK_js.a("fragment",{},i.children??[])}exports.a=d;exports.b=y;exports.c=u;//# sourceMappingURL=chunk-U6C6VDVZ.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-U6C6VDVZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/jsx-runtime.ts"],"names":["flattenChildren","children","result","i","child","flattened","j","filterChildren","jsx","type","props","key","restProps","k","normalizedChildren","createFNode","jsxs","Fragment"],"mappings":"iEAyCA,SAASA,CAAAA,CAAgBC,EAAwB,CAE/C,IAAMC,EAAgB,EAAC,CAEvB,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,EAAS,MAAA,CAAQE,CAAAA,EAAAA,CAAK,CACxC,IAAMC,CAAAA,CAAQH,CAAAA,CAASE,CAAC,CAAA,CACxB,GAAI,KAAA,CAAM,OAAA,CAAQC,CAAK,CAAA,CAAG,CACxB,IAAMC,CAAAA,CAAYL,EAAgBI,CAAK,CAAA,CACvC,QAASE,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAID,CAAAA,CAAU,MAAA,CAAQC,CAAAA,EAAAA,CACpCJ,EAAO,IAAA,CAAKG,CAAAA,CAAUC,CAAC,CAAC,EAE5B,CAAA,KACEJ,EAAO,IAAA,CAAKE,CAAK,EAErB,CAEA,OAAOF,CACT,CAOA,SAASK,CAAAA,CAAeN,EAAwB,CAE9C,IAAMC,EAAgB,EAAC,CACvB,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,EAAS,MAAA,CAAQE,CAAAA,EAAAA,CAAK,CACxC,IAAMC,CAAAA,CAAQH,CAAAA,CAASE,CAAC,CAAA,CACpBC,CAAAA,EAAU,IAAA,EAA+BA,CAAAA,GAAU,KAAA,EACrDF,CAAAA,CAAO,KAAKE,CAAK,EAErB,CACA,OAAOF,CACT,CAUO,SAASM,CAAAA,CACdC,CAAAA,CAEAC,CAAAA,CACO,CAGP,IAAMC,CAAAA,CAAMD,EAAM,GAAA,CAEZE,CAAAA,CAAiC,EAAC,CAExC,IAAA,IAAWC,CAAAA,IAAKH,EACVG,CAAAA,GAAM,KAAA,EAASA,CAAAA,GAAM,UAAA,GACvBD,CAAAA,CAAUC,CAAC,EAAIH,CAAAA,CAAMG,CAAC,GAI1B,IAAMZ,CAAAA,CAAWS,EAAM,QAAA,CAEnBI,CAAAA,CAA4B,EAAC,CAEjC,OAAIb,CAAAA,GAAa,SACX,KAAA,CAAM,OAAA,CAAQA,CAAQ,CAAA,CAExBa,CAAAA,CAAqBP,CAAAA,CAAeP,EAAgBC,CAAQ,CAAC,CAAA,CACpDA,CAAAA,GAAa,IAAA,EAAQA,CAAAA,GAAa,QAE3Ca,CAAAA,CAAqB,CAACb,CAAQ,CAAA,CAAA,CAAA,CAI3Bc,kBAAAA,CAAYN,CAAAA,CAAMG,EAAWE,CAAAA,CAAoBH,CAAG,CAC7D,CAWO,SAASK,CAAAA,CACdP,EAEAC,CAAAA,CACO,CAIP,IAAMC,CAAAA,CAAMD,CAAAA,CAAM,GAAA,CAEZE,EAAiC,EAAC,CAExC,IAAA,IAAWC,CAAAA,IAAKH,CAAAA,CACVG,CAAAA,GAAM,OAASA,CAAAA,GAAM,UAAA,GACvBD,EAAUC,CAAC,CAAA,CAAIH,EAAMG,CAAC,CAAA,CAAA,CAK1B,IAAIC,CAAAA,CAA4B,EAAC,CAC3Bb,EAAWS,CAAAA,CAAM,QAAA,CAEvB,OAAI,KAAA,CAAM,OAAA,CAAQT,CAAQ,EAExBa,CAAAA,CAAqBP,CAAAA,CAAeN,CAAQ,CAAA,CAG5CA,CAAAA,EAAa,IAAA,EACbA,IAAa,KAAA,GAEba,CAAAA,CAAqB,CAACb,CAAQ,CAAA,CAAA,CAGzBc,kBAAAA,CAAYN,EAAMG,CAAAA,CAAWE,CAAAA,CAAoBH,CAAG,CAC7D,CAOO,SAASM,EAASP,CAAAA,CAAoC,CAC3D,OAAOK,kBAAAA,CAAY,UAAA,CAAY,GAAIL,CAAAA,CAAM,QAAA,EAAY,EAAE,CACzD","file":"chunk-U6C6VDVZ.js","sourcesContent":["/**\n * Flexium JSX Runtime\n *\n * This module provides the automatic JSX runtime for Flexium.\n * It implements the new JSX transform introduced in React 17+.\n *\n * With automatic JSX runtime, you no longer need to import `f`:\n *\n * Before (classic):\n * ```tsx\n * import { f } from 'flexium/dom'\n * function App() {\n * return <div>Hello</div>\n * }\n * ```\n *\n * After (automatic):\n * ```tsx\n * function App() {\n * return <div>Hello</div>\n * }\n * ```\n *\n * Usage in tsconfig.json:\n * ```json\n * {\n * \"compilerOptions\": {\n * \"jsx\": \"react-jsx\",\n * \"jsxImportSource\": \"flexium\"\n * }\n * }\n * ```\n */\n\nimport type { FNode } from './core/renderer'\nimport { createFNode } from './core/fnode'\n\n/**\n * Flatten nested children arrays\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction flattenChildren(children: any[]): any[] {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: any[] = []\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i]\n if (Array.isArray(child)) {\n const flattened = flattenChildren(child)\n for (let j = 0; j < flattened.length; j++) {\n result.push(flattened[j])\n }\n } else {\n result.push(child)\n }\n }\n\n return result\n}\n\n/**\n * Filter out null, undefined, and false children\n * Optimized for performance using a simple loop\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction filterChildren(children: any[]): any[] {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: any[] = []\n for (let i = 0; i < children.length; i++) {\n const child = children[i]\n if (child !== null && child !== undefined && child !== false) {\n result.push(child)\n }\n }\n return result\n}\n\n/**\n * JSX runtime function for elements with multiple children\n *\n * @param type - Element type (string for built-in, function for components)\n * @param props - Element properties including children\n * @returns Flexium node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function jsx(\n type: string | Function,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n props: Record<string, any>\n): FNode {\n // Extract children from props\n // Manual extraction is faster than destructuring\n const key = props.key\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const restProps: Record<string, any> = {}\n\n for (const k in props) {\n if (k !== 'key' && k !== 'children') {\n restProps[k] = props[k]\n }\n }\n\n const children = props.children\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let normalizedChildren: any[] = []\n\n if (children !== undefined) {\n if (Array.isArray(children)) {\n // Recursively flatten and then filter\n normalizedChildren = filterChildren(flattenChildren(children))\n } else if (children !== null && children !== false) {\n // Single child optimization\n normalizedChildren = [children]\n }\n }\n\n return createFNode(type, restProps, normalizedChildren, key)\n}\n\n/**\n * JSX runtime function for elements with static children\n * (optimization hint from the compiler)\n *\n * @param type - Element type\n * @param props - Element properties\n * @returns Flexium node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function jsxs(\n type: string | Function,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n props: Record<string, any>\n): FNode {\n // For jsxs, we know children is an array passed as a prop\n // We can skip flattening, but we still need to filter\n\n const key = props.key\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const restProps: Record<string, any> = {}\n\n for (const k in props) {\n if (k !== 'key' && k !== 'children') {\n restProps[k] = props[k]\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let normalizedChildren: any[] = []\n const children = props.children\n\n if (Array.isArray(children)) {\n // Skip recursive flattening for jsxs, just filter\n normalizedChildren = filterChildren(children)\n } else if (\n children !== undefined &&\n children !== null &&\n children !== false\n ) {\n normalizedChildren = [children]\n }\n\n return createFNode(type, restProps, normalizedChildren, key)\n}\n\n/**\n * Fragment component for JSX\n * Renders children without a wrapper element\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function Fragment(props: { children?: any[] }): FNode {\n return createFNode('fragment', {}, props.children ?? [])\n}\n\n/**\n * JSX runtime for development (same as production for now)\n */\nexport { jsx as jsxDEV }\n\nexport namespace JSX {\n export interface IntrinsicElements {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [elemName: string]: any\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n export type Element = any\n export interface ElementClass {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n render: any\n }\n export interface ElementAttributesProperty {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n props: any\n }\n export interface ElementChildrenAttribute {\n children: {}\n }\n}\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
'use strict';var chunkCNY6FPKJ_js=require('./chunk-CNY6FPKJ.js'),chunkQ7IWDVJ4_js=require('./chunk-Q7IWDVJ4.js'),chunkROYFUJN5_js=require('./chunk-ROYFUJN5.js');function P(){let t=()=>({pathname:"/",search:"",hash:"",query:{}}),e=()=>typeof window>"u"?t():{pathname:window.location.pathname,search:window.location.search,hash:window.location.hash,query:D(window.location.search)},n=chunkROYFUJN5_js.h(e()),r=i=>{if(!(typeof window>"u")){if(L(i)){console.error("[Flexium Router] Blocked navigation to unsafe path:",i);return}window.history.pushState({},"",i),n.value=e();}},a=()=>{try{n.value=e();}catch(i){console.error("[Flexium Router] Error handling popstate:",i);}};return typeof window<"u"&&window.addEventListener("popstate",a),[n,r,()=>{typeof window<"u"&&window.removeEventListener("popstate",a);}]}function L(t){let e=t.trim().toLowerCase();return ["javascript:","data:","vbscript:","file:"].some(r=>e.startsWith(r))}function v(t){return t.replace(/<[^>]*>/g,"").replace(/javascript:/gi,"").replace(/on\w+\s*=/gi,"")}var F=new Set(["__proto__","constructor","prototype"]);function D(t){let e=new URLSearchParams(t),n=Object.create(null);return e.forEach((r,a)=>{let s=v(a),i=v(r);s&&!F.has(s)&&(n[s]=i);}),n}function j(t,e){let n=[],r=e.replace(/:([^/]+)/g,(u,p)=>(n.push(p),"([^/]+)")),a=new RegExp(`^${r}$`),s=t.match(a);if(!s)return {matches:false,params:{}};let i={};return s.slice(1).forEach((u,p)=>{i[n[p]]=u;}),{matches:true,params:i}}function y(t){let e=[],n=Array.isArray(t)?t:[t];for(let r of n){if(!chunkQ7IWDVJ4_js.c(r))continue;let{path:a,index:s,component:i,beforeEnter:u}=r.props,p=r.children;if(!i&&!p){console.warn(`[Flexium Router] Route "${a||"(index)"}" has no component and no children. Skipping.`);continue}let m={path:a||"",index:!!s,component:i||(()=>null),children:p?y(p):[],beforeEnter:u};e.push(m);}return e}function E(t,e){for(let n of t){let r=b(n,e,"");if(r)return r}return null}function b(t,e,n){let r=n;t.path&&(r=n.replace(/\/$/,"")+"/"+t.path.replace(/^\//,""));let a=t.children.length===0,s=N(r,!a),i=e.match(s);if(i){let[u,...p]=i,m=k(r,p),o={route:t,params:m,pathname:u};if(a)return u===e?[o]:null;for(let h of t.children){let c=b(h,e,r);if(c)return [o,...c]}if(u===e){let h=t.children.find(c=>c.index);return h?[o,{route:h,params:{},pathname:u}]:[o]}}return null}function N(t,e){let n=t.replace(/:([^/]+)/g,()=>"([^/]+)");return n==="/"&&e?new RegExp("^"):new RegExp(`^${n}${e?"(?:/|$)":"$"}`)}function k(t,e){let n={},r=0;return t.replace(/:([^/]+)/g,(a,s)=>(n[s]=e[r++],"")),n}var R=chunkCNY6FPKJ_js.a(null),f=chunkCNY6FPKJ_js.a(0);function S(){let t=chunkCNY6FPKJ_js.b(R);if(!t)throw new Error("router() must be called within a <Router> component");return t}function H(t){let[e,n]=P(),r=Array.isArray(t.children)?t.children:[t.children],a=[],s=[];for(let o of r)chunkQ7IWDVJ4_js.c(o)&&typeof o.type=="function"&&o.type===_?s.push(o):a.push(o);let i=y(s),u=chunkROYFUJN5_js.i(()=>{let o=e();return E(i,o.pathname)||[]}),p=chunkROYFUJN5_js.i(()=>{let o=u();return o.length>0?o[o.length-1].params:{}}),m={location:e,params:p,navigate:n,matches:u};return ()=>{let o=u(),h=null;if(o.length>0){let c=o[0];c.route.beforeEnter?c.route.beforeEnter(c.params)!==false&&(h=chunkQ7IWDVJ4_js.a(f.Provider,{value:1},[chunkQ7IWDVJ4_js.a("div",{key:c.route.path,style:{display:"contents"}},[chunkQ7IWDVJ4_js.a(c.route.component,{params:c.params})])])):h=chunkQ7IWDVJ4_js.a(f.Provider,{value:1},[chunkQ7IWDVJ4_js.a("div",{key:c.route.path,style:{display:"contents"}},[chunkQ7IWDVJ4_js.a(c.route.component,{params:c.params})])]);}return chunkQ7IWDVJ4_js.a(R.Provider,{value:m},[...a,chunkQ7IWDVJ4_js.a("main",{id:"main"},[h])])}}function _(t){return null}function I(){let t=chunkCNY6FPKJ_js.b(R),e=chunkCNY6FPKJ_js.b(f);return t?()=>{let n=t.matches();if(e>=n.length)return null;let r=n[e];if(r.route.beforeEnter&&r.route.beforeEnter(r.params)===false)return null;let a=r.route.component;return chunkQ7IWDVJ4_js.a(f.Provider,{value:e+1},[chunkQ7IWDVJ4_js.a(a,{params:r.params})])}:null}function J(t){let e=S(),n=r=>{r.preventDefault(),e.navigate(t.to);};return chunkQ7IWDVJ4_js.a("a",{href:t.to,class:t.class,onclick:n},t.children)}
|
|
2
|
+
exports.a=P;exports.b=L;exports.c=v;exports.d=j;exports.e=S;exports.f=H;exports.g=_;exports.h=I;exports.i=J;//# sourceMappingURL=chunk-V4K6WOXN.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-V4K6WOXN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/router/core.ts","../src/router/utils.ts","../src/router/context.ts","../src/router/components.ts"],"names":["createLocation","getDefaultLoc","getLoc","parseQuery","loc","signal","navigate","path","isUnsafePath","handlePopState","error","normalizedPath","protocol","sanitizeQueryValue","value","DANGEROUS_KEYS","search","params","query","key","sanitizedKey","sanitizedValue","matchPath","pathname","routePath","paramNames","regexPath","_","paramName","regex","match","index","createRoutesFromChildren","children","routes","childArray","child","isFNode","component","beforeEnter","nestedChildren","route","matchRoutes","location","result","matchRouteBranch","parentPath","fullPath","isLeaf","matcher","compilePath","matchedPath","paramValues","paramsObj","extractParams","currentMatch","childMatches","indexRoute","prefix","values","i","RouterCtx","createContext","RouteDepthCtx","router","ctx","context","Router","props","nonRouteChildren","routeChildren","Route","matches","computed","m","routerContext","ms","matchedContent","rootMatch","f","_props","Outlet","depth","Component","Link","r","handleClick","e"],"mappings":"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","file":"chunk-V4K6WOXN.js","sourcesContent":["/**\n * Router Core Module\n *\n * Provides core routing functionality including location management,\n * path matching, and navigation.\n */\n\nimport { signal, Signal } from '../core/signal'\nimport { Location } from './types'\n\n/**\n * Creates a reactive location signal and navigate function.\n *\n * The location signal automatically updates when:\n * - navigate() is called\n * - Browser back/forward buttons are used (popstate event)\n *\n * @returns Tuple of [location signal, navigate function, cleanup function]\n *\n * @example\n * ```tsx\n * const [location, navigate, cleanup] = createLocation();\n * // Access current path\n * console.log(location().pathname);\n * // Navigate to new path\n * navigate('/users/123');\n * // Cleanup when done (removes popstate listener)\n * cleanup();\n * ```\n */\nexport function createLocation(): [Signal<Location>, (path: string) => void, () => void] {\n // SSR guard: return safe defaults on server\n const getDefaultLoc = (): Location => ({\n pathname: '/',\n search: '',\n hash: '',\n query: {},\n })\n\n const getLoc = (): Location => {\n if (typeof window === 'undefined') {\n return getDefaultLoc()\n }\n return {\n pathname: window.location.pathname,\n search: window.location.search,\n hash: window.location.hash,\n query: parseQuery(window.location.search),\n }\n }\n\n const loc = signal(getLoc())\n\n const navigate = (path: string) => {\n // SSR guard\n if (typeof window === 'undefined') return\n\n // Security: Validate path to prevent javascript: and other dangerous protocols\n if (isUnsafePath(path)) {\n console.error('[Flexium Router] Blocked navigation to unsafe path:', path)\n return\n }\n window.history.pushState({}, '', path)\n loc.value = getLoc()\n }\n\n // SSR guard for popstate listener\n const handlePopState = () => {\n try {\n loc.value = getLoc()\n } catch (error) {\n console.error('[Flexium Router] Error handling popstate:', error)\n }\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('popstate', handlePopState)\n }\n\n // Cleanup function to remove listener\n const cleanup = () => {\n if (typeof window !== 'undefined') {\n window.removeEventListener('popstate', handlePopState)\n }\n }\n\n return [loc, navigate, cleanup]\n}\n\n/**\n * Check if a path contains unsafe protocols (XSS prevention)\n * @param path - Path to validate\n * @returns true if path is unsafe\n */\nexport function isUnsafePath(path: string): boolean {\n const normalizedPath = path.trim().toLowerCase()\n const unsafeProtocols = ['javascript:', 'data:', 'vbscript:', 'file:']\n return unsafeProtocols.some(protocol => normalizedPath.startsWith(protocol))\n}\n\n/**\n * Sanitize query parameter value to prevent XSS\n * @param value - Query parameter value\n * @returns Sanitized value\n */\nexport function sanitizeQueryValue(value: string): string {\n // Remove potential script tags and event handlers\n return value\n .replace(/<[^>]*>/g, '') // Remove HTML tags\n .replace(/javascript:/gi, '') // Remove javascript: protocol\n .replace(/on\\w+\\s*=/gi, '') // Remove event handlers like onclick=\n}\n\n/**\n * Parses URL search string into key-value object\n * @param search - URL search string (e.g., \"?foo=bar&baz=qux\")\n * @returns Object with query parameters\n */\n// Dangerous keys that could lead to prototype pollution\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\n\nfunction parseQuery(search: string): Record<string, string> {\n const params = new URLSearchParams(search)\n // Use Object.create(null) to prevent prototype pollution\n const query: Record<string, string> = Object.create(null)\n params.forEach((value, key) => {\n // Sanitize both key and value to prevent XSS\n const sanitizedKey = sanitizeQueryValue(key)\n const sanitizedValue = sanitizeQueryValue(value)\n // Block dangerous keys to prevent prototype pollution\n if (sanitizedKey && !DANGEROUS_KEYS.has(sanitizedKey)) {\n query[sanitizedKey] = sanitizedValue\n }\n })\n return query\n}\n\n/**\n * Matches a pathname against a route pattern.\n *\n * Supports dynamic segments with `:param` syntax.\n *\n * @param pathname - Current URL pathname (e.g., \"/users/123\")\n * @param routePath - Route pattern (e.g., \"/users/:id\")\n * @returns Object with `matches` boolean and extracted `params`\n *\n * @example\n * ```tsx\n * const result = matchPath('/users/123', '/users/:id');\n * // { matches: true, params: { id: '123' } }\n * ```\n */\nexport function matchPath(\n pathname: string,\n routePath: string\n): { matches: boolean; params: Record<string, string> } {\n const paramNames: string[] = []\n const regexPath = routePath.replace(/:([^/]+)/g, (_, paramName) => {\n paramNames.push(paramName)\n return '([^/]+)'\n })\n\n const regex = new RegExp(`^${regexPath}$`)\n const match = pathname.match(regex)\n\n if (!match) {\n return { matches: false, params: {} }\n }\n\n const params: Record<string, string> = {}\n match.slice(1).forEach((value, index) => {\n params[paramNames[index]] = value\n })\n\n return { matches: true, params }\n}\n","import { RouteDef, RouteMatch } from './types'\nimport type { FNodeChild } from '../core/renderer'\nimport { isFNode } from '../renderers/dom/f'\n\n/**\n * Flatten the children of <Router> or <Route> into a route configuration tree.\n * Note: This assumes `children` are FNodes representing <Route> components.\n */\nexport function createRoutesFromChildren(children: FNodeChild): RouteDef[] {\n const routes: RouteDef[] = []\n\n const childArray = Array.isArray(children) ? children : [children]\n\n for (const child of childArray) {\n if (!isFNode(child)) {\n continue\n }\n\n const { path, index, component, beforeEnter } = child.props as {\n path?: string\n index?: boolean\n component?: Function\n beforeEnter?: (\n params: Record<string, string>\n ) => boolean | Promise<boolean>\n }\n const nestedChildren = child.children\n\n // Skip routes without a component (unless they have children as layout routes)\n if (!component && !nestedChildren) {\n console.warn(\n `[Flexium Router] Route \"${path || '(index)'}\" has no component and no children. Skipping.`\n )\n continue\n }\n\n const route: RouteDef = {\n path: path || '',\n index: !!index,\n component: component || (() => null),\n children: nestedChildren ? createRoutesFromChildren(nestedChildren) : [],\n beforeEnter,\n }\n\n routes.push(route)\n }\n\n return routes\n}\n\n/**\n * Match a URL against a route tree.\n * Returns an array of matches (from root to leaf).\n */\nexport function matchRoutes(\n routes: RouteDef[],\n location: string\n): RouteMatch[] | null {\n for (const route of routes) {\n const result = matchRouteBranch(route, location, '')\n if (result) return result\n }\n return null\n}\n\nfunction matchRouteBranch(\n route: RouteDef,\n location: string,\n parentPath: string\n): RouteMatch[] | null {\n let fullPath = parentPath\n if (route.path) {\n fullPath =\n parentPath.replace(/\\/$/, '') + '/' + route.path.replace(/^\\//, '')\n }\n\n const isLeaf = route.children.length === 0\n const matcher = compilePath(fullPath, !isLeaf)\n const match = location.match(matcher)\n\n if (match) {\n const [matchedPath, ...paramValues] = match\n const paramsObj = extractParams(fullPath, paramValues)\n\n const currentMatch: RouteMatch = {\n route,\n params: paramsObj,\n pathname: matchedPath,\n }\n\n if (isLeaf) {\n // Exact match required for leaf\n if (matchedPath === location) return [currentMatch]\n return null\n }\n\n // Has children: try to match one of them\n // If no children match, and this route is an index route?\n // Or if this route matches partially, maybe an index child matches the rest?\n\n for (const child of route.children) {\n const childMatches = matchRouteBranch(child, location, fullPath)\n if (childMatches) {\n return [currentMatch, ...childMatches]\n }\n }\n\n // If no children matched, but we matched exactly this layout route?\n // E.g. /users matches /users layout, and maybe it renders index?\n if (matchedPath === location) {\n // Check for index route\n const indexRoute = route.children.find((c) => c.index)\n if (indexRoute) {\n return [\n currentMatch,\n { route: indexRoute, params: {}, pathname: matchedPath },\n ]\n }\n // Just the layout? Maybe.\n return [currentMatch]\n }\n }\n\n return null\n}\n\nfunction compilePath(path: string, prefix: boolean): RegExp {\n const regexPath = path.replace(/:([^/]+)/g, () => '([^/]+)')\n\n // If path is exactly \"/\", and we want prefix matching, it should match everything\n if (regexPath === '/' && prefix) {\n return new RegExp('^')\n }\n\n // If prefix matching allowed, ensure we match segment boundary\n return new RegExp(`^${regexPath}${prefix ? '(?:/|$)' : '$'}`)\n}\n\nfunction extractParams(path: string, values: string[]): Record<string, string> {\n const params: Record<string, string> = {}\n let i = 0\n // Re-parse to find param names... inefficient but works\n path.replace(/:([^/]+)/g, (_, paramName) => {\n params[paramName] = values[i++]\n return ''\n })\n return params\n}\n","import { createContext } from '../core/context'\nimport { RouterContext } from './types'\n\n// Global Router Context\nexport const RouterCtx = createContext<RouterContext | null>(null)\n\n// Current Route Depth Context (for Outlet)\n// Stores the index of the current match in the `matches` array\nexport const RouteDepthCtx = createContext<number>(0)\n","import { computed } from '../core/signal'\nimport { createLocation } from './core'\nimport { createRoutesFromChildren, matchRoutes } from './utils'\nimport { LinkProps, RouteProps, RouterContext } from './types'\nimport { f, isFNode } from '../renderers/dom/f'\nimport { RouterCtx, RouteDepthCtx } from './context'\nimport { context } from '../core/context'\nimport type { FNodeChild } from '../core/renderer'\n\n/**\n * Get the current router context.\n * Must be called within a <Router> component.\n *\n * @example\n * ```tsx\n * const r = router()\n * r.navigate('/dashboard')\n * ```\n */\nexport function router(): RouterContext {\n const ctx = context(RouterCtx)\n if (!ctx) {\n throw new Error('router() must be called within a <Router> component')\n }\n return ctx\n}\n\nexport function Router(props: { children: FNodeChild }) {\n const [location, navigate] = createLocation()\n\n // Separate Route children from non-Route children (like Nav, etc.)\n const childArray = Array.isArray(props.children) ? props.children : [props.children]\n const nonRouteChildren: FNodeChild[] = []\n const routeChildren: FNodeChild[] = []\n\n for (const child of childArray) {\n if (isFNode(child) && typeof child.type === 'function' && child.type === Route) {\n routeChildren.push(child)\n } else {\n nonRouteChildren.push(child)\n }\n }\n\n // Parse route configuration from Route children only\n const routes = createRoutesFromChildren(routeChildren)\n\n // Compute matches\n const matches = computed(() => {\n const loc = location()\n return matchRoutes(routes, loc.pathname) || []\n })\n\n const params = computed(() => {\n const m = matches()\n if (m.length > 0) {\n return m[m.length - 1].params\n }\n return {}\n })\n\n const routerContext: RouterContext = {\n location,\n params,\n navigate,\n matches,\n }\n\n return () => {\n const ms = matches()\n\n // Matched route component (or null if no match)\n let matchedContent: FNodeChild = null\n if (ms.length > 0) {\n const rootMatch = ms[0]\n\n // Check beforeEnter guard\n if (rootMatch.route.beforeEnter) {\n const result = rootMatch.route.beforeEnter(rootMatch.params)\n if (result !== false) {\n matchedContent = f(RouteDepthCtx.Provider, { value: 1 }, [\n f('div', { key: rootMatch.route.path, style: { display: 'contents' } }, [\n f(rootMatch.route.component, { params: rootMatch.params }),\n ]),\n ])\n }\n } else {\n matchedContent = f(RouteDepthCtx.Provider, { value: 1 }, [\n f('div', { key: rootMatch.route.path, style: { display: 'contents' } }, [\n f(rootMatch.route.component, { params: rootMatch.params }),\n ]),\n ])\n }\n }\n\n // Render non-Route children (like Nav) and the matched route wrapped in main\n return f(RouterCtx.Provider, { value: routerContext }, [\n ...nonRouteChildren,\n f('main', { id: 'main' }, [matchedContent]),\n ])\n }\n}\n\n/**\n * Route configuration component.\n * Doesn't render anything directly; used by Router to build the route tree.\n */\nexport function Route(_props: RouteProps) {\n return null\n}\n\n/**\n * Renders the child route content.\n */\nexport function Outlet() {\n const router = context(RouterCtx)\n const depth = context(RouteDepthCtx) // Default 0\n\n // Safety check\n if (!router) return null\n\n return () => {\n const ms = router.matches()\n\n // Check if we have a match at this depth\n if (depth >= ms.length) return null\n\n const match = ms[depth]\n\n // Check beforeEnter guard\n if (match.route.beforeEnter) {\n const result = match.route.beforeEnter(match.params)\n if (result === false) return null\n }\n\n const Component = match.route.component\n\n // Render component and provide next depth\n return f(RouteDepthCtx.Provider, { value: depth + 1 }, [\n f(Component, { params: match.params }),\n ])\n }\n}\n\nexport function Link(props: LinkProps) {\n const r = router()\n\n const handleClick = (e: Event) => {\n e.preventDefault()\n r.navigate(props.to)\n }\n\n return f(\n 'a',\n {\n href: props.to,\n class: props.class,\n onclick: handleClick,\n },\n props.children\n )\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/fnode.ts"],"names":["createFNode","type","props","children","key"],"mappings":"aAMO,SAASA,EACdC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACO,CACP,OAAO,CACL,IAAA,CAAAH,CAAAA,CACA,MAAAC,CAAAA,CACA,QAAA,CAAAC,EACA,GAAA,CAAKC,CAAAA,EAAO,MACd,CACF","file":"chunk-WQFQO5LK.js","sourcesContent":["import type { FNode, FNodeChild } from './renderer'\n\n/**\n * Creates an FNode ensuring consistent object shape (Monomorphism).\n * This is crucial for JS engine optimization (Hidden Classes).\n */\nexport function createFNode(\n type: string | Function,\n props: Record<string, unknown>,\n children: FNodeChild[],\n key?: string | number | null\n): FNode {\n return {\n type,\n props,\n children,\n key: key ?? undefined,\n }\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {a}from'./chunk-KNF5ERPK.mjs';function l(n,e,...r){let o=e||{},d=o.key;d!==void 0&&delete o.key;let s=f(r).filter(t=>t!=null&&t!==false);return a(n,o,s,d)}function y(n){return a("fragment",{},n.children||[])}function f(n){let e=[];for(let r of n)Array.isArray(r)?e.push(...f(r)):e.push(r);return e}function u(n){return n!==null&&typeof n=="object"&&"type"in n&&"props"in n&&"children"in n}export{l as a,y as b,u as c};//# sourceMappingURL=chunk-WVEJT7HD.mjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-WVEJT7HD.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/renderers/dom/f.ts"],"names":["f","type","props","children","normalizedProps","key","normalizedChildren","flattenChildren","child","createFNode","Fragment","result","isFNode","value"],"mappings":"qCA4BO,SAASA,CAAAA,CACdC,EAEAC,CAAAA,CAAAA,GAEGC,CAAAA,CACI,CAEP,IAAMC,CAAAA,CAAkBF,GAAS,EAAC,CAG5BG,EAAMD,CAAAA,CAAgB,GAAA,CACxBC,IAAQ,MAAA,EACV,OAAOD,EAAgB,GAAA,CAIzB,IAAME,CAAAA,CAAqBC,CAAAA,CAAgBJ,CAAQ,CAAA,CAAE,OAClDK,CAAAA,EAAUA,CAAAA,EAAU,MAA+BA,CAAAA,GAAU,KAChE,EAEA,OAAOC,CAAAA,CAAYR,EAAMG,CAAAA,CAAiBE,CAAAA,CAAoBD,CAAG,CACnE,CAOO,SAASK,CAAAA,CAASR,CAAAA,CAAoC,CAC3D,OAAOO,CAAAA,CAAY,UAAA,CAAY,EAAC,CAAGP,CAAAA,CAAM,UAAY,EAAE,CACzD,CAMA,SAASK,EAAgBJ,CAAAA,CAAwB,CAE/C,IAAMQ,CAAAA,CAAgB,GAEtB,IAAA,IAAWH,CAAAA,IAASL,EACd,KAAA,CAAM,OAAA,CAAQK,CAAK,CAAA,CACrBG,CAAAA,CAAO,IAAA,CAAK,GAAGJ,CAAAA,CAAgBC,CAAK,CAAC,CAAA,CAErCG,CAAAA,CAAO,KAAKH,CAAK,CAAA,CAIrB,OAAOG,CACT,CAMO,SAASC,CAAAA,CAAQC,CAAAA,CAA4B,CAClD,OACEA,CAAAA,GAAU,IAAA,EACV,OAAOA,CAAAA,EAAU,QAAA,EACjB,SAAUA,CAAAA,EACV,OAAA,GAAWA,CAAAA,EACX,UAAA,GAAcA,CAElB","file":"chunk-WVEJT7HD.mjs","sourcesContent":["/**\n * JSX Factory Function (f)\n *\n * This module provides the JSX factory function for creating Flexium nodes.\n * It's used by the JSX transpiler to convert JSX syntax into function calls.\n *\n * Usage in tsconfig.json:\n * {\n * \"compilerOptions\": {\n * \"jsx\": \"react\",\n * \"jsxFactory\": \"f\",\n * \"jsxFragmentFactory\": \"Fragment\"\n * }\n * }\n */\n\nimport type { FNode } from '../../core/renderer'\nimport { createFNode } from '../../core/fnode'\n\n/**\n * JSX factory function for Flexium\n * Creates a Flexium node from JSX syntax\n *\n * @param type - Element type (string for built-in, function for components)\n * @param props - Element properties\n * @param children - Child elements\n * @returns Flexium node\n */\nexport function f(\n type: string | Function,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n props: Record<string, any> | null,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...children: any[]\n): FNode {\n // Normalize props\n const normalizedProps = props || {}\n\n // Extract key if present\n const key = normalizedProps.key\n if (key !== undefined) {\n delete normalizedProps.key\n }\n\n // Flatten and filter children\n const normalizedChildren = flattenChildren(children).filter(\n (child) => child !== null && child !== undefined && child !== false\n )\n\n return createFNode(type, normalizedProps, normalizedChildren, key)\n}\n\n/**\n * Fragment component\n * Renders children without a wrapper element\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function Fragment(props: { children?: any[] }): FNode {\n return createFNode('fragment', {}, props.children || [])\n}\n\n/**\n * Flatten nested children arrays\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction flattenChildren(children: any[]): any[] {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: any[] = []\n\n for (const child of children) {\n if (Array.isArray(child)) {\n result.push(...flattenChildren(child))\n } else {\n result.push(child)\n }\n }\n\n return result\n}\n\n/**\n * Check if a value is an FNode\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isFNode(value: any): value is FNode {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'type' in value &&\n 'props' in value &&\n 'children' in value\n )\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {n}from'./chunk-5S3ZQ2LB.mjs';function x(i){if(!i)return {};let n={};i.display&&(n.display=i.display),i.flex!==void 0&&(n.flex=i.flex),i.flexDirection&&(n.flexDirection=i.flexDirection),i.flexWrap&&(n.flexWrap=i.flexWrap),i.justifyContent&&(n.justifyContent=i.justifyContent),i.alignItems&&(n.alignItems=i.alignItems),i.alignSelf&&(n.alignSelf=i.alignSelf),i.gap!==void 0&&(n.gap=`${i.gap}px`),i.padding!==void 0&&(n.padding=`${i.padding}px`),i.paddingTop!==void 0&&(n.paddingTop=`${i.paddingTop}px`),i.paddingRight!==void 0&&(n.paddingRight=`${i.paddingRight}px`),i.paddingBottom!==void 0&&(n.paddingBottom=`${i.paddingBottom}px`),i.paddingLeft!==void 0&&(n.paddingLeft=`${i.paddingLeft}px`),i.paddingHorizontal!==void 0&&(n.paddingLeft=`${i.paddingHorizontal}px`,n.paddingRight=`${i.paddingHorizontal}px`),i.paddingVertical!==void 0&&(n.paddingTop=`${i.paddingVertical}px`,n.paddingBottom=`${i.paddingVertical}px`),i.margin!==void 0&&(n.margin=`${i.margin}px`),i.marginTop!==void 0&&(n.marginTop=`${i.marginTop}px`),i.marginRight!==void 0&&(n.marginRight=`${i.marginRight}px`),i.marginBottom!==void 0&&(n.marginBottom=`${i.marginBottom}px`),i.marginLeft!==void 0&&(n.marginLeft=`${i.marginLeft}px`),i.marginHorizontal!==void 0&&(n.marginLeft=`${i.marginHorizontal}px`,n.marginRight=`${i.marginHorizontal}px`),i.marginVertical!==void 0&&(n.marginTop=`${i.marginVertical}px`,n.marginBottom=`${i.marginVertical}px`),i.width!==void 0&&(n.width=typeof i.width=="number"?`${i.width}px`:i.width),i.height!==void 0&&(n.height=typeof i.height=="number"?`${i.height}px`:i.height),i.minWidth!==void 0&&(n.minWidth=`${i.minWidth}px`),i.maxWidth!==void 0&&(n.maxWidth=`${i.maxWidth}px`),i.minHeight!==void 0&&(n.minHeight=`${i.minHeight}px`),i.maxHeight!==void 0&&(n.maxHeight=`${i.maxHeight}px`),i.backgroundColor&&(n.backgroundColor=i.backgroundColor),i.borderRadius!==void 0&&(n.borderRadius=`${i.borderRadius}px`),i.borderTopLeftRadius!==void 0&&(n.borderTopLeftRadius=`${i.borderTopLeftRadius}px`),i.borderTopRightRadius!==void 0&&(n.borderTopRightRadius=`${i.borderTopRightRadius}px`),i.borderBottomLeftRadius!==void 0&&(n.borderBottomLeftRadius=`${i.borderBottomLeftRadius}px`),i.borderBottomRightRadius!==void 0&&(n.borderBottomRightRadius=`${i.borderBottomRightRadius}px`),i.opacity!==void 0&&(n.opacity=i.opacity),i.borderWidth!==void 0&&(n.borderWidth=`${i.borderWidth}px`),i.borderColor&&(n.borderColor=i.borderColor),i.borderTopWidth!==void 0&&(n.borderTopWidth=`${i.borderTopWidth}px`),i.borderRightWidth!==void 0&&(n.borderRightWidth=`${i.borderRightWidth}px`),i.borderBottomWidth!==void 0&&(n.borderBottomWidth=`${i.borderBottomWidth}px`),i.borderLeftWidth!==void 0&&(n.borderLeftWidth=`${i.borderLeftWidth}px`),i.position&&(n.position=i.position),i.top!==void 0&&(n.top=`${i.top}px`),i.right!==void 0&&(n.right=`${i.right}px`),i.bottom!==void 0&&(n.bottom=`${i.bottom}px`),i.left!==void 0&&(n.left=`${i.left}px`),i.zIndex!==void 0&&(n.zIndex=i.zIndex),i.transform&&(n.transform=i.transform);let o=i;return o.color&&(n.color=o.color),o.fontSize!==void 0&&(n.fontSize=`${o.fontSize}px`),o.fontWeight&&(n.fontWeight=o.fontWeight),o.fontFamily&&(n.fontFamily=o.fontFamily),o.fontStyle&&(n.fontStyle=o.fontStyle),o.textAlign&&(n.textAlign=o.textAlign),o.textDecoration&&(n.textDecoration=o.textDecoration),o.lineHeight!==void 0&&(n.lineHeight=`${o.lineHeight}px`),o.letterSpacing!==void 0&&(n.letterSpacing=`${o.letterSpacing}px`),n}function k(i){return n(i)}function e(i){return k(i)||i!==null&&typeof i=="object"&&"value"in i&&"peek"in i?i.value:i}function b(i,n,o,r){if(!n)return;let d=Array.isArray(n)?n:[n];for(let t of d)if(!(!t||!t.type))switch(t.type){case "canvas-rect":D(i,t.props);break;case "canvas-circle":W(i,t.props);break;case "canvas-path":C(i,t.props);break;case "canvas-text":S(i,t.props);break;case "canvas-line":v(i,t.props);break;case "canvas-arc":T(i,t.props);break}}function D(i,n){let o=e(n.x),r=e(n.y),d=e(n.width),t=e(n.height),a=e(n.fill),f=e(n.stroke),p=e(n.strokeWidth),g=e(n.opacity);i.save(),g!==void 0&&(i.globalAlpha=g),a&&(i.fillStyle=a,i.fillRect(o,r,d,t)),f&&(i.strokeStyle=f,i.lineWidth=p||1,i.strokeRect(o,r,d,t)),i.restore();}function W(i,n){let o=e(n.x),r=e(n.y),d=e(n.radius),t=e(n.fill),a=e(n.stroke),f=e(n.strokeWidth),p=e(n.opacity);i.save(),p!==void 0&&(i.globalAlpha=p),i.beginPath(),i.arc(o,r,d,0,2*Math.PI),t&&(i.fillStyle=t,i.fill()),a&&(i.strokeStyle=a,i.lineWidth=f||1,i.stroke()),i.restore();}function C(i,n){let o=e(n.d),r=e(n.fill),d=e(n.stroke),t=e(n.strokeWidth),a=e(n.opacity);i.save(),a!==void 0&&(i.globalAlpha=a);let f=new Path2D(o);r&&(i.fillStyle=r,i.fill(f)),d&&(i.strokeStyle=d,i.lineWidth=t||1,i.stroke(f)),i.restore();}function S(i,n){let o=e(n.x),r=e(n.y),d=e(n.text),t=e(n.fill),a=e(n.fontSize)||12,f=e(n.fontFamily)||"sans-serif",p=e(n.fontWeight)||"normal",g=e(n.textAlign)||"left",m=e(n.textBaseline)||"alphabetic";i.save(),i.font=`${p} ${a}px ${f}`,i.textAlign=g,i.textBaseline=m,t&&(i.fillStyle=t,i.fillText(d,o,r)),i.restore();}function v(i,n){let o=e(n.x1),r=e(n.y1),d=e(n.x2),t=e(n.y2),a=e(n.stroke)||"black",f=e(n.strokeWidth)||1,p=e(n.opacity);i.save(),p!==void 0&&(i.globalAlpha=p),i.beginPath(),i.moveTo(o,r),i.lineTo(d,t),i.strokeStyle=a,i.lineWidth=f,i.stroke(),i.restore();}function T(i,n){let o=e(n.x),r=e(n.y),d=e(n.radius),t=e(n.startAngle),a=e(n.endAngle),f=e(n.counterclockwise)||false,p=e(n.fill),g=e(n.stroke),m=e(n.strokeWidth),h=e(n.opacity);i.save(),h!==void 0&&(i.globalAlpha=h),i.beginPath(),i.arc(o,r,d,t,a,f),p&&(i.fillStyle=p,i.fill()),g&&(i.strokeStyle=g,i.lineWidth=m||1,i.stroke()),i.restore();}function N(i){let{width:n,height:o,children:r,style:d,id:t,...a}=i;return {type:"canvas",props:{...a,id:t,width:n,height:o,style:x(d),ref:f=>{if(!f||typeof requestAnimationFrame>"u")return;let p=f.getContext("2d");p&&import('./signal-PWBIM6JV.mjs').then(({effect:g,onCleanup:m,isSignal:h})=>{let c,R=()=>{c!==void 0&&cancelAnimationFrame(c),c=requestAnimationFrame(()=>{p.clearRect(0,0,n,o),b(p,r),c=void 0;});};g(()=>{let w=Array.isArray(r)?r:[r];for(let u of w)if(u&&u.props)for(let $ in u.props){let s=u.props[$];h(s)&&s.value;}R(),m(()=>{c!==void 0&&(cancelAnimationFrame(c),c=void 0);});});}).catch(g=>{console.error("[Flexium Canvas] Failed to load signal module:",g);});}},children:[]}}function I(i){return {type:"canvas-rect",props:i,children:[]}}function j(i){return {type:"canvas-circle",props:i,children:[]}}function M(i){return {type:"canvas-arc",props:i,children:[]}}function E(i){return {type:"canvas-line",props:i,children:[]}}function J(i){return {type:"canvas-path",props:i,children:[]}}function O(i){return {type:"canvas-text",props:i,children:[]}}export{x as a,e as b,b as c,N as d,I as e,j as f,M as g,E as h,J as i,O as j};//# sourceMappingURL=chunk-ZNPYN2TZ.mjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-ZNPYN2TZ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/primitives/utils.ts","../src/primitives/canvas/utils.ts","../src/primitives/canvas/renderer.ts","../src/primitives/canvas/Canvas.ts","../src/primitives/canvas/DrawRect.ts","../src/primitives/canvas/DrawCircle.ts","../src/primitives/canvas/DrawArc.ts","../src/primitives/canvas/DrawLine.ts","../src/primitives/canvas/DrawPath.ts","../src/primitives/canvas/DrawText.ts"],"names":["normalizeStyle","style","css","textStyle","isSignal","value","unwrapSignal","renderCanvasChildren","ctx","children","_width","_height","childArray","child","renderRect","renderCircle","renderPath","renderText","renderLine","renderArc","props","x","y","width","height","fill","stroke","strokeWidth","opacity","radius","d","path","text","fontSize","fontFamily","fontWeight","textAlign","textBaseline","x1","y1","x2","y2","startAngle","endAngle","counterclockwise","Canvas","id","rest","canvas","effect","onCleanup","rafId","scheduleRender","key","err","DrawRect","DrawCircle","DrawArc","DrawLine","DrawPath","DrawText"],"mappings":"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","file":"chunk-ZNPYN2TZ.mjs","sourcesContent":["/**\n * Primitive utilities\n */\n\nimport type { CommonStyle, TextStyle } from './types'\n\n/**\n * Normalize CommonStyle to CSS properties\n */\nexport function normalizeStyle(\n style?: CommonStyle | TextStyle\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Record<string, any> {\n if (!style) return {}\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const css: Record<string, any> = {}\n\n // Layout\n if (style.display) css.display = style.display\n if (style.flex !== undefined) css.flex = style.flex\n if (style.flexDirection) css.flexDirection = style.flexDirection\n if (style.flexWrap) css.flexWrap = style.flexWrap\n if (style.justifyContent) css.justifyContent = style.justifyContent\n if (style.alignItems) css.alignItems = style.alignItems\n if (style.alignSelf) css.alignSelf = style.alignSelf\n if (style.gap !== undefined) css.gap = `${style.gap}px`\n\n // Spacing - padding\n if (style.padding !== undefined) css.padding = `${style.padding}px`\n if (style.paddingTop !== undefined) css.paddingTop = `${style.paddingTop}px`\n if (style.paddingRight !== undefined)\n css.paddingRight = `${style.paddingRight}px`\n if (style.paddingBottom !== undefined)\n css.paddingBottom = `${style.paddingBottom}px`\n if (style.paddingLeft !== undefined)\n css.paddingLeft = `${style.paddingLeft}px`\n if (style.paddingHorizontal !== undefined) {\n css.paddingLeft = `${style.paddingHorizontal}px`\n css.paddingRight = `${style.paddingHorizontal}px`\n }\n if (style.paddingVertical !== undefined) {\n css.paddingTop = `${style.paddingVertical}px`\n css.paddingBottom = `${style.paddingVertical}px`\n }\n\n // Spacing - margin\n if (style.margin !== undefined) css.margin = `${style.margin}px`\n if (style.marginTop !== undefined) css.marginTop = `${style.marginTop}px`\n if (style.marginRight !== undefined)\n css.marginRight = `${style.marginRight}px`\n if (style.marginBottom !== undefined)\n css.marginBottom = `${style.marginBottom}px`\n if (style.marginLeft !== undefined) css.marginLeft = `${style.marginLeft}px`\n if (style.marginHorizontal !== undefined) {\n css.marginLeft = `${style.marginHorizontal}px`\n css.marginRight = `${style.marginHorizontal}px`\n }\n if (style.marginVertical !== undefined) {\n css.marginTop = `${style.marginVertical}px`\n css.marginBottom = `${style.marginVertical}px`\n }\n\n // Sizing\n if (style.width !== undefined)\n css.width =\n typeof style.width === 'number' ? `${style.width}px` : style.width\n if (style.height !== undefined)\n css.height =\n typeof style.height === 'number' ? `${style.height}px` : style.height\n if (style.minWidth !== undefined) css.minWidth = `${style.minWidth}px`\n if (style.maxWidth !== undefined) css.maxWidth = `${style.maxWidth}px`\n if (style.minHeight !== undefined) css.minHeight = `${style.minHeight}px`\n if (style.maxHeight !== undefined) css.maxHeight = `${style.maxHeight}px`\n\n // Visual\n if (style.backgroundColor) css.backgroundColor = style.backgroundColor\n if (style.borderRadius !== undefined)\n css.borderRadius = `${style.borderRadius}px`\n if (style.borderTopLeftRadius !== undefined)\n css.borderTopLeftRadius = `${style.borderTopLeftRadius}px`\n if (style.borderTopRightRadius !== undefined)\n css.borderTopRightRadius = `${style.borderTopRightRadius}px`\n if (style.borderBottomLeftRadius !== undefined)\n css.borderBottomLeftRadius = `${style.borderBottomLeftRadius}px`\n if (style.borderBottomRightRadius !== undefined)\n css.borderBottomRightRadius = `${style.borderBottomRightRadius}px`\n if (style.opacity !== undefined) css.opacity = style.opacity\n\n // Border\n if (style.borderWidth !== undefined)\n css.borderWidth = `${style.borderWidth}px`\n if (style.borderColor) css.borderColor = style.borderColor\n if (style.borderTopWidth !== undefined)\n css.borderTopWidth = `${style.borderTopWidth}px`\n if (style.borderRightWidth !== undefined)\n css.borderRightWidth = `${style.borderRightWidth}px`\n if (style.borderBottomWidth !== undefined)\n css.borderBottomWidth = `${style.borderBottomWidth}px`\n if (style.borderLeftWidth !== undefined)\n css.borderLeftWidth = `${style.borderLeftWidth}px`\n\n // Position\n if (style.position) css.position = style.position\n if (style.top !== undefined) css.top = `${style.top}px`\n if (style.right !== undefined) css.right = `${style.right}px`\n if (style.bottom !== undefined) css.bottom = `${style.bottom}px`\n if (style.left !== undefined) css.left = `${style.left}px`\n if (style.zIndex !== undefined) css.zIndex = style.zIndex\n\n // Transform\n if (style.transform) css.transform = style.transform\n\n // Text-specific (if TextStyle)\n const textStyle = style as TextStyle\n if (textStyle.color) css.color = textStyle.color\n if (textStyle.fontSize !== undefined) css.fontSize = `${textStyle.fontSize}px`\n if (textStyle.fontWeight) css.fontWeight = textStyle.fontWeight\n if (textStyle.fontFamily) css.fontFamily = textStyle.fontFamily\n if (textStyle.fontStyle) css.fontStyle = textStyle.fontStyle\n if (textStyle.textAlign) css.textAlign = textStyle.textAlign\n if (textStyle.textDecoration) css.textDecoration = textStyle.textDecoration\n if (textStyle.lineHeight !== undefined)\n css.lineHeight = `${textStyle.lineHeight}px`\n if (textStyle.letterSpacing !== undefined)\n css.letterSpacing = `${textStyle.letterSpacing}px`\n\n return css\n}\n","/**\n * Canvas utilities\n */\n\nimport { isSignal as coreIsSignal } from '../../core/signal'\nimport type { Signal } from '../../core/signal'\n\n/**\n * Check if a value is a Signal\n */\nexport function isSignal<T>(value: T | Signal<T>): value is Signal<T> {\n // Use core isSignal which checks for SIGNAL_MARKER symbol\n // Signals are functions with properties, not plain objects\n return coreIsSignal(value)\n}\n\n/**\n * Unwrap a value that might be a Signal\n */\nexport function unwrapSignal<T>(value: T | Signal<T>): T {\n // Check for real signals first (have SIGNAL_MARKER)\n if (isSignal(value)) {\n return value.value\n }\n // Handle signal-like objects (for testing) - duck typing\n // Check if it's an object with a 'value' property\n if (\n value !== null &&\n typeof value === 'object' &&\n 'value' in value &&\n 'peek' in value\n ) {\n return (value as any).value\n }\n return value\n}\n","/**\n * Canvas renderer - renders canvas primitives to canvas context\n */\n\nimport type {\n DrawRectProps,\n DrawCircleProps,\n DrawPathProps,\n DrawTextProps,\n DrawLineProps,\n DrawArcProps,\n} from '../types'\nimport { unwrapSignal } from './utils'\n\n/**\n * Render canvas children to context\n */\nexport function renderCanvasChildren(\n ctx: CanvasRenderingContext2D,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n children: any,\n _width: number,\n _height: number\n): void {\n if (!children) return\n\n const childArray = Array.isArray(children) ? children : [children]\n\n for (const child of childArray) {\n if (!child || !child.type) continue\n\n switch (child.type) {\n case 'canvas-rect':\n renderRect(ctx, child.props)\n break\n case 'canvas-circle':\n renderCircle(ctx, child.props)\n break\n case 'canvas-path':\n renderPath(ctx, child.props)\n break\n case 'canvas-text':\n renderText(ctx, child.props)\n break\n case 'canvas-line':\n renderLine(ctx, child.props)\n break\n case 'canvas-arc':\n renderArc(ctx, child.props)\n break\n }\n }\n}\n\n/**\n * Render rectangle\n */\nfunction renderRect(ctx: CanvasRenderingContext2D, props: DrawRectProps): void {\n const x = unwrapSignal(props.x)\n const y = unwrapSignal(props.y)\n const width = unwrapSignal(props.width)\n const height = unwrapSignal(props.height)\n const fill = unwrapSignal(props.fill)\n const stroke = unwrapSignal(props.stroke)\n const strokeWidth = unwrapSignal(props.strokeWidth)\n const opacity = unwrapSignal(props.opacity)\n\n ctx.save()\n\n if (opacity !== undefined) {\n ctx.globalAlpha = opacity\n }\n\n if (fill) {\n ctx.fillStyle = fill\n ctx.fillRect(x, y, width, height)\n }\n\n if (stroke) {\n ctx.strokeStyle = stroke\n ctx.lineWidth = strokeWidth || 1\n ctx.strokeRect(x, y, width, height)\n }\n\n ctx.restore()\n}\n\n/**\n * Render circle\n */\nfunction renderCircle(\n ctx: CanvasRenderingContext2D,\n props: DrawCircleProps\n): void {\n const x = unwrapSignal(props.x)\n const y = unwrapSignal(props.y)\n const radius = unwrapSignal(props.radius)\n const fill = unwrapSignal(props.fill)\n const stroke = unwrapSignal(props.stroke)\n const strokeWidth = unwrapSignal(props.strokeWidth)\n const opacity = unwrapSignal(props.opacity)\n\n ctx.save()\n\n if (opacity !== undefined) {\n ctx.globalAlpha = opacity\n }\n\n ctx.beginPath()\n ctx.arc(x, y, radius, 0, 2 * Math.PI)\n\n if (fill) {\n ctx.fillStyle = fill\n ctx.fill()\n }\n\n if (stroke) {\n ctx.strokeStyle = stroke\n ctx.lineWidth = strokeWidth || 1\n ctx.stroke()\n }\n\n ctx.restore()\n}\n\n/**\n * Render path\n */\nfunction renderPath(ctx: CanvasRenderingContext2D, props: DrawPathProps): void {\n const d = unwrapSignal(props.d)\n const fill = unwrapSignal(props.fill)\n const stroke = unwrapSignal(props.stroke)\n const strokeWidth = unwrapSignal(props.strokeWidth)\n const opacity = unwrapSignal(props.opacity)\n\n ctx.save()\n\n if (opacity !== undefined) {\n ctx.globalAlpha = opacity\n }\n\n // Parse SVG path (simplified - only supports basic commands)\n const path = new Path2D(d)\n\n if (fill) {\n ctx.fillStyle = fill\n ctx.fill(path)\n }\n\n if (stroke) {\n ctx.strokeStyle = stroke\n ctx.lineWidth = strokeWidth || 1\n ctx.stroke(path)\n }\n\n ctx.restore()\n}\n\n/**\n * Render text\n */\nfunction renderText(ctx: CanvasRenderingContext2D, props: DrawTextProps): void {\n const x = unwrapSignal(props.x)\n const y = unwrapSignal(props.y)\n const text = unwrapSignal(props.text)\n const fill = unwrapSignal(props.fill)\n const fontSize = unwrapSignal(props.fontSize) || 12\n const fontFamily = unwrapSignal(props.fontFamily) || 'sans-serif'\n const fontWeight = unwrapSignal(props.fontWeight) || 'normal'\n const textAlign = unwrapSignal(props.textAlign) || 'left'\n const textBaseline = unwrapSignal(props.textBaseline) || 'alphabetic'\n\n ctx.save()\n\n ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`\n ctx.textAlign = textAlign\n ctx.textBaseline = textBaseline\n\n if (fill) {\n ctx.fillStyle = fill\n ctx.fillText(text, x, y)\n }\n\n ctx.restore()\n}\n\n/**\n * Render line\n */\nfunction renderLine(ctx: CanvasRenderingContext2D, props: DrawLineProps): void {\n const x1 = unwrapSignal(props.x1)\n const y1 = unwrapSignal(props.y1)\n const x2 = unwrapSignal(props.x2)\n const y2 = unwrapSignal(props.y2)\n const stroke = unwrapSignal(props.stroke) || 'black'\n const strokeWidth = unwrapSignal(props.strokeWidth) || 1\n const opacity = unwrapSignal(props.opacity)\n\n ctx.save()\n\n if (opacity !== undefined) {\n ctx.globalAlpha = opacity\n }\n\n ctx.beginPath()\n ctx.moveTo(x1, y1)\n ctx.lineTo(x2, y2)\n\n ctx.strokeStyle = stroke\n ctx.lineWidth = strokeWidth\n ctx.stroke()\n\n ctx.restore()\n}\n\n/**\n * Render arc\n */\nfunction renderArc(ctx: CanvasRenderingContext2D, props: DrawArcProps): void {\n const x = unwrapSignal(props.x)\n const y = unwrapSignal(props.y)\n const radius = unwrapSignal(props.radius)\n const startAngle = unwrapSignal(props.startAngle)\n const endAngle = unwrapSignal(props.endAngle)\n const counterclockwise = unwrapSignal(props.counterclockwise) || false\n const fill = unwrapSignal(props.fill)\n const stroke = unwrapSignal(props.stroke)\n const strokeWidth = unwrapSignal(props.strokeWidth)\n const opacity = unwrapSignal(props.opacity)\n\n ctx.save()\n\n if (opacity !== undefined) {\n ctx.globalAlpha = opacity\n }\n\n ctx.beginPath()\n ctx.arc(x, y, radius, startAngle, endAngle, counterclockwise)\n\n if (fill) {\n ctx.fillStyle = fill\n ctx.fill()\n }\n\n if (stroke) {\n ctx.strokeStyle = stroke\n ctx.lineWidth = strokeWidth || 1\n ctx.stroke()\n }\n\n ctx.restore()\n}\n","/**\n * Canvas - Declarative canvas container with JSX drawing\n *\n * Supports Signal-based reactive rendering\n *\n * @example\n * ```tsx\n * const x = signal(50)\n *\n * <Canvas width={300} height={200}>\n * <Rect x={x} y={50} width={100} height={50} fill=\"blue\" />\n * <Circle x={150} y={100} radius={30} fill=\"red\" />\n * </Canvas>\n * ```\n */\n\nimport type { FNode } from '../../types'\nimport type { CanvasProps } from '../types'\nimport { normalizeStyle } from '../utils'\nimport { renderCanvasChildren } from './renderer'\n\nexport function Canvas(props: CanvasProps): FNode {\n const { width, height, children, style, id, ...rest } = props\n\n return {\n type: 'canvas',\n props: {\n ...rest,\n id,\n width,\n height,\n style: normalizeStyle(style),\n // Attach canvas renderer when element is mounted\n ref: (canvas: HTMLCanvasElement | null) => {\n if (!canvas) return\n\n // SSR guard: skip canvas rendering on server\n if (typeof requestAnimationFrame === 'undefined') return\n\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n // Render canvas children with effect for reactivity\n // Import effect and onCleanup dynamically to avoid circular deps\n import('../../core/signal')\n .then(({ effect, onCleanup, isSignal }) => {\n let rafId: number | undefined\n\n const scheduleRender = () => {\n if (rafId !== undefined) {\n cancelAnimationFrame(rafId)\n }\n\n rafId = requestAnimationFrame(() => {\n // Clear canvas\n ctx.clearRect(0, 0, width, height)\n\n // Render all children\n renderCanvasChildren(ctx, children, width, height)\n\n rafId = undefined\n })\n }\n\n effect(() => {\n // To track signal dependencies, we need to access them in the effect\n // Walk through children and touch any signals to track dependencies\n const childArray = Array.isArray(children) ? children : [children]\n for (const child of childArray) {\n if (child && child.props) {\n // Touch each prop to track signal dependencies\n for (const key in child.props) {\n const value = child.props[key]\n // If it's a signal, access its value to track it\n if (isSignal(value)) {\n void value.value // Touch the signal to track dependency\n }\n }\n }\n }\n\n // Now schedule the actual render\n scheduleRender()\n\n // Cleanup RAF when effect is disposed\n onCleanup(() => {\n if (rafId !== undefined) {\n cancelAnimationFrame(rafId)\n rafId = undefined\n }\n })\n })\n })\n .catch((err) => {\n console.error('[Flexium Canvas] Failed to load signal module:', err)\n })\n },\n },\n children: [],\n }\n}\n","/**\n * DrawRect - Canvas rectangle primitive\n *\n * @example\n * ```tsx\n * <DrawRect x={10} y={10} width={100} height={50} fill=\"blue\" />\n * ```\n */\n\nimport type { FNode } from '../../types'\nimport type { DrawRectProps } from '../types'\n\nexport function DrawRect(props: DrawRectProps): FNode {\n return {\n type: 'canvas-rect',\n props,\n children: [],\n }\n}\n","/**\n * DrawCircle - Canvas circle primitive\n *\n * @example\n * ```tsx\n * <DrawCircle x={100} y={100} radius={50} fill=\"red\" />\n * ```\n */\n\nimport type { FNode } from '../../types'\nimport type { DrawCircleProps } from '../types'\n\nexport function DrawCircle(props: DrawCircleProps): FNode {\n return {\n type: 'canvas-circle',\n props,\n children: [],\n }\n}\n","/**\n * DrawArc - Canvas arc primitive\n *\n * @example\n * ```tsx\n * <DrawArc x={100} y={100} radius={50} startAngle={0} endAngle={Math.PI} fill=\"green\" />\n * ```\n */\n\nimport type { FNode } from '../../types'\nimport type { DrawArcProps } from '../types'\n\nexport function DrawArc(props: DrawArcProps): FNode {\n return {\n type: 'canvas-arc',\n props,\n children: [],\n }\n}\n","/**\n * DrawLine - Canvas line primitive\n *\n * @example\n * ```tsx\n * <DrawLine x1={10} y1={10} x2={100} y2={100} stroke=\"black\" strokeWidth={2} />\n * ```\n */\n\nimport type { FNode } from '../../types'\nimport type { DrawLineProps } from '../types'\n\nexport function DrawLine(props: DrawLineProps): FNode {\n return {\n type: 'canvas-line',\n props,\n children: [],\n }\n}\n","/**\n * DrawPath - Canvas path primitive\n *\n * @example\n * ```tsx\n * <DrawPath d=\"M 10 10 L 100 100\" stroke=\"black\" strokeWidth={2} />\n * ```\n */\n\nimport type { FNode } from '../../types'\nimport type { DrawPathProps } from '../types'\n\nexport function DrawPath(props: DrawPathProps): FNode {\n return {\n type: 'canvas-path',\n props,\n children: [],\n }\n}\n","/**\n * DrawText - Canvas text primitive\n *\n * @example\n * ```tsx\n * <DrawText x={50} y={50} text=\"Hello Canvas\" fontSize={20} fill=\"black\" />\n * ```\n */\n\nimport type { FNode } from '../../types'\nimport type { DrawTextProps } from '../types'\n\nexport function DrawText(props: DrawTextProps): FNode {\n return {\n type: 'canvas-text',\n props,\n children: [],\n }\n}\n"]}
|
package/dist/core.d.cts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export { A as AsyncStatus, S as StateAction, b as StateKey, c as StateOptions, a as StateValue, _ as state } from './state-kK9sQh9s.cjs';
|
|
2
|
+
export { d as batch, e as effect, o as onCleanup, b as onMount, r as root, u as untrack } from './signal-mNtlF8-v.cjs';
|
|
3
|
+
import { a as FNodeChild } from './renderer-DSLb-FGg.cjs';
|
|
4
|
+
|
|
5
|
+
interface Context<T> {
|
|
6
|
+
id: symbol;
|
|
7
|
+
Provider: (props: {
|
|
8
|
+
value: T;
|
|
9
|
+
children: FNodeChild;
|
|
10
|
+
}) => FNodeChild;
|
|
11
|
+
defaultValue: T;
|
|
12
|
+
}
|
|
13
|
+
declare function createContext<T>(defaultValue: T): Context<T>;
|
|
14
|
+
/**
|
|
15
|
+
* Get the current value from a context.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* const theme = context(ThemeContext)
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
declare function context<T>(ctx: Context<T>): T;
|
|
23
|
+
|
|
24
|
+
export { type Context, context, createContext };
|
package/dist/core.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export { A as AsyncStatus, S as StateAction, b as StateKey, c as StateOptions, a as StateValue, _ as state } from './state-kK9sQh9s.js';
|
|
2
|
+
export { d as batch, e as effect, o as onCleanup, b as onMount, r as root, u as untrack } from './signal-mNtlF8-v.js';
|
|
3
|
+
import { a as FNodeChild } from './renderer-DSLb-FGg.js';
|
|
4
|
+
|
|
5
|
+
interface Context<T> {
|
|
6
|
+
id: symbol;
|
|
7
|
+
Provider: (props: {
|
|
8
|
+
value: T;
|
|
9
|
+
children: FNodeChild;
|
|
10
|
+
}) => FNodeChild;
|
|
11
|
+
defaultValue: T;
|
|
12
|
+
}
|
|
13
|
+
declare function createContext<T>(defaultValue: T): Context<T>;
|
|
14
|
+
/**
|
|
15
|
+
* Get the current value from a context.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* const theme = context(ThemeContext)
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
declare function context<T>(ctx: Context<T>): T;
|
|
23
|
+
|
|
24
|
+
export { type Context, context, createContext };
|
package/dist/core.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkCNY6FPKJ_js=require('./chunk-CNY6FPKJ.js'),chunkI7UCVARB_js=require('./chunk-I7UCVARB.js'),chunkROYFUJN5_js=require('./chunk-ROYFUJN5.js');Object.defineProperty(exports,"context",{enumerable:true,get:function(){return chunkCNY6FPKJ_js.b}});Object.defineProperty(exports,"createContext",{enumerable:true,get:function(){return chunkCNY6FPKJ_js.a}});Object.defineProperty(exports,"state",{enumerable:true,get:function(){return chunkI7UCVARB_js.f}});Object.defineProperty(exports,"batch",{enumerable:true,get:function(){return chunkROYFUJN5_js.l}});Object.defineProperty(exports,"effect",{enumerable:true,get:function(){return chunkROYFUJN5_js.j}});Object.defineProperty(exports,"onCleanup",{enumerable:true,get:function(){return chunkROYFUJN5_js.o}});Object.defineProperty(exports,"onMount",{enumerable:true,get:function(){return chunkROYFUJN5_js.g}});Object.defineProperty(exports,"root",{enumerable:true,get:function(){return chunkROYFUJN5_js.m}});Object.defineProperty(exports,"untrack",{enumerable:true,get:function(){return chunkROYFUJN5_js.k}});//# sourceMappingURL=core.js.map
|
|
2
|
+
//# sourceMappingURL=core.js.map
|
package/dist/core.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"core.js"}
|
package/dist/core.mjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export{b as context,a as createContext}from'./chunk-CZYIK6FD.mjs';export{f as state}from'./chunk-2U4DW375.mjs';export{l as batch,j as effect,o as onCleanup,g as onMount,m as root,k as untrack}from'./chunk-5S3ZQ2LB.mjs';//# sourceMappingURL=core.mjs.map
|
|
2
|
+
//# sourceMappingURL=core.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"core.mjs"}
|
package/dist/dom.d.cts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export { e as effect, r as root } from './signal-mNtlF8-v.cjs';
|
|
2
|
+
export { _ as state } from './state-kK9sQh9s.cjs';
|
|
3
|
+
export { D as DOMRenderer, F as Fragment, P as Portal, a as createReactiveRoot, c as createRoot, d as domRenderer, f, m as mountReactive, r as render } from './portal-BpcIlK9y.cjs';
|
|
4
|
+
export { C as CommonProps, R as Renderer } from './renderer-DSLb-FGg.cjs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Hydration options
|
|
8
|
+
*/
|
|
9
|
+
interface HydrateOptions {
|
|
10
|
+
/** Called when hydration encounters a mismatch */
|
|
11
|
+
onMismatch?: (message: string, domNode: Node | null, vnode: any) => void;
|
|
12
|
+
/** Whether to recover from mismatches by re-rendering */
|
|
13
|
+
recoverMismatch?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Hydrate server-rendered HTML with client-side interactivity
|
|
17
|
+
*
|
|
18
|
+
* This function walks the existing DOM tree and attaches event handlers,
|
|
19
|
+
* sets up signal bindings, and validates that the DOM matches the expected vnode structure.
|
|
20
|
+
*
|
|
21
|
+
* @param vnode - Virtual node to hydrate against
|
|
22
|
+
* @param container - Container element with server-rendered HTML
|
|
23
|
+
* @param options - Hydration options
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* // Server rendered HTML in #app
|
|
28
|
+
* hydrate(<App />, document.getElementById('app'));
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
declare function hydrate(vnode: any, container: Element, options?: HydrateOptions): void;
|
|
32
|
+
declare global {
|
|
33
|
+
const __DEV__: boolean | undefined;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { hydrate };
|
package/dist/dom.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export { e as effect, r as root } from './signal-mNtlF8-v.js';
|
|
2
|
+
export { _ as state } from './state-kK9sQh9s.js';
|
|
3
|
+
export { D as DOMRenderer, F as Fragment, P as Portal, a as createReactiveRoot, c as createRoot, d as domRenderer, f, m as mountReactive, r as render } from './portal-DBwz7gD0.js';
|
|
4
|
+
export { C as CommonProps, R as Renderer } from './renderer-DSLb-FGg.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Hydration options
|
|
8
|
+
*/
|
|
9
|
+
interface HydrateOptions {
|
|
10
|
+
/** Called when hydration encounters a mismatch */
|
|
11
|
+
onMismatch?: (message: string, domNode: Node | null, vnode: any) => void;
|
|
12
|
+
/** Whether to recover from mismatches by re-rendering */
|
|
13
|
+
recoverMismatch?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Hydrate server-rendered HTML with client-side interactivity
|
|
17
|
+
*
|
|
18
|
+
* This function walks the existing DOM tree and attaches event handlers,
|
|
19
|
+
* sets up signal bindings, and validates that the DOM matches the expected vnode structure.
|
|
20
|
+
*
|
|
21
|
+
* @param vnode - Virtual node to hydrate against
|
|
22
|
+
* @param container - Container element with server-rendered HTML
|
|
23
|
+
* @param options - Hydration options
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* // Server rendered HTML in #app
|
|
28
|
+
* hydrate(<App />, document.getElementById('app'));
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
declare function hydrate(vnode: any, container: Element, options?: HydrateOptions): void;
|
|
32
|
+
declare global {
|
|
33
|
+
const __DEV__: boolean | undefined;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { hydrate };
|
package/dist/dom.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkREETNY2Z_js=require('./chunk-REETNY2Z.js');require('./chunk-CNY6FPKJ.js');var chunkI7UCVARB_js=require('./chunk-I7UCVARB.js'),chunkQ7IWDVJ4_js=require('./chunk-Q7IWDVJ4.js');require('./chunk-WQFQO5LK.js');var chunkROYFUJN5_js=require('./chunk-ROYFUJN5.js');var b={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 T(t,e,a={}){let{onMismatch:r,recoverMismatch:n=false}=a,i=(s,l,p)=>{r?r(s,l,p):typeof __DEV__<"u"&&__DEV__&&console.warn(`[Flexium Hydration] ${s}`);};c(t,e.firstChild,{handleMismatch:i,recoverMismatch:n});}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 r=String(t);return e.textContent!==r&&(a.handleMismatch(`Text mismatch: "${e.textContent}" vs "${r}"`,e,t),e.textContent=r),e.nextSibling}else return a.handleMismatch(`Expected text node, got ${e.nodeType}`,e,t),e.nextSibling;if(chunkROYFUJN5_js.n(t)&&e.nodeType===Node.TEXT_NODE)return chunkROYFUJN5_js.j(()=>{e.textContent=String(t.value);}),e.nextSibling;if(typeof t=="function")return chunkROYFUJN5_js.j(()=>{let r=t();e.nodeType===Node.TEXT_NODE&&(e.textContent=String(r));}),e.nextSibling;if(typeof t.type=="function"){let r=t.type({...t.props,children:t.children});return c(r,e,a)}if(t.type==="fragment"||t.type===null){let r=e,n=t.children||[];for(let i of n)r=c(i,r,a);return r}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 r=e,n=r.tagName.toLowerCase();if(n!==t.type.toLowerCase())return a.handleMismatch(`Tag mismatch: "${n}" vs "${t.type}"`,e,t),e.nextSibling;t.props&&S(r,t.props,a);let i=r.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 r.nextSibling}return e?.nextSibling||null}function S(t,e,a){for(let r in e){let n=e[r];if(r==="children"||r==="key"||r==="ref"){r==="ref"&&typeof n=="function"&&n(t);continue}if(r.startsWith("on")){let i=r.slice(2).toLowerCase();t.addEventListener(i,n);continue}if(chunkROYFUJN5_js.n(n)){let i=r==="className"?"class":r;chunkROYFUJN5_js.j(()=>{if(i==="class")t.setAttribute("class",String(n.value));else if(i==="style"&&typeof n.value=="object")Object.assign(t.style,n.value);else {let s=b[i]||i;i in t&&!(t instanceof SVGElement)?t[i]=n.value:t.setAttribute(s,String(n.value));}});continue}if(typeof __DEV__<"u"&&__DEV__&&(r==="className"||r==="class")){let i=t.getAttribute("class")||"";i!==n&&a.handleMismatch(`Class mismatch on <${t.tagName.toLowerCase()}>: "${i}" vs "${n}"`,t,e);}}}Object.defineProperty(exports,"DOMRenderer",{enumerable:true,get:function(){return chunkREETNY2Z_js.a}});Object.defineProperty(exports,"Portal",{enumerable:true,get:function(){return chunkREETNY2Z_js.i}});Object.defineProperty(exports,"createReactiveRoot",{enumerable:true,get:function(){return chunkREETNY2Z_js.f}});Object.defineProperty(exports,"createRoot",{enumerable:true,get:function(){return chunkREETNY2Z_js.h}});Object.defineProperty(exports,"domRenderer",{enumerable:true,get:function(){return chunkREETNY2Z_js.b}});Object.defineProperty(exports,"mountReactive",{enumerable:true,get:function(){return chunkREETNY2Z_js.e}});Object.defineProperty(exports,"render",{enumerable:true,get:function(){return chunkREETNY2Z_js.g}});Object.defineProperty(exports,"state",{enumerable:true,get:function(){return chunkI7UCVARB_js.f}});Object.defineProperty(exports,"Fragment",{enumerable:true,get:function(){return chunkQ7IWDVJ4_js.b}});Object.defineProperty(exports,"f",{enumerable:true,get:function(){return chunkQ7IWDVJ4_js.a}});Object.defineProperty(exports,"effect",{enumerable:true,get:function(){return chunkROYFUJN5_js.j}});Object.defineProperty(exports,"root",{enumerable:true,get:function(){return chunkROYFUJN5_js.m}});exports.hydrate=T;//# sourceMappingURL=dom.js.map
|
|
2
|
+
//# sourceMappingURL=dom.js.map
|
package/dist/dom.js.map
ADDED
|
@@ -0,0 +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.js","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/dom.mjs
ADDED
|
@@ -0,0 +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-EX2GURH5.mjs';import'./chunk-CZYIK6FD.mjs';export{f as state}from'./chunk-2U4DW375.mjs';export{b as Fragment,a as f}from'./chunk-WVEJT7HD.mjs';import'./chunk-KNF5ERPK.mjs';import {n,j}from'./chunk-5S3ZQ2LB.mjs';export{j as effect,m as root}from'./chunk-5S3ZQ2LB.mjs';var b={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 T(t,e,a={}){let{onMismatch:r,recoverMismatch:n=false}=a,i=(s,l,p)=>{r?r(s,l,p):typeof __DEV__<"u"&&__DEV__&&console.warn(`[Flexium Hydration] ${s}`);};c(t,e.firstChild,{handleMismatch:i,recoverMismatch:n});}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 r=String(t);return e.textContent!==r&&(a.handleMismatch(`Text mismatch: "${e.textContent}" vs "${r}"`,e,t),e.textContent=r),e.nextSibling}else return a.handleMismatch(`Expected text node, got ${e.nodeType}`,e,t),e.nextSibling;if(n(t)&&e.nodeType===Node.TEXT_NODE)return j(()=>{e.textContent=String(t.value);}),e.nextSibling;if(typeof t=="function")return j(()=>{let r=t();e.nodeType===Node.TEXT_NODE&&(e.textContent=String(r));}),e.nextSibling;if(typeof t.type=="function"){let r=t.type({...t.props,children:t.children});return c(r,e,a)}if(t.type==="fragment"||t.type===null){let r=e,n=t.children||[];for(let i of n)r=c(i,r,a);return r}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 r=e,n=r.tagName.toLowerCase();if(n!==t.type.toLowerCase())return a.handleMismatch(`Tag mismatch: "${n}" vs "${t.type}"`,e,t),e.nextSibling;t.props&&S(r,t.props,a);let i=r.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 r.nextSibling}return e?.nextSibling||null}function S(t,e,a){for(let r in e){let n$1=e[r];if(r==="children"||r==="key"||r==="ref"){r==="ref"&&typeof n$1=="function"&&n$1(t);continue}if(r.startsWith("on")){let i=r.slice(2).toLowerCase();t.addEventListener(i,n$1);continue}if(n(n$1)){let i=r==="className"?"class":r;j(()=>{if(i==="class")t.setAttribute("class",String(n$1.value));else if(i==="style"&&typeof n$1.value=="object")Object.assign(t.style,n$1.value);else {let s=b[i]||i;i in t&&!(t instanceof SVGElement)?t[i]=n$1.value:t.setAttribute(s,String(n$1.value));}});continue}if(typeof __DEV__<"u"&&__DEV__&&(r==="className"||r==="class")){let i=t.getAttribute("class")||"";i!==n$1&&a.handleMismatch(`Class mismatch on <${t.tagName.toLowerCase()}>: "${i}" vs "${n$1}"`,t,e);}}}export{T as hydrate};//# sourceMappingURL=dom.mjs.map
|
|
2
|
+
//# sourceMappingURL=dom.mjs.map
|
package/dist/dom.mjs.map
ADDED
|
@@ -0,0 +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"]}
|