# 🎨 shadcn_flutter **A cohesive shadcn/ui ecosystem for Flutter—components, theming, and tooling—ready to ditch Material and Cupertino** [![Pub Likes](https://img.shields.io/pub/likes/shadcn_flutter?style=for-the-badge&logo=dart&logoColor=white)](https://pub.dev/packages/shadcn_flutter) [![Pub Points](https://img.shields.io/pub/points/shadcn_flutter?style=for-the-badge&logo=dart&logoColor=white)](https://pub.dev/packages/shadcn_flutter) [![Pub Version](https://img.shields.io/pub/v/shadcn_flutter?style=for-the-badge&logo=dart&logoColor=white)](https://pub.dev/packages/shadcn_flutter) [![GitHub Sponsors](https://img.shields.io/github/sponsors/sunarya-thito?style=for-the-badge&logo=github&logoColor=white)](https://github.com/sponsors/sunarya-thito) [![GitHub Repo stars](https://img.shields.io/github/stars/sunarya-thito/shadcn_flutter?style=for-the-badge&logo=github&logoColor=white)](https://github.com/sunarya-thito/shadcn_flutter) --- 🚀 A comprehensive Flutter UI ecosystem built on shadcn/ui: production‑ready components, primitives, theming, and tooling for mobile, web, and desktop. Interop with Material/Cupertino is optional—adopt incrementally or go all‑in. **[📚 Widget Catalog](https://sunarya-thito.github.io/shadcn_flutter/)** • **[📦 pub.dev](https://pub.dev/packages/shadcn_flutter)** • **[💬 Discord](https://discord.gg/ZzfBPQG4sV)**
## ✨ Features - 🎨 **70+ Beautiful Components** - From basic buttons to complex data tables - 🧩 **Ecosystem‑first** - Components, primitives, theming, and tooling aligned with shadcn/ui - 🌙 **Dark/Light Mode** - Built-in theme switching with multiple color schemes - 📱 **Responsive Design** - Components that work seamlessly across all screen sizes - 🔁 **Incremental Adoption** - Works inside MaterialApp/CupertinoApp; mix and match while you migrate - 🖥️📱 **All Platforms** - Android, iOS, Web, macOS, Windows, and Linux - 🎯 **Type Safe** - Full TypeScript-like experience with Dart's strong typing - 🚀 **Performance First** - Optimized components for smooth animations and interactions - 🎨 **Customizable** - Easy theming and styling to match your brand - 📦 **Tree Shakable** - Import only what you need ## 🧩 Components Library ### Animation [![AnimatedValueBuilder](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/animatedvaluebuilder.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/animated_value_builder) [![Number Ticker](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/number_ticker.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/number_ticker) [![RepeatedAnimationBuilder](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/repeatedanimationbuilder.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/repeated_animation_builder) ### Disclosure [![Accordion](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/accordion.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/accordion) [![Collapsible](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/collapsible.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/collapsible) ### Feedback [![Alert](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/alert.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/alert) [![Alert Dialog](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/alert_dialog.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/alert-dialog) [![Circular Progress](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/circular_progress.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/circular-progress) [![Progress Bar](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/progress.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/progress) [![Skeleton](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/skeleton.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/skeleton) [![Toast](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/toast.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/toast) ### Forms [![Button](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/button.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/button) [![Checkbox](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/checkbox.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/checkbox) [![Chip Input](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/chip_input.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/chip_input) [![Color Picker](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/colorpicker.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/color-picker) [![Date Picker](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/datepicker.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/date_picker) [![Form](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/form.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/form) [![Input](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/input.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/input) [![Input OTP](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/inputotp.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/input_otp) [![Phone Input](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/phone_input.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/phone_input) [![Radio Group](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/radiogroup.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/radio_group) [![Select](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/select.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/select) [![Slider](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/slider.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/slider) [![Star Rating](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/star_rating.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/star_rating) [![Switch](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/switch.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/switch) [![Text Area](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/textarea.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/text_area) [![Time Picker](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/time_picker.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/time_picker) [![Toggle](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/toggle.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/toggle) ### Layout [![Card](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/card.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/card) [![Carousel](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/carousel.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/carousel) [![Divider](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/divider.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/divider) [![Resizable](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/resizable.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/resizable) [![Stepper](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/stepper.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/stepper) [![Steps](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/steps.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/steps) [![Timeline](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/timeline.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/timeline) ### Navigation [![Breadcrumb](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/breadcrumb.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/breadcrumb) [![Menubar](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/menubar.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/menubar) [![Navigation Menu](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/navigation_menu.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/navigation_menu) [![Pagination](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/pagination.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/pagination) [![Tabs](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/tabs.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/tabs) [![Tab List](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/tablist.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/tab_list) [![Tree](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/tree.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/tree) ### Surfaces [![Dialog](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/dialog.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/dialog) [![Drawer](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/drawer.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/drawer) [![Hover Card](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/hover_card.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/hover_card) [![Popover](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/popover.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/popover) [![Sheet](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/sheet.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/sheet) [![Tooltip](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/tooltip.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/tooltip) ### Data Display [![Avatar](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/avatar.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/avatar) [![Avatar Group](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/avatar_group.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/avatar_group) [![Code Snippet](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/codesnippet.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/code-snippet) [![Tracker](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/tracker.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/tracker) ### Utilities [![Badge](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/badge.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/badge) [![Calendar](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/calendar.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/calendar) [![Command](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/command.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/command) [![Context Menu](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/context_menu.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/context_menu) [![Dropdown Menu](https://raw.githubusercontent.com/sunarya-thito/shadcn_flutter/master/docs_images/dropdown_menu.png)](https://sunarya-thito.github.io/shadcn_flutter/#/components/dropdown_menu) ## 🧠 LLMs Support This repository includes a prebuilt, machine‑friendly reference file you can feed to LLMs and editor assistants: - [`llms-full.txt`](https://sunarya-thito.github.io/shadcn_flutter/llms-full.txt) - Full component reference with props, methods, and usage examples ## ❓ FAQ
Does this replace Material/Cupertino? Yes. shadcn_flutter is a standalone ecosystem built on the shadcn/ui design system. Interop with Material/Cupertino is optional so you can adopt it incrementally or go all‑in.
Can I use it with my existing MaterialApp/CupertinoApp? Yes. Drop shadcn_flutter components into your app, keep your current routing (e.g., GoRouter) and state management, and migrate over time.
Does it support GoRouter? Yes.
Which platforms are supported? Android, iOS, Web, macOS, Windows, and Linux.
Can I use it commercially? Yes. Free to use for personal and commercial projects. No attribution required.
Can I choose between Default and New York styles? This package currently supports the New York style. If you need the default style of shadcn/ui, consider this package: [flutter-shadcn-ui](https://github.com/nank1ro/flutter-shadcn-ui) by [@nank1ro](https://x.com/nank1ro).
## 🤝 Contributing & Support We welcome contributions from the community! Here's how you can help make shadcn_flutter even better: ### 🌟 Ways to Contribute
[![⭐ Star on GitHub](https://img.shields.io/badge/⭐_Star_on_GitHub-black?style=for-the-badge&logo=github)](https://github.com/sunarya-thito/shadcn_flutter) [![💖 Sponsor](https://img.shields.io/badge/💖_Sponsor-pink?style=for-the-badge&logo=github-sponsors)](https://github.com/sponsors/sunarya-thito) [![🐛 Report Bug](https://img.shields.io/badge/🐛_Report_Bug-red?style=for-the-badge&logo=github)](https://github.com/sunarya-thito/shadcn_flutter/issues) [![💡 Request Feature](https://img.shields.io/badge/💡_Request_Feature-blue?style=for-the-badge&logo=github)](https://github.com/sunarya-thito/shadcn_flutter/issues)
#### 💰 Financial Support - 💖 **[GitHub Sponsors](https://github.com/sponsors/sunarya-thito)** - Support ongoing development - 💰 **[PayPal](https://paypal.me/sunaryathito)** - Support ongoing development - ⭐ **Star the repository** - Help us reach more developers - 📢 **Share the project** - Spread the word in your community #### 🛠️ Code Contributions - 🐛 **Bug fixes** - Help us squash those pesky bugs - ✨ **New features** - Add components or enhance existing ones - 📚 **Documentation** - Improve guides, examples, and API docs - 🧪 **Testing** - Write tests to improve reliability #### 🗨️ Community Support - 💬 **[Join our Discord](https://discord.gg/ZzfBPQG4sV)** - Get help and connect with other developers - 🤝 **Help others** - Answer questions and share your knowledge - 📝 **Write tutorials** - Create blog posts or video tutorials ### 🏆 Recognition This project is funded and maintained by the community. Every contribution, no matter how small, makes a difference and helps ensure the continued development of shadcn_flutter. **Thank you to all our contributors and supporters! 🙏** ---
**Built with ❤️ by [Thito Yalasatria Sunarya](https://github.com/sunarya-thito) and the community** _Made in Indonesia 🇮🇩_
/// A collection of Bootstrap Icons as Flutter IconData. /// /// Provides access to the complete Bootstrap Icons font family. /// Each icon is defined as a static constant [IconData] that can be /// used directly with Flutter's [Icon] widget. /// /// Example: /// ```dart /// Icon(BootstrapIcons.alarm) /// ``` class BootstrapIcons { /// Bootstrap icon for icon123. static IconData icon123; /// Bootstrap icon for alarm fill. static IconData alarmFill; /// Bootstrap icon for alarm. static IconData alarm; /// Bootstrap icon for align bottom. static IconData alignBottom; /// Bootstrap icon for align center. static IconData alignCenter; /// Bootstrap icon for align end. static IconData alignEnd; /// Bootstrap icon for align middle. static IconData alignMiddle; /// Bootstrap icon for align start. static IconData alignStart; /// Bootstrap icon for align top. static IconData alignTop; /// Bootstrap icon for alt. static IconData alt; /// Bootstrap icon for app indicator. static IconData appIndicator; /// Bootstrap icon for app. static IconData app; /// Bootstrap icon for archive fill. static IconData archiveFill; /// Bootstrap icon for archive. static IconData archive; /// Bootstrap icon for arrow90deg down. static IconData arrow90degDown; /// Bootstrap icon for arrow90deg left. static IconData arrow90degLeft; /// Bootstrap icon for arrow90deg right. static IconData arrow90degRight; /// Bootstrap icon for arrow90deg up. static IconData arrow90degUp; /// Bootstrap icon for arrow bar down. static IconData arrowBarDown; /// Bootstrap icon for arrow bar left. static IconData arrowBarLeft; /// Bootstrap icon for arrow bar right. static IconData arrowBarRight; /// Bootstrap icon for arrow bar up. static IconData arrowBarUp; /// Bootstrap icon for arrow clockwise. static IconData arrowClockwise; /// Bootstrap icon for arrow counterclockwise. static IconData arrowCounterclockwise; /// Bootstrap icon for arrow down circle fill. static IconData arrowDownCircleFill; /// Bootstrap icon for arrow down circle. static IconData arrowDownCircle; /// Bootstrap icon for arrow down left circle fill. static IconData arrowDownLeftCircleFill; /// Bootstrap icon for arrow down left circle. static IconData arrowDownLeftCircle; /// Bootstrap icon for arrow down left square fill. static IconData arrowDownLeftSquareFill; /// Bootstrap icon for arrow down left square. static IconData arrowDownLeftSquare; /// Bootstrap icon for arrow down left. static IconData arrowDownLeft; /// Bootstrap icon for arrow down right circle fill. static IconData arrowDownRightCircleFill; /// Bootstrap icon for arrow down right circle. static IconData arrowDownRightCircle; /// Bootstrap icon for arrow down right square fill. static IconData arrowDownRightSquareFill; /// Bootstrap icon for arrow down right square. static IconData arrowDownRightSquare; /// Bootstrap icon for arrow down right. static IconData arrowDownRight; /// Bootstrap icon for arrow down short. static IconData arrowDownShort; /// Bootstrap icon for arrow down square fill. static IconData arrowDownSquareFill; /// Bootstrap icon for arrow down square. static IconData arrowDownSquare; /// Bootstrap icon for arrow down up. static IconData arrowDownUp; /// Bootstrap icon for arrow down. static IconData arrowDown; /// Bootstrap icon for arrow left circle fill. static IconData arrowLeftCircleFill; /// Bootstrap icon for arrow left circle. static IconData arrowLeftCircle; /// Bootstrap icon for arrow left right. static IconData arrowLeftRight; /// Bootstrap icon for arrow left short. static IconData arrowLeftShort; /// Bootstrap icon for arrow left square fill. static IconData arrowLeftSquareFill; /// Bootstrap icon for arrow left square. static IconData arrowLeftSquare; /// Bootstrap icon for arrow left. static IconData arrowLeft; /// Bootstrap icon for arrow repeat. static IconData arrowRepeat; /// Bootstrap icon for arrow return left. static IconData arrowReturnLeft; /// Bootstrap icon for arrow return right. static IconData arrowReturnRight; /// Bootstrap icon for arrow right circle fill. static IconData arrowRightCircleFill; /// Bootstrap icon for arrow right circle. static IconData arrowRightCircle; /// Bootstrap icon for arrow right short. static IconData arrowRightShort; /// Bootstrap icon for arrow right square fill. static IconData arrowRightSquareFill; /// Bootstrap icon for arrow right square. static IconData arrowRightSquare; /// Bootstrap icon for arrow right. static IconData arrowRight; /// Bootstrap icon for arrow up circle fill. static IconData arrowUpCircleFill; /// Bootstrap icon for arrow up circle. static IconData arrowUpCircle; /// Bootstrap icon for arrow up left circle fill. static IconData arrowUpLeftCircleFill; /// Bootstrap icon for arrow up left circle. static IconData arrowUpLeftCircle; /// Bootstrap icon for arrow up left square fill. static IconData arrowUpLeftSquareFill; /// Bootstrap icon for arrow up left square. static IconData arrowUpLeftSquare; /// Bootstrap icon for arrow up left. static IconData arrowUpLeft; /// Bootstrap icon for arrow up right circle fill. static IconData arrowUpRightCircleFill; /// Bootstrap icon for arrow up right circle. static IconData arrowUpRightCircle; /// Bootstrap icon for arrow up right square fill. static IconData arrowUpRightSquareFill; /// Bootstrap icon for arrow up right square. static IconData arrowUpRightSquare; /// Bootstrap icon for arrow up right. static IconData arrowUpRight; /// Bootstrap icon for arrow up short. static IconData arrowUpShort; /// Bootstrap icon for arrow up square fill. static IconData arrowUpSquareFill; /// Bootstrap icon for arrow up square. static IconData arrowUpSquare; /// Bootstrap icon for arrow up. static IconData arrowUp; /// Bootstrap icon for arrows angle contract. static IconData arrowsAngleContract; /// Bootstrap icon for arrows angle expand. static IconData arrowsAngleExpand; /// Bootstrap icon for arrows collapse. static IconData arrowsCollapse; /// Bootstrap icon for arrows expand. static IconData arrowsExpand; /// Bootstrap icon for arrows fullscreen. static IconData arrowsFullscreen; /// Bootstrap icon for arrows move. static IconData arrowsMove; /// Bootstrap icon for aspect ratio fill. static IconData aspectRatioFill; /// Bootstrap icon for aspect ratio. static IconData aspectRatio; /// Bootstrap icon for asterisk. static IconData asterisk; /// Bootstrap icon for at. static IconData at; /// Bootstrap icon for award fill. static IconData awardFill; /// Bootstrap icon for award. static IconData award; /// Bootstrap icon for back. static IconData back; /// Bootstrap icon for backspace fill. static IconData backspaceFill; /// Bootstrap icon for backspace reverse fill. static IconData backspaceReverseFill; /// Bootstrap icon for backspace reverse. static IconData backspaceReverse; /// Bootstrap icon for backspace. static IconData backspace; /// Bootstrap icon for badge3d fill. static IconData badge3dFill; /// Bootstrap icon for badge3d. static IconData badge3d; /// Bootstrap icon for badge4k fill. static IconData badge4kFill; /// Bootstrap icon for badge4k. static IconData badge4k; /// Bootstrap icon for badge8k fill. static IconData badge8kFill; /// Bootstrap icon for badge8k. static IconData badge8k; /// Bootstrap icon for badge ad fill. static IconData badgeAdFill; /// Bootstrap icon for badge ad. static IconData badgeAd; /// Bootstrap icon for badge ar fill. static IconData badgeArFill; /// Bootstrap icon for badge ar. static IconData badgeAr; /// Bootstrap icon for badge cc fill. static IconData badgeCcFill; /// Bootstrap icon for badge cc. static IconData badgeCc; /// Bootstrap icon for badge hd fill. static IconData badgeHdFill; /// Bootstrap icon for badge hd. static IconData badgeHd; /// Bootstrap icon for badge tm fill. static IconData badgeTmFill; /// Bootstrap icon for badge tm. static IconData badgeTm; /// Bootstrap icon for badge vo fill. static IconData badgeVoFill; /// Bootstrap icon for badge vo. static IconData badgeVo; /// Bootstrap icon for badge vr fill. static IconData badgeVrFill; /// Bootstrap icon for badge vr. static IconData badgeVr; /// Bootstrap icon for badge wc fill. static IconData badgeWcFill; /// Bootstrap icon for badge wc. static IconData badgeWc; /// Bootstrap icon for bag check fill. static IconData bagCheckFill; /// Bootstrap icon for bag check. static IconData bagCheck; /// Bootstrap icon for bag dash fill. static IconData bagDashFill; /// Bootstrap icon for bag dash. static IconData bagDash; /// Bootstrap icon for bag fill. static IconData bagFill; /// Bootstrap icon for bag plus fill. static IconData bagPlusFill; /// Bootstrap icon for bag plus. static IconData bagPlus; /// Bootstrap icon for bag x fill. static IconData bagXFill; /// Bootstrap icon for bag x. static IconData bagX; /// Bootstrap icon for bag. static IconData bag; /// Bootstrap icon for bar chart fill. static IconData barChartFill; /// Bootstrap icon for bar chart line fill. static IconData barChartLineFill; /// Bootstrap icon for bar chart line. static IconData barChartLine; /// Bootstrap icon for bar chart steps. static IconData barChartSteps; /// Bootstrap icon for bar chart. static IconData barChart; /// Bootstrap icon for basket fill. static IconData basketFill; /// Bootstrap icon for basket. static IconData basket; /// Bootstrap icon for basket2 fill. static IconData basket2Fill; /// Bootstrap icon for basket2. static IconData basket2; /// Bootstrap icon for basket3 fill. static IconData basket3Fill; /// Bootstrap icon for basket3. static IconData basket3; /// Bootstrap icon for battery charging. static IconData batteryCharging; /// Bootstrap icon for battery full. static IconData batteryFull; /// Bootstrap icon for battery half. static IconData batteryHalf; /// Bootstrap icon for battery. static IconData battery; /// Bootstrap icon for bell fill. static IconData bellFill; /// Bootstrap icon for bell. static IconData bell; /// Bootstrap icon for bezier. static IconData bezier; /// Bootstrap icon for bezier2. static IconData bezier2; /// Bootstrap icon for bicycle. static IconData bicycle; /// Bootstrap icon for binoculars fill. static IconData binocularsFill; /// Bootstrap icon for binoculars. static IconData binoculars; /// Bootstrap icon for blockquote left. static IconData blockquoteLeft; /// Bootstrap icon for blockquote right. static IconData blockquoteRight; /// Bootstrap icon for book fill. static IconData bookFill; /// Bootstrap icon for book half. static IconData bookHalf; /// Bootstrap icon for book. static IconData book; /// Bootstrap icon for bookmark check fill. static IconData bookmarkCheckFill; /// Bootstrap icon for bookmark check. static IconData bookmarkCheck; /// Bootstrap icon for bookmark dash fill. static IconData bookmarkDashFill; /// Bootstrap icon for bookmark dash. static IconData bookmarkDash; /// Bootstrap icon for bookmark fill. static IconData bookmarkFill; /// Bootstrap icon for bookmark heart fill. static IconData bookmarkHeartFill; /// Bootstrap icon for bookmark heart. static IconData bookmarkHeart; /// Bootstrap icon for bookmark plus fill. static IconData bookmarkPlusFill; /// Bootstrap icon for bookmark plus. static IconData bookmarkPlus; /// Bootstrap icon for bookmark star fill. static IconData bookmarkStarFill; /// Bootstrap icon for bookmark star. static IconData bookmarkStar; /// Bootstrap icon for bookmark x fill. static IconData bookmarkXFill; /// Bootstrap icon for bookmark x. static IconData bookmarkX; /// Bootstrap icon for bookmark. static IconData bookmark; /// Bootstrap icon for bookmarks fill. static IconData bookmarksFill; /// Bootstrap icon for bookmarks. static IconData bookmarks; /// Bootstrap icon for bookshelf. static IconData bookshelf; /// Bootstrap icon for bootstrap fill. static IconData bootstrapFill; /// Bootstrap icon for bootstrap reboot. static IconData bootstrapReboot; /// Bootstrap icon for bootstrap. static IconData bootstrap; /// Bootstrap icon for border all. static IconData borderAll; /// Bootstrap icon for border bottom. static IconData borderBottom; /// Bootstrap icon for border center. static IconData borderCenter; /// Bootstrap icon for border inner. static IconData borderInner; /// Bootstrap icon for border left. static IconData borderLeft; /// Bootstrap icon for border middle. static IconData borderMiddle; /// Bootstrap icon for border outer. static IconData borderOuter; /// Bootstrap icon for border right. static IconData borderRight; /// Bootstrap icon for border style. static IconData borderStyle; /// Bootstrap icon for border top. static IconData borderTop; /// Bootstrap icon for border width. static IconData borderWidth; /// Bootstrap icon for border. static IconData border; /// Bootstrap icon for bounding box circles. static IconData boundingBoxCircles; /// Bootstrap icon for bounding box. static IconData boundingBox; /// Bootstrap icon for box arrow down left. static IconData boxArrowDownLeft; /// Bootstrap icon for box arrow down right. static IconData boxArrowDownRight; /// Bootstrap icon for box arrow down. static IconData boxArrowDown; /// Bootstrap icon for box arrow in down left. static IconData boxArrowInDownLeft; /// Bootstrap icon for box arrow in down right. static IconData boxArrowInDownRight; /// Bootstrap icon for box arrow in down. static IconData boxArrowInDown; /// Bootstrap icon for box arrow in left. static IconData boxArrowInLeft; /// Bootstrap icon for box arrow in right. static IconData boxArrowInRight; /// Bootstrap icon for box arrow in up left. static IconData boxArrowInUpLeft; /// Bootstrap icon for box arrow in up right. static IconData boxArrowInUpRight; /// Bootstrap icon for box arrow in up. static IconData boxArrowInUp; /// Bootstrap icon for box arrow left. static IconData boxArrowLeft; /// Bootstrap icon for box arrow right. static IconData boxArrowRight; /// Bootstrap icon for box arrow up left. static IconData boxArrowUpLeft; /// Bootstrap icon for box arrow up right. static IconData boxArrowUpRight; /// Bootstrap icon for box arrow up. static IconData boxArrowUp; /// Bootstrap icon for box seam. static IconData boxSeam; /// Bootstrap icon for box. static IconData box; /// Bootstrap icon for braces. static IconData braces; /// Bootstrap icon for bricks. static IconData bricks; /// Bootstrap icon for briefcase fill. static IconData briefcaseFill; /// Bootstrap icon for briefcase. static IconData briefcase; /// Bootstrap icon for brightness alt high fill. static IconData brightnessAltHighFill; /// Bootstrap icon for brightness alt high. static IconData brightnessAltHigh; /// Bootstrap icon for brightness alt low fill. static IconData brightnessAltLowFill; /// Bootstrap icon for brightness alt low. static IconData brightnessAltLow; /// Bootstrap icon for brightness high fill. static IconData brightnessHighFill; /// Bootstrap icon for brightness high. static IconData brightnessHigh; /// Bootstrap icon for brightness low fill. static IconData brightnessLowFill; /// Bootstrap icon for brightness low. static IconData brightnessLow; /// Bootstrap icon for broadcast pin. static IconData broadcastPin; /// Bootstrap icon for broadcast. static IconData broadcast; /// Bootstrap icon for brush fill. static IconData brushFill; /// Bootstrap icon for brush. static IconData brush; /// Bootstrap icon for bucket fill. static IconData bucketFill; /// Bootstrap icon for bucket. static IconData bucket; /// Bootstrap icon for bug fill. static IconData bugFill; /// Bootstrap icon for bug. static IconData bug; /// Bootstrap icon for building. static IconData building; /// Bootstrap icon for bullseye. static IconData bullseye; /// Bootstrap icon for calculator fill. static IconData calculatorFill; /// Bootstrap icon for calculator. static IconData calculator; /// Bootstrap icon for calendar check fill. static IconData calendarCheckFill; /// Bootstrap icon for calendar check. static IconData calendarCheck; /// Bootstrap icon for calendar date fill. static IconData calendarDateFill; /// Bootstrap icon for calendar date. static IconData calendarDate; /// Bootstrap icon for calendar day fill. static IconData calendarDayFill; /// Bootstrap icon for calendar day. static IconData calendarDay; /// Bootstrap icon for calendar event fill. static IconData calendarEventFill; /// Bootstrap icon for calendar event. static IconData calendarEvent; /// Bootstrap icon for calendar fill. static IconData calendarFill; /// Bootstrap icon for calendar minus fill. static IconData calendarMinusFill; /// Bootstrap icon for calendar minus. static IconData calendarMinus; /// Bootstrap icon for calendar month fill. static IconData calendarMonthFill; /// Bootstrap icon for calendar month. static IconData calendarMonth; /// Bootstrap icon for calendar plus fill. static IconData calendarPlusFill; /// Bootstrap icon for calendar plus. static IconData calendarPlus; /// Bootstrap icon for calendar range fill. static IconData calendarRangeFill; /// Bootstrap icon for calendar range. static IconData calendarRange; /// Bootstrap icon for calendar week fill. static IconData calendarWeekFill; /// Bootstrap icon for calendar week. static IconData calendarWeek; /// Bootstrap icon for calendar x fill. static IconData calendarXFill; /// Bootstrap icon for calendar x. static IconData calendarX; /// Bootstrap icon for calendar. static IconData calendar; /// Bootstrap icon for calendar2 check fill. static IconData calendar2CheckFill; /// Bootstrap icon for calendar2 check. static IconData calendar2Check; /// Bootstrap icon for calendar2 date fill. static IconData calendar2DateFill; /// Bootstrap icon for calendar2 date. static IconData calendar2Date; /// Bootstrap icon for calendar2 day fill. static IconData calendar2DayFill; /// Bootstrap icon for calendar2 day. static IconData calendar2Day; /// Bootstrap icon for calendar2 event fill. static IconData calendar2EventFill; /// Bootstrap icon for calendar2 event. static IconData calendar2Event; /// Bootstrap icon for calendar2 fill. static IconData calendar2Fill; /// Bootstrap icon for calendar2 minus fill. static IconData calendar2MinusFill; /// Bootstrap icon for calendar2 minus. static IconData calendar2Minus; /// Bootstrap icon for calendar2 month fill. static IconData calendar2MonthFill; /// Bootstrap icon for calendar2 month. static IconData calendar2Month; /// Bootstrap icon for calendar2 plus fill. static IconData calendar2PlusFill; /// Bootstrap icon for calendar2 plus. static IconData calendar2Plus; /// Bootstrap icon for calendar2 range fill. static IconData calendar2RangeFill; /// Bootstrap icon for calendar2 range. static IconData calendar2Range; /// Bootstrap icon for calendar2 week fill. static IconData calendar2WeekFill; /// Bootstrap icon for calendar2 week. static IconData calendar2Week; /// Bootstrap icon for calendar2 x fill. static IconData calendar2XFill; /// Bootstrap icon for calendar2 x. static IconData calendar2X; /// Bootstrap icon for calendar2. static IconData calendar2; /// Bootstrap icon for calendar3 event fill. static IconData calendar3EventFill; /// Bootstrap icon for calendar3 event. static IconData calendar3Event; /// Bootstrap icon for calendar3 fill. static IconData calendar3Fill; /// Bootstrap icon for calendar3 range fill. static IconData calendar3RangeFill; /// Bootstrap icon for calendar3 range. static IconData calendar3Range; /// Bootstrap icon for calendar3 week fill. static IconData calendar3WeekFill; /// Bootstrap icon for calendar3 week. static IconData calendar3Week; /// Bootstrap icon for calendar3. static IconData calendar3; /// Bootstrap icon for calendar4 event. static IconData calendar4Event; /// Bootstrap icon for calendar4 range. static IconData calendar4Range; /// Bootstrap icon for calendar4 week. static IconData calendar4Week; /// Bootstrap icon for calendar4. static IconData calendar4; /// Bootstrap icon for camera fill. static IconData cameraFill; /// Bootstrap icon for camera reels fill. static IconData cameraReelsFill; /// Bootstrap icon for camera reels. static IconData cameraReels; /// Bootstrap icon for camera video fill. static IconData cameraVideoFill; /// Bootstrap icon for camera video off fill. static IconData cameraVideoOffFill; /// Bootstrap icon for camera video off. static IconData cameraVideoOff; /// Bootstrap icon for camera video. static IconData cameraVideo; /// Bootstrap icon for camera. static IconData camera; /// Bootstrap icon for camera2. static IconData camera2; /// Bootstrap icon for capslock fill. static IconData capslockFill; /// Bootstrap icon for capslock. static IconData capslock; /// Bootstrap icon for card checklist. static IconData cardChecklist; /// Bootstrap icon for card heading. static IconData cardHeading; /// Bootstrap icon for card image. static IconData cardImage; /// Bootstrap icon for card list. static IconData cardList; /// Bootstrap icon for card text. static IconData cardText; /// Bootstrap icon for caret down fill. static IconData caretDownFill; /// Bootstrap icon for caret down square fill. static IconData caretDownSquareFill; /// Bootstrap icon for caret down square. static IconData caretDownSquare; /// Bootstrap icon for caret down. static IconData caretDown; /// Bootstrap icon for caret left fill. static IconData caretLeftFill; /// Bootstrap icon for caret left square fill. static IconData caretLeftSquareFill; /// Bootstrap icon for caret left square. static IconData caretLeftSquare; /// Bootstrap icon for caret left. static IconData caretLeft; /// Bootstrap icon for caret right fill. static IconData caretRightFill; /// Bootstrap icon for caret right square fill. static IconData caretRightSquareFill; /// Bootstrap icon for caret right square. static IconData caretRightSquare; /// Bootstrap icon for caret right. static IconData caretRight; /// Bootstrap icon for caret up fill. static IconData caretUpFill; /// Bootstrap icon for caret up square fill. static IconData caretUpSquareFill; /// Bootstrap icon for caret up square. static IconData caretUpSquare; /// Bootstrap icon for caret up. static IconData caretUp; /// Bootstrap icon for cart check fill. static IconData cartCheckFill; /// Bootstrap icon for cart check. static IconData cartCheck; /// Bootstrap icon for cart dash fill. static IconData cartDashFill; /// Bootstrap icon for cart dash. static IconData cartDash; /// Bootstrap icon for cart fill. static IconData cartFill; /// Bootstrap icon for cart plus fill. static IconData cartPlusFill; /// Bootstrap icon for cart plus. static IconData cartPlus; /// Bootstrap icon for cart x fill. static IconData cartXFill; /// Bootstrap icon for cart x. static IconData cartX; /// Bootstrap icon for cart. static IconData cart; /// Bootstrap icon for cart2. static IconData cart2; /// Bootstrap icon for cart3. static IconData cart3; /// Bootstrap icon for cart4. static IconData cart4; /// Bootstrap icon for cash stack. static IconData cashStack; /// Bootstrap icon for cash. static IconData cash; /// Bootstrap icon for cast. static IconData cast; /// Bootstrap icon for chat dots fill. static IconData chatDotsFill; /// Bootstrap icon for chat dots. static IconData chatDots; /// Bootstrap icon for chat fill. static IconData chatFill; /// Bootstrap icon for chat left dots fill. static IconData chatLeftDotsFill; /// Bootstrap icon for chat left dots. static IconData chatLeftDots; /// Bootstrap icon for chat left fill. static IconData chatLeftFill; /// Bootstrap icon for chat left quote fill. static IconData chatLeftQuoteFill; /// Bootstrap icon for chat left quote. static IconData chatLeftQuote; /// Bootstrap icon for chat left text fill. static IconData chatLeftTextFill; /// Bootstrap icon for chat left text. static IconData chatLeftText; /// Bootstrap icon for chat left. static IconData chatLeft; /// Bootstrap icon for chat quote fill. static IconData chatQuoteFill; /// Bootstrap icon for chat quote. static IconData chatQuote; /// Bootstrap icon for chat right dots fill. static IconData chatRightDotsFill; /// Bootstrap icon for chat right dots. static IconData chatRightDots; /// Bootstrap icon for chat right fill. static IconData chatRightFill; /// Bootstrap icon for chat right quote fill. static IconData chatRightQuoteFill; /// Bootstrap icon for chat right quote. static IconData chatRightQuote; /// Bootstrap icon for chat right text fill. static IconData chatRightTextFill; /// Bootstrap icon for chat right text. static IconData chatRightText; /// Bootstrap icon for chat right. static IconData chatRight; /// Bootstrap icon for chat square dots fill. static IconData chatSquareDotsFill; /// Bootstrap icon for chat square dots. static IconData chatSquareDots; /// Bootstrap icon for chat square fill. static IconData chatSquareFill; /// Bootstrap icon for chat square quote fill. static IconData chatSquareQuoteFill; /// Bootstrap icon for chat square quote. static IconData chatSquareQuote; /// Bootstrap icon for chat square text fill. static IconData chatSquareTextFill; /// Bootstrap icon for chat square text. static IconData chatSquareText; /// Bootstrap icon for chat square. static IconData chatSquare; /// Bootstrap icon for chat text fill. static IconData chatTextFill; /// Bootstrap icon for chat text. static IconData chatText; /// Bootstrap icon for chat. static IconData chat; /// Bootstrap icon for check all. static IconData checkAll; /// Bootstrap icon for check circle fill. static IconData checkCircleFill; /// Bootstrap icon for check circle. static IconData checkCircle; /// Bootstrap icon for check square fill. static IconData checkSquareFill; /// Bootstrap icon for check square. static IconData checkSquare; /// Bootstrap icon for check. static IconData check; /// Bootstrap icon for check2 all. static IconData check2All; /// Bootstrap icon for check2 circle. static IconData check2Circle; /// Bootstrap icon for check2 square. static IconData check2Square; /// Bootstrap icon for check2. static IconData check2; /// Bootstrap icon for chevron bar contract. static IconData chevronBarContract; /// Bootstrap icon for chevron bar down. static IconData chevronBarDown; /// Bootstrap icon for chevron bar expand. static IconData chevronBarExpand; /// Bootstrap icon for chevron bar left. static IconData chevronBarLeft; /// Bootstrap icon for chevron bar right. static IconData chevronBarRight; /// Bootstrap icon for chevron bar up. static IconData chevronBarUp; /// Bootstrap icon for chevron compact down. static IconData chevronCompactDown; /// Bootstrap icon for chevron compact left. static IconData chevronCompactLeft; /// Bootstrap icon for chevron compact right. static IconData chevronCompactRight; /// Bootstrap icon for chevron compact up. static IconData chevronCompactUp; /// Bootstrap icon for chevron contract. static IconData chevronContract; /// Bootstrap icon for chevron double down. static IconData chevronDoubleDown; /// Bootstrap icon for chevron double left. static IconData chevronDoubleLeft; /// Bootstrap icon for chevron double right. static IconData chevronDoubleRight; /// Bootstrap icon for chevron double up. static IconData chevronDoubleUp; /// Bootstrap icon for chevron down. static IconData chevronDown; /// Bootstrap icon for chevron expand. static IconData chevronExpand; /// Bootstrap icon for chevron left. static IconData chevronLeft; /// Bootstrap icon for chevron right. static IconData chevronRight; /// Bootstrap icon for chevron up. static IconData chevronUp; /// Bootstrap icon for circle fill. static IconData circleFill; /// Bootstrap icon for circle half. static IconData circleHalf; /// Bootstrap icon for circle square. static IconData circleSquare; /// Bootstrap icon for circle. static IconData circle; /// Bootstrap icon for clipboard check. static IconData clipboardCheck; /// Bootstrap icon for clipboard data. static IconData clipboardData; /// Bootstrap icon for clipboard minus. static IconData clipboardMinus; /// Bootstrap icon for clipboard plus. static IconData clipboardPlus; /// Bootstrap icon for clipboard x. static IconData clipboardX; /// Bootstrap icon for clipboard. static IconData clipboard; /// Bootstrap icon for clock fill. static IconData clockFill; /// Bootstrap icon for clock history. static IconData clockHistory; /// Bootstrap icon for clock. static IconData clock; /// Bootstrap icon for cloud arrow down fill. static IconData cloudArrowDownFill; /// Bootstrap icon for cloud arrow down. static IconData cloudArrowDown; /// Bootstrap icon for cloud arrow up fill. static IconData cloudArrowUpFill; /// Bootstrap icon for cloud arrow up. static IconData cloudArrowUp; /// Bootstrap icon for cloud check fill. static IconData cloudCheckFill; /// Bootstrap icon for cloud check. static IconData cloudCheck; /// Bootstrap icon for cloud download fill. static IconData cloudDownloadFill; /// Bootstrap icon for cloud download. static IconData cloudDownload; /// Bootstrap icon for cloud drizzle fill. static IconData cloudDrizzleFill; /// Bootstrap icon for cloud drizzle. static IconData cloudDrizzle; /// Bootstrap icon for cloud fill. static IconData cloudFill; /// Bootstrap icon for cloud fog fill. static IconData cloudFogFill; /// Bootstrap icon for cloud fog. static IconData cloudFog; /// Bootstrap icon for cloud fog2 fill. static IconData cloudFog2Fill; /// Bootstrap icon for cloud fog2. static IconData cloudFog2; /// Bootstrap icon for cloud hail fill. static IconData cloudHailFill; /// Bootstrap icon for cloud hail. static IconData cloudHail; /// Bootstrap icon for cloud haze fill. static IconData cloudHazeFill; /// Bootstrap icon for cloud haze. static IconData cloudHaze; /// Bootstrap icon for cloud haze2 fill. static IconData cloudHaze2Fill; /// Bootstrap icon for cloud lightning fill. static IconData cloudLightningFill; /// Bootstrap icon for cloud lightning rain fill. static IconData cloudLightningRainFill; /// Bootstrap icon for cloud lightning rain. static IconData cloudLightningRain; /// Bootstrap icon for cloud lightning. static IconData cloudLightning; /// Bootstrap icon for cloud minus fill. static IconData cloudMinusFill; /// Bootstrap icon for cloud minus. static IconData cloudMinus; /// Bootstrap icon for cloud moon fill. static IconData cloudMoonFill; /// Bootstrap icon for cloud moon. static IconData cloudMoon; /// Bootstrap icon for cloud plus fill. static IconData cloudPlusFill; /// Bootstrap icon for cloud plus. static IconData cloudPlus; /// Bootstrap icon for cloud rain fill. static IconData cloudRainFill; /// Bootstrap icon for cloud rain heavy fill. static IconData cloudRainHeavyFill; /// Bootstrap icon for cloud rain heavy. static IconData cloudRainHeavy; /// Bootstrap icon for cloud rain. static IconData cloudRain; /// Bootstrap icon for cloud slash fill. static IconData cloudSlashFill; /// Bootstrap icon for cloud slash. static IconData cloudSlash; /// Bootstrap icon for cloud sleet fill. static IconData cloudSleetFill; /// Bootstrap icon for cloud sleet. static IconData cloudSleet; /// Bootstrap icon for cloud snow fill. static IconData cloudSnowFill; /// Bootstrap icon for cloud snow. static IconData cloudSnow; /// Bootstrap icon for cloud sun fill. static IconData cloudSunFill; /// Bootstrap icon for cloud sun. static IconData cloudSun; /// Bootstrap icon for cloud upload fill. static IconData cloudUploadFill; /// Bootstrap icon for cloud upload. static IconData cloudUpload; /// Bootstrap icon for cloud. static IconData cloud; /// Bootstrap icon for clouds fill. static IconData cloudsFill; /// Bootstrap icon for clouds. static IconData clouds; /// Bootstrap icon for cloudy fill. static IconData cloudyFill; /// Bootstrap icon for cloudy. static IconData cloudy; /// Bootstrap icon for code slash. static IconData codeSlash; /// Bootstrap icon for code square. static IconData codeSquare; /// Bootstrap icon for code. static IconData code; /// Bootstrap icon for collection fill. static IconData collectionFill; /// Bootstrap icon for collection play fill. static IconData collectionPlayFill; /// Bootstrap icon for collection play. static IconData collectionPlay; /// Bootstrap icon for collection. static IconData collection; /// Bootstrap icon for columns gap. static IconData columnsGap; /// Bootstrap icon for columns. static IconData columns; /// Bootstrap icon for command. static IconData command; /// Bootstrap icon for compass fill. static IconData compassFill; /// Bootstrap icon for compass. static IconData compass; /// Bootstrap icon for cone striped. static IconData coneStriped; /// Bootstrap icon for cone. static IconData cone; /// Bootstrap icon for controller. static IconData controller; /// Bootstrap icon for cpu fill. static IconData cpuFill; /// Bootstrap icon for cpu. static IconData cpu; /// Bootstrap icon for credit card2 back fill. static IconData creditCard2BackFill; /// Bootstrap icon for credit card2 back. static IconData creditCard2Back; /// Bootstrap icon for credit card2 front fill. static IconData creditCard2FrontFill; /// Bootstrap icon for credit card2 front. static IconData creditCard2Front; /// Bootstrap icon for credit card fill. static IconData creditCardFill; /// Bootstrap icon for credit card. static IconData creditCard; /// Bootstrap icon for crop. static IconData crop; /// Bootstrap icon for cup fill. static IconData cupFill; /// Bootstrap icon for cup straw. static IconData cupStraw; /// Bootstrap icon for cup. static IconData cup; /// Bootstrap icon for cursor fill. static IconData cursorFill; /// Bootstrap icon for cursor text. static IconData cursorText; /// Bootstrap icon for cursor. static IconData cursor; /// Bootstrap icon for dash circle dotted. static IconData dashCircleDotted; /// Bootstrap icon for dash circle fill. static IconData dashCircleFill; /// Bootstrap icon for dash circle. static IconData dashCircle; /// Bootstrap icon for dash square dotted. static IconData dashSquareDotted; /// Bootstrap icon for dash square fill. static IconData dashSquareFill; /// Bootstrap icon for dash square. static IconData dashSquare; /// Bootstrap icon for dash. static IconData dash; /// Bootstrap icon for diagram2 fill. static IconData diagram2Fill; /// Bootstrap icon for diagram2. static IconData diagram2; /// Bootstrap icon for diagram3 fill. static IconData diagram3Fill; /// Bootstrap icon for diagram3. static IconData diagram3; /// Bootstrap icon for diamond fill. static IconData diamondFill; /// Bootstrap icon for diamond half. static IconData diamondHalf; /// Bootstrap icon for diamond. static IconData diamond; /// Bootstrap icon for dice1 fill. static IconData dice1Fill; /// Bootstrap icon for dice1. static IconData dice1; /// Bootstrap icon for dice2 fill. static IconData dice2Fill; /// Bootstrap icon for dice2. static IconData dice2; /// Bootstrap icon for dice3 fill. static IconData dice3Fill; /// Bootstrap icon for dice3. static IconData dice3; /// Bootstrap icon for dice4 fill. static IconData dice4Fill; /// Bootstrap icon for dice4. static IconData dice4; /// Bootstrap icon for dice5 fill. static IconData dice5Fill; /// Bootstrap icon for dice5. static IconData dice5; /// Bootstrap icon for dice6 fill. static IconData dice6Fill; /// Bootstrap icon for dice6. static IconData dice6; /// Bootstrap icon for disc fill. static IconData discFill; /// Bootstrap icon for disc. static IconData disc; /// Bootstrap icon for discord. static IconData discord; /// Bootstrap icon for display fill. static IconData displayFill; /// Bootstrap icon for display. static IconData display; /// Bootstrap icon for distribute horizontal. static IconData distributeHorizontal; /// Bootstrap icon for distribute vertical. static IconData distributeVertical; /// Bootstrap icon for door closed fill. static IconData doorClosedFill; /// Bootstrap icon for door closed. static IconData doorClosed; /// Bootstrap icon for door open fill. static IconData doorOpenFill; /// Bootstrap icon for door open. static IconData doorOpen; /// Bootstrap icon for dot. static IconData dot; /// Bootstrap icon for download. static IconData download; /// Bootstrap icon for droplet fill. static IconData dropletFill; /// Bootstrap icon for droplet half. static IconData dropletHalf; /// Bootstrap icon for droplet. static IconData droplet; /// Bootstrap icon for earbuds. static IconData earbuds; /// Bootstrap icon for easel fill. static IconData easelFill; /// Bootstrap icon for easel. static IconData easel; /// Bootstrap icon for egg fill. static IconData eggFill; /// Bootstrap icon for egg fried. static IconData eggFried; /// Bootstrap icon for egg. static IconData egg; /// Bootstrap icon for eject fill. static IconData ejectFill; /// Bootstrap icon for eject. static IconData eject; /// Bootstrap icon for emoji angry fill. static IconData emojiAngryFill; /// Bootstrap icon for emoji angry. static IconData emojiAngry; /// Bootstrap icon for emoji dizzy fill. static IconData emojiDizzyFill; /// Bootstrap icon for emoji dizzy. static IconData emojiDizzy; /// Bootstrap icon for emoji expressionless fill. static IconData emojiExpressionlessFill; /// Bootstrap icon for emoji expressionless. static IconData emojiExpressionless; /// Bootstrap icon for emoji frown fill. static IconData emojiFrownFill; /// Bootstrap icon for emoji frown. static IconData emojiFrown; /// Bootstrap icon for emoji heart eyes fill. static IconData emojiHeartEyesFill; /// Bootstrap icon for emoji heart eyes. static IconData emojiHeartEyes; /// Bootstrap icon for emoji laughing fill. static IconData emojiLaughingFill; /// Bootstrap icon for emoji laughing. static IconData emojiLaughing; /// Bootstrap icon for emoji neutral fill. static IconData emojiNeutralFill; /// Bootstrap icon for emoji neutral. static IconData emojiNeutral; /// Bootstrap icon for emoji smile fill. static IconData emojiSmileFill; /// Bootstrap icon for emoji smile upside down fill. static IconData emojiSmileUpsideDownFill; /// Bootstrap icon for emoji smile upside down. static IconData emojiSmileUpsideDown; /// Bootstrap icon for emoji smile. static IconData emojiSmile; /// Bootstrap icon for emoji sunglasses fill. static IconData emojiSunglassesFill; /// Bootstrap icon for emoji sunglasses. static IconData emojiSunglasses; /// Bootstrap icon for emoji wink fill. static IconData emojiWinkFill; /// Bootstrap icon for emoji wink. static IconData emojiWink; /// Bootstrap icon for envelope fill. static IconData envelopeFill; /// Bootstrap icon for envelope open fill. static IconData envelopeOpenFill; /// Bootstrap icon for envelope open. static IconData envelopeOpen; /// Bootstrap icon for envelope. static IconData envelope; /// Bootstrap icon for eraser fill. static IconData eraserFill; /// Bootstrap icon for eraser. static IconData eraser; /// Bootstrap icon for exclamation circle fill. static IconData exclamationCircleFill; /// Bootstrap icon for exclamation circle. static IconData exclamationCircle; /// Bootstrap icon for exclamation diamond fill. static IconData exclamationDiamondFill; /// Bootstrap icon for exclamation diamond. static IconData exclamationDiamond; /// Bootstrap icon for exclamation octagon fill. static IconData exclamationOctagonFill; /// Bootstrap icon for exclamation octagon. static IconData exclamationOctagon; /// Bootstrap icon for exclamation square fill. static IconData exclamationSquareFill; /// Bootstrap icon for exclamation square. static IconData exclamationSquare; /// Bootstrap icon for exclamation triangle fill. static IconData exclamationTriangleFill; /// Bootstrap icon for exclamation triangle. static IconData exclamationTriangle; /// Bootstrap icon for exclamation. static IconData exclamation; /// Bootstrap icon for exclude. static IconData exclude; /// Bootstrap icon for eye fill. static IconData eyeFill; /// Bootstrap icon for eye slash fill. static IconData eyeSlashFill; /// Bootstrap icon for eye slash. static IconData eyeSlash; /// Bootstrap icon for eye. static IconData eye; /// Bootstrap icon for eyedropper. static IconData eyedropper; /// Bootstrap icon for eyeglasses. static IconData eyeglasses; /// Bootstrap icon for facebook. static IconData facebook; /// Bootstrap icon for file arrow down fill. static IconData fileArrowDownFill; /// Bootstrap icon for file arrow down. static IconData fileArrowDown; /// Bootstrap icon for file arrow up fill. static IconData fileArrowUpFill; /// Bootstrap icon for file arrow up. static IconData fileArrowUp; /// Bootstrap icon for file bar graph fill. static IconData fileBarGraphFill; /// Bootstrap icon for file bar graph. static IconData fileBarGraph; /// Bootstrap icon for file binary fill. static IconData fileBinaryFill; /// Bootstrap icon for file binary. static IconData fileBinary; /// Bootstrap icon for file break fill. static IconData fileBreakFill; /// Bootstrap icon for file break. static IconData fileBreak; /// Bootstrap icon for file check fill. static IconData fileCheckFill; /// Bootstrap icon for file check. static IconData fileCheck; /// Bootstrap icon for file code fill. static IconData fileCodeFill; /// Bootstrap icon for file code. static IconData fileCode; /// Bootstrap icon for file diff fill. static IconData fileDiffFill; /// Bootstrap icon for file diff. static IconData fileDiff; /// Bootstrap icon for file earmark arrow down fill. static IconData fileEarmarkArrowDownFill; /// Bootstrap icon for file earmark arrow down. static IconData fileEarmarkArrowDown; /// Bootstrap icon for file earmark arrow up fill. static IconData fileEarmarkArrowUpFill; /// Bootstrap icon for file earmark arrow up. static IconData fileEarmarkArrowUp; /// Bootstrap icon for file earmark bar graph fill. static IconData fileEarmarkBarGraphFill; /// Bootstrap icon for file earmark bar graph. static IconData fileEarmarkBarGraph; /// Bootstrap icon for file earmark binary fill. static IconData fileEarmarkBinaryFill; /// Bootstrap icon for file earmark binary. static IconData fileEarmarkBinary; /// Bootstrap icon for file earmark break fill. static IconData fileEarmarkBreakFill; /// Bootstrap icon for file earmark break. static IconData fileEarmarkBreak; /// Bootstrap icon for file earmark check fill. static IconData fileEarmarkCheckFill; /// Bootstrap icon for file earmark check. static IconData fileEarmarkCheck; /// Bootstrap icon for file earmark code fill. static IconData fileEarmarkCodeFill; /// Bootstrap icon for file earmark code. static IconData fileEarmarkCode; /// Bootstrap icon for file earmark diff fill. static IconData fileEarmarkDiffFill; /// Bootstrap icon for file earmark diff. static IconData fileEarmarkDiff; /// Bootstrap icon for file earmark easel fill. static IconData fileEarmarkEaselFill; /// Bootstrap icon for file earmark easel. static IconData fileEarmarkEasel; /// Bootstrap icon for file earmark excel fill. static IconData fileEarmarkExcelFill; /// Bootstrap icon for file earmark excel. static IconData fileEarmarkExcel; /// Bootstrap icon for file earmark fill. static IconData fileEarmarkFill; /// Bootstrap icon for file earmark font fill. static IconData fileEarmarkFontFill; /// Bootstrap icon for file earmark font. static IconData fileEarmarkFont; /// Bootstrap icon for file earmark image fill. static IconData fileEarmarkImageFill; /// Bootstrap icon for file earmark image. static IconData fileEarmarkImage; /// Bootstrap icon for file earmark lock fill. static IconData fileEarmarkLockFill; /// Bootstrap icon for file earmark lock. static IconData fileEarmarkLock; /// Bootstrap icon for file earmark lock2 fill. static IconData fileEarmarkLock2Fill; /// Bootstrap icon for file earmark lock2. static IconData fileEarmarkLock2; /// Bootstrap icon for file earmark medical fill. static IconData fileEarmarkMedicalFill; /// Bootstrap icon for file earmark medical. static IconData fileEarmarkMedical; /// Bootstrap icon for file earmark minus fill. static IconData fileEarmarkMinusFill; /// Bootstrap icon for file earmark minus. static IconData fileEarmarkMinus; /// Bootstrap icon for file earmark music fill. static IconData fileEarmarkMusicFill; /// Bootstrap icon for file earmark music. static IconData fileEarmarkMusic; /// Bootstrap icon for file earmark person fill. static IconData fileEarmarkPersonFill; /// Bootstrap icon for file earmark person. static IconData fileEarmarkPerson; /// Bootstrap icon for file earmark play fill. static IconData fileEarmarkPlayFill; /// Bootstrap icon for file earmark play. static IconData fileEarmarkPlay; /// Bootstrap icon for file earmark plus fill. static IconData fileEarmarkPlusFill; /// Bootstrap icon for file earmark plus. static IconData fileEarmarkPlus; /// Bootstrap icon for file earmark post fill. static IconData fileEarmarkPostFill; /// Bootstrap icon for file earmark post. static IconData fileEarmarkPost; /// Bootstrap icon for file earmark ppt fill. static IconData fileEarmarkPptFill; /// Bootstrap icon for file earmark ppt. static IconData fileEarmarkPpt; /// Bootstrap icon for file earmark richtext fill. static IconData fileEarmarkRichtextFill; /// Bootstrap icon for file earmark richtext. static IconData fileEarmarkRichtext; /// Bootstrap icon for file earmark ruled fill. static IconData fileEarmarkRuledFill; /// Bootstrap icon for file earmark ruled. static IconData fileEarmarkRuled; /// Bootstrap icon for file earmark slides fill. static IconData fileEarmarkSlidesFill; /// Bootstrap icon for file earmark slides. static IconData fileEarmarkSlides; /// Bootstrap icon for file earmark spreadsheet fill. static IconData fileEarmarkSpreadsheetFill; /// Bootstrap icon for file earmark spreadsheet. static IconData fileEarmarkSpreadsheet; /// Bootstrap icon for file earmark text fill. static IconData fileEarmarkTextFill; /// Bootstrap icon for file earmark text. static IconData fileEarmarkText; /// Bootstrap icon for file earmark word fill. static IconData fileEarmarkWordFill; /// Bootstrap icon for file earmark word. static IconData fileEarmarkWord; /// Bootstrap icon for file earmark x fill. static IconData fileEarmarkXFill; /// Bootstrap icon for file earmark x. static IconData fileEarmarkX; /// Bootstrap icon for file earmark zip fill. static IconData fileEarmarkZipFill; /// Bootstrap icon for file earmark zip. static IconData fileEarmarkZip; /// Bootstrap icon for file earmark. static IconData fileEarmark; /// Bootstrap icon for file easel fill. static IconData fileEaselFill; /// Bootstrap icon for file easel. static IconData fileEasel; /// Bootstrap icon for file excel fill. static IconData fileExcelFill; /// Bootstrap icon for file excel. static IconData fileExcel; /// Bootstrap icon for file fill. static IconData fileFill; /// Bootstrap icon for file font fill. static IconData fileFontFill; /// Bootstrap icon for file font. static IconData fileFont; /// Bootstrap icon for file image fill. static IconData fileImageFill; /// Bootstrap icon for file image. static IconData fileImage; /// Bootstrap icon for file lock fill. static IconData fileLockFill; /// Bootstrap icon for file lock. static IconData fileLock; /// Bootstrap icon for file lock2 fill. static IconData fileLock2Fill; /// Bootstrap icon for file lock2. static IconData fileLock2; /// Bootstrap icon for file medical fill. static IconData fileMedicalFill; /// Bootstrap icon for file medical. static IconData fileMedical; /// Bootstrap icon for file minus fill. static IconData fileMinusFill; /// Bootstrap icon for file minus. static IconData fileMinus; /// Bootstrap icon for file music fill. static IconData fileMusicFill; /// Bootstrap icon for file music. static IconData fileMusic; /// Bootstrap icon for file person fill. static IconData filePersonFill; /// Bootstrap icon for file person. static IconData filePerson; /// Bootstrap icon for file play fill. static IconData filePlayFill; /// Bootstrap icon for file play. static IconData filePlay; /// Bootstrap icon for file plus fill. static IconData filePlusFill; /// Bootstrap icon for file plus. static IconData filePlus; /// Bootstrap icon for file post fill. static IconData filePostFill; /// Bootstrap icon for file post. static IconData filePost; /// Bootstrap icon for file ppt fill. static IconData filePptFill; /// Bootstrap icon for file ppt. static IconData filePpt; /// Bootstrap icon for file richtext fill. static IconData fileRichtextFill; /// Bootstrap icon for file richtext. static IconData fileRichtext; /// Bootstrap icon for file ruled fill. static IconData fileRuledFill; /// Bootstrap icon for file ruled. static IconData fileRuled; /// Bootstrap icon for file slides fill. static IconData fileSlidesFill; /// Bootstrap icon for file slides. static IconData fileSlides; /// Bootstrap icon for file spreadsheet fill. static IconData fileSpreadsheetFill; /// Bootstrap icon for file spreadsheet. static IconData fileSpreadsheet; /// Bootstrap icon for file text fill. static IconData fileTextFill; /// Bootstrap icon for file text. static IconData fileText; /// Bootstrap icon for file word fill. static IconData fileWordFill; /// Bootstrap icon for file word. static IconData fileWord; /// Bootstrap icon for file x fill. static IconData fileXFill; /// Bootstrap icon for file x. static IconData fileX; /// Bootstrap icon for file zip fill. static IconData fileZipFill; /// Bootstrap icon for file zip. static IconData fileZip; /// Bootstrap icon for file. static IconData file; /// Bootstrap icon for files alt. static IconData filesAlt; /// Bootstrap icon for files. static IconData files; /// Bootstrap icon for film. static IconData film; /// Bootstrap icon for filter circle fill. static IconData filterCircleFill; /// Bootstrap icon for filter circle. static IconData filterCircle; /// Bootstrap icon for filter left. static IconData filterLeft; /// Bootstrap icon for filter right. static IconData filterRight; /// Bootstrap icon for filter square fill. static IconData filterSquareFill; /// Bootstrap icon for filter square. static IconData filterSquare; /// Bootstrap icon for filter. static IconData filter; /// Bootstrap icon for flag fill. static IconData flagFill; /// Bootstrap icon for flag. static IconData flag; /// Bootstrap icon for flower1. static IconData flower1; /// Bootstrap icon for flower2. static IconData flower2; /// Bootstrap icon for flower3. static IconData flower3; /// Bootstrap icon for folder check. static IconData folderCheck; /// Bootstrap icon for folder fill. static IconData folderFill; /// Bootstrap icon for folder minus. static IconData folderMinus; /// Bootstrap icon for folder plus. static IconData folderPlus; /// Bootstrap icon for folder symlink fill. static IconData folderSymlinkFill; /// Bootstrap icon for folder symlink. static IconData folderSymlink; /// Bootstrap icon for folder x. static IconData folderX; /// Bootstrap icon for folder. static IconData folder; /// Bootstrap icon for folder2 open. static IconData folder2Open; /// Bootstrap icon for folder2. static IconData folder2; /// Bootstrap icon for fonts. static IconData fonts; /// Bootstrap icon for forward fill. static IconData forwardFill; /// Bootstrap icon for forward. static IconData forward; /// Bootstrap icon for front. static IconData front; /// Bootstrap icon for fullscreen exit. static IconData fullscreenExit; /// Bootstrap icon for fullscreen. static IconData fullscreen; /// Bootstrap icon for funnel fill. static IconData funnelFill; /// Bootstrap icon for funnel. static IconData funnel; /// Bootstrap icon for gear fill. static IconData gearFill; /// Bootstrap icon for gear wide connected. static IconData gearWideConnected; /// Bootstrap icon for gear wide. static IconData gearWide; /// Bootstrap icon for gear. static IconData gear; /// Bootstrap icon for gem. static IconData gem; /// Bootstrap icon for geo alt fill. static IconData geoAltFill; /// Bootstrap icon for geo alt. static IconData geoAlt; /// Bootstrap icon for geo fill. static IconData geoFill; /// Bootstrap icon for geo. static IconData geo; /// Bootstrap icon for gift fill. static IconData giftFill; /// Bootstrap icon for gift. static IconData gift; /// Bootstrap icon for github. static IconData github; /// Bootstrap icon for globe. static IconData globe; /// Bootstrap icon for globe2. static IconData globe2; /// Bootstrap icon for google. static IconData google; /// Bootstrap icon for graph down. static IconData graphDown; /// Bootstrap icon for graph up. static IconData graphUp; /// Bootstrap icon for grid1x2 fill. static IconData grid1x2Fill; /// Bootstrap icon for grid1x2. static IconData grid1x2; /// Bootstrap icon for grid3x2 gap fill. static IconData grid3x2GapFill; /// Bootstrap icon for grid3x2 gap. static IconData grid3x2Gap; /// Bootstrap icon for grid3x2. static IconData grid3x2; /// Bootstrap icon for grid3x3 gap fill. static IconData grid3x3GapFill; /// Bootstrap icon for grid3x3 gap. static IconData grid3x3Gap; /// Bootstrap icon for grid3x3. static IconData grid3x3; /// Bootstrap icon for grid fill. static IconData gridFill; /// Bootstrap icon for grid. static IconData grid; /// Bootstrap icon for grip horizontal. static IconData gripHorizontal; /// Bootstrap icon for grip vertical. static IconData gripVertical; /// Bootstrap icon for hammer. static IconData hammer; /// Bootstrap icon for hand index fill. static IconData handIndexFill; /// Bootstrap icon for hand index thumb fill. static IconData handIndexThumbFill; /// Bootstrap icon for hand index thumb. static IconData handIndexThumb; /// Bootstrap icon for hand index. static IconData handIndex; /// Bootstrap icon for hand thumbs down fill. static IconData handThumbsDownFill; /// Bootstrap icon for hand thumbs down. static IconData handThumbsDown; /// Bootstrap icon for hand thumbs up fill. static IconData handThumbsUpFill; /// Bootstrap icon for hand thumbs up. static IconData handThumbsUp; /// Bootstrap icon for handbag fill. static IconData handbagFill; /// Bootstrap icon for handbag. static IconData handbag; /// Bootstrap icon for hash. static IconData hash; /// Bootstrap icon for hdd fill. static IconData hddFill; /// Bootstrap icon for hdd network fill. static IconData hddNetworkFill; /// Bootstrap icon for hdd network. static IconData hddNetwork; /// Bootstrap icon for hdd rack fill. static IconData hddRackFill; /// Bootstrap icon for hdd rack. static IconData hddRack; /// Bootstrap icon for hdd stack fill. static IconData hddStackFill; /// Bootstrap icon for hdd stack. static IconData hddStack; /// Bootstrap icon for hdd. static IconData hdd; /// Bootstrap icon for headphones. static IconData headphones; /// Bootstrap icon for headset. static IconData headset; /// Bootstrap icon for heart fill. static IconData heartFill; /// Bootstrap icon for heart half. static IconData heartHalf; /// Bootstrap icon for heart. static IconData heart; /// Bootstrap icon for heptagon fill. static IconData heptagonFill; /// Bootstrap icon for heptagon half. static IconData heptagonHalf; /// Bootstrap icon for heptagon. static IconData heptagon; /// Bootstrap icon for hexagon fill. static IconData hexagonFill; /// Bootstrap icon for hexagon half. static IconData hexagonHalf; /// Bootstrap icon for hexagon. static IconData hexagon; /// Bootstrap icon for hourglass bottom. static IconData hourglassBottom; /// Bootstrap icon for hourglass split. static IconData hourglassSplit; /// Bootstrap icon for hourglass top. static IconData hourglassTop; /// Bootstrap icon for hourglass. static IconData hourglass; /// Bootstrap icon for house door fill. static IconData houseDoorFill; /// Bootstrap icon for house door. static IconData houseDoor; /// Bootstrap icon for house fill. static IconData houseFill; /// Bootstrap icon for house. static IconData house; /// Bootstrap icon for hr. static IconData hr; /// Bootstrap icon for hurricane. static IconData hurricane; /// Bootstrap icon for image alt. static IconData imageAlt; /// Bootstrap icon for image fill. static IconData imageFill; /// Bootstrap icon for image. static IconData image; /// Bootstrap icon for images. static IconData images; /// Bootstrap icon for inbox fill. static IconData inboxFill; /// Bootstrap icon for inbox. static IconData inbox; /// Bootstrap icon for inboxes fill. static IconData inboxesFill; /// Bootstrap icon for inboxes. static IconData inboxes; /// Bootstrap icon for info circle fill. static IconData infoCircleFill; /// Bootstrap icon for info circle. static IconData infoCircle; /// Bootstrap icon for info square fill. static IconData infoSquareFill; /// Bootstrap icon for info square. static IconData infoSquare; /// Bootstrap icon for info. static IconData info; /// Bootstrap icon for input cursor text. static IconData inputCursorText; /// Bootstrap icon for input cursor. static IconData inputCursor; /// Bootstrap icon for instagram. static IconData instagram; /// Bootstrap icon for intersect. static IconData intersect; /// Bootstrap icon for journal album. static IconData journalAlbum; /// Bootstrap icon for journal arrow down. static IconData journalArrowDown; /// Bootstrap icon for journal arrow up. static IconData journalArrowUp; /// Bootstrap icon for journal bookmark fill. static IconData journalBookmarkFill; /// Bootstrap icon for journal bookmark. static IconData journalBookmark; /// Bootstrap icon for journal check. static IconData journalCheck; /// Bootstrap icon for journal code. static IconData journalCode; /// Bootstrap icon for journal medical. static IconData journalMedical; /// Bootstrap icon for journal minus. static IconData journalMinus; /// Bootstrap icon for journal plus. static IconData journalPlus; /// Bootstrap icon for journal richtext. static IconData journalRichtext; /// Bootstrap icon for journal text. static IconData journalText; /// Bootstrap icon for journal x. static IconData journalX; /// Bootstrap icon for journal. static IconData journal; /// Bootstrap icon for journals. static IconData journals; /// Bootstrap icon for joystick. static IconData joystick; /// Bootstrap icon for justify left. static IconData justifyLeft; /// Bootstrap icon for justify right. static IconData justifyRight; /// Bootstrap icon for justify. static IconData justify; /// Bootstrap icon for kanban fill. static IconData kanbanFill; /// Bootstrap icon for kanban. static IconData kanban; /// Bootstrap icon for key fill. static IconData keyFill; /// Bootstrap icon for key. static IconData key; /// Bootstrap icon for keyboard fill. static IconData keyboardFill; /// Bootstrap icon for keyboard. static IconData keyboard; /// Bootstrap icon for ladder. static IconData ladder; /// Bootstrap icon for lamp fill. static IconData lampFill; /// Bootstrap icon for lamp. static IconData lamp; /// Bootstrap icon for laptop fill. static IconData laptopFill; /// Bootstrap icon for laptop. static IconData laptop; /// Bootstrap icon for layer backward. static IconData layerBackward; /// Bootstrap icon for layer forward. static IconData layerForward; /// Bootstrap icon for layers fill. static IconData layersFill; /// Bootstrap icon for layers half. static IconData layersHalf; /// Bootstrap icon for layers. static IconData layers; /// Bootstrap icon for layout sidebar inset reverse. static IconData layoutSidebarInsetReverse; /// Bootstrap icon for layout sidebar inset. static IconData layoutSidebarInset; /// Bootstrap icon for layout sidebar reverse. static IconData layoutSidebarReverse; /// Bootstrap icon for layout sidebar. static IconData layoutSidebar; /// Bootstrap icon for layout split. static IconData layoutSplit; /// Bootstrap icon for layout text sidebar reverse. static IconData layoutTextSidebarReverse; /// Bootstrap icon for layout text sidebar. static IconData layoutTextSidebar; /// Bootstrap icon for layout text window reverse. static IconData layoutTextWindowReverse; /// Bootstrap icon for layout text window. static IconData layoutTextWindow; /// Bootstrap icon for layout three columns. static IconData layoutThreeColumns; /// Bootstrap icon for layout wtf. static IconData layoutWtf; /// Bootstrap icon for life preserver. static IconData lifePreserver; /// Bootstrap icon for lightbulb fill. static IconData lightbulbFill; /// Bootstrap icon for lightbulb off fill. static IconData lightbulbOffFill; /// Bootstrap icon for lightbulb off. static IconData lightbulbOff; /// Bootstrap icon for lightbulb. static IconData lightbulb; /// Bootstrap icon for lightning charge fill. static IconData lightningChargeFill; /// Bootstrap icon for lightning charge. static IconData lightningCharge; /// Bootstrap icon for lightning fill. static IconData lightningFill; /// Bootstrap icon for lightning. static IconData lightning; /// Bootstrap icon for link45deg. static IconData link45deg; /// Bootstrap icon for link. static IconData link; /// Bootstrap icon for linkedin. static IconData linkedin; /// Bootstrap icon for list check. static IconData listCheck; /// Bootstrap icon for list nested. static IconData listNested; /// Bootstrap icon for list ol. static IconData listOl; /// Bootstrap icon for list stars. static IconData listStars; /// Bootstrap icon for list task. static IconData listTask; /// Bootstrap icon for list ul. static IconData listUl; /// Bootstrap icon for list. static IconData list; /// Bootstrap icon for lock fill. static IconData lockFill; /// Bootstrap icon for lock. static IconData lock; /// Bootstrap icon for mailbox. static IconData mailbox; /// Bootstrap icon for mailbox2. static IconData mailbox2; /// Bootstrap icon for map fill. static IconData mapFill; /// Bootstrap icon for map. static IconData map; /// Bootstrap icon for markdown fill. static IconData markdownFill; /// Bootstrap icon for markdown. static IconData markdown; /// Bootstrap icon for mask. static IconData mask; /// Bootstrap icon for megaphone fill. static IconData megaphoneFill; /// Bootstrap icon for megaphone. static IconData megaphone; /// Bootstrap icon for menu app fill. static IconData menuAppFill; /// Bootstrap icon for menu app. static IconData menuApp; /// Bootstrap icon for menu button fill. static IconData menuButtonFill; /// Bootstrap icon for menu button wide fill. static IconData menuButtonWideFill; /// Bootstrap icon for menu button wide. static IconData menuButtonWide; /// Bootstrap icon for menu button. static IconData menuButton; /// Bootstrap icon for menu down. static IconData menuDown; /// Bootstrap icon for menu up. static IconData menuUp; /// Bootstrap icon for mic fill. static IconData micFill; /// Bootstrap icon for mic mute fill. static IconData micMuteFill; /// Bootstrap icon for mic mute. static IconData micMute; /// Bootstrap icon for mic. static IconData mic; /// Bootstrap icon for minecart loaded. static IconData minecartLoaded; /// Bootstrap icon for minecart. static IconData minecart; /// Bootstrap icon for moisture. static IconData moisture; /// Bootstrap icon for moon fill. static IconData moonFill; /// Bootstrap icon for moon stars fill. static IconData moonStarsFill; /// Bootstrap icon for moon stars. static IconData moonStars; /// Bootstrap icon for moon. static IconData moon; /// Bootstrap icon for mouse fill. static IconData mouseFill; /// Bootstrap icon for mouse. static IconData mouse; /// Bootstrap icon for mouse2 fill. static IconData mouse2Fill; /// Bootstrap icon for mouse2. static IconData mouse2; /// Bootstrap icon for mouse3 fill. static IconData mouse3Fill; /// Bootstrap icon for mouse3. static IconData mouse3; /// Bootstrap icon for music note beamed. static IconData musicNoteBeamed; /// Bootstrap icon for music note list. static IconData musicNoteList; /// Bootstrap icon for music note. static IconData musicNote; /// Bootstrap icon for music player fill. static IconData musicPlayerFill; /// Bootstrap icon for music player. static IconData musicPlayer; /// Bootstrap icon for newspaper. static IconData newspaper; /// Bootstrap icon for node minus fill. static IconData nodeMinusFill; /// Bootstrap icon for node minus. static IconData nodeMinus; /// Bootstrap icon for node plus fill. static IconData nodePlusFill; /// Bootstrap icon for node plus. static IconData nodePlus; /// Bootstrap icon for nut fill. static IconData nutFill; /// Bootstrap icon for nut. static IconData nut; /// Bootstrap icon for octagon fill. static IconData octagonFill; /// Bootstrap icon for octagon half. static IconData octagonHalf; /// Bootstrap icon for octagon. static IconData octagon; /// Bootstrap icon for option. static IconData option; /// Bootstrap icon for outlet. static IconData outlet; /// Bootstrap icon for paint bucket. static IconData paintBucket; /// Bootstrap icon for palette fill. static IconData paletteFill; /// Bootstrap icon for palette. static IconData palette; /// Bootstrap icon for palette2. static IconData palette2; /// Bootstrap icon for paperclip. static IconData paperclip; /// Bootstrap icon for paragraph. static IconData paragraph; /// Bootstrap icon for patch check fill. static IconData patchCheckFill; /// Bootstrap icon for patch check. static IconData patchCheck; /// Bootstrap icon for patch exclamation fill. static IconData patchExclamationFill; /// Bootstrap icon for patch exclamation. static IconData patchExclamation; /// Bootstrap icon for patch minus fill. static IconData patchMinusFill; /// Bootstrap icon for patch minus. static IconData patchMinus; /// Bootstrap icon for patch plus fill. static IconData patchPlusFill; /// Bootstrap icon for patch plus. static IconData patchPlus; /// Bootstrap icon for patch question fill. static IconData patchQuestionFill; /// Bootstrap icon for patch question. static IconData patchQuestion; /// Bootstrap icon for pause btn fill. static IconData pauseBtnFill; /// Bootstrap icon for pause btn. static IconData pauseBtn; /// Bootstrap icon for pause circle fill. static IconData pauseCircleFill; /// Bootstrap icon for pause circle. static IconData pauseCircle; /// Bootstrap icon for pause fill. static IconData pauseFill; /// Bootstrap icon for pause. static IconData pause; /// Bootstrap icon for peace fill. static IconData peaceFill; /// Bootstrap icon for peace. static IconData peace; /// Bootstrap icon for pen fill. static IconData penFill; /// Bootstrap icon for pen. static IconData pen; /// Bootstrap icon for pencil fill. static IconData pencilFill; /// Bootstrap icon for pencil square. static IconData pencilSquare; /// Bootstrap icon for pencil. static IconData pencil; /// Bootstrap icon for pentagon fill. static IconData pentagonFill; /// Bootstrap icon for pentagon half. static IconData pentagonHalf; /// Bootstrap icon for pentagon. static IconData pentagon; /// Bootstrap icon for people fill. static IconData peopleFill; /// Bootstrap icon for people. static IconData people; /// Bootstrap icon for percent. static IconData percent; /// Bootstrap icon for person badge fill. static IconData personBadgeFill; /// Bootstrap icon for person badge. static IconData personBadge; /// Bootstrap icon for person bounding box. static IconData personBoundingBox; /// Bootstrap icon for person check fill. static IconData personCheckFill; /// Bootstrap icon for person check. static IconData personCheck; /// Bootstrap icon for person circle. static IconData personCircle; /// Bootstrap icon for person dash fill. static IconData personDashFill; /// Bootstrap icon for person dash. static IconData personDash; /// Bootstrap icon for person fill. static IconData personFill; /// Bootstrap icon for person lines fill. static IconData personLinesFill; /// Bootstrap icon for person plus fill. static IconData personPlusFill; /// Bootstrap icon for person plus. static IconData personPlus; /// Bootstrap icon for person square. static IconData personSquare; /// Bootstrap icon for person x fill. static IconData personXFill; /// Bootstrap icon for person x. static IconData personX; /// Bootstrap icon for person. static IconData person; /// Bootstrap icon for phone fill. static IconData phoneFill; /// Bootstrap icon for phone landscape fill. static IconData phoneLandscapeFill; /// Bootstrap icon for phone landscape. static IconData phoneLandscape; /// Bootstrap icon for phone vibrate fill. static IconData phoneVibrateFill; /// Bootstrap icon for phone vibrate. static IconData phoneVibrate; /// Bootstrap icon for phone. static IconData phone; /// Bootstrap icon for pie chart fill. static IconData pieChartFill; /// Bootstrap icon for pie chart. static IconData pieChart; /// Bootstrap icon for pin angle fill. static IconData pinAngleFill; /// Bootstrap icon for pin angle. static IconData pinAngle; /// Bootstrap icon for pin fill. static IconData pinFill; /// Bootstrap icon for pin. static IconData pin; /// Bootstrap icon for pip fill. static IconData pipFill; /// Bootstrap icon for pip. static IconData pip; /// Bootstrap icon for play btn fill. static IconData playBtnFill; /// Bootstrap icon for play btn. static IconData playBtn; /// Bootstrap icon for play circle fill. static IconData playCircleFill; /// Bootstrap icon for play circle. static IconData playCircle; /// Bootstrap icon for play fill. static IconData playFill; /// Bootstrap icon for play. static IconData play; /// Bootstrap icon for plug fill. static IconData plugFill; /// Bootstrap icon for plug. static IconData plug; /// Bootstrap icon for plus circle dotted. static IconData plusCircleDotted; /// Bootstrap icon for plus circle fill. static IconData plusCircleFill; /// Bootstrap icon for plus circle. static IconData plusCircle; /// Bootstrap icon for plus square dotted. static IconData plusSquareDotted; /// Bootstrap icon for plus square fill. static IconData plusSquareFill; /// Bootstrap icon for plus square. static IconData plusSquare; /// Bootstrap icon for plus. static IconData plus; /// Bootstrap icon for power. static IconData power; /// Bootstrap icon for printer fill. static IconData printerFill; /// Bootstrap icon for printer. static IconData printer; /// Bootstrap icon for puzzle fill. static IconData puzzleFill; /// Bootstrap icon for puzzle. static IconData puzzle; /// Bootstrap icon for question circle fill. static IconData questionCircleFill; /// Bootstrap icon for question circle. static IconData questionCircle; /// Bootstrap icon for question diamond fill. static IconData questionDiamondFill; /// Bootstrap icon for question diamond. static IconData questionDiamond; /// Bootstrap icon for question octagon fill. static IconData questionOctagonFill; /// Bootstrap icon for question octagon. static IconData questionOctagon; /// Bootstrap icon for question square fill. static IconData questionSquareFill; /// Bootstrap icon for question square. static IconData questionSquare; /// Bootstrap icon for question. static IconData question; /// Bootstrap icon for rainbow. static IconData rainbow; /// Bootstrap icon for receipt cutoff. static IconData receiptCutoff; /// Bootstrap icon for receipt. static IconData receipt; /// Bootstrap icon for reception0. static IconData reception0; /// Bootstrap icon for reception1. static IconData reception1; /// Bootstrap icon for reception2. static IconData reception2; /// Bootstrap icon for reception3. static IconData reception3; /// Bootstrap icon for reception4. static IconData reception4; /// Bootstrap icon for record btn fill. static IconData recordBtnFill; /// Bootstrap icon for record btn. static IconData recordBtn; /// Bootstrap icon for record circle fill. static IconData recordCircleFill; /// Bootstrap icon for record circle. static IconData recordCircle; /// Bootstrap icon for record fill. static IconData recordFill; /// Bootstrap icon for record. static IconData record; /// Bootstrap icon for record2 fill. static IconData record2Fill; /// Bootstrap icon for record2. static IconData record2; /// Bootstrap icon for reply all fill. static IconData replyAllFill; /// Bootstrap icon for reply all. static IconData replyAll; /// Bootstrap icon for reply fill. static IconData replyFill; /// Bootstrap icon for reply. static IconData reply; /// Bootstrap icon for rss fill. static IconData rssFill; /// Bootstrap icon for rss. static IconData rss; /// Bootstrap icon for rulers. static IconData rulers; /// Bootstrap icon for save fill. static IconData saveFill; /// Bootstrap icon for save. static IconData save; /// Bootstrap icon for save2 fill. static IconData save2Fill; /// Bootstrap icon for save2. static IconData save2; /// Bootstrap icon for scissors. static IconData scissors; /// Bootstrap icon for screwdriver. static IconData screwdriver; /// Bootstrap icon for search. static IconData search; /// Bootstrap icon for segmented nav. static IconData segmentedNav; /// Bootstrap icon for server. static IconData server; /// Bootstrap icon for share fill. static IconData shareFill; /// Bootstrap icon for share. static IconData share; /// Bootstrap icon for shield check. static IconData shieldCheck; /// Bootstrap icon for shield exclamation. static IconData shieldExclamation; /// Bootstrap icon for shield fill check. static IconData shieldFillCheck; /// Bootstrap icon for shield fill exclamation. static IconData shieldFillExclamation; /// Bootstrap icon for shield fill minus. static IconData shieldFillMinus; /// Bootstrap icon for shield fill plus. static IconData shieldFillPlus; /// Bootstrap icon for shield fill x. static IconData shieldFillX; /// Bootstrap icon for shield fill. static IconData shieldFill; /// Bootstrap icon for shield lock fill. static IconData shieldLockFill; /// Bootstrap icon for shield lock. static IconData shieldLock; /// Bootstrap icon for shield minus. static IconData shieldMinus; /// Bootstrap icon for shield plus. static IconData shieldPlus; /// Bootstrap icon for shield shaded. static IconData shieldShaded; /// Bootstrap icon for shield slash fill. static IconData shieldSlashFill; /// Bootstrap icon for shield slash. static IconData shieldSlash; /// Bootstrap icon for shield x. static IconData shieldX; /// Bootstrap icon for shield. static IconData shield; /// Bootstrap icon for shift fill. static IconData shiftFill; /// Bootstrap icon for shift. static IconData shift; /// Bootstrap icon for shop window. static IconData shopWindow; /// Bootstrap icon for shop. static IconData shop; /// Bootstrap icon for shuffle. static IconData shuffle; /// Bootstrap icon for signpost2 fill. static IconData signpost2Fill; /// Bootstrap icon for signpost2. static IconData signpost2; /// Bootstrap icon for signpost fill. static IconData signpostFill; /// Bootstrap icon for signpost split fill. static IconData signpostSplitFill; /// Bootstrap icon for signpost split. static IconData signpostSplit; /// Bootstrap icon for signpost. static IconData signpost; /// Bootstrap icon for sim fill. static IconData simFill; /// Bootstrap icon for sim. static IconData sim; /// Bootstrap icon for skip backward btn fill. static IconData skipBackwardBtnFill; /// Bootstrap icon for skip backward btn. static IconData skipBackwardBtn; /// Bootstrap icon for skip backward circle fill. static IconData skipBackwardCircleFill; /// Bootstrap icon for skip backward circle. static IconData skipBackwardCircle; /// Bootstrap icon for skip backward fill. static IconData skipBackwardFill; /// Bootstrap icon for skip backward. static IconData skipBackward; /// Bootstrap icon for skip end btn fill. static IconData skipEndBtnFill; /// Bootstrap icon for skip end btn. static IconData skipEndBtn; /// Bootstrap icon for skip end circle fill. static IconData skipEndCircleFill; /// Bootstrap icon for skip end circle. static IconData skipEndCircle; /// Bootstrap icon for skip end fill. static IconData skipEndFill; /// Bootstrap icon for skip end. static IconData skipEnd; /// Bootstrap icon for skip forward btn fill. static IconData skipForwardBtnFill; /// Bootstrap icon for skip forward btn. static IconData skipForwardBtn; /// Bootstrap icon for skip forward circle fill. static IconData skipForwardCircleFill; /// Bootstrap icon for skip forward circle. static IconData skipForwardCircle; /// Bootstrap icon for skip forward fill. static IconData skipForwardFill; /// Bootstrap icon for skip forward. static IconData skipForward; /// Bootstrap icon for skip start btn fill. static IconData skipStartBtnFill; /// Bootstrap icon for skip start btn. static IconData skipStartBtn; /// Bootstrap icon for skip start circle fill. static IconData skipStartCircleFill; /// Bootstrap icon for skip start circle. static IconData skipStartCircle; /// Bootstrap icon for skip start fill. static IconData skipStartFill; /// Bootstrap icon for skip start. static IconData skipStart; /// Bootstrap icon for slack. static IconData slack; /// Bootstrap icon for slash circle fill. static IconData slashCircleFill; /// Bootstrap icon for slash circle. static IconData slashCircle; /// Bootstrap icon for slash square fill. static IconData slashSquareFill; /// Bootstrap icon for slash square. static IconData slashSquare; /// Bootstrap icon for slash. static IconData slash; /// Bootstrap icon for sliders. static IconData sliders; /// Bootstrap icon for smartwatch. static IconData smartwatch; /// Bootstrap icon for snow. static IconData snow; /// Bootstrap icon for snow2. static IconData snow2; /// Bootstrap icon for snow3. static IconData snow3; /// Bootstrap icon for sort alpha down alt. static IconData sortAlphaDownAlt; /// Bootstrap icon for sort alpha down. static IconData sortAlphaDown; /// Bootstrap icon for sort alpha up alt. static IconData sortAlphaUpAlt; /// Bootstrap icon for sort alpha up. static IconData sortAlphaUp; /// Bootstrap icon for sort down alt. static IconData sortDownAlt; /// Bootstrap icon for sort down. static IconData sortDown; /// Bootstrap icon for sort numeric down alt. static IconData sortNumericDownAlt; /// Bootstrap icon for sort numeric down. static IconData sortNumericDown; /// Bootstrap icon for sort numeric up alt. static IconData sortNumericUpAlt; /// Bootstrap icon for sort numeric up. static IconData sortNumericUp; /// Bootstrap icon for sort up alt. static IconData sortUpAlt; /// Bootstrap icon for sort up. static IconData sortUp; /// Bootstrap icon for soundwave. static IconData soundwave; /// Bootstrap icon for speaker fill. static IconData speakerFill; /// Bootstrap icon for speaker. static IconData speaker; /// Bootstrap icon for speedometer. static IconData speedometer; /// Bootstrap icon for speedometer2. static IconData speedometer2; /// Bootstrap icon for spellcheck. static IconData spellcheck; /// Bootstrap icon for square fill. static IconData squareFill; /// Bootstrap icon for square half. static IconData squareHalf; /// Bootstrap icon for square. static IconData square; /// Bootstrap icon for stack. static IconData stack; /// Bootstrap icon for star fill. static IconData starFill; /// Bootstrap icon for star half. static IconData starHalf; /// Bootstrap icon for star. static IconData star; /// Bootstrap icon for stars. static IconData stars; /// Bootstrap icon for stickies fill. static IconData stickiesFill; /// Bootstrap icon for stickies. static IconData stickies; /// Bootstrap icon for sticky fill. static IconData stickyFill; /// Bootstrap icon for sticky. static IconData sticky; /// Bootstrap icon for stop btn fill. static IconData stopBtnFill; /// Bootstrap icon for stop btn. static IconData stopBtn; /// Bootstrap icon for stop circle fill. static IconData stopCircleFill; /// Bootstrap icon for stop circle. static IconData stopCircle; /// Bootstrap icon for stop fill. static IconData stopFill; /// Bootstrap icon for stop. static IconData stop; /// Bootstrap icon for stoplights fill. static IconData stoplightsFill; /// Bootstrap icon for stoplights. static IconData stoplights; /// Bootstrap icon for stopwatch fill. static IconData stopwatchFill; /// Bootstrap icon for stopwatch. static IconData stopwatch; /// Bootstrap icon for subtract. static IconData subtract; /// Bootstrap icon for suit club fill. static IconData suitClubFill; /// Bootstrap icon for suit club. static IconData suitClub; /// Bootstrap icon for suit diamond fill. static IconData suitDiamondFill; /// Bootstrap icon for suit diamond. static IconData suitDiamond; /// Bootstrap icon for suit heart fill. static IconData suitHeartFill; /// Bootstrap icon for suit heart. static IconData suitHeart; /// Bootstrap icon for suit spade fill. static IconData suitSpadeFill; /// Bootstrap icon for suit spade. static IconData suitSpade; /// Bootstrap icon for sun fill. static IconData sunFill; /// Bootstrap icon for sun. static IconData sun; /// Bootstrap icon for sunglasses. static IconData sunglasses; /// Bootstrap icon for sunrise fill. static IconData sunriseFill; /// Bootstrap icon for sunrise. static IconData sunrise; /// Bootstrap icon for sunset fill. static IconData sunsetFill; /// Bootstrap icon for sunset. static IconData sunset; /// Bootstrap icon for symmetry horizontal. static IconData symmetryHorizontal; /// Bootstrap icon for symmetry vertical. static IconData symmetryVertical; /// Bootstrap icon for table. static IconData table; /// Bootstrap icon for tablet fill. static IconData tabletFill; /// Bootstrap icon for tablet landscape fill. static IconData tabletLandscapeFill; /// Bootstrap icon for tablet landscape. static IconData tabletLandscape; /// Bootstrap icon for tablet. static IconData tablet; /// Bootstrap icon for tag fill. static IconData tagFill; /// Bootstrap icon for tag. static IconData tag; /// Bootstrap icon for tags fill. static IconData tagsFill; /// Bootstrap icon for tags. static IconData tags; /// Bootstrap icon for telegram. static IconData telegram; /// Bootstrap icon for telephone fill. static IconData telephoneFill; /// Bootstrap icon for telephone forward fill. static IconData telephoneForwardFill; /// Bootstrap icon for telephone forward. static IconData telephoneForward; /// Bootstrap icon for telephone inbound fill. static IconData telephoneInboundFill; /// Bootstrap icon for telephone inbound. static IconData telephoneInbound; /// Bootstrap icon for telephone minus fill. static IconData telephoneMinusFill; /// Bootstrap icon for telephone minus. static IconData telephoneMinus; /// Bootstrap icon for telephone outbound fill. static IconData telephoneOutboundFill; /// Bootstrap icon for telephone outbound. static IconData telephoneOutbound; /// Bootstrap icon for telephone plus fill. static IconData telephonePlusFill; /// Bootstrap icon for telephone plus. static IconData telephonePlus; /// Bootstrap icon for telephone x fill. static IconData telephoneXFill; /// Bootstrap icon for telephone x. static IconData telephoneX; /// Bootstrap icon for telephone. static IconData telephone; /// Bootstrap icon for terminal fill. static IconData terminalFill; /// Bootstrap icon for terminal. static IconData terminal; /// Bootstrap icon for text center. static IconData textCenter; /// Bootstrap icon for text indent left. static IconData textIndentLeft; /// Bootstrap icon for text indent right. static IconData textIndentRight; /// Bootstrap icon for text left. static IconData textLeft; /// Bootstrap icon for text paragraph. static IconData textParagraph; /// Bootstrap icon for text right. static IconData textRight; /// Bootstrap icon for textarea resize. static IconData textareaResize; /// Bootstrap icon for textarea t. static IconData textareaT; /// Bootstrap icon for textarea. static IconData textarea; /// Bootstrap icon for thermometer half. static IconData thermometerHalf; /// Bootstrap icon for thermometer high. static IconData thermometerHigh; /// Bootstrap icon for thermometer low. static IconData thermometerLow; /// Bootstrap icon for thermometer snow. static IconData thermometerSnow; /// Bootstrap icon for thermometer sun. static IconData thermometerSun; /// Bootstrap icon for thermometer. static IconData thermometer; /// Bootstrap icon for three dots vertical. static IconData threeDotsVertical; /// Bootstrap icon for three dots. static IconData threeDots; /// Bootstrap icon for toggle off. static IconData toggleOff; /// Bootstrap icon for toggle on. static IconData toggleOn; /// Bootstrap icon for toggle2 off. static IconData toggle2Off; /// Bootstrap icon for toggle2 on. static IconData toggle2On; /// Bootstrap icon for toggles. static IconData toggles; /// Bootstrap icon for toggles2. static IconData toggles2; /// Bootstrap icon for tools. static IconData tools; /// Bootstrap icon for tornado. static IconData tornado; /// Bootstrap icon for trash fill. static IconData trashFill; /// Bootstrap icon for trash. static IconData trash; /// Bootstrap icon for trash2 fill. static IconData trash2Fill; /// Bootstrap icon for trash2. static IconData trash2; /// Bootstrap icon for tree fill. static IconData treeFill; /// Bootstrap icon for tree. static IconData tree; /// Bootstrap icon for triangle fill. static IconData triangleFill; /// Bootstrap icon for triangle half. static IconData triangleHalf; /// Bootstrap icon for triangle. static IconData triangle; /// Bootstrap icon for trophy fill. static IconData trophyFill; /// Bootstrap icon for trophy. static IconData trophy; /// Bootstrap icon for tropical storm. static IconData tropicalStorm; /// Bootstrap icon for truck flatbed. static IconData truckFlatbed; /// Bootstrap icon for truck. static IconData truck; /// Bootstrap icon for tsunami. static IconData tsunami; /// Bootstrap icon for tv fill. static IconData tvFill; /// Bootstrap icon for tv. static IconData tv; /// Bootstrap icon for twitch. static IconData twitch; /// Bootstrap icon for twitter. static IconData twitter; /// Bootstrap icon for type bold. static IconData typeBold; /// Bootstrap icon for type h1. static IconData typeH1; /// Bootstrap icon for type h2. static IconData typeH2; /// Bootstrap icon for type h3. static IconData typeH3; /// Bootstrap icon for type italic. static IconData typeItalic; /// Bootstrap icon for type strikethrough. static IconData typeStrikethrough; /// Bootstrap icon for type underline. static IconData typeUnderline; /// Bootstrap icon for type. static IconData type; /// Bootstrap icon for ui checks grid. static IconData uiChecksGrid; /// Bootstrap icon for ui checks. static IconData uiChecks; /// Bootstrap icon for ui radios grid. static IconData uiRadiosGrid; /// Bootstrap icon for ui radios. static IconData uiRadios; /// Bootstrap icon for umbrella fill. static IconData umbrellaFill; /// Bootstrap icon for umbrella. static IconData umbrella; /// Bootstrap icon for union. static IconData union; /// Bootstrap icon for unlock fill. static IconData unlockFill; /// Bootstrap icon for unlock. static IconData unlock; /// Bootstrap icon for upc scan. static IconData upcScan; /// Bootstrap icon for upc. static IconData upc; /// Bootstrap icon for upload. static IconData upload; /// Bootstrap icon for vector pen. static IconData vectorPen; /// Bootstrap icon for view list. static IconData viewList; /// Bootstrap icon for view stacked. static IconData viewStacked; /// Bootstrap icon for vinyl fill. static IconData vinylFill; /// Bootstrap icon for vinyl. static IconData vinyl; /// Bootstrap icon for voicemail. static IconData voicemail; /// Bootstrap icon for volume down fill. static IconData volumeDownFill; /// Bootstrap icon for volume down. static IconData volumeDown; /// Bootstrap icon for volume mute fill. static IconData volumeMuteFill; /// Bootstrap icon for volume mute. static IconData volumeMute; /// Bootstrap icon for volume off fill. static IconData volumeOffFill; /// Bootstrap icon for volume off. static IconData volumeOff; /// Bootstrap icon for volume up fill. static IconData volumeUpFill; /// Bootstrap icon for volume up. static IconData volumeUp; /// Bootstrap icon for vr. static IconData vr; /// Bootstrap icon for wallet fill. static IconData walletFill; /// Bootstrap icon for wallet. static IconData wallet; /// Bootstrap icon for wallet2. static IconData wallet2; /// Bootstrap icon for watch. static IconData watch; /// Bootstrap icon for water. static IconData water; /// Bootstrap icon for whatsapp. static IconData whatsapp; /// Bootstrap icon for wifi1. static IconData wifi1; /// Bootstrap icon for wifi2. static IconData wifi2; /// Bootstrap icon for wifi off. static IconData wifiOff; /// Bootstrap icon for wifi. static IconData wifi; /// Bootstrap icon for wind. static IconData wind; /// Bootstrap icon for window dock. static IconData windowDock; /// Bootstrap icon for window sidebar. static IconData windowSidebar; /// Bootstrap icon for window. static IconData window; /// Bootstrap icon for wrench. static IconData wrench; /// Bootstrap icon for x circle fill. static IconData xCircleFill; /// Bootstrap icon for x circle. static IconData xCircle; /// Bootstrap icon for x diamond fill. static IconData xDiamondFill; /// Bootstrap icon for x diamond. static IconData xDiamond; /// Bootstrap icon for x octagon fill. static IconData xOctagonFill; /// Bootstrap icon for x octagon. static IconData xOctagon; /// Bootstrap icon for x square fill. static IconData xSquareFill; /// Bootstrap icon for x square. static IconData xSquare; /// Bootstrap icon for x. static IconData x; /// Bootstrap icon for youtube. static IconData youtube; /// Bootstrap icon for zoom in. static IconData zoomIn; /// Bootstrap icon for zoom out. static IconData zoomOut; /// Bootstrap icon for bank. static IconData bank; /// Bootstrap icon for bank2. static IconData bank2; /// Bootstrap icon for bell slash fill. static IconData bellSlashFill; /// Bootstrap icon for bell slash. static IconData bellSlash; /// Bootstrap icon for cash coin. static IconData cashCoin; /// Bootstrap icon for check lg. static IconData checkLg; /// Bootstrap icon for coin. static IconData coin; /// Bootstrap icon for currency bitcoin. static IconData currencyBitcoin; /// Bootstrap icon for currency dollar. static IconData currencyDollar; /// Bootstrap icon for currency euro. static IconData currencyEuro; /// Bootstrap icon for currency exchange. static IconData currencyExchange; /// Bootstrap icon for currency pound. static IconData currencyPound; /// Bootstrap icon for currency yen. static IconData currencyYen; /// Bootstrap icon for dash lg. static IconData dashLg; /// Bootstrap icon for exclamation lg. static IconData exclamationLg; /// Bootstrap icon for file earmark pdf fill. static IconData fileEarmarkPdfFill; /// Bootstrap icon for file earmark pdf. static IconData fileEarmarkPdf; /// Bootstrap icon for file pdf fill. static IconData filePdfFill; /// Bootstrap icon for file pdf. static IconData filePdf; /// Bootstrap icon for gender ambiguous. static IconData genderAmbiguous; /// Bootstrap icon for gender female. static IconData genderFemale; /// Bootstrap icon for gender male. static IconData genderMale; /// Bootstrap icon for gender trans. static IconData genderTrans; /// Bootstrap icon for headset vr. static IconData headsetVr; /// Bootstrap icon for info lg. static IconData infoLg; /// Bootstrap icon for mastodon. static IconData mastodon; /// Bootstrap icon for messenger. static IconData messenger; /// Bootstrap icon for piggy bank fill. static IconData piggyBankFill; /// Bootstrap icon for piggy bank. static IconData piggyBank; /// Bootstrap icon for pin map fill. static IconData pinMapFill; /// Bootstrap icon for pin map. static IconData pinMap; /// Bootstrap icon for plus lg. static IconData plusLg; /// Bootstrap icon for question lg. static IconData questionLg; /// Bootstrap icon for recycle. static IconData recycle; /// Bootstrap icon for reddit. static IconData reddit; /// Bootstrap icon for safe fill. static IconData safeFill; /// Bootstrap icon for safe2 fill. static IconData safe2Fill; /// Bootstrap icon for safe2. static IconData safe2; /// Bootstrap icon for sd card fill. static IconData sdCardFill; /// Bootstrap icon for sd card. static IconData sdCard; /// Bootstrap icon for skype. static IconData skype; /// Bootstrap icon for slash lg. static IconData slashLg; /// Bootstrap icon for translate. static IconData translate; /// Bootstrap icon for x lg. static IconData xLg; /// Bootstrap icon for safe. static IconData safe; /// Bootstrap icon for apple. static IconData apple; /// Bootstrap icon for microsoft. static IconData microsoft; /// Bootstrap icon for windows. static IconData windows; /// Bootstrap icon for behance. static IconData behance; /// Bootstrap icon for dribbble. static IconData dribbble; /// Bootstrap icon for line. static IconData line; /// Bootstrap icon for medium. static IconData medium; /// Bootstrap icon for paypal. static IconData paypal; /// Bootstrap icon for pinterest. static IconData pinterest; /// Bootstrap icon for signal. static IconData signal; /// Bootstrap icon for snapchat. static IconData snapchat; /// Bootstrap icon for spotify. static IconData spotify; /// Bootstrap icon for stack overflow. static IconData stackOverflow; /// Bootstrap icon for strava. static IconData strava; /// Bootstrap icon for wordpress. static IconData wordpress; /// Bootstrap icon for vimeo. static IconData vimeo; /// Bootstrap icon for activity. static IconData activity; /// Bootstrap icon for easel2 fill. static IconData easel2Fill; /// Bootstrap icon for easel2. static IconData easel2; /// Bootstrap icon for easel3 fill. static IconData easel3Fill; /// Bootstrap icon for easel3. static IconData easel3; /// Bootstrap icon for fan. static IconData fan; /// Bootstrap icon for fingerprint. static IconData fingerprint; /// Bootstrap icon for graph down arrow. static IconData graphDownArrow; /// Bootstrap icon for graph up arrow. static IconData graphUpArrow; /// Bootstrap icon for hypnotize. static IconData hypnotize; /// Bootstrap icon for magic. static IconData magic; /// Bootstrap icon for person rolodex. static IconData personRolodex; /// Bootstrap icon for person video. static IconData personVideo; /// Bootstrap icon for person video2. static IconData personVideo2; /// Bootstrap icon for person video3. static IconData personVideo3; /// Bootstrap icon for person workspace. static IconData personWorkspace; /// Bootstrap icon for radioactive. static IconData radioactive; /// Bootstrap icon for webcam fill. static IconData webcamFill; /// Bootstrap icon for webcam. static IconData webcam; /// Bootstrap icon for yin yang. static IconData yinYang; /// Bootstrap icon for bandaid fill. static IconData bandaidFill; /// Bootstrap icon for bandaid. static IconData bandaid; /// Bootstrap icon for bluetooth. static IconData bluetooth; /// Bootstrap icon for body text. static IconData bodyText; /// Bootstrap icon for boombox. static IconData boombox; /// Bootstrap icon for boxes. static IconData boxes; /// Bootstrap icon for dpad fill. static IconData dpadFill; /// Bootstrap icon for dpad. static IconData dpad; /// Bootstrap icon for ear fill. static IconData earFill; /// Bootstrap icon for ear. static IconData ear; /// Bootstrap icon for envelope check fill. static IconData envelopeCheckFill; /// Bootstrap icon for envelope check. static IconData envelopeCheck; /// Bootstrap icon for envelope dash fill. static IconData envelopeDashFill; /// Bootstrap icon for envelope dash. static IconData envelopeDash; /// Bootstrap icon for envelope exclamation fill. static IconData envelopeExclamationFill; /// Bootstrap icon for envelope exclamation. static IconData envelopeExclamation; /// Bootstrap icon for envelope plus fill. static IconData envelopePlusFill; /// Bootstrap icon for envelope plus. static IconData envelopePlus; /// Bootstrap icon for envelope slash fill. static IconData envelopeSlashFill; /// Bootstrap icon for envelope slash. static IconData envelopeSlash; /// Bootstrap icon for envelope x fill. static IconData envelopeXFill; /// Bootstrap icon for envelope x. static IconData envelopeX; /// Bootstrap icon for explicit fill. static IconData explicitFill; /// Bootstrap icon for explicit. static IconData explicit; /// Bootstrap icon for git. static IconData git; /// Bootstrap icon for infinity. static IconData infinity; /// Bootstrap icon for list columns reverse. static IconData listColumnsReverse; /// Bootstrap icon for list columns. static IconData listColumns; /// Bootstrap icon for meta. static IconData meta; /// Bootstrap icon for nintendo switch. static IconData nintendoSwitch; /// Bootstrap icon for pc display horizontal. static IconData pcDisplayHorizontal; /// Bootstrap icon for pc display. static IconData pcDisplay; /// Bootstrap icon for pc horizontal. static IconData pcHorizontal; /// Bootstrap icon for pc. static IconData pc; /// Bootstrap icon for playstation. static IconData playstation; /// Bootstrap icon for plus slash minus. static IconData plusSlashMinus; /// Bootstrap icon for projector fill. static IconData projectorFill; /// Bootstrap icon for projector. static IconData projector; /// Bootstrap icon for qr code scan. static IconData qrCodeScan; /// Bootstrap icon for qr code. static IconData qrCode; /// Bootstrap icon for quora. static IconData quora; /// Bootstrap icon for quote. static IconData quote; /// Bootstrap icon for robot. static IconData robot; /// Bootstrap icon for send check fill. static IconData sendCheckFill; /// Bootstrap icon for send check. static IconData sendCheck; /// Bootstrap icon for send dash fill. static IconData sendDashFill; /// Bootstrap icon for send dash. static IconData sendDash; /// Bootstrap icon for send exclamation fill. static IconData sendExclamationFill; /// Bootstrap icon for send exclamation. static IconData sendExclamation; /// Bootstrap icon for send fill. static IconData sendFill; /// Bootstrap icon for send plus fill. static IconData sendPlusFill; /// Bootstrap icon for send plus. static IconData sendPlus; /// Bootstrap icon for send slash fill. static IconData sendSlashFill; /// Bootstrap icon for send slash. static IconData sendSlash; /// Bootstrap icon for send x fill. static IconData sendXFill; /// Bootstrap icon for send x. static IconData sendX; /// Bootstrap icon for send. static IconData send; /// Bootstrap icon for steam. static IconData steam; /// Bootstrap icon for terminal dash. static IconData terminalDash; /// Bootstrap icon for terminal plus. static IconData terminalPlus; /// Bootstrap icon for terminal split. static IconData terminalSplit; /// Bootstrap icon for ticket detailed fill. static IconData ticketDetailedFill; /// Bootstrap icon for ticket detailed. static IconData ticketDetailed; /// Bootstrap icon for ticket fill. static IconData ticketFill; /// Bootstrap icon for ticket perforated fill. static IconData ticketPerforatedFill; /// Bootstrap icon for ticket perforated. static IconData ticketPerforated; /// Bootstrap icon for ticket. static IconData ticket; /// Bootstrap icon for tiktok. static IconData tiktok; /// Bootstrap icon for window dash. static IconData windowDash; /// Bootstrap icon for window desktop. static IconData windowDesktop; /// Bootstrap icon for window fullscreen. static IconData windowFullscreen; /// Bootstrap icon for window plus. static IconData windowPlus; /// Bootstrap icon for window split. static IconData windowSplit; /// Bootstrap icon for window stack. static IconData windowStack; /// Bootstrap icon for window x. static IconData windowX; /// Bootstrap icon for xbox. static IconData xbox; /// Bootstrap icon for ethernet. static IconData ethernet; /// Bootstrap icon for hdmi fill. static IconData hdmiFill; /// Bootstrap icon for hdmi. static IconData hdmi; /// Bootstrap icon for usb c fill. static IconData usbCFill; /// Bootstrap icon for usb c. static IconData usbC; /// Bootstrap icon for usb fill. static IconData usbFill; /// Bootstrap icon for usb plug fill. static IconData usbPlugFill; /// Bootstrap icon for usb plug. static IconData usbPlug; /// Bootstrap icon for usb symbol. static IconData usbSymbol; /// Bootstrap icon for usb. static IconData usb; /// Bootstrap icon for boombox fill. static IconData boomboxFill; /// Bootstrap icon for displayport. static IconData displayport; /// Bootstrap icon for gpu card. static IconData gpuCard; /// Bootstrap icon for memory. static IconData memory; /// Bootstrap icon for modem fill. static IconData modemFill; /// Bootstrap icon for modem. static IconData modem; /// Bootstrap icon for motherboard fill. static IconData motherboardFill; /// Bootstrap icon for motherboard. static IconData motherboard; /// Bootstrap icon for optical audio fill. static IconData opticalAudioFill; /// Bootstrap icon for optical audio. static IconData opticalAudio; /// Bootstrap icon for pci card. static IconData pciCard; /// Bootstrap icon for router fill. static IconData routerFill; /// Bootstrap icon for router. static IconData router; /// Bootstrap icon for thunderbolt fill. static IconData thunderboltFill; /// Bootstrap icon for thunderbolt. static IconData thunderbolt; /// Bootstrap icon for usb drive fill. static IconData usbDriveFill; /// Bootstrap icon for usb drive. static IconData usbDrive; /// Bootstrap icon for usb micro fill. static IconData usbMicroFill; /// Bootstrap icon for usb micro. static IconData usbMicro; /// Bootstrap icon for usb mini fill. static IconData usbMiniFill; /// Bootstrap icon for usb mini. static IconData usbMini; /// Bootstrap icon for cloud haze2. static IconData cloudHaze2; /// Bootstrap icon for device hdd fill. static IconData deviceHddFill; /// Bootstrap icon for device hdd. static IconData deviceHdd; /// Bootstrap icon for device ssd fill. static IconData deviceSsdFill; /// Bootstrap icon for device ssd. static IconData deviceSsd; /// Bootstrap icon for displayport fill. static IconData displayportFill; /// Bootstrap icon for mortarboard fill. static IconData mortarboardFill; /// Bootstrap icon for mortarboard. static IconData mortarboard; /// Bootstrap icon for terminal x. static IconData terminalX; /// Bootstrap icon for arrow through heart fill. static IconData arrowThroughHeartFill; /// Bootstrap icon for arrow through heart. static IconData arrowThroughHeart; /// Bootstrap icon for badge sd fill. static IconData badgeSdFill; /// Bootstrap icon for badge sd. static IconData badgeSd; /// Bootstrap icon for bag heart fill. static IconData bagHeartFill; /// Bootstrap icon for bag heart. static IconData bagHeart; /// Bootstrap icon for balloon fill. static IconData balloonFill; /// Bootstrap icon for balloon heart fill. static IconData balloonHeartFill; /// Bootstrap icon for balloon heart. static IconData balloonHeart; /// Bootstrap icon for balloon. static IconData balloon; /// Bootstrap icon for box2 fill. static IconData box2Fill; /// Bootstrap icon for box2 heart fill. static IconData box2HeartFill; /// Bootstrap icon for box2 heart. static IconData box2Heart; /// Bootstrap icon for box2. static IconData box2; /// Bootstrap icon for braces asterisk. static IconData bracesAsterisk; /// Bootstrap icon for calendar heart fill. static IconData calendarHeartFill; /// Bootstrap icon for calendar heart. static IconData calendarHeart; /// Bootstrap icon for calendar2 heart fill. static IconData calendar2HeartFill; /// Bootstrap icon for calendar2 heart. static IconData calendar2Heart; /// Bootstrap icon for chat heart fill. static IconData chatHeartFill; /// Bootstrap icon for chat heart. static IconData chatHeart; /// Bootstrap icon for chat left heart fill. static IconData chatLeftHeartFill; /// Bootstrap icon for chat left heart. static IconData chatLeftHeart; /// Bootstrap icon for chat right heart fill. static IconData chatRightHeartFill; /// Bootstrap icon for chat right heart. static IconData chatRightHeart; /// Bootstrap icon for chat square heart fill. static IconData chatSquareHeartFill; /// Bootstrap icon for chat square heart. static IconData chatSquareHeart; /// Bootstrap icon for clipboard check fill. static IconData clipboardCheckFill; /// Bootstrap icon for clipboard data fill. static IconData clipboardDataFill; /// Bootstrap icon for clipboard fill. static IconData clipboardFill; /// Bootstrap icon for clipboard heart fill. static IconData clipboardHeartFill; /// Bootstrap icon for clipboard heart. static IconData clipboardHeart; /// Bootstrap icon for clipboard minus fill. static IconData clipboardMinusFill; /// Bootstrap icon for clipboard plus fill. static IconData clipboardPlusFill; /// Bootstrap icon for clipboard pulse. static IconData clipboardPulse; /// Bootstrap icon for clipboard x fill. static IconData clipboardXFill; /// Bootstrap icon for clipboard2 check fill. static IconData clipboard2CheckFill; /// Bootstrap icon for clipboard2 check. static IconData clipboard2Check; /// Bootstrap icon for clipboard2 data fill. static IconData clipboard2DataFill; /// Bootstrap icon for clipboard2 data. static IconData clipboard2Data; /// Bootstrap icon for clipboard2 fill. static IconData clipboard2Fill; /// Bootstrap icon for clipboard2 heart fill. static IconData clipboard2HeartFill; /// Bootstrap icon for clipboard2 heart. static IconData clipboard2Heart; /// Bootstrap icon for clipboard2 minus fill. static IconData clipboard2MinusFill; /// Bootstrap icon for clipboard2 minus. static IconData clipboard2Minus; /// Bootstrap icon for clipboard2 plus fill. static IconData clipboard2PlusFill; /// Bootstrap icon for clipboard2 plus. static IconData clipboard2Plus; /// Bootstrap icon for clipboard2 pulse fill. static IconData clipboard2PulseFill; /// Bootstrap icon for clipboard2 pulse. static IconData clipboard2Pulse; /// Bootstrap icon for clipboard2 x fill. static IconData clipboard2XFill; /// Bootstrap icon for clipboard2 x. static IconData clipboard2X; /// Bootstrap icon for clipboard2. static IconData clipboard2; /// Bootstrap icon for emoji kiss fill. static IconData emojiKissFill; /// Bootstrap icon for emoji kiss. static IconData emojiKiss; /// Bootstrap icon for envelope heart fill. static IconData envelopeHeartFill; /// Bootstrap icon for envelope heart. static IconData envelopeHeart; /// Bootstrap icon for envelope open heart fill. static IconData envelopeOpenHeartFill; /// Bootstrap icon for envelope open heart. static IconData envelopeOpenHeart; /// Bootstrap icon for envelope paper fill. static IconData envelopePaperFill; /// Bootstrap icon for envelope paper heart fill. static IconData envelopePaperHeartFill; /// Bootstrap icon for envelope paper heart. static IconData envelopePaperHeart; /// Bootstrap icon for envelope paper. static IconData envelopePaper; /// Bootstrap icon for filetype aac. static IconData filetypeAac; /// Bootstrap icon for filetype ai. static IconData filetypeAi; /// Bootstrap icon for filetype bmp. static IconData filetypeBmp; /// Bootstrap icon for filetype cs. static IconData filetypeCs; /// Bootstrap icon for filetype css. static IconData filetypeCss; /// Bootstrap icon for filetype csv. static IconData filetypeCsv; /// Bootstrap icon for filetype doc. static IconData filetypeDoc; /// Bootstrap icon for filetype docx. static IconData filetypeDocx; /// Bootstrap icon for filetype exe. static IconData filetypeExe; /// Bootstrap icon for filetype gif. static IconData filetypeGif; /// Bootstrap icon for filetype heic. static IconData filetypeHeic; /// Bootstrap icon for filetype html. static IconData filetypeHtml; /// Bootstrap icon for filetype java. static IconData filetypeJava; /// Bootstrap icon for filetype jpg. static IconData filetypeJpg; /// Bootstrap icon for filetype js. static IconData filetypeJs; /// Bootstrap icon for filetype jsx. static IconData filetypeJsx; /// Bootstrap icon for filetype key. static IconData filetypeKey; /// Bootstrap icon for filetype m4p. static IconData filetypeM4p; /// Bootstrap icon for filetype md. static IconData filetypeMd; /// Bootstrap icon for filetype mdx. static IconData filetypeMdx; /// Bootstrap icon for filetype mov. static IconData filetypeMov; /// Bootstrap icon for filetype mp3. static IconData filetypeMp3; /// Bootstrap icon for filetype mp4. static IconData filetypeMp4; /// Bootstrap icon for filetype otf. static IconData filetypeOtf; /// Bootstrap icon for filetype pdf. static IconData filetypePdf; /// Bootstrap icon for filetype php. static IconData filetypePhp; /// Bootstrap icon for filetype png. static IconData filetypePng; /// Bootstrap icon for filetype ppt. static IconData filetypePpt; /// Bootstrap icon for filetype psd. static IconData filetypePsd; /// Bootstrap icon for filetype py. static IconData filetypePy; /// Bootstrap icon for filetype raw. static IconData filetypeRaw; /// Bootstrap icon for filetype rb. static IconData filetypeRb; /// Bootstrap icon for filetype sass. static IconData filetypeSass; /// Bootstrap icon for filetype scss. static IconData filetypeScss; /// Bootstrap icon for filetype sh. static IconData filetypeSh; /// Bootstrap icon for filetype svg. static IconData filetypeSvg; /// Bootstrap icon for filetype tiff. static IconData filetypeTiff; /// Bootstrap icon for filetype tsx. static IconData filetypeTsx; /// Bootstrap icon for filetype ttf. static IconData filetypeTtf; /// Bootstrap icon for filetype txt. static IconData filetypeTxt; /// Bootstrap icon for filetype wav. static IconData filetypeWav; /// Bootstrap icon for filetype woff. static IconData filetypeWoff; /// Bootstrap icon for filetype xls. static IconData filetypeXls; /// Bootstrap icon for filetype xml. static IconData filetypeXml; /// Bootstrap icon for filetype yml. static IconData filetypeYml; /// Bootstrap icon for heart arrow. static IconData heartArrow; /// Bootstrap icon for heart pulse fill. static IconData heartPulseFill; /// Bootstrap icon for heart pulse. static IconData heartPulse; /// Bootstrap icon for heartbreak fill. static IconData heartbreakFill; /// Bootstrap icon for heartbreak. static IconData heartbreak; /// Bootstrap icon for hearts. static IconData hearts; /// Bootstrap icon for hospital fill. static IconData hospitalFill; /// Bootstrap icon for hospital. static IconData hospital; /// Bootstrap icon for house heart fill. static IconData houseHeartFill; /// Bootstrap icon for house heart. static IconData houseHeart; /// Bootstrap icon for incognito. static IconData incognito; /// Bootstrap icon for magnet fill. static IconData magnetFill; /// Bootstrap icon for magnet. static IconData magnet; /// Bootstrap icon for person heart. static IconData personHeart; /// Bootstrap icon for person hearts. static IconData personHearts; /// Bootstrap icon for phone flip. static IconData phoneFlip; /// Bootstrap icon for plugin. static IconData plugin; /// Bootstrap icon for postage fill. static IconData postageFill; /// Bootstrap icon for postage heart fill. static IconData postageHeartFill; /// Bootstrap icon for postage heart. static IconData postageHeart; /// Bootstrap icon for postage. static IconData postage; /// Bootstrap icon for postcard fill. static IconData postcardFill; /// Bootstrap icon for postcard heart fill. static IconData postcardHeartFill; /// Bootstrap icon for postcard heart. static IconData postcardHeart; /// Bootstrap icon for postcard. static IconData postcard; /// Bootstrap icon for search heart fill. static IconData searchHeartFill; /// Bootstrap icon for search heart. static IconData searchHeart; /// Bootstrap icon for sliders2 vertical. static IconData sliders2Vertical; /// Bootstrap icon for sliders2. static IconData sliders2; /// Bootstrap icon for trash3 fill. static IconData trash3Fill; /// Bootstrap icon for trash3. static IconData trash3; /// Bootstrap icon for valentine. static IconData valentine; /// Bootstrap icon for valentine2. static IconData valentine2; /// Bootstrap icon for wrench adjustable circle fill. static IconData wrenchAdjustableCircleFill; /// Bootstrap icon for wrench adjustable circle. static IconData wrenchAdjustableCircle; /// Bootstrap icon for wrench adjustable. static IconData wrenchAdjustable; /// Bootstrap icon for filetype json. static IconData filetypeJson; /// Bootstrap icon for filetype pptx. static IconData filetypePptx; /// Bootstrap icon for filetype xlsx. static IconData filetypeXlsx; /// Bootstrap icon for icon1 circle fill. static IconData icon1CircleFill; /// Bootstrap icon for icon1 circle. static IconData icon1Circle; /// Bootstrap icon for icon1 square fill. static IconData icon1SquareFill; /// Bootstrap icon for icon1 square. static IconData icon1Square; /// Bootstrap icon for icon2 circle fill. static IconData icon2CircleFill; /// Bootstrap icon for icon2 circle. static IconData icon2Circle; /// Bootstrap icon for icon2 square fill. static IconData icon2SquareFill; /// Bootstrap icon for icon2 square. static IconData icon2Square; /// Bootstrap icon for icon3 circle fill. static IconData icon3CircleFill; /// Bootstrap icon for icon3 circle. static IconData icon3Circle; /// Bootstrap icon for icon3 square fill. static IconData icon3SquareFill; /// Bootstrap icon for icon3 square. static IconData icon3Square; /// Bootstrap icon for icon4 circle fill. static IconData icon4CircleFill; /// Bootstrap icon for icon4 circle. static IconData icon4Circle; /// Bootstrap icon for icon4 square fill. static IconData icon4SquareFill; /// Bootstrap icon for icon4 square. static IconData icon4Square; /// Bootstrap icon for icon5 circle fill. static IconData icon5CircleFill; /// Bootstrap icon for icon5 circle. static IconData icon5Circle; /// Bootstrap icon for icon5 square fill. static IconData icon5SquareFill; /// Bootstrap icon for icon5 square. static IconData icon5Square; /// Bootstrap icon for icon6 circle fill. static IconData icon6CircleFill; /// Bootstrap icon for icon6 circle. static IconData icon6Circle; /// Bootstrap icon for icon6 square fill. static IconData icon6SquareFill; /// Bootstrap icon for icon6 square. static IconData icon6Square; /// Bootstrap icon for icon7 circle fill. static IconData icon7CircleFill; /// Bootstrap icon for icon7 circle. static IconData icon7Circle; /// Bootstrap icon for icon7 square fill. static IconData icon7SquareFill; /// Bootstrap icon for icon7 square. static IconData icon7Square; /// Bootstrap icon for icon8 circle fill. static IconData icon8CircleFill; /// Bootstrap icon for icon8 circle. static IconData icon8Circle; /// Bootstrap icon for icon8 square fill. static IconData icon8SquareFill; /// Bootstrap icon for icon8 square. static IconData icon8Square; /// Bootstrap icon for icon9 circle fill. static IconData icon9CircleFill; /// Bootstrap icon for icon9 circle. static IconData icon9Circle; /// Bootstrap icon for icon9 square fill. static IconData icon9SquareFill; /// Bootstrap icon for icon9 square. static IconData icon9Square; /// Bootstrap icon for airplane engines fill. static IconData airplaneEnginesFill; /// Bootstrap icon for airplane engines. static IconData airplaneEngines; /// Bootstrap icon for airplane fill. static IconData airplaneFill; /// Bootstrap icon for airplane. static IconData airplane; /// Bootstrap icon for alexa. static IconData alexa; /// Bootstrap icon for alipay. static IconData alipay; /// Bootstrap icon for android. static IconData android; /// Bootstrap icon for android2. static IconData android2; /// Bootstrap icon for box fill. static IconData boxFill; /// Bootstrap icon for box seam fill. static IconData boxSeamFill; /// Bootstrap icon for browser chrome. static IconData browserChrome; /// Bootstrap icon for browser edge. static IconData browserEdge; /// Bootstrap icon for browser firefox. static IconData browserFirefox; /// Bootstrap icon for browser safari. static IconData browserSafari; /// Bootstrap icon for c circle fill. static IconData cCircleFill; /// Bootstrap icon for c circle. static IconData cCircle; /// Bootstrap icon for c square fill. static IconData cSquareFill; /// Bootstrap icon for c square. static IconData cSquare; /// Bootstrap icon for capsule pill. static IconData capsulePill; /// Bootstrap icon for capsule. static IconData capsule; /// Bootstrap icon for car front fill. static IconData carFrontFill; /// Bootstrap icon for car front. static IconData carFront; /// Bootstrap icon for cassette fill. static IconData cassetteFill; /// Bootstrap icon for cassette. static IconData cassette; /// Bootstrap icon for cc circle fill. static IconData ccCircleFill; /// Bootstrap icon for cc circle. static IconData ccCircle; /// Bootstrap icon for cc square fill. static IconData ccSquareFill; /// Bootstrap icon for cc square. static IconData ccSquare; /// Bootstrap icon for cup hot fill. static IconData cupHotFill; /// Bootstrap icon for cup hot. static IconData cupHot; /// Bootstrap icon for currency rupee. static IconData currencyRupee; /// Bootstrap icon for dropbox. static IconData dropbox; /// Bootstrap icon for escape. static IconData escape; /// Bootstrap icon for fast forward btn fill. static IconData fastForwardBtnFill; /// Bootstrap icon for fast forward btn. static IconData fastForwardBtn; /// Bootstrap icon for fast forward circle fill. static IconData fastForwardCircleFill; /// Bootstrap icon for fast forward circle. static IconData fastForwardCircle; /// Bootstrap icon for fast forward fill. static IconData fastForwardFill; /// Bootstrap icon for fast forward. static IconData fastForward; /// Bootstrap icon for filetype sql. static IconData filetypeSql; /// Bootstrap icon for fire. static IconData fire; /// Bootstrap icon for google play. static IconData googlePlay; /// Bootstrap icon for h circle fill. static IconData hCircleFill; /// Bootstrap icon for h circle. static IconData hCircle; /// Bootstrap icon for h square fill. static IconData hSquareFill; /// Bootstrap icon for h square. static IconData hSquare; /// Bootstrap icon for indent. static IconData indent; /// Bootstrap icon for lungs fill. static IconData lungsFill; /// Bootstrap icon for lungs. static IconData lungs; /// Bootstrap icon for microsoft teams. static IconData microsoftTeams; /// Bootstrap icon for p circle fill. static IconData pCircleFill; /// Bootstrap icon for p circle. static IconData pCircle; /// Bootstrap icon for p square fill. static IconData pSquareFill; /// Bootstrap icon for p square. static IconData pSquare; /// Bootstrap icon for pass fill. static IconData passFill; /// Bootstrap icon for pass. static IconData pass; /// Bootstrap icon for prescription. static IconData prescription; /// Bootstrap icon for prescription2. static IconData prescription2; /// Bootstrap icon for r circle fill. static IconData rCircleFill; /// Bootstrap icon for r circle. static IconData rCircle; /// Bootstrap icon for r square fill. static IconData rSquareFill; /// Bootstrap icon for r square. static IconData rSquare; /// Bootstrap icon for repeat1. static IconData repeat1; /// Bootstrap icon for repeat. static IconData repeat; /// Bootstrap icon for rewind btn fill. static IconData rewindBtnFill; /// Bootstrap icon for rewind btn. static IconData rewindBtn; /// Bootstrap icon for rewind circle fill. static IconData rewindCircleFill; /// Bootstrap icon for rewind circle. static IconData rewindCircle; /// Bootstrap icon for rewind fill. static IconData rewindFill; /// Bootstrap icon for rewind. static IconData rewind; /// Bootstrap icon for train freight front fill. static IconData trainFreightFrontFill; /// Bootstrap icon for train freight front. static IconData trainFreightFront; /// Bootstrap icon for train front fill. static IconData trainFrontFill; /// Bootstrap icon for train front. static IconData trainFront; /// Bootstrap icon for train lightrail front fill. static IconData trainLightrailFrontFill; /// Bootstrap icon for train lightrail front. static IconData trainLightrailFront; /// Bootstrap icon for truck front fill. static IconData truckFrontFill; /// Bootstrap icon for truck front. static IconData truckFront; /// Bootstrap icon for ubuntu. static IconData ubuntu; /// Bootstrap icon for unindent. static IconData unindent; /// Bootstrap icon for unity. static IconData unity; /// Bootstrap icon for universal access circle. static IconData universalAccessCircle; /// Bootstrap icon for universal access. static IconData universalAccess; /// Bootstrap icon for virus. static IconData virus; /// Bootstrap icon for virus2. static IconData virus2; /// Bootstrap icon for wechat. static IconData wechat; /// Bootstrap icon for yelp. static IconData yelp; /// Bootstrap icon for sign stop fill. static IconData signStopFill; /// Bootstrap icon for sign stop lights fill. static IconData signStopLightsFill; /// Bootstrap icon for sign stop lights. static IconData signStopLights; /// Bootstrap icon for sign stop. static IconData signStop; /// Bootstrap icon for sign turn left fill. static IconData signTurnLeftFill; /// Bootstrap icon for sign turn left. static IconData signTurnLeft; /// Bootstrap icon for sign turn right fill. static IconData signTurnRightFill; /// Bootstrap icon for sign turn right. static IconData signTurnRight; /// Bootstrap icon for sign turn slight left fill. static IconData signTurnSlightLeftFill; /// Bootstrap icon for sign turn slight left. static IconData signTurnSlightLeft; /// Bootstrap icon for sign turn slight right fill. static IconData signTurnSlightRightFill; /// Bootstrap icon for sign turn slight right. static IconData signTurnSlightRight; /// Bootstrap icon for sign yield fill. static IconData signYieldFill; /// Bootstrap icon for sign yield. static IconData signYield; /// Bootstrap icon for ev station fill. static IconData evStationFill; /// Bootstrap icon for ev station. static IconData evStation; /// Bootstrap icon for fuel pump diesel fill. static IconData fuelPumpDieselFill; /// Bootstrap icon for fuel pump diesel. static IconData fuelPumpDiesel; /// Bootstrap icon for fuel pump fill. static IconData fuelPumpFill; /// Bootstrap icon for fuel pump. static IconData fuelPump; /// Bootstrap icon for icon0 circle fill. static IconData icon0CircleFill; /// Bootstrap icon for icon0 circle. static IconData icon0Circle; /// Bootstrap icon for icon0 square fill. static IconData icon0SquareFill; /// Bootstrap icon for icon0 square. static IconData icon0Square; /// Bootstrap icon for rocket fill. static IconData rocketFill; /// Bootstrap icon for rocket takeoff fill. static IconData rocketTakeoffFill; /// Bootstrap icon for rocket takeoff. static IconData rocketTakeoff; /// Bootstrap icon for rocket. static IconData rocket; /// Bootstrap icon for stripe. static IconData stripe; /// Bootstrap icon for subscript. static IconData subscript; /// Bootstrap icon for superscript. static IconData superscript; /// Bootstrap icon for trello. static IconData trello; /// Bootstrap icon for envelope at fill. static IconData envelopeAtFill; /// Bootstrap icon for envelope at. static IconData envelopeAt; /// Bootstrap icon for regex. static IconData regex; /// Bootstrap icon for text wrap. static IconData textWrap; /// Bootstrap icon for sign dead end fill. static IconData signDeadEndFill; /// Bootstrap icon for sign dead end. static IconData signDeadEnd; /// Bootstrap icon for sign do not enter fill. static IconData signDoNotEnterFill; /// Bootstrap icon for sign do not enter. static IconData signDoNotEnter; /// Bootstrap icon for sign intersection fill. static IconData signIntersectionFill; /// Bootstrap icon for sign intersection side fill. static IconData signIntersectionSideFill; /// Bootstrap icon for sign intersection side. static IconData signIntersectionSide; /// Bootstrap icon for sign intersection t fill. static IconData signIntersectionTFill; /// Bootstrap icon for sign intersection t. static IconData signIntersectionT; /// Bootstrap icon for sign intersection y fill. static IconData signIntersectionYFill; /// Bootstrap icon for sign intersection y. static IconData signIntersectionY; /// Bootstrap icon for sign intersection. static IconData signIntersection; /// Bootstrap icon for sign merge left fill. static IconData signMergeLeftFill; /// Bootstrap icon for sign merge left. static IconData signMergeLeft; /// Bootstrap icon for sign merge right fill. static IconData signMergeRightFill; /// Bootstrap icon for sign merge right. static IconData signMergeRight; /// Bootstrap icon for sign no left turn fill. static IconData signNoLeftTurnFill; /// Bootstrap icon for sign no left turn. static IconData signNoLeftTurn; /// Bootstrap icon for sign no parking fill. static IconData signNoParkingFill; /// Bootstrap icon for sign no parking. static IconData signNoParking; /// Bootstrap icon for sign no right turn fill. static IconData signNoRightTurnFill; /// Bootstrap icon for sign no right turn. static IconData signNoRightTurn; /// Bootstrap icon for sign railroad fill. static IconData signRailroadFill; /// Bootstrap icon for sign railroad. static IconData signRailroad; /// Bootstrap icon for building add. static IconData buildingAdd; /// Bootstrap icon for building check. static IconData buildingCheck; /// Bootstrap icon for building dash. static IconData buildingDash; /// Bootstrap icon for building down. static IconData buildingDown; /// Bootstrap icon for building exclamation. static IconData buildingExclamation; /// Bootstrap icon for building fill add. static IconData buildingFillAdd; /// Bootstrap icon for building fill check. static IconData buildingFillCheck; /// Bootstrap icon for building fill dash. static IconData buildingFillDash; /// Bootstrap icon for building fill down. static IconData buildingFillDown; /// Bootstrap icon for building fill exclamation. static IconData buildingFillExclamation; /// Bootstrap icon for building fill gear. static IconData buildingFillGear; /// Bootstrap icon for building fill lock. static IconData buildingFillLock; /// Bootstrap icon for building fill slash. static IconData buildingFillSlash; /// Bootstrap icon for building fill up. static IconData buildingFillUp; /// Bootstrap icon for building fill x. static IconData buildingFillX; /// Bootstrap icon for building fill. static IconData buildingFill; /// Bootstrap icon for building gear. static IconData buildingGear; /// Bootstrap icon for building lock. static IconData buildingLock; /// Bootstrap icon for building slash. static IconData buildingSlash; /// Bootstrap icon for building up. static IconData buildingUp; /// Bootstrap icon for building x. static IconData buildingX; /// Bootstrap icon for buildings fill. static IconData buildingsFill; /// Bootstrap icon for buildings. static IconData buildings; /// Bootstrap icon for bus front fill. static IconData busFrontFill; /// Bootstrap icon for bus front. static IconData busFront; /// Bootstrap icon for ev front fill. static IconData evFrontFill; /// Bootstrap icon for ev front. static IconData evFront; /// Bootstrap icon for globe americas. static IconData globeAmericas; /// Bootstrap icon for globe asia australia. static IconData globeAsiaAustralia; /// Bootstrap icon for globe central south asia. static IconData globeCentralSouthAsia; /// Bootstrap icon for globe europe africa. static IconData globeEuropeAfrica; /// Bootstrap icon for house add fill. static IconData houseAddFill; /// Bootstrap icon for house add. static IconData houseAdd; /// Bootstrap icon for house check fill. static IconData houseCheckFill; /// Bootstrap icon for house check. static IconData houseCheck; /// Bootstrap icon for house dash fill. static IconData houseDashFill; /// Bootstrap icon for house dash. static IconData houseDash; /// Bootstrap icon for house down fill. static IconData houseDownFill; /// Bootstrap icon for house down. static IconData houseDown; /// Bootstrap icon for house exclamation fill. static IconData houseExclamationFill; /// Bootstrap icon for house exclamation. static IconData houseExclamation; /// Bootstrap icon for house gear fill. static IconData houseGearFill; /// Bootstrap icon for house gear. static IconData houseGear; /// Bootstrap icon for house lock fill. static IconData houseLockFill; /// Bootstrap icon for house lock. static IconData houseLock; /// Bootstrap icon for house slash fill. static IconData houseSlashFill; /// Bootstrap icon for house slash. static IconData houseSlash; /// Bootstrap icon for house up fill. static IconData houseUpFill; /// Bootstrap icon for house up. static IconData houseUp; /// Bootstrap icon for house x fill. static IconData houseXFill; /// Bootstrap icon for house x. static IconData houseX; /// Bootstrap icon for person add. static IconData personAdd; /// Bootstrap icon for person down. static IconData personDown; /// Bootstrap icon for person exclamation. static IconData personExclamation; /// Bootstrap icon for person fill add. static IconData personFillAdd; /// Bootstrap icon for person fill check. static IconData personFillCheck; /// Bootstrap icon for person fill dash. static IconData personFillDash; /// Bootstrap icon for person fill down. static IconData personFillDown; /// Bootstrap icon for person fill exclamation. static IconData personFillExclamation; /// Bootstrap icon for person fill gear. static IconData personFillGear; /// Bootstrap icon for person fill lock. static IconData personFillLock; /// Bootstrap icon for person fill slash. static IconData personFillSlash; /// Bootstrap icon for person fill up. static IconData personFillUp; /// Bootstrap icon for person fill x. static IconData personFillX; /// Bootstrap icon for person gear. static IconData personGear; /// Bootstrap icon for person lock. static IconData personLock; /// Bootstrap icon for person slash. static IconData personSlash; /// Bootstrap icon for person up. static IconData personUp; /// Bootstrap icon for scooter. static IconData scooter; /// Bootstrap icon for taxi front fill. static IconData taxiFrontFill; /// Bootstrap icon for taxi front. static IconData taxiFront; /// Bootstrap icon for amd. static IconData amd; /// Bootstrap icon for database add. static IconData databaseAdd; /// Bootstrap icon for database check. static IconData databaseCheck; /// Bootstrap icon for database dash. static IconData databaseDash; /// Bootstrap icon for database down. static IconData databaseDown; /// Bootstrap icon for database exclamation. static IconData databaseExclamation; /// Bootstrap icon for database fill add. static IconData databaseFillAdd; /// Bootstrap icon for database fill check. static IconData databaseFillCheck; /// Bootstrap icon for database fill dash. static IconData databaseFillDash; /// Bootstrap icon for database fill down. static IconData databaseFillDown; /// Bootstrap icon for database fill exclamation. static IconData databaseFillExclamation; /// Bootstrap icon for database fill gear. static IconData databaseFillGear; /// Bootstrap icon for database fill lock. static IconData databaseFillLock; /// Bootstrap icon for database fill slash. static IconData databaseFillSlash; /// Bootstrap icon for database fill up. static IconData databaseFillUp; /// Bootstrap icon for database fill x. static IconData databaseFillX; /// Bootstrap icon for database fill. static IconData databaseFill; /// Bootstrap icon for database gear. static IconData databaseGear; /// Bootstrap icon for database lock. static IconData databaseLock; /// Bootstrap icon for database slash. static IconData databaseSlash; /// Bootstrap icon for database up. static IconData databaseUp; /// Bootstrap icon for database x. static IconData databaseX; /// Bootstrap icon for database. static IconData database; /// Bootstrap icon for houses fill. static IconData housesFill; /// Bootstrap icon for houses. static IconData houses; /// Bootstrap icon for nvidia. static IconData nvidia; /// Bootstrap icon for person vcard fill. static IconData personVcardFill; /// Bootstrap icon for person vcard. static IconData personVcard; /// Bootstrap icon for sina weibo. static IconData sinaWeibo; /// Bootstrap icon for tencent qq. static IconData tencentQq; /// Bootstrap icon for wikipedia. static IconData wikipedia; /// Bootstrap icon for alphabet uppercase. static IconData alphabetUppercase; /// Bootstrap icon for alphabet. static IconData alphabet; /// Bootstrap icon for amazon. static IconData amazon; /// Bootstrap icon for arrows collapse vertical. static IconData arrowsCollapseVertical; /// Bootstrap icon for arrows expand vertical. static IconData arrowsExpandVertical; /// Bootstrap icon for arrows vertical. static IconData arrowsVertical; /// Bootstrap icon for arrows. static IconData arrows; /// Bootstrap icon for ban fill. static IconData banFill; /// Bootstrap icon for ban. static IconData ban; /// Bootstrap icon for bing. static IconData bing; /// Bootstrap icon for cake. static IconData cake; /// Bootstrap icon for cake2. static IconData cake2; /// Bootstrap icon for cookie. static IconData cookie; /// Bootstrap icon for copy. static IconData copy; /// Bootstrap icon for crosshair. static IconData crosshair; /// Bootstrap icon for crosshair2. static IconData crosshair2; /// Bootstrap icon for emoji astonished fill. static IconData emojiAstonishedFill; /// Bootstrap icon for emoji astonished. static IconData emojiAstonished; /// Bootstrap icon for emoji grimace fill. static IconData emojiGrimaceFill; /// Bootstrap icon for emoji grimace. static IconData emojiGrimace; /// Bootstrap icon for emoji grin fill. static IconData emojiGrinFill; /// Bootstrap icon for emoji grin. static IconData emojiGrin; /// Bootstrap icon for emoji surprise fill. static IconData emojiSurpriseFill; /// Bootstrap icon for emoji surprise. static IconData emojiSurprise; /// Bootstrap icon for emoji tear fill. static IconData emojiTearFill; /// Bootstrap icon for emoji tear. static IconData emojiTear; /// Bootstrap icon for envelope arrow down fill. static IconData envelopeArrowDownFill; /// Bootstrap icon for envelope arrow down. static IconData envelopeArrowDown; /// Bootstrap icon for envelope arrow up fill. static IconData envelopeArrowUpFill; /// Bootstrap icon for envelope arrow up. static IconData envelopeArrowUp; /// Bootstrap icon for feather. static IconData feather; /// Bootstrap icon for feather2. static IconData feather2; /// Bootstrap icon for floppy fill. static IconData floppyFill; /// Bootstrap icon for floppy. static IconData floppy; /// Bootstrap icon for floppy2 fill. static IconData floppy2Fill; /// Bootstrap icon for floppy2. static IconData floppy2; /// Bootstrap icon for gitlab. static IconData gitlab; /// Bootstrap icon for highlighter. static IconData highlighter; /// Bootstrap icon for marker tip. static IconData markerTip; /// Bootstrap icon for nvme fill. static IconData nvmeFill; /// Bootstrap icon for nvme. static IconData nvme; /// Bootstrap icon for opencollective. static IconData opencollective; /// Bootstrap icon for pci card network. static IconData pciCardNetwork; /// Bootstrap icon for pci card sound. static IconData pciCardSound; /// Bootstrap icon for radar. static IconData radar; /// Bootstrap icon for send arrow down fill. static IconData sendArrowDownFill; /// Bootstrap icon for send arrow down. static IconData sendArrowDown; /// Bootstrap icon for send arrow up fill. static IconData sendArrowUpFill; /// Bootstrap icon for send arrow up. static IconData sendArrowUp; /// Bootstrap icon for sim slash fill. static IconData simSlashFill; /// Bootstrap icon for sim slash. static IconData simSlash; /// Bootstrap icon for sourceforge. static IconData sourceforge; /// Bootstrap icon for substack. static IconData substack; /// Bootstrap icon for threads fill. static IconData threadsFill; /// Bootstrap icon for threads. static IconData threads; /// Bootstrap icon for transparency. static IconData transparency; /// Bootstrap icon for twitter x. static IconData twitterX; /// Bootstrap icon for type h4. static IconData typeH4; /// Bootstrap icon for type h5. static IconData typeH5; /// Bootstrap icon for type h6. static IconData typeH6; /// Bootstrap icon for backpack fill. static IconData backpackFill; /// Bootstrap icon for backpack. static IconData backpack; /// Bootstrap icon for backpack2 fill. static IconData backpack2Fill; /// Bootstrap icon for backpack2. static IconData backpack2; /// Bootstrap icon for backpack3 fill. static IconData backpack3Fill; /// Bootstrap icon for backpack3. static IconData backpack3; /// Bootstrap icon for backpack4 fill. static IconData backpack4Fill; /// Bootstrap icon for backpack4. static IconData backpack4; /// Bootstrap icon for brilliance. static IconData brilliance; /// Bootstrap icon for cake fill. static IconData cakeFill; /// Bootstrap icon for cake2 fill. static IconData cake2Fill; /// Bootstrap icon for duffle fill. static IconData duffleFill; /// Bootstrap icon for duffle. static IconData duffle; /// Bootstrap icon for exposure. static IconData exposure; /// Bootstrap icon for gender neuter. static IconData genderNeuter; /// Bootstrap icon for highlights. static IconData highlights; /// Bootstrap icon for luggage fill. static IconData luggageFill; /// Bootstrap icon for luggage. static IconData luggage; /// Bootstrap icon for mailbox flag. static IconData mailboxFlag; /// Bootstrap icon for mailbox2 flag. static IconData mailbox2Flag; /// Bootstrap icon for noise reduction. static IconData noiseReduction; /// Bootstrap icon for passport fill. static IconData passportFill; /// Bootstrap icon for passport. static IconData passport; /// Bootstrap icon for person arms up. static IconData personArmsUp; /// Bootstrap icon for person raised hand. static IconData personRaisedHand; /// Bootstrap icon for person standing dress. static IconData personStandingDress; /// Bootstrap icon for person standing. static IconData personStanding; /// Bootstrap icon for person walking. static IconData personWalking; /// Bootstrap icon for person wheelchair. static IconData personWheelchair; /// Bootstrap icon for shadows. static IconData shadows; /// Bootstrap icon for suitcase fill. static IconData suitcaseFill; /// Bootstrap icon for suitcase lg fill. static IconData suitcaseLgFill; /// Bootstrap icon for suitcase lg. static IconData suitcaseLg; /// Bootstrap icon for suitcase. static IconData suitcase; /// Bootstrap icon for suitcase2 fill. static IconData suitcase2Fill; /// Bootstrap icon for suitcase2. static IconData suitcase2; /// Bootstrap icon for vignette. static IconData vignette; } /// A collection of Lucide icons as Flutter IconData constants. /// /// Lucide is an open-source icon library that provides a wide range of /// carefully crafted icons for use in Flutter applications. /// /// Each icon is available as a static constant `IconData` that can be used /// directly with Flutter's `Icon` widget. /// /// Example: /// ```dart /// Icon( /// LucideIcons.heart, /// size: 24, /// color: Colors.red, /// ) /// ``` class LucideIcons { /// Lucide icon for 'A arrow down'. static IconData aArrowDown; /// Lucide icon for 'A arrow up'. static IconData aArrowUp; /// Lucide icon for 'A large small'. static IconData aLargeSmall; /// Lucide icon for 'accessibility'. static IconData accessibility; /// Lucide icon for 'activity'. static IconData activity; /// Lucide icon for 'air vent'. static IconData airVent; /// Lucide icon for 'airplay'. static IconData airplay; /// Lucide icon for 'alarm clock check'. static IconData alarmClockCheck; /// Lucide icon for 'alarm clock minus'. static IconData alarmClockMinus; /// Lucide icon for 'alarm clock off'. static IconData alarmClockOff; /// Lucide icon for 'alarm clock plus'. static IconData alarmClockPlus; /// Lucide icon for 'alarm clock'. static IconData alarmClock; /// Lucide icon for 'alarm smoke'. static IconData alarmSmoke; /// Lucide icon for 'album'. static IconData album; /// Lucide icon for 'align center horizontal'. static IconData alignCenterHorizontal; /// Lucide icon for 'align center vertical'. static IconData alignCenterVertical; /// Lucide icon for 'align center'. static IconData alignCenter; /// Lucide icon for 'align end horizontal'. static IconData alignEndHorizontal; /// Lucide icon for 'align end vertical'. static IconData alignEndVertical; /// Lucide icon for 'align horizontal distribute center'. static IconData alignHorizontalDistributeCenter; /// Lucide icon for 'align horizontal distribute end'. static IconData alignHorizontalDistributeEnd; /// Lucide icon for 'align horizontal distribute start'. static IconData alignHorizontalDistributeStart; /// Lucide icon for 'align horizontal justify center'. static IconData alignHorizontalJustifyCenter; /// Lucide icon for 'align horizontal justify end'. static IconData alignHorizontalJustifyEnd; /// Lucide icon for 'align horizontal justify start'. static IconData alignHorizontalJustifyStart; /// Lucide icon for 'align horizontal space around'. static IconData alignHorizontalSpaceAround; /// Lucide icon for 'align horizontal space between'. static IconData alignHorizontalSpaceBetween; /// Lucide icon for 'align justify'. static IconData alignJustify; /// Lucide icon for 'align left'. static IconData alignLeft; /// Lucide icon for 'align right'. static IconData alignRight; /// Lucide icon for 'align start horizontal'. static IconData alignStartHorizontal; /// Lucide icon for 'align start vertical'. static IconData alignStartVertical; /// Lucide icon for 'align vertical distribute center'. static IconData alignVerticalDistributeCenter; /// Lucide icon for 'align vertical distribute end'. static IconData alignVerticalDistributeEnd; /// Lucide icon for 'align vertical distribute start'. static IconData alignVerticalDistributeStart; /// Lucide icon for 'align vertical justify center'. static IconData alignVerticalJustifyCenter; /// Lucide icon for 'align vertical justify end'. static IconData alignVerticalJustifyEnd; /// Lucide icon for 'align vertical justify start'. static IconData alignVerticalJustifyStart; /// Lucide icon for 'align vertical space around'. static IconData alignVerticalSpaceAround; /// Lucide icon for 'align vertical space between'. static IconData alignVerticalSpaceBetween; /// Lucide icon for 'ambulance'. static IconData ambulance; /// Lucide icon for 'ampersand'. static IconData ampersand; /// Lucide icon for 'ampersands'. static IconData ampersands; /// Lucide icon for 'amphora'. static IconData amphora; /// Lucide icon for 'anchor'. static IconData anchor; /// Lucide icon for 'angry'. static IconData angry; /// Lucide icon for 'annoyed'. static IconData annoyed; /// Lucide icon for 'antenna'. static IconData antenna; /// Lucide icon for 'anvil'. static IconData anvil; /// Lucide icon for 'aperture'. static IconData aperture; /// Lucide icon for 'app window mac'. static IconData appWindowMac; /// Lucide icon for 'app window'. static IconData appWindow; /// Lucide icon for 'apple'. static IconData apple; /// Lucide icon for 'archive restore'. static IconData archiveRestore; /// Lucide icon for 'archive X'. static IconData archiveX; /// Lucide icon for 'archive'. static IconData archive; /// Lucide icon for 'armchair'. static IconData armchair; /// Lucide icon for 'arrow big down dash'. static IconData arrowBigDownDash; /// Lucide icon for 'arrow big down'. static IconData arrowBigDown; /// Lucide icon for 'arrow big left dash'. static IconData arrowBigLeftDash; /// Lucide icon for 'arrow big left'. static IconData arrowBigLeft; /// Lucide icon for 'arrow big right dash'. static IconData arrowBigRightDash; /// Lucide icon for 'arrow big right'. static IconData arrowBigRight; /// Lucide icon for 'arrow big up dash'. static IconData arrowBigUpDash; /// Lucide icon for 'arrow big up'. static IconData arrowBigUp; /// Lucide icon for 'arrow down 01'. static IconData arrowDown01; /// Lucide icon for 'arrow down 10'. static IconData arrowDown10; /// Lucide icon for 'arrow down A Z'. static IconData arrowDownAZ; /// Lucide icon for 'arrow down from line'. static IconData arrowDownFromLine; /// Lucide icon for 'arrow down left'. static IconData arrowDownLeft; /// Lucide icon for 'arrow down narrow wide'. static IconData arrowDownNarrowWide; /// Lucide icon for 'arrow down right'. static IconData arrowDownRight; /// Lucide icon for 'arrow down to dot'. static IconData arrowDownToDot; /// Lucide icon for 'arrow down to line'. static IconData arrowDownToLine; /// Lucide icon for 'arrow down up'. static IconData arrowDownUp; /// Lucide icon for 'arrow down wide narrow'. static IconData arrowDownWideNarrow; /// Lucide icon for 'arrow down Z A'. static IconData arrowDownZA; /// Lucide icon for 'arrow down'. static IconData arrowDown; /// Lucide icon for 'arrow left from line'. static IconData arrowLeftFromLine; /// Lucide icon for 'arrow left right'. static IconData arrowLeftRight; /// Lucide icon for 'arrow left to line'. static IconData arrowLeftToLine; /// Lucide icon for 'arrow left'. static IconData arrowLeft; /// Lucide icon for 'arrow right from line'. static IconData arrowRightFromLine; /// Lucide icon for 'arrow right left'. static IconData arrowRightLeft; /// Lucide icon for 'arrow right to line'. static IconData arrowRightToLine; /// Lucide icon for 'arrow right'. static IconData arrowRight; /// Lucide icon for 'arrow up 01'. static IconData arrowUp01; /// Lucide icon for 'arrow up 10'. static IconData arrowUp10; /// Lucide icon for 'arrow up A Z'. static IconData arrowUpAZ; /// Lucide icon for 'arrow up down'. static IconData arrowUpDown; /// Lucide icon for 'arrow up from dot'. static IconData arrowUpFromDot; /// Lucide icon for 'arrow up from line'. static IconData arrowUpFromLine; /// Lucide icon for 'arrow up left'. static IconData arrowUpLeft; /// Lucide icon for 'arrow up narrow wide'. static IconData arrowUpNarrowWide; /// Lucide icon for 'arrow up right'. static IconData arrowUpRight; /// Lucide icon for 'arrow up to line'. static IconData arrowUpToLine; /// Lucide icon for 'arrow up wide narrow'. static IconData arrowUpWideNarrow; /// Lucide icon for 'arrow up Z A'. static IconData arrowUpZA; /// Lucide icon for 'arrow up'. static IconData arrowUp; /// Lucide icon for 'arrows up from line'. static IconData arrowsUpFromLine; /// Lucide icon for 'asterisk'. static IconData asterisk; /// Lucide icon for 'at sign'. static IconData atSign; /// Lucide icon for 'atom'. static IconData atom; /// Lucide icon for 'audio lines'. static IconData audioLines; /// Lucide icon for 'audio waveform'. static IconData audioWaveform; /// Lucide icon for 'award'. static IconData award; /// Lucide icon for 'axe'. static IconData axe; /// Lucide icon for 'axis 3d'. static IconData axis3d; /// Lucide icon for 'baby'. static IconData baby; /// Lucide icon for 'backpack'. static IconData backpack; /// Lucide icon for 'badge alert'. static IconData badgeAlert; /// Lucide icon for 'badge cent'. static IconData badgeCent; /// Lucide icon for 'badge check'. static IconData badgeCheck; /// Lucide icon for 'badge dollar sign'. static IconData badgeDollarSign; /// Lucide icon for 'badge euro'. static IconData badgeEuro; /// Lucide icon for 'badge help'. static IconData badgeHelp; /// Lucide icon for 'badge indian rupee'. static IconData badgeIndianRupee; /// Lucide icon for 'badge info'. static IconData badgeInfo; /// Lucide icon for 'badge japanese yen'. static IconData badgeJapaneseYen; /// Lucide icon for 'badge minus'. static IconData badgeMinus; /// Lucide icon for 'badge percent'. static IconData badgePercent; /// Lucide icon for 'badge plus'. static IconData badgePlus; /// Lucide icon for 'badge pound sterling'. static IconData badgePoundSterling; /// Lucide icon for 'badge russian ruble'. static IconData badgeRussianRuble; /// Lucide icon for 'badge swiss franc'. static IconData badgeSwissFranc; /// Lucide icon for 'badge X'. static IconData badgeX; /// Lucide icon for 'badge'. static IconData badge; /// Lucide icon for 'baggage claim'. static IconData baggageClaim; /// Lucide icon for 'ban'. static IconData ban; /// Lucide icon for 'banana'. static IconData banana; /// Lucide icon for 'bandage'. static IconData bandage; /// Lucide icon for 'banknote'. static IconData banknote; /// Lucide icon for 'barcode'. static IconData barcode; /// Lucide icon for 'baseline'. static IconData baseline; /// Lucide icon for 'bath'. static IconData bath; /// Lucide icon for 'battery charging'. static IconData batteryCharging; /// Lucide icon for 'battery full'. static IconData batteryFull; /// Lucide icon for 'battery low'. static IconData batteryLow; /// Lucide icon for 'battery medium'. static IconData batteryMedium; /// Lucide icon for 'battery plus'. static IconData batteryPlus; /// Lucide icon for 'battery warning'. static IconData batteryWarning; /// Lucide icon for 'battery'. static IconData battery; /// Lucide icon for 'beaker'. static IconData beaker; /// Lucide icon for 'bean off'. static IconData beanOff; /// Lucide icon for 'bean'. static IconData bean; /// Lucide icon for 'bed double'. static IconData bedDouble; /// Lucide icon for 'bed single'. static IconData bedSingle; /// Lucide icon for 'bed'. static IconData bed; /// Lucide icon for 'beef'. static IconData beef; /// Lucide icon for 'beer off'. static IconData beerOff; /// Lucide icon for 'beer'. static IconData beer; /// Lucide icon for 'bell dot'. static IconData bellDot; /// Lucide icon for 'bell electric'. static IconData bellElectric; /// Lucide icon for 'bell minus'. static IconData bellMinus; /// Lucide icon for 'bell off'. static IconData bellOff; /// Lucide icon for 'bell plus'. static IconData bellPlus; /// Lucide icon for 'bell ring'. static IconData bellRing; /// Lucide icon for 'bell'. static IconData bell; /// Lucide icon for 'between horizontal end'. static IconData betweenHorizontalEnd; /// Lucide icon for 'between horizontal start'. static IconData betweenHorizontalStart; /// Lucide icon for 'between vertical end'. static IconData betweenVerticalEnd; /// Lucide icon for 'between vertical start'. static IconData betweenVerticalStart; /// Lucide icon for 'biceps flexed'. static IconData bicepsFlexed; /// Lucide icon for 'bike'. static IconData bike; /// Lucide icon for 'binary'. static IconData binary; /// Lucide icon for 'binoculars'. static IconData binoculars; /// Lucide icon for 'biohazard'. static IconData biohazard; /// Lucide icon for 'bird'. static IconData bird; /// Lucide icon for 'bitcoin'. static IconData bitcoin; /// Lucide icon for 'blend'. static IconData blend; /// Lucide icon for 'blinds'. static IconData blinds; /// Lucide icon for 'blocks'. static IconData blocks; /// Lucide icon for 'bluetooth connected'. static IconData bluetoothConnected; /// Lucide icon for 'bluetooth off'. static IconData bluetoothOff; /// Lucide icon for 'bluetooth searching'. static IconData bluetoothSearching; /// Lucide icon for 'bluetooth'. static IconData bluetooth; /// Lucide icon for 'bold'. static IconData bold; /// Lucide icon for 'bolt'. static IconData bolt; /// Lucide icon for 'bomb'. static IconData bomb; /// Lucide icon for 'bone'. static IconData bone; /// Lucide icon for 'book A'. static IconData bookA; /// Lucide icon for 'book audio'. static IconData bookAudio; /// Lucide icon for 'book check'. static IconData bookCheck; /// Lucide icon for 'book copy'. static IconData bookCopy; /// Lucide icon for 'book dashed'. static IconData bookDashed; /// Lucide icon for 'book down'. static IconData bookDown; /// Lucide icon for 'book headphones'. static IconData bookHeadphones; /// Lucide icon for 'book heart'. static IconData bookHeart; /// Lucide icon for 'book image'. static IconData bookImage; /// Lucide icon for 'book key'. static IconData bookKey; /// Lucide icon for 'book lock'. static IconData bookLock; /// Lucide icon for 'book marked'. static IconData bookMarked; /// Lucide icon for 'book minus'. static IconData bookMinus; /// Lucide icon for 'book open check'. static IconData bookOpenCheck; /// Lucide icon for 'book open text'. static IconData bookOpenText; /// Lucide icon for 'book open'. static IconData bookOpen; /// Lucide icon for 'book plus'. static IconData bookPlus; /// Lucide icon for 'book text'. static IconData bookText; /// Lucide icon for 'book type'. static IconData bookType; /// Lucide icon for 'book up 2'. static IconData bookUp2; /// Lucide icon for 'book up'. static IconData bookUp; /// Lucide icon for 'book user'. static IconData bookUser; /// Lucide icon for 'book X'. static IconData bookX; /// Lucide icon for 'book'. static IconData book; /// Lucide icon for 'bookmark check'. static IconData bookmarkCheck; /// Lucide icon for 'bookmark minus'. static IconData bookmarkMinus; /// Lucide icon for 'bookmark plus'. static IconData bookmarkPlus; /// Lucide icon for 'bookmark X'. static IconData bookmarkX; /// Lucide icon for 'bookmark'. static IconData bookmark; /// Lucide icon for 'boom box'. static IconData boomBox; /// Lucide icon for 'bot message square'. static IconData botMessageSquare; /// Lucide icon for 'bot off'. static IconData botOff; /// Lucide icon for 'bot'. static IconData bot; /// Lucide icon for 'box'. static IconData box; /// Lucide icon for 'boxes'. static IconData boxes; /// Lucide icon for 'braces'. static IconData braces; /// Lucide icon for 'brackets'. static IconData brackets; /// Lucide icon for 'brain circuit'. static IconData brainCircuit; /// Lucide icon for 'brain cog'. static IconData brainCog; /// Lucide icon for 'brain'. static IconData brain; /// Lucide icon for 'brick wall'. static IconData brickWall; /// Lucide icon for 'briefcase business'. static IconData briefcaseBusiness; /// Lucide icon for 'briefcase conveyor belt'. static IconData briefcaseConveyorBelt; /// Lucide icon for 'briefcase medical'. static IconData briefcaseMedical; /// Lucide icon for 'briefcase'. static IconData briefcase; /// Lucide icon for 'bring to front'. static IconData bringToFront; /// Lucide icon for 'brush'. static IconData brush; /// Lucide icon for 'bug off'. static IconData bugOff; /// Lucide icon for 'bug play'. static IconData bugPlay; /// Lucide icon for 'bug'. static IconData bug; /// Lucide icon for 'building 2'. static IconData building2; /// Lucide icon for 'building'. static IconData building; /// Lucide icon for 'bus front'. static IconData busFront; /// Lucide icon for 'bus'. static IconData bus; /// Lucide icon for 'cable car'. static IconData cableCar; /// Lucide icon for 'cable'. static IconData cable; /// Lucide icon for 'cake slice'. static IconData cakeSlice; /// Lucide icon for 'cake'. static IconData cake; /// Lucide icon for 'calculator'. static IconData calculator; /// Lucide icon for 'calendar 1'. static IconData calendar1; /// Lucide icon for 'calendar arrow down'. static IconData calendarArrowDown; /// Lucide icon for 'calendar arrow up'. static IconData calendarArrowUp; /// Lucide icon for 'calendar check 2'. static IconData calendarCheck2; /// Lucide icon for 'calendar check'. static IconData calendarCheck; /// Lucide icon for 'calendar clock'. static IconData calendarClock; /// Lucide icon for 'calendar cog'. static IconData calendarCog; /// Lucide icon for 'calendar days'. static IconData calendarDays; /// Lucide icon for 'calendar fold'. static IconData calendarFold; /// Lucide icon for 'calendar heart'. static IconData calendarHeart; /// Lucide icon for 'calendar minus 2'. static IconData calendarMinus2; /// Lucide icon for 'calendar minus'. static IconData calendarMinus; /// Lucide icon for 'calendar off'. static IconData calendarOff; /// Lucide icon for 'calendar plus 2'. static IconData calendarPlus2; /// Lucide icon for 'calendar plus'. static IconData calendarPlus; /// Lucide icon for 'calendar range'. static IconData calendarRange; /// Lucide icon for 'calendar search'. static IconData calendarSearch; /// Lucide icon for 'calendar sync'. static IconData calendarSync; /// Lucide icon for 'calendar X 2'. static IconData calendarX2; /// Lucide icon for 'calendar X'. static IconData calendarX; /// Lucide icon for 'calendar'. static IconData calendar; /// Lucide icon for 'camera off'. static IconData cameraOff; /// Lucide icon for 'camera'. static IconData camera; /// Lucide icon for 'candy cane'. static IconData candyCane; /// Lucide icon for 'candy off'. static IconData candyOff; /// Lucide icon for 'candy'. static IconData candy; /// Lucide icon for 'cannabis'. static IconData cannabis; /// Lucide icon for 'captions off'. static IconData captionsOff; /// Lucide icon for 'captions'. static IconData captions; /// Lucide icon for 'car front'. static IconData carFront; /// Lucide icon for 'car taxi front'. static IconData carTaxiFront; /// Lucide icon for 'car'. static IconData car; /// Lucide icon for 'caravan'. static IconData caravan; /// Lucide icon for 'carrot'. static IconData carrot; /// Lucide icon for 'case lower'. static IconData caseLower; /// Lucide icon for 'case sensitive'. static IconData caseSensitive; /// Lucide icon for 'case upper'. static IconData caseUpper; /// Lucide icon for 'cassette tape'. static IconData cassetteTape; /// Lucide icon for 'cast'. static IconData cast; /// Lucide icon for 'castle'. static IconData castle; /// Lucide icon for 'cat'. static IconData cat; /// Lucide icon for 'cctv'. static IconData cctv; /// Lucide icon for 'chart area'. static IconData chartArea; /// Lucide icon for 'chart bar big'. static IconData chartBarBig; /// Lucide icon for 'chart bar decreasing'. static IconData chartBarDecreasing; /// Lucide icon for 'chart bar increasing'. static IconData chartBarIncreasing; /// Lucide icon for 'chart bar stacked'. static IconData chartBarStacked; /// Lucide icon for 'chart bar'. static IconData chartBar; /// Lucide icon for 'chart candlestick'. static IconData chartCandlestick; /// Lucide icon for 'chart column big'. static IconData chartColumnBig; /// Lucide icon for 'chart column decreasing'. static IconData chartColumnDecreasing; /// Lucide icon for 'chart column increasing'. static IconData chartColumnIncreasing; /// Lucide icon for 'chart column stacked'. static IconData chartColumnStacked; /// Lucide icon for 'chart column'. static IconData chartColumn; /// Lucide icon for 'chart gantt'. static IconData chartGantt; /// Lucide icon for 'chart line'. static IconData chartLine; /// Lucide icon for 'chart network'. static IconData chartNetwork; /// Lucide icon for 'chart no axes column decreasing'. static IconData chartNoAxesColumnDecreasing; /// Lucide icon for 'chart no axes column increasing'. static IconData chartNoAxesColumnIncreasing; /// Lucide icon for 'chart no axes column'. static IconData chartNoAxesColumn; /// Lucide icon for 'chart no axes combined'. static IconData chartNoAxesCombined; /// Lucide icon for 'chart no axes gantt'. static IconData chartNoAxesGantt; /// Lucide icon for 'chart pie'. static IconData chartPie; /// Lucide icon for 'chart scatter'. static IconData chartScatter; /// Lucide icon for 'chart spline'. static IconData chartSpline; /// Lucide icon for 'check check'. static IconData checkCheck; /// Lucide icon for 'check'. static IconData check; /// Lucide icon for 'chef hat'. static IconData chefHat; /// Lucide icon for 'cherry'. static IconData cherry; /// Lucide icon for 'chevron down'. static IconData chevronDown; /// Lucide icon for 'chevron first'. static IconData chevronFirst; /// Lucide icon for 'chevron last'. static IconData chevronLast; /// Lucide icon for 'chevron left'. static IconData chevronLeft; /// Lucide icon for 'chevron right'. static IconData chevronRight; /// Lucide icon for 'chevron up'. static IconData chevronUp; /// Lucide icon for 'chevrons down up'. static IconData chevronsDownUp; /// Lucide icon for 'chevrons down'. static IconData chevronsDown; /// Lucide icon for 'chevrons left right ellipsis'. static IconData chevronsLeftRightEllipsis; /// Lucide icon for 'chevrons left right'. static IconData chevronsLeftRight; /// Lucide icon for 'chevrons left'. static IconData chevronsLeft; /// Lucide icon for 'chevrons right left'. static IconData chevronsRightLeft; /// Lucide icon for 'chevrons right'. static IconData chevronsRight; /// Lucide icon for 'chevrons up down'. static IconData chevronsUpDown; /// Lucide icon for 'chevrons up'. static IconData chevronsUp; /// Lucide icon for 'chrome'. static IconData chrome; /// Lucide icon for 'church'. static IconData church; /// Lucide icon for 'cigarette off'. static IconData cigaretteOff; /// Lucide icon for 'cigarette'. static IconData cigarette; /// Lucide icon for 'circle alert'. static IconData circleAlert; /// Lucide icon for 'circle arrow down'. static IconData circleArrowDown; /// Lucide icon for 'circle arrow left'. static IconData circleArrowLeft; /// Lucide icon for 'circle arrow out down left'. static IconData circleArrowOutDownLeft; /// Lucide icon for 'circle arrow out down right'. static IconData circleArrowOutDownRight; /// Lucide icon for 'circle arrow out up left'. static IconData circleArrowOutUpLeft; /// Lucide icon for 'circle arrow out up right'. static IconData circleArrowOutUpRight; /// Lucide icon for 'circle arrow right'. static IconData circleArrowRight; /// Lucide icon for 'circle arrow up'. static IconData circleArrowUp; /// Lucide icon for 'circle check big'. static IconData circleCheckBig; /// Lucide icon for 'circle check'. static IconData circleCheck; /// Lucide icon for 'circle chevron down'. static IconData circleChevronDown; /// Lucide icon for 'circle chevron left'. static IconData circleChevronLeft; /// Lucide icon for 'circle chevron right'. static IconData circleChevronRight; /// Lucide icon for 'circle chevron up'. static IconData circleChevronUp; /// Lucide icon for 'circle dashed'. static IconData circleDashed; /// Lucide icon for 'circle divide'. static IconData circleDivide; /// Lucide icon for 'circle dollar sign'. static IconData circleDollarSign; /// Lucide icon for 'circle dot dashed'. static IconData circleDotDashed; /// Lucide icon for 'circle dot'. static IconData circleDot; /// Lucide icon for 'circle ellipsis'. static IconData circleEllipsis; /// Lucide icon for 'circle equal'. static IconData circleEqual; /// Lucide icon for 'circle fading arrow up'. static IconData circleFadingArrowUp; /// Lucide icon for 'circle fading plus'. static IconData circleFadingPlus; /// Lucide icon for 'circle gauge'. static IconData circleGauge; /// Lucide icon for 'circle help'. static IconData circleHelp; /// Lucide icon for 'circle minus'. static IconData circleMinus; /// Lucide icon for 'circle off'. static IconData circleOff; /// Lucide icon for 'circle parking off'. static IconData circleParkingOff; /// Lucide icon for 'circle parking'. static IconData circleParking; /// Lucide icon for 'circle pause'. static IconData circlePause; /// Lucide icon for 'circle percent'. static IconData circlePercent; /// Lucide icon for 'circle play'. static IconData circlePlay; /// Lucide icon for 'circle plus'. static IconData circlePlus; /// Lucide icon for 'circle power'. static IconData circlePower; /// Lucide icon for 'circle slash 2'. static IconData circleSlash2; /// Lucide icon for 'circle slash'. static IconData circleSlash; /// Lucide icon for 'circle small'. static IconData circleSmall; /// Lucide icon for 'circle stop'. static IconData circleStop; /// Lucide icon for 'circle user round'. static IconData circleUserRound; /// Lucide icon for 'circle user'. static IconData circleUser; /// Lucide icon for 'circle X'. static IconData circleX; /// Lucide icon for 'circle'. static IconData circle; /// Lucide icon for 'circuit board'. static IconData circuitBoard; /// Lucide icon for 'citrus'. static IconData citrus; /// Lucide icon for 'clapperboard'. static IconData clapperboard; /// Lucide icon for 'clipboard check'. static IconData clipboardCheck; /// Lucide icon for 'clipboard copy'. static IconData clipboardCopy; /// Lucide icon for 'clipboard list'. static IconData clipboardList; /// Lucide icon for 'clipboard minus'. static IconData clipboardMinus; /// Lucide icon for 'clipboard paste'. static IconData clipboardPaste; /// Lucide icon for 'clipboard pen line'. static IconData clipboardPenLine; /// Lucide icon for 'clipboard pen'. static IconData clipboardPen; /// Lucide icon for 'clipboard plus'. static IconData clipboardPlus; /// Lucide icon for 'clipboard type'. static IconData clipboardType; /// Lucide icon for 'clipboard X'. static IconData clipboardX; /// Lucide icon for 'clipboard'. static IconData clipboard; /// Lucide icon for 'clock 1'. static IconData clock1; /// Lucide icon for 'clock 10'. static IconData clock10; /// Lucide icon for 'clock 11'. static IconData clock11; /// Lucide icon for 'clock 12'. static IconData clock12; /// Lucide icon for 'clock 2'. static IconData clock2; /// Lucide icon for 'clock 3'. static IconData clock3; /// Lucide icon for 'clock 4'. static IconData clock4; /// Lucide icon for 'clock 5'. static IconData clock5; /// Lucide icon for 'clock 6'. static IconData clock6; /// Lucide icon for 'clock 7'. static IconData clock7; /// Lucide icon for 'clock 8'. static IconData clock8; /// Lucide icon for 'clock 9'. static IconData clock9; /// Lucide icon for 'clock alert'. static IconData clockAlert; /// Lucide icon for 'clock arrow down'. static IconData clockArrowDown; /// Lucide icon for 'clock arrow up'. static IconData clockArrowUp; /// Lucide icon for 'clock'. static IconData clock; /// Lucide icon for 'cloud alert'. static IconData cloudAlert; /// Lucide icon for 'cloud cog'. static IconData cloudCog; /// Lucide icon for 'cloud download'. static IconData cloudDownload; /// Lucide icon for 'cloud drizzle'. static IconData cloudDrizzle; /// Lucide icon for 'cloud fog'. static IconData cloudFog; /// Lucide icon for 'cloud hail'. static IconData cloudHail; /// Lucide icon for 'cloud lightning'. static IconData cloudLightning; /// Lucide icon for 'cloud moon rain'. static IconData cloudMoonRain; /// Lucide icon for 'cloud moon'. static IconData cloudMoon; /// Lucide icon for 'cloud off'. static IconData cloudOff; /// Lucide icon for 'cloud rain wind'. static IconData cloudRainWind; /// Lucide icon for 'cloud rain'. static IconData cloudRain; /// Lucide icon for 'cloud snow'. static IconData cloudSnow; /// Lucide icon for 'cloud sun rain'. static IconData cloudSunRain; /// Lucide icon for 'cloud sun'. static IconData cloudSun; /// Lucide icon for 'cloud upload'. static IconData cloudUpload; /// Lucide icon for 'cloud'. static IconData cloud; /// Lucide icon for 'cloudy'. static IconData cloudy; /// Lucide icon for 'clover'. static IconData clover; /// Lucide icon for 'club'. static IconData club; /// Lucide icon for 'code xml'. static IconData codeXml; /// Lucide icon for 'code'. static IconData code; /// Lucide icon for 'codepen'. static IconData codepen; /// Lucide icon for 'codesandbox'. static IconData codesandbox; /// Lucide icon for 'coffee'. static IconData coffee; /// Lucide icon for 'cog'. static IconData cog; /// Lucide icon for 'coins'. static IconData coins; /// Lucide icon for 'columns 2'. static IconData columns2; /// Lucide icon for 'columns 3'. static IconData columns3; /// Lucide icon for 'columns 4'. static IconData columns4; /// Lucide icon for 'combine'. static IconData combine; /// Lucide icon for 'command'. static IconData command; /// Lucide icon for 'compass'. static IconData compass; /// Lucide icon for 'component'. static IconData component; /// Lucide icon for 'computer'. static IconData computer; /// Lucide icon for 'concierge bell'. static IconData conciergeBell; /// Lucide icon for 'cone'. static IconData cone; /// Lucide icon for 'construction'. static IconData construction; /// Lucide icon for 'contact round'. static IconData contactRound; /// Lucide icon for 'contact'. static IconData contact; /// Lucide icon for 'container'. static IconData container; /// Lucide icon for 'contrast'. static IconData contrast; /// Lucide icon for 'cookie'. static IconData cookie; /// Lucide icon for 'cooking pot'. static IconData cookingPot; /// Lucide icon for 'copy check'. static IconData copyCheck; /// Lucide icon for 'copy minus'. static IconData copyMinus; /// Lucide icon for 'copy plus'. static IconData copyPlus; /// Lucide icon for 'copy slash'. static IconData copySlash; /// Lucide icon for 'copy X'. static IconData copyX; /// Lucide icon for 'copy'. static IconData copy; /// Lucide icon for 'copyleft'. static IconData copyleft; /// Lucide icon for 'copyright'. static IconData copyright; /// Lucide icon for 'corner down left'. static IconData cornerDownLeft; /// Lucide icon for 'corner down right'. static IconData cornerDownRight; /// Lucide icon for 'corner left down'. static IconData cornerLeftDown; /// Lucide icon for 'corner left up'. static IconData cornerLeftUp; /// Lucide icon for 'corner right down'. static IconData cornerRightDown; /// Lucide icon for 'corner right up'. static IconData cornerRightUp; /// Lucide icon for 'corner up left'. static IconData cornerUpLeft; /// Lucide icon for 'corner up right'. static IconData cornerUpRight; /// Lucide icon for 'cpu'. static IconData cpu; /// Lucide icon for 'creative commons'. static IconData creativeCommons; /// Lucide icon for 'credit card'. static IconData creditCard; /// Lucide icon for 'croissant'. static IconData croissant; /// Lucide icon for 'crop'. static IconData crop; /// Lucide icon for 'cross'. static IconData cross; /// Lucide icon for 'crosshair'. static IconData crosshair; /// Lucide icon for 'crown'. static IconData crown; /// Lucide icon for 'cuboid'. static IconData cuboid; /// Lucide icon for 'cup soda'. static IconData cupSoda; /// Lucide icon for 'currency'. static IconData currency; /// Lucide icon for 'cylinder'. static IconData cylinder; /// Lucide icon for 'dam'. static IconData dam; /// Lucide icon for 'database backup'. static IconData databaseBackup; /// Lucide icon for 'database zap'. static IconData databaseZap; /// Lucide icon for 'database'. static IconData database; /// Lucide icon for 'delete'. static IconData delete; /// Lucide icon for 'dessert'. static IconData dessert; /// Lucide icon for 'diameter'. static IconData diameter; /// Lucide icon for 'diamond minus'. static IconData diamondMinus; /// Lucide icon for 'diamond percent'. static IconData diamondPercent; /// Lucide icon for 'diamond plus'. static IconData diamondPlus; /// Lucide icon for 'diamond'. static IconData diamond; /// Lucide icon for 'dice 1'. static IconData dice1; /// Lucide icon for 'dice 2'. static IconData dice2; /// Lucide icon for 'dice 3'. static IconData dice3; /// Lucide icon for 'dice 4'. static IconData dice4; /// Lucide icon for 'dice 5'. static IconData dice5; /// Lucide icon for 'dice 6'. static IconData dice6; /// Lucide icon for 'dices'. static IconData dices; /// Lucide icon for 'diff'. static IconData diff; /// Lucide icon for 'disc 2'. static IconData disc2; /// Lucide icon for 'disc 3'. static IconData disc3; /// Lucide icon for 'disc album'. static IconData discAlbum; /// Lucide icon for 'disc'. static IconData disc; /// Lucide icon for 'divide'. static IconData divide; /// Lucide icon for 'dna off'. static IconData dnaOff; /// Lucide icon for 'dna'. static IconData dna; /// Lucide icon for 'dock'. static IconData dock; /// Lucide icon for 'dog'. static IconData dog; /// Lucide icon for 'dollar sign'. static IconData dollarSign; /// Lucide icon for 'donut'. static IconData donut; /// Lucide icon for 'door closed'. static IconData doorClosed; /// Lucide icon for 'door open'. static IconData doorOpen; /// Lucide icon for 'dot'. static IconData dot; /// Lucide icon for 'download'. static IconData download; /// Lucide icon for 'drafting compass'. static IconData draftingCompass; /// Lucide icon for 'drama'. static IconData drama; /// Lucide icon for 'dribbble'. static IconData dribbble; /// Lucide icon for 'drill'. static IconData drill; /// Lucide icon for 'droplet off'. static IconData dropletOff; /// Lucide icon for 'droplet'. static IconData droplet; /// Lucide icon for 'droplets'. static IconData droplets; /// Lucide icon for 'drum'. static IconData drum; /// Lucide icon for 'drumstick'. static IconData drumstick; /// Lucide icon for 'dumbbell'. static IconData dumbbell; /// Lucide icon for 'ear off'. static IconData earOff; /// Lucide icon for 'ear'. static IconData ear; /// Lucide icon for 'earth lock'. static IconData earthLock; /// Lucide icon for 'earth'. static IconData earth; /// Lucide icon for 'eclipse'. static IconData eclipse; /// Lucide icon for 'egg fried'. static IconData eggFried; /// Lucide icon for 'egg off'. static IconData eggOff; /// Lucide icon for 'egg'. static IconData egg; /// Lucide icon for 'ellipsis vertical'. static IconData ellipsisVertical; /// Lucide icon for 'ellipsis'. static IconData ellipsis; /// Lucide icon for 'equal approximately'. static IconData equalApproximately; /// Lucide icon for 'equal not'. static IconData equalNot; /// Lucide icon for 'equal'. static IconData equal; /// Lucide icon for 'eraser'. static IconData eraser; /// Lucide icon for 'ethernet port'. static IconData ethernetPort; /// Lucide icon for 'euro'. static IconData euro; /// Lucide icon for 'expand'. static IconData expand; /// Lucide icon for 'external link'. static IconData externalLink; /// Lucide icon for 'eye closed'. static IconData eyeClosed; /// Lucide icon for 'eye off'. static IconData eyeOff; /// Lucide icon for 'eye'. static IconData eye; /// Lucide icon for 'facebook'. static IconData facebook; /// Lucide icon for 'factory'. static IconData factory; /// Lucide icon for 'fan'. static IconData fan; /// Lucide icon for 'fast forward'. static IconData fastForward; /// Lucide icon for 'feather'. static IconData feather; /// Lucide icon for 'fence'. static IconData fence; /// Lucide icon for 'ferris wheel'. static IconData ferrisWheel; /// Lucide icon for 'figma'. static IconData figma; /// Lucide icon for 'file archive'. static IconData fileArchive; /// Lucide icon for 'file audio 2'. static IconData fileAudio2; /// Lucide icon for 'file audio'. static IconData fileAudio; /// Lucide icon for 'file axis 3d'. static IconData fileAxis3d; /// Lucide icon for 'file badge 2'. static IconData fileBadge2; /// Lucide icon for 'file badge'. static IconData fileBadge; /// Lucide icon for 'file box'. static IconData fileBox; /// Lucide icon for 'file chart column increasing'. static IconData fileChartColumnIncreasing; /// Lucide icon for 'file chart column'. static IconData fileChartColumn; /// Lucide icon for 'file chart line'. static IconData fileChartLine; /// Lucide icon for 'file chart pie'. static IconData fileChartPie; /// Lucide icon for 'file check 2'. static IconData fileCheck2; /// Lucide icon for 'file check'. static IconData fileCheck; /// Lucide icon for 'file clock'. static IconData fileClock; /// Lucide icon for 'file code 2'. static IconData fileCode2; /// Lucide icon for 'file code'. static IconData fileCode; /// Lucide icon for 'file cog'. static IconData fileCog; /// Lucide icon for 'file diff'. static IconData fileDiff; /// Lucide icon for 'file digit'. static IconData fileDigit; /// Lucide icon for 'file down'. static IconData fileDown; /// Lucide icon for 'file heart'. static IconData fileHeart; /// Lucide icon for 'file image'. static IconData fileImage; /// Lucide icon for 'file input'. static IconData fileInput; /// Lucide icon for 'file json 2'. static IconData fileJson2; /// Lucide icon for 'file json'. static IconData fileJson; /// Lucide icon for 'file key 2'. static IconData fileKey2; /// Lucide icon for 'file key'. static IconData fileKey; /// Lucide icon for 'file lock 2'. static IconData fileLock2; /// Lucide icon for 'file lock'. static IconData fileLock; /// Lucide icon for 'file minus 2'. static IconData fileMinus2; /// Lucide icon for 'file minus'. static IconData fileMinus; /// Lucide icon for 'file music'. static IconData fileMusic; /// Lucide icon for 'file output'. static IconData fileOutput; /// Lucide icon for 'file pen line'. static IconData filePenLine; /// Lucide icon for 'file pen'. static IconData filePen; /// Lucide icon for 'file plus 2'. static IconData filePlus2; /// Lucide icon for 'file plus'. static IconData filePlus; /// Lucide icon for 'file question'. static IconData fileQuestion; /// Lucide icon for 'file scan'. static IconData fileScan; /// Lucide icon for 'file search 2'. static IconData fileSearch2; /// Lucide icon for 'file search'. static IconData fileSearch; /// Lucide icon for 'file sliders'. static IconData fileSliders; /// Lucide icon for 'file spreadsheet'. static IconData fileSpreadsheet; /// Lucide icon for 'file stack'. static IconData fileStack; /// Lucide icon for 'file symlink'. static IconData fileSymlink; /// Lucide icon for 'file terminal'. static IconData fileTerminal; /// Lucide icon for 'file text'. static IconData fileText; /// Lucide icon for 'file type 2'. static IconData fileType2; /// Lucide icon for 'file type'. static IconData fileType; /// Lucide icon for 'file up'. static IconData fileUp; /// Lucide icon for 'file user'. static IconData fileUser; /// Lucide icon for 'file video 2'. static IconData fileVideo2; /// Lucide icon for 'file video'. static IconData fileVideo; /// Lucide icon for 'file volume 2'. static IconData fileVolume2; /// Lucide icon for 'file volume'. static IconData fileVolume; /// Lucide icon for 'file warning'. static IconData fileWarning; /// Lucide icon for 'file X 2'. static IconData fileX2; /// Lucide icon for 'file X'. static IconData fileX; /// Lucide icon for 'file'. static IconData file; /// Lucide icon for 'files'. static IconData files; /// Lucide icon for 'film'. static IconData film; /// Lucide icon for 'filter X'. static IconData filterX; /// Lucide icon for 'filter'. static IconData filter; /// Lucide icon for 'fingerprint'. static IconData fingerprint; /// Lucide icon for 'fire extinguisher'. static IconData fireExtinguisher; /// Lucide icon for 'fish off'. static IconData fishOff; /// Lucide icon for 'fish symbol'. static IconData fishSymbol; /// Lucide icon for 'fish'. static IconData fish; /// Lucide icon for 'flag off'. static IconData flagOff; /// Lucide icon for 'flag triangle left'. static IconData flagTriangleLeft; /// Lucide icon for 'flag triangle right'. static IconData flagTriangleRight; /// Lucide icon for 'flag'. static IconData flag; /// Lucide icon for 'flame kindling'. static IconData flameKindling; /// Lucide icon for 'flame'. static IconData flame; /// Lucide icon for 'flashlight off'. static IconData flashlightOff; /// Lucide icon for 'flashlight'. static IconData flashlight; /// Lucide icon for 'flask conical off'. static IconData flaskConicalOff; /// Lucide icon for 'flask conical'. static IconData flaskConical; /// Lucide icon for 'flask round'. static IconData flaskRound; /// Lucide icon for 'flip horizontal 2'. static IconData flipHorizontal2; /// Lucide icon for 'flip horizontal'. static IconData flipHorizontal; /// Lucide icon for 'flip vertical 2'. static IconData flipVertical2; /// Lucide icon for 'flip vertical'. static IconData flipVertical; /// Lucide icon for 'flower 2'. static IconData flower2; /// Lucide icon for 'flower'. static IconData flower; /// Lucide icon for 'focus'. static IconData focus; /// Lucide icon for 'fold horizontal'. static IconData foldHorizontal; /// Lucide icon for 'fold vertical'. static IconData foldVertical; /// Lucide icon for 'folder archive'. static IconData folderArchive; /// Lucide icon for 'folder check'. static IconData folderCheck; /// Lucide icon for 'folder clock'. static IconData folderClock; /// Lucide icon for 'folder closed'. static IconData folderClosed; /// Lucide icon for 'folder code'. static IconData folderCode; /// Lucide icon for 'folder cog'. static IconData folderCog; /// Lucide icon for 'folder dot'. static IconData folderDot; /// Lucide icon for 'folder down'. static IconData folderDown; /// Lucide icon for 'folder git 2'. static IconData folderGit2; /// Lucide icon for 'folder git'. static IconData folderGit; /// Lucide icon for 'folder heart'. static IconData folderHeart; /// Lucide icon for 'folder input'. static IconData folderInput; /// Lucide icon for 'folder kanban'. static IconData folderKanban; /// Lucide icon for 'folder key'. static IconData folderKey; /// Lucide icon for 'folder lock'. static IconData folderLock; /// Lucide icon for 'folder minus'. static IconData folderMinus; /// Lucide icon for 'folder open dot'. static IconData folderOpenDot; /// Lucide icon for 'folder open'. static IconData folderOpen; /// Lucide icon for 'folder output'. static IconData folderOutput; /// Lucide icon for 'folder pen'. static IconData folderPen; /// Lucide icon for 'folder plus'. static IconData folderPlus; /// Lucide icon for 'folder root'. static IconData folderRoot; /// Lucide icon for 'folder search 2'. static IconData folderSearch2; /// Lucide icon for 'folder search'. static IconData folderSearch; /// Lucide icon for 'folder symlink'. static IconData folderSymlink; /// Lucide icon for 'folder sync'. static IconData folderSync; /// Lucide icon for 'folder tree'. static IconData folderTree; /// Lucide icon for 'folder up'. static IconData folderUp; /// Lucide icon for 'folder X'. static IconData folderX; /// Lucide icon for 'folder'. static IconData folder; /// Lucide icon for 'folders'. static IconData folders; /// Lucide icon for 'footprints'. static IconData footprints; /// Lucide icon for 'forklift'. static IconData forklift; /// Lucide icon for 'forward'. static IconData forward; /// Lucide icon for 'frame'. static IconData frame; /// Lucide icon for 'framer'. static IconData framer; /// Lucide icon for 'frown'. static IconData frown; /// Lucide icon for 'fuel'. static IconData fuel; /// Lucide icon for 'fullscreen'. static IconData fullscreen; /// Lucide icon for 'gallery horizontal end'. static IconData galleryHorizontalEnd; /// Lucide icon for 'gallery horizontal'. static IconData galleryHorizontal; /// Lucide icon for 'gallery thumbnails'. static IconData galleryThumbnails; /// Lucide icon for 'gallery vertical end'. static IconData galleryVerticalEnd; /// Lucide icon for 'gallery vertical'. static IconData galleryVertical; /// Lucide icon for 'gamepad 2'. static IconData gamepad2; /// Lucide icon for 'gamepad'. static IconData gamepad; /// Lucide icon for 'gauge'. static IconData gauge; /// Lucide icon for 'gavel'. static IconData gavel; /// Lucide icon for 'gem'. static IconData gem; /// Lucide icon for 'ghost'. static IconData ghost; /// Lucide icon for 'gift'. static IconData gift; /// Lucide icon for 'git branch plus'. static IconData gitBranchPlus; /// Lucide icon for 'git branch'. static IconData gitBranch; /// Lucide icon for 'git commit horizontal'. static IconData gitCommitHorizontal; /// Lucide icon for 'git commit vertical'. static IconData gitCommitVertical; /// Lucide icon for 'git compare arrows'. static IconData gitCompareArrows; /// Lucide icon for 'git compare'. static IconData gitCompare; /// Lucide icon for 'git fork'. static IconData gitFork; /// Lucide icon for 'git graph'. static IconData gitGraph; /// Lucide icon for 'git merge'. static IconData gitMerge; /// Lucide icon for 'git pull request arrow'. static IconData gitPullRequestArrow; /// Lucide icon for 'git pull request closed'. static IconData gitPullRequestClosed; /// Lucide icon for 'git pull request create arrow'. static IconData gitPullRequestCreateArrow; /// Lucide icon for 'git pull request create'. static IconData gitPullRequestCreate; /// Lucide icon for 'git pull request draft'. static IconData gitPullRequestDraft; /// Lucide icon for 'git pull request'. static IconData gitPullRequest; /// Lucide icon for 'github'. static IconData github; /// Lucide icon for 'gitlab'. static IconData gitlab; /// Lucide icon for 'glass water'. static IconData glassWater; /// Lucide icon for 'glasses'. static IconData glasses; /// Lucide icon for 'globe lock'. static IconData globeLock; /// Lucide icon for 'globe'. static IconData globe; /// Lucide icon for 'goal'. static IconData goal; /// Lucide icon for 'grab'. static IconData grab; /// Lucide icon for 'graduation cap'. static IconData graduationCap; /// Lucide icon for 'grape'. static IconData grape; /// Lucide icon for 'grid 2x 2 check'. static IconData grid2x2Check; /// Lucide icon for 'grid 2x 2 plus'. static IconData grid2x2Plus; /// Lucide icon for 'grid 2x 2 X'. static IconData grid2x2X; /// Lucide icon for 'grid 2x 2'. static IconData grid2x2; /// Lucide icon for 'grid 3x 3'. static IconData grid3x3; /// Lucide icon for 'grip horizontal'. static IconData gripHorizontal; /// Lucide icon for 'grip vertical'. static IconData gripVertical; /// Lucide icon for 'grip'. static IconData grip; /// Lucide icon for 'group'. static IconData group; /// Lucide icon for 'guitar'. static IconData guitar; /// Lucide icon for 'ham'. static IconData ham; /// Lucide icon for 'hammer'. static IconData hammer; /// Lucide icon for 'hand coins'. static IconData handCoins; /// Lucide icon for 'hand heart'. static IconData handHeart; /// Lucide icon for 'hand helping'. static IconData handHelping; /// Lucide icon for 'hand metal'. static IconData handMetal; /// Lucide icon for 'hand platter'. static IconData handPlatter; /// Lucide icon for 'hand'. static IconData hand; /// Lucide icon for 'handshake'. static IconData handshake; /// Lucide icon for 'hard drive download'. static IconData hardDriveDownload; /// Lucide icon for 'hard drive upload'. static IconData hardDriveUpload; /// Lucide icon for 'hard drive'. static IconData hardDrive; /// Lucide icon for 'hard hat'. static IconData hardHat; /// Lucide icon for 'hash'. static IconData hash; /// Lucide icon for 'haze'. static IconData haze; /// Lucide icon for 'hdmi port'. static IconData hdmiPort; /// Lucide icon for 'heading 1'. static IconData heading1; /// Lucide icon for 'heading 2'. static IconData heading2; /// Lucide icon for 'heading 3'. static IconData heading3; /// Lucide icon for 'heading 4'. static IconData heading4; /// Lucide icon for 'heading 5'. static IconData heading5; /// Lucide icon for 'heading 6'. static IconData heading6; /// Lucide icon for 'heading'. static IconData heading; /// Lucide icon for 'headphone off'. static IconData headphoneOff; /// Lucide icon for 'headphones'. static IconData headphones; /// Lucide icon for 'headset'. static IconData headset; /// Lucide icon for 'heart crack'. static IconData heartCrack; /// Lucide icon for 'heart handshake'. static IconData heartHandshake; /// Lucide icon for 'heart off'. static IconData heartOff; /// Lucide icon for 'heart pulse'. static IconData heartPulse; /// Lucide icon for 'heart'. static IconData heart; /// Lucide icon for 'heater'. static IconData heater; /// Lucide icon for 'hexagon'. static IconData hexagon; /// Lucide icon for 'highlighter'. static IconData highlighter; /// Lucide icon for 'history'. static IconData history; /// Lucide icon for 'hop off'. static IconData hopOff; /// Lucide icon for 'hop'. static IconData hop; /// Lucide icon for 'hospital'. static IconData hospital; /// Lucide icon for 'hotel'. static IconData hotel; /// Lucide icon for 'hourglass'. static IconData hourglass; /// Lucide icon for 'house plug'. static IconData housePlug; /// Lucide icon for 'house plus'. static IconData housePlus; /// Lucide icon for 'house wifi'. static IconData houseWifi; /// Lucide icon for 'house'. static IconData house; /// Lucide icon for 'ice cream bowl'. static IconData iceCreamBowl; /// Lucide icon for 'ice cream cone'. static IconData iceCreamCone; /// Lucide icon for 'id card'. static IconData idCard; /// Lucide icon for 'image down'. static IconData imageDown; /// Lucide icon for 'image minus'. static IconData imageMinus; /// Lucide icon for 'image off'. static IconData imageOff; /// Lucide icon for 'image play'. static IconData imagePlay; /// Lucide icon for 'image plus'. static IconData imagePlus; /// Lucide icon for 'image up'. static IconData imageUp; /// Lucide icon for 'image upscale'. static IconData imageUpscale; /// Lucide icon for 'image'. static IconData image; /// Lucide icon for 'images'. static IconData images; /// Lucide icon for 'import'. static IconData import; /// Lucide icon for 'inbox'. static IconData inbox; /// Lucide icon for 'indent decrease'. static IconData indentDecrease; /// Lucide icon for 'indent increase'. static IconData indentIncrease; /// Lucide icon for 'indian rupee'. static IconData indianRupee; /// Lucide icon for 'infinity'. static IconData infinity; /// Lucide icon for 'info'. static IconData info; /// Lucide icon for 'inspection panel'. static IconData inspectionPanel; /// Lucide icon for 'instagram'. static IconData instagram; /// Lucide icon for 'italic'. static IconData italic; /// Lucide icon for 'iteration ccw'. static IconData iterationCcw; /// Lucide icon for 'iteration cw'. static IconData iterationCw; /// Lucide icon for 'japanese yen'. static IconData japaneseYen; /// Lucide icon for 'joystick'. static IconData joystick; /// Lucide icon for 'kanban'. static IconData kanban; /// Lucide icon for 'key round'. static IconData keyRound; /// Lucide icon for 'key square'. static IconData keySquare; /// Lucide icon for 'key'. static IconData key; /// Lucide icon for 'keyboard music'. static IconData keyboardMusic; /// Lucide icon for 'keyboard off'. static IconData keyboardOff; /// Lucide icon for 'keyboard'. static IconData keyboard; /// Lucide icon for 'lamp ceiling'. static IconData lampCeiling; /// Lucide icon for 'lamp desk'. static IconData lampDesk; /// Lucide icon for 'lamp floor'. static IconData lampFloor; /// Lucide icon for 'lamp wall down'. static IconData lampWallDown; /// Lucide icon for 'lamp wall up'. static IconData lampWallUp; /// Lucide icon for 'lamp'. static IconData lamp; /// Lucide icon for 'land plot'. static IconData landPlot; /// Lucide icon for 'landmark'. static IconData landmark; /// Lucide icon for 'languages'. static IconData languages; /// Lucide icon for 'laptop minimal check'. static IconData laptopMinimalCheck; /// Lucide icon for 'laptop minimal'. static IconData laptopMinimal; /// Lucide icon for 'laptop'. static IconData laptop; /// Lucide icon for 'lasso select'. static IconData lassoSelect; /// Lucide icon for 'lasso'. static IconData lasso; /// Lucide icon for 'laugh'. static IconData laugh; /// Lucide icon for 'layers 2'. static IconData layers2; /// Lucide icon for 'layers'. static IconData layers; /// Lucide icon for 'layout dashboard'. static IconData layoutDashboard; /// Lucide icon for 'layout grid'. static IconData layoutGrid; /// Lucide icon for 'layout list'. static IconData layoutList; /// Lucide icon for 'layout panel left'. static IconData layoutPanelLeft; /// Lucide icon for 'layout panel top'. static IconData layoutPanelTop; /// Lucide icon for 'layout template'. static IconData layoutTemplate; /// Lucide icon for 'leaf'. static IconData leaf; /// Lucide icon for 'leafy green'. static IconData leafyGreen; /// Lucide icon for 'lectern'. static IconData lectern; /// Lucide icon for 'letter text'. static IconData letterText; /// Lucide icon for 'library big'. static IconData libraryBig; /// Lucide icon for 'library'. static IconData library; /// Lucide icon for 'life buoy'. static IconData lifeBuoy; /// Lucide icon for 'ligature'. static IconData ligature; /// Lucide icon for 'lightbulb off'. static IconData lightbulbOff; /// Lucide icon for 'lightbulb'. static IconData lightbulb; /// Lucide icon for 'link 2 off'. static IconData link2Off; /// Lucide icon for 'link 2'. static IconData link2; /// Lucide icon for 'link'. static IconData link; /// Lucide icon for 'linkedin'. static IconData linkedin; /// Lucide icon for 'list check'. static IconData listCheck; /// Lucide icon for 'list checks'. static IconData listChecks; /// Lucide icon for 'list collapse'. static IconData listCollapse; /// Lucide icon for 'list end'. static IconData listEnd; /// Lucide icon for 'list filter plus'. static IconData listFilterPlus; /// Lucide icon for 'list filter'. static IconData listFilter; /// Lucide icon for 'list minus'. static IconData listMinus; /// Lucide icon for 'list music'. static IconData listMusic; /// Lucide icon for 'list ordered'. static IconData listOrdered; /// Lucide icon for 'list plus'. static IconData listPlus; /// Lucide icon for 'list restart'. static IconData listRestart; /// Lucide icon for 'list start'. static IconData listStart; /// Lucide icon for 'list todo'. static IconData listTodo; /// Lucide icon for 'list tree'. static IconData listTree; /// Lucide icon for 'list video'. static IconData listVideo; /// Lucide icon for 'list X'. static IconData listX; /// Lucide icon for 'list'. static IconData list; /// Lucide icon for 'loader circle'. static IconData loaderCircle; /// Lucide icon for 'loader pinwheel'. static IconData loaderPinwheel; /// Lucide icon for 'loader'. static IconData loader; /// Lucide icon for 'locate fixed'. static IconData locateFixed; /// Lucide icon for 'locate off'. static IconData locateOff; /// Lucide icon for 'locate'. static IconData locate; /// Lucide icon for 'lock keyhole open'. static IconData lockKeyholeOpen; /// Lucide icon for 'lock keyhole'. static IconData lockKeyhole; /// Lucide icon for 'lock open'. static IconData lockOpen; /// Lucide icon for 'lock'. static IconData lock; /// Lucide icon for 'log in'. static IconData logIn; /// Lucide icon for 'log out'. static IconData logOut; /// Lucide icon for 'logs'. static IconData logs; /// Lucide icon for 'lollipop'. static IconData lollipop; /// Lucide icon for 'luggage'. static IconData luggage; /// Lucide icon for 'magnet'. static IconData magnet; /// Lucide icon for 'mail check'. static IconData mailCheck; /// Lucide icon for 'mail minus'. static IconData mailMinus; /// Lucide icon for 'mail open'. static IconData mailOpen; /// Lucide icon for 'mail plus'. static IconData mailPlus; /// Lucide icon for 'mail question'. static IconData mailQuestion; /// Lucide icon for 'mail search'. static IconData mailSearch; /// Lucide icon for 'mail warning'. static IconData mailWarning; /// Lucide icon for 'mail X'. static IconData mailX; /// Lucide icon for 'mail'. static IconData mail; /// Lucide icon for 'mailbox'. static IconData mailbox; /// Lucide icon for 'mails'. static IconData mails; /// Lucide icon for 'map pin check inside'. static IconData mapPinCheckInside; /// Lucide icon for 'map pin check'. static IconData mapPinCheck; /// Lucide icon for 'map pin house'. static IconData mapPinHouse; /// Lucide icon for 'map pin minus inside'. static IconData mapPinMinusInside; /// Lucide icon for 'map pin minus'. static IconData mapPinMinus; /// Lucide icon for 'map pin off'. static IconData mapPinOff; /// Lucide icon for 'map pin plus inside'. static IconData mapPinPlusInside; /// Lucide icon for 'map pin plus'. static IconData mapPinPlus; /// Lucide icon for 'map pin X inside'. static IconData mapPinXInside; /// Lucide icon for 'map pin X'. static IconData mapPinX; /// Lucide icon for 'map pin'. static IconData mapPin; /// Lucide icon for 'map pinned'. static IconData mapPinned; /// Lucide icon for 'map plus'. static IconData mapPlus; /// Lucide icon for 'map'. static IconData map; /// Lucide icon for 'mars stroke'. static IconData marsStroke; /// Lucide icon for 'mars'. static IconData mars; /// Lucide icon for 'martini'. static IconData martini; /// Lucide icon for 'maximize 2'. static IconData maximize2; /// Lucide icon for 'maximize'. static IconData maximize; /// Lucide icon for 'medal'. static IconData medal; /// Lucide icon for 'megaphone off'. static IconData megaphoneOff; /// Lucide icon for 'megaphone'. static IconData megaphone; /// Lucide icon for 'meh'. static IconData meh; /// Lucide icon for 'memory stick'. static IconData memoryStick; /// Lucide icon for 'menu'. static IconData menu; /// Lucide icon for 'merge'. static IconData merge; /// Lucide icon for 'message circle code'. static IconData messageCircleCode; /// Lucide icon for 'message circle dashed'. static IconData messageCircleDashed; /// Lucide icon for 'message circle heart'. static IconData messageCircleHeart; /// Lucide icon for 'message circle more'. static IconData messageCircleMore; /// Lucide icon for 'message circle off'. static IconData messageCircleOff; /// Lucide icon for 'message circle plus'. static IconData messageCirclePlus; /// Lucide icon for 'message circle question'. static IconData messageCircleQuestion; /// Lucide icon for 'message circle reply'. static IconData messageCircleReply; /// Lucide icon for 'message circle warning'. static IconData messageCircleWarning; /// Lucide icon for 'message circle X'. static IconData messageCircleX; /// Lucide icon for 'message circle'. static IconData messageCircle; /// Lucide icon for 'message square code'. static IconData messageSquareCode; /// Lucide icon for 'message square dashed'. static IconData messageSquareDashed; /// Lucide icon for 'message square diff'. static IconData messageSquareDiff; /// Lucide icon for 'message square dot'. static IconData messageSquareDot; /// Lucide icon for 'message square heart'. static IconData messageSquareHeart; /// Lucide icon for 'message square lock'. static IconData messageSquareLock; /// Lucide icon for 'message square more'. static IconData messageSquareMore; /// Lucide icon for 'message square off'. static IconData messageSquareOff; /// Lucide icon for 'message square plus'. static IconData messageSquarePlus; /// Lucide icon for 'message square quote'. static IconData messageSquareQuote; /// Lucide icon for 'message square reply'. static IconData messageSquareReply; /// Lucide icon for 'message square share'. static IconData messageSquareShare; /// Lucide icon for 'message square text'. static IconData messageSquareText; /// Lucide icon for 'message square warning'. static IconData messageSquareWarning; /// Lucide icon for 'message square X'. static IconData messageSquareX; /// Lucide icon for 'message square'. static IconData messageSquare; /// Lucide icon for 'messages square'. static IconData messagesSquare; /// Lucide icon for 'mic off'. static IconData micOff; /// Lucide icon for 'mic vocal'. static IconData micVocal; /// Lucide icon for 'mic'. static IconData mic; /// Lucide icon for 'microchip'. static IconData microchip; /// Lucide icon for 'microscope'. static IconData microscope; /// Lucide icon for 'microwave'. static IconData microwave; /// Lucide icon for 'milestone'. static IconData milestone; /// Lucide icon for 'milk off'. static IconData milkOff; /// Lucide icon for 'milk'. static IconData milk; /// Lucide icon for 'minimize 2'. static IconData minimize2; /// Lucide icon for 'minimize'. static IconData minimize; /// Lucide icon for 'minus'. static IconData minus; /// Lucide icon for 'monitor check'. static IconData monitorCheck; /// Lucide icon for 'monitor cog'. static IconData monitorCog; /// Lucide icon for 'monitor dot'. static IconData monitorDot; /// Lucide icon for 'monitor down'. static IconData monitorDown; /// Lucide icon for 'monitor off'. static IconData monitorOff; /// Lucide icon for 'monitor pause'. static IconData monitorPause; /// Lucide icon for 'monitor play'. static IconData monitorPlay; /// Lucide icon for 'monitor smartphone'. static IconData monitorSmartphone; /// Lucide icon for 'monitor speaker'. static IconData monitorSpeaker; /// Lucide icon for 'monitor stop'. static IconData monitorStop; /// Lucide icon for 'monitor up'. static IconData monitorUp; /// Lucide icon for 'monitor X'. static IconData monitorX; /// Lucide icon for 'monitor'. static IconData monitor; /// Lucide icon for 'moon star'. static IconData moonStar; /// Lucide icon for 'moon'. static IconData moon; /// Lucide icon for 'mountain snow'. static IconData mountainSnow; /// Lucide icon for 'mountain'. static IconData mountain; /// Lucide icon for 'mouse off'. static IconData mouseOff; /// Lucide icon for 'mouse pointer 2'. static IconData mousePointer2; /// Lucide icon for 'mouse pointer ban'. static IconData mousePointerBan; /// Lucide icon for 'mouse pointer click'. static IconData mousePointerClick; /// Lucide icon for 'mouse pointer'. static IconData mousePointer; /// Lucide icon for 'mouse'. static IconData mouse; /// Lucide icon for 'move 3d'. static IconData move3d; /// Lucide icon for 'move diagonal 2'. static IconData moveDiagonal2; /// Lucide icon for 'move diagonal'. static IconData moveDiagonal; /// Lucide icon for 'move down left'. static IconData moveDownLeft; /// Lucide icon for 'move down right'. static IconData moveDownRight; /// Lucide icon for 'move down'. static IconData moveDown; /// Lucide icon for 'move horizontal'. static IconData moveHorizontal; /// Lucide icon for 'move left'. static IconData moveLeft; /// Lucide icon for 'move right'. static IconData moveRight; /// Lucide icon for 'move up left'. static IconData moveUpLeft; /// Lucide icon for 'move up right'. static IconData moveUpRight; /// Lucide icon for 'move up'. static IconData moveUp; /// Lucide icon for 'move vertical'. static IconData moveVertical; /// Lucide icon for 'move'. static IconData move; /// Lucide icon for 'music 2'. static IconData music2; /// Lucide icon for 'music 3'. static IconData music3; /// Lucide icon for 'music 4'. static IconData music4; /// Lucide icon for 'music'. static IconData music; /// Lucide icon for 'navigation 2 off'. static IconData navigation2Off; /// Lucide icon for 'navigation 2'. static IconData navigation2; /// Lucide icon for 'navigation off'. static IconData navigationOff; /// Lucide icon for 'navigation'. static IconData navigation; /// Lucide icon for 'network'. static IconData network; /// Lucide icon for 'newspaper'. static IconData newspaper; /// Lucide icon for 'nfc'. static IconData nfc; /// Lucide icon for 'non binary'. static IconData nonBinary; /// Lucide icon for 'notebook pen'. static IconData notebookPen; /// Lucide icon for 'notebook tabs'. static IconData notebookTabs; /// Lucide icon for 'notebook text'. static IconData notebookText; /// Lucide icon for 'notebook'. static IconData notebook; /// Lucide icon for 'notepad text dashed'. static IconData notepadTextDashed; /// Lucide icon for 'notepad text'. static IconData notepadText; /// Lucide icon for 'nut off'. static IconData nutOff; /// Lucide icon for 'nut'. static IconData nut; /// Lucide icon for 'octagon alert'. static IconData octagonAlert; /// Lucide icon for 'octagon minus'. static IconData octagonMinus; /// Lucide icon for 'octagon pause'. static IconData octagonPause; /// Lucide icon for 'octagon X'. static IconData octagonX; /// Lucide icon for 'octagon'. static IconData octagon; /// Lucide icon for 'omega'. static IconData omega; /// Lucide icon for 'option'. static IconData option; /// Lucide icon for 'orbit'. static IconData orbit; /// Lucide icon for 'origami'. static IconData origami; /// Lucide icon for 'package 2'. static IconData package2; /// Lucide icon for 'package check'. static IconData packageCheck; /// Lucide icon for 'package minus'. static IconData packageMinus; /// Lucide icon for 'package open'. static IconData packageOpen; /// Lucide icon for 'package plus'. static IconData packagePlus; /// Lucide icon for 'package search'. static IconData packageSearch; /// Lucide icon for 'package X'. static IconData packageX; /// Lucide icon for 'package'. static IconData package; /// Lucide icon for 'paint bucket'. static IconData paintBucket; /// Lucide icon for 'paint roller'. static IconData paintRoller; /// Lucide icon for 'paintbrush vertical'. static IconData paintbrushVertical; /// Lucide icon for 'paintbrush'. static IconData paintbrush; /// Lucide icon for 'palette'. static IconData palette; /// Lucide icon for 'panel bottom close'. static IconData panelBottomClose; /// Lucide icon for 'panel bottom dashed'. static IconData panelBottomDashed; /// Lucide icon for 'panel bottom open'. static IconData panelBottomOpen; /// Lucide icon for 'panel bottom'. static IconData panelBottom; /// Lucide icon for 'panel left close'. static IconData panelLeftClose; /// Lucide icon for 'panel left dashed'. static IconData panelLeftDashed; /// Lucide icon for 'panel left open'. static IconData panelLeftOpen; /// Lucide icon for 'panel left'. static IconData panelLeft; /// Lucide icon for 'panel right close'. static IconData panelRightClose; /// Lucide icon for 'panel right dashed'. static IconData panelRightDashed; /// Lucide icon for 'panel right open'. static IconData panelRightOpen; /// Lucide icon for 'panel right'. static IconData panelRight; /// Lucide icon for 'panel top close'. static IconData panelTopClose; /// Lucide icon for 'panel top dashed'. static IconData panelTopDashed; /// Lucide icon for 'panel top open'. static IconData panelTopOpen; /// Lucide icon for 'panel top'. static IconData panelTop; /// Lucide icon for 'panels left bottom'. static IconData panelsLeftBottom; /// Lucide icon for 'panels right bottom'. static IconData panelsRightBottom; /// Lucide icon for 'panels top left'. static IconData panelsTopLeft; /// Lucide icon for 'paperclip'. static IconData paperclip; /// Lucide icon for 'parentheses'. static IconData parentheses; /// Lucide icon for 'parking meter'. static IconData parkingMeter; /// Lucide icon for 'party popper'. static IconData partyPopper; /// Lucide icon for 'pause'. static IconData pause; /// Lucide icon for 'paw print'. static IconData pawPrint; /// Lucide icon for 'pc case'. static IconData pcCase; /// Lucide icon for 'pen line'. static IconData penLine; /// Lucide icon for 'pen off'. static IconData penOff; /// Lucide icon for 'pen tool'. static IconData penTool; /// Lucide icon for 'pen'. static IconData pen; /// Lucide icon for 'pencil line'. static IconData pencilLine; /// Lucide icon for 'pencil off'. static IconData pencilOff; /// Lucide icon for 'pencil ruler'. static IconData pencilRuler; /// Lucide icon for 'pencil'. static IconData pencil; /// Lucide icon for 'pentagon'. static IconData pentagon; /// Lucide icon for 'percent'. static IconData percent; /// Lucide icon for 'person standing'. static IconData personStanding; /// Lucide icon for 'philippine peso'. static IconData philippinePeso; /// Lucide icon for 'phone call'. static IconData phoneCall; /// Lucide icon for 'phone forwarded'. static IconData phoneForwarded; /// Lucide icon for 'phone incoming'. static IconData phoneIncoming; /// Lucide icon for 'phone missed'. static IconData phoneMissed; /// Lucide icon for 'phone off'. static IconData phoneOff; /// Lucide icon for 'phone outgoing'. static IconData phoneOutgoing; /// Lucide icon for 'phone'. static IconData phone; /// Lucide icon for 'pi'. static IconData pi; /// Lucide icon for 'piano'. static IconData piano; /// Lucide icon for 'pickaxe'. static IconData pickaxe; /// Lucide icon for 'picture in picture 2'. static IconData pictureInPicture2; /// Lucide icon for 'picture in picture'. static IconData pictureInPicture; /// Lucide icon for 'piggy bank'. static IconData piggyBank; /// Lucide icon for 'pilcrow left'. static IconData pilcrowLeft; /// Lucide icon for 'pilcrow right'. static IconData pilcrowRight; /// Lucide icon for 'pilcrow'. static IconData pilcrow; /// Lucide icon for 'pill bottle'. static IconData pillBottle; /// Lucide icon for 'pill'. static IconData pill; /// Lucide icon for 'pin off'. static IconData pinOff; /// Lucide icon for 'pin'. static IconData pin; /// Lucide icon for 'pipette'. static IconData pipette; /// Lucide icon for 'pizza'. static IconData pizza; /// Lucide icon for 'plane landing'. static IconData planeLanding; /// Lucide icon for 'plane takeoff'. static IconData planeTakeoff; /// Lucide icon for 'plane'. static IconData plane; /// Lucide icon for 'play'. static IconData play; /// Lucide icon for 'plug 2'. static IconData plug2; /// Lucide icon for 'plug zap'. static IconData plugZap; /// Lucide icon for 'plug'. static IconData plug; /// Lucide icon for 'plus'. static IconData plus; /// Lucide icon for 'pocket knife'. static IconData pocketKnife; /// Lucide icon for 'pocket'. static IconData pocket; /// Lucide icon for 'podcast'. static IconData podcast; /// Lucide icon for 'pointer off'. static IconData pointerOff; /// Lucide icon for 'pointer'. static IconData pointer; /// Lucide icon for 'popcorn'. static IconData popcorn; /// Lucide icon for 'popsicle'. static IconData popsicle; /// Lucide icon for 'pound sterling'. static IconData poundSterling; /// Lucide icon for 'power off'. static IconData powerOff; /// Lucide icon for 'power'. static IconData power; /// Lucide icon for 'presentation'. static IconData presentation; /// Lucide icon for 'printer check'. static IconData printerCheck; /// Lucide icon for 'printer'. static IconData printer; /// Lucide icon for 'projector'. static IconData projector; /// Lucide icon for 'proportions'. static IconData proportions; /// Lucide icon for 'puzzle'. static IconData puzzle; /// Lucide icon for 'pyramid'. static IconData pyramid; /// Lucide icon for 'qr code'. static IconData qrCode; /// Lucide icon for 'quote'. static IconData quote; /// Lucide icon for 'rabbit'. static IconData rabbit; /// Lucide icon for 'radar'. static IconData radar; /// Lucide icon for 'radiation'. static IconData radiation; /// Lucide icon for 'radical'. static IconData radical; /// Lucide icon for 'radio receiver'. static IconData radioReceiver; /// Lucide icon for 'radio tower'. static IconData radioTower; /// Lucide icon for 'radio'. static IconData radio; /// Lucide icon for 'radius'. static IconData radius; /// Lucide icon for 'rail symbol'. static IconData railSymbol; /// Lucide icon for 'rainbow'. static IconData rainbow; /// Lucide icon for 'rat'. static IconData rat; /// Lucide icon for 'ratio'. static IconData ratio; /// Lucide icon for 'receipt cent'. static IconData receiptCent; /// Lucide icon for 'receipt euro'. static IconData receiptEuro; /// Lucide icon for 'receipt indian rupee'. static IconData receiptIndianRupee; /// Lucide icon for 'receipt japanese yen'. static IconData receiptJapaneseYen; /// Lucide icon for 'receipt pound sterling'. static IconData receiptPoundSterling; /// Lucide icon for 'receipt russian ruble'. static IconData receiptRussianRuble; /// Lucide icon for 'receipt swiss franc'. static IconData receiptSwissFranc; /// Lucide icon for 'receipt text'. static IconData receiptText; /// Lucide icon for 'receipt'. static IconData receipt; /// Lucide icon for 'rectangle ellipsis'. static IconData rectangleEllipsis; /// Lucide icon for 'rectangle horizontal'. static IconData rectangleHorizontal; /// Lucide icon for 'rectangle vertical'. static IconData rectangleVertical; /// Lucide icon for 'recycle'. static IconData recycle; /// Lucide icon for 'redo 2'. static IconData redo2; /// Lucide icon for 'redo dot'. static IconData redoDot; /// Lucide icon for 'redo'. static IconData redo; /// Lucide icon for 'refresh ccw dot'. static IconData refreshCcwDot; /// Lucide icon for 'refresh ccw'. static IconData refreshCcw; /// Lucide icon for 'refresh cw off'. static IconData refreshCwOff; /// Lucide icon for 'refresh cw'. static IconData refreshCw; /// Lucide icon for 'refrigerator'. static IconData refrigerator; /// Lucide icon for 'regex'. static IconData regex; /// Lucide icon for 'remove formatting'. static IconData removeFormatting; /// Lucide icon for 'repeat 1'. static IconData repeat1; /// Lucide icon for 'repeat 2'. static IconData repeat2; /// Lucide icon for 'repeat'. static IconData repeat; /// Lucide icon for 'replace all'. static IconData replaceAll; /// Lucide icon for 'replace'. static IconData replace; /// Lucide icon for 'reply all'. static IconData replyAll; /// Lucide icon for 'reply'. static IconData reply; /// Lucide icon for 'rewind'. static IconData rewind; /// Lucide icon for 'ribbon'. static IconData ribbon; /// Lucide icon for 'rocket'. static IconData rocket; /// Lucide icon for 'rocking chair'. static IconData rockingChair; /// Lucide icon for 'roller coaster'. static IconData rollerCoaster; /// Lucide icon for 'rotate 3d'. static IconData rotate3d; /// Lucide icon for 'rotate ccw square'. static IconData rotateCcwSquare; /// Lucide icon for 'rotate ccw'. static IconData rotateCcw; /// Lucide icon for 'rotate cw square'. static IconData rotateCwSquare; /// Lucide icon for 'rotate cw'. static IconData rotateCw; /// Lucide icon for 'route off'. static IconData routeOff; /// Lucide icon for 'route'. static IconData route; /// Lucide icon for 'router'. static IconData router; /// Lucide icon for 'rows 2'. static IconData rows2; /// Lucide icon for 'rows 3'. static IconData rows3; /// Lucide icon for 'rows 4'. static IconData rows4; /// Lucide icon for 'rss'. static IconData rss; /// Lucide icon for 'ruler'. static IconData ruler; /// Lucide icon for 'russian ruble'. static IconData russianRuble; /// Lucide icon for 'sailboat'. static IconData sailboat; /// Lucide icon for 'salad'. static IconData salad; /// Lucide icon for 'sandwich'. static IconData sandwich; /// Lucide icon for 'satellite dish'. static IconData satelliteDish; /// Lucide icon for 'satellite'. static IconData satellite; /// Lucide icon for 'save all'. static IconData saveAll; /// Lucide icon for 'save off'. static IconData saveOff; /// Lucide icon for 'save'. static IconData save; /// Lucide icon for 'scale 3d'. static IconData scale3d; /// Lucide icon for 'scale'. static IconData scale; /// Lucide icon for 'scaling'. static IconData scaling; /// Lucide icon for 'scan barcode'. static IconData scanBarcode; /// Lucide icon for 'scan eye'. static IconData scanEye; /// Lucide icon for 'scan face'. static IconData scanFace; /// Lucide icon for 'scan heart'. static IconData scanHeart; /// Lucide icon for 'scan line'. static IconData scanLine; /// Lucide icon for 'scan qr code'. static IconData scanQrCode; /// Lucide icon for 'scan search'. static IconData scanSearch; /// Lucide icon for 'scan text'. static IconData scanText; /// Lucide icon for 'scan'. static IconData scan; /// Lucide icon for 'school'. static IconData school; /// Lucide icon for 'scissors line dashed'. static IconData scissorsLineDashed; /// Lucide icon for 'scissors'. static IconData scissors; /// Lucide icon for 'screen share off'. static IconData screenShareOff; /// Lucide icon for 'screen share'. static IconData screenShare; /// Lucide icon for 'scroll text'. static IconData scrollText; /// Lucide icon for 'scroll'. static IconData scroll; /// Lucide icon for 'search check'. static IconData searchCheck; /// Lucide icon for 'search code'. static IconData searchCode; /// Lucide icon for 'search slash'. static IconData searchSlash; /// Lucide icon for 'search X'. static IconData searchX; /// Lucide icon for 'search'. static IconData search; /// Lucide icon for 'section'. static IconData section; /// Lucide icon for 'send horizontal'. static IconData sendHorizontal; /// Lucide icon for 'send to back'. static IconData sendToBack; /// Lucide icon for 'send'. static IconData send; /// Lucide icon for 'separator horizontal'. static IconData separatorHorizontal; /// Lucide icon for 'separator vertical'. static IconData separatorVertical; /// Lucide icon for 'server cog'. static IconData serverCog; /// Lucide icon for 'server crash'. static IconData serverCrash; /// Lucide icon for 'server off'. static IconData serverOff; /// Lucide icon for 'server'. static IconData server; /// Lucide icon for 'settings 2'. static IconData settings2; /// Lucide icon for 'settings'. static IconData settings; /// Lucide icon for 'shapes'. static IconData shapes; /// Lucide icon for 'share 2'. static IconData share2; /// Lucide icon for 'share'. static IconData share; /// Lucide icon for 'sheet'. static IconData sheet; /// Lucide icon for 'shell'. static IconData shell; /// Lucide icon for 'shield alert'. static IconData shieldAlert; /// Lucide icon for 'shield ban'. static IconData shieldBan; /// Lucide icon for 'shield check'. static IconData shieldCheck; /// Lucide icon for 'shield ellipsis'. static IconData shieldEllipsis; /// Lucide icon for 'shield half'. static IconData shieldHalf; /// Lucide icon for 'shield minus'. static IconData shieldMinus; /// Lucide icon for 'shield off'. static IconData shieldOff; /// Lucide icon for 'shield plus'. static IconData shieldPlus; /// Lucide icon for 'shield question'. static IconData shieldQuestion; /// Lucide icon for 'shield user'. static IconData shieldUser; /// Lucide icon for 'shield X'. static IconData shieldX; /// Lucide icon for 'shield'. static IconData shield; /// Lucide icon for 'ship wheel'. static IconData shipWheel; /// Lucide icon for 'ship'. static IconData ship; /// Lucide icon for 'shirt'. static IconData shirt; /// Lucide icon for 'shopping bag'. static IconData shoppingBag; /// Lucide icon for 'shopping basket'. static IconData shoppingBasket; /// Lucide icon for 'shopping cart'. static IconData shoppingCart; /// Lucide icon for 'shovel'. static IconData shovel; /// Lucide icon for 'shower head'. static IconData showerHead; /// Lucide icon for 'shrink'. static IconData shrink; /// Lucide icon for 'shrub'. static IconData shrub; /// Lucide icon for 'shuffle'. static IconData shuffle; /// Lucide icon for 'sigma'. static IconData sigma; /// Lucide icon for 'signal high'. static IconData signalHigh; /// Lucide icon for 'signal low'. static IconData signalLow; /// Lucide icon for 'signal medium'. static IconData signalMedium; /// Lucide icon for 'signal zero'. static IconData signalZero; /// Lucide icon for 'signal'. static IconData signal; /// Lucide icon for 'signature'. static IconData signature; /// Lucide icon for 'signpost big'. static IconData signpostBig; /// Lucide icon for 'signpost'. static IconData signpost; /// Lucide icon for 'siren'. static IconData siren; /// Lucide icon for 'skip back'. static IconData skipBack; /// Lucide icon for 'skip forward'. static IconData skipForward; /// Lucide icon for 'skull'. static IconData skull; /// Lucide icon for 'slack'. static IconData slack; /// Lucide icon for 'slash'. static IconData slash; /// Lucide icon for 'slice'. static IconData slice; /// Lucide icon for 'sliders horizontal'. static IconData slidersHorizontal; /// Lucide icon for 'sliders vertical'. static IconData slidersVertical; /// Lucide icon for 'smartphone charging'. static IconData smartphoneCharging; /// Lucide icon for 'smartphone nfc'. static IconData smartphoneNfc; /// Lucide icon for 'smartphone'. static IconData smartphone; /// Lucide icon for 'smile plus'. static IconData smilePlus; /// Lucide icon for 'smile'. static IconData smile; /// Lucide icon for 'snail'. static IconData snail; /// Lucide icon for 'snowflake'. static IconData snowflake; /// Lucide icon for 'sofa'. static IconData sofa; /// Lucide icon for 'soup'. static IconData soup; /// Lucide icon for 'space'. static IconData space; /// Lucide icon for 'spade'. static IconData spade; /// Lucide icon for 'sparkle'. static IconData sparkle; /// Lucide icon for 'sparkles'. static IconData sparkles; /// Lucide icon for 'speaker'. static IconData speaker; /// Lucide icon for 'speech'. static IconData speech; /// Lucide icon for 'spell check 2'. static IconData spellCheck2; /// Lucide icon for 'spell check'. static IconData spellCheck; /// Lucide icon for 'spline'. static IconData spline; /// Lucide icon for 'split'. static IconData split; /// Lucide icon for 'spray can'. static IconData sprayCan; /// Lucide icon for 'sprout'. static IconData sprout; /// Lucide icon for 'square activity'. static IconData squareActivity; /// Lucide icon for 'square arrow down left'. static IconData squareArrowDownLeft; /// Lucide icon for 'square arrow down right'. static IconData squareArrowDownRight; /// Lucide icon for 'square arrow down'. static IconData squareArrowDown; /// Lucide icon for 'square arrow left'. static IconData squareArrowLeft; /// Lucide icon for 'square arrow out down left'. static IconData squareArrowOutDownLeft; /// Lucide icon for 'square arrow out down right'. static IconData squareArrowOutDownRight; /// Lucide icon for 'square arrow out up left'. static IconData squareArrowOutUpLeft; /// Lucide icon for 'square arrow out up right'. static IconData squareArrowOutUpRight; /// Lucide icon for 'square arrow right'. static IconData squareArrowRight; /// Lucide icon for 'square arrow up left'. static IconData squareArrowUpLeft; /// Lucide icon for 'square arrow up right'. static IconData squareArrowUpRight; /// Lucide icon for 'square arrow up'. static IconData squareArrowUp; /// Lucide icon for 'square asterisk'. static IconData squareAsterisk; /// Lucide icon for 'square bottom dashed scissors'. static IconData squareBottomDashedScissors; /// Lucide icon for 'square chart gantt'. static IconData squareChartGantt; /// Lucide icon for 'square check big'. static IconData squareCheckBig; /// Lucide icon for 'square check'. static IconData squareCheck; /// Lucide icon for 'square chevron down'. static IconData squareChevronDown; /// Lucide icon for 'square chevron left'. static IconData squareChevronLeft; /// Lucide icon for 'square chevron right'. static IconData squareChevronRight; /// Lucide icon for 'square chevron up'. static IconData squareChevronUp; /// Lucide icon for 'square code'. static IconData squareCode; /// Lucide icon for 'square dashed bottom code'. static IconData squareDashedBottomCode; /// Lucide icon for 'square dashed bottom'. static IconData squareDashedBottom; /// Lucide icon for 'square dashed kanban'. static IconData squareDashedKanban; /// Lucide icon for 'square dashed mouse pointer'. static IconData squareDashedMousePointer; /// Lucide icon for 'square dashed'. static IconData squareDashed; /// Lucide icon for 'square divide'. static IconData squareDivide; /// Lucide icon for 'square dot'. static IconData squareDot; /// Lucide icon for 'square equal'. static IconData squareEqual; /// Lucide icon for 'square function'. static IconData squareFunction; /// Lucide icon for 'square kanban'. static IconData squareKanban; /// Lucide icon for 'square library'. static IconData squareLibrary; /// Lucide icon for 'square M'. static IconData squareM; /// Lucide icon for 'square menu'. static IconData squareMenu; /// Lucide icon for 'square minus'. static IconData squareMinus; /// Lucide icon for 'square mouse pointer'. static IconData squareMousePointer; /// Lucide icon for 'square parking off'. static IconData squareParkingOff; /// Lucide icon for 'square parking'. static IconData squareParking; /// Lucide icon for 'square pen'. static IconData squarePen; /// Lucide icon for 'square percent'. static IconData squarePercent; /// Lucide icon for 'square pi'. static IconData squarePi; /// Lucide icon for 'square pilcrow'. static IconData squarePilcrow; /// Lucide icon for 'square play'. static IconData squarePlay; /// Lucide icon for 'square plus'. static IconData squarePlus; /// Lucide icon for 'square power'. static IconData squarePower; /// Lucide icon for 'square radical'. static IconData squareRadical; /// Lucide icon for 'square round corner'. static IconData squareRoundCorner; /// Lucide icon for 'square scissors'. static IconData squareScissors; /// Lucide icon for 'square sigma'. static IconData squareSigma; /// Lucide icon for 'square slash'. static IconData squareSlash; /// Lucide icon for 'square split horizontal'. static IconData squareSplitHorizontal; /// Lucide icon for 'square split vertical'. static IconData squareSplitVertical; /// Lucide icon for 'square square'. static IconData squareSquare; /// Lucide icon for 'square stack'. static IconData squareStack; /// Lucide icon for 'square terminal'. static IconData squareTerminal; /// Lucide icon for 'square user round'. static IconData squareUserRound; /// Lucide icon for 'square user'. static IconData squareUser; /// Lucide icon for 'square X'. static IconData squareX; /// Lucide icon for 'square'. static IconData square; /// Lucide icon for 'squircle'. static IconData squircle; /// Lucide icon for 'squirrel'. static IconData squirrel; /// Lucide icon for 'stamp'. static IconData stamp; /// Lucide icon for 'star half'. static IconData starHalf; /// Lucide icon for 'star off'. static IconData starOff; /// Lucide icon for 'star'. static IconData star; /// Lucide icon for 'step back'. static IconData stepBack; /// Lucide icon for 'step forward'. static IconData stepForward; /// Lucide icon for 'stethoscope'. static IconData stethoscope; /// Lucide icon for 'sticker'. static IconData sticker; /// Lucide icon for 'sticky note'. static IconData stickyNote; /// Lucide icon for 'store'. static IconData store; /// Lucide icon for 'stretch horizontal'. static IconData stretchHorizontal; /// Lucide icon for 'stretch vertical'. static IconData stretchVertical; /// Lucide icon for 'strikethrough'. static IconData strikethrough; /// Lucide icon for 'subscript'. static IconData subscript; /// Lucide icon for 'sun dim'. static IconData sunDim; /// Lucide icon for 'sun medium'. static IconData sunMedium; /// Lucide icon for 'sun moon'. static IconData sunMoon; /// Lucide icon for 'sun snow'. static IconData sunSnow; /// Lucide icon for 'sun'. static IconData sun; /// Lucide icon for 'sunrise'. static IconData sunrise; /// Lucide icon for 'sunset'. static IconData sunset; /// Lucide icon for 'superscript'. static IconData superscript; /// Lucide icon for 'swatch book'. static IconData swatchBook; /// Lucide icon for 'swiss franc'. static IconData swissFranc; /// Lucide icon for 'switch camera'. static IconData switchCamera; /// Lucide icon for 'sword'. static IconData sword; /// Lucide icon for 'swords'. static IconData swords; /// Lucide icon for 'syringe'. static IconData syringe; /// Lucide icon for 'table 2'. static IconData table2; /// Lucide icon for 'table cells merge'. static IconData tableCellsMerge; /// Lucide icon for 'table cells split'. static IconData tableCellsSplit; /// Lucide icon for 'table columns split'. static IconData tableColumnsSplit; /// Lucide icon for 'table of contents'. static IconData tableOfContents; /// Lucide icon for 'table properties'. static IconData tableProperties; /// Lucide icon for 'table rows split'. static IconData tableRowsSplit; /// Lucide icon for 'table'. static IconData table; /// Lucide icon for 'tablet smartphone'. static IconData tabletSmartphone; /// Lucide icon for 'tablet'. static IconData tablet; /// Lucide icon for 'tablets'. static IconData tablets; /// Lucide icon for 'tag'. static IconData tag; /// Lucide icon for 'tags'. static IconData tags; /// Lucide icon for 'tally 1'. static IconData tally1; /// Lucide icon for 'tally 2'. static IconData tally2; /// Lucide icon for 'tally 3'. static IconData tally3; /// Lucide icon for 'tally 4'. static IconData tally4; /// Lucide icon for 'tally 5'. static IconData tally5; /// Lucide icon for 'tangent'. static IconData tangent; /// Lucide icon for 'target'. static IconData target; /// Lucide icon for 'telescope'. static IconData telescope; /// Lucide icon for 'tent tree'. static IconData tentTree; /// Lucide icon for 'tent'. static IconData tent; /// Lucide icon for 'terminal'. static IconData terminal; /// Lucide icon for 'test tube diagonal'. static IconData testTubeDiagonal; /// Lucide icon for 'test tube'. static IconData testTube; /// Lucide icon for 'test tubes'. static IconData testTubes; /// Lucide icon for 'text cursor input'. static IconData textCursorInput; /// Lucide icon for 'text cursor'. static IconData textCursor; /// Lucide icon for 'text quote'. static IconData textQuote; /// Lucide icon for 'text search'. static IconData textSearch; /// Lucide icon for 'text select'. static IconData textSelect; /// Lucide icon for 'text'. static IconData text; /// Lucide icon for 'theater'. static IconData theater; /// Lucide icon for 'thermometer snowflake'. static IconData thermometerSnowflake; /// Lucide icon for 'thermometer sun'. static IconData thermometerSun; /// Lucide icon for 'thermometer'. static IconData thermometer; /// Lucide icon for 'thumbs down'. static IconData thumbsDown; /// Lucide icon for 'thumbs up'. static IconData thumbsUp; /// Lucide icon for 'ticket check'. static IconData ticketCheck; /// Lucide icon for 'ticket minus'. static IconData ticketMinus; /// Lucide icon for 'ticket percent'. static IconData ticketPercent; /// Lucide icon for 'ticket plus'. static IconData ticketPlus; /// Lucide icon for 'ticket slash'. static IconData ticketSlash; /// Lucide icon for 'ticket X'. static IconData ticketX; /// Lucide icon for 'ticket'. static IconData ticket; /// Lucide icon for 'tickets plane'. static IconData ticketsPlane; /// Lucide icon for 'tickets'. static IconData tickets; /// Lucide icon for 'timer off'. static IconData timerOff; /// Lucide icon for 'timer reset'. static IconData timerReset; /// Lucide icon for 'timer'. static IconData timer; /// Lucide icon for 'toggle left'. static IconData toggleLeft; /// Lucide icon for 'toggle right'. static IconData toggleRight; /// Lucide icon for 'toilet'. static IconData toilet; /// Lucide icon for 'tornado'. static IconData tornado; /// Lucide icon for 'torus'. static IconData torus; /// Lucide icon for 'touchpad off'. static IconData touchpadOff; /// Lucide icon for 'touchpad'. static IconData touchpad; /// Lucide icon for 'tower control'. static IconData towerControl; /// Lucide icon for 'toy brick'. static IconData toyBrick; /// Lucide icon for 'tractor'. static IconData tractor; /// Lucide icon for 'traffic cone'. static IconData trafficCone; /// Lucide icon for 'train front tunnel'. static IconData trainFrontTunnel; /// Lucide icon for 'train front'. static IconData trainFront; /// Lucide icon for 'train track'. static IconData trainTrack; /// Lucide icon for 'tram front'. static IconData tramFront; /// Lucide icon for 'transgender'. static IconData transgender; /// Lucide icon for 'trash 2'. static IconData trash2; /// Lucide icon for 'trash'. static IconData trash; /// Lucide icon for 'tree deciduous'. static IconData treeDeciduous; /// Lucide icon for 'tree palm'. static IconData treePalm; /// Lucide icon for 'tree pine'. static IconData treePine; /// Lucide icon for 'trees'. static IconData trees; /// Lucide icon for 'trello'. static IconData trello; /// Lucide icon for 'trending down'. static IconData trendingDown; /// Lucide icon for 'trending up down'. static IconData trendingUpDown; /// Lucide icon for 'trending up'. static IconData trendingUp; /// Lucide icon for 'triangle alert'. static IconData triangleAlert; /// Lucide icon for 'triangle dashed'. static IconData triangleDashed; /// Lucide icon for 'triangle right'. static IconData triangleRight; /// Lucide icon for 'triangle'. static IconData triangle; /// Lucide icon for 'trophy'. static IconData trophy; /// Lucide icon for 'truck'. static IconData truck; /// Lucide icon for 'turtle'. static IconData turtle; /// Lucide icon for 'tv minimal play'. static IconData tvMinimalPlay; /// Lucide icon for 'tv minimal'. static IconData tvMinimal; /// Lucide icon for 'tv'. static IconData tv; /// Lucide icon for 'twitch'. static IconData twitch; /// Lucide icon for 'twitter'. static IconData twitter; /// Lucide icon for 'type outline'. static IconData typeOutline; /// Lucide icon for 'type'. static IconData type; /// Lucide icon for 'umbrella off'. static IconData umbrellaOff; /// Lucide icon for 'umbrella'. static IconData umbrella; /// Lucide icon for 'underline'. static IconData underline; /// Lucide icon for 'undo 2'. static IconData undo2; /// Lucide icon for 'undo dot'. static IconData undoDot; /// Lucide icon for 'undo'. static IconData undo; /// Lucide icon for 'unfold horizontal'. static IconData unfoldHorizontal; /// Lucide icon for 'unfold vertical'. static IconData unfoldVertical; /// Lucide icon for 'ungroup'. static IconData ungroup; /// Lucide icon for 'university'. static IconData university; /// Lucide icon for 'unlink 2'. static IconData unlink2; /// Lucide icon for 'unlink'. static IconData unlink; /// Lucide icon for 'unplug'. static IconData unplug; /// Lucide icon for 'upload'. static IconData upload; /// Lucide icon for 'usb'. static IconData usb; /// Lucide icon for 'user check'. static IconData userCheck; /// Lucide icon for 'user cog'. static IconData userCog; /// Lucide icon for 'user minus'. static IconData userMinus; /// Lucide icon for 'user pen'. static IconData userPen; /// Lucide icon for 'user plus'. static IconData userPlus; /// Lucide icon for 'user round check'. static IconData userRoundCheck; /// Lucide icon for 'user round cog'. static IconData userRoundCog; /// Lucide icon for 'user round minus'. static IconData userRoundMinus; /// Lucide icon for 'user round pen'. static IconData userRoundPen; /// Lucide icon for 'user round plus'. static IconData userRoundPlus; /// Lucide icon for 'user round search'. static IconData userRoundSearch; /// Lucide icon for 'user round X'. static IconData userRoundX; /// Lucide icon for 'user round'. static IconData userRound; /// Lucide icon for 'user search'. static IconData userSearch; /// Lucide icon for 'user X'. static IconData userX; /// Lucide icon for 'user'. static IconData user; /// Lucide icon for 'users round'. static IconData usersRound; /// Lucide icon for 'users'. static IconData users; /// Lucide icon for 'utensils crossed'. static IconData utensilsCrossed; /// Lucide icon for 'utensils'. static IconData utensils; /// Lucide icon for 'utility pole'. static IconData utilityPole; /// Lucide icon for 'variable'. static IconData variable; /// Lucide icon for 'vault'. static IconData vault; /// Lucide icon for 'vegan'. static IconData vegan; /// Lucide icon for 'venetian mask'. static IconData venetianMask; /// Lucide icon for 'venus and mars'. static IconData venusAndMars; /// Lucide icon for 'venus'. static IconData venus; /// Lucide icon for 'vibrate off'. static IconData vibrateOff; /// Lucide icon for 'vibrate'. static IconData vibrate; /// Lucide icon for 'video off'. static IconData videoOff; /// Lucide icon for 'video'. static IconData video; /// Lucide icon for 'videotape'. static IconData videotape; /// Lucide icon for 'view'. static IconData view; /// Lucide icon for 'voicemail'. static IconData voicemail; /// Lucide icon for 'volleyball'. static IconData volleyball; /// Lucide icon for 'volume 1'. static IconData volume1; /// Lucide icon for 'volume 2'. static IconData volume2; /// Lucide icon for 'volume off'. static IconData volumeOff; /// Lucide icon for 'volume X'. static IconData volumeX; /// Lucide icon for 'volume'. static IconData volume; /// Lucide icon for 'vote'. static IconData vote; /// Lucide icon for 'wallet cards'. static IconData walletCards; /// Lucide icon for 'wallet minimal'. static IconData walletMinimal; /// Lucide icon for 'wallet'. static IconData wallet; /// Lucide icon for 'wallpaper'. static IconData wallpaper; /// Lucide icon for 'wand sparkles'. static IconData wandSparkles; /// Lucide icon for 'wand'. static IconData wand; /// Lucide icon for 'warehouse'. static IconData warehouse; /// Lucide icon for 'washing machine'. static IconData washingMachine; /// Lucide icon for 'watch'. static IconData watch; /// Lucide icon for 'waves ladder'. static IconData wavesLadder; /// Lucide icon for 'waves'. static IconData waves; /// Lucide icon for 'waypoints'. static IconData waypoints; /// Lucide icon for 'webcam'. static IconData webcam; /// Lucide icon for 'webhook off'. static IconData webhookOff; /// Lucide icon for 'webhook'. static IconData webhook; /// Lucide icon for 'weight'. static IconData weight; /// Lucide icon for 'wheat off'. static IconData wheatOff; /// Lucide icon for 'wheat'. static IconData wheat; /// Lucide icon for 'whole word'. static IconData wholeWord; /// Lucide icon for 'wifi high'. static IconData wifiHigh; /// Lucide icon for 'wifi low'. static IconData wifiLow; /// Lucide icon for 'wifi off'. static IconData wifiOff; /// Lucide icon for 'wifi zero'. static IconData wifiZero; /// Lucide icon for 'wifi'. static IconData wifi; /// Lucide icon for 'wind arrow down'. static IconData windArrowDown; /// Lucide icon for 'wind'. static IconData wind; /// Lucide icon for 'wine off'. static IconData wineOff; /// Lucide icon for 'wine'. static IconData wine; /// Lucide icon for 'workflow'. static IconData workflow; /// Lucide icon for 'worm'. static IconData worm; /// Lucide icon for 'wrap text'. static IconData wrapText; /// Lucide icon for 'wrench'. static IconData wrench; /// Lucide icon for 'X'. static IconData x; /// Lucide icon for 'youtube'. static IconData youtube; /// Lucide icon for 'zap off'. static IconData zapOff; /// Lucide icon for 'zap'. static IconData zap; /// Lucide icon for 'zoom in'. static IconData zoomIn; /// Lucide icon for 'zoom out'. static IconData zoomOut; } /// A collection of Radix Icons for Flutter applications. /// /// This class provides access to all icons from the Radix Icons library. /// All icons are defined as static constants of type [IconData]. class RadixIcons { /// Zoom out icon from Radix Icons. static IconData zoomOut; /// Zoom in icon from Radix Icons. static IconData zoomIn; /// Width icon from Radix Icons. static IconData width; /// View vertical icon from Radix Icons. static IconData viewVertical; /// View none icon from Radix Icons. static IconData viewNone; /// View horizontal icon from Radix Icons. static IconData viewHorizontal; /// View grid icon from Radix Icons. static IconData viewGrid; /// Video icon from Radix Icons. static IconData video; /// Vercel logo icon from Radix Icons. static IconData vercelLogo; /// Value icon from Radix Icons. static IconData value; /// Value none icon from Radix Icons. static IconData valueNone; /// Upload icon from Radix Icons. static IconData upload; /// Update icon from Radix Icons. static IconData update; /// Underline icon from Radix Icons. static IconData underline; /// Twitter logo icon from Radix Icons. static IconData twitterLogo; /// Triangle up icon from Radix Icons. static IconData triangleUp; /// Triangle right icon from Radix Icons. static IconData triangleRight; /// Triangle left icon from Radix Icons. static IconData triangleLeft; /// Triangle down icon from Radix Icons. static IconData triangleDown; /// Trash icon from Radix Icons. static IconData trash; /// Transparency grid icon from Radix Icons. static IconData transparencyGrid; /// Transform icon from Radix Icons. static IconData transform; /// Track previous icon from Radix Icons. static IconData trackPrevious; /// Track next icon from Radix Icons. static IconData trackNext; /// Tokens icon from Radix Icons. static IconData tokens; /// Timer icon from Radix Icons. static IconData timer; /// Thick arrow up icon from Radix Icons. static IconData thickArrowUp; /// Thick arrow right icon from Radix Icons. static IconData thickArrowRight; /// Thick arrow left icon from Radix Icons. static IconData thickArrowLeft; /// Thick arrow down icon from Radix Icons. static IconData thickArrowDown; /// Text icon from Radix Icons. static IconData text; /// Text none icon from Radix Icons. static IconData textNone; /// Text align top icon from Radix Icons. static IconData textAlignTop; /// Text align right icon from Radix Icons. static IconData textAlignRight; /// Text align middle icon from Radix Icons. static IconData textAlignMiddle; /// Text align left icon from Radix Icons. static IconData textAlignLeft; /// Text align justify icon from Radix Icons. static IconData textAlignJustify; /// Text align center icon from Radix Icons. static IconData textAlignCenter; /// Text align bottom icon from Radix Icons. static IconData textAlignBottom; /// Target icon from Radix Icons. static IconData target; /// Table icon from Radix Icons. static IconData table; /// Symbol icon from Radix Icons. static IconData symbol; /// Switch icon from Radix Icons. static IconData iconSwitch; /// Sun icon from Radix Icons. static IconData sun; /// Strikethrough icon from Radix Icons. static IconData strikethrough; /// Stretch vertically icon from Radix Icons. static IconData stretchVertically; /// Stretch horizontally icon from Radix Icons. static IconData stretchHorizontally; /// Stopwatch icon from Radix Icons. static IconData stopwatch; /// Stop icon from Radix Icons. static IconData stop; /// Stitches logo icon from Radix Icons. static IconData stitchesLogo; /// Star icon from Radix Icons. static IconData star; /// Star filled icon from Radix Icons. static IconData starFilled; /// Stack icon from Radix Icons. static IconData stack; /// Square icon from Radix Icons. static IconData square; /// Speaker quiet icon from Radix Icons. static IconData speakerQuiet; /// Speaker off icon from Radix Icons. static IconData speakerOff; /// Speaker moderate icon from Radix Icons. static IconData speakerModerate; /// Speaker loud icon from Radix Icons. static IconData speakerLoud; /// Space evenly vertically icon from Radix Icons. static IconData spaceEvenlyVertically; /// Space evenly horizontally icon from Radix Icons. static IconData spaceEvenlyHorizontally; /// Space between vertically icon from Radix Icons. static IconData spaceBetweenVertically; /// Space between horizontally icon from Radix Icons. static IconData spaceBetweenHorizontally; /// Slider icon from Radix Icons. static IconData slider; /// Slash icon from Radix Icons. static IconData slash; /// Sketch logo icon from Radix Icons. static IconData sketchLogo; /// Size icon from Radix Icons. static IconData size; /// Shuffle icon from Radix Icons. static IconData shuffle; /// Share2 icon from Radix Icons. static IconData share2; /// Share1 icon from Radix Icons. static IconData share1; /// Shadow icon from Radix Icons. static IconData shadow; /// Shadow outer icon from Radix Icons. static IconData shadowOuter; /// Shadow none icon from Radix Icons. static IconData shadowNone; /// Shadow inner icon from Radix Icons. static IconData shadowInner; /// Sewing pin icon from Radix Icons. static IconData sewingPin; /// Sewing pin solid icon from Radix Icons. static IconData sewingPinSolid; /// Sewing pin filled icon from Radix Icons. static IconData sewingPinFilled; /// Section icon from Radix Icons. static IconData section; /// Scissors icon from Radix Icons. static IconData scissors; /// Ruler square icon from Radix Icons. static IconData rulerSquare; /// Ruler horizontal icon from Radix Icons. static IconData rulerHorizontal; /// Rows icon from Radix Icons. static IconData rows; /// Row spacing icon from Radix Icons. static IconData rowSpacing; /// Rotate counter clockwise icon from Radix Icons. static IconData rotateCounterClockwise; /// Rocket icon from Radix Icons. static IconData rocket; /// Resume icon from Radix Icons. static IconData resume; /// Reset icon from Radix Icons. static IconData reset; /// Reload icon from Radix Icons. static IconData reload; /// Reader icon from Radix Icons. static IconData reader; /// Radiobutton icon from Radix Icons. static IconData radiobutton; /// Quote icon from Radix Icons. static IconData quote; /// Question mark icon from Radix Icons. static IconData questionMark; /// Question mark circled icon from Radix Icons. static IconData questionMarkCircled; /// Plus icon from Radix Icons. static IconData plus; /// Plus circled icon from Radix Icons. static IconData plusCircled; /// Play icon from Radix Icons. static IconData play; /// Pin top icon from Radix Icons. static IconData pinTop; /// Pin right icon from Radix Icons. static IconData pinRight; /// Pin left icon from Radix Icons. static IconData pinLeft; /// Pin bottom icon from Radix Icons. static IconData pinBottom; /// Pilcrow icon from Radix Icons. static IconData pilcrow; /// Pie chart icon from Radix Icons. static IconData pieChart; /// Person icon from Radix Icons. static IconData person; /// Pencil2 icon from Radix Icons. static IconData pencil2; /// Pencil1 icon from Radix Icons. static IconData pencil1; /// Pause icon from Radix Icons. static IconData pause; /// Paper plane icon from Radix Icons. static IconData paperPlane; /// Padding icon from Radix Icons. static IconData padding; /// Overline icon from Radix Icons. static IconData overline; /// Outer shadow icon from Radix Icons. static IconData outerShadow; /// Open in new window icon from Radix Icons. static IconData openInNewWindow; /// Opacity icon from Radix Icons. static IconData opacity; /// Notion logo icon from Radix Icons. static IconData notionLogo; /// Move icon from Radix Icons. static IconData move; /// Moon icon from Radix Icons. static IconData moon; /// Modulz logo icon from Radix Icons. static IconData modulzLogo; /// Mobile icon from Radix Icons. static IconData mobile; /// Mixer vertical icon from Radix Icons. static IconData mixerVertical; /// Mixer horizontal icon from Radix Icons. static IconData mixerHorizontal; /// Mix icon from Radix Icons. static IconData mix; /// Minus icon from Radix Icons. static IconData minus; /// Minus circled icon from Radix Icons. static IconData minusCircled; /// Mask on icon from Radix Icons. static IconData maskOn; /// Mask off icon from Radix Icons. static IconData maskOff; /// Margin icon from Radix Icons. static IconData margin; /// Magnifying glass icon from Radix Icons. static IconData magnifyingGlass; /// Magic wand icon from Radix Icons. static IconData magicWand; /// Loop icon from Radix Icons. static IconData loop; /// Lock open2 icon from Radix Icons. static IconData lockOpen2; /// Lock open1 icon from Radix Icons. static IconData lockOpen1; /// Lock closed icon from Radix Icons. static IconData lockClosed; /// List bullet icon from Radix Icons. static IconData listBullet; /// Linkedin logo icon from Radix Icons. static IconData linkedinLogo; /// Link none2 icon from Radix Icons. static IconData linkNone2; /// Link none1 icon from Radix Icons. static IconData linkNone1; /// Link break2 icon from Radix Icons. static IconData linkBreak2; /// Link break1 icon from Radix Icons. static IconData linkBreak1; /// Link2 icon from Radix Icons. static IconData link2; /// Link1 icon from Radix Icons. static IconData link1; /// Line height icon from Radix Icons. static IconData lineHeight; /// Lightning bolt icon from Radix Icons. static IconData lightningBolt; /// Letter spacing icon from Radix Icons. static IconData letterSpacing; /// Letter case uppercase icon from Radix Icons. static IconData letterCaseUppercase; /// Letter case toggle icon from Radix Icons. static IconData letterCaseToggle; /// Letter case lowercase icon from Radix Icons. static IconData letterCaseLowercase; /// Letter case capitalize icon from Radix Icons. static IconData letterCaseCapitalize; /// Layout icon from Radix Icons. static IconData layout; /// Layers icon from Radix Icons. static IconData layers; /// Laptop icon from Radix Icons. static IconData laptop; /// Lap timer icon from Radix Icons. static IconData lapTimer; /// Keyboard icon from Radix Icons. static IconData keyboard; /// Justify stretch icon from Radix Icons. static IconData justifyStretch; /// Justify start icon from Radix Icons. static IconData justifyStart; /// Justify end icon from Radix Icons. static IconData justifyEnd; /// Justify center icon from Radix Icons. static IconData justifyCenter; /// Instagram logo icon from Radix Icons. static IconData instagramLogo; /// Input icon from Radix Icons. static IconData input; /// Inner shadow icon from Radix Icons. static IconData innerShadow; /// Info circled icon from Radix Icons. static IconData infoCircled; /// Image icon from Radix Icons. static IconData image; /// Id card icon from Radix Icons. static IconData idCard; /// Iconjar logo icon from Radix Icons. static IconData iconjarLogo; /// Home icon from Radix Icons. static IconData home; /// Hobby knife icon from Radix Icons. static IconData hobbyKnife; /// Height icon from Radix Icons. static IconData height; /// Heart icon from Radix Icons. static IconData heart; /// Heart filled icon from Radix Icons. static IconData heartFilled; /// Heading icon from Radix Icons. static IconData heading; /// Hand icon from Radix Icons. static IconData hand; /// Hamburger menu icon from Radix Icons. static IconData hamburgerMenu; /// Half2 icon from Radix Icons. static IconData half2; /// Half1 icon from Radix Icons. static IconData half1; /// Group icon from Radix Icons. static IconData group; /// Grid icon from Radix Icons. static IconData grid; /// Globe icon from Radix Icons. static IconData globe; /// Github logo icon from Radix Icons. static IconData githubLogo; /// Gear icon from Radix Icons. static IconData gear; /// Framer logo icon from Radix Icons. static IconData framerLogo; /// Frame icon from Radix Icons. static IconData frame; /// Font style icon from Radix Icons. static IconData fontStyle; /// Font size icon from Radix Icons. static IconData fontSize; /// Font roman icon from Radix Icons. static IconData fontRoman; /// Font italic icon from Radix Icons. static IconData fontItalic; /// Font family icon from Radix Icons. static IconData fontFamily; /// Font bold icon from Radix Icons. static IconData fontBold; /// File icon from Radix Icons. static IconData file; /// File text icon from Radix Icons. static IconData fileText; /// File plus icon from Radix Icons. static IconData filePlus; /// File minus icon from Radix Icons. static IconData fileMinus; /// Figma logo icon from Radix Icons. static IconData figmaLogo; /// Face icon from Radix Icons. static IconData face; /// Eye open icon from Radix Icons. static IconData eyeOpen; /// Eye none icon from Radix Icons. static IconData eyeNone; /// Eye closed icon from Radix Icons. static IconData eyeClosed; /// External link icon from Radix Icons. static IconData externalLink; /// Exit icon from Radix Icons. static IconData exit; /// Exit full screen icon from Radix Icons. static IconData exitFullScreen; /// Exclamation triangle icon from Radix Icons. static IconData exclamationTriangle; /// Eraser icon from Radix Icons. static IconData eraser; /// Envelope open icon from Radix Icons. static IconData envelopeOpen; /// Envelope closed icon from Radix Icons. static IconData envelopeClosed; /// Enter icon from Radix Icons. static IconData enter; /// Enter full screen icon from Radix Icons. static IconData enterFullScreen; /// Dropdown menu icon from Radix Icons. static IconData dropdownMenu; /// Drawing pin icon from Radix Icons. static IconData drawingPin; /// Drawing pin solid icon from Radix Icons. static IconData drawingPinSolid; /// Drawing pin filled icon from Radix Icons. static IconData drawingPinFilled; /// Drag handle vertical icon from Radix Icons. static IconData dragHandleVertical; /// Drag handle horizontal icon from Radix Icons. static IconData dragHandleHorizontal; /// Drag handle dots2 icon from Radix Icons. static IconData dragHandleDots2; /// Drag handle dots1 icon from Radix Icons. static IconData dragHandleDots1; /// Download icon from Radix Icons. static IconData download; /// Double arrow up icon from Radix Icons. static IconData doubleArrowUp; /// Double arrow right icon from Radix Icons. static IconData doubleArrowRight; /// Double arrow left icon from Radix Icons. static IconData doubleArrowLeft; /// Double arrow down icon from Radix Icons. static IconData doubleArrowDown; /// Dots vertical icon from Radix Icons. static IconData dotsVertical; /// Dots horizontal icon from Radix Icons. static IconData dotsHorizontal; /// Dot icon from Radix Icons. static IconData dot; /// Dot solid icon from Radix Icons. static IconData dotSolid; /// Dot filled icon from Radix Icons. static IconData dotFilled; /// Divider vertical icon from Radix Icons. static IconData dividerVertical; /// Divider horizontal icon from Radix Icons. static IconData dividerHorizontal; /// Discord logo icon from Radix Icons. static IconData discordLogo; /// Disc icon from Radix Icons. static IconData disc; /// Dimensions icon from Radix Icons. static IconData dimensions; /// Desktop icon from Radix Icons. static IconData desktop; /// Dashboard icon from Radix Icons. static IconData dashboard; /// Dash icon from Radix Icons. static IconData dash; /// Cursor text icon from Radix Icons. static IconData cursorText; /// Cursor arrow icon from Radix Icons. static IconData cursorArrow; /// Cube icon from Radix Icons. static IconData cube; /// Crumpled paper icon from Radix Icons. static IconData crumpledPaper; /// Crosshair2 icon from Radix Icons. static IconData crosshair2; /// Crosshair1 icon from Radix Icons. static IconData crosshair1; /// Cross circled icon from Radix Icons. static IconData crossCircled; /// Cross2 icon from Radix Icons. static IconData cross2; /// Cross1 icon from Radix Icons. static IconData cross1; /// Crop icon from Radix Icons. static IconData crop; /// Counter clockwise clock icon from Radix Icons. static IconData counterClockwiseClock; /// Countdown timer icon from Radix Icons. static IconData countdownTimer; /// Corners icon from Radix Icons. static IconData corners; /// Corner top right icon from Radix Icons. static IconData cornerTopRight; /// Corner top left icon from Radix Icons. static IconData cornerTopLeft; /// Corner bottom right icon from Radix Icons. static IconData cornerBottomRight; /// Corner bottom left icon from Radix Icons. static IconData cornerBottomLeft; /// Copy icon from Radix Icons. static IconData copy; /// Cookie icon from Radix Icons. static IconData cookie; /// Container icon from Radix Icons. static IconData container; /// Component placeholder icon from Radix Icons. static IconData componentPlaceholder; /// Component none icon from Radix Icons. static IconData componentNone; /// Component instance icon from Radix Icons. static IconData componentInstance; /// Component boolean icon from Radix Icons. static IconData componentBoolean; /// Component2 icon from Radix Icons. static IconData component2; /// Component1 icon from Radix Icons. static IconData component1; /// Commit icon from Radix Icons. static IconData commit; /// Columns icon from Radix Icons. static IconData columns; /// Column spacing icon from Radix Icons. static IconData columnSpacing; /// Color wheel icon from Radix Icons. static IconData colorWheel; /// Codesandbox logo icon from Radix Icons. static IconData codesandboxLogo; /// Code icon from Radix Icons. static IconData code; /// Clock icon from Radix Icons. static IconData clock; /// Clipboard icon from Radix Icons. static IconData clipboard; /// Clipboard copy icon from Radix Icons. static IconData clipboardCopy; /// Circle icon from Radix Icons. static IconData circle; /// Circle backslash icon from Radix Icons. static IconData circleBackslash; /// Chevron up icon from Radix Icons. static IconData chevronUp; /// Chevron right icon from Radix Icons. static IconData chevronRight; /// Chevron left icon from Radix Icons. static IconData chevronLeft; /// Chevron down icon from Radix Icons. static IconData chevronDown; /// Checkbox icon from Radix Icons. static IconData checkbox; /// Check icon from Radix Icons. static IconData check; /// Check circled icon from Radix Icons. static IconData checkCircled; /// Chat bubble icon from Radix Icons. static IconData chatBubble; /// Caret up icon from Radix Icons. static IconData caretUp; /// Caret sort icon from Radix Icons. static IconData caretSort; /// Caret right icon from Radix Icons. static IconData caretRight; /// Caret left icon from Radix Icons. static IconData caretLeft; /// Caret down icon from Radix Icons. static IconData caretDown; /// Card stack icon from Radix Icons. static IconData cardStack; /// Card stack plus icon from Radix Icons. static IconData cardStackPlus; /// Card stack minus icon from Radix Icons. static IconData cardStackMinus; /// Camera icon from Radix Icons. static IconData camera; /// Calendar icon from Radix Icons. static IconData calendar; /// Button icon from Radix Icons. static IconData button; /// Box icon from Radix Icons. static IconData box; /// Box model icon from Radix Icons. static IconData boxModel; /// Border width icon from Radix Icons. static IconData borderWidth; /// Border top icon from Radix Icons. static IconData borderTop; /// Border style icon from Radix Icons. static IconData borderStyle; /// Border split icon from Radix Icons. static IconData borderSplit; /// Border solid icon from Radix Icons. static IconData borderSolid; /// Border right icon from Radix Icons. static IconData borderRight; /// Border none icon from Radix Icons. static IconData borderNone; /// Border left icon from Radix Icons. static IconData borderLeft; /// Border dotted icon from Radix Icons. static IconData borderDotted; /// Border dashed icon from Radix Icons. static IconData borderDashed; /// Border bottom icon from Radix Icons. static IconData borderBottom; /// Border all icon from Radix Icons. static IconData borderAll; /// Bookmark icon from Radix Icons. static IconData bookmark; /// Bookmark filled icon from Radix Icons. static IconData bookmarkFilled; /// Blending mode icon from Radix Icons. static IconData blendingMode; /// Bell icon from Radix Icons. static IconData bell; /// Bar chart icon from Radix Icons. static IconData barChart; /// Badge icon from Radix Icons. static IconData badge; /// Backpack icon from Radix Icons. static IconData backpack; /// Avatar icon from Radix Icons. static IconData avatar; /// Aspect ratio icon from Radix Icons. static IconData aspectRatio; /// Arrow up icon from Radix Icons. static IconData arrowUp; /// Arrow top right icon from Radix Icons. static IconData arrowTopRight; /// Arrow top left icon from Radix Icons. static IconData arrowTopLeft; /// Arrow right icon from Radix Icons. static IconData arrowRight; /// Arrow left icon from Radix Icons. static IconData arrowLeft; /// Arrow down icon from Radix Icons. static IconData arrowDown; /// Arrow bottom right icon from Radix Icons. static IconData arrowBottomRight; /// Arrow bottom left icon from Radix Icons. static IconData arrowBottomLeft; /// Archive icon from Radix Icons. static IconData archive; /// Angle icon from Radix Icons. static IconData angle; /// All sides icon from Radix Icons. static IconData allSides; /// Align vertical centers icon from Radix Icons. static IconData alignVerticalCenters; /// Align top icon from Radix Icons. static IconData alignTop; /// Align stretch icon from Radix Icons. static IconData alignStretch; /// Align start icon from Radix Icons. static IconData alignStart; /// Align right icon from Radix Icons. static IconData alignRight; /// Align left icon from Radix Icons. static IconData alignLeft; /// Align horizontal centers icon from Radix Icons. static IconData alignHorizontalCenters; /// Align end icon from Radix Icons. static IconData alignEnd; /// Align center icon from Radix Icons. static IconData alignCenter; /// Align center vertically icon from Radix Icons. static IconData alignCenterVertically; /// Align center horizontally icon from Radix Icons. static IconData alignCenterHorizontally; /// Align bottom icon from Radix Icons. static IconData alignBottom; /// Align baseline icon from Radix Icons. static IconData alignBaseline; /// Activity log icon from Radix Icons. static IconData activityLog; /// Accessibility icon from Radix Icons. static IconData accessibility; } /// A controlled animation that wraps an [AnimationController] and provides /// smooth transitions between values using curves. /// /// This class extends [Animation]`` and allows programmatic control /// of animations with custom start and end values, as well as curve adjustments. /// /// ## Overview /// /// Use [ControlledAnimation] when you need fine-grained control over animation /// values and want to smoothly transition from any current value to a target /// value with a specified curve. /// /// ## Example /// /// ```dart /// final controller = AnimationController( /// vsync: this, /// duration: const Duration(milliseconds: 300), /// ); /// final animation = ControlledAnimation(controller); /// /// // Animate to 0.8 with ease-in curve /// animation.forward(0.8, Curves.easeIn); /// ``` class ControlledAnimation extends Animation { /// Creates a [ControlledAnimation] that wraps the given [AnimationController]. /// /// ## Parameters /// /// * [_controller] - The underlying animation controller to use for timing. /// /// ## Example /// /// ```dart /// final controller = AnimationController( /// vsync: this, /// duration: const Duration(milliseconds: 200), /// ); /// final animation = ControlledAnimation(controller); /// ``` ControlledAnimation(this._controller); /// Animates from the current value to the specified target value. /// /// This method starts a forward animation from the current [value] to the /// specified [to] value, applying the given [curve] for easing. /// /// ## Parameters /// /// * [to] - The target value to animate to (typically between 0.0 and 1.0). /// * [curve] - Optional easing curve. Defaults to `Curves.linear` if not specified. /// /// ## Returns /// /// A [TickerFuture] that completes when the animation finishes. /// /// ## Example /// /// ```dart /// // Animate to 1.0 with ease-out curve /// await animation.forward(1.0, Curves.easeOut); /// ``` TickerFuture forward(double to, [Curve? curve]); set value(double value); void addListener(VoidCallback listener); void addStatusListener(AnimationStatusListener listener); void removeListener(VoidCallback listener); void removeStatusListener(AnimationStatusListener listener); AnimationStatus get status; double get value; } /// Utility class providing static methods for interpolating between common types. /// /// This class contains type-specific lerp (linear interpolation) functions that /// handle nullable values and perform smooth transitions between values. /// /// ## Overview /// /// Use [Transformers] when you need to interpolate between values of common types /// like `double`, `int`, `Color`, `Offset`, or `Size`. Each method handles `null` /// values gracefully by returning `null` if either input is `null`. /// /// ## Example /// /// ```dart /// final color = Transformers.typeColor(Colors.red, Colors.blue, 0.5); /// final position = Transformers.typeOffset(Offset.zero, Offset(100, 100), 0.3); /// ``` class Transformers { /// Linearly interpolates between two nullable [double] values. /// /// ## Parameters /// /// * [a] - The starting value. If `null`, returns `null`. /// * [b] - The ending value. If `null`, returns `null`. /// * [t] - The interpolation factor, typically in range [0.0, 1.0]. /// /// ## Returns /// /// The interpolated value, or `null` if either input is `null`. /// /// ## Example /// /// ```dart /// final result = Transformers.typeDouble(0.0, 100.0, 0.5); // 50.0 /// final nullResult = Transformers.typeDouble(null, 100.0, 0.5); // null /// ``` static double? typeDouble(double? a, double? b, double t); /// Linearly interpolates between two nullable [int] values. /// /// ## Parameters /// /// * [a] - The starting integer. If `null`, returns `null`. /// * [b] - The ending integer. If `null`, returns `null`. /// * [t] - The interpolation factor, typically in range [0.0, 1.0]. /// /// ## Returns /// /// The interpolated value rounded to the nearest integer, or `null` if either input is `null`. /// /// ## Example /// /// ```dart /// final result = Transformers.typeInt(0, 100, 0.5); // 50 /// final result2 = Transformers.typeInt(0, 100, 0.51); // 51 (rounded) /// ``` static int? typeInt(int? a, int? b, double t); /// Linearly interpolates between two nullable [Color] values. /// /// ## Parameters /// /// * [a] - The starting color. If `null`, returns `null`. /// * [b] - The ending color. If `null`, returns `null`. /// * [t] - The interpolation factor, typically in range [0.0, 1.0]. /// /// ## Returns /// /// The interpolated color using Flutter's `Color.lerp`, or `null` if either input is `null`. /// /// ## Example /// /// ```dart /// final purple = Transformers.typeColor(Colors.red, Colors.blue, 0.5); /// final almostBlue = Transformers.typeColor(Colors.red, Colors.blue, 0.9); /// ``` static Color? typeColor(Color? a, Color? b, double t); /// Linearly interpolates between two nullable [Offset] values. /// /// ## Parameters /// /// * [a] - The starting offset. If `null`, returns `null`. /// * [b] - The ending offset. If `null`, returns `null`. /// * [t] - The interpolation factor, typically in range [0.0, 1.0]. /// /// ## Returns /// /// The interpolated offset with both dx and dy components interpolated, /// or `null` if either input is `null`. /// /// ## Example /// /// ```dart /// final offset = Transformers.typeOffset( /// Offset(0, 0), /// Offset(100, 50), /// 0.5, /// ); // Offset(50, 25) /// ``` static Offset? typeOffset(Offset? a, Offset? b, double t); /// Linearly interpolates between two nullable [Size] values. /// /// ## Parameters /// /// * [a] - The starting size. If `null`, returns `null`. /// * [b] - The ending size. If `null`, returns `null`. /// * [t] - The interpolation factor, typically in range [0.0, 1.0]. /// /// ## Returns /// /// The interpolated size with both width and height components interpolated, /// or `null` if either input is `null`. /// /// ## Example /// /// ```dart /// final size = Transformers.typeSize( /// Size(100, 50), /// Size(200, 150), /// 0.5, /// ); // Size(150, 100) /// ``` static Size? typeSize(Size? a, Size? b, double t); } /// A mixin that provides animated property management for stateful widgets. /// /// This mixin extends [TickerProviderStateMixin] and manages a collection of /// animated properties, automatically disposing of their controllers. /// /// ## Overview /// /// Use [AnimatedMixin] when building stateful widgets that need multiple /// animated properties. The mixin handles lifecycle management and provides /// convenient factory methods for common types. /// /// ## Example /// /// ```dart /// class MyWidget extends StatefulWidget { /// @override /// State createState() => _MyWidgetState(); /// } /// /// class _MyWidgetState extends State /// with TickerProviderStateMixin, AnimatedMixin { /// late final AnimatedProperty opacity; /// /// @override /// void initState() { /// super.initState(); /// opacity = createAnimatedDouble(1.0); /// } /// /// @override /// Widget build(BuildContext context) { /// return Opacity( /// opacity: opacity.value, /// child: Container(), /// ); /// } /// } /// ``` mixin AnimatedMixin on TickerProviderStateMixin { /// Creates a new animated property with a custom interpolation function. /// /// ## Type Parameters /// /// * [T] - The type of value to animate. /// /// ## Parameters /// /// * [value] - The initial value of the property. /// * [lerp] - The interpolation function to use for animating between values. /// /// ## Returns /// /// A new [AnimatedProperty]`` that will be automatically disposed. /// /// ## Example /// /// ```dart /// final customProp = createAnimatedProperty( /// initialValue, /// (a, b, t) => MyType.lerp(a, b, t), /// ); /// ``` AnimatedProperty createAnimatedProperty(T value, PropertyLerp lerp); void dispose(); /// Creates an animated property for integer values. /// /// This is a convenience method that uses [Transformers.typeInt] for interpolation. /// /// ## Parameters /// /// * [value] - The initial integer value. /// /// ## Returns /// /// A new [AnimatedProperty]`` configured for integer interpolation. /// /// ## Example /// /// ```dart /// final count = createAnimatedInt(0); /// count.value = 100; // Will animate from 0 to 100 /// ``` AnimatedProperty createAnimatedInt(int value); /// Creates an animated property for double values. /// /// This is a convenience method that uses [Transformers.typeDouble] for interpolation. /// /// ## Parameters /// /// * [value] - The initial double value. /// /// ## Returns /// /// A new [AnimatedProperty]`` configured for double interpolation. /// /// ## Example /// /// ```dart /// final opacity = createAnimatedDouble(1.0); /// opacity.value = 0.0; // Will animate from 1.0 to 0.0 /// ``` AnimatedProperty createAnimatedDouble(double value); /// Creates an animated property for [Color] values. /// /// This is a convenience method that uses [Transformers.typeColor] for interpolation. /// /// ## Parameters /// /// * [value] - The initial color value. /// /// ## Returns /// /// A new [AnimatedProperty]`` configured for color interpolation. /// /// ## Example /// /// ```dart /// final bgColor = createAnimatedColor(Colors.red); /// bgColor.value = Colors.blue; // Will smoothly transition from red to blue /// ``` AnimatedProperty createAnimatedColor(Color value); } /// A property that can be animated between values of type [T]. /// /// This class manages an animation controller and interpolates between values /// using a custom lerp function. It automatically triggers widget rebuilds when /// the animation progresses. /// /// ## Type Parameters /// /// * [T] - The type of value being animated. /// /// ## Overview /// /// [AnimatedProperty] is typically created via [AnimatedMixin] factory methods /// like [createAnimatedDouble] or [createAnimatedColor]. When you set a new /// [value], it smoothly animates from the current value to the target. /// /// ## Example /// /// ```dart /// // Created via AnimatedMixin /// final opacity = createAnimatedDouble(1.0); /// /// // Setting value triggers animation /// opacity.value = 0.0; /// /// // Access current value during animation /// final current = opacity.value; /// ``` class AnimatedProperty { /// Gets the current value of the animated property. /// /// If an animation is in progress (has a target), this returns the interpolated /// value between the start and target based on the controller's progress. /// Otherwise, it returns the static value. /// /// ## Returns /// /// The current value of type [T], interpolated if animating. /// /// ## Example /// /// ```dart /// final opacity = createAnimatedDouble(1.0); /// print(opacity.value); // 1.0 /// /// opacity.value = 0.0; // Start animating /// print(opacity.value); // Something between 0.0 and 1.0 during animation /// ``` T get value; /// Sets a new target value and starts animating towards it. /// /// When set, this property will smoothly animate from its current value to /// the new target value. If already animating, the animation is reset and /// restarted from the current interpolated position. /// /// ## Parameters /// /// * [value] - The new target value of type [T]. /// /// ## Side Effects /// /// Triggers the animation controller to start/restart, which will cause /// widget rebuilds via the update callback. /// /// ## Example /// /// ```dart /// final size = createAnimatedDouble(100.0); /// /// // Start animation to 200.0 /// size.value = 200.0; /// /// // Change target mid-animation /// size.value = 150.0; // Will animate from current position to 150.0 /// ``` set value(T value); } /// Represents a request to animate to a specific target value. /// /// This class encapsulates the parameters needed for a single animation step, /// including the target value, duration, and easing curve. /// /// ## Overview /// /// Use [AnimationRequest] with [AnimationQueueController] to queue multiple /// animation steps that will be executed sequentially or as replacements. /// /// ## Example /// /// ```dart /// final request = AnimationRequest( /// 1.0, /// Duration(milliseconds: 300), /// Curves.easeOut, /// ); /// controller.push(request); /// ``` class AnimationRequest { /// The target value to animate to (typically 0.0 to 1.0). double target; /// The duration of the animation. Duration duration; /// The easing curve to apply during the animation. Curve curve; /// Creates an animation request with the specified parameters. /// /// ## Parameters /// /// * [target] - The destination value for the animation. /// * [duration] - How long the animation should take. /// * [curve] - The easing curve to use. AnimationRequest(this.target, this.duration, this.curve); } /// Manages the execution of a single animation step. /// /// This class tracks the progress of an animation from a start value to an /// end value over a specified duration using a curve. /// /// ## Overview /// /// [AnimationRunner] is used internally by [AnimationQueueController] to /// execute individual animation steps. It tracks progress and computes /// intermediate values. /// /// ## Example /// /// ```dart /// final runner = AnimationRunner( /// 0.0, // from /// 1.0, // to /// Duration(milliseconds: 200), /// Curves.easeIn, /// ); /// ``` class AnimationRunner { /// The starting value of the animation. double from; /// The ending value of the animation. double to; /// The total duration of the animation. Duration duration; /// The easing curve applied to the animation. Curve curve; /// Creates an animation runner with the specified parameters. /// /// ## Parameters /// /// * [from] - The starting value. /// * [to] - The target value. /// * [duration] - The animation duration. /// * [curve] - The easing curve. AnimationRunner(this.from, this.to, this.duration, this.curve); } /// A controller that manages a queue of animation requests. /// /// This class extends [ChangeNotifier] and provides a way to queue multiple /// animations that execute sequentially or replace the current queue. It /// handles timing via [tick] calls and notifies listeners of value changes. /// /// ## Overview /// /// Use [AnimationQueueController] when you need to chain multiple animations /// or dynamically add/remove animation steps. Call [tick] regularly (e.g., in /// a ticker or animation frame callback) to progress the animations. /// /// ## Example /// /// ```dart /// final controller = AnimationQueueController(0.0); /// /// // Queue animations /// controller.push(AnimationRequest(0.5, Duration(milliseconds: 200), Curves.easeIn)); /// controller.push(AnimationRequest(1.0, Duration(milliseconds: 300), Curves.easeOut)); /// /// // In ticker /// controller.tick(deltaTime); /// ``` class AnimationQueueController extends ChangeNotifier { /// Creates an animation queue controller with an optional initial value. /// /// ## Parameters /// /// * [_value] - The initial value. Defaults to `0.0`. /// /// ## Example /// /// ```dart /// final controller = AnimationQueueController(0.5); /// ``` AnimationQueueController([this._value = 0.0]); /// Adds an animation request to the queue or replaces the current queue. /// /// ## Parameters /// /// * [request] - The animation request to add. /// * [queue] - If `true` (default), adds to the queue. If `false`, clears /// the queue and current runner, making this the only animation. /// /// ## Side Effects /// /// Notifies listeners after modifying the queue. /// /// ## Example /// /// ```dart /// // Add to queue /// controller.push(request); /// /// // Replace queue /// controller.push(request, false); /// ``` void push(AnimationRequest request, [bool queue = true]); /// Sets the current value immediately, clearing all queued animations. /// /// ## Parameters /// /// * [value] - The new value to set. /// /// ## Side Effects /// /// Clears the animation queue and runner, then notifies listeners. /// /// ## Example /// /// ```dart /// controller.value = 0.5; // Jumps to 0.5, cancels animations /// ``` set value(double value); /// Gets the current animation value. /// /// ## Returns /// /// The current value, which may be actively animating. double get value; /// Checks if there are pending animations or an active runner. /// /// ## Returns /// /// `true` if animations should continue to be ticked, `false` otherwise. /// /// ## Example /// /// ```dart /// if (controller.shouldTick) { /// controller.tick(deltaTime); /// } /// ``` bool get shouldTick; /// Advances the animation by the given time delta. /// /// Call this method regularly (e.g., from a ticker) to progress animations. /// If the current animation completes, the next queued animation starts. /// /// ## Parameters /// /// * [delta] - The time elapsed since the last tick. /// /// ## Side Effects /// /// Updates [value] and notifies listeners as the animation progresses. /// /// ## Example /// /// ```dart /// // In a ticker callback /// void _tick(Duration elapsed) { /// final delta = elapsed - _lastElapsed; /// controller.tick(delta); /// _lastElapsed = elapsed; /// } /// ``` void tick(Duration delta); } /// An abstract interface for keyframes in timeline animations. /// /// A keyframe defines how to compute a value at a specific point in a /// timeline animation. Different implementations provide different interpolation /// strategies (absolute, relative, or static). /// /// ## Type Parameters /// /// * [T] - The type of value this keyframe produces. /// /// ## Overview /// /// Use [Keyframe] implementations like [AbsoluteKeyframe], [RelativeKeyframe], /// or [StillKeyframe] to build complex timeline animations with /// [TimelineAnimation]. /// /// See also: /// /// * [AbsoluteKeyframe] - Animates between explicit start and end values. /// * [RelativeKeyframe] - Animates from the previous keyframe's end value. /// * [StillKeyframe] - Holds a value without animating. abstract class Keyframe { /// The duration of this keyframe. /// /// ## Returns /// /// The time this keyframe takes to complete. Duration get duration; /// Computes the value for this keyframe at the given progress. /// /// ## Parameters /// /// * [timeline] - The parent timeline animation. /// * [index] - The index of this keyframe in the timeline. /// * [t] - The local progress through this keyframe (0.0 to 1.0). /// /// ## Returns /// /// The computed value of type [T] at the given progress. T compute(TimelineAnimation timeline, int index, double t); } /// A keyframe that animates between explicit start and end values. /// /// This keyframe interpolates from a specified [from] value to a [to] value /// over its [duration], independent of previous keyframes. /// /// ## Type Parameters /// /// * [T] - The type of value to animate. /// /// ## Overview /// /// Use [AbsoluteKeyframe] when you want complete control over both the start /// and end values of a keyframe, regardless of previous animation state. /// /// ## Example /// /// ```dart /// // Animate from 0.0 to 1.0 over 200ms /// final keyframe = AbsoluteKeyframe( /// Duration(milliseconds: 200), /// 0.0, /// 1.0, /// ); /// ``` class AbsoluteKeyframe implements Keyframe { /// The starting value of the animation. T from; /// The ending value of the animation. T to; Duration duration; /// Creates an absolute keyframe with explicit start and end values. /// /// ## Parameters /// /// * [duration] - How long to animate from [from] to [to]. /// * [from] - The starting value. /// * [to] - The ending value. const AbsoluteKeyframe(this.duration, this.from, this.to); T compute(TimelineAnimation timeline, int index, double t); } /// A keyframe that animates from the previous keyframe's end value to a target. /// /// This keyframe automatically uses the ending value of the previous keyframe /// as its starting point, animating to the specified [target] value. /// /// ## Type Parameters /// /// * [T] - The type of value to animate. /// /// ## Overview /// /// Use [RelativeKeyframe] for smooth transitions between keyframes without /// explicitly specifying start values. If used as the first keyframe, it acts /// as a still keyframe. /// /// ## Example /// /// ```dart /// final timeline = TimelineAnimation( /// keyframes: [ /// AbsoluteKeyframe(Duration(milliseconds: 100), 0.0, 0.5), /// RelativeKeyframe(Duration(milliseconds: 100), 1.0), // from 0.5 to 1.0 /// ], /// ); /// ``` class RelativeKeyframe implements Keyframe { /// The target value to animate to from the previous keyframe's end. T target; Duration duration; /// Creates a relative keyframe that animates to the target value. /// /// ## Parameters /// /// * [duration] - How long to animate to [target]. /// * [target] - The ending value for this keyframe. const RelativeKeyframe(this.duration, this.target); T compute(TimelineAnimation timeline, int index, double t); } /// A keyframe that holds a constant value without animating. /// /// This keyframe maintains a static value for its duration. If [value] is `null`, /// it uses the ending value from the previous keyframe. /// /// ## Type Parameters /// /// * [T] - The type of value to hold. /// /// ## Overview /// /// Use [StillKeyframe] to create pauses or delays in timeline animations where /// the value remains constant for a period of time. /// /// ## Example /// /// ```dart /// final timeline = TimelineAnimation( /// keyframes: [ /// AbsoluteKeyframe(Duration(milliseconds: 100), 0.0, 1.0), /// StillKeyframe(Duration(milliseconds: 200)), // Hold at 1.0 for 200ms /// RelativeKeyframe(Duration(milliseconds: 100), 0.0), // Back to 0.0 /// ], /// ); /// ``` class StillKeyframe implements Keyframe { /// The value to hold, or `null` to use the previous keyframe's end value. T? value; Duration duration; /// Creates a still keyframe that holds a value. /// /// ## Parameters /// /// * [duration] - How long to hold the value. /// * [value] - The value to hold, or `null` to use the previous keyframe's end value. /// /// ## Notes /// /// If [value] is `null`, this keyframe must not be the first in the timeline. const StillKeyframe(this.duration, [this.value]); T compute(TimelineAnimation timeline, int index, double t); } /// An [Animatable] wrapper for [TimelineAnimation] with explicit duration. /// /// This class adapts a [TimelineAnimation] to work with a specific total duration, /// scaling the animation to fit within that time frame. /// /// ## Type Parameters /// /// * [T] - The type of value being animated. /// /// ## Overview /// /// [TimelineAnimatable] is typically created via [TimelineAnimation.drive] or /// [TimelineAnimation.withTotalDuration] to bind a timeline to a controller. /// /// ## Example /// /// ```dart /// final controller = AnimationController( /// vsync: this, /// duration: Duration(seconds: 2), /// ); /// final animatable = timeline.drive(controller); /// ``` class TimelineAnimatable extends Animatable { /// The total duration for this animatable. Duration duration; /// The underlying timeline animation. TimelineAnimation animation; /// Creates a timeline animatable with the specified duration. /// /// ## Parameters /// /// * [duration] - The total duration for the animation. /// * [animation] - The timeline animation to wrap. TimelineAnimatable(this.duration, this.animation); T transform(double t); } /// A timeline-based animation built from multiple keyframes. /// /// This class extends [Animatable]`` and orchestrates complex animations by /// sequencing multiple [Keyframe]s. Each keyframe defines a segment of the /// animation with its own duration and interpolation strategy. /// /// ## Type Parameters /// /// * [T] - The type of value being animated. /// /// ## Overview /// /// Use [TimelineAnimation] to create sophisticated multi-stage animations. /// Keyframes can be absolute, relative, or still, allowing for diverse /// animation patterns. The timeline automatically calculates total duration /// from all keyframes. /// /// ## Example /// /// ```dart /// final timeline = TimelineAnimation( /// lerp: Transformers.typeDouble, /// keyframes: [ /// AbsoluteKeyframe(Duration(milliseconds: 100), 0.0, 1.0), /// StillKeyframe(Duration(milliseconds: 50)), /// RelativeKeyframe(Duration(milliseconds: 100), 0.5), /// ], /// ); /// ``` class TimelineAnimation extends Animatable { /// Default lerp function that works with numeric types. /// /// This function performs basic arithmetic interpolation. It assumes the /// type supports addition, subtraction, and multiplication operators. /// /// ## Type Parameters /// /// * [T] - The type to interpolate (must support arithmetic operations). /// /// ## Parameters /// /// * [a] - The starting value. /// * [b] - The ending value. /// * [t] - The interpolation factor (0.0 to 1.0). /// /// ## Returns /// /// The interpolated value. static T defaultLerp(T a, T b, double t); /// The interpolation function used for this timeline. PropertyLerp lerp; /// The total duration of all keyframes combined. Duration totalDuration; /// The list of keyframes that make up this timeline. List> keyframes; /// Creates a timeline animation from a list of keyframes. /// /// ## Parameters /// /// * [lerp] - Optional interpolation function. Uses [defaultLerp] if not provided. /// * [keyframes] - The list of keyframes defining the animation. Must not be empty. /// /// ## Returns /// /// A new [TimelineAnimation] with calculated total duration. /// /// ## Example /// /// ```dart /// final timeline = TimelineAnimation( /// lerp: Transformers.typeColor, /// keyframes: [ /// AbsoluteKeyframe(Duration(milliseconds: 300), Colors.red, Colors.blue), /// RelativeKeyframe(Duration(milliseconds: 200), Colors.green), /// ], /// ); /// ``` factory TimelineAnimation({PropertyLerp? lerp, required List> keyframes}); /// Binds this timeline to an [AnimationController]. /// /// ## Parameters /// /// * [controller] - The animation controller to drive this timeline. /// Must have a non-null duration. /// /// ## Returns /// /// A [TimelineAnimatable] that can be used with the controller. /// /// ## Example /// /// ```dart /// final controller = AnimationController( /// vsync: this, /// duration: Duration(seconds: 1), /// ); /// final animatable = timeline.drive(controller); /// ``` TimelineAnimatable drive(AnimationController controller); /// Transforms the timeline using the controller's current value. /// /// This is a convenience method that combines [drive] and [Animatable.transform]. /// /// ## Parameters /// /// * [controller] - The animation controller to read the value from. /// /// ## Returns /// /// The current value of type [T] based on the controller's progress. /// /// ## Example /// /// ```dart /// final value = timeline.transformWithController(controller); /// ``` T transformWithController(AnimationController controller); /// Creates a [TimelineAnimatable] with the specified total duration. /// /// ## Parameters /// /// * [duration] - The desired total duration for this timeline. /// /// ## Returns /// /// A [TimelineAnimatable] that scales this timeline to the given duration. /// /// ## Example /// /// ```dart /// // Timeline with natural duration of 500ms /// final timeline = TimelineAnimation(...); /// /// // Scale to 2 seconds /// final animatable = timeline.withTotalDuration(Duration(seconds: 2)); /// ``` TimelineAnimatable withTotalDuration(Duration duration); T transform(double t); } /// Returns the maximum of two [Duration] values. /// /// ## Parameters /// /// * [a] - The first duration. /// * [b] - The second duration. /// /// ## Returns /// /// The longer of the two durations. /// /// ## Example /// /// ```dart /// final longer = maxDuration( /// Duration(milliseconds: 100), /// Duration(milliseconds: 200), /// ); // Duration(milliseconds: 200) /// ``` Duration maxDuration(Duration a, Duration b); /// Returns the minimum of two [Duration] values. /// /// ## Parameters /// /// * [a] - The first duration. /// * [b] - The second duration. /// /// ## Returns /// /// The shorter of the two durations. /// /// ## Example /// /// ```dart /// final shorter = minDuration( /// Duration(milliseconds: 100), /// Duration(milliseconds: 200), /// ); // Duration(milliseconds: 100) /// ``` Duration minDuration(Duration a, Duration b); /// Finds the maximum total duration among multiple timeline animations. /// /// ## Parameters /// /// * [timelines] - An iterable collection of [TimelineAnimation] instances. /// /// ## Returns /// /// The longest [totalDuration] found among all timelines, or [Duration.zero] /// if the collection is empty. /// /// ## Example /// /// ```dart /// final timelines = [ /// TimelineAnimation(keyframes: [...]), // 300ms /// TimelineAnimation(keyframes: [...]), // 500ms /// TimelineAnimation(keyframes: [...]), // 200ms /// ]; /// /// final maxDur = timelineMaxDuration(timelines); // Duration(milliseconds: 500) /// ``` Duration timelineMaxDuration(Iterable timelines); /// Platform-specific implementations for shadcn_flutter. /// /// This class provides a base interface for platform-specific functionality. /// Platform-specific implementations should override these methods. class ShadcnFlutterPlatformImplementations { /// Called when the app is initialized. /// /// Platform implementations can override this to perform initialization tasks. void onAppInitialized(); /// Called when the theme changes. /// /// Platform implementations can override this to respond to theme changes. /// The [theme] parameter contains the new theme data. void onThemeChanged(ThemeData theme); } /// A collection of color constants and shades for shadcn_flutter. /// /// This class provides predefined colors and color shades that can be used /// throughout the application. All colors follow the shadcn design system. class Colors { /// Pure black color. static const Color black = Color(0xff000000); /// Pure white color. static const Color white = Color(0xffffffff); /// Slate color shades (50-950). static const ColorShades slate = ColorShades.raw({50 : Color(0xfff8fafc), 100 : Color(0xfff1f5f9), 200 : Color(0xffe2e8f0), 300 : Color(0xffcbd5e1), 400 : Color(0xff94a3b8), 500 : Color(0xff64748b), 600 : Color(0xff475569), 700 : Color(0xff334155), 800 : Color(0xff1e293b), 900 : Color(0xff0f172a), 950 : Color(0xff020617)}); /// Gray color shades (50-950). static const ColorShades gray = ColorShades.raw({50 : Color(0xfff9fafb), 100 : Color(0xfff3f4f6), 200 : Color(0xffe5e7eb), 300 : Color(0xffd1d5db), 400 : Color(0xff9ca3af), 500 : Color(0xff6b7280), 600 : Color(0xff4b5563), 700 : Color(0xff374151), 800 : Color(0xff1f2937), 900 : Color(0xff111827), 950 : Color(0xff030712)}); /// Zinc color shades (50-950). static const ColorShades zinc = ColorShades.raw({50 : Color(0xfffafafa), 100 : Color(0xfff4f4f5), 200 : Color(0xffe4e4e7), 300 : Color(0xffd4d4d8), 400 : Color(0xffa1a1aa), 500 : Color(0xff71717a), 600 : Color(0xff52525b), 700 : Color(0xff3f3f46), 800 : Color(0xff27272a), 900 : Color(0xff18181b), 950 : Color(0xff09090b)}); /// Neutral color shades (50-950). static const ColorShades neutral = ColorShades.raw({50 : Color(0xfffafafa), 100 : Color(0xfff5f5f5), 200 : Color(0xffe5e5e5), 300 : Color(0xffd4d4d4), 400 : Color(0xffa3a3a3), 500 : Color(0xff737373), 600 : Color(0xff525252), 700 : Color(0xff404040), 800 : Color(0xff262626), 900 : Color(0xff171717), 950 : Color(0xff0a0a0a)}); /// Stone color shades (50-950). static const ColorShades stone = ColorShades.raw({50 : Color(0xfffafaf9), 100 : Color(0xfff5f5f4), 200 : Color(0xffe7e5e4), 300 : Color(0xffd6d3d1), 400 : Color(0xffa8a29e), 500 : Color(0xff78716c), 600 : Color(0xff57534e), 700 : Color(0xff44403c), 800 : Color(0xff292524), 900 : Color(0xff1c1917), 950 : Color(0xff0c0a09)}); /// Red color shades (50-950). static const ColorShades red = ColorShades.raw({50 : Color(0xfffef2f2), 100 : Color(0xfffee2e2), 200 : Color(0xfffecaca), 300 : Color(0xfffca5a5), 400 : Color(0xfff87171), 500 : Color(0xffef4444), 600 : Color(0xffdc2626), 700 : Color(0xffb91c1c), 800 : Color(0xff991b1b), 900 : Color(0xff7f1d1d), 950 : Color(0xff450a0a)}); /// Orange color shades (50-950). static const ColorShades orange = ColorShades.raw({50 : Color(0xfffff7ed), 100 : Color(0xffffedd5), 200 : Color(0xfffed7aa), 300 : Color(0xfffdba74), 400 : Color(0xfffb923c), 500 : Color(0xfff97316), 600 : Color(0xffea580c), 700 : Color(0xffc2410c), 800 : Color(0xff9a3412), 900 : Color(0xff7c2d12), 950 : Color(0xff431407)}); /// Amber color shades (50-950). static const ColorShades amber = ColorShades.raw({50 : Color(0xfffffbeb), 100 : Color(0xfffef3c7), 200 : Color(0xfffde68a), 300 : Color(0xfffcd34d), 400 : Color(0xfffbbf24), 500 : Color(0xfff59e0b), 600 : Color(0xffd97706), 700 : Color(0xffb45309), 800 : Color(0xff92400e), 900 : Color(0xff78350f), 950 : Color(0xff451a03)}); /// Yellow color shades (50-950). static const ColorShades yellow = ColorShades.raw({50 : Color(0xfffefce8), 100 : Color(0xfffef9c3), 200 : Color(0xfffef08a), 300 : Color(0xfffde047), 400 : Color(0xfffacc15), 500 : Color(0xffeab308), 600 : Color(0xffca8a04), 700 : Color(0xffa16207), 800 : Color(0xff854d0e), 900 : Color(0xff713f12), 950 : Color(0xff422006)}); /// Lime color shades (50-950). static const ColorShades lime = ColorShades.raw({50 : Color(0xfff7fee7), 100 : Color(0xffecfccb), 200 : Color(0xffd9f99d), 300 : Color(0xffbef264), 400 : Color(0xffa3e635), 500 : Color(0xff84cc16), 600 : Color(0xff65a30d), 700 : Color(0xff4d7c0f), 800 : Color(0xff3f6212), 900 : Color(0xff365314), 950 : Color(0xff1a2e05)}); /// Green color shades (50-950). static const ColorShades green = ColorShades.raw({50 : Color(0xfff0fdf4), 100 : Color(0xffdcfce7), 200 : Color(0xffbbf7d0), 300 : Color(0xff86efac), 400 : Color(0xff4ade80), 500 : Color(0xff22c55e), 600 : Color(0xff16a34a), 700 : Color(0xff15803d), 800 : Color(0xff166534), 900 : Color(0xff14532d), 950 : Color(0xff052e16)}); /// Emerald color shades (50-950). static const ColorShades emerald = ColorShades.raw({50 : Color(0xffecfdf5), 100 : Color(0xffd1fae5), 200 : Color(0xffa7f3d0), 300 : Color(0xff6ee7b7), 400 : Color(0xff34d399), 500 : Color(0xff10b981), 600 : Color(0xff059669), 700 : Color(0xff047857), 800 : Color(0xff065f46), 900 : Color(0xff064e3b), 950 : Color(0xff022c22)}); /// Teal color shades (50-950). static const ColorShades teal = ColorShades.raw({50 : Color(0xfff0fdfa), 100 : Color(0xffccfbf1), 200 : Color(0xff99f6e4), 300 : Color(0xff5eead4), 400 : Color(0xff2dd4bf), 500 : Color(0xff14b8a6), 600 : Color(0xff0d9488), 700 : Color(0xff0f766e), 800 : Color(0xff115e59), 900 : Color(0xff134e4a), 950 : Color(0xff042f2e)}); /// Cyan color shades (50-950). static const ColorShades cyan = ColorShades.raw({50 : Color(0xffecfeff), 100 : Color(0xffcffafe), 200 : Color(0xffa5f3fc), 300 : Color(0xff67e8f9), 400 : Color(0xff22d3ee), 500 : Color(0xff06b6d4), 600 : Color(0xff0891b2), 700 : Color(0xff0e7490), 800 : Color(0xff155e75), 900 : Color(0xff164e63), 950 : Color(0xff083344)}); /// Sky color shades (50-950). static const ColorShades sky = ColorShades.raw({50 : Color(0xfff0f9ff), 100 : Color(0xffe0f2fe), 200 : Color(0xffbae6fd), 300 : Color(0xff7dd3fc), 400 : Color(0xff38bdf8), 500 : Color(0xff0ea5e9), 600 : Color(0xff0284c7), 700 : Color(0xff0369a1), 800 : Color(0xff075985), 900 : Color(0xff0c4a6e), 950 : Color(0xff082f49)}); /// Blue color shades (50-950). static const ColorShades blue = ColorShades.raw({50 : Color(0xffeff6ff), 100 : Color(0xffdbeafe), 200 : Color(0xffbfdbfe), 300 : Color(0xff93c5fd), 400 : Color(0xff60a5fa), 500 : Color(0xff3b82f6), 600 : Color(0xff2563eb), 700 : Color(0xff1d4ed8), 800 : Color(0xff1e40af), 900 : Color(0xff1e3a8a), 950 : Color(0xff172554)}); /// Indigo color shades (50-950). static const ColorShades indigo = ColorShades.raw({50 : Color(0xffeef2ff), 100 : Color(0xffe0e7ff), 200 : Color(0xffc7d2fe), 300 : Color(0xffa5b4fc), 400 : Color(0xff818cf8), 500 : Color(0xff6366f1), 600 : Color(0xff4f46e5), 700 : Color(0xff4338ca), 800 : Color(0xff3730a3), 900 : Color(0xff312e81), 950 : Color(0xff1e1b4b)}); /// Violet color shades (50-950). static const ColorShades violet = ColorShades.raw({50 : Color(0xfff5f3ff), 100 : Color(0xffede9fe), 200 : Color(0xffddd6fe), 300 : Color(0xffc4b5fd), 400 : Color(0xffa78bfa), 500 : Color(0xff8b5cf6), 600 : Color(0xff7c3aed), 700 : Color(0xff6d28d9), 800 : Color(0xff5b21b6), 900 : Color(0xff4c1d95), 950 : Color(0xff1e1b4b)}); /// Purple color shades (50-950). static const ColorShades purple = ColorShades.raw({50 : Color(0xfffaf5ff), 100 : Color(0xfff3e8ff), 200 : Color(0xffe9d5ff), 300 : Color(0xffd8b4fe), 400 : Color(0xffc084fc), 500 : Color(0xffa855f7), 600 : Color(0xff9333ea), 700 : Color(0xff7e22ce), 800 : Color(0xff6b21a8), 900 : Color(0xff581c87), 950 : Color(0xff3b0764)}); /// Fuchsia color shades (50-950). static const ColorShades fuchsia = ColorShades.raw({50 : Color(0xfffdf4ff), 100 : Color(0xfffae8ff), 200 : Color(0xfff5d0fe), 300 : Color(0xfff0abfc), 400 : Color(0xffe879f9), 500 : Color(0xffd946ef), 600 : Color(0xffc026d3), 700 : Color(0xffa21caf), 800 : Color(0xff86198f), 900 : Color(0xff701a75), 950 : Color(0xff4a044e)}); /// Pink color shades (50-950). static const ColorShades pink = ColorShades.raw({50 : Color(0xfffdf2f8), 100 : Color(0xfffce7f3), 200 : Color(0xfffbcfe8), 300 : Color(0xfff9a8d4), 400 : Color(0xfff472b6), 500 : Color(0xffec4899), 600 : Color(0xffdb2777), 700 : Color(0xffbe185d), 800 : Color(0xff9d174d), 900 : Color(0xff831843), 950 : Color(0xff500724)}); /// Rose color shades (50-950). static const ColorShades rose = ColorShades.raw({50 : Color(0xfffff1f2), 100 : Color(0xffffe4e6), 200 : Color(0xfffecdd3), 300 : Color(0xfffda4af), 400 : Color(0xfffb7185), 500 : Color(0xfff43f5e), 600 : Color(0xffe11d48), 700 : Color(0xffbe123c), 800 : Color(0xff9f1239), 900 : Color(0xff881337), 950 : Color(0xff4c0519)}); /// Fully transparent color. static const Color transparent = Color(0x00000000); /// List of primary color swatches from the Material color palette. /// /// Contains all standard Material Design color shades (slate, gray, zinc, /// neutral, stone, red, orange, amber, yellow, lime, green, emerald, etc.). static List primaries; } /// Typography definitions for shadcn_flutter. /// /// Provides predefined text styles for different purposes including /// sizes, weights, and semantic styles like headings and paragraphs. class Typography { /// Sans-serif font style. TextStyle sans; /// Monospace font style. TextStyle mono; /// Extra small text (12px). TextStyle xSmall; /// Small text (14px). TextStyle small; /// Base text size (16px). TextStyle base; /// Large text (18px). TextStyle large; /// Extra large text (20px). TextStyle xLarge; /// 2x large text (24px). TextStyle x2Large; /// 3x large text (30px). TextStyle x3Large; /// 4x large text (36px). TextStyle x4Large; /// 5x large text (48px). TextStyle x5Large; /// 6x large text (60px). TextStyle x6Large; /// 7x large text (72px). TextStyle x7Large; /// 8x large text (96px). TextStyle x8Large; /// 9x large text (144px). TextStyle x9Large; /// Thin font weight (100). TextStyle thin; /// Light font weight (300). TextStyle light; /// Extra light font weight (200). TextStyle extraLight; /// Normal font weight (400). TextStyle normal; /// Medium font weight (500). TextStyle medium; /// Semi-bold font weight (600). TextStyle semiBold; /// Bold font weight (700). TextStyle bold; /// Extra bold font weight (800). TextStyle extraBold; /// Black font weight (900). TextStyle black; /// Italic text style. TextStyle italic; /// Heading 1 style. TextStyle h1; /// Heading 2 style. TextStyle h2; /// Heading 3 style. TextStyle h3; /// Heading 4 style. TextStyle h4; /// Paragraph style. TextStyle p; /// Block quote style. TextStyle blockQuote; /// Inline code style. TextStyle inlineCode; /// Lead text style. TextStyle lead; /// Large text style. TextStyle textLarge; /// Small text style. TextStyle textSmall; /// Muted text style. TextStyle textMuted; /// Creates a typography with Geist font family. const Typography.geist({this.sans = const TextStyle(fontFamily: 'GeistSans', package: 'shadcn_flutter'), this.mono = const TextStyle(fontFamily: 'GeistMono', package: 'shadcn_flutter'), this.xSmall = const TextStyle(fontSize: 12), this.small = const TextStyle(fontSize: 14), this.base = const TextStyle(fontSize: 16), this.large = const TextStyle(fontSize: 18), this.xLarge = const TextStyle(fontSize: 20), this.x2Large = const TextStyle(fontSize: 24), this.x3Large = const TextStyle(fontSize: 30), this.x4Large = const TextStyle(fontSize: 36), this.x5Large = const TextStyle(fontSize: 48), this.x6Large = const TextStyle(fontSize: 60), this.x7Large = const TextStyle(fontSize: 72), this.x8Large = const TextStyle(fontSize: 96), this.x9Large = const TextStyle(fontSize: 144), this.thin = const TextStyle(fontWeight: FontWeight.w100), this.light = const TextStyle(fontWeight: FontWeight.w300), this.extraLight = const TextStyle(fontWeight: FontWeight.w200), this.normal = const TextStyle(fontWeight: FontWeight.w400), this.medium = const TextStyle(fontWeight: FontWeight.w500), this.semiBold = const TextStyle(fontWeight: FontWeight.w600), this.bold = const TextStyle(fontWeight: FontWeight.w700), this.extraBold = const TextStyle(fontWeight: FontWeight.w800), this.black = const TextStyle(fontWeight: FontWeight.w900), this.italic = const TextStyle(fontStyle: FontStyle.italic), this.h1 = const TextStyle(fontSize: 36, fontWeight: FontWeight.w800), this.h2 = const TextStyle(fontSize: 30, fontWeight: FontWeight.w600), this.h3 = const TextStyle(fontSize: 24, fontWeight: FontWeight.w600), this.h4 = const TextStyle(fontSize: 18, fontWeight: FontWeight.w600), this.p = const TextStyle(fontSize: 16, fontWeight: FontWeight.w400), this.blockQuote = const TextStyle(fontSize: 16, fontWeight: FontWeight.w400, fontStyle: FontStyle.italic), this.inlineCode = const TextStyle(fontFamily: 'GeistMono', fontSize: 14, fontWeight: FontWeight.w600), this.lead = const TextStyle(fontSize: 20), this.textLarge = const TextStyle(fontSize: 20, fontWeight: FontWeight.w600), this.textSmall = const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), this.textMuted = const TextStyle(fontSize: 14, fontWeight: FontWeight.w400)}); /// Creates a custom typography with all required text styles. const Typography({required this.sans, required this.mono, required this.xSmall, required this.small, required this.base, required this.large, required this.xLarge, required this.x2Large, required this.x3Large, required this.x4Large, required this.x5Large, required this.x6Large, required this.x7Large, required this.x8Large, required this.x9Large, required this.thin, required this.light, required this.extraLight, required this.normal, required this.medium, required this.semiBold, required this.bold, required this.extraBold, required this.black, required this.italic, required this.h1, required this.h2, required this.h3, required this.h4, required this.p, required this.blockQuote, required this.inlineCode, required this.lead, required this.textLarge, required this.textSmall, required this.textMuted}); /// Creates a copy of this typography with the given fields replaced. Typography copyWith({ValueGetter? sans, ValueGetter? mono, ValueGetter? xSmall, ValueGetter? small, ValueGetter? base, ValueGetter? large, ValueGetter? xLarge, ValueGetter? x2Large, ValueGetter? x3Large, ValueGetter? x4Large, ValueGetter? x5Large, ValueGetter? x6Large, ValueGetter? x7Large, ValueGetter? x8Large, ValueGetter? x9Large, ValueGetter? thin, ValueGetter? light, ValueGetter? extraLight, ValueGetter? normal, ValueGetter? medium, ValueGetter? semiBold, ValueGetter? bold, ValueGetter? extraBold, ValueGetter? black, ValueGetter? italic, ValueGetter? h1, ValueGetter? h2, ValueGetter? h3, ValueGetter? h4, ValueGetter? p, ValueGetter? blockQuote, ValueGetter? inlineCode, ValueGetter? lead, ValueGetter? textLarge, ValueGetter? textSmall, ValueGetter? textMuted}); /// Scales all typography font sizes by the given factor. /// /// Parameters: /// - [factor] (`double`, required): Scaling factor to apply. /// /// Returns: `Typography` — scaled typography. Typography scale(double factor); /// Linearly interpolates between two typographies. /// /// Parameters: /// - [a] (`Typography`, required): Start typography. /// - [b] (`Typography`, required): End typography. /// - [t] (`double`, required): Interpolation position (0.0 to 1.0). /// /// Returns: `Typography` — interpolated typography. static Typography lerp(Typography a, Typography b, double t); bool operator ==(Object other); int get hashCode; String toString(); } /// Theme extension for [BuildContext] extension ThemeExtension on BuildContext { /// Get the theme data ThemeData get theme; /// Get component theme T? componentTheme(); } /// Defines scaling behavior for adaptive layouts. /// /// Provides different scaling strategies for text and icons. class AdaptiveScaling { /// Default scaling for desktop layouts (1.0). static const AdaptiveScaling desktop = AdaptiveScaling(); /// Default scaling for mobile layouts (1.25x). static const AdaptiveScaling mobile = AdaptiveScaling(1.25); /// Scaling factor for border radius. double radiusScaling; /// Scaling factor for component sizes. double sizeScaling; /// Scaling factor for text. double textScaling; /// Creates uniform [AdaptiveScaling] with the same factor for all properties. /// /// Parameters: /// - [scaling] (`double`, default: 1): Scaling factor for radius, size, and text. const AdaptiveScaling([double scaling = 1]); /// Creates [AdaptiveScaling] with individual scaling factors. /// /// Parameters: /// - [radiusScaling] (`double`, default: 1): Border radius scaling factor. /// - [sizeScaling] (`double`, default: 1): Size and spacing scaling factor. /// - [textScaling] (`double`, default: 1): Text and icon scaling factor. const AdaptiveScaling.only({this.radiusScaling = 1, this.sizeScaling = 1, this.textScaling = 1}); /// Applies this scaling to a theme. /// /// Returns a new ThemeData with radius, sizing, typography, and icon theme /// scaled according to this AdaptiveScaling's factors. /// /// Parameters: /// - [theme] (ThemeData, required): Theme to scale /// /// Returns scaled ThemeData. ThemeData scale(ThemeData theme); /// Linearly interpolates between two AdaptiveScaling instances. /// /// Creates a new AdaptiveScaling that represents a transition between [a] and [b] /// at position [t]. When t=0, returns [a]; when t=1, returns [b]. /// /// Parameters: /// - [a] (AdaptiveScaling, required): Start scaling /// - [b] (AdaptiveScaling, required): End scaling /// - [t] (double, required): Interpolation position (0.0 to 1.0) /// /// Returns interpolated AdaptiveScaling. static AdaptiveScaling lerp(AdaptiveScaling a, AdaptiveScaling b, double t); } /// A widget that applies adaptive scaling to its descendants. class AdaptiveScaler extends StatelessWidget { /// Gets the default adaptive scaling for the current context. /// /// Returns [AdaptiveScaling.mobile] for iOS/Android platforms, /// [AdaptiveScaling.desktop] for other platforms. static AdaptiveScaling defaultScalingOf(BuildContext context); /// Gets the default adaptive scaling for the given theme. /// /// Returns [AdaptiveScaling.mobile] for iOS/Android platforms, /// [AdaptiveScaling.desktop] for other platforms. static AdaptiveScaling defaultScaling(ThemeData theme); /// The scaling to apply. AdaptiveScaling scaling; /// The widget below this widget in the tree. Widget child; /// Creates an [AdaptiveScaler]. /// /// Parameters: /// - [scaling] (`AdaptiveScaling`, required): Scaling factors to apply. /// - [child] (`Widget`, required): Child widget. const AdaptiveScaler({super.key, required this.scaling, required this.child}); Widget build(BuildContext context); } /// The theme data for shadcn_flutter. /// /// Contains all theming information including colors, typography, /// scaling, and platform-specific settings. class ThemeData { /// The color scheme for this theme. ColorScheme colorScheme; /// The typography settings for this theme. Typography typography; /// Base radius multiplier for border radius calculations. double radius; /// Scale factor for sizes and spacing. double scaling; /// Icon theme properties defining icon sizes across different scales. IconThemeProperties iconTheme; /// Default opacity for surface overlays (0.0 to 1.0). double? surfaceOpacity; /// Default blur radius for surface effects. double? surfaceBlur; /// Creates a [ThemeData] with light color scheme. /// /// Parameters: /// - [colorScheme] (`ColorScheme`, default: light colors): Color palette. /// - [radius] (`double`, default: 0.5): Base radius multiplier. /// - [scaling] (`double`, default: 1): Size scaling factor. /// - [typography] (`Typography`, default: Geist): Typography settings. /// - [iconTheme] (`IconThemeProperties`, default: standard sizes): Icon theme. /// - [platform] (`TargetPlatform?`, optional): Target platform override. /// - [surfaceOpacity] (`double?`, optional): Surface overlay opacity. /// - [surfaceBlur] (`double?`, optional): Surface blur radius. const ThemeData({this.colorScheme = ColorSchemes.lightDefaultColor, this.radius = 0.5, this.scaling = 1, this.typography = const Typography.geist(), this.iconTheme = const IconThemeProperties(), TargetPlatform? platform, this.surfaceOpacity, this.surfaceBlur}); /// Creates a [ThemeData] with dark color scheme. /// /// Parameters: /// - [colorScheme] (`ColorScheme`, default: dark colors): Color palette. /// - [radius] (`double`, default: 0.5): Base radius multiplier. /// - [scaling] (`double`, default: 1): Size scaling factor. /// - [typography] (`Typography`, default: Geist): Typography settings. /// - [iconTheme] (`IconThemeProperties`, default: standard sizes): Icon theme. /// - [platform] (`TargetPlatform?`, optional): Target platform override. /// - [surfaceOpacity] (`double?`, optional): Surface overlay opacity. /// - [surfaceBlur] (`double?`, optional): Surface blur radius. const ThemeData.dark({this.colorScheme = ColorSchemes.darkDefaultColor, this.radius = 0.5, this.scaling = 1, this.typography = const Typography.geist(), this.iconTheme = const IconThemeProperties(), TargetPlatform? platform, this.surfaceOpacity, this.surfaceBlur}); /// The current platform. TargetPlatform get platform; /// The specified platform, or null if not overridden. TargetPlatform? get specifiedPlatform; /// At normal radius, the scaled radius is 24 double get radiusXxl; /// At normal radius, the scaled radius is 20 double get radiusXl; /// At normal radius, the scaled radius is 16 double get radiusLg; /// At normal radius, the scaled radius is 12 double get radiusMd; /// At normal radius, the scaled radius is 8 double get radiusSm; /// At normal radius, the scaled radius is 4 double get radiusXs; /// Creates a circular border radius using [radiusXxl]. BorderRadius get borderRadiusXxl; /// Creates a circular border radius using [radiusXl]. BorderRadius get borderRadiusXl; /// Creates a circular border radius using [radiusLg]. BorderRadius get borderRadiusLg; /// Creates a circular border radius using [radiusMd]. BorderRadius get borderRadiusMd; /// Creates a circular border radius using [radiusSm]. BorderRadius get borderRadiusSm; /// Creates a circular border radius using [radiusXs]. BorderRadius get borderRadiusXs; /// Creates a circular radius using [radiusXxl]. Radius get radiusXxlRadius; /// Creates a circular radius using [radiusXl]. Radius get radiusXlRadius; /// Creates a circular radius using [radiusLg]. Radius get radiusLgRadius; /// Creates a circular radius using [radiusMd]. Radius get radiusMdRadius; /// Creates a circular radius using [radiusSm]. Radius get radiusSmRadius; /// Creates a circular radius using [radiusXs]. Radius get radiusXsRadius; /// Gets the brightness (light or dark) from the color scheme. Brightness get brightness; /// Creates a copy of this theme with specified properties overridden. /// /// All parameters are optional getters that provide new values when present. /// /// Returns: `ThemeData` — a new theme with updated values. ThemeData copyWith({ValueGetter? colorScheme, ValueGetter? radius, ValueGetter? typography, ValueGetter? platform, ValueGetter? scaling, ValueGetter? iconTheme, ValueGetter? surfaceOpacity, ValueGetter? surfaceBlur}); /// Linearly interpolates between two theme datas. /// /// Parameters: /// - [a] (`ThemeData`, required): Start theme. /// - [b] (`ThemeData`, required): End theme. /// - [t] (`double`, required): Interpolation position (0.0 to 1.0). /// /// Returns: `ThemeData` — interpolated theme. static ThemeData lerp(ThemeData a, ThemeData b, double t); bool operator ==(Object other); int get hashCode; String toString(); } /// An inherited widget that provides theme data to its descendants. class Theme extends InheritedTheme { /// The theme data to provide to descendants. ThemeData data; /// Creates a [Theme]. /// /// Parameters: /// - [data] (`ThemeData`, required): Theme data to provide. /// - [child] (`Widget`, required): Child widget. const Theme({super.key, required this.data, required super.child}); /// Gets the [ThemeData] from the closest [Theme] ancestor. /// /// Throws if no [Theme] is found in the widget tree. /// /// Returns: `ThemeData` — the theme data. static ThemeData of(BuildContext context); bool updateShouldNotify(covariant Theme oldWidget); Widget wrap(BuildContext context, Widget child); void debugFillProperties(DiagnosticPropertiesBuilder properties); } /// A tween for animating between two [ThemeData] values. class ThemeDataTween extends Tween { /// Creates a [ThemeDataTween]. /// /// Parameters: /// - [begin] (`ThemeData`, required): Starting theme. /// - [end] (`ThemeData`, required): Ending theme. ThemeDataTween({required ThemeData super.begin, required super.end}); ThemeData lerp(double t); } /// A widget that animates theme changes over time. class AnimatedTheme extends ImplicitlyAnimatedWidget { /// The target theme data to animate to. ThemeData data; /// The widget below this widget in the tree. Widget child; /// Creates an [AnimatedTheme]. /// /// Parameters: /// - [data] (`ThemeData`, required): Target theme. /// - [duration] (`Duration`, required): Animation duration. /// - [curve] (`Curve`, optional): Animation curve. /// - [child] (`Widget`, required): Child widget. const AnimatedTheme({super.key, required this.data, required super.duration, super.curve, required this.child}); AnimatedWidgetBaseState createState(); } /// Properties for icon theming. /// /// Defines size and color for different icon sizes across the theme. class IconThemeProperties { /// Icon theme for 4x-small icons (6px). IconThemeData x4Small; /// Icon theme for 3x-small icons (8px). IconThemeData x3Small; /// Icon theme for 2x-small icons (10px). IconThemeData x2Small; /// Icon theme for extra-small icons (12px). IconThemeData xSmall; /// Icon theme for small icons (16px). IconThemeData small; /// Icon theme for medium icons (20px). IconThemeData medium; /// Icon theme for large icons (24px). IconThemeData large; /// Icon theme for extra-large icons (32px). IconThemeData xLarge; /// Icon theme for 2x-large icons (40px). IconThemeData x2Large; /// Icon theme for 3x-large icons (48px). IconThemeData x3Large; /// Icon theme for 4x-large icons (56px). IconThemeData x4Large; /// Creates [IconThemeProperties] with default icon sizes. /// /// All parameters are optional and default to predefined sizes. const IconThemeProperties({this.x4Small = const IconThemeData(size: 6), this.x3Small = const IconThemeData(size: 8), this.x2Small = const IconThemeData(size: 10), this.xSmall = const IconThemeData(size: 12), this.small = const IconThemeData(size: 16), this.medium = const IconThemeData(size: 20), this.large = const IconThemeData(size: 24), this.xLarge = const IconThemeData(size: 32), this.x2Large = const IconThemeData(size: 40), this.x3Large = const IconThemeData(size: 48), this.x4Large = const IconThemeData(size: 56)}); /// Creates a copy with updated icon themes. /// /// All parameters are optional getters. Omitted values retain their current value. /// /// Returns: `IconThemeProperties` — a new instance with updated values. IconThemeProperties copyWith({ValueGetter? x4Small, ValueGetter? x3Small, ValueGetter? x2Small, ValueGetter? xSmall, ValueGetter? small, ValueGetter? medium, ValueGetter? large, ValueGetter? xLarge, ValueGetter? x2Large, ValueGetter? x3Large, ValueGetter? x4Large}); /// Scales all icon sizes by the given factor. /// /// Parameters: /// - [factor] (`double`, required): Scaling factor to apply. /// /// Returns: `IconThemeProperties` — scaled icon theme properties. IconThemeProperties scale(double factor); /// Linearly interpolates between two icon theme properties. /// /// Parameters: /// - [a] (`IconThemeProperties`, required): Start properties. /// - [b] (`IconThemeProperties`, required): End properties. /// - [t] (`double`, required): Interpolation position (0.0 to 1.0). /// /// Returns: `IconThemeProperties` — interpolated properties. static IconThemeProperties lerp(IconThemeProperties a, IconThemeProperties b, double t); bool operator ==(Object other); int get hashCode; String toString(); } /// An inherited widget that provides component-specific theme data. /// /// Allows components to provide custom theme data that overrides or extends /// the global theme. The type parameter `T` specifies the theme data type. /// /// Example: /// ```dart /// ComponentTheme( /// data: ButtonTheme(backgroundColor: Colors.blue), /// child: MyButton(), /// ) /// ``` class ComponentTheme extends InheritedTheme { /// The component theme data to provide to descendants. T data; /// Creates a [ComponentTheme]. /// /// Parameters: /// - [data] (`T`, required): Theme data for this component type. /// - [child] (`Widget`, required): Child widget. const ComponentTheme({super.key, required this.data, required super.child}); Widget wrap(BuildContext context, Widget child); /// Gets the component theme data of type `T` from the closest ancestor. /// /// Throws if no [ComponentTheme] of type `T` is found. /// /// Returns: `T` — the component theme data. static T of(BuildContext context); /// Gets the component theme data of type `T` from the closest ancestor. /// /// Returns `null` if no [ComponentTheme] of type `T` is found. /// /// Returns: `T?` — the component theme data, or null. static T? maybeOf(BuildContext context); bool updateShouldNotify(covariant ComponentTheme oldWidget); } /// Determines which theme mode to use. /// /// - `system`: Follow system theme preference /// - `light`: Always use light theme /// - `dark`: Always use dark theme enum ThemeMode { system, light, dark } /// A collection of predefined color schemes for shadcn_flutter. /// /// Provides light and dark variants of different color schemes including /// blue, gray, green, neutral, orange, red, rose, slate, stone, violet, /// yellow, and zinc. class ColorSchemes { /// Light blue color scheme. static const ColorScheme lightBlue = ColorScheme(brightness: Brightness.light, background: Color(0xFFFFFFFF), foreground: Color(0xFF09090B), card: Color(0xFFFFFFFF), cardForeground: Color(0xFF09090B), popover: Color(0xFFFFFFFF), popoverForeground: Color(0xFF09090B), primary: Color(0xFF2B7FFF), primaryForeground: Color(0xFFEFF6FF), secondary: Color(0xFFF4F4F5), secondaryForeground: Color(0xFF18181B), muted: Color(0xFFF4F4F5), mutedForeground: Color(0xFF71717B), accent: Color(0xFFF4F4F5), accentForeground: Color(0xFF18181B), destructive: Color(0xFFE7000B), border: Color(0xFFE4E4E7), input: Color(0xFFE4E4E7), ring: Color(0xFF2B7FFF), chart1: Color(0xFFF54900), chart2: Color(0xFF009689), chart3: Color(0xFF104E64), chart4: Color(0xFFFFB900), chart5: Color(0xFFFE9A00), sidebar: Color(0xFFFAFAFA), sidebarForeground: Color(0xFF09090B), sidebarPrimary: Color(0xFF2B7FFF), sidebarPrimaryForeground: Color(0xFFEFF6FF), sidebarAccent: Color(0xFFF4F4F5), sidebarAccentForeground: Color(0xFF18181B), sidebarBorder: Color(0xFFE4E4E7), sidebarRing: Color(0xFF2B7FFF)); /// Dark blue color scheme. static const ColorScheme darkBlue = ColorScheme(brightness: Brightness.dark, background: Color(0xFF09090B), foreground: Color(0xFFFAFAFA), card: Color(0xFF18181B), cardForeground: Color(0xFFFAFAFA), popover: Color(0xFF18181B), popoverForeground: Color(0xFFFAFAFA), primary: Color(0xFF155DFC), primaryForeground: Color(0xFF1C398E), secondary: Color(0xFF27272A), secondaryForeground: Color(0xFFFAFAFA), muted: Color(0xFF27272A), mutedForeground: Color(0xFF9F9FA9), accent: Color(0xFF27272A), accentForeground: Color(0xFFFAFAFA), destructive: Color(0xFFFF6467), border: Color(0x1AFFFFFF), input: Color(0x26FFFFFF), ring: Color(0xFF1447E6), chart1: Color(0xFF1447E6), chart2: Color(0xFF00BC7D), chart3: Color(0xFFFE9A00), chart4: Color(0xFFAD46FF), chart5: Color(0xFFFF2056), sidebar: Color(0xFF18181B), sidebarForeground: Color(0xFFFAFAFA), sidebarPrimary: Color(0xFF155DFC), sidebarPrimaryForeground: Color(0xFF1C398E), sidebarAccent: Color(0xFF27272A), sidebarAccentForeground: Color(0xFFFAFAFA), sidebarBorder: Color(0x1AFFFFFF), sidebarRing: Color(0xFF1447E6)); /// Returns blue color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme blue(ThemeMode mode); /// Light defaultcolor color scheme. static const ColorScheme lightDefaultColor = ColorScheme(brightness: Brightness.light, background: Color(0xFFFFFFFF), foreground: Color(0xFF0A0A0A), card: Color(0xFFFFFFFF), cardForeground: Color(0xFF0A0A0A), popover: Color(0xFFFFFFFF), popoverForeground: Color(0xFF0A0A0A), primary: Color(0xFF171717), primaryForeground: Color(0xFFFAFAFA), secondary: Color(0xFFF5F5F5), secondaryForeground: Color(0xFF171717), muted: Color(0xFFF5F5F5), mutedForeground: Color(0xFF737373), accent: Color(0xFFF5F5F5), accentForeground: Color(0xFF171717), destructive: Color(0xFFE7000B), border: Color(0xFFE5E5E5), input: Color(0xFFE5E5E5), ring: Color(0xFFA1A1A1), chart1: Color(0xFFF54900), chart2: Color(0xFF009689), chart3: Color(0xFF104E64), chart4: Color(0xFFFFB900), chart5: Color(0xFFFE9A00), sidebar: Color(0xFFFAFAFA), sidebarForeground: Color(0xFF0A0A0A), sidebarPrimary: Color(0xFF171717), sidebarPrimaryForeground: Color(0xFFFAFAFA), sidebarAccent: Color(0xFFF5F5F5), sidebarAccentForeground: Color(0xFF171717), sidebarBorder: Color(0xFFE5E5E5), sidebarRing: Color(0xFFA1A1A1)); /// Dark defaultcolor color scheme. static const ColorScheme darkDefaultColor = ColorScheme(brightness: Brightness.dark, background: Color(0xFF0A0A0A), foreground: Color(0xFFFAFAFA), card: Color(0xFF171717), cardForeground: Color(0xFFFAFAFA), popover: Color(0xFF171717), popoverForeground: Color(0xFFFAFAFA), primary: Color(0xFFE5E5E5), primaryForeground: Color(0xFF171717), secondary: Color(0xFF262626), secondaryForeground: Color(0xFFFAFAFA), muted: Color(0xFF262626), mutedForeground: Color(0xFFA1A1A1), accent: Color(0xFF262626), accentForeground: Color(0xFFFAFAFA), destructive: Color(0xFFFF6467), border: Color(0x1AFFFFFF), input: Color(0x26FFFFFF), ring: Color(0xFF737373), chart1: Color(0xFF1447E6), chart2: Color(0xFF00BC7D), chart3: Color(0xFFFE9A00), chart4: Color(0xFFAD46FF), chart5: Color(0xFFFF2056), sidebar: Color(0xFF171717), sidebarForeground: Color(0xFFFAFAFA), sidebarPrimary: Color(0xFF1447E6), sidebarPrimaryForeground: Color(0xFFFAFAFA), sidebarAccent: Color(0xFF262626), sidebarAccentForeground: Color(0xFFFAFAFA), sidebarBorder: Color(0x1AFFFFFF), sidebarRing: Color(0xFF737373)); /// Returns defaultcolor color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme defaultcolor(ThemeMode mode); /// Light green color scheme. static const ColorScheme lightGreen = ColorScheme(brightness: Brightness.light, background: Color(0xFFFFFFFF), foreground: Color(0xFF09090B), card: Color(0xFFFFFFFF), cardForeground: Color(0xFF09090B), popover: Color(0xFFFFFFFF), popoverForeground: Color(0xFF09090B), primary: Color(0xFF00C950), primaryForeground: Color(0xFFF0FDF4), secondary: Color(0xFFF4F4F5), secondaryForeground: Color(0xFF18181B), muted: Color(0xFFF4F4F5), mutedForeground: Color(0xFF71717B), accent: Color(0xFFF4F4F5), accentForeground: Color(0xFF18181B), destructive: Color(0xFFE7000B), border: Color(0xFFE4E4E7), input: Color(0xFFE4E4E7), ring: Color(0xFF00C950), chart1: Color(0xFFF54900), chart2: Color(0xFF009689), chart3: Color(0xFF104E64), chart4: Color(0xFFFFB900), chart5: Color(0xFFFE9A00), sidebar: Color(0xFFFAFAFA), sidebarForeground: Color(0xFF09090B), sidebarPrimary: Color(0xFF00C950), sidebarPrimaryForeground: Color(0xFFF0FDF4), sidebarAccent: Color(0xFFF4F4F5), sidebarAccentForeground: Color(0xFF18181B), sidebarBorder: Color(0xFFE4E4E7), sidebarRing: Color(0xFF00C950)); /// Dark green color scheme. static const ColorScheme darkGreen = ColorScheme(brightness: Brightness.dark, background: Color(0xFF09090B), foreground: Color(0xFFFAFAFA), card: Color(0xFF18181B), cardForeground: Color(0xFFFAFAFA), popover: Color(0xFF18181B), popoverForeground: Color(0xFFFAFAFA), primary: Color(0xFF00BC7D), primaryForeground: Color(0xFF0D542B), secondary: Color(0xFF27272A), secondaryForeground: Color(0xFFFAFAFA), muted: Color(0xFF27272A), mutedForeground: Color(0xFF9F9FA9), accent: Color(0xFF27272A), accentForeground: Color(0xFFFAFAFA), destructive: Color(0xFFFF6467), border: Color(0x1AFFFFFF), input: Color(0x26FFFFFF), ring: Color(0xFF008236), chart1: Color(0xFF1447E6), chart2: Color(0xFF00BC7D), chart3: Color(0xFFFE9A00), chart4: Color(0xFFAD46FF), chart5: Color(0xFFFF2056), sidebar: Color(0xFF18181B), sidebarForeground: Color(0xFFFAFAFA), sidebarPrimary: Color(0xFF00BC7D), sidebarPrimaryForeground: Color(0xFF0D542B), sidebarAccent: Color(0xFF27272A), sidebarAccentForeground: Color(0xFFFAFAFA), sidebarBorder: Color(0x1AFFFFFF), sidebarRing: Color(0xFF008236)); /// Returns green color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme green(ThemeMode mode); /// Light orange color scheme. static const ColorScheme lightOrange = ColorScheme(brightness: Brightness.light, background: Color(0xFFFFFFFF), foreground: Color(0xFF09090B), card: Color(0xFFFFFFFF), cardForeground: Color(0xFF09090B), popover: Color(0xFFFFFFFF), popoverForeground: Color(0xFF09090B), primary: Color(0xFFFF6900), primaryForeground: Color(0xFFFFF7ED), secondary: Color(0xFFF4F4F5), secondaryForeground: Color(0xFF18181B), muted: Color(0xFFF4F4F5), mutedForeground: Color(0xFF71717B), accent: Color(0xFFF4F4F5), accentForeground: Color(0xFF18181B), destructive: Color(0xFFE7000B), border: Color(0xFFE4E4E7), input: Color(0xFFE4E4E7), ring: Color(0xFFFF6900), chart1: Color(0xFFF54900), chart2: Color(0xFF009689), chart3: Color(0xFF104E64), chart4: Color(0xFFFFB900), chart5: Color(0xFFFE9A00), sidebar: Color(0xFFFAFAFA), sidebarForeground: Color(0xFF09090B), sidebarPrimary: Color(0xFFFF6900), sidebarPrimaryForeground: Color(0xFFFFF7ED), sidebarAccent: Color(0xFFF4F4F5), sidebarAccentForeground: Color(0xFF18181B), sidebarBorder: Color(0xFFE4E4E7), sidebarRing: Color(0xFFFF6900)); /// Dark orange color scheme. static const ColorScheme darkOrange = ColorScheme(brightness: Brightness.dark, background: Color(0xFF09090B), foreground: Color(0xFFFAFAFA), card: Color(0xFF18181B), cardForeground: Color(0xFFFAFAFA), popover: Color(0xFF18181B), popoverForeground: Color(0xFFFAFAFA), primary: Color(0xFFF54900), primaryForeground: Color(0xFFFFF7ED), secondary: Color(0xFF27272A), secondaryForeground: Color(0xFFFAFAFA), muted: Color(0xFF27272A), mutedForeground: Color(0xFF9F9FA9), accent: Color(0xFF27272A), accentForeground: Color(0xFFFAFAFA), destructive: Color(0xFFFF6467), border: Color(0x1AFFFFFF), input: Color(0x26FFFFFF), ring: Color(0xFFF54900), chart1: Color(0xFF1447E6), chart2: Color(0xFF00BC7D), chart3: Color(0xFFFE9A00), chart4: Color(0xFFAD46FF), chart5: Color(0xFFFF2056), sidebar: Color(0xFF18181B), sidebarForeground: Color(0xFFFAFAFA), sidebarPrimary: Color(0xFFF54900), sidebarPrimaryForeground: Color(0xFFFFF7ED), sidebarAccent: Color(0xFF27272A), sidebarAccentForeground: Color(0xFFFAFAFA), sidebarBorder: Color(0x1AFFFFFF), sidebarRing: Color(0xFFF54900)); /// Returns orange color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme orange(ThemeMode mode); /// Light red color scheme. static const ColorScheme lightRed = ColorScheme(brightness: Brightness.light, background: Color(0xFFFFFFFF), foreground: Color(0xFF09090B), card: Color(0xFFFFFFFF), cardForeground: Color(0xFF09090B), popover: Color(0xFFFFFFFF), popoverForeground: Color(0xFF09090B), primary: Color(0xFFFB2C36), primaryForeground: Color(0xFFFEF2F2), secondary: Color(0xFFF4F4F5), secondaryForeground: Color(0xFF18181B), muted: Color(0xFFF4F4F5), mutedForeground: Color(0xFF71717B), accent: Color(0xFFF4F4F5), accentForeground: Color(0xFF18181B), destructive: Color(0xFFE7000B), border: Color(0xFFE4E4E7), input: Color(0xFFE4E4E7), ring: Color(0xFFFB2C36), chart1: Color(0xFFF54900), chart2: Color(0xFF009689), chart3: Color(0xFF104E64), chart4: Color(0xFFFFB900), chart5: Color(0xFFFE9A00), sidebar: Color(0xFFFAFAFA), sidebarForeground: Color(0xFF09090B), sidebarPrimary: Color(0xFFFB2C36), sidebarPrimaryForeground: Color(0xFFFEF2F2), sidebarAccent: Color(0xFFF4F4F5), sidebarAccentForeground: Color(0xFF18181B), sidebarBorder: Color(0xFFE4E4E7), sidebarRing: Color(0xFFFB2C36)); /// Dark red color scheme. static const ColorScheme darkRed = ColorScheme(brightness: Brightness.dark, background: Color(0xFF09090B), foreground: Color(0xFFFAFAFA), card: Color(0xFF18181B), cardForeground: Color(0xFFFAFAFA), popover: Color(0xFF18181B), popoverForeground: Color(0xFFFAFAFA), primary: Color(0xFFFB2C36), primaryForeground: Color(0xFFFEF2F2), secondary: Color(0xFF27272A), secondaryForeground: Color(0xFFFAFAFA), muted: Color(0xFF27272A), mutedForeground: Color(0xFF9F9FA9), accent: Color(0xFF27272A), accentForeground: Color(0xFFFAFAFA), destructive: Color(0xFFFF6467), border: Color(0x1AFFFFFF), input: Color(0x26FFFFFF), ring: Color(0xFFFB2C36), chart1: Color(0xFF1447E6), chart2: Color(0xFF00BC7D), chart3: Color(0xFFFE9A00), chart4: Color(0xFFAD46FF), chart5: Color(0xFFFF2056), sidebar: Color(0xFF18181B), sidebarForeground: Color(0xFFFAFAFA), sidebarPrimary: Color(0xFFFB2C36), sidebarPrimaryForeground: Color(0xFFFEF2F2), sidebarAccent: Color(0xFF27272A), sidebarAccentForeground: Color(0xFFFAFAFA), sidebarBorder: Color(0x1AFFFFFF), sidebarRing: Color(0xFFFB2C36)); /// Returns red color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme red(ThemeMode mode); /// Light rose color scheme. static const ColorScheme lightRose = ColorScheme(brightness: Brightness.light, background: Color(0xFFFFFFFF), foreground: Color(0xFF09090B), card: Color(0xFFFFFFFF), cardForeground: Color(0xFF09090B), popover: Color(0xFFFFFFFF), popoverForeground: Color(0xFF09090B), primary: Color(0xFFFF2056), primaryForeground: Color(0xFFFFF1F2), secondary: Color(0xFFF4F4F5), secondaryForeground: Color(0xFF18181B), muted: Color(0xFFF4F4F5), mutedForeground: Color(0xFF71717B), accent: Color(0xFFF4F4F5), accentForeground: Color(0xFF18181B), destructive: Color(0xFFE7000B), border: Color(0xFFE4E4E7), input: Color(0xFFE4E4E7), ring: Color(0xFFFF2056), chart1: Color(0xFFF54900), chart2: Color(0xFF009689), chart3: Color(0xFF104E64), chart4: Color(0xFFFFB900), chart5: Color(0xFFFE9A00), sidebar: Color(0xFFFAFAFA), sidebarForeground: Color(0xFF09090B), sidebarPrimary: Color(0xFFFF2056), sidebarPrimaryForeground: Color(0xFFFFF1F2), sidebarAccent: Color(0xFFF4F4F5), sidebarAccentForeground: Color(0xFF18181B), sidebarBorder: Color(0xFFE4E4E7), sidebarRing: Color(0xFFFF2056)); /// Dark rose color scheme. static const ColorScheme darkRose = ColorScheme(brightness: Brightness.dark, background: Color(0xFF09090B), foreground: Color(0xFFFAFAFA), card: Color(0xFF18181B), cardForeground: Color(0xFFFAFAFA), popover: Color(0xFF18181B), popoverForeground: Color(0xFFFAFAFA), primary: Color(0xFFFF2056), primaryForeground: Color(0xFFFFF1F2), secondary: Color(0xFF27272A), secondaryForeground: Color(0xFFFAFAFA), muted: Color(0xFF27272A), mutedForeground: Color(0xFF9F9FA9), accent: Color(0xFF27272A), accentForeground: Color(0xFFFAFAFA), destructive: Color(0xFFFF6467), border: Color(0x1AFFFFFF), input: Color(0x26FFFFFF), ring: Color(0xFFFF2056), chart1: Color(0xFF1447E6), chart2: Color(0xFF00BC7D), chart3: Color(0xFFFE9A00), chart4: Color(0xFFAD46FF), chart5: Color(0xFFFF2056), sidebar: Color(0xFF18181B), sidebarForeground: Color(0xFFFAFAFA), sidebarPrimary: Color(0xFFFF2056), sidebarPrimaryForeground: Color(0xFFFFF1F2), sidebarAccent: Color(0xFF27272A), sidebarAccentForeground: Color(0xFFFAFAFA), sidebarBorder: Color(0x1AFFFFFF), sidebarRing: Color(0xFFFF2056)); /// Returns rose color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme rose(ThemeMode mode); /// Light violet color scheme. static const ColorScheme lightViolet = ColorScheme(brightness: Brightness.light, background: Color(0xFFFFFFFF), foreground: Color(0xFF09090B), card: Color(0xFFFFFFFF), cardForeground: Color(0xFF09090B), popover: Color(0xFFFFFFFF), popoverForeground: Color(0xFF09090B), primary: Color(0xFF8E51FF), primaryForeground: Color(0xFFF5F3FF), secondary: Color(0xFFF4F4F5), secondaryForeground: Color(0xFF18181B), muted: Color(0xFFF4F4F5), mutedForeground: Color(0xFF71717B), accent: Color(0xFFF4F4F5), accentForeground: Color(0xFF18181B), destructive: Color(0xFFE7000B), border: Color(0xFFE4E4E7), input: Color(0xFFE4E4E7), ring: Color(0xFF8E51FF), chart1: Color(0xFFF54900), chart2: Color(0xFF009689), chart3: Color(0xFF104E64), chart4: Color(0xFFFFB900), chart5: Color(0xFFFE9A00), sidebar: Color(0xFFFAFAFA), sidebarForeground: Color(0xFF09090B), sidebarPrimary: Color(0xFF8E51FF), sidebarPrimaryForeground: Color(0xFFF5F3FF), sidebarAccent: Color(0xFFF4F4F5), sidebarAccentForeground: Color(0xFF18181B), sidebarBorder: Color(0xFFE4E4E7), sidebarRing: Color(0xFF8E51FF)); /// Dark violet color scheme. static const ColorScheme darkViolet = ColorScheme(brightness: Brightness.dark, background: Color(0xFF09090B), foreground: Color(0xFFFAFAFA), card: Color(0xFF18181B), cardForeground: Color(0xFFFAFAFA), popover: Color(0xFF18181B), popoverForeground: Color(0xFFFAFAFA), primary: Color(0xFF7F22FE), primaryForeground: Color(0xFFF5F3FF), secondary: Color(0xFF27272A), secondaryForeground: Color(0xFFFAFAFA), muted: Color(0xFF27272A), mutedForeground: Color(0xFF9F9FA9), accent: Color(0xFF27272A), accentForeground: Color(0xFFFAFAFA), destructive: Color(0xFFFF6467), border: Color(0x1AFFFFFF), input: Color(0x26FFFFFF), ring: Color(0xFF7F22FE), chart1: Color(0xFF1447E6), chart2: Color(0xFF00BC7D), chart3: Color(0xFFFE9A00), chart4: Color(0xFFAD46FF), chart5: Color(0xFFFF2056), sidebar: Color(0xFF18181B), sidebarForeground: Color(0xFFFAFAFA), sidebarPrimary: Color(0xFF7F22FE), sidebarPrimaryForeground: Color(0xFFF5F3FF), sidebarAccent: Color(0xFF27272A), sidebarAccentForeground: Color(0xFFFAFAFA), sidebarBorder: Color(0x1AFFFFFF), sidebarRing: Color(0xFF7F22FE)); /// Returns violet color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme violet(ThemeMode mode); /// Light yellow color scheme. static const ColorScheme lightYellow = ColorScheme(brightness: Brightness.light, background: Color(0xFFFFFFFF), foreground: Color(0xFF09090B), card: Color(0xFFFFFFFF), cardForeground: Color(0xFF09090B), popover: Color(0xFFFFFFFF), popoverForeground: Color(0xFF09090B), primary: Color(0xFFF0B100), primaryForeground: Color(0xFF733E0A), secondary: Color(0xFFF4F4F5), secondaryForeground: Color(0xFF18181B), muted: Color(0xFFF4F4F5), mutedForeground: Color(0xFF71717B), accent: Color(0xFFF4F4F5), accentForeground: Color(0xFF18181B), destructive: Color(0xFFE7000B), border: Color(0xFFE4E4E7), input: Color(0xFFE4E4E7), ring: Color(0xFFF0B100), chart1: Color(0xFFF54900), chart2: Color(0xFF009689), chart3: Color(0xFF104E64), chart4: Color(0xFFFFB900), chart5: Color(0xFFFE9A00), sidebar: Color(0xFFFAFAFA), sidebarForeground: Color(0xFF09090B), sidebarPrimary: Color(0xFFF0B100), sidebarPrimaryForeground: Color(0xFF733E0A), sidebarAccent: Color(0xFFF4F4F5), sidebarAccentForeground: Color(0xFF18181B), sidebarBorder: Color(0xFFE4E4E7), sidebarRing: Color(0xFFF0B100)); /// Dark yellow color scheme. static const ColorScheme darkYellow = ColorScheme(brightness: Brightness.dark, background: Color(0xFF09090B), foreground: Color(0xFFFAFAFA), card: Color(0xFF18181B), cardForeground: Color(0xFFFAFAFA), popover: Color(0xFF18181B), popoverForeground: Color(0xFFFAFAFA), primary: Color(0xFFF0B100), primaryForeground: Color(0xFF733E0A), secondary: Color(0xFF27272A), secondaryForeground: Color(0xFFFAFAFA), muted: Color(0xFF27272A), mutedForeground: Color(0xFF9F9FA9), accent: Color(0xFF27272A), accentForeground: Color(0xFFFAFAFA), destructive: Color(0xFFFF6467), border: Color(0x1AFFFFFF), input: Color(0x26FFFFFF), ring: Color(0xFFA65F00), chart1: Color(0xFF1447E6), chart2: Color(0xFF00BC7D), chart3: Color(0xFFFE9A00), chart4: Color(0xFFAD46FF), chart5: Color(0xFFFF2056), sidebar: Color(0xFF18181B), sidebarForeground: Color(0xFFFAFAFA), sidebarPrimary: Color(0xFFF0B100), sidebarPrimaryForeground: Color(0xFF733E0A), sidebarAccent: Color(0xFF27272A), sidebarAccentForeground: Color(0xFFFAFAFA), sidebarBorder: Color(0x1AFFFFFF), sidebarRing: Color(0xFFA65F00)); /// Returns yellow color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme yellow(ThemeMode mode); } /// A chart color scheme that uses a single color for all chart elements. class SingleChartColorScheme implements ChartColorScheme { /// The single color used for all chart elements. Color color; /// Creates a single color chart scheme. const SingleChartColorScheme(this.color); List get chartColors; Color get chart1; Color get chart2; Color get chart3; Color get chart4; Color get chart5; } /// A color scheme for charts with 5 distinct colors. /// /// Provides colors for up to 5 different data series in charts. class ChartColorScheme { /// The list of chart colors. List chartColors; /// Creates a chart color scheme with the given colors. const ChartColorScheme(this.chartColors); /// Creates a chart color scheme using a single color for all elements. factory ChartColorScheme.single(Color color); /// Color for the first chart series. Color get chart1; /// Color for the second chart series. Color get chart2; /// Color for the third chart series. Color get chart3; /// Color for the fourth chart series. Color get chart4; /// Color for the fifth chart series. Color get chart5; } /// A collection of color shades from light to dark. /// /// Implements both [Color] and [ColorSwatch] to provide a primary color /// and access to different shade values (50, 100, 200, ..., 950). class ColorShades implements Color, ColorSwatch { /// Standard shade values used in color palettes. /// /// Contains the standard Material Design shade values from lightest (50) /// to darkest (950): [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950]. static const List shadeValues = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950]; /// Creates color shades from a raw map. const ColorShades.raw(this._colors); /// Creates color shades from a sorted list of colors. /// /// The list must contain exactly 11 colors corresponding to shades /// 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, and 950. factory ColorShades.sorted(List colors); /// Creates color shades from an accent color. /// /// Generates a full shade range by shifting the accent color's HSL values. /// [base] is the shade value for the accent color (default: 500). /// [hueShift], [saturationStepDown], [saturationStepUp], [lightnessStepDown], /// and [lightnessStepUp] control how shades are generated. factory ColorShades.fromAccent(Color accent, {int base = 500, int hueShift = 0, int saturationStepDown = 0, int saturationStepUp = 0, int lightnessStepDown = 8, int lightnessStepUp = 9}); /// Creates color shades from an accent HSL color. /// /// Similar to [fromAccent] but takes an HSL color directly. factory ColorShades.fromAccentHSL(HSLColor accent, {int base = 500, int hueShift = 0, int saturationStepDown = 0, int saturationStepUp = 0, int lightnessStepDown = 8, int lightnessStepUp = 9}); /// Shifts an HSL color to a target shade value. /// /// Used internally to generate shade variations. static HSLColor shiftHSL(HSLColor hsv, int targetBase, {int base = 500, int hueShift = 0, int saturationStepUp = 0, int saturationStepDown = 0, int lightnessStepUp = 9, int lightnessStepDown = 8}); /// Creates color shades from a map of shade values to colors. /// /// The map must contain all standard shade values (50-950). factory ColorShades.fromMap(Map colors); /// Gets the color for a specific shade value. Color get(int key); /// Gets the lightest shade (50). Color get shade50; /// Gets shade 100. Color get shade100; /// Gets shade 200. Color get shade200; /// Gets shade 300. Color get shade300; /// Gets shade 400. Color get shade400; /// Gets the medium/default shade (500). Color get shade500; /// Gets shade 600. Color get shade600; /// Gets shade 700. Color get shade700; /// Gets shade 800. Color get shade800; /// Gets shade 900. Color get shade900; /// Gets the darkest shade (950). Color get shade950; int get alpha; int get blue; double computeLuminance(); int get green; double get opacity; int get red; int get value; ColorShades withAlpha(int a); ColorShades withBlue(int b); Color withGreen(int g); Color withOpacity(double opacity); Color withRed(int r); Color operator [](index); double get a; double get b; ColorSpace get colorSpace; double get g; Iterable get keys; double get r; Color withValues({double? alpha, double? red, double? green, double? blue, ColorSpace? colorSpace}); int toARGB32(); } /// Converts a Flutter [Color] to hexadecimal string representation. /// /// Returns a hex string with hash prefix (e.g., "#RRGGBB" or "#AARRGGBB"). /// /// Parameters: /// - [color] (Color, required): Color to convert /// /// Returns hex string representation. String hexFromColor(Color color); /// The color scheme for shadcn_flutter applications. /// /// Defines all the semantic colors used throughout the app including /// background, foreground, primary, secondary, destructive colors, etc. /// Also includes sidebar and chart colors. class ColorScheme implements ChartColorScheme { /// Set of recognized color key names for the color scheme. /// /// Contains all valid color property names that can be used when /// constructing or serializing a ColorScheme. static const Set colorKeys = {'background', 'foreground', 'card', 'cardForeground', 'popover', 'popoverForeground', 'primary', 'primaryForeground', 'secondary', 'secondaryForeground', 'muted', 'mutedForeground', 'accent', 'accentForeground', 'destructive', 'destructiveForeground', 'border', 'input', 'ring', 'chart1', 'chart2', 'chart3', 'chart4', 'chart5'}; /// The brightness of this color scheme (light or dark). Brightness brightness; /// The background color. Color background; /// The foreground color (typically text). Color foreground; /// The card background color. Color card; /// The card foreground color. Color cardForeground; /// The popover background color. Color popover; /// The popover foreground color. Color popoverForeground; /// The primary brand color. Color primary; /// The foreground color for primary elements. Color primaryForeground; /// The secondary color. Color secondary; /// The foreground color for secondary elements. Color secondaryForeground; /// The muted background color. Color muted; /// The muted foreground color. Color mutedForeground; /// The accent color. Color accent; /// The foreground color for accented elements. Color accentForeground; /// The destructive action color (typically red). Color destructive; /// The foreground color for destructive elements. Color destructiveForeground; /// The border color. Color border; /// The input field border color. Color input; /// The focus ring color. Color ring; /// The sidebar background color. Color sidebar; /// The sidebar foreground color. Color sidebarForeground; /// The sidebar primary color. Color sidebarPrimary; /// The sidebar primary foreground color. Color sidebarPrimaryForeground; /// The sidebar accent color. Color sidebarAccent; /// The sidebar accent foreground color. Color sidebarAccentForeground; /// The sidebar border color. Color sidebarBorder; /// The sidebar ring color. Color sidebarRing; Color chart1; Color chart2; Color chart3; Color chart4; Color chart5; /// Creates a color scheme with all required colors. const ColorScheme({required this.brightness, required this.background, required this.foreground, required this.card, required this.cardForeground, required this.popover, required this.popoverForeground, required this.primary, required this.primaryForeground, required this.secondary, required this.secondaryForeground, required this.muted, required this.mutedForeground, required this.accent, required this.accentForeground, required this.destructive, this.destructiveForeground = Colors.transparent, required this.border, required this.input, required this.ring, required this.chart1, required this.chart2, required this.chart3, required this.chart4, required this.chart5, required this.sidebar, required this.sidebarForeground, required this.sidebarPrimary, required this.sidebarPrimaryForeground, required this.sidebarAccent, required this.sidebarAccentForeground, required this.sidebarBorder, required this.sidebarRing}); /// Creates a color scheme from a map of color names to values. ColorScheme.fromMap(Map map); /// Converts the color scheme to a map of hex color strings. /// /// Returns a map where keys are color property names and values are /// hex-encoded color strings (e.g., "#RRGGBB"). /// /// Useful for serialization or CSS generation. Map toMap(); /// Converts the color scheme to a map of Color objects. /// /// Returns a map where keys are color property names and values are /// Flutter Color objects. /// /// Useful for programmatic color access. Map toColorMap(); /// Creates a ColorScheme from a map of colors. /// /// Constructs a ColorScheme by looking up color values from a map. /// /// Parameters: /// - [colors] (`Map`, required): Map of color name to Color /// - [brightness] (Brightness, required): Theme brightness (light or dark) /// /// Example: /// ```dart /// ColorScheme.fromColors( /// colors: {'background': Colors.white, 'foreground': Colors.black, ...}, /// brightness: Brightness.light, /// ) /// ``` ColorScheme.fromColors({required Map colors, required Brightness brightness}); /// Creates a copy of this ColorScheme with specified properties replaced. /// /// Returns a new ColorScheme with any provided properties replaced. /// Uses ValueGetter for each property to allow lazy evaluation. /// /// Parameters are ValueGetters for all color scheme properties. Only /// provided parameters will be replaced in the copy. /// /// Example: /// ```dart /// scheme.copyWith( /// background: () => Colors.white, /// foreground: () => Colors.black, /// ) /// ``` ColorScheme copyWith({ValueGetter? brightness, ValueGetter? background, ValueGetter? foreground, ValueGetter? card, ValueGetter? cardForeground, ValueGetter? popover, ValueGetter? popoverForeground, ValueGetter? primary, ValueGetter? primaryForeground, ValueGetter? secondary, ValueGetter? secondaryForeground, ValueGetter? muted, ValueGetter? mutedForeground, ValueGetter? accent, ValueGetter? accentForeground, ValueGetter? destructive, ValueGetter? destructiveForeground, ValueGetter? border, ValueGetter? input, ValueGetter? ring, ValueGetter? chart1, ValueGetter? chart2, ValueGetter? chart3, ValueGetter? chart4, ValueGetter? chart5, ValueGetter? sidebar, ValueGetter? sidebarForeground, ValueGetter? sidebarPrimary, ValueGetter? sidebarPrimaryForeground, ValueGetter? sidebarAccent, ValueGetter? sidebarAccentForeground, ValueGetter? sidebarBorder, ValueGetter? sidebarRing}); List get chartColors; /// Linearly interpolates between two ColorSchemes. /// /// Creates a new ColorScheme that represents a transition between [a] and [b] /// at position [t]. When t=0, returns [a]; when t=1, returns [b]. /// /// Parameters: /// - [a] (ColorScheme, required): Start color scheme /// - [b] (ColorScheme, required): End color scheme /// - [t] (double, required): Interpolation position (0.0 to 1.0) /// /// Returns interpolated ColorScheme. static ColorScheme lerp(ColorScheme a, ColorScheme b, double t); bool operator ==(Object other); int get hashCode; String toString(); } /// Legacy color schemes using HSL color definitions. /// /// These color schemes use HSL (Hue, Saturation, Lightness) for color definition /// and are provided for backward compatibility. New code should prefer /// using the RGB-based [ColorSchemes] class. class LegacyColorSchemes { /// Returns light zinc color scheme. static ColorScheme lightZinc(); /// Returns dark zinc color scheme. static ColorScheme darkZinc(); /// Returns zinc color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme zinc(ThemeMode mode); /// Returns light slate color scheme. static ColorScheme lightSlate(); /// Returns dark slate color scheme. static ColorScheme darkSlate(); /// Returns slate color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme slate(ThemeMode mode); /// Returns light stone color scheme. static ColorScheme lightStone(); /// Returns dark stone color scheme. static ColorScheme darkStone(); /// Returns stone color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme stone(ThemeMode mode); /// Returns light gray color scheme. static ColorScheme lightGray(); /// Returns dark gray color scheme. static ColorScheme darkGray(); /// Returns gray color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme gray(ThemeMode mode); /// Returns light neutral color scheme. static ColorScheme lightNeutral(); /// Returns dark neutral color scheme. static ColorScheme darkNeutral(); /// Returns neutral color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme neutral(ThemeMode mode); /// Returns light red color scheme. static ColorScheme lightRed(); /// Returns dark red color scheme. static ColorScheme darkRed(); /// Returns red color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme red(ThemeMode mode); /// Returns light rose color scheme. static ColorScheme lightRose(); /// Returns dark rose color scheme. static ColorScheme darkRose(); /// Returns rose color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme rose(ThemeMode mode); /// Returns light orange color scheme. static ColorScheme lightOrange(); /// Returns dark orange color scheme. static ColorScheme darkOrange(); /// Returns orange color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme orange(ThemeMode mode); /// Returns light green color scheme. static ColorScheme lightGreen(); /// Returns dark green color scheme. static ColorScheme darkGreen(); /// Returns green color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme green(ThemeMode mode); /// Returns light blue color scheme. static ColorScheme lightBlue(); /// Returns dark blue color scheme. static ColorScheme darkBlue(); /// Returns blue color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme blue(ThemeMode mode); /// Returns light yellow color scheme. static ColorScheme lightYellow(); /// Returns dark yellow color scheme. static ColorScheme darkYellow(); /// Returns yellow color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme yellow(ThemeMode mode); /// Returns light violet color scheme. static ColorScheme lightViolet(); /// Returns dark violet color scheme. static ColorScheme darkViolet(); /// Returns violet color scheme for the given [mode]. /// /// The [mode] must be either [ThemeMode.light] or [ThemeMode.dark]. /// [ThemeMode.system] is not supported. static ColorScheme violet(ThemeMode mode); } /// Represents a resizable item in a resizable layout. /// /// Each item has a current size, minimum/maximum constraints, and can be /// collapsed to a smaller size. Items can be marked as non-resizable. class ResizableItem { /// Minimum size this item can be resized to. double min; /// Maximum size this item can be resized to. double max; /// Whether this item is currently in collapsed state. bool collapsed; /// Size of the item when collapsed. If null, collapsed size is 0. double? collapsedSize; /// Whether this item can be resized. bool resizable; /// Creates a resizable item with the given constraints. /// /// [value] is the initial size of the item. /// [min] is the minimum size (defaults to 0). /// [max] is the maximum size (defaults to infinity). /// [collapsed] indicates if the item starts collapsed. /// [collapsedSize] is the size when collapsed (defaults to 0 if null). /// [resizable] indicates if the item can be resized (defaults to true). ResizableItem({required double value, this.min = 0, this.max = double.infinity, this.collapsed = false, this.collapsedSize, this.resizable = true}); /// Whether this item is collapsed after resizing operations. bool get newCollapsed; /// The size of this item after resizing operations. double get newValue; /// The current size of this item before any resize operations. double get value; String toString(); } /// Manages the resizing of multiple [ResizableItem]s in a layout. /// /// This class handles complex resize operations including: /// - Dragging dividers between items /// - Expanding and collapsing items /// - Borrowing and redistributing space between items /// - Respecting min/max constraints class Resizer { /// The list of resizable items being managed. List items; /// Ratio threshold for collapsing an item (0.0 to 1.0). /// When an item gets smaller than `min + (collapsedSize - min) * collapseRatio`, /// it will collapse. double collapseRatio; /// Ratio threshold for expanding a collapsed item (0.0 to 1.0). /// When dragging past `(min - collapsedSize) * expandRatio`, /// a collapsed item will expand. double expandRatio; /// Creates a resizer for the given [items]. /// /// [collapseRatio] controls when items collapse (defaults to 0.5). /// [expandRatio] controls when collapsed items expand (defaults to 0.5). Resizer(this.items, {this.collapseRatio = 0.5, this.expandRatio = 0.5}); /// Attempts to expand an item at [index] by [delta] in the given [direction]. /// /// [direction] can be -1 (borrow from left), 0 (borrow from both sides), /// or 1 (borrow from right). /// Returns true if the expansion was successful. bool attemptExpand(int index, int direction, double delta); /// Attempts to collapse an item at [index] in the given [direction]. /// /// [direction] can be -1 (give space to left), 0 (give to both sides), /// or 1 (give space to right). /// Returns true if the collapse was successful. bool attemptCollapse(int index, int direction); /// Attempts to expand a collapsed item at [index] in the given [direction]. /// /// [direction] can be -1 (borrow from left), 0 (borrow from both sides), /// or 1 (borrow from right). /// Returns true if the expansion was successful. bool attemptExpandCollapsed(int index, int direction); /// Handles dragging a divider at [index] by [delta] pixels. /// /// This is the main method for interactive resizing. It redistributes space /// between items, handles collapsing/expanding, and respects constraints. /// The divider at [index] is between item [index-1] and item [index]. void dragDivider(int index, double delta); /// Resets all items to their original state. /// /// Clears any pending resize operations and restores items to their /// original values and collapsed states. void reset(); } /// Closes the currently active overlay with an optional result value. /// /// Searches up the widget tree for an [OverlayHandlerStateMixin] and /// requests it to close with the provided result. If no overlay handler /// is found, returns a completed future. /// /// Parameters: /// - [context] (BuildContext, required): Build context from within the overlay /// - [value] (T?): Optional result value to return when closing /// /// Returns a [Future] that completes when the overlay is closed. /// /// Example: /// ```dart /// closeOverlay(context, 'user_confirmed'); /// ``` Future closeOverlay(BuildContext context, [T? value]); /// Mixin providing overlay state management methods. /// /// Defines the interface for overlay state classes, including methods for /// closing overlays and updating overlay configuration dynamically. /// /// Used by overlay implementations to provide consistent lifecycle management /// and configuration update capabilities. mixin OverlayHandlerStateMixin on State { /// Closes the overlay. /// /// Parameters: /// - [immediate] (bool): If true, closes immediately without animation /// /// Returns a [Future] that completes when closed. Future close([bool immediate = false]); /// Schedules overlay closure for the next frame. /// /// Useful for closing overlays from callbacks where immediate closure /// might cause issues with the widget tree. void closeLater(); /// Closes the overlay with a result value. /// /// Parameters: /// - [value] (X?): Optional result to return /// /// Returns a [Future] that completes when closed. Future closeWithResult([X? value]); /// Updates the anchor context for positioning. set anchorContext(BuildContext value); /// Updates the overlay alignment. set alignment(AlignmentGeometry value); /// Updates the anchor alignment. set anchorAlignment(AlignmentGeometry value); /// Updates the width constraint. set widthConstraint(PopoverConstraint value); /// Updates the height constraint. set heightConstraint(PopoverConstraint value); /// Updates the margin. set margin(EdgeInsets value); /// Updates whether the overlay follows the anchor. set follow(bool value); /// Updates the position offset. set offset(Offset? value); /// Updates horizontal inversion permission. set allowInvertHorizontal(bool value); /// Updates vertical inversion permission. set allowInvertVertical(bool value); } /// Abstract interface for overlay operation completion tracking. /// /// Provides lifecycle management and status tracking for overlay operations, /// including completion state, animation state, and dismissal. abstract class OverlayCompleter { /// Removes the overlay from the screen. void remove(); /// Disposes resources associated with the overlay. void dispose(); /// Whether the overlay operation has completed. bool get isCompleted; /// Whether the overlay's animation has completed. bool get isAnimationCompleted; /// Future that completes with the overlay's result value. Future get future; /// Future that completes when the overlay animation finishes. Future get animationFuture; } /// Abstract handler for managing overlay presentation and lifecycle. /// /// Provides common interface for different overlay types (popover, sheet, dialog) /// with customizable display, positioning, and interaction behavior. abstract class OverlayHandler { /// Default popover overlay handler. static const OverlayHandler popover = PopoverOverlayHandler(); /// Default sheet overlay handler. static const OverlayHandler sheet = SheetOverlayHandler(); /// Default dialog overlay handler. static const OverlayHandler dialog = DialogOverlayHandler(); /// Creates an [OverlayHandler]. const OverlayHandler(); /// Shows an overlay with the specified configuration. /// /// Displays an overlay (popover, sheet, or dialog) with extensive customization /// options for positioning, sizing, behavior, and appearance. /// /// Parameters: /// - [context] (BuildContext, required): Build context /// - [alignment] (AlignmentGeometry, required): Overlay alignment /// - [builder] (WidgetBuilder, required): Overlay content builder /// - [position] (Offset?): Explicit position (overrides alignment) /// - [anchorAlignment] (AlignmentGeometry?): Anchor alignment /// - [widthConstraint] (PopoverConstraint): Width constraint, defaults to flexible /// - [heightConstraint] (PopoverConstraint): Height constraint, defaults to flexible /// - [key] (Key?): Widget key /// - [rootOverlay] (bool): Use root overlay, defaults to true /// - [modal] (bool): Modal behavior, defaults to true /// - [barrierDismissable] (bool): Dismissible by tapping barrier, defaults to true /// - [clipBehavior] (Clip): Clipping behavior, defaults to none /// - [regionGroupId] (Object?): Region group ID /// - [offset] (Offset?): Position offset /// - [transitionAlignment] (AlignmentGeometry?): Transition alignment /// - [margin] (EdgeInsetsGeometry?): Overlay margin /// - [follow] (bool): Follow anchor on move, defaults to true /// - [consumeOutsideTaps] (bool): Consume outside taps, defaults to true /// - [onTickFollow] (`ValueChanged?`): Follow tick callback /// - [allowInvertHorizontal] (bool): Allow horizontal inversion, defaults to true /// - [allowInvertVertical] (bool): Allow vertical inversion, defaults to true /// - [dismissBackdropFocus] (bool): Dismiss on backdrop focus, defaults to true /// - [showDuration] (Duration?): Show animation duration /// - [dismissDuration] (Duration?): Dismiss animation duration /// - [overlayBarrier] (OverlayBarrier?): Custom barrier configuration /// - [layerLink] (LayerLink?): Layer link for positioning /// /// Returns an [OverlayCompleter] for managing the overlay lifecycle. OverlayCompleter show({required BuildContext context, required AlignmentGeometry alignment, required WidgetBuilder builder, Offset? position, AlignmentGeometry? anchorAlignment, PopoverConstraint widthConstraint = PopoverConstraint.flexible, PopoverConstraint heightConstraint = PopoverConstraint.flexible, Key? key, bool rootOverlay = true, bool modal = true, bool barrierDismissable = true, Clip clipBehavior = Clip.none, Object? regionGroupId, Offset? offset, AlignmentGeometry? transitionAlignment, EdgeInsetsGeometry? margin, bool follow = true, bool consumeOutsideTaps = true, ValueChanged? onTickFollow, bool allowInvertHorizontal = true, bool allowInvertVertical = true, bool dismissBackdropFocus = true, Duration? showDuration, Duration? dismissDuration, OverlayBarrier? overlayBarrier, LayerLink? layerLink}); } /// Configuration for overlay modal barriers. /// /// Defines the visual appearance and spacing of the barrier displayed /// behind modal overlays. class OverlayBarrier { /// Padding around the barrier. EdgeInsetsGeometry padding; /// Border radius for the barrier shape. BorderRadiusGeometry borderRadius; /// Color of the barrier (typically semi-transparent). Color? barrierColor; /// Creates an overlay barrier configuration. /// /// Parameters: /// - [padding] (EdgeInsetsGeometry): Barrier padding, defaults to zero /// - [borderRadius] (BorderRadiusGeometry): Border radius, defaults to zero /// - [barrierColor] (Color?): Barrier color const OverlayBarrier({this.padding = EdgeInsets.zero, this.borderRadius = BorderRadius.zero, this.barrierColor}); } /// Abstract manager for overlay operations. /// /// Extends [OverlayHandler] with additional methods for showing specialized /// overlay types like tooltips and menus. Provides centralized overlay /// management for an application. abstract class OverlayManager implements OverlayHandler { /// Gets the overlay manager from the widget tree. /// /// Searches for an [OverlayManager] in the build context and throws /// an assertion error if not found. /// /// Parameters: /// - [context] (BuildContext, required): Build context /// /// Returns the [OverlayManager] instance. static OverlayManager of(BuildContext context); OverlayCompleter show({required BuildContext context, required WidgetBuilder builder, AlignmentGeometry alignment = Alignment.center, Offset? position, AlignmentGeometry? anchorAlignment, PopoverConstraint widthConstraint = PopoverConstraint.flexible, PopoverConstraint heightConstraint = PopoverConstraint.flexible, Key? key, bool rootOverlay = true, bool modal = true, bool barrierDismissable = true, Clip clipBehavior = Clip.none, Object? regionGroupId, Offset? offset, AlignmentGeometry? transitionAlignment, EdgeInsetsGeometry? margin, bool follow = true, bool consumeOutsideTaps = true, ValueChanged? onTickFollow, bool allowInvertHorizontal = true, bool allowInvertVertical = true, bool dismissBackdropFocus = true, Duration? showDuration, Duration? dismissDuration, OverlayBarrier? overlayBarrier, LayerLink? layerLink}); /// Shows a tooltip overlay. /// /// Specialized method for displaying tooltips with appropriate defaults /// for tooltip behavior (non-modal, brief display, etc.). /// /// Parameters similar to [show] method. See [show] for full parameter documentation. /// /// Returns an [OverlayCompleter] for managing the tooltip lifecycle. OverlayCompleter showTooltip({required BuildContext context, required WidgetBuilder builder, AlignmentGeometry alignment = Alignment.center, Offset? position, AlignmentGeometry? anchorAlignment, PopoverConstraint widthConstraint = PopoverConstraint.flexible, PopoverConstraint heightConstraint = PopoverConstraint.flexible, Key? key, bool rootOverlay = true, bool modal = true, bool barrierDismissable = true, Clip clipBehavior = Clip.none, Object? regionGroupId, Offset? offset, AlignmentGeometry? transitionAlignment, EdgeInsetsGeometry? margin, bool follow = true, bool consumeOutsideTaps = true, ValueChanged? onTickFollow, bool allowInvertHorizontal = true, bool allowInvertVertical = true, bool dismissBackdropFocus = true, Duration? showDuration, Duration? dismissDuration, OverlayBarrier? overlayBarrier, LayerLink? layerLink}); /// Shows a menu overlay. /// /// Specialized method for displaying menus with appropriate defaults /// for menu behavior (dismissible, follows anchor, etc.). /// /// Parameters similar to [show] method. See [show] for full parameter documentation. /// /// Returns an [OverlayCompleter] for managing the menu lifecycle. OverlayCompleter showMenu({required BuildContext context, required WidgetBuilder builder, AlignmentGeometry alignment = Alignment.center, Offset? position, AlignmentGeometry? anchorAlignment, PopoverConstraint widthConstraint = PopoverConstraint.flexible, PopoverConstraint heightConstraint = PopoverConstraint.flexible, Key? key, bool rootOverlay = true, bool modal = true, bool barrierDismissable = true, Clip clipBehavior = Clip.none, Object? regionGroupId, Offset? offset, AlignmentGeometry? transitionAlignment, EdgeInsetsGeometry? margin, bool follow = true, bool consumeOutsideTaps = true, ValueChanged? onTickFollow, bool allowInvertHorizontal = true, bool allowInvertVertical = true, bool dismissBackdropFocus = true, Duration? showDuration, Duration? dismissDuration, OverlayBarrier? overlayBarrier, LayerLink? layerLink}); } /// Layer widget managing different overlay handlers for the application. /// /// Provides centralized overlay management for popovers, tooltips, and menus /// with customizable handlers for each type. class OverlayManagerLayer extends StatefulWidget { /// Handler for popover overlays. OverlayHandler popoverHandler; /// Handler for tooltip overlays. OverlayHandler tooltipHandler; /// Handler for menu overlays. OverlayHandler menuHandler; /// Child widget wrapped by overlay management. Widget child; /// Creates an overlay manager layer. /// /// Parameters: /// - [popoverHandler] (OverlayHandler, required): Handler for popover overlays /// - [tooltipHandler] (OverlayHandler, required): Handler for tooltip overlays /// - [menuHandler] (OverlayHandler, required): Handler for menu overlays /// - [child] (Widget, required): Child widget const OverlayManagerLayer({super.key, required this.popoverHandler, required this.tooltipHandler, required this.menuHandler, required this.child}); State createState(); } /// Handles overlay presentation for popover components. /// /// Manages the display, positioning, and lifecycle of popover overlays /// with support for alignment, constraints, and modal behavior. class PopoverOverlayHandler extends OverlayHandler { /// Creates a [PopoverOverlayHandler]. const PopoverOverlayHandler(); OverlayCompleter show({required BuildContext context, required AlignmentGeometry alignment, required WidgetBuilder builder, ui.Offset? position, AlignmentGeometry? anchorAlignment, PopoverConstraint widthConstraint = PopoverConstraint.flexible, PopoverConstraint heightConstraint = PopoverConstraint.flexible, Key? key, bool rootOverlay = true, bool modal = true, bool barrierDismissable = true, ui.Clip clipBehavior = Clip.none, Object? regionGroupId, ui.Offset? offset, AlignmentGeometry? transitionAlignment, EdgeInsetsGeometry? margin, bool follow = true, bool consumeOutsideTaps = true, ValueChanged? onTickFollow, bool allowInvertHorizontal = true, bool allowInvertVertical = true, bool dismissBackdropFocus = true, Duration? showDuration, Duration? dismissDuration, OverlayBarrier? overlayBarrier, LayerLink? layerLink}); } /// Internal widget for rendering popover overlays. /// /// Manages positioning, constraints, and lifecycle of popover content /// relative to an anchor widget. class PopoverOverlayWidget extends StatefulWidget { /// Creates a [PopoverOverlayWidget]. const PopoverOverlayWidget({super.key, required this.anchorContext, this.position, required this.alignment, this.themes, required this.builder, required this.animation, required this.anchorAlignment, this.widthConstraint = PopoverConstraint.flexible, this.heightConstraint = PopoverConstraint.flexible, this.anchorSize, this.onTapOutside, this.regionGroupId, this.offset, this.transitionAlignment, this.margin, this.follow = true, this.consumeOutsideTaps = true, this.onTickFollow, this.allowInvertHorizontal = true, this.allowInvertVertical = true, this.data, this.onClose, this.onImmediateClose, this.onCloseWithResult, this.layerLink}); /// Explicit position for the popover. Offset? position; /// Alignment of the popover relative to the anchor. AlignmentGeometry alignment; /// Alignment point on the anchor widget. AlignmentGeometry anchorAlignment; /// Captured theme data from context. CapturedThemes? themes; /// Captured inherited data from context. CapturedData? data; /// Builder function for popover content. WidgetBuilder builder; /// Size of the anchor widget. Size? anchorSize; /// Animation controller for show/hide transitions. Animation animation; /// Width constraint mode for the popover. PopoverConstraint widthConstraint; /// Height constraint mode for the popover. PopoverConstraint heightConstraint; /// Callback when popover is closing. FutureVoidCallback? onClose; /// Callback for immediate close without animation. VoidCallback? onImmediateClose; /// Callback when user taps outside the popover. VoidCallback? onTapOutside; /// Region group identifier for coordinating multiple overlays. Object? regionGroupId; /// Additional offset applied to popover position. Offset? offset; /// Alignment for transition animations. AlignmentGeometry? transitionAlignment; /// Margin around the popover. EdgeInsetsGeometry? margin; /// Whether popover follows anchor movement. bool follow; /// Build context of the anchor widget. BuildContext anchorContext; /// Whether to consume taps outside the popover. bool consumeOutsideTaps; /// Callback on each frame when following anchor. ValueChanged? onTickFollow; /// Allow horizontal inversion when constrained. bool allowInvertHorizontal; /// Allow vertical inversion when constrained. bool allowInvertVertical; /// Callback when closing with a result value. PopoverFutureVoidCallback? onCloseWithResult; /// Layer link for positioning. LayerLink? layerLink; State createState(); } /// Size constraint strategies for popover overlays. /// /// - `flexible`: Size flexibly based on content and available space /// - `intrinsic`: Use intrinsic content size /// - `anchorFixedSize`: Match anchor's exact size /// - `anchorMinSize`: Use anchor size as minimum /// - `anchorMaxSize`: Use anchor size as maximum enum PopoverConstraint { flexible, intrinsic, anchorFixedSize, anchorMinSize, anchorMaxSize } /// State class for [PopoverOverlayWidget] managing popover positioning and lifecycle. /// /// Handles dynamic positioning, anchor tracking, size constraints, and /// animation for popover overlays. Implements [OverlayHandlerStateMixin] /// for standard overlay lifecycle management. class PopoverOverlayWidgetState extends State with SingleTickerProviderStateMixin, OverlayHandlerStateMixin { set offset(Offset? offset); void initState(); Future close([bool immediate = false]); void closeLater(); void didUpdateWidget(covariant PopoverOverlayWidget oldWidget); /// Gets the anchor widget's size. Size? get anchorSize; /// Gets the anchor alignment for positioning. AlignmentGeometry get anchorAlignment; /// Gets the explicit position offset. Offset? get position; /// Gets the popover alignment. AlignmentGeometry get alignment; /// Gets the width constraint strategy. PopoverConstraint get widthConstraint; /// Gets the height constraint strategy. PopoverConstraint get heightConstraint; /// Gets the position offset. Offset? get offset; /// Gets the margin around the popover. EdgeInsetsGeometry? get margin; /// Gets whether the popover follows the anchor on movement. bool get follow; /// Gets the anchor build context. BuildContext get anchorContext; /// Gets whether horizontal inversion is allowed. bool get allowInvertHorizontal; /// Gets whether vertical inversion is allowed. bool get allowInvertVertical; /// Gets the layer link for positioning. LayerLink? get layerLink; /// Sets the layer link for positioning. /// /// Updates the layer link and manages ticker state for anchor tracking. set layerLink(LayerLink? value); set alignment(AlignmentGeometry value); /// Sets the popover position. /// /// Updates the explicit position and triggers a rebuild. set position(Offset? value); set anchorAlignment(AlignmentGeometry value); set widthConstraint(PopoverConstraint value); set heightConstraint(PopoverConstraint value); set margin(EdgeInsetsGeometry? value); set follow(bool value); set anchorContext(BuildContext value); set allowInvertHorizontal(bool value); set allowInvertVertical(bool value); void dispose(); Widget build(BuildContext context); Future closeWithResult([X? value]); } /// Closes the current popover overlay. /// /// Deprecated: Use [closeOverlay] instead. /// /// Parameters: /// - [context] (`BuildContext`, required): Widget context. /// - [result] (`T?`, optional): Result to return when closing. /// /// Returns: `Future` — completes when popover is closed. Future closePopover(BuildContext context, [T? result]); /// Implementation of [OverlayCompleter] for popover overlays. /// /// Manages the lifecycle of a popover overlay entry, tracking completion /// state and handling overlay/barrier entry disposal. class OverlayPopoverEntry implements OverlayCompleter { /// Completer for the popover's result value. Completer completer; /// Completer that tracks the popover's animation lifecycle. /// /// Completes when the popover's entry and exit animations finish. /// Used internally to coordinate animation timing and cleanup. Completer animationCompleter; bool get isCompleted; /// Initializes the popover entry with overlay entries. /// /// Must be called before the popover can be displayed. /// /// Parameters: /// - [overlayEntry] (OverlayEntry, required): Main overlay entry /// - [barrierEntry] (OverlayEntry?): Optional barrier entry void initialize(OverlayEntry overlayEntry, [OverlayEntry? barrierEntry]); void remove(); void dispose(); Future get future; Future get animationFuture; bool get isAnimationCompleted; } /// Displays a popover overlay with specified alignment and behavior. /// /// Parameters: /// - [context] (`BuildContext`, required): Widget context. /// - [alignment] (`AlignmentGeometry`, required): Popover alignment relative to anchor. /// - [builder] (`WidgetBuilder`, required): Builds popover content. /// - [position] (`Offset?`, optional): Explicit position. /// - [anchorAlignment] (`AlignmentGeometry?`, optional): Anchor alignment point. /// - [widthConstraint] (`PopoverConstraint`, optional): Width constraint mode. Default: flexible. /// - [heightConstraint] (`PopoverConstraint`, optional): Height constraint mode. Default: flexible. /// - [key] (`Key?`, optional): Widget key. /// - [rootOverlay] (`bool`, optional): Use root overlay. Default: true. /// - [modal] (`bool`, optional): Modal behavior. Default: true. /// - [barrierDismissable] (`bool`, optional): Tap outside to dismiss. Default: true. /// - [clipBehavior] (`Clip`, optional): Clipping behavior. Default: Clip.none. /// - [regionGroupId] (`Object?`, optional): Region grouping identifier. /// - [offset] (`Offset?`, optional): Additional offset. /// - [transitionAlignment] (`AlignmentGeometry?`, optional): Transition origin. /// - [margin] (`EdgeInsetsGeometry?`, optional): Popover margin. /// - [follow] (`bool`, optional): Follow anchor movement. Default: true. /// - [consumeOutsideTaps] (`bool`, optional): Consume outside taps. Default: true. /// - [onTickFollow] (`ValueChanged?`, optional): Follow callback. /// - [allowInvertHorizontal] (`bool`, optional): Allow horizontal inversion. Default: true. /// - [allowInvertVertical] (`bool`, optional): Allow vertical inversion. Default: true. /// - [dismissBackdropFocus] (`bool`, optional): Dismiss on backdrop focus. Default: true. /// - [showDuration] (`Duration?`, optional): Show animation duration. /// - [dismissDuration] (`Duration?`, optional): Dismiss animation duration. /// - [overlayBarrier] (`OverlayBarrier?`, optional): Custom barrier configuration. /// - [handler] (`OverlayHandler?`, optional): Custom overlay handler. /// /// Returns: `OverlayCompleter` — handle to control the popover. /// /// Example: /// ```dart /// showPopover( /// context: context, /// alignment: Alignment.bottomCenter, /// builder: (context) => Text('Popover content'), /// ); /// ``` OverlayCompleter showPopover({required BuildContext context, required AlignmentGeometry alignment, required WidgetBuilder builder, Offset? position, AlignmentGeometry? anchorAlignment, PopoverConstraint widthConstraint = PopoverConstraint.flexible, PopoverConstraint heightConstraint = PopoverConstraint.flexible, Key? key, bool rootOverlay = true, bool modal = true, bool barrierDismissable = true, Clip clipBehavior = Clip.none, Object? regionGroupId, Offset? offset, AlignmentGeometry? transitionAlignment, EdgeInsetsGeometry? margin, bool follow = true, bool consumeOutsideTaps = true, ValueChanged? onTickFollow, bool allowInvertHorizontal = true, bool allowInvertVertical = true, bool dismissBackdropFocus = true, Duration? showDuration, Duration? dismissDuration, OverlayBarrier? overlayBarrier, OverlayHandler? handler}); /// A comprehensive popover overlay system for displaying contextual content. /// /// [Popover] provides a flexible foundation for creating overlay widgets that appear /// relative to anchor elements. It handles positioning, layering, and lifecycle /// management for temporary content displays such as dropdowns, menus, tooltips, /// and dialogs. The system automatically manages positioning constraints and /// viewport boundaries. /// /// The popover system consists of: /// - [Popover]: Individual popover instances with control methods /// - [PopoverController]: Manager for multiple popovers with lifecycle control /// - [PopoverLayout]: Positioning and constraint resolution /// - Overlay integration for proper z-ordering and event handling /// /// Key features: /// - Intelligent positioning with automatic viewport constraint handling /// - Multiple attachment points and alignment options /// - Modal and non-modal display modes /// - Animation and transition support /// - Barrier dismissal with configurable behavior /// - Follow-anchor behavior for responsive positioning /// - Multi-popover management with close coordination /// /// Positioning capabilities: /// - Flexible alignment relative to anchor widgets /// - Automatic inversion when space is constrained /// - Custom offset adjustments /// - Margin and padding controls /// - Width and height constraint options /// /// Example usage: /// ```dart /// final controller = PopoverController(); /// /// // Show a popover /// final popover = await controller.show( /// context: context, /// alignment: Alignment.bottomStart, /// anchorAlignment: Alignment.topStart, /// builder: (context) => PopoverMenu( /// children: [ /// PopoverMenuItem(child: Text('Option 1')), /// PopoverMenuItem(child: Text('Option 2')), /// ], /// ), /// ); /// ``` class Popover { /// Global key for accessing the overlay handler state. GlobalKey key; /// The overlay completer that manages this popover's lifecycle. OverlayCompleter entry; /// Closes this popover with optional immediate dismissal. /// /// If [immediate] is true, skips closing animations and removes the popover /// immediately. Otherwise, plays the closing animation before removal. /// /// Returns a Future that completes when the popover is fully dismissed. /// /// Parameters: /// - [immediate] (bool, default: false): Whether to skip closing animations /// /// Example: /// ```dart /// await popover.close(); // Animated close /// await popover.close(true); // Immediate close /// ``` Future close([bool immediate = false]); /// Schedules this popover to close after the current frame. /// /// This method queues the close operation for the next frame, allowing /// any current operations to complete before dismissing the popover. void closeLater(); /// Immediately removes this popover from the overlay without animations. /// /// This method bypasses all closing animations and state management, /// directly removing the popover from the overlay stack. Use with caution /// as it may interrupt ongoing operations. void remove(); /// Gets the current overlay handler state if the popover is mounted. /// /// Returns null if the popover has been disposed or is not currently /// in the widget tree. Useful for checking popover status and accessing /// advanced control methods. OverlayHandlerStateMixin? get currentState; } /// A controller for managing multiple popovers and their lifecycle. /// /// [PopoverController] provides centralized management for popover instances, /// including creation, lifecycle tracking, and coordination between multiple /// popovers. It handles the complexity of overlay management and provides /// a clean API for popover operations. /// /// Key responsibilities: /// - Creating and showing new popovers /// - Tracking active popover instances /// - Coordinating close operations across popovers /// - Managing popover lifecycle states /// - Providing status queries for open/mounted popovers /// /// The controller maintains a list of active popovers and provides methods /// to query their status, close them individually or collectively, and /// coordinate their display behavior. /// /// Example: /// ```dart /// class MyWidget extends StatefulWidget { /// @override /// _MyWidgetState createState() => _MyWidgetState(); /// } /// /// class _MyWidgetState extends State { /// final PopoverController _popoverController = PopoverController(); /// /// @override /// void dispose() { /// _popoverController.dispose(); /// super.dispose(); /// } /// /// void _showMenu() async { /// await _popoverController.show( /// context: context, /// alignment: Alignment.bottomStart, /// builder: (context) => MyPopoverContent(), /// ); /// } /// } /// ``` class PopoverController extends ChangeNotifier { /// Whether there are any open popovers that haven't completed. /// /// Returns true if any popover is currently open and not yet completed. bool get hasOpenPopover; /// Whether there are any mounted popovers with animations in progress. /// /// Returns true if any popover is mounted and its animation hasn't completed. bool get hasMountedPopover; /// Gets an unmodifiable view of currently open popovers. /// /// Returns an iterable of [Popover] instances that are currently managed /// by this controller. Iterable get openPopovers; /// Shows a popover with the specified configuration. /// /// Creates and displays a popover overlay with extensive customization options. /// If [closeOthers] is true, closes existing popovers before showing the new one. /// /// Parameters: /// - [context] (BuildContext, required): Build context /// - [builder] (WidgetBuilder, required): Popover content builder /// - [alignment] (AlignmentGeometry, required): Popover alignment /// - [anchorAlignment] (AlignmentGeometry?): Anchor alignment /// - [widthConstraint] (PopoverConstraint): Width constraint, defaults to flexible /// - [heightConstraint] (PopoverConstraint): Height constraint, defaults to flexible /// - [modal] (bool): Modal behavior, defaults to true /// - [closeOthers] (bool): Close other popovers, defaults to true /// - [offset] (Offset?): Position offset /// - [key] (`GlobalKey?`): Widget key /// - [regionGroupId] (Object?): Region group ID /// - [transitionAlignment] (AlignmentGeometry?): Transition alignment /// - [consumeOutsideTaps] (bool): Consume outside taps, defaults to true /// - [margin] (EdgeInsetsGeometry?): Popover margin /// - [onTickFollow] (`ValueChanged?`): Follow tick callback /// - [follow] (bool): Follow anchor on move, defaults to true /// - [allowInvertHorizontal] (bool): Allow horizontal inversion, defaults to true /// - [allowInvertVertical] (bool): Allow vertical inversion, defaults to true /// - [dismissBackdropFocus] (bool): Dismiss on backdrop focus, defaults to true /// - [showDuration] (Duration?): Show animation duration /// - [hideDuration] (Duration?): Hide animation duration /// - [overlayBarrier] (OverlayBarrier?): Custom barrier configuration /// - [handler] (OverlayHandler?): Custom overlay handler /// /// Returns a [Future] that completes with the popover result when dismissed. Future show({required BuildContext context, required WidgetBuilder builder, required AlignmentGeometry alignment, AlignmentGeometry? anchorAlignment, PopoverConstraint widthConstraint = PopoverConstraint.flexible, PopoverConstraint heightConstraint = PopoverConstraint.flexible, bool modal = true, bool closeOthers = true, Offset? offset, GlobalKey? key, Object? regionGroupId, AlignmentGeometry? transitionAlignment, bool consumeOutsideTaps = true, EdgeInsetsGeometry? margin, ValueChanged? onTickFollow, bool follow = true, bool allowInvertHorizontal = true, bool allowInvertVertical = true, bool dismissBackdropFocus = true, Duration? showDuration, Duration? hideDuration, OverlayBarrier? overlayBarrier, OverlayHandler? handler}); /// Closes all managed popovers. /// /// Closes all popovers managed by this controller. If [immediate] is true, /// closes without animation. /// /// Parameters: /// - [immediate] (bool): Skip animation if true, defaults to false void close([bool immediate = false]); /// Schedules closure of all popovers for the next frame. /// /// Defers closing to avoid issues when called during widget builds. void closeLater(); set anchorContext(BuildContext value); set alignment(AlignmentGeometry value); set anchorAlignment(AlignmentGeometry value); set widthConstraint(PopoverConstraint value); set heightConstraint(PopoverConstraint value); set margin(EdgeInsets value); set follow(bool value); set offset(Offset? value); set allowInvertHorizontal(bool value); set allowInvertVertical(bool value); /// Disposes all managed popovers. /// /// Schedules closure of all popovers. Called automatically when the /// controller is disposed. void disposePopovers(); void dispose(); } /// Custom layout widget for positioning popover content. /// /// Handles popover positioning with alignment, sizing constraints, and /// automatic inversion when content would overflow screen bounds. class PopoverLayout extends SingleChildRenderObjectWidget { /// Popover alignment relative to anchor. Alignment alignment; /// Anchor alignment for positioning. Alignment anchorAlignment; /// Explicit position offset (overrides alignment). Offset? position; /// Size of the anchor widget. Size? anchorSize; /// Width constraint strategy. PopoverConstraint widthConstraint; /// Height constraint strategy. PopoverConstraint heightConstraint; /// Additional offset from computed position. Offset? offset; /// Margin around the popover. EdgeInsets margin; /// Scale factor for the popover. double scale; /// Alignment point for scaling transformation. Alignment scaleAlignment; /// Filter quality for scaled content. FilterQuality? filterQuality; /// Whether to allow horizontal position inversion. bool allowInvertHorizontal; /// Whether to allow vertical position inversion. bool allowInvertVertical; /// Creates a popover layout widget. const PopoverLayout({super.key, required this.alignment, required this.position, required this.anchorAlignment, required this.widthConstraint, required this.heightConstraint, this.anchorSize, this.offset, required this.margin, required Widget super.child, required this.scale, required this.scaleAlignment, this.filterQuality, this.allowInvertHorizontal = true, this.allowInvertVertical = true}); RenderObject createRenderObject(BuildContext context); void updateRenderObject(BuildContext context, covariant PopoverLayoutRender renderObject); } /// Custom render object for popover layout positioning. /// /// Handles the low-level layout calculations for positioning popover content /// relative to an anchor with automatic constraint adjustments and inversion /// when the popover would overflow the viewport. class PopoverLayoutRender extends RenderShiftedBox { /// Creates a popover layout render object. /// /// All parameters control how the popover is positioned and sized relative /// to its anchor. PopoverLayoutRender({RenderBox? child, required Alignment alignment, required Offset? position, required Alignment anchorAlignment, required PopoverConstraint widthConstraint, required PopoverConstraint heightConstraint, Size? anchorSize, Offset? offset, EdgeInsets margin = const EdgeInsets.all(8), required double scale, required Alignment scaleAlignment, FilterQuality? filterQuality, bool allowInvertHorizontal = true, bool allowInvertVertical = true}); Size computeDryLayout(covariant BoxConstraints constraints); bool hitTest(BoxHitTestResult result, {required Offset position}); bool hitTestChildren(BoxHitTestResult result, {required Offset position}); void applyPaintTransform(RenderBox child, Matrix4 transform); bool get alwaysNeedsCompositing; void paint(PaintingContext context, Offset offset); /// Computes appropriate box constraints for the popover child. /// /// Applies width and height constraint strategies to the child based on /// anchor size, viewport constraints, and margin settings. /// /// Parameters: /// - [constraints]: The incoming constraints from parent /// /// Returns box constraints with min/max values for width and height. BoxConstraints getConstraintsForChild(BoxConstraints constraints); void performLayout(); } /// Theme configuration for [RefreshTrigger]. /// /// Example usage: /// ```dart /// ComponentTheme( /// data: RefreshTriggerTheme( /// minExtent: 100.0, /// maxExtent: 200.0, /// curve: Curves.easeInOut, /// completeDuration: Duration(milliseconds: 800), /// ), /// child: RefreshTrigger( /// onRefresh: () async { /// // Refresh logic here /// }, /// child: ListView( /// children: [ /// // List items /// ], /// ), /// ), /// ) /// ``` class RefreshTriggerTheme { /// Minimum pull extent required to trigger refresh. double? minExtent; /// Maximum pull extent allowed. double? maxExtent; /// Builder for the refresh indicator. RefreshIndicatorBuilder? indicatorBuilder; /// Animation curve for the refresh trigger. Curve? curve; /// Duration for the completion animation. Duration? completeDuration; /// Creates a [RefreshTriggerTheme]. const RefreshTriggerTheme({this.minExtent, this.maxExtent, this.indicatorBuilder, this.curve, this.completeDuration}); /// Creates a copy of this theme but with the given fields replaced. RefreshTriggerTheme copyWith({ValueGetter? minExtent, ValueGetter? maxExtent, ValueGetter? indicatorBuilder, ValueGetter? curve, ValueGetter? completeDuration}); bool operator ==(Object other); int get hashCode; String toString(); } /// A widget that provides pull-to-refresh functionality. /// /// The [RefreshTrigger] wraps a scrollable widget and provides pull-to-refresh /// functionality. When the user pulls the content beyond the [minExtent], /// the [onRefresh] callback is triggered. /// /// You can customize the appearance and behavior using [RefreshTriggerTheme]: /// ```dart /// ComponentTheme( /// data: RefreshTriggerTheme( /// minExtent: 100.0, /// maxExtent: 200.0, /// curve: Curves.bounceOut, /// ), /// child: RefreshTrigger(...), /// ) /// ``` /// Pull-to-refresh gesture handler with customizable visual indicators. /// /// Wraps scrollable content to provide pull-to-refresh functionality similar to /// native mobile applications. Supports both vertical and horizontal refresh /// gestures with fully customizable visual indicators and animation behavior. /// /// Key Features: /// - **Pull Gesture Detection**: Recognizes pull gestures beyond scroll boundaries /// - **Visual Feedback**: Customizable refresh indicators with progress animation /// - **Flexible Direction**: Supports vertical and horizontal refresh directions /// - **Reverse Mode**: Can trigger from opposite direction (e.g., bottom-up) /// - **Theme Integration**: Full theme support with customizable appearance /// - **Async Support**: Handles async refresh operations with loading states /// - **Physics Integration**: Works with any ScrollPhysics implementation /// /// Operation Flow: /// 1. User pulls scrollable content beyond normal bounds /// 2. Visual indicator appears and updates based on pull distance /// 3. When minimum threshold reached, indicator shows "ready to refresh" state /// 4. On release, onRefresh callback is triggered /// 5. Loading indicator shows during async refresh operation /// 6. Completion animation plays when refresh finishes /// 7. Content returns to normal scroll position /// /// The component integrates seamlessly with ListView, GridView, CustomScrollView, /// and other scrollable widgets without requiring changes to existing scroll behavior. /// /// Example: /// ```dart /// RefreshTrigger( /// minExtent: 80.0, /// maxExtent: 150.0, /// onRefresh: () async { /// await Future.delayed(Duration(seconds: 2)); /// // Refresh data here /// }, /// child: ListView.builder( /// itemCount: items.length, /// itemBuilder: (context, index) => ListTile( /// title: Text(items[index]), /// ), /// ), /// ) /// ``` class RefreshTrigger extends StatefulWidget { /// Default indicator builder that creates a spinning progress indicator. /// /// Displays a platform-appropriate circular progress indicator that rotates /// based on pull extent and animates during refresh. static Widget defaultIndicatorBuilder(BuildContext context, RefreshTriggerStage stage); /// Minimum pull extent required to trigger refresh. /// /// Pull distance must exceed this value to activate the refresh callback. /// If null, uses theme or default value. double? minExtent; /// Maximum pull extent allowed. /// /// Limits how far the user can pull to prevent excessive stretching. /// If null, uses theme or default value. double? maxExtent; /// Callback invoked when refresh is triggered. /// /// Should return a Future that completes when the refresh operation finishes. /// While the Future is pending, the refresh indicator shows loading state. FutureVoidCallback? onRefresh; /// The scrollable child widget being refreshed. Widget child; /// Direction of the pull gesture. /// /// Defaults to [Axis.vertical] for standard top-down pull-to-refresh. Axis direction; /// Whether to reverse the pull direction. /// /// If true, pull gesture is inverted (e.g., pull down instead of up). bool reverse; /// Custom builder for the refresh indicator. /// /// If null, uses [defaultIndicatorBuilder]. RefreshIndicatorBuilder? indicatorBuilder; /// Animation curve for extent changes. /// /// Controls how the pull extent animates during interactions. Curve? curve; /// Duration for the completion animation. /// /// Time to display the completion state before hiding the indicator. Duration? completeDuration; /// Creates a [RefreshTrigger] with pull-to-refresh functionality. /// /// Wraps the provided child widget with refresh gesture detection and /// visual indicator management. /// /// Parameters: /// - [child] (Widget, required): Scrollable content to wrap with refresh capability /// - [onRefresh] (FutureVoidCallback?, optional): Async callback triggered on refresh /// - [direction] (Axis, default: Axis.vertical): Pull gesture direction /// - [reverse] (bool, default: false): Whether to trigger from opposite direction /// - [minExtent] (double?, optional): Minimum pull distance to trigger refresh /// - [maxExtent] (double?, optional): Maximum allowed pull distance /// - [indicatorBuilder] (RefreshIndicatorBuilder?, optional): Custom indicator widget builder /// - [curve] (Curve?, optional): Animation curve for refresh transitions /// - [completeDuration] (Duration?, optional): Duration of completion animation /// /// The [onRefresh] callback should return a Future that completes when the /// refresh operation is finished. During this time, a loading indicator will be shown. /// /// Example: /// ```dart /// RefreshTrigger( /// onRefresh: () async { /// final newData = await fetchDataFromAPI(); /// setState(() => items = newData); /// }, /// minExtent: 60, /// direction: Axis.vertical, /// child: ListView(children: widgets), /// ) /// ``` const RefreshTrigger({super.key, this.minExtent, this.maxExtent, this.onRefresh, this.direction = Axis.vertical, this.reverse = false, this.indicatorBuilder, this.curve, this.completeDuration, required this.child}); State createState(); } /// Default refresh indicator widget with platform-appropriate styling. /// /// Displays a circular progress indicator that responds to pull gestures /// and animates during the refresh lifecycle stages. class DefaultRefreshIndicator extends StatefulWidget { /// Current refresh trigger stage. RefreshTriggerStage stage; /// Creates a default refresh indicator. const DefaultRefreshIndicator({super.key, required this.stage}); State createState(); } /// State for the refresh trigger widget. /// /// Manages the refresh lifecycle, gesture detection, and animation coordination /// for pull-to-refresh functionality. class RefreshTriggerState extends State with SingleTickerProviderStateMixin { void didChangeDependencies(); void didUpdateWidget(RefreshTrigger oldWidget); /// Triggers a refresh programmatically. /// /// Initiates the refresh animation and invokes the provided callback or /// widget's [onRefresh] callback. Can be called from parent widgets to /// trigger refresh without user gesture. /// /// Parameters: /// - [refreshCallback]: Optional callback to use instead of widget's onRefresh /// /// Returns a Future that completes when refresh finishes. Future refresh([FutureVoidCallback? refreshCallback]); Widget build(BuildContext context); } /// Lifecycle stages of a refresh trigger. /// /// Represents the different states a refresh indicator can be in: /// - [idle]: No refresh in progress, waiting for user interaction /// - [pulling]: User is pulling but hasn't reached min extent /// - [refreshing]: Refresh callback is executing /// - [completed]: Refresh completed, showing completion state enum TriggerStage { idle, pulling, refreshing, completed } /// Immutable snapshot of refresh trigger state. /// /// Provides information about the current refresh stage and pull extent /// to indicator builders for rendering appropriate UI. class RefreshTriggerStage { /// Current stage of the refresh lifecycle. TriggerStage stage; /// Animated pull extent value. /// /// Range depends on min/max extent configuration. Use [extentValue] for /// current numeric value. Animation extent; /// Direction of the pull gesture. Axis direction; /// Whether the pull direction is reversed. bool reverse; /// Creates a refresh trigger stage snapshot. const RefreshTriggerStage(this.stage, this.extent, this.direction, this.reverse); /// Current numeric value of the pull extent. /// /// Convenience getter for [extent.value]. double get extentValue; } /// Custom scroll physics for refresh trigger behavior. /// /// Enables over-scroll to allow pulling beyond content bounds for refresh. /// Applied automatically by [RefreshTrigger] to its child scrollable. class RefreshTriggerPhysics extends ScrollPhysics { } /// Theme configuration for hover card behavior and appearance. /// /// Defines timing, positioning, and interaction behavior for hover cards, /// providing consistent styling across the application. /// /// Example: /// ```dart /// ComponentThemeData( /// data: { /// HoverCardTheme: HoverCardTheme( /// debounce: Duration(milliseconds: 300), /// wait: Duration(milliseconds: 700), /// popoverAlignment: Alignment.topCenter, /// ), /// }, /// child: MyApp(), /// ) /// ``` class HoverCardTheme { /// Duration to wait before hiding the hover card after mouse exit. Duration? debounce; /// Duration to wait before showing the hover card after mouse enter. Duration? wait; /// Alignment of the popover relative to its anchor. AlignmentGeometry? popoverAlignment; /// Alignment point on the anchor widget. AlignmentGeometry? anchorAlignment; /// Offset of the popover from its calculated position. Offset? popoverOffset; /// Hit test behavior for mouse interactions. HitTestBehavior? behavior; /// Creates a [HoverCardTheme]. /// /// All parameters are optional and will use system defaults when null. /// /// Parameters: /// - [debounce] (Duration?, optional): delay before hiding after mouse exit /// - [wait] (Duration?, optional): delay before showing after mouse enter /// - [popoverAlignment] (AlignmentGeometry?, optional): popover alignment /// - [anchorAlignment] (AlignmentGeometry?, optional): anchor point alignment /// - [popoverOffset] (Offset?, optional): offset from calculated position /// - [behavior] (HitTestBehavior?, optional): mouse interaction behavior /// /// Example: /// ```dart /// const HoverCardTheme( /// debounce: Duration(milliseconds: 200), /// wait: Duration(milliseconds: 600), /// popoverAlignment: Alignment.bottomCenter, /// ) /// ``` const HoverCardTheme({this.debounce, this.wait, this.popoverAlignment, this.anchorAlignment, this.popoverOffset, this.behavior}); /// Creates a copy with specified fields replaced. /// /// Parameters: /// - [debounce] (`ValueGetter?`, optional): New debounce duration getter. /// - [wait] (`ValueGetter?`, optional): New wait duration getter. /// - [popoverAlignment] (`ValueGetter?`, optional): New popover alignment getter. /// - [anchorAlignment] (`ValueGetter?`, optional): New anchor alignment getter. /// - [popoverOffset] (`ValueGetter?`, optional): New offset getter. /// - [behavior] (`ValueGetter?`, optional): New behavior getter. /// /// Returns: `HoverCardTheme` — new theme with updated values. HoverCardTheme copyWith({ValueGetter? debounce, ValueGetter? wait, ValueGetter? popoverAlignment, ValueGetter? anchorAlignment, ValueGetter? popoverOffset, ValueGetter? behavior}); bool operator ==(Object other); int get hashCode; } /// A widget that displays a popover when hovered or long-pressed. /// /// Shows contextual information or actions when the user hovers over the /// child widget or performs a long press. Includes intelligent timing /// controls to prevent flickering and provides smooth user interactions. /// /// Features: /// - Hover-based popover display with timing controls /// - Long-press support for touch devices /// - Configurable positioning and alignment /// - Debounce timing to prevent flicker /// - Custom overlay handlers support /// - Theme integration /// /// The hover card automatically manages show/hide timing based on mouse /// enter/exit events, with configurable delays to provide a smooth UX. /// /// Example: /// ```dart /// HoverCard( /// hoverBuilder: (context) => Card( /// child: Padding( /// padding: EdgeInsets.all(12), /// child: Text('Additional info appears on hover'), /// ), /// ), /// child: Icon(Icons.help_outline), /// ) /// ``` class HoverCard extends StatefulWidget { /// The child widget that triggers the hover card. Widget child; /// Duration to wait before hiding after mouse exit. Duration? debounce; /// Duration to wait before showing after mouse enter. Duration? wait; /// Builder function that creates the hover card content. WidgetBuilder hoverBuilder; /// Alignment of the popover relative to its anchor. AlignmentGeometry? popoverAlignment; /// Alignment point on the anchor widget. AlignmentGeometry? anchorAlignment; /// Offset of the popover from its calculated position. Offset? popoverOffset; /// Hit test behavior for mouse interactions. HitTestBehavior? behavior; /// Controller to programmatically manage the popover. PopoverController? controller; /// Custom overlay handler for popover display. OverlayHandler? handler; /// Creates a [HoverCard]. /// /// The [child] and [hoverBuilder] parameters are required. /// /// Parameters: /// - [child] (Widget, required): widget that triggers the hover card /// - [hoverBuilder] (WidgetBuilder, required): builds the hover card content /// - [debounce] (Duration?, optional): delay before hiding, defaults to 500ms /// - [wait] (Duration?, optional): delay before showing, defaults to 500ms /// - [popoverAlignment] (AlignmentGeometry?, optional): popover alignment, defaults to topCenter /// - [anchorAlignment] (AlignmentGeometry?, optional): anchor alignment, defaults to bottomCenter /// - [popoverOffset] (Offset?, optional): offset from position, defaults to (0, 8) /// - [behavior] (HitTestBehavior?, optional): hit test behavior, defaults to deferToChild /// - [controller] (PopoverController?, optional): controller for programmatic control /// - [handler] (OverlayHandler?, optional): custom overlay handler /// /// Example: /// ```dart /// HoverCard( /// debounce: Duration(milliseconds: 300), /// hoverBuilder: (context) => Tooltip(message: 'Help text'), /// child: Icon(Icons.info), /// ) /// ``` const HoverCard({super.key, required this.child, required this.hoverBuilder, this.debounce, this.wait, this.popoverAlignment, this.anchorAlignment, this.popoverOffset, this.behavior, this.controller, this.handler}); State createState(); } /// Theme configuration for toast notification system. /// /// Provides comprehensive styling properties for toast notifications including /// layout, positioning, animation behavior, and visual effects. These properties /// integrate with the design system and can be overridden at the widget level. /// /// The theme supports advanced features like stacking behavior, expansion modes, /// and sophisticated animation timing for professional toast experiences. class ToastTheme { /// Maximum number of toast notifications to stack visually. /// /// Type: `int?`. If null, defaults to 3 stacked entries. Controls how many /// toasts are visible simultaneously, with older toasts being collapsed or hidden. int? maxStackedEntries; /// Padding around the toast notification area. /// /// Type: `EdgeInsetsGeometry?`. If null, defaults to EdgeInsets.all(24) scaled /// by theme scaling factor. Applied to the toast positioning within safe area. EdgeInsetsGeometry? padding; /// Behavior mode for toast stack expansion. /// /// Type: `ExpandMode?`. If null, defaults to [ExpandMode.expandOnHover]. /// Controls when stacked toasts expand to show multiple entries simultaneously. ExpandMode? expandMode; /// Offset for collapsed toast positioning. /// /// Type: `Offset?`. If null, defaults to Offset(0, 12) scaled by theme. /// Controls the vertical/horizontal spacing between stacked toast entries. Offset? collapsedOffset; /// Scale factor for collapsed toast entries. /// /// Type: `double?`. If null, defaults to 0.9. Controls the size reduction /// of toast notifications that are stacked behind the active toast. double? collapsedScale; /// Animation curve for toast expansion transitions. /// /// Type: `Curve?`. If null, defaults to Curves.easeOutCubic. /// Applied when transitioning between collapsed and expanded stack states. Curve? expandingCurve; /// Duration for toast expansion animations. /// /// Type: `Duration?`. If null, defaults to 500 milliseconds. /// Controls the timing of stack expansion and collapse transitions. Duration? expandingDuration; /// Opacity level for collapsed toast entries. /// /// Type: `double?`. If null, defaults to 1.0 (fully opaque). /// Controls the visibility of toast notifications in the stack behind the active toast. double? collapsedOpacity; /// Initial opacity for toast entry animations. /// /// Type: `double?`. If null, defaults to 0.0 (fully transparent). /// Starting opacity value for toast notifications when they first appear. double? entryOpacity; /// Spacing between expanded toast entries. /// /// Type: `double?`. If null, defaults to 8.0. Controls the gap between /// toast notifications when the stack is in expanded state. double? spacing; /// Size constraints for individual toast notifications. /// /// Type: `BoxConstraints?`. If null, defaults to fixed width of 320 scaled /// by theme. Defines the maximum/minimum dimensions for toast content. BoxConstraints? toastConstraints; /// Creates a [ToastTheme]. /// /// All parameters are optional and can be null to use intelligent defaults /// that integrate with the current theme's design system and provide /// professional toast notification behavior. /// /// Example: /// ```dart /// const ToastTheme( /// maxStackedEntries: 5, /// expandMode: ExpandMode.expandOnHover, /// spacing: 12.0, /// collapsedScale: 0.95, /// ); /// ``` const ToastTheme({this.maxStackedEntries, this.padding, this.expandMode, this.collapsedOffset, this.collapsedScale, this.expandingCurve, this.expandingDuration, this.collapsedOpacity, this.entryOpacity, this.spacing, this.toastConstraints}); /// Type definition for toast content builder functions. /// /// Takes a [BuildContext] and [ToastOverlay] instance, returning the widget /// that represents the toast's visual content. The overlay parameter provides /// control methods for dismissing or manipulating the toast notification. /// /// Example: /// ```dart /// ToastBuilder builder = (context, overlay) => Card( /// child: ListTile( /// title: Text('Notification'), /// trailing: IconButton( /// icon: Icon(Icons.close), /// onPressed: overlay.close, /// ), /// ), /// ); /// ``` ToastTheme copyWith({ValueGetter? maxStackedEntries, ValueGetter? padding, ValueGetter? expandMode, ValueGetter? collapsedOffset, ValueGetter? collapsedScale, ValueGetter? expandingCurve, ValueGetter? expandingDuration, ValueGetter? collapsedOpacity, ValueGetter? entryOpacity, ValueGetter? spacing, ValueGetter? toastConstraints}); int get hashCode; bool operator ==(Object other); String toString(); } /// Displays a toast notification with sophisticated positioning and animation. /// /// Creates and shows a toast notification using the provided builder function /// within the nearest [ToastLayer] in the widget tree. The toast appears at /// the specified location with configurable animation, dismissal behavior, /// and automatic timeout. /// /// The function handles theme capture and data inheritance to ensure the toast /// maintains consistent styling and access to inherited data from the calling /// context. Toast notifications are managed through a layered system that /// supports stacking, expansion, and smooth animations. /// /// Parameters: /// - [context] (BuildContext, required): The build context for theme and data capture /// - [builder] (ToastBuilder, required): Function that builds the toast content widget /// - [location] (ToastLocation, default: bottomRight): Screen position for the toast /// - [dismissible] (bool, default: true): Whether users can dismiss via gesture /// - [curve] (Curve, default: easeOutCubic): Animation curve for entry/exit transitions /// - [entryDuration] (Duration, default: 500ms): Duration for toast entry animation /// - [onClosed] (VoidCallback?, optional): Callback invoked when toast is dismissed /// - [showDuration] (Duration, default: 5s): Auto-dismiss timeout duration /// /// Returns: /// A [ToastOverlay] instance that provides control methods for the displayed toast. /// /// Throws: /// - [AssertionError] if no [ToastLayer] is found in the widget tree. /// /// Example: /// ```dart /// final toast = showToast( /// context: context, /// builder: (context, overlay) => AlertCard( /// title: 'Success', /// message: 'Operation completed successfully', /// onDismiss: overlay.close, /// ), /// location: ToastLocation.topRight, /// showDuration: Duration(seconds: 3), /// ); /// ``` ToastOverlay showToast({required BuildContext context, required ToastBuilder builder, ToastLocation location = ToastLocation.bottomRight, bool dismissible = true, Curve curve = Curves.easeOutCubic, Duration entryDuration = const Duration(milliseconds: 500), VoidCallback? onClosed, Duration showDuration = const Duration(seconds: 5)}); /// Screen position enumeration for toast notification placement. /// /// ToastLocation defines six standard positions around the screen edges where /// toast notifications can appear. Each location includes alignment information /// for both the toast container and the stacking direction of multiple toasts. /// /// The enum ensures consistent positioning behavior across different screen /// sizes and orientations while providing intuitive placement options for /// various UI patterns and user experience requirements. enum ToastLocation { topLeft, topCenter, topRight, bottomLeft, bottomCenter, bottomRight } /// Expansion behavior modes for toast notification stacks. /// /// ExpandMode controls when and how stacked toast notifications expand to /// show multiple entries simultaneously. Different modes provide various /// user interaction patterns for managing multiple notifications. enum ExpandMode { alwaysExpanded, expandOnHover, expandOnTap, disabled } /// A sophisticated layer widget that provides toast notification infrastructure. /// /// ToastLayer serves as the foundation for the toast notification system, /// managing the display, positioning, animation, and lifecycle of multiple /// toast notifications. It wraps application content and provides the necessary /// context for [showToast] functions to work properly. /// /// The layer handles complex features including toast stacking, expansion modes, /// hover/tap interactions, automatic dismissal timing, gesture-based dismissal, /// and smooth animations between states. It ensures proper theme integration /// and responsive behavior across different screen sizes. /// /// Key features: /// - Multi-location toast support with six standard positions /// - Intelligent toast stacking with configurable maximum entries /// - Interactive expansion modes (hover, tap, always, disabled) /// - Gesture-based dismissal with swipe recognition /// - Automatic timeout handling with pause on hover /// - Smooth animations for entry, exit, and state transitions /// - Safe area and padding handling for various screen layouts /// - Theme integration with comprehensive customization options /// /// This is typically placed high in the widget tree, often wrapping the main /// application content or individual screens that need toast functionality. /// /// Example: /// ```dart /// ToastLayer( /// maxStackedEntries: 4, /// expandMode: ExpandMode.expandOnHover, /// child: MyAppContent(), /// ); /// ``` class ToastLayer extends StatefulWidget { /// The child widget to wrap with toast functionality. /// /// Type: `Widget`, required. The main application content that will have /// toast notification capabilities available through the widget tree. Widget child; /// Maximum number of toast notifications to display simultaneously. /// /// Type: `int`, default: `3`. Controls how many toasts are visible at once, /// with older toasts being hidden or collapsed when limit is exceeded. int maxStackedEntries; /// Padding around toast notification areas. /// /// Type: `EdgeInsetsGeometry?`. If null, uses default padding that respects /// safe area constraints. Applied to toast positioning within screen boundaries. EdgeInsetsGeometry? padding; /// Behavior for toast stack expansion interactions. /// /// Type: `ExpandMode`, default: [ExpandMode.expandOnHover]. Controls when /// stacked toasts expand to show multiple entries simultaneously. ExpandMode expandMode; /// Position offset for collapsed toast entries. /// /// Type: `Offset?`. If null, uses default offset that creates subtle /// stacking effect. Applied to toasts behind the active notification. Offset? collapsedOffset; /// Scale factor for collapsed toast entries. /// /// Type: `double`, default: `0.9`. Controls size reduction of background /// toasts to create depth perception in the stack visualization. double collapsedScale; /// Animation curve for expansion state transitions. /// /// Type: `Curve`, default: [Curves.easeOutCubic]. Applied when transitioning /// between collapsed and expanded stack states. Curve expandingCurve; /// Duration for expansion animation transitions. /// /// Type: `Duration`, default: `500ms`. Controls timing of stack expansion /// and collapse animations for smooth user experience. Duration expandingDuration; /// Opacity level for collapsed toast entries. /// /// Type: `double`, default: `1.0`. Controls visibility of background toasts /// in the stack, with 1.0 being fully opaque and 0.0 being transparent. double collapsedOpacity; /// Initial opacity for toast entry animations. /// /// Type: `double`, default: `0.0`. Starting opacity value for toast /// notifications during their entrance animation sequence. double entryOpacity; /// Spacing between toast entries in expanded mode. /// /// Type: `double`, default: `8.0`. Gap between individual toast notifications /// when the stack is expanded to show multiple entries. double spacing; /// Size constraints for individual toast notifications. /// /// Type: `BoxConstraints?`. If null, uses responsive width based on screen /// size and theme scaling. Defines maximum and minimum toast dimensions. BoxConstraints? toastConstraints; /// Creates a [ToastLayer]. /// /// The [child] parameter is required as the content to wrap with toast /// functionality. All other parameters have sensible defaults but can be /// customized to match specific design requirements. /// /// Parameters: /// - [child] (Widget, required): Content to wrap with toast capabilities /// - [maxStackedEntries] (int, default: 3): Maximum visible toast count /// - [padding] (EdgeInsetsGeometry?, optional): Toast area padding override /// - [expandMode] (ExpandMode, default: expandOnHover): Stack expansion behavior /// - [collapsedOffset] (Offset?, optional): Background toast positioning offset /// - [collapsedScale] (double, default: 0.9): Background toast size reduction /// - [expandingCurve] (Curve, default: easeOutCubic): Expansion animation curve /// - [expandingDuration] (Duration, default: 500ms): Expansion animation timing /// - [collapsedOpacity] (double, default: 1.0): Background toast visibility /// - [entryOpacity] (double, default: 0.0): Toast entrance starting opacity /// - [spacing] (double, default: 8.0): Gap between expanded toast entries /// - [toastConstraints] (BoxConstraints?, optional): Individual toast size limits /// /// Example: /// ```dart /// ToastLayer( /// maxStackedEntries: 5, /// expandMode: ExpandMode.expandOnTap, /// spacing: 12.0, /// child: MaterialApp(home: HomePage()), /// ); /// ``` const ToastLayer({super.key, required this.child, this.maxStackedEntries = 3, this.padding, this.expandMode = ExpandMode.expandOnHover, this.collapsedOffset, this.collapsedScale = 0.9, this.expandingCurve = Curves.easeOutCubic, this.expandingDuration = const Duration(milliseconds: 500), this.collapsedOpacity = 1, this.entryOpacity = 0.0, this.spacing = 8, this.toastConstraints}); State createState(); } /// Abstract interface for controlling individual toast notification instances. /// /// ToastOverlay provides methods for managing the lifecycle and state of /// individual toast notifications after they have been displayed. Instances /// are returned by [showToast] and passed to [ToastBuilder] functions. /// /// The interface allows checking the current display state and programmatically /// dismissing toast notifications, enabling responsive user interactions and /// proper cleanup when needed. abstract class ToastOverlay { /// Whether the toast notification is currently being displayed. /// /// Type: `bool`. Returns true if the toast is visible or in the process /// of animating in/out, false if it has been dismissed or closed. bool get isShowing; /// Programmatically dismisses the toast notification. /// /// Triggers the dismissal animation and removes the toast from the display /// stack. This method can be called multiple times safely - subsequent /// calls after dismissal will have no effect. /// /// Example: /// ```dart /// final toast = showToast(context: context, builder: (context, overlay) { /// return AlertCard( /// title: 'Auto-close', /// trailing: IconButton( /// icon: Icon(Icons.close), /// onPressed: overlay.close, /// ), /// ); /// }); /// /// // Close programmatically after delay /// Timer(Duration(seconds: 2), toast.close); /// ``` void close(); } /// Configuration for a single toast notification. /// /// Encapsulates all properties needed to display and manage a toast, /// including builder, location, timing, and dismissal behavior. class ToastEntry { /// Builder function to create the toast widget. ToastBuilder builder; /// Position where the toast should appear. ToastLocation location; /// Whether the toast can be dismissed by user interaction. /// /// Defaults to true. When false, toast only closes after duration expires. bool dismissible; /// Animation curve for entry/exit transitions. Curve curve; /// Duration for entry/exit animations. Duration duration; /// Captured theme data to apply to the toast. CapturedThemes? themes; /// Captured inherited widget data to apply to the toast. CapturedData? data; /// Callback invoked when toast is closed. VoidCallback? onClosed; /// How long the toast remains visible before auto-dismissing. /// /// Defaults to 5 seconds. If null, toast remains indefinitely. Duration? showDuration; /// Creates a toast entry configuration. ToastEntry({required this.builder, required this.location, this.dismissible = true, this.curve = Curves.easeInOut, this.duration = kDefaultDuration, required this.themes, required this.data, this.onClosed, this.showDuration = const Duration(seconds: 5)}); } /// Internal widget for managing toast entry layout and animations. /// /// Handles the positioning, transitions, and lifecycle of individual toast /// notifications. Manages expansion/collapse animations, entry/exit transitions, /// and stacking behavior for multiple toasts. /// /// This is an internal implementation class used by the toast system and /// should not be used directly in application code. class ToastEntryLayout extends StatefulWidget { /// The toast entry data containing the notification content. ToastEntry entry; /// Whether the toast is in expanded state. bool expanded; /// Whether the toast is currently visible. bool visible; /// Whether the toast can be dismissed by user interaction. bool dismissible; /// Alignment used before the current animation. AlignmentGeometry previousAlignment; /// Animation curve for transitions. Curve curve; /// Duration of transition animations. Duration duration; /// Captured theme data to apply to the toast content. CapturedThemes? themes; /// Captured inherited data to apply to the toast content. CapturedData? data; /// Notifies when the toast is closing. ValueListenable closing; /// Callback invoked when the toast has completely closed. VoidCallback onClosed; /// Offset applied when toast is in collapsed state. Offset collapsedOffset; /// Scale factor applied when toast is in collapsed state. double collapsedScale; /// Curve used for expansion animations. Curve expandingCurve; /// Duration of expansion animations. Duration expandingDuration; /// Opacity when toast is collapsed. double collapsedOpacity; /// Initial opacity when toast enters. double entryOpacity; /// The toast content widget. Widget child; /// Initial offset when toast enters. Offset entryOffset; /// Alignment of the toast entry. AlignmentGeometry entryAlignment; /// Spacing between stacked toasts. double spacing; /// Visual index in the toast stack. int index; /// Actual index in the internal list. int actualIndex; /// Callback invoked when toast starts closing. VoidCallback? onClosing; /// Creates a [ToastEntryLayout]. /// /// Most parameters control animation and positioning behavior. This is /// an internal widget used by the toast system. const ToastEntryLayout({super.key, required this.entry, required this.expanded, this.visible = true, this.dismissible = true, this.previousAlignment = Alignment.center, this.curve = Curves.easeInOut, this.duration = kDefaultDuration, required this.themes, required this.data, required this.closing, required this.onClosed, required this.collapsedOffset, required this.collapsedScale, this.expandingCurve = Curves.easeInOut, this.expandingDuration = kDefaultDuration, this.collapsedOpacity = 0.8, this.entryOpacity = 0.0, required this.entryOffset, required this.child, required this.entryAlignment, required this.spacing, required this.index, required this.actualIndex, required this.onClosing}); State createState(); } /// Theme configuration for swiper overlay behavior and appearance. /// /// Defines default properties for swiper components including overlay /// behavior, drag interaction, surface effects, and visual styling. /// /// Features: /// - Configurable drag and expansion behavior /// - Surface effects and backdrop styling /// - Barrier and interaction customization /// - Consistent theming across swiper variants /// /// Example: /// ```dart /// ComponentThemeData( /// data: { /// SwiperTheme: SwiperTheme( /// expands: true, /// draggable: true, /// barrierDismissible: true, /// transformBackdrop: true, /// ), /// }, /// child: MyApp(), /// ) /// ``` class SwiperTheme { /// Whether the swiper should expand to fill available space. bool? expands; /// Whether the swiper can be dragged to dismiss. bool? draggable; /// Whether tapping the barrier dismisses the swiper. bool? barrierDismissible; /// Builder for custom backdrop content. WidgetBuilder? backdropBuilder; /// Whether to respect device safe areas. bool? useSafeArea; /// Whether to show the drag handle. bool? showDragHandle; /// Border radius for the swiper container. BorderRadiusGeometry? borderRadius; /// Size of the drag handle when displayed. Size? dragHandleSize; /// Whether to transform the backdrop when shown. bool? transformBackdrop; /// Opacity for surface effects. double? surfaceOpacity; /// Blur intensity for surface effects. double? surfaceBlur; /// Color of the modal barrier. Color? barrierColor; /// Hit test behavior for gesture detection. HitTestBehavior? behavior; /// Creates a [SwiperTheme]. /// /// All parameters are optional and will use system defaults when null. /// /// Example: /// ```dart /// const SwiperTheme( /// expands: true, /// draggable: true, /// transformBackdrop: true, /// ) /// ``` const SwiperTheme({this.expands, this.draggable, this.barrierDismissible, this.backdropBuilder, this.useSafeArea, this.showDragHandle, this.borderRadius, this.dragHandleSize, this.transformBackdrop, this.surfaceOpacity, this.surfaceBlur, this.barrierColor, this.behavior}); /// Creates a copy of this theme with optionally replaced values. /// /// All parameters are wrapped in [ValueGetter] to allow lazy evaluation /// and dynamic theme changes. SwiperTheme copyWith({ValueGetter? expands, ValueGetter? draggable, ValueGetter? barrierDismissible, ValueGetter? backdropBuilder, ValueGetter? useSafeArea, ValueGetter? showDragHandle, ValueGetter? borderRadius, ValueGetter? dragHandleSize, ValueGetter? transformBackdrop, ValueGetter? surfaceOpacity, ValueGetter? surfaceBlur, ValueGetter? barrierColor, ValueGetter? behavior}); int get hashCode; bool operator ==(Object other); String toString(); } /// Abstract handler interface for swiper overlay implementations. /// /// Defines the contract for creating different types of swiper overlays, /// with built-in implementations for drawer-style and sheet-style swipers. /// /// Features: /// - Pluggable swiper behavior patterns /// - Built-in drawer and sheet implementations /// - Consistent API across swiper types /// - Configurable overlay properties /// /// Example: /// ```dart /// // Use built-in handlers /// const SwiperHandler.drawer /// const SwiperHandler.sheet /// ``` abstract class SwiperHandler { /// Handler for drawer-style swipers with backdrop transformation. static const SwiperHandler drawer = DrawerSwiperHandler(); /// Handler for sheet-style swipers with minimal styling. static const SwiperHandler sheet = SheetSwiperHandler(); /// Creates a swiper handler. const SwiperHandler(); /// Creates a swiper overlay with the specified configuration. /// /// Parameters vary by implementation but commonly include position, /// builder, and visual/behavioral properties. /// /// Returns: /// A [DrawerOverlayCompleter] for managing the swiper lifecycle. DrawerOverlayCompleter openSwiper({required BuildContext context, required WidgetBuilder builder, required OverlayPosition position, bool? expands, bool? draggable, bool? barrierDismissible, WidgetBuilder? backdropBuilder, bool? useSafeArea, bool? showDragHandle, BorderRadiusGeometry? borderRadius, Size? dragHandleSize, bool? transformBackdrop, double? surfaceOpacity, double? surfaceBlur, Color? barrierColor}); } /// Drawer-style swiper handler with backdrop transformation. /// /// Creates swipers that behave like drawers with backdrop scaling, /// drag handles, and full interaction support. /// /// Example: /// ```dart /// Swiper( /// handler: SwiperHandler.drawer, /// position: OverlayPosition.left, /// builder: (context) => DrawerContent(), /// child: MenuButton(), /// ) /// ``` class DrawerSwiperHandler extends SwiperHandler { /// Creates a drawer-style swiper handler. const DrawerSwiperHandler(); DrawerOverlayCompleter openSwiper({required BuildContext context, required WidgetBuilder builder, required OverlayPosition position, bool? expands, bool? draggable, bool? barrierDismissible, WidgetBuilder? backdropBuilder, bool? useSafeArea, bool? showDragHandle, BorderRadiusGeometry? borderRadius, Size? dragHandleSize, bool? transformBackdrop, double? surfaceOpacity, double? surfaceBlur, Color? barrierColor}); } /// Sheet-style swiper handler with minimal styling. /// /// Creates swipers that behave like sheets with edge-to-edge content, /// minimal decoration, and optional drag interaction. /// /// Example: /// ```dart /// Swiper( /// handler: SwiperHandler.sheet, /// position: OverlayPosition.bottom, /// builder: (context) => BottomSheetContent(), /// child: ActionButton(), /// ) /// ``` class SheetSwiperHandler extends SwiperHandler { /// Creates a sheet-style swiper handler. const SheetSwiperHandler(); DrawerOverlayCompleter openSwiper({required BuildContext context, required WidgetBuilder builder, required OverlayPosition position, bool? expands, bool? draggable, bool? barrierDismissible, WidgetBuilder? backdropBuilder, bool? useSafeArea, bool? showDragHandle, BorderRadiusGeometry? borderRadius, Size? dragHandleSize, bool? transformBackdrop, double? surfaceOpacity, double? surfaceBlur, Color? barrierColor}); } /// A gesture-responsive widget that triggers overlay content through swiping. /// /// Detects swipe gestures on the child widget and displays overlay content /// using the configured handler (drawer or sheet style). Supports both /// programmatic and gesture-based triggering with comprehensive customization. /// /// Features: /// - Gesture-based overlay triggering /// - Multiple handler implementations (drawer/sheet) /// - Configurable swipe sensitivity and behavior /// - Theme integration and visual customization /// - Programmatic control and dismissal /// - Position-aware gesture detection /// /// The swiper responds to swipe gestures in the direction that would reveal /// the overlay (e.g., swiping right reveals a left-positioned overlay). /// /// Example: /// ```dart /// Swiper( /// handler: SwiperHandler.drawer, /// position: OverlayPosition.left, /// builder: (context) => NavigationDrawer(), /// child: AppBar( /// leading: Icon(Icons.menu), /// title: Text('My App'), /// ), /// ) /// ``` class Swiper extends StatefulWidget { /// Whether swipe gestures are enabled. bool enabled; /// Position from which the overlay should appear. OverlayPosition position; /// Builder function that creates the overlay content. WidgetBuilder builder; /// Handler that defines the overlay behavior (drawer or sheet). SwiperHandler handler; /// Whether the overlay should expand to fill available space. bool? expands; /// Whether the overlay can be dragged to dismiss. bool? draggable; /// Whether tapping the barrier dismisses the overlay. bool? barrierDismissible; /// Builder for custom backdrop content. WidgetBuilder? backdropBuilder; /// Whether to respect device safe areas. bool? useSafeArea; /// Whether to show the drag handle. bool? showDragHandle; /// Border radius for the overlay container. BorderRadiusGeometry? borderRadius; /// Size of the drag handle when displayed. Size? dragHandleSize; /// Whether to transform the backdrop when shown. bool? transformBackdrop; /// Opacity for surface effects. double? surfaceOpacity; /// Blur intensity for surface effects. double? surfaceBlur; /// Color of the modal barrier. Color? barrierColor; /// The child widget that responds to swipe gestures. Widget child; /// Hit test behavior for gesture detection. HitTestBehavior? behavior; /// Creates a [Swiper]. /// /// The [position], [builder], [handler], and [child] parameters are required. /// Other parameters customize the overlay behavior and appearance. /// /// Parameters: /// - [enabled] (bool, default: true): whether swipe gestures are enabled /// - [position] (OverlayPosition, required): side from which overlay appears /// - [builder] (WidgetBuilder, required): builds the overlay content /// - [handler] (SwiperHandler, required): defines overlay behavior (drawer/sheet) /// - [child] (Widget, required): widget that responds to swipe gestures /// - [expands] (bool?, optional): whether overlay expands to fill space /// - [draggable] (bool?, optional): whether overlay can be dragged to dismiss /// - [barrierDismissible] (bool?, optional): whether barrier tap dismisses overlay /// - [backdropBuilder] (WidgetBuilder?, optional): custom backdrop builder /// - [useSafeArea] (bool?, optional): whether to respect safe areas /// - [showDragHandle] (bool?, optional): whether to show drag handle /// - [borderRadius] (BorderRadiusGeometry?, optional): overlay corner radius /// - [dragHandleSize] (Size?, optional): size of drag handle /// - [transformBackdrop] (bool?, optional): whether to transform backdrop /// - [surfaceOpacity] (double?, optional): surface opacity level /// - [surfaceBlur] (double?, optional): surface blur intensity /// - [barrierColor] (Color?, optional): modal barrier color /// - [behavior] (HitTestBehavior?, optional): gesture detection behavior /// /// Example: /// ```dart /// Swiper( /// position: OverlayPosition.bottom, /// handler: SwiperHandler.sheet, /// builder: (context) => ActionSheet(), /// child: FloatingActionButton( /// onPressed: null, /// child: Icon(Icons.more_horiz), /// ), /// ) /// ``` const Swiper({super.key, this.enabled = true, required this.position, required this.builder, required this.handler, this.expands, this.draggable, this.barrierDismissible, this.backdropBuilder, this.useSafeArea, this.showDragHandle, this.borderRadius, this.dragHandleSize, this.transformBackdrop, this.surfaceOpacity, this.surfaceBlur, this.barrierColor, this.behavior, required this.child}); State createState(); } /// Theme data for customizing [TooltipContainer] widget appearance. /// /// This class defines the visual properties that can be applied to /// tooltip containers, including surface effects, padding, colors, /// and border styling. These properties can be set at the theme level /// to provide consistent styling across the application. class TooltipTheme { /// Opacity applied to the tooltip surface color. double? surfaceOpacity; /// Blur amount for the tooltip surface. double? surfaceBlur; /// Padding around the tooltip content. EdgeInsetsGeometry? padding; /// Background color of the tooltip. Color? backgroundColor; /// Border radius of the tooltip container. BorderRadiusGeometry? borderRadius; /// Creates a [TooltipTheme]. const TooltipTheme({this.surfaceOpacity, this.surfaceBlur, this.padding, this.backgroundColor, this.borderRadius}); /// Creates a copy of this theme but with the given fields replaced. TooltipTheme copyWith({ValueGetter? surfaceOpacity, ValueGetter? surfaceBlur, ValueGetter? padding, ValueGetter? backgroundColor, ValueGetter? borderRadius}); bool operator ==(Object other); int get hashCode; } /// A styled container widget for tooltip content. /// /// Provides consistent visual styling for tooltip popups with customizable /// background, opacity, blur, padding, and border radius. Integrates with /// the tooltip theme system while allowing per-instance overrides. class TooltipContainer extends StatelessWidget { /// The tooltip content widget. Widget child; /// Opacity applied to the background surface (0.0 to 1.0). double? surfaceOpacity; /// Blur radius applied to the background surface. double? surfaceBlur; /// Padding around the tooltip content. EdgeInsetsGeometry? padding; /// Background color of the tooltip container. Color? backgroundColor; /// Border radius for rounded corners. BorderRadiusGeometry? borderRadius; /// Creates a [TooltipContainer]. /// /// All styling parameters are optional and fall back to theme defaults. /// /// Parameters: /// - [child] (`Widget`, required): Content to display in the tooltip. /// - [surfaceOpacity] (`double?`, optional): Background opacity (0.0-1.0). /// - [surfaceBlur] (`double?`, optional): Background blur radius. /// - [padding] (`EdgeInsetsGeometry?`, optional): Content padding. /// - [backgroundColor] (`Color?`, optional): Background color. /// - [borderRadius] (`BorderRadiusGeometry?`, optional): Border radius. /// /// Example: /// ```dart /// TooltipContainer( /// surfaceOpacity: 0.9, /// padding: EdgeInsets.all(8), /// backgroundColor: Colors.black, /// borderRadius: BorderRadius.circular(4), /// child: Text('Tooltip text'), /// ) /// ``` const TooltipContainer({super.key, this.surfaceOpacity, this.surfaceBlur, this.padding, this.backgroundColor, this.borderRadius, required this.child}); /// Builds the tooltip container. /// /// This allows using the widget as a builder function. Widget call(BuildContext context); Widget build(BuildContext context); } /// An interactive tooltip widget that displays contextual information on hover. /// /// [Tooltip] provides contextual help and information by displaying a small overlay /// when users hover over or interact with the child widget. It supports configurable /// positioning, timing, and custom content through builder functions, making it /// ideal for providing additional context without cluttering the interface. /// /// Key features: /// - Hover-activated tooltip display with configurable delays /// - Flexible positioning with alignment and anchor point control /// - Custom content through builder functions /// - Duration controls for show/hide timing and minimum display time /// - Smooth animations and transitions /// - Integration with the overlay system for proper z-ordering /// - Theme support for consistent styling /// - Automatic positioning adjustment to stay within screen bounds /// /// Timing behavior: /// - Wait duration: Time to wait before showing tooltip on hover /// - Show duration: Animation time for tooltip appearance /// - Min duration: Minimum time tooltip stays visible once shown /// - Auto-hide: Tooltip disappears when hover ends (after min duration) /// /// The tooltip uses a popover-based implementation that ensures proper layering /// and positioning relative to the trigger widget. The positioning system /// automatically adjusts to keep tooltips within the viewport. /// /// Example: /// ```dart /// Tooltip( /// tooltip: (context) => TooltipContainer( /// child: Text('This button performs a critical action'), /// ), /// waitDuration: Duration(milliseconds: 800), /// showDuration: Duration(milliseconds: 150), /// alignment: Alignment.topCenter, /// anchorAlignment: Alignment.bottomCenter, /// child: IconButton( /// icon: Icon(Icons.warning), /// onPressed: () => _handleCriticalAction(), /// ), /// ); /// ``` class Tooltip extends StatefulWidget { /// The widget that triggers the tooltip on hover. Widget child; /// Builder function for the tooltip content. WidgetBuilder tooltip; /// Alignment of the tooltip relative to the anchor. AlignmentGeometry alignment; /// Alignment point on the child widget where tooltip anchors. AlignmentGeometry anchorAlignment; /// Time to wait before showing the tooltip on hover. Duration waitDuration; /// Duration of the tooltip show animation. Duration showDuration; /// Minimum time the tooltip stays visible once shown. Duration minDuration; /// Creates a [Tooltip]. /// /// Parameters: /// - [child] (`Widget`, required): Widget that triggers the tooltip. /// - [tooltip] (`WidgetBuilder`, required): Builder for tooltip content. /// - [alignment] (`AlignmentGeometry`, default: `Alignment.topCenter`): Tooltip position. /// - [anchorAlignment] (`AlignmentGeometry`, default: `Alignment.bottomCenter`): Anchor point on child. /// - [waitDuration] (`Duration`, default: 500ms): Delay before showing. /// - [showDuration] (`Duration`, default: 200ms): Animation duration. /// - [minDuration] (`Duration`, default: 0ms): Minimum visible time. const Tooltip({super.key, required this.child, required this.tooltip, this.alignment = Alignment.topCenter, this.anchorAlignment = Alignment.bottomCenter, this.waitDuration = const Duration(milliseconds: 500), this.showDuration = const Duration(milliseconds: 200), this.minDuration = const Duration(milliseconds: 0)}); State createState(); } /// A tooltip that shows immediately on hover without delay. /// /// Unlike [Tooltip], this widget displays the tooltip instantly when the /// mouse enters the child widget area. It's useful for situations where /// immediate feedback is desired, such as toolbar buttons or icon-only /// controls where labels need to be visible right away. /// /// The tooltip automatically closes when the mouse leaves the widget. class InstantTooltip extends StatefulWidget { /// The widget that triggers the tooltip on hover. Widget child; /// How to behave during hit testing. HitTestBehavior behavior; /// Builder function for the tooltip content. WidgetBuilder tooltipBuilder; /// Alignment of the tooltip relative to the anchor. AlignmentGeometry tooltipAlignment; /// Alignment point on the child widget where tooltip anchors. AlignmentGeometry? tooltipAnchorAlignment; /// Creates an [InstantTooltip]. /// /// Parameters: /// - [child] (`Widget`, required): Widget that triggers the tooltip. /// - [tooltipBuilder] (`WidgetBuilder`, required): Builder for tooltip content. /// - [behavior] (`HitTestBehavior`, default: `HitTestBehavior.translucent`): Hit test behavior. /// - [tooltipAlignment] (`AlignmentGeometry`, default: `Alignment.bottomCenter`): Tooltip position. /// - [tooltipAnchorAlignment] (`AlignmentGeometry?`, optional): Anchor point on child. /// /// Example: /// ```dart /// InstantTooltip( /// tooltipBuilder: (context) => Text('Help text'), /// child: Icon(Icons.help), /// ) /// ``` const InstantTooltip({super.key, required this.child, required this.tooltipBuilder, this.behavior = HitTestBehavior.translucent, this.tooltipAlignment = Alignment.bottomCenter, this.tooltipAnchorAlignment}); State createState(); } /// Overlay handler that delegates tooltip display to an [OverlayManager]. /// /// This handler integrates tooltips with the overlay management system, /// allowing tooltips to be displayed through the overlay manager's /// tooltip-specific display logic. This ensures proper layering and /// lifecycle management within the overlay system. class OverlayManagerAsTooltipOverlayHandler extends OverlayHandler { /// The overlay manager instance to use for displaying tooltips. OverlayManager overlayManager; /// Creates an [OverlayManagerAsTooltipOverlayHandler]. /// /// Parameters: /// - [overlayManager] (`OverlayManager`, required): The overlay manager instance. const OverlayManagerAsTooltipOverlayHandler({required this.overlayManager}); OverlayCompleter show({required BuildContext context, required AlignmentGeometry alignment, required WidgetBuilder builder, Offset? position, AlignmentGeometry? anchorAlignment, PopoverConstraint widthConstraint = PopoverConstraint.flexible, PopoverConstraint heightConstraint = PopoverConstraint.flexible, Key? key, bool rootOverlay = true, bool barrierDismissable = true, bool modal = true, Clip clipBehavior = Clip.none, Object? regionGroupId, Offset? offset, AlignmentGeometry? transitionAlignment, EdgeInsetsGeometry? margin, bool follow = true, bool consumeOutsideTaps = true, ValueChanged? onTickFollow, bool allowInvertHorizontal = true, bool allowInvertVertical = true, bool dismissBackdropFocus = true, Duration? showDuration, Duration? dismissDuration, OverlayBarrier? overlayBarrier, LayerLink? layerLink}); } /// A fixed overlay handler for tooltips using direct overlay entries. /// /// This handler creates tooltips using Flutter's built-in overlay system /// without delegating to an overlay manager. Tooltips are positioned /// directly in the overlay and use fixed positioning relative to their /// anchor widget. /// /// Use this handler when you need direct control over tooltip overlay /// entries or when not using an overlay manager. class FixedTooltipOverlayHandler extends OverlayHandler { /// Creates a [FixedTooltipOverlayHandler]. const FixedTooltipOverlayHandler(); OverlayCompleter show({required BuildContext context, required AlignmentGeometry alignment, required WidgetBuilder builder, Offset? position, AlignmentGeometry? anchorAlignment, PopoverConstraint widthConstraint = PopoverConstraint.flexible, PopoverConstraint heightConstraint = PopoverConstraint.flexible, Key? key, bool rootOverlay = true, bool modal = true, bool barrierDismissable = true, Clip clipBehavior = Clip.none, Object? regionGroupId, Offset? offset, AlignmentGeometry? transitionAlignment, EdgeInsetsGeometry? margin, bool follow = true, bool consumeOutsideTaps = true, ValueChanged? onTickFollow, bool allowInvertHorizontal = true, bool allowInvertVertical = true, bool dismissBackdropFocus = true, Duration? showDuration, Duration? dismissDuration, OverlayBarrier? overlayBarrier, LayerLink? layerLink}); } /// Theme configuration for modal backdrop appearance and behavior. /// /// Defines the visual and behavioral properties of the backdrop that appears /// behind modal dialogs, including border radius, padding, barrier color, /// and modal interaction settings. /// /// Example: /// ```dart /// ComponentThemeData( /// data: { /// ModalBackdropTheme: ModalBackdropTheme( /// barrierColor: Colors.black54, /// borderRadius: BorderRadius.circular(12), /// modal: true, /// ), /// }, /// child: MyApp(), /// ) /// ``` class ModalBackdropTheme { /// Border radius applied to the modal surface. BorderRadiusGeometry? borderRadius; /// Padding around the modal content area. EdgeInsetsGeometry? padding; /// Color of the barrier that appears behind the modal. Color? barrierColor; /// Whether the backdrop behaves as a modal (blocking interaction). bool? modal; /// Whether to clip the surface for visual effects. bool? surfaceClip; /// Creates a [ModalBackdropTheme]. /// /// All parameters are optional and will use system defaults when null. /// /// Parameters: /// - [borderRadius] (BorderRadiusGeometry?, optional): corner radius for the modal surface /// - [padding] (EdgeInsetsGeometry?, optional): padding around modal content /// - [barrierColor] (Color?, optional): backdrop color, typically semi-transparent /// - [modal] (bool?, optional): whether backdrop blocks user interaction /// - [surfaceClip] (bool?, optional): whether to clip surface for visual effects /// /// Example: /// ```dart /// const ModalBackdropTheme( /// borderRadius: BorderRadius.circular(8), /// barrierColor: Color.fromRGBO(0, 0, 0, 0.5), /// modal: true, /// ) /// ``` const ModalBackdropTheme({this.borderRadius, this.padding, this.barrierColor, this.modal, this.surfaceClip}); /// Creates a copy of this theme with the given fields replaced. /// /// Uses [ValueGetter] functions to allow null value assignments. /// Any parameter set to null will use the current value. /// /// Returns: /// A new [ModalBackdropTheme] with updated values. /// /// Example: /// ```dart /// final newTheme = theme.copyWith( /// barrierColor: () => Colors.red.withOpacity(0.3), /// modal: () => false, /// ); /// ``` ModalBackdropTheme copyWith({ValueGetter? borderRadius, ValueGetter? padding, ValueGetter? barrierColor, ValueGetter? modal, ValueGetter? surfaceClip}); bool operator ==(Object other); int get hashCode; } /// A visual backdrop widget that creates modal-style overlays. /// /// Creates a semi-transparent barrier behind modal content with support for /// custom colors, clipping, and animation. The backdrop can be configured /// to prevent interaction with content below when modal behavior is enabled. /// /// Features: /// - Customizable barrier color and opacity /// - Surface clipping for visual effects /// - Animation support with fade transitions /// - Configurable modal behavior /// - Theme integration /// /// Example: /// ```dart /// ModalBackdrop( /// barrierColor: Colors.black54, /// borderRadius: BorderRadius.circular(12), /// modal: true, /// child: MyDialogContent(), /// ) /// ``` class ModalBackdrop extends StatelessWidget { /// Determines if surface clipping should be enabled based on opacity. /// /// Returns `true` if [surfaceOpacity] is null or less than 1.0, /// indicating that clipping is needed for proper visual effects. static bool shouldClipSurface(double? surfaceOpacity); /// The child widget to display above the backdrop. Widget child; /// Border radius for the backdrop cutout around the child. BorderRadiusGeometry? borderRadius; /// Padding around the child widget. EdgeInsetsGeometry? padding; /// Color of the backdrop barrier. Color? barrierColor; /// Animation for fade in/out transitions. Animation? fadeAnimation; /// Whether the backdrop should behave as a modal. bool? modal; /// Whether to apply surface clipping effects. bool? surfaceClip; /// Creates a [ModalBackdrop]. /// /// The [child] parameter is required and represents the content to display /// above the backdrop. /// /// Parameters: /// - [child] (Widget, required): content widget displayed above backdrop /// - [modal] (bool?, optional): enables modal behavior, defaults to true /// - [surfaceClip] (bool?, optional): enables surface clipping, defaults to true /// - [borderRadius] (BorderRadiusGeometry?, optional): corner radius for cutout /// - [barrierColor] (Color?, optional): backdrop color, defaults to black with 80% opacity /// - [padding] (EdgeInsetsGeometry?, optional): padding around child /// - [fadeAnimation] (`Animation?`, optional): fade transition animation /// /// Example: /// ```dart /// ModalBackdrop( /// barrierColor: Colors.black54, /// fadeAnimation: slideController, /// child: AlertDialog(title: Text('Alert')), /// ) /// ``` const ModalBackdrop({super.key, this.modal, this.surfaceClip, this.borderRadius, this.barrierColor, this.padding, this.fadeAnimation, required this.child}); Widget build(BuildContext context); } /// A container widget that provides consistent styling for modal content. /// /// Wraps modal content in a [SurfaceCard] with appropriate styling that /// adapts to full-screen mode. Handles surface effects, borders, shadows, /// and clipping behavior automatically based on the modal context. /// /// Features: /// - Automatic full-screen mode detection /// - Surface styling with blur and opacity effects /// - Configurable borders and shadows /// - Clip behavior control /// - Theme integration /// /// Example: /// ```dart /// ModalContainer( /// padding: EdgeInsets.all(16), /// borderRadius: BorderRadius.circular(12), /// filled: true, /// child: Column( /// children: [ /// Text('Dialog Title'), /// Text('Dialog content here'), /// ], /// ), /// ) /// ``` class ModalContainer extends StatelessWidget { /// Model key used to identify full-screen modal mode. static const kFullScreenMode = #modal_surface_card_fullscreen; /// Checks if the current context is in full-screen modal mode. /// /// Returns `true` if the modal should display in full-screen mode, /// which affects styling such as border radius and shadows. static bool isFullScreenMode(BuildContext context); /// The child widget to display inside the modal container. Widget child; /// Padding applied inside the container around the child. EdgeInsetsGeometry? padding; /// Whether the container should have a filled background. bool filled; /// Background fill color when [filled] is true. Color? fillColor; /// Border radius for the container corners. BorderRadiusGeometry? borderRadius; /// Color of the container border. Color? borderColor; /// Width of the container border in logical pixels. double? borderWidth; /// Clipping behavior for the container content. Clip clipBehavior; /// Drop shadow effects applied to the container. List? boxShadow; /// Surface opacity for backdrop effects. double? surfaceOpacity; /// Surface blur intensity for backdrop effects. double? surfaceBlur; /// Animation duration for surface transitions. Duration? duration; /// Creates a [ModalContainer]. /// /// The [child] parameter is required. Other parameters customize the /// container's appearance and behavior. /// /// Parameters: /// - [child] (Widget, required): content to display in the container /// - [padding] (EdgeInsetsGeometry?, optional): inner padding around child /// - [filled] (bool, default: false): whether to show background fill /// - [fillColor] (Color?, optional): background fill color when filled is true /// - [borderRadius] (BorderRadiusGeometry?, optional): corner radius /// - [clipBehavior] (Clip, default: Clip.none): clipping behavior for content /// - [borderColor] (Color?, optional): border color /// - [borderWidth] (double?, optional): border width in logical pixels /// - [boxShadow] (`List?`, optional): drop shadow effects /// - [surfaceOpacity] (double?, optional): backdrop opacity level /// - [surfaceBlur] (double?, optional): backdrop blur intensity /// - [duration] (Duration?, optional): animation duration for transitions /// /// Example: /// ```dart /// ModalContainer( /// filled: true, /// padding: EdgeInsets.all(24), /// borderRadius: BorderRadius.circular(8), /// child: Text('Modal Content'), /// ) /// ``` const ModalContainer({super.key, required this.child, this.padding, this.filled = false, this.fillColor, this.borderRadius, this.clipBehavior = Clip.none, this.borderColor, this.borderWidth, this.boxShadow, this.surfaceOpacity, this.surfaceBlur, this.duration}); Widget build(BuildContext context); } /// Custom painter that creates a barrier effect with an optional cutout. /// /// Paints a large colored rectangle that covers the entire screen, with /// an optional rounded rectangle cutout to create a "spotlight" effect /// around modal content. Uses path clipping to create the cutout area. /// /// Features: /// - Full-screen barrier painting /// - Rounded rectangle cutouts /// - Configurable colors and padding /// - Efficient repainting optimization /// /// Example: /// ```dart /// CustomPaint( /// painter: SurfaceBarrierPainter( /// clip: true, /// borderRadius: BorderRadius.circular(8), /// barrierColor: Colors.black54, /// padding: EdgeInsets.all(16), /// ), /// ) /// ``` class SurfaceBarrierPainter extends CustomPainter { /// Large size constant for creating screen-filling effects. static const double bigSize = 1000000; /// Large screen size for painting operations. static const bigScreen = Size(bigSize, bigSize); /// Large offset to center the big screen. static const bigOffset = Offset(-bigSize / 2, -bigSize / 2); /// Whether to clip a cutout area in the barrier. bool clip; /// Border radius for the cutout area. BorderRadius borderRadius; /// Color of the barrier. Color barrierColor; /// Padding around the cutout area. EdgeInsets padding; /// Creates a [SurfaceBarrierPainter]. /// /// Parameters: /// - [clip] (bool, required): whether to create a cutout in the barrier /// - [borderRadius] (BorderRadius, required): radius for the cutout corners /// - [barrierColor] (Color, required): color of the barrier /// - [padding] (EdgeInsets, default: EdgeInsets.zero): padding around cutout /// /// Example: /// ```dart /// SurfaceBarrierPainter( /// clip: true, /// borderRadius: BorderRadius.circular(12), /// barrierColor: Colors.black54, /// ) /// ``` SurfaceBarrierPainter({required this.clip, required this.borderRadius, required this.barrierColor, this.padding = EdgeInsets.zero}); void paint(Canvas canvas, Size size); bool shouldRepaint(covariant SurfaceBarrierPainter oldDelegate); } /// Custom route implementation for shadcn_flutter dialogs. /// /// Extends [RawDialogRoute] to provide consistent dialog behavior with /// proper theme inheritance, data capture, and transition animations. /// Handles both standard and full-screen dialog presentations. /// /// Features: /// - Theme and data inheritance across navigation boundaries /// - Configurable alignment and positioning /// - Full-screen mode support /// - Custom transition animations /// - Safe area integration /// /// This class is typically not used directly - use [showDialog] instead. class DialogRoute extends RawDialogRoute { /// Captured data from the launching context. CapturedData? data; /// Alignment for positioning the dialog. AlignmentGeometry alignment; /// Whether the dialog should display in full-screen mode. bool fullScreen; /// Creates a [DialogRoute]. /// /// Parameters: /// - [context] (`BuildContext`, required): Build context. /// - [builder] (`WidgetBuilder`, required): Dialog content builder. /// - [themes] (`CapturedThemes?`, optional): Captured theme data. /// - [barrierColor] (`Color`, default: transparent): Barrier color. /// - [barrierDismissible] (`bool?`, optional): Whether tapping barrier dismisses dialog. /// - [barrierLabel] (`String?`, optional): Semantic label for barrier. /// - [useSafeArea] (`bool`, default: `true`): Whether to respect safe area. /// - [settings] (`RouteSettings?`, optional): Route settings. /// - [anchorPoint] (`Offset?`, optional): Anchor point for route. /// - [traversalEdgeBehavior] (`TraversalEdgeBehavior?`, optional): Traversal behavior. /// - [alignment] (`AlignmentGeometry`, required): Dialog alignment. /// - [transitionBuilder] (`RouteTransitionsBuilder`, required): Transition builder. /// - [fullScreen] (`bool`, default: `false`): Full-screen mode. /// - [data] (`CapturedData?`, optional): Captured data. DialogRoute({required BuildContext context, required WidgetBuilder builder, CapturedThemes? themes, super.barrierColor = const Color.fromRGBO(0, 0, 0, 0), super.barrierDismissible, String? barrierLabel, bool useSafeArea = true, super.settings, super.anchorPoint, super.traversalEdgeBehavior, required this.alignment, required super.transitionBuilder, this.fullScreen = false, this.data}); } /// Displays a dialog using the shadcn_flutter design system. /// /// Shows a modal dialog with consistent styling and animation behavior. /// The dialog is displayed over the current route and blocks interaction /// with the content below. Supports both centered and full-screen modes. /// /// Features: /// - Consistent design system integration /// - Smooth scale and fade animations /// - Configurable alignment and barriers /// - Theme and data inheritance /// - Safe area handling /// - Custom transition animations /// /// Parameters: /// - [context] (BuildContext, required): build context for navigation /// - [builder] (WidgetBuilder, required): function that builds dialog content /// - [useRootNavigator] (bool, default: true): whether to use root navigator /// - [barrierDismissible] (bool, default: true): tap outside to dismiss /// - [barrierColor] (Color?, optional): color of the backdrop barrier /// - [barrierLabel] (String?, optional): semantic label for the barrier /// - [useSafeArea] (bool, default: true): respect device safe areas /// - [routeSettings] (RouteSettings?, optional): settings for the route /// - [anchorPoint] (Offset?, optional): anchor point for transitions /// - [traversalEdgeBehavior] (TraversalEdgeBehavior?, optional): focus traversal /// - [alignment] (AlignmentGeometry?, optional): dialog alignment, defaults to center /// - [fullScreen] (bool, default: false): whether to display in full-screen mode /// /// Returns: /// A [Future] that resolves to the result passed to [Navigator.pop]. /// /// Example: /// ```dart /// final result = await showDialog( /// context: context, /// builder: (context) => AlertDialog( /// title: Text('Confirm'), /// content: Text('Are you sure?'), /// actions: [ /// TextButton( /// onPressed: () => Navigator.pop(context, 'cancel'), /// child: Text('Cancel'), /// ), /// TextButton( /// onPressed: () => Navigator.pop(context, 'ok'), /// child: Text('OK'), /// ), /// ], /// ), /// ); /// ``` Future showDialog({required BuildContext context, required WidgetBuilder builder, bool useRootNavigator = true, bool barrierDismissible = true, Color? barrierColor, String? barrierLabel, bool useSafeArea = true, RouteSettings? routeSettings, Offset? anchorPoint, TraversalEdgeBehavior? traversalEdgeBehavior, AlignmentGeometry? alignment, bool fullScreen = false}); /// Overlay handler that manages dialog display using the navigation stack. /// /// Provides a standardized way to show dialogs through the overlay system /// with proper theme inheritance, animation handling, and modal behavior. /// Integrates with the shadcn_flutter overlay architecture for consistent /// dialog management across the application. /// /// Features: /// - Navigation-based dialog management /// - Theme and data inheritance /// - Configurable modal barriers /// - Animation integration /// - Proper focus management /// /// Example: /// ```dart /// const DialogOverlayHandler().show( /// context: context, /// alignment: Alignment.center, /// builder: (context) => MyCustomDialog(), /// ); /// ``` class DialogOverlayHandler extends OverlayHandler { /// Checks if the current context is within a dialog overlay. /// /// Returns `true` if the context is inside a dialog managed by /// this overlay handler. static bool isDialogOverlay(BuildContext context); /// Creates a [DialogOverlayHandler]. /// /// Example: /// ```dart /// const DialogOverlayHandler() /// ``` const DialogOverlayHandler(); OverlayCompleter show({required BuildContext context, required AlignmentGeometry alignment, required WidgetBuilder builder, Offset? position, AlignmentGeometry? anchorAlignment, PopoverConstraint widthConstraint = PopoverConstraint.flexible, PopoverConstraint heightConstraint = PopoverConstraint.flexible, Key? key, bool rootOverlay = true, bool modal = true, bool barrierDismissable = true, Clip clipBehavior = Clip.none, Object? regionGroupId, Offset? offset, AlignmentGeometry? transitionAlignment, EdgeInsetsGeometry? margin, bool follow = true, bool consumeOutsideTaps = true, ValueChanged? onTickFollow, bool allowInvertHorizontal = true, bool allowInvertVertical = true, bool dismissBackdropFocus = true, Duration? showDuration, Duration? dismissDuration, OverlayBarrier? overlayBarrier, LayerLink? layerLink}); } /// Full-screen variant of the dialog overlay handler. /// /// Similar to [DialogOverlayHandler] but specifically designed for full-screen /// modal presentations. Removes padding and adjusts styling to fill the entire /// screen while maintaining proper overlay management and animation behavior. /// /// Features: /// - Full-screen modal presentation /// - Edge-to-edge content display /// - Maintained overlay architecture /// - Proper animation handling /// - Theme inheritance /// /// Example: /// ```dart /// const FullScreenDialogOverlayHandler().show( /// context: context, /// alignment: Alignment.center, /// builder: (context) => FullScreenForm(), /// ); /// ``` class FullScreenDialogOverlayHandler extends OverlayHandler { /// Checks if the current context is within a dialog overlay. /// /// Returns `true` if the context is inside a dialog managed by /// this overlay handler. static bool isDialogOverlay(BuildContext context); /// Creates a [FullScreenDialogOverlayHandler]. /// /// Example: /// ```dart /// const FullScreenDialogOverlayHandler() /// ``` const FullScreenDialogOverlayHandler(); OverlayCompleter show({required BuildContext context, required AlignmentGeometry alignment, required WidgetBuilder builder, Offset? position, AlignmentGeometry? anchorAlignment, PopoverConstraint widthConstraint = PopoverConstraint.flexible, PopoverConstraint heightConstraint = PopoverConstraint.flexible, Key? key, bool rootOverlay = true, bool modal = true, bool barrierDismissable = true, Clip clipBehavior = Clip.none, Object? regionGroupId, Offset? offset, AlignmentGeometry? transitionAlignment, EdgeInsetsGeometry? margin, bool follow = true, bool consumeOutsideTaps = true, ValueChanged? onTickFollow, bool allowInvertHorizontal = true, bool allowInvertVertical = true, bool dismissBackdropFocus = true, Duration? showDuration, Duration? dismissDuration, OverlayBarrier? overlayBarrier, LayerLink? layerLink}); } /// Completer that manages the lifecycle of a dialog overlay. /// /// Provides control over dialog animations, completion status, and disposal. /// Wraps a [DialogRoute] to offer a consistent interface for managing /// dialog lifecycles through the overlay system. /// /// Features: /// - Animation state monitoring /// - Future-based completion handling /// - Proper resource disposal /// - Route management integration /// /// Example: /// ```dart /// final completer = DialogOverlayCompleter(dialogRoute); /// await completer.future; // Wait for dialog completion /// completer.remove(); // Programmatically close dialog /// ``` class DialogOverlayCompleter extends OverlayCompleter { /// The dialog route managed by this completer. DialogRoute route; /// Creates a [DialogOverlayCompleter]. /// /// Parameters: /// - [route] (`DialogRoute`, required): the dialog route to manage /// /// Example: /// ```dart /// DialogOverlayCompleter(myDialogRoute) /// ``` DialogOverlayCompleter(this.route); Future get animationFuture; void dispose(); Future get future; bool get isAnimationCompleted; bool get isCompleted; void remove(); } /// Theme configuration for drawer and sheet overlays. /// /// Defines visual properties for drawer and sheet components including /// surface effects, drag handles, and barrier appearance. /// /// Features: /// - Surface opacity and blur effects /// - Customizable barrier colors /// - Drag handle appearance control /// - Consistent theming across drawer types /// /// Example: /// ```dart /// ComponentThemeData( /// data: { /// DrawerTheme: DrawerTheme( /// surfaceOpacity: 0.9, /// barrierColor: Colors.black54, /// showDragHandle: true, /// ), /// }, /// child: MyApp(), /// ) /// ``` class DrawerTheme { /// Surface opacity for backdrop effects. double? surfaceOpacity; /// Surface blur intensity for backdrop effects. double? surfaceBlur; /// Color of the barrier behind the drawer. Color? barrierColor; /// Whether to display the drag handle for draggable drawers. bool? showDragHandle; /// Size of the drag handle when displayed. Size? dragHandleSize; /// Creates a [DrawerTheme]. /// /// All parameters are optional and will use system defaults when null. /// /// Parameters: /// - [surfaceOpacity] (double?, optional): opacity for backdrop surface effects /// - [surfaceBlur] (double?, optional): blur intensity for backdrop effects /// - [barrierColor] (Color?, optional): color of the modal barrier /// - [showDragHandle] (bool?, optional): whether to show drag handles /// - [dragHandleSize] (Size?, optional): size of the drag handle /// /// Example: /// ```dart /// const DrawerTheme( /// surfaceOpacity: 0.95, /// showDragHandle: true, /// barrierColor: Color.fromRGBO(0, 0, 0, 0.7), /// ) /// ``` const DrawerTheme({this.surfaceOpacity, this.surfaceBlur, this.barrierColor, this.showDragHandle, this.dragHandleSize}); /// Creates a copy of this theme with the given fields replaced. /// /// Parameters: /// - [surfaceOpacity] (`ValueGetter?`, optional): New surface opacity. /// - [surfaceBlur] (`ValueGetter?`, optional): New surface blur amount. /// - [barrierColor] (`ValueGetter?`, optional): New barrier color. /// - [showDragHandle] (`ValueGetter?`, optional): New show drag handle setting. /// - [dragHandleSize] (`ValueGetter?`, optional): New drag handle size. /// /// Returns: A new [DrawerTheme] with updated properties. DrawerTheme copyWith({ValueGetter? surfaceOpacity, ValueGetter? surfaceBlur, ValueGetter? barrierColor, ValueGetter? showDragHandle, ValueGetter? dragHandleSize}); bool operator ==(Object other); int get hashCode; String toString(); } /// Opens a drawer overlay with comprehensive customization options. /// /// Creates a modal drawer that slides in from the specified position with /// draggable interaction, backdrop transformation, and proper theme integration. /// Returns a completer that can be used to control the drawer lifecycle. /// /// Features: /// - Configurable slide-in positions (left, right, top, bottom) /// - Draggable interaction with gesture support /// - Backdrop transformation and scaling effects /// - Safe area handling and proper theming /// - Dismissible barriers and custom backdrop builders /// /// Parameters: /// - [context] (BuildContext, required): build context for overlay creation /// - [builder] (WidgetBuilder, required): function that builds drawer content /// - [position] (OverlayPosition, required): side from which drawer slides in /// - [expands] (bool, default: false): whether drawer should expand to fill available space /// - [draggable] (bool, default: true): whether drawer can be dragged to dismiss /// - [barrierDismissible] (bool, default: true): whether tapping barrier dismisses drawer /// - [backdropBuilder] (WidgetBuilder?, optional): custom backdrop builder /// - [useSafeArea] (bool, default: true): whether to respect device safe areas /// - [showDragHandle] (bool?, optional): whether to show drag handle /// - [borderRadius] (BorderRadiusGeometry?, optional): corner radius for drawer /// - [dragHandleSize] (Size?, optional): size of the drag handle /// - [transformBackdrop] (bool, default: true): whether to scale backdrop /// - [surfaceOpacity] (double?, optional): opacity for surface effects /// - [surfaceBlur] (double?, optional): blur intensity for surface effects /// - [barrierColor] (Color?, optional): color of the modal barrier /// - [animationController] (AnimationController?, optional): custom animation controller /// - [autoOpen] (bool, default: true): whether to automatically open on creation /// - [constraints] (BoxConstraints?, optional): size constraints for drawer /// - [alignment] (AlignmentGeometry?, optional): alignment within constraints /// /// Returns: /// A [DrawerOverlayCompleter] that provides control over the drawer lifecycle. /// /// Example: /// ```dart /// final completer = openDrawerOverlay( /// context: context, /// position: OverlayPosition.left, /// builder: (context) => DrawerContent(), /// draggable: true, /// barrierDismissible: true, /// ); /// final result = await completer.future; /// ``` DrawerOverlayCompleter openDrawerOverlay({required BuildContext context, required WidgetBuilder builder, required OverlayPosition position, bool expands = false, bool draggable = true, bool barrierDismissible = true, WidgetBuilder? backdropBuilder, bool useSafeArea = true, bool? showDragHandle, BorderRadiusGeometry? borderRadius, Size? dragHandleSize, bool transformBackdrop = true, double? surfaceOpacity, double? surfaceBlur, Color? barrierColor, AnimationController? animationController, bool autoOpen = true, BoxConstraints? constraints, AlignmentGeometry? alignment}); /// Opens a sheet overlay with minimal styling and full-screen expansion. /// /// Creates a sheet overlay that slides in from the specified position, /// typically used for bottom sheets or side panels. Unlike drawers, /// sheets don't transform the backdrop and have minimal decoration. /// /// Features: /// - Full-screen expansion with edge-to-edge content /// - Minimal styling and decoration /// - Optional drag interaction /// - Safe area integration /// - Barrier dismissal support /// /// Parameters: /// - [context] (BuildContext, required): build context for overlay creation /// - [builder] (WidgetBuilder, required): function that builds sheet content /// - [position] (OverlayPosition, required): side from which sheet slides in /// - [barrierDismissible] (bool, default: true): whether tapping barrier dismisses sheet /// - [transformBackdrop] (bool, default: false): whether to transform backdrop /// - [backdropBuilder] (WidgetBuilder?, optional): custom backdrop builder /// - [barrierColor] (Color?, optional): color of the modal barrier /// - [draggable] (bool, default: false): whether sheet can be dragged to dismiss /// - [animationController] (AnimationController?, optional): custom animation controller /// - [autoOpen] (bool, default: true): whether to automatically open on creation /// - [constraints] (BoxConstraints?, optional): size constraints for sheet /// - [alignment] (AlignmentGeometry?, optional): alignment within constraints /// /// Returns: /// A [DrawerOverlayCompleter] that provides control over the sheet lifecycle. /// /// Example: /// ```dart /// final completer = openSheetOverlay( /// context: context, /// position: OverlayPosition.bottom, /// builder: (context) => BottomSheetContent(), /// draggable: true, /// ); /// ``` DrawerOverlayCompleter openSheetOverlay({required BuildContext context, required WidgetBuilder builder, required OverlayPosition position, bool barrierDismissible = true, bool transformBackdrop = false, WidgetBuilder? backdropBuilder, Color? barrierColor, bool draggable = false, AnimationController? animationController, bool autoOpen = true, BoxConstraints? constraints, AlignmentGeometry? alignment}); /// Opens a drawer and returns a future that completes when dismissed. /// /// Convenience function that opens a drawer overlay and returns the future /// directly, suitable for use with async/await patterns. /// /// Returns: /// A [Future] that completes with the result when the drawer is dismissed. /// /// Example: /// ```dart /// final result = await openDrawer( /// context: context, /// position: OverlayPosition.left, /// builder: (context) => MyDrawerContent(), /// ); /// ``` Future openDrawer({required BuildContext context, required WidgetBuilder builder, required OverlayPosition position, bool expands = false, bool draggable = true, bool barrierDismissible = true, WidgetBuilder? backdropBuilder, bool useSafeArea = true, bool? showDragHandle, BorderRadiusGeometry? borderRadius, Size? dragHandleSize, bool transformBackdrop = true, double? surfaceOpacity, double? surfaceBlur, Color? barrierColor, AnimationController? animationController, BoxConstraints? constraints, AlignmentGeometry? alignment}); /// Opens a sheet and returns a future that completes when dismissed. /// /// Convenience function that opens a sheet overlay and returns the future /// directly, suitable for use with async/await patterns. /// /// Returns: /// A [Future] that completes with the result when the sheet is dismissed. /// /// Example: /// ```dart /// final accepted = await openSheet( /// context: context, /// position: OverlayPosition.bottom, /// builder: (context) => ConfirmationSheet(), /// ); /// ``` Future openSheet({required BuildContext context, required WidgetBuilder builder, required OverlayPosition position, bool barrierDismissible = true, bool transformBackdrop = false, Color? barrierColor, bool draggable = false, AnimationController? animationController, WidgetBuilder? backdropBuilder, BoxConstraints? constraints, AlignmentGeometry? alignment}); /// Internal wrapper widget for drawer/sheet rendering. /// /// Manages the visual presentation and interaction behavior of drawer overlays. /// Handles sizing, positioning, drag interactions, and animations. class DrawerWrapper extends StatefulWidget { /// Position of the drawer on screen. OverlayPosition position; /// Content widget displayed in the drawer. Widget child; /// Whether the drawer expands to fill available space. bool expands; /// Whether the drawer can be dragged to resize or dismiss. bool draggable; /// Additional size beyond the content size. Size extraSize; /// Size of the drawer. Size size; /// Whether to show the drag handle. bool showDragHandle; /// Border radius for the drawer. BorderRadiusGeometry? borderRadius; /// Size of the drag handle. Size? dragHandleSize; /// Internal padding of the drawer content. EdgeInsets padding; /// Surface opacity for the drawer background. double? surfaceOpacity; /// Surface blur amount for the drawer background. double? surfaceBlur; /// Color of the barrier behind the drawer. Color? barrierColor; /// Z-index for stacking multiple drawers. int stackIndex; /// Gap before the drag handle. double? gapBeforeDragger; /// Gap after the drag handle. double? gapAfterDragger; /// Optional animation controller for custom animations. AnimationController? animationController; /// Size constraints for the drawer. BoxConstraints? constraints; /// Alignment of the drawer content. AlignmentGeometry? alignment; /// Creates a [DrawerWrapper]. const DrawerWrapper({super.key, required this.position, required this.child, this.expands = false, this.draggable = true, this.extraSize = Size.zero, required this.size, this.showDragHandle = true, this.borderRadius, this.dragHandleSize, this.padding = EdgeInsets.zero, this.surfaceOpacity, this.surfaceBlur, this.barrierColor, this.gapBeforeDragger, this.gapAfterDragger, required this.stackIndex, this.animationController, this.constraints, this.alignment}); State createState(); } /// Closes the currently open sheet overlay. /// /// Dismisses the active sheet by closing the drawer. Sheets are drawers /// without backdrop transformation. /// /// Parameters: /// - [context] (`BuildContext`, required): Build context. /// /// Returns: `Future` that completes when sheet is closed. Future closeSheet(BuildContext context); /// Wrapper widget for sheet overlays. /// /// Extends [DrawerWrapper] with sheet-specific defaults (no drag, no expansion). /// Sheets are simplified drawers without backdrop transformation. class SheetWrapper extends DrawerWrapper { /// Creates a [SheetWrapper]. const SheetWrapper({super.key, required super.position, required super.child, required super.size, required super.stackIndex, super.draggable = false, super.expands = false, super.extraSize = Size.zero, super.padding, super.surfaceBlur, super.surfaceOpacity, super.barrierColor, super.gapBeforeDragger, super.gapAfterDragger, super.constraints, super.alignment}); State createState(); } /// Position for overlay components like drawers and sheets. enum OverlayPosition { left, right, top, bottom, start, end } /// Scale factor for backdrop transform when drawer is open. /// /// Constant value of 0.95 creates a subtle zoom-out effect on the /// background content when overlays appear. const kBackdropScaleDown = 0.95; /// Data class containing backdrop transformation information. /// /// Holds the size difference needed to scale and position backdrop /// content when overlays are displayed. class BackdropTransformData { /// The difference in size between original and transformed backdrop. Size sizeDifference; /// Creates backdrop transform data. /// /// Parameters: /// - [sizeDifference] (Size, required): Size difference for transform BackdropTransformData(this.sizeDifference); } /// Opens a raw drawer overlay with full customization. /// /// Low-level function for creating custom drawer overlays. Provides complete /// control over drawer positioning, appearance, and behavior. /// /// Parameters: /// - [key] (`Key?`, optional): Widget key. /// - [context] (`BuildContext`, required): Build context. /// - [builder] (`DrawerBuilder`, required): Drawer content builder. /// - [position] (`OverlayPosition`, required): Drawer position on screen. /// - [transformBackdrop] (`bool`, default: `true`): Whether to transform backdrop. /// - [useRootDrawerOverlay] (`bool`, default: `true`): Use root overlay. /// - [modal] (`bool`, default: `true`): Whether drawer is modal. /// - [barrierColor] (`Color?`, optional): Barrier color. /// - [barrierDismissible] (`bool`, default: `true`): Dismissible by tapping barrier. /// - [backdropBuilder] (`WidgetBuilder?`, optional): Custom backdrop builder. /// - [useSafeArea] (`bool`, default: `true`): Respect safe area. /// - [animationController] (`AnimationController?`, optional): Custom animation. /// - [autoOpen] (`bool`, default: `true`): Auto-open on creation. /// - [constraints] (`BoxConstraints?`, optional): Size constraints. /// - [alignment] (`AlignmentGeometry?`, optional): Content alignment. /// /// Returns: `DrawerOverlayCompleter` for managing the drawer lifecycle. DrawerOverlayCompleter openRawDrawer({Key? key, required BuildContext context, required DrawerBuilder builder, required OverlayPosition position, bool transformBackdrop = true, bool useRootDrawerOverlay = true, bool modal = true, Color? barrierColor, bool barrierDismissible = true, WidgetBuilder? backdropBuilder, bool useSafeArea = true, AnimationController? animationController, bool autoOpen = true, BoxConstraints? constraints, AlignmentGeometry? alignment}); /// Closes the currently open drawer overlay. /// /// Dismisses the active drawer from the overlay stack. Optionally returns /// a result value to the code that opened the drawer. /// /// Parameters: /// - [context] (`BuildContext`, required): Build context from within the drawer. /// - [result] (`T?`, optional): Optional result to return. /// /// Returns: `Future` that completes when drawer is closed. Future closeDrawer(BuildContext context, [T? result]); /// Data class representing a drawer overlay layer in the hierarchy. /// /// Tracks the drawer overlay state and its parent layer, enabling nested /// drawer management and size computation across the layer stack. class DrawerLayerData { /// The drawer overlay state for this layer. DrawerOverlayState overlay; /// The parent drawer layer, null if this is the root layer. DrawerLayerData? parent; /// Creates drawer layer data. /// /// Parameters: /// - [overlay] (DrawerOverlayState, required): Overlay state for this layer /// - [parent] (DrawerLayerData?): Parent layer in the hierarchy const DrawerLayerData(this.overlay, this.parent); /// Computes the size of this drawer layer. /// /// Delegates to the overlay state to calculate the layer dimensions. /// /// Returns the computed size or null if not available. Size? computeSize(); bool operator ==(Object other); int get hashCode; } /// Widget that manages drawer overlay layers. /// /// Provides a container for drawer overlays, managing their lifecycle and /// hierarchical relationships. Supports nested drawers through layer data /// propagation. /// /// Example: /// ```dart /// DrawerOverlay( /// child: MyAppContent(), /// ) /// ``` class DrawerOverlay extends StatefulWidget { /// Child widget displayed under the overlay layer. Widget child; /// Creates a drawer overlay. /// /// Parameters: /// - [child] (Widget, required): Content widget const DrawerOverlay({super.key, required this.child}); State createState(); /// Finds the drawer layer data from the widget tree. /// /// Searches up the widget tree for the nearest [DrawerLayerData]. /// Optionally navigates to the root layer if [root] is true. /// /// Parameters: /// - [context] (BuildContext, required): Build context /// - [root] (bool): Whether to find root layer, defaults to false /// /// Returns [DrawerLayerData] or null if not found. static DrawerLayerData? maybeFind(BuildContext context, [bool root = false]); /// Finds the drawer layer data using messenger lookup. /// /// Similar to [maybeFind] but uses the messenger mechanism for lookup. /// Optionally navigates to the root layer if [root] is true. /// /// Parameters: /// - [context] (BuildContext, required): Build context /// - [root] (bool): Whether to find root layer, defaults to false /// /// Returns [DrawerLayerData] or null if not found. static DrawerLayerData? maybeFindMessenger(BuildContext context, [bool root = false]); } /// State class for [DrawerOverlay] managing drawer entry lifecycle. /// /// Manages the stack of active drawer overlays, handling their addition, /// removal, and size computation. Maintains a backdrop key for managing /// backdrop transformations. class DrawerOverlayState extends State { /// Key for the backdrop widget to enable transformations. GlobalKey backdropKey; /// Adds a drawer overlay entry to the list of active entries. /// /// Updates the widget state to include the new entry, triggering a rebuild /// to display the drawer overlay. /// /// Parameters: /// - [entry] (`DrawerOverlayEntry`, required): The drawer entry to add. /// /// Example: /// ```dart /// final entry = DrawerOverlayEntry( /// builder: (context) => MyDrawerContent(), /// ); /// drawerState.addEntry(entry); /// ``` void addEntry(DrawerOverlayEntry entry); /// Computes the size of the drawer overlay area. /// /// Returns the size of the overlay's render box. Used for positioning /// and sizing drawer content. /// /// Throws [AssertionError] if overlay is not ready (no size available). /// /// Returns [Size] of the overlay area. Size computeSize(); /// Removes a drawer entry from the overlay stack. /// /// Triggers a rebuild to update the overlay display after removing /// the specified entry. /// /// Parameters: /// - [entry] (DrawerOverlayEntry, required): Entry to remove void removeEntry(DrawerOverlayEntry entry); Widget build(BuildContext context); } /// Widget representing a single drawer entry in the overlay stack. /// /// Manages the lifecycle and rendering of an individual drawer overlay, /// including its backdrop, barrier, and animated transitions. class DrawerEntryWidget extends StatefulWidget { /// Builder function for the drawer content. DrawerBuilder builder; /// Backdrop widget (content behind the drawer). Widget backdrop; /// Builder for transforming the backdrop. BackdropBuilder backdropBuilder; /// Builder for the modal barrier. BarrierBuilder barrierBuilder; /// Whether the drawer is modal (blocks interaction with backdrop). bool modal; /// Captured theme data to apply within the drawer. CapturedThemes? themes; /// Captured inherited data to propagate. CapturedData? data; /// Completer for the drawer's result value. Completer completer; /// Position of the drawer (left, right, top, bottom, start, end). OverlayPosition position; /// Index of this drawer in the stack. int stackIndex; /// Total number of drawers in the stack. int totalStack; /// Whether to apply safe area insets. bool useSafeArea; /// Optional external animation controller. AnimationController? animationController; /// Whether to automatically open on mount. bool autoOpen; /// Creates a drawer entry widget. const DrawerEntryWidget({super.key, required this.builder, required this.backdrop, required this.backdropBuilder, required this.barrierBuilder, required this.modal, required this.themes, required this.completer, required this.position, required this.stackIndex, required this.totalStack, required this.data, required this.useSafeArea, required this.animationController, required this.autoOpen}); State> createState(); } /// State class for [DrawerEntryWidget] managing drawer animations and lifecycle. /// /// Handles animation control, focus management, and drawer dismissal. /// Manages both internal and external animation controllers. class DrawerEntryWidgetState extends State> with SingleTickerProviderStateMixin { /// Notifier for additional offset applied during drag gestures. ValueNotifier additionalOffset; void initState(); void dispose(); void didUpdateWidget(covariant DrawerEntryWidget oldWidget); /// Closes the drawer with an optional result value. /// /// Animates the drawer out using an ease-out cubic curve, then completes /// the completer with the provided result. /// /// Parameters: /// - [result] (T?): Optional result to return when drawer closes /// /// Returns a [Future] that completes when the close animation finishes. Future close([T? result]); Widget build(BuildContext context); } /// Data class representing a drawer overlay entry in the stack. /// /// Encapsulates all configuration and state needed to render a single /// drawer overlay, including builders, animation, theming, and positioning. class DrawerOverlayEntry { /// Key for accessing the drawer entry widget state. GlobalKey> key; /// Builder for backdrop transformations. BackdropBuilder backdropBuilder; /// Builder for drawer content. DrawerBuilder builder; /// Whether the drawer is modal. bool modal; /// Builder for the modal barrier. BarrierBuilder barrierBuilder; /// Captured theme data. CapturedThemes? themes; /// Captured inherited data. CapturedData? data; /// Completer for the drawer result. Completer completer; /// Position of the drawer. OverlayPosition position; /// Whether tapping the barrier dismisses the drawer. bool barrierDismissible; /// Whether to apply safe area insets. bool useSafeArea; /// Optional external animation controller. AnimationController? animationController; /// Whether to automatically open on mount. bool autoOpen; /// Size constraints for the drawer. BoxConstraints? constraints; /// Alignment of the drawer content. AlignmentGeometry? alignment; /// Creates a drawer overlay entry. DrawerOverlayEntry({required this.builder, required this.backdropBuilder, required this.modal, required this.barrierBuilder, required this.themes, required this.completer, required this.position, required this.data, required this.barrierDismissible, required this.useSafeArea, required this.animationController, required this.autoOpen, required this.constraints, required this.alignment}); } /// Completer for drawer overlay operations. /// /// Wraps a [DrawerOverlayEntry] to provide overlay lifecycle management, /// including animation tracking and dismissal handling. class DrawerOverlayCompleter extends OverlayCompleter { /// Creates a drawer overlay completer. /// /// Parameters: /// - [_entry] (`DrawerOverlayEntry`, required): The drawer entry to manage DrawerOverlayCompleter(this._entry); Future get animationFuture; void dispose(); /// Gets the animation controller for the drawer. /// /// Returns the external animation controller if provided, otherwise /// returns the internal controller from the drawer entry widget state. /// /// Returns [AnimationController] or null if not available. AnimationController? get animationController; Future get future; bool get isAnimationCompleted; bool get isCompleted; void remove(); } /// Overlay handler specialized for sheet-style overlays. /// /// Provides a simplified API for showing sheet overlays (bottom sheets, /// side sheets, etc.) with standard positioning and barrier behavior. class SheetOverlayHandler extends OverlayHandler { /// Checks if the current context is within a sheet overlay. /// /// Parameters: /// - [context] (BuildContext, required): Build context to check /// /// Returns true if context is within a sheet overlay, false otherwise. static bool isSheetOverlay(BuildContext context); /// Position where the sheet appears. OverlayPosition position; /// Optional barrier color for the modal backdrop. Color? barrierColor; /// Creates a sheet overlay handler. /// /// Parameters: /// - [position] (OverlayPosition): Sheet position, defaults to bottom /// - [barrierColor] (Color?): Optional barrier color const SheetOverlayHandler({this.position = OverlayPosition.bottom, this.barrierColor}); bool operator ==(Object other); int get hashCode; OverlayCompleter show({required BuildContext context, required AlignmentGeometry alignment, required WidgetBuilder builder, Offset? position, AlignmentGeometry? anchorAlignment, PopoverConstraint widthConstraint = PopoverConstraint.flexible, PopoverConstraint heightConstraint = PopoverConstraint.flexible, Key? key, bool rootOverlay = true, bool modal = true, bool barrierDismissable = true, Clip clipBehavior = Clip.none, Object? regionGroupId, Offset? offset, AlignmentGeometry? transitionAlignment, EdgeInsetsGeometry? margin, bool follow = true, bool consumeOutsideTaps = true, ValueChanged? onTickFollow, bool allowInvertHorizontal = true, bool allowInvertVertical = true, bool dismissBackdropFocus = true, Duration? showDuration, Duration? dismissDuration, OverlayBarrier? overlayBarrier, LayerLink? layerLink}); } /// A versatile animated widget that smoothly transitions between values. /// /// [AnimatedValueBuilder] provides three different construction modes to handle /// various animation requirements: /// - Default constructor: Uses a simple value-based builder /// - [AnimatedValueBuilder.animation]: Provides direct Animation access /// - [AnimatedValueBuilder.raw]: Gives raw interpolation control /// /// The widget automatically handles animation lifecycle, including proper disposal /// of resources and smooth transitions when the target value changes during animation. /// It supports custom interpolation functions via the [lerp] parameter for complex /// data types that don't support standard numeric interpolation. /// /// Example: /// ```dart /// AnimatedValueBuilder( /// value: _targetOpacity, /// duration: Duration(milliseconds: 300), /// curve: Curves.easeInOut, /// builder: (context, opacity, child) { /// return Opacity( /// opacity: opacity, /// child: Text('Fading Text'), /// ); /// }, /// ); /// ``` class AnimatedValueBuilder extends StatefulWidget { /// The initial value to start animation from. /// /// If null, animation starts from [value] with no initial transition. /// When provided, the widget will animate from this value to [value] on first build. T? initialValue; /// The target value to animate to. /// /// When this changes, the widget automatically starts a new animation from the /// current animated value to this new target value. T value; /// The duration of the animation transition. /// /// This determines how long it takes to animate from the starting value to the /// target value. Changing this during an active animation will affect the /// remaining animation time. Duration duration; /// Builder callback for value-based animation (default constructor). /// /// Called with the current interpolated value and optional child widget. /// Only used when constructed with the default constructor. AnimatedChildBuilder? builder; /// Builder callback for animation-based construction. /// /// Provides direct access to the underlying Animation object for advanced use cases. /// Only used when constructed with [AnimatedValueBuilder.animation]. AnimationBuilder? animationBuilder; /// Builder callback for raw interpolation control. /// /// Called with old value, new value, interpolation progress (0.0-1.0), and child. /// Only used when constructed with [AnimatedValueBuilder.raw]. AnimatedChildValueBuilder? rawBuilder; /// Called when the animation completes. /// /// Receives the final target value as a parameter. Useful for triggering /// additional actions or state changes when the animation finishes. void Function(T value)? onEnd; /// The animation curve to use for interpolation. /// /// Controls the rate of change during animation. Defaults to [Curves.linear]. /// Common curves include [Curves.easeInOut], [Curves.bounceIn], etc. Curve curve; /// Custom interpolation function for complex types. /// /// Required for types that don't support standard numeric interpolation. /// The function receives start value [a], end value [b], and progress [t] (0.0-1.0). /// Must return the interpolated value at progress [t]. T Function(T a, T b, double t)? lerp; /// Optional child widget passed to the builder. /// /// Useful for optimization when part of the widget tree doesn't change /// during animation. The child is passed to the builder callback. Widget? child; /// Creates an [AnimatedValueBuilder] with value-based animation. /// /// This is the standard constructor that animates between values using a simple /// builder callback. The builder receives the current interpolated value and /// can construct the appropriate widget tree. /// /// Parameters: /// - [initialValue] (T?, optional): Starting value for animation. If null, no initial animation occurs. /// - [value] (T, required): Target value to animate to. /// - [duration] (Duration, required): Animation duration. /// - [builder] (`AnimatedChildBuilder`, required): Builds widget from animated value. /// - [onEnd] (Function?, optional): Called when animation completes. /// - [curve] (Curve, default: Curves.linear): Animation timing curve. /// - [lerp] (Function?, optional): Custom interpolation for complex types. /// - [child] (Widget?, optional): Optional child passed to builder. /// /// Example: /// ```dart /// AnimatedValueBuilder( /// initialValue: 0.0, /// value: 1.0, /// duration: Duration(milliseconds: 500), /// curve: Curves.easeInOut, /// builder: (context, opacity, child) => Opacity( /// opacity: opacity, /// child: Text('Hello World'), /// ), /// ); /// ``` const AnimatedValueBuilder({super.key, this.initialValue, required this.value, required this.duration, required AnimatedChildBuilder this.builder, this.onEnd, this.curve = Curves.linear, this.lerp, this.child}); /// Creates an [AnimatedValueBuilder] with direct Animation access. /// /// This constructor provides the underlying [Animation] object directly to the /// builder, allowing for advanced animation control and multiple listeners. /// Useful when you need access to animation status or want to drive multiple /// animated properties from a single animation. /// /// Parameters: /// - [initialValue] (T?, optional): Starting value for animation. /// - [value] (T, required): Target value to animate to. /// - [duration] (Duration, required): Animation duration. /// - [builder] (`AnimationBuilder`, required): Builds widget from Animation object. /// - [onEnd] (Function?, optional): Called when animation completes. /// - [curve] (Curve, default: Curves.linear): Animation timing curve. /// - [lerp] (Function?, optional): Custom interpolation function. /// /// Example: /// ```dart /// AnimatedValueBuilder.animation( /// value: Colors.blue, /// duration: Duration(seconds: 1), /// builder: (context, animation) => AnimatedBuilder( /// animation: animation, /// builder: (context, child) => Container( /// color: animation.value, /// child: Text('Color transition'), /// ), /// ), /// ); /// ``` const AnimatedValueBuilder.animation({super.key, this.initialValue, required this.value, required this.duration, required AnimationBuilder builder, this.onEnd, this.curve = Curves.linear, this.lerp}); /// Creates an [AnimatedValueBuilder] with raw interpolation control. /// /// This constructor provides maximum control over the animation by exposing /// the old value, new value, and current interpolation progress. This is /// useful for custom transition effects or when you need to implement /// complex interpolation logic. /// /// Parameters: /// - [initialValue] (T?, optional): Starting value for animation. /// - [value] (T, required): Target value to animate to. /// - [duration] (Duration, required): Animation duration. /// - [builder] (`AnimatedChildValueBuilder`, required): Builds widget with raw interpolation data. /// - [onEnd] (Function?, optional): Called when animation completes. /// - [curve] (Curve, default: Curves.linear): Animation timing curve. /// - [child] (Widget?, optional): Optional child passed to builder. /// - [lerp] (Function?, optional): Custom interpolation function. /// /// Example: /// ```dart /// AnimatedValueBuilder.raw( /// value: Offset(100, 100), /// duration: Duration(milliseconds: 300), /// builder: (context, oldPos, newPos, progress, child) { /// return Transform.translate( /// offset: Offset.lerp(oldPos, newPos, progress)!, /// child: child, /// ); /// }, /// child: Icon(Icons.star), /// ); /// ``` const AnimatedValueBuilder.raw({super.key, this.initialValue, required this.value, required this.duration, required AnimatedChildValueBuilder builder, this.onEnd, this.curve = Curves.linear, this.child, this.lerp}); State createState(); } /// State class for [AnimatedValueBuilder] that manages the animation lifecycle. /// /// This state class handles: /// - Creating and disposing animation controllers /// - Managing curved animations /// - Driving value interpolation /// - Responding to value changes and rebuilding accordingly /// /// ## Type Parameters /// /// * [T] - The type of value being animated. /// /// ## Overview /// /// You typically don't interact with this class directly. It's created automatically /// by the [AnimatedValueBuilder] widget and manages all animation details internally. class AnimatedValueBuilderState extends State> with SingleTickerProviderStateMixin { void initState(); /// Interpolates between two values using the widget's lerp function or default. /// /// ## Parameters /// /// * [a] - The starting value. /// * [b] - The ending value. /// * [t] - The interpolation factor (0.0 to 1.0). /// /// ## Returns /// /// The interpolated value of type [T]. /// /// ## Notes /// /// If [widget.lerp] is provided, it's used for interpolation. Otherwise, the /// method attempts dynamic arithmetic interpolation. If the type doesn't support /// arithmetic operations, an exception is thrown with helpful guidance. T lerpedValue(T a, T b, double t); void didUpdateWidget(AnimatedValueBuilder oldWidget); void dispose(); Widget build(BuildContext context); } /// Defines how a repeated animation should behave when it reaches completion. /// /// Used by [RepeatedAnimationBuilder] to control animation looping behavior. /// Each mode provides different patterns of repetition suitable for various /// visual effects and UI animations. enum RepeatMode { repeat, reverse, pingPong, pingPongReverse } /// An animated widget that continuously repeats an animation between two values. /// /// [RepeatedAnimationBuilder] provides automatic looping animations with various /// repeat modes including forward-only, reverse-only, and ping-pong patterns. /// Unlike [AnimatedValueBuilder], this widget is designed for continuous motion /// and doesn't stop at a target value. /// /// The widget supports different repeat modes via [RepeatMode]: /// - [RepeatMode.repeat]: Continuous forward animation with instant reset /// - [RepeatMode.reverse]: Continuous reverse animation /// - [RepeatMode.pingPong]: Smooth back-and-forth animation /// - [RepeatMode.pingPongReverse]: Ping-pong starting in reverse /// /// Animation can be paused and resumed using the [play] parameter, and supports /// different durations for forward and reverse directions when using ping-pong modes. /// /// Example: /// ```dart /// RepeatedAnimationBuilder( /// start: 0.0, /// end: 1.0, /// duration: Duration(seconds: 2), /// mode: RepeatMode.pingPong, /// builder: (context, value, child) { /// return Opacity( /// opacity: value, /// child: Icon(Icons.favorite, size: 50), /// ); /// }, /// ); /// ``` class RepeatedAnimationBuilder extends StatefulWidget { /// The starting value for the animation. /// /// This is the value the animation begins with in forward mode or ends with /// in reverse mode. For ping-pong modes, this represents one extreme of the oscillation. T start; /// The ending value for the animation. /// /// This is the value the animation reaches in forward mode or starts from /// in reverse mode. For ping-pong modes, this represents the other extreme of the oscillation. T end; /// The duration for the primary animation direction. /// /// For forward and reverse modes, this is the complete cycle duration. /// For ping-pong modes, this is the duration of the forward portion of each cycle. Duration duration; /// The duration for the reverse direction in ping-pong modes. /// /// If null, uses [duration] for both directions. Only affects ping-pong modes /// where you want asymmetric timing between forward and reverse motions. Duration? reverseDuration; /// The easing curve for the primary animation direction. /// /// Controls how the animation progresses over time. Defaults to [Curves.linear]. Curve curve; /// The easing curve for the reverse direction in ping-pong modes. /// /// If null, uses [curve] for both directions. Allows different easing /// for forward and reverse portions of ping-pong animations. Curve? reverseCurve; /// The repeat mode determining animation behavior. /// /// Controls whether animation repeats forward, reverse, or alternates directions. /// See [RepeatMode] for available options. Defaults to [RepeatMode.repeat]. RepeatMode mode; /// Builder callback for value-based repeated animation. /// /// Called with the current animated value and optional child widget. /// Used with the default constructor for standard value-based building. Widget Function(BuildContext context, T value, Widget? child)? builder; /// Builder callback for animation-based construction. /// /// Provides direct access to the underlying Animation object for advanced control. /// Used with [RepeatedAnimationBuilder.animation] constructor. Widget Function(BuildContext context, Animation animation)? animationBuilder; /// Optional child widget passed to the builder. /// /// Useful for optimization when part of the widget tree remains constant /// during animation. The child is passed through to the builder callback. Widget? child; /// Custom interpolation function for complex data types. /// /// Required for types that don't support standard numeric interpolation. /// Receives start value [a], end value [b], and progress [t] (0.0-1.0). T Function(T a, T b, double t)? lerp; /// Whether the animation should be playing. /// /// When true, the animation runs continuously according to [mode]. /// When false, the animation pauses at its current position. Defaults to true. bool play; /// Creates a [RepeatedAnimationBuilder] with value-based animation. /// /// This constructor provides a simple builder that receives the current animated /// value. The animation repeats continuously according to the specified [mode] /// and can be paused/resumed with the [play] parameter. /// /// Parameters: /// - [start] (T, required): Starting value of the animation range. /// - [end] (T, required): Ending value of the animation range. /// - [duration] (Duration, required): Duration for primary animation direction. /// - [curve] (Curve, default: Curves.linear): Easing curve for animation. /// - [reverseCurve] (Curve?, optional): Curve for reverse direction in ping-pong modes. /// - [mode] (RepeatMode, default: RepeatMode.repeat): Animation repeat behavior. /// - [builder] (Function, required): Builds widget from animated value. /// - [child] (Widget?, optional): Optional child passed to builder. /// - [lerp] (Function?, optional): Custom interpolation for complex types. /// - [play] (bool, default: true): Whether animation should be playing. /// - [reverseDuration] (Duration?, optional): Duration for reverse direction. /// /// Example: /// ```dart /// RepeatedAnimationBuilder( /// start: 0.5, /// end: 1.5, /// duration: Duration(seconds: 1), /// mode: RepeatMode.pingPong, /// curve: Curves.easeInOut, /// builder: (context, scale, child) => Transform.scale( /// scale: scale, /// child: Icon(Icons.heart, color: Colors.red), /// ), /// ); /// ``` const RepeatedAnimationBuilder({super.key, required this.start, required this.end, required this.duration, this.curve = Curves.linear, this.reverseCurve, this.mode = RepeatMode.repeat, required this.builder, this.child, this.lerp, this.play = true, this.reverseDuration}); /// Creates a [RepeatedAnimationBuilder] with direct Animation access. /// /// This constructor provides the underlying [Animation] object directly, /// allowing for advanced animation control and the ability to drive multiple /// animated properties from a single repeated animation. /// /// Parameters: /// - [start] (T, required): Starting value of the animation range. /// - [end] (T, required): Ending value of the animation range. /// - [duration] (Duration, required): Duration for primary animation direction. /// - [curve] (Curve, default: Curves.linear): Easing curve for animation. /// - [reverseCurve] (Curve?, optional): Curve for reverse direction in ping-pong modes. /// - [mode] (RepeatMode, default: RepeatMode.repeat): Animation repeat behavior. /// - [animationBuilder] (Function, required): Builds widget from Animation object. /// - [child] (Widget?, optional): Optional child passed to builder. /// - [lerp] (Function?, optional): Custom interpolation for complex types. /// - [play] (bool, default: true): Whether animation should be playing. /// - [reverseDuration] (Duration?, optional): Duration for reverse direction. /// /// Example: /// ```dart /// RepeatedAnimationBuilder.animation( /// start: Colors.red, /// end: Colors.blue, /// duration: Duration(seconds: 3), /// mode: RepeatMode.pingPong, /// animationBuilder: (context, animation) => Container( /// width: 100, /// height: 100, /// decoration: BoxDecoration( /// color: animation.value, /// borderRadius: BorderRadius.circular(8), /// ), /// ), /// ); /// ``` const RepeatedAnimationBuilder.animation({super.key, required this.start, required this.end, required this.duration, this.curve = Curves.linear, this.reverseCurve, this.mode = RepeatMode.repeat, required this.animationBuilder, this.child, this.lerp, this.play = true, this.reverseDuration}); State> createState(); } /// A custom curve that creates time-based intervals within an animation duration. /// /// [IntervalDuration] allows you to create animations that start after a delay /// or end before the full duration completes, using actual [Duration] values /// instead of normalized progress values (0.0-1.0). /// /// This is particularly useful for staggered animations or when you need precise /// timing control based on real time intervals rather than animation progress percentages. /// /// Example: /// ```dart /// // Animation that starts after 500ms delay and ends 200ms early /// IntervalDuration( /// start: Duration(milliseconds: 500), /// end: Duration(milliseconds: 1800), // out of 2000ms total /// duration: Duration(milliseconds: 2000), /// curve: Curves.easeInOut, /// ); /// ``` class IntervalDuration extends Curve { /// The duration after which the animation should start. /// /// If null, animation starts immediately. When specified, the animation /// remains at progress 0.0 until this duration elapses within the total duration. Duration? start; /// The duration at which the animation should end. /// /// If null, animation continues until the full duration. When specified, /// the animation reaches progress 1.0 at this point and holds that value. Duration? end; /// The total duration of the animation timeline. /// /// This represents the complete animation duration within which the start /// and end intervals operate. Must be greater than both start and end durations. Duration duration; /// Optional curve to apply to the active portion of the animation. /// /// This curve is applied to the progress between start and end intervals, /// allowing for easing effects during the active animation period. Curve? curve; /// Creates an [IntervalDuration] curve with explicit timing intervals. /// /// Parameters: /// - [start] (Duration?, optional): When animation should begin within total duration. /// - [end] (Duration?, optional): When animation should complete within total duration. /// - [duration] (Duration, required): Total animation timeline duration. /// - [curve] (Curve?, optional): Easing curve for the active animation portion. /// /// Example: /// ```dart /// IntervalDuration( /// start: Duration(milliseconds: 300), /// end: Duration(milliseconds: 700), /// duration: Duration(seconds: 1), /// curve: Curves.easeOut, /// ); /// ``` const IntervalDuration({this.start, this.end, required this.duration, this.curve}); /// Creates an [IntervalDuration] with delay-based timing. /// /// This factory constructor makes it easier to specify delays from the start /// and end of the animation rather than absolute timing positions. /// /// Parameters: /// - [startDelay] (Duration?, optional): Delay before animation starts. /// - [endDelay] (Duration?, optional): How much earlier animation should end. /// - [duration] (Duration, required): Base animation duration. /// /// The total timeline duration becomes [duration] + [startDelay] + [endDelay]. /// /// Example: /// ```dart /// // Animation with 200ms start delay and ending 100ms early /// IntervalDuration.delayed( /// startDelay: Duration(milliseconds: 200), /// endDelay: Duration(milliseconds: 100), /// duration: Duration(seconds: 1), /// ); /// ``` factory IntervalDuration.delayed({Duration? startDelay, Duration? endDelay, required Duration duration}); double transform(double t); } /// A widget that smoothly transitions between different child widgets. /// /// [CrossFadedTransition] automatically detects when its child widget changes /// and performs a smooth transition animation between the old and new child. /// It uses [AnimatedSize] to handle size changes and provides different /// interpolation strategies via the [lerp] parameter. /// /// The widget is particularly useful for content that changes dynamically, /// such as switching between different states of a UI component or fading /// between different pieces of text or imagery. /// /// Built-in lerp functions: /// - [lerpOpacity]: Cross-fades using opacity (default) /// - [lerpStep]: Instant transition without fade effect /// /// Example: /// ```dart /// CrossFadedTransition( /// duration: Duration(milliseconds: 300), /// child: _showFirst /// ? Text('First Text', key: ValueKey('first')) /// : Icon(Icons.star, key: ValueKey('second')), /// ); /// ``` class CrossFadedTransition extends StatefulWidget { /// Creates a smooth opacity-based transition between two widgets. /// /// This lerp function implements a cross-fade effect where the first widget /// fades out during the first half of the transition (t: 0.0-0.5) while the /// second widget fades in during the second half (t: 0.5-1.0). /// /// Parameters: /// - [a] (Widget): The outgoing widget to fade out. /// - [b] (Widget): The incoming widget to fade in. /// - [t] (double): Animation progress from 0.0 to 1.0. /// - [alignment] (AlignmentGeometry): How to align widgets during transition. /// /// Returns a [Stack] with both widgets positioned and faded appropriately. static Widget lerpOpacity(Widget a, Widget b, double t, {AlignmentGeometry alignment = Alignment.center}); /// Creates an instant transition between two widgets without animation. /// /// This lerp function provides a step-wise transition where both widgets /// are shown simultaneously without any fade effect. At t=0.0, widget [a] /// is returned; at t=1.0, widget [b] is returned; for intermediate values, /// both widgets are stacked. /// /// Parameters: /// - [a] (Widget): The first widget in the transition. /// - [b] (Widget): The second widget in the transition. /// - [t] (double): Animation progress from 0.0 to 1.0. /// - [alignment] (AlignmentGeometry): How to align widgets (unused in step mode). /// /// Returns either individual widget at extremes or a [Stack] for intermediate values. static Widget lerpStep(Widget a, Widget b, double t, {AlignmentGeometry alignment = Alignment.center}); /// The child widget to display and potentially transition from. /// /// When this changes (determined by widget equality and key comparison), /// a transition animation is triggered using the specified [lerp] function. Widget child; /// Duration of the transition animation. /// /// Controls how long the transition takes when the child widget changes. /// Also affects the [AnimatedSize] duration for size-change animations. Duration duration; /// Alignment for positioning widgets during transition. /// /// Determines how widgets are aligned within the transition area, /// affecting both the [AnimatedSize] behavior and lerp positioning. AlignmentGeometry alignment; /// Function that interpolates between old and new child widgets. /// /// Called during transition with the outgoing widget [a], incoming widget [b], /// and progress value [t] (0.0 to 1.0). Must return a widget representing /// the intermediate state of the transition. Widget Function(Widget a, Widget b, double t, {AlignmentGeometry alignment}) lerp; /// Creates a [CrossFadedTransition] widget. /// /// Parameters: /// - [child] (Widget, required): The child widget to display and transition from when changed. /// - [duration] (Duration, default: kDefaultDuration): How long transitions should take. /// - [alignment] (AlignmentGeometry, default: Alignment.center): Widget alignment during transitions. /// - [lerp] (Function, default: lerpOpacity): How to interpolate between old and new children. /// /// The [child] should have a unique key when you want to trigger transitions, /// as the widget uses key comparison to detect when content has changed. /// /// Example: /// ```dart /// CrossFadedTransition( /// duration: Duration(milliseconds: 250), /// alignment: Alignment.topCenter, /// child: _currentIndex == 0 /// ? Text('Home', key: ValueKey('home')) /// : Text('Settings', key: ValueKey('settings')), /// ); /// ``` const CrossFadedTransition({super.key, required this.child, this.duration = kDefaultDuration, this.alignment = Alignment.center, this.lerp = lerpOpacity}); State createState(); } /// Localization delegate for Shadcn Flutter components. /// /// Provides localized strings and formatters for UI components. /// Supports internationalization of form validation messages, date formats, /// and other user-facing text. class ShadcnLocalizationsDelegate extends LocalizationsDelegate { /// Singleton instance of the delegate. static const ShadcnLocalizationsDelegate delegate = ShadcnLocalizationsDelegate(); /// Creates a [ShadcnLocalizationsDelegate]. const ShadcnLocalizationsDelegate(); bool isSupported(Locale locale); Future load(Locale locale); bool shouldReload(ShadcnLocalizationsDelegate old); } /// Configuration for file size unit formatting. /// /// Defines the base (1024 for binary) and unit labels for formatting /// file sizes and data volumes. class SizeUnitLocale { /// Base for unit conversion (typically 1024 for binary units). int base; /// List of unit labels (e.g., ['B', 'KB', 'MB', 'GB']). List units; /// Separator for digit grouping (e.g., ',' for 1,000,000). String separator; /// Creates a [SizeUnitLocale]. /// /// Parameters: /// - [base] (`int`, required): Base for unit conversion. /// - [units] (`List`, required): Unit labels. /// - [separator] (`String`, default: ','): Digit separator. const SizeUnitLocale(this.base, this.units, {this.separator = ','}); /// Standard file size units in bytes (B, KB, MB, GB, etc.). static const SizeUnitLocale fileBytes = _fileByteUnits; /// Binary file size units (Bi, KiB, MiB, GiB, etc.). static const SizeUnitLocale fileBits = _fileBitUnits; /// Gets the appropriate unit label for a value. /// /// Parameters: /// - [value] (`int`, required): The value to get unit for. /// /// Returns: `String` — the unit label. String getUnit(int value); } /// Formats a file size in bytes to a human-readable string. /// /// Converts byte values to appropriate units (B, KB, MB, GB, etc.) based /// on the provided locale unit configuration. /// /// Parameters: /// - [bytes] (`int`, required): File size in bytes. /// - [unit] (`SizeUnitLocale`, required): Unit locale configuration. /// /// Returns: `String` — formatted file size with unit. /// /// Example: /// ```dart /// formatFileSize(1024, SizeUnitLocale.fileBytes) // "1 KB" /// formatFileSize(1536, SizeUnitLocale.fileBytes) // "1.5 KB" /// ``` String formatFileSize(int bytes, SizeUnitLocale unit); /// Represents a part of a date (year, month, or day). /// /// Provides metadata and operations for individual date components. enum DatePart { year, month, day } /// Abstract base class for localized strings in Shadcn Flutter. /// /// Provides internationalization support for all user-facing text including /// form validation messages, date/time labels, command palette text, and more. /// Implementations provide locale-specific translations. /// /// Example: /// ```dart /// final localizations = ShadcnLocalizations.of(context); /// print(localizations.formNotEmpty); // "This field cannot be empty" /// ``` abstract class ShadcnLocalizations { /// Gets the localizations for the current context. /// /// Parameters: /// - [context] (`BuildContext`, required): Build context. /// /// Returns: `ShadcnLocalizations` instance for the current locale. static ShadcnLocalizations of(BuildContext context); /// Creates a [ShadcnLocalizations]. const ShadcnLocalizations(); /// Validation message: "This field cannot be empty". String get formNotEmpty; /// Validation message: "Invalid value". String get invalidValue; /// Validation message: "Invalid email address". String get invalidEmail; /// Validation message: "Invalid URL". String get invalidURL; /// Formats a number for display. /// /// Parameters: /// - [value] (`double`, required): Number to format. /// /// Returns: `String` — formatted number. String formatNumber(double value); /// Validation message for values less than a threshold. /// /// Parameters: /// - [value] (`double`, required): Threshold value. /// /// Returns: `String` — formatted validation message. String formLessThan(double value); /// Validation message for values greater than a threshold. /// /// Parameters: /// - [value] (`double`, required): Threshold value. /// /// Returns: `String` — formatted validation message. String formGreaterThan(double value); /// Validation message for values less than or equal to a threshold. /// /// Parameters: /// - [value] (`double`, required): Threshold value. /// /// Returns: `String` — formatted validation message. String formLessThanOrEqualTo(double value); /// Validation message for values greater than or equal to a threshold. /// /// Parameters: /// - [value] (`double`, required): Threshold value. /// /// Returns: `String` — formatted validation message. String formGreaterThanOrEqualTo(double value); /// Validation message for values between two thresholds (inclusive). /// /// Parameters: /// - [min] (`double`, required): Minimum value. /// - [max] (`double`, required): Maximum value. /// /// Returns: `String` — formatted validation message. String formBetweenInclusively(double min, double max); /// Validation message for values between two thresholds (exclusive). /// /// Parameters: /// - [min] (`double`, required): Minimum value. /// - [max] (`double`, required): Maximum value. /// /// Returns: `String` — formatted validation message. String formBetweenExclusively(double min, double max); /// Validation message for string length less than a threshold. /// /// Parameters: /// - [value] (`int`, required): Maximum length. /// /// Returns: `String` — formatted validation message. String formLengthLessThan(int value); /// Validation message for string length greater than a threshold. /// /// Parameters: /// - [value] (`int`, required): Minimum length. /// /// Returns: `String` — formatted validation message. String formLengthGreaterThan(int value); /// Password validation message: "Must contain digits". String get formPasswordDigits; /// Password validation message: "Must contain lowercase letters". String get formPasswordLowercase; /// Password validation message: "Must contain uppercase letters". String get formPasswordUppercase; /// Password validation message: "Must contain special characters". String get formPasswordSpecial; /// Order of date parts for the locale (e.g., [year, month, day] or [month, day, year]). List get datePartsOrder; /// Abbreviation for "year" (e.g., "Y" or "YYYY"). String get dateYearAbbreviation; /// Abbreviation for "month" (e.g., "M" or "MM"). String get dateMonthAbbreviation; /// Abbreviation for "day" (e.g., "D" or "DD"). String get dateDayAbbreviation; /// Gets the abbreviation for a specific date part. /// /// Parameters: /// - [part] (`DatePart`, required): The date part. /// /// Returns: `String` — abbreviation for the date part. String getDatePartAbbreviation(DatePart part); /// Command palette: "Search" placeholder text. String get commandSearch; /// Command palette: "No results found" empty state text. String get commandEmpty; /// Date picker: "Select year" instruction text. String get datePickerSelectYear; /// Abbreviated day name: "Mon". String get abbreviatedMonday; /// Abbreviated day name: "Tue". String get abbreviatedTuesday; /// Abbreviated day name: "Wed". String get abbreviatedWednesday; /// Abbreviated day name: "Thu". String get abbreviatedThursday; /// Abbreviated day name: "Fri". String get abbreviatedFriday; /// Abbreviated day name: "Sat". String get abbreviatedSaturday; /// Abbreviated day name: "Sun". String get abbreviatedSunday; /// Full month name: "January". String get monthJanuary; /// Full month name: "February". String get monthFebruary; /// Full month name: "March". String get monthMarch; /// Full month name: "April". String get monthApril; /// Full month name: "May". String get monthMay; /// Full month name: "June". String get monthJune; /// Full month name: "July". String get monthJuly; /// Full month name: "August". String get monthAugust; /// Full month name: "September". String get monthSeptember; /// Full month name: "October". String get monthOctober; /// Full month name: "November". String get monthNovember; /// Full month name: "December". String get monthDecember; /// Abbreviated month name: "Jan". String get abbreviatedJanuary; /// Abbreviated month name: "Feb". String get abbreviatedFebruary; /// Abbreviated month name: "Mar". String get abbreviatedMarch; /// Abbreviated month name: "Apr". String get abbreviatedApril; /// Abbreviated month name: "May". String get abbreviatedMay; /// Abbreviated month name: "Jun". String get abbreviatedJune; /// Abbreviated month name: "Jul". String get abbreviatedJuly; /// Abbreviated month name: "Aug". String get abbreviatedAugust; /// Abbreviated month name: "Sep". String get abbreviatedSeptember; /// Abbreviated month name: "Oct". String get abbreviatedOctober; /// Abbreviated month name: "Nov". String get abbreviatedNovember; /// Abbreviated month name: "Dec". String get abbreviatedDecember; /// Button label: "Cancel". String get buttonCancel; /// Button label: "OK". String get buttonOk; /// Button label: "Close". String get buttonClose; /// Button label: "Save". String get buttonSave; /// Button label: "Reset". String get buttonReset; /// Time unit label: "Hour". String get timeHour; /// Time unit label: "Minute". String get timeMinute; /// Time unit label: "Second". String get timeSecond; /// Time period: "AM" (ante meridiem). String get timeAM; /// Time period: "PM" (post meridiem). String get timePM; /// Color component label: "Red". String get colorRed; /// Color component label: "Green". String get colorGreen; /// Color component label: "Blue". String get colorBlue; /// Color component label: "Alpha" (transparency). String get colorAlpha; /// Color component label: "Hue". String get colorHue; /// Color component label: "Saturation". String get colorSaturation; /// Color component label: "Value" (brightness in HSV). String get colorValue; /// Color component label: "Lightness" (in HSL). String get colorLightness; /// Context menu: "Cut" action. String get menuCut; /// Context menu: "Copy" action. String get menuCopy; /// Context menu: "Paste" action. String get menuPaste; /// Context menu: "Select All" action. String get menuSelectAll; /// Context menu: "Undo" action. String get menuUndo; /// Context menu: "Redo" action. String get menuRedo; /// Context menu: "Delete" action. String get menuDelete; /// Context menu: "Share" action. String get menuShare; /// Context menu: "Search Web" action. String get menuSearchWeb; /// Context menu: "Live Text Input" action. String get menuLiveTextInput; /// Formats a date and time for display. /// /// Parameters: /// - [dateTime] (`DateTime`, required): Date/time to format. /// - [showDate] (`bool`, default: `true`): Include date. /// - [showTime] (`bool`, default: `true`): Include time. /// - [showSeconds] (`bool`, default: `false`): Include seconds. /// - [use24HourFormat] (`bool`, default: `true`): Use 24-hour format. /// /// Returns: `String` — formatted date/time. String formatDateTime(DateTime dateTime, {bool showDate = true, bool showTime = true, bool showSeconds = false, bool use24HourFormat = true}); /// Formats a time of day for display. /// /// Parameters: /// - [time] (`TimeOfDay`, required): Time to format. /// - [use24HourFormat] (`bool`, default: `true`): Use 24-hour format. /// - [showSeconds] (`bool`, default: `false`): Include seconds. /// /// Returns: `String` — formatted time. String formatTimeOfDay(TimeOfDay time, {bool use24HourFormat = true, bool showSeconds = false}); /// Placeholder text: "Select a date". String get placeholderDatePicker; /// Placeholder text: "Select a time". String get placeholderTimePicker; /// Placeholder text: "Select a color". String get placeholderColorPicker; /// Button label: "Previous". String get buttonPrevious; /// Button label: "Next". String get buttonNext; /// Pull-to-refresh: "Pull to refresh" instruction. String get refreshTriggerPull; /// Pull-to-refresh: "Release to refresh" instruction. String get refreshTriggerRelease; /// Pull-to-refresh: "Refreshing..." status. String get refreshTriggerRefreshing; /// Pull-to-refresh: "Complete" status. String get refreshTriggerComplete; /// Search placeholder: "Search country". String get searchPlaceholderCountry; /// Empty state: "No countries found". String get emptyCountryList; /// Toast notification: "Snippet copied". String get toastSnippetCopied; /// Color picker tab: "Recent". String get colorPickerTabRecent; /// Color picker tab: "RGB". String get colorPickerTabRGB; /// Color picker tab: "HSV". String get colorPickerTabHSV; /// Color picker tab: "HSL". String get colorPickerTabHSL; /// Color picker tab: "HEX". String get colorPickerTabHEX; /// Command palette: "Move up" hint. String get commandMoveUp; /// Command palette: "Move down" hint. String get commandMoveDown; /// Command palette: "Activate" hint. String get commandActivate; /// Data table: Selected rows count message. /// /// Parameters: /// - [count] (`int`, required): Number of selected rows. /// - [total] (`int`, required): Total number of rows. /// /// Returns: `String` — formatted message (e.g., "2 of 10 selected"). String dataTableSelectedRows(int count, int total); /// Data table: "Next" button. String get dataTableNext; /// Data table: "Previous" button. String get dataTablePrevious; /// Data table: "Columns" menu. String get dataTableColumns; /// Gets the display name for a color picker mode. /// /// Parameters: /// - [mode] (`ColorPickerMode`, required): Color picker mode. /// /// Returns: `String` — mode display name. String getColorPickerMode(ColorPickerMode mode); /// Gets the abbreviated weekday name for a given weekday constant. /// /// Parameters: /// - [weekday] (int, required): Weekday constant from DateTime (DateTime.monday through DateTime.sunday) /// /// Returns the localized abbreviated weekday name (e.g., "Mon", "Tue"). /// /// Throws [ArgumentError] if weekday is not a valid constant. String getAbbreviatedWeekday(int weekday); /// Gets the full month name for a given month constant. /// /// Parameters: /// - [month] (int, required): Month constant from DateTime (DateTime.january through DateTime.december) /// /// Returns the localized full month name (e.g., "January", "February"). /// /// Throws [ArgumentError] if month is not a valid constant. String getMonth(int month); /// Gets the abbreviated month name for a given month constant. /// /// Parameters: /// - [month] (int, required): Month constant from DateTime (DateTime.january through DateTime.december) /// /// Returns the localized abbreviated month name (e.g., "Jan", "Feb"). /// /// Throws [ArgumentError] if month is not a valid constant. String getAbbreviatedMonth(int month); /// Gets the abbreviated label for days in time displays (e.g., "d"). String get timeDaysAbbreviation; /// Gets the abbreviated label for hours in time displays (e.g., "h"). String get timeHoursAbbreviation; /// Gets the abbreviated label for minutes in time displays (e.g., "m"). String get timeMinutesAbbreviation; /// Gets the abbreviated label for seconds in time displays (e.g., "s"). String get timeSecondsAbbreviation; /// Gets the placeholder text for duration picker inputs. String get placeholderDurationPicker; /// Formats a duration as a localized string. /// /// Parameters: /// - [duration] (Duration, required): The duration to format /// - [showDays] (bool): Whether to show days component, defaults to true /// - [showHours] (bool): Whether to show hours component, defaults to true /// - [showMinutes] (bool): Whether to show minutes component, defaults to true /// - [showSeconds] (bool): Whether to show seconds component, defaults to true /// /// Returns a formatted duration string (e.g., "2d 3h 45m 12s"). String formatDuration(Duration duration, {bool showDays = true, bool showHours = true, bool showMinutes = true, bool showSeconds = true}); /// Gets the full word for "day" in duration displays. String get durationDay; /// Gets the full word for "hour" in duration displays. String get durationHour; /// Gets the full word for "minute" in duration displays. String get durationMinute; /// Gets the full word for "second" in duration displays. String get durationSecond; /// Gets the abbreviated label for a duration component. /// /// Parameters: /// - [part] (DurationPart, required): The duration component type /// /// Returns the localized abbreviation string for the component (e.g., "d", "h", "m", "s"). String getDurationPartAbbreviation(DurationPart part); /// Gets the abbreviated label for a time component. /// /// Parameters: /// - [part] (TimePart, required): The time component type /// /// Returns the localized abbreviation string for the component (e.g., "h", "m", "s"). String getTimePartAbbreviation(TimePart part); /// Gets a map of MIME types to their localized display names. /// /// Provides human-readable names for file types used in file pickers /// and upload dialogs. The map keys are MIME type strings (e.g., "image/png") /// and values are localized descriptions (e.g., "PNG Image"). Map get localizedMimeTypes; } /// Default English implementation of Shadcn localizations. /// /// Provides English translations for all localized strings in Shadcn Flutter. /// This is the default localization used when no specific locale is provided. class DefaultShadcnLocalizations extends ShadcnLocalizations { /// Singleton instance of the default localizations. static const ShadcnLocalizations instance = DefaultShadcnLocalizations(); /// Creates a default English localizations instance. const DefaultShadcnLocalizations(); Map localizedMimeTypes; String get commandMoveUp; String get commandMoveDown; String get commandActivate; String get timeDaysAbbreviation; String get timeHoursAbbreviation; String get timeMinutesAbbreviation; String get timeSecondsAbbreviation; String get commandSearch; String get commandEmpty; String get formNotEmpty; String get invalidValue; String get invalidEmail; String get invalidURL; String formatNumber(double value); String formLessThan(double value); String formGreaterThan(double value); String formLessThanOrEqualTo(double value); String formGreaterThanOrEqualTo(double value); String formBetweenInclusively(double min, double max); String formBetweenExclusively(double min, double max); String formLengthLessThan(int value); String formLengthGreaterThan(int value); String get formPasswordDigits; String get formPasswordLowercase; String get formPasswordUppercase; String get formPasswordSpecial; String get abbreviatedMonday; String get abbreviatedTuesday; String get abbreviatedWednesday; String get abbreviatedThursday; String get abbreviatedFriday; String get abbreviatedSaturday; String get abbreviatedSunday; String get monthJanuary; String get monthFebruary; String get monthMarch; String get monthApril; String get monthMay; String get monthJune; String get monthJuly; String get monthAugust; String get monthSeptember; String get monthOctober; String get monthNovember; String get monthDecember; String get buttonCancel; String get buttonOk; String get buttonClose; String get buttonSave; String get buttonReset; String formatDateTime(DateTime dateTime, {bool showDate = true, bool showTime = true, bool showSeconds = false, bool use24HourFormat = true}); String get dateYearAbbreviation; String get dateMonthAbbreviation; String get dateDayAbbreviation; String get placeholderDatePicker; String get placeholderColorPicker; String get buttonNext; String get buttonPrevious; String get searchPlaceholderCountry; String get emptyCountryList; String get placeholderTimePicker; String formatTimeOfDay(TimeOfDay time, {bool use24HourFormat = true, bool showSeconds = false}); String get timeHour; String get timeMinute; String get timeSecond; String get timeAM; String get timePM; String get toastSnippetCopied; String get datePickerSelectYear; String get abbreviatedJanuary; String get abbreviatedFebruary; String get abbreviatedMarch; String get abbreviatedApril; String get abbreviatedMay; String get abbreviatedJune; String get abbreviatedJuly; String get abbreviatedAugust; String get abbreviatedSeptember; String get abbreviatedOctober; String get abbreviatedNovember; String get abbreviatedDecember; String get colorRed; String get colorGreen; String get colorBlue; String get colorAlpha; String get menuCut; String get menuCopy; String get menuPaste; String get menuSelectAll; String get menuUndo; String get menuRedo; String get menuDelete; String get menuShare; String get menuSearchWeb; String get menuLiveTextInput; String get refreshTriggerPull; String get refreshTriggerRelease; String get refreshTriggerRefreshing; String get refreshTriggerComplete; String get colorPickerTabRecent; String get colorPickerTabRGB; String get colorPickerTabHSV; String get colorPickerTabHSL; String get colorPickerTabHEX; String get colorHue; String get colorSaturation; String get colorValue; String get colorLightness; String get dataTableColumns; String get dataTableNext; String get dataTablePrevious; String dataTableSelectedRows(int count, int total); List get datePartsOrder; String get durationDay; String get durationHour; String get durationMinute; String get durationSecond; String formatDuration(Duration duration, {bool showDays = true, bool showHours = true, bool showMinutes = true, bool showSeconds = true}); String get placeholderDurationPicker; } /// Details about a click event, including the click count. /// /// Provides information about click interactions, particularly useful /// for detecting single, double, or multiple clicks on a widget. /// /// The [clickCount] indicates how many consecutive clicks have occurred /// within the threshold duration (e.g., 1 for single click, 2 for double click). class ClickDetails { /// The number of consecutive clicks within the threshold period. /// /// Increments for each click that occurs within [ClickDetector.threshold] /// duration of the previous click. Resets to 1 when threshold is exceeded. int clickCount; /// Creates click details with the specified click count. /// /// Parameters: /// - [clickCount]: Number of consecutive clicks (required) const ClickDetails({required this.clickCount}); } /// A widget that detects and reports click events with multi-click support. /// /// Wraps a child widget and detects tap gestures, tracking consecutive clicks /// within a configurable threshold duration. Useful for implementing double-click, /// triple-click, or other multi-click interactions. /// /// Features: /// - **Click Count Tracking**: Automatically counts consecutive clicks /// - **Configurable Threshold**: Set maximum time between clicks /// - **Flexible Behavior**: Customize hit test behavior /// - **Simple Integration**: Wraps any widget with tap detection /// /// The widget calls [onClick] with [ClickDetails] containing the click count /// each time a tap is detected. The count resets to 1 if taps are spaced /// beyond the [threshold] duration. /// /// Example - Double Click Detection: /// ```dart /// ClickDetector( /// onClick: (details) { /// if (details.clickCount == 2) { /// print('Double clicked!'); /// } /// }, /// child: Text('Double click me'), /// ) /// ``` /// /// Example - Custom Threshold: /// ```dart /// ClickDetector( /// onClick: (details) { /// print('Clicked ${details.clickCount} times'); /// }, /// threshold: Duration(milliseconds: 500), /// child: Container( /// padding: EdgeInsets.all(16), /// child: Text('Click rapidly'), /// ), /// ) /// ``` class ClickDetector extends StatefulWidget { /// Callback invoked when the child widget is clicked. /// /// Called with [ClickDetails] containing the current click count. /// If `null`, the detector is effectively disabled (no taps detected). ClickCallback? onClick; /// The widget that receives click detection. /// /// This widget will be wrapped with gesture detection capabilities. Widget child; /// How to behave during hit testing. /// /// Determines whether this detector should participate in hit testing /// and how it should behave. Defaults to [HitTestBehavior.deferToChild]. HitTestBehavior behavior; /// Maximum time between clicks to count as consecutive. /// /// When clicks occur within this duration, they increment the click count. /// When clicks are spaced beyond this duration, the count resets to 1. /// /// Defaults to 300 milliseconds, which is a common double-click threshold. Duration threshold; /// Creates a click detector widget. /// /// Parameters: /// - [child]: The widget to wrap with click detection (required) /// - [onClick]: Callback for click events (optional) /// - [behavior]: Hit test behavior (defaults to [HitTestBehavior.deferToChild]) /// - [threshold]: Max time between consecutive clicks (defaults to 300ms) const ClickDetector({super.key, this.onClick, required this.child, this.behavior = HitTestBehavior.deferToChild, this.threshold = const Duration(milliseconds: 300)}); State createState(); } /// An abstract class that defines values for different Tracker levels. /// /// [TrackerLevel] provides a standardized way to represent different status /// or priority levels in tracker components. Each level defines both a visual /// color and descriptive name for consistent representation across the UI. /// /// ## Predefined Levels /// The class includes several predefined levels for common use cases: /// - [fine]: Green color, typically for healthy/good states /// - [warning]: Orange color, for cautionary states requiring attention /// - [critical]: Red color, for urgent states requiring immediate action /// - [unknown]: Gray color, for undefined or unavailable states /// /// ## Custom Levels /// Custom tracker levels can be implemented by extending this abstract class /// and providing [color] and [name] implementations. /// /// Example: /// ```dart /// // Using predefined levels /// TrackerData( /// level: TrackerLevel.critical, /// tooltip: Text('System Alert'), /// ); /// /// // Creating custom level /// class CustomLevel implements TrackerLevel { /// @override /// Color get color => Colors.purple; /// /// @override /// String get name => 'Custom'; /// } /// ``` abstract class TrackerLevel { /// Default values for the fine level. /// /// [color] is set to `Colors.green` /// [name] is set to `"Fine"` static const TrackerLevel fine = _SimpleTrackerLevel(Colors.green, 'Fine'); /// Default values for the warning level. /// /// [color] is set to `Colors.orange` /// [name] is set to `"Warning"` static const TrackerLevel warning = _SimpleTrackerLevel(Colors.orange, 'Warning'); /// Default values for the critical level. /// /// [color] is set to `Colors.red` /// [name] is set to `"Critical"` static const TrackerLevel critical = _SimpleTrackerLevel(Colors.red, 'Critical'); /// Default values for the unknown level. /// /// [color] is set to `Colors.gray` /// [name] is set to `"Unknown"` static const TrackerLevel unknown = _SimpleTrackerLevel(Colors.gray, 'Unknown'); /// Gets the color for the specified [TrackerLevel]. /// /// Returns the [Color] associated with this tracker level, used for /// visual representation in the tracker component. Color get color; /// Gets the name for the specified [TrackerLevel]. /// /// Returns a [String] description of this tracker level, typically /// used in tooltips or accessibility labels. String get name; } /// A data container for individual tracker segments. /// /// [TrackerData] encapsulates the information needed to display a single /// segment within a [Tracker] widget. Each segment represents a data point /// with an associated status level and contextual information. /// /// ## Components /// - **Tooltip**: Interactive content displayed on hover for additional context /// - **Level**: Status level determining the visual appearance and meaning /// /// ## Usage /// Tracker data is typically created from application data models and /// transformed into visual representations for status monitoring dashboards, /// progress indicators, or health monitoring interfaces. /// /// Example: /// ```dart /// TrackerData( /// level: TrackerLevel.warning, /// tooltip: Column( /// mainAxisSize: MainAxisSize.min, /// children: [ /// Text('Server Load'), /// Text('75% - Warning Level'), /// Text('Last Updated: 2 min ago'), /// ], /// ), /// ); /// ``` class TrackerData { /// The tooltip content displayed on hover. /// /// Type: `Widget`. Interactive content shown when the user hovers over /// this tracker segment. Can contain text, icons, or complex layouts /// providing additional context about the data point. Widget tooltip; /// The status level determining visual appearance. /// /// Type: `TrackerLevel`. Defines the color and semantic meaning of this /// tracker segment. Used to determine the background color and accessibility /// information for the segment. TrackerLevel level; /// Creates a new [TrackerData] instance. /// /// Combines a tooltip for user interaction with a status level for /// visual representation in tracker components. /// /// Parameters: /// - [tooltip] (Widget, required): Interactive content for hover display /// - [level] (TrackerLevel, required): Status level for visual styling /// /// Example: /// ```dart /// TrackerData( /// tooltip: Text('CPU Usage: 45%'), /// level: TrackerLevel.fine, /// ); /// ``` const TrackerData({required this.tooltip, required this.level}); } /// Theme configuration for [Tracker] components. /// /// [TrackerTheme] provides styling options for tracker components including /// corner radius, spacing between segments, and segment height. It enables /// consistent tracker styling across an application while allowing customization. /// /// Used with [ComponentTheme] to apply theme values throughout the widget tree. /// /// Example: /// ```dart /// ComponentTheme( /// data: TrackerTheme( /// radius: 8.0, /// gap: 2.0, /// itemHeight: 40.0, /// ), /// child: MyTrackerWidget(), /// ); /// ``` class TrackerTheme { /// Corner radius for the tracker container in logical pixels. /// /// Type: `double?`. Controls the rounding of tracker corners. If null, /// defaults to theme.radiusMd for consistent corner styling. double? radius; /// Gap between individual tracker segments in logical pixels. /// /// Type: `double?`. Spacing between adjacent tracker segments. If null, /// defaults to theme.scaling * 2 for proportional spacing. double? gap; /// Height of individual tracker segments in logical pixels. /// /// Type: `double?`. Controls the vertical size of tracker segments. /// If null, defaults to 32 logical pixels. double? itemHeight; /// Creates a [TrackerTheme]. /// /// All parameters are optional and will fall back to theme defaults /// when not provided. /// /// Parameters: /// - [radius] (double?, optional): Corner radius in pixels /// - [gap] (double?, optional): Spacing between segments in pixels /// - [itemHeight] (double?, optional): Height of segments in pixels /// /// Example: /// ```dart /// TrackerTheme( /// radius: 12.0, /// gap: 4.0, /// itemHeight: 48.0, /// ); /// ``` const TrackerTheme({this.radius, this.gap, this.itemHeight}); /// Creates a copy of this theme with the given values replaced. /// /// Returns a new [TrackerTheme] instance with the same values as this /// theme, except for any parameters that are explicitly provided. Use /// [ValueGetter] functions to specify new values. /// /// Example: /// ```dart /// final newTheme = originalTheme.copyWith( /// radius: () => 16.0, /// itemHeight: () => 56.0, /// ); /// ``` TrackerTheme copyWith({ValueGetter? radius, ValueGetter? gap, ValueGetter? itemHeight}); bool operator ==(Object other); int get hashCode; String toString(); } /// A widget that displays a tracker. /// /// This widget displays a row of tracker levels with tooltips. /// The row contains a tracker level for each tracker in the [data] list. /// A horizontal status tracking widget with interactive tooltips. /// /// [Tracker] provides a visual representation of status data as colored segments /// in a horizontal layout. Each segment represents a data point with an associated /// status level and interactive tooltip. It's commonly used for monitoring /// dashboards, progress indicators, and status overviews. /// /// ## Key Features /// - **Status Visualization**: Color-coded segments based on [TrackerLevel] /// - **Interactive Tooltips**: Hover-activated tooltips with custom content /// - **Flexible Sizing**: Segments automatically expand to fill available width /// - **Theming**: Comprehensive styling via [TrackerTheme] /// - **Rounded Corners**: Configurable corner radius for modern appearance /// /// ## Layout Behavior /// The tracker displays segments as equally-sized horizontal sections that /// expand to fill the available width. Gaps between segments and overall /// styling can be controlled through the theme system. /// /// ## Use Cases /// - Server status monitoring (healthy, warning, critical states) /// - Progress tracking across multiple stages /// - Resource utilization indicators /// - Quality metrics visualization /// - Timeline status representation /// /// Example: /// ```dart /// Tracker( /// data: [ /// TrackerData( /// level: TrackerLevel.fine, /// tooltip: Text('Database: Healthy\n95% uptime'), /// ), /// TrackerData( /// level: TrackerLevel.warning, /// tooltip: Text('API: Warning\nHigh response time'), /// ), /// TrackerData( /// level: TrackerLevel.critical, /// tooltip: Text('Cache: Critical\nMemory usage: 98%'), /// ), /// ], /// ); /// ``` class Tracker extends StatelessWidget { /// List of data points to display as tracker segments. /// /// Type: `List`. Each data point contains a status level /// for visual styling and tooltip content for user interaction. The /// segments are displayed in the order provided, each taking equal /// horizontal space. List data; /// Creates a [Tracker] widget. /// /// Displays status data as interactive, color-coded horizontal segments /// with hover tooltips for additional context. /// /// Parameters: /// - [data] (`List`, required): Status data points to display /// /// Example: /// ```dart /// Tracker( /// data: [ /// TrackerData( /// level: TrackerLevel.fine, /// tooltip: Text('System OK'), /// ), /// TrackerData( /// level: TrackerLevel.warning, /// tooltip: Text('Minor Issues'), /// ), /// ], /// ); /// ``` const Tracker({super.key, required this.data}); Widget build(BuildContext context); } /// A widget that displays multiple dots, commonly used for loading indicators or menus. /// /// Creates a customizable row or column of circular dots that can be used as a /// "more" indicator, loading animation, or menu icon. The number, size, color, /// and spacing of dots can be configured. /// /// Example: /// ```dart /// // Horizontal three-dot menu icon /// MoreDots( /// count: 3, /// direction: Axis.horizontal, /// spacing: 4, /// ) /// /// // Vertical loading indicator /// MoreDots( /// count: 5, /// direction: Axis.vertical, /// color: Colors.blue, /// ) /// ``` class MoreDots extends StatelessWidget { /// The layout direction of the dots. /// /// Can be [Axis.horizontal] for a row or [Axis.vertical] for a column. /// Defaults to horizontal. Axis direction; /// The number of dots to display. /// /// Defaults to `3`. int count; /// The size (diameter) of each dot. /// /// If `null`, calculates size based on the text style font size (20% of font size). double? size; /// The color of the dots. /// /// If `null`, uses the current text color from the theme. Color? color; /// The spacing between dots. /// /// Defaults to `2`. double spacing; /// Padding around the entire dots group. /// /// If `null`, no padding is applied. EdgeInsetsGeometry? padding; /// Creates a [MoreDots]. /// /// Parameters: /// - [direction] (`Axis`, default: `Axis.horizontal`): Layout direction. /// - [count] (`int`, default: `3`): Number of dots. /// - [size] (`double?`, optional): Dot diameter. /// - [color] (`Color?`, optional): Dot color. /// - [spacing] (`double`, default: `2`): Space between dots. /// - [padding] (`EdgeInsetsGeometry?`, optional): Outer padding. const MoreDots({super.key, this.direction = Axis.horizontal, this.count = 3, this.size, this.color, this.spacing = 2, this.padding}); Widget build(BuildContext context); } /// Extension on [Widget] providing convenient icon theme utilities. /// /// Provides methods to wrap icons with predefined size and color themes, /// making it easy to apply consistent styling to icon widgets throughout /// an application. extension IconExtension on Widget { /// Wraps the icon with extra-extra-extra-extra small size theme. WrappedIcon get iconX4Small; /// Wraps the icon with extra-extra-extra small size theme. WrappedIcon get iconX3Small; /// Wraps the icon with extra-extra small size theme. WrappedIcon get iconX2Small; /// Wraps the icon with extra small size theme. WrappedIcon get iconXSmall; /// Wraps the icon with small size theme. WrappedIcon get iconSmall; /// Wraps the icon with medium size theme. WrappedIcon get iconMedium; /// Wraps the icon with large size theme. WrappedIcon get iconLarge; /// Wraps the icon with extra large size theme. WrappedIcon get iconXLarge; /// Wraps the icon with extra-extra large size theme. WrappedIcon get iconX2Large; /// Wraps the icon with extra-extra-extra large size theme. WrappedIcon get iconX3Large; /// Wraps the icon with extra-extra-extra-extra large size theme. WrappedIcon get iconX4Large; /// Wraps the icon with muted foreground color. /// /// Applies a subdued color suitable for secondary or less prominent icons. WrappedIcon get iconMutedForeground; /// Wraps the icon with destructive foreground color. /// /// Deprecated: Use alternative color scheme methods instead. WrappedIcon get iconDestructiveForeground; /// Wraps the icon with primary foreground color. /// /// Typically used for icons on primary-colored backgrounds. WrappedIcon get iconPrimaryForeground; /// Wraps the icon with primary color. /// /// Applies the theme's primary accent color to the icon. WrappedIcon get iconPrimary; /// Wraps the icon with secondary color. /// /// Applies the theme's secondary accent color to the icon. WrappedIcon get iconSecondary; /// Wraps the icon with secondary foreground color. /// /// Typically used for icons on secondary-colored backgrounds. WrappedIcon get iconSecondaryForeground; } /// A widget that wraps an icon with custom theme data. /// /// Applies icon theme styling to a child icon widget using a builder /// function that can access the current context and theme. Useful for /// applying dynamic icon styles based on theme values. /// /// Example: /// ```dart /// WrappedIcon( /// data: (context, theme) => IconThemeData( /// size: 24, /// color: theme.colorScheme.primary, /// ), /// child: Icon(Icons.star), /// ) /// ``` class WrappedIcon extends StatelessWidget { /// Builder function that creates the icon theme data. WrappedIconDataBuilder data; /// The child icon widget to apply the theme to. Widget child; /// Creates a [WrappedIcon]. /// /// Parameters: /// - [data] (`WrappedIconDataBuilder`, required): Theme builder. /// - [child] (`Widget`, required): Icon widget to wrap. const WrappedIcon({super.key, required this.data, required this.child}); /// Returns this widget (callable syntax support). /// /// Allows using the wrapped icon as a callable function. Widget call(); Widget build(BuildContext context); /// Creates a copy of this wrapped icon with modified icon theme data. /// /// Parameters: /// - [data] (`WrappedIconDataBuilder?`, optional): New icon theme data builder. /// /// Returns: A new [WrappedIcon] with merged theme data. WrappedIcon copyWith({WrappedIconDataBuilder? data}); } /// {@template selectable_text_theme} /// Theme data for [SelectableText] to customize cursor and selection behavior. /// {@endtemplate} class SelectableTextTheme { /// Width of the text cursor in logical pixels. /// /// If `null`, uses the default cursor width from the platform or theme. double? cursorWidth; /// Height of the text cursor in logical pixels. /// /// If `null`, the cursor height matches the line height of the text. double? cursorHeight; /// Corner radius of the text cursor. /// /// If `null`, the cursor has square corners (no rounding). Radius? cursorRadius; /// Color of the text cursor. /// /// If `null`, uses the theme's primary color or platform default. Color? cursorColor; /// How tall the selection highlight boxes should be. /// /// Determines vertical sizing behavior for text selection highlights. /// If `null`, uses platform or theme defaults. ui.BoxHeightStyle? selectionHeightStyle; /// How wide the selection highlight boxes should be. /// /// Determines horizontal sizing behavior for text selection highlights. /// If `null`, uses platform or theme defaults. ui.BoxWidthStyle? selectionWidthStyle; /// Whether to enable interactive text selection (e.g., selecting with mouse/touch). /// /// When `true`, users can select text by dragging. When `false`, text /// selection gestures are disabled. If `null`, uses platform defaults. bool? enableInteractiveSelection; /// {@macro selectable_text_theme} const SelectableTextTheme({this.cursorWidth, this.cursorHeight, this.cursorRadius, this.cursorColor, this.selectionHeightStyle, this.selectionWidthStyle, this.enableInteractiveSelection}); /// Creates a copy of this theme with optionally replaced values. /// /// Uses [ValueGetter] functions to allow nullable value replacement. /// Properties not provided retain their current values. /// /// Parameters: /// - [cursorWidth]: Optional getter for new cursor width /// - [cursorHeight]: Optional getter for new cursor height /// - [cursorRadius]: Optional getter for new cursor radius /// - [cursorColor]: Optional getter for new cursor color /// - [selectionHeightStyle]: Optional getter for new selection height style /// - [selectionWidthStyle]: Optional getter for new selection width style /// - [enableInteractiveSelection]: Optional getter for new interactive selection state /// /// Returns a new [SelectableTextTheme] with updated values. SelectableTextTheme copyWith({ValueGetter? cursorWidth, ValueGetter? cursorHeight, ValueGetter? cursorRadius, ValueGetter? cursorColor, ValueGetter? selectionHeightStyle, ValueGetter? selectionWidthStyle, ValueGetter? enableInteractiveSelection}); int get hashCode; bool operator ==(Object other); String toString(); } /// A text widget that supports text selection by users. /// /// Displays text (plain or styled) that users can select, copy, and interact with. /// Provides cursor display, selection highlighting, and context menu support for /// rich text interaction experiences. /// /// Features: /// - **Text Selection**: Click and drag to select text portions /// - **Copy Support**: Built-in copy functionality via context menu /// - **Cursor Display**: Optional cursor for indicating selection position /// - **Rich Text**: Supports styled text via [TextSpan] (use `.rich` constructor) /// - **Customizable**: Full control over cursor, selection, and interaction behavior /// /// Usage Patterns: /// /// **Basic Selectable Text**: /// ```dart /// SelectableText( /// 'Select this text!', /// style: TextStyle(fontSize: 16), /// ) /// ``` /// /// **Rich Text Selection**: /// ```dart /// SelectableText.rich( /// TextSpan( /// children: [ /// TextSpan(text: 'Bold ', style: TextStyle(fontWeight: FontWeight.bold)), /// TextSpan(text: 'and normal text'), /// ], /// ), /// ) /// ``` /// /// **Custom Cursor**: /// ```dart /// SelectableText( /// 'Text with custom cursor', /// showCursor: true, /// cursorColor: Colors.blue, /// cursorWidth: 3.0, /// ) /// ``` /// /// See also: /// - [Text] for non-selectable text display /// - [TextField] for editable text input /// - [SelectableTextTheme] for theming selection appearance class SelectableText extends StatelessWidget { /// Creates selectable text from a plain string. /// /// The [data] parameter is the text to display. All other parameters /// are optional and control various aspects of text rendering and selection. /// /// Parameters: /// - [data]: The text string to display (required) /// - [focusNode]: Focus node for keyboard interaction /// - [style]: Text style for the content /// - [strutStyle]: Strut style for line height /// - [textAlign]: How to align text horizontally /// - [textDirection]: Text direction (LTR or RTL) /// - [textScaler]: Text scaling factor /// - [showCursor]: Whether to show the cursor (defaults to `false`) /// - [autofocus]: Auto-focus on mount (defaults to `false`) /// - [minLines]: Minimum number of lines to occupy /// - [maxLines]: Maximum number of lines before scrolling /// - [cursorWidth]: Width of cursor (defaults to 2.0) /// - [cursorHeight]: Height of cursor (null = line height) /// - [cursorRadius]: Cursor corner radius /// - [cursorColor]: Cursor color /// - [selectionHeightStyle]: Selection box height behavior /// - [selectionWidthStyle]: Selection box width behavior /// - [dragStartBehavior]: When to start drag gestures /// - [enableInteractiveSelection]: Enable selection (defaults to `true`) /// - [selectionControls]: Custom selection toolbar controls /// - [onTap]: Callback when text is tapped /// - [scrollPhysics]: Scroll behavior physics /// - [semanticsLabel]: Semantic label for accessibility /// - [textHeightBehavior]: How to handle line heights /// - [textWidthBasis]: Basis for measuring text width /// - [onSelectionChanged]: Callback when selection changes /// - [useNativeContextMenu]: Use platform context menu (defaults to `false`) /// - [contextMenuBuilder]: Custom context menu builder /// - [magnifierConfiguration]: Text magnifier configuration const SelectableText(String this.data, {super.key, this.focusNode, this.style, this.strutStyle, this.textAlign, this.textDirection, this.textScaler, this.showCursor = false, this.autofocus = false, this.minLines, this.maxLines, this.cursorWidth = 2.0, this.cursorHeight, this.cursorRadius, this.cursorColor, this.selectionHeightStyle = ui.BoxHeightStyle.tight, this.selectionWidthStyle = ui.BoxWidthStyle.tight, this.dragStartBehavior = DragStartBehavior.start, this.enableInteractiveSelection = true, this.selectionControls, this.onTap, this.scrollPhysics, this.semanticsLabel, this.textHeightBehavior, this.textWidthBasis, this.onSelectionChanged, this.useNativeContextMenu = false, this.contextMenuBuilder = _defaultContextMenuBuilder, this.magnifierConfiguration}); /// Creates selectable text from a [TextSpan] for styled/rich text. /// /// Use this constructor when you need to display text with multiple styles, /// inline widgets, or complex formatting. The [textSpan] can contain nested /// spans with different styles, colors, and even tap handlers. /// /// Parameters are identical to the default constructor, except: /// - [textSpan]: The styled text span tree to display (required) /// - [data] is not available (use [textSpan] instead) /// /// Example: /// ```dart /// SelectableText.rich( /// TextSpan( /// text: 'Visit our ', /// children: [ /// TextSpan( /// text: 'website', /// style: TextStyle(color: Colors.blue, decoration: TextDecoration.underline), /// ), /// TextSpan(text: ' for more info'), /// ], /// ), /// ) /// ``` const SelectableText.rich(TextSpan this.textSpan, {super.key, this.focusNode, this.style, this.strutStyle, this.textAlign, this.textDirection, this.textScaler, this.showCursor = false, this.autofocus = false, this.minLines, this.maxLines, this.cursorWidth = 2.0, this.cursorHeight, this.cursorRadius, this.cursorColor, this.selectionHeightStyle = ui.BoxHeightStyle.tight, this.selectionWidthStyle = ui.BoxWidthStyle.tight, this.dragStartBehavior = DragStartBehavior.start, this.enableInteractiveSelection = true, this.selectionControls, this.onTap, this.scrollPhysics, this.semanticsLabel, this.textHeightBehavior, this.textWidthBasis, this.onSelectionChanged, this.useNativeContextMenu = false, this.contextMenuBuilder = _defaultContextMenuBuilder, this.magnifierConfiguration}); /// The plain text string to display. /// /// Either [data] or [textSpan] must be non-null, but not both. /// Used when constructing with the default constructor. String? data; /// The styled text span to display. /// /// Either [data] or [textSpan] must be non-null, but not both. /// Used when constructing with the [SelectableText.rich] constructor. TextSpan? textSpan; /// Focus node for managing keyboard focus. /// /// If `null`, a focus node is created internally. FocusNode? focusNode; /// Whether to use the platform's native context menu. /// /// When `true`, uses the operating system's built-in context menu. /// When `false`, uses Flutter's custom context menu. bool useNativeContextMenu; /// The text style to apply to the text. /// /// If `null`, uses the default text style from the theme. TextStyle? style; /// {@macro flutter.widgets.editableText.strutStyle} StrutStyle? strutStyle; /// {@macro flutter.widgets.editableText.textAlign} TextAlign? textAlign; /// {@macro flutter.widgets.editableText.textDirection} TextDirection? textDirection; /// {@macro flutter.painting.textPainter.textScaler} TextScaler? textScaler; /// {@macro flutter.widgets.editableText.autofocus} bool autofocus; /// {@macro flutter.widgets.editableText.minLines} int? minLines; /// {@macro flutter.widgets.editableText.maxLines} int? maxLines; /// {@macro flutter.widgets.editableText.showCursor} bool showCursor; /// {@macro flutter.widgets.editableText.cursorWidth} double cursorWidth; /// {@macro flutter.widgets.editableText.cursorHeight} double? cursorHeight; /// {@macro flutter.widgets.editableText.cursorRadius} Radius? cursorRadius; /// Color of the text cursor. /// /// If null, defaults to the theme's cursor color. Color? cursorColor; /// Defines the height of text selection boxes. /// /// See [ui.BoxHeightStyle] for available options. ui.BoxHeightStyle selectionHeightStyle; /// Defines the width of text selection boxes. /// /// See [ui.BoxWidthStyle] for available options. ui.BoxWidthStyle selectionWidthStyle; /// {@macro flutter.widgets.editableText.enableInteractiveSelection} bool enableInteractiveSelection; /// {@macro flutter.widgets.editableText.selectionControls} TextSelectionControls? selectionControls; /// {@macro flutter.widgets.scrollable.dragStartBehavior} DragStartBehavior dragStartBehavior; /// {@macro flutter.widgets.editableText.selectionEnabled} bool get selectionEnabled; /// Called when the user taps on this selectable text. /// /// The selectable text builds a [GestureDetector] to handle input events like tap, /// to trigger focus requests, to move the caret, adjust the selection, etc. /// Handling some of those events by wrapping the selectable text with a competing /// GestureDetector is problematic. /// /// To unconditionally handle taps, without interfering with the selectable text's /// internal gesture detector, provide this callback. /// /// To be notified when the text field gains or loses the focus, provide a /// [focusNode] and add a listener to that. /// /// To listen to arbitrary pointer events without competing with the /// selectable text's internal gesture detector, use a [Listener]. GestureTapCallback? onTap; /// {@macro flutter.widgets.editableText.scrollPhysics} ScrollPhysics? scrollPhysics; /// {@macro flutter.widgets.Text.semanticsLabel} String? semanticsLabel; /// {@macro dart.ui.textHeightBehavior} TextHeightBehavior? textHeightBehavior; /// {@macro flutter.painting.textPainter.textWidthBasis} TextWidthBasis? textWidthBasis; /// {@macro flutter.widgets.editableText.onSelectionChanged} SelectionChangedCallback? onSelectionChanged; /// {@macro flutter.widgets.EditableText.contextMenuBuilder} EditableTextContextMenuBuilder? contextMenuBuilder; /// The configuration for the magnifier used when the text is selected. /// /// By default, builds a [CupertinoTextMagnifier] on iOS and [TextMagnifier] /// on Android, and builds nothing on all other platforms. To suppress the /// magnifier, consider passing [TextMagnifierConfiguration.disabled]. /// /// {@macro flutter.widgets.magnifier.intro} TextMagnifierConfiguration? magnifierConfiguration; Widget build(BuildContext context); } /// Abstract base class for text modifier widgets. /// /// Text modifiers provide a fluent API for applying text styles and /// transformations. They extend [Widget] and can be called as functions /// to apply additional style properties. /// /// Use the [TextExtension] methods to create and chain text modifiers. abstract class TextModifier extends Widget { /// Creates a [TextModifier]. const TextModifier({super.key}); /// Applies additional text style properties to this modifier. /// /// All parameters are optional and can be used to override or extend /// the current text styling. /// /// Parameters: /// - [color] (`Color?`, optional): Text color. /// - [backgroundColor] (`Color?`, optional): Background color for text. /// - [fontSize] (`double?`, optional): Font size in logical pixels. /// - [fontWeight] (`FontWeight?`, optional): Font weight (e.g., bold, normal). /// - [fontStyle] (`FontStyle?`, optional): Font style (e.g., italic, normal). /// - [letterSpacing] (`double?`, optional): Space between letters. /// - [wordSpacing] (`double?`, optional): Space between words. /// - [textBaseline] (`TextBaseline?`, optional): Text baseline alignment. /// - [height] (`double?`, optional): Line height multiplier. /// - [leadingDistribution] (`TextLeadingDistribution?`, optional): How to distribute line height. /// - [locale] (`Locale?`, optional): Locale for font selection. /// - [foreground] (`Paint?`, optional): Custom foreground paint. /// - [background] (`Paint?`, optional): Custom background paint. /// - [shadows] (`List?`, optional): Text shadows. /// - [fontFeatures] (`List?`, optional): OpenType font features. /// - [fontVariations] (`List?`, optional): Font variations. /// - [decoration] (`TextDecoration?`, optional): Text decoration (underline, etc.). /// - [decorationColor] (`Color?`, optional): Decoration color. /// - [decorationStyle] (`TextDecorationStyle?`, optional): Decoration style. /// - [decorationThickness] (`double?`, optional): Decoration thickness. /// - [debugLabel] (`String?`, optional): Debug label for text style. /// - [fontFamily] (`String?`, optional): Font family name. /// - [fontFamilyFallback] (`List?`, optional): Fallback font families. /// - [package] (`String?`, optional): Package containing the font. /// - [overflow] (`TextOverflow?`, optional): How to handle text overflow. /// /// Returns: `Widget` — the modified text widget. Widget call({Color? color, Color? backgroundColor, double? fontSize, FontWeight? fontWeight, FontStyle? fontStyle, double? letterSpacing, double? wordSpacing, TextBaseline? textBaseline, double? height, TextLeadingDistribution? leadingDistribution, Locale? locale, Paint? foreground, Paint? background, List? shadows, List? fontFeatures, List? fontVariations, TextDecoration? decoration, Color? decorationColor, TextDecorationStyle? decorationStyle, double? decorationThickness, String? debugLabel, String? fontFamily, List? fontFamilyFallback, String? package, TextOverflow? overflow}); } /// Extension providing text styling modifiers for widgets. /// /// This extension adds a fluent API for applying text styles to widgets. /// Each property returns a [TextModifier] that can be further chained. /// /// Example: /// ```dart /// Text('Hello').sans.large.bold.muted /// ``` extension TextExtension on Widget { /// Applies sans-serif font family. TextModifier get sans; /// Applies monospace font family. TextModifier get mono; /// Applies extra-small font size. TextModifier get xSmall; /// Applies small font size. TextModifier get small; /// Applies base (default) font size. TextModifier get base; /// Applies large font size. TextModifier get large; /// Applies extra-large font size. TextModifier get xLarge; /// Applies 2x large font size. TextModifier get x2Large; /// Applies 3x large font size. TextModifier get x3Large; /// Applies 4x large font size. TextModifier get x4Large; /// Applies 5x large font size. TextModifier get x5Large; /// Applies 6x large font size. TextModifier get x6Large; /// Applies 7x large font size. TextModifier get x7Large; /// Applies 8x large font size. TextModifier get x8Large; /// Applies 9x large font size. TextModifier get x9Large; /// Applies thin font weight (100). TextModifier get thin; /// Applies extra-light font weight (200). TextModifier get extraLight; /// Applies light font weight (300). TextModifier get light; /// Applies normal font weight (400). TextModifier get normal; /// Applies medium font weight (500). TextModifier get medium; /// Applies semi-bold font weight (600). TextModifier get semiBold; /// Applies bold font weight (700). TextModifier get bold; /// Applies extra-bold font weight (800). TextModifier get extraBold; /// Applies black font weight (900). TextModifier get black; /// Applies italic font style. TextModifier get italic; /// Applies underline text decoration. TextModifier get underline; /// Applies muted foreground color. TextModifier get muted; /// Applies primary foreground color. TextModifier get primaryForeground; /// Applies secondary foreground color. TextModifier get secondaryForeground; /// Applies heading 1 style. TextModifier get h1; /// Applies heading 2 style with bottom border. TextModifier get h2; /// Applies heading 3 style. TextModifier get h3; /// Applies heading 4 style. TextModifier get h4; /// Applies paragraph style with top spacing. TextModifier get p; /// Applies paragraph style for the first paragraph (no top spacing). TextModifier get firstP; /// Applies block quote style with left border. TextModifier get blockQuote; /// Applies list item style with bullet point. /// /// Automatically adds a bullet point and indents nested list items. TextModifier get li; /// Applies inline code style with background and padding. TextModifier get inlineCode; /// Applies lead paragraph style with muted color. TextModifier get lead; /// Applies large text style. TextModifier get textLarge; /// Applies small text style. TextModifier get textSmall; /// Applies muted text style with muted color. TextModifier get textMuted; /// Constrains text to a single line without wrapping. TextModifier get singleLine; /// Applies ellipsis overflow to text. TextModifier get ellipsis; /// Centers text horizontally. TextModifier get textCenter; /// Right-aligns text. TextModifier get textRight; /// Left-aligns text. TextModifier get textLeft; /// Justifies text alignment. TextModifier get textJustify; /// Aligns text to the start (left in LTR, right in RTL). TextModifier get textStart; /// Aligns text to the end (right in LTR, left in RTL). TextModifier get textEnd; /// Applies primary foreground color modifier. TextModifier get modify; /// Applies standard foreground color. TextModifier get foreground; /// Appends an inline span to the current text widget. /// /// Allows chaining multiple text spans together. Works with [Text], /// [SelectableText], and [RichText] widgets. /// /// Parameters: /// - [span] (`InlineSpan`, required): The span to append. /// /// Returns: `Widget` — a rich text widget with the appended span. /// /// Example: /// ```dart /// Text('Hello ').then(TextSpan(text: 'World')) /// ``` Widget then(InlineSpan span); /// Appends a text span to the current text widget. /// /// Convenience method for appending plain text. /// /// Parameters: /// - [text] (`String`, required): Text to append. /// /// Returns: `Widget` — a rich text widget with the appended text. /// /// Example: /// ```dart /// Text('Hello ').thenText('World') /// ``` Widget thenText(String text); /// Appends inline code to the current text widget. /// /// The appended text is styled as inline code with background. /// /// Parameters: /// - [text] (`String`, required): Code text to append. /// /// Returns: `Widget` — a rich text widget with the appended code. /// /// Example: /// ```dart /// Text('Use ').thenInlineCode('myFunction()') /// ``` Widget thenInlineCode(String text); /// Appends a button widget to the current text widget. /// /// Creates an inline button within the text flow. /// /// Parameters: /// - [onPressed] (`VoidCallback`, required): Button press handler. /// - [child] (`Widget`, required): Button content. /// /// Returns: `Widget` — a rich text widget with the appended button. /// /// Example: /// ```dart /// Text('Click ').thenButton( /// onPressed: () => print('clicked'), /// child: Text('here'), /// ) /// ``` Widget thenButton({required VoidCallback onPressed, required Widget child}); } /// Creates a bullet widget for list items based on depth. /// /// Returns different bullet styles for different nesting levels: /// - Depth 0: Filled circle /// - Depth 1: Hollow circle (stroke only) /// - Depth 2+: Filled square /// /// Parameters: /// - [context] (`BuildContext`, required): Build context for theme access. /// - [depth] (`int`, required): Nesting depth (0 = top level). /// - [size] (`double`, required): Size of the bullet in logical pixels. /// /// Returns: `Widget` — a centered bullet widget. /// /// Example: /// ```dart /// getBullet(context, 0, 6.0) // Filled circle bullet /// ``` Widget getBullet(BuildContext context, int depth, double size); /// Data class for tracking unordered list nesting depth. /// /// Used internally by the list item modifier to handle bullet points /// and indentation for nested lists. class UnorderedListData { /// The nesting depth of the list (0 = top level). int depth; /// Creates an [UnorderedListData]. /// /// Parameters: /// - [depth] (`int`, default: 0): Nesting depth. const UnorderedListData({this.depth = 0}); } /// A widget that wraps text with customizable styling and layout. /// /// [WrappedText] provides a declarative way to apply text styles and /// transformations using builder functions. It implements [TextModifier] /// and is the foundation for the fluent text styling API. /// /// All style properties are computed dynamically using builder functions /// that receive the current [BuildContext] and [ThemeData], enabling /// theme-aware and responsive text styling. class WrappedText extends StatelessWidget implements TextModifier { /// The child widget to wrap with styling. Widget child; /// Builder for the text style. WrappedTextDataBuilder? style; /// Builder for text alignment. WrappedTextDataBuilder? textAlign; /// Builder for soft wrap behavior. WrappedTextDataBuilder? softWrap; /// Builder for text overflow handling. WrappedTextDataBuilder? overflow; /// Builder for maximum number of lines. WrappedTextDataBuilder? maxLines; /// Builder for text width basis. WrappedTextDataBuilder? textWidthBasis; /// Optional wrapper function to add container widgets around the child. WidgetTextWrapper? wrapper; /// Creates a [WrappedText]. /// /// All styling parameters are optional and use builder functions for /// dynamic, theme-aware styling. /// /// Parameters: /// - [child] (`Widget`, required): Widget to apply styling to. /// - [style] (`WrappedTextDataBuilder?`, optional): Text style builder. /// - [textAlign] (`WrappedTextDataBuilder?`, optional): Text alignment builder. /// - [softWrap] (`WrappedTextDataBuilder?`, optional): Soft wrap builder. /// - [overflow] (`WrappedTextDataBuilder?`, optional): Overflow handling builder. /// - [maxLines] (`WrappedTextDataBuilder?`, optional): Max lines builder. /// - [textWidthBasis] (`WrappedTextDataBuilder?`, optional): Text width basis builder. /// - [wrapper] (`WidgetTextWrapper?`, optional): Container wrapper function. const WrappedText({super.key, required this.child, this.style, this.textAlign, this.softWrap, this.overflow, this.maxLines, this.textWidthBasis, this.wrapper}); Widget call({Color? color, Color? backgroundColor, double? fontSize, FontWeight? fontWeight, FontStyle? fontStyle, double? letterSpacing, double? wordSpacing, TextBaseline? textBaseline, double? height, TextLeadingDistribution? leadingDistribution, Locale? locale, Paint? foreground, Paint? background, List? shadows, List? fontFeatures, List? fontVariations, TextDecoration? decoration, Color? decorationColor, TextDecorationStyle? decorationStyle, double? decorationThickness, String? debugLabel, String? fontFamily, List? fontFamilyFallback, String? package, TextOverflow? overflow}); Widget build(BuildContext context); /// Creates a copy of this [WrappedText] with modified properties. /// /// Each parameter is a builder function that, if provided, will /// replace the corresponding property in the new instance. /// If a parameter is `null`, the existing property value is retained. /// /// Parameters: /// - [style] (`ValueGetter?>?`, optional): New style builder. /// - [textAlign] (`ValueGetter?>?`, optional): New text alignment builder. /// - [softWrap] (`ValueGetter?>?`, optional): New soft wrap builder. /// - [overflow] (`ValueGetter?>?`, optional): New overflow handling builder. /// - [maxLines] (`ValueGetter?>?`, optional): New max lines builder. /// - [textWidthBasis] (`ValueGetter?>?`, optional): New text width basis builder. /// - [wrapper] (`ValueGetter?`, optional): New container wrapper function. /// - [child] (`ValueGetter?`, optional): New child widget. WrappedText copyWith({ValueGetter?>? style, ValueGetter?>? textAlign, ValueGetter?>? softWrap, ValueGetter?>? overflow, ValueGetter?>? maxLines, ValueGetter?>? textWidthBasis, ValueGetter? wrapper, ValueGetter? child}); /// Creates a copy of this [WrappedText] with an updated style. /// /// The provided [style] builder is merged with the existing style. /// /// Parameters: /// - [style] (`WrappedTextDataBuilder`, required): New style builder to merge. WrappedText copyWithStyle(WrappedTextDataBuilder style); } /// Theme configuration for [DatePicker] widget styling and behavior. /// /// Defines the visual properties and default behaviors for date picker components /// including presentation modes, calendar views, and popover positioning. Applied /// globally through [ComponentTheme] or per-instance for customization. /// /// Supports comprehensive customization of date picker appearance, initial views, /// and interaction modes to match application design requirements. class DatePickerTheme { /// Default interaction mode for date picker triggers. /// /// Determines whether date selection opens a popover or modal dialog. /// When null, uses framework default prompt mode behavior. PromptMode? mode; /// Initial calendar view to display when date picker opens. /// /// Specifies the default time period view (month, year, decade, etc.) /// shown when the calendar interface first appears. When null, uses /// framework default initial view. CalendarView? initialView; /// Initial calendar view type for date picker interface. /// /// Determines the layout style and interaction pattern of the calendar /// (grid, list, compact, etc.). When null, uses framework default view type. CalendarViewType? initialViewType; /// Alignment point on the popover for anchor attachment. /// /// Determines where the date picker popover positions itself relative /// to the anchor widget. When null, uses framework default alignment. AlignmentGeometry? popoverAlignment; /// Alignment point on the anchor widget for popover positioning. /// /// Specifies which part of the trigger widget the popover should align to. /// When null, uses framework default anchor alignment. AlignmentGeometry? popoverAnchorAlignment; /// Internal padding applied to the date picker popover content. /// /// Controls spacing around the calendar interface within the popover /// container. When null, uses framework default padding. EdgeInsetsGeometry? popoverPadding; /// Creates a [DatePickerTheme]. /// /// All parameters are optional and fall back to framework defaults when null. /// The theme can be applied globally or to specific date picker instances. const DatePickerTheme({this.mode, this.initialView, this.initialViewType, this.popoverAlignment, this.popoverAnchorAlignment, this.popoverPadding}); /// Creates a copy of this theme with specified properties overridden. DatePickerTheme copyWith({ValueGetter? mode, ValueGetter? initialView, ValueGetter? initialViewType, ValueGetter? popoverAlignment, ValueGetter? popoverAnchorAlignment, ValueGetter? popoverPadding}); bool operator ==(Object other); int get hashCode; } /// A controller for managing the selected date in a [DatePicker]. /// /// [DatePickerController] extends [ValueNotifier] to hold the currently selected /// date and notify listeners when it changes. Use this to programmatically control /// the date picker or react to date selection changes. /// /// Example: /// ```dart /// final controller = DatePickerController(DateTime.now()); /// controller.addListener(() { /// print('Selected date: ${controller.value}'); /// }); /// ``` class DatePickerController extends ValueNotifier with ComponentController { /// Creates a [DatePickerController] with the specified initial date. DatePickerController(super.value); } /// A controlled date picker widget with comprehensive date selection features. /// /// [ControlledDatePicker] provides a complete date selection interface with /// customizable presentation modes (popover or modal), calendar views, and /// flexible positioning. It integrates with [DatePickerController] for /// programmatic control. /// /// Features: /// - Multiple presentation modes (popover, modal) /// - Various calendar views (month, year, decade) /// - Custom date state builders /// - Flexible positioning /// - Optional placeholder when no date is selected /// /// Example: /// ```dart /// ControlledDatePicker( /// initialValue: DateTime.now(), /// onChanged: (date) { /// print('Selected: $date'); /// }, /// placeholder: Text('Select a date'), /// ) /// ``` class ControlledDatePicker extends StatelessWidget with ControlledComponent { /// The initial date value. DateTime? initialValue; /// Called when the selected date changes. ValueChanged? onChanged; /// Whether the date picker is enabled. bool enabled; /// Optional controller for programmatic access. DatePickerController? controller; /// Widget displayed when no date is selected. Widget? placeholder; /// Presentation mode (popover or modal). PromptMode? mode; /// Initial calendar view to display. CalendarView? initialView; /// Popover alignment relative to the anchor. AlignmentGeometry? popoverAlignment; /// Anchor alignment for popover positioning. AlignmentGeometry? popoverAnchorAlignment; /// Internal padding for the popover. EdgeInsetsGeometry? popoverPadding; /// Title for the dialog when using modal mode. Widget? dialogTitle; /// Initial calendar view type. CalendarViewType? initialViewType; /// Builder for customizing date cell states. DateStateBuilder? stateBuilder; /// Creates a [ControlledDatePicker]. const ControlledDatePicker({super.key, this.controller, this.initialValue, this.onChanged, this.enabled = true, this.placeholder, this.mode, this.initialView, this.popoverAlignment, this.popoverAnchorAlignment, this.popoverPadding, this.dialogTitle, this.initialViewType, this.stateBuilder}); Widget build(BuildContext context); } /// A date picker widget for selecting dates. /// /// Provides a date selection interface with calendar view in either /// popover or dialog mode. class DatePicker extends StatelessWidget { /// The currently selected date value. DateTime? value; /// Callback invoked when the selected date changes. ValueChanged? onChanged; /// Placeholder widget shown when no date is selected. Widget? placeholder; /// The display mode for the date picker (popover or dialog). PromptMode? mode; /// The initial calendar view to display. CalendarView? initialView; /// Alignment of the popover relative to the anchor. AlignmentGeometry? popoverAlignment; /// Anchor alignment for the popover. AlignmentGeometry? popoverAnchorAlignment; /// Padding inside the popover. EdgeInsetsGeometry? popoverPadding; /// Title widget for the dialog mode. Widget? dialogTitle; /// The initial calendar view type (date, month, or year). CalendarViewType? initialViewType; /// Builder function to determine the state of each date. DateStateBuilder? stateBuilder; /// Whether the date picker is enabled. bool? enabled; /// Creates a date picker. const DatePicker({super.key, required this.value, this.onChanged, this.placeholder, this.mode, this.initialView, this.popoverAlignment, this.popoverAnchorAlignment, this.popoverPadding, this.dialogTitle, this.initialViewType, this.stateBuilder, this.enabled}); Widget build(BuildContext context); } /// Represents a range of dates with a start and end time. /// /// Immutable value type for representing a continuous period between two dates. /// Commonly used with date range pickers to specify selected date intervals. /// /// Example: /// ```dart /// final range = DateTimeRange( /// DateTime(2024, 1, 1), /// DateTime(2024, 1, 31), /// ); /// ``` class DateTimeRange { /// The start date/time of the range. DateTime start; /// The end date/time of the range. DateTime end; /// Creates a [DateTimeRange]. /// /// Parameters: /// - [start] (`DateTime`, required): The beginning of the range. /// - [end] (`DateTime`, required): The end of the range. const DateTimeRange(this.start, this.end); bool operator ==(Object other); int get hashCode; String toString(); /// Creates a copy of this range with the given fields replaced. /// /// Parameters: /// - [start] (`ValueGetter?`, optional): New start date. /// - [end] (`ValueGetter?`, optional): New end date. /// /// Returns: A new [DateTimeRange] with updated values. DateTimeRange copyWith({ValueGetter? start, ValueGetter? end}); } /// A widget for selecting a date range. /// /// Provides an interactive date range picker that allows users to select a start /// and end date. Supports both dialog and popover presentation modes with /// customizable calendar views and state management. /// /// Example: /// ```dart /// DateRangePicker( /// value: currentRange, /// onChanged: (range) => setState(() => currentRange = range), /// mode: PromptMode.dialog, /// ) /// ``` class DateRangePicker extends StatelessWidget { /// The currently selected date range. DateTimeRange? value; /// Callback when the date range changes. ValueChanged? onChanged; /// Placeholder widget shown when no range is selected. Widget? placeholder; /// Presentation mode (dialog or popover). PromptMode mode; /// Initial calendar view to display. CalendarView? initialView; /// Initial view type (date, month, or year). CalendarViewType? initialViewType; /// Alignment of popover relative to anchor. AlignmentGeometry? popoverAlignment; /// Alignment of anchor for popover positioning. AlignmentGeometry? popoverAnchorAlignment; /// Padding inside the popover. EdgeInsetsGeometry? popoverPadding; /// Title widget for dialog mode. Widget? dialogTitle; /// Callback to determine date state (enabled/disabled). DateStateBuilder? stateBuilder; /// Creates a [DateRangePicker]. /// /// Parameters: /// - [value] (`DateTimeRange?`, required): Current selected range. /// - [onChanged] (`ValueChanged?`, optional): Called when range changes. /// - [placeholder] (`Widget?`, optional): Shown when no range selected. /// - [mode] (`PromptMode`, default: `PromptMode.dialog`): Presentation mode. /// - [initialView] (`CalendarView?`, optional): Starting calendar view. /// - [initialViewType] (`CalendarViewType?`, optional): Starting view type. /// - [popoverAlignment] (`AlignmentGeometry?`, optional): Popover alignment. /// - [popoverAnchorAlignment] (`AlignmentGeometry?`, optional): Anchor alignment. /// - [popoverPadding] (`EdgeInsetsGeometry?`, optional): Popover padding. /// - [dialogTitle] (`Widget?`, optional): Dialog title. /// - [stateBuilder] (`DateStateBuilder?`, optional): Date state callback. const DateRangePicker({super.key, required this.value, this.onChanged, this.placeholder, this.mode = PromptMode.dialog, this.initialView, this.popoverAlignment, this.popoverAnchorAlignment, this.popoverPadding, this.dialogTitle, this.initialViewType, this.stateBuilder}); Widget build(BuildContext context); } /// Theme data for customizing [InputOTP] widget appearance. /// /// This class defines the visual properties that can be applied to /// [InputOTP] widgets, including spacing between OTP input fields /// and the height of the input containers. These properties can be /// set at the theme level to provide consistent styling across the application. class InputOTPTheme { /// Horizontal spacing between OTP input fields. double? spacing; /// Height of each OTP input container. double? height; /// Creates an [InputOTPTheme]. /// /// Parameters: /// - [spacing] (`double?`, optional): Space between input fields. /// - [height] (`double?`, optional): Height of input containers. const InputOTPTheme({this.spacing, this.height}); /// Creates a copy of this theme with specified properties overridden. /// /// Parameters: /// - [spacing] (`ValueGetter?`, optional): New spacing value. /// - [height] (`ValueGetter?`, optional): New height value. /// /// Returns: A new [InputOTPTheme] with updated properties. InputOTPTheme copyWith({ValueGetter? spacing, ValueGetter? height}); bool operator ==(Object other); int get hashCode; } /// Abstract base class for OTP input child elements. /// /// Defines the interface for children that can be placed within an [InputOTP] /// widget, including actual input fields, separators, and spacers. /// Subclasses implement the [build] method to render their content. /// /// Common factories: /// - [separator]: Creates a visual separator between OTP groups. /// - [space]: Creates spacing between OTP input fields. /// - [empty]: Creates an empty placeholder. /// - [InputOTPChild.input]: Creates a configurable character input. /// - [InputOTPChild.character]: Creates a character input with preset filters. /// /// Example: /// ```dart /// InputOTP( /// children: [ /// InputOTPChild.input(predicate: (cp) => cp >= 48 && cp <= 57), /// InputOTPChild.space, /// InputOTPChild.input(), /// ], /// ) /// ``` abstract class InputOTPChild { /// A visual separator between OTP groups (e.g., a dash or line). static InputOTPChild get separator; /// Spacing between OTP input fields. static InputOTPChild get space; /// An empty placeholder that takes no space. static InputOTPChild get empty; /// Creates a customizable character input field. /// /// Parameters: /// - [predicate] (`CodepointPredicate?`, optional): Function to validate codepoints. /// - [transform] (`CodepointUnaryOperator?`, optional): Function to transform codepoints. /// - [obscured] (`bool`, default: `false`): Whether to obscure the input. /// - [readOnly] (`bool`, default: `false`): Whether the input is read-only. /// - [keyboardType] (`TextInputType?`, optional): Keyboard type for input. /// /// Returns: A [CharacterInputOTPChild] configured with the specified options. factory InputOTPChild.input({CodepointPredicate? predicate, CodepointUnaryOperator? transform, bool obscured = false, bool readOnly = false, TextInputType? keyboardType}); /// Creates a character input with alphabet and digit filtering. /// /// Parameters: /// - [allowLowercaseAlphabet] (`bool`, default: `false`): Allow lowercase letters. /// - [allowUppercaseAlphabet] (`bool`, default: `false`): Allow uppercase letters. /// - [allowDigit] (`bool`, default: `false`): Allow numeric digits. /// - [obscured] (`bool`, default: `false`): Whether to obscure the input. /// - [onlyUppercaseAlphabet] (`bool`, default: `false`): Convert to uppercase only. /// - [onlyLowercaseAlphabet] (`bool`, default: `false`): Convert to lowercase only. /// - [readOnly] (`bool`, default: `false`): Whether the input is read-only. /// - [keyboardType] (`TextInputType?`, optional): Keyboard type for input. /// /// Returns: A [CharacterInputOTPChild] configured for alphabet/digit input. /// /// Example: /// ```dart /// InputOTPChild.character( /// allowDigit: true, /// allowUppercaseAlphabet: true, /// ) /// ``` factory InputOTPChild.character({bool allowLowercaseAlphabet = false, bool allowUppercaseAlphabet = false, bool allowDigit = false, bool obscured = false, bool onlyUppercaseAlphabet = false, bool onlyLowercaseAlphabet = false, bool readOnly = false, TextInputType? keyboardType}); /// Creates an [InputOTPChild]. const InputOTPChild(); /// Builds the widget for this OTP child. /// /// Parameters: /// - [context] (`BuildContext`, required): The build context. /// - [data] (`InputOTPChildData`, required): Data for building the child. /// /// Returns: The widget representing this OTP child. Widget build(BuildContext context, InputOTPChildData data); /// Whether this child can hold a value (i.e., is an input field). bool get hasValue; } /// A character-based OTP input field with validation and transformation. /// /// Supports filtering input based on codepoint predicates and transforming /// input characters (e.g., converting to uppercase). Commonly used for /// creating numeric or alphanumeric OTP fields. /// /// Example: /// ```dart /// CharacterInputOTPChild( /// predicate: CharacterInputOTPChild.isDigit, /// keyboardType: TextInputType.number, /// ) /// ``` class CharacterInputOTPChild extends InputOTPChild { /// Tests if the codepoint is a lowercase letter (a-z). /// /// Parameters: /// - [codepoint] (`int`, required): The codepoint to test. /// /// Returns: `true` if the codepoint is a lowercase letter. static bool isAlphabetLower(int codepoint); /// Tests if the codepoint is an uppercase letter (A-Z). /// /// Parameters: /// - [codepoint] (`int`, required): The codepoint to test. /// /// Returns: `true` if the codepoint is an uppercase letter. static bool isAlphabetUpper(int codepoint); /// Converts a lowercase letter to uppercase. /// /// Parameters: /// - [codepoint] (`int`, required): The codepoint to convert. /// /// Returns: The uppercase codepoint if lowercase, otherwise unchanged. static int lowerToUpper(int codepoint); /// Converts an uppercase letter to lowercase. /// /// Parameters: /// - [codepoint] (`int`, required): The codepoint to convert. /// /// Returns: The lowercase codepoint if uppercase, otherwise unchanged. static int upperToLower(int codepoint); /// Tests if the codepoint is a digit (0-9). /// /// Parameters: /// - [codepoint] (`int`, required): The codepoint to test. /// /// Returns: `true` if the codepoint is a digit. static bool isDigit(int codepoint); /// Predicate to validate allowed codepoints. CodepointPredicate? predicate; /// Function to transform codepoints before storing. CodepointUnaryOperator? transform; /// Whether to obscure the input character. bool obscured; /// Whether the input is read-only. bool readOnly; /// The keyboard type to use for input. TextInputType? keyboardType; /// Creates a [CharacterInputOTPChild]. /// /// Parameters: /// - [predicate] (`CodepointPredicate?`, optional): Validates input codepoints. /// - [transform] (`CodepointUnaryOperator?`, optional): Transforms codepoints. /// - [obscured] (`bool`, default: `false`): Whether to obscure the character. /// - [readOnly] (`bool`, default: `false`): Whether the field is read-only. /// - [keyboardType] (`TextInputType?`, optional): Keyboard type for input. const CharacterInputOTPChild({this.predicate, this.transform, this.obscured = false, this.readOnly = false, this.keyboardType}); bool get hasValue; Widget build(BuildContext context, InputOTPChildData data); } /// A widget-based OTP child that doesn't accept input. /// /// Used for displaying static content like separators or spacers within /// an [InputOTP] widget. This child does not hold any value. /// /// Example: /// ```dart /// WidgetInputOTPChild( /// Icon(Icons.arrow_forward), /// ) /// ``` class WidgetInputOTPChild extends InputOTPChild { /// The widget to display. Widget child; /// Creates a [WidgetInputOTPChild]. /// /// Parameters: /// - [child] (`Widget`, required): The widget to display. const WidgetInputOTPChild(this.child); Widget build(BuildContext context, InputOTPChildData data); bool get hasValue; } /// A visual separator for OTP input groups. /// /// Displays a dash "-" character between groups of OTP input fields. /// Automatically applies theming and spacing based on the current theme. /// /// Example: /// ```dart /// InputOTP( /// children: [ /// InputOTPChild.input(), /// OTPSeparator(), /// InputOTPChild.input(), /// ], /// ) /// ``` class OTPSeparator extends StatelessWidget { /// Creates an [OTPSeparator]. const OTPSeparator({super.key}); Widget build(BuildContext context); } /// Data passed to [InputOTPChild.build] for rendering OTP input fields. /// /// Contains information about focus nodes, index positions, current value, /// and callbacks for changing values. Used internally by [InputOTP] to /// coordinate input fields. class InputOTPChildData { /// Focus node for the previous input field. FocusNode? previousFocusNode; /// Focus node for this input field. FocusNode? focusNode; /// Focus node for the next input field. FocusNode? nextFocusNode; /// Overall index within all OTP children. int index; /// Index of the group this child belongs to. int groupIndex; /// Total number of children in this group. int groupLength; /// Relative index within the group. int relativeIndex; /// Current value (codepoint) of this input field. int? value; /// Updates the value for this OTP input field. /// /// Parameters: /// - [value] (`int?`, required): The new codepoint value or null. void changeValue(int? value); } /// Extension methods for [OTPCodepointList]. extension OTPCodepointListExtension on OTPCodepointList { /// Converts the codepoint list to a string. /// /// Null values are converted to empty strings. /// /// Returns: A string representation of the OTP code. /// /// Example: /// ```dart /// final codes = [49, 50, 51]; // '1', '2', '3' /// print(codes.otpToString()); // '123' /// ``` String otpToString(); } /// A specialized input widget for One-Time Password (OTP) and verification code entry. /// /// [InputOTP] provides a user-friendly interface for entering OTP codes, verification /// numbers, and similar sequential input scenarios. The widget displays a series of /// individual input fields that automatically advance focus as the user types, /// creating an intuitive experience for multi-digit input. /// /// Key features: /// - Sequential character input with automatic focus advancement /// - Customizable field layout with separators and spacing /// - Support for various character types (digits, letters, symbols) /// - Keyboard navigation and clipboard paste support /// - Form integration with validation support /// - Accessibility features for screen readers /// - Theming and visual customization /// /// The widget uses a flexible child system that allows mixing input fields /// with separators, spaces, and custom widgets: /// - Character input fields for actual OTP digits/letters /// - Separators for visual grouping (e.g., dashes, dots) /// - Spacing elements for layout control /// - Custom widgets for specialized display needs /// /// Common use cases: /// - SMS verification codes (e.g., 6-digit codes) /// - Two-factor authentication tokens /// - Credit card security codes /// - License key input /// - PIN code entry /// /// Example: /// ```dart /// InputOTP( /// children: [ /// CharacterInputOTPChild(), /// CharacterInputOTPChild(), /// CharacterInputOTPChild(), /// InputOTPChild.separator, /// CharacterInputOTPChild(), /// CharacterInputOTPChild(), /// CharacterInputOTPChild(), /// ], /// onChanged: (code) => _handleOTPChange(code), /// onSubmitted: (code) => _verifyOTP(code), /// ); /// ``` class InputOTP extends StatefulWidget { /// The list of children defining input fields, separators, and spaces. List children; /// Initial OTP codepoint values. OTPCodepointList? initialValue; /// Called when the OTP value changes. ValueChanged? onChanged; /// Called when the user submits the OTP (e.g., presses Enter on last field). ValueChanged? onSubmitted; /// Creates an [InputOTP] widget. /// /// Parameters: /// - [children] (`List`, required): The OTP input fields and decorations. /// - [initialValue] (`OTPCodepointList?`, optional): Initial codepoints. /// - [onChanged] (`ValueChanged?`, optional): Value change callback. /// - [onSubmitted] (`ValueChanged?`, optional): Submit callback. const InputOTP({super.key, required this.children, this.initialValue, this.onChanged, this.onSubmitted}); State createState(); } /// Defines how a form field editor is presented to the user. /// /// [PromptMode] determines whether the field editor appears in a modal /// dialog or a popover overlay. enum PromptMode { dialog, popover } /// A form field widget for complex object values. /// /// [ObjectFormField] provides a button-like trigger that opens an editor /// (in a dialog or popover) for selecting/editing complex values. The field /// displays the selected value using a custom builder. /// /// Useful for date pickers, color pickers, file selectors, and other /// complex input scenarios where a simple text field isn't sufficient. /// /// Example: /// ```dart /// ObjectFormField( /// value: selectedDate, /// placeholder: Text('Select date'), /// builder: (context, date) => Text(formatDate(date)), /// editorBuilder: (context, handler) => CalendarWidget(), /// mode: PromptMode.dialog, /// ) /// ``` class ObjectFormField extends StatefulWidget { /// The current value of the field. T? value; /// Called when the value changes. ValueChanged? onChanged; /// Widget displayed when no value is selected. Widget placeholder; /// Builds the display for the selected value. Widget Function(BuildContext context, T value) builder; /// Optional leading widget (e.g., icon). Widget? leading; /// Optional trailing widget (e.g., dropdown arrow). Widget? trailing; /// How the editor is presented (dialog or popover). PromptMode mode; /// Builds the editor widget. Widget Function(BuildContext context, ObjectFormHandler handler) editorBuilder; /// Popover alignment relative to the trigger. AlignmentGeometry? popoverAlignment; /// Anchor alignment for popover positioning. AlignmentGeometry? popoverAnchorAlignment; /// Padding inside the popover. EdgeInsetsGeometry? popoverPadding; /// Title for the dialog mode. Widget? dialogTitle; /// Button size for the trigger. ButtonSize? size; /// Button density for the trigger. ButtonDensity? density; /// Button shape for the trigger. ButtonShape? shape; /// Custom dialog action buttons. List Function(BuildContext context, ObjectFormHandler handler)? dialogActions; /// Whether the field is enabled. bool? enabled; /// Whether to show the field decoration. bool decorate; /// Creates an [ObjectFormField]. const ObjectFormField({super.key, required this.value, this.onChanged, required this.placeholder, required this.builder, this.leading, this.trailing, this.mode = PromptMode.dialog, required this.editorBuilder, this.popoverAlignment, this.popoverAnchorAlignment, this.popoverPadding, this.dialogTitle, this.size, this.density, this.shape, this.dialogActions, this.enabled, this.decorate = true}); State> createState(); } /// Abstract interface for controlling an object form field's state. /// /// [ObjectFormHandler] provides methods to interact with an object form field, /// including getting/setting values and controlling the editor visibility. abstract class ObjectFormHandler { /// Gets the current value. T? get value; /// Sets the current value. set value(T? value); /// Opens the editor with an optional initial value. void prompt([T? value]); /// Closes the editor. Future close(); /// Finds the [ObjectFormHandler] in the widget tree. static ObjectFormHandler of(BuildContext context); /// Finds the [ObjectFormHandler] in the widget tree (alternative method). static ObjectFormHandler find(BuildContext context); } /// State class for [ObjectFormField] managing form value and user interactions. /// /// Handles value updates, popover/dialog display, and integrates with the /// form validation system. This state also determines whether the field is /// enabled based on the presence of an `onChanged` callback. class ObjectFormFieldState extends State> with FormValueSupplier> { void initState(); /// Gets the current form value. /// /// Returns: The current value of type `T?`. T? get value; /// Sets a new form value and notifies listeners. /// /// Parameters: /// - [value] (`T?`, required): The new value to set. set value(T? value); void didReplaceFormValue(T value); void didUpdateWidget(covariant ObjectFormField oldWidget); /// Whether this field is enabled. /// /// Returns true if explicitly enabled or if an `onChanged` callback exists. bool get enabled; void dispose(); /// Prompts the user to select or edit a value via dialog or popover. /// /// Displays the appropriate UI based on the configured [PromptMode]. /// /// Parameters: /// - [value] (`T?`, optional): An initial value to display in the prompt. /// /// Example: /// ```dart /// fieldState.prompt(initialValue); /// ``` void prompt([T? value]); Widget build(BuildContext context); } /// Holds the result value from an object form field dialog. /// /// Used to pass the selected or edited value back from a dialog prompt. /// /// Example: /// ```dart /// final result = ObjectFormFieldDialogResult(DateTime.now()); /// Navigator.of(context).pop(result); /// ``` class ObjectFormFieldDialogResult { /// The value selected or edited by the user. T? value; /// Creates an [ObjectFormFieldDialogResult]. /// /// Parameters: /// - [value] (`T?`, required): The result value. ObjectFormFieldDialogResult(this.value); } /// Theme data for customizing [Select] widget appearance and behavior. /// /// This class defines the visual and behavioral properties that can be applied to /// [Select] widgets, including popup constraints, positioning, styling, and /// interaction behaviors. These properties can be set at the theme level /// to provide consistent behavior across the application. class SelectTheme { /// Constraints for the popup menu size. BoxConstraints? popupConstraints; /// Alignment of the popover relative to the anchor. AlignmentGeometry? popoverAlignment; /// Anchor alignment for the popover. AlignmentGeometry? popoverAnchorAlignment; /// Border radius for select items. BorderRadiusGeometry? borderRadius; /// Padding inside select items. EdgeInsetsGeometry? padding; /// Whether to disable hover effects on items. bool? disableHoverEffect; /// Whether the selected item can be unselected. bool? canUnselect; /// Whether to automatically close the popover after selection. bool? autoClosePopover; /// Creates a select theme. const SelectTheme({this.popupConstraints, this.popoverAlignment, this.popoverAnchorAlignment, this.borderRadius, this.padding, this.disableHoverEffect, this.canUnselect, this.autoClosePopover}); /// Creates a copy of this theme with the given fields replaced. SelectTheme copyWith({ValueGetter? popupConstraints, ValueGetter? popoverAlignment, ValueGetter? popoverAnchorAlignment, ValueGetter? borderRadius, ValueGetter? padding, ValueGetter? disableHoverEffect, ValueGetter? canUnselect, ValueGetter? autoClosePopover}); bool operator ==(Object other); int get hashCode; } /// Controller for managing [ControlledSelect] state programmatically. /// /// Extends [ValueNotifier] to provide reactive state management for select /// components. Can be used to programmatically change selection, listen to /// state changes, and integrate with forms and other reactive systems. /// /// Example: /// ```dart /// final controller = SelectController('initial'); /// /// // Listen to changes /// controller.addListener(() { /// print('Selection changed to: ${controller.value}'); /// }); /// /// // Update selection /// controller.value = 'new_value'; /// ``` class SelectController extends ValueNotifier with ComponentController { /// Creates a [SelectController] with an optional initial value. /// /// The [value] parameter sets the initial selected item. Can be null /// to start with no selection. /// /// Parameters: /// - [value] (T?, optional): Initial selected value SelectController([super.value]); } /// Reactive single-selection dropdown with automatic state management. /// /// A high-level select widget that provides automatic state management through /// the controlled component pattern. Supports both controller-based and callback-based /// state management with comprehensive customization options for item presentation, /// popup behavior, and interaction handling. /// /// ## Features /// /// - **Flexible item rendering**: Custom builders for complete visual control over items /// - **Popup positioning**: Configurable alignment and constraints for the dropdown /// - **Keyboard navigation**: Full keyboard support with arrow keys and Enter/Escape /// - **Form integration**: Automatic validation and form field registration /// - **Unselection support**: Optional ability to deselect the current selection /// /// ## Usage Patterns /// /// **Controller-based (recommended for complex state):** /// ```dart /// final controller = SelectController('apple'); /// /// ControlledSelect( /// controller: controller, /// items: ['apple', 'banana', 'cherry'], /// itemBuilder: (context, item) => Text(item), /// placeholder: Text('Choose fruit'), /// ) /// ``` /// /// **Callback-based (simple state management):** /// ```dart /// String? selectedFruit; /// /// ControlledSelect( /// initialValue: selectedFruit, /// onChanged: (fruit) => setState(() => selectedFruit = fruit), /// items: ['apple', 'banana', 'cherry'], /// itemBuilder: (context, item) => Text(item), /// ) /// ``` class ControlledSelect extends StatelessWidget with ControlledComponent, SelectBase { T? initialValue; ValueChanged? onChanged; bool enabled; SelectController? controller; Widget? placeholder; bool filled; FocusNode? focusNode; BoxConstraints? constraints; BoxConstraints? popupConstraints; PopoverConstraint popupWidthConstraint; BorderRadiusGeometry? borderRadius; EdgeInsetsGeometry? padding; AlignmentGeometry popoverAlignment; AlignmentGeometry? popoverAnchorAlignment; bool disableHoverEffect; bool canUnselect; bool autoClosePopover; SelectPopupBuilder popup; SelectValueBuilder itemBuilder; SelectValueSelectionHandler? valueSelectionHandler; SelectValueSelectionPredicate? valueSelectionPredicate; Predicate? showValuePredicate; /// Creates a [ControlledSelect]. /// /// Either [controller] or [onChanged] should be provided for interactivity. /// The widget supports both controller-based and callback-based state management /// patterns depending on application architecture needs. /// /// Parameters: /// - [controller] (`SelectController?`, optional): external state controller /// - [initialValue] (T?, optional): starting selection when no controller /// - [onChanged] (`ValueChanged?`, optional): selection change callback /// - [enabled] (bool, default: true): whether select is interactive /// - [placeholder] (Widget?, optional): widget shown when no item selected /// - [filled] (bool, default: false): whether to use filled appearance /// - [focusNode] (FocusNode?, optional): custom focus node for keyboard handling /// - [constraints] (BoxConstraints?, optional): size constraints for select widget /// - [popupConstraints] (BoxConstraints?, optional): size constraints for popup /// - [popupWidthConstraint] (PopoverConstraint, default: anchorFixedSize): popup width behavior /// - [borderRadius] (BorderRadiusGeometry?, optional): override select border radius /// - [padding] (EdgeInsetsGeometry?, optional): override internal padding /// - [popoverAlignment] (AlignmentGeometry, default: topCenter): popup alignment /// - [popoverAnchorAlignment] (AlignmentGeometry?, optional): anchor alignment /// - [disableHoverEffect] (bool, default: false): disable item hover effects /// - [canUnselect] (bool, default: false): allow deselecting current item /// - [autoClosePopover] (bool, default: true): close popup after selection /// - [popup] (SelectPopupBuilder, required): builder for popup content /// - [itemBuilder] (`SelectItemBuilder`, required): builder for individual items /// - [valueSelectionHandler] (`SelectValueSelectionHandler?`, optional): custom selection logic /// - [valueSelectionPredicate] (`SelectValueSelectionPredicate?`, optional): selection validation /// - [showValuePredicate] (`Predicate?`, optional): visibility filter for values /// /// Example: /// ```dart /// ControlledSelect( /// controller: controller, /// popup: (context, items) => ListView(children: items), /// itemBuilder: (context, item, selected) => Text(item), /// placeholder: Text('Select option'), /// ) /// ``` const ControlledSelect({super.key, this.controller, this.onChanged, this.enabled = true, this.initialValue, this.placeholder, this.filled = false, this.focusNode, this.constraints, this.popupConstraints, this.popupWidthConstraint = PopoverConstraint.anchorFixedSize, this.borderRadius, this.padding, this.popoverAlignment = Alignment.topCenter, this.popoverAnchorAlignment, this.disableHoverEffect = false, this.canUnselect = false, this.autoClosePopover = true, required this.popup, required this.itemBuilder, this.valueSelectionHandler, this.valueSelectionPredicate, this.showValuePredicate}); Widget build(BuildContext context); } /// Controller for managing [ControlledMultiSelect] state programmatically. /// /// Extends [SelectController] to provide reactive state management for multi-selection /// components. Manages a collection of selected items with methods for adding, /// removing, and bulk operations. /// /// Example: /// ```dart /// final controller = MultiSelectController(['apple', 'banana']); /// /// // Listen to changes /// controller.addListener(() { /// print('Selection changed to: ${controller.value}'); /// }); /// /// // Update selection /// controller.value = ['apple', 'cherry']; /// ``` class MultiSelectController extends SelectController> { /// Creates a [MultiSelectController] with an optional initial selection. /// /// The [value] parameter sets the initial selected items collection. /// Can be null or empty to start with no selections. /// /// Parameters: /// - [value] (`Iterable?`, optional): Initial selected items MultiSelectController([super.value]); } /// Reactive multi-selection dropdown with automatic state management. /// /// A high-level multi-select widget that provides automatic state management through /// the controlled component pattern. Supports both controller-based and callback-based /// state management with comprehensive customization options for item presentation, /// selection behavior, and popup management. /// /// ## Features /// /// - **Multiple selection**: Select and deselect multiple items simultaneously /// - **Flexible item rendering**: Custom builders for complete visual control over items /// - **Selection indicators**: Built-in checkboxes or custom selection indicators /// - **Popup positioning**: Configurable alignment and constraints for the dropdown /// - **Keyboard navigation**: Full keyboard support with Space for selection toggle /// - **Form integration**: Automatic validation and form field registration /// /// ## Usage Patterns /// /// **Controller-based (recommended for complex state):** /// ```dart /// final controller = MultiSelectController(['apple']); /// /// ControlledMultiSelect( /// controller: controller, /// items: ['apple', 'banana', 'cherry', 'date'], /// itemBuilder: (context, item, selected) => ListTile( /// leading: Checkbox(value: selected), /// title: Text(item), /// ), /// placeholder: Text('Choose fruits'), /// ) /// ``` /// /// **Callback-based (simple state management):** /// ```dart /// List selectedFruits = []; /// /// ControlledMultiSelect( /// initialValue: selectedFruits, /// onChanged: (fruits) => setState(() => selectedFruits = fruits?.toList() ?? []), /// items: ['apple', 'banana', 'cherry'], /// itemBuilder: (context, item, selected) => Text(item), /// ) /// ``` class ControlledMultiSelect extends StatelessWidget with ControlledComponent?>, SelectBase> { Iterable? initialValue; ValueChanged?>? onChanged; bool enabled; MultiSelectController? controller; Widget? placeholder; bool filled; FocusNode? focusNode; BoxConstraints? constraints; BoxConstraints? popupConstraints; PopoverConstraint popupWidthConstraint; BorderRadiusGeometry? borderRadius; EdgeInsetsGeometry? padding; AlignmentGeometry popoverAlignment; AlignmentGeometry? popoverAnchorAlignment; bool disableHoverEffect; bool canUnselect; bool autoClosePopover; SelectPopupBuilder popup; SelectValueBuilder> get itemBuilder; SelectValueSelectionHandler>? valueSelectionHandler; SelectValueSelectionPredicate>? valueSelectionPredicate; Predicate>? showValuePredicate; /// Builder for rendering individual items in multi-select mode. SelectValueBuilder multiItemBuilder; /// Creates a [ControlledMultiSelect]. /// /// Either [controller] or [onChanged] should be provided for interactivity. /// The widget supports both controller-based and callback-based state management /// patterns with multiple item selection capabilities. /// /// Parameters: /// - [controller] (`MultiSelectController?`, optional): external state controller /// - [initialValue] (`Iterable?`, optional): starting selection when no controller /// - [onChanged] (`ValueChanged?>?`, optional): selection change callback /// - [enabled] (bool, default: true): whether select is interactive /// - [placeholder] (Widget?, optional): widget shown when no items selected /// - [filled] (bool, default: false): whether to use filled appearance /// - [focusNode] (FocusNode?, optional): custom focus node for keyboard handling /// - [constraints] (BoxConstraints?, optional): size constraints for select widget /// - [popupConstraints] (BoxConstraints?, optional): size constraints for popup /// - [popupWidthConstraint] (PopoverConstraint, default: anchorFixedSize): popup width behavior /// - [borderRadius] (BorderRadiusGeometry?, optional): override select border radius /// - [padding] (EdgeInsetsGeometry?, optional): override internal padding /// - [popoverAlignment] (AlignmentGeometry, default: topCenter): popup alignment /// - [popoverAnchorAlignment] (AlignmentGeometry?, optional): anchor alignment /// - [disableHoverEffect] (bool, default: false): disable item hover effects /// - [canUnselect] (bool, default: false): allow deselecting all items /// - [autoClosePopover] (bool, default: false): close popup after each selection /// - [popup] (SelectPopupBuilder, required): builder for popup content /// - [itemBuilder] (`SelectItemBuilder`, required): builder for individual items /// - [multiItemBuilder] (`SelectValueBuilder`, required): builder for selected items display /// - [valueSelectionHandler] (`SelectValueSelectionHandler>?`, optional): custom selection logic /// - [valueSelectionPredicate] (`SelectValueSelectionPredicate>?`, optional): selection validation /// - [showValuePredicate] (`Predicate>?`, optional): visibility filter for values /// /// Example: /// ```dart /// ControlledMultiSelect( /// controller: controller, /// popup: (context, items) => ListView(children: items), /// itemBuilder: (context, item, selected) => CheckboxListTile( /// value: selected, /// title: Text(item), /// ), /// multiItemBuilder: (context, items) => Wrap( /// children: items.map((item) => Chip(label: Text(item))).toList(), /// ), /// ) /// ``` const ControlledMultiSelect({super.key, this.controller, this.onChanged, this.enabled = true, this.initialValue, this.placeholder, this.filled = false, this.focusNode, this.constraints, this.popupConstraints, this.popupWidthConstraint = PopoverConstraint.anchorFixedSize, this.borderRadius, this.padding, this.popoverAlignment = Alignment.topCenter, this.popoverAnchorAlignment, this.disableHoverEffect = false, this.canUnselect = true, this.autoClosePopover = false, this.showValuePredicate, required this.popup, required SelectValueBuilder itemBuilder, this.valueSelectionHandler, this.valueSelectionPredicate}); Widget build(BuildContext context); } /// A button widget representing a selectable item in a dropdown menu. /// /// Used within select dropdowns to create clickable option items. class SelectItemButton extends StatelessWidget { /// The value this item represents. T value; /// The child widget to display as the item content. Widget child; /// The button style for this item. AbstractButtonStyle style; /// Whether this item is enabled. bool? enabled; /// Creates a select item button. const SelectItemButton({super.key, required this.value, required this.child, this.enabled, this.style = const ButtonStyle.ghost()}); Widget build(BuildContext context); } /// A container for grouping related select items with optional headers and footers. /// /// Organizes select menu items into logical sections with optional header /// and footer widgets. class SelectGroup extends StatelessWidget { /// Optional header widgets displayed above the group. List? headers; /// The list of select items in this group. List children; /// Optional footer widgets displayed below the group. List? footers; /// Creates a select group. const SelectGroup({super.key, this.headers, this.footers, required this.children}); Widget build(BuildContext context); } /// Represents a selectable item in a dropdown menu. /// /// Used within select popups to define individual selectable options. /// Automatically applies selected state styling when the item matches /// the current selection. /// /// Example: /// ```dart /// SelectItem( /// value: 'option1', /// builder: (context) => Text('Option 1'), /// ) /// ``` class SelectItem extends StatelessWidget { /// Builder for the item's content. WidgetBuilder builder; /// The value associated with this item. Object? value; /// Creates a [SelectItem]. /// /// Parameters: /// - [value] (`Object?`, required): Item value. /// - [builder] (`WidgetBuilder`, required): Content builder. const SelectItem({super.key, required this.value, required this.builder}); Widget build(BuildContext context); } /// A label widget for grouping items in a select popup. /// /// Displays a non-selectable label to organize dropdown items into categories. /// /// Example: /// ```dart /// SelectLabel( /// child: Text('Category Name'), /// ) /// ``` class SelectLabel extends StatelessWidget { /// The label content. Widget child; /// Creates a [SelectLabel]. /// /// Parameters: /// - [child] (`Widget`, required): Label content. const SelectLabel({super.key, required this.child}); Widget build(BuildContext context); } /// Common interface for select components. /// /// Defines the contract for both single and multi-select widgets, providing /// properties for popup behavior, styling, and value handling. mixin SelectBase { /// Callback when selection changes. ValueChanged? get onChanged; /// Placeholder widget shown when nothing is selected. Widget? get placeholder; /// Whether to use filled appearance style. bool get filled; /// Focus node for keyboard navigation. FocusNode? get focusNode; /// Size constraints for the select trigger. BoxConstraints? get constraints; /// Size constraints for the popup menu. BoxConstraints? get popupConstraints; /// How popup width should relate to trigger width. PopoverConstraint get popupWidthConstraint; /// Border radius of the select trigger. BorderRadiusGeometry? get borderRadius; /// Internal padding of the select trigger. EdgeInsetsGeometry? get padding; /// Alignment of popup relative to trigger. AlignmentGeometry get popoverAlignment; /// Alignment of anchor point for popup positioning. AlignmentGeometry? get popoverAnchorAlignment; /// Whether to disable hover effects. bool get disableHoverEffect; /// Whether clicking selected item deselects it. bool get canUnselect; /// Whether popup auto-closes after selection. bool? get autoClosePopover; /// Builder for popup content. SelectPopupBuilder get popup; /// Builder for rendering selected values. SelectValueBuilder get itemBuilder; /// Custom selection handler logic. SelectValueSelectionHandler? get valueSelectionHandler; /// Predicate for testing selection state. SelectValueSelectionPredicate? get valueSelectionPredicate; /// Predicate for showing value in trigger. Predicate? get showValuePredicate; } /// A customizable dropdown selection widget for single-value selection. /// /// [Select] provides a comprehensive dropdown selection experience with support for /// custom item rendering, keyboard navigation, search functionality, and extensive /// customization options. It displays a trigger button that opens a popup containing /// selectable options when activated. /// /// Key features: /// - Single-value selection with optional null/unselect capability /// - Customizable item rendering through builder functions /// - Keyboard navigation and accessibility support /// - Configurable popup positioning and constraints /// - Search and filtering capabilities /// - Focus management and interaction handling /// - Theming and visual customization /// - Form integration and validation support /// /// The widget supports various configuration modes: /// - Filled or outlined appearance styles /// - Custom popup positioning and alignment /// - Conditional item visibility and selection /// - Hover effects and interaction feedback /// - Auto-closing popup behavior /// /// Selection behavior can be customized through: /// - [valueSelectionHandler]: Custom logic for handling selection /// - [valueSelectionPredicate]: Conditions for allowing selection /// - [showValuePredicate]: Conditions for displaying items /// - [canUnselect]: Whether to allow deselecting the current value /// /// Example: /// ```dart /// Select( /// value: selectedItem, /// placeholder: Text('Choose an option'), /// onChanged: (value) => setState(() => selectedItem = value), /// popup: SelectPopup.menu( /// children: [ /// SelectItem(value: 'option1', child: Text('Option 1')), /// SelectItem(value: 'option2', child: Text('Option 2')), /// SelectItem(value: 'option3', child: Text('Option 3')), /// ], /// ), /// ); /// ``` class Select extends StatefulWidget with SelectBase { /// Default maximum height for select popups in logical pixels. static const kDefaultSelectMaxHeight = 240.0; ValueChanged? onChanged; Widget? placeholder; bool filled; FocusNode? focusNode; BoxConstraints? constraints; BoxConstraints? popupConstraints; PopoverConstraint popupWidthConstraint; /// The currently selected value. T? value; BorderRadiusGeometry? borderRadius; EdgeInsetsGeometry? padding; AlignmentGeometry popoverAlignment; AlignmentGeometry? popoverAnchorAlignment; bool disableHoverEffect; bool canUnselect; bool? autoClosePopover; /// Whether the select is enabled for user interaction. bool? enabled; SelectPopupBuilder popup; SelectValueBuilder itemBuilder; SelectValueSelectionHandler? valueSelectionHandler; SelectValueSelectionPredicate? valueSelectionPredicate; Predicate? showValuePredicate; /// Creates a single-selection dropdown widget. /// /// The [popup] and [itemBuilder] parameters are required to define the /// dropdown content and how selected values are displayed. /// /// Parameters: /// - [key] (Key?): Widget key for controlling widget identity /// - [onChanged] (`ValueChanged?`): Callback when selection changes; if null, select is disabled /// - [placeholder] (Widget?): Widget shown when no value is selected /// - [filled] (bool): Whether to use filled background style, defaults to false /// - [focusNode] (FocusNode?): Focus node for keyboard interaction /// - [constraints] (BoxConstraints?): Size constraints for the select button /// - [popupConstraints] (BoxConstraints?): Size constraints for the popup menu /// - [popupWidthConstraint] (PopoverConstraint): Width constraint mode for popup, defaults to `PopoverConstraint.anchorFixedSize` /// - [value] (T?): Currently selected value /// - [disableHoverEffect] (bool): Whether to disable hover visual feedback, defaults to false /// - [borderRadius] (BorderRadiusGeometry?): Custom border radius /// - [padding] (EdgeInsetsGeometry?): Custom padding /// - [popoverAlignment] (AlignmentGeometry): Popup alignment, defaults to `Alignment.topCenter` /// - [popoverAnchorAlignment] (AlignmentGeometry?): Anchor alignment for popup positioning /// - [canUnselect] (bool): Whether user can deselect current value, defaults to false /// - [autoClosePopover] (bool?): Whether popup closes after selection, defaults to true /// - [enabled] (bool?): Whether select is enabled for interaction /// - [valueSelectionHandler] (`SelectValueSelectionHandler?`): Custom selection logic /// - [valueSelectionPredicate] (`SelectValueSelectionPredicate?`): Predicate for allowing selection /// - [showValuePredicate] (`Predicate?`): Predicate for showing items /// - [popup] (SelectPopupBuilder): Required builder for popup content /// - [itemBuilder] (`SelectValueBuilder`): Required builder for selected value display const Select({super.key, this.onChanged, this.placeholder, this.filled = false, this.focusNode, this.constraints, this.popupConstraints, this.popupWidthConstraint = PopoverConstraint.anchorFixedSize, this.value, this.disableHoverEffect = false, this.borderRadius, this.padding, this.popoverAlignment = Alignment.topCenter, this.popoverAnchorAlignment, this.canUnselect = false, this.autoClosePopover = true, this.enabled, this.valueSelectionHandler, this.valueSelectionPredicate, this.showValuePredicate, required this.popup, required this.itemBuilder}); SelectState createState(); } /// State class for the [Select] widget managing selection and popup interactions. /// /// This state class handles the select dropdown's internal state including: /// - Focus management for keyboard navigation /// - Popup controller for opening/closing the dropdown menu /// - Value change notifications /// - Theme integration /// /// The state implements [FormValueSupplier] to integrate with form validation /// and value management systems. /// /// See also: /// - [Select], the widget that uses this state /// - [PopoverController], used to control the dropdown popup /// - [FormValueSupplier], the mixin providing form integration class SelectState extends State> with FormValueSupplier> { void didChangeDependencies(); void initState(); void didUpdateWidget(Select oldWidget); void didReplaceFormValue(T value); void dispose(); Widget build(BuildContext context); } /// Chip widget designed for multi-select contexts with automatic removal functionality. /// /// A specialized chip widget that integrates with multi-select components to display /// selected items with built-in removal capabilities. Automatically detects its /// multi-select context and provides appropriate removal behavior. /// /// ## Features /// /// - **Context-aware removal**: Automatically integrates with parent multi-select state /// - **Visual feedback**: Clear visual indication of selected state /// - **Interactive deletion**: Built-in X button for removing selections /// - **Consistent styling**: Matches multi-select component design patterns /// - **Accessibility**: Full screen reader support for selection management /// /// This widget is typically used within multi-select components to represent /// individual selected items with the ability to remove them from the selection. /// /// Example: /// ```dart /// MultiSelectChip( /// value: 'apple', /// child: Text('Apple'), /// style: ButtonStyle.secondary(), /// ); /// ``` class MultiSelectChip extends StatelessWidget { /// The value this chip represents in the selection. Object? value; /// The content displayed inside the chip. Widget child; /// The chip styling. AbstractButtonStyle style; /// Creates a [MultiSelectChip]. /// /// Designed to be used within multi-select components where it automatically /// integrates with the parent selection state for removal functionality. /// /// Parameters: /// - [value] (Object?, required): the value this chip represents in the selection /// - [child] (Widget, required): content displayed inside the chip /// - [style] (AbstractButtonStyle, default: primary): chip styling /// /// Example: /// ```dart /// MultiSelectChip( /// value: user.id, /// child: Row( /// children: [ /// Avatar(user: user), /// Text(user.name), /// ], /// ), /// style: ButtonStyle.secondary(), /// ) /// ``` const MultiSelectChip({super.key, this.style = const ButtonStyle.primary(), required this.value, required this.child}); Widget build(BuildContext context); } /// A customizable dropdown selection widget for multi-value selection. /// /// Extends the base select functionality to support selecting multiple items /// simultaneously. Displays selected items as removable chips within the trigger. /// /// Example: /// ```dart /// MultiSelect( /// value: selectedItems, /// onChanged: (items) => setState(() => selectedItems = items), /// popup: SelectPopup.menu(children: [...]), /// multiItemBuilder: (context, item) => Text(item), /// ) /// ``` class MultiSelect extends StatelessWidget with SelectBase> { ValueChanged?>? onChanged; Widget? placeholder; bool filled; FocusNode? focusNode; BoxConstraints? constraints; BoxConstraints? popupConstraints; PopoverConstraint popupWidthConstraint; /// The currently selected values. Iterable? value; BorderRadiusGeometry? borderRadius; EdgeInsetsGeometry? padding; AlignmentGeometry popoverAlignment; AlignmentGeometry? popoverAnchorAlignment; bool disableHoverEffect; bool canUnselect; bool? autoClosePopover; /// Whether the multi-select is enabled for user interaction. bool? enabled; SelectPopupBuilder popup; SelectValueBuilder> get itemBuilder; SelectValueSelectionHandler>? valueSelectionHandler; SelectValueSelectionPredicate>? valueSelectionPredicate; /// Builder for rendering individual items in the chip display. SelectValueBuilder multiItemBuilder; Predicate>? showValuePredicate; /// Creates a multi-selection dropdown widget. /// /// Allows selecting multiple items from a dropdown list, displaying them as chips. /// The [value], [popup], and [itemBuilder] parameters are required. /// /// Parameters: /// - [key] (Key?): Widget key for controlling widget identity /// - [onChanged] (`ValueChanged?>?`): Callback when selection changes; if null, widget is disabled /// - [placeholder] (Widget?): Widget shown when no values are selected /// - [filled] (bool): Whether to use filled background style, defaults to false /// - [focusNode] (FocusNode?): Focus node for keyboard interaction /// - [constraints] (BoxConstraints?): Size constraints for the select button /// - [popupConstraints] (BoxConstraints?): Size constraints for the popup menu /// - [popupWidthConstraint] (PopoverConstraint): Width constraint mode for popup, defaults to `PopoverConstraint.anchorFixedSize` /// - [value] (`Iterable`): Required currently selected values /// - [disableHoverEffect] (bool): Whether to disable hover visual feedback, defaults to false /// - [borderRadius] (BorderRadiusGeometry?): Custom border radius /// - [padding] (EdgeInsetsGeometry?): Custom padding /// - [popoverAlignment] (AlignmentGeometry): Popup alignment, defaults to `Alignment.topCenter` /// - [popoverAnchorAlignment] (AlignmentGeometry?): Anchor alignment for popup positioning /// - [canUnselect] (bool): Whether user can deselect items, defaults to true /// - [autoClosePopover] (bool?): Whether popup closes after selection, defaults to false /// - [enabled] (bool?): Whether multi-select is enabled for interaction /// - [valueSelectionHandler] (`SelectValueSelectionHandler>?`): Custom selection logic /// - [valueSelectionPredicate] (`SelectValueSelectionPredicate>?`): Predicate for allowing selection /// - [showValuePredicate] (`Predicate>?`): Predicate for showing items /// - [popup] (SelectPopupBuilder): Required builder for popup content /// - [itemBuilder] (`SelectValueBuilder`): Required builder for individual chip items const MultiSelect({super.key, this.onChanged, this.placeholder, this.filled = false, this.focusNode, this.constraints, this.popupConstraints, this.popupWidthConstraint = PopoverConstraint.anchorFixedSize, required this.value, this.disableHoverEffect = false, this.borderRadius, this.padding, this.popoverAlignment = Alignment.topCenter, this.popoverAnchorAlignment, this.canUnselect = true, this.autoClosePopover = false, this.enabled, this.valueSelectionHandler, this.valueSelectionPredicate, this.showValuePredicate, required this.popup, required SelectValueBuilder itemBuilder}); Widget build(BuildContext context); } /// Data class holding select dropdown state and configuration. /// /// Contains selection state, callbacks, and display options for select popups. class SelectData { /// Whether to automatically close the popup after selection. bool? autoClose; /// Predicate to check if a value is currently selected. Predicate isSelected; /// Callback invoked when selection changes. SelectValueChanged onChanged; /// Whether any items are currently selected. bool hasSelection; /// Whether the select is enabled for interaction. bool enabled; /// Creates select data. const SelectData({required this.autoClose, required this.isSelected, required this.onChanged, required this.hasSelection, required this.enabled}); bool operator ==(Object other); int get hashCode; } /// A popup widget for displaying selectable items in a dropdown. /// /// Provides a searchable, scrollable list of items with various display modes. class SelectPopup extends StatefulWidget { /// Builder function for dynamically generating select items. SelectItemsBuilder? builder; /// Static list of select items to display. FutureOr? items; /// Controller for the search input field. TextEditingController? searchController; /// Placeholder widget for the search field. Widget? searchPlaceholder; /// Builder for empty state display. WidgetBuilder? emptyBuilder; /// Builder for loading state display. WidgetBuilder? loadingBuilder; /// Builder for error state display. ErrorWidgetBuilder? errorBuilder; /// Blur amount for the popup surface. double? surfaceBlur; /// Opacity for the popup surface. double? surfaceOpacity; /// Whether to auto-close the popup after selection. bool? autoClose; /// Whether selected items can be unselected. bool? canUnselect; /// Whether search functionality is enabled. bool enableSearch; /// Controller for the items scroll view. ScrollController? scrollController; /// Whether the list should shrink-wrap its contents. bool shrinkWrap; /// Whether to disable item virtualization. bool disableVirtualization; /// Creates a select popup with a dynamic builder. const SelectPopup.builder({super.key, required this.builder, this.searchController, this.searchPlaceholder, this.emptyBuilder, this.loadingBuilder, this.surfaceBlur, this.surfaceOpacity, this.autoClose, this.canUnselect, this.enableSearch = true, this.errorBuilder, this.scrollController}); /// Creates a select popup with static items. const SelectPopup({super.key, this.items, this.searchController, this.searchPlaceholder, this.emptyBuilder, this.loadingBuilder, this.errorBuilder, this.surfaceBlur, this.surfaceOpacity, this.autoClose, this.canUnselect, this.scrollController, this.shrinkWrap = true}); /// Creates a select popup without virtualization optimization. const SelectPopup.noVirtualization({super.key, FutureOr? this.items, this.searchController, this.searchPlaceholder, this.emptyBuilder, this.loadingBuilder, this.errorBuilder, this.surfaceBlur, this.surfaceOpacity, this.autoClose, this.canUnselect, this.scrollController}); /// A method used to implement SelectPopupBuilder SelectPopup call(BuildContext context); State> createState(); } /// Mixin providing select popup interaction methods. /// /// Allows widgets to check selection state and update selections. mixin SelectPopupHandle { /// Checks if the given value is currently selected. bool isSelected(Object? value); /// Updates the selection state for the given value. void selectItem(Object? value, bool selected); /// Whether any items are currently selected. bool get hasSelection; /// Retrieves the nearest SelectPopupHandle from the widget tree. static SelectPopupHandle of(BuildContext context); } /// Abstract base class for building select item lists. /// /// Provides interface for rendering select items with optional caching /// and change detection. abstract class SelectItemDelegate with CachedValue { /// An empty select item delegate constant. static const empty = EmptySelectItem(); /// Creates a select item delegate. const SelectItemDelegate(); /// Builds a widget for the item at the given index. Widget? build(BuildContext context, int index); /// Estimated number of children in this delegate. int? get estimatedChildCount; bool shouldRebuild(covariant SelectItemDelegate oldDelegate); } /// An empty select item delegate that renders no items. class EmptySelectItem extends SelectItemDelegate { /// Creates an empty select item. const EmptySelectItem(); Widget? build(BuildContext context, int index); int get estimatedChildCount; bool shouldRebuild(covariant EmptySelectItem oldDelegate); } /// A select item delegate that uses a builder function. /// /// Provides items through a builder function with optional child count. class SelectItemBuilder extends SelectItemDelegate { /// The builder function for creating item widgets. SelectItemWidgetBuilder builder; /// The number of children this delegate can build. int? childCount; /// Creates a select item builder. const SelectItemBuilder({required this.builder, this.childCount}); Widget build(BuildContext context, int index); int? get estimatedChildCount; bool shouldRebuild(covariant SelectItemBuilder oldDelegate); } /// A select item delegate that uses a static list of children. /// /// [SelectItemList] provides select items from a pre-defined list of widgets. /// This is the simplest way to create a select dropdown with a fixed set of options. /// /// Example: /// ```dart /// SelectItemList( /// children: [ /// SelectItem(value: 1, child: Text('Option 1')), /// SelectItem(value: 2, child: Text('Option 2')), /// SelectItem(value: 3, child: Text('Option 3')), /// ], /// ) /// ``` class SelectItemList extends SelectItemDelegate { /// The list of widgets to display as select items. List children; /// Creates a [SelectItemList] with the specified children. const SelectItemList({required this.children}); Widget build(BuildContext context, int index); int get estimatedChildCount; bool shouldRebuild(covariant SelectItemList oldDelegate); } /// Standard duration for switch state transitions and animations. const kSwitchDuration = Duration(milliseconds: 100); /// Theme configuration for [Switch] widget styling and visual appearance. /// /// Defines the visual properties used by switch components including colors, /// spacing, and border styling for different switch states. All properties are /// optional and fall back to framework defaults when not specified. /// /// Supports comprehensive customization of switch appearance including track /// colors, thumb colors, and layout properties to match application design. class SwitchTheme { /// Color of the switch track when in the active/on state. /// /// Applied as the background color of the switch track when toggled on. /// When null, uses the theme's primary color for visual consistency. Color? activeColor; /// Color of the switch track when in the inactive/off state. /// /// Applied as the background color of the switch track when toggled off. /// When null, uses the theme's muted color for visual hierarchy. Color? inactiveColor; /// Color of the switch thumb when in the active/on state. /// /// Applied to the circular thumb element when the switch is toggled on. /// When null, uses the theme's primary foreground color for contrast. Color? activeThumbColor; /// Color of the switch thumb when in the inactive/off state. /// /// Applied to the circular thumb element when the switch is toggled off. /// When null, uses a contrasting color against the inactive track. Color? inactiveThumbColor; /// Spacing between the switch and its leading/trailing widgets. /// /// Applied on both sides of the switch when leading or trailing widgets /// are provided. When null, defaults to framework spacing standards. double? gap; /// Border radius applied to the switch track corners. /// /// Creates rounded corners on the switch track container. When null, /// uses a fully rounded appearance typical of toggle switches. BorderRadiusGeometry? borderRadius; /// Creates a [SwitchTheme]. /// /// All parameters are optional and will use framework defaults when null. /// The theme can be applied to individual switches or globally through /// the component theme system. const SwitchTheme({this.activeColor, this.inactiveColor, this.activeThumbColor, this.inactiveThumbColor, this.gap, this.borderRadius}); /// Returns a copy of this theme with the given fields replaced. SwitchTheme copyWith({ValueGetter? activeColor, ValueGetter? inactiveColor, ValueGetter? activeThumbColor, ValueGetter? inactiveThumbColor, ValueGetter? gap, ValueGetter? borderRadius}); bool operator ==(Object other); int get hashCode; } /// Controller for managing switch state. /// /// Extends [ValueNotifier] with [bool] values to provide state management /// for switch widgets. Includes a convenience [toggle] method for flipping /// the switch state. /// /// Example: /// ```dart /// final controller = SwitchController(true); /// controller.toggle(); // Now false /// ``` class SwitchController extends ValueNotifier with ComponentController { /// Creates a [SwitchController]. /// /// Parameters: /// - [value] (`bool`, default: `false`): Initial switch state. SwitchController([super.value = false]); /// Toggles the switch state between `true` and `false`. void toggle(); } /// A controlled switch widget with automatic state management. /// /// Manages its state either through an external [controller] or internal /// state with [initialValue]. Provides a toggle interface for boolean values /// with customizable appearance including colors, icons, and layout options. /// /// Example: /// ```dart /// ControlledSwitch( /// initialValue: true, /// onChanged: (value) => print('Switched to: $value'), /// leading: Icon(Icons.wifi), /// activeColor: Colors.green, /// ) /// ``` class ControlledSwitch extends StatelessWidget with ControlledComponent { bool initialValue; ValueChanged? onChanged; bool enabled; SwitchController? controller; /// Optional leading widget displayed before the switch. /// /// Typically an icon or text label. Widget? leading; /// Optional trailing widget displayed after the switch. /// /// Typically an icon or text label. Widget? trailing; /// Spacing between the switch and [leading]/[trailing] widgets. /// /// If `null`, uses the default gap from the theme. double? gap; /// Color of the switch when in the active (on) state. /// /// If `null`, uses the theme's primary color. Color? activeColor; /// Color of the switch when in the inactive (off) state. /// /// If `null`, uses a default inactive color from the theme. Color? inactiveColor; /// Color of the thumb (knob) when the switch is active. /// /// If `null`, uses a default thumb color. Color? activeThumbColor; /// Color of the thumb (knob) when the switch is inactive. /// /// If `null`, uses a default thumb color. Color? inactiveThumbColor; /// Border radius for the switch track. /// /// If `null`, uses the default border radius from the theme. BorderRadiusGeometry? borderRadius; /// Creates a [ControlledSwitch]. const ControlledSwitch({super.key, this.controller, this.initialValue = false, this.onChanged, this.enabled = true, this.leading, this.trailing, this.gap, this.activeColor, this.inactiveColor, this.activeThumbColor, this.inactiveThumbColor, this.borderRadius}); Widget build(BuildContext context); } /// A Material Design switch for toggling boolean values. /// /// Provides a sliding toggle control for selecting between two states (on/off). /// Supports customization of colors, leading/trailing widgets, and appearance /// options. Unlike [ControlledSwitch], this widget requires explicit state /// management. /// /// Example: /// ```dart /// Switch( /// value: isEnabled, /// onChanged: (value) => setState(() => isEnabled = value), /// activeColor: Colors.blue, /// leading: Text('Enable feature'), /// ) /// ``` class Switch extends StatefulWidget { /// The current state of the switch. bool value; /// Callback invoked when the switch state changes. /// /// If `null`, the switch is disabled. ValueChanged? onChanged; /// Optional leading widget displayed before the switch. /// /// Typically an icon or text label. Widget? leading; /// Optional trailing widget displayed after the switch. /// /// Typically an icon or text label. Widget? trailing; /// Whether the switch is interactive. /// /// When `false`, the switch is disabled. Defaults to `true`. bool? enabled; /// Spacing between the switch and [leading]/[trailing] widgets. /// /// If `null`, uses the default gap from the theme. double? gap; /// Color of the switch when in the active (on) state. /// /// If `null`, uses the theme's primary color. Color? activeColor; /// Color of the switch when in the inactive (off) state. /// /// If `null`, uses a default inactive color from the theme. Color? inactiveColor; /// Color of the thumb (knob) when the switch is active. /// /// If `null`, uses a default thumb color. Color? activeThumbColor; /// Color of the thumb (knob) when the switch is inactive. /// /// If `null`, uses a default thumb color. Color? inactiveThumbColor; /// Border radius for the switch track. /// /// If `null`, uses the default border radius from the theme. BorderRadiusGeometry? borderRadius; /// Creates a [Switch]. const Switch({super.key, required this.value, required this.onChanged, this.leading, this.trailing, this.enabled = true, this.gap, this.activeColor, this.inactiveColor, this.activeThumbColor, this.inactiveThumbColor, this.borderRadius}); State createState(); } /// Theme data for [MultipleChoice] and [MultipleAnswer]. class MultipleChoiceTheme { /// Whether selections can be unselected. bool? allowUnselect; /// Creates a [MultipleChoiceTheme]. const MultipleChoiceTheme({this.allowUnselect}); /// Returns a copy of this theme with the given fields replaced by the /// non-null parameters. MultipleChoiceTheme copyWith({ValueGetter? allowUnselect}); bool operator ==(Object other); int get hashCode; String toString(); } /// A mixin that provides choice selection functionality. /// /// [Choice] defines the interface for widgets that support item selection, /// typically used in multiple choice or single choice scenarios. It provides /// static methods to interact with choice widgets in the widget tree. mixin Choice { /// Selects an item in the nearest [Choice] ancestor. /// /// Parameters: /// - [context]: The build context to search for Choice widget. /// - [item]: The item to select. static void choose(BuildContext context, T item); /// Gets the current selected value(s) from the nearest [Choice] ancestor. /// /// Returns: The currently selected items, or null if none selected. static Iterable? getValue(BuildContext context); /// Selects the specified item. void selectItem(T item); /// Gets the currently selected items. Iterable? get value; } /// A controller for managing [ControlledMultipleAnswer] selections programmatically. /// /// This controller extends `ValueNotifier?>` to provide reactive /// state management for multiple selection components. It implements [ComponentController] /// to integrate with the controlled component system, allowing external control /// and listening to selection changes. /// /// Example: /// ```dart /// final controller = MultipleAnswerController(['option1', 'option2']); /// controller.addListener(() { /// print('Selected items: ${controller.value}'); /// }); /// ``` class MultipleAnswerController extends ValueNotifier?> with ComponentController?> { /// Creates a [MultipleAnswerController] with an optional initial selection. /// /// Parameters: /// - [value] (`Iterable?`, optional): Initial selection of items MultipleAnswerController([super.value]); } /// A controller for managing [ControlledMultipleChoice] selection programmatically. /// /// This controller extends `ValueNotifier` to provide reactive state /// management for single-choice components. It implements [ComponentController] /// to integrate with the controlled component system, allowing external control /// and listening to selection changes. /// /// Example: /// ```dart /// final controller = MultipleChoiceController('option1'); /// controller.addListener(() { /// print('Selected item: ${controller.value}'); /// }); /// ``` class MultipleChoiceController extends ValueNotifier with ComponentController { /// Creates a [MultipleChoiceController] with an optional initial selection. /// /// Parameters: /// - [value] (T?, optional): Initial selected item MultipleChoiceController([super.value]); } /// A controlled widget for managing multiple item selections with external state management. /// /// This widget provides a container for multiple selection interfaces where users /// can select multiple items from a set of choices. It integrates with the controlled /// component system to provide external state management, form integration, and /// programmatic control of selections. /// /// The component maintains a collection of selected items and provides callbacks /// for selection changes. Child widgets can use the [Choice.choose] method to /// register item selections and [Choice.getValue] to access current selections. /// /// Example: /// ```dart /// ControlledMultipleAnswer( /// initialValue: ['apple', 'banana'], /// onChanged: (selections) { /// print('Selected: ${selections?.join(', ')}'); /// }, /// child: Column( /// children: [ /// ChoiceItem(value: 'apple', child: Text('Apple')), /// ChoiceItem(value: 'banana', child: Text('Banana')), /// ChoiceItem(value: 'orange', child: Text('Orange')), /// ], /// ), /// ); /// ``` class ControlledMultipleAnswer extends StatelessWidget with ControlledComponent?> { MultipleAnswerController? controller; Iterable? initialValue; ValueChanged?>? onChanged; bool enabled; /// Whether selected items can be deselected by selecting them again. /// /// When true, users can toggle selections by clicking selected items to /// deselect them. When false, items remain selected once chosen. bool? allowUnselect; /// The widget subtree containing selectable choice items. /// /// Child widgets should provide choice items that use [Choice.choose] /// to register selections and [Choice.getValue] to access current state. Widget child; /// Creates a [ControlledMultipleAnswer]. /// /// Either [controller] or [initialValue] should be provided to establish /// the initial selection state. The [child] should contain choice items /// that integrate with the multiple selection system. /// /// Parameters: /// - [controller] (`MultipleAnswerController?`, optional): External controller for programmatic control /// - [initialValue] (`Iterable?`, optional): Initial selection when no controller provided /// - [onChanged] (`ValueChanged?>?`, optional): Callback for selection changes /// - [enabled] (bool, default: true): Whether selections can be modified /// - [allowUnselect] (bool?, optional): Whether items can be deselected by re-selection /// - [child] (Widget, required): Container with selectable choice items /// /// Example: /// ```dart /// ControlledMultipleAnswer( /// initialValue: [1, 3], /// allowUnselect: true, /// onChanged: (values) => print('Selected: $values'), /// child: ChoiceList(items: [1, 2, 3, 4, 5]), /// ); /// ``` const ControlledMultipleAnswer({super.key, this.controller, this.onChanged, this.initialValue, this.enabled = true, this.allowUnselect, required this.child}); Widget build(BuildContext context); } /// A controlled widget for managing single item selection with external state management. /// /// This widget provides a container for single-choice selection interfaces where /// users can select one item from a set of choices. It integrates with the controlled /// component system to provide external state management, form integration, and /// programmatic control of the selection. /// /// The component maintains a single selected item and provides callbacks for /// selection changes. Child widgets can use the [Choice.choose] method to /// register item selections and [Choice.getValue] to access the current selection. /// /// Example: /// ```dart /// ControlledMultipleChoice( /// initialValue: 'medium', /// onChanged: (selection) { /// print('Selected size: $selection'); /// }, /// child: Column( /// children: [ /// ChoiceItem(value: 'small', child: Text('Small')), /// ChoiceItem(value: 'medium', child: Text('Medium')), /// ChoiceItem(value: 'large', child: Text('Large')), /// ], /// ), /// ); /// ``` class ControlledMultipleChoice extends StatelessWidget with ControlledComponent { MultipleChoiceController? controller; T? initialValue; ValueChanged? onChanged; bool enabled; /// Whether the selected item can be deselected by selecting it again. /// /// When true, users can deselect the current selection by clicking it again, /// setting the value to null. When false, once an item is selected, it /// remains selected until another item is chosen. bool? allowUnselect; /// The widget subtree containing selectable choice items. /// /// Child widgets should provide choice items that use [Choice.choose] /// to register selections and [Choice.getValue] to access current state. Widget child; /// Creates a [ControlledMultipleChoice]. /// /// Either [controller] or [initialValue] should be provided to establish /// the initial selection state. The [child] should contain choice items /// that integrate with the single selection system. /// /// Parameters: /// - [controller] (`MultipleChoiceController?`, optional): External controller for programmatic control /// - [initialValue] (T?, optional): Initial selection when no controller provided /// - [onChanged] (`ValueChanged?`, optional): Callback for selection changes /// - [enabled] (bool, default: true): Whether selection can be modified /// - [allowUnselect] (bool?, optional): Whether selection can be cleared by re-selection /// - [child] (Widget, required): Container with selectable choice items /// /// Example: /// ```dart /// ControlledMultipleChoice( /// initialValue: Theme.dark, /// allowUnselect: false, /// onChanged: (theme) => setAppTheme(theme), /// child: ThemeSelector(), /// ); /// ``` const ControlledMultipleChoice({super.key, this.controller, this.onChanged, this.initialValue, this.enabled = true, this.allowUnselect, required this.child}); Widget build(BuildContext context); } /// A widget for single-selection choice scenarios. /// /// [MultipleChoice] manages a single selected value from multiple options. /// It prevents multiple selections and optionally allows deselecting the /// current choice by clicking it again. /// /// This widget is typically used with choice items like [ChoiceChip] or /// [ChoiceButton] which integrate with the inherited [Choice] data. /// /// Example: /// ```dart /// MultipleChoice( /// value: selectedOption, /// onChanged: (value) => setState(() => selectedOption = value), /// child: Wrap( /// children: [ /// ChoiceChip(value: 'A', child: Text('Option A')), /// ChoiceChip(value: 'B', child: Text('Option B')), /// ], /// ), /// ) /// ``` class MultipleChoice extends StatefulWidget { /// The child widget tree containing choice items. Widget child; /// The currently selected value. T? value; /// Callback when the selection changes. ValueChanged? onChanged; /// Whether choices are enabled. bool? enabled; /// Whether the current selection can be unselected. bool? allowUnselect; /// Creates a [MultipleChoice]. /// /// Parameters: /// - [child] (`Widget`, required): Widget tree with choice items. /// - [value] (`T?`, optional): Currently selected value. /// - [onChanged] (`ValueChanged?`, optional): Selection callback. /// - [enabled] (`bool?`, optional): Whether choices are enabled. /// - [allowUnselect] (`bool?`, optional): Allow deselecting the current choice. const MultipleChoice({super.key, required this.child, this.value, this.onChanged, this.enabled, this.allowUnselect}); State> createState(); } /// A widget for multiple-selection choice scenarios. /// /// [MultipleAnswer] manages multiple selected values from a set of options. /// It allows users to select and deselect multiple items independently. /// /// This widget is typically used with choice items like [ChoiceChip] or /// [ChoiceButton] which integrate with the inherited [Choice] data. /// /// Example: /// ```dart /// MultipleAnswer( /// value: selectedOptions, /// onChanged: (values) => setState(() => selectedOptions = values), /// child: Wrap( /// children: [ /// ChoiceChip(value: 'A', child: Text('Option A')), /// ChoiceChip(value: 'B', child: Text('Option B')), /// ChoiceChip(value: 'C', child: Text('Option C')), /// ], /// ), /// ) /// ``` class MultipleAnswer extends StatefulWidget { /// The child widget tree containing choice items. Widget child; /// The currently selected values. Iterable? value; /// Callback when the selection changes. ValueChanged?>? onChanged; /// Whether choices are enabled. bool? enabled; /// Whether all selections can be unselected. bool? allowUnselect; /// Creates a [MultipleAnswer]. /// /// Parameters: /// - [child] (`Widget`, required): Widget tree with choice items. /// - [value] (`Iterable?`, optional): Currently selected values. /// - [onChanged] (`ValueChanged?>?`, optional): Selection callback. /// - [enabled] (`bool?`, optional): Whether choices are enabled. /// - [allowUnselect] (`bool?`, optional): Allow deselecting all choices. const MultipleAnswer({super.key, required this.child, this.value, this.onChanged, this.enabled, this.allowUnselect}); State> createState(); } /// Theme configuration for [Checkbox] widget styling and visual appearance. /// /// Defines the visual properties used by checkbox components including colors, /// dimensions, spacing, and border styling. All properties are optional and /// fall back to framework defaults when not specified. /// /// Can be applied globally through [ComponentTheme] or used to override /// specific checkbox instances with custom styling. class CheckboxTheme { /// Color of the checkbox background when in unchecked state. /// /// Applied as the background color when the checkbox is unchecked. /// When null, uses a semi-transparent version of the theme's input background color. Color? backgroundColor; /// Color of the checkbox background when in checked state. /// /// Applied as both background and border color when the checkbox is checked. /// When null, uses the theme's primary color. Color? activeColor; /// Color of the checkbox border when in unchecked state. /// /// Only visible when the checkbox is unchecked or in indeterminate state. /// When null, uses the theme's border color. Color? borderColor; /// Size of the checkbox square in logical pixels. /// /// Controls both width and height of the checkbox square. The checkmark /// and indeterminate indicator are scaled proportionally. When null, /// defaults to 16 logical pixels scaled by theme scaling factor. double? size; /// Spacing between the checkbox and its leading/trailing widgets. /// /// Applied on both sides of the checkbox square when leading or trailing /// widgets are provided. When null, defaults to 8 logical pixels scaled /// by theme scaling factor. double? gap; /// Border radius applied to the checkbox square corners. /// /// Creates rounded corners on the checkbox container. When null, uses /// the theme's small border radius (typically 4 logical pixels). BorderRadiusGeometry? borderRadius; /// Creates a [CheckboxTheme]. /// /// All parameters are optional and will use framework defaults when null. /// The theme can be applied to individual checkboxes or globally through /// the component theme system. const CheckboxTheme({this.backgroundColor, this.activeColor, this.borderColor, this.size, this.gap, this.borderRadius}); /// Creates a copy of this theme with specified properties overridden. /// /// Each parameter function is called only if provided, allowing selective /// overrides while preserving existing values for unspecified properties. /// /// Example: /// ```dart /// final newTheme = theme.copyWith( /// activeColor: () => Colors.green, /// size: () => 20.0, /// ); /// ``` CheckboxTheme copyWith({ValueGetter? backgroundColor, ValueGetter? activeColor, ValueGetter? borderColor, ValueGetter? size, ValueGetter? gap, ValueGetter? borderRadius}); bool operator ==(Object other); int get hashCode; } /// Reactive controller for managing checkbox state with convenient methods. /// /// Extends [ValueNotifier] to provide state management for checkbox widgets /// with built-in methods for common state transitions. Supports all three /// checkbox states: checked, unchecked, and indeterminate. /// /// The controller can be used with [ControlledCheckbox] for reactive state /// management or manually to coordinate checkbox behavior across widgets. /// /// Example: /// ```dart /// final controller = CheckboxController(CheckboxState.unchecked); /// /// // React to changes /// controller.addListener(() { /// print('Checkbox is now: ${controller.value}'); /// }); /// /// // Programmatic control /// controller.toggle(); // unchecked -> checked /// controller.indeterminate(); // -> indeterminate /// ``` class CheckboxController extends ValueNotifier with ComponentController { /// Creates a [CheckboxController] with the specified initial [value]. /// /// The controller will notify listeners whenever the checkbox state changes /// through any of the provided methods or direct value assignment. CheckboxController(super.value); /// Sets the checkbox state to checked. /// /// Notifies listeners of the state change. Equivalent to setting /// `value = CheckboxState.checked`. void check(); /// Sets the checkbox state to unchecked. /// /// Notifies listeners of the state change. Equivalent to setting /// `value = CheckboxState.unchecked`. void uncheck(); /// Sets the checkbox state to indeterminate. /// /// Notifies listeners of the state change. Used for tri-state checkboxes /// to indicate a partially selected or mixed state. void indeterminate(); /// Toggles between checked and unchecked states. /// /// If currently checked, becomes unchecked. If currently unchecked or /// indeterminate, becomes checked. Does not cycle through indeterminate state. void toggle(); /// Cycles through all three states in order: checked -> unchecked -> indeterminate. /// /// Provides complete tri-state cycling behavior. Use this instead of [toggle] /// when working with tri-state checkboxes that need to support indeterminate state. void toggleTristate(); /// Returns true if the checkbox is currently checked. bool get isChecked; /// Returns true if the checkbox is currently unchecked. bool get isUnchecked; /// Returns true if the checkbox is currently in indeterminate state. bool get isIndeterminate; } /// Reactive checkbox with automatic state management and controller support. /// /// A higher-level checkbox widget that provides automatic state management /// through the controlled component pattern. Can be used with an external /// [CheckboxController] for programmatic control or with callback-based /// state management. /// /// Supports all checkbox features including tri-state behavior, leading/trailing /// widgets, and comprehensive theming. The widget automatically handles focus, /// enabled states, and form integration. /// /// ## Usage Patterns /// /// **Controller-based (recommended for complex state management):** /// ```dart /// final controller = CheckboxController(CheckboxState.unchecked); /// /// ControlledCheckbox( /// controller: controller, /// tristate: true, /// leading: Text('Accept terms'), /// ) /// ``` /// /// **Callback-based (simple state management):** /// ```dart /// bool checked = false; /// /// ControlledCheckbox( /// initialValue: checked ? CheckboxState.checked : CheckboxState.unchecked, /// onChanged: (state) => setState(() { /// checked = state == CheckboxState.checked; /// }), /// trailing: Text('Newsletter subscription'), /// ) /// ``` class ControlledCheckbox extends StatelessWidget with ControlledComponent { /// External controller for programmatic state management. /// /// When provided, takes precedence over [initialValue] and [onChanged]. /// The controller's state changes are automatically reflected in the widget. CheckboxController? controller; /// Initial checkbox state when no controller is provided. /// /// Used only when [controller] is null. Defaults to [CheckboxState.unchecked]. CheckboxState initialValue; /// Callback fired when the checkbox state changes. /// /// Called with the new [CheckboxState] when user interaction occurs. /// If both [controller] and [onChanged] are provided, both will receive updates. ValueChanged? onChanged; /// Whether the checkbox is interactive. /// /// When false, the checkbox becomes read-only and visually disabled. /// When null, automatically determines enabled state based on [onChanged] or [controller]. bool enabled; /// Optional widget displayed before the checkbox square. /// /// Commonly used for labels or icons. Automatically styled with small and /// medium text styles for consistency. Widget? leading; /// Optional widget displayed after the checkbox square. /// /// Commonly used for labels, descriptions, or additional controls. /// Automatically styled with small and medium text styles for consistency. Widget? trailing; /// Whether the checkbox supports three states including indeterminate. /// /// When true, clicking cycles through: checked -> unchecked -> indeterminate -> checked. /// When false, only toggles between checked and unchecked. Defaults to false. bool tristate; /// Override size of the checkbox square in logical pixels. /// /// When null, uses the theme size or framework default (16px scaled). double? size; /// Override spacing between checkbox and leading/trailing widgets. /// /// When null, uses the theme gap or framework default (8px scaled). double? gap; /// Override color of the checkbox background when in unchecked state. /// /// When null, uses a semi-transparent version of the theme's input background color. Color? backgroundColor; /// Override color of the checkbox when checked. /// /// When null, uses the theme active color or primary color. Color? activeColor; /// Override color of the checkbox border when unchecked. /// /// When null, uses the theme border color or framework border color. Color? borderColor; /// Override border radius of the checkbox square. /// /// When null, uses the theme border radius or small radius (4px). BorderRadiusGeometry? borderRadius; /// Creates a [ControlledCheckbox]. /// /// Either [controller] or [onChanged] should be provided for interactivity. /// The widget supports both controller-based and callback-based state management /// patterns depending on application architecture needs. /// /// Parameters: /// - [controller] (CheckboxController?, optional): external state controller /// - [initialValue] (CheckboxState, default: unchecked): starting state when no controller /// - [onChanged] (`ValueChanged?`, optional): state change callback /// - [enabled] (bool, default: true): whether checkbox is interactive /// - [leading] (Widget?, optional): widget displayed before checkbox /// - [trailing] (Widget?, optional): widget displayed after checkbox /// - [tristate] (bool, default: false): whether to support indeterminate state /// - [size] (double?, optional): override checkbox square size /// - [gap] (double?, optional): override spacing around checkbox /// - [backgroundColor] (Color?, optional): override unchecked state color /// - [activeColor] (Color?, optional): override checked state color /// - [borderColor] (Color?, optional): override border color /// - [borderRadius] (BorderRadiusGeometry?, optional): override corner radius /// /// Example: /// ```dart /// ControlledCheckbox( /// controller: controller, /// tristate: true, /// leading: Icon(Icons.star), /// trailing: Text('Favorite'), /// ) /// ``` const ControlledCheckbox({super.key, this.controller, this.initialValue = CheckboxState.unchecked, this.onChanged, this.enabled = true, this.leading, this.trailing, this.tristate = false, this.size, this.gap, this.backgroundColor, this.activeColor, this.borderColor, this.borderRadius}); Widget build(BuildContext context); } /// Represents the possible states of a checkbox widget. /// /// Supports the standard checked/unchecked binary states as well as an /// indeterminate state commonly used to represent partial selection in /// hierarchical or grouped checkbox scenarios. /// /// The enum implements [Comparable] to provide consistent ordering: /// checked < unchecked < indeterminate (based on declaration order). enum CheckboxState { checked, unchecked, indeterminate } /// Core checkbox widget with comprehensive theming and interaction support. /// /// A low-level checkbox implementation that provides direct state control /// and extensive customization options. Supports all three checkbox states, /// smooth animations, accessibility features, and form integration. /// /// ## Features /// /// - **Tri-state support**: checked, unchecked, and indeterminate states /// - **Smooth animations**: animated checkmark drawing and state transitions /// - **Comprehensive theming**: colors, sizing, spacing, and border customization /// - **Accessibility**: proper semantics, focus management, and keyboard support /// - **Form integration**: automatic form field registration and validation support /// - **Layout flexibility**: leading/trailing widgets with automatic styling /// /// For most use cases, consider [ControlledCheckbox] which provides higher-level /// state management. Use this widget directly when you need fine-grained control /// over the checkbox behavior and lifecycle. /// /// Example: /// ```dart /// Checkbox( /// state: CheckboxState.checked, /// onChanged: (newState) { /// setState(() => currentState = newState); /// }, /// tristate: true, /// leading: Icon(Icons.security), /// trailing: Text('Enable security features'), /// ) /// ``` class Checkbox extends StatefulWidget { /// Current state of the checkbox. /// /// Must be one of [CheckboxState.checked], [CheckboxState.unchecked], or /// [CheckboxState.indeterminate]. The widget rebuilds when this changes /// to reflect the new visual state with appropriate animations. CheckboxState state; /// Callback fired when the user interacts with the checkbox. /// /// Called with the new [CheckboxState] that should be applied. When null, /// the checkbox becomes non-interactive and visually disabled. /// /// The callback is responsible for updating the parent widget's state /// to reflect the change - this widget does not manage its own state. ValueChanged? onChanged; /// Optional widget displayed before the checkbox square. /// /// Commonly used for icons or primary labels. The widget is automatically /// styled with small and medium text styles for visual consistency. /// Spacing between leading widget and checkbox is controlled by [gap]. Widget? leading; /// Optional widget displayed after the checkbox square. /// /// Commonly used for labels, descriptions, or secondary information. /// The widget is automatically styled with small and medium text styles /// for visual consistency. Spacing is controlled by [gap]. Widget? trailing; /// Whether the checkbox supports indeterminate state cycling. /// /// When true, user interaction cycles through: checked -> unchecked -> indeterminate. /// When false, only toggles between checked and unchecked states. /// The indeterminate state can still be set programmatically regardless of this setting. bool tristate; /// Whether the checkbox is interactive and enabled. /// /// When false, the checkbox becomes visually disabled and non-interactive. /// When null, the enabled state is automatically determined from the presence /// of an [onChanged] callback. bool? enabled; /// Size of the checkbox square in logical pixels. /// /// Overrides the theme default. When null, uses [CheckboxTheme.size] or /// framework default (16 logical pixels scaled by theme scaling factor). double? size; /// Spacing between the checkbox and its leading/trailing widgets. /// /// Overrides the theme default. Applied on both sides when leading or trailing /// widgets are present. When null, uses [CheckboxTheme.gap] or framework default. double? gap; /// Color of the checkbox background when in unchecked state. /// /// Overrides the theme default. Applied as the background color when unchecked. /// When null, uses a semi-transparent version of the theme's input background color. Color? backgroundColor; /// Color used for the checkbox when in checked state. /// /// Overrides the theme default. Applied as both background and border color /// when checked. When null, uses [CheckboxTheme.activeColor] or theme primary color. Color? activeColor; /// Color used for the checkbox border when unchecked or indeterminate. /// /// Overrides the theme default. Only visible in unchecked state as checked /// state uses [activeColor]. When null, uses [CheckboxTheme.borderColor] or theme border color. Color? borderColor; /// Border radius applied to the checkbox square. /// /// Overrides the theme default. Creates rounded corners on the checkbox container. /// When null, uses [CheckboxTheme.borderRadius] or theme small radius. BorderRadiusGeometry? borderRadius; /// Creates a [Checkbox] widget. /// /// The [state] and [onChanged] parameters work together to provide controlled /// component behavior - the widget displays the provided state and notifies /// of user interactions through the callback. /// /// Parameters: /// - [state] (CheckboxState, required): current checkbox state to display /// - [onChanged] (`ValueChanged?`, required): interaction callback /// - [leading] (Widget?, optional): widget displayed before checkbox /// - [trailing] (Widget?, optional): widget displayed after checkbox /// - [tristate] (bool, default: false): enable indeterminate state cycling /// - [enabled] (bool?, optional): override interactivity (null = auto-detect) /// - [size] (double?, optional): override checkbox square size /// - [gap] (double?, optional): override spacing around checkbox /// - [backgroundColor] (Color?, optional): override unchecked state color /// - [activeColor] (Color?, optional): override checked state color /// - [borderColor] (Color?, optional): override border color /// - [borderRadius] (BorderRadiusGeometry?, optional): override corner radius /// /// Example: /// ```dart /// Checkbox( /// state: isAccepted ? CheckboxState.checked : CheckboxState.unchecked, /// onChanged: (state) => setState(() { /// isAccepted = state == CheckboxState.checked; /// }), /// trailing: Text('I accept the terms and conditions'), /// ) /// ``` const Checkbox({super.key, required this.state, required this.onChanged, this.leading, this.trailing, this.tristate = false, this.enabled, this.size, this.gap, this.backgroundColor, this.activeColor, this.borderColor, this.borderRadius}); State createState(); } /// Custom painter for drawing animated checkmarks in checkboxes. /// /// Renders a smooth checkmark animation that draws progressively from left to right /// in two stroke segments. The animation provides visual feedback when transitioning /// to the checked state, creating a satisfying user experience. /// /// The checkmark is drawn as two connected line segments: a shorter diagonal line /// from bottom-left toward center, and a longer diagonal line from center to top-right. /// The [progress] parameter controls how much of the checkmark is visible. /// /// Used internally by [Checkbox] - not typically instantiated directly by consumers. class AnimatedCheckPainter extends CustomPainter { /// Animation progress from 0.0 to 1.0 controlling checkmark visibility. /// /// At 0.0, no checkmark is visible. At 1.0, the complete checkmark is drawn. /// Values between 0.0 and 1.0 show partial drawing progress with smooth transitions. double progress; /// Color used to draw the checkmark strokes. /// /// Typically the primary foreground color to provide contrast against /// the checkbox's active background color. Color color; /// Width of the checkmark stroke lines in logical pixels. /// /// Controls the thickness of the drawn checkmark. Usually scaled with /// the theme's scaling factor for consistent appearance across screen densities. double strokeWidth; /// Creates an [AnimatedCheckPainter]. /// /// All parameters are required as they directly control the checkmark appearance /// and animation state. The painter should be recreated when any parameter changes. /// /// Parameters: /// - [progress] (double, required): animation progress 0.0-1.0 /// - [color] (Color, required): checkmark stroke color /// - [strokeWidth] (double, required): stroke thickness in logical pixels /// /// Example usage within CustomPaint: /// ```dart /// CustomPaint( /// painter: AnimatedCheckPainter( /// progress: animationValue, /// color: theme.primaryForeground, /// strokeWidth: 2.0, /// ), /// ) /// ``` AnimatedCheckPainter({required this.progress, required this.color, required this.strokeWidth}); void paint(Canvas canvas, Size size); bool shouldRepaint(covariant AnimatedCheckPainter oldDelegate); } /// Theme configuration for [AutoComplete] widget styling and behavior. /// /// Defines the visual appearance and positioning of the autocomplete popover /// that displays suggestions. All properties are optional and will fall back /// to sensible defaults when not specified. /// /// This theme can be applied globally through [ComponentTheme] or passed /// directly to individual [AutoComplete] widgets for per-instance customization. class AutoCompleteTheme { /// Constraints applied to the autocomplete popover container. /// /// Controls the maximum/minimum dimensions of the suggestion list popover. /// Defaults to a maximum height of 300 logical pixels when null. BoxConstraints? popoverConstraints; /// Width constraint strategy for the autocomplete popover. /// /// Determines how the popover width relates to its anchor (the text field). /// Options include matching anchor width, flexible sizing, or fixed dimensions. PopoverConstraint? popoverWidthConstraint; /// Alignment point on the anchor widget where the popover attaches. /// /// Specifies which edge/corner of the text field the popover should align to. /// Defaults to bottom-start (bottom-left in LTR, bottom-right in RTL). AlignmentDirectional? popoverAnchorAlignment; /// Alignment point on the popover that aligns with the anchor point. /// /// Specifies which edge/corner of the popover aligns with the anchor alignment. /// Defaults to top-start (top-left in LTR, top-right in RTL). AlignmentDirectional? popoverAlignment; /// Default mode for how suggestions are applied to text fields. /// /// Controls the text replacement strategy when a suggestion is selected. /// Defaults to [AutoCompleteMode.replaceWord] when null. AutoCompleteMode? mode; /// Creates an [AutoCompleteTheme]. /// /// All parameters are optional and will use framework defaults when null. const AutoCompleteTheme({this.popoverConstraints, this.popoverWidthConstraint, this.popoverAnchorAlignment, this.popoverAlignment, this.mode}); /// Creates a copy of this theme with specified properties overridden. /// /// Each parameter function is called only if provided, allowing selective /// overrides while preserving existing values for unspecified properties. AutoCompleteTheme copyWith({ValueGetter? popoverConstraints, ValueGetter? popoverWidthConstraint, ValueGetter? popoverAnchorAlignment, ValueGetter? popoverAlignment, ValueGetter? mode}); bool operator ==(Object other); int get hashCode; } /// Intelligent autocomplete functionality with customizable suggestion handling. /// /// Provides real-time autocomplete suggestions in a popover overlay when used /// with text input widgets. Supports multiple text replacement modes, keyboard /// navigation, and theming customization. The widget wraps a child (typically /// a text field) and displays filtered suggestions based on user input. /// /// ## Features /// /// - **Multiple completion modes**: append, replace word, or replace all text /// - **Keyboard navigation**: arrow keys to navigate, tab/enter to accept /// - **Customizable presentation**: popover positioning, sizing, and constraints /// - **Smart suggestion filtering**: automatically manages suggestion visibility /// - **Accessibility support**: proper focus management and keyboard shortcuts /// /// The autocomplete behavior is controlled by the [mode] property and can be /// customized per-instance or globally through [AutoCompleteTheme]. /// /// Example: /// ```dart /// AutoComplete( /// suggestions: ['apple', 'apricot', 'banana', 'cherry'], /// mode: AutoCompleteMode.replaceWord, /// child: TextField( /// decoration: InputDecoration( /// hintText: 'Type to search fruits...', /// ), /// ), /// ) /// ``` class AutoComplete extends StatefulWidget { /// List of suggestions to display in the autocomplete popover. /// /// When non-empty, triggers the popover to appear with selectable options. /// The suggestions are filtered and managed externally - this widget only /// handles the presentation and selection logic. List suggestions; /// The child widget that receives autocomplete functionality. /// /// Typically a [TextField] or similar text input widget. The autocomplete /// popover will be positioned relative to this widget, and keyboard actions /// will be applied to the focused text field within this child tree. Widget child; /// Constraints applied to the autocomplete popover container. /// /// Overrides the theme default. Controls maximum/minimum dimensions of the /// suggestion list. When null, uses theme value or framework default. BoxConstraints? popoverConstraints; /// Width constraint strategy for the autocomplete popover. /// /// Overrides the theme default. Determines how popover width relates to /// the anchor widget. When null, uses theme value or matches anchor width. PopoverConstraint? popoverWidthConstraint; /// Alignment point on the anchor widget for popover attachment. /// /// Overrides the theme default. Specifies which edge/corner of the child /// widget the popover aligns to. When null, uses theme or bottom-start. AlignmentDirectional? popoverAnchorAlignment; /// Alignment point on the popover for anchor attachment. /// /// Overrides the theme default. Specifies which edge/corner of the popover /// aligns with the anchor point. When null, uses theme or top-start. AlignmentDirectional? popoverAlignment; /// Text replacement strategy when a suggestion is selected. /// /// Overrides the theme default. Controls how selected suggestions modify /// the text field content. When null, uses theme or [AutoCompleteMode.replaceWord]. AutoCompleteMode? mode; /// Function to customize suggestion text before application. /// /// Called when a suggestion is selected, allowing modification of the final /// text inserted into the field. Useful for adding prefixes, suffixes, or /// formatting. Defaults to returning the suggestion unchanged. AutoCompleteCompleter completer; /// Creates an [AutoComplete] widget. /// /// Wraps the provided [child] with autocomplete functionality using the /// given [suggestions] list. The popover appearance and behavior can be /// customized through the optional positioning and constraint parameters. /// /// Parameters: /// - [suggestions] (`List`, required): available autocomplete options /// - [child] (Widget, required): widget to receive autocomplete functionality /// - [popoverConstraints] (BoxConstraints?, optional): popover size limits /// - [popoverWidthConstraint] (PopoverConstraint?, optional): width strategy /// - [popoverAnchorAlignment] (AlignmentDirectional?, optional): anchor point /// - [popoverAlignment] (AlignmentDirectional?, optional): popover align point /// - [mode] (AutoCompleteMode?, optional): text replacement strategy /// - [completer] (AutoCompleteCompleter, default: identity): suggestion processor /// /// Example: /// ```dart /// AutoComplete( /// suggestions: suggestions, /// mode: AutoCompleteMode.append, /// completer: (text) => '$text ', /// child: TextField(), /// ) /// ``` const AutoComplete({super.key, required this.suggestions, required this.child, this.popoverConstraints, this.popoverWidthConstraint, this.popoverAnchorAlignment, this.popoverAlignment, this.mode, this.completer = _defaultCompleter}); State createState(); } /// An intent representing an autocomplete suggestion selection. /// /// Used by the autocomplete system to handle suggestion selections /// with different modes of completion. class AutoCompleteIntent extends Intent { /// The suggestion text to be completed. String suggestion; /// The mode determining how the completion should be applied. AutoCompleteMode mode; /// Creates an autocomplete intent with the specified suggestion and mode. const AutoCompleteIntent(this.suggestion, this.mode); } /// Text replacement strategies for autocomplete suggestion application. /// /// Defines how selected autocomplete suggestions modify the existing text /// field content. Each mode provides different behavior for integrating /// suggestions with current text. enum AutoCompleteMode { append, replaceWord, replaceAll } /// Intent for navigating through autocomplete suggestions via keyboard. /// /// Used internally by [AutoComplete] to handle arrow key navigation within /// the suggestion list. The [direction] indicates movement direction where /// positive values move down and negative values move up. class NavigateSuggestionIntent extends Intent { /// Direction of navigation through suggestions. /// /// Positive values move down in the list, negative values move up. /// The magnitude is typically 1 for single-step navigation. int direction; /// Creates a navigation intent with the specified [direction]. const NavigateSuggestionIntent(this.direction); } /// Intent for accepting the currently selected autocomplete suggestion. /// /// Used internally by [AutoComplete] to handle suggestion acceptance via /// keyboard shortcuts (typically Tab or Enter). Triggers the completion /// logic to apply the selected suggestion to the text field. class AcceptSuggestionIntent extends Intent { /// Creates an accept suggestion intent. const AcceptSuggestionIntent(); } /// Theme configuration for [FormattedInput] widget styling. /// /// Defines visual properties for formatted input components including /// height and padding. Applied globally through [ComponentTheme] or per-instance. class FormattedInputTheme { /// The height of the formatted input. double? height; /// Internal padding for the formatted input. EdgeInsetsGeometry? padding; /// Creates a [FormattedInputTheme]. const FormattedInputTheme({this.height, this.padding}); /// Creates a copy of this theme with specified properties overridden. FormattedInputTheme copyWith({ValueGetter? height, ValueGetter? padding}); bool operator ==(Object other); int get hashCode; } /// Abstract base class for parts of a formatted input. /// /// [InputPart] defines the interface for components that make up a formatted /// input field, such as static text, editable sections, or custom widgets. /// Each part can be rendered and may optionally hold a value. /// /// Example parts: /// - Static text separators (e.g., "/", "-") /// - Editable numeric fields (e.g., month, day, year) /// - Custom widget decorations abstract class InputPart implements FormattedValuePart { /// Creates a static text part. factory InputPart.static(String text); /// Creates an editable input part. factory InputPart.editable({required int length, bool obscureText, List inputFormatters, Widget? placeholder, required double width}); /// Creates a custom widget part. factory InputPart.widget(Widget widget); /// Creates an [InputPart]. const InputPart(); /// Builds the widget for this part. Widget build(BuildContext context, FormattedInputData data); /// A unique key identifying this part. Object? get partKey; /// Whether this part can hold a value. bool get canHaveValue; /// The current value of this part, or null if it doesn't hold a value. String? get value; /// Returns this part. InputPart get part; /// Creates a copy of this part with the specified value. FormattedValuePart withValue(String value); } /// A part that displays a custom widget. class WidgetPart extends InputPart { /// The widget to display. Widget widget; /// Creates a [WidgetPart] with the specified widget. const WidgetPart(this.widget); Widget build(BuildContext context, FormattedInputData data); Object? get partKey; } /// A part that displays static, non-editable text. class StaticPart extends InputPart { /// The static text to display. String text; /// Creates a [StaticPart] with the specified static text. /// /// Parameters: /// - [text] (`String`, required): The immutable text content to display. /// /// Example: /// ```dart /// const StaticPart('/') /// ``` const StaticPart(this.text); Widget build(BuildContext context, FormattedInputData data); String get partKey; String toString(); } /// A part that represents an editable input field section. /// /// [EditablePart] defines a user-editable portion of a formatted input, /// such as a date component, time segment, or numeric field. Each editable /// part can have a fixed length, input formatters, and optional obscuring. /// /// Example: /// ```dart /// EditablePart( /// length: 2, /// width: 40.0, /// inputFormatters: [FilteringTextInputFormatter.digitsOnly], /// placeholder: Text('MM'), /// ) /// ``` class EditablePart extends InputPart { /// The maximum length of text this part can hold. int length; /// Whether to obscure the text (e.g., for passwords). bool obscureText; /// Input formatters to apply to this part. List inputFormatters; /// The width of this input part. double width; /// Optional placeholder widget to display when empty. Widget? placeholder; /// Creates an [EditablePart] with the specified configuration. const EditablePart({required this.length, this.obscureText = false, this.inputFormatters = const [], this.placeholder, required this.width}); Object? get partKey; bool get canHaveValue; Widget build(BuildContext context, FormattedInputData data); String toString(); } /// Represents a part of a formatted value with its associated input part and value. /// /// A [FormattedValuePart] pairs an [InputPart] definition with an optional /// string value, used to represent user input or parsed data within a /// formatted input field. /// /// Example: /// ```dart /// final part = FormattedValuePart(DigitPart(), '5'); /// final updated = part.withValue('7'); /// ``` class FormattedValuePart { /// The input part definition that this value belongs to. InputPart part; /// The actual string value for this part, or null if not set. String? value; /// Creates a [FormattedValuePart]. /// /// Parameters: /// - [part] (`InputPart`, required): The input part definition. /// - [value] (`String?`, optional): The value for this part. const FormattedValuePart(this.part, [this.value]); /// Creates a copy of this part with a new value. /// /// Parameters: /// - [value] (`String`, required): The new value to associate with this part. /// /// Returns: A new [FormattedValuePart] with the updated value. /// /// Example: /// ```dart /// final original = FormattedValuePart(DigitPart(), '1'); /// final updated = original.withValue('2'); /// ``` FormattedValuePart withValue(String value); String toString(); bool operator ==(Object other); int get hashCode; } /// Represents a complete formatted value composed of multiple parts. /// /// A [FormattedValue] holds a list of [FormattedValuePart] instances, where /// each part represents either static text or editable fields. It provides /// methods to access value parts (excluding static parts) and retrieve /// individual parts by index. /// /// Example: /// ```dart /// final value = FormattedValue([ /// FormattedValuePart(DigitPart(), '1'), /// FormattedValuePart(StaticPart('/'), null), /// FormattedValuePart(DigitPart(), '2'), /// ]); /// print(value.values.length); // 2 (only value parts) /// ``` class FormattedValue { /// The list of parts that make up this formatted value. List parts; /// Creates a [FormattedValue]. /// /// Parameters: /// - [parts] (`List`, default: `const []`): The parts /// composing this value. const FormattedValue([this.parts = const []]); /// Returns an iterable of only the parts that can hold values. /// /// This excludes static parts like separators or fixed text. Iterable get values; /// Retrieves the value part at the specified index. /// /// This indexes only the parts that can hold values (excluding static parts). /// /// Parameters: /// - [index] (`int`, required): The zero-based index into value parts. /// /// Returns: The [FormattedValuePart] at the index, or null if out of bounds. /// /// Example: /// ```dart /// final value = FormattedValue([ /// FormattedValuePart(DigitPart(), '1'), /// FormattedValuePart(StaticPart('/'), null), /// FormattedValuePart(DigitPart(), '2'), /// ]); /// print(value[0]?.value); // '1' /// print(value[1]?.value); // '2' /// ``` FormattedValuePart? operator [](int index); String toString(); bool operator ==(Object other); int get hashCode; } /// A controller for managing [FormattedInput] values programmatically. /// /// This controller extends `ValueNotifier` to provide reactive /// state management for formatted input components. It implements [ComponentController] /// to integrate with the controlled component system, allowing external control /// and listening to formatted input changes. /// /// Example: /// ```dart /// final controller = FormattedInputController( /// FormattedValue([ /// FormattedValuePart.static('('), /// FormattedValuePart.editable('', length: 3), /// FormattedValuePart.static(') '), /// FormattedValuePart.editable('', length: 3), /// FormattedValuePart.static('-'), /// FormattedValuePart.editable('', length: 4), /// ]) /// ); /// ``` class FormattedInputController extends ValueNotifier with ComponentController { /// Creates a [FormattedInputController] with an optional initial value. /// /// Parameters: /// - [value] (FormattedValue, default: empty): Initial formatted value FormattedInputController([super.value = const FormattedValue()]); } /// A controlled input widget for structured data entry with formatting. /// /// This widget provides a sophisticated input system that combines static text /// elements with editable fields in a single input interface. It's ideal for /// formatted inputs like phone numbers, credit cards, dates, or any structured /// data that requires specific formatting patterns. /// /// The FormattedInput manages multiple editable segments, each with their own /// validation, formatting, and input restrictions. It automatically handles /// focus management between segments and provides a seamless user experience /// with proper keyboard navigation. /// /// Example: /// ```dart /// FormattedInput( /// style: TextStyle(fontFamily: 'monospace'), /// leading: Icon(Icons.phone), /// initialValue: FormattedValue([ /// FormattedValuePart.static('('), /// FormattedValuePart.editable('555', length: 3), /// FormattedValuePart.static(') '), /// FormattedValuePart.editable('123', length: 3), /// FormattedValuePart.static('-'), /// FormattedValuePart.editable('4567', length: 4), /// ]), /// ); /// ``` class FormattedInput extends StatefulWidget with ControlledComponent { FormattedValue? initialValue; ValueChanged? onChanged; bool enabled; FormattedInputController? controller; /// Text style applied to all input segments. /// /// This style affects both static text and editable input fields within /// the formatted input. Using a monospace font family is recommended /// for consistent character spacing across segments. TextStyle? style; /// Widget displayed at the beginning of the input. /// /// Commonly used for icons or labels that provide context for the input /// content, such as a phone icon for phone number inputs. Widget? leading; /// Widget displayed at the end of the input. /// /// Can be used for action buttons, status indicators, or additional /// context related to the input content. Widget? trailing; /// Creates a [FormattedInput]. /// /// The input structure is defined by the [initialValue] or [controller] /// value, which contains the mix of static text and editable segments. /// Each editable segment can have its own length restrictions and formatting. /// /// Parameters: /// - [initialValue] (FormattedValue?, optional): Initial structure and values /// - [onChanged] (`ValueChanged?`, optional): Callback for value changes /// - [style] (TextStyle?, optional): Text styling for all segments /// - [leading] (Widget?, optional): Widget displayed before the input /// - [trailing] (Widget?, optional): Widget displayed after the input /// - [enabled] (bool, default: true): Whether the input accepts user interaction /// - [controller] (FormattedInputController?, optional): External controller for programmatic control /// /// Example: /// ```dart /// FormattedInput( /// initialValue: FormattedValue([ /// FormattedValuePart.static('$'), /// FormattedValuePart.editable('0.00', length: 8), /// ]), /// leading: Icon(Icons.attach_money), /// style: TextStyle(fontSize: 16), /// ); /// ``` const FormattedInput({super.key, this.initialValue, this.onChanged, this.style, this.leading, this.trailing, this.enabled = true, this.controller}); State createState(); } /// Internal data structure for formatted input parts. /// /// [FormattedInputData] holds the state and configuration data needed /// to render and manage an individual input part within a formatted input. class FormattedInputData { /// The index of this part in the formatted input. int partIndex; /// The initial value for this part. String? initialValue; /// Whether this part is enabled for editing. bool enabled; /// The controller managing the overall formatted input. FormattedInputController? controller; /// The focus node for this specific part. FocusNode? focusNode; /// All focus nodes in the formatted input. List focusNodes; /// Creates a [FormattedInputData]. FormattedInputData({required this.partIndex, required this.initialValue, required this.enabled, required this.controller, required this.focusNode, required this.focusNodes}); bool operator ==(Object other); int get hashCode; } /// A formatted input widget that works with complex objects. /// /// [FormattedObjectInput] extends formatted input functionality to handle /// objects of type [T], converting between the object and its formatted /// string representation. It can optionally display a popup for advanced editing. /// /// Example: /// ```dart /// FormattedObjectInput( /// converter: dateConverter, /// parts: [ /// InputPart.editable(length: 2, width: 30), // Month /// InputPart.static('/'), /// InputPart.editable(length: 2, width: 30), // Day /// ], /// popupBuilder: (context, controller) => CalendarWidget(), /// ) /// ``` class FormattedObjectInput extends StatefulWidget with ControlledComponent { /// The initial value of the input. T? initialValue; /// Called when the value changes. ValueChanged? onChanged; /// Called when the individual parts change. ValueChanged>? onPartsChanged; /// Builder for creating a custom popup widget. FormattedInputPopupBuilder? popupBuilder; /// Whether the input is enabled. bool enabled; /// Optional controller for external control. ComponentController? controller; /// Converter between the object type and string parts. BiDirectionalConvert> converter; /// The input parts that make up the formatted input. List parts; /// Alignment of the popover relative to the anchor. AlignmentGeometry? popoverAlignment; /// Anchor alignment for popover positioning. AlignmentGeometry? popoverAnchorAlignment; /// Offset for the popover position. Offset? popoverOffset; /// Icon displayed in the popover trigger. Widget? popoverIcon; /// Creates a [FormattedObjectInput]. const FormattedObjectInput({super.key, this.initialValue, this.onChanged, this.popupBuilder, this.enabled = true, this.controller, required this.converter, required this.parts, this.popoverAlignment, this.popoverAnchorAlignment, this.popoverOffset, this.popoverIcon, this.onPartsChanged}); State> createState(); } /// Theme data for customizing [TextField] appearance. /// /// This class defines the visual properties that can be applied to /// [TextField] widgets, including border styling, fill state, padding, /// and border radius. These properties can be set at the theme level /// to provide consistent styling across the application. class TextFieldTheme { /// Border radius for text field corners. /// /// If `null`, uses default border radius from the theme. BorderRadiusGeometry? borderRadius; /// Whether the text field has a filled background. /// /// When `true`, applies a background fill color. bool? filled; /// Padding inside the text field. /// /// If `null`, uses default padding from the theme. EdgeInsetsGeometry? padding; /// Border style for the text field. /// /// If `null`, uses default border from the theme. Border? border; /// Creates a [TextFieldTheme]. /// /// Parameters: /// - [border] (`Border?`, optional): Border style. /// - [borderRadius] (`BorderRadiusGeometry?`, optional): Corner rounding. /// - [filled] (`bool?`, optional): Whether background is filled. /// - [padding] (`EdgeInsetsGeometry?`, optional): Internal padding. const TextFieldTheme({this.border, this.borderRadius, this.filled, this.padding}); /// Creates a copy of this theme with the given fields replaced. /// /// Parameters use value getters to allow `null` values to be explicitly set. TextFieldTheme copyWith({ValueGetter? border, ValueGetter? borderRadius, ValueGetter? filled, ValueGetter? padding}); bool operator ==(Object other); int get hashCode; } /// Standard height for text field components in logical pixels. const kTextFieldHeight = 34; /// Abstract base class for controlling input feature visibility. /// /// Defines when UI elements like clear buttons, password toggles, or other /// input features should be visible based on text field state. Supports /// logical operations (AND, OR, NOT) to combine multiple visibility conditions. /// /// Example: /// ```dart /// // Show clear button when text is not empty and field is focused /// final visibility = InputFeatureVisibility.textNotEmpty & /// InputFeatureVisibility.focused; /// ``` abstract class InputFeatureVisibility { /// Creates a visibility condition that is true when all [features] are true. factory InputFeatureVisibility.and(Iterable features); /// Creates a visibility condition that is true when any [features] is true. factory InputFeatureVisibility.or(Iterable features); /// Creates a visibility condition that inverts the given [feature]. factory InputFeatureVisibility.not(InputFeatureVisibility feature); /// Visibility condition: text field is not empty. static const InputFeatureVisibility textNotEmpty = _TextNotEmptyInputFeatureVisibility(); /// Visibility condition: text field is empty. static const InputFeatureVisibility textEmpty = _TextEmptyInputFeatureVisibility(); /// Visibility condition: text field has focus. static const InputFeatureVisibility focused = _FocusedInputFeatureVisibility(); /// Visibility condition: text field is being hovered. static const InputFeatureVisibility hovered = _HoveredInputFeatureVisibility(); /// Visibility condition: never visible. static const InputFeatureVisibility never = _NeverVisibleInputFeatureVisibility(); /// Visibility condition: always visible. static const InputFeatureVisibility always = _AlwaysVisibleInputFeatureVisibility(); /// Visibility condition: text field has selected text. static const InputFeatureVisibility hasSelection = _HasSelectionInputFeatureVisibility(); /// Creates an [InputFeatureVisibility]. const InputFeatureVisibility(); /// Gets the listenable dependencies for this visibility condition. /// /// Returns the state objects that should be monitored for changes. Iterable getDependencies(TextFieldState state); /// Checks if the feature can be shown in the current state. /// /// Returns `true` if all visibility conditions are met. bool canShow(TextFieldState state); /// Combines this visibility with [other] using logical AND. InputFeatureVisibility and(InputFeatureVisibility other); /// Operator form of [and]. Combines conditions with logical AND. InputFeatureVisibility operator &(InputFeatureVisibility other); /// Combines this visibility with [other] using logical OR. InputFeatureVisibility or(InputFeatureVisibility other); /// Operator form of [or]. Combines conditions with logical OR. InputFeatureVisibility operator |(InputFeatureVisibility other); /// Inverts this visibility condition using logical NOT. InputFeatureVisibility operator ~(); } /// Abstract factory for creating input field feature components. /// /// Provides factory constructors for common text field features like password /// toggles, clear buttons, hints, autocomplete, and spinners. Features can be /// conditionally shown based on field state using [InputFeatureVisibility]. /// /// Example: /// ```dart /// TextField( /// leading: [ /// InputFeature.hint( /// popupBuilder: (context) => Text('Enter email'), /// ), /// ], /// trailing: [ /// InputFeature.clear(), /// InputFeature.passwordToggle(), /// ], /// ) /// ``` abstract class InputFeature { /// Creates a hint/tooltip feature for the input field. /// /// Parameters: /// - [visibility] (`InputFeatureVisibility`, default: always): When to show hint. /// - [popupBuilder] (`WidgetBuilder`, required): Builds the hint popup content. /// - [icon] (`Widget?`, optional): Icon to display for the hint trigger. /// - [position] (`InputFeaturePosition`, default: trailing): Where to place the hint. /// - [enableShortcuts] (`bool`, default: true): Enable keyboard shortcuts. /// - [skipFocusTraversal] (`bool`, default: false): Skip in focus order. factory InputFeature.hint({InputFeatureVisibility visibility, required WidgetBuilder popupBuilder, Widget? icon, InputFeaturePosition position, bool enableShortcuts, bool skipFocusTraversal}); /// Creates a password visibility toggle feature. /// /// Parameters: /// - [visibility] (`InputFeatureVisibility`, default: always): When to show toggle. /// - [mode] (`PasswordPeekMode`, default: toggle): Toggle or peek mode. /// - [position] (`InputFeaturePosition`, default: trailing): Where to place toggle. /// - [icon] (`Widget?`, optional): Icon when password is hidden. /// - [iconShow] (`Widget?`, optional): Icon when password is visible. /// - [skipFocusTraversal] (`bool`, default: false): Skip in focus order. factory InputFeature.passwordToggle({InputFeatureVisibility visibility, PasswordPeekMode mode, InputFeaturePosition position, Widget? icon, Widget? iconShow, bool skipFocusTraversal}); /// Creates a clear text button feature. /// /// Parameters: /// - [visibility] (`InputFeatureVisibility`, default: textNotEmpty): When to show clear button. /// - [position] (`InputFeaturePosition`, default: trailing): Where to place button. /// - [icon] (`Widget?`, optional): Custom clear icon. /// - [skipFocusTraversal] (`bool`, default: false): Skip in focus order. factory InputFeature.clear({InputFeatureVisibility visibility, InputFeaturePosition position, Widget? icon, bool skipFocusTraversal}); /// Creates a revalidate button feature. /// /// Triggers form validation when clicked. /// /// Parameters: /// - [visibility] (`InputFeatureVisibility`, default: always): When to show button. /// - [position] (`InputFeaturePosition`, default: trailing): Where to place button. /// - [icon] (`Widget?`, optional): Custom revalidate icon. /// - [skipFocusTraversal] (`bool`, default: false): Skip in focus order. factory InputFeature.revalidate({InputFeatureVisibility visibility, InputFeaturePosition position, Widget? icon, bool skipFocusTraversal}); /// Creates an autocomplete feature. /// /// Parameters: /// - [visibility] (`InputFeatureVisibility`, default: focused): When to show autocomplete. /// - [querySuggestions] (`SuggestionBuilder`, required): Builds suggestion list. /// - [child] (`Widget`, required): Child widget in the autocomplete popup. /// - [popoverConstraints] (`BoxConstraints?`, optional): Size constraints for popup. /// - [popoverWidthConstraint] (`PopoverConstraint?`, optional): Width constraint mode. /// - [popoverAnchorAlignment] (`AlignmentDirectional?`, optional): Anchor alignment. /// - [popoverAlignment] (`AlignmentDirectional?`, optional): Popup alignment. /// - [mode] (`AutoCompleteMode`, default: popup): Display mode. /// - [skipFocusTraversal] (`bool`, default: false): Skip in focus order. factory InputFeature.autoComplete({InputFeatureVisibility visibility, required SuggestionBuilder querySuggestions, required Widget child, BoxConstraints? popoverConstraints, PopoverConstraint? popoverWidthConstraint, AlignmentDirectional? popoverAnchorAlignment, AlignmentDirectional? popoverAlignment, AutoCompleteMode mode, bool skipFocusTraversal}); /// Creates a numeric spinner feature for incrementing/decrementing values. /// /// Parameters: /// - [visibility] (`InputFeatureVisibility`, default: always): When to show spinner. /// - [step] (`double`, default: 1): Increment/decrement step size. /// - [enableGesture] (`bool`, default: true): Enable drag gestures. /// - [invalidValue] (`double?`, optional): Value to use when input is invalid. /// - [skipFocusTraversal] (`bool`, default: false): Skip in focus order. factory InputFeature.spinner({InputFeatureVisibility visibility, double step, bool enableGesture, double? invalidValue, bool skipFocusTraversal}); /// Creates a copy to clipboard button feature. /// /// Parameters: /// - [visibility] (`InputFeatureVisibility`, default: textNotEmpty): When to show copy button. /// - [position] (`InputFeaturePosition`, default: trailing): Where to place button. /// - [icon] (`Widget?`, optional): Custom copy icon. /// - [skipFocusTraversal] (`bool`, default: false): Skip in focus order. factory InputFeature.copy({InputFeatureVisibility visibility, InputFeaturePosition position, Widget? icon, bool skipFocusTraversal}); /// Creates a paste from clipboard button feature. /// /// Parameters: /// - [visibility] (`InputFeatureVisibility`, default: always): When to show paste button. /// - [position] (`InputFeaturePosition`, default: trailing): Where to place button. /// - [icon] (`Widget?`, optional): Custom paste icon. /// - [skipFocusTraversal] (`bool`, default: false): Skip in focus order. factory InputFeature.paste({InputFeatureVisibility visibility, InputFeaturePosition position, Widget? icon, bool skipFocusTraversal}); /// Creates a custom leading widget feature. /// /// Parameters: /// - [child] (`Widget`, required): Widget to display. /// - [visibility] (`InputFeatureVisibility`, default: always): When to show widget. /// - [skipFocusTraversal] (`bool`, default: false): Skip in focus order. factory InputFeature.leading(Widget child, {InputFeatureVisibility visibility, bool skipFocusTraversal}); /// Creates a custom trailing widget feature. factory InputFeature.trailing(Widget child, {InputFeatureVisibility visibility, bool skipFocusTraversal}); /// Visibility mode for this input feature. InputFeatureVisibility visibility; /// Whether to skip this feature in focus traversal. bool skipFocusTraversal; /// Creates an input feature. const InputFeature({this.visibility = InputFeatureVisibility.always, this.skipFocusTraversal = true}); /// Creates the state for this input feature. InputFeatureState createState(); /// Checks if an old feature can be updated to a new feature. static bool canUpdate(InputFeature oldFeature, InputFeature newFeature); } /// Abstract base state class for input features. /// /// Manages the lifecycle and state of features that extend text field /// functionality, such as clear buttons, counters, or custom decorations. abstract class InputFeatureState { /// The input feature associated with this state. T get feature; /// The ticker provider for animations. TickerProvider get tickerProvider; /// The build context for this feature. BuildContext get context; /// The parent text field widget. TextField get input; /// Whether this feature is currently attached to a text field. bool get attached; /// The text editing controller for the text field. TextEditingController get controller; /// Initializes this feature state. /// /// Called when the feature is first attached to a text field. void initState(); /// Called when dependencies change. /// /// Override to respond to dependency changes in the widget tree. void didChangeDependencies(); /// Disposes resources used by this feature state. /// /// Called when the feature is detached from the text field. void dispose(); /// Called when the feature is updated. /// /// Override to respond to feature configuration changes. void didFeatureUpdate(InputFeature oldFeature); /// Called when the text field's text changes. /// /// Override to respond to text changes. void onTextChanged(String text); /// Called when the text field's selection changes. /// /// Override to respond to selection changes. void onSelectionChanged(TextSelection selection); /// Builds leading widgets for the text field. /// /// Override to provide widgets shown before the input. Iterable buildLeading(); /// Builds trailing widgets for the text field. /// /// Override to provide widgets shown after the input. Iterable buildTrailing(); /// Builds actions for keyboard shortcuts. /// /// Override to provide custom actions. Iterable>> buildActions(); /// Builds keyboard shortcuts. /// /// Override to provide custom keyboard shortcuts. Iterable> buildShortcuts(); /// Wraps the text field widget. /// /// Override to wrap the field with additional widgets. Widget wrap(Widget child); /// Intercepts and modifies the text field configuration. /// /// Override to modify the text field before rendering. TextField interceptInput(TextField input); /// Triggers a state update for the attached text field. /// /// Parameters: /// - [fn] (`VoidCallback`, required): State update callback. /// /// Throws: AssertionError if feature is not attached. void setState(VoidCallback fn); } /// Mixin defining the interface for text input widgets. /// /// Provides a comprehensive set of properties that text input widgets /// must implement, ensuring consistency across [TextField], [ChipInput], /// [TextArea], and similar components. This mixin helps avoid missing /// properties when implementing custom text input widgets. /// /// Properties are organized into categories: /// - Basic configuration: groupId, controller, focusNode /// - Visual styling: decoration, padding, placeholder, border, borderRadius /// - Text configuration: style, strutStyle, textAlign, textDirection /// - Input behavior: keyboardType, textInputAction, autocorrect, enableSuggestions /// - Cursor styling: cursorWidth, cursorHeight, cursorRadius, cursorColor /// - Selection: enableInteractiveSelection, selectionControls, selectionHeightStyle /// - Callbacks: onChanged, onSubmitted, onEditingComplete, onTap /// - Features: features, inputFormatters, submitFormatters mixin TextInput on Widget { /// Group identifier for related text inputs. Object get groupId; /// Text editing controller for the input. TextEditingController? get controller; /// Focus node for keyboard focus management. FocusNode? get focusNode; /// Box decoration for the input container. BoxDecoration? get decoration; /// Padding inside the input. EdgeInsetsGeometry? get padding; /// Placeholder widget shown when empty. Widget? get placeholder; /// Cross-axis alignment for content. CrossAxisAlignment get crossAxisAlignment; /// Semantic label for the clear button. String? get clearButtonSemanticLabel; /// Type of keyboard to show. TextInputType? get keyboardType; /// Action button on the keyboard. TextInputAction? get textInputAction; /// Text capitalization behavior. TextCapitalization get textCapitalization; /// Text style for input content. TextStyle? get style; /// Strut style for text layout. StrutStyle? get strutStyle; /// Horizontal text alignment. TextAlign get textAlign; /// Vertical text alignment. TextAlignVertical? get textAlignVertical; /// Text direction. TextDirection? get textDirection; /// Whether the input is read-only. bool get readOnly; /// Whether to show the cursor. bool? get showCursor; /// Whether to auto-focus on mount. bool get autofocus; /// Character used for obscuring text. String get obscuringCharacter; /// Whether to obscure text (password fields). bool get obscureText; /// Whether to enable autocorrection. bool get autocorrect; /// Smart dashes behavior. SmartDashesType get smartDashesType; /// Smart quotes behavior. SmartQuotesType get smartQuotesType; /// Whether to enable suggestions. bool get enableSuggestions; /// Maximum number of lines. int? get maxLines; /// Minimum number of lines. int? get minLines; /// Whether the input should expand to fill available space. bool get expands; /// Maximum character length. int? get maxLength; /// How to enforce max length. MaxLengthEnforcement? get maxLengthEnforcement; /// Callback when text changes. ValueChanged? get onChanged; /// Callback when editing is complete. VoidCallback? get onEditingComplete; /// Callback when text is submitted. ValueChanged? get onSubmitted; /// Callback when tapped outside. TapRegionCallback? get onTapOutside; /// Callback when tap up occurs outside. TapRegionCallback? get onTapUpOutside; /// Input formatters for text. List? get inputFormatters; /// Whether the input is enabled. bool get enabled; /// Width of the cursor. double get cursorWidth; /// Height of the cursor. double? get cursorHeight; /// Radius of the cursor. Radius get cursorRadius; /// Whether cursor opacity animates. bool get cursorOpacityAnimates; /// Color of the cursor. Color? get cursorColor; /// Selection height style. ui.BoxHeightStyle get selectionHeightStyle; /// Selection width style. ui.BoxWidthStyle get selectionWidthStyle; /// Keyboard appearance brightness. Brightness? get keyboardAppearance; /// Scroll padding for keyboard avoidance. EdgeInsets get scrollPadding; /// Whether interactive selection is enabled. bool get enableInteractiveSelection; /// Controls for text selection. TextSelectionControls? get selectionControls; /// Drag start behavior. DragStartBehavior get dragStartBehavior; /// Scroll controller. ScrollController? get scrollController; /// Scroll physics. ScrollPhysics? get scrollPhysics; /// Callback when tapped. GestureTapCallback? get onTap; /// Autofill hints for the platform. Iterable? get autofillHints; /// Clip behavior. Clip get clipBehavior; /// Restoration ID for state restoration. String? get restorationId; /// Whether stylus handwriting is enabled. bool get stylusHandwritingEnabled; /// Whether IME personalized learning is enabled. bool get enableIMEPersonalizedLearning; /// Content insertion configuration. ContentInsertionConfiguration? get contentInsertionConfiguration; /// Context menu builder. EditableTextContextMenuBuilder? get contextMenuBuilder; /// Initial value for the input. String? get initialValue; /// Hint text displayed when empty. String? get hintText; /// Border styling. Border? get border; /// Border radius. BorderRadiusGeometry? get borderRadius; /// Whether the input has a filled background. bool? get filled; /// Widget states controller. WidgetStatesController? get statesController; /// Magnifier configuration. TextMagnifierConfiguration? get magnifierConfiguration; /// Spell check configuration. SpellCheckConfiguration? get spellCheckConfiguration; /// Undo history controller. UndoHistoryController? get undoController; /// List of input features. List get features; /// Input formatters applied on submit. List? get submitFormatters; /// Whether to skip focus traversal for input features. bool get skipInputFeatureFocusTraversal; } /// Abstract base class for stateful text input widgets. /// /// Combines [StatefulWidget] with [TextInput] mixin to provide a base /// for implementing text input components with state. abstract class TextInputStatefulWidget extends StatefulWidget with TextInput { Object groupId; TextEditingController? controller; FocusNode? focusNode; BoxDecoration? decoration; EdgeInsetsGeometry? padding; Widget? placeholder; CrossAxisAlignment crossAxisAlignment; String? clearButtonSemanticLabel; TextInputType? keyboardType; TextInputAction? textInputAction; TextCapitalization textCapitalization; TextStyle? style; StrutStyle? strutStyle; TextAlign textAlign; TextAlignVertical? textAlignVertical; TextDirection? textDirection; bool readOnly; bool? showCursor; bool autofocus; String obscuringCharacter; bool obscureText; bool autocorrect; SmartDashesType smartDashesType; SmartQuotesType smartQuotesType; bool enableSuggestions; int? maxLines; int? minLines; bool expands; int? maxLength; MaxLengthEnforcement? maxLengthEnforcement; ValueChanged? onChanged; VoidCallback? onEditingComplete; ValueChanged? onSubmitted; TapRegionCallback? onTapOutside; TapRegionCallback? onTapUpOutside; List? inputFormatters; bool enabled; double cursorWidth; double? cursorHeight; Radius cursorRadius; bool cursorOpacityAnimates; Color? cursorColor; ui.BoxHeightStyle selectionHeightStyle; ui.BoxWidthStyle selectionWidthStyle; Brightness? keyboardAppearance; EdgeInsets scrollPadding; bool enableInteractiveSelection; TextSelectionControls? selectionControls; DragStartBehavior dragStartBehavior; ScrollController? scrollController; ScrollPhysics? scrollPhysics; GestureTapCallback? onTap; Iterable? autofillHints; Clip clipBehavior; String? restorationId; bool stylusHandwritingEnabled; bool enableIMEPersonalizedLearning; ContentInsertionConfiguration? contentInsertionConfiguration; EditableTextContextMenuBuilder? contextMenuBuilder; String? initialValue; String? hintText; Border? border; BorderRadiusGeometry? borderRadius; bool? filled; WidgetStatesController? statesController; TextMagnifierConfiguration? magnifierConfiguration; SpellCheckConfiguration? spellCheckConfiguration; UndoHistoryController? undoController; List features; List? submitFormatters; bool skipInputFeatureFocusTraversal; /// Creates a stateful text input widget with comprehensive configuration options. /// /// This constructor accepts all properties defined in the [TextInput] mixin, /// providing extensive control over text input behavior, appearance, and interactions. /// /// Most parameters mirror Flutter's [EditableText] widget while adding custom /// features like input features, decorations, and form integration. /// /// Key parameters include: /// - [controller]: Text editing controller, created automatically if null /// - [focusNode]: Focus node for keyboard interaction /// - [decoration]: Box decoration for the input container /// - [padding]: Inner padding around the text field /// - [placeholder]: Widget shown when field is empty /// - [enabled]: Whether input accepts user interaction, defaults to true /// - [readOnly]: Whether text can be edited, defaults to false /// - [obscureText]: Whether to hide input (for passwords), defaults to false /// - [maxLines]: Maximum number of lines, defaults to 1 /// - [features]: List of input features (e.g., clear button, character count) /// /// See [TextInput] mixin documentation for full parameter details. const TextInputStatefulWidget({super.key, this.groupId = EditableText, this.controller, this.focusNode, this.decoration, this.padding, this.placeholder, this.crossAxisAlignment = CrossAxisAlignment.center, this.clearButtonSemanticLabel, this.keyboardType, this.textInputAction, this.textCapitalization = TextCapitalization.none, this.style, this.strutStyle, this.textAlign = TextAlign.start, this.textAlignVertical, this.textDirection, this.readOnly = false, this.showCursor, this.autofocus = false, this.obscuringCharacter = '•', this.obscureText = false, this.autocorrect = true, this.smartDashesType = SmartDashesType.enabled, this.smartQuotesType = SmartQuotesType.enabled, this.enableSuggestions = true, this.maxLines = 1, this.minLines, this.expands = false, this.maxLength, this.maxLengthEnforcement, this.onChanged, this.onEditingComplete, this.onSubmitted, this.onTapOutside, this.onTapUpOutside, this.inputFormatters, this.enabled = true, this.cursorWidth = 2.0, this.cursorHeight, this.cursorRadius = const Radius.circular(2.0), this.cursorOpacityAnimates = true, this.cursorColor, this.selectionHeightStyle = ui.BoxHeightStyle.tight, this.selectionWidthStyle = ui.BoxWidthStyle.tight, this.keyboardAppearance, this.scrollPadding = const EdgeInsets.all(20.0), this.enableInteractiveSelection = true, this.selectionControls, this.dragStartBehavior = DragStartBehavior.start, this.scrollController, this.scrollPhysics, this.onTap, this.autofillHints = const [], this.clipBehavior = Clip.hardEdge, this.restorationId, this.stylusHandwritingEnabled = EditableText.defaultStylusHandwritingEnabled, this.enableIMEPersonalizedLearning = true, this.contentInsertionConfiguration, this.contextMenuBuilder, this.initialValue, this.hintText, this.border, this.borderRadius, this.filled, this.statesController, this.magnifierConfiguration, this.spellCheckConfiguration, this.undoController, this.features = const [], this.submitFormatters = const [], this.skipInputFeatureFocusTraversal = false}); /// Creates a copy of this text field with the given properties replaced. /// /// All parameters are optional and allow selective property replacement. TextField copyWith({ValueGetter? key, ValueGetter? groupId, ValueGetter? controller, ValueGetter? initialValue, ValueGetter? focusNode, ValueGetter? undoController, ValueGetter? decoration, ValueGetter? padding, ValueGetter? placeholder, ValueGetter? crossAxisAlignment, ValueGetter? clearButtonSemanticLabel, ValueGetter? keyboardType, ValueGetter? textInputAction, ValueGetter? textCapitalization, ValueGetter? style, ValueGetter? strutStyle, ValueGetter? textAlign, ValueGetter? textAlignVertical, ValueGetter? textDirection, ValueGetter? readOnly, ValueGetter? showCursor, ValueGetter? autofocus, ValueGetter? obscuringCharacter, ValueGetter? obscureText, ValueGetter? autocorrect, ValueGetter? smartDashesType, ValueGetter? smartQuotesType, ValueGetter? enableSuggestions, ValueGetter? maxLines, ValueGetter? minLines, ValueGetter? expands, ValueGetter? maxLength, ValueGetter? maxLengthEnforcement, ValueGetter?>? onChanged, ValueGetter? onEditingComplete, ValueGetter?>? onSubmitted, ValueGetter? onTapOutside, ValueGetter? onTapUpOutside, ValueGetter?>? inputFormatters, ValueGetter? enabled, ValueGetter? cursorWidth, ValueGetter? cursorHeight, ValueGetter? cursorRadius, ValueGetter? cursorOpacityAnimates, ValueGetter? cursorColor, ValueGetter? selectionHeightStyle, ValueGetter? selectionWidthStyle, ValueGetter? keyboardAppearance, ValueGetter? scrollPadding, ValueGetter? enableInteractiveSelection, ValueGetter? selectionControls, ValueGetter? dragStartBehavior, ValueGetter? scrollController, ValueGetter? scrollPhysics, ValueGetter? onTap, ValueGetter?>? autofillHints, ValueGetter? clipBehavior, ValueGetter? restorationId, ValueGetter? stylusHandwritingEnabled, ValueGetter? enableIMEPersonalizedLearning, ValueGetter? contentInsertionConfiguration, ValueGetter? contextMenuBuilder, ValueGetter? hintText, ValueGetter? border, ValueGetter? borderRadius, ValueGetter? filled, ValueGetter? statesController, ValueGetter? magnifierConfiguration, ValueGetter? spellCheckConfiguration, ValueGetter>? features, ValueGetter?>? submitFormatters, ValueGetter? skipInputFeatureFocusTraversal}); } /// A highly customizable single-line text input widget with extensive feature support. /// /// [TextField] provides a comprehensive text editing experience with support for /// a wide range of input types, validation, formatting, and interactive features. /// It serves as the foundation for most text input scenarios in the shadcn_flutter /// design system, offering both basic text input and advanced capabilities through /// its feature system. /// /// Key features: /// - Comprehensive text input with platform-native behavior /// - Extensive customization through [InputFeature] system /// - Built-in support for validation and formatting /// - Configurable appearance with theming support /// - Context menu customization and clipboard operations /// - Keyboard shortcuts and accessibility support /// - Form integration with automatic value management /// /// The widget supports various input modes: /// - Single-line text input (default) /// - Obscured text for passwords /// - Formatted input with custom formatters /// - Auto-completion and suggestions /// - Numeric input with spinners /// /// Input features can be added to enhance functionality: /// - Clear button for easy text clearing /// - Password visibility toggle /// - Copy/paste operations /// - Auto-complete suggestions /// - Validation indicators /// - Custom leading/trailing widgets /// /// Example: /// ```dart /// TextField( /// hintText: 'Enter your email', /// keyboardType: TextInputType.emailAddress, /// features: [ /// InputClearFeature(), /// InputRevalidateFeature(), /// ], /// onChanged: (text) => _handleTextChange(text), /// ); /// ``` class TextField extends TextInputStatefulWidget { /// Returns a native platform context menu builder. /// /// Uses the platform's default text selection toolbar. static EditableTextContextMenuBuilder nativeContextMenuBuilder(); /// Returns a Cupertino-style context menu builder. /// /// Uses iOS-style text selection toolbar. static EditableTextContextMenuBuilder cupertinoContextMenuBuilder(); /// Returns a Material Design context menu builder. /// /// Uses Material Design text selection toolbar. static EditableTextContextMenuBuilder materialContextMenuBuilder(); /// Creates a text input field widget. /// /// A comprehensive text field implementation with support for various input /// types, validation, formatting, and interactive features. All parameters /// are forwarded to the parent [TextInputStatefulWidget] constructor. /// /// This constructor provides extensive customization options matching Flutter's /// [EditableText] while adding custom features like input decorations, features, /// and form integration. /// /// Example: /// ```dart /// TextField( /// controller: myController, /// hintText: 'Enter text', /// keyboardType: TextInputType.text, /// maxLines: 3, /// onChanged: (value) => print(value), /// ) /// ``` /// /// See [TextInputStatefulWidget] and [TextInput] for parameter details. const TextField({super.key, super.groupId, super.controller, super.initialValue, super.focusNode, super.undoController, super.decoration, super.padding, super.placeholder, super.crossAxisAlignment, super.clearButtonSemanticLabel, super.keyboardType, super.textInputAction, super.textCapitalization, super.style, super.strutStyle, super.textAlign, super.textAlignVertical, super.textDirection, super.readOnly, super.showCursor, super.autofocus, super.obscuringCharacter, super.obscureText, super.autocorrect, super.smartDashesType, super.smartQuotesType, super.enableSuggestions, super.maxLines, super.minLines, super.expands, super.maxLength, super.maxLengthEnforcement, super.onChanged, super.onEditingComplete, super.onSubmitted, super.onTapOutside, super.onTapUpOutside, super.inputFormatters, super.enabled, super.cursorWidth, super.cursorHeight, super.cursorRadius, super.cursorOpacityAnimates, super.cursorColor, super.selectionHeightStyle, super.selectionWidthStyle, super.keyboardAppearance, super.scrollPadding, super.enableInteractiveSelection, super.selectionControls, super.dragStartBehavior, super.scrollController, super.scrollPhysics, super.onTap, super.autofillHints, super.clipBehavior, super.restorationId, super.stylusHandwritingEnabled, super.enableIMEPersonalizedLearning, super.contentInsertionConfiguration, super.contextMenuBuilder = defaultContextMenuBuilder, super.hintText, super.border, super.borderRadius, super.filled, super.statesController, super.magnifierConfiguration, super.spellCheckConfiguration, super.features, super.submitFormatters, super.skipInputFeatureFocusTraversal}); /// Default context menu builder for editable text. /// /// Builds the standard context menu for text selection operations. static Widget defaultContextMenuBuilder(BuildContext context, EditableTextState editableTextState); /// Default spell check suggestions toolbar builder. /// /// Builds the toolbar showing spell check suggestions. static Widget defaultSpellCheckSuggestionsToolbarBuilder(BuildContext context, EditableTextState editableTextState); State createState(); void debugFillProperties(DiagnosticPropertiesBuilder properties); } /// State class for [TextField] widget. /// /// Manages the text field's state including text editing, selection, /// input features, form integration, and restoration. class TextFieldState extends State with RestorationMixin, AutomaticKeepAliveClientMixin, FormValueSupplier, TickerProviderStateMixin implements TextSelectionGestureDetectorBuilderDelegate, AutofillClient { /// The effective text editing controller for this text field. /// /// Returns the widget's controller or the internally created controller. TextEditingController get effectiveController; bool get forcePressEnabled; GlobalKey editableTextKey; bool get selectionEnabled; void initState(); void didChangeDependencies(); void didUpdateWidget(TextField oldWidget); void restoreState(RestorationBucket? oldBucket, bool initialRestore); String? get restorationId; void dispose(); bool get wantKeepAlive; TextField get widget; String get autofillId; void autofill(TextEditingValue newEditingValue); TextInputConfiguration get textInputConfiguration; Widget build(BuildContext context); void didReplaceFormValue(String value); } /// Intent to append text to the current text field content. /// /// Used with Flutter's Actions/Shortcuts system to programmatically /// append text to a text field. class TextFieldAppendTextIntent extends Intent { /// Creates a [TextFieldAppendTextIntent] with the text to append. const TextFieldAppendTextIntent({required this.text}); /// The text to append to the current content. String text; } /// Intent to clear all text from the text field. /// /// Used with Flutter's Actions/Shortcuts system to programmatically /// clear text field content. class TextFieldClearIntent extends Intent { /// Creates a [TextFieldClearIntent]. const TextFieldClearIntent(); } /// Intent to replace the current word in the text field. /// /// Replaces the word at the current cursor position with new text. /// Used with Flutter's Actions/Shortcuts system. class TextFieldReplaceCurrentWordIntent extends Intent { /// Creates a [TextFieldReplaceCurrentWordIntent] with replacement text. const TextFieldReplaceCurrentWordIntent({required this.text}); /// The text to replace the current word with. String text; } /// Intent to set the entire text field content to a specific value. /// /// Replaces all existing text with the provided text. /// Used with Flutter's Actions/Shortcuts system. class TextFieldSetTextIntent extends Intent { /// Creates a [TextFieldSetTextIntent] with the new text. const TextFieldSetTextIntent({required this.text}); /// The text to set as the field's content. String text; } /// Intent to set the text selection in the text field. /// /// Used with Flutter's Actions/Shortcuts system to programmatically /// control cursor position and text selection. class TextFieldSetSelectionIntent extends Intent { /// The text selection to apply. TextSelection selection; /// Creates a [TextFieldSetSelectionIntent] with the selection. const TextFieldSetSelectionIntent({required this.selection}); } /// Intent to select all text in the field and copy it to clipboard. /// /// Combines selection and copy operations in a single intent. /// Used with Flutter's Actions/Shortcuts system. class TextFieldSelectAllAndCopyIntent extends Intent { /// Creates a [TextFieldSelectAllAndCopyIntent]. const TextFieldSelectAllAndCopyIntent(); } /// A file picker widget for selecting and managing file uploads. /// /// **Work in Progress** - This component is under active development and /// may have incomplete functionality or undergo API changes. /// /// Provides a comprehensive interface for file selection with drag-and-drop /// support, file management capabilities, and customizable presentation. /// Displays selected files as a list of manageable items with options /// for adding, removing, and organizing uploaded files. /// /// Supports hot drop functionality for drag-and-drop file uploads and /// provides visual feedback during file operations. The picker can be /// customized with titles, subtitles, and custom file item presentations. /// /// Example: /// ```dart /// FilePicker( /// title: Text('Upload Documents'), /// subtitle: Text('Drag files here or click to browse'), /// hotDropEnabled: true, /// onAdd: () => _selectFiles(), /// children: selectedFiles.map((file) => /// FileItem(file: file, onRemove: () => _removeFile(file)) /// ).toList(), /// ) /// ``` class FilePicker extends StatelessWidget { /// Title widget displayed above the file picker. Widget? title; /// Subtitle widget displayed below the title. Widget? subtitle; /// Whether drag-and-drop functionality is enabled. bool hotDropEnabled; /// Whether a drag-and-drop operation is currently in progress. bool hotDropping; /// List of file item widgets to display. List children; /// Callback when the add file button is pressed. VoidCallback? onAdd; /// Creates a [FilePicker]. /// /// Parameters: /// - [title] (`Widget?`, optional): Title displayed above picker. /// - [subtitle] (`Widget?`, optional): Subtitle below title. /// - [hotDropEnabled] (`bool`, default: `false`): Enable drag-and-drop. /// - [hotDropping] (`bool`, default: `false`): Currently dropping files. /// - [onAdd] (`VoidCallback?`, optional): Called when add button pressed. /// - [children] (`List`, required): File item widgets. const FilePicker({super.key, this.title, this.subtitle, this.hotDropEnabled = false, this.hotDropping = false, this.onAdd, required this.children}); Widget build(BuildContext context); } /// A widget representing a single file item in a file picker or upload list. /// /// [FileItem] displays information about a selected or uploaded file including /// name, size, type, and optional thumbnail. It provides interactive controls /// for file management such as remove, retry, download, and preview actions. /// /// Supports displaying upload progress for files currently being uploaded and /// provides visual feedback through thumbnails and status indicators. /// /// Example: /// ```dart /// FileItem( /// fileName: Text('document.pdf'), /// fileSize: Text('1.2 MB'), /// fileType: Text('PDF'), /// uploadProgress: 0.75, // 75% uploaded /// onRemove: () => removeFile(), /// thumbnail: Icon(Icons.picture_as_pdf), /// ) /// ``` class FileItem extends StatelessWidget { /// Upload progress from 0.0 to 1.0, or null if not uploading. double? uploadProgress; /// Called when the remove button is pressed. VoidCallback? onRemove; /// Called when the retry button is pressed (for failed uploads). VoidCallback? onRetry; /// Called when the download button is pressed. VoidCallback? onDownload; /// Optional thumbnail widget for the file. Widget? thumbnail; /// Called when the preview button is pressed. VoidCallback? onPreview; /// Widget displaying the file name. Widget fileName; /// Optional widget displaying the file size. Widget? fileSize; /// Optional widget displaying the file type/format. Widget? fileType; /// Creates a [FileItem]. const FileItem({super.key, this.uploadProgress, this.onRemove, this.onRetry, this.onDownload, this.thumbnail, this.onPreview, required this.fileName, this.fileSize, this.fileType}); Widget build(BuildContext context); } /// Theme data for customizing [Radio] widget appearance. /// /// This class defines the visual properties that can be applied to /// [Radio] widgets, including colors for different states and sizing. /// These properties can be set at the theme level to provide consistent /// styling across the application. /// /// The theme affects the radio button's visual appearance in both /// selected and unselected states, including border, background, /// and active indicator colors. class RadioTheme { /// Color of the radio indicator when selected. Color? activeColor; /// Border color of the radio button. Color? borderColor; /// Background color of the radio button. Color? backgroundColor; /// Size of the radio button. double? size; /// Creates a [RadioTheme]. /// /// Parameters: /// - [activeColor] (`Color?`, optional): Selected indicator color. /// - [borderColor] (`Color?`, optional): Border color. /// - [backgroundColor] (`Color?`, optional): Background color. /// - [size] (`double?`, optional): Radio button size. const RadioTheme({this.activeColor, this.borderColor, this.size, this.backgroundColor}); /// Creates a copy of this theme with the given fields replaced. /// /// Parameters: /// - [activeColor] (`ValueGetter?`, optional): New active color. /// - [borderColor] (`ValueGetter?`, optional): New border color. /// - [backgroundColor] (`ValueGetter?`, optional): New background color. /// - [size] (`ValueGetter?`, optional): New size. /// /// Returns: A new [RadioTheme] with updated properties. RadioTheme copyWith({ValueGetter? activeColor, ValueGetter? borderColor, ValueGetter? size, ValueGetter? backgroundColor}); bool operator ==(Object other); int get hashCode; } /// A radio button widget that displays a circular selection indicator. /// /// [Radio] provides a visual representation of a selectable option within /// a radio group. It displays as a circular button with an inner dot when /// selected and an empty circle when unselected. The widget supports focus /// indication and customizable colors and sizing. /// /// The radio button animates smoothly between selected and unselected states, /// providing visual feedback to user interactions. It integrates with the /// focus system to provide accessibility support and keyboard navigation. /// /// Typically used within [RadioItem] or [RadioGroup] components rather than /// standalone, as it only provides the visual representation without the /// interaction logic. /// /// Example: /// ```dart /// Radio( /// value: isSelected, /// focusing: hasFocus, /// size: 20, /// activeColor: Colors.blue, /// ); /// ``` class Radio extends StatelessWidget { /// Whether this radio button is selected. /// /// When true, displays the inner selection indicator. /// When false, shows only the outer circle border. bool value; /// Whether this radio button currently has focus. /// /// When true, displays a focus outline around the radio button /// for accessibility and keyboard navigation indication. bool focusing; /// Size of the radio button in logical pixels. /// /// Controls both the width and height of the circular radio button. /// If null, uses the size from the current [RadioTheme]. double? size; /// Color of the inner selection indicator when selected. /// /// Applied to the inner dot that appears when [value] is true. /// If null, uses the activeColor from the current [RadioTheme]. Color? activeColor; /// Color of the outer border circle. /// /// Applied to the border of the radio button in both selected and /// unselected states. If null, uses the borderColor from the current [RadioTheme]. Color? borderColor; /// Background color of the radio button circle. /// /// Applied as the fill color behind the border. If null, uses the /// backgroundColor from the current [RadioTheme]. Color? backgroundColor; /// Creates a [Radio] with the specified selection state and styling. /// /// The [value] parameter is required and determines whether the radio /// appears selected. All other parameters are optional and will fall /// back to theme values when not specified. /// /// Parameters: /// - [value] (bool, required): Whether the radio button is selected /// - [focusing] (bool, default: false): Whether the radio has focus /// - [size] (double?, optional): Size of the radio button in pixels /// - [activeColor] (Color?, optional): Color of the selection indicator /// - [borderColor] (Color?, optional): Color of the outer border /// - [backgroundColor] (Color?, optional): Color of the background fill /// /// Example: /// ```dart /// Radio( /// value: selectedValue == itemValue, /// focusing: focusNode.hasFocus, /// size: 18, /// ); /// ``` const Radio({super.key, required this.value, this.focusing = false, this.size, this.activeColor, this.borderColor, this.backgroundColor}); Widget build(BuildContext context); } /// Intent for navigating to the next item in a radio group. class NextItemIntent extends Intent { /// Creates a next item intent. const NextItemIntent(); } /// Intent for navigating to the previous item in a radio group. class PreviousItemIntent extends Intent { /// Creates a previous item intent. const PreviousItemIntent(); } /// A radio button item with optional leading and trailing widgets. /// /// Used within a [RadioGroup] to create selectable radio button options. class RadioItem extends StatefulWidget { /// Optional widget displayed before the radio button. Widget? leading; /// Optional widget displayed after the radio button. Widget? trailing; /// The value represented by this radio item. T value; /// Whether this radio item is enabled. bool enabled; /// Focus node for keyboard navigation. FocusNode? focusNode; /// Creates a radio item. const RadioItem({super.key, this.leading, this.trailing, required this.value, this.enabled = true, this.focusNode}); State> createState(); } /// A card-style radio button with custom content. /// /// Provides a larger, card-like selection area within a [RadioGroup]. class RadioCard extends StatefulWidget { /// The child widget displayed in the card. Widget child; /// The value represented by this radio card. T value; /// Whether this radio card is enabled. bool enabled; /// Focus node for keyboard navigation. FocusNode? focusNode; /// Creates a radio card. const RadioCard({super.key, required this.child, required this.value, this.enabled = true, this.focusNode}); State> createState(); } /// Theme data for the [RadioCard] widget. class RadioCardTheme { /// The cursor to use when the radio card is enabled. MouseCursor? enabledCursor; /// The cursor to use when the radio card is disabled. MouseCursor? disabledCursor; /// The color to use when the radio card is hovered over. Color? hoverColor; /// The default color to use. Color? color; /// The width of the border of the radio card. double? borderWidth; /// The width of the border of the radio card when selected. double? selectedBorderWidth; /// The radius of the border of the radio card. BorderRadiusGeometry? borderRadius; /// The padding of the radio card. EdgeInsetsGeometry? padding; /// The color of the border. Color? borderColor; /// The color of the border when selected. Color? selectedBorderColor; /// Theme data for the [RadioCard] widget. const RadioCardTheme({this.enabledCursor, this.disabledCursor, this.hoverColor, this.color, this.borderWidth, this.selectedBorderWidth, this.borderRadius, this.padding, this.borderColor, this.selectedBorderColor}); String toString(); /// Creates a copy of this [RadioCardTheme] but with the given fields replaced with the new values. RadioCardTheme copyWith({ValueGetter? enabledCursor, ValueGetter? disabledCursor, ValueGetter? hoverColor, ValueGetter? color, ValueGetter? borderWidth, ValueGetter? selectedBorderWidth, ValueGetter? borderRadius, ValueGetter? padding, ValueGetter? borderColor, ValueGetter? selectedBorderColor}); bool operator ==(Object other); int get hashCode; } /// Controller for managing [ControlledRadioGroup] state programmatically. /// /// Extends [ValueNotifier] to provide reactive state management for radio group /// components. Can be used to programmatically change selection, listen to /// state changes, and integrate with forms and other reactive systems. /// /// Example: /// ```dart /// final controller = RadioGroupController('option1'); /// /// // Listen to changes /// controller.addListener(() { /// print('Selection changed to: ${controller.value}'); /// }); /// /// // Update selection /// controller.value = 'option2'; /// ``` class RadioGroupController extends ValueNotifier with ComponentController { /// Creates a [RadioGroupController] with an optional initial value. /// /// The [value] parameter sets the initial selected option. Can be null /// to start with no selection. /// /// Parameters: /// - [value] (T?, optional): Initial selected value RadioGroupController([super.value]); } /// Reactive radio button group with automatic state management and exclusivity. /// /// A high-level radio group widget that provides automatic state management through /// the controlled component pattern. Manages mutual exclusion between radio options /// and supports both controller-based and callback-based state management. /// /// ## Features /// /// - **Mutual exclusion**: Automatically ensures only one radio button is selected /// - **Flexible layout**: Works with any child layout (Column, Row, Wrap, etc.) /// - **Keyboard navigation**: Full keyboard support with arrow keys and Space /// - **Form integration**: Automatic validation and form field registration /// - **State synchronization**: Keeps all radio buttons in sync automatically /// /// ## Usage Patterns /// /// **Controller-based (recommended for complex state):** /// ```dart /// final controller = RadioGroupController('small'); /// /// ControlledRadioGroup( /// controller: controller, /// child: Column( /// children: [ /// Radio(value: 'small', label: Text('Small')), /// Radio(value: 'medium', label: Text('Medium')), /// Radio(value: 'large', label: Text('Large')), /// ], /// ), /// ) /// ``` /// /// **Callback-based (simple state management):** /// ```dart /// String? selectedSize; /// /// ControlledRadioGroup( /// initialValue: selectedSize, /// onChanged: (size) => setState(() => selectedSize = size), /// child: Column( /// children: [ /// Radio(value: 'small', label: Text('Small')), /// Radio(value: 'medium', label: Text('Medium')), /// Radio(value: 'large', label: Text('Large')), /// ], /// ), /// ) /// ``` class ControlledRadioGroup extends StatelessWidget with ControlledComponent { T? initialValue; ValueChanged? onChanged; bool enabled; RadioGroupController? controller; /// Child widget containing the radio buttons. /// /// Usually a layout widget like Column, Row, or Wrap containing multiple /// [Radio] widgets. The radio group will manage the selection state /// of all descendant radio buttons automatically. Widget child; /// Creates a [ControlledRadioGroup]. /// /// Either [controller] or [onChanged] should be provided for interactivity. /// The widget supports both controller-based and callback-based state management /// patterns with automatic mutual exclusion between radio options. /// /// Parameters: /// - [controller] (`RadioGroupController?`, optional): external state controller /// - [initialValue] (T?, optional): starting selection when no controller /// - [onChanged] (`ValueChanged?`, optional): selection change callback /// - [enabled] (bool, default: true): whether radio group is interactive /// - [child] (Widget, required): layout containing radio buttons /// /// Example: /// ```dart /// ControlledRadioGroup( /// controller: controller, /// child: Column( /// children: [ /// Radio(value: 'option1', label: Text('Option 1')), /// Radio(value: 'option2', label: Text('Option 2')), /// ], /// ), /// ) /// ``` const ControlledRadioGroup({super.key, this.controller, this.initialValue, this.onChanged, this.enabled = true, required this.child}); Widget build(BuildContext context); } /// A group of radio buttons for single-selection input. /// /// Manages the selection state and provides context for child radio items. class RadioGroup extends StatefulWidget { /// The child widget containing radio items. Widget child; /// The currently selected value. T? value; /// Callback invoked when the selection changes. ValueChanged? onChanged; /// Whether the radio group is enabled. bool? enabled; /// Creates a radio group. const RadioGroup({super.key, required this.child, this.value, this.onChanged, this.enabled}); RadioGroupState createState(); } /// Data class holding radio group state information. /// /// Contains the selected item and enabled state for a radio group. class RadioGroupData { /// The currently selected item value. T? selectedItem; /// Whether the radio group is enabled. bool enabled; /// Creates radio group data. RadioGroupData(this.selectedItem, this.enabled); bool operator ==(Object other); int get hashCode; } /// State class for [RadioGroup] with form integration. /// /// Manages selection state and integrates with the form validation system. class RadioGroupState extends State> with FormValueSupplier> { /// Whether the radio group is currently enabled. bool get enabled; void initState(); void didUpdateWidget(covariant RadioGroup oldWidget); void didReplaceFormValue(T value); Widget build(BuildContext context); } /// A multi-line text input widget with resizable dimensions and comprehensive styling. /// /// [TextArea] provides an enhanced text editing experience with support for /// multi-line input, dynamic resizing capabilities, and extensive customization /// options. It supports both expandable height and width modes, allowing users /// to adjust the text area size by dragging resize handles. /// /// Key features: /// - Multi-line text editing with optional height/width expansion /// - Configurable minimum and maximum dimensions /// - Support for leading and trailing widgets /// - Comprehensive text formatting and input validation /// - Integration with Flutter's text editing ecosystem /// - Customizable appearance through theming /// /// The widget can operate in several resize modes: /// - Fixed size: When both [expandableHeight] and [expandableWidth] are false /// - Expandable height: When [expandableHeight] is true, allows vertical resizing /// - Expandable width: When [expandableWidth] is true, allows horizontal resizing /// - Fully expandable: When both expansion modes are enabled /// /// Example: /// ```dart /// TextArea( /// placeholder: Text('Enter your message...'), /// expandableHeight: true, /// minHeight: 100, /// maxHeight: 300, /// onChanged: (text) => print('Text: $text'), /// ); /// ``` class TextArea extends TextInputStatefulWidget { /// Whether the text area can be resized vertically by the user. /// /// When true, displays a resize handle that allows users to adjust /// the height of the text area within the specified min/max constraints. bool expandableHeight; /// Whether the text area can be resized horizontally by the user. /// /// When true, displays a resize handle that allows users to adjust /// the width of the text area within the specified min/max constraints. bool expandableWidth; /// Initial height of the text area in logical pixels. /// /// Sets the starting height when the text area is first displayed. /// If [expandableHeight] is true, users can resize from this initial value. double initialHeight; /// Initial width of the text area in logical pixels. /// /// Sets the starting width when the text area is first displayed. /// If [expandableWidth] is true, users can resize from this initial value. double initialWidth; /// Callback invoked when the text area height changes. /// /// Called when the user resizes the text area vertically. The callback /// receives the new height value in logical pixels. ValueChanged? onHeightChanged; /// Callback invoked when the text area width changes. /// /// Called when the user resizes the text area horizontally. The callback /// receives the new width value in logical pixels. ValueChanged? onWidthChanged; /// Minimum allowed width in logical pixels. /// /// Prevents the text area from being resized below this width value. /// Only applies when [expandableWidth] is true. double minWidth; /// Minimum allowed height in logical pixels. /// /// Prevents the text area from being resized below this height value. /// Only applies when [expandableHeight] is true. double minHeight; /// Maximum allowed width in logical pixels. /// /// Prevents the text area from being resized above this width value. /// Only applies when [expandableWidth] is true. double maxWidth; /// Maximum allowed height in logical pixels. /// /// Prevents the text area from being resized above this height value. /// Only applies when [expandableHeight] is true. double maxHeight; /// Creates a [TextArea] with comprehensive configuration options. /// /// The text area supports both controlled and uncontrolled modes. Use /// [controller] for controlled mode or [initialValue] for uncontrolled mode. /// The text area can be configured for resizing, styling, and various /// text input behaviors. /// /// Parameters: /// - [expandableHeight] (bool, default: false): Enable vertical resizing /// - [expandableWidth] (bool, default: false): Enable horizontal resizing /// - [initialHeight] (double, default: 100): Starting height in pixels /// - [initialWidth] (double, default: double.infinity): Starting width in pixels /// - [enabled] (bool, default: true): Whether the text area accepts input /// - [readOnly] (bool, default: false): Whether the text is read-only /// - [obscureText] (bool, default: false): Whether to hide the text /// - [obscuringCharacter] (String, default: '•'): Character for hiding text /// - [textAlign] (TextAlign, default: TextAlign.start): Horizontal text alignment /// - [minWidth] (double, default: 100): Minimum width constraint /// - [minHeight] (double, default: 100): Minimum height constraint /// - [maxWidth] (double, default: double.infinity): Maximum width constraint /// - [maxHeight] (double, default: double.infinity): Maximum height constraint /// - [textAlignVertical] (TextAlignVertical, default: top): Vertical text alignment /// - [clipBehavior] (Clip, default: Clip.hardEdge): Content clipping behavior /// - [autofocus] (bool, default: false): Whether to auto-focus on creation /// /// Example: /// ```dart /// TextArea( /// placeholder: Text('Enter your message'), /// expandableHeight: true, /// minHeight: 100, /// maxHeight: 300, /// onChanged: (text) => _handleTextChange(text), /// ); /// ``` const TextArea({super.key, super.groupId, super.controller, super.focusNode, super.decoration, super.padding, super.placeholder, super.crossAxisAlignment, super.clearButtonSemanticLabel, super.keyboardType, super.textInputAction, super.textCapitalization, super.style, super.strutStyle, super.textAlign, super.textAlignVertical, super.textDirection, super.readOnly, super.showCursor, super.autofocus, super.obscuringCharacter, super.obscureText, super.autocorrect, super.smartDashesType, super.smartQuotesType, super.enableSuggestions, super.maxLines, super.minLines, super.expands, super.maxLength, super.maxLengthEnforcement, super.onChanged, super.onEditingComplete, super.onSubmitted, super.onTapOutside, super.onTapUpOutside, super.inputFormatters, super.enabled, super.cursorWidth, super.cursorHeight, super.cursorRadius, super.cursorOpacityAnimates, super.cursorColor, super.selectionHeightStyle, super.selectionWidthStyle, super.keyboardAppearance, super.scrollPadding, super.enableInteractiveSelection, super.selectionControls, super.dragStartBehavior, super.scrollController, super.scrollPhysics, super.onTap, super.autofillHints, super.clipBehavior, super.restorationId, super.stylusHandwritingEnabled, super.enableIMEPersonalizedLearning, super.contentInsertionConfiguration, super.contextMenuBuilder, super.initialValue, super.hintText, super.border, super.borderRadius, super.filled, super.statesController, super.magnifierConfiguration, super.spellCheckConfiguration, super.undoController, super.features, super.submitFormatters, super.skipInputFeatureFocusTraversal, this.expandableHeight = false, this.expandableWidth = false, this.initialHeight = 100, this.initialWidth = double.infinity, this.onHeightChanged, this.onWidthChanged, this.minWidth = 100, this.minHeight = 100, this.maxWidth = double.infinity, this.maxHeight = double.infinity}); State