Aktraiser
commited on
Commit
·
7b4a53b
1
Parent(s):
c233761
amelioration figjam
Browse files
app.py
CHANGED
|
@@ -412,6 +412,257 @@ def list_figma_team_projects(team_id: str = "") -> str:
|
|
| 412 |
|
| 413 |
return f"📁 **Projets de l'équipe :**\n" + "\n".join(project_list)
|
| 414 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 415 |
# === CONFIGURATION DE L'APPLICATION GRADIO ===
|
| 416 |
|
| 417 |
def setup_demo():
|
|
@@ -534,16 +785,36 @@ def setup_demo():
|
|
| 534 |
gr.Markdown("""
|
| 535 |
---
|
| 536 |
### 🛠️ **Outils MCP disponibles :**
|
|
|
|
|
|
|
| 537 |
- `configure_figma_token(token)` - Configure le token d'accès
|
| 538 |
- `configure_figma_file_id(file_id)` - Configure l'ID du fichier
|
|
|
|
|
|
|
| 539 |
- `list_figma_recent_files()` - Liste tous vos fichiers récents avec leurs IDs
|
| 540 |
- `get_figma_file_info()` - Récupère les infos du fichier
|
| 541 |
-
- `create_figma_rectangle(x, y, width, height, name, color)` - Crée un rectangle
|
| 542 |
-
- `create_figma_frame(x, y, width, height, name)` - Crée un frame
|
| 543 |
-
- `create_figma_text(x, y, text, name, font_size)` - Crée un texte
|
| 544 |
- `get_figma_comments()` - Récupère les commentaires
|
| 545 |
- `get_figma_user_info()` - Info utilisateur connecté
|
| 546 |
- `get_figma_collaborators()` - Récupère les collaborateurs actifs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 547 |
""")
|
| 548 |
|
| 549 |
return demo
|
|
|
|
| 412 |
|
| 413 |
return f"📁 **Projets de l'équipe :**\n" + "\n".join(project_list)
|
| 414 |
|
| 415 |
+
def create_figma_sticky_note(x: str, y: str, text: str, color: str = "yellow", name: str = "Sticky Note") -> str:
|
| 416 |
+
"""Crée un post-it dans FigJam"""
|
| 417 |
+
if not figma_config["file_id"]:
|
| 418 |
+
return "❌ ID du fichier requis. Utilisez configure_figma_file_id() d'abord."
|
| 419 |
+
|
| 420 |
+
try:
|
| 421 |
+
x_pos, y_pos = float(x), float(y)
|
| 422 |
+
|
| 423 |
+
# Couleurs disponibles pour les post-its
|
| 424 |
+
colors = {
|
| 425 |
+
"yellow": "🟡",
|
| 426 |
+
"blue": "🔵",
|
| 427 |
+
"green": "🟢",
|
| 428 |
+
"red": "🔴",
|
| 429 |
+
"purple": "🟣",
|
| 430 |
+
"orange": "🟠"
|
| 431 |
+
}
|
| 432 |
+
|
| 433 |
+
color_emoji = colors.get(color.lower(), "🟡")
|
| 434 |
+
|
| 435 |
+
comment_text = f"{color_emoji} **Post-it à créer :**\n- Nom: {name}\n- Position: ({x_pos}, {y_pos})\n- Texte: \"{text}\"\n- Couleur: {color}"
|
| 436 |
+
|
| 437 |
+
comment_data = {
|
| 438 |
+
"message": comment_text,
|
| 439 |
+
"client_meta": {
|
| 440 |
+
"x": x_pos,
|
| 441 |
+
"y": y_pos
|
| 442 |
+
}
|
| 443 |
+
}
|
| 444 |
+
|
| 445 |
+
result = make_figma_request(f"files/{figma_config['file_id']}/comments", "POST", comment_data)
|
| 446 |
+
|
| 447 |
+
if "error" in result:
|
| 448 |
+
return f"❌ Erreur lors de la création du commentaire : {result['error']}"
|
| 449 |
+
|
| 450 |
+
return f"✅ Post-it {color_emoji} \"{text}\" créé à ({x_pos}, {y_pos})"
|
| 451 |
+
|
| 452 |
+
except ValueError:
|
| 453 |
+
return "❌ Les coordonnées doivent être des nombres"
|
| 454 |
+
|
| 455 |
+
def create_figma_section(x: str, y: str, width: str, height: str, title: str, color: str = "blue") -> str:
|
| 456 |
+
"""Crée une section dans FigJam pour organiser le contenu"""
|
| 457 |
+
if not figma_config["file_id"]:
|
| 458 |
+
return "❌ ID du fichier requis. Utilisez configure_figma_file_id() d'abord."
|
| 459 |
+
|
| 460 |
+
try:
|
| 461 |
+
x_pos, y_pos = float(x), float(y)
|
| 462 |
+
w, h = float(width), float(height)
|
| 463 |
+
|
| 464 |
+
comment_text = f"📦 **Section à créer :**\n- Titre: {title}\n- Position: ({x_pos}, {y_pos})\n- Taille: {w}x{h}\n- Couleur: {color}"
|
| 465 |
+
|
| 466 |
+
comment_data = {
|
| 467 |
+
"message": comment_text,
|
| 468 |
+
"client_meta": {
|
| 469 |
+
"x": x_pos,
|
| 470 |
+
"y": y_pos
|
| 471 |
+
}
|
| 472 |
+
}
|
| 473 |
+
|
| 474 |
+
result = make_figma_request(f"files/{figma_config['file_id']}/comments", "POST", comment_data)
|
| 475 |
+
|
| 476 |
+
if "error" in result:
|
| 477 |
+
return f"❌ Erreur lors de la création du commentaire : {result['error']}"
|
| 478 |
+
|
| 479 |
+
return f"✅ Section \"{title}\" créée à ({x_pos}, {y_pos}) avec la taille {w}x{h}"
|
| 480 |
+
|
| 481 |
+
except ValueError:
|
| 482 |
+
return "❌ Les coordonnées et dimensions doivent être des nombres"
|
| 483 |
+
|
| 484 |
+
def create_figma_connector(start_x: str, start_y: str, end_x: str, end_y: str, style: str = "solid") -> str:
|
| 485 |
+
"""Crée un connecteur entre deux points dans FigJam"""
|
| 486 |
+
if not figma_config["file_id"]:
|
| 487 |
+
return "❌ ID du fichier requis. Utilisez configure_figma_file_id() d'abord."
|
| 488 |
+
|
| 489 |
+
try:
|
| 490 |
+
sx, sy = float(start_x), float(start_y)
|
| 491 |
+
ex, ey = float(end_x), float(end_y)
|
| 492 |
+
|
| 493 |
+
comment_text = f"🔗 **Connecteur à créer :**\n- De: ({sx}, {sy})\n- Vers: ({ex}, {ey})\n- Style: {style}"
|
| 494 |
+
|
| 495 |
+
comment_data = {
|
| 496 |
+
"message": comment_text,
|
| 497 |
+
"client_meta": {
|
| 498 |
+
"x": sx,
|
| 499 |
+
"y": sy
|
| 500 |
+
}
|
| 501 |
+
}
|
| 502 |
+
|
| 503 |
+
result = make_figma_request(f"files/{figma_config['file_id']}/comments", "POST", comment_data)
|
| 504 |
+
|
| 505 |
+
if "error" in result:
|
| 506 |
+
return f"❌ Erreur lors de la création du commentaire : {result['error']}"
|
| 507 |
+
|
| 508 |
+
return f"✅ Connecteur créé de ({sx}, {sy}) vers ({ex}, {ey})"
|
| 509 |
+
|
| 510 |
+
except ValueError:
|
| 511 |
+
return "❌ Toutes les coordonnées doivent être des nombres"
|
| 512 |
+
|
| 513 |
+
def create_figma_shape(x: str, y: str, width: str, height: str, shape_type: str, name: str = "Shape", color: str = "#FF0000") -> str:
|
| 514 |
+
"""Crée une forme géométrique (circle, triangle, star, etc.)"""
|
| 515 |
+
if not figma_config["file_id"]:
|
| 516 |
+
return "❌ ID du fichier requis. Utilisez configure_figma_file_id() d'abord."
|
| 517 |
+
|
| 518 |
+
try:
|
| 519 |
+
x_pos, y_pos = float(x), float(y)
|
| 520 |
+
w, h = float(width), float(height)
|
| 521 |
+
|
| 522 |
+
shapes = {
|
| 523 |
+
"circle": "⭕",
|
| 524 |
+
"triangle": "🔺",
|
| 525 |
+
"star": "⭐",
|
| 526 |
+
"diamond": "💎",
|
| 527 |
+
"heart": "❤️",
|
| 528 |
+
"arrow": "➡️"
|
| 529 |
+
}
|
| 530 |
+
|
| 531 |
+
shape_emoji = shapes.get(shape_type.lower(), "🔶")
|
| 532 |
+
|
| 533 |
+
comment_text = f"{shape_emoji} **Forme à créer :**\n- Nom: {name}\n- Type: {shape_type}\n- Position: ({x_pos}, {y_pos})\n- Taille: {w}x{h}\n- Couleur: {color}"
|
| 534 |
+
|
| 535 |
+
comment_data = {
|
| 536 |
+
"message": comment_text,
|
| 537 |
+
"client_meta": {
|
| 538 |
+
"x": x_pos,
|
| 539 |
+
"y": y_pos
|
| 540 |
+
}
|
| 541 |
+
}
|
| 542 |
+
|
| 543 |
+
result = make_figma_request(f"files/{figma_config['file_id']}/comments", "POST", comment_data)
|
| 544 |
+
|
| 545 |
+
if "error" in result:
|
| 546 |
+
return f"❌ Erreur lors de la création du commentaire : {result['error']}"
|
| 547 |
+
|
| 548 |
+
return f"✅ Forme {shape_emoji} {shape_type} créée à ({x_pos}, {y_pos})"
|
| 549 |
+
|
| 550 |
+
except ValueError:
|
| 551 |
+
return "❌ Les coordonnées et dimensions doivent être des nombres"
|
| 552 |
+
|
| 553 |
+
def move_figma_element(element_name: str, new_x: str, new_y: str) -> str:
|
| 554 |
+
"""Déplace un élément existant vers une nouvelle position"""
|
| 555 |
+
if not figma_config["file_id"]:
|
| 556 |
+
return "❌ ID du fichier requis. Utilisez configure_figma_file_id() d'abord."
|
| 557 |
+
|
| 558 |
+
try:
|
| 559 |
+
x_pos, y_pos = float(new_x), float(new_y)
|
| 560 |
+
|
| 561 |
+
comment_text = f"🚀 **Déplacement à effectuer :**\n- Élément: {element_name}\n- Nouvelle position: ({x_pos}, {y_pos})"
|
| 562 |
+
|
| 563 |
+
comment_data = {
|
| 564 |
+
"message": comment_text,
|
| 565 |
+
"client_meta": {
|
| 566 |
+
"x": x_pos,
|
| 567 |
+
"y": y_pos
|
| 568 |
+
}
|
| 569 |
+
}
|
| 570 |
+
|
| 571 |
+
result = make_figma_request(f"files/{figma_config['file_id']}/comments", "POST", comment_data)
|
| 572 |
+
|
| 573 |
+
if "error" in result:
|
| 574 |
+
return f"❌ Erreur lors de la création du commentaire : {result['error']}"
|
| 575 |
+
|
| 576 |
+
return f"✅ Instruction de déplacement créée pour {element_name} vers ({x_pos}, {y_pos})"
|
| 577 |
+
|
| 578 |
+
except ValueError:
|
| 579 |
+
return "❌ Les coordonnées doivent être des nombres"
|
| 580 |
+
|
| 581 |
+
def resize_figma_element(element_name: str, new_width: str, new_height: str) -> str:
|
| 582 |
+
"""Redimensionne un élément existant"""
|
| 583 |
+
if not figma_config["file_id"]:
|
| 584 |
+
return "❌ ID du fichier requis. Utilisez configure_figma_file_id() d'abord."
|
| 585 |
+
|
| 586 |
+
try:
|
| 587 |
+
w, h = float(new_width), float(new_height)
|
| 588 |
+
|
| 589 |
+
comment_text = f"📏 **Redimensionnement à effectuer :**\n- Élément: {element_name}\n- Nouvelle taille: {w}x{h}"
|
| 590 |
+
|
| 591 |
+
comment_data = {
|
| 592 |
+
"message": comment_text,
|
| 593 |
+
"client_meta": {
|
| 594 |
+
"x": 0,
|
| 595 |
+
"y": 0
|
| 596 |
+
}
|
| 597 |
+
}
|
| 598 |
+
|
| 599 |
+
result = make_figma_request(f"files/{figma_config['file_id']}/comments", "POST", comment_data)
|
| 600 |
+
|
| 601 |
+
if "error" in result:
|
| 602 |
+
return f"❌ Erreur lors de la création du commentaire : {result['error']}"
|
| 603 |
+
|
| 604 |
+
return f"✅ Instruction de redimensionnement créée pour {element_name} → {w}x{h}"
|
| 605 |
+
|
| 606 |
+
except ValueError:
|
| 607 |
+
return "❌ Les dimensions doivent être des nombres"
|
| 608 |
+
|
| 609 |
+
def create_figma_layout_grid(columns: str, rows: str, gap: str = "20") -> str:
|
| 610 |
+
"""Crée une grille de layout pour organiser les éléments"""
|
| 611 |
+
if not figma_config["file_id"]:
|
| 612 |
+
return "❌ ID du fichier requis. Utilisez configure_figma_file_id() d'abord."
|
| 613 |
+
|
| 614 |
+
try:
|
| 615 |
+
cols, rows_num, gap_size = int(columns), int(rows), float(gap)
|
| 616 |
+
|
| 617 |
+
comment_text = f"🔲 **Grille de layout à créer :**\n- Colonnes: {cols}\n- Lignes: {rows_num}\n- Espacement: {gap_size}px"
|
| 618 |
+
|
| 619 |
+
comment_data = {
|
| 620 |
+
"message": comment_text,
|
| 621 |
+
"client_meta": {
|
| 622 |
+
"x": 0,
|
| 623 |
+
"y": 0
|
| 624 |
+
}
|
| 625 |
+
}
|
| 626 |
+
|
| 627 |
+
result = make_figma_request(f"files/{figma_config['file_id']}/comments", "POST", comment_data)
|
| 628 |
+
|
| 629 |
+
if "error" in result:
|
| 630 |
+
return f"❌ Erreur lors de la création du commentaire : {result['error']}"
|
| 631 |
+
|
| 632 |
+
return f"✅ Grille {cols}x{rows_num} créée avec espacement de {gap_size}px"
|
| 633 |
+
|
| 634 |
+
except ValueError:
|
| 635 |
+
return "❌ Les valeurs doivent être des nombres"
|
| 636 |
+
|
| 637 |
+
def create_figma_component(x: str, y: str, width: str, height: str, component_name: str, description: str = "") -> str:
|
| 638 |
+
"""Crée un composant réutilisable"""
|
| 639 |
+
if not figma_config["file_id"]:
|
| 640 |
+
return "❌ ID du fichier requis. Utilisez configure_figma_file_id() d'abord."
|
| 641 |
+
|
| 642 |
+
try:
|
| 643 |
+
x_pos, y_pos = float(x), float(y)
|
| 644 |
+
w, h = float(width), float(height)
|
| 645 |
+
|
| 646 |
+
comment_text = f"🧩 **Composant à créer :**\n- Nom: {component_name}\n- Position: ({x_pos}, {y_pos})\n- Taille: {w}x{h}\n- Description: {description}"
|
| 647 |
+
|
| 648 |
+
comment_data = {
|
| 649 |
+
"message": comment_text,
|
| 650 |
+
"client_meta": {
|
| 651 |
+
"x": x_pos,
|
| 652 |
+
"y": y_pos
|
| 653 |
+
}
|
| 654 |
+
}
|
| 655 |
+
|
| 656 |
+
result = make_figma_request(f"files/{figma_config['file_id']}/comments", "POST", comment_data)
|
| 657 |
+
|
| 658 |
+
if "error" in result:
|
| 659 |
+
return f"❌ Erreur lors de la création du commentaire : {result['error']}"
|
| 660 |
+
|
| 661 |
+
return f"✅ Composant \"{component_name}\" créé à ({x_pos}, {y_pos})"
|
| 662 |
+
|
| 663 |
+
except ValueError:
|
| 664 |
+
return "❌ Les coordonnées et dimensions doivent être des nombres"
|
| 665 |
+
|
| 666 |
# === CONFIGURATION DE L'APPLICATION GRADIO ===
|
| 667 |
|
| 668 |
def setup_demo():
|
|
|
|
| 785 |
gr.Markdown("""
|
| 786 |
---
|
| 787 |
### 🛠️ **Outils MCP disponibles :**
|
| 788 |
+
|
| 789 |
+
**📋 Configuration :**
|
| 790 |
- `configure_figma_token(token)` - Configure le token d'accès
|
| 791 |
- `configure_figma_file_id(file_id)` - Configure l'ID du fichier
|
| 792 |
+
|
| 793 |
+
**📁 Navigation :**
|
| 794 |
- `list_figma_recent_files()` - Liste tous vos fichiers récents avec leurs IDs
|
| 795 |
- `get_figma_file_info()` - Récupère les infos du fichier
|
|
|
|
|
|
|
|
|
|
| 796 |
- `get_figma_comments()` - Récupère les commentaires
|
| 797 |
- `get_figma_user_info()` - Info utilisateur connecté
|
| 798 |
- `get_figma_collaborators()` - Récupère les collaborateurs actifs
|
| 799 |
+
|
| 800 |
+
**🎨 Création d'éléments de base :**
|
| 801 |
+
- `create_figma_rectangle(x, y, width, height, name, color)` - Crée un rectangle
|
| 802 |
+
- `create_figma_frame(x, y, width, height, name)` - Crée un frame
|
| 803 |
+
- `create_figma_text(x, y, text, name, font_size)` - Crée un texte
|
| 804 |
+
- `create_figma_shape(x, y, width, height, shape_type, name, color)` - Crée des formes (circle, triangle, star, diamond, heart, arrow)
|
| 805 |
+
|
| 806 |
+
**🟡 FigJam - Post-its et organisation :**
|
| 807 |
+
- `create_figma_sticky_note(x, y, text, color, name)` - Crée un post-it (couleurs: yellow, blue, green, red, purple, orange)
|
| 808 |
+
- `create_figma_section(x, y, width, height, title, color)` - Crée une section pour organiser
|
| 809 |
+
- `create_figma_connector(start_x, start_y, end_x, end_y, style)` - Crée un connecteur entre points
|
| 810 |
+
|
| 811 |
+
**🔧 Manipulation d'objets :**
|
| 812 |
+
- `move_figma_element(element_name, new_x, new_y)` - Déplace un élément
|
| 813 |
+
- `resize_figma_element(element_name, new_width, new_height)` - Redimensionne un élément
|
| 814 |
+
|
| 815 |
+
**🏗️ Layout et organisation :**
|
| 816 |
+
- `create_figma_layout_grid(columns, rows, gap)` - Crée une grille de layout
|
| 817 |
+
- `create_figma_component(x, y, width, height, component_name, description)` - Crée un composant réutilisable
|
| 818 |
""")
|
| 819 |
|
| 820 |
return demo
|