@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 CHANGED
@@ -1,27 +1,24 @@
1
1
  # Angular Migration Planner
2
2
 
3
- > **Outil professionnel d'analyse de migrations Angular pour montées de version, refactoring Nx monorepo, et évaluation de dette technique**
4
-
5
- Planifiez vos migrations Angular (17→18, 18→19, 19→20, 20→21) avec analyse AST précise, calculez les charges de travail, et générez des dashboards HTML interactifs.
6
-
7
- [![npm version](https://img.shields.io/npm/v/@silvestv/migration-planificator.svg)](https://www.npmjs.com/package/@silvestv/migration-planificator)
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
  [![npm downloads](https://img.shields.io/npm/dm/@silvestv/migration-planificator.svg)](https://www.npmjs.com/package/@silvestv/migration-planificator)
9
10
  [![Node.js](https://img.shields.io/badge/node-%3E%3D20.0.0-brightgreen)](https://nodejs.org/)
10
11
  [![TypeScript](https://img.shields.io/badge/typescript-5.9-blue)](https://www.typescriptlang.org/)
11
12
  [![Tests](https://img.shields.io/badge/tests-748%20passing-success)](tests)
12
13
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)[![Status](https://img.shields.io/badge/statut-alpha-orange)](https://www.npmjs.com/package/@silvestv/migration-planificator)
13
14
 
14
- **[🇬🇧 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
- ---
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
- ## Fonctionnalités
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
- npx @silvestv/migration-planificator --scanner=both --rules=all --project-path=/path/to/angular-app
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
- ### Refactoring Monorepo Nx
69
- Moderniser workspace Nx avec 10+ apps/libs :
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
- #### Depuis les Sources
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 [défaut: ast]
146
- --project-path=<path> Chemin vers projet Angular [défaut: répertoire courant]
147
- --rules=<versions> 18 | [18,19] | all [défaut: 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 répertoire courant avec AST
73
+ # Scanner repertoire courant (AST, toutes regles)
153
74
  npx @silvestv/migration-planificator
154
75
 
155
- # Scan comparatif (AST vs Regex) sur projet spécifique
76
+ # Scan comparatif sur workspace Nx
156
77
  npx @silvestv/migration-planificator --scanner=both --project-path=/workspace/mon-app
157
78
 
158
- # Vérifier uniquement règles migration Angular 17→18
79
+ # Uniquement regles Angular 17→18
159
80
  npx @silvestv/migration-planificator --rules=18
160
81
 
161
- # Plusieurs versions avec scanner regex
162
- npx @silvestv/migration-planificator --scanner=regex --rules=[18,19]
82
+ # Plusieurs versions
83
+ npx @silvestv/migration-planificator --rules=[18,19,20]
163
84
  ```
164
85
 
165
- ### Pour Développement (depuis repository cloné)
86
+ ### Ouvrir le Rapport
87
+
166
88
  ```bash
167
- # Build et exécution
168
- npm run build
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
- ### Page Workload
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
- ### Page Delta (Mode Both)
195
- - Comparaison règle par règle (précision AST vs Regex)
196
- - Analyse divergences, stats performance, recommandations
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
- ## 📋 Règles Migration
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
- ### Niveaux Risque
215
- 🔴 **Critical** (breaking changes) • 🟠 **High** (dépréciations majeures) • 🟡 **Medium** (améliorations) • 🟢 **Low** (optimisations)
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
- ## 🐛 Dépannage
115
+ ## 🤖 AI Auto-Fix (Experimental)
220
116
 
221
- ### Expression Régulière Invalide
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
- ## 🔒 Sécurité et Confidentialité
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
- ## 🤝 Contribuer & Support
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
- Ce projet est sous licence **Apache License 2.0** - libre pour usage commercial et open-source.
127
+ ### Commande
263
128
 
264
- ### 🐛 Signaler un Bug
265
-
266
- Vous avez trouvé un bug ? Signalez-le via GitHub Issues :
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
- **Lien direct** : [Demander une Fonctionnalité](https://github.com/silvestv/migration-planificator-documentation/issues/new?template=feature_request.md)
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
- ### ❓ Poser une Question
141
+ ### Sortie
294
142
 
295
- Besoin d'aide ou vous avez des questions ?
143
+ 4 fichiers dans `output/ai/migration/{version}/{rule}-prompts/` :
296
144
 
297
- 1. **Aller sur** : [GitHub Issues](https://github.com/silvestv/migration-planificator-documentation/issues/new/choose)
298
- 2. **Sélectionner** : Template "Question"
299
- 3. **Vérifier d'abord** :
300
- - [FAQ](https://github.com/silvestv/migration-planificator-documentation/blob/master/FAQ.md)
301
- - [Guide de Dépannage](https://github.com/silvestv/migration-planificator-documentation/blob/master/TROUBLESHOOTING.md)
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
- **Lien direct** : [Poser une Question](https://github.com/silvestv/migration-planificator-documentation/issues/new?template=question.md)
152
+ ### Utilisation
304
153
 
305
- ### 📧 Contact Direct
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
- Pour les problèmes urgents, préoccupations de sécurité ou demandes commerciales :
159
+ L'agent va : verifier preconditions creer branche proposer plan → implementer → valider (AST + build + tests) → commit & push.
308
160
 
309
- 📧 **Email** : victor.silvestre.dev@gmail.com
161
+ ### Pipeline de l'Agent
310
162
 
311
- **Utilisateurs entreprise** : Contactez-nous pour licence commerciale, support prioritaire et fonctionnalités personnalisées.
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
- ## 📝 Licence
316
-
317
- © 2025 Victor SILVESTRE
169
+ ## 📋 Regles Migration
318
170
 
319
- Sous licence **Apache License, Version 2.0** (la "Licence").
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
- http://www.apache.org/licenses/LICENSE-2.0
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
- ### Conditions Principales
180
+ **Categories** : `environment` • `imports` • `api` • `routing` • `template` • `test` • `ssr` • `reactive` • `signals` • `config`
326
181
 
327
- - ✅ **Usage Commercial** - Utilisation libre pour tout usage incluant commercial
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
- ### Obligations
184
+ ---
334
185
 
335
- Lors de la distribution ou modification :
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
- ### Avertissement
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
- Sauf si requis par la loi applicable ou convenu par écrit, le logiciel
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
- Voir [LICENSE](LICENSE) pour le texte complet de la licence.
192
+ ## 🤝 Support
349
193
 
350
- 📧 **Contact** : victor.silvestre.dev@gmail.com
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
- ## 🙏 Remerciements
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
- **🚀 Commencez à planifier votre migration Angular dès aujourd'hui !**
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
- > **Professional Angular migration analysis tool for version upgrades, Nx monorepo refactoring, and technical debt assessment**
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
- [![npm version](https://img.shields.io/npm/v/@silvestv/migration-planificator.svg)](https://www.npmjs.com/package/@silvestv/migration-planificator)
8
9
  [![npm downloads](https://img.shields.io/npm/dm/@silvestv/migration-planificator.svg)](https://www.npmjs.com/package/@silvestv/migration-planificator)
9
10
  [![Node.js](https://img.shields.io/badge/node-%3E%3D20.0.0-brightgreen)](https://nodejs.org/)
10
11
  [![TypeScript](https://img.shields.io/badge/typescript-5.9-blue)](https://www.typescriptlang.org/)
11
- [![Tests](https://img.shields.io/badge/tests-748%20passing-success)](./tests)
12
+ [![Tests](https://img.shields.io/badge/tests-748%20passing-success)](tests)
12
13
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)[![Status](https://img.shields.io/badge/status-alpha-orange)](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 comprehensive **Angular migration analysis tool** for:
21
+ A complete **Angular migration analysis (AST)** AND **AI-assisted migration** tool for:
25
22
 
26
- - 🔄 **Angular Upgrades**: Plan migrations 17→18, 18→19, 19→20, 20→21 with precise workload estimates
27
- - 🏢 **Nx Monorepo**: Analyze multi-app/multi-lib workspaces with per-target breakdown
28
- - 📊 **Technical Debt**: Identify deprecated APIs, anti-patterns, modernization opportunities
29
- - 💰 **Workload Estimation**: Calculate time (days/hours/minutes) by priority and risk level
30
- - 🎨 **Code Modernization**: Detect Signals, Control Flow, Standalone component opportunities
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 **engineering teams** and **tech leads** planning Angular upgrades or refactoring initiatives.
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-based scanners or manual audits:
37
+ Unlike simple regex scanners or manual audits:
39
38
 
40
- - ✅ **88% AST Coverage**: Context-aware detection eliminates false positives (ignores comments, strings, migrated code)
41
- - ✅ **Cross-File Intelligence**: Connects TypeScript ↔ HTML templates (detects `@Component` + `<router-outlet>` patterns)
42
- - ✅ **Production-Ready**: 748 passing tests, TypeScript strict mode, optimized batch processing
43
- - ✅ **Time Saver**: Automated workload calculation + Gantt timeline = instant migration roadmap
44
- - ✅ **Zero Dependencies**: Pure AST analysis with ts-morph + @angular/compiler (no external APIs)
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
- ## Key Features
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
- npx @silvestv/migration-planificator --scanner=both --rules=all --project-path=/path/to/angular-app
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
- ### Nx Monorepo Refactoring
69
- Modernize large Nx workspace with 10+ apps/libs:
70
- ```bash
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
- ### Technical Debt Assessment
76
- Audit codebase for deprecated APIs:
77
- ```bash
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
- ### Installation
62
+ ### CLI Options
87
63
 
88
- #### Via npm (Recommended)
89
64
  ```bash
90
- npm install -g @silvestv/migration-planificator
91
- # or
92
- npx @silvestv/migration-planificator --project-path=/path/to/your/project
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
- #### From Source
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
- # Analyze current directory
73
+ # Scan current directory (AST, all rules)
106
74
  npx @silvestv/migration-planificator
107
75
 
108
- # Analyze specific project with options
109
- npx @silvestv/migration-planificator --scanner=both --project-path=/path/to/your/project
76
+ # Comparative scan on Nx workspace
77
+ npx @silvestv/migration-planificator --scanner=both --project-path=/workspace/my-app
110
78
 
111
- # Filter by migration version
112
- npx @silvestv/migration-planificator --rules=18 # Only Angular 17→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
- # Or using global installation
116
- migration-planificator --scanner=both --project-path=/path/to/your/project
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 # macOS/Linux
122
- start output/index.html # Windows
89
+ open output/index.html # macOS/Linux
90
+ start output/index.html # Windows
123
91
  ```
124
92
 
125
93
  ---
126
94
 
127
- ## 💻 Usage
95
+ ## 📊 Report Contents
128
96
 
129
- ### After npm Installation
97
+ 5 HTML files generated in `output/` :
130
98
 
131
- ```bash
132
- # Basic usage
133
- npx @silvestv/migration-planificator
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
- # With options
136
- npx @silvestv/migration-planificator --scanner=both --project-path=/path/to/project --rules=all
105
+ ---
137
106
 
138
- # Global installation
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
- ### CLI Options
144
- ```bash
145
- --scanner=<mode> ast | regex | both [default: ast]
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
- ### Examples
151
- ```bash
152
- # Scan current directory with AST
153
- npx @silvestv/migration-planificator
113
+ ---
154
114
 
155
- # Comparative scan (AST vs Regex) on specific project
156
- npx @silvestv/migration-planificator --scanner=both --project-path=/workspace/my-app
115
+ ## 🤖 AI Auto-Fix (Experimental)
157
116
 
158
- # Only check Angular 17→18 migration rules
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
- # Multiple versions with regex scanner
162
- npx @silvestv/migration-planificator --scanner=regex --rules=[18,19]
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
- # Build and run
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
- ## 📊 Report Contents
141
+ ### Output
181
142
 
182
- ### Overview Page
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
- ### Workload Page
188
- - **Charts**: Pie (migrations), Bar (top rules), Doughnut (priorities)
189
- - **Gantt Timeline**: Sequential migration phases
190
- - **Hierarchy Tree**: Monorepo Apps/Libs Migrations Priorities → Rules
191
- - **Real-time Editing**: Click time estimates to adjust, auto-recalculates
192
- - **Filters**: Risk level, category, rule type, text search
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
- ### Delta Page (Both Mode)
195
- - Rule-by-rule comparison (AST vs Regex accuracy)
196
- - Divergence analysis, performance stats, recommendations
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
- ### Categories
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
- ### Risk Levels
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
- ## 🐛 Troubleshooting
186
+ ## 🔒 Security
220
187
 
221
- ### Invalid Regular Expression
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
- ## 🔒 Security Notice
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
- - **100% Local Processing** - Your code never leaves your machine
245
- - **No Telemetry** - Zero data collection or tracking
246
- - **No External APIs** - Pure AST analysis with local libraries
247
- - **Signed Package** - Automatically signed by npm registry for integrity verification
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
- **🚀 Start planning your Angular migration today!**
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",
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-cli",
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-workspace",
65
- "monorepo-analysis",
70
+ "nx-migration",
66
71
  "migration-tool",
67
72
  "migration-planner",
68
- "migration-analysis",
69
- "workload-estimation",
73
+ "code-migration",
74
+ "ai-migration",
70
75
  "technical-debt",
71
76
  "code-modernization",
72
- "codebase-audit",
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"