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