A feature-rich Portal Plugin for Vue 2, for rendering DOM outside of a component, anywhere in your app or the entire document.

Overview

PortalVue

A Portal Component for Vuejs, to render DOM outside of a component, anywhere in the document.

PortalVue Logo

Buy Me a Coffee at ko-fi.com

For more detailed documentation and additional Information, please visit the docs.

Looking for version 1.*? Docs for version 1 are here

Installation

npm i portal-vue

# or

yarn add portal-vue
import PortalVue from 'portal-vue'
Vue.use(PortalVue)

Usage

<portal to="destination">
  <p>This slot content will be rendered wherever the <portal-target> with name 'destination'
    is  located.</p>
</portal>

<portal-target name="destination">
  <!--
  This component can be located anywhere in your App.
  The slot content of the above portal component will be rendered here.
  -->
</portal-target>

Nuxt module

Add portal-vue/nuxt to modules section of nuxt.config.js

{
  modules: ['portal-vue/nuxt']
}
Comments
  • Transition Support

    Transition Support

    This naive use case doesn't work for me:

          <transition name="fade">
            <portal-target name="title" slim @change="titleChange">
              Title
            </portal-target>
          </transition>
    

    After reading some of the code, I guess I'm not really sure why - I don't understand the transition component enough to speculate. Am I missing something?

    feature Priority:1 
    opened by dts 29
  • Nested portals

    Nested portals

    How can I have a portal inside a portal, both pointing to the same portal-target?

    I'm using PortalVue to display all my modal dialogs in a top-level div to avoid z-ordering issues.

    For this, I have a my-dialog component that defines a portal at its root:

    <template>
        <portal to="dialogs">
            <div class="dialog-mask">
                <div class="dialog-container">
                    ...
    

    And a single dialogs portal-target:

    <div id="app">
        ...
        <portal-target name="dialogs" multiple></portal-target>
        ....
    </div>
    

    Many of my components "include" a dialog (e.g. for their related messages, etc.). This leads to the case where, sometimes, a dialog can include another dialog (e.g. when an action button in the top-level dialog defines its own nested success/failure dialogs as part of its template).

    This leads to very weird behaviour in PortalVue. Sometimes, the component that defines the nested dialog will stop rendering when it gets opened. I created the following test case to try isolating the issue:

    <my-button @click="showOuter = true">Open Outer Dialog</my-button>
    	
    <my-dialog v-if="showOuter" title="Outer" @close="showOuter = false">
        <my-button @click="showInner = true">Open Inner Dialog</my-button>
    	
        <my-dialog v-if="showInner" title="Inner" @close="showInner = false">
            Inner
        </my-dialog>
    </my-dialog>
    

    This led to the following error (and infinite recursion) whenever the inner dialog is opened:

    [Error] [Vue warn]: You may have an infinite update loop in a component render function.
    found in
    ---> <PortalTarget>
               <Root>
           warn (app.js:24505)
           flushSchedulerQueue (app.js:26884)
           (anonymous function) (app.js:25738)
           flushCallbacks (app.js:25659)
           promiseReactionJob
    

    How would you advise to setup PortalVue in this case?

    enhancement PR welcome 
    opened by lazlo-bonin 19
  • Changes are not reactive when compiled with vueify

    Changes are not reactive when compiled with vueify

    <portal-target name="destination"></portal-target>
    
    <portal to="destination">
      <p>test {{dynamicValue}}</p>
    </portal>
    

    When dynamicValue changes, the content is not updated in the <portal-target> Is there currently any way to achieve this, or any plans to support this is future?

    bug PR welcome wontfix docs 
    opened by brad426 18
  • Support multiple portals sending content to one target at the same time

    Support multiple portals sending content to one target at the same time

    I'd like to be able to append multiple portals to single portal-target (like Jade-blocks does).

    Here are some examples:

    <portal-target name="under-nav">
      0
    </portal-target>
    <!-- if there are no "from-portals" content of portal-target is "0" -->
    
    <portal to="under-nav">
        1
    </portal>
    <!-- the default content is overwritten so portal-target is "1" now -->
    
    <portal to="under-nav" append="true">
        2
    </portal>
    <!-- appends to existing content => "12" -->
    
    <portal to="under-nav" prepend="true">
        3
    </portal>
    <!-- prepends to existing content => "312" -->
    

    My use-case.

    I have a page like: http://joxi.ru/E2pbGWvF98nNdr

    And I want to create under-nav panels dynamically: http://joxi.ru/DrlpJ7aFvJWw3r

    Proposal 
    opened by gleam-ru 18
  • Proposal: Remove `targetEl`

    Proposal: Remove `targetEl`

    Why

    • It's overly complicated for what it does. You can simply do new Vue(PortalTarget).$mount(el)
    • ~~It won't work with the upcoming PortalTargetGroup component which will (hopefully) allow multiple parallel sources~~

    This is just an idea though, and will be a breaking change, so not possible before 2.0

    What to do instead?

    Mount the PortalTarget yourself:

    import { PortalTarget } from 'portal-vue '
    const target =new Vue({
      el: '#target-el',
      ...PortalTarget,
      propsData: { /* props go here*/ },
    })
    
    // or if we also want to set `attributes` for the targets root element:
    const targetWrapper = new Vue([
      el: '#target-el',
      components: {  PortalTartget },
      template: '<portal-target class="my-custom-class" name="target"/>' // add any attributes on this element
    })
    

    That should be easy enough to do yourself in your app during mounting.

    Advantages

    • reduces API surface and code size. We could cut a consideable number of lines from portal and utils, and a few from portal-target
    • No need to cover edge cases in this lib, like mutiple <portal> components trying to mount to the same target-el
    • More flexible: You can set other Target props like transition easily. We would have to extend the API even further to support that with target-el, which I don't like.
    docs Priority:3 refactor Breaking change 
    opened by LinusBorg 17
  • 'Leave' transition still not displaying

    'Leave' transition still not displaying

    (Opening a new issue to call attention to issue #98, which was closed with commit #145, but which still doesn't seem to be fixed, as far as I can tell.)

    There still appears to be an issue with 'portaled' modals not displaying their 'leave' transition. Demos:

    Links to the repos are provided on the demo pages. I'd really appreciate any help anyone can provide. Thanks to @LinusBorg for creating and sharing such a useful plugin!

    bug PR welcome 
    opened by tinymachine 14
  • $refs inside a portal are not available on $nextTick

    $refs inside a portal are not available on $nextTick

    I'm still seeing the problem described in #23 using version 1.3.0. To reiterate the problem, if I have the following template

    <portal to="destination">
        <div v-if="open" ref="content">foo</div>
    </portal> 
    

    And I run the code:

    app.open = true
    app.$nextTick(function() {
      console.log(!!this.$refs.open)
    });
    

    Then im seeing false logged in the console. If I add a second $nextTick then the ref is populated. The opposite also happens when setting open = false, the $ref will remain populated until 2 ticks have passed.

    jsfiddle of the problem: https://jsfiddle.net/ke9b8j4e/3/ (i inlined portal-vue so youll need to scroll to the bottom of the script section to see the app code)

    wontfix Caveat 
    opened by bimbiltu 14
  • Lost Elements - works in 1.5.0, fails in 1.5.1

    Lost Elements - works in 1.5.0, fails in 1.5.1

    The basic premise of my use case is a popup, my attempt to recreate the issue in a jsfiddle is here: http://jsfiddle.net/mikeapr4/zt65y2mL/

    Unfortunately the JSFiddle doesn't exhibit the same problems :( but maybe it could shed some light on what the problem might be.

    Key points on the example:

    • Target accepts multiples and I have recreated the other transports in case it is part of the problem
    • I have a generic Popup component that wraps a Portal, the portal itself is conditional
    • The generic Popup also contains a slot for a concrete impl
    • The generic Popup contains vue-global-events which has a "noop" render function. I've recreated the same here (results in a comment in the output).
    • The concrete Popup is a component which can re-render once opened, based on the user interacting with it.

    So I've been using my current setup without problems with v1.5.0, I upgraded to v1.5.1 and what I observe is that the portal displays the popup the first time, and if I close without causing any concrete popup re-render, the popup opens again and any number of times.

    As soon as I cause a re-render within the opened popup, the popup can close after that, but it will not reopen. Debugging the Elements, it appears that the NoopComponent node still appears, that is to say a comment appears and disappears in the target as the popup is toggled.

    Sorry for the complex edge case. Considering the single and simple change that occurred in 1.5.1, I thought maybe it might be possible to guess the root cause here, I don't know what it is.

    Cheers Mike

    docs Caveat 
    opened by michaelgallaghertw 13
  • Transition

    Transition

    Hi,

    vue: 2.5.13 portal-vue: 1.3.0-beta.0

    I have a basic usage of portal-vue for modal display (because sadly (or not) z-index is relative)

    <portal-target name="modal" transition="modal-transition"></portal-target>
    
    <portal to="modal">
        <router-view></router-view>
    </portal>
    

    I got the following breaking error (there is only one modal at a time) [Vue warn]: <transition-group> children must be keyed: <> I fixed it with slim props but is it a normal behavior ?

    Other thing, transition works fine on the initial state if used like this:

    <portal to="modal">
        <router-view>
               /* 
                 <transition name="modal-transition">
                        <div class="modal"></div>
                </transition>
              */
        </router-view>
    </portal>
    

    But the leave part of the animation is ignored. Is it possible to get the animation duration then clean the portal-target after it ends ? Because ideally, I see portal-vue as an option. If I have to move the transition part of a component to get it works, its behavior with or without portal will be different and it's a problem.

    Thanks for your work on this lib!

    bug Priority:1 
    opened by madmoizo 13
  • Extract babel config into .babelrc file and add it to .npmignore

    Extract babel config into .babelrc file and add it to .npmignore

    If you do not have the es2015 and stage-2 preset packages installed in your application, compilation fails when building a WebPack bundle of an application that depends on portal-vue with the following error:

    Error: Couldn't find preset "es2015" relative to directory ...

    Compilation works when the es2015/stage-2 presets are both installed. It seems this is due to the "babel" options in this package's package.json file overriding/merging into my own babel configuration and importing these plugins/presets.

    Interestingly, the "devDependencies" of portal-vue includes the stage-3 preset, but the babel options only import in stage-2. I'm wondering if this will cause an issue for anyone who pulls down this repo to do development on portal-vue.

    Seeing as it appears that the dist/*.js files have already been processed by babel, is there any way to have these options only be applied during the development and packaging of portal-vue itself, and not in the development and packaging of applications that use it?

    The es2015 preset isn't always necessary; and generally having a dependency on a stage-x isn't suitable for production (as features will move between stage-x presets as they mature). So I'd prefer to not be required to pull them down.

    Otherwise, awesome package!

    enhancement 
    opened by nelsonlaquet 13
  • Adding components to the same portal target makes them recreated

    Adding components to the same portal target makes them recreated

    Hello.

    I've got a strange behavior with multiple modal components in the same target. See the fiddle: https://jsfiddle.net/z64b3fu2/

    It has a modal pop-up form and a global loading spinner both rendered in the modal portal target. Once you submit the form the spinner is added to the target. It works nice but the pop-up form component is destroyed as soon as the modal spinner appears.

    To check this out click 'Show dialog', type anything to the form then click 'Start async action'. The form is cleaned up at this moment. Maybe I do anything wrong but I tried using keys and different order. It's still the same.

    Thanks!

    bug Priority:1 PR: Ready 
    opened by xgrn 12
  • is paired with — or just bad interpretation of docs?">

    "Unexpected" output when is paired with — or just bad interpretation of docs?

    Hey 👋 First, thanks for the effort in releasing the official 3.0 version, truly appreciated!

    Was playing around with it and notice some strange behaviour when using <transition-group> and the #wrapper slot as suggested in documentation.

    <!-- from docs -->
    <portal-target name="target">
      <template #wrapper="nodes">
        <transition-group name="fade">
          <component :is="node" v-for="node in nodes" :key="node" />
        </transition-group>
      </template>
    </portal-target>
    

    The only difference is that my <transition-group> actually renders an element via the tag prop. When using a plain vue <transition-group> and looping inside, only one wrapper element is used even though transition name classes are applied to each item. Since the slot is named #wrapper I also expected it to render once while the portalized elements looped within. If this is the expected behaviour, then we could maybe explicitly add it to the docs.

    Reproduction example

    To avoid my project context, created two demos: a basic one and another one where I've used the demo "move transition" from vuejs.org docs

    Actual

    Using <portal-target multiple> #wrapper slot combined with <transition-group tag="ul" class="container" > outputs one <ul class="container"> per portalized item

    Expected

    Using <portal-target multiple> #wrapper slot combined with <transition-group tag="ul" class="container" > outputs a single <ul class="container"> wrapping all portalized items

    Workaround

    Not using <transition-group> tag prop, and move a plain wrapper ul outside of portal-target. A problem with this might be reusable AppTransition components which now require a refactor for handling groups. (My problem 😛). Still, the problem is still there as it seems that mulitple transition-group fragments are outputted.

    Real-world context

    I have a FABs (Floating-action-buttons) bottom-right container in my app, and each view can portal its own custom FABs in addition to some default one already present at <portal-target multiple>. Note that this is working with portal@2x

    fabs-portal-on-scroll

    docs 
    opened by renatodeleao 3
  • Document optimization

    Document optimization

    First of all, it's not a bug report, just advise. I installed this plugin to replace of vue3 in vue2. It's easy to use. just import then 'Vue.use'. Thus, I got an error in 'Vue.use', console displayed 't.provide is not a function'. I googled the error but got any related info. Finally, by debugging source code, I figured out I installed portal-vue@v3 which is used for vue3 because of installing without specific version. All of blogs told me it's a plugin for vue2, so I never thought it can also support vue3. I am not sure if I was only one who made this mistake. if could, please mention it in README

    opened by star-hs 0
  • [Feature Request] Add TypeScript support

    [Feature Request] Add TypeScript support

    Currently I need to add shims in all my projects to get intellisense and typecheck in template (powered by Volar):

    import type { DefineComponent } from 'vue'
    
    declare module 'vue' {
      export interface GlobalComponents {
        Portal: DefineComponent<{
          disabled?: boolean
          name?: string
          order?: number
          slim?: boolean
          slotProps?: any
          tag?: string
          to: string
        }>
        PortalTarget: DefineComponent<{
          multiple?: boolean
          name: string
          slim?: boolean
          slotProps?: any
          tag?: string
          transition?: boolean | string | object
        }>
      }
    }
    
    export {}
    

    Autocomplete and typecheck: image

    Is it possible to add built-in support in this package? However, only Vue 2.7 and @vue/runtime-dom have DefineComponent.

    opened by kingyue737 0
Releases(3.0.0)
  • 3.0.0(Dec 11, 2022)

    We finally have a 3.0.0 release!

    There are no API changes compared to the beta that was released over a year ago (sorry for the long wait 😅). But there's one addition:

    • proper types.
    Source code(tar.gz)
    Source code(zip)
  • 3.0.0-rc.1(Dec 10, 2022)

    Important Notes

    This is a release candidate for the 3.0 release, which has lingered in beta for faaaar too long. Nothing noteworthy has changed API-wise, but we updated the whole repository to modern tooling standards, and that may have had unwanted side-effects which we want to make sure we fix before the final release.

    Installation

    This release has been published under the rctag, so you can install it like this:

    npm install portal-vue@rc
    

    a normal install will still give you the 3.0 beta version that has been published or many months now.

    Changes

    • Refactor to Vite 4, Vitest, vue-tsc, vitepress 1.0 (#385) (0431963)
    Source code(tar.gz)
    Source code(zip)
  • 2.1.7(Dec 28, 2019)

  • 2.1.6(Aug 1, 2019)

  • 2.1.5(Jun 1, 2019)

    Things we fixed

    • lots of docs typos, corrected by various contributors better at reading than me, appearantly.
    • Make Wormhole.close() work as intended when called with forced=true (docs) (#216)
    Source code(tar.gz)
    Source code(zip)
  • 2.1.2(Apr 24, 2019)

    Things we fixed

    • #204: disable Instance registration during SSR since Wormhole is as singleton (#205)
    • Disable Wormhole.open() during SSR for the same reason.

    Things we added

    • Things relating to SSR now have their own page in the docs: Https://portal-vue.linusb.org/guide/ssr.html
    Source code(tar.gz)
    Source code(zip)
  • 2.1.1(Apr 18, 2019)

  • 2.1.0(Apr 18, 2019)

  • 2.0.1(Apr 18, 2019)

  • 2.0.0(Apr 14, 2019)

    For an overview of changes, see here:

    https://portal-vue.linusb.org/guide/migration.html

    TLDR; APi didn't change much except for targteEl functionality, which moved into its own component.

    Source code(tar.gz)
    Source code(zip)
  • 1.5.1(Dec 30, 2018)

  • 1.5.1-beta.1(Dec 26, 2018)

    this release closes #169, and hopefully also #159

    But in order to fix these rather severe bugs, we had to introduce an edge case where content from a target's default slot might not update correctly without a key. We added a note to the docs here and will update the docs online once we left beta - which should be in a few days max, we only release a beta to be sure the change doesn't break any other edge cases.

    Source code(tar.gz)
    Source code(zip)
  • 1.5.0(Nov 23, 2018)

    Things we added

    • portal-vue can now be installed as a nuxt-module! (https://nuxtjs.org/guide/modules). Thanks to @ricardogobbosouza (#157)

    Things we fixed

    • Wormhole now does a stable Sort when re-sorting the array of transports upon addding / deleting content for a target (#158, closes #152, and probably #141)
    Source code(tar.gz)
    Source code(zip)
  • 1.4.0(Oct 2, 2018)

  • 1.4.0-beta.1(Sep 2, 2018)

    Install with:

    npm install portal-vue@next
    

    Note

    The 1.4.0 release will be the last release before a major overhaul of the repository. We will switch to vue-cli 3.0, vuepress for docs, will implement cypress e2e tests and port the src to Typescript (because why not).

    the next version after that overhaul will be a major version bump, where we intend to keep the public aPI consistent for the most part.

    But on to 1.4.0-beta.1:

    Things we added

    • targetClass (#133, thx to @y-nk) (docs)

    Things we fixed

    • #131
    • #98
    Source code(tar.gz)
    Source code(zip)
  • 1.3.0(Jan 18, 2018)

    Things we added

    Scoped Slots!

    This means you can now do this:

    <portal to="target">
      <p slot-scope="props">
        {{props.message}}
      </p>
    </portal>
    
    <portal-target name="message" v-bind:slot-props="{message: 'Hi!'}">
    

    Things we deprecated

    • the portal's targetEl prop is now officially deprecated and will be removed in 2.0, since it added a lot of internal complexity that can be solved more elegantly in userland.

    Internals

    • Switched the Wormhole from a naked ES6 class to a Vue instance. This saves us some boilerplate from babel-transform-runtime. (#73)
    • Added integration tests (#43)

    Things to come

    We will try and push 2.0 quite quickly. Removing targetEl (#74) will be the only breaking change.

    Source code(tar.gz)
    Source code(zip)
  • 1.3.0-beta.0(Jan 2, 2018)

    how to test this beta release

    npm i -D portal-vue@next
    

    About this beta

    There's two main reasons we release this one as a beta:

    1. We refactored the whole Wormhole class (only internal APIs)
    2. We had to trick Vue to play nice with scoped slots and abstract component settings on the portals.

    All tests pass, manual tests are looking fine as well, but we want to make sure this doesn't break anything for users.

    Things we added

    Scoped Slots!

    This means you can now do this:

    <portal to="target">
      <p slot-scope="props">
        {{props.message}}
      </p>
    </portal>
    
    <portal-target name="message" v-bind:slot-props="{message: 'Hi!'}">
    

    Things we deprecated

    • the portal's targetEl prop is now officially deprecated and will be removed in 2.0, since it added a lot of internal complexity that can be solved more elegantly in userland.

    Internals

    • Switched the Wormhole from a naked ES6 class to a Vue instance. This saves us some boilerplate from babel-transform-runtime. (#73)
    • Added integration tests (#43)

    Things to come

    We will try and push 2.0 quite quickly. Removing targetEl (#74) will be the only breaking change.

    Source code(tar.gz)
    Source code(zip)
  • 1.2.2(Dec 17, 2017)

    Things we fixed

    • #80 introduced a snippet of ES6 syntax that can't be transpiled without a polyfill. Since portal-vue is meant to work with any ES5-compliant browser without any polyfills, we replaced it with ES5 code. (#94)
    Source code(tar.gz)
    Source code(zip)
  • 1.2.1(Dec 12, 2017)

    Things we fixed

    • When using the targetEl prop, the PortalTarget did not correctly adopt the attributes of the element that it was mounted to. (#91)
    Source code(tar.gz)
    Source code(zip)
  • 1.2.0(Dec 12, 2017)

    About this release

    It's been a while, hasn't it? I'm grateful for everyone's patience with this release. I know that a lot of people requested the features we are now introducing, and I know you guys had to wait quite a while to get them.

    I learned that it can be really challenging to create a thoroughly tested and documented release even for a relatively small library like this, when you have other work going on as well and you have problems to find a decent time slot that you can fully dedicate to get the release done.

    I found that time last weekend, so here it is.

    Things we added

    Better Transition support (#72)

    You could always do this:

    <portal to="destination">
      <transition name="fade">
        <p v-if="hasMessages" key="1">You have {{messages.length}} new messages</p>
        <p v-else key="2">No unread messages</p>
      </transition>
    </portal>
    

    But now, you can also define a transition on the <portal-target>:

    <portal-target 
      :transition="{ name: 'fade'}"
      :transition-events="{ enter: onEnterCallBack }"
    />
    

    Multiple sources (#80, @eschalks)

    While it was always possible to switch between multiple <portal> components as the source for one <portal-target>, the target could only ever render the content from one of them the same time.

    Now, <portal-target> has a multiple prop, which activates support for rendering content from multiple <portal> components at the same time.

    You can use the order prop on the <portal> components to control the order of the content in the <portal-target>:

    Source

    <portal name="destination" :order="2">
      <p>some content</p>
    </portal>
    <portal name="destination" :order="1">
      <p>some other content</p>
    </portal>
    
    <portal-target name="destination" multiple />
    

    Result

    <div clas="vue-portal-target">
      <p>some other content</p>
      <p>some content</p>
    </div>
    

    A special thanks to @eschalks who wrote a great PR for this and was very patient with me, as I took my sweet time to merge his PR and finally release it today.

    Things we fixed

    • Fixed a bug where updating a <portal> with an empty slot would not remove the previous content from the linked <portal-target> (#86, @zicklag)
    • Fixed a couple of typos and grammar mistakes in the docs (#79, #82, #83, #87)
    Source code(tar.gz)
    Source code(zip)
  • 1.1.1(Aug 27, 2017)

    This is a very small release that just fixes a few minor bugs. I will hopefully find time for a feature release soon, but time is a problem lately...

    Things we fixed

    • add portal-vue.js.map to package files in package.json (#60)
    • fix Wormhole API example (#63)
    • replace use of ES6 Array.prototype.includes with Array.prototype.indexOf so IE doesn't require a polyfill. (#64)
    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Jun 17, 2017)

    Release notes

    This release had two goals:

    1. Rewrite the internal transport mechanism to send content from a Portal to a PortalTarget
    2. Open up the API for this mechanism to allow programmatic access to it.

    This lays the foundation for introducing additional features in the next version.

    Things we added

    • (#42) Wormhole export of the package offers programmatic access to the transport mechanism. Its API is documented here.
    • (#40) The PortalTarget component emits an event whenever it receives new content (docs).
    • (#41) The PortalTarget now accepts slot content and renders it when there's no content so show from a Portal. This allows displaying default content.

    Things we fixed

    No bugfixes in this release

    Things we broke

    No breaking changes.

    Source code(tar.gz)
    Source code(zip)
  • 1.0.1(Jun 15, 2017)

    We fixed one thing and pushed this change out as a patch release before some new functionality comes with v1.1, because we think this should arrive for anyone, not just people upgrading all minor versions.

    Things we fixed

    • #23 refs were not available on $nextTick

    To fix that, we had to make the update process of the wormhole between Portal and Portal-Target sync instead of async (#39)

    Source code(tar.gz)
    Source code(zip)
  • 1.0.0(May 20, 2017)

    So here's the first stable release!

    Nothing has really changed from 1.0.0-beta.5. I mainly improved the documentation - rewriting some paragraphs, removing a lot of typos, adding some codepen examples.

    Fixes

    • Now generates a valid string as a "to" name when none was provided (#45)
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0-beta.5(May 14, 2017)

    Changes

    • Portal and PortalTarget are now abstract components. See the Caveats section in the docs for implications (#24)
    • to is now optional if targetEl is specified. (#34)

    Fixes

    • Portal doesn't throw an error when not slot content is provided.
    • When using targetEl, the Portal component is set as the parent of the PortalTarget. This also ensures that <route-link> elements in portal content work (fix #34, fix #35)
    • Fix wrong dependency (babelplugin for stage 3) (fix #32)
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0-beta.3(Mar 18, 2017)

  • 1.0.0-beta.2(Feb 24, 2017)

  • 1.0.0-beta.1(Feb 24, 2017)

Owner
Thorsten Lünborg
Member of the @vuejs core team, hobby frontend hacker. Not a dev by profession.
Thorsten Lünborg
Simple portal component which allows to mount component anywhere.

vue-simple-portal Simple portal component which allows to mount component anywhere. This component only does one thing that already existed in portal-

EGOIST 6 Dec 1, 2019
MQTT5 Explorer is a simple yet feature-rich client to visualize data of any MQTT broker.

MQTT5 Explorer About this project Project setup npm install Compiles and hot-reloads for development npm run electron:serve Generate app icons npm run

null 6 Dec 28, 2022
Send your loved ones a vibe with a lovely sound, so they know you miss them. Anytime you want to, anywhere they are.

An app to send your loved one a vibration with a lovely sound, so they know you miss them. Anytime you want to, anywhere they are.

fotiecodes 32 Aug 6, 2022
Remote control Windows machine from anywhere powered by UltraVNC Server and Piping Server

piping-vnc-server-for-windows Remote control Windows machine from anywhere powered by UltraVNC Server and Piping Server How to use Suppose that Window

Ryo Ota 8 Dec 26, 2022
A public open source S3 explorer for public/private buckets that can be deployed anywhere.

AWS S3 Explorer This is an S3 Explorer for AWS. It provides a simple and straightforward way for users to login using SSO and explore available S3 Buc

Rhosys 25 Dec 30, 2022
A lightweight personal markdown document host with vue.js

为什么要用英文写 readme 和 commit 信息?——为了顺手提升我的英语水平 light-doc Super lightweight personal

marsCat 1 Jul 27, 2022
A Completed todolist app built in Vue, have advanced filter feature , like filter by status, date, and have search , sort features

todo-app Project setup npm install Compiles and hot-reloads for development npm run serve Compiles and minifies for production npm run build Lints

null 0 Jan 20, 2022
Open Source website aiming to gather contact informations about french people wanting to help ukrainians seeking shelter outside their country

This is an Open Source website aiming to gather contact informations about french people wanting to help ukrainians seeking shelter outside their country.

null 15 Oct 19, 2022
Instahelp is a Q&A portal website similar to Quora

Instahelp is a Q&A portal website, it features questions and answers on a wide range of tags/topics The website serves as a platform for users to ask and answer questions, and, through membership and active participation, to vote questions and answers up or down and edit questions and answers in a fashion similar to Quora

Abdallah Hemdan 20 Oct 27, 2022
My very first VueJS project. A small news portal consuming The New York Times API.

VUE NEWS News Portal Using New York Times API PREVIEW: https://bit.ly/3opdAiU Technologies Used VueJS Typescript CSS Cypress (via @vue/cli-plugin-e2e-

Arthur Maurício 1 Apr 18, 2022
A new student portal concept for UICians in the 21st century

A new student portal concept for UICians in the 21st century

Ned 8 Dec 18, 2022
A simpler Portal implementation focussed on moving slot content to the end of the body element

vue-simple-portal What this is vue-simple-portal allows you to mount its slot content to the very end of the body element (or potentially any other DO

Thorsten Lünborg 214 Jan 1, 2023
Web application for organization of foodsaving groups worldwide - frontend code and central location for feature planning. For server-side code, go to https://github.com/yunity/karrot-backend

A web platform to support foodsaving groups worldwide. ?? ?? ?? karrot (Frontend) (Backend) This is the frontend repository, i.e. the browser-side sof

yunity 361 Dec 27, 2022
NoteHub is an online note sharing platform where users can edit notes with a versatile rich-text editor in a real-time collaborative environment

NoteHub is an online note sharing platform where users can edit notes with a versatile rich-text editor in a real-time collaborative environment. NoteHub also provides notes sharing features between individuals or communities, and even more advanced features such as AI assistance, including content summarization, Q&A, voice to text transcription, and handwritten text recognition.

Boquan (Brian) Yin 15 Aug 16, 2022
NoteHub is an online note sharing platform where users can edit notes with a versatile rich-text editor in a real-time collaborative environment.

NoteHub is an online note sharing platform where users can edit notes with a versatile rich-text editor in a real-time collaborative environment. NoteHub also provides notes sharing features between individuals or communities, and even more advanced features such as AI assistance, including content summarization, Q&A, voice to text transcription, and handwritten text recognition.

null 15 Aug 16, 2022
🏄 A rich interaction, lightweight, high performance UI library based on Weex.

Weex Ui 中文 | English A rich interactive, lightweight, high performance UI library based on Weex. Docs Home Page 中文文档 Use Weex Ui with weex-toolkit Dem

The Apache Software Foundation 4.8k Jan 7, 2023
A vue.js web application to practice with front-end rendering

VuePosts Introduction This is simply another vue.js web application. I did this project to practice front-end rendering skills and try out a framework

Davide 0 Feb 4, 2022
mmf-blog-vue2 ssr(The service side rendering)

@[toc] 1. 首先你得有台服务器 2. 推荐安装 linux 系统 本文以 CentOS 7.2 为例 3. 更换 yum 为国内镜像 备份你的原镜像文件,以免出错后可以恢复。 # mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Ce

LinCenYing 174 Aug 2, 2022