@mostajs/qrpanel 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -0
- package/dist/client.d.ts +12 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +22 -3
- package/dist/client.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,6 +8,28 @@ QR code panel — générateur server-side *(PNG / SVG / data URL via la lib `qr
|
|
|
8
8
|
|
|
9
9
|
Aucune dépendance Chromium / Puppeteer / node-gyp. Pure-JS pour `qrcode`, prebuilt-binaries Rust pour le rasterizer (`@resvg/resvg-js`). Fonctionne identiquement sur **Linux, macOS, Windows** *(Node ≥18)*.
|
|
10
10
|
|
|
11
|
+
## ⚠️ Next.js (App Router)
|
|
12
|
+
|
|
13
|
+
`@resvg/resvg-js` charge un **binaire natif** (`.node`). Webpack ne sait pas le bundler — il faut le déclarer en *server external* dans `next.config.js` :
|
|
14
|
+
|
|
15
|
+
```js
|
|
16
|
+
/** @type {import('next').NextConfig} */
|
|
17
|
+
const nextConfig = {
|
|
18
|
+
// Seulement @resvg/resvg-js (vraie dep native).
|
|
19
|
+
// ⚠️ Ne PAS mettre '@mostajs/qrpanel' ici : ça externaliserait
|
|
20
|
+
// aussi /client (composant React <QrPanel>), et un Server
|
|
21
|
+
// Component qui le rend crasherait avec "React.useState=null".
|
|
22
|
+
serverExternalPackages: ['@resvg/resvg-js'],
|
|
23
|
+
}
|
|
24
|
+
export default nextConfig
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
*(Sur Next.js < 15, la clé s'appelle `experimental.serverComponentsExternalPackages`.)* Sans ça, `npm run build` échoue avec :
|
|
28
|
+
```
|
|
29
|
+
Module parse failed: Unexpected character '' (1:0)
|
|
30
|
+
./node_modules/@resvg/resvg-js-linux-x64-gnu/resvgjs.linux-x64-gnu.node
|
|
31
|
+
```
|
|
32
|
+
|
|
11
33
|
## Installation
|
|
12
34
|
|
|
13
35
|
```bash
|
package/dist/client.d.ts
CHANGED
|
@@ -21,10 +21,21 @@ export interface QrPanelProps {
|
|
|
21
21
|
mailSubject?: string;
|
|
22
22
|
/** Pré-remplissage `mailto` body — `{url}` est remplacé par l'URL courante. */
|
|
23
23
|
mailBodyTemplate?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Destinataires placés dans `To:` du `mailto:` *(visibles entre eux)*.
|
|
26
|
+
* Liste d'emails (array ou string CSV). Combinable avec `mailBcc`.
|
|
27
|
+
*/
|
|
28
|
+
mailTo?: string[] | string;
|
|
29
|
+
/**
|
|
30
|
+
* Destinataires placés dans `Bcc:` *(invisibles entre eux — recommandé
|
|
31
|
+
* pour les listes de cohort où les participants ne doivent pas voir
|
|
32
|
+
* les adresses des autres)*. Liste d'emails (array ou string CSV).
|
|
33
|
+
*/
|
|
34
|
+
mailBcc?: string[] | string;
|
|
24
35
|
/** Taille de l'image QR. Default 260. */
|
|
25
36
|
qrSize?: number;
|
|
26
37
|
/** Classe CSS racine optionnelle. */
|
|
27
38
|
className?: string;
|
|
28
39
|
}
|
|
29
|
-
export declare function QrPanel({ modes, initialModeIndex, title, mailSubject, mailBodyTemplate, qrSize, className, }: QrPanelProps): import("react/jsx-runtime").JSX.Element | null;
|
|
40
|
+
export declare function QrPanel({ modes, initialModeIndex, title, mailSubject, mailBodyTemplate, mailTo, mailBcc, qrSize, className, }: QrPanelProps): import("react/jsx-runtime").JSX.Element | null;
|
|
30
41
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":"AAkBA,MAAM,WAAW,WAAW;IAC1B,8EAA8E;IAC9E,GAAG,EAAE,MAAM,CAAA;IACX,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAA;IACX,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAA;IACb,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,KAAK,EAAE,WAAW,EAAE,CAAA;IACpB,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":"AAkBA,MAAM,WAAW,WAAW;IAC1B,8EAA8E;IAC9E,GAAG,EAAE,MAAM,CAAA;IACX,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAA;IACX,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAA;IACb,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,KAAK,EAAE,WAAW,EAAE,CAAA;IACpB,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IAC3B,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAWD,wBAAgB,OAAO,CAAC,EACtB,KAAK,EAAE,gBAAoB,EAAE,KAAsC,EACnE,WAA0B,EAAE,gBAA+B,EAC3D,MAAM,EAAE,OAAO,EACf,MAAY,EAAE,SAAc,GAC7B,EAAE,YAAY,kDA8Gd"}
|
package/dist/client.js
CHANGED
|
@@ -16,14 +16,33 @@
|
|
|
16
16
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
17
17
|
import { useState, useId } from 'react';
|
|
18
18
|
const DEFAULT_BODY = 'Bonjour,\n\nVoici ton lien personnel :\n\n{url}\n\n';
|
|
19
|
-
|
|
19
|
+
/** Accepte une string CSV ou un array, normalise en array d'emails non-vides. */
|
|
20
|
+
function normaliseRecipients(input) {
|
|
21
|
+
if (!input)
|
|
22
|
+
return [];
|
|
23
|
+
const arr = Array.isArray(input) ? input : input.split(',');
|
|
24
|
+
return arr.map(s => s.trim()).filter(s => s.length > 0);
|
|
25
|
+
}
|
|
26
|
+
export function QrPanel({ modes, initialModeIndex = 0, title = 'QR code & lien d\'invitation', mailSubject = 'Invitation', mailBodyTemplate = DEFAULT_BODY, mailTo, mailBcc, qrSize = 260, className = '', }) {
|
|
20
27
|
const [idx, setIdx] = useState(Math.min(Math.max(0, initialModeIndex), modes.length - 1));
|
|
21
28
|
const [copied, setCopied] = useState(false);
|
|
22
29
|
const textareaId = useId();
|
|
23
30
|
const current = modes[idx] ?? modes[0];
|
|
24
31
|
if (!current)
|
|
25
32
|
return null;
|
|
26
|
-
const
|
|
33
|
+
const toList = normaliseRecipients(mailTo);
|
|
34
|
+
const bccList = normaliseRecipients(mailBcc);
|
|
35
|
+
const parts = [];
|
|
36
|
+
parts.push(`subject=${encodeURIComponent(mailSubject)}`);
|
|
37
|
+
parts.push(`body=${encodeURIComponent(mailBodyTemplate.replace('{url}', current.url))}`);
|
|
38
|
+
if (bccList.length > 0)
|
|
39
|
+
parts.push(`bcc=${encodeURIComponent(bccList.join(','))}`);
|
|
40
|
+
// `To:` est positionné juste après `mailto:` quand fourni (les
|
|
41
|
+
// destinataires To: sont rendus visibles entre eux par tous les clients).
|
|
42
|
+
// Les Bcc: passent par query param `&bcc=`.
|
|
43
|
+
const toPart = toList.length > 0 ? encodeURIComponent(toList.join(',')) : '';
|
|
44
|
+
const mailto = `mailto:${toPart}?${parts.join('&')}`;
|
|
45
|
+
const recipientCount = toList.length + bccList.length;
|
|
27
46
|
async function copy() {
|
|
28
47
|
try {
|
|
29
48
|
await navigator.clipboard.writeText(current.url);
|
|
@@ -35,6 +54,6 @@ export function QrPanel({ modes, initialModeIndex = 0, title = 'QR code & lien d
|
|
|
35
54
|
el?.select();
|
|
36
55
|
}
|
|
37
56
|
}
|
|
38
|
-
return (_jsxs("div", { className: 'bg-white border border-slate-200 rounded-xl p-4 space-y-3 ' + className, children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("h2", { className: "font-semibold text-slate-900", children: title }), modes.length > 1 && (_jsx("div", { className: "flex items-center gap-1 text-xs", children: modes.map((m, i) => (_jsx("button", { type: "button", onClick: () => setIdx(i), className: 'px-2 py-1 rounded ' + (i === idx ? 'bg-blue-600 text-white' : 'bg-slate-100 hover:bg-slate-200'), children: m.label }, m.key))) }))] }), current.description && (_jsx("p", { className: "text-xs text-slate-500", children: current.description })), _jsxs("div", { className: "grid md:grid-cols-2 gap-4 items-start", children: [_jsxs("div", { className: "flex flex-col items-center gap-2", children: [_jsx("img", { src: current.qrSrc, alt: `QR ${current.label}`, width: qrSize, height: qrSize, className: "border border-slate-200 rounded-lg" }), _jsx("a", { href: current.qrSrc, download: `qr-${current.key}.png`, className: "px-3 py-1.5 rounded text-xs bg-emerald-50 hover:bg-emerald-100 text-emerald-700 border border-emerald-200", children: "\u2B07 T\u00E9l\u00E9charger le PNG" })] }), _jsxs("div", { className: "space-y-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: "block text-xs font-medium text-slate-700 mb-1", children: "Lien direct *(\u00E0 coller dans un email)*" }), _jsx("textarea", { id: textareaId, readOnly: true, value: current.url, rows: current.url.length > 60 ? 4 : 2, onClick: (e) => e.currentTarget.select(), className: "w-full px-2 py-1.5 border border-slate-300 rounded text-xs font-mono bg-slate-50 break-all" })] }), _jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [_jsx("button", { type: "button", onClick: copy, className: "px-3 py-1.5 rounded text-xs bg-blue-600 text-white hover:bg-blue-700", children: copied ? '✓ Copié' : '📋 Copier le lien' }), _jsx("a", { href: current.url, target: "_blank", rel: "noreferrer", className: "px-3 py-1.5 rounded text-xs bg-slate-100 hover:bg-slate-200 text-slate-700", children: "\u2197 Ouvrir" }),
|
|
57
|
+
return (_jsxs("div", { className: 'bg-white border border-slate-200 rounded-xl p-4 space-y-3 ' + className, children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("h2", { className: "font-semibold text-slate-900", children: title }), modes.length > 1 && (_jsx("div", { className: "flex items-center gap-1 text-xs", children: modes.map((m, i) => (_jsx("button", { type: "button", onClick: () => setIdx(i), className: 'px-2 py-1 rounded ' + (i === idx ? 'bg-blue-600 text-white' : 'bg-slate-100 hover:bg-slate-200'), children: m.label }, m.key))) }))] }), current.description && (_jsx("p", { className: "text-xs text-slate-500", children: current.description })), _jsxs("div", { className: "grid md:grid-cols-2 gap-4 items-start", children: [_jsxs("div", { className: "flex flex-col items-center gap-2", children: [_jsx("img", { src: current.qrSrc, alt: `QR ${current.label}`, width: qrSize, height: qrSize, className: "border border-slate-200 rounded-lg" }), _jsx("a", { href: current.qrSrc, download: `qr-${current.key}.png`, className: "px-3 py-1.5 rounded text-xs bg-emerald-50 hover:bg-emerald-100 text-emerald-700 border border-emerald-200", children: "\u2B07 T\u00E9l\u00E9charger le PNG" })] }), _jsxs("div", { className: "space-y-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: "block text-xs font-medium text-slate-700 mb-1", children: "Lien direct *(\u00E0 coller dans un email)*" }), _jsx("textarea", { id: textareaId, readOnly: true, value: current.url, rows: current.url.length > 60 ? 4 : 2, onClick: (e) => e.currentTarget.select(), className: "w-full px-2 py-1.5 border border-slate-300 rounded text-xs font-mono bg-slate-50 break-all" })] }), _jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [_jsx("button", { type: "button", onClick: copy, className: "px-3 py-1.5 rounded text-xs bg-blue-600 text-white hover:bg-blue-700", children: copied ? '✓ Copié' : '📋 Copier le lien' }), _jsx("a", { href: current.url, target: "_blank", rel: "noreferrer", className: "px-3 py-1.5 rounded text-xs bg-slate-100 hover:bg-slate-200 text-slate-700", children: "\u2197 Ouvrir" }), _jsxs("a", { href: mailto, className: "px-3 py-1.5 rounded text-xs bg-amber-50 hover:bg-amber-100 text-amber-700 border border-amber-200", title: recipientCount > 0 ? `Ouvre le client mail avec ${recipientCount} destinataire(s) pré-remplis` : 'Ouvre le client mail avec sujet + corps pré-remplis', children: ["\u2709 Pr\u00E9-remplir un mail", recipientCount > 0 ? ` (${recipientCount})` : ''] })] })] })] })] }));
|
|
39
58
|
}
|
|
40
59
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,0CAA0C;AAC1C,EAAE;AACF,mEAAmE;AACnE,2DAA2D;AAC3D,uEAAuE;AACvE,8CAA8C;AAC9C,EAAE;AACF,kEAAkE;AAClE,8DAA8D;AAC9D,EAAE;AACF,qEAAqE;AACrE,qEAAqE;AACrE,QAAQ;AAER,YAAY,CAAA;;AACZ,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mostajs/qrpanel",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "QR code panel — server-side PNG/SVG generator with 12 built-in themes (image-as-frame composite, ECC=H), config-driven (.qrconfig.json), cross-OS no chromium, + React <QrPanel> client with copy/share/mailto.",
|
|
5
5
|
"author": "Dr Hamid MADANI <drmdh@msn.com>",
|
|
6
6
|
"license": "AGPL-3.0-or-later",
|