kiso

Installation
SKILL.md

Kiso

Rails component library built on ERB partials + Tailwind CSS + class_variants + tailwind_merge. Inspired by shadcn/ui and Nuxt UI, adapted for Rails + Hotwire.

Installation

# Gemfile
gem "kiso"
bundle install
bin/rails generate kiso:install

Rendering Components

Use the kui() helper to render components:

<%= kui(:badge, color: :success, variant: :soft) { "Active" } %>

<%= kui(:card) do %>
  <%= kui(:card, :header) do %>
    <%= kui(:card, :title, text: "Members") %>
  <% end %>
  <%= kui(:card, :content) do %>
    ...
  <% end %>
<% end %>

Colors

7 semantic colors configurable via theme CSS variables:

Color Default Palette Purpose
primary blue CTAs, brand, active states
secondary teal Secondary actions
success green Success messages
info sky Informational
warning amber Warnings
error red Errors, destructive actions
neutral zinc Text, borders, surfaces

Variants

Components that accept both color and variant use compound variants (Nuxt UI pattern):

Variant Style
solid Filled background, contrasting text
outline Transparent background, colored ring
soft Light tinted background, colored text
subtle Light tinted background, colored text, faint ring

Theming

Components use semantic Tailwind utilities (bg-primary, text-foreground, bg-muted) that resolve to CSS variables. Dark mode flips automatically — components never use dark: prefixes.

Override brand colors in your app's CSS:

@theme inline {
  --color-primary: var(--color-orange-600);
  --color-primary-foreground: white;
}

Customizing Components

Global overrides

Override all instances of a component via Kiso.configure in an initializer:

# config/initializers/kiso.rb
Kiso.configure do |config|
  config.theme[:button] = { base: "rounded-full", defaults: { variant: :outline } }
  config.theme[:card_header] = { base: "p-8 sm:p-10" }
end

Override hashes accept base:, variants:, compound_variants:, defaults:. Applied once at boot — zero per-render cost.

Per-instance overrides

Pass css_classes: to override styles on a specific instance. Conflicting classes are resolved automatically via tailwind_merge:

<%= kui(:badge, color: :primary, css_classes: "rounded-full px-4") { "Custom" } %>

Layer order: theme default < global config < per-instance css_classes:.

Icons

Kiso uses kiso-icons for server-side inline SVG rendering. Lucide (~1500 icons) is bundled and works out of the box:

<%= kiso_icon("check") %>
<%= kiso_icon("settings", size: :md) %>
<%= kiso_icon("heroicons:check-circle") %>  <%# from a pinned set %>

Add more icon libraries:

bin/kiso-icons pin heroicons mdi tabler

Override component default icons globally:

Kiso.configure do |config|
  config.icons[:chevron_right] = "heroicons:chevron-right"
  config.icons[:menu] = "heroicons:bars-3"
end

Additional references

Load based on your task — do not load all at once:

Related skills

More from steveclarke/dotfiles

Installs
3
GitHub Stars
32
First Seen
Apr 15, 2026