react-sdk-feexpay 1.0.0 → 1.0.2

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 ADDED
@@ -0,0 +1,624 @@
1
+ # react-sdk-feexpay v2 — Documentation officielle
2
+
3
+ > SDK React pour l'intégration des paiements FeexPay dans vos applications web.
4
+
5
+ ---
6
+
7
+ ## Table des matières
8
+
9
+ 1. [Introduction](#1-introduction)
10
+ 2. [Prérequis](#2-prérequis)
11
+ 3. [Installation](#3-installation)
12
+ 4. [Démarrage rapide](#4-démarrage-rapide)
13
+ 5. [Référence API](#5-référence-api)
14
+ - [Composant `<FeexPay />`](#composant-feexpay-)
15
+ - [Props détaillées](#props-détaillées)
16
+ - [Objet de retour du callback](#objet-de-retour-du-callback)
17
+ - [Types exportés](#types-exportés)
18
+ 6. [Méthodes de paiement](#6-méthodes-de-paiement)
19
+ 7. [Pays et opérateurs supportés](#7-pays-et-opérateurs-supportés)
20
+ 8. [Exemples d'utilisation](#8-exemples-dutilisation)
21
+ 9. [Gestion des erreurs](#9-gestion-des-erreurs)
22
+ 10. [Personnalisation du bouton](#10-personnalisation-du-bouton)
23
+ 11. [Changelog](#11-changelog)
24
+
25
+ ---
26
+
27
+ ## 1. Introduction
28
+
29
+ **react-sdk-feexpay** est une bibliothèque React qui permet d'intégrer la passerelle de paiement **FeexPay** en quelques lignes de code. Elle expose un composant clé-en-main qui affiche un bouton « Payer » et gère l'intégralité du tunnel de paiement : ouverture d'une modale, saisie des informations du payeur, sélection de l'opérateur, initiation de la transaction et retour de statut.
30
+
31
+ **Cas d'usage typiques :**
32
+
33
+ - Boutiques e-commerce sur les marchés d'Afrique de l'Ouest
34
+ - Collecte de paiements Mobile Money (MTN, Moov, Orange, Wave, etc.)
35
+ - Paiements par portefeuille numérique (Coris Money, Wave CI)
36
+ - Applications SaaS ou plateformes de services avec abonnements
37
+
38
+ **Ce que le SDK gère pour vous :**
39
+
40
+ - Sélection du pays et de l'opérateur
41
+ - Formatage automatique du numéro de téléphone
42
+ - Calcul des frais de transaction
43
+ - Polling du statut de paiement (toutes les 10 s, jusqu'à 2 min)
44
+ - Redirection après paiement (URL ou callback JavaScript)
45
+ - Gestion OTP (Orange Sénégal, Coris Money Bénin)
46
+ - Affichage iframe pour les opérateurs avec redirect (Wave, Orange CI/BF…)
47
+
48
+ ---
49
+
50
+ ## 2. Prérequis
51
+
52
+ | Dépendance | Version minimale |
53
+ |---|---|
54
+ | React | **19.0.0** |
55
+ | react-dom | **19.0.0** |
56
+ | Node.js | 18+ recommandé |
57
+
58
+ Le SDK inclut ses propres dépendances (`axios`, `styled-components`) ; vous n'avez pas à les installer séparément.
59
+
60
+ ---
61
+
62
+ ## 3. Installation
63
+
64
+ ```bash
65
+ npm install react-sdk-feexpay
66
+ ```
67
+
68
+ ```bash
69
+ yarn add react-sdk-feexpay
70
+ ```
71
+
72
+ ```bash
73
+ pnpm add react-sdk-feexpay
74
+ ```
75
+
76
+ > **Note :** `react` et `react-dom` sont des **peerDependencies**. Ils doivent déjà être présents dans votre projet.
77
+
78
+ ---
79
+
80
+ ## 4. Démarrage rapide
81
+
82
+ ```tsx
83
+ import FeexPay from 'react-sdk-feexpay';
84
+
85
+ export default function CheckoutPage() {
86
+ return (
87
+ <FeexPay
88
+ amount={5000}
89
+ token="votre_token_api"
90
+ id="identifiant_boutique"
91
+ description="Commande #1234"
92
+ callback={(result) => {
93
+ if (result.status === 'SUCCESSFUL') {
94
+ console.log('Paiement réussi !', result.reference);
95
+ }
96
+ }}
97
+ />
98
+ );
99
+ }
100
+ ```
101
+
102
+ Ce snippet suffit pour afficher un bouton opérationnel. En cliquant dessus, la modale de paiement s'ouvre et guide l'utilisateur jusqu'à la confirmation.
103
+
104
+ ---
105
+
106
+ ## 5. Référence API
107
+
108
+ ### Composant `<FeexPay />`
109
+
110
+ C'est le composant principal (export par défaut). Il combine un bouton et la logique de paiement complète.
111
+
112
+ ```tsx
113
+ import FeexPay from 'react-sdk-feexpay';
114
+ // ou via l'alias nommé :
115
+ import { FeexPayButton } from 'react-sdk-feexpay';
116
+ ```
117
+
118
+ `FeexPayButton` est un alias de `FeexPay` fourni pour la rétrocompatibilité avec la v1.
119
+
120
+ ---
121
+
122
+ ### Props détaillées
123
+
124
+ #### Props obligatoires
125
+
126
+ | Prop | Type | Description |
127
+ |---|---|---|
128
+ | `amount` | `number` | Montant à encaisser, **en unité entière** (ex. `5000` pour 5 000 XOF). |
129
+ | `token` | `string` | Token d'authentification API de votre boutique FeexPay. |
130
+ | `id` | `string` | Identifiant unique de votre boutique FeexPay. |
131
+
132
+ #### Props optionnelles — Comportement
133
+
134
+ | Prop | Type | Défaut | Description |
135
+ |---|---|---|---|
136
+ | `description` | `string` | `''` | Description de la transaction, visible dans le tableau de bord FeexPay. |
137
+ | `mode` | `'LIVE' \| 'SANDBOX'` | `'LIVE'` | Mode de fonctionnement. Utilisez `'SANDBOX'` pour les tests. |
138
+ | `currency` | `'XOF' \| 'USD' \| 'CAD' \| 'XAF'` | `'XOF'` | Devise de la transaction. |
139
+ | `case` | `'MOBILE' \| 'CARD' \| 'WALLET'` | — | Force l'affichage d'une méthode de paiement unique, sans onglets. |
140
+
141
+ #### Props optionnelles — Callbacks et redirections
142
+
143
+ | Prop | Type | Description |
144
+ |---|---|---|
145
+ | `callback` | `(response: CallbackResponse) => void` | Fonction appelée côté client à la fin de la transaction (succès ou échec). Voir [Objet de retour du callback](#objet-de-retour-du-callback). |
146
+ | `callback_url` | `string` | URL de redirection après un **paiement réussi**. La référence est passée en query param : `?ref=<reference>`. |
147
+ | `error_callback_url` | `string` | URL de redirection après un **paiement échoué**. La référence est passée en query param : `?ref=<reference>`. |
148
+ | `callback_info` | `Record<string, unknown>` | Données métier arbitraires renvoyées intactes dans la réponse du callback (ex. `{ orderId: '42', userId: 'abc' }`). |
149
+
150
+ #### Props optionnelles — Référence et personnalisation
151
+
152
+ | Prop | Type | Alias v1 | Description |
153
+ |---|---|---|---|
154
+ | `reference` | `string` | `customId` | Référence personnalisée de la transaction dans vos systèmes (idempotence). |
155
+ | `fieldsToHide` | `string[]` | `fields_to_hide` | Liste de champs à masquer dans la modale. Valeurs possibles : `'name'`, `'email'`. |
156
+ | `defaultValueField` | `Record<string, any>` | — | Pré-remplit des champs de la modale. Clés supportées : `country_iban` (`'BJ'`, `'CI'`, `'SN'`, `'TG'`, `'BF'`), `name`, `email`. |
157
+ | `first_name` | `string` | — | Pré-remplit le champ "Nom et Prénoms" de la modale. |
158
+ | `email` | `string` | — | Pré-remplit le champ "Email" de la modale. |
159
+
160
+ #### Props optionnelles — Style du bouton
161
+
162
+ | Prop | Type | Description |
163
+ |---|---|---|
164
+ | `buttonText` | `string` | Texte personnalisé du bouton (défaut : `"Payer X XOF"`). |
165
+ | `buttonClass` | `string` | Classes CSS Tailwind ou personnalisées appliquées au bouton. |
166
+ | `buttonStyles` | `React.CSSProperties` | Styles inline appliqués au bouton. |
167
+
168
+ ---
169
+
170
+ ### Objet de retour du callback
171
+
172
+ Lorsque la transaction se termine, la prop `callback` reçoit un objet avec les champs suivants :
173
+
174
+ ```ts
175
+ {
176
+ reference: string; // Référence unique FeexPay de la transaction
177
+ status: PaymentStatus; // Statut final (voir ci-dessous)
178
+ phoneNumber: string; // Numéro de téléphone formaté du payeur
179
+ reseau: string; // Opérateur utilisé (ex. 'MTN', 'WAVE SN')
180
+ callback_info: Record<string, unknown>; // Données métier passées via callback_info
181
+ description: string; // Description de la transaction
182
+ transaction_id: string; // Identifiant de transaction (= reference)
183
+ message: string; // Message de statut lisible
184
+ amount: number; // Montant de base (sans frais)
185
+ currency: string; // Devise (ex. 'XOF')
186
+ first_name: string; // Nom du payeur
187
+ email: string; // Email du payeur
188
+ }
189
+ ```
190
+
191
+ **Valeurs possibles de `status` :**
192
+
193
+ | Valeur | Signification |
194
+ |---|---|
195
+ | `'SUCCESSFUL'` / `'SUCCESS'` | Paiement accepté et confirmé |
196
+ | `'FAILED'` | Paiement refusé ou annulé |
197
+ | `'PENDING'` | En attente de confirmation opérateur |
198
+ | `'TIMEOUT'` | Expiration de la vérification (120 s sans réponse) |
199
+ | `'INSUFFICIENT_FUNDS'` | Solde insuffisant chez le payeur |
200
+
201
+ ---
202
+
203
+ ### Types exportés
204
+
205
+ Tous les types TypeScript du SDK sont disponibles à l'import :
206
+
207
+ ```ts
208
+ import type {
209
+ FeexPayProps,
210
+ PaymentConfig,
211
+ PaymentStatus,
212
+ PaymentMethod,
213
+ Network,
214
+ Country,
215
+ Currency,
216
+ Transaction,
217
+ } from 'react-sdk-feexpay';
218
+ ```
219
+
220
+ #### `Network`
221
+
222
+ ```ts
223
+ type Network = 'MTN' | 'MOOV' | 'CELTIIS' | 'CORIS' | 'ORANGE' | 'WAVE' | 'FREE' | 'TOGOCOM';
224
+ ```
225
+
226
+ #### `Country`
227
+
228
+ ```ts
229
+ type Country = 'BENIN' | 'COTE_D_IVOIRE' | 'BURKINA_FASO' | 'CONGO_BRAZZAVILLE' | 'SENEGAL' | 'TOGO';
230
+ ```
231
+
232
+ #### `Currency`
233
+
234
+ ```ts
235
+ type Currency = 'XOF' | 'USD' | 'CAD' | 'XAF';
236
+ ```
237
+
238
+ #### `PaymentMethod`
239
+
240
+ ```ts
241
+ type PaymentMethod = 'MOBILE' | 'CARD' | 'WALLET';
242
+ ```
243
+
244
+ ---
245
+
246
+ ## 6. Méthodes de paiement
247
+
248
+ | Méthode | Valeur `case` | Description |
249
+ |---|---|---|
250
+ | **Mobile Money** | `'MOBILE'` | Paiement via l'opérateur mobile du payeur. Un message push ou USSD est envoyé sur son téléphone pour confirmation. |
251
+ | **Wallet** | `'WALLET'` | Paiement via portefeuille numérique. Coris Money (Bénin) ou Wave (Côte d'Ivoire). Nécessite un code OTP pour Coris. |
252
+ | **Carte bancaire** | `'CARD'` | Visa / Mastercard. **Momentanément indisponible.** |
253
+
254
+ Lorsque `case` n'est pas fourni, les trois onglets apparaissent dans la modale et le payeur choisit sa méthode.
255
+
256
+ ---
257
+
258
+ ## 7. Pays et opérateurs supportés
259
+
260
+ ### Mobile Money
261
+
262
+ | Pays | Opérateurs disponibles | Code pays |
263
+ |---|---|---|
264
+ | Bénin | MTN, Moov, Celtiis | `BENIN` |
265
+ | Côte d'Ivoire | MTN CI, Orange CI | `COTE_D_IVOIRE` |
266
+ | Burkina Faso | Moov BF, Orange BF | `BURKINA_FASO` |
267
+ | Congo-Brazzaville | MTN CG | `CONGO_BRAZZAVILLE` |
268
+ | Sénégal | Orange SN, Free SN, Wave SN | `SENEGAL` |
269
+ | Togo | Togocom TG, Moov TG | `TOGO` |
270
+
271
+ ### Wallet
272
+
273
+ | Pays | Réseau Wallet |
274
+ |---|---|
275
+ | Bénin | Coris Money (`CORIS`) |
276
+ | Côte d'Ivoire | Wave (`WAVE`) |
277
+
278
+ > **Note :** Pour Orange Sénégal, le payeur doit obtenir un code OTP en composant `*144*391#` depuis son téléphone avant de valider le paiement.
279
+
280
+ ---
281
+
282
+ ## 8. Exemples d'utilisation
283
+
284
+ ### Exemple minimal
285
+
286
+ ```tsx
287
+ import FeexPay from 'react-sdk-feexpay';
288
+
289
+ function App() {
290
+ return (
291
+ <FeexPay
292
+ amount={2500}
293
+ token="tok_live_xxxxxxxxxxxxxx"
294
+ id="shop_xxxxxxxx"
295
+ />
296
+ );
297
+ }
298
+ ```
299
+
300
+ ---
301
+
302
+ ### Avec callback JavaScript
303
+
304
+ ```tsx
305
+ import FeexPay from 'react-sdk-feexpay';
306
+
307
+ function CheckoutPage() {
308
+ const handlePaymentResult = (result) => {
309
+ switch (result.status) {
310
+ case 'SUCCESSFUL':
311
+ // Confirmer la commande côté serveur
312
+ fetch('/api/orders/confirm', {
313
+ method: 'POST',
314
+ body: JSON.stringify({
315
+ reference: result.reference,
316
+ orderId: result.callback_info.orderId,
317
+ }),
318
+ });
319
+ break;
320
+ case 'FAILED':
321
+ case 'INSUFFICIENT_FUNDS':
322
+ alert('Le paiement a échoué : ' + result.message);
323
+ break;
324
+ case 'TIMEOUT':
325
+ alert('La confirmation a expiré. Vérifiez votre compte opérateur.');
326
+ break;
327
+ }
328
+ };
329
+
330
+ return (
331
+ <FeexPay
332
+ amount={15000}
333
+ token="tok_live_xxxxxxxxxxxxxx"
334
+ id="shop_xxxxxxxx"
335
+ description="Abonnement mensuel"
336
+ callback={handlePaymentResult}
337
+ callback_info={{ orderId: '1042', userId: 'usr_abc' }}
338
+ />
339
+ );
340
+ }
341
+ ```
342
+
343
+ ---
344
+
345
+ ### Avec redirection URL
346
+
347
+ ```tsx
348
+ <FeexPay
349
+ amount={8000}
350
+ token="tok_live_xxxxxxxxxxxxxx"
351
+ id="shop_xxxxxxxx"
352
+ description="Commande #567"
353
+ callback_url="https://monsite.com/paiement/succes"
354
+ error_callback_url="https://monsite.com/paiement/echec"
355
+ reference="CMD-2026-567"
356
+ />
357
+ ```
358
+
359
+ Après le paiement, l'utilisateur est redirigé vers :
360
+ - `https://monsite.com/paiement/succes?ref=<reference>` en cas de succès
361
+ - `https://monsite.com/paiement/echec?ref=<reference>` en cas d'échec
362
+
363
+ ---
364
+
365
+ ### Forcer une méthode de paiement
366
+
367
+ ```tsx
368
+ {/* Mobile Money uniquement */}
369
+ <FeexPay
370
+ amount={5000}
371
+ token="tok_live_xxxxxxxxxxxxxx"
372
+ id="shop_xxxxxxxx"
373
+ case="MOBILE"
374
+ />
375
+
376
+ {/* Wallet uniquement */}
377
+ <FeexPay
378
+ amount={5000}
379
+ token="tok_live_xxxxxxxxxxxxxx"
380
+ id="shop_xxxxxxxx"
381
+ case="WALLET"
382
+ />
383
+ ```
384
+
385
+ ---
386
+
387
+ ### Pré-remplir les informations du payeur
388
+
389
+ ```tsx
390
+ <FeexPay
391
+ amount={3000}
392
+ token="tok_live_xxxxxxxxxxxxxx"
393
+ id="shop_xxxxxxxx"
394
+ first_name="Jean Dupont"
395
+ email="jean.dupont@exemple.com"
396
+ defaultValueField={{ country_iban: 'CI' }}
397
+ />
398
+ ```
399
+
400
+ Cela pré-remplit le nom, l'email et sélectionne automatiquement la Côte d'Ivoire dans le sélecteur de pays.
401
+
402
+ ---
403
+
404
+ ### Masquer des champs
405
+
406
+ ```tsx
407
+ {/* Masquer l'email et le nom (utile si déjà authentifié) */}
408
+ <FeexPay
409
+ amount={10000}
410
+ token="tok_live_xxxxxxxxxxxxxx"
411
+ id="shop_xxxxxxxx"
412
+ first_name="Marie Koné"
413
+ email="marie@exemple.com"
414
+ fieldsToHide={['name', 'email']}
415
+ />
416
+ ```
417
+
418
+ ---
419
+
420
+ ### Mode sandbox (tests)
421
+
422
+ ```tsx
423
+ <FeexPay
424
+ amount={100}
425
+ token="tok_sandbox_xxxxxxxxxxxxxx"
426
+ id="shop_test_xxxxxxxx"
427
+ mode="SANDBOX"
428
+ description="Test de paiement"
429
+ callback={(r) => console.log('Sandbox result:', r)}
430
+ />
431
+ ```
432
+
433
+ ---
434
+
435
+ ### Bouton personnalisé déclenché par événement DOM
436
+
437
+ Le SDK écoute l'événement personnalisé `feexpay:trigger` sur son élément racine. Cela permet d'utiliser n'importe quel élément comme déclencheur :
438
+
439
+ ```tsx
440
+ import { useRef } from 'react';
441
+ import FeexPay from 'react-sdk-feexpay';
442
+
443
+ function CustomTrigger() {
444
+ const containerRef = useRef(null);
445
+
446
+ const openPayment = () => {
447
+ containerRef.current
448
+ ?.querySelector('[data-feexpay]')
449
+ ?.dispatchEvent(new CustomEvent('feexpay:trigger', { bubbles: true }));
450
+ };
451
+
452
+ return (
453
+ <>
454
+ {/* Le composant est invisible (custom_button interne) */}
455
+ <div ref={containerRef}>
456
+ <FeexPay
457
+ amount={5000}
458
+ token="tok_live_xxxxxxxxxxxxxx"
459
+ id="shop_xxxxxxxx"
460
+ />
461
+ </div>
462
+
463
+ {/* Votre propre bouton */}
464
+ <button onClick={openPayment} className="mon-bouton-custom">
465
+ Finaliser l'achat
466
+ </button>
467
+ </>
468
+ );
469
+ }
470
+ ```
471
+
472
+ ---
473
+
474
+ ### Utilisation du contexte `FeexPayProvider`
475
+
476
+ Le composant `<FeexPay />` inclut son propre `FeexPayProvider`. Si vous souhaitez gérer plusieurs instances ou partager le contexte dans une arborescence React, vous pouvez wrapper votre application manuellement :
477
+
478
+ ```tsx
479
+ import { FeexPayProvider } from 'react-sdk-feexpay';
480
+
481
+ function App() {
482
+ return (
483
+ <FeexPayProvider>
484
+ {/* Votre application */}
485
+ </FeexPayProvider>
486
+ );
487
+ }
488
+ ```
489
+
490
+ ---
491
+
492
+ ## 9. Gestion des erreurs
493
+
494
+ ### Erreurs de configuration
495
+
496
+ Si les identifiants `id` ou `token` sont invalides, le SDK affiche un message d'erreur à la place du bouton :
497
+
498
+ ```
499
+ Veuillez vérifier vos identifiants de boutique (ID et token).
500
+ ```
501
+
502
+ Aucune modale ne s'ouvre dans ce cas.
503
+
504
+ ---
505
+
506
+ ### Erreurs de validation du formulaire
507
+
508
+ La modale valide les champs avant d'initier le paiement. Les messages d'erreur s'affichent dans une modale de statut :
509
+
510
+ | Champ manquant / invalide | Message affiché |
511
+ |---|---|
512
+ | Nom complet vide | `Veuillez entrer votre nom complet` |
513
+ | Email absent ou invalide | `Veuillez entrer une adresse email valide` |
514
+ | Numéro de téléphone trop court | `Veuillez entrer un numéro de téléphone valide` |
515
+ | Wallet sur un pays non supporté | `Seuls le Bénin (Coris) et la Côte d'Ivoire (Wave) sont supportés` |
516
+
517
+ ---
518
+
519
+ ### Codes de statut API
520
+
521
+ | Code | Signification | Comportement |
522
+ |---|---|---|
523
+ | `10` | Fonds insuffisants | Statut `INSUFFICIENT_FUNDS`, redirection `error_callback_url` si définie |
524
+ | `92` | Transaction annulée | Statut `FAILED`, redirection `error_callback_url` si définie |
525
+ | `201` (Coris) | OTP requis | Ouverture de la modale OTP |
526
+
527
+ ---
528
+
529
+ ### Gestion du timeout
530
+
531
+ Le SDK effectue une vérification de statut toutes les **10 secondes**, pendant **2 minutes maximum** (12 tentatives). Si aucune confirmation n'arrive dans ce délai :
532
+
533
+ - Le statut `TIMEOUT` est retourné dans le `callback`
534
+ - La redirection `error_callback_url` est déclenchée si définie
535
+ - Message : `"La vérification du paiement a expiré. Veuillez vérifier votre compte."`
536
+
537
+ > **Conseil :** Configurez un webhook côté serveur sur le tableau de bord FeexPay pour recevoir les confirmations de paiement indépendamment du timeout côté client.
538
+
539
+ ---
540
+
541
+ ### Erreurs réseau
542
+
543
+ En cas d'exception lors de l'appel API (réseau coupé, serveur indisponible), le SDK affiche :
544
+
545
+ ```
546
+ Une erreur est survenue lors du traitement du paiement. Veuillez réessayer.
547
+ ```
548
+
549
+ Le `callback` est appelé avec `status: 'FAILED'`.
550
+
551
+ ---
552
+
553
+ ### Opérateurs avec redirect iframe
554
+
555
+ Pour certains opérateurs (Wave CI, Orange CI, Moov BF, Orange BF, Wave SN), le paiement passe par une page externe affichée dans une **iframe intégrée**. L'utilisateur finalise le paiement dans cette iframe, puis le SDK vérifie le statut en arrière-plan. Un bouton de fermeture permet de revenir au formulaire.
556
+
557
+ ---
558
+
559
+ ## 10. Personnalisation du bouton
560
+
561
+ ### Via `buttonText` et `buttonClass`
562
+
563
+ ```tsx
564
+ <FeexPay
565
+ amount={5000}
566
+ token="tok_live_xxxxxxxxxxxxxx"
567
+ id="shop_xxxxxxxx"
568
+ buttonText="Acheter maintenant"
569
+ buttonClass="bg-green-600 hover:bg-green-700 text-white font-semibold py-3 px-6 rounded-full"
570
+ />
571
+ ```
572
+
573
+ ### Via `buttonStyles` (styles inline)
574
+
575
+ ```tsx
576
+ <FeexPay
577
+ amount={5000}
578
+ token="tok_live_xxxxxxxxxxxxxx"
579
+ id="shop_xxxxxxxx"
580
+ buttonStyles={{
581
+ backgroundColor: '#1a56db',
582
+ color: '#ffffff',
583
+ padding: '12px 24px',
584
+ borderRadius: '8px',
585
+ fontWeight: 'bold',
586
+ border: 'none',
587
+ cursor: 'pointer',
588
+ }}
589
+ />
590
+ ```
591
+
592
+ Le texte par défaut du bouton est `"Payer X {currency}"` où `X` est le montant formaté en locale française.
593
+
594
+ ---
595
+
596
+ ## 11. Changelog
597
+
598
+ ### 1.0.0 — Publication initiale
599
+
600
+ - Renommage du paquet en `react-sdk-feexpay`
601
+ - Migration vers **React 19** et **styled-components v6**
602
+ - Composant principal `FeexPay` avec alias rétrocompatible `FeexPayButton`
603
+ - Support Mobile Money : Bénin, Côte d'Ivoire, Burkina Faso, Congo-Brazzaville, Sénégal, Togo
604
+ - Support Wallet : Coris Money (Bénin), Wave (Côte d'Ivoire)
605
+ - Gestion OTP pour Orange Sénégal et Coris Money
606
+ - Affichage iframe pour les opérateurs avec redirect
607
+ - Polling de statut automatique (10 s × 12 = 2 min)
608
+ - Pré-remplissage des champs (`first_name`, `email`, `defaultValueField`)
609
+ - Masquage de champs (`fieldsToHide`)
610
+ - Event DOM `feexpay:trigger` pour déclencheurs personnalisés
611
+ - Exports TypeScript complets (`PaymentConfig`, `Transaction`, `Network`, `Country`, etc.)
612
+
613
+ ---
614
+
615
+ ## Ressources
616
+
617
+ - **Site officiel FeexPay :** [feexpay.me](https://feexpay.me)
618
+ - **Conditions d'utilisation :** [feexpay.me/fr/terms-and-conditions](https://feexpay.me/fr/terms-and-conditions)
619
+ - **Tableau de bord marchands :** Disponible sur votre espace FeexPay
620
+ - **Support :** Contactez l'équipe FeexPay depuis votre tableau de bord
621
+
622
+ ---
623
+
624
+ *Documentation générée pour `react-sdk-feexpay` v2*
package/dist/index.js CHANGED
@@ -95,7 +95,7 @@ function styleInject(css, { insertAt } = {}) {
95
95
  }
96
96
 
97
97
  // src/index.css
98
- styleInject('*,\n::before,\n::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n*,\n::before,\n::after {\n box-sizing: border-box;\n border-width: 0;\n border-style: solid;\n border-color: #e5e7eb;\n}\n::before,\n::after {\n --tw-content: "";\n}\nhtml,\n:host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n -moz-tab-size: 4;\n -o-tab-size: 4;\n tab-size: 4;\n font-family:\n ui-sans-serif,\n system-ui,\n sans-serif,\n "Apple Color Emoji",\n "Segoe UI Emoji",\n "Segoe UI Symbol",\n "Noto Color Emoji";\n font-feature-settings: normal;\n font-variation-settings: normal;\n -webkit-tap-highlight-color: transparent;\n}\nbody {\n margin: 0;\n line-height: inherit;\n}\nhr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n}\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\na {\n color: inherit;\n text-decoration: inherit;\n}\nb,\nstrong {\n font-weight: bolder;\n}\ncode,\nkbd,\nsamp,\npre {\n font-family:\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n "Liberation Mono",\n "Courier New",\n monospace;\n font-feature-settings: normal;\n font-variation-settings: normal;\n font-size: 1em;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsub {\n bottom: -0.25em;\n}\nsup {\n top: -0.5em;\n}\ntable {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n font-size: 100%;\n font-weight: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n color: inherit;\n margin: 0;\n padding: 0;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\ninput:where([type=button]),\ninput:where([type=reset]),\ninput:where([type=submit]) {\n -webkit-appearance: button;\n background-color: transparent;\n background-image: none;\n}\n:-moz-focusring {\n outline: auto;\n}\n:-moz-ui-invalid {\n box-shadow: none;\n}\nprogress {\n vertical-align: baseline;\n}\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n[type=search] {\n -webkit-appearance: textfield;\n outline-offset: -2px;\n}\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n::-webkit-file-upload-button {\n -webkit-appearance: button;\n font: inherit;\n}\nsummary {\n display: list-item;\n}\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\nfieldset {\n margin: 0;\n padding: 0;\n}\nlegend {\n padding: 0;\n}\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\ndialog {\n padding: 0;\n}\ntextarea {\n resize: vertical;\n}\ninput::-moz-placeholder,\ntextarea::-moz-placeholder {\n opacity: 1;\n color: #9ca3af;\n}\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1;\n color: #9ca3af;\n}\nbutton,\n[role=button] {\n cursor: pointer;\n}\n:disabled {\n cursor: default;\n}\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block;\n vertical-align: middle;\n}\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n[hidden]:where(:not([hidden=until-found])) {\n display: none;\n}\n.\\!container {\n width: 100% !important;\n}\n.container {\n width: 100%;\n}\n@media (min-width: 640px) {\n .\\!container {\n max-width: 640px !important;\n }\n .container {\n max-width: 640px;\n }\n}\n@media (min-width: 768px) {\n .\\!container {\n max-width: 768px !important;\n }\n .container {\n max-width: 768px;\n }\n}\n@media (min-width: 1024px) {\n .\\!container {\n max-width: 1024px !important;\n }\n .container {\n max-width: 1024px;\n }\n}\n@media (min-width: 1280px) {\n .\\!container {\n max-width: 1280px !important;\n }\n .container {\n max-width: 1280px;\n }\n}\n@media (min-width: 1536px) {\n .\\!container {\n max-width: 1536px !important;\n }\n .container {\n max-width: 1536px;\n }\n}\n.pointer-events-none {\n pointer-events: none;\n}\n.visible {\n visibility: visible;\n}\n.fixed {\n position: fixed;\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.inset-0 {\n inset: 0px;\n}\n.inset-y-0 {\n top: 0px;\n bottom: 0px;\n}\n.right-0 {\n right: 0px;\n}\n.right-2 {\n right: 0.5rem;\n}\n.top-2 {\n top: 0.5rem;\n}\n.z-10 {\n z-index: 10;\n}\n.z-20 {\n z-index: 20;\n}\n.z-50 {\n z-index: 50;\n}\n.mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n.-ml-1 {\n margin-left: -0.25rem;\n}\n.mb-1 {\n margin-bottom: 0.25rem;\n}\n.mb-2 {\n margin-bottom: 0.5rem;\n}\n.mb-4 {\n margin-bottom: 1rem;\n}\n.mb-5 {\n margin-bottom: 1.25rem;\n}\n.mb-6 {\n margin-bottom: 1.5rem;\n}\n.mr-2 {\n margin-right: 0.5rem;\n}\n.mt-2 {\n margin-top: 0.5rem;\n}\n.mt-6 {\n margin-top: 1.5rem;\n}\n.block {\n display: block;\n}\n.flex {\n display: flex;\n}\n.inline-flex {\n display: inline-flex;\n}\n.grid {\n display: grid;\n}\n.\\!hidden {\n display: none !important;\n}\n.hidden {\n display: none;\n}\n.h-1\\.5 {\n height: 0.375rem;\n}\n.h-11 {\n height: 2.75rem;\n}\n.h-20 {\n height: 5rem;\n}\n.h-4 {\n height: 1rem;\n}\n.h-5 {\n height: 1.25rem;\n}\n.h-6 {\n height: 1.5rem;\n}\n.h-8 {\n height: 2rem;\n}\n.h-full {\n height: 100%;\n}\n.max-h-\\[90vh\\] {\n max-height: 90vh;\n}\n.w-1\\/3 {\n width: 33.333333%;\n}\n.w-11 {\n width: 2.75rem;\n}\n.w-2\\/3 {\n width: 66.666667%;\n}\n.w-20 {\n width: 5rem;\n}\n.w-4 {\n width: 1rem;\n}\n.w-5 {\n width: 1.25rem;\n}\n.w-6 {\n width: 1.5rem;\n}\n.w-8 {\n width: 2rem;\n}\n.w-full {\n width: 100%;\n}\n.max-w-\\[120px\\] {\n max-width: 120px;\n}\n.max-w-md {\n max-width: 28rem;\n}\n.max-w-sm {\n max-width: 24rem;\n}\n.flex-1 {\n flex: 1 1 0%;\n}\n.flex-shrink-0 {\n flex-shrink: 0;\n}\n.flex-grow {\n flex-grow: 1;\n}\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n.animate-spin {\n animation: spin 1s linear infinite;\n}\n.cursor-not-allowed {\n cursor: not-allowed;\n}\n.cursor-pointer {\n cursor: pointer;\n}\n.appearance-none {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.flex-col {\n flex-direction: column;\n}\n.items-center {\n align-items: center;\n}\n.justify-center {\n justify-content: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.gap-2 {\n gap: 0.5rem;\n}\n.gap-4 {\n gap: 1rem;\n}\n.space-x-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-y-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1rem * var(--tw-space-y-reverse));\n}\n.space-y-6 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.overflow-y-auto {\n overflow-y: auto;\n}\n.rounded {\n border-radius: 0.25rem;\n}\n.rounded-2xl {\n border-radius: 1rem;\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-lg {\n border-radius: 0.5rem;\n}\n.rounded-md {\n border-radius: 0.375rem;\n}\n.rounded-xl {\n border-radius: 0.75rem;\n}\n.rounded-l-md {\n border-top-left-radius: 0.375rem;\n border-bottom-left-radius: 0.375rem;\n}\n.rounded-r-md {\n border-top-right-radius: 0.375rem;\n border-bottom-right-radius: 0.375rem;\n}\n.border {\n border-width: 1px;\n}\n.border-0 {\n border-width: 0px;\n}\n.border-b {\n border-bottom-width: 1px;\n}\n.border-r-0 {\n border-right-width: 0px;\n}\n.border-\\[\\#D45D00\\] {\n --tw-border-opacity: 1;\n border-color: rgb(212 93 0 / var(--tw-border-opacity, 1));\n}\n.border-gray-200 {\n --tw-border-opacity: 1;\n border-color: rgb(229 231 235 / var(--tw-border-opacity, 1));\n}\n.border-gray-300 {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\n}\n.bg-\\[\\#fff7ed\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(255 247 237 / var(--tw-bg-opacity, 1));\n}\n.bg-black {\n --tw-bg-opacity: 1;\n background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1));\n}\n.bg-blue-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-200 {\n --tw-bg-opacity: 1;\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-800 {\n --tw-bg-opacity: 1;\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\n}\n.bg-green-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(220 252 231 / var(--tw-bg-opacity, 1));\n}\n.bg-green-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(74 222 128 / var(--tw-bg-opacity, 1));\n}\n.bg-green-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(34 197 94 / var(--tw-bg-opacity, 1));\n}\n.bg-orange-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(255 237 213 / var(--tw-bg-opacity, 1));\n}\n.bg-orange-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(251 146 60 / var(--tw-bg-opacity, 1));\n}\n.bg-primary-orange {\n --tw-bg-opacity: 1;\n background-color: rgb(212 93 0 / var(--tw-bg-opacity, 1));\n}\n.bg-red-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(254 226 226 / var(--tw-bg-opacity, 1));\n}\n.bg-red-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(248 113 113 / var(--tw-bg-opacity, 1));\n}\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n}\n.bg-opacity-50 {\n --tw-bg-opacity: 0.5;\n}\n.p-1 {\n padding: 0.25rem;\n}\n.p-2 {\n padding: 0.5rem;\n}\n.p-4 {\n padding: 1rem;\n}\n.p-6 {\n padding: 1.5rem;\n}\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.pb-4 {\n padding-bottom: 1rem;\n}\n.pr-8 {\n padding-right: 2rem;\n}\n.pt-2 {\n padding-top: 0.5rem;\n}\n.text-center {\n text-align: center;\n}\n.text-right {\n text-align: right;\n}\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.text-xl {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.font-bold {\n font-weight: 700;\n}\n.font-medium {\n font-weight: 500;\n}\n.font-semibold {\n font-weight: 600;\n}\n.text-blue-900 {\n --tw-text-opacity: 1;\n color: rgb(30 58 138 / var(--tw-text-opacity, 1));\n}\n.text-gray-400 {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\n}\n.text-gray-500 {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\n}\n.text-gray-600 {\n --tw-text-opacity: 1;\n color: rgb(75 85 99 / var(--tw-text-opacity, 1));\n}\n.text-gray-700 {\n --tw-text-opacity: 1;\n color: rgb(55 65 81 / var(--tw-text-opacity, 1));\n}\n.text-gray-800 {\n --tw-text-opacity: 1;\n color: rgb(31 41 55 / var(--tw-text-opacity, 1));\n}\n.text-gray-900 {\n --tw-text-opacity: 1;\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\n}\n.text-green-500 {\n --tw-text-opacity: 1;\n color: rgb(34 197 94 / var(--tw-text-opacity, 1));\n}\n.text-orange-500 {\n --tw-text-opacity: 1;\n color: rgb(249 115 22 / var(--tw-text-opacity, 1));\n}\n.text-primary-blue {\n --tw-text-opacity: 1;\n color: rgb(17 44 86 / var(--tw-text-opacity, 1));\n}\n.text-primary-orange {\n --tw-text-opacity: 1;\n color: rgb(212 93 0 / var(--tw-text-opacity, 1));\n}\n.text-red-500 {\n --tw-text-opacity: 1;\n color: rgb(239 68 68 / var(--tw-text-opacity, 1));\n}\n.text-red-600 {\n --tw-text-opacity: 1;\n color: rgb(220 38 38 / var(--tw-text-opacity, 1));\n}\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.underline {\n text-decoration-line: underline;\n}\n.opacity-25 {\n opacity: 0.25;\n}\n.opacity-70 {\n opacity: 0.7;\n}\n.opacity-75 {\n opacity: 0.75;\n}\n.shadow-2xl {\n --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.outline {\n outline-style: solid;\n}\n.transition {\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke,\n opacity,\n box-shadow,\n transform,\n filter,\n backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-200 {\n transition-duration: 200ms;\n}\n.duration-300 {\n transition-duration: 300ms;\n}\n.hover\\:border-\\[\\#D45D00\\]:hover {\n --tw-border-opacity: 1;\n border-color: rgb(212 93 0 / var(--tw-border-opacity, 1));\n}\n.hover\\:bg-gray-300:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-gray-600:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-green-600:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-orange-700:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(194 65 12 / var(--tw-bg-opacity, 1));\n}\n.hover\\:text-gray-700:hover {\n --tw-text-opacity: 1;\n color: rgb(55 65 81 / var(--tw-text-opacity, 1));\n}\n.focus\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.focus\\:ring-2:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus\\:ring-primary-orange:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(212 93 0 / var(--tw-ring-opacity, 1));\n}\n.focus\\:ring-offset-2:focus {\n --tw-ring-offset-width: 2px;\n}\n.disabled\\:opacity-50:disabled {\n opacity: 0.5;\n}\n');
98
+ styleInject('*,\n::before,\n::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n*,\n::before,\n::after {\n box-sizing: border-box;\n border-width: 0;\n border-style: solid;\n border-color: #e5e7eb;\n}\n::before,\n::after {\n --tw-content: "";\n}\nhtml,\n:host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n -moz-tab-size: 4;\n -o-tab-size: 4;\n tab-size: 4;\n font-family:\n ui-sans-serif,\n system-ui,\n sans-serif,\n "Apple Color Emoji",\n "Segoe UI Emoji",\n "Segoe UI Symbol",\n "Noto Color Emoji";\n font-feature-settings: normal;\n font-variation-settings: normal;\n -webkit-tap-highlight-color: transparent;\n}\nbody {\n margin: 0;\n line-height: inherit;\n}\nhr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n}\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\na {\n color: inherit;\n text-decoration: inherit;\n}\nb,\nstrong {\n font-weight: bolder;\n}\ncode,\nkbd,\nsamp,\npre {\n font-family:\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n "Liberation Mono",\n "Courier New",\n monospace;\n font-feature-settings: normal;\n font-variation-settings: normal;\n font-size: 1em;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsub {\n bottom: -0.25em;\n}\nsup {\n top: -0.5em;\n}\ntable {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n font-size: 100%;\n font-weight: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n color: inherit;\n margin: 0;\n padding: 0;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\ninput:where([type=button]),\ninput:where([type=reset]),\ninput:where([type=submit]) {\n -webkit-appearance: button;\n background-color: transparent;\n background-image: none;\n}\n:-moz-focusring {\n outline: auto;\n}\n:-moz-ui-invalid {\n box-shadow: none;\n}\nprogress {\n vertical-align: baseline;\n}\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n[type=search] {\n -webkit-appearance: textfield;\n outline-offset: -2px;\n}\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n::-webkit-file-upload-button {\n -webkit-appearance: button;\n font: inherit;\n}\nsummary {\n display: list-item;\n}\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\nfieldset {\n margin: 0;\n padding: 0;\n}\nlegend {\n padding: 0;\n}\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\ndialog {\n padding: 0;\n}\ntextarea {\n resize: vertical;\n}\ninput::-moz-placeholder,\ntextarea::-moz-placeholder {\n opacity: 1;\n color: #9ca3af;\n}\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1;\n color: #9ca3af;\n}\nbutton,\n[role=button] {\n cursor: pointer;\n}\n:disabled {\n cursor: default;\n}\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block;\n vertical-align: middle;\n}\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n[hidden]:where(:not([hidden=until-found])) {\n display: none;\n}\n.\\!container {\n width: 100% !important;\n}\n.container {\n width: 100%;\n}\n@media (min-width: 640px) {\n .\\!container {\n max-width: 640px !important;\n }\n .container {\n max-width: 640px;\n }\n}\n@media (min-width: 768px) {\n .\\!container {\n max-width: 768px !important;\n }\n .container {\n max-width: 768px;\n }\n}\n@media (min-width: 1024px) {\n .\\!container {\n max-width: 1024px !important;\n }\n .container {\n max-width: 1024px;\n }\n}\n@media (min-width: 1280px) {\n .\\!container {\n max-width: 1280px !important;\n }\n .container {\n max-width: 1280px;\n }\n}\n@media (min-width: 1536px) {\n .\\!container {\n max-width: 1536px !important;\n }\n .container {\n max-width: 1536px;\n }\n}\n.pointer-events-none {\n pointer-events: none;\n}\n.visible {\n visibility: visible;\n}\n.fixed {\n position: fixed;\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.inset-0 {\n inset: 0px;\n}\n.inset-y-0 {\n top: 0px;\n bottom: 0px;\n}\n.right-0 {\n right: 0px;\n}\n.right-2 {\n right: 0.5rem;\n}\n.top-2 {\n top: 0.5rem;\n}\n.z-10 {\n z-index: 10;\n}\n.z-20 {\n z-index: 20;\n}\n.z-50 {\n z-index: 50;\n}\n.mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n.-ml-1 {\n margin-left: -0.25rem;\n}\n.mb-1 {\n margin-bottom: 0.25rem;\n}\n.mb-2 {\n margin-bottom: 0.5rem;\n}\n.mb-4 {\n margin-bottom: 1rem;\n}\n.mb-5 {\n margin-bottom: 1.25rem;\n}\n.mb-6 {\n margin-bottom: 1.5rem;\n}\n.mr-2 {\n margin-right: 0.5rem;\n}\n.mt-2 {\n margin-top: 0.5rem;\n}\n.mt-6 {\n margin-top: 1.5rem;\n}\n.block {\n display: block;\n}\n.flex {\n display: flex;\n}\n.inline-flex {\n display: inline-flex;\n}\n.grid {\n display: grid;\n}\n.\\!hidden {\n display: none !important;\n}\n.hidden {\n display: none;\n}\n.h-1\\.5 {\n height: 0.375rem;\n}\n.h-11 {\n height: 2.75rem;\n}\n.h-20 {\n height: 5rem;\n}\n.h-4 {\n height: 1rem;\n}\n.h-5 {\n height: 1.25rem;\n}\n.h-6 {\n height: 1.5rem;\n}\n.h-8 {\n height: 2rem;\n}\n.h-full {\n height: 100%;\n}\n.max-h-\\[90vh\\] {\n max-height: 90vh;\n}\n.w-1\\/3 {\n width: 33.333333%;\n}\n.w-11 {\n width: 2.75rem;\n}\n.w-2\\/3 {\n width: 66.666667%;\n}\n.w-20 {\n width: 5rem;\n}\n.w-4 {\n width: 1rem;\n}\n.w-5 {\n width: 1.25rem;\n}\n.w-6 {\n width: 1.5rem;\n}\n.w-8 {\n width: 2rem;\n}\n.w-full {\n width: 100%;\n}\n.max-w-\\[120px\\] {\n max-width: 120px;\n}\n.max-w-md {\n max-width: 28rem;\n}\n.max-w-sm {\n max-width: 24rem;\n}\n.flex-1 {\n flex: 1 1 0%;\n}\n.flex-shrink-0 {\n flex-shrink: 0;\n}\n.flex-grow {\n flex-grow: 1;\n}\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n.animate-spin {\n animation: spin 1s linear infinite;\n}\n.cursor-not-allowed {\n cursor: not-allowed;\n}\n.cursor-pointer {\n cursor: pointer;\n}\n.appearance-none {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.flex-col {\n flex-direction: column;\n}\n.items-center {\n align-items: center;\n}\n.justify-center {\n justify-content: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.gap-2 {\n gap: 0.5rem;\n}\n.gap-4 {\n gap: 1rem;\n}\n.space-x-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-y-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1rem * var(--tw-space-y-reverse));\n}\n.space-y-6 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.overflow-y-auto {\n overflow-y: auto;\n}\n.rounded {\n border-radius: 0.25rem;\n}\n.rounded-2xl {\n border-radius: 1rem;\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-lg {\n border-radius: 0.5rem;\n}\n.rounded-md {\n border-radius: 0.375rem;\n}\n.rounded-xl {\n border-radius: 0.75rem;\n}\n.rounded-l-md {\n border-top-left-radius: 0.375rem;\n border-bottom-left-radius: 0.375rem;\n}\n.rounded-r-md {\n border-top-right-radius: 0.375rem;\n border-bottom-right-radius: 0.375rem;\n}\n.border {\n border-width: 1px;\n}\n.border-0 {\n border-width: 0px;\n}\n.border-b {\n border-bottom-width: 1px;\n}\n.border-r-0 {\n border-right-width: 0px;\n}\n.border-\\[\\#D45D00\\] {\n --tw-border-opacity: 1;\n border-color: rgb(212 93 0 / var(--tw-border-opacity, 1));\n}\n.border-gray-200 {\n --tw-border-opacity: 1;\n border-color: rgb(229 231 235 / var(--tw-border-opacity, 1));\n}\n.border-gray-300 {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\n}\n.bg-\\[\\#fff7ed\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(255 247 237 / var(--tw-bg-opacity, 1));\n}\n.bg-black {\n --tw-bg-opacity: 1;\n background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1));\n}\n.bg-blue-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-200 {\n --tw-bg-opacity: 1;\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-800 {\n --tw-bg-opacity: 1;\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\n}\n.bg-green-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(220 252 231 / var(--tw-bg-opacity, 1));\n}\n.bg-green-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(74 222 128 / var(--tw-bg-opacity, 1));\n}\n.bg-green-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(34 197 94 / var(--tw-bg-opacity, 1));\n}\n.bg-orange-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(255 237 213 / var(--tw-bg-opacity, 1));\n}\n.bg-orange-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(251 146 60 / var(--tw-bg-opacity, 1));\n}\n.bg-primary-orange {\n --tw-bg-opacity: 1;\n background-color: rgb(212 93 0 / var(--tw-bg-opacity, 1));\n}\n.bg-red-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(254 226 226 / var(--tw-bg-opacity, 1));\n}\n.bg-red-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(248 113 113 / var(--tw-bg-opacity, 1));\n}\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n}\n.bg-opacity-50 {\n --tw-bg-opacity: 0.5;\n}\n.p-1 {\n padding: 0.25rem;\n}\n.p-2 {\n padding: 0.5rem;\n}\n.p-4 {\n padding: 1rem;\n}\n.p-6 {\n padding: 1.5rem;\n}\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.pb-4 {\n padding-bottom: 1rem;\n}\n.pr-8 {\n padding-right: 2rem;\n}\n.pt-2 {\n padding-top: 0.5rem;\n}\n.text-center {\n text-align: center;\n}\n.text-right {\n text-align: right;\n}\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.text-xl {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.font-bold {\n font-weight: 700;\n}\n.font-medium {\n font-weight: 500;\n}\n.font-semibold {\n font-weight: 600;\n}\n.text-blue-900 {\n --tw-text-opacity: 1;\n color: rgb(30 58 138 / var(--tw-text-opacity, 1));\n}\n.text-gray-400 {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\n}\n.text-gray-500 {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\n}\n.text-gray-600 {\n --tw-text-opacity: 1;\n color: rgb(75 85 99 / var(--tw-text-opacity, 1));\n}\n.text-gray-700 {\n --tw-text-opacity: 1;\n color: rgb(55 65 81 / var(--tw-text-opacity, 1));\n}\n.text-gray-800 {\n --tw-text-opacity: 1;\n color: rgb(31 41 55 / var(--tw-text-opacity, 1));\n}\n.text-gray-900 {\n --tw-text-opacity: 1;\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\n}\n.text-green-500 {\n --tw-text-opacity: 1;\n color: rgb(34 197 94 / var(--tw-text-opacity, 1));\n}\n.text-orange-500 {\n --tw-text-opacity: 1;\n color: rgb(249 115 22 / var(--tw-text-opacity, 1));\n}\n.text-primary-blue {\n --tw-text-opacity: 1;\n color: rgb(17 44 86 / var(--tw-text-opacity, 1));\n}\n.text-primary-orange {\n --tw-text-opacity: 1;\n color: rgb(212 93 0 / var(--tw-text-opacity, 1));\n}\n.text-red-500 {\n --tw-text-opacity: 1;\n color: rgb(239 68 68 / var(--tw-text-opacity, 1));\n}\n.text-red-600 {\n --tw-text-opacity: 1;\n color: rgb(220 38 38 / var(--tw-text-opacity, 1));\n}\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.underline {\n text-decoration-line: underline;\n}\n.opacity-25 {\n opacity: 0.25;\n}\n.opacity-50 {\n opacity: 0.5;\n}\n.opacity-70 {\n opacity: 0.7;\n}\n.opacity-75 {\n opacity: 0.75;\n}\n.shadow-2xl {\n --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.outline {\n outline-style: solid;\n}\n.transition {\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke,\n opacity,\n box-shadow,\n transform,\n filter,\n backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-200 {\n transition-duration: 200ms;\n}\n.duration-300 {\n transition-duration: 300ms;\n}\n.hover\\:border-\\[\\#D45D00\\]:hover {\n --tw-border-opacity: 1;\n border-color: rgb(212 93 0 / var(--tw-border-opacity, 1));\n}\n.hover\\:bg-gray-300:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-gray-600:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-green-600:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-orange-700:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(194 65 12 / var(--tw-bg-opacity, 1));\n}\n.hover\\:text-gray-700:hover {\n --tw-text-opacity: 1;\n color: rgb(55 65 81 / var(--tw-text-opacity, 1));\n}\n.focus\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.focus\\:ring-2:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus\\:ring-primary-orange:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(212 93 0 / var(--tw-ring-opacity, 1));\n}\n.focus\\:ring-offset-2:focus {\n --tw-ring-offset-width: 2px;\n}\n.disabled\\:opacity-50:disabled {\n opacity: 0.5;\n}\n');
99
99
 
100
100
  // src/index.tsx
101
101
  var import_react9 = __toESM(require("react"));
@@ -451,7 +451,7 @@ var HeaderBar = ({ id, onClose }) => {
451
451
  width: "100",
452
452
  alt: "FeexPay"
453
453
  }
454
- )), /* @__PURE__ */ import_react5.default.createElement("div", { className: "text-right text-xs text-gray-700" }, shopData && /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, /* @__PURE__ */ import_react5.default.createElement("div", { className: "font-semibold" }, "MARCHAND: ", shopData.name), /* @__PURE__ */ import_react5.default.createElement("div", { className: "text-xs text-gray-500" }, "ID : ", shopData.reference))), /* @__PURE__ */ import_react5.default.createElement(
454
+ )), /* @__PURE__ */ import_react5.default.createElement("div", { className: "flex-1 text-right text-xs text-gray-700 px-3" }, shopData && /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, /* @__PURE__ */ import_react5.default.createElement("div", { className: "font-semibold" }, "MARCHAND: ", shopData.name), /* @__PURE__ */ import_react5.default.createElement("div", { className: "text-xs text-gray-500" }, "ID : ", shopData.reference))), /* @__PURE__ */ import_react5.default.createElement(
455
455
  "button",
456
456
  {
457
457
  onClick: onClose,
@@ -640,6 +640,7 @@ var PaymentModal = ({ isOpen, onClose }) => {
640
640
  const [paymentStatus, setPaymentStatus] = (0, import_react7.useState)("PENDING");
641
641
  const [statusMessage, setStatusMessage] = (0, import_react7.useState)("");
642
642
  const [isLoading, setIsLoading] = (0, import_react7.useState)(false);
643
+ const [showCardUnavailableMsg, setShowCardUnavailableMsg] = (0, import_react7.useState)(false);
643
644
  const [otpModalOpen, setOtpModalOpen] = (0, import_react7.useState)(false);
644
645
  const [pendingReference, setPendingReference] = (0, import_react7.useState)("");
645
646
  const [iframeUrl, setIframeUrl] = (0, import_react7.useState)(null);
@@ -1081,16 +1082,29 @@ var PaymentModal = ({ isOpen, onClose }) => {
1081
1082
  "aria-label": "Fermer la passerelle de paiement"
1082
1083
  },
1083
1084
  /* @__PURE__ */ import_react7.default.createElement("svg", { className: "w-6 h-6", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react7.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M6 18L18 6M6 6l12 12" }))
1084
- ), /* @__PURE__ */ import_react7.default.createElement("iframe", { src: iframeUrl, className: "w-full h-full border-0", title: "Payment Gateway", allow: "payment" })), /* @__PURE__ */ import_react7.default.createElement(HeaderBar_default, { id: paymentConfig.id, onClose }), /* @__PURE__ */ import_react7.default.createElement("div", { className: "p-6 overflow-y-auto flex-grow" }, /* @__PURE__ */ import_react7.default.createElement("p", { className: "text-sm text-gray-600 text-center mb-4" }, "Remplissez les champs suivants pour effectuer votre paiement"), !paymentConfig.case && /* @__PURE__ */ import_react7.default.createElement("div", { className: "flex justify-center mb-6 border-b pb-4 w-full gap-2" }, paymentTabs.map(({ label, value, icon }) => /* @__PURE__ */ import_react7.default.createElement(
1085
- "div",
1086
- {
1087
- key: value,
1088
- onClick: () => handlePaymentMethodChange(value),
1089
- className: `flex flex-col items-center flex-1 max-w-[120px] px-3 py-2 cursor-pointer rounded border ${paymentMethod === value ? "bg-[#fff7ed] border-[#D45D00]" : "bg-white border-gray-300 hover:border-[#D45D00]"}`
1090
- },
1091
- /* @__PURE__ */ import_react7.default.createElement("div", { className: "w-8 h-8 rounded-full flex items-center justify-center mb-1" }, icon),
1092
- /* @__PURE__ */ import_react7.default.createElement("span", { className: "text-xs font-medium text-center" }, label)
1093
- ))), /* @__PURE__ */ import_react7.default.createElement("div", { className: "space-y-6" }, showPersonalInfo && /* @__PURE__ */ import_react7.default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ import_react7.default.createElement("h2", { className: "font-bold text-gray-800 mb-2 flex items-center" }, /* @__PURE__ */ import_react7.default.createElement("span", { className: "bg-gray-800 text-white rounded-full w-5 h-5 inline-flex items-center justify-center text-xs mr-2" }, "1"), "Informations Personnelles"), !hidden.includes("name") && /* @__PURE__ */ import_react7.default.createElement(
1085
+ ), /* @__PURE__ */ import_react7.default.createElement("iframe", { src: iframeUrl, className: "w-full h-full border-0", title: "Payment Gateway", allow: "payment" })), /* @__PURE__ */ import_react7.default.createElement(HeaderBar_default, { id: paymentConfig.id, onClose }), /* @__PURE__ */ import_react7.default.createElement("div", { className: "p-6 overflow-y-auto flex-grow" }, /* @__PURE__ */ import_react7.default.createElement("p", { className: "text-sm text-gray-600 text-center mb-4" }, "Remplissez les champs suivants pour effectuer votre paiement"), !paymentConfig.case && /* @__PURE__ */ import_react7.default.createElement("div", { className: "mb-6 border-b pb-4 w-full" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "flex justify-center gap-2" }, paymentTabs.map(({ label, value, icon }) => {
1086
+ const isCardDisabled = value === "CARD";
1087
+ return /* @__PURE__ */ import_react7.default.createElement(
1088
+ "div",
1089
+ {
1090
+ key: value,
1091
+ onClick: () => {
1092
+ if (isCardDisabled) return;
1093
+ setShowCardUnavailableMsg(false);
1094
+ handlePaymentMethodChange(value);
1095
+ },
1096
+ onMouseEnter: () => {
1097
+ if (isCardDisabled) setShowCardUnavailableMsg(true);
1098
+ },
1099
+ onMouseLeave: () => {
1100
+ if (isCardDisabled) setShowCardUnavailableMsg(false);
1101
+ },
1102
+ className: `flex flex-col items-center flex-1 max-w-[120px] px-3 py-2 rounded border ${isCardDisabled ? "bg-gray-100 border-gray-200 opacity-50 cursor-not-allowed" : paymentMethod === value ? "bg-[#fff7ed] border-[#D45D00] cursor-pointer" : "bg-white border-gray-300 hover:border-[#D45D00] cursor-pointer"}`
1103
+ },
1104
+ /* @__PURE__ */ import_react7.default.createElement("div", { className: "w-8 h-8 rounded-full flex items-center justify-center mb-1" }, icon),
1105
+ /* @__PURE__ */ import_react7.default.createElement("span", { className: "text-xs font-medium text-center" }, label)
1106
+ );
1107
+ })), showCardUnavailableMsg && /* @__PURE__ */ import_react7.default.createElement("p", { className: "mt-2 text-center text-xs font-medium text-red-600" }, "Les paiements par cartes sont momentan\xE9ment indisponibles.")), /* @__PURE__ */ import_react7.default.createElement("div", { className: "space-y-6" }, showPersonalInfo && /* @__PURE__ */ import_react7.default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ import_react7.default.createElement("h2", { className: "font-bold text-gray-800 mb-2 flex items-center" }, /* @__PURE__ */ import_react7.default.createElement("span", { className: "bg-gray-800 text-white rounded-full w-5 h-5 inline-flex items-center justify-center text-xs mr-2" }, "1"), "Informations Personnelles"), !hidden.includes("name") && /* @__PURE__ */ import_react7.default.createElement(
1094
1108
  "input",
1095
1109
  {
1096
1110
  type: "text",
package/dist/index.mjs CHANGED
@@ -61,7 +61,7 @@ function styleInject(css, { insertAt } = {}) {
61
61
  }
62
62
 
63
63
  // src/index.css
64
- styleInject('*,\n::before,\n::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n*,\n::before,\n::after {\n box-sizing: border-box;\n border-width: 0;\n border-style: solid;\n border-color: #e5e7eb;\n}\n::before,\n::after {\n --tw-content: "";\n}\nhtml,\n:host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n -moz-tab-size: 4;\n -o-tab-size: 4;\n tab-size: 4;\n font-family:\n ui-sans-serif,\n system-ui,\n sans-serif,\n "Apple Color Emoji",\n "Segoe UI Emoji",\n "Segoe UI Symbol",\n "Noto Color Emoji";\n font-feature-settings: normal;\n font-variation-settings: normal;\n -webkit-tap-highlight-color: transparent;\n}\nbody {\n margin: 0;\n line-height: inherit;\n}\nhr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n}\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\na {\n color: inherit;\n text-decoration: inherit;\n}\nb,\nstrong {\n font-weight: bolder;\n}\ncode,\nkbd,\nsamp,\npre {\n font-family:\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n "Liberation Mono",\n "Courier New",\n monospace;\n font-feature-settings: normal;\n font-variation-settings: normal;\n font-size: 1em;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsub {\n bottom: -0.25em;\n}\nsup {\n top: -0.5em;\n}\ntable {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n font-size: 100%;\n font-weight: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n color: inherit;\n margin: 0;\n padding: 0;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\ninput:where([type=button]),\ninput:where([type=reset]),\ninput:where([type=submit]) {\n -webkit-appearance: button;\n background-color: transparent;\n background-image: none;\n}\n:-moz-focusring {\n outline: auto;\n}\n:-moz-ui-invalid {\n box-shadow: none;\n}\nprogress {\n vertical-align: baseline;\n}\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n[type=search] {\n -webkit-appearance: textfield;\n outline-offset: -2px;\n}\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n::-webkit-file-upload-button {\n -webkit-appearance: button;\n font: inherit;\n}\nsummary {\n display: list-item;\n}\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\nfieldset {\n margin: 0;\n padding: 0;\n}\nlegend {\n padding: 0;\n}\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\ndialog {\n padding: 0;\n}\ntextarea {\n resize: vertical;\n}\ninput::-moz-placeholder,\ntextarea::-moz-placeholder {\n opacity: 1;\n color: #9ca3af;\n}\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1;\n color: #9ca3af;\n}\nbutton,\n[role=button] {\n cursor: pointer;\n}\n:disabled {\n cursor: default;\n}\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block;\n vertical-align: middle;\n}\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n[hidden]:where(:not([hidden=until-found])) {\n display: none;\n}\n.\\!container {\n width: 100% !important;\n}\n.container {\n width: 100%;\n}\n@media (min-width: 640px) {\n .\\!container {\n max-width: 640px !important;\n }\n .container {\n max-width: 640px;\n }\n}\n@media (min-width: 768px) {\n .\\!container {\n max-width: 768px !important;\n }\n .container {\n max-width: 768px;\n }\n}\n@media (min-width: 1024px) {\n .\\!container {\n max-width: 1024px !important;\n }\n .container {\n max-width: 1024px;\n }\n}\n@media (min-width: 1280px) {\n .\\!container {\n max-width: 1280px !important;\n }\n .container {\n max-width: 1280px;\n }\n}\n@media (min-width: 1536px) {\n .\\!container {\n max-width: 1536px !important;\n }\n .container {\n max-width: 1536px;\n }\n}\n.pointer-events-none {\n pointer-events: none;\n}\n.visible {\n visibility: visible;\n}\n.fixed {\n position: fixed;\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.inset-0 {\n inset: 0px;\n}\n.inset-y-0 {\n top: 0px;\n bottom: 0px;\n}\n.right-0 {\n right: 0px;\n}\n.right-2 {\n right: 0.5rem;\n}\n.top-2 {\n top: 0.5rem;\n}\n.z-10 {\n z-index: 10;\n}\n.z-20 {\n z-index: 20;\n}\n.z-50 {\n z-index: 50;\n}\n.mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n.-ml-1 {\n margin-left: -0.25rem;\n}\n.mb-1 {\n margin-bottom: 0.25rem;\n}\n.mb-2 {\n margin-bottom: 0.5rem;\n}\n.mb-4 {\n margin-bottom: 1rem;\n}\n.mb-5 {\n margin-bottom: 1.25rem;\n}\n.mb-6 {\n margin-bottom: 1.5rem;\n}\n.mr-2 {\n margin-right: 0.5rem;\n}\n.mt-2 {\n margin-top: 0.5rem;\n}\n.mt-6 {\n margin-top: 1.5rem;\n}\n.block {\n display: block;\n}\n.flex {\n display: flex;\n}\n.inline-flex {\n display: inline-flex;\n}\n.grid {\n display: grid;\n}\n.\\!hidden {\n display: none !important;\n}\n.hidden {\n display: none;\n}\n.h-1\\.5 {\n height: 0.375rem;\n}\n.h-11 {\n height: 2.75rem;\n}\n.h-20 {\n height: 5rem;\n}\n.h-4 {\n height: 1rem;\n}\n.h-5 {\n height: 1.25rem;\n}\n.h-6 {\n height: 1.5rem;\n}\n.h-8 {\n height: 2rem;\n}\n.h-full {\n height: 100%;\n}\n.max-h-\\[90vh\\] {\n max-height: 90vh;\n}\n.w-1\\/3 {\n width: 33.333333%;\n}\n.w-11 {\n width: 2.75rem;\n}\n.w-2\\/3 {\n width: 66.666667%;\n}\n.w-20 {\n width: 5rem;\n}\n.w-4 {\n width: 1rem;\n}\n.w-5 {\n width: 1.25rem;\n}\n.w-6 {\n width: 1.5rem;\n}\n.w-8 {\n width: 2rem;\n}\n.w-full {\n width: 100%;\n}\n.max-w-\\[120px\\] {\n max-width: 120px;\n}\n.max-w-md {\n max-width: 28rem;\n}\n.max-w-sm {\n max-width: 24rem;\n}\n.flex-1 {\n flex: 1 1 0%;\n}\n.flex-shrink-0 {\n flex-shrink: 0;\n}\n.flex-grow {\n flex-grow: 1;\n}\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n.animate-spin {\n animation: spin 1s linear infinite;\n}\n.cursor-not-allowed {\n cursor: not-allowed;\n}\n.cursor-pointer {\n cursor: pointer;\n}\n.appearance-none {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.flex-col {\n flex-direction: column;\n}\n.items-center {\n align-items: center;\n}\n.justify-center {\n justify-content: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.gap-2 {\n gap: 0.5rem;\n}\n.gap-4 {\n gap: 1rem;\n}\n.space-x-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-y-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1rem * var(--tw-space-y-reverse));\n}\n.space-y-6 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.overflow-y-auto {\n overflow-y: auto;\n}\n.rounded {\n border-radius: 0.25rem;\n}\n.rounded-2xl {\n border-radius: 1rem;\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-lg {\n border-radius: 0.5rem;\n}\n.rounded-md {\n border-radius: 0.375rem;\n}\n.rounded-xl {\n border-radius: 0.75rem;\n}\n.rounded-l-md {\n border-top-left-radius: 0.375rem;\n border-bottom-left-radius: 0.375rem;\n}\n.rounded-r-md {\n border-top-right-radius: 0.375rem;\n border-bottom-right-radius: 0.375rem;\n}\n.border {\n border-width: 1px;\n}\n.border-0 {\n border-width: 0px;\n}\n.border-b {\n border-bottom-width: 1px;\n}\n.border-r-0 {\n border-right-width: 0px;\n}\n.border-\\[\\#D45D00\\] {\n --tw-border-opacity: 1;\n border-color: rgb(212 93 0 / var(--tw-border-opacity, 1));\n}\n.border-gray-200 {\n --tw-border-opacity: 1;\n border-color: rgb(229 231 235 / var(--tw-border-opacity, 1));\n}\n.border-gray-300 {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\n}\n.bg-\\[\\#fff7ed\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(255 247 237 / var(--tw-bg-opacity, 1));\n}\n.bg-black {\n --tw-bg-opacity: 1;\n background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1));\n}\n.bg-blue-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-200 {\n --tw-bg-opacity: 1;\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-800 {\n --tw-bg-opacity: 1;\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\n}\n.bg-green-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(220 252 231 / var(--tw-bg-opacity, 1));\n}\n.bg-green-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(74 222 128 / var(--tw-bg-opacity, 1));\n}\n.bg-green-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(34 197 94 / var(--tw-bg-opacity, 1));\n}\n.bg-orange-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(255 237 213 / var(--tw-bg-opacity, 1));\n}\n.bg-orange-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(251 146 60 / var(--tw-bg-opacity, 1));\n}\n.bg-primary-orange {\n --tw-bg-opacity: 1;\n background-color: rgb(212 93 0 / var(--tw-bg-opacity, 1));\n}\n.bg-red-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(254 226 226 / var(--tw-bg-opacity, 1));\n}\n.bg-red-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(248 113 113 / var(--tw-bg-opacity, 1));\n}\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n}\n.bg-opacity-50 {\n --tw-bg-opacity: 0.5;\n}\n.p-1 {\n padding: 0.25rem;\n}\n.p-2 {\n padding: 0.5rem;\n}\n.p-4 {\n padding: 1rem;\n}\n.p-6 {\n padding: 1.5rem;\n}\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.pb-4 {\n padding-bottom: 1rem;\n}\n.pr-8 {\n padding-right: 2rem;\n}\n.pt-2 {\n padding-top: 0.5rem;\n}\n.text-center {\n text-align: center;\n}\n.text-right {\n text-align: right;\n}\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.text-xl {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.font-bold {\n font-weight: 700;\n}\n.font-medium {\n font-weight: 500;\n}\n.font-semibold {\n font-weight: 600;\n}\n.text-blue-900 {\n --tw-text-opacity: 1;\n color: rgb(30 58 138 / var(--tw-text-opacity, 1));\n}\n.text-gray-400 {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\n}\n.text-gray-500 {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\n}\n.text-gray-600 {\n --tw-text-opacity: 1;\n color: rgb(75 85 99 / var(--tw-text-opacity, 1));\n}\n.text-gray-700 {\n --tw-text-opacity: 1;\n color: rgb(55 65 81 / var(--tw-text-opacity, 1));\n}\n.text-gray-800 {\n --tw-text-opacity: 1;\n color: rgb(31 41 55 / var(--tw-text-opacity, 1));\n}\n.text-gray-900 {\n --tw-text-opacity: 1;\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\n}\n.text-green-500 {\n --tw-text-opacity: 1;\n color: rgb(34 197 94 / var(--tw-text-opacity, 1));\n}\n.text-orange-500 {\n --tw-text-opacity: 1;\n color: rgb(249 115 22 / var(--tw-text-opacity, 1));\n}\n.text-primary-blue {\n --tw-text-opacity: 1;\n color: rgb(17 44 86 / var(--tw-text-opacity, 1));\n}\n.text-primary-orange {\n --tw-text-opacity: 1;\n color: rgb(212 93 0 / var(--tw-text-opacity, 1));\n}\n.text-red-500 {\n --tw-text-opacity: 1;\n color: rgb(239 68 68 / var(--tw-text-opacity, 1));\n}\n.text-red-600 {\n --tw-text-opacity: 1;\n color: rgb(220 38 38 / var(--tw-text-opacity, 1));\n}\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.underline {\n text-decoration-line: underline;\n}\n.opacity-25 {\n opacity: 0.25;\n}\n.opacity-70 {\n opacity: 0.7;\n}\n.opacity-75 {\n opacity: 0.75;\n}\n.shadow-2xl {\n --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.outline {\n outline-style: solid;\n}\n.transition {\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke,\n opacity,\n box-shadow,\n transform,\n filter,\n backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-200 {\n transition-duration: 200ms;\n}\n.duration-300 {\n transition-duration: 300ms;\n}\n.hover\\:border-\\[\\#D45D00\\]:hover {\n --tw-border-opacity: 1;\n border-color: rgb(212 93 0 / var(--tw-border-opacity, 1));\n}\n.hover\\:bg-gray-300:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-gray-600:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-green-600:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-orange-700:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(194 65 12 / var(--tw-bg-opacity, 1));\n}\n.hover\\:text-gray-700:hover {\n --tw-text-opacity: 1;\n color: rgb(55 65 81 / var(--tw-text-opacity, 1));\n}\n.focus\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.focus\\:ring-2:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus\\:ring-primary-orange:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(212 93 0 / var(--tw-ring-opacity, 1));\n}\n.focus\\:ring-offset-2:focus {\n --tw-ring-offset-width: 2px;\n}\n.disabled\\:opacity-50:disabled {\n opacity: 0.5;\n}\n');
64
+ styleInject('*,\n::before,\n::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n*,\n::before,\n::after {\n box-sizing: border-box;\n border-width: 0;\n border-style: solid;\n border-color: #e5e7eb;\n}\n::before,\n::after {\n --tw-content: "";\n}\nhtml,\n:host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n -moz-tab-size: 4;\n -o-tab-size: 4;\n tab-size: 4;\n font-family:\n ui-sans-serif,\n system-ui,\n sans-serif,\n "Apple Color Emoji",\n "Segoe UI Emoji",\n "Segoe UI Symbol",\n "Noto Color Emoji";\n font-feature-settings: normal;\n font-variation-settings: normal;\n -webkit-tap-highlight-color: transparent;\n}\nbody {\n margin: 0;\n line-height: inherit;\n}\nhr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n}\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\na {\n color: inherit;\n text-decoration: inherit;\n}\nb,\nstrong {\n font-weight: bolder;\n}\ncode,\nkbd,\nsamp,\npre {\n font-family:\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n "Liberation Mono",\n "Courier New",\n monospace;\n font-feature-settings: normal;\n font-variation-settings: normal;\n font-size: 1em;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsub {\n bottom: -0.25em;\n}\nsup {\n top: -0.5em;\n}\ntable {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n font-size: 100%;\n font-weight: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n color: inherit;\n margin: 0;\n padding: 0;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\ninput:where([type=button]),\ninput:where([type=reset]),\ninput:where([type=submit]) {\n -webkit-appearance: button;\n background-color: transparent;\n background-image: none;\n}\n:-moz-focusring {\n outline: auto;\n}\n:-moz-ui-invalid {\n box-shadow: none;\n}\nprogress {\n vertical-align: baseline;\n}\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n[type=search] {\n -webkit-appearance: textfield;\n outline-offset: -2px;\n}\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n::-webkit-file-upload-button {\n -webkit-appearance: button;\n font: inherit;\n}\nsummary {\n display: list-item;\n}\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\nfieldset {\n margin: 0;\n padding: 0;\n}\nlegend {\n padding: 0;\n}\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\ndialog {\n padding: 0;\n}\ntextarea {\n resize: vertical;\n}\ninput::-moz-placeholder,\ntextarea::-moz-placeholder {\n opacity: 1;\n color: #9ca3af;\n}\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1;\n color: #9ca3af;\n}\nbutton,\n[role=button] {\n cursor: pointer;\n}\n:disabled {\n cursor: default;\n}\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block;\n vertical-align: middle;\n}\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n[hidden]:where(:not([hidden=until-found])) {\n display: none;\n}\n.\\!container {\n width: 100% !important;\n}\n.container {\n width: 100%;\n}\n@media (min-width: 640px) {\n .\\!container {\n max-width: 640px !important;\n }\n .container {\n max-width: 640px;\n }\n}\n@media (min-width: 768px) {\n .\\!container {\n max-width: 768px !important;\n }\n .container {\n max-width: 768px;\n }\n}\n@media (min-width: 1024px) {\n .\\!container {\n max-width: 1024px !important;\n }\n .container {\n max-width: 1024px;\n }\n}\n@media (min-width: 1280px) {\n .\\!container {\n max-width: 1280px !important;\n }\n .container {\n max-width: 1280px;\n }\n}\n@media (min-width: 1536px) {\n .\\!container {\n max-width: 1536px !important;\n }\n .container {\n max-width: 1536px;\n }\n}\n.pointer-events-none {\n pointer-events: none;\n}\n.visible {\n visibility: visible;\n}\n.fixed {\n position: fixed;\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.inset-0 {\n inset: 0px;\n}\n.inset-y-0 {\n top: 0px;\n bottom: 0px;\n}\n.right-0 {\n right: 0px;\n}\n.right-2 {\n right: 0.5rem;\n}\n.top-2 {\n top: 0.5rem;\n}\n.z-10 {\n z-index: 10;\n}\n.z-20 {\n z-index: 20;\n}\n.z-50 {\n z-index: 50;\n}\n.mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n.-ml-1 {\n margin-left: -0.25rem;\n}\n.mb-1 {\n margin-bottom: 0.25rem;\n}\n.mb-2 {\n margin-bottom: 0.5rem;\n}\n.mb-4 {\n margin-bottom: 1rem;\n}\n.mb-5 {\n margin-bottom: 1.25rem;\n}\n.mb-6 {\n margin-bottom: 1.5rem;\n}\n.mr-2 {\n margin-right: 0.5rem;\n}\n.mt-2 {\n margin-top: 0.5rem;\n}\n.mt-6 {\n margin-top: 1.5rem;\n}\n.block {\n display: block;\n}\n.flex {\n display: flex;\n}\n.inline-flex {\n display: inline-flex;\n}\n.grid {\n display: grid;\n}\n.\\!hidden {\n display: none !important;\n}\n.hidden {\n display: none;\n}\n.h-1\\.5 {\n height: 0.375rem;\n}\n.h-11 {\n height: 2.75rem;\n}\n.h-20 {\n height: 5rem;\n}\n.h-4 {\n height: 1rem;\n}\n.h-5 {\n height: 1.25rem;\n}\n.h-6 {\n height: 1.5rem;\n}\n.h-8 {\n height: 2rem;\n}\n.h-full {\n height: 100%;\n}\n.max-h-\\[90vh\\] {\n max-height: 90vh;\n}\n.w-1\\/3 {\n width: 33.333333%;\n}\n.w-11 {\n width: 2.75rem;\n}\n.w-2\\/3 {\n width: 66.666667%;\n}\n.w-20 {\n width: 5rem;\n}\n.w-4 {\n width: 1rem;\n}\n.w-5 {\n width: 1.25rem;\n}\n.w-6 {\n width: 1.5rem;\n}\n.w-8 {\n width: 2rem;\n}\n.w-full {\n width: 100%;\n}\n.max-w-\\[120px\\] {\n max-width: 120px;\n}\n.max-w-md {\n max-width: 28rem;\n}\n.max-w-sm {\n max-width: 24rem;\n}\n.flex-1 {\n flex: 1 1 0%;\n}\n.flex-shrink-0 {\n flex-shrink: 0;\n}\n.flex-grow {\n flex-grow: 1;\n}\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n.animate-spin {\n animation: spin 1s linear infinite;\n}\n.cursor-not-allowed {\n cursor: not-allowed;\n}\n.cursor-pointer {\n cursor: pointer;\n}\n.appearance-none {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.flex-col {\n flex-direction: column;\n}\n.items-center {\n align-items: center;\n}\n.justify-center {\n justify-content: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.gap-2 {\n gap: 0.5rem;\n}\n.gap-4 {\n gap: 1rem;\n}\n.space-x-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-y-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1rem * var(--tw-space-y-reverse));\n}\n.space-y-6 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.overflow-y-auto {\n overflow-y: auto;\n}\n.rounded {\n border-radius: 0.25rem;\n}\n.rounded-2xl {\n border-radius: 1rem;\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-lg {\n border-radius: 0.5rem;\n}\n.rounded-md {\n border-radius: 0.375rem;\n}\n.rounded-xl {\n border-radius: 0.75rem;\n}\n.rounded-l-md {\n border-top-left-radius: 0.375rem;\n border-bottom-left-radius: 0.375rem;\n}\n.rounded-r-md {\n border-top-right-radius: 0.375rem;\n border-bottom-right-radius: 0.375rem;\n}\n.border {\n border-width: 1px;\n}\n.border-0 {\n border-width: 0px;\n}\n.border-b {\n border-bottom-width: 1px;\n}\n.border-r-0 {\n border-right-width: 0px;\n}\n.border-\\[\\#D45D00\\] {\n --tw-border-opacity: 1;\n border-color: rgb(212 93 0 / var(--tw-border-opacity, 1));\n}\n.border-gray-200 {\n --tw-border-opacity: 1;\n border-color: rgb(229 231 235 / var(--tw-border-opacity, 1));\n}\n.border-gray-300 {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\n}\n.bg-\\[\\#fff7ed\\] {\n --tw-bg-opacity: 1;\n background-color: rgb(255 247 237 / var(--tw-bg-opacity, 1));\n}\n.bg-black {\n --tw-bg-opacity: 1;\n background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1));\n}\n.bg-blue-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-200 {\n --tw-bg-opacity: 1;\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-800 {\n --tw-bg-opacity: 1;\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\n}\n.bg-green-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(220 252 231 / var(--tw-bg-opacity, 1));\n}\n.bg-green-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(74 222 128 / var(--tw-bg-opacity, 1));\n}\n.bg-green-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(34 197 94 / var(--tw-bg-opacity, 1));\n}\n.bg-orange-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(255 237 213 / var(--tw-bg-opacity, 1));\n}\n.bg-orange-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(251 146 60 / var(--tw-bg-opacity, 1));\n}\n.bg-primary-orange {\n --tw-bg-opacity: 1;\n background-color: rgb(212 93 0 / var(--tw-bg-opacity, 1));\n}\n.bg-red-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(254 226 226 / var(--tw-bg-opacity, 1));\n}\n.bg-red-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(248 113 113 / var(--tw-bg-opacity, 1));\n}\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n}\n.bg-opacity-50 {\n --tw-bg-opacity: 0.5;\n}\n.p-1 {\n padding: 0.25rem;\n}\n.p-2 {\n padding: 0.5rem;\n}\n.p-4 {\n padding: 1rem;\n}\n.p-6 {\n padding: 1.5rem;\n}\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.pb-4 {\n padding-bottom: 1rem;\n}\n.pr-8 {\n padding-right: 2rem;\n}\n.pt-2 {\n padding-top: 0.5rem;\n}\n.text-center {\n text-align: center;\n}\n.text-right {\n text-align: right;\n}\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.text-xl {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.font-bold {\n font-weight: 700;\n}\n.font-medium {\n font-weight: 500;\n}\n.font-semibold {\n font-weight: 600;\n}\n.text-blue-900 {\n --tw-text-opacity: 1;\n color: rgb(30 58 138 / var(--tw-text-opacity, 1));\n}\n.text-gray-400 {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\n}\n.text-gray-500 {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\n}\n.text-gray-600 {\n --tw-text-opacity: 1;\n color: rgb(75 85 99 / var(--tw-text-opacity, 1));\n}\n.text-gray-700 {\n --tw-text-opacity: 1;\n color: rgb(55 65 81 / var(--tw-text-opacity, 1));\n}\n.text-gray-800 {\n --tw-text-opacity: 1;\n color: rgb(31 41 55 / var(--tw-text-opacity, 1));\n}\n.text-gray-900 {\n --tw-text-opacity: 1;\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\n}\n.text-green-500 {\n --tw-text-opacity: 1;\n color: rgb(34 197 94 / var(--tw-text-opacity, 1));\n}\n.text-orange-500 {\n --tw-text-opacity: 1;\n color: rgb(249 115 22 / var(--tw-text-opacity, 1));\n}\n.text-primary-blue {\n --tw-text-opacity: 1;\n color: rgb(17 44 86 / var(--tw-text-opacity, 1));\n}\n.text-primary-orange {\n --tw-text-opacity: 1;\n color: rgb(212 93 0 / var(--tw-text-opacity, 1));\n}\n.text-red-500 {\n --tw-text-opacity: 1;\n color: rgb(239 68 68 / var(--tw-text-opacity, 1));\n}\n.text-red-600 {\n --tw-text-opacity: 1;\n color: rgb(220 38 38 / var(--tw-text-opacity, 1));\n}\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.underline {\n text-decoration-line: underline;\n}\n.opacity-25 {\n opacity: 0.25;\n}\n.opacity-50 {\n opacity: 0.5;\n}\n.opacity-70 {\n opacity: 0.7;\n}\n.opacity-75 {\n opacity: 0.75;\n}\n.shadow-2xl {\n --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.outline {\n outline-style: solid;\n}\n.transition {\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke,\n opacity,\n box-shadow,\n transform,\n filter,\n backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-200 {\n transition-duration: 200ms;\n}\n.duration-300 {\n transition-duration: 300ms;\n}\n.hover\\:border-\\[\\#D45D00\\]:hover {\n --tw-border-opacity: 1;\n border-color: rgb(212 93 0 / var(--tw-border-opacity, 1));\n}\n.hover\\:bg-gray-300:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-gray-600:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-green-600:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-orange-700:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(194 65 12 / var(--tw-bg-opacity, 1));\n}\n.hover\\:text-gray-700:hover {\n --tw-text-opacity: 1;\n color: rgb(55 65 81 / var(--tw-text-opacity, 1));\n}\n.focus\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.focus\\:ring-2:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus\\:ring-primary-orange:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(212 93 0 / var(--tw-ring-opacity, 1));\n}\n.focus\\:ring-offset-2:focus {\n --tw-ring-offset-width: 2px;\n}\n.disabled\\:opacity-50:disabled {\n opacity: 0.5;\n}\n');
65
65
 
66
66
  // src/index.tsx
67
67
  import React9 from "react";
@@ -417,7 +417,7 @@ var HeaderBar = ({ id, onClose }) => {
417
417
  width: "100",
418
418
  alt: "FeexPay"
419
419
  }
420
- )), /* @__PURE__ */ React5.createElement("div", { className: "text-right text-xs text-gray-700" }, shopData && /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement("div", { className: "font-semibold" }, "MARCHAND: ", shopData.name), /* @__PURE__ */ React5.createElement("div", { className: "text-xs text-gray-500" }, "ID : ", shopData.reference))), /* @__PURE__ */ React5.createElement(
420
+ )), /* @__PURE__ */ React5.createElement("div", { className: "flex-1 text-right text-xs text-gray-700 px-3" }, shopData && /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement("div", { className: "font-semibold" }, "MARCHAND: ", shopData.name), /* @__PURE__ */ React5.createElement("div", { className: "text-xs text-gray-500" }, "ID : ", shopData.reference))), /* @__PURE__ */ React5.createElement(
421
421
  "button",
422
422
  {
423
423
  onClick: onClose,
@@ -606,6 +606,7 @@ var PaymentModal = ({ isOpen, onClose }) => {
606
606
  const [paymentStatus, setPaymentStatus] = useState4("PENDING");
607
607
  const [statusMessage, setStatusMessage] = useState4("");
608
608
  const [isLoading, setIsLoading] = useState4(false);
609
+ const [showCardUnavailableMsg, setShowCardUnavailableMsg] = useState4(false);
609
610
  const [otpModalOpen, setOtpModalOpen] = useState4(false);
610
611
  const [pendingReference, setPendingReference] = useState4("");
611
612
  const [iframeUrl, setIframeUrl] = useState4(null);
@@ -1047,16 +1048,29 @@ var PaymentModal = ({ isOpen, onClose }) => {
1047
1048
  "aria-label": "Fermer la passerelle de paiement"
1048
1049
  },
1049
1050
  /* @__PURE__ */ React7.createElement("svg", { className: "w-6 h-6", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React7.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M6 18L18 6M6 6l12 12" }))
1050
- ), /* @__PURE__ */ React7.createElement("iframe", { src: iframeUrl, className: "w-full h-full border-0", title: "Payment Gateway", allow: "payment" })), /* @__PURE__ */ React7.createElement(HeaderBar_default, { id: paymentConfig.id, onClose }), /* @__PURE__ */ React7.createElement("div", { className: "p-6 overflow-y-auto flex-grow" }, /* @__PURE__ */ React7.createElement("p", { className: "text-sm text-gray-600 text-center mb-4" }, "Remplissez les champs suivants pour effectuer votre paiement"), !paymentConfig.case && /* @__PURE__ */ React7.createElement("div", { className: "flex justify-center mb-6 border-b pb-4 w-full gap-2" }, paymentTabs.map(({ label, value, icon }) => /* @__PURE__ */ React7.createElement(
1051
- "div",
1052
- {
1053
- key: value,
1054
- onClick: () => handlePaymentMethodChange(value),
1055
- className: `flex flex-col items-center flex-1 max-w-[120px] px-3 py-2 cursor-pointer rounded border ${paymentMethod === value ? "bg-[#fff7ed] border-[#D45D00]" : "bg-white border-gray-300 hover:border-[#D45D00]"}`
1056
- },
1057
- /* @__PURE__ */ React7.createElement("div", { className: "w-8 h-8 rounded-full flex items-center justify-center mb-1" }, icon),
1058
- /* @__PURE__ */ React7.createElement("span", { className: "text-xs font-medium text-center" }, label)
1059
- ))), /* @__PURE__ */ React7.createElement("div", { className: "space-y-6" }, showPersonalInfo && /* @__PURE__ */ React7.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React7.createElement("h2", { className: "font-bold text-gray-800 mb-2 flex items-center" }, /* @__PURE__ */ React7.createElement("span", { className: "bg-gray-800 text-white rounded-full w-5 h-5 inline-flex items-center justify-center text-xs mr-2" }, "1"), "Informations Personnelles"), !hidden.includes("name") && /* @__PURE__ */ React7.createElement(
1051
+ ), /* @__PURE__ */ React7.createElement("iframe", { src: iframeUrl, className: "w-full h-full border-0", title: "Payment Gateway", allow: "payment" })), /* @__PURE__ */ React7.createElement(HeaderBar_default, { id: paymentConfig.id, onClose }), /* @__PURE__ */ React7.createElement("div", { className: "p-6 overflow-y-auto flex-grow" }, /* @__PURE__ */ React7.createElement("p", { className: "text-sm text-gray-600 text-center mb-4" }, "Remplissez les champs suivants pour effectuer votre paiement"), !paymentConfig.case && /* @__PURE__ */ React7.createElement("div", { className: "mb-6 border-b pb-4 w-full" }, /* @__PURE__ */ React7.createElement("div", { className: "flex justify-center gap-2" }, paymentTabs.map(({ label, value, icon }) => {
1052
+ const isCardDisabled = value === "CARD";
1053
+ return /* @__PURE__ */ React7.createElement(
1054
+ "div",
1055
+ {
1056
+ key: value,
1057
+ onClick: () => {
1058
+ if (isCardDisabled) return;
1059
+ setShowCardUnavailableMsg(false);
1060
+ handlePaymentMethodChange(value);
1061
+ },
1062
+ onMouseEnter: () => {
1063
+ if (isCardDisabled) setShowCardUnavailableMsg(true);
1064
+ },
1065
+ onMouseLeave: () => {
1066
+ if (isCardDisabled) setShowCardUnavailableMsg(false);
1067
+ },
1068
+ className: `flex flex-col items-center flex-1 max-w-[120px] px-3 py-2 rounded border ${isCardDisabled ? "bg-gray-100 border-gray-200 opacity-50 cursor-not-allowed" : paymentMethod === value ? "bg-[#fff7ed] border-[#D45D00] cursor-pointer" : "bg-white border-gray-300 hover:border-[#D45D00] cursor-pointer"}`
1069
+ },
1070
+ /* @__PURE__ */ React7.createElement("div", { className: "w-8 h-8 rounded-full flex items-center justify-center mb-1" }, icon),
1071
+ /* @__PURE__ */ React7.createElement("span", { className: "text-xs font-medium text-center" }, label)
1072
+ );
1073
+ })), showCardUnavailableMsg && /* @__PURE__ */ React7.createElement("p", { className: "mt-2 text-center text-xs font-medium text-red-600" }, "Les paiements par cartes sont momentan\xE9ment indisponibles.")), /* @__PURE__ */ React7.createElement("div", { className: "space-y-6" }, showPersonalInfo && /* @__PURE__ */ React7.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React7.createElement("h2", { className: "font-bold text-gray-800 mb-2 flex items-center" }, /* @__PURE__ */ React7.createElement("span", { className: "bg-gray-800 text-white rounded-full w-5 h-5 inline-flex items-center justify-center text-xs mr-2" }, "1"), "Informations Personnelles"), !hidden.includes("name") && /* @__PURE__ */ React7.createElement(
1060
1074
  "input",
1061
1075
  {
1062
1076
  type: "text",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-sdk-feexpay",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "",
5
5
  "source": "src/index.tsx",
6
6
  "main": "dist/index.js",