spicykatsu

Simple Library for Vue3.
3,994
Install
npm install spicykatsu
Latest Version:0.9.11
Vue:3
License:MIT
Last Updated:Jul 27, 2026
Links: npm
Maintainer: spicykatsu

SpicyKatsuLib

Fun, simple component library for Vue 3. Built as a personal playground for my website. Feel free to use it in your own projects.

📖 Docs  |  📦 npm


Installation

npm install spicykatsu

Usage

All components, styles, and directives are registered automatically. No extra imports needed.

import { createApp } from 'vue'
import App from './App.vue'
import { SpicyKatsu } from 'spicykatsu'

const app = createApp(App)
app.use(SpicyKatsu)
app.mount('#app')

Tree-Shakeable (For production optimization)

Import only the components and directives you need. Each component's CSS is bundled automatically via its <style> block. However, you must also import the CSS variables so components look correct.

import { createApp } from 'vue'
import App from './App.vue'
import { SpicyBtn, SpicyModal } from 'spicykatsu/SpicyBtn'
import { spicyRipple } from 'spicykatsu/spicyRipple'

// Import CSS variables (required for components to look correct)
import 'spicykatsu/styles/variables'

const app = createApp(App)
app.component('SpicyBtn', SpicyBtn)
app.component('SpicyModal', SpicyModal)
app.directive('spicyRipple', spicyRipple)
app.mount('#app')

You can also import base utility styles if you use .spicyText, .spicyHeader, or .spicyLink classes:

import 'spicykatsu/styles/base'

Or import all styles at once:

import 'spicykatsu/styles'

Plugin with selective options

You can also use the plugin with options to control what gets registered:

app.use(SpicyKatsu, {
  useComponents: true,  // Register all components globally (default: true)
  useStyles: true,      // Inject all styles into <head> (default: true)
  useDirectives: true   // Register v-spicyDrag and v-spicyRipple (default: true)
})

Set any to false to opt out of that part. For example, to register components yourself but still get styles injected:

app.use(SpicyKatsu, { useComponents: false })

To inject only CSS variables (useful when tree-shaking components but still using the plugin for style injection):

app.use(SpicyKatsu, { useComponents: false, useStyles: 'variables' })

Components

Component Description
SpicyAccordion Collapsible sections, single or multi-open
SpicyAlert Dismissible alerts with variants and auto-close
SpicyBadge Pill/tag badges with variants, dot, and removable
SpicyBtn Button with MDI icon support and ripple effect
SpicyCarousel Image carousel with autoplay, touch, and pagination
SpicyDataTable Data table with sorting, filtering, and pagination
SpicyDialog Teleported overlay dialog
SpicyDivider Horizontal or vertical divider
SpicyDropdown Dropdown menu with click-outside close
SpicyFileInput File input with drag-and-drop and multi-file preview
SpicyModal Modal dialog with title, actions, and Escape-to-close
SpicyProgress Linear and circular progress indicators
SpicySelect Custom select with search, multi-select, and keyboard nav
SpicySheet Styled container/card
SpicySkeleton Loading placeholder with shimmer animation
SpicySlider Range slider input
SpicyTabs Tabbed interface with scrollable tab bar
SpicyTextArea Styled textarea
SpicyTextField Text input with floating label, prefix, and validation
SpicyToast Toast notification system with auto-dismiss and positions
SpicyToggle Toggle switch
SpicyTooltip Hover tooltip with position control
SpicyTree Recursive tree view

Directives

Directive Description
v-spicyDrag Makes any element draggable (mouse + touch). Options: axis, handle, disabled, bounds, grid, onDragStart, onDrag, onDragEnd
v-spicyRipple Adds a Material-style ripple on click/touch. Options: color, center. Use data-no-ripple to disable

Dev / Playground

Clone the repo and run:

bun install
bun run dev

The playground (playground/Playground.vue) has a live example of every component and directive.

Version History

Version Released Vue License
0.9.11 ^3.5.40 MIT
0.9.10 ^3.5.40 MIT
0.9.9 ^3.5.39 MIT
0.9.8 ^3.5.39 MIT
0.9.7 ^3.5.39 MIT