Vue 3 components for poulpinou-django: a mail-template editor
  • Vue 49.5%
  • TypeScript 36.4%
  • JavaScript 13.4%
  • HTML 0.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
renovate-bot e1c0875948
All checks were successful
ci / build (push) Successful in 32s
ci / publish (push) Successful in 19s
chore(deps): lock file maintenance (#8)
This PR contains the following updates:

| Update | Change |
|---|---|
| lockFileMaintenance | All locks refreshed |

🔧 This Pull Request updates lock files to use the latest dependency versions.

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 6am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xOTguMyIsInVwZGF0ZWRJblZlciI6IjQ0LjE5OC4zIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->

Reviewed-on: #8
2026-11-02 06:19:39 +00:00
.forgejo ci: build before publishing -- dist/ was missing from published packages 2026-10-26 06:48:43 +01:00
dev feature: initial poulpinou-vue scaffold (MailTemplateEditor + API client) 2026-10-25 23:42:17 +01:00
src chore(deps): update dependency typescript to v6 (#2) 2026-10-26 08:40:14 +00:00
.gitignore feature: initial poulpinou-vue scaffold (MailTemplateEditor + API client) 2026-10-25 23:42:17 +01:00
eslint.config.js feature: initial poulpinou-vue scaffold (MailTemplateEditor + API client) 2026-10-25 23:42:17 +01:00
index.html feature: initial poulpinou-vue scaffold (MailTemplateEditor + API client) 2026-10-25 23:42:17 +01:00
LICENSE feature: initial poulpinou-vue scaffold (MailTemplateEditor + API client) 2026-10-25 23:42:17 +01:00
package.json chore(deps): update pnpm to v12.16.1 (#5) 2026-10-29 07:59:37 +00:00
pnpm-lock.yaml chore(deps): lock file maintenance (#8) 2026-11-02 06:19:39 +00:00
pnpm-workspace.yaml feature: initial poulpinou-vue scaffold (MailTemplateEditor + API client) 2026-10-25 23:42:17 +01:00
README.md feature: initial poulpinou-vue scaffold (MailTemplateEditor + API client) 2026-10-25 23:42:17 +01:00
renovate.json fix: revert quill to 2.0.2, exclude it from Renovate 2026-10-26 06:49:45 +01:00
tsconfig.json chore(deps): update dependency typescript to v6 (#2) 2026-10-26 08:40:14 +00:00
vite.config.ts feature: initial poulpinou-vue scaffold (MailTemplateEditor + API client) 2026-10-25 23:42:17 +01:00
vitest.config.ts feature: initial poulpinou-vue scaffold (MailTemplateEditor + API client) 2026-10-25 23:42:17 +01:00

poulpinou-vue

CI Coverage Tests License: MIT

Vue 3 components for poulpinou-django: a mail-template editor (subject, WYSIWYG body, variable chips, attachments) talking to poulpinou's own [api] extra -- sandboxed Jinja2 ({{ var }}, {% if %}, {% for %}), not a hand-rolled regex substitution.

Installation

npm install poulpinou-vue
import { createPoulpinouClient, MailTemplateEditor } from "poulpinou-vue";
import "poulpinou-vue/style.css"; // Quill's own toolbar/editor styling

const client = createPoulpinouClient({ baseURL: "/poulpinou" });
<MailTemplateEditor :client="client" />

That's the whole integration: the component fetches every mail type poulpinou's registry knows about (key, label, variables) from the API itself, so there's no hardcoded list of keys to keep in sync on the frontend side.

Components

  • MailTemplateEditor: the full editor -- a tab per registered mail type, subject field, variable chips (a many variable inserts a ready-to-edit {% for %} skeleton, not a bare {{ var }}), WYSIWYG body editor, "revert to default" button, attachments (list/upload/ delete).
  • WysiwygEditor: the underlying rich-text editor (Quill), exported on its own too in case a host page wants to build its own layout around just the editing widget.

Theming

Colors are plain CSS custom properties with sensible defaults, not a hard dependency on any specific design system:

Variable Default
--pv-ink #111827
--pv-slate #6b7280
--pv-paper #f9fafb
--pv-border #d1d5db
--pv-red #dc2626 (active tab, destructive actions)

Define any of them on an ancestor element to theme the editor; leave them undefined and it still renders legibly.

Development

pnpm install
pnpm run dev          # demo page, proxies /poulpinou to a local Django instance on :8000
pnpm run test:unit    # vitest + msw, no real backend needed
pnpm run lint
pnpm run build

License

MIT, see LICENSE.