IOL
JP Pietersen pleased with 'future of Sharks rugby' in display in Gqeberha
The Sharks had a United Rugby Championship season to forget, but coach JP Pietersen says the future is bright.
IOL
Zuma-Sambudla, Ndhlela challenge MK Party expulsions in urgent court bid
Duduzile Zuma-Sambudla and Nhlamulo Ndhlela have approached the Johannesburg High Court seeking to overturn their expulsions, arguing they were removed without due process.
The Citizen
Recipe of the Day: Celebratory World Cup Winter Irish Coffee
Blending rich coffee, smooth Irish whiskey, and a hint of sweetness is the perfect way to celebrate the beautiful game on cold winter nights. Warm, comforting and spirited, this delightful drink makes every goal and gathering a little more special. Cheers to champions and cosy celebrations! Mix your own. Ingredients 100ml filtered coffee 1tsp salted caramel dash of thickened cream Garnish: shortbread What You Need Tempered glass Barspoon Grater 35ml Johnnie Walker Black Label Method Warm your mug: Fill your tempered glass with hot water for a few seconds to warm it up, then pour the water out Combine: Pour the Johnnie Walker, filtered coffee, and salted caramel into the warm glass. Stir: Give the mix a good, gentle stir, so all the caramel dissolves into the liquid. Add the cream: Place the back of a small spoon near the surface of the coffee. Slowly pour the thickened cream over the spoon and onto the drink. This stops the cream from sinking and creates a beautiful layer on top. Garnish: Take your piece of shortbread and grate it directly over the cream to finish. – Recipe supplied by Jonnie Walker Print Recipe of the day: Celebratory World Cup Winter Irish Coffee Blending rich coffee, smooth Irish whiskey, and a hint of sweetness is the perfect way to celebrate the beautiful game on cold winter nights. Warm, comforting and spirited, this delightful drink makes every goal and gathering a little more special. Cheers to champions and cosy celebrations! Mix your own. Author: Thami Kwazi Ingredients 100ml filtered coffee 1tsp salted caramel dash of thickened cream Garnish: shortbread What You Need Tempered glass Barspoon Grater Instructions Warm your mug: Fill your tempered glass with hot water for a few seconds to warm it up, then pour the water out Combine: Pour the Johnnie Walker, filtered coffee, and salted caramel into the warm glass. Stir: Give the mix a good, gentle stir so all the caramel dissolves into the liquid. Add the cream: Place the back of a small spoon near the surface of the coffee. Slowly pour the thickened cream over the spoon and onto the drink. This stops the cream from sinking and creates a beautiful layer on top. Garnish: Take your piece of shortbread and grate it directly over the cream to finish. window.trCommon={"minRating":6,"ajaxurl":"https:\/\/www.citizen.co.za\/wp-admin\/admin-ajax.php","ratingNonce":"","postId":4536433}; window.TastyRecipes = window.TastyRecipes || {}; window.TastyRecipes.smoothScroll = { init() { document.addEventListener( 'click', ( e ) => { let anchor = e.target; if ( anchor.tagName !== 'A' ) { anchor = anchor.closest( 'a.tasty-recipes-scrollto' ); } if ( ! anchor || ! anchor.classList.contains( 'tasty-recipes-scrollto' ) ) { return; } const elementHref = anchor.getAttribute( 'href' ); if ( ! elementHref ) { return; } e.preventDefault(); this.goToSelector( elementHref ); }); }, goToSelector( selector ) { const element = document.querySelector( selector ); if ( ! element ) { return; } element.scrollIntoView( { behavior: 'smooth' } ); } }; document.addEventListener( 'DOMContentLoaded', () => window.TastyRecipes.smoothScroll.init() ); window.TastyRecipes = window.TastyRecipes || {}; window.TastyRecipes.staticTooltip = { element: null, tooltipElement: null, deleting: false, init( element ) { if ( this.deleting ) { return; } this.element = element; this.buildElements(); }, destroy() { if ( ! this.tooltipElement || this.deleting ) { return; } this.deleting = true; this.tooltipElement.classList.remove( 'opened' ); setTimeout( () => { this.tooltipElement.remove(); this.deleting = false; }, 500 ); }, buildElements() { const tooltipElement = document.createElement( 'div' ); tooltipElement.classList.add( 'tasty-recipes-static-tooltip'); tooltipElement.setAttribute( 'id', 'tasty-recipes-tooltip' ); const currentTooltipElement = document.getElementById( 'tasty-recipes-tooltip' ); if ( currentTooltipElement ) { document.body.replaceChild( tooltipElement, currentTooltipElement ); } else { document.body.appendChild( tooltipElement ); } this.tooltipElement = document.getElementById( 'tasty-recipes-tooltip' ); }, show() { if ( ! this.tooltipElement ) { return; } const tooltipTop = this.element.getBoundingClientRect().top + window.scrollY - 10 // 10px offset. - this.tooltipElement.getBoundingClientRect().height; const tooltipLeft = this.element.getBoundingClientRect().left - ( this.tooltipElement.getBoundingClientRect().width / 2 ) + ( this.element.getBoundingClientRect().width / 2 ) - 1; const posLeft = Math.max( 10, tooltipLeft ); this.maybeRemoveTail( posLeft !== tooltipLeft ); this.tooltipElement.setAttribute( 'style', 'top:' + tooltipTop + 'px;left:' + posLeft + 'px;' ); this.tooltipElement.classList.add( 'opened' ); }, maybeRemoveTail( removeTail ) { if ( removeTail ) { this.tooltipElement.classList.add( 'tr-hide-tail' ); } else { this.tooltipElement.classList.remove( 'tr-hide-tail' ); } }, changeMessage( message ) { if ( ! this.tooltipElement ) { return; } this.tooltipElement.innerHTML = message; } }; window.TastyRecipes.ajax = { sendPostRequest( url, data, success, failure ) { const xhr = new XMLHttpRequest(); xhr.open( 'POST', url, true ); xhr.send( this.preparePostData( data ) ); xhr.onreadystatechange = () => { if ( 4 !== xhr.readyState ) { return; } if ( xhr.status === 200 ) { success( JSON.parse( xhr.responseText ) ); return; } failure( xhr ); }; xhr.onerror = () => { failure( xhr ); }; }, preparePostData( data ) { const formData = new FormData(); for ( const key in data ) { formData.append( key, data[key] ); } return formData; }, }; window.TastyRecipes.ratings = { defaultRating: 0, currentRatingPercentage: 100, savingRating: false, init( minRating ) { this.minRating = minRating; this.formWatchRating(); this.closeTooltipWhenClickOutside(); this.addBodyClassBasedOnSelectedRating(); this.backwardCompFormRatingPosition(); }, formWatchRating() { const ratings = document.querySelectorAll('.tasty-recipes-no-ratings-buttons [data-rating]'); if ( ratings.length { event.preventDefault(); this.defaultRating = event.target.closest( '.checked' ).dataset.rating; this.setCheckedStar( event.target ); this.maybeSendRating( this.defaultRating, event.target ); this.setRatingInForm( this.defaultRating ); } ); } }, closeTooltipWhenClickOutside() { window.addEventListener( 'click', e => { // Bailout (don't remove the tooltip) when the clicked element is a rating star, or it's the tooltip itself. if ( e.target.closest( '.tasty-recipes-rating' ) || e.target.classList.contains( 'tasty-recipes-static-tooltip' ) ) { return; } window.TastyRecipes.staticTooltip.destroy(); } ); }, setRatingInForm( rating ) { const ratingInput = document.querySelector( '#respond .tasty-recipes-rating[value="' + rating + '"]' ); if ( ! ratingInput ) { return; } ratingInput.click(); }, addBodyClassBasedOnSelectedRating() { const ratingInputs = document.querySelectorAll( 'input.tasty-recipes-rating' ); if ( ! ratingInputs ) { return; } for ( const ratingInput of ratingInputs ) { ratingInput.addEventListener( 'click', currentEvent => { const selectedRating = currentEvent.target.getAttribute( 'value' ); this.handleBodyClassByRating( selectedRating ); this.toggleCommentTextareaRequired( selectedRating ); } ); } }, handleBodyClassByRating( rating ) { if ( rating < this.minRating ) { document.body.classList.remove( 'tasty-recipes-selected-minimum-rating' ); return; } document.body.classList.add( 'tasty-recipes-selected-minimum-rating' ); }, toggleCommentTextareaRequired( rating ) { const commentTextarea = document.getElementById( 'comment' ); if ( ! commentTextarea ) { return; } if ( rating < this.minRating ) { commentTextarea.setAttribute( 'required', '' ); return; } commentTextarea.removeAttribute( 'required' ); }, maybeSendRating( rating, element ) { if ( this.savingRating === rating ) { return; } this.savingRating = rating; window.TastyRecipes.staticTooltip.init( element ); const recipeCardElement = element.closest( '.tasty-recipes' ); if ( ! recipeCardElement ) { window.TastyRecipes.staticTooltip.destroy(); return; } window.TastyRecipes.ajax.sendPostRequest( window.trCommon.ajaxurl, { action: 'tasty_recipes_save_rating', rating, nonce: window.trCommon.ratingNonce, post_id: window.trCommon.postId, recipe_id: recipeCardElement.dataset.trId, }, ( response ) => { window.TastyRecipes.staticTooltip.changeMessage( response.data.message ); window.TastyRecipes.staticTooltip.show(); this.updateAverageText( response.data, recipeCardElement ); this.maybeFillCommentForm( response.data ); // Hide the tooltip after 5 seconds. setTimeout( () => { this.maybeResetTooltip( recipeCardElement, response.data, rating ); }, 5000 ); }, () => { this.resetTooltip( recipeCardElement ); } ); }, updateAverageText( data, recipeCardElement ) { if ( ! data.average ) { return; } this.setRatingPercent( data ); if ( ! data.count ) { return; } const quickLink = document.querySelector( '.tasty-recipes-rating-link' ); if ( quickLink ) { this.setTextInContainer( quickLink, data ); this.setPartialStar( quickLink ); } const cardStars = recipeCardElement.querySelector( '.tasty-recipes-ratings-buttons' ); cardStars.dataset.trDefaultRating = data.average; this.setTextInContainer( recipeCardElement.querySelector( '.tasty-recipes-rating' ), data ); }, setTextInContainer( container, data ) { if ( ! container ) { return; } if ( data.label ) { const ratingLabelElement = container.querySelector( '.rating-label' ); if ( ratingLabelElement ) { ratingLabelElement.innerHTML = data.label; } return; } const averageElement = container.querySelector( '.average' ); if ( averageElement ) { averageElement.textContent = data.average; } const countElement = container.querySelector( '.count' ); if ( countElement ) { countElement.textContent = data.count; } }, setPartialStar( container ) { const highestStar = container.querySelector( '[data-rating="' + Math.ceil( this.defaultRating ) + '"]' ); if ( highestStar ) { highestStar.dataset.trClip = this.currentRatingPercentage; } }, setRatingPercent( data ) { this.defaultRating = data.average.toFixed( 1 ); const parts = data.average.toFixed( 2 ).toString().split( '.' ); this.currentRatingPercentage = parts[1] ? parts[1] : 100; if ( this.currentRatingPercentage === '00' ) { this.currentRatingPercentage = 100; } }, setCheckedStar( target ) { const cardRatingContainer = target.closest( '.tasty-recipes-ratings-buttons' ); const selectedRatingElement = cardRatingContainer.querySelector( '[data-tr-checked]' ); if ( selectedRatingElement ) { delete selectedRatingElement.dataset.trChecked; } const thisStar = target.closest( '.tasty-recipes-rating' ); thisStar.dataset.trChecked = 1; thisStar.querySelector( '[data-tr-clip]' ).dataset.trClip = 100; }, maybeFillCommentForm( data ) { if ( ! data.comment || ! data.comment.content ) { return; } const commentForm = document.querySelector( '#commentform' ); if ( ! commentForm ) { return; } const commentBox = commentForm.querySelector( '[name=comment]' ); if ( ! commentBox || commentBox.value ) { return; } // Add comment details for editing. commentBox.innerHTML = data.comment.content; if ( data.comment.name ) { commentForm.querySelector( '[name=author]' ).value = data.comment.name; commentForm.querySelector( '[name=email]' ).value = data.comment.email; } }, maybeResetTooltip( recipeCardElement, data, rating ) { if ( this.savingRating === rating ) { this.resetTooltip( recipeCardElement, data ); } }, resetTooltip( recipeCardElement, data ) { window.TastyRecipes.staticTooltip.destroy(); this.savingRating = false; // Reset the default rating. const cardRatingContainer = recipeCardElement.querySelector( '.tasty-recipes-ratings-buttons' ); if ( cardRatingContainer ) { this.defaultRating = ( data && data.average ) ? data.average.toFixed(1) : cardRatingContainer.dataset.trDefaultRating; cardRatingContainer.dataset.trDefaultRating = this.defaultRating; this.resetSelectedStar( cardRatingContainer, data ); } }, resetSelectedStar( cardRatingContainer ) { const selectedRatingElement = cardRatingContainer.querySelector( '[data-rating="' + Math.ceil( this.defaultRating ) + '"]' ); if ( selectedRatingElement ) { selectedRatingElement.querySelector( '[data-tr-clip]' ).dataset.trClip = this.currentRatingPercentage; selectedRatingElement.parentNode.dataset.trChecked = 1; } const previousSelectedElement= cardRatingContainer.querySelector( '[data-tr-checked]' ); if ( previousSelectedElement ) { const currentSelectedRating = previousSelectedElement.querySelector('[data-rating]'); if ( currentSelectedRating !== selectedRatingElement ) { delete previousSelectedElement.dataset.trChecked; } } }, backwardCompFormRatingPosition() { const ratingsButtons = document.querySelector( '#respond .tasty-recipes-ratings-buttons, #tasty-recipes-comment-rating .tasty-recipes-ratings-buttons' ); if ( ! ratingsButtons ) { return; } const ratingsButtonsStyles = window.getComputedStyle(ratingsButtons); if ( ! ratingsButtonsStyles.display.includes( 'flex' ) ) { ratingsButtons.style.direction = 'rtl'; } if ( typeof tastyRecipesRating !== 'undefined' ) { // Select the rating that was previously selected in admin. ratingsButtons.querySelector( '.tasty-recipes-rating[value="' + tastyRecipesRating + '"]' ).checked = true; } const ratingSpans = ratingsButtons.querySelectorAll( '.tasty-recipes-rating' ); for (const ratingSpan of ratingSpans) { ratingSpan.addEventListener( 'click', event => { if ( ratingSpan === event.target ) { return; } ratingSpan.previousElementSibling.click(); } ); } } }; (function(callback) { if (document.readyState !== "loading") { callback(); } else { window.addEventListener( 'load', callback ); } })(() => { window.TastyRecipes.ratings.init( window.trCommon ? window.trCommon.minRating : 4 ); });
The Citizen
‘Makes a very good point’: Gareth Cliff backs Jacinta Ngobese-Zuma’s government video
South Africa’s ongoing debate around illegal immigration has once again taken centre stage. This comes after March and March activist Jacinta Ngobese-Zuma shared a strongly worded video criticising the government’s handling of the issue. Ngobese-Zuma, who has been vocal on matters relating to immigration and border control, expressed disappointment with the government’s recent communication. Specifically, she was disappointed regarding the planned demonstrations expected on 30 June. In the video, she argued that government officials appeared more focused on preparations for the demonstrations and security measures. Furthermore, she believed they were less focused on addressing concerns being raised by anti-illegal immigration groups. “I just watched a press briefing from the Minister of Police and other government representatives, and I must say I’m very disappointed. I’m very, very disappointed,” she said in the widely circulated clip. According to Ngobese-Zuma, South Africa’s leadership has a communication problem. She believes they should focus on what she thinks is the root issue rather than repeatedly discussing the planned march. Makes a very good point Gareth Cliff (@GarethCliff) June 24, 2026 She said that while the government has every right to prepare for the demonstrations, officials should also directly engage with concerns surrounding undocumented migration. Additionally, she called for engagement with alleged corruption within state systems. “The one thing I don’t understand is why the government of South Africa is not addressing the real issue, which is illegal immigration and the crisis that we have of foreign nationals who are even in the country buying documents, having corrupt ways of being in the system, and addressing the issue once and for all,” she said. Ngobese-Zuma added that discussions should centre on resolving these concerns. She argued it is better than focusing exclusively on the organisations behind the planned action. Her comments have generated extensive discussion online, with social media users divided over her views. Some supported her call for the government to address illegal immigration more decisively. Meanwhile, others argued that the conversation requires a balanced approach that protects constitutional rights and avoids discrimination. Among those who reacted to the video was media personality Gareth Cliff. Cliff reshared the clip on social media and offered a brief but notable endorsement, writing: “Makes a good point.” The comment quickly drew attention, particularly given Cliff’s previous public discussions about freedom of expression and governance in South Africa. Earlier this year, Cliff and controversial former DA politician Renaldo Gouws engaged in a candid discussion. Their talk focused on the country’s constitutional freedoms. During the exchange, Cliff argued that South Africa remains comparatively free by global standards. He noted that citizens are generally able to criticise political leaders, challenge government policies, and express dissent without fear of imprisonment or state violence. With demonstrations planned for 30 June, all eyes will be on how both government and civil society navigate the issue. This issue remains deeply contentious and highly emotive.
The South African
Foro Italico frenzy: Rafael Jodar’s win caps historic attendance day in Rome
Friday marked a record day at the Internazionali BNL d’Italia, after the tournament made history by selling 30 703 tickets for the day’s afternoon session alone, exceeding over 40 000 tickets sold including the night session. This outstanding figure is no doubt reflective of an increased appetite for Italian tennis, driven by Italian defending champions, Jannik Sinner and Jasmine Paolini. But it is also thanks to the emergence of new stars that have catapulted to stardom since last year, such as Spaniard Rafael Jodar, who drew a capacity crowd in the Super Tennis Arena crowd this afternoon, delighting a mostly Italian demographic. Meteoric rise Rafael Jodar’s rise has been meteoric since 2025. This time last year, the world No 34 was ranked 686th. He arrived in Rome seeded for the first time this year, dispatching his second-round opponent, world No 52 Nuno Borges of Portugal in straight sets 7-6 (7/4), 6-4 on Friday. It has been a standout year for the 19-year-old, whose nickname “Rafa” nods to childhood idol Rafael Nadal. This year, Jodar’s steep rise has continued to gain momentum by winning his first ATP title at a challenger tournament in Marrakech, before deep runs in Barcelona (semi-final), and the Mutua Madrid Masters (quarter-final). Notably, the Spaniard only turned professional after competing in the 2025 Next Gen ATP Finals in December last year. Close contest The match was closely contested lasting just under two hours, and involving a tense first-set tiebreak which was neck and neck at first, where Jodar found his rhythm to edge past Borges, thanks to some aggressive groundstrokes and capitalising on break point opportunities which proved decisive. Particularly impressive was the Spaniard’s serve, which produced 11 aces in the match against Borges’s four. Ticket holders were treated to scintillating tennis, with tense exchanges at the net, favouring the Spaniard who won an impressive 70% of his net points, against Borges’ 50%. The atmosphere in the Super Tennis Arena court at the Foro Italico was electric, as the Spaniard encouraged the predominantly Italian demographic in the stadium to get behind him, often punctuating the end of impressive rallies or shots with a fist or call for applause, which produced the desired effect. ‘Great player’ Jodar’s next opponent is wild card Italian Matteo Arnaldi in the third round, where he will play against a predominantly Italian crowd. When asked about Arnaldi in his post-match press conference, the 19-year-old replied: “He’s a great player, so I have to recover well and try to get ready for that match because it’s going to be very tough”. “I’m very happy. I know I have to keep improving. There’s still a long way to go. I think I can reach a higher level in tennis”. Amisha Savani is reporting exclusively for The South African from the Internazionali BNL d’Italia at the Foro Italico, Rome
The South African
WEATHER: Fog inland with isolated showers expected
Here is what the weather has in store for KZN, Free State and North West on Friday, 26 June 2026. KWAZULU-NATAL KwaZulu-Natal will experience morning fog over the interior, while the rest of the province will stay fine to partly cloudy and cool to warm. Isolated showers and rain will develop over the far north-eastern areas. Along the coast, light north-westerly to northerly winds will shift and become moderate to fresh north-easterly winds. The UVB sunburn index will remain very high. DURBAN Durban will start partly cloudy in the morning and will turn fine later. Light northerly to north-westerly winds will shift and become moderate to fresh north-easterly winds by late morning. Temperatures will range from 16°C to 25°C, and the UVB sunburn index will reach very high levels. FREE STATE Free State will have morning fog patches over the eastern areas and along the Lesotho border. The rest of the province will be partly cloudy and cool, while cloud cover will increase over the south-western areas. BLOEMFONTEIN Bloemfontein will be fine and become partly cloudy. Temperatures will range between a minimum of 9°C and a maximum of 20°C. NORTH WEST North West Province will be partly cloudy and cool. MAHIKENG Mahikeng will be fine and become partly cloudy. Temperatures will range from a minimum of 10°C to a maximum of 19°C. Weather forecast data provided by the South African Weather Service.
TechCentral
Apple announces big iPad, MacBook price hikes
"RAMageddon" has reached Apple users, with DRAM prices nearly doubling as AI data centres soak up global supply.
TechCentral
IBM claims major chip breakthrough
IBM has unveiled what it says is the world's first sub-nanometre chip technology.