UI component conventions for 8-bit styled components. Use when working with shadcn/ui components or implementing retro-styled UI elements.
The components/ui directory uses different conventions from the rest of the project. It's excluded from Biome/Ultracite linting to preserve shadcn/ui patterns.
biome.jsonc has "!components/ui" in the includesnpx biome check components/ui/Base components (e.g., button.tsx):
import type * as React from "react";
import { Slot } from "@radix-ui/react-slot";
import { type VariantProps, cva } from "class-variance-authority";
import { cn } from "@/lib/utils";
8bit components (e.g., 8bit/button.tsx):
import { type VariantProps, cva } from "class-variance-authority";
import { cn } from "@/lib/utils";
import { Button as ShadcnButton } from "@/components/ui/button";
import "@/components/ui/8bit/styles/retro.css";
Import order:
@/lib/utils)@/components/ui/component)@/components/ui/8bit/styles/retro.css)Base components: Inline props type with function
function Button({
className,
variant,
...props
}: React.ComponentProps<"button"> &
VariantProps<typeof buttonVariants> & {
asChild?: boolean;
})
8bit components: Export interface separately
export interface BitButtonProps
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
VariantProps<typeof buttonVariants> {
asChild?: boolean;
ref?: React.Ref<HTMLButtonElement>;
}
function Button({ children, asChild, ...props }: BitButtonProps)
Base components: Use React.forwardRef
const DialogOverlay = React.forwardRef<
React.ComponentRef<typeof DialogPrimitive.Overlay>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
>(({ className, ...props }, ref) => (
<DialogPrimitive.Overlay ref={ref} {...props} />
));
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
8bit components: Use ref prop (React 19 pattern)
export interface BitButtonProps
extends React.ButtonHTMLAttributes<HTMLButtonElement> {
ref?: React.Ref<HTMLButtonElement>;
}
function Button({ ref, ...props }: BitButtonProps) {
return <ShadcnButton ref={ref} {...props} />
}
Retro CSS import: Required for all 8bit components
import "@/components/ui/8bit/styles/retro.css";
Base component alias: Import base component with alias
import { Button as ShadcnButton } from "@/components/ui/button";
Variant overrides: 8bit variants often have minimal styles (borders/colors handled by CSS)
export const buttonVariants = cva("", {
variants: {
variant: {
default: "bg-foreground",
// ...
},
},
});
components/ui/button.tsx - Base component examplecomponents/ui/8bit/button.tsx - 8bit wrapper examplecomponents/ui/dialog.tsx - Complex base component with Radix primitivesnpx skills add TheOrcDev/shadcn-ui-conventions下载完整 Skill 目录,包含 SKILL.md 及所有相关文件
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer