Skip to content

Repository files navigation

العربيةDeutschEnglishEspañolFrançaisItaliano日本語한국어NederlandsPolskiPortuguês (BR)РусскийTürkçe简体中文

Escalated

TestsnpmVue 3License: MIT

Escalated — support tickets, built into your app

Escalated is an embeddable support ticket system with SLA tracking, escalation rules, agent workflows, and a customer portal. This repo contains all the shared frontend assets (Vue 3 + Inertia.js) used across every supported backend framework.

👉 Learn more, view demos, and compare Cloud vs Self-Hosted options athttps://escalated.dev

You don't install this package directly. Start with the backend package for your framework — it handles everything including pulling in these frontend assets.

Escalated demo: filing a ticket and replying from the agent inbox

Features

  • Ticket splitting — Split a reply into a new standalone ticket while preserving context
  • Ticket snooze — Snooze tickets with presets (1h, 4h, tomorrow, next week) and automatic wake
  • Saved views / custom queues — Save, name, and share filter presets as reusable ticket views
  • Embeddable support widget — Drop-in <script> widget with KB search, ticket form, and status check
  • Real-time updates — WebSocket support (Pusher/Reverb/Soketi) with automatic polling fallback
  • Knowledge base toggle — Enable or disable the public knowledge base from admin settings
  • CI: ESLint + Prettier — Automated code style enforcement on every pull request

Get Started

Pick your framework:

FrameworkRepoInstall
Laravelescalated-dev/escalated-laravelcomposer require escalated-dev/escalated-laravel
Railsescalated-dev/escalated-railsgem "escalated"
Djangoescalated-dev/escalated-djangopip install escalated-django
AdonisJSescalated-dev/escalated-adonisnpm install @escalated-dev/escalated-adonis
WordPressescalated-dev/escalated-wordpressDownload escalated.zip
Filamentescalated-dev/escalated-filamentcomposer require escalated-dev/escalated-filament
React Nativeescalated-dev/escalated-react-nativenpm install @escalated-dev/escalated-react-native
Flutterescalated-dev/escalated-flutterSee pubspec.yaml setup

Each backend repo has full setup instructions — install command, migrations, config, and frontend integration.

Tailwind CSS

Escalated components use Tailwind CSS utility classes (~hundreds of them across 140+ Vue files). Some Tailwind-compatible class processor must be available in the host app for the UI to render correctly — without one, every component renders as unstyled DOM with class names that don't resolve to any CSS.

Recommended: Tailwind in your existing build

If your host app already uses Tailwind via Vite / PostCSS / Tailwind CLI, just add this package to your content config so its classes aren't purged:

// tailwind.config.jsexportdefault{content: [// ... your existing paths'./node_modules/@escalated-dev/escalated/src/**/*.vue',],}

Tailwind 4+ users:content globs are auto-detected from imported modules — you usually don't need to add anything. Skip this step if you're on v4.

Using Escalated without a Tailwind build step

If you don't want a Tailwind toolchain in your build pipeline, you have a few options. Each has trade-offs — pick the one closest to your project's constraints:

OptionWhen to useHow
Tailwind Play CDNPrototyping, internal tools, demos. Not recommended for production (no purging, ~3 MB script tag).Add <script src="https://cdn.tailwindcss.com"></script> to the page that renders Escalated. The CDN script JIT-compiles classes at runtime.
Tailwind standalone CLIYou want a static stylesheet without npm/Vite.Download the standalone CLI binary and run tailwindcss -i input.css -o public/escalated.css --content './node_modules/@escalated-dev/escalated/src/**/*.vue' --minify. Link the output stylesheet from your page.
UnoCSS / Twind in attributify modeAlready using one of these atomic-CSS engines.Configure with the Tailwind preset (@unocss/preset-wind or @twind/preset-tailwind) and add the Escalated package path to the engine's scan config. Class semantics match.
Forking with hand-rolled CSSYou categorically cannot ship any Tailwind-compatible tooling and are willing to maintain a fork.Replace utility classes with scoped CSS per component. Substantial effort; not officially supported.

If none of these fit, please open a discussion so we can understand the constraint and consider a pre-compiled CSS distribution.

Whatever path you choose, also make sure the theme tokens (CSS custom properties) are applied — those control colour, spacing, and radius and are independent of Tailwind.

Theming

Escalated renders inside a standalone layout by default. To integrate it into your app's design system, use the EscalatedPlugin:

import{createApp}from'vue'import{EscalatedPlugin}from'@escalated-dev/escalated'importAppLayoutfrom'@/Layouts/AppLayout.vue'constapp=createApp(...)app.use(EscalatedPlugin,{layout: AppLayout,theme: {primary: '#3b82f6',radius: '0.75rem',}})

Layout Integration

Pass your app's layout component and all Escalated pages render inside it automatically. The layout component must accept a #header slot and a default slot:

<!-- Your layout must support these slots -->
<template>
<div>
<nav>...</nav>
<header><slotname="header" /></header>
<main><slot /></main>
</div>
</template>

When no layout is provided, Escalated uses its own built-in navigation bar.

CSS Custom Properties

The theme option sets CSS custom properties you can reference in your own styles:

PropertyDefaultDescription
--esc-primary#4f46e5Primary action color
--esc-primary-hoverauto-darkenedPrimary hover color
--esc-radius0.5remBorder radius for inputs and buttons
--esc-radius-lgauto-scaledBorder radius for cards and panels
--esc-font-familyinheritFont family override

Framework Examples

Laravel (Inertia + Vue 3):

import{EscalatedPlugin}from'@escalated-dev/escalated'importAuthenticatedLayoutfrom'@/Layouts/AuthenticatedLayout.vue'app.use(EscalatedPlugin,{layout: AuthenticatedLayout})

Rails (Inertia + Vue 3):

import{EscalatedPlugin}from'@escalated-dev/escalated'importAppLayoutfrom'@/layouts/AppLayout.vue'app.use(EscalatedPlugin,{layout: AppLayout})

Django (Inertia + Vue 3):

import{EscalatedPlugin}from'@escalated-dev/escalated'importBaseLayoutfrom'@/layouts/BaseLayout.vue'app.use(EscalatedPlugin,{layout: BaseLayout})

AdonisJS (Inertia + Vue 3):

import{EscalatedPlugin}from'@escalated-dev/escalated'importAppLayoutfrom'@/layouts/AppLayout.vue'app.use(EscalatedPlugin,{layout: AppLayout})

What's in This Repo

All the Vue 3 + Inertia.js components that power the Escalated UI. These are identical across Laravel, Rails, Django, and AdonisJS — the backend framework renders them via Inertia.

📸 Screenshots

Screenshots are auto-generated from Storybook via the component-screenshots workflow.

Admin Panel (Dark)
Escalated Admin Panel — dark mode with sidebar navigation, KPI cards, stats, and ticket list

Admin Panel (Light)
Escalated Admin Panel — light mode with sidebar navigation, KPI cards, stats, and ticket list

Ticket Queue
Escalated Ticket Queue — agent ticket list with filters, search, bulk actions, and SLA indicators

Agent Panel
Escalated Agent Panel — top navigation, stats, and assigned ticket queue

Ticket Detail View
Escalated Ticket Detail View — conversation thread, reply composer, and ticket sidebar with SLA timer

Pages

Customer Portal — Self-service ticket management

  • pages/Customer/Index.vue — Ticket list with status filters and search
  • pages/Customer/Create.vue — New ticket form with file attachments
  • pages/Customer/Show.vue — Ticket detail with reply thread

Agent Dashboard — Ticket queue and workflows

  • pages/Agent/Dashboard.vue — Stats overview and recent tickets
  • pages/Agent/TicketIndex.vue — Filterable ticket queue
  • pages/Agent/TicketShow.vue — Full ticket view with sidebar, internal notes, canned responses

Admin Panel — System configuration

  • pages/Admin/Reports.vue — Analytics dashboard
  • pages/Admin/Departments/ — Department CRUD
  • pages/Admin/SlaPolicies/ — SLA policy management
  • pages/Admin/EscalationRules/ — Escalation rule builder
  • pages/Admin/Tags/ — Tag management
  • pages/Admin/CannedResponses/ — Canned response templates

Shared Components

Reusable building blocks used across the pages above.

ComponentDescription
StatusBadgeColored badge for ticket status
PriorityBadgeColored badge for ticket priority
TicketListPaginated ticket table
ReplyThreadChronological reply display
ReplyComposerReply/note editor with file upload and canned response insertion
ActivityTimelineAudit log of ticket events
SlaTimerSLA countdown with breach/warning states
TicketFiltersStatus, priority, agent, department filter bar
TicketSidebarTicket detail sidebar (status, SLA, tags, activity)
AssigneeSelectAgent assignment dropdown
TagSelectMulti-select tag picker
FileDropzoneDrag-and-drop file upload
AttachmentListFile attachment display with download links
StatsCardMetric card with label, value, and trend
EscalatedLayoutTop-level layout with navigation (supports host layout injection)
BulkActionBarToolbar for batch operations on selected tickets
QuickFiltersOne-click filter chips (My Tickets, Unassigned, Urgent, SLA Breaching)
MacroDropdownDropdown to apply multi-step macros to a ticket
FollowButtonToggle button to follow/unfollow a ticket
SatisfactionRating1-5 star CSAT rating input with optional comment
KeyboardShortcutHelpModal overlay showing all available keyboard shortcuts
PinnedNotesDisplay pinned internal notes at the top of the thread
PresenceIndicatorReal-time indicator showing who is viewing a ticket

Composables

ComposableDescription
useKeyboardShortcutsRegisters and manages keyboard shortcuts for ticket actions

Plugin

ExportDescription
EscalatedPluginVue plugin for layout injection and CSS theming

Plugin Development

Escalated supports framework-agnostic plugins built with the Plugin SDK. Plugins are written once in TypeScript and work across all Escalated backends.

How the Frontend Plugin System Works

The frontend uses defineEscalatedPlugin() to register Vue components — custom admin pages, ticket sidebar widgets, or dashboard panels — that are mounted automatically when the plugin is active.

import{defineEscalatedPlugin}from'@escalated-dev/escalated'importMySettingsPagefrom'./MySettingsPage.vue'exportdefaultdefineEscalatedPlugin({name: 'my-plugin',pages: {'admin/my-plugin/settings': MySettingsPage,},})

How It Connects to the Backend

The backend uses definePlugin() from the Plugin SDK to handle TypeScript business logic — subscribing to ticket lifecycle hooks, exposing API endpoints, and persisting data. The frontend and backend entries work together as a single npm package.

// backend entry (index.ts)import{definePlugin}from'@escalated-dev/plugin-sdk'exportdefaultdefinePlugin({name: 'my-plugin',version: '1.0.0',actions: {'ticket.created': async(event,ctx)=>{ctx.log.info('New ticket!',event)},},})

Quick Example: Both Entry Points

A published plugin package typically exports both:

my-plugin/
index.ts ← backend: definePlugin() for TypeScript logic
frontend.ts ← frontend: defineEscalatedPlugin() for Vue components

The backend framework (Laravel, Rails, Django, AdonisJS) loads index.ts via the Plugin Runtime. The Vue app imports frontend.ts and registers it with app.use().

Installing Plugins

npm install @escalated-dev/plugin-slack
npm install @escalated-dev/plugin-jira

Resources

For Package Maintainers

If you're building a new backend integration, this package is available on npm:

npm install @escalated-dev/escalated
// Import the pluginimport{EscalatedPlugin}from'@escalated-dev/escalated'// Import individual componentsimport{StatusBadge,SlaTimer}from'@escalated-dev/escalated'// Or reference pages directly for Inertia resolutionimportCustomerIndexfrom'@escalated-dev/escalated/pages/Customer/Index.vue'

Peer dependencies: vue ^3.3.0, @inertiajs/vue3 ^1.0.0 || ^2.0.0

Ecosystem

This is the shared frontend for the Escalated support ticket system. Host framework packages and client SDKs available across the ecosystem:

License

MIT

About

Escalated is an open-source, embeddable support ticket system with a shared Inertia.js UI that runs natively inside Laravel, Ruby on Rails, and Django applications.

Resources

Security policy

Stars

37 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages