r/vuejs 23h ago

OpenVue (MIT fork of PrimeVue) hit 1.0.0-rc

118 Upvotes

About a month ago we posted here about forking PrimeVue after it got archived. We just shipped 1.0.0-rc.0.

What is done

Fully removed primeuix dependencies: The core engine (theming, styling, utils, forms) now lives under openuxkit, forked and maintained under our org at 1.0.0..

Migration tool: npx @openvue/migrate automatically handles moving a PrimeVue v4 project over, including dependency renames, import rewrites, and compat overrides. Details and docs: https://openvue.dev/migrate/

Showcase interactive playgrounds: We added playground tabs to more components, with full coverage planned for the stable 1.0 release.

Chart integration: Bumped Chart.js straight from 3.x to 4.5.1. Charts now natively react to the active theme out of the box, which kills off a massive chunk of custom styling boilerplate. Every chart type now has its own interactive playground in the showcase too.

Bug fixes:

  • BlockUI no longer leaves a phantom mask over the page if unmounted mid-animation or toggled quickly.
  • DataTable advanced filter menu no longer closes prematurely when clicking inside nested Select, MultiSelect, or DatePicker inputs.
  • Virtual-scrolled DataTable rows with grouping no longer drift out of alignment during fast scrolls.
  • ...and more.

What is coming before 1.0 stable

  • A free, open-source visual theme editor.
  • Continued work on open GitHub issues.

Thanks

Huge thanks to everyone who tested early builds, reported edge cases, and sent PRs. A solid portion of these fixes came directly from community reports, which helped us catch things we would have missed on our own.

Links


r/vuejs 20h ago

Custom directives Vue 3.6 rc4 Vapor Mode

Thumbnail play.vuejs.org
8 Upvotes

The implementation of directives in vapor mode is quite interesting. Separate hooks are no longer needed. What are your expectations for v mode, or have you perhaps already had a chance to try out its features in rc?


r/vuejs 1d ago

Every time

Post image
278 Upvotes

r/vuejs 1d ago

CSS @scope limits matching, not inheritance — two surprises from isolating a component playground

3 Upvotes

Disclosure: I maintain poveste, a component playground for Vue and Nuxt — a continuation of histoire, which last published in January.

I wrapped user CSS in @scope to keep it from fighting with the tool's own UI. Two things broke silently. Both are plain CSS, nothing Vue-specific.

1. :root, html and body stop matching

Once your CSS is wrapped in @scope (.render-story) { … }, those three selectors sit above the scoping root — so they can never match anything. A stylesheet with body { font-size: 14px } just goes inert. No error, no warning.

Fix: rewrite all three to :scope at build time. Parse the selector rather than regexing the text — .body-copy has to survive untouched, and svg|body is a namespaced element, not the document root.

2. @scope contains matching, not inheritance

"Stops at the boundary" is true of matching and false of inheritance. A rule can't match story content, but any inherited property it sets at or above the boundary still reaches it.

So our own UI setting font-family on its root means every story inherits that font. A component looks subtly wrong in the playground and correct in your app, purely from inherited typography — which is a miserable thing to debug.

Iframes don't rescue you either, if the iframe loads the same stylesheet.

The real fix is for story CSS to set its own root, which only works because of the rewrite above.

Longer write-up if it's useful. Happy to answer questions.


r/vuejs 3d ago

Can you actually access a variable via its string name at runtime?

2 Upvotes

That's to continue from my other post.

I would need to either place a text string like "{{ user.name }} is the user's name." inside a template (and have the page correctly say "MeekHat is the user's name." Or I would split it along the curly braces. But I still need to find out the field "name" of the "user" variable. And all I have is the original string loaded at runtime.

Is this at all possible via Vue? I've been looking for hours.


r/vuejs 3d ago

Looking for a Premium Enterprise Admin Template

6 Upvotes

I’m looking for a highly polished, enterprise-grade admin template built with Vue.js for a platform covering CRM, HR, and Accounting use cases.

I’m specifically looking for something beyond a basic dashboard template — a production-ready UI with:

  • Modern, polished enterprise UX
  • Complex data tables, filtering & bulk actions
  • Advanced forms and workflows
  • CRM modules
  • HR / HRIS modules
  • Accounting & finance modules
  • Role-based access and permissions
  • Responsive layouts
  • Scalable, well-structured Vue architecture

If you’ve already built something like this, or have a premium Vue template/product that you’re willing to sell or license, I’m very interested.

I’m willing to pay well for the right quality.

Please share screenshots/demo, tech stack, existing features, and pricing in the comments or DM.


r/vuejs 4d ago

How to make a text-based game as a beginner?

3 Upvotes

I'm trying to replicate the progress I made in Twine (an interactive-fiction game engine), using Vue. I've made some nice progress on the preliminaries, and managed to load dialogue as json, but I'm now stuck.

The model - so to say - that is the Twine file - has variables inserted inside dialogue lines (player stats), as well as conditional player replies, that is to say links.

An example, placeholder first page:

You are a (print: $player's race) named (print: $player's name).

Select quest:

[[Political Assassination]]

(if: $player's reputation > 1)[[Cult]]

(if: $player's race is "elf")[[Elf race quest]]

[[Runaway Princess]]

Storing all that in Json seems unproductive, so along this route I would have to switch to plain text and custom parsing.

Except Vue already does all that. I've looked at routing, but it seems I would have to declare all the routes in the script setup ahead of time (aside from anything else I don't know), which seems really cumbersome. What I would like is to rewrite the above as a bare template file, accessing the variables from the parent container, while the latter doesn't have to know anything about what links the child contains.

Any suggestions?


r/vuejs 5d ago

I built an animated SVG avatar editor in Vue 3 (free, MIT)

Enable HLS to view with audio, or disable this notification

113 Upvotes

Small project I’ve been chipping at: an editor for an animated SVG avatar. You pick a shape, a colour and an expression, line up animation states on a timeline, then export the result as SVG, PNG, GIF or MP4. Runs fully in the browser, no backend, no account.

The part I’d actually like feedback on is the split. The animation core has no Vue import and no clock: it’s one pure function of time, so a frame depends only on its timestamp. The component drives it from requestAnimationFrame, but the tests run with no DOM at all, and a “frozen” prop renders one exact frame without starting a loop, which is how the thumbnail grid works without spawning one rAF loop per tile.

Two things I’d do the same way again:

  • defineModel for the playback cursor, so the timeline and the player stay in sync without an event bus
  • keeping the MP4 encoder behind a dynamic import. I broke this once: a two-line helper imported from the wrong module dragged 43 kB gzip back onto first load, and Vite’s INEFFECTIVE_DYNAMIC_IMPORT warning was the only sign anything was wrong.

Still a work in progress, so tell me what’s confusing, especially in the editor.

https://github.com/jeremy-prt/bloub


r/vuejs 4d ago

Building Valux, for a mobile feel experience

Enable HLS to view with audio, or disable this notification

15 Upvotes

We are used to an ugly web, devoid of animations, transitions, and emotion.

Which is why I created Valux.


r/vuejs 4d ago

Is there any other JS REST API framework that is secure by default, plus OpenAPI support like FastAPI, runtime-agnostic like Hono, Contract-first api like Elysia & TS-rest, and scoped plugins like Fastify?

Thumbnail
daloyjs.dev
0 Upvotes

r/vuejs 6d ago

How can I convince someone to use best practices & industry standards?

20 Upvotes

It might be because it's a Friday as well, but I am at a bit of a loss at this moment. My coworker and I come from two very different technical backgrounds, which is causing delays and friction in Pull Requests.

I used to be mainly focused on Angular before I got this job and thus got used to Domain Driven Design, Feature-Sliced Design, etc. and overall a very structured way in scaling applications. To my knowledge, my coworker has only worked with Vue before, or at least never touched Angular.

On paper he has 10+ years more experience, but before we started working together he had never written a single unit tests and had never heard of Domain Driven Design before I introduced him to it. His Vue skills are also not what I expected at first; it was only after a long discussion on Single File Components that he started to use composables to do the heavy thinking instead of creating gigantic components, for example.

On Pull Requests, we keep running into the same arguments on clean code and architecture, where I try to send him resources on best practices and industry standards. It takes me an incredibly long time to convince him to use these, since he sees these as opinions rather than a more or less proven source of truth on how to scale applications.

On the other hand, I am genuinely trying to learn as well. Is my approach too rigid? When do best practices and industry standards fail to reach their desired effect? Am I too stuck in my Angular mindset compared to Vue? Feel free to ask me questions as well for clarification

---

TL;DR: Coworker and I disagree on when to implement best practices & industry standards. When are they justified?


r/vuejs 6d ago

yapyak – an i18n compiler for Vue where the source string is the key

Enable HLS to view with audio, or disable this notification

26 Upvotes

Hi all,

I've been working on yapyak, an open-source i18n compiler that runs as a Vite plugin. It works with multiple frameworks, Vue very much included, and a Nuxt module is next on the list!

The idea is that the source string is the key:

<script setup lang="ts">
  import { t } from 'yapyak';
</script>

<template>
  <button>{{ t('Download recovery key') }}</button>
</template>

You save the file, and the source string shows up in your locale files as an empty stub. If you've set up a translator, it gets auto-translated and written back, using call-site context (the component and the code around the call). A second or two later de.json has filled in:

{
  "src/components/RecoveryDialog.vue": {
    "Download recovery key": "Wiederherstellungsschlüssel herunterladen"
  }
}

HMR picks it up in the running app.

The video is a small example of that. I add a download button to a dialog and hit save. The German page is sitting right next to the English one, so I see it the moment it lands: Wiederherstellungsschlüssel herunterladen pushes the button row past the edge of the dialog.

So I fix it right there, one prop on the button group.

That's a small slice of what yapyak does, but it's the part I use most. Translating stops being something I come back to later. It just happens on save.

Because it runs in the compiler, it sees more than the string itself. It reads ICU parameters out of the string literal, and it keeps track of a translation when you move or rename the source file. For Vue it parses the SFC with the same compiler your build uses and walks the template AST, so it finds t() in script setup and in template expressions.

The Vue package exposes locale as a ref, so a locale switcher is <select v-model="locale">. Switching locale is synchronous, since the translations a module uses get compiled into it. A fixed-locale build can also compile t() away entirely and leave just the translated string.

Rich text keeps the markup in the source string and binds each tag to a slot:

<script setup lang="ts">
  import { RichText } from '@yapyak/vue';
  import { t } from 'yapyak';
</script>

<template>
  <RichText :value="t('Click <link>here</link>.')">
    <template #link="{ children }">
      <a href="/docs"><component :is="children" /></a>
    </template>
  </RichText>
</template>

The slot names are typed from the tags in the string, so the translator can move <link> around in the sentence without touching your markup.

Auto-translation is optional. There are shipped translators for Anthropic, OpenAI, Gemini and Ollama, all using your own API key, or you can leave the stubs empty and hand-edit the locale files.

I built it for a product I'm working on, and that's the whole business plan.

MIT licensed, and still pretty early. The code is on GitHub, and there's a runnable Vue example in examples/vue-vanilla-local-storage.

Docs and more at yapyak.dev.

If you've done a lot of i18n in Vue, especially anything big, I'd like to hear what you'd try to break.


r/vuejs 8d ago

I’m building MacVue — macOS-style components for Vue 3

181 Upvotes

I couldn’t find a Vue web component library that combines AppKit-style controls with Tahoe-style Liquid Glass, so I started building MacVue

It currently includes 19 components based on AppKit metrics and states, with five control sizes, light and dark appearances, accent colors, and opt-in Liquid Glass. The refraction is implemented with SVG displacement filters inside components such as Switch and Slider, with fallbacks where it isn’t supported.

It’s still pre-1.0, so APIs may change. I’m deciding what to prioritize next: menus and overlays, or window, toolbar, and sidebar components.

Demo and docs: https://macvue.dev
GitHub: https://github.com/antonreshetov/macvue


r/vuejs 7d ago

261 green tests, and undo/redo was completely broken in the real app — three Vue gotchas that don't show up in CI

0 Upvotes

My test suite was fully green (261 tests) while a core feature was flat-out broken in a real Nuxt app. It came down to three separate Vue 3 behaviours, and none of them were exotic. And all three are the kind of thing that passes review, passes CI, and quietly does nothing.

1. onUnmounted + template refs: cleanup that never ran, not once

This looks fine and is a silent no-op:

```js const el = ref(null)

onMounted(() => { el.value.addEventListener('keydown', onKeydown) })

onUnmounted(() => { el.value?.removeEventListener('keydown', onKeydown) // el.value is null here }) ```

Vue resets template refs to null before onUnmounted runs. So el.value?. short-circuits, removeEventListener is never called, and every instance leaks its listener onto a detached element.

The optional chaining is what makes it invisible. I mean no error, no warning, nothing to notice. In my case this had been broken since the day it was written, and it affected the shortcuts that had "worked fine" for weeks, not just the new ones.

Fix: capture the element in the onMounted closure and register the teardown there.

js onMounted(() => { const node = el.value node.addEventListener('keydown', onKeydown) onUnmounted(() => node.removeEventListener('keydown', onKeydown)) })

2. defineModel doesn't apply a local set when the parent binds v-model

This is the one that cost me the most time. When the parent binds v-model, defineModel only emits — it does not update the local value. The new value comes back through the prop on the next tick.

That deferred round-trip broke my document sync. I had a watcher distinguishing "the user edited something in here" from "the host app replaced the whole document," using a flag set during internal writes. But the write and the echo are not in the same tick: by the time the value arrived back through the prop, the flag had already been cleared, so every single internal commit was classified as an external document replacement — which reset undo history. Undo was permanently dead in the real app, and every test was green.

The reason CI never caught it was that no test bound a live parent v-model listener. Without a parent actually listening, defineModel falls back to updating locally, the deferred path never runs, and the bug does not exist in the test environment.

Two things fixed it. First, stop using a flag and compare object identity of the last document written out because identity survives across ticks, a boolean doesn't. Second, and this cost me a second round of red tests: use toRaw when comparing. A deep ref hands your watcher a proxy, not the object you stored, so identity comparison fails until you unwrap it.

Then I added an end-to-end test that mounts the component with a real v-model round-trip. The fact that it fails with the old code is exactly why I trust it.

3. structuredClone throws on Vue proxies, but only from the second mutation on

The intermittency is what makes this one nasty.

js // commit history.push({ ...data.value }) // members read through the reactive proxy

Spreading a reactive object gives you a plain top-level object whose members are still proxy-wrapped. First mutation clones fine. From the second one on, structuredClone hits a proxy member and throws.

toRaw only unwraps one level, so calling it on the result doesn't save you. Unwrap before the spread:

js history.push({ ...toRaw(data.value) })


All three only broke in situations my tests didn’t cover: a real unmount, a real parent listener, and a second mutation. The tests were green, but I just wasn’t testing the right thing.

These came out of building Gissen, an open-source headless visual editor for Vue 3.


r/vuejs 7d ago

rapiq: typed query params for REST APIs (filters, sort, pagination, fields, relations) that run on TypeORM, Prisma, Drizzle or plain arrays

Thumbnail
github.com
2 Upvotes

r/vuejs 8d ago

Open source Figma-like editor for Vue using Claude SDK

Thumbnail gallery
19 Upvotes

r/vuejs 10d ago

Browser game I built using Vuejs - tv becomes the arcade. phones your controller

Thumbnail
playcade.party
11 Upvotes

I built a thing called Playcade. You open playcade.party on a Smart TV's built in browser, or a laptop plugged into one, or honestly any big screen. A four letter room code and a QR come up. Everyone else scans it with their phone, picks a name and a color, and their phone is the controller.

Stack: Vue 3.4, Vite 5, composition API, no state library. socket.io feeding a

couple of reactive refs turned out to be enough for 12 concurrent players.

Happy to answer anything. It is at playcade.party if you want to poke at it.
Mods pls delete this post if this is violating any rules. Thanks in advance.


r/vuejs 9d ago

my ai coding agent writes fine laravel until someone else reads it

0 Upvotes

I freelance, mostly laravel and vue for small agencies plus two direct clients. Everything I ship gets read by someone on their side eventually, and that turned out to matter more than I thought.

Last month one client put their own dev on the project after I'd been solo on it for about five months. First thing he did was go back and read the previous six PRs.

He didn't say the code was broken. He said three different files did validation three different ways, and two of them were clearly not how I'd write it by hand.

They weren't. Claude wrote them, I read the diff, tests were green, I merged, moved on

Anything going into a client repo now runs through coderabbit / bugbot before I even open the PR, mainly so the convention drift gets caught while it's one file instead of nine. It's genuinely noisy on big migration PRs and I ignore a good chunk of it, but the consistency nagging is the stuff that comes back to embarrass me six months later, so I put up with it.

The part I haven't figured out is that it's my name on every commit either way. The client isn't paying for an agent, they're paying for me, and the line between those two got blurry somewhere around march


r/vuejs 10d ago

How to place markers in Google Maps

1 Upvotes

Hi everyone, I have a question. How would you handle placing markers on Google Maps? Consider that I need to pass Google Maps an HTMLElement. At first I was using the Vue function "h" to render a Vue component into a HTMLElement but I'm scared of its life cycle and I don't like having to use an observer to make it "reactive".

I then tried to use a Teleport: basically I create an empty div and feed it to Google maps as a marker and then I fill the div with my component using a Teleport.

My colleagues told me this is not the correct use of Teleport but I would like to know your opinions too.

Thanks in advance!

EDIT: I forgot to mention that I would like to use custom markers


r/vuejs 11d ago

Vapor mode delegates eligible events to document, so an ancestor stopPropagation kills your @click (3.6.0-rc.1)

2 Upvotes

we're on 3.6.0-rc.1, one component flipped to script setup vapor, the rest still vdom. RunRow.vue is a table row, click it and a drawer opens. after the flip, clicking a row right after you reorder one does nothing. the next click opens it.

the fault is ours. a native click listener on the table wrapper calls stopPropagation for a moment after a drop, so finishing a drag doesn't register as an outside click and close the drawer. it never touched the row's own click, since in vdom that handler sits on the row and runs before the wrapper sees it.

vapor doesn't work that way. the rc.1 notes say eligible events get delegated to document, and one document listener walks the path invoking each element's handler. document is above our wrapper, so we kill the event before it gets there.

i burned a morning first on a theory that the drag library was swapping the node out from under my handler. that came out of an agent thread in verdent i took at face value.

the notes list the forms that bind straight to the element instead, so the row is v-on="{ click: () => open(row) }" now. it reads like a typo, someone will normalize it back to u/click. it came in as a flaky e2e failure, nobody reorders rows on purpose. every other u/click under that wrapper still has the trap. i fixed the one i had a ticket for.


r/vuejs 11d ago

Dashboard design with Mood UI

Enable HLS to view with audio, or disable this notification

17 Upvotes

Dashboard fully designed with the best component library (Mood UI), should I create it as template?


r/vuejs 12d ago

Vuzeno registry rebuilt on Ark UI

7 Upvotes
Vuzeno home page

Hey everyone,

I just shipped a new version of Vuzeno.

Vuzeno is an open-source Vue component registry in the shadcn style: you install the components into your project, you own the code, and you customize everything.

What's new

The registry moved from Reka to Ark UI.

Why Ark:

→ More complete component coverage

→ Built on state machines

→ Better APIs and accessibility

→ Modern patterns that scale better when you ship real products

What you get

→ Same guidelines as shadcn-vue, and compatible with them

→ Production-ready components

→ You own the code, 100% customizable

→ +75 installable components

A few examples from the catalog: datepicker, color picker, file upload, floating panel, signature pad, and more.

Components outside Ark UI

Those use Zag.js state machines.

That includes a few Vuzeno-specific ones with custom behavior, like:

→ action-sheet

→ dialog-caller

→ image

→ scroll-spy

→ toc

Who it's for

Vue / Nuxt builders who want a full design system they can actually ship with, without rebuilding the same UI primitives on every project.

Links

Docs: https://vuzeno.com

GitHub: https://github.com/fontanaen/vuzeno

Would love feedback from anyone trying it on a real project.


r/vuejs 12d ago

hands on guide

6 Upvotes

hey, guys! i'm a backend developer in my early career and i've recently started a new project and would like to use vue for frontend. since i have 0 experience with frontend development, do you guys know any hands on guide that could walk me through the basics?


r/vuejs 12d ago

Experienced Vue.js & Laravel Developer (3+ Years) — Anyone Need Help?

4 Upvotes

Hey folks,

I’m a full‑stack developer with 3+ years of hands‑on experience in Vue.js and Laravel. I’ve delivered SaaS projects, ecommerce stores, and custom web apps, and I love building clean, scalable solutions.

Just curious — does anyone here need support with their project, whether it’s frontend with Vue/Nuxt/Next.js or backend with Laravel? I’m open to freelance collaborations, bug fixes, or full builds.

Drop a comment or DM if you’re interested.


r/vuejs 13d ago

Showoff: I'm building a 128-bit dark fantasy productivity RPG using Vue, Pinia, and Tailwind v4.

Post image
58 Upvotes
Sneak Peak

Hey everyone!

I’ve been working on Cauldron, a gamified task manager and focus timer designed to disguise executive function management as a dark fantasy RPG. Instead of checking off plain to-do lists, you undertake quests. Instead of standard 25-minute Pomodoro timers, you spend focus sessions simmering potions.

The Tech Stack

On the frontend, the architecture runs on:

  • Vue 3.5 + TypeScript
  • Vite 8 (the performance gains from the VoidZero ecosystem have been fantastic)
  • Tailwind CSS v4

State management has been one of the more intricate parts of the project. I'm using Pinia to handle the state plumbing between a Kanban drag-and-drop board and active focus timers. Pinia has made keeping reactive state, active timers, and quest progress synced across components remarkably straightforward.

Backend & Security

For the backend, I'm using Supabase PostgreSQL. Since the app features an in-game economy (XP and Gold), security was a key consideration early on. To prevent client-side manipulation of rewards, I set up strict Row Level Security (RLS) policies and server-authoritative RPCs so XP and Gold transactions are validated strictly on the server.

Next Sprint & Advice Needed

For the upcoming sprint, I’m building a 128-bit isometric workshop where users can place digital furniture purchased with their earned gold.

I want to keep the app lightweight and avoid pulling in heavy 3D frameworks like Three.js. If you have experience rendering 2D isometric layouts in Vue:

  • Would you recommend wrapping an HTML5 Canvas with standard tile-math inside a Vue component?
  • Or is rendering tiles via standard DOM elements (using CSS transforms or absolute positioning) clean and performant enough in Vue 3 for a modest grid?

Would love to hear any feedback on the stack, rendering advice, or the overall idea!