component-wrapper-architecture

Component Wrapper Architecture

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "component-wrapper-architecture" with this command: npx skills add theorcdev/8bitcn-ui/theorcdev-8bitcn-ui-component-wrapper-architecture

Component Wrapper Architecture

8-bit components wrap shadcn/ui components rather than replacing them. This pattern maintains compatibility while adding retro styling.

Basic Wrapper Pattern

Structure:

  • Import base component with alias

  • Define variants using class-variance-authority

  • Export separate interface for props

  • Use ref prop (not forwardRef for React 19)

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";

export const buttonVariants = cva("", { variants: { font: { normal: "", retro: "retro", }, variant: { default: "bg-foreground", // ... }, }, defaultVariants: { variant: "default", size: "default", }, });

export interface BitButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> { asChild?: boolean; ref?: React.Ref<HTMLButtonElement>; }

function Button({ children, asChild, ...props }: BitButtonProps) { const { variant, size, className, font } = props;

return ( <ShadcnButton {...props} className={cn( "rounded-none active:translate-y-1 transition-transform", className )} size={size} variant={variant} asChild={asChild} > {children} </ShadcnButton> ); }

Re-exporting Base Components

For components with multiple sub-components, re-export unchanged parts:

import { Dialog as ShadcnDialog, DialogHeader as ShadcnDialogHeader, DialogFooter as ShadcnDialogFooter, DialogDescription as ShadcnDialogDescription, } from "@/componentsconst Dialog = ShadcnDialog; const DialogHeader =/ui/dialog";

ShadcnDialogHeader; const DialogFooter = ShadcnDialogFooter; const DialogDescription = ShadcnDialogDescription;

export { Dialog, DialogHeader, DialogFooter, DialogDescription, // ...custom implementations };

Card Wrapper Pattern

Use outer wrapper for pixelated borders while keeping base component:

function Card({ className, font, ...props }: BitCardProps) { return ( <div className={cn( "relative border-y-6 border-foreground dark:border-ring !p-0", className )} > <ShadcnCard {...props} className={cn( "rounded-none border-0 !w-full", font !== "normal" && "retro", className )} />

  {/* Pixelated side borders */}
  &#x3C;div
    className="absolute inset-0 border-x-6 -mx-1.5 border-foreground dark:border-ring pointer-events-none"
    aria-hidden="true"
  />
&#x3C;/div>

); }

Key Principles

  • Alias imports - Use as ShadcnComponent pattern for base components

  • Empty cva base - Variants often start empty, relying on CSS for styling

  • Separate prop interface - Export BitComponentProps for TypeScript

  • React 19 ref - Use ref?: React.Ref<T> instead of forwardRef

  • rounded-none - Remove all border radius from base component

  • Pass through props - Forward all props including size , variant , className

  • Conditional retro - Use font !== "normal" && "retro" pattern

Component Examples

  • components/ui/8bit/button.tsx

  • Basic wrapper with pixel borders

  • components/ui/8bit/card.tsx

  • Card with outer wrapper

  • components/ui/8bit/dialog.tsx

  • Multi-subcomponent wrapper

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

fumadocs-mdx-structure

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

rendering-animate-svg

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

8-bit-pixel-art-patterns

No summary provided by upstream source.

Repository SourceNeeds Review