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
|