diff --git a/site/blueprints/pages/about.yml b/site/blueprints/pages/about.yml new file mode 100644 index 0000000..b0c3841 --- /dev/null +++ b/site/blueprints/pages/about.yml @@ -0,0 +1,79 @@ +title: À propos +icon: users + +tabs: + # Contenu + content: + label: Contenu + icon: text + columns: + - width: 2/3 + sections: + intro: + type: fields + fields: + intro_headline: + type: headline + label: Introduction + intro_title: + label: Titre principal + type: text + required: true + help: "Ex: NOUS FAISONS JOUER LE MONDE." + intro_text: + label: Sous-titre + type: textarea + size: small + principal_text: + label: Texte principal + type: textarea + size: small + - width: 1/3 + sections: + team: + type: fields + fields: + team_headline: + type: headline + label: Équipe + team_title: + label: Titre section Équipe + type: text + default: "Notre Équipe" + team_members: + label: Membres de l'équipe + type: structure + fields: + name: + label: Nom + type: text + required: true + width: 1/2 + role: + label: Poste + type: text + required: true + width: 1/2 + help: "Ex: CEO & Co-Founder" + photo: + label: Photo + type: files + max: 1 + uploads: + template: image + # SEO + seo: + label: SEO + icon: search + sections: + meta: + type: fields + fields: + meta_title: + label: Meta Title + type: text + meta_description: + label: Meta Description + type: textarea + size: small + maxlength: 160 diff --git a/site/blueprints/pages/article.yml b/site/blueprints/pages/article.yml new file mode 100644 index 0000000..7d00b91 --- /dev/null +++ b/site/blueprints/pages/article.yml @@ -0,0 +1,103 @@ +title: Article +icon: article + +status: + draft: + label: Brouillon + text: L'article n'est pas visible + unlisted: + label: Non listé + text: L'article est accessible mais pas dans la liste + listed: + label: Publié + text: L'article est visible publiquement + +columns: + # Colonne principale + main: + width: 2/3 + sections: + # En-tête + header: + type: fields + fields: + title: + label: Titre de l'article + type: text + required: true + intro: + label: Introduction / Chapeau + type: textarea + size: small + help: "Résumé ou accroche de l'article" + + # Contenu + content: + type: fields + fields: + article_content: + label: Contenu de l'article + type: blocks + fieldsets: + heading: + label: Titre + type: heading + text: + label: Texte + type: text + quote: + label: Citation + type: quote + image: + label: Image + type: image + list: + label: Liste + type: list + video: + label: Vidéo + type: video + + # Sidebar + sidebar: + width: 1/3 + sections: + # Métadonnées + meta: + type: fields + fields: + date: + label: Date de publication + type: date + required: true + default: today + cover: + label: Image de couverture + type: files + max: 1 + uploads: + template: image + + # Recommandations + related: + type: fields + fields: + related_articles: + label: Articles recommandés + type: pages + query: site.find('blog').children.listed + max: 3 + help: "Articles similaires à afficher en bas de page" + + # SEO + seo: + type: fields + fields: + meta_title: + label: Meta Title + type: text + meta_description: + label: Meta Description + type: textarea + size: small + maxlength: 160 diff --git a/site/blueprints/pages/blog.yml b/site/blueprints/pages/blog.yml new file mode 100644 index 0000000..8acc670 --- /dev/null +++ b/site/blueprints/pages/blog.yml @@ -0,0 +1,50 @@ +title: Blog +icon: text + +tabs: + # Intro + intro: + label: Introduction + icon: text + sections: + content: + type: fields + fields: + intro_title: + label: Titre + type: text + default: "NOS ARTICLES." + intro_text: + label: Texte d'introduction + type: textarea + size: small + help: "On décrypte pour vous les ressorts de la gamification, ses actualités et des cas d'étude." + articles_list: + label: Articles + type: pages + headline: Liste des articles + layout: cards + size: medium + image: + cover: true + template: article + info: "{{ page.date.toDate('d/m/Y') }}" + create: article + sortBy: date desc + + # SEO + seo: + label: SEO + icon: search + sections: + meta: + type: fields + fields: + meta_title: + label: Meta Title + type: text + meta_description: + label: Meta Description + type: textarea + size: small + maxlength: 160 diff --git a/site/blueprints/pages/expertise.yml b/site/blueprints/pages/expertise.yml new file mode 100644 index 0000000..6afc7b6 --- /dev/null +++ b/site/blueprints/pages/expertise.yml @@ -0,0 +1,54 @@ +title: Expertise +icon: wand + +tabs: + # Intro + intro: + label: Introduction + icon: text + columns: + - width: 2/3 + sections: + content: + type: fields + fields: + intro_title: + label: Titre principal + type: text + required: true + help: "Ex: PLAY THE REAL." + contenu: + label: Contenu + type: blocks + fieldsets: + text: + label: Texte + type: text + - width: 1/3 + sections: + media: + type: fields + fields: + video: + label: Vidéo d'arrière-plan + type: files + max: 1 + uploads: + template: image + + # SEO + seo: + label: SEO + icon: search + sections: + meta: + type: fields + fields: + meta_title: + label: Meta Title + type: text + meta_description: + label: Meta Description + type: textarea + size: small + maxlength: 160 diff --git a/site/blueprints/pages/game.yml b/site/blueprints/pages/game.yml new file mode 100644 index 0000000..f905629 --- /dev/null +++ b/site/blueprints/pages/game.yml @@ -0,0 +1,86 @@ +title: Jeu +icon: play + +# status: +# draft: +# label: Brouillon +# text: Le jeu n'est pas visible +# unlisted: +# label: Non listé +# text: Le jeu est accessible mais pas dans la liste +# listed: +# label: Publié +# text: Le jeu est visible publiquement + +columns: + # Colonne principale + main: + width: 2/3 + sections: + # Informations principales + info: + type: fields + fields: + title: + label: Nom du jeu + type: text + required: true + help: "Ex: Mozzle" + description: + label: Description + type: textarea + size: medium + help: "Un thème, 5 mots cachés... mais chacun a une lettre manquante !" + rules: + label: Règles du jeu + type: blocks + fieldsets: + - heading + - text + - list + + # Sidebar + sidebar: + width: 1/3 + sections: + # Visuel + visual: + type: fields + fields: + cover: + label: Image de couverture + type: files + max: 1 + uploads: + template: image + badge: + label: Badge + type: select + options: + none: Aucun + new: NEW + coming_soon: Coming Soon + popular: Populaire + + # Statut et liens + status: + type: fields + fields: + game_status: + label: Statut du jeu + type: select + required: true + default: available + options: + available: Disponible + coming_soon: Bientôt disponible + maintenance: En maintenance + play_link: + label: Lien pour jouer + type: url + help: "URL vers le jeu intégré ou externe" + is_embedded: + label: Jeu intégré + type: toggle + text: Le jeu s'affiche directement sur la page + default: true diff --git a/site/blueprints/pages/home.yml b/site/blueprints/pages/home.yml new file mode 100644 index 0000000..a8f21d0 --- /dev/null +++ b/site/blueprints/pages/home.yml @@ -0,0 +1,59 @@ +title: Accueil +icon: home + +tabs: + # Hero Section + hero: + label: Hero + icon: star + columns: + - width: 2/3 + sections: + hero_content: + type: fields + fields: + hero_title: + label: Titre principal + type: text + required: true + help: "Ex: PLAY TO ENGAGE" + hero_subtitle: + label: Sous-titre + type: textarea + size: small + help: "Ex: Nous transformons les interactions en défis pertinents et gratifiants" + hero_cta_text: + label: Texte du bouton CTA + type: text + default: Explorer + hero_cta_link: + label: Lien du bouton CTA + type: pages + max: 1 + - width: 1/3 + sections: + media: + type: fields + fields: + video: + label: Vidéo d'arrière-plan + type: files + max: 1 + uploads: + template: image + # SEO + seo: + label: SEO + icon: search + sections: + meta: + type: fields + fields: + meta_title: + label: Meta Title + type: text + meta_description: + label: Meta Description + type: textarea + size: small + maxlength: 160 diff --git a/site/blueprints/pages/jouer.yml b/site/blueprints/pages/jouer.yml new file mode 100644 index 0000000..76bdc2f --- /dev/null +++ b/site/blueprints/pages/jouer.yml @@ -0,0 +1,53 @@ +title: Jouer +icon: play + +tabs: + # Intro + intro: + label: Introduction + icon: text + sections: + content: + type: fields + fields: + intro_title: + label: Titre + type: text + default: Jouer + intro_text: + label: Texte d'introduction + type: textarea + size: small + + # Jeux + games: + label: Jeux + icon: grid + sections: + games_list: + type: pages + headline: Liste des jeux + layout: cards + size: medium + image: + cover: true + template: game + info: "{{ page.status_label }}" + create: game + + # SEO + seo: + label: SEO + icon: search + sections: + meta: + type: fields + fields: + meta_title: + label: Meta Title + type: text + meta_description: + label: Meta Description + type: textarea + size: small + maxlength: 160 diff --git a/site/blueprints/pages/portfolio.yml b/site/blueprints/pages/portfolio.yml new file mode 100644 index 0000000..5e0ceb5 --- /dev/null +++ b/site/blueprints/pages/portfolio.yml @@ -0,0 +1,45 @@ +title: Portfolio +icon: grid + +tabs: + content: + label: Contenu + icon: text + sections: + # Intro + intro: + type: fields + fields: + intro_title: + label: Titre + type: text + default: Portfolio + + # Projets + projects_list: + type: pages + headline: Liste des projets + layout: list + size: medium + image: + cover: true + template: project + info: "{{ page.category }}" + create: project + + # SEO + seo: + label: SEO + icon: search + sections: + meta: + type: fields + fields: + meta_title: + label: Meta Title + type: text + meta_description: + label: Meta Description + type: textarea + size: small + maxlength: 160 diff --git a/site/blueprints/pages/project.yml b/site/blueprints/pages/project.yml new file mode 100644 index 0000000..7194d38 --- /dev/null +++ b/site/blueprints/pages/project.yml @@ -0,0 +1,84 @@ +title: Projet +icon: image + +status: + draft: + label: Brouillon + text: Le projet n'est pas visible + unlisted: + label: Non listé + text: Le projet est accessible mais pas dans la liste + listed: + label: Publié + text: Le projet est visible publiquement + +columns: + # Colonne principale + main: + width: 2/3 + sections: + # Informations principales + info: + type: fields + fields: + title: + label: Nom du projet + type: text + required: true + tagline: + label: Tagline + type: text + help: "Ex: Transformez votre lecture en aventure." + description: + label: Description + type: textarea + size: medium + help: Description complète du projet + + # Galerie + gallery: + type: files + headline: Galerie d'images + layout: cards + size: medium + template: image + info: "{{ file.dimensions }}" + + # Sidebar + sidebar: + width: 1/3 + sections: + # Métadonnées + meta: + type: fields + fields: + cover: + label: Image de couverture + type: files + max: 1 + uploads: + template: image + category: + label: Catégorie + type: text + impact: + label: Impact + type: text + + # Liens externes + links: + type: fields + fields: + external_links: + label: Liens externes + type: structure + fields: + link_label: + label: Nom du bouton + type: text + width: 1/2 + placeholder: "Ex: App Store, Site web..." + link_url: + label: URL + type: url + width: 1/2 diff --git a/site/blueprints/site.yml b/site/blueprints/site.yml index b7da661..1c06e61 100644 --- a/site/blueprints/site.yml +++ b/site/blueprints/site.yml @@ -1,5 +1,103 @@ -title: Site +title: World Game -sections: - pages: - type: pages +columns: + - width: 1/1 + sections: + pages: + type: pages + label: Réorganisation des pages + layout: list + size: small + sortable: true + create: false + status: listed + + - width: 1/3 + sections: + identity: + type: fields + fields: + identity_headline: + type: headline + label: Le studio + + site_title: + label: Nom du site + type: text + width: 1/2 + + site_tagline: + label: Tagline + type: text + width: 1/2 + + site_description: + label: Description SEO + type: textarea + size: small + + mentions_legales: + label: Mentions légales (PDF) + type: files + max: 1 + width: 1/2 + + - width: 1/3 + sections: + contact: + type: fields + fields: + contact_headline: + type: headline + label: Contact + + contact_email: + label: Email + type: email + width: 1/2 + + contact_phone: + label: Téléphone + type: tel + width: 1/2 + + contact_address: + label: Adresse + type: text + width: 1/2 + placeholder: 33 rue Jean Dupont + + contact_postal: + label: Code postal + type: text + width: 1/2 + placeholder: 75000 Paris + + - width: 1/3 + sections: + social: + type: fields + fields: + social_headline: + type: headline + label: Réseaux sociaux + + social_linkedin: + label: LinkedIn + type: url + width: 1/2 + + social_twitter: + label: Twitter / X + type: url + width: 1/2 + + social_instagram: + label: Instagram + type: url + width: 1/2 + + social_youtube: + label: YouTube + type: url + width: 1/2 diff --git a/site/config/config.php b/site/config/config.php new file mode 100644 index 0000000..29e750b --- /dev/null +++ b/site/config/config.php @@ -0,0 +1,69 @@ + true, + + // Panel configuration + 'panel' => [ + // Menu personnalisé du panel + 'menu' => [ + 'site' => [ + 'label' => 'Site', + 'icon' => 'home', + 'current' => function (string $current): bool { + return $current === 'site'; + } + ], + '-', // Séparateur + 'home' => [ + 'label' => 'Accueil', + 'icon' => 'home', + 'link' => 'pages/home', + ], + 'expertise' => [ + 'label' => 'Expertise', + 'icon' => 'wand', + 'link' => 'pages/expertise', + ], + 'portfolio' => [ + 'label' => 'Portfolio', + 'icon' => 'images', + 'link' => 'pages/portfolio', + ], + 'jouer' => [ + 'label' => 'Jouer', + 'icon' => 'play', + 'link' => 'pages/jouer', + ], + 'a-propos' => [ + 'label' => 'À propos', + 'icon' => 'users', + 'link' => 'pages/a-propos', + ], + 'blog' => [ + 'label' => 'Blog', + 'icon' => 'text', + 'link' => 'pages/blog', + ], + '-', // Séparateur + 'users', + 'system' + ] + ], + + // Langues + 'languages' => false, // Mettre true si multilingue activé + + // Thumbs + 'thumbs' => [ + 'srcsets' => [ + 'default' => [ + '300w' => ['width' => 300], + '600w' => ['width' => 600], + '900w' => ['width' => 900], + '1200w' => ['width' => 1200] + ] + ] + ] +]; diff --git a/site/snippets/footer.php b/site/snippets/footer.php new file mode 100644 index 0000000..e66fffc --- /dev/null +++ b/site/snippets/footer.php @@ -0,0 +1,82 @@ + + + + + + + diff --git a/site/snippets/header.php b/site/snippets/header.php new file mode 100644 index 0000000..8a16298 --- /dev/null +++ b/site/snippets/header.php @@ -0,0 +1,73 @@ + + + + + + + <?= $page->meta_title()->or($page->title() . ' - ' . $site->site_title()) ?> + + + + + + + + + + + + + + cover()->toFile()): ?> + + + + + + diff --git a/site/templates/about.php b/site/templates/about.php new file mode 100644 index 0000000..a6f89ff --- /dev/null +++ b/site/templates/about.php @@ -0,0 +1,81 @@ + + +
+ +
+

intro_title() ?>

+ + intro_text()->isNotEmpty()): ?> +

intro_text() ?>

+ +
+ + + mission_text()->isNotEmpty()): ?> +
+

mission_title() ?>

+
+ mission_text()->toBlocks() ?> +
+
+ + + + manifesto_text()->isNotEmpty()): ?> +
+

manifesto_title() ?>

+
+ manifesto_text()->toBlocks() ?> +
+
+ + + + team_members()->isNotEmpty()): ?> +
+

team_title() ?>

+ +
+ team_members()->toStructure() as $member): ?> +
+ photo()->toFile()): ?> +
+ <?= $member->name() ?> +
+ + +
+

name() ?>

+

role() ?>

+ + bio()->isNotEmpty()): ?> +

bio() ?>

+ + + +
+
+ +
+ + +
+ +
+ + diff --git a/site/templates/article.php b/site/templates/article.php new file mode 100644 index 0000000..c253981 --- /dev/null +++ b/site/templates/article.php @@ -0,0 +1,101 @@ + + +
+
+ +
+ date()->isNotEmpty()): ?> + + + +

title() ?>

+ + intro()->isNotEmpty()): ?> +

intro() ?>

+ +
+ + + author_name()->isNotEmpty()): ?> + + + + + cover()->toFile()): ?> +
+ <?= $page->title() ?> +
+ + + +
+ article_content()->toBlocks() ?> +
+ + + tags()->isNotEmpty()): ?> + + +
+ + + related_articles()->toPages(); + if ($related->isEmpty()) { + $related = $page->siblings()->listed()->not($page)->shuffle()->limit(3); + } + ?> + + isNotEmpty()): ?> +
+

Nos recommandations

+ Voir tous les articles → + +
+ +
+ cover()->toFile()): ?> +
+ <?= $rec->title() ?> +
+ + + category()->isNotEmpty()): ?> + category() ?> + + +

+ title() ?> +

+
+ +
+
+ + + + +
+ + diff --git a/site/templates/blog.php b/site/templates/blog.php new file mode 100644 index 0000000..9250711 --- /dev/null +++ b/site/templates/blog.php @@ -0,0 +1,61 @@ + + +
+ +
+

intro_title() ?>

+ + intro_text()->isNotEmpty()): ?> +

intro_text() ?>

+ +
+ + +
+ children()->listed()->sortBy('date', 'desc') as $article): ?> +
+ + date()->isNotEmpty()): ?> + + + + +
+

+ title() ?> +

+ + intro()->isNotEmpty()): ?> +

intro()->excerpt(200) ?>

+ + + + Lire la suite → + +
+ + +
+ author_photo()->toFile()): ?> + <?= $article->author_name() ?> + + + author_name()->isNotEmpty()): ?> + author_name() ?> + +
+ + + cover()->toFile()): ?> +
+ <?= $article->title() ?> +
+ +
+ +
+
+ + diff --git a/site/templates/expertise.php b/site/templates/expertise.php new file mode 100644 index 0000000..df8392e --- /dev/null +++ b/site/templates/expertise.php @@ -0,0 +1,36 @@ + + +
+ +
+

intro_title() ?>

+ + intro_text()->isNotEmpty()): ?> +

intro_text() ?>

+ +
+ + + expertise_sections()->isNotEmpty()): ?> +
+ expertise_sections()->toStructure() as $section): ?> +
+

title() ?>

+
+ content()->toBlocks() ?> +
+
+ +
+ + + + objective_text()->isNotEmpty()): ?> +
+

objective_title() ?>

+

objective_text() ?>

+
+ +
+ + diff --git a/site/templates/game.php b/site/templates/game.php new file mode 100644 index 0000000..3249014 --- /dev/null +++ b/site/templates/game.php @@ -0,0 +1,58 @@ + + +
+
+ +
+

title() ?>

+ + description()->isNotEmpty()): ?> +

description() ?>

+ + + + rules()->isNotEmpty()): ?> +
+ rules()->toBlocks() ?> +
+ + + + game_status()->value() !== 'available'): ?> +
+ + game_status()->value() === 'coming_soon' ? 'Bientôt disponible' : 'En maintenance' ?> + +
+ +
+ + +
+ game_status()->value() === 'available'): ?> + is_embedded()->toBool() && $page->play_link()->isNotEmpty()): ?> + + play_link()->isNotEmpty()): ?> + + Jouer maintenant + + + + cover()->toFile()): ?> +
+ <?= $page->title() ?> +
+ + +
+
+ + + +
+ + diff --git a/site/templates/home.php b/site/templates/home.php new file mode 100644 index 0000000..8594f41 --- /dev/null +++ b/site/templates/home.php @@ -0,0 +1,49 @@ + + +
+ +
+
+

+ hero_title()->value(); + $highlight = $page->hero_title_highlight()->value(); + if ($highlight) { + echo str_replace($highlight, '' . $highlight . '', $title); + } else { + echo $title; + } + ?> +

+ + hero_subtitle()->isNotEmpty()): ?> +

hero_subtitle() ?>

+ + + hero_cta_text()->isNotEmpty()): ?> + + hero_cta_text() ?> + + +
+ + hero_image()->toFile()): ?> +
+ <?= $page->hero_title() ?> +
+ + + + floating_bubbles()->isNotEmpty()): ?> +
+ floating_bubbles()->toStructure() as $bubble): ?> +
+ text() ?> +
+ +
+ +
+
+ + diff --git a/site/templates/jouer.php b/site/templates/jouer.php new file mode 100644 index 0000000..be348fe --- /dev/null +++ b/site/templates/jouer.php @@ -0,0 +1,57 @@ + + +
+ +
+ intro_title()->isNotEmpty()): ?> +

intro_title() ?>

+ + + intro_text()->isNotEmpty()): ?> +

intro_text() ?>

+ +
+ + +
+ children()->listed() as $game): ?> +
+ + badge()->isNotEmpty() && $game->badge()->value() !== 'none'): ?> + + badge()->value() === 'new' ? 'NEW' : ($game->badge()->value() === 'coming_soon' ? 'INCOMING' : $game->badge()) ?> + + + + + cover()->toFile()): ?> +
+ <?= $game->title() ?> +
+ + + +
+

title() ?>

+ + description()->isNotEmpty()): ?> +

description() ?>

+ + + + game_status()->value() === 'available'): ?> + + Jouer + + + + Bientôt disponible + + +
+
+ +
+
+ + diff --git a/site/templates/portfolio.php b/site/templates/portfolio.php new file mode 100644 index 0000000..41ea880 --- /dev/null +++ b/site/templates/portfolio.php @@ -0,0 +1,109 @@ + + +
+ +
+ intro_title()->isNotEmpty()): ?> +

intro_title() ?>

+ + + intro_text()->isNotEmpty()): ?> +

intro_text() ?>

+ +
+ + +
+ children()->listed(); + $total = $projects->count(); + $index = 0; + ?> + + + +
+ + + + +
+

title() ?>

+ + tagline()->isNotEmpty()): ?> +

tagline() ?>

+ + + description()->isNotEmpty()): ?> +

description() ?>

+ + + +
+ impact()->isNotEmpty()): ?> +
+ Impact: + impact()->join(', ') ?> +
+ + + category()->isNotEmpty()): ?> +
+ Catégorie: + category()->value() ?> +
+ + + platforms()->isNotEmpty()): ?> +
+ Plateformes: + platforms()->join(' / ') ?> +
+ +
+ + + +
+ + +
+ / +
+
+ +
+ + + +
+ + diff --git a/site/templates/project.php b/site/templates/project.php new file mode 100644 index 0000000..6340277 --- /dev/null +++ b/site/templates/project.php @@ -0,0 +1,104 @@ + + +
+
+ + + + +
+

title() ?>

+ + tagline()->isNotEmpty()): ?> +

tagline() ?>

+ + + description()->isNotEmpty()): ?> +
+ description()->kt() ?> +
+ + + +
+ impact()->isNotEmpty()): ?> +
+ Impact: + impact()->join(', ') ?> +
+ + + category()->isNotEmpty()): ?> +
+ Catégorie: + category()->value() ?> +
+ + + platforms()->isNotEmpty()): ?> +
+ Plateformes: + platforms()->join(' / ') ?> +
+ + + client_name()->isNotEmpty()): ?> +
+ Client: + client_name() ?> +
+ +
+ + + +
+
+ + + +
+ +