UI Styling
Ohh-889/skyroc
Create beautiful, accessible user interfaces with shadcn/ui components (built on Radix UI + Tailwind), Tailwind CSS utility-first styling, and canvas-based visual designs.
Builds or extends shared Astro components in Tabler's shared/ui library, covering Props interfaces, prop names, class composition, slots and follow-up docs.
$ npx skills add tabler/tabler --skill ui-component -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install tabler/tabler ui-component --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/tabler/tabler.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/ui-component .claude/skills/ui-component && rm -rf skills-srcUse ~/.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/
Install the "ui-component" agent skill from https://github.com/tabler/tabler/tree/dev/.agents/skills/ui-component into .claude/skills/ui-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ui-component", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/tabler/tabler/tree/dev/.agents/skills/ui-componentType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add tabler/tabler --skill ui-component -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install tabler/tabler ui-component --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tabler/tabler.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/ui-component .agents/skills/ui-component && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ui-component" agent skill from https://github.com/tabler/tabler/tree/dev/.agents/skills/ui-component into .agents/skills/ui-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ui-component", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add tabler/tabler --skill ui-component -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install tabler/tabler ui-component --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tabler/tabler.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/ui-component .cursor/skills/ui-component && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "ui-component" agent skill from https://github.com/tabler/tabler/tree/dev/.agents/skills/ui-component into .cursor/skills/ui-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ui-component", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/tabler/tabler.git --path .agents/skills/ui-component--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add tabler/tabler --skill ui-component -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install tabler/tabler ui-component --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tabler/tabler.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/ui-component .gemini/skills/ui-component && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "ui-component" agent skill from https://github.com/tabler/tabler/tree/dev/.agents/skills/ui-component into .gemini/skills/ui-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ui-component", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install tabler/tabler ui-componentInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add tabler/tabler --skill ui-component -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/tabler/tabler.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/ui-component .github/skills/ui-component && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "ui-component" agent skill from https://github.com/tabler/tabler/tree/dev/.agents/skills/ui-component into .github/skills/ui-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ui-component", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add tabler/tabler --skill ui-component -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install tabler/tabler ui-component --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tabler/tabler.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/ui-component .opencode/skills/ui-component && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "ui-component" agent skill from https://github.com/tabler/tabler/tree/dev/.agents/skills/ui-component into .opencode/skills/ui-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ui-component", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
ui-componentBuilds or extends shared Astro components in Tabler's shared/ui library, covering Props interfaces, prop names, class composition, slots and follow-up docs.
The shared/ui folder is the component library rendered by both the preview and the docs, so each change shows up in demo pages and documentation examples at once. The skill says to extend an existing component with a variant, size or light prop instead of creating a parallel copy, and to check the matching demo page for hand-written variants that reveal missing props.
Components wrap classes that already exist in core/scss, and if the class is missing, writing the SCSS is part of the task. The skeleton rules call for an interface Props with defaults, class destructured as className, union types for modifiers with a comment naming the SCSS source, a rest spread on the root element for id, data and aria attributes, and a doc comment on each non-obvious prop.
It also gives a shared prop-name dictionary so the API stays predictable, placement rules for generic blocks, fixed demo content and docs-only components, and notes on slots and the as pitfall. A new component needs follow-ups: a demo page, documentation and a changeset.
9 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit dcacb65. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
pnpmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pnpm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Tabler Astro Component Builder loads about 2.1k tokens when it runs. Until then it costs about 118 tokens; SKILL.md has 954 words of instructions outside code blocks.
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.
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.
The full file from tabler/tabler at commit dcacb65, republished under its MIT licence (© tabler). 954 words, ~2,132 tokens.
.claude/skills/ui-component/SKILL.md (or your agent's skills folder).shared/ui/*.astro is the component library. @tabler/preview and @tabler/docs render the same files, so every change here lands on demo pages and in documentation examples at once. Components are markup: the design lives in core/scss/, and logic longer than a few lines lives in shared/lib/*.ts.
Props interface of the closest existing component first. A new look is a prop on the existing component (variant, size, light), never a parallel ButtonAlt.astro.preview/pages/<name>.astro hand-writes variants the component cannot express, those are the missing props, and the component has drifted from the markup it is supposed to own. Close that gap instead of adding one more hand-written block.core/scss/ui/_*.scss. If the class is missing, writing it is part of the task — never invent class names in the component.shared/ui/; fixed demo content (a dashboard card with its own data) in shared/components/cards/; docs-only components in docs/components/.shared/ are relative (./Icon.astro, ../components/CaptureScript.astro). @shared / @ui / @data are for the site packages. Any bare npm import used in shared/ must be declared in shared/package.json.---
import Icon from './Icon.astro'
/** core/scss/ui/_badges.scss `.badge-{size}` modifier classes */
type BadgeSize = 'sm' | 'lg'
interface Props {
text?: string
color?: string
size?: BadgeSize | undefined
/** -lt colour variant + text-{color}-lt-fg */
light?: boolean
class?: string
icon?: string
/** remaining attributes (id, data-*, aria-*, …) are forwarded to the root element */
[key: string]: unknown
}
const { text, color, size, light, class: className, icon, ...rest } = Astro.props
const classes = ['badge', size && `badge-${size}`, color && `bg-${color}${light ? '-lt' : ''}`, className]
---
<span class:list={classes} {...rest}>{icon && <Icon name={icon} />}{text}</span>Rules the file above follows, and every component should:
interface Props + destructuring with defaults. No untyped Astro.props.class prop keeps its HTML name and is destructured as class: className.'sm' | 'lg'), with a doc comment naming the SCSS file the classes come from. Export the type (export type IconSize) when a sibling component reuses it.[key: string]: unknown + ...rest spread on the root element, so callers can pass id, data-*, aria-* without a prop for each. Add it unless the component deliberately controls its own attributes.Names are shared across the library so the API stays predictable (and stays portable to React/Vue later). Reuse these before inventing a name:
| Prop | Meaning |
|---|---|
class | extra classes, merged last so callers can override |
id | element id; required for components that a script initialises |
color | palette colour (primary, azure, …), emitted as -{color} |
size | sm / md / lg (…), where md emits no class |
variant | style variant of the same component (outline, ghost, important) |
text, title, description, label | content passed as a prop instead of a slot |
icon, iconEnd | icon names, rendered through Icon.astro |
href, external | link target; external adds target="_blank" rel="noreferrer" |
disabled, active, required, invalid | state booleans, named after the HTML/CSS state |
show… (showClose, showValue) | opt-in parts of the markup |
ariaLabel | accessible name when the visible content is an icon or a colour |
Props are camelCase. Booleans default to false — never showClose = true.
class:list={[...]} with falsy entries for conditionals; it drops them and merges the caller's className for you. .filter(Boolean).join(' ') is only for a string you have to pass to a helper (iconSvg).className last so the caller wins.size !== 'md' && \btn-${size}``).<style> blocks and no CSS imports in the frontmatter. Styling is core/scss/. A <style> makes Astro stamp data-astro-cid-* on every element the component renders, and its custom properties skip the --tblr- prefixing in build-css.ts.Container components (Card, CardBody, ButtonList, …) take a <slot /> rather than a content prop. Use Astro.slots.has('name') when the markup differs depending on whether a named slot was filled.
Polymorphic containers take an as prop — with one trap:
---
import type { HTMLTag } from 'astro/types'
// `as` must stay out of the Props body: Astro's frontmatter scanner bails on a member
// literally named `as` and silently falls back to untyped props.
type PolymorphicProps = { as?: HTMLTag }
interface Props extends PolymorphicProps {
class?: string
}
const { as: Element = 'div', class: className }: Props = Astro.props
---
<Element class:list={['card', className]}><slot /></Element>Heading components pick their own level (CardTitle renders h2, as="h3" for a nested section) so pages cannot skip levels.
…) → set:html / <Fragment set:html={…} />. Entities in attribute strings must be passed as an expression (title={"……"}), because JSX decodes them inside string literals.selected={true} renders bare, but some (e.g. multiple) render ="true". Use multiple ? '' : undefined when a bare attribute is required, and check the rendered HTML.<script> — see the astro-scripts skill.<Icon name="…" />, never inline SVG. An unknown name renders nothing and only warns in the build log ([svg] unknown Tabler icon), so the page looks fine with a blank button. Check the name in shared/data/icons.json before using it: it is player-play, not play.shared/libAnything beyond assembling classes and simple ternaries (formatting, data shaping, SVG handling, deterministic demo data) goes to shared/lib/*.ts and is imported by the component. Every module there has a sibling *.test.ts run by vitest (pnpm --filter @tabler/shared test) — add one for the function you introduce, and keep it pure so it is testable without a DOM.
Use pseudo-random.ts instead of Math.random() for demo data: pages are rebuilt constantly and random output would change the HTML on every build.
A new component is not done until it is visible and documented:
preview/pages/ showing its variants (demo-pages skill).docs/content/** (write-docs skill), plus the class table (class-reference skill) when the component introduces classes.generate-changeset skill, minor for a new component, patch for a fix.core/scss/; no invented class namesinterface Props typed, prop names taken from the dictionary in section 3class: className merged last, ...rest forwardedariaLabel where the content is an iconshared/lib with a test, not in the frontmatterpnpm run format:prettier and pnpm run type-check clean at the repo root (full output, not a tail)© tabler, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/ui-component of tabler/tabler.
Open the folder on GitHubat commit dcacb65
Tabler Astro Component Builder 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Tabler Astro Component Builder this skilltabler/tabler | 42k | — | ~2.1k | Automated safety check: Pass | MIT | |
| UI StylingOhh-889/skyroc | 795 | 13 repos | ~2.5k | Automated safety check: Pass | MIT | |
| Chakra UI v3 Refactor and Reviewchakra-ui/chakra-ui | 41k | — | ~2.8k | Automated safety check: Pass | MIT | |
| Kill AI Slopyetone/kill-ai-slop | 1.3k | — | ~1.4k | Automated safety check: Pass | Apache-2.0 | |
| Cosscrafter-station/petdex | 4.2k | — | ~1.4k | Automated safety check: Pass | MIT | |
| DaisyUI Component Librarysaadeghi/daisyui | 43k | — | ~1.3k | Automated safety check: Pass | MIT |
Ohh-889/skyroc
Create beautiful, accessible user interfaces with shadcn/ui components (built on Radix UI + Tailwind), Tailwind CSS utility-first styling, and canvas-based visual designs.
chakra-ui/chakra-ui
Reviews and converts UI code to Chakra UI v3, producing a critique, rewritten code or both, from plain HTML, Tailwind, CSS Modules or styled-components.
yetone/kill-ai-slop
Find and remove AI slop — the generic, machine-default visual and copy tics of vibe-coded products — from a web project.
crafter-station/petdex
Helps implement coss UI components correctly. An agent skill from crafter-station/petdex.
saadeghi/daisyui
Official daisyUI skill for Tailwind CSS projects, routing to install, usage, configuration, color and per-component guides before writing any HTML or JSX with its classes.
Castor6/tactus
A skill your agent uses whenever the user asks to build, create, design, develop, improve, or style any frontend interface or visual element.
tabler/tabler
Starts the right Tabler dev server, keeps it from clashing with builds and verifies changes in the browser before a page or component is handed back.
tabler/tabler
Rules for adding or fixing client-side scripts in Tabler's Astro components so the copied preview HTML stays readable, self-contained and runs in the right order.
tabler/tabler
Sets the file structure, typing and Data API pattern for writing a new Bootstrap-style JavaScript component class in Tabler's vendored port of Bootstrap's JS.
tabler/tabler
Writes or updates the classnames front matter that renders the class table at the end of a Tabler component docs page.
tabler/tabler
Guidance for changing the Tabler framework's own JavaScript in core/js: the tabler.js and tabler-theme.js bundles, the Bootstrap port and their tests.
tabler/tabler
Rules for adding or changing styles in Tabler's core/scss framework: file placement, custom properties, dark mode, RTL, tests and build gates.
Works with
Categories
Builds or extends shared Astro components in Tabler's shared/ui library, covering Props interfaces, prop names, class composition, slots and follow-up docs. The shared/ui folder is the component library rendered by both the preview and the docs, so each change shows up in demo pages and documentation examples at once. The skill says to extend an existing component with a variant, size or light prop instead of creating a parallel copy, and to check the matching demo page for hand-written variants that reveal missing props.
Tabler Astro Component Builder fits situations like: adding a new component to the shared Astro UI library; adding a prop, variant or size to an existing shared component; refactoring a shared component whose demo page drifted from its markup.
Run `npx skills add tabler/tabler --skill ui-component -a claude-code`. Or copy the skill folder (.agents/skills/ui-component in tabler/tabler) into .claude/skills/ui-component in your project. Claude Code loads it when a task matches its description.
Run `npx skills add tabler/tabler --skill ui-component -a codex`. Or copy the skill folder (.agents/skills/ui-component in tabler/tabler) into .agents/skills/ui-component in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add tabler/tabler --skill ui-component -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ui-component, .gemini/skills/ui-component, .github/skills/ui-component and .opencode/skills/ui-component in your project.
Going by SKILL.md and its folder, Tabler Astro Component Builder needs the command-line tools its instructions call (pnpm). Our summary lists: A Tabler checkout with the shared and core packages.
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.
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.
Tabler Astro Component Builder is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.1k tokens (SKILL.md is roughly 8.5k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Tabler Astro Component Builder: UI Styling (Ohh-889/skyroc, 795 stars), Chakra UI v3 Refactor and Review (chakra-ui/chakra-ui, 41k stars), Kill AI Slop (yetone/kill-ai-slop, 1.3k stars) and Coss (crafter-station/petdex, 4.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
tabler (a GitHub organization) maintains it in tabler/tabler, which has 41,821 GitHub stars. The repository holds 21 skills in this directory. The repository was last updated on October 6, 2026.
Source: tabler/tabler on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.