• v0.2.3 044620ac4e

    Draft v0.2.3 Stable

    FernandoJVideira released this 2026-10-20 17:20:23 +00:00 | 0 commits to main since this release

    Changes

    • Generated Vue projects now use @fernandojvideira/vue-ui-kit 0.5.1 (was 0.5.0), via the updated project-template.
      • Navbars gain a mobileActions prop. Set it to false when your mobile slot already builds its own mobile controls, so the actions slot isn't shown twice in the mobile menu.

    Upgrading

    Rebuild or reinstall the binary; draft version reports v0.2.3. Existing projects are unaffected: bump @fernandojvideira/vue-ui-kit to ^0.5.1 yourself.

    Downloads
  • v0.2.2 e36c0b3355

    Draft v0.2.2 Stable

    FernandoJVideira released this 2026-10-11 20:44:48 +00:00 | 2 commits to main since this release

    Changes

    • Generated Vue projects now use @fernandojvideira/vue-ui-kit 0.5.0 (was 0.4.1), via the updated project-template.
      • Accessible names (menu toggle, dialog close, pagination, etc.) are now overridable per component or app-wide.
      • Sturdier navbar mobile menu, higher-contrast borders and inputs, and smaller bundles (unused components tree-shake; markdown libraries load on demand).
    • Generated projects no longer carry the temporary minimumReleaseAge exclusions for the kit.

    Upgrading

    Rebuild or reinstall the binary; draft version reports v0.2.2. Existing projects are unaffected: bump @fernandojvideira/vue-ui-kit to ^0.5.1 yourself.

    Downloads
  • v0.2.1 7285594f3c

    Draft v0.2.1 Stable

    FernandoJVideira released this 2026-10-08 23:05:18 +00:00 | 6 commits to main since this release

    Fixes two runtime breakages in projects generated by v0.2.0, and moves generated clients to @lucide/vue. Upgrade recommended if you generated a client with v0.2.0.

    Fixed

    • Generated clients could break at runtime. A fresh Vue client rendered a blank /login (Injection Symbol(TabsRootContext) not found), and Nuxt clients could fail server rendering on pages containing a Dialog. Vite's dependency pre-bundler bundled vue-ui-kit's source with reka-ui inlined, while the kit's .vue files imported reka-ui from source. That produced two module instances whose provide/inject contexts could not find each other. Generated vite.config.ts and nuxt.config.ts now exclude @fernandojvideira/vue-ui-kit from optimizeDeps. The v0.2.0 notes listed this fix, but it only reached the template and not generated projects. This release delivers it.

    Changed

    • Auth tabs now drive the URL. The Log in / Register tabs navigate between /login and /signup, keeping ?redirect=. Refresh, shared links and back/forward land on the right tab, and typed input survives switching. Nuxt adds the /signup route record with a pages:extend hook; Vue serves both routes from one Auth.vue. Existing /signup links keep working.
    • Generated clients install @lucide/vue instead of the deprecated lucide-vue-next, matching vue-ui-kit 0.4.1. The app and the kit now share one copy of the icon package.

    Ships with

    Nuxt client Vue client
    @fernandojvideira/vue-ui-kit ^0.4.1 ^0.4.1
    @lucide/vue ^1.53.0 ^1.53.0
    Framework Nuxt ^4.3.0 Vite ^8.1.5
    vue ^3.5.40 ^3.5.40
    vue-router ^4.6.4 ^5.2.0
    pinia ^3.0.4 ^4.0.2
    tailwindcss ^4.2.1 ^4.2.1
    typescript ~6.0.0 ~6.0.0

    Client images are built on node:22-alpine (Nuxt runs Nitro; Vue is served by nginx:1.27-alpine), with pnpm 11.22.0 for the build.

    Upgrade notes

    • Projects already generated with v0.2.0: add the exclusion to your Vite config, no other change needed. In Vue, put optimizeDeps: { exclude: ['@fernandojvideira/vue-ui-kit'] } at the top level of vite.config.ts. In Nuxt, put it inside vite: { … } in nuxt.config.ts.
    • Lockfile error in older projects: the registry now reports the kit's tarball URL in a different shape from the one older lockfiles recorded. On a machine with no pnpm cache (fresh CI, Docker), pnpm install --frozen-lockfile can fail with ERR_PNPM_TARBALL_URL_MISMATCH. Fix it by deleting the , tarball: … part of the @fernandojvideira/vue-ui-kit entry in pnpm-lock.yaml. Projects generated by this release are not affected.
    • pnpm holds back releases less than a day old. The generated monorepo's pnpm-workspace.yaml carries a temporary, version-pinned minimumReleaseAgeExclude for @fernandojvideira/[email protected] and @lucide/[email protected]. Delete both lines once 2026-10-10 has passed.
    Downloads
  • v0.2.0 39678f3ea6

    Draft v0.2.0 Stable

    FernandoJVideira released this 2026-09-16 12:28:58 +00:00 | 10 commits to main since this release

    Generated clients now ship on @fernandojvideira/vue-ui-kit, with every default page rebuilt on it, and both client images build with docker compose out of the box.

    Client scaffolding (draft new client, draft new monorepo)

    • vue-ui-kit is the component library on both frameworks. Vue drops the shadcn-vue init/add steps and imports vue-ui-kit's theme.css directly; Nuxt switches from the ui (Nuxt UI) starter to minimal with Tailwind v4 + vue-ui-kit wired by hand. The leftover shadcn-vue / Nuxt UI config, deps, and generated component files are gone.
    • Default pages redesigned on real kit components — Card, FormField, Dialog, Select, EmptyState, Skeleton, Avatar, Badge, Alert, Spinner — with a shared useEntrance() fade/rise entrance and .press tap feedback matching the kit.
    • Tabbed auth card. /login and /signup share one Log in / Register card after the kit's AuthDemo; the route picks the initial tab so ?redirect= and existing links keep working.
    • Single-tone page background. The tint lives once on the layout root and pages fill the viewport, instead of each page painting a band that stopped where its content ended.
    • Docker images for both clients. Nuxt runs its Nitro server; Vue is served by nginx with a history-mode fallback and /api/ proxied to the api container (resolved per request, so it starts even before api is up). Both mount ~/.npmrc as a build secret to fetch @fernandojvideira/vue-ui-kit from the Gitea registry — nothing is baked into the image — and the monorepo's docker-compose.yml wires the secret up, so just local / docker compose build need no extra flags.
    • typescript pinned to ~6.0.0 in the Nuxt scaffold: the minimal starter has no TypeScript devDependency, and an unpinned install lands on TS 7, which breaks the cross-file type resolution vue-ui-kit's components rely on.

    Fixed

    • Generated monorepos couldn't build their client image. The compose file referenced apps/client/Dockerfile but the Nuxt overlay never wrote it, and the Vue client had no image at all. Both now ship one (see above).
    • Vue monorepos had a stale root lockfile. The Vue scaffold wrote a pnpm-workspace.yaml into apps/client, making it its own workspace, so installs updated a nested lockfile while the root one kept describing the template's Nuxt client — pnpm install --frozen-lockfile refused it. It's now only written for a standalone client.
    • Vue projects were missing AuthCard.vue. The overlay listed components by name; it now embeds src/components/ as a whole.
    • Nuxt SSR crashed on any page using Dialog (Injection Symbol(DialogRootContext) not found). The two client apps pinned different vue ranges, so pnpm resolved two vue/reka-ui instances and reka-ui's provide/inject context couldn't cross them. Fixed with a workspace-wide vue override and by excluding vue-ui-kit (raw .vue source) from Vite's dependency pre-bundler.
    • draft key is registered on the root command with a working --size flag.
    • make build no longer builds the binary twice; the embed step is stamped so unchanged sources skip it. New make clean.
    • Help text now covers clients and monorepos, not just Go APIs.
    • Removed a stray debug print from the service generator.
    • Fresh clients rendered a blank /login (Vue) or crashed SSR on Dialog pages (Nuxt): Vite pre-bundled vue-ui-kit with a second reka-ui instance, so its provide/inject contexts didn't match. Generated configs now exclude the package from optimizeDeps.
    • The auth card's Log in / Register tabs now update the URL (/login ↔ /signup, keeping ?redirect=) without losing typed input.

    Upgrade notes

    • Generated clients install @fernandojvideira/vue-ui-kit from its Gitea npm registry, so pnpm install and container builds need the one-time ~/.npmrc token setup described in the vue-ui-kit README
    Downloads
  • v0.1.0 dff28b1a4c

    Version 0.1.0 Stable

    FernandoJVideira released this 2026-08-25 20:46:40 +00:00 | 24 commits to main since this release

    Changelog

    v0.1.0

    Added

    • draft new now prompts for a project shape — API, Client, or Full Stack — instead of always scaffolding a standalone API.
    • draft new client scaffolds a frontend client, with a choice of framework:
      • Nuxt — generated via the official nuxi init tooling (Nuxt UI + Tailwind), so the boilerplate and dependency versions stay current rather than pinned by Draft.
      • Vue — generated via create-vue + shadcn-vue (Tailwind), with the same tooling-owns-the-boilerplate approach.
      • Both frameworks get a Draft-maintained overlay layered on top: an auth store (login/logout/register/token refresh), route guards, an API composable, and pages for login, signup, profile, organizations, email verification, and invites — pre-wired to a Draft-generated API.
    • draft new monorepo combines a scaffolded API and client under one root (apps/api, apps/client) with go.work, pnpm-workspace.yaml, docker-compose.yml, and a Justfile tying everything together.
    • assets/embedded restructured into api / monorepo-root / client-nuxt / client-vue zones, synced from a reference template repo via a generalized, job-based sync tool (tools/sync_templates.go).

    Fixed

    • draft key was unreachable as documented — it was registered under draft new key instead of the root command, and its --size flag was never actually registered with Cobra, so passing --size failed outright (and the dead flag-lookup code would have nil-panicked if ever reached). It's now a proper top-level command; an explicit --size below 32 is rejected with an error instead of being silently replaced by the default.
    • Organizations were missing from the gRPC branch of generated main.go — the HTTP and gRPC branches now both wire up the same OrganizationService.
    • Fixed a silent no-op in the client-scaffolding overlay copier where branding replacements (e.g. project name substitution) were computed but never actually written to disk.
    • Fixed Go's embed package silently dropping dotfiles (.env.example) from the embedded template zones — //go:embed now uses all: prefixes.
    • Fixed create-vue dropping into an interactive prompt when scaffolding into a nested path (e.g. apps/client inside a monorepo), since it requires its target directory to double as a valid npm package name.
    • Removed a stray debug print() call left in draft new service.
    • randomString (used by draft key) no longer generates a random prime number per character just to pick a random index — replaced with a direct random-integer draw.

    Changed

    • Consolidated the API-scaffolding logic shared between draft new api and draft new monorepo into a single orchestrator (runNewProject + scaffoldRecipe), removing duplicated prompt/install/tidy logic between the two commands.
    • Extracted shared tool-availability checks (pnpm, npx) into one helper instead of duplicating the check across client and monorepo.
    Downloads