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 +624 -0
- package/dist/index.js +26 -12
- package/dist/index.mjs +26 -12
- package/package.json +1 -1
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: "
|
|
1085
|
-
"
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
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: "
|
|
1051
|
-
"
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
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",
|