@trackunit/react-map 0.2.26 → 0.2.28

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/index.cjs.js +12 -8
  2. package/index.esm.js +12 -8
  3. package/package.json +10 -10
package/index.cjs.js CHANGED
@@ -1804,19 +1804,23 @@ const Button = ({ config, overlaySide = undefined, resolved }) => {
1804
1804
  * @internal
1805
1805
  */
1806
1806
  const Custom = ({ config, overlaySide = undefined, resolved, placement }) => {
1807
- if (!resolved.visible) {
1807
+ const { autoTooltip, label, render } = config;
1808
+ // ControlRenderer passes a new `resolved` ref each Controls pass — keep the last deep-equal value.
1809
+ const [prevResolved, setPrevResolved] = react.useState(resolved);
1810
+ const stableResolved = resolved !== prevResolved && !esToolkit.isEqual(resolved, prevResolved) ? resolved : prevResolved;
1811
+ if (stableResolved !== prevResolved) {
1812
+ setPrevResolved(stableResolved);
1813
+ }
1814
+ // Skip re-calling `render` when only the `resolved` object reference changed, or when the control is not visible.
1815
+ const content = react.useMemo(() => (stableResolved.visible ? render({ resolved: stableResolved, placement }) : null), [placement, render, stableResolved]);
1816
+ if (!stableResolved.visible) {
1808
1817
  return null;
1809
1818
  }
1810
- const context = {
1811
- resolved,
1812
- placement,
1813
- };
1814
- const content = config.render(context);
1815
1819
  // `Tooltip` uses Radix `Slot`, which forwards props (refs, data-testid) onto its child.
1816
1820
  // A Fragment cannot accept those props — use an inert wrapper with `contents` layout.
1817
1821
  const wrapped = jsxRuntime.jsx("span", { className: "contents", children: content });
1818
- const useStandaloneTooltip = placement === "standalone" && (config.autoTooltip ?? "standalone") === "standalone";
1819
- return useStandaloneTooltip ? (jsxRuntime.jsx(reactComponents.Tooltip, { delayed: true, label: config.label, placement: overlaySide === "right" ? RIGHT_CONTROL_TOOLTIP_PLACEMENT : undefined, children: wrapped })) : (wrapped);
1822
+ const useStandaloneTooltip = placement === "standalone" && (autoTooltip ?? "standalone") === "standalone";
1823
+ return useStandaloneTooltip ? (jsxRuntime.jsx(reactComponents.Tooltip, { delayed: true, label: label, placement: overlaySide === "right" ? RIGHT_CONTROL_TOOLTIP_PLACEMENT : undefined, children: wrapped })) : (wrapped);
1820
1824
  };
1821
1825
 
1822
1826
  /** Shared padding for interactive menu items (button, toggle, stepper, select, radioGroup). */
package/index.esm.js CHANGED
@@ -1803,19 +1803,23 @@ const Button = ({ config, overlaySide = undefined, resolved }) => {
1803
1803
  * @internal
1804
1804
  */
1805
1805
  const Custom = ({ config, overlaySide = undefined, resolved, placement }) => {
1806
- if (!resolved.visible) {
1806
+ const { autoTooltip, label, render } = config;
1807
+ // ControlRenderer passes a new `resolved` ref each Controls pass — keep the last deep-equal value.
1808
+ const [prevResolved, setPrevResolved] = useState(resolved);
1809
+ const stableResolved = resolved !== prevResolved && !isEqual(resolved, prevResolved) ? resolved : prevResolved;
1810
+ if (stableResolved !== prevResolved) {
1811
+ setPrevResolved(stableResolved);
1812
+ }
1813
+ // Skip re-calling `render` when only the `resolved` object reference changed, or when the control is not visible.
1814
+ const content = useMemo(() => (stableResolved.visible ? render({ resolved: stableResolved, placement }) : null), [placement, render, stableResolved]);
1815
+ if (!stableResolved.visible) {
1807
1816
  return null;
1808
1817
  }
1809
- const context = {
1810
- resolved,
1811
- placement,
1812
- };
1813
- const content = config.render(context);
1814
1818
  // `Tooltip` uses Radix `Slot`, which forwards props (refs, data-testid) onto its child.
1815
1819
  // A Fragment cannot accept those props — use an inert wrapper with `contents` layout.
1816
1820
  const wrapped = jsx("span", { className: "contents", children: content });
1817
- const useStandaloneTooltip = placement === "standalone" && (config.autoTooltip ?? "standalone") === "standalone";
1818
- return useStandaloneTooltip ? (jsx(Tooltip, { delayed: true, label: config.label, placement: overlaySide === "right" ? RIGHT_CONTROL_TOOLTIP_PLACEMENT : undefined, children: wrapped })) : (wrapped);
1821
+ const useStandaloneTooltip = placement === "standalone" && (autoTooltip ?? "standalone") === "standalone";
1822
+ return useStandaloneTooltip ? (jsx(Tooltip, { delayed: true, label: label, placement: overlaySide === "right" ? RIGHT_CONTROL_TOOLTIP_PLACEMENT : undefined, children: wrapped })) : (wrapped);
1819
1823
  };
1820
1824
 
1821
1825
  /** Shared padding for interactive menu items (button, toggle, stepper, select, radioGroup). */
package/package.json CHANGED
@@ -1,22 +1,22 @@
1
1
  {
2
2
  "name": "@trackunit/react-map",
3
- "version": "0.2.26",
3
+ "version": "0.2.28",
4
4
  "repository": "https://github.com/Trackunit/manager",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "engines": {
7
7
  "node": ">=24.x"
8
8
  },
9
9
  "dependencies": {
10
- "@trackunit/react-components": "2.2.22",
11
- "@trackunit/css-class-variance-utilities": "1.13.79",
12
- "@trackunit/react-form-components": "2.2.23",
13
- "@trackunit/react-core-hooks": "1.18.20",
14
- "@trackunit/geo-json-utils": "1.14.82",
15
- "@trackunit/i18n-library-translation": "2.1.20",
10
+ "@trackunit/react-components": "2.2.23",
11
+ "@trackunit/css-class-variance-utilities": "1.13.80",
12
+ "@trackunit/react-form-components": "2.2.24",
13
+ "@trackunit/react-core-hooks": "1.18.21",
14
+ "@trackunit/geo-json-utils": "1.14.83",
15
+ "@trackunit/i18n-library-translation": "2.1.21",
16
16
  "react-minimal-pie-chart": "^8.4.0",
17
- "@trackunit/react-map-adapter-shared": "0.0.63",
18
- "@trackunit/react-map-color-utils": "0.0.48",
19
- "@trackunit/ui-design-tokens": "1.13.78",
17
+ "@trackunit/react-map-adapter-shared": "0.0.64",
18
+ "@trackunit/react-map-color-utils": "0.0.49",
19
+ "@trackunit/ui-design-tokens": "1.13.79",
20
20
  "@floating-ui/react": "^0.26.25",
21
21
  "es-toolkit": "^1.39.10",
22
22
  "tailwind-merge": "^2.0.0",