Icon Box
icon-boxuiIcon container primitive with calibrated sizes (2xs to xl), surface variants (solid, outline, subtle, primary, muted), and 2.5D layered IconStack for empty states and feature hero cards.
Installation
$pnpm dlx shadcn-svelte@latest add https://uipkge.dev/r/svelte/icon-box.json$npx shadcn-svelte@latest add https://uipkge.dev/r/svelte/icon-box.json$yarn dlx shadcn-svelte@latest add https://uipkge.dev/r/svelte/icon-box.json$bunx shadcn-svelte@latest add https://uipkge.dev/r/svelte/icon-box.jsonManifest:
https://uipkge.dev/r/svelte/icon-box.jsonInstalls to:src/lib/components/ui/icon-box/Examples
Loading interactive previews…
Loading interactive previews…
Props
| Name | Type / Values | Default | Required |
|---|---|---|---|
icon | Component | — | optional |
variant | IconBoxVariant | primary | optional |
shape | IconBoxShape | rounded | optional |
size | IconBoxSize | md | optional |
iconClass | string | — | optional |
children | Snippet | — | optional |
Used by
Files installed (3)
src/lib/components/ui/icon-box/IconBox.svelte2.4 kB
<script lang="ts" module> import type { Component, Snippet } from 'svelte' import type { HTMLAttributes } from 'svelte/elements' export type IconBoxVariant = | 'primary' | 'muted' | 'outline' | 'solid' | 'subtle' | 'destructive' | 'success' | 'warning' | 'ghost' | 'custom' export type IconBoxSize = '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' export type IconBoxShape = 'rounded' | 'circle' | 'square' export interface IconBoxProps extends HTMLAttributes<HTMLDivElement> { icon?: Component variant?: IconBoxVariant shape?: IconBoxShape size?: IconBoxSize iconClass?: string children?: Snippet } const variantClasses: Record<IconBoxVariant, string> = { primary: 'bg-primary/10 text-primary', muted: 'bg-muted text-muted-foreground', outline: 'border border-border bg-background text-foreground shadow-xs', solid: 'bg-foreground text-background shadow-xs', subtle: 'bg-accent text-accent-foreground', destructive: 'bg-destructive/10 text-destructive', success: 'bg-success/15 text-success', warning: 'bg-warning/15 text-warning', ghost: 'text-muted-foreground hover:bg-accent hover:text-foreground', custom: '', } const shapeClasses: Record<IconBoxShape, string> = { rounded: 'rounded-lg', circle: 'rounded-full', square: 'rounded-none', } const sizeClasses: Record<IconBoxSize, string> = { '2xs': 'size-6 p-1', xs: 'size-7 p-1.5', sm: 'size-8 p-1.5', md: 'size-9 p-2', lg: 'size-11 p-2.5', xl: 'size-14 p-3.5', } const iconSizes: Record<IconBoxSize, string> = { '2xs': 'size-3', xs: 'size-3.5', sm: 'size-4', md: 'size-4.5', lg: 'size-6', xl: 'size-7', } </script> <script lang="ts"> import { cn } from '$lib/utils' let { class: className, icon, variant = 'primary', shape = 'rounded', size = 'md', iconClass, children, ...restProps }: IconBoxProps = $props() </script> <div data-uipkge data-slot="icon-box" data-variant={variant} data-size={size} data-shape={shape} {...restProps} class={cn( 'inline-flex shrink-0 items-center justify-center transition-colors', variantClasses[variant], shapeClasses[shape], sizeClasses[size], className, )} > {#if children} {@render children()} {:else if icon} {@const Icon = icon} <Icon class={cn(iconSizes[size], iconClass)} aria-hidden="true" /> {/if} </div>src/lib/components/ui/icon-box/IconStack.svelte2.9 kB
<script lang="ts" module> import type { Component, Snippet } from 'svelte' import type { HTMLAttributes } from 'svelte/elements' export type IconStackVariant = 'primary' | 'muted' | 'destructive' | 'success' | 'warning' export type IconStackSize = 'sm' | 'md' | 'lg' | 'xl' export interface IconStackProps extends HTMLAttributes<HTMLDivElement> { icon?: Component variant?: IconStackVariant size?: IconStackSize iconClass?: string children?: Snippet } const sizeMap: Record<IconStackSize, { root: string; base: string; icon: string }> = { sm: { root: 'size-10', base: 'size-8 rounded-lg', icon: 'size-4' }, md: { root: 'size-14', base: 'size-11 rounded-xl', icon: 'size-5' }, lg: { root: 'size-18', base: 'size-14 rounded-2xl', icon: 'size-7' }, xl: { root: 'size-24', base: 'size-18 rounded-3xl', icon: 'size-9' }, } const variantMap: Record<IconStackVariant, { back: string; front: string; text: string }> = { primary: { back: 'bg-primary/20 border-primary/30', front: 'bg-background border-primary/20 shadow-primary/10', text: 'text-primary', }, muted: { back: 'bg-muted border-border', front: 'bg-card border-border shadow-black/5', text: 'text-muted-foreground', }, destructive: { back: 'bg-destructive/20 border-destructive/30', front: 'bg-background border-destructive/20 shadow-destructive/10', text: 'text-destructive', }, success: { back: 'bg-success/20 border-success/30', front: 'bg-background border-success/20 shadow-success/10', text: 'text-success', }, warning: { back: 'bg-warning/20 border-warning/30', front: 'bg-background border-warning/20 shadow-warning/10', text: 'text-warning', }, } </script> <script lang="ts"> import { cn } from '$lib/utils' let { class: className, icon, variant = 'primary', size = 'md', iconClass, children, ...restProps }: IconStackProps = $props() </script> <div data-uipkge data-slot="icon-stack" data-variant={variant} data-size={size} {...restProps} class={cn('relative inline-flex items-center justify-center select-none', sizeMap[size].root, className)} > <!-- Background offset sheet --> <div aria-hidden="true" class={cn( 'absolute inset-0 m-auto rotate-6 border transition-transform duration-300', sizeMap[size].base, variantMap[variant].back, )} ></div> <!-- Top elevated card --> <div class={cn( 'relative z-10 flex items-center justify-center border shadow-md transition-transform duration-300 group-hover:-translate-y-0.5', sizeMap[size].base, variantMap[variant].front, variantMap[variant].text, )} > {#if children} {@render children()} {:else if icon} {@const Icon = icon} <Icon class={cn(sizeMap[size].icon, iconClass)} aria-hidden="true" /> {/if} </div> </div>src/lib/components/ui/icon-box/index.ts0.3 kB
export { default as IconBox, type IconBoxProps, type IconBoxVariant, type IconBoxSize, type IconBoxShape, } from './IconBox.svelte' export { default as IconStack, type IconStackProps, type IconStackVariant, type IconStackSize, } from './IconStack.svelte'
Raw manifest:https://uipkge.dev/r/svelte/icon-box.json