kitchen-simulator 3.12.0-test.1 → 3.12.0-test.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 (3) hide show
  1. package/es/index.js +97 -16
  2. package/lib/index.js +97 -16
  3. package/package.json +1 -1
package/es/index.js CHANGED
@@ -249,10 +249,10 @@ export function renderKitchenSimulator(container) {
249
249
 
250
250
  // ✅ Reuse existing API for same container
251
251
  if (container[API_KEY]) {
252
- var _container$API_KEY$__, _container$API_KEY;
253
- // update render with latest props (safe)
254
- (_container$API_KEY$__ = (_container$API_KEY = container[API_KEY]).__render) === null || _container$API_KEY$__ === void 0 || _container$API_KEY$__.call(_container$API_KEY, props);
255
- return container[API_KEY];
252
+ var _api$__render;
253
+ var _api = container[API_KEY];
254
+ (_api$__render = _api.__render) === null || _api$__render === void 0 || _api$__render.call(_api, props); // will merge via lastProps inside api (after patch)
255
+ return _api;
256
256
  }
257
257
 
258
258
  // ✅ Reuse root for same container
@@ -447,24 +447,80 @@ export function renderKitchenSimulator(container) {
447
447
  }
448
448
  }]);
449
449
  }(React.Component);
450
+ var ro = null;
451
+ var roEl = null;
452
+ var roRaf = 0;
453
+ function installContentBoxObserver() {
454
+ var _lastProps$width2, _lastProps$height2;
455
+ if (typeof window === 'undefined') return;
456
+ if (typeof ResizeObserver === 'undefined') return;
457
+ var el = document.getElementById('content-box');
458
+ if (!el) return; // tool won't crash if element isn't there yet
459
+
460
+ roEl = el;
461
+ var syncFromEl = function syncFromEl(entry) {
462
+ var _lastProps$width, _lastProps$height;
463
+ // Prefer contentBoxSize when available; fallback to getBoundingClientRect.
464
+ var w = 0,
465
+ h = 0;
466
+ var cbs = entry === null || entry === void 0 ? void 0 : entry.contentBoxSize;
467
+ if (cbs) {
468
+ var _box$inlineSize, _box$blockSize;
469
+ // contentBoxSize can be array (Chrome) or single object (Firefox)
470
+ var box = Array.isArray(cbs) ? cbs[0] : cbs;
471
+ w = (_box$inlineSize = box === null || box === void 0 ? void 0 : box.inlineSize) !== null && _box$inlineSize !== void 0 ? _box$inlineSize : 0;
472
+ h = (_box$blockSize = box === null || box === void 0 ? void 0 : box.blockSize) !== null && _box$blockSize !== void 0 ? _box$blockSize : 0;
473
+ }
474
+ if (!w || !h) {
475
+ var _rect = roEl.getBoundingClientRect();
476
+ w = _rect.width;
477
+ h = _rect.height;
478
+ }
479
+ w = normalizeSize(w, (_lastProps$width = lastProps.width) !== null && _lastProps$width !== void 0 ? _lastProps$width : 1);
480
+ h = normalizeSize(h, (_lastProps$height = lastProps.height) !== null && _lastProps$height !== void 0 ? _lastProps$height : 1);
481
+
482
+ // avoid thrash: coalesce multiple observer callbacks into 1 RAF
483
+ if (roRaf) cancelAnimationFrame(roRaf);
484
+ roRaf = requestAnimationFrame(function () {
485
+ roRaf = 0;
486
+ if (destroyed) return;
487
+ // only update if changed (prevents infinite loops)
488
+ if (lastProps.width === w && lastProps.height === h) return;
489
+ // update props via existing render path
490
+ api.__render({
491
+ width: w,
492
+ height: h
493
+ });
494
+ });
495
+ };
496
+ ro = new ResizeObserver(function (entries) {
497
+ var entry = entries && entries[0];
498
+ if (!entry) return;
499
+ syncFromEl(entry);
500
+ });
501
+ ro.observe(el, {
502
+ box: 'content-box'
503
+ });
504
+
505
+ // initial sync (in case observer doesn't fire immediately)
506
+ var rect = el.getBoundingClientRect();
507
+ api.__render({
508
+ width: normalizeSize(rect.width, (_lastProps$width2 = lastProps.width) !== null && _lastProps$width2 !== void 0 ? _lastProps$width2 : 1),
509
+ height: normalizeSize(rect.height, (_lastProps$height2 = lastProps.height) !== null && _lastProps$height2 !== void 0 ? _lastProps$height2 : 1)
510
+ });
511
+ }
450
512
  var lastProps = _objectSpread({}, props);
513
+ function normalizeSize(n) {
514
+ var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
515
+ var v = typeof n === 'string' ? parseFloat(n) : n;
516
+ return Number.isFinite(v) && v > 0 ? v : fallback;
517
+ }
451
518
  var api = {
452
519
  // internal: rerender wrapper with latest props if host calls renderKitchenSimulator again
453
520
  __render: function __render(nextProps) {
454
- lastProps = _objectSpread(_objectSpread({}, lastProps), nextProps);
521
+ lastProps = _objectSpread(_objectSpread({}, lastProps), nextProps || {});
455
522
  root.render(/*#__PURE__*/React.createElement(Wrapper, lastProps));
456
523
  },
457
- updateContainerDimensions: function updateContainerDimensions(width, height) {
458
- var extraProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
459
- if (destroyed) return false;
460
-
461
- // optional: accept numbers or strings, up to you
462
- api.__render(_objectSpread(_objectSpread(_objectSpread({}, lastProps), extraProps), {}, {
463
- width: width,
464
- height: height
465
- }));
466
- return true;
467
- },
468
524
  /**
469
525
  * Send one or many events (in order).
470
526
  * Resolves when this batch has been delivered + settled.
@@ -547,6 +603,17 @@ export function renderKitchenSimulator(container) {
547
603
  container[API_KEY] = null;
548
604
  }
549
605
  };
606
+ if (ro) {
607
+ try {
608
+ ro.disconnect();
609
+ } catch (_unused2) {}
610
+ ro = null;
611
+ }
612
+ roEl = null;
613
+ if (roRaf) {
614
+ cancelAnimationFrame(roRaf);
615
+ roRaf = 0;
616
+ }
550
617
 
551
618
  // Prefer microtask when available, otherwise macrotask
552
619
  if (typeof queueMicrotask === 'function') queueMicrotask(doUnmount);else setTimeout(doUnmount, 0);
@@ -556,6 +623,20 @@ export function renderKitchenSimulator(container) {
556
623
  // first render
557
624
  api.__render(props);
558
625
 
626
+ // Install observer after initial mount.
627
+ // If #content-box is created later, retry a few frames.
628
+ (function tryInstall() {
629
+ var attempt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
630
+ if (destroyed) return;
631
+ installContentBoxObserver();
632
+ if (!ro && attempt < 30) {
633
+ // element not found yet; retry next frame for up to ~30 frames
634
+ requestAnimationFrame(function () {
635
+ return tryInstall(attempt + 1);
636
+ });
637
+ }
638
+ })();
639
+
559
640
  // store api on container so repeated calls reuse it
560
641
  container[API_KEY] = api;
561
642
  return api;
package/lib/index.js CHANGED
@@ -257,10 +257,10 @@ function renderKitchenSimulator(container) {
257
257
 
258
258
  // ✅ Reuse existing API for same container
259
259
  if (container[API_KEY]) {
260
- var _container$API_KEY$__, _container$API_KEY;
261
- // update render with latest props (safe)
262
- (_container$API_KEY$__ = (_container$API_KEY = container[API_KEY]).__render) === null || _container$API_KEY$__ === void 0 || _container$API_KEY$__.call(_container$API_KEY, props);
263
- return container[API_KEY];
260
+ var _api$__render;
261
+ var _api = container[API_KEY];
262
+ (_api$__render = _api.__render) === null || _api$__render === void 0 || _api$__render.call(_api, props); // will merge via lastProps inside api (after patch)
263
+ return _api;
264
264
  }
265
265
 
266
266
  // ✅ Reuse root for same container
@@ -455,24 +455,80 @@ function renderKitchenSimulator(container) {
455
455
  }
456
456
  }]);
457
457
  }(_react["default"].Component);
458
+ var ro = null;
459
+ var roEl = null;
460
+ var roRaf = 0;
461
+ function installContentBoxObserver() {
462
+ var _lastProps$width2, _lastProps$height2;
463
+ if (typeof window === 'undefined') return;
464
+ if (typeof ResizeObserver === 'undefined') return;
465
+ var el = document.getElementById('content-box');
466
+ if (!el) return; // tool won't crash if element isn't there yet
467
+
468
+ roEl = el;
469
+ var syncFromEl = function syncFromEl(entry) {
470
+ var _lastProps$width, _lastProps$height;
471
+ // Prefer contentBoxSize when available; fallback to getBoundingClientRect.
472
+ var w = 0,
473
+ h = 0;
474
+ var cbs = entry === null || entry === void 0 ? void 0 : entry.contentBoxSize;
475
+ if (cbs) {
476
+ var _box$inlineSize, _box$blockSize;
477
+ // contentBoxSize can be array (Chrome) or single object (Firefox)
478
+ var box = Array.isArray(cbs) ? cbs[0] : cbs;
479
+ w = (_box$inlineSize = box === null || box === void 0 ? void 0 : box.inlineSize) !== null && _box$inlineSize !== void 0 ? _box$inlineSize : 0;
480
+ h = (_box$blockSize = box === null || box === void 0 ? void 0 : box.blockSize) !== null && _box$blockSize !== void 0 ? _box$blockSize : 0;
481
+ }
482
+ if (!w || !h) {
483
+ var _rect = roEl.getBoundingClientRect();
484
+ w = _rect.width;
485
+ h = _rect.height;
486
+ }
487
+ w = normalizeSize(w, (_lastProps$width = lastProps.width) !== null && _lastProps$width !== void 0 ? _lastProps$width : 1);
488
+ h = normalizeSize(h, (_lastProps$height = lastProps.height) !== null && _lastProps$height !== void 0 ? _lastProps$height : 1);
489
+
490
+ // avoid thrash: coalesce multiple observer callbacks into 1 RAF
491
+ if (roRaf) cancelAnimationFrame(roRaf);
492
+ roRaf = requestAnimationFrame(function () {
493
+ roRaf = 0;
494
+ if (destroyed) return;
495
+ // only update if changed (prevents infinite loops)
496
+ if (lastProps.width === w && lastProps.height === h) return;
497
+ // update props via existing render path
498
+ api.__render({
499
+ width: w,
500
+ height: h
501
+ });
502
+ });
503
+ };
504
+ ro = new ResizeObserver(function (entries) {
505
+ var entry = entries && entries[0];
506
+ if (!entry) return;
507
+ syncFromEl(entry);
508
+ });
509
+ ro.observe(el, {
510
+ box: 'content-box'
511
+ });
512
+
513
+ // initial sync (in case observer doesn't fire immediately)
514
+ var rect = el.getBoundingClientRect();
515
+ api.__render({
516
+ width: normalizeSize(rect.width, (_lastProps$width2 = lastProps.width) !== null && _lastProps$width2 !== void 0 ? _lastProps$width2 : 1),
517
+ height: normalizeSize(rect.height, (_lastProps$height2 = lastProps.height) !== null && _lastProps$height2 !== void 0 ? _lastProps$height2 : 1)
518
+ });
519
+ }
458
520
  var lastProps = _objectSpread({}, props);
521
+ function normalizeSize(n) {
522
+ var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
523
+ var v = typeof n === 'string' ? parseFloat(n) : n;
524
+ return Number.isFinite(v) && v > 0 ? v : fallback;
525
+ }
459
526
  var api = {
460
527
  // internal: rerender wrapper with latest props if host calls renderKitchenSimulator again
461
528
  __render: function __render(nextProps) {
462
- lastProps = _objectSpread(_objectSpread({}, lastProps), nextProps);
529
+ lastProps = _objectSpread(_objectSpread({}, lastProps), nextProps || {});
463
530
  root.render(/*#__PURE__*/_react["default"].createElement(Wrapper, lastProps));
464
531
  },
465
- updateContainerDimensions: function updateContainerDimensions(width, height) {
466
- var extraProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
467
- if (destroyed) return false;
468
-
469
- // optional: accept numbers or strings, up to you
470
- api.__render(_objectSpread(_objectSpread(_objectSpread({}, lastProps), extraProps), {}, {
471
- width: width,
472
- height: height
473
- }));
474
- return true;
475
- },
476
532
  /**
477
533
  * Send one or many events (in order).
478
534
  * Resolves when this batch has been delivered + settled.
@@ -555,6 +611,17 @@ function renderKitchenSimulator(container) {
555
611
  container[API_KEY] = null;
556
612
  }
557
613
  };
614
+ if (ro) {
615
+ try {
616
+ ro.disconnect();
617
+ } catch (_unused2) {}
618
+ ro = null;
619
+ }
620
+ roEl = null;
621
+ if (roRaf) {
622
+ cancelAnimationFrame(roRaf);
623
+ roRaf = 0;
624
+ }
558
625
 
559
626
  // Prefer microtask when available, otherwise macrotask
560
627
  if (typeof queueMicrotask === 'function') queueMicrotask(doUnmount);else setTimeout(doUnmount, 0);
@@ -564,6 +631,20 @@ function renderKitchenSimulator(container) {
564
631
  // first render
565
632
  api.__render(props);
566
633
 
634
+ // Install observer after initial mount.
635
+ // If #content-box is created later, retry a few frames.
636
+ (function tryInstall() {
637
+ var attempt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
638
+ if (destroyed) return;
639
+ installContentBoxObserver();
640
+ if (!ro && attempt < 30) {
641
+ // element not found yet; retry next frame for up to ~30 frames
642
+ requestAnimationFrame(function () {
643
+ return tryInstall(attempt + 1);
644
+ });
645
+ }
646
+ })();
647
+
567
648
  // store api on container so repeated calls reuse it
568
649
  container[API_KEY] = api;
569
650
  return api;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kitchen-simulator",
3
- "version": "3.12.0-test.1",
3
+ "version": "3.12.0-test.3",
4
4
  "description": "It is a kitchen simulator (self-contained micro-frontend).",
5
5
  "license": "MIT",
6
6
  "main": "lib/index.js",