elementdrawing 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/LICENSE +21 -0
  2. package/dist/elementdrawing.min.js +3 -0
  3. package/dist/elementdrawing.min.js.LICENSE.txt +8 -0
  4. package/dist/elementdrawing.min.js.map +1 -0
  5. package/dist/index.html +1 -0
  6. package/package.json +127 -0
  7. package/src/core/bridge.h +855 -0
  8. package/src/core/diff.c +900 -0
  9. package/src/core/element.c +1078 -0
  10. package/src/core/event.c +813 -0
  11. package/src/core/fiber.c +1027 -0
  12. package/src/core/hooks.c +919 -0
  13. package/src/core/renderer.c +963 -0
  14. package/src/core/scheduler.c +702 -0
  15. package/src/core/state.c +803 -0
  16. package/src/css/animations.css +779 -0
  17. package/src/css/base.css +615 -0
  18. package/src/css/components.css +1311 -0
  19. package/src/css/tailwind.css +370 -0
  20. package/src/css/themes.css +517 -0
  21. package/src/css/utilities.css +475 -0
  22. package/src/index.js +746 -0
  23. package/src/js/animation.js +655 -0
  24. package/src/js/dom.js +665 -0
  25. package/src/js/events.js +585 -0
  26. package/src/js/http.js +446 -0
  27. package/src/js/index.js +26 -0
  28. package/src/js/router.js +483 -0
  29. package/src/js/store.js +539 -0
  30. package/src/js/utils.js +593 -0
  31. package/src/js/validator.js +529 -0
  32. package/src/jsx/components/Accordion.jsx +210 -0
  33. package/src/jsx/components/Alert.jsx +169 -0
  34. package/src/jsx/components/Avatar.jsx +214 -0
  35. package/src/jsx/components/Badge.jsx +136 -0
  36. package/src/jsx/components/Breadcrumb.jsx +200 -0
  37. package/src/jsx/components/Button.jsx +188 -0
  38. package/src/jsx/components/Card.jsx +192 -0
  39. package/src/jsx/components/Carousel.jsx +278 -0
  40. package/src/jsx/components/Checkbox.jsx +215 -0
  41. package/src/jsx/components/Dialog.jsx +242 -0
  42. package/src/jsx/components/Drawer.jsx +190 -0
  43. package/src/jsx/components/Dropdown.jsx +268 -0
  44. package/src/jsx/components/Form.jsx +274 -0
  45. package/src/jsx/components/Input.jsx +285 -0
  46. package/src/jsx/components/Menu.jsx +276 -0
  47. package/src/jsx/components/Modal.jsx +274 -0
  48. package/src/jsx/components/Navbar.jsx +292 -0
  49. package/src/jsx/components/Pagination.jsx +268 -0
  50. package/src/jsx/components/Progress.jsx +252 -0
  51. package/src/jsx/components/Radio.jsx +208 -0
  52. package/src/jsx/components/Select.jsx +397 -0
  53. package/src/jsx/components/Sidebar.jsx +250 -0
  54. package/src/jsx/components/Slider.jsx +310 -0
  55. package/src/jsx/components/Spinner.jsx +198 -0
  56. package/src/jsx/components/Switch.jsx +201 -0
  57. package/src/jsx/components/Table.jsx +332 -0
  58. package/src/jsx/components/Tabs.jsx +227 -0
  59. package/src/jsx/components/Textarea.jsx +212 -0
  60. package/src/jsx/components/Toast.jsx +270 -0
  61. package/src/jsx/components/Tooltip.jsx +178 -0
  62. package/src/jsx/components/Typography.jsx +299 -0
  63. package/src/jsx/components/index.jsx +70 -0
  64. package/src/jsx/core/element.js +3 -0
  65. package/src/jsx/hooks/index.js +356 -0
  66. package/src/jsx/hooks/useCallback.js +472 -0
  67. package/src/jsx/hooks/useContext.js +586 -0
  68. package/src/jsx/hooks/useEffect.js +704 -0
  69. package/src/jsx/hooks/useLayoutEffect.js +508 -0
  70. package/src/jsx/hooks/useMemo.js +689 -0
  71. package/src/jsx/hooks/useReducer.js +729 -0
  72. package/src/jsx/hooks/useRef.js +542 -0
  73. package/src/jsx/hooks/useState.js +854 -0
  74. package/src/jsx/runtime/commit.js +903 -0
  75. package/src/jsx/runtime/createElement.js +860 -0
  76. package/src/jsx/runtime/index.js +356 -0
  77. package/src/jsx/runtime/reconcile.js +687 -0
  78. package/src/jsx/runtime/render.js +914 -0
@@ -0,0 +1,356 @@
1
+ /**
2
+ * JSX Runtime Index
3
+ * ElementDrawing Framework - Re-exports all runtime functions, provides
4
+ * comprehensive runtime initialization, configuration, development tools
5
+ * bridge, and global event system.
6
+ */
7
+
8
+ 'use strict';
9
+
10
+ const createElementModule = require('./createElement');
11
+ const renderModule = require('./render');
12
+ const reconcileModule = require('./reconcile');
13
+ const commitModule = require('./commit');
14
+
15
+ // ─── Runtime Configuration ────────────────────────────────────────────────────
16
+
17
+ const runtimeConfig = {
18
+ strictMode: false,
19
+ profiling: false,
20
+ concurrentMode: false,
21
+ eventDelegation: true,
22
+ hydration: false,
23
+ devTools: false,
24
+ errorBoundaries: true,
25
+ suspense: true,
26
+ };
27
+
28
+ /**
29
+ * Configure the runtime.
30
+ * @param {Object} config - Configuration options
31
+ * @param {boolean} [config.strictMode] - Enable strict mode
32
+ * @param {boolean} [config.profiling] - Enable profiling
33
+ * @param {boolean} [config.concurrentMode] - Enable concurrent features
34
+ * @param {boolean} [config.eventDelegation] - Enable event delegation
35
+ * @param {boolean} [config.devTools] - Enable dev tools bridge
36
+ */
37
+ function configureRuntime(config) {
38
+ Object.assign(runtimeConfig, config);
39
+ }
40
+
41
+ /**
42
+ * Get the current runtime configuration.
43
+ * @returns {Object}
44
+ */
45
+ function getRuntimeConfig() {
46
+ return Object.assign({}, runtimeConfig);
47
+ }
48
+
49
+ // ─── Runtime Initialization ───────────────────────────────────────────────────
50
+
51
+ let isInitialized = false;
52
+ const initCallbacks = [];
53
+
54
+ /**
55
+ * Initialize the runtime. Called once before the first render.
56
+ * @param {Object} [config] - Optional initial configuration
57
+ */
58
+ function initRuntime(config) {
59
+ if (isInitialized) return;
60
+
61
+ if (config) {
62
+ configureRuntime(config);
63
+ }
64
+
65
+ // Set up global error handler for error boundaries
66
+ if (runtimeConfig.errorBoundaries && typeof window !== 'undefined') {
67
+ window.addEventListener('error', function globalErrorHandler(event) {
68
+ // Allow error boundaries to handle uncaught errors
69
+ if (event.error && event.error.__edHandled) {
70
+ event.preventDefault();
71
+ }
72
+ });
73
+ }
74
+
75
+ // Initialize dev tools bridge
76
+ if (runtimeConfig.devTools && typeof window !== 'undefined') {
77
+ window.__ED_DEVTOOLS__ = {
78
+ version: '1.0.0',
79
+ getCommitStats: commitModule.getCommitStats,
80
+ getRuntimeConfig: getRuntimeConfig,
81
+ };
82
+ }
83
+
84
+ isInitialized = true;
85
+
86
+ // Run initialization callbacks
87
+ initCallbacks.forEach((cb) => {
88
+ try {
89
+ cb();
90
+ } catch (error) {
91
+ console.error('[runtime] Init callback error:', error);
92
+ }
93
+ });
94
+ initCallbacks.length = 0;
95
+ }
96
+
97
+ /**
98
+ * Register a callback to run after runtime initialization.
99
+ * If already initialized, runs immediately.
100
+ * @param {Function} callback
101
+ */
102
+ function onRuntimeInit(callback) {
103
+ if (isInitialized) {
104
+ callback();
105
+ } else {
106
+ initCallbacks.push(callback);
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Check if the runtime is initialized.
112
+ * @returns {boolean}
113
+ */
114
+ function isRuntimeInitialized() {
115
+ return isInitialized;
116
+ }
117
+
118
+ // ─── Global Render Function ───────────────────────────────────────────────────
119
+
120
+ /**
121
+ * High-level render function that handles the complete render pipeline:
122
+ * create element -> reconcile -> commit.
123
+ *
124
+ * @param {Object} vnode - Virtual DOM element to render
125
+ * @param {HTMLElement} container - Target DOM container
126
+ * @param {Function} [callback] - Called after render completes
127
+ * @returns {HTMLElement} The rendered DOM node
128
+ */
129
+ function renderApp(vnode, container, callback) {
130
+ if (!isInitialized) {
131
+ initRuntime();
132
+ }
133
+
134
+ // Get the previous vnode stored on the container
135
+ const prevVNode = container.__ed_vnode || null;
136
+
137
+ // Reconcile old and new trees
138
+ const { operations, context } = reconcileModule.reconcile(prevVNode, vnode);
139
+
140
+ // Commit the changes to the DOM
141
+ commitModule.commitWork(operations, container, {
142
+ onComplete: () => {
143
+ // Store the new vnode for future reconciles
144
+ container.__ed_vnode = vnode;
145
+
146
+ if (typeof callback === 'function') callback();
147
+ },
148
+ });
149
+
150
+ // If no previous vnode, do initial render
151
+ if (!prevVNode) {
152
+ return renderModule.render(vnode, container, callback);
153
+ }
154
+
155
+ return container;
156
+ }
157
+
158
+ /**
159
+ * Unmount the app from a container.
160
+ * @param {HTMLElement} container
161
+ */
162
+ function unmountApp(container) {
163
+ renderModule.unmountContainer(container);
164
+ delete container.__ed_vnode;
165
+ }
166
+
167
+ // ─── Component Utilities ──────────────────────────────────────────────────────
168
+
169
+ /**
170
+ * Create a component that wraps children with error boundary behavior.
171
+ * @param {Function} fallback - Fallback renderer receiving (error, retry)
172
+ * @returns {Function} Error boundary component
173
+ */
174
+ function createErrorBoundary(fallback) {
175
+ return function ErrorBoundaryComponent(props) {
176
+ return createElementModule.createElement(
177
+ createElementModule.ErrorBoundary,
178
+ { fallback, onError: props.onError },
179
+ props.children
180
+ );
181
+ };
182
+ }
183
+
184
+ /**
185
+ * Create a Suspense wrapper.
186
+ * @param {*} fallback - Fallback UI
187
+ * @returns {Function} Suspense component
188
+ */
189
+ function createSuspenseWrapper(fallback) {
190
+ return function SuspenseWrapper(props) {
191
+ return createElementModule.createElement(
192
+ createElementModule.Suspense,
193
+ { fallback },
194
+ props.children
195
+ );
196
+ };
197
+ }
198
+
199
+ // ─── Development Tools Bridge ─────────────────────────────────────────────────
200
+
201
+ const devToolsHandlers = new Set();
202
+
203
+ /**
204
+ * Register a dev tools message handler.
205
+ * @param {Function} handler
206
+ * @returns {Function} Unregister function
207
+ */
208
+ function registerDevToolsHandler(handler) {
209
+ devToolsHandlers.add(handler);
210
+ return function unregister() {
211
+ devToolsHandlers.delete(handler);
212
+ };
213
+ }
214
+
215
+ /**
216
+ * Send a message to dev tools.
217
+ * @param {string} type - Message type
218
+ * @param {*} data - Message data
219
+ */
220
+ function sendDevToolsMessage(type, data) {
221
+ if (!runtimeConfig.devTools) return;
222
+
223
+ const message = { type, data, timestamp: Date.now() };
224
+
225
+ devToolsHandlers.forEach((handler) => {
226
+ try {
227
+ handler(message);
228
+ } catch (error) {
229
+ // Dev tools errors should not break the app
230
+ }
231
+ });
232
+
233
+ // Also send to window bridge if available
234
+ if (typeof window !== 'undefined' && window.__ED_DEVTOOLS_BRIDGE__) {
235
+ try {
236
+ window.__ED_DEVTOOLS_BRIDGE__(message);
237
+ } catch (error) {
238
+ // Ignore
239
+ }
240
+ }
241
+ }
242
+
243
+ // ─── Runtime Statistics ───────────────────────────────────────────────────────
244
+
245
+ /**
246
+ * Get comprehensive runtime statistics.
247
+ * @returns {Object}
248
+ */
249
+ function getRuntimeStats() {
250
+ return {
251
+ commit: commitModule.getCommitStats(),
252
+ config: getRuntimeConfig(),
253
+ initialized: isInitialized,
254
+ };
255
+ }
256
+
257
+ // ─── Exports ──────────────────────────────────────────────────────────────────
258
+
259
+ module.exports = {
260
+ // ── createElement exports ──
261
+ createElement: createElementModule.createElement,
262
+ cloneElement: createElementModule.cloneElement,
263
+ mergeProps: createElementModule.mergeProps,
264
+ createTextElement: createElementModule.createTextElement,
265
+ createPortal: createElementModule.createPortal,
266
+ createSuspense: createElementModule.createSuspense,
267
+ createStrictMode: createElementModule.createStrictMode,
268
+ createErrorBoundary: createElementModule.createErrorBoundary,
269
+ Fragment: createElementModule.Fragment,
270
+ Suspense: createElementModule.Suspense,
271
+ StrictMode: createElementModule.StrictMode,
272
+ ErrorBoundary: createElementModule.ErrorBoundary,
273
+ lazy: createElementModule.lazy,
274
+ isValidElement: createElementModule.isValidElement,
275
+ isValidElementType: createElementModule.isValidElementType,
276
+ isFunctionComponent: createElementModule.isFunctionComponent,
277
+ isClassComponent: createElementModule.isClassComponent,
278
+ isHostElement: createElementModule.isHostElement,
279
+ isSuspenseElement: createElementModule.isSuspenseElement,
280
+ isStrictModeElement: createElementModule.isStrictModeElement,
281
+ isErrorBoundaryElement: createElementModule.isErrorBoundaryElement,
282
+ countChildren: createElementModule.countChildren,
283
+ mapChildren: createElementModule.mapChildren,
284
+ forEachChild: createElementModule.forEachChild,
285
+ onlyChild: createElementModule.onlyChild,
286
+
287
+ // ── render exports ──
288
+ render: renderModule.render,
289
+ hydrate: renderModule.hydrate,
290
+ unmountContainer: renderModule.unmountContainer,
291
+ createDOMElement: renderModule.createDOMElement,
292
+ createTextNode: renderModule.createTextNode,
293
+ setAttribute: renderModule.setAttribute,
294
+ removeAttribute: renderModule.removeAttribute,
295
+ applyStyle: renderModule.applyStyle,
296
+ applyClassName: renderModule.applyClassName,
297
+ setEventHandler: renderModule.setEventHandler,
298
+ removeEventHandler: renderModule.removeEventHandler,
299
+ assignRef: renderModule.assignRef,
300
+ detachRef: renderModule.detachRef,
301
+ renderVNode: renderModule.renderVNode,
302
+ hydrateVNode: renderModule.hydrateVNode,
303
+
304
+ // ── reconcile exports ──
305
+ reconcile: reconcileModule.reconcile,
306
+ reconcileChildren: reconcileModule.reconcileChildren,
307
+ reconcileElement: reconcileModule.reconcileElement,
308
+ diffProps: reconcileModule.diffProps,
309
+ diffStyle: reconcileModule.diffStyle,
310
+ diffEventHandlers: reconcileModule.diffEventHandlers,
311
+ diffRef: reconcileModule.diffRef,
312
+ memo: reconcileModule.memo,
313
+ shallowEqual: reconcileModule.shallowEqual,
314
+ isSameType: reconcileModule.isSameType,
315
+ createFiber: reconcileModule.createFiber,
316
+ longestIncreasingSubsequence: reconcileModule.longestIncreasingSubsequence,
317
+
318
+ // ── commit exports ──
319
+ commitWork: commitModule.commitWork,
320
+ batchCommitWork: commitModule.batchCommitWork,
321
+ processInsertions: commitModule.processInsertions,
322
+ processDeletions: commitModule.processDeletions,
323
+ processUpdates: commitModule.processUpdates,
324
+ processMoves: commitModule.processMoves,
325
+ processReplacements: commitModule.processReplacements,
326
+ flushPendingLayoutEffects: commitModule.flushPendingLayoutEffects,
327
+ schedulePassiveEffects: commitModule.schedulePassiveEffects,
328
+ handleErrorDuringCommit: commitModule.handleErrorDuringCommit,
329
+ captureSnapshot: commitModule.captureSnapshot,
330
+ getSnapshot: commitModule.getSnapshot,
331
+ findDOMNodeForVNode: commitModule.findDOMNodeForVNode,
332
+ getCommitStats: commitModule.getCommitStats,
333
+
334
+ // ── Runtime management ──
335
+ renderApp,
336
+ unmountApp,
337
+ initRuntime,
338
+ onRuntimeInit,
339
+ isRuntimeInitialized,
340
+ configureRuntime,
341
+ getRuntimeConfig,
342
+ getRuntimeStats,
343
+ createErrorBoundary,
344
+ createSuspenseWrapper,
345
+ registerDevToolsHandler,
346
+ sendDevToolsMessage,
347
+
348
+ // ── Internal types ──
349
+ REACT_ELEMENT_TYPE: createElementModule.REACT_ELEMENT_TYPE,
350
+ REACT_FRAGMENT_TYPE: createElementModule.REACT_FRAGMENT_TYPE,
351
+ REACT_PORTAL_TYPE: createElementModule.REACT_PORTAL_TYPE,
352
+ REACT_SUSPENSE_TYPE: createElementModule.REACT_SUSPENSE_TYPE,
353
+ REACT_LAZY_TYPE: createElementModule.REACT_LAZY_TYPE,
354
+ REACT_STRICT_MODE_TYPE: createElementModule.REACT_STRICT_MODE_TYPE,
355
+ REACT_ERROR_BOUNDARY_TYPE: createElementModule.REACT_ERROR_BOUNDARY_TYPE,
356
+ };