@wsxjs/wsx-core 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/LICENSE +21 -0
  2. package/dist/chunk-3CJEWYVF.mjs +197 -0
  3. package/dist/chunk-5JVEHB6H.mjs +197 -0
  4. package/dist/chunk-7E7KJQSW.mjs +210 -0
  5. package/dist/chunk-A5GYVTI3.mjs +222 -0
  6. package/dist/chunk-A5GYVTI3.mjs.map +1 -0
  7. package/dist/chunk-BV2V6BVN.mjs +221 -0
  8. package/dist/chunk-K6N3JDTI.mjs +216 -0
  9. package/dist/chunk-RVGKV4GP.mjs +79 -0
  10. package/dist/chunk-S3O776FY.mjs +173 -0
  11. package/dist/chunk-VNK4B3FW.mjs +217 -0
  12. package/dist/chunk-YNUVFDKT.mjs +222 -0
  13. package/dist/chunk-YNUVFDKT.mjs.map +1 -0
  14. package/dist/index.d.mts +235 -0
  15. package/dist/index.d.ts +235 -0
  16. package/dist/index.js +755 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/index.mjs +524 -0
  19. package/dist/index.mjs.map +1 -0
  20. package/dist/jsx-factory-pFUwL2Dz.d.mts +26 -0
  21. package/dist/jsx-factory-pFUwL2Dz.d.ts +26 -0
  22. package/dist/jsx-pFUwL2Dz.d.mts +26 -0
  23. package/dist/jsx-pFUwL2Dz.d.ts +26 -0
  24. package/dist/jsx-runtime-pFUwL2Dz.d.mts +26 -0
  25. package/dist/jsx-runtime-pFUwL2Dz.d.ts +26 -0
  26. package/dist/jsx-runtime.d.mts +1 -0
  27. package/dist/jsx-runtime.d.ts +1 -0
  28. package/dist/jsx-runtime.js +248 -0
  29. package/dist/jsx-runtime.js.map +1 -0
  30. package/dist/jsx-runtime.mjs +10 -0
  31. package/dist/jsx-runtime.mjs.map +1 -0
  32. package/dist/jsx.d.mts +66 -0
  33. package/dist/jsx.d.ts +66 -0
  34. package/dist/jsx.js +224 -0
  35. package/dist/jsx.js.map +1 -0
  36. package/dist/jsx.mjs +8 -0
  37. package/dist/jsx.mjs.map +1 -0
  38. package/package.json +49 -0
  39. package/src/auto-register.ts +149 -0
  40. package/src/index.ts +17 -0
  41. package/src/jsx-factory.ts +222 -0
  42. package/src/jsx-runtime.ts +6 -0
  43. package/src/jsx.ts +90 -0
  44. package/src/reactive-component.ts +171 -0
  45. package/src/styles/style-manager.ts +54 -0
  46. package/src/utils/logger.ts +69 -0
  47. package/src/utils/reactive.ts +214 -0
  48. package/src/utils/svg-utils.ts +184 -0
  49. package/src/web-component.ts +250 -0
  50. package/types/css-inline.d.ts +4 -0
  51. package/types/index.d.ts +32 -0
  52. package/types/jsx-runtime.d.ts +2 -0
  53. package/types/jsx.d.ts +28 -0
  54. package/types/wsx-types.d.ts +43 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/styles/style-manager.ts","../src/web-component.ts","../src/auto-register.ts","../src/utils/logger.ts","../src/utils/reactive.ts","../src/reactive-component.ts"],"sourcesContent":["/**\n * Style Manager for TextColorTool Components\n *\n * This class manages CSS styles for Web Components using modern techniques:\n * 1. CSS imports with Vite/bundler support\n * 2. Constructable StyleSheets for better performance\n * 3. Shared style sheets across component instances\n */\n\nexport class StyleManager {\n private static styleSheets: Map<string, CSSStyleSheet> = new Map();\n\n /**\n * Create or get a cached CSSStyleSheet for a component\n */\n static getStyleSheet(componentName: string, cssText: string): CSSStyleSheet {\n if (this.styleSheets.has(componentName)) {\n return this.styleSheets.get(componentName) as CSSStyleSheet;\n }\n\n // Check if browser supports constructable stylesheets\n if (\"adoptedStyleSheets\" in Document.prototype && \"CSSStyleSheet\" in window) {\n const styleSheet = new CSSStyleSheet();\n styleSheet.replaceSync(cssText);\n this.styleSheets.set(componentName, styleSheet);\n return styleSheet;\n } else {\n // Fallback for older browsers - this won't be cached but works\n throw new Error(\"Constructable StyleSheets not supported. Use fallback method.\");\n }\n }\n\n /**\n * Apply styles to a shadow root using constructable stylesheets\n */\n static applyStyles(shadowRoot: ShadowRoot, componentName: string, cssText: string): void {\n try {\n const styleSheet = this.getStyleSheet(componentName, cssText);\n shadowRoot.adoptedStyleSheets = [styleSheet];\n } catch {\n // Fallback to traditional <style> element\n this.applyStylesFallback(shadowRoot, cssText);\n }\n }\n\n /**\n * Fallback method for browsers that don't support constructable stylesheets\n */\n static applyStylesFallback(shadowRoot: ShadowRoot, cssText: string): void {\n const style = document.createElement(\"style\");\n style.textContent = cssText;\n shadowRoot.appendChild(style);\n }\n}\n","/**\n * 通用 WSX Web Component 基础抽象类\n *\n * 提供JSX + CSS文件支持的通用基础类:\n * - 抽象render方法强制子类实现JSX渲染\n * - 自动集成StyleManager处理外部CSS\n * - 提供完整的Web Component生命周期\n * - 完全通用,不依赖任何特定框架\n */\n\nimport { h, type JSXChildren } from \"./jsx-factory\";\nimport { StyleManager } from \"./styles/style-manager\";\n\n/**\n * Web Component 配置接口\n */\nexport interface WebComponentConfig {\n styles?: string; // CSS内容\n styleName?: string; // 样式名称,用于缓存\n [key: string]: unknown;\n}\n\n/**\n * 通用 WSX Web Component 基础抽象类\n */\nexport abstract class WebComponent extends HTMLElement {\n declare shadowRoot: ShadowRoot;\n protected config: WebComponentConfig;\n protected connected: boolean = false;\n\n /**\n * 子类应该重写这个方法来定义观察的属性\n * @returns 要观察的属性名数组\n */\n static get observedAttributes(): string[] {\n return [];\n }\n\n constructor(config: WebComponentConfig = {}) {\n super();\n\n this.config = config;\n this.attachShadow({ mode: \"open\" });\n\n // 自动应用CSS样式\n if (config.styles) {\n const styleName = config.styleName || this.constructor.name;\n StyleManager.applyStyles(this.shadowRoot, styleName, config.styles);\n }\n }\n\n /**\n * 抽象方法:子类必须实现JSX渲染\n *\n * @returns JSX元素\n */\n abstract render(): HTMLElement;\n\n /**\n * Web Component生命周期:连接到DOM\n */\n connectedCallback(): void {\n this.connected = true;\n try {\n // 渲染JSX内容到Shadow DOM\n const content = this.render();\n this.shadowRoot.appendChild(content);\n\n // 调用子类的初始化钩子\n this.onConnected?.();\n } catch (error) {\n console.error(`[${this.constructor.name}] Error in connectedCallback:`, error);\n this.renderError(error);\n }\n }\n\n /**\n * Web Component生命周期:从DOM断开\n */\n disconnectedCallback(): void {\n this.onDisconnected?.();\n }\n\n /**\n * Web Component生命周期:属性变化\n */\n attributeChangedCallback(name: string, oldValue: string, newValue: string): void {\n this.onAttributeChanged?.(name, oldValue, newValue);\n }\n\n /**\n * 可选生命周期钩子:组件已连接\n */\n protected onConnected?(): void;\n\n /**\n * 可选生命周期钩子:组件已断开\n */\n protected onDisconnected?(): void;\n\n /**\n * 可选生命周期钩子:属性已更改\n */\n protected onAttributeChanged?(name: string, oldValue: string, newValue: string): void;\n\n /**\n * 查找Shadow DOM内的元素\n *\n * @param selector - CSS选择器\n * @returns 元素或null\n */\n public querySelector<T extends HTMLElement>(selector: string): T | null {\n return this.shadowRoot.querySelector<T>(selector);\n }\n\n /**\n * 查找Shadow DOM内的所有匹配元素\n *\n * @param selector - CSS选择器\n * @returns 元素列表\n */\n public querySelectorAll<T extends HTMLElement>(selector: string): NodeListOf<T> {\n return this.shadowRoot.querySelectorAll<T>(selector);\n }\n\n /**\n * 重新渲染组件\n */\n protected rerender(): void {\n if (!this.connected) {\n console.warn(\n `[${this.constructor.name}] Component is not connected, skipping rerender.`\n );\n return;\n }\n // 保存当前的 adopted stylesheets (jsdom may not support this)\n const adoptedStyleSheets = this.shadowRoot.adoptedStyleSheets || [];\n\n // 清空现有内容但保留样式\n this.shadowRoot.innerHTML = \"\";\n\n // 恢复 adopted stylesheets (避免重新应用样式)\n if (this.shadowRoot.adoptedStyleSheets) {\n this.shadowRoot.adoptedStyleSheets = adoptedStyleSheets;\n }\n\n // 只有在没有 adopted stylesheets 时才重新应用样式\n if (adoptedStyleSheets.length === 0 && this.config.styles) {\n const styleName = this.config.styleName || this.constructor.name;\n StyleManager.applyStyles(this.shadowRoot, styleName, this.config.styles);\n }\n\n // 重新渲染JSX\n try {\n const content = this.render();\n this.shadowRoot.appendChild(content);\n } catch (error) {\n console.error(`[${this.constructor.name}] Error in rerender:`, error);\n this.renderError(error);\n }\n }\n\n /**\n * 渲染错误信息\n *\n * @param error - 错误对象\n */\n private renderError(error: unknown): void {\n // 清空现有内容\n this.shadowRoot.innerHTML = \"\";\n\n const errorElement = h(\n \"div\",\n {\n style: \"color: red; padding: 10px; border: 1px solid red; background: #ffe6e6; font-family: monospace;\",\n },\n [\n h(\"strong\", {}, `[${this.constructor.name}] Component Error:`),\n h(\"pre\", { style: \"margin: 10px 0; white-space: pre-wrap;\" }, String(error)),\n ]\n );\n\n this.shadowRoot.appendChild(errorElement);\n }\n\n /**\n * 获取配置值\n *\n * @param key - 配置键\n * @param defaultValue - 默认值\n * @returns 配置值\n */\n protected getConfig<T>(key: string, defaultValue?: T): T {\n return (this.config[key] as T) ?? (defaultValue as T);\n }\n\n /**\n * 设置配置值\n *\n * @param key - 配置键\n * @param value - 配置值\n */\n protected setConfig(key: string, value: unknown): void {\n this.config[key] = value;\n }\n\n /**\n * 获取属性值\n *\n * @param name - 属性名\n * @param defaultValue - 默认值\n * @returns 属性值\n */\n protected getAttr(name: string, defaultValue = \"\"): string {\n return this.getAttribute(name) || defaultValue;\n }\n\n /**\n * 设置属性值\n *\n * @param name - 属性名\n * @param value - 属性值\n */\n protected setAttr(name: string, value: string): void {\n this.setAttribute(name, value);\n }\n\n /**\n * 移除属性\n *\n * @param name - 属性名\n */\n protected removeAttr(name: string): void {\n this.removeAttribute(name);\n }\n\n /**\n * 检查是否有属性\n *\n * @param name - 属性名\n * @returns 是否存在\n */\n protected hasAttr(name: string): boolean {\n return this.hasAttribute(name);\n }\n}\n\n// 导出JSX助手\nexport { h };\nexport type { JSXChildren };\n","/**\n * Auto-registration decorator and utilities for web components\n *\n * Provides decorator-based auto-registration for web components\n * to eliminate manual customElements.define() calls.\n */\n\n/**\n * Auto-registration options for web components\n */\nexport interface AutoRegistrationOptions {\n tagName?: string; // Custom tag name, if not provided, derives from class name\n prefix?: string; // Prefix for tag name (e.g., \"my-\" -> \"my-component\")\n}\n\n/**\n * Auto-register decorator for web components\n * Usage: @autoRegister() or @autoRegister({ tagName: \"custom-name\" })\n *\n * @example\n * ```typescript\n * @autoRegister()\n * class MyButton extends WebComponent {\n * // Will be registered as \"my-button-component\"\n * }\n *\n * @autoRegister({ tagName: \"custom-button\" })\n * class MyButton extends WebComponent {\n * // Will be registered as \"custom-button\"\n * }\n *\n * @autoRegister({ prefix: \"ui-\" })\n * class MyButton extends WebComponent {\n * // Will be registered as \"ui-my-button-component\"\n * }\n * ```\n */\nexport function autoRegister(options: AutoRegistrationOptions = {}) {\n return function <T extends CustomElementConstructor>(constructor: T): T {\n const tagName = options.tagName || deriveTagName(constructor.name, options.prefix);\n\n if (!customElements.get(tagName)) {\n customElements.define(tagName, constructor);\n }\n\n return constructor;\n };\n}\n\n/**\n * Static method to auto-register a web component class\n * Usage: registerComponent(MyComponent) or registerComponent(MyComponent, { tagName: \"custom-name\" })\n *\n * @example\n * ```typescript\n * class MyButton extends WebComponent {\n * // ...\n * }\n *\n * registerComponent(MyButton); // Registers as \"my-button-component\"\n * registerComponent(MyButton, { tagName: \"custom-button\" }); // Registers as \"custom-button\"\n * ```\n */\nexport function registerComponent<T extends CustomElementConstructor>(\n constructor: T,\n options: AutoRegistrationOptions = {}\n): void {\n const tagName = options.tagName || deriveTagName(constructor.name, options.prefix);\n\n if (!customElements.get(tagName)) {\n customElements.define(tagName, constructor);\n }\n}\n\n/**\n * Derive tag name from class name\n * Converts PascalCase to kebab-case and adds optional prefix\n * Ensures valid custom element name (must contain hyphen)\n *\n * @param className - The class name to convert\n * @param prefix - Optional prefix to add\n * @returns Valid custom element tag name\n *\n * @example\n * ```typescript\n * deriveTagName(\"MyButton\") // \"my-button-component\"\n * deriveTagName(\"HTMLEditor\") // \"htmleditor-component\"\n * deriveTagName(\"Button\") // \"button-component\"\n * deriveTagName(\"MyButton\", \"ui-\") // \"ui-my-button-component\"\n * ```\n */\nfunction deriveTagName(className: string, prefix?: string): string {\n // Convert PascalCase to kebab-case\n let kebabCase = className.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n\n // Ensure the tag name contains at least one hyphen (custom element requirement)\n if (!kebabCase.includes(\"-\")) {\n kebabCase = `${kebabCase}-component`;\n }\n\n return prefix ? `${prefix}${kebabCase}` : kebabCase;\n}\n\n/**\n * Register all components in a module\n * Useful for bulk registration of multiple components\n *\n * @param components - Object containing component classes\n * @param options - Default options to apply to all components\n *\n * @example\n * ```typescript\n * import * as Components from './components';\n *\n * registerAll(Components, { prefix: \"ui-\" });\n * ```\n */\nexport function registerAll(\n components: Record<string, CustomElementConstructor>,\n options: AutoRegistrationOptions = {}\n): void {\n Object.values(components).forEach((component) => {\n if (typeof component === \"function\" && component.prototype instanceof HTMLElement) {\n registerComponent(component, options);\n }\n });\n}\n\n/**\n * Check if a component is already registered\n *\n * @param tagName - The tag name to check\n * @returns True if the component is registered\n */\nexport function isRegistered(tagName: string): boolean {\n return !!customElements.get(tagName);\n}\n\n/**\n * Get the tag name that would be generated for a class\n * Useful for testing or debugging\n *\n * @param className - The class name\n * @param options - Registration options\n * @returns The generated tag name\n */\nexport function getTagName(className: string, options: AutoRegistrationOptions = {}): string {\n return options.tagName || deriveTagName(className, options.prefix);\n}\n","/**\n * WSX Framework Logger\n *\n * A lightweight logging utility for the WSX framework.\n * Can be extended or replaced by consuming applications.\n */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n}\n\nexport class WSXLogger implements Logger {\n private prefix: string;\n private enabled: boolean;\n private level: LogLevel;\n\n constructor(prefix: string = \"[WSX]\", enabled: boolean = true, level: LogLevel = \"info\") {\n this.prefix = prefix;\n this.enabled = enabled;\n this.level = level;\n }\n\n private shouldLog(level: LogLevel): boolean {\n if (!this.enabled) return false;\n\n const levels: LogLevel[] = [\"debug\", \"info\", \"warn\", \"error\"];\n const currentLevelIndex = levels.indexOf(this.level);\n const messageLevelIndex = levels.indexOf(level);\n\n return messageLevelIndex >= currentLevelIndex;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.shouldLog(\"debug\")) {\n console.debug(`${this.prefix} ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.shouldLog(\"info\")) {\n console.info(`${this.prefix} ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.shouldLog(\"warn\")) {\n console.warn(`${this.prefix} ${message}`, ...args);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.shouldLog(\"error\")) {\n console.error(`${this.prefix} ${message}`, ...args);\n }\n }\n}\n\n// Default logger instance\nexport const logger = new WSXLogger();\n\n// Factory function for creating component-specific loggers\nexport function createLogger(componentName: string): Logger {\n return new WSXLogger(`[WSX:${componentName}]`);\n}\n","/**\n * WSX 响应式状态系统\n *\n * 基于浏览器原生 Proxy API 实现轻量级响应式状态,\n * 遵循 WSX 设计哲学:信任浏览器,零运行时开销\n */\nimport { createLogger } from \"./logger\";\n\nconst logger = createLogger(\"ReactiveSystem\");\n\n/**\n * 响应式回调函数类型\n */\nexport type ReactiveCallback = () => void;\n\n/**\n * 批量更新调度器\n * 使用浏览器原生的 queueMicrotask 实现批量更新\n */\nclass UpdateScheduler {\n private pendingCallbacks = new Set<ReactiveCallback>();\n private isScheduled = false;\n\n /**\n * 调度一个更新回调\n */\n schedule(callback: ReactiveCallback): void {\n this.pendingCallbacks.add(callback);\n\n if (!this.isScheduled) {\n this.isScheduled = true;\n // 使用浏览器原生的微任务队列\n queueMicrotask(() => {\n this.flush();\n });\n }\n }\n\n /**\n * 执行所有待处理的回调\n */\n private flush(): void {\n const callbacks = Array.from(this.pendingCallbacks);\n this.pendingCallbacks.clear();\n this.isScheduled = false;\n\n // 执行所有回调\n callbacks.forEach((callback) => {\n try {\n callback();\n } catch (error) {\n console.error(\"[WSX Reactive] Error in callback:\", error);\n }\n });\n }\n}\n\n// 全局调度器实例\nconst scheduler = new UpdateScheduler();\n\n/**\n * 创建响应式对象\n *\n * @param obj 要变为响应式的对象\n * @param onChange 状态变化时的回调函数\n * @returns 响应式代理对象\n */\nexport function reactive<T extends object>(obj: T, onChange: ReactiveCallback): T {\n return new Proxy(obj, {\n set(target: T, key: string | symbol, value: any): boolean {\n const oldValue = target[key as keyof T];\n\n // 只有值真正改变时才触发更新\n if (oldValue !== value) {\n target[key as keyof T] = value;\n\n // 调度更新\n scheduler.schedule(onChange);\n }\n\n return true;\n },\n\n get(target: T, key: string | symbol): any {\n return target[key as keyof T];\n },\n\n has(target: T, key: string | symbol): boolean {\n return key in target;\n },\n\n ownKeys(target: T): ArrayLike<string | symbol> {\n return Reflect.ownKeys(target);\n },\n\n getOwnPropertyDescriptor(target: T, key: string | symbol): PropertyDescriptor | undefined {\n return Reflect.getOwnPropertyDescriptor(target, key);\n },\n });\n}\n\n/**\n * 创建响应式状态钩子\n * 提供类似 useState 的 API\n *\n * @param initialValue 初始值\n * @param onChange 变化回调\n * @returns [getter, setter] 元组\n */\nexport function createState<T>(\n initialValue: T,\n onChange: ReactiveCallback\n): [() => T, (value: T | ((prev: T) => T)) => void] {\n let currentValue = initialValue;\n\n const getter = (): T => currentValue;\n\n const setter = (value: T | ((prev: T) => T)): void => {\n const newValue =\n typeof value === \"function\" ? (value as (prev: T) => T)(currentValue) : value;\n\n if (currentValue !== newValue) {\n currentValue = newValue;\n scheduler.schedule(onChange);\n }\n };\n\n return [getter, setter];\n}\n\n/**\n * 检查一个值是否为响应式对象\n */\nexport function isReactive(value: any): boolean {\n return (\n value != null &&\n typeof value === \"object\" &&\n value.constructor === Object &&\n typeof value.valueOf === \"function\"\n );\n}\n\n/**\n * 开发模式下的调试工具\n */\nexport const ReactiveDebug = {\n /**\n * 启用调试模式\n */\n enable(): void {\n if (typeof window !== \"undefined\") {\n (window as any).__WSX_REACTIVE_DEBUG__ = true;\n }\n },\n\n /**\n * 禁用调试模式\n */\n disable(): void {\n if (typeof window !== \"undefined\") {\n (window as any).__WSX_REACTIVE_DEBUG__ = false;\n }\n },\n\n /**\n * 检查是否启用调试模式\n */\n isEnabled(): boolean {\n return typeof window !== \"undefined\" && (window as any).__WSX_REACTIVE_DEBUG__ === true;\n },\n\n /**\n * 调试日志\n */\n log(message: string, ...args: any[]): void {\n if (this.isEnabled()) {\n logger.info(`[WSX Reactive] ${message}`, ...args);\n }\n },\n};\n\n/**\n * 增强的 reactive 函数,带调试支持\n */\nexport function reactiveWithDebug<T extends object>(\n obj: T,\n onChange: ReactiveCallback,\n debugName?: string\n): T {\n const name = debugName || obj.constructor.name || \"Unknown\";\n\n return new Proxy(obj, {\n set(target: T, key: string | symbol, value: any): boolean {\n const oldValue = target[key as keyof T];\n\n if (oldValue !== value) {\n ReactiveDebug.log(`State change in ${name}:`, {\n key: String(key),\n oldValue,\n newValue: value,\n });\n\n target[key as keyof T] = value;\n scheduler.schedule(onChange);\n }\n\n return true;\n },\n\n get(target: T, key: string | symbol): any {\n return target[key as keyof T];\n },\n });\n}\n","/**\n * 响应式 WSX Web Component\n *\n * 扩展基础 WebComponent,提供响应式状态支持\n * 遵循 WSX 理念:可选使用,不破坏现有组件\n */\n\nimport { WebComponent, type WebComponentConfig } from \"./web-component\";\nimport { reactive, createState, reactiveWithDebug } from \"./utils/reactive\";\n\n/**\n * 响应式 WebComponent 配置\n */\nexport interface ReactiveWebComponentConfig extends WebComponentConfig {\n /** 是否启用响应式调试模式 */\n debug?: boolean;\n}\n\n/**\n * 响应式 WebComponent 基类\n *\n * 提供响应式状态管理能力,同时保持与标准 WebComponent 的完全兼容\n */\nexport abstract class ReactiveWebComponent extends WebComponent {\n private _isDebugEnabled: boolean = false;\n private _reactiveStates = new Map<string, any>();\n\n constructor(config: ReactiveWebComponentConfig = {}) {\n super(config);\n\n this._isDebugEnabled = config.debug ?? false;\n }\n\n /**\n * 创建响应式对象\n *\n * @param obj 要变为响应式的对象\n * @param debugName 调试名称(可选)\n * @returns 响应式代理对象\n */\n protected reactive<T extends object>(obj: T, debugName?: string): T {\n const reactiveFn = this._isDebugEnabled ? reactiveWithDebug : reactive;\n const name = debugName || `${this.constructor.name}.reactive`;\n\n return this._isDebugEnabled\n ? reactiveFn(obj, () => this.scheduleRerender(), name)\n : reactiveFn(obj, () => this.scheduleRerender());\n }\n\n /**\n * 创建响应式状态\n *\n * @param key 状态标识符\n * @param initialValue 初始值\n * @returns [getter, setter] 元组\n */\n protected useState<T>(\n key: string,\n initialValue: T\n ): [() => T, (value: T | ((prev: T) => T)) => void] {\n if (!this._reactiveStates.has(key)) {\n const [getter, setter] = createState(initialValue, () => this.scheduleRerender());\n this._reactiveStates.set(key, { getter, setter });\n }\n\n const state = this._reactiveStates.get(key);\n return [state.getter, state.setter];\n }\n\n /**\n * 调度重渲染\n * 这个方法被响应式系统调用,开发者通常不需要直接调用\n */\n protected scheduleRerender(): void {\n // 确保组件已连接到 DOM\n if (this.connected) {\n this.rerender();\n }\n }\n\n /**\n * 获取所有响应式状态的快照(用于调试)\n */\n protected getStateSnapshot(): Record<string, any> {\n const snapshot: Record<string, any> = {};\n\n this._reactiveStates.forEach((state, key) => {\n snapshot[key] = state.getter();\n });\n\n return snapshot;\n }\n\n /**\n * 清理响应式状态(组件销毁时)\n */\n protected cleanupReactiveStates(): void {\n this._reactiveStates.clear();\n }\n\n /**\n * 重写 disconnectedCallback 以清理状态\n */\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.cleanupReactiveStates();\n }\n\n /**\n * 启用调试模式\n */\n protected enableDebug(): void {\n this._isDebugEnabled = true;\n }\n\n /**\n * 禁用调试模式\n */\n protected disableDebug(): void {\n this._isDebugEnabled = false;\n }\n}\n\n/**\n * 装饰器:自动使组件变为响应式\n *\n * @param debugMode 是否启用调试模式\n */\nexport function makeReactive(_debugMode: boolean = false) {\n return function <T extends new (...args: any[]) => WebComponent>(constructor: T) {\n return class ReactiveComponent extends constructor {\n constructor(...args: any[]) {\n super(...args);\n\n // 如果不是 ReactiveWebComponent 的实例,则混入响应式能力\n if (!(this instanceof ReactiveWebComponent)) {\n // 添加响应式方法\n (this as any).reactive = function <U extends object>(obj: U): U {\n return reactive(obj, () => (this as any).rerender());\n };\n }\n }\n\n render(): HTMLElement {\n // 抽象方法必须由子类实现\n throw new Error(\"render() method must be implemented by subclass\");\n }\n } as T;\n };\n}\n\n/**\n * 工具函数:创建响应式组件实例\n */\nexport function createReactiveComponent<T extends WebComponent>(\n ComponentClass: new (...args: any[]) => T,\n config?: ReactiveWebComponentConfig\n): T {\n // 如果已经是响应式组件,直接创建实例\n if (ComponentClass.prototype instanceof ReactiveWebComponent) {\n return new ComponentClass(config);\n }\n\n // 否则使用装饰器包装\n const ReactiveComponent = makeReactive(config?.debug)(ComponentClass);\n return new ReactiveComponent(config);\n}\n\n// 导出响应式相关的所有功能\nexport { reactive, createState, ReactiveDebug } from \"./utils/reactive\";\nexport type { ReactiveCallback } from \"./utils/reactive\";\n"],"mappings":"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","names":["logger","logger"]}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 纯原生JSX工厂 - 零依赖的EditorJS Web Component支持
3
+ *
4
+ * 特点:
5
+ * - 完全独立,不依赖React或任何框架
6
+ * - 支持标准JSX语法
7
+ * - 原生DOM操作,性能优异
8
+ * - 完全通用,适用于任何Web Components
9
+ * - TypeScript类型安全
10
+ */
11
+ type JSXChildren = string | number | HTMLElement | DocumentFragment | JSXChildren[] | null | undefined | boolean;
12
+ /**
13
+ * 纯原生JSX工厂函数
14
+ *
15
+ * @param tag - HTML标签名或组件函数
16
+ * @param props - 属性对象
17
+ * @param children - 子元素
18
+ * @returns DOM元素
19
+ */
20
+ declare function h(tag: string | ((...args: unknown[]) => HTMLElement), props?: Record<string, unknown> | null, ...children: JSXChildren[]): HTMLElement;
21
+ /**
22
+ * JSX Fragment支持 - 用于包装多个子元素
23
+ */
24
+ declare function Fragment(_props: unknown, children: JSXChildren[]): DocumentFragment;
25
+
26
+ export { Fragment as F, type JSXChildren as J, h };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 纯原生JSX工厂 - 零依赖的EditorJS Web Component支持
3
+ *
4
+ * 特点:
5
+ * - 完全独立,不依赖React或任何框架
6
+ * - 支持标准JSX语法
7
+ * - 原生DOM操作,性能优异
8
+ * - 完全通用,适用于任何Web Components
9
+ * - TypeScript类型安全
10
+ */
11
+ type JSXChildren = string | number | HTMLElement | DocumentFragment | JSXChildren[] | null | undefined | boolean;
12
+ /**
13
+ * 纯原生JSX工厂函数
14
+ *
15
+ * @param tag - HTML标签名或组件函数
16
+ * @param props - 属性对象
17
+ * @param children - 子元素
18
+ * @returns DOM元素
19
+ */
20
+ declare function h(tag: string | ((...args: unknown[]) => HTMLElement), props?: Record<string, unknown> | null, ...children: JSXChildren[]): HTMLElement;
21
+ /**
22
+ * JSX Fragment支持 - 用于包装多个子元素
23
+ */
24
+ declare function Fragment(_props: unknown, children: JSXChildren[]): DocumentFragment;
25
+
26
+ export { Fragment as F, type JSXChildren as J, h };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 纯原生JSX工厂 - 零依赖的EditorJS Web Component支持
3
+ *
4
+ * 特点:
5
+ * - 完全独立,不依赖React或任何框架
6
+ * - 支持标准JSX语法
7
+ * - 原生DOM操作,性能优异
8
+ * - 完全通用,适用于任何Web Components
9
+ * - TypeScript类型安全
10
+ */
11
+ type JSXChildren = string | number | HTMLElement | DocumentFragment | JSXChildren[] | null | undefined | boolean;
12
+ /**
13
+ * 纯原生JSX工厂函数
14
+ *
15
+ * @param tag - HTML标签名或组件函数
16
+ * @param props - 属性对象
17
+ * @param children - 子元素
18
+ * @returns DOM元素
19
+ */
20
+ declare function h(tag: string | ((...args: unknown[]) => HTMLElement), props?: Record<string, unknown> | null, ...children: JSXChildren[]): HTMLElement;
21
+ /**
22
+ * JSX Fragment支持 - 用于包装多个子元素
23
+ */
24
+ declare function Fragment(_props: unknown, children: JSXChildren[]): DocumentFragment;
25
+
26
+ export { Fragment as F, type JSXChildren as J, h };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 纯原生JSX工厂 - 零依赖的EditorJS Web Component支持
3
+ *
4
+ * 特点:
5
+ * - 完全独立,不依赖React或任何框架
6
+ * - 支持标准JSX语法
7
+ * - 原生DOM操作,性能优异
8
+ * - 完全通用,适用于任何Web Components
9
+ * - TypeScript类型安全
10
+ */
11
+ type JSXChildren = string | number | HTMLElement | DocumentFragment | JSXChildren[] | null | undefined | boolean;
12
+ /**
13
+ * 纯原生JSX工厂函数
14
+ *
15
+ * @param tag - HTML标签名或组件函数
16
+ * @param props - 属性对象
17
+ * @param children - 子元素
18
+ * @returns DOM元素
19
+ */
20
+ declare function h(tag: string | ((...args: unknown[]) => HTMLElement), props?: Record<string, unknown> | null, ...children: JSXChildren[]): HTMLElement;
21
+ /**
22
+ * JSX Fragment支持 - 用于包装多个子元素
23
+ */
24
+ declare function Fragment(_props: unknown, children: JSXChildren[]): DocumentFragment;
25
+
26
+ export { Fragment as F, type JSXChildren as J, h };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 纯原生JSX工厂 - 零依赖的EditorJS Web Component支持
3
+ *
4
+ * 特点:
5
+ * - 完全独立,不依赖React或任何框架
6
+ * - 支持标准JSX语法
7
+ * - 原生DOM操作,性能优异
8
+ * - 完全通用,适用于任何Web Components
9
+ * - TypeScript类型安全
10
+ */
11
+ type JSXChildren = string | number | HTMLElement | DocumentFragment | JSXChildren[] | null | undefined | boolean;
12
+ /**
13
+ * 纯原生JSX工厂函数
14
+ *
15
+ * @param tag - HTML标签名或组件函数
16
+ * @param props - 属性对象
17
+ * @param children - 子元素
18
+ * @returns DOM元素
19
+ */
20
+ declare function h(tag: string | ((...args: unknown[]) => HTMLElement), props?: Record<string, unknown> | null, ...children: JSXChildren[]): HTMLElement;
21
+ /**
22
+ * JSX Fragment支持 - 用于包装多个子元素
23
+ */
24
+ declare function Fragment(_props: unknown, children: JSXChildren[]): DocumentFragment;
25
+
26
+ export { Fragment as F, type JSXChildren as J, h };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 纯原生JSX工厂 - 零依赖的EditorJS Web Component支持
3
+ *
4
+ * 特点:
5
+ * - 完全独立,不依赖React或任何框架
6
+ * - 支持标准JSX语法
7
+ * - 原生DOM操作,性能优异
8
+ * - 完全通用,适用于任何Web Components
9
+ * - TypeScript类型安全
10
+ */
11
+ type JSXChildren = string | number | HTMLElement | DocumentFragment | JSXChildren[] | null | undefined | boolean;
12
+ /**
13
+ * 纯原生JSX工厂函数
14
+ *
15
+ * @param tag - HTML标签名或组件函数
16
+ * @param props - 属性对象
17
+ * @param children - 子元素
18
+ * @returns DOM元素
19
+ */
20
+ declare function h(tag: string | ((...args: unknown[]) => HTMLElement), props?: Record<string, unknown> | null, ...children: JSXChildren[]): HTMLElement;
21
+ /**
22
+ * JSX Fragment支持 - 用于包装多个子元素
23
+ */
24
+ declare function Fragment(_props: unknown, children: JSXChildren[]): DocumentFragment;
25
+
26
+ export { Fragment as F, type JSXChildren as J, h };
@@ -0,0 +1 @@
1
+ export { F as Fragment, h as jsx, h as jsxs } from './jsx-runtime-pFUwL2Dz.mjs';
@@ -0,0 +1 @@
1
+ export { F as Fragment, h as jsx, h as jsxs } from './jsx-runtime-pFUwL2Dz.js';
@@ -0,0 +1,248 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/jsx-runtime.ts
21
+ var jsx_runtime_exports = {};
22
+ __export(jsx_runtime_exports, {
23
+ Fragment: () => Fragment,
24
+ jsx: () => jsx,
25
+ jsxs: () => jsxs
26
+ });
27
+ module.exports = __toCommonJS(jsx_runtime_exports);
28
+
29
+ // src/utils/svg-utils.ts
30
+ var SVG_NAMESPACE = "http://www.w3.org/2000/svg";
31
+ var SVG_ONLY_ELEMENTS = /* @__PURE__ */ new Set([
32
+ // 结构元素 (Structural elements)
33
+ "svg",
34
+ "defs",
35
+ "g",
36
+ "symbol",
37
+ "use",
38
+ // 图形元素 (Graphics elements)
39
+ "circle",
40
+ "ellipse",
41
+ "line",
42
+ "path",
43
+ "polygon",
44
+ "polyline",
45
+ "rect",
46
+ // 文本元素 (Text elements)
47
+ "textPath",
48
+ "tspan",
49
+ // 渐变和模式 (Gradients and patterns)
50
+ "linearGradient",
51
+ "radialGradient",
52
+ "stop",
53
+ "pattern",
54
+ // 滤镜 (Filter elements)
55
+ "filter",
56
+ "feBlend",
57
+ "feColorMatrix",
58
+ "feComponentTransfer",
59
+ "feComposite",
60
+ "feConvolveMatrix",
61
+ "feDiffuseLighting",
62
+ "feDisplacementMap",
63
+ "feDistantLight",
64
+ "feDropShadow",
65
+ "feFlood",
66
+ "feFuncA",
67
+ "feFuncB",
68
+ "feFuncG",
69
+ "feFuncR",
70
+ "feGaussianBlur",
71
+ "feImage",
72
+ "feMerge",
73
+ "feMergeNode",
74
+ "feMorphology",
75
+ "feOffset",
76
+ "fePointLight",
77
+ "feSpecularLighting",
78
+ "feSpotLight",
79
+ "feTile",
80
+ "feTurbulence",
81
+ // 动画元素 (Animation elements)
82
+ "animate",
83
+ "animateMotion",
84
+ "animateTransform",
85
+ "set",
86
+ // 其他元素 (Other elements)
87
+ "clipPath",
88
+ "foreignObject",
89
+ "marker",
90
+ "mask",
91
+ "metadata",
92
+ "switch",
93
+ "desc"
94
+ ]);
95
+ var DUAL_ELEMENTS = /* @__PURE__ */ new Set(["image", "style", "title", "text"]);
96
+ var FORCE_HTML_ELEMENTS = /* @__PURE__ */ new Set(["a"]);
97
+ var SVG_ELEMENTS = /* @__PURE__ */ new Set([
98
+ ...SVG_ONLY_ELEMENTS,
99
+ ...DUAL_ELEMENTS,
100
+ ...FORCE_HTML_ELEMENTS
101
+ ]);
102
+ var svgContext = false;
103
+ function isSVGOnlyElement(tagName) {
104
+ return SVG_ONLY_ELEMENTS.has(tagName);
105
+ }
106
+ function isDualElement(tagName) {
107
+ return DUAL_ELEMENTS.has(tagName);
108
+ }
109
+ function isForceHTMLElement(tagName) {
110
+ return FORCE_HTML_ELEMENTS.has(tagName);
111
+ }
112
+ function setSVGContext(inSVG) {
113
+ svgContext = inSVG;
114
+ }
115
+ function createElement(tagName) {
116
+ if (isForceHTMLElement(tagName)) {
117
+ return document.createElement(tagName);
118
+ }
119
+ if (isSVGOnlyElement(tagName)) {
120
+ setSVGContext(true);
121
+ return document.createElementNS(SVG_NAMESPACE, tagName);
122
+ }
123
+ if (isDualElement(tagName)) {
124
+ if (svgContext) {
125
+ return document.createElementNS(SVG_NAMESPACE, tagName);
126
+ }
127
+ }
128
+ return document.createElement(tagName);
129
+ }
130
+ function shouldUseSVGNamespace(tagName) {
131
+ return isSVGOnlyElement(tagName) || isDualElement(tagName) && svgContext;
132
+ }
133
+ var SVG_ATTRIBUTE_MAP = /* @__PURE__ */ new Map([
134
+ ["className", "class"],
135
+ ["htmlFor", "for"]
136
+ ]);
137
+ function getSVGAttributeName(attributeName) {
138
+ return SVG_ATTRIBUTE_MAP.get(attributeName) || attributeName;
139
+ }
140
+
141
+ // src/jsx-factory.ts
142
+ function h(tag, props = {}, ...children) {
143
+ if (typeof tag === "function") {
144
+ return tag(props, children);
145
+ }
146
+ const element = createElement(tag);
147
+ if (props) {
148
+ const isSVG = shouldUseSVGNamespace(tag);
149
+ Object.entries(props).forEach(([key, value]) => {
150
+ if (value === null || value === void 0 || value === false) {
151
+ return;
152
+ }
153
+ if (key === "ref" && typeof value === "function") {
154
+ value(element);
155
+ } else if (key === "className" || key === "class") {
156
+ if (isSVG) {
157
+ element.setAttribute("class", value);
158
+ } else {
159
+ element.className = value;
160
+ }
161
+ } else if (key === "style" && typeof value === "string") {
162
+ element.setAttribute("style", value);
163
+ } else if (key.startsWith("on") && typeof value === "function") {
164
+ const eventName = key.slice(2).toLowerCase();
165
+ element.addEventListener(eventName, value);
166
+ } else if (typeof value === "boolean") {
167
+ if (value) {
168
+ element.setAttribute(key, "");
169
+ }
170
+ } else {
171
+ const attributeName = isSVG ? getSVGAttributeName(key) : key;
172
+ element.setAttribute(attributeName, String(value));
173
+ }
174
+ });
175
+ }
176
+ const flatChildren = flattenChildren(children);
177
+ flatChildren.forEach((child) => {
178
+ if (child === null || child === void 0 || child === false) {
179
+ return;
180
+ }
181
+ if (typeof child === "string" || typeof child === "number") {
182
+ element.appendChild(document.createTextNode(String(child)));
183
+ } else if (child instanceof HTMLElement || child instanceof SVGElement) {
184
+ element.appendChild(child);
185
+ } else if (child instanceof DocumentFragment) {
186
+ element.appendChild(child);
187
+ }
188
+ });
189
+ return element;
190
+ }
191
+ function flattenChildren(children) {
192
+ const result = [];
193
+ for (const child of children) {
194
+ if (child === null || child === void 0 || child === false) {
195
+ continue;
196
+ } else if (Array.isArray(child)) {
197
+ result.push(...flattenChildren(child));
198
+ } else {
199
+ result.push(child);
200
+ }
201
+ }
202
+ return result;
203
+ }
204
+ function Fragment(_props, children) {
205
+ const fragment = document.createDocumentFragment();
206
+ const flatChildren = flattenChildren(children);
207
+ flatChildren.forEach((child) => {
208
+ if (child === null || child === void 0 || child === false) {
209
+ return;
210
+ }
211
+ if (typeof child === "string" || typeof child === "number") {
212
+ fragment.appendChild(document.createTextNode(String(child)));
213
+ } else if (child instanceof HTMLElement || child instanceof SVGElement) {
214
+ fragment.appendChild(child);
215
+ } else if (child instanceof DocumentFragment) {
216
+ fragment.appendChild(child);
217
+ }
218
+ });
219
+ return fragment;
220
+ }
221
+ function jsx(tag, props) {
222
+ if (!props) {
223
+ return h(tag, null);
224
+ }
225
+ const { children, ...restProps } = props;
226
+ if (children !== void 0) {
227
+ return h(tag, restProps, children);
228
+ }
229
+ return h(tag, restProps);
230
+ }
231
+ function jsxs(tag, props) {
232
+ if (!props) {
233
+ return h(tag, null);
234
+ }
235
+ const { children, ...restProps } = props;
236
+ if (Array.isArray(children)) {
237
+ return h(tag, restProps, ...children);
238
+ } else if (children !== void 0) {
239
+ return h(tag, restProps, children);
240
+ }
241
+ return h(tag, restProps);
242
+ }
243
+ // Annotate the CommonJS export names for ESM import in node:
244
+ 0 && (module.exports = {
245
+ Fragment,
246
+ jsx,
247
+ jsxs
248
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/jsx-runtime.ts","../src/utils/svg-utils.ts","../src/jsx-factory.ts"],"sourcesContent":["/**\n * JSX Runtime for TypeScript's new JSX transform\n * This file is required when using jsx: \"react-jsx\" or \"react-jsxdev\"\n */\n\nexport { jsx, jsxs, Fragment } from \"./jsx-factory\";\n","/**\n * SVG utilities for namespace-aware element creation\n */\n\n// SVG namespace URI\nexport const SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\n\n// SVG专用元素 - 只存在于SVG中的元素\nexport const SVG_ONLY_ELEMENTS = new Set([\n // 结构元素 (Structural elements)\n \"svg\",\n \"defs\",\n \"g\",\n \"symbol\",\n \"use\",\n\n // 图形元素 (Graphics elements)\n \"circle\",\n \"ellipse\",\n \"line\",\n \"path\",\n \"polygon\",\n \"polyline\",\n \"rect\",\n\n // 文本元素 (Text elements)\n \"textPath\",\n \"tspan\",\n\n // 渐变和模式 (Gradients and patterns)\n \"linearGradient\",\n \"radialGradient\",\n \"stop\",\n \"pattern\",\n\n // 滤镜 (Filter elements)\n \"filter\",\n \"feBlend\",\n \"feColorMatrix\",\n \"feComponentTransfer\",\n \"feComposite\",\n \"feConvolveMatrix\",\n \"feDiffuseLighting\",\n \"feDisplacementMap\",\n \"feDistantLight\",\n \"feDropShadow\",\n \"feFlood\",\n \"feFuncA\",\n \"feFuncB\",\n \"feFuncG\",\n \"feFuncR\",\n \"feGaussianBlur\",\n \"feImage\",\n \"feMerge\",\n \"feMergeNode\",\n \"feMorphology\",\n \"feOffset\",\n \"fePointLight\",\n \"feSpecularLighting\",\n \"feSpotLight\",\n \"feTile\",\n \"feTurbulence\",\n\n // 动画元素 (Animation elements)\n \"animate\",\n \"animateMotion\",\n \"animateTransform\",\n \"set\",\n\n // 其他元素 (Other elements)\n \"clipPath\",\n \"foreignObject\",\n \"marker\",\n \"mask\",\n \"metadata\",\n \"switch\",\n \"desc\",\n]);\n\n// 既存在于HTML又存在于SVG的元素 - 默认使用HTML版本\nexport const DUAL_ELEMENTS = new Set([\"image\", \"style\", \"title\", \"text\"]);\n\n// 强制使用HTML版本的元素(即使在SVG上下文中)\nexport const FORCE_HTML_ELEMENTS = new Set([\"a\"]);\n\n// 所有SVG元素的集合\nexport const SVG_ELEMENTS = new Set([\n ...SVG_ONLY_ELEMENTS,\n ...DUAL_ELEMENTS,\n ...FORCE_HTML_ELEMENTS,\n]);\n\n// SVG上下文追踪\nlet svgContext = false;\n\n/**\n * 检查标签名是否为SVG专用元素\n */\nexport function isSVGOnlyElement(tagName: string): boolean {\n return SVG_ONLY_ELEMENTS.has(tagName);\n}\n\n/**\n * 检查标签名是否为双重元素(HTML和SVG都有)\n */\nexport function isDualElement(tagName: string): boolean {\n return DUAL_ELEMENTS.has(tagName);\n}\n\n/**\n * 检查标签名是否为强制HTML元素\n */\nexport function isForceHTMLElement(tagName: string): boolean {\n return FORCE_HTML_ELEMENTS.has(tagName);\n}\n\n/**\n * 检查标签名是否为SVG元素(保持向后兼容)\n */\nexport function isSVGElement(tagName: string): boolean {\n return SVG_ELEMENTS.has(tagName);\n}\n\n/**\n * 设置SVG上下文状态\n */\nexport function setSVGContext(inSVG: boolean): void {\n svgContext = inSVG;\n}\n\n/**\n * 获取当前SVG上下文状态\n */\nexport function getSVGContext(): boolean {\n return svgContext;\n}\n\n/**\n * 创建元素 - 基于上下文和元素类型智能选择命名空间\n */\nexport function createElement(tagName: string): HTMLElement | SVGElement {\n // 强制HTML元素始终使用HTML版本\n if (isForceHTMLElement(tagName)) {\n return document.createElement(tagName) as HTMLElement;\n }\n\n // SVG专用元素始终使用SVG命名空间\n if (isSVGOnlyElement(tagName)) {\n setSVGContext(true); // 进入SVG上下文\n return document.createElementNS(SVG_NAMESPACE, tagName) as SVGElement;\n }\n\n // 双重元素根据上下文决定\n if (isDualElement(tagName)) {\n if (svgContext) {\n return document.createElementNS(SVG_NAMESPACE, tagName) as SVGElement;\n }\n }\n\n // 默认创建HTML元素\n return document.createElement(tagName) as HTMLElement;\n}\n\n/**\n * 检测元素是否需要在SVG上下文中处理\n */\nexport function shouldUseSVGNamespace(tagName: string): boolean {\n return isSVGOnlyElement(tagName) || (isDualElement(tagName) && svgContext);\n}\n\n/**\n * SVG特殊属性映射 - 处理SVG和HTML属性差异\n */\nexport const SVG_ATTRIBUTE_MAP = new Map([\n [\"className\", \"class\"],\n [\"htmlFor\", \"for\"],\n]);\n\n/**\n * 获取SVG元素的正确属性名\n */\nexport function getSVGAttributeName(attributeName: string): string {\n return SVG_ATTRIBUTE_MAP.get(attributeName) || attributeName;\n}\n","/**\n * 纯原生JSX工厂 - 零依赖的EditorJS Web Component支持\n *\n * 特点:\n * - 完全独立,不依赖React或任何框架\n * - 支持标准JSX语法\n * - 原生DOM操作,性能优异\n * - 完全通用,适用于任何Web Components\n * - TypeScript类型安全\n */\n\n// JSX 类型声明已移至 types/wsx-types.d.ts\n\nimport { createElement, shouldUseSVGNamespace, getSVGAttributeName } from \"./utils/svg-utils\";\n\n// JSX子元素类型\nexport type JSXChildren =\n | string\n | number\n | HTMLElement\n | SVGElement\n | DocumentFragment\n | JSXChildren[]\n | null\n | undefined\n | boolean;\n\n/**\n * 纯原生JSX工厂函数\n *\n * @param tag - HTML标签名或组件函数\n * @param props - 属性对象\n * @param children - 子元素\n * @returns DOM元素\n */\nexport function h(\n tag:\n | string\n | ((\n props: Record<string, unknown> | null,\n children: JSXChildren[]\n ) => HTMLElement | SVGElement),\n props: Record<string, unknown> | null = {},\n ...children: JSXChildren[]\n): HTMLElement | SVGElement {\n // 处理组件函数\n if (typeof tag === \"function\") {\n return tag(props, children);\n }\n\n // 创建DOM元素 - 自动检测SVG命名空间\n const element = createElement(tag);\n\n // 处理属性\n if (props) {\n const isSVG = shouldUseSVGNamespace(tag);\n\n Object.entries(props).forEach(([key, value]) => {\n if (value === null || value === undefined || value === false) {\n return;\n }\n\n // 处理ref回调\n if (key === \"ref\" && typeof value === \"function\") {\n value(element);\n }\n // 处理className和class\n else if (key === \"className\" || key === \"class\") {\n if (isSVG) {\n // SVG元素使用class属性\n element.setAttribute(\"class\", value as string);\n } else {\n // HTML元素可以使用className\n (element as HTMLElement).className = value as string;\n }\n }\n // 处理style\n else if (key === \"style\" && typeof value === \"string\") {\n element.setAttribute(\"style\", value);\n }\n // 处理事件监听器\n else if (key.startsWith(\"on\") && typeof value === \"function\") {\n const eventName = key.slice(2).toLowerCase();\n element.addEventListener(eventName, value as EventListener);\n }\n // 处理布尔属性\n else if (typeof value === \"boolean\") {\n if (value) {\n element.setAttribute(key, \"\");\n }\n }\n // 处理其他属性\n else {\n // 对SVG元素使用正确的属性名\n const attributeName = isSVG ? getSVGAttributeName(key) : key;\n element.setAttribute(attributeName, String(value));\n }\n });\n }\n\n // 处理子元素\n const flatChildren = flattenChildren(children);\n flatChildren.forEach((child) => {\n if (child === null || child === undefined || child === false) {\n return;\n }\n\n if (typeof child === \"string\" || typeof child === \"number\") {\n element.appendChild(document.createTextNode(String(child)));\n } else if (child instanceof HTMLElement || child instanceof SVGElement) {\n element.appendChild(child);\n } else if (child instanceof DocumentFragment) {\n element.appendChild(child);\n }\n });\n\n return element;\n}\n\n/**\n * 扁平化子元素数组\n */\nfunction flattenChildren(\n children: JSXChildren[]\n): (string | number | HTMLElement | SVGElement | DocumentFragment | boolean | null | undefined)[] {\n const result: (\n | string\n | number\n | HTMLElement\n | SVGElement\n | DocumentFragment\n | boolean\n | null\n | undefined\n )[] = [];\n\n for (const child of children) {\n if (child === null || child === undefined || child === false) {\n continue;\n } else 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 * JSX Fragment支持 - 用于包装多个子元素\n */\nexport function Fragment(_props: unknown, children: JSXChildren[]): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const flatChildren = flattenChildren(children);\n\n flatChildren.forEach((child) => {\n if (child === null || child === undefined || child === false) {\n return;\n }\n\n if (typeof child === \"string\" || typeof child === \"number\") {\n fragment.appendChild(document.createTextNode(String(child)));\n } else if (child instanceof HTMLElement || child instanceof SVGElement) {\n fragment.appendChild(child);\n } else if (child instanceof DocumentFragment) {\n fragment.appendChild(child);\n }\n });\n\n return fragment;\n}\n\n/**\n * JSX function for React's new JSX transform\n * Handles the new format: jsx(tag, { children: child, ...props })\n */\nexport function jsx(\n tag:\n | string\n | ((\n props: Record<string, unknown> | null,\n children: JSXChildren[]\n ) => HTMLElement | SVGElement),\n props: Record<string, unknown> | null\n): HTMLElement | SVGElement {\n if (!props) {\n return h(tag, null);\n }\n\n const { children, ...restProps } = props;\n if (\n (children !== undefined && children !== null && typeof children !== \"object\") ||\n Array.isArray(children) ||\n typeof children === \"string\" ||\n typeof children === \"number\" ||\n typeof children === \"boolean\" ||\n children instanceof HTMLElement ||\n children instanceof SVGElement ||\n children instanceof DocumentFragment\n ) {\n return h(tag, restProps, children as JSXChildren);\n }\n return h(tag, restProps);\n}\n\n/**\n * JSX function for multiple children in React's new JSX transform\n * Handles the new format: jsxs(tag, { children: [child1, child2], ...props })\n */\nexport function jsxs(\n tag:\n | string\n | ((\n props: Record<string, unknown> | null,\n children: JSXChildren[]\n ) => HTMLElement | SVGElement),\n props: Record<string, unknown> | null\n): HTMLElement | SVGElement {\n if (!props) {\n return h(tag, null);\n }\n\n const { children, ...restProps } = props;\n if (Array.isArray(children)) {\n return h(tag, restProps, ...children);\n } else if (\n children !== undefined &&\n children !== null &&\n (typeof children !== \"object\" ||\n children instanceof HTMLElement ||\n children instanceof SVGElement ||\n children instanceof DocumentFragment)\n ) {\n return h(tag, restProps, children as JSXChildren);\n }\n return h(tag, restProps);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,10 @@
1
+ import {
2
+ Fragment,
3
+ jsx,
4
+ jsxs
5
+ } from "./chunk-BV2V6BVN.mjs";
6
+ export {
7
+ Fragment,
8
+ jsx,
9
+ jsxs
10
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/jsx.d.mts ADDED
@@ -0,0 +1,66 @@
1
+ export { F as Fragment, h } from './jsx-runtime-pFUwL2Dz.mjs';
2
+
3
+ /**
4
+ * JSX 入口点
5
+ * 专门为 jsxImportSource 机制提供 JSX 工厂函数
6
+ */
7
+
8
+ declare global {
9
+ namespace JSX {
10
+ interface IntrinsicElements {
11
+ div: HTMLAttributes<HTMLDivElement>;
12
+ button: HTMLAttributes<HTMLButtonElement>;
13
+ a: HTMLAttributes<HTMLAnchorElement>;
14
+ span: HTMLAttributes<HTMLSpanElement>;
15
+ input: HTMLAttributes<HTMLInputElement>;
16
+ p: HTMLAttributes<HTMLParagraphElement>;
17
+ h1: HTMLAttributes<HTMLHeadingElement>;
18
+ h2: HTMLAttributes<HTMLHeadingElement>;
19
+ h3: HTMLAttributes<HTMLHeadingElement>;
20
+ ul: HTMLAttributes<HTMLUListElement>;
21
+ li: HTMLAttributes<HTMLLIElement>;
22
+ section: HTMLAttributes<HTMLElement>;
23
+ slot: HTMLAttributes<HTMLSlotElement>;
24
+ }
25
+ interface HTMLAttributes<T extends HTMLElement = HTMLElement> {
26
+ className?: string;
27
+ class?: string;
28
+ id?: string;
29
+ style?: string;
30
+ disabled?: boolean;
31
+ title?: string;
32
+ type?: string;
33
+ value?: string;
34
+ placeholder?: string;
35
+ src?: string;
36
+ alt?: string;
37
+ href?: string | null;
38
+ target?: string;
39
+ rel?: string;
40
+ download?: string;
41
+ ref?: (element: T) => void;
42
+ [dataAttr: `data-${string}`]: string;
43
+ onClick?: (event: Event) => void;
44
+ onInput?: (event: Event) => void;
45
+ onChange?: (event: Event) => void;
46
+ onMouseOver?: (event: Event) => void;
47
+ onMouseOut?: (event: Event) => void;
48
+ onFocus?: (event: Event) => void;
49
+ onBlur?: (event: Event) => void;
50
+ onMouseDown?: (event: MouseEvent) => void;
51
+ onKeyDown?: (event: KeyboardEvent) => void;
52
+ [key: string]: unknown;
53
+ }
54
+ type Element = HTMLElement;
55
+ interface ElementClass {
56
+ render(): Element;
57
+ }
58
+ interface ElementAttributesProperty {
59
+ props: object;
60
+ }
61
+ interface ElementChildrenAttribute {
62
+ children: object;
63
+ }
64
+ type LibraryManagedAttributes<_C, P> = P;
65
+ }
66
+ }