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.
- package/LICENSE +21 -0
- package/dist/elementdrawing.min.js +3 -0
- package/dist/elementdrawing.min.js.LICENSE.txt +8 -0
- package/dist/elementdrawing.min.js.map +1 -0
- package/dist/index.html +1 -0
- package/package.json +127 -0
- package/src/core/bridge.h +855 -0
- package/src/core/diff.c +900 -0
- package/src/core/element.c +1078 -0
- package/src/core/event.c +813 -0
- package/src/core/fiber.c +1027 -0
- package/src/core/hooks.c +919 -0
- package/src/core/renderer.c +963 -0
- package/src/core/scheduler.c +702 -0
- package/src/core/state.c +803 -0
- package/src/css/animations.css +779 -0
- package/src/css/base.css +615 -0
- package/src/css/components.css +1311 -0
- package/src/css/tailwind.css +370 -0
- package/src/css/themes.css +517 -0
- package/src/css/utilities.css +475 -0
- package/src/index.js +746 -0
- package/src/js/animation.js +655 -0
- package/src/js/dom.js +665 -0
- package/src/js/events.js +585 -0
- package/src/js/http.js +446 -0
- package/src/js/index.js +26 -0
- package/src/js/router.js +483 -0
- package/src/js/store.js +539 -0
- package/src/js/utils.js +593 -0
- package/src/js/validator.js +529 -0
- package/src/jsx/components/Accordion.jsx +210 -0
- package/src/jsx/components/Alert.jsx +169 -0
- package/src/jsx/components/Avatar.jsx +214 -0
- package/src/jsx/components/Badge.jsx +136 -0
- package/src/jsx/components/Breadcrumb.jsx +200 -0
- package/src/jsx/components/Button.jsx +188 -0
- package/src/jsx/components/Card.jsx +192 -0
- package/src/jsx/components/Carousel.jsx +278 -0
- package/src/jsx/components/Checkbox.jsx +215 -0
- package/src/jsx/components/Dialog.jsx +242 -0
- package/src/jsx/components/Drawer.jsx +190 -0
- package/src/jsx/components/Dropdown.jsx +268 -0
- package/src/jsx/components/Form.jsx +274 -0
- package/src/jsx/components/Input.jsx +285 -0
- package/src/jsx/components/Menu.jsx +276 -0
- package/src/jsx/components/Modal.jsx +274 -0
- package/src/jsx/components/Navbar.jsx +292 -0
- package/src/jsx/components/Pagination.jsx +268 -0
- package/src/jsx/components/Progress.jsx +252 -0
- package/src/jsx/components/Radio.jsx +208 -0
- package/src/jsx/components/Select.jsx +397 -0
- package/src/jsx/components/Sidebar.jsx +250 -0
- package/src/jsx/components/Slider.jsx +310 -0
- package/src/jsx/components/Spinner.jsx +198 -0
- package/src/jsx/components/Switch.jsx +201 -0
- package/src/jsx/components/Table.jsx +332 -0
- package/src/jsx/components/Tabs.jsx +227 -0
- package/src/jsx/components/Textarea.jsx +212 -0
- package/src/jsx/components/Toast.jsx +270 -0
- package/src/jsx/components/Tooltip.jsx +178 -0
- package/src/jsx/components/Typography.jsx +299 -0
- package/src/jsx/components/index.jsx +70 -0
- package/src/jsx/core/element.js +3 -0
- package/src/jsx/hooks/index.js +356 -0
- package/src/jsx/hooks/useCallback.js +472 -0
- package/src/jsx/hooks/useContext.js +586 -0
- package/src/jsx/hooks/useEffect.js +704 -0
- package/src/jsx/hooks/useLayoutEffect.js +508 -0
- package/src/jsx/hooks/useMemo.js +689 -0
- package/src/jsx/hooks/useReducer.js +729 -0
- package/src/jsx/hooks/useRef.js +542 -0
- package/src/jsx/hooks/useState.js +854 -0
- package/src/jsx/runtime/commit.js +903 -0
- package/src/jsx/runtime/createElement.js +860 -0
- package/src/jsx/runtime/index.js +356 -0
- package/src/jsx/runtime/reconcile.js +687 -0
- package/src/jsx/runtime/render.js +914 -0
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSX Hooks Index
|
|
3
|
+
* ElementDrawing Framework - Re-exports all hooks from a single entry point,
|
|
4
|
+
* provides shared hook context management, component lifecycle coordination,
|
|
5
|
+
* development tools integration, and hook validation.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
const { useState, useTransition, useDeferredValue, batchedUpdates, configurePersistence, deepEqual, shallowEqual, runWithPriority, startTransition, PRIORITY } = require('./useState');
|
|
11
|
+
const { useEffect, useInsertionEffect, useDeepCompareEffect, useEffectOnce, useUpdateEffect, batchEffects, areDepsEqual, areDepsDeepEqual, cancelEffect, setStrictMode, isInStrictMode, getPendingEffectCounts } = require('./useEffect');
|
|
12
|
+
const { useContext, createContext, useContextSelector, useContextObserver, useMergedContext, composeContexts, getContextVersion } = require('./useContext');
|
|
13
|
+
const { useReducer, batchDispatches, createLoggerMiddleware, createValidationMiddleware, createTransformMiddleware, createThrottleMiddleware, createActionCreators, createAction } = require('./useReducer');
|
|
14
|
+
const { useCallback, useDebouncedCallback, useThrottledCallback, useOnceCallback, useDeepCompareCallback, useComposedCallback, setCallbackProfiling, getCallbackProfile } = require('./useCallback');
|
|
15
|
+
const { useMemo, useMemoWith, useMemoTTL, useDeepCompareMemo, useMemoLRU, invalidateMemo, invalidateAllMemos, setMemoProfiling, getMemoProfile } = require('./useMemo');
|
|
16
|
+
const { useRef, usePrevious, usePreviousWithInit, createRef, useCallbackRef, forwardRef, isForwardRef, useMergedRefs, useMeasureRef, useInViewRef, useFocusRef, useScrollRef, processPendingPrevUpdates } = require('./useRef');
|
|
17
|
+
const { useLayoutEffect, useIsomorphicLayoutEffect, usePriorityLayoutEffect, useMutationObserver, useResizeObserver, useAutoFocus, LAYOUT_PRIORITY } = require('./useLayoutEffect');
|
|
18
|
+
|
|
19
|
+
// ─── Shared Hook Context ──────────────────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Set the currently rendering component for all hooks.
|
|
23
|
+
* Called by the framework before each component render.
|
|
24
|
+
* @param {Object} component
|
|
25
|
+
*/
|
|
26
|
+
function setCurrentComponent(component) {
|
|
27
|
+
// Propagate to all hook modules
|
|
28
|
+
const useStateModule = require('./useState');
|
|
29
|
+
const useEffectModule = require('./useEffect');
|
|
30
|
+
const useContextModule = require('./useContext');
|
|
31
|
+
const useReducerModule = require('./useReducer');
|
|
32
|
+
const useCallbackModule = require('./useCallback');
|
|
33
|
+
const useMemoModule = require('./useMemo');
|
|
34
|
+
const useRefModule = require('./useRef');
|
|
35
|
+
const useLayoutEffectModule = require('./useLayoutEffect');
|
|
36
|
+
|
|
37
|
+
useStateModule.setCurrentComponent(component);
|
|
38
|
+
useEffectModule.setCurrentComponent(component);
|
|
39
|
+
useContextModule.setCurrentComponent(component);
|
|
40
|
+
useReducerModule.setCurrentComponent(component);
|
|
41
|
+
useCallbackModule.setCurrentComponent(component);
|
|
42
|
+
useMemoModule.setCurrentComponent(component);
|
|
43
|
+
useRefModule.setCurrentComponent(component);
|
|
44
|
+
useLayoutEffectModule.setCurrentComponent(component);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Reset all hook indices after rendering is complete.
|
|
49
|
+
*/
|
|
50
|
+
function resetHookIndex() {
|
|
51
|
+
const useStateModule = require('./useState');
|
|
52
|
+
const useEffectModule = require('./useEffect');
|
|
53
|
+
const useContextModule = require('./useContext');
|
|
54
|
+
const useReducerModule = require('./useReducer');
|
|
55
|
+
const useCallbackModule = require('./useCallback');
|
|
56
|
+
const useMemoModule = require('./useMemo');
|
|
57
|
+
const useRefModule = require('./useRef');
|
|
58
|
+
const useLayoutEffectModule = require('./useLayoutEffect');
|
|
59
|
+
|
|
60
|
+
useStateModule.resetHookIndex();
|
|
61
|
+
useEffectModule.resetHookIndex();
|
|
62
|
+
useContextModule.resetHookIndex();
|
|
63
|
+
useReducerModule.resetHookIndex();
|
|
64
|
+
useCallbackModule.resetHookIndex();
|
|
65
|
+
useMemoModule.resetHookIndex();
|
|
66
|
+
useRefModule.resetHookIndex();
|
|
67
|
+
useLayoutEffectModule.resetHookIndex();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Clean up all hook state for a component on unmount.
|
|
72
|
+
* @param {Object} component
|
|
73
|
+
*/
|
|
74
|
+
function cleanupComponent(component) {
|
|
75
|
+
const useStateModule = require('./useState');
|
|
76
|
+
const useEffectModule = require('./useEffect');
|
|
77
|
+
const useContextModule = require('./useContext');
|
|
78
|
+
const useReducerModule = require('./useReducer');
|
|
79
|
+
const useMemoModule = require('./useMemo');
|
|
80
|
+
const useRefModule = require('./useRef');
|
|
81
|
+
const useLayoutEffectModule = require('./useLayoutEffect');
|
|
82
|
+
|
|
83
|
+
useStateModule.cleanupComponentState(component);
|
|
84
|
+
useEffectModule.cleanupComponentEffects(component);
|
|
85
|
+
useContextModule.cleanupContextSubscriptions(component);
|
|
86
|
+
useReducerModule.cleanupReducerState(component);
|
|
87
|
+
useMemoModule.cleanupMemoCache(component);
|
|
88
|
+
useRefModule.cleanupRefs(component);
|
|
89
|
+
useLayoutEffectModule.cleanupLayoutEffects(component);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Flush all pending effects in the correct order.
|
|
94
|
+
*/
|
|
95
|
+
function flushAllEffects() {
|
|
96
|
+
const useEffectModule = require('./useEffect');
|
|
97
|
+
const useLayoutEffectModule = require('./useLayoutEffect');
|
|
98
|
+
|
|
99
|
+
// Flush in correct order: insertion -> layout -> passive
|
|
100
|
+
useLayoutEffectModule.flushLayoutEffects();
|
|
101
|
+
useEffectModule.flushAllEffects();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// ─── Hook Validation (Development Mode) ───────────────────────────────────────
|
|
105
|
+
|
|
106
|
+
let hookCallOrder = [];
|
|
107
|
+
let validationEnabled = false;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Enable hook order validation in development mode.
|
|
111
|
+
* Detects hooks called in different orders across renders.
|
|
112
|
+
* @param {boolean} enabled
|
|
113
|
+
*/
|
|
114
|
+
function setHookValidation(enabled) {
|
|
115
|
+
validationEnabled = enabled;
|
|
116
|
+
hookCallOrder = [];
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Record a hook call for validation.
|
|
121
|
+
* @param {string} hookName - Name of the hook
|
|
122
|
+
* @param {Object} component - The component instance
|
|
123
|
+
*/
|
|
124
|
+
function recordHookCall(hookName, component) {
|
|
125
|
+
if (!validationEnabled) return;
|
|
126
|
+
|
|
127
|
+
const key = component._componentId || component;
|
|
128
|
+
if (!hookCallOrder[key]) {
|
|
129
|
+
hookCallOrder[key] = [];
|
|
130
|
+
}
|
|
131
|
+
hookCallOrder[key].push(hookName);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Validate hook call order for a component.
|
|
136
|
+
* Detects if hooks are called in a different order than previous render.
|
|
137
|
+
* @param {Object} component
|
|
138
|
+
* @returns {boolean} True if hook order is valid
|
|
139
|
+
*/
|
|
140
|
+
function validateHookOrder(component) {
|
|
141
|
+
if (!validationEnabled) return true;
|
|
142
|
+
|
|
143
|
+
const key = component._componentId || component;
|
|
144
|
+
const currentOrder = hookCallOrder[key];
|
|
145
|
+
|
|
146
|
+
if (!currentOrder || currentOrder.length === 0) return true;
|
|
147
|
+
|
|
148
|
+
if (!component._prevHookOrder) {
|
|
149
|
+
component._prevHookOrder = currentOrder.slice();
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const prevOrder = component._prevHookOrder;
|
|
154
|
+
|
|
155
|
+
if (prevOrder.length !== currentOrder.length) {
|
|
156
|
+
console.error(
|
|
157
|
+
'[Hooks] Hook call order changed! ' +
|
|
158
|
+
`Previous: [${prevOrder.join(', ')}] ` +
|
|
159
|
+
`Current: [${currentOrder.join(', ')}]`
|
|
160
|
+
);
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
for (let i = 0; i < prevOrder.length; i++) {
|
|
165
|
+
if (prevOrder[i] !== currentOrder[i]) {
|
|
166
|
+
console.error(
|
|
167
|
+
'[Hooks] Hook call order changed at index ' + i + '! ' +
|
|
168
|
+
`Previous: ${prevOrder[i]} Current: ${currentOrder[i]}`
|
|
169
|
+
);
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
component._prevHookOrder = currentOrder.slice();
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// ─── Development Tools Integration ────────────────────────────────────────────
|
|
179
|
+
|
|
180
|
+
let devToolsCallback = null;
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Register a callback for development tools integration.
|
|
184
|
+
* Called with hook state changes for inspection.
|
|
185
|
+
* @param {Function} callback
|
|
186
|
+
*/
|
|
187
|
+
function registerDevTools(callback) {
|
|
188
|
+
devToolsCallback = callback;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Notify dev tools of a hook state change.
|
|
193
|
+
* @param {string} hookName
|
|
194
|
+
* @param {Object} component
|
|
195
|
+
* @param {*} newValue
|
|
196
|
+
* @param {*} oldValue
|
|
197
|
+
*/
|
|
198
|
+
function notifyDevTools(hookName, component, newValue, oldValue) {
|
|
199
|
+
if (devToolsCallback) {
|
|
200
|
+
try {
|
|
201
|
+
devToolsCallback({
|
|
202
|
+
type: 'hook-update',
|
|
203
|
+
hookName,
|
|
204
|
+
componentId: component._componentId,
|
|
205
|
+
componentName: component.displayName || component.name || 'Anonymous',
|
|
206
|
+
newValue,
|
|
207
|
+
oldValue,
|
|
208
|
+
timestamp: Date.now(),
|
|
209
|
+
});
|
|
210
|
+
} catch (error) {
|
|
211
|
+
// Dev tools errors should not break the app
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ─── Hook Profiling ───────────────────────────────────────────────────────────
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Get comprehensive profiling data for a component.
|
|
220
|
+
* @param {Object} component
|
|
221
|
+
* @returns {Object} Profiling data
|
|
222
|
+
*/
|
|
223
|
+
function getComponentProfile(component) {
|
|
224
|
+
return {
|
|
225
|
+
callbacks: getCallbackProfile(component),
|
|
226
|
+
memos: getMemoProfile(component),
|
|
227
|
+
effectCounts: getPendingEffectCounts(),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Enable all profiling.
|
|
233
|
+
* @param {boolean} enabled
|
|
234
|
+
*/
|
|
235
|
+
function setProfiling(enabled) {
|
|
236
|
+
setCallbackProfiling(enabled);
|
|
237
|
+
setMemoProfiling(enabled);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// ─── Post-Render Processing ───────────────────────────────────────────────────
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Process any post-render tasks like previous value updates.
|
|
244
|
+
* Called after the render phase completes but before commit.
|
|
245
|
+
* @param {Object} component
|
|
246
|
+
*/
|
|
247
|
+
function postRenderProcess(component) {
|
|
248
|
+
processPendingPrevUpdates(component);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// ─── Exports ──────────────────────────────────────────────────────────────────
|
|
252
|
+
|
|
253
|
+
module.exports = {
|
|
254
|
+
// ── Core hooks ──
|
|
255
|
+
useState,
|
|
256
|
+
useEffect,
|
|
257
|
+
useContext,
|
|
258
|
+
useReducer,
|
|
259
|
+
useCallback,
|
|
260
|
+
useMemo,
|
|
261
|
+
useRef,
|
|
262
|
+
useLayoutEffect,
|
|
263
|
+
|
|
264
|
+
// ── Extended hooks ──
|
|
265
|
+
useInsertionEffect,
|
|
266
|
+
useIsomorphicLayoutEffect,
|
|
267
|
+
usePriorityLayoutEffect,
|
|
268
|
+
useTransition,
|
|
269
|
+
useDeferredValue,
|
|
270
|
+
useDebouncedCallback,
|
|
271
|
+
useThrottledCallback,
|
|
272
|
+
useOnceCallback,
|
|
273
|
+
useDeepCompareCallback,
|
|
274
|
+
useComposedCallback,
|
|
275
|
+
useMemoWith,
|
|
276
|
+
useMemoTTL,
|
|
277
|
+
useDeepCompareMemo,
|
|
278
|
+
useMemoLRU,
|
|
279
|
+
useDeepCompareEffect,
|
|
280
|
+
useEffectOnce,
|
|
281
|
+
useUpdateEffect,
|
|
282
|
+
usePrevious,
|
|
283
|
+
usePreviousWithInit,
|
|
284
|
+
useMutationObserver,
|
|
285
|
+
useResizeObserver,
|
|
286
|
+
useAutoFocus,
|
|
287
|
+
useContextSelector,
|
|
288
|
+
useContextObserver,
|
|
289
|
+
|
|
290
|
+
// ── Context API ──
|
|
291
|
+
createContext,
|
|
292
|
+
useMergedContext,
|
|
293
|
+
composeContexts,
|
|
294
|
+
|
|
295
|
+
// ── Ref utilities ──
|
|
296
|
+
createRef,
|
|
297
|
+
useCallbackRef,
|
|
298
|
+
forwardRef,
|
|
299
|
+
isForwardRef,
|
|
300
|
+
useMergedRefs,
|
|
301
|
+
useMeasureRef,
|
|
302
|
+
useInViewRef,
|
|
303
|
+
useFocusRef,
|
|
304
|
+
useScrollRef,
|
|
305
|
+
|
|
306
|
+
// ── Batching ──
|
|
307
|
+
batchedUpdates,
|
|
308
|
+
batchDispatches,
|
|
309
|
+
runWithPriority,
|
|
310
|
+
startTransition,
|
|
311
|
+
|
|
312
|
+
// ── Persistence ──
|
|
313
|
+
configurePersistence,
|
|
314
|
+
|
|
315
|
+
// ── Middleware ──
|
|
316
|
+
createLoggerMiddleware,
|
|
317
|
+
createValidationMiddleware,
|
|
318
|
+
createTransformMiddleware,
|
|
319
|
+
createThrottleMiddleware,
|
|
320
|
+
createActionCreators,
|
|
321
|
+
createAction,
|
|
322
|
+
|
|
323
|
+
// ── Memo invalidation ──
|
|
324
|
+
invalidateMemo,
|
|
325
|
+
invalidateAllMemos,
|
|
326
|
+
|
|
327
|
+
// ── State comparison ──
|
|
328
|
+
deepEqual,
|
|
329
|
+
shallowEqual,
|
|
330
|
+
areDepsEqual,
|
|
331
|
+
areDepsDeepEqual,
|
|
332
|
+
|
|
333
|
+
// ── Framework integration ──
|
|
334
|
+
setCurrentComponent,
|
|
335
|
+
resetHookIndex,
|
|
336
|
+
cleanupComponent,
|
|
337
|
+
flushAllEffects,
|
|
338
|
+
postRenderProcess,
|
|
339
|
+
|
|
340
|
+
// ── Development tools ──
|
|
341
|
+
registerDevTools,
|
|
342
|
+
setHookValidation,
|
|
343
|
+
validateHookOrder,
|
|
344
|
+
recordHookCall,
|
|
345
|
+
setProfiling,
|
|
346
|
+
getComponentProfile,
|
|
347
|
+
setStrictMode,
|
|
348
|
+
isInStrictMode,
|
|
349
|
+
cancelEffect,
|
|
350
|
+
getContextVersion,
|
|
351
|
+
getPendingEffectCounts,
|
|
352
|
+
|
|
353
|
+
// ── Constants ──
|
|
354
|
+
PRIORITY,
|
|
355
|
+
LAYOUT_PRIORITY,
|
|
356
|
+
};
|