File size: 9,234 Bytes
56611a5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
document.addEventListener('DOMContentLoaded', () => {
    const app = document.getElementById('app');
    let currentPage = 'home';
    let selectedMission = null;
    let searchTerm = '';
    let selectedPassions = ['all'];
    let favorites = [];
    let showApplicationForm = false;
    let formData = { name: '', email: '', message: '' };

    const passions = [
        { id: 'all', label: 'Toutes', emoji: '✨' },
        { id: 'sustainability', label: 'Durabilité', emoji: '🌱' },
        { id: 'innovation', label: 'Innovation', emoji: '🚀' },
        { id: 'creativity', label: 'Créativité', emoji: '🎨' },
        { id: 'education', label: 'Éducation', emoji: '📚' },
        { id: 'technology', label: 'Technologie', emoji: '💻' },
        { id: 'social-impact', label: 'Impact Social', emoji: '🌍' }
    ];

    const missions = [
        {
            id: 1,
            title: 'Co-créer un atlas visuel de la mode durable parisienne',
            client: 'Atelier Vert',
            avatar: 'AV',
            impact: 8.5,
            emoji: '🌱',
            passions: ['sustainability', 'creativity'],
            tags: ['Durabilité', 'Storytelling', 'Photographie'],
            duration: '3-4 semaines',
            level: 'Défi modéré',
            description: 'Réinventons ensemble comment la mode durable peut transformer l\'industrie parisienne. Cette mission vous invite à créer un atlas visuel qui celebrate les artisans et créateurs qui redéfinissent la mode.',
            fullDescription: 'Rejoignez Atelier Vert pour un projet ambitieux et créatif. Nous cherchons un freelancer passionné par la mode durable pour documenter et raconter les histoires inspirantes des créateurs parisiens. Vous allez créer un atlas visuel complet qui servira de référence pour l\'industrie.',
            requirements: ['Expérience en photographie', 'Sens du storytelling', 'Connaissance de la mode durable'],
            budget: '€3,500 - €5,500',
            location: 'Paris'
        },
        // Other missions...
    ];

    function render() {
        if (currentPage === 'mission-detail' && selectedMission) {
            renderMissionDetail();
        } else {
            renderHome();
        }
    }

    function renderHome() {
        const filteredMissions = missions.filter(mission => {
            const matchesSearch = mission.title.toLowerCase().includes(searchTerm.toLowerCase()) ||
                                 mission.client.toLowerCase().includes(searchTerm.toLowerCase());
            const matchesPassion = selectedPassions.includes('all') || 
                                  mission.passions.some(p => selectedPassions.includes(p));
            return matchesSearch && matchesPassion;
        });

        app.innerHTML = `
            <!-- Hero Section -->
            <section class="max-w-7xl mx-auto px-4 py-20">
                <div class="grid md:grid-cols-2 gap-12 items-center">
                    <div>
                        <h2 class="text-5xl md:text-6xl font-bold text-slate-900 mb-6 leading-tight">
                            Votre prochaine mission est une <span class="bg-gradient-to-r from-purple-600 to-pink-600 bg-clip-text text-transparent">aventure</span>
                        </h2>
                        <p class="text-xl text-slate-600 mb-8">
                            Découvrez un travail significatif qui s'aligne avec vos passions et nourrit votre croissance
                        </p>
                        <button class="px-8 py-4 bg-gradient-to-r from-purple-600 to-pink-600 text-white font-bold rounded-lg hover:shadow-lg transition transform hover:scale-105">
                            Trouver une Mission
                        </button>
                    </div>
                    <div class="grid grid-cols-2 gap-4">
                        ${['🎨', '🚀', '🌱', '💡'].map(emoji => `
                            <div class="aspect-square bg-gradient-to-br from-purple-100 to-pink-100 rounded-2xl flex items-center justify-center text-6xl hover:scale-110 transition">
                                ${emoji}
                            </div>
                        `).join('')}
                    </div>
                </div>
            </section>

            <!-- Search and Filters -->
            <section class="max-w-7xl mx-auto px-4 py-12">
                <div class="bg-white rounded-2xl shadow-lg p-8">
                    <div class="mb-8">
                        <div class="relative">
                            <i data-lucide="search" class="absolute left-4 top-4 text-slate-400"></i>
                            <input
                                type="text"
                                placeholder="Rechercher une mission ou un client..."
                                value="${searchTerm}"
                                class="search-input w-full pl-12 pr-4 py-3 border-2 border-slate-200 rounded-lg focus:outline-none focus:border-purple-500 text-lg"
                            />
                        </div>
                    </div>

                    <div>
                        <h3 class="text-sm font-bold text-slate-600 uppercase tracking-wide mb-4 flex items-center gap-2">
                            <i data-lucide="filter"></i>
                            Filtrer par passion
                        </h3>
                        <div class="flex flex-wrap gap-3">
                            ${passions.map(passion => `
                                <button
                                    data-passion="${passion.id}"
                                    class="passion-btn px-4 py-2 rounded-full font-semibold transition ${
                                        selectedPassions.includes(passion.id)
                                            ? 'bg-gradient-to-r from-purple-600 to-pink-600 text-white shadow-lg'
                                            : 'bg-slate-100 text-slate-700 hover:bg-slate-200'
                                    }"
                                >
                                    ${passion.emoji} ${passion.label}
                                </button>
                            `).join('')}
                        </div>
                    </div>
                </div>

                <p class="text-slate-600 mt-6 text-center">
                    ${filteredMissions.length} mission${filteredMissions.length > 1 ? 's' : ''} trouvée${filteredMissions.length > 1 ? 's' : ''}
                </p>
            </section>

            <!-- Missions Grid -->
            <section class="max-w-7xl mx-auto px-4 pb-20">
                <div class="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
                    ${filteredMissions.map(mission => `
                        <mission-card 
                            data-id="${mission.id}"
                            data-title="${mission.title}"
                            data-client="${mission.client}"
                            data-avatar="${mission.avatar}"
                            data-impact="${mission.impact}"
                            data-emoji="${mission.emoji}"
                            data-description="${mission.description}"
                            data-duration="${mission.duration}"
                            data-tags="${JSON.stringify(mission.tags)}"
                            ${favorites.includes(mission.id) ? 'favorite' : ''}
                        ></mission-card>
                    `).join('')}
                </div>

                ${filteredMissions.length === 0 ? `
                    <div class="text-center py-20">
                        <div class="text-6xl mb-4">🔍</div>
                        <h3 class="text-2xl font-bold text-slate-900 mb-2">Aucune mission trouvée</h3>
                        <p class="text-slate-600">Essayez d'ajuster vos filtres ou votre recherche</p>
                    </div>
                ` : ''}
            </section>
        `;

        // Initialize Lucide icons
        if (window.lucide) {
            lucide.createIcons();
        }

        // Add event listeners
        document.querySelectorAll('.search-input').forEach(input => {
            input.addEventListener('input', (e) => {
                searchTerm = e.target.value;
                render();
            });
        });

        document.querySelectorAll('.passion-btn').forEach(btn => {
            btn.addEventListener('click', (e) => {
                const passionId = e.currentTarget.dataset.passion;
                togglePassion(passionId);
            });
        });
    }

    function renderMissionDetail() {
        // Mission detail rendering logic...
    }

    function togglePassion(passionId) {
        if (passionId === 'all') {
            selectedPassions = ['all'];
        } else {
            const updated = selectedPassions.filter(p => p !== 'all');
            if (updated.includes(passionId)) {
                selectedPassions = updated.filter(p => p !== passionId);
            } else {
                selectedPassions = [...updated, passionId];
            }
        }
        render();
    }

    // Initial render
    render();
});