@tduncan / Cortana / commits / e48d8c6

refactor: relocate chat screen, remove conversation sidebar components, and update agent skill documentation.

abdulmominsakib committed Apr 2, 2026 at 12:44 UTC e48d8c68fceddc44fb31db0b7c40c06b4aa6a7eb
194 files changed -25824
.agent/skills/flutter-adding-home-screen-widgets/SKILL.md deleted
-202
@@ -1,202 +0,0 @@
1 ----
2 -name: "flutter-adding-home-screen-widgets"
3 -description: "Adds home screen widgets to a Flutter app for Android and iOS. Use when providing glanceable app information or quick actions on the device home screen."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:23:50 GMT"
7 -
8 ----
9 -# Implementing Flutter Home Screen Widgets
10 -
11 -## Contents
12 -- [Architecture & Data Flow](#architecture--data-flow)
13 -- [Flutter Integration Workflow](#flutter-integration-workflow)
14 -- [iOS Implementation Workflow](#ios-implementation-workflow)
15 -- [Android Implementation Workflow](#android-implementation-workflow)
16 -- [Advanced Techniques](#advanced-techniques)
17 -- [Examples](#examples)
18 -
19 -## Architecture & Data Flow
20 -Home Screen Widgets require native UI implementation (SwiftUI for iOS, XML/Kotlin for Android). The Flutter app communicates with these native widgets via shared local storage (`UserDefaults` on iOS, `SharedPreferences` on Android) using the `home_widget` package.
21 -
22 -- **Data Write:** Flutter app writes key-value pairs or renders images to a shared container.
23 -- **Trigger:** Flutter app signals the native OS to update the widget.
24 -- **Data Read:** Native widget wakes up, reads the key-value pairs or images from the shared container, and updates its UI.
25 -
26 -## Flutter Integration Workflow
27 -
28 -Use this checklist to implement the Dart side of the Home Screen Widget integration.
29 -
30 -- [ ] **Step 1: Initialize the App Group.** Call `HomeWidget.setAppGroupId('<YOUR_APP_GROUP>')` in `initState()` or app startup.
31 -- [ ] **Step 2: Save Data.** Use `HomeWidget.saveWidgetData<T>('key', value)` to write data to shared storage.
32 -- [ ] **Step 3: Trigger Update.** Call `HomeWidget.updateWidget(iOSName: 'YourIOSWidget', androidName: 'YourAndroidWidget')` to notify the OS.
33 -- [ ] **Step 4: Validate.** Run Flutter build -> review console for missing plugin registrations -> fix.
34 -
35 -## iOS Implementation Workflow
36 -
37 -If targeting iOS, implement the widget using Xcode and SwiftUI.
38 -
39 -- [ ] **Step 1: Create Target.** Open `ios/Runner.xcworkspace` in Xcode. Add a new **Widget Extension** target. Disable "Include Live Activity" and "Include Configuration Intent" unless explicitly required.
40 -- [ ] **Step 2: Configure App Groups.** Add the **App Groups** capability to *both* the Runner target and the Widget Extension target. Ensure the App Group ID matches the one used in Dart.
41 -- [ ] **Step 3: Define TimelineEntry.** Create a struct conforming to `TimelineEntry` to hold the data passed from shared storage.
42 -- [ ] **Step 4: Implement TimelineProvider.**
43 - - In `getSnapshot` and `getTimeline`, instantiate `UserDefaults(suiteName: "<YOUR_APP_GROUP>")`.
44 - - Extract values using `userDefaults?.string(forKey: "your_key")`.
45 - - Return the populated `TimelineEntry`.
46 -- [ ] **Step 5: Build UI.** Implement the SwiftUI `View` to display the data from the `TimelineEntry`.
47 -- [ ] **Step 6: Validate.** Run Xcode build for the Widget Extension -> review provisioning/App Group errors -> fix.
48 -
49 -## Android Implementation Workflow
50 -
51 -If targeting Android, implement the widget using Android Studio and XML/Kotlin.
52 -
53 -- [ ] **Step 1: Create App Widget.** Open the `android` folder in Android Studio. Right-click the app directory -> **New -> Widget -> App Widget**.
54 -- [ ] **Step 2: Define Layout.** Edit `res/layout/<widget_name>.xml` to define the UI using standard Android XML layouts (e.g., `RelativeLayout`, `TextView`, `ImageView`).
55 -- [ ] **Step 3: Implement AppWidgetProvider.**
56 - - Open the generated Kotlin class extending `AppWidgetProvider`.
57 - - In the `onUpdate` method, retrieve shared data using `HomeWidgetPlugin.getData(context)`.
58 - - Extract values using `widgetData.getString("your_key", null)`.
59 - - Update the UI using `RemoteViews` and `setTextViewText` or `setImageViewBitmap`.
60 - - Call `appWidgetManager.updateAppWidget(appWidgetId, views)`.
61 -- [ ] **Step 4: Validate.** Run Android build -> review Manifest registration errors -> fix.
62 -
63 -## Advanced Techniques
64 -
65 -### Rendering Flutter Widgets as Images
66 -If the UI is too complex to recreate natively (e.g., custom charts), render the Flutter widget to an image and display the image in the native widget.
67 -
68 -1. Wrap the target Flutter widget with a `GlobalKey`.
69 -2. Call `HomeWidget.renderFlutterWidget()`, passing the widget, a filename, and the key.
70 -3. **iOS:** Read the file path from `UserDefaults` and render using `UIImage(contentsOfFile:)` inside a SwiftUI `Image`.
71 -4. **Android:** Read the file path from `SharedPreferences`, decode using `BitmapFactory.decodeFile()`, and render using `setImageViewBitmap()`.
72 -
73 -### Using Custom Flutter Fonts (iOS Only)
74 -If utilizing custom fonts defined in Flutter on iOS Home Screen Widgets:
75 -
76 -1. Extract the Flutter asset bundle path in Swift.
77 -2. Register the font using `CTFontManagerRegisterFontsForURL`.
78 -3. Apply the font in SwiftUI using `Font.custom()`.
79 -
80 -## Examples
81 -
82 -### Example: Flutter Data Update
83 -```dart
84 -import 'package:home_widget/home_widget.dart';
85 -
86 -const String appGroupId = 'group.com.example.app';
87 -const String iOSWidgetName = 'NewsWidgets';
88 -const String androidWidgetName = 'NewsWidget';
89 -
90 -Future<void> updateWidgetData(String title, String description) async {
91 - await HomeWidget.setAppGroupId(appGroupId);
92 - await HomeWidget.saveWidgetData<String>('headline_title', title);
93 - await HomeWidget.saveWidgetData<String>('headline_description', description);
94 - await HomeWidget.updateWidget(
95 - iOSName: iOSWidgetName,
96 - androidName: androidWidgetName,
97 - );
98 -}
99 -```
100 -
101 -### Example: iOS SwiftUI Provider & View
102 -```swift
103 -import WidgetKit
104 -import SwiftUI
105 -
106 -struct NewsArticleEntry: TimelineEntry {
107 - let date: Date
108 - let title: String
109 - let description: String
110 -}
111 -
112 -struct Provider: TimelineProvider {
113 - func placeholder(in context: Context) -> NewsArticleEntry {
114 - NewsArticleEntry(date: Date(), title: "Loading...", description: "Loading...")
115 - }
116 -
117 - func getSnapshot(in context: Context, completion: @escaping (NewsArticleEntry) -> ()) {
118 - let userDefaults = UserDefaults(suiteName: "group.com.example.app")
119 - let title = userDefaults?.string(forKey: "headline_title") ?? "No Title"
120 - let description = userDefaults?.string(forKey: "headline_description") ?? "No Description"
121 -
122 - let entry = NewsArticleEntry(date: Date(), title: title, description: description)
123 - completion(entry)
124 - }
125 -
126 - func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
127 - getSnapshot(in: context) { (entry) in
128 - let timeline = Timeline(entries: [entry], policy: .atEnd)
129 - completion(timeline)
130 - }
131 - }
132 -}
133 -
134 -struct NewsWidgetsEntryView : View {
135 - var entry: Provider.Entry
136 -
137 - var body: some View {
138 - VStack(alignment: .leading) {
139 - Text(entry.title).font(.headline)
140 - Text(entry.description).font(.subheadline)
141 - }
142 - }
143 -}
144 -```
145 -
146 -### Example: Android Kotlin Provider
147 -```kotlin
148 -package com.example.app.widgets
149 -
150 -import android.appwidget.AppWidgetManager
151 -import android.appwidget.AppWidgetProvider
152 -import android.content.Context
153 -import android.widget.RemoteViews
154 -import es.antonborri.home_widget.HomeWidgetPlugin
155 -import com.example.app.R
156 -
157 -class NewsWidget : AppWidgetProvider() {
158 - override fun onUpdate(
159 - context: Context,
160 - appWidgetManager: AppWidgetManager,
161 - appWidgetIds: IntArray,
162 - ) {
163 - for (appWidgetId in appWidgetIds) {
164 - val widgetData = HomeWidgetPlugin.getData(context)
165 - val views = RemoteViews(context.packageName, R.layout.news_widget).apply {
166 - val title = widgetData.getString("headline_title", "No Title")
167 - setTextViewText(R.id.headline_title, title)
168 -
169 - val description = widgetData.getString("headline_description", "No Description")
170 - setTextViewText(R.id.headline_description, description)
171 - }
172 - appWidgetManager.updateAppWidget(appWidgetId, views)
173 - }
174 - }
175 -}
176 -```
177 -
178 -<details>
179 -<summary>Example: iOS Custom Font Registration Helper</summary>
180 -
181 -```swift
182 -// Add this to your SwiftUI View struct
183 -var bundle: URL {
184 - let bundle = Bundle.main
185 - if bundle.bundleURL.pathExtension == "appex" {
186 - var url = bundle.bundleURL.deletingLastPathComponent().deletingLastPathComponent()
187 - url.append(component: "Frameworks/App.framework/flutter_assets")
188 - return url
189 - }
190 - return bundle.bundleURL
191 -}
192 -
193 -init(entry: Provider.Entry) {
194 - self.entry = entry
195 - CTFontManagerRegisterFontsForURL(
196 - bundle.appending(path: "/fonts/YourCustomFont.ttf") as CFURL,
197 - CTFontManagerScope.process,
198 - nil
199 - )
200 -}
201 -```
202 -</details>
.agent/skills/flutter-animating-apps/SKILL.md deleted
-182
@@ -1,182 +0,0 @@
1 ----
2 -name: "flutter-animating-apps"
3 -description: "Implements animated effects, transitions, and motion in a Flutter app. Use when adding visual feedback, shared element transitions, or physics-based animations."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:16:34 GMT"
7 -
8 ----
9 -# Implementing Flutter Animations
10 -
11 -## Contents
12 -- [Core Concepts](#core-concepts)
13 -- [Animation Strategies](#animation-strategies)
14 -- [Workflows](#workflows)
15 - - [Implementing Implicit Animations](#implementing-implicit-animations)
16 - - [Implementing Explicit Animations](#implementing-explicit-animations)
17 - - [Implementing Hero Transitions](#implementing-hero-transitions)
18 - - [Implementing Physics-Based Animations](#implementing-physics-based-animations)
19 -- [Examples](#examples)
20 -
21 -## Core Concepts
22 -
23 -Manage Flutter animations using the core typed `Animation` system. Do not manually calculate frames; rely on the framework's ticker and interpolation classes.
24 -
25 -* **`Animation<T>`**: Treat this as an abstract representation of a value that changes over time. It holds state (completed, dismissed) and notifies listeners, but knows nothing about the UI.
26 -* **`AnimationController`**: Instantiate this to drive the animation. It generates values (typically 0.0 to 1.0) tied to the screen refresh rate. Always provide a `vsync` (usually via `SingleTickerProviderStateMixin`) to prevent offscreen resource consumption. Always `dispose()` controllers to prevent memory leaks.
27 -* **`Tween<T>`**: Define a stateless mapping from an input range (usually 0.0-1.0) to an output type (e.g., `Color`, `Offset`, `double`). Chain tweens with curves using `.animate()`.
28 -* **`Curve`**: Apply non-linear timing (e.g., `Curves.easeIn`, `Curves.bounceOut`) to an animation using a `CurvedAnimation` or `CurveTween`.
29 -
30 -## Animation Strategies
31 -
32 -Apply conditional logic to select the correct animation approach:
33 -
34 -* **If animating simple property changes (size, color, opacity) without playback control:** Use **Implicit Animations** (e.g., `AnimatedContainer`, `AnimatedOpacity`, `TweenAnimationBuilder`).
35 -* **If requiring playback control (play, pause, reverse, loop) or coordinating multiple properties:** Use **Explicit Animations** (e.g., `AnimationController` with `AnimatedBuilder` or `AnimatedWidget`).
36 -* **If animating elements between two distinct routes:** Use **Hero Animations** (Shared Element Transitions).
37 -* **If modeling real-world motion (e.g., snapping back after a drag):** Use **Physics-Based Animations** (e.g., `SpringSimulation`).
38 -* **If animating a sequence of overlapping or delayed motions:** Use **Staggered Animations** (multiple `Tween`s driven by a single `AnimationController` using `Interval` curves).
39 -
40 -## Workflows
41 -
42 -### Implementing Implicit Animations
43 -
44 -Use this workflow for "fire-and-forget" state-driven animations.
45 -
46 -- [ ] **Task Progress:**
47 - - [ ] Identify the target properties to animate (e.g., width, color).
48 - - [ ] Replace the static widget (e.g., `Container`) with its animated counterpart (e.g., `AnimatedContainer`).
49 - - [ ] Define the `duration` property.
50 - - [ ] (Optional) Define the `curve` property for non-linear motion.
51 - - [ ] Trigger the animation by updating the properties inside a `setState()` call.
52 - - [ ] Run validator -> review UI for jank -> adjust duration/curve if necessary.
53 -
54 -### Implementing Explicit Animations
55 -
56 -Use this workflow when you need granular control over the animation lifecycle.
57 -
58 -- [ ] **Task Progress:**
59 - - [ ] Add `SingleTickerProviderStateMixin` (or `TickerProviderStateMixin` for multiple controllers) to the `State` class.
60 - - [ ] Initialize an `AnimationController` in `initState()`, providing `vsync: this` and a `duration`.
61 - - [ ] Define a `Tween` and chain it to the controller using `.animate()`.
62 - - [ ] Wrap the target UI in an `AnimatedBuilder` (preferred for complex trees) or subclass `AnimatedWidget`.
63 - - [ ] Pass the `Animation` object to the `AnimatedBuilder`'s `animation` property.
64 - - [ ] Control playback using `controller.forward()`, `controller.reverse()`, or `controller.repeat()`.
65 - - [ ] Call `controller.dispose()` in the `dispose()` method.
66 - - [ ] Run validator -> check for memory leaks -> ensure `dispose()` is called.
67 -
68 -### Implementing Hero Transitions
69 -
70 -Use this workflow to fly a widget between two routes.
71 -
72 -- [ ] **Task Progress:**
73 - - [ ] Wrap the source widget in a `Hero` widget.
74 - - [ ] Assign a unique, data-driven `tag` to the source `Hero`.
75 - - [ ] Wrap the destination widget in a `Hero` widget.
76 - - [ ] Assign the *exact same* `tag` to the destination `Hero`.
77 - - [ ] Ensure the widget trees inside both `Hero` widgets are visually similar to prevent jarring jumps.
78 - - [ ] Trigger the transition by pushing the destination route via `Navigator`.
79 -
80 -### Implementing Physics-Based Animations
81 -
82 -Use this workflow for gesture-driven, natural motion.
83 -
84 -- [ ] **Task Progress:**
85 - - [ ] Set up an `AnimationController` (do not set a fixed duration).
86 - - [ ] Capture gesture velocity using a `GestureDetector` (e.g., `onPanEnd` providing `DragEndDetails`).
87 - - [ ] Convert the pixel velocity to the coordinate space of the animating property.
88 - - [ ] Instantiate a `SpringSimulation` with mass, stiffness, damping, and the calculated velocity.
89 - - [ ] Drive the controller using `controller.animateWith(simulation)`.
90 -
91 -## Examples
92 -
93 -<details>
94 -<summary><b>Example: Explicit Animation (Staggered with AnimatedBuilder)</b></summary>
95 -
96 -```dart
97 -class StaggeredAnimationDemo extends StatefulWidget {
98 - @override
99 - State<StaggeredAnimationDemo> createState() => _StaggeredAnimationDemoState();
100 -}
101 -
102 -class _StaggeredAnimationDemoState extends State<StaggeredAnimationDemo> with SingleTickerProviderStateMixin {
103 - late AnimationController _controller;
104 - late Animation<double> _widthAnimation;
105 - late Animation<Color?> _colorAnimation;
106 -
107 - @override
108 - void initState() {
109 - super.initState();
110 - _controller = AnimationController(
111 - duration: const Duration(seconds: 2),
112 - vsync: this,
113 - );
114 -
115 - // Staggered width animation (0.0 to 0.5 interval)
116 - _widthAnimation = Tween<double>(begin: 50.0, end: 200.0).animate(
117 - CurvedAnimation(
118 - parent: _controller,
119 - curve: const Interval(0.0, 0.5, curve: Curves.easeIn),
120 - ),
121 - );
122 -
123 - // Staggered color animation (0.5 to 1.0 interval)
124 - _colorAnimation = ColorTween(begin: Colors.blue, end: Colors.red).animate(
125 - CurvedAnimation(
126 - parent: _controller,
127 - curve: const Interval(0.5, 1.0, curve: Curves.easeOut),
128 - ),
129 - );
130 -
131 - _controller.forward();
132 - }
133 -
134 - @override
135 - void dispose() {
136 - _controller.dispose(); // CRITICAL: Prevent memory leaks
137 - super.dispose();
138 - }
139 -
140 - @override
141 - Widget build(BuildContext context) {
142 - return AnimatedBuilder(
143 - animation: _controller,
144 - builder: (context, child) {
145 - return Container(
146 - width: _widthAnimation.value,
147 - height: 50.0,
148 - color: _colorAnimation.value,
149 - );
150 - },
151 - );
152 - }
153 -}
154 -```
155 -</details>
156 -
157 -<details>
158 -<summary><b>Example: Custom Page Route Transition</b></summary>
159 -
160 -```dart
161 -Route createCustomRoute(Widget destination) {
162 - return PageRouteBuilder(
163 - pageBuilder: (context, animation, secondaryAnimation) => destination,
164 - transitionsBuilder: (context, animation, secondaryAnimation, child) {
165 - const begin = Offset(0.0, 1.0); // Start from bottom
166 - const end = Offset.zero;
167 - const curve = Curves.easeOut;
168 -
169 - final tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
170 - final offsetAnimation = animation.drive(tween);
171 -
172 - return SlideTransition(
173 - position: offsetAnimation,
174 - child: child,
175 - );
176 - },
177 - );
178 -}
179 -
180 -// Usage: Navigator.of(context).push(createCustomRoute(const NextPage()));
181 -```
182 -</details>
.agent/skills/flutter-architecting-apps/SKILL.md deleted
-163
@@ -1,163 +0,0 @@
1 ----
2 -name: "flutter-architecting-apps"
3 -description: "Architects a Flutter application using the recommended layered approach (UI, Logic, Data). Use when structuring a new project or refactoring for scalability."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:13:42 GMT"
7 -
8 ----
9 -# Architecting Flutter Applications
10 -
11 -## Contents
12 -- [Core Architectural Principles](#core-architectural-principles)
13 -- [Structuring the Layers](#structuring-the-layers)
14 -- [Implementing the Data Layer](#implementing-the-data-layer)
15 -- [Feature Implementation Workflow](#feature-implementation-workflow)
16 -- [Examples](#examples)
17 -
18 -## Core Architectural Principles
19 -
20 -Design Flutter applications to scale by strictly adhering to the following principles:
21 -
22 -* **Enforce Separation of Concerns:** Decouple UI rendering from business logic and data fetching. Organize the codebase into distinct layers (UI, Logic, Data) and further separate by feature within those layers.
23 -* **Maintain a Single Source of Truth (SSOT):** Centralize application state and data in the Data layer. Ensure the SSOT is the only component authorized to mutate its respective data.
24 -* **Implement Unidirectional Data Flow (UDF):** Flow state downwards from the Data layer to the UI layer. Flow events upwards from the UI layer to the Data layer.
25 -* **Treat UI as a Function of State:** Drive the UI entirely via immutable state objects. Rebuild widgets reactively when the underlying state changes.
26 -
27 -## Structuring the Layers
28 -
29 -Separate the application into 2 to 3 distinct layers depending on complexity. Restrict communication so that a layer only interacts with the layer directly adjacent to it.
30 -
31 -### 1. UI Layer (Presentation)
32 -* **Views (Widgets):** Build reusable, lean widgets. Strip all business and data-fetching logic from the widget tree. Restrict widget logic to UI-specific concerns (e.g., animations, routing, layout constraints).
33 -* **ViewModels:** Manage the UI state. Consume domain models from the Data/Logic layers and transform them into presentation-friendly formats. Expose state to the Views and handle user interaction events.
34 -
35 -### 2. Logic Layer (Domain) - *Conditional*
36 -* **If the application requires complex client-side business logic:** Implement a Logic layer containing Use Cases or Interactors. Use this layer to orchestrate interactions between multiple repositories before passing data to the UI layer.
37 -* **If the application is a standard CRUD app:** Omit this layer. Allow ViewModels to interact directly with Repositories.
38 -
39 -### 3. Data Layer (Model)
40 -* **Responsibilities:** Act as the SSOT for all application data. Handle business data, external API consumption, event processing, and data synchronization.
41 -* **Components:** Divide the Data layer strictly into **Repositories** and **Services**.
42 -
43 -## Implementing the Data Layer
44 -
45 -### Services
46 -* **Role:** Wrap external APIs (HTTP servers, local databases, platform plugins).
47 -* **Implementation:** Write Services as stateless Dart classes. Do not store application state here.
48 -* **Mapping:** Create exactly one Service class per external data source.
49 -
50 -### Repositories
51 -* **Role:** Act as the SSOT for domain data.
52 -* **Implementation:** Consume raw data from Services. Handle caching, offline synchronization, and retry logic.
53 -* **Transformation:** Transform raw API/Service data into clean Domain Models formatted for consumption by ViewModels.
54 -
55 -## Feature Implementation Workflow
56 -
57 -Follow this sequential workflow when adding a new feature to the application.
58 -
59 -**Task Progress:**
60 -- [ ] **Step 1: Define Domain Models.** Create immutable Dart classes representing the core data structures required by the feature.
61 -- [ ] **Step 2: Implement Services.** Create stateless Service classes to handle raw data fetching (e.g., HTTP GET/POST).
62 -- [ ] **Step 3: Implement Repositories.** Create Repository classes that consume the Services, handle caching, and return Domain Models.
63 -- [ ] **Step 4: Implement ViewModels.** Create ViewModels that consume the Repositories. Expose immutable state and define methods (commands) for user actions.
64 -- [ ] **Step 5: Implement Views.** Create Flutter Widgets that bind to the ViewModel state and trigger ViewModel methods on user interaction.
65 -- [ ] **Step 6: Run Validator.** Execute unit tests for Services, Repositories, and ViewModels. Execute widget tests for Views.
66 - * *Feedback Loop:* Review test failures -> Fix logic/mocking errors -> Re-run tests until passing.
67 -
68 -## Examples
69 -
70 -### Data Layer: Service and Repository
71 -
72 -```dart
73 -// 1. Service (Stateless API Wrapper)
74 -class UserApiService {
75 - final HttpClient _client;
76 -
77 - UserApiService(this._client);
78 -
79 - Future<Map<String, dynamic>> fetchUserRaw(String userId) async {
80 - final response = await _client.get('/users/$userId');
81 - return response.data;
82 - }
83 -}
84 -
85 -// 2. Domain Model (Immutable)
86 -class User {
87 - final String id;
88 - final String name;
89 -
90 - const User({required this.id, required this.name});
91 -}
92 -
93 -// 3. Repository (SSOT & Data Transformer)
94 -class UserRepository {
95 - final UserApiService _apiService;
96 - User? _cachedUser;
97 -
98 - UserRepository(this._apiService);
99 -
100 - Future<User> getUser(String userId) async {
101 - if (_cachedUser != null && _cachedUser!.id == userId) {
102 - return _cachedUser!;
103 - }
104 -
105 - final rawData = await _apiService.fetchUserRaw(userId);
106 - final user = User(id: rawData['id'], name: rawData['name']);
107 -
108 - _cachedUser = user; // Cache data
109 - return user;
110 - }
111 -}
112 -```
113 -
114 -### UI Layer: ViewModel and View
115 -
116 -```dart
117 -// 4. ViewModel (State Management)
118 -class UserViewModel extends ChangeNotifier {
119 - final UserRepository _userRepository;
120 -
121 - User? user;
122 - bool isLoading = false;
123 - String? error;
124 -
125 - UserViewModel(this._userRepository);
126 -
127 - Future<void> loadUser(String userId) async {
128 - isLoading = true;
129 - error = null;
130 - notifyListeners();
131 -
132 - try {
133 - user = await _userRepository.getUser(userId);
134 - } catch (e) {
135 - error = e.toString();
136 - } finally {
137 - isLoading = false;
138 - notifyListeners();
139 - }
140 - }
141 -}
142 -
143 -// 5. View (Lean UI)
144 -class UserProfileView extends StatelessWidget {
145 - final UserViewModel viewModel;
146 -
147 - const UserProfileView({Key? key, required this.viewModel}) : super(key: key);
148 -
149 - @override
150 - Widget build(BuildContext context) {
151 - return ListenableBuilder(
152 - listenable: viewModel,
153 - builder: (context, child) {
154 - if (viewModel.isLoading) return const CircularProgressIndicator();
155 - if (viewModel.error != null) return Text('Error: ${viewModel.error}');
156 - if (viewModel.user == null) return const Text('No user data.');
157 -
158 - return Text('Hello, ${viewModel.user!.name}');
159 - },
160 - );
161 - }
162 -}
163 -```
.agent/skills/flutter-building-forms/SKILL.md deleted
-122
@@ -1,122 +0,0 @@
1 ----
2 -name: "flutter-building-forms"
3 -description: "Builds Flutter forms with validation and user input handling. Use when creating login screens, data entry forms, or any multi-field user input."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:15:24 GMT"
7 -
8 ----
9 -# Building Validated Forms
10 -
11 -## Contents
12 -- [Form Architecture](#form-architecture)
13 -- [Field Validation](#field-validation)
14 -- [Workflow: Implementing a Validated Form](#workflow-implementing-a-validated-form)
15 -- [Examples](#examples)
16 -
17 -## Form Architecture
18 -
19 -Implement forms using a `Form` widget to group and validate multiple input fields together.
20 -
21 -- **Use a StatefulWidget:** Always host your `Form` inside a `StatefulWidget`.
22 -- **Persist the GlobalKey:** Instantiate a `GlobalKey<FormState>` exactly once as a final variable within the `State` class. Do not generate a new `GlobalKey` inside the `build` method; doing so is resource-expensive and destroys the form's state on every rebuild.
23 -- **Bind the Key:** Pass the `GlobalKey<FormState>` to the `key` property of the `Form` widget. This uniquely identifies the form and provides access to the `FormState` for validation and submission.
24 -- **Alternative Access:** If dealing with highly complex widget trees where passing the key is impractical, use `Form.of(context)` to access the `FormState` from a descendant widget.
25 -
26 -## Field Validation
27 -
28 -Use `TextFormField` to render Material Design text inputs with built-in validation support. `TextFormField` is a convenience widget that automatically wraps a standard `TextField` inside a `FormField`.
29 -
30 -- **Implement the Validator:** Provide a `validator()` callback function to each `TextFormField`.
31 -- **Return Error Messages:** If the user's input is invalid, return a `String` containing the specific error message. The `Form` will automatically rebuild to display this text below the field.
32 -- **Return Null for Success:** If the input passes validation, you must return `null`.
33 -
34 -## Workflow: Implementing a Validated Form
35 -
36 -Follow this sequential workflow to implement and validate a form. Copy the checklist to track your progress.
37 -
38 -**Task Progress:**
39 -- [ ] 1. Create a `StatefulWidget` and its corresponding `State` class.
40 -- [ ] 2. Instantiate `final _formKey = GlobalKey<FormState>();` in the `State` class.
41 -- [ ] 3. Return a `Form` widget in the `build` method and assign `key: _formKey`.
42 -- [ ] 4. Add `TextFormField` widgets as descendants of the `Form`.
43 -- [ ] 5. Write a `validator` function for each `TextFormField` (return `String` on error, `null` on success).
44 -- [ ] 6. Add a submit button (e.g., `ElevatedButton`).
45 -- [ ] 7. Implement the validation check in the button's `onPressed` callback using `_formKey.currentState!.validate()`.
46 -
47 -### Validation Decision Logic
48 -
49 -When the user triggers the submit action, execute the following conditional logic:
50 -
51 -1. Call `_formKey.currentState!.validate()`.
52 -2. **If `true` (Valid):** All validators returned `null`. Proceed with form submission (e.g., save data, make API call) and display a success indicator (e.g., a `SnackBar`).
53 -3. **If `false` (Invalid):** One or more validators returned an error string. The `FormState` automatically rebuilds the UI to display the error messages.
54 -4. **Feedback Loop:** Run validator -> review errors -> fix. The user must adjust their input and resubmit until `validate()` returns `true`.
55 -
56 -## Examples
57 -
58 -### Complete Validated Form Implementation
59 -
60 -Use the following pattern to implement a robust, validated form.
61 -
62 -```dart
63 -import 'package:flutter/material.dart';
64 -
65 -class UserRegistrationForm extends StatefulWidget {
66 - const UserRegistrationForm({super.key});
67 -
68 - @override
69 - State<UserRegistrationForm> createState() => _UserRegistrationFormState();
70 -}
71 -
72 -class _UserRegistrationFormState extends State<UserRegistrationForm> {
73 - // 1. Persist the GlobalKey in the State class
74 - final _formKey = GlobalKey<FormState>();
75 -
76 - @override
77 - Widget build(BuildContext context) {
78 - // 2. Bind the key to the Form
79 - return Form(
80 - key: _formKey,
81 - child: Column(
82 - crossAxisAlignment: CrossAxisAlignment.start,
83 - children: [
84 - // 3. Add TextFormFields with validators
85 - TextFormField(
86 - decoration: const InputDecoration(
87 - labelText: 'Username',
88 - hintText: 'Enter your username',
89 - ),
90 - validator: (value) {
91 - if (value == null || value.isEmpty) {
92 - return 'Please enter a username'; // Error state
93 - }
94 - if (value.length < 4) {
95 - return 'Username must be at least 4 characters'; // Error state
96 - }
97 - return null; // Valid state
98 - },
99 - ),
100 - const SizedBox(height: 16),
101 - // 4. Add the submit button
102 - ElevatedButton(
103 - onPressed: () {
104 - // 5. Trigger validation logic
105 - if (_formKey.currentState!.validate()) {
106 - // Form is valid: Process data
107 - ScaffoldMessenger.of(context).showSnackBar(
108 - const SnackBar(content: Text('Processing Data')),
109 - );
110 - } else {
111 - // Form is invalid: Errors are automatically displayed
112 - debugPrint('Form validation failed.');
113 - }
114 - },
115 - child: const Text('Submit'),
116 - ),
117 - ],
118 - ),
119 - );
120 - }
121 -}
122 -```
.agent/skills/flutter-building-layouts/SKILL.md deleted
-128
@@ -1,128 +0,0 @@
1 ----
2 -name: "flutter-building-layouts"
3 -description: "Builds Flutter layouts using the constraint system and layout widgets. Use when creating or refining the UI structure of a Flutter application."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:14:15 GMT"
7 -
8 ----
9 -# Architecting Flutter Layouts
10 -
11 -## Contents
12 -- [Core Layout Principles](#core-layout-principles)
13 -- [Structural Widgets](#structural-widgets)
14 -- [Adaptive and Responsive Design](#adaptive-and-responsive-design)
15 -- [Workflow: Implementing a Complex Layout](#workflow-implementing-a-complex-layout)
16 -- [Examples](#examples)
17 -
18 -## Core Layout Principles
19 -
20 -Master the fundamental Flutter layout rule: **Constraints go down. Sizes go up. Parent sets position.**
21 -
22 -* **Pass Constraints Down:** Always pass constraints (minimum/maximum width and height) from the parent Widget to its children. A Widget cannot choose its own size independently of its parent's constraints.
23 -* **Pass Sizes Up:** Calculate the child Widget's desired size within the given constraints and pass this size back up to the parent.
24 -* **Set Position via Parent:** Define the `x` and `y` coordinates of a child Widget exclusively within the parent Widget. Children do not know their own position on the screen.
25 -* **Avoid Unbounded Constraints:** Never pass unbounded constraints (e.g., `double.infinity`) in the cross-axis of a flex box (`Row` or `Column`) or within scrollable regions (`ListView`). This causes render exceptions.
26 -
27 -## Structural Widgets
28 -
29 -Select the appropriate structural Widget based on the required spatial arrangement.
30 -
31 -* **Use `Row` and `Column`:** Implement `Row` for horizontal linear layouts and `Column` for vertical linear layouts. Control child alignment using `mainAxisAlignment` and `crossAxisAlignment`.
32 -* **Use `Expanded` and `Flexible`:** Wrap children of `Row` or `Column` in `Expanded` to force them to fill available space, or `Flexible` to allow them to size themselves up to the available space.
33 -* **Use `Container`:** Wrap Widgets in a `Container` when you need to apply padding, margins, borders, or background colors.
34 -* **Use `Stack`:** Implement `Stack` when Widgets must overlap on the Z-axis. Use `Positioned` to anchor children to specific edges of the `Stack`.
35 -* **Use `SizedBox`:** Enforce strict, tight constraints on a child Widget by wrapping it in a `SizedBox` with explicit `width` and `height` values.
36 -
37 -## Adaptive and Responsive Design
38 -
39 -Apply conditional logic to handle varying screen sizes and form factors.
40 -
41 -* **If fitting UI into available space (Responsive):** Use `LayoutBuilder`, `Expanded`, and `Flexible` to dynamically adjust the size and placement of elements based on the parent's constraints.
42 -* **If adjusting UI usability for a specific form factor (Adaptive):** Use conditional rendering to swap entire layout structures. For example, render a bottom navigation bar on mobile, but a side navigation rail on tablets/desktop.
43 -
44 -## Workflow: Implementing a Complex Layout
45 -
46 -Follow this sequential workflow to architect and implement robust Flutter layouts.
47 -
48 -### Task Progress
49 -- [ ] **Phase 1: Visual Deconstruction**
50 - - [ ] Break down the target UI into a hierarchy of rows, columns, and grids.
51 - - [ ] Identify overlapping elements (requiring `Stack`).
52 - - [ ] Identify scrolling regions (requiring `ListView` or `SingleChildScrollView`).
53 -- [ ] **Phase 2: Constraint Planning**
54 - - [ ] Determine which Widgets require tight constraints (fixed size) vs. loose constraints (flexible size).
55 - - [ ] Identify potential unbounded constraint risks (e.g., a `ListView` inside a `Column`).
56 -- [ ] **Phase 3: Implementation**
57 - - [ ] Build the layout from the outside in, starting with the `Scaffold` and primary structural Widgets.
58 - - [ ] Extract deeply nested layout sections into separate, stateless Widgets to maintain readability.
59 -- [ ] **Phase 4: Validation and Feedback Loop**
60 - - [ ] Run the application on target devices/simulators.
61 - - [ ] **Run validator -> review errors -> fix:** Open the Flutter Inspector. Enable "Debug Paint" to visualize render boxes.
62 - - [ ] Check for yellow/black striped overflow warnings.
63 - - [ ] If overflow occurs: Wrap the overflowing Widget in `Expanded` (if inside a flex box) or wrap the parent in a scrollable Widget.
64 -
65 -## Examples
66 -
67 -### Example: Resolving Unbounded Constraints in Flex Boxes
68 -
69 -**Anti-pattern:** Placing a `ListView` directly inside a `Column` causes an unbounded height exception because the `Column` provides infinite vertical space to the `ListView`.
70 -
71 -```dart
72 -// BAD: Throws unbounded height exception
73 -Column(
74 - children: [
75 - Text('Header'),
76 - ListView(
77 - children: [/* items */],
78 - ),
79 - ],
80 -)
81 -```
82 -
83 -**Implementation:** Wrap the `ListView` in an `Expanded` Widget to bound its height to the remaining space in the `Column`.
84 -
85 -```dart
86 -// GOOD: ListView is constrained to remaining space
87 -Column(
88 - children: [
89 - Text('Header'),
90 - Expanded(
91 - child: ListView(
92 - children: [/* items */],
93 - ),
94 - ),
95 - ],
96 -)
97 -```
98 -
99 -### Example: Responsive Layout with LayoutBuilder
100 -
101 -Implement `LayoutBuilder` to conditionally render different structural Widgets based on available width.
102 -
103 -```dart
104 -Widget buildAdaptiveLayout(BuildContext context) {
105 - return LayoutBuilder(
106 - builder: (context, constraints) {
107 - // Conditional logic based on screen width
108 - if (constraints.maxWidth > 600) {
109 - // Tablet/Desktop: Side-by-side layout
110 - return Row(
111 - children: [
112 - SizedBox(width: 250, child: SidebarWidget()),
113 - Expanded(child: MainContentWidget()),
114 - ],
115 - );
116 - } else {
117 - // Mobile: Stacked layout with navigation
118 - return Column(
119 - children: [
120 - Expanded(child: MainContentWidget()),
121 - BottomNavigationBarWidget(),
122 - ],
123 - );
124 - }
125 - },
126 - );
127 -}
128 -```
.agent/skills/flutter-building-plugins/SKILL.md deleted
-206
@@ -1,206 +0,0 @@
1 ----
2 -name: "flutter-building-plugins"
3 -description: "Builds Flutter plugins that provide native interop for other apps to use. Use when creating reusable packages that bridge Flutter with platform-specific functionality."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:21:35 GMT"
7 -
8 ----
9 -# Developing Flutter Plugins
10 -
11 -## Contents
12 -- [Architecture & Design Patterns](#architecture--design-patterns)
13 -- [Workflow: Creating a New Plugin](#workflow-creating-a-new-plugin)
14 -- [Workflow: Implementing Android Platform Code](#workflow-implementing-android-platform-code)
15 -- [Workflow: Implementing Windows Platform Code](#workflow-implementing-windows-platform-code)
16 -- [Workflow: Adding Platforms to an Existing Plugin](#workflow-adding-platforms-to-an-existing-plugin)
17 -- [Examples](#examples)
18 -
19 -## Architecture & Design Patterns
20 -
21 -### Federated Plugins
22 -Implement federated plugins to split a plugin's API across multiple packages, allowing independent teams to build platform-specific implementations. Structure federated plugins into three distinct components:
23 -1. **App-facing interface:** The primary package users depend on. It exports the public API.
24 -2. **Platform interface:** The package defining the common interface that all platform implementations must implement.
25 -3. **Platform implementations:** Independent packages containing platform-specific code (e.g., `my_plugin_android`, `my_plugin_windows`).
26 -
27 -### FFI vs. Standard Plugins
28 -Choose the correct plugin template based on your native interoperability requirements:
29 -* **Standard Plugins (`--template=plugin`):** Use for accessing platform-specific APIs (e.g., Android SDK, iOS frameworks) via Method Channels.
30 -* **FFI Plugins (`--template=plugin_ffi`):** Use for accessing C/C++ native libraries, configuring Google Play services on Android, or using static linking on iOS/macOS.
31 - * *Constraint:* FFI plugin packages support bundling native code and method channel registration code, but *not* method channels themselves. If you require both method channels and FFI, use the standard non-FFI plugin template.
32 -
33 -## Workflow: Creating a New Plugin
34 -
35 -Follow this workflow to initialize a new plugin package.
36 -
37 -**Task Progress:**
38 -- [ ] Determine if the plugin requires FFI or standard Method Channels.
39 -- [ ] Execute the appropriate `flutter create` command.
40 -- [ ] Verify the generated directory structure.
41 -
42 -**Conditional Initialization:**
43 -* **If creating a STANDARD plugin:**
44 - Run the following command, specifying your supported platforms, organization, and preferred languages (defaults are Swift and Kotlin):
45 - ```bash
46 - flutter create --template=plugin \
47 - --platforms=android,ios,web,linux,macos,windows \
48 - --org com.example.organization \
49 - -i objc -a java \
50 - my_plugin
51 - ```
52 -* **If creating an FFI plugin:**
53 - Run the following command to generate a project with Dart code in `lib` (using `dart:ffi`) and native source code in `src` (with a `CMakeLists.txt`):
54 - ```bash
55 - flutter create --template=plugin_ffi my_ffi_plugin
56 - ```
57 -
58 -## Workflow: Implementing Android Platform Code
59 -
60 -Always edit Android platform code using Android Studio to ensure proper code completion and Gradle synchronization.
61 -
62 -**Task Progress:**
63 -- [ ] Run initial build to generate necessary Gradle files.
64 -- [ ] Open the Android module in Android Studio.
65 -- [ ] Implement `FlutterPlugin` and lifecycle-aware interfaces.
66 -- [ ] Refactor legacy `registerWith` logic.
67 -- [ ] Run validator -> review errors -> fix.
68 -
69 -1. **Generate Build Files:**
70 - Build the code at least once before editing to resolve dependencies.
71 - ```bash
72 - cd example
73 - flutter build apk --config-only
74 - ```
75 -2. **Open in IDE:**
76 - Launch Android Studio and open the `example/android/build.gradle` or `example/android/build.gradle.kts` file.
77 -3. **Locate Source:**
78 - Navigate to your plugin's source code at `java/<organization-path>/<PluginName>`.
79 -4. **Implement V2 Embedding:**
80 - * Implement the `FlutterPlugin` interface.
81 - * Ensure your plugin class has a public constructor.
82 - * Extract shared initialization logic from the legacy `registerWith()` method and the new `onAttachedToEngine()` method into a single private method. Both entry points must call this private method to maintain backward compatibility without duplicating logic.
83 -5. **Implement Lifecycle Interfaces:**
84 - * **If your plugin requires an `Activity` reference:** Implement the `ActivityAware` interface and handle the `onAttachedToActivity`, `onDetachedFromActivityForConfigChanges`, `onReattachedToActivityForConfigChanges`, and `onDetachedFromActivity` callbacks.
85 - * **If your plugin runs in a background `Service`:** Implement the `ServiceAware` interface.
86 -6. **Update Example App:**
87 - Ensure the example app's `MainActivity.java` extends the v2 embedding `io.flutter.embedding.android.FlutterActivity`.
88 -7. **Document API:**
89 - Document all non-overridden public members in your Android implementation.
90 -
91 -## Workflow: Implementing Windows Platform Code
92 -
93 -Always edit Windows platform code using Visual Studio.
94 -
95 -**Task Progress:**
96 -- [ ] Run initial build to generate the Visual Studio solution.
97 -- [ ] Open the solution in Visual Studio.
98 -- [ ] Implement C++ logic.
99 -- [ ] Rebuild the solution.
100 -
101 -1. **Generate Build Files:**
102 - ```bash
103 - cd example
104 - flutter build windows
105 - ```
106 -2. **Open in IDE:**
107 - Launch Visual Studio and open the `example/build/windows/hello_example.sln` file.
108 -3. **Locate Source:**
109 - Navigate to `hello_plugin/Source Files` and `hello_plugin/Header Files` in the Solution Explorer.
110 -4. **Rebuild:**
111 - After making changes to the C++ plugin code, you *must* rebuild the solution in Visual Studio before running the app, or the outdated plugin binary will be used.
112 -
113 -## Workflow: Adding Platforms to an Existing Plugin
114 -
115 -Use this workflow to retrofit an existing plugin with support for additional platforms.
116 -
117 -**Task Progress:**
118 -- [ ] Run the platform addition command.
119 -- [ ] Update iOS/macOS podspecs (if applicable).
120 -- [ ] Implement the platform-specific code.
121 -
122 -1. **Run Create Command:**
123 - Navigate to the root directory of your existing plugin and run:
124 - ```bash
125 - flutter create --template=plugin --platforms=web,macos .
126 - ```
127 -2. **Update Podspecs:**
128 - If adding iOS or macOS support, open the generated `.podspec` file and configure the required dependencies and deployment targets.
129 -
130 -## Examples
131 -
132 -### Android V2 Embedding Implementation
133 -High-fidelity example of an Android plugin implementing `FlutterPlugin` and `ActivityAware` while maintaining legacy compatibility.
134 -
135 -```java
136 -package com.example.myplugin;
137 -
138 -import androidx.annotation.NonNull;
139 -import io.flutter.embedding.engine.plugins.FlutterPlugin;
140 -import io.flutter.embedding.engine.plugins.activity.ActivityAware;
141 -import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
142 -import io.flutter.plugin.common.MethodCall;
143 -import io.flutter.plugin.common.MethodChannel;
144 -import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
145 -import io.flutter.plugin.common.MethodChannel.Result;
146 -import io.flutter.plugin.common.PluginRegistry.Registrar;
147 -
148 -/** MyPlugin */
149 -public class MyPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware {
150 - private MethodChannel channel;
151 -
152 - // Public constructor required for v2 embedding
153 - public MyPlugin() {}
154 -
155 - @Override
156 - public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
157 - setupChannel(flutterPluginBinding.getBinaryMessenger());
158 - }
159 -
160 - // Legacy v1 embedding support
161 - public static void registerWith(Registrar registrar) {
162 - MyPlugin plugin = new MyPlugin();
163 - plugin.setupChannel(registrar.messenger());
164 - }
165 -
166 - // Shared initialization logic
167 - private void setupChannel(BinaryMessenger messenger) {
168 - channel = new MethodChannel(messenger, "my_plugin");
169 - channel.setMethodCallHandler(this);
170 - }
171 -
172 - @Override
173 - public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
174 - if (call.method.equals("getPlatformVersion")) {
175 - result.success("Android " + android.os.Build.VERSION.RELEASE);
176 - } else {
177 - result.notImplemented();
178 - }
179 - }
180 -
181 - @Override
182 - public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
183 - channel.setMethodCallHandler(null);
184 - }
185 -
186 - @Override
187 - public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
188 - // Handle Activity attachment
189 - }
190 -
191 - @Override
192 - public void onDetachedFromActivityForConfigChanges() {
193 - // Handle config changes
194 - }
195 -
196 - @Override
197 - public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {
198 - // Handle reattachment
199 - }
200 -
201 - @Override
202 - public void onDetachedFromActivity() {
203 - // Clean up Activity references
204 - }
205 -}
206 -```
.agent/skills/flutter-caching-data/SKILL.md deleted
-168
@@ -1,168 +0,0 @@
1 ----
2 -name: "flutter-caching-data"
3 -description: "Implements caching strategies for Flutter apps to improve performance and offline support. Use when retaining app data locally to reduce network requests or speed up startup."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:19:54 GMT"
7 -
8 ----
9 -# Implementing Flutter Caching and Offline-First Architectures
10 -
11 -## Contents
12 -- [Selecting a Caching Strategy](#selecting-a-caching-strategy)
13 -- [Implementing Offline-First Data Synchronization](#implementing-offline-first-data-synchronization)
14 -- [Managing File System and SQLite Persistence](#managing-file-system-and-sqlite-persistence)
15 -- [Optimizing UI, Scroll, and Image Caching](#optimizing-ui-scroll-and-image-caching)
16 -- [Caching the FlutterEngine (Android)](#caching-the-flutterengine-android)
17 -- [Workflows](#workflows)
18 -
19 -## Selecting a Caching Strategy
20 -
21 -Apply the appropriate caching mechanism based on the data lifecycle and size requirements.
22 -
23 -* **If storing small, non-critical UI states or preferences:** Use `shared_preferences`.
24 -* **If storing large, structured datasets:** Use on-device databases (SQLite via `sqflite`, Drift, Hive CE, or Isar).
25 -* **If storing binary data or large media:** Use file system caching via `path_provider`.
26 -* **If retaining user session state (navigation, scroll positions):** Implement Flutter's built-in state restoration to sync the Element tree with the engine.
27 -* **If optimizing Android initialization:** Pre-warm and cache the `FlutterEngine`.
28 -
29 -## Implementing Offline-First Data Synchronization
30 -
31 -Design repositories as the single source of truth, combining local databases and remote API clients.
32 -
33 -### Read Operations (Stream Approach)
34 -Yield local data immediately for fast UI rendering, then fetch remote data, update the local cache, and yield the fresh data.
35 -
36 -```dart
37 -Stream<UserProfile> getUserProfile() async* {
38 - // 1. Yield local cache first
39 - final localProfile = await _databaseService.fetchUserProfile();
40 - if (localProfile != null) yield localProfile;
41 -
42 - // 2. Fetch remote, update cache, yield fresh data
43 - try {
44 - final remoteProfile = await _apiClientService.getUserProfile();
45 - await _databaseService.updateUserProfile(remoteProfile);
46 - yield remoteProfile;
47 - } catch (e) {
48 - // Handle network failure; UI already has local data
49 - }
50 -}
51 -```
52 -
53 -### Write Operations
54 -Determine the write strategy based on data criticality:
55 -* **If strict server synchronization is required (Online-only):** Attempt the API call first. Only update the local database if the API call succeeds.
56 -* **If offline availability is prioritized (Offline-first):** Write to the local database immediately. Attempt the API call. If the API call fails, flag the local record for background synchronization.
57 -
58 -### Background Synchronization
59 -Add a `synchronized` boolean flag to your data models. Run a periodic background task (e.g., via `workmanager` or a `Timer`) to push unsynchronized local changes to the server.
60 -
61 -## Managing File System and SQLite Persistence
62 -
63 -### File System Caching
64 -Use `path_provider` to locate the correct directory.
65 -* Use `getApplicationDocumentsDirectory()` for persistent data.
66 -* Use `getTemporaryDirectory()` for cache data the OS can clear.
67 -
68 -```dart
69 -Future<File> get _localFile async {
70 - final directory = await getApplicationDocumentsDirectory();
71 - return File('${directory.path}/cache.txt');
72 -}
73 -```
74 -
75 -### SQLite Persistence
76 -Use `sqflite` for relational data caching. Always use `whereArgs` to prevent SQL injection.
77 -
78 -```dart
79 -Future<void> updateCachedRecord(Record record) async {
80 - final db = await database;
81 - await db.update(
82 - 'records',
83 - record.toMap(),
84 - where: 'id = ?',
85 - whereArgs: [record.id], // NEVER use string interpolation here
86 - );
87 -}
88 -```
89 -
90 -## Optimizing UI, Scroll, and Image Caching
91 -
92 -### Image Caching
93 -Image I/O and decompression are expensive.
94 -* Use the `cached_network_image` package to handle file-system caching of remote images.
95 -* **Custom ImageProviders:** If implementing a custom `ImageProvider`, override `createStream()` and `resolveStreamForKey()` instead of the deprecated `resolve()` method.
96 -* **Cache Sizing:** The `ImageCache.maxByteSize` no longer automatically expands for large images. If loading images larger than the default cache size, manually increase `ImageCache.maxByteSize` or subclass `ImageCache` to implement custom eviction logic.
97 -
98 -### Scroll Caching
99 -When configuring caching for scrollable widgets (`ListView`, `GridView`, `Viewport`), use the `scrollCacheExtent` property with a `ScrollCacheExtent` object. Do not use the deprecated `cacheExtent` and `cacheExtentStyle` properties.
100 -
101 -```dart
102 -// Correct implementation
103 -ListView(
104 - scrollCacheExtent: const ScrollCacheExtent.pixels(500.0),
105 - children: // ...
106 -)
107 -
108 -Viewport(
109 - scrollCacheExtent: const ScrollCacheExtent.viewport(0.5),
110 - slivers: // ...
111 -)
112 -```
113 -
114 -### Widget Caching
115 -* Avoid overriding `operator ==` on `Widget` objects. It causes O(N²) behavior during rebuilds.
116 -* **Exception:** You may override `operator ==` *only* on leaf widgets (no children) where comparing properties is significantly faster than rebuilding, and the properties rarely change.
117 -* Prefer using `const` constructors to allow the framework to short-circuit rebuilds automatically.
118 -
119 -## Caching the FlutterEngine (Android)
120 -
121 -To eliminate the non-trivial warm-up time of a `FlutterEngine` when adding Flutter to an existing Android app, pre-warm and cache the engine.
122 -
123 -1. Instantiate and pre-warm the engine in the `Application` class.
124 -2. Store it in the `FlutterEngineCache`.
125 -3. Retrieve it using `withCachedEngine` in the `FlutterActivity` or `FlutterFragment`.
126 -
127 -```kotlin
128 -// 1. Pre-warm in Application class
129 -val flutterEngine = FlutterEngine(this)
130 -flutterEngine.navigationChannel.setInitialRoute("/cached_route")
131 -flutterEngine.dartExecutor.executeDartEntrypoint(DartEntrypoint.createDefault())
132 -
133 -// 2. Cache the engine
134 -FlutterEngineCache.getInstance().put("my_engine_id", flutterEngine)
135 -
136 -// 3. Use in Activity/Fragment
137 -startActivity(
138 - FlutterActivity.withCachedEngine("my_engine_id").build(this)
139 -)
140 -```
141 -*Note: You cannot set an initial route via the Activity/Fragment builder when using a cached engine. Set the initial route on the engine's navigation channel before executing the Dart entrypoint.*
142 -
143 -## Workflows
144 -
145 -### Workflow: Implementing an Offline-First Repository
146 -Follow these steps to implement a robust offline-first data layer.
147 -
148 -- [ ] **Task Progress:**
149 - - [ ] Define the data model with a `synchronized` boolean flag (default `false`).
150 - - [ ] Implement the local `DatabaseService` (SQLite/Hive) with CRUD operations.
151 - - [ ] Implement the remote `ApiClientService` for network requests.
152 - - [ ] Create the `Repository` class combining both services.
153 - - [ ] Implement the read method returning a `Stream<T>` (yield local, fetch remote, update local, yield remote).
154 - - [ ] Implement the write method (write local, attempt remote, update `synchronized` flag).
155 - - [ ] Implement a background sync function to process records where `synchronized == false`.
156 - - [ ] Run validator -> review errors -> fix (Test offline behavior by disabling network).
157 -
158 -### Workflow: Pre-warming the Android FlutterEngine
159 -Follow these steps to cache the FlutterEngine for seamless Android integration.
160 -
161 -- [ ] **Task Progress:**
162 - - [ ] Locate the Android `Application` class (create one if it doesn't exist and register in `AndroidManifest.xml`).
163 - - [ ] Instantiate a new `FlutterEngine`.
164 - - [ ] (Optional) Set the initial route via `navigationChannel.setInitialRoute()`.
165 - - [ ] Execute the Dart entrypoint via `dartExecutor.executeDartEntrypoint()`.
166 - - [ ] Store the engine in `FlutterEngineCache.getInstance().put()`.
167 - - [ ] Update the target `FlutterActivity` or `FlutterFragment` to use `.withCachedEngine("id")`.
168 - - [ ] Run validator -> review errors -> fix (Verify no blank screen appears during transition).
.agent/skills/flutter-embedding-native-views/SKILL.md deleted
-197
@@ -1,197 +0,0 @@
1 ----
2 -name: "flutter-embedding-native-views"
3 -description: "Embeds native Android, iOS, or macOS views into a Flutter app. Use when integrating complex native components like maps or web views."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:20:28 GMT"
7 -
8 ----
9 -# Integrating Platform Views and Web Content
10 -
11 -## Contents
12 -- [Platform Views Architecture](#platform-views-architecture)
13 -- [Web Embedding Architecture](#web-embedding-architecture)
14 -- [Workflow: Implementing Android Platform Views](#workflow-implementing-android-platform-views)
15 -- [Workflow: Implementing iOS Platform Views](#workflow-implementing-ios-platform-views)
16 -- [Workflow: Embedding Flutter in Web Applications](#workflow-embedding-flutter-in-web-applications)
17 -- [Examples](#examples)
18 -
19 -## Platform Views Architecture
20 -
21 -Platform Views allow embedding native views (Android, iOS, macOS) directly into a Flutter application, enabling the application of transforms, clips, and opacity from Dart.
22 -
23 -### Android Implementations (API 23+)
24 -Choose the appropriate implementation based on your performance and fidelity requirements:
25 -* **Hybrid Composition:** Renders Flutter content into a texture and uses `SurfaceFlinger` to compose both.
26 - * *Pros:* Best performance and fidelity for Android views.
27 - * *Cons:* Lowers overall application FPS. Certain Flutter widget transformations will not work.
28 -* **Texture Layer (Texture Layer Hybrid Composition):** Renders Platform Views into a texture. Flutter draws them via the texture and renders its own content directly into a Surface.
29 - * *Pros:* Best performance for Flutter rendering. All transformations work correctly.
30 - * *Cons:* Quick scrolling (e.g., WebViews) can be janky. `SurfaceView` is problematic (breaks accessibility). Text magnifiers break unless Flutter is rendered into a `TextureView`.
31 -
32 -### iOS & macOS Implementations
33 -* **iOS:** Uses Hybrid Composition exclusively. The native `UIView` is appended to the view hierarchy.
34 - * *Limitations:* `ShaderMask` and `ColorFiltered` widgets are not supported. `BackdropFilter` has composition limitations.
35 -* **macOS:** Uses Hybrid Composition (`NSView`).
36 - * *Limitations:* Not fully functional in current releases (e.g., gesture support is unavailable).
37 -
38 -### Performance Mitigation
39 -Mitigate performance drops during complex Dart animations by rendering a screenshot of the native view as a placeholder texture while the animation runs.
40 -
41 -## Web Embedding Architecture
42 -
43 -Embed Flutter into existing web applications (Vanilla JS, React, Angular, etc.) using either Full Page mode or Embedded (Multi-view) mode.
44 -
45 -* **Full Page Mode:** Flutter takes over the entire browser window. Use an `iframe` if you need to constrain the Flutter app without modifying the Flutter bootstrap process.
46 -* **Embedded Mode (Multi-view):** Render Flutter into specific HTML elements (`div`s). Requires `multiViewEnabled: true` during engine initialization.
47 - * Manage views from JavaScript using `app.addView()` and `app.removeView()`.
48 - * In Dart, replace `runApp` with `runWidget`.
49 - * Manage the dynamic list of views using `WidgetsBinding.instance.platformDispatcher.views` and render them using `ViewCollection` and `View` widgets.
50 -
51 -## Workflow: Implementing Android Platform Views
52 -
53 -Follow this sequential workflow to implement a Platform View on Android.
54 -
55 -**Task Progress:**
56 -- [ ] 1. Determine the composition mode (Hybrid vs. Texture Layer).
57 -- [ ] 2. Implement the Dart widget.
58 -- [ ] 3. Implement the native Android View and Factory.
59 -- [ ] 4. Register the Platform View in the Android host.
60 -- [ ] 5. Run validator -> review rendering -> fix manual invalidation issues.
61 -
62 -### 1. Dart Implementation
63 -If using **Hybrid Composition**, use `PlatformViewLink`, `AndroidViewSurface`, and `PlatformViewsService.initSurfaceAndroidView`.
64 -If using **Texture Layer**, use the `AndroidView` widget.
65 -
66 -### 2. Native Implementation
67 -Create a class implementing `io.flutter.plugin.platform.PlatformView` that returns your native `android.view.View`.
68 -Create a factory extending `PlatformViewFactory` to instantiate your view.
69 -
70 -### 3. Registration
71 -Register the factory in your `MainActivity.kt` (or plugin) using `flutterEngine.platformViewsController.registry.registerViewFactory`.
72 -
73 -*Note: If your native view uses `SurfaceView` or `SurfaceTexture`, manually call `invalidate` on the View or its parent when content changes, as they do not invalidate themselves automatically.*
74 -
75 -## Workflow: Implementing iOS Platform Views
76 -
77 -Follow this sequential workflow to implement a Platform View on iOS.
78 -
79 -**Task Progress:**
80 -- [ ] 1. Implement the Dart widget using `UiKitView`.
81 -- [ ] 2. Implement the native iOS View (`FlutterPlatformView`) and Factory (`FlutterPlatformViewFactory`).
82 -- [ ] 3. Register the Platform View in `AppDelegate.swift` or the plugin registrar.
83 -- [ ] 4. Run validator -> review composition limitations -> fix unsupported filters.
84 -
85 -## Workflow: Embedding Flutter in Web Applications
86 -
87 -Follow this sequential workflow to embed Flutter into an existing web DOM.
88 -
89 -**Task Progress:**
90 -- [ ] 1. Update `flutter_bootstrap.js` to enable multi-view.
91 -- [ ] 2. Update `main.dart` to use `runWidget` and `ViewCollection`.
92 -- [ ] 3. Implement JavaScript logic to add/remove host elements.
93 -- [ ] 4. Run validator -> review view constraints -> fix CSS conflicts.
94 -
95 -### 1. JavaScript Configuration
96 -In `flutter_bootstrap.js`, initialize the engine with `multiViewEnabled: true`.
97 -Use the returned `app` object to add views: `app.addView({ hostElement: document.getElementById('my-div') })`.
98 -
99 -### 2. Dart Configuration
100 -Replace `runApp()` with `runWidget()`.
101 -Create a root widget that listens to `WidgetsBindingObserver.didChangeMetrics`.
102 -Map over `WidgetsBinding.instance.platformDispatcher.views` to create a `View` widget for each attached `FlutterView`, and wrap them all in a `ViewCollection`.
103 -
104 -## Examples
105 -
106 -### Example: Android Texture Layer (Dart)
107 -```dart
108 -import 'package:flutter/material.dart';
109 -import 'package:flutter/services.dart';
110 -
111 -class NativeAndroidView extends StatelessWidget {
112 - @override
113 - Widget build(BuildContext context) {
114 - const String viewType = 'my_native_view';
115 - final Map<String, dynamic> creationParams = <String, dynamic>{};
116 -
117 - return AndroidView(
118 - viewType: viewType,
119 - layoutDirection: TextDirection.ltr,
120 - creationParams: creationParams,
121 - creationParamsCodec: const StandardMessageCodec(),
122 - );
123 - }
124 -}
125 -```
126 -
127 -### Example: Web Multi-View Initialization (JavaScript)
128 -```javascript
129 -_flutter.loader.load({
130 - onEntrypointLoaded: async function(engineInitializer) {
131 - let engine = await engineInitializer.initializeEngine({
132 - multiViewEnabled: true,
133 - });
134 - let app = await engine.runApp();
135 -
136 - // Add a view to a specific DOM element
137 - let viewId = app.addView({
138 - hostElement: document.querySelector('#flutter-host-container'),
139 - initialData: { customData: 'Hello from JS' }
140 - });
141 - }
142 -});
143 -```
144 -
145 -### Example: Web Multi-View Root Widget (Dart)
146 -```dart
147 -import 'dart:ui' show FlutterView;
148 -import 'package:flutter/widgets.dart';
149 -
150 -void main() {
151 - runWidget(MultiViewApp(viewBuilder: (context) => const MyEmbeddedWidget()));
152 -}
153 -
154 -class MultiViewApp extends StatefulWidget {
155 - final WidgetBuilder viewBuilder;
156 - const MultiViewApp({super.key, required this.viewBuilder});
157 -
158 - @override
159 - State<MultiViewApp> createState() => _MultiViewAppState();
160 -}
161 -
162 -class _MultiViewAppState extends State<MultiViewApp> with WidgetsBindingObserver {
163 - Map<Object, Widget> _views = {};
164 -
165 - @override
166 - void initState() {
167 - super.initState();
168 - WidgetsBinding.instance.addObserver(this);
169 - _updateViews();
170 - }
171 -
172 - @override
173 - void didChangeMetrics() => _updateViews();
174 -
175 - void _updateViews() {
176 - final newViews = <Object, Widget>{};
177 - for (final FlutterView view in WidgetsBinding.instance.platformDispatcher.views) {
178 - newViews[view.viewId] = _views[view.viewId] ?? View(
179 - view: view,
180 - child: Builder(builder: widget.viewBuilder),
181 - );
182 - }
183 - setState(() => _views = newViews);
184 - }
185 -
186 - @override
187 - void dispose() {
188 - WidgetsBinding.instance.removeObserver(this);
189 - super.dispose();
190 - }
191 -
192 - @override
193 - Widget build(BuildContext context) {
194 - return ViewCollection(views: _views.values.toList(growable: false));
195 - }
196 -}
197 -```
.agent/skills/flutter-handling-concurrency/SKILL.md deleted
-179
@@ -1,179 +0,0 @@
1 ----
2 -name: "flutter-handling-concurrency"
3 -description: "Executes long-running tasks in background isolates to keep the UI responsive. Use when performing heavy computations or parsing large datasets."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:23:14 GMT"
7 -
8 ----
9 -# Managing Dart Concurrency and Isolates
10 -
11 -## Contents
12 -- [Core Concepts](#core-concepts)
13 -- [Decision Matrix: Async vs. Isolates](#decision-matrix-async-vs-isolates)
14 -- [Workflows](#workflows)
15 - - [Implementing Standard Asynchronous UI](#implementing-standard-asynchronous-ui)
16 - - [Offloading Short-Lived Heavy Computation](#offloading-short-lived-heavy-computation)
17 - - [Establishing Long-Lived Worker Isolates](#establishing-long-lived-worker-isolates)
18 -- [Examples](#examples)
19 -
20 -## Core Concepts
21 -
22 -Dart utilizes a single-threaded execution model driven by an Event Loop (comparable to the iOS main loop). By default, all Flutter application code runs on the Main Isolate.
23 -
24 -* **Asynchronous Operations (`async`/`await`):** Use for non-blocking I/O tasks (network requests, file access). The Event Loop continues processing other events while waiting for the `Future` to complete.
25 -* **Isolates:** Dart's implementation of lightweight threads. Isolates possess their own isolated memory and do not share state. They communicate exclusively via message passing.
26 -* **Main Isolate:** The default thread where UI rendering and event handling occur. Blocking this isolate causes UI freezing (jank).
27 -* **Worker Isolate:** A spawned isolate used to offload CPU-bound tasks (e.g., decoding large JSON blobs) to prevent Main Isolate blockage.
28 -
29 -## Decision Matrix: Async vs. Isolates
30 -
31 -Apply the following conditional logic to determine the correct concurrency approach:
32 -
33 -* **If** the task is I/O bound (e.g., HTTP request, database read) -> **Use `async`/`await`** on the Main Isolate.
34 -* **If** the task is CPU-bound but executes quickly (< 16ms) -> **Use `async`/`await`** on the Main Isolate.
35 -* **If** the task is CPU-bound, takes significant time, and runs once (e.g., parsing a massive JSON payload) -> **Use `Isolate.run()`**.
36 -* **If** the task requires continuous or repeated background processing with multiple messages passed over time -> **Use `Isolate.spawn()` with `ReceivePort` and `SendPort`**.
37 -
38 -## Workflows
39 -
40 -### Implementing Standard Asynchronous UI
41 -
42 -Use this workflow to fetch and display non-blocking asynchronous data.
43 -
44 -**Task Progress:**
45 -- [ ] Mark the data-fetching function with the `async` keyword.
46 -- [ ] Return a `Future<T>` from the function.
47 -- [ ] Use the `await` keyword to yield execution until the operation completes.
48 -- [ ] Wrap the UI component in a `FutureBuilder<T>` (or `StreamBuilder` for streams).
49 -- [ ] Handle `ConnectionState.waiting`, `hasError`, and `hasData` states within the builder.
50 -- [ ] Run validator -> review UI for loading indicators -> fix missing states.
51 -
52 -### Offloading Short-Lived Heavy Computation
53 -
54 -Use this workflow for one-off, CPU-intensive tasks using Dart 2.19+.
55 -
56 -**Task Progress:**
57 -- [ ] Identify the CPU-bound operation blocking the Main Isolate.
58 -- [ ] Extract the computation into a standalone callback function.
59 -- [ ] Ensure the callback function signature accepts exactly one required, unnamed argument (as per specific architectural constraints).
60 -- [ ] Invoke `Isolate.run()` passing the callback.
61 -- [ ] `await` the result of `Isolate.run()` in the Main Isolate.
62 -- [ ] Assign the returned value to the application state.
63 -
64 -### Establishing Long-Lived Worker Isolates
65 -
66 -Use this workflow for persistent background processes requiring continuous bidirectional communication.
67 -
68 -**Task Progress:**
69 -- [ ] Instantiate a `ReceivePort` on the Main Isolate to listen for messages.
70 -- [ ] Spawn the worker isolate using `Isolate.spawn()`, passing the `ReceivePort.sendPort` as the initial message.
71 -- [ ] In the worker isolate, instantiate its own `ReceivePort`.
72 -- [ ] Send the worker's `SendPort` back to the Main Isolate via the initial port.
73 -- [ ] Store the worker's `SendPort` in the Main Isolate for future message dispatching.
74 -- [ ] Implement listeners on both `ReceivePort` instances to handle incoming messages.
75 -- [ ] Run validator -> review memory leaks -> ensure ports are closed when the isolate is no longer needed.
76 -
77 -## Examples
78 -
79 -### Example 1: Asynchronous UI with FutureBuilder
80 -
81 -```dart
82 -// 1. Define the async operation
83 -Future<String> fetchUserData() async {
84 - await Future.delayed(const Duration(seconds: 2)); // Simulate network I/O
85 - return "User Data Loaded";
86 -}
87 -
88 -// 2. Consume in the UI
89 -Widget build(BuildContext context) {
90 - return FutureBuilder<String>(
91 - future: fetchUserData(),
92 - builder: (context, snapshot) {
93 - if (snapshot.connectionState == ConnectionState.waiting) {
94 - return const CircularProgressIndicator();
95 - } else if (snapshot.hasError) {
96 - return Text('Error: ${snapshot.error}');
97 - } else {
98 - return Text('Result: ${snapshot.data}');
99 - }
100 - },
101 - );
102 -}
103 -```
104 -
105 -### Example 2: Short-Lived Isolate (`Isolate.run`)
106 -
107 -```dart
108 -import 'dart:isolate';
109 -import 'dart:convert';
110 -
111 -// 1. Define the heavy computation callback
112 -// Note: Adhering to the strict single-argument signature requirement.
113 -List<dynamic> decodeHeavyJson(String jsonString) {
114 - return jsonDecode(jsonString) as List<dynamic>;
115 -}
116 -
117 -// 2. Offload to a worker isolate
118 -Future<List<dynamic>> processDataInBackground(String rawJson) async {
119 - // Isolate.run spawns the isolate, runs the computation, returns the value, and exits.
120 - final result = await Isolate.run(() => decodeHeavyJson(rawJson));
121 - return result;
122 -}
123 -```
124 -
125 -### Example 3: Long-Lived Isolate (`ReceivePort` / `SendPort`)
126 -
127 -```dart
128 -import 'dart:isolate';
129 -
130 -class WorkerManager {
131 - late SendPort _workerSendPort;
132 - final ReceivePort _mainReceivePort = ReceivePort();
133 - Isolate? _isolate;
134 -
135 - Future<void> initialize() async {
136 - // 1. Spawn isolate and pass the Main Isolate's SendPort
137 - _isolate = await Isolate.spawn(_workerEntry, _mainReceivePort.sendPort);
138 -
139 - // 2. Listen for messages from the Worker Isolate
140 - _mainReceivePort.listen((message) {
141 - if (message is SendPort) {
142 - // First message is the Worker's SendPort
143 - _workerSendPort = message;
144 - _startCommunication();
145 - } else {
146 - // Subsequent messages are data payloads
147 - print('Main Isolate received: $message');
148 - }
149 - });
150 - }
151 -
152 - void _startCommunication() {
153 - // Send data to the worker
154 - _workerSendPort.send("Process this data");
155 - }
156 -
157 - // 3. Worker Isolate Entry Point
158 - static void _workerEntry(SendPort mainSendPort) {
159 - final workerReceivePort = ReceivePort();
160 -
161 - // Send the Worker's SendPort back to the Main Isolate
162 - mainSendPort.send(workerReceivePort.sendPort);
163 -
164 - // Listen for incoming tasks
165 - workerReceivePort.listen((message) {
166 - print('Worker Isolate received: $message');
167 -
168 - // Perform work and send result back
169 - final result = "Processed: $message";
170 - mainSendPort.send(result);
171 - });
172 - }
173 -
174 - void dispose() {
175 - _mainReceivePort.close();
176 - _isolate?.kill();
177 - }
178 -}
179 -```
.agent/skills/flutter-handling-http-and-json/SKILL.md deleted
-181
@@ -1,181 +0,0 @@
1 ----
2 -name: "flutter-handling-http-and-json"
3 -description: "Executes HTTP requests and handles JSON serialization in a Flutter app. Use when integrating with REST APIs or parsing structured data from external sources."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:18:44 GMT"
7 -
8 ----
9 -# Handling HTTP and JSON
10 -
11 -## Contents
12 -- [Core Guidelines](#core-guidelines)
13 -- [Workflow: Executing HTTP Operations](#workflow-executing-http-operations)
14 -- [Workflow: Implementing JSON Serialization](#workflow-implementing-json-serialization)
15 -- [Workflow: Parsing Large JSON in the Background](#workflow-parsing-large-json-in-the-background)
16 -- [Examples](#examples)
17 -
18 -## Core Guidelines
19 -
20 -- **Enforce HTTPS:** iOS and Android disable cleartext (HTTP) connections by default. Always use HTTPS endpoints. If HTTP is strictly required for debugging, configure `network_security_config.xml` (Android) and `NSAppTransportSecurity` (iOS).
21 -- **Construct URIs Safely:** Always use `Uri.https(authority, unencodedPath, [queryParameters])` to safely build URLs. This handles encoding and formatting reliably, preventing string concatenation errors.
22 -- **Handle Status Codes:** Always validate the `http.Response.statusCode`. Treat `200` (OK) and `201` (Created) as success. Throw explicit exceptions for other codes (do not return `null`).
23 -- **Prevent UI Jank:** Move expensive JSON parsing operations (taking >16ms) to a background isolate using the `compute()` function.
24 -- **Structured AI Output:** When integrating LLMs, enforce reliable JSON output by specifying a strict JSON schema in the system prompt and setting the response MIME type to `application/json`.
25 -
26 -## Workflow: Executing HTTP Operations
27 -
28 -Use this workflow to implement network requests using the `http` package.
29 -
30 -**Task Progress:**
31 -- [ ] Add the `http` package to `pubspec.yaml`.
32 -- [ ] Configure platform permissions (Internet permission in `AndroidManifest.xml` and macOS `.entitlements`).
33 -- [ ] Construct the target `Uri`.
34 -- [ ] Execute the HTTP method.
35 -- [ ] Validate the response and parse the JSON payload.
36 -
37 -**Conditional Implementation:**
38 -- **If fetching data (GET):** Use `http.get(uri)`.
39 -- **If sending new data (POST):** Use `http.post(uri, headers: {...}, body: jsonEncode(data))`. Ensure `Content-Type` is `application/json; charset=UTF-8`.
40 -- **If updating data (PUT):** Use `http.put(uri, headers: {...}, body: jsonEncode(data))`.
41 -- **If deleting data (DELETE):** Use `http.delete(uri, headers: {...})`.
42 -
43 -**Feedback Loop: Validation & Error Handling**
44 -1. Run the HTTP request.
45 -2. Check `response.statusCode`.
46 -3. If `200` or `201`, call `jsonDecode(response.body)` and map to a Dart object.
47 -4. If any other code, throw an `Exception('Failed to load/update/delete resource')`.
48 -5. Review errors -> fix endpoint, headers, or payload structure.
49 -
50 -## Workflow: Implementing JSON Serialization
51 -
52 -Choose the serialization strategy based on project complexity.
53 -
54 -**Conditional Implementation:**
55 -- **If building a small prototype or simple models:** Use manual serialization with `dart:convert`.
56 -- **If building a production app with complex/nested models:** Use code generation with `json_serializable`.
57 -
58 -### Manual Serialization Setup
59 -**Task Progress:**
60 -- [ ] Import `dart:convert`.
61 -- [ ] Define the Model class with `final` properties.
62 -- [ ] Implement a `factory Model.fromJson(Map<String, dynamic> json)` constructor.
63 -- [ ] Implement a `Map<String, dynamic> toJson()` method.
64 -
65 -### Code Generation Setup (`json_serializable`)
66 -**Task Progress:**
67 -- [ ] Add dependencies: `flutter pub add json_annotation` and `flutter pub add -d build_runner json_serializable`.
68 -- [ ] Import `json_annotation.dart` in the model file.
69 -- [ ] Add the `part 'model_name.g.dart';` directive.
70 -- [ ] Annotate the class with `@JsonSerializable()`. Use `explicitToJson: true` if the class contains nested models.
71 -- [ ] Define the `fromJson` factory and `toJson` method delegating to the generated functions.
72 -- [ ] Run the generator: `dart run build_runner build --delete-conflicting-outputs`.
73 -
74 -## Workflow: Parsing Large JSON in the Background
75 -
76 -Use this workflow to prevent frame drops when parsing large JSON payloads (e.g., lists of 1000+ items).
77 -
78 -**Task Progress:**
79 -- [ ] Create a top-level or static function that takes a `String` (the response body) and returns the parsed Dart object (e.g., `List<Model>`).
80 -- [ ] Inside the function, call `jsonDecode` and map the results to the Model class.
81 -- [ ] In the HTTP fetch method, pass the top-level parsing function and the `response.body` to Flutter's `compute()` function.
82 -
83 -## Examples
84 -
85 -### Example 1: HTTP GET with Manual Serialization
86 -```dart
87 -import 'dart:convert';
88 -import 'package:http/http.dart' as http;
89 -
90 -class Album {
91 - final int id;
92 - final String title;
93 -
94 - const Album({required this.id, required this.title});
95 -
96 - factory Album.fromJson(Map<String, dynamic> json) {
97 - return Album(
98 - id: json['id'] as int,
99 - title: json['title'] as String,
100 - );
101 - }
102 -}
103 -
104 -Future<Album> fetchAlbum() async {
105 - final uri = Uri.https('jsonplaceholder.typicode.com', '/albums/1');
106 - final response = await http.get(uri);
107 -
108 - if (response.statusCode == 200) {
109 - return Album.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
110 - } else {
111 - throw Exception('Failed to load album');
112 - }
113 -}
114 -```
115 -
116 -### Example 2: HTTP POST Request
117 -```dart
118 -Future<Album> createAlbum(String title) async {
119 - final uri = Uri.https('jsonplaceholder.typicode.com', '/albums');
120 - final response = await http.post(
121 - uri,
122 - headers: <String, String>{
123 - 'Content-Type': 'application/json; charset=UTF-8',
124 - },
125 - body: jsonEncode(<String, String>{'title': title}),
126 - );
127 -
128 - if (response.statusCode == 201) {
129 - return Album.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
130 - } else {
131 - throw Exception('Failed to create album.');
132 - }
133 -}
134 -```
135 -
136 -### Example 3: Background Parsing with `compute`
137 -```dart
138 -import 'dart:convert';
139 -import 'package:flutter/foundation.dart';
140 -import 'package:http/http.dart' as http;
141 -
142 -// 1. Top-level function for parsing
143 -List<Photo> parsePhotos(String responseBody) {
144 - final parsed = (jsonDecode(responseBody) as List<Object?>)
145 - .cast<Map<String, Object?>>();
146 - return parsed.map<Photo>(Photo.fromJson).toList();
147 -}
148 -
149 -// 2. Fetch function using compute
150 -Future<List<Photo>> fetchPhotos(http.Client client) async {
151 - final uri = Uri.https('jsonplaceholder.typicode.com', '/photos');
152 - final response = await client.get(uri);
153 -
154 - if (response.statusCode == 200) {
155 - // Run parsePhotos in a separate isolate
156 - return compute(parsePhotos, response.body);
157 - } else {
158 - throw Exception('Failed to load photos');
159 - }
160 -}
161 -```
162 -
163 -### Example 4: Code Generation (`json_serializable`)
164 -```dart
165 -import 'package:json_annotation/json_annotation.dart';
166 -
167 -part 'user.g.dart';
168 -
169 -@JsonSerializable(explicitToJson: true)
170 -class User {
171 - final String name;
172 -
173 - @JsonKey(name: 'registration_date_millis')
174 - final int registrationDateMillis;
175 -
176 - User(this.name, this.registrationDateMillis);
177 -
178 - factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
179 - Map<String, dynamic> toJson() => _$UserToJson(this);
180 -}
181 -```
.agent/skills/flutter-implementing-navigation-and-routing/SKILL.md deleted
-205
@@ -1,205 +0,0 @@
1 ----
2 -name: "flutter-implementing-navigation-and-routing"
3 -description: "Handles routing, navigation, and deep linking in a Flutter application. Use when moving between screens or setting up URL-based navigation."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:30:17 GMT"
7 -
8 ----
9 -# Implementing Navigation and Routing in Flutter
10 -
11 -## Contents
12 -- [Core Concepts](#core-concepts)
13 -- [Implementing Imperative Navigation](#implementing-imperative-navigation)
14 -- [Implementing Declarative Navigation](#implementing-declarative-navigation)
15 -- [Implementing Nested Navigation](#implementing-nested-navigation)
16 -- [Workflows](#workflows)
17 -- [Examples](#examples)
18 -
19 -## Core Concepts
20 -
21 -- **Routes:** In Flutter, screens and pages are referred to as *routes*. A route is simply a widget. This is equivalent to an `Activity` in Android or a `ViewController` in iOS.
22 -- **Navigator vs. Router:**
23 - - Use `Navigator` (Imperative) for small applications without complex deep linking requirements. It manages a stack of `Route` objects.
24 - - Use `Router` (Declarative) for applications with advanced navigation, web URL synchronization, and specific deep linking requirements.
25 -- **Deep Linking:** Allows an app to open directly to a specific location based on a URL. Supported on iOS, Android, and Web. Web requires no additional setup.
26 -- **Named Routes:** Avoid using named routes (`MaterialApp.routes` and `Navigator.pushNamed`) for most applications. They have rigid deep linking behavior and do not support the browser forward button. Use a routing package like `go_router` instead.
27 -
28 -## Implementing Imperative Navigation
29 -
30 -Use the `Navigator` widget to push and pop routes using platform-specific transition animations (`MaterialPageRoute` or `CupertinoPageRoute`).
31 -
32 -### Pushing and Popping
33 -- Navigate to a new route using `Navigator.push(context, route)`.
34 -- Return to the previous route using `Navigator.pop(context)`.
35 -- Use `Navigator.pushReplacement()` to replace the current route, or `Navigator.pushAndRemoveUntil()` to clear the stack based on a condition.
36 -
37 -### Passing and Returning Data
38 -- **Sending Data:** Pass data directly into the constructor of the destination widget. Alternatively, pass data via the `settings: RouteSettings(arguments: data)` parameter of the `PageRoute` and extract it using `ModalRoute.of(context)!.settings.arguments`.
39 -- **Returning Data:** Pass the return value to the `pop` method: `Navigator.pop(context, resultData)`. Await the result on the pushing side: `final result = await Navigator.push(...)`.
40 -
41 -## Implementing Declarative Navigation
42 -
43 -For apps requiring deep linking, web URL support, or complex routing, implement the `Router` API via a declarative routing package like `go_router`.
44 -
45 -- Switch from `MaterialApp` to `MaterialApp.router`.
46 -- Define a router configuration that parses route paths and configures the `Navigator` automatically.
47 -- Navigate using package-specific APIs (e.g., `context.go('/path')`).
48 -- **Page-backed vs. Pageless Routes:** Declarative routes are *page-backed* (deep-linkable). Imperative pushes (e.g., dialogs, bottom sheets) are *pageless*. Removing a page-backed route automatically removes all subsequent pageless routes.
49 -
50 -## Implementing Nested Navigation
51 -
52 -Implement nested navigation to manage a sub-flow of screens (e.g., a multi-step setup process or persistent bottom navigation tabs) independently from the top-level global navigator.
53 -
54 -- Instantiate a new `Navigator` widget inside the host widget.
55 -- Assign a `GlobalKey<NavigatorState>` to the nested `Navigator` to control it programmatically.
56 -- Implement the `onGenerateRoute` callback within the nested `Navigator` to resolve sub-routes.
57 -- Intercept hardware back button presses using `PopScope` to prevent the top-level navigator from popping the entire nested flow prematurely.
58 -
59 -## Workflows
60 -
61 -### Workflow: Standard Screen Transition
62 -Copy this checklist to track progress when implementing a basic screen transition:
63 -- [ ] Create the destination widget (Route).
64 -- [ ] Define required data parameters in the destination widget's constructor.
65 -- [ ] Implement `Navigator.push()` in the source widget.
66 -- [ ] Wrap the destination widget in a `MaterialPageRoute` or `CupertinoPageRoute`.
67 -- [ ] Implement `Navigator.pop()` in the destination widget to return.
68 -
69 -### Workflow: Implementing Deep-Linkable Routing
70 -Use this conditional workflow when setting up app-wide routing:
71 -- [ ] **If** the app is simple and requires no deep linking:
72 - - [ ] Use standard `MaterialApp` and `Navigator.push()`.
73 -- [ ] **If** the app requires deep linking, web support, or complex flows:
74 - - [ ] Add the `go_router` package.
75 - - [ ] Change `MaterialApp` to `MaterialApp.router`.
76 - - [ ] Define the `GoRouter` configuration with all top-level routes.
77 - - [ ] Replace `Navigator.push()` with `context.go()` or `context.push()`.
78 -
79 -### Workflow: Creating a Nested Navigation Flow
80 -Run this workflow when building a multi-step sub-flow (e.g., IoT device setup):
81 -- [ ] Define string constants for the nested route paths.
82 -- [ ] Create a `GlobalKey<NavigatorState>` in the host widget's state.
83 -- [ ] Return a `Navigator` widget in the host's `build` method, passing the key.
84 -- [ ] Implement `onGenerateRoute` in the nested `Navigator` to map string paths to specific step widgets.
85 -- [ ] Wrap the host `Scaffold` in a `PopScope` to handle back-button interceptions (e.g., prompting "Are you sure you want to exit setup?").
86 -- [ ] Use `navigatorKey.currentState!.pushNamed()` to advance steps within the flow.
87 -
88 -## Examples
89 -
90 -### Example: Passing Data via Constructor (Imperative)
91 -
92 -```dart
93 -// 1. Define the data model
94 -class Todo {
95 - final String title;
96 - final String description;
97 - const Todo(this.title, this.description);
98 -}
99 -
100 -// 2. Source Screen
101 -class TodosScreen extends StatelessWidget {
102 - final List<Todo> todos;
103 - const TodosScreen({super.key, required this.todos});
104 -
105 - @override
106 - Widget build(BuildContext context) {
107 - return Scaffold(
108 - appBar: AppBar(title: const Text('Todos')),
109 - body: ListView.builder(
110 - itemCount: todos.length,
111 - itemBuilder: (context, index) {
112 - return ListTile(
113 - title: Text(todos[index].title),
114 - onTap: () {
115 - // Push and pass data via constructor
116 - Navigator.push(
117 - context,
118 - MaterialPageRoute(
119 - builder: (context) => DetailScreen(todo: todos[index]),
120 - ),
121 - );
122 - },
123 - );
124 - },
125 - ),
126 - );
127 - }
128 -}
129 -
130 -// 3. Destination Screen
131 -class DetailScreen extends StatelessWidget {
132 - final Todo todo;
133 - const DetailScreen({super.key, required this.todo});
134 -
135 - @override
136 - Widget build(BuildContext context) {
137 - return Scaffold(
138 - appBar: AppBar(title: Text(todo.title)),
139 - body: Padding(
140 - padding: const EdgeInsets.all(16),
141 - child: Text(todo.description),
142 - ),
143 - );
144 - }
145 -}
146 -```
147 -
148 -### Example: Nested Navigation Flow
149 -
150 -```dart
151 -class SetupFlow extends StatefulWidget {
152 - final String initialRoute;
153 - const SetupFlow({super.key, required this.initialRoute});
154 -
155 - @override
156 - State<SetupFlow> createState() => _SetupFlowState();
157 -}
158 -
159 -class _SetupFlowState extends State<SetupFlow> {
160 - final _navigatorKey = GlobalKey<NavigatorState>();
161 -
162 - void _exitSetup() => Navigator.of(context).pop();
163 -
164 - @override
165 - Widget build(BuildContext context) {
166 - return PopScope(
167 - canPop: false,
168 - onPopInvokedWithResult: (didPop, _) async {
169 - if (didPop) return;
170 - // Intercept back button to prevent accidental exit
171 - _exitSetup();
172 - },
173 - child: Scaffold(
174 - appBar: AppBar(title: const Text('Setup')),
175 - body: Navigator(
176 - key: _navigatorKey,
177 - initialRoute: widget.initialRoute,
178 - onGenerateRoute: _onGenerateRoute,
179 - ),
180 - ),
181 - );
182 - }
183 -
184 - Route<Widget> _onGenerateRoute(RouteSettings settings) {
185 - Widget page;
186 - switch (settings.name) {
187 - case 'step1':
188 - page = StepOnePage(
189 - onComplete: () => _navigatorKey.currentState!.pushNamed('step2'),
190 - );
191 - break;
192 - case 'step2':
193 - page = StepTwoPage(onComplete: _exitSetup);
194 - break;
195 - default:
196 - throw StateError('Unexpected route name: ${settings.name}!');
197 - }
198 -
199 - return MaterialPageRoute(
200 - builder: (context) => page,
201 - settings: settings,
202 - );
203 - }
204 -}
205 -```
.agent/skills/flutter-improving-accessibility/SKILL.md deleted
-110
@@ -1,110 +0,0 @@
1 ----
2 -name: "flutter-improving-accessibility"
3 -description: "Configures a Flutter app to support assistive technologies like Screen Readers. Use when ensuring an application is usable for people with disabilities."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:17:37 GMT"
7 -
8 ----
9 -# Implementing Flutter Accessibility
10 -
11 -## Contents
12 -- [UI Design and Styling](#ui-design-and-styling)
13 -- [Accessibility Widgets](#accessibility-widgets)
14 -- [Web Accessibility](#web-accessibility)
15 -- [Adaptive and Responsive Design](#adaptive-and-responsive-design)
16 -- [Workflows](#workflows)
17 -- [Examples](#examples)
18 -
19 -## UI Design and Styling
20 -Design layouts to accommodate dynamic scaling and high visibility. Flutter automatically calculates font sizes based on OS-level accessibility settings.
21 -
22 -* **Font Scaling:** Ensure layouts provide sufficient room to render all contents when font sizes are increased to their maximum OS settings. Avoid hardcoding fixed heights on text containers.
23 -* **Color Contrast:** Maintain a contrast ratio of at least 4.5:1 for small text and 3.0:1 for large text (18pt+ regular or 14pt+ bold) to meet W3C standards.
24 -* **Tap Targets:** Enforce a minimum tap target size of 48x48 logical pixels to accommodate users with limited dexterity.
25 -
26 -## Accessibility Widgets
27 -Utilize Flutter's catalog of accessibility widgets to manipulate the semantics tree exposed to assistive technologies (like TalkBack or VoiceOver).
28 -
29 -* **`Semantics`**: Use this to annotate the widget tree with a description of the meaning of the widgets. Assign specific roles using the `SemanticsRole` enum (e.g., button, link, heading) when building custom components.
30 -* **`MergeSemantics`**: Wrap composite widgets to merge the semantics of all descendants into a single selectable node for screen readers.
31 -* **`ExcludeSemantics`**: Use this to drop the semantics of all descendants, hiding redundant or purely decorative sub-widgets from accessibility tools.
32 -
33 -## Web Accessibility
34 -Flutter web renders UI on a single canvas, requiring a specialized DOM layer to expose structure to browsers.
35 -
36 -* **Enable Semantics:** Web accessibility is disabled by default for performance. Users can enable it via an invisible button (`aria-label="Enable accessibility"`).
37 -* **Programmatic Enablement:** If building a web-first application requiring default accessibility, force the semantics tree generation at startup.
38 -* **Semantic Roles:** Rely on standard widgets (`TabBar`, `MenuAnchor`, `Table`) for automatic ARIA role mapping. For custom components, explicitly assign `SemanticsRole` values to ensure screen readers interpret the elements correctly.
39 -
40 -## Adaptive and Responsive Design
41 -Differentiate between adaptive and responsive paradigms to build universal applications.
42 -
43 -* **Responsive Design:** Adjust the placement, sizing, and reflowing of design elements to fit the available screen space.
44 -* **Adaptive Design:** Select appropriate layouts (e.g., bottom navigation vs. side panel) and input mechanisms (e.g., touch vs. mouse/keyboard) to make the UI usable within the current device context. Design to the strengths of each form factor.
45 -
46 -## Workflows
47 -
48 -### Task Progress: Accessibility Implementation
49 -Copy this checklist to track accessibility compliance during UI development:
50 -
51 -- [ ] Verify all interactive elements have a minimum tap target of 48x48 pixels.
52 -- [ ] Test layout with maximum OS font size settings to ensure no text clipping or overflow occurs.
53 -- [ ] Validate color contrast ratios (4.5:1 for normal text, 3.0:1 for large text).
54 -- [ ] Wrap custom interactive widgets in `Semantics` and assign the appropriate `SemanticsRole`.
55 -- [ ] Group complex composite widgets using `MergeSemantics` to prevent screen reader fatigue.
56 -- [ ] Hide decorative elements from screen readers using `ExcludeSemantics`.
57 -- [ ] If targeting web, verify ARIA roles are correctly mapped and consider programmatic enablement of the semantics tree.
58 -
59 -### Feedback Loop: Accessibility Validation
60 -Run this loop when finalizing a view or component:
61 -1. **Run validator:** Execute accessibility tests or use OS-level screen readers (VoiceOver/TalkBack) to navigate the view.
62 -2. **Review errors:** Identify unannounced interactive elements, trapped focus, or clipped text.
63 -3. **Fix:** Apply `Semantics`, adjust constraints, or modify colors. Repeat until the screen reader provides a clear, logical traversal of the UI.
64 -
65 -## Examples
66 -
67 -### Programmatic Web Accessibility Enablement
68 -If targeting web and requiring accessibility by default, initialize the semantics binding before running the app.
69 -
70 -```dart
71 -import 'package:flutter/material.dart';
72 -import 'package:flutter/semantics.dart';
73 -import 'package:flutter/foundation.dart';
74 -
75 -void main() {
76 - if (kIsWeb) {
77 - SemanticsBinding.instance.ensureSemantics();
78 - }
79 - runApp(const MyApp());
80 -}
81 -```
82 -
83 -### Custom Component Semantics
84 -If building a custom widget that acts as a list item, explicitly define its semantic role so assistive technologies and web ARIA mappings interpret it correctly.
85 -
86 -```dart
87 -import 'package:flutter/material.dart';
88 -import 'package:flutter/semantics.dart';
89 -
90 -class CustomListItem extends StatelessWidget {
91 - final String text;
92 -
93 - const CustomListItem({super.key, required this.text});
94 -
95 - @override
96 - Widget build(BuildContext context) {
97 - return Semantics(
98 - role: SemanticsRole.listItem,
99 - label: text,
100 - child: Padding(
101 - padding: const EdgeInsets.all(12.0), // Ensures > 48px tap target if interactive
102 - child: Text(
103 - text,
104 - style: const TextStyle(fontSize: 16), // Ensure contrast ratio > 4.5:1
105 - ),
106 - ),
107 - );
108 - }
109 -}
110 -```
.agent/skills/flutter-interoperating-with-native-apis/SKILL.md deleted
-127
@@ -1,127 +0,0 @@
1 ----
2 -name: "flutter-interoperating-with-native-apis"
3 -description: "Interoperates with native platform APIs on Android, iOS, and the web. Use when accessing device-specific features not available in Dart or calling existing native code."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:21:02 GMT"
7 -
8 ----
9 -# Integrating Platform-Specific Code in Flutter
10 -
11 -## Contents
12 -- [Core Concepts & Terminology](#core-concepts--terminology)
13 -- [Binding to Native C/C++ Code (FFI)](#binding-to-native-cc-code-ffi)
14 -- [Implementing Platform Channels & Pigeon](#implementing-platform-channels--pigeon)
15 -- [Hosting Native Platform Views](#hosting-native-platform-views)
16 -- [Integrating Web Content & Wasm](#integrating-web-content--wasm)
17 -- [Workflows](#workflows)
18 -
19 -## Core Concepts & Terminology
20 -- **FFI (Foreign Function Interface):** The `dart:ffi` library used to bind Dart directly to native C/C++ APIs.
21 -- **Platform Channel:** The asynchronous message-passing system (`MethodChannel`, `BasicMessageChannel`) connecting the Dart client (UI) to the host platform (Kotlin/Java, Swift/Objective-C, C++).
22 -- **Pigeon:** A code-generation tool that creates type-safe Platform Channels.
23 -- **Platform View:** A mechanism to embed native UI components (e.g., Android `View`, iOS `UIView`) directly into the Flutter widget tree.
24 -- **JS Interop:** The modern, Wasm-compatible approach to interacting with JavaScript and DOM APIs using `package:web` and `dart:js_interop`.
25 -
26 -## Binding to Native C/C++ Code (FFI)
27 -Use FFI to execute high-performance native code or utilize existing C/C++ libraries without the overhead of asynchronous Platform Channels.
28 -
29 -### Project Setup
30 -* **If creating a standard C/C++ integration (Recommended since Flutter 3.38):** Use the `package_ffi` template. This utilizes `build.dart` hooks to compile native code, eliminating the need for OS-specific build files (CMake, build.gradle, podspec).
31 - ```bash
32 - flutter create --template=package_ffi <package_name>
33 - ```
34 -* **If requiring access to the Flutter Plugin API or Play Services:** Use the legacy `plugin_ffi` template.
35 - ```bash
36 - flutter create --template=plugin_ffi <plugin_name>
37 - ```
38 -
39 -### Implementation Rules
40 -* **Symbol Visibility:** Always mark C++ symbols with `extern "C"` and prevent linker discarding during link-time optimization (LTO).
41 - ```cpp
42 - extern "C" __attribute__((visibility("default"))) __attribute__((used))
43 - ```
44 -* **Dynamic Library Naming (Apple Platforms):** Ensure your `build.dart` hook produces the exact same filename across all target architectures (e.g., `arm64` vs `x86_64`) and SDKs (`iphoneos` vs `iphonesimulator`). Do not append architecture suffixes to the `.dylib` or `.framework` names.
45 -* **Binding Generation:** Always use `package:ffigen` to generate Dart bindings from your C headers (`.h`). Configure this in `ffigen.yaml`.
46 -
47 -## Implementing Platform Channels & Pigeon
48 -Use Platform Channels when you need to interact with platform-specific APIs (e.g., Battery, Bluetooth, OS-level services) using the platform's native language.
49 -
50 -### Pigeon (Type-Safe Channels)
51 -Always prefer `package:pigeon` over raw `MethodChannel` implementations for complex or frequently used APIs.
52 -1. Define the messaging protocol in a standalone Dart file using Pigeon annotations (`@HostApi()`).
53 -2. Generate the host (Kotlin/Swift/C++) and client (Dart) code.
54 -3. Implement the generated interfaces on the native side.
55 -
56 -### Threading Rules
57 -* **Main Thread Requirement:** Always invoke channel methods destined for Flutter on the platform's main thread (UI thread).
58 -* **Background Execution:** If executing channel handlers on a background thread (Android/iOS), you must use the Task Queue API (`makeBackgroundTaskQueue()`).
59 -* **Isolates:** To use plugins/channels from a Dart background `Isolate`, ensure it is registered using `BackgroundIsolateBinaryMessenger.ensureInitialized(rootIsolateToken)`.
60 -
61 -## Hosting Native Platform Views
62 -Use Platform Views to embed native UI components (e.g., Google Maps, native video players) into the Flutter widget tree.
63 -
64 -### Android Platform Views
65 -Evaluate the trade-offs between the two rendering modes and select the appropriate one:
66 -* **If requiring perfect fidelity, accessibility, or SurfaceView support:** Use **Hybrid Composition** (`PlatformViewLink` + `AndroidViewSurface`). This appends the native view to the hierarchy but may reduce Flutter's rendering performance.
67 -* **If prioritizing Flutter rendering performance and transformations:** Use **Texture Layer** (`AndroidView`). This renders the native view into a texture. Note: Quick scrolling may drop frames, and `SurfaceView` is problematic.
68 -
69 -### iOS Platform Views
70 -* iOS exclusively uses Hybrid Composition.
71 -* Implement `FlutterPlatformViewFactory` and `FlutterPlatformView` in Swift or Objective-C.
72 -* Use the `UiKitView` widget on the Dart side.
73 -* *Limitation:* `ShaderMask` and `ColorFiltered` widgets cannot be applied to iOS Platform Views.
74 -
75 -## Integrating Web Content & Wasm
76 -Flutter Web supports compiling to WebAssembly (Wasm) for improved performance and multi-threading.
77 -
78 -### Wasm Compilation
79 -* Compile to Wasm using: `flutter build web --wasm`.
80 -* **Server Configuration:** To enable multi-threading, configure your HTTP server to emit the following headers:
81 - * `Cross-Origin-Embedder-Policy: credentialless` (or `require-corp`)
82 - * `Cross-Origin-Opener-Policy: same-origin`
83 -* *Limitation:* WasmGC is not currently supported on iOS browsers (WebKit limitation). Flutter will automatically fall back to JavaScript if WasmGC is unavailable.
84 -
85 -### Web Interop
86 -* **If writing new web-specific code:** Strictly use `package:web` and `dart:js_interop`.
87 -* **Do NOT use:** `dart:html`, `dart:js`, or `package:js`. These are incompatible with Wasm compilation.
88 -* **Embedding HTML:** Use `HtmlElementView.fromTagName` to inject arbitrary HTML elements (like `<video>`) into the Flutter Web DOM.
89 -
90 ----
91 -
92 -## Workflows
93 -
94 -### Workflow: Creating a Native FFI Integration
95 -Use this workflow when binding to a C/C++ library.
96 -
97 -- [ ] **Task Progress:**
98 - - [ ] 1. Run `flutter create --template=package_ffi <name>`.
99 - - [ ] 2. Place C/C++ source code in the `src/` directory.
100 - - [ ] 3. Ensure all exported C++ functions are wrapped in `extern "C"` and visibility attributes.
101 - - [ ] 4. Configure `ffigen.yaml` to point to your header files.
102 - - [ ] 5. Run `dart run ffigen` to generate Dart bindings.
103 - - [ ] 6. Modify `hook/build.dart` if linking against pre-compiled or system libraries.
104 - - [ ] 7. Run validator -> `flutter test` -> review errors -> fix.
105 -
106 -### Workflow: Implementing a Type-Safe Platform Channel (Pigeon)
107 -Use this workflow when you need to call Kotlin/Swift APIs from Dart.
108 -
109 -- [ ] **Task Progress:**
110 - - [ ] 1. Add `pigeon` to `dev_dependencies`.
111 - - [ ] 2. Create `pigeons/messages.dart` and define data classes and `@HostApi()` abstract classes.
112 - - [ ] 3. Run the Pigeon generator script to output Dart, Kotlin, and Swift files.
113 - - [ ] 4. **Android:** Implement the generated interface in `MainActivity.kt` or your Plugin class.
114 - - [ ] 5. **iOS:** Implement the generated protocol in `AppDelegate.swift` or your Plugin class.
115 - - [ ] 6. **Dart:** Import the generated Dart file and call the API methods.
116 - - [ ] 7. Run validator -> verify cross-platform compilation -> review errors -> fix.
117 -
118 -### Workflow: Embedding a Native Platform View
119 -Use this workflow when embedding a native UI component (e.g., a native map or camera view).
120 -
121 -- [ ] **Task Progress:**
122 - - [ ] 1. **Dart:** Create a widget that conditionally returns `AndroidView` (or `PlatformViewLink`) for Android, and `UiKitView` for iOS based on `defaultTargetPlatform`.
123 - - [ ] 2. **Android:** Create a class implementing `PlatformView` that returns the native Android `View`.
124 - - [ ] 3. **Android:** Create a `PlatformViewFactory` and register it in `configureFlutterEngine`.
125 - - [ ] 4. **iOS:** Create a class implementing `FlutterPlatformView` that returns the native `UIView`.
126 - - [ ] 5. **iOS:** Create a `FlutterPlatformViewFactory` and register it in `application:didFinishLaunchingWithOptions:`.
127 - - [ ] 6. Run validator -> test on physical Android and iOS devices -> review UI clipping/scrolling issues -> fix.
.agent/skills/flutter-localizing-apps/SKILL.md deleted
-204
@@ -1,204 +0,0 @@
1 ----
2 -name: "flutter-localizing-apps"
3 -description: "Configures a Flutter app to support multiple languages and regions. Use when preparing an application for international markets and diverse user locales."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:17:07 GMT"
7 -
8 ----
9 -# Localizing Flutter Applications
10 -
11 -## Contents
12 -- [Core Configuration](#core-configuration)
13 -- [Defining ARB Resources](#defining-arb-resources)
14 -- [App Integration](#app-integration)
15 -- [Advanced Formatting](#advanced-formatting)
16 -- [Workflows](#workflows)
17 -- [Troubleshooting & Gotchas](#troubleshooting--gotchas)
18 -
19 -## Core Configuration
20 -
21 -Configure the project to support code generation for localizations.
22 -
23 -1. Add required dependencies to `pubspec.yaml`:
24 -```yaml
25 -dependencies:
26 - flutter:
27 - sdk: flutter
28 - flutter_localizations:
29 - sdk: flutter
30 - intl: any
31 -
32 -flutter:
33 - generate: true # Required for l10n code generation
34 -```
35 -
36 -2. Create an `l10n.yaml` file in the project root to configure the `gen-l10n` tool:
37 -```yaml
38 -arb-dir: lib/l10n
39 -template-arb-file: app_en.arb
40 -output-localization-file: app_localizations.dart
41 -# Optional: Set to false to generate files into lib/ instead of the synthetic package
42 -# synthetic-package: false
43 -```
44 -
45 -## Defining ARB Resources
46 -
47 -Store localized strings in Application Resource Bundle (`.arb`) files within the configured `arb-dir`.
48 -
49 -Create the template file (e.g., `lib/l10n/app_en.arb`):
50 -```json
51 -{
52 - "helloWorld": "Hello World!",
53 - "@helloWorld": {
54 - "description": "The conventional newborn programmer greeting"
55 - }
56 -}
57 -```
58 -
59 -Create translation files (e.g., `lib/l10n/app_es.arb`):
60 -```json
61 -{
62 - "helloWorld": "¡Hola Mundo!"
63 -}
64 -```
65 -
66 -## App Integration
67 -
68 -Initialize the `Localizations` widget by configuring the root `MaterialApp` or `CupertinoApp`.
69 -
70 -```dart
71 -import 'package:flutter_localizations/flutter_localizations.dart';
72 -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; // Adjust import if synthetic-package is false
73 -
74 -return MaterialApp(
75 - title: 'Localized App',
76 - localizationsDelegates: const [
77 - AppLocalizations.delegate,
78 - GlobalMaterialLocalizations.delegate,
79 - GlobalWidgetsLocalizations.delegate,
80 - GlobalCupertinoLocalizations.delegate,
81 - ],
82 - supportedLocales: const [
83 - Locale('en'), // English
84 - Locale('es'), // Spanish
85 - ],
86 - home: const MyHomePage(),
87 -);
88 -```
89 -
90 -Access localized values in the widget tree using the generated `AppLocalizations` class:
91 -```dart
92 -Text(AppLocalizations.of(context)!.helloWorld)
93 -```
94 -
95 -*Note: If using `WidgetsApp` instead of `MaterialApp`, omit `GlobalMaterialLocalizations.delegate`.*
96 -
97 -## Advanced Formatting
98 -
99 -Use placeholders, plurals, and selects for dynamic content. Define parameters in the `@key` metadata.
100 -
101 -### Placeholders
102 -```json
103 -"hello": "Hello {userName}",
104 -"@hello": {
105 - "description": "A message with a single parameter",
106 - "placeholders": {
107 - "userName": {
108 - "type": "String",
109 - "example": "Bob"
110 - }
111 - }
112 -}
113 -```
114 -
115 -### Plurals
116 -```json
117 -"nWombats": "{count, plural, =0{no wombats} =1{1 wombat} other{{count} wombats}}",
118 -"@nWombats": {
119 - "placeholders": {
120 - "count": {
121 - "type": "num",
122 - "format": "compact"
123 - }
124 - }
125 -}
126 -```
127 -
128 -### Selects (Gender/Enums)
129 -```json
130 -"pronoun": "{gender, select, male{he} female{she} other{they}}",
131 -"@pronoun": {
132 - "placeholders": {
133 - "gender": {
134 - "type": "String"
135 - }
136 - }
137 -}
138 -```
139 -
140 -### Dates and Numbers
141 -Use `format` and `optionalParameters` to leverage `intl` formatting.
142 -```json
143 -"dateMessage": "Date: {date}",
144 -"@dateMessage": {
145 - "placeholders": {
146 - "date": {
147 - "type": "DateTime",
148 - "format": "yMd"
149 - }
150 - }
151 -}
152 -```
153 -
154 -## Workflows
155 -
156 -### Task Progress: Adding a New Language
157 -Copy this checklist to track progress when introducing a new locale.
158 -
159 -- [ ] Create a new `.arb` file in the `arb-dir` (e.g., `app_fr.arb`).
160 -- [ ] Translate all keys present in the template `.arb` file.
161 -- [ ] Add the new `Locale` to the `supportedLocales` list in `MaterialApp`.
162 -- [ ] Run validator -> Execute `flutter gen-l10n` to verify ARB syntax and regenerate `AppLocalizations`.
163 -- [ ] Review errors -> Fix any missing placeholders or malformed plural/select statements.
164 -- [ ] If targeting iOS, complete the "Configuring iOS App Bundle" workflow.
165 -
166 -### Task Progress: Configuring iOS App Bundle
167 -Flutter handles runtime localization, but iOS requires bundle-level configuration for the App Store and system settings.
168 -
169 -- [ ] Open `ios/Runner.xcodeproj` in Xcode.
170 -- [ ] Select the `Runner` project in the Project Navigator.
171 -- [ ] Navigate to the `Info` tab.
172 -- [ ] Under the **Localizations** section, click the `+` button.
173 -- [ ] Add the newly supported languages/regions.
174 -- [ ] Run validator -> Build the iOS app to ensure `project.pbxproj` is correctly updated.
175 -
176 -## Troubleshooting & Gotchas
177 -
178 -### Missing Localizations Ancestor
179 -Widgets like `TextField` and `CupertinoTabBar` require a `Localizations` ancestor with specific delegates (`MaterialLocalizations` or `CupertinoLocalizations`).
180 -
181 -**Error:** `No MaterialLocalizations found.` or `CupertinoTabBar requires a Localizations parent...`
182 -**Fix:** Ensure the widget is a descendant of `MaterialApp`/`CupertinoApp`. If building a standalone widget tree (e.g., in tests or a custom `WidgetsApp`), wrap the widget in a `Localizations` widget:
183 -
184 -```dart
185 -Localizations(
186 - locale: const Locale('en', 'US'),
187 - delegates: const [
188 - DefaultWidgetsLocalizations.delegate,
189 - DefaultMaterialLocalizations.delegate, // Required for TextField
190 - DefaultCupertinoLocalizations.delegate, // Required for CupertinoTabBar
191 - ],
192 - child: child,
193 -)
194 -```
195 -
196 -### Advanced Locale Definition
197 -If supporting languages with multiple scripts (e.g., Chinese), use `Locale.fromSubtags` to explicitly define the `scriptCode` and `countryCode` to prevent Flutter from resolving to an unexpected variant.
198 -
199 -```dart
200 -supportedLocales: const [
201 - Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hans', countryCode: 'CN'),
202 - Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hant', countryCode: 'TW'),
203 -]
204 -```
.agent/skills/flutter-managing-state/SKILL.md deleted
-203
@@ -1,203 +0,0 @@
1 ----
2 -name: "flutter-managing-state"
3 -description: "Manages application and ephemeral state in a Flutter app. Use when sharing data between widgets or handling complex UI state transitions."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:18:06 GMT"
7 -
8 ----
9 -# Managing State in Flutter
10 -
11 -## Contents
12 -- [Core Concepts](#core-concepts)
13 -- [Architecture and Data Flow](#architecture-and-data-flow)
14 -- [Workflow: Selecting a State Management Approach](#workflow-selecting-a-state-management-approach)
15 -- [Workflow: Implementing MVVM with Provider](#workflow-implementing-mvvm-with-provider)
16 -- [Examples](#examples)
17 -
18 -## Core Concepts
19 -
20 -Flutter's UI is declarative; it is built to reflect the current state of the app (`UI = f(state)`). When state changes, trigger a rebuild of the UI that depends on that state.
21 -
22 -Distinguish between two primary types of state to determine your management strategy:
23 -* **Ephemeral State (Local State):** State contained neatly within a single widget (e.g., current page in a `PageView`, current selected tab, animation progress). Manage this using a `StatefulWidget` and `setState()`.
24 -* **App State (Shared State):** State shared across multiple parts of the app and maintained between user sessions (e.g., user preferences, login info, shopping cart contents). Manage this using advanced approaches like `InheritedWidget`, the `provider` package, and the MVVM architecture.
25 -
26 -## Architecture and Data Flow
27 -
28 -Implement the **Model-View-ViewModel (MVVM)** design pattern combined with **Unidirectional Data Flow (UDF)** for scalable app state management.
29 -
30 -* **Unidirectional Data Flow (UDF):** Enforce a strict flow where state flows *down* from the data layer, through the logic layer, to the UI layer. Events from user interactions flow *up* from the UI layer, to the logic layer, to the data layer.
31 -* **Single Source of Truth (SSOT):** Ensure data changes always happen in the data layer (Repositories). The SSOT class must be the only class capable of modifying its respective data.
32 -* **Model (Data Layer):** Handle low-level tasks like HTTP requests, data caching, and system resources using Repository classes.
33 -* **ViewModel (Logic Layer):** Manage the UI state. Convert app data from the Model into UI State. Extend `ChangeNotifier` and call `notifyListeners()` to trigger UI rebuilds when data changes.
34 -* **View (UI Layer):** Display the state provided by the ViewModel. Keep views lean; they should contain minimal logic (only routing, animations, or simple UI conditionals).
35 -
36 -## Workflow: Selecting a State Management Approach
37 -
38 -Evaluate the scope of the state to determine the correct implementation strategy.
39 -
40 -* **If managing Ephemeral State (single widget scope):**
41 - 1. Subclass `StatefulWidget` and `State`.
42 - 2. Store mutable state as private fields within the `State` class.
43 - 3. Mutate state exclusively inside a `setState()` callback to mark the widget as dirty and schedule a rebuild.
44 -* **If managing App State (shared across widgets):**
45 - 1. Implement the MVVM pattern.
46 - 2. Use the `provider` package (a wrapper around `InheritedWidget`) to inject state into the widget tree.
47 - 3. Use `ChangeNotifier` to emit state updates.
48 -
49 -## Workflow: Implementing MVVM with Provider
50 -
51 -Follow this sequential workflow to implement app-level state management using MVVM and `provider`.
52 -
53 -**Task Progress:**
54 -- [ ] 1. Define the Model (Repository).
55 -- [ ] 2. Create the ViewModel (`ChangeNotifier`).
56 -- [ ] 3. Inject the ViewModel into the Widget Tree.
57 -- [ ] 4. Consume the State in the View.
58 -- [ ] 5. Validate the implementation.
59 -
60 -### 1. Define the Model (Repository)
61 -Create a repository class to act as the Single Source of Truth (SSOT) for the specific data domain. Handle all external API calls or database queries here.
62 -
63 -### 2. Create the ViewModel (`ChangeNotifier`)
64 -Create a ViewModel class that extends `ChangeNotifier`.
65 -* Pass the Repository into the ViewModel via dependency injection.
66 -* Define properties for the UI state (e.g., `isLoading`, `data`, `errorMessage`).
67 -* Implement methods to handle UI events. Inside these methods, mutate the state and call `notifyListeners()` to trigger UI rebuilds.
68 -
69 -### 3. Inject the ViewModel into the Widget Tree
70 -Use `ChangeNotifierProvider` from the `provider` package to provide the ViewModel to the widget subtree that requires it. Place the provider as low in the widget tree as possible to avoid polluting the scope.
71 -
72 -### 4. Consume the State in the View
73 -Access the ViewModel in your `StatelessWidget` or `StatefulWidget`.
74 -* Use `Consumer<MyViewModel>` to rebuild specific parts of the UI when `notifyListeners()` is called.
75 -* Use `context.read<MyViewModel>()` (or `Provider.of<MyViewModel>(context, listen: false)`) inside event handlers (like `onPressed`) to call ViewModel methods without triggering a rebuild of the calling widget.
76 -
77 -### 5. Validate the implementation
78 -Run the following feedback loop to ensure data flows correctly:
79 -1. Trigger a user action in the View.
80 -2. Verify the ViewModel receives the event and calls the Repository.
81 -3. Verify the Repository updates the SSOT and returns data.
82 -4. Verify the ViewModel updates its state and calls `notifyListeners()`.
83 -5. Verify the View rebuilds with the new state.
84 -*Run validator -> review errors -> fix missing `notifyListeners()` calls or incorrect `Provider` scopes.*
85 -
86 -## Examples
87 -
88 -### Ephemeral State Implementation (`setState`)
89 -
90 -Use this pattern strictly for local, UI-only state.
91 -
92 -```dart
93 -class EphemeralCounter extends StatefulWidget {
94 - const EphemeralCounter({super.key});
95 -
96 - @override
97 - State<EphemeralCounter> createState() => _EphemeralCounterState();
98 -}
99 -
100 -class _EphemeralCounterState extends State<EphemeralCounter> {
101 - int _counter = 0; // Local state
102 -
103 - void _increment() {
104 - setState(() {
105 - _counter++; // Mutate state and schedule rebuild
106 - });
107 - }
108 -
109 - @override
110 - Widget build(BuildContext context) {
111 - return ElevatedButton(
112 - onPressed: _increment,
113 - child: Text('Count: $_counter'),
114 - );
115 - }
116 -}
117 -```
118 -
119 -### App State Implementation (MVVM + Provider)
120 -
121 -Use this pattern for shared data and complex business logic.
122 -
123 -```dart
124 -// 1. Model (Repository)
125 -class CartRepository {
126 - Future<void> saveItemToCart(String item) async {
127 - // Simulate network/database call
128 - await Future.delayed(const Duration(milliseconds: 500));
129 - }
130 -}
131 -
132 -// 2. ViewModel (ChangeNotifier)
133 -class CartViewModel extends ChangeNotifier {
134 - final CartRepository repository;
135 -
136 - CartViewModel({required this.repository});
137 -
138 - final List<String> _items = [];
139 - bool isLoading = false;
140 - String? errorMessage;
141 -
142 - List<String> get items => List.unmodifiable(_items);
143 -
144 - Future<void> addItem(String item) async {
145 - isLoading = true;
146 - errorMessage = null;
147 - notifyListeners(); // Trigger loading UI
148 -
149 - try {
150 - await repository.saveItemToCart(item);
151 - _items.add(item);
152 - } catch (e) {
153 - errorMessage = 'Failed to add item';
154 - } finally {
155 - isLoading = false;
156 - notifyListeners(); // Trigger success/error UI
157 - }
158 - }
159 -}
160 -
161 -// 3. Injection & 4. View (UI)
162 -class CartApp extends StatelessWidget {
163 - const CartApp({super.key});
164 -
165 - @override
166 - Widget build(BuildContext context) {
167 - // Inject ViewModel
168 - return ChangeNotifierProvider(
169 - create: (_) => CartViewModel(repository: CartRepository()),
170 - child: const CartScreen(),
171 - );
172 - }
173 -}
174 -
175 -class CartScreen extends StatelessWidget {
176 - const CartScreen({super.key});
177 -
178 - @override
179 - Widget build(BuildContext context) {
180 - return Scaffold(
181 - body: Consumer<CartViewModel>(
182 - builder: (context, viewModel, child) {
183 - if (viewModel.isLoading) {
184 - return const CircularProgressIndicator();
185 - }
186 - if (viewModel.errorMessage != null) {
187 - return Text(viewModel.errorMessage!);
188 - }
189 - return ListView.builder(
190 - itemCount: viewModel.items.length,
191 - itemBuilder: (_, index) => Text(viewModel.items[index]),
192 - );
193 - },
194 - ),
195 - floatingActionButton: FloatingActionButton(
196 - // Use read() to access methods without listening for rebuilds
197 - onPressed: () => context.read<CartViewModel>().addItem('New Item'),
198 - child: const Icon(Icons.add),
199 - ),
200 - );
201 - }
202 -}
203 -```
.agent/skills/flutter-reducing-app-size/SKILL.md deleted
-100
@@ -1,100 +0,0 @@
1 ----
2 -name: "flutter-reducing-app-size"
3 -description: "Measures and optimizes the size of Flutter application bundles for deployment. Use when minimizing download size or meeting app store package constraints."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:22:44 GMT"
7 -
8 ----
9 -# Reducing Flutter App Size
10 -
11 -## Contents
12 -- [Core Concepts](#core-concepts)
13 -- [Workflow: Generating Size Analysis Files](#workflow-generating-size-analysis-files)
14 -- [Workflow: Analyzing Size Data in DevTools](#workflow-analyzing-size-data-in-devtools)
15 -- [Workflow: Estimating iOS Download Size](#workflow-estimating-ios-download-size)
16 -- [Workflow: Implementing Size Reduction Strategies](#workflow-implementing-size-reduction-strategies)
17 -- [Examples](#examples)
18 -
19 -## Core Concepts
20 -- **Debug vs. Release:** Never use debug builds to measure app size. Debug builds include VM overhead and lack Ahead-Of-Time (AOT) compilation and tree-shaking.
21 -- **Upload vs. Download Size:** The size of an upload package (APK, AAB, IPA) does not represent the end-user download size. App stores filter redundant native library architectures and asset densities based on the target device.
22 -- **AOT Tree-Shaking:** The Dart AOT compiler automatically removes unused or unreachable code in profile and release modes.
23 -- **Size Analysis JSON:** The `--analyze-size` flag generates a `*-code-size-analysis_*.json` file detailing the byte size of packages, libraries, classes, and functions.
24 -
25 -## Workflow: Generating Size Analysis Files
26 -
27 -Use this workflow to generate the raw data required for size analysis.
28 -
29 -**Task Progress:**
30 -- [ ] Determine the target platform (apk, appbundle, ios, linux, macos, windows).
31 -- [ ] Run the Flutter build command with the `--analyze-size` flag.
32 -- [ ] Locate the generated `*-code-size-analysis_*.json` file in the `build/` directory.
33 -
34 -**Conditional Logic:**
35 -- **If targeting Android:** Run `flutter build apk --analyze-size` or `flutter build appbundle --analyze-size`.
36 -- **If targeting iOS:** Run `flutter build ios --analyze-size`. *Note: This creates a `.app` file useful for relative content sizing, but not for estimating final App Store download size. Use the [Estimating iOS Download Size](#workflow-estimating-ios-download-size) workflow for accurate iOS metrics.*
37 -- **If targeting Desktop:** Run `flutter build [windows|macos|linux] --analyze-size`.
38 -
39 -## Workflow: Analyzing Size Data in DevTools
40 -
41 -Use this workflow to visualize and drill down into the Size Analysis JSON.
42 -
43 -**Task Progress:**
44 -- [ ] Launch DevTools by running `dart devtools` in the terminal.
45 -- [ ] Select "Open app size tool" from the DevTools landing page.
46 -- [ ] Upload the generated `*-code-size-analysis_*.json` file.
47 -- [ ] Inspect the treemap or tree view to identify large packages, libraries, or assets.
48 -- [ ] **Feedback Loop:**
49 - 1. Identify the largest contributors to app size.
50 - 2. Determine if the dependency or asset is strictly necessary.
51 - 3. Remove, replace, or optimize the identified component.
52 - 4. Regenerate the Size Analysis JSON and compare the new build against the old build using the DevTools "Diff" tab.
53 -
54 -## Workflow: Estimating iOS Download Size
55 -
56 -Use this workflow to get an accurate projection of iOS download and installation sizes across different devices.
57 -
58 -**Task Progress:**
59 -- [ ] Configure the app version and build number in `pubspec.yaml`.
60 -- [ ] Generate an Xcode archive by running `flutter build ipa --export-method development`.
61 -- [ ] Open the generated archive (`build/ios/archive/*.xcarchive`) in Xcode.
62 -- [ ] Click **Distribute App** and select **Development**.
63 -- [ ] In the App Thinning configuration, select **All compatible device variants**.
64 -- [ ] Check the option to **Strip Swift symbols**.
65 -- [ ] Sign and export the IPA.
66 -- [ ] Open the exported directory and review the `App Thinning Size Report.txt` file to evaluate projected sizes per device.
67 -
68 -## Workflow: Implementing Size Reduction Strategies
69 -
70 -Apply these strategies to actively reduce the compiled footprint of the application.
71 -
72 -**Task Progress:**
73 -- [ ] **Split Debug Info:** Strip debug symbols from the compiled binary and store them in separate files.
74 -- [ ] **Remove Unused Resources:** Audit the `pubspec.yaml` and `assets/` directory. Delete any images, fonts, or files not actively referenced in the codebase.
75 -- [ ] **Minimize Library Resources:** Review third-party packages. If a package imports massive resource files (e.g., large icon sets or localization files) but only a fraction is used, consider alternative packages or custom implementations.
76 -- [ ] **Compress Media:** Compress all PNG and JPEG assets using tools like `pngquant`, `imageoptim`, or WebP conversion before bundling them into the app.
77 -
78 -## Examples
79 -
80 -### Generating Size Analysis (Android)
81 -```bash
82 -# Generate the size analysis JSON for an Android App Bundle
83 -flutter build appbundle --analyze-size --target-platform=android-arm64
84 -```
85 -
86 -### Splitting Debug Info (Release Build)
87 -```bash
88 -# Build an APK while stripping debug info to reduce binary size
89 -flutter build apk --obfuscate --split-debug-info=build/app/outputs/symbols
90 -```
91 -
92 -### Reading the iOS App Thinning Size Report
93 -When reviewing `App Thinning Size Report.txt`, look for the specific target device to understand the true impact on the user:
94 -```text
95 -Variant: Runner-7433FC8E-1DF4-4299-A7E8-E00768671BEB.ipa
96 -Supported variant descriptors: [device: iPhone12,1, os-version: 13.0]
97 -App + On Demand Resources size: 5.4 MB compressed, 13.7 MB uncompressed
98 -App size: 5.4 MB compressed, 13.7 MB uncompressed
99 -```
100 -*Interpretation: The end-user download size (compressed) is 5.4 MB, and the on-device footprint (uncompressed) is 13.7 MB.*
.agent/skills/flutter-setting-up-on-linux/SKILL.md deleted
-138
@@ -1,138 +0,0 @@
1 ----
2 -name: "flutter-setting-up-on-linux"
3 -description: "Sets up a Linux environment for Flutter development. Use when configuring a Linux machine to run, build, or deploy Flutter applications."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:12:22 GMT"
7 -
8 ----
9 -# Setting Up a Linux Environment for Flutter Development
10 -
11 -## Contents
12 -- [System Dependencies](#system-dependencies)
13 -- [Workflow: Configuring the Linux Toolchain](#workflow-configuring-the-linux-toolchain)
14 -- [Workflow: Validating the Environment](#workflow-validating-the-environment)
15 -- [Workflow: Preparing for Distribution (Snapcraft)](#workflow-preparing-for-distribution-snapcraft)
16 -- [Examples](#examples)
17 -
18 -## System Dependencies
19 -To build and run Flutter applications on a Linux desktop, install the required C/C++ toolchain and system libraries. Flutter relies on `dart:ffi` to interface with Linux system calls and the GTK framework for UI rendering.
20 -
21 -Required packages for Debian/Ubuntu-based distributions:
22 -* **Core Utilities:** `curl`, `git`, `unzip`, `xz-utils`, `zip`
23 -* **Build Tools:** `clang`, `cmake`, `ninja-build`, `pkg-config`
24 -* **Libraries:** `libglu1-mesa`, `libgtk-3-dev`, `libstdc++-12-dev`
25 -
26 -## Workflow: Configuring the Linux Toolchain
27 -
28 -Follow this sequential workflow to prepare the Linux host for Flutter desktop development.
29 -
30 -**Task Progress:**
31 -- [ ] 1. Update package lists and upgrade existing packages.
32 -- [ ] 2. Install core utilities and build dependencies.
33 -- [ ] 3. Configure IDE/Editor with Flutter support.
34 -- [ ] 4. (Conditional) Enable Linux support on ChromeOS.
35 -
36 -**1. Update and Install Dependencies**
37 -Execute the following command to install all required packages on Debian/Ubuntu systems:
38 -```bash
39 -sudo apt-get update -y && sudo apt-get upgrade -y
40 -sudo apt-get install -y curl git unzip xz-utils zip libglu1-mesa clang cmake ninja-build pkg-config libgtk-3-dev libstdc++-12-dev
41 -```
42 -
43 -**2. Conditional: ChromeOS Setup**
44 -* **If developing on a Chromebook:** Turn on Linux support in the ChromeOS settings. Ensure the Linux container is fully updated using the `apt-get` commands above before proceeding.
45 -
46 -**3. IDE Configuration**
47 -Install Visual Studio Code, Android Studio, or an IntelliJ-based IDE. Install the official Dart and Flutter extensions/plugins to enable language server features and debugging capabilities.
48 -
49 -## Workflow: Validating the Environment
50 -
51 -Run this feedback loop to ensure the toolchain is correctly recognized by the Flutter SDK.
52 -
53 -**Task Progress:**
54 -- [ ] 1. Run environment validator.
55 -- [ ] 2. Verify connected Linux devices.
56 -- [ ] 3. Resolve toolchain errors.
57 -
58 -**1. Run Validator**
59 -Execute the Flutter diagnostic tool with verbose output:
60 -```bash
61 -flutter doctor -v
62 -```
63 -
64 -**2. Review and Fix (Feedback Loop)**
65 -* **If errors exist under the "Linux toolchain" section:** Review the missing dependencies, install the flagged packages, and re-run `flutter doctor -v`. Repeat until the Linux toolchain section passes.
66 -
67 -**3. Verify Device Availability**
68 -Ensure the Linux desktop is recognized as a valid deployment target:
69 -```bash
70 -flutter devices
71 -```
72 -*Expected Output:* At least one entry must display with the platform marked as **linux**.
73 -
74 -## Workflow: Preparing for Distribution (Snapcraft)
75 -
76 -When preparing a release build for the Snap Store, configure the Snapcraft build environment.
77 -
78 -**Task Progress:**
79 -- [ ] 1. Install Snapcraft and LXD.
80 -- [ ] 2. Configure LXD.
81 -- [ ] 3. Build the Snap package.
82 -
83 -**1. Install Build Tools**
84 -```bash
85 -sudo snap install snapcraft --classic
86 -sudo snap install lxd
87 -```
88 -
89 -**2. Configure LXD**
90 -Initialize LXD and add the current user to the `lxd` group:
91 -```bash
92 -sudo lxd init
93 -sudo usermod -a -G lxd <your_username>
94 -```
95 -*Note: Log out and log back in to apply the group changes.*
96 -
97 -**3. Build the Snap**
98 -Navigate to the project root containing the `snap/snapcraft.yaml` file and execute the build:
99 -```bash
100 -snapcraft --use-lxd
101 -```
102 -
103 -## Examples
104 -
105 -### Baseline `snapcraft.yaml` Configuration
106 -Use this template for the `<project_root>/snap/snapcraft.yaml` file when packaging a Flutter Linux app for the Snap Store.
107 -
108 -```yaml
109 -name: super-cool-app
110 -version: 0.1.0
111 -summary: Super Cool App
112 -description: Super Cool App that does everything!
113 -
114 -confinement: strict
115 -base: core22
116 -grade: stable
117 -
118 -slots:
119 - dbus-super-cool-app:
120 - interface: dbus
121 - bus: session
122 - name: org.bar.super_cool_app
123 -
124 -apps:
125 - super-cool-app:
126 - command: super_cool_app
127 - extensions: [gnome]
128 - plugs:
129 - - network
130 - slots:
131 - - dbus-super-cool-app
132 -
133 -parts:
134 - super-cool-app:
135 - source: .
136 - plugin: flutter
137 - flutter-target: lib/main.dart
138 -```
.agent/skills/flutter-setting-up-on-macos/SKILL.md deleted
-75
@@ -1,75 +0,0 @@
1 ----
2 -name: "flutter-setting-up-on-macos"
3 -description: "Sets up a macOS environment for Flutter development. Use when configuring a macOS machine to run, build, or deploy Flutter applications for iOS or macOS."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:12:50 GMT"
7 -
8 ----
9 -# Setting Up a macOS Environment for Flutter Development
10 -
11 -## Contents
12 -- [Prerequisites](#prerequisites)
13 -- [Tooling Configuration](#tooling-configuration)
14 -- [Workflow: Configuring macOS Tooling](#workflow-configuring-macos-tooling)
15 -- [Workflow: Validating the Environment](#workflow-validating-the-environment)
16 -- [Troubleshooting](#troubleshooting)
17 -
18 -## Prerequisites
19 -Ensure the following baseline requirements are met before configuring the macOS-specific toolchain:
20 -- macOS operating system.
21 -- Flutter SDK installed and added to the system `PATH`.
22 -- Active internet connection for downloading toolchains and dependencies.
23 -
24 -## Tooling Configuration
25 -macOS desktop development requires specific Apple toolchains to compile and debug native Swift and Objective-C code.
26 -- **Xcode**: Required for compiling macOS desktop applications.
27 -- **CocoaPods**: Required for managing native dependencies used by Flutter plugins.
28 -
29 -## Workflow: Configuring macOS Tooling
30 -
31 -Copy and follow this checklist to configure the macOS build environment.
32 -
33 -- [ ] **Install Xcode**: Install the latest version of Xcode from the Mac App Store or the Apple Developer portal.
34 -- [ ] **Configure Command-Line Tools**: Link the Xcode command-line tools to the installed Xcode version. Run the following command in the terminal:
35 - ```bash
36 - sudo sh -c 'xcode-select -s /Applications/Xcode.app/Contents/Developer && xcodebuild -runFirstLaunch'
37 - ```
38 - *Conditional*: If Xcode is installed in a custom directory, replace `/Applications/Xcode.app` with the correct absolute path.
39 -- [ ] **Accept Xcode Licenses**: Accept the required developer licenses by running:
40 - ```bash
41 - sudo xcodebuild -license
42 - ```
43 - Read and agree to the prompts.
44 -- [ ] **Install CocoaPods**: Install CocoaPods to handle native macOS plugin dependencies.
45 - ```bash
46 - sudo gem install cocoapods
47 - ```
48 - *Conditional*: If CocoaPods is already installed, ensure it is updated to the latest version (`sudo gem update cocoapods`).
49 -
50 -## Workflow: Validating the Environment
51 -
52 -Execute this feedback loop to ensure the environment is correctly configured for macOS desktop development.
53 -
54 -- [ ] **Run Validator**: Execute the Flutter diagnostic tool with verbose output:
55 - ```bash
56 - flutter doctor -v
57 - ```
58 -- [ ] **Review Errors**: Check the `Xcode` section in the output.
59 -- [ ] **Fix & Retry**: If errors or missing components are reported under the Xcode section, resolve them according to the output instructions, then re-run `flutter doctor -v` until the Xcode section passes.
60 -- [ ] **Verify Device Availability**: Confirm that Flutter recognizes the macOS desktop as a valid deployment target:
61 - ```bash
62 - flutter devices
63 - ```
64 - *Success Criteria*: The output must contain at least one entry with `macos` listed as the platform.
65 -
66 -## Troubleshooting
67 -
68 -If the validation workflow fails, apply the following resolutions:
69 -
70 -- **Missing Command-Line Tools**: If `flutter doctor` reports missing tools, ensure the `xcode-select` command was run with `sudo` and points to the correct `.app` directory.
71 -- **CocoaPods Not Found**: If CocoaPods is installed but not detected, verify that your Ruby `gem` binary path is included in your shell's `PATH` environment variable.
72 -- **Device Not Listed**: If `flutter devices` does not list `macos`, ensure desktop support is enabled in your Flutter configuration:
73 - ```bash
74 - flutter config --enable-macos-desktop
75 - ```
.agent/skills/flutter-setting-up-on-windows/SKILL.md deleted
-103
@@ -1,103 +0,0 @@
1 ----
2 -name: "flutter-setting-up-on-windows"
3 -description: "Sets up a Windows environment for Flutter development. Use when configuring a Windows machine to run, build, or deploy Flutter applications for Windows desktop or Android."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:13:13 GMT"
7 -
8 ----
9 -# Setting Up Flutter for Windows Development
10 -
11 -## Contents
12 -- [Core Requirements](#core-requirements)
13 -- [Workflow: Installing and Configuring the SDK](#workflow-installing-and-configuring-the-sdk)
14 -- [Workflow: Configuring Tooling and IDEs](#workflow-configuring-tooling-and-ides)
15 -- [Workflow: Configuring Target Platforms](#workflow-configuring-target-platforms)
16 -- [Workflow: Building and Packaging for Windows](#workflow-building-and-packaging-for-windows)
17 -- [Workflow: Generating and Installing Certificates](#workflow-generating-and-installing-certificates)
18 -- [Examples](#examples)
19 -
20 -## Core Requirements
21 -Configure the Windows environment to support both Flutter framework execution and native C/C++ compilation. Differentiate strictly between **Visual Studio** (required for Windows desktop C++ compilation) and **VS Code** (the recommended Dart/Flutter code editor).
22 -
23 -## Workflow: Installing and Configuring the SDK
24 -
25 -Follow this sequential workflow to initialize the Flutter SDK on a Windows machine.
26 -
27 -- [ ] Download the latest stable Flutter SDK for Windows.
28 -- [ ] Extract the SDK to a directory with standard user privileges (e.g., `C:\src\flutter`). Do not install in protected directories like `C:\Program Files\`.
29 -- [ ] Copy the absolute path to the Flutter SDK's `bin` directory.
30 -- [ ] Open Windows Environment Variables settings and append the `bin` directory path to the system or user `PATH` variable.
31 -- [ ] Open a new terminal session to apply the `PATH` changes.
32 -- [ ] **Feedback Loop:** Run validator -> review errors -> fix.
33 - 1. Execute `flutter doctor -v`.
34 - 2. Review the output for missing dependencies or path issues.
35 - 3. Resolve any flagged errors before proceeding to tooling setup.
36 -
37 -## Workflow: Configuring Tooling and IDEs
38 -
39 -- [ ] Install **Visual Studio** (not VS Code).
40 -- [ ] Select and install the **Desktop development with C++** workload during the Visual Studio installation process. This is mandatory for compiling Windows desktop applications.
41 -- [ ] Install your preferred code editor (VS Code, Android Studio, or IntelliJ).
42 -- [ ] Install the official Flutter and Dart extensions/plugins within your chosen editor.
43 -
44 -## Workflow: Configuring Target Platforms
45 -
46 -Apply conditional logic based on the specific platform you are targeting for development.
47 -
48 -**If targeting Windows Desktop:**
49 -- [ ] Ensure the Visual Studio C++ workload is fully updated.
50 -- [ ] Restart your IDE so it detects the Windows desktop device.
51 -- [ ] To disable platforms you do not intend to compile for, execute `flutter config --no-enable-<platform>` (e.g., `flutter config --no-enable-windows-desktop`).
52 -
53 -**If targeting Android on Windows:**
54 -- [ ] **For physical devices:** Enable Developer Options and USB debugging on the device. Install the specific OEM USB drivers for Windows.
55 -- [ ] **For emulators:** Open the Android Virtual Device (AVD) manager. Under "Emulated Performance" -> "Graphics acceleration", select an option specifying "Hardware" to enable hardware acceleration.
56 -- [ ] Verify the device connection by running `flutter devices`.
57 -
58 -## Workflow: Building and Packaging for Windows
59 -
60 -To distribute a Windows desktop application, assemble the compiled executable and its required dependencies into a single distributable archive.
61 -
62 -- [ ] Execute `flutter build windows` to compile the release build.
63 -- [ ] Navigate to `build\windows\runner\Release\`.
64 -- [ ] Create a new staging directory for the distribution zip.
65 -- [ ] Copy the following assets from the `Release` directory into the staging directory:
66 - - The application executable (`.exe`).
67 - - All generated `.dll` files.
68 - - The entire `data` directory.
69 -- [ ] Copy the required Visual C++ redistributables into the staging directory alongside the executable:
70 - - `msvcp140.dll`
71 - - `vcruntime140.dll`
72 - - `vcruntime140_1.dll`
73 -- [ ] Compress the staging directory into a `.zip` file for distribution.
74 -
75 -## Workflow: Generating and Installing Certificates
76 -
77 -If you require a self-signed certificate for MSIX packaging or local testing, use OpenSSL.
78 -
79 -- [ ] Install OpenSSL and add its `bin` directory to your `PATH` environment variable.
80 -- [ ] Generate a private key: `openssl genrsa -out mykeyname.key 2048`
81 -- [ ] Generate a Certificate Signing Request (CSR): `openssl req -new -key mykeyname.key -out mycsrname.csr`
82 -- [ ] Generate the signed certificate (CRT): `openssl x509 -in mycsrname.csr -out mycrtname.crt -req -signkey mykeyname.key -days 10000`
83 -- [ ] Generate the `.pfx` file: `openssl pkcs12 -export -out CERTIFICATE.pfx -inkey mykeyname.key -in mycrtname.crt`
84 -- [ ] Install the `.pfx` certificate on the local Windows machine. Place it in the Certificate Store under **Trusted Root Certification Authorities** prior to installing the application.
85 -
86 -## Examples
87 -
88 -### Windows Distribution Directory Structure
89 -When assembling your Windows build for distribution, ensure the directory structure strictly matches the following layout before zipping:
90 -
91 -```text
92 -Release_Archive/
93 -│ my_flutter_app.exe
94 -│ flutter_windows.dll
95 -│ msvcp140.dll
96 -│ vcruntime140.dll
97 -│ vcruntime140_1.dll
98 -│
99 -└───data/
100 - │ app.so
101 - │ icudtl.dat
102 - │ ...
103 -```
.agent/skills/flutter-testing-apps/SKILL.md deleted
-182
@@ -1,182 +0,0 @@
1 ----
2 -name: "flutter-testing-apps"
3 -description: "Implements unit, widget, and integration tests for a Flutter app. Use when ensuring code quality and preventing regressions through automated testing."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:22:10 GMT"
7 -
8 ----
9 -# Testing Flutter Applications
10 -
11 -## Contents
12 -- [Core Testing Strategies](#core-testing-strategies)
13 -- [Architectural Testing Guidelines](#architectural-testing-guidelines)
14 -- [Plugin Testing Guidelines](#plugin-testing-guidelines)
15 -- [Workflows](#workflows)
16 -- [Examples](#examples)
17 -
18 -## Core Testing Strategies
19 -
20 -Balance your testing suite across three main categories to optimize for confidence, maintenance cost, dependencies, and execution speed.
21 -
22 -### Unit Tests
23 -Use unit tests to verify the correctness of a single function, method, or class under various conditions.
24 -- Mock all external dependencies.
25 -- Do not involve disk I/O, screen rendering, or user actions from outside the test process.
26 -- Execute using the `test` or `flutter_test` package.
27 -
28 -### Widget Tests
29 -Use widget tests (component tests) to ensure a single widget's UI looks and interacts as expected.
30 -- Provide the appropriate widget lifecycle context using `WidgetTester`.
31 -- Use `Finder` classes to locate widgets and `Matcher` constants to verify their existence and state.
32 -- Test views and UI interactions without spinning up the full application.
33 -
34 -### Integration Tests
35 -Use integration tests (end-to-end or GUI testing) to validate how individual pieces of an app work together and to capture performance metrics on real devices.
36 -- Add the `integration_test` package as a dependency.
37 -- Run on physical devices, OS emulators, or Firebase Test Lab.
38 -- Prioritize integration tests for routing, dependency injection, and critical user flows.
39 -
40 -## Architectural Testing Guidelines
41 -
42 -Design your application for observability and testability. Ensure all components can be tested both in isolation and together.
43 -
44 -- **ViewModels**: Write unit tests for every ViewModel class. Test the UI logic without relying on Flutter libraries or testing frameworks.
45 -- **Repositories & Services**: Write unit tests for every service and repository. Mock the underlying data sources (e.g., HTTP clients, local databases).
46 -- **Views**: Write widget tests for all views. Pass faked or mocked ViewModels and Repositories into the widget tree to isolate the UI.
47 -- **Fakes over Mocks**: Prefer creating `Fake` implementations of your repositories (e.g., `FakeUserRepository`) over using mocking libraries when testing ViewModels and Views to ensure well-defined inputs and outputs.
48 -
49 -## Plugin Testing Guidelines
50 -
51 -When testing plugins, combine Dart tests with native platform tests to ensure full coverage across the method channel.
52 -
53 -- **Dart Tests**: Use Dart unit and widget tests for the Dart-facing API. Mock the platform channel to validate Dart logic.
54 -- **Native Unit Tests**: Implement native unit tests for isolated platform logic.
55 - - Android: Configure JUnit tests in `android/src/test/`.
56 - - iOS/macOS: Configure XCTest tests in `example/ios/RunnerTests/` and `example/macos/RunnerTests/`.
57 - - Linux/Windows: Configure GoogleTest tests in `linux/test/` and `windows/test/`.
58 -- **Native UI Tests**: Use Espresso (Android) or XCUITest (iOS) if the plugin requires native UI interactions.
59 -- **Integration Tests**: Write at least one integration test for each platform channel call to verify Dart-to-Native communication.
60 -- **End-to-End Fallback**: If integration tests cannot cover a flow (e.g., mocking device state), synthesize calls to the method channel entry point using native unit tests, and test the Dart public API using Dart unit tests.
61 -
62 -## Workflows
63 -
64 -### Workflow: Implementing a Component Test Suite
65 -Copy and track this checklist when implementing tests for a new architectural feature.
66 -
67 -- [ ] **Task Progress**
68 - - [ ] Create `Fake` implementations for any new Repositories or Services.
69 - - [ ] Write Unit Tests for the Repository (mocking the API/Database).
70 - - [ ] Write Unit Tests for the ViewModel (injecting the Fake Repositories).
71 - - [ ] Write Widget Tests for the View (injecting the ViewModel and Fake Repositories).
72 - - [ ] Write an Integration Test for the critical path involving this feature.
73 - - [ ] Run validator -> review coverage -> fix missing edge cases.
74 -
75 -### Workflow: Running Integration Tests
76 -Follow conditional logic based on the target platform when executing integration tests.
77 -
78 -1. **If testing on Mobile (Local)**:
79 - - Connect the Android/iOS device or emulator.
80 - - Run: `flutter test integration_test/app_test.dart`
81 -2. **If testing on Web**:
82 - - Install and launch ChromeDriver: `chromedriver --port=4444`
83 - - Run: `flutter drive --driver=test_driver/integration_test.dart --target=integration_test/app_test.dart -d chrome`
84 -3. **If testing on Linux (CI System)**:
85 - - Invoke an X server using `xvfb-run` to provide a display environment.
86 - - Run: `xvfb-run flutter test integration_test/app_test.dart -d linux`
87 -4. **If testing via Firebase Test Lab**:
88 - - Build the Android test APKs: `flutter build apk --debug` and `./gradlew app:assembleAndroidTest`
89 - - Upload the App APK and Test APK to the Firebase Console.
90 -
91 -## Examples
92 -
93 -### Example: ViewModel Unit Test
94 -Demonstrates testing a ViewModel using a Fake Repository.
95 -
96 -```dart
97 -import 'package:flutter_test/flutter_test.dart';
98 -
99 -void main() {
100 - group('HomeViewModel tests', () {
101 - test('Load bookings successfully', () {
102 - // Inject fake dependencies
103 - final viewModel = HomeViewModel(
104 - bookingRepository: FakeBookingRepository()..createBooking(kBooking),
105 - userRepository: FakeUserRepository(),
106 - );
107 -
108 - // Verify state
109 - expect(viewModel.bookings.isNotEmpty, true);
110 - });
111 - });
112 -}
113 -```
114 -
115 -### Example: View Widget Test
116 -Demonstrates testing a View by pumping a localized widget tree with fake dependencies.
117 -
118 -```dart
119 -import 'package:flutter/material.dart';
120 -import 'package:flutter_test/flutter_test.dart';
121 -
122 -void main() {
123 - group('HomeScreen tests', () {
124 - late HomeViewModel viewModel;
125 - late FakeBookingRepository bookingRepository;
126 -
127 - setUp(() {
128 - bookingRepository = FakeBookingRepository()..createBooking(kBooking);
129 - viewModel = HomeViewModel(
130 - bookingRepository: bookingRepository,
131 - userRepository: FakeUserRepository(),
132 - );
133 - });
134 -
135 - testWidgets('renders bookings list', (WidgetTester tester) async {
136 - await tester.pumpWidget(
137 - MaterialApp(
138 - home: HomeScreen(viewModel: viewModel),
139 - ),
140 - );
141 -
142 - // Verify UI state
143 - expect(find.byType(ListView), findsOneWidget);
144 - expect(find.text('Booking 1'), findsOneWidget);
145 - });
146 - });
147 -}
148 -```
149 -
150 -### Example: Integration Test
151 -Demonstrates a full end-to-end test using the `integration_test` package.
152 -
153 -```dart
154 -import 'package:flutter/material.dart';
155 -import 'package:flutter_test/flutter_test.dart';
156 -import 'package:integration_test/integration_test.dart';
157 -import 'package:my_app/main.dart';
158 -
159 -void main() {
160 - IntegrationTestWidgetsFlutterBinding.ensureInitialized();
161 -
162 - group('end-to-end test', () {
163 - testWidgets('tap on the floating action button, verify counter', (tester) async {
164 - // Load app widget
165 - await tester.pumpWidget(const MyApp());
166 -
167 - // Verify initial state
168 - expect(find.text('0'), findsOneWidget);
169 -
170 - // Find and tap the button
171 - final fab = find.byKey(const ValueKey('increment'));
172 - await tester.tap(fab);
173 -
174 - // Trigger a frame to allow animations/state to settle
175 - await tester.pumpAndSettle();
176 -
177 - // Verify updated state
178 - expect(find.text('1'), findsOneWidget);
179 - });
180 - });
181 -}
182 -```
.agent/skills/flutter-theming-apps/SKILL.md deleted
-174
@@ -1,174 +0,0 @@
1 ----
2 -name: "flutter-theming-apps"
3 -description: "Customizes the visual appearance of a Flutter app using the theming system. Use when defining global styles, colors, or typography for an application."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:14:47 GMT"
7 ----
8 -
9 -# Implementing Flutter Theming and Adaptive Design
10 -
11 -## Contents
12 -
13 -- [Core Theming Concepts](#core-theming-concepts)
14 -- [Material 3 Guidelines](#material-3-guidelines)
15 -- [Component Theme Normalization](#component-theme-normalization)
16 -- [Button Styling](#button-styling)
17 -- [Platform Idioms & Adaptive Design](#platform-idioms--adaptive-design)
18 -- [Workflows](#workflows)
19 -- [Examples](#examples)
20 -
21 -## Core Theming Concepts
22 -
23 -Flutter applies styling in a strict hierarchy: styles applied to the specific widget -> themes that override the immediate parent theme -> the main app theme.
24 -
25 -- Define app-wide themes using the `theme` property of `MaterialApp` with a `ThemeData` instance.
26 -- Override themes for specific widget subtrees by wrapping them in a `Theme` widget and using `Theme.of(context).copyWith(...)`.
27 -- **Do not** use deprecated `ThemeData` properties:
28 - - Replace `accentColor` with `colorScheme.secondary`.
29 - - Replace `accentTextTheme` with `textTheme` (using `colorScheme.onSecondary` for contrast).
30 - - Replace `AppBarTheme.color` with `AppBarTheme.backgroundColor`.
31 -
32 -## Material 3 Guidelines
33 -
34 -Material 3 is the default theme as of Flutter 3.16.
35 -
36 -- **Colors:** Generate color schemes using `ColorScheme.fromSeed(seedColor: Colors.blue)`. This ensures accessible contrast ratios.
37 -- **Elevation:** Material 3 uses `ColorScheme.surfaceTint` to indicate elevation instead of just drop shadows. To revert to M2 shadow behavior, set `surfaceTint: Colors.transparent` and define a `shadowColor`.
38 -- **Typography:** Material 3 updates font sizes, weights, and line heights. If text wrapping breaks legacy layouts, adjust `letterSpacing` on the specific `TextStyle`.
39 -- **Modern Components:**
40 - - Replace `BottomNavigationBar` with `NavigationBar`.
41 - - Replace `Drawer` with `NavigationDrawer`.
42 - - Replace `ToggleButtons` with `SegmentedButton`.
43 - - Use `FilledButton` for a high-emphasis button without the elevation of `ElevatedButton`.
44 -
45 -## Component Theme Normalization
46 -
47 -Component themes in `ThemeData` have been normalized to use `*ThemeData` classes rather than `*Theme` widgets.
48 -
49 -When defining `ThemeData`, strictly use the `*ThemeData` suffix for the following properties:
50 -
51 -- `cardTheme`: Use `CardThemeData` (Not `CardTheme`)
52 -- `dialogTheme`: Use `DialogThemeData` (Not `DialogTheme`)
53 -- `tabBarTheme`: Use `TabBarThemeData` (Not `TabBarTheme`)
54 -- `appBarTheme`: Use `AppBarThemeData` (Not `AppBarTheme`)
55 -- `bottomAppBarTheme`: Use `BottomAppBarThemeData` (Not `BottomAppBarTheme`)
56 -- `inputDecorationTheme`: Use `InputDecorationThemeData` (Not `InputDecorationTheme`)
57 -
58 -## Button Styling
59 -
60 -Legacy button classes (`FlatButton`, `RaisedButton`, `OutlineButton`) are obsolete.
61 -
62 -- Use `TextButton`, `ElevatedButton`, and `OutlinedButton`.
63 -- Configure button appearance using a `ButtonStyle` object.
64 -- For simple overrides based on the theme's color scheme, use the static utility method: `TextButton.styleFrom(foregroundColor: Colors.blue)`.
65 -- For state-dependent styling (hovered, focused, pressed, disabled), use `MaterialStateProperty.resolveWith`.
66 -
67 -## Platform Idioms & Adaptive Design
68 -
69 -When building adaptive apps, respect platform-specific norms to reduce cognitive load and build user trust.
70 -
71 -- **Scrollbars:** Desktop users expect omnipresent scrollbars; mobile users expect them only during scrolling. Toggle `thumbVisibility` on the `Scrollbar` widget based on the platform.
72 -- **Selectable Text:** Web and desktop users expect text to be selectable. Wrap text in `SelectableText` or `SelectableText.rich`.
73 -- **Horizontal Button Order:** Windows places confirmation buttons on the left; macOS/Linux place them on the right. Use a `Row` with `TextDirection.rtl` for Windows and `TextDirection.ltr` for others.
74 -- **Context Menus & Tooltips:** Desktop users expect hover and right-click interactions. Implement `Tooltip` for hover states and use context menu packages for right-click actions.
75 -
76 -## Workflows
77 -
78 -### Workflow: Migrating Legacy Themes to Material 3
79 -
80 -Use this workflow when updating an older Flutter codebase.
81 -
82 -**Task Progress:**
83 -
84 -- [ ] 1. Remove `useMaterial3: false` from `ThemeData` (it is true by default).
85 -- [ ] 2. Replace manual `ColorScheme` definitions with `ColorScheme.fromSeed()`.
86 -- [ ] 3. Run validator -> review errors -> fix: Search for and replace deprecated `accentColor`, `accentColorBrightness`, `accentIconTheme`, and `accentTextTheme`.
87 -- [ ] 4. Run validator -> review errors -> fix: Search for `AppBarTheme(color: ...)` and replace with `backgroundColor`.
88 -- [ ] 5. Update `ThemeData` component properties to use `*ThemeData` classes (e.g., `cardTheme: CardThemeData()`).
89 -- [ ] 6. Replace legacy buttons (`FlatButton` -> `TextButton`, `RaisedButton` -> `ElevatedButton`, `OutlineButton` -> `OutlinedButton`).
90 -- [ ] 7. Replace legacy navigation components (`BottomNavigationBar` -> `NavigationBar`, `Drawer` -> `NavigationDrawer`).
91 -
92 -### Workflow: Implementing Adaptive UI Components
93 -
94 -Use this workflow when building a widget intended for both mobile and desktop/web.
95 -
96 -**Task Progress:**
97 -
98 -- [ ] 1. If displaying a list/grid, wrap it in a `Scrollbar` and set `thumbVisibility: DeviceType.isDesktop`.
99 -- [ ] 2. If displaying read-only data, use `SelectableText` instead of `Text`.
100 -- [ ] 3. If implementing a dialog with action buttons, check the platform. If Windows, set `TextDirection.rtl` on the button `Row`.
101 -- [ ] 4. If implementing interactive elements, wrap them in `Tooltip` widgets to support mouse hover states.
102 -
103 -## Examples
104 -
105 -### Example: Modern Material 3 ThemeData Setup
106 -
107 -```dart
108 -MaterialApp(
109 - title: 'Adaptive App',
110 - theme: ThemeData(
111 - colorScheme: ColorScheme.fromSeed(
112 - seedColor: Colors.deepPurple,
113 - brightness: Brightness.light,
114 - ),
115 - // Use *ThemeData classes for component normalization
116 - appBarTheme: const AppBarThemeData(
117 - backgroundColor: Colors.deepPurple, // Do not use 'color'
118 - elevation: 0,
119 - ),
120 - cardTheme: const CardThemeData(
121 - elevation: 2,
122 - ),
123 - textTheme: const TextTheme(
124 - bodyMedium: TextStyle(letterSpacing: 0.2),
125 - ),
126 - ),
127 - home: const MyHomePage(),
128 -);
129 -```
130 -
131 -### Example: State-Dependent ButtonStyle
132 -
133 -```dart
134 -TextButton(
135 - style: ButtonStyle(
136 - // Default color
137 - foregroundColor: MaterialStateProperty.all<Color>(Colors.blue),
138 - // State-dependent overlay color
139 - overlayColor: MaterialStateProperty.resolveWith<Color?>(
140 - (Set<MaterialState> states) {
141 - if (states.contains(MaterialState.hovered)) {
142 - return Colors.blue.withValues(alpha:0.04);
143 - }
144 - if (states.contains(MaterialState.focused) || states.contains(MaterialState.pressed)) {
145 - return Colors.blue.withValues(alpha:0.12);
146 - }
147 - return null; // Defer to the widget's default.
148 - },
149 - ),
150 - ),
151 - onPressed: () {},
152 - child: const Text('Adaptive Button'),
153 -)
154 -```
155 -
156 -### Example: Adaptive Dialog Button Order
157 -
158 -```dart
159 -Row(
160 - // Windows expects confirmation on the left (RTL reverses the standard LTR Row)
161 - textDirection: Platform.isWindows ? TextDirection.rtl : TextDirection.ltr,
162 - mainAxisAlignment: MainAxisAlignment.end,
163 - children: [
164 - TextButton(
165 - onPressed: () => Navigator.pop(context, false),
166 - child: const Text('Cancel'),
167 - ),
168 - FilledButton(
169 - onPressed: () => Navigator.pop(context, true),
170 - child: const Text('Confirm'),
171 - ),
172 - ],
173 -)
174 -```
.agent/skills/flutter-working-with-databases/SKILL.md deleted
-200
@@ -1,200 +0,0 @@
1 ----
2 -name: "flutter-working-with-databases"
3 -description: "Manages local data persistence using SQLite or other database solutions. Use when a Flutter app needs to store, query, or synchronize large amounts of structured data on the device."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:19:15 GMT"
7 -
8 ----
9 -# Architecting the Data Layer
10 -
11 -## Contents
12 -- [Core Architecture](#core-architecture)
13 -- [Services Implementation](#services-implementation)
14 -- [Repository Implementation](#repository-implementation)
15 -- [Caching Strategies](#caching-strategies)
16 -- [Workflows](#workflows)
17 -- [Examples](#examples)
18 -
19 -## Core Architecture
20 -
21 -Construct the data layer as the Single Source of Truth (SSOT) for all application data. In an MVVM architecture, the data layer represents the Model. Never update application data outside of this layer.
22 -
23 -Separate the data layer into two distinct components: **Repositories** and **Services**.
24 -
25 -### Repositories
26 -* Act as the SSOT for a specific domain entity.
27 -* Contain business logic for data mutation, polling, caching, and offline synchronization.
28 -* Transform raw data models (API/DB models) into Domain Models (clean data classes containing only what the UI needs).
29 -* Inject Services as private members to prevent the UI layer from bypassing the repository.
30 -
31 -### Services
32 -* Act as stateless wrappers around external data sources (HTTP clients, SQLite databases, platform plugins).
33 -* Perform no business logic or data transformation beyond basic JSON serialization.
34 -* Return raw data models or `Result` wrappers to the calling repository.
35 -
36 -## Services Implementation
37 -
38 -### Database Services (SQLite)
39 -Use databases to persist and query large amounts of structured data locally.
40 -* Add `sqflite` and `path` packages to `pubspec.yaml`.
41 -* Use the `path` package to define the storage location on disk safely across platforms.
42 -* Define table schemas using constants to prevent typos.
43 -* Use `id` as the primary key with `AUTOINCREMENT` to improve query and update times.
44 -* Always use `whereArgs` in SQL queries to prevent SQL injection (e.g., `where: 'id = ?', whereArgs: [id]`).
45 -
46 -### API Services
47 -* Wrap HTTP calls (e.g., using the `http` package) in dedicated client classes.
48 -* Return asynchronous response objects (`Future` or `Stream`).
49 -* Handle raw JSON serialization at this level, returning API-specific data models.
50 -
51 -## Repository Implementation
52 -
53 -### Domain Models
54 -* Define immutable data classes (using `freezed` or `built_value`) for Domain Models.
55 -* Strip out backend-specific fields (like metadata or pagination tokens) that the UI does not need.
56 -
57 -### Offline-First Synchronization
58 -Combine local and remote data sources within the repository to provide seamless offline support.
59 -
60 -* **If reading data:** Return a `Stream` that immediately yields the cached local data from the Database Service, performs the network request via the API Service, updates the Database Service, and then yields the fresh data.
61 -* **If writing data (Online-only):** Attempt the API Service mutation first. If successful, update the Database Service.
62 -* **If writing data (Offline-first):** Update the Database Service immediately. Attempt the API Service mutation. If the network fails, flag the local database record as `synchronized: false` and queue a background synchronization task.
63 -
64 -## Caching Strategies
65 -
66 -Select the appropriate caching strategy based on the data payload:
67 -* **Small Key-Value Data:** Use `shared_preferences` for simple app configurations, theme settings, or user preferences.
68 -* **Large Datasets:** Use relational (`sqflite`, `drift`) or non-relational (`hive_ce`, `isar_community`) on-device databases.
69 -* **Images:** Use the `cached_network_image` package to automatically cache remote images to the device's file system.
70 -* **API Responses:** Implement lightweight remote caching within the API Service or Repository using in-memory maps or temporary file storage.
71 -
72 -## Workflows
73 -
74 -### Workflow: Implementing a New Data Feature
75 -Copy and track this checklist when adding a new data entity to the application.
76 -
77 -- [ ] **Task Progress**
78 - - [ ] Define the Domain Model (immutable, UI-focused).
79 - - [ ] Define the API/DB Models (raw data structures).
80 - - [ ] Create or update the Service(s) to handle raw data fetching/storage.
81 - - [ ] Create the Repository interface (abstract class).
82 - - [ ] Implement the Repository, injecting the required Service(s) as private dependencies.
83 - - [ ] Map raw Service models to the Domain Model within the Repository.
84 - - [ ] Expose Repository methods to the View Model.
85 - - [ ] Run validator -> review errors -> fix.
86 -
87 -### Workflow: Implementing SQLite Persistence
88 -Follow this sequence to add a new SQLite table and integrate it.
89 -
90 -- [ ] **Task Progress**
91 - - [ ] Add `sqflite` and `path` dependencies.
92 - - [ ] Define table name and column constants.
93 - - [ ] Update the `onCreate` or `onUpgrade` method in the Database Service to execute the `CREATE TABLE` statement.
94 - - [ ] Implement `insert`, `query`, `update`, and `delete` methods in the Database Service.
95 - - [ ] Inject the Database Service into the target Repository.
96 - - [ ] Ensure the Repository calls `database.open()` before executing queries.
97 -
98 -## Examples
99 -
100 -### Offline-First Repository Implementation
101 -This example demonstrates a Repository coordinating between a Database Service and an API Service using a Stream for offline-first reads.
102 -
103 -```dart
104 -import 'dart:async';
105 -
106 -class TodoRepository {
107 - TodoRepository({
108 - required DatabaseService databaseService,
109 - required ApiClientService apiClientService,
110 - }) : _databaseService = databaseService,
111 - _apiClientService = apiClientService;
112 -
113 - final DatabaseService _databaseService;
114 - final ApiClientService _apiClientService;
115 -
116 - /// Yields local data immediately, then fetches remote data, updates local, and yields fresh data.
117 - Stream<List<Todo>> observeTodos() async* {
118 - // 1. Yield local cached data first
119 - final localTodos = await _databaseService.getAllTodos();
120 - if (localTodos.isNotEmpty) {
121 - yield localTodos.map((model) => Todo.fromDbModel(model)).toList();
122 - }
123 -
124 - try {
125 - // 2. Fetch fresh data from API
126 - final remoteTodos = await _apiClientService.fetchTodos();
127 -
128 - // 3. Update local database
129 - await _databaseService.replaceAllTodos(remoteTodos);
130 -
131 - // 4. Yield fresh data
132 - yield remoteTodos.map((model) => Todo.fromApiModel(model)).toList();
133 - } on Exception catch (e) {
134 - // Handle network errors (UI will still have local data)
135 - // Log error or yield a specific error state if required
136 - }
137 - }
138 -
139 - /// Offline-first write: Save locally, then attempt remote sync.
140 - Future<void> createTodo(Todo todo) async {
141 - final dbModel = todo.toDbModel().copyWith(isSynced: false);
142 -
143 - // 1. Save locally immediately
144 - await _databaseService.insertTodo(dbModel);
145 -
146 - try {
147 - // 2. Attempt remote sync
148 - final apiModel = await _apiClientService.postTodo(todo.toApiModel());
149 -
150 - // 3. Mark as synced locally
151 - await _databaseService.updateTodo(
152 - dbModel.copyWith(id: apiModel.id, isSynced: true)
153 - );
154 - } on Exception catch (_) {
155 - // Leave as isSynced: false for background sync task to pick up later
156 - }
157 - }
158 -}
159 -```
160 -
161 -### SQLite Database Service Implementation
162 -Demonstrates safe query construction using `whereArgs`.
163 -
164 -```dart
165 -class DatabaseService {
166 - static const String _tableName = 'todos';
167 - static const String _colId = 'id';
168 - static const String _colTask = 'task';
169 - static const String _colIsSynced = 'is_synced';
170 -
171 - Database? _database;
172 -
173 - Future<void> open() async {
174 - if (_database != null) return;
175 -
176 - final dbPath = join(await getDatabasesPath(), 'app_database.db');
177 - _database = await openDatabase(
178 - dbPath,
179 - version: 1,
180 - onCreate: (db, version) {
181 - return db.execute(
182 - 'CREATE TABLE $_tableName('
183 - '$_colId INTEGER PRIMARY KEY AUTOINCREMENT, '
184 - '$_colTask TEXT, '
185 - '$_colIsSynced INTEGER)'
186 - );
187 - },
188 - );
189 - }
190 -
191 - Future<void> updateTodo(TodoDbModel todo) async {
192 - await _database!.update(
193 - _tableName,
194 - todo.toMap(),
195 - where: '$_colId = ?',
196 - whereArgs: [todo.id], // Prevents SQL injection
197 - );
198 - }
199 -}
200 -```
.agent/skills/hugeicons-icons/SKILL.md deleted
-24
@@ -1,24 +0,0 @@
1 ----
2 -name: hugeicons-icons
3 -description: Guidelines for finding and suggesting icons from the Hugeicons package.
4 ----
5 -
6 -# Hugeicons Icon Reference
7 -
8 -## Guidelines
9 -
10 -- **Suggestion Strategy**: When the user needs an icon, first search for a descriptive name in the `references/icon_list.md` file.
11 -- **Naming Conventions**: Icons follow a `strokeRounded<Name>` pattern. For example, for a "user" icon, suggest `HugeIcons.strokeRoundedUser`.
12 -- **Category Browsing**: If the user asks for a category (e.g. "settings", "navigation"), browse the corresponding names in the `icon_list.md`.
13 -- **Multiple Variants**: Many icons have multiple variants (e.g., `01`, `02`, `03`). Suggest the most appropriate one based on context.
14 -
15 -## Example Icons
16 -
17 -- `HugeIcons.strokeRoundedUser`: Basic user icon.
18 -- `HugeIcons.strokeRoundedSettings01`: Common settings icon.
19 -- `HugeIcons.strokeRoundedHome01`: Standard home icon.
20 -- `HugeIcons.strokeRoundedFavorite`: Heart/favorite icon.
21 -
22 -## Reference
23 -
24 -The full list of 4,547 icons is available in [icon_list.md](references/icon_list.md). Always check this file for the exact constant name.
.agent/skills/hugeicons-icons/references/icon_list.md deleted
-4556
@@ -1,4556 +0,0 @@
1 -# Hugeicons Icon List
2 -Total icons: 4547
3 -
4 -- `HugeIcons.strokeRounded0Circle`
5 -- `HugeIcons.strokeRounded0Square`
6 -- `HugeIcons.strokeRounded1Circle`
7 -- `HugeIcons.strokeRounded1Square`
8 -- `HugeIcons.strokeRounded1stBracketCircle`
9 -- `HugeIcons.strokeRounded1stBracketSquare`
10 -- `HugeIcons.strokeRounded1stBracket`
11 -- `HugeIcons.strokeRounded1stBrecketCircle`
12 -- `HugeIcons.strokeRounded1stBrecketSquare`
13 -- `HugeIcons.strokeRounded1stBrecket`
14 -- `HugeIcons.strokeRounded2Circle`
15 -- `HugeIcons.strokeRounded2Square`
16 -- `HugeIcons.strokeRounded2ndBracketCircle`
17 -- `HugeIcons.strokeRounded2ndBracketSquare`
18 -- `HugeIcons.strokeRounded2ndBracket`
19 -- `HugeIcons.strokeRounded2ndBrecketCircle`
20 -- `HugeIcons.strokeRounded2ndBrecketSquare`
21 -- `HugeIcons.strokeRounded2ndBrecket`
22 -- `HugeIcons.strokeRounded3Circle`
23 -- `HugeIcons.strokeRounded3DMove`
24 -- `HugeIcons.strokeRounded3DRotate`
25 -- `HugeIcons.strokeRounded3DScale`
26 -- `HugeIcons.strokeRounded3DView`
27 -- `HugeIcons.strokeRounded3Square`
28 -- `HugeIcons.strokeRounded3dMove`
29 -- `HugeIcons.strokeRounded3dPrinter`
30 -- `HugeIcons.strokeRounded3dRotate`
31 -- `HugeIcons.strokeRounded3dScale`
32 -- `HugeIcons.strokeRounded3rdBracketCircle`
33 -- `HugeIcons.strokeRounded3rdBracketSquare`
34 -- `HugeIcons.strokeRounded3rdBracket`
35 -- `HugeIcons.strokeRounded3rdBrecketCircle`
36 -- `HugeIcons.strokeRounded3rdBrecketSquare`
37 -- `HugeIcons.strokeRounded3rdBrecket`
38 -- `HugeIcons.strokeRounded4Circle`
39 -- `HugeIcons.strokeRounded4K`
40 -- `HugeIcons.strokeRounded4Square`
41 -- `HugeIcons.strokeRoundedFourK`
42 -- `HugeIcons.strokeRounded5Circle`
43 -- `HugeIcons.strokeRounded5Square`
44 -- `HugeIcons.strokeRounded6Circle`
45 -- `HugeIcons.strokeRounded6Square`
46 -- `HugeIcons.strokeRounded7Circle`
47 -- `HugeIcons.strokeRounded7Square`
48 -- `HugeIcons.strokeRounded7z01`
49 -- `HugeIcons.strokeRounded7z02`
50 -- `HugeIcons.strokeRounded8Circle`
51 -- `HugeIcons.strokeRounded8Square`
52 -- `HugeIcons.strokeRounded9Circle`
53 -- `HugeIcons.strokeRounded9Square`
54 -- `HugeIcons.strokeRoundedAbacus`
55 -- `HugeIcons.strokeRoundedAbsolute`
56 -- `HugeIcons.strokeRoundedAcceleration`
57 -- `HugeIcons.strokeRoundedAccess`
58 -- `HugeIcons.strokeRoundedAccident`
59 -- `HugeIcons.strokeRoundedAccountSetting01`
60 -- `HugeIcons.strokeRoundedAccountSetting02`
61 -- `HugeIcons.strokeRoundedAccountSetting03`
62 -- `HugeIcons.strokeRoundedActivity01`
63 -- `HugeIcons.strokeRoundedActivity02`
64 -- `HugeIcons.strokeRoundedActivity03`
65 -- `HugeIcons.strokeRoundedActivity04`
66 -- `HugeIcons.strokeRoundedAcute`
67 -- `HugeIcons.strokeRoundedAdd01`
68 -- `HugeIcons.strokeRoundedAdd02`
69 -- `HugeIcons.strokeRoundedAddCircleHalfDot`
70 -- `HugeIcons.strokeRoundedAddCircle`
71 -- `HugeIcons.strokeRoundedAddFemale`
72 -- `HugeIcons.strokeRoundedAddInvoice`
73 -- `HugeIcons.strokeRoundedAddMale`
74 -- `HugeIcons.strokeRoundedAddMoneyCircle`
75 -- `HugeIcons.strokeRoundedAddSquare`
76 -- `HugeIcons.strokeRoundedAddTeam02`
77 -- `HugeIcons.strokeRoundedAddTeam`
78 -- `HugeIcons.strokeRoundedAddToList`
79 -- `HugeIcons.strokeRoundedAddressBook`
80 -- `HugeIcons.strokeRoundedAdobeAfterEffect`
81 -- `HugeIcons.strokeRoundedAdobeIllustrator`
82 -- `HugeIcons.strokeRoundedAdobeIndesign`
83 -- `HugeIcons.strokeRoundedAdobePhotoshop`
84 -- `HugeIcons.strokeRoundedAdobePremier`
85 -- `HugeIcons.strokeRoundedAdobeXd`
86 -- `HugeIcons.strokeRoundedAdventure`
87 -- `HugeIcons.strokeRoundedAdvertisement`
88 -- `HugeIcons.strokeRoundedAdvertisiment`
89 -- `HugeIcons.strokeRoundedAdzan`
90 -- `HugeIcons.strokeRoundedAffiliate`
91 -- `HugeIcons.strokeRoundedAgreement01`
92 -- `HugeIcons.strokeRoundedAgreement02`
93 -- `HugeIcons.strokeRoundedAgreement03`
94 -- `HugeIcons.strokeRoundedAiAudio`
95 -- `HugeIcons.strokeRoundedAiBeautify`
96 -- `HugeIcons.strokeRoundedAiBook`
97 -- `HugeIcons.strokeRoundedAiBrain01`
98 -- `HugeIcons.strokeRoundedAiBrain02`
99 -- `HugeIcons.strokeRoundedAiBrain03`
100 -- `HugeIcons.strokeRoundedAiBrain04`
101 -- `HugeIcons.strokeRoundedAiBrain05`
102 -- `HugeIcons.strokeRoundedAiBrowser`
103 -- `HugeIcons.strokeRoundedAiChat01`
104 -- `HugeIcons.strokeRoundedAiChat02`
105 -- `HugeIcons.strokeRoundedAiChemistry01`
106 -- `HugeIcons.strokeRoundedAiChemistry02`
107 -- `HugeIcons.strokeRoundedAiChemistry03`
108 -- `HugeIcons.strokeRoundedAiChip`
109 -- `HugeIcons.strokeRoundedAiCloud01`
110 -- `HugeIcons.strokeRoundedAiCloud02`
111 -- `HugeIcons.strokeRoundedAiCloud`
112 -- `HugeIcons.strokeRoundedAiComputer`
113 -- `HugeIcons.strokeRoundedAiContentGenerator01`
114 -- `HugeIcons.strokeRoundedAiContentGenerator02`
115 -- `HugeIcons.strokeRoundedAiDna`
116 -- `HugeIcons.strokeRoundedAiEditing`
117 -- `HugeIcons.strokeRoundedAiEraser`
118 -- `HugeIcons.strokeRoundedAiFile`
119 -- `HugeIcons.strokeRoundedAiFolder01`
120 -- `HugeIcons.strokeRoundedAiFolder02`
121 -- `HugeIcons.strokeRoundedAiGame`
122 -- `HugeIcons.strokeRoundedAiGenerative`
123 -- `HugeIcons.strokeRoundedAiIdea`
124 -- `HugeIcons.strokeRoundedAiImage`
125 -- `HugeIcons.strokeRoundedAiInnovation01`
126 -- `HugeIcons.strokeRoundedAiInnovation02`
127 -- `HugeIcons.strokeRoundedAiInnovation03`
128 -- `HugeIcons.strokeRoundedAiLaptop`
129 -- `HugeIcons.strokeRoundedAiLearning`
130 -- `HugeIcons.strokeRoundedAiLock`
131 -- `HugeIcons.strokeRoundedAiMagic`
132 -- `HugeIcons.strokeRoundedAiMail01`
133 -- `HugeIcons.strokeRoundedAiMail02`
134 -- `HugeIcons.strokeRoundedAiMail`
135 -- `HugeIcons.strokeRoundedAiMic`
136 -- `HugeIcons.strokeRoundedAiNetwork`
137 -- `HugeIcons.strokeRoundedAiPhone01`
138 -- `HugeIcons.strokeRoundedAiPhone02`
139 -- `HugeIcons.strokeRoundedAiProgramming`
140 -- `HugeIcons.strokeRoundedAiScan`
141 -- `HugeIcons.strokeRoundedAiScheduling`
142 -- `HugeIcons.strokeRoundedAiSearch02`
143 -- `HugeIcons.strokeRoundedAiSearch`
144 -- `HugeIcons.strokeRoundedAiSecurity01`
145 -- `HugeIcons.strokeRoundedAiSecurity02`
146 -- `HugeIcons.strokeRoundedAiSecurity03`
147 -- `HugeIcons.strokeRoundedAiSetting`
148 -- `HugeIcons.strokeRoundedAiSheets`
149 -- `HugeIcons.strokeRoundedAiSmartwatch`
150 -- `HugeIcons.strokeRoundedAiUser`
151 -- `HugeIcons.strokeRoundedAiVideo`
152 -- `HugeIcons.strokeRoundedAiView`
153 -- `HugeIcons.strokeRoundedAiVisionRecognition`
154 -- `HugeIcons.strokeRoundedAiVoiceGenerator`
155 -- `HugeIcons.strokeRoundedAiVoice`
156 -- `HugeIcons.strokeRoundedAiWebBrowsing`
157 -- `HugeIcons.strokeRoundedAids`
158 -- `HugeIcons.strokeRoundedAirbnb`
159 -- `HugeIcons.strokeRoundedAircraftGame`
160 -- `HugeIcons.strokeRoundedAirdrop`
161 -- `HugeIcons.strokeRoundedAirplane01`
162 -- `HugeIcons.strokeRoundedAirplane02`
163 -- `HugeIcons.strokeRoundedAirplaneLanding01`
164 -- `HugeIcons.strokeRoundedAirplaneLanding02`
165 -- `HugeIcons.strokeRoundedAirplaneModeOff`
166 -- `HugeIcons.strokeRoundedAirplaneMode`
167 -- `HugeIcons.strokeRoundedAirplaneSeat02`
168 -- `HugeIcons.strokeRoundedAirplaneSeat`
169 -- `HugeIcons.strokeRoundedAirplaneTakeOff01`
170 -- `HugeIcons.strokeRoundedAirplaneTakeOff02`
171 -- `HugeIcons.strokeRoundedAirplayLine`
172 -- `HugeIcons.strokeRoundedAirpod01`
173 -- `HugeIcons.strokeRoundedAirpod02`
174 -- `HugeIcons.strokeRoundedAirpod03`
175 -- `HugeIcons.strokeRoundedAirport`
176 -- `HugeIcons.strokeRoundedAlAqsaMosque`
177 -- `HugeIcons.strokeRoundedAlarmClock`
178 -- `HugeIcons.strokeRoundedAlbum01`
179 -- `HugeIcons.strokeRoundedAlbum02`
180 -- `HugeIcons.strokeRoundedAlbumNotFound01`
181 -- `HugeIcons.strokeRoundedAlbumNotFound02`
182 -- `HugeIcons.strokeRoundedAlert01`
183 -- `HugeIcons.strokeRoundedAlert02`
184 -- `HugeIcons.strokeRoundedAlertCircle`
185 -- `HugeIcons.strokeRoundedAlertDiamond`
186 -- `HugeIcons.strokeRoundedAlertSquare`
187 -- `HugeIcons.strokeRoundedAlgorithm`
188 -- `HugeIcons.strokeRoundedAlien01`
189 -- `HugeIcons.strokeRoundedAlien02`
190 -- `HugeIcons.strokeRoundedAlignBottom`
191 -- `HugeIcons.strokeRoundedAlignBoxBottomCenter`
192 -- `HugeIcons.strokeRoundedAlignBoxBottomLeft`
193 -- `HugeIcons.strokeRoundedAlignBoxBottomRight`
194 -- `HugeIcons.strokeRoundedAlignBoxMiddleCenter`
195 -- `HugeIcons.strokeRoundedAlignBoxMiddleLeft`
196 -- `HugeIcons.strokeRoundedAlignBoxMiddleRight`
197 -- `HugeIcons.strokeRoundedAlignBoxTopCenter`
198 -- `HugeIcons.strokeRoundedAlignBoxTopLeft`
199 -- `HugeIcons.strokeRoundedAlignBoxTopRight`
200 -- `HugeIcons.strokeRoundedAlignHorizontalCenter`
201 -- `HugeIcons.strokeRoundedAlignKeyObject`
202 -- `HugeIcons.strokeRoundedAlignLeft`
203 -- `HugeIcons.strokeRoundedAlignRight`
204 -- `HugeIcons.strokeRoundedAlignSelection`
205 -- `HugeIcons.strokeRoundedAlignTop`
206 -- `HugeIcons.strokeRoundedAlignVerticalCenter`
207 -- `HugeIcons.strokeRoundedAllBookmark`
208 -- `HugeIcons.strokeRoundedAllah`
209 -- `HugeIcons.strokeRoundedAlms`
210 -- `HugeIcons.strokeRoundedAlphaCircle`
211 -- `HugeIcons.strokeRoundedAlphaSquare`
212 -- `HugeIcons.strokeRoundedAlpha`
213 -- `HugeIcons.strokeRoundedAlphabetArabic`
214 -- `HugeIcons.strokeRoundedAlphabetBangla`
215 -- `HugeIcons.strokeRoundedAlphabetChinese`
216 -- `HugeIcons.strokeRoundedAlphabetGreek`
217 -- `HugeIcons.strokeRoundedAlphabetHebrew`
218 -- `HugeIcons.strokeRoundedAlphabetHindi`
219 -- `HugeIcons.strokeRoundedAlphabetJapanese`
220 -- `HugeIcons.strokeRoundedAlphabetKorean`
221 -- `HugeIcons.strokeRoundedAlphabetThai`
222 -- `HugeIcons.strokeRoundedAmazon`
223 -- `HugeIcons.strokeRoundedAmbulance`
224 -- `HugeIcons.strokeRoundedAmericanFootball`
225 -- `HugeIcons.strokeRoundedAmie`
226 -- `HugeIcons.strokeRoundedAmmo`
227 -- `HugeIcons.strokeRoundedAmpoule`
228 -- `HugeIcons.strokeRoundedAnalysisTextLink`
229 -- `HugeIcons.strokeRoundedAnalytics01`
230 -- `HugeIcons.strokeRoundedAnalytics02`
231 -- `HugeIcons.strokeRoundedAnalytics03`
232 -- `HugeIcons.strokeRoundedAnalyticsDown`
233 -- `HugeIcons.strokeRoundedAnalyticsUp`
234 -- `HugeIcons.strokeRoundedAnchorPoint`
235 -- `HugeIcons.strokeRoundedAnchor`
236 -- `HugeIcons.strokeRoundedAndroid`
237 -- `HugeIcons.strokeRoundedAngel`
238 -- `HugeIcons.strokeRoundedAngle01`
239 -- `HugeIcons.strokeRoundedAngle`
240 -- `HugeIcons.strokeRoundedAngryBird`
241 -- `HugeIcons.strokeRoundedAngry`
242 -- `HugeIcons.strokeRoundedAnonymous`
243 -- `HugeIcons.strokeRoundedApi`
244 -- `HugeIcons.strokeRoundedAppStore`
245 -- `HugeIcons.strokeRoundedApple01`
246 -- `HugeIcons.strokeRoundedAppleFinder`
247 -- `HugeIcons.strokeRoundedAppleIntelligence`
248 -- `HugeIcons.strokeRoundedAppleNews`
249 -- `HugeIcons.strokeRoundedApplePie`
250 -- `HugeIcons.strokeRoundedAppleReminder`
251 -- `HugeIcons.strokeRoundedAppleStocks`
252 -- `HugeIcons.strokeRoundedApple`
253 -- `HugeIcons.strokeRoundedAppleVisionPro`
254 -- `HugeIcons.strokeRoundedAppointment01`
255 -- `HugeIcons.strokeRoundedAppointment02`
256 -- `HugeIcons.strokeRoundedApproximatelyEqualCircle`
257 -- `HugeIcons.strokeRoundedApproximatelyEqualSquare`
258 -- `HugeIcons.strokeRoundedApproximatelyEqual`
259 -- `HugeIcons.strokeRoundedApricot`
260 -- `HugeIcons.strokeRoundedApron`
261 -- `HugeIcons.strokeRoundedArcBrowser`
262 -- `HugeIcons.strokeRoundedArcher`
263 -- `HugeIcons.strokeRoundedArchive01`
264 -- `HugeIcons.strokeRoundedArchive02`
265 -- `HugeIcons.strokeRoundedArchive03`
266 -- `HugeIcons.strokeRoundedArchive`
267 -- `HugeIcons.strokeRoundedArmoredBoot`
268 -- `HugeIcons.strokeRoundedArrangeByLettersAZ`
269 -- `HugeIcons.strokeRoundedArrangeByLettersZA`
270 -- `HugeIcons.strokeRoundedArrangeByNumbers19`
271 -- `HugeIcons.strokeRoundedArrangeByNumbers91`
272 -- `HugeIcons.strokeRoundedArrange`
273 -- `HugeIcons.strokeRoundedArrowAllDirection`
274 -- `HugeIcons.strokeRoundedArrowDataTransferDiagonal`
275 -- `HugeIcons.strokeRoundedArrowDataTransferHorizontal`
276 -- `HugeIcons.strokeRoundedArrowDataTransferVertical`
277 -- `HugeIcons.strokeRoundedArrowDiagonal`
278 -- `HugeIcons.strokeRoundedArrowDown01`
279 -- `HugeIcons.strokeRoundedArrowDown02`
280 -- `HugeIcons.strokeRoundedArrowDown03`
281 -- `HugeIcons.strokeRoundedArrowDown04`
282 -- `HugeIcons.strokeRoundedArrowDown05`
283 -- `HugeIcons.strokeRoundedArrowDownDouble`
284 -- `HugeIcons.strokeRoundedArrowDownLeft01`
285 -- `HugeIcons.strokeRoundedArrowDownLeft02`
286 -- `HugeIcons.strokeRoundedArrowDownRight01`
287 -- `HugeIcons.strokeRoundedArrowDownRight02`
288 -- `HugeIcons.strokeRoundedArrowExpand01`
289 -- `HugeIcons.strokeRoundedArrowExpand02`
290 -- `HugeIcons.strokeRoundedArrowExpandDiagonal01`
291 -- `HugeIcons.strokeRoundedArrowExpandDiagonal02`
292 -- `HugeIcons.strokeRoundedArrowExpand`
293 -- `HugeIcons.strokeRoundedArrowHorizontal`
294 -- `HugeIcons.strokeRoundedArrowLeft01`
295 -- `HugeIcons.strokeRoundedArrowLeft02`
296 -- `HugeIcons.strokeRoundedArrowLeft03`
297 -- `HugeIcons.strokeRoundedArrowLeft04`
298 -- `HugeIcons.strokeRoundedArrowLeft05`
299 -- `HugeIcons.strokeRoundedArrowLeftDouble`
300 -- `HugeIcons.strokeRoundedArrowLeftRight`
301 -- `HugeIcons.strokeRoundedArrowMoveDownLeft`
302 -- `HugeIcons.strokeRoundedArrowMoveDownRight`
303 -- `HugeIcons.strokeRoundedArrowMoveLeftDown`
304 -- `HugeIcons.strokeRoundedArrowMoveRightDown`
305 -- `HugeIcons.strokeRoundedArrowMoveUpLeft`
306 -- `HugeIcons.strokeRoundedArrowMoveUpRight`
307 -- `HugeIcons.strokeRoundedArrowReloadHorizontal`
308 -- `HugeIcons.strokeRoundedArrowReloadVertical`
309 -- `HugeIcons.strokeRoundedArrowRight01`
310 -- `HugeIcons.strokeRoundedArrowRight02`
311 -- `HugeIcons.strokeRoundedArrowRight03`
312 -- `HugeIcons.strokeRoundedArrowRight04`
313 -- `HugeIcons.strokeRoundedArrowRight05`
314 -- `HugeIcons.strokeRoundedArrowRightDouble`
315 -- `HugeIcons.strokeRoundedArrowShrink01`
316 -- `HugeIcons.strokeRoundedArrowShrink02`
317 -- `HugeIcons.strokeRoundedArrowShrink`
318 -- `HugeIcons.strokeRoundedArrowTurnBackward`
319 -- `HugeIcons.strokeRoundedArrowTurnDown`
320 -- `HugeIcons.strokeRoundedArrowTurnForward`
321 -- `HugeIcons.strokeRoundedArrowTurnUp`
322 -- `HugeIcons.strokeRoundedArrowUp01`
323 -- `HugeIcons.strokeRoundedArrowUp02`
324 -- `HugeIcons.strokeRoundedArrowUp03`
325 -- `HugeIcons.strokeRoundedArrowUp04`
326 -- `HugeIcons.strokeRoundedArrowUp05`
327 -- `HugeIcons.strokeRoundedArrowUpDouble`
328 -- `HugeIcons.strokeRoundedArrowUpDown`
329 -- `HugeIcons.strokeRoundedArrowUpLeft01`
330 -- `HugeIcons.strokeRoundedArrowUpLeft02`
331 -- `HugeIcons.strokeRoundedArrowUpRight01`
332 -- `HugeIcons.strokeRoundedArrowUpRight02`
333 -- `HugeIcons.strokeRoundedArrowUpRight03`
334 -- `HugeIcons.strokeRoundedArrowVertical`
335 -- `HugeIcons.strokeRoundedArtboard`
336 -- `HugeIcons.strokeRoundedArtboardTool`
337 -- `HugeIcons.strokeRoundedArtificialIntelligence01`
338 -- `HugeIcons.strokeRoundedArtificialIntelligence02`
339 -- `HugeIcons.strokeRoundedArtificialIntelligence03`
340 -- `HugeIcons.strokeRoundedArtificialIntelligence04`
341 -- `HugeIcons.strokeRoundedArtificialIntelligence05`
342 -- `HugeIcons.strokeRoundedArtificialIntelligence06`
343 -- `HugeIcons.strokeRoundedArtificialIntelligence07`
344 -- `HugeIcons.strokeRoundedArtificialIntelligence08`
345 -- `HugeIcons.strokeRoundedAspectRatio`
346 -- `HugeIcons.strokeRoundedAssignments`
347 -- `HugeIcons.strokeRoundedAsterisk02`
348 -- `HugeIcons.strokeRoundedAsterisk`
349 -- `HugeIcons.strokeRoundedAsteroid01`
350 -- `HugeIcons.strokeRoundedAsteroid02`
351 -- `HugeIcons.strokeRoundedAstronaut01`
352 -- `HugeIcons.strokeRoundedAstronaut02`
353 -- `HugeIcons.strokeRoundedAt`
354 -- `HugeIcons.strokeRoundedAtm01`
355 -- `HugeIcons.strokeRoundedAtm02`
356 -- `HugeIcons.strokeRoundedAtom01`
357 -- `HugeIcons.strokeRoundedAtom02`
358 -- `HugeIcons.strokeRoundedAtomicPower`
359 -- `HugeIcons.strokeRoundedAttachment01`
360 -- `HugeIcons.strokeRoundedAttachment02`
361 -- `HugeIcons.strokeRoundedAttachmentCircle`
362 -- `HugeIcons.strokeRoundedAttachmentSquare`
363 -- `HugeIcons.strokeRoundedAttachment`
364 -- `HugeIcons.strokeRoundedAuction`
365 -- `HugeIcons.strokeRoundedAudioBook01`
366 -- `HugeIcons.strokeRoundedAudioBook02`
367 -- `HugeIcons.strokeRoundedAudioBook03`
368 -- `HugeIcons.strokeRoundedAudioBook04`
369 -- `HugeIcons.strokeRoundedAudioWave01`
370 -- `HugeIcons.strokeRoundedAudioWave02`
371 -- `HugeIcons.strokeRoundedAudit01`
372 -- `HugeIcons.strokeRoundedAudit02`
373 -- `HugeIcons.strokeRoundedAugmentedRealityAr`
374 -- `HugeIcons.strokeRoundedAuthorized`
375 -- `HugeIcons.strokeRoundedAutoConversations`
376 -- `HugeIcons.strokeRoundedAutomotiveBattery01`
377 -- `HugeIcons.strokeRoundedAutomotiveBattery02`
378 -- `HugeIcons.strokeRoundedAvalanche`
379 -- `HugeIcons.strokeRoundedAvocado`
380 -- `HugeIcons.strokeRoundedAward01`
381 -- `HugeIcons.strokeRoundedAward02`
382 -- `HugeIcons.strokeRoundedAward03`
383 -- `HugeIcons.strokeRoundedAward04`
384 -- `HugeIcons.strokeRoundedAward05`
385 -- `HugeIcons.strokeRoundedBaby01`
386 -- `HugeIcons.strokeRoundedBaby02`
387 -- `HugeIcons.strokeRoundedBabyBed01`
388 -- `HugeIcons.strokeRoundedBabyBed02`
389 -- `HugeIcons.strokeRoundedBabyBottle`
390 -- `HugeIcons.strokeRoundedBabyBoyDress`
391 -- `HugeIcons.strokeRoundedBabyGirlDress`
392 -- `HugeIcons.strokeRoundedBackMuscleBody`
393 -- `HugeIcons.strokeRoundedBackground`
394 -- `HugeIcons.strokeRoundedBackpack01`
395 -- `HugeIcons.strokeRoundedBackpack02`
396 -- `HugeIcons.strokeRoundedBackpack03`
397 -- `HugeIcons.strokeRoundedBackward01`
398 -- `HugeIcons.strokeRoundedBackward02`
399 -- `HugeIcons.strokeRoundedBacteria`
400 -- `HugeIcons.strokeRoundedBadmintonShuttle`
401 -- `HugeIcons.strokeRoundedBadminton`
402 -- `HugeIcons.strokeRoundedBalanceScale`
403 -- `HugeIcons.strokeRoundedBalloons`
404 -- `HugeIcons.strokeRoundedBanana`
405 -- `HugeIcons.strokeRoundedBandage`
406 -- `HugeIcons.strokeRoundedBank`
407 -- `HugeIcons.strokeRoundedBarChartHorizontal`
408 -- `HugeIcons.strokeRoundedBarChart`
409 -- `HugeIcons.strokeRoundedBarCode01`
410 -- `HugeIcons.strokeRoundedBarCode02`
411 -- `HugeIcons.strokeRoundedBarns`
412 -- `HugeIcons.strokeRoundedBaseballBat`
413 -- `HugeIcons.strokeRoundedBaseballHelmet`
414 -- `HugeIcons.strokeRoundedBaseball`
415 -- `HugeIcons.strokeRoundedBash`
416 -- `HugeIcons.strokeRoundedBasketball01`
417 -- `HugeIcons.strokeRoundedBasketball02`
418 -- `HugeIcons.strokeRoundedBasketballHoop`
419 -- `HugeIcons.strokeRoundedBathtub01`
420 -- `HugeIcons.strokeRoundedBathtub02`
421 -- `HugeIcons.strokeRoundedBatteriesEnergy`
422 -- `HugeIcons.strokeRoundedBatteryCharging01`
423 -- `HugeIcons.strokeRoundedBatteryCharging02`
424 -- `HugeIcons.strokeRoundedBatteryEcoCharging`
425 -- `HugeIcons.strokeRoundedBatteryEmpty`
426 -- `HugeIcons.strokeRoundedBatteryFull`
427 -- `HugeIcons.strokeRoundedBatteryLow`
428 -- `HugeIcons.strokeRoundedBatteryMedium01`
429 -- `HugeIcons.strokeRoundedBatteryMedium02`
430 -- `HugeIcons.strokeRoundedBbqGrill`
431 -- `HugeIcons.strokeRoundedBeach02`
432 -- `HugeIcons.strokeRoundedBeach`
433 -- `HugeIcons.strokeRoundedBeater`
434 -- `HugeIcons.strokeRoundedBebo`
435 -- `HugeIcons.strokeRoundedBedBunk`
436 -- `HugeIcons.strokeRoundedBedDouble`
437 -- `HugeIcons.strokeRoundedBedSingle01`
438 -- `HugeIcons.strokeRoundedBedSingle02`
439 -- `HugeIcons.strokeRoundedBed`
440 -- `HugeIcons.strokeRoundedBedug01`
441 -- `HugeIcons.strokeRoundedBedug02`
442 -- `HugeIcons.strokeRoundedBehance01`
443 -- `HugeIcons.strokeRoundedBehance02`
444 -- `HugeIcons.strokeRoundedBelt`
445 -- `HugeIcons.strokeRoundedBendTool`
446 -- `HugeIcons.strokeRoundedBerlin`
447 -- `HugeIcons.strokeRoundedBerlinTower`
448 -- `HugeIcons.strokeRoundedBeta`
449 -- `HugeIcons.strokeRoundedBicycle01`
450 -- `HugeIcons.strokeRoundedBicycle`
451 -- `HugeIcons.strokeRoundedBilliard01`
452 -- `HugeIcons.strokeRoundedBilliard02`
453 -- `HugeIcons.strokeRoundedBinaryCode`
454 -- `HugeIcons.strokeRoundedBing`
455 -- `HugeIcons.strokeRoundedBinoculars`
456 -- `HugeIcons.strokeRoundedBioEnergy`
457 -- `HugeIcons.strokeRoundedBiomassEnergy`
458 -- `HugeIcons.strokeRoundedBiometricAccess`
459 -- `HugeIcons.strokeRoundedBiometricDevice`
460 -- `HugeIcons.strokeRoundedBirthdayCake`
461 -- `HugeIcons.strokeRoundedBiscuit`
462 -- `HugeIcons.strokeRoundedBitcoin01`
463 -- `HugeIcons.strokeRoundedBitcoin02`
464 -- `HugeIcons.strokeRoundedBitcoin03`
465 -- `HugeIcons.strokeRoundedBitcoin04`
466 -- `HugeIcons.strokeRoundedBitcoinBag`
467 -- `HugeIcons.strokeRoundedBitcoinCircle`
468 -- `HugeIcons.strokeRoundedBitcoinCloud`
469 -- `HugeIcons.strokeRoundedBitcoinCpu`
470 -- `HugeIcons.strokeRoundedBitcoinCreditCard`
471 -- `HugeIcons.strokeRoundedBitcoinDatabase`
472 -- `HugeIcons.strokeRoundedBitcoinDown01`
473 -- `HugeIcons.strokeRoundedBitcoinDown02`
474 -- `HugeIcons.strokeRoundedBitcoinEllipse`
475 -- `HugeIcons.strokeRoundedBitcoinEye`
476 -- `HugeIcons.strokeRoundedBitcoinFilter`
477 -- `HugeIcons.strokeRoundedBitcoinFlashdisk`
478 -- `HugeIcons.strokeRoundedBitcoinGraph`
479 -- `HugeIcons.strokeRoundedBitcoinInvoice`
480 -- `HugeIcons.strokeRoundedBitcoinKey`
481 -- `HugeIcons.strokeRoundedBitcoinLocation`
482 -- `HugeIcons.strokeRoundedBitcoinLock`
483 -- `HugeIcons.strokeRoundedBitcoinMail`
484 -- `HugeIcons.strokeRoundedBitcoinMind`
485 -- `HugeIcons.strokeRoundedBitcoinMoney01`
486 -- `HugeIcons.strokeRoundedBitcoinMoney02`
487 -- `HugeIcons.strokeRoundedBitcoinPieChart`
488 -- `HugeIcons.strokeRoundedBitcoinPiggyBank`
489 -- `HugeIcons.strokeRoundedBitcoinPresentation`
490 -- `HugeIcons.strokeRoundedBitcoinReceipt`
491 -- `HugeIcons.strokeRoundedBitcoinReceive`
492 -- `HugeIcons.strokeRoundedBitcoinRectangle`
493 -- `HugeIcons.strokeRoundedBitcoinSafe`
494 -- `HugeIcons.strokeRoundedBitcoinSearch`
495 -- `HugeIcons.strokeRoundedBitcoinSend`
496 -- `HugeIcons.strokeRoundedBitcoinSetting`
497 -- `HugeIcons.strokeRoundedBitcoinShield`
498 -- `HugeIcons.strokeRoundedBitcoinShopping`
499 -- `HugeIcons.strokeRoundedBitcoinSmartphone01`
500 -- `HugeIcons.strokeRoundedBitcoinSmartphone02`
501 -- `HugeIcons.strokeRoundedBitcoinSquare`
502 -- `HugeIcons.strokeRoundedBitcoinStore`
503 -- `HugeIcons.strokeRoundedBitcoin`
504 -- `HugeIcons.strokeRoundedBitcoinTag`
505 -- `HugeIcons.strokeRoundedBitcoinTarget`
506 -- `HugeIcons.strokeRoundedBitcoinTransaction`
507 -- `HugeIcons.strokeRoundedBitcoinUp01`
508 -- `HugeIcons.strokeRoundedBitcoinUp02`
509 -- `HugeIcons.strokeRoundedBitcoinWallet`
510 -- `HugeIcons.strokeRoundedBitcoinWithdraw`
511 -- `HugeIcons.strokeRoundedBlackHole01`
512 -- `HugeIcons.strokeRoundedBlackHole`
513 -- `HugeIcons.strokeRoundedBlend`
514 -- `HugeIcons.strokeRoundedBlender`
515 -- `HugeIcons.strokeRoundedBlockGame`
516 -- `HugeIcons.strokeRoundedBlockchain01`
517 -- `HugeIcons.strokeRoundedBlockchain02`
518 -- `HugeIcons.strokeRoundedBlockchain03`
519 -- `HugeIcons.strokeRoundedBlockchain04`
520 -- `HugeIcons.strokeRoundedBlockchain05`
521 -- `HugeIcons.strokeRoundedBlockchain06`
522 -- `HugeIcons.strokeRoundedBlockchain07`
523 -- `HugeIcons.strokeRoundedBlocked`
524 -- `HugeIcons.strokeRoundedBlogger`
525 -- `HugeIcons.strokeRoundedBloodBag`
526 -- `HugeIcons.strokeRoundedBloodBottle`
527 -- `HugeIcons.strokeRoundedBloodPressure`
528 -- `HugeIcons.strokeRoundedBlood`
529 -- `HugeIcons.strokeRoundedBloodType`
530 -- `HugeIcons.strokeRoundedBluesky`
531 -- `HugeIcons.strokeRoundedBluetoothCircle`
532 -- `HugeIcons.strokeRoundedBluetoothNotConnected`
533 -- `HugeIcons.strokeRoundedBluetoothSearch`
534 -- `HugeIcons.strokeRoundedBluetoothSquare`
535 -- `HugeIcons.strokeRoundedBluetooth`
536 -- `HugeIcons.strokeRoundedBlur`
537 -- `HugeIcons.strokeRoundedBlushBrush01`
538 -- `HugeIcons.strokeRoundedBlushBrush02`
539 -- `HugeIcons.strokeRoundedBoardMath`
540 -- `HugeIcons.strokeRoundedBoat`
541 -- `HugeIcons.strokeRoundedBodyArmor`
542 -- `HugeIcons.strokeRoundedBodyPartLeg`
543 -- `HugeIcons.strokeRoundedBodyPartMuscle`
544 -- `HugeIcons.strokeRoundedBodyPartSixPack`
545 -- `HugeIcons.strokeRoundedBodySoap`
546 -- `HugeIcons.strokeRoundedBodyWeight`
547 -- `HugeIcons.strokeRoundedBomb`
548 -- `HugeIcons.strokeRoundedBone01`
549 -- `HugeIcons.strokeRoundedBone02`
550 -- `HugeIcons.strokeRoundedBook01`
551 -- `HugeIcons.strokeRoundedBook02`
552 -- `HugeIcons.strokeRoundedBook03`
553 -- `HugeIcons.strokeRoundedBook04`
554 -- `HugeIcons.strokeRoundedBookBookmark01`
555 -- `HugeIcons.strokeRoundedBookBookmark02`
556 -- `HugeIcons.strokeRoundedBookDownload`
557 -- `HugeIcons.strokeRoundedBookEdit`
558 -- `HugeIcons.strokeRoundedBookOpen01`
559 -- `HugeIcons.strokeRoundedBookOpen02`
560 -- `HugeIcons.strokeRoundedBookUpload`
561 -- `HugeIcons.strokeRoundedBookmark01`
562 -- `HugeIcons.strokeRoundedBookmark02`
563 -- `HugeIcons.strokeRoundedBookmark03`
564 -- `HugeIcons.strokeRoundedBookmarkAdd01`
565 -- `HugeIcons.strokeRoundedBookmarkAdd02`
566 -- `HugeIcons.strokeRoundedBookmarkBlock01`
567 -- `HugeIcons.strokeRoundedBookmarkBlock02`
568 -- `HugeIcons.strokeRoundedBookmarkCheck01`
569 -- `HugeIcons.strokeRoundedBookmarkCheck02`
570 -- `HugeIcons.strokeRoundedBookmarkMinus01`
571 -- `HugeIcons.strokeRoundedBookmarkMinus02`
572 -- `HugeIcons.strokeRoundedBookmarkOff01`
573 -- `HugeIcons.strokeRoundedBookmarkOff02`
574 -- `HugeIcons.strokeRoundedBookmarkRemove01`
575 -- `HugeIcons.strokeRoundedBookmarkRemove02`
576 -- `HugeIcons.strokeRoundedBooks01`
577 -- `HugeIcons.strokeRoundedBooks02`
578 -- `HugeIcons.strokeRoundedBookshelf01`
579 -- `HugeIcons.strokeRoundedBookshelf02`
580 -- `HugeIcons.strokeRoundedBookshelf03`
581 -- `HugeIcons.strokeRoundedBootstrap`
582 -- `HugeIcons.strokeRoundedBorderAll01`
583 -- `HugeIcons.strokeRoundedBorderAll02`
584 -- `HugeIcons.strokeRoundedBorderBottom01`
585 -- `HugeIcons.strokeRoundedBorderBottom02`
586 -- `HugeIcons.strokeRoundedBorderFull`
587 -- `HugeIcons.strokeRoundedBorderHorizontal`
588 -- `HugeIcons.strokeRoundedBorderInner`
589 -- `HugeIcons.strokeRoundedBorderLeft01`
590 -- `HugeIcons.strokeRoundedBorderLeft02`
591 -- `HugeIcons.strokeRoundedBorderNone01`
592 -- `HugeIcons.strokeRoundedBorderNone02`
593 -- `HugeIcons.strokeRoundedBorderRight01`
594 -- `HugeIcons.strokeRoundedBorderRight02`
595 -- `HugeIcons.strokeRoundedBorderTop01`
596 -- `HugeIcons.strokeRoundedBorderTop02`
597 -- `HugeIcons.strokeRoundedBorderVertical`
598 -- `HugeIcons.strokeRoundedBorobudur`
599 -- `HugeIcons.strokeRoundedBot`
600 -- `HugeIcons.strokeRoundedBounceLeft`
601 -- `HugeIcons.strokeRoundedBounceRight`
602 -- `HugeIcons.strokeRoundedBoundingBox`
603 -- `HugeIcons.strokeRoundedBowTie`
604 -- `HugeIcons.strokeRoundedBowlingBall`
605 -- `HugeIcons.strokeRoundedBowlingPins`
606 -- `HugeIcons.strokeRoundedBowling`
607 -- `HugeIcons.strokeRoundedBoxer`
608 -- `HugeIcons.strokeRoundedBoxingBag`
609 -- `HugeIcons.strokeRoundedBoxingGlove01`
610 -- `HugeIcons.strokeRoundedBoxingGlove`
611 -- `HugeIcons.strokeRoundedBrain01`
612 -- `HugeIcons.strokeRoundedBrain02`
613 -- `HugeIcons.strokeRoundedBrain03`
614 -- `HugeIcons.strokeRoundedBrain`
615 -- `HugeIcons.strokeRoundedBrandfetch`
616 -- `HugeIcons.strokeRoundedBread01`
617 -- `HugeIcons.strokeRoundedBread02`
618 -- `HugeIcons.strokeRoundedBread03`
619 -- `HugeIcons.strokeRoundedBread04`
620 -- `HugeIcons.strokeRoundedBreastPump`
621 -- `HugeIcons.strokeRoundedBridge`
622 -- `HugeIcons.strokeRoundedBriefcase01`
623 -- `HugeIcons.strokeRoundedBriefcase02`
624 -- `HugeIcons.strokeRoundedBriefcase03`
625 -- `HugeIcons.strokeRoundedBriefcase04`
626 -- `HugeIcons.strokeRoundedBriefcase05`
627 -- `HugeIcons.strokeRoundedBriefcase06`
628 -- `HugeIcons.strokeRoundedBriefcase07`
629 -- `HugeIcons.strokeRoundedBriefcase08`
630 -- `HugeIcons.strokeRoundedBriefcase09`
631 -- `HugeIcons.strokeRoundedBriefcaseDollar`
632 -- `HugeIcons.strokeRoundedBroccoli`
633 -- `HugeIcons.strokeRoundedBrochure`
634 -- `HugeIcons.strokeRoundedBrokenBone`
635 -- `HugeIcons.strokeRoundedBrowser`
636 -- `HugeIcons.strokeRoundedBrush`
637 -- `HugeIcons.strokeRoundedBubbleChatAdd`
638 -- `HugeIcons.strokeRoundedBubbleChatBlocked`
639 -- `HugeIcons.strokeRoundedBubbleChatCancel`
640 -- `HugeIcons.strokeRoundedBubbleChatDelay`
641 -- `HugeIcons.strokeRoundedBubbleChatDone`
642 -- `HugeIcons.strokeRoundedBubbleChatDownload01`
643 -- `HugeIcons.strokeRoundedBubbleChatDownload02`
644 -- `HugeIcons.strokeRoundedBubbleChatEdit`
645 -- `HugeIcons.strokeRoundedBubbleChatFavourite`
646 -- `HugeIcons.strokeRoundedBubbleChatIncome`
647 -- `HugeIcons.strokeRoundedBubbleChatLock`
648 -- `HugeIcons.strokeRoundedBubbleChatNotification`
649 -- `HugeIcons.strokeRoundedBubbleChatOutcome`
650 -- `HugeIcons.strokeRoundedBubbleChatPreview`
651 -- `HugeIcons.strokeRoundedBubbleChatQuestion`
652 -- `HugeIcons.strokeRoundedBubbleChatSearch`
653 -- `HugeIcons.strokeRoundedBubbleChatSecure`
654 -- `HugeIcons.strokeRoundedBubbleChat`
655 -- `HugeIcons.strokeRoundedBubbleChatTranslate`
656 -- `HugeIcons.strokeRoundedBubbleChatUnlock`
657 -- `HugeIcons.strokeRoundedBubbleChatUpload`
658 -- `HugeIcons.strokeRoundedBubbleChatUser`
659 -- `HugeIcons.strokeRoundedBubbleTea01`
660 -- `HugeIcons.strokeRoundedBubbleTea02`
661 -- `HugeIcons.strokeRoundedBug01`
662 -- `HugeIcons.strokeRoundedBug02`
663 -- `HugeIcons.strokeRoundedBuilding01`
664 -- `HugeIcons.strokeRoundedBuilding02`
665 -- `HugeIcons.strokeRoundedBuilding03`
666 -- `HugeIcons.strokeRoundedBuilding04`
667 -- `HugeIcons.strokeRoundedBuilding05`
668 -- `HugeIcons.strokeRoundedBuilding06`
669 -- `HugeIcons.strokeRoundedBulbCharging`
670 -- `HugeIcons.strokeRoundedBulb`
671 -- `HugeIcons.strokeRoundedBullet`
672 -- `HugeIcons.strokeRoundedBulletproofVest`
673 -- `HugeIcons.strokeRoundedBurjAlArab`
674 -- `HugeIcons.strokeRoundedBurningCd`
675 -- `HugeIcons.strokeRoundedBus01`
676 -- `HugeIcons.strokeRoundedBus02`
677 -- `HugeIcons.strokeRoundedBus03`
678 -- `HugeIcons.strokeRoundedC`
679 -- `HugeIcons.strokeRoundedCProgramming`
680 -- `HugeIcons.strokeRoundedCabinet01`
681 -- `HugeIcons.strokeRoundedCabinet02`
682 -- `HugeIcons.strokeRoundedCabinet03`
683 -- `HugeIcons.strokeRoundedCabinet04`
684 -- `HugeIcons.strokeRoundedCableCar`
685 -- `HugeIcons.strokeRoundedCactus`
686 -- `HugeIcons.strokeRoundedCaduceus`
687 -- `HugeIcons.strokeRoundedCafe`
688 -- `HugeIcons.strokeRoundedCalculate`
689 -- `HugeIcons.strokeRoundedCalculator01`
690 -- `HugeIcons.strokeRoundedCalculator`
691 -- `HugeIcons.strokeRoundedCalendar01`
692 -- `HugeIcons.strokeRoundedCalendar02`
693 -- `HugeIcons.strokeRoundedCalendar03`
694 -- `HugeIcons.strokeRoundedCalendar04`
695 -- `HugeIcons.strokeRoundedCalendarAdd01`
696 -- `HugeIcons.strokeRoundedCalendarAdd02`
697 -- `HugeIcons.strokeRoundedCalendarBlock01`
698 -- `HugeIcons.strokeRoundedCalendarBlock02`
699 -- `HugeIcons.strokeRoundedCalendarCheckIn01`
700 -- `HugeIcons.strokeRoundedCalendarCheckIn02`
701 -- `HugeIcons.strokeRoundedCalendarCheckOut01`
702 -- `HugeIcons.strokeRoundedCalendarCheckOut02`
703 -- `HugeIcons.strokeRoundedCalendarDownload01`
704 -- `HugeIcons.strokeRoundedCalendarDownload02`
705 -- `HugeIcons.strokeRoundedCalendarFavorite01`
706 -- `HugeIcons.strokeRoundedCalendarFavorite02`
707 -- `HugeIcons.strokeRoundedCalendarLock01`
708 -- `HugeIcons.strokeRoundedCalendarLock02`
709 -- `HugeIcons.strokeRoundedCalendarLove01`
710 -- `HugeIcons.strokeRoundedCalendarLove02`
711 -- `HugeIcons.strokeRoundedCalendarMinus01`
712 -- `HugeIcons.strokeRoundedCalendarMinus02`
713 -- `HugeIcons.strokeRoundedCalendarRemove01`
714 -- `HugeIcons.strokeRoundedCalendarRemove02`
715 -- `HugeIcons.strokeRoundedCalendarSetting01`
716 -- `HugeIcons.strokeRoundedCalendarSetting02`
717 -- `HugeIcons.strokeRoundedCalendarUpload01`
718 -- `HugeIcons.strokeRoundedCalendarUpload02`
719 -- `HugeIcons.strokeRoundedCalendarUser`
720 -- `HugeIcons.strokeRoundedCall02`
721 -- `HugeIcons.strokeRoundedCallAdd02`
722 -- `HugeIcons.strokeRoundedCallAdd`
723 -- `HugeIcons.strokeRoundedCallBlocked02`
724 -- `HugeIcons.strokeRoundedCallBlocked`
725 -- `HugeIcons.strokeRoundedCallDisabled02`
726 -- `HugeIcons.strokeRoundedCallDisabled`
727 -- `HugeIcons.strokeRoundedCallDone02`
728 -- `HugeIcons.strokeRoundedCallDone`
729 -- `HugeIcons.strokeRoundedCallEnd01`
730 -- `HugeIcons.strokeRoundedCallEnd02`
731 -- `HugeIcons.strokeRoundedCallEnd03`
732 -- `HugeIcons.strokeRoundedCallEnd04`
733 -- `HugeIcons.strokeRoundedCallIncoming01`
734 -- `HugeIcons.strokeRoundedCallIncoming02`
735 -- `HugeIcons.strokeRoundedCallIncoming03`
736 -- `HugeIcons.strokeRoundedCallIncoming04`
737 -- `HugeIcons.strokeRoundedCallInternal02`
738 -- `HugeIcons.strokeRoundedCallInternal`
739 -- `HugeIcons.strokeRoundedCallLocked02`
740 -- `HugeIcons.strokeRoundedCallLocked`
741 -- `HugeIcons.strokeRoundedCallMinus02`
742 -- `HugeIcons.strokeRoundedCallMinus`
743 -- `HugeIcons.strokeRoundedCallMissed01`
744 -- `HugeIcons.strokeRoundedCallMissed02`
745 -- `HugeIcons.strokeRoundedCallMissed03`
746 -- `HugeIcons.strokeRoundedCallMissed04`
747 -- `HugeIcons.strokeRoundedCallOutgoing01`
748 -- `HugeIcons.strokeRoundedCallOutgoing02`
749 -- `HugeIcons.strokeRoundedCallOutgoing03`
750 -- `HugeIcons.strokeRoundedCallOutgoing04`
751 -- `HugeIcons.strokeRoundedCallPaused02`
752 -- `HugeIcons.strokeRoundedCallPaused`
753 -- `HugeIcons.strokeRoundedCallReceived02`
754 -- `HugeIcons.strokeRoundedCallReceived`
755 -- `HugeIcons.strokeRoundedCallRinging01`
756 -- `HugeIcons.strokeRoundedCallRinging02`
757 -- `HugeIcons.strokeRoundedCallRinging03`
758 -- `HugeIcons.strokeRoundedCallRinging04`
759 -- `HugeIcons.strokeRoundedCall`
760 -- `HugeIcons.strokeRoundedCallUnlocked02`
761 -- `HugeIcons.strokeRoundedCallUnlocked`
762 -- `HugeIcons.strokeRoundedCalling02`
763 -- `HugeIcons.strokeRoundedCalling`
764 -- `HugeIcons.strokeRoundedCamel`
765 -- `HugeIcons.strokeRoundedCamera01`
766 -- `HugeIcons.strokeRoundedCamera02`
767 -- `HugeIcons.strokeRoundedCamera03`
768 -- `HugeIcons.strokeRoundedCameraAdd01`
769 -- `HugeIcons.strokeRoundedCameraAdd02`
770 -- `HugeIcons.strokeRoundedCameraAdd03`
771 -- `HugeIcons.strokeRoundedCameraAi`
772 -- `HugeIcons.strokeRoundedCameraAutomatically01`
773 -- `HugeIcons.strokeRoundedCameraAutomatically02`
774 -- `HugeIcons.strokeRoundedCameraLens`
775 -- `HugeIcons.strokeRoundedCameraMicrophone01`
776 -- `HugeIcons.strokeRoundedCameraMicrophone02`
777 -- `HugeIcons.strokeRoundedCameraNightMode01`
778 -- `HugeIcons.strokeRoundedCameraNightMode02`
779 -- `HugeIcons.strokeRoundedCameraOff01`
780 -- `HugeIcons.strokeRoundedCameraOff02`
781 -- `HugeIcons.strokeRoundedCameraRotated01`
782 -- `HugeIcons.strokeRoundedCameraRotated02`
783 -- `HugeIcons.strokeRoundedCameraSmile01`
784 -- `HugeIcons.strokeRoundedCameraSmile02`
785 -- `HugeIcons.strokeRoundedCameraTripod`
786 -- `HugeIcons.strokeRoundedCameraVideo`
787 -- `HugeIcons.strokeRoundedCamper`
788 -- `HugeIcons.strokeRoundedCampfire`
789 -- `HugeIcons.strokeRoundedCancel01`
790 -- `HugeIcons.strokeRoundedCancel02`
791 -- `HugeIcons.strokeRoundedCancelCircleHalfDot`
792 -- `HugeIcons.strokeRoundedCancelCircle`
793 -- `HugeIcons.strokeRoundedCancelSquare`
794 -- `HugeIcons.strokeRoundedCandelier01`
795 -- `HugeIcons.strokeRoundedCandelier02`
796 -- `HugeIcons.strokeRoundedCanvas`
797 -- `HugeIcons.strokeRoundedCapProjecting`
798 -- `HugeIcons.strokeRoundedCapRound`
799 -- `HugeIcons.strokeRoundedCapStraight`
800 -- `HugeIcons.strokeRoundedCap`
801 -- `HugeIcons.strokeRoundedCapcutRectangle`
802 -- `HugeIcons.strokeRoundedCapcut`
803 -- `HugeIcons.strokeRoundedCar01`
804 -- `HugeIcons.strokeRoundedCar02`
805 -- `HugeIcons.strokeRoundedCar03`
806 -- `HugeIcons.strokeRoundedCar04`
807 -- `HugeIcons.strokeRoundedCar05`
808 -- `HugeIcons.strokeRoundedCarAlert`
809 -- `HugeIcons.strokeRoundedCarParking01`
810 -- `HugeIcons.strokeRoundedCarParking02`
811 -- `HugeIcons.strokeRoundedCarSignal`
812 -- `HugeIcons.strokeRoundedCarTime`
813 -- `HugeIcons.strokeRoundedCaravan`
814 -- `HugeIcons.strokeRoundedCardExchange01`
815 -- `HugeIcons.strokeRoundedCardExchange02`
816 -- `HugeIcons.strokeRoundedCardigan`
817 -- `HugeIcons.strokeRoundedCardiogram01`
818 -- `HugeIcons.strokeRoundedCardiogram02`
819 -- `HugeIcons.strokeRoundedCards01`
820 -- `HugeIcons.strokeRoundedCards02`
821 -- `HugeIcons.strokeRoundedCargoShip`
822 -- `HugeIcons.strokeRoundedCarouselHorizontal02`
823 -- `HugeIcons.strokeRoundedCarouselHorizontal`
824 -- `HugeIcons.strokeRoundedCarouselVertical`
825 -- `HugeIcons.strokeRoundedCarrot`
826 -- `HugeIcons.strokeRoundedCash01`
827 -- `HugeIcons.strokeRoundedCash02`
828 -- `HugeIcons.strokeRoundedCashbackBitcoin`
829 -- `HugeIcons.strokeRoundedCashbackEuro`
830 -- `HugeIcons.strokeRoundedCashbackPound`
831 -- `HugeIcons.strokeRoundedCashback`
832 -- `HugeIcons.strokeRoundedCashbackYen`
833 -- `HugeIcons.strokeRoundedCashier02`
834 -- `HugeIcons.strokeRoundedCashier`
835 -- `HugeIcons.strokeRoundedCastbox`
836 -- `HugeIcons.strokeRoundedCastle01`
837 -- `HugeIcons.strokeRoundedCastle02`
838 -- `HugeIcons.strokeRoundedCastle`
839 -- `HugeIcons.strokeRoundedCatalogue`
840 -- `HugeIcons.strokeRoundedCayanTower`
841 -- `HugeIcons.strokeRoundedCctvCamera`
842 -- `HugeIcons.strokeRoundedCd`
843 -- `HugeIcons.strokeRoundedCells`
844 -- `HugeIcons.strokeRoundedCellularNetworkOffline`
845 -- `HugeIcons.strokeRoundedCellularNetwork`
846 -- `HugeIcons.strokeRoundedCelsius`
847 -- `HugeIcons.strokeRoundedCenterFocus`
848 -- `HugeIcons.strokeRoundedCentralShaheedMinar`
849 -- `HugeIcons.strokeRoundedCentralized`
850 -- `HugeIcons.strokeRoundedCertificate01`
851 -- `HugeIcons.strokeRoundedCertificate02`
852 -- `HugeIcons.strokeRoundedChair01`
853 -- `HugeIcons.strokeRoundedChair02`
854 -- `HugeIcons.strokeRoundedChair03`
855 -- `HugeIcons.strokeRoundedChair04`
856 -- `HugeIcons.strokeRoundedChair05`
857 -- `HugeIcons.strokeRoundedChairBarber`
858 -- `HugeIcons.strokeRoundedChampion`
859 -- `HugeIcons.strokeRoundedChangeScreenMode`
860 -- `HugeIcons.strokeRoundedCharacterPhonetic`
861 -- `HugeIcons.strokeRoundedCharity`
862 -- `HugeIcons.strokeRoundedChart01`
863 -- `HugeIcons.strokeRoundedChart02`
864 -- `HugeIcons.strokeRoundedChart03`
865 -- `HugeIcons.strokeRoundedChartAverage`
866 -- `HugeIcons.strokeRoundedChartBarLine`
867 -- `HugeIcons.strokeRoundedChartBreakoutCircle`
868 -- `HugeIcons.strokeRoundedChartBreakoutSquare`
869 -- `HugeIcons.strokeRoundedChartBubble01`
870 -- `HugeIcons.strokeRoundedChartBubble02`
871 -- `HugeIcons.strokeRoundedChartColumn`
872 -- `HugeIcons.strokeRoundedChartDecrease`
873 -- `HugeIcons.strokeRoundedChartDown`
874 -- `HugeIcons.strokeRoundedChartEvaluation`
875 -- `HugeIcons.strokeRoundedChartHighLow`
876 -- `HugeIcons.strokeRoundedChartHistogram`
877 -- `HugeIcons.strokeRoundedChartIncrease`
878 -- `HugeIcons.strokeRoundedChartLineData01`
879 -- `HugeIcons.strokeRoundedChartLineData02`
880 -- `HugeIcons.strokeRoundedChartLineData03`
881 -- `HugeIcons.strokeRoundedChartMaximum`
882 -- `HugeIcons.strokeRoundedChartMedium`
883 -- `HugeIcons.strokeRoundedChartMinimum`
884 -- `HugeIcons.strokeRoundedChartRadar`
885 -- `HugeIcons.strokeRoundedChartRelationship`
886 -- `HugeIcons.strokeRoundedChartRing`
887 -- `HugeIcons.strokeRoundedChartRose`
888 -- `HugeIcons.strokeRoundedChartScatter`
889 -- `HugeIcons.strokeRoundedChart`
890 -- `HugeIcons.strokeRoundedChartUp`
891 -- `HugeIcons.strokeRoundedChatBot`
892 -- `HugeIcons.strokeRoundedChatGpt`
893 -- `HugeIcons.strokeRoundedChatting01`
894 -- `HugeIcons.strokeRoundedCheckList`
895 -- `HugeIcons.strokeRoundedCheckUnread01`
896 -- `HugeIcons.strokeRoundedCheckUnread02`
897 -- `HugeIcons.strokeRoundedCheckUnread03`
898 -- `HugeIcons.strokeRoundedCheckUnread04`
899 -- `HugeIcons.strokeRoundedCheckmarkBadge01`
900 -- `HugeIcons.strokeRoundedCheckmarkBadge02`
901 -- `HugeIcons.strokeRoundedCheckmarkBadge03`
902 -- `HugeIcons.strokeRoundedCheckmarkBadge04`
903 -- `HugeIcons.strokeRoundedCheckmarkCircle01`
904 -- `HugeIcons.strokeRoundedCheckmarkCircle02`
905 -- `HugeIcons.strokeRoundedCheckmarkCircle03`
906 -- `HugeIcons.strokeRoundedCheckmarkCircle04`
907 -- `HugeIcons.strokeRoundedCheckmarkSquare01`
908 -- `HugeIcons.strokeRoundedCheckmarkSquare02`
909 -- `HugeIcons.strokeRoundedCheckmarkSquare03`
910 -- `HugeIcons.strokeRoundedCheckmarkSquare04`
911 -- `HugeIcons.strokeRoundedCheeseCake01`
912 -- `HugeIcons.strokeRoundedCheeseCake02`
913 -- `HugeIcons.strokeRoundedCheese`
914 -- `HugeIcons.strokeRoundedChefHat`
915 -- `HugeIcons.strokeRoundedChef`
916 -- `HugeIcons.strokeRoundedChemistry01`
917 -- `HugeIcons.strokeRoundedChemistry02`
918 -- `HugeIcons.strokeRoundedChemistry03`
919 -- `HugeIcons.strokeRoundedCherry`
920 -- `HugeIcons.strokeRoundedChess01`
921 -- `HugeIcons.strokeRoundedChess02`
922 -- `HugeIcons.strokeRoundedChessPawn`
923 -- `HugeIcons.strokeRoundedChickenThighs`
924 -- `HugeIcons.strokeRoundedChild`
925 -- `HugeIcons.strokeRoundedChimney`
926 -- `HugeIcons.strokeRoundedChinaTemple`
927 -- `HugeIcons.strokeRoundedChip02`
928 -- `HugeIcons.strokeRoundedChip`
929 -- `HugeIcons.strokeRoundedChocolate`
930 -- `HugeIcons.strokeRoundedChopsticks`
931 -- `HugeIcons.strokeRoundedChrome`
932 -- `HugeIcons.strokeRoundedChrysler`
933 -- `HugeIcons.strokeRoundedChurch`
934 -- `HugeIcons.strokeRoundedCinnamonRoll`
935 -- `HugeIcons. static const List<List<dynamic>>`
936 -- `HugeIcons. static const List<List<dynamic>>`
937 -- `HugeIcons. static const List<List<dynamic>>`
938 -- `HugeIcons.strokeRoundedCircleArrowDiagonal01`
939 -- `HugeIcons.strokeRoundedCircleArrowDiagonal02`
940 -- `HugeIcons.strokeRoundedCircleArrowDown01`
941 -- `HugeIcons.strokeRoundedCircleArrowDown02`
942 -- `HugeIcons.strokeRoundedCircleArrowDown03`
943 -- `HugeIcons.strokeRoundedCircleArrowDownDouble`
944 -- `HugeIcons.strokeRoundedCircleArrowDownLeft`
945 -- `HugeIcons.strokeRoundedCircleArrowDownRight`
946 -- `HugeIcons.strokeRoundedCircleArrowExpand01`
947 -- `HugeIcons.strokeRoundedCircleArrowExpand02`
948 -- `HugeIcons.strokeRoundedCircleArrowHorizontal`
949 -- `HugeIcons.strokeRoundedCircleArrowLeft01`
950 -- `HugeIcons.strokeRoundedCircleArrowLeft02`
951 -- `HugeIcons.strokeRoundedCircleArrowLeft03`
952 -- `HugeIcons.strokeRoundedCircleArrowLeftDouble`
953 -- `HugeIcons.strokeRoundedCircleArrowLeftRight`
954 -- `HugeIcons.strokeRoundedCircleArrowMoveDownLeft`
955 -- `HugeIcons.strokeRoundedCircleArrowMoveDownRight`
956 -- `HugeIcons.strokeRoundedCircleArrowMoveLeftDown`
957 -- `HugeIcons.strokeRoundedCircleArrowMoveRightDown`
958 -- `HugeIcons.strokeRoundedCircleArrowMoveUpLeft`
959 -- `HugeIcons.strokeRoundedCircleArrowMoveUpRight`
960 -- `HugeIcons.strokeRoundedCircleArrowReload01`
961 -- `HugeIcons.strokeRoundedCircleArrowReload02`
962 -- `HugeIcons.strokeRoundedCircleArrowRight01`
963 -- `HugeIcons.strokeRoundedCircleArrowRight02`
964 -- `HugeIcons.strokeRoundedCircleArrowRight03`
965 -- `HugeIcons.strokeRoundedCircleArrowRightDouble`
966 -- `HugeIcons.strokeRoundedCircleArrowShrink01`
967 -- `HugeIcons.strokeRoundedCircleArrowShrink02`
968 -- `HugeIcons.strokeRoundedCircleArrowUp01`
969 -- `HugeIcons.strokeRoundedCircleArrowUp02`
970 -- `HugeIcons.strokeRoundedCircleArrowUp03`
971 -- `HugeIcons.strokeRoundedCircleArrowUpDouble`
972 -- `HugeIcons.strokeRoundedCircleArrowUpDown`
973 -- `HugeIcons.strokeRoundedCircleArrowUpLeft`
974 -- `HugeIcons.strokeRoundedCircleArrowUpRight02`
975 -- `HugeIcons.strokeRoundedCircleArrowUpRight`
976 -- `HugeIcons.strokeRoundedCircleArrowVertical`
977 -- `HugeIcons.strokeRoundedCircleLock01`
978 -- `HugeIcons.strokeRoundedCircleLock02`
979 -- `HugeIcons.strokeRoundedCircleLockAdd01`
980 -- `HugeIcons.strokeRoundedCircleLockAdd02`
981 -- `HugeIcons.strokeRoundedCircleLockCheck01`
982 -- `HugeIcons.strokeRoundedCircleLockCheck02`
983 -- `HugeIcons.strokeRoundedCircleLockMinus01`
984 -- `HugeIcons.strokeRoundedCircleLockMinus02`
985 -- `HugeIcons.strokeRoundedCircleLockRemove01`
986 -- `HugeIcons.strokeRoundedCircleLockRemove02`
987 -- `HugeIcons.strokeRoundedCirclePassword`
988 -- `HugeIcons.strokeRoundedCircle`
989 -- `HugeIcons.strokeRoundedCircleUnlock01`
990 -- `HugeIcons.strokeRoundedCircleUnlock02`
991 -- `HugeIcons.strokeRoundedCity01`
992 -- `HugeIcons.strokeRoundedCity02`
993 -- `HugeIcons.strokeRoundedCity03`
994 -- `HugeIcons.strokeRoundedClapping01`
995 -- `HugeIcons.strokeRoundedClapping02`
996 -- `HugeIcons.strokeRoundedClaude`
997 -- `HugeIcons.strokeRoundedClean`
998 -- `HugeIcons.strokeRoundedCleaningBucket`
999 -- `HugeIcons.strokeRoundedClinic`
1000 -- `HugeIcons.strokeRoundedClip`
1001 -- `HugeIcons.strokeRoundedCliparts`
1002 -- `HugeIcons.strokeRoundedClipboard`
1003 -- `HugeIcons.strokeRoundedClock01`
1004 -- `HugeIcons.strokeRoundedClock02`
1005 -- `HugeIcons.strokeRoundedClock03`
1006 -- `HugeIcons.strokeRoundedClock04`
1007 -- `HugeIcons.strokeRoundedClock05`
1008 -- `HugeIcons.strokeRoundedClosedCaptionAlt`
1009 -- `HugeIcons.strokeRoundedClosedCaption`
1010 -- `HugeIcons.strokeRoundedClothes`
1011 -- `HugeIcons.strokeRoundedCloudAngledRain`
1012 -- `HugeIcons.strokeRoundedCloudAngledRainZap`
1013 -- `HugeIcons.strokeRoundedCloudAngledZap`
1014 -- `HugeIcons.strokeRoundedCloudBigRain`
1015 -- `HugeIcons.strokeRoundedCloudDownload`
1016 -- `HugeIcons.strokeRoundedCloudFastWind`
1017 -- `HugeIcons.strokeRoundedCloudHailstone`
1018 -- `HugeIcons.strokeRoundedCloudLittleRain`
1019 -- `HugeIcons.strokeRoundedCloudLittleSnow`
1020 -- `HugeIcons.strokeRoundedCloudLoading`
1021 -- `HugeIcons.strokeRoundedCloudMidRain`
1022 -- `HugeIcons.strokeRoundedCloudMidSnow`
1023 -- `HugeIcons.strokeRoundedCloudSavingDone01`
1024 -- `HugeIcons.strokeRoundedCloudSavingDone02`
1025 -- `HugeIcons.strokeRoundedCloudServer`
1026 -- `HugeIcons.strokeRoundedCloudSlowWind`
1027 -- `HugeIcons.strokeRoundedCloudSnow`
1028 -- `HugeIcons.strokeRoundedCloud`
1029 -- `HugeIcons.strokeRoundedCloudUpload`
1030 -- `HugeIcons.strokeRoundedClubs01`
1031 -- `HugeIcons.strokeRoundedClubs02`
1032 -- `HugeIcons.strokeRoundedCoPresent`
1033 -- `HugeIcons.strokeRoundedCodeCircle`
1034 -- `HugeIcons.strokeRoundedCodeFolder`
1035 -- `HugeIcons.strokeRoundedCodeSquare`
1036 -- `HugeIcons.strokeRoundedCode`
1037 -- `HugeIcons.strokeRoundedCodesandbox`
1038 -- `HugeIcons.strokeRoundedCoffee01`
1039 -- `HugeIcons.strokeRoundedCoffee02`
1040 -- `HugeIcons.strokeRoundedCoffeeBeans`
1041 -- `HugeIcons.strokeRoundedCoinbase`
1042 -- `HugeIcons.strokeRoundedCoins01`
1043 -- `HugeIcons.strokeRoundedCoins02`
1044 -- `HugeIcons.strokeRoundedCoinsBitcoin`
1045 -- `HugeIcons.strokeRoundedCoinsDollar`
1046 -- `HugeIcons.strokeRoundedCoinsEuro`
1047 -- `HugeIcons.strokeRoundedCoinsPound`
1048 -- `HugeIcons.strokeRoundedCoinsSwap`
1049 -- `HugeIcons.strokeRoundedCoinsYen`
1050 -- `HugeIcons.strokeRoundedCollectionsBookmark`
1051 -- `HugeIcons.strokeRoundedColorPicker`
1052 -- `HugeIcons.strokeRoundedColors`
1053 -- `HugeIcons.strokeRoundedColosseum`
1054 -- `HugeIcons.strokeRoundedColumnDelete`
1055 -- `HugeIcons.strokeRoundedColumnInsert`
1056 -- `HugeIcons.strokeRoundedComet01`
1057 -- `HugeIcons.strokeRoundedComet02`
1058 -- `HugeIcons.strokeRoundedComingSoon01`
1059 -- `HugeIcons.strokeRoundedComingSoon02`
1060 -- `HugeIcons.strokeRoundedCommandLine`
1061 -- `HugeIcons.strokeRoundedCommand`
1062 -- `HugeIcons.strokeRoundedComment01`
1063 -- `HugeIcons.strokeRoundedComment02`
1064 -- `HugeIcons.strokeRoundedComment03`
1065 -- `HugeIcons.strokeRoundedCommentAdd01`
1066 -- `HugeIcons.strokeRoundedCommentAdd02`
1067 -- `HugeIcons.strokeRoundedCommentAdd03`
1068 -- `HugeIcons.strokeRoundedCommentBlock01`
1069 -- `HugeIcons.strokeRoundedCommentBlock02`
1070 -- `HugeIcons.strokeRoundedCommentBlock03`
1071 -- `HugeIcons.strokeRoundedCommentRemove01`
1072 -- `HugeIcons.strokeRoundedCommentRemove02`
1073 -- `HugeIcons.strokeRoundedCommentRemove03`
1074 -- `HugeIcons.strokeRoundedCompass01`
1075 -- `HugeIcons.strokeRoundedCompass`
1076 -- `HugeIcons.strokeRoundedComplaint`
1077 -- `HugeIcons.strokeRoundedComputerActivity`
1078 -- `HugeIcons.strokeRoundedComputerAdd`
1079 -- `HugeIcons.strokeRoundedComputerArrowDown`
1080 -- `HugeIcons.strokeRoundedComputerArrowUp`
1081 -- `HugeIcons.strokeRoundedComputerChartDown`
1082 -- `HugeIcons.strokeRoundedComputerChartUp`
1083 -- `HugeIcons.strokeRoundedComputerCheck`
1084 -- `HugeIcons.strokeRoundedComputerCloud`
1085 -- `HugeIcons.strokeRoundedComputerDesk01`
1086 -- `HugeIcons.strokeRoundedComputerDesk02`
1087 -- `HugeIcons.strokeRoundedComputerDesk03`
1088 -- `HugeIcons.strokeRoundedComputerDollar`
1089 -- `HugeIcons.strokeRoundedComputerEthernet`
1090 -- `HugeIcons.strokeRoundedComputerPhoneSync`
1091 -- `HugeIcons.strokeRoundedComputerProgramming01`
1092 -- `HugeIcons.strokeRoundedComputerProgramming02`
1093 -- `HugeIcons.strokeRoundedComputerProtection`
1094 -- `HugeIcons.strokeRoundedComputerRemove`
1095 -- `HugeIcons.strokeRoundedComputerScreenShare`
1096 -- `HugeIcons.strokeRoundedComputerSettings`
1097 -- `HugeIcons.strokeRoundedComputer`
1098 -- `HugeIcons.strokeRoundedComputerTerminal01`
1099 -- `HugeIcons.strokeRoundedComputerTerminal02`
1100 -- `HugeIcons.strokeRoundedComputerUser`
1101 -- `HugeIcons.strokeRoundedComputerVideoCall`
1102 -- `HugeIcons.strokeRoundedComputerVideo`
1103 -- `HugeIcons.strokeRoundedCone01`
1104 -- `HugeIcons.strokeRoundedCone02`
1105 -- `HugeIcons.strokeRoundedConference`
1106 -- `HugeIcons.strokeRoundedConfiguration01`
1107 -- `HugeIcons.strokeRoundedConfiguration02`
1108 -- `HugeIcons.strokeRoundedConfused`
1109 -- `HugeIcons.strokeRoundedCongruentToCircle`
1110 -- `HugeIcons.strokeRoundedCongruentToSquare`
1111 -- `HugeIcons.strokeRoundedCongruentTo`
1112 -- `HugeIcons.strokeRoundedConnect`
1113 -- `HugeIcons.strokeRoundedConsole`
1114 -- `HugeIcons.strokeRoundedConstellation`
1115 -- `HugeIcons.strokeRoundedContact01`
1116 -- `HugeIcons.strokeRoundedContact02`
1117 -- `HugeIcons.strokeRoundedContactBook`
1118 -- `HugeIcons.strokeRoundedContact`
1119 -- `HugeIcons.strokeRoundedContainerTruck01`
1120 -- `HugeIcons.strokeRoundedContainerTruck02`
1121 -- `HugeIcons.strokeRoundedContainerTruck`
1122 -- `HugeIcons.strokeRoundedContentWriting`
1123 -- `HugeIcons.strokeRoundedContracts`
1124 -- `HugeIcons.strokeRoundedConversation`
1125 -- `HugeIcons.strokeRoundedCookBook`
1126 -- `HugeIcons.strokeRoundedCookie`
1127 -- `HugeIcons.strokeRoundedCoordinate01`
1128 -- `HugeIcons.strokeRoundedCoordinate02`
1129 -- `HugeIcons.strokeRoundedCopilot`
1130 -- `HugeIcons.strokeRoundedCopy01`
1131 -- `HugeIcons.strokeRoundedCopy02`
1132 -- `HugeIcons.strokeRoundedCopyLink`
1133 -- `HugeIcons.strokeRoundedCopyright`
1134 -- `HugeIcons.strokeRoundedCorn`
1135 -- `HugeIcons.strokeRoundedCorporate`
1136 -- `HugeIcons.strokeRoundedCos`
1137 -- `HugeIcons.strokeRoundedCosine01`
1138 -- `HugeIcons.strokeRoundedCosine02`
1139 -- `HugeIcons.strokeRoundedCottage`
1140 -- `HugeIcons.strokeRoundedCottonCandy`
1141 -- `HugeIcons.strokeRoundedCoupon01`
1142 -- `HugeIcons.strokeRoundedCoupon02`
1143 -- `HugeIcons.strokeRoundedCoupon03`
1144 -- `HugeIcons.strokeRoundedCouponPercent`
1145 -- `HugeIcons.strokeRoundedCourse`
1146 -- `HugeIcons.strokeRoundedCourtHouse`
1147 -- `HugeIcons.strokeRoundedCourtLaw`
1148 -- `HugeIcons.strokeRoundedCovariate`
1149 -- `HugeIcons.strokeRoundedCovidInfo`
1150 -- `HugeIcons.strokeRoundedCowboyHat`
1151 -- `HugeIcons.strokeRoundedCpp`
1152 -- `HugeIcons.strokeRoundedCpuCharge`
1153 -- `HugeIcons.strokeRoundedCpuSettings`
1154 -- `HugeIcons.strokeRoundedCpu`
1155 -- `HugeIcons.strokeRoundedCrab`
1156 -- `HugeIcons.strokeRoundedCrane`
1157 -- `HugeIcons.strokeRoundedCrazy`
1158 -- `HugeIcons.strokeRoundedCreativeMarket`
1159 -- `HugeIcons.strokeRoundedCreditCardAccept`
1160 -- `HugeIcons.strokeRoundedCreditCardAdd`
1161 -- `HugeIcons.strokeRoundedCreditCardChange`
1162 -- `HugeIcons.strokeRoundedCreditCardDefrost`
1163 -- `HugeIcons.strokeRoundedCreditCardFreeze`
1164 -- `HugeIcons.strokeRoundedCreditCardNotAccept`
1165 -- `HugeIcons.strokeRoundedCreditCardNotFound`
1166 -- `HugeIcons.strokeRoundedCreditCardPos`
1167 -- `HugeIcons.strokeRoundedCreditCard`
1168 -- `HugeIcons.strokeRoundedCreditCardValidation`
1169 -- `HugeIcons.strokeRoundedCricketBat`
1170 -- `HugeIcons.strokeRoundedCricketHelmet`
1171 -- `HugeIcons.strokeRoundedCroissant`
1172 -- `HugeIcons.strokeRoundedCrop`
1173 -- `HugeIcons.strokeRoundedCrowdfunding`
1174 -- `HugeIcons.strokeRoundedCrown02`
1175 -- `HugeIcons.strokeRoundedCrown03`
1176 -- `HugeIcons.strokeRoundedCrownMinus`
1177 -- `HugeIcons.strokeRoundedCrownPlus`
1178 -- `HugeIcons.strokeRoundedCrown`
1179 -- `HugeIcons.strokeRoundedCrying`
1180 -- `HugeIcons.strokeRoundedCss3`
1181 -- `HugeIcons.strokeRoundedCssFile01`
1182 -- `HugeIcons.strokeRoundedCssFile02`
1183 -- `HugeIcons.strokeRoundedCsv01`
1184 -- `HugeIcons.strokeRoundedCsv02`
1185 -- `HugeIcons.strokeRoundedCube`
1186 -- `HugeIcons.strokeRoundedCupcake01`
1187 -- `HugeIcons.strokeRoundedCupcake02`
1188 -- `HugeIcons.strokeRoundedCupcake03`
1189 -- `HugeIcons.strokeRoundedCurling`
1190 -- `HugeIcons.strokeRoundedCursor01`
1191 -- `HugeIcons.strokeRoundedCursor02`
1192 -- `HugeIcons.strokeRoundedCursorAddSelection01`
1193 -- `HugeIcons.strokeRoundedCursorAddSelection02`
1194 -- `HugeIcons.strokeRoundedCursorCircleSelection01`
1195 -- `HugeIcons.strokeRoundedCursorCircleSelection02`
1196 -- `HugeIcons.strokeRoundedCursorDisabled01`
1197 -- `HugeIcons.strokeRoundedCursorDisabled02`
1198 -- `HugeIcons.strokeRoundedCursorEdit01`
1199 -- `HugeIcons.strokeRoundedCursorEdit02`
1200 -- `HugeIcons.strokeRoundedCursorHold01`
1201 -- `HugeIcons.strokeRoundedCursorHold02`
1202 -- `HugeIcons.strokeRoundedCursorInWindow`
1203 -- `HugeIcons.strokeRoundedCursorInfo01`
1204 -- `HugeIcons.strokeRoundedCursorInfo02`
1205 -- `HugeIcons.strokeRoundedCursorLoading01`
1206 -- `HugeIcons.strokeRoundedCursorLoading02`
1207 -- `HugeIcons.strokeRoundedCursorMagicSelection01`
1208 -- `HugeIcons.strokeRoundedCursorMagicSelection02`
1209 -- `HugeIcons.strokeRoundedCursorMagicSelection03`
1210 -- `HugeIcons.strokeRoundedCursorMagicSelection04`
1211 -- `HugeIcons.strokeRoundedCursorMove01`
1212 -- `HugeIcons.strokeRoundedCursorMove02`
1213 -- `HugeIcons.strokeRoundedCursorPointer01`
1214 -- `HugeIcons.strokeRoundedCursorPointer02`
1215 -- `HugeIcons.strokeRoundedCursorProgress01`
1216 -- `HugeIcons.strokeRoundedCursorProgress02`
1217 -- `HugeIcons.strokeRoundedCursorProgress03`
1218 -- `HugeIcons.strokeRoundedCursorProgress04`
1219 -- `HugeIcons.strokeRoundedCursorRectangleSelection01`
1220 -- `HugeIcons.strokeRoundedCursorRectangleSelection02`
1221 -- `HugeIcons.strokeRoundedCursorRemoveSelection01`
1222 -- `HugeIcons.strokeRoundedCursorRemoveSelection02`
1223 -- `HugeIcons.strokeRoundedCursorText`
1224 -- `HugeIcons.strokeRoundedCurtains`
1225 -- `HugeIcons.strokeRoundedCurvyLeftDirection`
1226 -- `HugeIcons.strokeRoundedCurvyLeftRightDirection`
1227 -- `HugeIcons.strokeRoundedCurvyRightDirection`
1228 -- `HugeIcons.strokeRoundedCurvyUpDownDirection`
1229 -- `HugeIcons.strokeRoundedCustomField`
1230 -- `HugeIcons.strokeRoundedCustomerService01`
1231 -- `HugeIcons.strokeRoundedCustomerService02`
1232 -- `HugeIcons.strokeRoundedCustomerService`
1233 -- `HugeIcons.strokeRoundedCustomerSupport`
1234 -- `HugeIcons.strokeRoundedCustomize`
1235 -- `HugeIcons.strokeRoundedCylinder01`
1236 -- `HugeIcons.strokeRoundedCylinder02`
1237 -- `HugeIcons.strokeRoundedCylinder03`
1238 -- `HugeIcons.strokeRoundedCylinder04`
1239 -- `HugeIcons.strokeRoundedDanger`
1240 -- `HugeIcons.strokeRoundedDarkMode`
1241 -- `HugeIcons.strokeRoundedDart`
1242 -- `HugeIcons.strokeRoundedDashboardBrowsing`
1243 -- `HugeIcons.strokeRoundedDashboardCircleAdd`
1244 -- `HugeIcons.strokeRoundedDashboardCircleEdit`
1245 -- `HugeIcons.strokeRoundedDashboardCircleRemove`
1246 -- `HugeIcons.strokeRoundedDashboardCircleSettings`
1247 -- `HugeIcons.strokeRoundedDashboardCircle`
1248 -- `HugeIcons.strokeRoundedDashboardSpeed01`
1249 -- `HugeIcons.strokeRoundedDashboardSpeed02`
1250 -- `HugeIcons.strokeRoundedDashboardSquare01`
1251 -- `HugeIcons.strokeRoundedDashboardSquare02`
1252 -- `HugeIcons.strokeRoundedDashboardSquare03`
1253 -- `HugeIcons.strokeRoundedDashboardSquareAdd`
1254 -- `HugeIcons.strokeRoundedDashboardSquareEdit`
1255 -- `HugeIcons.strokeRoundedDashboardSquareRemove`
1256 -- `HugeIcons.strokeRoundedDashboardSquareSetting`
1257 -- `HugeIcons.strokeRoundedDashedLine01`
1258 -- `HugeIcons.strokeRoundedDashedLine02`
1259 -- `HugeIcons.strokeRoundedDashedLineCircle`
1260 -- `HugeIcons.strokeRoundedDataRecovery`
1261 -- `HugeIcons.strokeRoundedDatabase01`
1262 -- `HugeIcons.strokeRoundedDatabase02`
1263 -- `HugeIcons.strokeRoundedDatabaseAdd`
1264 -- `HugeIcons.strokeRoundedDatabaseExport`
1265 -- `HugeIcons.strokeRoundedDatabaseImport`
1266 -- `HugeIcons.strokeRoundedDatabaseLocked`
1267 -- `HugeIcons.strokeRoundedDatabaseRestore`
1268 -- `HugeIcons.strokeRoundedDatabaseSetting`
1269 -- `HugeIcons.strokeRoundedDatabase`
1270 -- `HugeIcons.strokeRoundedDatabaseSync01`
1271 -- `HugeIcons.strokeRoundedDatabaseSync`
1272 -- `HugeIcons.strokeRoundedDateTime`
1273 -- `HugeIcons.strokeRoundedDates`
1274 -- `HugeIcons.strokeRoundedDatev`
1275 -- `HugeIcons.strokeRoundedDead`
1276 -- `HugeIcons.strokeRoundedDeepseek`
1277 -- `HugeIcons.strokeRoundedDelete01`
1278 -- `HugeIcons.strokeRoundedDelete02`
1279 -- `HugeIcons.strokeRoundedDelete03`
1280 -- `HugeIcons.strokeRoundedDelete04`
1281 -- `HugeIcons.strokeRoundedDeleteColumn`
1282 -- `HugeIcons.strokeRoundedDeletePutBack`
1283 -- `HugeIcons.strokeRoundedDeleteRow`
1284 -- `HugeIcons.strokeRoundedDeleteThrow`
1285 -- `HugeIcons.strokeRoundedDeliveredSent`
1286 -- `HugeIcons.strokeRoundedDeliveryBox01`
1287 -- `HugeIcons.strokeRoundedDeliveryBox02`
1288 -- `HugeIcons.strokeRoundedDeliveryDelay01`
1289 -- `HugeIcons.strokeRoundedDeliveryDelay02`
1290 -- `HugeIcons.strokeRoundedDeliveryReturn01`
1291 -- `HugeIcons.strokeRoundedDeliveryReturn02`
1292 -- `HugeIcons.strokeRoundedDeliverySecure01`
1293 -- `HugeIcons.strokeRoundedDeliverySecure02`
1294 -- `HugeIcons.strokeRoundedDeliverySent01`
1295 -- `HugeIcons.strokeRoundedDeliverySent02`
1296 -- `HugeIcons.strokeRoundedDeliveryTracking01`
1297 -- `HugeIcons.strokeRoundedDeliveryTracking02`
1298 -- `HugeIcons.strokeRoundedDeliveryTruck01`
1299 -- `HugeIcons.strokeRoundedDeliveryTruck02`
1300 -- `HugeIcons.strokeRoundedDeliveryView01`
1301 -- `HugeIcons.strokeRoundedDeliveryView02`
1302 -- `HugeIcons.strokeRoundedDentalBraces`
1303 -- `HugeIcons.strokeRoundedDentalBrokenTooth`
1304 -- `HugeIcons.strokeRoundedDentalCare`
1305 -- `HugeIcons.strokeRoundedDentalTooth`
1306 -- `HugeIcons.strokeRoundedDepartement`
1307 -- `HugeIcons.strokeRoundedDesert`
1308 -- `HugeIcons.strokeRoundedDesk01`
1309 -- `HugeIcons.strokeRoundedDesk02`
1310 -- `HugeIcons.strokeRoundedDesk`
1311 -- `HugeIcons.strokeRoundedDetergent`
1312 -- `HugeIcons.strokeRoundedDeveloper`
1313 -- `HugeIcons.strokeRoundedDeviantart`
1314 -- `HugeIcons.strokeRoundedDeviceAccess`
1315 -- `HugeIcons.strokeRoundedDiagonalScrollPoint01`
1316 -- `HugeIcons.strokeRoundedDiagonalScrollPoint02`
1317 -- `HugeIcons.strokeRoundedDialpadCircle01`
1318 -- `HugeIcons.strokeRoundedDialpadCircle02`
1319 -- `HugeIcons.strokeRoundedDialpadSquare01`
1320 -- `HugeIcons.strokeRoundedDialpadSquare02`
1321 -- `HugeIcons.strokeRoundedDiameter`
1322 -- `HugeIcons.strokeRoundedDiamond01`
1323 -- `HugeIcons.strokeRoundedDiamond02`
1324 -- `HugeIcons.strokeRoundedDiamond`
1325 -- `HugeIcons.strokeRoundedDiaper`
1326 -- `HugeIcons.strokeRoundedDiceFaces01`
1327 -- `HugeIcons.strokeRoundedDiceFaces02`
1328 -- `HugeIcons.strokeRoundedDiceFaces03`
1329 -- `HugeIcons.strokeRoundedDiceFaces04`
1330 -- `HugeIcons.strokeRoundedDiceFaces05`
1331 -- `HugeIcons.strokeRoundedDiceFaces06`
1332 -- `HugeIcons.strokeRoundedDice`
1333 -- `HugeIcons.strokeRoundedDigestion`
1334 -- `HugeIcons.strokeRoundedDigg`
1335 -- `HugeIcons.strokeRoundedDigitalClock`
1336 -- `HugeIcons.strokeRoundedDimSum01`
1337 -- `HugeIcons.strokeRoundedDimSum02`
1338 -- `HugeIcons.strokeRoundedDiningTable`
1339 -- `HugeIcons.strokeRoundedDiploma`
1340 -- `HugeIcons.strokeRoundedDirectionLeft01`
1341 -- `HugeIcons.strokeRoundedDirectionLeft02`
1342 -- `HugeIcons.strokeRoundedDirectionRight01`
1343 -- `HugeIcons.strokeRoundedDirectionRight02`
1344 -- `HugeIcons.strokeRoundedDirections01`
1345 -- `HugeIcons.strokeRoundedDirections02`
1346 -- `HugeIcons.strokeRoundedDirham`
1347 -- `HugeIcons.strokeRoundedDisability01`
1348 -- `HugeIcons.strokeRoundedDisability02`
1349 -- `HugeIcons.strokeRoundedDiscord`
1350 -- `HugeIcons.strokeRoundedDiscount01`
1351 -- `HugeIcons.strokeRoundedDiscount`
1352 -- `HugeIcons.strokeRoundedDiscountTag01`
1353 -- `HugeIcons.strokeRoundedDiscountTag02`
1354 -- `HugeIcons.strokeRoundedDiscoverCircle`
1355 -- `HugeIcons.strokeRoundedDiscoverSquare`
1356 -- `HugeIcons.strokeRoundedDish01`
1357 -- `HugeIcons.strokeRoundedDish02`
1358 -- `HugeIcons.strokeRoundedDishWasher`
1359 -- `HugeIcons.strokeRoundedDispleased`
1360 -- `HugeIcons.strokeRoundedDistributeHorizontalCenter`
1361 -- `HugeIcons.strokeRoundedDistributeHorizontalLeft`
1362 -- `HugeIcons.strokeRoundedDistributeHorizontalRight`
1363 -- `HugeIcons.strokeRoundedDistributeVerticalBottom`
1364 -- `HugeIcons.strokeRoundedDistributeVerticalCenter`
1365 -- `HugeIcons.strokeRoundedDistributeVerticalTop`
1366 -- `HugeIcons.strokeRoundedDistribution`
1367 -- `HugeIcons.strokeRoundedDivideSignCircle`
1368 -- `HugeIcons.strokeRoundedDivideSignSquare`
1369 -- `HugeIcons.strokeRoundedDivideSign`
1370 -- `HugeIcons.strokeRoundedDna01`
1371 -- `HugeIcons.strokeRoundedDna`
1372 -- `HugeIcons.strokeRoundedDoNotTouch01`
1373 -- `HugeIcons.strokeRoundedDoNotTouch02`
1374 -- `HugeIcons.strokeRoundedDoc01`
1375 -- `HugeIcons.strokeRoundedDoc02`
1376 -- `HugeIcons.strokeRoundedDoctor01`
1377 -- `HugeIcons.strokeRoundedDoctor02`
1378 -- `HugeIcons.strokeRoundedDoctor03`
1379 -- `HugeIcons.strokeRoundedDocumentAttachment`
1380 -- `HugeIcons.strokeRoundedDocumentCode`
1381 -- `HugeIcons.strokeRoundedDocumentValidation`
1382 -- `HugeIcons.strokeRoundedDollar01`
1383 -- `HugeIcons.strokeRoundedDollar02`
1384 -- `HugeIcons.strokeRoundedDollarCircle`
1385 -- `HugeIcons.strokeRoundedDollarReceive01`
1386 -- `HugeIcons.strokeRoundedDollarReceive02`
1387 -- `HugeIcons.strokeRoundedDollarSend01`
1388 -- `HugeIcons.strokeRoundedDollarSend02`
1389 -- `HugeIcons.strokeRoundedDollarSquare`
1390 -- `HugeIcons.strokeRoundedDome`
1391 -- `HugeIcons.strokeRoundedDomino`
1392 -- `HugeIcons.strokeRoundedDoor01`
1393 -- `HugeIcons.strokeRoundedDoor02`
1394 -- `HugeIcons.strokeRoundedDoorLock`
1395 -- `HugeIcons.strokeRoundedDoor`
1396 -- `HugeIcons.strokeRoundedDoughnut`
1397 -- `HugeIcons.strokeRoundedDownload01`
1398 -- `HugeIcons.strokeRoundedDownload02`
1399 -- `HugeIcons.strokeRoundedDownload03`
1400 -- `HugeIcons.strokeRoundedDownload04`
1401 -- `HugeIcons.strokeRoundedDownload05`
1402 -- `HugeIcons.strokeRoundedDownloadCircle01`
1403 -- `HugeIcons.strokeRoundedDownloadCircle02`
1404 -- `HugeIcons.strokeRoundedDownloadSquare01`
1405 -- `HugeIcons.strokeRoundedDownloadSquare02`
1406 -- `HugeIcons.strokeRoundedDrag01`
1407 -- `HugeIcons.strokeRoundedDrag02`
1408 -- `HugeIcons.strokeRoundedDrag03`
1409 -- `HugeIcons.strokeRoundedDrag04`
1410 -- `HugeIcons.strokeRoundedDragDropHorizontal`
1411 -- `HugeIcons.strokeRoundedDragDrop`
1412 -- `HugeIcons.strokeRoundedDragDropVertical`
1413 -- `HugeIcons.strokeRoundedDragLeft01`
1414 -- `HugeIcons.strokeRoundedDragLeft02`
1415 -- `HugeIcons.strokeRoundedDragLeft03`
1416 -- `HugeIcons.strokeRoundedDragLeft04`
1417 -- `HugeIcons.strokeRoundedDragRight01`
1418 -- `HugeIcons.strokeRoundedDragRight02`
1419 -- `HugeIcons.strokeRoundedDragRight03`
1420 -- `HugeIcons.strokeRoundedDragRight04`
1421 -- `HugeIcons.strokeRoundedDrawingCompass`
1422 -- `HugeIcons.strokeRoundedDrawingMode`
1423 -- `HugeIcons.strokeRoundedDress01`
1424 -- `HugeIcons.strokeRoundedDress02`
1425 -- `HugeIcons.strokeRoundedDress03`
1426 -- `HugeIcons.strokeRoundedDress04`
1427 -- `HugeIcons.strokeRoundedDress05`
1428 -- `HugeIcons.strokeRoundedDress06`
1429 -- `HugeIcons.strokeRoundedDress07`
1430 -- `HugeIcons.strokeRoundedDressingTable01`
1431 -- `HugeIcons.strokeRoundedDressingTable02`
1432 -- `HugeIcons.strokeRoundedDressingTable03`
1433 -- `HugeIcons.strokeRoundedDribbble`
1434 -- `HugeIcons.strokeRoundedDrink`
1435 -- `HugeIcons.strokeRoundedDrive`
1436 -- `HugeIcons.strokeRoundedDrone`
1437 -- `HugeIcons.strokeRoundedDrooling`
1438 -- `HugeIcons.strokeRoundedDropbox`
1439 -- `HugeIcons.strokeRoundedDroplet`
1440 -- `HugeIcons.strokeRoundedDropper`
1441 -- `HugeIcons.strokeRoundedDs3Tool`
1442 -- `HugeIcons.strokeRoundedDua`
1443 -- `HugeIcons.strokeRoundedDumbbell01`
1444 -- `HugeIcons.strokeRoundedDumbbell02`
1445 -- `HugeIcons.strokeRoundedDumbbell03`
1446 -- `HugeIcons.strokeRoundedEarRings01`
1447 -- `HugeIcons.strokeRoundedEarRings02`
1448 -- `HugeIcons.strokeRoundedEarRings03`
1449 -- `HugeIcons.strokeRoundedEar`
1450 -- `HugeIcons.strokeRoundedEarth`
1451 -- `HugeIcons.strokeRoundedEaseCurveControlPoints`
1452 -- `HugeIcons.strokeRoundedEaseInControlPoint`
1453 -- `HugeIcons.strokeRoundedEaseInOut`
1454 -- `HugeIcons.strokeRoundedEaseIn`
1455 -- `HugeIcons.strokeRoundedEaseOutControlPoint`
1456 -- `HugeIcons.strokeRoundedEaseOut`
1457 -- `HugeIcons.strokeRoundedEcoEnergy`
1458 -- `HugeIcons.strokeRoundedEcoLab01`
1459 -- `HugeIcons.strokeRoundedEcoLab02`
1460 -- `HugeIcons.strokeRoundedEcoLab`
1461 -- `HugeIcons.strokeRoundedEcoPower`
1462 -- `HugeIcons.strokeRoundedEdgeStyle`
1463 -- `HugeIcons.strokeRoundedEdit01`
1464 -- `HugeIcons.strokeRoundedEdit02`
1465 -- `HugeIcons.strokeRoundedEdit03`
1466 -- `HugeIcons.strokeRoundedEdit04`
1467 -- `HugeIcons.strokeRoundedEditOff03`
1468 -- `HugeIcons.strokeRoundedEditOff04`
1469 -- `HugeIcons.strokeRoundedEditOff`
1470 -- `HugeIcons.strokeRoundedEditRoad`
1471 -- `HugeIcons.strokeRoundedEditTable`
1472 -- `HugeIcons.strokeRoundedEditUser02`
1473 -- `HugeIcons.strokeRoundedEggs`
1474 -- `HugeIcons.strokeRoundedEidMubarak`
1475 -- `HugeIcons.strokeRoundedEiffelTower`
1476 -- `HugeIcons.strokeRoundedEightCircle`
1477 -- `HugeIcons.strokeRoundedEightSquare`
1478 -- `HugeIcons.strokeRoundedElearningExchange`
1479 -- `HugeIcons.strokeRoundedElectricHome01`
1480 -- `HugeIcons.strokeRoundedElectricHome02`
1481 -- `HugeIcons.strokeRoundedElectricPlugs`
1482 -- `HugeIcons.strokeRoundedElectricTower01`
1483 -- `HugeIcons.strokeRoundedElectricTower02`
1484 -- `HugeIcons.strokeRoundedElectricWire`
1485 -- `HugeIcons.strokeRoundedEllipseSelection`
1486 -- `HugeIcons.strokeRoundedEncrypt`
1487 -- `HugeIcons.strokeRoundedEnergyEllipse`
1488 -- `HugeIcons.strokeRoundedEnergyRectangle`
1489 -- `HugeIcons.strokeRoundedEnergy`
1490 -- `HugeIcons.strokeRoundedEnteringGeoFence`
1491 -- `HugeIcons.strokeRoundedEntranceStairs`
1492 -- `HugeIcons.strokeRoundedEnvato`
1493 -- `HugeIcons.strokeRoundedEqualSignCircle`
1494 -- `HugeIcons.strokeRoundedEqualSignSquare`
1495 -- `HugeIcons.strokeRoundedEqualSign`
1496 -- `HugeIcons.strokeRoundedEquipmentBenchPress`
1497 -- `HugeIcons.strokeRoundedEquipmentChestPress`
1498 -- `HugeIcons.strokeRoundedEquipmentGym01`
1499 -- `HugeIcons.strokeRoundedEquipmentGym02`
1500 -- `HugeIcons.strokeRoundedEquipmentGym03`
1501 -- `HugeIcons.strokeRoundedEquipmentWeightlifting`
1502 -- `HugeIcons.strokeRoundedEraser01`
1503 -- `HugeIcons.strokeRoundedEraserAdd`
1504 -- `HugeIcons.strokeRoundedEraserAuto`
1505 -- `HugeIcons.strokeRoundedEraser`
1506 -- `HugeIcons.strokeRoundedEstimate01`
1507 -- `HugeIcons.strokeRoundedEstimate02`
1508 -- `HugeIcons.strokeRoundedEthereumEllipse`
1509 -- `HugeIcons.strokeRoundedEthereumRectangle`
1510 -- `HugeIcons.strokeRoundedEthereum`
1511 -- `HugeIcons.strokeRoundedEuroCircle`
1512 -- `HugeIcons.strokeRoundedEuroReceive`
1513 -- `HugeIcons.strokeRoundedEuroSend`
1514 -- `HugeIcons.strokeRoundedEuroSquare`
1515 -- `HugeIcons.strokeRoundedEuro`
1516 -- `HugeIcons.strokeRoundedEvCharging`
1517 -- `HugeIcons.strokeRoundedEvil`
1518 -- `HugeIcons.strokeRoundedExchange01`
1519 -- `HugeIcons.strokeRoundedExchange02`
1520 -- `HugeIcons.strokeRoundedExchange03`
1521 -- `HugeIcons.strokeRoundedExpander`
1522 -- `HugeIcons.strokeRoundedExternalDrive`
1523 -- `HugeIcons.strokeRoundedEye`
1524 -- `HugeIcons.strokeRoundedFaceId`
1525 -- `HugeIcons.strokeRoundedFacebook01`
1526 -- `HugeIcons.strokeRoundedFacebook02`
1527 -- `HugeIcons.strokeRoundedFactory01`
1528 -- `HugeIcons.strokeRoundedFactory02`
1529 -- `HugeIcons.strokeRoundedFactory`
1530 -- `HugeIcons.strokeRoundedFahrenheit`
1531 -- `HugeIcons.strokeRoundedFallingStar`
1532 -- `HugeIcons.strokeRoundedFan01`
1533 -- `HugeIcons.strokeRoundedFan02`
1534 -- `HugeIcons.strokeRoundedFastWind`
1535 -- `HugeIcons.strokeRoundedFavouriteCircle`
1536 -- `HugeIcons.strokeRoundedFavouriteSquare`
1537 -- `HugeIcons.strokeRoundedFavourite`
1538 -- `HugeIcons.strokeRoundedFeather`
1539 -- `HugeIcons.strokeRoundedFemale02`
1540 -- `HugeIcons.strokeRoundedFemaleSymbol`
1541 -- `HugeIcons.strokeRoundedFencingMask`
1542 -- `HugeIcons.strokeRoundedFencing`
1543 -- `HugeIcons.strokeRoundedFerrisWheel`
1544 -- `HugeIcons.strokeRoundedFerryBoat`
1545 -- `HugeIcons.strokeRoundedFigma`
1546 -- `HugeIcons.strokeRoundedFile01`
1547 -- `HugeIcons.strokeRoundedFile02`
1548 -- `HugeIcons.strokeRoundedFileAdd`
1549 -- `HugeIcons.strokeRoundedFileAttachment`
1550 -- `HugeIcons.strokeRoundedFileAudio`
1551 -- `HugeIcons.strokeRoundedFileBitcoin`
1552 -- `HugeIcons.strokeRoundedFileBlock`
1553 -- `HugeIcons.strokeRoundedFileBookmark`
1554 -- `HugeIcons.strokeRoundedFileCloud`
1555 -- `HugeIcons.strokeRoundedFileCorrupt`
1556 -- `HugeIcons.strokeRoundedFileDollar`
1557 -- `HugeIcons.strokeRoundedFileDownload`
1558 -- `HugeIcons.strokeRoundedFileEdit`
1559 -- `HugeIcons.strokeRoundedFileEmpty01`
1560 -- `HugeIcons.strokeRoundedFileEmpty02`
1561 -- `HugeIcons.strokeRoundedFileEuro`
1562 -- `HugeIcons.strokeRoundedFileExport`
1563 -- `HugeIcons.strokeRoundedFileFavourite`
1564 -- `HugeIcons.strokeRoundedFileImport`
1565 -- `HugeIcons.strokeRoundedFileLink`
1566 -- `HugeIcons.strokeRoundedFileLocked`
1567 -- `HugeIcons.strokeRoundedFileManagement`
1568 -- `HugeIcons.strokeRoundedFileMinus`
1569 -- `HugeIcons.strokeRoundedFileMusic`
1570 -- `HugeIcons.strokeRoundedFileNotFound`
1571 -- `HugeIcons.strokeRoundedFilePaste`
1572 -- `HugeIcons.strokeRoundedFilePin`
1573 -- `HugeIcons.strokeRoundedFilePound`
1574 -- `HugeIcons.strokeRoundedFileRemove`
1575 -- `HugeIcons.strokeRoundedFileScript`
1576 -- `HugeIcons.strokeRoundedFileSearch`
1577 -- `HugeIcons.strokeRoundedFileSecurity`
1578 -- `HugeIcons.strokeRoundedFileShredder`
1579 -- `HugeIcons.strokeRoundedFileStar`
1580 -- `HugeIcons.strokeRoundedFileSync`
1581 -- `HugeIcons.strokeRoundedFileUnknown`
1582 -- `HugeIcons.strokeRoundedFileUnlocked`
1583 -- `HugeIcons.strokeRoundedFileUpload`
1584 -- `HugeIcons.strokeRoundedFileValidation`
1585 -- `HugeIcons.strokeRoundedFileVerified`
1586 -- `HugeIcons.strokeRoundedFileVideo`
1587 -- `HugeIcons.strokeRoundedFileView`
1588 -- `HugeIcons.strokeRoundedFileYen`
1589 -- `HugeIcons.strokeRoundedFileZip`
1590 -- `HugeIcons.strokeRoundedFiles01`
1591 -- `HugeIcons.strokeRoundedFiles02`
1592 -- `HugeIcons.strokeRoundedFilm01`
1593 -- `HugeIcons.strokeRoundedFilm02`
1594 -- `HugeIcons.strokeRoundedFilmRoll01`
1595 -- `HugeIcons.strokeRoundedFilmRoll02`
1596 -- `HugeIcons.strokeRoundedFilterAdd`
1597 -- `HugeIcons.strokeRoundedFilterEdit`
1598 -- `HugeIcons.strokeRoundedFilterHorizontal`
1599 -- `HugeIcons.strokeRoundedFilterMailCircle`
1600 -- `HugeIcons.strokeRoundedFilterMailSquare`
1601 -- `HugeIcons.strokeRoundedFilterRemove`
1602 -- `HugeIcons.strokeRoundedFilterReset`
1603 -- `HugeIcons.strokeRoundedFilter`
1604 -- `HugeIcons.strokeRoundedFilterVertical`
1605 -- `HugeIcons.strokeRoundedFingerAccess`
1606 -- `HugeIcons.strokeRoundedFingerPrintAdd`
1607 -- `HugeIcons.strokeRoundedFingerPrintCheck`
1608 -- `HugeIcons.strokeRoundedFingerPrintMinus`
1609 -- `HugeIcons.strokeRoundedFingerPrintRemove`
1610 -- `HugeIcons.strokeRoundedFingerPrintScan`
1611 -- `HugeIcons.strokeRoundedFingerPrint`
1612 -- `HugeIcons.strokeRoundedFingerprintScan`
1613 -- `HugeIcons.strokeRoundedFins`
1614 -- `HugeIcons.strokeRoundedFire02`
1615 -- `HugeIcons.strokeRoundedFire03`
1616 -- `HugeIcons.strokeRoundedFirePit`
1617 -- `HugeIcons.strokeRoundedFireSecurity`
1618 -- `HugeIcons.strokeRoundedFire`
1619 -- `HugeIcons.strokeRoundedFirewall`
1620 -- `HugeIcons.strokeRoundedFireworks`
1621 -- `HugeIcons.strokeRoundedFirstAidKit`
1622 -- `HugeIcons.strokeRoundedFishFood`
1623 -- `HugeIcons.strokeRoundedFitToScreen`
1624 -- `HugeIcons.strokeRoundedFiveCircle`
1625 -- `HugeIcons.strokeRoundedFiveSquare`
1626 -- `HugeIcons.strokeRoundedFiverr`
1627 -- `HugeIcons.strokeRoundedFlag01`
1628 -- `HugeIcons.strokeRoundedFlag02`
1629 -- `HugeIcons.strokeRoundedFlag03`
1630 -- `HugeIcons.strokeRoundedFlashOff`
1631 -- `HugeIcons.strokeRoundedFlash`
1632 -- `HugeIcons.strokeRoundedFlashlight`
1633 -- `HugeIcons.strokeRoundedFlaticon`
1634 -- `HugeIcons.strokeRoundedFlickr`
1635 -- `HugeIcons.strokeRoundedFlimSlate`
1636 -- `HugeIcons.strokeRoundedFlipBottom`
1637 -- `HugeIcons.strokeRoundedFlipHorizontal`
1638 -- `HugeIcons.strokeRoundedFlipLeft`
1639 -- `HugeIcons.strokeRoundedFlipPhone`
1640 -- `HugeIcons.strokeRoundedFlipRight`
1641 -- `HugeIcons.strokeRoundedFlipTop`
1642 -- `HugeIcons.strokeRoundedFlipVertical`
1643 -- `HugeIcons.strokeRoundedFloorPlan`
1644 -- `HugeIcons.strokeRoundedFloppyDisk`
1645 -- `HugeIcons.strokeRoundedFlowCircle`
1646 -- `HugeIcons.strokeRoundedFlowConnection`
1647 -- `HugeIcons.strokeRoundedFlowSquare`
1648 -- `HugeIcons.strokeRoundedFlow`
1649 -- `HugeIcons.strokeRoundedFlowchart01`
1650 -- `HugeIcons.strokeRoundedFlowchart02`
1651 -- `HugeIcons.strokeRoundedFlowerPot`
1652 -- `HugeIcons.strokeRoundedFlower`
1653 -- `HugeIcons.strokeRoundedFlushed`
1654 -- `HugeIcons.strokeRoundedFlyingHuman`
1655 -- `HugeIcons.strokeRoundedFocusPoint`
1656 -- `HugeIcons.strokeRoundedFolder01`
1657 -- `HugeIcons.strokeRoundedFolder02`
1658 -- `HugeIcons.strokeRoundedFolder03`
1659 -- `HugeIcons.strokeRoundedFolderAdd`
1660 -- `HugeIcons.strokeRoundedFolderAttachment`
1661 -- `HugeIcons.strokeRoundedFolderAudio`
1662 -- `HugeIcons.strokeRoundedFolderBlock`
1663 -- `HugeIcons.strokeRoundedFolderCheck`
1664 -- `HugeIcons.strokeRoundedFolderCloud`
1665 -- `HugeIcons.strokeRoundedFolderDetailsReference`
1666 -- `HugeIcons.strokeRoundedFolderDetails`
1667 -- `HugeIcons.strokeRoundedFolderDownload`
1668 -- `HugeIcons.strokeRoundedFolderEdit`
1669 -- `HugeIcons.strokeRoundedFolderExport`
1670 -- `HugeIcons.strokeRoundedFolderFavourite`
1671 -- `HugeIcons.strokeRoundedFolderFileStorage`
1672 -- `HugeIcons.strokeRoundedFolderImport`
1673 -- `HugeIcons.strokeRoundedFolderLibrary`
1674 -- `HugeIcons.strokeRoundedFolderLinks`
1675 -- `HugeIcons.strokeRoundedFolderLocked`
1676 -- `HugeIcons.strokeRoundedFolderManagement`
1677 -- `HugeIcons.strokeRoundedFolderMinus`
1678 -- `HugeIcons.strokeRoundedFolderMoveIn`
1679 -- `HugeIcons.strokeRoundedFolderMoveTo`
1680 -- `HugeIcons.strokeRoundedFolderMusic`
1681 -- `HugeIcons.strokeRoundedFolderOff`
1682 -- `HugeIcons.strokeRoundedFolderOpen`
1683 -- `HugeIcons.strokeRoundedFolderPin`
1684 -- `HugeIcons.strokeRoundedFolderRemove`
1685 -- `HugeIcons.strokeRoundedFolderSearch`
1686 -- `HugeIcons.strokeRoundedFolderSecurity`
1687 -- `HugeIcons.strokeRoundedFolderShared01`
1688 -- `HugeIcons.strokeRoundedFolderShared02`
1689 -- `HugeIcons.strokeRoundedFolderShared03`
1690 -- `HugeIcons.strokeRoundedFolderSync`
1691 -- `HugeIcons.strokeRoundedFolderTransfer`
1692 -- `HugeIcons.strokeRoundedFolderUnknown`
1693 -- `HugeIcons.strokeRoundedFolderUnlocked`
1694 -- `HugeIcons.strokeRoundedFolderUpload`
1695 -- `HugeIcons.strokeRoundedFolderVideo`
1696 -- `HugeIcons.strokeRoundedFolderView`
1697 -- `HugeIcons.strokeRoundedFolderZip`
1698 -- `HugeIcons.strokeRoundedFolders`
1699 -- `HugeIcons.strokeRoundedFootballPitch`
1700 -- `HugeIcons.strokeRoundedFootball`
1701 -- `HugeIcons.strokeRoundedForgotPassword`
1702 -- `HugeIcons.strokeRoundedFork`
1703 -- `HugeIcons.strokeRoundedForrst`
1704 -- `HugeIcons.strokeRoundedFortress`
1705 -- `HugeIcons.strokeRoundedForward01`
1706 -- `HugeIcons.strokeRoundedForward02`
1707 -- `HugeIcons.strokeRoundedFourCircle`
1708 -- `HugeIcons.strokeRoundedFourFinger02`
1709 -- `HugeIcons.strokeRoundedFourFinger03`
1710 -- `HugeIcons.strokeRoundedFourSquare`
1711 -- `HugeIcons.strokeRoundedFoursquare`
1712 -- `HugeIcons.strokeRoundedFramer`
1713 -- `HugeIcons.strokeRoundedFrameworks`
1714 -- `HugeIcons.strokeRoundedFrenchFries01`
1715 -- `HugeIcons.strokeRoundedFrenchFries02`
1716 -- `HugeIcons.strokeRoundedFridge`
1717 -- `HugeIcons.strokeRoundedFrisbee`
1718 -- `HugeIcons.strokeRoundedFry`
1719 -- `HugeIcons.strokeRoundedFuel01`
1720 -- `HugeIcons.strokeRoundedFuel02`
1721 -- `HugeIcons.strokeRoundedFuelStation`
1722 -- `HugeIcons.strokeRoundedFuel`
1723 -- `HugeIcons.strokeRoundedFullScreen`
1724 -- `HugeIcons.strokeRoundedFullSignal`
1725 -- `HugeIcons.strokeRoundedFunctionCircle`
1726 -- `HugeIcons.strokeRoundedFunctionOfX`
1727 -- `HugeIcons.strokeRoundedFunctionSquare`
1728 -- `HugeIcons.strokeRoundedFunction`
1729 -- `HugeIcons.strokeRoundedGalaxy`
1730 -- `HugeIcons.strokeRoundedGameController01`
1731 -- `HugeIcons.strokeRoundedGameController02`
1732 -- `HugeIcons.strokeRoundedGameController03`
1733 -- `HugeIcons.strokeRoundedGame`
1734 -- `HugeIcons.strokeRoundedGameboy`
1735 -- `HugeIcons.strokeRoundedGarage`
1736 -- `HugeIcons.strokeRoundedGarbageTruck`
1737 -- `HugeIcons.strokeRoundedGarlands`
1738 -- `HugeIcons.strokeRoundedGasPipe`
1739 -- `HugeIcons.strokeRoundedGasStove`
1740 -- `HugeIcons.strokeRoundedGears`
1741 -- `HugeIcons.strokeRoundedGem`
1742 -- `HugeIcons.strokeRoundedGeologyCrust`
1743 -- `HugeIcons.strokeRoundedGeometricShapes01`
1744 -- `HugeIcons.strokeRoundedGeometricShapes02`
1745 -- `HugeIcons.strokeRoundedGibbousMoon`
1746 -- `HugeIcons.strokeRoundedGif01`
1747 -- `HugeIcons.strokeRoundedGif02`
1748 -- `HugeIcons.strokeRoundedGiftCard02`
1749 -- `HugeIcons.strokeRoundedGiftCard`
1750 -- `HugeIcons.strokeRoundedGift`
1751 -- `HugeIcons.strokeRoundedGitBranch`
1752 -- `HugeIcons.strokeRoundedGitCommit`
1753 -- `HugeIcons.strokeRoundedGitCompare`
1754 -- `HugeIcons.strokeRoundedGitFork`
1755 -- `HugeIcons.strokeRoundedGitMerge`
1756 -- `HugeIcons.strokeRoundedGitPullRequestClosed`
1757 -- `HugeIcons.strokeRoundedGitPullRequestDraft`
1758 -- `HugeIcons.strokeRoundedGitPullRequest`
1759 -- `HugeIcons.strokeRoundedGitbook`
1760 -- `HugeIcons.strokeRoundedGithub01`
1761 -- `HugeIcons.strokeRoundedGithub`
1762 -- `HugeIcons.strokeRoundedGitlab`
1763 -- `HugeIcons.strokeRoundedGiveBlood`
1764 -- `HugeIcons.strokeRoundedGivePill`
1765 -- `HugeIcons.strokeRoundedGlasses`
1766 -- `HugeIcons.strokeRoundedGlobalEditing`
1767 -- `HugeIcons.strokeRoundedGlobalEducation`
1768 -- `HugeIcons.strokeRoundedGlobalRefresh`
1769 -- `HugeIcons.strokeRoundedGlobalSearch`
1770 -- `HugeIcons.strokeRoundedGlobal`
1771 -- `HugeIcons.strokeRoundedGlobe02`
1772 -- `HugeIcons.strokeRoundedGlobe`
1773 -- `HugeIcons.strokeRoundedGlove`
1774 -- `HugeIcons.strokeRoundedGnome`
1775 -- `HugeIcons.strokeRoundedGoBackward10Sec`
1776 -- `HugeIcons.strokeRoundedGoBackward15Sec`
1777 -- `HugeIcons.strokeRoundedGoBackward30Sec`
1778 -- `HugeIcons.strokeRoundedGoBackward5Sec`
1779 -- `HugeIcons.strokeRoundedGoBackward60Sec`
1780 -- `HugeIcons.strokeRoundedGoForward10Sec`
1781 -- `HugeIcons.strokeRoundedGoForward15Sec`
1782 -- `HugeIcons.strokeRoundedGoForward30Sec`
1783 -- `HugeIcons.strokeRoundedGoForward5Sec`
1784 -- `HugeIcons.strokeRoundedGoForward60Sec`
1785 -- `HugeIcons.strokeRoundedGoldIngots`
1786 -- `HugeIcons.strokeRoundedGold`
1787 -- `HugeIcons.strokeRoundedGolfBall`
1788 -- `HugeIcons.strokeRoundedGolfBat`
1789 -- `HugeIcons.strokeRoundedGolfCart`
1790 -- `HugeIcons.strokeRoundedGolfHole`
1791 -- `HugeIcons.strokeRoundedGoogleDoc`
1792 -- `HugeIcons.strokeRoundedGoogleDrive`
1793 -- `HugeIcons.strokeRoundedGoogleGemini`
1794 -- `HugeIcons.strokeRoundedGoogleHome`
1795 -- `HugeIcons.strokeRoundedGoogleLens`
1796 -- `HugeIcons.strokeRoundedGoogleMaps`
1797 -- `HugeIcons.strokeRoundedGooglePhotos`
1798 -- `HugeIcons.strokeRoundedGoogleSheet`
1799 -- `HugeIcons.strokeRoundedGoogle`
1800 -- `HugeIcons.strokeRoundedGps01`
1801 -- `HugeIcons.strokeRoundedGps02`
1802 -- `HugeIcons.strokeRoundedGpsDisconnected`
1803 -- `HugeIcons.strokeRoundedGpsOff01`
1804 -- `HugeIcons.strokeRoundedGpsOff02`
1805 -- `HugeIcons.strokeRoundedGpsSignal01`
1806 -- `HugeIcons.strokeRoundedGpsSignal02`
1807 -- `HugeIcons.strokeRoundedGpu`
1808 -- `HugeIcons.strokeRoundedGraduateFemale`
1809 -- `HugeIcons.strokeRoundedGraduateMale`
1810 -- `HugeIcons.strokeRoundedGraduationScroll`
1811 -- `HugeIcons.strokeRoundedGrapes`
1812 -- `HugeIcons.strokeRoundedGravity`
1813 -- `HugeIcons.strokeRoundedGreaterThanCircle`
1814 -- `HugeIcons.strokeRoundedGreaterThanSquare`
1815 -- `HugeIcons.strokeRoundedGreaterThan`
1816 -- `HugeIcons.strokeRoundedGreekHelmet`
1817 -- `HugeIcons.strokeRoundedGreenHouse`
1818 -- `HugeIcons.strokeRoundedGrid02`
1819 -- `HugeIcons.strokeRoundedGridOff`
1820 -- `HugeIcons.strokeRoundedGrid`
1821 -- `HugeIcons.strokeRoundedGridTable`
1822 -- `HugeIcons.strokeRoundedGridView`
1823 -- `HugeIcons.strokeRoundedGrimacing`
1824 -- `HugeIcons.strokeRoundedGrinning`
1825 -- `HugeIcons.strokeRoundedGrok02`
1826 -- `HugeIcons.strokeRoundedGrok`
1827 -- `HugeIcons.strokeRoundedGroup01`
1828 -- `HugeIcons.strokeRoundedGroupItems`
1829 -- `HugeIcons.strokeRoundedGroupLayers`
1830 -- `HugeIcons.strokeRoundedGuestHouse`
1831 -- `HugeIcons.strokeRoundedGun`
1832 -- `HugeIcons.strokeRoundedGymnasticRings`
1833 -- `HugeIcons.strokeRoundedGymnastic`
1834 -- `HugeIcons.strokeRoundedHackerrank`
1835 -- `HugeIcons.strokeRoundedHairClips`
1836 -- `HugeIcons.strokeRoundedHairDryer`
1837 -- `HugeIcons.strokeRoundedHaji`
1838 -- `HugeIcons.strokeRoundedHalalLab`
1839 -- `HugeIcons.strokeRoundedHalal`
1840 -- `HugeIcons.strokeRoundedHamburger01`
1841 -- `HugeIcons.strokeRoundedHamburger02`
1842 -- `HugeIcons.strokeRoundedHandBag01`
1843 -- `HugeIcons.strokeRoundedHandBag02`
1844 -- `HugeIcons.strokeRoundedHandBeater`
1845 -- `HugeIcons.strokeRoundedHandGrip`
1846 -- `HugeIcons.strokeRoundedHandPointingDown01`
1847 -- `HugeIcons.strokeRoundedHandPointingDown02`
1848 -- `HugeIcons.strokeRoundedHandPointingDown03`
1849 -- `HugeIcons.strokeRoundedHandPointingDown04`
1850 -- `HugeIcons.strokeRoundedHandPointingLeft01`
1851 -- `HugeIcons.strokeRoundedHandPointingLeft02`
1852 -- `HugeIcons.strokeRoundedHandPointingLeft03`
1853 -- `HugeIcons.strokeRoundedHandPointingLeft04`
1854 -- `HugeIcons.strokeRoundedHandPointingRight01`
1855 -- `HugeIcons.strokeRoundedHandPointingRight02`
1856 -- `HugeIcons.strokeRoundedHandPointingRight03`
1857 -- `HugeIcons.strokeRoundedHandPointingRight04`
1858 -- `HugeIcons.strokeRoundedHandPrayer`
1859 -- `HugeIcons.strokeRoundedHandSanitizer`
1860 -- `HugeIcons.strokeRoundedHandcuffs`
1861 -- `HugeIcons.strokeRoundedHanger`
1862 -- `HugeIcons.strokeRoundedHangingClock`
1863 -- `HugeIcons.strokeRoundedHangout`
1864 -- `HugeIcons.strokeRoundedHappy01`
1865 -- `HugeIcons.strokeRoundedHappy`
1866 -- `HugeIcons.strokeRoundedHardDrive`
1867 -- `HugeIcons.strokeRoundedHat`
1868 -- `HugeIcons.strokeRoundedHdd`
1869 -- `HugeIcons.strokeRoundedHdr01`
1870 -- `HugeIcons.strokeRoundedHdr02`
1871 -- `HugeIcons.strokeRoundedHeading01`
1872 -- `HugeIcons.strokeRoundedHeading02`
1873 -- `HugeIcons.strokeRoundedHeading03`
1874 -- `HugeIcons.strokeRoundedHeading04`
1875 -- `HugeIcons.strokeRoundedHeading05`
1876 -- `HugeIcons.strokeRoundedHeading06`
1877 -- `HugeIcons.strokeRoundedHeading`
1878 -- `HugeIcons.strokeRoundedHeadphoneMute`
1879 -- `HugeIcons.strokeRoundedHeadphones`
1880 -- `HugeIcons.strokeRoundedHeadsetConnected`
1881 -- `HugeIcons.strokeRoundedHeadsetOff`
1882 -- `HugeIcons.strokeRoundedHeadset`
1883 -- `HugeIcons.strokeRoundedHealtcare`
1884 -- `HugeIcons.strokeRoundedHealth`
1885 -- `HugeIcons.strokeRoundedHeartAdd`
1886 -- `HugeIcons.strokeRoundedHeartCheck`
1887 -- `HugeIcons.strokeRoundedHeartRemove`
1888 -- `HugeIcons.strokeRoundedHeartbreak`
1889 -- `HugeIcons.strokeRoundedHelicopter`
1890 -- `HugeIcons.strokeRoundedHelpCircle`
1891 -- `HugeIcons.strokeRoundedHelpSquare`
1892 -- `HugeIcons.strokeRoundedHexagon01`
1893 -- `HugeIcons.strokeRoundedHexagon`
1894 -- `HugeIcons.strokeRoundedHierarchyCircle01`
1895 -- `HugeIcons.strokeRoundedHierarchyCircle02`
1896 -- `HugeIcons.strokeRoundedHierarchyCircle03`
1897 -- `HugeIcons.strokeRoundedHierarchyFiles`
1898 -- `HugeIcons.strokeRoundedHierarchySquare01`
1899 -- `HugeIcons.strokeRoundedHierarchySquare02`
1900 -- `HugeIcons.strokeRoundedHierarchySquare03`
1901 -- `HugeIcons.strokeRoundedHierarchySquare04`
1902 -- `HugeIcons.strokeRoundedHierarchySquare05`
1903 -- `HugeIcons.strokeRoundedHierarchySquare06`
1904 -- `HugeIcons.strokeRoundedHierarchySquare07`
1905 -- `HugeIcons.strokeRoundedHierarchySquare08`
1906 -- `HugeIcons.strokeRoundedHierarchySquare10`
1907 -- `HugeIcons.strokeRoundedHierarchy`
1908 -- `HugeIcons.strokeRoundedHighHeels01`
1909 -- `HugeIcons.strokeRoundedHighHeels02`
1910 -- `HugeIcons.strokeRoundedHighlighter`
1911 -- `HugeIcons.strokeRoundedHijab`
1912 -- `HugeIcons.strokeRoundedHockey`
1913 -- `HugeIcons.strokeRoundedHold01`
1914 -- `HugeIcons.strokeRoundedHold02`
1915 -- `HugeIcons.strokeRoundedHold03`
1916 -- `HugeIcons.strokeRoundedHold04`
1917 -- `HugeIcons.strokeRoundedHold05`
1918 -- `HugeIcons.strokeRoundedHoldLocked01`
1919 -- `HugeIcons.strokeRoundedHoldLocked02`
1920 -- `HugeIcons.strokeRoundedHoldPhone`
1921 -- `HugeIcons.strokeRoundedHologram`
1922 -- `HugeIcons.strokeRoundedHome01`
1923 -- `HugeIcons.strokeRoundedHome02`
1924 -- `HugeIcons.strokeRoundedHome03`
1925 -- `HugeIcons.strokeRoundedHome04`
1926 -- `HugeIcons.strokeRoundedHome05`
1927 -- `HugeIcons.strokeRoundedHome06`
1928 -- `HugeIcons.strokeRoundedHome07`
1929 -- `HugeIcons.strokeRoundedHome08`
1930 -- `HugeIcons.strokeRoundedHome09`
1931 -- `HugeIcons.strokeRoundedHome10`
1932 -- `HugeIcons.strokeRoundedHome11`
1933 -- `HugeIcons.strokeRoundedHome12`
1934 -- `HugeIcons.strokeRoundedHome13`
1935 -- `HugeIcons.strokeRoundedHomeWifi`
1936 -- `HugeIcons.strokeRoundedHoney01`
1937 -- `HugeIcons.strokeRoundedHoney02`
1938 -- `HugeIcons.strokeRoundedHonor`
1939 -- `HugeIcons.strokeRoundedHonourStar`
1940 -- `HugeIcons.strokeRoundedHoodie`
1941 -- `HugeIcons.strokeRoundedHorizonalScrollPoint`
1942 -- `HugeIcons.strokeRoundedHorizontalResize`
1943 -- `HugeIcons.strokeRoundedHorseHead`
1944 -- `HugeIcons.strokeRoundedHorseSaddle`
1945 -- `HugeIcons.strokeRoundedHorse`
1946 -- `HugeIcons.strokeRoundedHospital01`
1947 -- `HugeIcons.strokeRoundedHospital02`
1948 -- `HugeIcons.strokeRoundedHospitalBed01`
1949 -- `HugeIcons.strokeRoundedHospitalBed02`
1950 -- `HugeIcons.strokeRoundedHospitalLocation`
1951 -- `HugeIcons.strokeRoundedHotAirBalloon`
1952 -- `HugeIcons.strokeRoundedHotPrice`
1953 -- `HugeIcons.strokeRoundedHotTube`
1954 -- `HugeIcons.strokeRoundedHotdog`
1955 -- `HugeIcons.strokeRoundedHotel01`
1956 -- `HugeIcons.strokeRoundedHotel02`
1957 -- `HugeIcons.strokeRoundedHotelBell`
1958 -- `HugeIcons.strokeRoundedHotspotOffline`
1959 -- `HugeIcons.strokeRoundedHotspot`
1960 -- `HugeIcons.strokeRoundedHourglassOff`
1961 -- `HugeIcons.strokeRoundedHourglass`
1962 -- `HugeIcons.strokeRoundedHouse01`
1963 -- `HugeIcons.strokeRoundedHouse02`
1964 -- `HugeIcons.strokeRoundedHouse03`
1965 -- `HugeIcons.strokeRoundedHouse04`
1966 -- `HugeIcons.strokeRoundedHouse05`
1967 -- `HugeIcons.strokeRoundedHouseSolarPanel`
1968 -- `HugeIcons.strokeRoundedHtml5`
1969 -- `HugeIcons.strokeRoundedHtmlFile01`
1970 -- `HugeIcons.strokeRoundedHtmlFile02`
1971 -- `HugeIcons.strokeRoundedHugeicons`
1972 -- `HugeIcons.strokeRoundedHumidity`
1973 -- `HugeIcons.strokeRoundedHut`
1974 -- `HugeIcons.strokeRoundedHydroPower`
1975 -- `HugeIcons.strokeRoundedHyperbole`
1976 -- `HugeIcons.strokeRoundedIceCream01`
1977 -- `HugeIcons.strokeRoundedIceCream02`
1978 -- `HugeIcons.strokeRoundedIceCream03`
1979 -- `HugeIcons.strokeRoundedIceCream04`
1980 -- `HugeIcons.strokeRoundedIceCubes`
1981 -- `HugeIcons.strokeRoundedIceHockey`
1982 -- `HugeIcons.strokeRoundedIceSkating`
1983 -- `HugeIcons.strokeRoundedIco`
1984 -- `HugeIcons.strokeRoundedIconjar`
1985 -- `HugeIcons.strokeRoundedIdNotVerified`
1986 -- `HugeIcons.strokeRoundedId`
1987 -- `HugeIcons.strokeRoundedIdVerified`
1988 -- `HugeIcons.strokeRoundedIdea01`
1989 -- `HugeIcons.strokeRoundedIdea`
1990 -- `HugeIcons.strokeRoundedIdentification`
1991 -- `HugeIcons.strokeRoundedIdentityCard`
1992 -- `HugeIcons.strokeRoundedImage01`
1993 -- `HugeIcons.strokeRoundedImage02`
1994 -- `HugeIcons.strokeRoundedImage03`
1995 -- `HugeIcons.strokeRoundedImageActualSize`
1996 -- `HugeIcons.strokeRoundedImageAdd01`
1997 -- `HugeIcons.strokeRoundedImageAdd02`
1998 -- `HugeIcons.strokeRoundedImageCompositionOval`
1999 -- `HugeIcons.strokeRoundedImageComposition`
2000 -- `HugeIcons.strokeRoundedImageCounterClockwise`
2001 -- `HugeIcons.strokeRoundedImageCrop`
2002 -- `HugeIcons.strokeRoundedImageDelete01`
2003 -- `HugeIcons.strokeRoundedImageDelete02`
2004 -- `HugeIcons.strokeRoundedImageDone01`
2005 -- `HugeIcons.strokeRoundedImageDone02`
2006 -- `HugeIcons.strokeRoundedImageDownload02`
2007 -- `HugeIcons.strokeRoundedImageDownload`
2008 -- `HugeIcons.strokeRoundedImageFlipHorizontal`
2009 -- `HugeIcons.strokeRoundedImageFlipVertical`
2010 -- `HugeIcons.strokeRoundedImageNotFound01`
2011 -- `HugeIcons.strokeRoundedImageNotFound02`
2012 -- `HugeIcons.strokeRoundedImageRemove01`
2013 -- `HugeIcons.strokeRoundedImageRemove02`
2014 -- `HugeIcons.strokeRoundedImageRotationClockwise`
2015 -- `HugeIcons.strokeRoundedImageUpload01`
2016 -- `HugeIcons.strokeRoundedImageUpload`
2017 -- `HugeIcons.strokeRoundedImo`
2018 -- `HugeIcons.strokeRoundedImportantBook`
2019 -- `HugeIcons.strokeRoundedInLove`
2020 -- `HugeIcons.strokeRoundedInboxCheck`
2021 -- `HugeIcons.strokeRoundedInboxDownload`
2022 -- `HugeIcons.strokeRoundedInbox`
2023 -- `HugeIcons.strokeRoundedInboxUnread`
2024 -- `HugeIcons.strokeRoundedInboxUpload`
2025 -- `HugeIcons.strokeRoundedIncognito`
2026 -- `HugeIcons.strokeRoundedIndiaGate`
2027 -- `HugeIcons.strokeRoundedInequality01`
2028 -- `HugeIcons.strokeRoundedInequality02`
2029 -- `HugeIcons.strokeRoundedInequalityCircle01`
2030 -- `HugeIcons.strokeRoundedInequalityCircle02`
2031 -- `HugeIcons.strokeRoundedInequalitySquare01`
2032 -- `HugeIcons.strokeRoundedInequalitySquare02`
2033 -- `HugeIcons.strokeRoundedInfant`
2034 -- `HugeIcons.strokeRoundedInfinity01`
2035 -- `HugeIcons.strokeRoundedInfinity02`
2036 -- `HugeIcons.strokeRoundedInfinityCircle`
2037 -- `HugeIcons.strokeRoundedInfinitySquare`
2038 -- `HugeIcons.strokeRoundedInformationCircle`
2039 -- `HugeIcons.strokeRoundedInformationDiamond`
2040 -- `HugeIcons.strokeRoundedInformationSquare`
2041 -- `HugeIcons.strokeRoundedInjection`
2042 -- `HugeIcons.strokeRoundedInsertBottomImage`
2043 -- `HugeIcons.strokeRoundedInsertCenterImage`
2044 -- `HugeIcons.strokeRoundedInsertColumnLeft`
2045 -- `HugeIcons.strokeRoundedInsertColumnRight`
2046 -- `HugeIcons.strokeRoundedInsertColumn`
2047 -- `HugeIcons.strokeRoundedInsertPi`
2048 -- `HugeIcons.strokeRoundedInsertRowDown`
2049 -- `HugeIcons.strokeRoundedInsertRow`
2050 -- `HugeIcons.strokeRoundedInsertRowUp`
2051 -- `HugeIcons.strokeRoundedInsertTopImage`
2052 -- `HugeIcons.strokeRoundedInspectCode`
2053 -- `HugeIcons.strokeRoundedInstagram`
2054 -- `HugeIcons.strokeRoundedInstallingUpdates01`
2055 -- `HugeIcons.strokeRoundedInstallingUpdates02`
2056 -- `HugeIcons.strokeRoundedInternetAntenna01`
2057 -- `HugeIcons.strokeRoundedInternetAntenna02`
2058 -- `HugeIcons.strokeRoundedInternetAntenna03`
2059 -- `HugeIcons.strokeRoundedInternetAntenna04`
2060 -- `HugeIcons.strokeRoundedInternet`
2061 -- `HugeIcons.strokeRoundedInvestigation`
2062 -- `HugeIcons.strokeRoundedInvoice01`
2063 -- `HugeIcons.strokeRoundedInvoice02`
2064 -- `HugeIcons.strokeRoundedInvoice03`
2065 -- `HugeIcons.strokeRoundedInvoice04`
2066 -- `HugeIcons.strokeRoundedInvoice`
2067 -- `HugeIcons.strokeRoundedIpod`
2068 -- `HugeIcons.strokeRoundedIrisScan`
2069 -- `HugeIcons.strokeRoundedIsland`
2070 -- `HugeIcons.strokeRoundedJar`
2071 -- `HugeIcons.strokeRoundedJavaScript`
2072 -- `HugeIcons.strokeRoundedJava`
2073 -- `HugeIcons.strokeRoundedJobLink`
2074 -- `HugeIcons.strokeRoundedJobSearch`
2075 -- `HugeIcons.strokeRoundedJobShare`
2076 -- `HugeIcons.strokeRoundedJoggerPants`
2077 -- `HugeIcons.strokeRoundedJoinBevel`
2078 -- `HugeIcons.strokeRoundedJoinRound`
2079 -- `HugeIcons.strokeRoundedJoinStraight`
2080 -- `HugeIcons.strokeRoundedJoker`
2081 -- `HugeIcons.strokeRoundedJoystick01`
2082 -- `HugeIcons.strokeRoundedJoystick02`
2083 -- `HugeIcons.strokeRoundedJoystick03`
2084 -- `HugeIcons.strokeRoundedJoystick04`
2085 -- `HugeIcons.strokeRoundedJoystick05`
2086 -- `HugeIcons.strokeRoundedJpg01`
2087 -- `HugeIcons.strokeRoundedJpg02`
2088 -- `HugeIcons.strokeRoundedJsx01`
2089 -- `HugeIcons.strokeRoundedJsx02`
2090 -- `HugeIcons.strokeRoundedJsx03`
2091 -- `HugeIcons.strokeRoundedJudge`
2092 -- `HugeIcons.strokeRoundedJumpers`
2093 -- `HugeIcons.strokeRoundedJupiter`
2094 -- `HugeIcons.strokeRoundedJusticeScale01`
2095 -- `HugeIcons.strokeRoundedJusticeScale02`
2096 -- `HugeIcons.strokeRoundedKaaba01`
2097 -- `HugeIcons.strokeRoundedKaaba02`
2098 -- `HugeIcons.strokeRoundedKanban`
2099 -- `HugeIcons.strokeRoundedKayak`
2100 -- `HugeIcons.strokeRoundedKeffiyeh`
2101 -- `HugeIcons.strokeRoundedKettle01`
2102 -- `HugeIcons.strokeRoundedKettle`
2103 -- `HugeIcons.strokeRoundedKettlebell`
2104 -- `HugeIcons.strokeRoundedKetupat`
2105 -- `HugeIcons.strokeRoundedKey01`
2106 -- `HugeIcons.strokeRoundedKey02`
2107 -- `HugeIcons.strokeRoundedKeyGeneratorFob`
2108 -- `HugeIcons.strokeRoundedKeyboard`
2109 -- `HugeIcons.strokeRoundedKeyframeAdd`
2110 -- `HugeIcons.strokeRoundedKeyframeAlignCenter`
2111 -- `HugeIcons.strokeRoundedKeyframeAlignHorizontal`
2112 -- `HugeIcons.strokeRoundedKeyframeAlignVertical`
2113 -- `HugeIcons.strokeRoundedKeyframeBottom`
2114 -- `HugeIcons.strokeRoundedKeyframeLeft`
2115 -- `HugeIcons.strokeRoundedKeyframeRemove`
2116 -- `HugeIcons.strokeRoundedKeyframeRight`
2117 -- `HugeIcons.strokeRoundedKeyframe`
2118 -- `HugeIcons.strokeRoundedKeyframeTop`
2119 -- `HugeIcons.strokeRoundedKeyframesDoubleAdd`
2120 -- `HugeIcons.strokeRoundedKeyframesDoubleRemove`
2121 -- `HugeIcons.strokeRoundedKeyframesDouble`
2122 -- `HugeIcons.strokeRoundedKeyframesMultipleAdd`
2123 -- `HugeIcons.strokeRoundedKeyframesMultipleRemove`
2124 -- `HugeIcons.strokeRoundedKeyframesMultiple`
2125 -- `HugeIcons.strokeRoundedKickstarter01`
2126 -- `HugeIcons.strokeRoundedKickstarter02`
2127 -- `HugeIcons.strokeRoundedKid`
2128 -- `HugeIcons.strokeRoundedKidneys`
2129 -- `HugeIcons.strokeRoundedKimiAi`
2130 -- `HugeIcons.strokeRoundedKissing`
2131 -- `HugeIcons.strokeRoundedKitchenUtensils`
2132 -- `HugeIcons.strokeRoundedKite`
2133 -- `HugeIcons.strokeRoundedKlarna`
2134 -- `HugeIcons.strokeRoundedKnife01`
2135 -- `HugeIcons.strokeRoundedKnife02`
2136 -- `HugeIcons.strokeRoundedKnifeBread`
2137 -- `HugeIcons.strokeRoundedKnightShield`
2138 -- `HugeIcons.strokeRoundedKnives`
2139 -- `HugeIcons.strokeRoundedKnowledge01`
2140 -- `HugeIcons.strokeRoundedKnowledge02`
2141 -- `HugeIcons.strokeRoundedKoFi`
2142 -- `HugeIcons.strokeRoundedKurta01`
2143 -- `HugeIcons.strokeRoundedKurta`
2144 -- `HugeIcons.strokeRoundedLabelImportant`
2145 -- `HugeIcons.strokeRoundedLabel`
2146 -- `HugeIcons.strokeRoundedLabor`
2147 -- `HugeIcons.strokeRoundedLabs`
2148 -- `HugeIcons.strokeRoundedLake`
2149 -- `HugeIcons.strokeRoundedLamp01`
2150 -- `HugeIcons.strokeRoundedLamp02`
2151 -- `HugeIcons.strokeRoundedLamp03`
2152 -- `HugeIcons.strokeRoundedLamp04`
2153 -- `HugeIcons.strokeRoundedLamp05`
2154 -- `HugeIcons.strokeRoundedLamp`
2155 -- `HugeIcons.strokeRoundedLanguageCircle`
2156 -- `HugeIcons.strokeRoundedLanguageSkill`
2157 -- `HugeIcons.strokeRoundedLanguageSquare`
2158 -- `HugeIcons.strokeRoundedLantern`
2159 -- `HugeIcons.strokeRoundedLaptopAdd`
2160 -- `HugeIcons.strokeRoundedLaptopCharging`
2161 -- `HugeIcons.strokeRoundedLaptopCheck`
2162 -- `HugeIcons.strokeRoundedLaptopCloud`
2163 -- `HugeIcons.strokeRoundedLaptopIssue`
2164 -- `HugeIcons.strokeRoundedLaptopPerformance`
2165 -- `HugeIcons.strokeRoundedLaptopPhoneSync`
2166 -- `HugeIcons.strokeRoundedLaptopProgramming`
2167 -- `HugeIcons.strokeRoundedLaptopRemove`
2168 -- `HugeIcons.strokeRoundedLaptopSettings`
2169 -- `HugeIcons.strokeRoundedLaptop`
2170 -- `HugeIcons.strokeRoundedLaptopVideo`
2171 -- `HugeIcons.strokeRoundedLassoTool01`
2172 -- `HugeIcons.strokeRoundedLassoTool02`
2173 -- `HugeIcons.strokeRoundedLastFm`
2174 -- `HugeIcons.strokeRoundedLatitude`
2175 -- `HugeIcons.strokeRoundedLaughing`
2176 -- `HugeIcons.strokeRoundedLaurelWreath01`
2177 -- `HugeIcons.strokeRoundedLaurelWreath02`
2178 -- `HugeIcons.strokeRoundedLaurelWreathFirst01`
2179 -- `HugeIcons.strokeRoundedLaurelWreathFirst02`
2180 -- `HugeIcons.strokeRoundedLaurelWreathLeft01`
2181 -- `HugeIcons.strokeRoundedLaurelWreathLeft02`
2182 -- `HugeIcons.strokeRoundedLaurelWreathLeft03`
2183 -- `HugeIcons.strokeRoundedLaurelWreathRight01`
2184 -- `HugeIcons.strokeRoundedLaurelWreathRight02`
2185 -- `HugeIcons.strokeRoundedLaurelWreathRight03`
2186 -- `HugeIcons.strokeRoundedLayerAdd`
2187 -- `HugeIcons.strokeRoundedLayerBringForward`
2188 -- `HugeIcons.strokeRoundedLayerBringToFront`
2189 -- `HugeIcons.strokeRoundedLayerMask01`
2190 -- `HugeIcons.strokeRoundedLayerMask02`
2191 -- `HugeIcons.strokeRoundedLayerSendBackward`
2192 -- `HugeIcons.strokeRoundedLayerSendToBack`
2193 -- `HugeIcons.strokeRoundedLayer`
2194 -- `HugeIcons.strokeRoundedLayers01`
2195 -- `HugeIcons.strokeRoundedLayers02`
2196 -- `HugeIcons.strokeRoundedLayersLogo`
2197 -- `HugeIcons.strokeRoundedLayout01`
2198 -- `HugeIcons.strokeRoundedLayout02`
2199 -- `HugeIcons.strokeRoundedLayout03`
2200 -- `HugeIcons.strokeRoundedLayout04`
2201 -- `HugeIcons.strokeRoundedLayout05`
2202 -- `HugeIcons.strokeRoundedLayout06`
2203 -- `HugeIcons.strokeRoundedLayout07`
2204 -- `HugeIcons.strokeRoundedLayout2Column`
2205 -- `HugeIcons.strokeRoundedLayout2Row`
2206 -- `HugeIcons.strokeRoundedLayout3Column`
2207 -- `HugeIcons.strokeRoundedLayout3Row`
2208 -- `HugeIcons.strokeRoundedLayoutBottom`
2209 -- `HugeIcons.strokeRoundedLayoutGrid`
2210 -- `HugeIcons.strokeRoundedLayoutLeft`
2211 -- `HugeIcons.strokeRoundedLayoutRight`
2212 -- `HugeIcons.strokeRoundedLayoutTable01`
2213 -- `HugeIcons.strokeRoundedLayoutTable02`
2214 -- `HugeIcons.strokeRoundedLayoutTop`
2215 -- `HugeIcons.strokeRoundedLeaf01`
2216 -- `HugeIcons.strokeRoundedLeaf02`
2217 -- `HugeIcons.strokeRoundedLeaf03`
2218 -- `HugeIcons.strokeRoundedLeaf04`
2219 -- `HugeIcons.strokeRoundedLeavingGeoFence`
2220 -- `HugeIcons.strokeRoundedLeetcode`
2221 -- `HugeIcons.strokeRoundedLeftAngle`
2222 -- `HugeIcons.strokeRoundedLeftToRightBlockQuote`
2223 -- `HugeIcons.strokeRoundedLeftToRightListBullet`
2224 -- `HugeIcons.strokeRoundedLeftToRightListDash`
2225 -- `HugeIcons.strokeRoundedLeftToRightListNumber`
2226 -- `HugeIcons.strokeRoundedLeftToRightListStar01`
2227 -- `HugeIcons.strokeRoundedLeftToRightListStar`
2228 -- `HugeIcons.strokeRoundedLeftToRightListTriangle`
2229 -- `HugeIcons.strokeRoundedLeftTriangle`
2230 -- `HugeIcons.strokeRoundedLegal01`
2231 -- `HugeIcons.strokeRoundedLegal02`
2232 -- `HugeIcons.strokeRoundedLegalDocument01`
2233 -- `HugeIcons.strokeRoundedLegalDocument02`
2234 -- `HugeIcons.strokeRoundedLegalHammer`
2235 -- `HugeIcons.strokeRoundedLessThanCircle`
2236 -- `HugeIcons.strokeRoundedLessThanSquare`
2237 -- `HugeIcons.strokeRoundedLessThan`
2238 -- `HugeIcons.strokeRoundedLetterSpacing`
2239 -- `HugeIcons.strokeRoundedLibraries`
2240 -- `HugeIcons.strokeRoundedLibrary`
2241 -- `HugeIcons.strokeRoundedLicenseDraft`
2242 -- `HugeIcons.strokeRoundedLicenseMaintenance`
2243 -- `HugeIcons.strokeRoundedLicenseNo`
2244 -- `HugeIcons.strokeRoundedLicensePin`
2245 -- `HugeIcons.strokeRoundedLicense`
2246 -- `HugeIcons.strokeRoundedLicenseThirdParty`
2247 -- `HugeIcons.strokeRoundedLifebuoy`
2248 -- `HugeIcons.strokeRoundedLiftTruck`
2249 -- `HugeIcons.strokeRoundedLighthouse`
2250 -- `HugeIcons.strokeRoundedLimitOrder`
2251 -- `HugeIcons.strokeRoundedLimitation`
2252 -- `HugeIcons.strokeRoundedLine`
2253 -- `HugeIcons.strokeRoundedLiner`
2254 -- `HugeIcons.strokeRoundedLink01`
2255 -- `HugeIcons.strokeRoundedLink02`
2256 -- `HugeIcons.strokeRoundedLink03`
2257 -- `HugeIcons.strokeRoundedLink04`
2258 -- `HugeIcons.strokeRoundedLink05`
2259 -- `HugeIcons.strokeRoundedLink06`
2260 -- `HugeIcons.strokeRoundedLinkBackward`
2261 -- `HugeIcons.strokeRoundedLinkCircle02`
2262 -- `HugeIcons.strokeRoundedLinkCircle`
2263 -- `HugeIcons.strokeRoundedLinkForward`
2264 -- `HugeIcons.strokeRoundedLinkSquare01`
2265 -- `HugeIcons.strokeRoundedLinkSquare02`
2266 -- `HugeIcons.strokeRoundedLinkedin01`
2267 -- `HugeIcons.strokeRoundedLinkedin02`
2268 -- `HugeIcons.strokeRoundedListSetting`
2269 -- `HugeIcons.strokeRoundedListView`
2270 -- `HugeIcons.strokeRoundedLitecoin`
2271 -- `HugeIcons.strokeRoundedLiveStreaming01`
2272 -- `HugeIcons.strokeRoundedLiveStreaming02`
2273 -- `HugeIcons.strokeRoundedLiveStreaming03`
2274 -- `HugeIcons.strokeRoundedLiver`
2275 -- `HugeIcons.strokeRoundedLoading01`
2276 -- `HugeIcons.strokeRoundedLoading02`
2277 -- `HugeIcons.strokeRoundedLoading03`
2278 -- `HugeIcons.strokeRoundedLoading04`
2279 -- `HugeIcons.strokeRoundedLocation01`
2280 -- `HugeIcons.strokeRoundedLocation02`
2281 -- `HugeIcons.strokeRoundedLocation03`
2282 -- `HugeIcons.strokeRoundedLocation04`
2283 -- `HugeIcons.strokeRoundedLocation05`
2284 -- `HugeIcons.strokeRoundedLocation06`
2285 -- `HugeIcons.strokeRoundedLocation07`
2286 -- `HugeIcons.strokeRoundedLocation08`
2287 -- `HugeIcons.strokeRoundedLocation09`
2288 -- `HugeIcons.strokeRoundedLocation10`
2289 -- `HugeIcons.strokeRoundedLocationAdd01`
2290 -- `HugeIcons.strokeRoundedLocationAdd02`
2291 -- `HugeIcons.strokeRoundedLocationCheck01`
2292 -- `HugeIcons.strokeRoundedLocationCheck02`
2293 -- `HugeIcons.strokeRoundedLocationFavourite01`
2294 -- `HugeIcons.strokeRoundedLocationFavourite02`
2295 -- `HugeIcons.strokeRoundedLocationOffline01`
2296 -- `HugeIcons.strokeRoundedLocationOffline02`
2297 -- `HugeIcons.strokeRoundedLocationOffline03`
2298 -- `HugeIcons.strokeRoundedLocationOffline04`
2299 -- `HugeIcons.strokeRoundedLocationRemove01`
2300 -- `HugeIcons.strokeRoundedLocationRemove02`
2301 -- `HugeIcons.strokeRoundedLocationShare01`
2302 -- `HugeIcons.strokeRoundedLocationShare02`
2303 -- `HugeIcons.strokeRoundedLocationStar01`
2304 -- `HugeIcons.strokeRoundedLocationStar02`
2305 -- `HugeIcons.strokeRoundedLocationUpdate01`
2306 -- `HugeIcons.strokeRoundedLocationUpdate02`
2307 -- `HugeIcons.strokeRoundedLocationUser01`
2308 -- `HugeIcons.strokeRoundedLocationUser02`
2309 -- `HugeIcons.strokeRoundedLocationUser03`
2310 -- `HugeIcons.strokeRoundedLocationUser04`
2311 -- `HugeIcons.strokeRoundedLockComputer`
2312 -- `HugeIcons.strokeRoundedLockKey`
2313 -- `HugeIcons.strokeRoundedLockPassword`
2314 -- `HugeIcons.strokeRoundedLock`
2315 -- `HugeIcons.strokeRoundedLockSync01`
2316 -- `HugeIcons.strokeRoundedLockSync02`
2317 -- `HugeIcons.strokeRoundedLocked`
2318 -- `HugeIcons.strokeRoundedLocker01`
2319 -- `HugeIcons.strokeRoundedLocker`
2320 -- `HugeIcons.strokeRoundedLogin01`
2321 -- `HugeIcons.strokeRoundedLogin02`
2322 -- `HugeIcons.strokeRoundedLogin03`
2323 -- `HugeIcons.strokeRoundedLoginCircle01`
2324 -- `HugeIcons.strokeRoundedLoginCircle02`
2325 -- `HugeIcons.strokeRoundedLoginMethod`
2326 -- `HugeIcons.strokeRoundedLoginSquare01`
2327 -- `HugeIcons.strokeRoundedLoginSquare02`
2328 -- `HugeIcons.strokeRoundedLogout01`
2329 -- `HugeIcons.strokeRoundedLogout02`
2330 -- `HugeIcons.strokeRoundedLogout03`
2331 -- `HugeIcons.strokeRoundedLogout04`
2332 -- `HugeIcons.strokeRoundedLogout05`
2333 -- `HugeIcons.strokeRoundedLogoutCircle01`
2334 -- `HugeIcons.strokeRoundedLogoutCircle02`
2335 -- `HugeIcons.strokeRoundedLogoutSquare01`
2336 -- `HugeIcons.strokeRoundedLogoutSquare02`
2337 -- `HugeIcons.strokeRoundedLollipop`
2338 -- `HugeIcons.strokeRoundedLongSleeveShirt`
2339 -- `HugeIcons.strokeRoundedLongitude`
2340 -- `HugeIcons.strokeRoundedLookBottom`
2341 -- `HugeIcons.strokeRoundedLookLeft`
2342 -- `HugeIcons.strokeRoundedLookRight`
2343 -- `HugeIcons.strokeRoundedLookTop`
2344 -- `HugeIcons.strokeRoundedLoom`
2345 -- `HugeIcons.strokeRoundedLottiefiles`
2346 -- `HugeIcons.strokeRoundedLoveKoreanFinger`
2347 -- `HugeIcons.strokeRoundedLowSignal`
2348 -- `HugeIcons.strokeRoundedLoyaltyCard`
2349 -- `HugeIcons.strokeRoundedLuggage01`
2350 -- `HugeIcons.strokeRoundedLuggage02`
2351 -- `HugeIcons.strokeRoundedLungs`
2352 -- `HugeIcons.strokeRoundedMachineRobot`
2353 -- `HugeIcons.strokeRoundedMagicWand01`
2354 -- `HugeIcons.strokeRoundedMagicWand02`
2355 -- `HugeIcons.strokeRoundedMagicWand03`
2356 -- `HugeIcons.strokeRoundedMagicWand04`
2357 -- `HugeIcons.strokeRoundedMagicWand05`
2358 -- `HugeIcons.strokeRoundedMagnet01`
2359 -- `HugeIcons.strokeRoundedMagnet02`
2360 -- `HugeIcons.strokeRoundedMagnet`
2361 -- `HugeIcons.strokeRoundedMail01`
2362 -- `HugeIcons.strokeRoundedMail02`
2363 -- `HugeIcons.strokeRoundedMailAccount01`
2364 -- `HugeIcons.strokeRoundedMailAccount02`
2365 -- `HugeIcons.strokeRoundedMailAdd01`
2366 -- `HugeIcons.strokeRoundedMailAdd02`
2367 -- `HugeIcons.strokeRoundedMailAtSign01`
2368 -- `HugeIcons.strokeRoundedMailAtSign02`
2369 -- `HugeIcons.strokeRoundedMailBlock01`
2370 -- `HugeIcons.strokeRoundedMailBlock02`
2371 -- `HugeIcons.strokeRoundedMailDownload01`
2372 -- `HugeIcons.strokeRoundedMailDownload02`
2373 -- `HugeIcons.strokeRoundedMailEdit01`
2374 -- `HugeIcons.strokeRoundedMailEdit02`
2375 -- `HugeIcons.strokeRoundedMailLock01`
2376 -- `HugeIcons.strokeRoundedMailLock02`
2377 -- `HugeIcons.strokeRoundedMailLove01`
2378 -- `HugeIcons.strokeRoundedMailLove02`
2379 -- `HugeIcons.strokeRoundedMailMinus01`
2380 -- `HugeIcons.strokeRoundedMailMinus02`
2381 -- `HugeIcons.strokeRoundedMailOpen01`
2382 -- `HugeIcons.strokeRoundedMailOpen02`
2383 -- `HugeIcons.strokeRoundedMailOpenLove`
2384 -- `HugeIcons.strokeRoundedMailOpen`
2385 -- `HugeIcons.strokeRoundedMailReceive01`
2386 -- `HugeIcons.strokeRoundedMailReceive02`
2387 -- `HugeIcons.strokeRoundedMailRemove01`
2388 -- `HugeIcons.strokeRoundedMailRemove02`
2389 -- `HugeIcons.strokeRoundedMailReply01`
2390 -- `HugeIcons.strokeRoundedMailReply02`
2391 -- `HugeIcons.strokeRoundedMailReplyAll01`
2392 -- `HugeIcons.strokeRoundedMailReplyAll02`
2393 -- `HugeIcons.strokeRoundedMailSearch01`
2394 -- `HugeIcons.strokeRoundedMailSearch02`
2395 -- `HugeIcons.strokeRoundedMailSecure01`
2396 -- `HugeIcons.strokeRoundedMailSecure02`
2397 -- `HugeIcons.strokeRoundedMailSend01`
2398 -- `HugeIcons.strokeRoundedMailSend02`
2399 -- `HugeIcons.strokeRoundedMailSetting01`
2400 -- `HugeIcons.strokeRoundedMailSetting02`
2401 -- `HugeIcons.strokeRoundedMailUnlock01`
2402 -- `HugeIcons.strokeRoundedMailUnlock02`
2403 -- `HugeIcons.strokeRoundedMailUpload01`
2404 -- `HugeIcons.strokeRoundedMailUpload02`
2405 -- `HugeIcons.strokeRoundedMailValidation01`
2406 -- `HugeIcons.strokeRoundedMailValidation02`
2407 -- `HugeIcons.strokeRoundedMailVoice01`
2408 -- `HugeIcons.strokeRoundedMailVoice02`
2409 -- `HugeIcons.strokeRoundedMailbox01`
2410 -- `HugeIcons.strokeRoundedMailbox`
2411 -- `HugeIcons.strokeRoundedMale02`
2412 -- `HugeIcons.strokeRoundedMaleSymbol`
2413 -- `HugeIcons.strokeRoundedMan`
2414 -- `HugeIcons.strokeRoundedManWoman`
2415 -- `HugeIcons.strokeRoundedManager`
2416 -- `HugeIcons.strokeRoundedMapPin`
2417 -- `HugeIcons.strokeRoundedMapPinpoint01`
2418 -- `HugeIcons.strokeRoundedMapPinpoint02`
2419 -- `HugeIcons.strokeRoundedMaping`
2420 -- `HugeIcons.strokeRoundedMapsCircle01`
2421 -- `HugeIcons.strokeRoundedMapsCircle02`
2422 -- `HugeIcons.strokeRoundedMapsEditing`
2423 -- `HugeIcons.strokeRoundedMapsGlobal01`
2424 -- `HugeIcons.strokeRoundedMapsGlobal02`
2425 -- `HugeIcons.strokeRoundedMapsLocation01`
2426 -- `HugeIcons.strokeRoundedMapsLocation02`
2427 -- `HugeIcons.strokeRoundedMapsOff`
2428 -- `HugeIcons.strokeRoundedMapsRefresh`
2429 -- `HugeIcons.strokeRoundedMapsSearch`
2430 -- `HugeIcons.strokeRoundedMapsSquare01`
2431 -- `HugeIcons.strokeRoundedMapsSquare02`
2432 -- `HugeIcons.strokeRoundedMaps`
2433 -- `HugeIcons.strokeRoundedMarketAnalysis`
2434 -- `HugeIcons.strokeRoundedMarketOrder`
2435 -- `HugeIcons.strokeRoundedMarketing`
2436 -- `HugeIcons.strokeRoundedMaskLove`
2437 -- `HugeIcons.strokeRoundedMask`
2438 -- `HugeIcons.strokeRoundedMaskTheater01`
2439 -- `HugeIcons.strokeRoundedMaskTheater02`
2440 -- `HugeIcons.strokeRoundedMasterCard`
2441 -- `HugeIcons.strokeRoundedMastodon`
2442 -- `HugeIcons.strokeRoundedMatches`
2443 -- `HugeIcons.strokeRoundedMaterialAndTexture`
2444 -- `HugeIcons.strokeRoundedMath`
2445 -- `HugeIcons.strokeRoundedMatrix`
2446 -- `HugeIcons.strokeRoundedMaximize01`
2447 -- `HugeIcons.strokeRoundedMaximize02`
2448 -- `HugeIcons.strokeRoundedMaximize03`
2449 -- `HugeIcons.strokeRoundedMaximize04`
2450 -- `HugeIcons.strokeRoundedMaximizeScreen`
2451 -- `HugeIcons.strokeRoundedMayanPyramid`
2452 -- `HugeIcons.strokeRoundedMaze`
2453 -- `HugeIcons.strokeRoundedMcpServer`
2454 -- `HugeIcons.strokeRoundedMedal01`
2455 -- `HugeIcons.strokeRoundedMedal02`
2456 -- `HugeIcons.strokeRoundedMedal03`
2457 -- `HugeIcons.strokeRoundedMedal04`
2458 -- `HugeIcons.strokeRoundedMedal05`
2459 -- `HugeIcons.strokeRoundedMedal06`
2460 -- `HugeIcons.strokeRoundedMedal07`
2461 -- `HugeIcons.strokeRoundedMedalFirstPlace`
2462 -- `HugeIcons.strokeRoundedMedalSecondPlace`
2463 -- `HugeIcons.strokeRoundedMedalThirdPlace`
2464 -- `HugeIcons.strokeRoundedMedicalFile`
2465 -- `HugeIcons.strokeRoundedMedicalMask`
2466 -- `HugeIcons.strokeRoundedMedicine01`
2467 -- `HugeIcons.strokeRoundedMedicine02`
2468 -- `HugeIcons.strokeRoundedMedicineBottle01`
2469 -- `HugeIcons.strokeRoundedMedicineBottle02`
2470 -- `HugeIcons.strokeRoundedMedicineSyrup`
2471 -- `HugeIcons.strokeRoundedMediumSignal`
2472 -- `HugeIcons.strokeRoundedMediumSquare`
2473 -- `HugeIcons.strokeRoundedMedium`
2474 -- `HugeIcons.strokeRoundedMeetingRoom`
2475 -- `HugeIcons.strokeRoundedMegaphone01`
2476 -- `HugeIcons.strokeRoundedMegaphone02`
2477 -- `HugeIcons.strokeRoundedMegaphone03`
2478 -- `HugeIcons.strokeRoundedMeh`
2479 -- `HugeIcons.strokeRoundedMentor`
2480 -- `HugeIcons.strokeRoundedMentoring`
2481 -- `HugeIcons.strokeRoundedMenu01`
2482 -- `HugeIcons.strokeRoundedMenu02`
2483 -- `HugeIcons.strokeRoundedMenu03`
2484 -- `HugeIcons.strokeRoundedMenu04`
2485 -- `HugeIcons.strokeRoundedMenu05`
2486 -- `HugeIcons.strokeRoundedMenu06`
2487 -- `HugeIcons.strokeRoundedMenu07`
2488 -- `HugeIcons.strokeRoundedMenu08`
2489 -- `HugeIcons.strokeRoundedMenu09`
2490 -- `HugeIcons.strokeRoundedMenu10`
2491 -- `HugeIcons.strokeRoundedMenu11`
2492 -- `HugeIcons.strokeRoundedMenuCircle`
2493 -- `HugeIcons.strokeRoundedMenuCollapse`
2494 -- `HugeIcons.strokeRoundedMenuRestaurant`
2495 -- `HugeIcons.strokeRoundedMenuSquare`
2496 -- `HugeIcons.strokeRoundedMenuTwoLine`
2497 -- `HugeIcons.strokeRoundedMessage01`
2498 -- `HugeIcons.strokeRoundedMessage02`
2499 -- `HugeIcons.strokeRoundedMessageAdd01`
2500 -- `HugeIcons.strokeRoundedMessageAdd02`
2501 -- `HugeIcons.strokeRoundedMessageBlocked`
2502 -- `HugeIcons.strokeRoundedMessageCancel01`
2503 -- `HugeIcons.strokeRoundedMessageCancel02`
2504 -- `HugeIcons.strokeRoundedMessageDelay01`
2505 -- `HugeIcons.strokeRoundedMessageDelay02`
2506 -- `HugeIcons.strokeRoundedMessageDone01`
2507 -- `HugeIcons.strokeRoundedMessageDone02`
2508 -- `HugeIcons.strokeRoundedMessageDownload01`
2509 -- `HugeIcons.strokeRoundedMessageDownload02`
2510 -- `HugeIcons.strokeRoundedMessageEdit01`
2511 -- `HugeIcons.strokeRoundedMessageEdit02`
2512 -- `HugeIcons.strokeRoundedMessageFavourite01`
2513 -- `HugeIcons.strokeRoundedMessageFavourite02`
2514 -- `HugeIcons.strokeRoundedMessageIncoming01`
2515 -- `HugeIcons.strokeRoundedMessageIncoming02`
2516 -- `HugeIcons.strokeRoundedMessageLock01`
2517 -- `HugeIcons.strokeRoundedMessageLock02`
2518 -- `HugeIcons.strokeRoundedMessageMultiple01`
2519 -- `HugeIcons.strokeRoundedMessageMultiple02`
2520 -- `HugeIcons.strokeRoundedMessageNotification01`
2521 -- `HugeIcons.strokeRoundedMessageNotification02`
2522 -- `HugeIcons.strokeRoundedMessageOutgoing01`
2523 -- `HugeIcons.strokeRoundedMessageOutgoing02`
2524 -- `HugeIcons.strokeRoundedMessagePreview01`
2525 -- `HugeIcons.strokeRoundedMessagePreview02`
2526 -- `HugeIcons.strokeRoundedMessageProgramming`
2527 -- `HugeIcons.strokeRoundedMessageQuestion`
2528 -- `HugeIcons.strokeRoundedMessageSearch01`
2529 -- `HugeIcons.strokeRoundedMessageSearch02`
2530 -- `HugeIcons.strokeRoundedMessageSecure01`
2531 -- `HugeIcons.strokeRoundedMessageSecure02`
2532 -- `HugeIcons.strokeRoundedMessageTranslate`
2533 -- `HugeIcons.strokeRoundedMessageUnlock01`
2534 -- `HugeIcons.strokeRoundedMessageUnlock02`
2535 -- `HugeIcons.strokeRoundedMessageUpload01`
2536 -- `HugeIcons.strokeRoundedMessageUpload02`
2537 -- `HugeIcons.strokeRoundedMessageUser01`
2538 -- `HugeIcons.strokeRoundedMessageUser02`
2539 -- `HugeIcons.strokeRoundedMessenger`
2540 -- `HugeIcons.strokeRoundedMeta`
2541 -- `HugeIcons.strokeRoundedMetro`
2542 -- `HugeIcons.strokeRoundedMic01`
2543 -- `HugeIcons.strokeRoundedMic02`
2544 -- `HugeIcons.strokeRoundedMicOff01`
2545 -- `HugeIcons.strokeRoundedMicOff02`
2546 -- `HugeIcons.strokeRoundedMicroscope`
2547 -- `HugeIcons.strokeRoundedMicrosoftAdmin`
2548 -- `HugeIcons.strokeRoundedMicrosoft`
2549 -- `HugeIcons.strokeRoundedMicrowave`
2550 -- `HugeIcons.strokeRoundedMilkBottle`
2551 -- `HugeIcons.strokeRoundedMilkCarton`
2552 -- `HugeIcons.strokeRoundedMilkCoconut`
2553 -- `HugeIcons.strokeRoundedMilkOat`
2554 -- `HugeIcons.strokeRoundedMinimize01`
2555 -- `HugeIcons.strokeRoundedMinimize02`
2556 -- `HugeIcons.strokeRoundedMinimize03`
2557 -- `HugeIcons.strokeRoundedMinimize04`
2558 -- `HugeIcons.strokeRoundedMinimizeScreen`
2559 -- `HugeIcons.strokeRoundedMining01`
2560 -- `HugeIcons.strokeRoundedMining02`
2561 -- `HugeIcons.strokeRoundedMining03`
2562 -- `HugeIcons.strokeRoundedMinusPlus01`
2563 -- `HugeIcons.strokeRoundedMinusPlus02`
2564 -- `HugeIcons.strokeRoundedMinusPlusCircle01`
2565 -- `HugeIcons.strokeRoundedMinusPlusCircle02`
2566 -- `HugeIcons.strokeRoundedMinusPlusSquare01`
2567 -- `HugeIcons.strokeRoundedMinusPlusSquare02`
2568 -- `HugeIcons.strokeRoundedMinusSignCircle`
2569 -- `HugeIcons.strokeRoundedMinusSignSquare`
2570 -- `HugeIcons.strokeRoundedMinusSign`
2571 -- `HugeIcons.strokeRoundedMirror`
2572 -- `HugeIcons.strokeRoundedMirroringScreen`
2573 -- `HugeIcons.strokeRoundedMistral`
2574 -- `HugeIcons.strokeRoundedMixer`
2575 -- `HugeIcons.strokeRoundedMobileNavigator01`
2576 -- `HugeIcons.strokeRoundedMobileNavigator02`
2577 -- `HugeIcons.strokeRoundedMobileProgramming01`
2578 -- `HugeIcons.strokeRoundedMobileProgramming02`
2579 -- `HugeIcons.strokeRoundedMobileProtection`
2580 -- `HugeIcons.strokeRoundedMobileSecurity`
2581 -- `HugeIcons.strokeRoundedMochi`
2582 -- `HugeIcons.strokeRoundedModernTv4K`
2583 -- `HugeIcons.strokeRoundedModernTvIssue`
2584 -- `HugeIcons.strokeRoundedModernTv`
2585 -- `HugeIcons.strokeRoundedMolecules`
2586 -- `HugeIcons.strokeRoundedMollie`
2587 -- `HugeIcons.strokeRoundedMonas`
2588 -- `HugeIcons.strokeRoundedMoney01`
2589 -- `HugeIcons.strokeRoundedMoney02`
2590 -- `HugeIcons.strokeRoundedMoney03`
2591 -- `HugeIcons.strokeRoundedMoney04`
2592 -- `HugeIcons.strokeRoundedMoneyAdd01`
2593 -- `HugeIcons.strokeRoundedMoneyAdd02`
2594 -- `HugeIcons.strokeRoundedMoneyBag01`
2595 -- `HugeIcons.strokeRoundedMoneyBag02`
2596 -- `HugeIcons.strokeRoundedMoneyExchange01`
2597 -- `HugeIcons.strokeRoundedMoneyExchange02`
2598 -- `HugeIcons.strokeRoundedMoneyExchange03`
2599 -- `HugeIcons.strokeRoundedMoneyNotFound01`
2600 -- `HugeIcons.strokeRoundedMoneyNotFound02`
2601 -- `HugeIcons.strokeRoundedMoneyNotFound03`
2602 -- `HugeIcons.strokeRoundedMoneyNotFound04`
2603 -- `HugeIcons.strokeRoundedMoneyReceive01`
2604 -- `HugeIcons.strokeRoundedMoneyReceive02`
2605 -- `HugeIcons.strokeRoundedMoneyReceiveCircle`
2606 -- `HugeIcons.strokeRoundedMoneyReceiveFlow01`
2607 -- `HugeIcons.strokeRoundedMoneyReceiveFlow02`
2608 -- `HugeIcons.strokeRoundedMoneyReceiveSquare`
2609 -- `HugeIcons.strokeRoundedMoneyRemove01`
2610 -- `HugeIcons.strokeRoundedMoneyRemove02`
2611 -- `HugeIcons.strokeRoundedMoneySafe`
2612 -- `HugeIcons.strokeRoundedMoneySavingJar`
2613 -- `HugeIcons.strokeRoundedMoneySecurity`
2614 -- `HugeIcons.strokeRoundedMoneySend01`
2615 -- `HugeIcons.strokeRoundedMoneySend02`
2616 -- `HugeIcons.strokeRoundedMoneySendCircle`
2617 -- `HugeIcons.strokeRoundedMoneySendFlow01`
2618 -- `HugeIcons.strokeRoundedMoneySendFlow02`
2619 -- `HugeIcons.strokeRoundedMoneySendSquare`
2620 -- `HugeIcons.strokeRoundedMonocle01`
2621 -- `HugeIcons.strokeRoundedMonocle`
2622 -- `HugeIcons.strokeRoundedMonster`
2623 -- `HugeIcons.strokeRoundedMoon01`
2624 -- `HugeIcons.strokeRoundedMoon02`
2625 -- `HugeIcons.strokeRoundedMoonAngledRainZap`
2626 -- `HugeIcons.strokeRoundedMoonCloudAngledRain`
2627 -- `HugeIcons.strokeRoundedMoonCloudAngledZap`
2628 -- `HugeIcons.strokeRoundedMoonCloudBigRain`
2629 -- `HugeIcons.strokeRoundedMoonCloudFastWind`
2630 -- `HugeIcons.strokeRoundedMoonCloudHailstone`
2631 -- `HugeIcons.strokeRoundedMoonCloudLittleRain`
2632 -- `HugeIcons.strokeRoundedMoonCloudLittleSnow`
2633 -- `HugeIcons.strokeRoundedMoonCloudMidRain`
2634 -- `HugeIcons.strokeRoundedMoonCloudMidSnow`
2635 -- `HugeIcons.strokeRoundedMoonCloudSlowWind`
2636 -- `HugeIcons.strokeRoundedMoonCloudSnow`
2637 -- `HugeIcons.strokeRoundedMoonCloud`
2638 -- `HugeIcons.strokeRoundedMoonEclipse`
2639 -- `HugeIcons.strokeRoundedMoonFastWind`
2640 -- `HugeIcons.strokeRoundedMoonLanding`
2641 -- `HugeIcons.strokeRoundedMoonSlowWind`
2642 -- `HugeIcons.strokeRoundedMoon`
2643 -- `HugeIcons.strokeRoundedMoonset`
2644 -- `HugeIcons.strokeRoundedMore01`
2645 -- `HugeIcons.strokeRoundedMore02`
2646 -- `HugeIcons.strokeRoundedMore03`
2647 -- `HugeIcons.strokeRoundedMoreHorizontalCircle01`
2648 -- `HugeIcons.strokeRoundedMoreHorizontalCircle02`
2649 -- `HugeIcons.strokeRoundedMoreHorizontalSquare01`
2650 -- `HugeIcons.strokeRoundedMoreHorizontalSquare02`
2651 -- `HugeIcons.strokeRoundedMoreHorizontal`
2652 -- `HugeIcons.strokeRoundedMoreOrLessCircle`
2653 -- `HugeIcons.strokeRoundedMoreOrLessSquare`
2654 -- `HugeIcons.strokeRoundedMoreOrLess`
2655 -- `HugeIcons.strokeRoundedMore`
2656 -- `HugeIcons.strokeRoundedMoreVerticalCircle01`
2657 -- `HugeIcons.strokeRoundedMoreVerticalCircle02`
2658 -- `HugeIcons.strokeRoundedMoreVerticalSquare01`
2659 -- `HugeIcons.strokeRoundedMoreVerticalSquare02`
2660 -- `HugeIcons.strokeRoundedMoreVertical`
2661 -- `HugeIcons.strokeRoundedMortar`
2662 -- `HugeIcons.strokeRoundedMortarboard01`
2663 -- `HugeIcons.strokeRoundedMortarboard02`
2664 -- `HugeIcons.strokeRoundedMosque01`
2665 -- `HugeIcons.strokeRoundedMosque02`
2666 -- `HugeIcons.strokeRoundedMosque03`
2667 -- `HugeIcons.strokeRoundedMosque04`
2668 -- `HugeIcons.strokeRoundedMosque05`
2669 -- `HugeIcons.strokeRoundedMosqueLocation`
2670 -- `HugeIcons.strokeRoundedMotion01`
2671 -- `HugeIcons.strokeRoundedMotion02`
2672 -- `HugeIcons.strokeRoundedMotorbike01`
2673 -- `HugeIcons.strokeRoundedMotorbike02`
2674 -- `HugeIcons.strokeRoundedMountain`
2675 -- `HugeIcons.strokeRoundedMouse01`
2676 -- `HugeIcons.strokeRoundedMouse02`
2677 -- `HugeIcons.strokeRoundedMouse03`
2678 -- `HugeIcons.strokeRoundedMouse04`
2679 -- `HugeIcons.strokeRoundedMouse05`
2680 -- `HugeIcons.strokeRoundedMouse06`
2681 -- `HugeIcons.strokeRoundedMouse07`
2682 -- `HugeIcons.strokeRoundedMouse08`
2683 -- `HugeIcons.strokeRoundedMouse09`
2684 -- `HugeIcons.strokeRoundedMouse10`
2685 -- `HugeIcons.strokeRoundedMouse11`
2686 -- `HugeIcons.strokeRoundedMouse12`
2687 -- `HugeIcons.strokeRoundedMouse13`
2688 -- `HugeIcons.strokeRoundedMouse14`
2689 -- `HugeIcons.strokeRoundedMouse15`
2690 -- `HugeIcons.strokeRoundedMouse16`
2691 -- `HugeIcons.strokeRoundedMouse17`
2692 -- `HugeIcons.strokeRoundedMouse18`
2693 -- `HugeIcons.strokeRoundedMouse19`
2694 -- `HugeIcons.strokeRoundedMouse20`
2695 -- `HugeIcons.strokeRoundedMouse21`
2696 -- `HugeIcons.strokeRoundedMouse22`
2697 -- `HugeIcons.strokeRoundedMouse23`
2698 -- `HugeIcons.strokeRoundedMouseLeftClick01`
2699 -- `HugeIcons.strokeRoundedMouseLeftClick02`
2700 -- `HugeIcons.strokeRoundedMouseLeftClick03`
2701 -- `HugeIcons.strokeRoundedMouseLeftClick04`
2702 -- `HugeIcons.strokeRoundedMouseLeftClick05`
2703 -- `HugeIcons.strokeRoundedMouseLeftClick06`
2704 -- `HugeIcons.strokeRoundedMouseRightClick01`
2705 -- `HugeIcons.strokeRoundedMouseRightClick02`
2706 -- `HugeIcons.strokeRoundedMouseRightClick03`
2707 -- `HugeIcons.strokeRoundedMouseRightClick04`
2708 -- `HugeIcons.strokeRoundedMouseRightClick05`
2709 -- `HugeIcons.strokeRoundedMouseRightClick06`
2710 -- `HugeIcons.strokeRoundedMouseScroll01`
2711 -- `HugeIcons.strokeRoundedMouseScroll02`
2712 -- `HugeIcons.strokeRoundedMove01`
2713 -- `HugeIcons.strokeRoundedMove02`
2714 -- `HugeIcons.strokeRoundedMoveBottom`
2715 -- `HugeIcons.strokeRoundedMoveLeft`
2716 -- `HugeIcons.strokeRoundedMoveRight`
2717 -- `HugeIcons.strokeRoundedMove`
2718 -- `HugeIcons.strokeRoundedMoveTo`
2719 -- `HugeIcons.strokeRoundedMoveTop`
2720 -- `HugeIcons.strokeRoundedMp301`
2721 -- `HugeIcons.strokeRoundedMp302`
2722 -- `HugeIcons.strokeRoundedMp401`
2723 -- `HugeIcons.strokeRoundedMp402`
2724 -- `HugeIcons.strokeRoundedMuhammad`
2725 -- `HugeIcons.strokeRoundedMultiplicationSignCircle`
2726 -- `HugeIcons.strokeRoundedMultiplicationSignSquare`
2727 -- `HugeIcons.strokeRoundedMultiplicationSign`
2728 -- `HugeIcons.strokeRoundedMushroom01`
2729 -- `HugeIcons.strokeRoundedMushroom`
2730 -- `HugeIcons.strokeRoundedMusicNote01`
2731 -- `HugeIcons.strokeRoundedMusicNote02`
2732 -- `HugeIcons.strokeRoundedMusicNote03`
2733 -- `HugeIcons.strokeRoundedMusicNote04`
2734 -- `HugeIcons.strokeRoundedMusicNoteSquare01`
2735 -- `HugeIcons.strokeRoundedMusicNoteSquare02`
2736 -- `HugeIcons.strokeRoundedMuslim`
2737 -- `HugeIcons.strokeRoundedMute`
2738 -- `HugeIcons.strokeRoundedMymind`
2739 -- `HugeIcons.strokeRoundedNThRootCircle`
2740 -- `HugeIcons.strokeRoundedNThRootSquare`
2741 -- `HugeIcons.strokeRoundedNThRoot`
2742 -- `HugeIcons.strokeRoundedNanoTechnology`
2743 -- `HugeIcons.strokeRoundedNapkins01`
2744 -- `HugeIcons.strokeRoundedNapkins02`
2745 -- `HugeIcons.strokeRoundedNaturalFood`
2746 -- `HugeIcons.strokeRoundedNavigation01`
2747 -- `HugeIcons.strokeRoundedNavigation02`
2748 -- `HugeIcons.strokeRoundedNavigation03`
2749 -- `HugeIcons.strokeRoundedNavigation04`
2750 -- `HugeIcons.strokeRoundedNavigation05`
2751 -- `HugeIcons.strokeRoundedNavigation06`
2752 -- `HugeIcons.strokeRoundedNavigator01`
2753 -- `HugeIcons.strokeRoundedNavigator02`
2754 -- `HugeIcons.strokeRoundedNecklace`
2755 -- `HugeIcons.strokeRoundedNerd`
2756 -- `HugeIcons.strokeRoundedNeuralNetwork`
2757 -- `HugeIcons.strokeRoundedNeutral`
2758 -- `HugeIcons.strokeRoundedNewJob`
2759 -- `HugeIcons.strokeRoundedNewOffice`
2760 -- `HugeIcons.strokeRoundedNewReleases`
2761 -- `HugeIcons.strokeRoundedNewTwitterEllipse`
2762 -- `HugeIcons.strokeRoundedNewTwitterRectangle`
2763 -- `HugeIcons.strokeRoundedNewTwitter`
2764 -- `HugeIcons.strokeRoundedNews01`
2765 -- `HugeIcons.strokeRoundedNews`
2766 -- `HugeIcons.strokeRoundedNext`
2767 -- `HugeIcons.strokeRoundedNike`
2768 -- `HugeIcons.strokeRoundedNineCircle`
2769 -- `HugeIcons.strokeRoundedNineSquare`
2770 -- `HugeIcons.strokeRoundedNintendo`
2771 -- `HugeIcons.strokeRoundedNintendoSwitch`
2772 -- `HugeIcons.strokeRoundedNiqab`
2773 -- `HugeIcons.strokeRoundedNoInternet`
2774 -- `HugeIcons.strokeRoundedNoMeetingRoom`
2775 -- `HugeIcons.strokeRoundedNoSignal`
2776 -- `HugeIcons.strokeRoundedNodeAdd`
2777 -- `HugeIcons.strokeRoundedNodeEdit`
2778 -- `HugeIcons.strokeRoundedNodeMoveDown`
2779 -- `HugeIcons.strokeRoundedNodeMoveUp`
2780 -- `HugeIcons.strokeRoundedNodeRemove`
2781 -- `HugeIcons.strokeRoundedNoodles`
2782 -- `HugeIcons.strokeRoundedNose`
2783 -- `HugeIcons.strokeRoundedNotEqualSignCircle`
2784 -- `HugeIcons.strokeRoundedNotEqualSignSquare`
2785 -- `HugeIcons.strokeRoundedNotEqualSign`
2786 -- `HugeIcons.strokeRoundedNote01`
2787 -- `HugeIcons.strokeRoundedNote02`
2788 -- `HugeIcons.strokeRoundedNote03`
2789 -- `HugeIcons.strokeRoundedNote04`
2790 -- `HugeIcons.strokeRoundedNote05`
2791 -- `HugeIcons.strokeRoundedNoteAdd`
2792 -- `HugeIcons.strokeRoundedNoteDone`
2793 -- `HugeIcons.strokeRoundedNoteEdit`
2794 -- `HugeIcons.strokeRoundedNoteRemove`
2795 -- `HugeIcons.strokeRoundedNote`
2796 -- `HugeIcons.strokeRoundedNotebook01`
2797 -- `HugeIcons.strokeRoundedNotebook02`
2798 -- `HugeIcons.strokeRoundedNotebook`
2799 -- `HugeIcons.strokeRoundedNotification01`
2800 -- `HugeIcons.strokeRoundedNotification02`
2801 -- `HugeIcons.strokeRoundedNotification03`
2802 -- `HugeIcons.strokeRoundedNotificationBlock01`
2803 -- `HugeIcons.strokeRoundedNotificationBlock02`
2804 -- `HugeIcons.strokeRoundedNotificationBlock03`
2805 -- `HugeIcons.strokeRoundedNotificationBubble`
2806 -- `HugeIcons.strokeRoundedNotificationCircle`
2807 -- `HugeIcons.strokeRoundedNotificationOff01`
2808 -- `HugeIcons.strokeRoundedNotificationOff02`
2809 -- `HugeIcons.strokeRoundedNotificationOff03`
2810 -- `HugeIcons.strokeRoundedNotificationSnooze01`
2811 -- `HugeIcons.strokeRoundedNotificationSnooze02`
2812 -- `HugeIcons.strokeRoundedNotificationSnooze03`
2813 -- `HugeIcons.strokeRoundedNotificationSquare`
2814 -- `HugeIcons.strokeRoundedNotion01`
2815 -- `HugeIcons.strokeRoundedNotion02`
2816 -- `HugeIcons.strokeRoundedNpm`
2817 -- `HugeIcons.strokeRoundedNuclearPower`
2818 -- `HugeIcons.strokeRoundedNut`
2819 -- `HugeIcons.strokeRoundedObtuse`
2820 -- `HugeIcons.strokeRoundedOctagon`
2821 -- `HugeIcons.strokeRoundedOctopus`
2822 -- `HugeIcons.strokeRoundedOffice365`
2823 -- `HugeIcons.strokeRoundedOfficeChair`
2824 -- `HugeIcons.strokeRoundedOffice`
2825 -- `HugeIcons.strokeRoundedOilBarrel`
2826 -- `HugeIcons.strokeRoundedOkFinger`
2827 -- `HugeIcons.strokeRoundedOlympicTorch`
2828 -- `HugeIcons.strokeRoundedOneCircle`
2829 -- `HugeIcons.strokeRoundedOneSquare`
2830 -- `HugeIcons.strokeRoundedOnlineLearning01`
2831 -- `HugeIcons.strokeRoundedOnlineLearning02`
2832 -- `HugeIcons.strokeRoundedOnlineLearning03`
2833 -- `HugeIcons.strokeRoundedOnlineLearning04`
2834 -- `HugeIcons.strokeRoundedOpenCaption`
2835 -- `HugeIcons.strokeRoundedOpenSource`
2836 -- `HugeIcons.strokeRoundedOption`
2837 -- `HugeIcons.strokeRoundedOrange`
2838 -- `HugeIcons.strokeRoundedOrbit01`
2839 -- `HugeIcons.strokeRoundedOrbit02`
2840 -- `HugeIcons.strokeRoundedOrganicFood`
2841 -- `HugeIcons.strokeRoundedOrthogonalEdge`
2842 -- `HugeIcons.strokeRoundedOval`
2843 -- `HugeIcons.strokeRoundedOven`
2844 -- `HugeIcons.strokeRoundedPackage01`
2845 -- `HugeIcons.strokeRoundedPackage02`
2846 -- `HugeIcons.strokeRoundedPackage03`
2847 -- `HugeIcons.strokeRoundedPackageAdd01`
2848 -- `HugeIcons.strokeRoundedPackageAdd`
2849 -- `HugeIcons.strokeRoundedPackageDelivered01`
2850 -- `HugeIcons.strokeRoundedPackageDelivered`
2851 -- `HugeIcons.strokeRoundedPackageDimensions01`
2852 -- `HugeIcons.strokeRoundedPackageDimensions02`
2853 -- `HugeIcons.strokeRoundedPackageMoving01`
2854 -- `HugeIcons.strokeRoundedPackageMoving`
2855 -- `HugeIcons.strokeRoundedPackageOpen`
2856 -- `HugeIcons.strokeRoundedPackageOutOfStock`
2857 -- `HugeIcons.strokeRoundedPackageProcess01`
2858 -- `HugeIcons.strokeRoundedPackageProcess`
2859 -- `HugeIcons.strokeRoundedPackageReceive01`
2860 -- `HugeIcons.strokeRoundedPackageReceive`
2861 -- `HugeIcons.strokeRoundedPackageRemove01`
2862 -- `HugeIcons.strokeRoundedPackageRemove`
2863 -- `HugeIcons.strokeRoundedPackageSearch01`
2864 -- `HugeIcons.strokeRoundedPackageSearch`
2865 -- `HugeIcons.strokeRoundedPackageSent01`
2866 -- `HugeIcons.strokeRoundedPackageSent`
2867 -- `HugeIcons.strokeRoundedPackage`
2868 -- `HugeIcons.strokeRoundedPackaging`
2869 -- `HugeIcons.strokeRoundedPacman01`
2870 -- `HugeIcons.strokeRoundedPacman02`
2871 -- `HugeIcons.strokeRoundedPaella`
2872 -- `HugeIcons.strokeRoundedPaintBoard`
2873 -- `HugeIcons.strokeRoundedPaintBrush01`
2874 -- `HugeIcons.strokeRoundedPaintBrush02`
2875 -- `HugeIcons.strokeRoundedPaintBrush03`
2876 -- `HugeIcons.strokeRoundedPaintBrush04`
2877 -- `HugeIcons.strokeRoundedPaintBucket`
2878 -- `HugeIcons.strokeRoundedPan01`
2879 -- `HugeIcons.strokeRoundedPan02`
2880 -- `HugeIcons.strokeRoundedPan03`
2881 -- `HugeIcons.strokeRoundedParabola01`
2882 -- `HugeIcons.strokeRoundedParabola02`
2883 -- `HugeIcons.strokeRoundedParabola03`
2884 -- `HugeIcons.strokeRoundedParagliding`
2885 -- `HugeIcons.strokeRoundedParagraphBulletsPoint01`
2886 -- `HugeIcons.strokeRoundedParagraphBulletsPoint02`
2887 -- `HugeIcons.strokeRoundedParagraphSpacing`
2888 -- `HugeIcons.strokeRoundedParagraph`
2889 -- `HugeIcons.strokeRoundedParallelogram`
2890 -- `HugeIcons.strokeRoundedParkingAreaCircle`
2891 -- `HugeIcons.strokeRoundedParkingAreaSquare`
2892 -- `HugeIcons.strokeRoundedParty`
2893 -- `HugeIcons.strokeRoundedPassport01`
2894 -- `HugeIcons.strokeRoundedPassportExpired`
2895 -- `HugeIcons.strokeRoundedPassport`
2896 -- `HugeIcons.strokeRoundedPassportValid`
2897 -- `HugeIcons.strokeRoundedPasswordValidation`
2898 -- `HugeIcons.strokeRoundedPath`
2899 -- `HugeIcons.strokeRoundedPathfinderCrop`
2900 -- `HugeIcons.strokeRoundedPathfinderDivide`
2901 -- `HugeIcons.strokeRoundedPathfinderExclude`
2902 -- `HugeIcons.strokeRoundedPathfinderIntersect`
2903 -- `HugeIcons.strokeRoundedPathfinderMerge`
2904 -- `HugeIcons.strokeRoundedPathfinderMinusBack`
2905 -- `HugeIcons.strokeRoundedPathfinderMinusFront`
2906 -- `HugeIcons.strokeRoundedPathfinderOutline`
2907 -- `HugeIcons.strokeRoundedPathfinderTrim`
2908 -- `HugeIcons.strokeRoundedPathfinderUnite`
2909 -- `HugeIcons.strokeRoundedPatient`
2910 -- `HugeIcons.strokeRoundedPatio`
2911 -- `HugeIcons.strokeRoundedPauseCircle`
2912 -- `HugeIcons.strokeRoundedPause`
2913 -- `HugeIcons.strokeRoundedPavilon`
2914 -- `HugeIcons.strokeRoundedPayByCheck`
2915 -- `HugeIcons.strokeRoundedPayment01`
2916 -- `HugeIcons.strokeRoundedPayment02`
2917 -- `HugeIcons.strokeRoundedPaymentSuccess01`
2918 -- `HugeIcons.strokeRoundedPaymentSuccess02`
2919 -- `HugeIcons.strokeRoundedPayoneer`
2920 -- `HugeIcons.strokeRoundedPaypal`
2921 -- `HugeIcons.strokeRoundedPdf01`
2922 -- `HugeIcons.strokeRoundedPdf02`
2923 -- `HugeIcons.strokeRoundedPeerToPeer01`
2924 -- `HugeIcons.strokeRoundedPeerToPeer02`
2925 -- `HugeIcons.strokeRoundedPeerToPeer03`
2926 -- `HugeIcons.strokeRoundedPen01`
2927 -- `HugeIcons.strokeRoundedPen02`
2928 -- `HugeIcons.strokeRoundedPenConnectBluetooth`
2929 -- `HugeIcons.strokeRoundedPenConnectUsb`
2930 -- `HugeIcons.strokeRoundedPenConnectWifi`
2931 -- `HugeIcons.strokeRoundedPenTool01`
2932 -- `HugeIcons.strokeRoundedPenTool02`
2933 -- `HugeIcons.strokeRoundedPenTool03`
2934 -- `HugeIcons.strokeRoundedPenToolAdd`
2935 -- `HugeIcons.strokeRoundedPenToolMinus`
2936 -- `HugeIcons.strokeRoundedPencilEdit01`
2937 -- `HugeIcons.strokeRoundedPencilEdit02`
2938 -- `HugeIcons.strokeRoundedPencil`
2939 -- `HugeIcons.strokeRoundedPendulum`
2940 -- `HugeIcons.strokeRoundedPensive`
2941 -- `HugeIcons.strokeRoundedPentagon01`
2942 -- `HugeIcons.strokeRoundedPentagon`
2943 -- `HugeIcons.strokeRoundedPercentCircle`
2944 -- `HugeIcons.strokeRoundedPercentSquare`
2945 -- `HugeIcons.strokeRoundedPercent`
2946 -- `HugeIcons.strokeRoundedPerfume`
2947 -- `HugeIcons.strokeRoundedPeriscope`
2948 -- `HugeIcons.strokeRoundedPermanentJob`
2949 -- `HugeIcons.strokeRoundedPerplexityAi`
2950 -- `HugeIcons.strokeRoundedPerspective`
2951 -- `HugeIcons.strokeRoundedPetrolPump`
2952 -- `HugeIcons.strokeRoundedPexels`
2953 -- `HugeIcons.strokeRoundedPhoneArrowDown`
2954 -- `HugeIcons.strokeRoundedPhoneArrowUp`
2955 -- `HugeIcons.strokeRoundedPhoneCheck`
2956 -- `HugeIcons.strokeRoundedPhoneDeveloperMode`
2957 -- `HugeIcons.strokeRoundedPhoneErase`
2958 -- `HugeIcons.strokeRoundedPhoneLock`
2959 -- `HugeIcons.strokeRoundedPhoneOff01`
2960 -- `HugeIcons.strokeRoundedPhoneOff02`
2961 -- `HugeIcons.strokeRoundedPhp`
2962 -- `HugeIcons.strokeRoundedPhysics`
2963 -- `HugeIcons.strokeRoundedPiCircle`
2964 -- `HugeIcons.strokeRoundedPiSquare`
2965 -- `HugeIcons.strokeRoundedPi`
2966 -- `HugeIcons.strokeRoundedPicasa`
2967 -- `HugeIcons.strokeRoundedPickup01`
2968 -- `HugeIcons.strokeRoundedPickup02`
2969 -- `HugeIcons.strokeRoundedPictureInPictureExit`
2970 -- `HugeIcons.strokeRoundedPictureInPictureOn`
2971 -- `HugeIcons.strokeRoundedPieChart01`
2972 -- `HugeIcons.strokeRoundedPieChart02`
2973 -- `HugeIcons.strokeRoundedPieChart03`
2974 -- `HugeIcons.strokeRoundedPieChart04`
2975 -- `HugeIcons.strokeRoundedPieChart05`
2976 -- `HugeIcons.strokeRoundedPieChart06`
2977 -- `HugeIcons.strokeRoundedPieChart07`
2978 -- `HugeIcons.strokeRoundedPieChart08`
2979 -- `HugeIcons.strokeRoundedPieChart09`
2980 -- `HugeIcons.strokeRoundedPieChartSquare`
2981 -- `HugeIcons.strokeRoundedPieChart`
2982 -- `HugeIcons.strokeRoundedPie`
2983 -- `HugeIcons.strokeRoundedPiggyBank`
2984 -- `HugeIcons.strokeRoundedPin02`
2985 -- `HugeIcons.strokeRoundedPinCode`
2986 -- `HugeIcons.strokeRoundedPinLocation01`
2987 -- `HugeIcons.strokeRoundedPinLocation02`
2988 -- `HugeIcons.strokeRoundedPinLocation03`
2989 -- `HugeIcons.strokeRoundedPinOff`
2990 -- `HugeIcons.strokeRoundedPin`
2991 -- `HugeIcons.strokeRoundedPineTree`
2992 -- `HugeIcons.strokeRoundedPinterest`
2993 -- `HugeIcons.strokeRoundedPipeline`
2994 -- `HugeIcons.strokeRoundedPisaTower`
2995 -- `HugeIcons.strokeRoundedPivot`
2996 -- `HugeIcons.strokeRoundedPizza01`
2997 -- `HugeIcons.strokeRoundedPizza02`
2998 -- `HugeIcons.strokeRoundedPizza03`
2999 -- `HugeIcons.strokeRoundedPizza04`
3000 -- `HugeIcons.strokeRoundedPizzaCutter`
3001 -- `HugeIcons.strokeRoundedPlane`
3002 -- `HugeIcons.strokeRoundedPlant01`
3003 -- `HugeIcons.strokeRoundedPlant02`
3004 -- `HugeIcons.strokeRoundedPlant03`
3005 -- `HugeIcons.strokeRoundedPlant04`
3006 -- `HugeIcons.strokeRoundedPlate`
3007 -- `HugeIcons.strokeRoundedPlaxo`
3008 -- `HugeIcons.strokeRoundedPlayCircle02`
3009 -- `HugeIcons.strokeRoundedPlayCircle`
3010 -- `HugeIcons.strokeRoundedPlayListAdd`
3011 -- `HugeIcons.strokeRoundedPlayListFavourite01`
3012 -- `HugeIcons.strokeRoundedPlayListFavourite02`
3013 -- `HugeIcons.strokeRoundedPlayListMinus`
3014 -- `HugeIcons.strokeRoundedPlayListRemove`
3015 -- `HugeIcons.strokeRoundedPlayList`
3016 -- `HugeIcons.strokeRoundedPlaySquare`
3017 -- `HugeIcons.strokeRoundedPlayStore`
3018 -- `HugeIcons.strokeRoundedPlay`
3019 -- `HugeIcons.strokeRoundedPlaylist01`
3020 -- `HugeIcons.strokeRoundedPlaylist02`
3021 -- `HugeIcons.strokeRoundedPlaylist03`
3022 -- `HugeIcons.strokeRoundedPlaza`
3023 -- `HugeIcons.strokeRoundedPlug01`
3024 -- `HugeIcons.strokeRoundedPlug02`
3025 -- `HugeIcons.strokeRoundedPlugSocket`
3026 -- `HugeIcons.strokeRoundedPlusMinus01`
3027 -- `HugeIcons.strokeRoundedPlusMinus02`
3028 -- `HugeIcons.strokeRoundedPlusMinusCircle01`
3029 -- `HugeIcons.strokeRoundedPlusMinusCircle02`
3030 -- `HugeIcons.strokeRoundedPlusMinusSquare01`
3031 -- `HugeIcons.strokeRoundedPlusMinusSquare02`
3032 -- `HugeIcons.strokeRoundedPlusMinus`
3033 -- `HugeIcons.strokeRoundedPlusSignCircle`
3034 -- `HugeIcons.strokeRoundedPlusSignSquare`
3035 -- `HugeIcons.strokeRoundedPlusSign`
3036 -- `HugeIcons.strokeRoundedPng01`
3037 -- `HugeIcons.strokeRoundedPng02`
3038 -- `HugeIcons.strokeRoundedPodcast`
3039 -- `HugeIcons.strokeRoundedPodium`
3040 -- `HugeIcons.strokeRoundedPointingLeft01`
3041 -- `HugeIcons.strokeRoundedPointingLeft02`
3042 -- `HugeIcons.strokeRoundedPointingLeft03`
3043 -- `HugeIcons.strokeRoundedPointingLeft04`
3044 -- `HugeIcons.strokeRoundedPointingLeft05`
3045 -- `HugeIcons.strokeRoundedPointingLeft06`
3046 -- `HugeIcons.strokeRoundedPointingLeft07`
3047 -- `HugeIcons.strokeRoundedPointingLeft08`
3048 -- `HugeIcons.strokeRoundedPointingRight01`
3049 -- `HugeIcons.strokeRoundedPointingRight02`
3050 -- `HugeIcons.strokeRoundedPointingRight03`
3051 -- `HugeIcons.strokeRoundedPointingRight04`
3052 -- `HugeIcons.strokeRoundedPointingRight05`
3053 -- `HugeIcons.strokeRoundedPointingRight06`
3054 -- `HugeIcons.strokeRoundedPointingRight07`
3055 -- `HugeIcons.strokeRoundedPointingRight08`
3056 -- `HugeIcons.strokeRoundedPokeball`
3057 -- `HugeIcons.strokeRoundedPokemon`
3058 -- `HugeIcons.strokeRoundedPoliceBadge`
3059 -- `HugeIcons.strokeRoundedPoliceCap`
3060 -- `HugeIcons.strokeRoundedPoliceCar`
3061 -- `HugeIcons.strokeRoundedPoliceStation`
3062 -- `HugeIcons.strokeRoundedPolicy`
3063 -- `HugeIcons.strokeRoundedPolyTank`
3064 -- `HugeIcons.strokeRoundedPolygon`
3065 -- `HugeIcons.strokeRoundedPool`
3066 -- `HugeIcons.strokeRoundedPoolTable`
3067 -- `HugeIcons.strokeRoundedPoop`
3068 -- `HugeIcons.strokeRoundedPopcorn`
3069 -- `HugeIcons.strokeRoundedPot01`
3070 -- `HugeIcons.strokeRoundedPot02`
3071 -- `HugeIcons.strokeRoundedPotion`
3072 -- `HugeIcons.strokeRoundedPoundCircle`
3073 -- `HugeIcons.strokeRoundedPoundReceive`
3074 -- `HugeIcons.strokeRoundedPoundSend`
3075 -- `HugeIcons.strokeRoundedPoundSquare`
3076 -- `HugeIcons.strokeRoundedPound`
3077 -- `HugeIcons.strokeRoundedPowerService`
3078 -- `HugeIcons.strokeRoundedPowerSocket01`
3079 -- `HugeIcons.strokeRoundedPowerSocket02`
3080 -- `HugeIcons.strokeRoundedPpt01`
3081 -- `HugeIcons.strokeRoundedPpt02`
3082 -- `HugeIcons.strokeRoundedPrawn`
3083 -- `HugeIcons.strokeRoundedPrayerRug01`
3084 -- `HugeIcons.strokeRoundedPrayerRug02`
3085 -- `HugeIcons.strokeRoundedPreferenceHorizontal`
3086 -- `HugeIcons.strokeRoundedPreferenceVertical`
3087 -- `HugeIcons.strokeRoundedPrescription`
3088 -- `HugeIcons.strokeRoundedPresentation01`
3089 -- `HugeIcons.strokeRoundedPresentation02`
3090 -- `HugeIcons.strokeRoundedPresentation03`
3091 -- `HugeIcons.strokeRoundedPresentation04`
3092 -- `HugeIcons.strokeRoundedPresentation05`
3093 -- `HugeIcons.strokeRoundedPresentation06`
3094 -- `HugeIcons.strokeRoundedPresentation07`
3095 -- `HugeIcons.strokeRoundedPresentationBarChart01`
3096 -- `HugeIcons.strokeRoundedPresentationBarChart02`
3097 -- `HugeIcons.strokeRoundedPresentationLineChart01`
3098 -- `HugeIcons.strokeRoundedPresentationLineChart02`
3099 -- `HugeIcons.strokeRoundedPresentationOnline`
3100 -- `HugeIcons.strokeRoundedPresentationPodium`
3101 -- `HugeIcons.strokeRoundedPrevious`
3102 -- `HugeIcons.strokeRoundedPrinter3d`
3103 -- `HugeIcons.strokeRoundedPrinterOff`
3104 -- `HugeIcons.strokeRoundedPrinter`
3105 -- `HugeIcons.strokeRoundedPrism01`
3106 -- `HugeIcons.strokeRoundedPrism`
3107 -- `HugeIcons.strokeRoundedPrisonGuard`
3108 -- `HugeIcons.strokeRoundedPrison`
3109 -- `HugeIcons.strokeRoundedPrisoner`
3110 -- `HugeIcons.strokeRoundedProductLoading`
3111 -- `HugeIcons.strokeRoundedProfile02`
3112 -- `HugeIcons.strokeRoundedProfile`
3113 -- `HugeIcons.strokeRoundedProfit`
3114 -- `HugeIcons.strokeRoundedProgrammingFlag`
3115 -- `HugeIcons.strokeRoundedProgress01`
3116 -- `HugeIcons.strokeRoundedProgress02`
3117 -- `HugeIcons.strokeRoundedProgress03`
3118 -- `HugeIcons.strokeRoundedProgress04`
3119 -- `HugeIcons.strokeRoundedProgress`
3120 -- `HugeIcons.strokeRoundedProjector01`
3121 -- `HugeIcons.strokeRoundedProjector`
3122 -- `HugeIcons.strokeRoundedPromotion`
3123 -- `HugeIcons.strokeRoundedPropertyAdd`
3124 -- `HugeIcons.strokeRoundedPropertyDelete`
3125 -- `HugeIcons.strokeRoundedPropertyEdit`
3126 -- `HugeIcons.strokeRoundedPropertyNew`
3127 -- `HugeIcons.strokeRoundedPropertySearch`
3128 -- `HugeIcons.strokeRoundedPropertyView`
3129 -- `HugeIcons.strokeRoundedProtectionMask`
3130 -- `HugeIcons.strokeRoundedPulley`
3131 -- `HugeIcons.strokeRoundedPulse01`
3132 -- `HugeIcons.strokeRoundedPulse02`
3133 -- `HugeIcons.strokeRoundedPulseRectangle01`
3134 -- `HugeIcons.strokeRoundedPulseRectangle02`
3135 -- `HugeIcons.strokeRoundedPumpkin`
3136 -- `HugeIcons.strokeRoundedPunch`
3137 -- `HugeIcons.strokeRoundedPunchingBall01`
3138 -- `HugeIcons.strokeRoundedPunchingBall02`
3139 -- `HugeIcons.strokeRoundedPurse01`
3140 -- `HugeIcons.strokeRoundedPurse`
3141 -- `HugeIcons.strokeRoundedPushUpBar`
3142 -- `HugeIcons.strokeRoundedPuzzle`
3143 -- `HugeIcons.strokeRoundedPyramidMaslowo`
3144 -- `HugeIcons.strokeRoundedPyramid`
3145 -- `HugeIcons.strokeRoundedPyramidStructure01`
3146 -- `HugeIcons.strokeRoundedPyramidStructure02`
3147 -- `HugeIcons.strokeRoundedPython`
3148 -- `HugeIcons.strokeRoundedQqPlot`
3149 -- `HugeIcons.strokeRoundedQrCode01`
3150 -- `HugeIcons.strokeRoundedQrCode`
3151 -- `HugeIcons.strokeRoundedQuestion`
3152 -- `HugeIcons.strokeRoundedQueue01`
3153 -- `HugeIcons.strokeRoundedQueue02`
3154 -- `HugeIcons.strokeRoundedQuillWrite01`
3155 -- `HugeIcons.strokeRoundedQuillWrite02`
3156 -- `HugeIcons.strokeRoundedQuiz01`
3157 -- `HugeIcons.strokeRoundedQuiz02`
3158 -- `HugeIcons.strokeRoundedQuiz03`
3159 -- `HugeIcons.strokeRoundedQuiz04`
3160 -- `HugeIcons.strokeRoundedQuiz05`
3161 -- `HugeIcons.strokeRoundedQuora`
3162 -- `HugeIcons.strokeRoundedQuoteDownCircle`
3163 -- `HugeIcons.strokeRoundedQuoteDownSquare`
3164 -- `HugeIcons.strokeRoundedQuoteDown`
3165 -- `HugeIcons.strokeRoundedQuoteUpCircle`
3166 -- `HugeIcons.strokeRoundedQuoteUpSquare`
3167 -- `HugeIcons.strokeRoundedQuoteUp`
3168 -- `HugeIcons.strokeRoundedQuotes`
3169 -- `HugeIcons.strokeRoundedQuran01`
3170 -- `HugeIcons.strokeRoundedQuran02`
3171 -- `HugeIcons.strokeRoundedQuran03`
3172 -- `HugeIcons.strokeRoundedQwen`
3173 -- `HugeIcons.strokeRoundedRacingFlag`
3174 -- `HugeIcons.strokeRoundedRadar01`
3175 -- `HugeIcons.strokeRoundedRadar02`
3176 -- `HugeIcons.strokeRoundedRadial`
3177 -- `HugeIcons.strokeRoundedRadio01`
3178 -- `HugeIcons.strokeRoundedRadio02`
3179 -- `HugeIcons.strokeRoundedRadioButton`
3180 -- `HugeIcons.strokeRoundedRadio`
3181 -- `HugeIcons.strokeRoundedRadioactiveAlert`
3182 -- `HugeIcons.strokeRoundedRadius`
3183 -- `HugeIcons.strokeRoundedRainDoubleDrop`
3184 -- `HugeIcons.strokeRoundedRainDrop`
3185 -- `HugeIcons.strokeRoundedRain`
3186 -- `HugeIcons.strokeRoundedRainbow`
3187 -- `HugeIcons.strokeRoundedRamadhan01`
3188 -- `HugeIcons.strokeRoundedRamadhan02`
3189 -- `HugeIcons.strokeRoundedRamadhanMonth`
3190 -- `HugeIcons.strokeRoundedRanking`
3191 -- `HugeIcons.strokeRoundedRar01`
3192 -- `HugeIcons.strokeRoundedRar02`
3193 -- `HugeIcons.strokeRoundedRaw01`
3194 -- `HugeIcons.strokeRoundedRaw02`
3195 -- `HugeIcons.strokeRoundedRe`
3196 -- `HugeIcons.strokeRoundedReact`
3197 -- `HugeIcons.strokeRoundedRealEstate01`
3198 -- `HugeIcons.strokeRoundedRealEstate02`
3199 -- `HugeIcons.strokeRoundedReceiptDollar`
3200 -- `HugeIcons.strokeRoundedRecord`
3201 -- `HugeIcons.strokeRoundedRecoveryMail`
3202 -- `HugeIcons.strokeRoundedRectangular01`
3203 -- `HugeIcons.strokeRoundedRectangular`
3204 -- `HugeIcons.strokeRoundedRecycle01`
3205 -- `HugeIcons.strokeRoundedRecycle02`
3206 -- `HugeIcons.strokeRoundedRecycle03`
3207 -- `HugeIcons.strokeRoundedReddit`
3208 -- `HugeIcons.strokeRoundedRedo02`
3209 -- `HugeIcons.strokeRoundedRedo03`
3210 -- `HugeIcons.strokeRoundedRedo`
3211 -- `HugeIcons.strokeRoundedReflex`
3212 -- `HugeIcons.strokeRoundedRefresh`
3213 -- `HugeIcons.strokeRoundedRefrigerator`
3214 -- `HugeIcons.strokeRoundedRegister`
3215 -- `HugeIcons.strokeRoundedRegistered`
3216 -- `HugeIcons.strokeRoundedRelieved01`
3217 -- `HugeIcons.strokeRoundedRelieved02`
3218 -- `HugeIcons.strokeRoundedReload`
3219 -- `HugeIcons.strokeRoundedReminder`
3220 -- `HugeIcons.strokeRoundedRemoteControl`
3221 -- `HugeIcons.strokeRoundedRemove01`
3222 -- `HugeIcons.strokeRoundedRemove02`
3223 -- `HugeIcons.strokeRoundedRemoveCircleHalfDot`
3224 -- `HugeIcons.strokeRoundedRemoveCircle`
3225 -- `HugeIcons.strokeRoundedRemoveFemale`
3226 -- `HugeIcons.strokeRoundedRemoveMale`
3227 -- `HugeIcons.strokeRoundedRemovePi`
3228 -- `HugeIcons.strokeRoundedRemoveSquare`
3229 -- `HugeIcons.strokeRoundedRenewableEnergy01`
3230 -- `HugeIcons.strokeRoundedRenewableEnergy`
3231 -- `HugeIcons.strokeRoundedRepair`
3232 -- `HugeIcons.strokeRoundedRepeatOff`
3233 -- `HugeIcons.strokeRoundedRepeatOne01`
3234 -- `HugeIcons.strokeRoundedRepeatOne02`
3235 -- `HugeIcons.strokeRoundedRepeat`
3236 -- `HugeIcons.strokeRoundedReplay`
3237 -- `HugeIcons.strokeRoundedReplit`
3238 -- `HugeIcons.strokeRoundedRepository`
3239 -- `HugeIcons.strokeRoundedResetPassword`
3240 -- `HugeIcons.strokeRoundedResize01`
3241 -- `HugeIcons.strokeRoundedResize02`
3242 -- `HugeIcons.strokeRoundedResizeFieldRectangle`
3243 -- `HugeIcons.strokeRoundedResizeField`
3244 -- `HugeIcons.strokeRoundedResourcesAdd`
3245 -- `HugeIcons.strokeRoundedResourcesRemove`
3246 -- `HugeIcons.strokeRoundedRestaurant01`
3247 -- `HugeIcons.strokeRoundedRestaurant02`
3248 -- `HugeIcons.strokeRoundedRestaurant03`
3249 -- `HugeIcons.strokeRoundedRestaurant`
3250 -- `HugeIcons.strokeRoundedRestaurantTable`
3251 -- `HugeIcons.strokeRoundedRestoreBin`
3252 -- `HugeIcons.strokeRoundedReturnRequest`
3253 -- `HugeIcons.strokeRoundedReverseWithdrawal01`
3254 -- `HugeIcons.strokeRoundedReverseWithdrawal02`
3255 -- `HugeIcons.strokeRoundedRhombus01`
3256 -- `HugeIcons.strokeRoundedRhombus`
3257 -- `HugeIcons.strokeRoundedRiceBowl01`
3258 -- `HugeIcons.strokeRoundedRiceBowl02`
3259 -- `HugeIcons.strokeRoundedRightAngle`
3260 -- `HugeIcons.strokeRoundedRightToLeftBlockQuote`
3261 -- `HugeIcons.strokeRoundedRightToLeftListBullet`
3262 -- `HugeIcons.strokeRoundedRightToLeftListDash`
3263 -- `HugeIcons.strokeRoundedRightToLeftListNumber`
3264 -- `HugeIcons.strokeRoundedRightToLeftListTriangle`
3265 -- `HugeIcons.strokeRoundedRightTriangle`
3266 -- `HugeIcons.strokeRoundedRipple`
3267 -- `HugeIcons.strokeRoundedRiyalRectangle`
3268 -- `HugeIcons.strokeRoundedRiyal`
3269 -- `HugeIcons.strokeRoundedRoad01`
3270 -- `HugeIcons.strokeRoundedRoad02`
3271 -- `HugeIcons.strokeRoundedRoadLocation01`
3272 -- `HugeIcons.strokeRoundedRoadLocation02`
3273 -- `HugeIcons.strokeRoundedRoad`
3274 -- `HugeIcons.strokeRoundedRoadWayside`
3275 -- `HugeIcons.strokeRoundedRobot01`
3276 -- `HugeIcons.strokeRoundedRobot02`
3277 -- `HugeIcons.strokeRoundedRobotic`
3278 -- `HugeIcons.strokeRoundedRocket01`
3279 -- `HugeIcons.strokeRoundedRocket02`
3280 -- `HugeIcons.strokeRoundedRocket`
3281 -- `HugeIcons.strokeRoundedRockingChair`
3282 -- `HugeIcons.strokeRoundedRockingHorse`
3283 -- `HugeIcons.strokeRoundedRollerSkate`
3284 -- `HugeIcons.strokeRoundedRollingPin`
3285 -- `HugeIcons.strokeRoundedRoot01`
3286 -- `HugeIcons.strokeRoundedRoot02`
3287 -- `HugeIcons.strokeRoundedRoot1stBracket`
3288 -- `HugeIcons.strokeRoundedRoot1stBrecket`
3289 -- `HugeIcons.strokeRoundedRoot2ndBracket`
3290 -- `HugeIcons.strokeRoundedRoot2ndBrecket`
3291 -- `HugeIcons.strokeRoundedRoot3rdBracket`
3292 -- `HugeIcons.strokeRoundedRoot3rdBrecket`
3293 -- `HugeIcons.strokeRoundedRootCircle`
3294 -- `HugeIcons.strokeRoundedRotate01`
3295 -- `HugeIcons.strokeRoundedRotate02`
3296 -- `HugeIcons.strokeRoundedRotate360`
3297 -- `HugeIcons.strokeRoundedRotateBottomLeft`
3298 -- `HugeIcons.strokeRoundedRotateBottomRight`
3299 -- `HugeIcons.strokeRoundedRotateClockwise`
3300 -- `HugeIcons.strokeRoundedRotateCrop`
3301 -- `HugeIcons.strokeRoundedRotateLeft01`
3302 -- `HugeIcons.strokeRoundedRotateLeft02`
3303 -- `HugeIcons.strokeRoundedRotateLeft03`
3304 -- `HugeIcons.strokeRoundedRotateLeft04`
3305 -- `HugeIcons.strokeRoundedRotateLeft05`
3306 -- `HugeIcons.strokeRoundedRotateLeft06`
3307 -- `HugeIcons.strokeRoundedRotateRight01`
3308 -- `HugeIcons.strokeRoundedRotateRight02`
3309 -- `HugeIcons.strokeRoundedRotateRight03`
3310 -- `HugeIcons.strokeRoundedRotateRight04`
3311 -- `HugeIcons.strokeRoundedRotateRight05`
3312 -- `HugeIcons.strokeRoundedRotateRight06`
3313 -- `HugeIcons.strokeRoundedRotateSquare`
3314 -- `HugeIcons.strokeRoundedRotateTopLeft`
3315 -- `HugeIcons.strokeRoundedRotateTopRight`
3316 -- `HugeIcons.strokeRoundedRoute01`
3317 -- `HugeIcons.strokeRoundedRoute02`
3318 -- `HugeIcons.strokeRoundedRoute03`
3319 -- `HugeIcons.strokeRoundedRouteBlock`
3320 -- `HugeIcons.strokeRoundedRouter01`
3321 -- `HugeIcons.strokeRoundedRouter02`
3322 -- `HugeIcons.strokeRoundedRouter`
3323 -- `HugeIcons.strokeRoundedRowDelete`
3324 -- `HugeIcons.strokeRoundedRowInsert`
3325 -- `HugeIcons.strokeRoundedRssConnected01`
3326 -- `HugeIcons.strokeRoundedRssConnected02`
3327 -- `HugeIcons.strokeRoundedRssError`
3328 -- `HugeIcons.strokeRoundedRssLocked`
3329 -- `HugeIcons.strokeRoundedRss`
3330 -- `HugeIcons.strokeRoundedRssUnlocked`
3331 -- `HugeIcons.strokeRoundedRubElHizb`
3332 -- `HugeIcons.strokeRoundedRubberDuck`
3333 -- `HugeIcons.strokeRoundedRubiksCube`
3334 -- `HugeIcons.strokeRoundedRuku`
3335 -- `HugeIcons.strokeRoundedRuler`
3336 -- `HugeIcons.strokeRoundedRunningShoes`
3337 -- `HugeIcons.strokeRoundedSad01`
3338 -- `HugeIcons.strokeRoundedSad02`
3339 -- `HugeIcons.strokeRoundedSadDizzy`
3340 -- `HugeIcons.strokeRoundedSafari`
3341 -- `HugeIcons.strokeRoundedSafeDelivery01`
3342 -- `HugeIcons.strokeRoundedSafeDelivery02`
3343 -- `HugeIcons.strokeRoundedSafe`
3344 -- `HugeIcons.strokeRoundedSafetyPin01`
3345 -- `HugeIcons.strokeRoundedSafetyPin02`
3346 -- `HugeIcons.strokeRoundedSailboatCoastal`
3347 -- `HugeIcons.strokeRoundedSailboatOffshore`
3348 -- `HugeIcons.strokeRoundedSakura`
3349 -- `HugeIcons.strokeRoundedSalah`
3350 -- `HugeIcons.strokeRoundedSalahTime`
3351 -- `HugeIcons.strokeRoundedSaleTag01`
3352 -- `HugeIcons.strokeRoundedSaleTag02`
3353 -- `HugeIcons.strokeRoundedSandals`
3354 -- `HugeIcons.strokeRoundedSatellite01`
3355 -- `HugeIcons.strokeRoundedSatellite02`
3356 -- `HugeIcons.strokeRoundedSatellite03`
3357 -- `HugeIcons.strokeRoundedSatellite`
3358 -- `HugeIcons.strokeRoundedSaturn01`
3359 -- `HugeIcons.strokeRoundedSaturn02`
3360 -- `HugeIcons.strokeRoundedSaturn`
3361 -- `HugeIcons.strokeRoundedSausage`
3362 -- `HugeIcons.strokeRoundedSaveEnergy01`
3363 -- `HugeIcons.strokeRoundedSaveEnergy02`
3364 -- `HugeIcons.strokeRoundedSaveMoneyDollar`
3365 -- `HugeIcons.strokeRoundedSaveMoneyEuro`
3366 -- `HugeIcons.strokeRoundedSaveMoneyPound`
3367 -- `HugeIcons.strokeRoundedSaveMoneyYen`
3368 -- `HugeIcons.strokeRoundedSavings`
3369 -- `HugeIcons.strokeRoundedScheme`
3370 -- `HugeIcons.strokeRoundedSchool01`
3371 -- `HugeIcons.strokeRoundedSchoolBell01`
3372 -- `HugeIcons.strokeRoundedSchoolBell02`
3373 -- `HugeIcons.strokeRoundedSchoolBus`
3374 -- `HugeIcons.strokeRoundedSchoolReportCard`
3375 -- `HugeIcons.strokeRoundedSchool`
3376 -- `HugeIcons.strokeRoundedSchoolTie`
3377 -- `HugeIcons.strokeRoundedScissor01`
3378 -- `HugeIcons.strokeRoundedScissorRectangle`
3379 -- `HugeIcons.strokeRoundedScissor`
3380 -- `HugeIcons.strokeRoundedScooter01`
3381 -- `HugeIcons.strokeRoundedScooter02`
3382 -- `HugeIcons.strokeRoundedScooter03`
3383 -- `HugeIcons.strokeRoundedScooter04`
3384 -- `HugeIcons.strokeRoundedScooterElectric`
3385 -- `HugeIcons.strokeRoundedScratchCard`
3386 -- `HugeIcons.strokeRoundedScreenAddToHome02`
3387 -- `HugeIcons.strokeRoundedScreenAddToHome`
3388 -- `HugeIcons.strokeRoundedScreenLockRotation`
3389 -- `HugeIcons.strokeRoundedScreenRotation`
3390 -- `HugeIcons.strokeRoundedScribd`
3391 -- `HugeIcons.strokeRoundedScrollHorizontal`
3392 -- `HugeIcons.strokeRoundedScroll`
3393 -- `HugeIcons.strokeRoundedScrollVertical`
3394 -- `HugeIcons.strokeRoundedSdCard`
3395 -- `HugeIcons.strokeRoundedSeal`
3396 -- `HugeIcons.strokeRoundedSearch01`
3397 -- `HugeIcons.strokeRoundedSearch02`
3398 -- `HugeIcons.strokeRoundedSearchAdd`
3399 -- `HugeIcons.strokeRoundedSearchArea`
3400 -- `HugeIcons.strokeRoundedSearchCircle`
3401 -- `HugeIcons.strokeRoundedSearchDollar`
3402 -- `HugeIcons.strokeRoundedSearchFocus`
3403 -- `HugeIcons.strokeRoundedSearchList01`
3404 -- `HugeIcons.strokeRoundedSearchList02`
3405 -- `HugeIcons.strokeRoundedSearchMinus`
3406 -- `HugeIcons.strokeRoundedSearchRemove`
3407 -- `HugeIcons.strokeRoundedSearchReplace`
3408 -- `HugeIcons.strokeRoundedSearchSquare`
3409 -- `HugeIcons.strokeRoundedSearchVisual`
3410 -- `HugeIcons.strokeRoundedSearching`
3411 -- `HugeIcons.strokeRoundedSeatSelector`
3412 -- `HugeIcons.strokeRoundedSecuredNetwork`
3413 -- `HugeIcons.strokeRoundedSecurityBlock`
3414 -- `HugeIcons.strokeRoundedSecurityCheck`
3415 -- `HugeIcons.strokeRoundedSecurityKeyUsb`
3416 -- `HugeIcons.strokeRoundedSecurityLock`
3417 -- `HugeIcons.strokeRoundedSecurityPassword`
3418 -- `HugeIcons.strokeRoundedSecurity`
3419 -- `HugeIcons.strokeRoundedSecurityValidation`
3420 -- `HugeIcons.strokeRoundedSecurityWifi`
3421 -- `HugeIcons.strokeRoundedSeesaw`
3422 -- `HugeIcons.strokeRoundedSegment`
3423 -- `HugeIcons.strokeRoundedSelect01`
3424 -- `HugeIcons.strokeRoundedSelect02`
3425 -- `HugeIcons.strokeRoundedSelfTransfer`
3426 -- `HugeIcons.strokeRoundedSemiTruck`
3427 -- `HugeIcons.strokeRoundedSendToMobile02`
3428 -- `HugeIcons.strokeRoundedSendToMobile`
3429 -- `HugeIcons.strokeRoundedSendingOrder`
3430 -- `HugeIcons.strokeRoundedSenseless`
3431 -- `HugeIcons.strokeRoundedSent02`
3432 -- `HugeIcons.strokeRoundedSent`
3433 -- `HugeIcons.strokeRoundedSeo`
3434 -- `HugeIcons.strokeRoundedServerStack01`
3435 -- `HugeIcons.strokeRoundedServerStack02`
3436 -- `HugeIcons.strokeRoundedServerStack03`
3437 -- `HugeIcons.strokeRoundedService`
3438 -- `HugeIcons.strokeRoundedServingFood`
3439 -- `HugeIcons.strokeRoundedSetting06`
3440 -- `HugeIcons.strokeRoundedSetting07`
3441 -- `HugeIcons.strokeRoundedSettingDone01`
3442 -- `HugeIcons.strokeRoundedSettingDone02`
3443 -- `HugeIcons.strokeRoundedSettingDone03`
3444 -- `HugeIcons.strokeRoundedSettingDone04`
3445 -- `HugeIcons.strokeRoundedSettingError03`
3446 -- `HugeIcons.strokeRoundedSettingError04`
3447 -- `HugeIcons.strokeRoundedSettings01`
3448 -- `HugeIcons.strokeRoundedSettings02`
3449 -- `HugeIcons.strokeRoundedSettings03`
3450 -- `HugeIcons.strokeRoundedSettings04`
3451 -- `HugeIcons.strokeRoundedSettings05`
3452 -- `HugeIcons.strokeRoundedSettingsError01`
3453 -- `HugeIcons.strokeRoundedSettingsError02`
3454 -- `HugeIcons.strokeRoundedSetup01`
3455 -- `HugeIcons.strokeRoundedSetup02`
3456 -- `HugeIcons.strokeRoundedSevenCircle`
3457 -- `HugeIcons.strokeRoundedSevenSquare`
3458 -- `HugeIcons.strokeRoundedShaka01`
3459 -- `HugeIcons.strokeRoundedShaka02`
3460 -- `HugeIcons.strokeRoundedShaka03`
3461 -- `HugeIcons.strokeRoundedShaka04`
3462 -- `HugeIcons.strokeRoundedShampoo`
3463 -- `HugeIcons.strokeRoundedShapeCollection`
3464 -- `HugeIcons.strokeRoundedShapes`
3465 -- `HugeIcons.strokeRoundedShare01`
3466 -- `HugeIcons.strokeRoundedShare02`
3467 -- `HugeIcons.strokeRoundedShare03`
3468 -- `HugeIcons.strokeRoundedShare04`
3469 -- `HugeIcons.strokeRoundedShare05`
3470 -- `HugeIcons.strokeRoundedShare06`
3471 -- `HugeIcons.strokeRoundedShare07`
3472 -- `HugeIcons.strokeRoundedShare08`
3473 -- `HugeIcons.strokeRoundedShareKnowledge`
3474 -- `HugeIcons.strokeRoundedShareLocation01`
3475 -- `HugeIcons.strokeRoundedShareLocation02`
3476 -- `HugeIcons.strokeRoundedSharedDrive`
3477 -- `HugeIcons.strokeRoundedSharedWifi`
3478 -- `HugeIcons.strokeRoundedSharing`
3479 -- `HugeIcons.strokeRoundedShellfish`
3480 -- `HugeIcons.strokeRoundedSheriff01`
3481 -- `HugeIcons.strokeRoundedSheriff02`
3482 -- `HugeIcons.strokeRoundedShield01`
3483 -- `HugeIcons.strokeRoundedShield02`
3484 -- `HugeIcons.strokeRoundedShieldBlockchain`
3485 -- `HugeIcons.strokeRoundedShieldEnergy`
3486 -- `HugeIcons.strokeRoundedShieldKey`
3487 -- `HugeIcons.strokeRoundedShieldUser`
3488 -- `HugeIcons.strokeRoundedShipmentTracking`
3489 -- `HugeIcons.strokeRoundedShippingCenter`
3490 -- `HugeIcons.strokeRoundedShippingLoading`
3491 -- `HugeIcons.strokeRoundedShippingTruck01`
3492 -- `HugeIcons.strokeRoundedShippingTruck02`
3493 -- `HugeIcons.strokeRoundedShirt01`
3494 -- `HugeIcons.strokeRoundedShocked`
3495 -- `HugeIcons.strokeRoundedShopSign`
3496 -- `HugeIcons.strokeRoundedShopify`
3497 -- `HugeIcons.strokeRoundedShoppingBag01`
3498 -- `HugeIcons.strokeRoundedShoppingBag02`
3499 -- `HugeIcons.strokeRoundedShoppingBag03`
3500 -- `HugeIcons.strokeRoundedShoppingBagAdd`
3501 -- `HugeIcons.strokeRoundedShoppingBagCheck`
3502 -- `HugeIcons.strokeRoundedShoppingBagFavorite`
3503 -- `HugeIcons.strokeRoundedShoppingBagRemove`
3504 -- `HugeIcons.strokeRoundedShoppingBasket01`
3505 -- `HugeIcons.strokeRoundedShoppingBasket02`
3506 -- `HugeIcons.strokeRoundedShoppingBasket03`
3507 -- `HugeIcons.strokeRoundedShoppingBasketAdd01`
3508 -- `HugeIcons.strokeRoundedShoppingBasketAdd02`
3509 -- `HugeIcons.strokeRoundedShoppingBasketAdd03`
3510 -- `HugeIcons.strokeRoundedShoppingBasketCheckIn01`
3511 -- `HugeIcons.strokeRoundedShoppingBasketCheckIn02`
3512 -- `HugeIcons.strokeRoundedShoppingBasketCheckIn03`
3513 -- `HugeIcons.strokeRoundedShoppingBasketCheckOut01`
3514 -- `HugeIcons.strokeRoundedShoppingBasketCheckOut02`
3515 -- `HugeIcons.strokeRoundedShoppingBasketCheckOut03`
3516 -- `HugeIcons.strokeRoundedShoppingBasketDone01`
3517 -- `HugeIcons.strokeRoundedShoppingBasketDone02`
3518 -- `HugeIcons.strokeRoundedShoppingBasketDone03`
3519 -- `HugeIcons.strokeRoundedShoppingBasketFavorite01`
3520 -- `HugeIcons.strokeRoundedShoppingBasketFavorite02`
3521 -- `HugeIcons.strokeRoundedShoppingBasketFavorite03`
3522 -- `HugeIcons.strokeRoundedShoppingBasketRemove01`
3523 -- `HugeIcons.strokeRoundedShoppingBasketRemove02`
3524 -- `HugeIcons.strokeRoundedShoppingBasketRemove03`
3525 -- `HugeIcons.strokeRoundedShoppingBasketSecure01`
3526 -- `HugeIcons.strokeRoundedShoppingBasketSecure02`
3527 -- `HugeIcons.strokeRoundedShoppingBasketSecure03`
3528 -- `HugeIcons.strokeRoundedShoppingCart01`
3529 -- `HugeIcons.strokeRoundedShoppingCart02`
3530 -- `HugeIcons.strokeRoundedShoppingCartAdd01`
3531 -- `HugeIcons.strokeRoundedShoppingCartAdd02`
3532 -- `HugeIcons.strokeRoundedShoppingCartCheck01`
3533 -- `HugeIcons.strokeRoundedShoppingCartCheck02`
3534 -- `HugeIcons.strokeRoundedShoppingCartCheckIn01`
3535 -- `HugeIcons.strokeRoundedShoppingCartCheckIn02`
3536 -- `HugeIcons.strokeRoundedShoppingCartCheckOut01`
3537 -- `HugeIcons.strokeRoundedShoppingCartCheckOut02`
3538 -- `HugeIcons.strokeRoundedShoppingCartFavorite01`
3539 -- `HugeIcons.strokeRoundedShoppingCartFavorite02`
3540 -- `HugeIcons.strokeRoundedShoppingCartRemove01`
3541 -- `HugeIcons.strokeRoundedShoppingCartRemove02`
3542 -- `HugeIcons.strokeRoundedShortsPants`
3543 -- `HugeIcons.strokeRoundedShoulder`
3544 -- `HugeIcons.strokeRoundedShuffleSquare`
3545 -- `HugeIcons.strokeRoundedShuffle`
3546 -- `HugeIcons.strokeRoundedShutDown`
3547 -- `HugeIcons.strokeRoundedShutterstock`
3548 -- `HugeIcons.strokeRoundedSidebarBottom`
3549 -- `HugeIcons.strokeRoundedSidebarLeft01`
3550 -- `HugeIcons.strokeRoundedSidebarLeft`
3551 -- `HugeIcons.strokeRoundedSidebarRight01`
3552 -- `HugeIcons.strokeRoundedSidebarRight`
3553 -- `HugeIcons.strokeRoundedSidebarTop`
3554 -- `HugeIcons.strokeRoundedSignLanguageC`
3555 -- `HugeIcons.strokeRoundedSignalFull01`
3556 -- `HugeIcons.strokeRoundedSignalFull02`
3557 -- `HugeIcons.strokeRoundedSignalLow01`
3558 -- `HugeIcons.strokeRoundedSignalLow02`
3559 -- `HugeIcons.strokeRoundedSignalLowMedium`
3560 -- `HugeIcons.strokeRoundedSignalMedium01`
3561 -- `HugeIcons.strokeRoundedSignalMedium02`
3562 -- `HugeIcons.strokeRoundedSignalNo01`
3563 -- `HugeIcons.strokeRoundedSignalNo02`
3564 -- `HugeIcons.strokeRoundedSignal`
3565 -- `HugeIcons.strokeRoundedSignature`
3566 -- `HugeIcons.strokeRoundedSilence`
3567 -- `HugeIcons.strokeRoundedSimcard01`
3568 -- `HugeIcons.strokeRoundedSimcard02`
3569 -- `HugeIcons.strokeRoundedSimcardDual`
3570 -- `HugeIcons.strokeRoundedSin`
3571 -- `HugeIcons.strokeRoundedSine01`
3572 -- `HugeIcons.strokeRoundedSine02`
3573 -- `HugeIcons.strokeRoundedSingLeft`
3574 -- `HugeIcons.strokeRoundedSingRight`
3575 -- `HugeIcons.strokeRoundedSingleFire`
3576 -- `HugeIcons.strokeRoundedSink01`
3577 -- `HugeIcons.strokeRoundedSink02`
3578 -- `HugeIcons.strokeRoundedSiriNew`
3579 -- `HugeIcons.strokeRoundedSiri`
3580 -- `HugeIcons.strokeRoundedSixCircle`
3581 -- `HugeIcons.strokeRoundedSixSquare`
3582 -- `HugeIcons.strokeRoundedSketch`
3583 -- `HugeIcons.strokeRoundedSkew`
3584 -- `HugeIcons.strokeRoundedSki`
3585 -- `HugeIcons.strokeRoundedSkippingRope`
3586 -- `HugeIcons.strokeRoundedSkool`
3587 -- `HugeIcons.strokeRoundedSkull`
3588 -- `HugeIcons.strokeRoundedSkype`
3589 -- `HugeIcons.strokeRoundedSlack`
3590 -- `HugeIcons.strokeRoundedSleeping`
3591 -- `HugeIcons.strokeRoundedSleeveless`
3592 -- `HugeIcons.strokeRoundedSlide`
3593 -- `HugeIcons.strokeRoundedSlidersHorizontal`
3594 -- `HugeIcons.strokeRoundedSlidersVertical`
3595 -- `HugeIcons.strokeRoundedSlideshare`
3596 -- `HugeIcons.strokeRoundedSlowWinds`
3597 -- `HugeIcons.strokeRoundedSmartAc`
3598 -- `HugeIcons.strokeRoundedSmartPhone01`
3599 -- `HugeIcons.strokeRoundedSmartPhone02`
3600 -- `HugeIcons.strokeRoundedSmartPhone03`
3601 -- `HugeIcons.strokeRoundedSmartPhone04`
3602 -- `HugeIcons.strokeRoundedSmartPhoneLandscape02`
3603 -- `HugeIcons.strokeRoundedSmartPhoneLandscape`
3604 -- `HugeIcons.strokeRoundedSmart`
3605 -- `HugeIcons.strokeRoundedSmartWatch01`
3606 -- `HugeIcons.strokeRoundedSmartWatch02`
3607 -- `HugeIcons.strokeRoundedSmartWatch03`
3608 -- `HugeIcons.strokeRoundedSmartWatch04`
3609 -- `HugeIcons.strokeRoundedSmartphoneLostWifi`
3610 -- `HugeIcons.strokeRoundedSmartphoneWifi`
3611 -- `HugeIcons.strokeRoundedSmileDizzy`
3612 -- `HugeIcons.strokeRoundedSmile`
3613 -- `HugeIcons.strokeRoundedSmsCode`
3614 -- `HugeIcons.strokeRoundedSnail`
3615 -- `HugeIcons.strokeRoundedSnapchat`
3616 -- `HugeIcons.strokeRoundedSnow`
3617 -- `HugeIcons.strokeRoundedSocks`
3618 -- `HugeIcons.strokeRoundedSodaCan`
3619 -- `HugeIcons.strokeRoundedSofa01`
3620 -- `HugeIcons.strokeRoundedSofa02`
3621 -- `HugeIcons.strokeRoundedSofa03`
3622 -- `HugeIcons.strokeRoundedSofaSingle`
3623 -- `HugeIcons.strokeRoundedSoftDrink01`
3624 -- `HugeIcons.strokeRoundedSoftDrink02`
3625 -- `HugeIcons.strokeRoundedSoftwareLicense`
3626 -- `HugeIcons.strokeRoundedSoftware`
3627 -- `HugeIcons.strokeRoundedSoftwareUninstall`
3628 -- `HugeIcons.strokeRoundedSoilMoistureField`
3629 -- `HugeIcons.strokeRoundedSoilMoistureGlobal`
3630 -- `HugeIcons.strokeRoundedSoilTemperatureField`
3631 -- `HugeIcons.strokeRoundedSoilTemperatureGlobal`
3632 -- `HugeIcons.strokeRoundedSolarEnergy`
3633 -- `HugeIcons.strokeRoundedSolarPanel01`
3634 -- `HugeIcons.strokeRoundedSolarPanel02`
3635 -- `HugeIcons.strokeRoundedSolarPanel03`
3636 -- `HugeIcons.strokeRoundedSolarPanel04`
3637 -- `HugeIcons.strokeRoundedSolarPanel05`
3638 -- `HugeIcons.strokeRoundedSolarPower`
3639 -- `HugeIcons.strokeRoundedSolarSystem01`
3640 -- `HugeIcons.strokeRoundedSolarSystem`
3641 -- `HugeIcons.strokeRoundedSolidLine01`
3642 -- `HugeIcons.strokeRoundedSolidLine02`
3643 -- `HugeIcons.strokeRoundedSortByDown01`
3644 -- `HugeIcons.strokeRoundedSortByDown02`
3645 -- `HugeIcons.strokeRoundedSortByUp01`
3646 -- `HugeIcons.strokeRoundedSortByUp02`
3647 -- `HugeIcons.strokeRoundedSorting01`
3648 -- `HugeIcons.strokeRoundedSorting02`
3649 -- `HugeIcons.strokeRoundedSorting03`
3650 -- `HugeIcons.strokeRoundedSorting04`
3651 -- `HugeIcons.strokeRoundedSorting05`
3652 -- `HugeIcons.strokeRoundedSorting19`
3653 -- `HugeIcons.strokeRoundedSorting91`
3654 -- `HugeIcons.strokeRoundedSortingAZ01`
3655 -- `HugeIcons.strokeRoundedSortingAZ02`
3656 -- `HugeIcons.strokeRoundedSortingDown`
3657 -- `HugeIcons.strokeRoundedSortingUp`
3658 -- `HugeIcons.strokeRoundedSortingZA01`
3659 -- `HugeIcons.strokeRoundedSoundcloud`
3660 -- `HugeIcons.strokeRoundedSourceCodeCircle`
3661 -- `HugeIcons.strokeRoundedSourceCodeSquare`
3662 -- `HugeIcons.strokeRoundedSourceCode`
3663 -- `HugeIcons.strokeRoundedSpaceship`
3664 -- `HugeIcons.strokeRoundedSpades`
3665 -- `HugeIcons.strokeRoundedSpaghetti`
3666 -- `HugeIcons.strokeRoundedSpam`
3667 -- `HugeIcons.strokeRoundedSparkles`
3668 -- `HugeIcons.strokeRoundedSpartanHelmet`
3669 -- `HugeIcons.strokeRoundedSpatula`
3670 -- `HugeIcons.strokeRoundedSpeaker01`
3671 -- `HugeIcons.strokeRoundedSpeaker`
3672 -- `HugeIcons.strokeRoundedSpeechToText`
3673 -- `HugeIcons.strokeRoundedSpeedTrain01`
3674 -- `HugeIcons.strokeRoundedSpeedTrain02`
3675 -- `HugeIcons.strokeRoundedSperm`
3676 -- `HugeIcons.strokeRoundedSphere`
3677 -- `HugeIcons.strokeRoundedSpirals`
3678 -- `HugeIcons.strokeRoundedSpoonAndFork`
3679 -- `HugeIcons.strokeRoundedSpoonAndKnife`
3680 -- `HugeIcons.strokeRoundedSpoon`
3681 -- `HugeIcons.strokeRoundedSpotify`
3682 -- `HugeIcons.strokeRoundedSql`
3683 -- `HugeIcons.strokeRoundedSquare01`
3684 -- `HugeIcons. static const List<List<dynamic>>`
3685 -- `HugeIcons. static const List<List<dynamic>>`
3686 -- `HugeIcons. static const List<List<dynamic>>`
3687 -- `HugeIcons.strokeRoundedSquareArrowDiagonal01`
3688 -- `HugeIcons.strokeRoundedSquareArrowDiagonal02`
3689 -- `HugeIcons.strokeRoundedSquareArrowDown01`
3690 -- `HugeIcons.strokeRoundedSquareArrowDown02`
3691 -- `HugeIcons.strokeRoundedSquareArrowDown03`
3692 -- `HugeIcons.strokeRoundedSquareArrowDownDouble`
3693 -- `HugeIcons.strokeRoundedSquareArrowDownLeft`
3694 -- `HugeIcons.strokeRoundedSquareArrowDownRight`
3695 -- `HugeIcons.strokeRoundedSquareArrowExpand01`
3696 -- `HugeIcons.strokeRoundedSquareArrowExpand02`
3697 -- `HugeIcons.strokeRoundedSquareArrowHorizontal`
3698 -- `HugeIcons.strokeRoundedSquareArrowLeft01`
3699 -- `HugeIcons.strokeRoundedSquareArrowLeft02`
3700 -- `HugeIcons.strokeRoundedSquareArrowLeft03`
3701 -- `HugeIcons.strokeRoundedSquareArrowLeftDouble`
3702 -- `HugeIcons.strokeRoundedSquareArrowLeftRight`
3703 -- `HugeIcons.strokeRoundedSquareArrowMoveDownLeft`
3704 -- `HugeIcons.strokeRoundedSquareArrowMoveDownRight`
3705 -- `HugeIcons.strokeRoundedSquareArrowMoveLeftDown`
3706 -- `HugeIcons.strokeRoundedSquareArrowMoveLeftUp`
3707 -- `HugeIcons.strokeRoundedSquareArrowMoveRightDown`
3708 -- `HugeIcons.strokeRoundedSquareArrowMoveRightUp`
3709 -- `HugeIcons.strokeRoundedSquareArrowReload01`
3710 -- `HugeIcons.strokeRoundedSquareArrowReload02`
3711 -- `HugeIcons.strokeRoundedSquareArrowRight01`
3712 -- `HugeIcons.strokeRoundedSquareArrowRight02`
3713 -- `HugeIcons.strokeRoundedSquareArrowRight03`
3714 -- `HugeIcons.strokeRoundedSquareArrowRightDouble`
3715 -- `HugeIcons.strokeRoundedSquareArrowShrink01`
3716 -- `HugeIcons.strokeRoundedSquareArrowShrink02`
3717 -- `HugeIcons.strokeRoundedSquareArrowUp01`
3718 -- `HugeIcons.strokeRoundedSquareArrowUp02`
3719 -- `HugeIcons.strokeRoundedSquareArrowUp03`
3720 -- `HugeIcons.strokeRoundedSquareArrowUpDouble`
3721 -- `HugeIcons.strokeRoundedSquareArrowUpDown`
3722 -- `HugeIcons.strokeRoundedSquareArrowUpLeft`
3723 -- `HugeIcons.strokeRoundedSquareArrowUpRight02`
3724 -- `HugeIcons.strokeRoundedSquareArrowUpRight`
3725 -- `HugeIcons.strokeRoundedSquareArrowVertical`
3726 -- `HugeIcons.strokeRoundedSquareCircle`
3727 -- `HugeIcons.strokeRoundedSquareLock01`
3728 -- `HugeIcons.strokeRoundedSquareLock02`
3729 -- `HugeIcons.strokeRoundedSquareLockAdd01`
3730 -- `HugeIcons.strokeRoundedSquareLockAdd02`
3731 -- `HugeIcons.strokeRoundedSquareLockCheck01`
3732 -- `HugeIcons.strokeRoundedSquareLockCheck02`
3733 -- `HugeIcons.strokeRoundedSquareLockMinus01`
3734 -- `HugeIcons.strokeRoundedSquareLockMinus02`
3735 -- `HugeIcons.strokeRoundedSquareLockPassword`
3736 -- `HugeIcons.strokeRoundedSquareLockRemove01`
3737 -- `HugeIcons.strokeRoundedSquareLockRemove02`
3738 -- `HugeIcons.strokeRoundedSquareRootSquare`
3739 -- `HugeIcons.strokeRoundedSquareSingleFire`
3740 -- `HugeIcons.strokeRoundedSquareSquare`
3741 -- `HugeIcons.strokeRoundedSquare`
3742 -- `HugeIcons.strokeRoundedSquareUnlock01`
3743 -- `HugeIcons.strokeRoundedSquareUnlock02`
3744 -- `HugeIcons.strokeRoundedStackStar`
3745 -- `HugeIcons.strokeRoundedStairs01`
3746 -- `HugeIcons.strokeRoundedStairs02`
3747 -- `HugeIcons.strokeRoundedStairs03`
3748 -- `HugeIcons.strokeRoundedStairs04`
3749 -- `HugeIcons.strokeRoundedStake`
3750 -- `HugeIcons.strokeRoundedStamp01`
3751 -- `HugeIcons.strokeRoundedStamp02`
3752 -- `HugeIcons.strokeRoundedStamp`
3753 -- `HugeIcons.strokeRoundedStarAward01`
3754 -- `HugeIcons.strokeRoundedStarAward02`
3755 -- `HugeIcons.strokeRoundedStarCircle`
3756 -- `HugeIcons.strokeRoundedStarFace`
3757 -- `HugeIcons.strokeRoundedStarHalf`
3758 -- `HugeIcons.strokeRoundedStarOff`
3759 -- `HugeIcons.strokeRoundedStarSquare`
3760 -- `HugeIcons.strokeRoundedStar`
3761 -- `HugeIcons.strokeRoundedStars`
3762 -- `HugeIcons.strokeRoundedStartUp01`
3763 -- `HugeIcons.strokeRoundedStartUp02`
3764 -- `HugeIcons.strokeRoundedStationery`
3765 -- `HugeIcons.strokeRoundedStatus`
3766 -- `HugeIcons.strokeRoundedSteak`
3767 -- `HugeIcons.strokeRoundedSteering`
3768 -- `HugeIcons.strokeRoundedStepInto`
3769 -- `HugeIcons.strokeRoundedStepOut`
3770 -- `HugeIcons.strokeRoundedStepOver`
3771 -- `HugeIcons.strokeRoundedStethoscope02`
3772 -- `HugeIcons.strokeRoundedStethoscope`
3773 -- `HugeIcons.strokeRoundedStickyNote01`
3774 -- `HugeIcons.strokeRoundedStickyNote02`
3775 -- `HugeIcons.strokeRoundedStickyNote03`
3776 -- `HugeIcons.strokeRoundedStopCircle`
3777 -- `HugeIcons.strokeRoundedStopLossOrder`
3778 -- `HugeIcons.strokeRoundedStop`
3779 -- `HugeIcons.strokeRoundedStopWatch`
3780 -- `HugeIcons.strokeRoundedStore01`
3781 -- `HugeIcons.strokeRoundedStore02`
3782 -- `HugeIcons.strokeRoundedStore03`
3783 -- `HugeIcons.strokeRoundedStore04`
3784 -- `HugeIcons.strokeRoundedStoreAdd01`
3785 -- `HugeIcons.strokeRoundedStoreAdd02`
3786 -- `HugeIcons.strokeRoundedStoreLocation01`
3787 -- `HugeIcons.strokeRoundedStoreLocation02`
3788 -- `HugeIcons.strokeRoundedStoreManagement01`
3789 -- `HugeIcons.strokeRoundedStoreManagement02`
3790 -- `HugeIcons.strokeRoundedStoreRemove01`
3791 -- `HugeIcons.strokeRoundedStoreRemove02`
3792 -- `HugeIcons.strokeRoundedStoreVerified01`
3793 -- `HugeIcons.strokeRoundedStoreVerified02`
3794 -- `HugeIcons.strokeRoundedStraightEdge`
3795 -- `HugeIcons.strokeRoundedStrategy`
3796 -- `HugeIcons.strokeRoundedStreeringWheel`
3797 -- `HugeIcons.strokeRoundedStreetFood`
3798 -- `HugeIcons.strokeRoundedStripe`
3799 -- `HugeIcons.strokeRoundedStrokeBottom`
3800 -- `HugeIcons.strokeRoundedStrokeCenter`
3801 -- `HugeIcons.strokeRoundedStrokeInside`
3802 -- `HugeIcons.strokeRoundedStrokeLeft`
3803 -- `HugeIcons.strokeRoundedStrokeOutside`
3804 -- `HugeIcons.strokeRoundedStrokeRight`
3805 -- `HugeIcons.strokeRoundedStrokeTop`
3806 -- `HugeIcons.strokeRoundedStructure01`
3807 -- `HugeIcons.strokeRoundedStructure02`
3808 -- `HugeIcons.strokeRoundedStructure03`
3809 -- `HugeIcons.strokeRoundedStructure04`
3810 -- `HugeIcons.strokeRoundedStructure05`
3811 -- `HugeIcons.strokeRoundedStructureAdd`
3812 -- `HugeIcons.strokeRoundedStructureCheck`
3813 -- `HugeIcons.strokeRoundedStructureFail`
3814 -- `HugeIcons.strokeRoundedStructureFolderCircle`
3815 -- `HugeIcons.strokeRoundedStructureFolder`
3816 -- `HugeIcons.strokeRoundedStudentCard`
3817 -- `HugeIcons.strokeRoundedStudent`
3818 -- `HugeIcons.strokeRoundedStudents`
3819 -- `HugeIcons.strokeRoundedStudyDesk`
3820 -- `HugeIcons.strokeRoundedStudyLamp`
3821 -- `HugeIcons.strokeRoundedStumbleupon`
3822 -- `HugeIcons.strokeRoundedSubmarine`
3823 -- `HugeIcons.strokeRoundedSubmerge`
3824 -- `HugeIcons.strokeRoundedSubnodeAdd`
3825 -- `HugeIcons.strokeRoundedSubnodeDelete`
3826 -- `HugeIcons.strokeRoundedSubpoena`
3827 -- `HugeIcons.strokeRoundedSubtitle`
3828 -- `HugeIcons.strokeRoundedSuit01`
3829 -- `HugeIcons.strokeRoundedSuit02`
3830 -- `HugeIcons.strokeRoundedSujood`
3831 -- `HugeIcons.strokeRoundedSummation01`
3832 -- `HugeIcons.strokeRoundedSummation02`
3833 -- `HugeIcons.strokeRoundedSummationCircle`
3834 -- `HugeIcons.strokeRoundedSummationSquare`
3835 -- `HugeIcons.strokeRoundedSun01`
3836 -- `HugeIcons.strokeRoundedSun02`
3837 -- `HugeIcons.strokeRoundedSun03`
3838 -- `HugeIcons.strokeRoundedSunCloud01`
3839 -- `HugeIcons.strokeRoundedSunCloud02`
3840 -- `HugeIcons.strokeRoundedSunCloudAngledRain01`
3841 -- `HugeIcons.strokeRoundedSunCloudAngledRain02`
3842 -- `HugeIcons.strokeRoundedSunCloudAngledRainZap01`
3843 -- `HugeIcons.strokeRoundedSunCloudAngledRainZap02`
3844 -- `HugeIcons.strokeRoundedSunCloudAngledZap01`
3845 -- `HugeIcons.strokeRoundedSunCloudAngledZap02`
3846 -- `HugeIcons.strokeRoundedSunCloudBigRain01`
3847 -- `HugeIcons.strokeRoundedSunCloudBigRain02`
3848 -- `HugeIcons.strokeRoundedSunCloudFastWind01`
3849 -- `HugeIcons.strokeRoundedSunCloudFastWind02`
3850 -- `HugeIcons.strokeRoundedSunCloudHailstone01`
3851 -- `HugeIcons.strokeRoundedSunCloudHailstone02`
3852 -- `HugeIcons.strokeRoundedSunCloudLittleRain01`
3853 -- `HugeIcons.strokeRoundedSunCloudLittleRain02`
3854 -- `HugeIcons.strokeRoundedSunCloudLittleSnow01`
3855 -- `HugeIcons.strokeRoundedSunCloudLittleSnow02`
3856 -- `HugeIcons.strokeRoundedSunCloudMidRain01`
3857 -- `HugeIcons.strokeRoundedSunCloudMidRain02`
3858 -- `HugeIcons.strokeRoundedSunCloudMidSnow01`
3859 -- `HugeIcons.strokeRoundedSunCloudMidSnow02`
3860 -- `HugeIcons.strokeRoundedSunCloudSlowWind01`
3861 -- `HugeIcons.strokeRoundedSunCloudSlowWind02`
3862 -- `HugeIcons.strokeRoundedSunCloudSnow01`
3863 -- `HugeIcons.strokeRoundedSunCloudSnow02`
3864 -- `HugeIcons.strokeRoundedSunglasses`
3865 -- `HugeIcons.strokeRoundedSunrise`
3866 -- `HugeIcons.strokeRoundedSunset`
3867 -- `HugeIcons.strokeRoundedSuperMario`
3868 -- `HugeIcons.strokeRoundedSuperMarioToad`
3869 -- `HugeIcons.strokeRoundedSurfboard`
3870 -- `HugeIcons.strokeRoundedSurprise`
3871 -- `HugeIcons.strokeRoundedSushi01`
3872 -- `HugeIcons.strokeRoundedSushi02`
3873 -- `HugeIcons.strokeRoundedSushi03`
3874 -- `HugeIcons.strokeRoundedSuspicious`
3875 -- `HugeIcons.strokeRoundedSustainableEnergy`
3876 -- `HugeIcons.strokeRoundedSvg01`
3877 -- `HugeIcons.strokeRoundedSvg02`
3878 -- `HugeIcons.strokeRoundedSwarm`
3879 -- `HugeIcons.strokeRoundedSwatch`
3880 -- `HugeIcons.strokeRoundedSwimmingCap`
3881 -- `HugeIcons.strokeRoundedSwimming`
3882 -- `HugeIcons.strokeRoundedSwipeDown01`
3883 -- `HugeIcons.strokeRoundedSwipeDown02`
3884 -- `HugeIcons.strokeRoundedSwipeDown03`
3885 -- `HugeIcons.strokeRoundedSwipeDown04`
3886 -- `HugeIcons.strokeRoundedSwipeDown05`
3887 -- `HugeIcons.strokeRoundedSwipeDown06`
3888 -- `HugeIcons.strokeRoundedSwipeDown07`
3889 -- `HugeIcons.strokeRoundedSwipeDown08`
3890 -- `HugeIcons.strokeRoundedSwipeLeft01`
3891 -- `HugeIcons.strokeRoundedSwipeLeft02`
3892 -- `HugeIcons.strokeRoundedSwipeLeft03`
3893 -- `HugeIcons.strokeRoundedSwipeLeft04`
3894 -- `HugeIcons.strokeRoundedSwipeLeft05`
3895 -- `HugeIcons.strokeRoundedSwipeLeft06`
3896 -- `HugeIcons.strokeRoundedSwipeLeft07`
3897 -- `HugeIcons.strokeRoundedSwipeLeft08`
3898 -- `HugeIcons.strokeRoundedSwipeLeft09`
3899 -- `HugeIcons.strokeRoundedSwipeRight01`
3900 -- `HugeIcons.strokeRoundedSwipeRight02`
3901 -- `HugeIcons.strokeRoundedSwipeRight03`
3902 -- `HugeIcons.strokeRoundedSwipeRight04`
3903 -- `HugeIcons.strokeRoundedSwipeRight05`
3904 -- `HugeIcons.strokeRoundedSwipeRight06`
3905 -- `HugeIcons.strokeRoundedSwipeRight07`
3906 -- `HugeIcons.strokeRoundedSwipeRight08`
3907 -- `HugeIcons.strokeRoundedSwipeRight09`
3908 -- `HugeIcons.strokeRoundedSwipeUp01`
3909 -- `HugeIcons.strokeRoundedSwipeUp02`
3910 -- `HugeIcons.strokeRoundedSwipeUp03`
3911 -- `HugeIcons.strokeRoundedSwipeUp04`
3912 -- `HugeIcons.strokeRoundedSwipeUp05`
3913 -- `HugeIcons.strokeRoundedSwipeUp06`
3914 -- `HugeIcons.strokeRoundedSwipeUp07`
3915 -- `HugeIcons.strokeRoundedSwipeUp08`
3916 -- `HugeIcons.strokeRoundedSword01`
3917 -- `HugeIcons.strokeRoundedSword02`
3918 -- `HugeIcons.strokeRoundedSword03`
3919 -- `HugeIcons.strokeRoundedSystemUpdate01`
3920 -- `HugeIcons.strokeRoundedSystemUpdate02`
3921 -- `HugeIcons.strokeRoundedTShirt`
3922 -- `HugeIcons.strokeRoundedTable01`
3923 -- `HugeIcons.strokeRoundedTable02`
3924 -- `HugeIcons.strokeRoundedTable03`
3925 -- `HugeIcons.strokeRoundedTableLamp01`
3926 -- `HugeIcons.strokeRoundedTableLamp02`
3927 -- `HugeIcons.strokeRoundedTableRound`
3928 -- `HugeIcons.strokeRoundedTable`
3929 -- `HugeIcons.strokeRoundedTableTennisBat`
3930 -- `HugeIcons.strokeRoundedTablet01`
3931 -- `HugeIcons.strokeRoundedTablet02`
3932 -- `HugeIcons.strokeRoundedTabletConnectedBluetooth`
3933 -- `HugeIcons.strokeRoundedTabletConnectedUsb`
3934 -- `HugeIcons.strokeRoundedTabletConnectedWifi`
3935 -- `HugeIcons.strokeRoundedTabletPen`
3936 -- `HugeIcons.strokeRoundedTaco01`
3937 -- `HugeIcons.strokeRoundedTaco02`
3938 -- `HugeIcons.strokeRoundedTag01`
3939 -- `HugeIcons.strokeRoundedTag02`
3940 -- `HugeIcons.strokeRoundedTags`
3941 -- `HugeIcons.strokeRoundedTailwindcss`
3942 -- `HugeIcons.strokeRoundedTajMahal`
3943 -- `HugeIcons.strokeRoundedTan`
3944 -- `HugeIcons.strokeRoundedTankTop`
3945 -- `HugeIcons.strokeRoundedTankerTruck`
3946 -- `HugeIcons.strokeRoundedTap01`
3947 -- `HugeIcons.strokeRoundedTap02`
3948 -- `HugeIcons.strokeRoundedTap03`
3949 -- `HugeIcons.strokeRoundedTap04`
3950 -- `HugeIcons.strokeRoundedTap05`
3951 -- `HugeIcons.strokeRoundedTap06`
3952 -- `HugeIcons.strokeRoundedTap07`
3953 -- `HugeIcons.strokeRoundedTap08`
3954 -- `HugeIcons.strokeRoundedTapeMeasure`
3955 -- `HugeIcons.strokeRoundedTarget01`
3956 -- `HugeIcons.strokeRoundedTarget02`
3957 -- `HugeIcons.strokeRoundedTarget03`
3958 -- `HugeIcons.strokeRoundedTargetDollar`
3959 -- `HugeIcons.strokeRoundedTasbih`
3960 -- `HugeIcons.strokeRoundedTask01`
3961 -- `HugeIcons.strokeRoundedTask02`
3962 -- `HugeIcons.strokeRoundedTaskAdd01`
3963 -- `HugeIcons.strokeRoundedTaskAdd02`
3964 -- `HugeIcons.strokeRoundedTaskDaily01`
3965 -- `HugeIcons.strokeRoundedTaskDaily02`
3966 -- `HugeIcons.strokeRoundedTaskDone01`
3967 -- `HugeIcons.strokeRoundedTaskDone02`
3968 -- `HugeIcons.strokeRoundedTaskEdit01`
3969 -- `HugeIcons.strokeRoundedTaskEdit02`
3970 -- `HugeIcons.strokeRoundedTaskRemove01`
3971 -- `HugeIcons.strokeRoundedTaskRemove02`
3972 -- `HugeIcons.strokeRoundedTaxes`
3973 -- `HugeIcons.strokeRoundedTaxi02`
3974 -- `HugeIcons.strokeRoundedTaxi`
3975 -- `HugeIcons.strokeRoundedTeaPod`
3976 -- `HugeIcons.strokeRoundedTea`
3977 -- `HugeIcons.strokeRoundedTeacher`
3978 -- `HugeIcons.strokeRoundedTeaching`
3979 -- `HugeIcons.strokeRoundedTeamviewer`
3980 -- `HugeIcons.strokeRoundedTelegram`
3981 -- `HugeIcons.strokeRoundedTelephone`
3982 -- `HugeIcons.strokeRoundedTelescope01`
3983 -- `HugeIcons.strokeRoundedTelescope02`
3984 -- `HugeIcons.strokeRoundedTelevisionTable`
3985 -- `HugeIcons.strokeRoundedTemperature`
3986 -- `HugeIcons.strokeRoundedTennisBall`
3987 -- `HugeIcons.strokeRoundedTennisRacket`
3988 -- `HugeIcons.strokeRoundedTerrace`
3989 -- `HugeIcons.strokeRoundedTestTube01`
3990 -- `HugeIcons.strokeRoundedTestTube02`
3991 -- `HugeIcons.strokeRoundedTestTube03`
3992 -- `HugeIcons.strokeRoundedTestTube`
3993 -- `HugeIcons.strokeRoundedTetris`
3994 -- `HugeIcons.strokeRoundedTextAlignCenter`
3995 -- `HugeIcons.strokeRoundedTextAlignJustifyCenter`
3996 -- `HugeIcons.strokeRoundedTextAlignJustifyLeft`
3997 -- `HugeIcons.strokeRoundedTextAlignJustifyRight`
3998 -- `HugeIcons.strokeRoundedTextAlignLeft01`
3999 -- `HugeIcons.strokeRoundedTextAlignLeft`
4000 -- `HugeIcons.strokeRoundedTextAlignRight01`
4001 -- `HugeIcons.strokeRoundedTextAlignRight`
4002 -- `HugeIcons.strokeRoundedTextAllCaps`
4003 -- `HugeIcons.strokeRoundedTextBold`
4004 -- `HugeIcons.strokeRoundedTextCenterlineCenterTop`
4005 -- `HugeIcons.strokeRoundedTextCenterlineLeft`
4006 -- `HugeIcons.strokeRoundedTextCenterlineMiddle`
4007 -- `HugeIcons.strokeRoundedTextCenterlineRight`
4008 -- `HugeIcons.strokeRoundedTextCheck`
4009 -- `HugeIcons.strokeRoundedTextCircle`
4010 -- `HugeIcons.strokeRoundedTextClear`
4011 -- `HugeIcons.strokeRoundedTextColor`
4012 -- `HugeIcons.strokeRoundedTextCreation`
4013 -- `HugeIcons.strokeRoundedTextFirstlineLeft`
4014 -- `HugeIcons.strokeRoundedTextFirstlineRight`
4015 -- `HugeIcons.strokeRoundedTextFont`
4016 -- `HugeIcons.strokeRoundedTextFootnote`
4017 -- `HugeIcons.strokeRoundedTextIndent01`
4018 -- `HugeIcons.strokeRoundedTextIndentLess`
4019 -- `HugeIcons.strokeRoundedTextIndentMore`
4020 -- `HugeIcons.strokeRoundedTextIndent`
4021 -- `HugeIcons.strokeRoundedTextItalicSlash`
4022 -- `HugeIcons.strokeRoundedTextItalic`
4023 -- `HugeIcons.strokeRoundedTextKerning`
4024 -- `HugeIcons.strokeRoundedTextNumberSign`
4025 -- `HugeIcons.strokeRoundedTextSelection`
4026 -- `HugeIcons.strokeRoundedTextSmallcaps`
4027 -- `HugeIcons.strokeRoundedTextSquare`
4028 -- `HugeIcons.strokeRoundedTextStrikethrough`
4029 -- `HugeIcons.strokeRoundedText`
4030 -- `HugeIcons.strokeRoundedTextSubscript`
4031 -- `HugeIcons.strokeRoundedTextSuperscript`
4032 -- `HugeIcons.strokeRoundedTextTracking`
4033 -- `HugeIcons.strokeRoundedTextUnderline`
4034 -- `HugeIcons.strokeRoundedTextVariableFront`
4035 -- `HugeIcons.strokeRoundedTextVerticalAlignment`
4036 -- `HugeIcons.strokeRoundedTextWrap`
4037 -- `HugeIcons.strokeRoundedTheProphetsMosque`
4038 -- `HugeIcons.strokeRoundedThermometerCold`
4039 -- `HugeIcons.strokeRoundedThermometer`
4040 -- `HugeIcons.strokeRoundedThermometerWarm`
4041 -- `HugeIcons.strokeRoundedThread`
4042 -- `HugeIcons.strokeRoundedThreadsEllipse`
4043 -- `HugeIcons.strokeRoundedThreadsRectangle`
4044 -- `HugeIcons.strokeRoundedThreads`
4045 -- `HugeIcons.strokeRoundedThreeCircle`
4046 -- `HugeIcons.strokeRoundedThreeFinger01`
4047 -- `HugeIcons.strokeRoundedThreeFinger02`
4048 -- `HugeIcons.strokeRoundedThreeFinger03`
4049 -- `HugeIcons.strokeRoundedThreeFinger04`
4050 -- `HugeIcons.strokeRoundedThreeFinger05`
4051 -- `HugeIcons.strokeRoundedThreeSquare`
4052 -- `HugeIcons.strokeRoundedThumbsDownEllipse`
4053 -- `HugeIcons.strokeRoundedThumbsDownRectangle`
4054 -- `HugeIcons.strokeRoundedThumbsDown`
4055 -- `HugeIcons.strokeRoundedThumbsUpDown`
4056 -- `HugeIcons.strokeRoundedThumbsUpEllipse`
4057 -- `HugeIcons.strokeRoundedThumbsUpRectangle`
4058 -- `HugeIcons.strokeRoundedThumbsUp`
4059 -- `HugeIcons.strokeRoundedTicTacToe`
4060 -- `HugeIcons.strokeRoundedTick01`
4061 -- `HugeIcons.strokeRoundedTick02`
4062 -- `HugeIcons.strokeRoundedTick03`
4063 -- `HugeIcons.strokeRoundedTick04`
4064 -- `HugeIcons.strokeRoundedTickDouble01`
4065 -- `HugeIcons.strokeRoundedTickDouble02`
4066 -- `HugeIcons.strokeRoundedTickDouble03`
4067 -- `HugeIcons.strokeRoundedTickDouble04`
4068 -- `HugeIcons.strokeRoundedTicket01`
4069 -- `HugeIcons.strokeRoundedTicket02`
4070 -- `HugeIcons.strokeRoundedTicket03`
4071 -- `HugeIcons.strokeRoundedTicketStar`
4072 -- `HugeIcons.strokeRoundedTie`
4073 -- `HugeIcons.strokeRoundedTiff01`
4074 -- `HugeIcons.strokeRoundedTiff02`
4075 -- `HugeIcons.strokeRoundedTiktok`
4076 -- `HugeIcons.strokeRoundedTiltify`
4077 -- `HugeIcons.strokeRoundedTime01`
4078 -- `HugeIcons.strokeRoundedTime02`
4079 -- `HugeIcons.strokeRoundedTime03`
4080 -- `HugeIcons.strokeRoundedTime04`
4081 -- `HugeIcons.strokeRoundedTimeHalfPass`
4082 -- `HugeIcons.strokeRoundedTimeManagementCircle`
4083 -- `HugeIcons.strokeRoundedTimeManagement`
4084 -- `HugeIcons.strokeRoundedTimeQuarter02`
4085 -- `HugeIcons.strokeRoundedTimeQuarterPass`
4086 -- `HugeIcons.strokeRoundedTimeQuarter`
4087 -- `HugeIcons.strokeRoundedTimeSchedule`
4088 -- `HugeIcons.strokeRoundedTimeSetting01`
4089 -- `HugeIcons.strokeRoundedTimeSetting02`
4090 -- `HugeIcons.strokeRoundedTimeSetting03`
4091 -- `HugeIcons.strokeRoundedTimer01`
4092 -- `HugeIcons.strokeRoundedTimer02`
4093 -- `HugeIcons.strokeRoundedTinderSquare`
4094 -- `HugeIcons.strokeRoundedTinder`
4095 -- `HugeIcons.strokeRoundedTips`
4096 -- `HugeIcons.strokeRoundedTire`
4097 -- `HugeIcons.strokeRoundedTired01`
4098 -- `HugeIcons.strokeRoundedTired02`
4099 -- `HugeIcons.strokeRoundedTissuePaper`
4100 -- `HugeIcons.strokeRoundedToggleOff`
4101 -- `HugeIcons.strokeRoundedToggleOn`
4102 -- `HugeIcons.strokeRoundedToilet01`
4103 -- `HugeIcons.strokeRoundedToilet02`
4104 -- `HugeIcons.strokeRoundedTokenCircle`
4105 -- `HugeIcons.strokeRoundedTokenSquare`
4106 -- `HugeIcons.strokeRoundedTongue01`
4107 -- `HugeIcons.strokeRoundedTongue`
4108 -- `HugeIcons.strokeRoundedTongueWinkLeft`
4109 -- `HugeIcons.strokeRoundedTongueWinkRight`
4110 -- `HugeIcons.strokeRoundedTools`
4111 -- `HugeIcons.strokeRoundedTornado01`
4112 -- `HugeIcons.strokeRoundedTornado02`
4113 -- `HugeIcons.strokeRoundedTorriGate`
4114 -- `HugeIcons.strokeRoundedTouch01`
4115 -- `HugeIcons.strokeRoundedTouch02`
4116 -- `HugeIcons.strokeRoundedTouch03`
4117 -- `HugeIcons.strokeRoundedTouch04`
4118 -- `HugeIcons.strokeRoundedTouch05`
4119 -- `HugeIcons.strokeRoundedTouch06`
4120 -- `HugeIcons.strokeRoundedTouch07`
4121 -- `HugeIcons.strokeRoundedTouch08`
4122 -- `HugeIcons.strokeRoundedTouch09`
4123 -- `HugeIcons.strokeRoundedTouch10`
4124 -- `HugeIcons.strokeRoundedTouchInteraction01`
4125 -- `HugeIcons.strokeRoundedTouchInteraction02`
4126 -- `HugeIcons.strokeRoundedTouchInteraction03`
4127 -- `HugeIcons.strokeRoundedTouchInteraction04`
4128 -- `HugeIcons.strokeRoundedTouchLocked01`
4129 -- `HugeIcons.strokeRoundedTouchLocked02`
4130 -- `HugeIcons.strokeRoundedTouchLocked03`
4131 -- `HugeIcons.strokeRoundedTouchLocked04`
4132 -- `HugeIcons.strokeRoundedTouchpad01`
4133 -- `HugeIcons.strokeRoundedTouchpad02`
4134 -- `HugeIcons.strokeRoundedTouchpad03`
4135 -- `HugeIcons.strokeRoundedTouchpad04`
4136 -- `HugeIcons.strokeRoundedTowTruck`
4137 -- `HugeIcons.strokeRoundedTowels`
4138 -- `HugeIcons.strokeRoundedToyTrain`
4139 -- `HugeIcons.strokeRoundedTractor`
4140 -- `HugeIcons.strokeRoundedTradeDown`
4141 -- `HugeIcons.strokeRoundedTradeMark`
4142 -- `HugeIcons.strokeRoundedTradeUp`
4143 -- `HugeIcons.strokeRoundedTrademark`
4144 -- `HugeIcons.strokeRoundedTrafficIncident`
4145 -- `HugeIcons.strokeRoundedTrafficJam01`
4146 -- `HugeIcons.strokeRoundedTrafficJam02`
4147 -- `HugeIcons.strokeRoundedTrafficLight`
4148 -- `HugeIcons.strokeRoundedTrain01`
4149 -- `HugeIcons.strokeRoundedTrain02`
4150 -- `HugeIcons.strokeRoundedTram`
4151 -- `HugeIcons.strokeRoundedTrampoline`
4152 -- `HugeIcons.strokeRoundedTransactionHistory`
4153 -- `HugeIcons.strokeRoundedTransaction`
4154 -- `HugeIcons.strokeRoundedTransitionBottom`
4155 -- `HugeIcons.strokeRoundedTransitionLeft`
4156 -- `HugeIcons.strokeRoundedTransitionRight`
4157 -- `HugeIcons.strokeRoundedTransitionTop`
4158 -- `HugeIcons.strokeRoundedTranslate`
4159 -- `HugeIcons.strokeRoundedTranslation`
4160 -- `HugeIcons.strokeRoundedTransmission`
4161 -- `HugeIcons.strokeRoundedTransparency`
4162 -- `HugeIcons.strokeRoundedTrapezoidLineHorizontal`
4163 -- `HugeIcons.strokeRoundedTrapezoidLineVertical`
4164 -- `HugeIcons.strokeRoundedTravelBag`
4165 -- `HugeIcons.strokeRoundedTreadmill01`
4166 -- `HugeIcons.strokeRoundedTreadmill02`
4167 -- `HugeIcons.strokeRoundedTreatment`
4168 -- `HugeIcons.strokeRoundedTree01`
4169 -- `HugeIcons.strokeRoundedTree02`
4170 -- `HugeIcons.strokeRoundedTree03`
4171 -- `HugeIcons.strokeRoundedTree04`
4172 -- `HugeIcons.strokeRoundedTree05`
4173 -- `HugeIcons.strokeRoundedTree06`
4174 -- `HugeIcons.strokeRoundedTree07`
4175 -- `HugeIcons.strokeRoundedTrello`
4176 -- `HugeIcons.strokeRoundedTriangle01`
4177 -- `HugeIcons.strokeRoundedTriangle02`
4178 -- `HugeIcons.strokeRoundedTriangle03`
4179 -- `HugeIcons.strokeRoundedTriangle`
4180 -- `HugeIcons.strokeRoundedTrolley01`
4181 -- `HugeIcons.strokeRoundedTrolley02`
4182 -- `HugeIcons.strokeRoundedTropicalStorm`
4183 -- `HugeIcons.strokeRoundedTropicalStormTracks01`
4184 -- `HugeIcons.strokeRoundedTropicalStormTracks02`
4185 -- `HugeIcons.strokeRoundedTropicalStormTracks`
4186 -- `HugeIcons.strokeRoundedTruckDelivery`
4187 -- `HugeIcons.strokeRoundedTruckMonster`
4188 -- `HugeIcons.strokeRoundedTruckReturn`
4189 -- `HugeIcons.strokeRoundedTruck`
4190 -- `HugeIcons.strokeRoundedTrulli`
4191 -- `HugeIcons.strokeRoundedTsunami`
4192 -- `HugeIcons.strokeRoundedTulip`
4193 -- `HugeIcons.strokeRoundedTumblr`
4194 -- `HugeIcons.strokeRoundedTurtleNeck`
4195 -- `HugeIcons.strokeRoundedTv01`
4196 -- `HugeIcons.strokeRoundedTv02`
4197 -- `HugeIcons.strokeRoundedTvFix`
4198 -- `HugeIcons.strokeRoundedTvIssue`
4199 -- `HugeIcons.strokeRoundedTvSmart`
4200 -- `HugeIcons.strokeRoundedTwinTower`
4201 -- `HugeIcons.strokeRoundedTwitch`
4202 -- `HugeIcons.strokeRoundedTwitterSquare`
4203 -- `HugeIcons.strokeRoundedTwitter`
4204 -- `HugeIcons.strokeRoundedTwoCircle`
4205 -- `HugeIcons.strokeRoundedTwoFactorAccess`
4206 -- `HugeIcons.strokeRoundedTwoFinger01`
4207 -- `HugeIcons.strokeRoundedTwoFinger02`
4208 -- `HugeIcons.strokeRoundedTwoFinger03`
4209 -- `HugeIcons.strokeRoundedTwoFinger04`
4210 -- `HugeIcons.strokeRoundedTwoFinger05`
4211 -- `HugeIcons.strokeRoundedTwoSquare`
4212 -- `HugeIcons.strokeRoundedTxt01`
4213 -- `HugeIcons.strokeRoundedTxt02`
4214 -- `HugeIcons.strokeRoundedTypeCursor`
4215 -- `HugeIcons.strokeRoundedTypescript01`
4216 -- `HugeIcons.strokeRoundedTypescript02`
4217 -- `HugeIcons.strokeRoundedTypescript03`
4218 -- `HugeIcons.strokeRoundedUber`
4219 -- `HugeIcons.strokeRoundedUfo01`
4220 -- `HugeIcons.strokeRoundedUfo`
4221 -- `HugeIcons.strokeRoundedUmbrellaDollar`
4222 -- `HugeIcons.strokeRoundedUmbrella`
4223 -- `HugeIcons.strokeRoundedUnamused`
4224 -- `HugeIcons.strokeRoundedUnarchive03`
4225 -- `HugeIcons.strokeRoundedUnavailable`
4226 -- `HugeIcons.strokeRoundedUnderpants01`
4227 -- `HugeIcons.strokeRoundedUnderpants02`
4228 -- `HugeIcons.strokeRoundedUnderpants03`
4229 -- `HugeIcons.strokeRoundedUndo02`
4230 -- `HugeIcons.strokeRoundedUndo03`
4231 -- `HugeIcons.strokeRoundedUndo`
4232 -- `HugeIcons.strokeRoundedUnfoldLess`
4233 -- `HugeIcons.strokeRoundedUnfoldMore`
4234 -- `HugeIcons.strokeRoundedUngroupItems`
4235 -- `HugeIcons.strokeRoundedUngroupLayers`
4236 -- `HugeIcons.strokeRoundedUnhappy`
4237 -- `HugeIcons.strokeRoundedUniversalAccessCircle`
4238 -- `HugeIcons.strokeRoundedUniversalAccess`
4239 -- `HugeIcons.strokeRoundedUniversity`
4240 -- `HugeIcons.strokeRoundedUnlink01`
4241 -- `HugeIcons.strokeRoundedUnlink02`
4242 -- `HugeIcons.strokeRoundedUnlink03`
4243 -- `HugeIcons.strokeRoundedUnlink04`
4244 -- `HugeIcons.strokeRoundedUnlink05`
4245 -- `HugeIcons.strokeRoundedUnlink06`
4246 -- `HugeIcons.strokeRoundedUnsplash`
4247 -- `HugeIcons.strokeRoundedUpload01`
4248 -- `HugeIcons.strokeRoundedUpload02`
4249 -- `HugeIcons.strokeRoundedUpload03`
4250 -- `HugeIcons.strokeRoundedUpload04`
4251 -- `HugeIcons.strokeRoundedUpload05`
4252 -- `HugeIcons.strokeRoundedUploadCircle01`
4253 -- `HugeIcons.strokeRoundedUploadCircle02`
4254 -- `HugeIcons.strokeRoundedUploadSquare01`
4255 -- `HugeIcons.strokeRoundedUploadSquare02`
4256 -- `HugeIcons.strokeRoundedUpwork`
4257 -- `HugeIcons.strokeRoundedUsbBugs`
4258 -- `HugeIcons.strokeRoundedUsbConnected01`
4259 -- `HugeIcons.strokeRoundedUsbConnected02`
4260 -- `HugeIcons.strokeRoundedUsbConnected03`
4261 -- `HugeIcons.strokeRoundedUsbError`
4262 -- `HugeIcons.strokeRoundedUsbMemory01`
4263 -- `HugeIcons.strokeRoundedUsbMemory02`
4264 -- `HugeIcons.strokeRoundedUsbNotConnected01`
4265 -- `HugeIcons.strokeRoundedUsbNotConnected02`
4266 -- `HugeIcons.strokeRoundedUsb`
4267 -- `HugeIcons.strokeRoundedUsdt`
4268 -- `HugeIcons.strokeRoundedUser02`
4269 -- `HugeIcons.strokeRoundedUser03`
4270 -- `HugeIcons.strokeRoundedUserAccount`
4271 -- `HugeIcons.strokeRoundedUserAdd01`
4272 -- `HugeIcons.strokeRoundedUserAdd02`
4273 -- `HugeIcons.strokeRoundedUserAi`
4274 -- `HugeIcons.strokeRoundedUserArrowLeftRight`
4275 -- `HugeIcons.strokeRoundedUserBlock01`
4276 -- `HugeIcons.strokeRoundedUserBlock02`
4277 -- `HugeIcons.strokeRoundedUserCheck01`
4278 -- `HugeIcons.strokeRoundedUserCheck02`
4279 -- `HugeIcons.strokeRoundedUserCircle02`
4280 -- `HugeIcons.strokeRoundedUserCircle`
4281 -- `HugeIcons.strokeRoundedUserEdit01`
4282 -- `HugeIcons.strokeRoundedUserFullView`
4283 -- `HugeIcons.strokeRoundedUserGroup02`
4284 -- `HugeIcons.strokeRoundedUserGroup03`
4285 -- `HugeIcons.strokeRoundedUserGroup`
4286 -- `HugeIcons.strokeRoundedUserIdVerification`
4287 -- `HugeIcons.strokeRoundedUserList`
4288 -- `HugeIcons.strokeRoundedUserLock01`
4289 -- `HugeIcons.strokeRoundedUserLock02`
4290 -- `HugeIcons.strokeRoundedUserLove01`
4291 -- `HugeIcons.strokeRoundedUserLove02`
4292 -- `HugeIcons.strokeRoundedUserMinus01`
4293 -- `HugeIcons.strokeRoundedUserMinus02`
4294 -- `HugeIcons.strokeRoundedUserMultiple02`
4295 -- `HugeIcons.strokeRoundedUserMultiple03`
4296 -- `HugeIcons.strokeRoundedUserMultiple`
4297 -- `HugeIcons.strokeRoundedUserQuestion01`
4298 -- `HugeIcons.strokeRoundedUserQuestion02`
4299 -- `HugeIcons.strokeRoundedUserRemove01`
4300 -- `HugeIcons.strokeRoundedUserRemove02`
4301 -- `HugeIcons.strokeRoundedUserRoadside`
4302 -- `HugeIcons.strokeRoundedUserSearch01`
4303 -- `HugeIcons.strokeRoundedUserSearch02`
4304 -- `HugeIcons.strokeRoundedUserSettings01`
4305 -- `HugeIcons.strokeRoundedUserSettings02`
4306 -- `HugeIcons.strokeRoundedUserSharing`
4307 -- `HugeIcons.strokeRoundedUserShield01`
4308 -- `HugeIcons.strokeRoundedUserShield02`
4309 -- `HugeIcons.strokeRoundedUserSquare`
4310 -- `HugeIcons.strokeRoundedUserStar01`
4311 -- `HugeIcons.strokeRoundedUserStar02`
4312 -- `HugeIcons.strokeRoundedUserStatus`
4313 -- `HugeIcons.strokeRoundedUserStory`
4314 -- `HugeIcons.strokeRoundedUser`
4315 -- `HugeIcons.strokeRoundedUserSwitch`
4316 -- `HugeIcons.strokeRoundedUserTime01`
4317 -- `HugeIcons.strokeRoundedUserTime02`
4318 -- `HugeIcons.strokeRoundedUserTime03`
4319 -- `HugeIcons.strokeRoundedUserUnlock01`
4320 -- `HugeIcons.strokeRoundedUserUnlock02`
4321 -- `HugeIcons.strokeRoundedUserWarning01`
4322 -- `HugeIcons.strokeRoundedUserWarning02`
4323 -- `HugeIcons.strokeRoundedUserWarning03`
4324 -- `HugeIcons.strokeRoundedUv01`
4325 -- `HugeIcons.strokeRoundedUv02`
4326 -- `HugeIcons.strokeRoundedUv03`
4327 -- `HugeIcons.strokeRoundedVaccine`
4328 -- `HugeIcons.strokeRoundedVacuumCleaner`
4329 -- `HugeIcons.strokeRoundedValidationApproval`
4330 -- `HugeIcons.strokeRoundedValidation`
4331 -- `HugeIcons.strokeRoundedVan`
4332 -- `HugeIcons.strokeRoundedVariable`
4333 -- `HugeIcons.strokeRoundedVegetarianFood`
4334 -- `HugeIcons.strokeRoundedVersus`
4335 -- `HugeIcons.strokeRoundedVerticalResize`
4336 -- `HugeIcons.strokeRoundedVerticalScrollPoint`
4337 -- `HugeIcons.strokeRoundedVest`
4338 -- `HugeIcons.strokeRoundedViber`
4339 -- `HugeIcons.strokeRoundedVictoryFinger01`
4340 -- `HugeIcons.strokeRoundedVictoryFinger02`
4341 -- `HugeIcons.strokeRoundedVictoryFinger03`
4342 -- `HugeIcons.strokeRoundedVideo01`
4343 -- `HugeIcons.strokeRoundedVideo02`
4344 -- `HugeIcons.strokeRoundedVideoAi`
4345 -- `HugeIcons.strokeRoundedVideoCameraAi`
4346 -- `HugeIcons.strokeRoundedVideoConsole`
4347 -- `HugeIcons.strokeRoundedVideoOff`
4348 -- `HugeIcons.strokeRoundedVideoReplay`
4349 -- `HugeIcons.strokeRoundedViewOffSlash`
4350 -- `HugeIcons.strokeRoundedViewOff`
4351 -- `HugeIcons.strokeRoundedView`
4352 -- `HugeIcons.strokeRoundedVimeo`
4353 -- `HugeIcons.strokeRoundedVineSquare`
4354 -- `HugeIcons.strokeRoundedVine`
4355 -- `HugeIcons.strokeRoundedVintageClock`
4356 -- `HugeIcons.strokeRoundedVirtualRealityVr01`
4357 -- `HugeIcons.strokeRoundedVirtualRealityVr02`
4358 -- `HugeIcons.strokeRoundedVision`
4359 -- `HugeIcons.strokeRoundedVisualStudioCode`
4360 -- `HugeIcons.strokeRoundedVkSquare`
4361 -- `HugeIcons.strokeRoundedVk`
4362 -- `HugeIcons.strokeRoundedVoiceId`
4363 -- `HugeIcons.strokeRoundedVoice`
4364 -- `HugeIcons.strokeRoundedVolleyball`
4365 -- `HugeIcons.strokeRoundedVolumeHigh`
4366 -- `HugeIcons.strokeRoundedVolumeLow`
4367 -- `HugeIcons.strokeRoundedVolumeMinus`
4368 -- `HugeIcons.strokeRoundedVolumeMute01`
4369 -- `HugeIcons.strokeRoundedVolumeMute02`
4370 -- `HugeIcons.strokeRoundedVolumeOff`
4371 -- `HugeIcons.strokeRoundedVolumeUp`
4372 -- `HugeIcons.strokeRoundedVomiting`
4373 -- `HugeIcons.strokeRoundedVoucher`
4374 -- `HugeIcons.strokeRoundedVrGlasses`
4375 -- `HugeIcons.strokeRoundedVr`
4376 -- `HugeIcons.strokeRoundedVynil01`
4377 -- `HugeIcons.strokeRoundedVynil02`
4378 -- `HugeIcons.strokeRoundedVynil03`
4379 -- `HugeIcons.strokeRoundedW3Schools`
4380 -- `HugeIcons.strokeRoundedWaiter`
4381 -- `HugeIcons.strokeRoundedWaiters`
4382 -- `HugeIcons.strokeRoundedWallLamp`
4383 -- `HugeIcons.strokeRoundedWallet01`
4384 -- `HugeIcons.strokeRoundedWallet02`
4385 -- `HugeIcons.strokeRoundedWallet03`
4386 -- `HugeIcons.strokeRoundedWallet04`
4387 -- `HugeIcons.strokeRoundedWallet05`
4388 -- `HugeIcons.strokeRoundedWalletAdd01`
4389 -- `HugeIcons.strokeRoundedWalletAdd02`
4390 -- `HugeIcons.strokeRoundedWalletDone01`
4391 -- `HugeIcons.strokeRoundedWalletDone02`
4392 -- `HugeIcons.strokeRoundedWalletNotFound01`
4393 -- `HugeIcons.strokeRoundedWalletNotFound02`
4394 -- `HugeIcons.strokeRoundedWalletRemove01`
4395 -- `HugeIcons.strokeRoundedWalletRemove02`
4396 -- `HugeIcons.strokeRoundedWanted`
4397 -- `HugeIcons.strokeRoundedWardrobe01`
4398 -- `HugeIcons.strokeRoundedWardrobe02`
4399 -- `HugeIcons.strokeRoundedWardrobe03`
4400 -- `HugeIcons.strokeRoundedWardrobe04`
4401 -- `HugeIcons.strokeRoundedWarehouse`
4402 -- `HugeIcons.strokeRoundedWashingtonMonument`
4403 -- `HugeIcons.strokeRoundedWasteRestore`
4404 -- `HugeIcons.strokeRoundedWaste`
4405 -- `HugeIcons.strokeRoundedWatch01`
4406 -- `HugeIcons.strokeRoundedWatch02`
4407 -- `HugeIcons.strokeRoundedWaterEnergy`
4408 -- `HugeIcons.strokeRoundedWaterPolo`
4409 -- `HugeIcons.strokeRoundedWaterPump`
4410 -- `HugeIcons.strokeRoundedWaterfallDown01`
4411 -- `HugeIcons.strokeRoundedWaterfallDown03`
4412 -- `HugeIcons.strokeRoundedWaterfallUp01`
4413 -- `HugeIcons.strokeRoundedWaterfallUp02`
4414 -- `HugeIcons.strokeRoundedWatermelon`
4415 -- `HugeIcons.strokeRoundedWattpadSquare`
4416 -- `HugeIcons.strokeRoundedWattpad`
4417 -- `HugeIcons.strokeRoundedWav01`
4418 -- `HugeIcons.strokeRoundedWav02`
4419 -- `HugeIcons.strokeRoundedWaveSquare`
4420 -- `HugeIcons.strokeRoundedWave`
4421 -- `HugeIcons.strokeRoundedWaveTriangle`
4422 -- `HugeIcons.strokeRoundedWavingHand01`
4423 -- `HugeIcons.strokeRoundedWavingHand02`
4424 -- `HugeIcons.strokeRoundedWaze`
4425 -- `HugeIcons.strokeRoundedWebDesign01`
4426 -- `HugeIcons.strokeRoundedWebDesign02`
4427 -- `HugeIcons.strokeRoundedWebProgramming`
4428 -- `HugeIcons.strokeRoundedWebProtection`
4429 -- `HugeIcons.strokeRoundedWebSecurity`
4430 -- `HugeIcons.strokeRoundedWebValidation`
4431 -- `HugeIcons.strokeRoundedWebflowEllipse`
4432 -- `HugeIcons.strokeRoundedWebflowRectangle`
4433 -- `HugeIcons.strokeRoundedWebflow`
4434 -- `HugeIcons.strokeRoundedWebhook`
4435 -- `HugeIcons.strokeRoundedWechat`
4436 -- `HugeIcons.strokeRoundedWedding`
4437 -- `HugeIcons.strokeRoundedWeightScale01`
4438 -- `HugeIcons.strokeRoundedWeightScale`
4439 -- `HugeIcons.strokeRoundedWellness`
4440 -- `HugeIcons.strokeRoundedWhatsappBusiness`
4441 -- `HugeIcons.strokeRoundedWhatsapp`
4442 -- `HugeIcons.strokeRoundedWheelchair`
4443 -- `HugeIcons.strokeRoundedWhisk`
4444 -- `HugeIcons.strokeRoundedWhistle`
4445 -- `HugeIcons.strokeRoundedWhiteboard`
4446 -- `HugeIcons.strokeRoundedWifi01`
4447 -- `HugeIcons.strokeRoundedWifi02`
4448 -- `HugeIcons.strokeRoundedWifiCircle`
4449 -- `HugeIcons.strokeRoundedWifiConnected01`
4450 -- `HugeIcons.strokeRoundedWifiConnected02`
4451 -- `HugeIcons.strokeRoundedWifiConnected03`
4452 -- `HugeIcons.strokeRoundedWifiDisconnected01`
4453 -- `HugeIcons.strokeRoundedWifiDisconnected02`
4454 -- `HugeIcons.strokeRoundedWifiDisconnected03`
4455 -- `HugeIcons.strokeRoundedWifiDisconnected04`
4456 -- `HugeIcons.strokeRoundedWifiError01`
4457 -- `HugeIcons.strokeRoundedWifiError02`
4458 -- `HugeIcons.strokeRoundedWifiFullSignal`
4459 -- `HugeIcons.strokeRoundedWifiLocation`
4460 -- `HugeIcons.strokeRoundedWifiLock`
4461 -- `HugeIcons.strokeRoundedWifiLowSignal`
4462 -- `HugeIcons.strokeRoundedWifiMediumSignal`
4463 -- `HugeIcons.strokeRoundedWifiNoSignal`
4464 -- `HugeIcons.strokeRoundedWifiOff01`
4465 -- `HugeIcons.strokeRoundedWifiOff02`
4466 -- `HugeIcons.strokeRoundedWifiSquare`
4467 -- `HugeIcons.strokeRoundedWifiUnlock`
4468 -- `HugeIcons.strokeRoundedWikipedia`
4469 -- `HugeIcons.strokeRoundedWindPower01`
4470 -- `HugeIcons.strokeRoundedWindPower02`
4471 -- `HugeIcons.strokeRoundedWindPower03`
4472 -- `HugeIcons.strokeRoundedWindPower`
4473 -- `HugeIcons.strokeRoundedWindSurf`
4474 -- `HugeIcons.strokeRoundedWindTurbine`
4475 -- `HugeIcons.strokeRoundedWindowsNew`
4476 -- `HugeIcons.strokeRoundedWindowsOld`
4477 -- `HugeIcons.strokeRoundedWink`
4478 -- `HugeIcons.strokeRoundedWinking`
4479 -- `HugeIcons.strokeRoundedWirelessCloudAccess`
4480 -- `HugeIcons.strokeRoundedWireless`
4481 -- `HugeIcons.strokeRoundedWise`
4482 -- `HugeIcons.strokeRoundedWoman`
4483 -- `HugeIcons.strokeRoundedWordpress`
4484 -- `HugeIcons.strokeRoundedWorkAlert`
4485 -- `HugeIcons.strokeRoundedWorkHistory`
4486 -- `HugeIcons.strokeRoundedWork`
4487 -- `HugeIcons.strokeRoundedWorkUpdate`
4488 -- `HugeIcons.strokeRoundedWorkflowCircle01`
4489 -- `HugeIcons.strokeRoundedWorkflowCircle02`
4490 -- `HugeIcons.strokeRoundedWorkflowCircle03`
4491 -- `HugeIcons.strokeRoundedWorkflowCircle04`
4492 -- `HugeIcons.strokeRoundedWorkflowCircle05`
4493 -- `HugeIcons.strokeRoundedWorkflowCircle06`
4494 -- `HugeIcons.strokeRoundedWorkflowSquare01`
4495 -- `HugeIcons.strokeRoundedWorkflowSquare02`
4496 -- `HugeIcons.strokeRoundedWorkflowSquare03`
4497 -- `HugeIcons.strokeRoundedWorkflowSquare04`
4498 -- `HugeIcons.strokeRoundedWorkflowSquare05`
4499 -- `HugeIcons.strokeRoundedWorkflowSquare06`
4500 -- `HugeIcons.strokeRoundedWorkflowSquare07`
4501 -- `HugeIcons.strokeRoundedWorkflowSquare08`
4502 -- `HugeIcons.strokeRoundedWorkflowSquare09`
4503 -- `HugeIcons.strokeRoundedWorkflowSquare10`
4504 -- `HugeIcons.strokeRoundedWorkoutBattleRopes`
4505 -- `HugeIcons.strokeRoundedWorkoutGymnastics`
4506 -- `HugeIcons.strokeRoundedWorkoutKicking`
4507 -- `HugeIcons.strokeRoundedWorkoutRun`
4508 -- `HugeIcons.strokeRoundedWorkoutSport`
4509 -- `HugeIcons.strokeRoundedWorkoutSquats`
4510 -- `HugeIcons.strokeRoundedWorkoutStretching`
4511 -- `HugeIcons.strokeRoundedWorkoutWarmUp`
4512 -- `HugeIcons.strokeRoundedWorry`
4513 -- `HugeIcons.strokeRoundedWpsOfficeRectangle`
4514 -- `HugeIcons.strokeRoundedWpsOffice`
4515 -- `HugeIcons.strokeRoundedWrench01`
4516 -- `HugeIcons.strokeRoundedWrench02`
4517 -- `HugeIcons.strokeRoundedWudu`
4518 -- `HugeIcons.strokeRoundedXRay`
4519 -- `HugeIcons.strokeRoundedXVariableCircle`
4520 -- `HugeIcons.strokeRoundedXVariableSquare`
4521 -- `HugeIcons.strokeRoundedXVariable`
4522 -- `HugeIcons.strokeRoundedXing`
4523 -- `HugeIcons.strokeRoundedXls01`
4524 -- `HugeIcons.strokeRoundedXls02`
4525 -- `HugeIcons.strokeRoundedXml01`
4526 -- `HugeIcons.strokeRoundedXml02`
4527 -- `HugeIcons.strokeRoundedXsl01`
4528 -- `HugeIcons.strokeRoundedXsl02`
4529 -- `HugeIcons.strokeRoundedYelp`
4530 -- `HugeIcons.strokeRoundedYenCircle`
4531 -- `HugeIcons.strokeRoundedYenReceive`
4532 -- `HugeIcons.strokeRoundedYenSend`
4533 -- `HugeIcons.strokeRoundedYenSquare`
4534 -- `HugeIcons.strokeRoundedYen`
4535 -- `HugeIcons.strokeRoundedYoga01`
4536 -- `HugeIcons.strokeRoundedYoga02`
4537 -- `HugeIcons.strokeRoundedYoga03`
4538 -- `HugeIcons.strokeRoundedYogaBall`
4539 -- `HugeIcons.strokeRoundedYogaMat`
4540 -- `HugeIcons.strokeRoundedYogurt`
4541 -- `HugeIcons.strokeRoundedYoutube`
4542 -- `HugeIcons.strokeRoundedYurt`
4543 -- `HugeIcons.strokeRoundedZakat`
4544 -- `HugeIcons.strokeRoundedZap`
4545 -- `HugeIcons.strokeRoundedZeppelin`
4546 -- `HugeIcons.strokeRoundedZeroCircle`
4547 -- `HugeIcons.strokeRoundedZeroSquare`
4548 -- `HugeIcons.strokeRoundedZip01`
4549 -- `HugeIcons.strokeRoundedZip02`
4550 -- `HugeIcons.strokeRoundedZoomCircle`
4551 -- `HugeIcons.strokeRoundedZoomInArea`
4552 -- `HugeIcons.strokeRoundedZoomOutArea`
4553 -- `HugeIcons.strokeRoundedZoomSquare`
4554 -- `HugeIcons.strokeRoundedZoom`
4555 -- `HugeIcons.strokeRoundedZsh`
4556 -- `HugeIcons.strokeRoundedZzz`
.agent/skills/hugeicons-usage/SKILL.md deleted
-49
@@ -1,49 +0,0 @@
1 ----
2 -name: hugeicons-usage
3 -description: Guidelines for using the Hugeicons Flutter package, covering widget usage, customization, and theme integration.
4 ----
5 -
6 -# Hugeicons Usage Guide
7 -
8 -## Core Guidelines
9 -
10 -- **Use the `HugeIcon` widget**: Always use the provided `HugeIcon` widget for rendering icons.
11 -- **Icon Data**: Icons are accessed through the `HugeIcons` class (e.g., `HugeIcons.strokeRoundedUser`).
12 -- **Theme Color Inheritance**: By default, `HugeIcon` inherits the color from the current `IconTheme`. You can override this using the `color` property.
13 -- **Size**: The default size is 24.0. Use the `size` property to scale the icon.
14 -- **Stroke Width**: For stroke-based icons (most icons in this package), you can customize the thickness using the `strokeWidth` property.
15 -
16 -## Examples
17 -
18 -### Simple Usage
19 -```dart
20 -HugeIcon(
21 - icon: HugeIcons.strokeRoundedHome01,
22 - color: Colors.black,
23 - size: 24.0,
24 -)
25 -```
26 -
27 -### With Color Inheritance
28 -```dart
29 -IconTheme(
30 - data: IconThemeData(color: Colors.blue, size: 32.0),
31 - child: HugeIcon(
32 - icon: HugeIcons.strokeRoundedSettings01,
33 - ),
34 -)
35 -```
36 -
37 -### Custom Stroke Width
38 -```dart
39 -HugeIcon(
40 - icon: HugeIcons.strokeRoundedFavorite,
41 - color: Colors.red,
42 - strokeWidth: 2.5,
43 -)
44 -```
45 -
46 -## Troubleshooting
47 -
48 -- **Icon not showing**: Ensure the `icon` property is not null and is a valid constant from `HugeIcons`.
49 -- **Unexpected Color**: Check if a parent `IconTheme` or `DefaultTextStyle` is providing a color you don't expect.
.agent/skills/riverpod-3-0-migration/SKILL.md deleted
-74
@@ -1,74 +0,0 @@
1 ----
2 -name: riverpod-3-0-migration
3 -description: Migrate Riverpod from 2.0 to 3.0; automatic retry, paused listeners, legacy providers import, Ref simplification, FamilyNotifier removal, ProviderException, updateShouldNotify. Use when the user asks about Riverpod 3 migration, upgrading to Riverpod 3, or breaking changes in 3.0.
4 ----
5 -
6 -# Riverpod — Migrating from 2.0 to 3.0
7 -
8 -For a full list of changes and highlights, see the official Riverpod docs (What's new in Riverpod 3.0). This skill summarizes the main migration steps.
9 -
10 -## Automatic retry
11 -
12 -Failing providers are **retried by default** in 3.0. To disable globally:
13 -
14 -```dart
15 -ProviderScope(retry: (retryCount, error) => null, child: MyApp())
16 -// or ProviderContainer(retry: (retryCount, error) => null)
17 -```
18 -
19 -To disable per provider, pass **retry: (retryCount, error) => null** when defining the provider (or `@Riverpod(retry: ...)` with codegen). See riverpod-retry.
20 -
21 -## Out-of-view providers are paused
22 -
23 -Listeners in widgets that are not visible (e.g. off-screen) are **paused** by default. There is no global switch. To keep a subtree from pausing, wrap it in **TickerMode(enabled: true, child: ...)** so the Consumer(s) inside do not follow the pause behavior.
24 -
25 -## Legacy providers (StateProvider, StateNotifierProvider, ChangeNotifierProvider)
26 -
27 -These are **moved to a legacy import**. They are not removed but discouraged. To keep using them:
28 -
29 -```dart
30 -import 'package:flutter_riverpod/legacy.dart';
31 -// or hooks_riverpod/legacy.dart, riverpod/legacy.dart
32 -```
33 -
34 -## Updates use ==
35 -
36 -All providers now use **==** to filter updates (no longer **identical**). **StreamProvider** / **StreamNotifier** values are compared with ==. To customize, override **updateShouldNotify(previous, next)** on the Notifier (e.g. return true to always notify).
37 -
38 -## ProviderObserver API change
39 -
40 -Observer methods now receive a single **ProviderObserverContext** (with container, provider, and optional mutation) instead of separate (provider, value, container) parameters. Update signatures, e.g.:
41 -
42 -- **didAddProvider(ProviderObserverContext context, Object? value)** (and similar for other callbacks).
43 -
44 -## Ref simplified; Ref subclasses removed
45 -
46 -- **Ref** no longer has a type parameter. Use **Ref** everywhere (e.g. replace **MyProviderRef** with **Ref** in codegen).
47 -- **ProviderRef.state**, **Ref.listenSelf**, **FutureProviderRef.future** are **moved onto Notifier/AsyncNotifier**: use **Notifier.state**, **Notifier.listenSelf**, **AsyncNotifier.future** instead of on ref. If you need these, use a class-based Notifier/AsyncNotifier and call them on the notifier.
48 -
49 -## AutoDispose type names removed
50 -
51 -AutoDispose is still supported, but the separate type names (e.g. **AutoDisposeProvider**, **AutoDisposeNotifier**) are unified. Use **Provider**, **Notifier**, etc. with the same behavior. Migration: case-sensitive replace **AutoDispose** with a space (empty string) in type names.
52 -
53 -## Family Notifier types removed
54 -
55 -**FamilyNotifier**, **FamilyAsyncNotifier**, **FamilyStreamNotifier** are removed. Use **Notifier** / **AsyncNotifier** / **StreamNotifier** and pass the parameter via the **constructor** (and store it in a field). Remove the parameter from **build**; **build()** takes no family argument. Example:
56 -
57 -- Before: `FamilyNotifier<int, String>` with `int build(String arg)`.
58 -- After: `Notifier<int>` with constructor `MyNotifier(this.arg)` and `final String arg;`, and **int build()** using **arg**.
59 -
60 -## ProviderException
61 -
62 -When a provider throws, the exception is wrapped in **ProviderException**. If you catch the original type (e.g. **on NotFoundException**), change to **on ProviderException catch (e)** and check **e.exception is NotFoundException**. If you only use **AsyncValue** and **value.hasError** / **value.error**, no change needed.
63 -
64 -## Summary
65 -
66 -- Retry: disable via **retry** on scope/container or provider.
67 -- Pause: use **TickerMode(enabled: true)** where you don’t want pausing.
68 -- Legacy: use **flutter_riverpod/legacy.dart** (or equivalent) for StateProvider / StateNotifierProvider / ChangeNotifierProvider.
69 -- Ref: use plain **Ref**; move **state** / **listenSelf** / **future** to Notifier/AsyncNotifier.
70 -- AutoDispose: remove “AutoDispose” from type names.
71 -- Family notifiers: use Notifier/AsyncNotifier with constructor argument; **build()** has no parameter.
72 -- Errors: catch **ProviderException** and inspect **exception** when you need the original type.
73 -
74 -For version highlights and more detail, see the official Riverpod documentation.
.agent/skills/riverpod-auto-dispose/SKILL.md deleted
-65
@@ -1,65 +0,0 @@
1 ----
2 -name: riverpod-auto-dispose
3 -description: Enable automatic disposal of Riverpod providers when they have no listeners; keepAlive, onDispose, invalidate, ref.keepAlive. Use when preventing memory leaks, caching only while used, or cleaning up resources when a provider is no longer needed. Use this skill when the user asks about auto-dispose, keepAlive, or when to dispose Riverpod state.
4 ----
5 -
6 -# Riverpod — Automatic disposal
7 -
8 -## Instructions
9 -
10 -With **automatic disposal** enabled, Riverpod destroys a provider's state when it has no listeners for one frame. This frees memory and stops work (e.g. network requests) when the provider is no longer used.
11 -
12 -### Enabling
13 -
14 -- **Code generation:** Enabled by default. Disable with `@Riverpod(keepAlive: true)`.
15 -- **Manual:** Add `isAutoDispose: true` when creating the provider (e.g. `Provider.autoDispose(...)` or `FutureProvider.autoDispose(...)`).
16 -
17 -```dart
18 -// Codegen: disable auto-dispose
19 -@Riverpod(keepAlive: true)
20 -String helloWorld(Ref ref) => 'Hello world!';
21 -
22 -// Manual: enable
23 -final helloWorldProvider = Provider<String>(
24 - isAutoDispose: true,
25 - (ref) => 'Hello world!',
26 -);
27 -```
28 -
29 -When a provider has **parameters** (family), enable auto-dispose to avoid caching every parameter combination forever and causing memory leaks.
30 -
31 -### When disposal runs
32 -
33 -Riverpod counts listeners (from ref.watch, ref.listen, etc.). When the count reaches zero, it waits one frame; if still zero, **ref.onCancel** runs, then the state is destroyed and **ref.onDispose** runs.
34 -
35 -### Reacting to disposal: ref.onDispose
36 -
37 -Register a callback when the state is destroyed (e.g. close a StreamController):
38 -
39 -```dart
40 -final provider = StreamProvider<int>((ref) {
41 - final controller = StreamController<int>();
42 - ref.onDispose(controller.close);
43 - return controller.stream;
44 -});
45 -```
46 -
47 -Do not trigger side effects that modify other providers inside onDispose. You can call onDispose multiple times. Other lifecycles: **ref.onCancel** (last listener removed), **ref.onResume** (new listener added after cancel).
48 -
49 -### Forcing destruction: ref.invalidate
50 -
51 -From a widget or another provider, call **ref.invalidate(provider)** to destroy the current state. If the provider is still listened to, it will recompute; otherwise it stays destroyed until read again.
52 -
53 -```dart
54 -onPressed: () => ref.invalidate(someProvider),
55 -```
56 -
57 -For family providers you can invalidate one parameter combination or all (see riverpod-family and docs).
58 -
59 -### Keeping state alive: ref.keepAlive
60 -
61 -When auto-dispose is enabled, you can call **ref.keepAlive()** to prevent disposal until the next recomputation. Use to keep successful results alive while allowing failed or unused state to be disposed. The return value can be called to revert to automatic disposal. If the provider is recomputed, auto-dispose is re-enabled.
62 -
63 -### Caching for a duration
64 -
65 -Riverpod does not provide a built-in "cache for X seconds". You can implement it with a Timer and ref.keepAlive, or use ref.onCancel/onResume to dispose after a period of no listeners.
.agent/skills/riverpod-cancel/SKILL.md deleted
-36
@@ -1,36 +0,0 @@
1 ----
2 -name: riverpod-cancel
3 -description: Cancel or debounce Riverpod async requests with ref.onDispose; cancel when user leaves the page, debounce rapid refreshes. Use when the user asks about cancelling requests, debouncing, or cleaning up when a provider is disposed.
4 ----
5 -
6 -# Riverpod — Cancelling and debouncing requests
7 -
8 -## Instructions
9 -
10 -Use **ref.onDispose** together with **auto-dispose** (or ref.watch) to cancel in-flight requests when the user leaves the page, or to debounce rapid refreshes.
11 -
12 -### Cancelling when leaving the page
13 -
14 -Ensure the provider is **auto-dispose**. When the user navigates away, the provider loses its listeners and is disposed; **ref.onDispose** runs. In that callback, cancel the request (e.g. close the HTTP client used for the request).
15 -
16 -Example pattern: create an `http.Client()` in the provider, pass it to your fetch logic, and call **ref.onDispose(client.close)**. When the provider is disposed, the client closes and the request is cancelled. Exact API depends on your HTTP package.
17 -
18 -### Debouncing refreshes
19 -
20 -If the user triggers refresh multiple times quickly, you can delay the actual request until they stop (e.g. 500ms). Pattern:
21 -
22 -1. In the provider, set a flag (e.g. `didDispose = false`) and **ref.onDispose(() => didDispose = true)**.
23 -2. **await Future.delayed(duration)**.
24 -3. If **didDispose** is true, the user triggered another refresh during the delay; **throw** to abort (Riverpod catches and ignores). Otherwise create the client, register **onDispose(client.close)**, and run the request.
25 -
26 -So: delay first, then create client and run request; disposal during the delay aborts, disposal after creates client cancels the request.
27 -
28 -### Reusable extension
29 -
30 -You can implement an extension on **Ref** that returns a debounced/cancellable client:
31 -
32 -- Use **onDispose** to set a "cancelled" flag.
33 -- Wait for the debounce duration; if disposed, throw.
34 -- Create the client, **onDispose(client.close)**, return the client.
35 -
36 -Use this extension in your activity/provider so all call sites get debounce + cancel behavior. See the official Riverpod "cancel" how-to for a full extension example.
.agent/skills/riverpod-codegen-and-hooks/SKILL.md deleted
-105
@@ -1,105 +0,0 @@
1 ----
2 -name: riverpod-codegen-and-hooks
3 -description: Use Riverpod code generation (@riverpod, riverpod_generator) and hooks (hooks_riverpod, HookConsumerWidget, flutter_hooks with Riverpod). Use when the user asks about @riverpod, code generation, riverpod_generator, when to use codegen, or using flutter_hooks with Riverpod (HookConsumerWidget, HookConsumer).
4 ----
5 -
6 -# Riverpod — Code generation and hooks
7 -
8 -## Code generation
9 -
10 -Code generation is **optional** in Riverpod. It changes the syntax for defining providers: you write an annotated function or class and the generator produces the provider. Use it if you already use code generation (e.g. Freezed, json_serializable); otherwise the extra build step may not be worth it. See riverpod-getting-started for setup (build_runner, riverpod_generator).
11 -
12 -### Benefits
13 -
14 -- Clearer syntax: no manual provider type (Provider vs FutureProvider etc.); Riverpod infers it.
15 -- Parameters: any parameters (named, optional, defaults) instead of a single family parameter.
16 -- Stateful hot-reload for Riverpod code.
17 -- Better debugging via generated metadata.
18 -
19 -### Syntax
20 -
21 -**Functional provider** (sync):
22 -
23 -```dart
24 -@riverpod
25 -String example(Ref ref) {
26 - return 'foo';
27 -}
28 -```
29 -
30 -**Class-based provider** (sync, with methods for side effects):
31 -
32 -```dart
33 -@riverpod
34 -class Example extends _$Example {
35 - @override
36 - String build() => 'foo';
37 - // Add methods to mutate state
38 -}
39 -```
40 -
41 -**Async:** Use `Future`/`FutureOr`/`Stream`; async functions get AsyncValue and loading/error handling automatically. **Auto-dispose:** On by default with codegen. Disable with `@Riverpod(keepAlive: true)`.
42 -
43 -```dart
44 -@riverpod
45 -String example1(Ref ref) => 'foo';
46 -
47 -@Riverpod(keepAlive: true)
48 -String example2(Ref ref) => 'foo';
49 -```
50 -
51 -**Parameters:** Add parameters to the function (consistent == required):
52 -
53 -```dart
54 -@riverpod
55 -Future<User> fetchUser(Ref ref, {required int userId}) async {
56 - final json = await http.get('api/user/$userId');
57 - return User.fromJson(json);
58 -}
59 -```
60 -
61 -Manual equivalent would be `FutureProvider.autoDispose.family<User, int>(...)`. See riverpod-providers and riverpod-family for concepts.
62 -
63 ----
64 -
65 -## Hooks
66 -
67 -**Hooks** come from [flutter_hooks] (separate from Riverpod). They are for **local** widget state (e.g. TextEditingController, AnimationController) and can replace StatefulWidget or builder nesting. Use them only if you want hooks; they are not required for Riverpod. Newcomers should avoid hooks at first.
68 -
69 -### Using hooks and Riverpod together
70 -
71 -You need both **flutter_hooks** and **hooks_riverpod**. Then either:
72 -
73 -**Option 1: HookConsumerWidget** — One base class that supports both hooks and ref:
74 -
75 -```dart
76 -class Example extends HookConsumerWidget {
77 - @override
78 - Widget build(BuildContext context, WidgetRef ref) {
79 - final counter = useState(0);
80 - final value = ref.watch(myProvider);
81 - return Text('Hello $counter $value');
82 - }
83 -}
84 -```
85 -
86 -**Option 2: HookConsumer** — Builder that combines HookBuilder + Consumer (works with flutter_riverpod only if you nest them; hooks_riverpod provides HookConsumer):
87 -
88 -```dart
89 -return HookConsumer(
90 - builder: (context, ref, child) {
91 - final counter = useState(0);
92 - final value = ref.watch(myProvider);
93 - return Text('Hello $counter $value');
94 - },
95 -);
96 -```
97 -
98 -**Option 3:** Nest `Consumer` and `HookBuilder` (no hooks_riverpod needed).
99 -
100 -### Rules of hooks
101 -
102 -- Use hooks only in the **build** method of a widget that extends **HookWidget** (or HookConsumerWidget).
103 -- Do not use hooks conditionally or in loops; call order must be stable.
104 -
105 -See riverpod-consumers for Ref in widgets and the official docs for full codegen/hooks details.
.agent/skills/riverpod-consumers/SKILL.md deleted
-71
@@ -1,71 +0,0 @@
1 ----
2 -name: riverpod-consumers
3 -description: Use Riverpod Consumer, ConsumerWidget, and ConsumerStatefulWidget to read and watch providers in widgets; WidgetRef, builder ref parameter. Use when building widgets that need to access Riverpod providers, ref.watch or ref.read in the UI, or converting StatelessWidget to ConsumerWidget. Prefer this skill when the user asks how to use providers in Flutter widgets or why ConsumerWidget is required.
4 ----
5 -
6 -# Riverpod — Consumers
7 -
8 -## Instructions
9 -
10 -Consumers are widgets that give you a **Ref** (here, **WidgetRef**) so you can read and listen to providers. Without a Consumer, widgets cannot access the provider tree.
11 -
12 -### Consumer (builder)
13 -
14 -Use `Consumer` when you want to keep extending `StatelessWidget` or `StatefulWidget`. The builder callback receives `(context, ref, child)`.
15 -
16 -```dart
17 -class MyWidget extends StatelessWidget {
18 - @override
19 - Widget build(BuildContext context) {
20 - return Consumer(
21 - builder: (context, ref, _) {
22 - final value = ref.watch(myProvider);
23 - return Text(value.toString());
24 - },
25 - );
26 - }
27 -}
28 -```
29 -
30 -### ConsumerWidget
31 -
32 -Subclass `ConsumerWidget` instead of `StatelessWidget`. The `build` method receives `(BuildContext context, WidgetRef ref)`.
33 -
34 -```dart
35 -class MyWidget extends ConsumerWidget {
36 - @override
37 - Widget build(BuildContext context, WidgetRef ref) {
38 - final value = ref.watch(myProvider);
39 - return Text(value.toString());
40 - }
41 -}
42 -```
43 -
44 -### ConsumerStatefulWidget + ConsumerState
45 -
46 -When you need a `State` (e.g. for lifecycle or local state), use `ConsumerStatefulWidget` and `ConsumerState`. The state object has a `ref` property.
47 -
48 -```dart
49 -class MyWidget extends ConsumerStatefulWidget {
50 - @override
51 - ConsumerState<MyWidget> createState() => _MyWidgetState();
52 -}
53 -
54 -class _MyWidgetState extends ConsumerState<MyWidget> {
55 - @override
56 - Widget build(BuildContext context) {
57 - final value = ref.watch(myProvider);
58 - return Text(value.toString());
59 - }
60 -}
61 -```
62 -
63 -### Which to use
64 -
65 -- **Consumer** — Use for everything if you prefer not to change your widget base class; slightly more verbose.
66 -- **ConsumerWidget** — Recommended when you don't need State; one less nesting level.
67 -- **ConsumerStatefulWidget** — Use when you need State (e.g. TabController, animations).
68 -
69 -### Why not StatelessWidget + context.watch?
70 -
71 -Riverpod does not use `BuildContext` to watch providers because that would break **auto-dispose** and other features that rely on knowing when a widget stops listening. Ref-based consumers allow reliable disposal and correct behavior. The hooks_riverpod package also offers HookConsumerWidget etc. for use with flutter_hooks. Enable riverpod_lint for IDE refactors (e.g. "Convert to ConsumerWidget").
.agent/skills/riverpod-containers/SKILL.md deleted
-66
@@ -1,66 +0,0 @@
1 ----
2 -name: riverpod-containers
3 -description: Use ProviderScope in Flutter and ProviderContainer in Dart for Riverpod; where provider state is stored, overrides, observers, testing with ProviderContainer.test. Use when setting up Riverpod in Flutter or pure Dart, understanding where state lives, or writing tests with a fresh container. Use this skill when the user asks about ProviderScope, ProviderContainer, or where Riverpod stores state.
4 ----
5 -
6 -# Riverpod — Containers / Scopes
7 -
8 -## Instructions
9 -
10 -Providers themselves hold **no state**. State is stored in a **ProviderContainer**. In Flutter you use the **ProviderScope** widget, which creates and exposes a container to the widget tree.
11 -
12 -### Flutter: ProviderScope
13 -
14 -Wrap your app at the root so widgets can read providers:
15 -
16 -```dart
17 -void main() {
18 - runApp(
19 - ProviderScope(
20 - child: MyApp(),
21 - ),
22 - );
23 -}
24 -```
25 -
26 -After that, use Consumer / ConsumerWidget / ConsumerStatefulWidget to get a `ref` and call `ref.watch` / `ref.read`. You can also pass `overrides` or `observers` to ProviderScope.
27 -
28 -### Pure Dart: ProviderContainer
29 -
30 -In command-line or server-side Dart, create a container, use it, then dispose it:
31 -
32 -```dart
33 -void main() {
34 - final container = ProviderContainer();
35 - try {
36 - final sub = container.listen(counterProvider, (previous, next) {
37 - print('Counter changed from $previous to $next');
38 - });
39 - print('Counter starts at ${sub.read()}');
40 - } finally {
41 - container.dispose();
42 - }
43 -}
44 -```
45 -
46 -### Why state lives in a container
47 -
48 -- **Separation of concerns** — Only the provider (and ref) can change its state; the UI typically calls notifier methods.
49 -- **Testing** — Each test can create a new container (e.g. `ProviderContainer.test()`) for a fresh state; no shared global state.
50 -- **Configuration** — Overrides and observers are set on the container/scope. See riverpod-overrides and riverpod-observers.
51 -- **Scoping** — The same provider can resolve to different state in different parts of the tree (advanced). See riverpod-scoping.
52 -
53 -### Testing
54 -
55 -Do not use `ProviderContainer()` directly in tests. Use **ProviderContainer.test()** so the container is disposed when the test ends:
56 -
57 -```dart
58 -test('Counter starts at 0 and can be incremented', () {
59 - final container = ProviderContainer.test();
60 - expect(container.read(counterProvider), 0);
61 - container.read(counterProvider.notifier).increment();
62 - expect(container.read(counterProvider), 1);
63 -});
64 -```
65 -
66 -In widget tests, wrap the widget in `ProviderScope` and use `tester.container()` to get the container if needed (see riverpod-testing).
.agent/skills/riverpod-eager-initialization/SKILL.md deleted
-46
@@ -1,46 +0,0 @@
1 ----
2 -name: riverpod-eager-initialization
3 -description: Eagerly initialize Riverpod providers at app startup by watching them in a root Consumer; handle loading/error in the initializer, AsyncValue.requireValue. Use when a provider must be ready before the rest of the app is used. Use this skill when the user asks about eager initialization or preloading providers.
4 ----
5 -
6 -# Riverpod — Eager initialization
7 -
8 -## Instructions
9 -
10 -Providers are **lazy** by default: they initialize on first use. There is no built-in "eager" flag (for tree-shaking). To force early initialization, **watch** the provider at the root of your app so it stays alive and runs immediately.
11 -
12 -### Approach
13 -
14 -Place a **Consumer** (or ConsumerWidget) directly under **ProviderScope** that only watches the providers you want to initialize and returns your real app as **child**:
15 -
16 -```dart
17 -void main() {
18 - runApp(ProviderScope(child: MyApp()));
19 -}
20 -
21 -class MyApp extends StatelessWidget {
22 - @override
23 - Widget build(BuildContext context) {
24 - return const _EagerInitialization(child: MaterialApp());
25 - }
26 -}
27 -
28 -class _EagerInitialization extends ConsumerWidget {
29 - const _EagerInitialization({required this.child});
30 - final Widget child;
31 -
32 - @override
33 - Widget build(BuildContext context, WidgetRef ref) {
34 - ref.watch(myProvider); // Eagerly initialize
35 - return child;
36 - }
37 -}
38 -```
39 -
40 -Only the initializer widget rebuilds when the provider changes; **child** is unchanged so Flutter does not rebuild the rest of the tree unless something else is listening.
41 -
42 -### Async: loading and error
43 -
44 -If the provider is async, handle loading/error in the initializer (e.g. show CircularProgressIndicator or error until ready, then return child). Other widgets can use **AsyncValue.requireValue** to read the data without pattern matching; if they run before the value is ready, it throws with a clear message.
45 -
46 -Put the initializer in a shared widget (e.g. MyApp) so tests can reuse the same setup by using that widget.
.agent/skills/riverpod-family/SKILL.md deleted
-66
@@ -1,66 +0,0 @@
1 ----
2 -name: riverpod-family
3 -description: Use Riverpod family providers to pass parameters and cache per parameter; FutureProvider.family, NotifierProvider.family, autoDispose with family, overriding in tests. Use when fetching data by ID, pagination, or any provider that depends on a parameter. Use this skill when the user asks about family, provider parameters, or caching by ID.
4 ----
5 -
6 -# Riverpod — Family
7 -
8 -## Instructions
9 -
10 -**Family** lets a single provider have multiple independent states, one per parameter combination (like a Map from parameter to state). Use it for API calls that depend on an ID, query, or page number.
11 -
12 -### Creating a family (functional)
13 -
14 -Add `.family` and an extra type parameter for the argument. The provider function receives `(ref, param)`:
15 -
16 -```dart
17 -final userProvider = FutureProvider.autoDispose.family<User, String>((ref, id) async {
18 - final dio = Dio();
19 - final response = await dio.get('https://api.example.com/users/$id');
20 - return User.fromJson(response.data);
21 -});
22 -```
23 -
24 -With code generation, add parameters to the function; the generated provider accepts arguments: `userProvider(id)`.
25 -
26 -### Creating a family (Notifier)
27 -
28 -Use `NotifierProvider.family` / `AsyncNotifierProvider.family` (and `.autoDispose.family`). The Notifier must have a constructor that stores the parameter:
29 -
30 -```dart
31 -final userProvider = AsyncNotifierProvider.autoDispose.family<UserNotifier, User, String>(
32 - UserNotifier.new,
33 -);
34 -
35 -class UserNotifier extends AsyncNotifier<User> {
36 - UserNotifier(this.id);
37 - final String id;
38 -
39 - @override
40 - Future<User> build() async {
41 - final dio = Dio();
42 - final response = await dio.get('https://api.example.com/users/$id');
43 - return User.fromJson(response.data);
44 - }
45 -}
46 -```
47 -
48 -### Using a family
49 -
50 -Pass the parameter when watching or reading:
51 -
52 -```dart
53 -final user = ref.watch(userProvider('123'));
54 -final other = ref.watch(userProvider('456')); // independent state
55 -```
56 -
57 -Parameters must have consistent **==** and **hashCode**. Do not use mutable or list/map literals as parameters (e.g. `ref.watch(myProvider([1,2,3]))` is wrong because `[1,2,3] != [1,2,3]`). Prefer primitives or custom classes with ==/hashCode. Enable riverpod_lint provider_parameters rule to catch mistakes.
58 -
59 -### Auto-dispose with family
60 -
61 -Enable auto-dispose when using family so that when the parameter goes out of use (e.g. user navigates away), that parameter's state can be disposed and you avoid unbounded cache growth.
62 -
63 -### Overriding in tests
64 -
65 -- Override a single parameter: pass the same parameter to the override.
66 -- Override all parameters: override with a provider that ignores the parameter or returns a fixed value. See riverpod-overrides and the docs for exact syntax.
.agent/skills/riverpod-faq-and-practices/SKILL.md deleted
-58
@@ -1,58 +0,0 @@
1 ----
2 -name: riverpod-faq-and-practices
3 -description: Answers Riverpod FAQ (ref.refresh vs invalidate, ConsumerWidget vs StatelessWidget, Ref vs WidgetRef, reset all providers, ref after unmount) and do/don't best practices (avoid init in widgets, avoid ephemeral state in providers, avoid side effects in provider init, static providers, riverpod_lint). Use when the user asks Riverpod FAQ, best practices, or do/don't guidelines.
4 ----
5 -
6 -# Riverpod — FAQ and best practices
7 -
8 -## FAQ
9 -
10 -### ref.refresh vs ref.invalidate
11 -
12 -**ref.refresh** = **ref.invalidate** + **ref.read**: it invalidates the provider and returns the new value. Use **invalidate** when you don't need the new value (e.g. "recompute when the user pulls to refresh"). Use **refresh** when you need the result right away. After invalidate alone, recomputation can happen at the next frame or when the provider is next read; refresh forces immediate recomputation by reading.
13 -
14 -### Why no shared interface between Ref and WidgetRef?
15 -
16 -Ref (in providers) and WidgetRef (in widgets) are kept separate on purpose so you don't write code that conditionally depends on both; they have subtle differences and mixing would be error-prone. Prefer **Ref**: put logic in a Notifier and call **ref.read(notifierProvider.notifier).yourMethod()** from the UI; the method uses the Notifier's Ref.
17 -
18 -### Why ConsumerWidget instead of StatelessWidget?
19 -
20 -InheritedWidget (and thus BuildContext) cannot support "on change" listeners like **ref.listen**, cannot know when widgets stop listening (needed for auto-dispose and family), and has lifecycle quirks (e.g. with GlobalKeys). Riverpod needs a Ref that isn't tied to BuildContext for these features. Hence ConsumerWidget (and Consumer) provide a Ref.
21 -
22 -### Why doesn't hooks_riverpod export flutter_hooks?
23 -
24 -So each package can be versioned independently; a breaking change in one doesn't force the other to break.
25 -
26 -### Reset all providers at once?
27 -
28 -There is no API to reset all providers; it's considered an anti-pattern. For "logout and clear state", have providers that depend on the current user **ref.watch** a user provider; when the user logs out, that provider changes and dependents recompute or clear. Only user-dependent state resets; the rest stays.
29 -
30 -### "Using ref when a widget is about to or has been unmounted is unsafe"
31 -
32 -This (or "No ProviderScope found") happens when **ref** is used after an **await** in a widget that may have been disposed. After any **await**, check **if (!context.mounted) return;** before using **ref** (same pattern as with BuildContext).
33 -
34 ----
35 -
36 -## Do / Don't
37 -
38 -### AVOID initializing providers in a widget
39 -
40 -Providers should initialize themselves. Don't call something like **ref.read(provider).init()** from **initState**. If initialization depends on user action (e.g. navigation), trigger it from the action (e.g. **onPressed** before **Navigator.push**).
41 -
42 -### AVOID using providers for ephemeral state
43 -
44 -Use providers for **shared business state**, not for: selected tab/item, form state (which should reset on leave/back), animations, or controller-like state (e.g. TextEditingController). For local widget state use **flutter_hooks** or local state. Storing "selected item" in a global provider can break back navigation (e.g. back from /books/21 should show /books/42, but the provider still holds 21).
45 -
46 -### DON'T perform side effects during provider initialization
47 -
48 -Providers should represent "read" operations. Don't use a provider's build to perform "write" operations (e.g. submitting a form). That can lead to skipped or duplicated side effects. For loading/error of a side effect use **mutations** (see riverpod-mutations).
49 -
50 -### PREFER statically known providers with ref.watch/read/listen
51 -
52 -Use **ref.watch(provider)** where **provider** is a top-level final (or otherwise statically known). Avoid passing a provider as a parameter and then watching it so that static analysis and riverpod_lint can work.
53 -
54 -### AVOID dynamically creating providers
55 -
56 -Define providers as **top-level final** variables. Don't create them inside classes or as instance fields; that can cause memory leaks and unsupported behavior. Static final in a class is allowed but not supported by code generation.
57 -
58 -Enable **riverpod_lint** (see riverpod-getting-started) to enforce many of these practices.
.agent/skills/riverpod-from-provider/SKILL.md deleted
-97
@@ -1,97 +0,0 @@
1 ----
2 -name: riverpod-from-provider
3 -description: Migrate from package:provider to Riverpod; ChangeNotifierProvider, ProxyProvider to ref.watch, context.watch to ref.watch, ConsumerWidget, incremental migration, family and autoDispose. Use when the user is migrating from Provider to Riverpod, or asks about Provider vs Riverpod, or how to replace ProxyProvider/ChangeNotifierProvider.
4 ----
5 -
6 -# Riverpod — Migrating from Provider
7 -
8 -## Motivation
9 -
10 -Riverpod was created as a successor to Provider, addressing InheritedWidget limitations:
11 -
12 -- **Same type:** Provider can't have two `Provider<Item>` in the tree (only the nearest is found). Riverpod has no such limit; providers are identified by variable, not type.
13 -- **Combining providers:** ProxyProvider is tedious and error-prone. In Riverpod, use **ref.watch** inside a provider to depend on others; composition is straightforward.
14 -- **AsyncValue:** Riverpod can expose previous data while loading (e.g. show old list + loading indicator). Provider doesn't offer this cleanly.
15 -- **Safety:** Provider can throw `ProviderNotFoundException` at runtime. Riverpod avoids this by design.
16 -- **Disposal:** Provider can't react when consumers stop listening; scoping is tricky. Riverpod offers **autoDispose** and **ref.keepAlive** for clear lifecycle and caching.
17 -- **Parameters:** Riverpod's **.family** gives type-safe, parameterized providers with per-parameter state; with autoDispose, state is disposed when unused. Equivalent in Provider is impractical.
18 -- **Testing:** With Provider you must re-define providers per test. With Riverpod, override with **overrides** to mock.
19 -- **Side effects:** Riverpod offers **ref.listen** for reacting to changes (e.g. navigation, snackbars). Provider has no built-in equivalent.
20 -
21 -The main API change: use **ConsumerWidget** (and **WidgetRef**) instead of StatelessWidget, and **ref.watch** / **ref.read** instead of **context.watch** / **context.read**.
22 -
23 ----
24 -
25 -## Quickstart
26 -
27 -- Read the Riverpod getting started guide (riverpod-getting-started) and try a small example.
28 -- Migrate **incrementally**. You can run Provider and Riverpod side by side (use import aliases if needed).
29 -
30 -### Start with ChangeNotifierProvider
31 -
32 -Keep existing **ChangeNotifier** classes and wrap them in Riverpod's **ChangeNotifierProvider**:
33 -
34 -```dart
35 -final myNotifierProvider = ChangeNotifierProvider<MyNotifier>((ref) => MyNotifier());
36 -```
37 -
38 -Use **ProviderScope** at the root. Replace **context.watch** with **ref.watch** where this provider is used (e.g. in a ConsumerWidget). No need to convert every ChangeNotifier to a Notifier immediately.
39 -
40 -### Start with leaves
41 -
42 -Migrate providers that have no dependencies first (the "leaves"), then those that depend on them. Avoid migrating ProxyProviders until their dependencies are migrated.
43 -
44 -### One provider at a time
45 -
46 -Migrate and test one provider at a time. Full migration of a ChangeNotifier means: (1) convert to **Notifier** + **NotifierProvider**, (2) replace every **context.watch** for it with **ref.watch**.
47 -
48 -### ProxyProvider → ref.watch
49 -
50 -In Riverpod, combining providers is done with **ref.watch** inside another provider:
51 -
52 -```dart
53 -final labelProvider = Provider<String>((ref) {
54 - final userIdNotifier = ref.watch(userIdNotifierProvider);
55 - return 'The user ID is ${userIdNotifier.userId}';
56 -});
57 -```
58 -
59 -For stateful combined objects (like ChangeNotifierProxyProvider), use **ref.listen** in the provider to react to another provider and update your notifier.
60 -
61 -### Eager initialization
62 -
63 -Riverpod providers are lazy. To warm data at startup, watch the provider at the root (e.g. in a Consumer under ProviderScope that returns your app as child). See riverpod-eager-initialization.
64 -
65 -### Code generation
66 -
67 -Code gen doesn't generate ChangeNotifierProvider. You can use a small extension (listenAndDisposeChangeNotifier) to expose ChangeNotifier with @riverpod during migration; once you switch to Notifier, remove the extension. See the official quickstart for the snippet.
68 -
69 ----
70 -
71 -## Provider vs Riverpod
72 -
73 -### Defining providers
74 -
75 -- **Provider:** Providers are widgets (e.g. inside MultiProvider).
76 -- **Riverpod:** Providers are top-level **final** variables. No widget tree for definitions. Add **ProviderScope** at the root of the app.
77 -
78 -### Reading
79 -
80 -- **Provider:** `context.watch<T>()`, `context.read<T>()`, `context.select<T,R>(...)`.
81 -- **Riverpod:** Use **ConsumerWidget** (or Consumer) to get **WidgetRef ref**; then **ref.watch(provider)**, **ref.read(provider)**, **ref.watch(provider.select(...))**.
82 -- Use **watch** in build, **read** in event handlers. Same mental model as Provider.
83 -
84 -### Consumer
85 -
86 -Riverpod has **Consumer** with `(context, ref, child)`. No need for Consumer2, Consumer3, etc.: just multiple **ref.watch** calls in one builder.
87 -
88 -### Scoping vs family + autoDispose
89 -
90 -Provider uses scoping to destroy state or have per-page state. In Riverpod:
91 -
92 -- **autoDispose** destroys state when there are no listeners (ref.onCancel / ref.onDispose).
93 -- **.family** gives parameterized providers (one state per parameter). Use with autoDispose to avoid unbounded cache.
94 -
95 -So: use **.family** for "state per X" and **.autoDispose** for "destroy when unused" instead of scoping.
96 -
97 -See riverpod-getting-started, riverpod-providers, riverpod-family, and riverpod-auto-dispose for details.
.agent/skills/riverpod-getting-started/SKILL.md deleted
-139
@@ -1,139 +0,0 @@
1 ----
2 -name: riverpod-getting-started
3 -description: Install Riverpod (flutter_riverpod or riverpod), wrap the app in ProviderScope, run a hello-world provider, and optionally enable riverpod_lint and code generation. Use when starting a Flutter or Dart project with Riverpod, adding the Riverpod dependency, or setting up ProviderScope and a first provider. For version highlights see the official Riverpod docs.
4 ----
5 -
6 -# Riverpod — Getting Started
7 -
8 -## Instructions
9 -
10 -### Installing the package
11 -
12 -Riverpod is available as a main package (Flutter: `flutter_riverpod`; Dart-only: `riverpod`). Optional packages add code generation and hooks.
13 -
14 -**Flutter:**
15 -
16 -```bash
17 -flutter pub add flutter_riverpod
18 -```
19 -
20 -With code generation:
21 -
22 -```bash
23 -flutter pub add flutter_riverpod riverpod_annotation
24 -flutter pub add dev:riverpod_generator build_runner
25 -```
26 -
27 -**Dart only:**
28 -
29 -```bash
30 -dart pub add riverpod
31 -```
32 -
33 -With code generation:
34 -
35 -```bash
36 -dart pub add riverpod riverpod_annotation
37 -dart pub add dev:riverpod_generator build_runner
38 -```
39 -
40 -**Manual `pubspec.yaml` (Flutter):**
41 -
42 -```yaml
43 -dependencies:
44 - flutter:
45 - sdk: flutter
46 - flutter_riverpod: ^2.0.0 # use latest from pub.dev
47 -
48 -dev_dependencies:
49 - build_runner:
50 - riverpod_generator: ^2.0.0 # if using code generation
51 -```
52 -
53 -Then run `flutter pub get` (or `dart pub get` for Dart-only).
54 -
55 -If using code generation, run:
56 -
57 -```sh
58 -dart run build_runner watch -d
59 -```
60 -
61 -**Note:** Some Riverpod packages may require Flutter's beta channel for compatibility with latest `json_serializable`. If `pub get` fails, try `flutter channel beta` or use Riverpod `<=3.1.0`.
62 -
63 -### Wrap the app in ProviderScope
64 -
65 -Widgets need a `ProviderScope` (Flutter) or a `ProviderContainer` (Dart) to read providers.
66 -
67 -**Flutter — ProviderScope:**
68 -
69 -```dart
70 -import 'package:flutter/material.dart';
71 -import 'package:flutter_riverpod/flutter_riverpod.dart';
72 -
73 -void main() {
74 - runApp(
75 - ProviderScope(
76 - child: MyApp(),
77 - ),
78 - );
79 -}
80 -```
81 -
82 -**Dart only — ProviderContainer:**
83 -
84 -```dart
85 -final container = ProviderContainer();
86 -final value = container.read(helloWorldProvider);
87 -print(value);
88 -// Don't forget to container.dispose() when done
89 -```
90 -
91 -### Hello world (Flutter with code generation)
92 -
93 -```dart
94 -import 'package:flutter/material.dart';
95 -import 'package:flutter_riverpod/flutter_riverpod.dart';
96 -import 'package:riverpod_annotation/riverpod_annotation.dart';
97 -
98 -part 'main.g.dart';
99 -
100 -@riverpod
101 -String helloWorld(Ref ref) {
102 - return 'Hello world';
103 -}
104 -
105 -void main() {
106 - runApp(ProviderScope(child: MyApp()));
107 -}
108 -
109 -class MyApp extends ConsumerWidget {
110 - @override
111 - Widget build(BuildContext context, WidgetRef ref) {
112 - final String value = ref.watch(helloWorldProvider);
113 - return MaterialApp(
114 - home: Scaffold(
115 - appBar: AppBar(title: const Text('Example')),
116 - body: Center(child: Text(value)),
117 - ),
118 - );
119 - }
120 -}
121 -```
122 -
123 -Run `dart run build_runner build` (or `watch`) to generate `main.g.dart`. Without code generation, use a manual provider (e.g. `final helloWorldProvider = Provider<String>((ref) => 'Hello world');`) and the same `ProviderScope` + `ConsumerWidget` pattern.
124 -
125 -### Enabling riverpod_lint
126 -
127 -Add the optional linter via `analysis_options.yaml`:
128 -
129 -```yaml
130 -plugins:
131 - riverpod_lint: ^2.0.0 # use latest from https://pub.dev/packages/riverpod_lint
132 -```
133 -
134 -This provides lint rules and refactorings for Riverpod. See the riverpod_lint package page for the full list.
135 -
136 -### Going further
137 -
138 -- **Code generation and hooks:** See the riverpod-codegen-and-hooks skill (or docs: About code generation, About hooks).
139 -- **VS Code / Android Studio:** Consider Flutter Riverpod Snippets extensions for faster boilerplate.
.agent/skills/riverpod-migration/SKILL.md deleted
-29
@@ -1,29 +0,0 @@
1 ----
2 -name: riverpod-migration
3 -description: Migrate Riverpod from StateNotifier to Notifier/AsyncNotifier, from ChangeNotifier to AsyncNotifier, or upgrade from 0.13/0.14/1.0; ref.onDispose, family, lifecycle, riverpod migrate CLI. Use when the user asks about migrating from StateNotifier, from ChangeNotifier, upgrading Riverpod 0.13 to 0.14, 0.14 to 1.0, or Riverpod migration guides.
4 ----
5 -
6 -# Riverpod — Migration guides
7 -
8 -## Instructions
9 -
10 -This skill points to detailed migration guides for different scenarios. Use the reference file that matches your case.
11 -
12 -### When to use which guide
13 -
14 -| Scenario | Reference |
15 -|----------|-----------|
16 -| **From StateNotifier** to Notifier / AsyncNotifier | [migration_from_state_notifier.md](reference/migration_from_state_notifier.md) |
17 -| **From ChangeNotifier** to AsyncNotifier | [migration_from_change_notifier.md](reference/migration_from_change_notifier.md) |
18 -| **Upgrade 0.13.x → 0.14.x** (StateNotifierProvider syntax, watch(provider) vs provider.state) | [migration_0_13_0_14.md](reference/migration_0_13_0_14.md) |
19 -| **Upgrade 0.14.x → 1.0** (ScopedReader → WidgetRef, useProvider → ref.watch, StateProvider) | [migration_0_14_1_0.md](reference/migration_0_14_1_0.md) |
20 -
21 -For **Riverpod 2.0 → 3.0** see the **riverpod-3-0-migration** skill.
22 -
23 -### Common themes
24 -
25 -- **StateNotifier → Notifier/AsyncNotifier:** Put init logic in `build`; use `ref.onDispose` instead of overloading `dispose`; no `mounted`—use cancellation (e.g. Completer or HTTP cancel token). Consumers stay the same (ref.watch, methods on notifier).
26 -- **ChangeNotifier → AsyncNotifier:** Replace `isLoading`/`hasError`/manual try-catch with `AsyncValue`; single `state`; mutations by reassigning `state`.
27 -- **CLI:** For 0.14 and 1.0 upgrades you can run `dart pub global activate riverpod_cli` then `riverpod migrate` in the project (do not upgrade Riverpod manually first; the tool will suggest version and changes).
28 -
29 -Open the relevant reference file for step-by-step instructions and code examples.
.agent/skills/riverpod-migration/reference/migration_0_13_0_14.md deleted
-23
@@ -1,23 +0,0 @@
1 -# Migration: 0.13.x → 0.14.x
2 -
3 -- In **0.14.0** the way **StateNotifierProvider** and state/notifier reading work changed.
4 -
5 -## Changes
6 -
7 -1. **StateNotifierProvider** gets an extra type parameter: the **state** type.
8 - - Before: `StateNotifierProvider<MyStateNotifier>(...)`
9 - - After: `StateNotifierProvider<MyStateNotifier, MyModel>(...)`
10 -
11 -2. **Reading the notifier**
12 - - Before: `watch(provider)` returned the StateNotifier.
13 - - After: use **provider.notifier**: `watch(provider.notifier)` to get the StateNotifier.
14 -
15 -3. **Reading the state**
16 - - Before: `watch(provider.state)` for the state.
17 - - After: `watch(provider)` returns the state directly.
18 -
19 -## CLI migration
20 -
21 -- Install: `dart pub global activate riverpod_cli`
22 -- In the project (do **not** upgrade Riverpod first): run **riverpod migrate**.
23 -- The tool will suggest edits (e.g. `watch(provider.state)` → `watch(provider)`). Accept with `y` or reject with `n`.
.agent/skills/riverpod-migration/reference/migration_0_14_1_0.md deleted
-30
@@ -1,30 +0,0 @@
1 -# Migration: 0.14.x → 1.0
2 -
3 -- **1.0** unifies the API for reading providers and changes some types.
4 -
5 -## CLI migration
6 -
7 -- Install: `dart pub global activate riverpod_cli`
8 -- **Do not** upgrade to 1.0 before running the tool; stay on 0.14.x.
9 -- Run **riverpod migrate** in the project; it will suggest changes and can upgrade the dependency.
10 -
11 -## Syntax unification
12 -
13 -- **Single syntax**: **ref.watch(provider)** (and ref.read). **useProvider**, **watch(provider)** without ref, and **context.read** are removed.
14 -
15 -- **ConsumerWidget / Consumer**
16 - - Before: `build(BuildContext context, ScopedReader watch)` and `watch(provider)`.
17 - - After: `build(BuildContext context, WidgetRef ref)` and **ref.watch(provider)**.
18 - - Consumer: `builder: (context, watch, child)` → `builder: (context, ref, child)` and use **ref.watch(provider)**.
19 -
20 -- **HookWidget**
21 - - **useProvider(provider)** is removed. Use **HookConsumerWidget** and **ref.watch(provider)** in build.
22 -
23 -- **context.read**
24 - - Use **ConsumerWidget** (or Consumer) and **ref.read(provider)** instead of **context.read**.
25 -
26 -## StateProvider
27 -
28 -- **ref.watch(StateProvider)** used to return a **StateController**; in 1.0 it returns the **state** value only.
29 - - If you only displayed the value: change to **ref.watch(provider)** and use the value directly.
30 - - If you need the controller: use **ref.watch(provider.state)** to keep the old behavior (StateController).
.agent/skills/riverpod-migration/reference/migration_from_change_notifier.md deleted
-36
@@ -1,36 +0,0 @@
1 -# Migration: From ChangeNotifier to AsyncNotifier
2 -
3 -- For apps already on Riverpod using **ChangeNotifierProvider**, this guide moves to **AsyncNotifier** (and **Notifier** where state is sync).
4 -
5 -## Why migrate
6 -
7 -- ChangeNotifier leads to **isLoading** / **hasError** flags and lots of **try/catch/finally** and **notifyListeners()**.
8 -- AsyncNotifier uses a single **state** and **AsyncValue**; Riverpod handles loading/error; less boilerplate and fewer inconsistent states.
9 -
10 -## Steps
11 -
12 -1. **Choose the notifier type**
13 - - Side effects (methods that change state)? → Class-based (Notifier or AsyncNotifier).
14 - - Async load (e.g. network)? → **AsyncNotifier<T>**.
15 - - Parameters? → Add them to the notifier (e.g. constructor + field) and use family/provider that passes them.
16 -
17 -2. **Declaration**
18 - - Replace **ChangeNotifierProvider** with **AsyncNotifierProvider** (or NotifierProvider if sync).
19 - - State type: e.g. **AsyncNotifier<List<Todo>>**; no separate **todos** / **isLoading** / **hasError**—just **state** and AsyncValue.
20 -
21 -3. **Initialization**
22 - - Move init from a custom method (e.g. **init**) into **build**.
23 - - **build** returns **Future<List<Todo>>**; Riverpod exposes **AsyncValue<List<Todo>>** to the UI. No manual try/catch in build.
24 -
25 -4. **Mutations**
26 - - Replace flag updates and notifyListeners with **state = newValue** (and **state = AsyncValue.data(...)** or **AsyncValue.error(...)** if you construct explicitly). Use **ref** for dependencies (ref.watch, ref.read) inside methods.
27 -
28 -5. **Consumers**
29 - - **ref.watch(provider)** now gets **AsyncValue<T>**; handle loading/error/data in the UI. Use **ref.read(provider.notifier)** to call methods.
30 -
31 -## Summary
32 -
33 -- Init in **build**; no **todos**/isLoading/hasError.
34 -- No try-catch-finally in build; return the Future.
35 -- Side effects: reassign **state**; use **ref** for other providers.
36 -- See riverpod-providers and riverpod-refs for Notifier/AsyncNotifier and Ref APIs.
.agent/skills/riverpod-migration/reference/migration_from_state_notifier.md deleted
-42
@@ -1,42 +0,0 @@
1 -# Migration: From StateNotifier to Notifier / AsyncNotifier
2 -
3 -- **StateNotifier** is deprecated in favor of **Notifier** and **AsyncNotifier** (Riverpod 2.0+).
4 -
5 -## Main differences
6 -
7 -- Dependencies: in StateNotifier they were in the provider; in Notifier they go in **build** via **ref.watch**.
8 -- Initialization: StateNotifier split between provider and constructor; Notifier uses a single **build** method; no logic in the constructor.
9 -- Lifecycle: StateNotifier had **dispose** on the class. Notifier/AsyncNotifier use **ref.onDispose** (and ref.onCancel) in build, like any other provider. Only internal state is disposed on rebuild; the notifier type itself is not disposed the same way.
10 -- **mounted**: Notifier/AsyncNotifier do not have **mounted**. Use cancellation (Completer, Dio CancelToken, etc.) instead of checking mounted after async work.
11 -
12 -## Sync: StateNotifier → Notifier
13 -
14 -- Replace **StateNotifierProvider** with **NotifierProvider**.
15 -- Move reactive dependencies from the provider into **build** with **ref.watch**.
16 -- Put all init logic in **build**; leave constructor minimal.
17 -- Use **ref.onDispose** in build for cleanup (no override of dispose).
18 -
19 -## Async: StateNotifier → AsyncNotifier
20 -
21 -- Replace **StateNotifierProvider** with **AsyncNotifierProvider**.
22 -- Move async init into **build** returning **Future<T>**; remove AsyncValue.guard / try-catch in build.
23 -- Use **future** and **update** on AsyncNotifier for simpler async flows.
24 -- Migrating from **StateNotifier<AsyncValue<T>>** to **AsyncNotifier<T>**: put init in build, remove manual try/catch and AsyncValue handling in build.
25 -
26 -## Family and autoDispose
27 -
28 -- With Notifier/AsyncNotifier, family parameters are passed into the class (e.g. constructor + field) and are available in build; no separate “family” type.
29 -- AutoDispose is expressed the same as other providers (e.g. ref.onDispose in build).
30 -
31 -## Consumers and mutations
32 -
33 -- **Consumers do not change**: ref.watch(provider), ref.read(provider.notifier), and calling notifier methods stay the same.
34 -- **ref.listen** replaces StateNotifier’s **.addListener** / **.stream**: use **ref.listen(provider, (prev, next) { ... })**.
35 -
36 -## Tests
37 -
38 -- **.debugState** is gone. Use **ref.read(provider)** or **ref.read(provider.notifier)** to get the notifier/state in tests; do not instantiate Notifier/AsyncNotifier by hand (ref and family args would be unset).
39 -
40 -## StateProvider
41 -
42 -- **StateProvider** is deprecated with StateNotifierProvider. Migrate to **Notifier**: one Notifier with **build** returning the initial value and methods that set **state**.
.agent/skills/riverpod-mutations/SKILL.md deleted
-80
@@ -1,80 +0,0 @@
1 ----
2 -name: riverpod-mutations
3 -description: Use Riverpod mutations for UI-driven async operations like form submit; Mutation.run, MutationIdle/Pending/Success/Error, Mutation.reset, keyed mutations. Use when showing loading/error/success for a single action (e.g. submit button) without polluting provider state. Use this skill when the user asks about mutations, loading state for actions, or form submission with Riverpod.
4 ----
5 -
6 -# Riverpod — Mutations (experimental)
7 -
8 -## Instructions
9 -
10 -**Mutations** represent a single async operation the UI can react to (e.g. "add todo" in progress, succeeded, or failed). They keep loading/error/success out of your main provider state. The API is experimental and may change.
11 -
12 -### Defining a mutation
13 -
14 -Create a `Mutation<T>` instance (T is the result type, optional):
15 -
16 -```dart
17 -final addTodo = Mutation<Todo>();
18 -```
19 -
20 -Typically store it as a global or `static final` on a Notifier.
21 -
22 -### Listening
23 -
24 -Use ref.watch in a Consumer (or inside a provider) to drive the UI:
25 -
26 -```dart
27 -final addTodoState = ref.watch(addTodo);
28 -
29 -// In build:
30 -backgroundColor: switch (addTodoState) {
31 - MutationError() => const WidgetStatePropertyAll(Colors.red),
32 - _ => null,
33 -},
34 -if (addTodoState is MutationPending) ...[
35 - const SizedBox(width: 8),
36 - const CircularProgressIndicator(),
37 -],
38 -```
39 -
40 -### States
41 -
42 -- **MutationIdle** — Not started or reset.
43 -- **MutationPending** — In progress.
44 -- **MutationSuccess** — Succeeded; result available.
45 -- **MutationError** — Failed; error available.
46 -
47 -Use a `switch` on the state to handle each case.
48 -
49 -### Triggering
50 -
51 -Call **Mutation.run(ref, callback)**. The callback receives a transaction object (e.g. `tsx`) to access providers and must return a value of type T:
52 -
53 -```dart
54 -addTodo.run(ref, (tsx) async {
55 - final todoNotifier = tsx.get(todoNotifierProvider.notifier);
56 - final createdTodo = await todoNotifier.addTodo('Eat a cookie');
57 - return createdTodo;
58 -});
59 -```
60 -
61 -Use `tsx.get(provider)` to keep providers alive for the duration of the mutation.
62 -
63 -### Keyed mutations
64 -
65 -Pass a key to have multiple instances (e.g. one mutation per list item):
66 -
67 -```dart
68 -ref.watch(deleteItemMutation(itemId));
69 -deleteItemMutation(itemId).run(ref, (tsx) async { ... });
70 -```
71 -
72 -### Resetting
73 -
74 -Mutations reset to Idle when they complete or when all listeners are removed. To reset manually:
75 -
76 -```dart
77 -addTodo.reset(ref);
78 -```
79 -
80 -See the official Riverpod docs for the latest mutation API and generics.
.agent/skills/riverpod-observers/SKILL.md deleted
-52
@@ -1,52 +0,0 @@
1 ----
2 -name: riverpod-observers
3 -description: Use ProviderObserver to log or debug Riverpod provider lifecycle; didUpdateProvider, ProviderScope observers, naming providers. Use when adding logging, analytics, or debugging for provider state changes. Use this skill when the user asks about ProviderObserver, logging Riverpod, or debugging provider updates.
4 ----
5 -
6 -# Riverpod — ProviderObservers
7 -
8 -## Instructions
9 -
10 -A **ProviderObserver** receives lifecycle events for providers (e.g. when a provider's value changes). Use it for logging, analytics, or debugging.
11 -
12 -### Implementing an observer
13 -
14 -Extend **ProviderObserver** and override the methods you need (e.g. **didUpdateProvider**). Pass instances to **ProviderScope** or **ProviderContainer** via the `observers` parameter.
15 -
16 -### Example: logger
17 -
18 -```dart
19 -final class Logger extends ProviderObserver {
20 - @override
21 - void didUpdateProvider(
22 - ProviderObserverContext context,
23 - Object? previousValue,
24 - Object? newValue,
25 - ) {
26 - print('{"provider": "${context.provider}", "newValue": "$newValue"}');
27 - }
28 -}
29 -
30 -void main() {
31 - runApp(
32 - ProviderScope(
33 - observers: [Logger()],
34 - child: const MyApp(),
35 - ),
36 - );
37 -}
38 -```
39 -
40 -### Naming providers
41 -
42 -For clearer logs, give providers a **name**:
43 -
44 -```dart
45 -final myProvider = Provider<int>((ref) => 0, name: 'MyProvider');
46 -```
47 -
48 -With code generation, a name is usually assigned automatically.
49 -
50 -### Note on mutations
51 -
52 -If state is mutated in place (e.g. a List with ref.notifyListeners), `previousValue` and `newValue` in didUpdateProvider may be the same reference. For distinct values, clone before mutating.
.agent/skills/riverpod-offline/SKILL.md deleted
-111
@@ -1,111 +0,0 @@
1 ----
2 -name: riverpod-offline
3 -description: Persist Riverpod notifier state offline with Storage and persist(); riverpod_sqflite, JsonPersist, key, destroyKey, cache duration, testing with in-memory storage. Use when saving state across app restarts or offline. Use this skill when the user asks about offline persistence, persisting state, or Riverpod storage.
4 ----
5 -
6 -# Riverpod — Offline persistence (experimental)
7 -
8 -## Instructions
9 -
10 -**Offline persistence** stores provider state on device so it survives restarts and works offline. Riverpod is storage-agnostic; packages like **riverpod_sqflite** provide a **Storage** implementation. Only **Notifier**-based providers can be persisted. The feature is experimental.
11 -
12 -### Creating a Storage
13 -
14 -Install a package (e.g. riverpod_sqflite + sqflite) and create a Storage. With SQFlite:
15 -
16 -```dart
17 -final storageProvider = FutureProvider<Storage<String, String>>((ref) async {
18 - return JsonSqFliteStorage.open(
19 - join(await getDatabasesPath(), 'riverpod.db'),
20 - );
21 -});
22 -```
23 -
24 -### Persisting a notifier
25 -
26 -Inside the notifier's `build`, call **persist** with: the Storage (e.g. `ref.watch(storageProvider.future)`), a unique **key**, and **encode**/ **decode** for your state. Do not await persist; Riverpod handles it.
27 -
28 -```dart
29 -class TodoList extends AsyncNotifier<List<Todo>> {
30 - @override
31 - Future<List<Todo>> build() async {
32 - persist(
33 - ref.watch(storageProvider.future),
34 - key: 'todo_list',
35 - encode: (todos) => todos.map((todo) => {'task': todo.task}).toList(),
36 - decode: (json) => (json as List).map((todo) => Todo(task: todo['task'] as String)).toList(),
37 - );
38 - return fetchTodosFromServer();
39 - }
40 -}
41 -```
42 -
43 -### Keys
44 -
45 -- **Unique** across all persisted providers (same key = same row, risk of corruption).
46 -- **Stable** across restarts (changing the key loses restored state).
47 -- For **family** providers, include the parameter in the key.
48 -
49 -### JsonPersist (code generation)
50 -
51 -With riverpod_sqflite and codegen, use **@JsonPersist()** so key/encode/decode are generated:
52 -
53 -```dart
54 -@riverpod
55 -@JsonPersist()
56 -class TodoList extends _$TodoList {
57 - @override
58 - Future<List<Todo>> build() async {
59 - persist(ref.watch(storageProvider.future));
60 - return fetchTodosFromServer();
61 - }
62 -}
63 -```
64 -
65 -### Cache duration
66 -
67 -By default state is cached for a short time (e.g. 2 days). For long-lived data (e.g. user preferences), set **StorageOptions**:
68 -
69 -```dart
70 -persist(
71 - ref.watch(storageProvider.future),
72 - options: const StorageOptions(cacheTime: StorageCacheTime.unsafe_forever),
73 - // ...
74 -);
75 -```
76 -
77 -If using forever, plan to delete or migrate data when the app changes; Riverpod does not do migrations.
78 -
79 -### Destroy key (simple migration)
80 -
81 -When the data shape changes, use **destroyKey** so old data is discarded:
82 -
83 -```dart
84 -options: const StorageOptions(destroyKey: '1.0'),
85 -```
86 -
87 -Bump the string in new releases; old persisted state is then ignored and the provider starts fresh.
88 -
89 -### Waiting for decode
90 -
91 -To initialize from persisted state instead of a network call, await the persist future:
92 -
93 -```dart
94 -await persist(ref.watch(storageProvider.future), key: 'todo_list', ...).future;
95 -return state.value ?? <Todo>[];
96 -```
97 -
98 -### Testing
99 -
100 -Override the storage provider with **Storage.inMemory()** so tests don't need a real database:
101 -
102 -```dart
103 -ProviderScope(
104 - overrides: [
105 - storageProvider.overrideWith((ref) => Storage<String, String>.inMemory()),
106 - ],
107 - child: const MyApp(),
108 -)
109 -```
110 -
111 -For advanced migrations or custom storage strategies, you may still need to work with the database directly.
.agent/skills/riverpod-overrides/SKILL.md deleted
-55
@@ -1,55 +0,0 @@
1 ----
2 -name: riverpod-overrides
3 -description: Override Riverpod providers for tests, debugging, or environment-specific behavior; ProviderScope and ProviderContainer overrides, overrideWith, overrideWithValue. Use when mocking providers in tests, injecting different implementations, or scoping provider behavior. Use this skill when the user asks about overrides, testing Riverpod, or mocking providers.
4 ----
5 -
6 -# Riverpod — Provider overrides
7 -
8 -## Instructions
9 -
10 -All providers can be **overridden** to change their behavior. Overrides are set on the **container** (ProviderScope in Flutter, ProviderContainer in Dart) via the `overrides` parameter. Use overrides for testing, debugging, different environments, or scoping (see riverpod-scoping).
11 -
12 -### Where to set overrides
13 -
14 -- **Flutter:** Pass `overrides` to `ProviderScope` (usually at the root or around a subtree).
15 -- **Dart:** Pass `overrides` to `ProviderContainer`.
16 -
17 -### Override methods
18 -
19 -Each provider type exposes methods whose names start with `overrideWith`, for example:
20 -
21 -- **overrideWith** — Provide a new implementation (e.g. a function that returns a value or builds state).
22 -- **overrideWithValue** — Replace with a fixed value (e.g. for FutureProvider/StreamProvider).
23 -- **overrideWithBuild** — Custom build logic (e.g. for StreamProvider).
24 -
25 -Check the provider's API for the exact method (e.g. `Provider.overrideWith`, `FutureProvider.overrideWithValue`).
26 -
27 -### Example: override a counter
28 -
29 -```dart
30 -// Flutter
31 -void main() {
32 - runApp(
33 - ProviderScope(
34 - overrides: [
35 - counterProvider.overrideWith((ref) => 42),
36 - ],
37 - child: MyApp(),
38 - ),
39 - );
40 -}
41 -
42 -// Dart
43 -final container = ProviderContainer(
44 - overrides: [
45 - counterProvider.overrideWith((ref) => 42),
46 - ],
47 -);
48 -```
49 -
50 -### Family overrides
51 -
52 -- **Single parameter:** Override one specific argument: `userProvider('123').overrideWith((ref) => User(name: 'User 123'))`.
53 -- **All parameters:** Override the whole family: `userProvider.overrideWith((ref, arg) => User(name: 'User $arg'))`.
54 -
55 -See riverpod-family and riverpod-testing for more test patterns.
.agent/skills/riverpod-providers/SKILL.md deleted
-92
@@ -1,92 +0,0 @@
1 ----
2 -name: riverpod-providers
3 -description: Declare and use Riverpod providers (Provider, FutureProvider, StreamProvider, NotifierProvider, AsyncNotifierProvider, StreamNotifierProvider); unmodifiable vs modifiable, top-level declaration, Ref, Notifier build method. Use when creating providers, choosing provider type, writing Notifier classes, or understanding Riverpod state. Use this skill whenever the user asks about Riverpod providers, provider types, or notifiers.
4 ----
5 -
6 -# Riverpod — Providers
7 -
8 -## Instructions
9 -
10 -Providers are the central feature of Riverpod: memoized functions that cache their result and let multiple widgets (or other providers) access the same value. They are declared as **top-level** `final` variables. State lives in a **ProviderContainer** (or ProviderScope in Flutter), not in the provider itself.
11 -
12 -### Provider variants
13 -
14 -| | Synchronous | Future | Stream |
15 -|--------------|---------------|------------------------|-------------------------|
16 -| Unmodifiable | Provider | FutureProvider | StreamProvider |
17 -| Modifiable | NotifierProvider | AsyncNotifierProvider | StreamNotifierProvider |
18 -
19 -- **Sync vs Future vs Stream**: Match the return type of your function (`int`, `Future<T>`, `Stream<T>`).
20 -- **Unmodifiable**: Widgets only read the value. Use for computed or fetched data.
21 -- **Modifiable**: Expose a Notifier with a `build()` method and custom methods; widgets call `ref.read(provider.notifier).someMethod()`. Use when the UI must update state.
22 -
23 -Pick the type based on what you want to return; the provider type follows naturally. FutureProvider / AsyncNotifierProvider are the most common.
24 -
25 -### Creating a provider (unmodifiable / functional)
26 -
27 -**Manual:**
28 -
29 -```dart
30 -final userProvider = FutureProvider<User>((ref) async {
31 - final response = await http.get('https://api.example.com/user/123');
32 - return User.fromJson(response.body);
33 -});
34 -```
35 -
36 -**Code generation:** Annotate a top-level function with `@riverpod`. First parameter must be `Ref ref`. The generated provider name is `functionNameProvider`.
37 -
38 -```dart
39 -@riverpod
40 -Future<User> user(Ref ref) async {
41 - final response = await http.get('https://api.example.com/user/123');
42 - return User.fromJson(response.body);
43 -}
44 -```
45 -
46 -Modifiers: `.autoDispose` (or `@Riverpod(keepAlive: true)` to disable) and `.family` for parameters. See riverpod-auto-dispose and riverpod-family.
47 -
48 -### Creating a provider (modifiable / Notifier)
49 -
50 -**Manual:** Use a NotifierProvider (or AsyncNotifierProvider / StreamNotifierProvider) with a Notifier class that extends `Notifier<T>`, `AsyncNotifier<T>`, or `StreamNotifier<T>`. Override `build()`; do not put logic in the constructor (ref/state are not available yet). Public methods are called via `ref.read(provider.notifier).method()`.
51 -
52 -```dart
53 -final counterProvider = NotifierProvider<CounterNotifier, int>(CounterNotifier.new);
54 -
55 -class CounterNotifier extends Notifier<int> {
56 - @override
57 - int build() => 0;
58 -
59 - void increment() => state++;
60 -}
61 -```
62 -
63 -**Code generation:** Annotate a class that extends `_$ClassName`. Override `build()`; add custom methods. Same rule: no logic in the constructor.
64 -
65 -```dart
66 -@riverpod
67 -class CounterNotifier extends _$CounterNotifier {
68 - @override
69 - int build() => 0;
70 -
71 - void increment() => state++;
72 -}
73 -```
74 -
75 -### Using providers
76 -
77 -1. **Flutter:** Wrap the app in `ProviderScope`. Use Consumer, ConsumerWidget, or ConsumerStatefulWidget to get a `ref` and call `ref.watch(provider)` or `ref.read(provider)`.
78 -2. **Dart only:** Create a `ProviderContainer()`, then `container.read(provider)` or `container.listen(...)`. Call `container.dispose()` when done.
79 -3. **Inside another provider:** Use the `Ref` passed to the provider function (or `this.ref` in a Notifier) to `ref.watch` / `ref.read` other providers.
80 -
81 -Example in a widget:
82 -
83 -```dart
84 -return Consumer(
85 - builder: (context, ref, _) {
86 - final helloWorld = ref.watch(helloWorldProvider);
87 - return Text(helloWorld);
88 - },
89 -);
90 -```
91 -
92 -You can declare multiple providers that return the same type; they are independent. For more detail on Ref, containers, modifiers, and notifier rules, see [reference.md](reference.md).
.agent/skills/riverpod-providers/reference.md deleted
-34
@@ -1,34 +0,0 @@
1 -# Riverpod Providers — Reference
2 -
3 -## Provider type summary
4 -
5 -- **Provider** — sync, unmodifiable. Return type `T`.
6 -- **FutureProvider** — async, unmodifiable. Return type `Future<T>`.
7 -- **StreamProvider** — stream, unmodifiable. Return type `Stream<T>`.
8 -- **NotifierProvider** — sync, modifiable. Notifier extends `Notifier<T>`, `build()` returns `T`.
9 -- **AsyncNotifierProvider** — async, modifiable. Notifier extends `AsyncNotifier<T>`, `build()` returns `Future<T>`.
10 -- **StreamNotifierProvider** — stream, modifiable. Notifier extends `StreamNotifier<T>`, `build()` returns `Stream<T>`.
11 -
12 -## Modifiers
13 -
14 -- **autoDispose** — Cache is cleared when the provider has no listeners. Use with family to avoid memory leaks. Disable with `@Riverpod(keepAlive: true)` in codegen.
15 -- **family** — Pass parameters to the provider (e.g. `provider(id)`). See riverpod-family.
16 -
17 -## Notifier rules
18 -
19 -- Do not put logic in the Notifier constructor; `ref` and `state` are not ready. Put initialization in `build()`.
20 -- `build()` is called by the framework; do not call it directly.
21 -- Consumers modify state by calling methods on the notifier: `ref.read(myProvider.notifier).myMethod()`.
22 -
23 -## Multiple providers, same type
24 -
25 -Riverpod allows multiple providers that expose the same type (e.g. two different `Provider<String>`). They are independent; no conflict.
26 -
27 -## Links to other concepts
28 -
29 -- Ref (read, watch, listen, invalidate): riverpod-refs
30 -- Containers / ProviderScope: riverpod-containers
31 -- Auto-dispose: riverpod-auto-dispose
32 -- Family: riverpod-family
33 -- Overrides (testing): riverpod-overrides
34 -- Consumers (widgets): riverpod-consumers
.agent/skills/riverpod-pull-to-refresh/SKILL.md deleted
-51
@@ -1,51 +0,0 @@
1 ----
2 -name: riverpod-pull-to-refresh
3 -description: Implement pull-to-refresh with Riverpod using RefreshIndicator and ref.refresh; show spinner on initial load, show previous data during refresh, AsyncValue pattern matching. Use when the user asks about pull-to-refresh, RefreshIndicator with Riverpod, or refreshing async providers.
4 ----
5 -
6 -# Riverpod — Pull-to-refresh
7 -
8 -## Instructions
9 -
10 -Riverpod fits pull-to-refresh well: refresh by invalidating the provider and let AsyncValue handle loading vs data vs error.
11 -
12 -### 1. Provider and UI
13 -
14 -Define an async provider (e.g. FutureProvider or AsyncNotifierProvider) that fetches data. Display it with **ref.watch(provider)** so you get an **AsyncValue**.
15 -
16 -### 2. RefreshIndicator
17 -
18 -Wrap your scrollable (ListView, SingleChildScrollView, etc.) in **RefreshIndicator**. In **onRefresh**, call **ref.refresh(provider.future)** so the indicator stays until the new data is loaded:
19 -
20 -```dart
21 -RefreshIndicator(
22 - onRefresh: () => ref.refresh(activityProvider.future),
23 - child: ListView(
24 - children: [
25 - // content
26 - ],
27 - ),
28 -)
29 -```
30 -
31 -### 3. Loading and error states
32 -
33 -Use **AsyncValue** pattern matching:
34 -
35 -- **Initial load:** No data and no error → show full-screen spinner.
36 -- **Refresh:** Show the refresh indicator and keep showing previous data (or previous error) until the new result arrives.
37 -- **Data:** `AsyncValue(:final value?)` or similar to show the value.
38 -- **Error:** `AsyncValue(:final error?)` to show the error.
39 -
40 -Example (syntax may vary by Riverpod version):
41 -
42 -```dart
43 -final activity = ref.watch(activityProvider);
44 -switch (activity) {
45 - AsyncValue<Activity>(:final value?) => Text(value.activity),
46 - AsyncValue(:final error?) => Text('Error: $error'),
47 - _ => const CircularProgressIndicator(),
48 -}
49 -```
50 -
51 -Use **valueOrNull** (or equivalent) if your API exposes it for nullable data. See the docs for the exact AsyncValue API in your version.
.agent/skills/riverpod-refs/SKILL.md deleted
-70
@@ -1,70 +0,0 @@
1 ----
2 -name: riverpod-refs
3 -description: Use Ref and WidgetRef to read, watch, listen, invalidate, and refresh providers; onDispose and onCancel lifecycle; ref.read vs ref.watch vs ref.listen, ref.invalidate and ref.refresh. Use when interacting with Riverpod providers from widgets or other providers, when to use watch vs read, or when resetting provider state. Use this skill whenever the user asks about ref.watch, ref.read, ref.listen, ref.invalidate, or Riverpod lifecycle.
4 ----
5 -
6 -# Riverpod — Refs
7 -
8 -## Instructions
9 -
10 -**Ref** (and **WidgetRef** in widgets) is how you interact with providers: read state, listen to changes, reset state, and register lifecycle callbacks. Providers get a `Ref` as the first parameter of their function or as `this.ref` in a Notifier. Widgets get a **WidgetRef** via Consumer / ConsumerWidget / ConsumerState.
11 -
12 -### Obtaining a Ref
13 -
14 -- **Inside a provider:** First parameter of the provider function, or `ref` property in a Notifier.
15 -- **Inside a widget:** Use a Consumer (builder gives `ref`), ConsumerWidget (`build(context, ref)`), or ConsumerStatefulWidget (state has `ref`). Pass `ref` to other functions if needed.
16 -
17 -### Listening to state
18 -
19 -- **ref.watch(provider)** — Declarative. Your widget/provider rebuilds when the provider changes. Use this by default in build methods.
20 -- **ref.listen(provider, (prev, next) { ... })** — Imperative. Run side effects when the provider changes (e.g. show a dialog, navigate). Safe to use in build; for initState use `ref.listenManual` and manage the subscription.
21 -
22 -```dart
23 -// In a widget
24 -final tick = ref.watch(tickProvider);
25 -return Text('Tick: $tick');
26 -
27 -// Side effect when provider changes
28 -ref.listen(tickProvider, (previous, next) {
29 - print('Tick changed from $previous to $next');
30 -});
31 -```
32 -
33 -### Reading without listening
34 -
35 -- **ref.read(provider)** — Get current value without subscribing. Use in event handlers (e.g. onPressed), not to "optimize" by avoiding watch. For selective rebuilds use `ref.watch(provider.select((value) => ...))`.
36 -
37 -```dart
38 -onPressed: () {
39 - final tick = ref.read(tickProvider);
40 - print('Current tick: $tick');
41 -}
42 -```
43 -
44 -### Resetting state
45 -
46 -- **ref.invalidate(provider)** — Discard current state; provider will recompute on next read. If the provider is listened to, a new state is created.
47 -- **ref.refresh(provider)** — Same as invalidate + read: invalidates and returns the new value. Use when you need the new value immediately.
48 -
49 -```dart
50 -ref.invalidate(tickProvider);
51 -// or
52 -final newTick = ref.refresh(tickProvider);
53 -```
54 -
55 -### Lifecycle: onDispose, onCancel
56 -
57 -Inside a provider you can register callbacks:
58 -
59 -- **ref.onDispose(callback)** — Called when the provider state is destroyed (e.g. auto-dispose or recomputation). Use to close StreamControllers, cancel timers, etc. Do not trigger side effects that modify other providers inside onDispose.
60 -- **ref.onCancel(callback)** — Called when the last listener is removed (before dispose). **ref.onResume(callback)** — Called when a listener is added again after onCancel.
61 -
62 -```dart
63 -final provider = StreamProvider<int>((ref) {
64 - final controller = StreamController<int>();
65 - ref.onDispose(controller.close);
66 - return controller.stream;
67 -});
68 -```
69 -
70 -You can call onDispose multiple times (e.g. one per disposable resource). Return value of onDispose/onCancel can be called to unregister. For more detail and select/listenManual, see [reference.md](reference.md).
.agent/skills/riverpod-refs/reference.md deleted
-30
@@ -1,30 +0,0 @@
1 -# Riverpod Refs — Reference
2 -
3 -## ref.watch
4 -
5 -Subscribes to the provider; the current widget/provider rebuilds when the value changes. Use in build. Providers can watch other providers to compose state.
6 -
7 -## ref.read
8 -
9 -Returns current value without subscribing. Use in event handlers (onPressed, callbacks). Do not use read instead of watch to "optimize" — use watch or use select to limit rebuilds.
10 -
11 -## ref.listen
12 -
13 -Registers a one-off listener for side effects (navigation, dialogs, logging). Signature: `(previous, next) => ...`. Safe in build. For listening outside build (e.g. initState), use **ref.listenManual** and store the subscription to cancel later.
14 -
15 -## ref.invalidate / ref.refresh
16 -
17 -- **invalidate(provider)** — Discard state; next read will recompute.
18 -- **refresh(provider)** — invalidate + read in one call; returns the new value.
19 -
20 -## ref.select
21 -
22 -Reduce rebuilds by watching only a part of the state: `ref.watch(provider.select((value) => value.someField))`. Rebuilds only when the selected value changes (by ==).
23 -
24 -## WidgetRef.listenManual
25 -
26 -When you need to listen from initState or outside build, use listenManual and call the returned subscription's `close()` in dispose.
27 -
28 -## Ref vs WidgetRef
29 -
30 -Ref is used inside providers; WidgetRef is used inside widgets. There is no shared interface by design — keep logic in providers and call notifier methods from the UI so only Ref is needed in business logic.
.agent/skills/riverpod-retry/SKILL.md deleted
-51
@@ -1,51 +0,0 @@
1 ----
2 -name: riverpod-retry
3 -description: Customize Riverpod automatic retry on provider failure; retry function, per-provider and global retry, disabling retry, ProviderException, awaiting retries. Use when a provider can fail transiently and should retry, or when you need to disable or customize retry logic. Use this skill when the user asks about retry, failed providers, or exponential backoff in Riverpod.
4 ----
5 -
6 -# Riverpod — Automatic retry
7 -
8 -## Instructions
9 -
10 -Riverpod **retries** providers when their computation throws. Retry can be customized per provider or globally.
11 -
12 -### Default behavior
13 -
14 -By default a provider is retried up to a limit (e.g. 10 times) with exponential backoff (e.g. 200ms to 6.4s). **Error** and **ProviderException** are not retried: Error indicates a bug; ProviderException means a dependency failed, so the dependent provider is not retried (the underlying one is).
15 -
16 -### Custom retry function
17 -
18 -A retry function has signature `Duration? Function(int retryCount, Object error)`. Return a **Duration** for the delay before the next retry, or **null** to stop.
19 -
20 -```dart
21 -Duration? myRetry(int retryCount, Object error) {
22 - if (retryCount >= 5) return null;
23 - if (error is ProviderException) return null;
24 - return Duration(milliseconds: 200 * (1 << retryCount));
25 -}
26 -```
27 -
28 -### Where to set it
29 -
30 -- **Per provider:** Pass `retry: myRetry` when defining the provider (or `@Riverpod(retry: myRetry)` with codegen).
31 -- **Globally:** Pass `retry: myRetry` to **ProviderScope** or **ProviderContainer**.
32 -
33 -```dart
34 -// Global
35 -ProviderScope(retry: myRetry, child: MyApp())
36 -
37 -// Per provider (manual)
38 -final myProvider = Provider<int>(retry: myRetry, (ref) => 0);
39 -```
40 -
41 -### Disabling retry
42 -
43 -Return **null** always:
44 -
45 -```dart
46 -ProviderScope(retry: (retryCount, error) => null, child: MyApp())
47 -```
48 -
49 -### Awaiting async providers with retry
50 -
51 -`ref.watch(myProvider.future)` (or equivalent) keeps waiting until either all retries are exhausted or the provider succeeds. So `await ref.watch(myProvider.future)` skips intermediate failures and completes when the provider finally succeeds or gives up.
.agent/skills/riverpod-scoping/SKILL.md deleted
-55
@@ -1,55 +0,0 @@
1 ----
2 -name: riverpod-scoping
3 -description: Scope Riverpod providers to a subtree using overrides and dependencies; page-specific behavior, ListView optimization, avoiding passing family parameters. Use when changing provider behavior for one page or widget, or when optimizing rebuilds. Use this skill when the user asks about scoping providers or provider scope.
4 ----
5 -
6 -# Riverpod — Scoping providers
7 -
8 -## Instructions
9 -
10 -**Scoping** means changing a provider's behavior for only part of the app by overriding it in a **non-root** ProviderScope. Use cases: page-specific customization (e.g. theme for one page), performance (e.g. rebuild only the item that changed in a ListView), or avoiding passing family parameters through the tree.
11 -
12 -**Note:** Scoping is complex and may be reworked in future Riverpod versions. Use with care.
13 -
14 -### Opt-in: dependencies
15 -
16 -By default you cannot scope a provider. Opt in by setting **dependencies** on the provider. The first scoped provider usually has `dependencies: const []`.
17 -
18 -```dart
19 -final currentItemIdProvider = Provider<String?>(
20 - dependencies: const [],
21 - (ref) => null,
22 -);
23 -```
24 -
25 -### Listening to a scoped provider
26 -
27 -Use ref.watch/ref.read as usual. If another **provider** listens to a scoped provider, that listening provider must list the scoped provider in its **dependencies**:
28 -
29 -```dart
30 -final currentItemProvider = FutureProvider<Item?>(
31 - dependencies: [currentItemIdProvider],
32 - (ref) async {
33 - final currentItemId = ref.watch(currentItemIdProvider);
34 - if (currentItemId == null) return null;
35 - return fetchItem(id: currentItemId);
36 - },
37 -);
38 -```
39 -
40 -Only scoped providers need to be listed in dependencies; non-scoped providers do not.
41 -
42 -### Setting the scoped value: overrides
43 -
44 -Use **overrides** on a ProviderScope that wraps the subtree where the scoped value should apply:
45 -
46 -```dart
47 -ProviderScope(
48 - overrides: [
49 - currentItemIdProvider.overrideWithValue('123'),
50 - ],
51 - child: const DetailPageView(),
52 -)
53 -```
54 -
55 -That way the detail page sees `'123'` as the current item ID without it being passed down manually. See riverpod-overrides for override syntax.
.agent/skills/riverpod-select/SKILL.md deleted
-30
@@ -1,30 +0,0 @@
1 ----
2 -name: riverpod-select
3 -description: Reduce rebuilds with ref.watch(provider.select(...)); select a subset of state so widgets rebuild only when that part changes. Use when optimizing performance or when a widget uses only one field of a large object. Use this skill when the user asks about select, reducing rebuilds, or optimizing Riverpod watch.
4 ----
5 -
6 -# Riverpod — Reducing rebuilds with select
7 -
8 -## Instructions
9 -
10 -By default, **ref.watch(provider)** rebuilds whenever the provider's value changes (by reference/equality). If you only use a subset of the state (e.g. one field of a User), the widget still rebuilds when other fields change.
11 -
12 -Use **select** to watch only a part of the state. Rebuilds happen only when the **selected** value changes (by ==).
13 -
14 -### Syntax
15 -
16 -```dart
17 -// Rebuild only when firstName changes
18 -String name = ref.watch(provider.select((it) => it.firstName));
19 -return Text('Hello $name');
20 -```
21 -
22 -You can call select multiple times for different properties. The selected value should be **immutable**; mutating a returned List/object in place will not trigger a rebuild.
23 -
24 -### Async providers: selectAsync
25 -
26 -For async providers you often use **ref.watch(provider.future)**. To select on the resolved data instead of the whole AsyncValue, use **selectAsync** (when available): it applies a select on the data and returns a Future. See the Riverpod docs for the exact API in your version.
27 -
28 -### When to use
29 -
30 -- Only when the "other" properties change often and you have measured that rebuilds are a bottleneck. Select adds a small cost and extra complexity. Prefer normal watch unless you need the optimization.
.agent/skills/riverpod-testing/SKILL.md deleted
-93
@@ -1,93 +0,0 @@
1 ----
2 -name: riverpod-testing
3 -description: Test Riverpod providers and widgets; ProviderContainer.test, unit tests, widget tests with ProviderScope, tester.container(), mocking with overrides, container.listen for auto-dispose, awaiting .future. Use when writing unit or widget tests for Riverpod code, mocking providers, or testing with overrides. Use this skill when the user asks about testing Riverpod, mocking providers, or ProviderContainer in tests.
4 ----
5 -
6 -# Riverpod — Testing
7 -
8 -## Instructions
9 -
10 -Riverpod is designed for testability: isolate state per test, mock via overrides, and keep the test environment close to production.
11 -
12 -### Unit tests (no Flutter)
13 -
14 -Use **ProviderContainer.test()** to create a container for the test. Do not share containers between tests.
15 -
16 -```dart
17 -void main() {
18 - test('Some description', () {
19 - final container = ProviderContainer.test();
20 - expect(container.read(provider), equals('some value'));
21 - });
22 -}
23 -```
24 -
25 -- **container.read(provider)** — Read current value.
26 -- **container.listen(provider, (prev, next) {})** — Listen and get a subscription; use **subscription.read()** to read. Prefer listen when the provider is auto-dispose so it is not disposed mid-test.
27 -
28 -```dart
29 -final subscription = container.listen<String>(provider, (_, _) {});
30 -expect(subscription.read(), 'Some value');
31 -```
32 -
33 -### Widget tests
34 -
35 -Wrap the widget under test in **ProviderScope**:
36 -
37 -```dart
38 -testWidgets('Some description', (tester) async {
39 - await tester.pumpWidget(
40 - const ProviderScope(child: YourWidgetYouWantToTest()),
41 - );
42 -});
43 -```
44 -
45 -To interact with providers in the test, get the container with **tester.container()**:
46 -
47 -```dart
48 -final container = tester.container();
49 -expect(container.read(provider), 'some value');
50 -```
51 -
52 -### Mocking providers
53 -
54 -Use **overrides** on ProviderContainer or ProviderScope. All providers can be overridden without extra setup.
55 -
56 -```dart
57 -final container = ProviderContainer.test(
58 - overrides: [
59 - exampleProvider.overrideWith((ref) => 'Hello from tests'),
60 - ],
61 -);
62 -
63 -// Or in widget tests:
64 -await tester.pumpWidget(
65 - ProviderScope(
66 - overrides: [exampleProvider.overrideWith((ref) => 'Hello from tests')],
67 - child: const YourWidgetYouWantToTest(),
68 - ),
69 -);
70 -```
71 -
72 -See riverpod-overrides for family overrides and other override methods.
73 -
74 -### Awaiting async providers
75 -
76 -Read **provider.future** to get a Future that completes with the provider value; use with expectLater:
77 -
78 -```dart
79 -await expectLater(
80 - container.read(provider.future),
81 - completion('some value'),
82 -);
83 -```
84 -
85 -### Listening / spying
86 -
87 -Use **container.listen(provider, callback)** and assert on the callback arguments or collect values in a list for assertions. Works with mockito/mocktail verify patterns.
88 -
89 -### Mocking Notifiers
90 -
91 -Prefer mocking a dependency (e.g. repository) the Notifier uses rather than mocking the Notifier. If you must mock a Notifier, **subclass** it (do not implement), so the mock extends the original base class. With code generation, the mock usually needs to live in the same file as the Notifier to access the generated base class.
92 -
93 -See riverpod-overrides and the official docs for more examples.
.agent/skills/shadcn_ui-accordion/SKILL.md deleted
-46
@@ -1,46 +0,0 @@
1 ----
2 -name: shadcn_ui-accordion
3 -description: Build collapsible accordions with ShadAccordion and ShadAccordionItem; single or multiple open items. Use when adding expandable sections, FAQs, or vertically stacked reveal content in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Accordion
7 -
8 -## Instructions
9 -
10 -Use `ShadAccordion` for a vertically stacked set of headings that each reveal content. Each item is a `ShadAccordionItem` with `value`, `title`, and `child`.
11 -
12 -### Single (one open at a time)
13 -
14 -```dart
15 -final details = [
16 - (title: 'Is it acceptable?', content: 'Yes. It adheres to the WAI-ARIA design pattern.'),
17 - (title: 'Is it styled?', content: "Yes. It comes with default styles that matches the other components' aesthetic."),
18 - (title: 'Is it animated?', content: "Yes. It's animated by default, but you can disable it if you prefer."),
19 -];
20 -
21 -ShadAccordion<({String content, String title})>(
22 - children: details.map(
23 - (detail) => ShadAccordionItem(
24 - value: detail,
25 - title: Text(detail.title),
26 - child: Text(detail.content),
27 - ),
28 - ),
29 -)
30 -```
31 -
32 -### Multiple (several open at once)
33 -
34 -Use `ShadAccordion.multiple`:
35 -
36 -```dart
37 -ShadAccordion<({String content, String title})>.multiple(
38 - children: details.map(
39 - (detail) => ShadAccordionItem(
40 - value: detail,
41 - title: Text(detail.title),
42 - child: Text(detail.content),
43 - ),
44 - ),
45 -)
46 -```
.agent/skills/shadcn_ui-alert/SKILL.md deleted
-30
@@ -1,30 +0,0 @@
1 ----
2 -name: shadcn_ui-alert
3 -description: Show callout alerts with ShadAlert and ShadAlert.destructive; icon, title, description. Use when displaying warnings, errors, or important messages in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Alert
7 -
8 -## Instructions
9 -
10 -`ShadAlert` displays a callout for user attention. Use default constructor for standard alerts, `ShadAlert.destructive` for errors or destructive actions.
11 -
12 -### Primary / default
13 -
14 -```dart
15 -ShadAlert(
16 - icon: Icon(LucideIcons.terminal),
17 - title: Text('Heads up!'),
18 - description: Text('You can add components to your app using the cli.'),
19 -)
20 -```
21 -
22 -### Destructive
23 -
24 -```dart
25 -ShadAlert.destructive(
26 - icon: Icon(LucideIcons.circleAlert),
27 - title: Text('Error'),
28 - description: Text('Your session has expired. Please log in again.'),
29 -)
30 -```
.agent/skills/shadcn_ui-avatar/SKILL.md deleted
-21
@@ -1,21 +0,0 @@
1 ----
2 -name: shadcn_ui-avatar
3 -description: Display user avatars with ShadAvatar; image URL with optional placeholder. Use when showing user profile images or fallback initials in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Avatar
7 -
8 -## Instructions
9 -
10 -`ShadAvatar` is an image with a placeholder for representing the user. Uses the `universal_image` package for multiple image formats.
11 -
12 -### Basic usage
13 -
14 -```dart
15 -ShadAvatar(
16 - 'https://example.com/avatar.png',
17 - placeholder: Text('CN'),
18 -)
19 -```
20 -
21 -Pass the image URL as the first argument; `placeholder` is shown while loading or if the image fails (e.g. initials).
.agent/skills/shadcn_ui-badge/SKILL.md deleted
-24
@@ -1,24 +0,0 @@
1 ----
2 -name: shadcn_ui-badge
3 -description: Display badges with ShadBadge; primary, secondary, destructive, outline variants. Use when showing tags, status labels, or count indicators in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Badge
7 -
8 -## Instructions
9 -
10 -`ShadBadge` displays a badge or badge-like component. Variants: default (primary), `ShadBadge.secondary`, `ShadBadge.destructive`, `ShadBadge.outline`.
11 -
12 -### Variants
13 -
14 -```dart
15 -ShadBadge(child: const Text('Primary'))
16 -
17 -ShadBadge.secondary(child: const Text('Secondary'))
18 -
19 -ShadBadge.destructive(child: const Text('Destructive'))
20 -
21 -ShadBadge.outline(child: const Text('Outline'))
22 -```
23 -
24 -Wrap any `child` (typically `Text`) with the desired constructor.
.agent/skills/shadcn_ui-breadcrumb/SKILL.md deleted
-58
@@ -1,58 +0,0 @@
1 ----
2 -name: shadcn_ui-breadcrumb
3 -description: Build breadcrumb navigation with ShadBreadcrumb, ShadBreadcrumbLink, ShadBreadcrumbDropdown, custom separator. Use when showing navigation path, hierarchy of links, or dropdown breadcrumb in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Breadcrumb
7 -
8 -## Instructions
9 -
10 -`ShadBreadcrumb` displays the path to the current resource using a hierarchy of links. Children can be `ShadBreadcrumbLink`, `ShadBreadcrumbDropdown`, or plain widgets (e.g. `Text` for current page).
11 -
12 -### Basic breadcrumb
13 -
14 -```dart
15 -ShadBreadcrumb(
16 - children: [
17 - ShadBreadcrumbLink(
18 - onPressed: () => print('Navigating to Home'),
19 - child: const Text('Home'),
20 - ),
21 - ShadBreadcrumbDropdown(
22 - items: [
23 - ShadBreadcrumbDropMenuItem(
24 - onPressed: () => print('Navigating to Documentation'),
25 - child: const Text('Documentation'),
26 - ),
27 - ShadBreadcrumbDropMenuItem(
28 - onPressed: () => print('Navigating to Themes'),
29 - child: const Text('Themes'),
30 - ),
31 - ],
32 - showDropdownArrow: false,
33 - child: ShadBreadcrumbEllipsis(),
34 - ),
35 - Text('Components'),
36 - Text('Breadcrumb'),
37 - ],
38 -)
39 -```
40 -
41 -### Custom separator
42 -
43 -Default separator is `>`. Override with `separator`:
44 -
45 -```dart
46 -ShadBreadcrumb(
47 - separator: const Icon(LucideIcons.slash),
48 - children: [
49 - ShadBreadcrumbLink(onPressed: () {}, child: const Text('Home')),
50 - ShadBreadcrumbLink(onPressed: () {}, child: const Text('Components')),
51 - Text('Breadcrumb'),
52 - ],
53 -)
54 -```
55 -
56 -### Dropdown in breadcrumb
57 -
58 -Use `ShadBreadcrumbDropdown` with `items` (list of `ShadBreadcrumbDropMenuItem`) and `child` (trigger widget). Use `ShadBreadcrumbEllipsis()` for an ellipsis trigger.
.agent/skills/shadcn_ui-button/SKILL.md deleted
-72
@@ -1,72 +0,0 @@
1 ----
2 -name: shadcn_ui-button
3 -description: Use Shadcn UI buttons (ShadButton variants: primary, secondary, destructive, outline, ghost, link); leading icon, loading state, gradient and shadow. Use when adding buttons, CTAs, or button-style widgets in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Button
7 -
8 -## Instructions
9 -
10 -`ShadButton` displays a button or component that looks like a button. Variants: default (primary), `ShadButton.secondary`, `ShadButton.destructive`, `ShadButton.outline`, `ShadButton.ghost`, `ShadButton.link`. Use `leading` (and optionally `trailing`) for icons; support gradient and shadows for custom styling.
11 -
12 -### Variants
13 -
14 -```dart
15 -ShadButton(child: const Text('Primary'), onPressed: () {})
16 -
17 -ShadButton.secondary(child: const Text('Secondary'), onPressed: () {})
18 -
19 -ShadButton.destructive(child: const Text('Destructive'), onPressed: () {})
20 -
21 -ShadButton.outline(child: const Text('Outline'), onPressed: () {})
22 -
23 -ShadButton.ghost(child: const Text('Ghost'), onPressed: () {})
24 -
25 -ShadButton.link(child: const Text('Link'), onPressed: () {})
26 -```
27 -
28 -### Text and icon
29 -
30 -```dart
31 -ShadButton(
32 - onPressed: () {},
33 - leading: const Icon(LucideIcons.mail),
34 - child: const Text('Login with Email'),
35 -)
36 -```
37 -
38 -### Loading state
39 -
40 -Use `leading` with a small `CircularProgressIndicator`:
41 -
42 -```dart
43 -ShadButton(
44 - onPressed: () {},
45 - leading: SizedBox.square(
46 - dimension: 16,
47 - child: CircularProgressIndicator(
48 - strokeWidth: 2,
49 - color: ShadTheme.of(context).colorScheme.primaryForeground,
50 - ),
51 - ),
52 - child: const Text('Please wait'),
53 -)
54 -```
55 -
56 -### Gradient and shadow
57 -
58 -```dart
59 -ShadButton(
60 - onPressed: () {},
61 - gradient: const LinearGradient(colors: [Colors.cyan, Colors.indigo]),
62 - shadows: [
63 - BoxShadow(
64 - color: Colors.blue.withValues(alpha:.4),
65 - spreadRadius: 4,
66 - blurRadius: 10,
67 - offset: const Offset(0, 2),
68 - ),
69 - ],
70 - child: const Text('Gradient with Shadow'),
71 -)
72 -```
.agent/skills/shadcn_ui-calendar/SKILL.md deleted
-63
@@ -1,63 +0,0 @@
1 ----
2 -name: shadcn_ui-calendar
3 -description: Use ShadCalendar for single, multiple, or range date selection; caption layout, hide navigation, week numbers, outside days, fixed weeks. Use when building date pickers or calendar widgets in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Calendar
7 -
8 -## Instructions
9 -
10 -`ShadCalendar` is a date field that lets users enter and edit dates. Modes: single date, multiple dates (`ShadCalendar.multiple`), or range (`ShadCalendar.range`). Use `fromMonth`/`toMonth` to limit range; `captionLayout` for dropdown months/years.
11 -
12 -### Single
13 -
14 -```dart
15 -final today = DateTime.now();
16 -
17 -ShadCalendar(
18 - selected: today,
19 - fromMonth: DateTime(today.year - 1),
20 - toMonth: DateTime(today.year, 12),
21 -)
22 -```
23 -
24 -### Multiple
25 -
26 -```dart
27 -ShadCalendar.multiple(
28 - numberOfMonths: 2,
29 - fromMonth: DateTime(today.year),
30 - toMonth: DateTime(today.year + 1, 12),
31 - min: 5,
32 - max: 10,
33 -)
34 -```
35 -
36 -### Range
37 -
38 -```dart
39 -const ShadCalendar.range(
40 - min: 2,
41 - max: 5,
42 -)
43 -```
44 -
45 -### Caption layout
46 -
47 -```dart
48 -ShadCalendar(
49 - captionLayout: ShadCalendarCaptionLayout.dropdownMonths,
50 -);
51 -
52 -ShadCalendar(
53 - captionLayout: ShadCalendarCaptionLayout.dropdownYears,
54 -);
55 -```
56 -
57 -### Options
58 -
59 -- `hideNavigation: true` — Hide month navigation.
60 -- `showWeekNumbers: true` — Show week numbers.
61 -- `showOutsideDays: false` — Hide days from adjacent months.
62 -- `fixedWeeks: true` — Fixed number of rows.
63 -- `hideWeekdayNames: true` — Hide weekday headers.
.agent/skills/shadcn_ui-card/SKILL.md deleted
-53
@@ -1,53 +0,0 @@
1 ----
2 -name: shadcn_ui-card
3 -description: Build cards with ShadCard; title, description, footer, and child content. Use when creating content cards, project cards, or notification panels in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Card
7 -
8 -## Instructions
9 -
10 -`ShadCard` displays a card with optional header (title, description), body (`child`), and footer. Use `width` to constrain width.
11 -
12 -### Basic card
13 -
14 -```dart
15 -final theme = ShadTheme.of(context);
16 -ShadCard(
17 - width: 350,
18 - title: Text('Create project', style: theme.textTheme.h4),
19 - description: const Text('Deploy your new project in one-click.'),
20 - footer: Row(
21 - mainAxisAlignment: MainAxisAlignment.spaceBetween,
22 - children: [
23 - ShadButton.outline(child: const Text('Cancel'), onPressed: () {}),
24 - ShadButton(child: const Text('Deploy'), onPressed: () {}),
25 - ],
26 - ),
27 - child: Padding(
28 - padding: const EdgeInsets.symmetric(vertical: 16),
29 - child: Column(
30 - mainAxisSize: MainAxisSize.min,
31 - crossAxisAlignment: CrossAxisAlignment.stretch,
32 - children: [
33 - const Text('Name'),
34 - const SizedBox(height: 6),
35 - const ShadInput(placeholder: Text('Name of your project')),
36 - const SizedBox(height: 16),
37 - const Text('Framework'),
38 - const SizedBox(height: 6),
39 - ShadSelect<String>(
40 - placeholder: const Text('Select'),
41 - options: frameworks.entries
42 - .map((e) => ShadOption(value: e.key, child: Text(e.value)))
43 - .toList(),
44 - selectedOptionBuilder: (context, value) => Text(frameworks[value]!),
45 - onChanged: (value) {},
46 - ),
47 - ],
48 - ),
49 - ),
50 -)
51 -```
52 -
53 -Title and description are optional. Footer can be any widget (e.g. buttons). Put main content in `child`.
.agent/skills/shadcn_ui-checkbox/SKILL.md deleted
-39
@@ -1,39 +0,0 @@
1 ----
2 -name: shadcn_ui-checkbox
3 -description: Add checkboxes with ShadCheckbox and ShadCheckboxFormField; label, sublabel, form validation. Use when adding boolean toggles or terms acceptance in a Flutter shadcn_ui app or ShadForm.
4 ----
5 -
6 -# Shadcn UI — Checkbox
7 -
8 -## Instructions
9 -
10 -`ShadCheckbox` is a control that toggles between checked and unchecked. Use `value` and `onChanged`; optional `label` and `sublabel`. For forms use `ShadCheckboxFormField` with `id`, `validator`, and form state.
11 -
12 -### Standalone
13 -
14 -```dart
15 -ShadCheckbox(
16 - value: value,
17 - onChanged: (v) => setState(() => value = v),
18 - label: const Text('Accept terms and conditions'),
19 - sublabel: const Text(
20 - 'You agree to our Terms of Service and Privacy Policy.',
21 - ),
22 -)
23 -```
24 -
25 -### Form field
26 -
27 -```dart
28 -ShadCheckboxFormField(
29 - id: 'terms',
30 - initialValue: false,
31 - inputLabel: const Text('I accept the terms and conditions'),
32 - onChanged: (v) {},
33 - inputSublabel: const Text('You agree to our Terms and Conditions'),
34 - validator: (v) {
35 - if (!v) return 'You must accept the terms and conditions';
36 - return null;
37 - },
38 -)
39 -```
.agent/skills/shadcn_ui-context-menu/SKILL.md deleted
-65
@@ -1,65 +0,0 @@
1 ----
2 -name: shadcn_ui-context-menu
3 -description: Show context menus on right-click with ShadContextMenuRegion, ShadContextMenuItem, submenus, dividers. Use when adding right-click menus, actions, or nested menu items in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Context Menu
7 -
8 -## Instructions
9 -
10 -`ShadContextMenuRegion` wraps a `child` and shows a menu on right-click. Set `items` to a list of `ShadContextMenuItem` or `ShadContextMenuItem.inset`. Use `ShadContextMenuItem` with `items` for submenus; use `Divider(height: 8)` and `Padding` for sections and labels.
11 -
12 -### Basic usage
13 -
14 -```dart
15 -ShadContextMenuRegion(
16 - constraints: const BoxConstraints(minWidth: 300),
17 - items: [
18 - const ShadContextMenuItem.inset(child: Text('Back')),
19 - const ShadContextMenuItem.inset(
20 - enabled: false,
21 - child: Text('Forward'),
22 - ),
23 - const ShadContextMenuItem.inset(child: Text('Reload')),
24 - const ShadContextMenuItem.inset(
25 - trailing: Icon(LucideIcons.chevronRight),
26 - items: [
27 - ShadContextMenuItem(child: Text('Save Page As...')),
28 - ShadContextMenuItem(child: Text('Create Shortcut...')),
29 - ShadContextMenuItem(child: Text('Developer Tools')),
30 - Divider(height: 8),
31 - ShadContextMenuItem(child: Text('Developer Tools')),
32 - ],
33 - child: Text('More Tools'),
34 - ),
35 - const Divider(height: 8),
36 - const ShadContextMenuItem(
37 - leading: Icon(LucideIcons.check),
38 - child: Text('Show Bookmarks Bar'),
39 - ),
40 - const ShadContextMenuItem.inset(child: Text('Show Full URLs')),
41 - const Divider(height: 8),
42 - Padding(
43 - padding: const EdgeInsets.fromLTRB(36, 8, 8, 8),
44 - child: Text('People', style: theme.textTheme.small),
45 - ),
46 - ShadContextMenuItem(
47 - leading: /* avatar or icon */,
48 - child: const Text('Pedro Duarte'),
49 - ),
50 - const ShadContextMenuItem.inset(child: Text('Colm Tuite')),
51 - ],
52 - child: Container(
53 - width: 300,
54 - height: 200,
55 - alignment: Alignment.center,
56 - decoration: BoxDecoration(
57 - border: Border.all(color: theme.colorScheme.border),
58 - borderRadius: BorderRadius.circular(8),
59 - ),
60 - child: const Text('Right click here'),
61 - ),
62 -)
63 -```
64 -
65 -Use `ShadContextMenuItem` for items with leading/trailing; `ShadContextMenuItem.inset` for indented items. Nest `items` for submenus.
.agent/skills/shadcn_ui-date-picker/SKILL.md deleted
-85
@@ -1,85 +0,0 @@
1 ----
2 -name: shadcn_ui-date-picker
3 -description: Use ShadDatePicker and ShadDatePicker.range for single or range date selection; presets, ShadDatePickerFormField, ShadDateRangePickerFormField. Use when adding date pickers or date range fields in a Flutter shadcn_ui app or ShadForm.
4 ----
5 -
6 -# Shadcn UI — Date Picker
7 -
8 -## Instructions
9 -
10 -`ShadDatePicker` is a date picker with optional range and presets. Use `ShadDatePicker.range()` for range selection. For forms use `ShadDatePickerFormField` and `ShadDateRangePickerFormField` with `id`, `label`, `validator`, and optional `fromValueTransformer`/`toValueTransformer`.
11 -
12 -### Single
13 -
14 -```dart
15 -ConstrainedBox(
16 - constraints: const BoxConstraints(maxWidth: 600),
17 - child: const ShadDatePicker(),
18 -)
19 -```
20 -
21 -### Range
22 -
23 -```dart
24 -ConstrainedBox(
25 - constraints: const BoxConstraints(maxWidth: 600),
26 - child: const ShadDatePicker.range(),
27 -)
28 -```
29 -
30 -### With presets
31 -
32 -Use a `header` widget (e.g. `ShadSelect`) and shared `groupId` so the date picker popover stays open when the select popover closes. Set `selected` from preset choice (e.g. today + days offset).
33 -
34 -```dart
35 -ShadDatePicker(
36 - groupId: groupId,
37 - header: Padding(
38 - padding: const EdgeInsets.only(bottom: 4),
39 - child: ShadSelect<int>(
40 - groupId: groupId,
41 - minWidth: 276,
42 - placeholder: const Text('Select'),
43 - options: presets.entries
44 - .map((e) => ShadOption(value: e.key, child: Text(e.value)))
45 - .toList(),
46 - selectedOptionBuilder: (context, value) => Text(presets[value]!),
47 - onChanged: (value) {
48 - if (value == null) return;
49 - setState(() => selected = today.add(Duration(days: value)));
50 - },
51 - ),
52 - ),
53 - selected: selected,
54 - calendarDecoration: theme.calendarTheme.decoration,
55 - popoverPadding: const EdgeInsets.all(4),
56 -)
57 -```
58 -
59 -### Form fields
60 -
61 -```dart
62 -ShadDatePickerFormField(
63 - label: const Text('Date of birth'),
64 - onChanged: print,
65 - description: const Text('Your date of birth is used to calculate your age.'),
66 - validator: (v) {
67 - if (v == null) return 'A date of birth is required.';
68 - return null;
69 - },
70 -)
71 -
72 -ShadDateRangePickerFormField(
73 - label: const Text('Range of dates'),
74 - onChanged: print,
75 - description: const Text('Select the range of dates you want to search between.'),
76 - validator: (v) {
77 - if (v == null) return 'A range of dates is required.';
78 - if (v.start == null) return 'The start date is required.';
79 - if (v.end == null) return 'The end date is required.';
80 - return null;
81 - },
82 -)
83 -```
84 -
85 -For form initial value as string (e.g. `'date': '2024-02-01'`), use `fromValueTransformer` and `toValueTransformer` on `ShadDatePickerFormField` to convert to/from `DateTime`. See [reference.md](reference.md) or the Form skill for value transformers.
.agent/skills/shadcn_ui-decorator/SKILL.md deleted
-57
@@ -1,57 +0,0 @@
1 ----
2 -name: shadcn_ui-decorator
3 -description: Configure ShadDecoration and ShadDecorator for shadcn_ui components; customize secondary border and disableSecondaryBorder. Use when styling form controls, focus rings, or component borders in Flutter shadcn_ui.
4 ----
5 -
6 -# Shadcn UI — Decorator
7 -
8 -## Instructions
9 -
10 -Most shadcn_ui components use a `ShadDecoration` handled by `ShadDecorator` for borders, focus state, labels, and error/description styles.
11 -
12 -### Default decoration
13 -
14 -Default includes secondary border, focused ring, label/error/description styles and padding:
15 -
16 -```dart
17 -ShadDecoration(
18 - secondaryBorder: ShadBorder.all(
19 - padding: const EdgeInsets.all(4),
20 - width: 0,
21 - ),
22 - secondaryFocusedBorder: ShadBorder.all(
23 - width: 2,
24 - color: colorScheme.ring,
25 - radius: radius.add(radius / 2),
26 - padding: const EdgeInsets.all(2),
27 - ),
28 - labelStyle: textTheme.muted.copyWith(
29 - fontWeight: FontWeight.w500,
30 - color: colorScheme.foreground,
31 - ),
32 - errorStyle: textTheme.muted.copyWith(
33 - fontWeight: FontWeight.w500,
34 - color: colorScheme.destructive,
35 - ),
36 - labelPadding: const EdgeInsets.only(bottom: 8),
37 - descriptionStyle: textTheme.muted,
38 - descriptionPadding: const EdgeInsets.only(top: 8),
39 - errorPadding: const EdgeInsets.only(top: 8),
40 - errorLabelStyle: textTheme.muted.copyWith(
41 - fontWeight: FontWeight.w500,
42 - color: colorScheme.destructive,
43 - ),
44 -);
45 -```
46 -
47 -### Disable secondary border
48 -
49 -By default a secondary border is drawn around focusable components. To disable it and rely on a bolder primary border:
50 -
51 -```dart
52 -ShadThemeData(
53 - disableSecondaryBorder: true,
54 -),
55 -```
56 -
57 -**Note:** Disabling the secondary border is not recommended; it can hurt accessibility because the focus ring helps users see which component is focused.
.agent/skills/shadcn_ui-dialog/SKILL.md deleted
-83
@@ -1,83 +0,0 @@
1 ----
2 -name: shadcn_ui-dialog
3 -description: Show modal dialogs with showShadDialog, ShadDialog and ShadDialog.alert; title, description, actions, child content. Use when adding modals, confirmations, or alert dialogs in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Dialog
7 -
8 -## Instructions
9 -
10 -A modal dialog that interrupts the user. Use `showShadDialog(context: context, builder: ...)` and return a `ShadDialog` or `ShadDialog.alert`. Provide `title`, optional `description`, optional `actions` (list of widgets, e.g. buttons), and optional `child` for body content. Dismiss with `Navigator.of(context).pop(...)`.
11 -
12 -### Standard dialog
13 -
14 -```dart
15 -showShadDialog(
16 - context: context,
17 - builder: (context) => ShadDialog(
18 - title: const Text('Edit Profile'),
19 - description: const Text(
20 - "Make changes to your profile here. Click save when you're done",
21 - ),
22 - actions: const [ShadButton(child: Text('Save changes'))],
23 - child: Container(
24 - width: 375,
25 - padding: const EdgeInsets.symmetric(vertical: 20),
26 - child: Column(
27 - mainAxisSize: MainAxisSize.min,
28 - crossAxisAlignment: CrossAxisAlignment.end,
29 - spacing: 16,
30 - children: profile
31 - .map(
32 - (p) => Row(
33 - children: [
34 - Expanded(
35 - child: Text(
36 - p.title,
37 - textAlign: TextAlign.end,
38 - style: theme.textTheme.small,
39 - ),
40 - ),
41 - const SizedBox(width: 16),
42 - Expanded(
43 - flex: 3,
44 - child: ShadInput(initialValue: p.value),
45 - ),
46 - ],
47 - ),
48 - )
49 - .toList(),
50 - ),
51 - ),
52 - ),
53 -);
54 -```
55 -
56 -### Alert dialog
57 -
58 -Use `ShadDialog.alert` for confirmations; pass `actions` with Cancel and Continue (or similar) that call `Navigator.of(context).pop(false)` and `Navigator.of(context).pop(true)`.
59 -
60 -```dart
61 -showShadDialog(
62 - context: context,
63 - builder: (context) => ShadDialog.alert(
64 - title: const Text('Are you absolutely sure?'),
65 - description: const Padding(
66 - padding: EdgeInsets.only(bottom: 8),
67 - child: Text(
68 - 'This action cannot be undone. This will permanently delete your account and remove your data from our servers.',
69 - ),
70 - ),
71 - actions: [
72 - ShadButton.outline(
73 - child: const Text('Cancel'),
74 - onPressed: () => Navigator.of(context).pop(false),
75 - ),
76 - ShadButton(
77 - child: const Text('Continue'),
78 - onPressed: () => Navigator.of(context).pop(true),
79 - ),
80 - ],
81 - ),
82 -);
83 -```
.agent/skills/shadcn_ui-form/SKILL.md deleted
-100
@@ -1,100 +0,0 @@
1 ----
2 -name: shadcn_ui-form
3 -description: Build forms with ShadForm, validation, and form field values; use ShadInputFormField, ShadCheckboxFormField, ShadSelectFormField, ShadDatePickerFormField, etc. Use when building validated forms, getting form values, or using dot notation for nested fields in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Form
7 -
8 -## Instructions
9 -
10 -`ShadForm` provides centralized form state, a single `Map<String, dynamic>` for all field values, and no need to manage individual controllers. Use a `GlobalKey<ShadFormState>` to call `saveAndValidate()` and read `value`. Give each form field an `id`; use `Shad*FormField` widgets (e.g. `ShadInputFormField`, `ShadCheckboxFormField`, `ShadSelectFormField`, `ShadDatePickerFormField`, `ShadTimePickerFormField`, `ShadRadioGroupFormField`) inside `ShadForm`.
11 -
12 -### Basic form
13 -
14 -```dart
15 -final formKey = GlobalKey<ShadFormState>();
16 -
17 -ShadForm(
18 - key: formKey,
19 - child: Column(
20 - children: [
21 - ShadInputFormField(
22 - id: 'username',
23 - label: const Text('Username'),
24 - placeholder: const Text('Enter your username'),
25 - description: const Text('This is your public display name.'),
26 - validator: (v) {
27 - if (v.length < 2) return 'Username must be at least 2 characters.';
28 - return null;
29 - },
30 - ),
31 - const SizedBox(height: 16),
32 - ShadButton(
33 - child: const Text('Submit'),
34 - onPressed: () {
35 - if (formKey.currentState!.saveAndValidate()) {
36 - print('value: ${formKey.currentState!.value}');
37 - } else {
38 - print('validation failed');
39 - }
40 - },
41 - ),
42 - ],
43 - ),
44 -)
45 -```
46 -
47 -### Submit and get value
48 -
49 -```dart
50 -ShadButton(
51 - child: const Text('Submit'),
52 - onPressed: () {
53 - final formState = formKey.currentState!;
54 - if (!formState.saveAndValidate()) return;
55 - print('Form value: ${formState.value}');
56 - },
57 -),
58 -```
59 -
60 -### Initial value
61 -
62 -Set default values with `initialValue` on `ShadForm`:
63 -
64 -```dart
65 -ShadForm(
66 - initialValue: {
67 - 'username': 'john_doe',
68 - 'email': 'john_doe@example.com',
69 - },
70 - child: // form fields with matching ids
71 -)
72 -```
73 -
74 -### Set field or full value
75 -
76 -- Single field: `formKey.currentState!.setFieldValue('username', 'new_username');` (use `notifyField: false` to skip updating the field UI).
77 -- Entire form: `formKey.currentState!.setValue({...});` (use `notifyFields: false` to skip updating fields).
78 -
79 -### Value transformers
80 -
81 -Use `fromValueTransformer` and `toValueTransformer` on form fields when the form value type differs from the field type (e.g. form stores string, field uses `DateTime`):
82 -
83 -```dart
84 -ShadDatePickerFormField(
85 - id: 'date',
86 - fromValueTransformer: (value) => DateTime.tryParse(value ?? ''),
87 - toValueTransformer: (date) =>
88 - date == null ? null : DateFormat('yyyy-MM-dd').format(date),
89 - ...
90 -)
91 -```
92 -
93 -### Dot notation for nested values
94 -
95 -Field IDs like `user.name` or `profile.settings.theme` produce nested maps in `formKey.currentState!.value`, e.g. `{'user': {'name': '...', 'email': '...'}}`. Provide `initialValue` as a nested map (not dot-notation keys). Customize separator with `fieldIdSeparator` (e.g. `'/'`); set `fieldIdSeparator: null` to disable nesting and keep flat keys.
96 -
97 -## Additional resources
98 -
99 -- Full details on initial value, setFieldValue/setValue, value transformers, and dot notation: [reference.md](reference.md)
100 -- Form field examples: Checkbox, Switch, Input, Select, RadioGroup, DatePicker, TimePicker component docs/skills.
.agent/skills/shadcn_ui-form/reference.md deleted
-47
@@ -1,47 +0,0 @@
1 -# Shadcn UI Form — Reference
2 -
3 -## Initial form value
4 -
5 -All form fields with matching `id`s are initialized from `ShadForm`'s `initialValue` map. Fields with their own `initialValue` override the form's.
6 -
7 -## Get the form value
8 -
9 -`formKey.currentState!.value` returns `Map<String, dynamic>`. Use after a successful `saveAndValidate()`.
10 -
11 -## setFieldValue
12 -
13 -`formKey.currentState!.setFieldValue('username', 'new_username');`
14 -
15 -- Pass `notifyField: false` to update only the form value, not the field UI.
16 -
17 -## setValue
18 -
19 -`formKey.currentState!.setValue({ 'username': '...', 'email': '...' });`
20 -
21 -- Pass `notifyFields: false` to update only the form value, not the fields UI.
22 -
23 -## Value transformers
24 -
25 -- **fromValueTransformer**: Converts form value (e.g. string) to field value (e.g. DateTime).
26 -- **toValueTransformer**: Converts field value back to form value for `value` and validation.
27 -
28 -Example: form has `{'date': '2024-02-01'}`; `ShadDatePickerFormField` needs `DateTime`. Use `fromValueTransformer: (value) => DateTime.tryParse(value ?? '')` and `toValueTransformer: (date) => date == null ? null : DateFormat('yyyy-MM-dd').format(date)`.
29 -
30 -## Dot notation
31 -
32 -- IDs like `user.email` or `profile.settings.theme` create nested maps in `value`.
33 -- `initialValue` must be nested: `{'user': {'name': 'John', 'email': '...'}}`.
34 -- Custom separator: `ShadForm(fieldIdSeparator: '/', ...)` then use `user/name`.
35 -- Disable: `ShadForm(fieldIdSeparator: null, ...)` so `user.email` stays a flat key.
36 -
37 -## Form field components
38 -
39 -Use inside `ShadForm` with unique `id` and optional `validator`:
40 -
41 -- ShadInputFormField
42 -- ShadCheckboxFormField
43 -- ShadSwitchFormField
44 -- ShadSelectFormField
45 -- ShadRadioGroupFormField
46 -- ShadDatePickerFormField / ShadDateRangePickerFormField
47 -- ShadTimePickerFormField
.agent/skills/shadcn_ui-getting-started/SKILL.md deleted
-122
@@ -1,122 +0,0 @@
1 ----
2 -name: shadcn_ui-getting-started
3 -description: Install and set up Flutter Shadcn UI (shadcn_ui), configure ShadApp with Material or Cupertino, and use bundled packages. Use when starting a Flutter project with shadcn_ui, adding shadcn_ui dependency, or integrating Shadcn with MaterialApp/CupertinoApp.
4 ----
5 -
6 -# Shadcn UI for Flutter — Getting Started
7 -
8 -## Instructions
9 -
10 -### Installation
11 -
12 -From the project root:
13 -
14 -```bash
15 -flutter pub add shadcn_ui
16 -```
17 -
18 -Or add to `pubspec.yaml`:
19 -
20 -```yaml
21 -dependencies:
22 - shadcn_ui: ^0.2.4 # use latest version
23 -```
24 -
25 -### Shadcn only (pure)
26 -
27 -Use `ShadApp` for apps that use only Shadcn UI components (no Material/Cupertino):
28 -
29 -```dart
30 -import 'package:shadcn_ui/shadcn_ui.dart';
31 -
32 -void main() {
33 - runApp(const MyApp());
34 -}
35 -
36 -class MyApp extends StatelessWidget {
37 - const MyApp({super.key});
38 -
39 - @override
40 - Widget build(BuildContext context) {
41 - return ShadApp();
42 - }
43 -}
44 -```
45 -
46 -For declarative routing use `ShadApp.router`.
47 -
48 -### Shadcn + Material
49 -
50 -Use `ShadApp.custom` with `appBuilder` to wrap `MaterialApp` and use shadcn and Material together. Wrap the app with `ShadAppBuilder` in the builder:
51 -
52 -```dart
53 -import 'package:shadcn_ui/shadcn_ui.dart';
54 -import 'package:flutter/material.dart';
55 -
56 -return ShadApp.custom(
57 - themeMode: ThemeMode.dark,
58 - darkTheme: ShadThemeData(
59 - brightness: Brightness.dark,
60 - colorScheme: const ShadSlateColorScheme.dark(),
61 - ),
62 - appBuilder: (context) {
63 - return MaterialApp(
64 - theme: Theme.of(context),
65 - builder: (context, child) {
66 - return ShadAppBuilder(child: child!);
67 - },
68 - );
69 - },
70 -);
71 -```
72 -
73 -Use `MaterialApp.router` when using the Router API.
74 -
75 -ShadApp builds a default Material `ThemeData` from `ShadThemeData` (fontFamily, extensions, colorScheme mapping, dividerTheme, textSelectionTheme, iconTheme, scrollbarTheme). Override with `Theme.of(context).copyWith(...)` without losing shadcn defaults.
76 -
77 -### Shadcn + Cupertino
78 -
79 -Use `CupertinoApp` inside `appBuilder` for Cupertino + shadcn:
80 -
81 -```dart
82 -import 'package:shadcn_ui/shadcn_ui.dart';
83 -import 'package:flutter/cupertino.dart';
84 -import 'package:flutter_localizations/flutter_localizations.dart';
85 -
86 -return ShadApp.custom(
87 - themeMode: ThemeMode.dark,
88 - darkTheme: ShadThemeData(
89 - brightness: Brightness.dark,
90 - colorScheme: const ShadSlateColorScheme.dark(),
91 - ),
92 - appBuilder: (context) {
93 - return CupertinoApp(
94 - theme: CupertinoTheme.of(context),
95 - localizationsDelegates: const [
96 - DefaultMaterialLocalizations.delegate,
97 - DefaultCupertinoLocalizations.delegate,
98 - DefaultWidgetsLocalizations.delegate,
99 - ],
100 - builder: (context, child) {
101 - return ShadAppBuilder(child: child!);
102 - },
103 - );
104 - },
105 -);
106 -```
107 -
108 -Use `CupertinoApp.router` for Router-based navigation. Override Cupertino theme with `CupertinoTheme.of(context).copyWith(...)`.
109 -
110 -### Bundled packages
111 -
112 -Shadcn UI re-exports these packages; no extra imports needed:
113 -
114 -- **flutter_animate** — Animations; components accept `List<Effect>` for customization.
115 -- **lucide_icons_flutter** — Icons via `LucideIcons` (e.g. `LucideIcons.activity`). Browse at https://lucide.dev/icons/
116 -- **two_dimensional_scrollables** — Used by `ShadTable`.
117 -- **intl** — i18n and message translation.
118 -- **universal_image** — Multiple image formats; used by `ShadAvatar`.
119 -
120 -### Submit your app
121 -
122 -To add your app to the showcase: [open the GitHub template](https://github.com/nank1ro/flutter-shadcn-ui/issues/new?template=docs-add-app.yaml) and fill the form.
.agent/skills/shadcn_ui-icon-button/SKILL.md deleted
-60
@@ -1,60 +0,0 @@
1 ----
2 -name: shadcn_ui-icon-button
3 -description: Use ShadIconButton and variants (primary, secondary, destructive, outline, ghost); loading state, gradient and shadow. Use when adding icon-only buttons or icon CTAs in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Icon Button
7 -
8 -## Instructions
9 -
10 -`ShadIconButton` displays an icon button. Variants: default (primary), `ShadIconButton.secondary`, `ShadIconButton.destructive`, `ShadIconButton.outline`, `ShadIconButton.ghost`. Use `icon` and `onPressed`; optional `iconSize`, `padding`; support gradient and shadows.
11 -
12 -### Variants
13 -
14 -```dart
15 -ShadIconButton(
16 - onPressed: () => print('Primary'),
17 - icon: const Icon(LucideIcons.rocket),
18 -)
19 -
20 -ShadIconButton.secondary(icon: const Icon(LucideIcons.rocket), onPressed: () {})
21 -
22 -ShadIconButton.destructive(icon: const Icon(LucideIcons.rocket), onPressed: () {})
23 -
24 -ShadIconButton.outline(icon: const Icon(LucideIcons.rocket), onPressed: () {})
25 -
26 -ShadIconButton.ghost(icon: const Icon(LucideIcons.rocket), onPressed: () {})
27 -```
28 -
29 -### Loading
30 -
31 -Use a small `CircularProgressIndicator` as `icon`:
32 -
33 -```dart
34 -ShadIconButton(
35 - icon: SizedBox.square(
36 - dimension: 16,
37 - child: CircularProgressIndicator(
38 - strokeWidth: 2,
39 - color: ShadTheme.of(context).colorScheme.primaryForeground,
40 - ),
41 - ),
42 -)
43 -```
44 -
45 -### Gradient and shadow
46 -
47 -```dart
48 -ShadIconButton(
49 - gradient: const LinearGradient(colors: [Colors.cyan, Colors.indigo]),
50 - shadows: [
51 - BoxShadow(
52 - color: Colors.blue.withValues(alpha: .4),
53 - spreadRadius: 4,
54 - blurRadius: 10,
55 - offset: const Offset(0, 2),
56 - ),
57 - ],
58 - icon: const Icon(LucideIcons.rocket),
59 -)
60 -```
.agent/skills/shadcn_ui-input-otp/SKILL.md deleted
-93
@@ -1,93 +0,0 @@
1 ----
2 -name: shadcn_ui-input-otp
3 -description: Build OTP input with ShadInputOTP, ShadInputOTPGroup, ShadInputOTPSlot; maxLength, inputFormatters, ShadInputOTPFormField. Use when adding one-time password or verification code inputs in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Input OTP
7 -
8 -## Instructions
9 -
10 -`ShadInputOTP` is an accessible one-time password component with copy-paste support. Use `children` to build the layout: `ShadInputOTPGroup` containing `ShadInputOTPSlot`s, with optional separators (e.g. `Icon(LucideIcons.dot)`). Set `maxLength`; use `onChanged` for the full OTP string. Restrict input with `keyboardType` and `inputFormatters` (e.g. `FilteringTextInputFormatter.digitsOnly`). For forms use `ShadInputOTPFormField` with `id`, `label`, `validator`.
11 -
12 -### Basic
13 -
14 -```dart
15 -ShadInputOTP(
16 - onChanged: (v) => print('OTP: $v'),
17 - maxLength: 6,
18 - children: const [
19 - ShadInputOTPGroup(
20 - children: [
21 - ShadInputOTPSlot(),
22 - ShadInputOTPSlot(),
23 - ShadInputOTPSlot(),
24 - ],
25 - ),
26 - Icon(size: 24, LucideIcons.dot),
27 - ShadInputOTPGroup(
28 - children: [
29 - ShadInputOTPSlot(),
30 - ShadInputOTPSlot(),
31 - ShadInputOTPSlot(),
32 - ],
33 - ),
34 - ],
35 -)
36 -```
37 -
38 -### With input formatters (digits only)
39 -
40 -```dart
41 -ShadInputOTP(
42 - onChanged: (v) => print('OTP: $v'),
43 - maxLength: 4,
44 - keyboardType: TextInputType.number,
45 - inputFormatters: [
46 - FilteringTextInputFormatter.digitsOnly,
47 - ],
48 - children: const [
49 - ShadInputOTPGroup(
50 - children: [
51 - ShadInputOTPSlot(),
52 - ShadInputOTPSlot(),
53 - ShadInputOTPSlot(),
54 - ShadInputOTPSlot(),
55 - ],
56 - ),
57 - ],
58 -)
59 -```
60 -
61 -The package also provides `UpperCaseTextInputFormatter` and `LowerCaseTextInputFormatter`.
62 -
63 -### Form field
64 -
65 -```dart
66 -ShadInputOTPFormField(
67 - id: 'otp',
68 - maxLength: 6,
69 - label: const Text('OTP'),
70 - description: const Text('Enter your OTP.'),
71 - validator: (v) {
72 - if (v.contains(' ')) return 'Fill the whole OTP code';
73 - return null;
74 - },
75 - children: const [
76 - ShadInputOTPGroup(
77 - children: [
78 - ShadInputOTPSlot(),
79 - ShadInputOTPSlot(),
80 - ShadInputOTPSlot(),
81 - ],
82 - ),
83 - Icon(size: 24, LucideIcons.dot),
84 - ShadInputOTPGroup(
85 - children: [
86 - ShadInputOTPSlot(),
87 - ShadInputOTPSlot(),
88 - ShadInputOTPSlot(),
89 - ],
90 - ),
91 - ],
92 -)
93 -```
.agent/skills/shadcn_ui-input/SKILL.md deleted
-59
@@ -1,59 +0,0 @@
1 ----
2 -name: shadcn_ui-input
3 -description: Use ShadInput for text fields; placeholder, leading/trailing widgets, obscureText; ShadInputFormField for forms with validation. Use when adding text inputs, email/password fields, or form input fields in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Input
7 -
8 -## Instructions
9 -
10 -`ShadInput` displays a form input or input-like component. Use `placeholder`, `initialValue`, `keyboardType`, `obscureText`; optional `leading` and `trailing` widgets. For forms use `ShadInputFormField` with `id`, `label`, `description`, `validator`.
11 -
12 -### Basic
13 -
14 -```dart
15 -const ShadInput(
16 - placeholder: Text('Email'),
17 - keyboardType: TextInputType.emailAddress,
18 -)
19 -```
20 -
21 -### With leading and trailing
22 -
23 -Example: password with toggle visibility:
24 -
25 -```dart
26 -ShadInput(
27 - placeholder: const Text('Password'),
28 - obscureText: obscure,
29 - leading: Icon(LucideIcons.lock),
30 - trailing: SizedBox.square(
31 - dimension: 24,
32 - child: OverflowBox(
33 - maxWidth: 28,
34 - maxHeight: 28,
35 - child: ShadIconButton(
36 - iconSize: 20,
37 - padding: EdgeInsets.all(2),
38 - icon: Icon(obscure ? LucideIcons.eyeOff : LucideIcons.eye),
39 - onPressed: () => setState(() => obscure = !obscure),
40 - ),
41 - ),
42 - ),
43 -)
44 -```
45 -
46 -### Form field
47 -
48 -```dart
49 -ShadInputFormField(
50 - id: 'username',
51 - label: const Text('Username'),
52 - placeholder: const Text('Enter your username'),
53 - description: const Text('This is your public display name.'),
54 - validator: (v) {
55 - if (v.length < 2) return 'Username must be at least 2 characters.';
56 - return null;
57 - },
58 -)
59 -```
.agent/skills/shadcn_ui-menubar/SKILL.md deleted
-70
@@ -1,70 +0,0 @@
1 ----
2 -name: shadcn_ui-menubar
3 -description: Build desktop-style menubars with ShadMenubar and ShadMenubarItem; nested items, ShadContextMenuItem, dividers. Use when adding a persistent top menu (File, Edit, View, etc.) in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Menubar
7 -
8 -## Instructions
9 -
10 -`ShadMenubar` is a visually persistent menu (e.g. File, Edit, View). Each top-level entry is a `ShadMenubarItem` with `child` (label) and `items` (list of menu entries). Use `ShadContextMenuItem` and `ShadContextMenuItem.inset` for entries; use `ShadSeparator.horizontal` or `Divider(height: 8)` for dividers. Nest `ShadContextMenuItem` with `items` for submenus; use `trailing: Icon(LucideIcons.chevronRight)` on parent. Set `enabled: false` to disable an item.
11 -
12 -### Structure
13 -
14 -```dart
15 -ShadMenubar(
16 - items: [
17 - ShadMenubarItem(
18 - items: [
19 - const ShadContextMenuItem(child: Text('New Tab')),
20 - const ShadContextMenuItem(child: Text('New Window')),
21 - const ShadContextMenuItem(
22 - enabled: false,
23 - child: Text('New Incognito Window'),
24 - ),
25 - divider,
26 - const ShadContextMenuItem(
27 - trailing: Icon(LucideIcons.chevronRight),
28 - items: [
29 - ShadContextMenuItem(child: Text('Email Link')),
30 - ShadContextMenuItem(child: Text('Messages')),
31 - ],
32 - child: Text('Share'),
33 - ),
34 - divider,
35 - const ShadContextMenuItem(child: Text('Print...')),
36 - ],
37 - child: const Text('File'),
38 - ),
39 - ShadMenubarItem(
40 - items: [
41 - const ShadContextMenuItem(child: Text('Undo')),
42 - const ShadContextMenuItem(child: Text('Redo')),
43 - divider,
44 - ShadContextMenuItem(
45 - trailing: const Icon(LucideIcons.chevronRight),
46 - items: [
47 - const ShadContextMenuItem(child: Text('Find...')),
48 - const ShadContextMenuItem(child: Text('Find Next')),
49 - ],
50 - child: const Text('Find'),
51 - ),
52 - divider,
53 - const ShadContextMenuItem(child: Text('Cut')),
54 - const ShadContextMenuItem(child: Text('Copy')),
55 - const ShadContextMenuItem(child: Text('Paste')),
56 - ],
57 - child: const Text('Edit'),
58 - ),
59 - ShadMenubarItem(
60 - items: [
61 - const ShadContextMenuItem.inset(child: Text('Reload')),
62 - const ShadContextMenuItem.inset(child: Text('Toggle Full Screen')),
63 - ],
64 - child: const Text('View'),
65 - ),
66 - ],
67 -)
68 -```
69 -
70 -Create a reusable `divider` with `ShadSeparator.horizontal(margin: const EdgeInsets.symmetric(vertical: 4), color: theme.colorScheme.muted)`.
.agent/skills/shadcn_ui-popover/SKILL.md deleted
-41
@@ -1,41 +0,0 @@
1 ----
2 -name: shadcn_ui-popover
3 -description: Show rich content in a popover with ShadPopover, ShadPopoverController; trigger button, toggle. Use when adding popovers, floating panels, or button-triggered overlay content in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Popover
7 -
8 -## Instructions
9 -
10 -`ShadPopover` displays rich content in a portal, triggered by a button (or other trigger). Use a `ShadPopoverController()` to control open/close; call `popoverController.toggle` from the trigger. Pass `popover: (context) => ...` returning the overlay widget (e.g. a `SizedBox` with form fields); `child` is the trigger widget.
11 -
12 -### Basic usage
13 -
14 -```dart
15 -final popoverController = ShadPopoverController();
16 -
17 -// dispose: popoverController.dispose();
18 -
19 -ShadPopover(
20 - controller: popoverController,
21 - popover: (context) => SizedBox(
22 - width: 288,
23 - child: Column(
24 - crossAxisAlignment: CrossAxisAlignment.start,
25 - mainAxisSize: MainAxisSize.min,
26 - children: [
27 - Text('Dimensions', style: textTheme.h4),
28 - Text('Set the dimensions for the layer.', style: textTheme.p),
29 - const SizedBox(height: 4),
30 - // ... form rows with ShadInput, etc.
31 - ],
32 - ),
33 - ),
34 - child: ShadButton.outline(
35 - onPressed: popoverController.toggle,
36 - child: const Text('Open popover'),
37 - ),
38 -)
39 -```
40 -
41 -Dispose the controller in `State.dispose`.
.agent/skills/shadcn_ui-progress/SKILL.md deleted
-29
@@ -1,29 +0,0 @@
1 ----
2 -name: shadcn_ui-progress
3 -description: Show progress with ShadProgress; determinate (value 0–1) or indeterminate. Use when displaying task completion or loading progress in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Progress
7 -
8 -## Instructions
9 -
10 -`ShadProgress` displays completion progress, typically as a progress bar. Use determinate mode with a `value` (0.0–1.0); omit `value` for indeterminate (animated) progress.
11 -
12 -### Determinate
13 -
14 -```dart
15 -ConstrainedBox(
16 - constraints: BoxConstraints(
17 - maxWidth: MediaQuery.sizeOf(context).width * 0.6,
18 - ),
19 - child: const ShadProgress(value: 0.5),
20 -)
21 -```
22 -
23 -### Indeterminate
24 -
25 -```dart
26 -const ShadProgress()
27 -```
28 -
29 -Constrain width with `ConstrainedBox` or parent layout as needed.
.agent/skills/shadcn_ui-radio-group/SKILL.md deleted
-42
@@ -1,42 +0,0 @@
1 ----
2 -name: shadcn_ui-radio-group
3 -description: Use ShadRadioGroup and ShadRadio for single-choice options; ShadRadioGroupFormField for forms. Use when adding radio buttons or single-select options in a Flutter shadcn_ui app or ShadForm.
4 ----
5 -
6 -# Shadcn UI — Radio Group
7 -
8 -## Instructions
9 -
10 -`ShadRadioGroup<T>` is a set of radio buttons where at most one can be selected. Provide `items` as a list of `ShadRadio<T>` with `value` and `label`. Use `ShadRadioGroupFormField<T>` inside `ShadForm` with `id`, `label`, `items`, and `validator`.
11 -
12 -### Standalone
13 -
14 -```dart
15 -ShadRadioGroup<String>(
16 - items: [
17 - ShadRadio(label: Text('Default'), value: 'default'),
18 - ShadRadio(label: Text('Comfortable'), value: 'comfortable'),
19 - ShadRadio(label: Text('Nothing'), value: 'nothing'),
20 - ],
21 -)
22 -```
23 -
24 -### Form field
25 -
26 -```dart
27 -enum NotifyAbout { all, mentions, nothing; }
28 -
29 -ShadRadioGroupFormField<NotifyAbout>(
30 - label: const Text('Notify me about'),
31 - items: NotifyAbout.values.map(
32 - (e) => ShadRadio(
33 - value: e,
34 - label: Text(e.message),
35 - ),
36 - ),
37 - validator: (v) {
38 - if (v == null) return 'You need to select a notification type.';
39 - return null;
40 - },
41 -)
42 -```
.agent/skills/shadcn_ui-resizable/SKILL.md deleted
-81
@@ -1,81 +0,0 @@
1 ----
2 -name: shadcn_ui-resizable
3 -description: Build resizable panel layouts with ShadResizablePanelGroup and ShadResizablePanel; horizontal/vertical axis, defaultSize, minSize, maxSize, showHandle. Use when adding resizable split panes or panel groups in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Resizable
7 -
8 -## Instructions
9 -
10 -`ShadResizablePanelGroup` contains `ShadResizablePanel` children. Each panel has `id`, `defaultSize` (fraction 0–1), optional `minSize` and `maxSize`, and `child`. Use `axis: Axis.vertical` for vertical splits. Nest `ShadResizablePanelGroup` inside a panel for nested layouts. Set `showHandle: true` to show the resize handle; optional `handleIcon` or `handleIconSrc` to customize. Double-click the handle to reset to default size.
11 -
12 -### Basic horizontal
13 -
14 -```dart
15 -ShadResizablePanelGroup(
16 - children: [
17 - ShadResizablePanel(
18 - id: 0,
19 - defaultSize: .5,
20 - minSize: .2,
21 - maxSize: .8,
22 - child: Center(child: Text('One', style: theme.textTheme.large)),
23 - ),
24 - ShadResizablePanel(
25 - id: 1,
26 - defaultSize: .5,
27 - child: ShadResizablePanelGroup(
28 - axis: Axis.vertical,
29 - children: [
30 - ShadResizablePanel(
31 - id: 0,
32 - defaultSize: .3,
33 - child: Center(child: Text('Two', style: theme.textTheme.large)),
34 - ),
35 - ShadResizablePanel(
36 - id: 1,
37 - defaultSize: .7,
38 - child: Align(child: Text('Three', style: theme.textTheme.large)),
39 - ),
40 - ],
41 - ),
42 - ),
43 - ],
44 -)
45 -```
46 -
47 -### Vertical
48 -
49 -```dart
50 -ShadResizablePanelGroup(
51 - axis: Axis.vertical,
52 - children: [
53 - ShadResizablePanel(
54 - id: 0,
55 - defaultSize: 0.3,
56 - minSize: 0.1,
57 - child: Center(child: Text('Header', style: theme.textTheme.large)),
58 - ),
59 - ShadResizablePanel(
60 - id: 1,
61 - defaultSize: 0.7,
62 - minSize: 0.1,
63 - child: Center(child: Text('Footer', style: theme.textTheme.large)),
64 - ),
65 - ],
66 -)
67 -```
68 -
69 -### With visible handle
70 -
71 -```dart
72 -ShadResizablePanelGroup(
73 - showHandle: true,
74 - children: [
75 - ShadResizablePanel(id: 0, defaultSize: .5, minSize: .2, child: ...),
76 - ShadResizablePanel(id: 1, defaultSize: .5, minSize: .2, child: ...),
77 - ],
78 -)
79 -```
80 -
81 -Wrap the group in a bordered container (e.g. `DecoratedBox` + `ClipRRect` with `theme.radius`) for a clean look.
.agent/skills/shadcn_ui-responsive/SKILL.md deleted
-65
@@ -1,65 +0,0 @@
1 ----
2 -name: shadcn_ui-responsive
3 -description: Use Shadcn UI breakpoints and responsive layout with ShadBreakpoints, ShadResponsiveBuilder, and context.breakpoint. Use when building responsive Flutter shadcn_ui layouts, adapting UI to screen size, or checking current breakpoint (tn, sm, md, lg, xl, xxl).
4 ----
5 -
6 -# Shadcn UI — Responsive
7 -
8 -## Instructions
9 -
10 -Responsiveness is built into shadcn_ui via `ShadThemeData.breakpoints`. Use `ShadResponsiveBuilder` or `context.breakpoint` to branch on the current breakpoint.
11 -
12 -### Default breakpoints
13 -
14 -```dart
15 -ShadThemeData(
16 - breakpoints: ShadBreakpoints(
17 - tn: 0, // tiny
18 - sm: 640, // small
19 - md: 768, // medium
20 - lg: 1024, // large
21 - xl: 1280, // extra large
22 - xxl: 1536, // extra extra large
23 - ),
24 -);
25 -```
26 -
27 -### Current breakpoint
28 -
29 -**With ShadResponsiveBuilder:**
30 -
31 -```dart
32 -ShadResponsiveBuilder(
33 - builder: (context, breakpoint) {
34 - final sm = breakpoint >= ShadTheme.of(context).breakpoints.sm;
35 - // ...
36 - },
37 -),
38 -```
39 -
40 -**With context (equivalent):**
41 -
42 -```dart
43 -final sm = context.breakpoint >= ShadTheme.of(context).breakpoints.sm;
44 -```
45 -
46 -Use `>=` so that e.g. "sm" applies to small and larger viewports (Tailwind-style). Use `==` only when you need to match a single breakpoint.
47 -
48 -### Sealed class switch
49 -
50 -The breakpoint is a sealed type; you can switch on it:
51 -
52 -```dart
53 -ShadResponsiveBuilder(
54 - builder: (context, breakpoint) {
55 - return switch (breakpoint) {
56 - ShadBreakpointTN() => const Text('Tiny'),
57 - ShadBreakpointSM() => const Text('Small'),
58 - ShadBreakpointMD() => const Text('Medium'),
59 - ShadBreakpointLG() => const Text('Large'),
60 - ShadBreakpointXL() => const Text('Extra Large'),
61 - ShadBreakpointXXL() => const Text('Extra Extra Large'),
62 - };
63 - },
64 -),
65 -```
.agent/skills/shadcn_ui-select/SKILL.md deleted
-68
@@ -1,68 +0,0 @@
1 ----
2 -name: shadcn_ui-select
3 -description: Use ShadSelect for dropdown option lists; ShadOption, placeholder, selectedOptionBuilder, scrollable groups, ShadSelect.withSearch, ShadSelect.multiple, ShadSelectFormField. Use when adding dropdowns, single/multi select, or searchable select in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Select
7 -
8 -## Instructions
9 -
10 -`ShadSelect<T>` displays a list of options triggered by a button. Provide `options` (list of `ShadOption<T>` or section headers like `Padding` with text), `placeholder`, `selectedOptionBuilder: (context, value) => ...`, and `onChanged`. Use `initialValue` or controlled state for selected value. Set `minWidth`/`maxWidth`/`maxHeight` as needed. For forms use `ShadSelectFormField<T>` with `id`, `validator`. Use `allowDeselection: true` to allow clearing the selection.
11 -
12 -### Basic
13 -
14 -```dart
15 -final fruits = {'apple': 'Apple', 'banana': 'Banana', ...};
16 -
17 -ShadSelect<String>(
18 - placeholder: const Text('Select a fruit'),
19 - options: [
20 - Padding(
21 - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 6),
22 - child: Text(
23 - 'Fruits',
24 - style: theme.textTheme.muted.copyWith(
25 - fontWeight: FontWeight.w600,
26 - color: theme.colorScheme.popoverForeground,
27 - ),
28 - textAlign: TextAlign.start,
29 - ),
30 - ),
31 - ...fruits.entries.map((e) => ShadOption(value: e.key, child: Text(e.value))),
32 - ],
33 - selectedOptionBuilder: (context, value) => Text(fruits[value]!),
34 - onChanged: print,
35 -)
36 -```
37 -
38 -### Form field
39 -
40 -```dart
41 -ShadSelectFormField<String>(
42 - id: 'email',
43 - minWidth: 350,
44 - initialValue: null,
45 - options: verifiedEmails
46 - .map((email) => ShadOption(value: email, child: Text(email)))
47 - .toList(),
48 - selectedOptionBuilder: (context, value) =>
49 - value == 'none' ? const Text('Select a verified email to display') : Text(value),
50 - placeholder: const Text('Select a verified email to display'),
51 - validator: (v) {
52 - if (v == null) return 'Please select an email to display';
53 - return null;
54 - },
55 -)
56 -```
57 -
58 -### With search
59 -
60 -Use `ShadSelect.withSearch`. Pass `onSearchChanged`, `searchPlaceholder`, and filter options in state (e.g. wrap options in `Offstage(offstage: !filtered.containsKey(key), child: ShadOption(...))` to avoid focus loss when results change).
61 -
62 -### Multiple
63 -
64 -Use `ShadSelect.multiple`. Pass `selectedOptionsBuilder: (context, values) => ...`, `onChanged`, and optionally `allowDeselection: true`, `closeOnSelect: false` to keep popover open after selection.
65 -
66 -## Additional resources
67 -
68 -Scrollable option lists (grouped sections) and full search/multiple examples: [reference.md](reference.md).
.agent/skills/shadcn_ui-select/reference.md deleted
-48
@@ -1,48 +0,0 @@
1 -# Shadcn UI Select — Reference
2 -
3 -## Scrollable / grouped options
4 -
5 -Build `options` as a list of section headers (`Padding` with styled `Text`) followed by `ShadOption` widgets for that section. For large lists the select popover scrolls. Example for timezones by region:
6 -
7 -```dart
8 -List<Widget> getTimezonesWidgets(ShadThemeData theme) {
9 - final widgets = <Widget>[];
10 - for (final zone in timezones.entries) {
11 - widgets.add(
12 - Padding(
13 - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 6),
14 - child: Text(
15 - zone.key,
16 - style: theme.textTheme.muted.copyWith(
17 - fontWeight: FontWeight.w600,
18 - color: theme.colorScheme.popoverForeground,
19 - ),
20 - textAlign: TextAlign.start,
21 - ),
22 - ),
23 - );
24 - widgets.addAll(zone.value.entries
25 - .map((e) => ShadOption(value: e.key, child: Text(e.value))));
26 - }
27 - return widgets;
28 -}
29 -
30 -ShadSelect<String>(
31 - placeholder: const Text('Select a timezone'),
32 - options: getTimezonesWidgets(theme),
33 - selectedOptionBuilder: (context, value) {
34 - final timezone = timezones.entries
35 - .firstWhere((element) => element.value.containsKey(value))
36 - .value[value];
37 - return Text(timezone!);
38 - },
39 -)
40 -```
41 -
42 -## With search
43 -
44 -Use `ShadSelect<String>.withSearch`, maintain `searchValue` in state, compute `filteredFrameworks` (or similar), and pass `onSearchChanged: (value) => setState(() => searchValue = value)`. In `options`, show "No results" when filtered is empty; otherwise map entries and wrap each `ShadOption` in `Offstage(offstage: !filtered.containsKey(key), child: ShadOption(...))` so the widget stays in the tree and focus is preserved.
45 -
46 -## Multiple selection
47 -
48 -Use `ShadSelect<T>.multiple`. Provide `selectedOptionsBuilder: (context, values) => Text(values.join(', '))` (or similar), `onChanged`, and optionally `allowDeselection: true`, `closeOnSelect: false`. Tap outside the popover to close it.
.agent/skills/shadcn_ui-separator/SKILL.md deleted
-30
@@ -1,30 +0,0 @@
1 ----
2 -name: shadcn_ui-separator
3 -description: Visually separate content with ShadSeparator.horizontal and ShadSeparator.vertical; thickness, margin, radius. Use when adding dividers or visual separation in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Separator
7 -
8 -## Instructions
9 -
10 -`ShadSeparator` visually or semantically separates content. Use `ShadSeparator.horizontal` for a horizontal line (e.g. between rows); use `ShadSeparator.vertical` for a vertical line (e.g. between columns). Optional: `thickness`, `margin`, `radius`, `color`.
11 -
12 -### Horizontal
13 -
14 -```dart
15 -const ShadSeparator.horizontal(
16 - thickness: 4,
17 - margin: EdgeInsets.symmetric(horizontal: 20),
18 - radius: BorderRadius.all(Radius.circular(4)),
19 -)
20 -```
21 -
22 -### Vertical
23 -
24 -```dart
25 -const ShadSeparator.vertical(
26 - thickness: 4,
27 - margin: EdgeInsets.symmetric(vertical: 20),
28 - radius: BorderRadius.all(Radius.circular(4)),
29 -)
30 -```
.agent/skills/shadcn_ui-sheet/SKILL.md deleted
-61
@@ -1,61 +0,0 @@
1 ----
2 -name: shadcn_ui-sheet
3 -description: Show slide-out panels with showShadSheet and ShadSheet; side (top, right, bottom, left), title, description, actions, child. Use when adding side panels, drawers, or slide-over content in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Sheet
7 -
8 -## Instructions
9 -
10 -Sheets extend the dialog pattern to display content from an edge of the screen. Use `showShadSheet(context: context, side: ShadSheetSide.*, builder: (context) => ShadSheet(...))`. `side` can be `ShadSheetSide.top`, `ShadSheetSide.right`, `ShadSheetSide.bottom`, or `ShadSheetSide.left`. Return a `ShadSheet` with optional `title`, `description`, `child` (body), and `actions`. Use `constraints` (e.g. `BoxConstraints(maxWidth: 512)` for left/right) to limit width or height.
11 -
12 -### Basic (right side)
13 -
14 -```dart
15 -showShadSheet(
16 - side: ShadSheetSide.right,
17 - context: context,
18 - builder: (context) => ShadSheet(
19 - constraints: const BoxConstraints(maxWidth: 512),
20 - title: const Text('Edit Profile'),
21 - description: const Text(
22 - "Make changes to your profile here. Click save when you're done",
23 - ),
24 - child: Padding(
25 - padding: const EdgeInsets.symmetric(vertical: 20),
26 - child: Column(
27 - mainAxisSize: MainAxisSize.min,
28 - crossAxisAlignment: CrossAxisAlignment.stretch,
29 - spacing: 16,
30 - children: profile
31 - .map(
32 - (p) => Row(
33 - children: [
34 - Expanded(
35 - child: Text(
36 - p.title,
37 - textAlign: TextAlign.end,
38 - style: theme.textTheme.small,
39 - ),
40 - ),
41 - const SizedBox(width: 16),
42 - Expanded(
43 - flex: 5,
44 - child: ShadInput(initialValue: p.value),
45 - ),
46 - ],
47 - ),
48 - )
49 - .toList(),
50 - ),
51 - ),
52 - actions: const [
53 - ShadButton(child: Text('Save changes')),
54 - ],
55 - ),
56 -);
57 -```
58 -
59 -### All sides
60 -
61 -Use `side: ShadSheetSide.top`, `ShadSheetSide.bottom`, `ShadSheetSide.left`, or `ShadSheetSide.right` in `showShadSheet`. For left/right sheets pass `constraints: const BoxConstraints(maxWidth: 512)` to the `ShadSheet` so content doesn’t stretch full width.
.agent/skills/shadcn_ui-slider/SKILL.md deleted
-21
@@ -1,21 +0,0 @@
1 ----
2 -name: shadcn_ui-slider
3 -description: Use ShadSlider for numeric input within a range; initialValue, max (and min). Use when adding range sliders or numeric selection in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Slider
7 -
8 -## Instructions
9 -
10 -`ShadSlider` lets the user select a value from a range. Set `initialValue` and `max` (and optionally `min`). Use with state or a controller if you need to read the value on change.
11 -
12 -### Basic
13 -
14 -```dart
15 -ShadSlider(
16 - initialValue: 33,
17 - max: 100,
18 -)
19 -```
20 -
21 -Use callbacks or state management to react to value changes when needed.
.agent/skills/shadcn_ui-sonner/SKILL.md deleted
-36
@@ -1,36 +0,0 @@
1 ----
2 -name: shadcn_ui-sonner
3 -description: Show toasts with ShadSonner and ShadToast; ShadSonner.of(context), show/hide, title, description, action. Use when showing toast notifications or ephemeral feedback in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Sonner
7 -
8 -## Instructions
9 -
10 -Sonner is an opinionated toast component. Ensure `ShadSonner` is in the widget tree (e.g. in app builder). Get the controller with `ShadSonner.of(context)`. Call `sonner.show(ShadToast(...))` to show a toast; use `sonner.hide(id)` to dismiss. Each toast can have `id`, `title`, `description`, and optional `action` (e.g. an Undo button).
11 -
12 -### Show toast
13 -
14 -```dart
15 -ShadButton.outline(
16 - child: const Text('Show Toast'),
17 - onPressed: () {
18 - final sonner = ShadSonner.of(context);
19 - final id = Random().nextInt(1000);
20 - final now = DateTime.now();
21 - sonner.show(
22 - ShadToast(
23 - id: id,
24 - title: const Text('Event has been created'),
25 - description: Text(DateFormat.yMd().add_jms().format(now)),
26 - action: ShadButton(
27 - child: const Text('Undo'),
28 - onPressed: () => sonner.hide(id),
29 - ),
30 - ),
31 - );
32 - },
33 -)
34 -```
35 -
36 -Use a unique `id` per toast so you can hide it from the action button or elsewhere.
.agent/skills/shadcn_ui-switch/SKILL.md deleted
-36
@@ -1,36 +0,0 @@
1 ----
2 -name: shadcn_ui-switch
3 -description: Add toggle switches with ShadSwitch and ShadSwitchFormField; label, form validation. Use when adding on/off toggles or switch form fields in a Flutter shadcn_ui app or ShadForm.
4 ----
5 -
6 -# Shadcn UI — Switch
7 -
8 -## Instructions
9 -
10 -`ShadSwitch` is a control that toggles between checked and unchecked. Use `value` and `onChanged`; optional `label`. For forms use `ShadSwitchFormField` with `id`, `initialValue`, `inputLabel`, `inputSublabel`, `validator`.
11 -
12 -### Standalone
13 -
14 -```dart
15 -ShadSwitch(
16 - value: value,
17 - onChanged: (v) => setState(() => value = v),
18 - label: const Text('Airplane Mode'),
19 -)
20 -```
21 -
22 -### Form field
23 -
24 -```dart
25 -ShadSwitchFormField(
26 - id: 'terms',
27 - initialValue: false,
28 - inputLabel: const Text('I accept the terms and conditions'),
29 - onChanged: (v) {},
30 - inputSublabel: const Text('You agree to our Terms and Conditions'),
31 - validator: (v) {
32 - if (!v) return 'You must accept the terms and conditions';
33 - return null;
34 - },
35 -)
36 -```
.agent/skills/shadcn_ui-table/SKILL.md deleted
-69
@@ -1,69 +0,0 @@
1 ----
2 -name: shadcn_ui-table
3 -description: Build tables with ShadTable.list or ShadTable builder; ShadTableCell.header, ShadTableCell.footer, columnSpanExtent (FixedTableSpanExtent, RemainingTableSpanExtent). Use when displaying tabular data or responsive tables in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Table
7 -
8 -## Instructions
9 -
10 -`ShadTable` is a responsive table. Use `ShadTable.list` for small tables (all rows built at once): pass `header`, `footer` (lists of `ShadTableCell.header` / `ShadTableCell.footer`), and `children` (list of row lists of `ShadTableCell`). Use `ShadTable` with `columnCount`, `rowCount`, `header`, `builder`, `footer` for large tables (on-demand building). Use `columnSpanExtent` to set column widths: `FixedTableSpanExtent(130)` or `MaxTableSpanExtent(FixedTableSpanExtent(120), RemainingTableSpanExtent())`.
11 -
12 -### List (small tables)
13 -
14 -```dart
15 -ShadTable.list(
16 - header: const [
17 - ShadTableCell.header(child: Text('Invoice')),
18 - ShadTableCell.header(child: Text('Status')),
19 - ShadTableCell.header(child: Text('Method')),
20 - ShadTableCell.header(
21 - alignment: Alignment.centerRight,
22 - child: Text('Amount'),
23 - ),
24 - ],
25 - footer: const [
26 - ShadTableCell.footer(child: Text('Total')),
27 - ShadTableCell.footer(child: Text('')),
28 - ShadTableCell.footer(child: Text('')),
29 - ShadTableCell.footer(
30 - alignment: Alignment.centerRight,
31 - child: Text(r'$2500.00'),
32 - ),
33 - ],
34 - columnSpanExtent: (index) {
35 - if (index == 2) return const FixedTableSpanExtent(130);
36 - if (index == 3) {
37 - return const MaxTableSpanExtent(
38 - FixedTableSpanExtent(120),
39 - RemainingTableSpanExtent(),
40 - );
41 - }
42 - return null;
43 - },
44 - children: invoices.map(
45 - (invoice) => [
46 - ShadTableCell(
47 - child: Text(
48 - invoice.invoice,
49 - style: const TextStyle(fontWeight: FontWeight.w500),
50 - ),
51 - ),
52 - ShadTableCell(child: Text(invoice.paymentStatus)),
53 - ShadTableCell(child: Text(invoice.paymentMethod)),
54 - ShadTableCell(
55 - alignment: Alignment.centerRight,
56 - child: Text(invoice.totalAmount),
57 - ),
58 - ],
59 - ),
60 -)
61 -```
62 -
63 -### Builder (large tables)
64 -
65 -Use `ShadTable(columnCount:, rowCount:, header: (context, column) => ..., columnSpanExtent: (index) => ..., builder: (context, index) => ShadTableCell(...), footer: (context, column) => ...)`. The builder receives a table index with `row` and `column`. Prefer builder for large data so only visible rows are built.
66 -
67 -## Additional resources
68 -
69 -Detailed column span and builder patterns: [reference.md](reference.md).
.agent/skills/shadcn_ui-table/reference.md deleted
-19
@@ -1,19 +0,0 @@
1 -# Shadcn UI Table — Reference
2 -
3 -## columnSpanExtent
4 -
5 -Return `TableSpanExtent?` per column index:
6 -- `FixedTableSpanExtent(130)` — fixed width.
7 -- `MaxTableSpanExtent(FixedTableSpanExtent(120), RemainingTableSpanExtent())` — min 120, then remaining space.
8 -- `null` — default extent.
9 -
10 -## Builder API
11 -
12 -`ShadTable` with:
13 -- `columnCount`, `rowCount`
14 -- `header: (context, column) => ShadTableCell.header(...)`
15 -- `columnSpanExtent: (index) => ...`
16 -- `builder: (context, index) => ShadTableCell(...)` where `index` has `index.row`, `index.column`
17 -- `footer: (context, column) => ShadTableCell.footer(...)` or empty cell
18 -
19 -Use for large tables so widgets are created on demand.
.agent/skills/shadcn_ui-tabs/SKILL.md deleted
-63
@@ -1,63 +0,0 @@
1 ----
2 -name: shadcn_ui-tabs
3 -description: Build tabbed UIs with ShadTabs and ShadTab; value, tabs (content + child label), tabBarConstraints, contentConstraints. Use when adding tab panels or layered sections in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Tabs
7 -
8 -## Instructions
9 -
10 -`ShadTabs<T>` displays layered sections (tab panels) one at a time. Provide `value` (currently selected tab value), `tabs` (list of `ShadTab<T>`), and optional `tabBarConstraints` and `contentConstraints`. Each `ShadTab` has `value`, `child` (tab label), and `content` (panel widget).
11 -
12 -### Basic
13 -
14 -```dart
15 -ShadTabs<String>(
16 - value: 'account',
17 - tabBarConstraints: const BoxConstraints(maxWidth: 400),
18 - contentConstraints: const BoxConstraints(maxWidth: 400),
19 - tabs: [
20 - ShadTab(
21 - value: 'account',
22 - content: ShadCard(
23 - title: const Text('Account'),
24 - description: const Text(
25 - "Make changes to your account here. Click save when you're done."),
26 - footer: const ShadButton(child: Text('Save changes')),
27 - child: Column(
28 - mainAxisSize: MainAxisSize.min,
29 - children: [
30 - const SizedBox(height: 16),
31 - ShadInputFormField(label: const Text('Name'), initialValue: 'Ale'),
32 - const SizedBox(height: 8),
33 - ShadInputFormField(label: const Text('Username'), initialValue: 'nank1ro'),
34 - const SizedBox(height: 16),
35 - ],
36 - ),
37 - ),
38 - child: const Text('Account'),
39 - ),
40 - ShadTab(
41 - value: 'password',
42 - content: ShadCard(
43 - title: const Text('Password'),
44 - description: const Text(
45 - "Change your password here. After saving, you'll be logged out."),
46 - footer: const ShadButton(child: Text('Save password')),
47 - child: Column(
48 - children: [
49 - const SizedBox(height: 16),
50 - ShadInputFormField(label: const Text('Current password'), obscureText: true),
51 - const SizedBox(height: 8),
52 - ShadInputFormField(label: const Text('New password'), obscureText: true),
53 - const SizedBox(height: 16),
54 - ],
55 - ),
56 - ),
57 - child: const Text('Password'),
58 - ),
59 - ],
60 -)
61 -```
62 -
63 -Use state or a controller to change `value` when the user switches tabs if needed.
.agent/skills/shadcn_ui-textarea/SKILL.md deleted
-34
@@ -1,34 +0,0 @@
1 ----
2 -name: shadcn_ui-textarea
3 -description: Use ShadTextarea for multi-line text input; placeholder. ShadTextareaFormField for forms with validation. Use when adding multi-line text fields or bio/description inputs in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Textarea
7 -
8 -## Instructions
9 -
10 -`ShadTextarea` displays a multi-line form field or textarea-like component. Use `placeholder` and optional `initialValue`. For forms use `ShadTextareaFormField` with `id`, `label`, `placeholder`, `description`, and `validator`.
11 -
12 -### Standalone
13 -
14 -```dart
15 -const ShadTextarea(
16 - placeholder: Text('Type your message here'),
17 -)
18 -```
19 -
20 -### Form field
21 -
22 -```dart
23 -ShadTextareaFormField(
24 - id: 'bio',
25 - label: const Text('Bio'),
26 - placeholder: const Text('Tell us a little bit about yourself'),
27 - description: const Text(
28 - 'You can @mention other users and organizations.'),
29 - validator: (v) {
30 - if (v.length < 10) return 'Bio must be at least 10 characters.';
31 - return null;
32 - },
33 -)
34 -```
.agent/skills/shadcn_ui-theme/SKILL.md deleted
-89
@@ -1,89 +0,0 @@
1 ----
2 -name: shadcn_ui-theme
3 -description: Configure Shadcn UI theme and color schemes (ShadThemeData, ShadColorScheme), override colors, use ShadColorScheme.fromName for theme switchers, and add custom colors. Use when theming a Flutter shadcn_ui app, changing color scheme, or adding custom theme colors.
4 ----
5 -
6 -# Shadcn UI — Theme Data
7 -
8 -## Instructions
9 -
10 -Theme and color scheme are defined by `ShadThemeData` and `ShadColorScheme`. Supported scheme names: blue, gray, green, neutral, orange, red, rose, slate, stone, violet, yellow, zinc.
11 -
12 -### Basic usage
13 -
14 -```dart
15 -import 'package:shadcn_ui/shadcn_ui.dart';
16 -
17 -return ShadApp(
18 - darkTheme: ShadThemeData(
19 - brightness: Brightness.dark,
20 - colorScheme: const ShadSlateColorScheme.dark(),
21 - ),
22 - child: ...,
23 -);
24 -```
25 -
26 -### Override theme properties
27 -
28 -Override specific properties of the color scheme or component themes:
29 -
30 -```dart
31 -ShadApp(
32 - darkTheme: ShadThemeData(
33 - brightness: Brightness.dark,
34 - colorScheme: const ShadSlateColorScheme.dark(
35 - background: Colors.blue,
36 - ),
37 - primaryButtonTheme: const ShadButtonTheme(
38 - backgroundColor: Colors.cyan,
39 - ),
40 - ),
41 - ...
42 -);
43 -```
44 -
45 -For fully custom schemes, extend `ShadColorScheme` and pass all required properties.
46 -
47 -### Theme switcher with ShadColorScheme.fromName
48 -
49 -Use `ShadColorScheme.fromName` to let users change the color scheme:
50 -
51 -```dart
52 -final shadThemeColors = [
53 - 'blue', 'gray', 'green', 'neutral', 'orange', 'red', 'rose',
54 - 'slate', 'stone', 'violet', 'yellow', 'zinc',
55 -];
56 -
57 -final lightColorScheme = ShadColorScheme.fromName('blue');
58 -final darkColorScheme = ShadColorScheme.fromName('slate', brightness: Brightness.dark);
59 -```
60 -
61 -Use a `ShadSelect<String>` (or similar) with these names and rebuild the app with the chosen scheme via your state management.
62 -
63 -### Custom colors
64 -
65 -Add custom colors via the `custom` parameter on the color scheme:
66 -
67 -```dart
68 -return ShadApp(
69 - theme: ShadThemeData(
70 - colorScheme: const ShadZincColorScheme.light(
71 - custom: {
72 - 'myCustomColor': Color.fromARGB(255, 177, 4, 196),
73 - },
74 - ),
75 - ),
76 -);
77 -```
78 -
79 -Access: `ShadTheme.of(context).colorScheme.custom['myCustomColor']!`
80 -
81 -Or add an extension:
82 -
83 -```dart
84 -extension CustomColorExtension on ShadColorScheme {
85 - Color get myCustomColor => custom['myCustomColor']!;
86 -}
87 -```
88 -
89 -Then use: `ShadTheme.of(context).colorScheme.myCustomColor`
.agent/skills/shadcn_ui-time-picker/SKILL.md deleted
-43
@@ -1,43 +0,0 @@
1 ----
2 -name: shadcn_ui-time-picker
3 -description: Use ShadTimePicker and ShadTimePickerFormField for time selection; trailing widget, period variant. Use when adding time pickers or time form fields in a Flutter shadcn_ui app or ShadForm.
4 ----
5 -
6 -# Shadcn UI — Time Picker
7 -
8 -## Instructions
9 -
10 -`ShadTimePicker` is a time picker component. Optional `trailing` widget (e.g. icon). For forms use `ShadTimePickerFormField` with `label`, `description`, `onChanged`, and `validator`. Use `ShadTimePickerFormField.period` for AM/PM period selection.
11 -
12 -### Standalone
13 -
14 -```dart
15 -const ShadTimePicker(
16 - trailing: Padding(
17 - padding: EdgeInsets.only(left: 8, top: 14),
18 - child: Icon(LucideIcons.clock4),
19 - ),
20 -)
21 -```
22 -
23 -### Form field
24 -
25 -```dart
26 -ShadTimePickerFormField(
27 - label: const Text('Pick a time'),
28 - onChanged: print,
29 - description: const Text('The time of the day you want to pick'),
30 - validator: (v) => v == null ? 'A time is required' : null,
31 -)
32 -```
33 -
34 -### Period (AM/PM)
35 -
36 -```dart
37 -ShadTimePickerFormField.period(
38 - label: const Text('Pick a time'),
39 - onChanged: print,
40 - description: const Text('The time of the day you want to pick'),
41 - validator: (v) => v == null ? 'A time is required' : null,
42 -)
43 -```
.agent/skills/shadcn_ui-toast/SKILL.md deleted
-68
@@ -1,68 +0,0 @@
1 ----
2 -name: shadcn_ui-toast
3 -description: Show toasts with ShadToaster.of(context).show(ShadToast); title, description, action, ShadToast.destructive. Use when displaying temporary messages or feedback in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Toast
7 -
8 -## Instructions
9 -
10 -Toasts are succinct temporary messages. Ensure a toaster is in the tree (e.g. `ShadToaster`). Get it with `ShadToaster.of(context)`. Call `toaster.show(ShadToast(...))` to show a toast; use `toaster.hide()` to dismiss (e.g. from an action button). Use `ShadToast` with optional `title`, `description`, and `action`. Use `ShadToast.destructive` for error-style toasts with a destructive action button (use `ShadDecoration` to style the action border).
11 -
12 -### Simple
13 -
14 -```dart
15 -ShadToaster.of(context).show(
16 - const ShadToast(
17 - description: Text('Your message has been sent.'),
18 - ),
19 -);
20 -```
21 -
22 -### With title
23 -
24 -```dart
25 -ShadToaster.of(context).show(
26 - const ShadToast(
27 - title: Text('Uh oh! Something went wrong'),
28 - description: Text('There was a problem with your request'),
29 - ),
30 -);
31 -```
32 -
33 -### With action
34 -
35 -```dart
36 -ShadToaster.of(context).show(
37 - ShadToast(
38 - title: const Text('Uh oh! Something went wrong'),
39 - description: const Text('There was a problem with your request'),
40 - action: ShadButton.outline(
41 - child: const Text('Try again'),
42 - onPressed: () => ShadToaster.of(context).hide(),
43 - ),
44 - ),
45 -);
46 -```
47 -
48 -### Destructive
49 -
50 -```dart
51 -final theme = ShadTheme.of(context);
52 -ShadToaster.of(context).show(
53 - ShadToast.destructive(
54 - title: const Text('Uh oh! Something went wrong'),
55 - description: const Text('There was a problem with your request'),
56 - action: ShadButton.destructive(
57 - child: const Text('Try again'),
58 - decoration: ShadDecoration(
59 - border: ShadBorder.all(
60 - color: theme.colorScheme.destructiveForeground,
61 - width: 1,
62 - ),
63 - ),
64 - onPressed: () => ShadToaster.of(context).hide(),
65 - ),
66 - ),
67 -);
68 -```
.agent/skills/shadcn_ui-tooltip/SKILL.md deleted
-33
@@ -1,33 +0,0 @@
1 ----
2 -name: shadcn_ui-tooltip
3 -description: Show tooltips on hover or focus with ShadTooltip; builder returns tooltip content, child is trigger. Use when adding hover/focus tooltips in a Flutter shadcn_ui app. Child must use ShadGestureDetector for hover (e.g. ShadButton).
4 ----
5 -
6 -# Shadcn UI — Tooltip
7 -
8 -## Instructions
9 -
10 -`ShadTooltip` shows a popup when the element receives keyboard focus or the mouse hovers over it. Use `builder: (context) => ...` to build the tooltip content (e.g. `Text('Add to library')`) and `child` for the trigger widget. Hover works only if the child uses a `ShadGestureDetector`; `ShadButton` and similar components implement it. For a plain widget (e.g. image), wrap the child with `ShadGestureDetector` so the tooltip shows on hover.
11 -
12 -### Basic
13 -
14 -```dart
15 -ShadTooltip(
16 - builder: (context) => const Text('Add to library'),
17 - child: ShadButton.outline(
18 - child: const Text('Hover/Focus'),
19 - onPressed: () {},
20 - ),
21 -)
22 -```
23 -
24 -For a non-interactive child (e.g. `Image`), wrap with `ShadGestureDetector`:
25 -
26 -```dart
27 -ShadTooltip(
28 - builder: (context) => const Text('Description'),
29 - child: ShadGestureDetector(
30 - child: Image.network('...'),
31 - ),
32 -)
33 -```
.agent/skills/shadcn_ui-typography/SKILL.md deleted
-110
@@ -1,110 +0,0 @@
1 ----
2 -name: shadcn_ui-typography
3 -description: Apply Shadcn UI text styles (h1, h2, p, lead, muted, etc.), set custom font family or Google Fonts, and extend ShadTextTheme with custom styles. Use when styling text, headings, or paragraphs in a Flutter shadcn_ui app or when changing the default font.
4 ----
5 -
6 -# Shadcn UI — Typography
7 -
8 -## Instructions
9 -
10 -Use `ShadTheme.of(context).textTheme` for consistent text styles. Default font family is Geist.
11 -
12 -### Text style names
13 -
14 -- **h1Large**, **h1**, **h2**, **h3**, **h4** — Headings
15 -- **p** — Body paragraph
16 -- **blockquote** — Quote style
17 -- **table** — Table header/cell text
18 -- **list** — List item text
19 -- **lead** — Lead/subtitle
20 -- **large** — Large body
21 -- **small** — Small/caption
22 -- **muted** — Muted/secondary text
23 -
24 -### Examples
25 -
26 -```dart
27 -Text(
28 - 'Taxing Laughter: The Joke Tax Chronicles',
29 - style: ShadTheme.of(context).textTheme.h1,
30 -)
31 -
32 -Text(
33 - 'The king, seeing how much happier his subjects were...',
34 - style: ShadTheme.of(context).textTheme.p,
35 -)
36 -
37 -Text(
38 - 'Email address',
39 - style: ShadTheme.of(context).textTheme.small,
40 -)
41 -
42 -Text(
43 - 'Enter your email address.',
44 - style: ShadTheme.of(context).textTheme.muted,
45 -)
46 -```
47 -
48 -### Custom font family
49 -
50 -1. Add font assets (e.g. under `/fonts`) and register in `pubspec.yaml`:
51 -
52 -```yaml
53 -flutter:
54 - fonts:
55 - - family: UbuntuMono
56 - fonts:
57 - - asset: fonts/UbuntuMono-Regular.ttf
58 - - asset: fonts/UbuntuMono-Italic.ttf
59 - style: italic
60 - - asset: fonts/UbuntuMono-Bold.ttf
61 - weight: 700
62 -```
63 -
64 -2. Set `ShadTextTheme` in `ShadThemeData`:
65 -
66 -```dart
67 -return ShadApp(
68 - theme: ShadThemeData(
69 - brightness: Brightness.light,
70 - colorScheme: const ShadZincColorScheme.light(),
71 - textTheme: ShadTextTheme(
72 - colorScheme: const ShadZincColorScheme.light(),
73 - family: 'UbuntuMono',
74 - ),
75 - ),
76 - ...
77 -);
78 -```
79 -
80 -### Google Fonts
81 -
82 -Install `google_fonts`, then:
83 -
84 -```dart
85 -theme: ShadThemeData(
86 - brightness: Brightness.light,
87 - colorScheme: const ShadZincColorScheme.light(),
88 - textTheme: ShadTextTheme.fromGoogleFont(GoogleFonts.poppins),
89 -),
90 -```
91 -
92 -### Custom text styles
93 -
94 -Extend `ShadTextTheme` with the `custom` parameter:
95 -
96 -```dart
97 -textTheme: ShadTextTheme(
98 - custom: {
99 - 'myCustomStyle': const TextStyle(
100 - fontSize: 16,
101 - fontWeight: FontWeight.w400,
102 - color: Colors.blue,
103 - ),
104 - },
105 -),
106 -```
107 -
108 -Access: `ShadTheme.of(context).textTheme.custom['myCustomStyle']!`
109 -
110 -Or define an extension on `ShadTextTheme` and use `ShadTheme.of(context).textTheme.myCustomStyle`.
.claude/skills/flutter-adding-home-screen-widgets/SKILL.md deleted
-202
@@ -1,202 +0,0 @@
1 ----
2 -name: "flutter-adding-home-screen-widgets"
3 -description: "Adds home screen widgets to a Flutter app for Android and iOS. Use when providing glanceable app information or quick actions on the device home screen."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:23:50 GMT"
7 -
8 ----
9 -# Implementing Flutter Home Screen Widgets
10 -
11 -## Contents
12 -- [Architecture & Data Flow](#architecture--data-flow)
13 -- [Flutter Integration Workflow](#flutter-integration-workflow)
14 -- [iOS Implementation Workflow](#ios-implementation-workflow)
15 -- [Android Implementation Workflow](#android-implementation-workflow)
16 -- [Advanced Techniques](#advanced-techniques)
17 -- [Examples](#examples)
18 -
19 -## Architecture & Data Flow
20 -Home Screen Widgets require native UI implementation (SwiftUI for iOS, XML/Kotlin for Android). The Flutter app communicates with these native widgets via shared local storage (`UserDefaults` on iOS, `SharedPreferences` on Android) using the `home_widget` package.
21 -
22 -- **Data Write:** Flutter app writes key-value pairs or renders images to a shared container.
23 -- **Trigger:** Flutter app signals the native OS to update the widget.
24 -- **Data Read:** Native widget wakes up, reads the key-value pairs or images from the shared container, and updates its UI.
25 -
26 -## Flutter Integration Workflow
27 -
28 -Use this checklist to implement the Dart side of the Home Screen Widget integration.
29 -
30 -- [ ] **Step 1: Initialize the App Group.** Call `HomeWidget.setAppGroupId('<YOUR_APP_GROUP>')` in `initState()` or app startup.
31 -- [ ] **Step 2: Save Data.** Use `HomeWidget.saveWidgetData<T>('key', value)` to write data to shared storage.
32 -- [ ] **Step 3: Trigger Update.** Call `HomeWidget.updateWidget(iOSName: 'YourIOSWidget', androidName: 'YourAndroidWidget')` to notify the OS.
33 -- [ ] **Step 4: Validate.** Run Flutter build -> review console for missing plugin registrations -> fix.
34 -
35 -## iOS Implementation Workflow
36 -
37 -If targeting iOS, implement the widget using Xcode and SwiftUI.
38 -
39 -- [ ] **Step 1: Create Target.** Open `ios/Runner.xcworkspace` in Xcode. Add a new **Widget Extension** target. Disable "Include Live Activity" and "Include Configuration Intent" unless explicitly required.
40 -- [ ] **Step 2: Configure App Groups.** Add the **App Groups** capability to *both* the Runner target and the Widget Extension target. Ensure the App Group ID matches the one used in Dart.
41 -- [ ] **Step 3: Define TimelineEntry.** Create a struct conforming to `TimelineEntry` to hold the data passed from shared storage.
42 -- [ ] **Step 4: Implement TimelineProvider.**
43 - - In `getSnapshot` and `getTimeline`, instantiate `UserDefaults(suiteName: "<YOUR_APP_GROUP>")`.
44 - - Extract values using `userDefaults?.string(forKey: "your_key")`.
45 - - Return the populated `TimelineEntry`.
46 -- [ ] **Step 5: Build UI.** Implement the SwiftUI `View` to display the data from the `TimelineEntry`.
47 -- [ ] **Step 6: Validate.** Run Xcode build for the Widget Extension -> review provisioning/App Group errors -> fix.
48 -
49 -## Android Implementation Workflow
50 -
51 -If targeting Android, implement the widget using Android Studio and XML/Kotlin.
52 -
53 -- [ ] **Step 1: Create App Widget.** Open the `android` folder in Android Studio. Right-click the app directory -> **New -> Widget -> App Widget**.
54 -- [ ] **Step 2: Define Layout.** Edit `res/layout/<widget_name>.xml` to define the UI using standard Android XML layouts (e.g., `RelativeLayout`, `TextView`, `ImageView`).
55 -- [ ] **Step 3: Implement AppWidgetProvider.**
56 - - Open the generated Kotlin class extending `AppWidgetProvider`.
57 - - In the `onUpdate` method, retrieve shared data using `HomeWidgetPlugin.getData(context)`.
58 - - Extract values using `widgetData.getString("your_key", null)`.
59 - - Update the UI using `RemoteViews` and `setTextViewText` or `setImageViewBitmap`.
60 - - Call `appWidgetManager.updateAppWidget(appWidgetId, views)`.
61 -- [ ] **Step 4: Validate.** Run Android build -> review Manifest registration errors -> fix.
62 -
63 -## Advanced Techniques
64 -
65 -### Rendering Flutter Widgets as Images
66 -If the UI is too complex to recreate natively (e.g., custom charts), render the Flutter widget to an image and display the image in the native widget.
67 -
68 -1. Wrap the target Flutter widget with a `GlobalKey`.
69 -2. Call `HomeWidget.renderFlutterWidget()`, passing the widget, a filename, and the key.
70 -3. **iOS:** Read the file path from `UserDefaults` and render using `UIImage(contentsOfFile:)` inside a SwiftUI `Image`.
71 -4. **Android:** Read the file path from `SharedPreferences`, decode using `BitmapFactory.decodeFile()`, and render using `setImageViewBitmap()`.
72 -
73 -### Using Custom Flutter Fonts (iOS Only)
74 -If utilizing custom fonts defined in Flutter on iOS Home Screen Widgets:
75 -
76 -1. Extract the Flutter asset bundle path in Swift.
77 -2. Register the font using `CTFontManagerRegisterFontsForURL`.
78 -3. Apply the font in SwiftUI using `Font.custom()`.
79 -
80 -## Examples
81 -
82 -### Example: Flutter Data Update
83 -```dart
84 -import 'package:home_widget/home_widget.dart';
85 -
86 -const String appGroupId = 'group.com.example.app';
87 -const String iOSWidgetName = 'NewsWidgets';
88 -const String androidWidgetName = 'NewsWidget';
89 -
90 -Future<void> updateWidgetData(String title, String description) async {
91 - await HomeWidget.setAppGroupId(appGroupId);
92 - await HomeWidget.saveWidgetData<String>('headline_title', title);
93 - await HomeWidget.saveWidgetData<String>('headline_description', description);
94 - await HomeWidget.updateWidget(
95 - iOSName: iOSWidgetName,
96 - androidName: androidWidgetName,
97 - );
98 -}
99 -```
100 -
101 -### Example: iOS SwiftUI Provider & View
102 -```swift
103 -import WidgetKit
104 -import SwiftUI
105 -
106 -struct NewsArticleEntry: TimelineEntry {
107 - let date: Date
108 - let title: String
109 - let description: String
110 -}
111 -
112 -struct Provider: TimelineProvider {
113 - func placeholder(in context: Context) -> NewsArticleEntry {
114 - NewsArticleEntry(date: Date(), title: "Loading...", description: "Loading...")
115 - }
116 -
117 - func getSnapshot(in context: Context, completion: @escaping (NewsArticleEntry) -> ()) {
118 - let userDefaults = UserDefaults(suiteName: "group.com.example.app")
119 - let title = userDefaults?.string(forKey: "headline_title") ?? "No Title"
120 - let description = userDefaults?.string(forKey: "headline_description") ?? "No Description"
121 -
122 - let entry = NewsArticleEntry(date: Date(), title: title, description: description)
123 - completion(entry)
124 - }
125 -
126 - func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
127 - getSnapshot(in: context) { (entry) in
128 - let timeline = Timeline(entries: [entry], policy: .atEnd)
129 - completion(timeline)
130 - }
131 - }
132 -}
133 -
134 -struct NewsWidgetsEntryView : View {
135 - var entry: Provider.Entry
136 -
137 - var body: some View {
138 - VStack(alignment: .leading) {
139 - Text(entry.title).font(.headline)
140 - Text(entry.description).font(.subheadline)
141 - }
142 - }
143 -}
144 -```
145 -
146 -### Example: Android Kotlin Provider
147 -```kotlin
148 -package com.example.app.widgets
149 -
150 -import android.appwidget.AppWidgetManager
151 -import android.appwidget.AppWidgetProvider
152 -import android.content.Context
153 -import android.widget.RemoteViews
154 -import es.antonborri.home_widget.HomeWidgetPlugin
155 -import com.example.app.R
156 -
157 -class NewsWidget : AppWidgetProvider() {
158 - override fun onUpdate(
159 - context: Context,
160 - appWidgetManager: AppWidgetManager,
161 - appWidgetIds: IntArray,
162 - ) {
163 - for (appWidgetId in appWidgetIds) {
164 - val widgetData = HomeWidgetPlugin.getData(context)
165 - val views = RemoteViews(context.packageName, R.layout.news_widget).apply {
166 - val title = widgetData.getString("headline_title", "No Title")
167 - setTextViewText(R.id.headline_title, title)
168 -
169 - val description = widgetData.getString("headline_description", "No Description")
170 - setTextViewText(R.id.headline_description, description)
171 - }
172 - appWidgetManager.updateAppWidget(appWidgetId, views)
173 - }
174 - }
175 -}
176 -```
177 -
178 -<details>
179 -<summary>Example: iOS Custom Font Registration Helper</summary>
180 -
181 -```swift
182 -// Add this to your SwiftUI View struct
183 -var bundle: URL {
184 - let bundle = Bundle.main
185 - if bundle.bundleURL.pathExtension == "appex" {
186 - var url = bundle.bundleURL.deletingLastPathComponent().deletingLastPathComponent()
187 - url.append(component: "Frameworks/App.framework/flutter_assets")
188 - return url
189 - }
190 - return bundle.bundleURL
191 -}
192 -
193 -init(entry: Provider.Entry) {
194 - self.entry = entry
195 - CTFontManagerRegisterFontsForURL(
196 - bundle.appending(path: "/fonts/YourCustomFont.ttf") as CFURL,
197 - CTFontManagerScope.process,
198 - nil
199 - )
200 -}
201 -```
202 -</details>
.claude/skills/flutter-animating-apps/SKILL.md deleted
-182
@@ -1,182 +0,0 @@
1 ----
2 -name: "flutter-animating-apps"
3 -description: "Implements animated effects, transitions, and motion in a Flutter app. Use when adding visual feedback, shared element transitions, or physics-based animations."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:16:34 GMT"
7 -
8 ----
9 -# Implementing Flutter Animations
10 -
11 -## Contents
12 -- [Core Concepts](#core-concepts)
13 -- [Animation Strategies](#animation-strategies)
14 -- [Workflows](#workflows)
15 - - [Implementing Implicit Animations](#implementing-implicit-animations)
16 - - [Implementing Explicit Animations](#implementing-explicit-animations)
17 - - [Implementing Hero Transitions](#implementing-hero-transitions)
18 - - [Implementing Physics-Based Animations](#implementing-physics-based-animations)
19 -- [Examples](#examples)
20 -
21 -## Core Concepts
22 -
23 -Manage Flutter animations using the core typed `Animation` system. Do not manually calculate frames; rely on the framework's ticker and interpolation classes.
24 -
25 -* **`Animation<T>`**: Treat this as an abstract representation of a value that changes over time. It holds state (completed, dismissed) and notifies listeners, but knows nothing about the UI.
26 -* **`AnimationController`**: Instantiate this to drive the animation. It generates values (typically 0.0 to 1.0) tied to the screen refresh rate. Always provide a `vsync` (usually via `SingleTickerProviderStateMixin`) to prevent offscreen resource consumption. Always `dispose()` controllers to prevent memory leaks.
27 -* **`Tween<T>`**: Define a stateless mapping from an input range (usually 0.0-1.0) to an output type (e.g., `Color`, `Offset`, `double`). Chain tweens with curves using `.animate()`.
28 -* **`Curve`**: Apply non-linear timing (e.g., `Curves.easeIn`, `Curves.bounceOut`) to an animation using a `CurvedAnimation` or `CurveTween`.
29 -
30 -## Animation Strategies
31 -
32 -Apply conditional logic to select the correct animation approach:
33 -
34 -* **If animating simple property changes (size, color, opacity) without playback control:** Use **Implicit Animations** (e.g., `AnimatedContainer`, `AnimatedOpacity`, `TweenAnimationBuilder`).
35 -* **If requiring playback control (play, pause, reverse, loop) or coordinating multiple properties:** Use **Explicit Animations** (e.g., `AnimationController` with `AnimatedBuilder` or `AnimatedWidget`).
36 -* **If animating elements between two distinct routes:** Use **Hero Animations** (Shared Element Transitions).
37 -* **If modeling real-world motion (e.g., snapping back after a drag):** Use **Physics-Based Animations** (e.g., `SpringSimulation`).
38 -* **If animating a sequence of overlapping or delayed motions:** Use **Staggered Animations** (multiple `Tween`s driven by a single `AnimationController` using `Interval` curves).
39 -
40 -## Workflows
41 -
42 -### Implementing Implicit Animations
43 -
44 -Use this workflow for "fire-and-forget" state-driven animations.
45 -
46 -- [ ] **Task Progress:**
47 - - [ ] Identify the target properties to animate (e.g., width, color).
48 - - [ ] Replace the static widget (e.g., `Container`) with its animated counterpart (e.g., `AnimatedContainer`).
49 - - [ ] Define the `duration` property.
50 - - [ ] (Optional) Define the `curve` property for non-linear motion.
51 - - [ ] Trigger the animation by updating the properties inside a `setState()` call.
52 - - [ ] Run validator -> review UI for jank -> adjust duration/curve if necessary.
53 -
54 -### Implementing Explicit Animations
55 -
56 -Use this workflow when you need granular control over the animation lifecycle.
57 -
58 -- [ ] **Task Progress:**
59 - - [ ] Add `SingleTickerProviderStateMixin` (or `TickerProviderStateMixin` for multiple controllers) to the `State` class.
60 - - [ ] Initialize an `AnimationController` in `initState()`, providing `vsync: this` and a `duration`.
61 - - [ ] Define a `Tween` and chain it to the controller using `.animate()`.
62 - - [ ] Wrap the target UI in an `AnimatedBuilder` (preferred for complex trees) or subclass `AnimatedWidget`.
63 - - [ ] Pass the `Animation` object to the `AnimatedBuilder`'s `animation` property.
64 - - [ ] Control playback using `controller.forward()`, `controller.reverse()`, or `controller.repeat()`.
65 - - [ ] Call `controller.dispose()` in the `dispose()` method.
66 - - [ ] Run validator -> check for memory leaks -> ensure `dispose()` is called.
67 -
68 -### Implementing Hero Transitions
69 -
70 -Use this workflow to fly a widget between two routes.
71 -
72 -- [ ] **Task Progress:**
73 - - [ ] Wrap the source widget in a `Hero` widget.
74 - - [ ] Assign a unique, data-driven `tag` to the source `Hero`.
75 - - [ ] Wrap the destination widget in a `Hero` widget.
76 - - [ ] Assign the *exact same* `tag` to the destination `Hero`.
77 - - [ ] Ensure the widget trees inside both `Hero` widgets are visually similar to prevent jarring jumps.
78 - - [ ] Trigger the transition by pushing the destination route via `Navigator`.
79 -
80 -### Implementing Physics-Based Animations
81 -
82 -Use this workflow for gesture-driven, natural motion.
83 -
84 -- [ ] **Task Progress:**
85 - - [ ] Set up an `AnimationController` (do not set a fixed duration).
86 - - [ ] Capture gesture velocity using a `GestureDetector` (e.g., `onPanEnd` providing `DragEndDetails`).
87 - - [ ] Convert the pixel velocity to the coordinate space of the animating property.
88 - - [ ] Instantiate a `SpringSimulation` with mass, stiffness, damping, and the calculated velocity.
89 - - [ ] Drive the controller using `controller.animateWith(simulation)`.
90 -
91 -## Examples
92 -
93 -<details>
94 -<summary><b>Example: Explicit Animation (Staggered with AnimatedBuilder)</b></summary>
95 -
96 -```dart
97 -class StaggeredAnimationDemo extends StatefulWidget {
98 - @override
99 - State<StaggeredAnimationDemo> createState() => _StaggeredAnimationDemoState();
100 -}
101 -
102 -class _StaggeredAnimationDemoState extends State<StaggeredAnimationDemo> with SingleTickerProviderStateMixin {
103 - late AnimationController _controller;
104 - late Animation<double> _widthAnimation;
105 - late Animation<Color?> _colorAnimation;
106 -
107 - @override
108 - void initState() {
109 - super.initState();
110 - _controller = AnimationController(
111 - duration: const Duration(seconds: 2),
112 - vsync: this,
113 - );
114 -
115 - // Staggered width animation (0.0 to 0.5 interval)
116 - _widthAnimation = Tween<double>(begin: 50.0, end: 200.0).animate(
117 - CurvedAnimation(
118 - parent: _controller,
119 - curve: const Interval(0.0, 0.5, curve: Curves.easeIn),
120 - ),
121 - );
122 -
123 - // Staggered color animation (0.5 to 1.0 interval)
124 - _colorAnimation = ColorTween(begin: Colors.blue, end: Colors.red).animate(
125 - CurvedAnimation(
126 - parent: _controller,
127 - curve: const Interval(0.5, 1.0, curve: Curves.easeOut),
128 - ),
129 - );
130 -
131 - _controller.forward();
132 - }
133 -
134 - @override
135 - void dispose() {
136 - _controller.dispose(); // CRITICAL: Prevent memory leaks
137 - super.dispose();
138 - }
139 -
140 - @override
141 - Widget build(BuildContext context) {
142 - return AnimatedBuilder(
143 - animation: _controller,
144 - builder: (context, child) {
145 - return Container(
146 - width: _widthAnimation.value,
147 - height: 50.0,
148 - color: _colorAnimation.value,
149 - );
150 - },
151 - );
152 - }
153 -}
154 -```
155 -</details>
156 -
157 -<details>
158 -<summary><b>Example: Custom Page Route Transition</b></summary>
159 -
160 -```dart
161 -Route createCustomRoute(Widget destination) {
162 - return PageRouteBuilder(
163 - pageBuilder: (context, animation, secondaryAnimation) => destination,
164 - transitionsBuilder: (context, animation, secondaryAnimation, child) {
165 - const begin = Offset(0.0, 1.0); // Start from bottom
166 - const end = Offset.zero;
167 - const curve = Curves.easeOut;
168 -
169 - final tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
170 - final offsetAnimation = animation.drive(tween);
171 -
172 - return SlideTransition(
173 - position: offsetAnimation,
174 - child: child,
175 - );
176 - },
177 - );
178 -}
179 -
180 -// Usage: Navigator.of(context).push(createCustomRoute(const NextPage()));
181 -```
182 -</details>
.claude/skills/flutter-architecting-apps/SKILL.md deleted
-163
@@ -1,163 +0,0 @@
1 ----
2 -name: "flutter-architecting-apps"
3 -description: "Architects a Flutter application using the recommended layered approach (UI, Logic, Data). Use when structuring a new project or refactoring for scalability."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:13:42 GMT"
7 -
8 ----
9 -# Architecting Flutter Applications
10 -
11 -## Contents
12 -- [Core Architectural Principles](#core-architectural-principles)
13 -- [Structuring the Layers](#structuring-the-layers)
14 -- [Implementing the Data Layer](#implementing-the-data-layer)
15 -- [Feature Implementation Workflow](#feature-implementation-workflow)
16 -- [Examples](#examples)
17 -
18 -## Core Architectural Principles
19 -
20 -Design Flutter applications to scale by strictly adhering to the following principles:
21 -
22 -* **Enforce Separation of Concerns:** Decouple UI rendering from business logic and data fetching. Organize the codebase into distinct layers (UI, Logic, Data) and further separate by feature within those layers.
23 -* **Maintain a Single Source of Truth (SSOT):** Centralize application state and data in the Data layer. Ensure the SSOT is the only component authorized to mutate its respective data.
24 -* **Implement Unidirectional Data Flow (UDF):** Flow state downwards from the Data layer to the UI layer. Flow events upwards from the UI layer to the Data layer.
25 -* **Treat UI as a Function of State:** Drive the UI entirely via immutable state objects. Rebuild widgets reactively when the underlying state changes.
26 -
27 -## Structuring the Layers
28 -
29 -Separate the application into 2 to 3 distinct layers depending on complexity. Restrict communication so that a layer only interacts with the layer directly adjacent to it.
30 -
31 -### 1. UI Layer (Presentation)
32 -* **Views (Widgets):** Build reusable, lean widgets. Strip all business and data-fetching logic from the widget tree. Restrict widget logic to UI-specific concerns (e.g., animations, routing, layout constraints).
33 -* **ViewModels:** Manage the UI state. Consume domain models from the Data/Logic layers and transform them into presentation-friendly formats. Expose state to the Views and handle user interaction events.
34 -
35 -### 2. Logic Layer (Domain) - *Conditional*
36 -* **If the application requires complex client-side business logic:** Implement a Logic layer containing Use Cases or Interactors. Use this layer to orchestrate interactions between multiple repositories before passing data to the UI layer.
37 -* **If the application is a standard CRUD app:** Omit this layer. Allow ViewModels to interact directly with Repositories.
38 -
39 -### 3. Data Layer (Model)
40 -* **Responsibilities:** Act as the SSOT for all application data. Handle business data, external API consumption, event processing, and data synchronization.
41 -* **Components:** Divide the Data layer strictly into **Repositories** and **Services**.
42 -
43 -## Implementing the Data Layer
44 -
45 -### Services
46 -* **Role:** Wrap external APIs (HTTP servers, local databases, platform plugins).
47 -* **Implementation:** Write Services as stateless Dart classes. Do not store application state here.
48 -* **Mapping:** Create exactly one Service class per external data source.
49 -
50 -### Repositories
51 -* **Role:** Act as the SSOT for domain data.
52 -* **Implementation:** Consume raw data from Services. Handle caching, offline synchronization, and retry logic.
53 -* **Transformation:** Transform raw API/Service data into clean Domain Models formatted for consumption by ViewModels.
54 -
55 -## Feature Implementation Workflow
56 -
57 -Follow this sequential workflow when adding a new feature to the application.
58 -
59 -**Task Progress:**
60 -- [ ] **Step 1: Define Domain Models.** Create immutable Dart classes representing the core data structures required by the feature.
61 -- [ ] **Step 2: Implement Services.** Create stateless Service classes to handle raw data fetching (e.g., HTTP GET/POST).
62 -- [ ] **Step 3: Implement Repositories.** Create Repository classes that consume the Services, handle caching, and return Domain Models.
63 -- [ ] **Step 4: Implement ViewModels.** Create ViewModels that consume the Repositories. Expose immutable state and define methods (commands) for user actions.
64 -- [ ] **Step 5: Implement Views.** Create Flutter Widgets that bind to the ViewModel state and trigger ViewModel methods on user interaction.
65 -- [ ] **Step 6: Run Validator.** Execute unit tests for Services, Repositories, and ViewModels. Execute widget tests for Views.
66 - * *Feedback Loop:* Review test failures -> Fix logic/mocking errors -> Re-run tests until passing.
67 -
68 -## Examples
69 -
70 -### Data Layer: Service and Repository
71 -
72 -```dart
73 -// 1. Service (Stateless API Wrapper)
74 -class UserApiService {
75 - final HttpClient _client;
76 -
77 - UserApiService(this._client);
78 -
79 - Future<Map<String, dynamic>> fetchUserRaw(String userId) async {
80 - final response = await _client.get('/users/$userId');
81 - return response.data;
82 - }
83 -}
84 -
85 -// 2. Domain Model (Immutable)
86 -class User {
87 - final String id;
88 - final String name;
89 -
90 - const User({required this.id, required this.name});
91 -}
92 -
93 -// 3. Repository (SSOT & Data Transformer)
94 -class UserRepository {
95 - final UserApiService _apiService;
96 - User? _cachedUser;
97 -
98 - UserRepository(this._apiService);
99 -
100 - Future<User> getUser(String userId) async {
101 - if (_cachedUser != null && _cachedUser!.id == userId) {
102 - return _cachedUser!;
103 - }
104 -
105 - final rawData = await _apiService.fetchUserRaw(userId);
106 - final user = User(id: rawData['id'], name: rawData['name']);
107 -
108 - _cachedUser = user; // Cache data
109 - return user;
110 - }
111 -}
112 -```
113 -
114 -### UI Layer: ViewModel and View
115 -
116 -```dart
117 -// 4. ViewModel (State Management)
118 -class UserViewModel extends ChangeNotifier {
119 - final UserRepository _userRepository;
120 -
121 - User? user;
122 - bool isLoading = false;
123 - String? error;
124 -
125 - UserViewModel(this._userRepository);
126 -
127 - Future<void> loadUser(String userId) async {
128 - isLoading = true;
129 - error = null;
130 - notifyListeners();
131 -
132 - try {
133 - user = await _userRepository.getUser(userId);
134 - } catch (e) {
135 - error = e.toString();
136 - } finally {
137 - isLoading = false;
138 - notifyListeners();
139 - }
140 - }
141 -}
142 -
143 -// 5. View (Lean UI)
144 -class UserProfileView extends StatelessWidget {
145 - final UserViewModel viewModel;
146 -
147 - const UserProfileView({Key? key, required this.viewModel}) : super(key: key);
148 -
149 - @override
150 - Widget build(BuildContext context) {
151 - return ListenableBuilder(
152 - listenable: viewModel,
153 - builder: (context, child) {
154 - if (viewModel.isLoading) return const CircularProgressIndicator();
155 - if (viewModel.error != null) return Text('Error: ${viewModel.error}');
156 - if (viewModel.user == null) return const Text('No user data.');
157 -
158 - return Text('Hello, ${viewModel.user!.name}');
159 - },
160 - );
161 - }
162 -}
163 -```
.claude/skills/flutter-building-forms/SKILL.md deleted
-122
@@ -1,122 +0,0 @@
1 ----
2 -name: "flutter-building-forms"
3 -description: "Builds Flutter forms with validation and user input handling. Use when creating login screens, data entry forms, or any multi-field user input."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:15:24 GMT"
7 -
8 ----
9 -# Building Validated Forms
10 -
11 -## Contents
12 -- [Form Architecture](#form-architecture)
13 -- [Field Validation](#field-validation)
14 -- [Workflow: Implementing a Validated Form](#workflow-implementing-a-validated-form)
15 -- [Examples](#examples)
16 -
17 -## Form Architecture
18 -
19 -Implement forms using a `Form` widget to group and validate multiple input fields together.
20 -
21 -- **Use a StatefulWidget:** Always host your `Form` inside a `StatefulWidget`.
22 -- **Persist the GlobalKey:** Instantiate a `GlobalKey<FormState>` exactly once as a final variable within the `State` class. Do not generate a new `GlobalKey` inside the `build` method; doing so is resource-expensive and destroys the form's state on every rebuild.
23 -- **Bind the Key:** Pass the `GlobalKey<FormState>` to the `key` property of the `Form` widget. This uniquely identifies the form and provides access to the `FormState` for validation and submission.
24 -- **Alternative Access:** If dealing with highly complex widget trees where passing the key is impractical, use `Form.of(context)` to access the `FormState` from a descendant widget.
25 -
26 -## Field Validation
27 -
28 -Use `TextFormField` to render Material Design text inputs with built-in validation support. `TextFormField` is a convenience widget that automatically wraps a standard `TextField` inside a `FormField`.
29 -
30 -- **Implement the Validator:** Provide a `validator()` callback function to each `TextFormField`.
31 -- **Return Error Messages:** If the user's input is invalid, return a `String` containing the specific error message. The `Form` will automatically rebuild to display this text below the field.
32 -- **Return Null for Success:** If the input passes validation, you must return `null`.
33 -
34 -## Workflow: Implementing a Validated Form
35 -
36 -Follow this sequential workflow to implement and validate a form. Copy the checklist to track your progress.
37 -
38 -**Task Progress:**
39 -- [ ] 1. Create a `StatefulWidget` and its corresponding `State` class.
40 -- [ ] 2. Instantiate `final _formKey = GlobalKey<FormState>();` in the `State` class.
41 -- [ ] 3. Return a `Form` widget in the `build` method and assign `key: _formKey`.
42 -- [ ] 4. Add `TextFormField` widgets as descendants of the `Form`.
43 -- [ ] 5. Write a `validator` function for each `TextFormField` (return `String` on error, `null` on success).
44 -- [ ] 6. Add a submit button (e.g., `ElevatedButton`).
45 -- [ ] 7. Implement the validation check in the button's `onPressed` callback using `_formKey.currentState!.validate()`.
46 -
47 -### Validation Decision Logic
48 -
49 -When the user triggers the submit action, execute the following conditional logic:
50 -
51 -1. Call `_formKey.currentState!.validate()`.
52 -2. **If `true` (Valid):** All validators returned `null`. Proceed with form submission (e.g., save data, make API call) and display a success indicator (e.g., a `SnackBar`).
53 -3. **If `false` (Invalid):** One or more validators returned an error string. The `FormState` automatically rebuilds the UI to display the error messages.
54 -4. **Feedback Loop:** Run validator -> review errors -> fix. The user must adjust their input and resubmit until `validate()` returns `true`.
55 -
56 -## Examples
57 -
58 -### Complete Validated Form Implementation
59 -
60 -Use the following pattern to implement a robust, validated form.
61 -
62 -```dart
63 -import 'package:flutter/material.dart';
64 -
65 -class UserRegistrationForm extends StatefulWidget {
66 - const UserRegistrationForm({super.key});
67 -
68 - @override
69 - State<UserRegistrationForm> createState() => _UserRegistrationFormState();
70 -}
71 -
72 -class _UserRegistrationFormState extends State<UserRegistrationForm> {
73 - // 1. Persist the GlobalKey in the State class
74 - final _formKey = GlobalKey<FormState>();
75 -
76 - @override
77 - Widget build(BuildContext context) {
78 - // 2. Bind the key to the Form
79 - return Form(
80 - key: _formKey,
81 - child: Column(
82 - crossAxisAlignment: CrossAxisAlignment.start,
83 - children: [
84 - // 3. Add TextFormFields with validators
85 - TextFormField(
86 - decoration: const InputDecoration(
87 - labelText: 'Username',
88 - hintText: 'Enter your username',
89 - ),
90 - validator: (value) {
91 - if (value == null || value.isEmpty) {
92 - return 'Please enter a username'; // Error state
93 - }
94 - if (value.length < 4) {
95 - return 'Username must be at least 4 characters'; // Error state
96 - }
97 - return null; // Valid state
98 - },
99 - ),
100 - const SizedBox(height: 16),
101 - // 4. Add the submit button
102 - ElevatedButton(
103 - onPressed: () {
104 - // 5. Trigger validation logic
105 - if (_formKey.currentState!.validate()) {
106 - // Form is valid: Process data
107 - ScaffoldMessenger.of(context).showSnackBar(
108 - const SnackBar(content: Text('Processing Data')),
109 - );
110 - } else {
111 - // Form is invalid: Errors are automatically displayed
112 - debugPrint('Form validation failed.');
113 - }
114 - },
115 - child: const Text('Submit'),
116 - ),
117 - ],
118 - ),
119 - );
120 - }
121 -}
122 -```
.claude/skills/flutter-building-layouts/SKILL.md deleted
-128
@@ -1,128 +0,0 @@
1 ----
2 -name: "flutter-building-layouts"
3 -description: "Builds Flutter layouts using the constraint system and layout widgets. Use when creating or refining the UI structure of a Flutter application."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:14:15 GMT"
7 -
8 ----
9 -# Architecting Flutter Layouts
10 -
11 -## Contents
12 -- [Core Layout Principles](#core-layout-principles)
13 -- [Structural Widgets](#structural-widgets)
14 -- [Adaptive and Responsive Design](#adaptive-and-responsive-design)
15 -- [Workflow: Implementing a Complex Layout](#workflow-implementing-a-complex-layout)
16 -- [Examples](#examples)
17 -
18 -## Core Layout Principles
19 -
20 -Master the fundamental Flutter layout rule: **Constraints go down. Sizes go up. Parent sets position.**
21 -
22 -* **Pass Constraints Down:** Always pass constraints (minimum/maximum width and height) from the parent Widget to its children. A Widget cannot choose its own size independently of its parent's constraints.
23 -* **Pass Sizes Up:** Calculate the child Widget's desired size within the given constraints and pass this size back up to the parent.
24 -* **Set Position via Parent:** Define the `x` and `y` coordinates of a child Widget exclusively within the parent Widget. Children do not know their own position on the screen.
25 -* **Avoid Unbounded Constraints:** Never pass unbounded constraints (e.g., `double.infinity`) in the cross-axis of a flex box (`Row` or `Column`) or within scrollable regions (`ListView`). This causes render exceptions.
26 -
27 -## Structural Widgets
28 -
29 -Select the appropriate structural Widget based on the required spatial arrangement.
30 -
31 -* **Use `Row` and `Column`:** Implement `Row` for horizontal linear layouts and `Column` for vertical linear layouts. Control child alignment using `mainAxisAlignment` and `crossAxisAlignment`.
32 -* **Use `Expanded` and `Flexible`:** Wrap children of `Row` or `Column` in `Expanded` to force them to fill available space, or `Flexible` to allow them to size themselves up to the available space.
33 -* **Use `Container`:** Wrap Widgets in a `Container` when you need to apply padding, margins, borders, or background colors.
34 -* **Use `Stack`:** Implement `Stack` when Widgets must overlap on the Z-axis. Use `Positioned` to anchor children to specific edges of the `Stack`.
35 -* **Use `SizedBox`:** Enforce strict, tight constraints on a child Widget by wrapping it in a `SizedBox` with explicit `width` and `height` values.
36 -
37 -## Adaptive and Responsive Design
38 -
39 -Apply conditional logic to handle varying screen sizes and form factors.
40 -
41 -* **If fitting UI into available space (Responsive):** Use `LayoutBuilder`, `Expanded`, and `Flexible` to dynamically adjust the size and placement of elements based on the parent's constraints.
42 -* **If adjusting UI usability for a specific form factor (Adaptive):** Use conditional rendering to swap entire layout structures. For example, render a bottom navigation bar on mobile, but a side navigation rail on tablets/desktop.
43 -
44 -## Workflow: Implementing a Complex Layout
45 -
46 -Follow this sequential workflow to architect and implement robust Flutter layouts.
47 -
48 -### Task Progress
49 -- [ ] **Phase 1: Visual Deconstruction**
50 - - [ ] Break down the target UI into a hierarchy of rows, columns, and grids.
51 - - [ ] Identify overlapping elements (requiring `Stack`).
52 - - [ ] Identify scrolling regions (requiring `ListView` or `SingleChildScrollView`).
53 -- [ ] **Phase 2: Constraint Planning**
54 - - [ ] Determine which Widgets require tight constraints (fixed size) vs. loose constraints (flexible size).
55 - - [ ] Identify potential unbounded constraint risks (e.g., a `ListView` inside a `Column`).
56 -- [ ] **Phase 3: Implementation**
57 - - [ ] Build the layout from the outside in, starting with the `Scaffold` and primary structural Widgets.
58 - - [ ] Extract deeply nested layout sections into separate, stateless Widgets to maintain readability.
59 -- [ ] **Phase 4: Validation and Feedback Loop**
60 - - [ ] Run the application on target devices/simulators.
61 - - [ ] **Run validator -> review errors -> fix:** Open the Flutter Inspector. Enable "Debug Paint" to visualize render boxes.
62 - - [ ] Check for yellow/black striped overflow warnings.
63 - - [ ] If overflow occurs: Wrap the overflowing Widget in `Expanded` (if inside a flex box) or wrap the parent in a scrollable Widget.
64 -
65 -## Examples
66 -
67 -### Example: Resolving Unbounded Constraints in Flex Boxes
68 -
69 -**Anti-pattern:** Placing a `ListView` directly inside a `Column` causes an unbounded height exception because the `Column` provides infinite vertical space to the `ListView`.
70 -
71 -```dart
72 -// BAD: Throws unbounded height exception
73 -Column(
74 - children: [
75 - Text('Header'),
76 - ListView(
77 - children: [/* items */],
78 - ),
79 - ],
80 -)
81 -```
82 -
83 -**Implementation:** Wrap the `ListView` in an `Expanded` Widget to bound its height to the remaining space in the `Column`.
84 -
85 -```dart
86 -// GOOD: ListView is constrained to remaining space
87 -Column(
88 - children: [
89 - Text('Header'),
90 - Expanded(
91 - child: ListView(
92 - children: [/* items */],
93 - ),
94 - ),
95 - ],
96 -)
97 -```
98 -
99 -### Example: Responsive Layout with LayoutBuilder
100 -
101 -Implement `LayoutBuilder` to conditionally render different structural Widgets based on available width.
102 -
103 -```dart
104 -Widget buildAdaptiveLayout(BuildContext context) {
105 - return LayoutBuilder(
106 - builder: (context, constraints) {
107 - // Conditional logic based on screen width
108 - if (constraints.maxWidth > 600) {
109 - // Tablet/Desktop: Side-by-side layout
110 - return Row(
111 - children: [
112 - SizedBox(width: 250, child: SidebarWidget()),
113 - Expanded(child: MainContentWidget()),
114 - ],
115 - );
116 - } else {
117 - // Mobile: Stacked layout with navigation
118 - return Column(
119 - children: [
120 - Expanded(child: MainContentWidget()),
121 - BottomNavigationBarWidget(),
122 - ],
123 - );
124 - }
125 - },
126 - );
127 -}
128 -```
.claude/skills/flutter-building-plugins/SKILL.md deleted
-206
@@ -1,206 +0,0 @@
1 ----
2 -name: "flutter-building-plugins"
3 -description: "Builds Flutter plugins that provide native interop for other apps to use. Use when creating reusable packages that bridge Flutter with platform-specific functionality."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:21:35 GMT"
7 -
8 ----
9 -# Developing Flutter Plugins
10 -
11 -## Contents
12 -- [Architecture & Design Patterns](#architecture--design-patterns)
13 -- [Workflow: Creating a New Plugin](#workflow-creating-a-new-plugin)
14 -- [Workflow: Implementing Android Platform Code](#workflow-implementing-android-platform-code)
15 -- [Workflow: Implementing Windows Platform Code](#workflow-implementing-windows-platform-code)
16 -- [Workflow: Adding Platforms to an Existing Plugin](#workflow-adding-platforms-to-an-existing-plugin)
17 -- [Examples](#examples)
18 -
19 -## Architecture & Design Patterns
20 -
21 -### Federated Plugins
22 -Implement federated plugins to split a plugin's API across multiple packages, allowing independent teams to build platform-specific implementations. Structure federated plugins into three distinct components:
23 -1. **App-facing interface:** The primary package users depend on. It exports the public API.
24 -2. **Platform interface:** The package defining the common interface that all platform implementations must implement.
25 -3. **Platform implementations:** Independent packages containing platform-specific code (e.g., `my_plugin_android`, `my_plugin_windows`).
26 -
27 -### FFI vs. Standard Plugins
28 -Choose the correct plugin template based on your native interoperability requirements:
29 -* **Standard Plugins (`--template=plugin`):** Use for accessing platform-specific APIs (e.g., Android SDK, iOS frameworks) via Method Channels.
30 -* **FFI Plugins (`--template=plugin_ffi`):** Use for accessing C/C++ native libraries, configuring Google Play services on Android, or using static linking on iOS/macOS.
31 - * *Constraint:* FFI plugin packages support bundling native code and method channel registration code, but *not* method channels themselves. If you require both method channels and FFI, use the standard non-FFI plugin template.
32 -
33 -## Workflow: Creating a New Plugin
34 -
35 -Follow this workflow to initialize a new plugin package.
36 -
37 -**Task Progress:**
38 -- [ ] Determine if the plugin requires FFI or standard Method Channels.
39 -- [ ] Execute the appropriate `flutter create` command.
40 -- [ ] Verify the generated directory structure.
41 -
42 -**Conditional Initialization:**
43 -* **If creating a STANDARD plugin:**
44 - Run the following command, specifying your supported platforms, organization, and preferred languages (defaults are Swift and Kotlin):
45 - ```bash
46 - flutter create --template=plugin \
47 - --platforms=android,ios,web,linux,macos,windows \
48 - --org com.example.organization \
49 - -i objc -a java \
50 - my_plugin
51 - ```
52 -* **If creating an FFI plugin:**
53 - Run the following command to generate a project with Dart code in `lib` (using `dart:ffi`) and native source code in `src` (with a `CMakeLists.txt`):
54 - ```bash
55 - flutter create --template=plugin_ffi my_ffi_plugin
56 - ```
57 -
58 -## Workflow: Implementing Android Platform Code
59 -
60 -Always edit Android platform code using Android Studio to ensure proper code completion and Gradle synchronization.
61 -
62 -**Task Progress:**
63 -- [ ] Run initial build to generate necessary Gradle files.
64 -- [ ] Open the Android module in Android Studio.
65 -- [ ] Implement `FlutterPlugin` and lifecycle-aware interfaces.
66 -- [ ] Refactor legacy `registerWith` logic.
67 -- [ ] Run validator -> review errors -> fix.
68 -
69 -1. **Generate Build Files:**
70 - Build the code at least once before editing to resolve dependencies.
71 - ```bash
72 - cd example
73 - flutter build apk --config-only
74 - ```
75 -2. **Open in IDE:**
76 - Launch Android Studio and open the `example/android/build.gradle` or `example/android/build.gradle.kts` file.
77 -3. **Locate Source:**
78 - Navigate to your plugin's source code at `java/<organization-path>/<PluginName>`.
79 -4. **Implement V2 Embedding:**
80 - * Implement the `FlutterPlugin` interface.
81 - * Ensure your plugin class has a public constructor.
82 - * Extract shared initialization logic from the legacy `registerWith()` method and the new `onAttachedToEngine()` method into a single private method. Both entry points must call this private method to maintain backward compatibility without duplicating logic.
83 -5. **Implement Lifecycle Interfaces:**
84 - * **If your plugin requires an `Activity` reference:** Implement the `ActivityAware` interface and handle the `onAttachedToActivity`, `onDetachedFromActivityForConfigChanges`, `onReattachedToActivityForConfigChanges`, and `onDetachedFromActivity` callbacks.
85 - * **If your plugin runs in a background `Service`:** Implement the `ServiceAware` interface.
86 -6. **Update Example App:**
87 - Ensure the example app's `MainActivity.java` extends the v2 embedding `io.flutter.embedding.android.FlutterActivity`.
88 -7. **Document API:**
89 - Document all non-overridden public members in your Android implementation.
90 -
91 -## Workflow: Implementing Windows Platform Code
92 -
93 -Always edit Windows platform code using Visual Studio.
94 -
95 -**Task Progress:**
96 -- [ ] Run initial build to generate the Visual Studio solution.
97 -- [ ] Open the solution in Visual Studio.
98 -- [ ] Implement C++ logic.
99 -- [ ] Rebuild the solution.
100 -
101 -1. **Generate Build Files:**
102 - ```bash
103 - cd example
104 - flutter build windows
105 - ```
106 -2. **Open in IDE:**
107 - Launch Visual Studio and open the `example/build/windows/hello_example.sln` file.
108 -3. **Locate Source:**
109 - Navigate to `hello_plugin/Source Files` and `hello_plugin/Header Files` in the Solution Explorer.
110 -4. **Rebuild:**
111 - After making changes to the C++ plugin code, you *must* rebuild the solution in Visual Studio before running the app, or the outdated plugin binary will be used.
112 -
113 -## Workflow: Adding Platforms to an Existing Plugin
114 -
115 -Use this workflow to retrofit an existing plugin with support for additional platforms.
116 -
117 -**Task Progress:**
118 -- [ ] Run the platform addition command.
119 -- [ ] Update iOS/macOS podspecs (if applicable).
120 -- [ ] Implement the platform-specific code.
121 -
122 -1. **Run Create Command:**
123 - Navigate to the root directory of your existing plugin and run:
124 - ```bash
125 - flutter create --template=plugin --platforms=web,macos .
126 - ```
127 -2. **Update Podspecs:**
128 - If adding iOS or macOS support, open the generated `.podspec` file and configure the required dependencies and deployment targets.
129 -
130 -## Examples
131 -
132 -### Android V2 Embedding Implementation
133 -High-fidelity example of an Android plugin implementing `FlutterPlugin` and `ActivityAware` while maintaining legacy compatibility.
134 -
135 -```java
136 -package com.example.myplugin;
137 -
138 -import androidx.annotation.NonNull;
139 -import io.flutter.embedding.engine.plugins.FlutterPlugin;
140 -import io.flutter.embedding.engine.plugins.activity.ActivityAware;
141 -import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
142 -import io.flutter.plugin.common.MethodCall;
143 -import io.flutter.plugin.common.MethodChannel;
144 -import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
145 -import io.flutter.plugin.common.MethodChannel.Result;
146 -import io.flutter.plugin.common.PluginRegistry.Registrar;
147 -
148 -/** MyPlugin */
149 -public class MyPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware {
150 - private MethodChannel channel;
151 -
152 - // Public constructor required for v2 embedding
153 - public MyPlugin() {}
154 -
155 - @Override
156 - public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
157 - setupChannel(flutterPluginBinding.getBinaryMessenger());
158 - }
159 -
160 - // Legacy v1 embedding support
161 - public static void registerWith(Registrar registrar) {
162 - MyPlugin plugin = new MyPlugin();
163 - plugin.setupChannel(registrar.messenger());
164 - }
165 -
166 - // Shared initialization logic
167 - private void setupChannel(BinaryMessenger messenger) {
168 - channel = new MethodChannel(messenger, "my_plugin");
169 - channel.setMethodCallHandler(this);
170 - }
171 -
172 - @Override
173 - public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
174 - if (call.method.equals("getPlatformVersion")) {
175 - result.success("Android " + android.os.Build.VERSION.RELEASE);
176 - } else {
177 - result.notImplemented();
178 - }
179 - }
180 -
181 - @Override
182 - public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
183 - channel.setMethodCallHandler(null);
184 - }
185 -
186 - @Override
187 - public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
188 - // Handle Activity attachment
189 - }
190 -
191 - @Override
192 - public void onDetachedFromActivityForConfigChanges() {
193 - // Handle config changes
194 - }
195 -
196 - @Override
197 - public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {
198 - // Handle reattachment
199 - }
200 -
201 - @Override
202 - public void onDetachedFromActivity() {
203 - // Clean up Activity references
204 - }
205 -}
206 -```
.claude/skills/flutter-caching-data/SKILL.md deleted
-168
@@ -1,168 +0,0 @@
1 ----
2 -name: "flutter-caching-data"
3 -description: "Implements caching strategies for Flutter apps to improve performance and offline support. Use when retaining app data locally to reduce network requests or speed up startup."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:19:54 GMT"
7 -
8 ----
9 -# Implementing Flutter Caching and Offline-First Architectures
10 -
11 -## Contents
12 -- [Selecting a Caching Strategy](#selecting-a-caching-strategy)
13 -- [Implementing Offline-First Data Synchronization](#implementing-offline-first-data-synchronization)
14 -- [Managing File System and SQLite Persistence](#managing-file-system-and-sqlite-persistence)
15 -- [Optimizing UI, Scroll, and Image Caching](#optimizing-ui-scroll-and-image-caching)
16 -- [Caching the FlutterEngine (Android)](#caching-the-flutterengine-android)
17 -- [Workflows](#workflows)
18 -
19 -## Selecting a Caching Strategy
20 -
21 -Apply the appropriate caching mechanism based on the data lifecycle and size requirements.
22 -
23 -* **If storing small, non-critical UI states or preferences:** Use `shared_preferences`.
24 -* **If storing large, structured datasets:** Use on-device databases (SQLite via `sqflite`, Drift, Hive CE, or Isar).
25 -* **If storing binary data or large media:** Use file system caching via `path_provider`.
26 -* **If retaining user session state (navigation, scroll positions):** Implement Flutter's built-in state restoration to sync the Element tree with the engine.
27 -* **If optimizing Android initialization:** Pre-warm and cache the `FlutterEngine`.
28 -
29 -## Implementing Offline-First Data Synchronization
30 -
31 -Design repositories as the single source of truth, combining local databases and remote API clients.
32 -
33 -### Read Operations (Stream Approach)
34 -Yield local data immediately for fast UI rendering, then fetch remote data, update the local cache, and yield the fresh data.
35 -
36 -```dart
37 -Stream<UserProfile> getUserProfile() async* {
38 - // 1. Yield local cache first
39 - final localProfile = await _databaseService.fetchUserProfile();
40 - if (localProfile != null) yield localProfile;
41 -
42 - // 2. Fetch remote, update cache, yield fresh data
43 - try {
44 - final remoteProfile = await _apiClientService.getUserProfile();
45 - await _databaseService.updateUserProfile(remoteProfile);
46 - yield remoteProfile;
47 - } catch (e) {
48 - // Handle network failure; UI already has local data
49 - }
50 -}
51 -```
52 -
53 -### Write Operations
54 -Determine the write strategy based on data criticality:
55 -* **If strict server synchronization is required (Online-only):** Attempt the API call first. Only update the local database if the API call succeeds.
56 -* **If offline availability is prioritized (Offline-first):** Write to the local database immediately. Attempt the API call. If the API call fails, flag the local record for background synchronization.
57 -
58 -### Background Synchronization
59 -Add a `synchronized` boolean flag to your data models. Run a periodic background task (e.g., via `workmanager` or a `Timer`) to push unsynchronized local changes to the server.
60 -
61 -## Managing File System and SQLite Persistence
62 -
63 -### File System Caching
64 -Use `path_provider` to locate the correct directory.
65 -* Use `getApplicationDocumentsDirectory()` for persistent data.
66 -* Use `getTemporaryDirectory()` for cache data the OS can clear.
67 -
68 -```dart
69 -Future<File> get _localFile async {
70 - final directory = await getApplicationDocumentsDirectory();
71 - return File('${directory.path}/cache.txt');
72 -}
73 -```
74 -
75 -### SQLite Persistence
76 -Use `sqflite` for relational data caching. Always use `whereArgs` to prevent SQL injection.
77 -
78 -```dart
79 -Future<void> updateCachedRecord(Record record) async {
80 - final db = await database;
81 - await db.update(
82 - 'records',
83 - record.toMap(),
84 - where: 'id = ?',
85 - whereArgs: [record.id], // NEVER use string interpolation here
86 - );
87 -}
88 -```
89 -
90 -## Optimizing UI, Scroll, and Image Caching
91 -
92 -### Image Caching
93 -Image I/O and decompression are expensive.
94 -* Use the `cached_network_image` package to handle file-system caching of remote images.
95 -* **Custom ImageProviders:** If implementing a custom `ImageProvider`, override `createStream()` and `resolveStreamForKey()` instead of the deprecated `resolve()` method.
96 -* **Cache Sizing:** The `ImageCache.maxByteSize` no longer automatically expands for large images. If loading images larger than the default cache size, manually increase `ImageCache.maxByteSize` or subclass `ImageCache` to implement custom eviction logic.
97 -
98 -### Scroll Caching
99 -When configuring caching for scrollable widgets (`ListView`, `GridView`, `Viewport`), use the `scrollCacheExtent` property with a `ScrollCacheExtent` object. Do not use the deprecated `cacheExtent` and `cacheExtentStyle` properties.
100 -
101 -```dart
102 -// Correct implementation
103 -ListView(
104 - scrollCacheExtent: const ScrollCacheExtent.pixels(500.0),
105 - children: // ...
106 -)
107 -
108 -Viewport(
109 - scrollCacheExtent: const ScrollCacheExtent.viewport(0.5),
110 - slivers: // ...
111 -)
112 -```
113 -
114 -### Widget Caching
115 -* Avoid overriding `operator ==` on `Widget` objects. It causes O(N²) behavior during rebuilds.
116 -* **Exception:** You may override `operator ==` *only* on leaf widgets (no children) where comparing properties is significantly faster than rebuilding, and the properties rarely change.
117 -* Prefer using `const` constructors to allow the framework to short-circuit rebuilds automatically.
118 -
119 -## Caching the FlutterEngine (Android)
120 -
121 -To eliminate the non-trivial warm-up time of a `FlutterEngine` when adding Flutter to an existing Android app, pre-warm and cache the engine.
122 -
123 -1. Instantiate and pre-warm the engine in the `Application` class.
124 -2. Store it in the `FlutterEngineCache`.
125 -3. Retrieve it using `withCachedEngine` in the `FlutterActivity` or `FlutterFragment`.
126 -
127 -```kotlin
128 -// 1. Pre-warm in Application class
129 -val flutterEngine = FlutterEngine(this)
130 -flutterEngine.navigationChannel.setInitialRoute("/cached_route")
131 -flutterEngine.dartExecutor.executeDartEntrypoint(DartEntrypoint.createDefault())
132 -
133 -// 2. Cache the engine
134 -FlutterEngineCache.getInstance().put("my_engine_id", flutterEngine)
135 -
136 -// 3. Use in Activity/Fragment
137 -startActivity(
138 - FlutterActivity.withCachedEngine("my_engine_id").build(this)
139 -)
140 -```
141 -*Note: You cannot set an initial route via the Activity/Fragment builder when using a cached engine. Set the initial route on the engine's navigation channel before executing the Dart entrypoint.*
142 -
143 -## Workflows
144 -
145 -### Workflow: Implementing an Offline-First Repository
146 -Follow these steps to implement a robust offline-first data layer.
147 -
148 -- [ ] **Task Progress:**
149 - - [ ] Define the data model with a `synchronized` boolean flag (default `false`).
150 - - [ ] Implement the local `DatabaseService` (SQLite/Hive) with CRUD operations.
151 - - [ ] Implement the remote `ApiClientService` for network requests.
152 - - [ ] Create the `Repository` class combining both services.
153 - - [ ] Implement the read method returning a `Stream<T>` (yield local, fetch remote, update local, yield remote).
154 - - [ ] Implement the write method (write local, attempt remote, update `synchronized` flag).
155 - - [ ] Implement a background sync function to process records where `synchronized == false`.
156 - - [ ] Run validator -> review errors -> fix (Test offline behavior by disabling network).
157 -
158 -### Workflow: Pre-warming the Android FlutterEngine
159 -Follow these steps to cache the FlutterEngine for seamless Android integration.
160 -
161 -- [ ] **Task Progress:**
162 - - [ ] Locate the Android `Application` class (create one if it doesn't exist and register in `AndroidManifest.xml`).
163 - - [ ] Instantiate a new `FlutterEngine`.
164 - - [ ] (Optional) Set the initial route via `navigationChannel.setInitialRoute()`.
165 - - [ ] Execute the Dart entrypoint via `dartExecutor.executeDartEntrypoint()`.
166 - - [ ] Store the engine in `FlutterEngineCache.getInstance().put()`.
167 - - [ ] Update the target `FlutterActivity` or `FlutterFragment` to use `.withCachedEngine("id")`.
168 - - [ ] Run validator -> review errors -> fix (Verify no blank screen appears during transition).
.claude/skills/flutter-embedding-native-views/SKILL.md deleted
-197
@@ -1,197 +0,0 @@
1 ----
2 -name: "flutter-embedding-native-views"
3 -description: "Embeds native Android, iOS, or macOS views into a Flutter app. Use when integrating complex native components like maps or web views."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:20:28 GMT"
7 -
8 ----
9 -# Integrating Platform Views and Web Content
10 -
11 -## Contents
12 -- [Platform Views Architecture](#platform-views-architecture)
13 -- [Web Embedding Architecture](#web-embedding-architecture)
14 -- [Workflow: Implementing Android Platform Views](#workflow-implementing-android-platform-views)
15 -- [Workflow: Implementing iOS Platform Views](#workflow-implementing-ios-platform-views)
16 -- [Workflow: Embedding Flutter in Web Applications](#workflow-embedding-flutter-in-web-applications)
17 -- [Examples](#examples)
18 -
19 -## Platform Views Architecture
20 -
21 -Platform Views allow embedding native views (Android, iOS, macOS) directly into a Flutter application, enabling the application of transforms, clips, and opacity from Dart.
22 -
23 -### Android Implementations (API 23+)
24 -Choose the appropriate implementation based on your performance and fidelity requirements:
25 -* **Hybrid Composition:** Renders Flutter content into a texture and uses `SurfaceFlinger` to compose both.
26 - * *Pros:* Best performance and fidelity for Android views.
27 - * *Cons:* Lowers overall application FPS. Certain Flutter widget transformations will not work.
28 -* **Texture Layer (Texture Layer Hybrid Composition):** Renders Platform Views into a texture. Flutter draws them via the texture and renders its own content directly into a Surface.
29 - * *Pros:* Best performance for Flutter rendering. All transformations work correctly.
30 - * *Cons:* Quick scrolling (e.g., WebViews) can be janky. `SurfaceView` is problematic (breaks accessibility). Text magnifiers break unless Flutter is rendered into a `TextureView`.
31 -
32 -### iOS & macOS Implementations
33 -* **iOS:** Uses Hybrid Composition exclusively. The native `UIView` is appended to the view hierarchy.
34 - * *Limitations:* `ShaderMask` and `ColorFiltered` widgets are not supported. `BackdropFilter` has composition limitations.
35 -* **macOS:** Uses Hybrid Composition (`NSView`).
36 - * *Limitations:* Not fully functional in current releases (e.g., gesture support is unavailable).
37 -
38 -### Performance Mitigation
39 -Mitigate performance drops during complex Dart animations by rendering a screenshot of the native view as a placeholder texture while the animation runs.
40 -
41 -## Web Embedding Architecture
42 -
43 -Embed Flutter into existing web applications (Vanilla JS, React, Angular, etc.) using either Full Page mode or Embedded (Multi-view) mode.
44 -
45 -* **Full Page Mode:** Flutter takes over the entire browser window. Use an `iframe` if you need to constrain the Flutter app without modifying the Flutter bootstrap process.
46 -* **Embedded Mode (Multi-view):** Render Flutter into specific HTML elements (`div`s). Requires `multiViewEnabled: true` during engine initialization.
47 - * Manage views from JavaScript using `app.addView()` and `app.removeView()`.
48 - * In Dart, replace `runApp` with `runWidget`.
49 - * Manage the dynamic list of views using `WidgetsBinding.instance.platformDispatcher.views` and render them using `ViewCollection` and `View` widgets.
50 -
51 -## Workflow: Implementing Android Platform Views
52 -
53 -Follow this sequential workflow to implement a Platform View on Android.
54 -
55 -**Task Progress:**
56 -- [ ] 1. Determine the composition mode (Hybrid vs. Texture Layer).
57 -- [ ] 2. Implement the Dart widget.
58 -- [ ] 3. Implement the native Android View and Factory.
59 -- [ ] 4. Register the Platform View in the Android host.
60 -- [ ] 5. Run validator -> review rendering -> fix manual invalidation issues.
61 -
62 -### 1. Dart Implementation
63 -If using **Hybrid Composition**, use `PlatformViewLink`, `AndroidViewSurface`, and `PlatformViewsService.initSurfaceAndroidView`.
64 -If using **Texture Layer**, use the `AndroidView` widget.
65 -
66 -### 2. Native Implementation
67 -Create a class implementing `io.flutter.plugin.platform.PlatformView` that returns your native `android.view.View`.
68 -Create a factory extending `PlatformViewFactory` to instantiate your view.
69 -
70 -### 3. Registration
71 -Register the factory in your `MainActivity.kt` (or plugin) using `flutterEngine.platformViewsController.registry.registerViewFactory`.
72 -
73 -*Note: If your native view uses `SurfaceView` or `SurfaceTexture`, manually call `invalidate` on the View or its parent when content changes, as they do not invalidate themselves automatically.*
74 -
75 -## Workflow: Implementing iOS Platform Views
76 -
77 -Follow this sequential workflow to implement a Platform View on iOS.
78 -
79 -**Task Progress:**
80 -- [ ] 1. Implement the Dart widget using `UiKitView`.
81 -- [ ] 2. Implement the native iOS View (`FlutterPlatformView`) and Factory (`FlutterPlatformViewFactory`).
82 -- [ ] 3. Register the Platform View in `AppDelegate.swift` or the plugin registrar.
83 -- [ ] 4. Run validator -> review composition limitations -> fix unsupported filters.
84 -
85 -## Workflow: Embedding Flutter in Web Applications
86 -
87 -Follow this sequential workflow to embed Flutter into an existing web DOM.
88 -
89 -**Task Progress:**
90 -- [ ] 1. Update `flutter_bootstrap.js` to enable multi-view.
91 -- [ ] 2. Update `main.dart` to use `runWidget` and `ViewCollection`.
92 -- [ ] 3. Implement JavaScript logic to add/remove host elements.
93 -- [ ] 4. Run validator -> review view constraints -> fix CSS conflicts.
94 -
95 -### 1. JavaScript Configuration
96 -In `flutter_bootstrap.js`, initialize the engine with `multiViewEnabled: true`.
97 -Use the returned `app` object to add views: `app.addView({ hostElement: document.getElementById('my-div') })`.
98 -
99 -### 2. Dart Configuration
100 -Replace `runApp()` with `runWidget()`.
101 -Create a root widget that listens to `WidgetsBindingObserver.didChangeMetrics`.
102 -Map over `WidgetsBinding.instance.platformDispatcher.views` to create a `View` widget for each attached `FlutterView`, and wrap them all in a `ViewCollection`.
103 -
104 -## Examples
105 -
106 -### Example: Android Texture Layer (Dart)
107 -```dart
108 -import 'package:flutter/material.dart';
109 -import 'package:flutter/services.dart';
110 -
111 -class NativeAndroidView extends StatelessWidget {
112 - @override
113 - Widget build(BuildContext context) {
114 - const String viewType = 'my_native_view';
115 - final Map<String, dynamic> creationParams = <String, dynamic>{};
116 -
117 - return AndroidView(
118 - viewType: viewType,
119 - layoutDirection: TextDirection.ltr,
120 - creationParams: creationParams,
121 - creationParamsCodec: const StandardMessageCodec(),
122 - );
123 - }
124 -}
125 -```
126 -
127 -### Example: Web Multi-View Initialization (JavaScript)
128 -```javascript
129 -_flutter.loader.load({
130 - onEntrypointLoaded: async function(engineInitializer) {
131 - let engine = await engineInitializer.initializeEngine({
132 - multiViewEnabled: true,
133 - });
134 - let app = await engine.runApp();
135 -
136 - // Add a view to a specific DOM element
137 - let viewId = app.addView({
138 - hostElement: document.querySelector('#flutter-host-container'),
139 - initialData: { customData: 'Hello from JS' }
140 - });
141 - }
142 -});
143 -```
144 -
145 -### Example: Web Multi-View Root Widget (Dart)
146 -```dart
147 -import 'dart:ui' show FlutterView;
148 -import 'package:flutter/widgets.dart';
149 -
150 -void main() {
151 - runWidget(MultiViewApp(viewBuilder: (context) => const MyEmbeddedWidget()));
152 -}
153 -
154 -class MultiViewApp extends StatefulWidget {
155 - final WidgetBuilder viewBuilder;
156 - const MultiViewApp({super.key, required this.viewBuilder});
157 -
158 - @override
159 - State<MultiViewApp> createState() => _MultiViewAppState();
160 -}
161 -
162 -class _MultiViewAppState extends State<MultiViewApp> with WidgetsBindingObserver {
163 - Map<Object, Widget> _views = {};
164 -
165 - @override
166 - void initState() {
167 - super.initState();
168 - WidgetsBinding.instance.addObserver(this);
169 - _updateViews();
170 - }
171 -
172 - @override
173 - void didChangeMetrics() => _updateViews();
174 -
175 - void _updateViews() {
176 - final newViews = <Object, Widget>{};
177 - for (final FlutterView view in WidgetsBinding.instance.platformDispatcher.views) {
178 - newViews[view.viewId] = _views[view.viewId] ?? View(
179 - view: view,
180 - child: Builder(builder: widget.viewBuilder),
181 - );
182 - }
183 - setState(() => _views = newViews);
184 - }
185 -
186 - @override
187 - void dispose() {
188 - WidgetsBinding.instance.removeObserver(this);
189 - super.dispose();
190 - }
191 -
192 - @override
193 - Widget build(BuildContext context) {
194 - return ViewCollection(views: _views.values.toList(growable: false));
195 - }
196 -}
197 -```
.claude/skills/flutter-feature-based-architecture/SKILL.md deleted
-529
@@ -1,529 +0,0 @@
1 ----
2 -name: "flutter-feature-based-architecture"
3 -description: "Architects a Flutter application using a Feature-Based structure with Riverpod state management and a shared core layer. Use when structuring a new project, adding features, or refactoring for scalability."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Fri, 28 Mar 2026 04:05:00 GMT"
7 ----
8 -
9 -# Flutter Feature-Based Architecture with Riverpod
10 -
11 -## Contents
12 -
13 -- [Overview](#overview)
14 -- [Project Structure](#project-structure)
15 -- [Core (Global) Layer](#core-global-layer)
16 -- [Feature Layer](#feature-layer)
17 -- [State Management with Riverpod](#state-management-with-riverpod)
18 -- [Feature Implementation Workflow](#feature-implementation-workflow)
19 -- [Naming Conventions](#naming-conventions)
20 -- [Examples](#examples)
21 -
22 -## Overview
23 -
24 -This skill enforces a **Feature-Based Architecture** where code is organized by feature (vertical slices) rather than by technical layer. Shared, cross-cutting concerns live in a `core/` directory. State management is handled exclusively with **Riverpod** (`flutter_riverpod` / `hooks_riverpod`).
25 -
26 -### Core Principles
27 -
28 -- **Feature Isolation:** Each feature owns its data, providers, and views. Features must **never** import from other features. If two features need the same code, move it to `core/`.
29 -- **Riverpod-First State Management:** All state is managed via Riverpod providers. No `ChangeNotifier`, `Bloc`, or raw `setState` for business logic.
30 -- **Core for Shared Code:** Anything used by 2+ features belongs in `core/`. This includes shared models, repositories, providers, components, constants, utilities, and infrastructure.
31 -- **Unidirectional Data Flow:** Data flows from Repository → Provider/StateNotifier → View. User events flow from View → Provider/StateNotifier → Repository.
32 -- **Single Source of Truth (SSOT):** Each piece of data has exactly one authoritative source — the Repository. Providers expose that data reactively to the UI.
33 -
34 -## Project Structure
35 -
36 -```
37 -lib/
38 -├── core/ # Shared, cross-cutting concerns (global)
39 -│ ├── components/ # Reusable UI widgets used across features
40 -│ ├── constants/ # App-wide constants (colors, URLs, config)
41 -│ ├── extensions/ # Dart extension methods on common types
42 -│ ├── locales/ # Localization keys and config
43 -│ ├── logger/ # App-wide logging utility
44 -│ ├── models/ # Shared domain models
45 -│ ├── providers/ # Shared Riverpod providers
46 -│ ├── repository/ # Shared repositories & services
47 -│ ├── routes/ # App routing / navigation config
48 -│ ├── theme/ # App theme data (colors, text styles, etc.)
49 -│ └── utils/ # General-purpose utility functions
50 -│
51 -├── features/ # Feature modules (vertical slices)
52 -│ ├── auth/ # Example feature
53 -│ │ ├── data/
54 -│ │ │ ├── models/
55 -│ │ │ └── repository/
56 -│ │ ├── providers/
57 -│ │ └── views/
58 -│ │ └── components/
59 -│ ├── home/ # Example feature
60 -│ ├── settings/ # Example feature
61 -│ └── ...
62 -│
63 -└── main.dart # App entry point
64 -```
65 -
66 -## Core (Global) Layer
67 -
68 -The `core/` directory holds code that is **shared across multiple features**. The rule is simple: *if it's used by 2+ features, it belongs in `core/`*.
69 -
70 -### `core/constants/`
71 -
72 -App-wide constant values. Use a barrel file (`constants.dart`) to re-export all files.
73 -
74 -| What to put here | Example |
75 -|-----------------|---------|
76 -| Color constants | `AppColors` with static `Color` fields (primary, secondary, error, success, etc.) |
77 -| URL constants | `AppUrls` with static URL strings (API base, privacy policy, CDN paths) |
78 -| Size/spacing constants | `AppSizes` with static doubles for padding, radius, etc. |
79 -| Config values | API keys (non-secret), pagination limits, timeout durations |
80 -
81 -### `core/components/`
82 -
83 -Reusable UI widgets consumed by multiple features. These are **presentational** widgets that receive data via constructor params — they should not contain business logic.
84 -
85 -Examples: custom dropdowns, reusable form fields, loading indicators, empty state widgets, confirmation dialogs.
86 -
87 -### `core/extensions/`
88 -
89 -Dart extension methods on common types (`String`, `DateTime`, `BuildContext`, `Color`, etc.) that are used across the app.
90 -
91 -### `core/locales/`
92 -
93 -Localization configuration and generated key files (e.g., for `easy_localization`, `intl`, or `flutter_localizations`).
94 -
95 -### `core/logger/`
96 -
97 -A singleton logging utility wrapping a logging package (e.g., `logger`). Provides static methods like `Log.debug()`, `Log.info()`, `Log.error()`, `Log.warning()`. Should be debug-only in release builds.
98 -
99 -### `core/models/`
100 -
101 -Domain models shared across features. Use a barrel file (`models.dart`) for re-exports. Only place models here if they are truly cross-feature. Feature-specific models stay in their feature's `data/models/`.
102 -
103 -### `core/providers/`
104 -
105 -Riverpod providers that are consumed by multiple features. Typically these wrap shared repositories or expose shared state (e.g., current user, app settings, connectivity).
106 -
107 -### `core/repository/`
108 -
109 -Repositories and services for shared data domains. Organize by subdomain:
110 -
111 -```
112 -core/repository/
113 -├── api/ # Base API client, HTTP wrapper
114 -├── auth/ # Shared auth repository (if used by multiple features)
115 -├── storage/ # Local storage / secure storage wrapper
116 -└── ...
117 -```
118 -
119 -Each repository file should also declare its own Riverpod `Provider` at the bottom of the file.
120 -
121 -### `core/routes/`
122 -
123 -App-level routing and navigation configuration (e.g., `GoRouter` setup, route constants, route guards).
124 -
125 -### `core/theme/`
126 -
127 -App theme data — `ThemeData`, text styles, component themes. Keep color definitions in `constants/` and reference them here.
128 -
129 -### `core/utils/`
130 -
131 -General-purpose utility classes and functions that don't fit elsewhere. Examples: phone/URL launchers, file helpers, crypto utilities, date formatters, Excel/CSV export helpers.
132 -
133 -## Feature Layer
134 -
135 -Each feature directory under `features/` follows a **consistent internal structure** with 3 primary subdirectories:
136 -
137 -```
138 -features/<feature_name>/
139 -├── data/ # Data layer
140 -│ ├── models/ # Domain models specific to this feature
141 -│ │ ├── <model>.dart
142 -│ │ └── models.dart # Barrel file (optional)
143 -│ └── repository/ # Repositories (Firestore CRUD, API calls, etc.)
144 -│ └── <feature>_repository.dart
145 -│
146 -├── providers/ # State management layer
147 -│ └── <feature>_providers.dart # All Riverpod providers for this feature
148 -│
149 -└── views/ # UI layer
150 - ├── <feature>_page.dart # Main page widget(s)
151 - ├── add_<feature>_page.dart # Create/edit page (if applicable)
152 - └── components/ # Feature-specific UI components
153 - └── <component>.dart
154 -```
155 -
156 -### Optional Subdirectories
157 -
158 -A feature may add extra subdirectories when needed:
159 -
160 -| Directory | When to add |
161 -|-----------|-------------|
162 -| `utils/` | Feature has its own utility/helper functions |
163 -| `services/` | Feature needs stateless service classes (e.g., scheduling logic, data transformation) |
164 -
165 -### Rules
166 -
167 -1. **Never import from another feature.** If feature A needs something from feature B, extract it to `core/`.
168 -2. **Keep views lean.** Views (`ConsumerWidget` / `ConsumerStatefulWidget`) should only handle UI concerns — layout, animations, navigation. All business logic lives in providers/StateNotifiers.
169 -3. **One provider file per feature** is the default. Split into multiple files only when the file exceeds ~400 lines.
170 -4. **Models must have serialization.** Every model needs `fromMap()` / `fromJson()` and `toMap()` / `toJson()` along with `copyWith()`.
171 -
172 -## State Management with Riverpod
173 -
174 -### Provider Types
175 -
176 -| Provider Type | When to Use | Example |
177 -|---------------|-------------|---------|
178 -| `Provider` | Expose a stateless repository or service instance | `final repoProvider = Provider<Repo>((ref) => Repo());` |
179 -| `StateProvider` | Simple mutable state (filters, toggles, search query) | `final searchProvider = StateProvider<String>((ref) => '');` |
180 -| `StateNotifierProvider` | Complex state with methods (CRUD controllers, paginated lists) | `final listProvider = StateNotifierProvider<Notifier, State>((ref) { ... });` |
181 -| `FutureProvider` | One-shot async data fetching | `final dataProvider = FutureProvider<List<Item>>((ref) async { ... });` |
182 -| `FutureProvider.family` | Parameterized async data fetching | `final itemProvider = FutureProvider.family<Item?, String>((ref, id) async { ... });` |
183 -| `StreamProvider` | Real-time data streams (Firestore snapshots, WebSocket) | `final streamProvider = StreamProvider<List<Item>>((ref) { ... });` |
184 -
185 -### Provider File Organization
186 -
187 -Each feature's `providers/` file should be organized in this order:
188 -
189 -1. **Repository Providers** — `Provider<XRepository>`
190 -2. **Filter/UI State Providers** — `StateProvider<String>`, `StateProvider<bool>`
191 -3. **State Classes** — Immutable state objects with `copyWith()`
192 -4. **StateNotifier Classes** — Business logic (list pagination, CRUD operations)
193 -5. **StateNotifierProvider declarations** — Wiring notifiers to their dependencies
194 -
195 -### Use `autoDispose` by default
196 -
197 -Prefer `.autoDispose` on providers that are scoped to a screen or feature:
198 -
199 -```dart
200 -final featureListProvider = StateNotifierProvider.autoDispose<
201 - FeatureListNotifier, FeatureListState
202 ->((ref) { ... });
203 -```
204 -
205 -This ensures state is cleaned up when the user navigates away.
206 -
207 -## Feature Implementation Workflow
208 -
209 -Follow this sequential workflow when adding a new feature:
210 -
211 -**Task Progress:**
212 -
213 -- [ ] **Step 1: Create Feature Directory.** Create `lib/features/<feature_name>/` with subdirectories: `data/models/`, `data/repository/`, `providers/`, `views/`, and optionally `views/components/`.
214 -- [ ] **Step 2: Define Domain Models.** Create model classes in `data/models/` with `fromMap()`, `toMap()`, and `copyWith()` methods.
215 -- [ ] **Step 3: Implement Repository.** Create repository class in `data/repository/` for data operations (API calls, database CRUD, etc.).
216 -- [ ] **Step 4: Implement Providers.** Create `providers/<feature>_providers.dart` with:
217 - - Repository `Provider`
218 - - Filter `StateProvider`s (if needed)
219 - - State class + `StateNotifier` + `StateNotifierProvider` for list/pagination
220 - - State class + `StateNotifier` + `StateNotifierProvider` for CRUD controller
221 -- [ ] **Step 5: Implement Views.** Create pages in `views/` as `ConsumerWidget` or `ConsumerStatefulWidget`. Use `ref.watch()` for reactive state, `ref.read()` for one-shot actions.
222 -- [ ] **Step 6: Extract Shared Code.** If any model, provider, component, or utility is needed by another feature, move it to the appropriate `core/` subdirectory.
223 -- [ ] **Step 7: Wire Navigation.** Add the new feature's routes to `core/routes/` and any navigation entry points.
224 -
225 -## Naming Conventions
226 -
227 -| Item | Convention | Example |
228 -|------|-----------|---------|
229 -| Feature directory | `snake_case` | `user_profile/`, `order_history/` |
230 -| Model files | `snake_case` | `user_model.dart`, `order_item.dart` |
231 -| Repository files | `<feature>_repository.dart` | `auth_repository.dart` |
232 -| Provider files | `<feature>_providers.dart` | `auth_providers.dart` |
233 -| View files | `<feature>_page.dart` | `auth_page.dart`, `login_page.dart` |
234 -| StateNotifier classes | `PascalCase` + `Notifier` or `Controller` | `OrderListNotifier`, `AuthController` |
235 -| State classes | `PascalCase` + `State` | `OrderListState`, `AuthState` |
236 -| Provider variables | `camelCase` + `Provider` | `orderListProvider`, `authRepositoryProvider` |
237 -| Barrel exports | `models.dart`, `constants.dart` | Re-export all files in the directory |
238 -
239 -## Examples
240 -
241 -### Data Layer: Model
242 -
243 -```dart
244 -// features/orders/data/models/order_model.dart
245 -class OrderModel {
246 - final String id;
247 - final String customerName;
248 - final double total;
249 - final DateTime createdAt;
250 -
251 - const OrderModel({
252 - required this.id,
253 - required this.customerName,
254 - required this.total,
255 - required this.createdAt,
256 - });
257 -
258 - factory OrderModel.fromMap(Map<String, dynamic> map) {
259 - return OrderModel(
260 - id: map['id'] ?? '',
261 - customerName: map['customerName'] ?? '',
262 - total: (map['total'] ?? 0).toDouble(),
263 - createdAt: DateTime.parse(map['createdAt']),
264 - );
265 - }
266 -
267 - Map<String, dynamic> toMap() => {
268 - 'customerName': customerName,
269 - 'total': total,
270 - 'createdAt': createdAt.toIso8601String(),
271 - };
272 -
273 - OrderModel copyWith({
274 - String? id,
275 - String? customerName,
276 - double? total,
277 - DateTime? createdAt,
278 - }) {
279 - return OrderModel(
280 - id: id ?? this.id,
281 - customerName: customerName ?? this.customerName,
282 - total: total ?? this.total,
283 - createdAt: createdAt ?? this.createdAt,
284 - );
285 - }
286 -}
287 -```
288 -
289 -### Data Layer: Repository
290 -
291 -```dart
292 -// features/orders/data/repository/order_repository.dart
293 -class OrderRepository {
294 - // Inject or instantiate your data source (Firestore, REST API, etc.)
295 -
296 - Future<String> addOrder(OrderModel order) async { /* ... */ }
297 - Future<void> updateOrder(String id, OrderModel order) async { /* ... */ }
298 - Future<void> deleteOrder(String id) async { /* ... */ }
299 - Future<OrderModel?> getOrderById(String id) async { /* ... */ }
300 -
301 - // Paginated fetch returning items + cursor for next page
302 - Future<Map<String, dynamic>> getOrdersPaginated(
303 - dynamic lastCursor, {
304 - int limit = 10,
305 - String? searchQuery,
306 - }) async { /* ... */ }
307 -}
308 -```
309 -
310 -### Provider Layer: Paginated List
311 -
312 -```dart
313 -// features/orders/providers/order_providers.dart
314 -
315 -// 1. Repository Provider
316 -final orderRepositoryProvider = Provider<OrderRepository>((ref) {
317 - return OrderRepository();
318 -});
319 -
320 -// 2. Filter Providers
321 -final orderSearchQueryProvider = StateProvider<String>((ref) => '');
322 -
323 -// 3. List State
324 -class OrderListState {
325 - final List<OrderModel> items;
326 - final bool isLoading;
327 - final bool isLoadingMore;
328 - final String? error;
329 - final bool hasMore;
330 - final dynamic lastCursor;
331 -
332 - const OrderListState({
333 - this.items = const [],
334 - this.isLoading = false,
335 - this.isLoadingMore = false,
336 - this.error,
337 - this.hasMore = true,
338 - this.lastCursor,
339 - });
340 -
341 - OrderListState copyWith({ /* all fields */ });
342 -}
343 -
344 -// 4. List Notifier
345 -class OrderListNotifier extends StateNotifier<OrderListState> {
346 - final OrderRepository _repository;
347 - final Ref _ref;
348 - final int _pageSize = 10;
349 -
350 - OrderListNotifier(this._repository, this._ref)
351 - : super(const OrderListState()) {
352 - fetchFirstPage();
353 - }
354 -
355 - Future<void> fetchFirstPage() async {
356 - state = state.copyWith(isLoading: true, error: null);
357 - try {
358 - final result = await _repository.getOrdersPaginated(
359 - null,
360 - limit: _pageSize,
361 - searchQuery: _ref.read(orderSearchQueryProvider),
362 - );
363 - final List<OrderModel> items = result['items'];
364 - state = state.copyWith(
365 - items: items,
366 - isLoading: false,
367 - lastCursor: result['lastCursor'],
368 - hasMore: items.length >= _pageSize,
369 - );
370 - } catch (e) {
371 - state = state.copyWith(isLoading: false, error: e.toString());
372 - }
373 - }
374 -
375 - Future<void> fetchNextPage() async {
376 - if (state.isLoading || state.isLoadingMore || !state.hasMore) return;
377 - state = state.copyWith(isLoadingMore: true);
378 - try {
379 - final result = await _repository.getOrdersPaginated(
380 - state.lastCursor,
381 - limit: _pageSize,
382 - searchQuery: _ref.read(orderSearchQueryProvider),
383 - );
384 - final List<OrderModel> newItems = result['items'];
385 - state = state.copyWith(
386 - items: [...state.items, ...newItems],
387 - isLoadingMore: false,
388 - lastCursor: result['lastCursor'],
389 - hasMore: newItems.length >= _pageSize,
390 - );
391 - } catch (e) {
392 - state = state.copyWith(isLoadingMore: false, error: e.toString());
393 - }
394 - }
395 -
396 - void refresh() => fetchFirstPage();
397 -}
398 -
399 -// 5. List Provider (autoDispose)
400 -final orderListProvider = StateNotifierProvider.autoDispose<
401 - OrderListNotifier, OrderListState
402 ->((ref) {
403 - final repository = ref.watch(orderRepositoryProvider);
404 - ref.watch(orderSearchQueryProvider); // re-create on filter change
405 - return OrderListNotifier(repository, ref);
406 -});
407 -```
408 -
409 -### Provider Layer: CRUD Controller
410 -
411 -```dart
412 -// (continued in the same providers file)
413 -
414 -class OrderControllerState {
415 - final bool isLoading;
416 - final String? error;
417 - final bool isSuccess;
418 -
419 - const OrderControllerState({
420 - this.isLoading = false,
421 - this.error,
422 - this.isSuccess = false,
423 - });
424 -
425 - OrderControllerState copyWith({ /* all fields */ });
426 -}
427 -
428 -class OrderController extends StateNotifier<OrderControllerState> {
429 - final OrderRepository _repository;
430 - final Ref _ref;
431 -
432 - OrderController(this._repository, this._ref)
433 - : super(const OrderControllerState());
434 -
435 - Future<void> addOrder(OrderModel order) async {
436 - state = const OrderControllerState(isLoading: true);
437 - try {
438 - await _repository.addOrder(order);
439 - state = const OrderControllerState(isSuccess: true);
440 - _ref.read(orderListProvider.notifier).refresh();
441 - } catch (e) {
442 - state = OrderControllerState(error: e.toString());
443 - }
444 - }
445 -
446 - Future<void> deleteOrder(String id) async {
447 - state = const OrderControllerState(isLoading: true);
448 - try {
449 - await _repository.deleteOrder(id);
450 - state = const OrderControllerState(isSuccess: true);
451 - _ref.read(orderListProvider.notifier).refresh();
452 - } catch (e) {
453 - state = OrderControllerState(error: e.toString());
454 - }
455 - }
456 -}
457 -
458 -final orderControllerProvider = StateNotifierProvider.autoDispose<
459 - OrderController, OrderControllerState
460 ->((ref) {
461 - final repository = ref.watch(orderRepositoryProvider);
462 - return OrderController(repository, ref);
463 -});
464 -```
465 -
466 -### UI Layer: ConsumerWidget View
467 -
468 -```dart
469 -// features/orders/views/order_list_page.dart
470 -class OrderListPage extends ConsumerWidget {
471 - const OrderListPage({super.key});
472 -
473 - @override
474 - Widget build(BuildContext context, WidgetRef ref) {
475 - final listState = ref.watch(orderListProvider);
476 -
477 - if (listState.isLoading) {
478 - return const Center(child: CircularProgressIndicator());
479 - }
480 - if (listState.error != null) {
481 - return Center(child: Text('Error: ${listState.error}'));
482 - }
483 -
484 - return ListView.builder(
485 - itemCount: listState.items.length + (listState.hasMore ? 1 : 0),
486 - itemBuilder: (context, index) {
487 - if (index == listState.items.length) {
488 - // Load more trigger
489 - ref.read(orderListProvider.notifier).fetchNextPage();
490 - return const Center(child: CircularProgressIndicator());
491 - }
492 - final order = listState.items[index];
493 - return ListTile(
494 - title: Text(order.customerName),
495 - subtitle: Text('\$${order.total.toStringAsFixed(2)}'),
496 - );
497 - },
498 - );
499 - }
500 -}
501 -```
502 -
503 -### Core Layer: Shared Component
504 -
505 -```dart
506 -// core/components/search_field.dart
507 -class AppSearchField extends StatelessWidget {
508 - const AppSearchField({
509 - super.key,
510 - required this.onChanged,
511 - this.hint = 'Search...',
512 - });
513 -
514 - final ValueChanged<String> onChanged;
515 - final String hint;
516 -
517 - @override
518 - Widget build(BuildContext context) {
519 - return TextField(
520 - decoration: InputDecoration(
521 - hintText: hint,
522 - prefixIcon: const Icon(Icons.search),
523 - border: const OutlineInputBorder(),
524 - ),
525 - onChanged: onChanged,
526 - );
527 - }
528 -}
529 -```
.claude/skills/flutter-handling-concurrency/SKILL.md deleted
-179
@@ -1,179 +0,0 @@
1 ----
2 -name: "flutter-handling-concurrency"
3 -description: "Executes long-running tasks in background isolates to keep the UI responsive. Use when performing heavy computations or parsing large datasets."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:23:14 GMT"
7 -
8 ----
9 -# Managing Dart Concurrency and Isolates
10 -
11 -## Contents
12 -- [Core Concepts](#core-concepts)
13 -- [Decision Matrix: Async vs. Isolates](#decision-matrix-async-vs-isolates)
14 -- [Workflows](#workflows)
15 - - [Implementing Standard Asynchronous UI](#implementing-standard-asynchronous-ui)
16 - - [Offloading Short-Lived Heavy Computation](#offloading-short-lived-heavy-computation)
17 - - [Establishing Long-Lived Worker Isolates](#establishing-long-lived-worker-isolates)
18 -- [Examples](#examples)
19 -
20 -## Core Concepts
21 -
22 -Dart utilizes a single-threaded execution model driven by an Event Loop (comparable to the iOS main loop). By default, all Flutter application code runs on the Main Isolate.
23 -
24 -* **Asynchronous Operations (`async`/`await`):** Use for non-blocking I/O tasks (network requests, file access). The Event Loop continues processing other events while waiting for the `Future` to complete.
25 -* **Isolates:** Dart's implementation of lightweight threads. Isolates possess their own isolated memory and do not share state. They communicate exclusively via message passing.
26 -* **Main Isolate:** The default thread where UI rendering and event handling occur. Blocking this isolate causes UI freezing (jank).
27 -* **Worker Isolate:** A spawned isolate used to offload CPU-bound tasks (e.g., decoding large JSON blobs) to prevent Main Isolate blockage.
28 -
29 -## Decision Matrix: Async vs. Isolates
30 -
31 -Apply the following conditional logic to determine the correct concurrency approach:
32 -
33 -* **If** the task is I/O bound (e.g., HTTP request, database read) -> **Use `async`/`await`** on the Main Isolate.
34 -* **If** the task is CPU-bound but executes quickly (< 16ms) -> **Use `async`/`await`** on the Main Isolate.
35 -* **If** the task is CPU-bound, takes significant time, and runs once (e.g., parsing a massive JSON payload) -> **Use `Isolate.run()`**.
36 -* **If** the task requires continuous or repeated background processing with multiple messages passed over time -> **Use `Isolate.spawn()` with `ReceivePort` and `SendPort`**.
37 -
38 -## Workflows
39 -
40 -### Implementing Standard Asynchronous UI
41 -
42 -Use this workflow to fetch and display non-blocking asynchronous data.
43 -
44 -**Task Progress:**
45 -- [ ] Mark the data-fetching function with the `async` keyword.
46 -- [ ] Return a `Future<T>` from the function.
47 -- [ ] Use the `await` keyword to yield execution until the operation completes.
48 -- [ ] Wrap the UI component in a `FutureBuilder<T>` (or `StreamBuilder` for streams).
49 -- [ ] Handle `ConnectionState.waiting`, `hasError`, and `hasData` states within the builder.
50 -- [ ] Run validator -> review UI for loading indicators -> fix missing states.
51 -
52 -### Offloading Short-Lived Heavy Computation
53 -
54 -Use this workflow for one-off, CPU-intensive tasks using Dart 2.19+.
55 -
56 -**Task Progress:**
57 -- [ ] Identify the CPU-bound operation blocking the Main Isolate.
58 -- [ ] Extract the computation into a standalone callback function.
59 -- [ ] Ensure the callback function signature accepts exactly one required, unnamed argument (as per specific architectural constraints).
60 -- [ ] Invoke `Isolate.run()` passing the callback.
61 -- [ ] `await` the result of `Isolate.run()` in the Main Isolate.
62 -- [ ] Assign the returned value to the application state.
63 -
64 -### Establishing Long-Lived Worker Isolates
65 -
66 -Use this workflow for persistent background processes requiring continuous bidirectional communication.
67 -
68 -**Task Progress:**
69 -- [ ] Instantiate a `ReceivePort` on the Main Isolate to listen for messages.
70 -- [ ] Spawn the worker isolate using `Isolate.spawn()`, passing the `ReceivePort.sendPort` as the initial message.
71 -- [ ] In the worker isolate, instantiate its own `ReceivePort`.
72 -- [ ] Send the worker's `SendPort` back to the Main Isolate via the initial port.
73 -- [ ] Store the worker's `SendPort` in the Main Isolate for future message dispatching.
74 -- [ ] Implement listeners on both `ReceivePort` instances to handle incoming messages.
75 -- [ ] Run validator -> review memory leaks -> ensure ports are closed when the isolate is no longer needed.
76 -
77 -## Examples
78 -
79 -### Example 1: Asynchronous UI with FutureBuilder
80 -
81 -```dart
82 -// 1. Define the async operation
83 -Future<String> fetchUserData() async {
84 - await Future.delayed(const Duration(seconds: 2)); // Simulate network I/O
85 - return "User Data Loaded";
86 -}
87 -
88 -// 2. Consume in the UI
89 -Widget build(BuildContext context) {
90 - return FutureBuilder<String>(
91 - future: fetchUserData(),
92 - builder: (context, snapshot) {
93 - if (snapshot.connectionState == ConnectionState.waiting) {
94 - return const CircularProgressIndicator();
95 - } else if (snapshot.hasError) {
96 - return Text('Error: ${snapshot.error}');
97 - } else {
98 - return Text('Result: ${snapshot.data}');
99 - }
100 - },
101 - );
102 -}
103 -```
104 -
105 -### Example 2: Short-Lived Isolate (`Isolate.run`)
106 -
107 -```dart
108 -import 'dart:isolate';
109 -import 'dart:convert';
110 -
111 -// 1. Define the heavy computation callback
112 -// Note: Adhering to the strict single-argument signature requirement.
113 -List<dynamic> decodeHeavyJson(String jsonString) {
114 - return jsonDecode(jsonString) as List<dynamic>;
115 -}
116 -
117 -// 2. Offload to a worker isolate
118 -Future<List<dynamic>> processDataInBackground(String rawJson) async {
119 - // Isolate.run spawns the isolate, runs the computation, returns the value, and exits.
120 - final result = await Isolate.run(() => decodeHeavyJson(rawJson));
121 - return result;
122 -}
123 -```
124 -
125 -### Example 3: Long-Lived Isolate (`ReceivePort` / `SendPort`)
126 -
127 -```dart
128 -import 'dart:isolate';
129 -
130 -class WorkerManager {
131 - late SendPort _workerSendPort;
132 - final ReceivePort _mainReceivePort = ReceivePort();
133 - Isolate? _isolate;
134 -
135 - Future<void> initialize() async {
136 - // 1. Spawn isolate and pass the Main Isolate's SendPort
137 - _isolate = await Isolate.spawn(_workerEntry, _mainReceivePort.sendPort);
138 -
139 - // 2. Listen for messages from the Worker Isolate
140 - _mainReceivePort.listen((message) {
141 - if (message is SendPort) {
142 - // First message is the Worker's SendPort
143 - _workerSendPort = message;
144 - _startCommunication();
145 - } else {
146 - // Subsequent messages are data payloads
147 - print('Main Isolate received: $message');
148 - }
149 - });
150 - }
151 -
152 - void _startCommunication() {
153 - // Send data to the worker
154 - _workerSendPort.send("Process this data");
155 - }
156 -
157 - // 3. Worker Isolate Entry Point
158 - static void _workerEntry(SendPort mainSendPort) {
159 - final workerReceivePort = ReceivePort();
160 -
161 - // Send the Worker's SendPort back to the Main Isolate
162 - mainSendPort.send(workerReceivePort.sendPort);
163 -
164 - // Listen for incoming tasks
165 - workerReceivePort.listen((message) {
166 - print('Worker Isolate received: $message');
167 -
168 - // Perform work and send result back
169 - final result = "Processed: $message";
170 - mainSendPort.send(result);
171 - });
172 - }
173 -
174 - void dispose() {
175 - _mainReceivePort.close();
176 - _isolate?.kill();
177 - }
178 -}
179 -```
.claude/skills/flutter-handling-http-and-json/SKILL.md deleted
-181
@@ -1,181 +0,0 @@
1 ----
2 -name: "flutter-handling-http-and-json"
3 -description: "Executes HTTP requests and handles JSON serialization in a Flutter app. Use when integrating with REST APIs or parsing structured data from external sources."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:18:44 GMT"
7 -
8 ----
9 -# Handling HTTP and JSON
10 -
11 -## Contents
12 -- [Core Guidelines](#core-guidelines)
13 -- [Workflow: Executing HTTP Operations](#workflow-executing-http-operations)
14 -- [Workflow: Implementing JSON Serialization](#workflow-implementing-json-serialization)
15 -- [Workflow: Parsing Large JSON in the Background](#workflow-parsing-large-json-in-the-background)
16 -- [Examples](#examples)
17 -
18 -## Core Guidelines
19 -
20 -- **Enforce HTTPS:** iOS and Android disable cleartext (HTTP) connections by default. Always use HTTPS endpoints. If HTTP is strictly required for debugging, configure `network_security_config.xml` (Android) and `NSAppTransportSecurity` (iOS).
21 -- **Construct URIs Safely:** Always use `Uri.https(authority, unencodedPath, [queryParameters])` to safely build URLs. This handles encoding and formatting reliably, preventing string concatenation errors.
22 -- **Handle Status Codes:** Always validate the `http.Response.statusCode`. Treat `200` (OK) and `201` (Created) as success. Throw explicit exceptions for other codes (do not return `null`).
23 -- **Prevent UI Jank:** Move expensive JSON parsing operations (taking >16ms) to a background isolate using the `compute()` function.
24 -- **Structured AI Output:** When integrating LLMs, enforce reliable JSON output by specifying a strict JSON schema in the system prompt and setting the response MIME type to `application/json`.
25 -
26 -## Workflow: Executing HTTP Operations
27 -
28 -Use this workflow to implement network requests using the `http` package.
29 -
30 -**Task Progress:**
31 -- [ ] Add the `http` package to `pubspec.yaml`.
32 -- [ ] Configure platform permissions (Internet permission in `AndroidManifest.xml` and macOS `.entitlements`).
33 -- [ ] Construct the target `Uri`.
34 -- [ ] Execute the HTTP method.
35 -- [ ] Validate the response and parse the JSON payload.
36 -
37 -**Conditional Implementation:**
38 -- **If fetching data (GET):** Use `http.get(uri)`.
39 -- **If sending new data (POST):** Use `http.post(uri, headers: {...}, body: jsonEncode(data))`. Ensure `Content-Type` is `application/json; charset=UTF-8`.
40 -- **If updating data (PUT):** Use `http.put(uri, headers: {...}, body: jsonEncode(data))`.
41 -- **If deleting data (DELETE):** Use `http.delete(uri, headers: {...})`.
42 -
43 -**Feedback Loop: Validation & Error Handling**
44 -1. Run the HTTP request.
45 -2. Check `response.statusCode`.
46 -3. If `200` or `201`, call `jsonDecode(response.body)` and map to a Dart object.
47 -4. If any other code, throw an `Exception('Failed to load/update/delete resource')`.
48 -5. Review errors -> fix endpoint, headers, or payload structure.
49 -
50 -## Workflow: Implementing JSON Serialization
51 -
52 -Choose the serialization strategy based on project complexity.
53 -
54 -**Conditional Implementation:**
55 -- **If building a small prototype or simple models:** Use manual serialization with `dart:convert`.
56 -- **If building a production app with complex/nested models:** Use code generation with `json_serializable`.
57 -
58 -### Manual Serialization Setup
59 -**Task Progress:**
60 -- [ ] Import `dart:convert`.
61 -- [ ] Define the Model class with `final` properties.
62 -- [ ] Implement a `factory Model.fromJson(Map<String, dynamic> json)` constructor.
63 -- [ ] Implement a `Map<String, dynamic> toJson()` method.
64 -
65 -### Code Generation Setup (`json_serializable`)
66 -**Task Progress:**
67 -- [ ] Add dependencies: `flutter pub add json_annotation` and `flutter pub add -d build_runner json_serializable`.
68 -- [ ] Import `json_annotation.dart` in the model file.
69 -- [ ] Add the `part 'model_name.g.dart';` directive.
70 -- [ ] Annotate the class with `@JsonSerializable()`. Use `explicitToJson: true` if the class contains nested models.
71 -- [ ] Define the `fromJson` factory and `toJson` method delegating to the generated functions.
72 -- [ ] Run the generator: `dart run build_runner build --delete-conflicting-outputs`.
73 -
74 -## Workflow: Parsing Large JSON in the Background
75 -
76 -Use this workflow to prevent frame drops when parsing large JSON payloads (e.g., lists of 1000+ items).
77 -
78 -**Task Progress:**
79 -- [ ] Create a top-level or static function that takes a `String` (the response body) and returns the parsed Dart object (e.g., `List<Model>`).
80 -- [ ] Inside the function, call `jsonDecode` and map the results to the Model class.
81 -- [ ] In the HTTP fetch method, pass the top-level parsing function and the `response.body` to Flutter's `compute()` function.
82 -
83 -## Examples
84 -
85 -### Example 1: HTTP GET with Manual Serialization
86 -```dart
87 -import 'dart:convert';
88 -import 'package:http/http.dart' as http;
89 -
90 -class Album {
91 - final int id;
92 - final String title;
93 -
94 - const Album({required this.id, required this.title});
95 -
96 - factory Album.fromJson(Map<String, dynamic> json) {
97 - return Album(
98 - id: json['id'] as int,
99 - title: json['title'] as String,
100 - );
101 - }
102 -}
103 -
104 -Future<Album> fetchAlbum() async {
105 - final uri = Uri.https('jsonplaceholder.typicode.com', '/albums/1');
106 - final response = await http.get(uri);
107 -
108 - if (response.statusCode == 200) {
109 - return Album.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
110 - } else {
111 - throw Exception('Failed to load album');
112 - }
113 -}
114 -```
115 -
116 -### Example 2: HTTP POST Request
117 -```dart
118 -Future<Album> createAlbum(String title) async {
119 - final uri = Uri.https('jsonplaceholder.typicode.com', '/albums');
120 - final response = await http.post(
121 - uri,
122 - headers: <String, String>{
123 - 'Content-Type': 'application/json; charset=UTF-8',
124 - },
125 - body: jsonEncode(<String, String>{'title': title}),
126 - );
127 -
128 - if (response.statusCode == 201) {
129 - return Album.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
130 - } else {
131 - throw Exception('Failed to create album.');
132 - }
133 -}
134 -```
135 -
136 -### Example 3: Background Parsing with `compute`
137 -```dart
138 -import 'dart:convert';
139 -import 'package:flutter/foundation.dart';
140 -import 'package:http/http.dart' as http;
141 -
142 -// 1. Top-level function for parsing
143 -List<Photo> parsePhotos(String responseBody) {
144 - final parsed = (jsonDecode(responseBody) as List<Object?>)
145 - .cast<Map<String, Object?>>();
146 - return parsed.map<Photo>(Photo.fromJson).toList();
147 -}
148 -
149 -// 2. Fetch function using compute
150 -Future<List<Photo>> fetchPhotos(http.Client client) async {
151 - final uri = Uri.https('jsonplaceholder.typicode.com', '/photos');
152 - final response = await client.get(uri);
153 -
154 - if (response.statusCode == 200) {
155 - // Run parsePhotos in a separate isolate
156 - return compute(parsePhotos, response.body);
157 - } else {
158 - throw Exception('Failed to load photos');
159 - }
160 -}
161 -```
162 -
163 -### Example 4: Code Generation (`json_serializable`)
164 -```dart
165 -import 'package:json_annotation/json_annotation.dart';
166 -
167 -part 'user.g.dart';
168 -
169 -@JsonSerializable(explicitToJson: true)
170 -class User {
171 - final String name;
172 -
173 - @JsonKey(name: 'registration_date_millis')
174 - final int registrationDateMillis;
175 -
176 - User(this.name, this.registrationDateMillis);
177 -
178 - factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
179 - Map<String, dynamic> toJson() => _$UserToJson(this);
180 -}
181 -```
.claude/skills/flutter-implementing-navigation-and-routing/SKILL.md deleted
-205
@@ -1,205 +0,0 @@
1 ----
2 -name: "flutter-implementing-navigation-and-routing"
3 -description: "Handles routing, navigation, and deep linking in a Flutter application. Use when moving between screens or setting up URL-based navigation."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:30:17 GMT"
7 -
8 ----
9 -# Implementing Navigation and Routing in Flutter
10 -
11 -## Contents
12 -- [Core Concepts](#core-concepts)
13 -- [Implementing Imperative Navigation](#implementing-imperative-navigation)
14 -- [Implementing Declarative Navigation](#implementing-declarative-navigation)
15 -- [Implementing Nested Navigation](#implementing-nested-navigation)
16 -- [Workflows](#workflows)
17 -- [Examples](#examples)
18 -
19 -## Core Concepts
20 -
21 -- **Routes:** In Flutter, screens and pages are referred to as *routes*. A route is simply a widget. This is equivalent to an `Activity` in Android or a `ViewController` in iOS.
22 -- **Navigator vs. Router:**
23 - - Use `Navigator` (Imperative) for small applications without complex deep linking requirements. It manages a stack of `Route` objects.
24 - - Use `Router` (Declarative) for applications with advanced navigation, web URL synchronization, and specific deep linking requirements.
25 -- **Deep Linking:** Allows an app to open directly to a specific location based on a URL. Supported on iOS, Android, and Web. Web requires no additional setup.
26 -- **Named Routes:** Avoid using named routes (`MaterialApp.routes` and `Navigator.pushNamed`) for most applications. They have rigid deep linking behavior and do not support the browser forward button. Use a routing package like `go_router` instead.
27 -
28 -## Implementing Imperative Navigation
29 -
30 -Use the `Navigator` widget to push and pop routes using platform-specific transition animations (`MaterialPageRoute` or `CupertinoPageRoute`).
31 -
32 -### Pushing and Popping
33 -- Navigate to a new route using `Navigator.push(context, route)`.
34 -- Return to the previous route using `Navigator.pop(context)`.
35 -- Use `Navigator.pushReplacement()` to replace the current route, or `Navigator.pushAndRemoveUntil()` to clear the stack based on a condition.
36 -
37 -### Passing and Returning Data
38 -- **Sending Data:** Pass data directly into the constructor of the destination widget. Alternatively, pass data via the `settings: RouteSettings(arguments: data)` parameter of the `PageRoute` and extract it using `ModalRoute.of(context)!.settings.arguments`.
39 -- **Returning Data:** Pass the return value to the `pop` method: `Navigator.pop(context, resultData)`. Await the result on the pushing side: `final result = await Navigator.push(...)`.
40 -
41 -## Implementing Declarative Navigation
42 -
43 -For apps requiring deep linking, web URL support, or complex routing, implement the `Router` API via a declarative routing package like `go_router`.
44 -
45 -- Switch from `MaterialApp` to `MaterialApp.router`.
46 -- Define a router configuration that parses route paths and configures the `Navigator` automatically.
47 -- Navigate using package-specific APIs (e.g., `context.go('/path')`).
48 -- **Page-backed vs. Pageless Routes:** Declarative routes are *page-backed* (deep-linkable). Imperative pushes (e.g., dialogs, bottom sheets) are *pageless*. Removing a page-backed route automatically removes all subsequent pageless routes.
49 -
50 -## Implementing Nested Navigation
51 -
52 -Implement nested navigation to manage a sub-flow of screens (e.g., a multi-step setup process or persistent bottom navigation tabs) independently from the top-level global navigator.
53 -
54 -- Instantiate a new `Navigator` widget inside the host widget.
55 -- Assign a `GlobalKey<NavigatorState>` to the nested `Navigator` to control it programmatically.
56 -- Implement the `onGenerateRoute` callback within the nested `Navigator` to resolve sub-routes.
57 -- Intercept hardware back button presses using `PopScope` to prevent the top-level navigator from popping the entire nested flow prematurely.
58 -
59 -## Workflows
60 -
61 -### Workflow: Standard Screen Transition
62 -Copy this checklist to track progress when implementing a basic screen transition:
63 -- [ ] Create the destination widget (Route).
64 -- [ ] Define required data parameters in the destination widget's constructor.
65 -- [ ] Implement `Navigator.push()` in the source widget.
66 -- [ ] Wrap the destination widget in a `MaterialPageRoute` or `CupertinoPageRoute`.
67 -- [ ] Implement `Navigator.pop()` in the destination widget to return.
68 -
69 -### Workflow: Implementing Deep-Linkable Routing
70 -Use this conditional workflow when setting up app-wide routing:
71 -- [ ] **If** the app is simple and requires no deep linking:
72 - - [ ] Use standard `MaterialApp` and `Navigator.push()`.
73 -- [ ] **If** the app requires deep linking, web support, or complex flows:
74 - - [ ] Add the `go_router` package.
75 - - [ ] Change `MaterialApp` to `MaterialApp.router`.
76 - - [ ] Define the `GoRouter` configuration with all top-level routes.
77 - - [ ] Replace `Navigator.push()` with `context.go()` or `context.push()`.
78 -
79 -### Workflow: Creating a Nested Navigation Flow
80 -Run this workflow when building a multi-step sub-flow (e.g., IoT device setup):
81 -- [ ] Define string constants for the nested route paths.
82 -- [ ] Create a `GlobalKey<NavigatorState>` in the host widget's state.
83 -- [ ] Return a `Navigator` widget in the host's `build` method, passing the key.
84 -- [ ] Implement `onGenerateRoute` in the nested `Navigator` to map string paths to specific step widgets.
85 -- [ ] Wrap the host `Scaffold` in a `PopScope` to handle back-button interceptions (e.g., prompting "Are you sure you want to exit setup?").
86 -- [ ] Use `navigatorKey.currentState!.pushNamed()` to advance steps within the flow.
87 -
88 -## Examples
89 -
90 -### Example: Passing Data via Constructor (Imperative)
91 -
92 -```dart
93 -// 1. Define the data model
94 -class Todo {
95 - final String title;
96 - final String description;
97 - const Todo(this.title, this.description);
98 -}
99 -
100 -// 2. Source Screen
101 -class TodosScreen extends StatelessWidget {
102 - final List<Todo> todos;
103 - const TodosScreen({super.key, required this.todos});
104 -
105 - @override
106 - Widget build(BuildContext context) {
107 - return Scaffold(
108 - appBar: AppBar(title: const Text('Todos')),
109 - body: ListView.builder(
110 - itemCount: todos.length,
111 - itemBuilder: (context, index) {
112 - return ListTile(
113 - title: Text(todos[index].title),
114 - onTap: () {
115 - // Push and pass data via constructor
116 - Navigator.push(
117 - context,
118 - MaterialPageRoute(
119 - builder: (context) => DetailScreen(todo: todos[index]),
120 - ),
121 - );
122 - },
123 - );
124 - },
125 - ),
126 - );
127 - }
128 -}
129 -
130 -// 3. Destination Screen
131 -class DetailScreen extends StatelessWidget {
132 - final Todo todo;
133 - const DetailScreen({super.key, required this.todo});
134 -
135 - @override
136 - Widget build(BuildContext context) {
137 - return Scaffold(
138 - appBar: AppBar(title: Text(todo.title)),
139 - body: Padding(
140 - padding: const EdgeInsets.all(16),
141 - child: Text(todo.description),
142 - ),
143 - );
144 - }
145 -}
146 -```
147 -
148 -### Example: Nested Navigation Flow
149 -
150 -```dart
151 -class SetupFlow extends StatefulWidget {
152 - final String initialRoute;
153 - const SetupFlow({super.key, required this.initialRoute});
154 -
155 - @override
156 - State<SetupFlow> createState() => _SetupFlowState();
157 -}
158 -
159 -class _SetupFlowState extends State<SetupFlow> {
160 - final _navigatorKey = GlobalKey<NavigatorState>();
161 -
162 - void _exitSetup() => Navigator.of(context).pop();
163 -
164 - @override
165 - Widget build(BuildContext context) {
166 - return PopScope(
167 - canPop: false,
168 - onPopInvokedWithResult: (didPop, _) async {
169 - if (didPop) return;
170 - // Intercept back button to prevent accidental exit
171 - _exitSetup();
172 - },
173 - child: Scaffold(
174 - appBar: AppBar(title: const Text('Setup')),
175 - body: Navigator(
176 - key: _navigatorKey,
177 - initialRoute: widget.initialRoute,
178 - onGenerateRoute: _onGenerateRoute,
179 - ),
180 - ),
181 - );
182 - }
183 -
184 - Route<Widget> _onGenerateRoute(RouteSettings settings) {
185 - Widget page;
186 - switch (settings.name) {
187 - case 'step1':
188 - page = StepOnePage(
189 - onComplete: () => _navigatorKey.currentState!.pushNamed('step2'),
190 - );
191 - break;
192 - case 'step2':
193 - page = StepTwoPage(onComplete: _exitSetup);
194 - break;
195 - default:
196 - throw StateError('Unexpected route name: ${settings.name}!');
197 - }
198 -
199 - return MaterialPageRoute(
200 - builder: (context) => page,
201 - settings: settings,
202 - );
203 - }
204 -}
205 -```
.claude/skills/flutter-improving-accessibility/SKILL.md deleted
-110
@@ -1,110 +0,0 @@
1 ----
2 -name: "flutter-improving-accessibility"
3 -description: "Configures a Flutter app to support assistive technologies like Screen Readers. Use when ensuring an application is usable for people with disabilities."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:17:37 GMT"
7 -
8 ----
9 -# Implementing Flutter Accessibility
10 -
11 -## Contents
12 -- [UI Design and Styling](#ui-design-and-styling)
13 -- [Accessibility Widgets](#accessibility-widgets)
14 -- [Web Accessibility](#web-accessibility)
15 -- [Adaptive and Responsive Design](#adaptive-and-responsive-design)
16 -- [Workflows](#workflows)
17 -- [Examples](#examples)
18 -
19 -## UI Design and Styling
20 -Design layouts to accommodate dynamic scaling and high visibility. Flutter automatically calculates font sizes based on OS-level accessibility settings.
21 -
22 -* **Font Scaling:** Ensure layouts provide sufficient room to render all contents when font sizes are increased to their maximum OS settings. Avoid hardcoding fixed heights on text containers.
23 -* **Color Contrast:** Maintain a contrast ratio of at least 4.5:1 for small text and 3.0:1 for large text (18pt+ regular or 14pt+ bold) to meet W3C standards.
24 -* **Tap Targets:** Enforce a minimum tap target size of 48x48 logical pixels to accommodate users with limited dexterity.
25 -
26 -## Accessibility Widgets
27 -Utilize Flutter's catalog of accessibility widgets to manipulate the semantics tree exposed to assistive technologies (like TalkBack or VoiceOver).
28 -
29 -* **`Semantics`**: Use this to annotate the widget tree with a description of the meaning of the widgets. Assign specific roles using the `SemanticsRole` enum (e.g., button, link, heading) when building custom components.
30 -* **`MergeSemantics`**: Wrap composite widgets to merge the semantics of all descendants into a single selectable node for screen readers.
31 -* **`ExcludeSemantics`**: Use this to drop the semantics of all descendants, hiding redundant or purely decorative sub-widgets from accessibility tools.
32 -
33 -## Web Accessibility
34 -Flutter web renders UI on a single canvas, requiring a specialized DOM layer to expose structure to browsers.
35 -
36 -* **Enable Semantics:** Web accessibility is disabled by default for performance. Users can enable it via an invisible button (`aria-label="Enable accessibility"`).
37 -* **Programmatic Enablement:** If building a web-first application requiring default accessibility, force the semantics tree generation at startup.
38 -* **Semantic Roles:** Rely on standard widgets (`TabBar`, `MenuAnchor`, `Table`) for automatic ARIA role mapping. For custom components, explicitly assign `SemanticsRole` values to ensure screen readers interpret the elements correctly.
39 -
40 -## Adaptive and Responsive Design
41 -Differentiate between adaptive and responsive paradigms to build universal applications.
42 -
43 -* **Responsive Design:** Adjust the placement, sizing, and reflowing of design elements to fit the available screen space.
44 -* **Adaptive Design:** Select appropriate layouts (e.g., bottom navigation vs. side panel) and input mechanisms (e.g., touch vs. mouse/keyboard) to make the UI usable within the current device context. Design to the strengths of each form factor.
45 -
46 -## Workflows
47 -
48 -### Task Progress: Accessibility Implementation
49 -Copy this checklist to track accessibility compliance during UI development:
50 -
51 -- [ ] Verify all interactive elements have a minimum tap target of 48x48 pixels.
52 -- [ ] Test layout with maximum OS font size settings to ensure no text clipping or overflow occurs.
53 -- [ ] Validate color contrast ratios (4.5:1 for normal text, 3.0:1 for large text).
54 -- [ ] Wrap custom interactive widgets in `Semantics` and assign the appropriate `SemanticsRole`.
55 -- [ ] Group complex composite widgets using `MergeSemantics` to prevent screen reader fatigue.
56 -- [ ] Hide decorative elements from screen readers using `ExcludeSemantics`.
57 -- [ ] If targeting web, verify ARIA roles are correctly mapped and consider programmatic enablement of the semantics tree.
58 -
59 -### Feedback Loop: Accessibility Validation
60 -Run this loop when finalizing a view or component:
61 -1. **Run validator:** Execute accessibility tests or use OS-level screen readers (VoiceOver/TalkBack) to navigate the view.
62 -2. **Review errors:** Identify unannounced interactive elements, trapped focus, or clipped text.
63 -3. **Fix:** Apply `Semantics`, adjust constraints, or modify colors. Repeat until the screen reader provides a clear, logical traversal of the UI.
64 -
65 -## Examples
66 -
67 -### Programmatic Web Accessibility Enablement
68 -If targeting web and requiring accessibility by default, initialize the semantics binding before running the app.
69 -
70 -```dart
71 -import 'package:flutter/material.dart';
72 -import 'package:flutter/semantics.dart';
73 -import 'package:flutter/foundation.dart';
74 -
75 -void main() {
76 - if (kIsWeb) {
77 - SemanticsBinding.instance.ensureSemantics();
78 - }
79 - runApp(const MyApp());
80 -}
81 -```
82 -
83 -### Custom Component Semantics
84 -If building a custom widget that acts as a list item, explicitly define its semantic role so assistive technologies and web ARIA mappings interpret it correctly.
85 -
86 -```dart
87 -import 'package:flutter/material.dart';
88 -import 'package:flutter/semantics.dart';
89 -
90 -class CustomListItem extends StatelessWidget {
91 - final String text;
92 -
93 - const CustomListItem({super.key, required this.text});
94 -
95 - @override
96 - Widget build(BuildContext context) {
97 - return Semantics(
98 - role: SemanticsRole.listItem,
99 - label: text,
100 - child: Padding(
101 - padding: const EdgeInsets.all(12.0), // Ensures > 48px tap target if interactive
102 - child: Text(
103 - text,
104 - style: const TextStyle(fontSize: 16), // Ensure contrast ratio > 4.5:1
105 - ),
106 - ),
107 - );
108 - }
109 -}
110 -```
.claude/skills/flutter-interoperating-with-native-apis/SKILL.md deleted
-127
@@ -1,127 +0,0 @@
1 ----
2 -name: "flutter-interoperating-with-native-apis"
3 -description: "Interoperates with native platform APIs on Android, iOS, and the web. Use when accessing device-specific features not available in Dart or calling existing native code."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:21:02 GMT"
7 -
8 ----
9 -# Integrating Platform-Specific Code in Flutter
10 -
11 -## Contents
12 -- [Core Concepts & Terminology](#core-concepts--terminology)
13 -- [Binding to Native C/C++ Code (FFI)](#binding-to-native-cc-code-ffi)
14 -- [Implementing Platform Channels & Pigeon](#implementing-platform-channels--pigeon)
15 -- [Hosting Native Platform Views](#hosting-native-platform-views)
16 -- [Integrating Web Content & Wasm](#integrating-web-content--wasm)
17 -- [Workflows](#workflows)
18 -
19 -## Core Concepts & Terminology
20 -- **FFI (Foreign Function Interface):** The `dart:ffi` library used to bind Dart directly to native C/C++ APIs.
21 -- **Platform Channel:** The asynchronous message-passing system (`MethodChannel`, `BasicMessageChannel`) connecting the Dart client (UI) to the host platform (Kotlin/Java, Swift/Objective-C, C++).
22 -- **Pigeon:** A code-generation tool that creates type-safe Platform Channels.
23 -- **Platform View:** A mechanism to embed native UI components (e.g., Android `View`, iOS `UIView`) directly into the Flutter widget tree.
24 -- **JS Interop:** The modern, Wasm-compatible approach to interacting with JavaScript and DOM APIs using `package:web` and `dart:js_interop`.
25 -
26 -## Binding to Native C/C++ Code (FFI)
27 -Use FFI to execute high-performance native code or utilize existing C/C++ libraries without the overhead of asynchronous Platform Channels.
28 -
29 -### Project Setup
30 -* **If creating a standard C/C++ integration (Recommended since Flutter 3.38):** Use the `package_ffi` template. This utilizes `build.dart` hooks to compile native code, eliminating the need for OS-specific build files (CMake, build.gradle, podspec).
31 - ```bash
32 - flutter create --template=package_ffi <package_name>
33 - ```
34 -* **If requiring access to the Flutter Plugin API or Play Services:** Use the legacy `plugin_ffi` template.
35 - ```bash
36 - flutter create --template=plugin_ffi <plugin_name>
37 - ```
38 -
39 -### Implementation Rules
40 -* **Symbol Visibility:** Always mark C++ symbols with `extern "C"` and prevent linker discarding during link-time optimization (LTO).
41 - ```cpp
42 - extern "C" __attribute__((visibility("default"))) __attribute__((used))
43 - ```
44 -* **Dynamic Library Naming (Apple Platforms):** Ensure your `build.dart` hook produces the exact same filename across all target architectures (e.g., `arm64` vs `x86_64`) and SDKs (`iphoneos` vs `iphonesimulator`). Do not append architecture suffixes to the `.dylib` or `.framework` names.
45 -* **Binding Generation:** Always use `package:ffigen` to generate Dart bindings from your C headers (`.h`). Configure this in `ffigen.yaml`.
46 -
47 -## Implementing Platform Channels & Pigeon
48 -Use Platform Channels when you need to interact with platform-specific APIs (e.g., Battery, Bluetooth, OS-level services) using the platform's native language.
49 -
50 -### Pigeon (Type-Safe Channels)
51 -Always prefer `package:pigeon` over raw `MethodChannel` implementations for complex or frequently used APIs.
52 -1. Define the messaging protocol in a standalone Dart file using Pigeon annotations (`@HostApi()`).
53 -2. Generate the host (Kotlin/Swift/C++) and client (Dart) code.
54 -3. Implement the generated interfaces on the native side.
55 -
56 -### Threading Rules
57 -* **Main Thread Requirement:** Always invoke channel methods destined for Flutter on the platform's main thread (UI thread).
58 -* **Background Execution:** If executing channel handlers on a background thread (Android/iOS), you must use the Task Queue API (`makeBackgroundTaskQueue()`).
59 -* **Isolates:** To use plugins/channels from a Dart background `Isolate`, ensure it is registered using `BackgroundIsolateBinaryMessenger.ensureInitialized(rootIsolateToken)`.
60 -
61 -## Hosting Native Platform Views
62 -Use Platform Views to embed native UI components (e.g., Google Maps, native video players) into the Flutter widget tree.
63 -
64 -### Android Platform Views
65 -Evaluate the trade-offs between the two rendering modes and select the appropriate one:
66 -* **If requiring perfect fidelity, accessibility, or SurfaceView support:** Use **Hybrid Composition** (`PlatformViewLink` + `AndroidViewSurface`). This appends the native view to the hierarchy but may reduce Flutter's rendering performance.
67 -* **If prioritizing Flutter rendering performance and transformations:** Use **Texture Layer** (`AndroidView`). This renders the native view into a texture. Note: Quick scrolling may drop frames, and `SurfaceView` is problematic.
68 -
69 -### iOS Platform Views
70 -* iOS exclusively uses Hybrid Composition.
71 -* Implement `FlutterPlatformViewFactory` and `FlutterPlatformView` in Swift or Objective-C.
72 -* Use the `UiKitView` widget on the Dart side.
73 -* *Limitation:* `ShaderMask` and `ColorFiltered` widgets cannot be applied to iOS Platform Views.
74 -
75 -## Integrating Web Content & Wasm
76 -Flutter Web supports compiling to WebAssembly (Wasm) for improved performance and multi-threading.
77 -
78 -### Wasm Compilation
79 -* Compile to Wasm using: `flutter build web --wasm`.
80 -* **Server Configuration:** To enable multi-threading, configure your HTTP server to emit the following headers:
81 - * `Cross-Origin-Embedder-Policy: credentialless` (or `require-corp`)
82 - * `Cross-Origin-Opener-Policy: same-origin`
83 -* *Limitation:* WasmGC is not currently supported on iOS browsers (WebKit limitation). Flutter will automatically fall back to JavaScript if WasmGC is unavailable.
84 -
85 -### Web Interop
86 -* **If writing new web-specific code:** Strictly use `package:web` and `dart:js_interop`.
87 -* **Do NOT use:** `dart:html`, `dart:js`, or `package:js`. These are incompatible with Wasm compilation.
88 -* **Embedding HTML:** Use `HtmlElementView.fromTagName` to inject arbitrary HTML elements (like `<video>`) into the Flutter Web DOM.
89 -
90 ----
91 -
92 -## Workflows
93 -
94 -### Workflow: Creating a Native FFI Integration
95 -Use this workflow when binding to a C/C++ library.
96 -
97 -- [ ] **Task Progress:**
98 - - [ ] 1. Run `flutter create --template=package_ffi <name>`.
99 - - [ ] 2. Place C/C++ source code in the `src/` directory.
100 - - [ ] 3. Ensure all exported C++ functions are wrapped in `extern "C"` and visibility attributes.
101 - - [ ] 4. Configure `ffigen.yaml` to point to your header files.
102 - - [ ] 5. Run `dart run ffigen` to generate Dart bindings.
103 - - [ ] 6. Modify `hook/build.dart` if linking against pre-compiled or system libraries.
104 - - [ ] 7. Run validator -> `flutter test` -> review errors -> fix.
105 -
106 -### Workflow: Implementing a Type-Safe Platform Channel (Pigeon)
107 -Use this workflow when you need to call Kotlin/Swift APIs from Dart.
108 -
109 -- [ ] **Task Progress:**
110 - - [ ] 1. Add `pigeon` to `dev_dependencies`.
111 - - [ ] 2. Create `pigeons/messages.dart` and define data classes and `@HostApi()` abstract classes.
112 - - [ ] 3. Run the Pigeon generator script to output Dart, Kotlin, and Swift files.
113 - - [ ] 4. **Android:** Implement the generated interface in `MainActivity.kt` or your Plugin class.
114 - - [ ] 5. **iOS:** Implement the generated protocol in `AppDelegate.swift` or your Plugin class.
115 - - [ ] 6. **Dart:** Import the generated Dart file and call the API methods.
116 - - [ ] 7. Run validator -> verify cross-platform compilation -> review errors -> fix.
117 -
118 -### Workflow: Embedding a Native Platform View
119 -Use this workflow when embedding a native UI component (e.g., a native map or camera view).
120 -
121 -- [ ] **Task Progress:**
122 - - [ ] 1. **Dart:** Create a widget that conditionally returns `AndroidView` (or `PlatformViewLink`) for Android, and `UiKitView` for iOS based on `defaultTargetPlatform`.
123 - - [ ] 2. **Android:** Create a class implementing `PlatformView` that returns the native Android `View`.
124 - - [ ] 3. **Android:** Create a `PlatformViewFactory` and register it in `configureFlutterEngine`.
125 - - [ ] 4. **iOS:** Create a class implementing `FlutterPlatformView` that returns the native `UIView`.
126 - - [ ] 5. **iOS:** Create a `FlutterPlatformViewFactory` and register it in `application:didFinishLaunchingWithOptions:`.
127 - - [ ] 6. Run validator -> test on physical Android and iOS devices -> review UI clipping/scrolling issues -> fix.
.claude/skills/flutter-localizing-apps/SKILL.md deleted
-204
@@ -1,204 +0,0 @@
1 ----
2 -name: "flutter-localizing-apps"
3 -description: "Configures a Flutter app to support multiple languages and regions. Use when preparing an application for international markets and diverse user locales."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:17:07 GMT"
7 -
8 ----
9 -# Localizing Flutter Applications
10 -
11 -## Contents
12 -- [Core Configuration](#core-configuration)
13 -- [Defining ARB Resources](#defining-arb-resources)
14 -- [App Integration](#app-integration)
15 -- [Advanced Formatting](#advanced-formatting)
16 -- [Workflows](#workflows)
17 -- [Troubleshooting & Gotchas](#troubleshooting--gotchas)
18 -
19 -## Core Configuration
20 -
21 -Configure the project to support code generation for localizations.
22 -
23 -1. Add required dependencies to `pubspec.yaml`:
24 -```yaml
25 -dependencies:
26 - flutter:
27 - sdk: flutter
28 - flutter_localizations:
29 - sdk: flutter
30 - intl: any
31 -
32 -flutter:
33 - generate: true # Required for l10n code generation
34 -```
35 -
36 -2. Create an `l10n.yaml` file in the project root to configure the `gen-l10n` tool:
37 -```yaml
38 -arb-dir: lib/l10n
39 -template-arb-file: app_en.arb
40 -output-localization-file: app_localizations.dart
41 -# Optional: Set to false to generate files into lib/ instead of the synthetic package
42 -# synthetic-package: false
43 -```
44 -
45 -## Defining ARB Resources
46 -
47 -Store localized strings in Application Resource Bundle (`.arb`) files within the configured `arb-dir`.
48 -
49 -Create the template file (e.g., `lib/l10n/app_en.arb`):
50 -```json
51 -{
52 - "helloWorld": "Hello World!",
53 - "@helloWorld": {
54 - "description": "The conventional newborn programmer greeting"
55 - }
56 -}
57 -```
58 -
59 -Create translation files (e.g., `lib/l10n/app_es.arb`):
60 -```json
61 -{
62 - "helloWorld": "¡Hola Mundo!"
63 -}
64 -```
65 -
66 -## App Integration
67 -
68 -Initialize the `Localizations` widget by configuring the root `MaterialApp` or `CupertinoApp`.
69 -
70 -```dart
71 -import 'package:flutter_localizations/flutter_localizations.dart';
72 -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; // Adjust import if synthetic-package is false
73 -
74 -return MaterialApp(
75 - title: 'Localized App',
76 - localizationsDelegates: const [
77 - AppLocalizations.delegate,
78 - GlobalMaterialLocalizations.delegate,
79 - GlobalWidgetsLocalizations.delegate,
80 - GlobalCupertinoLocalizations.delegate,
81 - ],
82 - supportedLocales: const [
83 - Locale('en'), // English
84 - Locale('es'), // Spanish
85 - ],
86 - home: const MyHomePage(),
87 -);
88 -```
89 -
90 -Access localized values in the widget tree using the generated `AppLocalizations` class:
91 -```dart
92 -Text(AppLocalizations.of(context)!.helloWorld)
93 -```
94 -
95 -*Note: If using `WidgetsApp` instead of `MaterialApp`, omit `GlobalMaterialLocalizations.delegate`.*
96 -
97 -## Advanced Formatting
98 -
99 -Use placeholders, plurals, and selects for dynamic content. Define parameters in the `@key` metadata.
100 -
101 -### Placeholders
102 -```json
103 -"hello": "Hello {userName}",
104 -"@hello": {
105 - "description": "A message with a single parameter",
106 - "placeholders": {
107 - "userName": {
108 - "type": "String",
109 - "example": "Bob"
110 - }
111 - }
112 -}
113 -```
114 -
115 -### Plurals
116 -```json
117 -"nWombats": "{count, plural, =0{no wombats} =1{1 wombat} other{{count} wombats}}",
118 -"@nWombats": {
119 - "placeholders": {
120 - "count": {
121 - "type": "num",
122 - "format": "compact"
123 - }
124 - }
125 -}
126 -```
127 -
128 -### Selects (Gender/Enums)
129 -```json
130 -"pronoun": "{gender, select, male{he} female{she} other{they}}",
131 -"@pronoun": {
132 - "placeholders": {
133 - "gender": {
134 - "type": "String"
135 - }
136 - }
137 -}
138 -```
139 -
140 -### Dates and Numbers
141 -Use `format` and `optionalParameters` to leverage `intl` formatting.
142 -```json
143 -"dateMessage": "Date: {date}",
144 -"@dateMessage": {
145 - "placeholders": {
146 - "date": {
147 - "type": "DateTime",
148 - "format": "yMd"
149 - }
150 - }
151 -}
152 -```
153 -
154 -## Workflows
155 -
156 -### Task Progress: Adding a New Language
157 -Copy this checklist to track progress when introducing a new locale.
158 -
159 -- [ ] Create a new `.arb` file in the `arb-dir` (e.g., `app_fr.arb`).
160 -- [ ] Translate all keys present in the template `.arb` file.
161 -- [ ] Add the new `Locale` to the `supportedLocales` list in `MaterialApp`.
162 -- [ ] Run validator -> Execute `flutter gen-l10n` to verify ARB syntax and regenerate `AppLocalizations`.
163 -- [ ] Review errors -> Fix any missing placeholders or malformed plural/select statements.
164 -- [ ] If targeting iOS, complete the "Configuring iOS App Bundle" workflow.
165 -
166 -### Task Progress: Configuring iOS App Bundle
167 -Flutter handles runtime localization, but iOS requires bundle-level configuration for the App Store and system settings.
168 -
169 -- [ ] Open `ios/Runner.xcodeproj` in Xcode.
170 -- [ ] Select the `Runner` project in the Project Navigator.
171 -- [ ] Navigate to the `Info` tab.
172 -- [ ] Under the **Localizations** section, click the `+` button.
173 -- [ ] Add the newly supported languages/regions.
174 -- [ ] Run validator -> Build the iOS app to ensure `project.pbxproj` is correctly updated.
175 -
176 -## Troubleshooting & Gotchas
177 -
178 -### Missing Localizations Ancestor
179 -Widgets like `TextField` and `CupertinoTabBar` require a `Localizations` ancestor with specific delegates (`MaterialLocalizations` or `CupertinoLocalizations`).
180 -
181 -**Error:** `No MaterialLocalizations found.` or `CupertinoTabBar requires a Localizations parent...`
182 -**Fix:** Ensure the widget is a descendant of `MaterialApp`/`CupertinoApp`. If building a standalone widget tree (e.g., in tests or a custom `WidgetsApp`), wrap the widget in a `Localizations` widget:
183 -
184 -```dart
185 -Localizations(
186 - locale: const Locale('en', 'US'),
187 - delegates: const [
188 - DefaultWidgetsLocalizations.delegate,
189 - DefaultMaterialLocalizations.delegate, // Required for TextField
190 - DefaultCupertinoLocalizations.delegate, // Required for CupertinoTabBar
191 - ],
192 - child: child,
193 -)
194 -```
195 -
196 -### Advanced Locale Definition
197 -If supporting languages with multiple scripts (e.g., Chinese), use `Locale.fromSubtags` to explicitly define the `scriptCode` and `countryCode` to prevent Flutter from resolving to an unexpected variant.
198 -
199 -```dart
200 -supportedLocales: const [
201 - Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hans', countryCode: 'CN'),
202 - Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hant', countryCode: 'TW'),
203 -]
204 -```
.claude/skills/flutter-managing-state/SKILL.md deleted
-203
@@ -1,203 +0,0 @@
1 ----
2 -name: "flutter-managing-state"
3 -description: "Manages application and ephemeral state in a Flutter app. Use when sharing data between widgets or handling complex UI state transitions."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:18:06 GMT"
7 -
8 ----
9 -# Managing State in Flutter
10 -
11 -## Contents
12 -- [Core Concepts](#core-concepts)
13 -- [Architecture and Data Flow](#architecture-and-data-flow)
14 -- [Workflow: Selecting a State Management Approach](#workflow-selecting-a-state-management-approach)
15 -- [Workflow: Implementing MVVM with Provider](#workflow-implementing-mvvm-with-provider)
16 -- [Examples](#examples)
17 -
18 -## Core Concepts
19 -
20 -Flutter's UI is declarative; it is built to reflect the current state of the app (`UI = f(state)`). When state changes, trigger a rebuild of the UI that depends on that state.
21 -
22 -Distinguish between two primary types of state to determine your management strategy:
23 -* **Ephemeral State (Local State):** State contained neatly within a single widget (e.g., current page in a `PageView`, current selected tab, animation progress). Manage this using a `StatefulWidget` and `setState()`.
24 -* **App State (Shared State):** State shared across multiple parts of the app and maintained between user sessions (e.g., user preferences, login info, shopping cart contents). Manage this using advanced approaches like `InheritedWidget`, the `provider` package, and the MVVM architecture.
25 -
26 -## Architecture and Data Flow
27 -
28 -Implement the **Model-View-ViewModel (MVVM)** design pattern combined with **Unidirectional Data Flow (UDF)** for scalable app state management.
29 -
30 -* **Unidirectional Data Flow (UDF):** Enforce a strict flow where state flows *down* from the data layer, through the logic layer, to the UI layer. Events from user interactions flow *up* from the UI layer, to the logic layer, to the data layer.
31 -* **Single Source of Truth (SSOT):** Ensure data changes always happen in the data layer (Repositories). The SSOT class must be the only class capable of modifying its respective data.
32 -* **Model (Data Layer):** Handle low-level tasks like HTTP requests, data caching, and system resources using Repository classes.
33 -* **ViewModel (Logic Layer):** Manage the UI state. Convert app data from the Model into UI State. Extend `ChangeNotifier` and call `notifyListeners()` to trigger UI rebuilds when data changes.
34 -* **View (UI Layer):** Display the state provided by the ViewModel. Keep views lean; they should contain minimal logic (only routing, animations, or simple UI conditionals).
35 -
36 -## Workflow: Selecting a State Management Approach
37 -
38 -Evaluate the scope of the state to determine the correct implementation strategy.
39 -
40 -* **If managing Ephemeral State (single widget scope):**
41 - 1. Subclass `StatefulWidget` and `State`.
42 - 2. Store mutable state as private fields within the `State` class.
43 - 3. Mutate state exclusively inside a `setState()` callback to mark the widget as dirty and schedule a rebuild.
44 -* **If managing App State (shared across widgets):**
45 - 1. Implement the MVVM pattern.
46 - 2. Use the `provider` package (a wrapper around `InheritedWidget`) to inject state into the widget tree.
47 - 3. Use `ChangeNotifier` to emit state updates.
48 -
49 -## Workflow: Implementing MVVM with Provider
50 -
51 -Follow this sequential workflow to implement app-level state management using MVVM and `provider`.
52 -
53 -**Task Progress:**
54 -- [ ] 1. Define the Model (Repository).
55 -- [ ] 2. Create the ViewModel (`ChangeNotifier`).
56 -- [ ] 3. Inject the ViewModel into the Widget Tree.
57 -- [ ] 4. Consume the State in the View.
58 -- [ ] 5. Validate the implementation.
59 -
60 -### 1. Define the Model (Repository)
61 -Create a repository class to act as the Single Source of Truth (SSOT) for the specific data domain. Handle all external API calls or database queries here.
62 -
63 -### 2. Create the ViewModel (`ChangeNotifier`)
64 -Create a ViewModel class that extends `ChangeNotifier`.
65 -* Pass the Repository into the ViewModel via dependency injection.
66 -* Define properties for the UI state (e.g., `isLoading`, `data`, `errorMessage`).
67 -* Implement methods to handle UI events. Inside these methods, mutate the state and call `notifyListeners()` to trigger UI rebuilds.
68 -
69 -### 3. Inject the ViewModel into the Widget Tree
70 -Use `ChangeNotifierProvider` from the `provider` package to provide the ViewModel to the widget subtree that requires it. Place the provider as low in the widget tree as possible to avoid polluting the scope.
71 -
72 -### 4. Consume the State in the View
73 -Access the ViewModel in your `StatelessWidget` or `StatefulWidget`.
74 -* Use `Consumer<MyViewModel>` to rebuild specific parts of the UI when `notifyListeners()` is called.
75 -* Use `context.read<MyViewModel>()` (or `Provider.of<MyViewModel>(context, listen: false)`) inside event handlers (like `onPressed`) to call ViewModel methods without triggering a rebuild of the calling widget.
76 -
77 -### 5. Validate the implementation
78 -Run the following feedback loop to ensure data flows correctly:
79 -1. Trigger a user action in the View.
80 -2. Verify the ViewModel receives the event and calls the Repository.
81 -3. Verify the Repository updates the SSOT and returns data.
82 -4. Verify the ViewModel updates its state and calls `notifyListeners()`.
83 -5. Verify the View rebuilds with the new state.
84 -*Run validator -> review errors -> fix missing `notifyListeners()` calls or incorrect `Provider` scopes.*
85 -
86 -## Examples
87 -
88 -### Ephemeral State Implementation (`setState`)
89 -
90 -Use this pattern strictly for local, UI-only state.
91 -
92 -```dart
93 -class EphemeralCounter extends StatefulWidget {
94 - const EphemeralCounter({super.key});
95 -
96 - @override
97 - State<EphemeralCounter> createState() => _EphemeralCounterState();
98 -}
99 -
100 -class _EphemeralCounterState extends State<EphemeralCounter> {
101 - int _counter = 0; // Local state
102 -
103 - void _increment() {
104 - setState(() {
105 - _counter++; // Mutate state and schedule rebuild
106 - });
107 - }
108 -
109 - @override
110 - Widget build(BuildContext context) {
111 - return ElevatedButton(
112 - onPressed: _increment,
113 - child: Text('Count: $_counter'),
114 - );
115 - }
116 -}
117 -```
118 -
119 -### App State Implementation (MVVM + Provider)
120 -
121 -Use this pattern for shared data and complex business logic.
122 -
123 -```dart
124 -// 1. Model (Repository)
125 -class CartRepository {
126 - Future<void> saveItemToCart(String item) async {
127 - // Simulate network/database call
128 - await Future.delayed(const Duration(milliseconds: 500));
129 - }
130 -}
131 -
132 -// 2. ViewModel (ChangeNotifier)
133 -class CartViewModel extends ChangeNotifier {
134 - final CartRepository repository;
135 -
136 - CartViewModel({required this.repository});
137 -
138 - final List<String> _items = [];
139 - bool isLoading = false;
140 - String? errorMessage;
141 -
142 - List<String> get items => List.unmodifiable(_items);
143 -
144 - Future<void> addItem(String item) async {
145 - isLoading = true;
146 - errorMessage = null;
147 - notifyListeners(); // Trigger loading UI
148 -
149 - try {
150 - await repository.saveItemToCart(item);
151 - _items.add(item);
152 - } catch (e) {
153 - errorMessage = 'Failed to add item';
154 - } finally {
155 - isLoading = false;
156 - notifyListeners(); // Trigger success/error UI
157 - }
158 - }
159 -}
160 -
161 -// 3. Injection & 4. View (UI)
162 -class CartApp extends StatelessWidget {
163 - const CartApp({super.key});
164 -
165 - @override
166 - Widget build(BuildContext context) {
167 - // Inject ViewModel
168 - return ChangeNotifierProvider(
169 - create: (_) => CartViewModel(repository: CartRepository()),
170 - child: const CartScreen(),
171 - );
172 - }
173 -}
174 -
175 -class CartScreen extends StatelessWidget {
176 - const CartScreen({super.key});
177 -
178 - @override
179 - Widget build(BuildContext context) {
180 - return Scaffold(
181 - body: Consumer<CartViewModel>(
182 - builder: (context, viewModel, child) {
183 - if (viewModel.isLoading) {
184 - return const CircularProgressIndicator();
185 - }
186 - if (viewModel.errorMessage != null) {
187 - return Text(viewModel.errorMessage!);
188 - }
189 - return ListView.builder(
190 - itemCount: viewModel.items.length,
191 - itemBuilder: (_, index) => Text(viewModel.items[index]),
192 - );
193 - },
194 - ),
195 - floatingActionButton: FloatingActionButton(
196 - // Use read() to access methods without listening for rebuilds
197 - onPressed: () => context.read<CartViewModel>().addItem('New Item'),
198 - child: const Icon(Icons.add),
199 - ),
200 - );
201 - }
202 -}
203 -```
.claude/skills/flutter-reducing-app-size/SKILL.md deleted
-100
@@ -1,100 +0,0 @@
1 ----
2 -name: "flutter-reducing-app-size"
3 -description: "Measures and optimizes the size of Flutter application bundles for deployment. Use when minimizing download size or meeting app store package constraints."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:22:44 GMT"
7 -
8 ----
9 -# Reducing Flutter App Size
10 -
11 -## Contents
12 -- [Core Concepts](#core-concepts)
13 -- [Workflow: Generating Size Analysis Files](#workflow-generating-size-analysis-files)
14 -- [Workflow: Analyzing Size Data in DevTools](#workflow-analyzing-size-data-in-devtools)
15 -- [Workflow: Estimating iOS Download Size](#workflow-estimating-ios-download-size)
16 -- [Workflow: Implementing Size Reduction Strategies](#workflow-implementing-size-reduction-strategies)
17 -- [Examples](#examples)
18 -
19 -## Core Concepts
20 -- **Debug vs. Release:** Never use debug builds to measure app size. Debug builds include VM overhead and lack Ahead-Of-Time (AOT) compilation and tree-shaking.
21 -- **Upload vs. Download Size:** The size of an upload package (APK, AAB, IPA) does not represent the end-user download size. App stores filter redundant native library architectures and asset densities based on the target device.
22 -- **AOT Tree-Shaking:** The Dart AOT compiler automatically removes unused or unreachable code in profile and release modes.
23 -- **Size Analysis JSON:** The `--analyze-size` flag generates a `*-code-size-analysis_*.json` file detailing the byte size of packages, libraries, classes, and functions.
24 -
25 -## Workflow: Generating Size Analysis Files
26 -
27 -Use this workflow to generate the raw data required for size analysis.
28 -
29 -**Task Progress:**
30 -- [ ] Determine the target platform (apk, appbundle, ios, linux, macos, windows).
31 -- [ ] Run the Flutter build command with the `--analyze-size` flag.
32 -- [ ] Locate the generated `*-code-size-analysis_*.json` file in the `build/` directory.
33 -
34 -**Conditional Logic:**
35 -- **If targeting Android:** Run `flutter build apk --analyze-size` or `flutter build appbundle --analyze-size`.
36 -- **If targeting iOS:** Run `flutter build ios --analyze-size`. *Note: This creates a `.app` file useful for relative content sizing, but not for estimating final App Store download size. Use the [Estimating iOS Download Size](#workflow-estimating-ios-download-size) workflow for accurate iOS metrics.*
37 -- **If targeting Desktop:** Run `flutter build [windows|macos|linux] --analyze-size`.
38 -
39 -## Workflow: Analyzing Size Data in DevTools
40 -
41 -Use this workflow to visualize and drill down into the Size Analysis JSON.
42 -
43 -**Task Progress:**
44 -- [ ] Launch DevTools by running `dart devtools` in the terminal.
45 -- [ ] Select "Open app size tool" from the DevTools landing page.
46 -- [ ] Upload the generated `*-code-size-analysis_*.json` file.
47 -- [ ] Inspect the treemap or tree view to identify large packages, libraries, or assets.
48 -- [ ] **Feedback Loop:**
49 - 1. Identify the largest contributors to app size.
50 - 2. Determine if the dependency or asset is strictly necessary.
51 - 3. Remove, replace, or optimize the identified component.
52 - 4. Regenerate the Size Analysis JSON and compare the new build against the old build using the DevTools "Diff" tab.
53 -
54 -## Workflow: Estimating iOS Download Size
55 -
56 -Use this workflow to get an accurate projection of iOS download and installation sizes across different devices.
57 -
58 -**Task Progress:**
59 -- [ ] Configure the app version and build number in `pubspec.yaml`.
60 -- [ ] Generate an Xcode archive by running `flutter build ipa --export-method development`.
61 -- [ ] Open the generated archive (`build/ios/archive/*.xcarchive`) in Xcode.
62 -- [ ] Click **Distribute App** and select **Development**.
63 -- [ ] In the App Thinning configuration, select **All compatible device variants**.
64 -- [ ] Check the option to **Strip Swift symbols**.
65 -- [ ] Sign and export the IPA.
66 -- [ ] Open the exported directory and review the `App Thinning Size Report.txt` file to evaluate projected sizes per device.
67 -
68 -## Workflow: Implementing Size Reduction Strategies
69 -
70 -Apply these strategies to actively reduce the compiled footprint of the application.
71 -
72 -**Task Progress:**
73 -- [ ] **Split Debug Info:** Strip debug symbols from the compiled binary and store them in separate files.
74 -- [ ] **Remove Unused Resources:** Audit the `pubspec.yaml` and `assets/` directory. Delete any images, fonts, or files not actively referenced in the codebase.
75 -- [ ] **Minimize Library Resources:** Review third-party packages. If a package imports massive resource files (e.g., large icon sets or localization files) but only a fraction is used, consider alternative packages or custom implementations.
76 -- [ ] **Compress Media:** Compress all PNG and JPEG assets using tools like `pngquant`, `imageoptim`, or WebP conversion before bundling them into the app.
77 -
78 -## Examples
79 -
80 -### Generating Size Analysis (Android)
81 -```bash
82 -# Generate the size analysis JSON for an Android App Bundle
83 -flutter build appbundle --analyze-size --target-platform=android-arm64
84 -```
85 -
86 -### Splitting Debug Info (Release Build)
87 -```bash
88 -# Build an APK while stripping debug info to reduce binary size
89 -flutter build apk --obfuscate --split-debug-info=build/app/outputs/symbols
90 -```
91 -
92 -### Reading the iOS App Thinning Size Report
93 -When reviewing `App Thinning Size Report.txt`, look for the specific target device to understand the true impact on the user:
94 -```text
95 -Variant: Runner-7433FC8E-1DF4-4299-A7E8-E00768671BEB.ipa
96 -Supported variant descriptors: [device: iPhone12,1, os-version: 13.0]
97 -App + On Demand Resources size: 5.4 MB compressed, 13.7 MB uncompressed
98 -App size: 5.4 MB compressed, 13.7 MB uncompressed
99 -```
100 -*Interpretation: The end-user download size (compressed) is 5.4 MB, and the on-device footprint (uncompressed) is 13.7 MB.*
.claude/skills/flutter-setting-up-on-linux/SKILL.md deleted
-138
@@ -1,138 +0,0 @@
1 ----
2 -name: "flutter-setting-up-on-linux"
3 -description: "Sets up a Linux environment for Flutter development. Use when configuring a Linux machine to run, build, or deploy Flutter applications."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:12:22 GMT"
7 -
8 ----
9 -# Setting Up a Linux Environment for Flutter Development
10 -
11 -## Contents
12 -- [System Dependencies](#system-dependencies)
13 -- [Workflow: Configuring the Linux Toolchain](#workflow-configuring-the-linux-toolchain)
14 -- [Workflow: Validating the Environment](#workflow-validating-the-environment)
15 -- [Workflow: Preparing for Distribution (Snapcraft)](#workflow-preparing-for-distribution-snapcraft)
16 -- [Examples](#examples)
17 -
18 -## System Dependencies
19 -To build and run Flutter applications on a Linux desktop, install the required C/C++ toolchain and system libraries. Flutter relies on `dart:ffi` to interface with Linux system calls and the GTK framework for UI rendering.
20 -
21 -Required packages for Debian/Ubuntu-based distributions:
22 -* **Core Utilities:** `curl`, `git`, `unzip`, `xz-utils`, `zip`
23 -* **Build Tools:** `clang`, `cmake`, `ninja-build`, `pkg-config`
24 -* **Libraries:** `libglu1-mesa`, `libgtk-3-dev`, `libstdc++-12-dev`
25 -
26 -## Workflow: Configuring the Linux Toolchain
27 -
28 -Follow this sequential workflow to prepare the Linux host for Flutter desktop development.
29 -
30 -**Task Progress:**
31 -- [ ] 1. Update package lists and upgrade existing packages.
32 -- [ ] 2. Install core utilities and build dependencies.
33 -- [ ] 3. Configure IDE/Editor with Flutter support.
34 -- [ ] 4. (Conditional) Enable Linux support on ChromeOS.
35 -
36 -**1. Update and Install Dependencies**
37 -Execute the following command to install all required packages on Debian/Ubuntu systems:
38 -```bash
39 -sudo apt-get update -y && sudo apt-get upgrade -y
40 -sudo apt-get install -y curl git unzip xz-utils zip libglu1-mesa clang cmake ninja-build pkg-config libgtk-3-dev libstdc++-12-dev
41 -```
42 -
43 -**2. Conditional: ChromeOS Setup**
44 -* **If developing on a Chromebook:** Turn on Linux support in the ChromeOS settings. Ensure the Linux container is fully updated using the `apt-get` commands above before proceeding.
45 -
46 -**3. IDE Configuration**
47 -Install Visual Studio Code, Android Studio, or an IntelliJ-based IDE. Install the official Dart and Flutter extensions/plugins to enable language server features and debugging capabilities.
48 -
49 -## Workflow: Validating the Environment
50 -
51 -Run this feedback loop to ensure the toolchain is correctly recognized by the Flutter SDK.
52 -
53 -**Task Progress:**
54 -- [ ] 1. Run environment validator.
55 -- [ ] 2. Verify connected Linux devices.
56 -- [ ] 3. Resolve toolchain errors.
57 -
58 -**1. Run Validator**
59 -Execute the Flutter diagnostic tool with verbose output:
60 -```bash
61 -flutter doctor -v
62 -```
63 -
64 -**2. Review and Fix (Feedback Loop)**
65 -* **If errors exist under the "Linux toolchain" section:** Review the missing dependencies, install the flagged packages, and re-run `flutter doctor -v`. Repeat until the Linux toolchain section passes.
66 -
67 -**3. Verify Device Availability**
68 -Ensure the Linux desktop is recognized as a valid deployment target:
69 -```bash
70 -flutter devices
71 -```
72 -*Expected Output:* At least one entry must display with the platform marked as **linux**.
73 -
74 -## Workflow: Preparing for Distribution (Snapcraft)
75 -
76 -When preparing a release build for the Snap Store, configure the Snapcraft build environment.
77 -
78 -**Task Progress:**
79 -- [ ] 1. Install Snapcraft and LXD.
80 -- [ ] 2. Configure LXD.
81 -- [ ] 3. Build the Snap package.
82 -
83 -**1. Install Build Tools**
84 -```bash
85 -sudo snap install snapcraft --classic
86 -sudo snap install lxd
87 -```
88 -
89 -**2. Configure LXD**
90 -Initialize LXD and add the current user to the `lxd` group:
91 -```bash
92 -sudo lxd init
93 -sudo usermod -a -G lxd <your_username>
94 -```
95 -*Note: Log out and log back in to apply the group changes.*
96 -
97 -**3. Build the Snap**
98 -Navigate to the project root containing the `snap/snapcraft.yaml` file and execute the build:
99 -```bash
100 -snapcraft --use-lxd
101 -```
102 -
103 -## Examples
104 -
105 -### Baseline `snapcraft.yaml` Configuration
106 -Use this template for the `<project_root>/snap/snapcraft.yaml` file when packaging a Flutter Linux app for the Snap Store.
107 -
108 -```yaml
109 -name: super-cool-app
110 -version: 0.1.0
111 -summary: Super Cool App
112 -description: Super Cool App that does everything!
113 -
114 -confinement: strict
115 -base: core22
116 -grade: stable
117 -
118 -slots:
119 - dbus-super-cool-app:
120 - interface: dbus
121 - bus: session
122 - name: org.bar.super_cool_app
123 -
124 -apps:
125 - super-cool-app:
126 - command: super_cool_app
127 - extensions: [gnome]
128 - plugs:
129 - - network
130 - slots:
131 - - dbus-super-cool-app
132 -
133 -parts:
134 - super-cool-app:
135 - source: .
136 - plugin: flutter
137 - flutter-target: lib/main.dart
138 -```
.claude/skills/flutter-setting-up-on-macos/SKILL.md deleted
-75
@@ -1,75 +0,0 @@
1 ----
2 -name: "flutter-setting-up-on-macos"
3 -description: "Sets up a macOS environment for Flutter development. Use when configuring a macOS machine to run, build, or deploy Flutter applications for iOS or macOS."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:12:50 GMT"
7 -
8 ----
9 -# Setting Up a macOS Environment for Flutter Development
10 -
11 -## Contents
12 -- [Prerequisites](#prerequisites)
13 -- [Tooling Configuration](#tooling-configuration)
14 -- [Workflow: Configuring macOS Tooling](#workflow-configuring-macos-tooling)
15 -- [Workflow: Validating the Environment](#workflow-validating-the-environment)
16 -- [Troubleshooting](#troubleshooting)
17 -
18 -## Prerequisites
19 -Ensure the following baseline requirements are met before configuring the macOS-specific toolchain:
20 -- macOS operating system.
21 -- Flutter SDK installed and added to the system `PATH`.
22 -- Active internet connection for downloading toolchains and dependencies.
23 -
24 -## Tooling Configuration
25 -macOS desktop development requires specific Apple toolchains to compile and debug native Swift and Objective-C code.
26 -- **Xcode**: Required for compiling macOS desktop applications.
27 -- **CocoaPods**: Required for managing native dependencies used by Flutter plugins.
28 -
29 -## Workflow: Configuring macOS Tooling
30 -
31 -Copy and follow this checklist to configure the macOS build environment.
32 -
33 -- [ ] **Install Xcode**: Install the latest version of Xcode from the Mac App Store or the Apple Developer portal.
34 -- [ ] **Configure Command-Line Tools**: Link the Xcode command-line tools to the installed Xcode version. Run the following command in the terminal:
35 - ```bash
36 - sudo sh -c 'xcode-select -s /Applications/Xcode.app/Contents/Developer && xcodebuild -runFirstLaunch'
37 - ```
38 - *Conditional*: If Xcode is installed in a custom directory, replace `/Applications/Xcode.app` with the correct absolute path.
39 -- [ ] **Accept Xcode Licenses**: Accept the required developer licenses by running:
40 - ```bash
41 - sudo xcodebuild -license
42 - ```
43 - Read and agree to the prompts.
44 -- [ ] **Install CocoaPods**: Install CocoaPods to handle native macOS plugin dependencies.
45 - ```bash
46 - sudo gem install cocoapods
47 - ```
48 - *Conditional*: If CocoaPods is already installed, ensure it is updated to the latest version (`sudo gem update cocoapods`).
49 -
50 -## Workflow: Validating the Environment
51 -
52 -Execute this feedback loop to ensure the environment is correctly configured for macOS desktop development.
53 -
54 -- [ ] **Run Validator**: Execute the Flutter diagnostic tool with verbose output:
55 - ```bash
56 - flutter doctor -v
57 - ```
58 -- [ ] **Review Errors**: Check the `Xcode` section in the output.
59 -- [ ] **Fix & Retry**: If errors or missing components are reported under the Xcode section, resolve them according to the output instructions, then re-run `flutter doctor -v` until the Xcode section passes.
60 -- [ ] **Verify Device Availability**: Confirm that Flutter recognizes the macOS desktop as a valid deployment target:
61 - ```bash
62 - flutter devices
63 - ```
64 - *Success Criteria*: The output must contain at least one entry with `macos` listed as the platform.
65 -
66 -## Troubleshooting
67 -
68 -If the validation workflow fails, apply the following resolutions:
69 -
70 -- **Missing Command-Line Tools**: If `flutter doctor` reports missing tools, ensure the `xcode-select` command was run with `sudo` and points to the correct `.app` directory.
71 -- **CocoaPods Not Found**: If CocoaPods is installed but not detected, verify that your Ruby `gem` binary path is included in your shell's `PATH` environment variable.
72 -- **Device Not Listed**: If `flutter devices` does not list `macos`, ensure desktop support is enabled in your Flutter configuration:
73 - ```bash
74 - flutter config --enable-macos-desktop
75 - ```
.claude/skills/flutter-setting-up-on-windows/SKILL.md deleted
-103
@@ -1,103 +0,0 @@
1 ----
2 -name: "flutter-setting-up-on-windows"
3 -description: "Sets up a Windows environment for Flutter development. Use when configuring a Windows machine to run, build, or deploy Flutter applications for Windows desktop or Android."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:13:13 GMT"
7 -
8 ----
9 -# Setting Up Flutter for Windows Development
10 -
11 -## Contents
12 -- [Core Requirements](#core-requirements)
13 -- [Workflow: Installing and Configuring the SDK](#workflow-installing-and-configuring-the-sdk)
14 -- [Workflow: Configuring Tooling and IDEs](#workflow-configuring-tooling-and-ides)
15 -- [Workflow: Configuring Target Platforms](#workflow-configuring-target-platforms)
16 -- [Workflow: Building and Packaging for Windows](#workflow-building-and-packaging-for-windows)
17 -- [Workflow: Generating and Installing Certificates](#workflow-generating-and-installing-certificates)
18 -- [Examples](#examples)
19 -
20 -## Core Requirements
21 -Configure the Windows environment to support both Flutter framework execution and native C/C++ compilation. Differentiate strictly between **Visual Studio** (required for Windows desktop C++ compilation) and **VS Code** (the recommended Dart/Flutter code editor).
22 -
23 -## Workflow: Installing and Configuring the SDK
24 -
25 -Follow this sequential workflow to initialize the Flutter SDK on a Windows machine.
26 -
27 -- [ ] Download the latest stable Flutter SDK for Windows.
28 -- [ ] Extract the SDK to a directory with standard user privileges (e.g., `C:\src\flutter`). Do not install in protected directories like `C:\Program Files\`.
29 -- [ ] Copy the absolute path to the Flutter SDK's `bin` directory.
30 -- [ ] Open Windows Environment Variables settings and append the `bin` directory path to the system or user `PATH` variable.
31 -- [ ] Open a new terminal session to apply the `PATH` changes.
32 -- [ ] **Feedback Loop:** Run validator -> review errors -> fix.
33 - 1. Execute `flutter doctor -v`.
34 - 2. Review the output for missing dependencies or path issues.
35 - 3. Resolve any flagged errors before proceeding to tooling setup.
36 -
37 -## Workflow: Configuring Tooling and IDEs
38 -
39 -- [ ] Install **Visual Studio** (not VS Code).
40 -- [ ] Select and install the **Desktop development with C++** workload during the Visual Studio installation process. This is mandatory for compiling Windows desktop applications.
41 -- [ ] Install your preferred code editor (VS Code, Android Studio, or IntelliJ).
42 -- [ ] Install the official Flutter and Dart extensions/plugins within your chosen editor.
43 -
44 -## Workflow: Configuring Target Platforms
45 -
46 -Apply conditional logic based on the specific platform you are targeting for development.
47 -
48 -**If targeting Windows Desktop:**
49 -- [ ] Ensure the Visual Studio C++ workload is fully updated.
50 -- [ ] Restart your IDE so it detects the Windows desktop device.
51 -- [ ] To disable platforms you do not intend to compile for, execute `flutter config --no-enable-<platform>` (e.g., `flutter config --no-enable-windows-desktop`).
52 -
53 -**If targeting Android on Windows:**
54 -- [ ] **For physical devices:** Enable Developer Options and USB debugging on the device. Install the specific OEM USB drivers for Windows.
55 -- [ ] **For emulators:** Open the Android Virtual Device (AVD) manager. Under "Emulated Performance" -> "Graphics acceleration", select an option specifying "Hardware" to enable hardware acceleration.
56 -- [ ] Verify the device connection by running `flutter devices`.
57 -
58 -## Workflow: Building and Packaging for Windows
59 -
60 -To distribute a Windows desktop application, assemble the compiled executable and its required dependencies into a single distributable archive.
61 -
62 -- [ ] Execute `flutter build windows` to compile the release build.
63 -- [ ] Navigate to `build\windows\runner\Release\`.
64 -- [ ] Create a new staging directory for the distribution zip.
65 -- [ ] Copy the following assets from the `Release` directory into the staging directory:
66 - - The application executable (`.exe`).
67 - - All generated `.dll` files.
68 - - The entire `data` directory.
69 -- [ ] Copy the required Visual C++ redistributables into the staging directory alongside the executable:
70 - - `msvcp140.dll`
71 - - `vcruntime140.dll`
72 - - `vcruntime140_1.dll`
73 -- [ ] Compress the staging directory into a `.zip` file for distribution.
74 -
75 -## Workflow: Generating and Installing Certificates
76 -
77 -If you require a self-signed certificate for MSIX packaging or local testing, use OpenSSL.
78 -
79 -- [ ] Install OpenSSL and add its `bin` directory to your `PATH` environment variable.
80 -- [ ] Generate a private key: `openssl genrsa -out mykeyname.key 2048`
81 -- [ ] Generate a Certificate Signing Request (CSR): `openssl req -new -key mykeyname.key -out mycsrname.csr`
82 -- [ ] Generate the signed certificate (CRT): `openssl x509 -in mycsrname.csr -out mycrtname.crt -req -signkey mykeyname.key -days 10000`
83 -- [ ] Generate the `.pfx` file: `openssl pkcs12 -export -out CERTIFICATE.pfx -inkey mykeyname.key -in mycrtname.crt`
84 -- [ ] Install the `.pfx` certificate on the local Windows machine. Place it in the Certificate Store under **Trusted Root Certification Authorities** prior to installing the application.
85 -
86 -## Examples
87 -
88 -### Windows Distribution Directory Structure
89 -When assembling your Windows build for distribution, ensure the directory structure strictly matches the following layout before zipping:
90 -
91 -```text
92 -Release_Archive/
93 -│ my_flutter_app.exe
94 -│ flutter_windows.dll
95 -│ msvcp140.dll
96 -│ vcruntime140.dll
97 -│ vcruntime140_1.dll
98 -│
99 -└───data/
100 - │ app.so
101 - │ icudtl.dat
102 - │ ...
103 -```
.claude/skills/flutter-testing-apps/SKILL.md deleted
-182
@@ -1,182 +0,0 @@
1 ----
2 -name: "flutter-testing-apps"
3 -description: "Implements unit, widget, and integration tests for a Flutter app. Use when ensuring code quality and preventing regressions through automated testing."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:22:10 GMT"
7 -
8 ----
9 -# Testing Flutter Applications
10 -
11 -## Contents
12 -- [Core Testing Strategies](#core-testing-strategies)
13 -- [Architectural Testing Guidelines](#architectural-testing-guidelines)
14 -- [Plugin Testing Guidelines](#plugin-testing-guidelines)
15 -- [Workflows](#workflows)
16 -- [Examples](#examples)
17 -
18 -## Core Testing Strategies
19 -
20 -Balance your testing suite across three main categories to optimize for confidence, maintenance cost, dependencies, and execution speed.
21 -
22 -### Unit Tests
23 -Use unit tests to verify the correctness of a single function, method, or class under various conditions.
24 -- Mock all external dependencies.
25 -- Do not involve disk I/O, screen rendering, or user actions from outside the test process.
26 -- Execute using the `test` or `flutter_test` package.
27 -
28 -### Widget Tests
29 -Use widget tests (component tests) to ensure a single widget's UI looks and interacts as expected.
30 -- Provide the appropriate widget lifecycle context using `WidgetTester`.
31 -- Use `Finder` classes to locate widgets and `Matcher` constants to verify their existence and state.
32 -- Test views and UI interactions without spinning up the full application.
33 -
34 -### Integration Tests
35 -Use integration tests (end-to-end or GUI testing) to validate how individual pieces of an app work together and to capture performance metrics on real devices.
36 -- Add the `integration_test` package as a dependency.
37 -- Run on physical devices, OS emulators, or Firebase Test Lab.
38 -- Prioritize integration tests for routing, dependency injection, and critical user flows.
39 -
40 -## Architectural Testing Guidelines
41 -
42 -Design your application for observability and testability. Ensure all components can be tested both in isolation and together.
43 -
44 -- **ViewModels**: Write unit tests for every ViewModel class. Test the UI logic without relying on Flutter libraries or testing frameworks.
45 -- **Repositories & Services**: Write unit tests for every service and repository. Mock the underlying data sources (e.g., HTTP clients, local databases).
46 -- **Views**: Write widget tests for all views. Pass faked or mocked ViewModels and Repositories into the widget tree to isolate the UI.
47 -- **Fakes over Mocks**: Prefer creating `Fake` implementations of your repositories (e.g., `FakeUserRepository`) over using mocking libraries when testing ViewModels and Views to ensure well-defined inputs and outputs.
48 -
49 -## Plugin Testing Guidelines
50 -
51 -When testing plugins, combine Dart tests with native platform tests to ensure full coverage across the method channel.
52 -
53 -- **Dart Tests**: Use Dart unit and widget tests for the Dart-facing API. Mock the platform channel to validate Dart logic.
54 -- **Native Unit Tests**: Implement native unit tests for isolated platform logic.
55 - - Android: Configure JUnit tests in `android/src/test/`.
56 - - iOS/macOS: Configure XCTest tests in `example/ios/RunnerTests/` and `example/macos/RunnerTests/`.
57 - - Linux/Windows: Configure GoogleTest tests in `linux/test/` and `windows/test/`.
58 -- **Native UI Tests**: Use Espresso (Android) or XCUITest (iOS) if the plugin requires native UI interactions.
59 -- **Integration Tests**: Write at least one integration test for each platform channel call to verify Dart-to-Native communication.
60 -- **End-to-End Fallback**: If integration tests cannot cover a flow (e.g., mocking device state), synthesize calls to the method channel entry point using native unit tests, and test the Dart public API using Dart unit tests.
61 -
62 -## Workflows
63 -
64 -### Workflow: Implementing a Component Test Suite
65 -Copy and track this checklist when implementing tests for a new architectural feature.
66 -
67 -- [ ] **Task Progress**
68 - - [ ] Create `Fake` implementations for any new Repositories or Services.
69 - - [ ] Write Unit Tests for the Repository (mocking the API/Database).
70 - - [ ] Write Unit Tests for the ViewModel (injecting the Fake Repositories).
71 - - [ ] Write Widget Tests for the View (injecting the ViewModel and Fake Repositories).
72 - - [ ] Write an Integration Test for the critical path involving this feature.
73 - - [ ] Run validator -> review coverage -> fix missing edge cases.
74 -
75 -### Workflow: Running Integration Tests
76 -Follow conditional logic based on the target platform when executing integration tests.
77 -
78 -1. **If testing on Mobile (Local)**:
79 - - Connect the Android/iOS device or emulator.
80 - - Run: `flutter test integration_test/app_test.dart`
81 -2. **If testing on Web**:
82 - - Install and launch ChromeDriver: `chromedriver --port=4444`
83 - - Run: `flutter drive --driver=test_driver/integration_test.dart --target=integration_test/app_test.dart -d chrome`
84 -3. **If testing on Linux (CI System)**:
85 - - Invoke an X server using `xvfb-run` to provide a display environment.
86 - - Run: `xvfb-run flutter test integration_test/app_test.dart -d linux`
87 -4. **If testing via Firebase Test Lab**:
88 - - Build the Android test APKs: `flutter build apk --debug` and `./gradlew app:assembleAndroidTest`
89 - - Upload the App APK and Test APK to the Firebase Console.
90 -
91 -## Examples
92 -
93 -### Example: ViewModel Unit Test
94 -Demonstrates testing a ViewModel using a Fake Repository.
95 -
96 -```dart
97 -import 'package:flutter_test/flutter_test.dart';
98 -
99 -void main() {
100 - group('HomeViewModel tests', () {
101 - test('Load bookings successfully', () {
102 - // Inject fake dependencies
103 - final viewModel = HomeViewModel(
104 - bookingRepository: FakeBookingRepository()..createBooking(kBooking),
105 - userRepository: FakeUserRepository(),
106 - );
107 -
108 - // Verify state
109 - expect(viewModel.bookings.isNotEmpty, true);
110 - });
111 - });
112 -}
113 -```
114 -
115 -### Example: View Widget Test
116 -Demonstrates testing a View by pumping a localized widget tree with fake dependencies.
117 -
118 -```dart
119 -import 'package:flutter/material.dart';
120 -import 'package:flutter_test/flutter_test.dart';
121 -
122 -void main() {
123 - group('HomeScreen tests', () {
124 - late HomeViewModel viewModel;
125 - late FakeBookingRepository bookingRepository;
126 -
127 - setUp(() {
128 - bookingRepository = FakeBookingRepository()..createBooking(kBooking);
129 - viewModel = HomeViewModel(
130 - bookingRepository: bookingRepository,
131 - userRepository: FakeUserRepository(),
132 - );
133 - });
134 -
135 - testWidgets('renders bookings list', (WidgetTester tester) async {
136 - await tester.pumpWidget(
137 - MaterialApp(
138 - home: HomeScreen(viewModel: viewModel),
139 - ),
140 - );
141 -
142 - // Verify UI state
143 - expect(find.byType(ListView), findsOneWidget);
144 - expect(find.text('Booking 1'), findsOneWidget);
145 - });
146 - });
147 -}
148 -```
149 -
150 -### Example: Integration Test
151 -Demonstrates a full end-to-end test using the `integration_test` package.
152 -
153 -```dart
154 -import 'package:flutter/material.dart';
155 -import 'package:flutter_test/flutter_test.dart';
156 -import 'package:integration_test/integration_test.dart';
157 -import 'package:my_app/main.dart';
158 -
159 -void main() {
160 - IntegrationTestWidgetsFlutterBinding.ensureInitialized();
161 -
162 - group('end-to-end test', () {
163 - testWidgets('tap on the floating action button, verify counter', (tester) async {
164 - // Load app widget
165 - await tester.pumpWidget(const MyApp());
166 -
167 - // Verify initial state
168 - expect(find.text('0'), findsOneWidget);
169 -
170 - // Find and tap the button
171 - final fab = find.byKey(const ValueKey('increment'));
172 - await tester.tap(fab);
173 -
174 - // Trigger a frame to allow animations/state to settle
175 - await tester.pumpAndSettle();
176 -
177 - // Verify updated state
178 - expect(find.text('1'), findsOneWidget);
179 - });
180 - });
181 -}
182 -```
.claude/skills/flutter-theming-apps/SKILL.md deleted
-174
@@ -1,174 +0,0 @@
1 ----
2 -name: "flutter-theming-apps"
3 -description: "Customizes the visual appearance of a Flutter app using the theming system. Use when defining global styles, colors, or typography for an application."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:14:47 GMT"
7 ----
8 -
9 -# Implementing Flutter Theming and Adaptive Design
10 -
11 -## Contents
12 -
13 -- [Core Theming Concepts](#core-theming-concepts)
14 -- [Material 3 Guidelines](#material-3-guidelines)
15 -- [Component Theme Normalization](#component-theme-normalization)
16 -- [Button Styling](#button-styling)
17 -- [Platform Idioms & Adaptive Design](#platform-idioms--adaptive-design)
18 -- [Workflows](#workflows)
19 -- [Examples](#examples)
20 -
21 -## Core Theming Concepts
22 -
23 -Flutter applies styling in a strict hierarchy: styles applied to the specific widget -> themes that override the immediate parent theme -> the main app theme.
24 -
25 -- Define app-wide themes using the `theme` property of `MaterialApp` with a `ThemeData` instance.
26 -- Override themes for specific widget subtrees by wrapping them in a `Theme` widget and using `Theme.of(context).copyWith(...)`.
27 -- **Do not** use deprecated `ThemeData` properties:
28 - - Replace `accentColor` with `colorScheme.secondary`.
29 - - Replace `accentTextTheme` with `textTheme` (using `colorScheme.onSecondary` for contrast).
30 - - Replace `AppBarTheme.color` with `AppBarTheme.backgroundColor`.
31 -
32 -## Material 3 Guidelines
33 -
34 -Material 3 is the default theme as of Flutter 3.16.
35 -
36 -- **Colors:** Generate color schemes using `ColorScheme.fromSeed(seedColor: Colors.blue)`. This ensures accessible contrast ratios.
37 -- **Elevation:** Material 3 uses `ColorScheme.surfaceTint` to indicate elevation instead of just drop shadows. To revert to M2 shadow behavior, set `surfaceTint: Colors.transparent` and define a `shadowColor`.
38 -- **Typography:** Material 3 updates font sizes, weights, and line heights. If text wrapping breaks legacy layouts, adjust `letterSpacing` on the specific `TextStyle`.
39 -- **Modern Components:**
40 - - Replace `BottomNavigationBar` with `NavigationBar`.
41 - - Replace `Drawer` with `NavigationDrawer`.
42 - - Replace `ToggleButtons` with `SegmentedButton`.
43 - - Use `FilledButton` for a high-emphasis button without the elevation of `ElevatedButton`.
44 -
45 -## Component Theme Normalization
46 -
47 -Component themes in `ThemeData` have been normalized to use `*ThemeData` classes rather than `*Theme` widgets.
48 -
49 -When defining `ThemeData`, strictly use the `*ThemeData` suffix for the following properties:
50 -
51 -- `cardTheme`: Use `CardThemeData` (Not `CardTheme`)
52 -- `dialogTheme`: Use `DialogThemeData` (Not `DialogTheme`)
53 -- `tabBarTheme`: Use `TabBarThemeData` (Not `TabBarTheme`)
54 -- `appBarTheme`: Use `AppBarThemeData` (Not `AppBarTheme`)
55 -- `bottomAppBarTheme`: Use `BottomAppBarThemeData` (Not `BottomAppBarTheme`)
56 -- `inputDecorationTheme`: Use `InputDecorationThemeData` (Not `InputDecorationTheme`)
57 -
58 -## Button Styling
59 -
60 -Legacy button classes (`FlatButton`, `RaisedButton`, `OutlineButton`) are obsolete.
61 -
62 -- Use `TextButton`, `ElevatedButton`, and `OutlinedButton`.
63 -- Configure button appearance using a `ButtonStyle` object.
64 -- For simple overrides based on the theme's color scheme, use the static utility method: `TextButton.styleFrom(foregroundColor: Colors.blue)`.
65 -- For state-dependent styling (hovered, focused, pressed, disabled), use `MaterialStateProperty.resolveWith`.
66 -
67 -## Platform Idioms & Adaptive Design
68 -
69 -When building adaptive apps, respect platform-specific norms to reduce cognitive load and build user trust.
70 -
71 -- **Scrollbars:** Desktop users expect omnipresent scrollbars; mobile users expect them only during scrolling. Toggle `thumbVisibility` on the `Scrollbar` widget based on the platform.
72 -- **Selectable Text:** Web and desktop users expect text to be selectable. Wrap text in `SelectableText` or `SelectableText.rich`.
73 -- **Horizontal Button Order:** Windows places confirmation buttons on the left; macOS/Linux place them on the right. Use a `Row` with `TextDirection.rtl` for Windows and `TextDirection.ltr` for others.
74 -- **Context Menus & Tooltips:** Desktop users expect hover and right-click interactions. Implement `Tooltip` for hover states and use context menu packages for right-click actions.
75 -
76 -## Workflows
77 -
78 -### Workflow: Migrating Legacy Themes to Material 3
79 -
80 -Use this workflow when updating an older Flutter codebase.
81 -
82 -**Task Progress:**
83 -
84 -- [ ] 1. Remove `useMaterial3: false` from `ThemeData` (it is true by default).
85 -- [ ] 2. Replace manual `ColorScheme` definitions with `ColorScheme.fromSeed()`.
86 -- [ ] 3. Run validator -> review errors -> fix: Search for and replace deprecated `accentColor`, `accentColorBrightness`, `accentIconTheme`, and `accentTextTheme`.
87 -- [ ] 4. Run validator -> review errors -> fix: Search for `AppBarTheme(color: ...)` and replace with `backgroundColor`.
88 -- [ ] 5. Update `ThemeData` component properties to use `*ThemeData` classes (e.g., `cardTheme: CardThemeData()`).
89 -- [ ] 6. Replace legacy buttons (`FlatButton` -> `TextButton`, `RaisedButton` -> `ElevatedButton`, `OutlineButton` -> `OutlinedButton`).
90 -- [ ] 7. Replace legacy navigation components (`BottomNavigationBar` -> `NavigationBar`, `Drawer` -> `NavigationDrawer`).
91 -
92 -### Workflow: Implementing Adaptive UI Components
93 -
94 -Use this workflow when building a widget intended for both mobile and desktop/web.
95 -
96 -**Task Progress:**
97 -
98 -- [ ] 1. If displaying a list/grid, wrap it in a `Scrollbar` and set `thumbVisibility: DeviceType.isDesktop`.
99 -- [ ] 2. If displaying read-only data, use `SelectableText` instead of `Text`.
100 -- [ ] 3. If implementing a dialog with action buttons, check the platform. If Windows, set `TextDirection.rtl` on the button `Row`.
101 -- [ ] 4. If implementing interactive elements, wrap them in `Tooltip` widgets to support mouse hover states.
102 -
103 -## Examples
104 -
105 -### Example: Modern Material 3 ThemeData Setup
106 -
107 -```dart
108 -MaterialApp(
109 - title: 'Adaptive App',
110 - theme: ThemeData(
111 - colorScheme: ColorScheme.fromSeed(
112 - seedColor: Colors.deepPurple,
113 - brightness: Brightness.light,
114 - ),
115 - // Use *ThemeData classes for component normalization
116 - appBarTheme: const AppBarThemeData(
117 - backgroundColor: Colors.deepPurple, // Do not use 'color'
118 - elevation: 0,
119 - ),
120 - cardTheme: const CardThemeData(
121 - elevation: 2,
122 - ),
123 - textTheme: const TextTheme(
124 - bodyMedium: TextStyle(letterSpacing: 0.2),
125 - ),
126 - ),
127 - home: const MyHomePage(),
128 -);
129 -```
130 -
131 -### Example: State-Dependent ButtonStyle
132 -
133 -```dart
134 -TextButton(
135 - style: ButtonStyle(
136 - // Default color
137 - foregroundColor: MaterialStateProperty.all<Color>(Colors.blue),
138 - // State-dependent overlay color
139 - overlayColor: MaterialStateProperty.resolveWith<Color?>(
140 - (Set<MaterialState> states) {
141 - if (states.contains(MaterialState.hovered)) {
142 - return Colors.blue.withValues(alpha:0.04);
143 - }
144 - if (states.contains(MaterialState.focused) || states.contains(MaterialState.pressed)) {
145 - return Colors.blue.withValues(alpha:0.12);
146 - }
147 - return null; // Defer to the widget's default.
148 - },
149 - ),
150 - ),
151 - onPressed: () {},
152 - child: const Text('Adaptive Button'),
153 -)
154 -```
155 -
156 -### Example: Adaptive Dialog Button Order
157 -
158 -```dart
159 -Row(
160 - // Windows expects confirmation on the left (RTL reverses the standard LTR Row)
161 - textDirection: Platform.isWindows ? TextDirection.rtl : TextDirection.ltr,
162 - mainAxisAlignment: MainAxisAlignment.end,
163 - children: [
164 - TextButton(
165 - onPressed: () => Navigator.pop(context, false),
166 - child: const Text('Cancel'),
167 - ),
168 - FilledButton(
169 - onPressed: () => Navigator.pop(context, true),
170 - child: const Text('Confirm'),
171 - ),
172 - ],
173 -)
174 -```
.claude/skills/flutter-working-with-databases/SKILL.md deleted
-200
@@ -1,200 +0,0 @@
1 ----
2 -name: "flutter-working-with-databases"
3 -description: "Manages local data persistence using SQLite or other database solutions. Use when a Flutter app needs to store, query, or synchronize large amounts of structured data on the device."
4 -metadata:
5 - model: "models/gemini-3.1-pro-preview"
6 - last_modified: "Thu, 12 Mar 2026 22:19:15 GMT"
7 -
8 ----
9 -# Architecting the Data Layer
10 -
11 -## Contents
12 -- [Core Architecture](#core-architecture)
13 -- [Services Implementation](#services-implementation)
14 -- [Repository Implementation](#repository-implementation)
15 -- [Caching Strategies](#caching-strategies)
16 -- [Workflows](#workflows)
17 -- [Examples](#examples)
18 -
19 -## Core Architecture
20 -
21 -Construct the data layer as the Single Source of Truth (SSOT) for all application data. In an MVVM architecture, the data layer represents the Model. Never update application data outside of this layer.
22 -
23 -Separate the data layer into two distinct components: **Repositories** and **Services**.
24 -
25 -### Repositories
26 -* Act as the SSOT for a specific domain entity.
27 -* Contain business logic for data mutation, polling, caching, and offline synchronization.
28 -* Transform raw data models (API/DB models) into Domain Models (clean data classes containing only what the UI needs).
29 -* Inject Services as private members to prevent the UI layer from bypassing the repository.
30 -
31 -### Services
32 -* Act as stateless wrappers around external data sources (HTTP clients, SQLite databases, platform plugins).
33 -* Perform no business logic or data transformation beyond basic JSON serialization.
34 -* Return raw data models or `Result` wrappers to the calling repository.
35 -
36 -## Services Implementation
37 -
38 -### Database Services (SQLite)
39 -Use databases to persist and query large amounts of structured data locally.
40 -* Add `sqflite` and `path` packages to `pubspec.yaml`.
41 -* Use the `path` package to define the storage location on disk safely across platforms.
42 -* Define table schemas using constants to prevent typos.
43 -* Use `id` as the primary key with `AUTOINCREMENT` to improve query and update times.
44 -* Always use `whereArgs` in SQL queries to prevent SQL injection (e.g., `where: 'id = ?', whereArgs: [id]`).
45 -
46 -### API Services
47 -* Wrap HTTP calls (e.g., using the `http` package) in dedicated client classes.
48 -* Return asynchronous response objects (`Future` or `Stream`).
49 -* Handle raw JSON serialization at this level, returning API-specific data models.
50 -
51 -## Repository Implementation
52 -
53 -### Domain Models
54 -* Define immutable data classes (using `freezed` or `built_value`) for Domain Models.
55 -* Strip out backend-specific fields (like metadata or pagination tokens) that the UI does not need.
56 -
57 -### Offline-First Synchronization
58 -Combine local and remote data sources within the repository to provide seamless offline support.
59 -
60 -* **If reading data:** Return a `Stream` that immediately yields the cached local data from the Database Service, performs the network request via the API Service, updates the Database Service, and then yields the fresh data.
61 -* **If writing data (Online-only):** Attempt the API Service mutation first. If successful, update the Database Service.
62 -* **If writing data (Offline-first):** Update the Database Service immediately. Attempt the API Service mutation. If the network fails, flag the local database record as `synchronized: false` and queue a background synchronization task.
63 -
64 -## Caching Strategies
65 -
66 -Select the appropriate caching strategy based on the data payload:
67 -* **Small Key-Value Data:** Use `shared_preferences` for simple app configurations, theme settings, or user preferences.
68 -* **Large Datasets:** Use relational (`sqflite`, `drift`) or non-relational (`hive_ce`, `isar_community`) on-device databases.
69 -* **Images:** Use the `cached_network_image` package to automatically cache remote images to the device's file system.
70 -* **API Responses:** Implement lightweight remote caching within the API Service or Repository using in-memory maps or temporary file storage.
71 -
72 -## Workflows
73 -
74 -### Workflow: Implementing a New Data Feature
75 -Copy and track this checklist when adding a new data entity to the application.
76 -
77 -- [ ] **Task Progress**
78 - - [ ] Define the Domain Model (immutable, UI-focused).
79 - - [ ] Define the API/DB Models (raw data structures).
80 - - [ ] Create or update the Service(s) to handle raw data fetching/storage.
81 - - [ ] Create the Repository interface (abstract class).
82 - - [ ] Implement the Repository, injecting the required Service(s) as private dependencies.
83 - - [ ] Map raw Service models to the Domain Model within the Repository.
84 - - [ ] Expose Repository methods to the View Model.
85 - - [ ] Run validator -> review errors -> fix.
86 -
87 -### Workflow: Implementing SQLite Persistence
88 -Follow this sequence to add a new SQLite table and integrate it.
89 -
90 -- [ ] **Task Progress**
91 - - [ ] Add `sqflite` and `path` dependencies.
92 - - [ ] Define table name and column constants.
93 - - [ ] Update the `onCreate` or `onUpgrade` method in the Database Service to execute the `CREATE TABLE` statement.
94 - - [ ] Implement `insert`, `query`, `update`, and `delete` methods in the Database Service.
95 - - [ ] Inject the Database Service into the target Repository.
96 - - [ ] Ensure the Repository calls `database.open()` before executing queries.
97 -
98 -## Examples
99 -
100 -### Offline-First Repository Implementation
101 -This example demonstrates a Repository coordinating between a Database Service and an API Service using a Stream for offline-first reads.
102 -
103 -```dart
104 -import 'dart:async';
105 -
106 -class TodoRepository {
107 - TodoRepository({
108 - required DatabaseService databaseService,
109 - required ApiClientService apiClientService,
110 - }) : _databaseService = databaseService,
111 - _apiClientService = apiClientService;
112 -
113 - final DatabaseService _databaseService;
114 - final ApiClientService _apiClientService;
115 -
116 - /// Yields local data immediately, then fetches remote data, updates local, and yields fresh data.
117 - Stream<List<Todo>> observeTodos() async* {
118 - // 1. Yield local cached data first
119 - final localTodos = await _databaseService.getAllTodos();
120 - if (localTodos.isNotEmpty) {
121 - yield localTodos.map((model) => Todo.fromDbModel(model)).toList();
122 - }
123 -
124 - try {
125 - // 2. Fetch fresh data from API
126 - final remoteTodos = await _apiClientService.fetchTodos();
127 -
128 - // 3. Update local database
129 - await _databaseService.replaceAllTodos(remoteTodos);
130 -
131 - // 4. Yield fresh data
132 - yield remoteTodos.map((model) => Todo.fromApiModel(model)).toList();
133 - } on Exception catch (e) {
134 - // Handle network errors (UI will still have local data)
135 - // Log error or yield a specific error state if required
136 - }
137 - }
138 -
139 - /// Offline-first write: Save locally, then attempt remote sync.
140 - Future<void> createTodo(Todo todo) async {
141 - final dbModel = todo.toDbModel().copyWith(isSynced: false);
142 -
143 - // 1. Save locally immediately
144 - await _databaseService.insertTodo(dbModel);
145 -
146 - try {
147 - // 2. Attempt remote sync
148 - final apiModel = await _apiClientService.postTodo(todo.toApiModel());
149 -
150 - // 3. Mark as synced locally
151 - await _databaseService.updateTodo(
152 - dbModel.copyWith(id: apiModel.id, isSynced: true)
153 - );
154 - } on Exception catch (_) {
155 - // Leave as isSynced: false for background sync task to pick up later
156 - }
157 - }
158 -}
159 -```
160 -
161 -### SQLite Database Service Implementation
162 -Demonstrates safe query construction using `whereArgs`.
163 -
164 -```dart
165 -class DatabaseService {
166 - static const String _tableName = 'todos';
167 - static const String _colId = 'id';
168 - static const String _colTask = 'task';
169 - static const String _colIsSynced = 'is_synced';
170 -
171 - Database? _database;
172 -
173 - Future<void> open() async {
174 - if (_database != null) return;
175 -
176 - final dbPath = join(await getDatabasesPath(), 'app_database.db');
177 - _database = await openDatabase(
178 - dbPath,
179 - version: 1,
180 - onCreate: (db, version) {
181 - return db.execute(
182 - 'CREATE TABLE $_tableName('
183 - '$_colId INTEGER PRIMARY KEY AUTOINCREMENT, '
184 - '$_colTask TEXT, '
185 - '$_colIsSynced INTEGER)'
186 - );
187 - },
188 - );
189 - }
190 -
191 - Future<void> updateTodo(TodoDbModel todo) async {
192 - await _database!.update(
193 - _tableName,
194 - todo.toMap(),
195 - where: '$_colId = ?',
196 - whereArgs: [todo.id], // Prevents SQL injection
197 - );
198 - }
199 -}
200 -```
.claude/skills/hugeicons-icons/SKILL.md deleted
-24
@@ -1,24 +0,0 @@
1 ----
2 -name: hugeicons-icons
3 -description: Guidelines for finding and suggesting icons from the Hugeicons package.
4 ----
5 -
6 -# Hugeicons Icon Reference
7 -
8 -## Guidelines
9 -
10 -- **Suggestion Strategy**: When the user needs an icon, first search for a descriptive name in the `references/icon_list.md` file.
11 -- **Naming Conventions**: Icons follow a `strokeRounded<Name>` pattern. For example, for a "user" icon, suggest `HugeIcons.strokeRoundedUser`.
12 -- **Category Browsing**: If the user asks for a category (e.g. "settings", "navigation"), browse the corresponding names in the `icon_list.md`.
13 -- **Multiple Variants**: Many icons have multiple variants (e.g., `01`, `02`, `03`). Suggest the most appropriate one based on context.
14 -
15 -## Example Icons
16 -
17 -- `HugeIcons.strokeRoundedUser`: Basic user icon.
18 -- `HugeIcons.strokeRoundedSettings01`: Common settings icon.
19 -- `HugeIcons.strokeRoundedHome01`: Standard home icon.
20 -- `HugeIcons.strokeRoundedFavorite`: Heart/favorite icon.
21 -
22 -## Reference
23 -
24 -The full list of 4,547 icons is available in [icon_list.md](references/icon_list.md). Always check this file for the exact constant name.
.claude/skills/hugeicons-icons/references/icon_list.md deleted
-4556
@@ -1,4556 +0,0 @@
1 -# Hugeicons Icon List
2 -Total icons: 4547
3 -
4 -- `HugeIcons.strokeRounded0Circle`
5 -- `HugeIcons.strokeRounded0Square`
6 -- `HugeIcons.strokeRounded1Circle`
7 -- `HugeIcons.strokeRounded1Square`
8 -- `HugeIcons.strokeRounded1stBracketCircle`
9 -- `HugeIcons.strokeRounded1stBracketSquare`
10 -- `HugeIcons.strokeRounded1stBracket`
11 -- `HugeIcons.strokeRounded1stBrecketCircle`
12 -- `HugeIcons.strokeRounded1stBrecketSquare`
13 -- `HugeIcons.strokeRounded1stBrecket`
14 -- `HugeIcons.strokeRounded2Circle`
15 -- `HugeIcons.strokeRounded2Square`
16 -- `HugeIcons.strokeRounded2ndBracketCircle`
17 -- `HugeIcons.strokeRounded2ndBracketSquare`
18 -- `HugeIcons.strokeRounded2ndBracket`
19 -- `HugeIcons.strokeRounded2ndBrecketCircle`
20 -- `HugeIcons.strokeRounded2ndBrecketSquare`
21 -- `HugeIcons.strokeRounded2ndBrecket`
22 -- `HugeIcons.strokeRounded3Circle`
23 -- `HugeIcons.strokeRounded3DMove`
24 -- `HugeIcons.strokeRounded3DRotate`
25 -- `HugeIcons.strokeRounded3DScale`
26 -- `HugeIcons.strokeRounded3DView`
27 -- `HugeIcons.strokeRounded3Square`
28 -- `HugeIcons.strokeRounded3dMove`
29 -- `HugeIcons.strokeRounded3dPrinter`
30 -- `HugeIcons.strokeRounded3dRotate`
31 -- `HugeIcons.strokeRounded3dScale`
32 -- `HugeIcons.strokeRounded3rdBracketCircle`
33 -- `HugeIcons.strokeRounded3rdBracketSquare`
34 -- `HugeIcons.strokeRounded3rdBracket`
35 -- `HugeIcons.strokeRounded3rdBrecketCircle`
36 -- `HugeIcons.strokeRounded3rdBrecketSquare`
37 -- `HugeIcons.strokeRounded3rdBrecket`
38 -- `HugeIcons.strokeRounded4Circle`
39 -- `HugeIcons.strokeRounded4K`
40 -- `HugeIcons.strokeRounded4Square`
41 -- `HugeIcons.strokeRoundedFourK`
42 -- `HugeIcons.strokeRounded5Circle`
43 -- `HugeIcons.strokeRounded5Square`
44 -- `HugeIcons.strokeRounded6Circle`
45 -- `HugeIcons.strokeRounded6Square`
46 -- `HugeIcons.strokeRounded7Circle`
47 -- `HugeIcons.strokeRounded7Square`
48 -- `HugeIcons.strokeRounded7z01`
49 -- `HugeIcons.strokeRounded7z02`
50 -- `HugeIcons.strokeRounded8Circle`
51 -- `HugeIcons.strokeRounded8Square`
52 -- `HugeIcons.strokeRounded9Circle`
53 -- `HugeIcons.strokeRounded9Square`
54 -- `HugeIcons.strokeRoundedAbacus`
55 -- `HugeIcons.strokeRoundedAbsolute`
56 -- `HugeIcons.strokeRoundedAcceleration`
57 -- `HugeIcons.strokeRoundedAccess`
58 -- `HugeIcons.strokeRoundedAccident`
59 -- `HugeIcons.strokeRoundedAccountSetting01`
60 -- `HugeIcons.strokeRoundedAccountSetting02`
61 -- `HugeIcons.strokeRoundedAccountSetting03`
62 -- `HugeIcons.strokeRoundedActivity01`
63 -- `HugeIcons.strokeRoundedActivity02`
64 -- `HugeIcons.strokeRoundedActivity03`
65 -- `HugeIcons.strokeRoundedActivity04`
66 -- `HugeIcons.strokeRoundedAcute`
67 -- `HugeIcons.strokeRoundedAdd01`
68 -- `HugeIcons.strokeRoundedAdd02`
69 -- `HugeIcons.strokeRoundedAddCircleHalfDot`
70 -- `HugeIcons.strokeRoundedAddCircle`
71 -- `HugeIcons.strokeRoundedAddFemale`
72 -- `HugeIcons.strokeRoundedAddInvoice`
73 -- `HugeIcons.strokeRoundedAddMale`
74 -- `HugeIcons.strokeRoundedAddMoneyCircle`
75 -- `HugeIcons.strokeRoundedAddSquare`
76 -- `HugeIcons.strokeRoundedAddTeam02`
77 -- `HugeIcons.strokeRoundedAddTeam`
78 -- `HugeIcons.strokeRoundedAddToList`
79 -- `HugeIcons.strokeRoundedAddressBook`
80 -- `HugeIcons.strokeRoundedAdobeAfterEffect`
81 -- `HugeIcons.strokeRoundedAdobeIllustrator`
82 -- `HugeIcons.strokeRoundedAdobeIndesign`
83 -- `HugeIcons.strokeRoundedAdobePhotoshop`
84 -- `HugeIcons.strokeRoundedAdobePremier`
85 -- `HugeIcons.strokeRoundedAdobeXd`
86 -- `HugeIcons.strokeRoundedAdventure`
87 -- `HugeIcons.strokeRoundedAdvertisement`
88 -- `HugeIcons.strokeRoundedAdvertisiment`
89 -- `HugeIcons.strokeRoundedAdzan`
90 -- `HugeIcons.strokeRoundedAffiliate`
91 -- `HugeIcons.strokeRoundedAgreement01`
92 -- `HugeIcons.strokeRoundedAgreement02`
93 -- `HugeIcons.strokeRoundedAgreement03`
94 -- `HugeIcons.strokeRoundedAiAudio`
95 -- `HugeIcons.strokeRoundedAiBeautify`
96 -- `HugeIcons.strokeRoundedAiBook`
97 -- `HugeIcons.strokeRoundedAiBrain01`
98 -- `HugeIcons.strokeRoundedAiBrain02`
99 -- `HugeIcons.strokeRoundedAiBrain03`
100 -- `HugeIcons.strokeRoundedAiBrain04`
101 -- `HugeIcons.strokeRoundedAiBrain05`
102 -- `HugeIcons.strokeRoundedAiBrowser`
103 -- `HugeIcons.strokeRoundedAiChat01`
104 -- `HugeIcons.strokeRoundedAiChat02`
105 -- `HugeIcons.strokeRoundedAiChemistry01`
106 -- `HugeIcons.strokeRoundedAiChemistry02`
107 -- `HugeIcons.strokeRoundedAiChemistry03`
108 -- `HugeIcons.strokeRoundedAiChip`
109 -- `HugeIcons.strokeRoundedAiCloud01`
110 -- `HugeIcons.strokeRoundedAiCloud02`
111 -- `HugeIcons.strokeRoundedAiCloud`
112 -- `HugeIcons.strokeRoundedAiComputer`
113 -- `HugeIcons.strokeRoundedAiContentGenerator01`
114 -- `HugeIcons.strokeRoundedAiContentGenerator02`
115 -- `HugeIcons.strokeRoundedAiDna`
116 -- `HugeIcons.strokeRoundedAiEditing`
117 -- `HugeIcons.strokeRoundedAiEraser`
118 -- `HugeIcons.strokeRoundedAiFile`
119 -- `HugeIcons.strokeRoundedAiFolder01`
120 -- `HugeIcons.strokeRoundedAiFolder02`
121 -- `HugeIcons.strokeRoundedAiGame`
122 -- `HugeIcons.strokeRoundedAiGenerative`
123 -- `HugeIcons.strokeRoundedAiIdea`
124 -- `HugeIcons.strokeRoundedAiImage`
125 -- `HugeIcons.strokeRoundedAiInnovation01`
126 -- `HugeIcons.strokeRoundedAiInnovation02`
127 -- `HugeIcons.strokeRoundedAiInnovation03`
128 -- `HugeIcons.strokeRoundedAiLaptop`
129 -- `HugeIcons.strokeRoundedAiLearning`
130 -- `HugeIcons.strokeRoundedAiLock`
131 -- `HugeIcons.strokeRoundedAiMagic`
132 -- `HugeIcons.strokeRoundedAiMail01`
133 -- `HugeIcons.strokeRoundedAiMail02`
134 -- `HugeIcons.strokeRoundedAiMail`
135 -- `HugeIcons.strokeRoundedAiMic`
136 -- `HugeIcons.strokeRoundedAiNetwork`
137 -- `HugeIcons.strokeRoundedAiPhone01`
138 -- `HugeIcons.strokeRoundedAiPhone02`
139 -- `HugeIcons.strokeRoundedAiProgramming`
140 -- `HugeIcons.strokeRoundedAiScan`
141 -- `HugeIcons.strokeRoundedAiScheduling`
142 -- `HugeIcons.strokeRoundedAiSearch02`
143 -- `HugeIcons.strokeRoundedAiSearch`
144 -- `HugeIcons.strokeRoundedAiSecurity01`
145 -- `HugeIcons.strokeRoundedAiSecurity02`
146 -- `HugeIcons.strokeRoundedAiSecurity03`
147 -- `HugeIcons.strokeRoundedAiSetting`
148 -- `HugeIcons.strokeRoundedAiSheets`
149 -- `HugeIcons.strokeRoundedAiSmartwatch`
150 -- `HugeIcons.strokeRoundedAiUser`
151 -- `HugeIcons.strokeRoundedAiVideo`
152 -- `HugeIcons.strokeRoundedAiView`
153 -- `HugeIcons.strokeRoundedAiVisionRecognition`
154 -- `HugeIcons.strokeRoundedAiVoiceGenerator`
155 -- `HugeIcons.strokeRoundedAiVoice`
156 -- `HugeIcons.strokeRoundedAiWebBrowsing`
157 -- `HugeIcons.strokeRoundedAids`
158 -- `HugeIcons.strokeRoundedAirbnb`
159 -- `HugeIcons.strokeRoundedAircraftGame`
160 -- `HugeIcons.strokeRoundedAirdrop`
161 -- `HugeIcons.strokeRoundedAirplane01`
162 -- `HugeIcons.strokeRoundedAirplane02`
163 -- `HugeIcons.strokeRoundedAirplaneLanding01`
164 -- `HugeIcons.strokeRoundedAirplaneLanding02`
165 -- `HugeIcons.strokeRoundedAirplaneModeOff`
166 -- `HugeIcons.strokeRoundedAirplaneMode`
167 -- `HugeIcons.strokeRoundedAirplaneSeat02`
168 -- `HugeIcons.strokeRoundedAirplaneSeat`
169 -- `HugeIcons.strokeRoundedAirplaneTakeOff01`
170 -- `HugeIcons.strokeRoundedAirplaneTakeOff02`
171 -- `HugeIcons.strokeRoundedAirplayLine`
172 -- `HugeIcons.strokeRoundedAirpod01`
173 -- `HugeIcons.strokeRoundedAirpod02`
174 -- `HugeIcons.strokeRoundedAirpod03`
175 -- `HugeIcons.strokeRoundedAirport`
176 -- `HugeIcons.strokeRoundedAlAqsaMosque`
177 -- `HugeIcons.strokeRoundedAlarmClock`
178 -- `HugeIcons.strokeRoundedAlbum01`
179 -- `HugeIcons.strokeRoundedAlbum02`
180 -- `HugeIcons.strokeRoundedAlbumNotFound01`
181 -- `HugeIcons.strokeRoundedAlbumNotFound02`
182 -- `HugeIcons.strokeRoundedAlert01`
183 -- `HugeIcons.strokeRoundedAlert02`
184 -- `HugeIcons.strokeRoundedAlertCircle`
185 -- `HugeIcons.strokeRoundedAlertDiamond`
186 -- `HugeIcons.strokeRoundedAlertSquare`
187 -- `HugeIcons.strokeRoundedAlgorithm`
188 -- `HugeIcons.strokeRoundedAlien01`
189 -- `HugeIcons.strokeRoundedAlien02`
190 -- `HugeIcons.strokeRoundedAlignBottom`
191 -- `HugeIcons.strokeRoundedAlignBoxBottomCenter`
192 -- `HugeIcons.strokeRoundedAlignBoxBottomLeft`
193 -- `HugeIcons.strokeRoundedAlignBoxBottomRight`
194 -- `HugeIcons.strokeRoundedAlignBoxMiddleCenter`
195 -- `HugeIcons.strokeRoundedAlignBoxMiddleLeft`
196 -- `HugeIcons.strokeRoundedAlignBoxMiddleRight`
197 -- `HugeIcons.strokeRoundedAlignBoxTopCenter`
198 -- `HugeIcons.strokeRoundedAlignBoxTopLeft`
199 -- `HugeIcons.strokeRoundedAlignBoxTopRight`
200 -- `HugeIcons.strokeRoundedAlignHorizontalCenter`
201 -- `HugeIcons.strokeRoundedAlignKeyObject`
202 -- `HugeIcons.strokeRoundedAlignLeft`
203 -- `HugeIcons.strokeRoundedAlignRight`
204 -- `HugeIcons.strokeRoundedAlignSelection`
205 -- `HugeIcons.strokeRoundedAlignTop`
206 -- `HugeIcons.strokeRoundedAlignVerticalCenter`
207 -- `HugeIcons.strokeRoundedAllBookmark`
208 -- `HugeIcons.strokeRoundedAllah`
209 -- `HugeIcons.strokeRoundedAlms`
210 -- `HugeIcons.strokeRoundedAlphaCircle`
211 -- `HugeIcons.strokeRoundedAlphaSquare`
212 -- `HugeIcons.strokeRoundedAlpha`
213 -- `HugeIcons.strokeRoundedAlphabetArabic`
214 -- `HugeIcons.strokeRoundedAlphabetBangla`
215 -- `HugeIcons.strokeRoundedAlphabetChinese`
216 -- `HugeIcons.strokeRoundedAlphabetGreek`
217 -- `HugeIcons.strokeRoundedAlphabetHebrew`
218 -- `HugeIcons.strokeRoundedAlphabetHindi`
219 -- `HugeIcons.strokeRoundedAlphabetJapanese`
220 -- `HugeIcons.strokeRoundedAlphabetKorean`
221 -- `HugeIcons.strokeRoundedAlphabetThai`
222 -- `HugeIcons.strokeRoundedAmazon`
223 -- `HugeIcons.strokeRoundedAmbulance`
224 -- `HugeIcons.strokeRoundedAmericanFootball`
225 -- `HugeIcons.strokeRoundedAmie`
226 -- `HugeIcons.strokeRoundedAmmo`
227 -- `HugeIcons.strokeRoundedAmpoule`
228 -- `HugeIcons.strokeRoundedAnalysisTextLink`
229 -- `HugeIcons.strokeRoundedAnalytics01`
230 -- `HugeIcons.strokeRoundedAnalytics02`
231 -- `HugeIcons.strokeRoundedAnalytics03`
232 -- `HugeIcons.strokeRoundedAnalyticsDown`
233 -- `HugeIcons.strokeRoundedAnalyticsUp`
234 -- `HugeIcons.strokeRoundedAnchorPoint`
235 -- `HugeIcons.strokeRoundedAnchor`
236 -- `HugeIcons.strokeRoundedAndroid`
237 -- `HugeIcons.strokeRoundedAngel`
238 -- `HugeIcons.strokeRoundedAngle01`
239 -- `HugeIcons.strokeRoundedAngle`
240 -- `HugeIcons.strokeRoundedAngryBird`
241 -- `HugeIcons.strokeRoundedAngry`
242 -- `HugeIcons.strokeRoundedAnonymous`
243 -- `HugeIcons.strokeRoundedApi`
244 -- `HugeIcons.strokeRoundedAppStore`
245 -- `HugeIcons.strokeRoundedApple01`
246 -- `HugeIcons.strokeRoundedAppleFinder`
247 -- `HugeIcons.strokeRoundedAppleIntelligence`
248 -- `HugeIcons.strokeRoundedAppleNews`
249 -- `HugeIcons.strokeRoundedApplePie`
250 -- `HugeIcons.strokeRoundedAppleReminder`
251 -- `HugeIcons.strokeRoundedAppleStocks`
252 -- `HugeIcons.strokeRoundedApple`
253 -- `HugeIcons.strokeRoundedAppleVisionPro`
254 -- `HugeIcons.strokeRoundedAppointment01`
255 -- `HugeIcons.strokeRoundedAppointment02`
256 -- `HugeIcons.strokeRoundedApproximatelyEqualCircle`
257 -- `HugeIcons.strokeRoundedApproximatelyEqualSquare`
258 -- `HugeIcons.strokeRoundedApproximatelyEqual`
259 -- `HugeIcons.strokeRoundedApricot`
260 -- `HugeIcons.strokeRoundedApron`
261 -- `HugeIcons.strokeRoundedArcBrowser`
262 -- `HugeIcons.strokeRoundedArcher`
263 -- `HugeIcons.strokeRoundedArchive01`
264 -- `HugeIcons.strokeRoundedArchive02`
265 -- `HugeIcons.strokeRoundedArchive03`
266 -- `HugeIcons.strokeRoundedArchive`
267 -- `HugeIcons.strokeRoundedArmoredBoot`
268 -- `HugeIcons.strokeRoundedArrangeByLettersAZ`
269 -- `HugeIcons.strokeRoundedArrangeByLettersZA`
270 -- `HugeIcons.strokeRoundedArrangeByNumbers19`
271 -- `HugeIcons.strokeRoundedArrangeByNumbers91`
272 -- `HugeIcons.strokeRoundedArrange`
273 -- `HugeIcons.strokeRoundedArrowAllDirection`
274 -- `HugeIcons.strokeRoundedArrowDataTransferDiagonal`
275 -- `HugeIcons.strokeRoundedArrowDataTransferHorizontal`
276 -- `HugeIcons.strokeRoundedArrowDataTransferVertical`
277 -- `HugeIcons.strokeRoundedArrowDiagonal`
278 -- `HugeIcons.strokeRoundedArrowDown01`
279 -- `HugeIcons.strokeRoundedArrowDown02`
280 -- `HugeIcons.strokeRoundedArrowDown03`
281 -- `HugeIcons.strokeRoundedArrowDown04`
282 -- `HugeIcons.strokeRoundedArrowDown05`
283 -- `HugeIcons.strokeRoundedArrowDownDouble`
284 -- `HugeIcons.strokeRoundedArrowDownLeft01`
285 -- `HugeIcons.strokeRoundedArrowDownLeft02`
286 -- `HugeIcons.strokeRoundedArrowDownRight01`
287 -- `HugeIcons.strokeRoundedArrowDownRight02`
288 -- `HugeIcons.strokeRoundedArrowExpand01`
289 -- `HugeIcons.strokeRoundedArrowExpand02`
290 -- `HugeIcons.strokeRoundedArrowExpandDiagonal01`
291 -- `HugeIcons.strokeRoundedArrowExpandDiagonal02`
292 -- `HugeIcons.strokeRoundedArrowExpand`
293 -- `HugeIcons.strokeRoundedArrowHorizontal`
294 -- `HugeIcons.strokeRoundedArrowLeft01`
295 -- `HugeIcons.strokeRoundedArrowLeft02`
296 -- `HugeIcons.strokeRoundedArrowLeft03`
297 -- `HugeIcons.strokeRoundedArrowLeft04`
298 -- `HugeIcons.strokeRoundedArrowLeft05`
299 -- `HugeIcons.strokeRoundedArrowLeftDouble`
300 -- `HugeIcons.strokeRoundedArrowLeftRight`
301 -- `HugeIcons.strokeRoundedArrowMoveDownLeft`
302 -- `HugeIcons.strokeRoundedArrowMoveDownRight`
303 -- `HugeIcons.strokeRoundedArrowMoveLeftDown`
304 -- `HugeIcons.strokeRoundedArrowMoveRightDown`
305 -- `HugeIcons.strokeRoundedArrowMoveUpLeft`
306 -- `HugeIcons.strokeRoundedArrowMoveUpRight`
307 -- `HugeIcons.strokeRoundedArrowReloadHorizontal`
308 -- `HugeIcons.strokeRoundedArrowReloadVertical`
309 -- `HugeIcons.strokeRoundedArrowRight01`
310 -- `HugeIcons.strokeRoundedArrowRight02`
311 -- `HugeIcons.strokeRoundedArrowRight03`
312 -- `HugeIcons.strokeRoundedArrowRight04`
313 -- `HugeIcons.strokeRoundedArrowRight05`
314 -- `HugeIcons.strokeRoundedArrowRightDouble`
315 -- `HugeIcons.strokeRoundedArrowShrink01`
316 -- `HugeIcons.strokeRoundedArrowShrink02`
317 -- `HugeIcons.strokeRoundedArrowShrink`
318 -- `HugeIcons.strokeRoundedArrowTurnBackward`
319 -- `HugeIcons.strokeRoundedArrowTurnDown`
320 -- `HugeIcons.strokeRoundedArrowTurnForward`
321 -- `HugeIcons.strokeRoundedArrowTurnUp`
322 -- `HugeIcons.strokeRoundedArrowUp01`
323 -- `HugeIcons.strokeRoundedArrowUp02`
324 -- `HugeIcons.strokeRoundedArrowUp03`
325 -- `HugeIcons.strokeRoundedArrowUp04`
326 -- `HugeIcons.strokeRoundedArrowUp05`
327 -- `HugeIcons.strokeRoundedArrowUpDouble`
328 -- `HugeIcons.strokeRoundedArrowUpDown`
329 -- `HugeIcons.strokeRoundedArrowUpLeft01`
330 -- `HugeIcons.strokeRoundedArrowUpLeft02`
331 -- `HugeIcons.strokeRoundedArrowUpRight01`
332 -- `HugeIcons.strokeRoundedArrowUpRight02`
333 -- `HugeIcons.strokeRoundedArrowUpRight03`
334 -- `HugeIcons.strokeRoundedArrowVertical`
335 -- `HugeIcons.strokeRoundedArtboard`
336 -- `HugeIcons.strokeRoundedArtboardTool`
337 -- `HugeIcons.strokeRoundedArtificialIntelligence01`
338 -- `HugeIcons.strokeRoundedArtificialIntelligence02`
339 -- `HugeIcons.strokeRoundedArtificialIntelligence03`
340 -- `HugeIcons.strokeRoundedArtificialIntelligence04`
341 -- `HugeIcons.strokeRoundedArtificialIntelligence05`
342 -- `HugeIcons.strokeRoundedArtificialIntelligence06`
343 -- `HugeIcons.strokeRoundedArtificialIntelligence07`
344 -- `HugeIcons.strokeRoundedArtificialIntelligence08`
345 -- `HugeIcons.strokeRoundedAspectRatio`
346 -- `HugeIcons.strokeRoundedAssignments`
347 -- `HugeIcons.strokeRoundedAsterisk02`
348 -- `HugeIcons.strokeRoundedAsterisk`
349 -- `HugeIcons.strokeRoundedAsteroid01`
350 -- `HugeIcons.strokeRoundedAsteroid02`
351 -- `HugeIcons.strokeRoundedAstronaut01`
352 -- `HugeIcons.strokeRoundedAstronaut02`
353 -- `HugeIcons.strokeRoundedAt`
354 -- `HugeIcons.strokeRoundedAtm01`
355 -- `HugeIcons.strokeRoundedAtm02`
356 -- `HugeIcons.strokeRoundedAtom01`
357 -- `HugeIcons.strokeRoundedAtom02`
358 -- `HugeIcons.strokeRoundedAtomicPower`
359 -- `HugeIcons.strokeRoundedAttachment01`
360 -- `HugeIcons.strokeRoundedAttachment02`
361 -- `HugeIcons.strokeRoundedAttachmentCircle`
362 -- `HugeIcons.strokeRoundedAttachmentSquare`
363 -- `HugeIcons.strokeRoundedAttachment`
364 -- `HugeIcons.strokeRoundedAuction`
365 -- `HugeIcons.strokeRoundedAudioBook01`
366 -- `HugeIcons.strokeRoundedAudioBook02`
367 -- `HugeIcons.strokeRoundedAudioBook03`
368 -- `HugeIcons.strokeRoundedAudioBook04`
369 -- `HugeIcons.strokeRoundedAudioWave01`
370 -- `HugeIcons.strokeRoundedAudioWave02`
371 -- `HugeIcons.strokeRoundedAudit01`
372 -- `HugeIcons.strokeRoundedAudit02`
373 -- `HugeIcons.strokeRoundedAugmentedRealityAr`
374 -- `HugeIcons.strokeRoundedAuthorized`
375 -- `HugeIcons.strokeRoundedAutoConversations`
376 -- `HugeIcons.strokeRoundedAutomotiveBattery01`
377 -- `HugeIcons.strokeRoundedAutomotiveBattery02`
378 -- `HugeIcons.strokeRoundedAvalanche`
379 -- `HugeIcons.strokeRoundedAvocado`
380 -- `HugeIcons.strokeRoundedAward01`
381 -- `HugeIcons.strokeRoundedAward02`
382 -- `HugeIcons.strokeRoundedAward03`
383 -- `HugeIcons.strokeRoundedAward04`
384 -- `HugeIcons.strokeRoundedAward05`
385 -- `HugeIcons.strokeRoundedBaby01`
386 -- `HugeIcons.strokeRoundedBaby02`
387 -- `HugeIcons.strokeRoundedBabyBed01`
388 -- `HugeIcons.strokeRoundedBabyBed02`
389 -- `HugeIcons.strokeRoundedBabyBottle`
390 -- `HugeIcons.strokeRoundedBabyBoyDress`
391 -- `HugeIcons.strokeRoundedBabyGirlDress`
392 -- `HugeIcons.strokeRoundedBackMuscleBody`
393 -- `HugeIcons.strokeRoundedBackground`
394 -- `HugeIcons.strokeRoundedBackpack01`
395 -- `HugeIcons.strokeRoundedBackpack02`
396 -- `HugeIcons.strokeRoundedBackpack03`
397 -- `HugeIcons.strokeRoundedBackward01`
398 -- `HugeIcons.strokeRoundedBackward02`
399 -- `HugeIcons.strokeRoundedBacteria`
400 -- `HugeIcons.strokeRoundedBadmintonShuttle`
401 -- `HugeIcons.strokeRoundedBadminton`
402 -- `HugeIcons.strokeRoundedBalanceScale`
403 -- `HugeIcons.strokeRoundedBalloons`
404 -- `HugeIcons.strokeRoundedBanana`
405 -- `HugeIcons.strokeRoundedBandage`
406 -- `HugeIcons.strokeRoundedBank`
407 -- `HugeIcons.strokeRoundedBarChartHorizontal`
408 -- `HugeIcons.strokeRoundedBarChart`
409 -- `HugeIcons.strokeRoundedBarCode01`
410 -- `HugeIcons.strokeRoundedBarCode02`
411 -- `HugeIcons.strokeRoundedBarns`
412 -- `HugeIcons.strokeRoundedBaseballBat`
413 -- `HugeIcons.strokeRoundedBaseballHelmet`
414 -- `HugeIcons.strokeRoundedBaseball`
415 -- `HugeIcons.strokeRoundedBash`
416 -- `HugeIcons.strokeRoundedBasketball01`
417 -- `HugeIcons.strokeRoundedBasketball02`
418 -- `HugeIcons.strokeRoundedBasketballHoop`
419 -- `HugeIcons.strokeRoundedBathtub01`
420 -- `HugeIcons.strokeRoundedBathtub02`
421 -- `HugeIcons.strokeRoundedBatteriesEnergy`
422 -- `HugeIcons.strokeRoundedBatteryCharging01`
423 -- `HugeIcons.strokeRoundedBatteryCharging02`
424 -- `HugeIcons.strokeRoundedBatteryEcoCharging`
425 -- `HugeIcons.strokeRoundedBatteryEmpty`
426 -- `HugeIcons.strokeRoundedBatteryFull`
427 -- `HugeIcons.strokeRoundedBatteryLow`
428 -- `HugeIcons.strokeRoundedBatteryMedium01`
429 -- `HugeIcons.strokeRoundedBatteryMedium02`
430 -- `HugeIcons.strokeRoundedBbqGrill`
431 -- `HugeIcons.strokeRoundedBeach02`
432 -- `HugeIcons.strokeRoundedBeach`
433 -- `HugeIcons.strokeRoundedBeater`
434 -- `HugeIcons.strokeRoundedBebo`
435 -- `HugeIcons.strokeRoundedBedBunk`
436 -- `HugeIcons.strokeRoundedBedDouble`
437 -- `HugeIcons.strokeRoundedBedSingle01`
438 -- `HugeIcons.strokeRoundedBedSingle02`
439 -- `HugeIcons.strokeRoundedBed`
440 -- `HugeIcons.strokeRoundedBedug01`
441 -- `HugeIcons.strokeRoundedBedug02`
442 -- `HugeIcons.strokeRoundedBehance01`
443 -- `HugeIcons.strokeRoundedBehance02`
444 -- `HugeIcons.strokeRoundedBelt`
445 -- `HugeIcons.strokeRoundedBendTool`
446 -- `HugeIcons.strokeRoundedBerlin`
447 -- `HugeIcons.strokeRoundedBerlinTower`
448 -- `HugeIcons.strokeRoundedBeta`
449 -- `HugeIcons.strokeRoundedBicycle01`
450 -- `HugeIcons.strokeRoundedBicycle`
451 -- `HugeIcons.strokeRoundedBilliard01`
452 -- `HugeIcons.strokeRoundedBilliard02`
453 -- `HugeIcons.strokeRoundedBinaryCode`
454 -- `HugeIcons.strokeRoundedBing`
455 -- `HugeIcons.strokeRoundedBinoculars`
456 -- `HugeIcons.strokeRoundedBioEnergy`
457 -- `HugeIcons.strokeRoundedBiomassEnergy`
458 -- `HugeIcons.strokeRoundedBiometricAccess`
459 -- `HugeIcons.strokeRoundedBiometricDevice`
460 -- `HugeIcons.strokeRoundedBirthdayCake`
461 -- `HugeIcons.strokeRoundedBiscuit`
462 -- `HugeIcons.strokeRoundedBitcoin01`
463 -- `HugeIcons.strokeRoundedBitcoin02`
464 -- `HugeIcons.strokeRoundedBitcoin03`
465 -- `HugeIcons.strokeRoundedBitcoin04`
466 -- `HugeIcons.strokeRoundedBitcoinBag`
467 -- `HugeIcons.strokeRoundedBitcoinCircle`
468 -- `HugeIcons.strokeRoundedBitcoinCloud`
469 -- `HugeIcons.strokeRoundedBitcoinCpu`
470 -- `HugeIcons.strokeRoundedBitcoinCreditCard`
471 -- `HugeIcons.strokeRoundedBitcoinDatabase`
472 -- `HugeIcons.strokeRoundedBitcoinDown01`
473 -- `HugeIcons.strokeRoundedBitcoinDown02`
474 -- `HugeIcons.strokeRoundedBitcoinEllipse`
475 -- `HugeIcons.strokeRoundedBitcoinEye`
476 -- `HugeIcons.strokeRoundedBitcoinFilter`
477 -- `HugeIcons.strokeRoundedBitcoinFlashdisk`
478 -- `HugeIcons.strokeRoundedBitcoinGraph`
479 -- `HugeIcons.strokeRoundedBitcoinInvoice`
480 -- `HugeIcons.strokeRoundedBitcoinKey`
481 -- `HugeIcons.strokeRoundedBitcoinLocation`
482 -- `HugeIcons.strokeRoundedBitcoinLock`
483 -- `HugeIcons.strokeRoundedBitcoinMail`
484 -- `HugeIcons.strokeRoundedBitcoinMind`
485 -- `HugeIcons.strokeRoundedBitcoinMoney01`
486 -- `HugeIcons.strokeRoundedBitcoinMoney02`
487 -- `HugeIcons.strokeRoundedBitcoinPieChart`
488 -- `HugeIcons.strokeRoundedBitcoinPiggyBank`
489 -- `HugeIcons.strokeRoundedBitcoinPresentation`
490 -- `HugeIcons.strokeRoundedBitcoinReceipt`
491 -- `HugeIcons.strokeRoundedBitcoinReceive`
492 -- `HugeIcons.strokeRoundedBitcoinRectangle`
493 -- `HugeIcons.strokeRoundedBitcoinSafe`
494 -- `HugeIcons.strokeRoundedBitcoinSearch`
495 -- `HugeIcons.strokeRoundedBitcoinSend`
496 -- `HugeIcons.strokeRoundedBitcoinSetting`
497 -- `HugeIcons.strokeRoundedBitcoinShield`
498 -- `HugeIcons.strokeRoundedBitcoinShopping`
499 -- `HugeIcons.strokeRoundedBitcoinSmartphone01`
500 -- `HugeIcons.strokeRoundedBitcoinSmartphone02`
501 -- `HugeIcons.strokeRoundedBitcoinSquare`
502 -- `HugeIcons.strokeRoundedBitcoinStore`
503 -- `HugeIcons.strokeRoundedBitcoin`
504 -- `HugeIcons.strokeRoundedBitcoinTag`
505 -- `HugeIcons.strokeRoundedBitcoinTarget`
506 -- `HugeIcons.strokeRoundedBitcoinTransaction`
507 -- `HugeIcons.strokeRoundedBitcoinUp01`
508 -- `HugeIcons.strokeRoundedBitcoinUp02`
509 -- `HugeIcons.strokeRoundedBitcoinWallet`
510 -- `HugeIcons.strokeRoundedBitcoinWithdraw`
511 -- `HugeIcons.strokeRoundedBlackHole01`
512 -- `HugeIcons.strokeRoundedBlackHole`
513 -- `HugeIcons.strokeRoundedBlend`
514 -- `HugeIcons.strokeRoundedBlender`
515 -- `HugeIcons.strokeRoundedBlockGame`
516 -- `HugeIcons.strokeRoundedBlockchain01`
517 -- `HugeIcons.strokeRoundedBlockchain02`
518 -- `HugeIcons.strokeRoundedBlockchain03`
519 -- `HugeIcons.strokeRoundedBlockchain04`
520 -- `HugeIcons.strokeRoundedBlockchain05`
521 -- `HugeIcons.strokeRoundedBlockchain06`
522 -- `HugeIcons.strokeRoundedBlockchain07`
523 -- `HugeIcons.strokeRoundedBlocked`
524 -- `HugeIcons.strokeRoundedBlogger`
525 -- `HugeIcons.strokeRoundedBloodBag`
526 -- `HugeIcons.strokeRoundedBloodBottle`
527 -- `HugeIcons.strokeRoundedBloodPressure`
528 -- `HugeIcons.strokeRoundedBlood`
529 -- `HugeIcons.strokeRoundedBloodType`
530 -- `HugeIcons.strokeRoundedBluesky`
531 -- `HugeIcons.strokeRoundedBluetoothCircle`
532 -- `HugeIcons.strokeRoundedBluetoothNotConnected`
533 -- `HugeIcons.strokeRoundedBluetoothSearch`
534 -- `HugeIcons.strokeRoundedBluetoothSquare`
535 -- `HugeIcons.strokeRoundedBluetooth`
536 -- `HugeIcons.strokeRoundedBlur`
537 -- `HugeIcons.strokeRoundedBlushBrush01`
538 -- `HugeIcons.strokeRoundedBlushBrush02`
539 -- `HugeIcons.strokeRoundedBoardMath`
540 -- `HugeIcons.strokeRoundedBoat`
541 -- `HugeIcons.strokeRoundedBodyArmor`
542 -- `HugeIcons.strokeRoundedBodyPartLeg`
543 -- `HugeIcons.strokeRoundedBodyPartMuscle`
544 -- `HugeIcons.strokeRoundedBodyPartSixPack`
545 -- `HugeIcons.strokeRoundedBodySoap`
546 -- `HugeIcons.strokeRoundedBodyWeight`
547 -- `HugeIcons.strokeRoundedBomb`
548 -- `HugeIcons.strokeRoundedBone01`
549 -- `HugeIcons.strokeRoundedBone02`
550 -- `HugeIcons.strokeRoundedBook01`
551 -- `HugeIcons.strokeRoundedBook02`
552 -- `HugeIcons.strokeRoundedBook03`
553 -- `HugeIcons.strokeRoundedBook04`
554 -- `HugeIcons.strokeRoundedBookBookmark01`
555 -- `HugeIcons.strokeRoundedBookBookmark02`
556 -- `HugeIcons.strokeRoundedBookDownload`
557 -- `HugeIcons.strokeRoundedBookEdit`
558 -- `HugeIcons.strokeRoundedBookOpen01`
559 -- `HugeIcons.strokeRoundedBookOpen02`
560 -- `HugeIcons.strokeRoundedBookUpload`
561 -- `HugeIcons.strokeRoundedBookmark01`
562 -- `HugeIcons.strokeRoundedBookmark02`
563 -- `HugeIcons.strokeRoundedBookmark03`
564 -- `HugeIcons.strokeRoundedBookmarkAdd01`
565 -- `HugeIcons.strokeRoundedBookmarkAdd02`
566 -- `HugeIcons.strokeRoundedBookmarkBlock01`
567 -- `HugeIcons.strokeRoundedBookmarkBlock02`
568 -- `HugeIcons.strokeRoundedBookmarkCheck01`
569 -- `HugeIcons.strokeRoundedBookmarkCheck02`
570 -- `HugeIcons.strokeRoundedBookmarkMinus01`
571 -- `HugeIcons.strokeRoundedBookmarkMinus02`
572 -- `HugeIcons.strokeRoundedBookmarkOff01`
573 -- `HugeIcons.strokeRoundedBookmarkOff02`
574 -- `HugeIcons.strokeRoundedBookmarkRemove01`
575 -- `HugeIcons.strokeRoundedBookmarkRemove02`
576 -- `HugeIcons.strokeRoundedBooks01`
577 -- `HugeIcons.strokeRoundedBooks02`
578 -- `HugeIcons.strokeRoundedBookshelf01`
579 -- `HugeIcons.strokeRoundedBookshelf02`
580 -- `HugeIcons.strokeRoundedBookshelf03`
581 -- `HugeIcons.strokeRoundedBootstrap`
582 -- `HugeIcons.strokeRoundedBorderAll01`
583 -- `HugeIcons.strokeRoundedBorderAll02`
584 -- `HugeIcons.strokeRoundedBorderBottom01`
585 -- `HugeIcons.strokeRoundedBorderBottom02`
586 -- `HugeIcons.strokeRoundedBorderFull`
587 -- `HugeIcons.strokeRoundedBorderHorizontal`
588 -- `HugeIcons.strokeRoundedBorderInner`
589 -- `HugeIcons.strokeRoundedBorderLeft01`
590 -- `HugeIcons.strokeRoundedBorderLeft02`
591 -- `HugeIcons.strokeRoundedBorderNone01`
592 -- `HugeIcons.strokeRoundedBorderNone02`
593 -- `HugeIcons.strokeRoundedBorderRight01`
594 -- `HugeIcons.strokeRoundedBorderRight02`
595 -- `HugeIcons.strokeRoundedBorderTop01`
596 -- `HugeIcons.strokeRoundedBorderTop02`
597 -- `HugeIcons.strokeRoundedBorderVertical`
598 -- `HugeIcons.strokeRoundedBorobudur`
599 -- `HugeIcons.strokeRoundedBot`
600 -- `HugeIcons.strokeRoundedBounceLeft`
601 -- `HugeIcons.strokeRoundedBounceRight`
602 -- `HugeIcons.strokeRoundedBoundingBox`
603 -- `HugeIcons.strokeRoundedBowTie`
604 -- `HugeIcons.strokeRoundedBowlingBall`
605 -- `HugeIcons.strokeRoundedBowlingPins`
606 -- `HugeIcons.strokeRoundedBowling`
607 -- `HugeIcons.strokeRoundedBoxer`
608 -- `HugeIcons.strokeRoundedBoxingBag`
609 -- `HugeIcons.strokeRoundedBoxingGlove01`
610 -- `HugeIcons.strokeRoundedBoxingGlove`
611 -- `HugeIcons.strokeRoundedBrain01`
612 -- `HugeIcons.strokeRoundedBrain02`
613 -- `HugeIcons.strokeRoundedBrain03`
614 -- `HugeIcons.strokeRoundedBrain`
615 -- `HugeIcons.strokeRoundedBrandfetch`
616 -- `HugeIcons.strokeRoundedBread01`
617 -- `HugeIcons.strokeRoundedBread02`
618 -- `HugeIcons.strokeRoundedBread03`
619 -- `HugeIcons.strokeRoundedBread04`
620 -- `HugeIcons.strokeRoundedBreastPump`
621 -- `HugeIcons.strokeRoundedBridge`
622 -- `HugeIcons.strokeRoundedBriefcase01`
623 -- `HugeIcons.strokeRoundedBriefcase02`
624 -- `HugeIcons.strokeRoundedBriefcase03`
625 -- `HugeIcons.strokeRoundedBriefcase04`
626 -- `HugeIcons.strokeRoundedBriefcase05`
627 -- `HugeIcons.strokeRoundedBriefcase06`
628 -- `HugeIcons.strokeRoundedBriefcase07`
629 -- `HugeIcons.strokeRoundedBriefcase08`
630 -- `HugeIcons.strokeRoundedBriefcase09`
631 -- `HugeIcons.strokeRoundedBriefcaseDollar`
632 -- `HugeIcons.strokeRoundedBroccoli`
633 -- `HugeIcons.strokeRoundedBrochure`
634 -- `HugeIcons.strokeRoundedBrokenBone`
635 -- `HugeIcons.strokeRoundedBrowser`
636 -- `HugeIcons.strokeRoundedBrush`
637 -- `HugeIcons.strokeRoundedBubbleChatAdd`
638 -- `HugeIcons.strokeRoundedBubbleChatBlocked`
639 -- `HugeIcons.strokeRoundedBubbleChatCancel`
640 -- `HugeIcons.strokeRoundedBubbleChatDelay`
641 -- `HugeIcons.strokeRoundedBubbleChatDone`
642 -- `HugeIcons.strokeRoundedBubbleChatDownload01`
643 -- `HugeIcons.strokeRoundedBubbleChatDownload02`
644 -- `HugeIcons.strokeRoundedBubbleChatEdit`
645 -- `HugeIcons.strokeRoundedBubbleChatFavourite`
646 -- `HugeIcons.strokeRoundedBubbleChatIncome`
647 -- `HugeIcons.strokeRoundedBubbleChatLock`
648 -- `HugeIcons.strokeRoundedBubbleChatNotification`
649 -- `HugeIcons.strokeRoundedBubbleChatOutcome`
650 -- `HugeIcons.strokeRoundedBubbleChatPreview`
651 -- `HugeIcons.strokeRoundedBubbleChatQuestion`
652 -- `HugeIcons.strokeRoundedBubbleChatSearch`
653 -- `HugeIcons.strokeRoundedBubbleChatSecure`
654 -- `HugeIcons.strokeRoundedBubbleChat`
655 -- `HugeIcons.strokeRoundedBubbleChatTranslate`
656 -- `HugeIcons.strokeRoundedBubbleChatUnlock`
657 -- `HugeIcons.strokeRoundedBubbleChatUpload`
658 -- `HugeIcons.strokeRoundedBubbleChatUser`
659 -- `HugeIcons.strokeRoundedBubbleTea01`
660 -- `HugeIcons.strokeRoundedBubbleTea02`
661 -- `HugeIcons.strokeRoundedBug01`
662 -- `HugeIcons.strokeRoundedBug02`
663 -- `HugeIcons.strokeRoundedBuilding01`
664 -- `HugeIcons.strokeRoundedBuilding02`
665 -- `HugeIcons.strokeRoundedBuilding03`
666 -- `HugeIcons.strokeRoundedBuilding04`
667 -- `HugeIcons.strokeRoundedBuilding05`
668 -- `HugeIcons.strokeRoundedBuilding06`
669 -- `HugeIcons.strokeRoundedBulbCharging`
670 -- `HugeIcons.strokeRoundedBulb`
671 -- `HugeIcons.strokeRoundedBullet`
672 -- `HugeIcons.strokeRoundedBulletproofVest`
673 -- `HugeIcons.strokeRoundedBurjAlArab`
674 -- `HugeIcons.strokeRoundedBurningCd`
675 -- `HugeIcons.strokeRoundedBus01`
676 -- `HugeIcons.strokeRoundedBus02`
677 -- `HugeIcons.strokeRoundedBus03`
678 -- `HugeIcons.strokeRoundedC`
679 -- `HugeIcons.strokeRoundedCProgramming`
680 -- `HugeIcons.strokeRoundedCabinet01`
681 -- `HugeIcons.strokeRoundedCabinet02`
682 -- `HugeIcons.strokeRoundedCabinet03`
683 -- `HugeIcons.strokeRoundedCabinet04`
684 -- `HugeIcons.strokeRoundedCableCar`
685 -- `HugeIcons.strokeRoundedCactus`
686 -- `HugeIcons.strokeRoundedCaduceus`
687 -- `HugeIcons.strokeRoundedCafe`
688 -- `HugeIcons.strokeRoundedCalculate`
689 -- `HugeIcons.strokeRoundedCalculator01`
690 -- `HugeIcons.strokeRoundedCalculator`
691 -- `HugeIcons.strokeRoundedCalendar01`
692 -- `HugeIcons.strokeRoundedCalendar02`
693 -- `HugeIcons.strokeRoundedCalendar03`
694 -- `HugeIcons.strokeRoundedCalendar04`
695 -- `HugeIcons.strokeRoundedCalendarAdd01`
696 -- `HugeIcons.strokeRoundedCalendarAdd02`
697 -- `HugeIcons.strokeRoundedCalendarBlock01`
698 -- `HugeIcons.strokeRoundedCalendarBlock02`
699 -- `HugeIcons.strokeRoundedCalendarCheckIn01`
700 -- `HugeIcons.strokeRoundedCalendarCheckIn02`
701 -- `HugeIcons.strokeRoundedCalendarCheckOut01`
702 -- `HugeIcons.strokeRoundedCalendarCheckOut02`
703 -- `HugeIcons.strokeRoundedCalendarDownload01`
704 -- `HugeIcons.strokeRoundedCalendarDownload02`
705 -- `HugeIcons.strokeRoundedCalendarFavorite01`
706 -- `HugeIcons.strokeRoundedCalendarFavorite02`
707 -- `HugeIcons.strokeRoundedCalendarLock01`
708 -- `HugeIcons.strokeRoundedCalendarLock02`
709 -- `HugeIcons.strokeRoundedCalendarLove01`
710 -- `HugeIcons.strokeRoundedCalendarLove02`
711 -- `HugeIcons.strokeRoundedCalendarMinus01`
712 -- `HugeIcons.strokeRoundedCalendarMinus02`
713 -- `HugeIcons.strokeRoundedCalendarRemove01`
714 -- `HugeIcons.strokeRoundedCalendarRemove02`
715 -- `HugeIcons.strokeRoundedCalendarSetting01`
716 -- `HugeIcons.strokeRoundedCalendarSetting02`
717 -- `HugeIcons.strokeRoundedCalendarUpload01`
718 -- `HugeIcons.strokeRoundedCalendarUpload02`
719 -- `HugeIcons.strokeRoundedCalendarUser`
720 -- `HugeIcons.strokeRoundedCall02`
721 -- `HugeIcons.strokeRoundedCallAdd02`
722 -- `HugeIcons.strokeRoundedCallAdd`
723 -- `HugeIcons.strokeRoundedCallBlocked02`
724 -- `HugeIcons.strokeRoundedCallBlocked`
725 -- `HugeIcons.strokeRoundedCallDisabled02`
726 -- `HugeIcons.strokeRoundedCallDisabled`
727 -- `HugeIcons.strokeRoundedCallDone02`
728 -- `HugeIcons.strokeRoundedCallDone`
729 -- `HugeIcons.strokeRoundedCallEnd01`
730 -- `HugeIcons.strokeRoundedCallEnd02`
731 -- `HugeIcons.strokeRoundedCallEnd03`
732 -- `HugeIcons.strokeRoundedCallEnd04`
733 -- `HugeIcons.strokeRoundedCallIncoming01`
734 -- `HugeIcons.strokeRoundedCallIncoming02`
735 -- `HugeIcons.strokeRoundedCallIncoming03`
736 -- `HugeIcons.strokeRoundedCallIncoming04`
737 -- `HugeIcons.strokeRoundedCallInternal02`
738 -- `HugeIcons.strokeRoundedCallInternal`
739 -- `HugeIcons.strokeRoundedCallLocked02`
740 -- `HugeIcons.strokeRoundedCallLocked`
741 -- `HugeIcons.strokeRoundedCallMinus02`
742 -- `HugeIcons.strokeRoundedCallMinus`
743 -- `HugeIcons.strokeRoundedCallMissed01`
744 -- `HugeIcons.strokeRoundedCallMissed02`
745 -- `HugeIcons.strokeRoundedCallMissed03`
746 -- `HugeIcons.strokeRoundedCallMissed04`
747 -- `HugeIcons.strokeRoundedCallOutgoing01`
748 -- `HugeIcons.strokeRoundedCallOutgoing02`
749 -- `HugeIcons.strokeRoundedCallOutgoing03`
750 -- `HugeIcons.strokeRoundedCallOutgoing04`
751 -- `HugeIcons.strokeRoundedCallPaused02`
752 -- `HugeIcons.strokeRoundedCallPaused`
753 -- `HugeIcons.strokeRoundedCallReceived02`
754 -- `HugeIcons.strokeRoundedCallReceived`
755 -- `HugeIcons.strokeRoundedCallRinging01`
756 -- `HugeIcons.strokeRoundedCallRinging02`
757 -- `HugeIcons.strokeRoundedCallRinging03`
758 -- `HugeIcons.strokeRoundedCallRinging04`
759 -- `HugeIcons.strokeRoundedCall`
760 -- `HugeIcons.strokeRoundedCallUnlocked02`
761 -- `HugeIcons.strokeRoundedCallUnlocked`
762 -- `HugeIcons.strokeRoundedCalling02`
763 -- `HugeIcons.strokeRoundedCalling`
764 -- `HugeIcons.strokeRoundedCamel`
765 -- `HugeIcons.strokeRoundedCamera01`
766 -- `HugeIcons.strokeRoundedCamera02`
767 -- `HugeIcons.strokeRoundedCamera03`
768 -- `HugeIcons.strokeRoundedCameraAdd01`
769 -- `HugeIcons.strokeRoundedCameraAdd02`
770 -- `HugeIcons.strokeRoundedCameraAdd03`
771 -- `HugeIcons.strokeRoundedCameraAi`
772 -- `HugeIcons.strokeRoundedCameraAutomatically01`
773 -- `HugeIcons.strokeRoundedCameraAutomatically02`
774 -- `HugeIcons.strokeRoundedCameraLens`
775 -- `HugeIcons.strokeRoundedCameraMicrophone01`
776 -- `HugeIcons.strokeRoundedCameraMicrophone02`
777 -- `HugeIcons.strokeRoundedCameraNightMode01`
778 -- `HugeIcons.strokeRoundedCameraNightMode02`
779 -- `HugeIcons.strokeRoundedCameraOff01`
780 -- `HugeIcons.strokeRoundedCameraOff02`
781 -- `HugeIcons.strokeRoundedCameraRotated01`
782 -- `HugeIcons.strokeRoundedCameraRotated02`
783 -- `HugeIcons.strokeRoundedCameraSmile01`
784 -- `HugeIcons.strokeRoundedCameraSmile02`
785 -- `HugeIcons.strokeRoundedCameraTripod`
786 -- `HugeIcons.strokeRoundedCameraVideo`
787 -- `HugeIcons.strokeRoundedCamper`
788 -- `HugeIcons.strokeRoundedCampfire`
789 -- `HugeIcons.strokeRoundedCancel01`
790 -- `HugeIcons.strokeRoundedCancel02`
791 -- `HugeIcons.strokeRoundedCancelCircleHalfDot`
792 -- `HugeIcons.strokeRoundedCancelCircle`
793 -- `HugeIcons.strokeRoundedCancelSquare`
794 -- `HugeIcons.strokeRoundedCandelier01`
795 -- `HugeIcons.strokeRoundedCandelier02`
796 -- `HugeIcons.strokeRoundedCanvas`
797 -- `HugeIcons.strokeRoundedCapProjecting`
798 -- `HugeIcons.strokeRoundedCapRound`
799 -- `HugeIcons.strokeRoundedCapStraight`
800 -- `HugeIcons.strokeRoundedCap`
801 -- `HugeIcons.strokeRoundedCapcutRectangle`
802 -- `HugeIcons.strokeRoundedCapcut`
803 -- `HugeIcons.strokeRoundedCar01`
804 -- `HugeIcons.strokeRoundedCar02`
805 -- `HugeIcons.strokeRoundedCar03`
806 -- `HugeIcons.strokeRoundedCar04`
807 -- `HugeIcons.strokeRoundedCar05`
808 -- `HugeIcons.strokeRoundedCarAlert`
809 -- `HugeIcons.strokeRoundedCarParking01`
810 -- `HugeIcons.strokeRoundedCarParking02`
811 -- `HugeIcons.strokeRoundedCarSignal`
812 -- `HugeIcons.strokeRoundedCarTime`
813 -- `HugeIcons.strokeRoundedCaravan`
814 -- `HugeIcons.strokeRoundedCardExchange01`
815 -- `HugeIcons.strokeRoundedCardExchange02`
816 -- `HugeIcons.strokeRoundedCardigan`
817 -- `HugeIcons.strokeRoundedCardiogram01`
818 -- `HugeIcons.strokeRoundedCardiogram02`
819 -- `HugeIcons.strokeRoundedCards01`
820 -- `HugeIcons.strokeRoundedCards02`
821 -- `HugeIcons.strokeRoundedCargoShip`
822 -- `HugeIcons.strokeRoundedCarouselHorizontal02`
823 -- `HugeIcons.strokeRoundedCarouselHorizontal`
824 -- `HugeIcons.strokeRoundedCarouselVertical`
825 -- `HugeIcons.strokeRoundedCarrot`
826 -- `HugeIcons.strokeRoundedCash01`
827 -- `HugeIcons.strokeRoundedCash02`
828 -- `HugeIcons.strokeRoundedCashbackBitcoin`
829 -- `HugeIcons.strokeRoundedCashbackEuro`
830 -- `HugeIcons.strokeRoundedCashbackPound`
831 -- `HugeIcons.strokeRoundedCashback`
832 -- `HugeIcons.strokeRoundedCashbackYen`
833 -- `HugeIcons.strokeRoundedCashier02`
834 -- `HugeIcons.strokeRoundedCashier`
835 -- `HugeIcons.strokeRoundedCastbox`
836 -- `HugeIcons.strokeRoundedCastle01`
837 -- `HugeIcons.strokeRoundedCastle02`
838 -- `HugeIcons.strokeRoundedCastle`
839 -- `HugeIcons.strokeRoundedCatalogue`
840 -- `HugeIcons.strokeRoundedCayanTower`
841 -- `HugeIcons.strokeRoundedCctvCamera`
842 -- `HugeIcons.strokeRoundedCd`
843 -- `HugeIcons.strokeRoundedCells`
844 -- `HugeIcons.strokeRoundedCellularNetworkOffline`
845 -- `HugeIcons.strokeRoundedCellularNetwork`
846 -- `HugeIcons.strokeRoundedCelsius`
847 -- `HugeIcons.strokeRoundedCenterFocus`
848 -- `HugeIcons.strokeRoundedCentralShaheedMinar`
849 -- `HugeIcons.strokeRoundedCentralized`
850 -- `HugeIcons.strokeRoundedCertificate01`
851 -- `HugeIcons.strokeRoundedCertificate02`
852 -- `HugeIcons.strokeRoundedChair01`
853 -- `HugeIcons.strokeRoundedChair02`
854 -- `HugeIcons.strokeRoundedChair03`
855 -- `HugeIcons.strokeRoundedChair04`
856 -- `HugeIcons.strokeRoundedChair05`
857 -- `HugeIcons.strokeRoundedChairBarber`
858 -- `HugeIcons.strokeRoundedChampion`
859 -- `HugeIcons.strokeRoundedChangeScreenMode`
860 -- `HugeIcons.strokeRoundedCharacterPhonetic`
861 -- `HugeIcons.strokeRoundedCharity`
862 -- `HugeIcons.strokeRoundedChart01`
863 -- `HugeIcons.strokeRoundedChart02`
864 -- `HugeIcons.strokeRoundedChart03`
865 -- `HugeIcons.strokeRoundedChartAverage`
866 -- `HugeIcons.strokeRoundedChartBarLine`
867 -- `HugeIcons.strokeRoundedChartBreakoutCircle`
868 -- `HugeIcons.strokeRoundedChartBreakoutSquare`
869 -- `HugeIcons.strokeRoundedChartBubble01`
870 -- `HugeIcons.strokeRoundedChartBubble02`
871 -- `HugeIcons.strokeRoundedChartColumn`
872 -- `HugeIcons.strokeRoundedChartDecrease`
873 -- `HugeIcons.strokeRoundedChartDown`
874 -- `HugeIcons.strokeRoundedChartEvaluation`
875 -- `HugeIcons.strokeRoundedChartHighLow`
876 -- `HugeIcons.strokeRoundedChartHistogram`
877 -- `HugeIcons.strokeRoundedChartIncrease`
878 -- `HugeIcons.strokeRoundedChartLineData01`
879 -- `HugeIcons.strokeRoundedChartLineData02`
880 -- `HugeIcons.strokeRoundedChartLineData03`
881 -- `HugeIcons.strokeRoundedChartMaximum`
882 -- `HugeIcons.strokeRoundedChartMedium`
883 -- `HugeIcons.strokeRoundedChartMinimum`
884 -- `HugeIcons.strokeRoundedChartRadar`
885 -- `HugeIcons.strokeRoundedChartRelationship`
886 -- `HugeIcons.strokeRoundedChartRing`
887 -- `HugeIcons.strokeRoundedChartRose`
888 -- `HugeIcons.strokeRoundedChartScatter`
889 -- `HugeIcons.strokeRoundedChart`
890 -- `HugeIcons.strokeRoundedChartUp`
891 -- `HugeIcons.strokeRoundedChatBot`
892 -- `HugeIcons.strokeRoundedChatGpt`
893 -- `HugeIcons.strokeRoundedChatting01`
894 -- `HugeIcons.strokeRoundedCheckList`
895 -- `HugeIcons.strokeRoundedCheckUnread01`
896 -- `HugeIcons.strokeRoundedCheckUnread02`
897 -- `HugeIcons.strokeRoundedCheckUnread03`
898 -- `HugeIcons.strokeRoundedCheckUnread04`
899 -- `HugeIcons.strokeRoundedCheckmarkBadge01`
900 -- `HugeIcons.strokeRoundedCheckmarkBadge02`
901 -- `HugeIcons.strokeRoundedCheckmarkBadge03`
902 -- `HugeIcons.strokeRoundedCheckmarkBadge04`
903 -- `HugeIcons.strokeRoundedCheckmarkCircle01`
904 -- `HugeIcons.strokeRoundedCheckmarkCircle02`
905 -- `HugeIcons.strokeRoundedCheckmarkCircle03`
906 -- `HugeIcons.strokeRoundedCheckmarkCircle04`
907 -- `HugeIcons.strokeRoundedCheckmarkSquare01`
908 -- `HugeIcons.strokeRoundedCheckmarkSquare02`
909 -- `HugeIcons.strokeRoundedCheckmarkSquare03`
910 -- `HugeIcons.strokeRoundedCheckmarkSquare04`
911 -- `HugeIcons.strokeRoundedCheeseCake01`
912 -- `HugeIcons.strokeRoundedCheeseCake02`
913 -- `HugeIcons.strokeRoundedCheese`
914 -- `HugeIcons.strokeRoundedChefHat`
915 -- `HugeIcons.strokeRoundedChef`
916 -- `HugeIcons.strokeRoundedChemistry01`
917 -- `HugeIcons.strokeRoundedChemistry02`
918 -- `HugeIcons.strokeRoundedChemistry03`
919 -- `HugeIcons.strokeRoundedCherry`
920 -- `HugeIcons.strokeRoundedChess01`
921 -- `HugeIcons.strokeRoundedChess02`
922 -- `HugeIcons.strokeRoundedChessPawn`
923 -- `HugeIcons.strokeRoundedChickenThighs`
924 -- `HugeIcons.strokeRoundedChild`
925 -- `HugeIcons.strokeRoundedChimney`
926 -- `HugeIcons.strokeRoundedChinaTemple`
927 -- `HugeIcons.strokeRoundedChip02`
928 -- `HugeIcons.strokeRoundedChip`
929 -- `HugeIcons.strokeRoundedChocolate`
930 -- `HugeIcons.strokeRoundedChopsticks`
931 -- `HugeIcons.strokeRoundedChrome`
932 -- `HugeIcons.strokeRoundedChrysler`
933 -- `HugeIcons.strokeRoundedChurch`
934 -- `HugeIcons.strokeRoundedCinnamonRoll`
935 -- `HugeIcons. static const List<List<dynamic>>`
936 -- `HugeIcons. static const List<List<dynamic>>`
937 -- `HugeIcons. static const List<List<dynamic>>`
938 -- `HugeIcons.strokeRoundedCircleArrowDiagonal01`
939 -- `HugeIcons.strokeRoundedCircleArrowDiagonal02`
940 -- `HugeIcons.strokeRoundedCircleArrowDown01`
941 -- `HugeIcons.strokeRoundedCircleArrowDown02`
942 -- `HugeIcons.strokeRoundedCircleArrowDown03`
943 -- `HugeIcons.strokeRoundedCircleArrowDownDouble`
944 -- `HugeIcons.strokeRoundedCircleArrowDownLeft`
945 -- `HugeIcons.strokeRoundedCircleArrowDownRight`
946 -- `HugeIcons.strokeRoundedCircleArrowExpand01`
947 -- `HugeIcons.strokeRoundedCircleArrowExpand02`
948 -- `HugeIcons.strokeRoundedCircleArrowHorizontal`
949 -- `HugeIcons.strokeRoundedCircleArrowLeft01`
950 -- `HugeIcons.strokeRoundedCircleArrowLeft02`
951 -- `HugeIcons.strokeRoundedCircleArrowLeft03`
952 -- `HugeIcons.strokeRoundedCircleArrowLeftDouble`
953 -- `HugeIcons.strokeRoundedCircleArrowLeftRight`
954 -- `HugeIcons.strokeRoundedCircleArrowMoveDownLeft`
955 -- `HugeIcons.strokeRoundedCircleArrowMoveDownRight`
956 -- `HugeIcons.strokeRoundedCircleArrowMoveLeftDown`
957 -- `HugeIcons.strokeRoundedCircleArrowMoveRightDown`
958 -- `HugeIcons.strokeRoundedCircleArrowMoveUpLeft`
959 -- `HugeIcons.strokeRoundedCircleArrowMoveUpRight`
960 -- `HugeIcons.strokeRoundedCircleArrowReload01`
961 -- `HugeIcons.strokeRoundedCircleArrowReload02`
962 -- `HugeIcons.strokeRoundedCircleArrowRight01`
963 -- `HugeIcons.strokeRoundedCircleArrowRight02`
964 -- `HugeIcons.strokeRoundedCircleArrowRight03`
965 -- `HugeIcons.strokeRoundedCircleArrowRightDouble`
966 -- `HugeIcons.strokeRoundedCircleArrowShrink01`
967 -- `HugeIcons.strokeRoundedCircleArrowShrink02`
968 -- `HugeIcons.strokeRoundedCircleArrowUp01`
969 -- `HugeIcons.strokeRoundedCircleArrowUp02`
970 -- `HugeIcons.strokeRoundedCircleArrowUp03`
971 -- `HugeIcons.strokeRoundedCircleArrowUpDouble`
972 -- `HugeIcons.strokeRoundedCircleArrowUpDown`
973 -- `HugeIcons.strokeRoundedCircleArrowUpLeft`
974 -- `HugeIcons.strokeRoundedCircleArrowUpRight02`
975 -- `HugeIcons.strokeRoundedCircleArrowUpRight`
976 -- `HugeIcons.strokeRoundedCircleArrowVertical`
977 -- `HugeIcons.strokeRoundedCircleLock01`
978 -- `HugeIcons.strokeRoundedCircleLock02`
979 -- `HugeIcons.strokeRoundedCircleLockAdd01`
980 -- `HugeIcons.strokeRoundedCircleLockAdd02`
981 -- `HugeIcons.strokeRoundedCircleLockCheck01`
982 -- `HugeIcons.strokeRoundedCircleLockCheck02`
983 -- `HugeIcons.strokeRoundedCircleLockMinus01`
984 -- `HugeIcons.strokeRoundedCircleLockMinus02`
985 -- `HugeIcons.strokeRoundedCircleLockRemove01`
986 -- `HugeIcons.strokeRoundedCircleLockRemove02`
987 -- `HugeIcons.strokeRoundedCirclePassword`
988 -- `HugeIcons.strokeRoundedCircle`
989 -- `HugeIcons.strokeRoundedCircleUnlock01`
990 -- `HugeIcons.strokeRoundedCircleUnlock02`
991 -- `HugeIcons.strokeRoundedCity01`
992 -- `HugeIcons.strokeRoundedCity02`
993 -- `HugeIcons.strokeRoundedCity03`
994 -- `HugeIcons.strokeRoundedClapping01`
995 -- `HugeIcons.strokeRoundedClapping02`
996 -- `HugeIcons.strokeRoundedClaude`
997 -- `HugeIcons.strokeRoundedClean`
998 -- `HugeIcons.strokeRoundedCleaningBucket`
999 -- `HugeIcons.strokeRoundedClinic`
1000 -- `HugeIcons.strokeRoundedClip`
1001 -- `HugeIcons.strokeRoundedCliparts`
1002 -- `HugeIcons.strokeRoundedClipboard`
1003 -- `HugeIcons.strokeRoundedClock01`
1004 -- `HugeIcons.strokeRoundedClock02`
1005 -- `HugeIcons.strokeRoundedClock03`
1006 -- `HugeIcons.strokeRoundedClock04`
1007 -- `HugeIcons.strokeRoundedClock05`
1008 -- `HugeIcons.strokeRoundedClosedCaptionAlt`
1009 -- `HugeIcons.strokeRoundedClosedCaption`
1010 -- `HugeIcons.strokeRoundedClothes`
1011 -- `HugeIcons.strokeRoundedCloudAngledRain`
1012 -- `HugeIcons.strokeRoundedCloudAngledRainZap`
1013 -- `HugeIcons.strokeRoundedCloudAngledZap`
1014 -- `HugeIcons.strokeRoundedCloudBigRain`
1015 -- `HugeIcons.strokeRoundedCloudDownload`
1016 -- `HugeIcons.strokeRoundedCloudFastWind`
1017 -- `HugeIcons.strokeRoundedCloudHailstone`
1018 -- `HugeIcons.strokeRoundedCloudLittleRain`
1019 -- `HugeIcons.strokeRoundedCloudLittleSnow`
1020 -- `HugeIcons.strokeRoundedCloudLoading`
1021 -- `HugeIcons.strokeRoundedCloudMidRain`
1022 -- `HugeIcons.strokeRoundedCloudMidSnow`
1023 -- `HugeIcons.strokeRoundedCloudSavingDone01`
1024 -- `HugeIcons.strokeRoundedCloudSavingDone02`
1025 -- `HugeIcons.strokeRoundedCloudServer`
1026 -- `HugeIcons.strokeRoundedCloudSlowWind`
1027 -- `HugeIcons.strokeRoundedCloudSnow`
1028 -- `HugeIcons.strokeRoundedCloud`
1029 -- `HugeIcons.strokeRoundedCloudUpload`
1030 -- `HugeIcons.strokeRoundedClubs01`
1031 -- `HugeIcons.strokeRoundedClubs02`
1032 -- `HugeIcons.strokeRoundedCoPresent`
1033 -- `HugeIcons.strokeRoundedCodeCircle`
1034 -- `HugeIcons.strokeRoundedCodeFolder`
1035 -- `HugeIcons.strokeRoundedCodeSquare`
1036 -- `HugeIcons.strokeRoundedCode`
1037 -- `HugeIcons.strokeRoundedCodesandbox`
1038 -- `HugeIcons.strokeRoundedCoffee01`
1039 -- `HugeIcons.strokeRoundedCoffee02`
1040 -- `HugeIcons.strokeRoundedCoffeeBeans`
1041 -- `HugeIcons.strokeRoundedCoinbase`
1042 -- `HugeIcons.strokeRoundedCoins01`
1043 -- `HugeIcons.strokeRoundedCoins02`
1044 -- `HugeIcons.strokeRoundedCoinsBitcoin`
1045 -- `HugeIcons.strokeRoundedCoinsDollar`
1046 -- `HugeIcons.strokeRoundedCoinsEuro`
1047 -- `HugeIcons.strokeRoundedCoinsPound`
1048 -- `HugeIcons.strokeRoundedCoinsSwap`
1049 -- `HugeIcons.strokeRoundedCoinsYen`
1050 -- `HugeIcons.strokeRoundedCollectionsBookmark`
1051 -- `HugeIcons.strokeRoundedColorPicker`
1052 -- `HugeIcons.strokeRoundedColors`
1053 -- `HugeIcons.strokeRoundedColosseum`
1054 -- `HugeIcons.strokeRoundedColumnDelete`
1055 -- `HugeIcons.strokeRoundedColumnInsert`
1056 -- `HugeIcons.strokeRoundedComet01`
1057 -- `HugeIcons.strokeRoundedComet02`
1058 -- `HugeIcons.strokeRoundedComingSoon01`
1059 -- `HugeIcons.strokeRoundedComingSoon02`
1060 -- `HugeIcons.strokeRoundedCommandLine`
1061 -- `HugeIcons.strokeRoundedCommand`
1062 -- `HugeIcons.strokeRoundedComment01`
1063 -- `HugeIcons.strokeRoundedComment02`
1064 -- `HugeIcons.strokeRoundedComment03`
1065 -- `HugeIcons.strokeRoundedCommentAdd01`
1066 -- `HugeIcons.strokeRoundedCommentAdd02`
1067 -- `HugeIcons.strokeRoundedCommentAdd03`
1068 -- `HugeIcons.strokeRoundedCommentBlock01`
1069 -- `HugeIcons.strokeRoundedCommentBlock02`
1070 -- `HugeIcons.strokeRoundedCommentBlock03`
1071 -- `HugeIcons.strokeRoundedCommentRemove01`
1072 -- `HugeIcons.strokeRoundedCommentRemove02`
1073 -- `HugeIcons.strokeRoundedCommentRemove03`
1074 -- `HugeIcons.strokeRoundedCompass01`
1075 -- `HugeIcons.strokeRoundedCompass`
1076 -- `HugeIcons.strokeRoundedComplaint`
1077 -- `HugeIcons.strokeRoundedComputerActivity`
1078 -- `HugeIcons.strokeRoundedComputerAdd`
1079 -- `HugeIcons.strokeRoundedComputerArrowDown`
1080 -- `HugeIcons.strokeRoundedComputerArrowUp`
1081 -- `HugeIcons.strokeRoundedComputerChartDown`
1082 -- `HugeIcons.strokeRoundedComputerChartUp`
1083 -- `HugeIcons.strokeRoundedComputerCheck`
1084 -- `HugeIcons.strokeRoundedComputerCloud`
1085 -- `HugeIcons.strokeRoundedComputerDesk01`
1086 -- `HugeIcons.strokeRoundedComputerDesk02`
1087 -- `HugeIcons.strokeRoundedComputerDesk03`
1088 -- `HugeIcons.strokeRoundedComputerDollar`
1089 -- `HugeIcons.strokeRoundedComputerEthernet`
1090 -- `HugeIcons.strokeRoundedComputerPhoneSync`
1091 -- `HugeIcons.strokeRoundedComputerProgramming01`
1092 -- `HugeIcons.strokeRoundedComputerProgramming02`
1093 -- `HugeIcons.strokeRoundedComputerProtection`
1094 -- `HugeIcons.strokeRoundedComputerRemove`
1095 -- `HugeIcons.strokeRoundedComputerScreenShare`
1096 -- `HugeIcons.strokeRoundedComputerSettings`
1097 -- `HugeIcons.strokeRoundedComputer`
1098 -- `HugeIcons.strokeRoundedComputerTerminal01`
1099 -- `HugeIcons.strokeRoundedComputerTerminal02`
1100 -- `HugeIcons.strokeRoundedComputerUser`
1101 -- `HugeIcons.strokeRoundedComputerVideoCall`
1102 -- `HugeIcons.strokeRoundedComputerVideo`
1103 -- `HugeIcons.strokeRoundedCone01`
1104 -- `HugeIcons.strokeRoundedCone02`
1105 -- `HugeIcons.strokeRoundedConference`
1106 -- `HugeIcons.strokeRoundedConfiguration01`
1107 -- `HugeIcons.strokeRoundedConfiguration02`
1108 -- `HugeIcons.strokeRoundedConfused`
1109 -- `HugeIcons.strokeRoundedCongruentToCircle`
1110 -- `HugeIcons.strokeRoundedCongruentToSquare`
1111 -- `HugeIcons.strokeRoundedCongruentTo`
1112 -- `HugeIcons.strokeRoundedConnect`
1113 -- `HugeIcons.strokeRoundedConsole`
1114 -- `HugeIcons.strokeRoundedConstellation`
1115 -- `HugeIcons.strokeRoundedContact01`
1116 -- `HugeIcons.strokeRoundedContact02`
1117 -- `HugeIcons.strokeRoundedContactBook`
1118 -- `HugeIcons.strokeRoundedContact`
1119 -- `HugeIcons.strokeRoundedContainerTruck01`
1120 -- `HugeIcons.strokeRoundedContainerTruck02`
1121 -- `HugeIcons.strokeRoundedContainerTruck`
1122 -- `HugeIcons.strokeRoundedContentWriting`
1123 -- `HugeIcons.strokeRoundedContracts`
1124 -- `HugeIcons.strokeRoundedConversation`
1125 -- `HugeIcons.strokeRoundedCookBook`
1126 -- `HugeIcons.strokeRoundedCookie`
1127 -- `HugeIcons.strokeRoundedCoordinate01`
1128 -- `HugeIcons.strokeRoundedCoordinate02`
1129 -- `HugeIcons.strokeRoundedCopilot`
1130 -- `HugeIcons.strokeRoundedCopy01`
1131 -- `HugeIcons.strokeRoundedCopy02`
1132 -- `HugeIcons.strokeRoundedCopyLink`
1133 -- `HugeIcons.strokeRoundedCopyright`
1134 -- `HugeIcons.strokeRoundedCorn`
1135 -- `HugeIcons.strokeRoundedCorporate`
1136 -- `HugeIcons.strokeRoundedCos`
1137 -- `HugeIcons.strokeRoundedCosine01`
1138 -- `HugeIcons.strokeRoundedCosine02`
1139 -- `HugeIcons.strokeRoundedCottage`
1140 -- `HugeIcons.strokeRoundedCottonCandy`
1141 -- `HugeIcons.strokeRoundedCoupon01`
1142 -- `HugeIcons.strokeRoundedCoupon02`
1143 -- `HugeIcons.strokeRoundedCoupon03`
1144 -- `HugeIcons.strokeRoundedCouponPercent`
1145 -- `HugeIcons.strokeRoundedCourse`
1146 -- `HugeIcons.strokeRoundedCourtHouse`
1147 -- `HugeIcons.strokeRoundedCourtLaw`
1148 -- `HugeIcons.strokeRoundedCovariate`
1149 -- `HugeIcons.strokeRoundedCovidInfo`
1150 -- `HugeIcons.strokeRoundedCowboyHat`
1151 -- `HugeIcons.strokeRoundedCpp`
1152 -- `HugeIcons.strokeRoundedCpuCharge`
1153 -- `HugeIcons.strokeRoundedCpuSettings`
1154 -- `HugeIcons.strokeRoundedCpu`
1155 -- `HugeIcons.strokeRoundedCrab`
1156 -- `HugeIcons.strokeRoundedCrane`
1157 -- `HugeIcons.strokeRoundedCrazy`
1158 -- `HugeIcons.strokeRoundedCreativeMarket`
1159 -- `HugeIcons.strokeRoundedCreditCardAccept`
1160 -- `HugeIcons.strokeRoundedCreditCardAdd`
1161 -- `HugeIcons.strokeRoundedCreditCardChange`
1162 -- `HugeIcons.strokeRoundedCreditCardDefrost`
1163 -- `HugeIcons.strokeRoundedCreditCardFreeze`
1164 -- `HugeIcons.strokeRoundedCreditCardNotAccept`
1165 -- `HugeIcons.strokeRoundedCreditCardNotFound`
1166 -- `HugeIcons.strokeRoundedCreditCardPos`
1167 -- `HugeIcons.strokeRoundedCreditCard`
1168 -- `HugeIcons.strokeRoundedCreditCardValidation`
1169 -- `HugeIcons.strokeRoundedCricketBat`
1170 -- `HugeIcons.strokeRoundedCricketHelmet`
1171 -- `HugeIcons.strokeRoundedCroissant`
1172 -- `HugeIcons.strokeRoundedCrop`
1173 -- `HugeIcons.strokeRoundedCrowdfunding`
1174 -- `HugeIcons.strokeRoundedCrown02`
1175 -- `HugeIcons.strokeRoundedCrown03`
1176 -- `HugeIcons.strokeRoundedCrownMinus`
1177 -- `HugeIcons.strokeRoundedCrownPlus`
1178 -- `HugeIcons.strokeRoundedCrown`
1179 -- `HugeIcons.strokeRoundedCrying`
1180 -- `HugeIcons.strokeRoundedCss3`
1181 -- `HugeIcons.strokeRoundedCssFile01`
1182 -- `HugeIcons.strokeRoundedCssFile02`
1183 -- `HugeIcons.strokeRoundedCsv01`
1184 -- `HugeIcons.strokeRoundedCsv02`
1185 -- `HugeIcons.strokeRoundedCube`
1186 -- `HugeIcons.strokeRoundedCupcake01`
1187 -- `HugeIcons.strokeRoundedCupcake02`
1188 -- `HugeIcons.strokeRoundedCupcake03`
1189 -- `HugeIcons.strokeRoundedCurling`
1190 -- `HugeIcons.strokeRoundedCursor01`
1191 -- `HugeIcons.strokeRoundedCursor02`
1192 -- `HugeIcons.strokeRoundedCursorAddSelection01`
1193 -- `HugeIcons.strokeRoundedCursorAddSelection02`
1194 -- `HugeIcons.strokeRoundedCursorCircleSelection01`
1195 -- `HugeIcons.strokeRoundedCursorCircleSelection02`
1196 -- `HugeIcons.strokeRoundedCursorDisabled01`
1197 -- `HugeIcons.strokeRoundedCursorDisabled02`
1198 -- `HugeIcons.strokeRoundedCursorEdit01`
1199 -- `HugeIcons.strokeRoundedCursorEdit02`
1200 -- `HugeIcons.strokeRoundedCursorHold01`
1201 -- `HugeIcons.strokeRoundedCursorHold02`
1202 -- `HugeIcons.strokeRoundedCursorInWindow`
1203 -- `HugeIcons.strokeRoundedCursorInfo01`
1204 -- `HugeIcons.strokeRoundedCursorInfo02`
1205 -- `HugeIcons.strokeRoundedCursorLoading01`
1206 -- `HugeIcons.strokeRoundedCursorLoading02`
1207 -- `HugeIcons.strokeRoundedCursorMagicSelection01`
1208 -- `HugeIcons.strokeRoundedCursorMagicSelection02`
1209 -- `HugeIcons.strokeRoundedCursorMagicSelection03`
1210 -- `HugeIcons.strokeRoundedCursorMagicSelection04`
1211 -- `HugeIcons.strokeRoundedCursorMove01`
1212 -- `HugeIcons.strokeRoundedCursorMove02`
1213 -- `HugeIcons.strokeRoundedCursorPointer01`
1214 -- `HugeIcons.strokeRoundedCursorPointer02`
1215 -- `HugeIcons.strokeRoundedCursorProgress01`
1216 -- `HugeIcons.strokeRoundedCursorProgress02`
1217 -- `HugeIcons.strokeRoundedCursorProgress03`
1218 -- `HugeIcons.strokeRoundedCursorProgress04`
1219 -- `HugeIcons.strokeRoundedCursorRectangleSelection01`
1220 -- `HugeIcons.strokeRoundedCursorRectangleSelection02`
1221 -- `HugeIcons.strokeRoundedCursorRemoveSelection01`
1222 -- `HugeIcons.strokeRoundedCursorRemoveSelection02`
1223 -- `HugeIcons.strokeRoundedCursorText`
1224 -- `HugeIcons.strokeRoundedCurtains`
1225 -- `HugeIcons.strokeRoundedCurvyLeftDirection`
1226 -- `HugeIcons.strokeRoundedCurvyLeftRightDirection`
1227 -- `HugeIcons.strokeRoundedCurvyRightDirection`
1228 -- `HugeIcons.strokeRoundedCurvyUpDownDirection`
1229 -- `HugeIcons.strokeRoundedCustomField`
1230 -- `HugeIcons.strokeRoundedCustomerService01`
1231 -- `HugeIcons.strokeRoundedCustomerService02`
1232 -- `HugeIcons.strokeRoundedCustomerService`
1233 -- `HugeIcons.strokeRoundedCustomerSupport`
1234 -- `HugeIcons.strokeRoundedCustomize`
1235 -- `HugeIcons.strokeRoundedCylinder01`
1236 -- `HugeIcons.strokeRoundedCylinder02`
1237 -- `HugeIcons.strokeRoundedCylinder03`
1238 -- `HugeIcons.strokeRoundedCylinder04`
1239 -- `HugeIcons.strokeRoundedDanger`
1240 -- `HugeIcons.strokeRoundedDarkMode`
1241 -- `HugeIcons.strokeRoundedDart`
1242 -- `HugeIcons.strokeRoundedDashboardBrowsing`
1243 -- `HugeIcons.strokeRoundedDashboardCircleAdd`
1244 -- `HugeIcons.strokeRoundedDashboardCircleEdit`
1245 -- `HugeIcons.strokeRoundedDashboardCircleRemove`
1246 -- `HugeIcons.strokeRoundedDashboardCircleSettings`
1247 -- `HugeIcons.strokeRoundedDashboardCircle`
1248 -- `HugeIcons.strokeRoundedDashboardSpeed01`
1249 -- `HugeIcons.strokeRoundedDashboardSpeed02`
1250 -- `HugeIcons.strokeRoundedDashboardSquare01`
1251 -- `HugeIcons.strokeRoundedDashboardSquare02`
1252 -- `HugeIcons.strokeRoundedDashboardSquare03`
1253 -- `HugeIcons.strokeRoundedDashboardSquareAdd`
1254 -- `HugeIcons.strokeRoundedDashboardSquareEdit`
1255 -- `HugeIcons.strokeRoundedDashboardSquareRemove`
1256 -- `HugeIcons.strokeRoundedDashboardSquareSetting`
1257 -- `HugeIcons.strokeRoundedDashedLine01`
1258 -- `HugeIcons.strokeRoundedDashedLine02`
1259 -- `HugeIcons.strokeRoundedDashedLineCircle`
1260 -- `HugeIcons.strokeRoundedDataRecovery`
1261 -- `HugeIcons.strokeRoundedDatabase01`
1262 -- `HugeIcons.strokeRoundedDatabase02`
1263 -- `HugeIcons.strokeRoundedDatabaseAdd`
1264 -- `HugeIcons.strokeRoundedDatabaseExport`
1265 -- `HugeIcons.strokeRoundedDatabaseImport`
1266 -- `HugeIcons.strokeRoundedDatabaseLocked`
1267 -- `HugeIcons.strokeRoundedDatabaseRestore`
1268 -- `HugeIcons.strokeRoundedDatabaseSetting`
1269 -- `HugeIcons.strokeRoundedDatabase`
1270 -- `HugeIcons.strokeRoundedDatabaseSync01`
1271 -- `HugeIcons.strokeRoundedDatabaseSync`
1272 -- `HugeIcons.strokeRoundedDateTime`
1273 -- `HugeIcons.strokeRoundedDates`
1274 -- `HugeIcons.strokeRoundedDatev`
1275 -- `HugeIcons.strokeRoundedDead`
1276 -- `HugeIcons.strokeRoundedDeepseek`
1277 -- `HugeIcons.strokeRoundedDelete01`
1278 -- `HugeIcons.strokeRoundedDelete02`
1279 -- `HugeIcons.strokeRoundedDelete03`
1280 -- `HugeIcons.strokeRoundedDelete04`
1281 -- `HugeIcons.strokeRoundedDeleteColumn`
1282 -- `HugeIcons.strokeRoundedDeletePutBack`
1283 -- `HugeIcons.strokeRoundedDeleteRow`
1284 -- `HugeIcons.strokeRoundedDeleteThrow`
1285 -- `HugeIcons.strokeRoundedDeliveredSent`
1286 -- `HugeIcons.strokeRoundedDeliveryBox01`
1287 -- `HugeIcons.strokeRoundedDeliveryBox02`
1288 -- `HugeIcons.strokeRoundedDeliveryDelay01`
1289 -- `HugeIcons.strokeRoundedDeliveryDelay02`
1290 -- `HugeIcons.strokeRoundedDeliveryReturn01`
1291 -- `HugeIcons.strokeRoundedDeliveryReturn02`
1292 -- `HugeIcons.strokeRoundedDeliverySecure01`
1293 -- `HugeIcons.strokeRoundedDeliverySecure02`
1294 -- `HugeIcons.strokeRoundedDeliverySent01`
1295 -- `HugeIcons.strokeRoundedDeliverySent02`
1296 -- `HugeIcons.strokeRoundedDeliveryTracking01`
1297 -- `HugeIcons.strokeRoundedDeliveryTracking02`
1298 -- `HugeIcons.strokeRoundedDeliveryTruck01`
1299 -- `HugeIcons.strokeRoundedDeliveryTruck02`
1300 -- `HugeIcons.strokeRoundedDeliveryView01`
1301 -- `HugeIcons.strokeRoundedDeliveryView02`
1302 -- `HugeIcons.strokeRoundedDentalBraces`
1303 -- `HugeIcons.strokeRoundedDentalBrokenTooth`
1304 -- `HugeIcons.strokeRoundedDentalCare`
1305 -- `HugeIcons.strokeRoundedDentalTooth`
1306 -- `HugeIcons.strokeRoundedDepartement`
1307 -- `HugeIcons.strokeRoundedDesert`
1308 -- `HugeIcons.strokeRoundedDesk01`
1309 -- `HugeIcons.strokeRoundedDesk02`
1310 -- `HugeIcons.strokeRoundedDesk`
1311 -- `HugeIcons.strokeRoundedDetergent`
1312 -- `HugeIcons.strokeRoundedDeveloper`
1313 -- `HugeIcons.strokeRoundedDeviantart`
1314 -- `HugeIcons.strokeRoundedDeviceAccess`
1315 -- `HugeIcons.strokeRoundedDiagonalScrollPoint01`
1316 -- `HugeIcons.strokeRoundedDiagonalScrollPoint02`
1317 -- `HugeIcons.strokeRoundedDialpadCircle01`
1318 -- `HugeIcons.strokeRoundedDialpadCircle02`
1319 -- `HugeIcons.strokeRoundedDialpadSquare01`
1320 -- `HugeIcons.strokeRoundedDialpadSquare02`
1321 -- `HugeIcons.strokeRoundedDiameter`
1322 -- `HugeIcons.strokeRoundedDiamond01`
1323 -- `HugeIcons.strokeRoundedDiamond02`
1324 -- `HugeIcons.strokeRoundedDiamond`
1325 -- `HugeIcons.strokeRoundedDiaper`
1326 -- `HugeIcons.strokeRoundedDiceFaces01`
1327 -- `HugeIcons.strokeRoundedDiceFaces02`
1328 -- `HugeIcons.strokeRoundedDiceFaces03`
1329 -- `HugeIcons.strokeRoundedDiceFaces04`
1330 -- `HugeIcons.strokeRoundedDiceFaces05`
1331 -- `HugeIcons.strokeRoundedDiceFaces06`
1332 -- `HugeIcons.strokeRoundedDice`
1333 -- `HugeIcons.strokeRoundedDigestion`
1334 -- `HugeIcons.strokeRoundedDigg`
1335 -- `HugeIcons.strokeRoundedDigitalClock`
1336 -- `HugeIcons.strokeRoundedDimSum01`
1337 -- `HugeIcons.strokeRoundedDimSum02`
1338 -- `HugeIcons.strokeRoundedDiningTable`
1339 -- `HugeIcons.strokeRoundedDiploma`
1340 -- `HugeIcons.strokeRoundedDirectionLeft01`
1341 -- `HugeIcons.strokeRoundedDirectionLeft02`
1342 -- `HugeIcons.strokeRoundedDirectionRight01`
1343 -- `HugeIcons.strokeRoundedDirectionRight02`
1344 -- `HugeIcons.strokeRoundedDirections01`
1345 -- `HugeIcons.strokeRoundedDirections02`
1346 -- `HugeIcons.strokeRoundedDirham`
1347 -- `HugeIcons.strokeRoundedDisability01`
1348 -- `HugeIcons.strokeRoundedDisability02`
1349 -- `HugeIcons.strokeRoundedDiscord`
1350 -- `HugeIcons.strokeRoundedDiscount01`
1351 -- `HugeIcons.strokeRoundedDiscount`
1352 -- `HugeIcons.strokeRoundedDiscountTag01`
1353 -- `HugeIcons.strokeRoundedDiscountTag02`
1354 -- `HugeIcons.strokeRoundedDiscoverCircle`
1355 -- `HugeIcons.strokeRoundedDiscoverSquare`
1356 -- `HugeIcons.strokeRoundedDish01`
1357 -- `HugeIcons.strokeRoundedDish02`
1358 -- `HugeIcons.strokeRoundedDishWasher`
1359 -- `HugeIcons.strokeRoundedDispleased`
1360 -- `HugeIcons.strokeRoundedDistributeHorizontalCenter`
1361 -- `HugeIcons.strokeRoundedDistributeHorizontalLeft`
1362 -- `HugeIcons.strokeRoundedDistributeHorizontalRight`
1363 -- `HugeIcons.strokeRoundedDistributeVerticalBottom`
1364 -- `HugeIcons.strokeRoundedDistributeVerticalCenter`
1365 -- `HugeIcons.strokeRoundedDistributeVerticalTop`
1366 -- `HugeIcons.strokeRoundedDistribution`
1367 -- `HugeIcons.strokeRoundedDivideSignCircle`
1368 -- `HugeIcons.strokeRoundedDivideSignSquare`
1369 -- `HugeIcons.strokeRoundedDivideSign`
1370 -- `HugeIcons.strokeRoundedDna01`
1371 -- `HugeIcons.strokeRoundedDna`
1372 -- `HugeIcons.strokeRoundedDoNotTouch01`
1373 -- `HugeIcons.strokeRoundedDoNotTouch02`
1374 -- `HugeIcons.strokeRoundedDoc01`
1375 -- `HugeIcons.strokeRoundedDoc02`
1376 -- `HugeIcons.strokeRoundedDoctor01`
1377 -- `HugeIcons.strokeRoundedDoctor02`
1378 -- `HugeIcons.strokeRoundedDoctor03`
1379 -- `HugeIcons.strokeRoundedDocumentAttachment`
1380 -- `HugeIcons.strokeRoundedDocumentCode`
1381 -- `HugeIcons.strokeRoundedDocumentValidation`
1382 -- `HugeIcons.strokeRoundedDollar01`
1383 -- `HugeIcons.strokeRoundedDollar02`
1384 -- `HugeIcons.strokeRoundedDollarCircle`
1385 -- `HugeIcons.strokeRoundedDollarReceive01`
1386 -- `HugeIcons.strokeRoundedDollarReceive02`
1387 -- `HugeIcons.strokeRoundedDollarSend01`
1388 -- `HugeIcons.strokeRoundedDollarSend02`
1389 -- `HugeIcons.strokeRoundedDollarSquare`
1390 -- `HugeIcons.strokeRoundedDome`
1391 -- `HugeIcons.strokeRoundedDomino`
1392 -- `HugeIcons.strokeRoundedDoor01`
1393 -- `HugeIcons.strokeRoundedDoor02`
1394 -- `HugeIcons.strokeRoundedDoorLock`
1395 -- `HugeIcons.strokeRoundedDoor`
1396 -- `HugeIcons.strokeRoundedDoughnut`
1397 -- `HugeIcons.strokeRoundedDownload01`
1398 -- `HugeIcons.strokeRoundedDownload02`
1399 -- `HugeIcons.strokeRoundedDownload03`
1400 -- `HugeIcons.strokeRoundedDownload04`
1401 -- `HugeIcons.strokeRoundedDownload05`
1402 -- `HugeIcons.strokeRoundedDownloadCircle01`
1403 -- `HugeIcons.strokeRoundedDownloadCircle02`
1404 -- `HugeIcons.strokeRoundedDownloadSquare01`
1405 -- `HugeIcons.strokeRoundedDownloadSquare02`
1406 -- `HugeIcons.strokeRoundedDrag01`
1407 -- `HugeIcons.strokeRoundedDrag02`
1408 -- `HugeIcons.strokeRoundedDrag03`
1409 -- `HugeIcons.strokeRoundedDrag04`
1410 -- `HugeIcons.strokeRoundedDragDropHorizontal`
1411 -- `HugeIcons.strokeRoundedDragDrop`
1412 -- `HugeIcons.strokeRoundedDragDropVertical`
1413 -- `HugeIcons.strokeRoundedDragLeft01`
1414 -- `HugeIcons.strokeRoundedDragLeft02`
1415 -- `HugeIcons.strokeRoundedDragLeft03`
1416 -- `HugeIcons.strokeRoundedDragLeft04`
1417 -- `HugeIcons.strokeRoundedDragRight01`
1418 -- `HugeIcons.strokeRoundedDragRight02`
1419 -- `HugeIcons.strokeRoundedDragRight03`
1420 -- `HugeIcons.strokeRoundedDragRight04`
1421 -- `HugeIcons.strokeRoundedDrawingCompass`
1422 -- `HugeIcons.strokeRoundedDrawingMode`
1423 -- `HugeIcons.strokeRoundedDress01`
1424 -- `HugeIcons.strokeRoundedDress02`
1425 -- `HugeIcons.strokeRoundedDress03`
1426 -- `HugeIcons.strokeRoundedDress04`
1427 -- `HugeIcons.strokeRoundedDress05`
1428 -- `HugeIcons.strokeRoundedDress06`
1429 -- `HugeIcons.strokeRoundedDress07`
1430 -- `HugeIcons.strokeRoundedDressingTable01`
1431 -- `HugeIcons.strokeRoundedDressingTable02`
1432 -- `HugeIcons.strokeRoundedDressingTable03`
1433 -- `HugeIcons.strokeRoundedDribbble`
1434 -- `HugeIcons.strokeRoundedDrink`
1435 -- `HugeIcons.strokeRoundedDrive`
1436 -- `HugeIcons.strokeRoundedDrone`
1437 -- `HugeIcons.strokeRoundedDrooling`
1438 -- `HugeIcons.strokeRoundedDropbox`
1439 -- `HugeIcons.strokeRoundedDroplet`
1440 -- `HugeIcons.strokeRoundedDropper`
1441 -- `HugeIcons.strokeRoundedDs3Tool`
1442 -- `HugeIcons.strokeRoundedDua`
1443 -- `HugeIcons.strokeRoundedDumbbell01`
1444 -- `HugeIcons.strokeRoundedDumbbell02`
1445 -- `HugeIcons.strokeRoundedDumbbell03`
1446 -- `HugeIcons.strokeRoundedEarRings01`
1447 -- `HugeIcons.strokeRoundedEarRings02`
1448 -- `HugeIcons.strokeRoundedEarRings03`
1449 -- `HugeIcons.strokeRoundedEar`
1450 -- `HugeIcons.strokeRoundedEarth`
1451 -- `HugeIcons.strokeRoundedEaseCurveControlPoints`
1452 -- `HugeIcons.strokeRoundedEaseInControlPoint`
1453 -- `HugeIcons.strokeRoundedEaseInOut`
1454 -- `HugeIcons.strokeRoundedEaseIn`
1455 -- `HugeIcons.strokeRoundedEaseOutControlPoint`
1456 -- `HugeIcons.strokeRoundedEaseOut`
1457 -- `HugeIcons.strokeRoundedEcoEnergy`
1458 -- `HugeIcons.strokeRoundedEcoLab01`
1459 -- `HugeIcons.strokeRoundedEcoLab02`
1460 -- `HugeIcons.strokeRoundedEcoLab`
1461 -- `HugeIcons.strokeRoundedEcoPower`
1462 -- `HugeIcons.strokeRoundedEdgeStyle`
1463 -- `HugeIcons.strokeRoundedEdit01`
1464 -- `HugeIcons.strokeRoundedEdit02`
1465 -- `HugeIcons.strokeRoundedEdit03`
1466 -- `HugeIcons.strokeRoundedEdit04`
1467 -- `HugeIcons.strokeRoundedEditOff03`
1468 -- `HugeIcons.strokeRoundedEditOff04`
1469 -- `HugeIcons.strokeRoundedEditOff`
1470 -- `HugeIcons.strokeRoundedEditRoad`
1471 -- `HugeIcons.strokeRoundedEditTable`
1472 -- `HugeIcons.strokeRoundedEditUser02`
1473 -- `HugeIcons.strokeRoundedEggs`
1474 -- `HugeIcons.strokeRoundedEidMubarak`
1475 -- `HugeIcons.strokeRoundedEiffelTower`
1476 -- `HugeIcons.strokeRoundedEightCircle`
1477 -- `HugeIcons.strokeRoundedEightSquare`
1478 -- `HugeIcons.strokeRoundedElearningExchange`
1479 -- `HugeIcons.strokeRoundedElectricHome01`
1480 -- `HugeIcons.strokeRoundedElectricHome02`
1481 -- `HugeIcons.strokeRoundedElectricPlugs`
1482 -- `HugeIcons.strokeRoundedElectricTower01`
1483 -- `HugeIcons.strokeRoundedElectricTower02`
1484 -- `HugeIcons.strokeRoundedElectricWire`
1485 -- `HugeIcons.strokeRoundedEllipseSelection`
1486 -- `HugeIcons.strokeRoundedEncrypt`
1487 -- `HugeIcons.strokeRoundedEnergyEllipse`
1488 -- `HugeIcons.strokeRoundedEnergyRectangle`
1489 -- `HugeIcons.strokeRoundedEnergy`
1490 -- `HugeIcons.strokeRoundedEnteringGeoFence`
1491 -- `HugeIcons.strokeRoundedEntranceStairs`
1492 -- `HugeIcons.strokeRoundedEnvato`
1493 -- `HugeIcons.strokeRoundedEqualSignCircle`
1494 -- `HugeIcons.strokeRoundedEqualSignSquare`
1495 -- `HugeIcons.strokeRoundedEqualSign`
1496 -- `HugeIcons.strokeRoundedEquipmentBenchPress`
1497 -- `HugeIcons.strokeRoundedEquipmentChestPress`
1498 -- `HugeIcons.strokeRoundedEquipmentGym01`
1499 -- `HugeIcons.strokeRoundedEquipmentGym02`
1500 -- `HugeIcons.strokeRoundedEquipmentGym03`
1501 -- `HugeIcons.strokeRoundedEquipmentWeightlifting`
1502 -- `HugeIcons.strokeRoundedEraser01`
1503 -- `HugeIcons.strokeRoundedEraserAdd`
1504 -- `HugeIcons.strokeRoundedEraserAuto`
1505 -- `HugeIcons.strokeRoundedEraser`
1506 -- `HugeIcons.strokeRoundedEstimate01`
1507 -- `HugeIcons.strokeRoundedEstimate02`
1508 -- `HugeIcons.strokeRoundedEthereumEllipse`
1509 -- `HugeIcons.strokeRoundedEthereumRectangle`
1510 -- `HugeIcons.strokeRoundedEthereum`
1511 -- `HugeIcons.strokeRoundedEuroCircle`
1512 -- `HugeIcons.strokeRoundedEuroReceive`
1513 -- `HugeIcons.strokeRoundedEuroSend`
1514 -- `HugeIcons.strokeRoundedEuroSquare`
1515 -- `HugeIcons.strokeRoundedEuro`
1516 -- `HugeIcons.strokeRoundedEvCharging`
1517 -- `HugeIcons.strokeRoundedEvil`
1518 -- `HugeIcons.strokeRoundedExchange01`
1519 -- `HugeIcons.strokeRoundedExchange02`
1520 -- `HugeIcons.strokeRoundedExchange03`
1521 -- `HugeIcons.strokeRoundedExpander`
1522 -- `HugeIcons.strokeRoundedExternalDrive`
1523 -- `HugeIcons.strokeRoundedEye`
1524 -- `HugeIcons.strokeRoundedFaceId`
1525 -- `HugeIcons.strokeRoundedFacebook01`
1526 -- `HugeIcons.strokeRoundedFacebook02`
1527 -- `HugeIcons.strokeRoundedFactory01`
1528 -- `HugeIcons.strokeRoundedFactory02`
1529 -- `HugeIcons.strokeRoundedFactory`
1530 -- `HugeIcons.strokeRoundedFahrenheit`
1531 -- `HugeIcons.strokeRoundedFallingStar`
1532 -- `HugeIcons.strokeRoundedFan01`
1533 -- `HugeIcons.strokeRoundedFan02`
1534 -- `HugeIcons.strokeRoundedFastWind`
1535 -- `HugeIcons.strokeRoundedFavouriteCircle`
1536 -- `HugeIcons.strokeRoundedFavouriteSquare`
1537 -- `HugeIcons.strokeRoundedFavourite`
1538 -- `HugeIcons.strokeRoundedFeather`
1539 -- `HugeIcons.strokeRoundedFemale02`
1540 -- `HugeIcons.strokeRoundedFemaleSymbol`
1541 -- `HugeIcons.strokeRoundedFencingMask`
1542 -- `HugeIcons.strokeRoundedFencing`
1543 -- `HugeIcons.strokeRoundedFerrisWheel`
1544 -- `HugeIcons.strokeRoundedFerryBoat`
1545 -- `HugeIcons.strokeRoundedFigma`
1546 -- `HugeIcons.strokeRoundedFile01`
1547 -- `HugeIcons.strokeRoundedFile02`
1548 -- `HugeIcons.strokeRoundedFileAdd`
1549 -- `HugeIcons.strokeRoundedFileAttachment`
1550 -- `HugeIcons.strokeRoundedFileAudio`
1551 -- `HugeIcons.strokeRoundedFileBitcoin`
1552 -- `HugeIcons.strokeRoundedFileBlock`
1553 -- `HugeIcons.strokeRoundedFileBookmark`
1554 -- `HugeIcons.strokeRoundedFileCloud`
1555 -- `HugeIcons.strokeRoundedFileCorrupt`
1556 -- `HugeIcons.strokeRoundedFileDollar`
1557 -- `HugeIcons.strokeRoundedFileDownload`
1558 -- `HugeIcons.strokeRoundedFileEdit`
1559 -- `HugeIcons.strokeRoundedFileEmpty01`
1560 -- `HugeIcons.strokeRoundedFileEmpty02`
1561 -- `HugeIcons.strokeRoundedFileEuro`
1562 -- `HugeIcons.strokeRoundedFileExport`
1563 -- `HugeIcons.strokeRoundedFileFavourite`
1564 -- `HugeIcons.strokeRoundedFileImport`
1565 -- `HugeIcons.strokeRoundedFileLink`
1566 -- `HugeIcons.strokeRoundedFileLocked`
1567 -- `HugeIcons.strokeRoundedFileManagement`
1568 -- `HugeIcons.strokeRoundedFileMinus`
1569 -- `HugeIcons.strokeRoundedFileMusic`
1570 -- `HugeIcons.strokeRoundedFileNotFound`
1571 -- `HugeIcons.strokeRoundedFilePaste`
1572 -- `HugeIcons.strokeRoundedFilePin`
1573 -- `HugeIcons.strokeRoundedFilePound`
1574 -- `HugeIcons.strokeRoundedFileRemove`
1575 -- `HugeIcons.strokeRoundedFileScript`
1576 -- `HugeIcons.strokeRoundedFileSearch`
1577 -- `HugeIcons.strokeRoundedFileSecurity`
1578 -- `HugeIcons.strokeRoundedFileShredder`
1579 -- `HugeIcons.strokeRoundedFileStar`
1580 -- `HugeIcons.strokeRoundedFileSync`
1581 -- `HugeIcons.strokeRoundedFileUnknown`
1582 -- `HugeIcons.strokeRoundedFileUnlocked`
1583 -- `HugeIcons.strokeRoundedFileUpload`
1584 -- `HugeIcons.strokeRoundedFileValidation`
1585 -- `HugeIcons.strokeRoundedFileVerified`
1586 -- `HugeIcons.strokeRoundedFileVideo`
1587 -- `HugeIcons.strokeRoundedFileView`
1588 -- `HugeIcons.strokeRoundedFileYen`
1589 -- `HugeIcons.strokeRoundedFileZip`
1590 -- `HugeIcons.strokeRoundedFiles01`
1591 -- `HugeIcons.strokeRoundedFiles02`
1592 -- `HugeIcons.strokeRoundedFilm01`
1593 -- `HugeIcons.strokeRoundedFilm02`
1594 -- `HugeIcons.strokeRoundedFilmRoll01`
1595 -- `HugeIcons.strokeRoundedFilmRoll02`
1596 -- `HugeIcons.strokeRoundedFilterAdd`
1597 -- `HugeIcons.strokeRoundedFilterEdit`
1598 -- `HugeIcons.strokeRoundedFilterHorizontal`
1599 -- `HugeIcons.strokeRoundedFilterMailCircle`
1600 -- `HugeIcons.strokeRoundedFilterMailSquare`
1601 -- `HugeIcons.strokeRoundedFilterRemove`
1602 -- `HugeIcons.strokeRoundedFilterReset`
1603 -- `HugeIcons.strokeRoundedFilter`
1604 -- `HugeIcons.strokeRoundedFilterVertical`
1605 -- `HugeIcons.strokeRoundedFingerAccess`
1606 -- `HugeIcons.strokeRoundedFingerPrintAdd`
1607 -- `HugeIcons.strokeRoundedFingerPrintCheck`
1608 -- `HugeIcons.strokeRoundedFingerPrintMinus`
1609 -- `HugeIcons.strokeRoundedFingerPrintRemove`
1610 -- `HugeIcons.strokeRoundedFingerPrintScan`
1611 -- `HugeIcons.strokeRoundedFingerPrint`
1612 -- `HugeIcons.strokeRoundedFingerprintScan`
1613 -- `HugeIcons.strokeRoundedFins`
1614 -- `HugeIcons.strokeRoundedFire02`
1615 -- `HugeIcons.strokeRoundedFire03`
1616 -- `HugeIcons.strokeRoundedFirePit`
1617 -- `HugeIcons.strokeRoundedFireSecurity`
1618 -- `HugeIcons.strokeRoundedFire`
1619 -- `HugeIcons.strokeRoundedFirewall`
1620 -- `HugeIcons.strokeRoundedFireworks`
1621 -- `HugeIcons.strokeRoundedFirstAidKit`
1622 -- `HugeIcons.strokeRoundedFishFood`
1623 -- `HugeIcons.strokeRoundedFitToScreen`
1624 -- `HugeIcons.strokeRoundedFiveCircle`
1625 -- `HugeIcons.strokeRoundedFiveSquare`
1626 -- `HugeIcons.strokeRoundedFiverr`
1627 -- `HugeIcons.strokeRoundedFlag01`
1628 -- `HugeIcons.strokeRoundedFlag02`
1629 -- `HugeIcons.strokeRoundedFlag03`
1630 -- `HugeIcons.strokeRoundedFlashOff`
1631 -- `HugeIcons.strokeRoundedFlash`
1632 -- `HugeIcons.strokeRoundedFlashlight`
1633 -- `HugeIcons.strokeRoundedFlaticon`
1634 -- `HugeIcons.strokeRoundedFlickr`
1635 -- `HugeIcons.strokeRoundedFlimSlate`
1636 -- `HugeIcons.strokeRoundedFlipBottom`
1637 -- `HugeIcons.strokeRoundedFlipHorizontal`
1638 -- `HugeIcons.strokeRoundedFlipLeft`
1639 -- `HugeIcons.strokeRoundedFlipPhone`
1640 -- `HugeIcons.strokeRoundedFlipRight`
1641 -- `HugeIcons.strokeRoundedFlipTop`
1642 -- `HugeIcons.strokeRoundedFlipVertical`
1643 -- `HugeIcons.strokeRoundedFloorPlan`
1644 -- `HugeIcons.strokeRoundedFloppyDisk`
1645 -- `HugeIcons.strokeRoundedFlowCircle`
1646 -- `HugeIcons.strokeRoundedFlowConnection`
1647 -- `HugeIcons.strokeRoundedFlowSquare`
1648 -- `HugeIcons.strokeRoundedFlow`
1649 -- `HugeIcons.strokeRoundedFlowchart01`
1650 -- `HugeIcons.strokeRoundedFlowchart02`
1651 -- `HugeIcons.strokeRoundedFlowerPot`
1652 -- `HugeIcons.strokeRoundedFlower`
1653 -- `HugeIcons.strokeRoundedFlushed`
1654 -- `HugeIcons.strokeRoundedFlyingHuman`
1655 -- `HugeIcons.strokeRoundedFocusPoint`
1656 -- `HugeIcons.strokeRoundedFolder01`
1657 -- `HugeIcons.strokeRoundedFolder02`
1658 -- `HugeIcons.strokeRoundedFolder03`
1659 -- `HugeIcons.strokeRoundedFolderAdd`
1660 -- `HugeIcons.strokeRoundedFolderAttachment`
1661 -- `HugeIcons.strokeRoundedFolderAudio`
1662 -- `HugeIcons.strokeRoundedFolderBlock`
1663 -- `HugeIcons.strokeRoundedFolderCheck`
1664 -- `HugeIcons.strokeRoundedFolderCloud`
1665 -- `HugeIcons.strokeRoundedFolderDetailsReference`
1666 -- `HugeIcons.strokeRoundedFolderDetails`
1667 -- `HugeIcons.strokeRoundedFolderDownload`
1668 -- `HugeIcons.strokeRoundedFolderEdit`
1669 -- `HugeIcons.strokeRoundedFolderExport`
1670 -- `HugeIcons.strokeRoundedFolderFavourite`
1671 -- `HugeIcons.strokeRoundedFolderFileStorage`
1672 -- `HugeIcons.strokeRoundedFolderImport`
1673 -- `HugeIcons.strokeRoundedFolderLibrary`
1674 -- `HugeIcons.strokeRoundedFolderLinks`
1675 -- `HugeIcons.strokeRoundedFolderLocked`
1676 -- `HugeIcons.strokeRoundedFolderManagement`
1677 -- `HugeIcons.strokeRoundedFolderMinus`
1678 -- `HugeIcons.strokeRoundedFolderMoveIn`
1679 -- `HugeIcons.strokeRoundedFolderMoveTo`
1680 -- `HugeIcons.strokeRoundedFolderMusic`
1681 -- `HugeIcons.strokeRoundedFolderOff`
1682 -- `HugeIcons.strokeRoundedFolderOpen`
1683 -- `HugeIcons.strokeRoundedFolderPin`
1684 -- `HugeIcons.strokeRoundedFolderRemove`
1685 -- `HugeIcons.strokeRoundedFolderSearch`
1686 -- `HugeIcons.strokeRoundedFolderSecurity`
1687 -- `HugeIcons.strokeRoundedFolderShared01`
1688 -- `HugeIcons.strokeRoundedFolderShared02`
1689 -- `HugeIcons.strokeRoundedFolderShared03`
1690 -- `HugeIcons.strokeRoundedFolderSync`
1691 -- `HugeIcons.strokeRoundedFolderTransfer`
1692 -- `HugeIcons.strokeRoundedFolderUnknown`
1693 -- `HugeIcons.strokeRoundedFolderUnlocked`
1694 -- `HugeIcons.strokeRoundedFolderUpload`
1695 -- `HugeIcons.strokeRoundedFolderVideo`
1696 -- `HugeIcons.strokeRoundedFolderView`
1697 -- `HugeIcons.strokeRoundedFolderZip`
1698 -- `HugeIcons.strokeRoundedFolders`
1699 -- `HugeIcons.strokeRoundedFootballPitch`
1700 -- `HugeIcons.strokeRoundedFootball`
1701 -- `HugeIcons.strokeRoundedForgotPassword`
1702 -- `HugeIcons.strokeRoundedFork`
1703 -- `HugeIcons.strokeRoundedForrst`
1704 -- `HugeIcons.strokeRoundedFortress`
1705 -- `HugeIcons.strokeRoundedForward01`
1706 -- `HugeIcons.strokeRoundedForward02`
1707 -- `HugeIcons.strokeRoundedFourCircle`
1708 -- `HugeIcons.strokeRoundedFourFinger02`
1709 -- `HugeIcons.strokeRoundedFourFinger03`
1710 -- `HugeIcons.strokeRoundedFourSquare`
1711 -- `HugeIcons.strokeRoundedFoursquare`
1712 -- `HugeIcons.strokeRoundedFramer`
1713 -- `HugeIcons.strokeRoundedFrameworks`
1714 -- `HugeIcons.strokeRoundedFrenchFries01`
1715 -- `HugeIcons.strokeRoundedFrenchFries02`
1716 -- `HugeIcons.strokeRoundedFridge`
1717 -- `HugeIcons.strokeRoundedFrisbee`
1718 -- `HugeIcons.strokeRoundedFry`
1719 -- `HugeIcons.strokeRoundedFuel01`
1720 -- `HugeIcons.strokeRoundedFuel02`
1721 -- `HugeIcons.strokeRoundedFuelStation`
1722 -- `HugeIcons.strokeRoundedFuel`
1723 -- `HugeIcons.strokeRoundedFullScreen`
1724 -- `HugeIcons.strokeRoundedFullSignal`
1725 -- `HugeIcons.strokeRoundedFunctionCircle`
1726 -- `HugeIcons.strokeRoundedFunctionOfX`
1727 -- `HugeIcons.strokeRoundedFunctionSquare`
1728 -- `HugeIcons.strokeRoundedFunction`
1729 -- `HugeIcons.strokeRoundedGalaxy`
1730 -- `HugeIcons.strokeRoundedGameController01`
1731 -- `HugeIcons.strokeRoundedGameController02`
1732 -- `HugeIcons.strokeRoundedGameController03`
1733 -- `HugeIcons.strokeRoundedGame`
1734 -- `HugeIcons.strokeRoundedGameboy`
1735 -- `HugeIcons.strokeRoundedGarage`
1736 -- `HugeIcons.strokeRoundedGarbageTruck`
1737 -- `HugeIcons.strokeRoundedGarlands`
1738 -- `HugeIcons.strokeRoundedGasPipe`
1739 -- `HugeIcons.strokeRoundedGasStove`
1740 -- `HugeIcons.strokeRoundedGears`
1741 -- `HugeIcons.strokeRoundedGem`
1742 -- `HugeIcons.strokeRoundedGeologyCrust`
1743 -- `HugeIcons.strokeRoundedGeometricShapes01`
1744 -- `HugeIcons.strokeRoundedGeometricShapes02`
1745 -- `HugeIcons.strokeRoundedGibbousMoon`
1746 -- `HugeIcons.strokeRoundedGif01`
1747 -- `HugeIcons.strokeRoundedGif02`
1748 -- `HugeIcons.strokeRoundedGiftCard02`
1749 -- `HugeIcons.strokeRoundedGiftCard`
1750 -- `HugeIcons.strokeRoundedGift`
1751 -- `HugeIcons.strokeRoundedGitBranch`
1752 -- `HugeIcons.strokeRoundedGitCommit`
1753 -- `HugeIcons.strokeRoundedGitCompare`
1754 -- `HugeIcons.strokeRoundedGitFork`
1755 -- `HugeIcons.strokeRoundedGitMerge`
1756 -- `HugeIcons.strokeRoundedGitPullRequestClosed`
1757 -- `HugeIcons.strokeRoundedGitPullRequestDraft`
1758 -- `HugeIcons.strokeRoundedGitPullRequest`
1759 -- `HugeIcons.strokeRoundedGitbook`
1760 -- `HugeIcons.strokeRoundedGithub01`
1761 -- `HugeIcons.strokeRoundedGithub`
1762 -- `HugeIcons.strokeRoundedGitlab`
1763 -- `HugeIcons.strokeRoundedGiveBlood`
1764 -- `HugeIcons.strokeRoundedGivePill`
1765 -- `HugeIcons.strokeRoundedGlasses`
1766 -- `HugeIcons.strokeRoundedGlobalEditing`
1767 -- `HugeIcons.strokeRoundedGlobalEducation`
1768 -- `HugeIcons.strokeRoundedGlobalRefresh`
1769 -- `HugeIcons.strokeRoundedGlobalSearch`
1770 -- `HugeIcons.strokeRoundedGlobal`
1771 -- `HugeIcons.strokeRoundedGlobe02`
1772 -- `HugeIcons.strokeRoundedGlobe`
1773 -- `HugeIcons.strokeRoundedGlove`
1774 -- `HugeIcons.strokeRoundedGnome`
1775 -- `HugeIcons.strokeRoundedGoBackward10Sec`
1776 -- `HugeIcons.strokeRoundedGoBackward15Sec`
1777 -- `HugeIcons.strokeRoundedGoBackward30Sec`
1778 -- `HugeIcons.strokeRoundedGoBackward5Sec`
1779 -- `HugeIcons.strokeRoundedGoBackward60Sec`
1780 -- `HugeIcons.strokeRoundedGoForward10Sec`
1781 -- `HugeIcons.strokeRoundedGoForward15Sec`
1782 -- `HugeIcons.strokeRoundedGoForward30Sec`
1783 -- `HugeIcons.strokeRoundedGoForward5Sec`
1784 -- `HugeIcons.strokeRoundedGoForward60Sec`
1785 -- `HugeIcons.strokeRoundedGoldIngots`
1786 -- `HugeIcons.strokeRoundedGold`
1787 -- `HugeIcons.strokeRoundedGolfBall`
1788 -- `HugeIcons.strokeRoundedGolfBat`
1789 -- `HugeIcons.strokeRoundedGolfCart`
1790 -- `HugeIcons.strokeRoundedGolfHole`
1791 -- `HugeIcons.strokeRoundedGoogleDoc`
1792 -- `HugeIcons.strokeRoundedGoogleDrive`
1793 -- `HugeIcons.strokeRoundedGoogleGemini`
1794 -- `HugeIcons.strokeRoundedGoogleHome`
1795 -- `HugeIcons.strokeRoundedGoogleLens`
1796 -- `HugeIcons.strokeRoundedGoogleMaps`
1797 -- `HugeIcons.strokeRoundedGooglePhotos`
1798 -- `HugeIcons.strokeRoundedGoogleSheet`
1799 -- `HugeIcons.strokeRoundedGoogle`
1800 -- `HugeIcons.strokeRoundedGps01`
1801 -- `HugeIcons.strokeRoundedGps02`
1802 -- `HugeIcons.strokeRoundedGpsDisconnected`
1803 -- `HugeIcons.strokeRoundedGpsOff01`
1804 -- `HugeIcons.strokeRoundedGpsOff02`
1805 -- `HugeIcons.strokeRoundedGpsSignal01`
1806 -- `HugeIcons.strokeRoundedGpsSignal02`
1807 -- `HugeIcons.strokeRoundedGpu`
1808 -- `HugeIcons.strokeRoundedGraduateFemale`
1809 -- `HugeIcons.strokeRoundedGraduateMale`
1810 -- `HugeIcons.strokeRoundedGraduationScroll`
1811 -- `HugeIcons.strokeRoundedGrapes`
1812 -- `HugeIcons.strokeRoundedGravity`
1813 -- `HugeIcons.strokeRoundedGreaterThanCircle`
1814 -- `HugeIcons.strokeRoundedGreaterThanSquare`
1815 -- `HugeIcons.strokeRoundedGreaterThan`
1816 -- `HugeIcons.strokeRoundedGreekHelmet`
1817 -- `HugeIcons.strokeRoundedGreenHouse`
1818 -- `HugeIcons.strokeRoundedGrid02`
1819 -- `HugeIcons.strokeRoundedGridOff`
1820 -- `HugeIcons.strokeRoundedGrid`
1821 -- `HugeIcons.strokeRoundedGridTable`
1822 -- `HugeIcons.strokeRoundedGridView`
1823 -- `HugeIcons.strokeRoundedGrimacing`
1824 -- `HugeIcons.strokeRoundedGrinning`
1825 -- `HugeIcons.strokeRoundedGrok02`
1826 -- `HugeIcons.strokeRoundedGrok`
1827 -- `HugeIcons.strokeRoundedGroup01`
1828 -- `HugeIcons.strokeRoundedGroupItems`
1829 -- `HugeIcons.strokeRoundedGroupLayers`
1830 -- `HugeIcons.strokeRoundedGuestHouse`
1831 -- `HugeIcons.strokeRoundedGun`
1832 -- `HugeIcons.strokeRoundedGymnasticRings`
1833 -- `HugeIcons.strokeRoundedGymnastic`
1834 -- `HugeIcons.strokeRoundedHackerrank`
1835 -- `HugeIcons.strokeRoundedHairClips`
1836 -- `HugeIcons.strokeRoundedHairDryer`
1837 -- `HugeIcons.strokeRoundedHaji`
1838 -- `HugeIcons.strokeRoundedHalalLab`
1839 -- `HugeIcons.strokeRoundedHalal`
1840 -- `HugeIcons.strokeRoundedHamburger01`
1841 -- `HugeIcons.strokeRoundedHamburger02`
1842 -- `HugeIcons.strokeRoundedHandBag01`
1843 -- `HugeIcons.strokeRoundedHandBag02`
1844 -- `HugeIcons.strokeRoundedHandBeater`
1845 -- `HugeIcons.strokeRoundedHandGrip`
1846 -- `HugeIcons.strokeRoundedHandPointingDown01`
1847 -- `HugeIcons.strokeRoundedHandPointingDown02`
1848 -- `HugeIcons.strokeRoundedHandPointingDown03`
1849 -- `HugeIcons.strokeRoundedHandPointingDown04`
1850 -- `HugeIcons.strokeRoundedHandPointingLeft01`
1851 -- `HugeIcons.strokeRoundedHandPointingLeft02`
1852 -- `HugeIcons.strokeRoundedHandPointingLeft03`
1853 -- `HugeIcons.strokeRoundedHandPointingLeft04`
1854 -- `HugeIcons.strokeRoundedHandPointingRight01`
1855 -- `HugeIcons.strokeRoundedHandPointingRight02`
1856 -- `HugeIcons.strokeRoundedHandPointingRight03`
1857 -- `HugeIcons.strokeRoundedHandPointingRight04`
1858 -- `HugeIcons.strokeRoundedHandPrayer`
1859 -- `HugeIcons.strokeRoundedHandSanitizer`
1860 -- `HugeIcons.strokeRoundedHandcuffs`
1861 -- `HugeIcons.strokeRoundedHanger`
1862 -- `HugeIcons.strokeRoundedHangingClock`
1863 -- `HugeIcons.strokeRoundedHangout`
1864 -- `HugeIcons.strokeRoundedHappy01`
1865 -- `HugeIcons.strokeRoundedHappy`
1866 -- `HugeIcons.strokeRoundedHardDrive`
1867 -- `HugeIcons.strokeRoundedHat`
1868 -- `HugeIcons.strokeRoundedHdd`
1869 -- `HugeIcons.strokeRoundedHdr01`
1870 -- `HugeIcons.strokeRoundedHdr02`
1871 -- `HugeIcons.strokeRoundedHeading01`
1872 -- `HugeIcons.strokeRoundedHeading02`
1873 -- `HugeIcons.strokeRoundedHeading03`
1874 -- `HugeIcons.strokeRoundedHeading04`
1875 -- `HugeIcons.strokeRoundedHeading05`
1876 -- `HugeIcons.strokeRoundedHeading06`
1877 -- `HugeIcons.strokeRoundedHeading`
1878 -- `HugeIcons.strokeRoundedHeadphoneMute`
1879 -- `HugeIcons.strokeRoundedHeadphones`
1880 -- `HugeIcons.strokeRoundedHeadsetConnected`
1881 -- `HugeIcons.strokeRoundedHeadsetOff`
1882 -- `HugeIcons.strokeRoundedHeadset`
1883 -- `HugeIcons.strokeRoundedHealtcare`
1884 -- `HugeIcons.strokeRoundedHealth`
1885 -- `HugeIcons.strokeRoundedHeartAdd`
1886 -- `HugeIcons.strokeRoundedHeartCheck`
1887 -- `HugeIcons.strokeRoundedHeartRemove`
1888 -- `HugeIcons.strokeRoundedHeartbreak`
1889 -- `HugeIcons.strokeRoundedHelicopter`
1890 -- `HugeIcons.strokeRoundedHelpCircle`
1891 -- `HugeIcons.strokeRoundedHelpSquare`
1892 -- `HugeIcons.strokeRoundedHexagon01`
1893 -- `HugeIcons.strokeRoundedHexagon`
1894 -- `HugeIcons.strokeRoundedHierarchyCircle01`
1895 -- `HugeIcons.strokeRoundedHierarchyCircle02`
1896 -- `HugeIcons.strokeRoundedHierarchyCircle03`
1897 -- `HugeIcons.strokeRoundedHierarchyFiles`
1898 -- `HugeIcons.strokeRoundedHierarchySquare01`
1899 -- `HugeIcons.strokeRoundedHierarchySquare02`
1900 -- `HugeIcons.strokeRoundedHierarchySquare03`
1901 -- `HugeIcons.strokeRoundedHierarchySquare04`
1902 -- `HugeIcons.strokeRoundedHierarchySquare05`
1903 -- `HugeIcons.strokeRoundedHierarchySquare06`
1904 -- `HugeIcons.strokeRoundedHierarchySquare07`
1905 -- `HugeIcons.strokeRoundedHierarchySquare08`
1906 -- `HugeIcons.strokeRoundedHierarchySquare10`
1907 -- `HugeIcons.strokeRoundedHierarchy`
1908 -- `HugeIcons.strokeRoundedHighHeels01`
1909 -- `HugeIcons.strokeRoundedHighHeels02`
1910 -- `HugeIcons.strokeRoundedHighlighter`
1911 -- `HugeIcons.strokeRoundedHijab`
1912 -- `HugeIcons.strokeRoundedHockey`
1913 -- `HugeIcons.strokeRoundedHold01`
1914 -- `HugeIcons.strokeRoundedHold02`
1915 -- `HugeIcons.strokeRoundedHold03`
1916 -- `HugeIcons.strokeRoundedHold04`
1917 -- `HugeIcons.strokeRoundedHold05`
1918 -- `HugeIcons.strokeRoundedHoldLocked01`
1919 -- `HugeIcons.strokeRoundedHoldLocked02`
1920 -- `HugeIcons.strokeRoundedHoldPhone`
1921 -- `HugeIcons.strokeRoundedHologram`
1922 -- `HugeIcons.strokeRoundedHome01`
1923 -- `HugeIcons.strokeRoundedHome02`
1924 -- `HugeIcons.strokeRoundedHome03`
1925 -- `HugeIcons.strokeRoundedHome04`
1926 -- `HugeIcons.strokeRoundedHome05`
1927 -- `HugeIcons.strokeRoundedHome06`
1928 -- `HugeIcons.strokeRoundedHome07`
1929 -- `HugeIcons.strokeRoundedHome08`
1930 -- `HugeIcons.strokeRoundedHome09`
1931 -- `HugeIcons.strokeRoundedHome10`
1932 -- `HugeIcons.strokeRoundedHome11`
1933 -- `HugeIcons.strokeRoundedHome12`
1934 -- `HugeIcons.strokeRoundedHome13`
1935 -- `HugeIcons.strokeRoundedHomeWifi`
1936 -- `HugeIcons.strokeRoundedHoney01`
1937 -- `HugeIcons.strokeRoundedHoney02`
1938 -- `HugeIcons.strokeRoundedHonor`
1939 -- `HugeIcons.strokeRoundedHonourStar`
1940 -- `HugeIcons.strokeRoundedHoodie`
1941 -- `HugeIcons.strokeRoundedHorizonalScrollPoint`
1942 -- `HugeIcons.strokeRoundedHorizontalResize`
1943 -- `HugeIcons.strokeRoundedHorseHead`
1944 -- `HugeIcons.strokeRoundedHorseSaddle`
1945 -- `HugeIcons.strokeRoundedHorse`
1946 -- `HugeIcons.strokeRoundedHospital01`
1947 -- `HugeIcons.strokeRoundedHospital02`
1948 -- `HugeIcons.strokeRoundedHospitalBed01`
1949 -- `HugeIcons.strokeRoundedHospitalBed02`
1950 -- `HugeIcons.strokeRoundedHospitalLocation`
1951 -- `HugeIcons.strokeRoundedHotAirBalloon`
1952 -- `HugeIcons.strokeRoundedHotPrice`
1953 -- `HugeIcons.strokeRoundedHotTube`
1954 -- `HugeIcons.strokeRoundedHotdog`
1955 -- `HugeIcons.strokeRoundedHotel01`
1956 -- `HugeIcons.strokeRoundedHotel02`
1957 -- `HugeIcons.strokeRoundedHotelBell`
1958 -- `HugeIcons.strokeRoundedHotspotOffline`
1959 -- `HugeIcons.strokeRoundedHotspot`
1960 -- `HugeIcons.strokeRoundedHourglassOff`
1961 -- `HugeIcons.strokeRoundedHourglass`
1962 -- `HugeIcons.strokeRoundedHouse01`
1963 -- `HugeIcons.strokeRoundedHouse02`
1964 -- `HugeIcons.strokeRoundedHouse03`
1965 -- `HugeIcons.strokeRoundedHouse04`
1966 -- `HugeIcons.strokeRoundedHouse05`
1967 -- `HugeIcons.strokeRoundedHouseSolarPanel`
1968 -- `HugeIcons.strokeRoundedHtml5`
1969 -- `HugeIcons.strokeRoundedHtmlFile01`
1970 -- `HugeIcons.strokeRoundedHtmlFile02`
1971 -- `HugeIcons.strokeRoundedHugeicons`
1972 -- `HugeIcons.strokeRoundedHumidity`
1973 -- `HugeIcons.strokeRoundedHut`
1974 -- `HugeIcons.strokeRoundedHydroPower`
1975 -- `HugeIcons.strokeRoundedHyperbole`
1976 -- `HugeIcons.strokeRoundedIceCream01`
1977 -- `HugeIcons.strokeRoundedIceCream02`
1978 -- `HugeIcons.strokeRoundedIceCream03`
1979 -- `HugeIcons.strokeRoundedIceCream04`
1980 -- `HugeIcons.strokeRoundedIceCubes`
1981 -- `HugeIcons.strokeRoundedIceHockey`
1982 -- `HugeIcons.strokeRoundedIceSkating`
1983 -- `HugeIcons.strokeRoundedIco`
1984 -- `HugeIcons.strokeRoundedIconjar`
1985 -- `HugeIcons.strokeRoundedIdNotVerified`
1986 -- `HugeIcons.strokeRoundedId`
1987 -- `HugeIcons.strokeRoundedIdVerified`
1988 -- `HugeIcons.strokeRoundedIdea01`
1989 -- `HugeIcons.strokeRoundedIdea`
1990 -- `HugeIcons.strokeRoundedIdentification`
1991 -- `HugeIcons.strokeRoundedIdentityCard`
1992 -- `HugeIcons.strokeRoundedImage01`
1993 -- `HugeIcons.strokeRoundedImage02`
1994 -- `HugeIcons.strokeRoundedImage03`
1995 -- `HugeIcons.strokeRoundedImageActualSize`
1996 -- `HugeIcons.strokeRoundedImageAdd01`
1997 -- `HugeIcons.strokeRoundedImageAdd02`
1998 -- `HugeIcons.strokeRoundedImageCompositionOval`
1999 -- `HugeIcons.strokeRoundedImageComposition`
2000 -- `HugeIcons.strokeRoundedImageCounterClockwise`
2001 -- `HugeIcons.strokeRoundedImageCrop`
2002 -- `HugeIcons.strokeRoundedImageDelete01`
2003 -- `HugeIcons.strokeRoundedImageDelete02`
2004 -- `HugeIcons.strokeRoundedImageDone01`
2005 -- `HugeIcons.strokeRoundedImageDone02`
2006 -- `HugeIcons.strokeRoundedImageDownload02`
2007 -- `HugeIcons.strokeRoundedImageDownload`
2008 -- `HugeIcons.strokeRoundedImageFlipHorizontal`
2009 -- `HugeIcons.strokeRoundedImageFlipVertical`
2010 -- `HugeIcons.strokeRoundedImageNotFound01`
2011 -- `HugeIcons.strokeRoundedImageNotFound02`
2012 -- `HugeIcons.strokeRoundedImageRemove01`
2013 -- `HugeIcons.strokeRoundedImageRemove02`
2014 -- `HugeIcons.strokeRoundedImageRotationClockwise`
2015 -- `HugeIcons.strokeRoundedImageUpload01`
2016 -- `HugeIcons.strokeRoundedImageUpload`
2017 -- `HugeIcons.strokeRoundedImo`
2018 -- `HugeIcons.strokeRoundedImportantBook`
2019 -- `HugeIcons.strokeRoundedInLove`
2020 -- `HugeIcons.strokeRoundedInboxCheck`
2021 -- `HugeIcons.strokeRoundedInboxDownload`
2022 -- `HugeIcons.strokeRoundedInbox`
2023 -- `HugeIcons.strokeRoundedInboxUnread`
2024 -- `HugeIcons.strokeRoundedInboxUpload`
2025 -- `HugeIcons.strokeRoundedIncognito`
2026 -- `HugeIcons.strokeRoundedIndiaGate`
2027 -- `HugeIcons.strokeRoundedInequality01`
2028 -- `HugeIcons.strokeRoundedInequality02`
2029 -- `HugeIcons.strokeRoundedInequalityCircle01`
2030 -- `HugeIcons.strokeRoundedInequalityCircle02`
2031 -- `HugeIcons.strokeRoundedInequalitySquare01`
2032 -- `HugeIcons.strokeRoundedInequalitySquare02`
2033 -- `HugeIcons.strokeRoundedInfant`
2034 -- `HugeIcons.strokeRoundedInfinity01`
2035 -- `HugeIcons.strokeRoundedInfinity02`
2036 -- `HugeIcons.strokeRoundedInfinityCircle`
2037 -- `HugeIcons.strokeRoundedInfinitySquare`
2038 -- `HugeIcons.strokeRoundedInformationCircle`
2039 -- `HugeIcons.strokeRoundedInformationDiamond`
2040 -- `HugeIcons.strokeRoundedInformationSquare`
2041 -- `HugeIcons.strokeRoundedInjection`
2042 -- `HugeIcons.strokeRoundedInsertBottomImage`
2043 -- `HugeIcons.strokeRoundedInsertCenterImage`
2044 -- `HugeIcons.strokeRoundedInsertColumnLeft`
2045 -- `HugeIcons.strokeRoundedInsertColumnRight`
2046 -- `HugeIcons.strokeRoundedInsertColumn`
2047 -- `HugeIcons.strokeRoundedInsertPi`
2048 -- `HugeIcons.strokeRoundedInsertRowDown`
2049 -- `HugeIcons.strokeRoundedInsertRow`
2050 -- `HugeIcons.strokeRoundedInsertRowUp`
2051 -- `HugeIcons.strokeRoundedInsertTopImage`
2052 -- `HugeIcons.strokeRoundedInspectCode`
2053 -- `HugeIcons.strokeRoundedInstagram`
2054 -- `HugeIcons.strokeRoundedInstallingUpdates01`
2055 -- `HugeIcons.strokeRoundedInstallingUpdates02`
2056 -- `HugeIcons.strokeRoundedInternetAntenna01`
2057 -- `HugeIcons.strokeRoundedInternetAntenna02`
2058 -- `HugeIcons.strokeRoundedInternetAntenna03`
2059 -- `HugeIcons.strokeRoundedInternetAntenna04`
2060 -- `HugeIcons.strokeRoundedInternet`
2061 -- `HugeIcons.strokeRoundedInvestigation`
2062 -- `HugeIcons.strokeRoundedInvoice01`
2063 -- `HugeIcons.strokeRoundedInvoice02`
2064 -- `HugeIcons.strokeRoundedInvoice03`
2065 -- `HugeIcons.strokeRoundedInvoice04`
2066 -- `HugeIcons.strokeRoundedInvoice`
2067 -- `HugeIcons.strokeRoundedIpod`
2068 -- `HugeIcons.strokeRoundedIrisScan`
2069 -- `HugeIcons.strokeRoundedIsland`
2070 -- `HugeIcons.strokeRoundedJar`
2071 -- `HugeIcons.strokeRoundedJavaScript`
2072 -- `HugeIcons.strokeRoundedJava`
2073 -- `HugeIcons.strokeRoundedJobLink`
2074 -- `HugeIcons.strokeRoundedJobSearch`
2075 -- `HugeIcons.strokeRoundedJobShare`
2076 -- `HugeIcons.strokeRoundedJoggerPants`
2077 -- `HugeIcons.strokeRoundedJoinBevel`
2078 -- `HugeIcons.strokeRoundedJoinRound`
2079 -- `HugeIcons.strokeRoundedJoinStraight`
2080 -- `HugeIcons.strokeRoundedJoker`
2081 -- `HugeIcons.strokeRoundedJoystick01`
2082 -- `HugeIcons.strokeRoundedJoystick02`
2083 -- `HugeIcons.strokeRoundedJoystick03`
2084 -- `HugeIcons.strokeRoundedJoystick04`
2085 -- `HugeIcons.strokeRoundedJoystick05`
2086 -- `HugeIcons.strokeRoundedJpg01`
2087 -- `HugeIcons.strokeRoundedJpg02`
2088 -- `HugeIcons.strokeRoundedJsx01`
2089 -- `HugeIcons.strokeRoundedJsx02`
2090 -- `HugeIcons.strokeRoundedJsx03`
2091 -- `HugeIcons.strokeRoundedJudge`
2092 -- `HugeIcons.strokeRoundedJumpers`
2093 -- `HugeIcons.strokeRoundedJupiter`
2094 -- `HugeIcons.strokeRoundedJusticeScale01`
2095 -- `HugeIcons.strokeRoundedJusticeScale02`
2096 -- `HugeIcons.strokeRoundedKaaba01`
2097 -- `HugeIcons.strokeRoundedKaaba02`
2098 -- `HugeIcons.strokeRoundedKanban`
2099 -- `HugeIcons.strokeRoundedKayak`
2100 -- `HugeIcons.strokeRoundedKeffiyeh`
2101 -- `HugeIcons.strokeRoundedKettle01`
2102 -- `HugeIcons.strokeRoundedKettle`
2103 -- `HugeIcons.strokeRoundedKettlebell`
2104 -- `HugeIcons.strokeRoundedKetupat`
2105 -- `HugeIcons.strokeRoundedKey01`
2106 -- `HugeIcons.strokeRoundedKey02`
2107 -- `HugeIcons.strokeRoundedKeyGeneratorFob`
2108 -- `HugeIcons.strokeRoundedKeyboard`
2109 -- `HugeIcons.strokeRoundedKeyframeAdd`
2110 -- `HugeIcons.strokeRoundedKeyframeAlignCenter`
2111 -- `HugeIcons.strokeRoundedKeyframeAlignHorizontal`
2112 -- `HugeIcons.strokeRoundedKeyframeAlignVertical`
2113 -- `HugeIcons.strokeRoundedKeyframeBottom`
2114 -- `HugeIcons.strokeRoundedKeyframeLeft`
2115 -- `HugeIcons.strokeRoundedKeyframeRemove`
2116 -- `HugeIcons.strokeRoundedKeyframeRight`
2117 -- `HugeIcons.strokeRoundedKeyframe`
2118 -- `HugeIcons.strokeRoundedKeyframeTop`
2119 -- `HugeIcons.strokeRoundedKeyframesDoubleAdd`
2120 -- `HugeIcons.strokeRoundedKeyframesDoubleRemove`
2121 -- `HugeIcons.strokeRoundedKeyframesDouble`
2122 -- `HugeIcons.strokeRoundedKeyframesMultipleAdd`
2123 -- `HugeIcons.strokeRoundedKeyframesMultipleRemove`
2124 -- `HugeIcons.strokeRoundedKeyframesMultiple`
2125 -- `HugeIcons.strokeRoundedKickstarter01`
2126 -- `HugeIcons.strokeRoundedKickstarter02`
2127 -- `HugeIcons.strokeRoundedKid`
2128 -- `HugeIcons.strokeRoundedKidneys`
2129 -- `HugeIcons.strokeRoundedKimiAi`
2130 -- `HugeIcons.strokeRoundedKissing`
2131 -- `HugeIcons.strokeRoundedKitchenUtensils`
2132 -- `HugeIcons.strokeRoundedKite`
2133 -- `HugeIcons.strokeRoundedKlarna`
2134 -- `HugeIcons.strokeRoundedKnife01`
2135 -- `HugeIcons.strokeRoundedKnife02`
2136 -- `HugeIcons.strokeRoundedKnifeBread`
2137 -- `HugeIcons.strokeRoundedKnightShield`
2138 -- `HugeIcons.strokeRoundedKnives`
2139 -- `HugeIcons.strokeRoundedKnowledge01`
2140 -- `HugeIcons.strokeRoundedKnowledge02`
2141 -- `HugeIcons.strokeRoundedKoFi`
2142 -- `HugeIcons.strokeRoundedKurta01`
2143 -- `HugeIcons.strokeRoundedKurta`
2144 -- `HugeIcons.strokeRoundedLabelImportant`
2145 -- `HugeIcons.strokeRoundedLabel`
2146 -- `HugeIcons.strokeRoundedLabor`
2147 -- `HugeIcons.strokeRoundedLabs`
2148 -- `HugeIcons.strokeRoundedLake`
2149 -- `HugeIcons.strokeRoundedLamp01`
2150 -- `HugeIcons.strokeRoundedLamp02`
2151 -- `HugeIcons.strokeRoundedLamp03`
2152 -- `HugeIcons.strokeRoundedLamp04`
2153 -- `HugeIcons.strokeRoundedLamp05`
2154 -- `HugeIcons.strokeRoundedLamp`
2155 -- `HugeIcons.strokeRoundedLanguageCircle`
2156 -- `HugeIcons.strokeRoundedLanguageSkill`
2157 -- `HugeIcons.strokeRoundedLanguageSquare`
2158 -- `HugeIcons.strokeRoundedLantern`
2159 -- `HugeIcons.strokeRoundedLaptopAdd`
2160 -- `HugeIcons.strokeRoundedLaptopCharging`
2161 -- `HugeIcons.strokeRoundedLaptopCheck`
2162 -- `HugeIcons.strokeRoundedLaptopCloud`
2163 -- `HugeIcons.strokeRoundedLaptopIssue`
2164 -- `HugeIcons.strokeRoundedLaptopPerformance`
2165 -- `HugeIcons.strokeRoundedLaptopPhoneSync`
2166 -- `HugeIcons.strokeRoundedLaptopProgramming`
2167 -- `HugeIcons.strokeRoundedLaptopRemove`
2168 -- `HugeIcons.strokeRoundedLaptopSettings`
2169 -- `HugeIcons.strokeRoundedLaptop`
2170 -- `HugeIcons.strokeRoundedLaptopVideo`
2171 -- `HugeIcons.strokeRoundedLassoTool01`
2172 -- `HugeIcons.strokeRoundedLassoTool02`
2173 -- `HugeIcons.strokeRoundedLastFm`
2174 -- `HugeIcons.strokeRoundedLatitude`
2175 -- `HugeIcons.strokeRoundedLaughing`
2176 -- `HugeIcons.strokeRoundedLaurelWreath01`
2177 -- `HugeIcons.strokeRoundedLaurelWreath02`
2178 -- `HugeIcons.strokeRoundedLaurelWreathFirst01`
2179 -- `HugeIcons.strokeRoundedLaurelWreathFirst02`
2180 -- `HugeIcons.strokeRoundedLaurelWreathLeft01`
2181 -- `HugeIcons.strokeRoundedLaurelWreathLeft02`
2182 -- `HugeIcons.strokeRoundedLaurelWreathLeft03`
2183 -- `HugeIcons.strokeRoundedLaurelWreathRight01`
2184 -- `HugeIcons.strokeRoundedLaurelWreathRight02`
2185 -- `HugeIcons.strokeRoundedLaurelWreathRight03`
2186 -- `HugeIcons.strokeRoundedLayerAdd`
2187 -- `HugeIcons.strokeRoundedLayerBringForward`
2188 -- `HugeIcons.strokeRoundedLayerBringToFront`
2189 -- `HugeIcons.strokeRoundedLayerMask01`
2190 -- `HugeIcons.strokeRoundedLayerMask02`
2191 -- `HugeIcons.strokeRoundedLayerSendBackward`
2192 -- `HugeIcons.strokeRoundedLayerSendToBack`
2193 -- `HugeIcons.strokeRoundedLayer`
2194 -- `HugeIcons.strokeRoundedLayers01`
2195 -- `HugeIcons.strokeRoundedLayers02`
2196 -- `HugeIcons.strokeRoundedLayersLogo`
2197 -- `HugeIcons.strokeRoundedLayout01`
2198 -- `HugeIcons.strokeRoundedLayout02`
2199 -- `HugeIcons.strokeRoundedLayout03`
2200 -- `HugeIcons.strokeRoundedLayout04`
2201 -- `HugeIcons.strokeRoundedLayout05`
2202 -- `HugeIcons.strokeRoundedLayout06`
2203 -- `HugeIcons.strokeRoundedLayout07`
2204 -- `HugeIcons.strokeRoundedLayout2Column`
2205 -- `HugeIcons.strokeRoundedLayout2Row`
2206 -- `HugeIcons.strokeRoundedLayout3Column`
2207 -- `HugeIcons.strokeRoundedLayout3Row`
2208 -- `HugeIcons.strokeRoundedLayoutBottom`
2209 -- `HugeIcons.strokeRoundedLayoutGrid`
2210 -- `HugeIcons.strokeRoundedLayoutLeft`
2211 -- `HugeIcons.strokeRoundedLayoutRight`
2212 -- `HugeIcons.strokeRoundedLayoutTable01`
2213 -- `HugeIcons.strokeRoundedLayoutTable02`
2214 -- `HugeIcons.strokeRoundedLayoutTop`
2215 -- `HugeIcons.strokeRoundedLeaf01`
2216 -- `HugeIcons.strokeRoundedLeaf02`
2217 -- `HugeIcons.strokeRoundedLeaf03`
2218 -- `HugeIcons.strokeRoundedLeaf04`
2219 -- `HugeIcons.strokeRoundedLeavingGeoFence`
2220 -- `HugeIcons.strokeRoundedLeetcode`
2221 -- `HugeIcons.strokeRoundedLeftAngle`
2222 -- `HugeIcons.strokeRoundedLeftToRightBlockQuote`
2223 -- `HugeIcons.strokeRoundedLeftToRightListBullet`
2224 -- `HugeIcons.strokeRoundedLeftToRightListDash`
2225 -- `HugeIcons.strokeRoundedLeftToRightListNumber`
2226 -- `HugeIcons.strokeRoundedLeftToRightListStar01`
2227 -- `HugeIcons.strokeRoundedLeftToRightListStar`
2228 -- `HugeIcons.strokeRoundedLeftToRightListTriangle`
2229 -- `HugeIcons.strokeRoundedLeftTriangle`
2230 -- `HugeIcons.strokeRoundedLegal01`
2231 -- `HugeIcons.strokeRoundedLegal02`
2232 -- `HugeIcons.strokeRoundedLegalDocument01`
2233 -- `HugeIcons.strokeRoundedLegalDocument02`
2234 -- `HugeIcons.strokeRoundedLegalHammer`
2235 -- `HugeIcons.strokeRoundedLessThanCircle`
2236 -- `HugeIcons.strokeRoundedLessThanSquare`
2237 -- `HugeIcons.strokeRoundedLessThan`
2238 -- `HugeIcons.strokeRoundedLetterSpacing`
2239 -- `HugeIcons.strokeRoundedLibraries`
2240 -- `HugeIcons.strokeRoundedLibrary`
2241 -- `HugeIcons.strokeRoundedLicenseDraft`
2242 -- `HugeIcons.strokeRoundedLicenseMaintenance`
2243 -- `HugeIcons.strokeRoundedLicenseNo`
2244 -- `HugeIcons.strokeRoundedLicensePin`
2245 -- `HugeIcons.strokeRoundedLicense`
2246 -- `HugeIcons.strokeRoundedLicenseThirdParty`
2247 -- `HugeIcons.strokeRoundedLifebuoy`
2248 -- `HugeIcons.strokeRoundedLiftTruck`
2249 -- `HugeIcons.strokeRoundedLighthouse`
2250 -- `HugeIcons.strokeRoundedLimitOrder`
2251 -- `HugeIcons.strokeRoundedLimitation`
2252 -- `HugeIcons.strokeRoundedLine`
2253 -- `HugeIcons.strokeRoundedLiner`
2254 -- `HugeIcons.strokeRoundedLink01`
2255 -- `HugeIcons.strokeRoundedLink02`
2256 -- `HugeIcons.strokeRoundedLink03`
2257 -- `HugeIcons.strokeRoundedLink04`
2258 -- `HugeIcons.strokeRoundedLink05`
2259 -- `HugeIcons.strokeRoundedLink06`
2260 -- `HugeIcons.strokeRoundedLinkBackward`
2261 -- `HugeIcons.strokeRoundedLinkCircle02`
2262 -- `HugeIcons.strokeRoundedLinkCircle`
2263 -- `HugeIcons.strokeRoundedLinkForward`
2264 -- `HugeIcons.strokeRoundedLinkSquare01`
2265 -- `HugeIcons.strokeRoundedLinkSquare02`
2266 -- `HugeIcons.strokeRoundedLinkedin01`
2267 -- `HugeIcons.strokeRoundedLinkedin02`
2268 -- `HugeIcons.strokeRoundedListSetting`
2269 -- `HugeIcons.strokeRoundedListView`
2270 -- `HugeIcons.strokeRoundedLitecoin`
2271 -- `HugeIcons.strokeRoundedLiveStreaming01`
2272 -- `HugeIcons.strokeRoundedLiveStreaming02`
2273 -- `HugeIcons.strokeRoundedLiveStreaming03`
2274 -- `HugeIcons.strokeRoundedLiver`
2275 -- `HugeIcons.strokeRoundedLoading01`
2276 -- `HugeIcons.strokeRoundedLoading02`
2277 -- `HugeIcons.strokeRoundedLoading03`
2278 -- `HugeIcons.strokeRoundedLoading04`
2279 -- `HugeIcons.strokeRoundedLocation01`
2280 -- `HugeIcons.strokeRoundedLocation02`
2281 -- `HugeIcons.strokeRoundedLocation03`
2282 -- `HugeIcons.strokeRoundedLocation04`
2283 -- `HugeIcons.strokeRoundedLocation05`
2284 -- `HugeIcons.strokeRoundedLocation06`
2285 -- `HugeIcons.strokeRoundedLocation07`
2286 -- `HugeIcons.strokeRoundedLocation08`
2287 -- `HugeIcons.strokeRoundedLocation09`
2288 -- `HugeIcons.strokeRoundedLocation10`
2289 -- `HugeIcons.strokeRoundedLocationAdd01`
2290 -- `HugeIcons.strokeRoundedLocationAdd02`
2291 -- `HugeIcons.strokeRoundedLocationCheck01`
2292 -- `HugeIcons.strokeRoundedLocationCheck02`
2293 -- `HugeIcons.strokeRoundedLocationFavourite01`
2294 -- `HugeIcons.strokeRoundedLocationFavourite02`
2295 -- `HugeIcons.strokeRoundedLocationOffline01`
2296 -- `HugeIcons.strokeRoundedLocationOffline02`
2297 -- `HugeIcons.strokeRoundedLocationOffline03`
2298 -- `HugeIcons.strokeRoundedLocationOffline04`
2299 -- `HugeIcons.strokeRoundedLocationRemove01`
2300 -- `HugeIcons.strokeRoundedLocationRemove02`
2301 -- `HugeIcons.strokeRoundedLocationShare01`
2302 -- `HugeIcons.strokeRoundedLocationShare02`
2303 -- `HugeIcons.strokeRoundedLocationStar01`
2304 -- `HugeIcons.strokeRoundedLocationStar02`
2305 -- `HugeIcons.strokeRoundedLocationUpdate01`
2306 -- `HugeIcons.strokeRoundedLocationUpdate02`
2307 -- `HugeIcons.strokeRoundedLocationUser01`
2308 -- `HugeIcons.strokeRoundedLocationUser02`
2309 -- `HugeIcons.strokeRoundedLocationUser03`
2310 -- `HugeIcons.strokeRoundedLocationUser04`
2311 -- `HugeIcons.strokeRoundedLockComputer`
2312 -- `HugeIcons.strokeRoundedLockKey`
2313 -- `HugeIcons.strokeRoundedLockPassword`
2314 -- `HugeIcons.strokeRoundedLock`
2315 -- `HugeIcons.strokeRoundedLockSync01`
2316 -- `HugeIcons.strokeRoundedLockSync02`
2317 -- `HugeIcons.strokeRoundedLocked`
2318 -- `HugeIcons.strokeRoundedLocker01`
2319 -- `HugeIcons.strokeRoundedLocker`
2320 -- `HugeIcons.strokeRoundedLogin01`
2321 -- `HugeIcons.strokeRoundedLogin02`
2322 -- `HugeIcons.strokeRoundedLogin03`
2323 -- `HugeIcons.strokeRoundedLoginCircle01`
2324 -- `HugeIcons.strokeRoundedLoginCircle02`
2325 -- `HugeIcons.strokeRoundedLoginMethod`
2326 -- `HugeIcons.strokeRoundedLoginSquare01`
2327 -- `HugeIcons.strokeRoundedLoginSquare02`
2328 -- `HugeIcons.strokeRoundedLogout01`
2329 -- `HugeIcons.strokeRoundedLogout02`
2330 -- `HugeIcons.strokeRoundedLogout03`
2331 -- `HugeIcons.strokeRoundedLogout04`
2332 -- `HugeIcons.strokeRoundedLogout05`
2333 -- `HugeIcons.strokeRoundedLogoutCircle01`
2334 -- `HugeIcons.strokeRoundedLogoutCircle02`
2335 -- `HugeIcons.strokeRoundedLogoutSquare01`
2336 -- `HugeIcons.strokeRoundedLogoutSquare02`
2337 -- `HugeIcons.strokeRoundedLollipop`
2338 -- `HugeIcons.strokeRoundedLongSleeveShirt`
2339 -- `HugeIcons.strokeRoundedLongitude`
2340 -- `HugeIcons.strokeRoundedLookBottom`
2341 -- `HugeIcons.strokeRoundedLookLeft`
2342 -- `HugeIcons.strokeRoundedLookRight`
2343 -- `HugeIcons.strokeRoundedLookTop`
2344 -- `HugeIcons.strokeRoundedLoom`
2345 -- `HugeIcons.strokeRoundedLottiefiles`
2346 -- `HugeIcons.strokeRoundedLoveKoreanFinger`
2347 -- `HugeIcons.strokeRoundedLowSignal`
2348 -- `HugeIcons.strokeRoundedLoyaltyCard`
2349 -- `HugeIcons.strokeRoundedLuggage01`
2350 -- `HugeIcons.strokeRoundedLuggage02`
2351 -- `HugeIcons.strokeRoundedLungs`
2352 -- `HugeIcons.strokeRoundedMachineRobot`
2353 -- `HugeIcons.strokeRoundedMagicWand01`
2354 -- `HugeIcons.strokeRoundedMagicWand02`
2355 -- `HugeIcons.strokeRoundedMagicWand03`
2356 -- `HugeIcons.strokeRoundedMagicWand04`
2357 -- `HugeIcons.strokeRoundedMagicWand05`
2358 -- `HugeIcons.strokeRoundedMagnet01`
2359 -- `HugeIcons.strokeRoundedMagnet02`
2360 -- `HugeIcons.strokeRoundedMagnet`
2361 -- `HugeIcons.strokeRoundedMail01`
2362 -- `HugeIcons.strokeRoundedMail02`
2363 -- `HugeIcons.strokeRoundedMailAccount01`
2364 -- `HugeIcons.strokeRoundedMailAccount02`
2365 -- `HugeIcons.strokeRoundedMailAdd01`
2366 -- `HugeIcons.strokeRoundedMailAdd02`
2367 -- `HugeIcons.strokeRoundedMailAtSign01`
2368 -- `HugeIcons.strokeRoundedMailAtSign02`
2369 -- `HugeIcons.strokeRoundedMailBlock01`
2370 -- `HugeIcons.strokeRoundedMailBlock02`
2371 -- `HugeIcons.strokeRoundedMailDownload01`
2372 -- `HugeIcons.strokeRoundedMailDownload02`
2373 -- `HugeIcons.strokeRoundedMailEdit01`
2374 -- `HugeIcons.strokeRoundedMailEdit02`
2375 -- `HugeIcons.strokeRoundedMailLock01`
2376 -- `HugeIcons.strokeRoundedMailLock02`
2377 -- `HugeIcons.strokeRoundedMailLove01`
2378 -- `HugeIcons.strokeRoundedMailLove02`
2379 -- `HugeIcons.strokeRoundedMailMinus01`
2380 -- `HugeIcons.strokeRoundedMailMinus02`
2381 -- `HugeIcons.strokeRoundedMailOpen01`
2382 -- `HugeIcons.strokeRoundedMailOpen02`
2383 -- `HugeIcons.strokeRoundedMailOpenLove`
2384 -- `HugeIcons.strokeRoundedMailOpen`
2385 -- `HugeIcons.strokeRoundedMailReceive01`
2386 -- `HugeIcons.strokeRoundedMailReceive02`
2387 -- `HugeIcons.strokeRoundedMailRemove01`
2388 -- `HugeIcons.strokeRoundedMailRemove02`
2389 -- `HugeIcons.strokeRoundedMailReply01`
2390 -- `HugeIcons.strokeRoundedMailReply02`
2391 -- `HugeIcons.strokeRoundedMailReplyAll01`
2392 -- `HugeIcons.strokeRoundedMailReplyAll02`
2393 -- `HugeIcons.strokeRoundedMailSearch01`
2394 -- `HugeIcons.strokeRoundedMailSearch02`
2395 -- `HugeIcons.strokeRoundedMailSecure01`
2396 -- `HugeIcons.strokeRoundedMailSecure02`
2397 -- `HugeIcons.strokeRoundedMailSend01`
2398 -- `HugeIcons.strokeRoundedMailSend02`
2399 -- `HugeIcons.strokeRoundedMailSetting01`
2400 -- `HugeIcons.strokeRoundedMailSetting02`
2401 -- `HugeIcons.strokeRoundedMailUnlock01`
2402 -- `HugeIcons.strokeRoundedMailUnlock02`
2403 -- `HugeIcons.strokeRoundedMailUpload01`
2404 -- `HugeIcons.strokeRoundedMailUpload02`
2405 -- `HugeIcons.strokeRoundedMailValidation01`
2406 -- `HugeIcons.strokeRoundedMailValidation02`
2407 -- `HugeIcons.strokeRoundedMailVoice01`
2408 -- `HugeIcons.strokeRoundedMailVoice02`
2409 -- `HugeIcons.strokeRoundedMailbox01`
2410 -- `HugeIcons.strokeRoundedMailbox`
2411 -- `HugeIcons.strokeRoundedMale02`
2412 -- `HugeIcons.strokeRoundedMaleSymbol`
2413 -- `HugeIcons.strokeRoundedMan`
2414 -- `HugeIcons.strokeRoundedManWoman`
2415 -- `HugeIcons.strokeRoundedManager`
2416 -- `HugeIcons.strokeRoundedMapPin`
2417 -- `HugeIcons.strokeRoundedMapPinpoint01`
2418 -- `HugeIcons.strokeRoundedMapPinpoint02`
2419 -- `HugeIcons.strokeRoundedMaping`
2420 -- `HugeIcons.strokeRoundedMapsCircle01`
2421 -- `HugeIcons.strokeRoundedMapsCircle02`
2422 -- `HugeIcons.strokeRoundedMapsEditing`
2423 -- `HugeIcons.strokeRoundedMapsGlobal01`
2424 -- `HugeIcons.strokeRoundedMapsGlobal02`
2425 -- `HugeIcons.strokeRoundedMapsLocation01`
2426 -- `HugeIcons.strokeRoundedMapsLocation02`
2427 -- `HugeIcons.strokeRoundedMapsOff`
2428 -- `HugeIcons.strokeRoundedMapsRefresh`
2429 -- `HugeIcons.strokeRoundedMapsSearch`
2430 -- `HugeIcons.strokeRoundedMapsSquare01`
2431 -- `HugeIcons.strokeRoundedMapsSquare02`
2432 -- `HugeIcons.strokeRoundedMaps`
2433 -- `HugeIcons.strokeRoundedMarketAnalysis`
2434 -- `HugeIcons.strokeRoundedMarketOrder`
2435 -- `HugeIcons.strokeRoundedMarketing`
2436 -- `HugeIcons.strokeRoundedMaskLove`
2437 -- `HugeIcons.strokeRoundedMask`
2438 -- `HugeIcons.strokeRoundedMaskTheater01`
2439 -- `HugeIcons.strokeRoundedMaskTheater02`
2440 -- `HugeIcons.strokeRoundedMasterCard`
2441 -- `HugeIcons.strokeRoundedMastodon`
2442 -- `HugeIcons.strokeRoundedMatches`
2443 -- `HugeIcons.strokeRoundedMaterialAndTexture`
2444 -- `HugeIcons.strokeRoundedMath`
2445 -- `HugeIcons.strokeRoundedMatrix`
2446 -- `HugeIcons.strokeRoundedMaximize01`
2447 -- `HugeIcons.strokeRoundedMaximize02`
2448 -- `HugeIcons.strokeRoundedMaximize03`
2449 -- `HugeIcons.strokeRoundedMaximize04`
2450 -- `HugeIcons.strokeRoundedMaximizeScreen`
2451 -- `HugeIcons.strokeRoundedMayanPyramid`
2452 -- `HugeIcons.strokeRoundedMaze`
2453 -- `HugeIcons.strokeRoundedMcpServer`
2454 -- `HugeIcons.strokeRoundedMedal01`
2455 -- `HugeIcons.strokeRoundedMedal02`
2456 -- `HugeIcons.strokeRoundedMedal03`
2457 -- `HugeIcons.strokeRoundedMedal04`
2458 -- `HugeIcons.strokeRoundedMedal05`
2459 -- `HugeIcons.strokeRoundedMedal06`
2460 -- `HugeIcons.strokeRoundedMedal07`
2461 -- `HugeIcons.strokeRoundedMedalFirstPlace`
2462 -- `HugeIcons.strokeRoundedMedalSecondPlace`
2463 -- `HugeIcons.strokeRoundedMedalThirdPlace`
2464 -- `HugeIcons.strokeRoundedMedicalFile`
2465 -- `HugeIcons.strokeRoundedMedicalMask`
2466 -- `HugeIcons.strokeRoundedMedicine01`
2467 -- `HugeIcons.strokeRoundedMedicine02`
2468 -- `HugeIcons.strokeRoundedMedicineBottle01`
2469 -- `HugeIcons.strokeRoundedMedicineBottle02`
2470 -- `HugeIcons.strokeRoundedMedicineSyrup`
2471 -- `HugeIcons.strokeRoundedMediumSignal`
2472 -- `HugeIcons.strokeRoundedMediumSquare`
2473 -- `HugeIcons.strokeRoundedMedium`
2474 -- `HugeIcons.strokeRoundedMeetingRoom`
2475 -- `HugeIcons.strokeRoundedMegaphone01`
2476 -- `HugeIcons.strokeRoundedMegaphone02`
2477 -- `HugeIcons.strokeRoundedMegaphone03`
2478 -- `HugeIcons.strokeRoundedMeh`
2479 -- `HugeIcons.strokeRoundedMentor`
2480 -- `HugeIcons.strokeRoundedMentoring`
2481 -- `HugeIcons.strokeRoundedMenu01`
2482 -- `HugeIcons.strokeRoundedMenu02`
2483 -- `HugeIcons.strokeRoundedMenu03`
2484 -- `HugeIcons.strokeRoundedMenu04`
2485 -- `HugeIcons.strokeRoundedMenu05`
2486 -- `HugeIcons.strokeRoundedMenu06`
2487 -- `HugeIcons.strokeRoundedMenu07`
2488 -- `HugeIcons.strokeRoundedMenu08`
2489 -- `HugeIcons.strokeRoundedMenu09`
2490 -- `HugeIcons.strokeRoundedMenu10`
2491 -- `HugeIcons.strokeRoundedMenu11`
2492 -- `HugeIcons.strokeRoundedMenuCircle`
2493 -- `HugeIcons.strokeRoundedMenuCollapse`
2494 -- `HugeIcons.strokeRoundedMenuRestaurant`
2495 -- `HugeIcons.strokeRoundedMenuSquare`
2496 -- `HugeIcons.strokeRoundedMenuTwoLine`
2497 -- `HugeIcons.strokeRoundedMessage01`
2498 -- `HugeIcons.strokeRoundedMessage02`
2499 -- `HugeIcons.strokeRoundedMessageAdd01`
2500 -- `HugeIcons.strokeRoundedMessageAdd02`
2501 -- `HugeIcons.strokeRoundedMessageBlocked`
2502 -- `HugeIcons.strokeRoundedMessageCancel01`
2503 -- `HugeIcons.strokeRoundedMessageCancel02`
2504 -- `HugeIcons.strokeRoundedMessageDelay01`
2505 -- `HugeIcons.strokeRoundedMessageDelay02`
2506 -- `HugeIcons.strokeRoundedMessageDone01`
2507 -- `HugeIcons.strokeRoundedMessageDone02`
2508 -- `HugeIcons.strokeRoundedMessageDownload01`
2509 -- `HugeIcons.strokeRoundedMessageDownload02`
2510 -- `HugeIcons.strokeRoundedMessageEdit01`
2511 -- `HugeIcons.strokeRoundedMessageEdit02`
2512 -- `HugeIcons.strokeRoundedMessageFavourite01`
2513 -- `HugeIcons.strokeRoundedMessageFavourite02`
2514 -- `HugeIcons.strokeRoundedMessageIncoming01`
2515 -- `HugeIcons.strokeRoundedMessageIncoming02`
2516 -- `HugeIcons.strokeRoundedMessageLock01`
2517 -- `HugeIcons.strokeRoundedMessageLock02`
2518 -- `HugeIcons.strokeRoundedMessageMultiple01`
2519 -- `HugeIcons.strokeRoundedMessageMultiple02`
2520 -- `HugeIcons.strokeRoundedMessageNotification01`
2521 -- `HugeIcons.strokeRoundedMessageNotification02`
2522 -- `HugeIcons.strokeRoundedMessageOutgoing01`
2523 -- `HugeIcons.strokeRoundedMessageOutgoing02`
2524 -- `HugeIcons.strokeRoundedMessagePreview01`
2525 -- `HugeIcons.strokeRoundedMessagePreview02`
2526 -- `HugeIcons.strokeRoundedMessageProgramming`
2527 -- `HugeIcons.strokeRoundedMessageQuestion`
2528 -- `HugeIcons.strokeRoundedMessageSearch01`
2529 -- `HugeIcons.strokeRoundedMessageSearch02`
2530 -- `HugeIcons.strokeRoundedMessageSecure01`
2531 -- `HugeIcons.strokeRoundedMessageSecure02`
2532 -- `HugeIcons.strokeRoundedMessageTranslate`
2533 -- `HugeIcons.strokeRoundedMessageUnlock01`
2534 -- `HugeIcons.strokeRoundedMessageUnlock02`
2535 -- `HugeIcons.strokeRoundedMessageUpload01`
2536 -- `HugeIcons.strokeRoundedMessageUpload02`
2537 -- `HugeIcons.strokeRoundedMessageUser01`
2538 -- `HugeIcons.strokeRoundedMessageUser02`
2539 -- `HugeIcons.strokeRoundedMessenger`
2540 -- `HugeIcons.strokeRoundedMeta`
2541 -- `HugeIcons.strokeRoundedMetro`
2542 -- `HugeIcons.strokeRoundedMic01`
2543 -- `HugeIcons.strokeRoundedMic02`
2544 -- `HugeIcons.strokeRoundedMicOff01`
2545 -- `HugeIcons.strokeRoundedMicOff02`
2546 -- `HugeIcons.strokeRoundedMicroscope`
2547 -- `HugeIcons.strokeRoundedMicrosoftAdmin`
2548 -- `HugeIcons.strokeRoundedMicrosoft`
2549 -- `HugeIcons.strokeRoundedMicrowave`
2550 -- `HugeIcons.strokeRoundedMilkBottle`
2551 -- `HugeIcons.strokeRoundedMilkCarton`
2552 -- `HugeIcons.strokeRoundedMilkCoconut`
2553 -- `HugeIcons.strokeRoundedMilkOat`
2554 -- `HugeIcons.strokeRoundedMinimize01`
2555 -- `HugeIcons.strokeRoundedMinimize02`
2556 -- `HugeIcons.strokeRoundedMinimize03`
2557 -- `HugeIcons.strokeRoundedMinimize04`
2558 -- `HugeIcons.strokeRoundedMinimizeScreen`
2559 -- `HugeIcons.strokeRoundedMining01`
2560 -- `HugeIcons.strokeRoundedMining02`
2561 -- `HugeIcons.strokeRoundedMining03`
2562 -- `HugeIcons.strokeRoundedMinusPlus01`
2563 -- `HugeIcons.strokeRoundedMinusPlus02`
2564 -- `HugeIcons.strokeRoundedMinusPlusCircle01`
2565 -- `HugeIcons.strokeRoundedMinusPlusCircle02`
2566 -- `HugeIcons.strokeRoundedMinusPlusSquare01`
2567 -- `HugeIcons.strokeRoundedMinusPlusSquare02`
2568 -- `HugeIcons.strokeRoundedMinusSignCircle`
2569 -- `HugeIcons.strokeRoundedMinusSignSquare`
2570 -- `HugeIcons.strokeRoundedMinusSign`
2571 -- `HugeIcons.strokeRoundedMirror`
2572 -- `HugeIcons.strokeRoundedMirroringScreen`
2573 -- `HugeIcons.strokeRoundedMistral`
2574 -- `HugeIcons.strokeRoundedMixer`
2575 -- `HugeIcons.strokeRoundedMobileNavigator01`
2576 -- `HugeIcons.strokeRoundedMobileNavigator02`
2577 -- `HugeIcons.strokeRoundedMobileProgramming01`
2578 -- `HugeIcons.strokeRoundedMobileProgramming02`
2579 -- `HugeIcons.strokeRoundedMobileProtection`
2580 -- `HugeIcons.strokeRoundedMobileSecurity`
2581 -- `HugeIcons.strokeRoundedMochi`
2582 -- `HugeIcons.strokeRoundedModernTv4K`
2583 -- `HugeIcons.strokeRoundedModernTvIssue`
2584 -- `HugeIcons.strokeRoundedModernTv`
2585 -- `HugeIcons.strokeRoundedMolecules`
2586 -- `HugeIcons.strokeRoundedMollie`
2587 -- `HugeIcons.strokeRoundedMonas`
2588 -- `HugeIcons.strokeRoundedMoney01`
2589 -- `HugeIcons.strokeRoundedMoney02`
2590 -- `HugeIcons.strokeRoundedMoney03`
2591 -- `HugeIcons.strokeRoundedMoney04`
2592 -- `HugeIcons.strokeRoundedMoneyAdd01`
2593 -- `HugeIcons.strokeRoundedMoneyAdd02`
2594 -- `HugeIcons.strokeRoundedMoneyBag01`
2595 -- `HugeIcons.strokeRoundedMoneyBag02`
2596 -- `HugeIcons.strokeRoundedMoneyExchange01`
2597 -- `HugeIcons.strokeRoundedMoneyExchange02`
2598 -- `HugeIcons.strokeRoundedMoneyExchange03`
2599 -- `HugeIcons.strokeRoundedMoneyNotFound01`
2600 -- `HugeIcons.strokeRoundedMoneyNotFound02`
2601 -- `HugeIcons.strokeRoundedMoneyNotFound03`
2602 -- `HugeIcons.strokeRoundedMoneyNotFound04`
2603 -- `HugeIcons.strokeRoundedMoneyReceive01`
2604 -- `HugeIcons.strokeRoundedMoneyReceive02`
2605 -- `HugeIcons.strokeRoundedMoneyReceiveCircle`
2606 -- `HugeIcons.strokeRoundedMoneyReceiveFlow01`
2607 -- `HugeIcons.strokeRoundedMoneyReceiveFlow02`
2608 -- `HugeIcons.strokeRoundedMoneyReceiveSquare`
2609 -- `HugeIcons.strokeRoundedMoneyRemove01`
2610 -- `HugeIcons.strokeRoundedMoneyRemove02`
2611 -- `HugeIcons.strokeRoundedMoneySafe`
2612 -- `HugeIcons.strokeRoundedMoneySavingJar`
2613 -- `HugeIcons.strokeRoundedMoneySecurity`
2614 -- `HugeIcons.strokeRoundedMoneySend01`
2615 -- `HugeIcons.strokeRoundedMoneySend02`
2616 -- `HugeIcons.strokeRoundedMoneySendCircle`
2617 -- `HugeIcons.strokeRoundedMoneySendFlow01`
2618 -- `HugeIcons.strokeRoundedMoneySendFlow02`
2619 -- `HugeIcons.strokeRoundedMoneySendSquare`
2620 -- `HugeIcons.strokeRoundedMonocle01`
2621 -- `HugeIcons.strokeRoundedMonocle`
2622 -- `HugeIcons.strokeRoundedMonster`
2623 -- `HugeIcons.strokeRoundedMoon01`
2624 -- `HugeIcons.strokeRoundedMoon02`
2625 -- `HugeIcons.strokeRoundedMoonAngledRainZap`
2626 -- `HugeIcons.strokeRoundedMoonCloudAngledRain`
2627 -- `HugeIcons.strokeRoundedMoonCloudAngledZap`
2628 -- `HugeIcons.strokeRoundedMoonCloudBigRain`
2629 -- `HugeIcons.strokeRoundedMoonCloudFastWind`
2630 -- `HugeIcons.strokeRoundedMoonCloudHailstone`
2631 -- `HugeIcons.strokeRoundedMoonCloudLittleRain`
2632 -- `HugeIcons.strokeRoundedMoonCloudLittleSnow`
2633 -- `HugeIcons.strokeRoundedMoonCloudMidRain`
2634 -- `HugeIcons.strokeRoundedMoonCloudMidSnow`
2635 -- `HugeIcons.strokeRoundedMoonCloudSlowWind`
2636 -- `HugeIcons.strokeRoundedMoonCloudSnow`
2637 -- `HugeIcons.strokeRoundedMoonCloud`
2638 -- `HugeIcons.strokeRoundedMoonEclipse`
2639 -- `HugeIcons.strokeRoundedMoonFastWind`
2640 -- `HugeIcons.strokeRoundedMoonLanding`
2641 -- `HugeIcons.strokeRoundedMoonSlowWind`
2642 -- `HugeIcons.strokeRoundedMoon`
2643 -- `HugeIcons.strokeRoundedMoonset`
2644 -- `HugeIcons.strokeRoundedMore01`
2645 -- `HugeIcons.strokeRoundedMore02`
2646 -- `HugeIcons.strokeRoundedMore03`
2647 -- `HugeIcons.strokeRoundedMoreHorizontalCircle01`
2648 -- `HugeIcons.strokeRoundedMoreHorizontalCircle02`
2649 -- `HugeIcons.strokeRoundedMoreHorizontalSquare01`
2650 -- `HugeIcons.strokeRoundedMoreHorizontalSquare02`
2651 -- `HugeIcons.strokeRoundedMoreHorizontal`
2652 -- `HugeIcons.strokeRoundedMoreOrLessCircle`
2653 -- `HugeIcons.strokeRoundedMoreOrLessSquare`
2654 -- `HugeIcons.strokeRoundedMoreOrLess`
2655 -- `HugeIcons.strokeRoundedMore`
2656 -- `HugeIcons.strokeRoundedMoreVerticalCircle01`
2657 -- `HugeIcons.strokeRoundedMoreVerticalCircle02`
2658 -- `HugeIcons.strokeRoundedMoreVerticalSquare01`
2659 -- `HugeIcons.strokeRoundedMoreVerticalSquare02`
2660 -- `HugeIcons.strokeRoundedMoreVertical`
2661 -- `HugeIcons.strokeRoundedMortar`
2662 -- `HugeIcons.strokeRoundedMortarboard01`
2663 -- `HugeIcons.strokeRoundedMortarboard02`
2664 -- `HugeIcons.strokeRoundedMosque01`
2665 -- `HugeIcons.strokeRoundedMosque02`
2666 -- `HugeIcons.strokeRoundedMosque03`
2667 -- `HugeIcons.strokeRoundedMosque04`
2668 -- `HugeIcons.strokeRoundedMosque05`
2669 -- `HugeIcons.strokeRoundedMosqueLocation`
2670 -- `HugeIcons.strokeRoundedMotion01`
2671 -- `HugeIcons.strokeRoundedMotion02`
2672 -- `HugeIcons.strokeRoundedMotorbike01`
2673 -- `HugeIcons.strokeRoundedMotorbike02`
2674 -- `HugeIcons.strokeRoundedMountain`
2675 -- `HugeIcons.strokeRoundedMouse01`
2676 -- `HugeIcons.strokeRoundedMouse02`
2677 -- `HugeIcons.strokeRoundedMouse03`
2678 -- `HugeIcons.strokeRoundedMouse04`
2679 -- `HugeIcons.strokeRoundedMouse05`
2680 -- `HugeIcons.strokeRoundedMouse06`
2681 -- `HugeIcons.strokeRoundedMouse07`
2682 -- `HugeIcons.strokeRoundedMouse08`
2683 -- `HugeIcons.strokeRoundedMouse09`
2684 -- `HugeIcons.strokeRoundedMouse10`
2685 -- `HugeIcons.strokeRoundedMouse11`
2686 -- `HugeIcons.strokeRoundedMouse12`
2687 -- `HugeIcons.strokeRoundedMouse13`
2688 -- `HugeIcons.strokeRoundedMouse14`
2689 -- `HugeIcons.strokeRoundedMouse15`
2690 -- `HugeIcons.strokeRoundedMouse16`
2691 -- `HugeIcons.strokeRoundedMouse17`
2692 -- `HugeIcons.strokeRoundedMouse18`
2693 -- `HugeIcons.strokeRoundedMouse19`
2694 -- `HugeIcons.strokeRoundedMouse20`
2695 -- `HugeIcons.strokeRoundedMouse21`
2696 -- `HugeIcons.strokeRoundedMouse22`
2697 -- `HugeIcons.strokeRoundedMouse23`
2698 -- `HugeIcons.strokeRoundedMouseLeftClick01`
2699 -- `HugeIcons.strokeRoundedMouseLeftClick02`
2700 -- `HugeIcons.strokeRoundedMouseLeftClick03`
2701 -- `HugeIcons.strokeRoundedMouseLeftClick04`
2702 -- `HugeIcons.strokeRoundedMouseLeftClick05`
2703 -- `HugeIcons.strokeRoundedMouseLeftClick06`
2704 -- `HugeIcons.strokeRoundedMouseRightClick01`
2705 -- `HugeIcons.strokeRoundedMouseRightClick02`
2706 -- `HugeIcons.strokeRoundedMouseRightClick03`
2707 -- `HugeIcons.strokeRoundedMouseRightClick04`
2708 -- `HugeIcons.strokeRoundedMouseRightClick05`
2709 -- `HugeIcons.strokeRoundedMouseRightClick06`
2710 -- `HugeIcons.strokeRoundedMouseScroll01`
2711 -- `HugeIcons.strokeRoundedMouseScroll02`
2712 -- `HugeIcons.strokeRoundedMove01`
2713 -- `HugeIcons.strokeRoundedMove02`
2714 -- `HugeIcons.strokeRoundedMoveBottom`
2715 -- `HugeIcons.strokeRoundedMoveLeft`
2716 -- `HugeIcons.strokeRoundedMoveRight`
2717 -- `HugeIcons.strokeRoundedMove`
2718 -- `HugeIcons.strokeRoundedMoveTo`
2719 -- `HugeIcons.strokeRoundedMoveTop`
2720 -- `HugeIcons.strokeRoundedMp301`
2721 -- `HugeIcons.strokeRoundedMp302`
2722 -- `HugeIcons.strokeRoundedMp401`
2723 -- `HugeIcons.strokeRoundedMp402`
2724 -- `HugeIcons.strokeRoundedMuhammad`
2725 -- `HugeIcons.strokeRoundedMultiplicationSignCircle`
2726 -- `HugeIcons.strokeRoundedMultiplicationSignSquare`
2727 -- `HugeIcons.strokeRoundedMultiplicationSign`
2728 -- `HugeIcons.strokeRoundedMushroom01`
2729 -- `HugeIcons.strokeRoundedMushroom`
2730 -- `HugeIcons.strokeRoundedMusicNote01`
2731 -- `HugeIcons.strokeRoundedMusicNote02`
2732 -- `HugeIcons.strokeRoundedMusicNote03`
2733 -- `HugeIcons.strokeRoundedMusicNote04`
2734 -- `HugeIcons.strokeRoundedMusicNoteSquare01`
2735 -- `HugeIcons.strokeRoundedMusicNoteSquare02`
2736 -- `HugeIcons.strokeRoundedMuslim`
2737 -- `HugeIcons.strokeRoundedMute`
2738 -- `HugeIcons.strokeRoundedMymind`
2739 -- `HugeIcons.strokeRoundedNThRootCircle`
2740 -- `HugeIcons.strokeRoundedNThRootSquare`
2741 -- `HugeIcons.strokeRoundedNThRoot`
2742 -- `HugeIcons.strokeRoundedNanoTechnology`
2743 -- `HugeIcons.strokeRoundedNapkins01`
2744 -- `HugeIcons.strokeRoundedNapkins02`
2745 -- `HugeIcons.strokeRoundedNaturalFood`
2746 -- `HugeIcons.strokeRoundedNavigation01`
2747 -- `HugeIcons.strokeRoundedNavigation02`
2748 -- `HugeIcons.strokeRoundedNavigation03`
2749 -- `HugeIcons.strokeRoundedNavigation04`
2750 -- `HugeIcons.strokeRoundedNavigation05`
2751 -- `HugeIcons.strokeRoundedNavigation06`
2752 -- `HugeIcons.strokeRoundedNavigator01`
2753 -- `HugeIcons.strokeRoundedNavigator02`
2754 -- `HugeIcons.strokeRoundedNecklace`
2755 -- `HugeIcons.strokeRoundedNerd`
2756 -- `HugeIcons.strokeRoundedNeuralNetwork`
2757 -- `HugeIcons.strokeRoundedNeutral`
2758 -- `HugeIcons.strokeRoundedNewJob`
2759 -- `HugeIcons.strokeRoundedNewOffice`
2760 -- `HugeIcons.strokeRoundedNewReleases`
2761 -- `HugeIcons.strokeRoundedNewTwitterEllipse`
2762 -- `HugeIcons.strokeRoundedNewTwitterRectangle`
2763 -- `HugeIcons.strokeRoundedNewTwitter`
2764 -- `HugeIcons.strokeRoundedNews01`
2765 -- `HugeIcons.strokeRoundedNews`
2766 -- `HugeIcons.strokeRoundedNext`
2767 -- `HugeIcons.strokeRoundedNike`
2768 -- `HugeIcons.strokeRoundedNineCircle`
2769 -- `HugeIcons.strokeRoundedNineSquare`
2770 -- `HugeIcons.strokeRoundedNintendo`
2771 -- `HugeIcons.strokeRoundedNintendoSwitch`
2772 -- `HugeIcons.strokeRoundedNiqab`
2773 -- `HugeIcons.strokeRoundedNoInternet`
2774 -- `HugeIcons.strokeRoundedNoMeetingRoom`
2775 -- `HugeIcons.strokeRoundedNoSignal`
2776 -- `HugeIcons.strokeRoundedNodeAdd`
2777 -- `HugeIcons.strokeRoundedNodeEdit`
2778 -- `HugeIcons.strokeRoundedNodeMoveDown`
2779 -- `HugeIcons.strokeRoundedNodeMoveUp`
2780 -- `HugeIcons.strokeRoundedNodeRemove`
2781 -- `HugeIcons.strokeRoundedNoodles`
2782 -- `HugeIcons.strokeRoundedNose`
2783 -- `HugeIcons.strokeRoundedNotEqualSignCircle`
2784 -- `HugeIcons.strokeRoundedNotEqualSignSquare`
2785 -- `HugeIcons.strokeRoundedNotEqualSign`
2786 -- `HugeIcons.strokeRoundedNote01`
2787 -- `HugeIcons.strokeRoundedNote02`
2788 -- `HugeIcons.strokeRoundedNote03`
2789 -- `HugeIcons.strokeRoundedNote04`
2790 -- `HugeIcons.strokeRoundedNote05`
2791 -- `HugeIcons.strokeRoundedNoteAdd`
2792 -- `HugeIcons.strokeRoundedNoteDone`
2793 -- `HugeIcons.strokeRoundedNoteEdit`
2794 -- `HugeIcons.strokeRoundedNoteRemove`
2795 -- `HugeIcons.strokeRoundedNote`
2796 -- `HugeIcons.strokeRoundedNotebook01`
2797 -- `HugeIcons.strokeRoundedNotebook02`
2798 -- `HugeIcons.strokeRoundedNotebook`
2799 -- `HugeIcons.strokeRoundedNotification01`
2800 -- `HugeIcons.strokeRoundedNotification02`
2801 -- `HugeIcons.strokeRoundedNotification03`
2802 -- `HugeIcons.strokeRoundedNotificationBlock01`
2803 -- `HugeIcons.strokeRoundedNotificationBlock02`
2804 -- `HugeIcons.strokeRoundedNotificationBlock03`
2805 -- `HugeIcons.strokeRoundedNotificationBubble`
2806 -- `HugeIcons.strokeRoundedNotificationCircle`
2807 -- `HugeIcons.strokeRoundedNotificationOff01`
2808 -- `HugeIcons.strokeRoundedNotificationOff02`
2809 -- `HugeIcons.strokeRoundedNotificationOff03`
2810 -- `HugeIcons.strokeRoundedNotificationSnooze01`
2811 -- `HugeIcons.strokeRoundedNotificationSnooze02`
2812 -- `HugeIcons.strokeRoundedNotificationSnooze03`
2813 -- `HugeIcons.strokeRoundedNotificationSquare`
2814 -- `HugeIcons.strokeRoundedNotion01`
2815 -- `HugeIcons.strokeRoundedNotion02`
2816 -- `HugeIcons.strokeRoundedNpm`
2817 -- `HugeIcons.strokeRoundedNuclearPower`
2818 -- `HugeIcons.strokeRoundedNut`
2819 -- `HugeIcons.strokeRoundedObtuse`
2820 -- `HugeIcons.strokeRoundedOctagon`
2821 -- `HugeIcons.strokeRoundedOctopus`
2822 -- `HugeIcons.strokeRoundedOffice365`
2823 -- `HugeIcons.strokeRoundedOfficeChair`
2824 -- `HugeIcons.strokeRoundedOffice`
2825 -- `HugeIcons.strokeRoundedOilBarrel`
2826 -- `HugeIcons.strokeRoundedOkFinger`
2827 -- `HugeIcons.strokeRoundedOlympicTorch`
2828 -- `HugeIcons.strokeRoundedOneCircle`
2829 -- `HugeIcons.strokeRoundedOneSquare`
2830 -- `HugeIcons.strokeRoundedOnlineLearning01`
2831 -- `HugeIcons.strokeRoundedOnlineLearning02`
2832 -- `HugeIcons.strokeRoundedOnlineLearning03`
2833 -- `HugeIcons.strokeRoundedOnlineLearning04`
2834 -- `HugeIcons.strokeRoundedOpenCaption`
2835 -- `HugeIcons.strokeRoundedOpenSource`
2836 -- `HugeIcons.strokeRoundedOption`
2837 -- `HugeIcons.strokeRoundedOrange`
2838 -- `HugeIcons.strokeRoundedOrbit01`
2839 -- `HugeIcons.strokeRoundedOrbit02`
2840 -- `HugeIcons.strokeRoundedOrganicFood`
2841 -- `HugeIcons.strokeRoundedOrthogonalEdge`
2842 -- `HugeIcons.strokeRoundedOval`
2843 -- `HugeIcons.strokeRoundedOven`
2844 -- `HugeIcons.strokeRoundedPackage01`
2845 -- `HugeIcons.strokeRoundedPackage02`
2846 -- `HugeIcons.strokeRoundedPackage03`
2847 -- `HugeIcons.strokeRoundedPackageAdd01`
2848 -- `HugeIcons.strokeRoundedPackageAdd`
2849 -- `HugeIcons.strokeRoundedPackageDelivered01`
2850 -- `HugeIcons.strokeRoundedPackageDelivered`
2851 -- `HugeIcons.strokeRoundedPackageDimensions01`
2852 -- `HugeIcons.strokeRoundedPackageDimensions02`
2853 -- `HugeIcons.strokeRoundedPackageMoving01`
2854 -- `HugeIcons.strokeRoundedPackageMoving`
2855 -- `HugeIcons.strokeRoundedPackageOpen`
2856 -- `HugeIcons.strokeRoundedPackageOutOfStock`
2857 -- `HugeIcons.strokeRoundedPackageProcess01`
2858 -- `HugeIcons.strokeRoundedPackageProcess`
2859 -- `HugeIcons.strokeRoundedPackageReceive01`
2860 -- `HugeIcons.strokeRoundedPackageReceive`
2861 -- `HugeIcons.strokeRoundedPackageRemove01`
2862 -- `HugeIcons.strokeRoundedPackageRemove`
2863 -- `HugeIcons.strokeRoundedPackageSearch01`
2864 -- `HugeIcons.strokeRoundedPackageSearch`
2865 -- `HugeIcons.strokeRoundedPackageSent01`
2866 -- `HugeIcons.strokeRoundedPackageSent`
2867 -- `HugeIcons.strokeRoundedPackage`
2868 -- `HugeIcons.strokeRoundedPackaging`
2869 -- `HugeIcons.strokeRoundedPacman01`
2870 -- `HugeIcons.strokeRoundedPacman02`
2871 -- `HugeIcons.strokeRoundedPaella`
2872 -- `HugeIcons.strokeRoundedPaintBoard`
2873 -- `HugeIcons.strokeRoundedPaintBrush01`
2874 -- `HugeIcons.strokeRoundedPaintBrush02`
2875 -- `HugeIcons.strokeRoundedPaintBrush03`
2876 -- `HugeIcons.strokeRoundedPaintBrush04`
2877 -- `HugeIcons.strokeRoundedPaintBucket`
2878 -- `HugeIcons.strokeRoundedPan01`
2879 -- `HugeIcons.strokeRoundedPan02`
2880 -- `HugeIcons.strokeRoundedPan03`
2881 -- `HugeIcons.strokeRoundedParabola01`
2882 -- `HugeIcons.strokeRoundedParabola02`
2883 -- `HugeIcons.strokeRoundedParabola03`
2884 -- `HugeIcons.strokeRoundedParagliding`
2885 -- `HugeIcons.strokeRoundedParagraphBulletsPoint01`
2886 -- `HugeIcons.strokeRoundedParagraphBulletsPoint02`
2887 -- `HugeIcons.strokeRoundedParagraphSpacing`
2888 -- `HugeIcons.strokeRoundedParagraph`
2889 -- `HugeIcons.strokeRoundedParallelogram`
2890 -- `HugeIcons.strokeRoundedParkingAreaCircle`
2891 -- `HugeIcons.strokeRoundedParkingAreaSquare`
2892 -- `HugeIcons.strokeRoundedParty`
2893 -- `HugeIcons.strokeRoundedPassport01`
2894 -- `HugeIcons.strokeRoundedPassportExpired`
2895 -- `HugeIcons.strokeRoundedPassport`
2896 -- `HugeIcons.strokeRoundedPassportValid`
2897 -- `HugeIcons.strokeRoundedPasswordValidation`
2898 -- `HugeIcons.strokeRoundedPath`
2899 -- `HugeIcons.strokeRoundedPathfinderCrop`
2900 -- `HugeIcons.strokeRoundedPathfinderDivide`
2901 -- `HugeIcons.strokeRoundedPathfinderExclude`
2902 -- `HugeIcons.strokeRoundedPathfinderIntersect`
2903 -- `HugeIcons.strokeRoundedPathfinderMerge`
2904 -- `HugeIcons.strokeRoundedPathfinderMinusBack`
2905 -- `HugeIcons.strokeRoundedPathfinderMinusFront`
2906 -- `HugeIcons.strokeRoundedPathfinderOutline`
2907 -- `HugeIcons.strokeRoundedPathfinderTrim`
2908 -- `HugeIcons.strokeRoundedPathfinderUnite`
2909 -- `HugeIcons.strokeRoundedPatient`
2910 -- `HugeIcons.strokeRoundedPatio`
2911 -- `HugeIcons.strokeRoundedPauseCircle`
2912 -- `HugeIcons.strokeRoundedPause`
2913 -- `HugeIcons.strokeRoundedPavilon`
2914 -- `HugeIcons.strokeRoundedPayByCheck`
2915 -- `HugeIcons.strokeRoundedPayment01`
2916 -- `HugeIcons.strokeRoundedPayment02`
2917 -- `HugeIcons.strokeRoundedPaymentSuccess01`
2918 -- `HugeIcons.strokeRoundedPaymentSuccess02`
2919 -- `HugeIcons.strokeRoundedPayoneer`
2920 -- `HugeIcons.strokeRoundedPaypal`
2921 -- `HugeIcons.strokeRoundedPdf01`
2922 -- `HugeIcons.strokeRoundedPdf02`
2923 -- `HugeIcons.strokeRoundedPeerToPeer01`
2924 -- `HugeIcons.strokeRoundedPeerToPeer02`
2925 -- `HugeIcons.strokeRoundedPeerToPeer03`
2926 -- `HugeIcons.strokeRoundedPen01`
2927 -- `HugeIcons.strokeRoundedPen02`
2928 -- `HugeIcons.strokeRoundedPenConnectBluetooth`
2929 -- `HugeIcons.strokeRoundedPenConnectUsb`
2930 -- `HugeIcons.strokeRoundedPenConnectWifi`
2931 -- `HugeIcons.strokeRoundedPenTool01`
2932 -- `HugeIcons.strokeRoundedPenTool02`
2933 -- `HugeIcons.strokeRoundedPenTool03`
2934 -- `HugeIcons.strokeRoundedPenToolAdd`
2935 -- `HugeIcons.strokeRoundedPenToolMinus`
2936 -- `HugeIcons.strokeRoundedPencilEdit01`
2937 -- `HugeIcons.strokeRoundedPencilEdit02`
2938 -- `HugeIcons.strokeRoundedPencil`
2939 -- `HugeIcons.strokeRoundedPendulum`
2940 -- `HugeIcons.strokeRoundedPensive`
2941 -- `HugeIcons.strokeRoundedPentagon01`
2942 -- `HugeIcons.strokeRoundedPentagon`
2943 -- `HugeIcons.strokeRoundedPercentCircle`
2944 -- `HugeIcons.strokeRoundedPercentSquare`
2945 -- `HugeIcons.strokeRoundedPercent`
2946 -- `HugeIcons.strokeRoundedPerfume`
2947 -- `HugeIcons.strokeRoundedPeriscope`
2948 -- `HugeIcons.strokeRoundedPermanentJob`
2949 -- `HugeIcons.strokeRoundedPerplexityAi`
2950 -- `HugeIcons.strokeRoundedPerspective`
2951 -- `HugeIcons.strokeRoundedPetrolPump`
2952 -- `HugeIcons.strokeRoundedPexels`
2953 -- `HugeIcons.strokeRoundedPhoneArrowDown`
2954 -- `HugeIcons.strokeRoundedPhoneArrowUp`
2955 -- `HugeIcons.strokeRoundedPhoneCheck`
2956 -- `HugeIcons.strokeRoundedPhoneDeveloperMode`
2957 -- `HugeIcons.strokeRoundedPhoneErase`
2958 -- `HugeIcons.strokeRoundedPhoneLock`
2959 -- `HugeIcons.strokeRoundedPhoneOff01`
2960 -- `HugeIcons.strokeRoundedPhoneOff02`
2961 -- `HugeIcons.strokeRoundedPhp`
2962 -- `HugeIcons.strokeRoundedPhysics`
2963 -- `HugeIcons.strokeRoundedPiCircle`
2964 -- `HugeIcons.strokeRoundedPiSquare`
2965 -- `HugeIcons.strokeRoundedPi`
2966 -- `HugeIcons.strokeRoundedPicasa`
2967 -- `HugeIcons.strokeRoundedPickup01`
2968 -- `HugeIcons.strokeRoundedPickup02`
2969 -- `HugeIcons.strokeRoundedPictureInPictureExit`
2970 -- `HugeIcons.strokeRoundedPictureInPictureOn`
2971 -- `HugeIcons.strokeRoundedPieChart01`
2972 -- `HugeIcons.strokeRoundedPieChart02`
2973 -- `HugeIcons.strokeRoundedPieChart03`
2974 -- `HugeIcons.strokeRoundedPieChart04`
2975 -- `HugeIcons.strokeRoundedPieChart05`
2976 -- `HugeIcons.strokeRoundedPieChart06`
2977 -- `HugeIcons.strokeRoundedPieChart07`
2978 -- `HugeIcons.strokeRoundedPieChart08`
2979 -- `HugeIcons.strokeRoundedPieChart09`
2980 -- `HugeIcons.strokeRoundedPieChartSquare`
2981 -- `HugeIcons.strokeRoundedPieChart`
2982 -- `HugeIcons.strokeRoundedPie`
2983 -- `HugeIcons.strokeRoundedPiggyBank`
2984 -- `HugeIcons.strokeRoundedPin02`
2985 -- `HugeIcons.strokeRoundedPinCode`
2986 -- `HugeIcons.strokeRoundedPinLocation01`
2987 -- `HugeIcons.strokeRoundedPinLocation02`
2988 -- `HugeIcons.strokeRoundedPinLocation03`
2989 -- `HugeIcons.strokeRoundedPinOff`
2990 -- `HugeIcons.strokeRoundedPin`
2991 -- `HugeIcons.strokeRoundedPineTree`
2992 -- `HugeIcons.strokeRoundedPinterest`
2993 -- `HugeIcons.strokeRoundedPipeline`
2994 -- `HugeIcons.strokeRoundedPisaTower`
2995 -- `HugeIcons.strokeRoundedPivot`
2996 -- `HugeIcons.strokeRoundedPizza01`
2997 -- `HugeIcons.strokeRoundedPizza02`
2998 -- `HugeIcons.strokeRoundedPizza03`
2999 -- `HugeIcons.strokeRoundedPizza04`
3000 -- `HugeIcons.strokeRoundedPizzaCutter`
3001 -- `HugeIcons.strokeRoundedPlane`
3002 -- `HugeIcons.strokeRoundedPlant01`
3003 -- `HugeIcons.strokeRoundedPlant02`
3004 -- `HugeIcons.strokeRoundedPlant03`
3005 -- `HugeIcons.strokeRoundedPlant04`
3006 -- `HugeIcons.strokeRoundedPlate`
3007 -- `HugeIcons.strokeRoundedPlaxo`
3008 -- `HugeIcons.strokeRoundedPlayCircle02`
3009 -- `HugeIcons.strokeRoundedPlayCircle`
3010 -- `HugeIcons.strokeRoundedPlayListAdd`
3011 -- `HugeIcons.strokeRoundedPlayListFavourite01`
3012 -- `HugeIcons.strokeRoundedPlayListFavourite02`
3013 -- `HugeIcons.strokeRoundedPlayListMinus`
3014 -- `HugeIcons.strokeRoundedPlayListRemove`
3015 -- `HugeIcons.strokeRoundedPlayList`
3016 -- `HugeIcons.strokeRoundedPlaySquare`
3017 -- `HugeIcons.strokeRoundedPlayStore`
3018 -- `HugeIcons.strokeRoundedPlay`
3019 -- `HugeIcons.strokeRoundedPlaylist01`
3020 -- `HugeIcons.strokeRoundedPlaylist02`
3021 -- `HugeIcons.strokeRoundedPlaylist03`
3022 -- `HugeIcons.strokeRoundedPlaza`
3023 -- `HugeIcons.strokeRoundedPlug01`
3024 -- `HugeIcons.strokeRoundedPlug02`
3025 -- `HugeIcons.strokeRoundedPlugSocket`
3026 -- `HugeIcons.strokeRoundedPlusMinus01`
3027 -- `HugeIcons.strokeRoundedPlusMinus02`
3028 -- `HugeIcons.strokeRoundedPlusMinusCircle01`
3029 -- `HugeIcons.strokeRoundedPlusMinusCircle02`
3030 -- `HugeIcons.strokeRoundedPlusMinusSquare01`
3031 -- `HugeIcons.strokeRoundedPlusMinusSquare02`
3032 -- `HugeIcons.strokeRoundedPlusMinus`
3033 -- `HugeIcons.strokeRoundedPlusSignCircle`
3034 -- `HugeIcons.strokeRoundedPlusSignSquare`
3035 -- `HugeIcons.strokeRoundedPlusSign`
3036 -- `HugeIcons.strokeRoundedPng01`
3037 -- `HugeIcons.strokeRoundedPng02`
3038 -- `HugeIcons.strokeRoundedPodcast`
3039 -- `HugeIcons.strokeRoundedPodium`
3040 -- `HugeIcons.strokeRoundedPointingLeft01`
3041 -- `HugeIcons.strokeRoundedPointingLeft02`
3042 -- `HugeIcons.strokeRoundedPointingLeft03`
3043 -- `HugeIcons.strokeRoundedPointingLeft04`
3044 -- `HugeIcons.strokeRoundedPointingLeft05`
3045 -- `HugeIcons.strokeRoundedPointingLeft06`
3046 -- `HugeIcons.strokeRoundedPointingLeft07`
3047 -- `HugeIcons.strokeRoundedPointingLeft08`
3048 -- `HugeIcons.strokeRoundedPointingRight01`
3049 -- `HugeIcons.strokeRoundedPointingRight02`
3050 -- `HugeIcons.strokeRoundedPointingRight03`
3051 -- `HugeIcons.strokeRoundedPointingRight04`
3052 -- `HugeIcons.strokeRoundedPointingRight05`
3053 -- `HugeIcons.strokeRoundedPointingRight06`
3054 -- `HugeIcons.strokeRoundedPointingRight07`
3055 -- `HugeIcons.strokeRoundedPointingRight08`
3056 -- `HugeIcons.strokeRoundedPokeball`
3057 -- `HugeIcons.strokeRoundedPokemon`
3058 -- `HugeIcons.strokeRoundedPoliceBadge`
3059 -- `HugeIcons.strokeRoundedPoliceCap`
3060 -- `HugeIcons.strokeRoundedPoliceCar`
3061 -- `HugeIcons.strokeRoundedPoliceStation`
3062 -- `HugeIcons.strokeRoundedPolicy`
3063 -- `HugeIcons.strokeRoundedPolyTank`
3064 -- `HugeIcons.strokeRoundedPolygon`
3065 -- `HugeIcons.strokeRoundedPool`
3066 -- `HugeIcons.strokeRoundedPoolTable`
3067 -- `HugeIcons.strokeRoundedPoop`
3068 -- `HugeIcons.strokeRoundedPopcorn`
3069 -- `HugeIcons.strokeRoundedPot01`
3070 -- `HugeIcons.strokeRoundedPot02`
3071 -- `HugeIcons.strokeRoundedPotion`
3072 -- `HugeIcons.strokeRoundedPoundCircle`
3073 -- `HugeIcons.strokeRoundedPoundReceive`
3074 -- `HugeIcons.strokeRoundedPoundSend`
3075 -- `HugeIcons.strokeRoundedPoundSquare`
3076 -- `HugeIcons.strokeRoundedPound`
3077 -- `HugeIcons.strokeRoundedPowerService`
3078 -- `HugeIcons.strokeRoundedPowerSocket01`
3079 -- `HugeIcons.strokeRoundedPowerSocket02`
3080 -- `HugeIcons.strokeRoundedPpt01`
3081 -- `HugeIcons.strokeRoundedPpt02`
3082 -- `HugeIcons.strokeRoundedPrawn`
3083 -- `HugeIcons.strokeRoundedPrayerRug01`
3084 -- `HugeIcons.strokeRoundedPrayerRug02`
3085 -- `HugeIcons.strokeRoundedPreferenceHorizontal`
3086 -- `HugeIcons.strokeRoundedPreferenceVertical`
3087 -- `HugeIcons.strokeRoundedPrescription`
3088 -- `HugeIcons.strokeRoundedPresentation01`
3089 -- `HugeIcons.strokeRoundedPresentation02`
3090 -- `HugeIcons.strokeRoundedPresentation03`
3091 -- `HugeIcons.strokeRoundedPresentation04`
3092 -- `HugeIcons.strokeRoundedPresentation05`
3093 -- `HugeIcons.strokeRoundedPresentation06`
3094 -- `HugeIcons.strokeRoundedPresentation07`
3095 -- `HugeIcons.strokeRoundedPresentationBarChart01`
3096 -- `HugeIcons.strokeRoundedPresentationBarChart02`
3097 -- `HugeIcons.strokeRoundedPresentationLineChart01`
3098 -- `HugeIcons.strokeRoundedPresentationLineChart02`
3099 -- `HugeIcons.strokeRoundedPresentationOnline`
3100 -- `HugeIcons.strokeRoundedPresentationPodium`
3101 -- `HugeIcons.strokeRoundedPrevious`
3102 -- `HugeIcons.strokeRoundedPrinter3d`
3103 -- `HugeIcons.strokeRoundedPrinterOff`
3104 -- `HugeIcons.strokeRoundedPrinter`
3105 -- `HugeIcons.strokeRoundedPrism01`
3106 -- `HugeIcons.strokeRoundedPrism`
3107 -- `HugeIcons.strokeRoundedPrisonGuard`
3108 -- `HugeIcons.strokeRoundedPrison`
3109 -- `HugeIcons.strokeRoundedPrisoner`
3110 -- `HugeIcons.strokeRoundedProductLoading`
3111 -- `HugeIcons.strokeRoundedProfile02`
3112 -- `HugeIcons.strokeRoundedProfile`
3113 -- `HugeIcons.strokeRoundedProfit`
3114 -- `HugeIcons.strokeRoundedProgrammingFlag`
3115 -- `HugeIcons.strokeRoundedProgress01`
3116 -- `HugeIcons.strokeRoundedProgress02`
3117 -- `HugeIcons.strokeRoundedProgress03`
3118 -- `HugeIcons.strokeRoundedProgress04`
3119 -- `HugeIcons.strokeRoundedProgress`
3120 -- `HugeIcons.strokeRoundedProjector01`
3121 -- `HugeIcons.strokeRoundedProjector`
3122 -- `HugeIcons.strokeRoundedPromotion`
3123 -- `HugeIcons.strokeRoundedPropertyAdd`
3124 -- `HugeIcons.strokeRoundedPropertyDelete`
3125 -- `HugeIcons.strokeRoundedPropertyEdit`
3126 -- `HugeIcons.strokeRoundedPropertyNew`
3127 -- `HugeIcons.strokeRoundedPropertySearch`
3128 -- `HugeIcons.strokeRoundedPropertyView`
3129 -- `HugeIcons.strokeRoundedProtectionMask`
3130 -- `HugeIcons.strokeRoundedPulley`
3131 -- `HugeIcons.strokeRoundedPulse01`
3132 -- `HugeIcons.strokeRoundedPulse02`
3133 -- `HugeIcons.strokeRoundedPulseRectangle01`
3134 -- `HugeIcons.strokeRoundedPulseRectangle02`
3135 -- `HugeIcons.strokeRoundedPumpkin`
3136 -- `HugeIcons.strokeRoundedPunch`
3137 -- `HugeIcons.strokeRoundedPunchingBall01`
3138 -- `HugeIcons.strokeRoundedPunchingBall02`
3139 -- `HugeIcons.strokeRoundedPurse01`
3140 -- `HugeIcons.strokeRoundedPurse`
3141 -- `HugeIcons.strokeRoundedPushUpBar`
3142 -- `HugeIcons.strokeRoundedPuzzle`
3143 -- `HugeIcons.strokeRoundedPyramidMaslowo`
3144 -- `HugeIcons.strokeRoundedPyramid`
3145 -- `HugeIcons.strokeRoundedPyramidStructure01`
3146 -- `HugeIcons.strokeRoundedPyramidStructure02`
3147 -- `HugeIcons.strokeRoundedPython`
3148 -- `HugeIcons.strokeRoundedQqPlot`
3149 -- `HugeIcons.strokeRoundedQrCode01`
3150 -- `HugeIcons.strokeRoundedQrCode`
3151 -- `HugeIcons.strokeRoundedQuestion`
3152 -- `HugeIcons.strokeRoundedQueue01`
3153 -- `HugeIcons.strokeRoundedQueue02`
3154 -- `HugeIcons.strokeRoundedQuillWrite01`
3155 -- `HugeIcons.strokeRoundedQuillWrite02`
3156 -- `HugeIcons.strokeRoundedQuiz01`
3157 -- `HugeIcons.strokeRoundedQuiz02`
3158 -- `HugeIcons.strokeRoundedQuiz03`
3159 -- `HugeIcons.strokeRoundedQuiz04`
3160 -- `HugeIcons.strokeRoundedQuiz05`
3161 -- `HugeIcons.strokeRoundedQuora`
3162 -- `HugeIcons.strokeRoundedQuoteDownCircle`
3163 -- `HugeIcons.strokeRoundedQuoteDownSquare`
3164 -- `HugeIcons.strokeRoundedQuoteDown`
3165 -- `HugeIcons.strokeRoundedQuoteUpCircle`
3166 -- `HugeIcons.strokeRoundedQuoteUpSquare`
3167 -- `HugeIcons.strokeRoundedQuoteUp`
3168 -- `HugeIcons.strokeRoundedQuotes`
3169 -- `HugeIcons.strokeRoundedQuran01`
3170 -- `HugeIcons.strokeRoundedQuran02`
3171 -- `HugeIcons.strokeRoundedQuran03`
3172 -- `HugeIcons.strokeRoundedQwen`
3173 -- `HugeIcons.strokeRoundedRacingFlag`
3174 -- `HugeIcons.strokeRoundedRadar01`
3175 -- `HugeIcons.strokeRoundedRadar02`
3176 -- `HugeIcons.strokeRoundedRadial`
3177 -- `HugeIcons.strokeRoundedRadio01`
3178 -- `HugeIcons.strokeRoundedRadio02`
3179 -- `HugeIcons.strokeRoundedRadioButton`
3180 -- `HugeIcons.strokeRoundedRadio`
3181 -- `HugeIcons.strokeRoundedRadioactiveAlert`
3182 -- `HugeIcons.strokeRoundedRadius`
3183 -- `HugeIcons.strokeRoundedRainDoubleDrop`
3184 -- `HugeIcons.strokeRoundedRainDrop`
3185 -- `HugeIcons.strokeRoundedRain`
3186 -- `HugeIcons.strokeRoundedRainbow`
3187 -- `HugeIcons.strokeRoundedRamadhan01`
3188 -- `HugeIcons.strokeRoundedRamadhan02`
3189 -- `HugeIcons.strokeRoundedRamadhanMonth`
3190 -- `HugeIcons.strokeRoundedRanking`
3191 -- `HugeIcons.strokeRoundedRar01`
3192 -- `HugeIcons.strokeRoundedRar02`
3193 -- `HugeIcons.strokeRoundedRaw01`
3194 -- `HugeIcons.strokeRoundedRaw02`
3195 -- `HugeIcons.strokeRoundedRe`
3196 -- `HugeIcons.strokeRoundedReact`
3197 -- `HugeIcons.strokeRoundedRealEstate01`
3198 -- `HugeIcons.strokeRoundedRealEstate02`
3199 -- `HugeIcons.strokeRoundedReceiptDollar`
3200 -- `HugeIcons.strokeRoundedRecord`
3201 -- `HugeIcons.strokeRoundedRecoveryMail`
3202 -- `HugeIcons.strokeRoundedRectangular01`
3203 -- `HugeIcons.strokeRoundedRectangular`
3204 -- `HugeIcons.strokeRoundedRecycle01`
3205 -- `HugeIcons.strokeRoundedRecycle02`
3206 -- `HugeIcons.strokeRoundedRecycle03`
3207 -- `HugeIcons.strokeRoundedReddit`
3208 -- `HugeIcons.strokeRoundedRedo02`
3209 -- `HugeIcons.strokeRoundedRedo03`
3210 -- `HugeIcons.strokeRoundedRedo`
3211 -- `HugeIcons.strokeRoundedReflex`
3212 -- `HugeIcons.strokeRoundedRefresh`
3213 -- `HugeIcons.strokeRoundedRefrigerator`
3214 -- `HugeIcons.strokeRoundedRegister`
3215 -- `HugeIcons.strokeRoundedRegistered`
3216 -- `HugeIcons.strokeRoundedRelieved01`
3217 -- `HugeIcons.strokeRoundedRelieved02`
3218 -- `HugeIcons.strokeRoundedReload`
3219 -- `HugeIcons.strokeRoundedReminder`
3220 -- `HugeIcons.strokeRoundedRemoteControl`
3221 -- `HugeIcons.strokeRoundedRemove01`
3222 -- `HugeIcons.strokeRoundedRemove02`
3223 -- `HugeIcons.strokeRoundedRemoveCircleHalfDot`
3224 -- `HugeIcons.strokeRoundedRemoveCircle`
3225 -- `HugeIcons.strokeRoundedRemoveFemale`
3226 -- `HugeIcons.strokeRoundedRemoveMale`
3227 -- `HugeIcons.strokeRoundedRemovePi`
3228 -- `HugeIcons.strokeRoundedRemoveSquare`
3229 -- `HugeIcons.strokeRoundedRenewableEnergy01`
3230 -- `HugeIcons.strokeRoundedRenewableEnergy`
3231 -- `HugeIcons.strokeRoundedRepair`
3232 -- `HugeIcons.strokeRoundedRepeatOff`
3233 -- `HugeIcons.strokeRoundedRepeatOne01`
3234 -- `HugeIcons.strokeRoundedRepeatOne02`
3235 -- `HugeIcons.strokeRoundedRepeat`
3236 -- `HugeIcons.strokeRoundedReplay`
3237 -- `HugeIcons.strokeRoundedReplit`
3238 -- `HugeIcons.strokeRoundedRepository`
3239 -- `HugeIcons.strokeRoundedResetPassword`
3240 -- `HugeIcons.strokeRoundedResize01`
3241 -- `HugeIcons.strokeRoundedResize02`
3242 -- `HugeIcons.strokeRoundedResizeFieldRectangle`
3243 -- `HugeIcons.strokeRoundedResizeField`
3244 -- `HugeIcons.strokeRoundedResourcesAdd`
3245 -- `HugeIcons.strokeRoundedResourcesRemove`
3246 -- `HugeIcons.strokeRoundedRestaurant01`
3247 -- `HugeIcons.strokeRoundedRestaurant02`
3248 -- `HugeIcons.strokeRoundedRestaurant03`
3249 -- `HugeIcons.strokeRoundedRestaurant`
3250 -- `HugeIcons.strokeRoundedRestaurantTable`
3251 -- `HugeIcons.strokeRoundedRestoreBin`
3252 -- `HugeIcons.strokeRoundedReturnRequest`
3253 -- `HugeIcons.strokeRoundedReverseWithdrawal01`
3254 -- `HugeIcons.strokeRoundedReverseWithdrawal02`
3255 -- `HugeIcons.strokeRoundedRhombus01`
3256 -- `HugeIcons.strokeRoundedRhombus`
3257 -- `HugeIcons.strokeRoundedRiceBowl01`
3258 -- `HugeIcons.strokeRoundedRiceBowl02`
3259 -- `HugeIcons.strokeRoundedRightAngle`
3260 -- `HugeIcons.strokeRoundedRightToLeftBlockQuote`
3261 -- `HugeIcons.strokeRoundedRightToLeftListBullet`
3262 -- `HugeIcons.strokeRoundedRightToLeftListDash`
3263 -- `HugeIcons.strokeRoundedRightToLeftListNumber`
3264 -- `HugeIcons.strokeRoundedRightToLeftListTriangle`
3265 -- `HugeIcons.strokeRoundedRightTriangle`
3266 -- `HugeIcons.strokeRoundedRipple`
3267 -- `HugeIcons.strokeRoundedRiyalRectangle`
3268 -- `HugeIcons.strokeRoundedRiyal`
3269 -- `HugeIcons.strokeRoundedRoad01`
3270 -- `HugeIcons.strokeRoundedRoad02`
3271 -- `HugeIcons.strokeRoundedRoadLocation01`
3272 -- `HugeIcons.strokeRoundedRoadLocation02`
3273 -- `HugeIcons.strokeRoundedRoad`
3274 -- `HugeIcons.strokeRoundedRoadWayside`
3275 -- `HugeIcons.strokeRoundedRobot01`
3276 -- `HugeIcons.strokeRoundedRobot02`
3277 -- `HugeIcons.strokeRoundedRobotic`
3278 -- `HugeIcons.strokeRoundedRocket01`
3279 -- `HugeIcons.strokeRoundedRocket02`
3280 -- `HugeIcons.strokeRoundedRocket`
3281 -- `HugeIcons.strokeRoundedRockingChair`
3282 -- `HugeIcons.strokeRoundedRockingHorse`
3283 -- `HugeIcons.strokeRoundedRollerSkate`
3284 -- `HugeIcons.strokeRoundedRollingPin`
3285 -- `HugeIcons.strokeRoundedRoot01`
3286 -- `HugeIcons.strokeRoundedRoot02`
3287 -- `HugeIcons.strokeRoundedRoot1stBracket`
3288 -- `HugeIcons.strokeRoundedRoot1stBrecket`
3289 -- `HugeIcons.strokeRoundedRoot2ndBracket`
3290 -- `HugeIcons.strokeRoundedRoot2ndBrecket`
3291 -- `HugeIcons.strokeRoundedRoot3rdBracket`
3292 -- `HugeIcons.strokeRoundedRoot3rdBrecket`
3293 -- `HugeIcons.strokeRoundedRootCircle`
3294 -- `HugeIcons.strokeRoundedRotate01`
3295 -- `HugeIcons.strokeRoundedRotate02`
3296 -- `HugeIcons.strokeRoundedRotate360`
3297 -- `HugeIcons.strokeRoundedRotateBottomLeft`
3298 -- `HugeIcons.strokeRoundedRotateBottomRight`
3299 -- `HugeIcons.strokeRoundedRotateClockwise`
3300 -- `HugeIcons.strokeRoundedRotateCrop`
3301 -- `HugeIcons.strokeRoundedRotateLeft01`
3302 -- `HugeIcons.strokeRoundedRotateLeft02`
3303 -- `HugeIcons.strokeRoundedRotateLeft03`
3304 -- `HugeIcons.strokeRoundedRotateLeft04`
3305 -- `HugeIcons.strokeRoundedRotateLeft05`
3306 -- `HugeIcons.strokeRoundedRotateLeft06`
3307 -- `HugeIcons.strokeRoundedRotateRight01`
3308 -- `HugeIcons.strokeRoundedRotateRight02`
3309 -- `HugeIcons.strokeRoundedRotateRight03`
3310 -- `HugeIcons.strokeRoundedRotateRight04`
3311 -- `HugeIcons.strokeRoundedRotateRight05`
3312 -- `HugeIcons.strokeRoundedRotateRight06`
3313 -- `HugeIcons.strokeRoundedRotateSquare`
3314 -- `HugeIcons.strokeRoundedRotateTopLeft`
3315 -- `HugeIcons.strokeRoundedRotateTopRight`
3316 -- `HugeIcons.strokeRoundedRoute01`
3317 -- `HugeIcons.strokeRoundedRoute02`
3318 -- `HugeIcons.strokeRoundedRoute03`
3319 -- `HugeIcons.strokeRoundedRouteBlock`
3320 -- `HugeIcons.strokeRoundedRouter01`
3321 -- `HugeIcons.strokeRoundedRouter02`
3322 -- `HugeIcons.strokeRoundedRouter`
3323 -- `HugeIcons.strokeRoundedRowDelete`
3324 -- `HugeIcons.strokeRoundedRowInsert`
3325 -- `HugeIcons.strokeRoundedRssConnected01`
3326 -- `HugeIcons.strokeRoundedRssConnected02`
3327 -- `HugeIcons.strokeRoundedRssError`
3328 -- `HugeIcons.strokeRoundedRssLocked`
3329 -- `HugeIcons.strokeRoundedRss`
3330 -- `HugeIcons.strokeRoundedRssUnlocked`
3331 -- `HugeIcons.strokeRoundedRubElHizb`
3332 -- `HugeIcons.strokeRoundedRubberDuck`
3333 -- `HugeIcons.strokeRoundedRubiksCube`
3334 -- `HugeIcons.strokeRoundedRuku`
3335 -- `HugeIcons.strokeRoundedRuler`
3336 -- `HugeIcons.strokeRoundedRunningShoes`
3337 -- `HugeIcons.strokeRoundedSad01`
3338 -- `HugeIcons.strokeRoundedSad02`
3339 -- `HugeIcons.strokeRoundedSadDizzy`
3340 -- `HugeIcons.strokeRoundedSafari`
3341 -- `HugeIcons.strokeRoundedSafeDelivery01`
3342 -- `HugeIcons.strokeRoundedSafeDelivery02`
3343 -- `HugeIcons.strokeRoundedSafe`
3344 -- `HugeIcons.strokeRoundedSafetyPin01`
3345 -- `HugeIcons.strokeRoundedSafetyPin02`
3346 -- `HugeIcons.strokeRoundedSailboatCoastal`
3347 -- `HugeIcons.strokeRoundedSailboatOffshore`
3348 -- `HugeIcons.strokeRoundedSakura`
3349 -- `HugeIcons.strokeRoundedSalah`
3350 -- `HugeIcons.strokeRoundedSalahTime`
3351 -- `HugeIcons.strokeRoundedSaleTag01`
3352 -- `HugeIcons.strokeRoundedSaleTag02`
3353 -- `HugeIcons.strokeRoundedSandals`
3354 -- `HugeIcons.strokeRoundedSatellite01`
3355 -- `HugeIcons.strokeRoundedSatellite02`
3356 -- `HugeIcons.strokeRoundedSatellite03`
3357 -- `HugeIcons.strokeRoundedSatellite`
3358 -- `HugeIcons.strokeRoundedSaturn01`
3359 -- `HugeIcons.strokeRoundedSaturn02`
3360 -- `HugeIcons.strokeRoundedSaturn`
3361 -- `HugeIcons.strokeRoundedSausage`
3362 -- `HugeIcons.strokeRoundedSaveEnergy01`
3363 -- `HugeIcons.strokeRoundedSaveEnergy02`
3364 -- `HugeIcons.strokeRoundedSaveMoneyDollar`
3365 -- `HugeIcons.strokeRoundedSaveMoneyEuro`
3366 -- `HugeIcons.strokeRoundedSaveMoneyPound`
3367 -- `HugeIcons.strokeRoundedSaveMoneyYen`
3368 -- `HugeIcons.strokeRoundedSavings`
3369 -- `HugeIcons.strokeRoundedScheme`
3370 -- `HugeIcons.strokeRoundedSchool01`
3371 -- `HugeIcons.strokeRoundedSchoolBell01`
3372 -- `HugeIcons.strokeRoundedSchoolBell02`
3373 -- `HugeIcons.strokeRoundedSchoolBus`
3374 -- `HugeIcons.strokeRoundedSchoolReportCard`
3375 -- `HugeIcons.strokeRoundedSchool`
3376 -- `HugeIcons.strokeRoundedSchoolTie`
3377 -- `HugeIcons.strokeRoundedScissor01`
3378 -- `HugeIcons.strokeRoundedScissorRectangle`
3379 -- `HugeIcons.strokeRoundedScissor`
3380 -- `HugeIcons.strokeRoundedScooter01`
3381 -- `HugeIcons.strokeRoundedScooter02`
3382 -- `HugeIcons.strokeRoundedScooter03`
3383 -- `HugeIcons.strokeRoundedScooter04`
3384 -- `HugeIcons.strokeRoundedScooterElectric`
3385 -- `HugeIcons.strokeRoundedScratchCard`
3386 -- `HugeIcons.strokeRoundedScreenAddToHome02`
3387 -- `HugeIcons.strokeRoundedScreenAddToHome`
3388 -- `HugeIcons.strokeRoundedScreenLockRotation`
3389 -- `HugeIcons.strokeRoundedScreenRotation`
3390 -- `HugeIcons.strokeRoundedScribd`
3391 -- `HugeIcons.strokeRoundedScrollHorizontal`
3392 -- `HugeIcons.strokeRoundedScroll`
3393 -- `HugeIcons.strokeRoundedScrollVertical`
3394 -- `HugeIcons.strokeRoundedSdCard`
3395 -- `HugeIcons.strokeRoundedSeal`
3396 -- `HugeIcons.strokeRoundedSearch01`
3397 -- `HugeIcons.strokeRoundedSearch02`
3398 -- `HugeIcons.strokeRoundedSearchAdd`
3399 -- `HugeIcons.strokeRoundedSearchArea`
3400 -- `HugeIcons.strokeRoundedSearchCircle`
3401 -- `HugeIcons.strokeRoundedSearchDollar`
3402 -- `HugeIcons.strokeRoundedSearchFocus`
3403 -- `HugeIcons.strokeRoundedSearchList01`
3404 -- `HugeIcons.strokeRoundedSearchList02`
3405 -- `HugeIcons.strokeRoundedSearchMinus`
3406 -- `HugeIcons.strokeRoundedSearchRemove`
3407 -- `HugeIcons.strokeRoundedSearchReplace`
3408 -- `HugeIcons.strokeRoundedSearchSquare`
3409 -- `HugeIcons.strokeRoundedSearchVisual`
3410 -- `HugeIcons.strokeRoundedSearching`
3411 -- `HugeIcons.strokeRoundedSeatSelector`
3412 -- `HugeIcons.strokeRoundedSecuredNetwork`
3413 -- `HugeIcons.strokeRoundedSecurityBlock`
3414 -- `HugeIcons.strokeRoundedSecurityCheck`
3415 -- `HugeIcons.strokeRoundedSecurityKeyUsb`
3416 -- `HugeIcons.strokeRoundedSecurityLock`
3417 -- `HugeIcons.strokeRoundedSecurityPassword`
3418 -- `HugeIcons.strokeRoundedSecurity`
3419 -- `HugeIcons.strokeRoundedSecurityValidation`
3420 -- `HugeIcons.strokeRoundedSecurityWifi`
3421 -- `HugeIcons.strokeRoundedSeesaw`
3422 -- `HugeIcons.strokeRoundedSegment`
3423 -- `HugeIcons.strokeRoundedSelect01`
3424 -- `HugeIcons.strokeRoundedSelect02`
3425 -- `HugeIcons.strokeRoundedSelfTransfer`
3426 -- `HugeIcons.strokeRoundedSemiTruck`
3427 -- `HugeIcons.strokeRoundedSendToMobile02`
3428 -- `HugeIcons.strokeRoundedSendToMobile`
3429 -- `HugeIcons.strokeRoundedSendingOrder`
3430 -- `HugeIcons.strokeRoundedSenseless`
3431 -- `HugeIcons.strokeRoundedSent02`
3432 -- `HugeIcons.strokeRoundedSent`
3433 -- `HugeIcons.strokeRoundedSeo`
3434 -- `HugeIcons.strokeRoundedServerStack01`
3435 -- `HugeIcons.strokeRoundedServerStack02`
3436 -- `HugeIcons.strokeRoundedServerStack03`
3437 -- `HugeIcons.strokeRoundedService`
3438 -- `HugeIcons.strokeRoundedServingFood`
3439 -- `HugeIcons.strokeRoundedSetting06`
3440 -- `HugeIcons.strokeRoundedSetting07`
3441 -- `HugeIcons.strokeRoundedSettingDone01`
3442 -- `HugeIcons.strokeRoundedSettingDone02`
3443 -- `HugeIcons.strokeRoundedSettingDone03`
3444 -- `HugeIcons.strokeRoundedSettingDone04`
3445 -- `HugeIcons.strokeRoundedSettingError03`
3446 -- `HugeIcons.strokeRoundedSettingError04`
3447 -- `HugeIcons.strokeRoundedSettings01`
3448 -- `HugeIcons.strokeRoundedSettings02`
3449 -- `HugeIcons.strokeRoundedSettings03`
3450 -- `HugeIcons.strokeRoundedSettings04`
3451 -- `HugeIcons.strokeRoundedSettings05`
3452 -- `HugeIcons.strokeRoundedSettingsError01`
3453 -- `HugeIcons.strokeRoundedSettingsError02`
3454 -- `HugeIcons.strokeRoundedSetup01`
3455 -- `HugeIcons.strokeRoundedSetup02`
3456 -- `HugeIcons.strokeRoundedSevenCircle`
3457 -- `HugeIcons.strokeRoundedSevenSquare`
3458 -- `HugeIcons.strokeRoundedShaka01`
3459 -- `HugeIcons.strokeRoundedShaka02`
3460 -- `HugeIcons.strokeRoundedShaka03`
3461 -- `HugeIcons.strokeRoundedShaka04`
3462 -- `HugeIcons.strokeRoundedShampoo`
3463 -- `HugeIcons.strokeRoundedShapeCollection`
3464 -- `HugeIcons.strokeRoundedShapes`
3465 -- `HugeIcons.strokeRoundedShare01`
3466 -- `HugeIcons.strokeRoundedShare02`
3467 -- `HugeIcons.strokeRoundedShare03`
3468 -- `HugeIcons.strokeRoundedShare04`
3469 -- `HugeIcons.strokeRoundedShare05`
3470 -- `HugeIcons.strokeRoundedShare06`
3471 -- `HugeIcons.strokeRoundedShare07`
3472 -- `HugeIcons.strokeRoundedShare08`
3473 -- `HugeIcons.strokeRoundedShareKnowledge`
3474 -- `HugeIcons.strokeRoundedShareLocation01`
3475 -- `HugeIcons.strokeRoundedShareLocation02`
3476 -- `HugeIcons.strokeRoundedSharedDrive`
3477 -- `HugeIcons.strokeRoundedSharedWifi`
3478 -- `HugeIcons.strokeRoundedSharing`
3479 -- `HugeIcons.strokeRoundedShellfish`
3480 -- `HugeIcons.strokeRoundedSheriff01`
3481 -- `HugeIcons.strokeRoundedSheriff02`
3482 -- `HugeIcons.strokeRoundedShield01`
3483 -- `HugeIcons.strokeRoundedShield02`
3484 -- `HugeIcons.strokeRoundedShieldBlockchain`
3485 -- `HugeIcons.strokeRoundedShieldEnergy`
3486 -- `HugeIcons.strokeRoundedShieldKey`
3487 -- `HugeIcons.strokeRoundedShieldUser`
3488 -- `HugeIcons.strokeRoundedShipmentTracking`
3489 -- `HugeIcons.strokeRoundedShippingCenter`
3490 -- `HugeIcons.strokeRoundedShippingLoading`
3491 -- `HugeIcons.strokeRoundedShippingTruck01`
3492 -- `HugeIcons.strokeRoundedShippingTruck02`
3493 -- `HugeIcons.strokeRoundedShirt01`
3494 -- `HugeIcons.strokeRoundedShocked`
3495 -- `HugeIcons.strokeRoundedShopSign`
3496 -- `HugeIcons.strokeRoundedShopify`
3497 -- `HugeIcons.strokeRoundedShoppingBag01`
3498 -- `HugeIcons.strokeRoundedShoppingBag02`
3499 -- `HugeIcons.strokeRoundedShoppingBag03`
3500 -- `HugeIcons.strokeRoundedShoppingBagAdd`
3501 -- `HugeIcons.strokeRoundedShoppingBagCheck`
3502 -- `HugeIcons.strokeRoundedShoppingBagFavorite`
3503 -- `HugeIcons.strokeRoundedShoppingBagRemove`
3504 -- `HugeIcons.strokeRoundedShoppingBasket01`
3505 -- `HugeIcons.strokeRoundedShoppingBasket02`
3506 -- `HugeIcons.strokeRoundedShoppingBasket03`
3507 -- `HugeIcons.strokeRoundedShoppingBasketAdd01`
3508 -- `HugeIcons.strokeRoundedShoppingBasketAdd02`
3509 -- `HugeIcons.strokeRoundedShoppingBasketAdd03`
3510 -- `HugeIcons.strokeRoundedShoppingBasketCheckIn01`
3511 -- `HugeIcons.strokeRoundedShoppingBasketCheckIn02`
3512 -- `HugeIcons.strokeRoundedShoppingBasketCheckIn03`
3513 -- `HugeIcons.strokeRoundedShoppingBasketCheckOut01`
3514 -- `HugeIcons.strokeRoundedShoppingBasketCheckOut02`
3515 -- `HugeIcons.strokeRoundedShoppingBasketCheckOut03`
3516 -- `HugeIcons.strokeRoundedShoppingBasketDone01`
3517 -- `HugeIcons.strokeRoundedShoppingBasketDone02`
3518 -- `HugeIcons.strokeRoundedShoppingBasketDone03`
3519 -- `HugeIcons.strokeRoundedShoppingBasketFavorite01`
3520 -- `HugeIcons.strokeRoundedShoppingBasketFavorite02`
3521 -- `HugeIcons.strokeRoundedShoppingBasketFavorite03`
3522 -- `HugeIcons.strokeRoundedShoppingBasketRemove01`
3523 -- `HugeIcons.strokeRoundedShoppingBasketRemove02`
3524 -- `HugeIcons.strokeRoundedShoppingBasketRemove03`
3525 -- `HugeIcons.strokeRoundedShoppingBasketSecure01`
3526 -- `HugeIcons.strokeRoundedShoppingBasketSecure02`
3527 -- `HugeIcons.strokeRoundedShoppingBasketSecure03`
3528 -- `HugeIcons.strokeRoundedShoppingCart01`
3529 -- `HugeIcons.strokeRoundedShoppingCart02`
3530 -- `HugeIcons.strokeRoundedShoppingCartAdd01`
3531 -- `HugeIcons.strokeRoundedShoppingCartAdd02`
3532 -- `HugeIcons.strokeRoundedShoppingCartCheck01`
3533 -- `HugeIcons.strokeRoundedShoppingCartCheck02`
3534 -- `HugeIcons.strokeRoundedShoppingCartCheckIn01`
3535 -- `HugeIcons.strokeRoundedShoppingCartCheckIn02`
3536 -- `HugeIcons.strokeRoundedShoppingCartCheckOut01`
3537 -- `HugeIcons.strokeRoundedShoppingCartCheckOut02`
3538 -- `HugeIcons.strokeRoundedShoppingCartFavorite01`
3539 -- `HugeIcons.strokeRoundedShoppingCartFavorite02`
3540 -- `HugeIcons.strokeRoundedShoppingCartRemove01`
3541 -- `HugeIcons.strokeRoundedShoppingCartRemove02`
3542 -- `HugeIcons.strokeRoundedShortsPants`
3543 -- `HugeIcons.strokeRoundedShoulder`
3544 -- `HugeIcons.strokeRoundedShuffleSquare`
3545 -- `HugeIcons.strokeRoundedShuffle`
3546 -- `HugeIcons.strokeRoundedShutDown`
3547 -- `HugeIcons.strokeRoundedShutterstock`
3548 -- `HugeIcons.strokeRoundedSidebarBottom`
3549 -- `HugeIcons.strokeRoundedSidebarLeft01`
3550 -- `HugeIcons.strokeRoundedSidebarLeft`
3551 -- `HugeIcons.strokeRoundedSidebarRight01`
3552 -- `HugeIcons.strokeRoundedSidebarRight`
3553 -- `HugeIcons.strokeRoundedSidebarTop`
3554 -- `HugeIcons.strokeRoundedSignLanguageC`
3555 -- `HugeIcons.strokeRoundedSignalFull01`
3556 -- `HugeIcons.strokeRoundedSignalFull02`
3557 -- `HugeIcons.strokeRoundedSignalLow01`
3558 -- `HugeIcons.strokeRoundedSignalLow02`
3559 -- `HugeIcons.strokeRoundedSignalLowMedium`
3560 -- `HugeIcons.strokeRoundedSignalMedium01`
3561 -- `HugeIcons.strokeRoundedSignalMedium02`
3562 -- `HugeIcons.strokeRoundedSignalNo01`
3563 -- `HugeIcons.strokeRoundedSignalNo02`
3564 -- `HugeIcons.strokeRoundedSignal`
3565 -- `HugeIcons.strokeRoundedSignature`
3566 -- `HugeIcons.strokeRoundedSilence`
3567 -- `HugeIcons.strokeRoundedSimcard01`
3568 -- `HugeIcons.strokeRoundedSimcard02`
3569 -- `HugeIcons.strokeRoundedSimcardDual`
3570 -- `HugeIcons.strokeRoundedSin`
3571 -- `HugeIcons.strokeRoundedSine01`
3572 -- `HugeIcons.strokeRoundedSine02`
3573 -- `HugeIcons.strokeRoundedSingLeft`
3574 -- `HugeIcons.strokeRoundedSingRight`
3575 -- `HugeIcons.strokeRoundedSingleFire`
3576 -- `HugeIcons.strokeRoundedSink01`
3577 -- `HugeIcons.strokeRoundedSink02`
3578 -- `HugeIcons.strokeRoundedSiriNew`
3579 -- `HugeIcons.strokeRoundedSiri`
3580 -- `HugeIcons.strokeRoundedSixCircle`
3581 -- `HugeIcons.strokeRoundedSixSquare`
3582 -- `HugeIcons.strokeRoundedSketch`
3583 -- `HugeIcons.strokeRoundedSkew`
3584 -- `HugeIcons.strokeRoundedSki`
3585 -- `HugeIcons.strokeRoundedSkippingRope`
3586 -- `HugeIcons.strokeRoundedSkool`
3587 -- `HugeIcons.strokeRoundedSkull`
3588 -- `HugeIcons.strokeRoundedSkype`
3589 -- `HugeIcons.strokeRoundedSlack`
3590 -- `HugeIcons.strokeRoundedSleeping`
3591 -- `HugeIcons.strokeRoundedSleeveless`
3592 -- `HugeIcons.strokeRoundedSlide`
3593 -- `HugeIcons.strokeRoundedSlidersHorizontal`
3594 -- `HugeIcons.strokeRoundedSlidersVertical`
3595 -- `HugeIcons.strokeRoundedSlideshare`
3596 -- `HugeIcons.strokeRoundedSlowWinds`
3597 -- `HugeIcons.strokeRoundedSmartAc`
3598 -- `HugeIcons.strokeRoundedSmartPhone01`
3599 -- `HugeIcons.strokeRoundedSmartPhone02`
3600 -- `HugeIcons.strokeRoundedSmartPhone03`
3601 -- `HugeIcons.strokeRoundedSmartPhone04`
3602 -- `HugeIcons.strokeRoundedSmartPhoneLandscape02`
3603 -- `HugeIcons.strokeRoundedSmartPhoneLandscape`
3604 -- `HugeIcons.strokeRoundedSmart`
3605 -- `HugeIcons.strokeRoundedSmartWatch01`
3606 -- `HugeIcons.strokeRoundedSmartWatch02`
3607 -- `HugeIcons.strokeRoundedSmartWatch03`
3608 -- `HugeIcons.strokeRoundedSmartWatch04`
3609 -- `HugeIcons.strokeRoundedSmartphoneLostWifi`
3610 -- `HugeIcons.strokeRoundedSmartphoneWifi`
3611 -- `HugeIcons.strokeRoundedSmileDizzy`
3612 -- `HugeIcons.strokeRoundedSmile`
3613 -- `HugeIcons.strokeRoundedSmsCode`
3614 -- `HugeIcons.strokeRoundedSnail`
3615 -- `HugeIcons.strokeRoundedSnapchat`
3616 -- `HugeIcons.strokeRoundedSnow`
3617 -- `HugeIcons.strokeRoundedSocks`
3618 -- `HugeIcons.strokeRoundedSodaCan`
3619 -- `HugeIcons.strokeRoundedSofa01`
3620 -- `HugeIcons.strokeRoundedSofa02`
3621 -- `HugeIcons.strokeRoundedSofa03`
3622 -- `HugeIcons.strokeRoundedSofaSingle`
3623 -- `HugeIcons.strokeRoundedSoftDrink01`
3624 -- `HugeIcons.strokeRoundedSoftDrink02`
3625 -- `HugeIcons.strokeRoundedSoftwareLicense`
3626 -- `HugeIcons.strokeRoundedSoftware`
3627 -- `HugeIcons.strokeRoundedSoftwareUninstall`
3628 -- `HugeIcons.strokeRoundedSoilMoistureField`
3629 -- `HugeIcons.strokeRoundedSoilMoistureGlobal`
3630 -- `HugeIcons.strokeRoundedSoilTemperatureField`
3631 -- `HugeIcons.strokeRoundedSoilTemperatureGlobal`
3632 -- `HugeIcons.strokeRoundedSolarEnergy`
3633 -- `HugeIcons.strokeRoundedSolarPanel01`
3634 -- `HugeIcons.strokeRoundedSolarPanel02`
3635 -- `HugeIcons.strokeRoundedSolarPanel03`
3636 -- `HugeIcons.strokeRoundedSolarPanel04`
3637 -- `HugeIcons.strokeRoundedSolarPanel05`
3638 -- `HugeIcons.strokeRoundedSolarPower`
3639 -- `HugeIcons.strokeRoundedSolarSystem01`
3640 -- `HugeIcons.strokeRoundedSolarSystem`
3641 -- `HugeIcons.strokeRoundedSolidLine01`
3642 -- `HugeIcons.strokeRoundedSolidLine02`
3643 -- `HugeIcons.strokeRoundedSortByDown01`
3644 -- `HugeIcons.strokeRoundedSortByDown02`
3645 -- `HugeIcons.strokeRoundedSortByUp01`
3646 -- `HugeIcons.strokeRoundedSortByUp02`
3647 -- `HugeIcons.strokeRoundedSorting01`
3648 -- `HugeIcons.strokeRoundedSorting02`
3649 -- `HugeIcons.strokeRoundedSorting03`
3650 -- `HugeIcons.strokeRoundedSorting04`
3651 -- `HugeIcons.strokeRoundedSorting05`
3652 -- `HugeIcons.strokeRoundedSorting19`
3653 -- `HugeIcons.strokeRoundedSorting91`
3654 -- `HugeIcons.strokeRoundedSortingAZ01`
3655 -- `HugeIcons.strokeRoundedSortingAZ02`
3656 -- `HugeIcons.strokeRoundedSortingDown`
3657 -- `HugeIcons.strokeRoundedSortingUp`
3658 -- `HugeIcons.strokeRoundedSortingZA01`
3659 -- `HugeIcons.strokeRoundedSoundcloud`
3660 -- `HugeIcons.strokeRoundedSourceCodeCircle`
3661 -- `HugeIcons.strokeRoundedSourceCodeSquare`
3662 -- `HugeIcons.strokeRoundedSourceCode`
3663 -- `HugeIcons.strokeRoundedSpaceship`
3664 -- `HugeIcons.strokeRoundedSpades`
3665 -- `HugeIcons.strokeRoundedSpaghetti`
3666 -- `HugeIcons.strokeRoundedSpam`
3667 -- `HugeIcons.strokeRoundedSparkles`
3668 -- `HugeIcons.strokeRoundedSpartanHelmet`
3669 -- `HugeIcons.strokeRoundedSpatula`
3670 -- `HugeIcons.strokeRoundedSpeaker01`
3671 -- `HugeIcons.strokeRoundedSpeaker`
3672 -- `HugeIcons.strokeRoundedSpeechToText`
3673 -- `HugeIcons.strokeRoundedSpeedTrain01`
3674 -- `HugeIcons.strokeRoundedSpeedTrain02`
3675 -- `HugeIcons.strokeRoundedSperm`
3676 -- `HugeIcons.strokeRoundedSphere`
3677 -- `HugeIcons.strokeRoundedSpirals`
3678 -- `HugeIcons.strokeRoundedSpoonAndFork`
3679 -- `HugeIcons.strokeRoundedSpoonAndKnife`
3680 -- `HugeIcons.strokeRoundedSpoon`
3681 -- `HugeIcons.strokeRoundedSpotify`
3682 -- `HugeIcons.strokeRoundedSql`
3683 -- `HugeIcons.strokeRoundedSquare01`
3684 -- `HugeIcons. static const List<List<dynamic>>`
3685 -- `HugeIcons. static const List<List<dynamic>>`
3686 -- `HugeIcons. static const List<List<dynamic>>`
3687 -- `HugeIcons.strokeRoundedSquareArrowDiagonal01`
3688 -- `HugeIcons.strokeRoundedSquareArrowDiagonal02`
3689 -- `HugeIcons.strokeRoundedSquareArrowDown01`
3690 -- `HugeIcons.strokeRoundedSquareArrowDown02`
3691 -- `HugeIcons.strokeRoundedSquareArrowDown03`
3692 -- `HugeIcons.strokeRoundedSquareArrowDownDouble`
3693 -- `HugeIcons.strokeRoundedSquareArrowDownLeft`
3694 -- `HugeIcons.strokeRoundedSquareArrowDownRight`
3695 -- `HugeIcons.strokeRoundedSquareArrowExpand01`
3696 -- `HugeIcons.strokeRoundedSquareArrowExpand02`
3697 -- `HugeIcons.strokeRoundedSquareArrowHorizontal`
3698 -- `HugeIcons.strokeRoundedSquareArrowLeft01`
3699 -- `HugeIcons.strokeRoundedSquareArrowLeft02`
3700 -- `HugeIcons.strokeRoundedSquareArrowLeft03`
3701 -- `HugeIcons.strokeRoundedSquareArrowLeftDouble`
3702 -- `HugeIcons.strokeRoundedSquareArrowLeftRight`
3703 -- `HugeIcons.strokeRoundedSquareArrowMoveDownLeft`
3704 -- `HugeIcons.strokeRoundedSquareArrowMoveDownRight`
3705 -- `HugeIcons.strokeRoundedSquareArrowMoveLeftDown`
3706 -- `HugeIcons.strokeRoundedSquareArrowMoveLeftUp`
3707 -- `HugeIcons.strokeRoundedSquareArrowMoveRightDown`
3708 -- `HugeIcons.strokeRoundedSquareArrowMoveRightUp`
3709 -- `HugeIcons.strokeRoundedSquareArrowReload01`
3710 -- `HugeIcons.strokeRoundedSquareArrowReload02`
3711 -- `HugeIcons.strokeRoundedSquareArrowRight01`
3712 -- `HugeIcons.strokeRoundedSquareArrowRight02`
3713 -- `HugeIcons.strokeRoundedSquareArrowRight03`
3714 -- `HugeIcons.strokeRoundedSquareArrowRightDouble`
3715 -- `HugeIcons.strokeRoundedSquareArrowShrink01`
3716 -- `HugeIcons.strokeRoundedSquareArrowShrink02`
3717 -- `HugeIcons.strokeRoundedSquareArrowUp01`
3718 -- `HugeIcons.strokeRoundedSquareArrowUp02`
3719 -- `HugeIcons.strokeRoundedSquareArrowUp03`
3720 -- `HugeIcons.strokeRoundedSquareArrowUpDouble`
3721 -- `HugeIcons.strokeRoundedSquareArrowUpDown`
3722 -- `HugeIcons.strokeRoundedSquareArrowUpLeft`
3723 -- `HugeIcons.strokeRoundedSquareArrowUpRight02`
3724 -- `HugeIcons.strokeRoundedSquareArrowUpRight`
3725 -- `HugeIcons.strokeRoundedSquareArrowVertical`
3726 -- `HugeIcons.strokeRoundedSquareCircle`
3727 -- `HugeIcons.strokeRoundedSquareLock01`
3728 -- `HugeIcons.strokeRoundedSquareLock02`
3729 -- `HugeIcons.strokeRoundedSquareLockAdd01`
3730 -- `HugeIcons.strokeRoundedSquareLockAdd02`
3731 -- `HugeIcons.strokeRoundedSquareLockCheck01`
3732 -- `HugeIcons.strokeRoundedSquareLockCheck02`
3733 -- `HugeIcons.strokeRoundedSquareLockMinus01`
3734 -- `HugeIcons.strokeRoundedSquareLockMinus02`
3735 -- `HugeIcons.strokeRoundedSquareLockPassword`
3736 -- `HugeIcons.strokeRoundedSquareLockRemove01`
3737 -- `HugeIcons.strokeRoundedSquareLockRemove02`
3738 -- `HugeIcons.strokeRoundedSquareRootSquare`
3739 -- `HugeIcons.strokeRoundedSquareSingleFire`
3740 -- `HugeIcons.strokeRoundedSquareSquare`
3741 -- `HugeIcons.strokeRoundedSquare`
3742 -- `HugeIcons.strokeRoundedSquareUnlock01`
3743 -- `HugeIcons.strokeRoundedSquareUnlock02`
3744 -- `HugeIcons.strokeRoundedStackStar`
3745 -- `HugeIcons.strokeRoundedStairs01`
3746 -- `HugeIcons.strokeRoundedStairs02`
3747 -- `HugeIcons.strokeRoundedStairs03`
3748 -- `HugeIcons.strokeRoundedStairs04`
3749 -- `HugeIcons.strokeRoundedStake`
3750 -- `HugeIcons.strokeRoundedStamp01`
3751 -- `HugeIcons.strokeRoundedStamp02`
3752 -- `HugeIcons.strokeRoundedStamp`
3753 -- `HugeIcons.strokeRoundedStarAward01`
3754 -- `HugeIcons.strokeRoundedStarAward02`
3755 -- `HugeIcons.strokeRoundedStarCircle`
3756 -- `HugeIcons.strokeRoundedStarFace`
3757 -- `HugeIcons.strokeRoundedStarHalf`
3758 -- `HugeIcons.strokeRoundedStarOff`
3759 -- `HugeIcons.strokeRoundedStarSquare`
3760 -- `HugeIcons.strokeRoundedStar`
3761 -- `HugeIcons.strokeRoundedStars`
3762 -- `HugeIcons.strokeRoundedStartUp01`
3763 -- `HugeIcons.strokeRoundedStartUp02`
3764 -- `HugeIcons.strokeRoundedStationery`
3765 -- `HugeIcons.strokeRoundedStatus`
3766 -- `HugeIcons.strokeRoundedSteak`
3767 -- `HugeIcons.strokeRoundedSteering`
3768 -- `HugeIcons.strokeRoundedStepInto`
3769 -- `HugeIcons.strokeRoundedStepOut`
3770 -- `HugeIcons.strokeRoundedStepOver`
3771 -- `HugeIcons.strokeRoundedStethoscope02`
3772 -- `HugeIcons.strokeRoundedStethoscope`
3773 -- `HugeIcons.strokeRoundedStickyNote01`
3774 -- `HugeIcons.strokeRoundedStickyNote02`
3775 -- `HugeIcons.strokeRoundedStickyNote03`
3776 -- `HugeIcons.strokeRoundedStopCircle`
3777 -- `HugeIcons.strokeRoundedStopLossOrder`
3778 -- `HugeIcons.strokeRoundedStop`
3779 -- `HugeIcons.strokeRoundedStopWatch`
3780 -- `HugeIcons.strokeRoundedStore01`
3781 -- `HugeIcons.strokeRoundedStore02`
3782 -- `HugeIcons.strokeRoundedStore03`
3783 -- `HugeIcons.strokeRoundedStore04`
3784 -- `HugeIcons.strokeRoundedStoreAdd01`
3785 -- `HugeIcons.strokeRoundedStoreAdd02`
3786 -- `HugeIcons.strokeRoundedStoreLocation01`
3787 -- `HugeIcons.strokeRoundedStoreLocation02`
3788 -- `HugeIcons.strokeRoundedStoreManagement01`
3789 -- `HugeIcons.strokeRoundedStoreManagement02`
3790 -- `HugeIcons.strokeRoundedStoreRemove01`
3791 -- `HugeIcons.strokeRoundedStoreRemove02`
3792 -- `HugeIcons.strokeRoundedStoreVerified01`
3793 -- `HugeIcons.strokeRoundedStoreVerified02`
3794 -- `HugeIcons.strokeRoundedStraightEdge`
3795 -- `HugeIcons.strokeRoundedStrategy`
3796 -- `HugeIcons.strokeRoundedStreeringWheel`
3797 -- `HugeIcons.strokeRoundedStreetFood`
3798 -- `HugeIcons.strokeRoundedStripe`
3799 -- `HugeIcons.strokeRoundedStrokeBottom`
3800 -- `HugeIcons.strokeRoundedStrokeCenter`
3801 -- `HugeIcons.strokeRoundedStrokeInside`
3802 -- `HugeIcons.strokeRoundedStrokeLeft`
3803 -- `HugeIcons.strokeRoundedStrokeOutside`
3804 -- `HugeIcons.strokeRoundedStrokeRight`
3805 -- `HugeIcons.strokeRoundedStrokeTop`
3806 -- `HugeIcons.strokeRoundedStructure01`
3807 -- `HugeIcons.strokeRoundedStructure02`
3808 -- `HugeIcons.strokeRoundedStructure03`
3809 -- `HugeIcons.strokeRoundedStructure04`
3810 -- `HugeIcons.strokeRoundedStructure05`
3811 -- `HugeIcons.strokeRoundedStructureAdd`
3812 -- `HugeIcons.strokeRoundedStructureCheck`
3813 -- `HugeIcons.strokeRoundedStructureFail`
3814 -- `HugeIcons.strokeRoundedStructureFolderCircle`
3815 -- `HugeIcons.strokeRoundedStructureFolder`
3816 -- `HugeIcons.strokeRoundedStudentCard`
3817 -- `HugeIcons.strokeRoundedStudent`
3818 -- `HugeIcons.strokeRoundedStudents`
3819 -- `HugeIcons.strokeRoundedStudyDesk`
3820 -- `HugeIcons.strokeRoundedStudyLamp`
3821 -- `HugeIcons.strokeRoundedStumbleupon`
3822 -- `HugeIcons.strokeRoundedSubmarine`
3823 -- `HugeIcons.strokeRoundedSubmerge`
3824 -- `HugeIcons.strokeRoundedSubnodeAdd`
3825 -- `HugeIcons.strokeRoundedSubnodeDelete`
3826 -- `HugeIcons.strokeRoundedSubpoena`
3827 -- `HugeIcons.strokeRoundedSubtitle`
3828 -- `HugeIcons.strokeRoundedSuit01`
3829 -- `HugeIcons.strokeRoundedSuit02`
3830 -- `HugeIcons.strokeRoundedSujood`
3831 -- `HugeIcons.strokeRoundedSummation01`
3832 -- `HugeIcons.strokeRoundedSummation02`
3833 -- `HugeIcons.strokeRoundedSummationCircle`
3834 -- `HugeIcons.strokeRoundedSummationSquare`
3835 -- `HugeIcons.strokeRoundedSun01`
3836 -- `HugeIcons.strokeRoundedSun02`
3837 -- `HugeIcons.strokeRoundedSun03`
3838 -- `HugeIcons.strokeRoundedSunCloud01`
3839 -- `HugeIcons.strokeRoundedSunCloud02`
3840 -- `HugeIcons.strokeRoundedSunCloudAngledRain01`
3841 -- `HugeIcons.strokeRoundedSunCloudAngledRain02`
3842 -- `HugeIcons.strokeRoundedSunCloudAngledRainZap01`
3843 -- `HugeIcons.strokeRoundedSunCloudAngledRainZap02`
3844 -- `HugeIcons.strokeRoundedSunCloudAngledZap01`
3845 -- `HugeIcons.strokeRoundedSunCloudAngledZap02`
3846 -- `HugeIcons.strokeRoundedSunCloudBigRain01`
3847 -- `HugeIcons.strokeRoundedSunCloudBigRain02`
3848 -- `HugeIcons.strokeRoundedSunCloudFastWind01`
3849 -- `HugeIcons.strokeRoundedSunCloudFastWind02`
3850 -- `HugeIcons.strokeRoundedSunCloudHailstone01`
3851 -- `HugeIcons.strokeRoundedSunCloudHailstone02`
3852 -- `HugeIcons.strokeRoundedSunCloudLittleRain01`
3853 -- `HugeIcons.strokeRoundedSunCloudLittleRain02`
3854 -- `HugeIcons.strokeRoundedSunCloudLittleSnow01`
3855 -- `HugeIcons.strokeRoundedSunCloudLittleSnow02`
3856 -- `HugeIcons.strokeRoundedSunCloudMidRain01`
3857 -- `HugeIcons.strokeRoundedSunCloudMidRain02`
3858 -- `HugeIcons.strokeRoundedSunCloudMidSnow01`
3859 -- `HugeIcons.strokeRoundedSunCloudMidSnow02`
3860 -- `HugeIcons.strokeRoundedSunCloudSlowWind01`
3861 -- `HugeIcons.strokeRoundedSunCloudSlowWind02`
3862 -- `HugeIcons.strokeRoundedSunCloudSnow01`
3863 -- `HugeIcons.strokeRoundedSunCloudSnow02`
3864 -- `HugeIcons.strokeRoundedSunglasses`
3865 -- `HugeIcons.strokeRoundedSunrise`
3866 -- `HugeIcons.strokeRoundedSunset`
3867 -- `HugeIcons.strokeRoundedSuperMario`
3868 -- `HugeIcons.strokeRoundedSuperMarioToad`
3869 -- `HugeIcons.strokeRoundedSurfboard`
3870 -- `HugeIcons.strokeRoundedSurprise`
3871 -- `HugeIcons.strokeRoundedSushi01`
3872 -- `HugeIcons.strokeRoundedSushi02`
3873 -- `HugeIcons.strokeRoundedSushi03`
3874 -- `HugeIcons.strokeRoundedSuspicious`
3875 -- `HugeIcons.strokeRoundedSustainableEnergy`
3876 -- `HugeIcons.strokeRoundedSvg01`
3877 -- `HugeIcons.strokeRoundedSvg02`
3878 -- `HugeIcons.strokeRoundedSwarm`
3879 -- `HugeIcons.strokeRoundedSwatch`
3880 -- `HugeIcons.strokeRoundedSwimmingCap`
3881 -- `HugeIcons.strokeRoundedSwimming`
3882 -- `HugeIcons.strokeRoundedSwipeDown01`
3883 -- `HugeIcons.strokeRoundedSwipeDown02`
3884 -- `HugeIcons.strokeRoundedSwipeDown03`
3885 -- `HugeIcons.strokeRoundedSwipeDown04`
3886 -- `HugeIcons.strokeRoundedSwipeDown05`
3887 -- `HugeIcons.strokeRoundedSwipeDown06`
3888 -- `HugeIcons.strokeRoundedSwipeDown07`
3889 -- `HugeIcons.strokeRoundedSwipeDown08`
3890 -- `HugeIcons.strokeRoundedSwipeLeft01`
3891 -- `HugeIcons.strokeRoundedSwipeLeft02`
3892 -- `HugeIcons.strokeRoundedSwipeLeft03`
3893 -- `HugeIcons.strokeRoundedSwipeLeft04`
3894 -- `HugeIcons.strokeRoundedSwipeLeft05`
3895 -- `HugeIcons.strokeRoundedSwipeLeft06`
3896 -- `HugeIcons.strokeRoundedSwipeLeft07`
3897 -- `HugeIcons.strokeRoundedSwipeLeft08`
3898 -- `HugeIcons.strokeRoundedSwipeLeft09`
3899 -- `HugeIcons.strokeRoundedSwipeRight01`
3900 -- `HugeIcons.strokeRoundedSwipeRight02`
3901 -- `HugeIcons.strokeRoundedSwipeRight03`
3902 -- `HugeIcons.strokeRoundedSwipeRight04`
3903 -- `HugeIcons.strokeRoundedSwipeRight05`
3904 -- `HugeIcons.strokeRoundedSwipeRight06`
3905 -- `HugeIcons.strokeRoundedSwipeRight07`
3906 -- `HugeIcons.strokeRoundedSwipeRight08`
3907 -- `HugeIcons.strokeRoundedSwipeRight09`
3908 -- `HugeIcons.strokeRoundedSwipeUp01`
3909 -- `HugeIcons.strokeRoundedSwipeUp02`
3910 -- `HugeIcons.strokeRoundedSwipeUp03`
3911 -- `HugeIcons.strokeRoundedSwipeUp04`
3912 -- `HugeIcons.strokeRoundedSwipeUp05`
3913 -- `HugeIcons.strokeRoundedSwipeUp06`
3914 -- `HugeIcons.strokeRoundedSwipeUp07`
3915 -- `HugeIcons.strokeRoundedSwipeUp08`
3916 -- `HugeIcons.strokeRoundedSword01`
3917 -- `HugeIcons.strokeRoundedSword02`
3918 -- `HugeIcons.strokeRoundedSword03`
3919 -- `HugeIcons.strokeRoundedSystemUpdate01`
3920 -- `HugeIcons.strokeRoundedSystemUpdate02`
3921 -- `HugeIcons.strokeRoundedTShirt`
3922 -- `HugeIcons.strokeRoundedTable01`
3923 -- `HugeIcons.strokeRoundedTable02`
3924 -- `HugeIcons.strokeRoundedTable03`
3925 -- `HugeIcons.strokeRoundedTableLamp01`
3926 -- `HugeIcons.strokeRoundedTableLamp02`
3927 -- `HugeIcons.strokeRoundedTableRound`
3928 -- `HugeIcons.strokeRoundedTable`
3929 -- `HugeIcons.strokeRoundedTableTennisBat`
3930 -- `HugeIcons.strokeRoundedTablet01`
3931 -- `HugeIcons.strokeRoundedTablet02`
3932 -- `HugeIcons.strokeRoundedTabletConnectedBluetooth`
3933 -- `HugeIcons.strokeRoundedTabletConnectedUsb`
3934 -- `HugeIcons.strokeRoundedTabletConnectedWifi`
3935 -- `HugeIcons.strokeRoundedTabletPen`
3936 -- `HugeIcons.strokeRoundedTaco01`
3937 -- `HugeIcons.strokeRoundedTaco02`
3938 -- `HugeIcons.strokeRoundedTag01`
3939 -- `HugeIcons.strokeRoundedTag02`
3940 -- `HugeIcons.strokeRoundedTags`
3941 -- `HugeIcons.strokeRoundedTailwindcss`
3942 -- `HugeIcons.strokeRoundedTajMahal`
3943 -- `HugeIcons.strokeRoundedTan`
3944 -- `HugeIcons.strokeRoundedTankTop`
3945 -- `HugeIcons.strokeRoundedTankerTruck`
3946 -- `HugeIcons.strokeRoundedTap01`
3947 -- `HugeIcons.strokeRoundedTap02`
3948 -- `HugeIcons.strokeRoundedTap03`
3949 -- `HugeIcons.strokeRoundedTap04`
3950 -- `HugeIcons.strokeRoundedTap05`
3951 -- `HugeIcons.strokeRoundedTap06`
3952 -- `HugeIcons.strokeRoundedTap07`
3953 -- `HugeIcons.strokeRoundedTap08`
3954 -- `HugeIcons.strokeRoundedTapeMeasure`
3955 -- `HugeIcons.strokeRoundedTarget01`
3956 -- `HugeIcons.strokeRoundedTarget02`
3957 -- `HugeIcons.strokeRoundedTarget03`
3958 -- `HugeIcons.strokeRoundedTargetDollar`
3959 -- `HugeIcons.strokeRoundedTasbih`
3960 -- `HugeIcons.strokeRoundedTask01`
3961 -- `HugeIcons.strokeRoundedTask02`
3962 -- `HugeIcons.strokeRoundedTaskAdd01`
3963 -- `HugeIcons.strokeRoundedTaskAdd02`
3964 -- `HugeIcons.strokeRoundedTaskDaily01`
3965 -- `HugeIcons.strokeRoundedTaskDaily02`
3966 -- `HugeIcons.strokeRoundedTaskDone01`
3967 -- `HugeIcons.strokeRoundedTaskDone02`
3968 -- `HugeIcons.strokeRoundedTaskEdit01`
3969 -- `HugeIcons.strokeRoundedTaskEdit02`
3970 -- `HugeIcons.strokeRoundedTaskRemove01`
3971 -- `HugeIcons.strokeRoundedTaskRemove02`
3972 -- `HugeIcons.strokeRoundedTaxes`
3973 -- `HugeIcons.strokeRoundedTaxi02`
3974 -- `HugeIcons.strokeRoundedTaxi`
3975 -- `HugeIcons.strokeRoundedTeaPod`
3976 -- `HugeIcons.strokeRoundedTea`
3977 -- `HugeIcons.strokeRoundedTeacher`
3978 -- `HugeIcons.strokeRoundedTeaching`
3979 -- `HugeIcons.strokeRoundedTeamviewer`
3980 -- `HugeIcons.strokeRoundedTelegram`
3981 -- `HugeIcons.strokeRoundedTelephone`
3982 -- `HugeIcons.strokeRoundedTelescope01`
3983 -- `HugeIcons.strokeRoundedTelescope02`
3984 -- `HugeIcons.strokeRoundedTelevisionTable`
3985 -- `HugeIcons.strokeRoundedTemperature`
3986 -- `HugeIcons.strokeRoundedTennisBall`
3987 -- `HugeIcons.strokeRoundedTennisRacket`
3988 -- `HugeIcons.strokeRoundedTerrace`
3989 -- `HugeIcons.strokeRoundedTestTube01`
3990 -- `HugeIcons.strokeRoundedTestTube02`
3991 -- `HugeIcons.strokeRoundedTestTube03`
3992 -- `HugeIcons.strokeRoundedTestTube`
3993 -- `HugeIcons.strokeRoundedTetris`
3994 -- `HugeIcons.strokeRoundedTextAlignCenter`
3995 -- `HugeIcons.strokeRoundedTextAlignJustifyCenter`
3996 -- `HugeIcons.strokeRoundedTextAlignJustifyLeft`
3997 -- `HugeIcons.strokeRoundedTextAlignJustifyRight`
3998 -- `HugeIcons.strokeRoundedTextAlignLeft01`
3999 -- `HugeIcons.strokeRoundedTextAlignLeft`
4000 -- `HugeIcons.strokeRoundedTextAlignRight01`
4001 -- `HugeIcons.strokeRoundedTextAlignRight`
4002 -- `HugeIcons.strokeRoundedTextAllCaps`
4003 -- `HugeIcons.strokeRoundedTextBold`
4004 -- `HugeIcons.strokeRoundedTextCenterlineCenterTop`
4005 -- `HugeIcons.strokeRoundedTextCenterlineLeft`
4006 -- `HugeIcons.strokeRoundedTextCenterlineMiddle`
4007 -- `HugeIcons.strokeRoundedTextCenterlineRight`
4008 -- `HugeIcons.strokeRoundedTextCheck`
4009 -- `HugeIcons.strokeRoundedTextCircle`
4010 -- `HugeIcons.strokeRoundedTextClear`
4011 -- `HugeIcons.strokeRoundedTextColor`
4012 -- `HugeIcons.strokeRoundedTextCreation`
4013 -- `HugeIcons.strokeRoundedTextFirstlineLeft`
4014 -- `HugeIcons.strokeRoundedTextFirstlineRight`
4015 -- `HugeIcons.strokeRoundedTextFont`
4016 -- `HugeIcons.strokeRoundedTextFootnote`
4017 -- `HugeIcons.strokeRoundedTextIndent01`
4018 -- `HugeIcons.strokeRoundedTextIndentLess`
4019 -- `HugeIcons.strokeRoundedTextIndentMore`
4020 -- `HugeIcons.strokeRoundedTextIndent`
4021 -- `HugeIcons.strokeRoundedTextItalicSlash`
4022 -- `HugeIcons.strokeRoundedTextItalic`
4023 -- `HugeIcons.strokeRoundedTextKerning`
4024 -- `HugeIcons.strokeRoundedTextNumberSign`
4025 -- `HugeIcons.strokeRoundedTextSelection`
4026 -- `HugeIcons.strokeRoundedTextSmallcaps`
4027 -- `HugeIcons.strokeRoundedTextSquare`
4028 -- `HugeIcons.strokeRoundedTextStrikethrough`
4029 -- `HugeIcons.strokeRoundedText`
4030 -- `HugeIcons.strokeRoundedTextSubscript`
4031 -- `HugeIcons.strokeRoundedTextSuperscript`
4032 -- `HugeIcons.strokeRoundedTextTracking`
4033 -- `HugeIcons.strokeRoundedTextUnderline`
4034 -- `HugeIcons.strokeRoundedTextVariableFront`
4035 -- `HugeIcons.strokeRoundedTextVerticalAlignment`
4036 -- `HugeIcons.strokeRoundedTextWrap`
4037 -- `HugeIcons.strokeRoundedTheProphetsMosque`
4038 -- `HugeIcons.strokeRoundedThermometerCold`
4039 -- `HugeIcons.strokeRoundedThermometer`
4040 -- `HugeIcons.strokeRoundedThermometerWarm`
4041 -- `HugeIcons.strokeRoundedThread`
4042 -- `HugeIcons.strokeRoundedThreadsEllipse`
4043 -- `HugeIcons.strokeRoundedThreadsRectangle`
4044 -- `HugeIcons.strokeRoundedThreads`
4045 -- `HugeIcons.strokeRoundedThreeCircle`
4046 -- `HugeIcons.strokeRoundedThreeFinger01`
4047 -- `HugeIcons.strokeRoundedThreeFinger02`
4048 -- `HugeIcons.strokeRoundedThreeFinger03`
4049 -- `HugeIcons.strokeRoundedThreeFinger04`
4050 -- `HugeIcons.strokeRoundedThreeFinger05`
4051 -- `HugeIcons.strokeRoundedThreeSquare`
4052 -- `HugeIcons.strokeRoundedThumbsDownEllipse`
4053 -- `HugeIcons.strokeRoundedThumbsDownRectangle`
4054 -- `HugeIcons.strokeRoundedThumbsDown`
4055 -- `HugeIcons.strokeRoundedThumbsUpDown`
4056 -- `HugeIcons.strokeRoundedThumbsUpEllipse`
4057 -- `HugeIcons.strokeRoundedThumbsUpRectangle`
4058 -- `HugeIcons.strokeRoundedThumbsUp`
4059 -- `HugeIcons.strokeRoundedTicTacToe`
4060 -- `HugeIcons.strokeRoundedTick01`
4061 -- `HugeIcons.strokeRoundedTick02`
4062 -- `HugeIcons.strokeRoundedTick03`
4063 -- `HugeIcons.strokeRoundedTick04`
4064 -- `HugeIcons.strokeRoundedTickDouble01`
4065 -- `HugeIcons.strokeRoundedTickDouble02`
4066 -- `HugeIcons.strokeRoundedTickDouble03`
4067 -- `HugeIcons.strokeRoundedTickDouble04`
4068 -- `HugeIcons.strokeRoundedTicket01`
4069 -- `HugeIcons.strokeRoundedTicket02`
4070 -- `HugeIcons.strokeRoundedTicket03`
4071 -- `HugeIcons.strokeRoundedTicketStar`
4072 -- `HugeIcons.strokeRoundedTie`
4073 -- `HugeIcons.strokeRoundedTiff01`
4074 -- `HugeIcons.strokeRoundedTiff02`
4075 -- `HugeIcons.strokeRoundedTiktok`
4076 -- `HugeIcons.strokeRoundedTiltify`
4077 -- `HugeIcons.strokeRoundedTime01`
4078 -- `HugeIcons.strokeRoundedTime02`
4079 -- `HugeIcons.strokeRoundedTime03`
4080 -- `HugeIcons.strokeRoundedTime04`
4081 -- `HugeIcons.strokeRoundedTimeHalfPass`
4082 -- `HugeIcons.strokeRoundedTimeManagementCircle`
4083 -- `HugeIcons.strokeRoundedTimeManagement`
4084 -- `HugeIcons.strokeRoundedTimeQuarter02`
4085 -- `HugeIcons.strokeRoundedTimeQuarterPass`
4086 -- `HugeIcons.strokeRoundedTimeQuarter`
4087 -- `HugeIcons.strokeRoundedTimeSchedule`
4088 -- `HugeIcons.strokeRoundedTimeSetting01`
4089 -- `HugeIcons.strokeRoundedTimeSetting02`
4090 -- `HugeIcons.strokeRoundedTimeSetting03`
4091 -- `HugeIcons.strokeRoundedTimer01`
4092 -- `HugeIcons.strokeRoundedTimer02`
4093 -- `HugeIcons.strokeRoundedTinderSquare`
4094 -- `HugeIcons.strokeRoundedTinder`
4095 -- `HugeIcons.strokeRoundedTips`
4096 -- `HugeIcons.strokeRoundedTire`
4097 -- `HugeIcons.strokeRoundedTired01`
4098 -- `HugeIcons.strokeRoundedTired02`
4099 -- `HugeIcons.strokeRoundedTissuePaper`
4100 -- `HugeIcons.strokeRoundedToggleOff`
4101 -- `HugeIcons.strokeRoundedToggleOn`
4102 -- `HugeIcons.strokeRoundedToilet01`
4103 -- `HugeIcons.strokeRoundedToilet02`
4104 -- `HugeIcons.strokeRoundedTokenCircle`
4105 -- `HugeIcons.strokeRoundedTokenSquare`
4106 -- `HugeIcons.strokeRoundedTongue01`
4107 -- `HugeIcons.strokeRoundedTongue`
4108 -- `HugeIcons.strokeRoundedTongueWinkLeft`
4109 -- `HugeIcons.strokeRoundedTongueWinkRight`
4110 -- `HugeIcons.strokeRoundedTools`
4111 -- `HugeIcons.strokeRoundedTornado01`
4112 -- `HugeIcons.strokeRoundedTornado02`
4113 -- `HugeIcons.strokeRoundedTorriGate`
4114 -- `HugeIcons.strokeRoundedTouch01`
4115 -- `HugeIcons.strokeRoundedTouch02`
4116 -- `HugeIcons.strokeRoundedTouch03`
4117 -- `HugeIcons.strokeRoundedTouch04`
4118 -- `HugeIcons.strokeRoundedTouch05`
4119 -- `HugeIcons.strokeRoundedTouch06`
4120 -- `HugeIcons.strokeRoundedTouch07`
4121 -- `HugeIcons.strokeRoundedTouch08`
4122 -- `HugeIcons.strokeRoundedTouch09`
4123 -- `HugeIcons.strokeRoundedTouch10`
4124 -- `HugeIcons.strokeRoundedTouchInteraction01`
4125 -- `HugeIcons.strokeRoundedTouchInteraction02`
4126 -- `HugeIcons.strokeRoundedTouchInteraction03`
4127 -- `HugeIcons.strokeRoundedTouchInteraction04`
4128 -- `HugeIcons.strokeRoundedTouchLocked01`
4129 -- `HugeIcons.strokeRoundedTouchLocked02`
4130 -- `HugeIcons.strokeRoundedTouchLocked03`
4131 -- `HugeIcons.strokeRoundedTouchLocked04`
4132 -- `HugeIcons.strokeRoundedTouchpad01`
4133 -- `HugeIcons.strokeRoundedTouchpad02`
4134 -- `HugeIcons.strokeRoundedTouchpad03`
4135 -- `HugeIcons.strokeRoundedTouchpad04`
4136 -- `HugeIcons.strokeRoundedTowTruck`
4137 -- `HugeIcons.strokeRoundedTowels`
4138 -- `HugeIcons.strokeRoundedToyTrain`
4139 -- `HugeIcons.strokeRoundedTractor`
4140 -- `HugeIcons.strokeRoundedTradeDown`
4141 -- `HugeIcons.strokeRoundedTradeMark`
4142 -- `HugeIcons.strokeRoundedTradeUp`
4143 -- `HugeIcons.strokeRoundedTrademark`
4144 -- `HugeIcons.strokeRoundedTrafficIncident`
4145 -- `HugeIcons.strokeRoundedTrafficJam01`
4146 -- `HugeIcons.strokeRoundedTrafficJam02`
4147 -- `HugeIcons.strokeRoundedTrafficLight`
4148 -- `HugeIcons.strokeRoundedTrain01`
4149 -- `HugeIcons.strokeRoundedTrain02`
4150 -- `HugeIcons.strokeRoundedTram`
4151 -- `HugeIcons.strokeRoundedTrampoline`
4152 -- `HugeIcons.strokeRoundedTransactionHistory`
4153 -- `HugeIcons.strokeRoundedTransaction`
4154 -- `HugeIcons.strokeRoundedTransitionBottom`
4155 -- `HugeIcons.strokeRoundedTransitionLeft`
4156 -- `HugeIcons.strokeRoundedTransitionRight`
4157 -- `HugeIcons.strokeRoundedTransitionTop`
4158 -- `HugeIcons.strokeRoundedTranslate`
4159 -- `HugeIcons.strokeRoundedTranslation`
4160 -- `HugeIcons.strokeRoundedTransmission`
4161 -- `HugeIcons.strokeRoundedTransparency`
4162 -- `HugeIcons.strokeRoundedTrapezoidLineHorizontal`
4163 -- `HugeIcons.strokeRoundedTrapezoidLineVertical`
4164 -- `HugeIcons.strokeRoundedTravelBag`
4165 -- `HugeIcons.strokeRoundedTreadmill01`
4166 -- `HugeIcons.strokeRoundedTreadmill02`
4167 -- `HugeIcons.strokeRoundedTreatment`
4168 -- `HugeIcons.strokeRoundedTree01`
4169 -- `HugeIcons.strokeRoundedTree02`
4170 -- `HugeIcons.strokeRoundedTree03`
4171 -- `HugeIcons.strokeRoundedTree04`
4172 -- `HugeIcons.strokeRoundedTree05`
4173 -- `HugeIcons.strokeRoundedTree06`
4174 -- `HugeIcons.strokeRoundedTree07`
4175 -- `HugeIcons.strokeRoundedTrello`
4176 -- `HugeIcons.strokeRoundedTriangle01`
4177 -- `HugeIcons.strokeRoundedTriangle02`
4178 -- `HugeIcons.strokeRoundedTriangle03`
4179 -- `HugeIcons.strokeRoundedTriangle`
4180 -- `HugeIcons.strokeRoundedTrolley01`
4181 -- `HugeIcons.strokeRoundedTrolley02`
4182 -- `HugeIcons.strokeRoundedTropicalStorm`
4183 -- `HugeIcons.strokeRoundedTropicalStormTracks01`
4184 -- `HugeIcons.strokeRoundedTropicalStormTracks02`
4185 -- `HugeIcons.strokeRoundedTropicalStormTracks`
4186 -- `HugeIcons.strokeRoundedTruckDelivery`
4187 -- `HugeIcons.strokeRoundedTruckMonster`
4188 -- `HugeIcons.strokeRoundedTruckReturn`
4189 -- `HugeIcons.strokeRoundedTruck`
4190 -- `HugeIcons.strokeRoundedTrulli`
4191 -- `HugeIcons.strokeRoundedTsunami`
4192 -- `HugeIcons.strokeRoundedTulip`
4193 -- `HugeIcons.strokeRoundedTumblr`
4194 -- `HugeIcons.strokeRoundedTurtleNeck`
4195 -- `HugeIcons.strokeRoundedTv01`
4196 -- `HugeIcons.strokeRoundedTv02`
4197 -- `HugeIcons.strokeRoundedTvFix`
4198 -- `HugeIcons.strokeRoundedTvIssue`
4199 -- `HugeIcons.strokeRoundedTvSmart`
4200 -- `HugeIcons.strokeRoundedTwinTower`
4201 -- `HugeIcons.strokeRoundedTwitch`
4202 -- `HugeIcons.strokeRoundedTwitterSquare`
4203 -- `HugeIcons.strokeRoundedTwitter`
4204 -- `HugeIcons.strokeRoundedTwoCircle`
4205 -- `HugeIcons.strokeRoundedTwoFactorAccess`
4206 -- `HugeIcons.strokeRoundedTwoFinger01`
4207 -- `HugeIcons.strokeRoundedTwoFinger02`
4208 -- `HugeIcons.strokeRoundedTwoFinger03`
4209 -- `HugeIcons.strokeRoundedTwoFinger04`
4210 -- `HugeIcons.strokeRoundedTwoFinger05`
4211 -- `HugeIcons.strokeRoundedTwoSquare`
4212 -- `HugeIcons.strokeRoundedTxt01`
4213 -- `HugeIcons.strokeRoundedTxt02`
4214 -- `HugeIcons.strokeRoundedTypeCursor`
4215 -- `HugeIcons.strokeRoundedTypescript01`
4216 -- `HugeIcons.strokeRoundedTypescript02`
4217 -- `HugeIcons.strokeRoundedTypescript03`
4218 -- `HugeIcons.strokeRoundedUber`
4219 -- `HugeIcons.strokeRoundedUfo01`
4220 -- `HugeIcons.strokeRoundedUfo`
4221 -- `HugeIcons.strokeRoundedUmbrellaDollar`
4222 -- `HugeIcons.strokeRoundedUmbrella`
4223 -- `HugeIcons.strokeRoundedUnamused`
4224 -- `HugeIcons.strokeRoundedUnarchive03`
4225 -- `HugeIcons.strokeRoundedUnavailable`
4226 -- `HugeIcons.strokeRoundedUnderpants01`
4227 -- `HugeIcons.strokeRoundedUnderpants02`
4228 -- `HugeIcons.strokeRoundedUnderpants03`
4229 -- `HugeIcons.strokeRoundedUndo02`
4230 -- `HugeIcons.strokeRoundedUndo03`
4231 -- `HugeIcons.strokeRoundedUndo`
4232 -- `HugeIcons.strokeRoundedUnfoldLess`
4233 -- `HugeIcons.strokeRoundedUnfoldMore`
4234 -- `HugeIcons.strokeRoundedUngroupItems`
4235 -- `HugeIcons.strokeRoundedUngroupLayers`
4236 -- `HugeIcons.strokeRoundedUnhappy`
4237 -- `HugeIcons.strokeRoundedUniversalAccessCircle`
4238 -- `HugeIcons.strokeRoundedUniversalAccess`
4239 -- `HugeIcons.strokeRoundedUniversity`
4240 -- `HugeIcons.strokeRoundedUnlink01`
4241 -- `HugeIcons.strokeRoundedUnlink02`
4242 -- `HugeIcons.strokeRoundedUnlink03`
4243 -- `HugeIcons.strokeRoundedUnlink04`
4244 -- `HugeIcons.strokeRoundedUnlink05`
4245 -- `HugeIcons.strokeRoundedUnlink06`
4246 -- `HugeIcons.strokeRoundedUnsplash`
4247 -- `HugeIcons.strokeRoundedUpload01`
4248 -- `HugeIcons.strokeRoundedUpload02`
4249 -- `HugeIcons.strokeRoundedUpload03`
4250 -- `HugeIcons.strokeRoundedUpload04`
4251 -- `HugeIcons.strokeRoundedUpload05`
4252 -- `HugeIcons.strokeRoundedUploadCircle01`
4253 -- `HugeIcons.strokeRoundedUploadCircle02`
4254 -- `HugeIcons.strokeRoundedUploadSquare01`
4255 -- `HugeIcons.strokeRoundedUploadSquare02`
4256 -- `HugeIcons.strokeRoundedUpwork`
4257 -- `HugeIcons.strokeRoundedUsbBugs`
4258 -- `HugeIcons.strokeRoundedUsbConnected01`
4259 -- `HugeIcons.strokeRoundedUsbConnected02`
4260 -- `HugeIcons.strokeRoundedUsbConnected03`
4261 -- `HugeIcons.strokeRoundedUsbError`
4262 -- `HugeIcons.strokeRoundedUsbMemory01`
4263 -- `HugeIcons.strokeRoundedUsbMemory02`
4264 -- `HugeIcons.strokeRoundedUsbNotConnected01`
4265 -- `HugeIcons.strokeRoundedUsbNotConnected02`
4266 -- `HugeIcons.strokeRoundedUsb`
4267 -- `HugeIcons.strokeRoundedUsdt`
4268 -- `HugeIcons.strokeRoundedUser02`
4269 -- `HugeIcons.strokeRoundedUser03`
4270 -- `HugeIcons.strokeRoundedUserAccount`
4271 -- `HugeIcons.strokeRoundedUserAdd01`
4272 -- `HugeIcons.strokeRoundedUserAdd02`
4273 -- `HugeIcons.strokeRoundedUserAi`
4274 -- `HugeIcons.strokeRoundedUserArrowLeftRight`
4275 -- `HugeIcons.strokeRoundedUserBlock01`
4276 -- `HugeIcons.strokeRoundedUserBlock02`
4277 -- `HugeIcons.strokeRoundedUserCheck01`
4278 -- `HugeIcons.strokeRoundedUserCheck02`
4279 -- `HugeIcons.strokeRoundedUserCircle02`
4280 -- `HugeIcons.strokeRoundedUserCircle`
4281 -- `HugeIcons.strokeRoundedUserEdit01`
4282 -- `HugeIcons.strokeRoundedUserFullView`
4283 -- `HugeIcons.strokeRoundedUserGroup02`
4284 -- `HugeIcons.strokeRoundedUserGroup03`
4285 -- `HugeIcons.strokeRoundedUserGroup`
4286 -- `HugeIcons.strokeRoundedUserIdVerification`
4287 -- `HugeIcons.strokeRoundedUserList`
4288 -- `HugeIcons.strokeRoundedUserLock01`
4289 -- `HugeIcons.strokeRoundedUserLock02`
4290 -- `HugeIcons.strokeRoundedUserLove01`
4291 -- `HugeIcons.strokeRoundedUserLove02`
4292 -- `HugeIcons.strokeRoundedUserMinus01`
4293 -- `HugeIcons.strokeRoundedUserMinus02`
4294 -- `HugeIcons.strokeRoundedUserMultiple02`
4295 -- `HugeIcons.strokeRoundedUserMultiple03`
4296 -- `HugeIcons.strokeRoundedUserMultiple`
4297 -- `HugeIcons.strokeRoundedUserQuestion01`
4298 -- `HugeIcons.strokeRoundedUserQuestion02`
4299 -- `HugeIcons.strokeRoundedUserRemove01`
4300 -- `HugeIcons.strokeRoundedUserRemove02`
4301 -- `HugeIcons.strokeRoundedUserRoadside`
4302 -- `HugeIcons.strokeRoundedUserSearch01`
4303 -- `HugeIcons.strokeRoundedUserSearch02`
4304 -- `HugeIcons.strokeRoundedUserSettings01`
4305 -- `HugeIcons.strokeRoundedUserSettings02`
4306 -- `HugeIcons.strokeRoundedUserSharing`
4307 -- `HugeIcons.strokeRoundedUserShield01`
4308 -- `HugeIcons.strokeRoundedUserShield02`
4309 -- `HugeIcons.strokeRoundedUserSquare`
4310 -- `HugeIcons.strokeRoundedUserStar01`
4311 -- `HugeIcons.strokeRoundedUserStar02`
4312 -- `HugeIcons.strokeRoundedUserStatus`
4313 -- `HugeIcons.strokeRoundedUserStory`
4314 -- `HugeIcons.strokeRoundedUser`
4315 -- `HugeIcons.strokeRoundedUserSwitch`
4316 -- `HugeIcons.strokeRoundedUserTime01`
4317 -- `HugeIcons.strokeRoundedUserTime02`
4318 -- `HugeIcons.strokeRoundedUserTime03`
4319 -- `HugeIcons.strokeRoundedUserUnlock01`
4320 -- `HugeIcons.strokeRoundedUserUnlock02`
4321 -- `HugeIcons.strokeRoundedUserWarning01`
4322 -- `HugeIcons.strokeRoundedUserWarning02`
4323 -- `HugeIcons.strokeRoundedUserWarning03`
4324 -- `HugeIcons.strokeRoundedUv01`
4325 -- `HugeIcons.strokeRoundedUv02`
4326 -- `HugeIcons.strokeRoundedUv03`
4327 -- `HugeIcons.strokeRoundedVaccine`
4328 -- `HugeIcons.strokeRoundedVacuumCleaner`
4329 -- `HugeIcons.strokeRoundedValidationApproval`
4330 -- `HugeIcons.strokeRoundedValidation`
4331 -- `HugeIcons.strokeRoundedVan`
4332 -- `HugeIcons.strokeRoundedVariable`
4333 -- `HugeIcons.strokeRoundedVegetarianFood`
4334 -- `HugeIcons.strokeRoundedVersus`
4335 -- `HugeIcons.strokeRoundedVerticalResize`
4336 -- `HugeIcons.strokeRoundedVerticalScrollPoint`
4337 -- `HugeIcons.strokeRoundedVest`
4338 -- `HugeIcons.strokeRoundedViber`
4339 -- `HugeIcons.strokeRoundedVictoryFinger01`
4340 -- `HugeIcons.strokeRoundedVictoryFinger02`
4341 -- `HugeIcons.strokeRoundedVictoryFinger03`
4342 -- `HugeIcons.strokeRoundedVideo01`
4343 -- `HugeIcons.strokeRoundedVideo02`
4344 -- `HugeIcons.strokeRoundedVideoAi`
4345 -- `HugeIcons.strokeRoundedVideoCameraAi`
4346 -- `HugeIcons.strokeRoundedVideoConsole`
4347 -- `HugeIcons.strokeRoundedVideoOff`
4348 -- `HugeIcons.strokeRoundedVideoReplay`
4349 -- `HugeIcons.strokeRoundedViewOffSlash`
4350 -- `HugeIcons.strokeRoundedViewOff`
4351 -- `HugeIcons.strokeRoundedView`
4352 -- `HugeIcons.strokeRoundedVimeo`
4353 -- `HugeIcons.strokeRoundedVineSquare`
4354 -- `HugeIcons.strokeRoundedVine`
4355 -- `HugeIcons.strokeRoundedVintageClock`
4356 -- `HugeIcons.strokeRoundedVirtualRealityVr01`
4357 -- `HugeIcons.strokeRoundedVirtualRealityVr02`
4358 -- `HugeIcons.strokeRoundedVision`
4359 -- `HugeIcons.strokeRoundedVisualStudioCode`
4360 -- `HugeIcons.strokeRoundedVkSquare`
4361 -- `HugeIcons.strokeRoundedVk`
4362 -- `HugeIcons.strokeRoundedVoiceId`
4363 -- `HugeIcons.strokeRoundedVoice`
4364 -- `HugeIcons.strokeRoundedVolleyball`
4365 -- `HugeIcons.strokeRoundedVolumeHigh`
4366 -- `HugeIcons.strokeRoundedVolumeLow`
4367 -- `HugeIcons.strokeRoundedVolumeMinus`
4368 -- `HugeIcons.strokeRoundedVolumeMute01`
4369 -- `HugeIcons.strokeRoundedVolumeMute02`
4370 -- `HugeIcons.strokeRoundedVolumeOff`
4371 -- `HugeIcons.strokeRoundedVolumeUp`
4372 -- `HugeIcons.strokeRoundedVomiting`
4373 -- `HugeIcons.strokeRoundedVoucher`
4374 -- `HugeIcons.strokeRoundedVrGlasses`
4375 -- `HugeIcons.strokeRoundedVr`
4376 -- `HugeIcons.strokeRoundedVynil01`
4377 -- `HugeIcons.strokeRoundedVynil02`
4378 -- `HugeIcons.strokeRoundedVynil03`
4379 -- `HugeIcons.strokeRoundedW3Schools`
4380 -- `HugeIcons.strokeRoundedWaiter`
4381 -- `HugeIcons.strokeRoundedWaiters`
4382 -- `HugeIcons.strokeRoundedWallLamp`
4383 -- `HugeIcons.strokeRoundedWallet01`
4384 -- `HugeIcons.strokeRoundedWallet02`
4385 -- `HugeIcons.strokeRoundedWallet03`
4386 -- `HugeIcons.strokeRoundedWallet04`
4387 -- `HugeIcons.strokeRoundedWallet05`
4388 -- `HugeIcons.strokeRoundedWalletAdd01`
4389 -- `HugeIcons.strokeRoundedWalletAdd02`
4390 -- `HugeIcons.strokeRoundedWalletDone01`
4391 -- `HugeIcons.strokeRoundedWalletDone02`
4392 -- `HugeIcons.strokeRoundedWalletNotFound01`
4393 -- `HugeIcons.strokeRoundedWalletNotFound02`
4394 -- `HugeIcons.strokeRoundedWalletRemove01`
4395 -- `HugeIcons.strokeRoundedWalletRemove02`
4396 -- `HugeIcons.strokeRoundedWanted`
4397 -- `HugeIcons.strokeRoundedWardrobe01`
4398 -- `HugeIcons.strokeRoundedWardrobe02`
4399 -- `HugeIcons.strokeRoundedWardrobe03`
4400 -- `HugeIcons.strokeRoundedWardrobe04`
4401 -- `HugeIcons.strokeRoundedWarehouse`
4402 -- `HugeIcons.strokeRoundedWashingtonMonument`
4403 -- `HugeIcons.strokeRoundedWasteRestore`
4404 -- `HugeIcons.strokeRoundedWaste`
4405 -- `HugeIcons.strokeRoundedWatch01`
4406 -- `HugeIcons.strokeRoundedWatch02`
4407 -- `HugeIcons.strokeRoundedWaterEnergy`
4408 -- `HugeIcons.strokeRoundedWaterPolo`
4409 -- `HugeIcons.strokeRoundedWaterPump`
4410 -- `HugeIcons.strokeRoundedWaterfallDown01`
4411 -- `HugeIcons.strokeRoundedWaterfallDown03`
4412 -- `HugeIcons.strokeRoundedWaterfallUp01`
4413 -- `HugeIcons.strokeRoundedWaterfallUp02`
4414 -- `HugeIcons.strokeRoundedWatermelon`
4415 -- `HugeIcons.strokeRoundedWattpadSquare`
4416 -- `HugeIcons.strokeRoundedWattpad`
4417 -- `HugeIcons.strokeRoundedWav01`
4418 -- `HugeIcons.strokeRoundedWav02`
4419 -- `HugeIcons.strokeRoundedWaveSquare`
4420 -- `HugeIcons.strokeRoundedWave`
4421 -- `HugeIcons.strokeRoundedWaveTriangle`
4422 -- `HugeIcons.strokeRoundedWavingHand01`
4423 -- `HugeIcons.strokeRoundedWavingHand02`
4424 -- `HugeIcons.strokeRoundedWaze`
4425 -- `HugeIcons.strokeRoundedWebDesign01`
4426 -- `HugeIcons.strokeRoundedWebDesign02`
4427 -- `HugeIcons.strokeRoundedWebProgramming`
4428 -- `HugeIcons.strokeRoundedWebProtection`
4429 -- `HugeIcons.strokeRoundedWebSecurity`
4430 -- `HugeIcons.strokeRoundedWebValidation`
4431 -- `HugeIcons.strokeRoundedWebflowEllipse`
4432 -- `HugeIcons.strokeRoundedWebflowRectangle`
4433 -- `HugeIcons.strokeRoundedWebflow`
4434 -- `HugeIcons.strokeRoundedWebhook`
4435 -- `HugeIcons.strokeRoundedWechat`
4436 -- `HugeIcons.strokeRoundedWedding`
4437 -- `HugeIcons.strokeRoundedWeightScale01`
4438 -- `HugeIcons.strokeRoundedWeightScale`
4439 -- `HugeIcons.strokeRoundedWellness`
4440 -- `HugeIcons.strokeRoundedWhatsappBusiness`
4441 -- `HugeIcons.strokeRoundedWhatsapp`
4442 -- `HugeIcons.strokeRoundedWheelchair`
4443 -- `HugeIcons.strokeRoundedWhisk`
4444 -- `HugeIcons.strokeRoundedWhistle`
4445 -- `HugeIcons.strokeRoundedWhiteboard`
4446 -- `HugeIcons.strokeRoundedWifi01`
4447 -- `HugeIcons.strokeRoundedWifi02`
4448 -- `HugeIcons.strokeRoundedWifiCircle`
4449 -- `HugeIcons.strokeRoundedWifiConnected01`
4450 -- `HugeIcons.strokeRoundedWifiConnected02`
4451 -- `HugeIcons.strokeRoundedWifiConnected03`
4452 -- `HugeIcons.strokeRoundedWifiDisconnected01`
4453 -- `HugeIcons.strokeRoundedWifiDisconnected02`
4454 -- `HugeIcons.strokeRoundedWifiDisconnected03`
4455 -- `HugeIcons.strokeRoundedWifiDisconnected04`
4456 -- `HugeIcons.strokeRoundedWifiError01`
4457 -- `HugeIcons.strokeRoundedWifiError02`
4458 -- `HugeIcons.strokeRoundedWifiFullSignal`
4459 -- `HugeIcons.strokeRoundedWifiLocation`
4460 -- `HugeIcons.strokeRoundedWifiLock`
4461 -- `HugeIcons.strokeRoundedWifiLowSignal`
4462 -- `HugeIcons.strokeRoundedWifiMediumSignal`
4463 -- `HugeIcons.strokeRoundedWifiNoSignal`
4464 -- `HugeIcons.strokeRoundedWifiOff01`
4465 -- `HugeIcons.strokeRoundedWifiOff02`
4466 -- `HugeIcons.strokeRoundedWifiSquare`
4467 -- `HugeIcons.strokeRoundedWifiUnlock`
4468 -- `HugeIcons.strokeRoundedWikipedia`
4469 -- `HugeIcons.strokeRoundedWindPower01`
4470 -- `HugeIcons.strokeRoundedWindPower02`
4471 -- `HugeIcons.strokeRoundedWindPower03`
4472 -- `HugeIcons.strokeRoundedWindPower`
4473 -- `HugeIcons.strokeRoundedWindSurf`
4474 -- `HugeIcons.strokeRoundedWindTurbine`
4475 -- `HugeIcons.strokeRoundedWindowsNew`
4476 -- `HugeIcons.strokeRoundedWindowsOld`
4477 -- `HugeIcons.strokeRoundedWink`
4478 -- `HugeIcons.strokeRoundedWinking`
4479 -- `HugeIcons.strokeRoundedWirelessCloudAccess`
4480 -- `HugeIcons.strokeRoundedWireless`
4481 -- `HugeIcons.strokeRoundedWise`
4482 -- `HugeIcons.strokeRoundedWoman`
4483 -- `HugeIcons.strokeRoundedWordpress`
4484 -- `HugeIcons.strokeRoundedWorkAlert`
4485 -- `HugeIcons.strokeRoundedWorkHistory`
4486 -- `HugeIcons.strokeRoundedWork`
4487 -- `HugeIcons.strokeRoundedWorkUpdate`
4488 -- `HugeIcons.strokeRoundedWorkflowCircle01`
4489 -- `HugeIcons.strokeRoundedWorkflowCircle02`
4490 -- `HugeIcons.strokeRoundedWorkflowCircle03`
4491 -- `HugeIcons.strokeRoundedWorkflowCircle04`
4492 -- `HugeIcons.strokeRoundedWorkflowCircle05`
4493 -- `HugeIcons.strokeRoundedWorkflowCircle06`
4494 -- `HugeIcons.strokeRoundedWorkflowSquare01`
4495 -- `HugeIcons.strokeRoundedWorkflowSquare02`
4496 -- `HugeIcons.strokeRoundedWorkflowSquare03`
4497 -- `HugeIcons.strokeRoundedWorkflowSquare04`
4498 -- `HugeIcons.strokeRoundedWorkflowSquare05`
4499 -- `HugeIcons.strokeRoundedWorkflowSquare06`
4500 -- `HugeIcons.strokeRoundedWorkflowSquare07`
4501 -- `HugeIcons.strokeRoundedWorkflowSquare08`
4502 -- `HugeIcons.strokeRoundedWorkflowSquare09`
4503 -- `HugeIcons.strokeRoundedWorkflowSquare10`
4504 -- `HugeIcons.strokeRoundedWorkoutBattleRopes`
4505 -- `HugeIcons.strokeRoundedWorkoutGymnastics`
4506 -- `HugeIcons.strokeRoundedWorkoutKicking`
4507 -- `HugeIcons.strokeRoundedWorkoutRun`
4508 -- `HugeIcons.strokeRoundedWorkoutSport`
4509 -- `HugeIcons.strokeRoundedWorkoutSquats`
4510 -- `HugeIcons.strokeRoundedWorkoutStretching`
4511 -- `HugeIcons.strokeRoundedWorkoutWarmUp`
4512 -- `HugeIcons.strokeRoundedWorry`
4513 -- `HugeIcons.strokeRoundedWpsOfficeRectangle`
4514 -- `HugeIcons.strokeRoundedWpsOffice`
4515 -- `HugeIcons.strokeRoundedWrench01`
4516 -- `HugeIcons.strokeRoundedWrench02`
4517 -- `HugeIcons.strokeRoundedWudu`
4518 -- `HugeIcons.strokeRoundedXRay`
4519 -- `HugeIcons.strokeRoundedXVariableCircle`
4520 -- `HugeIcons.strokeRoundedXVariableSquare`
4521 -- `HugeIcons.strokeRoundedXVariable`
4522 -- `HugeIcons.strokeRoundedXing`
4523 -- `HugeIcons.strokeRoundedXls01`
4524 -- `HugeIcons.strokeRoundedXls02`
4525 -- `HugeIcons.strokeRoundedXml01`
4526 -- `HugeIcons.strokeRoundedXml02`
4527 -- `HugeIcons.strokeRoundedXsl01`
4528 -- `HugeIcons.strokeRoundedXsl02`
4529 -- `HugeIcons.strokeRoundedYelp`
4530 -- `HugeIcons.strokeRoundedYenCircle`
4531 -- `HugeIcons.strokeRoundedYenReceive`
4532 -- `HugeIcons.strokeRoundedYenSend`
4533 -- `HugeIcons.strokeRoundedYenSquare`
4534 -- `HugeIcons.strokeRoundedYen`
4535 -- `HugeIcons.strokeRoundedYoga01`
4536 -- `HugeIcons.strokeRoundedYoga02`
4537 -- `HugeIcons.strokeRoundedYoga03`
4538 -- `HugeIcons.strokeRoundedYogaBall`
4539 -- `HugeIcons.strokeRoundedYogaMat`
4540 -- `HugeIcons.strokeRoundedYogurt`
4541 -- `HugeIcons.strokeRoundedYoutube`
4542 -- `HugeIcons.strokeRoundedYurt`
4543 -- `HugeIcons.strokeRoundedZakat`
4544 -- `HugeIcons.strokeRoundedZap`
4545 -- `HugeIcons.strokeRoundedZeppelin`
4546 -- `HugeIcons.strokeRoundedZeroCircle`
4547 -- `HugeIcons.strokeRoundedZeroSquare`
4548 -- `HugeIcons.strokeRoundedZip01`
4549 -- `HugeIcons.strokeRoundedZip02`
4550 -- `HugeIcons.strokeRoundedZoomCircle`
4551 -- `HugeIcons.strokeRoundedZoomInArea`
4552 -- `HugeIcons.strokeRoundedZoomOutArea`
4553 -- `HugeIcons.strokeRoundedZoomSquare`
4554 -- `HugeIcons.strokeRoundedZoom`
4555 -- `HugeIcons.strokeRoundedZsh`
4556 -- `HugeIcons.strokeRoundedZzz`
.claude/skills/hugeicons-usage/SKILL.md deleted
-49
@@ -1,49 +0,0 @@
1 ----
2 -name: hugeicons-usage
3 -description: Guidelines for using the Hugeicons Flutter package, covering widget usage, customization, and theme integration.
4 ----
5 -
6 -# Hugeicons Usage Guide
7 -
8 -## Core Guidelines
9 -
10 -- **Use the `HugeIcon` widget**: Always use the provided `HugeIcon` widget for rendering icons.
11 -- **Icon Data**: Icons are accessed through the `HugeIcons` class (e.g., `HugeIcons.strokeRoundedUser`).
12 -- **Theme Color Inheritance**: By default, `HugeIcon` inherits the color from the current `IconTheme`. You can override this using the `color` property.
13 -- **Size**: The default size is 24.0. Use the `size` property to scale the icon.
14 -- **Stroke Width**: For stroke-based icons (most icons in this package), you can customize the thickness using the `strokeWidth` property.
15 -
16 -## Examples
17 -
18 -### Simple Usage
19 -```dart
20 -HugeIcon(
21 - icon: HugeIcons.strokeRoundedHome01,
22 - color: Colors.black,
23 - size: 24.0,
24 -)
25 -```
26 -
27 -### With Color Inheritance
28 -```dart
29 -IconTheme(
30 - data: IconThemeData(color: Colors.blue, size: 32.0),
31 - child: HugeIcon(
32 - icon: HugeIcons.strokeRoundedSettings01,
33 - ),
34 -)
35 -```
36 -
37 -### Custom Stroke Width
38 -```dart
39 -HugeIcon(
40 - icon: HugeIcons.strokeRoundedFavorite,
41 - color: Colors.red,
42 - strokeWidth: 2.5,
43 -)
44 -```
45 -
46 -## Troubleshooting
47 -
48 -- **Icon not showing**: Ensure the `icon` property is not null and is a valid constant from `HugeIcons`.
49 -- **Unexpected Color**: Check if a parent `IconTheme` or `DefaultTextStyle` is providing a color you don't expect.
.claude/skills/riverpod-3-0-migration/SKILL.md deleted
-74
@@ -1,74 +0,0 @@
1 ----
2 -name: riverpod-3-0-migration
3 -description: Migrate Riverpod from 2.0 to 3.0; automatic retry, paused listeners, legacy providers import, Ref simplification, FamilyNotifier removal, ProviderException, updateShouldNotify. Use when the user asks about Riverpod 3 migration, upgrading to Riverpod 3, or breaking changes in 3.0.
4 ----
5 -
6 -# Riverpod — Migrating from 2.0 to 3.0
7 -
8 -For a full list of changes and highlights, see the official Riverpod docs (What's new in Riverpod 3.0). This skill summarizes the main migration steps.
9 -
10 -## Automatic retry
11 -
12 -Failing providers are **retried by default** in 3.0. To disable globally:
13 -
14 -```dart
15 -ProviderScope(retry: (retryCount, error) => null, child: MyApp())
16 -// or ProviderContainer(retry: (retryCount, error) => null)
17 -```
18 -
19 -To disable per provider, pass **retry: (retryCount, error) => null** when defining the provider (or `@Riverpod(retry: ...)` with codegen). See riverpod-retry.
20 -
21 -## Out-of-view providers are paused
22 -
23 -Listeners in widgets that are not visible (e.g. off-screen) are **paused** by default. There is no global switch. To keep a subtree from pausing, wrap it in **TickerMode(enabled: true, child: ...)** so the Consumer(s) inside do not follow the pause behavior.
24 -
25 -## Legacy providers (StateProvider, StateNotifierProvider, ChangeNotifierProvider)
26 -
27 -These are **moved to a legacy import**. They are not removed but discouraged. To keep using them:
28 -
29 -```dart
30 -import 'package:flutter_riverpod/legacy.dart';
31 -// or hooks_riverpod/legacy.dart, riverpod/legacy.dart
32 -```
33 -
34 -## Updates use ==
35 -
36 -All providers now use **==** to filter updates (no longer **identical**). **StreamProvider** / **StreamNotifier** values are compared with ==. To customize, override **updateShouldNotify(previous, next)** on the Notifier (e.g. return true to always notify).
37 -
38 -## ProviderObserver API change
39 -
40 -Observer methods now receive a single **ProviderObserverContext** (with container, provider, and optional mutation) instead of separate (provider, value, container) parameters. Update signatures, e.g.:
41 -
42 -- **didAddProvider(ProviderObserverContext context, Object? value)** (and similar for other callbacks).
43 -
44 -## Ref simplified; Ref subclasses removed
45 -
46 -- **Ref** no longer has a type parameter. Use **Ref** everywhere (e.g. replace **MyProviderRef** with **Ref** in codegen).
47 -- **ProviderRef.state**, **Ref.listenSelf**, **FutureProviderRef.future** are **moved onto Notifier/AsyncNotifier**: use **Notifier.state**, **Notifier.listenSelf**, **AsyncNotifier.future** instead of on ref. If you need these, use a class-based Notifier/AsyncNotifier and call them on the notifier.
48 -
49 -## AutoDispose type names removed
50 -
51 -AutoDispose is still supported, but the separate type names (e.g. **AutoDisposeProvider**, **AutoDisposeNotifier**) are unified. Use **Provider**, **Notifier**, etc. with the same behavior. Migration: case-sensitive replace **AutoDispose** with a space (empty string) in type names.
52 -
53 -## Family Notifier types removed
54 -
55 -**FamilyNotifier**, **FamilyAsyncNotifier**, **FamilyStreamNotifier** are removed. Use **Notifier** / **AsyncNotifier** / **StreamNotifier** and pass the parameter via the **constructor** (and store it in a field). Remove the parameter from **build**; **build()** takes no family argument. Example:
56 -
57 -- Before: `FamilyNotifier<int, String>` with `int build(String arg)`.
58 -- After: `Notifier<int>` with constructor `MyNotifier(this.arg)` and `final String arg;`, and **int build()** using **arg**.
59 -
60 -## ProviderException
61 -
62 -When a provider throws, the exception is wrapped in **ProviderException**. If you catch the original type (e.g. **on NotFoundException**), change to **on ProviderException catch (e)** and check **e.exception is NotFoundException**. If you only use **AsyncValue** and **value.hasError** / **value.error**, no change needed.
63 -
64 -## Summary
65 -
66 -- Retry: disable via **retry** on scope/container or provider.
67 -- Pause: use **TickerMode(enabled: true)** where you don’t want pausing.
68 -- Legacy: use **flutter_riverpod/legacy.dart** (or equivalent) for StateProvider / StateNotifierProvider / ChangeNotifierProvider.
69 -- Ref: use plain **Ref**; move **state** / **listenSelf** / **future** to Notifier/AsyncNotifier.
70 -- AutoDispose: remove “AutoDispose” from type names.
71 -- Family notifiers: use Notifier/AsyncNotifier with constructor argument; **build()** has no parameter.
72 -- Errors: catch **ProviderException** and inspect **exception** when you need the original type.
73 -
74 -For version highlights and more detail, see the official Riverpod documentation.
.claude/skills/riverpod-auto-dispose/SKILL.md deleted
-65
@@ -1,65 +0,0 @@
1 ----
2 -name: riverpod-auto-dispose
3 -description: Enable automatic disposal of Riverpod providers when they have no listeners; keepAlive, onDispose, invalidate, ref.keepAlive. Use when preventing memory leaks, caching only while used, or cleaning up resources when a provider is no longer needed. Use this skill when the user asks about auto-dispose, keepAlive, or when to dispose Riverpod state.
4 ----
5 -
6 -# Riverpod — Automatic disposal
7 -
8 -## Instructions
9 -
10 -With **automatic disposal** enabled, Riverpod destroys a provider's state when it has no listeners for one frame. This frees memory and stops work (e.g. network requests) when the provider is no longer used.
11 -
12 -### Enabling
13 -
14 -- **Code generation:** Enabled by default. Disable with `@Riverpod(keepAlive: true)`.
15 -- **Manual:** Add `isAutoDispose: true` when creating the provider (e.g. `Provider.autoDispose(...)` or `FutureProvider.autoDispose(...)`).
16 -
17 -```dart
18 -// Codegen: disable auto-dispose
19 -@Riverpod(keepAlive: true)
20 -String helloWorld(Ref ref) => 'Hello world!';
21 -
22 -// Manual: enable
23 -final helloWorldProvider = Provider<String>(
24 - isAutoDispose: true,
25 - (ref) => 'Hello world!',
26 -);
27 -```
28 -
29 -When a provider has **parameters** (family), enable auto-dispose to avoid caching every parameter combination forever and causing memory leaks.
30 -
31 -### When disposal runs
32 -
33 -Riverpod counts listeners (from ref.watch, ref.listen, etc.). When the count reaches zero, it waits one frame; if still zero, **ref.onCancel** runs, then the state is destroyed and **ref.onDispose** runs.
34 -
35 -### Reacting to disposal: ref.onDispose
36 -
37 -Register a callback when the state is destroyed (e.g. close a StreamController):
38 -
39 -```dart
40 -final provider = StreamProvider<int>((ref) {
41 - final controller = StreamController<int>();
42 - ref.onDispose(controller.close);
43 - return controller.stream;
44 -});
45 -```
46 -
47 -Do not trigger side effects that modify other providers inside onDispose. You can call onDispose multiple times. Other lifecycles: **ref.onCancel** (last listener removed), **ref.onResume** (new listener added after cancel).
48 -
49 -### Forcing destruction: ref.invalidate
50 -
51 -From a widget or another provider, call **ref.invalidate(provider)** to destroy the current state. If the provider is still listened to, it will recompute; otherwise it stays destroyed until read again.
52 -
53 -```dart
54 -onPressed: () => ref.invalidate(someProvider),
55 -```
56 -
57 -For family providers you can invalidate one parameter combination or all (see riverpod-family and docs).
58 -
59 -### Keeping state alive: ref.keepAlive
60 -
61 -When auto-dispose is enabled, you can call **ref.keepAlive()** to prevent disposal until the next recomputation. Use to keep successful results alive while allowing failed or unused state to be disposed. The return value can be called to revert to automatic disposal. If the provider is recomputed, auto-dispose is re-enabled.
62 -
63 -### Caching for a duration
64 -
65 -Riverpod does not provide a built-in "cache for X seconds". You can implement it with a Timer and ref.keepAlive, or use ref.onCancel/onResume to dispose after a period of no listeners.
.claude/skills/riverpod-cancel/SKILL.md deleted
-36
@@ -1,36 +0,0 @@
1 ----
2 -name: riverpod-cancel
3 -description: Cancel or debounce Riverpod async requests with ref.onDispose; cancel when user leaves the page, debounce rapid refreshes. Use when the user asks about cancelling requests, debouncing, or cleaning up when a provider is disposed.
4 ----
5 -
6 -# Riverpod — Cancelling and debouncing requests
7 -
8 -## Instructions
9 -
10 -Use **ref.onDispose** together with **auto-dispose** (or ref.watch) to cancel in-flight requests when the user leaves the page, or to debounce rapid refreshes.
11 -
12 -### Cancelling when leaving the page
13 -
14 -Ensure the provider is **auto-dispose**. When the user navigates away, the provider loses its listeners and is disposed; **ref.onDispose** runs. In that callback, cancel the request (e.g. close the HTTP client used for the request).
15 -
16 -Example pattern: create an `http.Client()` in the provider, pass it to your fetch logic, and call **ref.onDispose(client.close)**. When the provider is disposed, the client closes and the request is cancelled. Exact API depends on your HTTP package.
17 -
18 -### Debouncing refreshes
19 -
20 -If the user triggers refresh multiple times quickly, you can delay the actual request until they stop (e.g. 500ms). Pattern:
21 -
22 -1. In the provider, set a flag (e.g. `didDispose = false`) and **ref.onDispose(() => didDispose = true)**.
23 -2. **await Future.delayed(duration)**.
24 -3. If **didDispose** is true, the user triggered another refresh during the delay; **throw** to abort (Riverpod catches and ignores). Otherwise create the client, register **onDispose(client.close)**, and run the request.
25 -
26 -So: delay first, then create client and run request; disposal during the delay aborts, disposal after creates client cancels the request.
27 -
28 -### Reusable extension
29 -
30 -You can implement an extension on **Ref** that returns a debounced/cancellable client:
31 -
32 -- Use **onDispose** to set a "cancelled" flag.
33 -- Wait for the debounce duration; if disposed, throw.
34 -- Create the client, **onDispose(client.close)**, return the client.
35 -
36 -Use this extension in your activity/provider so all call sites get debounce + cancel behavior. See the official Riverpod "cancel" how-to for a full extension example.
.claude/skills/riverpod-codegen-and-hooks/SKILL.md deleted
-105
@@ -1,105 +0,0 @@
1 ----
2 -name: riverpod-codegen-and-hooks
3 -description: Use Riverpod code generation (@riverpod, riverpod_generator) and hooks (hooks_riverpod, HookConsumerWidget, flutter_hooks with Riverpod). Use when the user asks about @riverpod, code generation, riverpod_generator, when to use codegen, or using flutter_hooks with Riverpod (HookConsumerWidget, HookConsumer).
4 ----
5 -
6 -# Riverpod — Code generation and hooks
7 -
8 -## Code generation
9 -
10 -Code generation is **optional** in Riverpod. It changes the syntax for defining providers: you write an annotated function or class and the generator produces the provider. Use it if you already use code generation (e.g. Freezed, json_serializable); otherwise the extra build step may not be worth it. See riverpod-getting-started for setup (build_runner, riverpod_generator).
11 -
12 -### Benefits
13 -
14 -- Clearer syntax: no manual provider type (Provider vs FutureProvider etc.); Riverpod infers it.
15 -- Parameters: any parameters (named, optional, defaults) instead of a single family parameter.
16 -- Stateful hot-reload for Riverpod code.
17 -- Better debugging via generated metadata.
18 -
19 -### Syntax
20 -
21 -**Functional provider** (sync):
22 -
23 -```dart
24 -@riverpod
25 -String example(Ref ref) {
26 - return 'foo';
27 -}
28 -```
29 -
30 -**Class-based provider** (sync, with methods for side effects):
31 -
32 -```dart
33 -@riverpod
34 -class Example extends _$Example {
35 - @override
36 - String build() => 'foo';
37 - // Add methods to mutate state
38 -}
39 -```
40 -
41 -**Async:** Use `Future`/`FutureOr`/`Stream`; async functions get AsyncValue and loading/error handling automatically. **Auto-dispose:** On by default with codegen. Disable with `@Riverpod(keepAlive: true)`.
42 -
43 -```dart
44 -@riverpod
45 -String example1(Ref ref) => 'foo';
46 -
47 -@Riverpod(keepAlive: true)
48 -String example2(Ref ref) => 'foo';
49 -```
50 -
51 -**Parameters:** Add parameters to the function (consistent == required):
52 -
53 -```dart
54 -@riverpod
55 -Future<User> fetchUser(Ref ref, {required int userId}) async {
56 - final json = await http.get('api/user/$userId');
57 - return User.fromJson(json);
58 -}
59 -```
60 -
61 -Manual equivalent would be `FutureProvider.autoDispose.family<User, int>(...)`. See riverpod-providers and riverpod-family for concepts.
62 -
63 ----
64 -
65 -## Hooks
66 -
67 -**Hooks** come from [flutter_hooks] (separate from Riverpod). They are for **local** widget state (e.g. TextEditingController, AnimationController) and can replace StatefulWidget or builder nesting. Use them only if you want hooks; they are not required for Riverpod. Newcomers should avoid hooks at first.
68 -
69 -### Using hooks and Riverpod together
70 -
71 -You need both **flutter_hooks** and **hooks_riverpod**. Then either:
72 -
73 -**Option 1: HookConsumerWidget** — One base class that supports both hooks and ref:
74 -
75 -```dart
76 -class Example extends HookConsumerWidget {
77 - @override
78 - Widget build(BuildContext context, WidgetRef ref) {
79 - final counter = useState(0);
80 - final value = ref.watch(myProvider);
81 - return Text('Hello $counter $value');
82 - }
83 -}
84 -```
85 -
86 -**Option 2: HookConsumer** — Builder that combines HookBuilder + Consumer (works with flutter_riverpod only if you nest them; hooks_riverpod provides HookConsumer):
87 -
88 -```dart
89 -return HookConsumer(
90 - builder: (context, ref, child) {
91 - final counter = useState(0);
92 - final value = ref.watch(myProvider);
93 - return Text('Hello $counter $value');
94 - },
95 -);
96 -```
97 -
98 -**Option 3:** Nest `Consumer` and `HookBuilder` (no hooks_riverpod needed).
99 -
100 -### Rules of hooks
101 -
102 -- Use hooks only in the **build** method of a widget that extends **HookWidget** (or HookConsumerWidget).
103 -- Do not use hooks conditionally or in loops; call order must be stable.
104 -
105 -See riverpod-consumers for Ref in widgets and the official docs for full codegen/hooks details.
.claude/skills/riverpod-consumers/SKILL.md deleted
-71
@@ -1,71 +0,0 @@
1 ----
2 -name: riverpod-consumers
3 -description: Use Riverpod Consumer, ConsumerWidget, and ConsumerStatefulWidget to read and watch providers in widgets; WidgetRef, builder ref parameter. Use when building widgets that need to access Riverpod providers, ref.watch or ref.read in the UI, or converting StatelessWidget to ConsumerWidget. Prefer this skill when the user asks how to use providers in Flutter widgets or why ConsumerWidget is required.
4 ----
5 -
6 -# Riverpod — Consumers
7 -
8 -## Instructions
9 -
10 -Consumers are widgets that give you a **Ref** (here, **WidgetRef**) so you can read and listen to providers. Without a Consumer, widgets cannot access the provider tree.
11 -
12 -### Consumer (builder)
13 -
14 -Use `Consumer` when you want to keep extending `StatelessWidget` or `StatefulWidget`. The builder callback receives `(context, ref, child)`.
15 -
16 -```dart
17 -class MyWidget extends StatelessWidget {
18 - @override
19 - Widget build(BuildContext context) {
20 - return Consumer(
21 - builder: (context, ref, _) {
22 - final value = ref.watch(myProvider);
23 - return Text(value.toString());
24 - },
25 - );
26 - }
27 -}
28 -```
29 -
30 -### ConsumerWidget
31 -
32 -Subclass `ConsumerWidget` instead of `StatelessWidget`. The `build` method receives `(BuildContext context, WidgetRef ref)`.
33 -
34 -```dart
35 -class MyWidget extends ConsumerWidget {
36 - @override
37 - Widget build(BuildContext context, WidgetRef ref) {
38 - final value = ref.watch(myProvider);
39 - return Text(value.toString());
40 - }
41 -}
42 -```
43 -
44 -### ConsumerStatefulWidget + ConsumerState
45 -
46 -When you need a `State` (e.g. for lifecycle or local state), use `ConsumerStatefulWidget` and `ConsumerState`. The state object has a `ref` property.
47 -
48 -```dart
49 -class MyWidget extends ConsumerStatefulWidget {
50 - @override
51 - ConsumerState<MyWidget> createState() => _MyWidgetState();
52 -}
53 -
54 -class _MyWidgetState extends ConsumerState<MyWidget> {
55 - @override
56 - Widget build(BuildContext context) {
57 - final value = ref.watch(myProvider);
58 - return Text(value.toString());
59 - }
60 -}
61 -```
62 -
63 -### Which to use
64 -
65 -- **Consumer** — Use for everything if you prefer not to change your widget base class; slightly more verbose.
66 -- **ConsumerWidget** — Recommended when you don't need State; one less nesting level.
67 -- **ConsumerStatefulWidget** — Use when you need State (e.g. TabController, animations).
68 -
69 -### Why not StatelessWidget + context.watch?
70 -
71 -Riverpod does not use `BuildContext` to watch providers because that would break **auto-dispose** and other features that rely on knowing when a widget stops listening. Ref-based consumers allow reliable disposal and correct behavior. The hooks_riverpod package also offers HookConsumerWidget etc. for use with flutter_hooks. Enable riverpod_lint for IDE refactors (e.g. "Convert to ConsumerWidget").
.claude/skills/riverpod-containers/SKILL.md deleted
-66
@@ -1,66 +0,0 @@
1 ----
2 -name: riverpod-containers
3 -description: Use ProviderScope in Flutter and ProviderContainer in Dart for Riverpod; where provider state is stored, overrides, observers, testing with ProviderContainer.test. Use when setting up Riverpod in Flutter or pure Dart, understanding where state lives, or writing tests with a fresh container. Use this skill when the user asks about ProviderScope, ProviderContainer, or where Riverpod stores state.
4 ----
5 -
6 -# Riverpod — Containers / Scopes
7 -
8 -## Instructions
9 -
10 -Providers themselves hold **no state**. State is stored in a **ProviderContainer**. In Flutter you use the **ProviderScope** widget, which creates and exposes a container to the widget tree.
11 -
12 -### Flutter: ProviderScope
13 -
14 -Wrap your app at the root so widgets can read providers:
15 -
16 -```dart
17 -void main() {
18 - runApp(
19 - ProviderScope(
20 - child: MyApp(),
21 - ),
22 - );
23 -}
24 -```
25 -
26 -After that, use Consumer / ConsumerWidget / ConsumerStatefulWidget to get a `ref` and call `ref.watch` / `ref.read`. You can also pass `overrides` or `observers` to ProviderScope.
27 -
28 -### Pure Dart: ProviderContainer
29 -
30 -In command-line or server-side Dart, create a container, use it, then dispose it:
31 -
32 -```dart
33 -void main() {
34 - final container = ProviderContainer();
35 - try {
36 - final sub = container.listen(counterProvider, (previous, next) {
37 - print('Counter changed from $previous to $next');
38 - });
39 - print('Counter starts at ${sub.read()}');
40 - } finally {
41 - container.dispose();
42 - }
43 -}
44 -```
45 -
46 -### Why state lives in a container
47 -
48 -- **Separation of concerns** — Only the provider (and ref) can change its state; the UI typically calls notifier methods.
49 -- **Testing** — Each test can create a new container (e.g. `ProviderContainer.test()`) for a fresh state; no shared global state.
50 -- **Configuration** — Overrides and observers are set on the container/scope. See riverpod-overrides and riverpod-observers.
51 -- **Scoping** — The same provider can resolve to different state in different parts of the tree (advanced). See riverpod-scoping.
52 -
53 -### Testing
54 -
55 -Do not use `ProviderContainer()` directly in tests. Use **ProviderContainer.test()** so the container is disposed when the test ends:
56 -
57 -```dart
58 -test('Counter starts at 0 and can be incremented', () {
59 - final container = ProviderContainer.test();
60 - expect(container.read(counterProvider), 0);
61 - container.read(counterProvider.notifier).increment();
62 - expect(container.read(counterProvider), 1);
63 -});
64 -```
65 -
66 -In widget tests, wrap the widget in `ProviderScope` and use `tester.container()` to get the container if needed (see riverpod-testing).
.claude/skills/riverpod-eager-initialization/SKILL.md deleted
-46
@@ -1,46 +0,0 @@
1 ----
2 -name: riverpod-eager-initialization
3 -description: Eagerly initialize Riverpod providers at app startup by watching them in a root Consumer; handle loading/error in the initializer, AsyncValue.requireValue. Use when a provider must be ready before the rest of the app is used. Use this skill when the user asks about eager initialization or preloading providers.
4 ----
5 -
6 -# Riverpod — Eager initialization
7 -
8 -## Instructions
9 -
10 -Providers are **lazy** by default: they initialize on first use. There is no built-in "eager" flag (for tree-shaking). To force early initialization, **watch** the provider at the root of your app so it stays alive and runs immediately.
11 -
12 -### Approach
13 -
14 -Place a **Consumer** (or ConsumerWidget) directly under **ProviderScope** that only watches the providers you want to initialize and returns your real app as **child**:
15 -
16 -```dart
17 -void main() {
18 - runApp(ProviderScope(child: MyApp()));
19 -}
20 -
21 -class MyApp extends StatelessWidget {
22 - @override
23 - Widget build(BuildContext context) {
24 - return const _EagerInitialization(child: MaterialApp());
25 - }
26 -}
27 -
28 -class _EagerInitialization extends ConsumerWidget {
29 - const _EagerInitialization({required this.child});
30 - final Widget child;
31 -
32 - @override
33 - Widget build(BuildContext context, WidgetRef ref) {
34 - ref.watch(myProvider); // Eagerly initialize
35 - return child;
36 - }
37 -}
38 -```
39 -
40 -Only the initializer widget rebuilds when the provider changes; **child** is unchanged so Flutter does not rebuild the rest of the tree unless something else is listening.
41 -
42 -### Async: loading and error
43 -
44 -If the provider is async, handle loading/error in the initializer (e.g. show CircularProgressIndicator or error until ready, then return child). Other widgets can use **AsyncValue.requireValue** to read the data without pattern matching; if they run before the value is ready, it throws with a clear message.
45 -
46 -Put the initializer in a shared widget (e.g. MyApp) so tests can reuse the same setup by using that widget.
.claude/skills/riverpod-family/SKILL.md deleted
-66
@@ -1,66 +0,0 @@
1 ----
2 -name: riverpod-family
3 -description: Use Riverpod family providers to pass parameters and cache per parameter; FutureProvider.family, NotifierProvider.family, autoDispose with family, overriding in tests. Use when fetching data by ID, pagination, or any provider that depends on a parameter. Use this skill when the user asks about family, provider parameters, or caching by ID.
4 ----
5 -
6 -# Riverpod — Family
7 -
8 -## Instructions
9 -
10 -**Family** lets a single provider have multiple independent states, one per parameter combination (like a Map from parameter to state). Use it for API calls that depend on an ID, query, or page number.
11 -
12 -### Creating a family (functional)
13 -
14 -Add `.family` and an extra type parameter for the argument. The provider function receives `(ref, param)`:
15 -
16 -```dart
17 -final userProvider = FutureProvider.autoDispose.family<User, String>((ref, id) async {
18 - final dio = Dio();
19 - final response = await dio.get('https://api.example.com/users/$id');
20 - return User.fromJson(response.data);
21 -});
22 -```
23 -
24 -With code generation, add parameters to the function; the generated provider accepts arguments: `userProvider(id)`.
25 -
26 -### Creating a family (Notifier)
27 -
28 -Use `NotifierProvider.family` / `AsyncNotifierProvider.family` (and `.autoDispose.family`). The Notifier must have a constructor that stores the parameter:
29 -
30 -```dart
31 -final userProvider = AsyncNotifierProvider.autoDispose.family<UserNotifier, User, String>(
32 - UserNotifier.new,
33 -);
34 -
35 -class UserNotifier extends AsyncNotifier<User> {
36 - UserNotifier(this.id);
37 - final String id;
38 -
39 - @override
40 - Future<User> build() async {
41 - final dio = Dio();
42 - final response = await dio.get('https://api.example.com/users/$id');
43 - return User.fromJson(response.data);
44 - }
45 -}
46 -```
47 -
48 -### Using a family
49 -
50 -Pass the parameter when watching or reading:
51 -
52 -```dart
53 -final user = ref.watch(userProvider('123'));
54 -final other = ref.watch(userProvider('456')); // independent state
55 -```
56 -
57 -Parameters must have consistent **==** and **hashCode**. Do not use mutable or list/map literals as parameters (e.g. `ref.watch(myProvider([1,2,3]))` is wrong because `[1,2,3] != [1,2,3]`). Prefer primitives or custom classes with ==/hashCode. Enable riverpod_lint provider_parameters rule to catch mistakes.
58 -
59 -### Auto-dispose with family
60 -
61 -Enable auto-dispose when using family so that when the parameter goes out of use (e.g. user navigates away), that parameter's state can be disposed and you avoid unbounded cache growth.
62 -
63 -### Overriding in tests
64 -
65 -- Override a single parameter: pass the same parameter to the override.
66 -- Override all parameters: override with a provider that ignores the parameter or returns a fixed value. See riverpod-overrides and the docs for exact syntax.
.claude/skills/riverpod-faq-and-practices/SKILL.md deleted
-58
@@ -1,58 +0,0 @@
1 ----
2 -name: riverpod-faq-and-practices
3 -description: Answers Riverpod FAQ (ref.refresh vs invalidate, ConsumerWidget vs StatelessWidget, Ref vs WidgetRef, reset all providers, ref after unmount) and do/don't best practices (avoid init in widgets, avoid ephemeral state in providers, avoid side effects in provider init, static providers, riverpod_lint). Use when the user asks Riverpod FAQ, best practices, or do/don't guidelines.
4 ----
5 -
6 -# Riverpod — FAQ and best practices
7 -
8 -## FAQ
9 -
10 -### ref.refresh vs ref.invalidate
11 -
12 -**ref.refresh** = **ref.invalidate** + **ref.read**: it invalidates the provider and returns the new value. Use **invalidate** when you don't need the new value (e.g. "recompute when the user pulls to refresh"). Use **refresh** when you need the result right away. After invalidate alone, recomputation can happen at the next frame or when the provider is next read; refresh forces immediate recomputation by reading.
13 -
14 -### Why no shared interface between Ref and WidgetRef?
15 -
16 -Ref (in providers) and WidgetRef (in widgets) are kept separate on purpose so you don't write code that conditionally depends on both; they have subtle differences and mixing would be error-prone. Prefer **Ref**: put logic in a Notifier and call **ref.read(notifierProvider.notifier).yourMethod()** from the UI; the method uses the Notifier's Ref.
17 -
18 -### Why ConsumerWidget instead of StatelessWidget?
19 -
20 -InheritedWidget (and thus BuildContext) cannot support "on change" listeners like **ref.listen**, cannot know when widgets stop listening (needed for auto-dispose and family), and has lifecycle quirks (e.g. with GlobalKeys). Riverpod needs a Ref that isn't tied to BuildContext for these features. Hence ConsumerWidget (and Consumer) provide a Ref.
21 -
22 -### Why doesn't hooks_riverpod export flutter_hooks?
23 -
24 -So each package can be versioned independently; a breaking change in one doesn't force the other to break.
25 -
26 -### Reset all providers at once?
27 -
28 -There is no API to reset all providers; it's considered an anti-pattern. For "logout and clear state", have providers that depend on the current user **ref.watch** a user provider; when the user logs out, that provider changes and dependents recompute or clear. Only user-dependent state resets; the rest stays.
29 -
30 -### "Using ref when a widget is about to or has been unmounted is unsafe"
31 -
32 -This (or "No ProviderScope found") happens when **ref** is used after an **await** in a widget that may have been disposed. After any **await**, check **if (!context.mounted) return;** before using **ref** (same pattern as with BuildContext).
33 -
34 ----
35 -
36 -## Do / Don't
37 -
38 -### AVOID initializing providers in a widget
39 -
40 -Providers should initialize themselves. Don't call something like **ref.read(provider).init()** from **initState**. If initialization depends on user action (e.g. navigation), trigger it from the action (e.g. **onPressed** before **Navigator.push**).
41 -
42 -### AVOID using providers for ephemeral state
43 -
44 -Use providers for **shared business state**, not for: selected tab/item, form state (which should reset on leave/back), animations, or controller-like state (e.g. TextEditingController). For local widget state use **flutter_hooks** or local state. Storing "selected item" in a global provider can break back navigation (e.g. back from /books/21 should show /books/42, but the provider still holds 21).
45 -
46 -### DON'T perform side effects during provider initialization
47 -
48 -Providers should represent "read" operations. Don't use a provider's build to perform "write" operations (e.g. submitting a form). That can lead to skipped or duplicated side effects. For loading/error of a side effect use **mutations** (see riverpod-mutations).
49 -
50 -### PREFER statically known providers with ref.watch/read/listen
51 -
52 -Use **ref.watch(provider)** where **provider** is a top-level final (or otherwise statically known). Avoid passing a provider as a parameter and then watching it so that static analysis and riverpod_lint can work.
53 -
54 -### AVOID dynamically creating providers
55 -
56 -Define providers as **top-level final** variables. Don't create them inside classes or as instance fields; that can cause memory leaks and unsupported behavior. Static final in a class is allowed but not supported by code generation.
57 -
58 -Enable **riverpod_lint** (see riverpod-getting-started) to enforce many of these practices.
.claude/skills/riverpod-from-provider/SKILL.md deleted
-97
@@ -1,97 +0,0 @@
1 ----
2 -name: riverpod-from-provider
3 -description: Migrate from package:provider to Riverpod; ChangeNotifierProvider, ProxyProvider to ref.watch, context.watch to ref.watch, ConsumerWidget, incremental migration, family and autoDispose. Use when the user is migrating from Provider to Riverpod, or asks about Provider vs Riverpod, or how to replace ProxyProvider/ChangeNotifierProvider.
4 ----
5 -
6 -# Riverpod — Migrating from Provider
7 -
8 -## Motivation
9 -
10 -Riverpod was created as a successor to Provider, addressing InheritedWidget limitations:
11 -
12 -- **Same type:** Provider can't have two `Provider<Item>` in the tree (only the nearest is found). Riverpod has no such limit; providers are identified by variable, not type.
13 -- **Combining providers:** ProxyProvider is tedious and error-prone. In Riverpod, use **ref.watch** inside a provider to depend on others; composition is straightforward.
14 -- **AsyncValue:** Riverpod can expose previous data while loading (e.g. show old list + loading indicator). Provider doesn't offer this cleanly.
15 -- **Safety:** Provider can throw `ProviderNotFoundException` at runtime. Riverpod avoids this by design.
16 -- **Disposal:** Provider can't react when consumers stop listening; scoping is tricky. Riverpod offers **autoDispose** and **ref.keepAlive** for clear lifecycle and caching.
17 -- **Parameters:** Riverpod's **.family** gives type-safe, parameterized providers with per-parameter state; with autoDispose, state is disposed when unused. Equivalent in Provider is impractical.
18 -- **Testing:** With Provider you must re-define providers per test. With Riverpod, override with **overrides** to mock.
19 -- **Side effects:** Riverpod offers **ref.listen** for reacting to changes (e.g. navigation, snackbars). Provider has no built-in equivalent.
20 -
21 -The main API change: use **ConsumerWidget** (and **WidgetRef**) instead of StatelessWidget, and **ref.watch** / **ref.read** instead of **context.watch** / **context.read**.
22 -
23 ----
24 -
25 -## Quickstart
26 -
27 -- Read the Riverpod getting started guide (riverpod-getting-started) and try a small example.
28 -- Migrate **incrementally**. You can run Provider and Riverpod side by side (use import aliases if needed).
29 -
30 -### Start with ChangeNotifierProvider
31 -
32 -Keep existing **ChangeNotifier** classes and wrap them in Riverpod's **ChangeNotifierProvider**:
33 -
34 -```dart
35 -final myNotifierProvider = ChangeNotifierProvider<MyNotifier>((ref) => MyNotifier());
36 -```
37 -
38 -Use **ProviderScope** at the root. Replace **context.watch** with **ref.watch** where this provider is used (e.g. in a ConsumerWidget). No need to convert every ChangeNotifier to a Notifier immediately.
39 -
40 -### Start with leaves
41 -
42 -Migrate providers that have no dependencies first (the "leaves"), then those that depend on them. Avoid migrating ProxyProviders until their dependencies are migrated.
43 -
44 -### One provider at a time
45 -
46 -Migrate and test one provider at a time. Full migration of a ChangeNotifier means: (1) convert to **Notifier** + **NotifierProvider**, (2) replace every **context.watch** for it with **ref.watch**.
47 -
48 -### ProxyProvider → ref.watch
49 -
50 -In Riverpod, combining providers is done with **ref.watch** inside another provider:
51 -
52 -```dart
53 -final labelProvider = Provider<String>((ref) {
54 - final userIdNotifier = ref.watch(userIdNotifierProvider);
55 - return 'The user ID is ${userIdNotifier.userId}';
56 -});
57 -```
58 -
59 -For stateful combined objects (like ChangeNotifierProxyProvider), use **ref.listen** in the provider to react to another provider and update your notifier.
60 -
61 -### Eager initialization
62 -
63 -Riverpod providers are lazy. To warm data at startup, watch the provider at the root (e.g. in a Consumer under ProviderScope that returns your app as child). See riverpod-eager-initialization.
64 -
65 -### Code generation
66 -
67 -Code gen doesn't generate ChangeNotifierProvider. You can use a small extension (listenAndDisposeChangeNotifier) to expose ChangeNotifier with @riverpod during migration; once you switch to Notifier, remove the extension. See the official quickstart for the snippet.
68 -
69 ----
70 -
71 -## Provider vs Riverpod
72 -
73 -### Defining providers
74 -
75 -- **Provider:** Providers are widgets (e.g. inside MultiProvider).
76 -- **Riverpod:** Providers are top-level **final** variables. No widget tree for definitions. Add **ProviderScope** at the root of the app.
77 -
78 -### Reading
79 -
80 -- **Provider:** `context.watch<T>()`, `context.read<T>()`, `context.select<T,R>(...)`.
81 -- **Riverpod:** Use **ConsumerWidget** (or Consumer) to get **WidgetRef ref**; then **ref.watch(provider)**, **ref.read(provider)**, **ref.watch(provider.select(...))**.
82 -- Use **watch** in build, **read** in event handlers. Same mental model as Provider.
83 -
84 -### Consumer
85 -
86 -Riverpod has **Consumer** with `(context, ref, child)`. No need for Consumer2, Consumer3, etc.: just multiple **ref.watch** calls in one builder.
87 -
88 -### Scoping vs family + autoDispose
89 -
90 -Provider uses scoping to destroy state or have per-page state. In Riverpod:
91 -
92 -- **autoDispose** destroys state when there are no listeners (ref.onCancel / ref.onDispose).
93 -- **.family** gives parameterized providers (one state per parameter). Use with autoDispose to avoid unbounded cache.
94 -
95 -So: use **.family** for "state per X" and **.autoDispose** for "destroy when unused" instead of scoping.
96 -
97 -See riverpod-getting-started, riverpod-providers, riverpod-family, and riverpod-auto-dispose for details.
.claude/skills/riverpod-getting-started/SKILL.md deleted
-139
@@ -1,139 +0,0 @@
1 ----
2 -name: riverpod-getting-started
3 -description: Install Riverpod (flutter_riverpod or riverpod), wrap the app in ProviderScope, run a hello-world provider, and optionally enable riverpod_lint and code generation. Use when starting a Flutter or Dart project with Riverpod, adding the Riverpod dependency, or setting up ProviderScope and a first provider. For version highlights see the official Riverpod docs.
4 ----
5 -
6 -# Riverpod — Getting Started
7 -
8 -## Instructions
9 -
10 -### Installing the package
11 -
12 -Riverpod is available as a main package (Flutter: `flutter_riverpod`; Dart-only: `riverpod`). Optional packages add code generation and hooks.
13 -
14 -**Flutter:**
15 -
16 -```bash
17 -flutter pub add flutter_riverpod
18 -```
19 -
20 -With code generation:
21 -
22 -```bash
23 -flutter pub add flutter_riverpod riverpod_annotation
24 -flutter pub add dev:riverpod_generator build_runner
25 -```
26 -
27 -**Dart only:**
28 -
29 -```bash
30 -dart pub add riverpod
31 -```
32 -
33 -With code generation:
34 -
35 -```bash
36 -dart pub add riverpod riverpod_annotation
37 -dart pub add dev:riverpod_generator build_runner
38 -```
39 -
40 -**Manual `pubspec.yaml` (Flutter):**
41 -
42 -```yaml
43 -dependencies:
44 - flutter:
45 - sdk: flutter
46 - flutter_riverpod: ^2.0.0 # use latest from pub.dev
47 -
48 -dev_dependencies:
49 - build_runner:
50 - riverpod_generator: ^2.0.0 # if using code generation
51 -```
52 -
53 -Then run `flutter pub get` (or `dart pub get` for Dart-only).
54 -
55 -If using code generation, run:
56 -
57 -```sh
58 -dart run build_runner watch -d
59 -```
60 -
61 -**Note:** Some Riverpod packages may require Flutter's beta channel for compatibility with latest `json_serializable`. If `pub get` fails, try `flutter channel beta` or use Riverpod `<=3.1.0`.
62 -
63 -### Wrap the app in ProviderScope
64 -
65 -Widgets need a `ProviderScope` (Flutter) or a `ProviderContainer` (Dart) to read providers.
66 -
67 -**Flutter — ProviderScope:**
68 -
69 -```dart
70 -import 'package:flutter/material.dart';
71 -import 'package:flutter_riverpod/flutter_riverpod.dart';
72 -
73 -void main() {
74 - runApp(
75 - ProviderScope(
76 - child: MyApp(),
77 - ),
78 - );
79 -}
80 -```
81 -
82 -**Dart only — ProviderContainer:**
83 -
84 -```dart
85 -final container = ProviderContainer();
86 -final value = container.read(helloWorldProvider);
87 -print(value);
88 -// Don't forget to container.dispose() when done
89 -```
90 -
91 -### Hello world (Flutter with code generation)
92 -
93 -```dart
94 -import 'package:flutter/material.dart';
95 -import 'package:flutter_riverpod/flutter_riverpod.dart';
96 -import 'package:riverpod_annotation/riverpod_annotation.dart';
97 -
98 -part 'main.g.dart';
99 -
100 -@riverpod
101 -String helloWorld(Ref ref) {
102 - return 'Hello world';
103 -}
104 -
105 -void main() {
106 - runApp(ProviderScope(child: MyApp()));
107 -}
108 -
109 -class MyApp extends ConsumerWidget {
110 - @override
111 - Widget build(BuildContext context, WidgetRef ref) {
112 - final String value = ref.watch(helloWorldProvider);
113 - return MaterialApp(
114 - home: Scaffold(
115 - appBar: AppBar(title: const Text('Example')),
116 - body: Center(child: Text(value)),
117 - ),
118 - );
119 - }
120 -}
121 -```
122 -
123 -Run `dart run build_runner build` (or `watch`) to generate `main.g.dart`. Without code generation, use a manual provider (e.g. `final helloWorldProvider = Provider<String>((ref) => 'Hello world');`) and the same `ProviderScope` + `ConsumerWidget` pattern.
124 -
125 -### Enabling riverpod_lint
126 -
127 -Add the optional linter via `analysis_options.yaml`:
128 -
129 -```yaml
130 -plugins:
131 - riverpod_lint: ^2.0.0 # use latest from https://pub.dev/packages/riverpod_lint
132 -```
133 -
134 -This provides lint rules and refactorings for Riverpod. See the riverpod_lint package page for the full list.
135 -
136 -### Going further
137 -
138 -- **Code generation and hooks:** See the riverpod-codegen-and-hooks skill (or docs: About code generation, About hooks).
139 -- **VS Code / Android Studio:** Consider Flutter Riverpod Snippets extensions for faster boilerplate.
.claude/skills/riverpod-migration/SKILL.md deleted
-29
@@ -1,29 +0,0 @@
1 ----
2 -name: riverpod-migration
3 -description: Migrate Riverpod from StateNotifier to Notifier/AsyncNotifier, from ChangeNotifier to AsyncNotifier, or upgrade from 0.13/0.14/1.0; ref.onDispose, family, lifecycle, riverpod migrate CLI. Use when the user asks about migrating from StateNotifier, from ChangeNotifier, upgrading Riverpod 0.13 to 0.14, 0.14 to 1.0, or Riverpod migration guides.
4 ----
5 -
6 -# Riverpod — Migration guides
7 -
8 -## Instructions
9 -
10 -This skill points to detailed migration guides for different scenarios. Use the reference file that matches your case.
11 -
12 -### When to use which guide
13 -
14 -| Scenario | Reference |
15 -|----------|-----------|
16 -| **From StateNotifier** to Notifier / AsyncNotifier | [migration_from_state_notifier.md](reference/migration_from_state_notifier.md) |
17 -| **From ChangeNotifier** to AsyncNotifier | [migration_from_change_notifier.md](reference/migration_from_change_notifier.md) |
18 -| **Upgrade 0.13.x → 0.14.x** (StateNotifierProvider syntax, watch(provider) vs provider.state) | [migration_0_13_0_14.md](reference/migration_0_13_0_14.md) |
19 -| **Upgrade 0.14.x → 1.0** (ScopedReader → WidgetRef, useProvider → ref.watch, StateProvider) | [migration_0_14_1_0.md](reference/migration_0_14_1_0.md) |
20 -
21 -For **Riverpod 2.0 → 3.0** see the **riverpod-3-0-migration** skill.
22 -
23 -### Common themes
24 -
25 -- **StateNotifier → Notifier/AsyncNotifier:** Put init logic in `build`; use `ref.onDispose` instead of overloading `dispose`; no `mounted`—use cancellation (e.g. Completer or HTTP cancel token). Consumers stay the same (ref.watch, methods on notifier).
26 -- **ChangeNotifier → AsyncNotifier:** Replace `isLoading`/`hasError`/manual try-catch with `AsyncValue`; single `state`; mutations by reassigning `state`.
27 -- **CLI:** For 0.14 and 1.0 upgrades you can run `dart pub global activate riverpod_cli` then `riverpod migrate` in the project (do not upgrade Riverpod manually first; the tool will suggest version and changes).
28 -
29 -Open the relevant reference file for step-by-step instructions and code examples.
.claude/skills/riverpod-migration/reference/migration_0_13_0_14.md deleted
-23
@@ -1,23 +0,0 @@
1 -# Migration: 0.13.x → 0.14.x
2 -
3 -- In **0.14.0** the way **StateNotifierProvider** and state/notifier reading work changed.
4 -
5 -## Changes
6 -
7 -1. **StateNotifierProvider** gets an extra type parameter: the **state** type.
8 - - Before: `StateNotifierProvider<MyStateNotifier>(...)`
9 - - After: `StateNotifierProvider<MyStateNotifier, MyModel>(...)`
10 -
11 -2. **Reading the notifier**
12 - - Before: `watch(provider)` returned the StateNotifier.
13 - - After: use **provider.notifier**: `watch(provider.notifier)` to get the StateNotifier.
14 -
15 -3. **Reading the state**
16 - - Before: `watch(provider.state)` for the state.
17 - - After: `watch(provider)` returns the state directly.
18 -
19 -## CLI migration
20 -
21 -- Install: `dart pub global activate riverpod_cli`
22 -- In the project (do **not** upgrade Riverpod first): run **riverpod migrate**.
23 -- The tool will suggest edits (e.g. `watch(provider.state)` → `watch(provider)`). Accept with `y` or reject with `n`.
.claude/skills/riverpod-migration/reference/migration_0_14_1_0.md deleted
-30
@@ -1,30 +0,0 @@
1 -# Migration: 0.14.x → 1.0
2 -
3 -- **1.0** unifies the API for reading providers and changes some types.
4 -
5 -## CLI migration
6 -
7 -- Install: `dart pub global activate riverpod_cli`
8 -- **Do not** upgrade to 1.0 before running the tool; stay on 0.14.x.
9 -- Run **riverpod migrate** in the project; it will suggest changes and can upgrade the dependency.
10 -
11 -## Syntax unification
12 -
13 -- **Single syntax**: **ref.watch(provider)** (and ref.read). **useProvider**, **watch(provider)** without ref, and **context.read** are removed.
14 -
15 -- **ConsumerWidget / Consumer**
16 - - Before: `build(BuildContext context, ScopedReader watch)` and `watch(provider)`.
17 - - After: `build(BuildContext context, WidgetRef ref)` and **ref.watch(provider)**.
18 - - Consumer: `builder: (context, watch, child)` → `builder: (context, ref, child)` and use **ref.watch(provider)**.
19 -
20 -- **HookWidget**
21 - - **useProvider(provider)** is removed. Use **HookConsumerWidget** and **ref.watch(provider)** in build.
22 -
23 -- **context.read**
24 - - Use **ConsumerWidget** (or Consumer) and **ref.read(provider)** instead of **context.read**.
25 -
26 -## StateProvider
27 -
28 -- **ref.watch(StateProvider)** used to return a **StateController**; in 1.0 it returns the **state** value only.
29 - - If you only displayed the value: change to **ref.watch(provider)** and use the value directly.
30 - - If you need the controller: use **ref.watch(provider.state)** to keep the old behavior (StateController).
.claude/skills/riverpod-migration/reference/migration_from_change_notifier.md deleted
-36
@@ -1,36 +0,0 @@
1 -# Migration: From ChangeNotifier to AsyncNotifier
2 -
3 -- For apps already on Riverpod using **ChangeNotifierProvider**, this guide moves to **AsyncNotifier** (and **Notifier** where state is sync).
4 -
5 -## Why migrate
6 -
7 -- ChangeNotifier leads to **isLoading** / **hasError** flags and lots of **try/catch/finally** and **notifyListeners()**.
8 -- AsyncNotifier uses a single **state** and **AsyncValue**; Riverpod handles loading/error; less boilerplate and fewer inconsistent states.
9 -
10 -## Steps
11 -
12 -1. **Choose the notifier type**
13 - - Side effects (methods that change state)? → Class-based (Notifier or AsyncNotifier).
14 - - Async load (e.g. network)? → **AsyncNotifier<T>**.
15 - - Parameters? → Add them to the notifier (e.g. constructor + field) and use family/provider that passes them.
16 -
17 -2. **Declaration**
18 - - Replace **ChangeNotifierProvider** with **AsyncNotifierProvider** (or NotifierProvider if sync).
19 - - State type: e.g. **AsyncNotifier<List<Todo>>**; no separate **todos** / **isLoading** / **hasError**—just **state** and AsyncValue.
20 -
21 -3. **Initialization**
22 - - Move init from a custom method (e.g. **init**) into **build**.
23 - - **build** returns **Future<List<Todo>>**; Riverpod exposes **AsyncValue<List<Todo>>** to the UI. No manual try/catch in build.
24 -
25 -4. **Mutations**
26 - - Replace flag updates and notifyListeners with **state = newValue** (and **state = AsyncValue.data(...)** or **AsyncValue.error(...)** if you construct explicitly). Use **ref** for dependencies (ref.watch, ref.read) inside methods.
27 -
28 -5. **Consumers**
29 - - **ref.watch(provider)** now gets **AsyncValue<T>**; handle loading/error/data in the UI. Use **ref.read(provider.notifier)** to call methods.
30 -
31 -## Summary
32 -
33 -- Init in **build**; no **todos**/isLoading/hasError.
34 -- No try-catch-finally in build; return the Future.
35 -- Side effects: reassign **state**; use **ref** for other providers.
36 -- See riverpod-providers and riverpod-refs for Notifier/AsyncNotifier and Ref APIs.
.claude/skills/riverpod-migration/reference/migration_from_state_notifier.md deleted
-42
@@ -1,42 +0,0 @@
1 -# Migration: From StateNotifier to Notifier / AsyncNotifier
2 -
3 -- **StateNotifier** is deprecated in favor of **Notifier** and **AsyncNotifier** (Riverpod 2.0+).
4 -
5 -## Main differences
6 -
7 -- Dependencies: in StateNotifier they were in the provider; in Notifier they go in **build** via **ref.watch**.
8 -- Initialization: StateNotifier split between provider and constructor; Notifier uses a single **build** method; no logic in the constructor.
9 -- Lifecycle: StateNotifier had **dispose** on the class. Notifier/AsyncNotifier use **ref.onDispose** (and ref.onCancel) in build, like any other provider. Only internal state is disposed on rebuild; the notifier type itself is not disposed the same way.
10 -- **mounted**: Notifier/AsyncNotifier do not have **mounted**. Use cancellation (Completer, Dio CancelToken, etc.) instead of checking mounted after async work.
11 -
12 -## Sync: StateNotifier → Notifier
13 -
14 -- Replace **StateNotifierProvider** with **NotifierProvider**.
15 -- Move reactive dependencies from the provider into **build** with **ref.watch**.
16 -- Put all init logic in **build**; leave constructor minimal.
17 -- Use **ref.onDispose** in build for cleanup (no override of dispose).
18 -
19 -## Async: StateNotifier → AsyncNotifier
20 -
21 -- Replace **StateNotifierProvider** with **AsyncNotifierProvider**.
22 -- Move async init into **build** returning **Future<T>**; remove AsyncValue.guard / try-catch in build.
23 -- Use **future** and **update** on AsyncNotifier for simpler async flows.
24 -- Migrating from **StateNotifier<AsyncValue<T>>** to **AsyncNotifier<T>**: put init in build, remove manual try/catch and AsyncValue handling in build.
25 -
26 -## Family and autoDispose
27 -
28 -- With Notifier/AsyncNotifier, family parameters are passed into the class (e.g. constructor + field) and are available in build; no separate “family” type.
29 -- AutoDispose is expressed the same as other providers (e.g. ref.onDispose in build).
30 -
31 -## Consumers and mutations
32 -
33 -- **Consumers do not change**: ref.watch(provider), ref.read(provider.notifier), and calling notifier methods stay the same.
34 -- **ref.listen** replaces StateNotifier’s **.addListener** / **.stream**: use **ref.listen(provider, (prev, next) { ... })**.
35 -
36 -## Tests
37 -
38 -- **.debugState** is gone. Use **ref.read(provider)** or **ref.read(provider.notifier)** to get the notifier/state in tests; do not instantiate Notifier/AsyncNotifier by hand (ref and family args would be unset).
39 -
40 -## StateProvider
41 -
42 -- **StateProvider** is deprecated with StateNotifierProvider. Migrate to **Notifier**: one Notifier with **build** returning the initial value and methods that set **state**.
.claude/skills/riverpod-mutations/SKILL.md deleted
-80
@@ -1,80 +0,0 @@
1 ----
2 -name: riverpod-mutations
3 -description: Use Riverpod mutations for UI-driven async operations like form submit; Mutation.run, MutationIdle/Pending/Success/Error, Mutation.reset, keyed mutations. Use when showing loading/error/success for a single action (e.g. submit button) without polluting provider state. Use this skill when the user asks about mutations, loading state for actions, or form submission with Riverpod.
4 ----
5 -
6 -# Riverpod — Mutations (experimental)
7 -
8 -## Instructions
9 -
10 -**Mutations** represent a single async operation the UI can react to (e.g. "add todo" in progress, succeeded, or failed). They keep loading/error/success out of your main provider state. The API is experimental and may change.
11 -
12 -### Defining a mutation
13 -
14 -Create a `Mutation<T>` instance (T is the result type, optional):
15 -
16 -```dart
17 -final addTodo = Mutation<Todo>();
18 -```
19 -
20 -Typically store it as a global or `static final` on a Notifier.
21 -
22 -### Listening
23 -
24 -Use ref.watch in a Consumer (or inside a provider) to drive the UI:
25 -
26 -```dart
27 -final addTodoState = ref.watch(addTodo);
28 -
29 -// In build:
30 -backgroundColor: switch (addTodoState) {
31 - MutationError() => const WidgetStatePropertyAll(Colors.red),
32 - _ => null,
33 -},
34 -if (addTodoState is MutationPending) ...[
35 - const SizedBox(width: 8),
36 - const CircularProgressIndicator(),
37 -],
38 -```
39 -
40 -### States
41 -
42 -- **MutationIdle** — Not started or reset.
43 -- **MutationPending** — In progress.
44 -- **MutationSuccess** — Succeeded; result available.
45 -- **MutationError** — Failed; error available.
46 -
47 -Use a `switch` on the state to handle each case.
48 -
49 -### Triggering
50 -
51 -Call **Mutation.run(ref, callback)**. The callback receives a transaction object (e.g. `tsx`) to access providers and must return a value of type T:
52 -
53 -```dart
54 -addTodo.run(ref, (tsx) async {
55 - final todoNotifier = tsx.get(todoNotifierProvider.notifier);
56 - final createdTodo = await todoNotifier.addTodo('Eat a cookie');
57 - return createdTodo;
58 -});
59 -```
60 -
61 -Use `tsx.get(provider)` to keep providers alive for the duration of the mutation.
62 -
63 -### Keyed mutations
64 -
65 -Pass a key to have multiple instances (e.g. one mutation per list item):
66 -
67 -```dart
68 -ref.watch(deleteItemMutation(itemId));
69 -deleteItemMutation(itemId).run(ref, (tsx) async { ... });
70 -```
71 -
72 -### Resetting
73 -
74 -Mutations reset to Idle when they complete or when all listeners are removed. To reset manually:
75 -
76 -```dart
77 -addTodo.reset(ref);
78 -```
79 -
80 -See the official Riverpod docs for the latest mutation API and generics.
.claude/skills/riverpod-observers/SKILL.md deleted
-52
@@ -1,52 +0,0 @@
1 ----
2 -name: riverpod-observers
3 -description: Use ProviderObserver to log or debug Riverpod provider lifecycle; didUpdateProvider, ProviderScope observers, naming providers. Use when adding logging, analytics, or debugging for provider state changes. Use this skill when the user asks about ProviderObserver, logging Riverpod, or debugging provider updates.
4 ----
5 -
6 -# Riverpod — ProviderObservers
7 -
8 -## Instructions
9 -
10 -A **ProviderObserver** receives lifecycle events for providers (e.g. when a provider's value changes). Use it for logging, analytics, or debugging.
11 -
12 -### Implementing an observer
13 -
14 -Extend **ProviderObserver** and override the methods you need (e.g. **didUpdateProvider**). Pass instances to **ProviderScope** or **ProviderContainer** via the `observers` parameter.
15 -
16 -### Example: logger
17 -
18 -```dart
19 -final class Logger extends ProviderObserver {
20 - @override
21 - void didUpdateProvider(
22 - ProviderObserverContext context,
23 - Object? previousValue,
24 - Object? newValue,
25 - ) {
26 - print('{"provider": "${context.provider}", "newValue": "$newValue"}');
27 - }
28 -}
29 -
30 -void main() {
31 - runApp(
32 - ProviderScope(
33 - observers: [Logger()],
34 - child: const MyApp(),
35 - ),
36 - );
37 -}
38 -```
39 -
40 -### Naming providers
41 -
42 -For clearer logs, give providers a **name**:
43 -
44 -```dart
45 -final myProvider = Provider<int>((ref) => 0, name: 'MyProvider');
46 -```
47 -
48 -With code generation, a name is usually assigned automatically.
49 -
50 -### Note on mutations
51 -
52 -If state is mutated in place (e.g. a List with ref.notifyListeners), `previousValue` and `newValue` in didUpdateProvider may be the same reference. For distinct values, clone before mutating.
.claude/skills/riverpod-offline/SKILL.md deleted
-111
@@ -1,111 +0,0 @@
1 ----
2 -name: riverpod-offline
3 -description: Persist Riverpod notifier state offline with Storage and persist(); riverpod_sqflite, JsonPersist, key, destroyKey, cache duration, testing with in-memory storage. Use when saving state across app restarts or offline. Use this skill when the user asks about offline persistence, persisting state, or Riverpod storage.
4 ----
5 -
6 -# Riverpod — Offline persistence (experimental)
7 -
8 -## Instructions
9 -
10 -**Offline persistence** stores provider state on device so it survives restarts and works offline. Riverpod is storage-agnostic; packages like **riverpod_sqflite** provide a **Storage** implementation. Only **Notifier**-based providers can be persisted. The feature is experimental.
11 -
12 -### Creating a Storage
13 -
14 -Install a package (e.g. riverpod_sqflite + sqflite) and create a Storage. With SQFlite:
15 -
16 -```dart
17 -final storageProvider = FutureProvider<Storage<String, String>>((ref) async {
18 - return JsonSqFliteStorage.open(
19 - join(await getDatabasesPath(), 'riverpod.db'),
20 - );
21 -});
22 -```
23 -
24 -### Persisting a notifier
25 -
26 -Inside the notifier's `build`, call **persist** with: the Storage (e.g. `ref.watch(storageProvider.future)`), a unique **key**, and **encode**/ **decode** for your state. Do not await persist; Riverpod handles it.
27 -
28 -```dart
29 -class TodoList extends AsyncNotifier<List<Todo>> {
30 - @override
31 - Future<List<Todo>> build() async {
32 - persist(
33 - ref.watch(storageProvider.future),
34 - key: 'todo_list',
35 - encode: (todos) => todos.map((todo) => {'task': todo.task}).toList(),
36 - decode: (json) => (json as List).map((todo) => Todo(task: todo['task'] as String)).toList(),
37 - );
38 - return fetchTodosFromServer();
39 - }
40 -}
41 -```
42 -
43 -### Keys
44 -
45 -- **Unique** across all persisted providers (same key = same row, risk of corruption).
46 -- **Stable** across restarts (changing the key loses restored state).
47 -- For **family** providers, include the parameter in the key.
48 -
49 -### JsonPersist (code generation)
50 -
51 -With riverpod_sqflite and codegen, use **@JsonPersist()** so key/encode/decode are generated:
52 -
53 -```dart
54 -@riverpod
55 -@JsonPersist()
56 -class TodoList extends _$TodoList {
57 - @override
58 - Future<List<Todo>> build() async {
59 - persist(ref.watch(storageProvider.future));
60 - return fetchTodosFromServer();
61 - }
62 -}
63 -```
64 -
65 -### Cache duration
66 -
67 -By default state is cached for a short time (e.g. 2 days). For long-lived data (e.g. user preferences), set **StorageOptions**:
68 -
69 -```dart
70 -persist(
71 - ref.watch(storageProvider.future),
72 - options: const StorageOptions(cacheTime: StorageCacheTime.unsafe_forever),
73 - // ...
74 -);
75 -```
76 -
77 -If using forever, plan to delete or migrate data when the app changes; Riverpod does not do migrations.
78 -
79 -### Destroy key (simple migration)
80 -
81 -When the data shape changes, use **destroyKey** so old data is discarded:
82 -
83 -```dart
84 -options: const StorageOptions(destroyKey: '1.0'),
85 -```
86 -
87 -Bump the string in new releases; old persisted state is then ignored and the provider starts fresh.
88 -
89 -### Waiting for decode
90 -
91 -To initialize from persisted state instead of a network call, await the persist future:
92 -
93 -```dart
94 -await persist(ref.watch(storageProvider.future), key: 'todo_list', ...).future;
95 -return state.value ?? <Todo>[];
96 -```
97 -
98 -### Testing
99 -
100 -Override the storage provider with **Storage.inMemory()** so tests don't need a real database:
101 -
102 -```dart
103 -ProviderScope(
104 - overrides: [
105 - storageProvider.overrideWith((ref) => Storage<String, String>.inMemory()),
106 - ],
107 - child: const MyApp(),
108 -)
109 -```
110 -
111 -For advanced migrations or custom storage strategies, you may still need to work with the database directly.
.claude/skills/riverpod-overrides/SKILL.md deleted
-55
@@ -1,55 +0,0 @@
1 ----
2 -name: riverpod-overrides
3 -description: Override Riverpod providers for tests, debugging, or environment-specific behavior; ProviderScope and ProviderContainer overrides, overrideWith, overrideWithValue. Use when mocking providers in tests, injecting different implementations, or scoping provider behavior. Use this skill when the user asks about overrides, testing Riverpod, or mocking providers.
4 ----
5 -
6 -# Riverpod — Provider overrides
7 -
8 -## Instructions
9 -
10 -All providers can be **overridden** to change their behavior. Overrides are set on the **container** (ProviderScope in Flutter, ProviderContainer in Dart) via the `overrides` parameter. Use overrides for testing, debugging, different environments, or scoping (see riverpod-scoping).
11 -
12 -### Where to set overrides
13 -
14 -- **Flutter:** Pass `overrides` to `ProviderScope` (usually at the root or around a subtree).
15 -- **Dart:** Pass `overrides` to `ProviderContainer`.
16 -
17 -### Override methods
18 -
19 -Each provider type exposes methods whose names start with `overrideWith`, for example:
20 -
21 -- **overrideWith** — Provide a new implementation (e.g. a function that returns a value or builds state).
22 -- **overrideWithValue** — Replace with a fixed value (e.g. for FutureProvider/StreamProvider).
23 -- **overrideWithBuild** — Custom build logic (e.g. for StreamProvider).
24 -
25 -Check the provider's API for the exact method (e.g. `Provider.overrideWith`, `FutureProvider.overrideWithValue`).
26 -
27 -### Example: override a counter
28 -
29 -```dart
30 -// Flutter
31 -void main() {
32 - runApp(
33 - ProviderScope(
34 - overrides: [
35 - counterProvider.overrideWith((ref) => 42),
36 - ],
37 - child: MyApp(),
38 - ),
39 - );
40 -}
41 -
42 -// Dart
43 -final container = ProviderContainer(
44 - overrides: [
45 - counterProvider.overrideWith((ref) => 42),
46 - ],
47 -);
48 -```
49 -
50 -### Family overrides
51 -
52 -- **Single parameter:** Override one specific argument: `userProvider('123').overrideWith((ref) => User(name: 'User 123'))`.
53 -- **All parameters:** Override the whole family: `userProvider.overrideWith((ref, arg) => User(name: 'User $arg'))`.
54 -
55 -See riverpod-family and riverpod-testing for more test patterns.
.claude/skills/riverpod-providers/SKILL.md deleted
-92
@@ -1,92 +0,0 @@
1 ----
2 -name: riverpod-providers
3 -description: Declare and use Riverpod providers (Provider, FutureProvider, StreamProvider, NotifierProvider, AsyncNotifierProvider, StreamNotifierProvider); unmodifiable vs modifiable, top-level declaration, Ref, Notifier build method. Use when creating providers, choosing provider type, writing Notifier classes, or understanding Riverpod state. Use this skill whenever the user asks about Riverpod providers, provider types, or notifiers.
4 ----
5 -
6 -# Riverpod — Providers
7 -
8 -## Instructions
9 -
10 -Providers are the central feature of Riverpod: memoized functions that cache their result and let multiple widgets (or other providers) access the same value. They are declared as **top-level** `final` variables. State lives in a **ProviderContainer** (or ProviderScope in Flutter), not in the provider itself.
11 -
12 -### Provider variants
13 -
14 -| | Synchronous | Future | Stream |
15 -|--------------|---------------|------------------------|-------------------------|
16 -| Unmodifiable | Provider | FutureProvider | StreamProvider |
17 -| Modifiable | NotifierProvider | AsyncNotifierProvider | StreamNotifierProvider |
18 -
19 -- **Sync vs Future vs Stream**: Match the return type of your function (`int`, `Future<T>`, `Stream<T>`).
20 -- **Unmodifiable**: Widgets only read the value. Use for computed or fetched data.
21 -- **Modifiable**: Expose a Notifier with a `build()` method and custom methods; widgets call `ref.read(provider.notifier).someMethod()`. Use when the UI must update state.
22 -
23 -Pick the type based on what you want to return; the provider type follows naturally. FutureProvider / AsyncNotifierProvider are the most common.
24 -
25 -### Creating a provider (unmodifiable / functional)
26 -
27 -**Manual:**
28 -
29 -```dart
30 -final userProvider = FutureProvider<User>((ref) async {
31 - final response = await http.get('https://api.example.com/user/123');
32 - return User.fromJson(response.body);
33 -});
34 -```
35 -
36 -**Code generation:** Annotate a top-level function with `@riverpod`. First parameter must be `Ref ref`. The generated provider name is `functionNameProvider`.
37 -
38 -```dart
39 -@riverpod
40 -Future<User> user(Ref ref) async {
41 - final response = await http.get('https://api.example.com/user/123');
42 - return User.fromJson(response.body);
43 -}
44 -```
45 -
46 -Modifiers: `.autoDispose` (or `@Riverpod(keepAlive: true)` to disable) and `.family` for parameters. See riverpod-auto-dispose and riverpod-family.
47 -
48 -### Creating a provider (modifiable / Notifier)
49 -
50 -**Manual:** Use a NotifierProvider (or AsyncNotifierProvider / StreamNotifierProvider) with a Notifier class that extends `Notifier<T>`, `AsyncNotifier<T>`, or `StreamNotifier<T>`. Override `build()`; do not put logic in the constructor (ref/state are not available yet). Public methods are called via `ref.read(provider.notifier).method()`.
51 -
52 -```dart
53 -final counterProvider = NotifierProvider<CounterNotifier, int>(CounterNotifier.new);
54 -
55 -class CounterNotifier extends Notifier<int> {
56 - @override
57 - int build() => 0;
58 -
59 - void increment() => state++;
60 -}
61 -```
62 -
63 -**Code generation:** Annotate a class that extends `_$ClassName`. Override `build()`; add custom methods. Same rule: no logic in the constructor.
64 -
65 -```dart
66 -@riverpod
67 -class CounterNotifier extends _$CounterNotifier {
68 - @override
69 - int build() => 0;
70 -
71 - void increment() => state++;
72 -}
73 -```
74 -
75 -### Using providers
76 -
77 -1. **Flutter:** Wrap the app in `ProviderScope`. Use Consumer, ConsumerWidget, or ConsumerStatefulWidget to get a `ref` and call `ref.watch(provider)` or `ref.read(provider)`.
78 -2. **Dart only:** Create a `ProviderContainer()`, then `container.read(provider)` or `container.listen(...)`. Call `container.dispose()` when done.
79 -3. **Inside another provider:** Use the `Ref` passed to the provider function (or `this.ref` in a Notifier) to `ref.watch` / `ref.read` other providers.
80 -
81 -Example in a widget:
82 -
83 -```dart
84 -return Consumer(
85 - builder: (context, ref, _) {
86 - final helloWorld = ref.watch(helloWorldProvider);
87 - return Text(helloWorld);
88 - },
89 -);
90 -```
91 -
92 -You can declare multiple providers that return the same type; they are independent. For more detail on Ref, containers, modifiers, and notifier rules, see [reference.md](reference.md).
.claude/skills/riverpod-providers/reference.md deleted
-34
@@ -1,34 +0,0 @@
1 -# Riverpod Providers — Reference
2 -
3 -## Provider type summary
4 -
5 -- **Provider** — sync, unmodifiable. Return type `T`.
6 -- **FutureProvider** — async, unmodifiable. Return type `Future<T>`.
7 -- **StreamProvider** — stream, unmodifiable. Return type `Stream<T>`.
8 -- **NotifierProvider** — sync, modifiable. Notifier extends `Notifier<T>`, `build()` returns `T`.
9 -- **AsyncNotifierProvider** — async, modifiable. Notifier extends `AsyncNotifier<T>`, `build()` returns `Future<T>`.
10 -- **StreamNotifierProvider** — stream, modifiable. Notifier extends `StreamNotifier<T>`, `build()` returns `Stream<T>`.
11 -
12 -## Modifiers
13 -
14 -- **autoDispose** — Cache is cleared when the provider has no listeners. Use with family to avoid memory leaks. Disable with `@Riverpod(keepAlive: true)` in codegen.
15 -- **family** — Pass parameters to the provider (e.g. `provider(id)`). See riverpod-family.
16 -
17 -## Notifier rules
18 -
19 -- Do not put logic in the Notifier constructor; `ref` and `state` are not ready. Put initialization in `build()`.
20 -- `build()` is called by the framework; do not call it directly.
21 -- Consumers modify state by calling methods on the notifier: `ref.read(myProvider.notifier).myMethod()`.
22 -
23 -## Multiple providers, same type
24 -
25 -Riverpod allows multiple providers that expose the same type (e.g. two different `Provider<String>`). They are independent; no conflict.
26 -
27 -## Links to other concepts
28 -
29 -- Ref (read, watch, listen, invalidate): riverpod-refs
30 -- Containers / ProviderScope: riverpod-containers
31 -- Auto-dispose: riverpod-auto-dispose
32 -- Family: riverpod-family
33 -- Overrides (testing): riverpod-overrides
34 -- Consumers (widgets): riverpod-consumers
.claude/skills/riverpod-pull-to-refresh/SKILL.md deleted
-51
@@ -1,51 +0,0 @@
1 ----
2 -name: riverpod-pull-to-refresh
3 -description: Implement pull-to-refresh with Riverpod using RefreshIndicator and ref.refresh; show spinner on initial load, show previous data during refresh, AsyncValue pattern matching. Use when the user asks about pull-to-refresh, RefreshIndicator with Riverpod, or refreshing async providers.
4 ----
5 -
6 -# Riverpod — Pull-to-refresh
7 -
8 -## Instructions
9 -
10 -Riverpod fits pull-to-refresh well: refresh by invalidating the provider and let AsyncValue handle loading vs data vs error.
11 -
12 -### 1. Provider and UI
13 -
14 -Define an async provider (e.g. FutureProvider or AsyncNotifierProvider) that fetches data. Display it with **ref.watch(provider)** so you get an **AsyncValue**.
15 -
16 -### 2. RefreshIndicator
17 -
18 -Wrap your scrollable (ListView, SingleChildScrollView, etc.) in **RefreshIndicator**. In **onRefresh**, call **ref.refresh(provider.future)** so the indicator stays until the new data is loaded:
19 -
20 -```dart
21 -RefreshIndicator(
22 - onRefresh: () => ref.refresh(activityProvider.future),
23 - child: ListView(
24 - children: [
25 - // content
26 - ],
27 - ),
28 -)
29 -```
30 -
31 -### 3. Loading and error states
32 -
33 -Use **AsyncValue** pattern matching:
34 -
35 -- **Initial load:** No data and no error → show full-screen spinner.
36 -- **Refresh:** Show the refresh indicator and keep showing previous data (or previous error) until the new result arrives.
37 -- **Data:** `AsyncValue(:final value?)` or similar to show the value.
38 -- **Error:** `AsyncValue(:final error?)` to show the error.
39 -
40 -Example (syntax may vary by Riverpod version):
41 -
42 -```dart
43 -final activity = ref.watch(activityProvider);
44 -switch (activity) {
45 - AsyncValue<Activity>(:final value?) => Text(value.activity),
46 - AsyncValue(:final error?) => Text('Error: $error'),
47 - _ => const CircularProgressIndicator(),
48 -}
49 -```
50 -
51 -Use **valueOrNull** (or equivalent) if your API exposes it for nullable data. See the docs for the exact AsyncValue API in your version.
.claude/skills/riverpod-refs/SKILL.md deleted
-70
@@ -1,70 +0,0 @@
1 ----
2 -name: riverpod-refs
3 -description: Use Ref and WidgetRef to read, watch, listen, invalidate, and refresh providers; onDispose and onCancel lifecycle; ref.read vs ref.watch vs ref.listen, ref.invalidate and ref.refresh. Use when interacting with Riverpod providers from widgets or other providers, when to use watch vs read, or when resetting provider state. Use this skill whenever the user asks about ref.watch, ref.read, ref.listen, ref.invalidate, or Riverpod lifecycle.
4 ----
5 -
6 -# Riverpod — Refs
7 -
8 -## Instructions
9 -
10 -**Ref** (and **WidgetRef** in widgets) is how you interact with providers: read state, listen to changes, reset state, and register lifecycle callbacks. Providers get a `Ref` as the first parameter of their function or as `this.ref` in a Notifier. Widgets get a **WidgetRef** via Consumer / ConsumerWidget / ConsumerState.
11 -
12 -### Obtaining a Ref
13 -
14 -- **Inside a provider:** First parameter of the provider function, or `ref` property in a Notifier.
15 -- **Inside a widget:** Use a Consumer (builder gives `ref`), ConsumerWidget (`build(context, ref)`), or ConsumerStatefulWidget (state has `ref`). Pass `ref` to other functions if needed.
16 -
17 -### Listening to state
18 -
19 -- **ref.watch(provider)** — Declarative. Your widget/provider rebuilds when the provider changes. Use this by default in build methods.
20 -- **ref.listen(provider, (prev, next) { ... })** — Imperative. Run side effects when the provider changes (e.g. show a dialog, navigate). Safe to use in build; for initState use `ref.listenManual` and manage the subscription.
21 -
22 -```dart
23 -// In a widget
24 -final tick = ref.watch(tickProvider);
25 -return Text('Tick: $tick');
26 -
27 -// Side effect when provider changes
28 -ref.listen(tickProvider, (previous, next) {
29 - print('Tick changed from $previous to $next');
30 -});
31 -```
32 -
33 -### Reading without listening
34 -
35 -- **ref.read(provider)** — Get current value without subscribing. Use in event handlers (e.g. onPressed), not to "optimize" by avoiding watch. For selective rebuilds use `ref.watch(provider.select((value) => ...))`.
36 -
37 -```dart
38 -onPressed: () {
39 - final tick = ref.read(tickProvider);
40 - print('Current tick: $tick');
41 -}
42 -```
43 -
44 -### Resetting state
45 -
46 -- **ref.invalidate(provider)** — Discard current state; provider will recompute on next read. If the provider is listened to, a new state is created.
47 -- **ref.refresh(provider)** — Same as invalidate + read: invalidates and returns the new value. Use when you need the new value immediately.
48 -
49 -```dart
50 -ref.invalidate(tickProvider);
51 -// or
52 -final newTick = ref.refresh(tickProvider);
53 -```
54 -
55 -### Lifecycle: onDispose, onCancel
56 -
57 -Inside a provider you can register callbacks:
58 -
59 -- **ref.onDispose(callback)** — Called when the provider state is destroyed (e.g. auto-dispose or recomputation). Use to close StreamControllers, cancel timers, etc. Do not trigger side effects that modify other providers inside onDispose.
60 -- **ref.onCancel(callback)** — Called when the last listener is removed (before dispose). **ref.onResume(callback)** — Called when a listener is added again after onCancel.
61 -
62 -```dart
63 -final provider = StreamProvider<int>((ref) {
64 - final controller = StreamController<int>();
65 - ref.onDispose(controller.close);
66 - return controller.stream;
67 -});
68 -```
69 -
70 -You can call onDispose multiple times (e.g. one per disposable resource). Return value of onDispose/onCancel can be called to unregister. For more detail and select/listenManual, see [reference.md](reference.md).
.claude/skills/riverpod-refs/reference.md deleted
-30
@@ -1,30 +0,0 @@
1 -# Riverpod Refs — Reference
2 -
3 -## ref.watch
4 -
5 -Subscribes to the provider; the current widget/provider rebuilds when the value changes. Use in build. Providers can watch other providers to compose state.
6 -
7 -## ref.read
8 -
9 -Returns current value without subscribing. Use in event handlers (onPressed, callbacks). Do not use read instead of watch to "optimize" — use watch or use select to limit rebuilds.
10 -
11 -## ref.listen
12 -
13 -Registers a one-off listener for side effects (navigation, dialogs, logging). Signature: `(previous, next) => ...`. Safe in build. For listening outside build (e.g. initState), use **ref.listenManual** and store the subscription to cancel later.
14 -
15 -## ref.invalidate / ref.refresh
16 -
17 -- **invalidate(provider)** — Discard state; next read will recompute.
18 -- **refresh(provider)** — invalidate + read in one call; returns the new value.
19 -
20 -## ref.select
21 -
22 -Reduce rebuilds by watching only a part of the state: `ref.watch(provider.select((value) => value.someField))`. Rebuilds only when the selected value changes (by ==).
23 -
24 -## WidgetRef.listenManual
25 -
26 -When you need to listen from initState or outside build, use listenManual and call the returned subscription's `close()` in dispose.
27 -
28 -## Ref vs WidgetRef
29 -
30 -Ref is used inside providers; WidgetRef is used inside widgets. There is no shared interface by design — keep logic in providers and call notifier methods from the UI so only Ref is needed in business logic.
.claude/skills/riverpod-retry/SKILL.md deleted
-51
@@ -1,51 +0,0 @@
1 ----
2 -name: riverpod-retry
3 -description: Customize Riverpod automatic retry on provider failure; retry function, per-provider and global retry, disabling retry, ProviderException, awaiting retries. Use when a provider can fail transiently and should retry, or when you need to disable or customize retry logic. Use this skill when the user asks about retry, failed providers, or exponential backoff in Riverpod.
4 ----
5 -
6 -# Riverpod — Automatic retry
7 -
8 -## Instructions
9 -
10 -Riverpod **retries** providers when their computation throws. Retry can be customized per provider or globally.
11 -
12 -### Default behavior
13 -
14 -By default a provider is retried up to a limit (e.g. 10 times) with exponential backoff (e.g. 200ms to 6.4s). **Error** and **ProviderException** are not retried: Error indicates a bug; ProviderException means a dependency failed, so the dependent provider is not retried (the underlying one is).
15 -
16 -### Custom retry function
17 -
18 -A retry function has signature `Duration? Function(int retryCount, Object error)`. Return a **Duration** for the delay before the next retry, or **null** to stop.
19 -
20 -```dart
21 -Duration? myRetry(int retryCount, Object error) {
22 - if (retryCount >= 5) return null;
23 - if (error is ProviderException) return null;
24 - return Duration(milliseconds: 200 * (1 << retryCount));
25 -}
26 -```
27 -
28 -### Where to set it
29 -
30 -- **Per provider:** Pass `retry: myRetry` when defining the provider (or `@Riverpod(retry: myRetry)` with codegen).
31 -- **Globally:** Pass `retry: myRetry` to **ProviderScope** or **ProviderContainer**.
32 -
33 -```dart
34 -// Global
35 -ProviderScope(retry: myRetry, child: MyApp())
36 -
37 -// Per provider (manual)
38 -final myProvider = Provider<int>(retry: myRetry, (ref) => 0);
39 -```
40 -
41 -### Disabling retry
42 -
43 -Return **null** always:
44 -
45 -```dart
46 -ProviderScope(retry: (retryCount, error) => null, child: MyApp())
47 -```
48 -
49 -### Awaiting async providers with retry
50 -
51 -`ref.watch(myProvider.future)` (or equivalent) keeps waiting until either all retries are exhausted or the provider succeeds. So `await ref.watch(myProvider.future)` skips intermediate failures and completes when the provider finally succeeds or gives up.
.claude/skills/riverpod-scoping/SKILL.md deleted
-55
@@ -1,55 +0,0 @@
1 ----
2 -name: riverpod-scoping
3 -description: Scope Riverpod providers to a subtree using overrides and dependencies; page-specific behavior, ListView optimization, avoiding passing family parameters. Use when changing provider behavior for one page or widget, or when optimizing rebuilds. Use this skill when the user asks about scoping providers or provider scope.
4 ----
5 -
6 -# Riverpod — Scoping providers
7 -
8 -## Instructions
9 -
10 -**Scoping** means changing a provider's behavior for only part of the app by overriding it in a **non-root** ProviderScope. Use cases: page-specific customization (e.g. theme for one page), performance (e.g. rebuild only the item that changed in a ListView), or avoiding passing family parameters through the tree.
11 -
12 -**Note:** Scoping is complex and may be reworked in future Riverpod versions. Use with care.
13 -
14 -### Opt-in: dependencies
15 -
16 -By default you cannot scope a provider. Opt in by setting **dependencies** on the provider. The first scoped provider usually has `dependencies: const []`.
17 -
18 -```dart
19 -final currentItemIdProvider = Provider<String?>(
20 - dependencies: const [],
21 - (ref) => null,
22 -);
23 -```
24 -
25 -### Listening to a scoped provider
26 -
27 -Use ref.watch/ref.read as usual. If another **provider** listens to a scoped provider, that listening provider must list the scoped provider in its **dependencies**:
28 -
29 -```dart
30 -final currentItemProvider = FutureProvider<Item?>(
31 - dependencies: [currentItemIdProvider],
32 - (ref) async {
33 - final currentItemId = ref.watch(currentItemIdProvider);
34 - if (currentItemId == null) return null;
35 - return fetchItem(id: currentItemId);
36 - },
37 -);
38 -```
39 -
40 -Only scoped providers need to be listed in dependencies; non-scoped providers do not.
41 -
42 -### Setting the scoped value: overrides
43 -
44 -Use **overrides** on a ProviderScope that wraps the subtree where the scoped value should apply:
45 -
46 -```dart
47 -ProviderScope(
48 - overrides: [
49 - currentItemIdProvider.overrideWithValue('123'),
50 - ],
51 - child: const DetailPageView(),
52 -)
53 -```
54 -
55 -That way the detail page sees `'123'` as the current item ID without it being passed down manually. See riverpod-overrides for override syntax.
.claude/skills/riverpod-select/SKILL.md deleted
-30
@@ -1,30 +0,0 @@
1 ----
2 -name: riverpod-select
3 -description: Reduce rebuilds with ref.watch(provider.select(...)); select a subset of state so widgets rebuild only when that part changes. Use when optimizing performance or when a widget uses only one field of a large object. Use this skill when the user asks about select, reducing rebuilds, or optimizing Riverpod watch.
4 ----
5 -
6 -# Riverpod — Reducing rebuilds with select
7 -
8 -## Instructions
9 -
10 -By default, **ref.watch(provider)** rebuilds whenever the provider's value changes (by reference/equality). If you only use a subset of the state (e.g. one field of a User), the widget still rebuilds when other fields change.
11 -
12 -Use **select** to watch only a part of the state. Rebuilds happen only when the **selected** value changes (by ==).
13 -
14 -### Syntax
15 -
16 -```dart
17 -// Rebuild only when firstName changes
18 -String name = ref.watch(provider.select((it) => it.firstName));
19 -return Text('Hello $name');
20 -```
21 -
22 -You can call select multiple times for different properties. The selected value should be **immutable**; mutating a returned List/object in place will not trigger a rebuild.
23 -
24 -### Async providers: selectAsync
25 -
26 -For async providers you often use **ref.watch(provider.future)**. To select on the resolved data instead of the whole AsyncValue, use **selectAsync** (when available): it applies a select on the data and returns a Future. See the Riverpod docs for the exact API in your version.
27 -
28 -### When to use
29 -
30 -- Only when the "other" properties change often and you have measured that rebuilds are a bottleneck. Select adds a small cost and extra complexity. Prefer normal watch unless you need the optimization.
.claude/skills/riverpod-testing/SKILL.md deleted
-93
@@ -1,93 +0,0 @@
1 ----
2 -name: riverpod-testing
3 -description: Test Riverpod providers and widgets; ProviderContainer.test, unit tests, widget tests with ProviderScope, tester.container(), mocking with overrides, container.listen for auto-dispose, awaiting .future. Use when writing unit or widget tests for Riverpod code, mocking providers, or testing with overrides. Use this skill when the user asks about testing Riverpod, mocking providers, or ProviderContainer in tests.
4 ----
5 -
6 -# Riverpod — Testing
7 -
8 -## Instructions
9 -
10 -Riverpod is designed for testability: isolate state per test, mock via overrides, and keep the test environment close to production.
11 -
12 -### Unit tests (no Flutter)
13 -
14 -Use **ProviderContainer.test()** to create a container for the test. Do not share containers between tests.
15 -
16 -```dart
17 -void main() {
18 - test('Some description', () {
19 - final container = ProviderContainer.test();
20 - expect(container.read(provider), equals('some value'));
21 - });
22 -}
23 -```
24 -
25 -- **container.read(provider)** — Read current value.
26 -- **container.listen(provider, (prev, next) {})** — Listen and get a subscription; use **subscription.read()** to read. Prefer listen when the provider is auto-dispose so it is not disposed mid-test.
27 -
28 -```dart
29 -final subscription = container.listen<String>(provider, (_, _) {});
30 -expect(subscription.read(), 'Some value');
31 -```
32 -
33 -### Widget tests
34 -
35 -Wrap the widget under test in **ProviderScope**:
36 -
37 -```dart
38 -testWidgets('Some description', (tester) async {
39 - await tester.pumpWidget(
40 - const ProviderScope(child: YourWidgetYouWantToTest()),
41 - );
42 -});
43 -```
44 -
45 -To interact with providers in the test, get the container with **tester.container()**:
46 -
47 -```dart
48 -final container = tester.container();
49 -expect(container.read(provider), 'some value');
50 -```
51 -
52 -### Mocking providers
53 -
54 -Use **overrides** on ProviderContainer or ProviderScope. All providers can be overridden without extra setup.
55 -
56 -```dart
57 -final container = ProviderContainer.test(
58 - overrides: [
59 - exampleProvider.overrideWith((ref) => 'Hello from tests'),
60 - ],
61 -);
62 -
63 -// Or in widget tests:
64 -await tester.pumpWidget(
65 - ProviderScope(
66 - overrides: [exampleProvider.overrideWith((ref) => 'Hello from tests')],
67 - child: const YourWidgetYouWantToTest(),
68 - ),
69 -);
70 -```
71 -
72 -See riverpod-overrides for family overrides and other override methods.
73 -
74 -### Awaiting async providers
75 -
76 -Read **provider.future** to get a Future that completes with the provider value; use with expectLater:
77 -
78 -```dart
79 -await expectLater(
80 - container.read(provider.future),
81 - completion('some value'),
82 -);
83 -```
84 -
85 -### Listening / spying
86 -
87 -Use **container.listen(provider, callback)** and assert on the callback arguments or collect values in a list for assertions. Works with mockito/mocktail verify patterns.
88 -
89 -### Mocking Notifiers
90 -
91 -Prefer mocking a dependency (e.g. repository) the Notifier uses rather than mocking the Notifier. If you must mock a Notifier, **subclass** it (do not implement), so the mock extends the original base class. With code generation, the mock usually needs to live in the same file as the Notifier to access the generated base class.
92 -
93 -See riverpod-overrides and the official docs for more examples.
.claude/skills/shadcn_ui-accordion/SKILL.md deleted
-46
@@ -1,46 +0,0 @@
1 ----
2 -name: shadcn_ui-accordion
3 -description: Build collapsible accordions with ShadAccordion and ShadAccordionItem; single or multiple open items. Use when adding expandable sections, FAQs, or vertically stacked reveal content in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Accordion
7 -
8 -## Instructions
9 -
10 -Use `ShadAccordion` for a vertically stacked set of headings that each reveal content. Each item is a `ShadAccordionItem` with `value`, `title`, and `child`.
11 -
12 -### Single (one open at a time)
13 -
14 -```dart
15 -final details = [
16 - (title: 'Is it acceptable?', content: 'Yes. It adheres to the WAI-ARIA design pattern.'),
17 - (title: 'Is it styled?', content: "Yes. It comes with default styles that matches the other components' aesthetic."),
18 - (title: 'Is it animated?', content: "Yes. It's animated by default, but you can disable it if you prefer."),
19 -];
20 -
21 -ShadAccordion<({String content, String title})>(
22 - children: details.map(
23 - (detail) => ShadAccordionItem(
24 - value: detail,
25 - title: Text(detail.title),
26 - child: Text(detail.content),
27 - ),
28 - ),
29 -)
30 -```
31 -
32 -### Multiple (several open at once)
33 -
34 -Use `ShadAccordion.multiple`:
35 -
36 -```dart
37 -ShadAccordion<({String content, String title})>.multiple(
38 - children: details.map(
39 - (detail) => ShadAccordionItem(
40 - value: detail,
41 - title: Text(detail.title),
42 - child: Text(detail.content),
43 - ),
44 - ),
45 -)
46 -```
.claude/skills/shadcn_ui-alert/SKILL.md deleted
-30
@@ -1,30 +0,0 @@
1 ----
2 -name: shadcn_ui-alert
3 -description: Show callout alerts with ShadAlert and ShadAlert.destructive; icon, title, description. Use when displaying warnings, errors, or important messages in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Alert
7 -
8 -## Instructions
9 -
10 -`ShadAlert` displays a callout for user attention. Use default constructor for standard alerts, `ShadAlert.destructive` for errors or destructive actions.
11 -
12 -### Primary / default
13 -
14 -```dart
15 -ShadAlert(
16 - icon: Icon(LucideIcons.terminal),
17 - title: Text('Heads up!'),
18 - description: Text('You can add components to your app using the cli.'),
19 -)
20 -```
21 -
22 -### Destructive
23 -
24 -```dart
25 -ShadAlert.destructive(
26 - icon: Icon(LucideIcons.circleAlert),
27 - title: Text('Error'),
28 - description: Text('Your session has expired. Please log in again.'),
29 -)
30 -```
.claude/skills/shadcn_ui-avatar/SKILL.md deleted
-21
@@ -1,21 +0,0 @@
1 ----
2 -name: shadcn_ui-avatar
3 -description: Display user avatars with ShadAvatar; image URL with optional placeholder. Use when showing user profile images or fallback initials in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Avatar
7 -
8 -## Instructions
9 -
10 -`ShadAvatar` is an image with a placeholder for representing the user. Uses the `universal_image` package for multiple image formats.
11 -
12 -### Basic usage
13 -
14 -```dart
15 -ShadAvatar(
16 - 'https://example.com/avatar.png',
17 - placeholder: Text('CN'),
18 -)
19 -```
20 -
21 -Pass the image URL as the first argument; `placeholder` is shown while loading or if the image fails (e.g. initials).
.claude/skills/shadcn_ui-badge/SKILL.md deleted
-24
@@ -1,24 +0,0 @@
1 ----
2 -name: shadcn_ui-badge
3 -description: Display badges with ShadBadge; primary, secondary, destructive, outline variants. Use when showing tags, status labels, or count indicators in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Badge
7 -
8 -## Instructions
9 -
10 -`ShadBadge` displays a badge or badge-like component. Variants: default (primary), `ShadBadge.secondary`, `ShadBadge.destructive`, `ShadBadge.outline`.
11 -
12 -### Variants
13 -
14 -```dart
15 -ShadBadge(child: const Text('Primary'))
16 -
17 -ShadBadge.secondary(child: const Text('Secondary'))
18 -
19 -ShadBadge.destructive(child: const Text('Destructive'))
20 -
21 -ShadBadge.outline(child: const Text('Outline'))
22 -```
23 -
24 -Wrap any `child` (typically `Text`) with the desired constructor.
.claude/skills/shadcn_ui-breadcrumb/SKILL.md deleted
-58
@@ -1,58 +0,0 @@
1 ----
2 -name: shadcn_ui-breadcrumb
3 -description: Build breadcrumb navigation with ShadBreadcrumb, ShadBreadcrumbLink, ShadBreadcrumbDropdown, custom separator. Use when showing navigation path, hierarchy of links, or dropdown breadcrumb in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Breadcrumb
7 -
8 -## Instructions
9 -
10 -`ShadBreadcrumb` displays the path to the current resource using a hierarchy of links. Children can be `ShadBreadcrumbLink`, `ShadBreadcrumbDropdown`, or plain widgets (e.g. `Text` for current page).
11 -
12 -### Basic breadcrumb
13 -
14 -```dart
15 -ShadBreadcrumb(
16 - children: [
17 - ShadBreadcrumbLink(
18 - onPressed: () => print('Navigating to Home'),
19 - child: const Text('Home'),
20 - ),
21 - ShadBreadcrumbDropdown(
22 - items: [
23 - ShadBreadcrumbDropMenuItem(
24 - onPressed: () => print('Navigating to Documentation'),
25 - child: const Text('Documentation'),
26 - ),
27 - ShadBreadcrumbDropMenuItem(
28 - onPressed: () => print('Navigating to Themes'),
29 - child: const Text('Themes'),
30 - ),
31 - ],
32 - showDropdownArrow: false,
33 - child: ShadBreadcrumbEllipsis(),
34 - ),
35 - Text('Components'),
36 - Text('Breadcrumb'),
37 - ],
38 -)
39 -```
40 -
41 -### Custom separator
42 -
43 -Default separator is `>`. Override with `separator`:
44 -
45 -```dart
46 -ShadBreadcrumb(
47 - separator: const Icon(LucideIcons.slash),
48 - children: [
49 - ShadBreadcrumbLink(onPressed: () {}, child: const Text('Home')),
50 - ShadBreadcrumbLink(onPressed: () {}, child: const Text('Components')),
51 - Text('Breadcrumb'),
52 - ],
53 -)
54 -```
55 -
56 -### Dropdown in breadcrumb
57 -
58 -Use `ShadBreadcrumbDropdown` with `items` (list of `ShadBreadcrumbDropMenuItem`) and `child` (trigger widget). Use `ShadBreadcrumbEllipsis()` for an ellipsis trigger.
.claude/skills/shadcn_ui-button/SKILL.md deleted
-72
@@ -1,72 +0,0 @@
1 ----
2 -name: shadcn_ui-button
3 -description: Use Shadcn UI buttons (ShadButton variants: primary, secondary, destructive, outline, ghost, link); leading icon, loading state, gradient and shadow. Use when adding buttons, CTAs, or button-style widgets in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Button
7 -
8 -## Instructions
9 -
10 -`ShadButton` displays a button or component that looks like a button. Variants: default (primary), `ShadButton.secondary`, `ShadButton.destructive`, `ShadButton.outline`, `ShadButton.ghost`, `ShadButton.link`. Use `leading` (and optionally `trailing`) for icons; support gradient and shadows for custom styling.
11 -
12 -### Variants
13 -
14 -```dart
15 -ShadButton(child: const Text('Primary'), onPressed: () {})
16 -
17 -ShadButton.secondary(child: const Text('Secondary'), onPressed: () {})
18 -
19 -ShadButton.destructive(child: const Text('Destructive'), onPressed: () {})
20 -
21 -ShadButton.outline(child: const Text('Outline'), onPressed: () {})
22 -
23 -ShadButton.ghost(child: const Text('Ghost'), onPressed: () {})
24 -
25 -ShadButton.link(child: const Text('Link'), onPressed: () {})
26 -```
27 -
28 -### Text and icon
29 -
30 -```dart
31 -ShadButton(
32 - onPressed: () {},
33 - leading: const Icon(LucideIcons.mail),
34 - child: const Text('Login with Email'),
35 -)
36 -```
37 -
38 -### Loading state
39 -
40 -Use `leading` with a small `CircularProgressIndicator`:
41 -
42 -```dart
43 -ShadButton(
44 - onPressed: () {},
45 - leading: SizedBox.square(
46 - dimension: 16,
47 - child: CircularProgressIndicator(
48 - strokeWidth: 2,
49 - color: ShadTheme.of(context).colorScheme.primaryForeground,
50 - ),
51 - ),
52 - child: const Text('Please wait'),
53 -)
54 -```
55 -
56 -### Gradient and shadow
57 -
58 -```dart
59 -ShadButton(
60 - onPressed: () {},
61 - gradient: const LinearGradient(colors: [Colors.cyan, Colors.indigo]),
62 - shadows: [
63 - BoxShadow(
64 - color: Colors.blue.withValues(alpha:.4),
65 - spreadRadius: 4,
66 - blurRadius: 10,
67 - offset: const Offset(0, 2),
68 - ),
69 - ],
70 - child: const Text('Gradient with Shadow'),
71 -)
72 -```
.claude/skills/shadcn_ui-calendar/SKILL.md deleted
-63
@@ -1,63 +0,0 @@
1 ----
2 -name: shadcn_ui-calendar
3 -description: Use ShadCalendar for single, multiple, or range date selection; caption layout, hide navigation, week numbers, outside days, fixed weeks. Use when building date pickers or calendar widgets in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Calendar
7 -
8 -## Instructions
9 -
10 -`ShadCalendar` is a date field that lets users enter and edit dates. Modes: single date, multiple dates (`ShadCalendar.multiple`), or range (`ShadCalendar.range`). Use `fromMonth`/`toMonth` to limit range; `captionLayout` for dropdown months/years.
11 -
12 -### Single
13 -
14 -```dart
15 -final today = DateTime.now();
16 -
17 -ShadCalendar(
18 - selected: today,
19 - fromMonth: DateTime(today.year - 1),
20 - toMonth: DateTime(today.year, 12),
21 -)
22 -```
23 -
24 -### Multiple
25 -
26 -```dart
27 -ShadCalendar.multiple(
28 - numberOfMonths: 2,
29 - fromMonth: DateTime(today.year),
30 - toMonth: DateTime(today.year + 1, 12),
31 - min: 5,
32 - max: 10,
33 -)
34 -```
35 -
36 -### Range
37 -
38 -```dart
39 -const ShadCalendar.range(
40 - min: 2,
41 - max: 5,
42 -)
43 -```
44 -
45 -### Caption layout
46 -
47 -```dart
48 -ShadCalendar(
49 - captionLayout: ShadCalendarCaptionLayout.dropdownMonths,
50 -);
51 -
52 -ShadCalendar(
53 - captionLayout: ShadCalendarCaptionLayout.dropdownYears,
54 -);
55 -```
56 -
57 -### Options
58 -
59 -- `hideNavigation: true` — Hide month navigation.
60 -- `showWeekNumbers: true` — Show week numbers.
61 -- `showOutsideDays: false` — Hide days from adjacent months.
62 -- `fixedWeeks: true` — Fixed number of rows.
63 -- `hideWeekdayNames: true` — Hide weekday headers.
.claude/skills/shadcn_ui-card/SKILL.md deleted
-53
@@ -1,53 +0,0 @@
1 ----
2 -name: shadcn_ui-card
3 -description: Build cards with ShadCard; title, description, footer, and child content. Use when creating content cards, project cards, or notification panels in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Card
7 -
8 -## Instructions
9 -
10 -`ShadCard` displays a card with optional header (title, description), body (`child`), and footer. Use `width` to constrain width.
11 -
12 -### Basic card
13 -
14 -```dart
15 -final theme = ShadTheme.of(context);
16 -ShadCard(
17 - width: 350,
18 - title: Text('Create project', style: theme.textTheme.h4),
19 - description: const Text('Deploy your new project in one-click.'),
20 - footer: Row(
21 - mainAxisAlignment: MainAxisAlignment.spaceBetween,
22 - children: [
23 - ShadButton.outline(child: const Text('Cancel'), onPressed: () {}),
24 - ShadButton(child: const Text('Deploy'), onPressed: () {}),
25 - ],
26 - ),
27 - child: Padding(
28 - padding: const EdgeInsets.symmetric(vertical: 16),
29 - child: Column(
30 - mainAxisSize: MainAxisSize.min,
31 - crossAxisAlignment: CrossAxisAlignment.stretch,
32 - children: [
33 - const Text('Name'),
34 - const SizedBox(height: 6),
35 - const ShadInput(placeholder: Text('Name of your project')),
36 - const SizedBox(height: 16),
37 - const Text('Framework'),
38 - const SizedBox(height: 6),
39 - ShadSelect<String>(
40 - placeholder: const Text('Select'),
41 - options: frameworks.entries
42 - .map((e) => ShadOption(value: e.key, child: Text(e.value)))
43 - .toList(),
44 - selectedOptionBuilder: (context, value) => Text(frameworks[value]!),
45 - onChanged: (value) {},
46 - ),
47 - ],
48 - ),
49 - ),
50 -)
51 -```
52 -
53 -Title and description are optional. Footer can be any widget (e.g. buttons). Put main content in `child`.
.claude/skills/shadcn_ui-checkbox/SKILL.md deleted
-39
@@ -1,39 +0,0 @@
1 ----
2 -name: shadcn_ui-checkbox
3 -description: Add checkboxes with ShadCheckbox and ShadCheckboxFormField; label, sublabel, form validation. Use when adding boolean toggles or terms acceptance in a Flutter shadcn_ui app or ShadForm.
4 ----
5 -
6 -# Shadcn UI — Checkbox
7 -
8 -## Instructions
9 -
10 -`ShadCheckbox` is a control that toggles between checked and unchecked. Use `value` and `onChanged`; optional `label` and `sublabel`. For forms use `ShadCheckboxFormField` with `id`, `validator`, and form state.
11 -
12 -### Standalone
13 -
14 -```dart
15 -ShadCheckbox(
16 - value: value,
17 - onChanged: (v) => setState(() => value = v),
18 - label: const Text('Accept terms and conditions'),
19 - sublabel: const Text(
20 - 'You agree to our Terms of Service and Privacy Policy.',
21 - ),
22 -)
23 -```
24 -
25 -### Form field
26 -
27 -```dart
28 -ShadCheckboxFormField(
29 - id: 'terms',
30 - initialValue: false,
31 - inputLabel: const Text('I accept the terms and conditions'),
32 - onChanged: (v) {},
33 - inputSublabel: const Text('You agree to our Terms and Conditions'),
34 - validator: (v) {
35 - if (!v) return 'You must accept the terms and conditions';
36 - return null;
37 - },
38 -)
39 -```
.claude/skills/shadcn_ui-context-menu/SKILL.md deleted
-65
@@ -1,65 +0,0 @@
1 ----
2 -name: shadcn_ui-context-menu
3 -description: Show context menus on right-click with ShadContextMenuRegion, ShadContextMenuItem, submenus, dividers. Use when adding right-click menus, actions, or nested menu items in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Context Menu
7 -
8 -## Instructions
9 -
10 -`ShadContextMenuRegion` wraps a `child` and shows a menu on right-click. Set `items` to a list of `ShadContextMenuItem` or `ShadContextMenuItem.inset`. Use `ShadContextMenuItem` with `items` for submenus; use `Divider(height: 8)` and `Padding` for sections and labels.
11 -
12 -### Basic usage
13 -
14 -```dart
15 -ShadContextMenuRegion(
16 - constraints: const BoxConstraints(minWidth: 300),
17 - items: [
18 - const ShadContextMenuItem.inset(child: Text('Back')),
19 - const ShadContextMenuItem.inset(
20 - enabled: false,
21 - child: Text('Forward'),
22 - ),
23 - const ShadContextMenuItem.inset(child: Text('Reload')),
24 - const ShadContextMenuItem.inset(
25 - trailing: Icon(LucideIcons.chevronRight),
26 - items: [
27 - ShadContextMenuItem(child: Text('Save Page As...')),
28 - ShadContextMenuItem(child: Text('Create Shortcut...')),
29 - ShadContextMenuItem(child: Text('Developer Tools')),
30 - Divider(height: 8),
31 - ShadContextMenuItem(child: Text('Developer Tools')),
32 - ],
33 - child: Text('More Tools'),
34 - ),
35 - const Divider(height: 8),
36 - const ShadContextMenuItem(
37 - leading: Icon(LucideIcons.check),
38 - child: Text('Show Bookmarks Bar'),
39 - ),
40 - const ShadContextMenuItem.inset(child: Text('Show Full URLs')),
41 - const Divider(height: 8),
42 - Padding(
43 - padding: const EdgeInsets.fromLTRB(36, 8, 8, 8),
44 - child: Text('People', style: theme.textTheme.small),
45 - ),
46 - ShadContextMenuItem(
47 - leading: /* avatar or icon */,
48 - child: const Text('Pedro Duarte'),
49 - ),
50 - const ShadContextMenuItem.inset(child: Text('Colm Tuite')),
51 - ],
52 - child: Container(
53 - width: 300,
54 - height: 200,
55 - alignment: Alignment.center,
56 - decoration: BoxDecoration(
57 - border: Border.all(color: theme.colorScheme.border),
58 - borderRadius: BorderRadius.circular(8),
59 - ),
60 - child: const Text('Right click here'),
61 - ),
62 -)
63 -```
64 -
65 -Use `ShadContextMenuItem` for items with leading/trailing; `ShadContextMenuItem.inset` for indented items. Nest `items` for submenus.
.claude/skills/shadcn_ui-date-picker/SKILL.md deleted
-85
@@ -1,85 +0,0 @@
1 ----
2 -name: shadcn_ui-date-picker
3 -description: Use ShadDatePicker and ShadDatePicker.range for single or range date selection; presets, ShadDatePickerFormField, ShadDateRangePickerFormField. Use when adding date pickers or date range fields in a Flutter shadcn_ui app or ShadForm.
4 ----
5 -
6 -# Shadcn UI — Date Picker
7 -
8 -## Instructions
9 -
10 -`ShadDatePicker` is a date picker with optional range and presets. Use `ShadDatePicker.range()` for range selection. For forms use `ShadDatePickerFormField` and `ShadDateRangePickerFormField` with `id`, `label`, `validator`, and optional `fromValueTransformer`/`toValueTransformer`.
11 -
12 -### Single
13 -
14 -```dart
15 -ConstrainedBox(
16 - constraints: const BoxConstraints(maxWidth: 600),
17 - child: const ShadDatePicker(),
18 -)
19 -```
20 -
21 -### Range
22 -
23 -```dart
24 -ConstrainedBox(
25 - constraints: const BoxConstraints(maxWidth: 600),
26 - child: const ShadDatePicker.range(),
27 -)
28 -```
29 -
30 -### With presets
31 -
32 -Use a `header` widget (e.g. `ShadSelect`) and shared `groupId` so the date picker popover stays open when the select popover closes. Set `selected` from preset choice (e.g. today + days offset).
33 -
34 -```dart
35 -ShadDatePicker(
36 - groupId: groupId,
37 - header: Padding(
38 - padding: const EdgeInsets.only(bottom: 4),
39 - child: ShadSelect<int>(
40 - groupId: groupId,
41 - minWidth: 276,
42 - placeholder: const Text('Select'),
43 - options: presets.entries
44 - .map((e) => ShadOption(value: e.key, child: Text(e.value)))
45 - .toList(),
46 - selectedOptionBuilder: (context, value) => Text(presets[value]!),
47 - onChanged: (value) {
48 - if (value == null) return;
49 - setState(() => selected = today.add(Duration(days: value)));
50 - },
51 - ),
52 - ),
53 - selected: selected,
54 - calendarDecoration: theme.calendarTheme.decoration,
55 - popoverPadding: const EdgeInsets.all(4),
56 -)
57 -```
58 -
59 -### Form fields
60 -
61 -```dart
62 -ShadDatePickerFormField(
63 - label: const Text('Date of birth'),
64 - onChanged: print,
65 - description: const Text('Your date of birth is used to calculate your age.'),
66 - validator: (v) {
67 - if (v == null) return 'A date of birth is required.';
68 - return null;
69 - },
70 -)
71 -
72 -ShadDateRangePickerFormField(
73 - label: const Text('Range of dates'),
74 - onChanged: print,
75 - description: const Text('Select the range of dates you want to search between.'),
76 - validator: (v) {
77 - if (v == null) return 'A range of dates is required.';
78 - if (v.start == null) return 'The start date is required.';
79 - if (v.end == null) return 'The end date is required.';
80 - return null;
81 - },
82 -)
83 -```
84 -
85 -For form initial value as string (e.g. `'date': '2024-02-01'`), use `fromValueTransformer` and `toValueTransformer` on `ShadDatePickerFormField` to convert to/from `DateTime`. See [reference.md](reference.md) or the Form skill for value transformers.
.claude/skills/shadcn_ui-decorator/SKILL.md deleted
-57
@@ -1,57 +0,0 @@
1 ----
2 -name: shadcn_ui-decorator
3 -description: Configure ShadDecoration and ShadDecorator for shadcn_ui components; customize secondary border and disableSecondaryBorder. Use when styling form controls, focus rings, or component borders in Flutter shadcn_ui.
4 ----
5 -
6 -# Shadcn UI — Decorator
7 -
8 -## Instructions
9 -
10 -Most shadcn_ui components use a `ShadDecoration` handled by `ShadDecorator` for borders, focus state, labels, and error/description styles.
11 -
12 -### Default decoration
13 -
14 -Default includes secondary border, focused ring, label/error/description styles and padding:
15 -
16 -```dart
17 -ShadDecoration(
18 - secondaryBorder: ShadBorder.all(
19 - padding: const EdgeInsets.all(4),
20 - width: 0,
21 - ),
22 - secondaryFocusedBorder: ShadBorder.all(
23 - width: 2,
24 - color: colorScheme.ring,
25 - radius: radius.add(radius / 2),
26 - padding: const EdgeInsets.all(2),
27 - ),
28 - labelStyle: textTheme.muted.copyWith(
29 - fontWeight: FontWeight.w500,
30 - color: colorScheme.foreground,
31 - ),
32 - errorStyle: textTheme.muted.copyWith(
33 - fontWeight: FontWeight.w500,
34 - color: colorScheme.destructive,
35 - ),
36 - labelPadding: const EdgeInsets.only(bottom: 8),
37 - descriptionStyle: textTheme.muted,
38 - descriptionPadding: const EdgeInsets.only(top: 8),
39 - errorPadding: const EdgeInsets.only(top: 8),
40 - errorLabelStyle: textTheme.muted.copyWith(
41 - fontWeight: FontWeight.w500,
42 - color: colorScheme.destructive,
43 - ),
44 -);
45 -```
46 -
47 -### Disable secondary border
48 -
49 -By default a secondary border is drawn around focusable components. To disable it and rely on a bolder primary border:
50 -
51 -```dart
52 -ShadThemeData(
53 - disableSecondaryBorder: true,
54 -),
55 -```
56 -
57 -**Note:** Disabling the secondary border is not recommended; it can hurt accessibility because the focus ring helps users see which component is focused.
.claude/skills/shadcn_ui-dialog/SKILL.md deleted
-83
@@ -1,83 +0,0 @@
1 ----
2 -name: shadcn_ui-dialog
3 -description: Show modal dialogs with showShadDialog, ShadDialog and ShadDialog.alert; title, description, actions, child content. Use when adding modals, confirmations, or alert dialogs in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Dialog
7 -
8 -## Instructions
9 -
10 -A modal dialog that interrupts the user. Use `showShadDialog(context: context, builder: ...)` and return a `ShadDialog` or `ShadDialog.alert`. Provide `title`, optional `description`, optional `actions` (list of widgets, e.g. buttons), and optional `child` for body content. Dismiss with `Navigator.of(context).pop(...)`.
11 -
12 -### Standard dialog
13 -
14 -```dart
15 -showShadDialog(
16 - context: context,
17 - builder: (context) => ShadDialog(
18 - title: const Text('Edit Profile'),
19 - description: const Text(
20 - "Make changes to your profile here. Click save when you're done",
21 - ),
22 - actions: const [ShadButton(child: Text('Save changes'))],
23 - child: Container(
24 - width: 375,
25 - padding: const EdgeInsets.symmetric(vertical: 20),
26 - child: Column(
27 - mainAxisSize: MainAxisSize.min,
28 - crossAxisAlignment: CrossAxisAlignment.end,
29 - spacing: 16,
30 - children: profile
31 - .map(
32 - (p) => Row(
33 - children: [
34 - Expanded(
35 - child: Text(
36 - p.title,
37 - textAlign: TextAlign.end,
38 - style: theme.textTheme.small,
39 - ),
40 - ),
41 - const SizedBox(width: 16),
42 - Expanded(
43 - flex: 3,
44 - child: ShadInput(initialValue: p.value),
45 - ),
46 - ],
47 - ),
48 - )
49 - .toList(),
50 - ),
51 - ),
52 - ),
53 -);
54 -```
55 -
56 -### Alert dialog
57 -
58 -Use `ShadDialog.alert` for confirmations; pass `actions` with Cancel and Continue (or similar) that call `Navigator.of(context).pop(false)` and `Navigator.of(context).pop(true)`.
59 -
60 -```dart
61 -showShadDialog(
62 - context: context,
63 - builder: (context) => ShadDialog.alert(
64 - title: const Text('Are you absolutely sure?'),
65 - description: const Padding(
66 - padding: EdgeInsets.only(bottom: 8),
67 - child: Text(
68 - 'This action cannot be undone. This will permanently delete your account and remove your data from our servers.',
69 - ),
70 - ),
71 - actions: [
72 - ShadButton.outline(
73 - child: const Text('Cancel'),
74 - onPressed: () => Navigator.of(context).pop(false),
75 - ),
76 - ShadButton(
77 - child: const Text('Continue'),
78 - onPressed: () => Navigator.of(context).pop(true),
79 - ),
80 - ],
81 - ),
82 -);
83 -```
.claude/skills/shadcn_ui-form/SKILL.md deleted
-100
@@ -1,100 +0,0 @@
1 ----
2 -name: shadcn_ui-form
3 -description: Build forms with ShadForm, validation, and form field values; use ShadInputFormField, ShadCheckboxFormField, ShadSelectFormField, ShadDatePickerFormField, etc. Use when building validated forms, getting form values, or using dot notation for nested fields in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Form
7 -
8 -## Instructions
9 -
10 -`ShadForm` provides centralized form state, a single `Map<String, dynamic>` for all field values, and no need to manage individual controllers. Use a `GlobalKey<ShadFormState>` to call `saveAndValidate()` and read `value`. Give each form field an `id`; use `Shad*FormField` widgets (e.g. `ShadInputFormField`, `ShadCheckboxFormField`, `ShadSelectFormField`, `ShadDatePickerFormField`, `ShadTimePickerFormField`, `ShadRadioGroupFormField`) inside `ShadForm`.
11 -
12 -### Basic form
13 -
14 -```dart
15 -final formKey = GlobalKey<ShadFormState>();
16 -
17 -ShadForm(
18 - key: formKey,
19 - child: Column(
20 - children: [
21 - ShadInputFormField(
22 - id: 'username',
23 - label: const Text('Username'),
24 - placeholder: const Text('Enter your username'),
25 - description: const Text('This is your public display name.'),
26 - validator: (v) {
27 - if (v.length < 2) return 'Username must be at least 2 characters.';
28 - return null;
29 - },
30 - ),
31 - const SizedBox(height: 16),
32 - ShadButton(
33 - child: const Text('Submit'),
34 - onPressed: () {
35 - if (formKey.currentState!.saveAndValidate()) {
36 - print('value: ${formKey.currentState!.value}');
37 - } else {
38 - print('validation failed');
39 - }
40 - },
41 - ),
42 - ],
43 - ),
44 -)
45 -```
46 -
47 -### Submit and get value
48 -
49 -```dart
50 -ShadButton(
51 - child: const Text('Submit'),
52 - onPressed: () {
53 - final formState = formKey.currentState!;
54 - if (!formState.saveAndValidate()) return;
55 - print('Form value: ${formState.value}');
56 - },
57 -),
58 -```
59 -
60 -### Initial value
61 -
62 -Set default values with `initialValue` on `ShadForm`:
63 -
64 -```dart
65 -ShadForm(
66 - initialValue: {
67 - 'username': 'john_doe',
68 - 'email': 'john_doe@example.com',
69 - },
70 - child: // form fields with matching ids
71 -)
72 -```
73 -
74 -### Set field or full value
75 -
76 -- Single field: `formKey.currentState!.setFieldValue('username', 'new_username');` (use `notifyField: false` to skip updating the field UI).
77 -- Entire form: `formKey.currentState!.setValue({...});` (use `notifyFields: false` to skip updating fields).
78 -
79 -### Value transformers
80 -
81 -Use `fromValueTransformer` and `toValueTransformer` on form fields when the form value type differs from the field type (e.g. form stores string, field uses `DateTime`):
82 -
83 -```dart
84 -ShadDatePickerFormField(
85 - id: 'date',
86 - fromValueTransformer: (value) => DateTime.tryParse(value ?? ''),
87 - toValueTransformer: (date) =>
88 - date == null ? null : DateFormat('yyyy-MM-dd').format(date),
89 - ...
90 -)
91 -```
92 -
93 -### Dot notation for nested values
94 -
95 -Field IDs like `user.name` or `profile.settings.theme` produce nested maps in `formKey.currentState!.value`, e.g. `{'user': {'name': '...', 'email': '...'}}`. Provide `initialValue` as a nested map (not dot-notation keys). Customize separator with `fieldIdSeparator` (e.g. `'/'`); set `fieldIdSeparator: null` to disable nesting and keep flat keys.
96 -
97 -## Additional resources
98 -
99 -- Full details on initial value, setFieldValue/setValue, value transformers, and dot notation: [reference.md](reference.md)
100 -- Form field examples: Checkbox, Switch, Input, Select, RadioGroup, DatePicker, TimePicker component docs/skills.
.claude/skills/shadcn_ui-form/reference.md deleted
-47
@@ -1,47 +0,0 @@
1 -# Shadcn UI Form — Reference
2 -
3 -## Initial form value
4 -
5 -All form fields with matching `id`s are initialized from `ShadForm`'s `initialValue` map. Fields with their own `initialValue` override the form's.
6 -
7 -## Get the form value
8 -
9 -`formKey.currentState!.value` returns `Map<String, dynamic>`. Use after a successful `saveAndValidate()`.
10 -
11 -## setFieldValue
12 -
13 -`formKey.currentState!.setFieldValue('username', 'new_username');`
14 -
15 -- Pass `notifyField: false` to update only the form value, not the field UI.
16 -
17 -## setValue
18 -
19 -`formKey.currentState!.setValue({ 'username': '...', 'email': '...' });`
20 -
21 -- Pass `notifyFields: false` to update only the form value, not the fields UI.
22 -
23 -## Value transformers
24 -
25 -- **fromValueTransformer**: Converts form value (e.g. string) to field value (e.g. DateTime).
26 -- **toValueTransformer**: Converts field value back to form value for `value` and validation.
27 -
28 -Example: form has `{'date': '2024-02-01'}`; `ShadDatePickerFormField` needs `DateTime`. Use `fromValueTransformer: (value) => DateTime.tryParse(value ?? '')` and `toValueTransformer: (date) => date == null ? null : DateFormat('yyyy-MM-dd').format(date)`.
29 -
30 -## Dot notation
31 -
32 -- IDs like `user.email` or `profile.settings.theme` create nested maps in `value`.
33 -- `initialValue` must be nested: `{'user': {'name': 'John', 'email': '...'}}`.
34 -- Custom separator: `ShadForm(fieldIdSeparator: '/', ...)` then use `user/name`.
35 -- Disable: `ShadForm(fieldIdSeparator: null, ...)` so `user.email` stays a flat key.
36 -
37 -## Form field components
38 -
39 -Use inside `ShadForm` with unique `id` and optional `validator`:
40 -
41 -- ShadInputFormField
42 -- ShadCheckboxFormField
43 -- ShadSwitchFormField
44 -- ShadSelectFormField
45 -- ShadRadioGroupFormField
46 -- ShadDatePickerFormField / ShadDateRangePickerFormField
47 -- ShadTimePickerFormField
.claude/skills/shadcn_ui-getting-started/SKILL.md deleted
-122
@@ -1,122 +0,0 @@
1 ----
2 -name: shadcn_ui-getting-started
3 -description: Install and set up Flutter Shadcn UI (shadcn_ui), configure ShadApp with Material or Cupertino, and use bundled packages. Use when starting a Flutter project with shadcn_ui, adding shadcn_ui dependency, or integrating Shadcn with MaterialApp/CupertinoApp.
4 ----
5 -
6 -# Shadcn UI for Flutter — Getting Started
7 -
8 -## Instructions
9 -
10 -### Installation
11 -
12 -From the project root:
13 -
14 -```bash
15 -flutter pub add shadcn_ui
16 -```
17 -
18 -Or add to `pubspec.yaml`:
19 -
20 -```yaml
21 -dependencies:
22 - shadcn_ui: ^0.2.4 # use latest version
23 -```
24 -
25 -### Shadcn only (pure)
26 -
27 -Use `ShadApp` for apps that use only Shadcn UI components (no Material/Cupertino):
28 -
29 -```dart
30 -import 'package:shadcn_ui/shadcn_ui.dart';
31 -
32 -void main() {
33 - runApp(const MyApp());
34 -}
35 -
36 -class MyApp extends StatelessWidget {
37 - const MyApp({super.key});
38 -
39 - @override
40 - Widget build(BuildContext context) {
41 - return ShadApp();
42 - }
43 -}
44 -```
45 -
46 -For declarative routing use `ShadApp.router`.
47 -
48 -### Shadcn + Material
49 -
50 -Use `ShadApp.custom` with `appBuilder` to wrap `MaterialApp` and use shadcn and Material together. Wrap the app with `ShadAppBuilder` in the builder:
51 -
52 -```dart
53 -import 'package:shadcn_ui/shadcn_ui.dart';
54 -import 'package:flutter/material.dart';
55 -
56 -return ShadApp.custom(
57 - themeMode: ThemeMode.dark,
58 - darkTheme: ShadThemeData(
59 - brightness: Brightness.dark,
60 - colorScheme: const ShadSlateColorScheme.dark(),
61 - ),
62 - appBuilder: (context) {
63 - return MaterialApp(
64 - theme: Theme.of(context),
65 - builder: (context, child) {
66 - return ShadAppBuilder(child: child!);
67 - },
68 - );
69 - },
70 -);
71 -```
72 -
73 -Use `MaterialApp.router` when using the Router API.
74 -
75 -ShadApp builds a default Material `ThemeData` from `ShadThemeData` (fontFamily, extensions, colorScheme mapping, dividerTheme, textSelectionTheme, iconTheme, scrollbarTheme). Override with `Theme.of(context).copyWith(...)` without losing shadcn defaults.
76 -
77 -### Shadcn + Cupertino
78 -
79 -Use `CupertinoApp` inside `appBuilder` for Cupertino + shadcn:
80 -
81 -```dart
82 -import 'package:shadcn_ui/shadcn_ui.dart';
83 -import 'package:flutter/cupertino.dart';
84 -import 'package:flutter_localizations/flutter_localizations.dart';
85 -
86 -return ShadApp.custom(
87 - themeMode: ThemeMode.dark,
88 - darkTheme: ShadThemeData(
89 - brightness: Brightness.dark,
90 - colorScheme: const ShadSlateColorScheme.dark(),
91 - ),
92 - appBuilder: (context) {
93 - return CupertinoApp(
94 - theme: CupertinoTheme.of(context),
95 - localizationsDelegates: const [
96 - DefaultMaterialLocalizations.delegate,
97 - DefaultCupertinoLocalizations.delegate,
98 - DefaultWidgetsLocalizations.delegate,
99 - ],
100 - builder: (context, child) {
101 - return ShadAppBuilder(child: child!);
102 - },
103 - );
104 - },
105 -);
106 -```
107 -
108 -Use `CupertinoApp.router` for Router-based navigation. Override Cupertino theme with `CupertinoTheme.of(context).copyWith(...)`.
109 -
110 -### Bundled packages
111 -
112 -Shadcn UI re-exports these packages; no extra imports needed:
113 -
114 -- **flutter_animate** — Animations; components accept `List<Effect>` for customization.
115 -- **lucide_icons_flutter** — Icons via `LucideIcons` (e.g. `LucideIcons.activity`). Browse at https://lucide.dev/icons/
116 -- **two_dimensional_scrollables** — Used by `ShadTable`.
117 -- **intl** — i18n and message translation.
118 -- **universal_image** — Multiple image formats; used by `ShadAvatar`.
119 -
120 -### Submit your app
121 -
122 -To add your app to the showcase: [open the GitHub template](https://github.com/nank1ro/flutter-shadcn-ui/issues/new?template=docs-add-app.yaml) and fill the form.
.claude/skills/shadcn_ui-icon-button/SKILL.md deleted
-60
@@ -1,60 +0,0 @@
1 ----
2 -name: shadcn_ui-icon-button
3 -description: Use ShadIconButton and variants (primary, secondary, destructive, outline, ghost); loading state, gradient and shadow. Use when adding icon-only buttons or icon CTAs in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Icon Button
7 -
8 -## Instructions
9 -
10 -`ShadIconButton` displays an icon button. Variants: default (primary), `ShadIconButton.secondary`, `ShadIconButton.destructive`, `ShadIconButton.outline`, `ShadIconButton.ghost`. Use `icon` and `onPressed`; optional `iconSize`, `padding`; support gradient and shadows.
11 -
12 -### Variants
13 -
14 -```dart
15 -ShadIconButton(
16 - onPressed: () => print('Primary'),
17 - icon: const Icon(LucideIcons.rocket),
18 -)
19 -
20 -ShadIconButton.secondary(icon: const Icon(LucideIcons.rocket), onPressed: () {})
21 -
22 -ShadIconButton.destructive(icon: const Icon(LucideIcons.rocket), onPressed: () {})
23 -
24 -ShadIconButton.outline(icon: const Icon(LucideIcons.rocket), onPressed: () {})
25 -
26 -ShadIconButton.ghost(icon: const Icon(LucideIcons.rocket), onPressed: () {})
27 -```
28 -
29 -### Loading
30 -
31 -Use a small `CircularProgressIndicator` as `icon`:
32 -
33 -```dart
34 -ShadIconButton(
35 - icon: SizedBox.square(
36 - dimension: 16,
37 - child: CircularProgressIndicator(
38 - strokeWidth: 2,
39 - color: ShadTheme.of(context).colorScheme.primaryForeground,
40 - ),
41 - ),
42 -)
43 -```
44 -
45 -### Gradient and shadow
46 -
47 -```dart
48 -ShadIconButton(
49 - gradient: const LinearGradient(colors: [Colors.cyan, Colors.indigo]),
50 - shadows: [
51 - BoxShadow(
52 - color: Colors.blue.withValues(alpha: .4),
53 - spreadRadius: 4,
54 - blurRadius: 10,
55 - offset: const Offset(0, 2),
56 - ),
57 - ],
58 - icon: const Icon(LucideIcons.rocket),
59 -)
60 -```
.claude/skills/shadcn_ui-input-otp/SKILL.md deleted
-93
@@ -1,93 +0,0 @@
1 ----
2 -name: shadcn_ui-input-otp
3 -description: Build OTP input with ShadInputOTP, ShadInputOTPGroup, ShadInputOTPSlot; maxLength, inputFormatters, ShadInputOTPFormField. Use when adding one-time password or verification code inputs in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Input OTP
7 -
8 -## Instructions
9 -
10 -`ShadInputOTP` is an accessible one-time password component with copy-paste support. Use `children` to build the layout: `ShadInputOTPGroup` containing `ShadInputOTPSlot`s, with optional separators (e.g. `Icon(LucideIcons.dot)`). Set `maxLength`; use `onChanged` for the full OTP string. Restrict input with `keyboardType` and `inputFormatters` (e.g. `FilteringTextInputFormatter.digitsOnly`). For forms use `ShadInputOTPFormField` with `id`, `label`, `validator`.
11 -
12 -### Basic
13 -
14 -```dart
15 -ShadInputOTP(
16 - onChanged: (v) => print('OTP: $v'),
17 - maxLength: 6,
18 - children: const [
19 - ShadInputOTPGroup(
20 - children: [
21 - ShadInputOTPSlot(),
22 - ShadInputOTPSlot(),
23 - ShadInputOTPSlot(),
24 - ],
25 - ),
26 - Icon(size: 24, LucideIcons.dot),
27 - ShadInputOTPGroup(
28 - children: [
29 - ShadInputOTPSlot(),
30 - ShadInputOTPSlot(),
31 - ShadInputOTPSlot(),
32 - ],
33 - ),
34 - ],
35 -)
36 -```
37 -
38 -### With input formatters (digits only)
39 -
40 -```dart
41 -ShadInputOTP(
42 - onChanged: (v) => print('OTP: $v'),
43 - maxLength: 4,
44 - keyboardType: TextInputType.number,
45 - inputFormatters: [
46 - FilteringTextInputFormatter.digitsOnly,
47 - ],
48 - children: const [
49 - ShadInputOTPGroup(
50 - children: [
51 - ShadInputOTPSlot(),
52 - ShadInputOTPSlot(),
53 - ShadInputOTPSlot(),
54 - ShadInputOTPSlot(),
55 - ],
56 - ),
57 - ],
58 -)
59 -```
60 -
61 -The package also provides `UpperCaseTextInputFormatter` and `LowerCaseTextInputFormatter`.
62 -
63 -### Form field
64 -
65 -```dart
66 -ShadInputOTPFormField(
67 - id: 'otp',
68 - maxLength: 6,
69 - label: const Text('OTP'),
70 - description: const Text('Enter your OTP.'),
71 - validator: (v) {
72 - if (v.contains(' ')) return 'Fill the whole OTP code';
73 - return null;
74 - },
75 - children: const [
76 - ShadInputOTPGroup(
77 - children: [
78 - ShadInputOTPSlot(),
79 - ShadInputOTPSlot(),
80 - ShadInputOTPSlot(),
81 - ],
82 - ),
83 - Icon(size: 24, LucideIcons.dot),
84 - ShadInputOTPGroup(
85 - children: [
86 - ShadInputOTPSlot(),
87 - ShadInputOTPSlot(),
88 - ShadInputOTPSlot(),
89 - ],
90 - ),
91 - ],
92 -)
93 -```
.claude/skills/shadcn_ui-input/SKILL.md deleted
-59
@@ -1,59 +0,0 @@
1 ----
2 -name: shadcn_ui-input
3 -description: Use ShadInput for text fields; placeholder, leading/trailing widgets, obscureText; ShadInputFormField for forms with validation. Use when adding text inputs, email/password fields, or form input fields in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Input
7 -
8 -## Instructions
9 -
10 -`ShadInput` displays a form input or input-like component. Use `placeholder`, `initialValue`, `keyboardType`, `obscureText`; optional `leading` and `trailing` widgets. For forms use `ShadInputFormField` with `id`, `label`, `description`, `validator`.
11 -
12 -### Basic
13 -
14 -```dart
15 -const ShadInput(
16 - placeholder: Text('Email'),
17 - keyboardType: TextInputType.emailAddress,
18 -)
19 -```
20 -
21 -### With leading and trailing
22 -
23 -Example: password with toggle visibility:
24 -
25 -```dart
26 -ShadInput(
27 - placeholder: const Text('Password'),
28 - obscureText: obscure,
29 - leading: Icon(LucideIcons.lock),
30 - trailing: SizedBox.square(
31 - dimension: 24,
32 - child: OverflowBox(
33 - maxWidth: 28,
34 - maxHeight: 28,
35 - child: ShadIconButton(
36 - iconSize: 20,
37 - padding: EdgeInsets.all(2),
38 - icon: Icon(obscure ? LucideIcons.eyeOff : LucideIcons.eye),
39 - onPressed: () => setState(() => obscure = !obscure),
40 - ),
41 - ),
42 - ),
43 -)
44 -```
45 -
46 -### Form field
47 -
48 -```dart
49 -ShadInputFormField(
50 - id: 'username',
51 - label: const Text('Username'),
52 - placeholder: const Text('Enter your username'),
53 - description: const Text('This is your public display name.'),
54 - validator: (v) {
55 - if (v.length < 2) return 'Username must be at least 2 characters.';
56 - return null;
57 - },
58 -)
59 -```
.claude/skills/shadcn_ui-menubar/SKILL.md deleted
-70
@@ -1,70 +0,0 @@
1 ----
2 -name: shadcn_ui-menubar
3 -description: Build desktop-style menubars with ShadMenubar and ShadMenubarItem; nested items, ShadContextMenuItem, dividers. Use when adding a persistent top menu (File, Edit, View, etc.) in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Menubar
7 -
8 -## Instructions
9 -
10 -`ShadMenubar` is a visually persistent menu (e.g. File, Edit, View). Each top-level entry is a `ShadMenubarItem` with `child` (label) and `items` (list of menu entries). Use `ShadContextMenuItem` and `ShadContextMenuItem.inset` for entries; use `ShadSeparator.horizontal` or `Divider(height: 8)` for dividers. Nest `ShadContextMenuItem` with `items` for submenus; use `trailing: Icon(LucideIcons.chevronRight)` on parent. Set `enabled: false` to disable an item.
11 -
12 -### Structure
13 -
14 -```dart
15 -ShadMenubar(
16 - items: [
17 - ShadMenubarItem(
18 - items: [
19 - const ShadContextMenuItem(child: Text('New Tab')),
20 - const ShadContextMenuItem(child: Text('New Window')),
21 - const ShadContextMenuItem(
22 - enabled: false,
23 - child: Text('New Incognito Window'),
24 - ),
25 - divider,
26 - const ShadContextMenuItem(
27 - trailing: Icon(LucideIcons.chevronRight),
28 - items: [
29 - ShadContextMenuItem(child: Text('Email Link')),
30 - ShadContextMenuItem(child: Text('Messages')),
31 - ],
32 - child: Text('Share'),
33 - ),
34 - divider,
35 - const ShadContextMenuItem(child: Text('Print...')),
36 - ],
37 - child: const Text('File'),
38 - ),
39 - ShadMenubarItem(
40 - items: [
41 - const ShadContextMenuItem(child: Text('Undo')),
42 - const ShadContextMenuItem(child: Text('Redo')),
43 - divider,
44 - ShadContextMenuItem(
45 - trailing: const Icon(LucideIcons.chevronRight),
46 - items: [
47 - const ShadContextMenuItem(child: Text('Find...')),
48 - const ShadContextMenuItem(child: Text('Find Next')),
49 - ],
50 - child: const Text('Find'),
51 - ),
52 - divider,
53 - const ShadContextMenuItem(child: Text('Cut')),
54 - const ShadContextMenuItem(child: Text('Copy')),
55 - const ShadContextMenuItem(child: Text('Paste')),
56 - ],
57 - child: const Text('Edit'),
58 - ),
59 - ShadMenubarItem(
60 - items: [
61 - const ShadContextMenuItem.inset(child: Text('Reload')),
62 - const ShadContextMenuItem.inset(child: Text('Toggle Full Screen')),
63 - ],
64 - child: const Text('View'),
65 - ),
66 - ],
67 -)
68 -```
69 -
70 -Create a reusable `divider` with `ShadSeparator.horizontal(margin: const EdgeInsets.symmetric(vertical: 4), color: theme.colorScheme.muted)`.
.claude/skills/shadcn_ui-popover/SKILL.md deleted
-41
@@ -1,41 +0,0 @@
1 ----
2 -name: shadcn_ui-popover
3 -description: Show rich content in a popover with ShadPopover, ShadPopoverController; trigger button, toggle. Use when adding popovers, floating panels, or button-triggered overlay content in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Popover
7 -
8 -## Instructions
9 -
10 -`ShadPopover` displays rich content in a portal, triggered by a button (or other trigger). Use a `ShadPopoverController()` to control open/close; call `popoverController.toggle` from the trigger. Pass `popover: (context) => ...` returning the overlay widget (e.g. a `SizedBox` with form fields); `child` is the trigger widget.
11 -
12 -### Basic usage
13 -
14 -```dart
15 -final popoverController = ShadPopoverController();
16 -
17 -// dispose: popoverController.dispose();
18 -
19 -ShadPopover(
20 - controller: popoverController,
21 - popover: (context) => SizedBox(
22 - width: 288,
23 - child: Column(
24 - crossAxisAlignment: CrossAxisAlignment.start,
25 - mainAxisSize: MainAxisSize.min,
26 - children: [
27 - Text('Dimensions', style: textTheme.h4),
28 - Text('Set the dimensions for the layer.', style: textTheme.p),
29 - const SizedBox(height: 4),
30 - // ... form rows with ShadInput, etc.
31 - ],
32 - ),
33 - ),
34 - child: ShadButton.outline(
35 - onPressed: popoverController.toggle,
36 - child: const Text('Open popover'),
37 - ),
38 -)
39 -```
40 -
41 -Dispose the controller in `State.dispose`.
.claude/skills/shadcn_ui-progress/SKILL.md deleted
-29
@@ -1,29 +0,0 @@
1 ----
2 -name: shadcn_ui-progress
3 -description: Show progress with ShadProgress; determinate (value 0–1) or indeterminate. Use when displaying task completion or loading progress in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Progress
7 -
8 -## Instructions
9 -
10 -`ShadProgress` displays completion progress, typically as a progress bar. Use determinate mode with a `value` (0.0–1.0); omit `value` for indeterminate (animated) progress.
11 -
12 -### Determinate
13 -
14 -```dart
15 -ConstrainedBox(
16 - constraints: BoxConstraints(
17 - maxWidth: MediaQuery.sizeOf(context).width * 0.6,
18 - ),
19 - child: const ShadProgress(value: 0.5),
20 -)
21 -```
22 -
23 -### Indeterminate
24 -
25 -```dart
26 -const ShadProgress()
27 -```
28 -
29 -Constrain width with `ConstrainedBox` or parent layout as needed.
.claude/skills/shadcn_ui-radio-group/SKILL.md deleted
-42
@@ -1,42 +0,0 @@
1 ----
2 -name: shadcn_ui-radio-group
3 -description: Use ShadRadioGroup and ShadRadio for single-choice options; ShadRadioGroupFormField for forms. Use when adding radio buttons or single-select options in a Flutter shadcn_ui app or ShadForm.
4 ----
5 -
6 -# Shadcn UI — Radio Group
7 -
8 -## Instructions
9 -
10 -`ShadRadioGroup<T>` is a set of radio buttons where at most one can be selected. Provide `items` as a list of `ShadRadio<T>` with `value` and `label`. Use `ShadRadioGroupFormField<T>` inside `ShadForm` with `id`, `label`, `items`, and `validator`.
11 -
12 -### Standalone
13 -
14 -```dart
15 -ShadRadioGroup<String>(
16 - items: [
17 - ShadRadio(label: Text('Default'), value: 'default'),
18 - ShadRadio(label: Text('Comfortable'), value: 'comfortable'),
19 - ShadRadio(label: Text('Nothing'), value: 'nothing'),
20 - ],
21 -)
22 -```
23 -
24 -### Form field
25 -
26 -```dart
27 -enum NotifyAbout { all, mentions, nothing; }
28 -
29 -ShadRadioGroupFormField<NotifyAbout>(
30 - label: const Text('Notify me about'),
31 - items: NotifyAbout.values.map(
32 - (e) => ShadRadio(
33 - value: e,
34 - label: Text(e.message),
35 - ),
36 - ),
37 - validator: (v) {
38 - if (v == null) return 'You need to select a notification type.';
39 - return null;
40 - },
41 -)
42 -```
.claude/skills/shadcn_ui-resizable/SKILL.md deleted
-81
@@ -1,81 +0,0 @@
1 ----
2 -name: shadcn_ui-resizable
3 -description: Build resizable panel layouts with ShadResizablePanelGroup and ShadResizablePanel; horizontal/vertical axis, defaultSize, minSize, maxSize, showHandle. Use when adding resizable split panes or panel groups in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Resizable
7 -
8 -## Instructions
9 -
10 -`ShadResizablePanelGroup` contains `ShadResizablePanel` children. Each panel has `id`, `defaultSize` (fraction 0–1), optional `minSize` and `maxSize`, and `child`. Use `axis: Axis.vertical` for vertical splits. Nest `ShadResizablePanelGroup` inside a panel for nested layouts. Set `showHandle: true` to show the resize handle; optional `handleIcon` or `handleIconSrc` to customize. Double-click the handle to reset to default size.
11 -
12 -### Basic horizontal
13 -
14 -```dart
15 -ShadResizablePanelGroup(
16 - children: [
17 - ShadResizablePanel(
18 - id: 0,
19 - defaultSize: .5,
20 - minSize: .2,
21 - maxSize: .8,
22 - child: Center(child: Text('One', style: theme.textTheme.large)),
23 - ),
24 - ShadResizablePanel(
25 - id: 1,
26 - defaultSize: .5,
27 - child: ShadResizablePanelGroup(
28 - axis: Axis.vertical,
29 - children: [
30 - ShadResizablePanel(
31 - id: 0,
32 - defaultSize: .3,
33 - child: Center(child: Text('Two', style: theme.textTheme.large)),
34 - ),
35 - ShadResizablePanel(
36 - id: 1,
37 - defaultSize: .7,
38 - child: Align(child: Text('Three', style: theme.textTheme.large)),
39 - ),
40 - ],
41 - ),
42 - ),
43 - ],
44 -)
45 -```
46 -
47 -### Vertical
48 -
49 -```dart
50 -ShadResizablePanelGroup(
51 - axis: Axis.vertical,
52 - children: [
53 - ShadResizablePanel(
54 - id: 0,
55 - defaultSize: 0.3,
56 - minSize: 0.1,
57 - child: Center(child: Text('Header', style: theme.textTheme.large)),
58 - ),
59 - ShadResizablePanel(
60 - id: 1,
61 - defaultSize: 0.7,
62 - minSize: 0.1,
63 - child: Center(child: Text('Footer', style: theme.textTheme.large)),
64 - ),
65 - ],
66 -)
67 -```
68 -
69 -### With visible handle
70 -
71 -```dart
72 -ShadResizablePanelGroup(
73 - showHandle: true,
74 - children: [
75 - ShadResizablePanel(id: 0, defaultSize: .5, minSize: .2, child: ...),
76 - ShadResizablePanel(id: 1, defaultSize: .5, minSize: .2, child: ...),
77 - ],
78 -)
79 -```
80 -
81 -Wrap the group in a bordered container (e.g. `DecoratedBox` + `ClipRRect` with `theme.radius`) for a clean look.
.claude/skills/shadcn_ui-responsive/SKILL.md deleted
-65
@@ -1,65 +0,0 @@
1 ----
2 -name: shadcn_ui-responsive
3 -description: Use Shadcn UI breakpoints and responsive layout with ShadBreakpoints, ShadResponsiveBuilder, and context.breakpoint. Use when building responsive Flutter shadcn_ui layouts, adapting UI to screen size, or checking current breakpoint (tn, sm, md, lg, xl, xxl).
4 ----
5 -
6 -# Shadcn UI — Responsive
7 -
8 -## Instructions
9 -
10 -Responsiveness is built into shadcn_ui via `ShadThemeData.breakpoints`. Use `ShadResponsiveBuilder` or `context.breakpoint` to branch on the current breakpoint.
11 -
12 -### Default breakpoints
13 -
14 -```dart
15 -ShadThemeData(
16 - breakpoints: ShadBreakpoints(
17 - tn: 0, // tiny
18 - sm: 640, // small
19 - md: 768, // medium
20 - lg: 1024, // large
21 - xl: 1280, // extra large
22 - xxl: 1536, // extra extra large
23 - ),
24 -);
25 -```
26 -
27 -### Current breakpoint
28 -
29 -**With ShadResponsiveBuilder:**
30 -
31 -```dart
32 -ShadResponsiveBuilder(
33 - builder: (context, breakpoint) {
34 - final sm = breakpoint >= ShadTheme.of(context).breakpoints.sm;
35 - // ...
36 - },
37 -),
38 -```
39 -
40 -**With context (equivalent):**
41 -
42 -```dart
43 -final sm = context.breakpoint >= ShadTheme.of(context).breakpoints.sm;
44 -```
45 -
46 -Use `>=` so that e.g. "sm" applies to small and larger viewports (Tailwind-style). Use `==` only when you need to match a single breakpoint.
47 -
48 -### Sealed class switch
49 -
50 -The breakpoint is a sealed type; you can switch on it:
51 -
52 -```dart
53 -ShadResponsiveBuilder(
54 - builder: (context, breakpoint) {
55 - return switch (breakpoint) {
56 - ShadBreakpointTN() => const Text('Tiny'),
57 - ShadBreakpointSM() => const Text('Small'),
58 - ShadBreakpointMD() => const Text('Medium'),
59 - ShadBreakpointLG() => const Text('Large'),
60 - ShadBreakpointXL() => const Text('Extra Large'),
61 - ShadBreakpointXXL() => const Text('Extra Extra Large'),
62 - };
63 - },
64 -),
65 -```
.claude/skills/shadcn_ui-select/SKILL.md deleted
-68
@@ -1,68 +0,0 @@
1 ----
2 -name: shadcn_ui-select
3 -description: Use ShadSelect for dropdown option lists; ShadOption, placeholder, selectedOptionBuilder, scrollable groups, ShadSelect.withSearch, ShadSelect.multiple, ShadSelectFormField. Use when adding dropdowns, single/multi select, or searchable select in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Select
7 -
8 -## Instructions
9 -
10 -`ShadSelect<T>` displays a list of options triggered by a button. Provide `options` (list of `ShadOption<T>` or section headers like `Padding` with text), `placeholder`, `selectedOptionBuilder: (context, value) => ...`, and `onChanged`. Use `initialValue` or controlled state for selected value. Set `minWidth`/`maxWidth`/`maxHeight` as needed. For forms use `ShadSelectFormField<T>` with `id`, `validator`. Use `allowDeselection: true` to allow clearing the selection.
11 -
12 -### Basic
13 -
14 -```dart
15 -final fruits = {'apple': 'Apple', 'banana': 'Banana', ...};
16 -
17 -ShadSelect<String>(
18 - placeholder: const Text('Select a fruit'),
19 - options: [
20 - Padding(
21 - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 6),
22 - child: Text(
23 - 'Fruits',
24 - style: theme.textTheme.muted.copyWith(
25 - fontWeight: FontWeight.w600,
26 - color: theme.colorScheme.popoverForeground,
27 - ),
28 - textAlign: TextAlign.start,
29 - ),
30 - ),
31 - ...fruits.entries.map((e) => ShadOption(value: e.key, child: Text(e.value))),
32 - ],
33 - selectedOptionBuilder: (context, value) => Text(fruits[value]!),
34 - onChanged: print,
35 -)
36 -```
37 -
38 -### Form field
39 -
40 -```dart
41 -ShadSelectFormField<String>(
42 - id: 'email',
43 - minWidth: 350,
44 - initialValue: null,
45 - options: verifiedEmails
46 - .map((email) => ShadOption(value: email, child: Text(email)))
47 - .toList(),
48 - selectedOptionBuilder: (context, value) =>
49 - value == 'none' ? const Text('Select a verified email to display') : Text(value),
50 - placeholder: const Text('Select a verified email to display'),
51 - validator: (v) {
52 - if (v == null) return 'Please select an email to display';
53 - return null;
54 - },
55 -)
56 -```
57 -
58 -### With search
59 -
60 -Use `ShadSelect.withSearch`. Pass `onSearchChanged`, `searchPlaceholder`, and filter options in state (e.g. wrap options in `Offstage(offstage: !filtered.containsKey(key), child: ShadOption(...))` to avoid focus loss when results change).
61 -
62 -### Multiple
63 -
64 -Use `ShadSelect.multiple`. Pass `selectedOptionsBuilder: (context, values) => ...`, `onChanged`, and optionally `allowDeselection: true`, `closeOnSelect: false` to keep popover open after selection.
65 -
66 -## Additional resources
67 -
68 -Scrollable option lists (grouped sections) and full search/multiple examples: [reference.md](reference.md).
.claude/skills/shadcn_ui-select/reference.md deleted
-48
@@ -1,48 +0,0 @@
1 -# Shadcn UI Select — Reference
2 -
3 -## Scrollable / grouped options
4 -
5 -Build `options` as a list of section headers (`Padding` with styled `Text`) followed by `ShadOption` widgets for that section. For large lists the select popover scrolls. Example for timezones by region:
6 -
7 -```dart
8 -List<Widget> getTimezonesWidgets(ShadThemeData theme) {
9 - final widgets = <Widget>[];
10 - for (final zone in timezones.entries) {
11 - widgets.add(
12 - Padding(
13 - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 6),
14 - child: Text(
15 - zone.key,
16 - style: theme.textTheme.muted.copyWith(
17 - fontWeight: FontWeight.w600,
18 - color: theme.colorScheme.popoverForeground,
19 - ),
20 - textAlign: TextAlign.start,
21 - ),
22 - ),
23 - );
24 - widgets.addAll(zone.value.entries
25 - .map((e) => ShadOption(value: e.key, child: Text(e.value))));
26 - }
27 - return widgets;
28 -}
29 -
30 -ShadSelect<String>(
31 - placeholder: const Text('Select a timezone'),
32 - options: getTimezonesWidgets(theme),
33 - selectedOptionBuilder: (context, value) {
34 - final timezone = timezones.entries
35 - .firstWhere((element) => element.value.containsKey(value))
36 - .value[value];
37 - return Text(timezone!);
38 - },
39 -)
40 -```
41 -
42 -## With search
43 -
44 -Use `ShadSelect<String>.withSearch`, maintain `searchValue` in state, compute `filteredFrameworks` (or similar), and pass `onSearchChanged: (value) => setState(() => searchValue = value)`. In `options`, show "No results" when filtered is empty; otherwise map entries and wrap each `ShadOption` in `Offstage(offstage: !filtered.containsKey(key), child: ShadOption(...))` so the widget stays in the tree and focus is preserved.
45 -
46 -## Multiple selection
47 -
48 -Use `ShadSelect<T>.multiple`. Provide `selectedOptionsBuilder: (context, values) => Text(values.join(', '))` (or similar), `onChanged`, and optionally `allowDeselection: true`, `closeOnSelect: false`. Tap outside the popover to close it.
.claude/skills/shadcn_ui-separator/SKILL.md deleted
-30
@@ -1,30 +0,0 @@
1 ----
2 -name: shadcn_ui-separator
3 -description: Visually separate content with ShadSeparator.horizontal and ShadSeparator.vertical; thickness, margin, radius. Use when adding dividers or visual separation in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Separator
7 -
8 -## Instructions
9 -
10 -`ShadSeparator` visually or semantically separates content. Use `ShadSeparator.horizontal` for a horizontal line (e.g. between rows); use `ShadSeparator.vertical` for a vertical line (e.g. between columns). Optional: `thickness`, `margin`, `radius`, `color`.
11 -
12 -### Horizontal
13 -
14 -```dart
15 -const ShadSeparator.horizontal(
16 - thickness: 4,
17 - margin: EdgeInsets.symmetric(horizontal: 20),
18 - radius: BorderRadius.all(Radius.circular(4)),
19 -)
20 -```
21 -
22 -### Vertical
23 -
24 -```dart
25 -const ShadSeparator.vertical(
26 - thickness: 4,
27 - margin: EdgeInsets.symmetric(vertical: 20),
28 - radius: BorderRadius.all(Radius.circular(4)),
29 -)
30 -```
.claude/skills/shadcn_ui-sheet/SKILL.md deleted
-61
@@ -1,61 +0,0 @@
1 ----
2 -name: shadcn_ui-sheet
3 -description: Show slide-out panels with showShadSheet and ShadSheet; side (top, right, bottom, left), title, description, actions, child. Use when adding side panels, drawers, or slide-over content in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Sheet
7 -
8 -## Instructions
9 -
10 -Sheets extend the dialog pattern to display content from an edge of the screen. Use `showShadSheet(context: context, side: ShadSheetSide.*, builder: (context) => ShadSheet(...))`. `side` can be `ShadSheetSide.top`, `ShadSheetSide.right`, `ShadSheetSide.bottom`, or `ShadSheetSide.left`. Return a `ShadSheet` with optional `title`, `description`, `child` (body), and `actions`. Use `constraints` (e.g. `BoxConstraints(maxWidth: 512)` for left/right) to limit width or height.
11 -
12 -### Basic (right side)
13 -
14 -```dart
15 -showShadSheet(
16 - side: ShadSheetSide.right,
17 - context: context,
18 - builder: (context) => ShadSheet(
19 - constraints: const BoxConstraints(maxWidth: 512),
20 - title: const Text('Edit Profile'),
21 - description: const Text(
22 - "Make changes to your profile here. Click save when you're done",
23 - ),
24 - child: Padding(
25 - padding: const EdgeInsets.symmetric(vertical: 20),
26 - child: Column(
27 - mainAxisSize: MainAxisSize.min,
28 - crossAxisAlignment: CrossAxisAlignment.stretch,
29 - spacing: 16,
30 - children: profile
31 - .map(
32 - (p) => Row(
33 - children: [
34 - Expanded(
35 - child: Text(
36 - p.title,
37 - textAlign: TextAlign.end,
38 - style: theme.textTheme.small,
39 - ),
40 - ),
41 - const SizedBox(width: 16),
42 - Expanded(
43 - flex: 5,
44 - child: ShadInput(initialValue: p.value),
45 - ),
46 - ],
47 - ),
48 - )
49 - .toList(),
50 - ),
51 - ),
52 - actions: const [
53 - ShadButton(child: Text('Save changes')),
54 - ],
55 - ),
56 -);
57 -```
58 -
59 -### All sides
60 -
61 -Use `side: ShadSheetSide.top`, `ShadSheetSide.bottom`, `ShadSheetSide.left`, or `ShadSheetSide.right` in `showShadSheet`. For left/right sheets pass `constraints: const BoxConstraints(maxWidth: 512)` to the `ShadSheet` so content doesn’t stretch full width.
.claude/skills/shadcn_ui-slider/SKILL.md deleted
-21
@@ -1,21 +0,0 @@
1 ----
2 -name: shadcn_ui-slider
3 -description: Use ShadSlider for numeric input within a range; initialValue, max (and min). Use when adding range sliders or numeric selection in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Slider
7 -
8 -## Instructions
9 -
10 -`ShadSlider` lets the user select a value from a range. Set `initialValue` and `max` (and optionally `min`). Use with state or a controller if you need to read the value on change.
11 -
12 -### Basic
13 -
14 -```dart
15 -ShadSlider(
16 - initialValue: 33,
17 - max: 100,
18 -)
19 -```
20 -
21 -Use callbacks or state management to react to value changes when needed.
.claude/skills/shadcn_ui-sonner/SKILL.md deleted
-36
@@ -1,36 +0,0 @@
1 ----
2 -name: shadcn_ui-sonner
3 -description: Show toasts with ShadSonner and ShadToast; ShadSonner.of(context), show/hide, title, description, action. Use when showing toast notifications or ephemeral feedback in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Sonner
7 -
8 -## Instructions
9 -
10 -Sonner is an opinionated toast component. Ensure `ShadSonner` is in the widget tree (e.g. in app builder). Get the controller with `ShadSonner.of(context)`. Call `sonner.show(ShadToast(...))` to show a toast; use `sonner.hide(id)` to dismiss. Each toast can have `id`, `title`, `description`, and optional `action` (e.g. an Undo button).
11 -
12 -### Show toast
13 -
14 -```dart
15 -ShadButton.outline(
16 - child: const Text('Show Toast'),
17 - onPressed: () {
18 - final sonner = ShadSonner.of(context);
19 - final id = Random().nextInt(1000);
20 - final now = DateTime.now();
21 - sonner.show(
22 - ShadToast(
23 - id: id,
24 - title: const Text('Event has been created'),
25 - description: Text(DateFormat.yMd().add_jms().format(now)),
26 - action: ShadButton(
27 - child: const Text('Undo'),
28 - onPressed: () => sonner.hide(id),
29 - ),
30 - ),
31 - );
32 - },
33 -)
34 -```
35 -
36 -Use a unique `id` per toast so you can hide it from the action button or elsewhere.
.claude/skills/shadcn_ui-switch/SKILL.md deleted
-36
@@ -1,36 +0,0 @@
1 ----
2 -name: shadcn_ui-switch
3 -description: Add toggle switches with ShadSwitch and ShadSwitchFormField; label, form validation. Use when adding on/off toggles or switch form fields in a Flutter shadcn_ui app or ShadForm.
4 ----
5 -
6 -# Shadcn UI — Switch
7 -
8 -## Instructions
9 -
10 -`ShadSwitch` is a control that toggles between checked and unchecked. Use `value` and `onChanged`; optional `label`. For forms use `ShadSwitchFormField` with `id`, `initialValue`, `inputLabel`, `inputSublabel`, `validator`.
11 -
12 -### Standalone
13 -
14 -```dart
15 -ShadSwitch(
16 - value: value,
17 - onChanged: (v) => setState(() => value = v),
18 - label: const Text('Airplane Mode'),
19 -)
20 -```
21 -
22 -### Form field
23 -
24 -```dart
25 -ShadSwitchFormField(
26 - id: 'terms',
27 - initialValue: false,
28 - inputLabel: const Text('I accept the terms and conditions'),
29 - onChanged: (v) {},
30 - inputSublabel: const Text('You agree to our Terms and Conditions'),
31 - validator: (v) {
32 - if (!v) return 'You must accept the terms and conditions';
33 - return null;
34 - },
35 -)
36 -```
.claude/skills/shadcn_ui-table/SKILL.md deleted
-69
@@ -1,69 +0,0 @@
1 ----
2 -name: shadcn_ui-table
3 -description: Build tables with ShadTable.list or ShadTable builder; ShadTableCell.header, ShadTableCell.footer, columnSpanExtent (FixedTableSpanExtent, RemainingTableSpanExtent). Use when displaying tabular data or responsive tables in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Table
7 -
8 -## Instructions
9 -
10 -`ShadTable` is a responsive table. Use `ShadTable.list` for small tables (all rows built at once): pass `header`, `footer` (lists of `ShadTableCell.header` / `ShadTableCell.footer`), and `children` (list of row lists of `ShadTableCell`). Use `ShadTable` with `columnCount`, `rowCount`, `header`, `builder`, `footer` for large tables (on-demand building). Use `columnSpanExtent` to set column widths: `FixedTableSpanExtent(130)` or `MaxTableSpanExtent(FixedTableSpanExtent(120), RemainingTableSpanExtent())`.
11 -
12 -### List (small tables)
13 -
14 -```dart
15 -ShadTable.list(
16 - header: const [
17 - ShadTableCell.header(child: Text('Invoice')),
18 - ShadTableCell.header(child: Text('Status')),
19 - ShadTableCell.header(child: Text('Method')),
20 - ShadTableCell.header(
21 - alignment: Alignment.centerRight,
22 - child: Text('Amount'),
23 - ),
24 - ],
25 - footer: const [
26 - ShadTableCell.footer(child: Text('Total')),
27 - ShadTableCell.footer(child: Text('')),
28 - ShadTableCell.footer(child: Text('')),
29 - ShadTableCell.footer(
30 - alignment: Alignment.centerRight,
31 - child: Text(r'$2500.00'),
32 - ),
33 - ],
34 - columnSpanExtent: (index) {
35 - if (index == 2) return const FixedTableSpanExtent(130);
36 - if (index == 3) {
37 - return const MaxTableSpanExtent(
38 - FixedTableSpanExtent(120),
39 - RemainingTableSpanExtent(),
40 - );
41 - }
42 - return null;
43 - },
44 - children: invoices.map(
45 - (invoice) => [
46 - ShadTableCell(
47 - child: Text(
48 - invoice.invoice,
49 - style: const TextStyle(fontWeight: FontWeight.w500),
50 - ),
51 - ),
52 - ShadTableCell(child: Text(invoice.paymentStatus)),
53 - ShadTableCell(child: Text(invoice.paymentMethod)),
54 - ShadTableCell(
55 - alignment: Alignment.centerRight,
56 - child: Text(invoice.totalAmount),
57 - ),
58 - ],
59 - ),
60 -)
61 -```
62 -
63 -### Builder (large tables)
64 -
65 -Use `ShadTable(columnCount:, rowCount:, header: (context, column) => ..., columnSpanExtent: (index) => ..., builder: (context, index) => ShadTableCell(...), footer: (context, column) => ...)`. The builder receives a table index with `row` and `column`. Prefer builder for large data so only visible rows are built.
66 -
67 -## Additional resources
68 -
69 -Detailed column span and builder patterns: [reference.md](reference.md).
.claude/skills/shadcn_ui-table/reference.md deleted
-19
@@ -1,19 +0,0 @@
1 -# Shadcn UI Table — Reference
2 -
3 -## columnSpanExtent
4 -
5 -Return `TableSpanExtent?` per column index:
6 -- `FixedTableSpanExtent(130)` — fixed width.
7 -- `MaxTableSpanExtent(FixedTableSpanExtent(120), RemainingTableSpanExtent())` — min 120, then remaining space.
8 -- `null` — default extent.
9 -
10 -## Builder API
11 -
12 -`ShadTable` with:
13 -- `columnCount`, `rowCount`
14 -- `header: (context, column) => ShadTableCell.header(...)`
15 -- `columnSpanExtent: (index) => ...`
16 -- `builder: (context, index) => ShadTableCell(...)` where `index` has `index.row`, `index.column`
17 -- `footer: (context, column) => ShadTableCell.footer(...)` or empty cell
18 -
19 -Use for large tables so widgets are created on demand.
.claude/skills/shadcn_ui-tabs/SKILL.md deleted
-63
@@ -1,63 +0,0 @@
1 ----
2 -name: shadcn_ui-tabs
3 -description: Build tabbed UIs with ShadTabs and ShadTab; value, tabs (content + child label), tabBarConstraints, contentConstraints. Use when adding tab panels or layered sections in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Tabs
7 -
8 -## Instructions
9 -
10 -`ShadTabs<T>` displays layered sections (tab panels) one at a time. Provide `value` (currently selected tab value), `tabs` (list of `ShadTab<T>`), and optional `tabBarConstraints` and `contentConstraints`. Each `ShadTab` has `value`, `child` (tab label), and `content` (panel widget).
11 -
12 -### Basic
13 -
14 -```dart
15 -ShadTabs<String>(
16 - value: 'account',
17 - tabBarConstraints: const BoxConstraints(maxWidth: 400),
18 - contentConstraints: const BoxConstraints(maxWidth: 400),
19 - tabs: [
20 - ShadTab(
21 - value: 'account',
22 - content: ShadCard(
23 - title: const Text('Account'),
24 - description: const Text(
25 - "Make changes to your account here. Click save when you're done."),
26 - footer: const ShadButton(child: Text('Save changes')),
27 - child: Column(
28 - mainAxisSize: MainAxisSize.min,
29 - children: [
30 - const SizedBox(height: 16),
31 - ShadInputFormField(label: const Text('Name'), initialValue: 'Ale'),
32 - const SizedBox(height: 8),
33 - ShadInputFormField(label: const Text('Username'), initialValue: 'nank1ro'),
34 - const SizedBox(height: 16),
35 - ],
36 - ),
37 - ),
38 - child: const Text('Account'),
39 - ),
40 - ShadTab(
41 - value: 'password',
42 - content: ShadCard(
43 - title: const Text('Password'),
44 - description: const Text(
45 - "Change your password here. After saving, you'll be logged out."),
46 - footer: const ShadButton(child: Text('Save password')),
47 - child: Column(
48 - children: [
49 - const SizedBox(height: 16),
50 - ShadInputFormField(label: const Text('Current password'), obscureText: true),
51 - const SizedBox(height: 8),
52 - ShadInputFormField(label: const Text('New password'), obscureText: true),
53 - const SizedBox(height: 16),
54 - ],
55 - ),
56 - ),
57 - child: const Text('Password'),
58 - ),
59 - ],
60 -)
61 -```
62 -
63 -Use state or a controller to change `value` when the user switches tabs if needed.
.claude/skills/shadcn_ui-textarea/SKILL.md deleted
-34
@@ -1,34 +0,0 @@
1 ----
2 -name: shadcn_ui-textarea
3 -description: Use ShadTextarea for multi-line text input; placeholder. ShadTextareaFormField for forms with validation. Use when adding multi-line text fields or bio/description inputs in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Textarea
7 -
8 -## Instructions
9 -
10 -`ShadTextarea` displays a multi-line form field or textarea-like component. Use `placeholder` and optional `initialValue`. For forms use `ShadTextareaFormField` with `id`, `label`, `placeholder`, `description`, and `validator`.
11 -
12 -### Standalone
13 -
14 -```dart
15 -const ShadTextarea(
16 - placeholder: Text('Type your message here'),
17 -)
18 -```
19 -
20 -### Form field
21 -
22 -```dart
23 -ShadTextareaFormField(
24 - id: 'bio',
25 - label: const Text('Bio'),
26 - placeholder: const Text('Tell us a little bit about yourself'),
27 - description: const Text(
28 - 'You can @mention other users and organizations.'),
29 - validator: (v) {
30 - if (v.length < 10) return 'Bio must be at least 10 characters.';
31 - return null;
32 - },
33 -)
34 -```
.claude/skills/shadcn_ui-theme/SKILL.md deleted
-89
@@ -1,89 +0,0 @@
1 ----
2 -name: shadcn_ui-theme
3 -description: Configure Shadcn UI theme and color schemes (ShadThemeData, ShadColorScheme), override colors, use ShadColorScheme.fromName for theme switchers, and add custom colors. Use when theming a Flutter shadcn_ui app, changing color scheme, or adding custom theme colors.
4 ----
5 -
6 -# Shadcn UI — Theme Data
7 -
8 -## Instructions
9 -
10 -Theme and color scheme are defined by `ShadThemeData` and `ShadColorScheme`. Supported scheme names: blue, gray, green, neutral, orange, red, rose, slate, stone, violet, yellow, zinc.
11 -
12 -### Basic usage
13 -
14 -```dart
15 -import 'package:shadcn_ui/shadcn_ui.dart';
16 -
17 -return ShadApp(
18 - darkTheme: ShadThemeData(
19 - brightness: Brightness.dark,
20 - colorScheme: const ShadSlateColorScheme.dark(),
21 - ),
22 - child: ...,
23 -);
24 -```
25 -
26 -### Override theme properties
27 -
28 -Override specific properties of the color scheme or component themes:
29 -
30 -```dart
31 -ShadApp(
32 - darkTheme: ShadThemeData(
33 - brightness: Brightness.dark,
34 - colorScheme: const ShadSlateColorScheme.dark(
35 - background: Colors.blue,
36 - ),
37 - primaryButtonTheme: const ShadButtonTheme(
38 - backgroundColor: Colors.cyan,
39 - ),
40 - ),
41 - ...
42 -);
43 -```
44 -
45 -For fully custom schemes, extend `ShadColorScheme` and pass all required properties.
46 -
47 -### Theme switcher with ShadColorScheme.fromName
48 -
49 -Use `ShadColorScheme.fromName` to let users change the color scheme:
50 -
51 -```dart
52 -final shadThemeColors = [
53 - 'blue', 'gray', 'green', 'neutral', 'orange', 'red', 'rose',
54 - 'slate', 'stone', 'violet', 'yellow', 'zinc',
55 -];
56 -
57 -final lightColorScheme = ShadColorScheme.fromName('blue');
58 -final darkColorScheme = ShadColorScheme.fromName('slate', brightness: Brightness.dark);
59 -```
60 -
61 -Use a `ShadSelect<String>` (or similar) with these names and rebuild the app with the chosen scheme via your state management.
62 -
63 -### Custom colors
64 -
65 -Add custom colors via the `custom` parameter on the color scheme:
66 -
67 -```dart
68 -return ShadApp(
69 - theme: ShadThemeData(
70 - colorScheme: const ShadZincColorScheme.light(
71 - custom: {
72 - 'myCustomColor': Color.fromARGB(255, 177, 4, 196),
73 - },
74 - ),
75 - ),
76 -);
77 -```
78 -
79 -Access: `ShadTheme.of(context).colorScheme.custom['myCustomColor']!`
80 -
81 -Or add an extension:
82 -
83 -```dart
84 -extension CustomColorExtension on ShadColorScheme {
85 - Color get myCustomColor => custom['myCustomColor']!;
86 -}
87 -```
88 -
89 -Then use: `ShadTheme.of(context).colorScheme.myCustomColor`
.claude/skills/shadcn_ui-time-picker/SKILL.md deleted
-43
@@ -1,43 +0,0 @@
1 ----
2 -name: shadcn_ui-time-picker
3 -description: Use ShadTimePicker and ShadTimePickerFormField for time selection; trailing widget, period variant. Use when adding time pickers or time form fields in a Flutter shadcn_ui app or ShadForm.
4 ----
5 -
6 -# Shadcn UI — Time Picker
7 -
8 -## Instructions
9 -
10 -`ShadTimePicker` is a time picker component. Optional `trailing` widget (e.g. icon). For forms use `ShadTimePickerFormField` with `label`, `description`, `onChanged`, and `validator`. Use `ShadTimePickerFormField.period` for AM/PM period selection.
11 -
12 -### Standalone
13 -
14 -```dart
15 -const ShadTimePicker(
16 - trailing: Padding(
17 - padding: EdgeInsets.only(left: 8, top: 14),
18 - child: Icon(LucideIcons.clock4),
19 - ),
20 -)
21 -```
22 -
23 -### Form field
24 -
25 -```dart
26 -ShadTimePickerFormField(
27 - label: const Text('Pick a time'),
28 - onChanged: print,
29 - description: const Text('The time of the day you want to pick'),
30 - validator: (v) => v == null ? 'A time is required' : null,
31 -)
32 -```
33 -
34 -### Period (AM/PM)
35 -
36 -```dart
37 -ShadTimePickerFormField.period(
38 - label: const Text('Pick a time'),
39 - onChanged: print,
40 - description: const Text('The time of the day you want to pick'),
41 - validator: (v) => v == null ? 'A time is required' : null,
42 -)
43 -```
.claude/skills/shadcn_ui-toast/SKILL.md deleted
-68
@@ -1,68 +0,0 @@
1 ----
2 -name: shadcn_ui-toast
3 -description: Show toasts with ShadToaster.of(context).show(ShadToast); title, description, action, ShadToast.destructive. Use when displaying temporary messages or feedback in a Flutter shadcn_ui app.
4 ----
5 -
6 -# Shadcn UI — Toast
7 -
8 -## Instructions
9 -
10 -Toasts are succinct temporary messages. Ensure a toaster is in the tree (e.g. `ShadToaster`). Get it with `ShadToaster.of(context)`. Call `toaster.show(ShadToast(...))` to show a toast; use `toaster.hide()` to dismiss (e.g. from an action button). Use `ShadToast` with optional `title`, `description`, and `action`. Use `ShadToast.destructive` for error-style toasts with a destructive action button (use `ShadDecoration` to style the action border).
11 -
12 -### Simple
13 -
14 -```dart
15 -ShadToaster.of(context).show(
16 - const ShadToast(
17 - description: Text('Your message has been sent.'),
18 - ),
19 -);
20 -```
21 -
22 -### With title
23 -
24 -```dart
25 -ShadToaster.of(context).show(
26 - const ShadToast(
27 - title: Text('Uh oh! Something went wrong'),
28 - description: Text('There was a problem with your request'),
29 - ),
30 -);
31 -```
32 -
33 -### With action
34 -
35 -```dart
36 -ShadToaster.of(context).show(
37 - ShadToast(
38 - title: const Text('Uh oh! Something went wrong'),
39 - description: const Text('There was a problem with your request'),
40 - action: ShadButton.outline(
41 - child: const Text('Try again'),
42 - onPressed: () => ShadToaster.of(context).hide(),
43 - ),
44 - ),
45 -);
46 -```
47 -
48 -### Destructive
49 -
50 -```dart
51 -final theme = ShadTheme.of(context);
52 -ShadToaster.of(context).show(
53 - ShadToast.destructive(
54 - title: const Text('Uh oh! Something went wrong'),
55 - description: const Text('There was a problem with your request'),
56 - action: ShadButton.destructive(
57 - child: const Text('Try again'),
58 - decoration: ShadDecoration(
59 - border: ShadBorder.all(
60 - color: theme.colorScheme.destructiveForeground,
61 - width: 1,
62 - ),
63 - ),
64 - onPressed: () => ShadToaster.of(context).hide(),
65 - ),
66 - ),
67 -);
68 -```
.claude/skills/shadcn_ui-tooltip/SKILL.md deleted
-33
@@ -1,33 +0,0 @@
1 ----
2 -name: shadcn_ui-tooltip
3 -description: Show tooltips on hover or focus with ShadTooltip; builder returns tooltip content, child is trigger. Use when adding hover/focus tooltips in a Flutter shadcn_ui app. Child must use ShadGestureDetector for hover (e.g. ShadButton).
4 ----
5 -
6 -# Shadcn UI — Tooltip
7 -
8 -## Instructions
9 -
10 -`ShadTooltip` shows a popup when the element receives keyboard focus or the mouse hovers over it. Use `builder: (context) => ...` to build the tooltip content (e.g. `Text('Add to library')`) and `child` for the trigger widget. Hover works only if the child uses a `ShadGestureDetector`; `ShadButton` and similar components implement it. For a plain widget (e.g. image), wrap the child with `ShadGestureDetector` so the tooltip shows on hover.
11 -
12 -### Basic
13 -
14 -```dart
15 -ShadTooltip(
16 - builder: (context) => const Text('Add to library'),
17 - child: ShadButton.outline(
18 - child: const Text('Hover/Focus'),
19 - onPressed: () {},
20 - ),
21 -)
22 -```
23 -
24 -For a non-interactive child (e.g. `Image`), wrap with `ShadGestureDetector`:
25 -
26 -```dart
27 -ShadTooltip(
28 - builder: (context) => const Text('Description'),
29 - child: ShadGestureDetector(
30 - child: Image.network('...'),
31 - ),
32 -)
33 -```
.claude/skills/shadcn_ui-typography/SKILL.md deleted
-110
@@ -1,110 +0,0 @@
1 ----
2 -name: shadcn_ui-typography
3 -description: Apply Shadcn UI text styles (h1, h2, p, lead, muted, etc.), set custom font family or Google Fonts, and extend ShadTextTheme with custom styles. Use when styling text, headings, or paragraphs in a Flutter shadcn_ui app or when changing the default font.
4 ----
5 -
6 -# Shadcn UI — Typography
7 -
8 -## Instructions
9 -
10 -Use `ShadTheme.of(context).textTheme` for consistent text styles. Default font family is Geist.
11 -
12 -### Text style names
13 -
14 -- **h1Large**, **h1**, **h2**, **h3**, **h4** — Headings
15 -- **p** — Body paragraph
16 -- **blockquote** — Quote style
17 -- **table** — Table header/cell text
18 -- **list** — List item text
19 -- **lead** — Lead/subtitle
20 -- **large** — Large body
21 -- **small** — Small/caption
22 -- **muted** — Muted/secondary text
23 -
24 -### Examples
25 -
26 -```dart
27 -Text(
28 - 'Taxing Laughter: The Joke Tax Chronicles',
29 - style: ShadTheme.of(context).textTheme.h1,
30 -)
31 -
32 -Text(
33 - 'The king, seeing how much happier his subjects were...',
34 - style: ShadTheme.of(context).textTheme.p,
35 -)
36 -
37 -Text(
38 - 'Email address',
39 - style: ShadTheme.of(context).textTheme.small,
40 -)
41 -
42 -Text(
43 - 'Enter your email address.',
44 - style: ShadTheme.of(context).textTheme.muted,
45 -)
46 -```
47 -
48 -### Custom font family
49 -
50 -1. Add font assets (e.g. under `/fonts`) and register in `pubspec.yaml`:
51 -
52 -```yaml
53 -flutter:
54 - fonts:
55 - - family: UbuntuMono
56 - fonts:
57 - - asset: fonts/UbuntuMono-Regular.ttf
58 - - asset: fonts/UbuntuMono-Italic.ttf
59 - style: italic
60 - - asset: fonts/UbuntuMono-Bold.ttf
61 - weight: 700
62 -```
63 -
64 -2. Set `ShadTextTheme` in `ShadThemeData`:
65 -
66 -```dart
67 -return ShadApp(
68 - theme: ShadThemeData(
69 - brightness: Brightness.light,
70 - colorScheme: const ShadZincColorScheme.light(),
71 - textTheme: ShadTextTheme(
72 - colorScheme: const ShadZincColorScheme.light(),
73 - family: 'UbuntuMono',
74 - ),
75 - ),
76 - ...
77 -);
78 -```
79 -
80 -### Google Fonts
81 -
82 -Install `google_fonts`, then:
83 -
84 -```dart
85 -theme: ShadThemeData(
86 - brightness: Brightness.light,
87 - colorScheme: const ShadZincColorScheme.light(),
88 - textTheme: ShadTextTheme.fromGoogleFont(GoogleFonts.poppins),
89 -),
90 -```
91 -
92 -### Custom text styles
93 -
94 -Extend `ShadTextTheme` with the `custom` parameter:
95 -
96 -```dart
97 -textTheme: ShadTextTheme(
98 - custom: {
99 - 'myCustomStyle': const TextStyle(
100 - fontSize: 16,
101 - fontWeight: FontWeight.w400,
102 - color: Colors.blue,
103 - ),
104 - },
105 -),
106 -```
107 -
108 -Access: `ShadTheme.of(context).textTheme.custom['myCustomStyle']!`
109 -
110 -Or define an extension on `ShadTextTheme` and use `ShadTheme.of(context).textTheme.myCustomStyle`.
.dart_skills/repos/flutter/skills deleted
-1
@@ -1 +0,0 @@
1 -Subproject commit 4ad7731305db281c946183d6a295647492e4fac5
.dart_skills/repos/serverpod/skills-registry deleted
-1
@@ -1 +0,0 @@
1 -Subproject commit 8e1512102719e84bdec752dfe3de4770792f3022
.dart_skills/skills_config.json deleted
-697
@@ -1,697 +0,0 @@
1 -{
2 - "version": 1,
3 - "installations": {
4 - "claude": {
5 - "flutter": {
6 - "skills": [
7 - {
8 - "name": "flutter-building-forms",
9 - "installedAt": "2026-03-29T05:28:58.701617Z"
10 - },
11 - {
12 - "name": "flutter-handling-http-and-json",
13 - "installedAt": "2026-03-29T05:28:58.702231Z"
14 - },
15 - {
16 - "name": "flutter-building-plugins",
17 - "installedAt": "2026-03-29T05:28:58.702678Z"
18 - },
19 - {
20 - "name": "flutter-caching-data",
21 - "installedAt": "2026-03-29T05:28:58.703264Z"
22 - },
23 - {
24 - "name": "flutter-embedding-native-views",
25 - "installedAt": "2026-03-29T05:28:58.703841Z"
26 - },
27 - {
28 - "name": "flutter-setting-up-on-macos",
29 - "installedAt": "2026-03-29T05:28:58.704213Z"
30 - },
31 - {
32 - "name": "flutter-adding-home-screen-widgets",
33 - "installedAt": "2026-03-29T05:28:58.704584Z"
34 - },
35 - {
36 - "name": "flutter-architecting-apps",
37 - "installedAt": "2026-03-29T05:28:58.704999Z"
38 - },
39 - {
40 - "name": "flutter-implementing-navigation-and-routing",
41 - "installedAt": "2026-03-29T05:28:58.706469Z"
42 - },
43 - {
44 - "name": "flutter-setting-up-on-windows",
45 - "installedAt": "2026-03-29T05:28:58.707721Z"
46 - },
47 - {
48 - "name": "flutter-improving-accessibility",
49 - "installedAt": "2026-03-29T05:28:58.708659Z"
50 - },
51 - {
52 - "name": "flutter-animating-apps",
53 - "installedAt": "2026-03-29T05:28:58.709903Z"
54 - },
55 - {
56 - "name": "flutter-working-with-databases",
57 - "installedAt": "2026-03-29T05:28:58.711178Z"
58 - },
59 - {
60 - "name": "flutter-setting-up-on-linux",
61 - "installedAt": "2026-03-29T05:28:58.712297Z"
62 - },
63 - {
64 - "name": "flutter-theming-apps",
65 - "installedAt": "2026-03-29T05:28:58.713440Z"
66 - },
67 - {
68 - "name": "flutter-building-layouts",
69 - "installedAt": "2026-03-29T05:28:58.714553Z"
70 - },
71 - {
72 - "name": "flutter-interoperating-with-native-apis",
73 - "installedAt": "2026-03-29T05:28:58.715438Z"
74 - },
75 - {
76 - "name": "flutter-managing-state",
77 - "installedAt": "2026-03-29T05:28:58.715888Z"
78 - },
79 - {
80 - "name": "flutter-testing-apps",
81 - "installedAt": "2026-03-29T05:28:58.716401Z"
82 - },
83 - {
84 - "name": "flutter-localizing-apps",
85 - "installedAt": "2026-03-29T05:28:58.716758Z"
86 - },
87 - {
88 - "name": "flutter-reducing-app-size",
89 - "installedAt": "2026-03-29T05:28:58.717169Z"
90 - },
91 - {
92 - "name": "flutter-handling-concurrency",
93 - "installedAt": "2026-03-29T05:28:58.717653Z"
94 - }
95 - ]
96 - },
97 - "riverpod": {
98 - "skills": [
99 - {
100 - "name": "riverpod-family",
101 - "installedAt": "2026-03-29T05:28:58.718652Z"
102 - },
103 - {
104 - "name": "riverpod-consumers",
105 - "installedAt": "2026-03-29T05:28:58.719010Z"
106 - },
107 - {
108 - "name": "riverpod-retry",
109 - "installedAt": "2026-03-29T05:28:58.719373Z"
110 - },
111 - {
112 - "name": "riverpod-eager-initialization",
113 - "installedAt": "2026-03-29T05:28:58.719722Z"
114 - },
115 - {
116 - "name": "riverpod-faq-and-practices",
117 - "installedAt": "2026-03-29T05:28:58.720083Z"
118 - },
119 - {
120 - "name": "riverpod-auto-dispose",
121 - "installedAt": "2026-03-29T05:28:58.720427Z"
122 - },
123 - {
124 - "name": "riverpod-cancel",
125 - "installedAt": "2026-03-29T05:28:58.720760Z"
126 - },
127 - {
128 - "name": "riverpod-codegen-and-hooks",
129 - "installedAt": "2026-03-29T05:28:58.721120Z"
130 - },
131 - {
132 - "name": "riverpod-containers",
133 - "installedAt": "2026-03-29T05:28:58.721509Z"
134 - },
135 - {
136 - "name": "riverpod-scoping",
137 - "installedAt": "2026-03-29T05:28:58.721885Z"
138 - },
139 - {
140 - "name": "riverpod-from-provider",
141 - "installedAt": "2026-03-29T05:28:58.722280Z"
142 - },
143 - {
144 - "name": "riverpod-pull-to-refresh",
145 - "installedAt": "2026-03-29T05:28:58.722678Z"
146 - },
147 - {
148 - "name": "riverpod-observers",
149 - "installedAt": "2026-03-29T05:28:58.723018Z"
150 - },
151 - {
152 - "name": "riverpod-migration",
153 - "installedAt": "2026-03-29T05:28:58.724396Z"
154 - },
155 - {
156 - "name": "riverpod-testing",
157 - "installedAt": "2026-03-29T05:28:58.724751Z"
158 - },
159 - {
160 - "name": "riverpod-getting-started",
161 - "installedAt": "2026-03-29T05:28:58.725094Z"
162 - },
163 - {
164 - "name": "riverpod-overrides",
165 - "installedAt": "2026-03-29T05:28:58.725413Z"
166 - },
167 - {
168 - "name": "riverpod-select",
169 - "installedAt": "2026-03-29T05:28:58.725736Z"
170 - },
171 - {
172 - "name": "riverpod-refs",
173 - "installedAt": "2026-03-29T05:28:58.726283Z"
174 - },
175 - {
176 - "name": "riverpod-3-0-migration",
177 - "installedAt": "2026-03-29T05:28:58.726669Z"
178 - },
179 - {
180 - "name": "riverpod-mutations",
181 - "installedAt": "2026-03-29T05:28:58.727075Z"
182 - },
183 - {
184 - "name": "riverpod-providers",
185 - "installedAt": "2026-03-29T05:28:58.727721Z"
186 - },
187 - {
188 - "name": "riverpod-offline",
189 - "installedAt": "2026-03-29T05:28:58.728038Z"
190 - }
191 - ]
192 - },
193 - "shadcn_ui": {
194 - "skills": [
195 - {
196 - "name": "shadcn_ui-time-picker",
197 - "installedAt": "2026-03-29T05:28:58.728692Z"
198 - },
199 - {
200 - "name": "shadcn_ui-avatar",
201 - "installedAt": "2026-03-29T05:28:58.729031Z"
202 - },
203 - {
204 - "name": "shadcn_ui-card",
205 - "installedAt": "2026-03-29T05:28:58.729357Z"
206 - },
207 - {
208 - "name": "shadcn_ui-sheet",
209 - "installedAt": "2026-03-29T05:28:58.729691Z"
210 - },
211 - {
212 - "name": "shadcn_ui-switch",
213 - "installedAt": "2026-03-29T05:28:58.730036Z"
214 - },
215 - {
216 - "name": "shadcn_ui-responsive",
217 - "installedAt": "2026-03-29T05:28:58.730387Z"
218 - },
219 - {
220 - "name": "shadcn_ui-sonner",
221 - "installedAt": "2026-03-29T05:28:58.730790Z"
222 - },
223 - {
224 - "name": "shadcn_ui-form",
225 - "installedAt": "2026-03-29T05:28:58.731321Z"
226 - },
227 - {
228 - "name": "shadcn_ui-dialog",
229 - "installedAt": "2026-03-29T05:28:58.731687Z"
230 - },
231 - {
232 - "name": "shadcn_ui-button",
233 - "installedAt": "2026-03-29T05:28:58.732024Z"
234 - },
235 - {
236 - "name": "shadcn_ui-separator",
237 - "installedAt": "2026-03-29T05:28:58.732377Z"
238 - },
239 - {
240 - "name": "shadcn_ui-accordion",
241 - "installedAt": "2026-03-29T05:28:58.732723Z"
242 - },
243 - {
244 - "name": "shadcn_ui-tabs",
245 - "installedAt": "2026-03-29T05:28:58.733073Z"
246 - },
247 - {
248 - "name": "shadcn_ui-badge",
249 - "installedAt": "2026-03-29T05:28:58.733417Z"
250 - },
251 - {
252 - "name": "shadcn_ui-tooltip",
253 - "installedAt": "2026-03-29T05:28:58.733774Z"
254 - },
255 - {
256 - "name": "shadcn_ui-decorator",
257 - "installedAt": "2026-03-29T05:28:58.734124Z"
258 - },
259 - {
260 - "name": "shadcn_ui-getting-started",
261 - "installedAt": "2026-03-29T05:28:58.734489Z"
262 - },
263 - {
264 - "name": "shadcn_ui-theme",
265 - "installedAt": "2026-03-29T05:28:58.734939Z"
266 - },
267 - {
268 - "name": "shadcn_ui-table",
269 - "installedAt": "2026-03-29T05:28:58.735508Z"
270 - },
271 - {
272 - "name": "shadcn_ui-input-otp",
273 - "installedAt": "2026-03-29T05:28:58.735866Z"
274 - },
275 - {
276 - "name": "shadcn_ui-select",
277 - "installedAt": "2026-03-29T05:28:58.736379Z"
278 - },
279 - {
280 - "name": "shadcn_ui-menubar",
281 - "installedAt": "2026-03-29T05:28:58.736783Z"
282 - },
283 - {
284 - "name": "shadcn_ui-textarea",
285 - "installedAt": "2026-03-29T05:28:58.737145Z"
286 - },
287 - {
288 - "name": "shadcn_ui-input",
289 - "installedAt": "2026-03-29T05:28:58.737508Z"
290 - },
291 - {
292 - "name": "shadcn_ui-alert",
293 - "installedAt": "2026-03-29T05:28:58.737922Z"
294 - },
295 - {
296 - "name": "shadcn_ui-toast",
297 - "installedAt": "2026-03-29T05:28:58.738268Z"
298 - },
299 - {
300 - "name": "shadcn_ui-checkbox",
301 - "installedAt": "2026-03-29T05:28:58.738628Z"
302 - },
303 - {
304 - "name": "shadcn_ui-typography",
305 - "installedAt": "2026-03-29T05:28:58.738989Z"
306 - },
307 - {
308 - "name": "shadcn_ui-date-picker",
309 - "installedAt": "2026-03-29T05:28:58.739350Z"
310 - },
311 - {
312 - "name": "shadcn_ui-context-menu",
313 - "installedAt": "2026-03-29T05:28:58.739734Z"
314 - },
315 - {
316 - "name": "shadcn_ui-resizable",
317 - "installedAt": "2026-03-29T05:28:58.740091Z"
318 - },
319 - {
320 - "name": "shadcn_ui-slider",
321 - "installedAt": "2026-03-29T05:28:58.740478Z"
322 - },
323 - {
324 - "name": "shadcn_ui-progress",
325 - "installedAt": "2026-03-29T05:28:58.741149Z"
326 - },
327 - {
328 - "name": "shadcn_ui-calendar",
329 - "installedAt": "2026-03-29T05:28:58.741576Z"
330 - },
331 - {
332 - "name": "shadcn_ui-popover",
333 - "installedAt": "2026-03-29T05:28:58.742136Z"
334 - },
335 - {
336 - "name": "shadcn_ui-icon-button",
337 - "installedAt": "2026-03-29T05:28:58.742520Z"
338 - },
339 - {
340 - "name": "shadcn_ui-radio-group",
341 - "installedAt": "2026-03-29T05:28:58.742942Z"
342 - },
343 - {
344 - "name": "shadcn_ui-breadcrumb",
345 - "installedAt": "2026-03-29T05:28:58.743362Z"
346 - }
347 - ]
348 - }
349 - },
350 - "generic": {
351 - "flutter": {
352 - "skills": [
353 - {
354 - "name": "flutter-building-forms",
355 - "installedAt": "2026-03-29T06:04:47.235901Z"
356 - },
357 - {
358 - "name": "flutter-handling-http-and-json",
359 - "installedAt": "2026-03-29T06:04:47.236554Z"
360 - },
361 - {
362 - "name": "flutter-building-plugins",
363 - "installedAt": "2026-03-29T06:04:47.237052Z"
364 - },
365 - {
366 - "name": "flutter-caching-data",
367 - "installedAt": "2026-03-29T06:04:47.237472Z"
368 - },
369 - {
370 - "name": "flutter-embedding-native-views",
371 - "installedAt": "2026-03-29T06:04:47.237867Z"
372 - },
373 - {
374 - "name": "flutter-setting-up-on-macos",
375 - "installedAt": "2026-03-29T06:04:47.238342Z"
376 - },
377 - {
378 - "name": "flutter-adding-home-screen-widgets",
379 - "installedAt": "2026-03-29T06:04:47.238714Z"
380 - },
381 - {
382 - "name": "flutter-architecting-apps",
383 - "installedAt": "2026-03-29T06:04:47.239337Z"
384 - },
385 - {
386 - "name": "flutter-implementing-navigation-and-routing",
387 - "installedAt": "2026-03-29T06:04:47.239726Z"
388 - },
389 - {
390 - "name": "flutter-setting-up-on-windows",
391 - "installedAt": "2026-03-29T06:04:47.240144Z"
392 - },
393 - {
394 - "name": "flutter-improving-accessibility",
395 - "installedAt": "2026-03-29T06:04:47.240488Z"
396 - },
397 - {
398 - "name": "flutter-animating-apps",
399 - "installedAt": "2026-03-29T06:04:47.240831Z"
400 - },
401 - {
402 - "name": "flutter-working-with-databases",
403 - "installedAt": "2026-03-29T06:04:47.241200Z"
404 - },
405 - {
406 - "name": "flutter-setting-up-on-linux",
407 - "installedAt": "2026-03-29T06:04:47.241609Z"
408 - },
409 - {
410 - "name": "flutter-theming-apps",
411 - "installedAt": "2026-03-29T06:04:47.241946Z"
412 - },
413 - {
414 - "name": "flutter-building-layouts",
415 - "installedAt": "2026-03-29T06:04:47.242367Z"
416 - },
417 - {
418 - "name": "flutter-interoperating-with-native-apis",
419 - "installedAt": "2026-03-29T06:04:47.242710Z"
420 - },
421 - {
422 - "name": "flutter-managing-state",
423 - "installedAt": "2026-03-29T06:04:47.243044Z"
424 - },
425 - {
426 - "name": "flutter-testing-apps",
427 - "installedAt": "2026-03-29T06:04:47.243485Z"
428 - },
429 - {
430 - "name": "flutter-localizing-apps",
431 - "installedAt": "2026-03-29T06:04:47.243829Z"
432 - },
433 - {
434 - "name": "flutter-reducing-app-size",
435 - "installedAt": "2026-03-29T06:04:47.244160Z"
436 - },
437 - {
438 - "name": "flutter-handling-concurrency",
439 - "installedAt": "2026-03-29T06:04:47.244573Z"
440 - }
441 - ]
442 - },
443 - "riverpod": {
444 - "skills": [
445 - {
446 - "name": "riverpod-family",
447 - "installedAt": "2026-03-29T06:04:47.245172Z"
448 - },
449 - {
450 - "name": "riverpod-consumers",
451 - "installedAt": "2026-03-29T06:04:47.245541Z"
452 - },
453 - {
454 - "name": "riverpod-retry",
455 - "installedAt": "2026-03-29T06:04:47.245868Z"
456 - },
457 - {
458 - "name": "riverpod-eager-initialization",
459 - "installedAt": "2026-03-29T06:04:47.246199Z"
460 - },
461 - {
462 - "name": "riverpod-faq-and-practices",
463 - "installedAt": "2026-03-29T06:04:47.246568Z"
464 - },
465 - {
466 - "name": "riverpod-auto-dispose",
467 - "installedAt": "2026-03-29T06:04:47.246945Z"
468 - },
469 - {
470 - "name": "riverpod-cancel",
471 - "installedAt": "2026-03-29T06:04:47.247275Z"
472 - },
473 - {
474 - "name": "riverpod-codegen-and-hooks",
475 - "installedAt": "2026-03-29T06:04:47.247637Z"
476 - },
477 - {
478 - "name": "riverpod-containers",
479 - "installedAt": "2026-03-29T06:04:47.248017Z"
480 - },
481 - {
482 - "name": "riverpod-scoping",
483 - "installedAt": "2026-03-29T06:04:47.248350Z"
484 - },
485 - {
486 - "name": "riverpod-from-provider",
487 - "installedAt": "2026-03-29T06:04:47.248713Z"
488 - },
489 - {
490 - "name": "riverpod-pull-to-refresh",
491 - "installedAt": "2026-03-29T06:04:47.249063Z"
492 - },
493 - {
494 - "name": "riverpod-observers",
495 - "installedAt": "2026-03-29T06:04:47.249452Z"
496 - },
497 - {
498 - "name": "riverpod-migration",
499 - "installedAt": "2026-03-29T06:04:47.251226Z"
500 - },
501 - {
502 - "name": "riverpod-testing",
503 - "installedAt": "2026-03-29T06:04:47.252488Z"
504 - },
505 - {
506 - "name": "riverpod-getting-started",
507 - "installedAt": "2026-03-29T06:04:47.253108Z"
508 - },
509 - {
510 - "name": "riverpod-overrides",
511 - "installedAt": "2026-03-29T06:04:47.253586Z"
512 - },
513 - {
514 - "name": "riverpod-select",
515 - "installedAt": "2026-03-29T06:04:47.253954Z"
516 - },
517 - {
518 - "name": "riverpod-refs",
519 - "installedAt": "2026-03-29T06:04:47.254527Z"
520 - },
521 - {
522 - "name": "riverpod-3-0-migration",
523 - "installedAt": "2026-03-29T06:04:47.254877Z"
524 - },
525 - {
526 - "name": "riverpod-mutations",
527 - "installedAt": "2026-03-29T06:04:47.255199Z"
528 - },
529 - {
530 - "name": "riverpod-providers",
531 - "installedAt": "2026-03-29T06:04:47.255780Z"
532 - },
533 - {
534 - "name": "riverpod-offline",
535 - "installedAt": "2026-03-29T06:04:47.256111Z"
536 - }
537 - ]
538 - },
539 - "shadcn_ui": {
540 - "skills": [
541 - {
542 - "name": "shadcn_ui-time-picker",
543 - "installedAt": "2026-03-29T06:04:47.256499Z"
544 - },
545 - {
546 - "name": "shadcn_ui-avatar",
547 - "installedAt": "2026-03-29T06:04:47.256838Z"
548 - },
549 - {
550 - "name": "shadcn_ui-card",
551 - "installedAt": "2026-03-29T06:04:47.257177Z"
552 - },
553 - {
554 - "name": "shadcn_ui-sheet",
555 - "installedAt": "2026-03-29T06:04:47.257530Z"
556 - },
557 - {
558 - "name": "shadcn_ui-switch",
559 - "installedAt": "2026-03-29T06:04:47.257888Z"
560 - },
561 - {
562 - "name": "shadcn_ui-responsive",
563 - "installedAt": "2026-03-29T06:04:47.258220Z"
564 - },
565 - {
566 - "name": "shadcn_ui-sonner",
567 - "installedAt": "2026-03-29T06:04:47.258586Z"
568 - },
569 - {
570 - "name": "shadcn_ui-form",
571 - "installedAt": "2026-03-29T06:04:47.259148Z"
572 - },
573 - {
574 - "name": "shadcn_ui-dialog",
575 - "installedAt": "2026-03-29T06:04:47.259489Z"
576 - },
577 - {
578 - "name": "shadcn_ui-button",
579 - "installedAt": "2026-03-29T06:04:47.259871Z"
580 - },
581 - {
582 - "name": "shadcn_ui-separator",
583 - "installedAt": "2026-03-29T06:04:47.260191Z"
584 - },
585 - {
586 - "name": "shadcn_ui-accordion",
587 - "installedAt": "2026-03-29T06:04:47.260538Z"
588 - },
589 - {
590 - "name": "shadcn_ui-tabs",
591 - "installedAt": "2026-03-29T06:04:47.260894Z"
592 - },
593 - {
594 - "name": "shadcn_ui-badge",
595 - "installedAt": "2026-03-29T06:04:47.261216Z"
596 - },
597 - {
598 - "name": "shadcn_ui-tooltip",
599 - "installedAt": "2026-03-29T06:04:47.261548Z"
600 - },
601 - {
602 - "name": "shadcn_ui-decorator",
603 - "installedAt": "2026-03-29T06:04:47.261886Z"
604 - },
605 - {
606 - "name": "shadcn_ui-getting-started",
607 - "installedAt": "2026-03-29T06:04:47.262220Z"
608 - },
609 - {
610 - "name": "shadcn_ui-theme",
611 - "installedAt": "2026-03-29T06:04:47.262565Z"
612 - },
613 - {
614 - "name": "shadcn_ui-table",
615 - "installedAt": "2026-03-29T06:04:47.263455Z"
616 - },
617 - {
618 - "name": "shadcn_ui-input-otp",
619 - "installedAt": "2026-03-29T06:04:47.263818Z"
620 - },
621 - {
622 - "name": "shadcn_ui-select",
623 - "installedAt": "2026-03-29T06:04:47.264348Z"
624 - },
625 - {
626 - "name": "shadcn_ui-menubar",
627 - "installedAt": "2026-03-29T06:04:47.264690Z"
628 - },
629 - {
630 - "name": "shadcn_ui-textarea",
631 - "installedAt": "2026-03-29T06:04:47.265062Z"
632 - },
633 - {
634 - "name": "shadcn_ui-input",
635 - "installedAt": "2026-03-29T06:04:47.265396Z"
636 - },
637 - {
638 - "name": "shadcn_ui-alert",
639 - "installedAt": "2026-03-29T06:04:47.265721Z"
640 - },
641 - {
642 - "name": "shadcn_ui-toast",
643 - "installedAt": "2026-03-29T06:04:47.266086Z"
644 - },
645 - {
646 - "name": "shadcn_ui-checkbox",
647 - "installedAt": "2026-03-29T06:04:47.266408Z"
648 - },
649 - {
650 - "name": "shadcn_ui-typography",
651 - "installedAt": "2026-03-29T06:04:47.266751Z"
652 - },
653 - {
654 - "name": "shadcn_ui-date-picker",
655 - "installedAt": "2026-03-29T06:04:47.267115Z"
656 - },
657 - {
658 - "name": "shadcn_ui-context-menu",
659 - "installedAt": "2026-03-29T06:04:47.267520Z"
660 - },
661 - {
662 - "name": "shadcn_ui-resizable",
663 - "installedAt": "2026-03-29T06:04:47.267853Z"
664 - },
665 - {
666 - "name": "shadcn_ui-slider",
667 - "installedAt": "2026-03-29T06:04:47.268231Z"
668 - },
669 - {
670 - "name": "shadcn_ui-progress",
671 - "installedAt": "2026-03-29T06:04:47.268608Z"
672 - },
673 - {
674 - "name": "shadcn_ui-calendar",
675 - "installedAt": "2026-03-29T06:04:47.268954Z"
676 - },
677 - {
678 - "name": "shadcn_ui-popover",
679 - "installedAt": "2026-03-29T06:04:47.269296Z"
680 - },
681 - {
682 - "name": "shadcn_ui-icon-button",
683 - "installedAt": "2026-03-29T06:04:47.269636Z"
684 - },
685 - {
686 - "name": "shadcn_ui-radio-group",
687 - "installedAt": "2026-03-29T06:04:47.269968Z"
688 - },
689 - {
690 - "name": "shadcn_ui-breadcrumb",
691 - "installedAt": "2026-03-29T06:04:47.270322Z"
692 - }
693 - ]
694 - }
695 - }
696 - }
697 -}