@korsolutions/guidon 1.0.21 → 1.0.23
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/dist/commonjs/hooks/useGuidonRef.js +33 -9
- package/dist/commonjs/hooks/useGuidonRef.js.map +1 -1
- package/dist/module/hooks/useGuidonRef.js +33 -9
- package/dist/module/hooks/useGuidonRef.js.map +1 -1
- package/dist/typescript/commonjs/hooks/useGuidonRef.d.ts.map +1 -1
- package/dist/typescript/module/hooks/useGuidonRef.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/hooks/useGuidonRef.ts +34 -9
|
@@ -58,22 +58,32 @@ function useGuidon() {
|
|
|
58
58
|
function useGuidonRegister() {
|
|
59
59
|
const elementsRef = (0, _react.useRef)(new Map());
|
|
60
60
|
const rafRef = (0, _react.useRef)(new Map());
|
|
61
|
+
// Cache ref callbacks to prevent creating new functions on every call
|
|
62
|
+
const refCallbacksRef = (0, _react.useRef)(new Map());
|
|
61
63
|
const registerTarget = (0, _store.useGuidonStore)(state => state.registerTarget);
|
|
62
64
|
const unregisterTarget = (0, _store.useGuidonStore)(state => state.unregisterTarget);
|
|
63
65
|
const isActive = (0, _store.useGuidonStore)(state => state.isActive);
|
|
64
66
|
const config = (0, _store.useGuidonStore)(state => state.config);
|
|
65
67
|
const currentStepIndex = (0, _store.useGuidonStore)(state => state.currentStepIndex);
|
|
68
|
+
|
|
69
|
+
// Use refs to avoid recreating callbacks when state changes (prevents infinite loop)
|
|
70
|
+
const isActiveRef = (0, _react.useRef)(isActive);
|
|
71
|
+
const configRef = (0, _react.useRef)(config);
|
|
72
|
+
isActiveRef.current = isActive;
|
|
73
|
+
configRef.current = config;
|
|
66
74
|
const measure = (0, _react.useCallback)((targetId, node) => {
|
|
75
|
+
const currentIsActive = isActiveRef.current;
|
|
76
|
+
const currentConfig = configRef.current;
|
|
67
77
|
console.log("[useGuidon] measure() called for:", targetId, {
|
|
68
78
|
hasNode: !!node,
|
|
69
|
-
isActive,
|
|
70
|
-
hasConfig: !!
|
|
79
|
+
isActive: currentIsActive,
|
|
80
|
+
hasConfig: !!currentConfig
|
|
71
81
|
});
|
|
72
|
-
if (!node || !
|
|
82
|
+
if (!node || !currentIsActive || !currentConfig) {
|
|
73
83
|
console.log("[useGuidon] measure() early return - missing node, inactive, or no config");
|
|
74
84
|
return;
|
|
75
85
|
}
|
|
76
|
-
const isTargetUsed =
|
|
86
|
+
const isTargetUsed = currentConfig.steps.some(step => step.targetId === targetId);
|
|
77
87
|
if (!isTargetUsed) {
|
|
78
88
|
console.log("[useGuidon] measure() - target not in config steps:", targetId);
|
|
79
89
|
return;
|
|
@@ -113,23 +123,37 @@ function useGuidonRegister() {
|
|
|
113
123
|
});
|
|
114
124
|
}
|
|
115
125
|
});
|
|
116
|
-
}, [
|
|
126
|
+
}, [registerTarget]);
|
|
127
|
+
|
|
128
|
+
// Use refs for measure and unregisterTarget to avoid recreating callbacks
|
|
129
|
+
const measureRef = (0, _react.useRef)(measure);
|
|
130
|
+
const unregisterTargetRef = (0, _react.useRef)(unregisterTarget);
|
|
131
|
+
measureRef.current = measure;
|
|
132
|
+
unregisterTargetRef.current = unregisterTarget;
|
|
117
133
|
const register = (0, _react.useCallback)(targetId => {
|
|
118
|
-
|
|
134
|
+
// Return cached callback if it exists
|
|
135
|
+
const cached = refCallbacksRef.current.get(targetId);
|
|
136
|
+
if (cached) return cached;
|
|
137
|
+
|
|
138
|
+
// Create and cache a new callback
|
|
139
|
+
const callback = node => {
|
|
119
140
|
if (node) {
|
|
120
141
|
elementsRef.current.set(targetId, node);
|
|
121
142
|
const raf = requestAnimationFrame(() => {
|
|
122
|
-
|
|
143
|
+
measureRef.current(targetId, node);
|
|
123
144
|
});
|
|
124
145
|
rafRef.current.set(targetId, raf);
|
|
125
146
|
return;
|
|
126
147
|
}
|
|
127
148
|
elementsRef.current.delete(targetId);
|
|
128
|
-
|
|
149
|
+
unregisterTargetRef.current(targetId);
|
|
129
150
|
const raf = rafRef.current.get(targetId);
|
|
130
151
|
if (raf) cancelAnimationFrame(raf);
|
|
131
152
|
};
|
|
132
|
-
|
|
153
|
+
refCallbacksRef.current.set(targetId, callback);
|
|
154
|
+
return callback;
|
|
155
|
+
}, [] // No dependencies - callbacks are cached and use refs
|
|
156
|
+
);
|
|
133
157
|
|
|
134
158
|
// Re-measure all registered targets when guide becomes active or step changes
|
|
135
159
|
// This ensures targets from all hook instances get measured
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_reactNative","_store","isElementInViewport","el","rect","getBoundingClientRect","top","left","bottom","window","innerHeight","document","documentElement","clientHeight","right","innerWidth","clientWidth","scrollElementIntoView","options","scrollIntoView","behavior","block","inline","useGuidon","register","useGuidonRegister","elementsRef","useRef","Map","rafRef","registerTarget","useGuidonStore","state","unregisterTarget","isActive","config","currentStepIndex","measure","useCallback","targetId","node","console","log","hasNode","hasConfig","isTargetUsed","steps","some","step","Platform","OS","style","getComputedStyle","paddingLeft","parseFloat","paddingRight","paddingTop","paddingBottom","borderLeft","borderLeftWidth","borderRight","borderRightWidth","borderTop","borderTopWidth","borderBottom","borderBottomWidth","measurements","x","scrollX","y","scrollY","width","height","native","measureInWindow","
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNative","_store","isElementInViewport","el","rect","getBoundingClientRect","top","left","bottom","window","innerHeight","document","documentElement","clientHeight","right","innerWidth","clientWidth","scrollElementIntoView","options","scrollIntoView","behavior","block","inline","useGuidon","register","useGuidonRegister","elementsRef","useRef","Map","rafRef","refCallbacksRef","registerTarget","useGuidonStore","state","unregisterTarget","isActive","config","currentStepIndex","isActiveRef","configRef","current","measure","useCallback","targetId","node","currentIsActive","currentConfig","console","log","hasNode","hasConfig","isTargetUsed","steps","some","step","Platform","OS","style","getComputedStyle","paddingLeft","parseFloat","paddingRight","paddingTop","paddingBottom","borderLeft","borderLeftWidth","borderRight","borderRightWidth","borderTop","borderTopWidth","borderBottom","borderBottomWidth","measurements","x","scrollX","y","scrollY","width","height","native","measureInWindow","measureRef","unregisterTargetRef","cached","get","callback","set","raf","requestAnimationFrame","delete","cancelAnimationFrame","useEffect","Array","from","keys","currentStep","currentTargetId","shouldScroll","forEach","id","theme","scrollOptions","handler","addEventListener","removeEventListener"],"sourceRoot":"../../../src","sources":["hooks/useGuidonRef.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -54,22 +54,32 @@ export function useGuidon() {
|
|
|
54
54
|
export function useGuidonRegister() {
|
|
55
55
|
const elementsRef = useRef(new Map());
|
|
56
56
|
const rafRef = useRef(new Map());
|
|
57
|
+
// Cache ref callbacks to prevent creating new functions on every call
|
|
58
|
+
const refCallbacksRef = useRef(new Map());
|
|
57
59
|
const registerTarget = useGuidonStore(state => state.registerTarget);
|
|
58
60
|
const unregisterTarget = useGuidonStore(state => state.unregisterTarget);
|
|
59
61
|
const isActive = useGuidonStore(state => state.isActive);
|
|
60
62
|
const config = useGuidonStore(state => state.config);
|
|
61
63
|
const currentStepIndex = useGuidonStore(state => state.currentStepIndex);
|
|
64
|
+
|
|
65
|
+
// Use refs to avoid recreating callbacks when state changes (prevents infinite loop)
|
|
66
|
+
const isActiveRef = useRef(isActive);
|
|
67
|
+
const configRef = useRef(config);
|
|
68
|
+
isActiveRef.current = isActive;
|
|
69
|
+
configRef.current = config;
|
|
62
70
|
const measure = useCallback((targetId, node) => {
|
|
71
|
+
const currentIsActive = isActiveRef.current;
|
|
72
|
+
const currentConfig = configRef.current;
|
|
63
73
|
console.log("[useGuidon] measure() called for:", targetId, {
|
|
64
74
|
hasNode: !!node,
|
|
65
|
-
isActive,
|
|
66
|
-
hasConfig: !!
|
|
75
|
+
isActive: currentIsActive,
|
|
76
|
+
hasConfig: !!currentConfig
|
|
67
77
|
});
|
|
68
|
-
if (!node || !
|
|
78
|
+
if (!node || !currentIsActive || !currentConfig) {
|
|
69
79
|
console.log("[useGuidon] measure() early return - missing node, inactive, or no config");
|
|
70
80
|
return;
|
|
71
81
|
}
|
|
72
|
-
const isTargetUsed =
|
|
82
|
+
const isTargetUsed = currentConfig.steps.some(step => step.targetId === targetId);
|
|
73
83
|
if (!isTargetUsed) {
|
|
74
84
|
console.log("[useGuidon] measure() - target not in config steps:", targetId);
|
|
75
85
|
return;
|
|
@@ -109,23 +119,37 @@ export function useGuidonRegister() {
|
|
|
109
119
|
});
|
|
110
120
|
}
|
|
111
121
|
});
|
|
112
|
-
}, [
|
|
122
|
+
}, [registerTarget]);
|
|
123
|
+
|
|
124
|
+
// Use refs for measure and unregisterTarget to avoid recreating callbacks
|
|
125
|
+
const measureRef = useRef(measure);
|
|
126
|
+
const unregisterTargetRef = useRef(unregisterTarget);
|
|
127
|
+
measureRef.current = measure;
|
|
128
|
+
unregisterTargetRef.current = unregisterTarget;
|
|
113
129
|
const register = useCallback(targetId => {
|
|
114
|
-
|
|
130
|
+
// Return cached callback if it exists
|
|
131
|
+
const cached = refCallbacksRef.current.get(targetId);
|
|
132
|
+
if (cached) return cached;
|
|
133
|
+
|
|
134
|
+
// Create and cache a new callback
|
|
135
|
+
const callback = node => {
|
|
115
136
|
if (node) {
|
|
116
137
|
elementsRef.current.set(targetId, node);
|
|
117
138
|
const raf = requestAnimationFrame(() => {
|
|
118
|
-
|
|
139
|
+
measureRef.current(targetId, node);
|
|
119
140
|
});
|
|
120
141
|
rafRef.current.set(targetId, raf);
|
|
121
142
|
return;
|
|
122
143
|
}
|
|
123
144
|
elementsRef.current.delete(targetId);
|
|
124
|
-
|
|
145
|
+
unregisterTargetRef.current(targetId);
|
|
125
146
|
const raf = rafRef.current.get(targetId);
|
|
126
147
|
if (raf) cancelAnimationFrame(raf);
|
|
127
148
|
};
|
|
128
|
-
|
|
149
|
+
refCallbacksRef.current.set(targetId, callback);
|
|
150
|
+
return callback;
|
|
151
|
+
}, [] // No dependencies - callbacks are cached and use refs
|
|
152
|
+
);
|
|
129
153
|
|
|
130
154
|
// Re-measure all registered targets when guide becomes active or step changes
|
|
131
155
|
// This ensures targets from all hook instances get measured
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","useEffect","useRef","Platform","useGuidonStore","isElementInViewport","el","rect","getBoundingClientRect","top","left","bottom","window","innerHeight","document","documentElement","clientHeight","right","innerWidth","clientWidth","scrollElementIntoView","options","scrollIntoView","behavior","block","inline","useGuidon","register","useGuidonRegister","elementsRef","Map","rafRef","registerTarget","state","unregisterTarget","isActive","config","currentStepIndex","measure","targetId","node","console","log","hasNode","hasConfig","isTargetUsed","steps","some","step","OS","style","getComputedStyle","paddingLeft","parseFloat","paddingRight","paddingTop","paddingBottom","borderLeft","borderLeftWidth","borderRight","borderRightWidth","borderTop","borderTopWidth","borderBottom","borderBottomWidth","measurements","x","scrollX","y","scrollY","width","height","native","measureInWindow","
|
|
1
|
+
{"version":3,"names":["useCallback","useEffect","useRef","Platform","useGuidonStore","isElementInViewport","el","rect","getBoundingClientRect","top","left","bottom","window","innerHeight","document","documentElement","clientHeight","right","innerWidth","clientWidth","scrollElementIntoView","options","scrollIntoView","behavior","block","inline","useGuidon","register","useGuidonRegister","elementsRef","Map","rafRef","refCallbacksRef","registerTarget","state","unregisterTarget","isActive","config","currentStepIndex","isActiveRef","configRef","current","measure","targetId","node","currentIsActive","currentConfig","console","log","hasNode","hasConfig","isTargetUsed","steps","some","step","OS","style","getComputedStyle","paddingLeft","parseFloat","paddingRight","paddingTop","paddingBottom","borderLeft","borderLeftWidth","borderRight","borderRightWidth","borderTop","borderTopWidth","borderBottom","borderBottomWidth","measurements","x","scrollX","y","scrollY","width","height","native","measureInWindow","measureRef","unregisterTargetRef","cached","get","callback","set","raf","requestAnimationFrame","delete","cancelAnimationFrame","Array","from","keys","currentStep","currentTargetId","shouldScroll","forEach","id","theme","scrollOptions","handler","addEventListener","removeEventListener"],"sourceRoot":"../../../src","sources":["hooks/useGuidonRef.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGuidonRef.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useGuidonRef.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,KAAK,iBAAiB,GAAG;IACvB,qBAAqB,CAAC,EAAE,MAAM,OAAO,CAAC;IACtC,eAAe,CAAC,EAAE,CAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,KACpE,IAAI,CAAC;IACV,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;CAC5D,CAAC;AA4BF;;;;;;;;;;;;;;GAcG;AAEH,wBAAgB,SAAS;
|
|
1
|
+
{"version":3,"file":"useGuidonRef.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useGuidonRef.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,KAAK,iBAAiB,GAAG;IACvB,qBAAqB,CAAC,EAAE,MAAM,OAAO,CAAC;IACtC,eAAe,CAAC,EAAE,CAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,KACpE,IAAI,CAAC;IACV,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;CAC5D,CAAC;AA4BF;;;;;;;;;;;;;;GAcG;AAEH,wBAAgB,SAAS;yBAqHV,MAAM,YA5G+B,iBAAiB,GAAG,IAAI,KAAK,IAAI;EANpF;AAED,wBAAgB,iBAAiB,eAgHlB,MAAM,YA5G+B,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAgMpF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGuidonRef.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useGuidonRef.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,KAAK,iBAAiB,GAAG;IACvB,qBAAqB,CAAC,EAAE,MAAM,OAAO,CAAC;IACtC,eAAe,CAAC,EAAE,CAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,KACpE,IAAI,CAAC;IACV,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;CAC5D,CAAC;AA4BF;;;;;;;;;;;;;;GAcG;AAEH,wBAAgB,SAAS;
|
|
1
|
+
{"version":3,"file":"useGuidonRef.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useGuidonRef.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,KAAK,iBAAiB,GAAG;IACvB,qBAAqB,CAAC,EAAE,MAAM,OAAO,CAAC;IACtC,eAAe,CAAC,EAAE,CAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,KACpE,IAAI,CAAC;IACV,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;CAC5D,CAAC;AA4BF;;;;;;;;;;;;;;GAcG;AAEH,wBAAgB,SAAS;yBAqHV,MAAM,YA5G+B,iBAAiB,GAAG,IAAI,KAAK,IAAI;EANpF;AAED,wBAAgB,iBAAiB,eAgHlB,MAAM,YA5G+B,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAgMpF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@korsolutions/guidon",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.23",
|
|
4
4
|
"description": "A cross-platform walkthrough/onboarding component library for React Native with web support. Features spotlight effects, customizable tooltips, and flexible persistence options. ",
|
|
5
5
|
"repository": "https://github.com/KorSoftwareSolutions/guidon.git",
|
|
6
6
|
"author": "Christian Jimenez <christianjimenezfael@gmail.com>",
|
|
@@ -65,6 +65,8 @@ export function useGuidon() {
|
|
|
65
65
|
export function useGuidonRegister() {
|
|
66
66
|
const elementsRef = useRef<Map<string, MeasurableElement>>(new Map());
|
|
67
67
|
const rafRef = useRef<Map<string, number>>(new Map());
|
|
68
|
+
// Cache ref callbacks to prevent creating new functions on every call
|
|
69
|
+
const refCallbacksRef = useRef<Map<string, (node: MeasurableElement | null) => void>>(new Map());
|
|
68
70
|
|
|
69
71
|
const registerTarget = useGuidonStore(
|
|
70
72
|
(state: GuidonStore) => state.registerTarget,
|
|
@@ -76,22 +78,31 @@ export function useGuidonRegister() {
|
|
|
76
78
|
const config = useGuidonStore((state) => state.config);
|
|
77
79
|
const currentStepIndex = useGuidonStore((state) => state.currentStepIndex);
|
|
78
80
|
|
|
81
|
+
// Use refs to avoid recreating callbacks when state changes (prevents infinite loop)
|
|
82
|
+
const isActiveRef = useRef(isActive);
|
|
83
|
+
const configRef = useRef(config);
|
|
84
|
+
isActiveRef.current = isActive;
|
|
85
|
+
configRef.current = config;
|
|
86
|
+
|
|
79
87
|
const measure = useCallback(
|
|
80
88
|
(targetId: string, node: MeasurableElement | null) => {
|
|
89
|
+
const currentIsActive = isActiveRef.current;
|
|
90
|
+
const currentConfig = configRef.current;
|
|
91
|
+
|
|
81
92
|
console.log("[useGuidon] measure() called for:", targetId, {
|
|
82
93
|
hasNode: !!node,
|
|
83
|
-
isActive,
|
|
84
|
-
hasConfig: !!
|
|
94
|
+
isActive: currentIsActive,
|
|
95
|
+
hasConfig: !!currentConfig,
|
|
85
96
|
});
|
|
86
97
|
|
|
87
|
-
if (!node || !
|
|
98
|
+
if (!node || !currentIsActive || !currentConfig) {
|
|
88
99
|
console.log(
|
|
89
100
|
"[useGuidon] measure() early return - missing node, inactive, or no config",
|
|
90
101
|
);
|
|
91
102
|
return;
|
|
92
103
|
}
|
|
93
104
|
|
|
94
|
-
const isTargetUsed =
|
|
105
|
+
const isTargetUsed = currentConfig.steps.some(
|
|
95
106
|
(step) => step.targetId === targetId,
|
|
96
107
|
);
|
|
97
108
|
|
|
@@ -153,30 +164,44 @@ export function useGuidonRegister() {
|
|
|
153
164
|
}
|
|
154
165
|
});
|
|
155
166
|
},
|
|
156
|
-
[
|
|
167
|
+
[registerTarget],
|
|
157
168
|
);
|
|
158
169
|
|
|
170
|
+
// Use refs for measure and unregisterTarget to avoid recreating callbacks
|
|
171
|
+
const measureRef = useRef(measure);
|
|
172
|
+
const unregisterTargetRef = useRef(unregisterTarget);
|
|
173
|
+
measureRef.current = measure;
|
|
174
|
+
unregisterTargetRef.current = unregisterTarget;
|
|
175
|
+
|
|
159
176
|
const register = useCallback(
|
|
160
177
|
(targetId: string) => {
|
|
161
|
-
|
|
178
|
+
// Return cached callback if it exists
|
|
179
|
+
const cached = refCallbacksRef.current.get(targetId);
|
|
180
|
+
if (cached) return cached;
|
|
181
|
+
|
|
182
|
+
// Create and cache a new callback
|
|
183
|
+
const callback = (node: MeasurableElement | null) => {
|
|
162
184
|
if (node) {
|
|
163
185
|
elementsRef.current.set(targetId, node);
|
|
164
186
|
|
|
165
187
|
const raf = requestAnimationFrame(() => {
|
|
166
|
-
|
|
188
|
+
measureRef.current(targetId, node);
|
|
167
189
|
});
|
|
168
190
|
|
|
169
191
|
rafRef.current.set(targetId, raf);
|
|
170
192
|
return;
|
|
171
193
|
}
|
|
172
194
|
elementsRef.current.delete(targetId);
|
|
173
|
-
|
|
195
|
+
unregisterTargetRef.current(targetId);
|
|
174
196
|
|
|
175
197
|
const raf = rafRef.current.get(targetId);
|
|
176
198
|
if (raf) cancelAnimationFrame(raf);
|
|
177
199
|
};
|
|
200
|
+
|
|
201
|
+
refCallbacksRef.current.set(targetId, callback);
|
|
202
|
+
return callback;
|
|
178
203
|
},
|
|
179
|
-
[
|
|
204
|
+
[], // No dependencies - callbacks are cached and use refs
|
|
180
205
|
);
|
|
181
206
|
|
|
182
207
|
// Re-measure all registered targets when guide becomes active or step changes
|