<?php
/** Publication layout and resilience. Presentation only: no content writes or per-view HTTP probes. */
if (!defined('ABSPATH')) { exit; }

function wtx143_color_fields() {
    $fields=array();
    foreach(array('heading','title','hover','excerpt','meta') as $role){
        $fields[]=$role.'_color';$fields[]='dark_'.$role.'_color';
    }
    return $fields;
}
function wtx143_palette($input=array(),$sparse=false) {
    $input=is_array($input)?$input:array();$out=array();
    foreach(wtx143_color_fields() as $key){
        if($sparse&&!array_key_exists($key,$input)){continue;}
        $value=$input[$key]??'';
        $out[$key]=is_string($value)&&preg_match('/^#[a-fA-F0-9]{6}$/D',$value)?$value:'';
    }
    return $out;
}
function wtx143_related_design($input=array()) {
    $v=is_array($input)?$input:array();
    $out=array('columns'=>4,'tablet_columns'=>2,'mobile_columns'=>1,'gap'=>20,'title_size'=>19,'title_lines'=>3,
        'image_ratio'=>'3:2','show_excerpt'=>false,'show_author'=>false,'card_style'=>'outlined');
    foreach(array('columns'=>array(1,4),'tablet_columns'=>array(1,3),'mobile_columns'=>array(1,2),'gap'=>array(8,40),'title_size'=>array(16,28),'title_lines'=>array(2,5)) as $key=>$range){
        $out[$key]=(int)wtxs_num($v[$key]??$out[$key],$out[$key],$range[0],$range[1]);
    }
    $out['image_ratio']=wtxs_enum($v['image_ratio']??null,array('16:9','3:2','4:3'),'3:2');
    $out['card_style']=wtxs_enum($v['card_style']??null,array('outlined','soft','bare'),'outlined');
    foreach(array('show_excerpt','show_author') as $key){$out[$key]=wtxs_bool($v[$key]??false);}
    return $out;
}
function wtx143_settings($out,$in) {
    $out['publishing']['card_palette']=wtx143_palette($in['publishing']['card_palette']??array());
    $out['publishing']['related_design']=wtx143_related_design($in['publishing']['related_design']??array());
    return $out;
}
/** Some legacy subtitle filters append tags, occasionally entity-encoded, to the title. */
function wtx143_plain_text($text) {
    if(!is_scalar($text)){return '';}
    $text=(string)$text;
    for($i=0;$i<2;$i++){$decoded=html_entity_decode($text,ENT_QUOTES|ENT_HTML5,'UTF-8');if($decoded===$text){break;}$text=$decoded;}
    $text=wp_strip_all_tags($text);
    return trim(preg_replace('/\s+/u',' ',$text)??'');
}
function wtx143_post_title($post) {
    $title=wtx143_plain_text(get_the_title($post));
    return $title!==''?$title:wtx_t('Untitled story','مقال دون عنوان');
}
/** Only this template's heading changes. Taxonomy labels, slugs, URLs and SEO titles are untouched. */
function wtx143_archive_title($before='<h1>',$after='</h1>') {
    if(function_exists('wtx150_title')&&($title=wtx150_title())!==null){echo $before.esc_html($title).$after;return;}
    $s=wtxs_data();$hide=!empty($s['publishing']['archive_design']['hide_prefix']);
    if($hide&&(is_category()||is_tag()||is_tax())){$title=esc_html(wtx143_plain_text(single_term_title('',false)));}
    elseif($hide&&is_post_type_archive()){$title=esc_html(wtx143_plain_text(post_type_archive_title('',false)));}
    else{$title=get_the_archive_title();}
    if($title!==''){echo $before.$title.$after;}
}
/** A custom article taxonomy is not a standard category; do not silently fall through to news cards. */
function wtx143_article_tax_archive($type) {
    if(!$type||$type==='post'||!is_tax()){return false;}
    $term=get_queried_object();
    return is_object($term)&&!empty($term->taxonomy)&&is_object_in_taxonomy($type,$term->taxonomy);
}
/** Failure fallback is inert local markup, never copied from an arbitrary URL. */
function wtx143_missing_media($attrs=array(),$article=false) {
    $fallback=wtx131_fallback_image($attrs,$article);
    return $fallback;
}
function wtx143_guard_media($html,$attrs=array(),$article=false) {
    if(!is_string($html)||$html===''){return wtx143_missing_media($attrs,$article);}
    $backup=wtx143_missing_media($attrs,$article);
    return '<span class="wtx-media-guard" data-wtx-media-guard data-wtx-media-context="'.($article?'article':'card').'">'
        .'<span class="wtx-media-primary">'.$html.'</span>'
        .'<span class="wtx-media-reserve" hidden aria-hidden="true">'.$backup.'</span></span>';
}
/** Reuse the caller's related query. Public/password guards are rechecked without changing the source query. */
function wtx143_related_section($posts,$title='') {
    $valid=array();foreach((array)$posts as $p){
        if(is_object($p)&&isset($p->ID)&&get_post_status($p->ID)==='publish'&&empty($p->post_password)&&!post_password_required($p->ID)){$valid[]=$p;}
    }
    if(!$valid){return '';}
    $s=wtxs_data();$d=wtx143_related_design($s['publishing']['related_design']??array());$n=count($valid);
    $vars='--wtx-related-columns:'.min($n,$d['columns']).';--wtx-related-tablet:'.min($n,$d['tablet_columns']).';--wtx-related-mobile:'.min($n,$d['mobile_columns']).';';
    $html='<section class="wtx-related wtx-related--'.esc_attr($d['card_style']).'" style="'.$vars.'" aria-label="'.esc_attr($title?:wtx_t('Related stories','أخبار ذات صلة')).'">'
        .'<div class="wtx-news-section-head"><h2>'.esc_html($title?:wtx_t('Related stories','أخبار ذات صلة')).'</h2></div><div class="wtx-related-items">';
    foreach($valid as $p){$html.=wtx7_card($p,'standard',3,array('show_category'=>true,'show_date'=>true,'show_author'=>$d['show_author'],'show_excerpt'=>$d['show_excerpt'],'excerpt_length'=>18));}
    return $html.'</div></section>';
}
/** Custom colors are scoped to an individual surface. Empty means inherit; dark is independent. */
function wtx143_palette_css($selector,$input) {
    $p=wtx143_palette($input,true);$css='';
    foreach(array('light','dark') as $mode){
        $vars='';foreach(array('heading','title','hover','excerpt','meta') as $role){
            $key=($mode==='dark'?'dark_':'').$role.'_color';
            // Reset the light override in dark mode. Do not leak navy text onto a dark surface.
            if(!empty($p[$key])){$vars.='--wtx-ink-'.$role.':'.$p[$key].';';}
        }
        if($vars){$css.=($mode==='dark'?'html[data-mode="dark"] ':'html:not([data-mode="dark"]) ').$selector.'{'.$vars.'}';}
    }
    return $css;
}
function wtx143_publication_css($s) {
    $p=$s['publishing']['card_palette']??array();$d=wtx143_related_design($s['publishing']['related_design']??array());
    $css=wtx143_palette_css('body',$p);
    $css.='.wtx-related{--wtx-related-gap:'.$d['gap'].'px;--wtx-related-title:'.$d['title_size'].'px;--wtx-related-lines:'.$d['title_lines'].';--wtx-related-ratio:'.str_replace(':','/',$d['image_ratio']).';}';
    $css.='@media(max-width:'.(int)$s['tokens']['tablet'].'px){.wtx-related>.wtx-related-items{grid-template-columns:repeat(var(--wtx-related-tablet,2),minmax(0,1fr));}}';
    $css.='@media(max-width:'.(int)$s['tokens']['mobile'].'px){.wtx-related>.wtx-related-items{grid-template-columns:repeat(var(--wtx-related-mobile,1),minmax(0,1fr));}}';
    return $css;
}
add_action('wp_enqueue_scripts',static function(){
    // Tiny dependency-free safety layer. Loaded before footer images can report failure, and rescans completed images.
    wp_enqueue_style('witarix-publication-layouts',get_template_directory_uri().'/assets/studio/publication-layouts.css',array('witarix-layout'),WITARIX_VERSION);
    wp_enqueue_script('witarix-media-resilience',get_template_directory_uri().'/assets/studio/media-resilience.js',array(),WITARIX_VERSION,true);
},58);

function wtx143_media_is_placeholder($html) {
    return is_string($html)&&strpos($html,'<span class="wtx-media-placeholder')===0;
}

/** Section-level controls reuse existing card markup rather than a second rendering engine. */
function wtx143_section_layout_css($selector,$p,$settings,$kind) {
    $s=':root '.$selector;
    $css=wtx143_palette_css($selector,$p);
    $has_colors=(bool)array_filter(array_intersect_key($p,array_flip(wtx143_color_fields())));
    $ordinary=!in_array($kind,array('news_hero','posts_slider','static_hero','stats','split_sections','social_feed','registered_embed','social_profile','link_cards','ad_slot','cta'),true);
    if($ordinary||$has_colors){
        $css.=$s.'>.wtx-news-section-head :is(h2,h3,h4){color:var(--wtx-ink-heading,var(--wtxs-text));}';
        // Overlay hero modes keep their built-in safe contrast until explicitly overridden locally.
        foreach(array('title'=>'.wtx-news-title>a, .wtx-author-opinion>h2>a, .wtx-author-opinion>h3>a, .wtx-author-opinion>h4>a','hover'=>'.wtx-news-title>a:hover, .wtx-author-opinion>h2>a:hover, .wtx-author-opinion>h3>a:hover, .wtx-author-opinion>h4>a:hover','excerpt'=>'.wtx-news-deck','meta'=>'.wtx-news-card-meta, .wtx-author-opinion-name, .wtx-author-opinion>time') as $role=>$targets){
            if(!$ordinary&&empty($p[$role.'_color'])&&empty($p['dark_'.$role.'_color'])){continue;}
            $selectors=array();foreach(explode(', ',$targets) as $target){$selectors[]=$s.' '.$target;}
            $fallback=in_array($role,array('excerpt','meta'),true)?'muted':($role==='hover'?'primary':'text');
            $css.=implode(',',$selectors).'{color:var(--wtx-ink-'.$role.',var(--wtxs-'.$fallback.'));}';
            if($role==='meta'){$css.=$s.' .wtx-news-card-meta a,'.$s.' .wtx-author-opinion-name a{color:inherit;}';}
        }
    }
    if(isset($p['excerpt_lines'])&&($p['show_excerpt']??true)){
        $lines=(int)$p['excerpt_lines'];$css.=$s.'>.wtx-bp-items>.wtx-news-card .wtx-news-deck,'.$s.'>.wtx-news-feed>.wtx-news-card .wtx-news-deck{'.($lines?'display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:'.$lines.';overflow:hidden;':'-webkit-line-clamp:unset;').'}';
    }
    if($kind==='author_cards'){
        $card=$s.'>.wtx-bp-items>.wtx-author-opinion';$heading=$card.'>:is(h2,h3,h4)';
        if(isset($p['card_padding'])){$css.=$card.'{padding:'.(int)$p['card_padding'].'px;}';}
        if(isset($p['card_radius'])){$css.=$card.'{border-radius:'.(int)$p['card_radius'].'px;}';}
        if(isset($p['title_size'])){$css.=$heading.'{font-size:'.(int)$p['title_size'].'px!important;}';}
        if(isset($p['title_lines'])&&$p['title_lines']){$css.=$heading.'>a{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:'.(int)$p['title_lines'].';overflow:hidden;}';}
        $style=$p['card_style']??'outlined';
        if($style!=='inherit'){$css.=$card.'{border:'.(in_array($style,array('outlined','elevated'),true)?(int)($p['border_width']??1).'px solid var(--wtxs-border)':'0').';background:'.($style==='soft'?'var(--wtxs-surface)':'var(--wtxs-background)').';box-shadow:'.($style==='elevated'?'0 6px 20px rgb(0 0 0 / 8%)':'none').';}';}
        $equal=$p['equal_height']??true;$css.=$s.'>.wtx-bp-items{align-items:'.($equal?'stretch':'start').';}'.$card.'{height:'.($equal?'100%':'auto').';}';
        if(isset($p['title_mobile'])){$css.='@media(max-width:'.(int)$settings['tokens']['mobile'].'px){'.$heading.'{font-size:'.(int)$p['title_mobile'].'px!important;}}';}
    }
    if($kind==='feature_plus_list'){
        $ratio=$p['image_ratio']??'16:9';$ratio=$ratio==='original'?'auto':($ratio==='inherit'?'16:9':$ratio);$cards=($p['feature_layout']??'lead_list')==='cards';
        $root=$s.'.wtx-bp-section--feature_plus_list';$items=$root.'>.wtx-bp-items';$row=$items.'>.wtx-news-card--row';$lead=$items.'>.wtx-news-card--feature';
        if($cards){
            $css.=$items.'{display:grid;grid-template-columns:repeat(var(--wtx-bp-cols,3),minmax(0,1fr));grid-auto-rows:auto;align-items:stretch;}';
            $css.=$items.'>.wtx-news-card{grid-column:auto;grid-row:auto;display:flex;flex-direction:column;align-self:stretch;min-width:0;}';
            $css.=$items.'>.wtx-news-card>.wtx-news-card-image{width:100%;aspect-ratio:'.str_replace(':','/',$ratio).';margin:0;}';
            $css.=$items.'>.wtx-news-card>.wtx-news-card-copy{padding:'.(int)($p['card_padding']??16).'px;}';
            $css.=$items.'>.wtx-news-card .wtx-news-title{font-size:var(--wtx-section-title,21px)!important;line-height:1.5;}';
            foreach(array('tablet'=>$settings['tokens']['tablet'],'mobile'=>$settings['tokens']['mobile']) as $device=>$width){$css.='@media(max-width:'.(int)$width.'px){'.$items.'{grid-template-columns:repeat('.(int)($p[$device.'_columns']??($device==='mobile'?1:2)).',minmax(0,1fr));}}';}
            $css.='@media(max-width:'.(int)$settings['tokens']['mobile'].'px){'.$items.'>.wtx-news-card .wtx-news-title{font-size:'.(int)($p['title_mobile']??18).'px!important;}}';
        }else{
            $css.=$root.'[data-wtx-feature-count="1"]>.wtx-bp-items{grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);align-items:start;grid-auto-rows:min-content;}';
            $css.=$root.'[data-wtx-feature-count="1"]>.wtx-bp-items>.wtx-news-card--feature{grid-row:1 / span var(--wtx-feature-rows,1);height:auto;align-self:start;}';
            $css.=$row.'{height:auto;align-self:start;}'.$row.'>.wtx-news-card-copy{flex:initial;padding:0;}';
            $css.=$row.' .wtx-news-card-meta{margin-block-start:8px;padding-block-start:0;}';
            $css.=$row.' .wtx-news-deck{'.(!empty($p['secondary_excerpt'])?'display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;font-size:14px;line-height:1.65;margin:6px 0;':'display:none;').'}';
            $css.=$lead.' .wtx-news-title{font-size:var(--wtx-section-title,24px)!important;}';
            $css.='@media(max-width:'.(int)$settings['tokens']['tablet'].'px){'.$root.'[data-wtx-feature-count="1"]>.wtx-bp-items{grid-template-columns:minmax(0,1fr);}'.$lead.','.$row.'{grid-column:auto;grid-row:auto;}}';
        }
    }
    return $css;
}

/** Local initials are derived only from the same resolved byline if its image cannot load. */
function wtx143_avatar_guard($html,$identity,$options) {
    $name=wtx143_plain_text($identity['name']??'');preg_match('/[\p{L}\p{N}]/u',$name,$m);
    return $html.(($options['fallback']??'initials')!=='none'&&isset($m[0])?'<span class="wtx-author-initial" data-wtx-avatar-fallback hidden aria-hidden="true">'.esc_html($m[0]).'</span>':'');
}

.wtxs-menu-overlay.wtx150-fullscreen .wtxs-overlay-panel{width:100%;max-width:100%;min-height:100dvh;margin:0;}
.wtxs-menu-overlay .wtx150-secondary-title{font-size:1rem;margin-block:20px 6px;}
