@minejs/jsx 0.0.6 → 0.0.7

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 CHANGED
@@ -8,10 +8,10 @@
8
8
  </div>
9
9
 
10
10
  <div align="center">
11
- <img src="https://img.shields.io/badge/v-0.0.6-black"/>
11
+ <img src="https://img.shields.io/badge/v-0.0.7-black"/>
12
12
  <img src="https://img.shields.io/badge/🔥-@minejs-black"/>
13
13
  <br>
14
- <img src="https://img.shields.io/badge/coverage-97.59%25-brightgreen" alt="Test Coverage" />
14
+ <img src="https://img.shields.io/badge/coverage-98.78%25-brightgreen" alt="Test Coverage" />
15
15
  <img src="https://img.shields.io/github/issues/minejs-org/jsx?style=flat" alt="Github Repo Issues" />
16
16
  <img src="https://img.shields.io/github/stars/minejs-org/jsx?style=social" alt="GitHub Repo stars" />
17
17
  </div>
@@ -23,6 +23,98 @@
23
23
 
24
24
  <!-- ╔══════════════════════════════ DOC ══════════════════════════════╗ -->
25
25
 
26
- > Moved to [@minejsx](https://github.com/minejsx-org).
26
+ - ## Quick Start 🔥
27
27
 
28
- <!-- ╚═════════════════════════════════════════════════════════════════╝ -->
28
+ > Lightweight JSX runtime with fine-grained reactivity..
29
+
30
+ - ### Setup
31
+
32
+ > install [`hmm`](https://github.com/minejs-org/hmm) first.
33
+
34
+ ```bash
35
+ hmm i @minejs/jsx
36
+ ```
37
+
38
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
39
+
40
+ - ### Usage
41
+
42
+ ```ts
43
+ import {
44
+ jsx, Fragment,
45
+ Show, For, render, mount, createRoot
46
+ } from '@minejs/jsx'
47
+ import { signal } from '@minejs/signals'
48
+ ```
49
+
50
+ - ### 1. Basic JSX Elements
51
+
52
+ ```typescript
53
+ // Create simple element
54
+ const el = jsx('div', {
55
+ className: 'container',
56
+ children: 'Hello World'
57
+ })
58
+
59
+ // Create with attributes
60
+ const button = jsx('button', {
61
+ id: 'submit',
62
+ children: 'Click me',
63
+ onClick: () => console.log('Clicked!')
64
+ })
65
+ ```
66
+
67
+ - ### 2. Reactive Content with Signals
68
+
69
+ ```typescript
70
+ const count = signal(0)
71
+
72
+ const el = jsx('div', {
73
+ children: `Count: ${count()}`
74
+ })
75
+
76
+ render(el, '#app')
77
+
78
+ count.set(5) // Updates DOM automatically!
79
+ ```
80
+
81
+ - ### 3. Event Handling
82
+
83
+ ```typescript
84
+ const counter = signal(0)
85
+
86
+ const button = jsx('button', {
87
+ children: 'Increment',
88
+ onClick: () => {
89
+ counter.set(counter() + 1)
90
+ }
91
+ })
92
+ ```
93
+
94
+ <br>
95
+
96
+ - ## API Reference 🔥
97
+
98
+ - #### [`Render`](./docs/render.md)
99
+
100
+ > Lightweight DOM rendering library for JSX elements.
101
+
102
+ - #### [`Runtime`](./docs/runtime.md)
103
+
104
+ > Lightweight JSX runtime with fine-grained reactivity.
105
+
106
+ <!-- ╚═════════════════════════════════════════════════════════════════╝ -->
107
+
108
+
109
+
110
+ <!-- ╔══════════════════════════════ END ══════════════════════════════╗ -->
111
+
112
+ <br>
113
+
114
+ ---
115
+
116
+ <div align="center">
117
+ <a href="https://github.com/maysara-elshewehy"><img src="https://img.shields.io/badge/by-Maysara-black"/></a>
118
+ </div>
119
+
120
+ <!-- ╚═════════════════════════════════════════════════════════════════╝ -->
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var render=require('@minejsx/render'),runtime=require('@minejsx/runtime');Object.keys(render).forEach(function(k){if(k!=='default'&&!Object.prototype.hasOwnProperty.call(exports,k))Object.defineProperty(exports,k,{enumerable:true,get:function(){return render[k]}})});Object.keys(runtime).forEach(function(k){if(k!=='default'&&!Object.prototype.hasOwnProperty.call(exports,k))Object.defineProperty(exports,k,{enumerable:true,get:function(){return runtime[k]}})});//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var signals=require('@minejs/signals');var d=[],u=false;function f(e,n,t={}){let o=typeof n=="string"?document.querySelector(n):n;if(!o)throw new Error(`Container not found: ${n}`);let r=typeof e=="function"?e():e;if(!r)throw new Error("Component returned null or undefined");switch(t.mode||"replace"){case "replace":o.innerHTML="",o.appendChild(r);break;case "append":o.appendChild(r);break;case "prepend":o.insertBefore(r,o.firstChild);break;default:o.innerHTML="",o.appendChild(r);}return t.onMount?.(),{element:r,unmount:()=>{if(r instanceof Element)r.remove();else if(r instanceof DocumentFragment)for(;r.firstChild;)r.removeChild(r.firstChild);t.onUnmount?.();},update:l=>{r instanceof Element&&l instanceof Element?r.replaceWith(l):l instanceof Element&&r instanceof DocumentFragment&&r.parentNode&&r.parentNode.replaceChild(l,r);}}}function N(e,n){return f(e,n,{mode:"replace"})}function S(e,n){let t=typeof n=="string"?document.querySelector(n):n;if(!t)throw new Error(`Portal container not found: ${n}`);let o=document.createComment("portal");return e instanceof Node&&t.appendChild(e),o}function v(e,n){let t=typeof n=="string"?document.querySelector(n):n,o=t instanceof HTMLElement?t:null;if(!o)throw new Error(`Container not found: ${n}`);return f(e,o,{mode:"replace"})}function b(e,n){let t=null,o=false,r=null;return i=>{if(t)return t(i);if(r){let l=document.createElement("div");return l.className="crux-lazy-error",l.textContent=`Error loading component: ${r.message}`,l.style.color="red",l}return o||(o=true,e().then(l=>{t=l.default;}).catch(l=>{r=l instanceof Error?l:new Error(String(l));})),n||y()}}function y(){let e=document.createElement("div");return e.textContent="Loading...",e}function P(e){try{return e.children}catch(n){return e.fallback(n)}}function H(e){if(e.children instanceof Promise){let n=document.createElement("div");return n.style.display="contents",e.fallback instanceof Node&&n.appendChild(e.fallback),e.children.then(t=>{n.innerHTML="",t instanceof Node&&n.appendChild(t);}),n}else return e.children}function F(e){return S(e.children,e.to)}function D(e){d.push(e),u||(u=true,queueMicrotask(g));}function g(){let e=d;d=[],u=false,e.forEach(n=>n());}function C(){return typeof window<"u"&&typeof document<"u"}function A(e){C()&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",e):e());}function R(e){let n=typeof e=="string"?document.querySelector(e):e;if(!n||!(n instanceof HTMLElement))throw new Error(`Root container not found: ${e}`);let t=null;return {render(o){t&&t.unmount(),t=f(o,n);},unmount(){t&&(t.unmount(),t=null);}}}function m(e,n){return typeof e=="function"?e(n||{}):J(e,n||{})}var O=m;function h(e){let n=document.createDocumentFragment();return s(e.children).forEach(o=>{o instanceof Node&&n.appendChild(o);}),n}function J(e,n){let t=document.createElement(e);for(let[o,r]of Object.entries(n))o==="children"?X(t,r):o==="ref"?x(t,r):o.startsWith("on")?M(t,o,r):o==="className"||o==="class"?T(t,r):o==="style"?w(t,r):signals.isSignal(r)?L(t,o,r):typeof r=="boolean"?r&&t.setAttribute(o,""):r!=null&&t.setAttribute(o,String(r));return t}function X(e,n){s(n).forEach(o=>{if(o instanceof Node)e.appendChild(o);else if(signals.isSignal(o)){let r=document.createTextNode("");signals.effect(()=>{r.textContent=String(o());}),e.appendChild(r);}else o!=null&&o!==false&&e.appendChild(document.createTextNode(String(o)));});}function s(e){return e==null||e===false?[]:Array.isArray(e)?e.flatMap(s):[e]}function x(e,n){signals.isSignal(n)?n.set(e):typeof n=="function"&&n(e);}function M(e,n,t){if(typeof t!="function")return;let o=n.slice(2).toLowerCase();e.addEventListener(o,t);}function T(e,n){signals.isSignal(n)?signals.effect(()=>{let t=n();t!=null&&(e.className=String(t));}):n!=null&&(e.className=String(n));}function w(e,n){signals.isSignal(n)?signals.effect(()=>{let t=n();E(e,t);}):E(e,n);}function E(e,n){typeof n=="string"?e.style.cssText=n:typeof n=="object"&&n!=null&&Object.entries(n).forEach(([t,o])=>{if(o!=null){let r=t.replace(/[A-Z]/g,i=>`-${i.toLowerCase()}`);e.style.setProperty(r,String(o));}});}function L(e,n,t){signals.effect(()=>{let o=t();o!=null?n in e?e[n]=o:e.setAttribute(n,String(o)):e.removeAttribute(n);});}function $(e){return e}function j(e){return n=>e(n)()}function z(e){let n=document.createDocumentFragment();return e.forEach(t=>{t instanceof Node&&n.appendChild(t);}),n}function B(e){if(signals.isSignal(e.when)){let n=document.createComment("show"),t=document.createDocumentFragment();t.appendChild(n);let o=null;return signals.effect(()=>{let r=e.when,i=r();i&&!o?(o=s(e.children)[0],o instanceof Node&&n.parentNode?.insertBefore(o,n)):!i&&o&&(o.remove(),o=null);}),t}else return e.when?m(h,{children:e.children}):null}function U(e){for(let n of e.children)if(signals.isSignal(n.when)?n.when():n.when)return m(h,{children:n.children});return null}function W(e){let n=document.createDocumentFragment();if(signals.isSignal(e.each)){let t=document.createElement("div");t.style.display="contents",signals.effect(()=>{let o=e.each,r=o();t.innerHTML="",r.forEach((i,l)=>{let p=e.children(i,l);p instanceof Node&&t.appendChild(p);});}),n.appendChild(t);}else e.each.forEach((o,r)=>{let i=e.children(o,r);i instanceof Node&&n.appendChild(i);});return n}exports.ErrorBoundary=P;exports.For=W;exports.Fragment=h;exports.Show=B;exports.Suspense=H;exports.Switch=U;exports.Teleport=F;exports.component=$;exports.createElements=z;exports.createPortal=S;exports.createRoot=R;exports.defineComponent=j;exports.hydrate=v;exports.isBrowser=C;exports.jsx=m;exports.jsxs=O;exports.lazy=b;exports.mount=N;exports.onDOMReady=A;exports.queueUpdate=D;exports.render=f;//# sourceMappingURL=index.cjs.map
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs","sourcesContent":[]}
1
+ {"version":3,"sources":["../src/mod/render.ts","../src/mod/runtime.ts"],"names":["updateQueue","isFlushPending","render","component","container","options","target","element","newElement","mount","createPortal","children","placeholder","hydrate","targetElement","lazy","loader","fallback","loadedComponent","loading","error","props","errorDiv","module","err","createLoadingElement","div","ErrorBoundary","Suspense","Teleport","queueUpdate","fn","flushUpdates","updates","isBrowser","onDOMReady","callback","createRoot","mounted","jsx","type","createHTMLElement","jsxs","Fragment","fragment","normalizeChildren","child","key","value","appendChildren","handleRef","handleEvent","handleClassName","handleStyle","isSignal","handleReactiveProp","parent","textNode","effect","ref","eventName","handler","event","className","styles","applyStyles","cssKey","m","signal","defineComponent","setup","createElements","elements","el","Show","currentElement","when","condition","Switch","caseItem","For","each","items","item","index"],"mappings":"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","file":"index.cjs","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// src/mod/render.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import type { JSXElement, RenderOptions, MountedComponent } from '../types';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ INIT ════════════════════════════════════════╗\r\n\r\n let updateQueue: (() => void)[] = [];\r\n let isFlushPending = false;\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Render a component to the DOM\r\n * @param component - Component or JSX element to render\r\n * @param container - DOM element or selector to mount to\r\n * @param options - Rendering options (mode, callbacks)\r\n * @returns MountedComponent with unmount and update methods\r\n * @throws Error if container not found or component returns null\r\n * @example\r\n * const el = jsx('div', { children: 'Hello' });\r\n * render(el, document.body);\r\n */\r\n export function render(\r\n component: JSXElement | (() => JSXElement),\r\n container: HTMLElement | string,\r\n options: RenderOptions = {}\r\n ): MountedComponent {\r\n // Resolve container\r\n const target = typeof container === 'string'\r\n ? document.querySelector(container)\r\n : container;\r\n\r\n if (!target) {\r\n throw new Error(`Container not found: ${container}`);\r\n }\r\n\r\n // Get element from component\r\n const element = typeof component === 'function' ? component() : component;\r\n\r\n if (!element) {\r\n throw new Error('Component returned null or undefined');\r\n }\r\n\r\n // Mount to DOM based on mode\r\n const mode = options.mode || 'replace';\r\n\r\n switch (mode) {\r\n case 'replace':\r\n target.innerHTML = '';\r\n target.appendChild(element as Node);\r\n break;\r\n\r\n case 'append':\r\n target.appendChild(element as Node);\r\n break;\r\n\r\n case 'prepend':\r\n target.insertBefore(element as Node, target.firstChild);\r\n break;\r\n\r\n default:\r\n // Invalid mode, fall back to replace\r\n target.innerHTML = '';\r\n target.appendChild(element as Node);\r\n }\r\n\r\n // Call onMount callback\r\n options.onMount?.();\r\n\r\n // Return mounted component interface\r\n return {\r\n element: element as Element | DocumentFragment,\r\n\r\n unmount: () => {\r\n if (element instanceof Element) {\r\n element.remove();\r\n } else if (element instanceof DocumentFragment) {\r\n // DocumentFragment doesn't have remove method, remove all children\r\n while (element.firstChild) {\r\n element.removeChild(element.firstChild);\r\n }\r\n }\r\n options.onUnmount?.();\r\n },\r\n\r\n update: (newElement: JSXElement) => {\r\n if (element instanceof Element && newElement instanceof Element) {\r\n element.replaceWith(newElement);\r\n } else if (newElement instanceof Element) {\r\n // If current is DocumentFragment and new is Element\r\n if (element instanceof DocumentFragment && element.parentNode) {\r\n element.parentNode.replaceChild(newElement, element);\r\n }\r\n }\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Simple mount function (alias for render with replace mode)\r\n */\r\n export function mount(\r\n component: JSXElement | (() => JSXElement),\r\n container: HTMLElement | string\r\n ): MountedComponent {\r\n return render(component, container, { mode: 'replace' });\r\n }\r\n\r\n /**\r\n * Render component to a different location in the DOM\r\n */\r\n export function createPortal(\r\n children: JSXElement,\r\n container: HTMLElement | string\r\n ): JSXElement {\r\n const target = typeof container === 'string'\r\n ? document.querySelector(container)\r\n : container;\r\n\r\n if (!target) {\r\n throw new Error(`Portal container not found: ${container}`);\r\n }\r\n\r\n // Create a placeholder comment\r\n const placeholder = document.createComment('portal');\r\n\r\n // Mount children to target\r\n if (children instanceof Node) {\r\n target.appendChild(children);\r\n }\r\n\r\n return placeholder as any;\r\n }\r\n\r\n /**\r\n * Hydrate server-rendered HTML with client-side interactivity\r\n * @param component - Component to hydrate\r\n * @param container - Container with server-rendered HTML\r\n */\r\n export function hydrate(\r\n component: JSXElement | (() => JSXElement),\r\n container: HTMLElement | string\r\n ): MountedComponent {\r\n const targetElement = typeof container === 'string'\r\n ? document.querySelector(container)\r\n : container;\r\n\r\n const target = targetElement instanceof HTMLElement ? targetElement : null;\r\n\r\n if (!target) {\r\n throw new Error(`Container not found: ${container}`);\r\n }\r\n\r\n // For now, just replace (future: smart hydration)\r\n return render(component, target, { mode: 'replace' });\r\n }\r\n\r\n /**\r\n * Lazy load a component with dynamic imports\r\n * @param loader - Async function that returns a component module\r\n * @param fallback - Element to show while loading (optional)\r\n * @returns A component that renders loaded component or fallback/error state\r\n * @example\r\n * const LazyComponent = lazy(() => import('./Component'), <div>Loading...</div>);\r\n */\r\n export function lazy<P = any>(\r\n loader: () => Promise<{ default: (props: P) => JSXElement }>,\r\n fallback?: JSXElement\r\n ): (props: P) => JSXElement {\r\n let loadedComponent: ((props: P) => JSXElement) | null = null;\r\n let loading = false;\r\n let error: Error | null = null;\r\n\r\n return (props: P) => {\r\n // If already loaded, return component\r\n if (loadedComponent) {\r\n return loadedComponent(props);\r\n }\r\n\r\n // If error occurred, show error\r\n if (error) {\r\n const errorDiv = document.createElement('div');\r\n errorDiv.className = 'crux-lazy-error';\r\n errorDiv.textContent = `Error loading component: ${error.message}`;\r\n errorDiv.style.color = 'red';\r\n return errorDiv;\r\n }\r\n\r\n // If not loading yet, start loading\r\n if (!loading) {\r\n loading = true;\r\n\r\n loader()\r\n .then(module => {\r\n loadedComponent = module.default;\r\n // TODO: Trigger re-render when loaded\r\n })\r\n .catch(err => {\r\n error = err instanceof Error ? err : new Error(String(err));\r\n // TODO: Trigger re-render on error\r\n });\r\n }\r\n\r\n // Show fallback while loading\r\n return fallback || createLoadingElement();\r\n };\r\n }\r\n\r\n function createLoadingElement(): HTMLElement {\r\n const div = document.createElement('div');\r\n div.textContent = 'Loading...';\r\n return div;\r\n }\r\n\r\n /**\r\n * Error boundary component\r\n */\r\n export function ErrorBoundary(props: {\r\n fallback: (error: Error) => JSXElement\r\n children: JSXElement\r\n }): JSXElement {\r\n try {\r\n return props.children;\r\n } catch (error) {\r\n return props.fallback(error as Error);\r\n }\r\n }\r\n\r\n /**\r\n * Suspense component for handling loading states\r\n */\r\n export function Suspense(props: {\r\n fallback: JSXElement\r\n children: JSXElement | Promise<JSXElement>\r\n }): JSXElement {\r\n if (props.children instanceof Promise) {\r\n // Create container for async content\r\n const container = document.createElement('div');\r\n container.style.display = 'contents';\r\n\r\n // Show fallback first\r\n if (props.fallback instanceof Node) {\r\n container.appendChild(props.fallback);\r\n }\r\n\r\n // Load actual content\r\n props.children.then(element => {\r\n container.innerHTML = '';\r\n if (element instanceof Node) {\r\n container.appendChild(element);\r\n }\r\n });\r\n\r\n return container;\r\n } else {\r\n return props.children;\r\n }\r\n }\r\n\r\n /**\r\n * Teleport component (like Vue's Teleport)\r\n */\r\n export function Teleport(props: {\r\n to: string | HTMLElement\r\n children: JSXElement\r\n }): JSXElement {\r\n return createPortal(props.children, props.to);\r\n }\r\n\r\n /**\r\n * Queue a DOM update to be batched\r\n */\r\n export function queueUpdate(fn: () => void): void {\r\n updateQueue.push(fn);\r\n\r\n if (!isFlushPending) {\r\n isFlushPending = true;\r\n queueMicrotask(flushUpdates);\r\n }\r\n }\r\n\r\n /**\r\n * Flush all queued updates\r\n */\r\n function flushUpdates(): void {\r\n const updates = updateQueue;\r\n updateQueue = [];\r\n isFlushPending = false;\r\n\r\n updates.forEach(fn => fn());\r\n }\r\n\r\n // ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n // ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n /**\r\n * Check if code is running in browser\r\n */\r\n export function isBrowser(): boolean {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined';\r\n }\r\n\r\n /**\r\n * Wait for DOM to be ready\r\n */\r\n export function onDOMReady(callback: () => void): void {\r\n if (isBrowser()) {\r\n if (document.readyState === 'loading') {\r\n document.addEventListener('DOMContentLoaded', callback);\r\n } else {\r\n callback();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create a root for rendering\r\n */\r\n export function createRoot(container: HTMLElement | string) {\r\n const target = typeof container === 'string'\r\n ? document.querySelector(container)\r\n : container;\r\n\r\n if (!target || !(target instanceof HTMLElement)) {\r\n throw new Error(`Root container not found: ${container}`);\r\n }\r\n\r\n let mounted: MountedComponent | null = null;\r\n\r\n return {\r\n render(component: JSXElement | (() => JSXElement)) {\r\n if (mounted) {\r\n mounted.unmount();\r\n }\r\n mounted = render(component, target);\r\n },\r\n\r\n unmount() {\r\n if (mounted) {\r\n mounted.unmount();\r\n mounted = null;\r\n }\r\n }\r\n };\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// src/mod/runtime.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { effect, isSignal, type Signal } from '@minejs/signals';\r\n import type { JSXElement, JSXProps, ComponentFunction } from '../types';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Creates a DOM element from JSX\r\n * This is called automatically by TypeScript when it sees JSX syntax\r\n */\r\n export function jsx(\r\n type: string | ComponentFunction,\r\n props: JSXProps | null\r\n ): JSXElement | null {\r\n // Handle component (function)\r\n if (typeof type === 'function') {\r\n return type(props || {});\r\n }\r\n\r\n // Handle HTML element (string)\r\n return createHTMLElement(type, props || {});\r\n }\r\n\r\n /**\r\n * Same as jsx() but for elements with multiple children\r\n * (Used by TypeScript JSX transform)\r\n */\r\n export const jsxs = jsx;\r\n\r\n /**\r\n * Fragment component (like React.Fragment)\r\n */\r\n export function Fragment(props: { children?: any }): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n const children = normalizeChildren(props.children);\r\n\r\n children.forEach(child => {\r\n if (child instanceof Node) {\r\n fragment.appendChild(child);\r\n }\r\n });\r\n\r\n return fragment;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ ════ ════════════════════════════════════════╗\r\n\r\n // ============================================================================\r\n // HTML ELEMENT CREATION\r\n // ============================================================================\r\n\r\n function createHTMLElement(type: string, props: JSXProps): Element {\r\n const element = document.createElement(type);\r\n\r\n // Set properties and attributes\r\n for (const [key, value] of Object.entries(props)) {\r\n if (key === 'children') {\r\n // Handle children separately\r\n appendChildren(element, value);\r\n } else if (key === 'ref') {\r\n // Handle ref\r\n handleRef(element as HTMLElement, value);\r\n } else if (key.startsWith('on')) {\r\n // Handle events (onClick, onInput, etc)\r\n handleEvent(element, key, value);\r\n } else if (key === 'className' || key === 'class') {\r\n // Handle className/class\r\n handleClassName(element, value);\r\n } else if (key === 'style') {\r\n // Handle inline styles\r\n handleStyle(element as HTMLElement, value);\r\n } else if (isSignal(value)) {\r\n // Handle reactive props\r\n handleReactiveProp(element, key, value);\r\n } else if (typeof value === 'boolean') {\r\n // Handle boolean attributes (disabled, checked, etc)\r\n if (value) {\r\n element.setAttribute(key, '');\r\n }\r\n } else if (value != null) {\r\n // Handle static props\r\n element.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n // ============================================================================\r\n // CHILDREN HANDLING\r\n // ============================================================================\r\n\r\n function appendChildren(parent: Element, children: any): void {\r\n const normalized = normalizeChildren(children);\r\n\r\n normalized.forEach(child => {\r\n if (child instanceof Node) {\r\n parent.appendChild(child);\r\n } else if (isSignal(child)) {\r\n // Reactive text node\r\n const textNode = document.createTextNode('');\r\n effect(() => {\r\n textNode.textContent = String(child());\r\n });\r\n parent.appendChild(textNode);\r\n } else if (child != null && child !== false) {\r\n // Static text node\r\n parent.appendChild(document.createTextNode(String(child)));\r\n }\r\n });\r\n }\r\n\r\n function normalizeChildren(children: any): any[] {\r\n if (children == null || children === false) {\r\n return [];\r\n }\r\n\r\n if (Array.isArray(children)) {\r\n return children.flatMap(normalizeChildren);\r\n }\r\n\r\n return [children];\r\n }\r\n\r\n // ============================================================================\r\n // REF HANDLING\r\n // ============================================================================\r\n\r\n function handleRef(element: HTMLElement, ref: any): void {\r\n if (isSignal(ref)) {\r\n ref.set(element);\r\n } else if (typeof ref === 'function') {\r\n ref(element);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // EVENT HANDLING\r\n // ============================================================================\r\n\r\n function handleEvent(element: Element, eventName: string, handler: any): void {\r\n if (typeof handler !== 'function') return;\r\n\r\n // Convert onClick → click, onInput → input, etc\r\n const event = eventName.slice(2).toLowerCase();\r\n\r\n element.addEventListener(event, handler);\r\n }\r\n\r\n // ============================================================================\r\n // CLASS NAME HANDLING\r\n // ============================================================================\r\n\r\n function handleClassName(element: Element, value: any): void {\r\n if (isSignal(value)) {\r\n // Reactive className\r\n effect(() => {\r\n const className = value();\r\n if (className != null) {\r\n element.className = String(className);\r\n }\r\n });\r\n } else if (value != null) {\r\n // Static className\r\n element.className = String(value);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // STYLE HANDLING\r\n // ============================================================================\r\n\r\n function handleStyle(element: HTMLElement, value: any): void {\r\n if (isSignal(value)) {\r\n // Reactive style object\r\n effect(() => {\r\n const styles = value();\r\n applyStyles(element, styles);\r\n });\r\n } else {\r\n // Static style\r\n applyStyles(element, value);\r\n }\r\n }\r\n\r\n function applyStyles(element: HTMLElement, styles: any): void {\r\n if (typeof styles === 'string') {\r\n element.style.cssText = styles;\r\n } else if (typeof styles === 'object' && styles != null) {\r\n Object.entries(styles).forEach(([key, value]) => {\r\n if (value != null) {\r\n // Convert camelCase to kebab-case\r\n const cssKey = key.replace(/[A-Z]/g, m => `-${m.toLowerCase()}`);\r\n element.style.setProperty(cssKey, String(value));\r\n }\r\n });\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // REACTIVE PROP HANDLING\r\n // ============================================================================\r\n\r\n function handleReactiveProp(element: Element, key: string, signal: Signal<any>): void {\r\n effect(() => {\r\n const value = signal();\r\n\r\n if (value != null) {\r\n if (key in element) {\r\n // Set as property (for input.value, etc)\r\n ; (element as any)[key] = value;\r\n } else {\r\n // Set as attribute\r\n element.setAttribute(key, String(value));\r\n }\r\n } else {\r\n element.removeAttribute(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Create a component from a function\r\n * Provides a cleaner API than raw JSX\r\n */\r\n export function component<P = any>(\r\n fn: (props: P) => JSXElement | null\r\n ): ComponentFunction<P> {\r\n return fn;\r\n }\r\n\r\n /**\r\n * Create a component with setup function\r\n * Similar to Vue's Composition API\r\n */\r\n export function defineComponent<P = any>(\r\n setup: (props: P) => () => JSXElement | null\r\n ): ComponentFunction<P> {\r\n return (props: P) => {\r\n const render = setup(props);\r\n return render();\r\n };\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY FUNCTIONS\r\n // ============================================================================\r\n\r\n /**\r\n * Create multiple elements at once\r\n */\r\n export function createElements(elements: any[]): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n\r\n elements.forEach(el => {\r\n if (el instanceof Node) {\r\n fragment.appendChild(el);\r\n }\r\n });\r\n\r\n return fragment;\r\n }\r\n\r\n /**\r\n * Show/hide element based on condition\r\n */\r\n export function Show(props: {\r\n when: boolean | Signal<boolean>\r\n children: any\r\n }): JSXElement | null {\r\n if (isSignal(props.when)) {\r\n const placeholder = document.createComment('show');\r\n const parent = document.createDocumentFragment();\r\n parent.appendChild(placeholder);\r\n\r\n let currentElement: Element | null = null;\r\n\r\n effect(() => {\r\n const when = props.when as Signal<boolean>;\r\n const condition = when();\r\n\r\n if (condition && !currentElement) {\r\n // Show: create and insert element\r\n const children = normalizeChildren(props.children);\r\n currentElement = children[0] as Element;\r\n\r\n if (currentElement instanceof Node) {\r\n placeholder.parentNode?.insertBefore(currentElement, placeholder);\r\n }\r\n } else if (!condition && currentElement) {\r\n // Hide: remove element\r\n currentElement.remove();\r\n currentElement = null;\r\n }\r\n });\r\n\r\n return parent as any;\r\n } else {\r\n // Static condition\r\n return (props.when as boolean) ? jsx(Fragment, { children: props.children }) : null;\r\n }\r\n }\r\n\r\n /**\r\n * Render different elements based on condition\r\n */\r\n export function Switch(props: {\r\n children: { when: boolean | Signal<boolean>; children: any }[]\r\n }): JSXElement | null {\r\n // Find first matching case\r\n for (const caseItem of props.children) {\r\n const condition = isSignal(caseItem.when) ? caseItem.when() : caseItem.when;\r\n\r\n if (condition) {\r\n return jsx(Fragment, { children: caseItem.children });\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Iterate over array and render elements\r\n */\r\n export function For<T>(props: {\r\n each: T[] | Signal<T[]>\r\n children: (item: T, index: number) => JSXElement\r\n }): JSXElement {\r\n const fragment = document.createDocumentFragment();\r\n\r\n if (isSignal(props.each)) {\r\n // Reactive list\r\n const container = document.createElement('div');\r\n container.style.display = 'contents'; // Don't affect layout\r\n\r\n effect(() => {\r\n const each = props.each as Signal<T[]>;\r\n const items = each();\r\n container.innerHTML = ''; // Clear\r\n\r\n items.forEach((item: any, index: any) => {\r\n const element = props.children(item, index);\r\n if (element instanceof Node) {\r\n container.appendChild(element);\r\n }\r\n });\r\n });\r\n\r\n fragment.appendChild(container);\r\n } else {\r\n // Static list\r\n const each = props.each as T[];\r\n each.forEach((item, index) => {\r\n const element = props.children(item, index);\r\n if (element instanceof Node) {\r\n fragment.appendChild(element);\r\n }\r\n });\r\n }\r\n\r\n return fragment as any;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n"]}
package/dist/index.d.cts CHANGED
@@ -1,2 +1,83 @@
1
- export * from '@minejsx/render';
2
- export * from '@minejsx/runtime';
1
+ import { J as JSXElement, R as RenderOptions, M as MountedComponent } from './jsx-dev-runtime-BcuwRgdf.cjs';
2
+ export { C as ComponentFunction, g as For, F as Fragment, a as JSXProps, S as Show, f as Switch, c as component, e as createElements, d as defineComponent, j as jsx, b as jsxs } from './jsx-dev-runtime-BcuwRgdf.cjs';
3
+ import '@minejs/signals';
4
+
5
+ /**
6
+ * Render a component to the DOM
7
+ * @param component - Component or JSX element to render
8
+ * @param container - DOM element or selector to mount to
9
+ * @param options - Rendering options (mode, callbacks)
10
+ * @returns MountedComponent with unmount and update methods
11
+ * @throws Error if container not found or component returns null
12
+ * @example
13
+ * const el = jsx('div', { children: 'Hello' });
14
+ * render(el, document.body);
15
+ */
16
+ declare function render(component: JSXElement | (() => JSXElement), container: HTMLElement | string, options?: RenderOptions): MountedComponent;
17
+ /**
18
+ * Simple mount function (alias for render with replace mode)
19
+ */
20
+ declare function mount(component: JSXElement | (() => JSXElement), container: HTMLElement | string): MountedComponent;
21
+ /**
22
+ * Render component to a different location in the DOM
23
+ */
24
+ declare function createPortal(children: JSXElement, container: HTMLElement | string): JSXElement;
25
+ /**
26
+ * Hydrate server-rendered HTML with client-side interactivity
27
+ * @param component - Component to hydrate
28
+ * @param container - Container with server-rendered HTML
29
+ */
30
+ declare function hydrate(component: JSXElement | (() => JSXElement), container: HTMLElement | string): MountedComponent;
31
+ /**
32
+ * Lazy load a component with dynamic imports
33
+ * @param loader - Async function that returns a component module
34
+ * @param fallback - Element to show while loading (optional)
35
+ * @returns A component that renders loaded component or fallback/error state
36
+ * @example
37
+ * const LazyComponent = lazy(() => import('./Component'), <div>Loading...</div>);
38
+ */
39
+ declare function lazy<P = any>(loader: () => Promise<{
40
+ default: (props: P) => JSXElement;
41
+ }>, fallback?: JSXElement): (props: P) => JSXElement;
42
+ /**
43
+ * Error boundary component
44
+ */
45
+ declare function ErrorBoundary(props: {
46
+ fallback: (error: Error) => JSXElement;
47
+ children: JSXElement;
48
+ }): JSXElement;
49
+ /**
50
+ * Suspense component for handling loading states
51
+ */
52
+ declare function Suspense(props: {
53
+ fallback: JSXElement;
54
+ children: JSXElement | Promise<JSXElement>;
55
+ }): JSXElement;
56
+ /**
57
+ * Teleport component (like Vue's Teleport)
58
+ */
59
+ declare function Teleport(props: {
60
+ to: string | HTMLElement;
61
+ children: JSXElement;
62
+ }): JSXElement;
63
+ /**
64
+ * Queue a DOM update to be batched
65
+ */
66
+ declare function queueUpdate(fn: () => void): void;
67
+ /**
68
+ * Check if code is running in browser
69
+ */
70
+ declare function isBrowser(): boolean;
71
+ /**
72
+ * Wait for DOM to be ready
73
+ */
74
+ declare function onDOMReady(callback: () => void): void;
75
+ /**
76
+ * Create a root for rendering
77
+ */
78
+ declare function createRoot(container: HTMLElement | string): {
79
+ render(component: JSXElement | (() => JSXElement)): void;
80
+ unmount(): void;
81
+ };
82
+
83
+ export { ErrorBoundary, JSXElement, MountedComponent, RenderOptions, Suspense, Teleport, createPortal, createRoot, hydrate, isBrowser, lazy, mount, onDOMReady, queueUpdate, render };
package/dist/index.d.ts CHANGED
@@ -1,2 +1,83 @@
1
- export * from '@minejsx/render';
2
- export * from '@minejsx/runtime';
1
+ import { J as JSXElement, R as RenderOptions, M as MountedComponent } from './jsx-dev-runtime-BcuwRgdf.js';
2
+ export { C as ComponentFunction, g as For, F as Fragment, a as JSXProps, S as Show, f as Switch, c as component, e as createElements, d as defineComponent, j as jsx, b as jsxs } from './jsx-dev-runtime-BcuwRgdf.js';
3
+ import '@minejs/signals';
4
+
5
+ /**
6
+ * Render a component to the DOM
7
+ * @param component - Component or JSX element to render
8
+ * @param container - DOM element or selector to mount to
9
+ * @param options - Rendering options (mode, callbacks)
10
+ * @returns MountedComponent with unmount and update methods
11
+ * @throws Error if container not found or component returns null
12
+ * @example
13
+ * const el = jsx('div', { children: 'Hello' });
14
+ * render(el, document.body);
15
+ */
16
+ declare function render(component: JSXElement | (() => JSXElement), container: HTMLElement | string, options?: RenderOptions): MountedComponent;
17
+ /**
18
+ * Simple mount function (alias for render with replace mode)
19
+ */
20
+ declare function mount(component: JSXElement | (() => JSXElement), container: HTMLElement | string): MountedComponent;
21
+ /**
22
+ * Render component to a different location in the DOM
23
+ */
24
+ declare function createPortal(children: JSXElement, container: HTMLElement | string): JSXElement;
25
+ /**
26
+ * Hydrate server-rendered HTML with client-side interactivity
27
+ * @param component - Component to hydrate
28
+ * @param container - Container with server-rendered HTML
29
+ */
30
+ declare function hydrate(component: JSXElement | (() => JSXElement), container: HTMLElement | string): MountedComponent;
31
+ /**
32
+ * Lazy load a component with dynamic imports
33
+ * @param loader - Async function that returns a component module
34
+ * @param fallback - Element to show while loading (optional)
35
+ * @returns A component that renders loaded component or fallback/error state
36
+ * @example
37
+ * const LazyComponent = lazy(() => import('./Component'), <div>Loading...</div>);
38
+ */
39
+ declare function lazy<P = any>(loader: () => Promise<{
40
+ default: (props: P) => JSXElement;
41
+ }>, fallback?: JSXElement): (props: P) => JSXElement;
42
+ /**
43
+ * Error boundary component
44
+ */
45
+ declare function ErrorBoundary(props: {
46
+ fallback: (error: Error) => JSXElement;
47
+ children: JSXElement;
48
+ }): JSXElement;
49
+ /**
50
+ * Suspense component for handling loading states
51
+ */
52
+ declare function Suspense(props: {
53
+ fallback: JSXElement;
54
+ children: JSXElement | Promise<JSXElement>;
55
+ }): JSXElement;
56
+ /**
57
+ * Teleport component (like Vue's Teleport)
58
+ */
59
+ declare function Teleport(props: {
60
+ to: string | HTMLElement;
61
+ children: JSXElement;
62
+ }): JSXElement;
63
+ /**
64
+ * Queue a DOM update to be batched
65
+ */
66
+ declare function queueUpdate(fn: () => void): void;
67
+ /**
68
+ * Check if code is running in browser
69
+ */
70
+ declare function isBrowser(): boolean;
71
+ /**
72
+ * Wait for DOM to be ready
73
+ */
74
+ declare function onDOMReady(callback: () => void): void;
75
+ /**
76
+ * Create a root for rendering
77
+ */
78
+ declare function createRoot(container: HTMLElement | string): {
79
+ render(component: JSXElement | (() => JSXElement)): void;
80
+ unmount(): void;
81
+ };
82
+
83
+ export { ErrorBoundary, JSXElement, MountedComponent, RenderOptions, Suspense, Teleport, createPortal, createRoot, hydrate, isBrowser, lazy, mount, onDOMReady, queueUpdate, render };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export*from'@minejsx/render';export*from'@minejsx/runtime';//# sourceMappingURL=index.js.map
1
+ import {isSignal,effect}from'@minejs/signals';var d=[],u=false;function f(e,n,t={}){let o=typeof n=="string"?document.querySelector(n):n;if(!o)throw new Error(`Container not found: ${n}`);let r=typeof e=="function"?e():e;if(!r)throw new Error("Component returned null or undefined");switch(t.mode||"replace"){case "replace":o.innerHTML="",o.appendChild(r);break;case "append":o.appendChild(r);break;case "prepend":o.insertBefore(r,o.firstChild);break;default:o.innerHTML="",o.appendChild(r);}return t.onMount?.(),{element:r,unmount:()=>{if(r instanceof Element)r.remove();else if(r instanceof DocumentFragment)for(;r.firstChild;)r.removeChild(r.firstChild);t.onUnmount?.();},update:l=>{r instanceof Element&&l instanceof Element?r.replaceWith(l):l instanceof Element&&r instanceof DocumentFragment&&r.parentNode&&r.parentNode.replaceChild(l,r);}}}function N(e,n){return f(e,n,{mode:"replace"})}function S(e,n){let t=typeof n=="string"?document.querySelector(n):n;if(!t)throw new Error(`Portal container not found: ${n}`);let o=document.createComment("portal");return e instanceof Node&&t.appendChild(e),o}function v(e,n){let t=typeof n=="string"?document.querySelector(n):n,o=t instanceof HTMLElement?t:null;if(!o)throw new Error(`Container not found: ${n}`);return f(e,o,{mode:"replace"})}function b(e,n){let t=null,o=false,r=null;return i=>{if(t)return t(i);if(r){let l=document.createElement("div");return l.className="crux-lazy-error",l.textContent=`Error loading component: ${r.message}`,l.style.color="red",l}return o||(o=true,e().then(l=>{t=l.default;}).catch(l=>{r=l instanceof Error?l:new Error(String(l));})),n||y()}}function y(){let e=document.createElement("div");return e.textContent="Loading...",e}function P(e){try{return e.children}catch(n){return e.fallback(n)}}function H(e){if(e.children instanceof Promise){let n=document.createElement("div");return n.style.display="contents",e.fallback instanceof Node&&n.appendChild(e.fallback),e.children.then(t=>{n.innerHTML="",t instanceof Node&&n.appendChild(t);}),n}else return e.children}function F(e){return S(e.children,e.to)}function D(e){d.push(e),u||(u=true,queueMicrotask(g));}function g(){let e=d;d=[],u=false,e.forEach(n=>n());}function C(){return typeof window<"u"&&typeof document<"u"}function A(e){C()&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",e):e());}function R(e){let n=typeof e=="string"?document.querySelector(e):e;if(!n||!(n instanceof HTMLElement))throw new Error(`Root container not found: ${e}`);let t=null;return {render(o){t&&t.unmount(),t=f(o,n);},unmount(){t&&(t.unmount(),t=null);}}}function m(e,n){return typeof e=="function"?e(n||{}):J(e,n||{})}var O=m;function h(e){let n=document.createDocumentFragment();return s(e.children).forEach(o=>{o instanceof Node&&n.appendChild(o);}),n}function J(e,n){let t=document.createElement(e);for(let[o,r]of Object.entries(n))o==="children"?X(t,r):o==="ref"?x(t,r):o.startsWith("on")?M(t,o,r):o==="className"||o==="class"?T(t,r):o==="style"?w(t,r):isSignal(r)?L(t,o,r):typeof r=="boolean"?r&&t.setAttribute(o,""):r!=null&&t.setAttribute(o,String(r));return t}function X(e,n){s(n).forEach(o=>{if(o instanceof Node)e.appendChild(o);else if(isSignal(o)){let r=document.createTextNode("");effect(()=>{r.textContent=String(o());}),e.appendChild(r);}else o!=null&&o!==false&&e.appendChild(document.createTextNode(String(o)));});}function s(e){return e==null||e===false?[]:Array.isArray(e)?e.flatMap(s):[e]}function x(e,n){isSignal(n)?n.set(e):typeof n=="function"&&n(e);}function M(e,n,t){if(typeof t!="function")return;let o=n.slice(2).toLowerCase();e.addEventListener(o,t);}function T(e,n){isSignal(n)?effect(()=>{let t=n();t!=null&&(e.className=String(t));}):n!=null&&(e.className=String(n));}function w(e,n){isSignal(n)?effect(()=>{let t=n();E(e,t);}):E(e,n);}function E(e,n){typeof n=="string"?e.style.cssText=n:typeof n=="object"&&n!=null&&Object.entries(n).forEach(([t,o])=>{if(o!=null){let r=t.replace(/[A-Z]/g,i=>`-${i.toLowerCase()}`);e.style.setProperty(r,String(o));}});}function L(e,n,t){effect(()=>{let o=t();o!=null?n in e?e[n]=o:e.setAttribute(n,String(o)):e.removeAttribute(n);});}function $(e){return e}function j(e){return n=>e(n)()}function z(e){let n=document.createDocumentFragment();return e.forEach(t=>{t instanceof Node&&n.appendChild(t);}),n}function B(e){if(isSignal(e.when)){let n=document.createComment("show"),t=document.createDocumentFragment();t.appendChild(n);let o=null;return effect(()=>{let r=e.when,i=r();i&&!o?(o=s(e.children)[0],o instanceof Node&&n.parentNode?.insertBefore(o,n)):!i&&o&&(o.remove(),o=null);}),t}else return e.when?m(h,{children:e.children}):null}function U(e){for(let n of e.children)if(isSignal(n.when)?n.when():n.when)return m(h,{children:n.children});return null}function W(e){let n=document.createDocumentFragment();if(isSignal(e.each)){let t=document.createElement("div");t.style.display="contents",effect(()=>{let o=e.each,r=o();t.innerHTML="",r.forEach((i,l)=>{let p=e.children(i,l);p instanceof Node&&t.appendChild(p);});}),n.appendChild(t);}else e.each.forEach((o,r)=>{let i=e.children(o,r);i instanceof Node&&n.appendChild(i);});return n}export{P as ErrorBoundary,W as For,h as Fragment,B as Show,H as Suspense,U as Switch,F as Teleport,$ as component,z as createElements,S as createPortal,R as createRoot,j as defineComponent,v as hydrate,C as isBrowser,m as jsx,O as jsxs,b as lazy,N as mount,A as onDOMReady,D as queueUpdate,f as render};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js","sourcesContent":[]}
1
+ {"version":3,"sources":["../src/mod/render.ts","../src/mod/runtime.ts"],"names":["updateQueue","isFlushPending","render","component","container","options","target","element","newElement","mount","createPortal","children","placeholder","hydrate","targetElement","lazy","loader","fallback","loadedComponent","loading","error","props","errorDiv","module","err","createLoadingElement","div","ErrorBoundary","Suspense","Teleport","queueUpdate","fn","flushUpdates","updates","isBrowser","onDOMReady","callback","createRoot","mounted","jsx","type","createHTMLElement","jsxs","Fragment","fragment","normalizeChildren","child","key","value","appendChildren","handleRef","handleEvent","handleClassName","handleStyle","isSignal","handleReactiveProp","parent","textNode","effect","ref","eventName","handler","event","className","styles","applyStyles","cssKey","m","signal","defineComponent","setup","createElements","elements","el","Show","currentElement","when","condition","Switch","caseItem","For","each","items","item","index"],"mappings":"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","file":"index.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// src/mod/render.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import type { JSXElement, RenderOptions, MountedComponent } from '../types';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ INIT ════════════════════════════════════════╗\r\n\r\n let updateQueue: (() => void)[] = [];\r\n let isFlushPending = false;\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Render a component to the DOM\r\n * @param component - Component or JSX element to render\r\n * @param container - DOM element or selector to mount to\r\n * @param options - Rendering options (mode, callbacks)\r\n * @returns MountedComponent with unmount and update methods\r\n * @throws Error if container not found or component returns null\r\n * @example\r\n * const el = jsx('div', { children: 'Hello' });\r\n * render(el, document.body);\r\n */\r\n export function render(\r\n component: JSXElement | (() => JSXElement),\r\n container: HTMLElement | string,\r\n options: RenderOptions = {}\r\n ): MountedComponent {\r\n // Resolve container\r\n const target = typeof container === 'string'\r\n ? document.querySelector(container)\r\n : container;\r\n\r\n if (!target) {\r\n throw new Error(`Container not found: ${container}`);\r\n }\r\n\r\n // Get element from component\r\n const element = typeof component === 'function' ? component() : component;\r\n\r\n if (!element) {\r\n throw new Error('Component returned null or undefined');\r\n }\r\n\r\n // Mount to DOM based on mode\r\n const mode = options.mode || 'replace';\r\n\r\n switch (mode) {\r\n case 'replace':\r\n target.innerHTML = '';\r\n target.appendChild(element as Node);\r\n break;\r\n\r\n case 'append':\r\n target.appendChild(element as Node);\r\n break;\r\n\r\n case 'prepend':\r\n target.insertBefore(element as Node, target.firstChild);\r\n break;\r\n\r\n default:\r\n // Invalid mode, fall back to replace\r\n target.innerHTML = '';\r\n target.appendChild(element as Node);\r\n }\r\n\r\n // Call onMount callback\r\n options.onMount?.();\r\n\r\n // Return mounted component interface\r\n return {\r\n element: element as Element | DocumentFragment,\r\n\r\n unmount: () => {\r\n if (element instanceof Element) {\r\n element.remove();\r\n } else if (element instanceof DocumentFragment) {\r\n // DocumentFragment doesn't have remove method, remove all children\r\n while (element.firstChild) {\r\n element.removeChild(element.firstChild);\r\n }\r\n }\r\n options.onUnmount?.();\r\n },\r\n\r\n update: (newElement: JSXElement) => {\r\n if (element instanceof Element && newElement instanceof Element) {\r\n element.replaceWith(newElement);\r\n } else if (newElement instanceof Element) {\r\n // If current is DocumentFragment and new is Element\r\n if (element instanceof DocumentFragment && element.parentNode) {\r\n element.parentNode.replaceChild(newElement, element);\r\n }\r\n }\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Simple mount function (alias for render with replace mode)\r\n */\r\n export function mount(\r\n component: JSXElement | (() => JSXElement),\r\n container: HTMLElement | string\r\n ): MountedComponent {\r\n return render(component, container, { mode: 'replace' });\r\n }\r\n\r\n /**\r\n * Render component to a different location in the DOM\r\n */\r\n export function createPortal(\r\n children: JSXElement,\r\n container: HTMLElement | string\r\n ): JSXElement {\r\n const target = typeof container === 'string'\r\n ? document.querySelector(container)\r\n : container;\r\n\r\n if (!target) {\r\n throw new Error(`Portal container not found: ${container}`);\r\n }\r\n\r\n // Create a placeholder comment\r\n const placeholder = document.createComment('portal');\r\n\r\n // Mount children to target\r\n if (children instanceof Node) {\r\n target.appendChild(children);\r\n }\r\n\r\n return placeholder as any;\r\n }\r\n\r\n /**\r\n * Hydrate server-rendered HTML with client-side interactivity\r\n * @param component - Component to hydrate\r\n * @param container - Container with server-rendered HTML\r\n */\r\n export function hydrate(\r\n component: JSXElement | (() => JSXElement),\r\n container: HTMLElement | string\r\n ): MountedComponent {\r\n const targetElement = typeof container === 'string'\r\n ? document.querySelector(container)\r\n : container;\r\n\r\n const target = targetElement instanceof HTMLElement ? targetElement : null;\r\n\r\n if (!target) {\r\n throw new Error(`Container not found: ${container}`);\r\n }\r\n\r\n // For now, just replace (future: smart hydration)\r\n return render(component, target, { mode: 'replace' });\r\n }\r\n\r\n /**\r\n * Lazy load a component with dynamic imports\r\n * @param loader - Async function that returns a component module\r\n * @param fallback - Element to show while loading (optional)\r\n * @returns A component that renders loaded component or fallback/error state\r\n * @example\r\n * const LazyComponent = lazy(() => import('./Component'), <div>Loading...</div>);\r\n */\r\n export function lazy<P = any>(\r\n loader: () => Promise<{ default: (props: P) => JSXElement }>,\r\n fallback?: JSXElement\r\n ): (props: P) => JSXElement {\r\n let loadedComponent: ((props: P) => JSXElement) | null = null;\r\n let loading = false;\r\n let error: Error | null = null;\r\n\r\n return (props: P) => {\r\n // If already loaded, return component\r\n if (loadedComponent) {\r\n return loadedComponent(props);\r\n }\r\n\r\n // If error occurred, show error\r\n if (error) {\r\n const errorDiv = document.createElement('div');\r\n errorDiv.className = 'crux-lazy-error';\r\n errorDiv.textContent = `Error loading component: ${error.message}`;\r\n errorDiv.style.color = 'red';\r\n return errorDiv;\r\n }\r\n\r\n // If not loading yet, start loading\r\n if (!loading) {\r\n loading = true;\r\n\r\n loader()\r\n .then(module => {\r\n loadedComponent = module.default;\r\n // TODO: Trigger re-render when loaded\r\n })\r\n .catch(err => {\r\n error = err instanceof Error ? err : new Error(String(err));\r\n // TODO: Trigger re-render on error\r\n });\r\n }\r\n\r\n // Show fallback while loading\r\n return fallback || createLoadingElement();\r\n };\r\n }\r\n\r\n function createLoadingElement(): HTMLElement {\r\n const div = document.createElement('div');\r\n div.textContent = 'Loading...';\r\n return div;\r\n }\r\n\r\n /**\r\n * Error boundary component\r\n */\r\n export function ErrorBoundary(props: {\r\n fallback: (error: Error) => JSXElement\r\n children: JSXElement\r\n }): JSXElement {\r\n try {\r\n return props.children;\r\n } catch (error) {\r\n return props.fallback(error as Error);\r\n }\r\n }\r\n\r\n /**\r\n * Suspense component for handling loading states\r\n */\r\n export function Suspense(props: {\r\n fallback: JSXElement\r\n children: JSXElement | Promise<JSXElement>\r\n }): JSXElement {\r\n if (props.children instanceof Promise) {\r\n // Create container for async content\r\n const container = document.createElement('div');\r\n container.style.display = 'contents';\r\n\r\n // Show fallback first\r\n if (props.fallback instanceof Node) {\r\n container.appendChild(props.fallback);\r\n }\r\n\r\n // Load actual content\r\n props.children.then(element => {\r\n container.innerHTML = '';\r\n if (element instanceof Node) {\r\n container.appendChild(element);\r\n }\r\n });\r\n\r\n return container;\r\n } else {\r\n return props.children;\r\n }\r\n }\r\n\r\n /**\r\n * Teleport component (like Vue's Teleport)\r\n */\r\n export function Teleport(props: {\r\n to: string | HTMLElement\r\n children: JSXElement\r\n }): JSXElement {\r\n return createPortal(props.children, props.to);\r\n }\r\n\r\n /**\r\n * Queue a DOM update to be batched\r\n */\r\n export function queueUpdate(fn: () => void): void {\r\n updateQueue.push(fn);\r\n\r\n if (!isFlushPending) {\r\n isFlushPending = true;\r\n queueMicrotask(flushUpdates);\r\n }\r\n }\r\n\r\n /**\r\n * Flush all queued updates\r\n */\r\n function flushUpdates(): void {\r\n const updates = updateQueue;\r\n updateQueue = [];\r\n isFlushPending = false;\r\n\r\n updates.forEach(fn => fn());\r\n }\r\n\r\n // ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n // ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n /**\r\n * Check if code is running in browser\r\n */\r\n export function isBrowser(): boolean {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined';\r\n }\r\n\r\n /**\r\n * Wait for DOM to be ready\r\n */\r\n export function onDOMReady(callback: () => void): void {\r\n if (isBrowser()) {\r\n if (document.readyState === 'loading') {\r\n document.addEventListener('DOMContentLoaded', callback);\r\n } else {\r\n callback();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create a root for rendering\r\n */\r\n export function createRoot(container: HTMLElement | string) {\r\n const target = typeof container === 'string'\r\n ? document.querySelector(container)\r\n : container;\r\n\r\n if (!target || !(target instanceof HTMLElement)) {\r\n throw new Error(`Root container not found: ${container}`);\r\n }\r\n\r\n let mounted: MountedComponent | null = null;\r\n\r\n return {\r\n render(component: JSXElement | (() => JSXElement)) {\r\n if (mounted) {\r\n mounted.unmount();\r\n }\r\n mounted = render(component, target);\r\n },\r\n\r\n unmount() {\r\n if (mounted) {\r\n mounted.unmount();\r\n mounted = null;\r\n }\r\n }\r\n };\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// src/mod/runtime.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { effect, isSignal, type Signal } from '@minejs/signals';\r\n import type { JSXElement, JSXProps, ComponentFunction } from '../types';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Creates a DOM element from JSX\r\n * This is called automatically by TypeScript when it sees JSX syntax\r\n */\r\n export function jsx(\r\n type: string | ComponentFunction,\r\n props: JSXProps | null\r\n ): JSXElement | null {\r\n // Handle component (function)\r\n if (typeof type === 'function') {\r\n return type(props || {});\r\n }\r\n\r\n // Handle HTML element (string)\r\n return createHTMLElement(type, props || {});\r\n }\r\n\r\n /**\r\n * Same as jsx() but for elements with multiple children\r\n * (Used by TypeScript JSX transform)\r\n */\r\n export const jsxs = jsx;\r\n\r\n /**\r\n * Fragment component (like React.Fragment)\r\n */\r\n export function Fragment(props: { children?: any }): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n const children = normalizeChildren(props.children);\r\n\r\n children.forEach(child => {\r\n if (child instanceof Node) {\r\n fragment.appendChild(child);\r\n }\r\n });\r\n\r\n return fragment;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ ════ ════════════════════════════════════════╗\r\n\r\n // ============================================================================\r\n // HTML ELEMENT CREATION\r\n // ============================================================================\r\n\r\n function createHTMLElement(type: string, props: JSXProps): Element {\r\n const element = document.createElement(type);\r\n\r\n // Set properties and attributes\r\n for (const [key, value] of Object.entries(props)) {\r\n if (key === 'children') {\r\n // Handle children separately\r\n appendChildren(element, value);\r\n } else if (key === 'ref') {\r\n // Handle ref\r\n handleRef(element as HTMLElement, value);\r\n } else if (key.startsWith('on')) {\r\n // Handle events (onClick, onInput, etc)\r\n handleEvent(element, key, value);\r\n } else if (key === 'className' || key === 'class') {\r\n // Handle className/class\r\n handleClassName(element, value);\r\n } else if (key === 'style') {\r\n // Handle inline styles\r\n handleStyle(element as HTMLElement, value);\r\n } else if (isSignal(value)) {\r\n // Handle reactive props\r\n handleReactiveProp(element, key, value);\r\n } else if (typeof value === 'boolean') {\r\n // Handle boolean attributes (disabled, checked, etc)\r\n if (value) {\r\n element.setAttribute(key, '');\r\n }\r\n } else if (value != null) {\r\n // Handle static props\r\n element.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n // ============================================================================\r\n // CHILDREN HANDLING\r\n // ============================================================================\r\n\r\n function appendChildren(parent: Element, children: any): void {\r\n const normalized = normalizeChildren(children);\r\n\r\n normalized.forEach(child => {\r\n if (child instanceof Node) {\r\n parent.appendChild(child);\r\n } else if (isSignal(child)) {\r\n // Reactive text node\r\n const textNode = document.createTextNode('');\r\n effect(() => {\r\n textNode.textContent = String(child());\r\n });\r\n parent.appendChild(textNode);\r\n } else if (child != null && child !== false) {\r\n // Static text node\r\n parent.appendChild(document.createTextNode(String(child)));\r\n }\r\n });\r\n }\r\n\r\n function normalizeChildren(children: any): any[] {\r\n if (children == null || children === false) {\r\n return [];\r\n }\r\n\r\n if (Array.isArray(children)) {\r\n return children.flatMap(normalizeChildren);\r\n }\r\n\r\n return [children];\r\n }\r\n\r\n // ============================================================================\r\n // REF HANDLING\r\n // ============================================================================\r\n\r\n function handleRef(element: HTMLElement, ref: any): void {\r\n if (isSignal(ref)) {\r\n ref.set(element);\r\n } else if (typeof ref === 'function') {\r\n ref(element);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // EVENT HANDLING\r\n // ============================================================================\r\n\r\n function handleEvent(element: Element, eventName: string, handler: any): void {\r\n if (typeof handler !== 'function') return;\r\n\r\n // Convert onClick → click, onInput → input, etc\r\n const event = eventName.slice(2).toLowerCase();\r\n\r\n element.addEventListener(event, handler);\r\n }\r\n\r\n // ============================================================================\r\n // CLASS NAME HANDLING\r\n // ============================================================================\r\n\r\n function handleClassName(element: Element, value: any): void {\r\n if (isSignal(value)) {\r\n // Reactive className\r\n effect(() => {\r\n const className = value();\r\n if (className != null) {\r\n element.className = String(className);\r\n }\r\n });\r\n } else if (value != null) {\r\n // Static className\r\n element.className = String(value);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // STYLE HANDLING\r\n // ============================================================================\r\n\r\n function handleStyle(element: HTMLElement, value: any): void {\r\n if (isSignal(value)) {\r\n // Reactive style object\r\n effect(() => {\r\n const styles = value();\r\n applyStyles(element, styles);\r\n });\r\n } else {\r\n // Static style\r\n applyStyles(element, value);\r\n }\r\n }\r\n\r\n function applyStyles(element: HTMLElement, styles: any): void {\r\n if (typeof styles === 'string') {\r\n element.style.cssText = styles;\r\n } else if (typeof styles === 'object' && styles != null) {\r\n Object.entries(styles).forEach(([key, value]) => {\r\n if (value != null) {\r\n // Convert camelCase to kebab-case\r\n const cssKey = key.replace(/[A-Z]/g, m => `-${m.toLowerCase()}`);\r\n element.style.setProperty(cssKey, String(value));\r\n }\r\n });\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // REACTIVE PROP HANDLING\r\n // ============================================================================\r\n\r\n function handleReactiveProp(element: Element, key: string, signal: Signal<any>): void {\r\n effect(() => {\r\n const value = signal();\r\n\r\n if (value != null) {\r\n if (key in element) {\r\n // Set as property (for input.value, etc)\r\n ; (element as any)[key] = value;\r\n } else {\r\n // Set as attribute\r\n element.setAttribute(key, String(value));\r\n }\r\n } else {\r\n element.removeAttribute(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Create a component from a function\r\n * Provides a cleaner API than raw JSX\r\n */\r\n export function component<P = any>(\r\n fn: (props: P) => JSXElement | null\r\n ): ComponentFunction<P> {\r\n return fn;\r\n }\r\n\r\n /**\r\n * Create a component with setup function\r\n * Similar to Vue's Composition API\r\n */\r\n export function defineComponent<P = any>(\r\n setup: (props: P) => () => JSXElement | null\r\n ): ComponentFunction<P> {\r\n return (props: P) => {\r\n const render = setup(props);\r\n return render();\r\n };\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY FUNCTIONS\r\n // ============================================================================\r\n\r\n /**\r\n * Create multiple elements at once\r\n */\r\n export function createElements(elements: any[]): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n\r\n elements.forEach(el => {\r\n if (el instanceof Node) {\r\n fragment.appendChild(el);\r\n }\r\n });\r\n\r\n return fragment;\r\n }\r\n\r\n /**\r\n * Show/hide element based on condition\r\n */\r\n export function Show(props: {\r\n when: boolean | Signal<boolean>\r\n children: any\r\n }): JSXElement | null {\r\n if (isSignal(props.when)) {\r\n const placeholder = document.createComment('show');\r\n const parent = document.createDocumentFragment();\r\n parent.appendChild(placeholder);\r\n\r\n let currentElement: Element | null = null;\r\n\r\n effect(() => {\r\n const when = props.when as Signal<boolean>;\r\n const condition = when();\r\n\r\n if (condition && !currentElement) {\r\n // Show: create and insert element\r\n const children = normalizeChildren(props.children);\r\n currentElement = children[0] as Element;\r\n\r\n if (currentElement instanceof Node) {\r\n placeholder.parentNode?.insertBefore(currentElement, placeholder);\r\n }\r\n } else if (!condition && currentElement) {\r\n // Hide: remove element\r\n currentElement.remove();\r\n currentElement = null;\r\n }\r\n });\r\n\r\n return parent as any;\r\n } else {\r\n // Static condition\r\n return (props.when as boolean) ? jsx(Fragment, { children: props.children }) : null;\r\n }\r\n }\r\n\r\n /**\r\n * Render different elements based on condition\r\n */\r\n export function Switch(props: {\r\n children: { when: boolean | Signal<boolean>; children: any }[]\r\n }): JSXElement | null {\r\n // Find first matching case\r\n for (const caseItem of props.children) {\r\n const condition = isSignal(caseItem.when) ? caseItem.when() : caseItem.when;\r\n\r\n if (condition) {\r\n return jsx(Fragment, { children: caseItem.children });\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Iterate over array and render elements\r\n */\r\n export function For<T>(props: {\r\n each: T[] | Signal<T[]>\r\n children: (item: T, index: number) => JSXElement\r\n }): JSXElement {\r\n const fragment = document.createDocumentFragment();\r\n\r\n if (isSignal(props.each)) {\r\n // Reactive list\r\n const container = document.createElement('div');\r\n container.style.display = 'contents'; // Don't affect layout\r\n\r\n effect(() => {\r\n const each = props.each as Signal<T[]>;\r\n const items = each();\r\n container.innerHTML = ''; // Clear\r\n\r\n items.forEach((item: any, index: any) => {\r\n const element = props.children(item, index);\r\n if (element instanceof Node) {\r\n container.appendChild(element);\r\n }\r\n });\r\n });\r\n\r\n fragment.appendChild(container);\r\n } else {\r\n // Static list\r\n const each = props.each as T[];\r\n each.forEach((item, index) => {\r\n const element = props.children(item, index);\r\n if (element instanceof Node) {\r\n fragment.appendChild(element);\r\n }\r\n });\r\n }\r\n\r\n return fragment as any;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n"]}
@@ -0,0 +1,83 @@
1
+ import { Signal } from '@minejs/signals';
2
+
3
+ type JSXElement = Element | Text | DocumentFragment;
4
+ interface RenderOptions {
5
+ root?: HTMLElement;
6
+ mode?: 'replace' | 'append' | 'prepend';
7
+ onMount?: () => void;
8
+ onUnmount?: () => void;
9
+ }
10
+ interface MountedComponent {
11
+ element: Element | DocumentFragment;
12
+ unmount: () => void;
13
+ update: (newElement: JSXElement) => void;
14
+ }
15
+ type ComponentFunction<P = any> = (props: P) => JSXElement | null;
16
+ interface JSXProps {
17
+ children?: any;
18
+ ref?: Signal<HTMLElement | null>;
19
+ [key: string]: any;
20
+ }
21
+ declare global {
22
+ namespace JSX {
23
+ interface ElementChildrenAttribute {
24
+ children: object;
25
+ }
26
+ }
27
+ }
28
+
29
+ /**
30
+ * Creates a DOM element from JSX
31
+ * This is called automatically by TypeScript when it sees JSX syntax
32
+ */
33
+ declare function jsx(type: string | ComponentFunction, props: JSXProps | null): JSXElement | null;
34
+ /**
35
+ * Same as jsx() but for elements with multiple children
36
+ * (Used by TypeScript JSX transform)
37
+ */
38
+ declare const jsxs: typeof jsx;
39
+ /**
40
+ * Fragment component (like React.Fragment)
41
+ */
42
+ declare function Fragment(props: {
43
+ children?: any;
44
+ }): DocumentFragment;
45
+ /**
46
+ * Create a component from a function
47
+ * Provides a cleaner API than raw JSX
48
+ */
49
+ declare function component<P = any>(fn: (props: P) => JSXElement | null): ComponentFunction<P>;
50
+ /**
51
+ * Create a component with setup function
52
+ * Similar to Vue's Composition API
53
+ */
54
+ declare function defineComponent<P = any>(setup: (props: P) => () => JSXElement | null): ComponentFunction<P>;
55
+ /**
56
+ * Create multiple elements at once
57
+ */
58
+ declare function createElements(elements: any[]): DocumentFragment;
59
+ /**
60
+ * Show/hide element based on condition
61
+ */
62
+ declare function Show(props: {
63
+ when: boolean | Signal<boolean>;
64
+ children: any;
65
+ }): JSXElement | null;
66
+ /**
67
+ * Render different elements based on condition
68
+ */
69
+ declare function Switch(props: {
70
+ children: {
71
+ when: boolean | Signal<boolean>;
72
+ children: any;
73
+ }[];
74
+ }): JSXElement | null;
75
+ /**
76
+ * Iterate over array and render elements
77
+ */
78
+ declare function For<T>(props: {
79
+ each: T[] | Signal<T[]>;
80
+ children: (item: T, index: number) => JSXElement;
81
+ }): JSXElement;
82
+
83
+ export { type ComponentFunction as C, Fragment as F, type JSXElement as J, type MountedComponent as M, type RenderOptions as R, Show as S, type JSXProps as a, jsxs as b, component as c, defineComponent as d, createElements as e, Switch as f, For as g, jsx as j };
@@ -0,0 +1,83 @@
1
+ import { Signal } from '@minejs/signals';
2
+
3
+ type JSXElement = Element | Text | DocumentFragment;
4
+ interface RenderOptions {
5
+ root?: HTMLElement;
6
+ mode?: 'replace' | 'append' | 'prepend';
7
+ onMount?: () => void;
8
+ onUnmount?: () => void;
9
+ }
10
+ interface MountedComponent {
11
+ element: Element | DocumentFragment;
12
+ unmount: () => void;
13
+ update: (newElement: JSXElement) => void;
14
+ }
15
+ type ComponentFunction<P = any> = (props: P) => JSXElement | null;
16
+ interface JSXProps {
17
+ children?: any;
18
+ ref?: Signal<HTMLElement | null>;
19
+ [key: string]: any;
20
+ }
21
+ declare global {
22
+ namespace JSX {
23
+ interface ElementChildrenAttribute {
24
+ children: object;
25
+ }
26
+ }
27
+ }
28
+
29
+ /**
30
+ * Creates a DOM element from JSX
31
+ * This is called automatically by TypeScript when it sees JSX syntax
32
+ */
33
+ declare function jsx(type: string | ComponentFunction, props: JSXProps | null): JSXElement | null;
34
+ /**
35
+ * Same as jsx() but for elements with multiple children
36
+ * (Used by TypeScript JSX transform)
37
+ */
38
+ declare const jsxs: typeof jsx;
39
+ /**
40
+ * Fragment component (like React.Fragment)
41
+ */
42
+ declare function Fragment(props: {
43
+ children?: any;
44
+ }): DocumentFragment;
45
+ /**
46
+ * Create a component from a function
47
+ * Provides a cleaner API than raw JSX
48
+ */
49
+ declare function component<P = any>(fn: (props: P) => JSXElement | null): ComponentFunction<P>;
50
+ /**
51
+ * Create a component with setup function
52
+ * Similar to Vue's Composition API
53
+ */
54
+ declare function defineComponent<P = any>(setup: (props: P) => () => JSXElement | null): ComponentFunction<P>;
55
+ /**
56
+ * Create multiple elements at once
57
+ */
58
+ declare function createElements(elements: any[]): DocumentFragment;
59
+ /**
60
+ * Show/hide element based on condition
61
+ */
62
+ declare function Show(props: {
63
+ when: boolean | Signal<boolean>;
64
+ children: any;
65
+ }): JSXElement | null;
66
+ /**
67
+ * Render different elements based on condition
68
+ */
69
+ declare function Switch(props: {
70
+ children: {
71
+ when: boolean | Signal<boolean>;
72
+ children: any;
73
+ }[];
74
+ }): JSXElement | null;
75
+ /**
76
+ * Iterate over array and render elements
77
+ */
78
+ declare function For<T>(props: {
79
+ each: T[] | Signal<T[]>;
80
+ children: (item: T, index: number) => JSXElement;
81
+ }): JSXElement;
82
+
83
+ export { type ComponentFunction as C, Fragment as F, type JSXElement as J, type MountedComponent as M, type RenderOptions as R, Show as S, type JSXProps as a, jsxs as b, component as c, defineComponent as d, createElements as e, Switch as f, For as g, jsx as j };
@@ -1,2 +1,2 @@
1
- 'use strict';var D=require('@minejsx/render'),E=require('@minejsx/runtime');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var D__namespace=/*#__PURE__*/_interopNamespace(D);var E__namespace=/*#__PURE__*/_interopNamespace(E);var j=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var f=(s,o,m,t)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of a(o))!g.call(s,e)&&e!==m&&j(s,e,{get:()=>o[e],enumerable:!(t=p(o,e))||t.enumerable});return s},x=(s,o,m)=>(f(s,o,"default"),m);var r={};x(r,D__namespace);x(r,E__namespace);var export_Fragment=r.Fragment;var export_jsxDEV=r.jsx;var export_jsxs=r.jsxs;exports.Fragment=export_Fragment;exports.jsxDEV=export_jsxDEV;exports.jsxs=export_jsxs;//# sourceMappingURL=jsx-dev-runtime.cjs.map
1
+ 'use strict';var signals=require('@minejs/signals');function s(e,n){return typeof e=="function"?e(n||{}):m(e,n||{})}var u=s;function f(e){let n=document.createDocumentFragment();return a(e.children).forEach(t=>{t instanceof Node&&n.appendChild(t);}),n}function m(e,n){let o=document.createElement(e);for(let[t,r]of Object.entries(n))t==="children"?p(o,r):t==="ref"?E(o,r):t.startsWith("on")?h(o,t,r):t==="className"||t==="class"?S(o,r):t==="style"?y(o,r):signals.isSignal(r)?g(o,t,r):typeof r=="boolean"?r&&o.setAttribute(t,""):r!=null&&o.setAttribute(t,String(r));return o}function p(e,n){a(n).forEach(t=>{if(t instanceof Node)e.appendChild(t);else if(signals.isSignal(t)){let r=document.createTextNode("");signals.effect(()=>{r.textContent=String(t());}),e.appendChild(r);}else t!=null&&t!==false&&e.appendChild(document.createTextNode(String(t)));});}function a(e){return e==null||e===false?[]:Array.isArray(e)?e.flatMap(a):[e]}function E(e,n){signals.isSignal(n)?n.set(e):typeof n=="function"&&n(e);}function h(e,n,o){if(typeof o!="function")return;let t=n.slice(2).toLowerCase();e.addEventListener(t,o);}function S(e,n){signals.isSignal(n)?signals.effect(()=>{let o=n();o!=null&&(e.className=String(o));}):n!=null&&(e.className=String(n));}function y(e,n){signals.isSignal(n)?signals.effect(()=>{let o=n();c(e,o);}):c(e,n);}function c(e,n){typeof n=="string"?e.style.cssText=n:typeof n=="object"&&n!=null&&Object.entries(n).forEach(([o,t])=>{if(t!=null){let r=o.replace(/[A-Z]/g,d=>`-${d.toLowerCase()}`);e.style.setProperty(r,String(t));}});}function g(e,n,o){signals.effect(()=>{let t=o();t!=null?n in e?e[n]=t:e.setAttribute(n,String(t)):e.removeAttribute(n);});}exports.Fragment=f;exports.jsxDEV=s;exports.jsxs=u;//# sourceMappingURL=jsx-dev-runtime.cjs.map
2
2
  //# sourceMappingURL=jsx-dev-runtime.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["src_exports","__reExport","render_star","runtime_star"],"mappings":"qeAAA,IAAA,CAAA,CAAA,MAAA,CAAA,cAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,wBAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,mBAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,SAAA,CAAA,cAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,GAAA,CAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,UAAA,CAAA,IAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,GAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAAA,CAAAA,CAAA,EAAA,CAQIC,CAAAA,CAAAD,CAAAA,CAAAE,YAAAA,CAAAA,CACAD,CAAAA,CAAAD,CAAAA,CAAAG,YAAAA,CAAAA,CAAc,IAAA,eAAA,CAAA,CAAA,CAAA,SAAA,IAAA,aAAA,CAAA,CAAA,CAAA,IAAA,IAAA,WAAA,CAAA,CAAA,CAAA","file":"jsx-dev-runtime.cjs","sourcesContent":["// src/index.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n export * from '@minejsx/render';\r\n export * from '@minejsx/runtime';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n"]}
1
+ {"version":3,"sources":["../src/mod/runtime.ts"],"names":["jsx","type","props","createHTMLElement","jsxs","Fragment","fragment","normalizeChildren","child","element","key","value","appendChildren","handleRef","handleEvent","handleClassName","handleStyle","isSignal","handleReactiveProp","parent","children","textNode","effect","ref","eventName","handler","event","className","styles","applyStyles","cssKey","m","signal"],"mappings":"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","file":"jsx-dev-runtime.cjs","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// src/mod/runtime.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { effect, isSignal, type Signal } from '@minejs/signals';\r\n import type { JSXElement, JSXProps, ComponentFunction } from '../types';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Creates a DOM element from JSX\r\n * This is called automatically by TypeScript when it sees JSX syntax\r\n */\r\n export function jsx(\r\n type: string | ComponentFunction,\r\n props: JSXProps | null\r\n ): JSXElement | null {\r\n // Handle component (function)\r\n if (typeof type === 'function') {\r\n return type(props || {});\r\n }\r\n\r\n // Handle HTML element (string)\r\n return createHTMLElement(type, props || {});\r\n }\r\n\r\n /**\r\n * Same as jsx() but for elements with multiple children\r\n * (Used by TypeScript JSX transform)\r\n */\r\n export const jsxs = jsx;\r\n\r\n /**\r\n * Fragment component (like React.Fragment)\r\n */\r\n export function Fragment(props: { children?: any }): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n const children = normalizeChildren(props.children);\r\n\r\n children.forEach(child => {\r\n if (child instanceof Node) {\r\n fragment.appendChild(child);\r\n }\r\n });\r\n\r\n return fragment;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ ════ ════════════════════════════════════════╗\r\n\r\n // ============================================================================\r\n // HTML ELEMENT CREATION\r\n // ============================================================================\r\n\r\n function createHTMLElement(type: string, props: JSXProps): Element {\r\n const element = document.createElement(type);\r\n\r\n // Set properties and attributes\r\n for (const [key, value] of Object.entries(props)) {\r\n if (key === 'children') {\r\n // Handle children separately\r\n appendChildren(element, value);\r\n } else if (key === 'ref') {\r\n // Handle ref\r\n handleRef(element as HTMLElement, value);\r\n } else if (key.startsWith('on')) {\r\n // Handle events (onClick, onInput, etc)\r\n handleEvent(element, key, value);\r\n } else if (key === 'className' || key === 'class') {\r\n // Handle className/class\r\n handleClassName(element, value);\r\n } else if (key === 'style') {\r\n // Handle inline styles\r\n handleStyle(element as HTMLElement, value);\r\n } else if (isSignal(value)) {\r\n // Handle reactive props\r\n handleReactiveProp(element, key, value);\r\n } else if (typeof value === 'boolean') {\r\n // Handle boolean attributes (disabled, checked, etc)\r\n if (value) {\r\n element.setAttribute(key, '');\r\n }\r\n } else if (value != null) {\r\n // Handle static props\r\n element.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n // ============================================================================\r\n // CHILDREN HANDLING\r\n // ============================================================================\r\n\r\n function appendChildren(parent: Element, children: any): void {\r\n const normalized = normalizeChildren(children);\r\n\r\n normalized.forEach(child => {\r\n if (child instanceof Node) {\r\n parent.appendChild(child);\r\n } else if (isSignal(child)) {\r\n // Reactive text node\r\n const textNode = document.createTextNode('');\r\n effect(() => {\r\n textNode.textContent = String(child());\r\n });\r\n parent.appendChild(textNode);\r\n } else if (child != null && child !== false) {\r\n // Static text node\r\n parent.appendChild(document.createTextNode(String(child)));\r\n }\r\n });\r\n }\r\n\r\n function normalizeChildren(children: any): any[] {\r\n if (children == null || children === false) {\r\n return [];\r\n }\r\n\r\n if (Array.isArray(children)) {\r\n return children.flatMap(normalizeChildren);\r\n }\r\n\r\n return [children];\r\n }\r\n\r\n // ============================================================================\r\n // REF HANDLING\r\n // ============================================================================\r\n\r\n function handleRef(element: HTMLElement, ref: any): void {\r\n if (isSignal(ref)) {\r\n ref.set(element);\r\n } else if (typeof ref === 'function') {\r\n ref(element);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // EVENT HANDLING\r\n // ============================================================================\r\n\r\n function handleEvent(element: Element, eventName: string, handler: any): void {\r\n if (typeof handler !== 'function') return;\r\n\r\n // Convert onClick → click, onInput → input, etc\r\n const event = eventName.slice(2).toLowerCase();\r\n\r\n element.addEventListener(event, handler);\r\n }\r\n\r\n // ============================================================================\r\n // CLASS NAME HANDLING\r\n // ============================================================================\r\n\r\n function handleClassName(element: Element, value: any): void {\r\n if (isSignal(value)) {\r\n // Reactive className\r\n effect(() => {\r\n const className = value();\r\n if (className != null) {\r\n element.className = String(className);\r\n }\r\n });\r\n } else if (value != null) {\r\n // Static className\r\n element.className = String(value);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // STYLE HANDLING\r\n // ============================================================================\r\n\r\n function handleStyle(element: HTMLElement, value: any): void {\r\n if (isSignal(value)) {\r\n // Reactive style object\r\n effect(() => {\r\n const styles = value();\r\n applyStyles(element, styles);\r\n });\r\n } else {\r\n // Static style\r\n applyStyles(element, value);\r\n }\r\n }\r\n\r\n function applyStyles(element: HTMLElement, styles: any): void {\r\n if (typeof styles === 'string') {\r\n element.style.cssText = styles;\r\n } else if (typeof styles === 'object' && styles != null) {\r\n Object.entries(styles).forEach(([key, value]) => {\r\n if (value != null) {\r\n // Convert camelCase to kebab-case\r\n const cssKey = key.replace(/[A-Z]/g, m => `-${m.toLowerCase()}`);\r\n element.style.setProperty(cssKey, String(value));\r\n }\r\n });\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // REACTIVE PROP HANDLING\r\n // ============================================================================\r\n\r\n function handleReactiveProp(element: Element, key: string, signal: Signal<any>): void {\r\n effect(() => {\r\n const value = signal();\r\n\r\n if (value != null) {\r\n if (key in element) {\r\n // Set as property (for input.value, etc)\r\n ; (element as any)[key] = value;\r\n } else {\r\n // Set as attribute\r\n element.setAttribute(key, String(value));\r\n }\r\n } else {\r\n element.removeAttribute(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Create a component from a function\r\n * Provides a cleaner API than raw JSX\r\n */\r\n export function component<P = any>(\r\n fn: (props: P) => JSXElement | null\r\n ): ComponentFunction<P> {\r\n return fn;\r\n }\r\n\r\n /**\r\n * Create a component with setup function\r\n * Similar to Vue's Composition API\r\n */\r\n export function defineComponent<P = any>(\r\n setup: (props: P) => () => JSXElement | null\r\n ): ComponentFunction<P> {\r\n return (props: P) => {\r\n const render = setup(props);\r\n return render();\r\n };\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY FUNCTIONS\r\n // ============================================================================\r\n\r\n /**\r\n * Create multiple elements at once\r\n */\r\n export function createElements(elements: any[]): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n\r\n elements.forEach(el => {\r\n if (el instanceof Node) {\r\n fragment.appendChild(el);\r\n }\r\n });\r\n\r\n return fragment;\r\n }\r\n\r\n /**\r\n * Show/hide element based on condition\r\n */\r\n export function Show(props: {\r\n when: boolean | Signal<boolean>\r\n children: any\r\n }): JSXElement | null {\r\n if (isSignal(props.when)) {\r\n const placeholder = document.createComment('show');\r\n const parent = document.createDocumentFragment();\r\n parent.appendChild(placeholder);\r\n\r\n let currentElement: Element | null = null;\r\n\r\n effect(() => {\r\n const when = props.when as Signal<boolean>;\r\n const condition = when();\r\n\r\n if (condition && !currentElement) {\r\n // Show: create and insert element\r\n const children = normalizeChildren(props.children);\r\n currentElement = children[0] as Element;\r\n\r\n if (currentElement instanceof Node) {\r\n placeholder.parentNode?.insertBefore(currentElement, placeholder);\r\n }\r\n } else if (!condition && currentElement) {\r\n // Hide: remove element\r\n currentElement.remove();\r\n currentElement = null;\r\n }\r\n });\r\n\r\n return parent as any;\r\n } else {\r\n // Static condition\r\n return (props.when as boolean) ? jsx(Fragment, { children: props.children }) : null;\r\n }\r\n }\r\n\r\n /**\r\n * Render different elements based on condition\r\n */\r\n export function Switch(props: {\r\n children: { when: boolean | Signal<boolean>; children: any }[]\r\n }): JSXElement | null {\r\n // Find first matching case\r\n for (const caseItem of props.children) {\r\n const condition = isSignal(caseItem.when) ? caseItem.when() : caseItem.when;\r\n\r\n if (condition) {\r\n return jsx(Fragment, { children: caseItem.children });\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Iterate over array and render elements\r\n */\r\n export function For<T>(props: {\r\n each: T[] | Signal<T[]>\r\n children: (item: T, index: number) => JSXElement\r\n }): JSXElement {\r\n const fragment = document.createDocumentFragment();\r\n\r\n if (isSignal(props.each)) {\r\n // Reactive list\r\n const container = document.createElement('div');\r\n container.style.display = 'contents'; // Don't affect layout\r\n\r\n effect(() => {\r\n const each = props.each as Signal<T[]>;\r\n const items = each();\r\n container.innerHTML = ''; // Clear\r\n\r\n items.forEach((item: any, index: any) => {\r\n const element = props.children(item, index);\r\n if (element instanceof Node) {\r\n container.appendChild(element);\r\n }\r\n });\r\n });\r\n\r\n fragment.appendChild(container);\r\n } else {\r\n // Static list\r\n const each = props.each as T[];\r\n each.forEach((item, index) => {\r\n const element = props.children(item, index);\r\n if (element instanceof Node) {\r\n fragment.appendChild(element);\r\n }\r\n });\r\n }\r\n\r\n return fragment as any;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n"]}
@@ -1 +1,2 @@
1
- export { Fragment, jsx as jsxDEV, jsxs } from '@minejsx/render';
1
+ export { F as Fragment, j as jsxDEV, b as jsxs } from './jsx-dev-runtime-BcuwRgdf.cjs';
2
+ import '@minejs/signals';
@@ -1 +1,2 @@
1
- export { Fragment, jsx as jsxDEV, jsxs } from '@minejsx/render';
1
+ export { F as Fragment, j as jsxDEV, b as jsxs } from './jsx-dev-runtime-BcuwRgdf.js';
2
+ import '@minejs/signals';
@@ -1,2 +1,2 @@
1
- import*as D from'@minejsx/render';import*as E from'@minejsx/runtime';var j=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var f=(s,o,m,t)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of a(o))!g.call(s,e)&&e!==m&&j(s,e,{get:()=>o[e],enumerable:!(t=p(o,e))||t.enumerable});return s},x=(s,o,m)=>(f(s,o,"default"),m);var r={};x(r,D);x(r,E);var export_Fragment=r.Fragment;var export_jsxDEV=r.jsx;var export_jsxs=r.jsxs;export{export_Fragment as Fragment,export_jsxDEV as jsxDEV,export_jsxs as jsxs};//# sourceMappingURL=jsx-dev-runtime.js.map
1
+ import {isSignal,effect}from'@minejs/signals';function s(e,n){return typeof e=="function"?e(n||{}):m(e,n||{})}var u=s;function f(e){let n=document.createDocumentFragment();return a(e.children).forEach(t=>{t instanceof Node&&n.appendChild(t);}),n}function m(e,n){let o=document.createElement(e);for(let[t,r]of Object.entries(n))t==="children"?p(o,r):t==="ref"?E(o,r):t.startsWith("on")?h(o,t,r):t==="className"||t==="class"?S(o,r):t==="style"?y(o,r):isSignal(r)?g(o,t,r):typeof r=="boolean"?r&&o.setAttribute(t,""):r!=null&&o.setAttribute(t,String(r));return o}function p(e,n){a(n).forEach(t=>{if(t instanceof Node)e.appendChild(t);else if(isSignal(t)){let r=document.createTextNode("");effect(()=>{r.textContent=String(t());}),e.appendChild(r);}else t!=null&&t!==false&&e.appendChild(document.createTextNode(String(t)));});}function a(e){return e==null||e===false?[]:Array.isArray(e)?e.flatMap(a):[e]}function E(e,n){isSignal(n)?n.set(e):typeof n=="function"&&n(e);}function h(e,n,o){if(typeof o!="function")return;let t=n.slice(2).toLowerCase();e.addEventListener(t,o);}function S(e,n){isSignal(n)?effect(()=>{let o=n();o!=null&&(e.className=String(o));}):n!=null&&(e.className=String(n));}function y(e,n){isSignal(n)?effect(()=>{let o=n();c(e,o);}):c(e,n);}function c(e,n){typeof n=="string"?e.style.cssText=n:typeof n=="object"&&n!=null&&Object.entries(n).forEach(([o,t])=>{if(t!=null){let r=o.replace(/[A-Z]/g,d=>`-${d.toLowerCase()}`);e.style.setProperty(r,String(t));}});}function g(e,n,o){effect(()=>{let t=o();t!=null?n in e?e[n]=t:e.setAttribute(n,String(t)):e.removeAttribute(n);});}export{f as Fragment,s as jsxDEV,u as jsxs};//# sourceMappingURL=jsx-dev-runtime.js.map
2
2
  //# sourceMappingURL=jsx-dev-runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["src_exports","__reExport","render_star","runtime_star"],"mappings":"qEAAA,IAAA,CAAA,CAAA,MAAA,CAAA,cAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,wBAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,mBAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,SAAA,CAAA,cAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,GAAA,CAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,UAAA,CAAA,IAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,GAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAAA,CAAAA,CAAA,EAAA,CAQIC,CAAAA,CAAAD,CAAAA,CAAAE,CAAAA,CAAAA,CACAD,CAAAA,CAAAD,CAAAA,CAAAG,CAAAA,CAAAA,CAAc,IAAA,eAAA,CAAA,CAAA,CAAA,SAAA,IAAA,aAAA,CAAA,CAAA,CAAA,IAAA,IAAA,WAAA,CAAA,CAAA,CAAA","file":"jsx-dev-runtime.js","sourcesContent":["// src/index.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n export * from '@minejsx/render';\r\n export * from '@minejsx/runtime';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n"]}
1
+ {"version":3,"sources":["../src/mod/runtime.ts"],"names":["jsx","type","props","createHTMLElement","jsxs","Fragment","fragment","normalizeChildren","child","element","key","value","appendChildren","handleRef","handleEvent","handleClassName","handleStyle","isSignal","handleReactiveProp","parent","children","textNode","effect","ref","eventName","handler","event","className","styles","applyStyles","cssKey","m","signal"],"mappings":"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","file":"jsx-dev-runtime.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// src/mod/runtime.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { effect, isSignal, type Signal } from '@minejs/signals';\r\n import type { JSXElement, JSXProps, ComponentFunction } from '../types';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Creates a DOM element from JSX\r\n * This is called automatically by TypeScript when it sees JSX syntax\r\n */\r\n export function jsx(\r\n type: string | ComponentFunction,\r\n props: JSXProps | null\r\n ): JSXElement | null {\r\n // Handle component (function)\r\n if (typeof type === 'function') {\r\n return type(props || {});\r\n }\r\n\r\n // Handle HTML element (string)\r\n return createHTMLElement(type, props || {});\r\n }\r\n\r\n /**\r\n * Same as jsx() but for elements with multiple children\r\n * (Used by TypeScript JSX transform)\r\n */\r\n export const jsxs = jsx;\r\n\r\n /**\r\n * Fragment component (like React.Fragment)\r\n */\r\n export function Fragment(props: { children?: any }): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n const children = normalizeChildren(props.children);\r\n\r\n children.forEach(child => {\r\n if (child instanceof Node) {\r\n fragment.appendChild(child);\r\n }\r\n });\r\n\r\n return fragment;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ ════ ════════════════════════════════════════╗\r\n\r\n // ============================================================================\r\n // HTML ELEMENT CREATION\r\n // ============================================================================\r\n\r\n function createHTMLElement(type: string, props: JSXProps): Element {\r\n const element = document.createElement(type);\r\n\r\n // Set properties and attributes\r\n for (const [key, value] of Object.entries(props)) {\r\n if (key === 'children') {\r\n // Handle children separately\r\n appendChildren(element, value);\r\n } else if (key === 'ref') {\r\n // Handle ref\r\n handleRef(element as HTMLElement, value);\r\n } else if (key.startsWith('on')) {\r\n // Handle events (onClick, onInput, etc)\r\n handleEvent(element, key, value);\r\n } else if (key === 'className' || key === 'class') {\r\n // Handle className/class\r\n handleClassName(element, value);\r\n } else if (key === 'style') {\r\n // Handle inline styles\r\n handleStyle(element as HTMLElement, value);\r\n } else if (isSignal(value)) {\r\n // Handle reactive props\r\n handleReactiveProp(element, key, value);\r\n } else if (typeof value === 'boolean') {\r\n // Handle boolean attributes (disabled, checked, etc)\r\n if (value) {\r\n element.setAttribute(key, '');\r\n }\r\n } else if (value != null) {\r\n // Handle static props\r\n element.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n // ============================================================================\r\n // CHILDREN HANDLING\r\n // ============================================================================\r\n\r\n function appendChildren(parent: Element, children: any): void {\r\n const normalized = normalizeChildren(children);\r\n\r\n normalized.forEach(child => {\r\n if (child instanceof Node) {\r\n parent.appendChild(child);\r\n } else if (isSignal(child)) {\r\n // Reactive text node\r\n const textNode = document.createTextNode('');\r\n effect(() => {\r\n textNode.textContent = String(child());\r\n });\r\n parent.appendChild(textNode);\r\n } else if (child != null && child !== false) {\r\n // Static text node\r\n parent.appendChild(document.createTextNode(String(child)));\r\n }\r\n });\r\n }\r\n\r\n function normalizeChildren(children: any): any[] {\r\n if (children == null || children === false) {\r\n return [];\r\n }\r\n\r\n if (Array.isArray(children)) {\r\n return children.flatMap(normalizeChildren);\r\n }\r\n\r\n return [children];\r\n }\r\n\r\n // ============================================================================\r\n // REF HANDLING\r\n // ============================================================================\r\n\r\n function handleRef(element: HTMLElement, ref: any): void {\r\n if (isSignal(ref)) {\r\n ref.set(element);\r\n } else if (typeof ref === 'function') {\r\n ref(element);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // EVENT HANDLING\r\n // ============================================================================\r\n\r\n function handleEvent(element: Element, eventName: string, handler: any): void {\r\n if (typeof handler !== 'function') return;\r\n\r\n // Convert onClick → click, onInput → input, etc\r\n const event = eventName.slice(2).toLowerCase();\r\n\r\n element.addEventListener(event, handler);\r\n }\r\n\r\n // ============================================================================\r\n // CLASS NAME HANDLING\r\n // ============================================================================\r\n\r\n function handleClassName(element: Element, value: any): void {\r\n if (isSignal(value)) {\r\n // Reactive className\r\n effect(() => {\r\n const className = value();\r\n if (className != null) {\r\n element.className = String(className);\r\n }\r\n });\r\n } else if (value != null) {\r\n // Static className\r\n element.className = String(value);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // STYLE HANDLING\r\n // ============================================================================\r\n\r\n function handleStyle(element: HTMLElement, value: any): void {\r\n if (isSignal(value)) {\r\n // Reactive style object\r\n effect(() => {\r\n const styles = value();\r\n applyStyles(element, styles);\r\n });\r\n } else {\r\n // Static style\r\n applyStyles(element, value);\r\n }\r\n }\r\n\r\n function applyStyles(element: HTMLElement, styles: any): void {\r\n if (typeof styles === 'string') {\r\n element.style.cssText = styles;\r\n } else if (typeof styles === 'object' && styles != null) {\r\n Object.entries(styles).forEach(([key, value]) => {\r\n if (value != null) {\r\n // Convert camelCase to kebab-case\r\n const cssKey = key.replace(/[A-Z]/g, m => `-${m.toLowerCase()}`);\r\n element.style.setProperty(cssKey, String(value));\r\n }\r\n });\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // REACTIVE PROP HANDLING\r\n // ============================================================================\r\n\r\n function handleReactiveProp(element: Element, key: string, signal: Signal<any>): void {\r\n effect(() => {\r\n const value = signal();\r\n\r\n if (value != null) {\r\n if (key in element) {\r\n // Set as property (for input.value, etc)\r\n ; (element as any)[key] = value;\r\n } else {\r\n // Set as attribute\r\n element.setAttribute(key, String(value));\r\n }\r\n } else {\r\n element.removeAttribute(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Create a component from a function\r\n * Provides a cleaner API than raw JSX\r\n */\r\n export function component<P = any>(\r\n fn: (props: P) => JSXElement | null\r\n ): ComponentFunction<P> {\r\n return fn;\r\n }\r\n\r\n /**\r\n * Create a component with setup function\r\n * Similar to Vue's Composition API\r\n */\r\n export function defineComponent<P = any>(\r\n setup: (props: P) => () => JSXElement | null\r\n ): ComponentFunction<P> {\r\n return (props: P) => {\r\n const render = setup(props);\r\n return render();\r\n };\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY FUNCTIONS\r\n // ============================================================================\r\n\r\n /**\r\n * Create multiple elements at once\r\n */\r\n export function createElements(elements: any[]): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n\r\n elements.forEach(el => {\r\n if (el instanceof Node) {\r\n fragment.appendChild(el);\r\n }\r\n });\r\n\r\n return fragment;\r\n }\r\n\r\n /**\r\n * Show/hide element based on condition\r\n */\r\n export function Show(props: {\r\n when: boolean | Signal<boolean>\r\n children: any\r\n }): JSXElement | null {\r\n if (isSignal(props.when)) {\r\n const placeholder = document.createComment('show');\r\n const parent = document.createDocumentFragment();\r\n parent.appendChild(placeholder);\r\n\r\n let currentElement: Element | null = null;\r\n\r\n effect(() => {\r\n const when = props.when as Signal<boolean>;\r\n const condition = when();\r\n\r\n if (condition && !currentElement) {\r\n // Show: create and insert element\r\n const children = normalizeChildren(props.children);\r\n currentElement = children[0] as Element;\r\n\r\n if (currentElement instanceof Node) {\r\n placeholder.parentNode?.insertBefore(currentElement, placeholder);\r\n }\r\n } else if (!condition && currentElement) {\r\n // Hide: remove element\r\n currentElement.remove();\r\n currentElement = null;\r\n }\r\n });\r\n\r\n return parent as any;\r\n } else {\r\n // Static condition\r\n return (props.when as boolean) ? jsx(Fragment, { children: props.children }) : null;\r\n }\r\n }\r\n\r\n /**\r\n * Render different elements based on condition\r\n */\r\n export function Switch(props: {\r\n children: { when: boolean | Signal<boolean>; children: any }[]\r\n }): JSXElement | null {\r\n // Find first matching case\r\n for (const caseItem of props.children) {\r\n const condition = isSignal(caseItem.when) ? caseItem.when() : caseItem.when;\r\n\r\n if (condition) {\r\n return jsx(Fragment, { children: caseItem.children });\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Iterate over array and render elements\r\n */\r\n export function For<T>(props: {\r\n each: T[] | Signal<T[]>\r\n children: (item: T, index: number) => JSXElement\r\n }): JSXElement {\r\n const fragment = document.createDocumentFragment();\r\n\r\n if (isSignal(props.each)) {\r\n // Reactive list\r\n const container = document.createElement('div');\r\n container.style.display = 'contents'; // Don't affect layout\r\n\r\n effect(() => {\r\n const each = props.each as Signal<T[]>;\r\n const items = each();\r\n container.innerHTML = ''; // Clear\r\n\r\n items.forEach((item: any, index: any) => {\r\n const element = props.children(item, index);\r\n if (element instanceof Node) {\r\n container.appendChild(element);\r\n }\r\n });\r\n });\r\n\r\n fragment.appendChild(container);\r\n } else {\r\n // Static list\r\n const each = props.each as T[];\r\n each.forEach((item, index) => {\r\n const element = props.children(item, index);\r\n if (element instanceof Node) {\r\n fragment.appendChild(element);\r\n }\r\n });\r\n }\r\n\r\n return fragment as any;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n"]}
@@ -1,2 +1,2 @@
1
- 'use strict';var F=require('@minejsx/render'),b=require('@minejsx/runtime');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var F__namespace=/*#__PURE__*/_interopNamespace(F);var b__namespace=/*#__PURE__*/_interopNamespace(b);var s=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var p=(e,o,t,f)=>{if(o&&typeof o=="object"||typeof o=="function")for(let m of a(o))!g.call(e,m)&&m!==t&&s(e,m,{get:()=>o[m],enumerable:!(f=j(o,m))||f.enumerable});return e},x=(e,o,t)=>(p(e,o,"default"),t);var r={};x(r,F__namespace);x(r,b__namespace);var export_Fragment=r.Fragment;var export_jsx=r.jsx;var export_jsxs=r.jsxs;exports.Fragment=export_Fragment;exports.jsx=export_jsx;exports.jsxs=export_jsxs;//# sourceMappingURL=jsx-runtime.cjs.map
1
+ 'use strict';var signals=require('@minejs/signals');function s(e,n){return typeof e=="function"?e(n||{}):m(e,n||{})}var u=s;function f(e){let n=document.createDocumentFragment();return a(e.children).forEach(t=>{t instanceof Node&&n.appendChild(t);}),n}function m(e,n){let o=document.createElement(e);for(let[t,r]of Object.entries(n))t==="children"?p(o,r):t==="ref"?E(o,r):t.startsWith("on")?h(o,t,r):t==="className"||t==="class"?S(o,r):t==="style"?y(o,r):signals.isSignal(r)?g(o,t,r):typeof r=="boolean"?r&&o.setAttribute(t,""):r!=null&&o.setAttribute(t,String(r));return o}function p(e,n){a(n).forEach(t=>{if(t instanceof Node)e.appendChild(t);else if(signals.isSignal(t)){let r=document.createTextNode("");signals.effect(()=>{r.textContent=String(t());}),e.appendChild(r);}else t!=null&&t!==false&&e.appendChild(document.createTextNode(String(t)));});}function a(e){return e==null||e===false?[]:Array.isArray(e)?e.flatMap(a):[e]}function E(e,n){signals.isSignal(n)?n.set(e):typeof n=="function"&&n(e);}function h(e,n,o){if(typeof o!="function")return;let t=n.slice(2).toLowerCase();e.addEventListener(t,o);}function S(e,n){signals.isSignal(n)?signals.effect(()=>{let o=n();o!=null&&(e.className=String(o));}):n!=null&&(e.className=String(n));}function y(e,n){signals.isSignal(n)?signals.effect(()=>{let o=n();c(e,o);}):c(e,n);}function c(e,n){typeof n=="string"?e.style.cssText=n:typeof n=="object"&&n!=null&&Object.entries(n).forEach(([o,t])=>{if(t!=null){let r=o.replace(/[A-Z]/g,d=>`-${d.toLowerCase()}`);e.style.setProperty(r,String(t));}});}function g(e,n,o){signals.effect(()=>{let t=o();t!=null?n in e?e[n]=t:e.setAttribute(n,String(t)):e.removeAttribute(n);});}exports.Fragment=f;exports.jsx=s;exports.jsxs=u;//# sourceMappingURL=jsx-runtime.cjs.map
2
2
  //# sourceMappingURL=jsx-runtime.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["src_exports","__reExport","render_star","runtime_star"],"mappings":"qeAAA,IAAA,CAAA,CAAA,MAAA,CAAA,cAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,wBAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,mBAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,SAAA,CAAA,cAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,GAAA,CAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,UAAA,CAAA,IAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,GAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAAA,CAAAA,CAAA,EAAA,CAQIC,CAAAA,CAAAD,CAAAA,CAAAE,YAAAA,CAAAA,CACAD,CAAAA,CAAAD,CAAAA,CAAAG,YAAAA,CAAAA,CAAc,IAAA,eAAA,CAAA,CAAA,CAAA,SAAA,IAAA,UAAA,CAAA,CAAA,CAAA,IAAA,IAAA,WAAA,CAAA,CAAA,CAAA","file":"jsx-runtime.cjs","sourcesContent":["// src/index.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n export * from '@minejsx/render';\r\n export * from '@minejsx/runtime';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n"]}
1
+ {"version":3,"sources":["../src/mod/runtime.ts"],"names":["jsx","type","props","createHTMLElement","jsxs","Fragment","fragment","normalizeChildren","child","element","key","value","appendChildren","handleRef","handleEvent","handleClassName","handleStyle","isSignal","handleReactiveProp","parent","children","textNode","effect","ref","eventName","handler","event","className","styles","applyStyles","cssKey","m","signal"],"mappings":"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","file":"jsx-runtime.cjs","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// src/mod/runtime.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { effect, isSignal, type Signal } from '@minejs/signals';\r\n import type { JSXElement, JSXProps, ComponentFunction } from '../types';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Creates a DOM element from JSX\r\n * This is called automatically by TypeScript when it sees JSX syntax\r\n */\r\n export function jsx(\r\n type: string | ComponentFunction,\r\n props: JSXProps | null\r\n ): JSXElement | null {\r\n // Handle component (function)\r\n if (typeof type === 'function') {\r\n return type(props || {});\r\n }\r\n\r\n // Handle HTML element (string)\r\n return createHTMLElement(type, props || {});\r\n }\r\n\r\n /**\r\n * Same as jsx() but for elements with multiple children\r\n * (Used by TypeScript JSX transform)\r\n */\r\n export const jsxs = jsx;\r\n\r\n /**\r\n * Fragment component (like React.Fragment)\r\n */\r\n export function Fragment(props: { children?: any }): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n const children = normalizeChildren(props.children);\r\n\r\n children.forEach(child => {\r\n if (child instanceof Node) {\r\n fragment.appendChild(child);\r\n }\r\n });\r\n\r\n return fragment;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ ════ ════════════════════════════════════════╗\r\n\r\n // ============================================================================\r\n // HTML ELEMENT CREATION\r\n // ============================================================================\r\n\r\n function createHTMLElement(type: string, props: JSXProps): Element {\r\n const element = document.createElement(type);\r\n\r\n // Set properties and attributes\r\n for (const [key, value] of Object.entries(props)) {\r\n if (key === 'children') {\r\n // Handle children separately\r\n appendChildren(element, value);\r\n } else if (key === 'ref') {\r\n // Handle ref\r\n handleRef(element as HTMLElement, value);\r\n } else if (key.startsWith('on')) {\r\n // Handle events (onClick, onInput, etc)\r\n handleEvent(element, key, value);\r\n } else if (key === 'className' || key === 'class') {\r\n // Handle className/class\r\n handleClassName(element, value);\r\n } else if (key === 'style') {\r\n // Handle inline styles\r\n handleStyle(element as HTMLElement, value);\r\n } else if (isSignal(value)) {\r\n // Handle reactive props\r\n handleReactiveProp(element, key, value);\r\n } else if (typeof value === 'boolean') {\r\n // Handle boolean attributes (disabled, checked, etc)\r\n if (value) {\r\n element.setAttribute(key, '');\r\n }\r\n } else if (value != null) {\r\n // Handle static props\r\n element.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n // ============================================================================\r\n // CHILDREN HANDLING\r\n // ============================================================================\r\n\r\n function appendChildren(parent: Element, children: any): void {\r\n const normalized = normalizeChildren(children);\r\n\r\n normalized.forEach(child => {\r\n if (child instanceof Node) {\r\n parent.appendChild(child);\r\n } else if (isSignal(child)) {\r\n // Reactive text node\r\n const textNode = document.createTextNode('');\r\n effect(() => {\r\n textNode.textContent = String(child());\r\n });\r\n parent.appendChild(textNode);\r\n } else if (child != null && child !== false) {\r\n // Static text node\r\n parent.appendChild(document.createTextNode(String(child)));\r\n }\r\n });\r\n }\r\n\r\n function normalizeChildren(children: any): any[] {\r\n if (children == null || children === false) {\r\n return [];\r\n }\r\n\r\n if (Array.isArray(children)) {\r\n return children.flatMap(normalizeChildren);\r\n }\r\n\r\n return [children];\r\n }\r\n\r\n // ============================================================================\r\n // REF HANDLING\r\n // ============================================================================\r\n\r\n function handleRef(element: HTMLElement, ref: any): void {\r\n if (isSignal(ref)) {\r\n ref.set(element);\r\n } else if (typeof ref === 'function') {\r\n ref(element);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // EVENT HANDLING\r\n // ============================================================================\r\n\r\n function handleEvent(element: Element, eventName: string, handler: any): void {\r\n if (typeof handler !== 'function') return;\r\n\r\n // Convert onClick → click, onInput → input, etc\r\n const event = eventName.slice(2).toLowerCase();\r\n\r\n element.addEventListener(event, handler);\r\n }\r\n\r\n // ============================================================================\r\n // CLASS NAME HANDLING\r\n // ============================================================================\r\n\r\n function handleClassName(element: Element, value: any): void {\r\n if (isSignal(value)) {\r\n // Reactive className\r\n effect(() => {\r\n const className = value();\r\n if (className != null) {\r\n element.className = String(className);\r\n }\r\n });\r\n } else if (value != null) {\r\n // Static className\r\n element.className = String(value);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // STYLE HANDLING\r\n // ============================================================================\r\n\r\n function handleStyle(element: HTMLElement, value: any): void {\r\n if (isSignal(value)) {\r\n // Reactive style object\r\n effect(() => {\r\n const styles = value();\r\n applyStyles(element, styles);\r\n });\r\n } else {\r\n // Static style\r\n applyStyles(element, value);\r\n }\r\n }\r\n\r\n function applyStyles(element: HTMLElement, styles: any): void {\r\n if (typeof styles === 'string') {\r\n element.style.cssText = styles;\r\n } else if (typeof styles === 'object' && styles != null) {\r\n Object.entries(styles).forEach(([key, value]) => {\r\n if (value != null) {\r\n // Convert camelCase to kebab-case\r\n const cssKey = key.replace(/[A-Z]/g, m => `-${m.toLowerCase()}`);\r\n element.style.setProperty(cssKey, String(value));\r\n }\r\n });\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // REACTIVE PROP HANDLING\r\n // ============================================================================\r\n\r\n function handleReactiveProp(element: Element, key: string, signal: Signal<any>): void {\r\n effect(() => {\r\n const value = signal();\r\n\r\n if (value != null) {\r\n if (key in element) {\r\n // Set as property (for input.value, etc)\r\n ; (element as any)[key] = value;\r\n } else {\r\n // Set as attribute\r\n element.setAttribute(key, String(value));\r\n }\r\n } else {\r\n element.removeAttribute(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Create a component from a function\r\n * Provides a cleaner API than raw JSX\r\n */\r\n export function component<P = any>(\r\n fn: (props: P) => JSXElement | null\r\n ): ComponentFunction<P> {\r\n return fn;\r\n }\r\n\r\n /**\r\n * Create a component with setup function\r\n * Similar to Vue's Composition API\r\n */\r\n export function defineComponent<P = any>(\r\n setup: (props: P) => () => JSXElement | null\r\n ): ComponentFunction<P> {\r\n return (props: P) => {\r\n const render = setup(props);\r\n return render();\r\n };\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY FUNCTIONS\r\n // ============================================================================\r\n\r\n /**\r\n * Create multiple elements at once\r\n */\r\n export function createElements(elements: any[]): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n\r\n elements.forEach(el => {\r\n if (el instanceof Node) {\r\n fragment.appendChild(el);\r\n }\r\n });\r\n\r\n return fragment;\r\n }\r\n\r\n /**\r\n * Show/hide element based on condition\r\n */\r\n export function Show(props: {\r\n when: boolean | Signal<boolean>\r\n children: any\r\n }): JSXElement | null {\r\n if (isSignal(props.when)) {\r\n const placeholder = document.createComment('show');\r\n const parent = document.createDocumentFragment();\r\n parent.appendChild(placeholder);\r\n\r\n let currentElement: Element | null = null;\r\n\r\n effect(() => {\r\n const when = props.when as Signal<boolean>;\r\n const condition = when();\r\n\r\n if (condition && !currentElement) {\r\n // Show: create and insert element\r\n const children = normalizeChildren(props.children);\r\n currentElement = children[0] as Element;\r\n\r\n if (currentElement instanceof Node) {\r\n placeholder.parentNode?.insertBefore(currentElement, placeholder);\r\n }\r\n } else if (!condition && currentElement) {\r\n // Hide: remove element\r\n currentElement.remove();\r\n currentElement = null;\r\n }\r\n });\r\n\r\n return parent as any;\r\n } else {\r\n // Static condition\r\n return (props.when as boolean) ? jsx(Fragment, { children: props.children }) : null;\r\n }\r\n }\r\n\r\n /**\r\n * Render different elements based on condition\r\n */\r\n export function Switch(props: {\r\n children: { when: boolean | Signal<boolean>; children: any }[]\r\n }): JSXElement | null {\r\n // Find first matching case\r\n for (const caseItem of props.children) {\r\n const condition = isSignal(caseItem.when) ? caseItem.when() : caseItem.when;\r\n\r\n if (condition) {\r\n return jsx(Fragment, { children: caseItem.children });\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Iterate over array and render elements\r\n */\r\n export function For<T>(props: {\r\n each: T[] | Signal<T[]>\r\n children: (item: T, index: number) => JSXElement\r\n }): JSXElement {\r\n const fragment = document.createDocumentFragment();\r\n\r\n if (isSignal(props.each)) {\r\n // Reactive list\r\n const container = document.createElement('div');\r\n container.style.display = 'contents'; // Don't affect layout\r\n\r\n effect(() => {\r\n const each = props.each as Signal<T[]>;\r\n const items = each();\r\n container.innerHTML = ''; // Clear\r\n\r\n items.forEach((item: any, index: any) => {\r\n const element = props.children(item, index);\r\n if (element instanceof Node) {\r\n container.appendChild(element);\r\n }\r\n });\r\n });\r\n\r\n fragment.appendChild(container);\r\n } else {\r\n // Static list\r\n const each = props.each as T[];\r\n each.forEach((item, index) => {\r\n const element = props.children(item, index);\r\n if (element instanceof Node) {\r\n fragment.appendChild(element);\r\n }\r\n });\r\n }\r\n\r\n return fragment as any;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n"]}
@@ -1 +1,2 @@
1
- export { Fragment, jsx, jsxs } from '@minejsx/render';
1
+ export { F as Fragment, j as jsx, b as jsxs } from './jsx-dev-runtime-BcuwRgdf.cjs';
2
+ import '@minejs/signals';
@@ -1 +1,2 @@
1
- export { Fragment, jsx, jsxs } from '@minejsx/render';
1
+ export { F as Fragment, j as jsx, b as jsxs } from './jsx-dev-runtime-BcuwRgdf.js';
2
+ import '@minejs/signals';
@@ -1,2 +1,2 @@
1
- import*as F from'@minejsx/render';import*as b from'@minejsx/runtime';var s=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var p=(e,o,t,f)=>{if(o&&typeof o=="object"||typeof o=="function")for(let m of a(o))!g.call(e,m)&&m!==t&&s(e,m,{get:()=>o[m],enumerable:!(f=j(o,m))||f.enumerable});return e},x=(e,o,t)=>(p(e,o,"default"),t);var r={};x(r,F);x(r,b);var export_Fragment=r.Fragment;var export_jsx=r.jsx;var export_jsxs=r.jsxs;export{export_Fragment as Fragment,export_jsx as jsx,export_jsxs as jsxs};//# sourceMappingURL=jsx-runtime.js.map
1
+ import {isSignal,effect}from'@minejs/signals';function s(e,n){return typeof e=="function"?e(n||{}):m(e,n||{})}var u=s;function f(e){let n=document.createDocumentFragment();return a(e.children).forEach(t=>{t instanceof Node&&n.appendChild(t);}),n}function m(e,n){let o=document.createElement(e);for(let[t,r]of Object.entries(n))t==="children"?p(o,r):t==="ref"?E(o,r):t.startsWith("on")?h(o,t,r):t==="className"||t==="class"?S(o,r):t==="style"?y(o,r):isSignal(r)?g(o,t,r):typeof r=="boolean"?r&&o.setAttribute(t,""):r!=null&&o.setAttribute(t,String(r));return o}function p(e,n){a(n).forEach(t=>{if(t instanceof Node)e.appendChild(t);else if(isSignal(t)){let r=document.createTextNode("");effect(()=>{r.textContent=String(t());}),e.appendChild(r);}else t!=null&&t!==false&&e.appendChild(document.createTextNode(String(t)));});}function a(e){return e==null||e===false?[]:Array.isArray(e)?e.flatMap(a):[e]}function E(e,n){isSignal(n)?n.set(e):typeof n=="function"&&n(e);}function h(e,n,o){if(typeof o!="function")return;let t=n.slice(2).toLowerCase();e.addEventListener(t,o);}function S(e,n){isSignal(n)?effect(()=>{let o=n();o!=null&&(e.className=String(o));}):n!=null&&(e.className=String(n));}function y(e,n){isSignal(n)?effect(()=>{let o=n();c(e,o);}):c(e,n);}function c(e,n){typeof n=="string"?e.style.cssText=n:typeof n=="object"&&n!=null&&Object.entries(n).forEach(([o,t])=>{if(t!=null){let r=o.replace(/[A-Z]/g,d=>`-${d.toLowerCase()}`);e.style.setProperty(r,String(t));}});}function g(e,n,o){effect(()=>{let t=o();t!=null?n in e?e[n]=t:e.setAttribute(n,String(t)):e.removeAttribute(n);});}export{f as Fragment,s as jsx,u as jsxs};//# sourceMappingURL=jsx-runtime.js.map
2
2
  //# sourceMappingURL=jsx-runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["src_exports","__reExport","render_star","runtime_star"],"mappings":"qEAAA,IAAA,CAAA,CAAA,MAAA,CAAA,cAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,wBAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,mBAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,SAAA,CAAA,cAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,GAAA,CAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,UAAA,CAAA,IAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,GAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAAA,CAAAA,CAAA,EAAA,CAQIC,CAAAA,CAAAD,CAAAA,CAAAE,CAAAA,CAAAA,CACAD,CAAAA,CAAAD,CAAAA,CAAAG,CAAAA,CAAAA,CAAc,IAAA,eAAA,CAAA,CAAA,CAAA,SAAA,IAAA,UAAA,CAAA,CAAA,CAAA,IAAA,IAAA,WAAA,CAAA,CAAA,CAAA","file":"jsx-runtime.js","sourcesContent":["// src/index.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n export * from '@minejsx/render';\r\n export * from '@minejsx/runtime';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n"]}
1
+ {"version":3,"sources":["../src/mod/runtime.ts"],"names":["jsx","type","props","createHTMLElement","jsxs","Fragment","fragment","normalizeChildren","child","element","key","value","appendChildren","handleRef","handleEvent","handleClassName","handleStyle","isSignal","handleReactiveProp","parent","children","textNode","effect","ref","eventName","handler","event","className","styles","applyStyles","cssKey","m","signal"],"mappings":"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","file":"jsx-runtime.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// src/mod/runtime.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { effect, isSignal, type Signal } from '@minejs/signals';\r\n import type { JSXElement, JSXProps, ComponentFunction } from '../types';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Creates a DOM element from JSX\r\n * This is called automatically by TypeScript when it sees JSX syntax\r\n */\r\n export function jsx(\r\n type: string | ComponentFunction,\r\n props: JSXProps | null\r\n ): JSXElement | null {\r\n // Handle component (function)\r\n if (typeof type === 'function') {\r\n return type(props || {});\r\n }\r\n\r\n // Handle HTML element (string)\r\n return createHTMLElement(type, props || {});\r\n }\r\n\r\n /**\r\n * Same as jsx() but for elements with multiple children\r\n * (Used by TypeScript JSX transform)\r\n */\r\n export const jsxs = jsx;\r\n\r\n /**\r\n * Fragment component (like React.Fragment)\r\n */\r\n export function Fragment(props: { children?: any }): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n const children = normalizeChildren(props.children);\r\n\r\n children.forEach(child => {\r\n if (child instanceof Node) {\r\n fragment.appendChild(child);\r\n }\r\n });\r\n\r\n return fragment;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ ════ ════════════════════════════════════════╗\r\n\r\n // ============================================================================\r\n // HTML ELEMENT CREATION\r\n // ============================================================================\r\n\r\n function createHTMLElement(type: string, props: JSXProps): Element {\r\n const element = document.createElement(type);\r\n\r\n // Set properties and attributes\r\n for (const [key, value] of Object.entries(props)) {\r\n if (key === 'children') {\r\n // Handle children separately\r\n appendChildren(element, value);\r\n } else if (key === 'ref') {\r\n // Handle ref\r\n handleRef(element as HTMLElement, value);\r\n } else if (key.startsWith('on')) {\r\n // Handle events (onClick, onInput, etc)\r\n handleEvent(element, key, value);\r\n } else if (key === 'className' || key === 'class') {\r\n // Handle className/class\r\n handleClassName(element, value);\r\n } else if (key === 'style') {\r\n // Handle inline styles\r\n handleStyle(element as HTMLElement, value);\r\n } else if (isSignal(value)) {\r\n // Handle reactive props\r\n handleReactiveProp(element, key, value);\r\n } else if (typeof value === 'boolean') {\r\n // Handle boolean attributes (disabled, checked, etc)\r\n if (value) {\r\n element.setAttribute(key, '');\r\n }\r\n } else if (value != null) {\r\n // Handle static props\r\n element.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n // ============================================================================\r\n // CHILDREN HANDLING\r\n // ============================================================================\r\n\r\n function appendChildren(parent: Element, children: any): void {\r\n const normalized = normalizeChildren(children);\r\n\r\n normalized.forEach(child => {\r\n if (child instanceof Node) {\r\n parent.appendChild(child);\r\n } else if (isSignal(child)) {\r\n // Reactive text node\r\n const textNode = document.createTextNode('');\r\n effect(() => {\r\n textNode.textContent = String(child());\r\n });\r\n parent.appendChild(textNode);\r\n } else if (child != null && child !== false) {\r\n // Static text node\r\n parent.appendChild(document.createTextNode(String(child)));\r\n }\r\n });\r\n }\r\n\r\n function normalizeChildren(children: any): any[] {\r\n if (children == null || children === false) {\r\n return [];\r\n }\r\n\r\n if (Array.isArray(children)) {\r\n return children.flatMap(normalizeChildren);\r\n }\r\n\r\n return [children];\r\n }\r\n\r\n // ============================================================================\r\n // REF HANDLING\r\n // ============================================================================\r\n\r\n function handleRef(element: HTMLElement, ref: any): void {\r\n if (isSignal(ref)) {\r\n ref.set(element);\r\n } else if (typeof ref === 'function') {\r\n ref(element);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // EVENT HANDLING\r\n // ============================================================================\r\n\r\n function handleEvent(element: Element, eventName: string, handler: any): void {\r\n if (typeof handler !== 'function') return;\r\n\r\n // Convert onClick → click, onInput → input, etc\r\n const event = eventName.slice(2).toLowerCase();\r\n\r\n element.addEventListener(event, handler);\r\n }\r\n\r\n // ============================================================================\r\n // CLASS NAME HANDLING\r\n // ============================================================================\r\n\r\n function handleClassName(element: Element, value: any): void {\r\n if (isSignal(value)) {\r\n // Reactive className\r\n effect(() => {\r\n const className = value();\r\n if (className != null) {\r\n element.className = String(className);\r\n }\r\n });\r\n } else if (value != null) {\r\n // Static className\r\n element.className = String(value);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // STYLE HANDLING\r\n // ============================================================================\r\n\r\n function handleStyle(element: HTMLElement, value: any): void {\r\n if (isSignal(value)) {\r\n // Reactive style object\r\n effect(() => {\r\n const styles = value();\r\n applyStyles(element, styles);\r\n });\r\n } else {\r\n // Static style\r\n applyStyles(element, value);\r\n }\r\n }\r\n\r\n function applyStyles(element: HTMLElement, styles: any): void {\r\n if (typeof styles === 'string') {\r\n element.style.cssText = styles;\r\n } else if (typeof styles === 'object' && styles != null) {\r\n Object.entries(styles).forEach(([key, value]) => {\r\n if (value != null) {\r\n // Convert camelCase to kebab-case\r\n const cssKey = key.replace(/[A-Z]/g, m => `-${m.toLowerCase()}`);\r\n element.style.setProperty(cssKey, String(value));\r\n }\r\n });\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // REACTIVE PROP HANDLING\r\n // ============================================================================\r\n\r\n function handleReactiveProp(element: Element, key: string, signal: Signal<any>): void {\r\n effect(() => {\r\n const value = signal();\r\n\r\n if (value != null) {\r\n if (key in element) {\r\n // Set as property (for input.value, etc)\r\n ; (element as any)[key] = value;\r\n } else {\r\n // Set as attribute\r\n element.setAttribute(key, String(value));\r\n }\r\n } else {\r\n element.removeAttribute(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Create a component from a function\r\n * Provides a cleaner API than raw JSX\r\n */\r\n export function component<P = any>(\r\n fn: (props: P) => JSXElement | null\r\n ): ComponentFunction<P> {\r\n return fn;\r\n }\r\n\r\n /**\r\n * Create a component with setup function\r\n * Similar to Vue's Composition API\r\n */\r\n export function defineComponent<P = any>(\r\n setup: (props: P) => () => JSXElement | null\r\n ): ComponentFunction<P> {\r\n return (props: P) => {\r\n const render = setup(props);\r\n return render();\r\n };\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY FUNCTIONS\r\n // ============================================================================\r\n\r\n /**\r\n * Create multiple elements at once\r\n */\r\n export function createElements(elements: any[]): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n\r\n elements.forEach(el => {\r\n if (el instanceof Node) {\r\n fragment.appendChild(el);\r\n }\r\n });\r\n\r\n return fragment;\r\n }\r\n\r\n /**\r\n * Show/hide element based on condition\r\n */\r\n export function Show(props: {\r\n when: boolean | Signal<boolean>\r\n children: any\r\n }): JSXElement | null {\r\n if (isSignal(props.when)) {\r\n const placeholder = document.createComment('show');\r\n const parent = document.createDocumentFragment();\r\n parent.appendChild(placeholder);\r\n\r\n let currentElement: Element | null = null;\r\n\r\n effect(() => {\r\n const when = props.when as Signal<boolean>;\r\n const condition = when();\r\n\r\n if (condition && !currentElement) {\r\n // Show: create and insert element\r\n const children = normalizeChildren(props.children);\r\n currentElement = children[0] as Element;\r\n\r\n if (currentElement instanceof Node) {\r\n placeholder.parentNode?.insertBefore(currentElement, placeholder);\r\n }\r\n } else if (!condition && currentElement) {\r\n // Hide: remove element\r\n currentElement.remove();\r\n currentElement = null;\r\n }\r\n });\r\n\r\n return parent as any;\r\n } else {\r\n // Static condition\r\n return (props.when as boolean) ? jsx(Fragment, { children: props.children }) : null;\r\n }\r\n }\r\n\r\n /**\r\n * Render different elements based on condition\r\n */\r\n export function Switch(props: {\r\n children: { when: boolean | Signal<boolean>; children: any }[]\r\n }): JSXElement | null {\r\n // Find first matching case\r\n for (const caseItem of props.children) {\r\n const condition = isSignal(caseItem.when) ? caseItem.when() : caseItem.when;\r\n\r\n if (condition) {\r\n return jsx(Fragment, { children: caseItem.children });\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Iterate over array and render elements\r\n */\r\n export function For<T>(props: {\r\n each: T[] | Signal<T[]>\r\n children: (item: T, index: number) => JSXElement\r\n }): JSXElement {\r\n const fragment = document.createDocumentFragment();\r\n\r\n if (isSignal(props.each)) {\r\n // Reactive list\r\n const container = document.createElement('div');\r\n container.style.display = 'contents'; // Don't affect layout\r\n\r\n effect(() => {\r\n const each = props.each as Signal<T[]>;\r\n const items = each();\r\n container.innerHTML = ''; // Clear\r\n\r\n items.forEach((item: any, index: any) => {\r\n const element = props.children(item, index);\r\n if (element instanceof Node) {\r\n container.appendChild(element);\r\n }\r\n });\r\n });\r\n\r\n fragment.appendChild(container);\r\n } else {\r\n // Static list\r\n const each = props.each as T[];\r\n each.forEach((item, index) => {\r\n const element = props.children(item, index);\r\n if (element instanceof Node) {\r\n fragment.appendChild(element);\r\n }\r\n });\r\n }\r\n\r\n return fragment as any;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minejs/jsx",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
4
  "description": "Lightweight JSX runtime with fine-grained reactivity.",
5
5
  "keywords": [
6
6
  "minejs",