Basic example
Collapse contents Here
Accordion support
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore VHS.
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore VHS.
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore VHS.
Unfortunately, the design page you are looking for is not ready yet. But you might want to switch to the implementation tab. There you will find the corresponding Vue component and a description of the different use cases and what to consider when implementing it.
If you have any questions, suggestions or ideas for improvement right now, please feel free to contact us directly.
via Slack: #wescale-wui-public
via Mail: wescale-wui@wescale.com
Stay tuned!
Description
Easily toggle visibility of almost any content on your pages in a vertically collapsing container. Includes support for making accordions. Visibility can be easily toggled with our
v-w-toggle
directive, or viav-model
.
<div>
<wui-button v-w-toggle.collapse-1 variant="primary"
>Toggle Collapse</wui-button
>
<wui-collapse id="collapse-1" class="mt-2">
<div>
<p class="card-text">Collapse contents Here</p>
<wui-button v-w-toggle.collapse-1-inner size="sm"
>Toggle Inner Collapse</wui-button
>
<wui-collapse id="collapse-1-inner" class="mt-2">
<div>Hello!</div>
</wui-collapse>
</div>
</wui-collapse>
</div>
<!-- wui-collapse.vue -->
Usage
Other elements can easily toggle <wui-collapse>
components using the v-w-toggle
directive.
<div>
<!-- Using modifiers -->
<wui-button v-w-toggle.collapse-2 class="m-1">Toggle Collapse</wui-button>
<!-- Using value -->
<wui-button v-w-toggle="'collapse-2'" class="m-1">Toggle Collapse</wui-button>
<!-- Element to collapse -->
<wui-collapse id="collapse-2">
<div>I am collapsible content!</div>
</wui-collapse>
</div>
<!-- wui-collapse-usage.vue -->
See the v-w-toggle
directive documentation for detailed usage information.
Initial visibility (start expanded)
To make the <wui-collapse>
show initially, set the visible
prop:
<div>
<wui-button v-w-toggle.collapse-3 class="m-1">Toggle Collapse</wui-button>
<wui-collapse visible id="collapse-3">
<div>I should start open!</div>
</wui-collapse>
</div>
<!-- wui-collapse-visible.vue -->
By default, an initially visible collapse will not animate on mount. To enable the collapse expanding animation on mount (when visible
or v-model
is true
), set the appear
prop on <wui-collapse>
.
v-model
support
The component's collapsed (visible) state can also be set with v-model
which binds internally to the visible
prop.
Note, when using v-model
to control <wui-collapse>
, the aria-*
attributes and class collapsed
are not automatically placed on the trigger button (as is the case when using the v-w-toggle
directive). In this example we must control the attributes ourselves for proper accessibility support.
<template>
<div>
<wui-button
:class="visible ? null : 'collapsed'"
:aria-expanded="visible ? 'true' : 'false'"
aria-controls="collapse-4"
@click="visible = !visible"
>
Toggle Collapse
</wui-button>
<wui-collapse id="collapse-4" v-model="visible" class="mt-2">
<div>I should start open!</div>
</wui-collapse>
</div>
</template>
<script>
export default {
data() {
return {
visible: true,
};
},
};
</script>
<!-- wui-collapse-v-model.vue -->
Trigger multiple collapse elements
You can even collapse multiple <wui-collapse>
components via a single v-w-toggle
by providing multiple target IDs using modifiers.
<div>
<!-- Via multiple directive modifiers -->
<wui-button v-w-toggle.collapse-a.collapse-b
>Toggle Collapse A and B</wui-button
>
<!-- Via space separated string of IDs passed to directive value -->
<wui-button v-w-toggle="'collapse-a collapse-b'"
>Toggle Collapse A and B</wui-button
>
<!-- Via array of string IDs passed to directive value -->
<wui-button v-w-toggle="['collapse-a', 'collapse-b']"
>Toggle Collapse A and B</wui-button
>
<!-- Elements to collapse -->
<wui-collapse id="collapse-a" class="mt-2">
<div>I am collapsible content A!</div>
</wui-collapse>
<wui-collapse id="collapse-b" class="mt-2">
<div>I am collapsible content B!</div>
</wui-collapse>
</div>
<!-- wui-collapse-trigger-multiple.vue -->
Accordion support
Turn a group of <wui-collapse>
components into an accordion by supplying an accordion group identifier via the accordion
prop. Note that only one collapse in an accordion group can be open at a time.
<template>
<div class="accordion" role="tablist">
<div no-body class="m-b-5">
<div class="p-5" role="tab">
<wui-button block v-w-toggle.accordion-1 variant="info"
>Accordion 1</wui-button
>
</div>
<wui-collapse
id="accordion-1"
visible
accordion="my-accordion"
role="tabpanel"
>
<div>
<span
>I start opened because <code>visible</code> is
<code>true</code></span
>
<span>{ text }</span>
</div>
</wui-collapse>
</div>
<div no-body class="m-b-5">
<div header-tag="header" class="p-5" role="tab">
<wui-button block v-w-toggle.accordion-2 variant="info"
>Accordion 2</wui-button
>
</div>
<wui-collapse id="accordion-2" accordion="my-accordion" role="tabpanel">
<div>
<span>{ text }</span>
</div>
</wui-collapse>
</div>
<div no-body class="m-b-5">
<div header-tag="header" class="p-5" role="tab">
<wui-button block v-w-toggle.accordion-3 variant="info"
>Accordion 3</wui-button
>
</div>
<wui-collapse id="accordion-3" accordion="my-accordion" role="tabpanel">
<div>
<span>{ text }</span>
</div>
</wui-collapse>
</div>
</div>
</template>
<script>
export default {
data() {
return {
text: `
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry
richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor
brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon
tempor, sunt aliqua put a bird on it squid single-origin coffee nulla
assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore
wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher
vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic
synth nesciunt you probably haven't heard of them accusamus labore VHS.
`,
};
},
};
</script>
<!-- b-accordion.vue -->
Notes:
- When using accordion mode, make sure you place the trigger elements and
<wui-collapse>
components inside an element withrole="tablist"
and setrole="tab"
on each trigger element's container (each trigger element should be wrapped) in order to help screen reader users navigate the accordion group. - If using the
v-model
feature of<wui-collapse>
in accordion mode, do not bind thev-model
orvisible
prop of all the collapses in the accordion group to the same variable! - Ensure, at most, only one
<wui-collapse>
in the accordion group has thevisible
prop and/orv-model
set totrue
. Only one collapse in an accordion group can be open at a time.
Hiding and showing content in the toggle button based on collapse state
When using the v-w-toggle
directive, the class collapsed
will automatically be placed on the trigger element when the collapse is closed, and removed when open. You can use this class to display or hide content within the toggle via custom CSS. The class not-collapsed
will be applied when the target(s) are not closed.
Example HTML markup:
<div>
<wui-button v-w-toggle:my-collapse>
<span class="when-open">Close</span><span class="when-closed">Open</span> My
Collapse
</wui-button>
<wui-collapse id="my-collapse">
<!-- Content here -->
</wui-collapse>
</div>
Example Custom CSS:
.collapsed > .when-open,
.not-collapsed > .when-closed {
display: none;
}
'Global' $root instance events
Using $root
instance it is possible to emit and listen events somewhere out of a component, where <wui-collapse>
is used. In short, $root
behaves like a global event emitters and listener. Details about $root
instance can be found in the official Vue docs.
Optionally scoped default slot
The default slot can be optionally scoped. The following scope properties are available:
Property | Type | Description |
---|---|---|
visible | Boolean | Visible state of the collapse |
close | Function | When called, will close the collapse |
Accessibility
The v-w-toggle
directive will automatically add the ARIA attributes aria-controls
and aria-expanded
to the component that the directive appears on (as well as add the class collapsed
when not expanded). aria-expanded
will reflect the state of the target <wui-collapse>
component, while aria-controls
will be set to the ID(s) of the target <wui-collapse>
component(s).
If using v-model
to set the visible state instead of the directive v-w-toggle
, you will be required to, on the toggle element, add the aria-controls
and other appropriate attributes and classes yourself.
While the v-w-toggle
directive can be placed on almost any HTML element or Vue component, it is recommended to use a button or link (or similar component) to act as your toggler. Otherwise your trigger elements may be inaccessible to keyboard or screen reader users. If you do place them on something other than a button or link (or similar component), you should add the attributes tabindex="0"
and role="button"
to allow users of assistive technology to reach your trigger element.
When using accordion mode, make sure you place the trigger elements and <wui-collapse>
components inside an element with role="tablist"
and set role="tab"
on each trigger element's container in order to help screen reader users navigate the accordion group. Unfortunately, WuiVue cannot apply those roles for you automatically, as it depends on your final document markup.
Note: The animation effect of this component is dependent on the prefers-reduced-motion
media query.
Component reference
<wui-collapse>
Properties
Property | Type | Default | Description |
---|---|---|---|
accordion | String | The name of the accordion group that this collapse belongs to | |
appear | Boolean | false | When set, and prop visible is true on mount, will animate on initial mount |
id | String | Used to set the id attribute on the rendered content, and used as the base to generate any additional element IDs as needed | |
is-nav | Boolean | false | When set, signifies that the collapse is part of a navbar, enabling certain features for navbar support |
tag | String | DIV | Specify the HTML tag to render instead of the default tag |
visible v-model | Boolean | false | When true , expands the collapse |
v-model
Property | Event |
---|---|
visible | input |
Slots
Name | Scope | Description |
---|---|---|
default | close - Function - Method for closing the collapsevisible - Boolean - Visible state of the collapse. true if the collapse is visible | Content to place in the Collapse |
Events
Event | Arguments | Description |
---|---|---|
hidden | Emitted when collapse has finished closing | |
hide | Emitted when collapse has started to close | |
input | visible - Will be true if the collapse is visible | Used to update the v-model |
show | Emitted when collapse has started to open | |
shown | Emitted when collapse has finished opening |
Importing individual components
You can import individual components into your project via the following named exports:
Component | Named Export |
---|---|
<wui-collapse> | WuiCollapse |
Example
import { WuiCollapse } from "@wui/wui-vue/lib/collapse";
Vue.component("wui-collapse", WuiCollapse);
Importing as a Vue.js plugin
This plugin includes all of the above listed individual components. Plugins also include any component aliases.
Named Export | Import Path |
---|---|
CollapsePlugin | @wui/wui-vue/lib/collapse |
Example
import { CollapsePlugin } from "@wui/wui-vue/lib/collapse";
Vue.use(CollapsePlugin);