Compare commits
8 Commits
18306c28b9
...
b0c5e4c20f
| Author | SHA1 | Date | |
|---|---|---|---|
| b0c5e4c20f | |||
| 2304d855b7 | |||
| b45d3a02f0 | |||
| e9d6ca2f96 | |||
| fc6168e5a4 | |||
| 3ec98fdc2d | |||
| 71a48de945 | |||
| 289b777cad |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -8,6 +8,7 @@
|
||||
!/README.md
|
||||
!/composer.*
|
||||
!/phpcs.xml
|
||||
!/project.code-workspace
|
||||
!/wp-content/
|
||||
/wp-content/*
|
||||
|
||||
|
||||
38
composer.lock
generated
38
composer.lock
generated
@@ -315,17 +315,17 @@
|
||||
},
|
||||
{
|
||||
"name": "lewebsimple/acf-phone",
|
||||
"version": "v3.1.0",
|
||||
"version": "v3.1.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/lewebsimple/acf-phone.git",
|
||||
"reference": "cf4c6440e0c2cdf7e422423bb629014204e721bf"
|
||||
"reference": "f9cb86eacb26eb92a40eb5e4366cff3e58e01f47"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://satis.ledevsimple.ca/dist/lewebsimple/acf-phone/lewebsimple-acf-phone-cf4c6440e0c2cdf7e422423bb629014204e721bf-zip-439080.zip",
|
||||
"reference": "cf4c6440e0c2cdf7e422423bb629014204e721bf",
|
||||
"shasum": "f9d7cbcf27985656245285e5bc035578621f1a69"
|
||||
"url": "https://satis.ledevsimple.ca/dist/lewebsimple/acf-phone/lewebsimple-acf-phone-f9cb86eacb26eb92a40eb5e4366cff3e58e01f47-zip-606a09.zip",
|
||||
"reference": "f9cb86eacb26eb92a40eb5e4366cff3e58e01f47",
|
||||
"shasum": "2bbbc7d7f917e278d7d913bcb9da07a30f4662e6"
|
||||
},
|
||||
"require-dev": {
|
||||
"lewebsimple/wp-phpcs-ruleset": "*",
|
||||
@@ -345,10 +345,10 @@
|
||||
]
|
||||
},
|
||||
"support": {
|
||||
"source": "https://github.com/lewebsimple/acf-phone/tree/v3.1.0",
|
||||
"source": "https://github.com/lewebsimple/acf-phone/tree/v3.1.1",
|
||||
"issues": "https://github.com/lewebsimple/acf-phone/issues"
|
||||
},
|
||||
"time": "2026-01-30T15:01:34+00:00"
|
||||
"time": "2026-02-10T17:56:38+00:00"
|
||||
},
|
||||
{
|
||||
"name": "lewebsimple/advanced-custom-fields-pro",
|
||||
@@ -369,20 +369,20 @@
|
||||
},
|
||||
{
|
||||
"name": "lewebsimple/kaliroots",
|
||||
"version": "v0.9.18",
|
||||
"version": "v0.9.19",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "ssh://git@gitea.websimple.com:222/wp-themes/kaliroots.git",
|
||||
"reference": "720554dff6ea45216b52187b7e8d5b87200d55a4"
|
||||
"reference": "40789468328e126cec9bd2f85a6a9923663a8d91"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://satis.ledevsimple.ca/dist/lewebsimple/kaliroots/lewebsimple-kaliroots-v0.9.18-77d6cf.zip",
|
||||
"reference": "720554dff6ea45216b52187b7e8d5b87200d55a4",
|
||||
"shasum": "fd6aea0ef1bc160bc183eb7239cc9adf2fd88169"
|
||||
"url": "https://satis.ledevsimple.ca/dist/lewebsimple/kaliroots/lewebsimple-kaliroots-v0.9.19-12b0b3.zip",
|
||||
"reference": "40789468328e126cec9bd2f85a6a9923663a8d91",
|
||||
"shasum": "0a4cadbbc7719ee7de94b5cff4b2bb9c436f6416"
|
||||
},
|
||||
"type": "wordpress-theme",
|
||||
"time": "2025-10-10T12:11:22+00:00"
|
||||
"time": "2026-02-09T15:07:56+00:00"
|
||||
},
|
||||
{
|
||||
"name": "lewebsimple/wp-graphql-headless-login",
|
||||
@@ -457,15 +457,15 @@
|
||||
},
|
||||
{
|
||||
"name": "wpackagist-plugin/media-focus-point",
|
||||
"version": "2.0.4",
|
||||
"version": "2.0.5",
|
||||
"source": {
|
||||
"type": "svn",
|
||||
"url": "https://plugins.svn.wordpress.org/media-focus-point/",
|
||||
"reference": "tags/2.0.4"
|
||||
"reference": "tags/2.0.5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://downloads.wordpress.org/plugin/media-focus-point.2.0.4.zip"
|
||||
"url": "https://downloads.wordpress.org/plugin/media-focus-point.2.0.5.zip"
|
||||
},
|
||||
"require": {
|
||||
"composer/installers": "^1.0 || ^2.0"
|
||||
@@ -475,15 +475,15 @@
|
||||
},
|
||||
{
|
||||
"name": "wpackagist-plugin/seo-by-rank-math",
|
||||
"version": "1.0.263",
|
||||
"version": "1.0.264",
|
||||
"source": {
|
||||
"type": "svn",
|
||||
"url": "https://plugins.svn.wordpress.org/seo-by-rank-math/",
|
||||
"reference": "tags/1.0.263"
|
||||
"reference": "tags/1.0.264"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://downloads.wordpress.org/plugin/seo-by-rank-math.1.0.263.zip"
|
||||
"url": "https://downloads.wordpress.org/plugin/seo-by-rank-math.1.0.264.zip"
|
||||
},
|
||||
"require": {
|
||||
"composer/installers": "^1.0 || ^2.0"
|
||||
|
||||
30
project.code-workspace
Normal file
30
project.code-workspace
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"name": "Nuxt",
|
||||
"path": "wp-content/themes/moonshine"
|
||||
},
|
||||
{
|
||||
"name": "WordPress",
|
||||
"path": "."
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
"files.associations": {
|
||||
"*.css": "tailwindcss"
|
||||
},
|
||||
"editor.quickSuggestions": {
|
||||
"strings": "on"
|
||||
},
|
||||
"tailwindCSS.classAttributes": [
|
||||
"class",
|
||||
"ui"
|
||||
],
|
||||
"tailwindCSS.experimental.classRegex": [
|
||||
[
|
||||
"ui:\\s*{([^)]*)\\s*}",
|
||||
"(?:'|\"|`)([^']*)(?:'|\"|`)"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -14,7 +14,6 @@
|
||||
"experimentalTailwindcss": {
|
||||
"attributes": ["class"],
|
||||
"functions": ["tv"],
|
||||
"preserveWhitespace": true,
|
||||
"stylesheet": "./app/assets/css/_main.css"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,10 +5,9 @@
|
||||
"name": "Nuxt server",
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/wp-content/themes/moonshine/node_modules/nuxt/bin/nuxt.mjs",
|
||||
"program": "${workspaceFolder}/node_modules/nuxt/bin/nuxt.mjs",
|
||||
"runtimeArgs": ["--inspect"],
|
||||
"args": ["dev"],
|
||||
"cwd": "${workspaceFolder}/wp-content/themes/moonshine",
|
||||
"autoAttachChildProcesses": true,
|
||||
"console": "integratedTerminal",
|
||||
"skipFiles": ["<node_internals>/**"]
|
||||
@@ -20,8 +19,7 @@
|
||||
"sourceMaps": true,
|
||||
"trace": false,
|
||||
"url": "http://localhost:3000",
|
||||
"userDataDir": "${env:HOME}/.vscode/chromium-profile",
|
||||
"webRoot": "${workspaceFolder}/wp-content/themes/moonshine"
|
||||
"userDataDir": "${env:HOME}/.vscode/chromium-profile"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -24,23 +24,12 @@
|
||||
"editor.defaultFormatter": "oxc.oxc-vscode"
|
||||
},
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll.oxc": "always"
|
||||
"source.fixAll": "always"
|
||||
},
|
||||
"editor.defaultFormatter": "oxc.oxc-vscode",
|
||||
"editor.formatOnSave": true,
|
||||
"editor.formatOnSaveMode": "file",
|
||||
"editor.quickSuggestions": {
|
||||
"strings": "on"
|
||||
},
|
||||
"files.associations": {
|
||||
"*.css": "tailwindcss"
|
||||
},
|
||||
"graphql-config.load.rootDir": "wp-content/themes/moonshine",
|
||||
"oxc.fmt.configPath": "wp-content/themes/moonshine/.oxfmtrc.json",
|
||||
"oxc.path.oxfmt": "wp-content/themes/moonshine/node_modules/.bin/oxfmt",
|
||||
"oxc.path.oxlint": "wp-content/themes/moonshine/node_modules/.bin/oxlint",
|
||||
"oxc.tsConfigPath": "wp-content/themes/moonshine/tsconfig.json",
|
||||
"tailwindCSS.classAttributes": ["class", "ui"],
|
||||
"tailwindCSS.experimental.classRegex": [["ui:\\s*{([^)]*)\\s*}", "(?:'|\"|`)([^']*)(?:'|\"|`)"]],
|
||||
"typescript.tsdk": "wp-content/themes/moonshine/node_modules/typescript/lib"
|
||||
"eslint.enable": false
|
||||
}
|
||||
@@ -96,7 +96,11 @@
|
||||
"min": "",
|
||||
"max": "",
|
||||
"acfe_flexible_modal_edit_size": "",
|
||||
"acfe_flexible_settings": ["group_layout_contained"],
|
||||
"acfe_flexible_settings": [
|
||||
"group_layout_colored",
|
||||
"group_layout_contained",
|
||||
"group_layout_padded"
|
||||
],
|
||||
"acfe_flexible_settings_size": "large",
|
||||
"acfe_flexible_render_template": false,
|
||||
"acfe_flexible_render_style": false,
|
||||
@@ -190,7 +194,7 @@
|
||||
"min": "",
|
||||
"max": "",
|
||||
"acfe_flexible_modal_edit_size": "",
|
||||
"acfe_flexible_settings": "",
|
||||
"acfe_flexible_settings": ["group_layout_colored", "group_layout_padded"],
|
||||
"acfe_flexible_settings_size": "large",
|
||||
"acfe_flexible_render_template": false,
|
||||
"acfe_flexible_render_style": false,
|
||||
@@ -236,5 +240,5 @@
|
||||
"graphql_types": "",
|
||||
"acfe_meta": "",
|
||||
"acfe_note": "",
|
||||
"modified": 1769779666
|
||||
"modified": 1770740697
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
"show_in_graphql": 1,
|
||||
"graphql_description": "",
|
||||
"graphql_field_name": "profiles",
|
||||
"graphql_non_null": 1,
|
||||
"graphql_non_null": 0,
|
||||
"rows_per_page": 20,
|
||||
"sub_fields": [
|
||||
{
|
||||
@@ -72,7 +72,9 @@
|
||||
"description": "",
|
||||
"show_in_rest": 0,
|
||||
"display_title": "",
|
||||
"acfe_autosync": ["json"],
|
||||
"acfe_autosync": [
|
||||
"json"
|
||||
],
|
||||
"acfe_form": 0,
|
||||
"show_in_graphql": 1,
|
||||
"graphql_field_name": "GroupAbstractSocial",
|
||||
@@ -80,5 +82,5 @@
|
||||
"graphql_types": "",
|
||||
"acfe_meta": "",
|
||||
"acfe_note": "",
|
||||
"modified": 1769788591
|
||||
"modified": 1770821599
|
||||
}
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"key": "group_layout_colored",
|
||||
"title": "Layout - Colored",
|
||||
"fields": [
|
||||
{
|
||||
"key": "field_693c8c945ce51",
|
||||
"label": "Variante de couleur",
|
||||
"name": "color",
|
||||
"aria-label": "",
|
||||
"type": "button_group",
|
||||
"instructions": "",
|
||||
"required": 1,
|
||||
"conditional_logic": 0,
|
||||
"wrapper": {
|
||||
"width": "",
|
||||
"class": "",
|
||||
"id": ""
|
||||
},
|
||||
"choices": {
|
||||
"default": "Par défaut",
|
||||
"muted": "Atténué",
|
||||
"elevated": "Surélevé",
|
||||
"accented": "Accentué",
|
||||
"inverted": "Inversé",
|
||||
"primary": "Couleur principale"
|
||||
},
|
||||
"default_value": "default",
|
||||
"return_format": "value",
|
||||
"allow_null": 0,
|
||||
"allow_in_bindings": 0,
|
||||
"layout": "horizontal",
|
||||
"show_in_graphql": 1,
|
||||
"graphql_description": "",
|
||||
"graphql_field_name": "color",
|
||||
"graphql_non_null": 1
|
||||
}
|
||||
],
|
||||
"location": [
|
||||
[
|
||||
{
|
||||
"param": "abstract"
|
||||
}
|
||||
]
|
||||
],
|
||||
"menu_order": 0,
|
||||
"position": "normal",
|
||||
"style": "seamless",
|
||||
"label_placement": "top",
|
||||
"instruction_placement": "label",
|
||||
"hide_on_screen": "",
|
||||
"active": true,
|
||||
"description": "",
|
||||
"show_in_rest": 0,
|
||||
"display_title": "",
|
||||
"acfe_autosync": ["json"],
|
||||
"acfe_form": 0,
|
||||
"show_in_graphql": 1,
|
||||
"graphql_field_name": "GroupLayoutColored",
|
||||
"map_graphql_types_from_location_rules": 0,
|
||||
"graphql_types": "",
|
||||
"acfe_meta": "",
|
||||
"acfe_note": "",
|
||||
"modified": 1770132035
|
||||
}
|
||||
@@ -4,10 +4,10 @@
|
||||
"fields": [
|
||||
{
|
||||
"key": "field_68dc29d78941c",
|
||||
"label": "Conteneur",
|
||||
"label": "Largeur du contenu",
|
||||
"name": "container",
|
||||
"aria-label": "",
|
||||
"type": "select",
|
||||
"type": "button_group",
|
||||
"instructions": "",
|
||||
"required": 1,
|
||||
"conditional_logic": 0,
|
||||
@@ -21,101 +21,17 @@
|
||||
"xl": "1280px",
|
||||
"lg": "1024px",
|
||||
"fluid": "Largeur fluide",
|
||||
"none": "Pleine largeur"
|
||||
"fullbleed": "Pleine largeur"
|
||||
},
|
||||
"default_value": "default",
|
||||
"return_format": "value",
|
||||
"multiple": 0,
|
||||
"max": "",
|
||||
"prepend": "",
|
||||
"append": "",
|
||||
"required_message": "",
|
||||
"allow_null": 0,
|
||||
"allow_in_bindings": 0,
|
||||
"ui": 0,
|
||||
"layout": "horizontal",
|
||||
"show_in_graphql": 1,
|
||||
"graphql_description": "",
|
||||
"graphql_field_name": "container",
|
||||
"graphql_non_null": 1,
|
||||
"ajax": 0,
|
||||
"placeholder": "",
|
||||
"create_options": 0,
|
||||
"save_options": 0,
|
||||
"allow_custom": 0,
|
||||
"search_placeholder": "",
|
||||
"min": ""
|
||||
},
|
||||
{
|
||||
"key": "field_693c8c3b5ce50",
|
||||
"label": "Espacement vertical",
|
||||
"name": "vertical_padding",
|
||||
"aria-label": "",
|
||||
"type": "select",
|
||||
"instructions": "",
|
||||
"required": 1,
|
||||
"conditional_logic": 0,
|
||||
"wrapper": {
|
||||
"width": "",
|
||||
"class": "",
|
||||
"id": ""
|
||||
},
|
||||
"choices": {
|
||||
"sm": "Petit (12px)",
|
||||
"md": "Medium (24px)",
|
||||
"lg": "Grand (48px)"
|
||||
},
|
||||
"default_value": "md",
|
||||
"return_format": "value",
|
||||
"multiple": 0,
|
||||
"allow_null": 0,
|
||||
"allow_in_bindings": 0,
|
||||
"ui": 0,
|
||||
"show_in_graphql": 1,
|
||||
"graphql_description": "",
|
||||
"graphql_field_name": "verticalPadding",
|
||||
"graphql_non_null": 1,
|
||||
"ajax": 0,
|
||||
"placeholder": "",
|
||||
"create_options": 0,
|
||||
"save_options": 0,
|
||||
"allow_custom": 0,
|
||||
"search_placeholder": ""
|
||||
},
|
||||
{
|
||||
"key": "field_693c8c945ce51",
|
||||
"label": "Couleur d'arrière-plan",
|
||||
"name": "bg_color",
|
||||
"aria-label": "",
|
||||
"type": "select",
|
||||
"instructions": "",
|
||||
"required": 1,
|
||||
"conditional_logic": 0,
|
||||
"wrapper": {
|
||||
"width": "",
|
||||
"class": "",
|
||||
"id": ""
|
||||
},
|
||||
"choices": {
|
||||
"default": "Par défaut",
|
||||
"muted": "Atténué",
|
||||
"inverted": "Inversé"
|
||||
},
|
||||
"default_value": "default",
|
||||
"return_format": "value",
|
||||
"multiple": 0,
|
||||
"allow_null": 0,
|
||||
"allow_in_bindings": 0,
|
||||
"ui": 0,
|
||||
"show_in_graphql": 1,
|
||||
"graphql_description": "",
|
||||
"graphql_field_name": "bgColor",
|
||||
"graphql_non_null": 1,
|
||||
"ajax": 0,
|
||||
"placeholder": "",
|
||||
"create_options": 0,
|
||||
"save_options": 0,
|
||||
"allow_custom": 0,
|
||||
"search_placeholder": ""
|
||||
"graphql_non_null": 1
|
||||
}
|
||||
],
|
||||
"location": [
|
||||
@@ -143,5 +59,5 @@
|
||||
"graphql_types": "",
|
||||
"acfe_meta": "",
|
||||
"acfe_note": "",
|
||||
"modified": 1768358794
|
||||
"modified": 1770740626
|
||||
}
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
{
|
||||
"key": "group_layout_padded",
|
||||
"title": "Layout - Padded",
|
||||
"fields": [
|
||||
{
|
||||
"key": "field_693c8c3b5ce50",
|
||||
"label": "Espacement intérieur vertical",
|
||||
"name": "vertical_padding",
|
||||
"aria-label": "",
|
||||
"type": "button_group",
|
||||
"instructions": "",
|
||||
"required": 1,
|
||||
"conditional_logic": 0,
|
||||
"wrapper": {
|
||||
"width": "",
|
||||
"class": "",
|
||||
"id": ""
|
||||
},
|
||||
"choices": {
|
||||
"none": "Aucun",
|
||||
"sm": "Petit (12px)",
|
||||
"md": "Medium (24px)",
|
||||
"lg": "Grand (48px)"
|
||||
},
|
||||
"default_value": "md",
|
||||
"return_format": "value",
|
||||
"allow_null": 0,
|
||||
"allow_in_bindings": 0,
|
||||
"layout": "horizontal",
|
||||
"show_in_graphql": 1,
|
||||
"graphql_description": "",
|
||||
"graphql_field_name": "verticalPadding",
|
||||
"graphql_non_null": 1
|
||||
}
|
||||
],
|
||||
"location": [
|
||||
[
|
||||
{
|
||||
"param": "abstract"
|
||||
}
|
||||
]
|
||||
],
|
||||
"menu_order": 0,
|
||||
"position": "normal",
|
||||
"style": "default",
|
||||
"label_placement": "left",
|
||||
"instruction_placement": "label",
|
||||
"hide_on_screen": "",
|
||||
"active": true,
|
||||
"description": "",
|
||||
"show_in_rest": 0,
|
||||
"display_title": "",
|
||||
"acfe_autosync": ["json"],
|
||||
"acfe_form": 0,
|
||||
"show_in_graphql": 1,
|
||||
"graphql_field_name": "GroupLayoutPadded",
|
||||
"map_graphql_types_from_location_rules": 0,
|
||||
"graphql_types": "",
|
||||
"acfe_meta": "",
|
||||
"acfe_note": "",
|
||||
"modified": 1770740636
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
"fields": [
|
||||
{
|
||||
"key": "field_697220310aaaf",
|
||||
"label": "Email",
|
||||
"label": "Courriel",
|
||||
"name": "email",
|
||||
"aria-label": "",
|
||||
"type": "email",
|
||||
@@ -28,7 +28,7 @@
|
||||
},
|
||||
{
|
||||
"key": "field_697cbf414fdd5",
|
||||
"label": "Phone number",
|
||||
"label": "Numéro de téléphone",
|
||||
"name": "phone_number",
|
||||
"aria-label": "",
|
||||
"type": "phone",
|
||||
@@ -55,7 +55,7 @@
|
||||
"aria-label": "",
|
||||
"type": "clone",
|
||||
"instructions": "",
|
||||
"required": 1,
|
||||
"required": 0,
|
||||
"conditional_logic": 0,
|
||||
"wrapper": {
|
||||
"width": "",
|
||||
@@ -63,7 +63,9 @@
|
||||
"id": ""
|
||||
},
|
||||
"graphql_field_name": "social",
|
||||
"clone": ["group_abstract_social"],
|
||||
"clone": [
|
||||
"group_abstract_social"
|
||||
],
|
||||
"display": "seamless",
|
||||
"layout": "block",
|
||||
"prefix_label": 0,
|
||||
@@ -95,6 +97,9 @@
|
||||
"graphql_description": "",
|
||||
"graphql_field_name": "links",
|
||||
"graphql_non_null": 0,
|
||||
"acfe_group_modal_close": 0,
|
||||
"acfe_group_modal_button": "",
|
||||
"acfe_group_modal_size": "large",
|
||||
"sub_fields": [
|
||||
{
|
||||
"key": "field_697cc93e234cd",
|
||||
@@ -117,10 +122,7 @@
|
||||
"graphql_field_name": "contact",
|
||||
"graphql_non_null": 1
|
||||
}
|
||||
],
|
||||
"acfe_group_modal_close": 0,
|
||||
"acfe_group_modal_button": "",
|
||||
"acfe_group_modal_size": "large"
|
||||
]
|
||||
}
|
||||
],
|
||||
"location": [
|
||||
@@ -142,7 +144,9 @@
|
||||
"description": "",
|
||||
"show_in_rest": 0,
|
||||
"display_title": "",
|
||||
"acfe_autosync": ["json"],
|
||||
"acfe_autosync": [
|
||||
"json"
|
||||
],
|
||||
"acfe_form": 0,
|
||||
"show_in_graphql": 1,
|
||||
"graphql_field_name": "GroupSiteOptions",
|
||||
@@ -150,5 +154,5 @@
|
||||
"graphql_types": "",
|
||||
"acfe_meta": "",
|
||||
"acfe_note": "",
|
||||
"modified": 1769788698
|
||||
"modified": 1770820358
|
||||
}
|
||||
|
||||
@@ -9,5 +9,15 @@ export default defineAppConfig({
|
||||
base: "cursor-pointer",
|
||||
},
|
||||
},
|
||||
input: {
|
||||
slots: {
|
||||
root: "w-full",
|
||||
},
|
||||
},
|
||||
textarea: {
|
||||
slots: {
|
||||
root: "w-full",
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
fragment LayoutColored on GroupLayoutColored_Fields {
|
||||
color
|
||||
}
|
||||
@@ -1,5 +1,3 @@
|
||||
fragment LayoutContained on GroupLayoutContained_Fields {
|
||||
container
|
||||
verticalPadding
|
||||
bgColor
|
||||
}
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { LayoutContainedFragment } from "#graphql/operations";
|
||||
import { tv, type VariantProps } from "tailwind-variants";
|
||||
|
||||
const props = defineProps<LayoutContainedFragment>();
|
||||
|
||||
const layoutWrapperVariants = tv({
|
||||
slots: {
|
||||
base: "",
|
||||
inner: "",
|
||||
},
|
||||
variants: {
|
||||
container: {
|
||||
default: { inner: "container" },
|
||||
lg: { inner: "container-lg" },
|
||||
xl: { inner: "container-xl" },
|
||||
fluid: { inner: "container-fluid" },
|
||||
none: { inner: "container-none" },
|
||||
},
|
||||
verticalPadding: {
|
||||
sm: { base: "py-3" },
|
||||
md: { base: "py-6" },
|
||||
lg: { base: "py-12" },
|
||||
},
|
||||
bgColor: {
|
||||
default: { base: "bg-default" },
|
||||
muted: { base: "bg-muted" },
|
||||
inverted: { base: "bg-inverted text-inverted" },
|
||||
},
|
||||
},
|
||||
defaultVariants: {
|
||||
container: "default",
|
||||
verticalPadding: "md",
|
||||
bgColor: "default",
|
||||
},
|
||||
});
|
||||
const { base, inner } = layoutWrapperVariants({
|
||||
container: props.container[0],
|
||||
verticalPadding: props.verticalPadding[0],
|
||||
bgColor: props.bgColor[0],
|
||||
} as VariantProps<typeof layoutWrapperVariants>);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<section :class="base()">
|
||||
<div :class="inner()">
|
||||
<slot />
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
@@ -0,0 +1,3 @@
|
||||
fragment LayoutPadded on GroupLayoutPadded_Fields {
|
||||
verticalPadding
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
<script setup lang="ts">
|
||||
const props = defineProps<{ layoutSettings?: LayoutSettings }>();
|
||||
const { base, inner } = useLayoutWrapper(props.layoutSettings);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<section :class="base()">
|
||||
<div :class="inner()">
|
||||
<slot />
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
@@ -6,9 +6,7 @@ defineProps<NodePageFragment>();
|
||||
|
||||
<template>
|
||||
<div id="node-page">
|
||||
<h1 v-if="!isFrontPage" class="text-4xl font-bold">
|
||||
{{ title }}
|
||||
</h1>
|
||||
<PageHeader v-if="!isFrontPage" :title="title"></PageHeader>
|
||||
<BuilderSections :sections="groupPostPage?.sections || []" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
<script setup lang="ts">
|
||||
defineProps<{
|
||||
title?: string;
|
||||
}>();
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<header v-if="title" class="bg-accented py-6">
|
||||
<div class="container">
|
||||
<h1 class="heading-1">
|
||||
{{ title }}
|
||||
</h1>
|
||||
</div>
|
||||
</header>
|
||||
</template>
|
||||
@@ -1,11 +1,13 @@
|
||||
<script setup lang="ts">
|
||||
const { isLoggedIn } = useAuth();
|
||||
const { isRedirecting } = useAuthConnexion();
|
||||
const layoutSettings: LayoutWrapperProps = {
|
||||
container: "lg",
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<section data-section-name="auth-connexion" class="py-12">
|
||||
<div class="container-sm">
|
||||
<LayoutWrapper data-section-name="auth-connexion" :layout-settings="layoutSettings">
|
||||
<AuthState>
|
||||
<AuthRedirecting v-if="isRedirecting" />
|
||||
<template v-else>
|
||||
@@ -13,6 +15,5 @@ const { isRedirecting } = useAuthConnexion();
|
||||
<AuthLoginForm v-else />
|
||||
</template>
|
||||
</AuthState>
|
||||
</div>
|
||||
</section>
|
||||
</LayoutWrapper>
|
||||
</template>
|
||||
|
||||
@@ -2,4 +2,8 @@ fragment SectionHeroSplit on GroupAbstractBuilderSectionsHeroSplitLayout {
|
||||
content
|
||||
reverse
|
||||
...AcfMedia
|
||||
layoutSettings {
|
||||
...LayoutColored
|
||||
...LayoutPadded
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,8 +3,8 @@ import { tv, type VariantProps } from "tailwind-variants";
|
||||
import type { SectionHeroSplitFragment } from "#graphql/operations";
|
||||
|
||||
const tvSectionHeroSplit = tv({
|
||||
extend: tvLayoutWrapper,
|
||||
slots: {
|
||||
base: "py-6",
|
||||
container: "container flex flex-col items-center gap-6",
|
||||
content: "flex-1",
|
||||
media: "w-full basis-1/2",
|
||||
@@ -27,6 +27,7 @@ const tvSectionHeroSplit = tv({
|
||||
const props = defineProps<SectionHeroSplitFragment>();
|
||||
const classes = tvSectionHeroSplit({
|
||||
reverse: props.reverse,
|
||||
...props.layoutSettings,
|
||||
} as VariantProps<typeof tvSectionHeroSplit>);
|
||||
</script>
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
fragment SectionTextBlock on GroupAbstractBuilderSectionsTextBlockLayout {
|
||||
content
|
||||
layoutSettings {
|
||||
...LayoutColored
|
||||
...LayoutContained
|
||||
...LayoutPadded
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ defineProps<SectionTextBlockFragment>();
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<LayoutContained data-section-type="text-block" v-bind="layoutSettings!">
|
||||
<LayoutWrapper data-section-type="text-block" :layout-settings="layoutSettings">
|
||||
<UiProse :content="content" />
|
||||
</LayoutContained>
|
||||
</LayoutWrapper>
|
||||
</template>
|
||||
|
||||
@@ -6,7 +6,14 @@ const { connexionButton } = useAuthConnexion();
|
||||
<div class="bg-inverted py-1.5 text-inverted">
|
||||
<div class="container flex flex-col items-center gap-3 sm:flex-row">
|
||||
<SiteFooterCopyright class="sm:mr-auto" />
|
||||
<UButton v-bind="connexionButton" color="neutral" variant="link" />
|
||||
<AuthState>
|
||||
<AcfLinkButton
|
||||
:link="connexionButton.link"
|
||||
:icon="connexionButton.icon"
|
||||
color="neutral"
|
||||
variant="link"
|
||||
/>
|
||||
</AuthState>
|
||||
<SiteFooterCredits />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
10
wp-content/themes/moonshine/app/components/ui/UiLoadMore.vue
Normal file
10
wp-content/themes/moonshine/app/components/ui/UiLoadMore.vue
Normal file
@@ -0,0 +1,10 @@
|
||||
<script setup lang="ts">
|
||||
defineProps<{ hasNextPage: boolean; isLoadingMore: boolean }>();
|
||||
defineEmits<{ loadMore: [] }>();
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="hasNextPage" class="flex justify-center">
|
||||
<UButton @click="$emit('loadMore')" :loading="isLoadingMore"> En voir plus </UButton>
|
||||
</div>
|
||||
</template>
|
||||
@@ -70,11 +70,13 @@ export function useAuthConnexion() {
|
||||
}
|
||||
}
|
||||
|
||||
// Dynamic connexion link
|
||||
// Dynamic connexion link / icon
|
||||
const connexionButton = computed(() => ({
|
||||
label: isLoggedIn.value ? "Déconnexion" : "Connexion",
|
||||
link: parseAcfLink({
|
||||
title: isLoggedIn.value ? "Déconnexion" : "Connexion",
|
||||
url: "/connexion",
|
||||
}),
|
||||
icon: isLoggedIn.value ? "i-lucide-log-out" : "i-lucide-log-in",
|
||||
to: "/connexion",
|
||||
}));
|
||||
|
||||
return { isRedirecting, login, logout, connexionButton };
|
||||
|
||||
@@ -4,5 +4,5 @@ export const useGeneralSettings = () =>
|
||||
{},
|
||||
{
|
||||
transform: ({ generalSettings }) => generalSettings,
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
import { tv, type VariantProps } from "tailwind-variants";
|
||||
import * as z from "zod";
|
||||
|
||||
// Tailwind Variants for LayoutWrapper
|
||||
export const tvLayoutWrapper = tv({
|
||||
slots: {
|
||||
base: "",
|
||||
inner: "",
|
||||
},
|
||||
variants: {
|
||||
// LayoutColored
|
||||
color: {
|
||||
default: { base: "bg-default" },
|
||||
muted: { base: "bg-muted" },
|
||||
elevated: { base: "bg-elevated" },
|
||||
accented: { base: "bg-accented" },
|
||||
inverted: { base: "bg-inverted text-inverted" },
|
||||
primary: { base: "bg-primary text-inverted" },
|
||||
},
|
||||
// LayoutContained
|
||||
container: {
|
||||
default: { inner: "container" },
|
||||
xl: { inner: "container-xl" },
|
||||
lg: { inner: "container-lg" },
|
||||
fluid: { inner: "container-fluid" },
|
||||
fullbleed: { inner: "container-fullbleed" },
|
||||
},
|
||||
// LayoutPadded
|
||||
verticalPadding: {
|
||||
sm: { base: "py-3" },
|
||||
md: { base: "py-6" },
|
||||
lg: { base: "py-12" },
|
||||
none: {},
|
||||
},
|
||||
},
|
||||
defaultVariants: {
|
||||
color: "default",
|
||||
container: "default",
|
||||
verticalPadding: "md",
|
||||
},
|
||||
});
|
||||
|
||||
export type LayoutWrapperProps = VariantProps<typeof tvLayoutWrapper>;
|
||||
|
||||
// Zod schemas for validating layout settings
|
||||
const colorEnum = z.enum(["default", "muted", "elevated", "accented", "inverted", "primary"]);
|
||||
const containerEnum = z.enum(["default", "xl", "lg", "fluid", "fullbleed"]);
|
||||
const verticalPaddingEnum = z.enum(["sm", "md", "lg", "none"]);
|
||||
|
||||
const layoutSettingsSchema = z.object({
|
||||
color: z.string().pipe(colorEnum).optional(),
|
||||
container: z.string().pipe(containerEnum).optional(),
|
||||
verticalPadding: z.string().pipe(verticalPaddingEnum).optional(),
|
||||
});
|
||||
|
||||
export type LayoutSettings = z.input<typeof layoutSettingsSchema>;
|
||||
|
||||
export function useLayoutWrapper(input?: LayoutSettings) {
|
||||
try {
|
||||
return tvLayoutWrapper(layoutSettingsSchema.parse(input));
|
||||
} catch {
|
||||
return tvLayoutWrapper();
|
||||
}
|
||||
}
|
||||
@@ -4,5 +4,5 @@ export const useSiteOptions = () =>
|
||||
{},
|
||||
{
|
||||
transform: ({ siteOptions }) => siteOptions?.groupSiteOptions,
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
fragment PageInfo on WPPageInfo {
|
||||
hasNextPage
|
||||
endCursor
|
||||
}
|
||||
18
wp-content/themes/moonshine/app/middleware/hasRole.ts
Normal file
18
wp-content/themes/moonshine/app/middleware/hasRole.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
export default defineNuxtRouteMiddleware((to) => {
|
||||
const { hasRole, isLoggedIn } = useAuth();
|
||||
if (!isLoggedIn.value) {
|
||||
return navigateTo({ path: "/connexion", query: { redirect: to.fullPath } });
|
||||
}
|
||||
if (!hasRole(to.meta.hasRole || "")) {
|
||||
return abortNavigation({
|
||||
statusCode: 403,
|
||||
message: "Vous n'avez pas les permissions requises pour accéder à cette page.",
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
declare module "#app" {
|
||||
interface PageMeta {
|
||||
hasRole?: string;
|
||||
}
|
||||
}
|
||||
12
wp-content/themes/moonshine/app/middleware/isAdmin.ts
Normal file
12
wp-content/themes/moonshine/app/middleware/isAdmin.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
export default defineNuxtRouteMiddleware((to) => {
|
||||
const { isAdmin, isLoggedIn } = useAuth();
|
||||
if (!isLoggedIn.value) {
|
||||
return navigateTo({ path: "/connexion", query: { redirect: to.fullPath } });
|
||||
}
|
||||
if (!isAdmin.value) {
|
||||
return abortNavigation({
|
||||
statusCode: 403,
|
||||
message: "Vous n'avez pas les permissions requises pour accéder à cette page.",
|
||||
});
|
||||
}
|
||||
});
|
||||
6
wp-content/themes/moonshine/app/middleware/isLoggedIn.ts
Normal file
6
wp-content/themes/moonshine/app/middleware/isLoggedIn.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
export default defineNuxtRouteMiddleware((to) => {
|
||||
const { isLoggedIn } = useAuth();
|
||||
if (!isLoggedIn.value) {
|
||||
return navigateTo({ path: "/connexion", query: { redirect: to.fullPath } });
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,6 @@
|
||||
export default defineNuxtRouteMiddleware((to) => {
|
||||
const { isLoggedIn } = useAuth();
|
||||
if (isLoggedIn.value) {
|
||||
return navigateTo({ path: "/connexion", query: { redirect: to.fullPath } });
|
||||
}
|
||||
});
|
||||
@@ -1,4 +1,4 @@
|
||||
{
|
||||
"schema": "./server/graphql/schema.graphql",
|
||||
"schema": "./.nuxt/graphql/schema.gql",
|
||||
"documents": "**/*.gql"
|
||||
}
|
||||
@@ -78,6 +78,7 @@ export default defineNuxtConfig({
|
||||
wp: { type: "remote", endpoint: `${wpUrl}/graphql`, hooks: ["server/graphql/wp-hooks"] },
|
||||
},
|
||||
},
|
||||
saveSDL: ".nuxt/graphql/schema.gql",
|
||||
},
|
||||
|
||||
image: {
|
||||
|
||||
@@ -24,28 +24,28 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@iconify-json/cib": "^1.2.3",
|
||||
"@iconify-json/lucide": "^1.2.88",
|
||||
"@lewebsimple/nuxt-graphql": "^0.6.8",
|
||||
"@iconify-json/lucide": "^1.2.90",
|
||||
"@lewebsimple/nuxt-graphql": "^0.6.10",
|
||||
"@nuxt/image": "^2.0.0",
|
||||
"@nuxt/ui": "4.3.0",
|
||||
"@nuxtjs/device": "4.0.0",
|
||||
"@nuxtjs/seo": "^3.4.0",
|
||||
"jwt-decode": "^4.0.0",
|
||||
"nuxt": "^4.3.0",
|
||||
"nuxt": "^4.3.1",
|
||||
"nuxt-auth-utils": "^0.5.28",
|
||||
"nuxt-svgo": "^4.2.6",
|
||||
"tailwindcss": "^4.1.18",
|
||||
"vue": "^3.5.27",
|
||||
"vue": "^3.5.28",
|
||||
"vue-router": "^4.6.4",
|
||||
"zod": "^4.3.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"changelogen": "^0.6.2",
|
||||
"oxfmt": "^0.28.0",
|
||||
"oxlint": "^1.43.0",
|
||||
"oxlint": "^1.46.0",
|
||||
"typescript": "^5.9.3",
|
||||
"vue-tsc": "^3.2.4",
|
||||
"wrangler": "^4.62.0"
|
||||
"wrangler": "^4.64.0"
|
||||
},
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
|
||||
2435
wp-content/themes/moonshine/pnpm-lock.yaml
generated
2435
wp-content/themes/moonshine/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user