Agent skill

Maquina UI Standards

by maquina-app in maquina-app/maquina_components

Build consistent, accessible UIs in Rails using maquinacomponents.

MITAuto-check passedBackend & APIs

Install Maquina UI Standards

skills CLI
$ npx skills add maquina-app/maquina_components --skill maquina-ui-standards -a claude-code

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

GitHub CLI
$ gh skill install maquina-app/maquina_components maquina-ui-standards --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/maquina-app/maquina_components.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skill .claude/skills/maquina-ui-standards && 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
maquina-ui-standards
GitHub stars
141
Token cost
~3.5k tokens
SKILL.md length
633 words
Files
8 (incl. references)
Skills in repo
1
Repo updated
First seen
Licence
MIT

At a glance

Build consistent, accessible UIs in Rails using maquinacomponents.

  • Works in 11 steps: Composition Over Configuration → Inline Errors Over Error Lists → Robust Input Attributes → …
  • Implementing UI for features
  • SKILL.md covers When to Use This Skill, Quick Reference, File References and Core Principles, plus 4 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Maquina UI Standards is an agent skill from maquina-app/maquina_components. Build consistent, accessible UIs in Rails using maquinacomponents. Use this skill when implementing UI for features, creating views, building forms, or reviewing UI specs. Triggers on view creation, UI implementation, form building, layout design, or mentions of maquinacomponents usage.

Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including reference files (for example `QUICKSTART.md`, `README.md` and `references/component-catalog.md`).

It sits in Backend & APIs, covering Backend development. It works with shadcn/ui. The repository describes itself as: Modern UI components for Ruby on Rails, powered by TailwindCSS and Stimulus. The licence is MIT.

When your agent uses it

  • Implementing UI for features
  • Reviewing UI specs
  • UI implementation
  • Mentions of maquinacomponents usage

Example prompts

  • “/maquina-ui-standards”

Workflow steps

11 steps, taken from the step headings in SKILL.md.

  1. Composition Over Configuration
  2. Inline Errors Over Error Lists
  3. Robust Input Attributes
  4. Data Attributes for Styling
  5. Form Components via Rails Helpers
  6. Icons via Helper
  7. Theme Variables
  8. Identify Components Needed
  9. Plan Layout Structure
  10. Build with Components
  11. Verify Against Checklist

What it can do on your machine

Read from SKILL.md and the folder at commit 8a88019. 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

    No scripts in the folder and no shell commands in SKILL.md (its code samples are erb and css).

    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

Maquina UI Standards loads about 3.5k tokens when it runs, and up to ~31k if it reads all its reference files. Until then it costs about 78 tokens; SKILL.md has 633 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~78
When it runs · the whole SKILL.md, loaded when a task matches
~3.5k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~31k

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 maquina-app/maquina_components at commit 8a88019, republished under its MIT licence (© maquina-app). 633 words, ~3,536 tokens.

Download SKILL.mdSave it as .claude/skills/maquina-ui-standards/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.
name
maquina-ui-standards
description
Build consistent, accessible UIs in Rails using maquina_components. Use this skill when implementing UI for features, creating views, building forms, or reviewing UI specs. Triggers on view creation, UI implementation, form building, layout design, or mentions of maquina_components usage.

Maquina UI Standards

Build production-quality Rails UIs with maquina_components — ERB partials styled with Tailwind CSS 4 and data attributes, inspired by shadcn/ui.

When to Use This Skill

  • Implementing UI for a feature spec
  • Creating new views or pages
  • Building forms with validation
  • Designing page layouts
  • Reviewing UI implementation for consistency

Quick Reference

Component Rendering
erb
<%# Partial components %>
<%= render "components/card" do %>
  <%= render "components/card/header" do %>
    <%= render "components/card/title", text: "Title" %>
  <% end %>
<% end %>

<%# Data-attribute components (forms) %>
<%= f.text_field :email, data: { component: "input" } %>
<%= f.submit "Save", data: { component: "button", variant: "primary" } %>
Decision Framework
NeedComponentWhy
Container with header/content/footerCardStructured content grouping
Important message to userAlertDraws attention, semantic variants
Status indicatorBadgeCompact, inline status
Data displayTableStructured rows/columns
No data stateEmptyConsistent empty patterns
User actions menuDropdown MenuAccessible, keyboard-navigable
Selection from optionsToggle GroupVisual, single/multi select
Selection from many optionsComboboxSearchable, filterable
Date selection (inline)CalendarAlways-visible date picker
Date selection (popover)Date PickerCompact form date input
Page locationBreadcrumbsNavigation context
Large result setsPaginationPagy integration
App navigationSidebarCollapsible, persistent state
Temporary notificationsToastNon-intrusive feedback
Form inputsForm componentsConsistent styling via data attrs

File References

FileContent
component-catalog.mdAll components with props, variants, examples
layout-patterns.mdPage structure, grids, responsive design
form-patterns.mdForms, validation, field groups
turbo-integration.mdFrames, Streams, Morph with components
spec-checklist.mdUI implementation checklist for specs

Core Principles

1. Composition Over Configuration

Components are small, composable building blocks. You have full flexibility in how you use them:

Option A: Use partials as-is — Render maquina_components partials directly for standard patterns.

Option B: Compress complexity — Wrap multiple partials into your own application-specific components that encode your conventions.

Option C: Copy and adapt — Copy component partials into your app and customize for specific needs.

erb
<%# Option A: Direct partial usage %>
<%= render "components/card" do %>
  <%= render "components/card/header" do %>
    <%= render "components/card/title", text: @resource.name %>
  <% end %>
<% end %>

<%# Option B: Application-specific wrapper %>
<%# app/views/components/_resource_card.html.erb %>
<%= render "components/card" do %>
  <%= render "components/card/header", layout: :row do %>
    <div>
      <%= render "components/card/title", text: resource.name %>
      <%= render "components/card/description", text: resource.summary %>
    </div>
    <%= render "components/card/action" do %>
      <%= yield :actions if content_for?(:actions) %>
    <% end %>
  <% end %>
  <%= render "components/card/content" do %>
    <%= yield %>
  <% end %>
<% end %>

<%# Usage: <%= render "components/resource_card", resource: @user do %>...content...<% end %>

<%# Option C: Copied and customized for booking-specific needs %>
<%# app/views/bookings/_booking_card.html.erb - your own component %>

Choose the approach that best fits your use case. The goal is consistency within your application, not rigid adherence to a single pattern.

erb
<%# ✅ GOOD: Compose from parts %>
<%= render "components/card" do %>
  <%= render "components/card/header", layout: :row do %>
    <div>
      <%= render "components/card/title", text: @resource.name %>
      <%= render "components/card/description", text: @resource.summary %>
    </div>
    <%= render "components/card/action" do %>
      <%= link_to "Edit", edit_path, data: { component: "button", variant: "outline", size: "sm" } %>
    <% end %>
  <% end %>
  <%= render "components/card/content" do %>
    <!-- Content -->
  <% end %>
<% end %>

<%# ❌ BAD: Trying to configure everything via props %>
<%= render "components/card", 
    title: @resource.name, 
    description: @resource.summary,
    action_text: "Edit",
    action_path: edit_path %>
2. Inline Errors Over Error Lists

Always prefer inline field errors with a flash message over an alert containing a list of all validation errors.

erb
<%# ✅ RECOMMENDED: Inline errors + flash %>
<%= form_with model: @user, data: { component: "form" } do |f| %>
  <div data-form-part="group">
    <%= f.label :email, data: { component: "label" } %>
    <%= f.email_field :email, data: { component: "input" },
        aria: { invalid: @user.errors[:email].any? } %>
    <% if @user.errors[:email].any? %>
      <p data-form-part="error"><%= @user.errors[:email].first %></p>
    <% end %>
  </div>
  <%# Flash shows brief summary: "Please fix the errors below" %>
<% end %>

<%# ❌ AVOID: Alert with error list %>
<% if @user.errors.any? %>
  <%= render "components/alert", variant: :destructive do %>
    <ul>
      <% @user.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
  <% end %>
<% end %>

Inline errors are more accessible — users see the problem next to the field that needs fixing. The flash provides a brief notification that something needs attention.

3. Robust Input Attributes

Every input should have appropriate HTML5 attributes for validation, accessibility, and mobile optimization:

AttributePurposeExample
typeCorrect keyboard, validationemail, tel, url, number
requiredMark mandatory fieldsrequired: true
maxlengthPrevent overflow, guide usermaxlength: 100
minlengthMinimum inputminlength: 2
patternCustom validationpattern: "[0-9]{10}"
inputmodeMobile keyboard hintinputmode: "numeric"
autocompleteAutofill hintsautocomplete: "email"
erb
<%# ✅ GOOD: Complete input attributes %>
<%= f.email_field :email,
    data: { component: "input" },
    required: true,
    maxlength: 254,
    autocomplete: "email",
    placeholder: "you@example.com" %>

<%= f.phone_field :phone,
    data: { component: "input" },
    required: true,
    maxlength: 20,
    pattern: "[+]?[0-9\\s\\-()]+",
    inputmode: "tel",
    autocomplete: "tel" %>

<%= f.text_field :name,
    data: { component: "input" },
    required: true,
    minlength: 2,
    maxlength: 100,
    autocomplete: "name" %>

<%# ❌ BAD: Missing attributes %>
<%= f.text_field :name, data: { component: "input" } %>
Show full SKILL.md (236 more words)Show less
4. Data Attributes for Styling

Components use data-component and data-*-part attributes. CSS targets these, not classes:

erb
<%# Component identifies itself %>
<div data-component="card">
  <div data-card-part="header">...</div>
  <div data-card-part="content">...</div>
</div>

<%# Variants via data attributes %>
<%= render "components/badge", variant: :success do %>Active<% end %>
<%# Renders: <span data-component="badge" data-variant="success">Active</span> %>
5. Form Components via Rails Helpers

Form elements don't need partials — use data attributes directly:

erb
<%= form_with model: @user, data: { component: "form" } do |f| %>
  <div data-form-part="group">
    <%= f.label :email, data: { component: "label" } %>
    <%= f.email_field :email, data: { component: "input" } %>
  </div>
  
  <div data-form-part="actions">
    <%= f.submit "Save", data: { component: "button", variant: "primary" } %>
  </div>
<% end %>
6. Icons via Helper

Use icon_for helper, which delegates to your app's icon system:

erb
<%= icon_for :check, class: "size-4" %>
<%= icon_for :chevron_right, class: "size-4 text-muted-foreground" %>
7. Theme Variables

Colors come from CSS variables (shadcn/ui convention):

VariableUsage
--primary / --primary-foregroundPrimary actions, CTAs
--secondary / --secondary-foregroundSecondary elements
--muted / --muted-foregroundSubdued content
--accent / --accent-foregroundHighlights
--destructive / --destructive-foregroundDangerous actions
--card / --card-foregroundCard backgrounds
--borderBorders
--ringFocus rings

Implementation Workflow

Step 1: Identify Components Needed

Read the feature spec. Map UI requirements to components:

Feature: User Dashboard
- Summary cards → Card (stats variant)
- User list → Table with Badge for status
- Empty state when no users → Empty
- Actions per row → Dropdown Menu
- Page navigation → Pagination
Step 2: Plan Layout Structure

Decide grid/layout before coding:

erb
<%# Dashboard layout %>
<div class="space-y-6">
  <%# Stats row %>
  <div class="grid gap-4 md:grid-cols-2 lg:grid-cols-4">
    <%= render "dashboard/stat_card", ... %>
  </div>
  
  <%# Main content %>
  <%= render "components/card" do %>
    ...
  <% end %>
</div>
Step 3: Build with Components

Use component catalog, follow composition patterns.

Step 4: Verify Against Checklist

Run through spec-checklist.md before marking complete.

Anti-Patterns

❌ Don't✅ Do Instead
Inline Tailwind for component stylingUse data attributes, let CSS handle it
Create custom card/alert/badge divsUse maquina_components
Skip empty statesAlways handle zero-data case
Hardcode button stylesUse data-component="button"
Forget loading/disabled statesInclude all interaction states
Mix icon librariesUse icon_for consistently
Nest components incorrectlyFollow documented composition
Skip accessibility attributesInclude ARIA labels, roles

Haab-Specific Patterns

For the Haab project, these additional conventions apply:

Brand Colors

Override theme variables in application.css:

css
:root {
  --primary: oklch(0.467 0.175 3.95);      /* Dusty Rose #BE185D */
  --primary-foreground: oklch(0.985 0 0);
}
Booking Status Badges
erb
<% variant = case booking.status
   when "confirmed" then :success
   when "pending" then :warning
   when "cancelled", "no_show" then :destructive
   else :secondary
   end %>
<%= render "components/badge", variant: variant do %>
  <%= t("enums.booking.status.#{booking.status}") %>
<% end %>
Money Display
erb
<%= render "components/badge", variant: :outline do %>
  <%= format_money(service.price_cents) %>
<% end %>
Time Display
erb
<%# Use monospace for times %>
<span class="font-mono text-sm">
  <%= l(booking.starts_at, format: :time) %>
</span>

Quick Component Examples

Card with Action Header
erb
<%= render "components/card" do %>
  <%= render "components/card/header", layout: :row do %>
    <div>
      <%= render "components/card/title", text: t(".title") %>
      <%= render "components/card/description", text: t(".description") %>
    </div>
    <%= render "components/card/action" do %>
      <%= link_to new_resource_path, data: { component: "button", variant: "primary", size: "sm" } do %>
        <%= icon_for :plus, class: "size-4 mr-1" %><%= t(".add") %>
      <% end %>
    <% end %>
  <% end %>
  <%= render "components/card/content" do %>
    <!-- Content here -->
  <% end %>
<% end %>
Table with Actions
erb
<%= render "components/table" do %>
  <%= render "components/table/header" do %>
    <%= render "components/table/row" do %>
      <%= render "components/table/head" do %><%= t(".name") %><% end %>
      <%= render "components/table/head" do %><%= t(".status") %><% end %>
      <%= render "components/table/head", css_classes: "w-10" do %>
        <span class="sr-only"><%= t(".actions") %></span>
      <% end %>
    <% end %>
  <% end %>
  <%= render "components/table/body" do %>
    <% @items.each do |item| %>
      <%= render "components/table/row" do %>
        <%= render "components/table/cell" do %><%= item.name %><% end %>
        <%= render "components/table/cell" do %>
          <%= render "components/badge", variant: status_variant(item) do %>
            <%= item.status.titleize %>
          <% end %>
        <% end %>
        <%= render "components/table/cell" do %>
          <%= render "shared/row_actions", item: item %>
        <% end %>
      <% end %>
    <% end %>
  <% end %>
<% end %>
Empty State
erb
<% if @items.empty? %>
  <%= render "components/empty" do %>
    <%= render "components/empty/header" do %>
      <%= render "components/empty/media" do %>
        <div class="flex h-16 w-16 items-center justify-center rounded-full bg-muted">
          <%= icon_for :inbox, class: "size-8 text-muted-foreground" %>
        </div>
      <% end %>
      <%= render "components/empty/title", text: t(".empty.title") %>
      <%= render "components/empty/description", text: t(".empty.description") %>
    <% end %>
    <%= render "components/empty/content" do %>
      <%= link_to t(".empty.action"), new_path, data: { component: "button", variant: "primary" } %>
    <% end %>
  <% end %>
<% end %>

See individual reference files for complete documentation.

© maquina-app, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 7 other files (references) in skill of maquina-app/maquina_components.

  • SKILL.md
  • QUICKSTART.md
  • README.md
  • references/component-catalog.md
  • references/form-patterns.md
  • references/layout-patterns.md
  • references/spec-checklist.md
  • references/turbo-integration.md

Open the folder on GitHubat commit 8a88019

Compare with similar skills

Maquina UI Standards 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.

Maquina UI Standards compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Maquina UI Standards this skillmaquina-app/maquina_components141—~3.5kAutomated safety check: PassMIT
Docs Seekeravibebuilder/claude-prime120—~1.4kAutomated safety check: PassMIT
Billing SDKhashgraph-online/awesome-codex-plugins1.3k—~3.5kAutomated safety check: NotesApache-2.0
Avoid AI Designsunkaifei/FlyCms656—~3.5kAutomated safety check: PassMIT
Flycms Devsunkaifei/FlyCms656—~827Automated safety check: PassMIT
FbaZhongye1/KnowAgenticRAG135—~758Automated safety check: PassNone

Similar skills

  • Docs Seeker

    avibebuilder/claude-prime

    Fetch up-to-date documentation for any library, framework, API, or service into context.

    120 GitHub stars~1.4k tokensUpdated 4 mo ago
    DatabasesAuto-check passed
  • Billing SDK

    hashgraph-online/awesome-codex-plugins

    BillingSDK, the open-source React and shadcn component library for Dodo Payments billing UI.

    1.3k GitHub stars~3.5k tokensUpdated yesterday
    Frontend & DesignAuto-check: notes
  • Avoid AI Design

    sunkaifei/FlyCms

    Audit and rewrite frontend UI to remove generic AI design patterns ("AI slop"), both the first-order defaults (purple gradients, Inter, a centered hero over three cards, untouched shadcn) and the…

    656 GitHub stars~3.5k tokensUpdated 2 days ago
    Frontend & DesignAuto-check passed
  • Flycms Dev

    sunkaifei/FlyCms

    FlyCms 项目(backend/ Spring Boot 4.1.1 + frontend/ vue-vben-admin v5)的架构地图与开发规范总纲。凡在本仓库做任何开发——写后端接口、新增/修改模块、管理页面、数据库变更、修 bug、重构——都要先加载本 skill 再动手,即使用户只说"改一下""加个功能";前端登录/菜单/权限专项另见…

    656 GitHub stars~827 tokensUpdated 2 days ago
    Backend & APIsAuto-check passed
  • Fba

    Zhongye1/KnowAgenticRAG

    FastAPI Best Architecture (fba) project development guide. An agent skill from Zhongye1/KnowAgenticRAG.

    135 GitHub stars~758 tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • Frontmcp Auth UI

    agentfront/frontmcp

    A skill your agent uses when customizing, branding, or replacing the built-in FrontMCP OAuth pages (the login, consent, federated-select, incremental-authorization, and error pages) with your own…

    146 GitHub stars~3.7k tokensUpdated today
    Backend & APIsAuto-check passed

Works with

Questions about Maquina UI Standards

What does Maquina UI Standards do?

Build consistent, accessible UIs in Rails using maquinacomponents. Maquina UI Standards is an agent skill from maquina-app/maquina_components. Build consistent, accessible UIs in Rails using maquinacomponents.

When should I use Maquina UI Standards?

Maquina UI Standards fits situations like: implementing UI for features; reviewing UI specs; UI implementation; mentions of maquinacomponents usage.

How do I install Maquina UI Standards in Claude Code?

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

How do I install Maquina UI Standards in Codex?

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

Can I use Maquina UI Standards 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 maquina-app/maquina_components --skill maquina-ui-standards -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/maquina-ui-standards, .gemini/skills/maquina-ui-standards, .github/skills/maquina-ui-standards and .opencode/skills/maquina-ui-standards in your project.

What does Maquina UI Standards need to run?

SKILL.md names no scripts, command-line tools or credentials: Maquina UI Standards is instructions for the agent only.

Does Maquina UI Standards 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 Maquina UI Standards 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 Maquina UI Standards use?

Maquina UI Standards is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Maquina UI Standards use?

About 3.5k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 27k tokens, read only when the agent opens those files.

What are the alternatives to Maquina UI Standards?

Skills that share tags, products or a category with Maquina UI Standards: Docs Seeker (avibebuilder/claude-prime, 120 stars), Billing SDK (hashgraph-online/awesome-codex-plugins, 1.3k stars), Avoid AI Design (sunkaifei/FlyCms, 656 stars) and Flycms Dev (sunkaifei/FlyCms, 656 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Maquina UI Standards?

maquina-app (a GitHub organization) maintains it in maquina-app/maquina_components, which has 141 GitHub stars. The repository was last updated on September 27, 2026.

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