lilact 0.16.1 → 0.16.3

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 (71) hide show
  1. package/bin/copy-demo.js +1 -1
  2. package/dist/lilact.development.js +132 -122
  3. package/dist/lilact.development.js.map +3 -3
  4. package/dist/lilact.development.min.js +23 -23
  5. package/dist/lilact.development.min.js.map +3 -3
  6. package/dist/lilact.production.min.js +23 -23
  7. package/docs/classes/accessories.ErrorBoundary.html +8 -8
  8. package/docs/classes/accessories.Suspense.html +7 -7
  9. package/docs/classes/components.Component.html +11 -11
  10. package/docs/classes/components.HTMLComponent.html +11 -11
  11. package/docs/classes/components.RootComponent.html +11 -11
  12. package/docs/functions/accessories.DragHandle.html +2 -2
  13. package/docs/functions/components.createComponent.html +1 -1
  14. package/docs/functions/components.createRoot.html +1 -1
  15. package/docs/functions/components.render.html +1 -1
  16. package/docs/functions/timers.timeoutPromise.html +1 -1
  17. package/docs/static/demos/pane.jsx +2 -1
  18. package/docs/static/lilact.development.js +132 -122
  19. package/docs/static/lilact.development.js.map +3 -3
  20. package/docs/static/lilact.development.min.js +23 -23
  21. package/docs/static/lilact.development.min.js.map +3 -3
  22. package/docs/static/lilact.production.min.js +23 -23
  23. package/docs/variables/accessories.SplitPane.html +2 -2
  24. package/{root → examples}/demos/pane.jsx +2 -1
  25. package/{root → examples}/lilact.development.js +132 -122
  26. package/examples/lilact.development.js.map +7 -0
  27. package/examples/lilact.development.min.js +107 -0
  28. package/examples/lilact.development.min.js.map +7 -0
  29. package/examples/lilact.production.min.js +106 -0
  30. package/package.json +3 -3
  31. package/scripts/build.mjs +29 -0
  32. package/scripts/copy-dist-to-examples.mjs +42 -0
  33. package/scripts/esbuild-preprocessor-plugin.cjs +29 -4
  34. package/scripts/preprocess.mjs +29 -1
  35. package/src/accessories.jsx +236 -246
  36. package/src/components.jsx +19 -7
  37. package/typedoc.json +1 -1
  38. package/root/lilact.development.js.map +0 -7
  39. package/root/lilact.development.min.js +0 -107
  40. package/root/lilact.development.min.js.map +0 -7
  41. package/root/lilact.production.min.js +0 -106
  42. package/scripts/copy-dist-to-root.mjs +0 -13
  43. /package/{root → examples}/demos/actionstate.jsx +0 -0
  44. /package/{root → examples}/demos/capture.jsx +0 -0
  45. /package/{root → examples}/demos/context.jsx +0 -0
  46. /package/{root → examples}/demos/css-transition.jsx +0 -0
  47. /package/{root → examples}/demos/error-boundary.jsx +0 -0
  48. /package/{root → examples}/demos/error-callback.jsx +0 -0
  49. /package/{root → examples}/demos/error-component-stack.jsx +0 -0
  50. /package/{root → examples}/demos/error-init.jsx +0 -0
  51. /package/{root → examples}/demos/error-parser.jsx +0 -0
  52. /package/{root → examples}/demos/form-elements.jsx +0 -0
  53. /package/{root → examples}/demos/forwardref.jsx +0 -0
  54. /package/{root → examples}/demos/lazy.jsx +0 -0
  55. /package/{root → examples}/demos/modal.jsx +0 -0
  56. /package/{root → examples}/demos/proptypes.jsx +0 -0
  57. /package/{root → examples}/demos/reducer.jsx +0 -0
  58. /package/{root → examples}/demos/redux.jsx +0 -0
  59. /package/{root → examples}/demos/router.jsx +0 -0
  60. /package/{root → examples}/demos/stopwatch.jsx +0 -0
  61. /package/{root → examples}/demos/suspense.jsx +0 -0
  62. /package/{root → examples}/demos/switch-transition.jsx +0 -0
  63. /package/{root → examples}/demos/transition.jsx +0 -0
  64. /package/{root → examples}/demos/usedefered.jsx +0 -0
  65. /package/{root → examples}/demos/usetransition.jsx +0 -0
  66. /package/{root → examples}/icon.png +0 -0
  67. /package/{root → examples}/index.html +0 -0
  68. /package/{root → examples}/prismjs/LICENSE.md +0 -0
  69. /package/{root → examples}/prismjs/prism-jsx.min.js +0 -0
  70. /package/{root → examples}/prismjs/prism.min.css +0 -0
  71. /package/{root → examples}/prismjs/prism.min.js +0 -0
@@ -51,44 +51,44 @@ const {css,cx} = emotion;
51
51
  */
52
52
 
53
53
  export function Spinner({
54
- size = 48,
55
- className,
56
- style,
57
- color = "currentColor",
58
- strokeWidth = 3,
59
- "aria-label": ariaLabel = "Loading",
54
+ size = 48,
55
+ className,
56
+ style,
57
+ color = "currentColor",
58
+ strokeWidth = 3,
59
+ "aria-label": ariaLabel = "Loading",
60
60
  }) {
61
- const s = Math.max(1, size)+"px";
62
-
63
- return (
64
- <div
65
- className={className}
66
- style={{
67
- width: "100%",
68
- height: "100%",
69
- display: "grid",
70
- placeItems: "center",
71
- ...style,
72
- }}
73
- aria-label={ariaLabel}
74
- role="status"
75
- >
76
- <div
77
- style={{
78
- width: s,
79
- height: s,
80
- borderRadius: "50%",
81
- border: `${strokeWidth}px solid rgba(0,0,0,0.15)`,
82
- borderTopColor: color,
83
- animation: "ddSpinnerSpin 0.9s linear infinite",
84
- boxSizing: "border-box",
85
- }}
86
- />
87
- <style>{`
88
- @keyframes ddSpinnerSpin { to { transform: rotate(360deg); } }
89
- `}</style>
90
- </div>
91
- );
61
+ const s = Math.max(1, size)+"px";
62
+
63
+ return (
64
+ <div
65
+ className={className}
66
+ style={{
67
+ width: "100%",
68
+ height: "100%",
69
+ display: "grid",
70
+ placeItems: "center",
71
+ ...style,
72
+ }}
73
+ aria-label={ariaLabel}
74
+ role="status"
75
+ >
76
+ <div
77
+ style={{
78
+ width: s,
79
+ height: s,
80
+ borderRadius: "50%",
81
+ border: `${strokeWidth}px solid rgba(0,0,0,0.15)`,
82
+ borderTopColor: color,
83
+ animation: "ddSpinnerSpin 0.9s linear infinite",
84
+ boxSizing: "border-box",
85
+ }}
86
+ />
87
+ <style>{`
88
+ @keyframes ddSpinnerSpin { to { transform: rotate(360deg); } }
89
+ `}</style>
90
+ </div>
91
+ );
92
92
  }
93
93
 
94
94
 
@@ -284,7 +284,7 @@ export class Suspense extends Component
284
284
  * @param {string} [props.className] Optional CSS class applied to the wrapper element.
285
285
  * A `.dragging` class will be also applied when dragging.
286
286
  *
287
- * @param {React.ReactNode} [props.children] Content rendered inside the handle.
287
+ * @param {Component} [props.children] Content rendered inside the handle.
288
288
  */
289
289
 
290
290
  export function DragHandle({
@@ -387,12 +387,6 @@ export function DragHandle({
387
387
  }
388
388
 
389
389
 
390
-
391
- const clamp = (n, min, max) => {
392
- if (!Number.isFinite(n)) return n;
393
- return Math.min(max, Math.max(min, n));
394
- };
395
-
396
390
  /**
397
391
  * A split-pane container with a draggable splitter, supporting both horizontal and vertical layouts.
398
392
  *
@@ -430,7 +424,7 @@ const clamp = (n, min, max) => {
430
424
  * @param leftPaneStyle - Optional styles applied to the left pane (or top pane in vertical mode).
431
425
  * @param rightPaneStyle - Optional styles applied to the right pane (or bottom pane in vertical mode).
432
426
  * @param splitterStyle - Optional styles applied to the splitter element.
433
- * @param children - React children to be rendered into the two pane containers.
427
+ * @param children - Children to be rendered into the two pane containers.
434
428
  *
435
429
  * @example
436
430
  * ```tsx
@@ -448,209 +442,205 @@ const clamp = (n, min, max) => {
448
442
  * </SplitPane>
449
443
  * ```
450
444
  */
445
+
451
446
  export const SplitPane = forwardRef(function SplitPane(
452
- {
453
- mode = "horizontal",
454
- position, // controlled: number | undefined/null
455
- defaultPosition = 0.5,
456
- min = 0.1,
457
- max = 0.9,
458
- splitterSize = 8,
459
- onSizeChange,
460
- style,
461
- className,
462
- leftPaneStyle,
463
- rightPaneStyle,
464
- splitterStyle,
465
- children,
466
- },
467
- ref
447
+ {
448
+ mode = "horizontal",
449
+ position,
450
+ defaultPosition = 0.5,
451
+ min = 0.1,
452
+ max = 0.9,
453
+ splitterSize = 8,
454
+ onSizeChange,
455
+ style,
456
+ className,
457
+ firstPaneStyle,
458
+ secondPaneStyle,
459
+ splitterStyle,
460
+ children,
461
+ },
462
+ ref
468
463
  ) {
469
- const containerRef = useRef(null);
470
- const panes = Children.toArray(children);
471
- const leftChild = panes[0] ?? null;
472
- const rightChild = panes[1] ?? null;
473
-
474
- const isControlled = position != null;
475
-
476
- const [internalMode, setInternalMode] = useState(mode);
477
-
478
- const [posUncontrolled, setPosUncontrolled] = useState(() =>
479
- clamp(
480
- position ?? defaultPosition,
481
- min,
482
- max
483
- )
484
- );
485
-
486
- useEffect(() => {
487
- if (mode != null) setInternalMode(mode);
488
- }, [mode]);
489
-
490
- // keep internal position clamped if min/max change (uncontrolled only)
491
- useLayoutEffect(() => {
492
- if (isControlled) return;
493
- setPosUncontrolled((p) => clamp(p, min, max));
494
- }, [min, max, isControlled]);
495
-
496
- const posResolved = isControlled ? clamp(position, min, max) : posUncontrolled;
497
-
498
- const setPosition = (next) => {
499
- const clamped = clamp(next, min, max);
500
- if (!isControlled) setPosUncontrolled(clamped);
501
- onSizeChange?.(clamped);
502
- };
503
-
504
- const draggingRef = useRef(false);
505
- const pointerIdRef = useRef(null);
506
-
507
- const updateFromClient = (clientX, clientY) => {
508
- const el = containerRef.current;
509
- if (!el) return;
510
-
511
- const rect = el.getBoundingClientRect();
512
-
513
- if (internalMode === "horizontal") {
514
- const usable = rect.width;
515
- if (!Number.isFinite(usable) || usable <= 0) return; // no jump on init
516
- const raw = (clientX - rect.left) / usable;
517
- if (!Number.isFinite(raw)) return;
518
- setPosition(raw);
519
- } else {
520
- const usable = rect.height;
521
- if (!Number.isFinite(usable) || usable <= 0) return; // no jump on init
522
- const raw = (clientY - rect.top) / usable;
523
- if (!Number.isFinite(raw)) return;
524
- setPosition(raw);
525
- }
526
- };
527
-
528
- // stable global listeners: only act while draggingRef.current === true
529
- useEffect(() => {
530
- const onMove = (e) => {
531
- if (!draggingRef.current) return;
532
- if (pointerIdRef.current != null && e.pointerId !== pointerIdRef.current) return;
533
- updateFromClient(e.clientX, e.clientY);
534
- };
535
-
536
- const stop = (e) => {
537
- if (!draggingRef.current) return;
538
- if (pointerIdRef.current != null && e.pointerId !== pointerIdRef.current) return;
539
- draggingRef.current = false;
540
- pointerIdRef.current = null;
541
- };
542
-
543
- window.addEventListener("pointermove", onMove, { passive: true });
544
- window.addEventListener("pointerup", stop, { passive: true });
545
- window.addEventListener("pointercancel", stop, { passive: true });
546
-
547
- return () => {
548
- window.removeEventListener("pointermove", onMove);
549
- window.removeEventListener("pointerup", stop);
550
- window.removeEventListener("pointercancel", stop);
551
- };
552
- }, [internalMode]); // updateFromClient uses internalMode
553
-
554
- const onPointerDown = (e) => {
555
- if (e.button != null && e.button !== 0) return;
556
- e.preventDefault();
557
-
558
- draggingRef.current = true;
559
- pointerIdRef.current = e.pointerId;
560
-
561
- try {
562
- e.currentTarget.setPointerCapture?.(e.pointerId);
563
- } catch {}
564
-
565
- updateFromClient(e.clientX, e.clientY); // first update only if rect is sane
566
- };
567
-
568
- const onKeyDown = (e) => {
569
- const step = 0.02;
570
- let delta = 0;
571
-
572
- if (internalMode === "horizontal") {
573
- if (e.key === "ArrowLeft") delta = -step;
574
- if (e.key === "ArrowRight") delta = step;
575
- } else {
576
- if (e.key === "ArrowUp") delta = -step;
577
- if (e.key === "ArrowDown") delta = step;
578
- }
579
-
580
- if (delta !== 0) {
581
- e.preventDefault();
582
- setPosition(posResolved + delta);
583
- }
584
- };
585
-
586
- const sizes = useMemo(() => {
587
- const leftPct = `${posResolved * 100}%`;
588
- const rightCalc = `calc(${100 - posResolved * 100}% - ${splitterSize}px)`;
589
- return { leftPct, rightCalc };
590
- }, [posResolved, splitterSize]);
591
-
592
- const rootStyle = {
593
- display: "flex",
594
- width: "100%",
595
- height: "100%",
596
- overflow: "hidden",
597
- touchAction: "none",
598
- ...(style || {}),
599
- flexDirection: internalMode === "horizontal" ? "row" : "column",
600
- };
601
-
602
- const leftPaneComputed =
603
- internalMode === "horizontal"
604
- ? { width: sizes.leftPct, flex: `0 0 ${sizes.leftPct}`, overflow: "auto", ...(leftPaneStyle || {}) }
605
- : { height: sizes.leftPct, flex: `0 0 ${sizes.leftPct}`, overflow: "auto", ...(leftPaneStyle || {}) };
606
-
607
- const rightPaneComputed =
608
- internalMode === "horizontal"
609
- ? { width: sizes.rightCalc, flex: "1 1 auto", overflow: "auto", ...(rightPaneStyle || {}) }
610
- : { height: sizes.rightCalc, flex: "1 1 auto", overflow: "auto", ...(rightPaneStyle || {}) };
611
-
612
- const splitterComputed =
613
- internalMode === "horizontal"
614
- ? { width: `${splitterSize}px`, transform: "translateX(-50%)", height: '100%', flex: `0 0 ${splitterSize}px`, background: "rgba(0,0,0,0.08)", cursor: "col-resize", ...(splitterStyle || {}) }
615
- : { height: `${splitterSize}px`, transform: "translateY(-50%)", width: '100%', flex: `0 0 ${splitterSize}px`, background: "rgba(0,0,0,0.08)", cursor: "row-resize", ...(splitterStyle || {}) };
616
-
617
- const dividerVisualStyle =
618
- internalMode === "horizontal"
619
- ? { height: "100%", width: "100%" }
620
- : { width: "100%", height: "100%" };
621
-
622
- useImperativeHandle(ref, () => ({
623
- setPosition,
624
- setMode: (nextMode) => setInternalMode(nextMode === "vertical" ? "vertical" : "horizontal"),
625
- getPosition: () => posResolved,
626
- getMode: () => internalMode,
627
- }));
628
-
629
- return (
630
- <div ref={containerRef} className={className} style={rootStyle}>
631
- <div style={leftPaneComputed}>{leftChild}</div>
632
-
633
- <div
634
- role="separator"
635
- aria-orientation={internalMode === "horizontal" ? "vertical" : "horizontal"}
636
- aria-valuemin={min}
637
- aria-valuemax={max}
638
- aria-valuenow={posResolved}
639
- tabIndex={0}
640
- onPointerDown={onPointerDown}
641
- onPointerCancel={() => {
642
- draggingRef.current = false;
643
- pointerIdRef.current = null;
644
- }}
645
- onKeyDown={onKeyDown}
646
- style={splitterComputed}
647
- >
648
- <div style={dividerVisualStyle} />
649
- </div>
650
-
651
- <div style={rightPaneComputed}>{rightChild}</div>
652
- </div>
653
- );
464
+ const initialMode = mode === "vertical" ? "vertical" : "horizontal";
465
+ const [internalMode, setInternalMode] = useState(initialMode);
466
+
467
+ const [internalPos, setInternalPos] = useState(clamp(defaultPosition, min, max));
468
+ const posResolved = position == null ? internalPos : clamp(position, min, max);
469
+
470
+ useEffect(() => {
471
+ if (position == null) return;
472
+ setInternalPos(clamp(position, min, max));
473
+ }, [position, min, max]);
474
+
475
+ useEffect(() => {
476
+ setInternalMode(mode === "vertical" ? "vertical" : "horizontal");
477
+ }, [mode]);
478
+
479
+ const setPosition = (next) => {
480
+ const clamped = clamp(next, min, max);
481
+ if (position == null) setInternalPos(clamped);
482
+ onSizeChange?.(clamped);
483
+ };
484
+
485
+ useImperativeHandle(ref, () => ({
486
+ setPosition,
487
+ setMode: (nextMode) => setInternalMode(nextMode === "vertical" ? "vertical" : "horizontal"),
488
+ getPosition: () => posResolved,
489
+ getMode: () => internalMode,
490
+ }));
491
+
492
+ const containerRef = useRef(null);
493
+ const sizeRef = useRef({ w: 0, h: 0 });
494
+
495
+ useLayoutEffect(() => {
496
+ const el = containerRef.current;
497
+ if (!el) return;
498
+
499
+ const ro = new ResizeObserver(() => {
500
+ const rect = el.getBoundingClientRect();
501
+ sizeRef.current = { w: rect.width, h: rect.height };
502
+ });
503
+
504
+ ro.observe(el);
505
+ const rect = el.getBoundingClientRect();
506
+ sizeRef.current = { w: rect.width, h: rect.height };
507
+
508
+ return () => ro.disconnect();
509
+ }, []);
510
+
511
+ const startPosRef = useRef(posResolved);
512
+ const [dragging, setDragging] = useState(false);
513
+
514
+ const handleStart = () => {
515
+ setDragging(true);
516
+ startPosRef.current = posResolved;
517
+ };
518
+
519
+ const handleDelta = (x, y, _data) => {
520
+ const { w, h } = sizeRef.current;
521
+ if (internalMode === "horizontal") {
522
+ setPosition(startPosRef.current + x / (w || 1));
523
+ } else {
524
+ setPosition(startPosRef.current + y / (h || 1));
525
+ }
526
+ };
527
+
528
+ const handleEnd = () => setDragging(false);
529
+
530
+ const arr = Children.toArray(children);
531
+ const firstChild = arr[0];
532
+ const secondChild = arr[1];
533
+
534
+ const p = posResolved;
535
+
536
+ const pane1StyleAbs =
537
+ internalMode === "horizontal"
538
+ ? {
539
+ position: "absolute",
540
+ top: 0,
541
+ bottom: 0,
542
+ left: 0,
543
+ width: `calc(${p} * (100% - ${splitterSize}px))`,
544
+ overflow: "auto",
545
+ ...(firstPaneStyle || {}),
546
+ }
547
+ : {
548
+ position: "absolute",
549
+ left: 0,
550
+ right: 0,
551
+ top: 0,
552
+ height: `calc(${p} * (100% - ${splitterSize}px))`,
553
+ overflow: "auto",
554
+ ...(firstPaneStyle || {}),
555
+ };
556
+
557
+ const pane2StyleAbs =
558
+ internalMode === "horizontal"
559
+ ? {
560
+ position: "absolute",
561
+ top: 0,
562
+ bottom: 0,
563
+ left: `calc(${p} * (100% - ${splitterSize}px) + ${splitterSize}px)`,
564
+ right: 0,
565
+ overflow: "auto",
566
+ ...(secondPaneStyle || {}),
567
+ }
568
+ : {
569
+ position: "absolute",
570
+ left: 0,
571
+ right: 0,
572
+ top: `calc(${p} * (100% - ${splitterSize}px) + ${splitterSize}px)`,
573
+ bottom: 0,
574
+ overflow: "auto",
575
+ ...(secondPaneStyle || {}),
576
+ };
577
+
578
+ // Basic visible default for splitter (so it doesn't "disappear" on mode switch).
579
+ // Also give zIndex + background and keep pointer events enabled.
580
+ const splitterBase = {
581
+ background: "rgba(0,0,0,0.08)",
582
+ boxShadow: "inset 0 0 2px rgba(0,0,0,0.25)",
583
+ zIndex: 10,
584
+ };
585
+
586
+ const splitterAbsStyle =
587
+ internalMode === "horizontal"
588
+ ? {
589
+ position: "absolute",
590
+ top: 0,
591
+ bottom: 0,
592
+ left: `calc(${p} * (100% - ${splitterSize}px))`,
593
+ width: splitterSize,
594
+ height: "100%",
595
+
596
+ cursor: dragging ? "col-resize" : "col-resize",
597
+ touchAction: "none",
598
+ pointerEvents: "auto",
599
+
600
+ ...splitterBase,
601
+ ...(splitterStyle || {}),
602
+ }
603
+ : {
604
+ position: "absolute",
605
+ left: 0,
606
+ right: 0,
607
+ top: `calc(${p} * (100% - ${splitterSize}px))`,
608
+ height: splitterSize,
609
+ width: "100%",
610
+
611
+ cursor: dragging ? "row-resize" : "row-resize",
612
+ touchAction: "none",
613
+ pointerEvents: "auto",
614
+
615
+ ...splitterBase,
616
+ ...(splitterStyle || {}),
617
+ };
618
+
619
+ return (
620
+ <div
621
+ ref={containerRef}
622
+ className={className}
623
+ style={{
624
+ position: "relative",
625
+ width: "100%",
626
+ height: "100%",
627
+ overflow: "hidden",
628
+ ...(style || {}),
629
+ }}
630
+ >
631
+ <div style={pane1StyleAbs}>{firstChild}</div>
632
+ <div style={pane2StyleAbs}>{secondChild}</div>
633
+
634
+ <DragHandle
635
+ onStart={handleStart}
636
+ onDelta={handleDelta}
637
+ onEnd={handleEnd}
638
+ style={splitterAbsStyle}
639
+ className="splitter"
640
+ />
641
+ </div>
642
+ );
654
643
  });
655
644
 
656
645
 
646
+ const clamp = (v, min, max) => Math.max(min, Math.min(max, v));
@@ -428,19 +428,31 @@ if(DEBUG) {
428
428
  this.event_detachers[al] =
429
429
  Lilact.addWrappedEventListener(this.element, alc.substring(2), patch[a], {capture: true});
430
430
  }
431
- else if(al==='style') {
432
- if(typeof(patch[a])==='string') {
433
- this.element.style = patch[a];
431
+ else if(a==='style') {
432
+ if(typeof(patch.style)==='string') {
433
+ this.element.style = patch.style;
434
434
  }
435
435
  else {
436
- for(const x in patch[a]) {
436
+ if(this.props?.style) {
437
+ if(typeof(this.props.style)==='string') {
438
+ this.element.style = "";
439
+ }
440
+ else {
441
+ for(let p in this.props.style) {
442
+ if( !patch.style.hasOwnProperty(p) ) {
443
+ this.element.style[p] = "";
444
+ }
445
+ }
446
+ }
447
+ }
448
+ for(const x in patch.style) {
437
449
  if( length_css_attributes_set.has(x) ) {
438
- if(isFinite(patch[a][x])) {
439
- patch[a][x]+='px';
450
+ if(isFinite(patch.style[x])) {
451
+ patch.style[x]+='px';
440
452
  }
441
453
  }
442
454
  }
443
- Object.assign(this.element.style, patch[a]);
455
+ Object.assign(this.element.style, patch.style);
444
456
  }
445
457
  }
446
458
  else if(boolean_html_attributes_set.has(a)) { // not lower cased(al), as it is set as a js property
package/typedoc.json CHANGED
@@ -15,7 +15,7 @@
15
15
  ".tmp/src/hooks.jsx",
16
16
  ".tmp/src/misc.jsx",
17
17
  ".tmp/src/run.jsx",
18
- //".tmp/src/jsxx.jsx",
18
+ //".tmp/src/jsx.jsx",
19
19
  ".tmp/src/redux.jsx",
20
20
  ".tmp/src/timers.jsx",
21
21
  ".tmp/src/transition.jsx",