src/StartPlatz/Bundle/PartnersBundle/Resources/views/Public/partners-detail.html.twig line 1

Open in your IDE?
  1. {% extends '@StartPlatzStyleBundle/base.tailwind.public.html.twig' %}
  2. {% block title %}{{ partner.displayName }} - {% if language == 'en' %}Partners{% else %}Partner{% endif %} | STARTPLATZ{% endblock %}
  3. {% block navigation %}
  4.     {% include "@StartPlatzStyleBundle/Navigation/_nav.public.tailwind.html.twig" %}
  5. {% endblock %}
  6. {% block content %}
  7.     {# Spacer for fixed nav #}
  8.     <div class="h-16"></div>
  9.     {# Header: Back-Link + Logo/Name/Category/Location #}
  10.     <section class="bg-gray-50 py-10">
  11.         <div class="max-w-6xl mx-auto px-4">
  12.             {# Back Link #}
  13.             <a href="{{ language == 'en' ? path('public_partners_index_en') : path('public_partners_index') }}"
  14.                class="inline-flex items-center gap-2 text-gray-500 hover:text-[#7ab800] text-sm mb-6 transition-colors">
  15.                 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  16.                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"/>
  17.                 </svg>
  18.                 {{ language == 'en' ? 'Back to Partners' : 'Zurück zu Partner' }}
  19.             </a>
  20.             <div class="bg-white rounded-xl p-8 shadow-sm flex flex-col md:flex-row items-start md:items-center gap-8">
  21.                 {# Logo #}
  22.                 <div class="flex-shrink-0">
  23.                     {% set logoUrl = partner.logoOverride ?: (team ? team.logoURL : null) %}
  24.                     {% if logoUrl %}
  25.                         <img src="{{ logoUrl }}" alt="{{ partner.displayName }}" class="max-h-20 max-w-[200px] object-contain">
  26.                     {% else %}
  27.                         <div class="w-20 h-20 flex items-center justify-center bg-gray-100 rounded-full text-gray-400 text-3xl">
  28.                             <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"/></svg>
  29.                         </div>
  30.                     {% endif %}
  31.                 </div>
  32.                 {# Name + Category + Location #}
  33.                 <div class="flex-grow">
  34.                     <h1 class="text-3xl font-bold text-gray-900 mb-2">{{ partner.displayName }}</h1>
  35.                     <div class="flex flex-wrap items-center gap-3">
  36.                         {% if partner.publicCategory %}
  37.                             <span class="inline-block px-4 py-1 text-sm font-medium rounded-full bg-teal-100 text-teal-800">
  38.                                 {{ partner.publicCategoryLabel(language) }}
  39.                             </span>
  40.                         {% endif %}
  41.                     </div>
  42.                 </div>
  43.             </div>
  44.         </div>
  45.     </section>
  46.     {# Content: Main + Sidebar #}
  47.     <section class="py-12 bg-white">
  48.         <div class="max-w-6xl mx-auto px-4">
  49.             <div class="flex flex-col lg:flex-row gap-10">
  50.                 {# Main Content #}
  51.                 <div class="lg:w-2/3 space-y-8">
  52.                     {# Practice Description #}
  53.                     {% if practiceDescription %}
  54.                         <div class="bg-gray-50 rounded-xl p-8">
  55.                             <h2 class="text-xl font-semibold text-gray-900 mb-4 pb-2 border-b-[3px] border-[#7ab800]">
  56.                                 {{ language == 'en' ? 'Practice Field' : 'Praxis- und Wirkungsfeld' }}
  57.                             </h2>
  58.                             <div class="text-gray-600 leading-relaxed">
  59.                                 {{ practiceDescription|nl2br }}
  60.                             </div>
  61.                         </div>
  62.                     {% endif %}
  63.                     {# Long Description fallback #}
  64.                     {% set descLongHtml = (language == 'en' and partner.descriptionLongHtmlEn) ? partner.descriptionLongHtmlEn : partner.descriptionLongHtml %}
  65.                     {% set descLong = (language == 'en' and partner.descriptionLongEn) ? partner.descriptionLongEn : partner.descriptionLong %}
  66.                     {% if descLongHtml %}
  67.                         <div class="text-gray-700 leading-relaxed
  68.                                     [&_h2]:text-2xl [&_h2]:font-semibold [&_h2]:text-gray-900 [&_h2]:mt-8 [&_h2]:mb-4
  69.                                     [&_p]:mb-4 [&_ul]:mb-4 [&_ul]:pl-5 [&_li]:mb-2">
  70.                             {{ descLongHtml|raw }}
  71.                         </div>
  72.                     {% elseif descLong %}
  73.                         <div class="text-gray-700 leading-relaxed">
  74.                             {{ descLong|nl2br }}
  75.                         </div>
  76.                     {% elseif not practiceDescription %}
  77.                         <div class="text-gray-700 leading-relaxed">
  78.                             <h2 class="text-2xl font-semibold text-gray-900 mb-4">
  79.                                 {{ language == 'en' ? 'About ' ~ partner.displayName : 'Über ' ~ partner.displayName }}
  80.                             </h2>
  81.                             <p>
  82.                                 {% if language == 'en' %}
  83.                                     {{ partner.displayName }} is a valued partner in the STARTPLATZ network. As part of our ecosystem, they support startups and entrepreneurs with their expertise and services.
  84.                                 {% else %}
  85.                                     {{ partner.displayName }} ist ein geschätzter Partner im STARTPLATZ-Netzwerk. Als Teil unseres Ökosystems unterstützen sie Startups und Unternehmer mit ihrer Expertise und ihren Dienstleistungen.
  86.                                 {% endif %}
  87.                             </p>
  88.                         </div>
  89.                     {% endif %}
  90.                     {# Signals Section #}
  91.                     {% if signals is not empty %}
  92.                         <div>
  93.                             <h2 class="text-xl font-semibold text-gray-900 mb-6 text-center">
  94.                                 {{ language == 'en' ? 'What We Know' : 'Was wir wissen' }}
  95.                             </h2>
  96.                             <div class="grid grid-cols-1 md:grid-cols-2 gap-5">
  97.                                 {% set signalColors = {
  98.                                     danger: { border: 'border-red-500', bg: 'bg-red-500', text: 'text-red-500' },
  99.                                     warning: { border: 'border-yellow-400', bg: 'bg-yellow-400', text: 'text-yellow-600' },
  100.                                     info: { border: 'border-cyan-500', bg: 'bg-cyan-500', text: 'text-cyan-500' },
  101.                                     success: { border: 'border-green-500', bg: 'bg-green-500', text: 'text-green-500' }
  102.                                 } %}
  103.                                 {% set signalIcons = {
  104.                                     'exclamation-triangle': '<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z"/>',
  105.                                     'puzzle-piece': '<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 4a2 2 0 114 0v1a1 1 0 001 1h3a1 1 0 011 1v3a1 1 0 01-1 1h-1a2 2 0 100 4h1a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-1a2 2 0 10-4 0v1a1 1 0 01-1 1H7a1 1 0 01-1-1v-3a1 1 0 00-1-1H4a2 2 0 110-4h1a1 1 0 001-1V7a1 1 0 011-1h3a1 1 0 001-1V4z"/>',
  106.                                     'lightbulb': '<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/>',
  107.                                     'star': '<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/>'
  108.                                 } %}
  109.                                 {% for typeKey, typeConfig in signalTypes %}
  110.                                     {% set typeSignals = signals[typeKey]|default([]) %}
  111.                                     {% if typeSignals|length > 0 %}
  112.                                         {% set colors = signalColors[typeConfig.color] %}
  113.                                         <div class="bg-white rounded-xl p-6 shadow-sm border-l-4 {{ colors.border }}">
  114.                                             <div class="flex items-center gap-3 mb-4">
  115.                                                 <div class="w-10 h-10 rounded-full {{ colors.bg }} flex items-center justify-center text-white flex-shrink-0">
  116.                                                     <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">{{ signalIcons[typeConfig.icon]|raw }}</svg>
  117.                                                 </div>
  118.                                                 <h3 class="text-lg font-semibold text-gray-900">
  119.                                                     {{ language == 'en' ? typeConfig.label_en : typeConfig.label_de }}
  120.                                                 </h3>
  121.                                             </div>
  122.                                             <ul class="space-y-2">
  123.                                                 {% for signal in typeSignals %}
  124.                                                     <li class="flex items-start gap-2 text-sm text-gray-600 py-2 border-b border-gray-100 last:border-0">
  125.                                                         <span class="text-gray-400 font-bold mt-0.5">→</span>
  126.                                                         {{ signal }}
  127.                                                     </li>
  128.                                                 {% endfor %}
  129.                                             </ul>
  130.                                         </div>
  131.                                     {% endif %}
  132.                                 {% endfor %}
  133.                             </div>
  134.                         </div>
  135.                     {% else %}
  136.                         {# No signals placeholder #}
  137.                         <div class="bg-gray-50 rounded-xl p-12 text-center text-gray-500">
  138.                             <svg class="w-12 h-12 mx-auto mb-4 text-gray-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  139.                                 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M13 10V3L4 14h7v7l9-11h-7z"/>
  140.                             </svg>
  141.                             <h4 class="font-semibold text-gray-600 mb-1">{{ language == 'en' ? 'Signals coming soon' : 'Signale folgen' }}</h4>
  142.                             <p class="text-sm">{{ language == 'en' ? "We're working on detailed insights about this partner." : 'Wir arbeiten an detaillierten Einblicken zu diesem Partner.' }}</p>
  143.                         </div>
  144.                     {% endif %}
  145.                 </div>
  146.                 {# Sidebar #}
  147.                 <div class="lg:w-1/3">
  148.                     <div class="sticky top-24 space-y-5">
  149.                         {# Member Benefits CTA #}
  150.                         <div class="bg-gray-50 rounded-xl p-6">
  151.                             <h3 class="text-base font-semibold text-gray-900 mb-3">
  152.                                 {{ language == 'en' ? 'Want to connect?' : 'Interesse an Zusammenarbeit?' }}
  153.                             </h3>
  154.                             <p class="text-sm text-gray-500 mb-4">
  155.                                 {{ language == 'en'
  156.                                     ? 'Login to access detailed information and request an introduction.'
  157.                                     : 'Loggen Sie sich ein, um detaillierte Informationen zu erhalten und eine Vorstellung anzufragen.' }}
  158.                             </p>
  159.                             <a href="{{ path('connect_partner_show', {slug: partner.slug}) }}"
  160.                                class="flex items-center justify-center gap-2 w-full px-5 py-3 rounded-lg text-white font-semibold
  161.                                       bg-gradient-to-r from-[#7ab800] to-[#5a8c00]
  162.                                       hover:-translate-y-0.5 hover:shadow-lg hover:shadow-green-200 transition-all">
  163.                                 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  164.                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/>
  165.                                 </svg>
  166.                                 {{ language == 'en' ? 'View Internal Details' : 'Interne Details ansehen' }}
  167.                             </a>
  168.                         </div>
  169.                         {# Website Link #}
  170.                         {% set metadata = partner.metadata|default({}) %}
  171.                         {% set homepage = metadata.website|default(team ? team.homepage : null) %}
  172.                         {% if homepage %}
  173.                             <div class="bg-gray-50 rounded-xl p-6">
  174.                                 <h3 class="text-base font-semibold text-gray-900 mb-3">Website</h3>
  175.                                 <a href="{{ homepage }}" target="_blank" rel="noopener"
  176.                                    class="flex items-center gap-2 w-full px-4 py-2.5 rounded-lg border border-gray-300 text-gray-700 hover:bg-gray-100 transition-colors text-sm">
  177.                                     <svg class="w-4 h-4 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  178.                                         <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/>
  179.                                     </svg>
  180.                                     <span class="truncate">{{ homepage|replace({'https://': '', 'http://': ''})|trim('/') }}</span>
  181.                                 </a>
  182.                             </div>
  183.                         {% endif %}
  184.                         {# Back to Overview #}
  185.                         <div class="bg-gray-50 rounded-xl p-6">
  186.                             <h3 class="text-base font-semibold text-gray-900 mb-3">
  187.                                 {{ language == 'en' ? 'More Partners' : 'Weitere Partner' }}
  188.                             </h3>
  189.                             <a href="{{ language == 'en' ? path('public_partners_index_en') : path('public_partners_index') }}"
  190.                                class="flex items-center gap-2 w-full px-4 py-2.5 rounded-lg border border-blue-300 text-blue-700 hover:bg-blue-50 transition-colors text-sm">
  191.                                 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  192.                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"/>
  193.                                 </svg>
  194.                                 {{ language == 'en' ? 'All Partners' : 'Alle Partner' }}
  195.                             </a>
  196.                         </div>
  197.                     </div>
  198.                 </div>
  199.             </div>
  200.         </div>
  201.     </section>
  202. {% endblock %}