8 Commits

Author SHA1 Message Date
b0c5e4c20f fix: Abstract social profiles should not be non-null
All checks were successful
Deployment / wordpress (push) Successful in 9s
Deployment / nuxt (push) Successful in 1m7s
2026-02-11 09:53:31 -05:00
2304d855b7 minor: site footer, auth connextion, input w-full 2026-02-11 09:26:21 -05:00
b45d3a02f0 chore: update deps 2026-02-11 09:25:29 -05:00
e9d6ca2f96 feat: UiLoadMore 2026-02-11 09:24:41 -05:00
fc6168e5a4 feat: auth middleware 2026-02-11 09:24:19 -05:00
3ec98fdc2d feat: useLayoutWrapper 2026-02-11 09:24:05 -05:00
71a48de945 feat: project.code-workspace 2026-02-11 09:11:11 -05:00
289b777cad chore: update plugins 2026-02-11 09:05:46 -05:00
42 changed files with 1774 additions and 26048 deletions

1
.gitignore vendored
View File

@@ -8,6 +8,7 @@
!/README.md !/README.md
!/composer.* !/composer.*
!/phpcs.xml !/phpcs.xml
!/project.code-workspace
!/wp-content/ !/wp-content/
/wp-content/* /wp-content/*

38
composer.lock generated
View File

@@ -315,17 +315,17 @@
}, },
{ {
"name": "lewebsimple/acf-phone", "name": "lewebsimple/acf-phone",
"version": "v3.1.0", "version": "v3.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/lewebsimple/acf-phone.git", "url": "https://github.com/lewebsimple/acf-phone.git",
"reference": "cf4c6440e0c2cdf7e422423bb629014204e721bf" "reference": "f9cb86eacb26eb92a40eb5e4366cff3e58e01f47"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://satis.ledevsimple.ca/dist/lewebsimple/acf-phone/lewebsimple-acf-phone-cf4c6440e0c2cdf7e422423bb629014204e721bf-zip-439080.zip", "url": "https://satis.ledevsimple.ca/dist/lewebsimple/acf-phone/lewebsimple-acf-phone-f9cb86eacb26eb92a40eb5e4366cff3e58e01f47-zip-606a09.zip",
"reference": "cf4c6440e0c2cdf7e422423bb629014204e721bf", "reference": "f9cb86eacb26eb92a40eb5e4366cff3e58e01f47",
"shasum": "f9d7cbcf27985656245285e5bc035578621f1a69" "shasum": "2bbbc7d7f917e278d7d913bcb9da07a30f4662e6"
}, },
"require-dev": { "require-dev": {
"lewebsimple/wp-phpcs-ruleset": "*", "lewebsimple/wp-phpcs-ruleset": "*",
@@ -345,10 +345,10 @@
] ]
}, },
"support": { "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" "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", "name": "lewebsimple/advanced-custom-fields-pro",
@@ -369,20 +369,20 @@
}, },
{ {
"name": "lewebsimple/kaliroots", "name": "lewebsimple/kaliroots",
"version": "v0.9.18", "version": "v0.9.19",
"source": { "source": {
"type": "git", "type": "git",
"url": "ssh://git@gitea.websimple.com:222/wp-themes/kaliroots.git", "url": "ssh://git@gitea.websimple.com:222/wp-themes/kaliroots.git",
"reference": "720554dff6ea45216b52187b7e8d5b87200d55a4" "reference": "40789468328e126cec9bd2f85a6a9923663a8d91"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://satis.ledevsimple.ca/dist/lewebsimple/kaliroots/lewebsimple-kaliroots-v0.9.18-77d6cf.zip", "url": "https://satis.ledevsimple.ca/dist/lewebsimple/kaliroots/lewebsimple-kaliroots-v0.9.19-12b0b3.zip",
"reference": "720554dff6ea45216b52187b7e8d5b87200d55a4", "reference": "40789468328e126cec9bd2f85a6a9923663a8d91",
"shasum": "fd6aea0ef1bc160bc183eb7239cc9adf2fd88169" "shasum": "0a4cadbbc7719ee7de94b5cff4b2bb9c436f6416"
}, },
"type": "wordpress-theme", "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", "name": "lewebsimple/wp-graphql-headless-login",
@@ -457,15 +457,15 @@
}, },
{ {
"name": "wpackagist-plugin/media-focus-point", "name": "wpackagist-plugin/media-focus-point",
"version": "2.0.4", "version": "2.0.5",
"source": { "source": {
"type": "svn", "type": "svn",
"url": "https://plugins.svn.wordpress.org/media-focus-point/", "url": "https://plugins.svn.wordpress.org/media-focus-point/",
"reference": "tags/2.0.4" "reference": "tags/2.0.5"
}, },
"dist": { "dist": {
"type": "zip", "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": { "require": {
"composer/installers": "^1.0 || ^2.0" "composer/installers": "^1.0 || ^2.0"
@@ -475,15 +475,15 @@
}, },
{ {
"name": "wpackagist-plugin/seo-by-rank-math", "name": "wpackagist-plugin/seo-by-rank-math",
"version": "1.0.263", "version": "1.0.264",
"source": { "source": {
"type": "svn", "type": "svn",
"url": "https://plugins.svn.wordpress.org/seo-by-rank-math/", "url": "https://plugins.svn.wordpress.org/seo-by-rank-math/",
"reference": "tags/1.0.263" "reference": "tags/1.0.264"
}, },
"dist": { "dist": {
"type": "zip", "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": { "require": {
"composer/installers": "^1.0 || ^2.0" "composer/installers": "^1.0 || ^2.0"

30
project.code-workspace Normal file
View 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*}",
"(?:'|\"|`)([^']*)(?:'|\"|`)"
]
]
}
}

View File

@@ -14,7 +14,6 @@
"experimentalTailwindcss": { "experimentalTailwindcss": {
"attributes": ["class"], "attributes": ["class"],
"functions": ["tv"], "functions": ["tv"],
"preserveWhitespace": true,
"stylesheet": "./app/assets/css/_main.css" "stylesheet": "./app/assets/css/_main.css"
} }
} }

View File

@@ -5,10 +5,9 @@
"name": "Nuxt server", "name": "Nuxt server",
"type": "node", "type": "node",
"request": "launch", "request": "launch",
"program": "${workspaceFolder}/wp-content/themes/moonshine/node_modules/nuxt/bin/nuxt.mjs", "program": "${workspaceFolder}/node_modules/nuxt/bin/nuxt.mjs",
"runtimeArgs": ["--inspect"], "runtimeArgs": ["--inspect"],
"args": ["dev"], "args": ["dev"],
"cwd": "${workspaceFolder}/wp-content/themes/moonshine",
"autoAttachChildProcesses": true, "autoAttachChildProcesses": true,
"console": "integratedTerminal", "console": "integratedTerminal",
"skipFiles": ["<node_internals>/**"] "skipFiles": ["<node_internals>/**"]
@@ -20,8 +19,7 @@
"sourceMaps": true, "sourceMaps": true,
"trace": false, "trace": false,
"url": "http://localhost:3000", "url": "http://localhost:3000",
"userDataDir": "${env:HOME}/.vscode/chromium-profile", "userDataDir": "${env:HOME}/.vscode/chromium-profile"
"webRoot": "${workspaceFolder}/wp-content/themes/moonshine"
} }
] ]
} }

View File

@@ -24,23 +24,12 @@
"editor.defaultFormatter": "oxc.oxc-vscode" "editor.defaultFormatter": "oxc.oxc-vscode"
}, },
"editor.codeActionsOnSave": { "editor.codeActionsOnSave": {
"source.fixAll.oxc": "always" "source.fixAll": "always"
}, },
"editor.defaultFormatter": "oxc.oxc-vscode", "editor.defaultFormatter": "oxc.oxc-vscode",
"editor.formatOnSave": true, "editor.formatOnSave": true,
"editor.formatOnSaveMode": "file",
"editor.quickSuggestions": { "editor.quickSuggestions": {
"strings": "on" "strings": "on"
}, },
"files.associations": { "eslint.enable": false
"*.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"
} }

View File

@@ -96,7 +96,11 @@
"min": "", "min": "",
"max": "", "max": "",
"acfe_flexible_modal_edit_size": "", "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_settings_size": "large",
"acfe_flexible_render_template": false, "acfe_flexible_render_template": false,
"acfe_flexible_render_style": false, "acfe_flexible_render_style": false,
@@ -190,7 +194,7 @@
"min": "", "min": "",
"max": "", "max": "",
"acfe_flexible_modal_edit_size": "", "acfe_flexible_modal_edit_size": "",
"acfe_flexible_settings": "", "acfe_flexible_settings": ["group_layout_colored", "group_layout_padded"],
"acfe_flexible_settings_size": "large", "acfe_flexible_settings_size": "large",
"acfe_flexible_render_template": false, "acfe_flexible_render_template": false,
"acfe_flexible_render_style": false, "acfe_flexible_render_style": false,
@@ -236,5 +240,5 @@
"graphql_types": "", "graphql_types": "",
"acfe_meta": "", "acfe_meta": "",
"acfe_note": "", "acfe_note": "",
"modified": 1769779666 "modified": 1770740697
} }

View File

@@ -1,84 +1,86 @@
{ {
"key": "group_abstract_social", "key": "group_abstract_social",
"title": "Abstract - Social", "title": "Abstract - Social",
"fields": [ "fields": [
{
"key": "field_6855a1d643408",
"label": "Médias sociaux",
"name": "profiles",
"aria-label": "",
"type": "repeater",
"instructions": "",
"required": 0,
"conditional_logic": 0,
"wrapper": {
"width": "",
"class": "",
"id": ""
},
"acfe_repeater_stylised_button": 0,
"layout": "table",
"pagination": 0,
"min": 0,
"max": 0,
"collapsed": "",
"button_label": "Ajouter un élément",
"show_in_graphql": 1,
"graphql_description": "",
"graphql_field_name": "profiles",
"graphql_non_null": 1,
"rows_per_page": 20,
"sub_fields": [
{ {
"key": "field_6855a7e143409", "key": "field_6855a1d643408",
"label": "URL", "label": "Médias sociaux",
"name": "url", "name": "profiles",
"aria-label": "", "aria-label": "",
"type": "url", "type": "repeater",
"instructions": "", "instructions": "",
"required": 1, "required": 0,
"conditional_logic": 0, "conditional_logic": 0,
"wrapper": { "wrapper": {
"width": "", "width": "",
"class": "", "class": "",
"id": "" "id": ""
}, },
"default_value": "", "acfe_repeater_stylised_button": 0,
"allow_in_bindings": 0, "layout": "table",
"placeholder": "", "pagination": 0,
"show_in_graphql": 1, "min": 0,
"graphql_description": "", "max": 0,
"graphql_field_name": "url", "collapsed": "",
"graphql_non_null": 1, "button_label": "Ajouter un élément",
"parent_repeater": "field_6855a1d643408" "show_in_graphql": 1,
"graphql_description": "",
"graphql_field_name": "profiles",
"graphql_non_null": 0,
"rows_per_page": 20,
"sub_fields": [
{
"key": "field_6855a7e143409",
"label": "URL",
"name": "url",
"aria-label": "",
"type": "url",
"instructions": "",
"required": 1,
"conditional_logic": 0,
"wrapper": {
"width": "",
"class": "",
"id": ""
},
"default_value": "",
"allow_in_bindings": 0,
"placeholder": "",
"show_in_graphql": 1,
"graphql_description": "",
"graphql_field_name": "url",
"graphql_non_null": 1,
"parent_repeater": "field_6855a1d643408"
}
]
} }
] ],
} "location": [
], [
"location": [ {
[ "param": "abstract"
{ }
"param": "abstract" ]
} ],
] "menu_order": 0,
], "position": "normal",
"menu_order": 0, "style": "seamless",
"position": "normal", "label_placement": "top",
"style": "seamless", "instruction_placement": "label",
"label_placement": "top", "hide_on_screen": "",
"instruction_placement": "label", "active": true,
"hide_on_screen": "", "description": "",
"active": true, "show_in_rest": 0,
"description": "", "display_title": "",
"show_in_rest": 0, "acfe_autosync": [
"display_title": "", "json"
"acfe_autosync": ["json"], ],
"acfe_form": 0, "acfe_form": 0,
"show_in_graphql": 1, "show_in_graphql": 1,
"graphql_field_name": "GroupAbstractSocial", "graphql_field_name": "GroupAbstractSocial",
"map_graphql_types_from_location_rules": 0, "map_graphql_types_from_location_rules": 0,
"graphql_types": "", "graphql_types": "",
"acfe_meta": "", "acfe_meta": "",
"acfe_note": "", "acfe_note": "",
"modified": 1769788591 "modified": 1770821599
} }

View File

@@ -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
}

View File

@@ -4,10 +4,10 @@
"fields": [ "fields": [
{ {
"key": "field_68dc29d78941c", "key": "field_68dc29d78941c",
"label": "Conteneur", "label": "Largeur du contenu",
"name": "container", "name": "container",
"aria-label": "", "aria-label": "",
"type": "select", "type": "button_group",
"instructions": "", "instructions": "",
"required": 1, "required": 1,
"conditional_logic": 0, "conditional_logic": 0,
@@ -21,101 +21,17 @@
"xl": "1280px", "xl": "1280px",
"lg": "1024px", "lg": "1024px",
"fluid": "Largeur fluide", "fluid": "Largeur fluide",
"none": "Pleine largeur" "fullbleed": "Pleine largeur"
}, },
"default_value": "default", "default_value": "default",
"return_format": "value", "return_format": "value",
"multiple": 0,
"max": "",
"prepend": "",
"append": "",
"required_message": "",
"allow_null": 0, "allow_null": 0,
"allow_in_bindings": 0, "allow_in_bindings": 0,
"ui": 0, "layout": "horizontal",
"show_in_graphql": 1, "show_in_graphql": 1,
"graphql_description": "", "graphql_description": "",
"graphql_field_name": "container", "graphql_field_name": "container",
"graphql_non_null": 1, "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": ""
} }
], ],
"location": [ "location": [
@@ -143,5 +59,5 @@
"graphql_types": "", "graphql_types": "",
"acfe_meta": "", "acfe_meta": "",
"acfe_note": "", "acfe_note": "",
"modified": 1768358794 "modified": 1770740626
} }

View File

@@ -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
}

View File

@@ -1,154 +1,158 @@
{ {
"key": "group_options_site", "key": "group_options_site",
"title": "Options - Site", "title": "Options - Site",
"fields": [ "fields": [
{
"key": "field_697220310aaaf",
"label": "Email",
"name": "email",
"aria-label": "",
"type": "email",
"instructions": "",
"required": 1,
"conditional_logic": 0,
"wrapper": {
"width": "",
"class": "",
"id": ""
},
"default_value": "",
"allow_in_bindings": 0,
"placeholder": "",
"prepend": "",
"append": "",
"show_in_graphql": 1,
"graphql_description": "",
"graphql_field_name": "email",
"graphql_non_null": 1
},
{
"key": "field_697cbf414fdd5",
"label": "Phone number",
"name": "phone_number",
"aria-label": "",
"type": "phone",
"instructions": "",
"required": 1,
"conditional_logic": 0,
"wrapper": {
"width": "",
"class": "",
"id": ""
},
"initial_country": "CA",
"return_format": "national",
"allow_in_bindings": 0,
"show_in_graphql": 1,
"graphql_description": "",
"graphql_field_name": "phoneNumber",
"graphql_non_null": 1
},
{
"key": "field_697cd4c5fc56a",
"label": "Médias sociaux",
"name": "social",
"aria-label": "",
"type": "clone",
"instructions": "",
"required": 1,
"conditional_logic": 0,
"wrapper": {
"width": "",
"class": "",
"id": ""
},
"graphql_field_name": "social",
"clone": ["group_abstract_social"],
"display": "seamless",
"layout": "block",
"prefix_label": 0,
"prefix_name": 0,
"acfe_seamless_style": 0,
"acfe_clone_modal": 0,
"acfe_clone_modal_close": 0,
"acfe_clone_modal_button": "",
"acfe_clone_modal_size": "large"
},
{
"key": "field_697cc921234cc",
"label": "Liens globaux",
"name": "links",
"aria-label": "",
"type": "group",
"instructions": "",
"required": 0,
"conditional_logic": 0,
"wrapper": {
"width": "",
"class": "",
"id": ""
},
"layout": "row",
"acfe_seamless_style": 0,
"acfe_group_modal": 0,
"show_in_graphql": 1,
"graphql_description": "",
"graphql_field_name": "links",
"graphql_non_null": 0,
"sub_fields": [
{ {
"key": "field_697cc93e234cd", "key": "field_697220310aaaf",
"label": "Contact", "label": "Courriel",
"name": "contact", "name": "email",
"aria-label": "", "aria-label": "",
"type": "link", "type": "email",
"instructions": "", "instructions": "",
"required": 1, "required": 1,
"conditional_logic": 0, "conditional_logic": 0,
"wrapper": { "wrapper": {
"width": "", "width": "",
"class": "", "class": "",
"id": "" "id": ""
}, },
"return_format": "array", "default_value": "",
"allow_in_bindings": 0, "allow_in_bindings": 0,
"show_in_graphql": 1, "placeholder": "",
"graphql_description": "", "prepend": "",
"graphql_field_name": "contact", "append": "",
"graphql_non_null": 1 "show_in_graphql": 1,
"graphql_description": "",
"graphql_field_name": "email",
"graphql_non_null": 1
},
{
"key": "field_697cbf414fdd5",
"label": "Numéro de téléphone",
"name": "phone_number",
"aria-label": "",
"type": "phone",
"instructions": "",
"required": 1,
"conditional_logic": 0,
"wrapper": {
"width": "",
"class": "",
"id": ""
},
"initial_country": "CA",
"return_format": "national",
"allow_in_bindings": 0,
"show_in_graphql": 1,
"graphql_description": "",
"graphql_field_name": "phoneNumber",
"graphql_non_null": 1
},
{
"key": "field_697cd4c5fc56a",
"label": "Médias sociaux",
"name": "social",
"aria-label": "",
"type": "clone",
"instructions": "",
"required": 0,
"conditional_logic": 0,
"wrapper": {
"width": "",
"class": "",
"id": ""
},
"graphql_field_name": "social",
"clone": [
"group_abstract_social"
],
"display": "seamless",
"layout": "block",
"prefix_label": 0,
"prefix_name": 0,
"acfe_seamless_style": 0,
"acfe_clone_modal": 0,
"acfe_clone_modal_close": 0,
"acfe_clone_modal_button": "",
"acfe_clone_modal_size": "large"
},
{
"key": "field_697cc921234cc",
"label": "Liens globaux",
"name": "links",
"aria-label": "",
"type": "group",
"instructions": "",
"required": 0,
"conditional_logic": 0,
"wrapper": {
"width": "",
"class": "",
"id": ""
},
"layout": "row",
"acfe_seamless_style": 0,
"acfe_group_modal": 0,
"show_in_graphql": 1,
"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",
"label": "Contact",
"name": "contact",
"aria-label": "",
"type": "link",
"instructions": "",
"required": 1,
"conditional_logic": 0,
"wrapper": {
"width": "",
"class": "",
"id": ""
},
"return_format": "array",
"allow_in_bindings": 0,
"show_in_graphql": 1,
"graphql_description": "",
"graphql_field_name": "contact",
"graphql_non_null": 1
}
]
} }
], ],
"acfe_group_modal_close": 0, "location": [
"acfe_group_modal_button": "", [
"acfe_group_modal_size": "large" {
} "param": "options_page",
], "operator": "==",
"location": [ "value": "site-options"
[ }
{ ]
"param": "options_page", ],
"operator": "==", "menu_order": 0,
"value": "site-options" "position": "normal",
} "style": "seamless",
] "label_placement": "top",
], "instruction_placement": "label",
"menu_order": 0, "hide_on_screen": "",
"position": "normal", "active": true,
"style": "seamless", "description": "",
"label_placement": "top", "show_in_rest": 0,
"instruction_placement": "label", "display_title": "",
"hide_on_screen": "", "acfe_autosync": [
"active": true, "json"
"description": "", ],
"show_in_rest": 0, "acfe_form": 0,
"display_title": "", "show_in_graphql": 1,
"acfe_autosync": ["json"], "graphql_field_name": "GroupSiteOptions",
"acfe_form": 0, "map_graphql_types_from_location_rules": 0,
"show_in_graphql": 1, "graphql_types": "",
"graphql_field_name": "GroupSiteOptions", "acfe_meta": "",
"map_graphql_types_from_location_rules": 0, "acfe_note": "",
"graphql_types": "", "modified": 1770820358
"acfe_meta": "",
"acfe_note": "",
"modified": 1769788698
} }

View File

@@ -9,5 +9,15 @@ export default defineAppConfig({
base: "cursor-pointer", base: "cursor-pointer",
}, },
}, },
input: {
slots: {
root: "w-full",
},
},
textarea: {
slots: {
root: "w-full",
},
},
}, },
}); });

View File

@@ -0,0 +1,3 @@
fragment LayoutColored on GroupLayoutColored_Fields {
color
}

View File

@@ -1,5 +1,3 @@
fragment LayoutContained on GroupLayoutContained_Fields { fragment LayoutContained on GroupLayoutContained_Fields {
container container
verticalPadding
bgColor
} }

View File

@@ -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>

View File

@@ -0,0 +1,3 @@
fragment LayoutPadded on GroupLayoutPadded_Fields {
verticalPadding
}

View File

@@ -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>

View File

@@ -6,9 +6,7 @@ defineProps<NodePageFragment>();
<template> <template>
<div id="node-page"> <div id="node-page">
<h1 v-if="!isFrontPage" class="text-4xl font-bold"> <PageHeader v-if="!isFrontPage" :title="title"></PageHeader>
{{ title }}
</h1>
<BuilderSections :sections="groupPostPage?.sections || []" /> <BuilderSections :sections="groupPostPage?.sections || []" />
</div> </div>
</template> </template>

View File

@@ -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>

View File

@@ -1,18 +1,19 @@
<script setup lang="ts"> <script setup lang="ts">
const { isLoggedIn } = useAuth(); const { isLoggedIn } = useAuth();
const { isRedirecting } = useAuthConnexion(); const { isRedirecting } = useAuthConnexion();
const layoutSettings: LayoutWrapperProps = {
container: "lg",
};
</script> </script>
<template> <template>
<section data-section-name="auth-connexion" class="py-12"> <LayoutWrapper data-section-name="auth-connexion" :layout-settings="layoutSettings">
<div class="container-sm"> <AuthState>
<AuthState> <AuthRedirecting v-if="isRedirecting" />
<AuthRedirecting v-if="isRedirecting" /> <template v-else>
<template v-else> <AuthLogoutForm v-if="isLoggedIn" />
<AuthLogoutForm v-if="isLoggedIn" /> <AuthLoginForm v-else />
<AuthLoginForm v-else /> </template>
</template> </AuthState>
</AuthState> </LayoutWrapper>
</div>
</section>
</template> </template>

View File

@@ -2,4 +2,8 @@ fragment SectionHeroSplit on GroupAbstractBuilderSectionsHeroSplitLayout {
content content
reverse reverse
...AcfMedia ...AcfMedia
layoutSettings {
...LayoutColored
...LayoutPadded
}
} }

View File

@@ -3,8 +3,8 @@ import { tv, type VariantProps } from "tailwind-variants";
import type { SectionHeroSplitFragment } from "#graphql/operations"; import type { SectionHeroSplitFragment } from "#graphql/operations";
const tvSectionHeroSplit = tv({ const tvSectionHeroSplit = tv({
extend: tvLayoutWrapper,
slots: { slots: {
base: "py-6",
container: "container flex flex-col items-center gap-6", container: "container flex flex-col items-center gap-6",
content: "flex-1", content: "flex-1",
media: "w-full basis-1/2", media: "w-full basis-1/2",
@@ -27,6 +27,7 @@ const tvSectionHeroSplit = tv({
const props = defineProps<SectionHeroSplitFragment>(); const props = defineProps<SectionHeroSplitFragment>();
const classes = tvSectionHeroSplit({ const classes = tvSectionHeroSplit({
reverse: props.reverse, reverse: props.reverse,
...props.layoutSettings,
} as VariantProps<typeof tvSectionHeroSplit>); } as VariantProps<typeof tvSectionHeroSplit>);
</script> </script>

View File

@@ -1,6 +1,8 @@
fragment SectionTextBlock on GroupAbstractBuilderSectionsTextBlockLayout { fragment SectionTextBlock on GroupAbstractBuilderSectionsTextBlockLayout {
content content
layoutSettings { layoutSettings {
...LayoutColored
...LayoutContained ...LayoutContained
...LayoutPadded
} }
} }

View File

@@ -5,7 +5,7 @@ defineProps<SectionTextBlockFragment>();
</script> </script>
<template> <template>
<LayoutContained data-section-type="text-block" v-bind="layoutSettings!"> <LayoutWrapper data-section-type="text-block" :layout-settings="layoutSettings">
<UiProse :content="content" /> <UiProse :content="content" />
</LayoutContained> </LayoutWrapper>
</template> </template>

View File

@@ -6,7 +6,14 @@ const { connexionButton } = useAuthConnexion();
<div class="bg-inverted py-1.5 text-inverted"> <div class="bg-inverted py-1.5 text-inverted">
<div class="container flex flex-col items-center gap-3 sm:flex-row"> <div class="container flex flex-col items-center gap-3 sm:flex-row">
<SiteFooterCopyright class="sm:mr-auto" /> <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 /> <SiteFooterCredits />
</div> </div>
</div> </div>

View 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>

View File

@@ -70,11 +70,13 @@ export function useAuthConnexion() {
} }
} }
// Dynamic connexion link // Dynamic connexion link / icon
const connexionButton = computed(() => ({ 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", icon: isLoggedIn.value ? "i-lucide-log-out" : "i-lucide-log-in",
to: "/connexion",
})); }));
return { isRedirecting, login, logout, connexionButton }; return { isRedirecting, login, logout, connexionButton };

View File

@@ -4,5 +4,5 @@ export const useGeneralSettings = () =>
{}, {},
{ {
transform: ({ generalSettings }) => generalSettings, transform: ({ generalSettings }) => generalSettings,
}, }
); );

View File

@@ -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();
}
}

View File

@@ -4,5 +4,5 @@ export const useSiteOptions = () =>
{}, {},
{ {
transform: ({ siteOptions }) => siteOptions?.groupSiteOptions, transform: ({ siteOptions }) => siteOptions?.groupSiteOptions,
}, }
); );

View File

@@ -0,0 +1,4 @@
fragment PageInfo on WPPageInfo {
hasNextPage
endCursor
}

View 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;
}
}

View 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.",
});
}
});

View File

@@ -0,0 +1,6 @@
export default defineNuxtRouteMiddleware((to) => {
const { isLoggedIn } = useAuth();
if (!isLoggedIn.value) {
return navigateTo({ path: "/connexion", query: { redirect: to.fullPath } });
}
});

View File

@@ -0,0 +1,6 @@
export default defineNuxtRouteMiddleware((to) => {
const { isLoggedIn } = useAuth();
if (isLoggedIn.value) {
return navigateTo({ path: "/connexion", query: { redirect: to.fullPath } });
}
});

View File

@@ -1,4 +1,4 @@
{ {
"schema": "./server/graphql/schema.graphql", "schema": "./.nuxt/graphql/schema.gql",
"documents": "**/*.gql" "documents": "**/*.gql"
} }

View File

@@ -78,6 +78,7 @@ export default defineNuxtConfig({
wp: { type: "remote", endpoint: `${wpUrl}/graphql`, hooks: ["server/graphql/wp-hooks"] }, wp: { type: "remote", endpoint: `${wpUrl}/graphql`, hooks: ["server/graphql/wp-hooks"] },
}, },
}, },
saveSDL: ".nuxt/graphql/schema.gql",
}, },
image: { image: {

View File

@@ -24,28 +24,28 @@
}, },
"dependencies": { "dependencies": {
"@iconify-json/cib": "^1.2.3", "@iconify-json/cib": "^1.2.3",
"@iconify-json/lucide": "^1.2.88", "@iconify-json/lucide": "^1.2.90",
"@lewebsimple/nuxt-graphql": "^0.6.8", "@lewebsimple/nuxt-graphql": "^0.6.10",
"@nuxt/image": "^2.0.0", "@nuxt/image": "^2.0.0",
"@nuxt/ui": "4.3.0", "@nuxt/ui": "4.3.0",
"@nuxtjs/device": "4.0.0", "@nuxtjs/device": "4.0.0",
"@nuxtjs/seo": "^3.4.0", "@nuxtjs/seo": "^3.4.0",
"jwt-decode": "^4.0.0", "jwt-decode": "^4.0.0",
"nuxt": "^4.3.0", "nuxt": "^4.3.1",
"nuxt-auth-utils": "^0.5.28", "nuxt-auth-utils": "^0.5.28",
"nuxt-svgo": "^4.2.6", "nuxt-svgo": "^4.2.6",
"tailwindcss": "^4.1.18", "tailwindcss": "^4.1.18",
"vue": "^3.5.27", "vue": "^3.5.28",
"vue-router": "^4.6.4", "vue-router": "^4.6.4",
"zod": "^4.3.6" "zod": "^4.3.6"
}, },
"devDependencies": { "devDependencies": {
"changelogen": "^0.6.2", "changelogen": "^0.6.2",
"oxfmt": "^0.28.0", "oxfmt": "^0.28.0",
"oxlint": "^1.43.0", "oxlint": "^1.46.0",
"typescript": "^5.9.3", "typescript": "^5.9.3",
"vue-tsc": "^3.2.4", "vue-tsc": "^3.2.4",
"wrangler": "^4.62.0" "wrangler": "^4.64.0"
}, },
"pnpm": { "pnpm": {
"overrides": { "overrides": {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff