New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details
Socket
Book a DemoSign in
Socket

@doderasoftware/vue-stepper

Package Overview
Dependencies
Maintainers
1
Versions
10
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@doderasoftware/vue-stepper

A headless, accessible, and fully customizable multi-step stepper component for Vue 3. Build complex forms, wizards, and onboarding flows with ease. Features TypeScript support, responsive mobile design, step validation, optional steps, progress tracking,

latest
Source
npmnpm
Version
1.0.9
Version published
Maintainers
1
Created
Source

@doderasoftware/vue-stepper

A headless, accessible, and fully customizable multi-step stepper component for Vue 3. Build complex forms, wizards, and onboarding flows with ease.

npm version License: MIT GitHub Documentation

📖 Documentation | 📦 npm | 🐛 Issues

✨ Features

  • 🎨 Fully Customizable - Complete UI control via :ui prop system
  • 🌙 Dark Mode - Built-in dark mode support (follows system preference)
  • 📱 Responsive - Sidebar collapses on mobile with dropdown menu
  • 🔒 Step Locking - Prevent navigation to specific steps
  • ⏭️ Optional Steps - Mark steps as optional with visual indicators
  • 📊 Progress Tracking - Automatic step counters and progress bars
  • 🎯 TypeScript - Full type safety out of the box
  • 🪶 Zero Dependencies - No external CSS frameworks required
  • 🎛️ Headless Ready - Use your own styles or the built-in ones

📦 Installation

npm install @doderasoftware/vue-stepper

That's it! Styles are automatically included - no additional CSS imports needed.

🚀 Quick Start

<template>
  <Stepper
    v-model="currentStep"
    :steps="steps"
    :can-go-next="canProceed"
    sidebar-title="Registration"
    @complete="handleComplete"
  >
    <template #default="{ currentStep: stepIndex }">
      <PersonalInfo v-if="stepIndex === 0" v-model="formData.personal" />
      <AccountDetails v-else-if="stepIndex === 1" v-model="formData.account" />
      <Review v-else-if="stepIndex === 2" :data="formData" />
    </template>
  </Stepper>
</template>

<script setup lang="ts">
import { ref, computed } from 'vue'
import { Stepper } from '@doderasoftware/vue-stepper'

const currentStep = ref(0)
const formData = ref({ personal: {}, account: {} })

const steps = [
  { category: 'Step 1', title: 'Personal Info', description: 'Enter your personal details' },
  { category: 'Step 2', title: 'Account Details', optional: true },
  { category: 'Step 3', title: 'Review & Submit' },
]

const canProceed = computed(() => {
  if (currentStep.value === 0) {
    return !!formData.value.personal.email
  }
  return true
})

function handleComplete() {
  console.log('Form submitted:', formData.value)
}
</script>

🌙 Dark Mode

The component includes full dark mode support out of the box. It uses class-based dark mode - add the dark class to your <html> or <body> element to enable dark styles.

<!-- Enable dark mode via class on html/body -->
<html class="dark">
  ...
</html>

This approach is compatible with most dark mode implementations (Tailwind, manual toggle, etc.).

🎨 UI Customization

The :ui prop allows complete control over every element's styling. Pass class names to override the defaults:

<template>
  <Stepper
    v-model="currentStep"
    :steps="steps"
    :ui="{
      root: 'my-stepper',
      sidebar: 'bg-indigo-50 border-indigo-200',
      navItemCurrent: 'bg-indigo-600 text-white',
      indicatorCompleted: 'bg-indigo-600',
      buttonPrimary: 'bg-gradient-to-r from-indigo-500 to-purple-600 hover:from-indigo-600 hover:to-purple-700',
      progressFill: 'bg-indigo-600',
    }"
  >
    <!-- your content -->
  </Stepper>
</template>

Available UI Keys

KeyDescription
rootRoot container
sidebarDesktop sidebar container
sidebarContentSidebar inner content
sidebarTitleSidebar title text
navNavigation container
navItemStep button - base
navItemCurrentStep button - current
navItemCompletedStep button - completed
navItemDisabledStep button - disabled
indicatorStep indicator - base
indicatorCurrentStep indicator - current
indicatorCompletedStep indicator - completed
indicatorDisabledStep indicator - disabled
stepCategoryStep category text
stepTitleStep title text
progressBarProgress bar track
progressFillProgress bar fill
mainMain content area
cardContent card
navigationNavigation buttons container
buttonButton base
buttonPrimaryPrimary button (next/complete)
buttonSecondarySecondary button (back)
buttonDisabledDisabled button state

📋 Props

PropTypeDefaultDescription
modelValuenumber0Current step index (v-model)
stepsStepConfig[]requiredArray of step configurations
uiStepperUI{}UI customization object
sidebarTitlestring'Steps'Title displayed above the sidebar
canGoNextbooleantrueWhether user can proceed to next step
nextButtonTextstring'Continue'Text for the next button
backButtonTextstring'Back'Text for the back button
completeButtonTextstring'Complete'Text for the final step button
showNavigationbooleantrueShow/hide navigation buttons
showProgressbooleantrueShow/hide progress indicator
showMobileHeaderbooleantrueShow/hide mobile header
showSidebarbooleantrueShow/hide desktop sidebar
linearbooleantrueRestrict navigation to sequential steps only

📡 Events

EventPayloadDescription
update:modelValuenumberEmitted when step index changes
step-change{ from: number, to: number }Emitted on step navigation
nextStepChangeEventEmitted when next button is clicked
backStepChangeEventEmitted when back button is clicked
completevoidEmitted when completing the last step

🎰 Slots

SlotPropsDescription
default{ currentStep, currentStepConfig, goNext, goBack, ... }Main content area
header-Content above the step container
title-Title area inside step container
sidebar-header-Custom sidebar header
sidebar-footer-Custom sidebar footer
step-indicator{ step, index, isCurrent, isCompleted, isDisabled }Custom step indicator
back-icon-Custom back button icon
next-icon-Custom next button icon

📐 Step Configuration

interface StepConfig {
  id?: string | number
  category: string
  title: string
  disabled?: boolean
  optional?: boolean
}

🪝 Composable

Use the useMultiStep composable for headless control:

import { useMultiStep } from '@doderasoftware/vue-stepper'

const {
  currentStep,
  isFirstStep,
  isLastStep,
  progress,
  goNext,
  goBack,
  goToStep,
  isStepCompleted,
  reset,
} = useMultiStep({
  steps: mySteps,
  initialStep: 0,
  linear: true,
  onStepChange: ({ from, to }) => console.log(`Step changed from ${from} to ${to}`),
})

📄 License

MIT © Dodera Software SRL

Keywords

vue

FAQs

Package last updated on 28 Nov 2025

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts