{"record":{"id":"196b75c74abd9c02","repo":"greensock/GSAP","slug":"please-gsap-registerplugin-observer","errorCode":null,"errorMessage":"Please gsap.registerPlugin(Observer)","messagePattern":"Please gsap\\.registerPlugin\\(Observer\\)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/Observer.js","lineNumber":153,"sourceCode":"\t\t\t_isTouch = Observer.isTouch = _win.matchMedia && _win.matchMedia(\"(hover: none), (pointer: coarse)\").matches ? 1 : (\"ontouchstart\" in _win || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0) ? 2 : 0;\n\t\t\t_eventTypes = Observer.eventTypes = (\"ontouchstart\" in _docEl ? \"touchstart,touchmove,touchcancel,touchend\" : !(\"onpointerdown\" in _docEl) ? \"mousedown,mousemove,mouseup,mouseup\" : \"pointerdown,pointermove,pointercancel,pointerup\").split(\",\");\n\t\t\tsetTimeout(() => _startup = 0, 500);\n\t\t\t_coreInitted = 1;\n\t\t}\n\t\tScrollTrigger || _setScrollTrigger(); // Observer might be initted BEFORE ScrollTrigger, so don't put this with the initting code. ScrollTrigger will call Observer.register() when it inits.\n\t\treturn _coreInitted;\n\t};\n\n_horizontal.op = _vertical;\n_scrollers.cache = 0;\n\nexport class Observer {\n\tconstructor(vars) {\n\t\tthis.init(vars);\n\t}\n\n\tinit(vars) {\n\t\t_coreInitted || _initCore(gsap) || console.warn(\"Please gsap.registerPlugin(Observer)\");\n\t\tScrollTrigger || _setScrollTrigger();\n\t\tlet {tolerance, dragMinimum, type, target, lineHeight, debounce, preventDefault, onStop, onStopDelay, ignore, wheelSpeed, event, onDragStart, onDragEnd, onDrag, onPress, onRelease, onRight, onLeft, onUp, onDown, onChangeX, onChangeY, onChange, onToggleX, onToggleY, onHover, onHoverEnd, onMove, ignoreCheck, isNormalizer, onGestureStart, onGestureEnd, onWheel, onEnable, onDisable, onClick, scrollSpeed, capture, allowClicks, lockAxis, onLockAxis} = vars;\n\t\tthis.target = target = _getTarget(target) || _docEl;\n\t\tthis.vars = vars;\n\t\tignore && (ignore = gsap.utils.toArray(ignore));\n\t\ttolerance = tolerance || 1e-9;\n\t\tdragMinimum = dragMinimum || 0;\n\t\twheelSpeed = wheelSpeed || 1;\n\t\tscrollSpeed = scrollSpeed || 1;\n\t\ttype = type || \"wheel,touch,pointer\";\n\t\tdebounce = debounce !== false;\n\t\tlineHeight || (lineHeight = parseFloat(_win.getComputedStyle(_body).lineHeight) || 22); // note: browser may report \"normal\", so default to 22.\n\t\tlet id, onStopDelayedCall, dragged, moved, wheeled, locked, axis,\n\t\t\tself = this,\n\t\t\tprevDeltaX = 0,\n\t\t\tprevDeltaY = 0,\n\t\t\tpassive = vars.passive || (!preventDefault && vars.passive !== false),\n\t\t\tscrollFuncX = _getScrollFunc(target, _horizontal),","sourceCodeStart":135,"sourceCodeEnd":171,"githubUrl":"https://github.com/greensock/GSAP/blob/13e2b790546426a1a2e0e9b409f3f8dc6d6611f2/src/Observer.js#L135-L171","documentation":"Observer is a registered GSAP plugin; its init() checks _coreInitted and warns if gsap.registerPlugin(Observer) was never called, because core hooks (context, ticker, etc.) were not installed. The Observer still continues initializing in most builds, but without registration behavior may be broken.","triggerScenarios":"Calling new Observer(...) or Observer.create(...) without a prior gsap.registerPlugin(Observer) — typically when loading GSAP core and Observer as separate modules and forgetting registration, or importing Observer without importing its side-effect registration.","commonSituations":"Bundler setups where tree-shaking removed the registration side effect, mixing CDN and npm imports, or calling Observer before registerPlugin runs due to module import order.","solutions":["Call gsap.registerPlugin(Observer) before creating any Observer","Use the side-effect import: import \"gsap/Observer\" plus import { Observer } from \"gsap/Observer\" and register explicitly","Register all used plugins in a single bootstrap module imported first","If using CDN, load Observer.js after gsap.min.js and call registerPlugin"],"exampleFix":"// before\nimport { Observer } from 'gsap/Observer';\nObserver.create({ onY: y => console.log(y) });\n// after\nimport { gsap, Observer } from 'gsap/all';\ngsap.registerPlugin(Observer);\nObserver.create({ onY: y => console.log(y) });","handlingStrategy":"validation","validationCode":"import { gsap, Observer } from 'gsap/all';\nif (!gsap.core.globals().Observer) gsap.registerPlugin(Observer);","typeGuard":null,"tryCatchPattern":"try {\n  const obs = Observer.create(vars);\n} catch (e) {\n  gsap.registerPlugin(Observer);\n  const obs = Observer.create(vars);\n}","preventionTips":["Register every plugin in one bootstrap module imported first","Never rely on side-effect-only imports; register explicitly","Lint for Observer usage without registerPlugin"],"tags":["gsap","plugin-registration","observer"],"backgroundTag":"missing-plugin-registration","analyzedSha":"13e2b790546426a1a2e0e9b409f3f8dc6d6611f2","analyzedAt":"2026-08-29T08:34:05.027Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}