{% extends 'base.html.twig' %} {% block title %}{{ is_edit ? 'Modifier' : 'Nouvelle' }} offre - Admin{% endblock %} {% set inputClass = 'w-full px-4 py-3 border-2 border-gray-200 rounded-xl focus:ring-2 focus:ring-primary/20 focus:border-primary transition-all bg-gray-50 focus:bg-white' %} {% set labelClass = 'block text-sm font-medium text-gray-700 mb-2' %} {% set helpClass = 'mt-1.5 text-xs text-gray-400' %} {% set toggleClass = 'flex items-center gap-3 p-4 bg-gray-50 border-2 border-gray-200 rounded-xl cursor-pointer transition-all hover:border-primary/30 hover:bg-primary/5 has-[:checked]:border-primary has-[:checked]:bg-primary/5' %} {% set toggleKnob = 'w-10 h-6 bg-gray-300 peer-checked:bg-primary rounded-full relative transition-colors after:content-[\'\'] after:absolute after:top-0.5 after:left-0.5 after:w-5 after:h-5 after:bg-white after:rounded-full after:transition-transform peer-checked:after:translate-x-4 flex-shrink-0' %} {% block body %}
{# Header #}
{% include '_molecules/page-header/page-header.html.twig' with { title: is_edit ? 'Modifier « ' ~ plan.name ~ ' »' : 'Nouvelle offre', icon: is_edit ? 'edit' : 'plus', backHref: path('admin_plan_list'), backLabel: 'Retour aux offres' } only %}
{{ form_start(form, {'attr': {'class': 'space-y-6', 'data-turbo': 'false'}}) }} {# ── Card 1 : Identité ── #}
{% include '_atoms/icon/icon.html.twig' with { name: 'tag', size: 'md', color: 'primary' } only %}

Identité

Nom, slug et accroche

{{ form_label(form.name, null, {'label_attr': {'class': labelClass}}) }} {{ form_widget(form.name, {'attr': {'class': inputClass}}) }} {{ form_errors(form.name) }}
{{ form_label(form.slug, null, {'label_attr': {'class': labelClass}}) }} {{ form_widget(form.slug, {'attr': {'class': inputClass ~ ' font-mono text-sm'}}) }} {% if form.slug.vars.help %}

{{ form.slug.vars.help }}

{% endif %} {{ form_errors(form.slug) }}
{{ form_label(form.tagline, null, {'label_attr': {'class': labelClass}}) }} {{ form_widget(form.tagline, {'attr': {'class': inputClass ~ ' resize-none', 'rows': 3}}) }} {% if form.tagline.vars.help %}

{{ form.tagline.vars.help }}

{% endif %}
{{ form_label(form.sortOrder, null, {'label_attr': {'class': labelClass}}) }} {{ form_widget(form.sortOrder, {'attr': {'class': inputClass}}) }}
{# ── Card 2 : Prix & Tokens ── #}
{% include '_atoms/icon/icon.html.twig' with { name: 'token', size: 'md', color: 'primary' } only %}

Prix & Tokens

Prix mensuel / annuel, engagement et tokens alloués

{# Prix #}
{{ form_label(form.priceMonthly, null, {'label_attr': {'class': labelClass}}) }} {{ form_widget(form.priceMonthly, {'attr': {'class': inputClass ~ ' tabular-nums'}}) }} {% if form.priceMonthly.vars.help %}

{{ form.priceMonthly.vars.help }}

{% endif %}
{{ form_label(form.priceAnnual, null, {'label_attr': {'class': labelClass}}) }} {{ form_widget(form.priceAnnual, {'attr': {'class': inputClass ~ ' tabular-nums'}}) }} {% if form.priceAnnual.vars.help %}

{{ form.priceAnnual.vars.help }}

{% endif %}
{{ form_label(form.commitmentLabel, null, {'label_attr': {'class': labelClass}}) }} {{ form_widget(form.commitmentLabel, {'attr': {'class': inputClass}}) }} {% if form.commitmentLabel.vars.help %}

{{ form.commitmentLabel.vars.help }}

{% endif %}
{# Tokens #}
{{ form_label(form.monthlyTokens, null, {'label_attr': {'class': labelClass}}) }} {{ form_widget(form.monthlyTokens, {'attr': {'class': inputClass ~ ' tabular-nums'}}) }} {% if form.monthlyTokens.vars.help %}

{{ form.monthlyTokens.vars.help }}

{% endif %}
{{ form_label(form.tokensLabel, null, {'label_attr': {'class': labelClass}}) }} {{ form_widget(form.tokensLabel, {'attr': {'class': inputClass}}) }} {% if form.tokensLabel.vars.help %}

{{ form.tokensLabel.vars.help }}

{% endif %}
{# ── Card 4 : Fonctionnalités ── #}
{% include '_atoms/icon/icon.html.twig' with { name: 'check', size: 'md', color: 'primary' } only %}

Fonctionnalités incluses

Cochez les fonctionnalités disponibles dans cette offre

{% for field in [ form.hasSamAccess, form.hasPrioritySupport, form.hasMultiAccountDashboard, form.hasFlexibleTokens, form.hasDegressivePricing, form.hasDedicatedTraining ] %} {% endfor %}
{{ form_label(form.tokenStorageMonths, null, {'label_attr': {'class': labelClass}}) }} {{ form_widget(form.tokenStorageMonths, {'attr': {'class': inputClass ~ ' max-w-[180px] tabular-nums'}}) }}

0 = pas d'accumulation  ·  3 = jusqu'à 3 mois  ·  6 = jusqu'à 6 mois

{# ── Card 5 : CTA ── #}
{% include '_atoms/icon/icon.html.twig' with { name: 'arrow-right', size: 'md', color: 'primary' } only %}

Bouton CTA

Label et destination du bouton d'appel à l'action

{{ form_label(form.ctaLabel, null, {'label_attr': {'class': labelClass}}) }} {{ form_widget(form.ctaLabel, {'attr': {'class': inputClass}}) }} {% if form.ctaLabel.vars.help %}

{{ form.ctaLabel.vars.help }}

{% endif %}
{{ form_label(form.ctaUrl, null, {'label_attr': {'class': labelClass}}) }} {{ form_widget(form.ctaUrl, {'attr': {'class': inputClass}}) }} {% if form.ctaUrl.vars.help %}

{{ form.ctaUrl.vars.help }}

{% endif %}
{# ── Card 6 : Apparence ── #}
{% include '_atoms/icon/icon.html.twig' with { name: 'palette-2', size: 'md', color: 'primary' } only %}

Apparence

Dégradé appliqué au prix du plan (couleur gauche → couleur droite)

{# Deux color pickers + preview #}
{# Pickers #}
#0d1b3e
#0C81E4
{# Préréglages #}

Préréglages

{% set presets = [ { label: 'Gris', left: '#1f2937', right: '#6b7280' }, { label: 'Bleu', left: '#0d1b3e', right: '#0C81E4' }, { label: 'Violet', left: '#2e1065', right: '#7c3aed' }, { label: 'Vert', left: '#064e3b', right: '#10b981' }, { label: 'Orange', left: '#78350f', right: '#f59e0b' }, ] %} {% for preset in presets %} {% endfor %}
{# Champ hidden géré par le form Symfony #}

Valeur CSS générée

{{ form_widget(form.gradientCss, {'attr': { 'class': inputClass ~ ' font-mono text-xs text-gray-500', 'id': 'gradient-css-input', 'readonly': 'readonly' }}) }}
{# Aperçu #}

Aperçu

{{ plan.name }}

30€/mois

Prix avec dégradé texte

30€/mois

{# Actions #}
{% include '_atoms/button/button.html.twig' with { label: 'Annuler', variant: 'ghost', size: 'lg', icon: 'arrow-left', href: path('admin_plan_list') } only %} {% include '_atoms/button/button.html.twig' with { label: is_edit ? 'Enregistrer' : 'Créer l\'offre', variant: 'primary', size: 'lg', icon: 'check', type: 'submit' } only %}
{{ form_end(form) }}
{% endblock %}