@netlib/widerrufsbutton 1.1.2 → 1.2.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 +4 -4
- package/dist/fallback.cjs.js +383 -0
- package/dist/fallback.d.ts +21 -4
- package/dist/fallback.es.js +413 -0
- package/dist/index.cjs.js +124 -68
- package/dist/index.d.ts +1 -1
- package/dist/index.es.js +279 -208
- package/dist/styles.d.ts +1 -1
- package/dist/types.d.ts +5 -3
- package/dist/widerruf.html +18 -30
- package/dist/widerrufsbutton.iife.js +17 -9
- package/package.json +8 -3
package/dist/index.cjs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),c=require("react"),q=require("react-dom");async function F(e,t){const a={"Content-Type":"application/json"};e.authToken&&(a.Authorization=`Bearer ${e.authToken}`);const o={action:e.action,payload:{...t,datum:new Date().toISOString()}},s=await fetch(e.apiUrl,{method:"PATCH",headers:a,body:JSON.stringify(o)});let i;try{i=await s.json()}catch{if(!s.ok)throw new Error(`Server antwortete mit Status ${s.status}`);return}if(i!==null&&typeof i=="object"&&"ok"in i&&i.ok===!1){const d=i.message;throw new Error(typeof d=="string"&&d?d:`Server antwortete mit Status ${s.status}`)}if(!s.ok)throw new Error(`Server antwortete mit Status ${s.status}`)}const A=new Date().toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"}),O={name:"",email:"",orderNumber:"",reason:"",datum:A};function j(e){const t={};return e.name.trim()||(t.name="Bitte geben Sie Ihren Namen an."),e.email.trim()?/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e.email)||(t.email="Bitte geben Sie eine gültige E-Mail-Adresse an."):t.email="Bitte geben Sie Ihre E-Mail-Adresse an.",e.orderNumber.trim()||(t.orderNumber="Bitte geben Sie die Bestellnummer oder Vertragsnummer an."),t}function B({config:e,onClose:t}){const[a,o]=c.useState(O),[s,i]=c.useState({}),[d,N]=c.useState({}),[p,v]=c.useState("idle"),[S,$]=c.useState(""),E=c.useRef(null);c.useEffect(()=>{var u;(u=E.current)==null||u.focus();const n=b=>b.key==="Escape"&&t();return document.addEventListener("keydown",n),()=>document.removeEventListener("keydown",n)},[t]);function w(n,u){const b={...a,[n]:u};if(o(b),d[n]){const h=j(b);i(x=>({...x,[n]:h[n]}))}}function y(n){N(b=>({...b,[n]:!0}));const u=j(a);i(b=>({...b,[n]:u[n]}))}async function L(n){var h,x;n.preventDefault();const u=Object.fromEntries(Object.keys(a).map(f=>[f,!0]));N(u);const b=j(a);if(i(b),!(Object.keys(b).length>0)){v("loading"),$("");try{await F(e,a),v("success"),(h=e.onSuccess)==null||h.call(e)}catch(f){const W=f instanceof Error?f:new Error("Ein unbekannter Fehler ist aufgetreten.");$(W.message),v("error"),(x=e.onError)==null||x.call(e,W)}}}const M=e.companyName?`Widerruf – ${e.companyName}`:"Widerrufsformular";return r.jsx("div",{className:"wrb-overlay",role:"dialog","aria-modal":"true","aria-labelledby":"wrb-title",onClick:n=>n.target===n.currentTarget&&t(),children:r.jsxs("div",{className:"wrb-modal",children:[r.jsxs("div",{className:"wrb-modal-header",children:[r.jsx("h2",{className:"wrb-modal-title",id:"wrb-title",children:M}),r.jsx("button",{className:"wrb-close-btn",onClick:t,"aria-label":"Schließen",type:"button",children:"✕"})]}),p==="success"?r.jsxs("div",{className:"wrb-modal-body",children:[r.jsxs("div",{className:"wrb-success",children:[r.jsx("span",{className:"wrb-success-icon",children:"✓"}),r.jsx("h3",{children:"Widerruf eingegangen"}),r.jsxs("p",{children:["Ihr Widerruf wurde erfolgreich übermittelt. Sie erhalten in Kürze eine Bestätigung an ",r.jsx("strong",{children:a.email}),"."]})]}),r.jsx(z,{links:e.legalLinks})]}):r.jsxs("div",{className:"wrb-modal-body",children:[e.introText&&r.jsx("p",{className:"wrb-intro",children:e.introText}),p==="error"&&S&&r.jsx("div",{className:"wrb-alert wrb-alert-error",role:"alert",children:S}),r.jsxs("form",{onSubmit:L,noValidate:!0,children:[r.jsx(m,{label:"Name",required:!0,error:d.name?s.name:void 0,children:r.jsx("input",{ref:E,className:`wrb-input${d.name&&s.name?" wrb-error":""}`,type:"text",autoComplete:"name",value:a.name,onChange:n=>w("name",n.target.value),onBlur:()=>y("name"),placeholder:"Vor- und Nachname"})}),r.jsx(m,{label:"E-Mail-Adresse",required:!0,hint:"Hierüber erhalten Sie die Eingangsbestätigung.",error:d.email?s.email:void 0,children:r.jsx("input",{className:`wrb-input${d.email&&s.email?" wrb-error":""}`,type:"email",autoComplete:"email",value:a.email,onChange:n=>w("email",n.target.value),onBlur:()=>y("email"),placeholder:"name@beispiel.de"})}),r.jsx(m,{label:"Bestell- / Auftrags- / Vertragsnummer",required:!0,hint:"Zu finden in Ihrer Bestellbestätigung.",error:d.orderNumber?s.orderNumber:void 0,children:r.jsx("input",{className:`wrb-input${d.orderNumber&&s.orderNumber?" wrb-error":""}`,type:"text",value:a.orderNumber,onChange:n=>w("orderNumber",n.target.value),onBlur:()=>y("orderNumber"),placeholder:"z.B. 10045678"})}),r.jsx(m,{label:"reason",hint:"Freiwillige Angabe – ein Widerruf ist ohne Angabe von Gründen möglich.",children:r.jsx("textarea",{className:"wrb-textarea",value:a.reason,onChange:n=>w("reason",n.target.value),placeholder:"Optional",rows:3})}),r.jsx(m,{label:"Datum der Widerrufserklärung",children:r.jsx("div",{className:"wrb-date-display",children:A})}),r.jsxs("div",{className:"wrb-actions",children:[r.jsx("button",{type:"button",className:"wrb-cancel-btn",onClick:t,children:e.cancelLabel??"Abbrechen"}),r.jsx("button",{type:"submit",className:"wrb-submit-btn",disabled:p==="loading",children:p==="loading"?"Wird gesendet…":e.submitLabel??"Absenden"})]})]}),r.jsx(z,{links:e.legalLinks})]})]})})}function m({label:e,required:t,hint:a,error:o,children:s}){return r.jsxs("div",{className:"wrb-field",children:[r.jsxs("label",{className:"wrb-label",children:[e,t&&r.jsx("span",{className:"wrb-required","aria-hidden":"true",children:"*"})]}),s,a&&!o&&r.jsx("p",{className:"wrb-hint",children:a}),o&&r.jsx("p",{className:"wrb-field-error",role:"alert",children:o})]})}function z({links:e}){return e!=null&&e.length?r.jsx("div",{className:"wrb-legal-links",children:e.map(t=>r.jsx("a",{href:t.href,className:"wrb-legal-link",target:"_blank",rel:"noopener noreferrer",children:t.name},t.href))}):null}const k=`
|
|
2
2
|
/* Widerrufsbutton widget — prefix: wrb- */
|
|
3
3
|
.wrb-btn {
|
|
4
4
|
display: inline-flex;
|
|
@@ -158,6 +158,10 @@
|
|
|
158
158
|
border-top: 1px solid #e5e7eb;
|
|
159
159
|
}
|
|
160
160
|
.wrb-submit-btn {
|
|
161
|
+
display: inline-flex;
|
|
162
|
+
align-items: center;
|
|
163
|
+
justify-content: center;
|
|
164
|
+
text-decoration: none;
|
|
161
165
|
padding: 10px 22px;
|
|
162
166
|
background: #c0392b;
|
|
163
167
|
color: #fff;
|
|
@@ -172,6 +176,10 @@
|
|
|
172
176
|
.wrb-submit-btn:hover:not(:disabled) { background: #a93226; }
|
|
173
177
|
.wrb-submit-btn:disabled { opacity: 0.6; cursor: not-allowed; }
|
|
174
178
|
.wrb-cancel-btn {
|
|
179
|
+
display: inline-flex;
|
|
180
|
+
align-items: center;
|
|
181
|
+
justify-content: center;
|
|
182
|
+
text-decoration: none;
|
|
175
183
|
padding: 10px 18px;
|
|
176
184
|
background: transparent;
|
|
177
185
|
color: #374151;
|
|
@@ -219,65 +227,24 @@
|
|
|
219
227
|
color: #374151;
|
|
220
228
|
text-decoration: underline;
|
|
221
229
|
}
|
|
222
|
-
`;function
|
|
230
|
+
`;function D(){const e="wrb-styles";if(document.getElementById(e))return;const t=document.createElement("style");t.id=e,t.textContent=k,document.head.appendChild(t)}function I({config:e}){const[t,a]=c.useState(!1);return c.useEffect(()=>{D()},[]),r.jsxs(r.Fragment,{children:[r.jsx("button",{type:"button",className:`wrb-btn${e.buttonClass?` ${e.buttonClass}`:""}`,onClick:()=>a(!0),children:e.buttonLabel??"Vertrag widerrufen"}),t&&q.createPortal(r.jsx(B,{config:e,onClose:()=>a(!1)}),document.body)]})}function l(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function T(){return new Date().toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})}function g(e){var t;return(t=e.legalLinks)!=null&&t.length?`
|
|
223
231
|
<div class="wrb-legal-links">
|
|
224
|
-
${e.legalLinks.map(
|
|
232
|
+
${e.legalLinks.map(a=>`<a href="${l(a.href)}" class="wrb-legal-link" rel="noopener noreferrer">${l(a.name)}</a>`).join(`
|
|
225
233
|
`)}
|
|
226
|
-
</div>`:"";return
|
|
227
|
-
<html lang="de">
|
|
228
|
-
<head>
|
|
229
|
-
<meta charset="UTF-8">
|
|
230
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
231
|
-
<title>${n}</title>
|
|
232
|
-
<style>
|
|
233
|
-
*, *::before, *::after { box-sizing: border-box; }
|
|
234
|
-
body { margin: 0; background: #f9fafb; }
|
|
235
|
-
.wrb-page {
|
|
236
|
-
min-height: 100vh;
|
|
237
|
-
display: flex;
|
|
238
|
-
align-items: flex-start;
|
|
239
|
-
justify-content: center;
|
|
240
|
-
padding: 40px 16px;
|
|
241
|
-
}
|
|
242
|
-
.wrb-page .wrb-modal { max-height: none; }
|
|
243
|
-
.wrb-page .wrb-modal-title { font-size: 20px; }
|
|
244
|
-
${B}
|
|
245
|
-
</style>
|
|
246
|
-
</head>
|
|
247
|
-
<body>
|
|
248
|
-
<div class="wrb-page">
|
|
249
|
-
<div class="wrb-modal">
|
|
250
|
-
<div class="wrb-modal-header">
|
|
251
|
-
<h1 class="wrb-modal-title">${n}</h1>
|
|
252
|
-
</div>
|
|
253
|
-
<div class="wrb-modal-body">
|
|
254
|
-
${i}
|
|
255
|
-
<form method="POST" action="${d}" novalidate>
|
|
234
|
+
</div>`:""}function C(e,t,a="",o=""){const s=l(e.successUrl??a),i=l(e.errorUrl??o);return`
|
|
256
235
|
<div class="wrb-field">
|
|
257
236
|
<label class="wrb-label">
|
|
258
237
|
Name <span class="wrb-required" aria-hidden="true">*</span>
|
|
259
238
|
</label>
|
|
260
|
-
<input
|
|
261
|
-
|
|
262
|
-
type="text"
|
|
263
|
-
name="name"
|
|
264
|
-
autocomplete="name"
|
|
265
|
-
placeholder="Vor- und Nachname"
|
|
266
|
-
required
|
|
267
|
-
>
|
|
239
|
+
<input class="wrb-input" type="text" name="name" autocomplete="name"
|
|
240
|
+
placeholder="Vor- und Nachname" required>
|
|
268
241
|
</div>
|
|
269
242
|
<div class="wrb-field">
|
|
270
243
|
<label class="wrb-label">
|
|
271
244
|
E-Mail-Adresse <span class="wrb-required" aria-hidden="true">*</span>
|
|
272
245
|
</label>
|
|
273
|
-
<input
|
|
274
|
-
|
|
275
|
-
type="email"
|
|
276
|
-
name="email"
|
|
277
|
-
autocomplete="email"
|
|
278
|
-
placeholder="name@beispiel.de"
|
|
279
|
-
required
|
|
280
|
-
>
|
|
246
|
+
<input class="wrb-input" type="email" name="email" autocomplete="email"
|
|
247
|
+
placeholder="name@beispiel.de" required>
|
|
281
248
|
<p class="wrb-hint">Hierüber erhalten Sie die Eingangsbestätigung.</p>
|
|
282
249
|
</div>
|
|
283
250
|
<div class="wrb-field">
|
|
@@ -285,23 +252,13 @@
|
|
|
285
252
|
Bestell- / Auftrags- / Vertragsnummer
|
|
286
253
|
<span class="wrb-required" aria-hidden="true">*</span>
|
|
287
254
|
</label>
|
|
288
|
-
<input
|
|
289
|
-
|
|
290
|
-
type="text"
|
|
291
|
-
name="vertragId"
|
|
292
|
-
placeholder="z.B. 10045678"
|
|
293
|
-
required
|
|
294
|
-
>
|
|
255
|
+
<input class="wrb-input" type="text" name="orderNumber"
|
|
256
|
+
placeholder="z.B. 10045678" required>
|
|
295
257
|
<p class="wrb-hint">Zu finden in Ihrer Bestellbestätigung.</p>
|
|
296
258
|
</div>
|
|
297
259
|
<div class="wrb-field">
|
|
298
|
-
<label class="wrb-label">
|
|
299
|
-
<textarea
|
|
300
|
-
class="wrb-textarea"
|
|
301
|
-
name="widerrufsgrund"
|
|
302
|
-
placeholder="Optional"
|
|
303
|
-
rows="3"
|
|
304
|
-
></textarea>
|
|
260
|
+
<label class="wrb-label">reason</label>
|
|
261
|
+
<textarea class="wrb-textarea" name="reason" placeholder="Optional" rows="3"></textarea>
|
|
305
262
|
<p class="wrb-hint">
|
|
306
263
|
Freiwillige Angabe – ein Widerruf ist ohne Angabe von Gründen möglich.
|
|
307
264
|
</p>
|
|
@@ -311,17 +268,116 @@
|
|
|
311
268
|
<div class="wrb-date-display">${t}</div>
|
|
312
269
|
<input type="hidden" name="datum" value="${t}">
|
|
313
270
|
</div>
|
|
314
|
-
<input type="hidden" name="action" value="${
|
|
315
|
-
${
|
|
271
|
+
<input type="hidden" name="action" value="${l(e.action)}">
|
|
272
|
+
${s?`<input type="hidden" name="successUrl" value="${s}">`:""}
|
|
273
|
+
${i?`<input type="hidden" name="errorUrl" value="${i}">`:""}`}function U(e){const t=T(),a=e.companyName?`Widerruf – ${l(e.companyName)}`:"Widerrufsformular",o=l(e.formAction??e.apiUrl??"/rest/v1/apiCancellation");return`<!DOCTYPE html>
|
|
274
|
+
<html lang="de">
|
|
275
|
+
<head>
|
|
276
|
+
<meta charset="UTF-8">
|
|
277
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
278
|
+
<title>${a}</title>
|
|
279
|
+
<style>
|
|
280
|
+
*, *::before, *::after { box-sizing: border-box; }
|
|
281
|
+
body { margin: 0; background: #f9fafb; }
|
|
282
|
+
.wrb-page {
|
|
283
|
+
min-height: 100vh;
|
|
284
|
+
display: flex;
|
|
285
|
+
align-items: flex-start;
|
|
286
|
+
justify-content: center;
|
|
287
|
+
padding: 40px 16px;
|
|
288
|
+
}
|
|
289
|
+
.wrb-page .wrb-modal { max-height: none; }
|
|
290
|
+
.wrb-page .wrb-modal-title { font-size: 20px; }
|
|
291
|
+
${k}
|
|
292
|
+
</style>
|
|
293
|
+
</head>
|
|
294
|
+
<body>
|
|
295
|
+
<div class="wrb-page">
|
|
296
|
+
<div class="wrb-modal">
|
|
297
|
+
<div class="wrb-modal-header">
|
|
298
|
+
<h1 class="wrb-modal-title">${a}</h1>
|
|
299
|
+
</div>
|
|
300
|
+
<div class="wrb-modal-body">
|
|
301
|
+
${e.introText?`<p class="wrb-intro">${l(e.introText)}</p>`:""}
|
|
302
|
+
<form method="POST" action="${o}" novalidate>
|
|
303
|
+
${C(e,t)}
|
|
316
304
|
<div class="wrb-actions">
|
|
317
305
|
<button type="submit" class="wrb-submit-btn">
|
|
318
|
-
${
|
|
306
|
+
${l(e.submitLabel??"Absenden")}
|
|
319
307
|
</button>
|
|
320
308
|
</div>
|
|
321
309
|
</form>
|
|
322
|
-
${
|
|
310
|
+
${g(e)}
|
|
323
311
|
</div>
|
|
324
312
|
</div>
|
|
325
313
|
</div>
|
|
326
314
|
</body>
|
|
327
|
-
</html>`}
|
|
315
|
+
</html>`}function H(e,{inlineStyles:t=!0}={}){const a=T(),o=e.companyName?`Widerruf – ${l(e.companyName)}`:"Widerrufsformular",s=l(e.formAction??e.apiUrl??"/rest/v1/apiCancellation"),i=`
|
|
316
|
+
#wrb-modal, #wrb-success, #wrb-error { display: none; }
|
|
317
|
+
#wrb-modal:target, #wrb-success:target, #wrb-error:target { display: flex; }`;return`${t?`<style>${i}
|
|
318
|
+
${k}</style>`:`<style>${i}</style>`}
|
|
319
|
+
|
|
320
|
+
<!-- Widerruf: Form-Modal -->
|
|
321
|
+
<div id="wrb-modal" class="wrb-overlay" role="dialog" aria-modal="true" aria-labelledby="wrb-modal-title">
|
|
322
|
+
<div class="wrb-modal">
|
|
323
|
+
<div class="wrb-modal-header">
|
|
324
|
+
<h2 class="wrb-modal-title" id="wrb-modal-title">${o}</h2>
|
|
325
|
+
<a href="#" class="wrb-close-btn" aria-label="Schließen">✕</a>
|
|
326
|
+
</div>
|
|
327
|
+
<div class="wrb-modal-body">
|
|
328
|
+
${e.introText?`<p class="wrb-intro">${l(e.introText)}</p>`:""}
|
|
329
|
+
<form method="POST" action="${s}" novalidate>
|
|
330
|
+
${C(e,a,"#wrb-success","#wrb-error")}
|
|
331
|
+
<div class="wrb-actions">
|
|
332
|
+
<a href="#" class="wrb-cancel-btn">${l(e.cancelLabel??"Abbrechen")}</a>
|
|
333
|
+
<button type="submit" class="wrb-submit-btn">
|
|
334
|
+
${l(e.submitLabel??"Absenden")}
|
|
335
|
+
</button>
|
|
336
|
+
</div>
|
|
337
|
+
</form>
|
|
338
|
+
${g(e)}
|
|
339
|
+
</div>
|
|
340
|
+
</div>
|
|
341
|
+
</div>
|
|
342
|
+
|
|
343
|
+
<!-- Widerruf: Success-Modal -->
|
|
344
|
+
<div id="wrb-success" class="wrb-overlay" role="dialog" aria-modal="true">
|
|
345
|
+
<div class="wrb-modal">
|
|
346
|
+
<div class="wrb-modal-header">
|
|
347
|
+
<h2 class="wrb-modal-title">Widerruf eingegangen</h2>
|
|
348
|
+
<a href="#" class="wrb-close-btn" aria-label="Schließen">✕</a>
|
|
349
|
+
</div>
|
|
350
|
+
<div class="wrb-modal-body">
|
|
351
|
+
<div class="wrb-success">
|
|
352
|
+
<span class="wrb-success-icon">✓</span>
|
|
353
|
+
<h3>Widerruf eingegangen</h3>
|
|
354
|
+
<p>
|
|
355
|
+
Ihr Widerruf wurde erfolgreich übermittelt. Sie erhalten in Kürze eine
|
|
356
|
+
Bestätigung per E-Mail.
|
|
357
|
+
</p>
|
|
358
|
+
</div>
|
|
359
|
+
${g(e)}
|
|
360
|
+
</div>
|
|
361
|
+
</div>
|
|
362
|
+
</div>
|
|
363
|
+
|
|
364
|
+
<!-- Widerruf: Error-Modal -->
|
|
365
|
+
<div id="wrb-error" class="wrb-overlay" role="alertdialog" aria-modal="true">
|
|
366
|
+
<div class="wrb-modal">
|
|
367
|
+
<div class="wrb-modal-header">
|
|
368
|
+
<h2 class="wrb-modal-title">Fehler beim Senden</h2>
|
|
369
|
+
<a href="#" class="wrb-close-btn" aria-label="Schließen">✕</a>
|
|
370
|
+
</div>
|
|
371
|
+
<div class="wrb-modal-body">
|
|
372
|
+
<div class="wrb-alert wrb-alert-error" role="alert">
|
|
373
|
+
Ihr Widerruf konnte leider nicht übermittelt werden. Bitte versuchen Sie es
|
|
374
|
+
erneut oder kontaktieren Sie uns direkt.
|
|
375
|
+
</div>
|
|
376
|
+
<div class="wrb-actions">
|
|
377
|
+
<a href="#" class="wrb-cancel-btn">Schließen</a>
|
|
378
|
+
<a href="#wrb-modal" class="wrb-submit-btn">Erneut versuchen</a>
|
|
379
|
+
</div>
|
|
380
|
+
${g(e)}
|
|
381
|
+
</div>
|
|
382
|
+
</div>
|
|
383
|
+
</div>`}exports.WiderrufsModal=B;exports.WiderrufsWidget=I;exports.generateFallbackHtml=U;exports.generateModalHtml=H;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { WiderrufsWidget } from './components/WiderrufsWidget';
|
|
2
2
|
export { WiderrufsModal } from './components/WiderrufsModal';
|
|
3
|
-
export { generateFallbackHtml } from './fallback';
|
|
3
|
+
export { generateFallbackHtml, generateModalHtml } from './fallback';
|
|
4
4
|
export type { WiderrufsConfig, WiderrufsFormData, SubmitStatus, LegalLink } from './types';
|