diff --git a/plugins/carhop-blocks/blocks/content-card/build/block.json b/plugins/carhop-blocks/blocks/content-card/build/block.json
new file mode 100644
index 0000000..d700b47
--- /dev/null
+++ b/plugins/carhop-blocks/blocks/content-card/build/block.json
@@ -0,0 +1,37 @@
+{
+ "$schema": "https://schemas.wp.org/trunk/block.json",
+ "apiVersion": 3,
+ "name": "carhop-blocks/content-card",
+ "version": "0.1.0",
+ "title": "Content Card",
+ "category": "carhop-blocks",
+ "icon": "smiley",
+ "description": "Carte de contenu pour la mise en forme d'éléments de contenu",
+ "example": {},
+ "supports": {
+ "html": false
+ },
+ "textdomain": "carhop-blocks",
+ "editorScript": "file:./index.js",
+ "editorStyle": "file:./index.css",
+ "style": "file:./style-index.css",
+ "viewScript": "file:./view.js",
+ "attributes": {
+ "hasBackgroundColor": {
+ "type": "boolean",
+ "default": false
+ },
+ "backgroundColor": {
+ "type": "string",
+ "default": "#136f63"
+ },
+ "hasLightBackground": {
+ "type": "boolean",
+ "default": true
+ },
+ "textColor": {
+ "type": "string",
+ "default": "#136f63"
+ }
+ }
+}
\ No newline at end of file
diff --git a/plugins/carhop-blocks/blocks/content-card/build/index-rtl.css b/plugins/carhop-blocks/blocks/content-card/build/index-rtl.css
new file mode 100644
index 0000000..6badb3b
--- /dev/null
+++ b/plugins/carhop-blocks/blocks/content-card/build/index-rtl.css
@@ -0,0 +1,4 @@
+/*!*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
+ !*** css ./node_modules/.pnpm/css-loader@6.11.0_webpack@5.98.0_webpack-cli@5.1.4_/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[4].use[1]!./node_modules/.pnpm/postcss-loader@6.2.1_postcss@8.5.3_webpack@5.98.0_webpack-cli@5.1.4_/node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[4].use[2]!./node_modules/.pnpm/sass-loader@16.0.5_sass@1.85.1_webpack@5.98.0_webpack-cli@5.1.4_/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[4].use[3]!./src/editor.scss ***!
+ \*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
+
diff --git a/plugins/carhop-blocks/blocks/content-card/build/index.asset.php b/plugins/carhop-blocks/blocks/content-card/build/index.asset.php
new file mode 100644
index 0000000..99a9e2f
--- /dev/null
+++ b/plugins/carhop-blocks/blocks/content-card/build/index.asset.php
@@ -0,0 +1 @@
+ array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-i18n'), 'version' => 'ed13236e340dd1b6f174');
diff --git a/plugins/carhop-blocks/blocks/content-card/build/index.css b/plugins/carhop-blocks/blocks/content-card/build/index.css
new file mode 100644
index 0000000..6badb3b
--- /dev/null
+++ b/plugins/carhop-blocks/blocks/content-card/build/index.css
@@ -0,0 +1,4 @@
+/*!*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
+ !*** css ./node_modules/.pnpm/css-loader@6.11.0_webpack@5.98.0_webpack-cli@5.1.4_/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[4].use[1]!./node_modules/.pnpm/postcss-loader@6.2.1_postcss@8.5.3_webpack@5.98.0_webpack-cli@5.1.4_/node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[4].use[2]!./node_modules/.pnpm/sass-loader@16.0.5_sass@1.85.1_webpack@5.98.0_webpack-cli@5.1.4_/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[4].use[3]!./src/editor.scss ***!
+ \*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
+
diff --git a/plugins/carhop-blocks/blocks/content-card/build/index.js b/plugins/carhop-blocks/blocks/content-card/build/index.js
new file mode 100644
index 0000000..db0ab3a
--- /dev/null
+++ b/plugins/carhop-blocks/blocks/content-card/build/index.js
@@ -0,0 +1,493 @@
+/******/ (() => { // webpackBootstrap
+/******/ "use strict";
+/******/ var __webpack_modules__ = ({
+
+/***/ "../_utilities/utilities.js":
+/*!**********************************!*\
+ !*** ../_utilities/utilities.js ***!
+ \**********************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ isColorLight: () => (/* binding */ isColorLight)
+/* harmony export */ });
+// Fonction pour déterminer si une couleur est claire ou sombre
+function isColorLight(color) {
+ // Si pas de couleur, considérer comme claire
+ if (!color) return true;
+
+ // Convertir hex en RGB
+ let hex = color.replace("#", "");
+ if (hex.length === 3) {
+ hex = hex.split("").map(char => char + char).join("");
+ }
+ const r = parseInt(hex.substr(0, 2), 16);
+ const g = parseInt(hex.substr(2, 2), 16);
+ const b = parseInt(hex.substr(4, 2), 16);
+
+ // Calculer la luminance relative (formule standard)
+ const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
+
+ // Si luminance > 0.5, la couleur est claire
+ return luminance > 0.5;
+}
+
+/***/ }),
+
+/***/ "./src/block.json":
+/*!************************!*\
+ !*** ./src/block.json ***!
+ \************************/
+/***/ ((module) => {
+
+module.exports = /*#__PURE__*/JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":3,"name":"carhop-blocks/content-card","version":"0.1.0","title":"Content Card","category":"carhop-blocks","icon":"smiley","description":"Carte de contenu pour la mise en forme d\'éléments de contenu","example":{},"supports":{"html":false},"textdomain":"carhop-blocks","editorScript":"file:./index.js","editorStyle":"file:./index.css","style":"file:./style-index.css","viewScript":"file:./view.js","attributes":{"hasBackgroundColor":{"type":"boolean","default":false},"backgroundColor":{"type":"string","default":"#136f63"},"hasLightBackground":{"type":"boolean","default":true},"textColor":{"type":"string","default":"#136f63"}}}');
+
+/***/ }),
+
+/***/ "./src/edit.js":
+/*!*********************!*\
+ !*** ./src/edit.js ***!
+ \*********************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": () => (/* binding */ Edit)
+/* harmony export */ });
+/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n");
+/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/block-editor */ "@wordpress/block-editor");
+/* harmony import */ var _wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _editor_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./editor.scss */ "./src/editor.scss");
+/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../_utilities/utilities */ "../_utilities/utilities.js");
+/* harmony import */ var _wordpress_components__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/components */ "@wordpress/components");
+/* harmony import */ var _wordpress_components__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_components__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react/jsx-runtime */ "react/jsx-runtime");
+/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__);
+
+
+
+
+
+
+function Edit({
+ attributes,
+ setAttributes,
+ ...props
+}) {
+ const colors = (0,_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__.useSetting)("color.palette.theme");
+ const {
+ hasBackgroundColor,
+ backgroundColor,
+ textColor,
+ hasLightBackground
+ } = attributes;
+ function onBackgroundColorChange(value) {
+ if (value === undefined) {
+ setAttributes({
+ hasBackgroundColor: false
+ });
+ setAttributes({
+ backgroundColor: "transparent"
+ });
+ }
+ const isLightBackgroundColor = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_3__.isColorLight)(backgroundColor);
+ setAttributes({
+ hasLightBackground: isLightBackgroundColor
+ });
+ setAttributes({
+ backgroundColor: value
+ });
+ }
+ function onHasBackgroundColorChange(value) {
+ setAttributes({
+ hasBackgroundColor: value
+ });
+ if (!value) {
+ setAttributes({
+ backgroundColor: null
+ });
+ }
+ }
+ function onTextColorChange(value) {
+ setAttributes({
+ textColor: value
+ });
+ }
+ return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.Fragment, {
+ children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__.InspectorControls, {
+ children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_wordpress_components__WEBPACK_IMPORTED_MODULE_4__.PanelBody, {
+ className: "deligraph-blocks-components-image__panel-body",
+ title: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__.__)("Arrière plan", "deligraph-blocks"),
+ children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_wordpress_components__WEBPACK_IMPORTED_MODULE_4__.CheckboxControl, {
+ label: "Arri\xE8re plan color\xE9",
+ checked: hasBackgroundColor,
+ onChange: onHasBackgroundColorChange
+ }), hasBackgroundColor && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.Fragment, {
+ children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_wordpress_components__WEBPACK_IMPORTED_MODULE_4__.ColorPalette, {
+ colors: colors,
+ value: backgroundColor,
+ onChange: onBackgroundColorChange
+ })
+ })]
+ }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_wordpress_components__WEBPACK_IMPORTED_MODULE_4__.PanelBody, {
+ className: "deligraph-blocks-components-image__panel-body",
+ title: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__.__)("Couleur du texte", "deligraph-blocks"),
+ children: hasBackgroundColor && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.Fragment, {
+ children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_wordpress_components__WEBPACK_IMPORTED_MODULE_4__.ColorPalette, {
+ colors: colors,
+ value: textColor,
+ onChange: onTextColorChange
+ })
+ })
+ })]
+ }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)("div", {
+ ...(0,_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__.useBlockProps)({
+ className: `content-card ${hasLightBackground ? "content-card--bg-light" : "content-card--bg-dark"}`,
+ style: {
+ "--content-card-text-color": textColor !== null && textColor !== void 0 ? textColor : "inherit",
+ "--content-card-background-color": hasBackgroundColor ? backgroundColor : "transparent"
+ }
+ }),
+ children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)("div", {
+ className: "content-card__innerblocks",
+ children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__.InnerBlocks, {
+ template: [["core/paragraph", {
+ placeholder: "Ajouter ici le texte"
+ }]],
+ allowedBlocks: ["core/heading", "core/paragraph", "core/group", "core/list", "core/button", "core/buttons", "carhop-blocks/heading", "carhop-blocks/cta-group"]
+ })
+ })
+ })]
+ });
+}
+
+/***/ }),
+
+/***/ "./src/editor.scss":
+/*!*************************!*\
+ !*** ./src/editor.scss ***!
+ \*************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+// extracted by mini-css-extract-plugin
+
+
+/***/ }),
+
+/***/ "./src/index.js":
+/*!**********************!*\
+ !*** ./src/index.js ***!
+ \**********************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _wordpress_blocks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/blocks */ "@wordpress/blocks");
+/* harmony import */ var _wordpress_blocks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_blocks__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _style_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./style.scss */ "./src/style.scss");
+/* harmony import */ var _edit__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./edit */ "./src/edit.js");
+/* harmony import */ var _save__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./save */ "./src/save.js");
+/* harmony import */ var _block_json__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./block.json */ "./src/block.json");
+/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react/jsx-runtime */ "react/jsx-runtime");
+/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__);
+
+
+
+
+
+
+(0,_wordpress_blocks__WEBPACK_IMPORTED_MODULE_0__.registerBlockType)(_block_json__WEBPACK_IMPORTED_MODULE_4__.name, {
+ icon: {
+ foreground: "#136f63",
+ src: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)("svg", {
+ width: "18",
+ height: "18",
+ viewBox: "0 0 18 18",
+ children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)("g", {
+ children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)("path", {
+ d: "M1,5c-.6,0-1,.4-1,1v2c0,.6.4,1,1,1s1-.4,1-1v-2c0-.6-.4-1-1-1ZM3,0H1C.4,0,0,.4,0,1v2c0,.6.4,1,1,1s1-.4,1-1v-1h1c.6,0,1-.4,1-1s-.4-1-1-1ZM6,2h2c.6,0,1-.4,1-1s-.4-1-1-1h-2c-.6,0-1,.4-1,1s.4,1,1,1ZM1,10c-.6,0-1,.4-1,1v2c0,.6.4,1,1,1s1-.4,1-1v-2c0-.6-.4-1-1-1ZM6,7v4c0,.6.4,1,1,1h4c.6,0,1-.4,1-1v-4c0-.6-.4-1-1-1h-4c-.6,0-1,.4-1,1ZM12,16h-2c-.6,0-1,.4-1,1s.4,1,1,1h2c.6,0,1-.4,1-1s-.4-1-1-1ZM17,9c-.6,0-1,.4-1,1v2c0,.6.4,1,1,1s1-.4,1-1v-2c0-.6-.4-1-1-1ZM17,4c-.6,0-1,.4-1,1v2c0,.6.4,1,1,1s1-.4,1-1v-2c0-.6-.4-1-1-1ZM17,14c-.6,0-1,.4-1,1v1h-1c-.6,0-1,.4-1,1s.4,1,1,1h2c.6,0,1-.4,1-1v-2c0-.6-.4-1-1-1ZM7,16h-2c-.6,0-1,.4-1,1s.4,1,1,1h2c.6,0,1-.4,1-1s-.4-1-1-1ZM13,0h-2c-.6,0-1,.4-1,1s.4,1,1,1h2c.6,0,1-.4,1-1s-.4-1-1-1Z"
+ })
+ })
+ })
+ },
+ edit: _edit__WEBPACK_IMPORTED_MODULE_2__["default"],
+ save: _save__WEBPACK_IMPORTED_MODULE_3__["default"]
+});
+
+/***/ }),
+
+/***/ "./src/save.js":
+/*!*********************!*\
+ !*** ./src/save.js ***!
+ \*********************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": () => (/* binding */ save)
+/* harmony export */ });
+/* harmony import */ var _wordpress_block_editor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/block-editor */ "@wordpress/block-editor");
+/* harmony import */ var _wordpress_block_editor__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../_utilities/utilities */ "../_utilities/utilities.js");
+/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react/jsx-runtime */ "react/jsx-runtime");
+/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__);
+
+
+
+function save({
+ attributes
+}) {
+ const {
+ backgroundColor,
+ textColor,
+ hasLightBackground,
+ hasBackgroundColor
+ } = attributes;
+ return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
+ ..._wordpress_block_editor__WEBPACK_IMPORTED_MODULE_0__.useBlockProps.save({
+ className: `content-card ${hasLightBackground ? "content-card--bg-light" : "content-card--bg-dark"}`,
+ style: {
+ "--content-card-text-color": textColor !== null && textColor !== void 0 ? textColor : "inherit",
+ "--content-card-background-color": hasBackgroundColor ? backgroundColor : "transparent"
+ }
+ }),
+ children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
+ className: "content-card__innerblocks",
+ children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_0__.InnerBlocks.Content, {})
+ })
+ });
+}
+
+/***/ }),
+
+/***/ "./src/style.scss":
+/*!************************!*\
+ !*** ./src/style.scss ***!
+ \************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+// extracted by mini-css-extract-plugin
+
+
+/***/ }),
+
+/***/ "@wordpress/block-editor":
+/*!*************************************!*\
+ !*** external ["wp","blockEditor"] ***!
+ \*************************************/
+/***/ ((module) => {
+
+module.exports = window["wp"]["blockEditor"];
+
+/***/ }),
+
+/***/ "@wordpress/blocks":
+/*!********************************!*\
+ !*** external ["wp","blocks"] ***!
+ \********************************/
+/***/ ((module) => {
+
+module.exports = window["wp"]["blocks"];
+
+/***/ }),
+
+/***/ "@wordpress/components":
+/*!************************************!*\
+ !*** external ["wp","components"] ***!
+ \************************************/
+/***/ ((module) => {
+
+module.exports = window["wp"]["components"];
+
+/***/ }),
+
+/***/ "@wordpress/i18n":
+/*!******************************!*\
+ !*** external ["wp","i18n"] ***!
+ \******************************/
+/***/ ((module) => {
+
+module.exports = window["wp"]["i18n"];
+
+/***/ }),
+
+/***/ "react/jsx-runtime":
+/*!**********************************!*\
+ !*** external "ReactJSXRuntime" ***!
+ \**********************************/
+/***/ ((module) => {
+
+module.exports = window["ReactJSXRuntime"];
+
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/ // The module cache
+/******/ var __webpack_module_cache__ = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/ // Check if module is in cache
+/******/ var cachedModule = __webpack_module_cache__[moduleId];
+/******/ if (cachedModule !== undefined) {
+/******/ return cachedModule.exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = __webpack_module_cache__[moduleId] = {
+/******/ // no module.id needed
+/******/ // no module.loaded needed
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = __webpack_modules__;
+/******/
+/************************************************************************/
+/******/ /* webpack/runtime/chunk loaded */
+/******/ (() => {
+/******/ var deferred = [];
+/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => {
+/******/ if(chunkIds) {
+/******/ priority = priority || 0;
+/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];
+/******/ deferred[i] = [chunkIds, fn, priority];
+/******/ return;
+/******/ }
+/******/ var notFulfilled = Infinity;
+/******/ for (var i = 0; i < deferred.length; i++) {
+/******/ var [chunkIds, fn, priority] = deferred[i];
+/******/ var fulfilled = true;
+/******/ for (var j = 0; j < chunkIds.length; j++) {
+/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {
+/******/ chunkIds.splice(j--, 1);
+/******/ } else {
+/******/ fulfilled = false;
+/******/ if(priority < notFulfilled) notFulfilled = priority;
+/******/ }
+/******/ }
+/******/ if(fulfilled) {
+/******/ deferred.splice(i--, 1)
+/******/ var r = fn();
+/******/ if (r !== undefined) result = r;
+/******/ }
+/******/ }
+/******/ return result;
+/******/ };
+/******/ })();
+/******/
+/******/ /* webpack/runtime/compat get default export */
+/******/ (() => {
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = (module) => {
+/******/ var getter = module && module.__esModule ?
+/******/ () => (module['default']) :
+/******/ () => (module);
+/******/ __webpack_require__.d(getter, { a: getter });
+/******/ return getter;
+/******/ };
+/******/ })();
+/******/
+/******/ /* webpack/runtime/define property getters */
+/******/ (() => {
+/******/ // define getter functions for harmony exports
+/******/ __webpack_require__.d = (exports, definition) => {
+/******/ for(var key in definition) {
+/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ }
+/******/ }
+/******/ };
+/******/ })();
+/******/
+/******/ /* webpack/runtime/hasOwnProperty shorthand */
+/******/ (() => {
+/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
+/******/ })();
+/******/
+/******/ /* webpack/runtime/make namespace object */
+/******/ (() => {
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = (exports) => {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/ })();
+/******/
+/******/ /* webpack/runtime/jsonp chunk loading */
+/******/ (() => {
+/******/ // no baseURI
+/******/
+/******/ // object to store loaded and loading chunks
+/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
+/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
+/******/ var installedChunks = {
+/******/ "index": 0,
+/******/ "./style-index": 0
+/******/ };
+/******/
+/******/ // no chunk on demand loading
+/******/
+/******/ // no prefetching
+/******/
+/******/ // no preloaded
+/******/
+/******/ // no HMR
+/******/
+/******/ // no HMR manifest
+/******/
+/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);
+/******/
+/******/ // install a JSONP callback for chunk loading
+/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => {
+/******/ var [chunkIds, moreModules, runtime] = data;
+/******/ // add "moreModules" to the modules object,
+/******/ // then flag all "chunkIds" as loaded and fire callback
+/******/ var moduleId, chunkId, i = 0;
+/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) {
+/******/ for(moduleId in moreModules) {
+/******/ if(__webpack_require__.o(moreModules, moduleId)) {
+/******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
+/******/ }
+/******/ }
+/******/ if(runtime) var result = runtime(__webpack_require__);
+/******/ }
+/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
+/******/ for(;i < chunkIds.length; i++) {
+/******/ chunkId = chunkIds[i];
+/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {
+/******/ installedChunks[chunkId][0]();
+/******/ }
+/******/ installedChunks[chunkId] = 0;
+/******/ }
+/******/ return __webpack_require__.O(result);
+/******/ }
+/******/
+/******/ var chunkLoadingGlobal = globalThis["webpackChunkfront_header"] = globalThis["webpackChunkfront_header"] || [];
+/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
+/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
+/******/ })();
+/******/
+/************************************************************************/
+/******/
+/******/ // startup
+/******/ // Load entry module and return exports
+/******/ // This entry module depends on other loaded chunks and execution need to be delayed
+/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["./style-index"], () => (__webpack_require__("./src/index.js")))
+/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__);
+/******/
+/******/ })()
+;
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/plugins/carhop-blocks/blocks/content-card/build/index.js.map b/plugins/carhop-blocks/blocks/content-card/build/index.js.map
new file mode 100644
index 0000000..75c329b
--- /dev/null
+++ b/plugins/carhop-blocks/blocks/content-card/build/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","mappings":";;;;;;;;;;;;;;AAAA;AACO,SAASA,YAAYA,CAACC,KAAK,EAAE;EACnC;EACA,IAAI,CAACA,KAAK,EAAE,OAAO,IAAI;;EAEvB;EACA,IAAIC,GAAG,GAAGD,KAAK,CAACE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;EAChC,IAAID,GAAG,CAACE,MAAM,KAAK,CAAC,EAAE;IACrBF,GAAG,GAAGA,GAAG,CACPG,KAAK,CAAC,EAAE,CAAC,CACTC,GAAG,CAAEC,IAAI,IAAKA,IAAI,GAAGA,IAAI,CAAC,CAC1BC,IAAI,CAAC,EAAE,CAAC;EACX;EAEA,MAAMC,CAAC,GAAGC,QAAQ,CAACR,GAAG,CAACS,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;EACxC,MAAMC,CAAC,GAAGF,QAAQ,CAACR,GAAG,CAACS,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;EACxC,MAAME,CAAC,GAAGH,QAAQ,CAACR,GAAG,CAACS,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;;EAExC;EACA,MAAMG,SAAS,GAAG,CAAC,KAAK,GAAGL,CAAC,GAAG,KAAK,GAAGG,CAAC,GAAG,KAAK,GAAGC,CAAC,IAAI,GAAG;;EAE3D;EACA,OAAOC,SAAS,GAAG,GAAG;AACvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvBqC;AAQJ;AACV;AACmC;AAS3B;AAAA;AAEhB,SAASsB,IAAIA,CAAC;EAAEC,UAAU;EAAEC,aAAa;EAAE,GAAGC;AAAM,CAAC,EAAE;EACrE,MAAMC,MAAM,GAAGtB,mEAAU,CAAC,qBAAqB,CAAC;EAChD,MAAM;IAAEuB,kBAAkB;IAAEC,eAAe;IAAEC,SAAS;IAAEC;EAAmB,CAAC,GAC3EP,UAAU;EAEX,SAASQ,uBAAuBA,CAACC,KAAK,EAAE;IACvC,IAAIA,KAAK,KAAKC,SAAS,EAAE;MACxBT,aAAa,CAAC;QAAEG,kBAAkB,EAAE;MAAM,CAAC,CAAC;MAC5CH,aAAa,CAAC;QAAEI,eAAe,EAAE;MAAc,CAAC,CAAC;IAClD;IACA,MAAMM,sBAAsB,GAAGhD,kEAAY,CAAC0C,eAAe,CAAC;IAC5DJ,aAAa,CAAC;MAAEM,kBAAkB,EAAEI;IAAuB,CAAC,CAAC;IAE7DV,aAAa,CAAC;MAAEI,eAAe,EAAEI;IAAM,CAAC,CAAC;EAC1C;EACA,SAASG,0BAA0BA,CAACH,KAAK,EAAE;IAC1CR,aAAa,CAAC;MAAEG,kBAAkB,EAAEK;IAAM,CAAC,CAAC;IAC5C,IAAI,CAACA,KAAK,EAAE;MACXR,aAAa,CAAC;QAAEI,eAAe,EAAE;MAAK,CAAC,CAAC;IACzC;EACD;EACA,SAASQ,iBAAiBA,CAACJ,KAAK,EAAE;IACjCR,aAAa,CAAC;MAAEK,SAAS,EAAEG;IAAM,CAAC,CAAC;EACpC;EACA,oBACCX,uDAAA,CAAAF,uDAAA;IAAAkB,QAAA,gBACChB,uDAAA,CAAChB,sEAAiB;MAAAgC,QAAA,gBACjBhB,uDAAA,CAACb,4DAAS;QACT8B,SAAS,EAAC,+CAA+C;QACzDC,KAAK,EAAEtC,mDAAE,CAAC,cAAc,EAAE,kBAAkB,CAAE;QAAAoC,QAAA,gBAE9CpB,sDAAA,CAACH,kEAAe;UACf0B,KAAK,EAAC,2BAAqB;UAC3BC,OAAO,EAAEd,kBAAmB;UAC5Be,QAAQ,EAAEP;QAA2B,CACrC,CAAC,EACDR,kBAAkB,iBAClBV,sDAAA,CAAAE,uDAAA;UAAAkB,QAAA,eACCpB,sDAAA,CAACF,+DAAY;YACZW,MAAM,EAAEA,MAAO;YACfM,KAAK,EAAEJ,eAAgB;YACvBc,QAAQ,EAAEX;UAAwB,CAClC;QAAC,CACD,CACF;MAAA,CACS,CAAC,eACZd,sDAAA,CAACT,4DAAS;QACT8B,SAAS,EAAC,+CAA+C;QACzDC,KAAK,EAAEtC,mDAAE,CAAC,kBAAkB,EAAE,kBAAkB,CAAE;QAAAoC,QAAA,EAEjDV,kBAAkB,iBAClBV,sDAAA,CAAAE,uDAAA;UAAAkB,QAAA,eACCpB,sDAAA,CAACF,+DAAY;YACZW,MAAM,EAAEA,MAAO;YACfM,KAAK,EAAEH,SAAU;YACjBa,QAAQ,EAAEN;UAAkB,CAC5B;QAAC,CACD;MACF,CACS,CAAC;IAAA,CACM,CAAC,eACpBnB,sDAAA;MAAA,GACKf,sEAAa,CAAC;QACjBoC,SAAS,EAAE,gBACVR,kBAAkB,GACf,wBAAwB,GACxB,uBAAuB,EACzB;QACFa,KAAK,EAAE;UACN,2BAA2B,EAAEd,SAAS,aAATA,SAAS,cAATA,SAAS,GAAI,SAAS;UACnD,iCAAiC,EAAEF,kBAAkB,GAClDC,eAAe,GACf;QACJ;MACD,CAAC,CAAC;MAAAS,QAAA,eAEFpB,sDAAA;QAAKqB,SAAS,EAAC,2BAA2B;QAAAD,QAAA,eACzCpB,sDAAA,CAACd,gEAAW;UACXyC,QAAQ,EAAE,CACT,CAAC,gBAAgB,EAAE;YAAEC,WAAW,EAAE;UAAuB,CAAC,CAAC,CAC1D;UACFC,aAAa,EAAE,CACd,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,cAAc,EACd,uBAAuB,EACvB,yBAAyB;QACxB,CACF;MAAC,CACE;IAAC,CACF,CAAC;EAAA,CACL,CAAC;AAEL;;;;;;;;;;;ACrHA;;;;;;;;;;;;;;;;;;;;ACAsD;AAChC;AAEI;AACA;AACU;AAAA;AAEpCC,oEAAiB,CAACE,6CAAa,EAAE;EAChCE,IAAI,EAAE;IACLC,UAAU,EAAE,SAAS;IACrBC,GAAG,eACFpC,sDAAA;MAAKqC,KAAK,EAAC,IAAI;MAACC,MAAM,EAAC,IAAI;MAACC,OAAO,EAAC,WAAW;MAAAnB,QAAA,eAC9CpB,sDAAA;QAAAoB,QAAA,eACCpB,sDAAA;UAAMwC,CAAC,EAAC;QAA0sB,CAAE;MAAC,CACntB;IAAC,CACA;EAEP,CAAC;EACDC,IAAI,EAAEpC,6CAAI;EACV0B,IAAIA,+CAAAA;AACL,CAAC,CAAC;;;;;;;;;;;;;;;;;;;ACpBmE;AACX;AAAA;AAE3C,SAASA,IAAIA,CAAC;EAAEzB;AAAW,CAAC,EAAE;EAC5C,MAAM;IAAEK,eAAe;IAAEC,SAAS;IAAEC,kBAAkB;IAAEH;EAAmB,CAAC,GAC3EJ,UAAU;EACX,oBACCN,sDAAA;IAAA,GACKf,kEAAa,CAAC8C,IAAI,CAAC;MACtBV,SAAS,EAAE,gBACVR,kBAAkB,GACf,wBAAwB,GACxB,uBAAuB,EACzB;MACFa,KAAK,EAAE;QACN,2BAA2B,EAAEd,SAAS,aAATA,SAAS,cAATA,SAAS,GAAI,SAAS;QACnD,iCAAiC,EAAEF,kBAAkB,GAClDC,eAAe,GACf;MACJ;IACD,CAAC,CAAC;IAAAS,QAAA,eAEFpB,sDAAA;MAAKqB,SAAS,EAAC,2BAA2B;MAAAD,QAAA,eACzCpB,sDAAA,CAACd,gEAAW,CAACwD,OAAO,IAAE;IAAC,CACnB;EAAC,CACF,CAAC;AAER;;;;;;;;;;;AC3BA;;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;;;;WCzBA;WACA;WACA;WACA;WACA,+BAA+B,wCAAwC;WACvE;WACA;WACA;WACA;WACA,iBAAiB,qBAAqB;WACtC;WACA;WACA,kBAAkB,qBAAqB;WACvC;WACA;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;;;;WC3BA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;;;;;UEjDA;UACA;UACA;UACA;UACA","sources":["webpack://front-header/../_utilities/utilities.js","webpack://front-header/./src/edit.js","webpack://front-header/./src/editor.scss","webpack://front-header/./src/index.js","webpack://front-header/./src/save.js","webpack://front-header/./src/style.scss?e2e7","webpack://front-header/external window [\"wp\",\"blockEditor\"]","webpack://front-header/external window [\"wp\",\"blocks\"]","webpack://front-header/external window [\"wp\",\"components\"]","webpack://front-header/external window [\"wp\",\"i18n\"]","webpack://front-header/external window \"ReactJSXRuntime\"","webpack://front-header/webpack/bootstrap","webpack://front-header/webpack/runtime/chunk loaded","webpack://front-header/webpack/runtime/compat get default export","webpack://front-header/webpack/runtime/define property getters","webpack://front-header/webpack/runtime/hasOwnProperty shorthand","webpack://front-header/webpack/runtime/make namespace object","webpack://front-header/webpack/runtime/jsonp chunk loading","webpack://front-header/webpack/before-startup","webpack://front-header/webpack/startup","webpack://front-header/webpack/after-startup"],"sourcesContent":["// Fonction pour déterminer si une couleur est claire ou sombre\r\nexport function isColorLight(color) {\r\n\t// Si pas de couleur, considérer comme claire\r\n\tif (!color) return true;\r\n\r\n\t// Convertir hex en RGB\r\n\tlet hex = color.replace(\"#\", \"\");\r\n\tif (hex.length === 3) {\r\n\t\thex = hex\r\n\t\t\t.split(\"\")\r\n\t\t\t.map((char) => char + char)\r\n\t\t\t.join(\"\");\r\n\t}\r\n\r\n\tconst r = parseInt(hex.substr(0, 2), 16);\r\n\tconst g = parseInt(hex.substr(2, 2), 16);\r\n\tconst b = parseInt(hex.substr(4, 2), 16);\r\n\r\n\t// Calculer la luminance relative (formule standard)\r\n\tconst luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\r\n\r\n\t// Si luminance > 0.5, la couleur est claire\r\n\treturn luminance > 0.5;\r\n}\r\n","import { __ } from \"@wordpress/i18n\";\nimport {\n\tuseBlockProps,\n\tInnerBlocks,\n\tuseSetting,\n\tInspectorControls,\n\tMediaReplaceFlow,\n\tMediaPlaceholder,\n} from \"@wordpress/block-editor\";\nimport \"./editor.scss\";\nimport { isColorLight } from \"../../_utilities/utilities\";\n\nimport {\n\tPanelBody,\n\t__experimentalToggleGroupControl as ToggleGroupControl,\n\t__experimentalToggleGroupControlOption as ToggleGroupControlOption,\n\tButton,\n\tCheckboxControl,\n\tColorPalette,\n} from \"@wordpress/components\";\n\nexport default function Edit({ attributes, setAttributes, ...props }) {\n\tconst colors = useSetting(\"color.palette.theme\");\n\tconst { hasBackgroundColor, backgroundColor, textColor, hasLightBackground } =\n\t\tattributes;\n\n\tfunction onBackgroundColorChange(value) {\n\t\tif (value === undefined) {\n\t\t\tsetAttributes({ hasBackgroundColor: false });\n\t\t\tsetAttributes({ backgroundColor: \"transparent\" });\n\t\t}\n\t\tconst isLightBackgroundColor = isColorLight(backgroundColor);\n\t\tsetAttributes({ hasLightBackground: isLightBackgroundColor });\n\n\t\tsetAttributes({ backgroundColor: value });\n\t}\n\tfunction onHasBackgroundColorChange(value) {\n\t\tsetAttributes({ hasBackgroundColor: value });\n\t\tif (!value) {\n\t\t\tsetAttributes({ backgroundColor: null });\n\t\t}\n\t}\n\tfunction onTextColorChange(value) {\n\t\tsetAttributes({ textColor: value });\n\t}\n\treturn (\n\t\t<>\n\t\t\t