vue-winbox-no-types
Version:
A wrapper component for WinBox.js with the ability to mount Vue components.
217 lines (169 loc) • 5.16 kB
Markdown
# vue-winbox
A wrapper component for [WinBox.js](https://github.com/nextapps-de/winbox) with the ability to mount Vue components.
Demo: https://wobsoriano.github.io/vue-winbox/
## Install
```bash
yarn add vue-winbox
```
## Usage (Vue 3)
`VueWinBox` works out-of-the-box using the native [teleport](https://v3.vuejs.org/api/built-in-components.html#teleport) component.
```html
<template>
<VueWinBox ref="winboxRef" :options="options" ="onMove">
<div>Window 1: {{ count }}</div>
</VueWinBox>
<VueWinBox ref="winboxRef2" :options="options" ="onMove">
<div>Window 2: {{ count }}</div>
</VueWinBox>
</template>
<script>
import { defineComponent, ref } from 'vue'
import VueWinBox from 'vue-winbox'
export default defineComponent({
components: { VueWinBox },
setup() {
const count = ref(0)
const options = {
title: 'Current count: 0',
class: 'modern',
}
const winboxRef = ref()
const winboxRef2 = ref()
setInterval(() => {
count.value++
winboxRef.value?.winbox?.setTitle('Current count: ' + count.value)
winboxRef2.value?.winbox?.setTitle('Current count: ' + count.value)
}, 500)
return {
count,
options,
winboxRef,
winboxRef2,
onMove({ id }) {
// id is the unique id of the window
}
}
}
})
</script>
```
## Usage (Vue 2)
For Vue 2, [vue-simple-portal](https://github.com/LinusBorg/vue-simple-portal) is recommended. Just install it globally and it should work out-of-the-box without setting any additional props.
First, install the component together with the `composition-api` plugin.
```bash
yarn add /composition-api vue-simple-portal
```
Then import it in your `main.js` file.
```js
// main.js
import Vue from 'vue'
import VueCompositionAPI from '@vue/composition-api'
import VuePortal from '@linusborg/vue-simple-portal'
Vue.use(VueCompositionAPI)
Vue.use(VuePortal, {
name: 'portal', // optional, use to rename component
})
```
```html
<template>
<VueWinBox ref="winboxRef" :options="options">
<div>{{ count }}</div>
</VueWinBox>
</template>
<script>
import { defineComponent } from 'vue'
import VueWinBox from 'vue-winbox'
export default {
components: { VueWinBox },
data: () => ({
count: 0,
options: {
title: 'Current count: 0',
class: 'modern'
}
}),
mounted() {
setInterval(() => {
this.count++
this.$refs?.winboxRef?.winbox?.setTitle('Current count: ' + this.count)
}, 500)
}
}
</script>
```
## Props
Name | Type | Default | Description |
------ | ------ | ------ | ------ |
`options` | Object | [Reference](https://github.com/nextapps-de/winbox#options) | WinBox options. Applied only on mount. |
`portalComponent` | String | `portal` | Portal component name. Vue 2 only. |
`portalSelector` | String | `selector` | Portal component selector attribute. Vue 2 only. |
`portalAttributes` | Object | `{}` | Other attributes. Vue 2 only. |
## Methods
To update props and access methods/controls, just add a `ref` to the `VueWinBox` component and use it like how you would with `WinBox.js`:
```javascript
// Set the window title
this.$refs.winboxRef.winbox.setTitle('New title')
// Custom Position / Size
this.$refs.winboxRef.winbox.resize('50%', '50%').move('center', 'center')
// Add class
this.$refs.winboxRef.winbox.addClass('modern')
// Focus a window (bring up to front)
this.$refs.winboxRef.winbox.focus()
// Chaining Methods
this.$refs.winboxRef.winbox
.setTitle('Title')
.resize('50%', '50%')
.move('center', 'center')
.focus()
```
To reinitialize a closed window:
```javascript
this.$refs.winboxRef.initialize()
```
## Events
Name | Type | Default | Description |
------ | ------ | ------ | ------ |
`onresize` | Function | - | Fired when the window resizes. |
`onclose` | Function | - | Fired when the window is closing. |
`onfocus` | Function | - | Fired when the window is in focus. |
`onblur` | Function | - | - |
`onmove` | Function | - | Fired when the window moves. |
## Vanilla WinBox.js
Vue 3 users can create a new vanilla `WinBox.js` window using a composable.
```javascript
import { useWinBox } from 'vue-winbox'
export default defineComponent({
setup() {
const createWindow = useWinBox()
const generate = () => {
const winbox = createWindow({
title: 'Window title',
...
})
winbox.fullscreen()
}
return {
generate
}
}
})
```
Vue 2 users can create via `$WinBox` global variable.
```javascript
export default {
methods: {
generate() {
const winbox = this.$WinBox({
title: 'Window title',
...
})
winbox.fullscreen()
}
}
}
```
## Credits
- [WinBox.js](https://github.com/nextapps-de/winbox) - Modern HTML5 window manager for the web.
- [vue-demi](https://github.com/vueuse/vue-demi/) - Creates Universal Library for Vue 2 & 3
## License
MIT - Copyright (c) 2021 [Robert Soriano](https://github.com/wobsoriano)