FEATURE Introducing timeline and timline-step blocks
This commit is contained in:
parent
33ff9faa0d
commit
d3095286b7
28
plugins/carhop-blocks/src/highlight-timeline-step/block.json
Normal file
28
plugins/carhop-blocks/src/highlight-timeline-step/block.json
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
"$schema": "https://schemas.wp.org/trunk/block.json",
|
||||
"apiVersion": 3,
|
||||
"name": "carhop-blocks/highlight-timeline-step",
|
||||
"version": "0.1.0",
|
||||
"title": "Étape de timeline",
|
||||
"category": "carhop-blocks",
|
||||
"icon": "calendar",
|
||||
"description": "Étape de timeline pour la mise en forme d'une étape de timeline",
|
||||
"example": {},
|
||||
"parent": [
|
||||
"carhop-blocks/highlight-timeline"
|
||||
],
|
||||
"supports": {
|
||||
"html": false
|
||||
},
|
||||
"textdomain": "carhop-blocks",
|
||||
"editorScript": "file:./index.js",
|
||||
"editorStyle": "file:./index.css",
|
||||
"style": "file:./style-index.css",
|
||||
"viewScript": "file:./view.js",
|
||||
"attributes": {
|
||||
"year": {
|
||||
"type": "number",
|
||||
"default": 2025
|
||||
}
|
||||
}
|
||||
}
|
||||
81
plugins/carhop-blocks/src/highlight-timeline-step/edit.js
Normal file
81
plugins/carhop-blocks/src/highlight-timeline-step/edit.js
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
import { __ } from "@wordpress/i18n";
|
||||
import { useBlockProps, InnerBlocks } from "@wordpress/block-editor";
|
||||
import "./editor.scss";
|
||||
import {
|
||||
PanelBody,
|
||||
Card,
|
||||
CardBody,
|
||||
CardHeader,
|
||||
TextControl,
|
||||
Button,
|
||||
__experimentalNumberControl as NumberControl,
|
||||
} from "@wordpress/components";
|
||||
import { InspectorControls } from "@wordpress/block-editor";
|
||||
|
||||
import { RichText } from "@wordpress/block-editor";
|
||||
import TimelineYearBackground from "./timelineYearBackground";
|
||||
export default function Edit({ attributes, setAttributes, ...props }) {
|
||||
const { year } = attributes;
|
||||
|
||||
return (
|
||||
<>
|
||||
<InspectorControls>
|
||||
<PanelBody title={__("Étape de timeline", "carhop-blocks")}>
|
||||
<NumberControl
|
||||
label={__("Année", "carhop-blocks")}
|
||||
value={year}
|
||||
onChange={(value) => {
|
||||
const n = parseInt(value, 10);
|
||||
setAttributes({ year: Number.isFinite(n) ? n : undefined });
|
||||
}}
|
||||
/>
|
||||
</PanelBody>
|
||||
</InspectorControls>
|
||||
<div
|
||||
{...useBlockProps({
|
||||
className: `highlight-timeline-step`,
|
||||
id: `year-${year}`,
|
||||
})}
|
||||
>
|
||||
<div className="highlight-timeline-step__year">
|
||||
<p className="highlight-timeline-step__year-text">{year}</p>
|
||||
<TimelineYearBackground />
|
||||
</div>
|
||||
<div className="highlight-timeline-step__innerblocks">
|
||||
<InnerBlocks
|
||||
allowedBlocks={[
|
||||
"core/heading",
|
||||
"core/paragraph",
|
||||
"core/group",
|
||||
"core/list",
|
||||
"core/button",
|
||||
"core/image",
|
||||
"core/buttons",
|
||||
"core/columns",
|
||||
"core/post-title",
|
||||
"core/embed",
|
||||
"core/quote",
|
||||
"core/pullquote",
|
||||
"core/media-text",
|
||||
"core/table",
|
||||
"carhop-blocks/image-stack",
|
||||
"carhop-blocks/heading",
|
||||
"carhop-blocks/decorative-shapes",
|
||||
"carhop-blocks/scroll-highlight-block",
|
||||
"carhop-blocks/cta-group",
|
||||
"carhop-blocks/audio-player",
|
||||
"carhop-blocks/localisation-map",
|
||||
"carhop-blocks/notice-panel",
|
||||
"acf/statistics-datas",
|
||||
"ninja-forms/form",
|
||||
"gravityforms/form",
|
||||
"dynamiques-blocks/sitemap",
|
||||
"mailpoet/subscription-form-block",
|
||||
"shortcode",
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
|
||||
24
plugins/carhop-blocks/src/highlight-timeline-step/index.js
Normal file
24
plugins/carhop-blocks/src/highlight-timeline-step/index.js
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
import { registerBlockType } from "@wordpress/blocks";
|
||||
import "./style.scss";
|
||||
|
||||
import Edit from "./edit";
|
||||
import save from "./save";
|
||||
import metadata from "./block.json";
|
||||
|
||||
registerBlockType(metadata.name, {
|
||||
icon: {
|
||||
foreground: "#136f63",
|
||||
src: (
|
||||
<svg width="100" height="100" viewBox="0 0 100 100">
|
||||
<g stroke="null" id="svg_10" class="fills">
|
||||
<path
|
||||
stroke="null"
|
||||
d="m3.74998,19.74151c0,-8.82607 7.16546,-15.99153 15.99153,-15.99153l60.51698,0c8.82607,0 15.99153,7.16546 15.99153,15.99153l0,60.51698c0,8.82607 -7.16546,15.99153 -15.99153,15.99153l-60.51698,0c-8.82607,0 -15.99153,-7.16546 -15.99153,-15.99153l0,-60.51698zm22.57628,3.44915l0,53.61867l23.67374,-18.7148l23.67374,18.7148l0,-53.61867l-47.34748,0z"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
),
|
||||
},
|
||||
edit: Edit,
|
||||
save,
|
||||
});
|
||||
21
plugins/carhop-blocks/src/highlight-timeline-step/save.js
Normal file
21
plugins/carhop-blocks/src/highlight-timeline-step/save.js
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
import { useBlockProps, InnerBlocks } from "@wordpress/block-editor";
|
||||
import TimelineYearBackground from "./timelineYearBackground";
|
||||
export default function save({ attributes }) {
|
||||
const { year } = attributes;
|
||||
return (
|
||||
<div
|
||||
{...useBlockProps.save({
|
||||
className: `highlight-timeline-step swiper-slide`,
|
||||
id: `year-${year}`,
|
||||
})}
|
||||
>
|
||||
<div className="highlight-timeline-step__year">
|
||||
<p className="highlight-timeline-step__year-text">{year}</p>
|
||||
<TimelineYearBackground />
|
||||
</div>
|
||||
<div className="highlight-timeline-step__innerblocks">
|
||||
<InnerBlocks.Content />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
34
plugins/carhop-blocks/src/highlight-timeline-step/style.scss
Normal file
34
plugins/carhop-blocks/src/highlight-timeline-step/style.scss
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
.highlight-timeline-step__year {
|
||||
position: relative;
|
||||
|
||||
> * {
|
||||
z-index: 1;
|
||||
}
|
||||
.highlight-timeline-step__year-background {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
bottom: 10px;
|
||||
left: 10px;
|
||||
z-index: 0;
|
||||
overflow: visible;
|
||||
|
||||
svg {
|
||||
overflow: visible;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
polygon {
|
||||
overflow: visible;
|
||||
fill: #efe8ff;
|
||||
stroke: white;
|
||||
stroke-width: 20px;
|
||||
vector-effect: non-scaling-stroke;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.highlight-timeline-step__year-text {
|
||||
line-height: 1 !important;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Calque_1" data-name="Calque 1" xmlns="http://www.w3.org/2000/svg" width="772.1" height="653.3" viewBox="0 0 772.1 653.3">
|
||||
<polygon points="14.2 10.6 762.1 53.5 757.9 642.7 10.1 599.8 14.2 10.6" style="fill: #efe8ff; stroke: #fff; stroke-width: 20px;"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 309 B |
|
|
@ -0,0 +1,21 @@
|
|||
import React from "react";
|
||||
|
||||
export default function ShapeA({}) {
|
||||
return (
|
||||
<div className="highlight-timeline-step__year-background">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="772.1"
|
||||
height="653.3"
|
||||
viewBox="0 0 772.1 653.3"
|
||||
preserveAspectRatio="none"
|
||||
>
|
||||
<polygon
|
||||
preserveAspectRatio="none"
|
||||
points="14.2 10.6 762.1 53.5 757.9 642.7 10.1 599.8 14.2 10.6"
|
||||
vectorEffect="non-scaling-stroke"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
20
plugins/carhop-blocks/src/highlight-timeline/block.json
Normal file
20
plugins/carhop-blocks/src/highlight-timeline/block.json
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"$schema": "https://schemas.wp.org/trunk/block.json",
|
||||
"apiVersion": 3,
|
||||
"name": "carhop-blocks/highlight-timeline",
|
||||
"version": "0.1.0",
|
||||
"title": "Highlight Timeline",
|
||||
"category": "carhop-blocks",
|
||||
"icon": "smiley",
|
||||
"description": "Highlight Timeline pour la mise en forme d'une timeline avec des éléments en surbrillance",
|
||||
"example": {},
|
||||
"supports": {
|
||||
"html": false
|
||||
},
|
||||
"textdomain": "highlight-timeline",
|
||||
"editorScript": "file:./index.js",
|
||||
"editorStyle": "file:./index.css",
|
||||
"style": "file:./style-index.css",
|
||||
"viewScript": "file:./view.js",
|
||||
"render": "file:./render.php"
|
||||
}
|
||||
40
plugins/carhop-blocks/src/highlight-timeline/edit.js
Normal file
40
plugins/carhop-blocks/src/highlight-timeline/edit.js
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
import { __ } from "@wordpress/i18n";
|
||||
import { useBlockProps, InnerBlocks } from "@wordpress/block-editor";
|
||||
import "./editor.scss";
|
||||
import { useSelect } from "@wordpress/data";
|
||||
|
||||
export default function Edit({ attributes, setAttributes, ...props }) {
|
||||
const years = useSelect(
|
||||
(select) => {
|
||||
const { getBlocks } = select("core/block-editor");
|
||||
const childBlocks = getBlocks(props.clientId) || [];
|
||||
return childBlocks
|
||||
.filter((b) => b.name === "carhop-blocks/highlight-timeline-step")
|
||||
.map((b) => b.attributes?.year)
|
||||
.filter((y) => y !== undefined && y !== null && y !== "");
|
||||
},
|
||||
[props.clientId]
|
||||
);
|
||||
|
||||
return (
|
||||
<div
|
||||
{...useBlockProps({
|
||||
className: "highlight-timeline",
|
||||
})}
|
||||
>
|
||||
<div className="highlight-timeline__innerblocks">
|
||||
<InnerBlocks
|
||||
allowedBlocks={["carhop-blocks/highlight-timeline-step"]}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<ul className="highlight-timeline__years">
|
||||
{years.map((y, idx) => (
|
||||
<li key={idx} className="story-timeline__year">
|
||||
{y}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
18
plugins/carhop-blocks/src/highlight-timeline/index.js
Normal file
18
plugins/carhop-blocks/src/highlight-timeline/index.js
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
import { registerBlockType } from "@wordpress/blocks";
|
||||
import "./style.scss";
|
||||
|
||||
import Edit from "./edit";
|
||||
import save from "./save";
|
||||
import metadata from "./block.json";
|
||||
|
||||
registerBlockType(metadata.name, {
|
||||
icon: {
|
||||
src: (
|
||||
<svg width="32" height="32" viewBox="0 0 32 32">
|
||||
<path d="M16 24L8 16L16 8L24 16L16 24Z" />
|
||||
</svg>
|
||||
),
|
||||
},
|
||||
edit: Edit,
|
||||
save,
|
||||
});
|
||||
33
plugins/carhop-blocks/src/highlight-timeline/render.php
Normal file
33
plugins/carhop-blocks/src/highlight-timeline/render.php
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
$wrapper_attributes = get_block_wrapper_attributes(array('class' => 'highlight-timeline'));
|
||||
|
||||
$years = array();
|
||||
if (isset($block) && is_object($block) && ! empty($block->inner_blocks)) {
|
||||
foreach ($block->inner_blocks as $inner_block) {
|
||||
if (isset($inner_block->name) && $inner_block->name === 'carhop-blocks/highlight-timeline-step') {
|
||||
$y = isset($inner_block->attributes['year']) ? $inner_block->attributes['year'] : null;
|
||||
if ($y !== null && $y !== '') {
|
||||
$years[] = $y;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
<section <?php echo $wrapper_attributes; ?>>
|
||||
|
||||
<div class="highlight-timeline__innerblocks swiper highlight-timeline-swiper" id="<?php echo esc_attr($years[0]); ?>">
|
||||
<div class="swiper-wrapper">
|
||||
<?php echo $content; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="swiper-pagination"></div>
|
||||
|
||||
<div class="swiper-controls">
|
||||
<div class="swiper-button-prev"></div>
|
||||
<div class="swiper-button-next"></div>
|
||||
</div>
|
||||
|
||||
|
||||
</section>
|
||||
5
plugins/carhop-blocks/src/highlight-timeline/save.js
Normal file
5
plugins/carhop-blocks/src/highlight-timeline/save.js
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
import { useBlockProps, InnerBlocks } from "@wordpress/block-editor";
|
||||
|
||||
export default function save({ attributes }) {
|
||||
return <InnerBlocks.Content />;
|
||||
}
|
||||
16
plugins/carhop-blocks/src/highlight-timeline/style.scss
Normal file
16
plugins/carhop-blocks/src/highlight-timeline/style.scss
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
.highlight-timeline {
|
||||
&__years {
|
||||
width: 100%;
|
||||
|
||||
display: flex;
|
||||
|
||||
gap: 20px;
|
||||
li {
|
||||
color: #fff;
|
||||
flex-grow: 1;
|
||||
text-align: center;
|
||||
list-style: none !important;
|
||||
border-bottom: 1px solid #fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
56
plugins/carhop-blocks/src/highlight-timeline/view.js
Normal file
56
plugins/carhop-blocks/src/highlight-timeline/view.js
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
function initiateSwiper() {
|
||||
const currentBlock = document.querySelector(
|
||||
".wp-block-carhop-blocks-highlight-timeline"
|
||||
);
|
||||
if (!currentBlock) return;
|
||||
|
||||
// const swiperFraction = currentBlock.querySelector(
|
||||
// ".swiper-pagination-fraction"
|
||||
// );
|
||||
const slides = currentBlock.querySelectorAll(".swiper-slide");
|
||||
const slideCount = slides.length;
|
||||
const years = Array.from(slides).map((slide) => {
|
||||
const yearEl = slide.querySelector(".highlight-timeline-step__year");
|
||||
if (yearEl && yearEl.textContent) {
|
||||
return yearEl.textContent.trim();
|
||||
}
|
||||
const id = slide.id || "";
|
||||
const match = id.match(/^year-(.+)$/);
|
||||
return match ? match[1] : "";
|
||||
});
|
||||
|
||||
highlightTimelineSwiper = new Swiper(".highlight-timeline-swiper", {
|
||||
slidesPerView: 1,
|
||||
spaceBetween: 30,
|
||||
loop: true,
|
||||
grabCursor: true,
|
||||
keyboard: {
|
||||
enabled: true,
|
||||
onlyInViewport: true,
|
||||
},
|
||||
navigation: {
|
||||
nextEl: ".swiper-button-next",
|
||||
prevEl: ".swiper-button-prev",
|
||||
},
|
||||
mousewheel: {
|
||||
enabled: true,
|
||||
forceToAxis: true, // Force le scroll dans l'axe du slider
|
||||
sensitivity: 1, // Sensibilité du scroll (1 = normal)
|
||||
releaseOnEdges: false, // Continue le scroll même aux bords
|
||||
},
|
||||
pagination: {
|
||||
el: ".swiper-pagination",
|
||||
clickable: true,
|
||||
renderBullet: function (index, className) {
|
||||
return `<button class="${className}">${years[index] ?? ""}</button>`;
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", (event) => {
|
||||
initiateSwiper();
|
||||
|
||||
// swiperCheckBreakpoints();
|
||||
// window.addEventListener("resize", swiperCheckBreakpoints);
|
||||
});
|
||||
Loading…
Reference in New Issue
Block a user