Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
a55c669
refactor(ARC-3816): rename the quote block symbols to avo quote
Aug 4, 2026
506dc42
fix(ARC-3816): honour the explicit default value in the colour field …
Aug 4, 2026
9776dc0
feat(ARC-3816): add the hetarchief quote block component
Aug 4, 2026
7a77b80
feat(ARC-3816): register the hetarchief quote content block
Aug 4, 2026
c4162f3
fix(ARC-3816): render the quote ligature, fix casing, lint, and widen…
Aug 4, 2026
f2c7d30
fix(ARC-3816): match the figma desktop and mobile specs for the quote…
Aug 6, 2026
1064d88
fix(ARC-3816): limit the quote colour fields to plain css colours
Aug 6, 2026
b7fbb17
feat(ARC-3816): add the quote block translations
Aug 6, 2026
ee9eaf3
Merge remote-tracking branch 'origin/release/v6.0.0' into feature/ARC…
Aug 7, 2026
5b78f4c
refactor(content-blocks): use the shared colour lists for the quote b…
Aug 10, 2026
5b163e2
style(content-blocks): rewrite the quote block styling on the shared …
Aug 10, 2026
eb1aa13
docs(content-blocks): document the colour and styling conventions
Aug 10, 2026
9692535
revert(content-blocks): move the colour field defaultValue fix out of…
Aug 11, 2026
d50e30a
refactor(content-blocks): inline the quote block colour defaults
Aug 11, 2026
33211de
refactor(content-blocks): render the quote mark with the icon component
Aug 11, 2026
b1df68d
style(content-blocks): add the body-xl and body-xs sofia pro presets
Aug 11, 2026
98cab9f
fix(content-blocks): make the quote block translations app specific
Aug 11, 2026
47ff92f
fix(content-blocks): keep the avo quote translations available in bot…
Aug 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion ui/src/client.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export { AvoHeroWrapper } from '~content-blocks/BlockAvoHero/AvoHeroWrapper';
export { BlockAvoImageTextBackground } from '~content-blocks/BlockAvoImageTextBackground';
export { BlockAvoQuote } from '~content-blocks/BlockAvoQuote';
export { BlockBreadcrumbs } from '~content-blocks/BlockBreadcrumbs';
export { BlockButtonsWrapper } from '~content-blocks/BlockButtons/BlockButtons.wrapper';
export { BlockCardsWithoutDescription } from '~content-blocks/BlockCardsWithoutDescription';
Expand All @@ -9,6 +10,7 @@ export { BlockEventbrite } from '~content-blocks/BlockEventbrite';
export { BlockHeading } from '~content-blocks/BlockHeading/BlockHeading';
export { BlockHetArchiefHeaderSearch } from '~content-blocks/BlockHetArchiefHeaderSearch';
export { BlockHetArchiefImageTextBackground } from '~content-blocks/BlockHetArchiefImageTextBackground';
export { BlockHetArchiefQuote } from '~content-blocks/BlockHetArchiefQuote';
export { BlockIFrame } from '~content-blocks/BlockIFrame';
export { BlockImage } from '~content-blocks/BlockImage';
export { BlockImageGridWrapper } from '~content-blocks/BlockImageGrid/BlockImageGrid.wrapper';
Expand All @@ -21,7 +23,6 @@ export { BlockMaintainersGrid } from '~content-blocks/BlockMaintainersGrid';
export { BlockOverviewNewspaperTitles } from '~content-blocks/BlockOverviewNewspaperTitles';
export { BlockOverviewWithCarousel } from '~content-blocks/BlockOverviewWithCarousel';
export { BlockPageOverviewWrapper } from '~content-blocks/BlockPageOverview/BlockPageOverview.wrapper';
export { BlockQuote } from '~content-blocks/BlockQuote';
export { BlockRichText } from '~content-blocks/BlockRichText';
export { BlockRichTextWrapper } from '~content-blocks/BlockRichText/BlockRichText.wrapper';
export { BlockScrollDownNudge } from '~content-blocks/BlockScrollDownNudge';
Expand Down
1 change: 1 addition & 0 deletions ui/src/react-admin/core/config/config.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ export interface IconConfig {
newspaper: IconComponentProps;
noAudio: IconComponentProps;
noVideo: IconComponentProps;
quotes: IconComponentProps;
};
list: () => { label: string; value: string }[];
alerts: () => { key: string; label: string; value: string }[];
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { FC, FunctionComponent } from 'react';
import { AvoHeroWrapper } from '~content-blocks/BlockAvoHero/AvoHeroWrapper';
import { BlockAvoImageTextBackground } from '~content-blocks/BlockAvoImageTextBackground';
import { BlockAvoQuote } from '~content-blocks/BlockAvoQuote';
import { BlockBreadcrumbs } from '~content-blocks/BlockBreadcrumbs';
import { BlockButtonsWrapper } from '~content-blocks/BlockButtons';
import { BlockCardsWithoutDescription } from '~content-blocks/BlockCardsWithoutDescription';
Expand All @@ -10,6 +11,7 @@ import { BlockEventbrite } from '~content-blocks/BlockEventbrite';
import { BlockHeading } from '~content-blocks/BlockHeading';
import { BlockHetArchiefHeaderSearch } from '~content-blocks/BlockHetArchiefHeaderSearch/BlockHetArchiefHeaderSearch';
import { BlockHetArchiefImageTextBackground } from '~content-blocks/BlockHetArchiefImageTextBackground';
import { BlockHetArchiefQuote } from '~content-blocks/BlockHetArchiefQuote';
import { BlockHighlightText } from '~content-blocks/BlockHighlightText';
import { BlockHomepageBanner } from '~content-blocks/BlockHomepageBanner';
import { BlockIFrame } from '~content-blocks/BlockIFrame';
Expand All @@ -26,7 +28,6 @@ import { BlockMaintainersGrid } from '~content-blocks/BlockMaintainersGrid';
import { BlockOverviewNewspaperTitles } from '~content-blocks/BlockOverviewNewspaperTitles';
import { BlockOverviewWithCarousel } from '~content-blocks/BlockOverviewWithCarousel/BlockOverviewWithCarousel.tsx';
import { BlockPageOverviewWrapper } from '~content-blocks/BlockPageOverview';
import { BlockQuote } from '~content-blocks/BlockQuote';
import { BlockRichTextWrapper } from '~content-blocks/BlockRichText';
import { BlockScrollDownNudge } from '~content-blocks/BlockScrollDownNudge';
import { BlockProjectSpotlightWrapper, BlockSpotlight } from '~content-blocks/BlockSpotlight';
Expand Down Expand Up @@ -64,7 +65,7 @@ export function GET_BLOCK_COMPONENT(
[ContentBlockType.MediaPlayer]: BlockVideoWrapper,
[ContentBlockType.PageOverview]: BlockPageOverviewWrapper,
[ContentBlockType.ProjectsSpotlight]: BlockProjectSpotlightWrapper,
[ContentBlockType.Quote]: BlockQuote,
[ContentBlockType.AvoQuote]: BlockAvoQuote,
[ContentBlockType.RichTextTwoColumns]: BlockRichTextWrapper,
[ContentBlockType.RichText]: BlockRichTextWrapper,
[ContentBlockType.Spotlight]: BlockSpotlight,
Expand All @@ -90,6 +91,7 @@ export function GET_BLOCK_COMPONENT(
[ContentBlockType.Breadcrumbs]: BlockBreadcrumbs,
[ContentBlockType.HetArchiefImageTextBackground]: BlockHetArchiefImageTextBackground,
[ContentBlockType.OverviewWithCarousel]: BlockOverviewWithCarousel,
[ContentBlockType.HetArchiefQuote]: BlockHetArchiefQuote,
[ContentBlockType.HomepageBanner]: BlockHomepageBanner,
[ContentBlockType.HighlightText]: BlockHighlightText,
[ContentBlockType.ThemeReels]: BlockThemeReels,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,47 +1,60 @@
import type { FileUploadProps } from '~shared/components/FileUpload/FileUpload';
import { tText } from '~shared/helpers/translation-functions';
import { AVO, HET_ARCHIEF } from '~shared/types';
import type {
AvoQuoteBlockComponentState,
ContentBlockConfig,
DefaultContentBlockState,
QuoteBlockComponentState,
} from '../../../types/content-block.types';
import { ContentBlockType } from '../../../types/content-block.types';

import { BLOCK_FIELD_DEFAULTS, BLOCK_STATE_DEFAULTS, FILE_FIELD, TEXT_FIELD } from '../defaults';

export const INITIAL_QUOTE_COMPONENTS_STATE = (): QuoteBlockComponentState => ({
export const INITIAL_AVO_QUOTE_COMPONENTS_STATE = (): AvoQuoteBlockComponentState => ({
quote: '',
authorName: '',
authorInitials: '',
});

export const INITIAL_QUOTE_BLOCK_STATE = (): DefaultContentBlockState =>
export const INITIAL_AVO_QUOTE_BLOCK_STATE = (): DefaultContentBlockState =>
BLOCK_STATE_DEFAULTS({
padding: {
top: 'top-small',
bottom: 'bottom-small',
},
});

export const QUOTE_BLOCK_CONFIG = (position = 0): ContentBlockConfig => ({
export const AVO_QUOTE_BLOCK_CONFIG = (position = 0): ContentBlockConfig => ({
position,
name: tText('admin/content-block/helpers/generators/quote___quote'),
type: ContentBlockType.Quote,
name: tText('admin/content-block/helpers/generators/quote___quote', {}, [AVO, HET_ARCHIEF]),
type: ContentBlockType.AvoQuote,
components: {
state: INITIAL_QUOTE_COMPONENTS_STATE(),
state: INITIAL_AVO_QUOTE_COMPONENTS_STATE(),
fields: {
quote: TEXT_FIELD(
{
label: tText('admin/content-block/helpers/generators/quote___quote'),
label: tText('admin/content-block/helpers/generators/quote___quote', {}, [
AVO,
HET_ARCHIEF,
]),
},
tText('admin/content-block/helpers/generators/quote___quote-is-verplicht')
tText('admin/content-block/helpers/generators/quote___quote-is-verplicht', {}, [
AVO,
HET_ARCHIEF,
])
),
authorName: TEXT_FIELD({
label: tText('admin/content-block/helpers/generators/quote___auteur'),
label: tText('admin/content-block/helpers/generators/quote___auteur', {}, [
AVO,
HET_ARCHIEF,
]),
validator: undefined,
}),
authorInitials: TEXT_FIELD({
label: tText('admin/content-block/helpers/generators/quote___initialen'),
label: tText('admin/content-block/helpers/generators/quote___initialen', {}, [
AVO,
HET_ARCHIEF,
]),
validator: undefined,
}),
authorImage: FILE_FIELD(
Expand All @@ -54,7 +67,7 @@ export const QUOTE_BLOCK_CONFIG = (position = 0): ContentBlockConfig => ({
},
Comment thread
RobbeBierebeeck marked this conversation as resolved.
},
block: {
state: INITIAL_QUOTE_BLOCK_STATE(),
state: INITIAL_AVO_QUOTE_BLOCK_STATE(),
fields: BLOCK_FIELD_DEFAULTS(),
},
});
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { loremIpsum } from 'lorem-ipsum';
import React from 'react';
import { afterEach, describe, it } from 'vitest';

import { BlockQuote } from './BlockQuote';
import { BlockAvoQuote } from './BlockAvoQuote';

const customClass = 'c-block-custom';
const quote = loremIpsum({ count: 10 });
Expand All @@ -12,7 +12,7 @@ const authorName = loremIpsum({ count: 2 });
const authorInitials = 'AE';

const quoteExample = (
<BlockQuote
<BlockAvoQuote
className={customClass}
quote={quote}
authorImage={authorImage}
Expand All @@ -25,7 +25,7 @@ afterEach(() => {
cleanup();
});

describe('<BlockQuote />', () => {
describe('<BlockAvoQuote />', () => {
it('Should be able to render', () => {
render(quoteExample);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@ import clsx from 'clsx';
import type { FunctionComponent } from 'react';
import React from 'react';

import './BlockQuote.scss';
import './BlockAvoQuote.scss';

export interface BlockQuoteProps extends DefaultProps {
export interface BlockAvoQuoteProps extends DefaultProps {
quote: string;
authorImage?: string;
authorName: string;
authorInitials?: string;
}

export const BlockQuote: FunctionComponent<BlockQuoteProps> = ({
export const BlockAvoQuote: FunctionComponent<BlockAvoQuoteProps> = ({
className,
quote,
authorImage,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './BlockAvoQuote';
export * from './BlockAvoQuote.editorconfig';
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import {
GET_BACKGROUND_COLOR_OPTIONS_ARCHIEF,
GET_FOREGROUND_COLOR_OPTIONS_ARCHIEF,
} from '~modules/content-page/const/get-color-options';
import { tText } from '~shared/helpers/translation-functions';
import { HET_ARCHIEF } from '~shared/types';
import type {
ContentBlockConfig,
DefaultContentBlockState,
HetArchiefQuoteBlockComponentState,
} from '../../../types/content-block.types';
import { Color, ContentBlockEditor, ContentBlockType } from '../../../types/content-block.types';

import {
BACKGROUND_COLOR_FIELD,
BLOCK_FIELD_DEFAULTS,
BLOCK_STATE_DEFAULTS,
FOREGROUND_COLOR_FIELD,
TEXT_FIELD,
} from '../defaults';

export const INITIAL_HET_ARCHIEF_QUOTE_COMPONENTS_STATE =
(): HetArchiefQuoteBlockComponentState => ({
quote: '',
authorName: '',
textColor: Color.White,
frameColor: Color.Black,
});

export const INITIAL_HET_ARCHIEF_QUOTE_BLOCK_STATE = (): DefaultContentBlockState =>
BLOCK_STATE_DEFAULTS({
padding: {
top: 'top-small',
bottom: 'bottom-small',
},
});

export const HET_ARCHIEF_QUOTE_BLOCK_CONFIG = (position = 0): ContentBlockConfig => ({
position,
name: tText('admin/content-block/helpers/generators/hetarchief-quote___quote-kader', {}, [
HET_ARCHIEF,
]),
type: ContentBlockType.HetArchiefQuote,
components: {
state: INITIAL_HET_ARCHIEF_QUOTE_COMPONENTS_STATE(),
fields: {
quote: TEXT_FIELD(
{
label: tText('admin/content-block/helpers/generators/hetarchief-quote___quote', {}, [
HET_ARCHIEF,
]),
editorType: ContentBlockEditor.TextArea,
},
tText('admin/content-block/helpers/generators/hetarchief-quote___quote-is-verplicht', {}, [
HET_ARCHIEF,
])
),
authorName: TEXT_FIELD({
label: tText('admin/content-block/helpers/generators/hetarchief-quote___auteur', {}, [
HET_ARCHIEF,
]),
validator: undefined,
}),
textColor: FOREGROUND_COLOR_FIELD(
tText('admin/content-block/helpers/generators/hetarchief-quote___tekstkleur', {}, [
HET_ARCHIEF,
]),
GET_FOREGROUND_COLOR_OPTIONS_ARCHIEF()[1]
),
frameColor: BACKGROUND_COLOR_FIELD(
tText('admin/content-block/helpers/generators/hetarchief-quote___kleur-kader', {}, [
HET_ARCHIEF,
]),
GET_BACKGROUND_COLOR_OPTIONS_ARCHIEF()[5]
),
},
Comment thread
RobbeBierebeeck marked this conversation as resolved.
},
block: {
state: INITIAL_HET_ARCHIEF_QUOTE_BLOCK_STATE(),
fields: BLOCK_FIELD_DEFAULTS(),
},
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mixins gebruiken als ook variabelen. Dit ziet er ook goed uit mobiel?
Al deze vaste waardes lijken me zwaar af wijken van bestaande zaken

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image image

Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
@use "../../../../shared/styles/settings/variables" as variables;
@use "../../../../shared/styles/mixins/typography" as typography;

// Width of the column holding the quote mark (Figma node 455:5722).
$mark-column-width: variables.$g-spacer-unit * 13;

// Space between the end of the text column and the frame edge, so the text stays clear of the
// rounded right side. 24 units is the gap Figma leaves at the design's 1008px frame width.
$text-inset-right: variables.$g-spacer-unit * 24;
$text-inset-right-tablet: variables.$g-spacer-unit * 8;

// Figma node 455:5722: rounded-tr/br only, square on the left. At the design's 228px height CSS
// clamps both radii to height/2 so this reads as a pill; past ~800px of height it stops growing,
// which is the point - an unbounded 9999px radius would keep eating into a long quote.
$frame-radius: 40rem;
$frame-radius-mobile: 12rem;

$mark-font-size: variables.$g-spacer-unit * 8;
$mark-line-height: variables.$g-spacer-unit * 9;

.c-block-het-archief-quote {
display: grid;
grid-template-columns: $mark-column-width 1fr;
grid-template-areas:
'mark quote'
'. author';
margin: 0;
padding: variables.$g-spacer-unit * 5 $text-inset-right variables.$g-spacer-unit * 5 0;
background: var(--frame-color);
color: var(--text-color);
border-radius: 0 $frame-radius $frame-radius 0;

// Figma emits the deprecated `word-break: break-word`; this is its modern equivalent.
overflow-wrap: break-word;

&__mark {
grid-area: mark;

// Figma node 455:5723 sits at top 28 while the quote sits at top 40, so the mark is
// raised out of the shared grid row and centred in its own column.
margin-top: -(variables.$g-spacer-unit * 1.5);
text-align: center;
font-size: $mark-font-size;
line-height: $mark-line-height;

@media (max-width: variables.$g-bp2) {
// Figma node 455:7187: in the stacked layout the mark is in normal flow and
// left-aligned with the text below it.
margin-top: 0;
text-align: left;
}
}

&__quote {
grid-area: quote;
margin: 0;
white-space: pre-line;

// Figma node 455:5724, style "P - XL".
@include typography.sofia-pro-body-xl();

@media (max-width: variables.$g-bp2) {
// Figma node 455:7186: gap below the mark, plus the padding on the text group that
// holds the quote and the author.
margin-top: variables.$g-spacer-unit * 2;
margin-left: variables.$g-spacer-unit;
}
}

&__author {
grid-area: author;
margin-top: variables.$g-spacer-unit;

// Figma node 455:5725, style "P - S".
@include typography.sofia-pro-body-xs();

@media (max-width: variables.$g-bp2) {
margin-bottom: variables.$g-spacer-unit;
margin-left: variables.$g-spacer-unit;
}
}

// Below the design's 1008px frame width the desktop inset eats too much of the text column,
// so it scales back to a third while the pill shape is kept.
@media (max-width: variables.$g-bp4) {
padding-right: $text-inset-right-tablet;
}

@media (max-width: variables.$g-bp2) {
grid-template-columns: 1fr;
grid-template-areas:
'mark'
'quote'
'author';

// Figma node 455:7186: a single top-right radius - the desktop's two-corner pill does
// not carry over to mobile.
padding: variables.$g-spacer-unit * 3 variables.$g-spacer-unit * 2.5;
border-radius: 0 $frame-radius-mobile 0 0;
}
}
Loading