[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-94933":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":17,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":20,"hasPages":22,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":30,"readmeContent":31,"aiSummary":32,"trendingCount":15,"starSnapshotCount":15,"syncStatus":13,"lastSyncTime":33,"discoverSource":34},94933,"morphnext","KickNext\u002Fmorphnext","KickNext","Interruptible vector icon morphing for Flutter.","https:\u002F\u002Fkicknext.github.io\u002Fmorphnext\u002F",null,"Dart",142,2,1,0,35,5,62.43,"MIT License",false,"main",true,[24,25,26,27,28,29],"animation","dart","flutter","icons","morphing","vector-graphics","2026-08-24 04:01:23","# morphnext\n\n[![CI](https:\u002F\u002Fgithub.com\u002FKickNext\u002Fmorphnext\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002FKickNext\u002Fmorphnext\u002Factions\u002Fworkflows\u002Fci.yml)\n[![Web demo](https:\u002F\u002Fgithub.com\u002FKickNext\u002Fmorphnext\u002Factions\u002Fworkflows\u002Fpages.yml\u002Fbadge.svg)](https:\u002F\u002Fkicknext.github.io\u002Fmorphnext\u002F)\n[![pub.dev](https:\u002F\u002Fimg.shields.io\u002Fpub\u002Fv\u002Fmorphnext.svg)](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fmorphnext)\n[![MIT license](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue.svg)](LICENSE)\n\n**Morph into what’s next.**\n\nmorphnext turns bundled Flutter `IconData` glyphs into interruptible,\nspring-driven vector morphs without requiring per-pair animation assets.\n\n![morphnext showcase](https:\u002F\u002Fraw.githubusercontent.com\u002FKickNext\u002Fmorphnext\u002Fmain\u002Fassets\u002Fmorphnext_hero_720p_60fps_full_cycle.webp)\n\n## Install\n\n```console\nflutter pub add morphnext\n```\n\nRequires Dart `>=3.9.0` and Flutter `>=3.32.0`.\n\n## Implicit morph\n\nChange `icon`; `AnimatedMorphIcon` starts from the shape currently on screen,\neven when a new target interrupts an active transition.\n\n```dart\nimport 'package:flutter\u002Fmaterial.dart';\nimport 'package:morphnext\u002Fmorphnext.dart';\n\nIconButton(\n  onPressed: () => setState(() => open = !open),\n  icon: AnimatedMorphIcon(\n    icon: open ? Icons.close : Icons.menu,\n    semanticLabel: open ? 'Close menu' : 'Open menu',\n  ),\n)\n```\n\nUse `onEnd` when the next action must wait for the spring to finish and the\ntarget to settle on its final vector frame.\n\n`AnimatedMorphIcon` uses `MorphSprings.snappy` by default. Select\n`MorphSprings.smooth` for a critically damped transition, or pass Flutter's\n`SpringDescription` directly for custom physics.\n\nThe widgets accept the same visual font controls as Flutter's `Icon`:\n`fill`, `weight`, `grade`, `opticalSize`, `shadows`, `blendMode`, and\n`fontWeight`. Values not supplied directly are inherited from `IconTheme`.\n\n## Controlled morph\n\nUse any `Animation\u003Cdouble>` for gestures, scrolling, or a timeline. Progress is\nclamped to `0`–`1`.\n\n```dart\nMorphIcon(\n  from: Icons.favorite_border,\n  to: Icons.favorite,\n  progress: controller,\n  size: 32,\n  color: Colors.red,\n  semanticLabel: 'Favorite',\n)\n```\n\n## Font compatibility\n\nThere is no `fontAsset` argument. `IconData` identifies a code point, font\nfamily, package, and fallback families—not an asset path. morphnext uses those\nfields and Flutter's font manifest to resolve fonts bundled through\n`pubspec.yaml`.\n\nIf a font is loaded only at runtime, missing, malformed, or unsupported,\nmorphnext preserves the widget layout and displays regular Flutter icons\ninstead. The UI remains usable, but that transition is not a continuous vector\nmorph.\n\n## Flutter conventions\n\n`size`, `color`, opacity, variable axes, shadows, optional text scaling, and\ndirectionality follow `IconTheme`, `MediaQuery`, and `Directionality` like\nFlutter's `Icon`.\n`matchTextDirection` is honored in RTL layouts. Set `semanticLabel` for one\nsemantic image node; leave it null for a decorative icon. When\n`MediaQuery.disableAnimations` is true, `AnimatedMorphIcon` settles immediately.\n\n## Performance and caching\n\nFonts and morph plans are loaded lazily and cached with bounded memory use.\nAnimation repaints directly without rebuilding the widget on every frame.\n\n## Limitations\n\nmorphnext preserves filled contour topology and keeps holes open, but arbitrary\nicon pairs can still produce an artistically surprising intermediate shape.\nThe renderer is monochrome and accepts bundled font-backed `IconData`; it does\nnot morph arbitrary Flutter `Path` objects or SVG artwork.\n\n## Examples\n\n`example\u002Fexample.dart` is the compact pub.dev example. The app in\n`example\u002Flib\u002Fmain.dart` powers the GitHub Pages showcase and interactive\nplayground.\n\n## License and attribution\n\nmorphnext is MIT licensed. Parts of its geometry behavior are adapted from\nMIT-licensed Morphicons, and its font reader is derived from the MIT-licensed\n`icon_font_generator`; exact revisions and notices are in\n`THIRD_PARTY_NOTICES.md`.\n\nThis is an independent project. It is not affiliated with or endorsed by the\nFlutter project or the Morphicons project.\n","morphnext 是一个为 Flutter 框架设计的可中断矢量图标形变动画库。它支持基于 IconData 的无资产依赖形变（morphing），利用弹簧物理引擎实现流畅、可随时中断和重定向的向量图形过渡；核心特性包括隐式形变（自动从当前图标状态起始）、显式进度控制、完整继承 IconTheme 样式与 RTL 支持，并在字体缺失时优雅降级为静态图标。适用于需要轻量、响应式图标切换的移动端 UI 场景，如菜单开关、状态切换按钮、交互反馈动效等。","2026-08-18 02:30:10","CREATED_QUERY"]