@silvestv/migration-planificator 7.1.3 → 7.1.4
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.fr.md +100 -255
- package/README.md +110 -264
- package/dist/src/autofix/cli/fix-command.js +0 -2
- package/dist/src/autofix/prompts/file-prompt-phases.js +1 -1
- package/dist/styles.css +1 -1
- package/package.json +12 -19
package/README.fr.md
CHANGED
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
# Angular Migration Planner
|
|
2
2
|
|
|
3
|
-
> **
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
> **Effectuez vos migrations Angular sans stress et avec accompagnement !**
|
|
4
|
+
>
|
|
5
|
+
> **Outil professionnel d'accompagnement de migrations Angular pour montées de version, refactoring Nx monorepo, et evaluation de dette technique**
|
|
6
|
+
>
|
|
7
|
+
> **Auto fix de migration par IA + schematics angular (expérimental)**
|
|
8
|
+
>
|
|
8
9
|
[](https://www.npmjs.com/package/@silvestv/migration-planificator)
|
|
9
10
|
[](https://nodejs.org/)
|
|
10
11
|
[](https://www.typescriptlang.org/)
|
|
11
12
|
[](tests)
|
|
12
13
|
[](https://opensource.org/licenses/Apache-2.0)[](https://www.npmjs.com/package/@silvestv/migration-planificator)
|
|
13
14
|
|
|
14
|
-
**[🇬🇧 English](https://github.com/silvestv/migration-planificator-documentation/blob/master/README.md) | [🇫🇷
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
Pour toute préoccupation de sécurité ou signaler une vulnérabilité, voir [SECURITY.md](https://github.com/silvestv/migration-planificator-documentation/blob/master/SECURITY.md)
|
|
15
|
+
**[🇬🇧 English](https://github.com/silvestv/migration-planificator-documentation/blob/master/README.md) | [🇫🇷 Francais](https://github.com/silvestv/migration-planificator-documentation/blob/master/README.fr.md)**
|
|
19
16
|
|
|
20
17
|
---
|
|
21
18
|
|
|
22
19
|
## 🎯 C'est Quoi ?
|
|
23
20
|
|
|
24
|
-
Un **outil d'analyse de migrations Angular** complet pour :
|
|
21
|
+
Un **outil d'analyse (AST) de migrations Angular** ET **de migration assistée par IA** complet pour :
|
|
25
22
|
|
|
26
23
|
- 🔄 **Migrations Angular** : Planifiez migrations 17→18, 18→19, 19→20, 20→21 avec estimations précises
|
|
27
24
|
- 🏢 **Monorepo Nx** : Analysez workspaces multi-apps/libs avec détail par target
|
|
@@ -31,6 +28,8 @@ Un **outil d'analyse de migrations Angular** complet pour :
|
|
|
31
28
|
|
|
32
29
|
Parfait pour **équipes techniques** et **tech leads** planifiant des upgrades Angular ou refactoring.
|
|
33
30
|
|
|
31
|
+
📸 [Voir le résultat](#vue-générale-du-résultat-page-workload) | 🤖 [AI Auto-Fix](#-ai-auto-fix-experimental)
|
|
32
|
+
|
|
34
33
|
---
|
|
35
34
|
|
|
36
35
|
## 🏆 Pourquoi Choisir Cet Outil ?
|
|
@@ -45,319 +44,165 @@ Contrairement aux scanners regex simples ou audits manuels :
|
|
|
45
44
|
|
|
46
45
|
---
|
|
47
46
|
|
|
48
|
-
##
|
|
47
|
+
## 🚀 Demarrage Rapide
|
|
49
48
|
|
|
50
|
-
- **Précision AST** : Détection contextuelle via ts-morph + @angular/compiler (88% règles)
|
|
51
|
-
- **Dashboard Interactif** : Rapport HTML avec charts, timeline Gantt, édition temps réel
|
|
52
|
-
- **3 Modes Scan** : AST (précis), Regex (rapide), Both (comparatif avec analyse delta)
|
|
53
|
-
- **119 Règles Migration** : Couvrant breaking changes, dépréciations, best practices (to18, to19, to20, to21)
|
|
54
|
-
- **Analyse Cross-File** : Détection TypeScript ↔ templates HTML
|
|
55
|
-
- **Multi-Projets** : Support Nx Monorepo et Angular Standalone
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
## 🎓 Cas d'Usage
|
|
60
|
-
|
|
61
|
-
### Migration Version Angular
|
|
62
|
-
Upgrade Angular 17→21 avec liste complète changements et estimations :
|
|
63
49
|
```bash
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
**Résultat** : Tous changements requis, breakdown temps, évaluation risques, planificateur interactif
|
|
50
|
+
# Se placer sur son projet
|
|
51
|
+
cd path-to-my-project # (si install local)
|
|
67
52
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
```bash
|
|
71
|
-
npx @silvestv/migration-planificator --scanner=both --project-path=/path/to/nx-workspace
|
|
72
|
-
```
|
|
73
|
-
**Résultat** : Breakdown par app/lib, impact dépendances partagées, timeline Gantt
|
|
74
|
-
|
|
75
|
-
### Évaluation Dette Technique
|
|
76
|
-
Auditer codebase pour APIs dépréciées :
|
|
77
|
-
```bash
|
|
78
|
-
npx @silvestv/migration-planificator --scanner=ast --rules=[18,19,20]
|
|
79
|
-
```
|
|
80
|
-
**Résultat** : Patterns dépréciés (*ngIf, @Input()), opportunités modernisation, tracking fichiers
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## 🚀 Démarrage Rapide
|
|
85
|
-
|
|
86
|
-
### Installation
|
|
87
|
-
|
|
88
|
-
#### Via npm (Recommandé)
|
|
89
|
-
```bash
|
|
53
|
+
# Installer
|
|
54
|
+
npm install -D @silvestv/migration-planificator
|
|
90
55
|
npm install -g @silvestv/migration-planificator
|
|
91
|
-
# ou
|
|
92
|
-
npx @silvestv/migration-planificator --project-path=/chemin/vers/projet
|
|
93
|
-
```
|
|
94
56
|
|
|
95
|
-
|
|
96
|
-
```bash
|
|
97
|
-
git clone <repository-url>
|
|
98
|
-
cd @silvestv/migration-planificator
|
|
99
|
-
npm install
|
|
100
|
-
npm run build
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
### Générer Premier Rapport
|
|
104
|
-
```bash
|
|
105
|
-
# Analyser répertoire courant
|
|
106
|
-
npx @silvestv/migration-planificator
|
|
107
|
-
|
|
108
|
-
# Analyser projet spécifique avec options
|
|
109
|
-
npx @silvestv/migration-planificator --scanner=both --project-path=/chemin/vers/projet
|
|
110
|
-
|
|
111
|
-
# Filtrer par version migration
|
|
112
|
-
npx @silvestv/migration-planificator --rules=18 # Seulement Angular 17→18
|
|
113
|
-
npx @silvestv/migration-planificator --rules=[18,19] # Angular 17→19
|
|
114
|
-
|
|
115
|
-
# Ou avec installation globale
|
|
116
|
-
@silvestv/migration-planificator --scanner=both --project-path=/chemin/vers/projet
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### Ouvrir Rapport
|
|
120
|
-
```bash
|
|
121
|
-
open output/index.html # macOS/Linux
|
|
122
|
-
start output/index.html # Windows
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
## 💻 Utilisation
|
|
128
|
-
|
|
129
|
-
### Après installation npm
|
|
130
|
-
|
|
131
|
-
```bash
|
|
132
|
-
# Utilisation basique
|
|
57
|
+
# Executer directement
|
|
133
58
|
npx @silvestv/migration-planificator
|
|
134
|
-
|
|
135
|
-
# Avec options
|
|
136
|
-
npx @silvestv/migration-planificator --scanner=both --project-path=/chemin/vers/projet --rules=all
|
|
137
|
-
|
|
138
|
-
# Installation globale
|
|
139
|
-
npm install -g @silvestv/migration-planificator
|
|
140
|
-
@silvestv/migration-planificator --scanner=ast --project-path=./mon-app-angular
|
|
59
|
+
npx @silvestv/migration-planificator --project-path=path-to-my-project
|
|
141
60
|
```
|
|
142
61
|
|
|
143
62
|
### Options CLI
|
|
63
|
+
|
|
144
64
|
```bash
|
|
145
|
-
--scanner=<mode> ast | regex | both
|
|
146
|
-
--project-path=<path> Chemin vers projet Angular
|
|
147
|
-
--rules=<versions> 18 | [18,19] | all
|
|
65
|
+
--scanner=<mode> ast | regex | both [defaut: ast]
|
|
66
|
+
--project-path=<path> Chemin vers projet Angular [defaut: .]
|
|
67
|
+
--rules=<versions> 18 | [18,19] | all [defaut: all]
|
|
148
68
|
```
|
|
149
69
|
|
|
150
70
|
### Exemples
|
|
71
|
+
|
|
151
72
|
```bash
|
|
152
|
-
# Scanner
|
|
73
|
+
# Scanner repertoire courant (AST, toutes regles)
|
|
153
74
|
npx @silvestv/migration-planificator
|
|
154
75
|
|
|
155
|
-
# Scan comparatif
|
|
76
|
+
# Scan comparatif sur workspace Nx
|
|
156
77
|
npx @silvestv/migration-planificator --scanner=both --project-path=/workspace/mon-app
|
|
157
78
|
|
|
158
|
-
#
|
|
79
|
+
# Uniquement regles Angular 17→18
|
|
159
80
|
npx @silvestv/migration-planificator --rules=18
|
|
160
81
|
|
|
161
|
-
# Plusieurs versions
|
|
162
|
-
npx @silvestv/migration-planificator --
|
|
82
|
+
# Plusieurs versions
|
|
83
|
+
npx @silvestv/migration-planificator --rules=[18,19,20]
|
|
163
84
|
```
|
|
164
85
|
|
|
165
|
-
###
|
|
86
|
+
### Ouvrir le Rapport
|
|
87
|
+
|
|
166
88
|
```bash
|
|
167
|
-
#
|
|
168
|
-
|
|
169
|
-
npm start -- --scanner=both --project-path=/chemin/vers/projet
|
|
170
|
-
|
|
171
|
-
# Scripts rapports rapides
|
|
172
|
-
npm run report # AST scan + HTML (default)
|
|
173
|
-
npm run report -- --scanner=ast # AST mode only
|
|
174
|
-
npm run report -- --scanner=regex # Regex mode only
|
|
175
|
-
npm run report -- --scanner=both # Comparative AST vs Regex
|
|
89
|
+
open output/index.html # macOS/Linux
|
|
90
|
+
start output/index.html # Windows
|
|
176
91
|
```
|
|
177
92
|
|
|
178
93
|
---
|
|
179
94
|
|
|
180
|
-
## 📊 Contenu Rapport
|
|
181
|
-
|
|
182
|
-
### Page Overview
|
|
183
|
-
- Résumé projet (type, version Angular, compteur apps/libs)
|
|
184
|
-
- Statistiques globales (règles détectées, charge totale)
|
|
185
|
-
- Cards apps/libs avec analyse individuelle
|
|
95
|
+
## 📊 Contenu du Rapport
|
|
186
96
|
|
|
187
|
-
|
|
188
|
-
- **Charts** : Pie (migrations), Bar (top règles), Doughnut (priorités)
|
|
189
|
-
- **Timeline Gantt** : Phases migration séquentielles
|
|
190
|
-
- **Arbre Hiérarchique** : Monorepo → Apps/Libs → Migrations → Priorités → Règles
|
|
191
|
-
- **Édition Temps Réel** : Cliquer estimations pour ajuster, recalcul auto
|
|
192
|
-
- **Filtres** : Niveau risque, catégorie, type règle, recherche texte
|
|
97
|
+
5 fichiers HTML generes dans `output/` :
|
|
193
98
|
|
|
194
|
-
|
|
195
|
-
-
|
|
196
|
-
-
|
|
99
|
+
- **Overview** — Resume projet, stats globales, cards apps/libs
|
|
100
|
+
- **Workload** — Charts (pie, bar, doughnut), timeline Gantt, arbre hierarchique, edition temps reel, filtres
|
|
101
|
+
- **Migration Guide** — Checklist etape par etape par regle
|
|
102
|
+
- **Rules Overview** — Toutes les 119 regles avec statut detection
|
|
103
|
+
- **Delta** *(mode both)* — Comparaison AST vs Regex, analyse divergences
|
|
197
104
|
|
|
198
105
|
---
|
|
199
106
|
|
|
200
|
-
##
|
|
201
|
-
|
|
202
|
-
**119 règles** sur 4 versions :
|
|
203
|
-
|
|
204
|
-
| Migration | Obligatoires | Recommandées | Optionnelles | Total |
|
|
205
|
-
|-----------|--------------|--------------|--------------|-------|
|
|
206
|
-
| **17→18** | 8 | 17 | 0 | 25 |
|
|
207
|
-
| **18→19** | 15 | 13 | 9 | 37 |
|
|
208
|
-
| **19→20** | 6 | 7 | 5 | 18 |
|
|
209
|
-
| **20→21** | 21 | 6 | 12 | 39 |
|
|
210
|
-
|
|
211
|
-
### Catégories
|
|
212
|
-
`environment` (versions Node/TS) • `imports` (modules) • `api` (APIs Angular) • `routing` (Router) • `template` (directives) • `test` (tests) • `ssr` (SSR) • `reactive` (Signals)
|
|
107
|
+
## Vue générale du résultat (page workload)
|
|
213
108
|
|
|
214
|
-
|
|
215
|
-
|
|
109
|
+
<p align="center">
|
|
110
|
+
<img src="https://raw.githubusercontent.com/silvestv/migration-planificator-documentation/master/public/img/migration-page-light.jpg" alt="Workload page" width="600"/>
|
|
111
|
+
</p>
|
|
216
112
|
|
|
217
113
|
---
|
|
218
114
|
|
|
219
|
-
##
|
|
115
|
+
## 🤖 AI Auto-Fix (Experimental)
|
|
220
116
|
|
|
221
|
-
|
|
222
|
-
Vérifier compatibilité JavaScript :
|
|
223
|
-
```bash
|
|
224
|
-
# (?s) non supporté → utiliser [\s\S]*?
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
### Build Échoue
|
|
228
|
-
```bash
|
|
229
|
-
rm -rf dist/
|
|
230
|
-
npm run build
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
### Rapport Vide
|
|
234
|
-
- Vérifier `--project-path` pointe vers racine Angular
|
|
235
|
-
- Vérifier présence `angular.json` ou `nx.json`
|
|
236
|
-
- Support Angular 17, 18, 19, 20, 21
|
|
117
|
+
Generez des prompts structures pour agents IA (Claude CLI / Gemini CLI -> pas recommandé) afin de migrer automatiquement votre code.
|
|
237
118
|
|
|
238
|
-
|
|
119
|
+
> **Recommande** : **Claude Code Opus 4 (CLI)** avec un **depot de petite a moyenne taille** (< 500 fichiers impactes). Experimental — relisez toutes les modifications de l'agent avant de merger.
|
|
239
120
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
**Ce CLI s'exécute entièrement sur votre machine locale.** Il ne **collecte, ne transmet, ni ne stocke** aucune donnée externe. Aucune requête réseau n'est effectuée pendant l'analyse.
|
|
243
|
-
|
|
244
|
-
- ✅ **100% Traitement Local** - Votre code ne quitte jamais votre machine
|
|
245
|
-
- ✅ **Aucune Télémétrie** - Zéro collecte de données ou tracking
|
|
246
|
-
- ✅ **Aucune API Externe** - Analyse AST pure avec bibliothèques locales
|
|
247
|
-
- ✅ **Package Signé** - Signé automatiquement par le registre npm pour vérification d'intégrité
|
|
248
|
-
- ✅ **Auditable** - Inspectez le contenu du package publié à tout moment :
|
|
249
|
-
```bash
|
|
250
|
-
npm pack @silvestv/migration-planificator
|
|
251
|
-
tar -tzf silvestv-migration-planificator-*.tgz
|
|
252
|
-
# Ou visualisez les fichiers directement
|
|
253
|
-
npm view @silvestv/migration-planificator files
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
Pour toute préoccupation de sécurité ou signaler une vulnérabilité, voir [SECURITY.md](https://github.com/silvestv/migration-planificator-documentation/blob/master/SECURITY.md)
|
|
257
|
-
|
|
258
|
-
---
|
|
121
|
+
### Prérequis
|
|
259
122
|
|
|
260
|
-
|
|
123
|
+
- Un IDE (Vscode / Webstorm)
|
|
124
|
+
- Un Claude Code (recommandée) OU Gemini CLI
|
|
125
|
+
- Attention : la migration d'une règle coûte un certain nombre de tokens !
|
|
261
126
|
|
|
262
|
-
|
|
127
|
+
### Commande
|
|
263
128
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
1. **Aller sur** : [GitHub Issues](https://github.com/silvestv/migration-planificator-documentation/issues/new/choose)
|
|
269
|
-
2. **Sélectionner** : Template "Bug Report"
|
|
270
|
-
3. **Remplir** :
|
|
271
|
-
- Description du bug
|
|
272
|
-
- Étapes pour reproduire
|
|
273
|
-
- Comportement attendu vs réel
|
|
274
|
-
- Votre environnement (OS, version Node.js, version Angular)
|
|
275
|
-
- Commande utilisée
|
|
276
|
-
|
|
277
|
-
**Lien direct** : [Signaler un Bug](https://github.com/silvestv/migration-planificator-documentation/issues/new?template=bug_report.md)
|
|
278
|
-
|
|
279
|
-
### ✨ Demander une Fonctionnalité
|
|
280
|
-
|
|
281
|
-
Vous avez une idée d'amélioration ?
|
|
282
|
-
|
|
283
|
-
1. **Aller sur** : [GitHub Issues](https://github.com/silvestv/migration-planificator-documentation/issues/new/choose)
|
|
284
|
-
2. **Sélectionner** : Template "Feature Request"
|
|
285
|
-
3. **Décrire** :
|
|
286
|
-
- Le problème que vous essayez de résoudre
|
|
287
|
-
- Votre solution proposée
|
|
288
|
-
- Cas d'usage et qui en bénéficie
|
|
289
|
-
- Maquettes ou exemples éventuels
|
|
129
|
+
```bash
|
|
130
|
+
npx @silvestv/migration-planificator fix --rule=RULE_KEY --project-path=/chemin/vers/projet
|
|
131
|
+
```
|
|
290
132
|
|
|
291
|
-
|
|
133
|
+
| Option | Description | Defaut |
|
|
134
|
+
|--------|-------------|--------|
|
|
135
|
+
| `--rule=RULE_KEY` | Regle de migration a corriger **(requis)** | — |
|
|
136
|
+
| `--project-path=PATH` | Chemin vers le projet Angular | `.` |
|
|
137
|
+
| `--branch=BRANCH` | Branche de base | `master` |
|
|
138
|
+
| `-y` | Skip confirmation preconditions | `false` |
|
|
139
|
+
| `--skip-validation` | Skip build & tests dans le prompt | `false` |
|
|
292
140
|
|
|
293
|
-
###
|
|
141
|
+
### Sortie
|
|
294
142
|
|
|
295
|
-
|
|
143
|
+
4 fichiers dans `output/ai/migration/{version}/{rule}-prompts/` :
|
|
296
144
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
145
|
+
| Fichier | Role |
|
|
146
|
+
|---------|------|
|
|
147
|
+
| `constitution.md` | Regles absolues de l'agent (securite, qualite, imports) |
|
|
148
|
+
| `context.md` | Description regle + toutes les occurrences (fichier:ligne) |
|
|
149
|
+
| `ledger.json` | Suivi migration (schematic, iterations, blame) |
|
|
150
|
+
| `file-prompt.md` | Instructions completes en 7 phases pour l'agent |
|
|
302
151
|
|
|
303
|
-
|
|
152
|
+
### Utilisation
|
|
304
153
|
|
|
305
|
-
|
|
154
|
+
```bash
|
|
155
|
+
cd /chemin/vers/projet && claude # ou gemini
|
|
156
|
+
> Execute output/ai/migration/19/signal_inputs-prompts/file-prompt.md
|
|
157
|
+
```
|
|
306
158
|
|
|
307
|
-
|
|
159
|
+
L'agent va : verifier preconditions → creer branche → proposer plan → implementer → valider (AST + build + tests) → commit & push.
|
|
308
160
|
|
|
309
|
-
|
|
161
|
+
### Pipeline de l'Agent
|
|
310
162
|
|
|
311
|
-
|
|
163
|
+
<p align="center">
|
|
164
|
+
<img src="https://raw.githubusercontent.com/silvestv/migration-planificator-documentation/master/public/img/autofix-pipeline.jpg" alt="Pipeline Agent AI Auto-Fix" width="600"/>
|
|
165
|
+
</p>
|
|
312
166
|
|
|
313
167
|
---
|
|
314
168
|
|
|
315
|
-
##
|
|
316
|
-
|
|
317
|
-
© 2025 Victor SILVESTRE
|
|
169
|
+
## 📋 Regles Migration
|
|
318
170
|
|
|
319
|
-
|
|
320
|
-
Vous ne pouvez utiliser ce fichier qu'en conformité avec la Licence.
|
|
321
|
-
Vous pouvez obtenir une copie de la Licence à :
|
|
171
|
+
**119 regles** sur 4 versions :
|
|
322
172
|
|
|
323
|
-
|
|
173
|
+
| Migration | Obligatoires | Recommandees | Optionnelles | Total |
|
|
174
|
+
|-----------|--------------|--------------|--------------|-------|
|
|
175
|
+
| **17→18** | 8 | 17 | 0 | 25 |
|
|
176
|
+
| **18→19** | 15 | 13 | 9 | 37 |
|
|
177
|
+
| **19→20** | 6 | 7 | 5 | 18 |
|
|
178
|
+
| **20→21** | 21 | 6 | 12 | 39 |
|
|
324
179
|
|
|
325
|
-
|
|
180
|
+
**Categories** : `environment` • `imports` • `api` • `routing` • `template` • `test` • `ssr` • `reactive` • `signals` • `config`
|
|
326
181
|
|
|
327
|
-
|
|
328
|
-
- ✅ **Modification** - Modifier et distribuer vos propres versions
|
|
329
|
-
- ✅ **Distribution** - Redistribuer les versions originales ou modifiées
|
|
330
|
-
- ✅ **Droits de Brevets** - Inclut une concession explicite des droits de brevet des contributeurs
|
|
331
|
-
- ✅ **Usage Privé** - Utiliser en privé sans aucune obligation
|
|
182
|
+
**Niveaux Risque** : 🔴 Critical • 🟠 High • 🟡 Medium • 🟢 Low
|
|
332
183
|
|
|
333
|
-
|
|
184
|
+
---
|
|
334
185
|
|
|
335
|
-
|
|
336
|
-
- 📝 Inclure le fichier LICENSE
|
|
337
|
-
- 📝 Inclure le fichier NOTICE (si présent)
|
|
338
|
-
- 📝 Indiquer tout changement significatif apporté au code
|
|
186
|
+
## 🔒 Securite
|
|
339
187
|
|
|
340
|
-
|
|
188
|
+
**100% traitement local.** Aucune telemetrie, aucune API externe, vos donnees ne quittent jamais votre machine. Voir [SECURITY.md](https://github.com/silvestv/migration-planificator-documentation/blob/master/SECURITY.md)
|
|
341
189
|
|
|
342
|
-
|
|
343
|
-
distribué sous la Licence est distribué "TEL QUEL",
|
|
344
|
-
SANS GARANTIES OU CONDITIONS D'AUCUNE SORTE, expresses ou implicites.
|
|
345
|
-
Consultez la Licence pour les autorisations et limitations
|
|
346
|
-
spécifiques régissant la Licence.
|
|
190
|
+
---
|
|
347
191
|
|
|
348
|
-
|
|
192
|
+
## 🤝 Support
|
|
349
193
|
|
|
350
|
-
|
|
194
|
+
- 🐛 [Signaler un Bug](https://github.com/silvestv/migration-planificator-documentation/issues/new?template=bug_report.md)
|
|
195
|
+
- ✨ [Demander une Fonctionnalite](https://github.com/silvestv/migration-planificator-documentation/issues/new?template=feature_request.md)
|
|
196
|
+
- ❓ [Poser une Question](https://github.com/silvestv/migration-planificator-documentation/issues/new?template=question.md)
|
|
197
|
+
- 📧 victor.silvestre.dev@gmail.com
|
|
351
198
|
|
|
352
199
|
---
|
|
353
200
|
|
|
354
|
-
##
|
|
355
|
-
|
|
356
|
-
Construit avec **ts-morph** (AST TypeScript), **@angular/compiler** (parsing HTML), **TailwindCSS** (design), **Chart.js** (visualisation)
|
|
201
|
+
## 📝 Licence
|
|
357
202
|
|
|
358
|
-
|
|
203
|
+
© 2025 Victor SILVESTRE — [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0). Libre pour usage commercial. Voir [LICENSE](LICENSE).
|
|
359
204
|
|
|
360
|
-
|
|
205
|
+
Construit avec **ts-morph**, **@angular/compiler**, **TailwindCSS**, **Chart.js**
|
|
361
206
|
|
|
362
207
|
---
|
|
363
208
|
|
package/README.md
CHANGED
|
@@ -1,199 +1,168 @@
|
|
|
1
1
|
# Angular Migration Planner
|
|
2
2
|
|
|
3
|
-
> **
|
|
3
|
+
> **Perform your Angular migrations stress-free with full guidance!**
|
|
4
|
+
>
|
|
5
|
+
> **Professional Angular migration companion tool for version upgrades, Nx monorepo refactoring, and technical debt assessment**
|
|
6
|
+
>
|
|
7
|
+
> **AI-powered migration auto-fix + Angular schematics (experimental)**
|
|
4
8
|
|
|
5
|
-
Plan Angular migrations (17→18, 18→19, 19→20, 20→21) with precision AST analysis, calculate workload estimates, and generate interactive HTML dashboards.
|
|
6
|
-
|
|
7
|
-
[](https://www.npmjs.com/package/@silvestv/migration-planificator)
|
|
8
9
|
[](https://www.npmjs.com/package/@silvestv/migration-planificator)
|
|
9
10
|
[](https://nodejs.org/)
|
|
10
11
|
[](https://www.typescriptlang.org/)
|
|
11
|
-
[](
|
|
12
|
+
[](tests)
|
|
12
13
|
[](https://opensource.org/licenses/Apache-2.0)[](https://www.npmjs.com/package/@silvestv/migration-planificator)
|
|
13
14
|
|
|
14
15
|
**[🇬🇧 English](https://github.com/silvestv/migration-planificator-documentation/blob/master/README.md) | [🇫🇷 Français](https://github.com/silvestv/migration-planificator-documentation/blob/master/README.fr.md)**
|
|
15
16
|
|
|
16
17
|
---
|
|
17
18
|
|
|
18
|
-
For security concerns or to report vulnerabilities, see [SECURITY.md](https://github.com/silvestv/migration-planificator-documentation/blob/master/SECURITY.md)
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
19
|
## 🎯 What Is This?
|
|
23
20
|
|
|
24
|
-
A
|
|
21
|
+
A complete **Angular migration analysis (AST)** AND **AI-assisted migration** tool for:
|
|
25
22
|
|
|
26
|
-
- 🔄 **Angular
|
|
27
|
-
- 🏢 **Nx Monorepo
|
|
28
|
-
- 📊 **Technical Debt
|
|
29
|
-
- 💰 **Workload Estimation
|
|
30
|
-
- 🎨 **Code Modernization
|
|
23
|
+
- 🔄 **Angular Migrations** — Plan migrations 17→18, 18→19, 19→20, 20→21 with precise estimates
|
|
24
|
+
- 🏢 **Nx Monorepo** — Analyze multi-app/lib workspaces with per-target breakdown
|
|
25
|
+
- 📊 **Technical Debt** — Identify deprecated APIs, anti-patterns, modernization opportunities
|
|
26
|
+
- 💰 **Workload Estimation** — Calculate time (days/hours/minutes) by priority and risk level
|
|
27
|
+
- 🎨 **Code Modernization** — Detect Signals, Control Flow, Standalone Components opportunities
|
|
31
28
|
|
|
32
|
-
Perfect for **
|
|
29
|
+
Perfect for **technical teams** and **tech leads** planning Angular upgrades or refactoring.
|
|
30
|
+
|
|
31
|
+
📸 [See the result](#workload-page-overview-workload-page) | 🤖 [AI Auto-Fix](#-ai-auto-fix-experimental)
|
|
33
32
|
|
|
34
33
|
---
|
|
35
34
|
|
|
36
35
|
## 🏆 Why Choose This Tool?
|
|
37
36
|
|
|
38
|
-
Unlike simple regex
|
|
37
|
+
Unlike simple regex scanners or manual audits:
|
|
39
38
|
|
|
40
|
-
- ✅ **88% AST Coverage
|
|
41
|
-
- ✅ **Cross-File Intelligence
|
|
42
|
-
- ✅ **Production-Ready
|
|
43
|
-
- ✅ **Time
|
|
44
|
-
- ✅ **Zero Dependencies
|
|
39
|
+
- ✅ **88% AST Coverage** — Context-aware detection eliminates false positives (ignores comments, strings, migrated code)
|
|
40
|
+
- ✅ **Cross-File Intelligence** — Connects TypeScript ↔ HTML templates (detects `@Component` + `<router-outlet>` patterns)
|
|
41
|
+
- ✅ **Production-Ready** — 748 tests passing, TypeScript strict mode, optimized batch processing
|
|
42
|
+
- ✅ **Time Savings** — Auto workload calculation + Gantt timeline = instant migration roadmap
|
|
43
|
+
- ✅ **Zero Dependencies** — Pure AST analysis with ts-morph + @angular/compiler (no external APIs)
|
|
45
44
|
|
|
46
45
|
---
|
|
47
46
|
|
|
48
|
-
##
|
|
49
|
-
|
|
50
|
-
- **AST Precision**: Context-aware detection via ts-morph + @angular/compiler (88% rule coverage)
|
|
51
|
-
- **Interactive Dashboard**: HTML report with charts, Gantt timeline, real-time workload editing
|
|
52
|
-
- **3 Scan Modes**: AST (precise), Regex (fast), Both (comparative with delta analysis)
|
|
53
|
-
- **119 Migration Rules**: Covering breaking changes, deprecations, best practices (to18, to19, to20, to21)
|
|
54
|
-
- **Cross-File Analysis**: TypeScript ↔ HTML template detection
|
|
55
|
-
- **Multi-Project**: Nx Monorepo and Angular Standalone support
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
## 🎓 Use Cases
|
|
47
|
+
## 🚀 Quick Start
|
|
60
48
|
|
|
61
|
-
### Angular Version Migration
|
|
62
|
-
Upgrade Angular 17→21 with comprehensive change list and time estimates:
|
|
63
49
|
```bash
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
**Output**: All required changes, time breakdown, risk assessment, interactive planner
|
|
50
|
+
# Navigate to your project
|
|
51
|
+
cd path-to-my-project # (if local install)
|
|
67
52
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
npx @silvestv/migration-planificator --scanner=both --project-path=/path/to/nx-workspace
|
|
72
|
-
```
|
|
73
|
-
**Output**: Per-app/lib breakdown, shared dependencies impact, Gantt timeline
|
|
53
|
+
# Install
|
|
54
|
+
npm install -D @silvestv/migration-planificator
|
|
55
|
+
npm install -g @silvestv/migration-planificator
|
|
74
56
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
npx @silvestv/migration-planificator --scanner=ast --rules=[18,19,20]
|
|
57
|
+
# Run directly
|
|
58
|
+
npx @silvestv/migration-planificator
|
|
59
|
+
npx @silvestv/migration-planificator --project-path=path-to-my-project
|
|
79
60
|
```
|
|
80
|
-
**Output**: Deprecated patterns (*ngIf, @Input()), modernization opportunities, file tracking
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## 🚀 Quick Start
|
|
85
61
|
|
|
86
|
-
###
|
|
62
|
+
### CLI Options
|
|
87
63
|
|
|
88
|
-
#### Via npm (Recommended)
|
|
89
64
|
```bash
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
65
|
+
--scanner=<mode> ast | regex | both [default: ast]
|
|
66
|
+
--project-path=<path> Path to Angular project [default: .]
|
|
67
|
+
--rules=<versions> 18 | [18,19] | all [default: all]
|
|
93
68
|
```
|
|
94
69
|
|
|
95
|
-
|
|
96
|
-
```bash
|
|
97
|
-
git clone <repository-url>
|
|
98
|
-
cd migration-planificator
|
|
99
|
-
npm install
|
|
100
|
-
npm run build
|
|
101
|
-
```
|
|
70
|
+
### Examples
|
|
102
71
|
|
|
103
|
-
### Generate First Report
|
|
104
72
|
```bash
|
|
105
|
-
#
|
|
73
|
+
# Scan current directory (AST, all rules)
|
|
106
74
|
npx @silvestv/migration-planificator
|
|
107
75
|
|
|
108
|
-
#
|
|
109
|
-
npx @silvestv/migration-planificator --scanner=both --project-path=/
|
|
76
|
+
# Comparative scan on Nx workspace
|
|
77
|
+
npx @silvestv/migration-planificator --scanner=both --project-path=/workspace/my-app
|
|
110
78
|
|
|
111
|
-
#
|
|
112
|
-
npx @silvestv/migration-planificator --rules=18
|
|
113
|
-
npx @silvestv/migration-planificator --rules=[18,19] # Angular 17→19
|
|
79
|
+
# Only Angular 17→18 rules
|
|
80
|
+
npx @silvestv/migration-planificator --rules=18
|
|
114
81
|
|
|
115
|
-
#
|
|
116
|
-
migration-planificator --
|
|
82
|
+
# Multiple versions
|
|
83
|
+
npx @silvestv/migration-planificator --rules=[18,19,20]
|
|
117
84
|
```
|
|
118
85
|
|
|
119
86
|
### Open Report
|
|
87
|
+
|
|
120
88
|
```bash
|
|
121
|
-
open output/index.html
|
|
122
|
-
start output/index.html
|
|
89
|
+
open output/index.html # macOS/Linux
|
|
90
|
+
start output/index.html # Windows
|
|
123
91
|
```
|
|
124
92
|
|
|
125
93
|
---
|
|
126
94
|
|
|
127
|
-
##
|
|
95
|
+
## 📊 Report Contents
|
|
128
96
|
|
|
129
|
-
|
|
97
|
+
5 HTML files generated in `output/` :
|
|
130
98
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
99
|
+
- **Overview** — Project summary, global stats, apps/libs cards
|
|
100
|
+
- **Workload** — Charts (pie, bar, doughnut), Gantt timeline, hierarchy tree, real-time editing, filters
|
|
101
|
+
- **Migration Guide** — Step-by-step checklist per rule
|
|
102
|
+
- **Rules Overview** — All 119 rules with detection status
|
|
103
|
+
- **Delta** *(both mode)* — AST vs Regex comparison, divergence analysis
|
|
134
104
|
|
|
135
|
-
|
|
136
|
-
npx @silvestv/migration-planificator --scanner=both --project-path=/path/to/project --rules=all
|
|
105
|
+
---
|
|
137
106
|
|
|
138
|
-
|
|
139
|
-
npm install -g @silvestv/migration-planificator
|
|
140
|
-
migration-planificator --scanner=ast --project-path=./my-angular-app
|
|
141
|
-
```
|
|
107
|
+
## Workload page overview (workload page)
|
|
142
108
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
--project-path=<path> Path to Angular project [default: current directory]
|
|
147
|
-
--rules=<versions> 18 | [18,19] | all [default: all]
|
|
148
|
-
```
|
|
109
|
+
<p align="center">
|
|
110
|
+
<img src="https://raw.githubusercontent.com/silvestv/migration-planificator-documentation/master/public/img/migration-page-light.jpg" alt="Workload page" width="600"/>
|
|
111
|
+
</p>
|
|
149
112
|
|
|
150
|
-
|
|
151
|
-
```bash
|
|
152
|
-
# Scan current directory with AST
|
|
153
|
-
npx @silvestv/migration-planificator
|
|
113
|
+
---
|
|
154
114
|
|
|
155
|
-
|
|
156
|
-
npx @silvestv/migration-planificator --scanner=both --project-path=/workspace/my-app
|
|
115
|
+
## 🤖 AI Auto-Fix (Experimental)
|
|
157
116
|
|
|
158
|
-
|
|
159
|
-
npx @silvestv/migration-planificator --rules=18
|
|
117
|
+
Generate structured prompts for AI agents (Claude CLI / Gemini CLI -> not recommended) to automatically migrate your code.
|
|
160
118
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
119
|
+
> **Recommended**: **Claude Code Opus 4 (CLI)** with a **small-to-medium repository** (< 500 files impacted). Experimental — review all agent changes before merging.
|
|
120
|
+
|
|
121
|
+
### Prerequisites
|
|
122
|
+
|
|
123
|
+
- An IDE (VSCode / WebStorm)
|
|
124
|
+
- Claude Code (recommended) OR Gemini CLI
|
|
125
|
+
- Note: migrating a rule costs a certain number of tokens!
|
|
126
|
+
|
|
127
|
+
### Command
|
|
164
128
|
|
|
165
|
-
### For Development (from cloned repository)
|
|
166
129
|
```bash
|
|
167
|
-
|
|
168
|
-
npm run build
|
|
169
|
-
npm start -- --scanner=both --project-path=/path/to/project
|
|
170
|
-
|
|
171
|
-
# Quick report scripts
|
|
172
|
-
npm run report # AST scan + HTML (default)
|
|
173
|
-
npm run report -- --scanner=ast # AST mode only
|
|
174
|
-
npm run report -- --scanner=regex # Regex mode only
|
|
175
|
-
npm run report -- --scanner=both # Comparative AST vs Regex
|
|
130
|
+
npx @silvestv/migration-planificator fix --rule=RULE_KEY --project-path=/path/to/project
|
|
176
131
|
```
|
|
177
132
|
|
|
178
|
-
|
|
133
|
+
| Option | Description | Default |
|
|
134
|
+
|--------|-------------|---------|
|
|
135
|
+
| `--rule=RULE_KEY` | Migration rule to fix **(required)** | — |
|
|
136
|
+
| `--project-path=PATH` | Path to Angular project | `.` |
|
|
137
|
+
| `--branch=BRANCH` | Base branch | `master` |
|
|
138
|
+
| `-y` | Skip precondition confirmation | `false` |
|
|
139
|
+
| `--skip-validation` | Skip build & tests in prompt | `false` |
|
|
179
140
|
|
|
180
|
-
|
|
141
|
+
### Output
|
|
181
142
|
|
|
182
|
-
|
|
183
|
-
- Project summary (type, Angular version, apps/libs count)
|
|
184
|
-
- Global statistics (rules detected, total workload)
|
|
185
|
-
- Apps/libs cards with individual analysis
|
|
143
|
+
4 files in `output/ai/migration/{version}/{rule}-prompts/` :
|
|
186
144
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
-
|
|
145
|
+
| File | Purpose |
|
|
146
|
+
|------|---------|
|
|
147
|
+
| `constitution.md` | Absolute agent rules (safety, quality, imports) |
|
|
148
|
+
| `context.md` | Rule description + all occurrences (file:line) |
|
|
149
|
+
| `ledger.json` | Migration tracking (schematic, iterations, blame) |
|
|
150
|
+
| `file-prompt.md` | Complete 7-phase instructions for the agent |
|
|
193
151
|
|
|
194
|
-
###
|
|
195
|
-
|
|
196
|
-
|
|
152
|
+
### Usage
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
cd /path/to/project && claude # or gemini
|
|
156
|
+
> Execute output/ai/migration/19/signal_inputs-prompts/file-prompt.md
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
The agent will: check preconditions → create branch → propose plan → implement → validate (AST + build + tests) → commit & push.
|
|
160
|
+
|
|
161
|
+
### Agent Pipeline
|
|
162
|
+
|
|
163
|
+
<p align="center">
|
|
164
|
+
<img src="https://raw.githubusercontent.com/silvestv/migration-planificator-documentation/master/public/img/autofix-pipeline.jpg" alt="AI Auto-Fix Agent Pipeline" width="600"/>
|
|
165
|
+
</p>
|
|
197
166
|
|
|
198
167
|
---
|
|
199
168
|
|
|
@@ -208,155 +177,32 @@ npm run report -- --scanner=both # Comparative AST vs Regex
|
|
|
208
177
|
| **19→20** | 6 | 7 | 5 | 18 |
|
|
209
178
|
| **20→21** | 21 | 6 | 12 | 39 |
|
|
210
179
|
|
|
211
|
-
|
|
212
|
-
`environment` (Node/TS versions) • `imports` (modules) • `api` (Angular APIs) • `routing` (Router) • `template` (directives) • `test` (testing) • `ssr` (SSR) • `reactive` (Signals)
|
|
180
|
+
**Categories**: `environment` • `imports` • `api` • `routing` • `template` • `test` • `ssr` • `reactive` • `signals` • `config`
|
|
213
181
|
|
|
214
|
-
|
|
215
|
-
🔴 **Critical** (breaking changes) • 🟠 **High** (major deprecations) • 🟡 **Medium** (improvements) • 🟢 **Low** (optimizations)
|
|
182
|
+
**Risk Levels**: 🔴 Critical • 🟠 High • 🟡 Medium • 🟢 Low
|
|
216
183
|
|
|
217
184
|
---
|
|
218
185
|
|
|
219
|
-
##
|
|
186
|
+
## 🔒 Security
|
|
220
187
|
|
|
221
|
-
|
|
222
|
-
Ensure JavaScript compatibility:
|
|
223
|
-
```bash
|
|
224
|
-
# (?s) not supported → use [\s\S]*?
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
### Build Fails
|
|
228
|
-
```bash
|
|
229
|
-
rm -rf dist/
|
|
230
|
-
npm run build
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
### Empty Report
|
|
234
|
-
- Verify `--project-path` points to Angular root
|
|
235
|
-
- Check `angular.json` or `nx.json` exists
|
|
236
|
-
- Supports Angular 17, 18, 19, 20, 21
|
|
188
|
+
**100% local processing.** No telemetry, no external APIs, no data leaves your machine. See [SECURITY.md](https://github.com/silvestv/migration-planificator-documentation/blob/master/SECURITY.md)
|
|
237
189
|
|
|
238
190
|
---
|
|
239
191
|
|
|
240
|
-
##
|
|
241
|
-
|
|
242
|
-
**This CLI runs entirely on your local machine.** It does **not collect, transmit, or store** any data externally. No network requests are made during analysis.
|
|
192
|
+
## 🤝 Support
|
|
243
193
|
|
|
244
|
-
-
|
|
245
|
-
-
|
|
246
|
-
-
|
|
247
|
-
-
|
|
248
|
-
- ✅ **Auditable** - Inspect published package contents anytime:
|
|
249
|
-
```bash
|
|
250
|
-
npm pack @silvestv/migration-planificator
|
|
251
|
-
tar -tzf silvestv-migration-planificator-*.tgz
|
|
252
|
-
# Or view files directly
|
|
253
|
-
npm view @silvestv/migration-planificator files
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
For security concerns or to report vulnerabilities, see [SECURITY.md](https://github.com/silvestv/migration-planificator-documentation/blob/master/SECURITY.md)
|
|
194
|
+
- 🐛 [Report a Bug](https://github.com/silvestv/migration-planificator-documentation/issues/new?template=bug_report.md)
|
|
195
|
+
- ✨ [Request a Feature](https://github.com/silvestv/migration-planificator-documentation/issues/new?template=feature_request.md)
|
|
196
|
+
- ❓ [Ask a Question](https://github.com/silvestv/migration-planificator-documentation/issues/new?template=question.md)
|
|
197
|
+
- 📧 victor.silvestre.dev@gmail.com
|
|
257
198
|
|
|
258
199
|
---
|
|
259
200
|
|
|
260
|
-
## 🤝 Contributing & Support
|
|
261
|
-
|
|
262
|
-
This project is licensed under **Apache License 2.0** - free for commercial and open-source use.
|
|
263
|
-
|
|
264
|
-
### 🐛 Report a Bug
|
|
265
|
-
|
|
266
|
-
Found a bug? Please report it via GitHub Issues:
|
|
267
|
-
|
|
268
|
-
1. **Go to**: [GitHub Issues](https://github.com/silvestv/migration-planificator-documentation/issues/new/choose)
|
|
269
|
-
2. **Select**: "Bug Report" template
|
|
270
|
-
3. **Fill in**:
|
|
271
|
-
- Bug description
|
|
272
|
-
- Steps to reproduce
|
|
273
|
-
- Expected vs actual behavior
|
|
274
|
-
- Your environment (OS, Node.js version, Angular version)
|
|
275
|
-
- Command used
|
|
276
|
-
|
|
277
|
-
**Quick link**: [Report a Bug](https://github.com/silvestv/migration-planificator-documentation/issues/new?template=bug_report.md)
|
|
278
|
-
|
|
279
|
-
### ✨ Request a Feature
|
|
280
|
-
|
|
281
|
-
Have an idea for improvement?
|
|
282
|
-
|
|
283
|
-
1. **Go to**: [GitHub Issues](https://github.com/silvestv/migration-planificator-documentation/issues/new/choose)
|
|
284
|
-
2. **Select**: "Feature Request" template
|
|
285
|
-
3. **Describe**:
|
|
286
|
-
- The problem you're trying to solve
|
|
287
|
-
- Your proposed solution
|
|
288
|
-
- Use case and who benefits
|
|
289
|
-
- Any mockups or examples
|
|
290
|
-
|
|
291
|
-
**Quick link**: [Request a Feature](https://github.com/silvestv/migration-planificator-documentation/issues/new?template=feature_request.md)
|
|
292
|
-
|
|
293
|
-
### ❓ Ask a Question
|
|
294
|
-
|
|
295
|
-
Need help or have questions?
|
|
296
|
-
|
|
297
|
-
1. **Go to**: [GitHub Issues](https://github.com/silvestv/migration-planificator-documentation/issues/new/choose)
|
|
298
|
-
2. **Select**: "Question" template
|
|
299
|
-
3. **Check first**:
|
|
300
|
-
- [FAQ](https://github.com/silvestv/migration-planificator-documentation/blob/master/FAQ.md)
|
|
301
|
-
- [Troubleshooting Guide](https://github.com/silvestv/migration-planificator-documentation/blob/master/TROUBLESHOOTING.md)
|
|
302
|
-
|
|
303
|
-
**Quick link**: [Ask a Question](https://github.com/silvestv/migration-planificator-documentation/issues/new?template=question.md)
|
|
304
|
-
|
|
305
|
-
### 📧 Direct Contact
|
|
306
|
-
|
|
307
|
-
For urgent issues, security concerns, or commercial inquiries:
|
|
308
|
-
|
|
309
|
-
📧 **Email**: victor.silvestre.dev@gmail.com
|
|
310
|
-
|
|
311
|
-
**Enterprise users**: Contact us for commercial licensing, priority support, and custom features.
|
|
312
|
-
|
|
313
|
-
---
|
|
314
201
|
## 📝 License
|
|
315
202
|
|
|
316
|
-
© 2025 Victor SILVESTRE
|
|
317
|
-
|
|
318
|
-
Licensed under the **Apache License, Version 2.0** (the "License").
|
|
319
|
-
You may not use this file except in compliance with the License.
|
|
320
|
-
You may obtain a copy of the License at:
|
|
321
|
-
|
|
322
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
|
323
|
-
|
|
324
|
-
### Key Terms
|
|
325
|
-
|
|
326
|
-
- ✅ **Commercial Use** - Freely use for any purpose including commercial
|
|
327
|
-
- ✅ **Modification** - Modify and distribute your own versions
|
|
328
|
-
- ✅ **Distribution** - Redistribute the original or modified versions
|
|
329
|
-
- ✅ **Patent Grant** - Includes express grant of patent rights from contributors
|
|
330
|
-
- ✅ **Private Use** - Use privately without any obligations
|
|
331
|
-
|
|
332
|
-
### Requirements
|
|
333
|
-
|
|
334
|
-
When distributing or modifying:
|
|
335
|
-
- 📝 Include the LICENSE file
|
|
336
|
-
- 📝 Include the NOTICE file (if present)
|
|
337
|
-
- 📝 State any significant changes made to the code
|
|
338
|
-
|
|
339
|
-
### Disclaimer
|
|
340
|
-
|
|
341
|
-
Unless required by applicable law or agreed to in writing, software
|
|
342
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
|
343
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
344
|
-
See the License for the specific language governing permissions and
|
|
345
|
-
limitations under the License.
|
|
346
|
-
|
|
347
|
-
See [LICENSE](LICENSE) for the full license text.
|
|
348
|
-
|
|
349
|
-
📧 **Contact**: victor.silvestre.dev@gmail.com
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
## 🙏 Acknowledgments
|
|
354
|
-
|
|
355
|
-
Built with **ts-morph** (TypeScript AST), **@angular/compiler** (HTML parsing), **TailwindCSS** (design), **Chart.js** (visualization)
|
|
356
|
-
|
|
357
|
-
---
|
|
203
|
+
© 2025 Victor SILVESTRE — [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0). Free for commercial use. See [LICENSE](LICENSE).
|
|
358
204
|
|
|
359
|
-
|
|
205
|
+
Built with **ts-morph**, **@angular/compiler**, **TailwindCSS**, **Chart.js**
|
|
360
206
|
|
|
361
207
|
---
|
|
362
208
|
|
|
@@ -174,7 +174,6 @@ function parseFixArgs(args) {
|
|
|
174
174
|
let skipPreconditions = false;
|
|
175
175
|
let skipBuild = false;
|
|
176
176
|
let skipTests = false;
|
|
177
|
-
console.log(process.env.npm_config_skiptests);
|
|
178
177
|
// 1. D'abord, lire les variables d'environnement npm_config_* (npm v11+)
|
|
179
178
|
const envRule = process.env.npm_config_rule;
|
|
180
179
|
const envProjectPath = process.env.npm_config_project_path;
|
|
@@ -254,7 +253,6 @@ function parseFixArgs(args) {
|
|
|
254
253
|
*/
|
|
255
254
|
async function runFixCommand(args) {
|
|
256
255
|
const options = parseFixArgs(args);
|
|
257
|
-
console.log('OPTIOns : ', options);
|
|
258
256
|
// 0. Confirmation des préconditions (sauf si --skip-preconditions ou -y)
|
|
259
257
|
if (!options.skipPreconditions) {
|
|
260
258
|
const confirmed = await confirmPreconditions(options.projectPath, options);
|
|
@@ -345,7 +345,7 @@ git add .
|
|
|
345
345
|
git commit -m "fix(migration): ${params.ruleKey} - ${params.ruleSummary}
|
|
346
346
|
|
|
347
347
|
Strategy: ${hasSchematic ? 'Schematic + Agent Delta' : 'Agent Only'}
|
|
348
|
-
Validation: ${params.skipBuild ? 'Build' : 'Build'} | ${params.skipTests ? 'Tests' : 'Tests'}
|
|
348
|
+
Validation: ${params.skipBuild ? 'Build ⏭️' : 'Build ✅'} | ${params.skipTests ? 'Tests ⏭️' : 'Tests ✅'}
|
|
349
349
|
|
|
350
350
|
Ledger Summary:
|
|
351
351
|
- Schematic files: [nombre depuis ledger.schematic.files_modified]
|
package/dist/styles.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! tailwindcss v4.1.14 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-100:oklch(93.6% .032 17.717);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-orange-50:oklch(98% .016 73.684);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-800:oklch(47.3% .137 46.201);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-teal-50:oklch(98.4% .014 180.72);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-teal-700:oklch(51.1% .096 186.391);--color-teal-800:oklch(43.7% .078 188.216);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-600:oklch(60.9% .126 221.723);--color-cyan-800:oklch(45% .085 224.283);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-900:oklch(35.9% .144 278.697);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-600:oklch(54.1% .281 293.009);--color-violet-700:oklch(49.1% .27 292.581);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-800:oklch(43.8% .218 303.724);--color-purple-900:oklch(38.1% .176 304.987);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-100:oklch(94.8% .028 342.258);--color-pink-500:oklch(65.6% .241 354.308);--color-pink-600:oklch(59.2% .249 .584);--color-pink-700:oklch(52.5% .223 3.958);--color-pink-900:oklch(40.8% .153 2.432);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-4xl:56rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-4{top:calc(var(--spacing)*4)}.right-0{right:calc(var(--spacing)*0)}.right-4{right:calc(var(--spacing)*4)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-4{bottom:calc(var(--spacing)*4)}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-12{margin-top:calc(var(--spacing)*12)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-1\.5{margin-right:calc(var(--spacing)*1.5)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-3{margin-right:calc(var(--spacing)*3)}.mr-4{margin-right:calc(var(--spacing)*4)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.mb-12{margin-bottom:calc(var(--spacing)*12)}.ml-0{margin-left:calc(var(--spacing)*0)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-6{margin-left:calc(var(--spacing)*6)}.ml-8{margin-left:calc(var(--spacing)*8)}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-16{height:calc(var(--spacing)*16)}.h-full{height:100%}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-screen{min-height:100vh}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-14{width:calc(var(--spacing)*14)}.w-16{width:calc(var(--spacing)*16)}.w-48{width:calc(var(--spacing)*48)}.w-64{width:calc(var(--spacing)*64)}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-32{max-width:calc(var(--spacing)*32)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-16{min-width:calc(var(--spacing)*16)}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.rounded-b-xl{border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-amber-500{border-color:var(--color-amber-500)}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-500{border-color:var(--color-blue-500)}.border-blue-600{border-color:var(--color-blue-600)}.border-cyan-400{border-color:var(--color-cyan-400)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-700{border-color:var(--color-gray-700)}.border-green-500{border-color:var(--color-green-500)}.border-indigo-500{border-color:var(--color-indigo-500)}.border-purple-200{border-color:var(--color-purple-200)}.border-purple-500{border-color:var(--color-purple-500)}.border-teal-400{border-color:var(--color-teal-400)}.border-transparent{border-color:#0000}.border-yellow-400{border-color:var(--color-yellow-400)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-black{background-color:var(--color-black)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-cyan-50{background-color:var(--color-cyan-50)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-600{background-color:var(--color-gray-600)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-600{background-color:var(--color-green-600)}.bg-indigo-50{background-color:var(--color-indigo-50)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-orange-50{background-color:var(--color-orange-50)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-pink-50{background-color:var(--color-pink-50)}.bg-pink-100{background-color:var(--color-pink-100)}.bg-purple-50{background-color:var(--color-purple-50)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-purple-600{background-color:var(--color-purple-600)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-teal-50{background-color:var(--color-teal-50)}.bg-violet-50{background-color:var(--color-violet-50)}.bg-white{background-color:var(--color-white)}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-blue-50{--tw-gradient-from:var(--color-blue-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-600{--tw-gradient-from:var(--color-blue-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-500{--tw-gradient-from:var(--color-green-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-50{--tw-gradient-from:var(--color-indigo-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-500{--tw-gradient-from:var(--color-orange-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-50{--tw-gradient-from:var(--color-pink-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-50{--tw-gradient-from:var(--color-purple-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-600{--tw-gradient-from:var(--color-purple-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-500{--tw-gradient-from:var(--color-red-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-500{--tw-gradient-from:var(--color-yellow-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-50{--tw-gradient-to:var(--color-blue-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-100{--tw-gradient-to:var(--color-blue-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-green-600{--tw-gradient-to:var(--color-green-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-indigo-50{--tw-gradient-to:var(--color-indigo-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-indigo-100{--tw-gradient-to:var(--color-indigo-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-indigo-600{--tw-gradient-to:var(--color-indigo-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-indigo-700{--tw-gradient-to:var(--color-indigo-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-orange-600{--tw-gradient-to:var(--color-orange-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-pink-100{--tw-gradient-to:var(--color-pink-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-100{--tw-gradient-to:var(--color-purple-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-600{--tw-gradient-to:var(--color-red-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-yellow-600{--tw-gradient-to:var(--color-yellow-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-6{padding-top:calc(var(--spacing)*6)}.pl-4{padding-left:calc(var(--spacing)*4)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-800{color:var(--color-amber-800)}.text-blue-100{color:var(--color-blue-100)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-blue-900{color:var(--color-blue-900)}.text-cyan-600{color:var(--color-cyan-600)}.text-cyan-800{color:var(--color-cyan-800)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-100{color:var(--color-green-100)}.text-green-400{color:var(--color-green-400)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-indigo-600{color:var(--color-indigo-600)}.text-indigo-700{color:var(--color-indigo-700)}.text-indigo-900{color:var(--color-indigo-900)}.text-orange-100{color:var(--color-orange-100)}.text-orange-600{color:var(--color-orange-600)}.text-orange-700{color:var(--color-orange-700)}.text-pink-600{color:var(--color-pink-600)}.text-pink-700{color:var(--color-pink-700)}.text-pink-900{color:var(--color-pink-900)}.text-purple-100{color:var(--color-purple-100)}.text-purple-600{color:var(--color-purple-600)}.text-purple-700{color:var(--color-purple-700)}.text-purple-800{color:var(--color-purple-800)}.text-purple-900{color:var(--color-purple-900)}.text-red-100{color:var(--color-red-100)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-teal-600{color:var(--color-teal-600)}.text-teal-700{color:var(--color-teal-700)}.text-teal-800{color:var(--color-teal-800)}.text-transparent{color:#0000}.text-violet-600{color:var(--color-violet-600)}.text-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.text-yellow-100{color:var(--color-yellow-100)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline{text-decoration-line:underline}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:text-blue-600:is(:where(.group):hover *){color:var(--color-blue-600)}.group-hover\:text-green-600:is(:where(.group):hover *){color:var(--color-green-600)}.group-hover\:text-orange-600:is(:where(.group):hover *){color:var(--color-orange-600)}.group-hover\:text-pink-600:is(:where(.group):hover *){color:var(--color-pink-600)}.group-hover\:text-purple-600:is(:where(.group):hover *){color:var(--color-purple-600)}.group-hover\:text-red-600:is(:where(.group):hover *){color:var(--color-red-600)}.group-hover\:text-teal-600:is(:where(.group):hover *){color:var(--color-teal-600)}.group-hover\:text-yellow-600:is(:where(.group):hover *){color:var(--color-yellow-600)}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:bg-blue-50:hover{background-color:var(--color-blue-50)}.hover\:bg-blue-100:hover{background-color:var(--color-blue-100)}.hover\:bg-blue-200:hover{background-color:var(--color-blue-200)}.hover\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-gray-300:hover{background-color:var(--color-gray-300)}.hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-green-700:hover{background-color:var(--color-green-700)}.hover\:bg-purple-50:hover{background-color:var(--color-purple-50)}.hover\:bg-purple-200:hover{background-color:var(--color-purple-200)}.hover\:bg-purple-600:hover{background-color:var(--color-purple-600)}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-blue-800:hover{color:var(--color-blue-800)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-800:hover{color:var(--color-gray-800)}.hover\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:border-transparent:focus{border-color:#0000}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:ring-blue-600:focus{--tw-ring-color:var(--color-blue-600)}.focus\:ring-green-500:focus{--tw-ring-color:var(--color-green-500)}.focus\:ring-orange-500:focus{--tw-ring-color:var(--color-orange-500)}.focus\:ring-pink-500:focus{--tw-ring-color:var(--color-pink-500)}.focus\:ring-purple-500:focus{--tw-ring-color:var(--color-purple-500)}.focus\:ring-red-500:focus{--tw-ring-color:var(--color-red-500)}.focus\:ring-teal-500:focus{--tw-ring-color:var(--color-teal-500)}.focus\:ring-yellow-500:focus{--tw-ring-color:var(--color-yellow-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}@media (min-width:48rem){.md\:col-span-4{grid-column:span 4/span 4}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}}.filter-highlight{transition:box-shadow .3s ease-in-out;box-shadow:0 0 0 4px #3b82f680,0 0 20px #3b82f64d}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-100:oklch(93.6% .032 17.717);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-orange-50:oklch(98% .016 73.684);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-800:oklch(47.3% .137 46.201);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-teal-50:oklch(98.4% .014 180.72);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-teal-700:oklch(51.1% .096 186.391);--color-teal-800:oklch(43.7% .078 188.216);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-600:oklch(60.9% .126 221.723);--color-cyan-800:oklch(45% .085 224.283);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-900:oklch(35.9% .144 278.697);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-600:oklch(54.1% .281 293.009);--color-violet-700:oklch(49.1% .27 292.581);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-800:oklch(43.8% .218 303.724);--color-purple-900:oklch(38.1% .176 304.987);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-100:oklch(94.8% .028 342.258);--color-pink-500:oklch(65.6% .241 354.308);--color-pink-600:oklch(59.2% .249 .584);--color-pink-700:oklch(52.5% .223 3.958);--color-pink-900:oklch(40.8% .153 2.432);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-4xl:56rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-4{top:calc(var(--spacing)*4)}.right-0{right:calc(var(--spacing)*0)}.right-4{right:calc(var(--spacing)*4)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-4{bottom:calc(var(--spacing)*4)}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-12{margin-top:calc(var(--spacing)*12)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-1\.5{margin-right:calc(var(--spacing)*1.5)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-3{margin-right:calc(var(--spacing)*3)}.mr-4{margin-right:calc(var(--spacing)*4)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.mb-12{margin-bottom:calc(var(--spacing)*12)}.ml-0{margin-left:calc(var(--spacing)*0)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-6{margin-left:calc(var(--spacing)*6)}.ml-8{margin-left:calc(var(--spacing)*8)}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-16{height:calc(var(--spacing)*16)}.h-full{height:100%}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-screen{min-height:100vh}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-14{width:calc(var(--spacing)*14)}.w-16{width:calc(var(--spacing)*16)}.w-48{width:calc(var(--spacing)*48)}.w-64{width:calc(var(--spacing)*64)}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-32{max-width:calc(var(--spacing)*32)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-16{min-width:calc(var(--spacing)*16)}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.rounded-b-xl{border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-amber-500{border-color:var(--color-amber-500)}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-500{border-color:var(--color-blue-500)}.border-blue-600{border-color:var(--color-blue-600)}.border-cyan-400{border-color:var(--color-cyan-400)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-700{border-color:var(--color-gray-700)}.border-green-500{border-color:var(--color-green-500)}.border-indigo-500{border-color:var(--color-indigo-500)}.border-purple-200{border-color:var(--color-purple-200)}.border-purple-500{border-color:var(--color-purple-500)}.border-teal-400{border-color:var(--color-teal-400)}.border-transparent{border-color:#0000}.border-yellow-400{border-color:var(--color-yellow-400)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-black{background-color:var(--color-black)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-cyan-50{background-color:var(--color-cyan-50)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-600{background-color:var(--color-gray-600)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-600{background-color:var(--color-green-600)}.bg-indigo-50{background-color:var(--color-indigo-50)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-orange-50{background-color:var(--color-orange-50)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-pink-50{background-color:var(--color-pink-50)}.bg-pink-100{background-color:var(--color-pink-100)}.bg-purple-50{background-color:var(--color-purple-50)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-purple-600{background-color:var(--color-purple-600)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-teal-50{background-color:var(--color-teal-50)}.bg-violet-50{background-color:var(--color-violet-50)}.bg-white{background-color:var(--color-white)}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-blue-50{--tw-gradient-from:var(--color-blue-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-600{--tw-gradient-from:var(--color-blue-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-500{--tw-gradient-from:var(--color-green-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-50{--tw-gradient-from:var(--color-indigo-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-500{--tw-gradient-from:var(--color-orange-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-50{--tw-gradient-from:var(--color-pink-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-50{--tw-gradient-from:var(--color-purple-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-600{--tw-gradient-from:var(--color-purple-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-500{--tw-gradient-from:var(--color-red-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-500{--tw-gradient-from:var(--color-yellow-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-50{--tw-gradient-to:var(--color-blue-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-100{--tw-gradient-to:var(--color-blue-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-green-600{--tw-gradient-to:var(--color-green-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-indigo-50{--tw-gradient-to:var(--color-indigo-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-indigo-100{--tw-gradient-to:var(--color-indigo-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-indigo-600{--tw-gradient-to:var(--color-indigo-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-indigo-700{--tw-gradient-to:var(--color-indigo-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-orange-600{--tw-gradient-to:var(--color-orange-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-pink-100{--tw-gradient-to:var(--color-pink-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-100{--tw-gradient-to:var(--color-purple-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-600{--tw-gradient-to:var(--color-red-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-yellow-600{--tw-gradient-to:var(--color-yellow-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-6{padding-top:calc(var(--spacing)*6)}.pl-4{padding-left:calc(var(--spacing)*4)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-800{color:var(--color-amber-800)}.text-blue-100{color:var(--color-blue-100)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-blue-900{color:var(--color-blue-900)}.text-cyan-600{color:var(--color-cyan-600)}.text-cyan-800{color:var(--color-cyan-800)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-100{color:var(--color-green-100)}.text-green-400{color:var(--color-green-400)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-indigo-600{color:var(--color-indigo-600)}.text-indigo-700{color:var(--color-indigo-700)}.text-indigo-900{color:var(--color-indigo-900)}.text-orange-100{color:var(--color-orange-100)}.text-orange-600{color:var(--color-orange-600)}.text-orange-700{color:var(--color-orange-700)}.text-pink-600{color:var(--color-pink-600)}.text-pink-700{color:var(--color-pink-700)}.text-pink-900{color:var(--color-pink-900)}.text-purple-100{color:var(--color-purple-100)}.text-purple-600{color:var(--color-purple-600)}.text-purple-700{color:var(--color-purple-700)}.text-purple-800{color:var(--color-purple-800)}.text-purple-900{color:var(--color-purple-900)}.text-red-100{color:var(--color-red-100)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-teal-600{color:var(--color-teal-600)}.text-teal-700{color:var(--color-teal-700)}.text-teal-800{color:var(--color-teal-800)}.text-transparent{color:#0000}.text-violet-600{color:var(--color-violet-600)}.text-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.text-yellow-100{color:var(--color-yellow-100)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline{text-decoration-line:underline}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:text-blue-600:is(:where(.group):hover *){color:var(--color-blue-600)}.group-hover\:text-green-600:is(:where(.group):hover *){color:var(--color-green-600)}.group-hover\:text-orange-600:is(:where(.group):hover *){color:var(--color-orange-600)}.group-hover\:text-pink-600:is(:where(.group):hover *){color:var(--color-pink-600)}.group-hover\:text-purple-600:is(:where(.group):hover *){color:var(--color-purple-600)}.group-hover\:text-red-600:is(:where(.group):hover *){color:var(--color-red-600)}.group-hover\:text-teal-600:is(:where(.group):hover *){color:var(--color-teal-600)}.group-hover\:text-yellow-600:is(:where(.group):hover *){color:var(--color-yellow-600)}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:bg-blue-50:hover{background-color:var(--color-blue-50)}.hover\:bg-blue-100:hover{background-color:var(--color-blue-100)}.hover\:bg-blue-200:hover{background-color:var(--color-blue-200)}.hover\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-gray-300:hover{background-color:var(--color-gray-300)}.hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-green-700:hover{background-color:var(--color-green-700)}.hover\:bg-purple-50:hover{background-color:var(--color-purple-50)}.hover\:bg-purple-200:hover{background-color:var(--color-purple-200)}.hover\:bg-purple-600:hover{background-color:var(--color-purple-600)}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-blue-800:hover{color:var(--color-blue-800)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-800:hover{color:var(--color-gray-800)}.hover\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:border-transparent:focus{border-color:#0000}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:ring-blue-600:focus{--tw-ring-color:var(--color-blue-600)}.focus\:ring-green-500:focus{--tw-ring-color:var(--color-green-500)}.focus\:ring-orange-500:focus{--tw-ring-color:var(--color-orange-500)}.focus\:ring-pink-500:focus{--tw-ring-color:var(--color-pink-500)}.focus\:ring-purple-500:focus{--tw-ring-color:var(--color-purple-500)}.focus\:ring-red-500:focus{--tw-ring-color:var(--color-red-500)}.focus\:ring-teal-500:focus{--tw-ring-color:var(--color-teal-500)}.focus\:ring-yellow-500:focus{--tw-ring-color:var(--color-yellow-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}@media (min-width:48rem){.md\:col-span-4{grid-column:span 4/span 4}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}}.filter-highlight{transition:box-shadow .3s ease-in-out;box-shadow:0 0 0 4px #3b82f680,0 0 20px #3b82f64d}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@silvestv/migration-planificator",
|
|
3
|
-
"version": "7.1.
|
|
3
|
+
"version": "7.1.4",
|
|
4
4
|
"description": "Professional Angular migration analysis tool with AST precision for version upgrades (17→18, 18→19, 19→20, 20→21), Nx monorepo refactoring, workload estimation, and technical debt assessment. Interactive HTML reports with Gantt timeline and real-time editing.",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"publishConfig": {
|
|
@@ -51,36 +51,30 @@
|
|
|
51
51
|
"angular",
|
|
52
52
|
"angular-migration",
|
|
53
53
|
"angular-upgrade",
|
|
54
|
+
"angular-update",
|
|
54
55
|
"angular-analyzer",
|
|
55
|
-
"angular-
|
|
56
|
+
"angular-scanner",
|
|
57
|
+
"angular-audit",
|
|
58
|
+
"angular-17",
|
|
56
59
|
"angular-18",
|
|
57
60
|
"angular-19",
|
|
58
61
|
"angular-20",
|
|
59
62
|
"angular-21",
|
|
60
63
|
"angular-refactoring",
|
|
61
64
|
"angular-signals",
|
|
65
|
+
"angular-standalone",
|
|
66
|
+
"angular-control-flow",
|
|
67
|
+
"angular-deprecation",
|
|
62
68
|
"nx",
|
|
63
69
|
"nx-monorepo",
|
|
64
|
-
"nx-
|
|
65
|
-
"monorepo-analysis",
|
|
70
|
+
"nx-migration",
|
|
66
71
|
"migration-tool",
|
|
67
72
|
"migration-planner",
|
|
68
|
-
"migration
|
|
69
|
-
"
|
|
73
|
+
"code-migration",
|
|
74
|
+
"ai-migration",
|
|
70
75
|
"technical-debt",
|
|
71
76
|
"code-modernization",
|
|
72
|
-
"
|
|
73
|
-
"deprecation-analysis",
|
|
74
|
-
"ast-analysis",
|
|
75
|
-
"ast-parser",
|
|
76
|
-
"ts-morph",
|
|
77
|
-
"typescript-analysis",
|
|
78
|
-
"code-analysis",
|
|
79
|
-
"refactoring-tool",
|
|
80
|
-
"control-flow",
|
|
81
|
-
"standalone-components",
|
|
82
|
-
"gantt-timeline",
|
|
83
|
-
"interactive-report"
|
|
77
|
+
"standalone-components"
|
|
84
78
|
],
|
|
85
79
|
"author": {
|
|
86
80
|
"name": "Victor SILVESTRE",
|
|
@@ -105,7 +99,6 @@
|
|
|
105
99
|
"devDependencies": {
|
|
106
100
|
"@tailwindcss/cli": "^4.1.14",
|
|
107
101
|
"@types/node": "^24.7.0",
|
|
108
|
-
"@typescript-eslint/typescript-estree": "^8.46.0",
|
|
109
102
|
"esbuild": "^0.25.11",
|
|
110
103
|
"repomix": "^1.10.1",
|
|
111
104
|
"ts-node": "^10.9.2"
|