
{"id":702,"date":"2026-04-23T06:10:56","date_gmt":"2026-04-23T06:10:56","guid":{"rendered":"https:\/\/obexanalytica.com\/ar\/?p=702"},"modified":"2026-04-24T07:18:12","modified_gmt":"2026-04-24T07:18:12","slug":"702-2","status":"publish","type":"post","link":"https:\/\/obexanalytica.com\/ar\/blog\/2026\/04\/23\/702-2\/","title":{"rendered":"A Commodity Forecast for Middle Eastern Economies Under El Ni\u00f1o"},"content":{"rendered":"\n<div id=\"obex-article-between-the-storm-and-the-strait\" class=\"obex-article\" lang=\"en\" dir=\"ltr\">\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Sans+Arabic:wght@400;500;600;700&display=swap');\n\n#obex-article-between-the-storm-and-the-strait,\n#obex-article-between-the-storm-and-the-strait * {\n  box-sizing: border-box;\n}\n\n#obex-article-between-the-storm-and-the-strait {\n  --obex-primary: #0F1C5C;\n  --obex-accent: #E60000;\n  --obex-white: #FFFFFF;\n  --obex-soft-bg: #F7F8FC;\n  --obex-grid: rgba(15, 28, 92, 0.14);\n  --obex-border: rgba(15, 28, 92, 0.24);\n  --obex-muted: rgba(15, 28, 92, 0.68);\n  --obex-shadow: 0 18px 40px rgba(15, 28, 92, 0.08);\n  --obex-radius: 18px;\n  width: 100%;\n  color: var(--obex-primary);\n  font-family: 'IBM Plex Sans', 'IBM Plex Sans Arabic', Arial, sans-serif;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-article-shell {\n  width: 100%;\n  max-width: 1100px;\n  margin: 0 auto;\n  padding: 36px 0;\n  color: var(--obex-primary);\n  font-family: inherit;\n  direction: ltr;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-header {\n  text-align: center;\n  margin-bottom: 44px;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-kicker {\n  margin: 0 0 8px;\n  color: var(--obex-accent);\n  font-size: clamp(0.92rem, 1.6vw, 1.08rem);\n  line-height: 1.55;\n  font-weight: 700;\n  letter-spacing: 0.04em;\n  text-transform: uppercase;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-program {\n  margin: 0 0 20px;\n  color: var(--obex-primary);\n  font-size: clamp(0.95rem, 1.75vw, 1.08rem);\n  line-height: 1.6;\n  font-weight: 600;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-title {\n  margin: 0 0 14px;\n  color: var(--obex-primary);\n  font-family: inherit;\n  font-size: clamp(2rem, 4.3vw, 3rem);\n  font-weight: 700;\n  line-height: 1.25;\n  letter-spacing: -0.02em;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-subtitle {\n  margin: 0 auto 18px;\n  max-width: 850px;\n  color: var(--obex-primary);\n  font-size: clamp(1.1rem, 2vw, 1.35rem);\n  line-height: 1.65;\n  font-weight: 500;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-title-rule {\n  width: 86px;\n  height: 5px;\n  margin: 0 auto 22px;\n  background: var(--obex-accent);\n  border-radius: 999px;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-text {\n  margin: 0 0 26px;\n  color: var(--obex-primary);\n  font-family: inherit;\n  font-size: clamp(1rem, 1.45vw, 1.18rem);\n  line-height: 1.95;\n  font-weight: 400;\n  text-align: justify;\n  overflow-wrap: break-word;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-heading {\n  display: inline-block;\n  margin: 50px 0 24px;\n  padding-bottom: 10px;\n  color: var(--obex-primary);\n  border-bottom: 3px solid var(--obex-accent);\n  font-family: inherit;\n  font-size: clamp(1.35rem, 2.6vw, 1.75rem);\n  line-height: 1.45;\n  font-weight: 700;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-chart-card {\n  margin: 44px 0;\n  padding: 30px 34px;\n  background: var(--obex-white);\n  border: 2px solid var(--obex-primary);\n  border-radius: var(--obex-radius);\n  box-shadow: var(--obex-shadow);\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-chart-title {\n  margin: 0 0 22px;\n  text-align: center;\n  color: var(--obex-accent);\n  font-size: clamp(1.12rem, 2.1vw, 1.45rem);\n  line-height: 1.45;\n  font-weight: 700;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-chart-wrapper {\n  position: relative;\n  width: 100%;\n  min-height: 380px;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-chart-wrapper.is-tall {\n  min-height: 430px;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-chart-source,\n#obex-article-between-the-storm-and-the-strait .obex-table-source {\n  margin: 16px 0 0;\n  color: var(--obex-muted);\n  font-size: 0.84rem;\n  line-height: 1.6;\n  text-align: center;\n}\n\n#obex-article-between-the-storm-and-the-strait canvas {\n  display: block;\n  width: 100% !important;\n  height: 100% !important;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-table-wrap {\n  width: 100%;\n  overflow-x: auto;\n  margin: 42px 0 0;\n  border: 2px solid var(--obex-primary);\n  border-radius: var(--obex-radius);\n  background: var(--obex-white);\n  box-shadow: var(--obex-shadow);\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-data-table {\n  width: 100%;\n  min-width: 760px;\n  border-collapse: collapse;\n  color: var(--obex-primary);\n  font-size: 0.98rem;\n  line-height: 1.65;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-data-table.is-wide {\n  min-width: 980px;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-data-table caption {\n  caption-side: top;\n  padding: 18px;\n  color: var(--obex-accent);\n  font-weight: 700;\n  font-size: 1.22rem;\n  line-height: 1.45;\n  text-align: center;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-data-table th,\n#obex-article-between-the-storm-and-the-strait .obex-data-table td {\n  padding: 14px 16px;\n  border-bottom: 1px solid var(--obex-grid);\n  vertical-align: top;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-data-table thead th {\n  background: var(--obex-primary);\n  color: var(--obex-white);\n  font-weight: 700;\n}\n\n#obex-article-between-the-storm-and-the-strait .obex-data-table tbody tr:last-child td {\n  border-bottom: 0;\n}\n\n\n#obex-article-between-the-storm-and-the-strait a,\n#obex-article-between-the-storm-and-the-strait a:link,\n#obex-article-between-the-storm-and-the-strait a:visited,\n#obex-article-between-the-storm-and-the-strait a:hover,\n#obex-article-between-the-storm-and-the-strait a:focus {\n  color: var(--obex-accent);\n  text-decoration: none !important;\n  border-bottom: 0 !important;\n  box-shadow: none !important;\n  overflow-wrap: anywhere;\n}\n\n#obex-article-between-the-storm-and-the-strait a:hover,\n#obex-article-between-the-storm-and-the-strait a:focus {\n  color: var(--obex-primary);\n}\n\n@media (max-width: 768px) {\n  #obex-article-between-the-storm-and-the-strait .obex-article-shell {\n    padding: 28px 0;\n  }\n\n  #obex-article-between-the-storm-and-the-strait .obex-header {\n    margin-bottom: 34px;\n  }\n\n  #obex-article-between-the-storm-and-the-strait .obex-title {\n    font-size: clamp(1.75rem, 8vw, 2.35rem);\n  }\n\n  #obex-article-between-the-storm-and-the-strait .obex-chart-card {\n    padding: 22px 16px;\n    border-radius: 14px;\n  }\n\n  #obex-article-between-the-storm-and-the-strait .obex-text {\n    font-size: 1rem;\n    line-height: 1.9;\n    margin-bottom: 22px;\n  }\n\n  #obex-article-between-the-storm-and-the-strait .obex-heading {\n    display: block;\n    width: fit-content;\n    margin-top: 40px;\n    font-size: 1.28rem;\n  }\n\n  #obex-article-between-the-storm-and-the-strait .obex-chart-wrapper {\n    min-height: 320px;\n  }\n\n  #obex-article-between-the-storm-and-the-strait .obex-chart-wrapper.is-tall {\n    min-height: 430px;\n  }\n\n  #obex-article-between-the-storm-and-the-strait .obex-chart-title {\n    font-size: 1.08rem;\n  }\n\n  #obex-article-between-the-storm-and-the-strait .obex-data-table {\n    min-width: 700px;\n    font-size: 0.9rem;\n  }\n\n  #obex-article-between-the-storm-and-the-strait .obex-data-table.is-wide {\n    min-width: 920px;\n  }\n}\n<\/style>\n\n  <article class=\"obex-article-shell\">\n    <header class=\"obex-header\">\n      \n\n      <div class=\"obex-title-rule\" aria-hidden=\"true\"><\/div>\n      \n    <\/header>\n\n<p class=\"obex-text\">As 2026 advances into its second quarter, the global commodity complex is already navigating its most disruptive configuration since the pandemic-era supply collapse. Brent crude averaged $103.7 per barrel in March 2026, against a 2025 full-year average of $69.0 \u2014 a 50 percent premium sustained not by demand recovery but by a geopolitical supply rupture of historic proportions. European natural gas benchmarks on the TTF hub surged to $17.9 per million British thermal units, while aluminium on the London Metal Exchange reached $3,373 per tonne and copper settled at $12,529 per tonne. Wheat for hard red winter delivery was trading at $275.9 per metric tonne, maize at $212.7 per tonne, and palm oil at $1,103 per tonne. These are not the prices of a market in equilibrium.<\/p>\n\n<p class=\"obex-text\">They are the prices of a market absorbing, simultaneously, the near-complete closure of the Strait of Hormuz following the February 2026 escalation of the Iran-Israel-United States conflict \u2014 a waterway through which approximately 20 million barrels of crude oil and significant volumes of LNG transited daily under baseline conditions \u2014 the catastrophic destruction of 1.6 million tonnes of Gulf aluminium smelting capacity at Emirates Global Aluminium&#8217;s Al Taweelah facility, and a global fertilizer supply shock that has driven urea spot prices to as high as $780 per tonne in Egyptian benchmark markets, representing a surge of 40 to 60 percent above pre-crisis levels. The maritime tanker traffic collapse of over 90 percent through Hormuz has stranded one-fifth of the world&#8217;s energy supply from open markets, forcing QatarEnergy to declare force majeure and requiring the International Energy Agency to release 400 million barrels of emergency crude in its largest-ever coordinated liquidity intervention.<\/p>\n\n<p class=\"obex-text\">Into this already fractured commodity landscape, the world&#8217;s premier meteorological agencies are now assigning a 61 percent probability that El Ni\u00f1o conditions will materialize in the May-to-July 2026 window and persist through at least the end of 2027. A one-in-four probability of a historically severe &#8216;Super El Ni\u00f1o&#8217; \u2014 with the Ni\u00f1o-3.4 index exceeding +2.0 degrees Celsius \u2014 adds a tail risk that consensus commodity models have not yet fully integrated. The European Central Bank&#8217;s estimation framework places the peak food-price impact of a strong El Ni\u00f1o at approximately 9 percent above baseline, arriving 16 months after onset. Under a mid-2026 El Ni\u00f1o emergence, that apex falls squarely in the fourth quarter of 2027 \u2014 precisely the moment when the fiscal buffers deployed to manage today&#8217;s geopolitical shock will be most depleted. For the Middle East and North Africa region, this is not a meteorological curiosity. It is a structural realignment of commodity risk that will differentiate the economic trajectories of producers and consumers across the regional spectrum with considerable, and potentially irreversible, force. All MENA-specific scenarios, country-level forecasts, and commodity channel estimates generated by this analysis are available in full through the interactive dashboard attached at the end of this report.<\/p>\n\n<figure class=\"obex-chart-card\">\n  <figcaption class=\"obex-chart-title\">Global Benchmark Commodity Prices Indexed to 2025 Average = 100<\/figcaption>\n  <div class=\"obex-chart-wrapper\">\n    <canvas id=\"obexBenchmarkIndexChart\" role=\"img\" aria-label=\"Line chart showing Brent crude, TTF gas, Wheat HRW, and palm oil indexed to 2025 annual average equals 100.\"><\/canvas>\n  <\/div>\n  <p class=\"obex-chart-source\">Source: World Bank Pink Sheet, April 2026. Data points shown: 2024 annual average, 2025 quarterly averages, and January\u2013March 2026 monthly averages; each series indexed to its 2025 annual average = 100.<\/p>\n<\/figure>\n\n<h2 class=\"obex-heading\">I.  The Architecture of a Compound Shock<\/h2>\n\n<p class=\"obex-text\">The intellectual error most frequently committed when assessing El Ni\u00f1o&#8217;s economic significance is to treat the phenomenon as a bounded, quantifiable disruption with a discrete start, a discrete end, and a recoverable aftermath. Historical econometrics correct this assumption with considerable force. Following the 1982\u20131983 El Ni\u00f1o event \u2014 one of the strongest modern episodes on record \u2014 the global economy was left an estimated $4.1 trillion smaller over the subsequent five-year period compared to its pre-shock growth trajectory. The 1997\u20131998 Super El Ni\u00f1o inflicted $5.7 trillion in persistent macroeconomic scarring over an equivalent horizon. These figures, produced by landmark attribution research from Dartmouth College&#8217;s Callahan and Mankin, are not insurance losses or immediate disaster tallies. They represent the compounding suppression of total factor productivity, capital investment, and sovereign revenue across 143 countries \u2014 losses that did not manifest immediately but accumulated silently in the form of unrealized growth for years after Pacific sea surface temperatures had returned to equilibrium. For the anticipated 2026\u20132027 cycle, baseline projections place aggregate global GDP loss at $3.4 trillion over the multi-year recovery horizon. The compound nature of the current macroeconomic environment makes this figure a floor rather than a ceiling.<\/p>\n\n<p class=\"obex-text\">What distinguishes 2026 from every prior El Ni\u00f1o cycle is the structural condition of the global commodity system into which the meteorological event is emerging. The Middle East conflict has already established an elevated baseline for energy, freight, and insurance costs that would, in isolation, represent an acute macroeconomic shock. In combination with an approaching El Ni\u00f1o, the interaction effects are not additive but multiplicative. Consider the fertilizer transmission mechanism alone. The Strait of Hormuz blockade has severed approximately one-third of the world&#8217;s key fertilizer chemical flows \u2014 including 40 to 50 percent of the global seaborne urea trade \u2014 pushing prices to $780 per tonne in Egyptian markets. These cost increases arrive precisely as global farmers are finalizing input purchases for upcoming planting seasons. Because harvest volume correlates directly with nitrogen application, the cost-driven underfertilization that is already occurring across the developing world mathematically guarantees structurally lower crop yields before El Ni\u00f1o has contributed a single degree of additional drought stress. When an El Ni\u00f1o-induced monsoon failure or Southeast Asian drought subsequently strikes this nutritionally starved agricultural base, the combined yield destruction will be dramatically more severe than historical El Ni\u00f1o analog models \u2014 which assume normal input availability \u2014 would project.<\/p>\n\n<p class=\"obex-text\">The macroeconomic architecture of the compound shock operates through three distinct but interlocking transmission channels. The geopolitical shock delivers immediate, violent repricing of energy, freight, and insurance \u2014 establishing a higher operational baseline across every sector that imports, manufactures, or transports anything. The meteorological shock, still assembling over the equatorial Pacific, will deliver its primary blow through agricultural supply destruction, arriving in consumer price indices with the ECB&#8217;s documented 16-month lag. Between these two temporally offset shocks lies the fertilizer crisis, which functions as a bridge mechanism: it ensures that the agricultural systems which would otherwise partially absorb El Ni\u00f1o stress through optimal management are instead entering the drought cycle already compromised. For Middle Eastern policymakers and institutional investors, this architecture means there is no near-term relief scenario in which either shock concludes before the other&#8217;s consequences are fully realized.<\/p>\n\n<figure class=\"obex-chart-card\">\n  <figcaption class=\"obex-chart-title\">Stylized El Ni\u00f1o Food-Price Transmission Path<\/figcaption>\n  <div class=\"obex-chart-wrapper\">\n    <canvas id=\"obexFoodTransmissionChart\" role=\"img\" aria-label=\"Line chart showing a stylized El Ni\u00f1o food-price transmission path peaking at about nine percent above baseline at month sixteen.\"><\/canvas>\n  <\/div>\n  <p class=\"obex-chart-source\">Source: European Central Bank, 2023 Economic Bulletin; values are stylized scenario points interpolated from the reported peak of approximately +9% around month 16.<\/p>\n<\/figure>\n\n<h2 class=\"obex-heading\">II.  Food: The First-Order Transmission Channel<\/h2>\n\n<p class=\"obex-text\">Food is, unambiguously, the commodity channel through which El Ni\u00f1o inflicts its most direct and politically consequential damage on Middle Eastern economies. The region&#8217;s structural dependence on imported staples means that global grain and edible oil markets function essentially as a direct pipeline from producing-country weather anomalies to domestic consumer price indices, with the only variable being the speed and depth of pass-through \u2014 determined by the fiscal architecture each government deploys as a buffer. Egypt, the world&#8217;s single largest wheat importer, was expected to import 13 million metric tonnes in marketing year 2025\/26 against domestic production of approximately 9.2 million tonnes, leaving a structural import gap of nearly 3.8 million tonnes that must be sourced entirely from international markets. In the current pricing environment, this dependency is an acute fiscal vulnerability.<\/p>\n\n<p class=\"obex-text\">The El Ni\u00f1o transmission mechanism for food operates through two geographically distinct but temporally convergent agricultural shocks. In Southeast Asia \u2014 the world&#8217;s dominant palm oil producing region, where Indonesia and Malaysia together control the overwhelming majority of global supply \u2014 the drought conditions reliably induced by El Ni\u00f1o critically impair fresh fruit bunch development in oil palm trees. The yield suppression lag, documented at 8 to 22 months after the meteorological onset, creates a deceptive delay that causes markets to underestimate the coming tightness. Historical data from the Malaysian Palm Oil Board indicates that anomalous ENSO events reduce crude palm oil production by a baseline of 3.37 percent, draw down global stocks by 2.5 percent, and push benchmark prices upward by over 10.2 percent. El Ni\u00f1o-induced drought additionally transforms Indonesia&#8217;s carbon-rich peatlands into highly combustible terrain; during the 2015 &#8216;Godzilla&#8217; El Ni\u00f1o, the resulting fires generated estimated losses of $16.1 billion, produced transboundary haze affecting 500,000 people in Singapore and Malaysia, and disrupted the regional logistics networks through which MENA food importers source their edible oils.<\/p>\n\n<p class=\"obex-text\">Simultaneously, the weakening or delay of the Indian monsoon \u2014 one of the most consistent teleconnection effects of El Ni\u00f1o events \u2014 threatens the world&#8217;s second-largest wheat importer and leading rice and sugar producer with deficient seasonal rains that drive domestic food inflation and historically trigger Indian government export restrictions. When India restricts rice or wheat exports, global spot markets tighten immediately, and MENA import bills accelerate within weeks. During the 2023 El Ni\u00f1o cycle, India imposed rice export bans that contributed directly to a global rice price surge. Given that rice represents an important share of consumption baskets across Gulf states and the Levant, a repetition of this dynamic in 2027 would compound the wheat and edible oil pressures already building through the Hormuz disruption. The aggregate food import-cost scenario for MENA \u2014 as synthesized from the compound scenario analysis \u2014 ranges from a 4 to 9 percent landed import basket uplift in the baseline to a 20 to 35 percent uplift in the severe case, where El Ni\u00f1o-induced crop failures stack directly on top of sustained freight premiums, fertilizer costs, and geopolitical supply restrictions.<\/p>\n\n<div class=\"obex-table-wrap\">\n  <table class=\"obex-data-table is-wide\">\n    <caption>Table 1  |  Global Commodity Price Scenario Ranges Under Baseline, Adverse, and Severe El Ni\u00f1o Compounding<\/caption>\n    <thead>\n      <tr>\n        <th scope=\"col\">Benchmark<\/th>\n        <th scope=\"col\">Baseline<\/th>\n        <th scope=\"col\">Adverse<\/th>\n        <th scope=\"col\">Severe<\/th>\n        <th scope=\"col\">MENA Relevance<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td>Brent Crude ($\/bbl)<\/td>\n        <td>80\u2013105<\/td>\n        <td>105\u2013135<\/td>\n        <td>135\u2013180<\/td>\n        <td>First-order driver: transport, petrochemicals, fertilizers, import bills<\/td>\n      <\/tr>\n      <tr>\n        <td>TTF Gas ($\/mmbtu)<\/td>\n        <td>12\u201320<\/td>\n        <td>20\u201335<\/td>\n        <td>35\u201360<\/td>\n        <td>LNG, power generation, fertilizers \u2014 key for Egypt &amp; Jordan<\/td>\n      <\/tr>\n      <tr>\n        <td>Wheat HRW ($\/mt)<\/td>\n        <td>250\u2013310<\/td>\n        <td>300\u2013380<\/td>\n        <td>380\u2013500<\/td>\n        <td>Highest direct sensitivity for Egypt and bread-importing MENA economies<\/td>\n      <\/tr>\n      <tr>\n        <td>Maize ($\/mt)<\/td>\n        <td>205\u2013245<\/td>\n        <td>240\u2013300<\/td>\n        <td>300\u2013380<\/td>\n        <td>Feed channel \u2014 rapid transmission to poultry, dairy, meat prices<\/td>\n      <\/tr>\n      <tr>\n        <td>Palm Oil ($\/mt)<\/td>\n        <td>1,000\u20131,200<\/td>\n        <td>1,150\u20131,400<\/td>\n        <td>1,350\u20131,700<\/td>\n        <td>Edible-oil and processed-food channel; El Ni\u00f1o drought risk in SE Asia<\/td>\n      <\/tr>\n      <tr>\n        <td>Aluminium ($\/mt)<\/td>\n        <td>3,000\u20133,500<\/td>\n        <td>3,300\u20134,000<\/td>\n        <td>4,000\u20135,000<\/td>\n        <td>Most critical metals risk for GCC construction; compounded by Gulf smelter disruption<\/td>\n      <\/tr>\n      <tr>\n        <td>Copper ($\/mt)<\/td>\n        <td>11,500\u201313,500<\/td>\n        <td>12,500\u201314,500<\/td>\n        <td>13,500\u201316,000<\/td>\n        <td>Construction, power-grid, and equipment costs; ENSO channel through mining<\/td>\n      <\/tr>\n    <\/tbody>\n  <\/table>\n<\/div>\n<p class=\"obex-table-source\">Source: Obex Analytica Scenario Note \u2014 Compounded Impact of El Ni\u00f1o on Commodities, Food, Energy and Metals in MENA, April 2026.<\/p>\n\n<h2 class=\"obex-heading\">III.  Energy, Metals, and the Industrial Cost Spiral<\/h2>\n\n<p class=\"obex-text\">Energy and industrial metals occupy a qualitatively different structural position within the MENA compound shock framework. The primary energy price driver in 2026 is geopolitical rather than meteorological \u2014 the Hormuz closure has already delivered the crude oil and LNG price shock that El Ni\u00f1o alone, operating through demand-side warming channels, would require 12 to 18 months to generate. Brent averaged $103.7 per barrel in March 2026, against $69.0 for the full year 2025. TTF gas traded at $17.9 per million BTU against a 2025 average of $12.0. These numbers represent the geopolitical baseline onto which El Ni\u00f1o must now be overlaid. The question for Middle Eastern economies is not whether energy prices will rise further, but whether El Ni\u00f1o&#8217;s additional demand-side pressure \u2014 through intensified summer cooling requirements \u2014 will maintain this elevated floor throughout 2027 and into a period when markets had previously anticipated some normalization.<\/p>\n\n<p class=\"obex-text\">El Ni\u00f1o compounds the energy picture through two mechanisms of direct relevance to MENA. First, the intense and prolonged heatwaves associated with a strong ENSO event dramatically increase regional cooling demand. India&#8217;s experience during the developing El Ni\u00f1o of August 2023, when extreme heat drove peak electricity demand to 220 gigawatts \u2014 a 23 percent year-on-year increase \u2014 provides the most proximate analog for what MENA grid operators should anticipate. Across Egypt, Jordan, and the Gulf states, summer electricity consumption intensity will rise materially, increasing the LNG procurement requirements of import-dependent power systems at the very moment when global LNG prices are already elevated by the Hormuz disruption. Egypt&#8217;s position is particularly precarious: declining domestic gas production has already forced the government to charter floating storage and regasification units, and its monthly natural gas import bill has escalated from $560 million to $1.65 billion following the February 2026 conflict escalation. Second, in countries that supply LNG to MENA markets \u2014 notably those in Southeast Asia and Latin America with hydro-dependent generation systems \u2014 El Ni\u00f1o-induced droughts will reduce baseload electricity capacity and force diversion of domestic gas into power substitution, tightening the LNG market that MENA importers rely upon for marginal supply.<\/p>\n\n<p class=\"obex-text\">Industrial metals present the region&#8217;s most asymmetric risk profile. Aluminium is the highest-conviction MENA vulnerability, and in 2026 its risk is compounded not primarily by El Ni\u00f1o but by the direct physical destruction inflicted by the conflict. Targeted Iranian strikes on the EGA Al Taweelah smelter in Abu Dhabi \u2014 the world&#8217;s largest primary aluminium facility, producing 1.6 million tonnes of cast metal per year \u2014 simultaneously removed an estimated 4 percent of global supply overnight. Combined with operational disruptions at Aluminium Bahrain, Iranian production halts at IRALCO, and emergency rationing at Ma&#8217;aden Aluminium in Saudi Arabia, the projected global market deficit exceeds 2 to 3.5 million tonnes by year-end 2026. LME aluminium prices responded by reaching $3,571 per tonne \u2014 levels unseen since the 2022 European energy crisis peak \u2014 while all-in costs in US markets topped $6,000 per metric tonne following extraordinary Midwest Transaction Premium escalation. For the Gulf construction sector, which represents the primary end-use market for premium aluminium, this translates into a direct and sustained escalation of project delivery costs across the UAE and Saudi Arabia.<\/p>\n\n<p class=\"obex-text\">Copper and nickel carry an indirect but structurally material El Ni\u00f1o exposure that will compound through the back half of the decade. Chilean and Peruvian copper production \u2014 responsible together for approximately 37 percent of global output \u2014 faces a paradoxical dual threat. In Chile&#8217;s Atacama Desert mining districts, severe El Ni\u00f1o-induced droughts force groundwater extraction restrictions that can slash output at world-class operations by 32 to 44 percent. In Chile&#8217;s central and southern mining zones, the same cycle delivers anomalous flooding that destroys access routes and destabilizes tailings dams. State-owned Codelco lost an estimated 7,000 tonnes of copper during the 2023 flooding episode alone, with operational costs rising 10 percent in a single event. For Saudi Arabia&#8217;s Vision 2030 mega-projects and the UAE&#8217;s non-oil investment pipeline \u2014 both of which depend heavily on imported copper for electrical infrastructure and construction \u2014 the implications are direct: procurement costs will remain elevated and supply chain lead times will lengthen. For nickel, the Indonesian hydropower disruption channel identified in the research \u2014 El Ni\u00f1o drought reduces river flow, cutting hydro generation, which directly curtails the energy-intensive nickel refinement process \u2014 adds a further vector of commodity cost pressure that reaches MENA through steel and battery supply chains.<\/p>\n\n\n<figure class=\"obex-chart-card\">\n  <figcaption class=\"obex-chart-title\">MENA Compounded Impact by Commodity Channel<\/figcaption>\n  <div class=\"obex-chart-wrapper is-tall\">\n    <canvas id=\"obexChannelUpliftChart\" role=\"img\" aria-label=\"Horizontal floating bar chart showing baseline, adverse, and severe uplift ranges for MENA commodity channels.\"><\/canvas>\n  <\/div>\n  <p class=\"obex-chart-source\">Source: Obex Analytica Scenario Note \u2014 Compounded Impact of El Ni\u00f1o on Commodities, Food, Energy and Metals in MENA, April 2026.<\/p>\n<\/figure>\n\n<h2 class=\"obex-heading\">IV.  The Consumer-Producer Divide Across MENA<\/h2>\n\n<p class=\"obex-text\">The El Ni\u00f1o compound shock does not fall equally across Middle Eastern economies. The variable that determines transmission intensity is fiscal architecture: whether a country commands the hydrocarbon revenues and sovereign wealth buffers necessary to absorb imported price shocks through administrative intervention, or whether it enters the compound storm already managing an external debt burden, a structurally weakened currency, and a subsidy regime that has been partially dismantled under prior IMF program conditions. The bifurcation this creates within the MENA region is not a nuance \u2014 it is the defining strategic variable for the 2026\u20132027 horizon.<\/p>\n\n<p class=\"obex-text\">Egypt occupies the maximum exposure position on the consumer side of this spectrum. The country was already absorbing annual urban headline inflation of 15.2 percent in March 2026, with core inflation at 14.0 percent, when the geopolitical shock struck in February. Industrial producer prices had risen 8.4 percent year-over-year before the Hormuz disruption was fully absorbed by the economy. The loss of Suez Canal transit revenues \u2014 Egypt&#8217;s critical foreign exchange stabilizer \u2014 combined with the escalation of monthly natural gas import costs from $560 million to $1.65 billion, has placed sovereign finances under acute stress. Prime Minister Madbouly was forced to mandate a 30 percent reduction in government fuel allocations, suspend heavy diesel-consuming state projects, and accelerate the privatization of state assets to raise approximately $6 billion in emergency liquidity. For the Egyptian consumer, food inflation of 5.8 percent in March 2026 represents only the early signal of what the ECB&#8217;s 16-month transmission model places solidly in 2027 \u2014 precisely as El Ni\u00f1o&#8217;s agricultural destruction peaks. The compound scenario analysis projects a CPI impulse of 1.5 to 2.5 percentage points in the baseline, rising to 3.0 to 5.0 percentage points in the adverse scenario, and 6.0 to 9.0 percentage points in the severe case for Egyptian consumers, with producer cost pressures reaching as high as 15 to 25 percent in the severe scenario.<\/p>\n\n<p class=\"obex-text\">Jordan&#8217;s position mirrors Egypt&#8217;s structural exposure in import dependence but benefits from meaningfully stronger policy credibility and proactive supply-side buffering. The Jordanian government has established a 10-month national wheat reserve and a 9-month barley buffer \u2014 coverage levels that vastly exceed international food security thresholds and provide a genuine insulation window against the most acute near-term price volatility. Jordanian CPI inflation was contained to 1.87 percent in March 2026, and the IMF&#8217;s extended facility review acknowledged the Kingdom&#8217;s prudent shock-response capacity. Nevertheless, Jordan&#8217;s approximately 96 percent net energy import dependency ensures that every sustained elevation in LNG and gas prices translates directly into higher electricity tariffs for both industrial consumers and households, eroding the competitiveness of a manufacturing sector that lacks the scale advantages of larger regional peers. The strategic food buffers buy time; they do not structurally alter the underlying exposure.<\/p>\n\n<p class=\"obex-text\">Saudi Arabia and the United Arab Emirates inhabit a fundamentally different macroeconomic universe, though neither is immune to compound shock effects at the producer level. Both maintain dollar pegs backed by substantial sovereign wealth reserves. Both sit on the revenue rather than the cost side of the oil price shock. Saudi Arabia demonstrated this asymmetric positioning with strategic clarity: in February 2026, as global energy markets were disrupted, the Kingdom increased crude exports by 283,000 barrels per day to reach 7.276 million barrels per day, pushing total production to 10.882 million barrels per day. Saudi headline inflation was contained to 1.8 percent in March 2026, and the Saudi Central Bank retained the monetary policy flexibility to reduce interest rates by 25 basis points to support domestic credit growth. The UAE recorded non-hydrocarbon GDP growth of 6.1 percent in late 2025 and maintained consumer inflation averaging approximately 1.3 percent in the baseline. Yet the destruction of the Al Taweelah smelter has already altered the producer cost environment for UAE construction, where escalation of 3 percent is forecast for 2026, and in Saudi Arabia, where construction costs across project categories are rising at 4 to 6 percent, with data center and digital infrastructure projects facing increases of 6 to 8 percent. The Vision 2030 mega-project pipeline&#8217;s fundamental dependence on imported specialized materials \u2014 now subject to extended shipping routes and elevated war-risk insurance premiums \u2014 ensures that producer cost pressure will persist throughout the compound shock window regardless of the sovereign wealth cushion available to absorb consumer-side pass-through.<\/p>\n\n<h2 class=\"obex-heading\">Conclusion: Scenarios, Strategic Posture, and the Road to 2027<\/h2>\n\n<p class=\"obex-text\">The foregoing analysis converges on a set of strategic conclusions that are neither hypothetical nor speculative; they are the logical product of compounding historical precedent, current observed market data, and forward-looking meteorological probability. The MENA region in 2026 faces a rare and dangerous conjunction: a geopolitical supply shock that has already repriced energy, metals, and fertilizers to acute levels, overlaid by a meteorological shock assembling its full force beneath the surface of the equatorial Pacific, which will arrive in consumer price indices with a 16-month lag \u2014 precisely when fiscal buffers will be partially depleted and consumer purchasing power will have been eroded through a full cycle of cost escalation. The food and energy import-dependent economies of Egypt and Jordan are not merely vulnerable to this sequence; they face the structural preconditions for a sustained stagflationary episode that carries measurable social stability risk if the adverse or severe scenario materializes. For Gulf hydrocarbon exporters, the calculus is different but not absent: sovereign wealth insulates households, but the destruction of the Al Taweelah smelter, the elevation of maritime freight costs, and the escalation of imported materials prices for construction and industrial projects represent a persistent drag on non-oil sector competitiveness that outlasts any ceasefire timeline.<\/p>\n\n<p class=\"obex-text\">The most critical strategic insight generated by the compound scenario framework is the non-linearity of the risk. In food, El Ni\u00f1o will strike an agricultural system already compromised by fertilizer shortages \u2014 meaning yield failures will be deeper than historical ENSO analogs would predict. In energy, the geopolitical shock is already larger than any ENSO demand-side signal, but El Ni\u00f1o&#8217;s summer heat intensification will sustain elevated LNG import requirements into a period of tighter global supply. In metals, the aluminium supply disruption from the Gulf smelter crisis creates a structural deficit that El Ni\u00f1o&#8217;s water and power constraints on copper and nickel mining will compound further. The compounding is asymmetric: its benefits \u2014 higher revenue for hydrocarbon exporters \u2014 are concentrated and immediate, while its costs \u2014 food inflation, energy import bills, and producer cost escalation \u2014 are distributed, lagged, and politically corrosive for the import-dependent tier of MENA economies.<\/p>\n\n\n<figure class=\"obex-chart-card\">\n  <figcaption class=\"obex-chart-title\">Estimated Domestic CPI Impulse Under El Ni\u00f1o Compounding<\/figcaption>\n  <div class=\"obex-chart-wrapper\">\n    <canvas id=\"obexCpiImpulseChart\" role=\"img\" aria-label=\"Horizontal floating bar chart showing domestic CPI impulse ranges for Egypt, Jordan, UAE, and Saudi Arabia under baseline, adverse, and severe scenarios.\"><\/canvas>\n  <\/div>\n  <p class=\"obex-chart-source\">Source: Obex Analytica Scenario Note \u2014 Compounded Impact of El Ni\u00f1o on Commodities, Food, Energy and Metals in MENA, April 2026. Unit: percentage points added to domestic inflation relative to a no-El-Ni\u00f1o\/no-compounding baseline.<\/p>\n<\/figure>\n\n<figure class=\"obex-chart-card\">\n  <figcaption class=\"obex-chart-title\">Estimated Producer-Cost Uplift Under El Ni\u00f1o Compounding<\/figcaption>\n  <div class=\"obex-chart-wrapper\">\n    <canvas id=\"obexProducerCostChart\" role=\"img\" aria-label=\"Horizontal floating bar chart showing producer-cost uplift ranges for Egypt, Jordan, UAE, and Saudi Arabia under baseline, adverse, and severe scenarios.\"><\/canvas>\n  <\/div>\n  <p class=\"obex-chart-source\">Source: Obex Analytica Scenario Note \u2014 Compounded Impact of El Ni\u00f1o on Commodities, Food, Energy and Metals in MENA, April 2026. Producer-cost ranges represent direct and indirect input-cost uplifts, not total PPI forecasts.<\/p>\n<\/figure>\n\n<div class=\"obex-table-wrap\">\n  <table class=\"obex-data-table is-wide\">\n    <caption>Table 4  |  Broader MENA Extrapolation by Economy Type \u2014 CPI Impact Across Scenarios<\/caption>\n    <thead>\n      <tr>\n        <th scope=\"col\">Economy Type<\/th>\n        <th scope=\"col\">Indicative Countries<\/th>\n        <th scope=\"col\">CPI Baseline<\/th>\n        <th scope=\"col\">CPI Adverse<\/th>\n        <th scope=\"col\">CPI Severe<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td>Food- and energy-importing MENA economies<\/td>\n        <td>Egypt, Jordan, Lebanon, Tunisia, Morocco<\/td>\n        <td>+1.0 to +2.5 ppt<\/td>\n        <td>+2.5 to +5.0 ppt<\/td>\n        <td>+5.0 to +9.0 ppt<\/td>\n      <\/tr>\n      <tr>\n        <td>Hydrocarbon exporters with strong buffers<\/td>\n        <td>Saudi Arabia, UAE, Qatar, Kuwait, Oman, Bahrain<\/td>\n        <td>+0.2 to +0.8 ppt<\/td>\n        <td>+0.8 to +1.8 ppt<\/td>\n        <td>+1.8 to +3.2 ppt<\/td>\n      <\/tr>\n      <tr>\n        <td>Energy exporters with food-import constraints<\/td>\n        <td>Algeria, Iraq and similar mixed-buffer exporters<\/td>\n        <td>+0.5 to +1.5 ppt<\/td>\n        <td>+1.5 to +3.0 ppt<\/td>\n        <td>+3.0 to +5.5 ppt<\/td>\n      <\/tr>\n      <tr>\n        <td>Conflict- and logistics-exposed economies<\/td>\n        <td>Red Sea\/Gulf gateway economies<\/td>\n        <td>+0.8 to +2.0 ppt<\/td>\n        <td>+2.0 to +4.0 ppt<\/td>\n        <td>+4.0 to +7.0 ppt<\/td>\n      <\/tr>\n    <\/tbody>\n  <\/table>\n<\/div>\n<p class=\"obex-table-source\">Source: Obex Analytica Scenario Note \u2014 Compounded Impact of El Ni\u00f1o on Commodities, Food, Energy and Metals in MENA, April 2026. Note: Broader MENA ranges are judgmental extrapolations from the four quantified country anchors and should be treated as planning estimates.<\/p>\n\n<p class=\"obex-text\">The food-price peak is not imminent \u2014 it is scheduled for late 2027 under a mid-2026 El Ni\u00f1o emergence, leaving a meaningful window for pre-positioning: forward wheat and edible oil procurement, LNG contract diversification, and the reinforcement of strategic reserve buffers before global benchmark prices reach their apex. The strategic calculus for producers is different: capital expenditure plans that assume a return to pre-conflict materials and logistics costs should be revised immediately across all three scenario tiers. The compound shock has structurally elevated the input cost baseline for the MENA construction, manufacturing, and industrial sectors, and no reasonable near-term diplomatic resolution of the Hormuz crisis reverses the El Ni\u00f1o agricultural pressure expected to peak twelve months hence.<\/p>\n\n<p class=\"obex-text\">All scenarios and outcomes of this analysis \u2014 including the full country-level commodity channel breakdowns, probability-weighted outcome ranges across baseline, adverse, and severe scenarios, and the three-layer monitoring dashboards covering climate-food indicators, war-logistics-energy signals, and domestic pass-through metrics \u2014 are presented in complete, interactive form in the analytical dashboard attached at the end of this page.<\/p>\n\n  <\/article>\n\n<script>\n(function () {\n  function loadChartJs(callback) {\n    if (window.Chart) {\n      callback();\n      return;\n    }\n\n    var existingScript = document.querySelector('script[src*=\"chart.js\"]');\n    if (existingScript) {\n      existingScript.addEventListener('load', callback, { once: true });\n      return;\n    }\n\n    var script = document.createElement('script');\n    script.src = 'https:\/\/cdn.jsdelivr.net\/npm\/chart.js@4.4.7\/dist\/chart.umd.min.js';\n    script.onload = callback;\n    document.head.appendChild(script);\n  }\n\n  loadChartJs(function () {\n    var article = document.getElementById('obex-article-between-the-storm-and-the-strait');\n    if (!article || !window.Chart) return;\n\n    var locale = 'en-US';\n\n    var OBEX_COLORS = {\n      primary: '#0F1C5C',\n      accent: '#E60000',\n      white: '#FFFFFF',\n      primary72: 'rgba(15, 28, 92, 0.72)',\n      accent72: 'rgba(230, 0, 0, 0.72)',\n      primary45: 'rgba(15, 28, 92, 0.45)',\n      accent45: 'rgba(230, 0, 0, 0.45)',\n      primary25: 'rgba(15, 28, 92, 0.25)',\n      accent25: 'rgba(230, 0, 0, 0.25)',\n      grid: 'rgba(15, 28, 92, 0.14)',\n      muted: 'rgba(15, 28, 92, 0.68)'\n    };\n\n    Chart.defaults.font.family = \"'IBM Plex Sans', 'IBM Plex Sans Arabic', Arial, sans-serif\";\n    Chart.defaults.color = OBEX_COLORS.primary;\n\n    function getCanvas(canvasId) {\n      var canvas = document.getElementById(canvasId);\n      if (!canvas || canvas.dataset.obexRendered) return null;\n      canvas.dataset.obexRendered = 'true';\n      return canvas;\n    }\n\n    function formatNumber(value, maximumFractionDigits) {\n      return new Intl.NumberFormat(locale, {\n        maximumFractionDigits: typeof maximumFractionDigits === 'number' ? maximumFractionDigits : 1\n      }).format(value);\n    }\n\n    function formatValue(value, unit, maximumFractionDigits) {\n      var number = formatNumber(value, maximumFractionDigits);\n\n      if (!unit || unit === 'index') return number;\n      if (unit === '%') return number + '%';\n      if (unit === 'ppt') return number + ' ppt';\n      return number + ' ' + unit;\n    }\n\n    function formatRange(value, unit, maximumFractionDigits, addSpace) {\n      var lo = formatNumber(value[0], maximumFractionDigits);\n      var hi = formatNumber(value[1], maximumFractionDigits);\n      var spacer = addSpace ? ' ' : '';\n      return lo + '\u2013' + hi + spacer + unit;\n    }\n\n    function wrapLabel(label, maxLength) {\n      var words = label.split(' ');\n      var lines = [];\n      var currentLine = '';\n\n      words.forEach(function (word) {\n        var testLine = currentLine ? currentLine + ' ' + word : word;\n        if (testLine.length > maxLength) {\n          if (currentLine) lines.push(currentLine);\n          currentLine = word;\n        } else {\n          currentLine = testLine;\n        }\n      });\n\n      if (currentLine) lines.push(currentLine);\n      return lines;\n    }\n\n    function legendOptions(usePointStyle) {\n      return {\n        position: 'bottom',\n        labels: {\n          color: OBEX_COLORS.primary,\n          usePointStyle: !!usePointStyle,\n          pointStyle: usePointStyle ? 'circle' : undefined,\n          font: {\n            weight: 600,\n            size: window.innerWidth < 768 ? 11 : 13\n          },\n          boxWidth: 14,\n          boxHeight: 14,\n          padding: 16\n        }\n      };\n    }\n\n    function baseTooltip(callbacks) {\n      return {\n        enabled: true,\n        backgroundColor: OBEX_COLORS.primary,\n        titleColor: OBEX_COLORS.white,\n        bodyColor: OBEX_COLORS.white,\n        borderColor: OBEX_COLORS.accent,\n        borderWidth: 1,\n        padding: 12,\n        titleFont: { weight: '700' },\n        bodyFont: { weight: '500' },\n        callbacks: callbacks\n      };\n    }\n\n    var benchmarkCanvas = getCanvas('obexBenchmarkIndexChart');\n    if (benchmarkCanvas) {\n      var priceIndexData = {\n        labels: ['2024 avg', '2025 Q1', '2025 Q2', '2025 Q3', '2025 Q4', 'Jan 2026', 'Feb 2026', 'Mar 2026'],\n        unit: 'index',\n        series: [\n          {\n            label: 'Brent crude',\n            data: [117, 110, 98, 100, 92, 97, 103, 150],\n            color: OBEX_COLORS.primary\n          },\n          {\n            label: 'TTF gas',\n            data: [92, 120, 99, 94, 86, 98, 94, 150],\n            color: OBEX_COLORS.accent\n          },\n          {\n            label: 'Wheat HRW',\n            data: [110, 106, 100, 96, 99, 103, 106, 113],\n            color: OBEX_COLORS.primary72\n          },\n          {\n            label: 'Palm oil',\n            data: [96, 106, 94, 101, 99, 100, 103, 110],\n            color: OBEX_COLORS.accent72\n          }\n        ]\n      };\n\n      new Chart(benchmarkCanvas, {\n        type: 'line',\n        data: {\n          labels: priceIndexData.labels,\n          datasets: priceIndexData.series.map(function (series) {\n            return {\n              label: series.label,\n              data: series.data,\n              borderColor: series.color,\n              backgroundColor: series.color,\n              pointBackgroundColor: series.color,\n              pointBorderColor: OBEX_COLORS.white,\n              borderWidth: 3,\n              pointRadius: 4,\n              pointHoverRadius: 6,\n              tension: 0.18,\n              fill: false\n            };\n          })\n        },\n        options: {\n          responsive: true,\n          maintainAspectRatio: false,\n          interaction: {\n            mode: 'index',\n            intersect: false\n          },\n          plugins: {\n            legend: legendOptions(true),\n            tooltip: baseTooltip({\n              label: function (context) {\n                return context.dataset.label + ': ' + formatValue(context.parsed.y, priceIndexData.unit, 1);\n              }\n            })\n          },\n          scales: {\n            x: {\n              grid: {\n                color: OBEX_COLORS.grid\n              },\n              ticks: {\n                color: OBEX_COLORS.primary,\n                maxRotation: 0,\n                autoSkip: true\n              }\n            },\n            y: {\n              min: 80,\n              suggestedMax: 160,\n              grid: {\n                color: OBEX_COLORS.grid\n              },\n              ticks: {\n                color: OBEX_COLORS.primary\n              },\n              title: {\n                display: true,\n                text: 'Index, 2025 average = 100',\n                color: OBEX_COLORS.primary,\n                font: {\n                  weight: 700\n                }\n              }\n            }\n          }\n        }\n      });\n    }\n\n    var foodCanvas = getCanvas('obexFoodTransmissionChart');\n    if (foodCanvas) {\n      var transmissionData = {\n        labels: ['0', '4', '8', '12', '16', '20', '24'],\n        months: [0, 4, 8, 12, 16, 20, 24],\n        unit: '%',\n        values: [0, 1, 3, 6, 9, 7, 4]\n      };\n\n      var pointColors = transmissionData.months.map(function (month) {\n        return month === 16 ? OBEX_COLORS.accent : OBEX_COLORS.primary;\n      });\n\n      new Chart(foodCanvas, {\n        type: 'line',\n        data: {\n          labels: transmissionData.labels,\n          datasets: [\n            {\n              label: 'Food-price impact above baseline',\n              data: transmissionData.values,\n              borderColor: OBEX_COLORS.primary,\n              backgroundColor: OBEX_COLORS.primary,\n              pointBackgroundColor: pointColors,\n              pointBorderColor: OBEX_COLORS.white,\n              borderWidth: 3,\n              pointRadius: 5,\n              pointHoverRadius: 7,\n              tension: 0.18,\n              fill: false\n            }\n          ]\n        },\n        options: {\n          responsive: true,\n          maintainAspectRatio: false,\n          interaction: {\n            mode: 'nearest',\n            intersect: false\n          },\n          plugins: {\n            legend: legendOptions(true),\n            tooltip: baseTooltip({\n              title: function (items) {\n                return 'Month ' + transmissionData.months[items[0].dataIndex] + ' after onset';\n              },\n              label: function (context) {\n                return context.dataset.label + ': ' + formatValue(context.parsed.y, transmissionData.unit, 1);\n              }\n            })\n          },\n          scales: {\n            x: {\n              grid: {\n                color: OBEX_COLORS.grid\n              },\n              ticks: {\n                color: OBEX_COLORS.primary\n              },\n              title: {\n                display: true,\n                text: 'Months after El Ni\u00f1o onset',\n                color: OBEX_COLORS.primary,\n                font: {\n                  weight: 700\n                }\n              }\n            },\n            y: {\n              min: 0,\n              max: 10,\n              grid: {\n                color: OBEX_COLORS.grid\n              },\n              ticks: {\n                color: OBEX_COLORS.primary,\n                callback: function (value) {\n                  return value + '%';\n                }\n              },\n              title: {\n                display: true,\n                text: '% above baseline',\n                color: OBEX_COLORS.primary,\n                font: {\n                  weight: 700\n                }\n              }\n            }\n          }\n        }\n      });\n    }\n\n    var channelCanvas = getCanvas('obexChannelUpliftChart');\n    if (channelCanvas) {\n      var channelData = {\n        labels: [\n          'Food staples &#038; oils',\n          'Fertilizer &#038; farm inputs',\n          'Energy imports &#038; power',\n          'Metals &#038; construction inputs',\n          'Freight, insurance &#038; logistics'\n        ],\n        unit: '%',\n        baseline: [[4, 9], [10, 25], [10, 25], [5, 12], [5, 15]],\n        adverse: [[10, 18], [25, 50], [30, 60], [12, 25], [15, 35]],\n        severe: [[20, 35], [50, 80], [70, 120], [25, 45], [35, 70]]\n      };\n\n      new Chart(channelCanvas, {\n        type: 'bar',\n        data: {\n          labels: channelData.labels.map(function (label) {\n            return wrapLabel(label, 24);\n          }),\n          datasets: [\n            {\n              label: 'Baseline',\n              data: channelData.baseline,\n              backgroundColor: OBEX_COLORS.primary45,\n              borderColor: OBEX_COLORS.primary,\n              borderWidth: 1,\n              borderRadius: 0,\n              borderSkipped: false,\n              maxBarThickness: 24\n            },\n            {\n              label: 'Adverse',\n              data: channelData.adverse,\n              backgroundColor: OBEX_COLORS.primary,\n              borderColor: OBEX_COLORS.primary,\n              borderWidth: 1,\n              borderRadius: 0,\n              borderSkipped: false,\n              maxBarThickness: 24\n            },\n            {\n              label: 'Severe',\n              data: channelData.severe,\n              backgroundColor: OBEX_COLORS.accent,\n              borderColor: OBEX_COLORS.accent,\n              borderWidth: 1,\n              borderRadius: 0,\n              borderSkipped: false,\n              maxBarThickness: 24\n            }\n          ]\n        },\n        options: {\n          indexAxis: 'y',\n          responsive: true,\n          maintainAspectRatio: false,\n          plugins: {\n            legend: legendOptions(false),\n            tooltip: baseTooltip({\n              title: function (items) {\n                return channelData.labels[items[0].dataIndex];\n              },\n              label: function (context) {\n                return context.dataset.label + ': ' + formatRange(context.raw, channelData.unit, 1, false);\n              }\n            })\n          },\n          scales: {\n            x: {\n              min: 0,\n              max: 125,\n              grid: {\n                color: OBEX_COLORS.grid\n              },\n              ticks: {\n                color: OBEX_COLORS.primary,\n                callback: function (value) {\n                  return value + '%';\n                }\n              },\n              title: {\n                display: true,\n                text: 'Estimated uplift range',\n                color: OBEX_COLORS.primary,\n                font: {\n                  weight: 700\n                }\n              }\n            },\n            y: {\n              grid: {\n                display: false\n              },\n              ticks: {\n                color: OBEX_COLORS.primary\n              }\n            }\n          }\n        }\n      });\n    }\n\n    var cpiCanvas = getCanvas('obexCpiImpulseChart');\n    if (cpiCanvas) {\n      var cpiData = {\n        labels: ['Egypt', 'Jordan', 'UAE', 'Saudi Arabia'],\n        unit: 'ppt',\n        baseline: [[1.5, 2.5], [0.8, 1.4], [0.3, 0.8], [0.2, 0.7]],\n        adverse: [[3.0, 5.0], [1.8, 3.0], [1.0, 1.8], [0.8, 1.6]],\n        severe: [[6.0, 9.0], [3.5, 5.5], [2.0, 3.2], [1.8, 3.0]]\n      };\n\n      new Chart(cpiCanvas, {\n        type: 'bar',\n        data: {\n          labels: cpiData.labels,\n          datasets: [\n            {\n              label: 'Baseline',\n              data: cpiData.baseline,\n              backgroundColor: OBEX_COLORS.primary45,\n              borderColor: OBEX_COLORS.primary,\n              borderWidth: 1,\n              borderRadius: 0,\n              borderSkipped: false,\n              maxBarThickness: 26\n            },\n            {\n              label: 'Adverse',\n              data: cpiData.adverse,\n              backgroundColor: OBEX_COLORS.primary,\n              borderColor: OBEX_COLORS.primary,\n              borderWidth: 1,\n              borderRadius: 0,\n              borderSkipped: false,\n              maxBarThickness: 26\n            },\n            {\n              label: 'Severe',\n              data: cpiData.severe,\n              backgroundColor: OBEX_COLORS.accent,\n              borderColor: OBEX_COLORS.accent,\n              borderWidth: 1,\n              borderRadius: 0,\n              borderSkipped: false,\n              maxBarThickness: 26\n            }\n          ]\n        },\n        options: {\n          indexAxis: 'y',\n          responsive: true,\n          maintainAspectRatio: false,\n          plugins: {\n            legend: legendOptions(false),\n            tooltip: baseTooltip({\n              label: function (context) {\n                return context.dataset.label + ': ' + formatRange(context.raw, cpiData.unit, 1, true);\n              }\n            })\n          },\n          scales: {\n            x: {\n              min: 0,\n              max: 10,\n              grid: {\n                color: OBEX_COLORS.grid\n              },\n              ticks: {\n                color: OBEX_COLORS.primary,\n                callback: function (value) {\n                  return value + ' ppt';\n                }\n              },\n              title: {\n                display: true,\n                text: 'Percentage points added to CPI',\n                color: OBEX_COLORS.primary,\n                font: {\n                  weight: 700\n                }\n              }\n            },\n            y: {\n              grid: {\n                display: false\n              },\n              ticks: {\n                color: OBEX_COLORS.primary\n              }\n            }\n          }\n        }\n      });\n    }\n\n    var producerCanvas = getCanvas('obexProducerCostChart');\n    if (producerCanvas) {\n      var producerData = {\n        labels: ['Egypt', 'Jordan', 'UAE', 'Saudi Arabia'],\n        unit: '%',\n        baseline: [[4, 7], [2, 4], [1, 3], [0.8, 2.0]],\n        adverse: [[8, 15], [5, 8], [3, 6], [2, 4]],\n        severe: [[15, 25], [9, 15], [6, 10], [4, 7]]\n      };\n\n      new Chart(producerCanvas, {\n        type: 'bar',\n        data: {\n          labels: producerData.labels,\n          datasets: [\n            {\n              label: 'Baseline',\n              data: producerData.baseline,\n              backgroundColor: OBEX_COLORS.primary45,\n              borderColor: OBEX_COLORS.primary,\n              borderWidth: 1,\n              borderRadius: 0,\n              borderSkipped: false,\n              maxBarThickness: 26\n            },\n            {\n              label: 'Adverse',\n              data: producerData.adverse,\n              backgroundColor: OBEX_COLORS.primary,\n              borderColor: OBEX_COLORS.primary,\n              borderWidth: 1,\n              borderRadius: 0,\n              borderSkipped: false,\n              maxBarThickness: 26\n            },\n            {\n              label: 'Severe',\n              data: producerData.severe,\n              backgroundColor: OBEX_COLORS.accent,\n              borderColor: OBEX_COLORS.accent,\n              borderWidth: 1,\n              borderRadius: 0,\n              borderSkipped: false,\n              maxBarThickness: 26\n            }\n          ]\n        },\n        options: {\n          indexAxis: 'y',\n          responsive: true,\n          maintainAspectRatio: false,\n          plugins: {\n            legend: legendOptions(false),\n            tooltip: baseTooltip({\n              label: function (context) {\n                return context.dataset.label + ': ' + formatRange(context.raw, producerData.unit, 1, false);\n              }\n            })\n          },\n          scales: {\n            x: {\n              min: 0,\n              max: 26,\n              grid: {\n                color: OBEX_COLORS.grid\n              },\n              ticks: {\n                color: OBEX_COLORS.primary,\n                callback: function (value) {\n                  return value + '%';\n                }\n              },\n              title: {\n                display: true,\n                text: 'Estimated producer-cost uplift',\n                color: OBEX_COLORS.primary,\n                font: {\n                  weight: 700\n                }\n              }\n            },\n            y: {\n              grid: {\n                display: false\n              },\n              ticks: {\n                color: OBEX_COLORS.primary\n              }\n            }\n          }\n        }\n      });\n    }\n  });\n})();\n<\/script>\n<\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \/>\n  <title>OBEX Analytica | Connected MENA El Ni\u00f1o Dashboard<\/title>\n  <meta name=\"description\" content=\"Connected OBEX Analytica dashboard for MENA El Ni\u00f1o compounded impact analysis.\" \/>\n  <style>\n    html, body {\n      margin: 0;\n      min-height: 100%;\n      background: #F4F6FB;\n      padding: 12px;\n      font-family: \"OBEX Plex\", \"IBM Plex Sans\", \"IBM Plex Sans Arabic\", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Tahoma, Arial, sans-serif;\n    }\n  <\/style>\n<\/head>\n<body>\n  <obex-mena-linked-dashboard><\/obex-mena-linked-dashboard>\n  \n<script>\n(() => {\n  const tagName = \"obex-mena-linked-dashboard\";\n  if (customElements.get(tagName)) return;\n\n  const template = document.createElement(\"template\");\n  template.innerHTML = `\n    <style>\n      @font-face {\n        font-family: \"OBEX Plex\";\n        src:\n          local(\"IBM Plex Sans\"),\n          url(\".\/obex-fonts\/IBMPlexSans-VariableFont_wdth,wght.woff2\") format(\"woff2\"),\n          url(\".\/IBMPlexSans-VariableFont_wdth,wght.woff2\") format(\"woff2\");\n        font-weight: 100 700;\n        font-style: normal;\n        font-display: swap;\n        unicode-range: U+0000-00FF, U+0100-024F, U+1E00-1EFF, U+2000-206F, U+20A0-20CF, U+2100-214F, U+2190-21FF, U+2200-22FF, U+25A0-25FF, U+FB00-FB06;\n      }\n\n      @font-face {\n        font-family: \"OBEX Plex\";\n        src:\n          local(\"IBM Plex Sans Italic\"),\n          url(\".\/obex-fonts\/IBMPlexSans-Italic-VariableFont_wdth,wght.woff2\") format(\"woff2\"),\n          url(\".\/IBMPlexSans-Italic-VariableFont_wdth,wght.woff2\") format(\"woff2\");\n        font-weight: 100 700;\n        font-style: italic;\n        font-display: swap;\n        unicode-range: U+0000-00FF, U+0100-024F, U+1E00-1EFF, U+2000-206F, U+20A0-20CF, U+2100-214F, U+2190-21FF, U+2200-22FF, U+25A0-25FF, U+FB00-FB06;\n      }\n\n      @font-face {\n        font-family: \"OBEX Plex\";\n        src: local(\"IBM Plex Sans Arabic Thin\"), url(\".\/obex-fonts\/IBMPlexSansArabic-Thin.woff2\") format(\"woff2\"), url(\".\/IBMPlexSansArabic-Thin.woff2\") format(\"woff2\");\n        font-weight: 100;\n        font-style: normal;\n        font-display: swap;\n        unicode-range: U+0600-06FF, U+0750-077F, U+0870-089F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF;\n      }\n\n      @font-face {\n        font-family: \"OBEX Plex\";\n        src: local(\"IBM Plex Sans Arabic ExtraLight\"), url(\".\/obex-fonts\/IBMPlexSansArabic-ExtraLight.woff2\") format(\"woff2\"), url(\".\/IBMPlexSansArabic-ExtraLight.woff2\") format(\"woff2\");\n        font-weight: 200;\n        font-style: normal;\n        font-display: swap;\n        unicode-range: U+0600-06FF, U+0750-077F, U+0870-089F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF;\n      }\n\n      @font-face {\n        font-family: \"OBEX Plex\";\n        src: local(\"IBM Plex Sans Arabic Light\"), url(\".\/obex-fonts\/IBMPlexSansArabic-Light.woff2\") format(\"woff2\"), url(\".\/IBMPlexSansArabic-Light.woff2\") format(\"woff2\");\n        font-weight: 300;\n        font-style: normal;\n        font-display: swap;\n        unicode-range: U+0600-06FF, U+0750-077F, U+0870-089F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF;\n      }\n\n      @font-face {\n        font-family: \"OBEX Plex\";\n        src: local(\"IBM Plex Sans Arabic\"), url(\".\/obex-fonts\/IBMPlexSansArabic-Regular.woff2\") format(\"woff2\"), url(\".\/IBMPlexSansArabic-Regular.woff2\") format(\"woff2\");\n        font-weight: 400;\n        font-style: normal;\n        font-display: swap;\n        unicode-range: U+0600-06FF, U+0750-077F, U+0870-089F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF;\n      }\n\n      @font-face {\n        font-family: \"OBEX Plex\";\n        src: local(\"IBM Plex Sans Arabic Medium\"), url(\".\/obex-fonts\/IBMPlexSansArabic-Medium.woff2\") format(\"woff2\"), url(\".\/IBMPlexSansArabic-Medium.woff2\") format(\"woff2\");\n        font-weight: 500;\n        font-style: normal;\n        font-display: swap;\n        unicode-range: U+0600-06FF, U+0750-077F, U+0870-089F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF;\n      }\n\n      @font-face {\n        font-family: \"OBEX Plex\";\n        src: local(\"IBM Plex Sans Arabic SemiBold\"), url(\".\/obex-fonts\/IBMPlexSansArabic-SemiBold.woff2\") format(\"woff2\"), url(\".\/IBMPlexSansArabic-SemiBold.woff2\") format(\"woff2\");\n        font-weight: 600;\n        font-style: normal;\n        font-display: swap;\n        unicode-range: U+0600-06FF, U+0750-077F, U+0870-089F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF;\n      }\n\n      @font-face {\n        font-family: \"OBEX Plex\";\n        src: local(\"IBM Plex Sans Arabic Bold\"), url(\".\/obex-fonts\/IBMPlexSansArabic-Bold.woff2\") format(\"woff2\"), url(\".\/IBMPlexSansArabic-Bold.woff2\") format(\"woff2\");\n        font-weight: 700 1000;\n        font-style: normal;\n        font-display: swap;\n        unicode-range: U+0600-06FF, U+0750-077F, U+0870-089F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF;\n      }\n\n      :host {\n        --obex-font-family: \"OBEX Plex\", \"IBM Plex Sans\", \"IBM Plex Sans Arabic\", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Tahoma, Arial, sans-serif;\n        --obex-navy: #0F1C5C;\n        --obex-red: #E60000;\n        --obex-white: #FFFFFF;\n        --obex-soft: #F4F6FB;\n        --obex-soft-2: #EEF1F8;\n        --obex-ink: #141B40;\n        --obex-muted: #58607F;\n        --obex-line: rgba(15, 28, 92, 0.16);\n        --obex-line-strong: rgba(15, 28, 92, 0.24);\n        --obex-red-soft: rgba(230, 0, 0, 0.08);\n        --obex-navy-soft: rgba(15, 28, 92, 0.06);\n        --obex-shadow: 0 14px 34px rgba(15, 28, 92, 0.09);\n        --radius-xl: 28px;\n        --radius-lg: 22px;\n        --radius-md: 16px;\n        --radius-sm: 12px;\n        --radius-pill: 999px;\n\n        display: block;\n        width: 100%;\n        color: var(--obex-ink);\n        font-family: var(--obex-font-family);\n        line-height: 1.28;\n        container-type: inline-size;\n      }\n\n      *, *::before, *::after {\n        box-sizing: border-box;\n        min-width: 0;\n      }\n\n      button, select {\n        font: inherit;\n      }\n\n      h1, h2, h3, p {\n        margin: 0;\n        overflow-wrap: anywhere;\n      }\n\n      .shell {\n        width: 100%;\n        max-width: min(1100px, 100%);\n        margin: 0 auto;\n        padding: clamp(12px, 2cqi, 18px);\n        border: 2px solid var(--obex-navy);\n        border-radius: var(--radius-xl);\n        background:\n          radial-gradient(circle at 88% 8%, rgba(230,0,0,0.10), transparent 25%),\n          radial-gradient(circle at 100% 100%, rgba(15,28,92,0.05), transparent 22%),\n          linear-gradient(180deg, var(--obex-white), #F8FAFF 58%, #F3F6FD 100%);\n        box-shadow: var(--obex-shadow);\n      }\n\n      .command {\n        display: grid;\n        gap: 12px;\n      }\n\n      .brand {\n        display: grid;\n        gap: 10px;\n      }\n\n      .eyebrow {\n        display: inline-flex;\n        align-items: center;\n        gap: 10px;\n        width: fit-content;\n        padding: 10px 14px;\n        border: 2px solid var(--obex-navy);\n        border-radius: var(--radius-pill);\n        font-size: 0.78rem;\n        line-height: 1;\n        font-weight: 700;\n        letter-spacing: 0.20em;\n        color: var(--obex-navy);\n        background: rgba(255,255,255,0.84);\n        text-transform: uppercase;\n      }\n\n      .eyebrow::before {\n        content: \"\";\n        width: 8px;\n        height: 8px;\n        border-radius: 50%;\n        background: var(--obex-red);\n      }\n\n      .headline-row {\n        display: flex;\n        align-items: flex-start;\n        justify-content: space-between;\n        gap: 12px;\n      }\n\n      h1 {\n        font-size: clamp(2rem, 4.5cqi, 3.1rem);\n        line-height: 0.92;\n        letter-spacing: -0.055em;\n        font-weight: 780;\n        color: var(--obex-navy);\n        max-width: 10.5ch;\n      }\n\n      .state-badge {\n        flex: 0 0 auto;\n        min-width: 150px;\n        padding: 14px 14px 12px;\n        border-radius: 18px;\n        background: var(--obex-navy);\n        color: var(--obex-white);\n        display: grid;\n        gap: 4px;\n      }\n\n      .state-badge-label {\n        font-size: 0.68rem;\n        letter-spacing: 0.2em;\n        text-transform: uppercase;\n        opacity: 0.86;\n        font-weight: 700;\n      }\n\n      .state-badge strong {\n        font-size: 1.35rem;\n        line-height: 0.98;\n        letter-spacing: -0.04em;\n        font-weight: 760;\n      }\n\n      .state-badge span {\n        font-size: 0.84rem;\n        line-height: 1.25;\n        color: rgba(255,255,255,0.78);\n      }\n\n      .summary {\n        max-width: 78ch;\n        font-size: 0.98rem;\n        line-height: 1.46;\n        color: var(--obex-ink);\n        font-weight: 560;\n      }\n\n      .controls {\n        display: grid;\n        grid-template-columns: repeat(3, minmax(0, 1fr));\n        gap: 12px;\n      }\n\n      .control-block {\n        padding: 12px;\n        border: 1.5px solid var(--obex-line-strong);\n        border-radius: var(--radius-lg);\n        background: rgba(255,255,255,0.82);\n      }\n\n      .control-label {\n        display: block;\n        margin-bottom: 10px;\n        font-size: 0.72rem;\n        letter-spacing: 0.18em;\n        text-transform: uppercase;\n        font-weight: 760;\n        color: var(--obex-red);\n      }\n\n      .button-row {\n        display: flex;\n        flex-wrap: wrap;\n        gap: 8px;\n      }\n\n      .chip {\n        appearance: none;\n        border: 1.8px solid var(--obex-navy);\n        background: var(--obex-white);\n        color: var(--obex-navy);\n        border-radius: var(--radius-pill);\n        padding: 8px 11px;\n        font-size: 0.83rem;\n        line-height: 1;\n        font-weight: 700;\n        cursor: pointer;\n        transition: transform 160ms ease, background 160ms ease, color 160ms ease, border-color 160ms ease, box-shadow 160ms ease;\n      }\n\n      .chip:hover {\n        transform: translateY(-1px);\n      }\n\n      .chip.is-active {\n        background: var(--obex-navy);\n        border-color: var(--obex-navy);\n        color: var(--obex-white);\n        box-shadow: 0 8px 20px rgba(15, 28, 92, 0.18);\n      }\n\n      .chip.is-focus {\n        border-color: var(--obex-red);\n      }\n\n      .chip.is-focus.is-active {\n        background: var(--obex-red);\n        border-color: var(--obex-red);\n      }\n\n      .score-strip {\n        display: grid;\n        grid-template-columns: repeat(4, minmax(0, 1fr));\n        gap: 12px;\n        margin-top: 12px;\n      }\n\n      .kpi {\n        min-height: 118px;\n        padding: 14px;\n        border: 1.5px solid var(--obex-line-strong);\n        border-radius: var(--radius-lg);\n        background: rgba(255,255,255,0.92);\n        display: grid;\n        gap: 8px;\n        align-content: start;\n      }\n\n      .kpi-label {\n        font-size: 0.72rem;\n        letter-spacing: 0.18em;\n        text-transform: uppercase;\n        font-weight: 760;\n        color: var(--obex-red);\n      }\n\n      .kpi-value {\n        font-size: clamp(1.35rem, 3cqi, 2rem);\n        line-height: 0.98;\n        letter-spacing: -0.05em;\n        font-weight: 780;\n        color: var(--obex-navy);\n      }\n\n      .kpi-copy {\n        font-size: 0.87rem;\n        line-height: 1.35;\n        font-weight: 560;\n        color: var(--obex-muted);\n      }\n\n      .grid {\n        display: grid;\n        grid-template-columns: minmax(0, 1.25fr) minmax(0, 0.95fr);\n        grid-template-areas:\n          \"network country\"\n          \"market playbook\"\n          \"monitor monitor\";\n        gap: 12px;\n        margin-top: 12px;\n      }\n\n      .card {\n        padding: 14px;\n        border: 1.5px solid var(--obex-line-strong);\n        border-radius: var(--radius-lg);\n        background: rgba(255,255,255,0.92);\n      }\n\n      .network-card { grid-area: network; }\n      .country-card { grid-area: country; }\n      .market-card { grid-area: market; }\n      .playbook-card { grid-area: playbook; }\n      .monitor-card { grid-area: monitor; }\n\n      .card-head {\n        display: flex;\n        align-items: flex-start;\n        justify-content: space-between;\n        gap: 12px;\n        margin-bottom: 12px;\n      }\n\n      .card-head h2 {\n        font-size: 1.42rem;\n        line-height: 0.98;\n        letter-spacing: -0.04em;\n        font-weight: 760;\n        color: var(--obex-navy);\n      }\n\n      .card-head p {\n        max-width: 24ch;\n        font-size: 0.85rem;\n        line-height: 1.35;\n        color: var(--obex-muted);\n        font-weight: 560;\n        text-align: right;\n      }\n\n      .network-layout {\n        display: grid;\n        grid-template-columns: minmax(0, 1.18fr) minmax(240px, 0.82fr);\n        gap: 12px;\n        align-items: stretch;\n      }\n\n      .network-box {\n        border-radius: 18px;\n        background: linear-gradient(180deg, #FBFCFF 0%, #F6F8FD 100%);\n        border: 1px solid rgba(15,28,92,0.10);\n        padding: 10px;\n      }\n\n      svg.network {\n        display: block;\n        width: 100%;\n        height: auto;\n      }\n\n      .link {\n        fill: none;\n        stroke: rgba(15, 28, 92, 0.18);\n        stroke-width: 4;\n        stroke-linecap: round;\n        transition: stroke 180ms ease, stroke-width 180ms ease, opacity 180ms ease;\n      }\n\n      .link.hot {\n        stroke: rgba(230, 0, 0, 0.85);\n      }\n\n      .node .ring {\n        fill: var(--obex-white);\n        stroke: rgba(15, 28, 92, 0.26);\n        stroke-width: 2;\n        transition: stroke 180ms ease, fill 180ms ease;\n      }\n\n      .node .core {\n        fill: rgba(15, 28, 92, 0.06);\n        transition: fill 180ms ease;\n      }\n\n      .node .node-label {\n        fill: var(--obex-navy);\n        font-size: 14px;\n        font-weight: 700;\n        letter-spacing: -0.01em;\n      }\n\n      .node .node-sub {\n        fill: var(--obex-muted);\n        font-size: 10px;\n        font-weight: 600;\n        letter-spacing: 0.08em;\n        text-transform: uppercase;\n      }\n\n      .node.is-focus .ring {\n        stroke: var(--obex-red);\n        stroke-width: 3;\n      }\n\n      .node-button {\n        cursor: pointer;\n      }\n\n      .focus-panel {\n        display: grid;\n        gap: 10px;\n        align-content: start;\n      }\n\n      .focus-card {\n        padding: 12px;\n        border-radius: 18px;\n        background: var(--obex-navy);\n        color: var(--obex-white);\n      }\n\n      .focus-card .mini {\n        font-size: 0.68rem;\n        line-height: 1;\n        letter-spacing: 0.16em;\n        text-transform: uppercase;\n        font-weight: 720;\n        opacity: 0.82;\n      }\n\n      .focus-card h3 {\n        margin-top: 8px;\n        font-size: 1.5rem;\n        line-height: 0.94;\n        letter-spacing: -0.04em;\n        font-weight: 760;\n      }\n\n      .focus-card p {\n        margin-top: 8px;\n        font-size: 0.9rem;\n        line-height: 1.42;\n        color: rgba(255,255,255,0.86);\n      }\n\n      .mini-grid {\n        display: grid;\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        gap: 8px;\n      }\n\n      .mini-tile {\n        padding: 10px;\n        border-radius: 14px;\n        border: 1px solid var(--obex-line);\n        background: var(--obex-white);\n      }\n\n      .mini-tile .mini-label {\n        font-size: 0.68rem;\n        letter-spacing: 0.12em;\n        text-transform: uppercase;\n        font-weight: 720;\n        color: var(--obex-red);\n      }\n\n      .mini-tile strong {\n        display: block;\n        margin-top: 6px;\n        font-size: 1rem;\n        line-height: 1.1;\n        color: var(--obex-navy);\n      }\n\n      .mini-tile span {\n        display: block;\n        margin-top: 4px;\n        font-size: 0.8rem;\n        line-height: 1.35;\n        color: var(--obex-muted);\n      }\n\n      .country-list {\n        display: grid;\n        gap: 10px;\n      }\n\n      .country-row {\n        position: relative;\n        padding: 12px;\n        border-radius: 16px;\n        border: 1px solid rgba(15,28,92,0.12);\n        background: linear-gradient(180deg, #FEFEFF 0%, #F7F9FE 100%);\n      }\n\n      .country-row.is-active {\n        border-color: rgba(230,0,0,0.4);\n        box-shadow: inset 0 0 0 1px rgba(230,0,0,0.12);\n      }\n\n      .country-select {\n        appearance: none;\n        position: absolute;\n        inset: 0;\n        opacity: 0;\n        cursor: pointer;\n      }\n\n      .country-top {\n        display: flex;\n        align-items: baseline;\n        justify-content: space-between;\n        gap: 8px;\n      }\n\n      .country-top strong {\n        font-size: 1rem;\n        line-height: 1;\n        color: var(--obex-navy);\n        font-weight: 740;\n      }\n\n      .country-top span {\n        font-size: 0.76rem;\n        line-height: 1.2;\n        color: var(--obex-muted);\n        font-weight: 620;\n      }\n\n      .metric-row {\n        display: grid;\n        grid-template-columns: 52px 1fr auto;\n        gap: 8px;\n        align-items: center;\n        margin-top: 8px;\n      }\n\n      .metric-row label {\n        font-size: 0.7rem;\n        letter-spacing: 0.12em;\n        text-transform: uppercase;\n        font-weight: 720;\n        color: var(--obex-red);\n      }\n\n      .bar {\n        height: 10px;\n        border-radius: var(--radius-pill);\n        background: rgba(15,28,92,0.08);\n        overflow: hidden;\n      }\n\n      .bar > span {\n        display: block;\n        height: 100%;\n        width: 0%;\n        background: linear-gradient(90deg, var(--obex-navy), var(--obex-red));\n        transition: width 180ms ease;\n      }\n\n      .metric-row output {\n        font-size: 0.82rem;\n        color: var(--obex-ink);\n        font-weight: 650;\n      }\n\n      .country-footer {\n        display: grid;\n        gap: 8px;\n        margin-top: 10px;\n        padding-top: 10px;\n        border-top: 1px dashed rgba(15,28,92,0.16);\n      }\n\n      .tag-row {\n        display: flex;\n        flex-wrap: wrap;\n        gap: 8px;\n      }\n\n      .tag {\n        display: inline-flex;\n        align-items: center;\n        padding: 6px 9px;\n        border-radius: var(--radius-pill);\n        background: var(--obex-navy-soft);\n        color: var(--obex-navy);\n        font-size: 0.74rem;\n        line-height: 1;\n        font-weight: 700;\n      }\n\n      .tag.red {\n        background: var(--obex-red-soft);\n        color: var(--obex-red);\n      }\n\n      .country-note {\n        font-size: 0.86rem;\n        line-height: 1.42;\n        color: var(--obex-muted);\n      }\n\n      .market-table, .monitor-grid, .playbook-grid {\n        display: grid;\n        gap: 10px;\n      }\n\n      .market-row {\n        display: grid;\n        grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);\n        gap: 10px;\n        padding: 10px 12px;\n        border-radius: 14px;\n        border: 1px solid rgba(15,28,92,0.10);\n        background: linear-gradient(180deg, #FEFEFF 0%, #F8FAFF 100%);\n      }\n\n      .market-row strong {\n        font-size: 0.92rem;\n        line-height: 1.2;\n        color: var(--obex-navy);\n        font-weight: 720;\n      }\n\n      .market-row span {\n        display: block;\n        margin-top: 4px;\n        font-size: 0.78rem;\n        line-height: 1.35;\n        color: var(--obex-muted);\n      }\n\n      .range-pill {\n        justify-self: end;\n        align-self: center;\n        padding: 8px 10px;\n        border-radius: var(--radius-pill);\n        background: var(--obex-navy);\n        color: var(--obex-white);\n        font-size: 0.82rem;\n        line-height: 1;\n        font-weight: 720;\n        white-space: nowrap;\n      }\n\n      .playbook-grid {\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n      }\n\n      .action-card {\n        padding: 12px;\n        border-radius: 16px;\n        background: linear-gradient(180deg, #FDFEFF 0%, #F5F8FF 100%);\n        border: 1px solid rgba(15,28,92,0.10);\n      }\n\n      .action-card .step {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        width: 24px;\n        height: 24px;\n        border-radius: 50%;\n        background: var(--obex-red);\n        color: var(--obex-white);\n        font-size: 0.72rem;\n        line-height: 1;\n        font-weight: 760;\n      }\n\n      .action-card h3 {\n        margin-top: 8px;\n        font-size: 1rem;\n        line-height: 1.02;\n        letter-spacing: -0.03em;\n        color: var(--obex-navy);\n        font-weight: 740;\n      }\n\n      .action-card p {\n        margin-top: 6px;\n        font-size: 0.84rem;\n        line-height: 1.42;\n        color: var(--obex-muted);\n      }\n\n      .monitor-grid {\n        grid-template-columns: repeat(3, minmax(0, 1fr));\n      }\n\n      .signal {\n        padding: 12px;\n        border-radius: 16px;\n        border: 1px solid rgba(15,28,92,0.10);\n        background: linear-gradient(180deg, #FEFEFF 0%, #F8FAFF 100%);\n      }\n\n      .signal-top {\n        display: flex;\n        justify-content: space-between;\n        gap: 8px;\n        align-items: baseline;\n      }\n\n      .signal strong {\n        font-size: 0.92rem;\n        line-height: 1.1;\n        color: var(--obex-navy);\n        font-weight: 720;\n      }\n\n      .signal span {\n        font-size: 0.74rem;\n        line-height: 1.1;\n        color: var(--obex-red);\n        font-weight: 720;\n        text-transform: uppercase;\n        letter-spacing: 0.1em;\n      }\n\n      .signal p {\n        margin-top: 6px;\n        font-size: 0.82rem;\n        line-height: 1.38;\n        color: var(--obex-muted);\n      }\n\n      .meter {\n        height: 8px;\n        margin-top: 10px;\n        border-radius: var(--radius-pill);\n        background: rgba(15,28,92,0.08);\n        overflow: hidden;\n      }\n\n      .meter > span {\n        display: block;\n        height: 100%;\n        width: 0%;\n        background: linear-gradient(90deg, var(--obex-navy), var(--obex-red));\n        transition: width 180ms ease;\n      }\n\n      .actions {\n        display: flex;\n        flex-wrap: wrap;\n        gap: 10px;\n        margin-top: 12px;\n      }\n\n      .tool {\n        appearance: none;\n        border: 2px solid var(--obex-navy);\n        background: transparent;\n        color: var(--obex-navy);\n        border-radius: var(--radius-pill);\n        padding: 10px 14px;\n        font-size: 0.82rem;\n        line-height: 1;\n        letter-spacing: 0.1em;\n        text-transform: uppercase;\n        font-weight: 760;\n        cursor: pointer;\n      }\n\n      .tool.primary {\n        background: var(--obex-navy);\n        color: var(--obex-white);\n      }\n\n      .actions-note {\n        align-self: center;\n        font-size: 0.8rem;\n        color: var(--obex-muted);\n        font-weight: 560;\n      }\n\n      @container (max-width: 960px) {\n        .controls,\n        .grid,\n        .network-layout,\n        .monitor-grid,\n        .playbook-grid {\n          grid-template-columns: 1fr;\n        }\n\n        .grid {\n          grid-template-areas:\n            \"network\"\n            \"country\"\n            \"market\"\n            \"playbook\"\n            \"monitor\";\n        }\n\n        .card-head {\n          align-items: start;\n        }\n\n        .card-head p {\n          text-align: left;\n        }\n      }\n\n      @container (max-width: 760px) {\n        .headline-row {\n          flex-direction: column;\n        }\n\n        .state-badge {\n          min-width: auto;\n          width: 100%;\n        }\n\n        .score-strip,\n        .monitor-grid,\n        .playbook-grid {\n          grid-template-columns: repeat(2, minmax(0, 1fr));\n        }\n\n        .market-row {\n          grid-template-columns: 1fr;\n        }\n\n        .range-pill {\n          justify-self: start;\n        }\n      }\n\n      @container (max-width: 560px) {\n        .score-strip,\n        .monitor-grid,\n        .playbook-grid,\n        .mini-grid {\n          grid-template-columns: 1fr;\n        }\n\n        h1 {\n          max-width: 12ch;\n          font-size: 1.8rem;\n        }\n\n        .card-head {\n          flex-direction: column;\n        }\n\n        .metric-row {\n          grid-template-columns: 44px 1fr;\n        }\n\n        .metric-row output {\n          grid-column: 1 \/ -1;\n        }\n      }\n    <\/style>\n\n    <section class=\"shell\" aria-label=\"OBEX Analytica linked MENA impact dashboard\">\n      <header class=\"command\">\n        <div class=\"brand\">\n          <div class=\"eyebrow\">OBEX Analytica linked impact dashboard<\/div>\n          <div class=\"headline-row\">\n            <h1>MENA El Ni\u00f1o compound shock cockpit<\/h1>\n            <div class=\"state-badge\" data-out=\"stateBadge\"><\/div>\n          <\/div>\n          <p class=\"summary\" data-out=\"briefing\"><\/p>\n        <\/div>\n\n        <div class=\"controls\">\n          <section class=\"control-block\" aria-label=\"Scenario controls\">\n            <span class=\"control-label\">Scenario<\/span>\n            <div class=\"button-row\" data-group=\"scenario\"><\/div>\n          <\/section>\n          <section class=\"control-block\" aria-label=\"Country controls\">\n            <span class=\"control-label\">Country anchor<\/span>\n            <div class=\"button-row\" data-group=\"country\"><\/div>\n          <\/section>\n          <section class=\"control-block\" aria-label=\"Channel focus controls\">\n            <span class=\"control-label\">Transmission focus<\/span>\n            <div class=\"button-row\" data-group=\"focus\"><\/div>\n          <\/section>\n        <\/div>\n      <\/header>\n\n      <section class=\"score-strip\">\n        <article class=\"kpi\">\n          <span class=\"kpi-label\">Stress regime<\/span>\n          <strong class=\"kpi-value\" data-out=\"stressScore\"><\/strong>\n          <p class=\"kpi-copy\" data-out=\"stressCopy\"><\/p>\n        <\/article>\n        <article class=\"kpi\">\n          <span class=\"kpi-label\">Selected CPI impulse<\/span>\n          <strong class=\"kpi-value\" data-out=\"countryCpi\"><\/strong>\n          <p class=\"kpi-copy\" data-out=\"countryCpiCopy\"><\/p>\n        <\/article>\n        <article class=\"kpi\">\n          <span class=\"kpi-label\">Selected producer cost<\/span>\n          <strong class=\"kpi-value\" data-out=\"countryProducer\"><\/strong>\n          <p class=\"kpi-copy\" data-out=\"countryProducerCopy\"><\/p>\n        <\/article>\n        <article class=\"kpi\">\n          <span class=\"kpi-label\">Transmission bias<\/span>\n          <strong class=\"kpi-value\" data-out=\"dominantChannel\"><\/strong>\n          <p class=\"kpi-copy\" data-out=\"dominantCopy\"><\/p>\n        <\/article>\n      <\/section>\n\n      <section class=\"grid\">\n        <article class=\"card network-card\">\n          <div class=\"card-head\">\n            <div>\n              <h2>Transmission web<\/h2>\n            <\/div>\n            <p>Every control above reweights this diagram, the country bars, the market ranges, the monitoring stack, and the playbook.<\/p>\n          <\/div>\n          <div class=\"network-layout\">\n            <div class=\"network-box\">\n              <svg class=\"network\" viewBox=\"0 0 760 360\" role=\"img\" aria-label=\"Connected transmission network from climate and logistics into CPI and producer pressure\">\n                <path class=\"link\" data-link=\"climate-food\" d=\"M92 102 C140 102, 150 118, 180 128\"><\/path>\n                <path class=\"link\" data-link=\"climate-fertilizer\" d=\"M92 102 C138 156, 148 198, 180 222\"><\/path>\n                <path class=\"link\" data-link=\"fertilizer-food\" d=\"M236 224 C256 200, 258 166, 236 144\"><\/path>\n                <path class=\"link\" data-link=\"energy-fertilizer\" d=\"M362 96 C318 126, 300 172, 258 224\"><\/path>\n                <path class=\"link\" data-link=\"energy-freight\" d=\"M392 104 C430 132, 442 206, 378 232\"><\/path>\n                <path class=\"link\" data-link=\"freight-food\" d=\"M334 240 C304 184, 298 150, 258 140\"><\/path>\n                <path class=\"link\" data-link=\"freight-metals\" d=\"M416 244 C470 226, 494 196, 522 174\"><\/path>\n                <path class=\"link\" data-link=\"food-cpi\" d=\"M258 138 C382 114, 476 102, 612 104\"><\/path>\n                <path class=\"link\" data-link=\"energy-cpi\" d=\"M418 92 C504 86, 546 92, 612 104\"><\/path>\n                <path class=\"link\" data-link=\"metals-producer\" d=\"M576 174 C620 186, 642 222, 664 248\"><\/path>\n                <path class=\"link\" data-link=\"freight-producer\" d=\"M418 250 C536 260, 592 262, 662 252\"><\/path>\n                <path class=\"link\" data-link=\"filters-cpi\" d=\"M586 296 C614 250, 624 176, 640 126\"><\/path>\n                <path class=\"link\" data-link=\"filters-producer\" d=\"M590 302 C624 292, 642 278, 662 258\"><\/path>\n\n                <g class=\"node node-button\" data-node=\"climate\" tabindex=\"0\" role=\"button\" aria-label=\"Climate signal node\">\n                  <circle class=\"ring\" cx=\"74\" cy=\"100\" r=\"42\"><\/circle>\n                  <circle class=\"core\" cx=\"74\" cy=\"100\" r=\"26\"><\/circle>\n                  <text class=\"node-label\" x=\"44\" y=\"102\">Climate<\/text>\n                  <text class=\"node-sub\" x=\"38\" y=\"123\">ENSO signal<\/text>\n                <\/g>\n\n                <g class=\"node node-button\" data-node=\"food\" tabindex=\"0\" role=\"button\" aria-label=\"Food channel node\">\n                  <circle class=\"ring\" cx=\"220\" cy=\"136\" r=\"50\"><\/circle>\n                  <circle class=\"core\" cx=\"220\" cy=\"136\" r=\"32\"><\/circle>\n                  <text class=\"node-label\" x=\"191\" y=\"133\">Food<\/text>\n                  <text class=\"node-sub\" x=\"179\" y=\"154\">Staples & oils<\/text>\n                <\/g>\n\n                <g class=\"node node-button\" data-node=\"fertilizer\" tabindex=\"0\" role=\"button\" aria-label=\"Fertilizer channel node\">\n                  <circle class=\"ring\" cx=\"220\" cy=\"228\" r=\"46\"><\/circle>\n                  <circle class=\"core\" cx=\"220\" cy=\"228\" r=\"30\"><\/circle>\n                  <text class=\"node-label\" x=\"171\" y=\"225\">Fertilizer<\/text>\n                  <text class=\"node-sub\" x=\"178\" y=\"246\">Farm inputs<\/text>\n                <\/g>\n\n                <g class=\"node node-button\" data-node=\"energy\" tabindex=\"0\" role=\"button\" aria-label=\"Energy channel node\">\n                  <circle class=\"ring\" cx=\"380\" cy=\"94\" r=\"48\"><\/circle>\n                  <circle class=\"core\" cx=\"380\" cy=\"94\" r=\"31\"><\/circle>\n                  <text class=\"node-label\" x=\"347\" y=\"91\">Energy<\/text>\n                  <text class=\"node-sub\" x=\"351\" y=\"112\">LNG & oil<\/text>\n                <\/g>\n\n                <g class=\"node node-button\" data-node=\"freight\" tabindex=\"0\" role=\"button\" aria-label=\"Freight channel node\">\n                  <circle class=\"ring\" cx=\"368\" cy=\"244\" r=\"48\"><\/circle>\n                  <circle class=\"core\" cx=\"368\" cy=\"244\" r=\"31\"><\/circle>\n                  <text class=\"node-label\" x=\"334\" y=\"241\">Freight<\/text>\n                  <text class=\"node-sub\" x=\"313\" y=\"262\">Insurance & shipping<\/text>\n                <\/g>\n\n                <g class=\"node node-button\" data-node=\"metals\" tabindex=\"0\" role=\"button\" aria-label=\"Metals channel node\">\n                  <circle class=\"ring\" cx=\"546\" cy=\"170\" r=\"44\"><\/circle>\n                  <circle class=\"core\" cx=\"546\" cy=\"170\" r=\"28\"><\/circle>\n                  <text class=\"node-label\" x=\"516\" y=\"167\">Metals<\/text>\n                  <text class=\"node-sub\" x=\"500\" y=\"188\">Al, Cu, Ni<\/text>\n                <\/g>\n\n                <g class=\"node\" data-node=\"filters\">\n                  <circle class=\"ring\" cx=\"562\" cy=\"296\" r=\"48\"><\/circle>\n                  <circle class=\"core\" cx=\"562\" cy=\"296\" r=\"31\"><\/circle>\n                  <text class=\"node-label\" x=\"521\" y=\"294\">Domestic<\/text>\n                  <text class=\"node-sub\" x=\"513\" y=\"315\">FX \u00b7 subsidies \u00b7 stocks<\/text>\n                <\/g>\n\n                <g class=\"node\" data-node=\"cpi\">\n                  <circle class=\"ring\" cx=\"658\" cy=\"104\" r=\"44\"><\/circle>\n                  <circle class=\"core\" cx=\"658\" cy=\"104\" r=\"28\"><\/circle>\n                  <text class=\"node-label\" x=\"642\" y=\"101\">CPI<\/text>\n                  <text class=\"node-sub\" x=\"620\" y=\"122\">Consumer impulse<\/text>\n                <\/g>\n\n                <g class=\"node\" data-node=\"producer\">\n                  <circle class=\"ring\" cx=\"674\" cy=\"252\" r=\"50\"><\/circle>\n                  <circle class=\"core\" cx=\"674\" cy=\"252\" r=\"32\"><\/circle>\n                  <text class=\"node-label\" x=\"645\" y=\"248\">Producer<\/text>\n                  <text class=\"node-sub\" x=\"627\" y=\"270\">Cost squeeze<\/text>\n                <\/g>\n              <\/svg>\n            <\/div>\n\n            <div class=\"focus-panel\">\n              <section class=\"focus-card\">\n                <div class=\"mini\">Selected channel<\/div>\n                <h3 data-out=\"focusTitle\"><\/h3>\n                <p data-out=\"focusBody\"><\/p>\n              <\/section>\n              <div class=\"mini-grid\">\n                <article class=\"mini-tile\">\n                  <div class=\"mini-label\">Current range<\/div>\n                  <strong data-out=\"focusRange\"><\/strong>\n                  <span data-out=\"focusRangeCopy\"><\/span>\n                <\/article>\n                <article class=\"mini-tile\">\n                  <div class=\"mini-label\">Selected country weight<\/div>\n                  <strong data-out=\"focusWeight\"><\/strong>\n                  <span data-out=\"focusWeightCopy\"><\/span>\n                <\/article>\n                <article class=\"mini-tile\">\n                  <div class=\"mini-label\">Main domestic layer<\/div>\n                  <strong data-out=\"focusLayer\"><\/strong>\n                  <span data-out=\"focusLayerCopy\"><\/span>\n                <\/article>\n                <article class=\"mini-tile\">\n                  <div class=\"mini-label\">Timing signal<\/div>\n                  <strong data-out=\"focusTiming\"><\/strong>\n                  <span data-out=\"focusTimingCopy\"><\/span>\n                <\/article>\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/article>\n\n        <article class=\"card country-card\">\n          <div class=\"card-head\">\n            <div>\n              <h2>Country response stack<\/h2>\n            <\/div>\n            <p>The selected country anchors the pass-through filters and changes how the same global shock lands domestically.<\/p>\n          <\/div>\n          <div class=\"country-list\" data-out=\"countryList\"><\/div>\n          <div class=\"country-footer\">\n            <div class=\"tag-row\" data-out=\"countryTags\"><\/div>\n            <p class=\"country-note\" data-out=\"countryNote\"><\/p>\n          <\/div>\n        <\/article>\n\n        <article class=\"card market-card\">\n          <div class=\"card-head\">\n            <div>\n              <h2>Scenario range board<\/h2>\n            <\/div>\n            <p>Rows below recompose around the active channel so the user reads the market through one connected lens at a time.<\/p>\n          <\/div>\n          <div class=\"market-table\" data-out=\"marketRows\"><\/div>\n        <\/article>\n\n        <article class=\"card playbook-card\">\n          <div class=\"card-head\">\n            <div>\n              <h2>Response playbook<\/h2>\n            <\/div>\n            <p>The action stack is regenerated from the chosen scenario and country type instead of staying static.<\/p>\n          <\/div>\n          <div class=\"playbook-grid\" data-out=\"playbook\"><\/div>\n        <\/article>\n\n        <article class=\"card monitor-card\">\n          <div class=\"card-head\">\n            <div>\n              <h2>Monitoring dashboard<\/h2>\n            <\/div>\n            <p>These six indicators move with the selected shock regime so the panel behaves like a dashboard rather than a report page.<\/p>\n          <\/div>\n          <div class=\"monitor-grid\" data-out=\"monitor\"><\/div>\n        <\/article>\n      <\/section>\n\n      <footer class=\"actions\">\n        <button class=\"tool primary\" data-action=\"copy\">Copy current briefing<\/button>\n        <button class=\"tool\" data-action=\"csv\">Download current CSV<\/button>\n        <span class=\"actions-note\" data-out=\"footerNote\"><\/span>\n      <\/footer>\n    <\/section>\n  `;\n\n  const scenarios = {\n    baseline: {\n      label: \"Baseline\",\n      stress: 42,\n      cpiAvg: [0.7, 1.4],\n      producerAvg: [2.0, 4.0],\n      note: \"Moderate El Ni\u00f1o develops in mid-2026 while conflict and logistics stress stay serious but avoid full sustained closure.\",\n      bias: \"Manageable but visible import-cost pressure.\",\n      market: \"Food rises with lag while energy stays above pre-war baseline.\",\n      timing: \"Late 2027 food peak\"\n    },\n    adverse: {\n      label: \"Adverse\",\n      stress: 69,\n      cpiAvg: [1.7, 2.9],\n      producerAvg: [4.5, 8.3],\n      note: \"Strong El Ni\u00f1o overlaps with prolonged regional conflict, high freight and insurance, tighter LNG, and recurring supply interruptions.\",\n      bias: \"Food and energy both move materially higher.\",\n      market: \"Second-round inflation and buffer use intensify.\",\n      timing: \"Late 2027 \/ early 2028 strain\"\n    },\n    severe: {\n      label: \"Severe\",\n      stress: 91,\n      cpiAvg: [3.3, 5.2],\n      producerAvg: [8.5, 14.3],\n      note: \"Strong-to-very-strong El Ni\u00f1o overlaps with major prolonged shipping, LNG, and fertilizer disruption.\",\n      bias: \"Simultaneous food-energy-metals shock.\",\n      market: \"Importers face fiscal and FX stress while GCC consumers stay buffered but producers still absorb large costs.\",\n      timing: \"Protracted multi-channel stress\"\n    }\n  };\n\n  const countries = {\n    egypt: {\n      label: \"Egypt\",\n      type: \"Food and energy importer\",\n      beta: \"Highest beta\",\n      buffers: \"Low FX and fiscal buffers\",\n      passThrough: 0.95,\n      producerSensitivity: 0.88,\n      weights: { food: 1.00, fertilizer: 0.95, energy: 0.95, freight: 0.90, metals: 0.74 },\n      cpi: { baseline: [1.5, 2.5], adverse: [3.0, 5.0], severe: [6.0, 9.0] },\n      producer: { baseline: [4, 7], adverse: [8, 15], severe: [15, 25] },\n      note: \"Bread subsidies delay but do not remove pass-through. FX pressure, imported food, gas, power, and logistics reinforce each other.\",\n      exposed: [\"Wheat\", \"Feed grains\", \"Edible oils\", \"Gas & power\", \"Logistics\"],\n      bufferScore: 24\n    },\n    jordan: {\n      label: \"Jordan\",\n      type: \"Food and energy importer\",\n      beta: \"High beta\",\n      buffers: \"Better policy credibility\",\n      passThrough: 0.76,\n      producerSensitivity: 0.67,\n      weights: { food: 0.82, fertilizer: 0.74, energy: 1.00, freight: 0.82, metals: 0.60 },\n      cpi: { baseline: [0.8, 1.4], adverse: [1.8, 3.0], severe: [3.5, 5.5] },\n      producer: { baseline: [2, 4], adverse: [5, 8], severe: [9, 15] },\n      note: \"Strategic reserves and policy credibility cushion immediate pass-through, but imported energy and gas keep producer costs vulnerable.\",\n      exposed: [\"Imported gas\", \"Wheat\", \"Feed grains\", \"Tourism-linked services\", \"Logistics\"],\n      bufferScore: 43\n    },\n    uae: {\n      label: \"UAE\",\n      type: \"Buffered hydrocarbon exporter\",\n      beta: \"Moderate CPI beta\",\n      buffers: \"Dollar peg and fiscal buffers\",\n      passThrough: 0.35,\n      producerSensitivity: 0.60,\n      weights: { food: 0.46, fertilizer: 0.56, energy: 0.34, freight: 0.82, metals: 0.87 },\n      cpi: { baseline: [0.3, 0.8], adverse: [1.0, 1.8], severe: [2.0, 3.2] },\n      producer: { baseline: [1, 3], adverse: [3, 6], severe: [6, 10] },\n      note: \"Consumers are buffered, but aviation, logistics, construction, and fabrication channels still absorb imported cost escalation.\",\n      exposed: [\"Food imports\", \"Aviation\", \"Construction metals\", \"Logistics\", \"Industrial inputs\"],\n      bufferScore: 78\n    },\n    saudi: {\n      label: \"Saudi Arabia\",\n      type: \"Buffered hydrocarbon exporter\",\n      beta: \"Low CPI beta\",\n      buffers: \"Oil revenue and reserves\",\n      passThrough: 0.30,\n      producerSensitivity: 0.50,\n      weights: { food: 0.40, fertilizer: 0.50, energy: 0.30, freight: 0.70, metals: 0.78 },\n      cpi: { baseline: [0.2, 0.7], adverse: [0.8, 1.6], severe: [1.8, 3.0] },\n      producer: { baseline: [0.8, 2.0], adverse: [2, 4], severe: [4, 7] },\n      note: \"Consumer prices are cushioned, but mega-projects, specialized materials, hospitality, and logistics still face sizeable producer-side stress.\",\n      exposed: [\"Food imports\", \"Specialized materials\", \"Metals\", \"Hospitality\", \"Logistics\"],\n      bufferScore: 82\n    }\n  };\n\n  const channels = {\n    food: {\n      label: \"Food\",\n      currentRange: { baseline: \"+4% to +9%\", adverse: \"+10% to +18%\", severe: \"+20% to +35%\" },\n      intensity: { baseline: 36, adverse: 66, severe: 92 },\n      body: \"The clearest El Ni\u00f1o-sensitive channel. Wheat, maize, rice, and palm oil transmit into consumer baskets with a lag, then stack on freight, fuel, fertilizer, and Black Sea risk.\",\n      layer: \"CPI first\",\n      layerCopy: \"Bread, edible oils, feed, poultry, dairy, and processed food pass-through.\",\n      timing: \"Delayed peak\",\n      timingCopy: \"The ECB-style lag places the food peak around late 2027 under a mid-2026 onset.\",\n      weightCopy: \"Higher where food imports, FX pass-through, and fiscal limits reinforce one another.\",\n      marketRows: [\n        { name: \"Wheat HRW\", type: \"benchmark\", values: { baseline: \"$250\u2013310\/mt\", adverse: \"$300\u2013380\/mt\", severe: \"$380\u2013500\/mt\" }, note: \"Highest direct sensitivity for Egypt and bread-importing economies.\" },\n        { name: \"Maize\", type: \"benchmark\", values: { baseline: \"$205\u2013245\/mt\", adverse: \"$240\u2013300\/mt\", severe: \"$300\u2013380\/mt\" }, note: \"Feed channel into poultry, dairy, and meat.\" },\n        { name: \"Rice 5%\", type: \"benchmark\", values: { baseline: \"$380\u2013460\/mt\", adverse: \"$450\u2013560\/mt\", severe: \"$550\u2013700\/mt\" }, note: \"Relevant for Gulf and Levant consumption baskets.\" },\n        { name: \"Palm oil\", type: \"benchmark\", values: { baseline: \"$1,000\u20131,200\/mt\", adverse: \"$1,150\u20131,400\/mt\", severe: \"$1,350\u20131,700\/mt\" }, note: \"Edible-oil and processed-food channel with Southeast Asia drought exposure.\" }\n      ]\n    },\n    fertilizer: {\n      label: \"Fertilizer\",\n      currentRange: { baseline: \"+10% to +25%\", adverse: \"+25% to +50%\", severe: \"+50% to +80%\" },\n      intensity: { baseline: 46, adverse: 74, severe: 96 },\n      body: \"The bridge mechanism. Gas-linked farm inputs and shipping constraints weaken crop resilience before drought losses even show up in harvest volumes.\",\n      layer: \"CPI bridge\",\n      layerCopy: \"Farm-input stress becomes a food-price amplifier with a delay rather than a standalone retail signal.\",\n      timing: \"Pre-harvest\",\n      timingCopy: \"It bites before crop losses are visible because farmers buy inputs ahead of the weather shock.\",\n      weightCopy: \"Higher where food systems are import-dependent and fiscal space is thin.\",\n      marketRows: [\n        { name: \"Farm-input uplift\", type: \"channel\", values: { baseline: \"+10% to +25%\", adverse: \"+25% to +50%\", severe: \"+50% to +80%\" }, note: \"Analytical planning range for fertilizer and agricultural inputs.\" },\n        { name: \"TTF gas\", type: \"benchmark\", values: { baseline: \"$12\u201320\/mmbtu\", adverse: \"$20\u201335\/mmbtu\", severe: \"$35\u201360\/mmbtu\" }, note: \"Gas is central for urea and ammonia cost formation.\" },\n        { name: \"Henry Hub\", type: \"benchmark\", values: { baseline: \"$3.5\u20135.0\/mmbtu\", adverse: \"$5.0\u20137.0\/mmbtu\", severe: \"$7.0\u201310.0\/mmbtu\" }, note: \"US gas matters through LNG and fertilizer trade links.\" },\n        { name: \"Food import basket\", type: \"channel\", values: { baseline: \"+4% to +9%\", adverse: \"+10% to +18%\", severe: \"+20% to +35%\" }, note: \"Shows how farm-input stress rolls into landed food costs.\" }\n      ]\n    },\n    energy: {\n      label: \"Energy\",\n      currentRange: { baseline: \"+10% to +25%\", adverse: \"+30% to +60%\", severe: \"+70% to +120%\" },\n      intensity: { baseline: 44, adverse: 82, severe: 100 },\n      body: \"The immediate amplifier. In this scenario architecture, energy is dominated by geopolitical and LNG disruption, while El Ni\u00f1o compounds cooling demand and hydropower substitution abroad.\",\n      layer: \"Producer first\",\n      layerCopy: \"Transport, power, petrochemicals, fertilizers, aviation, and imported fuel bills move before the lagged food peak arrives.\",\n      timing: \"Immediate\",\n      timingCopy: \"This is the front-loaded stress channel in 2026, especially for importers.\" ,\n      weightCopy: \"Importer pressure is highest in Egypt and Jordan; exporters are cushioned on the consumer side.\",\n      marketRows: [\n        { name: \"Brent crude\", type: \"benchmark\", values: { baseline: \"$80\u2013105\/bbl\", adverse: \"$105\u2013135\/bbl\", severe: \"$135\u2013180\/bbl\" }, note: \"First-order driver of transport, fuel, and petrochemical costs.\" },\n        { name: \"WTI crude\", type: \"benchmark\", values: { baseline: \"$75\u2013100\/bbl\", adverse: \"$95\u2013125\/bbl\", severe: \"$125\u2013165\/bbl\" }, note: \"Secondary benchmark for global oil pricing and refined-product transmission.\" },\n        { name: \"TTF gas\", type: \"benchmark\", values: { baseline: \"$12\u201320\/mmbtu\", adverse: \"$20\u201335\/mmbtu\", severe: \"$35\u201360\/mmbtu\" }, note: \"Key for LNG, power, and fertilizers.\" },\n        { name: \"Importer bill uplift\", type: \"channel\", values: { baseline: \"+10% to +25%\", adverse: \"+30% to +60%\", severe: \"+70% to +120%\" }, note: \"Analytical range for importer-side energy and power cost escalation.\" }\n      ]\n    },\n    freight: {\n      label: \"Freight\",\n      currentRange: { baseline: \"+5% to +15%\", adverse: \"+15% to +35%\", severe: \"+35% to +70%\" },\n      intensity: { baseline: 34, adverse: 58, severe: 88 },\n      body: \"The multiplier channel. Shipping, war-risk insurance, rerouting, and logistics delays amplify every imported commodity lane rather than acting as an isolated market.\",\n      layer: \"Cross-system\",\n      layerCopy: \"It widens the landed-cost wedge across food, fuel, materials, and industrial inputs.\",\n      timing: \"Immediate\",\n      timingCopy: \"It shows up as availability, delay, and landed-cost stress before final CPI prints catch up.\",\n      weightCopy: \"High for importers and for GCC aviation, logistics, and construction ecosystems.\",\n      marketRows: [\n        { name: \"Freight & insurance uplift\", type: \"channel\", values: { baseline: \"+5% to +15%\", adverse: \"+15% to +35%\", severe: \"+35% to +70%\" }, note: \"Analytical planning range for shipping, insurance, and rerouting stress.\" },\n        { name: \"Brent crude\", type: \"benchmark\", values: { baseline: \"$80\u2013105\/bbl\", adverse: \"$105\u2013135\/bbl\", severe: \"$135\u2013180\/bbl\" }, note: \"Fuel is a direct freight cost driver.\" },\n        { name: \"Food import basket\", type: \"channel\", values: { baseline: \"+4% to +9%\", adverse: \"+10% to +18%\", severe: \"+20% to +35%\" }, note: \"Shows how freight amplifies the landed cost of staples.\" },\n        { name: \"Importer energy bill\", type: \"channel\", values: { baseline: \"+10% to +25%\", adverse: \"+30% to +60%\", severe: \"+70% to +120%\" }, note: \"Energy and freight stress reinforce one another in import-dependent systems.\" }\n      ]\n    },\n    metals: {\n      label: \"Metals\",\n      currentRange: { baseline: \"+5% to +12%\", adverse: \"+12% to +25%\", severe: \"+25% to +45%\" },\n      intensity: { baseline: 24, adverse: 46, severe: 72 },\n      body: \"Historically less robust than food, but highly nonlinear in a compound shock because mining, smelting, water, power, and freight all sit inside the cost stack.\",\n      layer: \"Producer first\",\n      layerCopy: \"Construction, fabrication, packaging, power-grid equipment, and industrial supply chains take the hit before households do.\",\n      timing: \"Scenario dependent\",\n      timingCopy: \"The risk spikes when power, smelting, or shipping disruption overlaps with large project demand.\",\n      weightCopy: \"More material in UAE and Saudi Arabia because construction and industrial channels are larger.\",\n      marketRows: [\n        { name: \"Copper\", type: \"benchmark\", values: { baseline: \"$11.5k\u201313.5k\/mt\", adverse: \"$12.5k\u201314.5k\/mt\", severe: \"$13.5k\u201316.0k\/mt\" }, note: \"Construction, power-grid, and wiring costs.\" },\n        { name: \"Aluminium\", type: \"benchmark\", values: { baseline: \"$3.0k\u20133.5k\/mt\", adverse: \"$3.3k\u20134.0k\/mt\", severe: \"$4.0k\u20135.0k\/mt\" }, note: \"Most important metals risk for GCC construction and fabrication.\" },\n        { name: \"Nickel\", type: \"benchmark\", values: { baseline: \"$16.0k\u201318.5k\/mt\", adverse: \"$18.0k\u201322.0k\/mt\", severe: \"$22.0k\u201328.0k\/mt\" }, note: \"Stainless steel and battery supply chains.\" },\n        { name: \"Metals input uplift\", type: \"channel\", values: { baseline: \"+5% to +12%\", adverse: \"+12% to +25%\", severe: \"+25% to +45%\" }, note: \"Analytical planning range for imported construction and industrial inputs.\" }\n      ]\n    }\n  };\n\n  const monitorDefs = [\n    { key: \"enso\", label: \"ENSO signal\", desc: \"Climate probability and strength regime.\" },\n    { key: \"food\", label: \"Food benchmarks\", desc: \"Wheat, maize, rice, and oils.\" },\n    { key: \"energy\", label: \"LNG \/ oil stress\", desc: \"Brent, TTF, importer bill pressure.\" },\n    { key: \"freight\", label: \"Freight & insurance\", desc: \"Shipping delay and rerouting costs.\" },\n    { key: \"buffers\", label: \"Policy buffers\", desc: \"FX, reserves, subsidies, and stocks.\" },\n    { key: \"pass\", label: \"Domestic pass-through\", desc: \"How much of the shock escapes the buffer layer.\" }\n  ];\n\n  const focusNodes = {\n    climate: \"food\",\n    food: \"food\",\n    fertilizer: \"fertilizer\",\n    energy: \"energy\",\n    freight: \"freight\",\n    metals: \"metals\"\n  };\n\n  const focusLinkMap = {\n    food: [\"climate-food\", \"fertilizer-food\", \"freight-food\", \"food-cpi\"],\n    fertilizer: [\"climate-fertilizer\", \"energy-fertilizer\", \"fertilizer-food\"],\n    energy: [\"energy-fertilizer\", \"energy-freight\", \"energy-cpi\"],\n    freight: [\"energy-freight\", \"freight-food\", \"freight-metals\", \"freight-producer\"],\n    metals: [\"freight-metals\", \"metals-producer\"]\n  };\n\n  const scenarioOrder = [\"baseline\", \"adverse\", \"severe\"];\n  const countryOrder = [\"egypt\", \"jordan\", \"uae\", \"saudi\"];\n  const focusOrder = [\"food\", \"energy\", \"fertilizer\", \"freight\", \"metals\"];\n\n  class ObexMenaLinkedDashboard extends HTMLElement {\n    connectedCallback() {\n      if (this.shadowRoot) return;\n      this.state = { scenario: \"baseline\", country: \"egypt\", focus: \"food\" };\n      this.attachShadow({ mode: \"open\" });\n      this.shadowRoot.appendChild(template.content.cloneNode(true));\n      this.cache();\n      this.buildControls();\n      this.bind();\n      this.render();\n    }\n\n    cache() {\n      this.out = {};\n      this.shadowRoot.querySelectorAll(\"[data-out]\").forEach((el) => {\n        const name = el.getAttribute(\"data-out\");\n        if (!this.out[name]) this.out[name] = [];\n        this.out[name].push(el);\n      });\n    }\n\n    buildControls() {\n      this.fillButtonGroup(\"scenario\", scenarioOrder, (key) => scenarios[key].label, \"scenario\");\n      this.fillButtonGroup(\"country\", countryOrder, (key) => countries[key].label, \"country\");\n      this.fillButtonGroup(\"focus\", focusOrder, (key) => channels[key].label, \"focus\", true);\n    }\n\n    fillButtonGroup(groupName, keys, labelFn, type, focusStyle = false) {\n      const group = this.shadowRoot.querySelector(`[data-group=\"${groupName}\"]`);\n      if (!group) return;\n      group.innerHTML = keys.map((key) => `\n        <button class=\"chip ${focusStyle ? 'is-focus' : ''}\" data-${type}=\"${key}\" type=\"button\" aria-pressed=\"false\">${labelFn(key)}<\/button>\n      `).join(\"\");\n    }\n\n    bind() {\n      this.shadowRoot.addEventListener(\"click\", (event) => {\n        const scenarioButton = event.target.closest(\"[data-scenario]\");\n        if (scenarioButton) {\n          this.state.scenario = scenarioButton.dataset.scenario;\n          this.render();\n          return;\n        }\n\n        const countryButton = event.target.closest(\"[data-country]\");\n        if (countryButton) {\n          this.state.country = countryButton.dataset.country;\n          this.render();\n          return;\n        }\n\n        const focusButton = event.target.closest(\"[data-focus]\");\n        if (focusButton) {\n          this.state.focus = focusButton.dataset.focus;\n          this.render();\n          return;\n        }\n\n        const node = event.target.closest(\".node-button\");\n        if (node) {\n          const mapped = focusNodes[node.dataset.node];\n          if (mapped) {\n            this.state.focus = mapped;\n            this.render();\n          }\n          return;\n        }\n\n        const countrySelect = event.target.closest(\".country-select\");\n        if (countrySelect) {\n          this.state.country = countrySelect.dataset.countryPick;\n          this.render();\n          return;\n        }\n\n        const action = event.target.closest(\"[data-action]\");\n        if (action) {\n          const kind = action.dataset.action;\n          if (kind === \"copy\") this.copyBriefing();\n          if (kind === \"csv\") this.downloadCsv();\n        }\n      });\n\n      this.shadowRoot.addEventListener(\"keydown\", (event) => {\n        const node = event.target.closest(\".node-button\");\n        if (node && (event.key === \"Enter\" || event.key === \" \")) {\n          event.preventDefault();\n          const mapped = focusNodes[node.dataset.node];\n          if (mapped) {\n            this.state.focus = mapped;\n            this.render();\n          }\n        }\n      });\n    }\n\n    setText(name, value) {\n      (this.out[name] || []).forEach((el) => {\n        el.textContent = value;\n      });\n    }\n\n    setHtml(name, value) {\n      (this.out[name] || []).forEach((el) => {\n        el.innerHTML = value;\n      });\n    }\n\n    mid(range) {\n      return (range[0] + range[1]) \/ 2;\n    }\n\n    pct(value) {\n      return `${Math.round(value)}%`;\n    }\n\n    rangeToText(range, suffix = \"%\") {\n      return `${this.format(range[0])}${suffix} to ${this.format(range[1])}${suffix}`;\n    }\n\n    format(num) {\n      return Number.isInteger(num) ? `${num}` : `${num.toFixed(1)}`;\n    }\n\n    scenarioData() {\n      return scenarios[this.state.scenario];\n    }\n\n    countryData() {\n      return countries[this.state.country];\n    }\n\n    focusData() {\n      return channels[this.state.focus];\n    }\n\n    selectedCpiRange(countryKey = this.state.country) {\n      return countries[countryKey].cpi[this.state.scenario];\n    }\n\n    selectedProducerRange(countryKey = this.state.country) {\n      return countries[countryKey].producer[this.state.scenario];\n    }\n\n    channelWeightedScore(channelKey, countryKey = this.state.country) {\n      const channel = channels[channelKey];\n      const country = countries[countryKey];\n      return channel.intensity[this.state.scenario] * country.weights[channelKey];\n    }\n\n    dominantChannel(countryKey = this.state.country) {\n      const scores = focusOrder.map((key) => ({ key, score: this.channelWeightedScore(key, countryKey) }));\n      scores.sort((a, b) => b.score - a.score);\n      return scores[0];\n    }\n\n    transmissionMood(stress) {\n      if (stress < 50) return \"Contained but live\";\n      if (stress < 80) return \"Compounding\";\n      return \"Systemic\";\n    }\n\n    rangeLabel(range, unit) {\n      return `+${this.format(range[0])} to +${this.format(range[1])}${unit}`;\n    }\n\n    footerNoteText() {\n      const scenario = this.scenarioData();\n      const country = this.countryData();\n      const focus = this.focusData();\n      return `${scenario.label} \u00b7 ${country.label} \u00b7 ${focus.label}`;\n    }\n\n    buildBriefing() {\n      const scenario = this.scenarioData();\n      const country = this.countryData();\n      const focus = this.focusData();\n      const cpi = this.selectedCpiRange();\n      const producer = this.selectedProducerRange();\n      return `${scenario.label} regime for ${country.label}: ${focus.label} is the active lens. CPI pressure sits at +${this.format(cpi[0])} to +${this.format(cpi[1])} ppt and producer costs at +${this.format(producer[0])} to +${this.format(producer[1])}%, while the four-country anchor average remains +${this.format(scenario.cpiAvg[0])} to +${this.format(scenario.cpiAvg[1])} ppt on CPI and +${this.format(scenario.producerAvg[0])} to +${this.format(scenario.producerAvg[1])}% on producer costs. ${scenario.bias}`;\n    }\n\n    stateBadgeHtml() {\n      const scenario = this.scenarioData();\n      const dominant = this.dominantChannel();\n      return `\n        <div class=\"state-badge-label\">Live dashboard state<\/div>\n        <strong>${scenario.label}<\/strong>\n        <span>${this.transmissionMood(scenario.stress)} \u00b7 ${channels[dominant.key].label} dominates ${this.countryData().label}<\/span>\n      `;\n    }\n\n    buildCountryList() {\n      const maxCpiMid = 7.5;\n      const maxProducerMid = 20;\n      return countryOrder.map((key) => {\n        const c = countries[key];\n        const cpi = c.cpi[this.state.scenario];\n        const prod = c.producer[this.state.scenario];\n        const cpiWidth = Math.min(100, this.mid(cpi) \/ maxCpiMid * 100);\n        const prodWidth = Math.min(100, this.mid(prod) \/ maxProducerMid * 100);\n        return `\n          <article class=\"country-row ${key === this.state.country ? 'is-active' : ''}\">\n            <button class=\"country-select\" type=\"button\" data-country-pick=\"${key}\" aria-label=\"Select ${c.label}\"><\/button>\n            <div class=\"country-top\">\n              <strong>${c.label}<\/strong>\n              <span>${c.beta}<\/span>\n            <\/div>\n            <div class=\"metric-row\">\n              <label>CPI<\/label>\n              <div class=\"bar\"><span style=\"width:${cpiWidth}%\"><\/span><\/div>\n              <output>+${this.format(cpi[0])} to +${this.format(cpi[1])} ppt<\/output>\n            <\/div>\n            <div class=\"metric-row\">\n              <label>Prod.<\/label>\n              <div class=\"bar\"><span style=\"width:${prodWidth}%\"><\/span><\/div>\n              <output>+${this.format(prod[0])} to +${this.format(prod[1])}%<\/output>\n            <\/div>\n          <\/article>\n        `;\n      }).join(\"\");\n    }\n\n    buildCountryTags() {\n      const country = this.countryData();\n      const dominant = this.dominantChannel();\n      const tags = [\n        { text: country.type, red: false },\n        { text: country.buffers, red: false },\n        { text: `${channels[dominant.key].label} dominant`, red: true },\n        { text: `${this.transmissionMood(this.scenarioData().stress)} regime`, red: true }\n      ];\n      return tags.map((tag) => `<span class=\"tag ${tag.red ? 'red' : ''}\">${tag.text}<\/span>`).join(\"\");\n    }\n\n    buildMarketRows() {\n      const focus = this.focusData();\n      return focus.marketRows.map((row) => `\n        <div class=\"market-row\">\n          <div>\n            <strong>${row.name}<\/strong>\n            <span>${row.note}<\/span>\n          <\/div>\n          <div class=\"range-pill\">${row.values[this.state.scenario]}<\/div>\n        <\/div>\n      `).join(\"\");\n    }\n\n    buildPlaybook() {\n      const country = this.countryData();\n      const scenario = this.scenarioData();\n      const importer = country.type.includes(\"importer\");\n      const severe = this.state.scenario === \"severe\";\n      const adverse = this.state.scenario === \"adverse\";\n      const cards = importer ? [\n        {\n          title: \"Stocks and cover\",\n          body: severe ? \"Prioritize wheat, feed, edible oils, and LNG cover with shorter replenishment cycles and tighter inventory visibility.\" : adverse ? \"Raise stock discipline and sequence purchases across food and gas instead of reacting commodity by commodity.\" : \"Keep strategic food and fuel cover visible before the lagged food peak arrives.\" \n        },\n        {\n          title: \"Buffer targeting\",\n          body: severe ? \"Use subsidies and transfers selectively so fiscal protection holds for the most politically sensitive baskets.\" : adverse ? \"Shift from broad cushioning toward targeted support as second-round inflation rises.\" : \"Preserve fiscal space by buffering the most exposed essentials rather than the full basket.\" \n        },\n        {\n          title: \"Energy logistics\",\n          body: severe ? \"Treat LNG procurement, fuel-routing resilience, and shipping insurance as a single operating problem.\" : adverse ? \"Pair power, LNG, and freight decisions so producer costs do not re-enter CPI later.\" : \"Watch immediate energy and freight stress because they arrive before the food peak.\" \n        },\n        {\n          title: \"Communication\",\n          body: severe ? \"Prepare explicit pass-through messaging around bread, feed, power, and freight-sensitive sectors.\" : adverse ? \"Signal the difference between temporary buffer use and permanent price suppression.\" : \"Use forward guidance to anchor expectations before the delayed food impulse intensifies.\" \n        }\n      ] : [\n        {\n          title: \"Producer shielding\",\n          body: severe ? \"Channel buffer capacity toward aviation, logistics, construction, and fabrication where cost escalation is steepest.\" : adverse ? \"Use administrative and fiscal capacity to prevent producer-side cost spikes from cascading through projects.\" : \"Keep consumer inflation buffered while tracking industrial cost pressure underneath the surface.\" \n        },\n        {\n          title: \"Project repricing\",\n          body: severe ? \"Rebase large project assumptions around materials, freight, cooling demand, and imported equipment.\" : adverse ? \"Stress-test construction and supply-chain budgets under higher metals and logistics costs.\" : \"Refresh procurement timing before metals and freight pressure harden into contracts.\" \n        },\n        {\n          title: \"Supply-chain routing\",\n          body: severe ? \"Treat freight, insurance, and aviation capacity as strategic infrastructure variables, not operating details.\" : adverse ? \"Expand redundancy in shipping and supplier routing where logistics concentration is high.\" : \"Keep alternative routing active early even while household CPI stays contained.\" \n        },\n        {\n          title: \"Non-oil transmission\",\n          body: severe ? \"Track desalination, power, hospitality, and food-service inputs because the domestic non-oil economy remains exposed.\" : adverse ? \"Separate consumer buffering from producer exposure in dashboard reporting and pricing decisions.\" : \"Monitor hidden pass-through into real estate, aviation, and industrial services.\" \n        }\n      ];\n      return cards.map((card, index) => `\n        <article class=\"action-card\">\n          <span class=\"step\">${index + 1}<\/span>\n          <h3>${card.title}<\/h3>\n          <p>${card.body}<\/p>\n        <\/article>\n      `).join(\"\");\n    }\n\n    monitorValues() {\n      const scenario = this.scenarioData();\n      const country = this.countryData();\n      const focusKey = this.state.focus;\n      const base = scenario.stress;\n      const focusScore = Math.min(100, this.channelWeightedScore(focusKey));\n      const bufferPenalty = 100 - country.bufferScore;\n      return {\n        enso: Math.min(100, base + (focusKey === 'food' ? 8 : 0)),\n        food: Math.min(100, this.channelWeightedScore('food') + (focusKey === 'food' ? 10 : 0)),\n        energy: Math.min(100, this.channelWeightedScore('energy') + (focusKey === 'energy' ? 10 : 0)),\n        freight: Math.min(100, this.channelWeightedScore('freight') + (focusKey === 'freight' ? 10 : 0)),\n        buffers: Math.max(10, 100 - bufferPenalty),\n        pass: Math.min(100, focusScore * country.passThrough + (base * 0.18))\n      };\n    }\n\n    signalStatus(value, invert = false) {\n      const score = invert ? 100 - value : value;\n      if (score < 34) return \"Low\";\n      if (score < 67) return \"Watch\";\n      return \"Hot\";\n    }\n\n    buildMonitor() {\n      const values = this.monitorValues();\n      return monitorDefs.map((item) => {\n        const value = values[item.key];\n        const invert = item.key === 'buffers';\n        return `\n          <article class=\"signal\">\n            <div class=\"signal-top\">\n              <strong>${item.label}<\/strong>\n              <span>${this.signalStatus(value, invert)}<\/span>\n            <\/div>\n            <p>${item.desc}<\/p>\n            <div class=\"meter\"><span style=\"width:${Math.round(value)}%\"><\/span><\/div>\n          <\/article>\n        `;\n      }).join(\"\");\n    }\n\n    updateNetwork() {\n      const scenario = this.scenarioData();\n      const country = this.countryData();\n      const focus = this.state.focus;\n      const nodeScores = {\n        climate: Math.min(100, scenario.stress * 0.8),\n        food: Math.min(100, this.channelWeightedScore('food')),\n        fertilizer: Math.min(100, this.channelWeightedScore('fertilizer')),\n        energy: Math.min(100, this.channelWeightedScore('energy')),\n        freight: Math.min(100, this.channelWeightedScore('freight')),\n        metals: Math.min(100, this.channelWeightedScore('metals')),\n        filters: Math.min(100, scenario.stress * country.passThrough),\n        cpi: Math.min(100, this.mid(this.selectedCpiRange()) \/ 9 * 100),\n        producer: Math.min(100, this.mid(this.selectedProducerRange()) \/ 25 * 100)\n      };\n\n      this.shadowRoot.querySelectorAll('.node').forEach((node) => {\n        const key = node.dataset.node;\n        const core = node.querySelector('.core');\n        const intensity = Math.max(8, nodeScores[key] || 0) \/ 100;\n        const alpha = 0.08 + intensity * 0.68;\n        if (core) {\n          core.setAttribute('fill', key === focus ? `rgba(230, 0, 0, ${0.18 + intensity * 0.55})` : `rgba(15, 28, 92, ${alpha})`);\n        }\n        node.classList.toggle('is-focus', key === focus);\n      });\n\n      const hotLinks = new Set(focusLinkMap[focus] || []);\n      this.shadowRoot.querySelectorAll('.link').forEach((link) => {\n        const key = link.dataset.link;\n        const hot = hotLinks.has(key);\n        link.classList.toggle('hot', hot);\n        link.style.opacity = hot ? '1' : '0.42';\n        link.style.strokeWidth = hot ? `${4.5 + scenario.stress \/ 20}` : '4';\n      });\n    }\n\n    syncButtons() {\n      this.shadowRoot.querySelectorAll('[data-scenario]').forEach((button) => {\n        const active = button.dataset.scenario === this.state.scenario;\n        button.classList.toggle('is-active', active);\n        button.setAttribute('aria-pressed', active ? 'true' : 'false');\n      });\n      this.shadowRoot.querySelectorAll('[data-country]').forEach((button) => {\n        const active = button.dataset.country === this.state.country;\n        button.classList.toggle('is-active', active);\n        button.setAttribute('aria-pressed', active ? 'true' : 'false');\n      });\n      this.shadowRoot.querySelectorAll('[data-focus]').forEach((button) => {\n        const active = button.dataset.focus === this.state.focus;\n        button.classList.toggle('is-active', active);\n        button.setAttribute('aria-pressed', active ? 'true' : 'false');\n      });\n    }\n\n    render() {\n      const scenario = this.scenarioData();\n      const country = this.countryData();\n      const focus = this.focusData();\n      const cpi = this.selectedCpiRange();\n      const producer = this.selectedProducerRange();\n      const dominant = this.dominantChannel();\n      const focusWeight = this.channelWeightedScore(this.state.focus);\n\n      this.syncButtons();\n      this.updateNetwork();\n\n      this.setHtml('stateBadge', this.stateBadgeHtml());\n      this.setText('briefing', this.buildBriefing());\n      this.setText('stressScore', `${scenario.stress}\/100`);\n      this.setText('stressCopy', `${scenario.note} ${scenario.market}`);\n      this.setText('countryCpi', `+${this.format(cpi[0])} to +${this.format(cpi[1])} ppt`);\n      this.setText('countryCpiCopy', `${country.label} versus four-country anchor average of +${this.format(scenario.cpiAvg[0])} to +${this.format(scenario.cpiAvg[1])} ppt.`);\n      this.setText('countryProducer', `+${this.format(producer[0])} to +${this.format(producer[1])}%`);\n      this.setText('countryProducerCopy', `${country.beta}. Producer pressure is filtered through ${country.buffers.toLowerCase()}.`);\n      this.setText('dominantChannel', channels[dominant.key].label);\n      this.setText('dominantCopy', `${channels[dominant.key].label} is currently the strongest weighted transmitter into ${country.label}.`);\n\n      this.setText('focusTitle', focus.label);\n      this.setText('focusBody', focus.body);\n      this.setText('focusRange', focus.currentRange[this.state.scenario]);\n      this.setText('focusRangeCopy', `${scenario.label} analytical planning range.`);\n      this.setText('focusWeight', `${this.pct(focusWeight)}`);\n      this.setText('focusWeightCopy', focus.weightCopy);\n      this.setText('focusLayer', focus.layer);\n      this.setText('focusLayerCopy', focus.layerCopy);\n      this.setText('focusTiming', focus.timing);\n      this.setText('focusTimingCopy', focus.timingCopy);\n\n      this.setHtml('countryList', this.buildCountryList());\n      this.setHtml('countryTags', this.buildCountryTags());\n      this.setText('countryNote', country.note);\n      this.setHtml('marketRows', this.buildMarketRows());\n      this.setHtml('playbook', this.buildPlaybook());\n      this.setHtml('monitor', this.buildMonitor());\n      this.setText('footerNote', this.footerNoteText());\n    }\n\n    copyBriefing() {\n      const text = this.buildBriefing();\n      if (navigator.clipboard && navigator.clipboard.writeText) {\n        navigator.clipboard.writeText(text).then(() => {\n          this.setText('footerNote', 'Briefing copied to clipboard');\n          setTimeout(() => this.setText('footerNote', this.footerNoteText()), 1500);\n        }).catch(() => {\n          this.setText('footerNote', 'Clipboard not available in this browser context');\n          setTimeout(() => this.setText('footerNote', this.footerNoteText()), 1600);\n        });\n      }\n    }\n\n    downloadCsv() {\n      const scenario = this.scenarioData();\n      const country = this.countryData();\n      const focus = this.focusData();\n      const cpi = this.selectedCpiRange();\n      const producer = this.selectedProducerRange();\n      const rows = [\n        ['Scenario', scenario.label],\n        ['Country', country.label],\n        ['Focus', focus.label],\n        ['CPI impulse', `+${this.format(cpi[0])} to +${this.format(cpi[1])} ppt`],\n        ['Producer cost', `+${this.format(producer[0])} to +${this.format(producer[1])}%`],\n        ['Scenario stress', scenario.stress],\n        ['Focus range', focus.currentRange[this.state.scenario]],\n        ['Timing', focus.timing],\n        ['Country note', country.note]\n      ];\n      const csv = rows.map((row) => row.map((cell) => `\"${String(cell).replaceAll('\"', '\"\"')}\"`).join(',')).join('\\n');\n      const blob = new Blob([csv], { type: 'text\/csv;charset=utf-8;' });\n      const url = URL.createObjectURL(blob);\n      const link = document.createElement('a');\n      link.href = url;\n      link.download = `obex-linked-dashboard-${this.state.scenario}-${this.state.country}-${this.state.focus}.csv`;\n      link.click();\n      URL.revokeObjectURL(url);\n      this.setText('footerNote', 'CSV downloaded');\n      setTimeout(() => this.setText('footerNote', this.footerNoteText()), 1500);\n    }\n  }\n\n  customElements.define(tagName, ObexMenaLinkedDashboard);\n})();\n<\/script>\n\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>As 2026 advances into its second quarter, the global commodity complex is already navigating its most disruptive configuration since the pandemic-era supply collapse. Brent crude averaged $103.7 per barrel in March 2026, against a 2025 full-year average of $69.0 \u2014 a 50 percent premium sustained not by demand recovery but by a geopolitical supply rupture [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":704,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[178,6],"tags":[],"class_list":["post-702","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-178","category-6"],"_links":{"self":[{"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/posts\/702","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/comments?post=702"}],"version-history":[{"count":13,"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/posts\/702\/revisions"}],"predecessor-version":[{"id":718,"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/posts\/702\/revisions\/718"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/media\/704"}],"wp:attachment":[{"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/media?parent=702"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/categories?post=702"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/tags?post=702"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}