shell
📁 components/
├── 📄 Button.py
└── 📄 Button.html
Sur le Web, HTML permet de créer des documents riches et structurés grâce à ses nombreuses balises comme <h1>
et <li>
. Nexy vous permet de combiner votre balisage avec CSS et JavaScript pour créer des composants personnalisés, réutilisables dans votre application.
Traditionnellement, les développeurs web écrivent le balisage de leur contenu puis ajoutent de l'interactivité avec JavaScript. Aujourd'hui, c'est une exigence de base pour de nombreux sites et applications. Nexy met l'interactivité au premier plan tout en utilisant les mêmes technologies de base : un composant Nexy est une fonction Python que vous pouvez enrichir avec du balisage.
shell
📁 components/
├── 📄 Button.py
└── 📄 Button.html
python
from nexy import Component
@Component()
def Button(label: str, onClick: Callable):
return { "label": label, "onClick": onClick }
html
<button onclick="{{onClick}}">{{label}}</button>
<style>
button {
background-color: #4CAF50;
border: none;
color: white;
padding: 10px 20px;
border-radius: 4px;
cursor: pointer;
&:hover {
background-color: #45a049;
}
}
</style>
Maintenant que vous avez défini votre composant Button, vous pouvez l'imbriquer dans d'autres composants. Par exemple, vous pouvez utiliser le composant Button dans une vue :
html
<Button
label="Soumettre"
onClick="submitForm()"
/>
Le paramètre caller
permet à un composant de recevoir et d'afficher du contenu enfant, transformant le composant en une balise de type bloc.
shell
📁 components/
├── 📄 Card.py
└── 📄 Card.html
python
from nexy import Component
@Component()
def Card(caller: Any):
children = caller()
return { "children": children }
Le fichier HTML associé au composant Card utilise la variable children
pour afficher le contenu capturé.
html
<div class="card">{{children}}</div>
<style>
.card {
background-color: #c5d6d1;
border-radius: 8px;
padding: 16px;
width: clamp(300px, 100%, 500px);
font-family: 'Poppins', sans-serif;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
</style>
html
<Card>
<h2>Titre de la carte</h2>
<p>Contenu de la carte</p>
</Card>
Les composants peuvent être composés pour créer des interfaces complexes. L'attribut imports
permet d'utiliser d'autres composants à l'intérieur d'un composant.
shell
📁 components/
├── 📄 Dashboard.py
└── 📄 Dashboard.html
python
from nexy import Component
from .Card import Card
from .Button import Button
@Component(
imports=[Card, Button]
)
def Dashboard(user: User):
return { "user": user, "cards": get_user_cards(user.id) }
html
<div class="dashboard">
<h1>Bienvenue, {{user.name}}</h1>
{% for card_data in cards %}
<Card>
<h2>{{card_data.title}}</h2>
<p>{{card_data.content}}</p>
<Button
label="Voir détails"
onClick="viewDetails({{card_data.id}})"
/>
</Card>
{% endfor %}
</div>
Les composants conteneurs peuvent encapsuler d'autres composants et du contenu, créant ainsi une structure hiérarchique.
shell
📁 components/
├── 📄 Layout.py
└── 📄 Layout.html
python
from nexy import Component
from .Card import Card
from .Button import Button
@Component(
imports=[Card, Button]
)
def Layout(caller: Any):
children = caller()
return { "children": children, "title": "Mon Application" }
html
<main>
<Card>
<h2>Titre de la carte</h2>
<p>Contenu de la carte</p>
<Button
label="Cliquez ici"
onClick="handleClick()"
/>
</Card>
</main>
Utiliser le système de composants de Nexy présente plusieurs avantages :