{"record":{"id":"e3b5ded7c6740b6d","repo":"ionic-team/ionic-framework","slug":"animation-not-registered","errorCode":null,"errorMessage":"animation not registered","messagePattern":"animation not registered","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"core/src/utils/menu-controller/index.ts","lineNumber":193,"sourceCode":"  };\n\n  const _setOpen = async (menu: MenuI, shouldOpen: boolean, animated: boolean, role: string): Promise<boolean> => {\n    if (isAnimatingSync()) {\n      return false;\n    }\n    if (shouldOpen) {\n      const openedMenu = await getOpen();\n      if (openedMenu && menu.el !== openedMenu) {\n        await openedMenu.setOpen(false, false);\n      }\n    }\n    return menu._setOpen(shouldOpen, animated, role);\n  };\n\n  const _createAnimation = (type: string, menuCmp: MenuI) => {\n    const animationBuilder = menuAnimations.get(type) as any; // TODO(FW-2832): type\n    if (!animationBuilder) {\n      throw new Error('animation not registered');\n    }\n\n    const animation = animationBuilder(menuCmp);\n    return animation;\n  };\n\n  const _getOpenSync = (): HTMLIonMenuElement | undefined => {\n    return find((m) => m._isOpen);\n  };\n\n  const getMenusSync = (): HTMLIonMenuElement[] => {\n    return menus.map((menu) => menu.el);\n  };\n\n  const isAnimatingSync = (): boolean => {\n    return menus.some((menu) => menu.isAnimating);\n  };\n","sourceCodeStart":175,"sourceCodeEnd":211,"githubUrl":"https://github.com/ionic-team/ionic-framework/blob/625f9c38ad8c5db8a6c12df5c1622a36da90f9e3/core/src/utils/menu-controller/index.ts#L175-L211","documentation":"Thrown by MenuController._createAnimation() when no animation builder is registered for the requested menu `type`. The controller keeps a Map of builders; the built-in 'reveal', 'push', and 'overlay' are registered automatically. Any other type name that has not been registered via menuController.registerAnimation() triggers the throw when the menu tries to open.","triggerScenarios":"An <ion-menu type=\"...\"> (or config menuType) is set to a custom name that was never registered with menuController.registerAnimation(name, builder), or to a typo like 'Overlay'/'overlays'. The throw fires at open time when the menu calls menuController._createAnimation(this.type, this).","commonSituations":"Using a custom menu animation without first calling registerAnimation; misspelling a built-in type; setting a global config menuType to a name only registered in a lazy-loaded bundle that hasn't loaded yet; copying a type name from a tutorial that registered a custom animation you didn't include.","solutions":["Use one of the built-in types: 'overlay', 'reveal', or 'push'.","If you need a custom type, call menuController.registerAnimation('myType', myBuilder) before the menu opens (e.g. in app initialization).","Check the spelling and case of the type value against what you registered.","If registering in a lazy bundle, eager-register a fallback or ensure the bundle loads before any menu can open."],"exampleFix":"// before\n<ion-menu type=\"custom-reveal\"></ion-menu> <!-- never registered -->\n\n// after\nimport { menuController } from '@ionic/core';\nmenuController.registerAnimation('custom-reveal', myRevealBuilder);\n// then\n<ion-menu type=\"custom-reveal\"></ion-menu>","handlingStrategy":"validation","validationCode":"// Built-in types are registered automatically:\nconst BUILTIN = ['overlay','reveal','push'];\nconst type = BUILTIN.includes(menuType) ? menuType : 'overlay';\n// or, for custom:\nmenuController.registerAnimation('custom', builder); // before open","typeGuard":"function isRegisteredMenuType(name: string, registered?: Set<string>): boolean {\n  const defaults = ['overlay','reveal','push'];\n  return defaults.includes(name) || (registered?.has(name) ?? false);\n}","tryCatchPattern":null,"preventionTips":["Register custom animations during app bootstrap, before any menu opens.","Double-check type spelling/case against registered names.","Prefer built-in types unless you truly need a custom animation."],"tags":["menu","animation","registration","runtime"],"backgroundTag":null,"analyzedSha":"625f9c38ad8c5db8a6c12df5c1622a36da90f9e3","analyzedAt":"2026-08-12T16:00:25.413Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}