This CSS code defines a custom font family called “Guardian Headline Full” with multiple font weights and styles. It includes light, regular, medium, and semibold weights, each with normal and italic variations. The fonts are loaded from the Guardian’s servers in WOFF2, WOFF, and TrueType formats to ensure compatibility across different browsers.@font-face {
font-family: Guardian Headline Full;
src: url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-Bold.woff2) format(“woff2”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-Bold.woff) format(“woff”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-Bold.ttf) format(“truetype”);
font-weight: 700;
font-style: normal;
}
@font-face {
font-family: Guardian Headline Full;
src: url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-BoldItalic.woff2) format(“woff2”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-BoldItalic.woff) format(“woff”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-BoldItalic.ttf) format(“truetype”);
font-weight: 700;
font-style: italic;
}
@font-face {
font-family: Guardian Headline Full;
src: url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-Black.woff2) format(“woff2”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-Black.woff) format(“woff”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-Black.ttf) format(“truetype”);
font-weight: 900;
font-style: normal;
}
@font-face {
font-family: Guardian Headline Full;
src: url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-BlackItalic.woff2) format(“woff2”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-BlackItalic.woff) format(“woff”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-BlackItalic.ttf) format(“truetype”);
font-weight: 900;
font-style: italic;
}
@font-face {
font-family: Guardian Titlepiece;
src: url(https://assets.guim.co.uk/static/frontend/fonts/guardian-titlepiece/noalts-not-hinted/GTGuardianTitlepiece-Bold.woff2) format(“woff2”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-titlepiece/noalts-not-hinted/GTGuardianTitlepiece-Bold.woff) format(“woff”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-titlepiece/noalts-not-hinted/GTGuardianTitlepiece-Bold.ttf) format(“truetype”);
font-weight: 700;
font-style: normal;
}
@font-face {
font-family: Guardian Headline Full;
src: url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-Light.woff2) format(“woff2”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-Light.woff) format(“woff”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-Light.ttf) format(“truetype”);
font-weight: 300;
font-style: normal;
}
@font-face {
font-family: Guardian Headline Full;
src: url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-LightItalic.woff2) format(“woff2”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-LightItalic.woff) format(“woff”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-LightItalic.ttf) format(“truetype”);
font-weight: 300;
font-style: italic;
}
@font-face {
font-family: Guardian Headline Full;
src: url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-Regular.woff2) format(“woff2”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-Regular.woff) format(“woff”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-Regular.ttf) format(“truetype”);
font-weight: 400;
font-style: normal;
}
@font-face {
font-family: Guardian Headline Full;
src: url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-RegularItalic.woff2) format(“woff2”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-RegularItalic.woff) format(“woff”),
url(https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-RegularItalic.ttf) format(“truetype”);
font-weight: 400;
font-style: italic;
}The font “Guardian Headline Full” includes several styles and weights. The regular italic style uses font-weight 400 and is available in woff2, woff, and ttf formats. The medium style has a weight of 500 and is normal, not italic. The medium italic also uses weight 500 but with an italic style. The semibold style is normal with a weight of 600, and its italic version has the same weight. The bold style is normal with weight 700, and the bold italic matches that weight in italic. The black style is normal with weight 900, and the black italic is the italic version of that weight.The provided text appears to be a mix of CSS code for font definitions and responsive grid layouts. Here is a fluent, natural English description of its meaning:
The code defines two custom fonts for the Guardian website: a bold italic headline font and a bold titlepiece font, specifying their file sources and formats.
It then sets up a responsive grid layout for article content. On smaller screens, the layout is a single column with areas stacked vertically for media, title, headline, and other elements. As the screen gets wider, the layout adjusts. On medium screens, it remains a single column but reorders some areas. On larger screens, it switches to a two-column layout with a main content area and a right sidebar. On the largest screens, it adds a left border and adjusts the grid structure further, specifically controlling the padding and positioning of elements like captions for immersive images.For interactive grid figures with immersive captions, the caption padding is set to 4 pixels at the top and 0 elsewhere. Within various content bodies, the lines and meta elements in interactive grids are placed in a specific grid area. The lines element has a height that adjusts to its content and a top margin of 5 pixels, while the meta element has a top margin of 18 pixels.
On larger screens, the interactive grid uses a five-column layout with specific widths.
For iOS and Android devices, the article header’s standfirst text uses the Guardian Headline font with medium weight. The section kicker is displayed as a block, and its first letter is capitalized. A keyline element has increased top padding. The byline author name uses a bold Guardian Headline font, and links within it are also bold. Images within articles have an automatic height, and paragraphs following atomic elements have no top margin.
A custom font, Guardian Headline Full, is loaded in three weights: light and light italic, from specific web sources.The provided text appears to be a series of CSS `@font-face` rules for a font family named “Guardian Headline Full.” These rules define different font weights and styles (like regular, italic, medium, bold, etc.) and specify the web addresses (URLs) where the actual font files (in formats like WOFF2, WOFF, and TTF) are located for the browser to download and use.@font-face {
font-family: ‘Guardian Headline Full’;
src: url(‘https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-Black.woff2’) format(‘woff2’),
url(‘https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-Black.woff’) format(‘woff’),
url(‘https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-Black.ttf’) format(‘truetype’);
font-weight: 900;
font-style: normal;
}
@font-face {
font-family: ‘Guardian Headline Full’;
src: url(‘https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-BlackItalic.woff2’) format(‘woff2’),
url(‘https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-BlackItalic.woff’) format(‘woff’),
url(‘https://assets.guim.co.uk/static/frontend/fonts/guardian-headline/noalts-not-hinted/GHGuardianHeadline-BlackItalic.ttf’) format(‘truetype’);
font-weight: 900;
font-style: italic;
}
@font-face {
font-family: ‘Guardian Titlepiece’;
src: url(‘https://assets.guim.co.uk/static/frontend/fonts/guardian-titlepiece/noalts-not-hinted/GTGuardianTitlepiece-Bold.woff2’) format(‘woff2’),
url(‘https://assets.guim.co.uk/static/frontend/fonts/guardian-titlepiece/noalts-not-hinted/GTGuardianTitlepiece-Bold.woff’) format(‘woff’),
url(‘https://assets.guim.co.uk/static/frontend/fonts/guardian-titlepiece/noalts-not-hinted/GTGuardianTitlepiece-Bold.ttf’) format(‘truetype’);
font-weight: 700;
font-style: normal;
}
@media (min-width: 71.25em) {
.content__main-column–interactive {
margin-left: 160px;
}
}
@media (min-width: 81.25em) {
.content__main-column–interactive {
margin-left: 240px;
}
}
.content__main-column–interactive .element-atom {
max-width: 620px;
}
@media (max-width: 46.24em) {
.content__main-column–interactive .element-atom {
max-width: 100%;
}
}
.content__main-column–interactive .element-showcase {
margin-left: 0;
}
@media (min-width: 46.25em) {
.content__main-column–interactive .element-showcase {
max-width: 620px;
}
}
@media (min-width: 71.25em) {
.content__main-column–interactive .element-showcase {
max-width: 860px;
}
}
.content__main-column–interactive .element-immersive {
max-width: 1100px;
}
@media (max-width: 46.24em) {
.content__main-column–interactive .element-immersive {
width: calc(100vw – var(–scrollbar-width, 0px));
position: relative;
left: 50%;
right: 50%;
margin-left: calc(-50vw + var(–half-scrollbar-width, 0px)) !important;
margin-right: calc(-50vw + var(–half-scrollbar-width, 0px)) !important;
}
}
@media (min-width: 46.25em) {
.content__main-column–interactive .element-immersive {
transform: translate(-20px);
width: calc(100% + 60px);
}
}
@media (max-width: 71.24em) {
.content__main-column–interactive .element-immersive {
margin-left: 0;
margin-right: 0;
}
}
@media (min-width: 71.25em) {
.content__main-column–interactive .element-immersive {
transform: translate(0);
width: auto;
}
}
@media (min-width: 81.25em) {
.content__main-column–interactive .element-immersive {
max-width: 1260px;
}
}
.content__main-column–interactive p,
.content__main-column–interactive ul {
max-width: 620px;
}
.content__main-column–interactive:before {
position: absolute;
top: 0;
height: calc(100% + 15px);
min-height: 100px;
content: “”;
}
@media (min-width: 71.25em) {
.content__main-column–interactive:before {
border-left: 1px solid #dcdcdc;
z-index: -1;
left: -10px;
}
}
@media (min-width: 81.25em) {
.content__main-column–interactive:before {
border-left: 1px solid #dcdcdc;
left: -11px;
}
}
.content__main-column–interactive .element-atom {
margin-top: 0;
margin-bottom: 0;
padding-bottom: 12px;
padding-top: 12px;
}
.content__main-column–interactive p + .element-atom {
padding-top: 0;
padding-bottom: 0;
margin-top: 12px;
margin-bottom: 12px;
}
.content__main-column–interactive .element-inline {
max-width: 620px;
}
@media (min-width: 61.25em) {
figure[data-spacefinder-role=”inline”].element {
max-width: 620px;
}
}
:root {
–dateline: #606060;
–headerBorder: #dcdcdc;
–captionText: #999;
–captionBackground: hsla(0, 0%, 7%, 0.72);
–feature: #c70000;
–new-pillar-colour: var(–primary-pillar, var(–feature));
}
.content__main-column–interactive .element.element-atom,
.element.element-atom {
padding: 0;
}
#article-body > div .element-atom:first-of-type + p:first-of-type,
#article-body > div .element-atom:first-of-type {The first paragraph after certain elements like a sign-in gate, horizontal rule, or specific atoms gets a top padding of 14 pixels.
For the first letter of that first paragraph in the same contexts, apply a special drop cap style. This uses a specific headline font, sets the size to 111px with a line height of 92px, floats it left, makes it uppercase, and colors it with a CSS variable. It also adds an 8px right margin.
If a paragraph comes directly after a horizontal rule, its top padding is removed.
Elements with the attribute `data-gu-name=”pullquote”` are given a maximum width of 620 pixels.
For showcase elements within the main article containers, their captions are positioned statically, set to full width, and also limited to a 620px maximum width.
Immersive elements are set to span the full viewport width, minus the scrollbar. On screens smaller than 71.24em, these immersive elements are constrained to a maximum width of 978px, and their captions receive inline padding.@media (max-width: 71.24em) and (min-width: 30em) {
.element.element–immersive.element-immersive figcaption {
padding-inline: 20px;
}
}
@media (min-width: 46.25em) and (max-width: 61.24em) {
.element.element–immersive.element-immersive {
max-width: 738px;
}
}
@media (max-width: 46.24em) {
.element.element–immersive.element-immersive {
margin-left: -10px !important;
margin-right: 0 !important;
left: 0;
}
}
@media (max-width: 46.24em) and (min-width: 30em) {
.element.element–immersive.element-immersive {
margin-left: -20px !important;
}
.element.element–immersive.element-immersive figcaption {
padding-inline: 20px;
}
}
@media (min-width: 61.25em) {
.furniture-wrapper {
display: grid;
grid-column-gap: 20px;
grid-row-gap: 0px;
grid-template-columns: [title-start headline-start meta-start standfirst-start] repeat(5, 1fr) [title-end headline-end meta-end standfirst-end portrait-start] repeat(5, 1fr) [portrait-end];
grid-template-rows: [title-start portrait-start] .25fr [title-end headline-start] 1fr [headline-end standfirst-start] .75fr [standfirst-end meta-start] auto [meta-end portrait-end];
}
.furniture-wrapper #headline > div:first-child,
.furniture-wrapper [data-gu-name=headline] > div:first-child,
.furniture-wrapper .headline > div:first-child {
border-top: 1px solid var(–headerBorder);
}
.furniture-wrapper #meta,
.furniture-wrapper [data-gu-name=meta] {
position: relative;
padding-top: 2px;
margin-right: 0;
}
.furniture-wrapper .standfirst .content__standfirst,
.furniture-wrapper #standfirst .content__standfirst,
.furniture-wrapper [data-gu-name=standfirst] .content__standfirst {
margin-bottom: 4px;
}
.furniture-wrapper .standfirst ul li,
.furniture-wrapper #standfirst ul li,
.furniture-wrapper [data-gu-name=standfirst] ul li {
font-size: 20px;
}
.furniture-wrapper .standfirst li a,
.furniture-wrapper .standfirst a,
.furniture-wrapper #standfirst li a,
.furniture-wrapper #standfirst a,
.furniture-wrapper [data-gu-name=standfirst] li a,
.furniture-wrapper [data-gu-name=standfirst] a {
border-bottom: none;
background-image: none !important;
text-decoration: underline;
text-underline-offset: 6px;
text-decoration-color: var(–headerBorder, #dcdcdc);
}
.furniture-wrapper .standfirst li a:hover,
.furniture-wrapper .standfirst a:hover,
.furniture-wrapper #standfirst li a:hover,
.furniture-wrapper #standfirst a:hover,
.furniture-wrapper [data-gu-name=standfirst] li a:hover,
.furniture-wrapper [data-gu-name=standfirst] a:hover {
text-decoration-color: var(–new-pillar-colour);
}
.furniture-wrapper .standfirst p:first-of-type,
.furniture-wrapper #standfirst p:first-of-type,
.furniture-wrapper [data-gu-name=standfirst] p:first-of-type {
border-top: 1px solid var(–headerBorder);
padding-bottom: 0;
}
}
@media (min-width: 61.25em) and (min-width: 71.25em) {
.furniture-wrapper .standfirst p:first-of-type,
.furniture-wrapper #standfirst p:first-of-type,
.furniture-wrapper [data-gu-name=standfirst] p:first-of-type {
border-top: unset;
}
}
@media (min-width: 61.25em) {
.furniture-wrapper figure {
margin: 0 0 0 -10px;
}
.furniture-wrapper figure[data-spacefinder-role=inline].element {
max-width: 630px;
}
}
@media (min-width: 71.25em) {
.furniture-wrapper {
grid-template-columns: [title-start headline-start meta-start] repeat(2, 1fr) [meta-end standfirst-start] repeat(5, 1fr) [title-end headline-end standfirst-end portrait-start] repeat(7, 1fr) [portrait-end];
grid-template-rows: [title-start portrait-start] 80px [title-end headline-start] auto [headline-end standfirst-start meta-start] auto [standfirst-end meta-end portrait-end];
}
.furniture-wrapper #meta:before,
.furniture-wrapper [data-gu-name=meta]:before {
content: “”;
width: 540px;
position: absolute;
top: 0;
background-color: var(–headerBorder);
height: 1px;
}
.furniture-wrapper .standfirst p,
.furniture-wrapper #standfirst p,
.furniture-wrapper [data-gu-name=standfirst] p {
border-top: unset;
}
.furniture-wrapper .standfirst:before,
.furniture-wrapper #standfirst:before,
.furniture-wrapper [data-gu-name=standfirst]:before {
content: “”;
width: 1px;
background-color: var(–headerBorder);
height: 100%;
position: absolute;
top: 0;
left: .5px;
}
}
@media (min-width: 81.25em) {
.furniture-wrapper {
grid-template-columns: [title-start headline-start meta-start] repeat(3, 1fr) [meta-end standfirst-start];
}
}repeat(5, 1fr) [title-end headline-end standfirst-end portrait-start] repeat(8, 1fr) [portrait-end];
grid-template-rows: [title-start portrait-start] 0.25fr [title-end headline-start] 1fr [headline-end standfirst-start meta-start] 0.75fr [standfirst-end meta-end portrait-end]
}
.furniture-wrapper #meta:before,
.furniture-wrapper [data-gu-name=meta]:before {
width: 620px
}
.furniture-wrapper .standfirst:before,
.furniture-wrapper #standfirst:before,
.furniture-wrapper [data-gu-name=standfirst]:before {
left: -0.5px
}
}
.furniture-wrapper .article-header .content__labels>div,
.furniture-wrapper [data-gu-name=title] .content__labels>div {
padding-top: 2px
}
.furniture-wrapper #headline h1,
.furniture-wrapper [data-gu-name=headline] h1,
.furniture-wrapper .headline h1 {
font-weight: 600;
max-width: 620px;
font-size: 32px
}
@media (min-width: 71.25em) {
.furniture-wrapper #headline h1,
.furniture-wrapper [data-gu-name=headline] h1,
.furniture-wrapper .headline h1 {
max-width: 540px;
font-size: 50px
}
}
@media (min-width: 46.25em) {
.furniture-wrapper .keyline-4,
.furniture-wrapper [data-gu-name=lines] {
margin-right: 0
}
}
@media (min-width: 61.25em) {
.furniture-wrapper .keyline-4,
.furniture-wrapper [data-gu-name=lines] {
display: none
}
}
.furniture-wrapper .keyline-4 svg,
.furniture-wrapper [data-gu-name=lines] svg {
stroke: var(–headerBorder)
}
@media (min-width: 46.25em) {
.furniture-wrapper #meta,
.furniture-wrapper [data-gu-name=meta] {
margin-right: 0
}
}
.furniture-wrapper #meta .meta__social,
.furniture-wrapper #meta .meta__social ul li a span,
.furniture-wrapper #meta .meta__comment,
.furniture-wrapper [data-gu-name=meta] .meta__social,
.furniture-wrapper [data-gu-name=meta] .meta__social ul li a span,
.furniture-wrapper [data-gu-name=meta] .meta__comment {
border-color: var(–headerBorder)
}
.furniture-wrapper #meta .content__meta-container_dcr>div>gu-island,
.furniture-wrapper [data-gu-name=meta] .content__meta-container_dcr>div>gu-island {
display: none
}
.furniture-wrapper .standfirst,
.furniture-wrapper #standfirst,
.furniture-wrapper [data-gu-name=standfirst] {
margin-left: -10px;
padding-left: 10px;
position: relative
}
@media (min-width: 46.25em) {
.furniture-wrapper .standfirst,
.furniture-wrapper #standfirst,
.furniture-wrapper [data-gu-name=standfirst] {
padding-top: 2px
}
}
.furniture-wrapper .standfirst p,
.furniture-wrapper #standfirst p,
.furniture-wrapper [data-gu-name=standfirst] p {
font-weight: 400;
font-size: 20px;
padding-bottom: 14px
}
.furniture-wrapper #main-media,
.furniture-wrapper [data-gu-name=media] {
position: relative;
margin-top: 0;
margin-bottom: 2px;
grid-area: portrait
}
.furniture-wrapper #main-media div div,
.furniture-wrapper [data-gu-name=media] div div {
width: 100%;
margin-inline: 0
}
@media (min-width: 61.25em) {
.furniture-wrapper #main-media,
.furniture-wrapper [data-gu-name=media] {
margin-bottom: 0
}
}
@media (max-width: 46.24em) {
.furniture-wrapper #main-media,
.furniture-wrapper [data-gu-name=media] {
width: calc(100vw – var(–scrollbar-width, 0px));
margin-left: -10px
}
}
@media (max-width: 46.24em) and (min-width: 30em) {
.furniture-wrapper #main-media,
.furniture-wrapper [data-gu-name=media] {
margin-left: -20px
}
}
.furniture-wrapper figcaption {
position: absolute;
bottom: 0;
padding: 4px 10px 12px;
background-color: var(–captionBackground);
color: var(–captionText);
max-width: unset;
width: 100%;
margin-bottom: 0;
min-height: 46px
}
.furniture-wrapper figcaption span {
color: var(–headerBorder)
}
.furniture-wrapper figcaption span svg {
fill: var(–headerBorder)
}
.furniture-wrapper figcaption span:nth-of-type(1) {
display: none
}
.furniture-wrapper figcaption span:nth-of-type(2) {
display: block;
max-width: 90%
}
@media (min-width: 30em) {
.furniture-wrapper figcaption {
padding: 4px 20px 12px
}
}
.furniture-wrapper figcaption.hidden {
opacity: 0
}
.furniture-wrapper #caption-button {
display: block;
position: absolute;
bottom: 10px;
right: 8px;
z-index: 30;
background-color: var(–captionBackground);
border: none;
border-radius: 50%;
padding: 6px 5px 5px
}
.furniture-wrapper #caption-button svg {
transform: scale(0.85)
}
@media (min-width: 30em) {
.furniture-wrapper #caption-button {
right: 10px
}
}
@media (min-width: 71.25em) {
.content__main-column–interactive:before {
top: -12px !important;
height: calc(100% + 24px) !important
}The main column’s interactive headings have a maximum width of 620 pixels. For iOS and Android devices, the color scheme adjusts: a dark background is set, along with specific accent colors for regular and dark modes. In dark mode, the pillar color changes to a designated dark mode shade.
On iOS and Android, the first letter of the first paragraph in article containers is styled with a secondary pillar color. The article header height is set to zero, while the furniture wrapper receives specific padding. Labels within the furniture wrapper use a bold, capitalized font in the pillar color, and headlines are styled with a large, bold font in a near-black color.For iOS and Android devices, the image elements within furniture wrappers across feature, standard, and comment article containers are styled with a relative position, a top margin of 14px, a left offset of -10px, and a width that fills the viewport minus the scrollbar. Their inner elements, images, and links have a transparent background and the same responsive width.
The standfirst sections in these containers have top and bottom padding and a right margin offset. The paragraphs within use the Guardian’s headline font family, and the links inside them are styled consistently.This CSS code styles links and author information in article sections. It sets link colors to a specific variable, removes backgrounds, and adds underlines. On iOS and Android devices, it changes the underline color when hovering over links and adjusts the color of author names. It also removes margins and padding from certain elements.On iOS and Android devices, for feature, standard, and comment article containers, the following styles apply:
– SVG icons within the meta misc section use the new pillar color for strokes.
– The caption button in showcase elements is displayed as a flex container, centered with 5px padding, 28px width and height, positioned 14px from the right.
– The article body has 12px horizontal padding.
– Non-thumbnail, non-immersive image figures span the viewport width minus 24px and the scrollbar width, with no margin and auto height. Their captions have no padding.
– Immersive image figures span the viewport width minus the scrollbar width.
– Quoted blockquotes in prose have a before pseudo-element styled.For iOS and Android devices, quoted text in articles will use the new pillar color. Links within articles will be underlined with a specific offset and color, changing on hover.
In dark mode, article backgrounds become dark gray, while labels, headlines, and standfirst text adopt designated colors. Links and author names within these sections will also use specific colors for better visibility.This CSS code sets styles for different article containers on Android and iOS. It defines colors for author bylines, strokes for icons, and caption colors for showcase images. Blockquotes are styled with a specific color, and various content containers have a dark background. The code also includes styles for the first letter of paragraphs following certain elements.This appears to be a CSS selector targeting the first letter of paragraphs in specific containers on iOS and Android devices. The selector applies to various article containers (feature, standard, comment) and looks for paragraphs following certain elements like `.element-atom`, `.sign-in-gate`, or `#sign-in-gate`.For Android and iOS devices, the first letter of paragraphs following specific elements in various article containers is styled with a custom color variable.For comment articles on iOS and Android, the standfirst section has a top padding of 24 pixels and no top margin. The main heading (h2) in the article text is set to 24 pixels in size.
On iOS, the caption button for feature, standard, and comment articles has a top padding of 6 pixels and 5 pixels on the sides. On Android, the same button has 4 pixels of padding on all sides.
In dark mode, the color scheme adjusts several text and icon colors to lighter shades and specific dark mode pillar colors.
When the page has a Guardian organization logo, the branding element is forced to display.
On iOS and Android, labels and the main headline (h1) within the article header for feature, standard, and comment articles are given a medium font weight (500). This also applies to the headline and paragraph text within the standfirst section.
The page uses a custom background color (#fff4f2) for a weekend essay theme, which is applied to the body and specific article sections.
A decorative lines element is hidden.
The main article header container is positioned relatively. On larger screens, it uses a specific grid layout.
Within the header, a labels container has a fixed height of 70 pixels. An animated book GIF is positioned absolutely in the bottom-right corner of this container. On larger screens, this GIF is enlarged to 110 by 110 pixels.
A full-width horizontal line is added at the bottom of the labels container, extending to the edges of the viewport. On medium-sized screens and above, this line’s width is fixed to 738 pixels and its left position is adjusted.For screens with a minimum width of 61.25em, the furniture wrapper hides the pseudo-elements after divs within content labels in the article header and title sections. When the viewport reaches at least 71.25em, the article header and title areas within the furniture wrapper adjust to a height of 80px. This height increases to 125px at a minimum width of 81.25em.
At 81.25em, the furniture wrapper also applies a -2px top margin to the headline, its data-gu-name counterpart, and the headline class. Within these headline sections, the direct child divs have their bottom padding removed. The portrait main media headline wrapper inside these areas is set to full height, positioned relatively, with hidden overflow and 24px of bottom padding.
Headings, links, and byline spans within this wrapper have no maximum width, a line height of 115%, a font weight of 500, and a font size of 36px, which increases to 50px at 71.25em. On hover, headings and links show a 2px thick underline with a 6px offset.
The standfirst section in the furniture wrapper is positioned relatively with a 4px top padding, which changes to 0 at 61.25em and 2px at 71.25em.
Within the meta section’s content meta container, the branding island element is set to display as a block..furniture-wrapper [data-gu-name=media] {
position: relative;
}
@media (min-width: 61.25em) {
.furniture-wrapper #main-media,
.furniture-wrapper [data-gu-name=media] {
grid-area: portrait;
}
}
.furniture-wrapper #main-media > div,
.furniture-wrapper [data-gu-name=media] > div {
position: relative;
}
.furniture-wrapper #main-media div + span,
.furniture-wrapper [data-gu-name=media] div + span {
display: block;
}
.furniture-wrapper #main-media figure,
.furniture-wrapper [data-gu-name=media] figure {
height: 100%;
margin-left: 10px;
}
.furniture-wrapper #main-media figure picture img,
.furniture-wrapper #main-media figure figcaption,
.furniture-wrapper [data-gu-name=media] figure picture img,
.furniture-wrapper [data-gu-name=media] figure figcaption {
width: calc(100vw – 40px – var(–scrollbar-width, 0px));
height: auto;
margin-left: 10px;
padding: 10px 0;
}
.furniture-wrapper #main-media figure figcaption,
.furniture-wrapper [data-gu-name=media] figure figcaption {
margin-bottom: 10px;
padding: 10px;
}
.furniture-wrapper #main-media figure:before,
.furniture-wrapper [data-gu-name=media] figure:before {
content: “”;
display: block;
width: calc(100vw – 20px – var(–scrollbar-width, 0px));
background-image: url(https://interactive.guim.co.uk/atoms/2025/04/2025-weekend-essay-test/assets/v/1764331689/frame.png);
background-size: contain;
background-position: center;
background-repeat: no-repeat;
position: absolute;
top: 0;
left: 10px;
height: inherit;
}
@media (min-width: 46.25em) {
.furniture-wrapper #main-media figure,
.furniture-wrapper [data-gu-name=media] figure {
margin-left: 0;
}
.furniture-wrapper #main-media figure picture img,
.furniture-wrapper [data-gu-name=media] figure picture img {
width: 670px;
height: auto;
margin-left: 5px;
padding: 15px 10px;
}
.furniture-wrapper #main-media figure:before,
.furniture-wrapper [data-gu-name=media] figure:before {
width: 700px;
left: -10px;
}
.furniture-wrapper #main-media figure figcaption,
.furniture-wrapper [data-gu-name=media] figure figcaption {
width: 650px;
margin-left: 15px;
margin-bottom: 15px;
padding: 15px 10px;
}
}
@media (min-width: 61.25em) {
.furniture-wrapper #main-media figure:before,
.furniture-wrapper [data-gu-name=media] figure:before {
width: 470px;
}
.furniture-wrapper #main-media figure picture img,
.furniture-wrapper #main-media figure figcaption,
.furniture-wrapper [data-gu-name=media] figure picture img,
.furniture-wrapper [data-gu-name=media] figure figcaption {
width: 450px;
margin-left: 0;
}
.furniture-wrapper #main-media figure picture img,
.furniture-wrapper [data-gu-name=media] figure picture img {
padding: 10px 0;
}
.furniture-wrapper #main-media figure figcaption,
.furniture-wrapper [data-gu-name=media] figure figcaption {
margin-bottom: 10px;
}
}
@media (min-width: 71.25em) {
.furniture-wrapper #main-media figure:before,
.furniture-wrapper [data-gu-name=media] figure:before {
width: 550px;
}
.furniture-wrapper #main-media figure picture img,
.furniture-wrapper [data-gu-name=media] figure picture img {
width: 520px;
margin-left: 5px;
padding: 10px 5px;
}
.furniture-wrapper #main-media figure figcaption,
.furniture-wrapper [data-gu-name=media] figure figcaption {
width: 510px;
margin-left: 10px;
margin-bottom: 10px;
}
}
@media (min-width: 81.25em) {
.furniture-wrapper #main-media figure:before,
.furniture-wrapper [data-gu-name=media] figure:before {
width: 630px;
}
.furniture-wrapper #main-media figure picture img,
.furniture-wrapper [data-gu-name=media] figure picture img {
width: 600px;
padding: 15px 0;
}
.furniture-wrapper #main-media figure figcaption,
.furniture-wrapper [data-gu-name=media] figure figcaption {
width: 600px;
margin-left: 5px;
margin-bottom: 15px;
}
}
.furniture-wrapper #main-media #caption-button,
.furniture-wrapper [data-gu-name=media] #caption-button {
right: 15px;
bottom: 20px;
}
@media (min-width: 46.25em) {
.furniture-wrapper #main-media #caption-button,
.furniture-wrapper [data-gu-name=media] #caption-button {
right: 45px;
bottom: 30px;
}
}
@media (min-width: 61.25em) {
.furniture-wrapper #main-media #caption-button,
.furniture-wrapper [data-gu-name=media] #caption-button {
right: 15px;
bottom: 20px;
}
}
@media (min-width: 71.25em) {
.furniture-wrapper #main-media #caption-button,
.furniture-wrapper [data-gu-name=media] #caption-button {
right: 20px;
}
}
@media (min-width: 81.25em) {
.furniture-wrap
}For the main media caption button, set the bottom position to 30px. In the furniture wrapper, center the content within the no-media-div both horizontally and vertically, making it full width. Style the paragraph inside with a 24px font, bold weight, underlined, and a specific color.
On larger screens, remove the left margin and any preceding element from the interactive main column. Style blockquotes within supporting asides with a light background. For the first letter of the first paragraph, use a light font weight. For drop caps following specific elements, use a large, uppercase, serif font in a specific color, floated to the left.
Style level-two headings with a dark orange color, 28px font (32px on larger screens), light weight, and normal line height. If the heading contains strong text, increase the font weight. Set a light background for figures containing iframes.
On apps and specific operating systems, display the follow wrapper with a top margin and set the span font size to 14px. Ensure media elements fit their content. In dark mode, set the body background and weekend essay background to a dark gray, and adjust specific decorative lines accordingly.[data-app-os=android] .furniture-wrapper .article-header:after,
[data-app-os=android] .furniture-wrapper [data-gu-name=title] .content__labels:after {
background-image: url(https://interactive.guim.co.uk/atoms/2025/04/2025-weekend-essay-test/assets/v/1764331689/book-white.gif)
}
[data-rendering-target=apps] .furniture-wrapper .meta__byline gu-island[name=FollowWrapper] svg path,
[data-rendering-target=apps] .furniture-wrapper [data-component=meta-byline] gu-island[name=FollowWrapper] svg path,
[data-app-os=ios] .furniture-wrapper .meta__byline gu-island[name=FollowWrapper] svg path,
[data-app-os=ios] .furniture-wrapper [data-component=meta-byline] gu-island[name=FollowWrapper] svg path,
[data-app-os=android] .furniture-wrapper .meta__byline gu-island[name=FollowWrapper] svg path,
[data-app-os=android] .furniture-wrapper [data-component=meta-byline] gu-island[name=FollowWrapper] svg path {
fill: var(–byline-anchor, #ffffff) !important
}
[data-rendering-target=apps] .furniture-wrapper #main-media figure:before,
[data-rendering-target=apps] .furniture-wrapper [data-gu-name=media] figure:before,
[data-app-os=ios] .furniture-wrapper #main-media figure:before,
[data-app-os=ios] .furniture-wrapper [data-gu-name=media] figure:before,
[data-app-os=android] .furniture-wrapper #main-media figure:before,
[data-app-os=android] .furniture-wrapper [data-gu-name=media] figure:before {
background-image: url(https://interactive.guim.co.uk/atoms/2025/04/2025-weekend-essay-test/assets/v/1764331689/frame-white.png) !important
}
body.ios,
body.android {
background-color: #fff
}
body.ios #feature-article-container .furniture-wrapper .content__labels,
body.ios #standard-article-container .furniture-wrapper .content__labels,
body.ios #comment-article-container .furniture-wrapper .content__labels,
body.android #feature-article-container .furniture-wrapper .content__labels,
body.android #standard-article-container .furniture-wrapper .content__labels,
body.android #comment-article-container .furniture-wrapper .content__labels,
body.ios #feature-article-container .furniture-wrapper h1.headline,
body.ios #standard-article-container .furniture-wrapper h1.headline,
body.ios #comment-article-container .furniture-wrapper h1.headline,
body.android #feature-article-container .furniture-wrapper h1.headline,
body.android #standard-article-container .furniture-wrapper h1.headline,
body.android #comment-article-container .furniture-wrapper h1.headline {
font-weight: 500
}
@media (prefers-color-scheme: light) {
html:has(body.ios, body.android) {
background-color: var(–weekend-essay-bg, #fff4f2)
}
}
html:has(body.ios, body.android) body.ios,
html:has(body.ios, body.android) body.android {
–opinion-primary: #c74600;
–byline-anchor: var(–opinion-primary, #c74600);
–primary-pillar: var(–opinion-primary, #c74600)
}
@media (prefers-color-scheme: light) {
html:has(body.ios, body.android) body.ios,
html:has(body.ios, body.android) body.android {
background-color: var(–weekend-essay-bg, #fff4f2)
}
}
@media (prefers-color-scheme: dark) {
html:has(body.ios, body.android) body.ios,
html:has(body.ios, body.android) body.android {
–weekend-essay-bg: #1a1a1a;
–opinion-primary: #ff7f0f
}
html:has(body.ios, body.android) .garnett–pillar-opinion:not(.garnett–type-media).ios .article__body,
html:has(body.ios, body.android) .garnett–pillar-opinion:not(.garnett–type-media).ios .tags {
background-color: unset
}
}
body.ios #feature-article-container,
body.ios #standard-article-container,
body.ios #comment-article-container,
body.android #feature-article-container,
body.android #standard-article-container,
body.android #comment-article-container {
background-color: var(–weekend-essay-bg, #fff4f2)
}
@media (min-width: 61.25em) {
body.ios #feature-article-container .furniture-wrapper,
body.ios #standard-article-container .furniture-wrapper,
body.ios #comment-article-container .furniture-wrapper,
body.android #feature-article-container .furniture-wrapper,
body.android #standard-article-container .furniture-wrapper,
body.android #comment-article-container .furniture-wrapper {
grid-column-gap: 20px;
grid-row-gap: 0px;
grid-template-columns: [title-start headline-start meta-start standfirst-sThe grid is set up with five equal-width columns starting at “tart” and ending at “portrait-end”. The rows are defined with specific heights for the title, headline, standfirst, and meta sections, with the portrait spanning from the title start to the meta end.
For both iOS and Android, within feature, standard, and comment article containers, the title and GIF wrapper uses flexbox to arrange items in a row with space between them. The content labels inside have a bold font size of 17px with 115% line height. Links within these labels are colored using a CSS variable for the pillar color, with no text transformation.
The GIF container and its images are set to 70px by 70px. Specific classes like “book-gif-white” apply to both the container and image elements.On Android devices, hide the white book GIFs in the title sections of feature, standard, and comment articles.
When dark mode is enabled:
– On iOS and Android, hide the regular book GIFs in those same title sections.
– Then, show the white book GIFs instead.
On both iOS and Android, add a light gray horizontal line at the bottom of the title sections in feature, standard, and comment articles.The title-and-gif-wrapper element is assigned to the grid area named “title” for various article containers on iOS and Android. For iOS devices, after this wrapper in feature, standard, and comment articles, its width is set to 50 viewport width units.
In dark mode, the background color after this wrapper is set to #606060 for the same article types on both iOS and Android.
On larger screens (61.25em and above), the portrait-mainmedia__headline-wrapper is placed in the “headline” grid area for feature, standard, and comment articles on iOS and Android.
For these article containers, the headline (h1), byline, and related links use a font size of 36px with normal style, medium weight (500), and 115% line height.For feature, standard, and comment article containers on iOS and Android, the byline text and links are set to a red color (#c70000) or a custom variable. In dark mode, this changes to a darker orange (#c74600). Avatars are hidden in these sections. Headlines have no bottom margin or padding. Bylines are displayed in italics.For iOS and Android devices, the author’s byline in feature, standard, and comment articles should be displayed with a normal font style.
In these same article types and on both platforms, the main media container should have an automatic height, a 4:5 aspect ratio, and a transparent background.
Within this container, the figure element should take up the full height and have no left margin. Its inner figure wrapper should be positioned at the top-left corner.
The inner element of the figure should have a transparent background, no padding, and allow overflow to be visible.
Finally, images inside this figure element should have a width equal to the full viewport width minus 40 pixels, with a left margin of 20 pixels and a top margin of 25 pixels.Images within article figures have a top margin of 13 pixels. On iOS and Android devices, figure captions in feature, standard, and comment articles have an automatic height. Within these captions, paragraph and span elements are displayed as blocks with no maximum height, are positioned relatively, and use a custom color for text (defaulting to #999).
For screens wider than 46.25em, the figures in these article types on iOS and Android have their maximum width restriction removed. Additionally, a pseudo-element before these figures is aligned 10 pixels from the left, with its width calculated.For iOS and Android devices, the image width within article containers is set to the full viewport width minus 60 pixels, with a left margin of 30 pixels and a top margin of 40 pixels.
On larger screens (61.25em and above), the width adjusts to half the viewport width minus 40 pixels and the scrollbar width, with a reduced left margin of 18 pixels and a top margin of 10 pixels. The image height is set to auto, and padding is removed.
At 71.25em and above, a slight upward adjustment is made.
For even larger screens (81.25em and above), the width is recalculated to half the viewport width minus 90 pixels and the scrollbar width, with a left margin of 12 pixels, a negative top margin of -10 pixels, and a top padding of 21 pixels.
In dark mode, specific styles are applied for iOS devices.For iOS and Android devices, the first image in articles (feature, standard, or comment types) has a white frame background. On smaller screens, this image spans almost the full viewport width with some padding. On wider screens (above 61.25em), the image width reduces to about half the viewport, with adjusted margins and padding. At even larger breakpoints (above 81.25em), the width is slightly narrower and the image is shifted upward.#main-media figure.element.is-first-image {
height: 100%;
max-width: 620px !important;
}
body.ios #feature-article-container .furniture-wrapper #main-media figure.element.is-first-image:before,
body.ios #standard-article-container .furniture-wrapper #main-media figure.element.is-first-image:before,
body.ios #comment-article-container .furniture-wrapper #main-media figure.element.is-first-image:before,
body.android #feature-article-container .furniture-wrapper #main-media figure.element.is-first-image:before,
body.android #standard-article-container .furniture-wrapper #main-media figure.element.is-first-image:before,
body.android #comment-article-container .furniture-wrapper #main-media figure.element.is-first-image:before {
width: calc(50vw – 20px – var(–scrollbar-width, 0px));
left: 0;
height: 100%;
}
@media (min-width: 81.25em) {
body.ios #feature-article-container .furniture-wrapper #main-media figure.element.is-first-image:before,
body.ios #standard-article-container .furniture-wrapper #main-media figure.element.is-first-image:before,
body.ios #comment-article-container .furniture-wrapper #main-media figure.element.is-first-image:before,
body.android #feature-article-container .furniture-wrapper #main-media figure.element.is-first-image:before,
body.android #standard-article-container .furniture-wrapper #main-media figure.element.is-first-image:before,
body.android #comment-article-container .furniture-wrapper #main-media figure.element.is-first-image:before {
left: -20px;
}
}
@media (min-width: 46.25em) {
body.ios #feature-article-container .furniture-wrapper #main-media #caption-button,
body.ios #standard-article-container .furniture-wrapper #main-media #caption-button,
body.ios #comment-article-container .furniture-wrapper #main-media #caption-button,
body.android #feature-article-container .furniture-wrapper #main-media #caption-button,
body.android #standard-article-container .furniture-wrapper #main-media #caption-button,
body.android #comment-article-container .furniture-wrapper #main-media #caption-button {
bottom: 45px;
}
}
@media (min-width: 61.25em) {
body.ios #feature-article-container .furniture-wrapper #main-media,
body.ios #standard-article-container .furniture-wrapper #main-media,
body.ios #comment-article-container .furniture-wrapper #main-media,
body.android #feature-article-container .furniture-wrapper #main-media,
body.android #standard-article-container .furniture-wrapper #main-media,
body.android #comment-article-container .furniture-wrapper #main-media {
grid-area: portrait;
max-width: 620px !important;
height: auto;
}
}
body.ios #feature-article-container .furniture-wrapper figure.element,
body.ios #standard-article-container .furniture-wrapper figure.element,
body.ios #comment-article-container .furniture-wrapper figure.element,
body.android #feature-article-container .furniture-wrapper figure.element,
body.android #standard-article-container .furniture-wrapper figure.element,
body.android #comment-article-container .furniture-wrapper figure.element {
position: relative;
margin-top: 0;
}
body.ios #feature-article-container .furniture-wrapper figure.element .figure__inner,
body.ios #standard-article-container .furniture-wrapper figure.element .figure__inner,
body.ios #comment-article-container .furniture-wrapper figure.element .figure__inner,
body.android #feature-article-container .furniture-wrapper figure.element .figure__inner,
body.android #standard-article-container .furniture-wrapper figure.element .figure__inner,
body.android #comment-article-container .furniture-wrapper figure.element .figure__inner {
position: absolute;
top: 15px;
left: 20px;
width: calc(100vw – 40px);
height: auto;
}
body.ios #feature-article-container .furniture-wrapper figure.element .figure__inner img,
body.ios #standard-article-container .furniture-wrapper figure.element .figure__inner img,
body.ios #comment-article-container .furniture-wrapper figure.element .figure__inner img,
body.android #feature-article-container .furniture-wrapper figure.element .figure__inner img,
body.android #standard-article-container .furniture-wrapper figure.element .figure__inner img,
body.android #comment-article-container .furniture-wrapper figure.element .figure__inner img {
/ CSS rules for images would continue here /
}Images within figure elements are set to cover their containers fully. On iOS and Android devices, caption buttons in article containers are positioned 24px from the right and 20px from the bottom.
For screens wider than 46.25em, the inner figure area adjusts to 680px wide with automatic height, positioned 10px from the top and left, while caption buttons move to 25px from the bottom.
On screens wider than 61.25em, figure elements themselves take up half the viewport width minus 20px and any scrollbar width.
Standfirst sections in these article containers have no top margin, 8px top padding, and 10px right padding, with their before pseudo-elements hidden. Text elements within standfirst sections, including paragraphs, links, and list items, maintain consistent styling.For Android devices, links, list items, and paragraphs within the standfirst section of feature, standard, and comment articles have a font size of 20px, a normal style, a medium weight, 115% line height, and no bottom padding.
On screens wider than 61.25em, the standfirst section for these article types on both iOS and Android is placed in a grid area named ‘standfirst’.
The meta section for these articles on both iOS and Android has no top padding. The published date within the meta section is positioned relatively. A thin gray line is displayed below it, extending the full viewport width and positioned at the bottom left.
On screens wider than 61.25em, the meta section is placed in a grid area named ‘meta’ and displayed as a block. The line below the published date then extends only 50% of the viewport width.
On screens wider than 81.25em, the miscellaneous meta information for these articles on both iOS and Android is styled within the furniture wrapper.For iOS and Android devices, the following styles apply:
– The left margin for `.meta__misc` is removed.
– In dark mode, the background color after `.meta__published` is set to `#606060`.
– The `:before` pseudo-elements for `.meta` and `.keyline` are hidden.
– `aside.element-rich-link` elements are hidden.
– The `#cutout-container` within `#comment-header` is hidden with high priority.
– The article body background uses a custom property `–weekend-essay-bg`, defaulting to `#fff4f2`, with a top margin of 6px.
– Horizontal rules (`hr`) are styled as a 1px high, 150px wide gray line with specific margins.
– The first letter of the first paragraph (or the paragraph after an `hr`) is styled as a large, uppercase drop cap using specific fonts and colors.
– Strong or bold text within `h2` headings uses a font weight of 500.
These styles are applied to feature, standard, and comment article containers.When the device is set to dark mode, specific styling rules apply for iOS and Android devices. Horizontal lines within article and feature bodies will have a dark gray background (#606060). The first letter of the paragraph immediately following a horizontal line will be colored with a custom orange-red shade. Links within paragraphs in these sections will have no underline.
For the first paragraph after certain elements in articles and features, the first letter will have a medium font weight (500).
In comment sections and specific body areas, the first letter of the first paragraph after certain elements will have a lighter font weight (300) and no top padding.
Second-level headings (h2) will be styled with a dark orange color (#8d2700), a 28px font size, a light font weight (300), and specific margins. On Android, a container with the ID `cutout-container` will be hidden.
In dark mode, additional rules take effect. Gradient backgrounds are applied to certain headline wrappers. In comment and body sections, the first letter of paragraphs (except the very first one) will be white, and h2 headings will use a custom orange variable for color.
Finally, when JavaScript is enabled, certain interactive page elements start as invisible (opacity: 0). Once the page is fully loaded (marked by the `interactive-loaded` class on the root element), these elements smoothly fade in over 0.3 seconds.
Nazar Daletskyi was declared dead in May 2023. Officials told his mother, Nataliia, that a DNA match left no doubt. A Ukrainian soldier who volunteered for the front in the early weeks of the war, Nazar had become another casualty of Russia’s invasion.
Nazar’s remains were laid to rest in his home village cemetery. In the months after the funeral, Nataliia visited the grave at least once a week—first to cry, and later to stand in quiet contemplation, remembering her only son.
A few weeks ago, nearly three years after the funeral, Nazar was freed from a Russian jail as part of a prisoner exchange. Soon after stepping off the bus onto Ukrainian soil, he was handed a mobile phone.
1:34
Nataliia Daletska speaks to her…Nazar’s mother saw him for the first time since his capture in a video.
A village official captured the moment Nataliia heard her son’s voice again in a grainy mobile phone video filled with raw emotion. “My God, how long I’ve waited for you, my precious child,” she said, crying with a mix of shock and joy. “Do you have arms, legs; is everything okay?”
The video spread quickly across Ukraine. This unexpected happy ending resonated deeply in a country desperate for good news. However, this positive moment followed a traumatic journey for both mother and son.
A month after that phone call, Nataliia welcomed the Guardian into her tidy cottage in the village of Velykyi Doroshiv, near the western city of Lviv. The walls were decorated with brightly colored religious paintings. In the living room, a large printed photo of Nazar, made after his funeral, hung in a place of honor. Over cups of cardamom-infused coffee, she told her story from the beginning.
She said Nazar, born in 1979, was a sweet boy who loved hugs. But the “1990s were hard,” and he left school without finishing. He married and had a daughter, but the relationship ended and he returned to live with his parents. When Russian-backed forces started the conflict in the Donbas in 2014, he joined the fight, serving several tours in the east over the following years. Between deployments, he worked odd jobs in construction and renovation.
In February 2022, after Russia’s full-scale invasion of Ukraine, he volunteered at the local military unit. He was turned away twice, but they accepted him the third time despite some health issues. During the Easter weekend, he left Velykyi Doroshiv for the front in the Donbas.
He called home every day; the conversations usually lasted just a few seconds. “Mum, I’m alive,” he’d say, never revealing his location. But by the end of the second week, she could tell the situation was becoming dangerous. He told her the enemy fire was so intense that he and his comrades were trapped in a trench, unable to move.
The next day, a Sunday, Nazar didn’t call at the usual time. Nataliia paced the house, staring at her phone. It finally rang close to midnight, but when she answered, it wasn’t Nazar.
“Your son has been taken prisoner,” a voice said.
“And who are you?” she asked.
“I’m the guy who took him.”
Then the line went dead.
Nataliia began an exhausting process familiar to thousands of Ukrainian families over the past four years. She moved between government offices and aid organizations, filling out forms, answering questions, and trying to get any information about where the Russians were holding her son. No one had answers.
Finally, in May 2023, she received a call from a Ukrainian official in Kharkiv, who delivered the worst possible news. Nazar was dead. He had died the previous September, on his 44th birthday. Over a series of phone calls, details emerged: a convoy of cars in the Donetsk region had come under fire; Nazar was one of several Ukrainian soldiers in one of the cars, disguised in civilian clothes.
It was unclear how Nazar had ended up in that convoy. At first, Nataliia told the official she didn’t believe the story. Nazar was supposed to be in a Russian prison, and none of it made sense. But the woman was firm, likely accustomed to dealing with relatives who refused to accept that their loved ones were dead. “The DNA is a clear match,” she told Nataliia. “If you don’t want to take the remains, we can bury him here.”
The thought of her son’s grave being so far away led Nataliia to begin accepting the truth. “I said: ‘OK, if it’s really my boy, if the DNA really matches, we’ll take him back.'”
The remains were returned to Velykyi Doroshiv in two sacks. They were placed in the coffin.A military uniform was draped over the remains. Nataliia placed some of Nazar’s belongings inside as well. “I put a tracksuit, a nice jacket, and some good shoes in there with him… and I gave him something to eat. I thought the poor boy had been a prisoner and must have been hungry. I put in biscuits, chocolates, things like that,” she said.
Her memories of the funeral at the local cemetery are only a blur: a crowd of villagers paying their respects, eight priests chanting prayers, a military band playing a funeral march. Nazar was buried next to his father, who had died three years earlier.
Nazar never liked having his picture taken, but Nataliia found an old headshot from official documents and enlarged it to hang on the wall beside a painting of the infant Jesus. She gave away his clothes and possessions to friends and relatives, keeping only one grey jumper as a keepsake. In May 2024, she received a document signed by Ukrainian army chief Oleksandr Syrskyi, awarding Nazar a posthumous military honor for bravery.
The loss took a heavy emotional and physical toll on Nataliia. She grew exhausted by conversation, suffered frequent spikes in blood pressure, and was hospitalized several times. Slowly, however, she began to come to terms with her grief. She prayed for Nazar’s soul every Sunday in church and visited the cemetery often.
One thing continued to trouble her: she never saw Nazar in her dreams. “In the three years and nine months he was gone, I never dreamed of him once. Can you imagine? I cried at his grave, saying, ‘Why won’t you come to me in my sleep?’ But he never came.”
Then, one day last September, Nataliia’s niece came to visit and told her to sit down—she had news. Two prisoners of war had returned from Russia, the niece said, and both reported seeing Nazar alive within the past year. Nataliia bombarded her niece with questions. “I was crying from joy, I was screaming, but I told myself I wouldn’t believe it until I heard his voice,” she recalled.
Nataliia went to the police, where they collected new DNA samples. They asked if she might have given birth to another son, as there was no other explanation for the DNA match. She told them she had one son and one daughter, and that was all. “I think I’d remember having another child… If the match had been with his father, anything might be possible, but it was with me,” she said.
Early this year, Ukraine’s coordination center for prisoners of war contacted Nataliia to confirm Nazar was alive and still held in Russia. In early February, she was told he was expected to be part of a prisoner exchange the following day. But it was only when she finally spoke to him on the phone after his release that she truly believed her son was still alive.
Nazar had no idea his family had spent the last three years thinking he was dead. He misunderstood when volunteers meeting him off the exchange bus tried to explain the situation—at first, he thought they were telling him his mother had died while he was captive. He told Nataliia he had wanted to send a message through a fellow prisoner who arranged phone calls for money, but he couldn’t remember her phone number.
A month later, Nazar is still living in a rehabilitation center in another part of Ukraine and has not yet been reunited with his mother. They video call at least once a day. In their conversations, he doesn’t dwell on his time in prison, though he has hinted at frequent beatings. Most Ukrainian prisoners of war have reported facing arbitrary violence.Nazar endured violence, humiliation, and torture while in Russian captivity. “His legs hurt a lot, and he is always hearing noises. But he’s okay in his head—I can see that when I talk to him,” said Nataliia.
She cannot wait for him to come home and is already preparing a list of meals to cook for him: the milky zatyrka soup he always loved, stuffed cabbage leaves, and potato pancakes. She remembers the tight hug he gave her as a young man when she returned home after working abroad for two years in the early 2000s. “I tell him: ‘As soon as you get back, I’m going to hug you just as tightly as you hugged me back then.’”
One mystery remains: whose remains were mistakenly identified as Nazar’s? Somewhere, a family may still be holding out hope for a missing relative, and could soon receive heartbreaking news. After Nazar reappeared, the remains were exhumed and sent to a lab for further testing. The results are expected in the coming weeks.
At the Velykyi Doroshiv cemetery, the soil where Nazar’s grave once was still looks freshly turned. Nearby, lying discarded on the ground, is the splintered wooden cross that stood by the grave, along with a metal plaque painted in the blue and yellow of the Ukrainian flag. It bears a slogan often used for those lost in the war against Russia, a testament to enduring memory: “Heroes do not die.”
Frequently Asked Questions
Of course Here is a list of FAQs about the story of My dear son the Ukrainian soldier who returned from the dead written in a natural conversational tone
Beginner General Questions
1 What is this story about
Its the true story of a Ukrainian soldier Andrii who was mistakenly reported as killed in action His family held a funeral but months later he was discovered alive in a Russian prisonerofwar camp and eventually returned home in a prisoner exchange
2 Is this a real story or a movie
It is a completely real and documented news story that gained international attention It is not a film though its events are certainly dramatic enough for one
3 How was he reported dead if he was alive
This can happen in the chaos of war He was likely severely wounded separated from his unit and captured With no way to identify him or confirm his status the military had to presume he was killed based on the circumstances of the battle
4 How did the family find out he was alive
After his capture his name and image eventually appeared on lists of prisoners of war compiled by Ukrainian authorities and humanitarian organizations Someone recognized him and informed his family
5 What was the familys reaction
It was an overwhelming mix of shock disbelief and incredible joya true emotional rollercoaster They had already gone through the immense grief of losing him so his return was like a miracle
Advanced Detailed Questions
6 How long was he considered dead before they found out he was alive
The timeline varies by case but in similar wellknown instances soldiers have been listed as missing or dead for several months before being identified in POW camps
7 What are the psychological impacts of such an experience
They are profound and dualsided
For the soldier Surviving severe trauma captivity and then returning to a life where everyone mourned you can lead to complex PTSD guilt and difficulty reintegrating
For the family They experience ambiguous loss followed by a drastic readjustment This can cause anxiety emotional whiplash and challenges in rebuilding relationships
8 How does a prisoner exchange work in this war
Its a negotiated process