A comprehensive Vue.js 2.0 component library providing 90 UI components for building modern web applications
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
User feedback mechanisms including alerts, messages, notifications, loading states, and confirmation dialogs for interactive communication.
Alert messages for displaying important information with different severity levels and closable functionality.
/**
* Alert component for important messages
*/
const Alert = Vue.component;
interface AlertProps {
title?: string;
type?: 'success' | 'warning' | 'info' | 'error';
description?: string;
closable?: boolean;
center?: boolean;
closeText?: string;
showIcon?: boolean;
effect?: 'light' | 'dark';
}Usage Examples:
// Basic alerts
<el-alert title="Success alert" type="success"></el-alert>
<el-alert title="Info alert" type="info"></el-alert>
<el-alert title="Warning alert" type="warning"></el-alert>
<el-alert title="Error alert" type="error"></el-alert>
// Alert with description
<el-alert
title="Success alert"
type="success"
description="More text description"
show-icon>
</el-alert>
// Closable alert
<el-alert
title="Closable alert"
type="success"
closable
@close="handleClose">
</el-alert>
// Alert with custom close text
<el-alert
title="Custom close text"
type="info"
close-text="Gotcha"
@close="handleClose">
</el-alert>Modal dialogs for user interaction with customizable content, size, and behavior.
/**
* Modal dialog component
*/
const Dialog = Vue.component;
interface DialogProps {
visible?: boolean;
title?: string;
width?: string | number;
fullscreen?: boolean;
top?: string;
modal?: boolean;
modalAppendToBody?: boolean;
appendToBody?: boolean;
lockScroll?: boolean;
customClass?: string;
closeOnClickModal?: boolean;
closeOnPressEscape?: boolean;
showClose?: boolean;
beforeClose?: Function;
center?: boolean;
destroyOnClose?: boolean;
}Usage Examples:
// Basic dialog
<el-dialog
title="Tips"
:visible.sync="dialogVisible"
width="30%"
:before-close="handleClose">
<span>This is a message</span>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">Cancel</el-button>
<el-button type="primary" @click="dialogVisible = false">Confirm</el-button>
</span>
</el-dialog>
// Custom content dialog
<el-dialog title="Form" :visible.sync="dialogFormVisible">
<el-form :model="form">
<el-form-item label="Name" :label-width="formLabelWidth">
<el-input v-model="form.name" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="Zone" :label-width="formLabelWidth">
<el-select v-model="form.region" placeholder="Please select a zone">
<el-option label="Zone 1" value="shanghai"></el-option>
<el-option label="Zone 2" value="beijing"></el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">Cancel</el-button>
<el-button type="primary" @click="dialogFormVisible = false">Confirm</el-button>
</div>
</el-dialog>
// Nested dialog
<el-dialog title="Outer Dialog" :visible.sync="outerVisible">
<el-dialog
width="30%"
title="Inner Dialog"
:visible.sync="innerVisible"
append-to-body>
</el-dialog>
<div slot="footer" class="dialog-footer">
<el-button @click="outerVisible = false">Cancel</el-button>
<el-button type="primary" @click="innerVisible = true">open inner Dialog</el-button>
</div>
</el-dialog>Slide-out panel for displaying additional content or forms without leaving the current page context.
/**
* Drawer component for slide-out panels
*/
const Drawer = Vue.component;
interface DrawerProps {
appendToBody?: boolean;
beforeClose?: Function;
closeOnPressEscape?: boolean;
customClass?: string;
destroyOnClose?: boolean;
modal?: boolean;
direction?: 'rtl' | 'ltr' | 'ttb' | 'btt';
showClose?: boolean;
size?: string | number;
title?: string;
visible?: boolean;
wrapperClosable?: boolean;
withHeader?: boolean;
}Usage Examples:
// Basic drawer
<el-drawer
title="I am the title"
:visible.sync="drawer"
direction="rtl"
size="30%">
<span>Hi, there!</span>
</el-drawer>
// Drawer with form
<el-drawer
title="Create a new article"
:visible.sync="drawer"
direction="rtl"
:before-close="handleClose">
<div class="demo-drawer__content">
<el-form :model="form">
<el-form-item label="Title" :label-width="formLabelWidth">
<el-input v-model="form.name" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="Author" :label-width="formLabelWidth">
<el-input v-model="form.region" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<div class="demo-drawer__footer">
<el-button @click="cancelForm">Cancel</el-button>
<el-button type="primary" @click="$refs.drawer.closeDrawer()" :loading="loading">{{ loading ? 'Submitting ...' : 'Submit' }}</el-button>
</div>
</div>
</el-drawer>
// Multiple drawers
<el-drawer
title="I'm outer Drawer"
:visible.sync="drawer">
<div>
<el-button @click="innerDrawer = true" type="primary" style="margin-left: 16px;">
Click me!
</el-button>
<el-drawer
title="I'm inner Drawer"
:append-to-body="true"
:before-close="handleClose"
:visible.sync="innerDrawer">
<p>_(:зゝ∠)_</p>
</el-drawer>
</div>
</el-drawer>Contextual overlays for displaying additional information or interactive content on hover or click.
/**
* Popover component for contextual content
*/
const Popover = Vue.component;
interface PopoverProps {
trigger?: 'click' | 'focus' | 'hover' | 'manual';
title?: string;
content?: string;
width?: string | number;
placement?: 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end';
disabled?: boolean;
value?: boolean;
offset?: number;
transition?: string;
visibleArrow?: boolean;
popperOptions?: object;
popperClass?: string;
openDelay?: number;
closeDelay?: number;
tabindex?: number;
}
/**
* Tooltip component for simple contextual information
*/
const Tooltip = Vue.component;
interface TooltipProps {
effect?: 'dark' | 'light';
content?: string;
placement?: 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end';
value?: boolean;
disabled?: boolean;
offset?: number;
transition?: string;
visibleArrow?: boolean;
popperOptions?: object;
openDelay?: number;
manual?: boolean;
popperClass?: string;
enterable?: boolean;
hideAfter?: number;
tabindex?: number;
}
/**
* Popconfirm component for confirmation actions
*/
const Popconfirm = Vue.component;
interface PopconfirmProps {
title?: string;
confirmButtonText?: string;
cancelButtonText?: string;
confirmButtonType?: 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'text';
cancelButtonType?: 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'text';
icon?: string;
iconColor?: string;
hideIcon?: boolean;
}Usage Examples:
// Basic popover
<el-popover
placement="top-start"
title="Title"
width="200"
trigger="hover"
content="this is content, this is content, this is content">
<el-button slot="reference">Hover to activate</el-button>
</el-popover>
// Popover with custom content
<el-popover
placement="right"
width="400"
trigger="click">
<el-table :data="gridData">
<el-table-column width="150" property="date" label="date"></el-table-column>
<el-table-column width="100" property="name" label="name"></el-table-column>
<el-table-column width="300" property="address" label="address"></el-table-column>
</el-table>
<el-button slot="reference">Click to activate</el-button>
</el-popover>
// Tooltip
<el-tooltip class="item" effect="dark" content="Top Left prompts info" placement="top-start">
<el-button>top-start</el-button>
</el-tooltip>
// Popconfirm
<el-popconfirm
confirm-button-text='OK'
cancel-button-text='No, Thanks'
icon="el-icon-info"
icon-color="red"
title="Are you sure to delete this?"
@confirm="confirmEvent"
@cancel="cancelEvent">
<el-button slot="reference">Delete</el-button>
</el-popconfirm>Loading indicators and overlays for showing operation progress and preventing user interaction during async operations.
/**
* Loading spinner component
*/
const Loading = Vue.component;
/**
* Spinner component for simple loading indicators
*/
const Spinner = Vue.component;
/**
* Skeleton component for content placeholders
*/
const Skeleton = Vue.component;
interface SkeletonProps {
animated?: boolean;
count?: number;
loading?: boolean;
rows?: number;
throttle?: number;
}
/**
* Individual skeleton item
*/
const SkeletonItem = Vue.component;
interface SkeletonItemProps {
variant?: 'p' | 'text' | 'h1' | 'h3' | 'caption' | 'button' | 'image' | 'circle' | 'rect';
}
// Loading service interface
interface LoadingService {
(options?: LoadingOptions): LoadingInstance;
service(options?: LoadingOptions): LoadingInstance;
directive: Vue.DirectiveOptions;
}
interface LoadingOptions {
target?: HTMLElement | string;
body?: boolean;
fullscreen?: boolean;
lock?: boolean;
text?: string;
spinner?: string;
background?: string;
customClass?: string;
}
interface LoadingInstance {
close(): void;
}Usage Examples:
// Loading directive
<el-table
v-loading="loading"
element-loading-text="Loading..."
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 0, 0, 0.8)"
:data="tableData"
style="width: 100%">
</el-table>
// Loading service
openFullScreen1() {
const loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
setTimeout(() => {
loading.close();
}, 2000);
}
// Loading on specific element
openFullScreen2() {
this.$loading({
target: '.loading-area',
text: 'Loading...'
});
}
// Skeleton placeholder
<el-skeleton :loading="loading" animated>
<template slot="template">
<el-skeleton-item variant="image" style="width: 240px; height: 240px;" />
<div style="padding: 14px;">
<el-skeleton-item variant="p" style="width: 50%" />
<div style="display: flex; align-items: center; justify-items: space-between;">
<el-skeleton-item variant="text" style="margin-right: 16px;" />
<el-skeleton-item variant="text" style="width: 30%;" />
</div>
</div>
</template>
<template>
<el-card :body-style="{ padding: '0px' }">
<img src="https://shadow.elemecdn.com/app/element/hamburger.9cf7b091-55e9-11e9-a976-7f4d0b07eef6.png" class="image" />
<div style="padding: 14px;">
<span>Yummy hamburger</span>
<div class="bottom clearfix">
<time class="time">{{ currentDate }}</time>
<el-button type="text" class="button">Operating button</el-button>
</div>
</div>
</el-card>
</template>
</el-skeleton>Collapsible content areas for organizing and showing/hiding sections of information.
/**
* Collapse container for collapsible content
*/
const Collapse = Vue.component;
interface CollapseProps {
value?: string | array;
accordion?: boolean;
}
/**
* Individual collapse panel
*/
const CollapseItem = Vue.component;
interface CollapseItemProps {
name?: string | number;
title?: string;
disabled?: boolean;
}Usage Examples:
// Basic collapse
<el-collapse v-model="activeNames" @change="handleChange">
<el-collapse-item title="Consistency" name="1">
<div>Consistent with real life: in line with the process and logic of real life, and comply with languages and habits that the users are used to;</div>
<div>Consistent within interface: all elements should be consistent, such as: design style, icons and texts, position of elements, etc.</div>
</el-collapse-item>
<el-collapse-item title="Feedback" name="2">
<div>Operation feedback: enable the users to clearly perceive their operations by style updates and interactive effects;</div>
<div>Visual feedback: reflect current state by updating or rearranging elements of the page.</div>
</el-collapse-item>
</el-collapse>
// Accordion mode
<el-collapse v-model="activeName" accordion>
<el-collapse-item title="Consistency" name="1">
Content 1
</el-collapse-item>
<el-collapse-item title="Feedback" name="2">
Content 2
</el-collapse-item>
</el-collapse>
// Custom title content
<el-collapse accordion>
<el-collapse-item name="1">
<template slot="title">
Consistency<i class="header-icon el-icon-info"></i>
</template>
<div>Efficient: save time</div>
</el-collapse-item>
<el-collapse-item title="Feedback" name="2">
<div>Clear</div>
</el-collapse-item>
</el-collapse>Image or content carousel for displaying multiple items in a rotating slideshow format.
/**
* Carousel container for slideshow content
*/
const Carousel = Vue.component;
interface CarouselProps {
height?: string;
initialIndex?: number;
trigger?: 'hover' | 'click';
autoplay?: boolean;
interval?: number;
indicatorPosition?: 'outside' | 'none';
indicator?: boolean;
arrow?: 'always' | 'hover' | 'never';
type?: 'card';
loop?: boolean;
direction?: 'horizontal' | 'vertical';
}
/**
* Individual carousel item
*/
const CarouselItem = Vue.component;
interface CarouselItemProps {
name?: string;
label?: string;
}Usage Examples:
// Basic carousel
<el-carousel height="150px">
<el-carousel-item v-for="item in 4" :key="item">
<h3 class="small">{{ item }}</h3>
</el-carousel-item>
</el-carousel>
// Carousel with indicators
<el-carousel indicator-position="outside">
<el-carousel-item v-for="item in 4" :key="item">
<h3>{{ item }}</h3>
</el-carousel-item>
</el-carousel>
// Card mode carousel
<el-carousel type="card" height="200px">
<el-carousel-item v-for="item in 6" :key="item">
<h3 class="medium">{{ item }}</h3>
</el-carousel-item>
</el-carousel>
// Vertical carousel
<el-carousel height="200px" direction="vertical" :autoplay="false">
<el-carousel-item v-for="item in 3" :key="item">
<h3 class="medium">{{ item }}</h3>
</el-carousel-item>
</el-carousel>Floating action button for quickly scrolling back to the top of the page.
/**
* Back to top button component
*/
const Backtop = Vue.component;
interface BacktopProps {
target?: string;
visibilityHeight?: number;
right?: number;
bottom?: number;
}Usage Examples:
// Basic back to top
<el-backtop></el-backtop>
// Custom position and trigger height
<el-backtop :bottom="100">
<div
style="{
height: 100%;
width: 100%;
background-color: #f2f5f6;
box-shadow: 0 0 6px rgba(0,0,0, .12);
text-align: center;
line-height: 40px;
color: #1989fa;
}"
>
UP
</div>
</el-backtop>
// Target specific container
<el-backtop target=".page-component__scroll .el-scrollbar__wrap"></el-backtop>Install with Tessl CLI
npx tessl i tessl/npm-element-ui