Agent skill

Unyo UI Presentation

by K3vinb5 in K3vinb5/unyo-app

How to build screens, widgets, and handle effects in the Unyo Flutter app's presentation layer.

BSD-3-ClauseAuto-check passedDevelopment

Install Unyo UI Presentation

skills CLI
$ npx skills add K3vinb5/unyo-app --skill unyo-ui-presentation -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install K3vinb5/unyo-app unyo-ui-presentation --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/K3vinb5/unyo-app.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/unyo-ui-presentation .claude/skills/unyo-ui-presentation && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
unyo-ui-presentation
GitHub stars
662
Token cost
~3k tokens
SKILL.md length
840 words
Files
1
Skills in repo
7
Repo updated
First seen
Licence
BSD-3-Clause

At a glance

How to build screens, widgets, and handle effects in the Unyo Flutter app's presentation layer.

  • Works in 5 steps: Create the screen file at… → Add the route in… → Register the cubit in… → …
  • Creating new screens
  • SKILL.md covers Architecture Overview, The Three-Layer Screen Pattern, Effect Handling in Detail and AppEffectHandler Details, plus 7 more sections
  • Calls flutter

What it does

Unyo UI Presentation is an agent skill from K3vinb5/unyo-app. How to build screens, widgets, and handle effects in the Unyo Flutter app's presentation layer. Use this skill whenever creating new screens, adding BlocProvider/BlocListener/BlocBuilder patterns, building custom styled widgets, handling side effects from cubits in the UI, creating dialogs or drawers, or organizing UI code. Also use when understanding the screen widget structure pattern or troubleshooting UI rendering issues.

Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development. It works with Flutter. The repository describes itself as: 🐙 Anime streaming and Manga reader desktop app without ads. The licence is BSD-3-Clause.

When your agent uses it

  • Creating new screens
  • Adding BlocProvider/BlocListener/BlocBuilder patterns
  • Building custom styled widgets
  • Handling side effects from cubits in the UI

Example prompts

  • “/unyo-ui-presentation”

Workflow steps

5 steps, taken from the first numbered list in SKILL.md.

  1. Create the screen file at lib/presentation/screens/_screen.dart
  2. Add the route in lib/core/router/app_router.dart — see unyo-routing-navigation skill
  3. Register the cubit in lib/core/di/locator.dart — see unyo-dependency-injection skill
  4. Run code generation
  5. Import the cubit and state in the screen file

What it can do on your machine

Read from SKILL.md and the folder at commit 0a44722. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • flutter

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Unyo UI Presentation loads about 3k tokens when it runs. Until then it costs about 113 tokens; SKILL.md has 840 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~113
When it runs · the whole SKILL.md, loaded when a task matches
~3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from K3vinb5/unyo-app at commit 0a44722, republished under its BSD-3-Clause licence (© K3vinb5). 840 words, ~2,970 tokens.

Download SKILL.mdSave it as .claude/skills/unyo-ui-presentation/SKILL.md (or your agent's skills folder).
name
unyo-ui-presentation
description
How to build screens, widgets, and handle effects in the Unyo Flutter app's presentation layer. Use this skill whenever creating new screens, adding BlocProvider/BlocListener/BlocBuilder patterns, building custom styled widgets, handling side effects from cubits in the UI, creating dialogs or drawers, or organizing UI code. Also use when understanding the screen widget structure pattern or troubleshooting UI rendering issues.

Unyo UI & Presentation Layer

The presentation layer in Unyo follows a consistent pattern: each screen is a three-layer widget tree that separates concerns of creation, effect handling, and UI building. This skill covers the structure, conventions, and patterns for building UI in Unyo.

Architecture Overview

lib/presentation/
├── screens/           # Full-page route screens (@RoutePage annotated)
│   ├── home_screen.dart
│   ├── anime_screen.dart
│   ├── anime_details_screen.dart
│   ├── video_screen.dart
│   ├── settings_screen.dart
│   └── ...
├── widgets/
│   ├── styled/        # Reusable styled UI components
│   │   ├── unyo_menu_bar.dart
│   │   ├── media_card.dart
│   │   ├── unyo_textfield.dart
│   │   └── ...
│   └── text/          # Typography components
│       ├── text_display_small.dart
│       ├── text_body_medium.dart
│       └── ...
├── dialogs/           # Modal dialogs
│   ├── warning_dialog.dart
│   ├── textfield_dialog.dart
│   └── anime_details_media_entry_dialog.dart
├── drawers/           # Slide-in drawer dialogs
│   ├── user_options_drawer.dart
│   ├── anime_server_selection_drawer.dart
│   └── episode_list_drawer.dart
└── views/             # Loading/error state views
    └── loading_view.dart

The Three-Layer Screen Pattern

Every screen in Unyo follows the same three-widget structure:

Screen (outer) → Listener (middle) → View (inner)
Layer 1: Screen — Creates the BlocProvider
dart
@RoutePage()
class HomeScreen extends StatelessWidget {
  const HomeScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (context) => sl<HomeCubit>(),
      child: const _HomeListener(),
    );
  }
}

This is the entry point. It:

  • Has the @RoutePage() annotation for AutoRoute code generation
  • Creates a new cubit instance via sl<HomeCubit>() (factory, so each screen gets its own)
  • Is a StatelessWidget (never holds state)
  • Does nothing else — no logic, no UI rendering
Layer 2: Listener — Handles Effects
dart
class _HomeListener extends StatelessWidget {
  const _HomeListener();

  @override
  Widget build(BuildContext context) {
    return BlocListener<HomeCubit, HomeState>(
      listener: (context, state) {
        if (state.effects.isNotEmpty) {
          sl<AppEffectHandler>().handleEffects(
            context,
            state.effects,
            context.read<HomeCubit>().clearEffects,
          );
        }
      },
      child: BlocBuilder<HomeCubit, HomeState>(
        builder: (context, state) => state.isLoading
            ? const LoadingView()
            : const _HomeView(),
      ),
    );
  }
}

This layer:

  • Wraps content in BlocListener to process effects
  • The listener callback fires on every state change — when effects are present, it delegates to AppEffectHandler
  • After processing, it calls cubit.clearEffects() to remove the processed effects
  • Can conditionally render different views (e.g., LoadingView when isLoading)
  • Is typically a StatelessWidget unless it needs ScrollController lifecycle management
Layer 3: View — Renders the UI
dart
class _HomeView extends StatefulWidget {
  const _HomeView();

  @override
  State<_HomeView> createState() => _HomeViewState();
}

class _HomeViewState extends State<_HomeView> {
  final ScrollController continueWatchingController = ScrollController();
  final ScrollController continueReadingController = ScrollController();

  @override
  void dispose() {
    continueWatchingController.dispose();
    continueReadingController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return BlocBuilder<HomeCubit, HomeState>(
      builder: (context, state) {
        return Padding(
          padding: EdgeInsets.only(left: 15.0.w),
          child: SingleChildScrollView(
            child: Column(
              children: [
                // UI using state properties
                AnimeCardList(
                  listTitle: "Continue Watching",
                  animeList: state.continueWatching,
                  controller: continueWatchingController,
                  onPressed: context.read<HomeCubit>().navigateToAnimeDetails,
                ),
              ],
            ),
          ),
        );
      },
    );
  }
}

This layer:

  • Is where all the visual rendering happens
  • Uses BlocBuilder to rebuild when state changes
  • Can be StatefulWidget (if it needs controllers) or StatelessWidget
  • Accesses cubit methods via context.read<HomeCubit>()
  • Reads state properties directly (e.g., state.continueWatching, state.isLoading)

Effect Handling in Detail

The AppEffectHandler is a singleton that processes effects emitted by cubits:

dart
// In every screen's BlocListener
if (state.effects.isNotEmpty) {
  sl<AppEffectHandler>().handleEffects(
    context,                           // BuildContext for navigation/dialogs
    state.effects,                      // List of effects from state
    context.read<HomeCubit>().clearEffects,  // Callback to clear effects
  );
}

The handler processes each effect type:

Effect TypeAction
PushRouteEffectAutoRouter.of(context).pushPath(path)
ReplaceRouteEffectAutoRouter.of(context).replacePath(path)
NavigateRouteEffectAutoRouter.of(context).navigatePath(path)
ChangeTabRouteEffectAutoTabsRouter.of(context).setActiveIndex(index)
ShowSnackbarEffectMaterial banner with AwesomeSnackbarContent
ShowWidgetDialogEffectshowDialog(context: context, builder: ...)
ShowDrawerDialogEffectshowGeneralDialog with slide transition
CloseDialogEffectNavigator.pop(context)

Important: clearEffects() must always be called after processing. The handleEffects method calls it automatically as the third parameter.

AppEffectHandler Details

The AppEffectHandler also has an attachRootContext() method that's used in the tabs screen for tab switching:

dart
// In tabs_screen.dart
sl<AppEffectHandler>().attachRootContext(context);

This stores a reference to the root BuildContext for tab navigation, which operates outside the scope of an individual screen's BlocListener. Most effects don't need this — they use the context passed from the BlocListener.

Screen Types in Unyo

Tab screens (inside AutoTabsRouter)

These screens live inside AutoTabsRouter and have a sidebar menu:

dart
// Tab screens follow the standard 3-layer pattern
// They access TabsCubit for menu state and tab switching
Push screens (detail views)

These screens are pushed on top of the tab navigator:

  • AnimeDetails, MangaDetails, Video, Calendar, AdvancedSearch, MediaList
  • They use more elaborate transitions (scale+fade, slide+fade)
  • They receive data via notifiers (not route arguments)
Login screen

The login screen is special — it's the initial: true route and replaces itself with TabsRoute on success.

Widget Conventions

Styled widgets (widgets/styled/)

Reusable UI components follow a naming convention:

  • Unyo prefix for custom components: UnyoMenuBar, UnyoTextField, UnyoSlider
  • Domain-specific names: MediaCard, AnimeCardList, ImageCard
  • Each widget is in its own file
Typography (widgets/text/)

Text widgets are thin wrappers around Flutter's Text widget with consistent styling:

  • TextDisplaySmall, TextDisplayMedium, TextDisplayLarge
  • TextHeadlineSmall, TextHeadlineMedium, TextHeadlineLarge
  • TextTitleSmall, TextTitleMedium, TextTitleLarge
  • TextBodySmall, TextBodyMedium, TextBodyLarge
  • TextLabelSmall, TextLabelMedium, TextLabelLarge

These correspond to Material Design 3 type scale.

Responsive sizing

The app uses flutter_screenutil for responsive sizing:

  • .w for width-based sizing: SizedBox(width: 15.0.w)
  • .h for height-based sizing: SizedBox(height: 50.0.h)
  • .sp for font sizing: TextStyle(fontSize: 14.0.sp)
  • .r for border radius: BorderRadius.circular(8.0.r)

Design base size is 1280x720 (set in main.dart).

Show full SKILL.md (340 more words)Show less
Barrel exports

Styled widgets and text components export through barrel files:

  • lib/presentation/widgets/styled/styled.dart
  • lib/presentation/widgets/text/texts.dart

Dialogs

Dialogs are shown via the Effect system:

dart
// In a cubit
showWidgetDialogEffect(
  dialog: WarningDialog(
    title: "Delete?",
    message: "This action cannot be undone.",
    onConfirm: () => _deleteItem(),
  ),
);

Custom dialogs should be created in lib/presentation/dialogs/ and can accept callbacks for actions.

Drawers

Drawer dialogs slide in from a specified direction:

dart
// In a cubit
showDrawerDialogEffect(
  drawerDialog: AnimeServerSelectionDrawer(anime: anime),
  backgroundColor: Colors.black54,
  startPosition: AxisDirection.right,
);

Drawers are in lib/presentation/drawers/ and use showGeneralDialog with slide transitions.

Creating a New Screen: Complete Workflow

  1. Create the screen file at lib/presentation/screens/<feature>_screen.dart:

    • Follow the three-layer pattern (Screen → Listener → View)
    • Add @RoutePage() annotation to the outer widget
    • Use BlocProvider(create: (context) => sl<FeatureCubit>()) in the Screen layer
    • Handle effects in the Listener layer
    • Build UI in the View layer
  2. Add the route in lib/core/router/app_router.dart — see unyo-routing-navigation skill

  3. Register the cubit in lib/core/di/locator.dart — see unyo-dependency-injection skill

  4. Run code generation:

    sh
    flutter pub run build_runner build --delete-conflicting-outputs
  5. Import the cubit and state in the screen file

Common Pitfalls

  • Putting logic in the Screen layer: The Screen widget should only create the BlocProvider. No initState, no state holders, no business logic.
  • Forgetting BlocListener for effects: If you skip the Listener layer, effects from the cubit won't be processed. No navigation, no snackbars, no dialogs.
  • Not calling clearEffects: Always pass cubit.clearEffects as the third argument to handleEffects(). Without this, effects fire on every rebuild.
  • Using context.watch<>() instead of context.read<>(): In callbacks and event handlers, use read (no rebuild). In build methods, the BlocBuilder handles rebuilds.
  • Creating ScrollControllers in StatelessWidget: If a screen needs ScrollController or TextEditingController, the View must be a StatefulWidget with proper dispose() cleanup.
  • Importing cubit logic in View: The View should read state and call cubit methods. It should never contain business logic — delegate to the cubit.
  • Using BlocBuilder where BlocListener is needed: BlocBuilder is for UI that changes based on state. BlocListener is for one-time actions (effects, navigation). Use both when you need both — wrap BlocListener outside BlocBuilder.

Cross-references

  • Cubit and Effect pattern: See unyo-bloc-state-management skill for how cubits emit effects
  • Routing and navigation: See unyo-routing-navigation skill for route configuration
  • Notifier pattern for cross-screen data: See unyo-reactive-notifiers skill
  • DI for screen cubits: See unyo-dependency-injection skill

© K3vinb5, BSD-3-Clause. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/unyo-ui-presentation of K3vinb5/unyo-app.

Open the folder on GitHubat commit 0a44722

Compare with similar skills

Unyo UI Presentation next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Unyo UI Presentation compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Unyo UI Presentation this skillK3vinb5/unyo-app662—~3kAutomated safety check: PassBSD-3-Clause
Code Reviewflutter/flutter179k—~1.4kAutomated safety check: PassBSD-3-Clause
Senior Architect Toolkitmaslennikov-ig/claude-code-orchestrator-kit2608 repos~1.2kAutomated safety check: NotesCustom licence
Code Review Skillawesome-skills/code-review-skill2.1k—~2.8kAutomated safety check: NotesMIT
Adding Release Notesflutter/devtools1.7k—~1kAutomated safety check: PassBSD-3-Clause
Code Guidelinesgetsentry/sentry-dart873—~2.2kAutomated safety check: PassMIT

Similar skills

  • Code Review

    flutter/flutter

    Performs a comprehensive, multi-step code review of pull requests or local code changes, using iterative refinement (generation, critique, synthesis) to ensure high-quality, actionable feedback.

    179k GitHub stars~1.4k tokensUpdated today
    DevelopmentAuto-check passed
  • Senior Architect Toolkit

    maslennikov-ig/claude-code-orchestrator-kit

    Comprehensive software architecture skill for designing scalable, maintainable systems using ReactJS, NextJS, NodeJS, Express, React Native, Swift, Kotlin…

    260 GitHub starsUsed in 8 repos~1.2k tokens
    DevelopmentAuto-check: notes
  • Code Review Skill

    awesome-skills/code-review-skill

    Provides comprehensive code review guidance for React 19, Vue 3, Angular 17+, Svelte 5, Rust, TypeScript, Java, Java 8, PHP, Ruby, Rails, Python, Django, FastAPI, Go, C/.NET, Kotlin, Swift, Dart…

    2.1k GitHub stars~2.8k tokensUpdated 1 mo ago
    DevelopmentAuto-check: notes
  • Adding Release Notes

    flutter/devtools

    Adds user-facing change descriptions to DevTools release notes.

    1.7k GitHub stars~1k tokensUpdated 2 days ago
    DevelopmentAuto-check passed
  • Code Guidelines

    getsentry/sentry-dart

    Official

    Enforce Sentry Dart/Flutter SDK code guidelines for implementation, refactoring, and review.

    873 GitHub stars~2.2k tokensUpdated today
    DevelopmentAuto-check passed
  • Automate git worktree creation and copy private files (not tracked in git) to new workdirs.

    155 GitHub stars~930 tokensUpdated 3 mo ago
    DevelopmentAuto-check passed

More from K3vinb5/unyo-app

  • Generate Dart bean classes from JSON and regenerate serialization helpers using the fjson CLI.

    662 GitHub stars~2.2k tokensUpdated 3 mo ago
    Auto-check passed
  • How to create cubits, define states, use the EffectMixin pattern, and handle side effects in the Unyo Flutter app.

    662 GitHub stars~3.2k tokensUpdated 3 mo ago
    Auto-check passed
  • How to register and resolve dependencies using GetIt in the Unyo Flutter app.

    662 GitHub stars~2.4k tokensUpdated 3 mo ago
    Auto-check passed
  • Unyo Domain Data Layer

    K3vinb5/unyo-app

    How to create domain entities, data models, and repositories in the Unyo Flutter app.

    662 GitHub stars~2.9k tokensUpdated 3 mo ago
    Auto-check passed
  • Unyo Reactive Notifiers

    K3vinb5/unyo-app

    How to create and use RxDart BehaviorSubject notifiers for cross-cubit communication in the Unyo Flutter app.

    662 GitHub stars~2.8k tokensUpdated 3 mo ago
    Auto-check passed
  • Unyo Routing Navigation

    K3vinb5/unyo-app

    How to add routes, configure navigation, and use AutoRoute in the Unyo Flutter app.

    662 GitHub stars~2.5k tokensUpdated 3 mo ago
    Auto-check passed

Works with

Categories

Questions about Unyo UI Presentation

What does Unyo UI Presentation do?

How to build screens, widgets, and handle effects in the Unyo Flutter app's presentation layer. Unyo UI Presentation is an agent skill from K3vinb5/unyo-app. How to build screens, widgets, and handle effects in the Unyo Flutter app's presentation layer.

When should I use Unyo UI Presentation?

Unyo UI Presentation fits situations like: creating new screens; adding BlocProvider/BlocListener/BlocBuilder patterns; building custom styled widgets; handling side effects from cubits in the UI.

How do I install Unyo UI Presentation in Claude Code?

Run `npx skills add K3vinb5/unyo-app --skill unyo-ui-presentation -a claude-code`. Or copy the skill folder (.agents/skills/unyo-ui-presentation in K3vinb5/unyo-app) into .claude/skills/unyo-ui-presentation in your project. Claude Code loads it when a task matches its description.

How do I install Unyo UI Presentation in Codex?

Run `npx skills add K3vinb5/unyo-app --skill unyo-ui-presentation -a codex`. Or copy the skill folder (.agents/skills/unyo-ui-presentation in K3vinb5/unyo-app) into .agents/skills/unyo-ui-presentation in your project. Codex loads it when a task matches its description.

Can I use Unyo UI Presentation in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add K3vinb5/unyo-app --skill unyo-ui-presentation -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/unyo-ui-presentation, .gemini/skills/unyo-ui-presentation, .github/skills/unyo-ui-presentation and .opencode/skills/unyo-ui-presentation in your project.

What does Unyo UI Presentation need to run?

Going by SKILL.md and its folder, Unyo UI Presentation needs the command-line tools its instructions call (flutter).

Does Unyo UI Presentation access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Unyo UI Presentation safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Unyo UI Presentation use?

Unyo UI Presentation is published under the BSD-3-Clause licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Unyo UI Presentation use?

About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Unyo UI Presentation?

Skills that share tags, products or a category with Unyo UI Presentation: Code Review (flutter/flutter, 179k stars), Senior Architect Toolkit (maslennikov-ig/claude-code-orchestrator-kit, 260 stars), Code Review Skill (awesome-skills/code-review-skill, 2.1k stars) and Adding Release Notes (flutter/devtools, 1.7k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Unyo UI Presentation?

K3vinb5 (a GitHub user) maintains it in K3vinb5/unyo-app, which has 662 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on June 12, 2026.

Source: K3vinb5/unyo-app on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.