The following has evaluated to null or missing:
==> node.getText [in template "33818864612055#20120#NATIONAL-STRATEGY-TPL" at line 92, column 39]
----
Tip: It's the step after the last dot that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign desc = node.getText()!"" [in template "33818864612055#20120#NATIONAL-STRATEGY-TPL" at line 92, column 23]
----
1<#assign icons = {
2 'ns-vision': '<svg viewBox="0 0 256 256" fill="currentColor" class="h-6 w-6 shrink-0" aria-hidden="true" focusable="false"><path d="M237.2,151.87v0a47.1,47.1,0,0,0-2.35-5.45L193.26,51.8a7.82,7.82,0,0,0-1.66-2.44,32,32,0,0,0-45.26,0A8,8,0,0,0,144,55V80H112V55a8,8,0,0,0-2.34-5.66,32,32,0,0,0-45.26,0,7.82,7.82,0,0,0-1.66,2.44L21.15,146.4a47.1,47.1,0,0,0-2.35,5.45v0A48,48,0,1,0,112,168V96h32v72a48,48,0,1,0,93.2-16.13ZM76.71,59.75a16,16,0,0,1,19.29-1v73.51a47.9,47.9,0,0,0-46.79-9.92ZM64,200a32,32,0,1,1,32-32A32,32,0,0,1,64,200ZM160,58.74a16,16,0,0,1,19.29,1l27.5,62.58A47.9,47.9,0,0,0,160,132.25ZM192,200a32,32,0,1,1,32-32A32,32,0,0,1,192,200Z"/></svg>',
3 'ns-objectives': '<svg viewBox="0 0 256 256" fill="currentColor" class="h-6 w-6 shrink-0" aria-hidden="true" focusable="false"><path d="M221.87,83.16A104.1,104.1,0,1,1,195.67,49l22.67-22.68a8,8,0,0,1,11.32,11.32l-96,96a8,8,0,0,1-11.32-11.32l27.72-27.72a40,40,0,1,0,17.87,31.09,8,8,0,1,1,16-.9,56,56,0,1,1-22.38-41.65L184.3,60.39a87.88,87.88,0,1,0,23.13,29.67,8,8,0,0,1,14.44-6.9Z"/></svg>',
4 'ns-policies': '<svg viewBox="0 0 256 256" fill="currentColor" class="h-6 w-6 shrink-0" aria-hidden="true" focusable="false"><path d="M243.32,116.69l-16-16a16,16,0,0,0-20.84-1.53L156.84,49.52a16,16,0,0,0-1.52-20.84l-16-16a16,16,0,0,0-22.63,0l-64,64a16,16,0,0,0,0,22.63l16,16a16,16,0,0,0,20.83,1.52L96.69,124,31.31,189.38A25,25,0,0,0,66.63,224.7L132,159.32l7.17,7.16a16,16,0,0,0,1.52,20.84l16,16a16,16,0,0,0,22.63,0l64-64A16,16,0,0,0,243.32,116.69ZM80,104,64,88l64-64,16,16ZM55.32,213.38a9,9,0,0,1-12.69,0,9,9,0,0,1,0-12.68L108,135.32,120.69,148ZM101,105.66,145.66,61,195,110.34,150.35,155ZM168,192l-16-16,4-4h0l56-56h0l4-4,16,16Z"/></svg>',
5 'ns-programs': '<svg viewBox="0 0 256 256" fill="currentColor" class="h-6 w-6 shrink-0" aria-hidden="true" focusable="false"><path d="M223.85,47.12a16,16,0,0,0-15-15c-12.58-.75-44.73.4-71.41,27.07L132.69,64H74.36A15.91,15.91,0,0,0,63,68.68L28.7,103a16,16,0,0,0,9.07,27.16l38.47,5.37,44.21,44.21,5.37,38.49a15.94,15.94,0,0,0,10.78,12.92,16.11,16.11,0,0,0,5.1.83A15.91,15.91,0,0,0,153,227.3L187.32,193A15.91,15.91,0,0,0,192,181.64V123.31l4.77-4.77C223.45,91.86,224.6,59.71,223.85,47.12ZM74.36,80h42.33L77.16,119.52,40,114.34Zm74.41-9.45a76.65,76.65,0,0,1,59.11-22.47,76.46,76.46,0,0,1-22.42,59.16L128,164.68,91.32,128ZM176,181.64,141.67,216l-5.19-37.17L176,139.31Zm-74.16,9.5C97.34,201,82.29,224,40,224a8,8,0,0,1-8-8c0-42.29,23-57.34,32.86-61.85a8,8,0,0,1,6.64,14.56c-6.43,2.93-20.62,12.36-23.12,38.91,26.55-2.5,36-16.69,38.91-23.12a8,8,0,1,1,14.56,6.64Z"/></svg>',
6 'ns-progress': '<svg viewBox="0 0 256 256" fill="currentColor" class="h-6 w-6 shrink-0" aria-hidden="true" focusable="false"><path d="M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16H211.4L184.81,71.64l-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,0,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60L224,85.8V56a8,8,0,1,1,16,0Z"/></svg>',
7 'ns-partnerships': '<svg viewBox="0 0 256 256" fill="currentColor" class="h-6 w-6 shrink-0" aria-hidden="true" focusable="false"><path d="M254.3,107.91,228.78,56.85a16,16,0,0,0-21.47-7.15L182.44,62.13,130.05,48.27a8.14,8.14,0,0,0-4.1,0L73.56,62.13,48.69,49.7a16,16,0,0,0-21.47,7.15L1.7,107.9a16,16,0,0,0,7.15,21.47l27,13.51,55.49,39.63a8.06,8.06,0,0,0,2.71,1.25l64,16a8,8,0,0,0,7.6-2.1l55.07-55.08,26.42-13.21a16,16,0,0,0,7.15-21.46Zm-54.89,33.37L165,113.72a8,8,0,0,0-10.68.61C136.51,132.27,116.66,130,104,122L147.24,80h31.81l27.21,54.41ZM41.53,64,62,74.22,36.43,125.27,16,115.06Zm116,119.13L99.42,168.61l-49.2-35.14,28-56L128,64.28l9.8,2.59-45,43.68-.08.09a16,16,0,0,0,2.72,24.81c20.56,13.13,45.37,11,64.91-5L188,152.66Zm62-57.87-25.52-51L214.47,64,240,115.06Zm-87.75,92.67a8,8,0,0,1-7.75,6.06,8.13,8.13,0,0,1-1.95-.24L80.41,213.33a7.89,7.89,0,0,1-2.71-1.25L51.35,193.26a8,8,0,0,1,9.3-13l25.11,17.94L126,208.24A8,8,0,0,1,131.82,217.94Z"/></svg>'
8}>
9<#assign GID = 215701>
10<#assign ercs = ["ns-vision","ns-objectives","ns-policies","ns-programs","ns-progress","ns-partnerships"]>
11<#assign jas = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
12<section aria-labelledby="strategy-tabs-heading" class="container mx-auto px-4 py-12 sm:px-6">
13 <h2 id="strategy-tabs-heading" class="sr-only">National Sports Strategy 2031 sections</h2>
14 <#-- ACTIVE-TAB colour → Figma (node 2864:20023 = primary-600 #92722a gold on primary-50 #f9f7ed).
15 The AEGOV `.aegov-tab.tab-pills .tab-link` rule (specificity 0,2,0) sets
16 `--tab-link-active-fg: primary-900` + `--tab-link-active-bg: primary-100` DIRECTLY on the
17 button, so the `[--tab-link-active-*]` tokens on THIS container are inert (a declaration on
18 the closer element wins). The override therefore lives on the BUTTON as the `!important` BANG
19 variants `[--tab-link-active-fg:var(--color-primary-600)]! [--tab-link-active-bg:var(--color-primary-50)]!`
20 (same proven mechanism as the inactive `[--tab-link-fg:…]!` below) — an !important custom-property
21 decl beats the non-important AEGOV one regardless of specificity. `.tab-active` consumes them
22 (`color:var(--tab-link-active-fg)`; `background:var(--tab-link-active-bg)`), so the gold tracks
23 the JS tab toggle. Both bang strings are @source-safelisted in input.css (the FTL is not under
24 any @source glob). §6 NOTE: primary-600 #92722a on primary-50 = 4.19:1 — below the 4.5:1 AA bar
25 for this 16px label (passes AA-Large 3:1 only). This is an EXPLICIT, informed user choice
26 (2026-07-01) to match Figma pixel-exact, overriding the prior AA-passing primary-900/primary-100
27 (8.34:1). The container tokens below are kept as the inactive/hover scope. -->
28 <#-- Tablist accessible name is localized so AR screen-reader users don't hear English (4.1.2). -->
29 <#assign tablistLabel = (locale.getLanguage() == "ar")?then("أقسام الاستراتيجية", "Strategy sections")>
30 <#-- Inactive tab label/icon colour (§4a/§4d/§8-B = aeblack-600 #4b4f58):
31 the AEGOV pills rule `.tab-pills .tab-link` (specificity 0,2,0) re-sets `--tab-link-fg` to
32 aeblack-800 DIRECTLY on the button, so a plain single-class `[--tab-link-fg:…]` (0,1,0) — whether
33 on this container OR on the button — LOSES on specificity (verified: computed `--tab-link-fg`
34 stayed aeblack-800). Fix = put the IMPORTANT bang variant `[--tab-link-fg:…]!` on the button:
35 it emits `--tab-link-fg:var(--color-aeblack-600)!important`, and an `!important` custom-property
36 declaration beats the non-important `.tab-pills .tab-link` one regardless of specificity. It
37 leaves the ACTIVE tab GOLD untouched, because `.tab-active` sets `color` directly via
38 `--tab-link-active-fg` (NOT via `--tab-link-fg`). Label span + `fill=currentColor` icon both
39 inherit the button colour → gray when inactive, gold when active, tracking the JS `.tab-active`
40 toggle dynamically. §7-clean: AEGOV token utility, no custom CSS. Safelisted in input.css
41 (the bang variant must be JIT-compiled; the FTL is not under any @source glob). -->
42 <div class="aegov-tab tab-pills flex flex-col gap-6 lg:flex-row [--tab-link-active-bg:var(--color-primary-50)] [--tab-link-active-fg:var(--color-primary-600)]">
43 <ul class="tab-items flex flex-col shrink-0 gap-2 lg:w-72" role="tablist" aria-label="${tablistLabel}" aria-orientation="vertical" data-tabs-toggle="#nss-content">
44 <#list ercs as erc>
45 <#assign a = jas.getLatestArticleByExternalReferenceCode(GID, erc)!>
46 <#if a??>
47 <#assign title = a.getTitle(locale)!erc>
48 <li role="presentation">
49 <#-- TAB BORDER → Figma (node I2864:44997;2864:19837/…19842 = `border` = 1px #e1e3e5 grey).
50 The AEGOV `.aegov-tab.tab-pills .tab-link` rule (specificity 0,3,0) hard-sets
51 `border-width:2px`, giving a heavier edge than Figma's 1px (reads like a shadow/outline).
52 The plain `border` utility overrides it because aegov_css_postprocess hardens `.border` to
53 `border-width:1px!important` (an !important decl beats the non-important 2px rule regardless
54 of specificity — verified live: 2px→1px, colour unchanged). Colour stays via the more
55 specific `border-aeblack-100!`. §7-clean AEGOV utility, already compiled → NO theme rebuild. -->
56 <button type="button" class="tab-link ${(erc_index==0)?string('tab-active ','')}[--tab-link-fg:var(--color-aeblack-600)]! [--tab-link-active-fg:var(--color-primary-600)]! [--tab-link-active-bg:var(--color-primary-50)]! flex! w-full! flex-nowrap! items-center! justify-start! gap-3 rounded-lg border border-aeblack-100! px-4 py-3! text-start" id="nss-tab-${erc}" role="tab" aria-controls="nss-panel-${erc}" aria-selected="${(erc_index==0)?string('true','false')}" data-tabs-target="#nss-panel-${erc}">
57 ${icons[erc]}
58 <span>${title}</span>
59 </button>
60 </li>
61 </#if>
62 </#list>
63 </ul>
64 <#-- Figma 2853:69786 / 2878:116878 "Background+Shadow": 0.5px primary-500 (#b68a35) hairline +
65 16px radius, and NO box-shadow (the layer is *named* "Background+Shadow" but the Figma node
66 carries no drop-shadow — verified EN web + AR + mobile). The former `shadow-md` was removed to
67 match Figma (user 2026-07-07: "remove shadow ... in figma it doesn't have"). Border/radius are
68 already Figma-aligned (0.5px primary-500, rounded-2xl=16px) — untouched. `text-lg` sets the panel
69 BASE type to 18px so unstyled body content — the numbered/check list <li> items, which carry no
70 explicit size and were inheriting the 14px page base — renders at the Figma 18px; headings/
71 paragraphs keep their own explicit sizes. §7-clean AEGOV token utilities. border-[0.5px] is
72 JIT-safelisted in input.css (the FTL is not under any @source glob). -->
73 <div id="nss-content" class="min-w-0 flex-1 rounded-2xl border-[0.5px] border-primary-500 bg-whitely-50 p-6 sm:p-8 text-lg">
74 <#list ercs as erc>
75 <#assign a = jas.getLatestArticleByExternalReferenceCode(GID, erc)!>
76 <#if a??>
77 <#assign title = a.getTitle(locale)!erc>
78 <#-- The article stores one <dynamic-content language-id="xx_YY"> per locale; the bare
79 //dynamic-content XPath grabs the FIRST node (ar_SA) regardless of locale, so EN
80 leaked Arabic. Select the node whose language-id matches the CURRENT locale, then
81 fall back to the article default, then to ANY node. -->
82 <#assign langId = locale.toString()>
83 <#assign descEl = "//dynamic-element[@name='description']/dynamic-content">
84 <#assign node = a.getDocument().selectSingleNode(descEl + "[@language-id='" + langId + "']")!>
85 <#if !node??>
86 <#assign node = a.getDocument().selectSingleNode(descEl + "[@language-id='" + a.getDefaultLanguageId() + "']")!>
87 </#if>
88 <#if !node??>
89 <#assign node = a.getDocument().selectSingleNode(descEl)!>
90 </#if>
91 <#assign desc = "">
92 <#if node??><#assign desc = node.getText()!""></#if>
93 <div id="nss-panel-${erc}" role="tabpanel" aria-labelledby="nss-tab-${erc}" tabindex="0" class="${(erc_index==0)?string('','hidden')}">
94 <h2 class="text-5xl lg:text-h1 leading-[1.1] font-bold text-aeblack-800">${title}</h2>
95 ${desc}
96 </div>
97 </#if>
98 </#list>
99 </div>
100 </div>
101</section>
Did you find this content useful?
You can help us improve by providing your feedback about your experience.
United Arab Emirates
Ministry of Sports
Have you used our services at our service center or digitally recently?
Dear customer,
As part of the Zero Bureaucracy Initiative, which aims to improve customer satisfaction, streamline procedures, and speed up business processes in the Emirate of Dubai, we are pleased to announce that the process of issuing and managing commercial activity approvals for licensed sports establishments in Dubai has been transferred from the Ministry of Sports to the Dubai Sports Council, and then to the Invest in Dubai platform. Licensed sports establishments can complete all related approval procedures conveniently and efficiently through the Invest in Dubai platform https://app.invest.dubai.ae.
For more information or assistance, please contact via:
Email: licensing@dubaisc.ae
Phone: 045105555
Are you sure?
You are about to leave the site of the Ministry of Sports. Do you want to continue?

Post your comments
Please share your comments below so we can improve your experience.