PageSourceSearch

https://sampanews.sp.gov.br/web/sampa-news

html sampanews.sp.gov.br collected 2026-10-07 10:30:32 UTC 825,691 bytes, 19,126 lines download raw bytes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33	
34		
35		
36			<!DOCTYPE html>
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98<html class="ltr" dir="ltr" lang="pt-BR">
99
100<head>
101	<title>Home - Sampa News - Prefeitura</title>
102
103	<meta content="initial-scale=1.0, width=device-width" name="viewport" />
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136<meta content="text/html; charset=UTF-8" http-equiv="content-type" />
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151<script type="importmap">{"imports": {"@liferay/dynamic-data-mapping-form-field-type/api": "/o/dynamic-data-mapping-form-field-type/__liferay__/api.js","@clayui/alert": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$alert.js", "@clayui/autocomplete": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$autocomplete.js", "@clayui/badge": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$badge.js", "@clayui/breadcrumb": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$breadcrumb.js", "@clayui/button": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$button.js", "@clayui/card": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$card.js", "@clayui/color-picker": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$color-picker.js", "@clayui/core": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$core.js", "@clayui/data-provider": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$data-provider.js", "@clayui/date-picker": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$date-picker.js", "@clayui/drop-down": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$drop-down.js", "@clayui/empty-state": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$empty-state.js", "@clayui/form": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$form.js", "@clayui/icon": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$icon.js", "@clayui/label": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$label.js", "@clayui/layout": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$layout.js", "@clayui/link": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$link.js", "@clayui/list": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$list.js", "@clayui/loading-indicator": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$loading-indicator.js", "@clayui/localized-input": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$localized-input.js", "@clayui/management-toolbar": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$management-toolbar.js", "@clayui/modal": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$modal.js", "@clayui/multi-select": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$multi-select.js", "@clayui/multi-step-nav": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$multi-step-nav.js", "@clayui/nav": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$nav.js", "@clayui/navigation-bar": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$navigation-bar.js", "@clayui/pagination": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$pagination.js", "@clayui/pagination-bar": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$pagination-bar.js", "@clayui/panel": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$panel.js", "@clayui/popover": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$popover.js", "@clayui/progress-bar": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$progress-bar.js", "@clayui/provider": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$provider.js", "@clayui/shared": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$shared.js", "@clayui/slider": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$slider.js", "@clayui/sticker": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$sticker.js", "@clayui/table": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$table.js", "@clayui/tabs": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$tabs.js", "@clayui/time-picker": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$time-picker.js", "@clayui/toolbar": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$toolbar.js", "@clayui/tooltip": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$tooltip.js", "@clayui/upper-toolbar": "/o/frontend-js-clay-web/__liferay__/exports/@clayui$upper-toolbar.js","react": "/o/frontend-js-react-web/__liferay__/exports/react.js", "react-16": "/o/frontend-js-react-web/__liferay__/exports/react-16.js", "react-18": "/o/frontend-js-react-web/__liferay__/exports/react-18.js", "react-dom": "/o/frontend-js-react-web/__liferay__/exports/react-dom.js", "react-dom/client": "/o/frontend-js-react-web/__liferay__/exports/react-dom$client.js", "react-dom-16": "/o/frontend-js-react-web/__liferay__/exports/react-dom-16.js", "react-dom-18": "/o/frontend-js-react-web/__liferay__/exports/react-dom-18.js", "react-dom-18/client": "/o/frontend-js-react-web/__liferay__/exports/react-dom-18$client.js","@liferay/fragment-impl/api": "/o/fragment-impl/__liferay__/api.js","@ckeditor/ckeditor5-adapter-ckfinder/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-adapter-ckfinder$dist$index.js.js", "@ckeditor/ckeditor5-alignment/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-alignment$dist$index.js.js", "@ckeditor/ckeditor5-autoformat/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-autoformat$dist$index.js.js", "@ckeditor/ckeditor5-autosave/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-autosave$dist$index.js.js", "@ckeditor/ckeditor5-basic-styles/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-basic-styles$dist$index.js.js", "@ckeditor/ckeditor5-block-quote/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-block-quote$dist$index.js.js", "@ckeditor/ckeditor5-bookmark/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-bookmark$dist$index.js.js", "@ckeditor/ckeditor5-ckbox/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-ckbox$dist$index.js.js", "@ckeditor/ckeditor5-ckfinder/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-ckfinder$dist$index.js.js", "@ckeditor/ckeditor5-clipboard/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-clipboard$dist$index.js.js", "@ckeditor/ckeditor5-cloud-services/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-cloud-services$dist$index.js.js", "@ckeditor/ckeditor5-code-block/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-code-block$dist$index.js.js", "@ckeditor/ckeditor5-core/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-core$dist$index.js.js", "@ckeditor/ckeditor5-easy-image/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-easy-image$dist$index.js.js", "@ckeditor/ckeditor5-editor-balloon/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-editor-balloon$dist$index.js.js", "@ckeditor/ckeditor5-editor-classic/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-editor-classic$dist$index.js.js", "@ckeditor/ckeditor5-editor-decoupled/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-editor-decoupled$dist$index.js.js", "@ckeditor/ckeditor5-editor-inline/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-editor-inline$dist$index.js.js", "@ckeditor/ckeditor5-editor-multi-root/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-editor-multi-root$dist$index.js.js", "@ckeditor/ckeditor5-emoji/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-emoji$dist$index.js.js", "@ckeditor/ckeditor5-engine/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-engine$dist$index.js.js", "@ckeditor/ckeditor5-enter/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-enter$dist$index.js.js", "@ckeditor/ckeditor5-essentials/
151dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-essentials$dist$index.js.js", "@ckeditor/ckeditor5-find-and-replace/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-find-and-replace$dist$index.js.js", "@ckeditor/ckeditor5-font/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-font$dist$index.js.js", "@ckeditor/ckeditor5-fullscreen/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-fullscreen$dist$index.js.js", "@ckeditor/ckeditor5-heading/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-heading$dist$index.js.js", "@ckeditor/ckeditor5-highlight/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-highlight$dist$index.js.js", "@ckeditor/ckeditor5-horizontal-line/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-horizontal-line$dist$index.js.js", "@ckeditor/ckeditor5-html-embed/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-html-embed$dist$index.js.js", "@ckeditor/ckeditor5-html-support/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-html-support$dist$index.js.js", "@ckeditor/ckeditor5-icons/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-icons$dist$index.js.js", "@ckeditor/ckeditor5-image/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-image$dist$index.js.js", "@ckeditor/ckeditor5-indent/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-indent$dist$index.js.js", "@ckeditor/ckeditor5-language/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-language$dist$index.js.js", "@ckeditor/ckeditor5-link/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-link$dist$index.js.js", "@ckeditor/ckeditor5-list/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-list$dist$index.js.js", "@ckeditor/ckeditor5-markdown-gfm/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-markdown-gfm$dist$index.js.js", "@ckeditor/ckeditor5-media-embed/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-media-embed$dist$index.js.js", "@ckeditor/ckeditor5-mention/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-mention$dist$index.js.js", "@ckeditor/ckeditor5-minimap/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-minimap$dist$index.js.js", "@ckeditor/ckeditor5-page-break/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-page-break$dist$index.js.js", "@ckeditor/ckeditor5-paragraph/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-paragraph$dist$index.js.js", "@ckeditor/ckeditor5-paste-from-office/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-paste-from-office$dist$index.js.js", "@ckeditor/ckeditor5-react": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-react.js", "@ckeditor/ckeditor5-remove-format/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-remove-format$dist$index.js.js", "@ckeditor/ckeditor5-restricted-editing/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-restricted-editing$dist$index.js.js", "@ckeditor/ckeditor5-select-all/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-select-all$dist$index.js.js", "@ckeditor/ckeditor5-show-blocks/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-show-blocks$dist$index.js.js", "@ckeditor/ckeditor5-source-editing/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-source-editing$dist$index.js.js", "@ckeditor/ckeditor5-special-characters/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-special-characters$dist$index.js.js", "@ckeditor/ckeditor5-style/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-style$dist$index.js.js", "@ckeditor/ckeditor5-table/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-table$dist$index.js.js", "@ckeditor/ckeditor5-typing/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-typing$dist$index.js.js", "@ckeditor/ckeditor5-ui/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-ui$dist$index.js.js", "@ckeditor/ckeditor5-undo/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-undo$dist$index.js.js", "@ckeditor/ckeditor5-upload/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-upload$dist$index.js.js", "@ckeditor/ckeditor5-utils/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-utils$dist$index.js.js", "@ckeditor/ckeditor5-watchdog/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-watchdog$dist$index.js.js", "@ckeditor/ckeditor5-widget/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-widget$dist$index.js.js", "@ckeditor/ckeditor5-word-count/dist/index.js": "/o/frontend-editor-ckeditor-web/__liferay__/exports/@ckeditor$ckeditor5-word-count$dist$index.js.js","@liferay/frontend-js-api": "/o/frontend-js-dependencies-web/__liferay__/exports/@liferay$js-api.js", "@liferay/frontend-js-api/data-set": "/o/frontend-js-dependencies-web/__liferay__/exports/@liferay$js-api$data-set.js","@liferay/o
151auth2-provider-web/client": "/o/oauth2-provider-web/__liferay__/client.js","@liferay/language/": "/o/js/language/"}, "scopes": {}}</script>
151<link data-senna-track="temporary" href="https://sampanews.sp.gov.br" rel="canonical" />
152<link data-senna-track="temporary" href="https://sampanews.sp.gov.br" hreflang="es-ES" rel="alternate" />
153<link data-senna-track="temporary" href="https://sampanews.sp.gov.br" hreflang="en-US" rel="alternate" />
154<link data-senna-track="temporary" href="https://sampanews.sp.gov.br" hreflang="pt-BR" rel="alternate" />
155<link data-senna-track="temporary" href="https://sampanews.sp.gov.br" hreflang="x-default" rel="alternate" />
156
157<meta property="og:locale" content="pt_BR">
158<meta property="og:locale:alternate" content="pt_BR">
159<meta property="og:locale:alternate" content="en_US">
160<meta property="og:locale:alternate" content="es_ES">
161<meta property="og:site_name" content="Sampa News">
162<meta property="og:title" content="Home - Sampa News - Prefeitura">
163<meta property="og:type" content="website">
164<meta property="og:url" content="https://sampanews.sp.gov.br">
165<meta property="og:image" content="https://sampanews.sp.gov.br/documents/24771855/25160874/sampanews_LOGO_assinatura_500.png/b7e76827-8234-c797-6d5f-8da2b5389dde?version=1.0&amp;t=1754334121435&amp;imagePreview=1">
166<meta property="og:image:alt" content="Logo do portal Sampa News">
167<meta property="og:image:secure_url" content="https://sampanews.sp.gov.br/documents/24771855/25160874/sampanews_LOGO_assinatura_500.png/b7e76827-8234-c797-6d5f-8da2b5389dde?version=1.0&amp;t=1754334121435&amp;imagePreview=1">
168<meta property="og:image:type" content="image/png">
169<meta property="og:image:url" content="https://sampanews.sp.gov.br/documents/24771855/25160874/sampanews_LOGO_assinatura_500.png/b7e76827-8234-c797-6d5f-8da2b5389dde?version=1.0&amp;t=1754334121435&amp;imagePreview=1">
170<meta property="og:image:height" content="109">
171
172
173<link href="/documents/34276/218252/favicon/f1d6f5c5-0af6-78cf-5dbf-2af352d19752" rel="apple-touch-icon" />
174<link href="/documents/34276/218252/favicon/f1d6f5c5-0af6-78cf-5dbf-2af352d19752" rel="icon" />
175
176
177
178<link class="lfr-css-file" data-senna-track="temporary" href="/o/dialect-theme/css/clay.(FLVl71WwKTc).css" id="liferayAUICSS" rel="stylesheet" type="text/css" />
179
180
181
182
183
184
185
186
187
188	<link href="https://sampanews.sp.gov.br/o/cookies-banner-web/cookies_banner/css/main.(rrlPSd7LGsE).css" rel="stylesheet" type="text/css"
189 data-senna-track="temporary" id="e4ad11ab" />
190<link href="https://sampanews.sp.gov.br/o/portal-search-web/css/main.(ewQ02j$q6kw).css" rel="stylesheet" type="text/css"
191 data-senna-track="temporary" id="a9b8c218" />
192<link href="https://sampanews.sp.gov.br/o/product-navigation-product-menu-web/css/main.(i$0IgPwR2kk).css" rel="stylesheet" type="text/css"
193 data-senna-track="temporary" id="ebf5f43b" />
194<link href="https://sampanews.sp.gov.br/o/site-navigation-menu-web/css/main.(wnU1o3f4AJ0).css" rel="stylesheet" type="text/css"
195 data-senna-track="temporary" id="800909" />
196
197
198
199
200
201
202
203
204<script data-senna-track="temporary" type="text/javascript">
205(function() {
206	function buildESMStub(contextPath, symbol) {
207		return (
208			(...args) => {
209				import(
210					Liferay.ThemeDisplay.getCDNHost() +
211					Liferay.ThemeDisplay.getPathContext() +
212						'/o/' +
213						contextPath +
214						'/__liferay__/index.js'
215				).then(
216					(exports) => exports[symbol](...args)
217				);
218			}
219		);
220	}
221
222	function defineReadOnlyGlobal(name, getValue) {
223		Object.defineProperty(
224			window,
225			name,
226			{
227				get: getValue,
228				set: (x) => {
229					if (x !== getValue()) {
230						console.error(`Global variable '${name}' is read-only`);
231					}
232				}
233			}
234		);
235	}
236
237	function isObject(item) {
238		return (item && typeof item === 'object' && !Array.isArray(item));
239	}
240
241	function merge(target, source) {
242		for (const key in source) {
243			if (isObject(source[key])) {
244				if (!target[key]) {
245					Object.assign(target, { [key]: {} });
246				}
247
248				merge(target[key], source[key]);
249			}
250			else {
251				Object.assign(target, { [key]: source[key] });
252			}
253		}
254	}
255
256	let __liferay = {
257AUI: {
258getCombine: () => true,
259getComboPath: () => '/combo/?browserId=chrome&minifierType=&languageId=pt_BR&t=1790649509599&',
260getDateFormat: () => '%d/%m/%Y',
261getEditorCKEditorPath: () => '/o/frontend-editor-ckeditor-web',
262getFilter: () => 'min',
263getFilterConfig: () => null,
264getJavaScriptRootPath: () => '/o/frontend-js-web',
265getPortletRootPath: () => '/html/portlet',
266getStaticResourceURLParams: () => '?browserId=chrome&minifierType=&languageId=pt_BR&t=1790649509599',
267},
268Browser: {
269acceptsGzip: () => true,
270getMajorVersion: () => '128.0',
271getRevision: () => '537.36',
272getVersion: () => '128.0',
273isAir: () => false,
274isChrome: () => true,
275isEdge: () => false,
276isFirefox: () => false,
277isGecko: () => true,
278isIe: () => false,
279isIphone: () => false,
280isLinux: () => false,
281isMac: () => false,
282isMobile: () => false,
283isMozilla: () => false,
284isOpera: () => false,
285isRtf: () => true,
286isSafari: () => true,
287isSun: () => false,
288isWebKit: () => true,
289isWindows: () => false,
290},
291Data: {
292ICONS_INLINE_SVG: true,
293NAV_SELECTOR: '#navigation',
294NAV_SELECTOR_MOBILE: '#navigationCollapse',
295isCustomizationView: () => false,
296notices: [
297],
298},
299FeatureFlags: {
300'LPD-11342': false,
301'LPD-23840': false,
302'LPD-36010': true,
303'LPD-36719': true,
304'LPD-39203': false,
305'LPD-40529': true,
306'LPD-48372': true,
307'LPD-48975': true,
308'LPD-78863': true,
309'LPS-157670': false,
310'LPS-172416': false,
311'LPS-183672': false,
312'LPS-186360': false,
313'LRAC-14771': false,
314'COMMERCE-13024': false,
315'COMMERCE-8087': false,
316'COMMERCE-8949': false,
317'LPD-10562': false,
318'LPD-10964': false,
319'LPD-11003': false,
320'LPD-11131': true,
321'LPD-11228': false,
322'LPD-11235': false,
323'LPD-11313': false,
324'LPD-11848': false,
325'LPD-13311': true,
326'LPD-13778': true,
327'LPD-17564': false,
328'LPD-19870': false,
329'LPD-19955': false,
330'LPD-20183': false,
331'LPD-20379': false,
332'LPD-20640': false,
333'LPD-21414': false,
334'LPD-29516': false,
335'LPD-31212': false,
336'LPD-31228': false,
337'LPD-31789': false,
338'LPD-32867': false,
339'LPD-34594': false,
340'LPD-35013': true,
341'LPD-35128': false,
342'LPD-35443': false,
343'LPD-36105': false,
344'LPD-38564': false,
345'LPD-38869': false,
346'LPD-39304': true,
347'LPD-39437': false,
348'LPD-40530': true,
349'LPD-40533': true,
350'LPD-40534': true,
351'LPD-40535': true,
352'LPD-42553': false,
353'LPD-43996': false,
354'LPD-44091': true,
355'LPD-44307': true,
356'LPD-44771': true,
357'LPD-45276': false,
358'LPD-47713': true,
359'LPD-48862': true,
360'LPD-51356': false,
361'LPD-56718': false,
362'LPD-57655': false,
363'LPD-58677': false,
364'LPD-60546': true,
365'LPD-62272': false,
366'LPD-63311': false,
367'LPD-63415': false,
368'LPD-63416': false,
369'LPD-6368': false,
370'LPD-65299': false,
371'LPD-65399': false,
372'LPD-66359': false,
373'LPD-66611': true,
374'LPD-74328': false,
375'LPD-74739': true,
376'LPD-75032': false,
377'LPD-75525': false,
378'LPD-7822': false,
379'LPS-122920': false,
380'LPS-135430': false,
381'LPS-153332': false,
382'LPS-153714': false,
383'LPS-153813': false,
384'LPS-155284': false,
385'LPS-159643': false,
386'LPS-164563': false,
387'LPS-165482': false,
388'LPS-169837': false,
389'LPS-170670': false,
390'LPS-174417': false,
391'LPS-174816': false,
392'LPS-176691': false,
393'LPS-177027': false,
394'LPS-178052': false,
395'LPS-178642': false,
396'LPS-180090': false,
397'LPS-185892': false,
398'LPS-186620': false,
399'LPS-193884': false,
400'LPS-196935': false,
401'LPS-197477': false,
402'LPS-197909': false,
403'LPS-198183': false,
404'LPS-200108': false,
405'LPS-202104': false,
406'LRAC-10757': false,
407'LRAC-15017': false,
408},
409Language: {
410	_cache:
411		window?.Liferay?.Language?._cache
412			? Liferay.Language._cache
413			: {},
414	available: {
415'pt_BR': 'português\x20\x28Brasil\x29',
416'en_US': 'English\x20\x28United\x20States\x29',
417'es_ES': 'español\x20\x28España\x29',
418
419	},
420	direction: {
421'pt_BR': 'ltr',
422'en_US': 'ltr',
423'es_ES': 'ltr',
424
425	},
426	get:
427		(key) => {
428			let value = Liferay.Language._cache[key];
429
430			if (value === undefined) {
431				value = key;
432			}
433
434			return value;
435		},
436},
437Portlet: {
438openModal: buildESMStub('frontend-js-components-web', 'openPortletModal'),
439openWindow: buildESMStub('frontend-js-components-web', 'openPortletWindow'),
440},
441PortletKeys: {
442DOCUMENT_LIBRARY: 'com_liferay_document_library_web_portlet_DLPortlet',
443DYNAMIC_DATA_MAPPING: 'com_liferay_dynamic_data_mapping_web_portlet_DDMPortlet',
444INSTANCE_SETTINGS: 'com_liferay_configuration_admin_web_portlet_InstanceSettingsPortlet',
445ITEM_SELECTOR: 'com_liferay_item_selector_web_portlet_ItemSelectorPortlet',
446},
447PropsValues: {
448JAVASCRIPT_SINGLE_PAGE_APPLICATION_TIMEOUT: 0,
449UPLOAD_SERVLET_REQUEST_IMPL_MAX_SIZE: 1048576000,
450},
451ThemeDisplay: {
452getLayoutId: () => '5',
453getLayoutRelativeControlPanelURL: () => '/group/sampa-news/~/control_panel/manage',
454getLayoutRelativeURL: () => '/home',
455getLayoutURL: () => 'https://sampanews.sp.gov.br/home',
456getParentLayoutId: () => '0',
457getPathFriendlyURLPublic: () => '/web',
458isControlPanel: () => false,
459isPrivateLayout: () => false,
460isVirtualLayout: () => false,
461getBCP47LanguageId: () => 'pt-BR',
462getCanonicalURL: () => 'https\x3a\x2f\x2fsampanews\x2esp\x2egov\x2ebr',
463getCDNBaseURL: () => 'https://sampanews.sp.gov.br',
464getCDNDynamicResourcesHost: () => '',
465getCDNHost: () => '',
466getCompanyGroupId: () => '20121',
467getCompanyId: () => '20095',
468getDefaultLanguageId: () => 'pt_BR',
469getDoAsUserIdEncoded: () => '',
470getLanguageId: () => 'pt_BR',
471getParentGroupId: () => '24771855',
472getParentSiteGroupId: () => '34276',
473getPathContext: () => '',
474getPathImage: () => '/image',
475getPathJavaScript: () => '/o/frontend-js-web',
476getPathMain: () => '/c',
477getPathThemeImages: () => 'https://sampanews.sp.gov.br/o/dialect-theme/images',
478getPathThemeRoot: () => '/o/dialect-theme',
479getPlid: () => '24449',
480getPortalURL: () => 'https://sampanews.sp.gov.br',
481getRealUserId: () => '20097',
482getRemoteAddr: () => '181.215.65.35',
483getRemoteHost: () => '181.215.65.35',
484getScopeGroupId: () => '24771855',
485getScopeGroupIdOrLiveGroupId: () => '24771855',
486getSessionId: () => '',
487getSiteAdminURL: () => 'https://sampanews.sp.gov.br/group/sampa-news/~/control_panel/manage?p_p_lifecycle=0&p_p_state=maximized&p_p_mode=view',
488getSiteGroupId: () => '24771855',
489getTimeZone: () => 'America/Sao_Paulo',
490getURLControlPanel: () => '/group/control_panel?refererPlid=24449',
491getURLHome: () => 'https\x3a\x2f\x2fsampanews\x2esp\x2egov\x2ebr\x2fweb\x2fprefeitura-de-sao-paulo\x2f',
492getUserEmailAddress: () => '',
493getUserId: () => '20097',
494getUserName: () => '',
495isAddSessionIdToURL: () => false,
496isImpersonated: () => false,
497isSignedIn: () => false,
498isStagedPortlet: () => false,
499isStateExclusive: () => false,
500isStateMaximized: () => false,
501isStatePopUp: () => false,
502},
503Util: {
504Window: {
505	_map: {},
506	getById: (id) => Liferay.Util.Window._map[id],
507},
508openAlertModal: buildESMStub('frontend-js-components-web', 'openAlertModal'),
509openConfirmModal: buildESMStub('frontend-js-components-web', 'openConfirmModal'),
510openModal: buildESMStub('frontend-js-components-web', 'openModal'),
511openSelectionModal: buildESMStub('frontend-js-components-web', 'openSelectionModal'),
512openSimpleInputModal: buildESMStub('frontend-js-components-web', 'openSimpleInputModal'),
513openToast: buildESMStub('frontend-js-components-web', 'openToast'),
514},
515authToken: '9gTx8Zcu',
516currentURL: '\x2fweb\x2fsampa-news',
517currentURLEncoded: '\x252Fweb\x252Fsampa-news',
518
519	};
520
521	if (window.Liferay) {
522		merge(window.Liferay, __liferay);
523	}
524	else {
525		defineReadOnlyGlobal('Liferay', () => __liferay);
526		defineReadOnlyGlobal('themeDisplay', () => window.Liferay.ThemeDisplay);
527	}
528})();
529</script>
vendor: 1 bytes, line 529
529
530<script data-senna-track="permanent" src="/o/portal-url-builder-impl/Liferay.js" type="text/javascript"></script>
530<script data-senna-track="permanent" src="/combo?browserId=chrome&minifierType=js&languageId=pt_BR&t=1790649509599&/o/frontend-js-aui-web/aui/aui/aui-min.js&/o/frontend-js-aui-web/liferay/modules.js&/o/frontend-js-aui-web/liferay/aui_sandbox.js&/o/frontend-js-aui-web/aui/attribute-base/attribute-base-min.js&/o/frontend-js-aui-web/aui/attribute-complex/attribute-complex-min.js&/o/frontend-js-aui-web/aui/attribute-core/attribute-core-min.js&/o/frontend-js-aui-web/aui/attribute-observable/attribute-observable-min.js&/o/frontend-js-aui-web/aui/attribute-extras/attribute-extras-min.js&/o/frontend-js-aui-web/aui/event-custom-base/event-custom-base-min.js&/o/frontend-js-aui-web/aui/event-custom-complex/event-custom-complex-min.js&/o/frontend-js-aui-web/aui/oop/oop-min.js&/o/frontend-js-aui-web/aui/aui-base-lang/aui-base-lang-min.js&/o/frontend-js-aui-web/liferay/dependency.js" type="text/javascript"></script>
vendor: 1 bytes, line 530
530
531<script data-senna-track="permanent" src="/o/frontend-js-web/Liferay.js" type="text/javascript"></script>
vendor: 1 bytes, line 531
531
532<script data-senna-track="permanent" type="module">await import(`@liferay/language/${Liferay.ThemeDisplay.getLanguageId()}/frontend-js-web/all.js`);</script>
vendor: 1 bytes, line 532
532
533<script data-senna-track="temporary" type="text/javascript">window.__CONFIG__= {basePath: '', combine: true, defaultURLParams: null, explainResolutions: false, exposeGlobal: false, logLevel: 'warn', moduleType: 'module', namespace:'Liferay', nonce: '', reportMismatchedAnonymousModules: 'warn', resolvePath: '/o/js_resolve_modules', url: '/combo/?browserId=chrome&minifierType=js&languageId=pt_BR&t=1790649509599&', waitTimeout: 60000};</script>
533<script data-senna-track="permanent" src="/o/frontend-js-loader-modules-extender/loader.js" type="text/javascript"></script>
533<script data-senna-track="temporary">Liferay.Icons = Liferay.Icons || {};Liferay.Icons.controlPanelSpritemap = 'https://sampanews.sp.gov.br/o/admin-theme/images/clay/icons.svg'; Liferay.Icons.spritemap = 'https://sampanews.sp.gov.br/o/dialect-theme/images/clay/icons.svg';</script>
vendor: 1 bytes, line 533
533
534<script data-senna-track="permanent" type="text/javascript">window.Liferay.CSP = {nonce: ''};</script>
vendor: 1 bytes, line 534
534
535<script data-senna-track="permanent" src="/o/oauth2-provider-web/__liferay__/global.js" type="module"></script>
vendor: 1 bytes, line 535
535
536<script data-senna-track="temporary" type="text/javascript">window.Liferay = Liferay || {}; window.Liferay.OAuth2 = {getAuthorizeURL: function() {return 'https://sampanews.sp.gov.br/o/oauth2/authorize';}, getBuiltInRedirectURL: function() {return 'https://sampanews.sp.gov.br/o/oauth2/redirect';}, getIntrospectURL: function() { return 'https://sampanews.sp.gov.br/o/oauth2/introspect';}, getTokenURL: function() {return 'https://sampanews.sp.gov.br/o/oauth2/token';}, getUserAgentApplication: function(externalReferenceCode) {return Liferay.OAuth2._userAgentApplications[externalReferenceCode];}, _userAgentApplications: {}}</script>
536<script data-senna-track="temporary" type="text/javascript">try {var MODULE_MAIN='[email protected]/index';var MODULE_PATH='/o/frontend-editor-alloyeditor-web';/**
537 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
538 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
539 */
540
541(function () {
542	AUI().applyConfig({
543		groups: {
544			alloyeditor: {
545				base: MODULE_PATH + '/js/legacy/',
546				combine: Liferay.AUI.getCombine(),
547				filter: Liferay.AUI.getFilterConfig(),
548				modules: {
549					'liferay-alloy-editor': {
550						path: 'alloyeditor.js',
551						requires: [
552							'aui-component',
553							'liferay-portlet-base',
554							'timers',
555						],
556					},
557					'liferay-alloy-editor-source': {
558						path: 'alloyeditor_source.js',
559						requires: [
560							'aui-debounce',
561							'liferay-fullscreen-source-editor',
562							'liferay-source-editor',
563							'plugin',
564						],
565					},
566					'liferay-fullscreen-source-editor': {
567						path: 'fullscreen_source_editor.js',
568						requires: ['liferay-source-editor'],
569					},
570					'liferay-source-editor': {
571						path: 'source_editor.js',
572						requires: ['aui-ace-editor'],
573					},
574				},
575				root: MODULE_PATH + '/js/legacy/',
576			},
577		},
578	});
579})();
580} catch(error) {console.error(error);}try {var MODULE_MAIN='[email protected]/index';var MODULE_PATH='/o/calendar-web';/**
581 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
582 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
583 */
584
585(function () {
586	AUI().applyConfig({
587		groups: {
588			calendar: {
589				base: MODULE_PATH + '/js/legacy/',
590				combine: Liferay.AUI.getCombine(),
591				filter: Liferay.AUI.getFilterConfig(),
592				modules: {
593					'liferay-calendar-a11y': {
594						path: 'calendar_a11y.js',
595						requires: ['calendar'],
596					},
597					'liferay-calendar-container': {
598						path: 'calendar_container.js',
599						requires: [
600							'aui-alert',
601							'aui-base',
602							'aui-component',
603							'liferay-portlet-base',
604						],
605					},
606					'liferay-calendar-date-picker-sanitizer': {
607						path: 'date_picker_sanitizer.js',
608						requires: ['aui-base'],
609					},
610					'liferay-calendar-interval-selector': {
611						path: 'interval_selector.js',
612						requires: ['aui-base', 'liferay-portlet-base'],
613					},
614					'liferay-calendar-interval-selector-scheduler-event-link': {
615						path: 'interval_selector_scheduler_event_link.js',
616						requires: ['aui-base', 'liferay-portlet-base'],
617					},
618					'liferay-calendar-list': {
619						path: 'calendar_list.js',
620						requires: [
621							'aui-template-deprecated',
622							'liferay-scheduler',
623						],
624					},
625					'liferay-calendar-message-util': {
626						path: 'message_util.js',
627						requires: ['liferay-util-window'],
628					},
629					'liferay-calendar-recurrence-converter': {
630						path: 'recurrence_converter.js',
631						requires: [],
632					},
633					'liferay-calendar-recurrence-dialog': {
634						path: 'recurrence.js',
635						requires: [
636							'aui-base',
637							'liferay-calendar-recurrence-util',
638						],
639					},
640					'liferay-calendar-recurrence-util': {
641						path: 'recurrence_util.js',
642						requires: ['aui-base', 'liferay-util-window'],
643					},
644					'liferay-calendar-reminders': {
645						path: 'calendar_reminders.js',
646						requires: ['aui-base'],
647					},
648					'liferay-calendar-remote-services': {
649						path: 'remote_services.js',
650						requires: [
651							'aui-base',
652							'aui-component',
653							'liferay-calendar-util',
654							'liferay-portlet-base',
655						],
656					},
657					'liferay-calendar-session-listener': {
658						path: 'session_listener.js',
659						requires: ['aui-base', 'liferay-scheduler'],
660					},
661					'liferay-calendar-simple-color-picker': {
662						path: 'simple_color_picker.js',
663						requires: ['aui-base', 'aui-template-deprecated'],
664					},
665					'liferay-calendar-simple-menu': {
666						path: 'simple_menu.js',
667						requires: [
668							'aui-base',
669							'aui-template-deprecated',
670							'event-outside',
671							'event-touch',
672							'widget-modality',
673							'widget-position',
674							'widget-position-align',
675							'widget-position-constrain',
676							'widget-stack',
677							'widget-stdmod',
678						],
679					},
680					'liferay-calendar-util': {
681						path: 'calendar_util.js',
682						requires: [
683							'aui-datatype',
684							'aui-io',
685							'aui-scheduler',
686							'aui-toolbar',
687							'autocomplete',
688							'autocomplete-highlighters',
689						],
690					},
691					'liferay-scheduler': {
692						path: 'scheduler.js',
693						requires: [
694							'async-queue',
695							'aui-datatype',
696							'aui-scheduler',
697							'dd-plugin',
698							'liferay-calendar-a11y',
699							'liferay-calendar-message-util',
700							'liferay-calendar-recurrence-converter',
701							'liferay-calendar-recurrence-util',
702							'liferay-calendar-util',
703							'liferay-scheduler-event-recorder',
704							'liferay-scheduler-models',
705							'promise',
706							'resize-plugin',
707						],
708					},
709					'liferay-scheduler-event-recorder': {
710						path: 'scheduler_event_recorder.js',
711						requires: [
712							'dd-plugin',
713							'liferay-calendar-util',
714							'resize-plugin',
715						],
716					},
717					'liferay-scheduler-models': {
718						path: 'scheduler_models.js',
719						requires: [
720							'aui-datatype',
721							'dd-plugin',
722							'liferay-calendar-util',
723						],
724					},
725				},
726				root: MODULE_PATH + '/js/legacy/',
727			},
728		},
729	});
730})();
731} catch(error) {console.error(error);}try {var MODULE_MAIN='@liferay/[email protected]/index';var MODULE_PATH='/o/layout-js-components-web';/**
732 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
733 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
734 */
735
736(function () {
737	AUI().applyConfig({
738		groups: {
739			layout: {
740				base: MODULE_PATH + '/js/legacy/',
741				combine: Liferay.AUI.getCombine(),
742				filter: Liferay.AUI.getFilterConfig(),
743				modules: {
744					'liferay-layout': {
745						path: 'layout.js',
746					},
747					'liferay-layout-column': {
748						path: 'layout_column.js',
749						requires: ['aui-sortable-layout', 'dd'],
750					},
751				},
752				root: MODULE_PATH + '/js/legacy/',
753			},
754		},
755	});
756})();
757} catch(error) {console.error(error);}try {var MODULE_MAIN='@liferay/[email protected]/index';var MODULE_PATH='/o/frontend-js-state-web';/**
758 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
759 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
760 */
761
762(function () {
763	AUI().applyConfig({
764		groups: {
765			state: {
766
767				// eslint-disable-next-line
768				mainModule: MODULE_MAIN,
769			},
770		},
771	});
772})();
773} catch(error) {console.error(error);}try {var MODULE_MAIN='@liferay/[email protected]/index';var MODULE_PATH='/o/frontend-js-react-web';/**
774 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
775 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
776 */
777
778(function () {
779	AUI().applyConfig({
780		groups: {
781			react: {
782
783				// eslint-disable-next-line
784				mainModule: MODULE_MAIN,
785			},
786		},
787	});
788})();
789} catch(error) {console.error(error);}try {var MODULE_MAIN='[email protected]/index';var MODULE_PATH='/o/portal-search-web';/**
790 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
791 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
792 */
793
794(function () {
795	AUI().applyConfig({
796		groups: {
797			search: {
798				base: MODULE_PATH + '/js/',
799				combine: Liferay.AUI.getCombine(),
800				filter: Liferay.AUI.getFilterConfig(),
801				modules: {
802					'liferay-search-custom-range-facet': {
803						path: 'custom_range_facet.js',
804						requires: ['aui-form-validator'],
805					},
806				},
807				root: MODULE_PATH + '/js/',
808			},
809		},
810	});
811})();
812} catch(error) {console.error(error);}try {var MODULE_MAIN='@liferay/[email protected]/index';var MODULE_PATH='/o/document-library-web';/**
813 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
814 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
815 */
816
817(function () {
818	AUI().applyConfig({
819		groups: {
820			dl: {
821				base: MODULE_PATH + '/js/legacy/',
822				combine: Liferay.AUI.getCombine(),
823				filter: Liferay.AUI.getFilterConfig(),
824				modules: {
825					'document-library-upload-component': {
826						path: 'DocumentLibraryUpload.js',
827						requires: [
828							'aui-component',
829							'aui-data-set-deprecated',
830							'aui-overlay-manager-deprecated',
831							'aui-overlay-mask-deprecated',
832							'aui-parse-content',
833							'aui-progressbar',
834							'aui-template-deprecated',
835							'liferay-search-container',
836							'querystring-parse-simple',
837							'uploader',
838						],
839					},
840				},
841				root: MODULE_PATH + '/js/legacy/',
842			},
843		},
844	});
845})();
846} catch(error) {console.error(error);}try {var MODULE_MAIN='[email protected]/index';var MODULE_PATH='/o/portal-workflow-kaleo-designer-web';/**
847 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
848 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
849 */
850
851(function () {
852	AUI().applyConfig({
853		groups: {
854			'kaleo-designer': {
855				base: MODULE_PATH + '/designer/js/legacy/',
856				combine: Liferay.AUI.getCombine(),
857				filter: Liferay.AUI.getFilterConfig(),
858				modules: {
859					'liferay-kaleo-designer-autocomplete-util': {
860						path: 'autocomplete_util.js',
861						requires: ['autocomplete', 'autocomplete-highlighters'],
862					},
863					'liferay-kaleo-designer-definition-diagram-controller': {
864						path: 'definition_diagram_controller.js',
865						requires: [
866							'liferay-kaleo-designer-field-normalizer',
867							'liferay-kaleo-designer-utils',
868						],
869					},
870					'liferay-kaleo-designer-dialogs': {
871						path: 'dialogs.js',
872						requires: ['liferay-util-window'],
873					},
874					'liferay-kaleo-designer-editors': {
875						path: 'editors.js',
876						requires: [
877							'aui-ace-editor',
878							'aui-ace-editor-mode-xml',
879							'aui-base',
880							'aui-datatype',
881							'aui-node',
882							'liferay-kaleo-designer-autocomplete-util',
883							'liferay-kaleo-designer-utils',
884						],
885					},
886					'liferay-kaleo-designer-field-normalizer': {
887						path: 'field_normalizer.js',
888						requires: ['liferay-kaleo-designer-remote-services'],
889					},
890					'liferay-kaleo-designer-nodes': {
891						path: 'nodes.js',
892						requires: [
893							'aui-datatable',
894							'aui-datatype',
895							'aui-diagram-builder',
896							'liferay-kaleo-designer-editors',
897							'liferay-kaleo-designer-utils',
898						],
899					},
900					'liferay-kaleo-designer-remote-services': {
901						path: 'remote_services.js',
902						requires: ['aui-io'],
903					},
904					'liferay-kaleo-designer-templates': {
905						path: 'templates.js',
906						requires: ['aui-tpl-snippets-deprecated'],
907					},
908					'liferay-kaleo-designer-utils': {
909						path: 'utils.js',
910						requires: [],
911					},
912					'liferay-kaleo-designer-xml-definition': {
913						path: 'xml_definition.js',
914						requires: [
915							'aui-base',
916							'aui-component',
917							'dataschema-xml',
918							'datatype-xml',
919						],
920					},
921					'liferay-kaleo-designer-xml-definition-serializer': {
922						path: 'xml_definition_serializer.js',
923						requires: ['escape', 'liferay-kaleo-designer-xml-util'],
924					},
925					'liferay-kaleo-designer-xml-util': {
926						path: 'xml_util.js',
927						requires: ['aui-base'],
928					},
929					'liferay-portlet-kaleo-designer': {
930						path: 'main.js',
931						requires: [
932							'aui-ace-editor',
933							'aui-ace-editor-mode-xml',
934							'aui-tpl-snippets-deprecated',
935							'dataschema-xml',
936							'datasource',
937							'datatype-xml',
938							'event-valuechange',
939							'io-form',
940							'liferay-kaleo-designer-autocomplete-util',
941							'liferay-kaleo-designer-editors',
942							'liferay-kaleo-designer-nodes',
943							'liferay-kaleo-designer-remote-services',
944							'liferay-kaleo-designer-utils',
945							'liferay-kaleo-designer-xml-util',
946							'liferay-util-window',
947						],
948					},
949				},
950				root: MODULE_PATH + '/designer/js/legacy/',
951			},
952		},
953	});
954})();
955} catch(error) {console.error(error);}try {var MODULE_MAIN='[email protected]/index';var MODULE_PATH='/o/frontend-js-components-web';/**
956 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
957 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
958 */
959
960(function () {
961	AUI().applyConfig({
962		groups: {
963			components: {
964
965				// eslint-disable-next-line
966				mainModule: MODULE_MAIN,
967			},
968		},
969	});
970})();
971} catch(error) {console.error(error);}try {var MODULE_MAIN='[email protected]/index';var MODULE_PATH='/o/frontend-editor-ckeditor-web';/**
972 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
973 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
974 */
975
976(function () {
977	AUI().applyConfig({
978		groups: {
979			editor: {
980				base: MODULE_PATH + '/js/legacy/',
981				combine: Liferay.AUI.getCombine(),
982				filter: Liferay.AUI.getFilterConfig(),
983				modules: {
984					'inline-editor-ckeditor': {
985						path: 'main.js',
986						requires: [
987							'array-invoke',
988							'liferay-inline-editor-base',
989							'node-event-simulate',
990							'overlay',
991							'yui-later',
992						],
993					},
994					'liferay-inline-editor-base': {
995						path: 'inline_editor_base.js',
996						requires: ['aui-base', 'aui-overlay-base-deprecated'],
997					},
998				},
999				root: MODULE_PATH + '/js/legacy/',
1000			},
1001		},
1002	});
1003})();
1004} catch(error) {console.error(error);}try {var MODULE_MAIN='[email protected]/index';var MODULE_PATH='/o/contacts-web';/**
1005 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
1006 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
1007 */
1008
1009(function () {
1010	AUI().applyConfig({
1011		groups: {
1012			contactscenter: {
1013				base: MODULE_PATH + '/js/legacy/',
1014				combine: Liferay.AUI.getCombine(),
1015				filter: Liferay.AUI.getFilterConfig(),
1016				modules: {
1017					'liferay-contacts-center': {
1018						path: 'main.js',
1019						requires: [
1020							'aui-io-plugin-deprecated',
1021							'aui-toolbar',
1022							'autocomplete-base',
1023							'datasource-io',
1024							'json-parse',
1025							'liferay-portlet-base',
1026							'liferay-util-window',
1027						],
1028					},
1029				},
1030				root: MODULE_PATH + '/js/legacy/',
1031			},
1032		},
1033	});
1034})();
1035} catch(error) {console.error(error);}try {var MODULE_MAIN='[email protected]/index';var MODULE_PATH='/o/exportimport-web';/**
1036 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
1037 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
1038 */
1039
1040(function () {
1041	AUI().applyConfig({
1042		groups: {
1043			exportimportweb: {
1044				base: MODULE_PATH + '/js/legacy/',
1045				combine: Liferay.AUI.getCombine(),
1046				filter: Liferay.AUI.getFilterConfig(),
1047				modules: {
1048					'liferay-export-import-export-import': {
1049						path: 'main.js',
1050						requires: [
1051							'aui-datatype',
1052							'aui-dialog-iframe-deprecated',
1053							'aui-modal',
1054							'aui-parse-content',
1055							'aui-toggler',
1056							'liferay-portlet-base',
1057							'liferay-util-window',
1058						],
1059					},
1060				},
1061				root: MODULE_PATH + '/js/legacy/',
1062			},
1063		},
1064	});
1065})();
1066} catch(error) {console.error(error);}try {var MODULE_MAIN='[email protected]/index';var MODULE_PATH='/o/staging-processes-web';/**
1067 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
1068 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
1069 */
1070
1071(function () {
1072	AUI().applyConfig({
1073		groups: {
1074			stagingprocessesweb: {
1075				base: MODULE_PATH + '/js/legacy/',
1076				combine: Liferay.AUI.getCombine(),
1077				filter: Liferay.AUI.getFilterConfig(),
1078				modules: {
1079					'liferay-staging-processes-export-import': {
1080						path: 'main.js',
1081						requires: [
1082							'aui-datatype',
1083							'aui-dialog-iframe-deprecated',
1084							'aui-modal',
1085							'aui-parse-content',
1086							'aui-toggler',
1087							'liferay-portlet-base',
1088							'liferay-util-window',
1089						],
1090					},
1091				},
1092				root: MODULE_PATH + '/js/legacy/',
1093			},
1094		},
1095	});
1096})();
1097} catch(error) {console.error(error);}try {var MODULE_MAIN='[email protected]/index';var MODULE_PATH='/o/dynamic-data-mapping-web';/**
1098 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
1099 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0
1099-2023-06
1100 */
1101
1102(function () {
1103	const LiferayAUI = Liferay.AUI;
1104
1105	AUI().applyConfig({
1106		groups: {
1107			ddm: {
1108				base: MODULE_PATH + '/js/legacy/',
1109				combine: Liferay.AUI.getCombine(),
1110				filter: LiferayAUI.getFilterConfig(),
1111				modules: {
1112					'liferay-ddm-form': {
1113						path: 'ddm_form.js',
1114						requires: [
1115							'aui-base',
1116							'aui-datatable',
1117							'aui-datatype',
1118							'aui-image-viewer',
1119							'aui-parse-content',
1120							'aui-set',
1121							'aui-sortable-list',
1122							'json',
1123							'liferay-form',
1124							'liferay-map-base',
1125							'liferay-translation-manager',
1126							'liferay-util-window',
1127						],
1128					},
1129					'liferay-portlet-dynamic-data-mapping': {
1130						condition: {
1131							trigger: 'liferay-document-library',
1132						},
1133						path: 'main.js',
1134						requires: [
1135							'arraysort',
1136							'aui-form-builder-deprecated',
1137							'aui-form-validator',
1138							'aui-map',
1139							'aui-text-unicode',
1140							'json',
1141							'liferay-menu',
1142							'liferay-translation-manager',
1143							'liferay-util-window',
1144							'text',
1145						],
1146					},
1147					'liferay-portlet-dynamic-data-mapping-custom-fields': {
1148						condition: {
1149							trigger: 'liferay-document-library',
1150						},
1151						path: 'custom_fields.js',
1152						requires: ['liferay-portlet-dynamic-data-mapping'],
1153					},
1154					'liferay-translation-manager': {
1155						path: 'translation_manager.js',
1156						requires: ['aui-base'],
1157					},
1158				},
1159				root: MODULE_PATH + '/js/legacy/',
1160			},
1161		},
1162	});
1163})();
1164} catch(error) {console.error(error);}try {var MODULE_MAIN='[email protected]/index';var MODULE_PATH='/o/site-navigation-menu-web';/**
1165 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
1166 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
1167 */
1168
1169(function () {
1170	AUI().applyConfig({
1171		groups: {
1172			navigationmenuweb: {
1173				base: MODULE_PATH + '/js/legacy/',
1174				combine: Liferay.AUI.getCombine(),
1175				filter: Liferay.AUI.getFilterConfig(),
1176				modules: {
1177					'liferay-navigation-interaction': {
1178						path: 'navigation_interaction.js',
1179						plugins: {
1180							'liferay-navigation-interaction-touch': {
1181								condition: {
1182									name: 'liferay-navigation-interaction-touch',
1183									test(A) {
1184										return A.UA.touchEnabled;
1185									},
1186									trigger: 'liferay-navigation-interaction',
1187								},
1188							},
1189						},
1190						requires: [
1191							'aui-base',
1192							'aui-component',
1193							'event-mouseenter',
1194							'node-focusmanager',
1195							'plugin',
1196						],
1197					},
1198					'liferay-navigation-interaction-touch': {
1199						path: 'navigation_interaction_touch.js',
1200						requires: [
1201							'event-tap',
1202							'event-touch',
1203							'liferay-navigation-interaction',
1204						],
1205					},
1206				},
1207				root: MODULE_PATH + '/js/legacy/',
1208			},
1209		},
1210	});
1211})();
1212} catch(error) {console.error(error);}try {var MODULE_MAIN='@liferay/[email protected]/index';var MODULE_PATH='/o/image-uploader-web';/**
1213 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
1214 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
1215 */
1216
1217(function () {
1218	AUI().applyConfig({
1219		groups: {
1220			imageuploaderweb: {
1221				base: MODULE_PATH + '/js/legacy/',
1222				combine: Liferay.AUI.getCombine(),
1223				filter: Liferay.AUI.getFilterConfig(),
1224				modules: {
1225					'liferay-logo-editor': {
1226						path: 'logo_editor.js',
1227						requires: ['aui-image-cropper', 'liferay-portlet-base'],
1228					},
1229				},
1230				root: MODULE_PATH + '/js/legacy/',
1231			},
1232		},
1233	});
1234})();
1235} catch(error) {console.error(error);}</script>
1235
1236
1237
1238
1239
1240<script type="text/javascript" data-senna-track="temporary">
1241	// <![CDATA[
1242		
1243			
1244				
1245				
1246			
1247		
1248
1249		
1250	// ]]>
1251</script>
1251
1252
1253
1254
1255
1256
1257	
1258		
1259		
1260
1261			
1262
1263			
1264				
1264<script async src="https://www.googletagmanager.com/gtag/js?id=GFQF2C97ZC"></script>
1264
1265
1266				
1267			
1268		
1269		
1270	
1271
1272
1273
1274	
1275		
1276
1277			
1278
1279			
1280		
1281		
1282		
1283	
1284
1285
1286
1287	
1288		
1289		
1290		
1291
1292			
1293
1294			
1295		
1296	
1297
1298
1299
1300	
1301		
1302		
1303		
1304
1305			
1306
1307			
1308				<!-- Google tag (gtag.js) -->
vendor: 64 bytes, lines 1308-1309
1308
1309<script async src="https://www.googletagmanager.com/gtag/js?id=
1309G-GFQF2C97ZC
vendor: 12 bytes, line 1309
1309"></script>
1310<script>
1311  
vendor: 134 bytes, lines 1311-1315
1311window.dataLayer = window.dataLayer || [];
1312  function gtag(){dataLayer.push(arguments);}
1313  gtag('js', new Date());
1314
1315  gtag('config', '
1315G-GFQF2C97ZC
vendor: 4 bytes, line 1315
1315');
1316</script>
1316
1317			
1318		
1319	
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330	
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350<link class="lfr-css-file" data-senna-track="temporary" href="/o/dialect-theme/css/main.(zDuvzazvJSk).css" id="liferayThemeCSS" rel="stylesheet" type="text/css" />
1351
1352
1353
1354
1355
1356
1357
1358
1359	<style data-senna-track="temporary" type="text/css">
1360
1361		
1362
1363			
1364
1365		
1366
1367			
1368
1369		
1370
1371			
1372
1373		
1374
1375			
1376
1377		
1378
1379			
1380
1381		
1382
1383			
1384
1385		
1386
1387			
1388
1389		
1390
1391			
1392
1393		
1394
1395			
1396
1397		
1398
1399			
1400
1401		
1402
1403			
1404
1405		
1406
1407			
1408
1409		
1410
1411			
1412
1413		
1414
1415	</style>
1416
1417
1418<style data-senna-track="temporary" type="text/css">
1419	:root {
1420		--custom-control-label-font-size: var(--text-paragraph-sm-font-size);
1421		--condensed-form-input-filled-border-color: var(--color-neutral-5);
1422		--tab-segment-item-icon-color-active: var(--tab-segment-item-color-active);
1423		--label-sm-icon-size: 0.75rem;
1424		--condensed-form-input-label-color: var(--color-neutral-5);
1425		--aspect-ratio-5: calc(9 / 16 * 100%);
1426		--aspect-ratio-6: calc(1 / 2 * 100%);
1427		--aspect-ratio-3: calc(2 / 3 * 100%);
1428		--tab-secondary-item-box-shadow-active: none;
1429		--tab-segment-item-icon-color-disabled: var(--tab-segment-item-color-disabled);
1430		--aspect-ratio-4: calc(5 / 8 * 100%);
1431		--card-aspect-ratio-item-offset: var(--spacer-4);
1432		--tab-segment-item-color-active: var(--color-action-primary-inverted);
1433		--color-state-error-darken-2: #6d0a0a;
1434		--aspect-ratio-1: 100%;
1435		--color-state-error-darken-1: #a40f0f;
1436		--aspect-ratio-2: calc(3 / 4 * 100%);
1437		--color-action-neutral-inverted: #fff;
1438		--display2-size: 5.5rem;
1439		--card-elevated-border-width: 0rem;
1440		--label-lg-font-size: var(--text-paragraph-sm-font-size);
1441		--tab-primary-item-box-shadow-active: none;
1442		--display3-weight: var(--font-weight-light);
1443		--label-lg-line-height: var(--text-paragraph-sm-line-height);
1444		--custom-control-label-color: var(--form-input-label-color);
1445		--table-spaced-row-border-color: var(--color-neutral-3);
1446		--tab-segment-item-background-color: transparent;
1447		--color-state-warning-darken-1: #a85100;
1448		--h3-font-size: 1.75rem;
1449		--color-state-warning-darken-2: #703600;
1450		--tab-tertiary-item-color-hover: var(--tab-tertiary-item-color);
1451		--form-input-label-font-weight: var(--font-weight-bolder);
1452		--blockquote-small-color: var(--color-neutral-6);
1453		--transition-collapse: 0.35s ease;
1454		--tab-secondary-item-font-size: var(--text-paragraph-font-size);
1455		--tab-primary-item-background-color-active: var(--tab-primary-item-background-color);
1456		--tab-tertiary-item-font-size: var(--text-paragraph-font-size);;
1457		--condensed-form-feedback-item-margin: 0;
1458		--card-autofit-col-lg-width: 24rem;
1459		--card-flat-background-color-hover: var(--color-neutral-1);
1460		--tab-tertiary-vertical-item-border-left-width: 0;
1461		--form-feedback-item-line-height: var(--text-paragraph-sm-line-height);
1462		--tab-primary-item-active-bar-border-radius: 0.0625rem;
1463		--color-action-primary-inverted-disabled: #ffffff80;
1464		--text-paragraph-sm-line-height: 20px;
1465		--btn-lg-line-height: 28px;
1466		--table-sm-header-cell-min-height: 2.5625rem;
1467		--btn-border-radius: var(--border-radius-sm);
1468		--tab-secondary-item-icon-color-hover: var(--tab-secondary-item-icon-color);
1469		--tab-segment-item-color-disabled: var(--color-action-neutral-disabled);
1470		--link-text-decoration: none;
1471		--table-spaced-row-border-radius: var(--border-radius);
1472		--spacer-10: 10rem;
1473		--tab-primary-item-icon-color-disabled: var(--color-action-neutral-disabled);
1474		--btn-lg-font-size: 1.125rem;
1475		--condensed-form-input-filled-label-color: var(--color-neutral-8);
1476		--tab-primary-item-icon-color-hover: var(--color-action-primary-hover);
1477		--h5-font-size: 1.125rem;
1478		--label-lg-font-weight: var(--font-weight-bolder);
1479		--tab-primary-item-border-radius: 0;
1480		--tab-segment-border-color: var(--color-neutral-3);
1481		--blockquote-font-size: 1.25rem;
1482		--table-sm-font-size: var(--text-paragraph-font-size);
1483		--form-input-line-height: var(--text-paragraph-line-height);
1484		--card-flat-border-color-hover: var(--color-action-primary-hover);
1485		--transition-fade: 0.15s linear;
1486		--table-border-width: 0.0625rem;
1487		--tab-tertiary-horizontal-item-border-left-width: 0;
1488		--tab-segment-item-border-color: transparent;
1489		--card-outlined-background-color: var(--color-neutral-0);
1490		--card-body-padding-top: var(--spacer-3);
1491		--form-input-background-color: var(--color-neutral-0);
1492		--tab-tertiary-item-font-weight-active: var(--font-weight-bolder);
1493		--btn-inline-item-spacer-x: var(--spacer-1);
1494		--form-input-placeholder-font-weight: var(--font-weight-normal);
1495		--tab-secondary-horizontal-item-border-left-width: 0.0625rem;
1496		--color-action-primary-inverted-hover: #ffffff19;
1497		--table-sm-font-weight: var(--font-weight-normal);
1498		--card-outlined-border-width: 0.0625rem;
1499		--form-input-placeholder-font-size: var(--text-paragraph-font-size);
1500		--link-visited-color: #5E38BA;
1501		--form-input-label-margin-top: 0.25rem;
1502		--card-elevated-background-color-active: var(--color-neutral-0);
1503		--tab-secondary-horizontal-item-border-top-width: 0.0625rem;
1504		--color-state-success: #4aab3b;
1505		--h4-font-weight: var(--h1-font-weight);
1506		--color-neutral-10: #1d1c21;
1507		--tab-tertiary-vertical-item-border-top-width: 0;
1508		--color-action-primary-disabled: #a696e4;
1509		--tab-primary-item-border-color: var(--color-neutral-3);
1510		--h6-font-weight: var(--h1-font-weight);
1511		--tab-segment-item-border-color-disabled: var(--tab-segment-item-border-color);
1512		--tab-segment-item-box-shadow-hover: none;
1513		--text-paragraph-font-size: 1rem;
1514		--elevation-tight-7: 0 7px 18px;
1515		--form-text-font-size: var(--text-paragraph-sm-font-size);
1516		--elevation-tight-8: 0 12px 28px;
1517		--elevation-tight-9: 0 13px 36px;
1518		--card-border-radius: var(--border-radius);
1519		--elevation-tight-3: 0 2px 6px;
1520		--tab-secondary-item-color: var(--color-neutral-8);
1521		--elevation-tight-4: 0 2px 7px;
1522		--elevation-tight-5: 0 3px 12px;
1523		--elevation-tight-6: 0 3.5px 14px;
1524		--elevation-tight-1: 0 1px 3px;
1525		--tab-tertiary-item-icon-color-hover: var(--tab-tertiary-item-icon-color);
1526		--h2-font-weight: var(--h1-font-weight);
1527		--elevation-tight-2: 0 1.25px 4px;
1528		--card-flat-box-shadow-hover: none;
1529		--card-flat-background-color-active: var(--color-neutral-1);
1530		--tab-secondary-horizontal-item-padding-x: var(--spacer-3);
1531		--tab-secondary-horizontal-item-padding-y: var(--spacer-3);
1532		--condensed-form-input-filled-label-font-size: var(--text-paragraph-sm-font-size);
1533		--tab-primary-item-font-weight-active: var(--tab-primary-item-font-weight);
1534		--text-paragraph-line-height: 24px;
1535		--table-sm-line-height: var(--text-paragraph-line-height);
1536		--label-lg-padding-x: var(--spacer-2);
1537		--label-lg-padding-y: 0.125rem;
1538		--table-sm-header-cell-padding-y: var(--spacer-2);
1539		--spacer-0: 0;
1540		--table-sm-header-cell-padding-x: var(--spacer-2);
1541		--tab-primary-item-icon-color: var(--color-neutral-7);
1542		--lead-font-size: 1.25rem;
1543		--card-outlined-box-shadow: none;
1544		--tab-secondary-horizontal-item-border-bottom-width: 0.0625rem;
1545		--spacer-9: 9rem;
1546		--tab-segment-item-icon-font-size: var(--text-paragraph-font-size);
1547		--tab-tertiary-horizontal-item-padding-y: var(--spacer-3);
1548		--tab-tertiary-horizontal-item-padding-x: var(--spacer-3);
1549		--table-sm-cell-padding-x: var(--spacer-2);
1550		--btn-lg-border-radius: var(--border-radius);
1551		--table-sm-cell-padding-y: var(--spacer-2);
1552		--tab-primary-item-color-active: var(--color-action-primary-default);
1553		--spacer-2: 0.5rem;
1554		--spacer-1: 0.25rem;
1555		--tab-tertiary-item-font-weight: var(--font-weight-normal);
1556		--color-action-secondary-active: #b95804;
1557		--spacer-4: 1.5rem;
1558		--spacer-3: 1rem;
1559		--spacer-6: 4.5rem;
1560		--spacer-5: 3rem;
1561		--form-input-border-color: var(--color-neutral-5);
1562		--spacer-8: 7.5rem;
1563		--spacer-7: 6rem;
1564		--font-family-sans-serif: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
1565		--card-outlined-border-color: var(--color-neutral-3);
1566		--tab-secondary-vertical-item-border-left-width: 0.0625rem;
1567		--tab-primary-item-icon-font-size: var(--text-paragraph-font-size);
1568		--card-flat-border-color: var(--color-neutral-1);
1569		--color-action-secondary-hover-lighten: #faf0e6;
1570		--h1-font-size: 2.3125rem;
1571		--text-link-sm-font-size: 0.875rem;
1572		--card-horizontal-aspect-ratio-default: var(--aspect-ratio-1);
1573		--custom-control-color-hover: var(--color-action-primary-active-lighten);
1574		--container-max-sm: 540px;
1575		--color-focus: var(--color-brand-primary-lighten-3);
1576		--table-lg-cell-padding-x: var(--spacer-4);
1577		--table-lg-cell-padding-y: var(--spacer-4);
1578		--card-outlined-background-color-hover: var(--color-neutral-0);
1579		--table-image-max-height: 100px;
1580		--tab-secondary-item-background-color-active: var(--color-neutral-0);
1581		--color-brand-primary: #5924eb;
1582		--tab-segment-item-font-size: var(--text-link-small-font-size);
1583		--label-lg-icon-size: 0.875rem;
1584		--card-flat-box-shadow: none;
1585		--form-input-border-width: 0.0625rem;
1586		--card-outlined-box-shadow-hover: none;
1587		--tab-tertiary-horizontal-item-border-bottom-width: 0.0625rem;
1588		--card-flat-box-shadow-active: none;
1589		--color-accent-6-lighten: #defff7;
1590		--text-link-md-line-height: 24px;
1591		--btn-padding-y: 0.75rem;
1592		--table-sm-cell-min-height: 2.5625rem;
1593		--btn-padding-x: 1rem;
1594		--tab-primary-horizontal-item-border-left-width: 0;
1595		--tab-segment-item-inline-item-spacer-x: var(--spacer-3);
1596		--form-text-color: var(--color-neutral-7);
1597		--tab-segment-item-inline-item-spacer-y: var(--spacer-3);
1598		--nav-link-vertical-active-indicator-thickness: 0.25rem;
1599		--tab-segment-item-color: var(--color-neutral-6);
1600		--text-link-lg-font-size: 1.5rem;
1601		--table-lg-line-height: var(--text-paragraph-line-height);
1602		--display3-size: 3.0625rem;
1603		--tab-segment-item-icon-color: var(--tab-segment-item-color);
1604		--tab-segment-item-font-weight: var(--font-weight-bold);
1605		--color-action-secondary-inverted-hover: #ffffff19;
1606		--display-line-height: 1.2;
1607		--color-state-info-darken-1: #234481;
1608		--elevation-fluffy-2: 0 6.25px 20px;
1609		--color-state-info-darken-2: #172d56;
1610		--elevation-fluffy-1: 0 5px 15px;
1611		--table-color: var(--color-neutral-10);
1612		--color-state-success-darken-2: #25561e;
1613		--color-state-info-lighten-1: #8ca4d1;
1614		--color-state-info-lighten-2: #eaeff7;
1615		--custom-control-label-font-weight: var(--form-input-label-font-weight);
1616		--color-state-success-darken-1: #38802c;
1617		--tab-tertiary-item-color-disabled: var(--color-action-neutral-disabled);
1618		--tab-secondary-item-font-weight: var(--font-weight-normal);
1619		--font-weight-semi-bold: 600;
1620		--condensed-form-input-label-padding-x: 0.25rem;
1621		--tab-primary-item-color-disabled: var(--color-action-neutral-disabled);
1622		--tab-secondary-item-active-bar-thickness: 0.1875rem;
1623		--blockquote-small-font-size: 80%;
1624		--color-state-success-lighten-1: #9bd193;
1625		--color-state-success-lighten-2: #edf7eb;
1626		--color-action-primary-inverted: #fff;
1627		--color-accent-2: #a7e204;
1628		--color-accent-1: #eb2453;
1629		--tab-tertiary-item-color-active: var(--tab-tertiary-item-color);
1630		--color-accent-4: #221874;
1631		--color-accent-3: #c70d95;
1632		--color-action-neutral-hover: #34465b;
1633		--text-link-lg-line-height: 28px;
1634		--tab-tertiary-item-icon-color-disabled: var(--color-action-neutral-disabled);
1635		--color-brand-secondary-darken-3: #926800;
1636		--color-accent-6: #1ce4b5;
1637		--color-state-warning-lighten-1: #eeae73;
1638		--color-brand-secondary-darken-4: #614600FF;
1639		--color-accent-5: #bc24eb;
1640		--color-state-warning-lighten-2: #fcf0e6;
1641		--color-brand-secondary-darken-1: #f3ae00;
1642		--display1-size: 6rem;
1643		--nav-link-vertical-margin: 1rem 0;
1644		--color-brand-secondary-darken-2: #c28b00;
1645		--table-box-shadow: none;
1646		--tab-primary-horizontal-item-border-right-width: 0;
1647		--tab-segment-item-background-color-active: var(--color-action-primary-active);
1648		--tab-segment-item-border-radius: var(--border-radius-pill);
1649		--table-title-link-text-decoration: var(--link-text-decoration);
1650		--form-input-color-disabled: var(--color-neutral-4);
1651		--tab-primary-vertical-item-border-bottom-width: 0;
1652		--color-action-neutral-inverted-hover: #ffffff19;
1653		--form-input-label-line-height: var(--text-paragraph-line-height);
1654		--tab-tertiary-item-icon-color: var(--color-neutral-7);
1655		--color-brand-secondary-darken-5: #312300;
1656		--box-shadow-lg: var(--elevation-fluffy-3) rgba(0, 0, 0, .175);
1657		--tab-secondary-vertical-item-padding-y: var(--spacer-3);
1658		--label-lg-border-radius: var(--border-radius-xs);
1659		--tab-primary-vertical-item-border-top-width: 0;
1660		--tab-secondary-vertical-item-padding-x: var(--spacer-3);
1661		--color-chart-9: #3a6ba1;
1662		--tab-secondary-item-background-color-hover: var(--tab-secondary-item-background-color);
1663		--form-feedback-item-font-weight: var(--font-weight-normal);
1664		--form-feedback-item-padding: 0.375rem 1rem;
1665		--tab-tertiary-item-active-bar-color-active: var(--color-action-primary-default);
1666		--color-chart-12: #00520a;
1667		--tab-primary-item-color-hover: var(--color-action-primary-hover);
1668		--color-chart-10: #4d006e;
1669		--label-sm-padding-y: 0.0625rem;
1670		--color-chart-11: #8a6a00;
1671		--h5-font-weight: var(--h1-font-weight);
1672		--label-sm-padding-x: var(--spacer-1);
1673		--table-title-link-color-hover: var(--link-hover-color);
1674		--tab-secondary-item-active-bar-color-active: var(--color-action-primary-default);
1675		--tab-tertiary-item-line-height: var(--text-paragraph-line-height);
1676		--condensed-form-text-font-weight: var(--font-weight-normal);
1677		--hr-border-width: 1px;
1678		--table-font-size: var(--text-paragraph-font-size);
1679		--table-row-background-color-hover: var(--color-action-primary-hover-lighten);
1680		--h1-font-weight: var(--font-weight-bold);
1681		--text-paragraph-xs-line-height: 20px;
1682		--form-input-font-weight: var(--font-weight-normal);
1683		--tab-secondary-item-icon-font-size: var(--text-paragraph-font-size);;
1684		--color-chart-0: #4d2ec9;
1685		--tab-secondary-item-font-weight-active: var(--font-weight-bold);
1686		--color-chart-2: #ad9ee9;
1687		--elevation-fluffy-4: 0 10px 35px;
1688		--color-chart-1: #fdcc4a;
1689		--elevation-fluffy-3: 0 10px 30px;
1690		--color-brand-secondary: #ffc124;
1691		--color-chart-4: #002c62;
1692		--elevation-fluffy-6: 0 17.5px 70px;
1693		--form-input-label-margin-left: 1rem;
1694		--color-chart-3: #fe8856;
1695		--elevation-fluffy-5: 0 15px 60px;
1696		--table-header-font-size: var(--table-font-size);
1697		--color-chart-6: #912600;
1698		--color-chart-5: #78cc88;
1699		--elevation-fluffy-7: 0 35px 90px;
1700		--color-chart-8: #41a0a6;
1701		--form-input-border-radius: var(--border-radius);
1702		--color-chart-7: #ff8585;
1703		--label-sm-border-radius: var(--border-radius-xs);
1704		--font-family-base: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
1705		--tab-tertiary-horizontal-item-active-bar-width: auto;
1706		--tab-tertiary-item-border-color: var(--color-neutral-3);
1707		--table-sm-header-line-height: var(--text-paragraph-line-height);
1708		--color-action-neutral-inverted-disabled: #ffffff80;
1709		--border-radius: 0.5rem;
1710		--table-row-background-color-alternate: var(--color-neutral-1);
1711		--table-header-line-height: var(--text-paragraph-line-height);
1712		--color-accent-1-lighten: #ffeaef;
1713		--label-sm-line-height: 1rem;
1714		--border-radius-circle: 50%;
1715		--tab-tertiary-vertical-item-border-bottom-width: 0.0625rem;
1716		--form-feedback-item-margin: 0.25rem 0 0;
1717		--table-line-height: var(--text-paragraph-line-height);
1718		--container-max-xl: 1248px;
1719		--tab-primary-vertical-item-border-left-width: 0.0625rem;
1720		--form-input-label-color: var(--color-neutral-8);
1721		--text-muted: var(--color-neutral-4);
1722		--tab-tertiary-item-active-bar-border-radius: 0.0625rem;
1723		--table-title-color: var(--color-neutral-9);
1724		--table-border-color: var(--color-neutral-3);
1725		--form-input-placeholder-color-focus: var(--color-neutral-4);
1726		--card-outlined-box-shadow-active: none;
1727		--tab-secondary-item-inline-item-spacer-y: var(--spacer-2);
1728		--tab-secondary-item-inline-item-spacer-x: var(--spacer-2);
1729		--tab-segment-background-color: var(--color-neutral-1);
1730		--card-body-padding-right: var(--spacer-4);
1731		--color-action-secondary-inverted-disabled: #ffffff80;
1732		--color-action-neutral-default: #2b3a4b;
1733		--h4-font-size: 1.5rem;
1734		--font-weight-bold: 700;
1735		--text-paragraph-xxs-font-size: 0.5625rem;
1736		--tab-tertiary-vertical-item-border-right-width: 0;
1737		--form-input-padding-x: 1rem;
1738		--form-input-padding-y: 0.6875rem;
1739		--color-action-primary-active: #3c249e;
1740		--condensed-form-input-label-font-weight: var(--font-weight-bolder);
1741		--table-header-vertical-align: middle;
1742		--card-autofit-col-md-width: 16rem;
1743		--tab-segment-item-color-hover: var(--color-action-primary-active);
1744		--card-elevated-background-color: var(--color-neutral-0);
1745		--color-action-neutral-active-lighten: #d5d8db;
1746		--color-brand-secondary-lighten-4: #ffeab6;
1747		--tab-segment-padding-y: var(--spacer-1);
1748		--color-brand-secondary-lighten-3: #ffe092;
1749		--tab-segment-padding-x: var(--spacer-1);
1750		--color-brand-secondary-lighten-6: #fffbf0;
1751		--display1-weight: var(--font-weight-light);
1752		--tab-secondary-item-active-bar-color-hover: var(--color-action-primary-default);
1753		--color-brand-secondary-lighten-5: #fff5db;
1754		--box-shadow-sm: var(--elevation-tight-1) rgba(0, 0, 0, .075);
1755		--color-brand-secondary-lighten-2: #ffd66d;
1756		--color-brand-secondary-lighten-1: #ffcb48;
1757		--color-accent-2-lighten: #f0ffc6;
1758		--form-text-font-weight: var(--font-weight-light);
1759		--tab-tertiary-item-background-color-active: var(--tab-tertiary-item-background-color);
1760		--tab-primary-item-background-color: transparent;
1761		--tab-secondary-horizontal-item-border-right-width: 0.0625rem;
1762		--font-weight-lighter: lighter;
1763		--tab-segment-item-background-color-disabled: var(--tab-segment-item-background-color);
1764		--tab-secondary-item-background-color: var(--color-neutral-1);
1765		--condensed-form-input-background-color: var(--color-neutral-2);
1766		--tab-primary-item-color: var(--color-neutral-7);
1767		--tab-primary-horizontal-item-active-bar-width: auto;
1768		--tab-tertiary-vertical-item-padding-x: var(--spacer-3);
1769		--tab-tertiary-vertical-item-padding-y: var(--spacer-3);
1770		--form-input-label-margin-bottom: 0.25rem;
1771		--color-neutral-0: #fff;
1772		--color-neutral-1: #f7f6f9;
1773		--color-neutral-2: #eeecf3;
1774		--hr-border-color: rgba(0, 0, 0, .1);
1775		--color-neutral-3: #dcd9e2;
1776		--hr-border-margin-y: 1rem;
1777		--color-neutral-4: #a7a3b2;
1778		--tab-secondary-item-background-color-disabled: var(--tab-secondary-item-background-color);
1779		--color-neutral-5: #898593;
1780		--color-neutral-6: #716c7f;
1781		--color-neutral-7: #5a5469;
1782		--color-neutral-8: #3f3851;
1783		--color-neutral-9: #332b4a;
1784		--tab-secondary-item-icon-color-active: var(--tab-secondary-item-icon-color);
1785		--tab-tertiary-item-border-color-active: transparent;
1786		--tab-segment-item-border-color-hover: var(--tab-segment-item-border-color);
1787		--text-paragraph-sm-font-size: 0.8125rem;
1788		--container-max-md: 720px;
1789		--card-elevated-box-shadow-active: var(--elevation-tight-3) rgba(89, 36, 235, 0.22);
1790		--border-radius-xxl: 1.5rem;
1791		--table-spaced-row-border-spacing: var(--spacer-2);
1792		--tab-segment-item-icon-color-hover: var(--tab-segment-item-color-hover);
1793		--table-lg-cell-min-height: 4.5625rem;
1794		--h6-font-size: 0.875rem;
1795		--h2-font-size: 2rem;
1796		--color-action-secondary-active-lighten: #f1decd;
1797		--custom-control-label-line-height: var(--text-paragraph-sm-line-height);
1798		--color-action-secondary-inverted: #fff;
1799		--form-input-placeholder-color-disabled: var(--color-neutral-3);
1800		--tab-segment-item-background-color-hover: var(--tab-segment-item-background-color);
1801		--link-visited-text-decoration: none;
1802		--border-radius-pill: 50rem;
1803		--card-outlined-border-color-active: var(--color-action-primary-active);
1804		--table-font-weight: var(--font-weight-normal);
1805		--tab-segment-item-line-height: var(--text-link-small-line-height);
1806		--display4-size: 2.6875rem;
1807		--border-radius-lg: 0.75rem;
1808		--tab-primary-horizontal-item-border-top-width: 0;
1809		--form-input-font-size: var(--text-paragraph-font-size);
1810		--tab-primary-vertical-item-border-right-width: 0;
1811		--custom-control-border-color: var(--color-action-primary-default);
1812		--label-item-spacer-x: 0.375rem;
1813		--btn-sm-inline-item-font-size: var(--btn-sm-font-size);
1814		--card-flat-border-width: 0.0625rem;
1815		--table-lg-header-line-height: var(--text-paragraph-line-height);
1816		--body-color: var(--color-neutral-9);
1817		--tab-segment-item-box-shadow-active: var(--elevation-tight-2) rgba(89, 36, 235, 0.25);
1818		--container-max-lg: 960px;
1819		--btn-sm-line-height: 20px;
1820		--table-border-radius: var(--border-radius);
1821		--box-shadow: var(--elevation-tight-3) rgba(0, 0, 0, .15);
1822		--tab-tertiary-horizontal-item-border-top-width: 0;
1823		--table-row-background-color: var(--color-neutral-0);
1824		--label-sm-font-weight: var(--font-weight-bolder);
1825		--btn-border-width: 0.0625rem;
1826		--btn-sm-padding-y: 0.5rem;
1827		--btn-sm-padding-x: 0.75rem;
1828		--table-header-cell-min-height: 3.5rem;
1829		--table-title-link-text-decoration-hover: var(--link-text-decoration-hover);
1830		--card-vertical-aspect-ratio-default: var(--aspect-ratio-3);
1831		--tab-secondary-item-color-disabled: var(--color-action-neutral-disabled);
1832		--table-spaced-row-box-shadow: none;
1833		--nav-link-horizontal-active-indicator-length: 100%;
1834		--text-paragraph-xs-font-size: 0.6875rem;
1835		--card-elevated-box-shadow-hover: var(--elevation-tight-7) rgba(89, 36, 235, 0.17);
1836		--tab-secondary-vertical-item-border-top-width: 0.0625rem;
1837		--color-brand-primary-lighten-5: #e3dbfc;
1838		--color-brand-primary-lighten-6: #fbfaff;
1839		--color-brand-primary-lighten-3: #ac92f5;
1840		--color-brand-primary-lighten-4: #c8b6f8;
1841		--tab-primary-vertical-item-active-bar-height: auto;
1842		--color-brand-primary-lighten-1: #7549ee;
1843		--color-brand-primary-lighten-2: #906df2;
1844		--btn-inline-item-font-size: var(--btn-font-size);
1845		--color-action-primary-hover-lighten: #f2f0fa;
1846		--tab-primary-item-icon-color-active: var(--color-action-primary-default);
1847		--form-feedback-item-font-size: var(--text-paragraph-sm-font-size);
1848		--tab-secondary-item-line-height: var(--text-paragraph-line-height);
1849		--form-input-label-reference-mark-color: var(--color-state-error);
1850		--card-elevated-background-color-hover: var(--color-neutral-0);
1851		--form-text-line-height: var(--text-paragraph-sm-line-height);
1852		--table-cell-min-height: 3.5rem;
1853		--table-cell-padding-x: var(--spacer-3);
1854		--card-elevated-border-color-active: transparent;
1855		--table-cell-padding-y: var(--spacer-3);
1856		--card-elevated-border-color: transparent;
1857		--color-state-warning: #e06c00;
1858		--tab-primary-item-font-size: var(--text-paragraph-font-size);
1859		--form-input-placeholder-color: var(--color-neutral-4);
1860		--table-header-font-weight: var(--font-weight-semi-bold);
1861		--color-action-secondary-hover: #d26404;
1862		--tab-primary-horizontal-item-padding-y: var(--spacer-3);
1863		--tab-primary-horizontal-item-padding-x: var(--spacer-3);
1864		--link-hover-text-decoration: underline;
1865		--font-weight-bolder: 800;
1866		--table-title-link-color: var(--link-color);
1867		--form-input-border-color-disabled: var(--color-neutral-2);
1868		--table-sm-header-font-weight: var(--font-weight-semi-bold);
1869		--table-header-background-color: var(--color-neutral-0);
1870		--tab-segment-item-border-width: 0;
1871		--tab-tertiary-item-color: var(--color-neutral-8);
1872		--color-accent-5-lighten: #f6daff;
1873		--color-action-secondary-disabled: #f6b882;
1874		--tab-primary-item-background-color-disabled: var(--tab-primary-item-background-color);
1875		--btn-sm-font-size: 0.875rem;
1876		--tab-tertiary-item-border-radius: 0;
1877		--color-action-primary-default: #5924eb;
1878		--table-title-line-height: var(--text-paragraph-line-height);
1879		--table-lg-font-weight: var(--font-weight-normal);
1880		--tab-secondary-item-border-color-active: var(--tab-secondary-item-border-color);
1881		--marked-text-background-color: var(--color-brand-secondary-lighten-5);
1882		--tab-tertiary-item-background-color: var(--color-neutral-0);
1883		--tab-secondary-item-border-color-hover: var(--tab-secondary-item-border-color);
1884		--form-text-margin: 0.25rem 1rem 0;
1885		--display4-weight: var(--font-weight-light);
1886		--card-flat-border-color-active: var(--color-action-primary-active);
1887		--nav-link-vertical-active-indicator-length: 100%;
1888		--form-input-color: var(--color-neutral-8);
1889		--body-bg: var(--color-neutral-0);
1890		--tab-segment-border-width: 0.0625rem;
1891		--display2-weight: var(--font-weight-light);
1892		--tab-tertiary-item-icon-color-active: var(--tab-tertiary-item-icon-color);
1893		--tab-secondary-item-active-bar-border-radius: 0.0625rem;
1894		--custom-control-label-padding-left: 0.75rem;
1895		--tab-secondary-item-border-color: var(--color-neutral-3);
1896		--card-elevated-box-shadow: var(--elevation-tight-3) rgba(89, 36, 235, 0.22);
1897		--form-input-placeholder-line-height: var(--text-paragraph-line-height);
1898		--tab-primary-item-line-height: var(--text-paragraph-line-height);
1899		--condensed-form-input-background-color-disabled: var(--color-neutral-1);
1900		--condensed-form-input-filled-label-font-weight: var(--font-weight-bolder);
1901		--tab-secondary-horizontal-item-active-bar-width: auto;
1902		--color-action-secondary-default: #ed7105;
1903		--table-lg-font-size: var(--text-paragraph-font-size);
1904		--label-sm-font-size: var(--text-paragraph-xs-font-size);
1905		--tab-primary-item-active-bar-color-hover: var(--color-brand-primary-darken-1);
1906		--text-small-caps-font-size: 0.875rem;
1907		--text-paragraph-lg-font-size: 1.25rem;
1908		--border-radius-sm: 0.375rem;
1909		--tab-tertiary-item-active-bar-color-hover: var(--color-action-primary-hover);
1910		--color-action-neutral-disabled: #959ca5;
1911		--condensed-form-input-label-font-size: var(--text-paragraph-font-size);
1912		--tab-tertiary-item-box-shadow-active: var(--elevation-fluffy-2) rgba(77, 133, 255, 0.1);
1913		--tab-tertiary-item-background-color-hover: var(--tab-tertiary-item-background-color);
1914		--color-accent-3-lighten: #ffeaf9;
1915		--custom-control-background-color: var(--color-neutral-0);
1916		--text-small-caps-line-height: 20px;
1917		--font-weight-normal: 500;
1918		--btn-sm-border-radius: var(--border-radius-xs);
1919		--table-lg-header-cell-padding-y: var(--spacer-4);
1920		--tab-secondary-item-icon-color: var(--color-neutral-7);
1921		--table-lg-header-cell-padding-x: var(--spacer-4);
1922		--table-spaced-row-border-width: 0;
1923		--tab-primary-item-active-bar-color-active: var(--color-brand-primary);
1924		--card-body-padding-left: var(--spacer-4);
1925		--color-action-primary-active-lighten: #ece9f5;
1926		--tab-secondary-item-icon-color-disabled: var(--color-action-neutral-disabled);
1927		--card-autofit-col-sm-width: 8rem;
1928		--tab-secondary-item-color-active: var(--color-neutral-10);
1929		--tab-secondary-vertical-item-border-right-width: 0.0625rem;
1930		--card-flat-background-color: var(--color-neutral-1);
1931		--table-lg-header-font-size: var(--text-paragraph-font-size);
1932		--tab-tertiary-item-inline-item-spacer-x: var(--spacer-2);
1933		--tab-tertiary-item-inline-item-spacer-y: var(--spacer-2);
1934		--table-header-cell-padding-x: var(--spacer-3);
1935		--table-header-cell-padding-y: var(--spacer-3);
1936		--card-outlined-border-color-hover: var(--color-action-primary-hover);
1937		--btn-font-weight: var(--font-weight-semi-bold);
1938		--form-input-label-font-size: var(--text-paragraph-font-size);
1939		--form-input-label-margin-right: 1rem;
1940		--tab-segment-item-padding-y: var(--spacer-3);
1941		--tab-segment-item-padding-x: 0.375rem;
1942		--tab-primary-vertical-item-padding-y: var(--spacer-3);
1943		--tab-primary-vertical-item-padding-x: var(--spacer-3);
1944		--table-row-background-color-active: var(--color-action-primary-active-lighten);
1945		--condensed-form-text-font-size: var(--text-paragraph-sm-font-size);
1946		--tab-primary-horizontal-item-border-bottom-width: 0.03125rem;
1947		--custom-control-border-color-disabled: var(--color-action-primary-disabled);
1948		--color-state-error-lighten-1: #eb7e7e;
1949		--nav-link-horizontal-active-indicator-thickness: 0.125rem;
1950		--color-state-error-lighten-2: #fbe8e8;
1951		--tab-tertiary-item-border-color-hover: var(--tab-tertiary-item-border-color);
1952		--color-brand-primary-darken-3: #210963;
1953		--color-accent-4-lighten: #e9e8f1;
1954		--color-brand-primary-darken-4: #110532;
1955		--condensed-form-input-label-margin-x: 0.75rem;
1956		--color-brand-primary-darken-5: #000;
1957		--tab-tertiary-horizontal-item-border-right-width: 0;
1958		--headings-line-height: 1.2;
1959		--color-action-neutral-active: #3d536b;
1960		--tab-primary-item-inline-item-spacer-x: var(--spacer-3);
1961		--tab-primary-item-inline-item-spacer-y: var(--spacer-3);
1962		--tab-tertiary-item-box-shadow-hover: none;
1963		--table-sm-header-font-size: var(--text-paragraph-font-size);
1964		--tab-secondary-item-color-hover: var(--color-neutral-10);
1965		--btn-line-height: 24px;
1966		--tab-segment-item-font-weight-active: var(--tab-segment-item-font-weight);
1967		--card-elevated-border-color-hover: transparent;
1968		--table-lg-header-font-weight: var(--font-weight-semi-bold);
1969		--link-color: var(--color-action-primary-default);
1970		--h3-font-weight: var(--h1-font-weight);
1971		--tab-secondary-item-box-shadow-hover: none;
1972		--color-brand-primary-darken-1: #4212c7;
1973		--color-brand-primary-darken-2: #320e95;
1974		--color-action-neutral-hover-lighten: #eaebed;
1975		--card-body-padding-bottom: var(--spacer-4);
1976		--card-outlined-background-color-active: var(--color-neutral-0);
1977		--btn-lg-inline-item-font-size: var(--btn-lg-font-size);
1978		--text-paragraph-lg-line-height: 24px;
1979		--table-title-font-weight: var(--font-weight-semi-bold);
1980		--tab-primary-item-background-color-hover: var(--tab-primary-item-background-color);
1981		--btn-font-size: 1rem;
1982		--tab-secondary-vertical-item-active-bar-height: auto;
1983		--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
1984		--tab-primary-item-font-weight: var(--font-weight-bold);
1985		--tab-primary-item-active-bar-thickness: 0.1875rem;
1986		--tab-primary-item-border-color-active: var(--tab-primary-item-border-color);
1987		--tab-segment-border-radius: var(--border-radius-pill);
1988		--color-action-primary-hover: #4429b3;
1989		--font-weight-light: 300;
1990		--link-hover-color: var(--color-action-primary-hover);
1991		--tab-tertiary-item-background-color-disabled: var(--tab-tertiary-item-background-color);
1992		--table-title-font-size: var(--text-small-caps-font-size);
1993		--text-link-md-font-size: 1rem;
1994		--transition-base: 0.2s ease-in-out;
1995		--nav-link-horizontal-margin: 0 1rem;
1996		--form-input-label-color-disabled: var(--color-neutral-8);
1997		--text-link-sm-line-height: 20px;
1998		--border-radius-xs: 0.25rem;
1999		--table-lg-header-cell-min-height: 4.5625rem;
2000		--table-header-color: var(--color-neutral-8);
2001		--form-feedback-item-border-radius: var(--border-radius);
2002		--text-small-caps-letter-spacing: 0.05em;
2003		--condensed-form-input-label-color-disabled: var(--color-neutral-4);
2004		--tab-secondary-item-border-radius: 0;
2005		--tab-tertiary-item-icon-font-size: var(--text-paragraph-font-size);
2006		--tab-primary-item-box-shadow-hover: none;
2007		--color-state-info: #2e5aac;
2008		--tab-tertiary-item-active-bar-thickness: 0.1875rem;
2009		--tab-secondary-vertical-item-border-bottom-width: 0.0625rem;
2010		--tab-segment-item-border-color-active: var(--tab-segment-item-border-color);
2011		--lead-font-weight: var(--font-weight-light);
2012		--table-row-color-hover: var(--table-row-color);
2013		--text-paragraph-xxs-line-height: 16px;
2014		--btn-lg-padding-y: 0.875rem;
2015		--btn-lg-padding-x: 1.125rem;
2016		--color-state-error: #da1414;
2017		--border-radius-xl: 1rem;
2018		--tab-primary-item-border-color-hover: var(--tab-primary-item-border-color);
2019		--font-size-base: var(--text-paragraph-font-size);
2020		--tab-tertiary-vertical-item-active-bar-height: auto;
2021	}
2022	:root {
2023		--font-family-base: "Lora; Nunito_Sans", sans-serif;
2024		--font-family-sans-serif: "Lora; Nunito_Sans", sans-serif;
2025		--text-paragraph-sm-font-size: 0.8125rem;
2026		--text-paragraph-xxs-font-size: 0.5625rem;
2027		--font-family-monospace: "Lora; Nunito_Sans", sans-serif;
2028		--color-brand-primary-darken-1: #4212c7;
2029		--color-neutral-0: #fff;
2030		--color-neutral-1: #FFFFFF;
2031		--color-action-primary-hover: #007BFF;
2032		--text-paragraph-xs-font-size: 0.6875rem;
2033		--color-brand-primary: #FFFFFF;
2034		--font-weight-normal: 400;
2035		--text-paragraph-xxs-line-height: 16px;
2036		--color-action-primary-default: #000000;
2037	}
2038</style>
2039<script data-senna-track="permanent" src="https://sampanews.sp.gov.br/combo?browserId=chrome&minifierType=js&languageId=pt_BR&t=1790649506512&/o/product-experience-manager-theme-contributor/js/liferay-usage-events.js" type = "text/javascript"></script>
2039
2040<link data-senna-track="temporary" href="/o/layout-common-styles/main.css?plid=24449&segmentsExperienceId=24772162&t=17889817495981789647354917" rel="stylesheet" type="text/css"><link data-senna-track="permanent" href="/o/frontend-js-aui-web/alloy_ui.css" rel="stylesheet"></link>
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053<script type="text/javascript">
2054Liferay.on(
2055	'ddmFieldBlur', function(event) {
2056		if (window.Analytics) {
2057			Analytics.send(
2058				'fieldBlurred',
2059				'Form',
2060				{
2061					fieldName: event.fieldName,
2062					focusDuration: event.focusDuration,
2063					formId: event.formId,
2064					formPageTitle: event.formPageTitle,
2065					page: event.page,
2066					title: event.title
2067				}
2068			);
2069		}
2070	}
2071);
2072
2073Liferay.on(
2074	'ddmFieldFocus', function(event) {
2075		if (window.Analytics) {
2076			Analytics.send(
2077				'fieldFocused',
2078				'Form',
2079				{
2080					fieldName: event.fieldName,
2081					formId: event.formId,
2082					formPageTitle: event.formPageTitle,
2083					page: event.page,
2084					title:event.title
2085				}
2086			);
2087		}
2088	}
2089);
2090
2091Liferay.on(
2092	'ddmFormPageShow', function(event) {
2093		if (window.Analytics) {
2094			Analytics.send(
2095				'pageViewed',
2096				'Form',
2097				{
2098					formId: event.formId,
2099					formPageTitle: event.formPageTitle,
2100					page: event.page,
2101					title: event.title
2102				}
2103			);
2104		}
2105	}
2106);
2107
2108Liferay.on(
2109	'ddmFormSubmit', function(event) {
2110		if (window.Analytics) {
2111			Analytics.send(
2112				'formSubmitted',
2113				'Form',
2114				{
2115					formId: event.formId,
2116					title: event.title
2117				}
2118			);
2119		}
2120	}
2121);
2122
2123Liferay.on(
2124	'ddmFormView', function(event) {
2125		if (window.Analytics) {
2126			Analytics.send(
2127				'formViewed',
2128				'Form',
2129				{
2130					formId: event.formId,
2131					title: event.title
2132				}
2133			);
2134		}
2135	}
2136);
2137
2138</script>
2138<script>
2139
2140</script>
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162<script type="text/javascript" data-senna-track="temporary">
2163	if (window.Analytics) {
2164		window._com_liferay_document_library_analytics_isViewFileEntry = false;
2165	}
2166</script>
2166
2167
2168<link data-senna-track="temporary" href="/o/psp-css/bundle.css" rel="stylesheet" type="text/css" /><link data-senna-track="temporary" href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&family=Quicksand:[email protected]&display=swap" rel="stylesheet" type="text/css" />
2169
2170</head>
2171
2172<body class="chrome controls-visible  yui3-skin-sam signed-out public-page site">
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219	<nav aria-label="Links rápidos" class="bg-dark cadmin quick-access-nav text-center text-white" id="zxjt_quickAccessNav">
2220		
2221			
2222				<a class="d-block p-2 sr-only sr-only-focusable text-reset" href="#main-content">
2223		Pular para o Conteúdo principal
2224	</a>
2225			
2226			
2227		
2228	</nav>
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303<div class="d-flex flex-column min-vh-100">
2304
2305	<div class="d-flex flex-column flex-fill position-relative" id="wrapper">
2306
2307		<div class=" flex-fill" id="content">
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337	
2338	
2339
2340		
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359	
2360	
2361	
2362		<div id="master-layout-wrapper">
2363			
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393	
2394
2395	
2396
2397	<div class="lfr-layout-structure-item-header--copiar- lfr-layout-structure-item-a0077d3b-4e40-7aba-1b72-7fdf52fbfc31 " data-layout-structure-item-id="a0077d3b-4e40-7aba-1b72-7fdf52fbfc31">
2398 <div id="fragment-b51c640a-24ce-c63c-02ec-b4f4650c20d5">
2399  <header class="header-container">
2400   <!-- Middle Bar -->
2401   <div class="middle-bar">
2402    <div class="middle-bar-content">
2403     <div class="left-section">
2404      <div class="menu-section fragment-zone">
2405       <div>
2406        <div class="lfr-layout-structure-item-basic-component-image lfr-layout-structure-item-fd6a0a41-728e-17d3-aec4-56ee28e075dd " data-layout-structure-item-id="fd6a0a41-728e-17d3-aec4-56ee28e075dd">
2407         <div id="fragment-36030a34-6637-aedf-9211-79380a9c9923">
2408          <div class="component-image overflow-hidden">
2409           <a rel="noopener noreferrer" target="_blank" href="https://prefeitura.sp.gov.br/"><picture data-fileentryid="31096278"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/31096278/Thumbnail-300x300/logo_PrefSP_sem+fundo_horizontal_preto_monocrom%C3%A1tico+%281%29.png?t=1760458447429"><source media="(max-width:903px) and (min-width:300px)" srcset="/o/adaptive-media/image/31096278/Preview-1000x0/logo_PrefSP_sem+fundo_horizontal_preto_monocrom%C3%A1tico+%281%29.png?t=1760458447429"><img alt="logo da Prefeitura de São Paulo" class="w-100" data-lfr-editable-id="image-square" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/25160874/logo_PrefSP_sem+fundo_horizontal_preto_monocrom%C3%A1tico+%281%29.png/1990a1bf-fcdc-7af9-75c5-1a0af315067d?version=1.0&amp;t=1760458447429" data-fileentryid="31096278"></picture></a>
2410          </div>
2411         </div>
2412        </div>
2413        <div class="lfr-layout-structure-item-basic-component-html lfr-layout-structure-item-8e89ba2d-e1d7-eaa2-c6f0-4290525fb4a2 " data-layout-structure-item-id="8e89ba2d-e1d7-eaa2-c6f0-4290525fb4a2">
2414         <div id="fragment-8aedc32c-ef4f-cefc-f26a-a7b0faab6752">
2415          <div class="component-html" data-lfr-editable-id="element-html" data-lfr-editable-type="html">
2416           <!-- ========================================= -->
2417           <!-- COMPONENTE MENU HAMBÚRGUER - LIFERAY FRAGMENT -->
2418           <!-- ========================================= -->
2419           <!-- HAMBURGER MENU COMPONENT -->
2420           <div class="hamburger-menu">
2421            <!-- Botão Hambúrguer -->
2422            <button class="hamburger-btn" id="hamburgerBtn" aria-label="Abrir menu"> <span class="hamburger-line"></span> <span class="hamburger-line"></span> <span class="hamburger-line"></span> </button> <!-- Overlay -->
2423            <div class="menu-overlay" id="menuOverlay"></div>
2424            <!-- Container do Menu -->
2425            <div class="menu-container" id="menuContainer">
2426             <!-- Header do Menu -->
2427             <div class="menu-header">
2428              <h2 class="menu-title lfr-editable" data-lfr-editable-id="menu-title" data-lfr-editable-type="text" tabindex="0">Menu</h2>
2429              <button class="menu-close" id="menuClose" aria-label="Fechar menu">×</button>
2430             </div>
2431             <!-- Conteúdo do Menu - 4 Colunas -->
2432             <div class="menu-content">
2433              <!-- Coluna 1 - Menu (9 primeiros links em ordem alfabética) -->
2434              <div class="menu-column">
2435               <h3 class="column-title lfr-editable" data-lfr-editable-id="column1-title" data-lfr-editable-type="text" tabindex="0">Editorias</h3>
2436               <div class="column-links">
2437                <a href="/web/sampa-news" tabindex="0">Home</a> <a href="/web/sampa-news/artigos" tabindex="0">Artigos</a> <a href="/web/sampa-news/assistencia-social" tabindex="0">Assistência Social</a> <a href="/web/sampa-news/cidadania" tabindex="0">Cidadania</a> <a href="/web/sampa-news/cultura" tabindex="0">Cultura</a> <a href="/web/sampa-news/educacao" tabindex="0">Educação</a> <a href="/web/sampa-news/economia" tabindex="0">Economia</a> <a href="/web/sampa-news/esporte-e-lazer" tabindex="0">Esporte e Lazer</a> <a href="/web/sampa-news/habitacao" tabindex="0">Habitação</a> <a href="/web/sampa-news/inclusao" tabindex="0">Inclusão</a>
2438               </div>
2439              </div>
2440              <!-- Coluna 2 - Menu (9 últimos links em ordem alfabética) -->
2441              <div class="menu-column">
2442               <h3 class="column-title lfr-editable" data-lfr-editable-id="column2-title" data-lfr-editable-type="text" tabindex="0">Editorias</h3>
2443               <div class="column-links">
2444                <a href="/web/sampa-news/infraestrutura-obras" tabindex="0">Infraestrutura</a> <a href="/web/sampa-news/meio-ambiente" tabindex="0">Meio Ambiente</a> <a href="/web/sampa-news/mobilidade" tabindex="0">Mobilidade</a> <a href="/web/sampa-news/saude" tabindex="0">Saúde</a> <a href="/web/sampa-news/seguranca" tabindex="0">Segurança</a> <a href="/web/sampa-news/servicos" tabindex="0">Serviços</a> <a href="/web/sampa-news/tecnologia" tabindex="0">Tecnologia</a> <a href="/web/sampa-news/trabalhos" tabindex="0">Trabalho</a> <a href="/web/sampa-news/turismo-e-negocios" tabindex="0">Turismo e Negócios</a> <a href="/web/sampa-news/noticias" tabindex="0">Últimas Notícias</a>
2445               </div>
2446              </div>
2447              <!-- Coluna 3 - Links úteis -->
2448              <div class="menu-column">
2449               <h3 class="column-title lfr-editable" data-lfr-editable-id="column3-title" data-lfr-editable-type="text" tabindex="0">Links úteis</h3>
2450               <div class="column-links">
2451                <a href="http://transparencia.prefeitura.sp.gov.br/sistema-eletronico-de-informacao-ao-cidadao-e-sic/" tabindex="0">Acesso à informação</a> <a href="http://transparencia.prefeitura.sp.gov.br/" tabindex="0">Transparência São Paulo</a> <a href="https://legislacao.prefeitura.sp.gov.br/" tabindex="0">Legislação</a> <a href="https://www.prefeitura.sp.gov.br/cidade/secretarias/ouvidoria/fale_com_a_ouvidoria/index.php?p=227268" tabindex="0">Ouvidoria</a> <a href="https://sp156.prefeitura.sp.gov.br/portal " tabindex="0">SP 156</a> <a href="https://diariooficial.prefeitura.sp.gov.br/md_epubli_controlador.php?acao=inicio" tabindex="0">Diário Oficial</a>
2452               </div>
2453               <div class="column-menu-hamburguer-links">
2454                <!--   <a href="#" class="menu-hamburguer-link lfr-editable" tabindex="0">Política de privacidade</a>  -->
2455                <!--  <a href="#" class="menu-hamburguer-link lfr-editable" tabindex="0">Termos e Condições</a>  -->
2456                <!--  <a href="#" class="menu-hamburguer-link lfr-editable" tabindex="0">Política de Cookie</a>  -->
2457               </div>
2458              </div>
2459              <!-- Coluna 4 - Redes Sociais -->
2460              <div class="menu-column">
2461               <!-- Redes Sociais Section -->
2462               <div class="social-section-menu">
2463                <div class="social-icon-header">
2464                 <svg width="40" height="40" viewBox="0 0 24 24" fill="#000000">
2465                  <path d="M18,16.08C17.24,16.08 16.56,16.38 16.04,16.85L8.91,12.7C8.96,12.47 9,12.24 9,12C9,11.76 8.96,11.53 8.91,11.3L15.96,7.19C16.5,7.69 17.21,8 18,8A3,3 0 0,0 21,5A3,3 0 0,0 18,2A3,3 0 0,0 15,5C15,5.24 15.04,5.47 15.09,5.7L8.04,9.81C7.5,9.31 6.79,9 6,9A3,3 0 0,0 3,12A3,3 0 0,0 6,15C6.79,15 7.5,14.69 8.04,14.19L15.16,18.34C15.11,18.55 15.08,18.77 15.08,19C15.08,20.61 16.39,21.91 18,21.91C19.61,21.91 20.92,20.61 20.92,19C20.92,17.39 19.61,16.08 18,16.08Z"> </path>
2466                 </svg>
2467                </div>
2468                <h3 class="social-title lfr-editable" data-lfr-editable-id="social-title" data-lfr-editable-type="text" tabindex="0">Redes Sociais - PrefSP</h3>
2469                <p class="social-description lfr-editable" data-lfr-editable-id="social-desc" data-lfr-editable-type="text" tabindex="0">Você também pode acompanhar o Sampa News nas redes sociais para mais informações, bastidores e conteúdos exclusivos sobre a cidade.</p>
2470                <div class="social-icons-grid">
2471                 <a target="_blank" href="https://www.instagram.com/prefsp"> <picture data-fileentryid="25551374"> <source media="(max-width:300px)" srcset="/o/adaptive-media/image/25551374/Thumbnail-300x300/instagram.png?t=1749062970254"> <source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/25551374/Preview-1000x0/instagram.png?t=1749062970254">
2471 <img src="/documents/24771855/25160874/instagram.png/cc38202f-c535-d7f7-584b-967c49655d34?version=1.0&amp;t=1749062970254" alt="Instagram" class="social-icon lfr-editable" data-lfr-editable-id="instagram-icon" data-lfr-editable-type="image" data-fileentryid="25551374" tabindex="0"> </picture> </a> <a target="_blank" href="https://www.facebook.com/PrefSP"> <picture data-fileentryid="25551393"> <source media="(max-width:300px)" srcset="/o/adaptive-media/image/25551393/Thumbnail-300x300/facebook.png?t=1749062971316"> <source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/25551393/Preview-1000x0/facebook.png?t=1749062971316"> <img src="/documents/24771855/25160874/facebook.png/fba28859-9a01-5ffe-814a-8db180c9f63a?version=1.0&amp;t=1749062971316" alt="Facebook" class="social-icon lfr-editable" data-lfr-editable-id="facebook-icon" data-lfr-editable-type="image" data-fileentryid="25551393" tabindex="0"> </picture> </a> <a target="_blank" href="https://twitter.com/prefsp"> <picture data-fileentryid="25551412"> <source media="(max-width:300px)" srcset="/o/adaptive-media/image/25551412/Thumbnail-300x300/x.png?t=1749062972685"> <source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/25551412/Preview-1000x0/x.png?t=1749062972685"> <img src="/documents/24771855/25160874/x.png/b66803af-e75a-0d6f-72cc-179f82d448ef?version=1.0&amp;t=1749062972685" alt="Twitter" class="social-icon lfr-editable" data-lfr-editable-id="twitter-icon" data-lfr-editable-type="image" data-fileentryid="25551412" tabindex="0"> </picture> </a> <a target="_blank" href="https://www.youtube.com/prefeiturasaopaulo"> <picture data-fileentryid="25551439"> <source media="(max-width:300px)" srcset="/o/adaptive-media/image/25551439/Thumbnail-300x300/youtube.png?t=1749062973818"> <source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/25551439/Preview-1000x0/youtube.png?t=1749062973818"> <img src="/documents/24771855/25160874/youtube.png/15b4304e-2e21-559d-2dd2-dfe2a270a0f8?version=1.0&amp;t=1749062973818" alt="YouTube" class="social-icon lfr-editable" data-lfr-editable-id="youtube-icon" data-lfr-editable-type="image" data-fileentryid="25551439" tabindex="0"> </picture> </a> <a target="_blank" href="https://www.linkedin.com/company/cidade-de-sao-paulo/"> <picture data-fileentryid="25551459"> <source media="(max-width:300px)" srcset="/o/adaptive-media/image/25551459/Thumbnail-300x300/linkedin.png?t=1749062975256"> <source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/25551459/Preview-1000x0/linkedin.png?t=1749062975256"> <img src="/documents/24771855/25160874/linkedin.png/a890e84a-9a91-45dd-2e62-abb26799ec64?version=1.0&amp;t=1749062975256" alt="LinkedIn" class="social-icon lfr-editable" data-lfr-editable-id="linkedin-icon" data-lfr-editable-type="image" data-fileentryid="25551459" tabindex="0"> </picture> </a> <a target="_blank" href="https://www.tiktok.com/@prefsp"> <picture data-fileentryid="25574861"> <source media="(max-width:300px)" srcset="/o/adaptive-media/image/25574861/Thumbnail-300x300/tiktok.png?t=1749071047834"> <source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/25574861/Preview-1000x0/tiktok.png?t=1749071047834"> <img src="/documents/24771855/25160874/tiktok.png/b080cb15-99a9-e3d7-a170-4c1276aba40e?version=1.0&amp;t=1749071047834" alt="TikTok" class="social-icon lfr-editable" data-lfr-editable-id="tiktok-icon" data-lfr-editable-type="image" data-fileentryid="25574861" tabindex="0"> </picture> </a>
2472                </div>
2473               </div>
2474              </div>
2475             </div>
2476             <!-- Copyright menu-hamburguer -->
2477             <div class="menu-menu-hamburguer">
2478              <p class="copyright-text lfr-editable" data-lfr-editable-id="copyright-text" data-lfr-editable-type="text" tabindex="0">© COPYRIGHT 2023, Prefeitura Municipal de São Paulo Viaduto do Chá, 15 - Centro - CEP: 01002-020</p>
2479             </div>
2480            </div>
2481           </div>
2482           <!-- ========================================= -->
2483           <!-- CSS STYLES -->
2484           <!-- ========================================= -->
2485           <style>
2486  /* Reset para o componente */
2487  .hamburger-menu * {
2488    margin: 0;
2489    padding: 0;
2490    box-sizing: border-box;
2491  }
2492
2493  /* Container principal do componente */
2494  .hamburger-menu {
2495    position: relative;
2496    display: inline-block;
2497  }
2498
2499  /* Botão Hambúrguer */
2500  .hamburger-btn {
2501    background: transparent;
2502    border: none;
2503    cursor: pointer;
2504    padding: 8px;
2505    border-radius: 4px;
2506    transition: background-color 0.2s ease;
2507    display: flex;
2508    flex-direction: column;
2509    justify-content: center;
2510    align-items: center;
2511    width: 40px;
2512    height: 40px;
2513  }
2514
2515  .hamburger-btn:hover {
2516    background-color: rgba(0, 0, 0, 0.1);
2517  }
2518
2519  /* Linhas do hambúrguer */
2520  .hamburger-line {
2521    width: 24px;
2522    height: 3px;
2523    background-color: #495057;
2524    margin: 2px 0;
2525    transition: all 0.3s ease;
2526    border-radius: 2px;
2527  }
2528
2529  /* Animação do botão quando ativo */
2530  .hamburger-btn.active .hamburger-line:nth-child(1) {
2531    transform: rotate(45deg) translate(5px, 5px);
2532  }
2533
2534  .hamburger-btn.active .hamburger-line:nth-child(2) {
2535    opacity: 0;
2536  }
2537
2538  .hamburger-btn.active .hamburger-line:nth-child(3) {
2539    transform: rotate(-45deg) translate(7px, -6px);
2540  }
2541
2542  /* Overlay escuro */
2543  .menu-overlay {
2544    position: fixed;
2545    top: 0;
2546    left: 0;
2547    width: 100%;
2548    height: 100%;
2549    background-color: rgba(0, 0, 0, 0.5);
2550    z-index: 998;
2551    opacity: 0;
2552    visibility: hidden;
2553    transition: all 0.3s ease;
2554  }
2555
2556  .menu-overlay.active {
2557    opacity: 1;
2558    visibility: visible;
2559  }
2560
2561  /* Container do menu */
2562  .menu-container {
2563    position: fixed;
2564    top: 0;
2565    left: -100%;
2566    width: 100%;
2567    max-width: auto;
2568    height: 100vh;
2569    background-color: #ffffff;
2570    z-index: 999;
2571    transition: left 0.3s ease;
2572    overflow-y: auto;
2573    box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);
2574    display: flex;
2575    flex-direction: column;
2576  }
2577
2578  .menu-container.active {
2579    left: 0;
2580  }
2581
2582  /* Header do menu */
2583  .menu-header {
2584    display: flex;
2585    justify-content: space-between;
2586    align-items: center;
2587    padding: 20px;
2588    border-bottom: 1px solid #e9ecef;
2589    background-color: #f8f9fa;
2590    flex-shrink: 0;
2591  }
2592
2593  .menu-title {
2594    font-size: 24px;
2595    font-weight: 700;
2596    color: #212529;
2597    margin: 0;
2598  }
2599
2600  .menu-close {
2601    background: transparent;
2602    border: none;
2603    font-size: 24px;
2604    cursor: pointer;
2605    padding: 8px;
2606    border-radius: 4px;
2607    color: #495057;
2608    transition: background-color 0.2s ease;
2609    width: 40px;
2610    height: 40px;
2611    display: flex;
2612    align-items: center;
2613    justify-content: center;
2614  }
2615
2616  .menu-close:hover {
2617    background-color: rgba(0, 0, 0, 0.1);
2618  }
2619
2620  /* Conteúdo do menu - 3 colunas */
2621  .menu-content {
2622    padding: 40px 30px;
2623    display: grid;
2624    grid-template-columns: 1fr 1fr 1fr 1fr;
2625    gap: 10px;
2626    flex-grow: 1;
2627  }
2628
2629  /* Coluna individual */
2630  .menu-column {
2631    display: flex;
2632    flex-direction: column;
2633  }
2634
2635  .column-title {
2636    font-size: 18px;
2637    font-weight: 600;
2638    color: #495057;
2639    margin-bottom: 25px;
2640    padding: 0;
2641    border: none;
2642  }
2643
2644  .column-links {
2645    display: flex;
2646    flex-direction: column;
2647    gap: 16px;
2648    margin-bottom: 30px;
2649  }
2650
2651  .menu-link {
2652    color: #212529;
2653    text-decoration: none;
2654    font-size: 16px;
2655    font-weight: 400;
2656    padding: 0;
2657    transition: color 0.2s ease;
2658    line-height: 1.5;
2659  }
2660
2661  .menu-link:hover {
2662    color: #007bff;
2663  }
2664
2665  /* Links do menu-hamburguer da coluna 2 */
2666  .column-menu-hamburguer-links {
2667    display: flex;
2668    flex-direction: column;
2669    gap: 12px;
2670    margin-top: auto;
2671    padding-top: 20px;
2672    border-top: 1px solid #e9ecef;
2673  }
2674
2675  .menu-hamburguer-link {
2676    color: #6c757d;
2677    text-decoration: none;
2678    font-size: 14px;
2679    font-weight: 400;
2680    transition: color 0.2s ease;
2681  }
2682
2683  .menu-hamburguer-link:hover {
2684    color: #007bff;
2685  }
2686
2687  /* Social Section */
2688  .social-section-menu {
2689    border-top: 1px solid #e9ecef;
2690    flex-wrap: wrap;
2691  }
2692
2693  .social-icon-header {
2694    margin-bottom: 15px;
2695  }
2696
2697  .social-title {
2698    font-size: 18px;
2699    font-weight: 700;
2700    color: #212529;
2701    margin-bottom: 15px;
2702  }
2703
2704  .social-description {
2705    color: #6c757d;
2706    font-size: 14px;
2707    line-height: 1.5;
2708    margin-bottom: 20px;
2709  }
2710
2711  .social-icons-grid {
2712    display: grid;
2713    grid-template-columns: repeat(6, 1fr);
2714    gap: 10px;
2715    width: 230px;
2716  }
2717
2718  .social-icon-menu {
2719    width: 40px;
2720    height: 40px;
2721    border-radius: 6px;
2722    transition: transform 0.2s ease;
2723    cursor: pointer;
2724  }
2725
2726  .social-icon-menu:hover {
2727    transform: scale(1.1);
2728  }
2729
2730  /* menu-hamburguer */
2731  .menu-menu-hamburguer {
2732    padding: 20px 30px;
2733    border-top: 1px solid #e9ecef;
2734    background-color: #f8f9fa;
2735    flex-shrink: 0;
2736  }
2737
2738  .copyright-text {
2739    color: #6c757d;
2740    font-size: 12px;
2741    text-align: center;
2742    line-height: 1.4;
2743  }
2744
2745  /* Responsivo - Tablet */
2746  @media (max-width: 768px) {
2747    .menu-container {
2748      max-width: 100%;
2749    }
2750
2751    .menu-content {
2752      grid-template-columns: 1fr;
2753      gap: 30px;
2754      padding: 30px 20px;
2755    }
2756
2757    .column-title {
2758      font-size: 16px;
2759      margin-bottom: 20px;
2760    }
2761
2762    .menu-link {
2763      font-size: 15px;
2764    }
2765
2766    .social-icons-grid {
2767      grid-template-columns: repeat(6, 1fr);
2768    }
2769
2770    .social-icon-menu {
2771      width: 35px;
2772      height: 35px;
2773    }
2774  }
2775
2776  /* Responsivo - Mobile */
2777  @media (max-width: 480px) {
2778    .menu-header {
2779      padding: 15px;
2780    }
2781
2782    .menu-title {
2783      font-size: 20px;
2784    }
2785
2786    .menu-content {
2787      padding: 20px 15px;
2788      gap: 25px;
2789    }
2790
2791    .menu-menu-hamburguer {
2792      padding: 15px;
2793    }
2794  }
2795
2796  /* Classes editáveis do Liferay */
2797  .lfr-editable {
2798    position: relative;
2799  }
2800
2801  /* Prevenção de scroll da página em desktop */
2802  @media (min-width: 769px) {
2803    body.menu-open {
2804      overflow: hidden;
2805    }
2806  }
2807</style>
2808           <!-- ========================================= -->
2809           <!-- JAVASCRIPT -->
2810           <!-- ========================================= -->
2811           
2811<script type="">
2812    document.addEventListener('DOMContentLoaded', function() {
2813        const hamburgerBtn = document.getElementById('hamburgerBtn');
2814        const menuOverlay = document.getElementById('menuOverlay');
2815        const menuContainer = document.getElementById('menuContainer');
2816        const menuClose = document.getElementById('menuClose');
2817
2818        // Função para detectar se é mobile
2819        function isMobile() {
2820            return window.innerWidth <= 768;
2821        }
2822
2823        // Função para abrir o menu
2824        function openMenu() {
2825            hamburgerBtn.classList.add('active');
2826            menuOverlay.classList.add('active');
2827            menuContainer.classList.add('active');
2828            
2829            // Só bloqueia scroll em desktop
2830            if (!isMobile()) {
2831                document.body.classList.add('menu-open');
2832            }
2833        }
2834
2835        // Função para fechar o menu
2836        function closeMenu() {
2837            hamburgerBtn.classList.remove('active');
2838            menuOverlay.classList.remove('active');
2839            menuContainer.classList.remove('active');
2840            
2841            // Remove o bloqueio de scroll
2842            document.body.classList.remove('menu-open');
2843        }
2844
2845        // Event listeners
2846        hamburgerBtn.addEventListener('click', openMenu);
2847        menuClose.addEventListener('click', closeMenu);
2848        menuOverlay.addEventListener('click', closeMenu);
2849
2850        // Fechar com ESC
2851        document.addEventListener('keydown', function(e) {
2852            if (e.key === 'Escape' && menuContainer.classList.contains('active')) {
2853                closeMenu();
2854            }
2855        });
2856
2857        // Fechar menu ao clicar em links (opcional)
2858        const menuLinks = document.querySelectorAll('.column-links a');
2859        menuLinks.forEach(link => {
2860            link.addEventListener('click', function() {
2861                // Remove o preventDefault para que os links funcionem
2862                closeMenu();
2863            });
2864        });
2865
2866        // Ajustar comportamento ao redimensionar tela
2867        window.addEventListener('resize', function() {
2868            if (menuContainer.classList.contains('active')) {
2869                // Se mudou para mobile durante menu aberto, remove bloqueio
2870                if (isMobile()) {
2871                    document.body.classList.remove('menu-open');
2872                } else {
2873                    document.body.classList.add('menu-open');
2874                }
2875            }
2876        });
2877    });
2878</script>
2878
2879          </div>
2880         </div>
2881         <style>.component-html img {
2882	max-width: 100%;
2883}</style>
2884        </div>
2885       </div>
2886      </div>
2887     </div>
2888     <div class="logo-section">
2889      <a href="/home"><picture data-fileentryid="27968568"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/27968568/Thumbnail-300x300/sampanews_LOGO_assinatura_500.png?t=1754334121435"><source media="(max-width:500px) and (min-width:300px)" srcset="/o/adaptive-media/image/27968568/Preview-1000x0/sampanews_LOGO_assinatura_500.png?t=1754334121435"><img class="logo lfr-editable" src="https://sampanews.sp.gov.br/documents/24771855/25160874/sampanews_LOGO_assinatura_500.png/b7e76827-8234-c797-6d5f-8da2b5389dde?version=1.0&amp;t=1754334121435" alt="Placeholder" data-lfr-editable-id="img1" data-lfr-editable-type="image" data-fileentryid="27968568" loading="lazy"></picture></a>
2890     </div>
2891     <div class="accessibility-section fragment-zone">
2892      <div class="search-section fragment-zone">
2893       <div>
2894        <div class="lfr-layout-structure-item-com-liferay-portal-search-web-search-bar-portlet-searchbarportlet lfr-layout-structure-item-b3f12b56-5f3e-97b4-d1e5-8a3a536e6844 " data-layout-structure-item-id="b3f12b56-5f3e-97b4-d1e5-8a3a536e6844">
2895         <div id="fragment-239fd62e-a92b-e2e9-187b-d6f2fe7b7373">
2896          <div class="portlet-boundary portlet-boundary_com_liferay_portal_search_web_search_bar_portlet_SearchBarPortlet_  portlet-static portlet-static-end portlet-borderless portlet-search-bar " id="p_p_id_com_liferay_portal_search_web_search_bar_portlet_SearchBarPortlet_INSTANCE_vbck_">
2897           <span id="p_com_liferay_portal_search_web_search_bar_portlet_SearchBarPortlet_INSTANCE_vbck"></span>
2898           <section class="portlet" id="portlet_com_liferay_portal_search_web_search_bar_portlet_SearchBarPortlet_INSTANCE_vbck">
2899            <div class="portlet-content">
2900             <div class=" portlet-content-container">
2901              <div class="portlet-body">
2902               <form action="https://sampanews.sp.gov.br/busca" id="dkrk___fm" method="get" name="dkrk___fm">
2903                <div id="_com_liferay_portal_search_web_search_bar_portlet_SearchBarPortlet_INSTANCE_vbck_reactSearchBar">
2904                 <div id="sfwb"></div>
2905                 
2905<script type="module">
2906import {ReactSearchBar as componentModule} from '/o/portal-search-web/__liferay__/search-bar.js';
2907import {render} from '/o/portal-template-react-renderer-impl/__liferay__/index.js';
2908{
2909render(componentModule, {"isSearchExperiencesSupported":true,"letUserChooseScope":false,"componentId":null,"selectedEverythingSearchScope":false,"retainFacetSelections":false,"scopeParameterStringEverything":"everything","locale":"{\"country\": \"BR\", \"displayCountry\": \"Brazil\", \"displayLanguage\": \"Portuguese\", \"displayName\": \"Portuguese (Brazil)\", \"displayScript\": \"\", \"displayVariant\": \"\", \"extensionKeys\":[],\"ISO3Country\": \"BRA\", \"ISO3Language\": \"por\", \"language\": \"pt\", \"script\": \"\", \"unicodeLocaleAttributes\":[], \"unicodeLocaleKeys\":[], \"variant\": \"\"}","suggestionsDisplayThreshold":2,"isDXP":true,"scopeParameterStringCurrentSite":"this-site","suggestionsContributorConfiguration":"[{\"contributorName\":\"basic\",\"displayGroupName\":\"suggestions\",\"size\":5}]","destinationFriendlyURL":"\/busca","emptySearchEnabled":false,"scopeParameterName":"scope","keywordsParameterName":"q","portletId":"com_liferay_portal_search_web_search_bar_portlet_SearchBarPortlet_INSTANCE_vbck","paginationStartParameterName":"","searchURL":"https:\/\/sampanews.sp.gov.br\/busca","suggestionsURL":"\/o\/search\/v1.0\/suggestions","initialKeywords":"","portletNamespace":"_com_liferay_portal_search_web_search_bar_portlet_SearchBarPortlet_INSTANCE_vbck_","inputPlaceholder":"Procurar..."}, 'sfwb');
2910}
2911
2912</script>
2912
2913                </div>
2914               </form>
2915               
2915<script type="module">
2916import {SearchBar as ComponentModule} from '/o/portal-search-web/__liferay__/search-bar.js';
2917{
2918Liferay.component('__UNNAMED_COMPONENT__4a764fc1-85cb-6373-1c90-51b14585c802', new ComponentModule({"formId":"dkrk___fm","namespace":"_com_liferay_portal_search_web_search_bar_portlet_SearchBarPortlet_INSTANCE_vbck_","spritemap":"https:\/\/sampanews.sp.gov.br\/o\/dialect-theme\/images\/clay\/icons.svg","initialKeywords":"","retainFacetSelections":false}), { destroyOnNavigate: true, portletId: 'com_liferay_portal_search_web_search_bar_portlet_SearchBarPortlet_INSTANCE_vbck'});
2919}
2920
2921</script>
2921
2922              </div>
2923             </div>
2924            </div>
2925           </section>
2926          </div>
2927         </div>
2928        </div>
2929       </div>
2930      </div>
2931      <div>
2932       <div class="lfr-layout-structure-item-0e85eb31-d701-204c-ec30-661d7dbe5e39 lfr-layout-structure-item-container " data-layout-structure-item-id="0e85eb31-d701-204c-ec30-661d7dbe5e39">
2933        <div class="lfr-layout-structure-item-basic-component-html lfr-layout-structure-item-363328d3-a3c7-59c5-cedd-66e227555fd0 " data-layout-structure-item-id="363328d3-a3c7-59c5-cedd-66e227555fd0">
2934         <div id="fragment-abdf9202-07a6-d67e-42fa-2c0e9c5c5a83">
2935          <div class="component-html" data-lfr-editable-id="element-html" data-lfr-editable-type="html">
2936           <div class="recursos-acessibilidade">
2937            <span class="label-acessibilidade">Recursos de acessibilidade:</span>
2938            <div class="acessibilidade-toolbar-icones">
2939             <button onclick="ajustarFonte('diminuir')" aria-label="Diminuir fonte" title="Diminuir fonte">A−</button> <button onclick="ajustarFonte('aumentar')" aria-label="Aumentar fonte" title="Aumentar fonte">A+</button> <button onclick="alternarContraste()" aria-label="Alto contraste" title="Ativar alto contraste"> ◐ </button>
2940            </div>
2941           </div>
2942           <style>
2943  .recursos-acessibilidade {
2944    display: flex;
2945    align-items: center;
2946    gap: 0.75rem;
2947    font-family: Arial, sans-serif;
2948    font-size: 14px;
2949    color: #333;
2950    z-index: 9999;
2951  }
2952  .label-acessibilidade {
2953    font-weight: normal;
2954    color: #666;
2955    white-space: nowrap;
2956  }
2957  
2958  /* Media query para ocultar toda a toolbar de acessibilidade no mobile */
2959  @media (max-width: 768px) {
2960    .recursos-acessibilidade {
2961      display: none;
2962    }
2963  }
2964  
2965  .acessibilidade-toolbar-icones {
2966    display: flex;
2967    align-items: center;
2968    gap: 0.5rem;
2969  }
2970  .acessibilidade-toolbar-icones button {
2971    background: none;
2972    border: none;
2973    font-size: 16px;
2974    font-weight: bold;
2975    cursor: pointer;
2976    padding: 0.25rem 0.5rem;
2977    color: #333;
2978    transition: all 0.2s ease;
2979    border-radius: 3px;
2980    min-width: 24px;
2981    text-align: center;
2982  }
2983  .acessibilidade-toolbar-icones button:hover {
2984    background-color: #f0f0f0;
2985    transform: scale(1.05);
2986  }
2987  .acessibilidade-toolbar-icones button:focus {
2988    outline: 2px solid #007acc;
2989    outline-offset: 2px;
2990  }
2991  .modo-contraste,
2992  .modo-contraste * {
2993    background-color: #000 !important;
2994    color: #fff !important;
2995    border-color: #fff !important;
2996    fill: #fff !important;
2997  }
2998  .modo-contraste .acessibilidade-toolbar-icones button:hover {
2999    background-color: #333 !important;
3000  }
3001  main,
3002  .portlet,
3003  .portlet-body,
3004  .content,
3005  .web-content,
3006  .content-wrapper,
3007  section,
3008  article,
3009  .news-body,
3010  .summary-body,
3011  .psp-section-title__text,
3012  p,
3013  span,
3014  li,
3015  td,
3016  th,
3017  div,
3018  h1,
3019  h2,
3020  h3,
3021  h4,
3022  h5,
3023  h6,
3024  a {
3025    transition: font-size 0.2s ease;
3026  }
3027</style>
3028           
3028<script type="text/javascript">
3029  let tamanhoFonteAtualPx = 16;
3030  const tamanhoMinPx = 12;
3031  const tamanhoMaxPx = 22;
3032  function ajustarFonte(acao) {
3033    if (acao === 'aumentar' && tamanhoFonteAtualPx < tamanhoMaxPx) {
3034      tamanhoFonteAtualPx += 1;
3035    } else if (acao === 'diminuir' && tamanhoFonteAtualPx > tamanhoMinPx) {
3036      tamanhoFonteAtualPx -= 1;
3037    }
3038    const seletor = `
3039      main, .portlet, .portlet-body, .content, .web-content,
3040      .content-wrapper, section, article, .news-body, .summary-body,
3041      .psp-section-title__text, p, span, li, td, th, div,
3042      h1, h2, h3, h4, h5, h6, a
3043    `;
3044    document.querySelectorAll(seletor).forEach(el => {
3045      el.style.setProperty('font-size', `${tamanhoFonteAtualPx}px`, 'important');
3046    });
3047  }
3048  function alternarContraste() {
3049    document.documentElement.classList.toggle('modo-contraste');
3050  }
3051</script>
3051
3052          </div>
3053         </div>
3054        </div>
3055        <div class="lfr-layout-structure-item-header---social-icons lfr-layout-structure-item-0b499e44-f1cd-7525-659d-0d0af4879305 " data-layout-structure-item-id="0b499e44-f1cd-7525-659d-0d0af4879305">
3056         <div id="fragment-57774991-682b-2cbb-0ac9-73b335025ccf">
3057          <div class="header-social-icons">
3058           <a href="#" target="_blank" rel="noopener noreferrer"> </a><a rel="noopener noreferrer" target="_blank" href="https://www.instagram.com/prefsp"><picture data-fileentryid="25551374"><source media="(min-width:960px)" srcset="/o/adaptive-media/image/25551374/Preview-1000x0/instagram.png?t=1749062970254"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/25551374/Thumbnail-300x300/instagram.png?t=1749062970254"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/25551374/Preview-1000x0/instagram.png?t=1749062970254"><img src="https://sampanews.sp.gov.br/documents/24771855/25160874/instagram.png/cc38202f-c535-d7f7-584b-967c49655d34?version=1.0&amp;t=1749062970254" alt="Instagram" data-lfr-editable-id="Instagram" data-lfr-editable-type="image" tabindex="0" data-fileentryid="25551374" data-desktop-configuration="Preview-1000x0" loading="lazy"></picture></a> <a href="#" target="_blank" rel="noopener noreferrer"> </a><a rel="noopener noreferrer" target="_blank" href="https://www.facebook.com/PrefSP"><picture data-fileentryid="25551393"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/25551393/Thumbnail-300x300/facebook.png?t=1749062971316"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/25551393/Preview-1000x0/facebook.png?t=1749062971316"><img src="https://sampanews.sp.gov.br/documents/24771855/25160874/facebook.png/fba28859-9a01-5ffe-814a-8db180c9f63a?version=1.0&amp;t=1749062971316" alt="Facebook" data-lfr-editable-id="Facebook" data-lfr-editable-type="image" tabindex="0" data-fileentryid="25551393" loading="lazy"></picture></a> <a href="#" target="_blank" rel="noopener noreferrer"> </a><a rel="noopener noreferrer" target="_blank" href="https://twitter.com/prefsp"><picture data-fileentryid="25551412"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/25551412/Thumbnail-300x300/x.png?t=1749062972685"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/25551412/Preview-1000x0/x.png?t=1749062972685"><img src="https://sampanews.sp.gov.br/documents/24771855/25160874/x.png/b66803af-e75a-0d6f-72cc-179f82d448ef?version=1.0&amp;t=1749062972685" alt="X (Twitter)" data-lfr-editable-id="X (Twitter)" data-lfr-editable-type="image" tabindex="0" data-fileentryid="25551412" loading="lazy"></picture></a> <a href="#" target="_blank" rel="noopener noreferrer"> </a><a rel="noopener noreferrer" target="_blank" href="https://www.youtube.com/prefeiturasaopaulo"><picture data-fileentryid="25551439"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/25551439/Thumbnail-300x300/youtube.png?t=1749062973818"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/25551439/Preview-1000x0/youtube.png?t=1749062973818"><img src="https://sampanews.sp.gov.br/documents/24771855/25160874/youtube.png/15b4304e-2e21-559d-2dd2-dfe2a270a0f8?version=1.0&amp;t=1749062973818" alt="YouTube" data-lfr-editable-id="YouTube" data-lfr-editable-type="image" tabindex="0" data-fileentryid="25551439" loading="lazy"></picture></a> <a href="#" target="_blank" rel="noopener noreferrer"> </a><a rel="noopener noreferrer" target="_blank" href="https://www.linkedin.com/company/cidade-de-sao-paulo/"><picture data-fileentryid="25551459"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/25551459/Thumbnail-300x300/linkedin.png?t=1749062975256"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/25551459/Preview-1000x0/linkedin.png?t=1749062975256"><img src="https://sampanews.sp.gov.br/documents/24771855/25160874/linkedin.png/a890e84a-9a91-45dd-2e62-abb26799ec64?version=1.0&amp;t=1749062975256" alt="LinkedIn" data-lfr-editable-id="LinkedIn" data-lfr-editable-type="image" tabindex="0" data-fileentryid="25551459" loading="lazy"></picture></a> <a href="#" target="_blank" rel="noopener noreferrer"> </a><a rel="noopener noreferrer" target="_blank" href="https://www.tiktok.com/@prefsp"><picture data-fileentryid="25574861"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/25574861/Thumbnail-300x300/tiktok.png?t=1749071047834"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/25574861/Preview-1000x0/tiktok.png?t=1749071047834">
3058<img src="https://sampanews.sp.gov.br/documents/24771855/25160874/tiktok.png/b080cb15-99a9-e3d7-a170-4c1276aba40e?version=1.0&amp;t=1749071047834" alt="TikTok" data-lfr-editable-id="TikTok" data-lfr-editable-type="image" tabindex="0" data-fileentryid="25574861" loading="lazy"></picture></a>
3059          </div>
3060         </div>
3061         <style>.header-social-icons {
3062  display: flex;
3063  gap: 5px;
3064  align-items: center;
3065}
3066
3067.header-social-icons a {
3068  display: inline-block;
3069}
3070
3071.header-social-icons a img {
3072  width: 24px !important; /* Tamanho menor para o header */
3073  height: 24px !important;
3074  transition: transform 0.2s;
3075}
3076
3077.header-social-icons a img:hover {
3078  transform: scale(1.1);
3079}</style>
3080        </div>
3081       </div>
3082      </div>
3083     </div>
3084    </div>
3085   </div>
3086  </header>
3087 </div>
3088 <style>* {
3089  margin: 0;
3090  padding: 0;
3091  box-sizing: border-box;
3092}
3093
3094/* Header Container */
3095.header-container {
3096  background-color: #cacac0;
3097  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
3098}
3099
3100/* Middle Bar */
3101.middle-bar {
3102  padding: 16px 0;
3103}
3104
3105.middle-bar-content {
3106  max-width: 1200px;
3107  margin: 0 auto;
3108  display: grid;
3109  grid-template-columns: 1fr auto 2fr;
3110  align-items: center;
3111  padding: 0 20px;
3112  gap: 20px;
3113}
3114
3115.left-section {
3116  display: flex;
3117  align-items: center;
3118  gap: 15px;
3119  justify-self: start;
3120}
3121
3122.menu-section {
3123  display: flex;
3124  align-items: center;
3125}
3126
3127.menu-drop {
3128  background-color: #f8f9fa;
3129  border: 2px dashed #dee2e6;
3130  padding: 12px 20px;
3131  border-radius: 4px;
3132  color: #6c757d;
3133  font-size: 14px;
3134  font-weight: 500;
3135}
3136
3137.search-section {
3138  display: flex;
3139  align-items: center;
3140}
3141
3142.search-drop {
3143  background-color: #f8f9fa;
3144  border: 2px dashed #dee2e6;
3145  padding: 12px 40px;
3146  border-radius: 4px;
3147  color: #6c757d;
3148  font-size: 14px;
3149  font-weight: 500;
3150}
3151
3152.logo-section {
3153  justify-content: center;
3154  align-items: center;
3155  justify-self: center;
3156}
3157
3158.logo-section>a:hover {
3159  opacity: 0.8;
3160  text-decoration: none;
3161}
3162
3163.logo-link {
3164  display: block;
3165  text-decoration: none;
3166}
3167
3168.logo {
3169  height: 70px;
3170  max-width: 180px;
3171  object-fit: contain;
3172  display: block;
3173  padding: 4px 0;
3174}
3175
3176.accessibility-section {
3177  display: flex;
3178  justify-content: flex-end;
3179  align-items: center;
3180  justify-self: end;
3181}
3182
3183.accessibility-drop {
3184  background-color: #f8f9fa;
3185  border: 2px dashed #dee2e6;
3186  padding: 12px 24px;
3187  border-radius: 4px;
3188  color: #6c757d;
3189  font-size: 14px;
3190  font-weight: 500;
3191}
3192
3193/* Liferay Fragment Mapping Classes */
3194.lfr-editable {
3195  position: relative;
3196}
3197
3198/* Fragment zones for Liferay */
3199.fragment-zone {
3200  min-height: 20px;
3201  position: relative;
3202}
3203
3204/* Responsive adjustments for larger screens */
3205@media (min-width: 1400px) {
3206  .middle-bar-content {
3207    max-width: 1200px;
3208  }
3209}
3210
3211/* Mobile Layout - 2 linhas: primeira com 2 colunas, segunda com 1 coluna */
3212@media (max-width: 768px) {
3213
3214  /* Mobile middle bar adjustments */
3215  .middle-bar-content {
3216    max-width: none;
3217    display: grid;
3218    grid-template-columns: 1fr 1fr;
3219    grid-template-rows: auto auto;
3220    align-items: center;
3221    padding: 0 15px;
3222    gap: 12px;
3223  }
3224
3225  /* Left section (menu) - primeira linha, primeira coluna */
3226  .left-section {
3227    grid-column: 1;
3228    grid-row: 1;
3229    display: flex;
3230    align-items: center;
3231    gap: 0;
3232    justify-self: start;
3233  }
3234
3235  .left-section .search-section {
3236    display: none;
3237  }
3238
3239  .menu-section {
3240    display: flex;
3241    align-items: center;
3242  }
3243
3244  .menu-drop {
3245    background-color: transparent;
3246    border: none;
3247    padding: 8px;
3248    color: #495057;
3249    font-size: 18px;
3250    font-weight: 500;
3251  }
3252
3253  /* Logo section - primeira linha, segunda coluna */
3254  .logo-section {
3255    grid-column: 2;
3256    grid-row: 1;
3257    justify-content: center;
3258    align-items: center;
3259    justify-self: end;
3260  }
3261
3262  .logo {
3263    height: 66px;
3264    max-width: 150px;
3265    object-fit: contain;
3266    display: block;
3267  }
3268
3269  /* Accessibility section - segunda linha, ocupa as 2 colunas */
3270  .accessibility-section {
3271    grid-column: 1 / -1;
3272    grid-row: 2;
3273    display: flex;
3274    justify-content: center;
3275    align-items: center;
3276    justify-self: stretch;
3277  }
3278
3279  .accessibility-drop {
3280    background-color: transparent;
3281    border: none;
3282    padding: 8px;
3283    color: #495057;
3284    font-size: 18px;
3285    font-weight: 500;
3286  }
3287
3288  /* Mobile header styling */
3289  .middle-bar {
3290    padding: 16px 0;
3291    border-bottom: 1px solid #e9ecef;
3292    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
3293  }
3294}</style>
3295</div>
3296<div class="lfr-layout-structure-item-basic-component-html lfr-layout-structure-item-f13bb041-df34-f68b-052b-f1808d0d9d33 " data-layout-structure-item-id="f13bb041-df34-f68b-052b-f1808d0d9d33">
3297 <div id="fragment-9b939fe2-5967-7be9-d61f-1c2fc689ef81">
3298  <div class="component-html" data-lfr-editable-id="element-html" data-lfr-editable-type="html">
3299   <style>/* Alvo principal da Search Bar */
3300.portlet-search-bar {
3301  border: 1px solid #111;
3302  background-color: #cacac1 !important;
3303  max-width: 600px;
3304  display: flex;
3305  align-items: center;
3306}
3307  
3308  .input-group-inset-item{
3309    background-color: #cacac1 !important;
3310  }
3311
3312/* Ícone da lupa */
3313.portlet-search-bar .input-group-item .lexicon-icon {
3314  color: #111;
3315  font-size: 1.2rem;
3316  margin-right: 8px;
3317}
3318
3319/* Input de texto */
3320.portlet-search-bar input[type="text"],
3321.portlet-search-bar input[type="search"] {
3322  border: none;
3323  background: transparent;
3324  font-size: 1rem;
3325  flex-grow: 1;
3326  padding: 8px;
3327  outline: none;
3328}
3329
3330/* Botão Buscar */
3331.portlet-search-bar button[type="submit"],
3332.portlet-search-bar .btn[type="submit"] {
3333  color: #fff;
3334  border: none;
3335  padding: 8px 16px;
3336  font-weight: bold;
3337  cursor: pointer;
3338}
3339
3340/* Hover do botão */
3341.portlet-search-bar button[type="submit"]:hover {
3342  background-color: #cacac1;
3343}
3344  
3345  .input-group .input-group-inset-item-after {
3346  background-color: #eaeae5;
3347    border-top-width: 0px;
3348    border-bottom-width: 0px;
3349    border-right-width: 0px;
3350  }
3351  
3352  /* Banner */
3353  .psp-banner{
3354    border-radius: 0;
3355  }
3356  
3357  /*Iframe*/
3358  .embed-responsive{
3359  width: 100% !important;
3360  }
3361  
3362  /*Legenda*/
3363  figcaption {
3364  border-left: 2px solid #000;
3365    padding: 4px;
3366    margin-top: 8px;
3367  }
3368</style>
3369  </div>
3370 </div>
3371</div>
3372<div class="layout-content portlet-layout" id="main-content" role="main">
3373 <div class="lfr-layout-structure-item-2a59fdba-b369-ef68-aa70-190687385781 lfr-layout-structure-item-container " data-layout-structure-item-id="2a59fdba-b369-ef68-aa70-190687385781">
3374  <div class="lfr-layout-structure-item-2b587170-28db-1d79-0610-f6200af403f7 lfr-layout-structure-item-container  container-fluid container-fluid-max-xl" data-layout-structure-item-id="2b587170-28db-1d79-0610-f6200af403f7">
3375   <div class="lfr-layout-structure-item-8f7095f6-3fe0-7117-3f98-e01de4f32d75 lfr-layout-structure-item-row " data-layout-structure-item-id="8f7095f6-3fe0-7117-3f98-e01de4f32d75">
3376    <div class="row align-items-lg-center align-items-sm-center align-items-center align-items-md-center flex-lg-row flex-sm-row flex-row flex-md-row no-gutters">
3377     <div class="col col-lg-2 col-sm-12 col-12 col-md-2 d-flex flex-column">
3378      <a href="https://sampanews.sp.gov.br/noticias" style="color: inherit; text-decoration: none;" target="">
3379       <div class="lfr-layout-structure-item-87769d07-b14e-3753-0c4d-3cfb19f3f433 lfr-layout-structure-item-container  container-fluid container-fluid-max-xl d-flex flex-row align-items-center" data-layout-structure-item-id="87769d07-b14e-3753-0c4d-3cfb19f3f433">
3380        <div class="lfr-layout-structure-item-basic-component-image lfr-layout-structure-item-e4259aeb-1ab6-8950-5f39-5f5c5882e680 " data-layout-structure-item-id="e4259aeb-1ab6-8950-5f39-5f5c5882e680">
3381         <div id="fragment-cdd3d1d9-1b41-6675-bf2f-704c072603dd">
3382          <div class="component-image overflow-hidden">
3383           <picture data-fileentryid="26571177"><source media="(max-width:20px)" srcset="/o/adaptive-media/image/26571177/Preview-1000x0/last_news-icon.png?t=1750449821512"><source media="(max-width:20px) and (min-width:20px)" srcset="/o/adaptive-media/image/26571177/Thumbnail-300x300/last_news-icon.png?t=1750449821512"><img alt="" class="w-100" data-lfr-editable-id="image-square" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/25160874/last_news-icon.png/ce9ff5bb-a8e0-f83a-6465-0fac93a7ff0c?version=1.0&amp;t=1750449821512" data-fileentryid="26571177"></picture>
3384          </div>
3385         </div>
3386        </div>
3387        <div class="lfr-layout-structure-item-basic-component-heading lfr-layout-structure-item-0bae86ff-9bc1-feb4-6048-05faf99253ac " data-layout-structure-item-id="0bae86ff-9bc1-feb4-6048-05faf99253ac">
3388         <div id="fragment-074b80c8-5f98-41fd-1fc8-51875c7676bf">
3389          <h5 class="component-heading mb-0 text-break" data-lfr-editable-id="element-text" data-lfr-editable-type="text">Últimas Notícias</h5>
3390         </div>
3391        </div>
3392       </div>
3393      </a>
3394     </div>
3395     <div class="col col-lg-10 col-sm-12 col-12 col-md-10 d-flex flex-column">
3396      <div class="lfr-layout-structure-item--header----ultimas-noticias lfr-layout-structure-item-ce9a679b-c6a9-895c-499c-be20294c04a0 " data-layout-structure-item-id="ce9a679b-c6a9-895c-499c-be20294c04a0">
3397       <div id="fragment-39ff11ff-f33e-01cc-7691-7da37f018d9e">
3398        <div class="header-lasted-banner">
3399         <div class="header-lasted-container">
3400          <div class="header-lasted-content">
3401           <div class="header-lasted-ticker">
3402            <div class="header-lasted-item">
3403             <div>
3404              <div class="lfr-layout-structure-item-6f08b1f1-9dbd-7c30-6641-d9c6c3b51854 lfr-layout-structure-item-collection" data-layout-structure-item-id="6f08b1f1-9dbd-7c30-6641-d9c6c3b51854" data-analytics-targetable-collection="com.liferay.layout.list.retriever.ClassedModelListObjectReference@1b72632b" id="analytics-targetable-collection-6f08b1f1-9dbd-7c30-6641-d9c6c3b51854">
3405               <div class="container-fluid overflow-hidden px-0 d-flex flex-row">
3406                <div class="row align-items-start">
3407                 <div class="col col-lg-12 col-sm-12 col-12 col-md-12">
3408                  <div class="lfr-layout-structure-item--header----ultimas-noticias---item lfr-layout-structure-item-c0bdaed6-7619-ca60-b5b6-30508ebfb1e1 " data-layout-structure-item-id="c0bdaed6-7619-ca60-b5b6-30508ebfb1e1">
3409                   <div id="fragment-da719cae-737a-2525-a7cd-3d19baf7d721">
3410                    <a href="https://sampanews.sp.gov.br/e/noticia/29179/62001921" data-lfr-editable-id="news-link-1" data-lfr-editable-type="link" rel="nofollow">Prefeitura inaugura 35ª UPA e 485ª UBS da cidade com entrega de novas unidades em Perus</a>
3411                   </div>
3412                  </div>
3413                 </div>
3414                </div>
3415                <div class="row align-items-start">
3416                 <div class="col col-lg-12 col-sm-12 col-12 col-md-12">
3417                  <div class="lfr-layout-structure-item--header----ultimas-noticias---item lfr-layout-structure-item-c0bdaed6-7619-ca60-b5b6-30508ebfb1e1 " data-layout-structure-item-id="c0bdaed6-7619-ca60-b5b6-30508ebfb1e1">
3418                   <div id="fragment-e6f6c3a8-ac93-5eea-6e07-b23152653d43">
3419                    <a href="https://sampanews.sp.gov.br/e/noticia/29179/61982361" data-lfr-editable-id="news-link-1" data-lfr-editable-type="link" rel="nofollow">Cate abre outubro com mais de 4.000 vagas de emprego; área de atendimento reúne 300 oportunidades</a>
3420                   </div>
3421                  </div>
3422                 </div>
3423                </div>
3424                <div class="row align-items-start">
3425                 <div class="col col-lg-12 col-sm-12 col-12 col-md-12">
3426                  <div class="lfr-layout-structure-item--header----ultimas-noticias---item lfr-layout-structure-item-c0bdaed6-7619-ca60-b5b6-30508ebfb1e1 " data-layout-structure-item-id="c0bdaed6-7619-ca60-b5b6-30508ebfb1e1">
3427                   <div id="fragment-1defcbbe-46f4-ebc6-12ab-8f92e4e92662">
3428                    <a href="https://sampanews.sp.gov.br/e/noticia/29179/61957438" data-lfr-editable-id="news-link-1" data-lfr-editable-type="link" rel="nofollow">Carnaval 2027: Prefeitura antecipa organização e 741 blocos estão inscritos para desfilarem nas ruas da cidade, 17,6% a mais do que na última edição</a>
3429                   </div>
3430                  </div>
3431                 </div>
3432                </div>
3433                <div class="row align-items-start">
3434                 <div class="col col-lg-12 col-sm-12 col-12 col-md-12">
3435                  <div class="lfr-layout-structure-item--header----ultimas-noticias---item lfr-layout-structure-item-c0bdaed6-7619-ca60-b5b6-30508ebfb1e1 " data-layout-structure-item-id="c0bdaed6-7619-ca60-b5b6-30508ebfb1e1">
3436                   <div id="fragment-385ead3e-fbca-71f0-c6fa-6ae170efdb19">
3437                    <a href="https://sampanews.sp.gov.br/e/noticia/29179/61952729" data-lfr-editable-id="news-link-1" data-lfr-editable-type="link" rel="nofollow">Prefeitura elabora orçamento anual recorde para o ano 2027: R$ 146,52 bilhões</a>
3438                   </div>
3439                  </div>
3440                 </div>
3441                </div>
3442               </div>
3443              </div>
3444             </div>
3445            </div>
3446           </div>
3447          </div>
3448         </div>
3449        </div>
3450       </div>
3451       <style> .header-lasted-banner {
3452    padding: 4px 0;
3453    font-family: 'Nunito Sans', Arial, sans-serif;
3454    position: relative;
3455    overflow: hidden;
3456    background: transparent;
3457  }
3458
3459  .header-lasted-container {
3460    max-width: 100%;
3461    margin: 0 auto;
3462    padding: 0 20px;
3463    display: flex;
3464    align-items: center;
3465  }
3466
3467  .header-lasted-content {
3468    flex: 1;
3469    overflow: hidden;
3470    position: relative;
3471  }
3472
3473  .header-lasted-ticker {
3474    display: flex;
3475    animation: header-lasted-scroll 45s linear infinite;
3476    white-space: nowrap;
3477    width: max-content;
3478  }
3479
3480  .header-lasted-item {
3481    margin-right: 80px;
3482    font-size: 0.95rem;
3483    font-weight: 400;
3484    flex-shrink: 0;
3485    min-width: max-content;
3486  }
3487
3488  .header-lasted-item a {
3489    color: #000;
3490    text-decoration: none;
3491    transition: opacity 0.3s ease;
3492    padding-left: 20px;
3493    display: inline-block;
3494    white-space: nowrap;
3495  }
3496
3497  .header-lasted-item a:hover {
3498    opacity: 0.7;
3499    text-decoration: underline;
3500  }
3501
3502  @keyframes header-lasted-scroll {
3503    0% {
3504      transform: translateX(0);
3505    }
3506    100% {
3507      transform: translateX(-100%);
3508    }
3509  }
3510
3511  /* Pausar animação ao hover */
3512  .header-lasted-banner:hover .header-lasted-ticker {
3513    animation-play-state: paused;
3514  }
3515
3516  div>.container-fluid .overflow-hidden {
3517    max-width: 100% !important;
3518  }
3519
3520  /* Responsividade */
3521  @media (max-width: 768px) {
3522    .header-lasted-container {
3523      padding: 0 15px;
3524    }
3525
3526    .header-lasted-item {
3527      font-size: 0.9rem;
3528      margin-right: 60px;
3529    }
3530
3531    .header-lasted-ticker {
3532      animation-duration: 35s;
3533    }
3534  }
3535
3536  @media (max-width: 480px) {
3537    .header-lasted-banner {
3538      padding: 10px 0;
3539    }
3540
3541    .header-lasted-item {
3542      font-size: 0.85rem;
3543      margin-right: 50px;
3544    }
3545
3546    .header-lasted-ticker {
3547      animation-duration: 30s;
3548    }
3549  }
3550
3551  .header-lasted-item .row:nth-child(odd) a::before {
3552    content: "■";
3553    color: black;
3554    margin-right: 8px;
3555    font-size: 12px;
3556    vertical-align: middle;
3557  }
3558
3559  .header-lasted-item .row:nth-child(even) a::before {
3560    content: "●";
3561    color: black;
3562    margin-right: 8px;
3563    font-size: 12px;
3564    vertical-align: middle;
3565  }</style>
3566      </div>
3567     </div>
3568    </div>
3569   </div>
3570  </div>
3571 </div>
3572 <div class="lfr-layout-structure-item-cd913b2b-6404-2c68-27c4-38fc62d49729 lfr-layout-structure-item-container " data-layout-structure-item-id="cd913b2b-6404-2c68-27c4-38fc62d49729">
3573  <div class="lfr-layout-structure-item-807a1aee-35f8-dc3c-e3c9-0aa39888c17c lfr-layout-structure-item-container  container-fluid container-fluid-max-xl" data-layout-structure-item-id="807a1aee-35f8-dc3c-e3c9-0aa39888c17c">
3574   <div class="lfr-layout-structure-item-51c1250a-3f54-41cc-d93c-4551a937cd48 lfr-layout-structure-item-row " data-layout-structure-item-id="51c1250a-3f54-41cc-d93c-4551a937cd48">
3575    <div class="row align-items-lg-start align-items-sm-start align-items-start align-items-md-start flex-lg-row flex-sm-row flex-row flex-md-row">
3576     <div class="col col-lg-9 col-sm-12 col-12 col-md-12">
3577      <div class="lfr-layout-structure-item-destacador-noticias lfr-layout-structure-item-51d78333-93f4-3f12-dc71-84e44d63f72d " data-layout-structure-item-id="51d78333-93f4-3f12-dc71-84e44d63f72d">
3578       <div id="fragment-79ae4819-9155-2181-4539-f8c1c779bbb9">
3579        <div class="psp-news-highlighter psp-news-highlighter--pjpy squared" style="position: relative;">
3580         <div class="swiper psp-news-highlighter__swiper overflow-x-hidden">
3581          <div class="swiper-wrapper">
3582           <div class="swiper-slide" style="overflow: hidden">
3583            <div class="journal-content-article " data-analytics-asset-id="62001919" data-analytics-asset-title="Prefeitura inaugura 35ª UPA e 485ª UBS da cidade com entrega de novas unidades em Perus" data-analytics-asset-type="web-content" data-analytics-external-reference-code="47dd422f-e329-c0ba-0343-4ae4907c4c77" data-analytics-web-content-resource-pk="62001921">
3584             <style>
3585    .destacador-image-top-vertical-layout {
3586        width: 100%;
3587        background: transparent;
3588        font-family: var(--font-family-sans-serif, system-ui, sans-serif);
3589    }
3590    .destacador-image-top-image-wrapper-home {
3591        position: relative;
3592        width: 100%;
3593        margin-bottom: 12px;
3594        aspect-ratio: 14 / 9;
3595        overflow: hidden;
3596        background-color: #e9ecef;
3597    }
3598    .destacador-image-top-category-tag {
3599        background-color: #00BCD4;
3600        color: #FFFFFF;
3601        padding: 6px 14px;
3602        font-size: 13px;
3603        font-weight: bold;
3604        text-transform: uppercase;
3605        position: absolute;
3606        top: 2%;
3607        left: 2%;
3608        z-index: 25;
3609        pointer-events: none;
3610    }
3611    .destacador-image-top-image-container {
3612        width: 100%;
3613        height: 100%;
3614        object-fit: cover;
3615        object-position: center;
3616        display: block;
3617    }
3618    .destacador-image-top-video-container {
3619        position: absolute;
3620        inset: 0;
3621        background-color: #000;
3622        z-index: 10;
3623    }
3624    .destacador-image-top-youtube-player {
3625        width: 100%;
3626        height: 100%;
3627    }
3628    .destacador-image-top-play-overlay {
3629        position: absolute;
3630        top: 50%;
3631        left: 50%;
3632        transform: translate(-50%, -50%);
3633        width: 72px;
3634        height: 72px;
3635        background-color: #ffd100;
3636        display: flex;
3637        align-items: center;
3638        justify-content: center;
3639        cursor: pointer;
3640        z-index: 20;
3641        border: none;
3642    }
3643    .destacador-image-top-play-overlay::before {
3644        content: '';
3645        border-left: 22px solid #1a1a1a;
3646        border-top: 14px solid transparent;
3647        border-bottom: 14px solid transparent;
3648        margin-left: 2px;
3649    }
3650    .destacador-image-top-title-slider {
3651        font-size: 26px;
3652        font-weight: bold;
3653        color: #333;
3654        margin-bottom: 8px;
3655    }
3656    .destacador-image-top-title-slider a {
3657        color: inherit;
3658        text-decoration: none;
3659        transition: color 0.2s;
3660    }
3661    .destacador-image-top-title-slider a:hover {
3662        color: #000;
3663    }
3664    .destacador-image-top-description {
3665        font-size: 15px;
3666        color: #666;
3667        line-height: 1.5;
3668        margin: 0;
3669    }
3670    .d-none {
3671        display: none !important;
3672    }
3673</style>
3674             <div class="destacador-image-top-vertical-layout" id="card-62001919">
3675              <div class="destacador-image-top-image-wrapper-home " id="wrapper-62001919">
3676               <div class="destacador-image-top-category-tag">Saúde</div>
3677               <div id="media-target-62001919" style="width: 100%; height: 100%;">
3678                <a href="/web/sampa-news/w/prefeitura-inaugura-35%C2%AA-upa-e-485%C2%AA-ubs-da-cidade-com-entrega-de-novas-unidades-em-perus" style="display: block; width: 100%; height: 100%;" draggable="false"> <img class="destacador-image-top-image-container" src="https://sampanews.sp.gov.br/documents/34276/0/20261006A_Insuguracao_UPA_UBS_Residencial_+das_Orquideas_SB-03.jpg/37d2dc61-98fa-e870-1d94-718cc4ccdd9b?version=1.0&amp;t=1791308556442" alt="Prefeitura inaugura 35ª UPA e 485ª UBS da cidade com entrega de novas unidades em Perus" draggable="false"> </a>
3679               </div>
3680              </div>
3681              <div class="destacador-image-top-content">
3682               <h2 class="destacador-image-top-title-slider"><a href="/web/sampa-news/w/prefeitura-inaugura-35%C2%AA-upa-e-485%C2%AA-ubs-da-cidade-com-entrega-de-novas-unidades-em-perus">Prefeitura inaugura 35ª UPA e 485ª UBS da cidade com entrega de novas unidades em Perus</a></h2>
3683               <a href="/web/sampa-news/w/prefeitura-inaugura-35%C2%AA-upa-e-485%C2%AA-ubs-da-cidade-com-entrega-de-novas-unidades-em-perus" style="text-decoration: none; color: inherit; display: block;"> 
3684                <p class="destacador-image-top-description">Complexo na periferia da Zona Norte recebeu mais de R$ 14,2 milhões e reúne 326 profissionais; unidades oferecem urgência 24 horas e acompanhamento de saúde</p> 
3685               </a>
3686              </div>
3687             </div>
3688             
3688<script>
3689    function playYouTubeVideo(id, url) {
3690        let videoId = url.match(/(?:v=|be\/|embed\/)([a-zA-Z0-9_-]{11})/)?.[1] || url;
3691        if (videoId) {
3692            document.getElementById('video-container-' + id).classList.remove('d-none');
3693            document.getElementById('play-btn-' + id).classList.add('d-none');
3694            document.getElementById('iframe-' + id).src = 'https://www.youtube.com/embed/' + videoId + '?autoplay=1&rel=0';
3695        }
3696    }
3697
3698    (function () {
3699        const articleId = '62001919';
3700        const siteGroupId = themeDisplay.getSiteGroupId();
3701        const mediaTarget = document.getElementById('media-target-' + articleId);
3702
3703        if (!mediaTarget) return;
3704
3705        fetch('/o/headless-delivery/v1.0/sites/' + siteGroupId + '/structured-contents/by-key/' + articleId)
3706            .then(res => res.json())
3707            .then(data => {
3708                if (data.relatedContents && data.relatedContents.length > 0) {
3709                    const promises = data.relatedContents.map(c => fetch('/o/headless-delivery/v1.0/documents/' + c.id).then(r => r.json()));
3710                    Promise.all(promises).then(docs => {
3711                        let antes = '', depois = '';
3712                        docs.forEach(d => {
3713                            if (d.contentUrl) {
3714                                let title = (d.title || '').toLowerCase();
3715                                let url = d.contentUrl.replace(/(\?|&)download=true/g, '$1download=false');
3716                                if (title.includes('slider-antes')) antes = url;
3717                                if (title.includes('slider-depois')) depois = url;
3718                            }
3719                        });
3720
3721                        if (antes && depois) {
3722                            const playBtn = document.getElementById('play-btn-' + articleId);
3723                            if (playBtn) playBtn.classList.add('d-none');
3724
3725                            mediaTarget.innerHTML = `
3726    <div class="cx-slider-wrapper" style="position: absolute; inset: 0;" draggable="false" ondragstart="return false;">
3727        <style>
3728            .cx-container-62001919 { --pos: 50%; position: relative; width: 100%; height: 100%; overflow: hidden; display: flex; user-select: none; -webkit-user-drag: none; }
3729            .cx-panel-62001919 { position: absolute; inset: 0; width: 100%; height: 100%; }
3730            .cx-panel-62001919 img { width: 100%; height: 100%; object-fit: cover; pointer-events: none; display: block; -webkit-user-drag: none; }
3731            .cx-before-62001919 { clip-path: polygon(0 0, var(--pos) 0, var(--pos) 100%, 0 100%); z-index: 2; }
3732            .cx-slider-input-62001919 { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; z-index: 10; cursor: ew-resize; margin: 0; }
3733            .cx-handle-62001919 { position: absolute; top: 0; bottom: 0; left: var(--pos); width: 3px; background: #fff; transform: translateX(-50%); pointer-events: none; z-index: 8; box-shadow: 0 0 5px rgba(0,0,0,0.5); }
3734            .cx-handle-btn-62001919 { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 32px; height: 32px; background: #fff; display: flex; align-items: center; justify-content: center; border-radius: 50%; box-shadow: 0 2px 5px rgba(0,0,0,0.3); }
3735            .cx-handle-btn-62001919 svg { width: 18px; height: 18px; color: #333; }
3736        </style>
3737        <div class="cx-container-62001919" style="--pos: 50%;">
3738            <div class="cx-panel-62001919"><img src="` + depois + `" draggable="false"/></div>
3739            <div class="cx-panel-62001919 cx-before-62001919"><img src="` + antes + `" draggable="false" /></div>
3740            <input type="range" min="0" max="100" value="50" class="cx-slider-input-62001919" oninput="this.parentElement.style.setProperty('--pos', this.value + '%')" draggable="false" ondragstart="return false;">
3741            <div class="cx-handle-62001919">
3742                <div class="cx-handle-btn-62001919">
3743                    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
3744                        <path d="M10 16l-4-4 4-4M14 8l4 4-4 4" />
3745                    </svg>
3746                </div>
3747            </div>
3748        </div>
3749    </div>`;
3750                            const rangeInput = mediaTarget.querySelector('.cx-slider-input-' + articleId);
3751                            if (rangeInput) {
3752                                ['mousedown', 'touchstart', 'click'].forEach(evt => {
3753                                    rangeInput.addEventListener(evt, e => e.stopPropagation(), { passive: false });
3754                                });
3755                            }
3756                        }
3757                    });
3758                }
3759            }).catch(e => console.error("Erro Slider:", e));
3760    })();
3761
3762</script>
3762
3763            </div>
3764           </div>
3765           <div class="swiper-slide" style="overflow: hidden">
3766            <div class="journal-content-article " data-analytics-asset-id="61957436" data-analytics-asset-title="Carnaval 2027: Prefeitura antecipa organização e 741 blocos estão inscritos para desfilarem nas ruas da cidade, 17,6% a mais do que na última edição" data-analytics-asset-type="web-content" data-analytics-external-reference-code="b3048a83-487f-353b-f7a9-83c1829f404f" data-analytics-web-content-resource-pk="61957438">
3767             <style>
3768    .destacador-image-top-vertical-layout {
3769        width: 100%;
3770        background: transparent;
3771        font-family: var(--font-family-sans-serif, system-ui, sans-serif);
3772    }
3773    .destacador-image-top-image-wrapper-home {
3774        position: relative;
3775        width: 100%;
3776        margin-bottom: 12px;
3777        aspect-ratio: 14 / 9;
3778        overflow: hidden;
3779        background-color: #e9ecef;
3780    }
3781    .destacador-image-top-category-tag {
3782        background-color: #00BCD4;
3783        color: #FFFFFF;
3784        padding: 6px 14px;
3785        font-size: 13px;
3786        font-weight: bold;
3787        text-transform: uppercase;
3788        position: absolute;
3789        top: 2%;
3790        left: 2%;
3791        z-index: 25;
3792        pointer-events: none;
3793    }
3794    .destacador-image-top-image-container {
3795        width: 100%;
3796        height: 100%;
3797        object-fit: cover;
3798        object-position: center;
3799        display: block;
3800    }
3801    .destacador-image-top-video-container {
3802        position: absolute;
3803        inset: 0;
3804        background-color: #000;
3805        z-index: 10;
3806    }
3807    .destacador-image-top-youtube-player {
3808        width: 100%;
3809        height: 100%;
3810    }
3811    .destacador-image-top-play-overlay {
3812        position: absolute;
3813        top: 50%;
3814        left: 50%;
3815        transform: translate(-50%, -50%);
3816        width: 72px;
3817        height: 72px;
3818        background-color: #ffd100;
3819        display: flex;
3820        align-items: center;
3821        justify-content: center;
3822        cursor: pointer;
3823        z-index: 20;
3824        border: none;
3825    }
3826    .destacador-image-top-play-overlay::before {
3827        content: '';
3828        border-left: 22px solid #1a1a1a;
3829        border-top: 14px solid transparent;
3830        border-bottom: 14px solid transparent;
3831        margin-left: 2px;
3832    }
3833    .destacador-image-top-title-slider {
3834        font-size: 26px;
3835        font-weight: bold;
3836        color: #333;
3837        margin-bottom: 8px;
3838    }
3839    .destacador-image-top-title-slider a {
3840        color: inherit;
3841        text-decoration: none;
3842        transition: color 0.2s;
3843    }
3844    .destacador-image-top-title-slider a:hover {
3845        color: #000;
3846    }
3847    .destacador-image-top-description {
3848        font-size: 15px;
3849        color: #666;
3850        line-height: 1.5;
3851        margin: 0;
3852    }
3853    .d-none {
3854        display: none !important;
3855    }
3856</style>
3857             <div class="destacador-image-top-vertical-layout" id="card-61957436">
3858              <div class="destacador-image-top-image-wrapper-home " id="wrapper-61957436">
3859               <div class="destacador-image-top-category-tag">Cultura</div>
3860               <div id="media-target-61957436" style="width: 100%; height: 100%;">
3861                <a href="/web/sampa-news/w/carnaval-2027-prefeitura-antecipa-organiza%C3%A7%C3%A3o-e-741-blocos-est%C3%A3o-inscritos-para-desfilarem-nas-ruas-da-cidade-17-6-a-mais-do-que-na-%C3%BAltima-edi%C3%A7%C3%A3o" style="display: block; width: 100%; height: 100%;" draggable="false"> <img class="destacador-image-top-image-container" src="https://sampanews.sp.gov.br/documents/24771855/0/WhatsApp+Image+2026-10-01+at+20.35.15+%281%29.jpg/93ff2a0e-67e8-c480-dc13-0e69d6ec0de7?version=1.0&amp;t=1790947818235" alt="Carnaval 2027: Prefeitura antecipa organização e 741 blocos estão inscritos para desfiles de rua, 17,6% a mais do que na última edição" draggable="false"> </a>
3862               </div>
3863              </div>
3864              <div class="destacador-image-top-content">
3865               <h2 class="destacador-image-top-title-slider"><a href="/web/sampa-news/w/carnaval-2027-prefeitura-antecipa-organiza%C3%A7%C3%A3o-e-741-blocos-est%C3%A3o-inscritos-para-desfilarem-nas-ruas-da-cidade-17-6-a-mais-do-que-na-%C3%BAltima-edi%C3%A7%C3%A3o">Carnaval 2027: Prefeitura antecipa organização e 741 blocos estão inscritos para desfiles de rua, 17,6% a mais do que na última edição</a></h2>
3866               <a href="/web/sampa-news/w/carnaval-2027-prefeitura-antecipa-organiza%C3%A7%C3%A3o-e-741-blocos-est%C3%A3o-inscritos-para-desfilarem-nas-ruas-da-cidade-17-6-a-mais-do-que-na-%C3%BAltima-edi%C3%A7%C3%A3o" style="text-decoration: none; color: inherit; display: block;"> 
3867                <p class="destacador-image-top-description">Planejamento começou meses antes da folia e reúne 13 secretarias municipais, com participação de blocos e representantes dos bairros na organização da festa</p> 
3868               </a>
3869              </div>
3870             </div>
3871             
3871<script>
3872    function playYouTubeVideo(id, url) {
3873        let videoId = url.match(/(?:v=|be\/|embed\/)([a-zA-Z0-9_-]{11})/)?.[1] || url;
3874        if (videoId) {
3875            document.getElementById('video-container-' + id).classList.remove('d-none');
3876            document.getElementById('play-btn-' + id).classList.add('d-none');
3877            document.getElementById('iframe-' + id).src = 'https://www.youtube.com/embed/' + videoId + '?autoplay=1&rel=0';
3878        }
3879    }
3880
3881    (function () {
3882        const articleId = '61957436';
3883        const siteGroupId = themeDisplay.getSiteGroupId();
3884        const mediaTarget = document.getElementById('media-target-' + articleId);
3885
3886        if (!mediaTarget) return;
3887
3888        fetch('/o/headless-delivery/v1.0/sites/' + siteGroupId + '/structured-contents/by-key/' + articleId)
3889            .then(res => res.json())
3890            .then(data => {
3891                if (data.relatedContents && data.relatedContents.length > 0) {
3892                    const promises = data.relatedContents.map(c => fetch('/o/headless-delivery/v1.0/documents/' + c.id).then(r => r.json()));
3893                    Promise.all(promises).then(docs => {
3894                        let antes = '', depois = '';
3895                        docs.forEach(d => {
3896                            if (d.contentUrl) {
3897                                let title = (d.title || '').toLowerCase();
3898                                let url = d.contentUrl.replace(/(\?|&)download=true/g, '$1download=false');
3899                                if (title.includes('slider-antes')) antes = url;
3900                                if (title.includes('slider-depois')) depois = url;
3901                            }
3902                        });
3903
3904                        if (antes && depois) {
3905                            const playBtn = document.getElementById('play-btn-' + articleId);
3906                            if (playBtn) playBtn.classList.add('d-none');
3907
3908                            mediaTarget.innerHTML = `
3909    <div class="cx-slider-wrapper" style="position: absolute; inset: 0;" draggable="false" ondragstart="return false;">
3910        <style>
3911            .cx-container-61957436 { --pos: 50%; position: relative; width: 100%; height: 100%; overflow: hidden; display: flex; user-select: none; -webkit-user-drag: none; }
3912            .cx-panel-61957436 { position: absolute; inset: 0; width: 100%; height: 100%; }
3913            .cx-panel-61957436 img { width: 100%; height: 100%; object-fit: cover; pointer-events: none; display: block; -webkit-user-drag: none; }
3914            .cx-before-61957436 { clip-path: polygon(0 0, var(--pos) 0, var(--pos) 100%, 0 100%); z-index: 2; }
3915            .cx-slider-input-61957436 { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; z-index: 10; cursor: ew-resize; margin: 0; }
3916            .cx-handle-61957436 { position: absolute; top: 0; bottom: 0; left: var(--pos); width: 3px; background: #fff; transform: translateX(-50%); pointer-events: none; z-index: 8; box-shadow: 0 0 5px rgba(0,0,0,0.5); }
3917            .cx-handle-btn-61957436 { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 32px; height: 32px; background: #fff; display: flex; align-items: center; justify-content: center; border-radius: 50%; box-shadow: 0 2px 5px rgba(0,0,0,0.3); }
3918            .cx-handle-btn-61957436 svg { width: 18px; height: 18px; color: #333; }
3919        </style>
3920        <div class="cx-container-61957436" style="--pos: 50%;">
3921            <div class="cx-panel-61957436"><img src="` + depois + `" draggable="false"/></div>
3922            <div class="cx-panel-61957436 cx-before-61957436"><img src="` + antes + `" draggable="false" /></div>
3923            <input type="range" min="0" max="100" value="50" class="cx-slider-input-61957436" oninput="this.parentElement.style.setProperty('--pos', this.value + '%')" draggable="false" ondragstart="return false;">
3924            <div class="cx-handle-61957436">
3925                <div class="cx-handle-btn-61957436">
3926                    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
3927                        <path d="M10 16l-4-4 4-4M14 8l4 4-4 4" />
3928                    </svg>
3929                </div>
3930            </div>
3931        </div>
3932    </div>`;
3933                            const rangeInput = mediaTarget.querySelector('.cx-slider-input-' + articleId);
3934                            if (rangeInput) {
3935                                ['mousedown', 'touchstart', 'click'].forEach(evt => {
3936                                    rangeInput.addEventListener(evt, e => e.stopPropagation(), { passive: false });
3937                                });
3938                            }
3939                        }
3940                    });
3941                }
3942            }).catch(e => console.error("Erro Slider:", e));
3943    })();
3944
3945</script>
3945
3946            </div>
3947           </div>
3948           <div class="swiper-slide" style="overflow: hidden">
3949            <div class="journal-content-article " data-analytics-asset-id="61931196" data-analytics-asset-title="Prefeitura atinge marco histórico de 2 mil ônibus elétricos na frota de São Paulo com entrega de mais 250 veículos" data-analytics-asset-type="web-content" data-analytics-external-reference-code="da99104c-713c-153b-bdf9-2d38ede0dd73" data-analytics-web-content-resource-pk="61931198">
3950             <style>
3951    .destacador-image-top-vertical-layout {
3952        width: 100%;
3953        background: transparent;
3954        font-family: var(--font-family-sans-serif, system-ui, sans-serif);
3955    }
3956    .destacador-image-top-image-wrapper-home {
3957        position: relative;
3958        width: 100%;
3959        margin-bottom: 12px;
3960        aspect-ratio: 14 / 9;
3961        overflow: hidden;
3962        background-color: #e9ecef;
3963    }
3964    .destacador-image-top-category-tag {
3965        background-color: #00BCD4;
3966        color: #FFFFFF;
3967        padding: 6px 14px;
3968        font-size: 13px;
3969        font-weight: bold;
3970        text-transform: uppercase;
3971        position: absolute;
3972        top: 2%;
3973        left: 2%;
3974        z-index: 25;
3975        pointer-events: none;
3976    }
3977    .destacador-image-top-image-container {
3978        width: 100%;
3979        height: 100%;
3980        object-fit: cover;
3981        object-position: center;
3982        display: block;
3983    }
3984    .destacador-image-top-video-container {
3985        position: absolute;
3986        inset: 0;
3987        background-color: #000;
3988        z-index: 10;
3989    }
3990    .destacador-image-top-youtube-player {
3991        width: 100%;
3992        height: 100%;
3993    }
3994    .destacador-image-top-play-overlay {
3995        position: absolute;
3996        top: 50%;
3997        left: 50%;
3998        transform: translate(-50%, -50%);
3999        width: 72px;
4000        height: 72px;
4001        background-color: #ffd100;
4002        display: flex;
4003        align-items: center;
4004        justify-content: center;
4005        cursor: pointer;
4006        z-index: 20;
4007        border: none;
4008    }
4009    .destacador-image-top-play-overlay::before {
4010        content: '';
4011        border-left: 22px solid #1a1a1a;
4012        border-top: 14px solid transparent;
4013        border-bottom: 14px solid transparent;
4014        margin-left: 2px;
4015    }
4016    .destacador-image-top-title-slider {
4017        font-size: 26px;
4018        font-weight: bold;
4019        color: #333;
4020        margin-bottom: 8px;
4021    }
4022    .destacador-image-top-title-slider a {
4023        color: inherit;
4024        text-decoration: none;
4025        transition: color 0.2s;
4026    }
4027    .destacador-image-top-title-slider a:hover {
4028        color: #000;
4029    }
4030    .destacador-image-top-description {
4031        font-size: 15px;
4032        color: #666;
4033        line-height: 1.5;
4034        margin: 0;
4035    }
4036    .d-none {
4037        display: none !important;
4038    }
4039</style>
4040             <div class="destacador-image-top-vertical-layout" id="card-61931196">
4041              <div class="destacador-image-top-image-wrapper-home overlay-active" id="wrapper-61931196">
4042               <div class="destacador-image-top-category-tag">Mobilidade</div>
4043               <div class="destacador-image-top-video-container d-none" id="video-container-61931196">
4044                <iframe class="destacador-image-top-youtube-player" id="iframe-61931196" src="" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
4045               </div>
4046               <button class="destacador-image-top-play-overlay" id="play-btn-61931196" onclick="playYouTubeVideo('61931196', 'https://www.youtube.com/watch?v=YEXHAJjXLCw')"></button>
4047               <div id="media-target-61931196" style="width: 100%; height: 100%;">
4048                <a href="/web/sampa-news/w/prefeitura-atinge-marco-hist%C3%B3rico-de-2-mil-%C3%B4nibus-el%C3%A9tricos-na-frota-de-s%C3%A3o-paulo-com-entrega-de-mais-250-ve%C3%ADculos" style="display: block; width: 100%; height: 100%;" draggable="false"> <img class="destacador-image-top-image-container" src="https://sampanews.sp.gov.br/documents/24771855/0/6c2143a3-ea27-4a7b-9b43-41da83c4cb25.jpg/67f9a484-3869-40e9-ef19-189379a4a73e?version=1.0&amp;t=1790792199636" alt="Prefeitura atinge marco histórico de 2 mil ônibus elétricos na frota de São Paulo com entrega de mais 250 veículos" draggable="false"> </a>
4049               </div>
4050              </div>
4051              <div class="destacador-image-top-content">
4052               <h2 class="destacador-image-top-title-slider"><a href="/web/sampa-news/w/prefeitura-atinge-marco-hist%C3%B3rico-de-2-mil
4052-%C3%B4nibus-el%C3%A9tricos-na-frota-de-s%C3%A3o-paulo-com-entrega-de-mais-250-ve%C3%ADculos">Prefeitura atinge marco histórico de 2 mil ônibus elétricos na frota de São Paulo com entrega de mais 250 veículos</a></h2>
4053               <a href="/web/sampa-news/w/prefeitura-atinge-marco-hist%C3%B3rico-de-2-mil-%C3%B4nibus-el%C3%A9tricos-na-frota-de-s%C3%A3o-paulo-com-entrega-de-mais-250-ve%C3%ADculos" style="text-decoration: none; color: inherit; display: block;"> 
4054                <p class="destacador-image-top-description">Cidade já lidera a eletromobilidade no Brasil; na América Latina, só fica atrás da soma da frota de todo o Chile e agora supera Nova York, Madri, Roma, Berlim, Los Angeles, Chicago e Lisboa juntas</p> 
4055               </a>
4056              </div>
4057             </div>
4058             
4058<script>
4059    function playYouTubeVideo(id, url) {
4060        let videoId = url.match(/(?:v=|be\/|embed\/)([a-zA-Z0-9_-]{11})/)?.[1] || url;
4061        if (videoId) {
4062            document.getElementById('video-container-' + id).classList.remove('d-none');
4063            document.getElementById('play-btn-' + id).classList.add('d-none');
4064            document.getElementById('iframe-' + id).src = 'https://www.youtube.com/embed/' + videoId + '?autoplay=1&rel=0';
4065        }
4066    }
4067
4068    (function () {
4069        const articleId = '61931196';
4070        const siteGroupId = themeDisplay.getSiteGroupId();
4071        const mediaTarget = document.getElementById('media-target-' + articleId);
4072
4073        if (!mediaTarget) return;
4074
4075        fetch('/o/headless-delivery/v1.0/sites/' + siteGroupId + '/structured-contents/by-key/' + articleId)
4076            .then(res => res.json())
4077            .then(data => {
4078                if (data.relatedContents && data.relatedContents.length > 0) {
4079                    const promises = data.relatedContents.map(c => fetch('/o/headless-delivery/v1.0/documents/' + c.id).then(r => r.json()));
4080                    Promise.all(promises).then(docs => {
4081                        let antes = '', depois = '';
4082                        docs.forEach(d => {
4083                            if (d.contentUrl) {
4084                                let title = (d.title || '').toLowerCase();
4085                                let url = d.contentUrl.replace(/(\?|&)download=true/g, '$1download=false');
4086                                if (title.includes('slider-antes')) antes = url;
4087                                if (title.includes('slider-depois')) depois = url;
4088                            }
4089                        });
4090
4091                        if (antes && depois) {
4092                            const playBtn = document.getElementById('play-btn-' + articleId);
4093                            if (playBtn) playBtn.classList.add('d-none');
4094
4095                            mediaTarget.innerHTML = `
4096    <div class="cx-slider-wrapper" style="position: absolute; inset: 0;" draggable="false" ondragstart="return false;">
4097        <style>
4098            .cx-container-61931196 { --pos: 50%; position: relative; width: 100%; height: 100%; overflow: hidden; display: flex; user-select: none; -webkit-user-drag: none; }
4099            .cx-panel-61931196 { position: absolute; inset: 0; width: 100%; height: 100%; }
4100            .cx-panel-61931196 img { width: 100%; height: 100%; object-fit: cover; pointer-events: none; display: block; -webkit-user-drag: none; }
4101            .cx-before-61931196 { clip-path: polygon(0 0, var(--pos) 0, var(--pos) 100%, 0 100%); z-index: 2; }
4102            .cx-slider-input-61931196 { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; z-index: 10; cursor: ew-resize; margin: 0; }
4103            .cx-handle-61931196 { position: absolute; top: 0; bottom: 0; left: var(--pos); width: 3px; background: #fff; transform: translateX(-50%); pointer-events: none; z-index: 8; box-shadow: 0 0 5px rgba(0,0,0,0.5); }
4104            .cx-handle-btn-61931196 { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 32px; height: 32px; background: #fff; display: flex; align-items: center; justify-content: center; border-radius: 50%; box-shadow: 0 2px 5px rgba(0,0,0,0.3); }
4105            .cx-handle-btn-61931196 svg { width: 18px; height: 18px; color: #333; }
4106        </style>
4107        <div class="cx-container-61931196" style="--pos: 50%;">
4108            <div class="cx-panel-61931196"><img src="` + depois + `" draggable="false"/></div>
4109            <div class="cx-panel-61931196 cx-before-61931196"><img src="` + antes + `" draggable="false" /></div>
4110            <input type="range" min="0" max="100" value="50" class="cx-slider-input-61931196" oninput="this.parentElement.style.setProperty('--pos', this.value + '%')" draggable="false" ondragstart="return false;">
4111            <div class="cx-handle-61931196">
4112                <div class="cx-handle-btn-61931196">
4113                    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
4114                        <path d="M10 16l-4-4 4-4M14 8l4 4-4 4" />
4115                    </svg>
4116                </div>
4117            </div>
4118        </div>
4119    </div>`;
4120                            const rangeInput = mediaTarget.querySelector('.cx-slider-input-' + articleId);
4121                            if (rangeInput) {
4122                                ['mousedown', 'touchstart', 'click'].forEach(evt => {
4123                                    rangeInput.addEventListener(evt, e => e.stopPropagation(), { passive: false });
4124                                });
4125                            }
4126                        }
4127                    });
4128                }
4129            }).catch(e => console.error("Erro Slider:", e));
4130    })();
4131
4132</script>
4132
4133            </div>
4134           </div>
4135           <div class="swiper-slide" style="overflow: hidden">
4136            <div class="journal-content-article " data-analytics-asset-id="61795641" data-analytics-asset-title="Com piscina semiolímpica coberta e aquecida, Prefeitura entrega recuperação e modernização completa do Centro Esportivo Carioca" data-analytics-asset-type="web-content" data-analytics-external-reference-code="ea975534-f5d3-0b94-4547-13a04d425959" data-analytics-web-content-resource-pk="61795643">
4137             <style>
4138    .destacador-image-top-vertical-layout {
4139        width: 100%;
4140        background: transparent;
4141        font-family: var(--font-family-sans-serif, system-ui, sans-serif);
4142    }
4143    .destacador-image-top-image-wrapper-home {
4144        position: relative;
4145        width: 100%;
4146        margin-bottom: 12px;
4147        aspect-ratio: 14 / 9;
4148        overflow: hidden;
4149        background-color: #e9ecef;
4150    }
4151    .destacador-image-top-category-tag {
4152        background-color: #00BCD4;
4153        color: #FFFFFF;
4154        padding: 6px 14px;
4155        font-size: 13px;
4156        font-weight: bold;
4157        text-transform: uppercase;
4158        position: absolute;
4159        top: 2%;
4160        left: 2%;
4161        z-index: 25;
4162        pointer-events: none;
4163    }
4164    .destacador-image-top-image-container {
4165        width: 100%;
4166        height: 100%;
4167        object-fit: cover;
4168        object-position: center;
4169        display: block;
4170    }
4171    .destacador-image-top-video-container {
4172        position: absolute;
4173        inset: 0;
4174        background-color: #000;
4175        z-index: 10;
4176    }
4177    .destacador-image-top-youtube-player {
4178        width: 100%;
4179        height: 100%;
4180    }
4181    .destacador-image-top-play-overlay {
4182        position: absolute;
4183        top: 50%;
4184        left: 50%;
4185        transform: translate(-50%, -50%);
4186        width: 72px;
4187        height: 72px;
4188        background-color: #ffd100;
4189        display: flex;
4190        align-items: center;
4191        justify-content: center;
4192        cursor: pointer;
4193        z-index: 20;
4194        border: none;
4195    }
4196    .destacador-image-top-play-overlay::before {
4197        content: '';
4198        border-left: 22px solid #1a1a1a;
4199        border-top: 14px solid transparent;
4200        border-bottom: 14px solid transparent;
4201        margin-left: 2px;
4202    }
4203    .destacador-image-top-title-slider {
4204        font-size: 26px;
4205        font-weight: bold;
4206        color: #333;
4207        margin-bottom: 8px;
4208    }
4209    .destacador-image-top-title-slider a {
4210        color: inherit;
4211        text-decoration: none;
4212        transition: color 0.2s;
4213    }
4214    .destacador-image-top-title-slider a:hover {
4215        color: #000;
4216    }
4217    .destacador-image-top-description {
4218        font-size: 15px;
4219        color: #666;
4220        line-height: 1.5;
4221        margin: 0;
4222    }
4223    .d-none {
4224        display: none !important;
4225    }
4226</style>
4227             <div class="destacador-image-top-vertical-layout" id="card-61795641">
4228              <div class="destacador-image-top-image-wrapper-home " id="wrapper-61795641">
4229               <div class="destacador-image-top-category-tag">Esportes</div>
4230               <div id="media-target-61795641" style="width: 100%; height: 100%;">
4231                <a href="/web/sampa-news/w/com-piscina-semiol%C3%ADmpica-coberta-e-aquecida-prefeitura-entrega-recupera%C3%A7%C3%A3o-e-moderniza%C3%A7%C3%A3o-completa-do-centro-esportivo-carioca" style="display: block; width: 100%; height: 100%;" draggable="false"> 
4232                 <div class="destacador-image-top-image-container" style="display:flex; align-items:center; justify-content:center;">
4233                  <span style="color:#adb5bd;">Imagem indisponível</span>
4234                 </div> 
4235                </a>
4236               </div>
4237              </div>
4238              <div class="destacador-image-top-content">
4239               <h2 class="destacador-image-top-title-slider"><a href="/web/sampa-news/w/com-piscina-semiol%C3%ADmpica-coberta-e-aquecida-prefeitura-entrega-recupera%C3%A7%C3%A3o-e-moderniza%C3%A7%C3%A3o-completa-do-centro-esportivo-carioca">Com piscina semiolímpica coberta e aquecida, Prefeitura entrega recuperação e modernização completa do Centro Esportivo Carioca</a></h2>
4240               <a href="/web/sampa-news/w/com-piscina-semiol%C3%ADmpica-coberta-e-aquecida-prefeitura-entrega-recupera%C3%A7%C3%A3o-e-moderniza%C3%A7%C3%A3o-completa-do-centro-esportivo-carioca" style="text-decoration: none; color: inherit; display: block;"> 
4241                <p class="destacador-image-top-description">Equipamento esportivo, que atende os moradores da área do Ipiranga, também ganhou vestiários adaptados para pessoas com deficiência e outras melhorias</p> 
4242               </a>
4243              </div>
4244             </div>
4245             
4245<script>
4246    function playYouTubeVideo(id, url) {
4247        let videoId = url.match(/(?:v=|be\/|embed\/)([a-zA-Z0-9_-]{11})/)?.[1] || url;
4248        if (videoId) {
4249            document.getElementById('video-container-' + id).classList.remove('d-none');
4250            document.getElementById('play-btn-' + id).classList.add('d-none');
4251            document.getElementById('iframe-' + id).src = 'https://www.youtube.com/embed/' + videoId + '?autoplay=1&rel=0';
4252        }
4253    }
4254
4255    (function () {
4256        const articleId = '61795641';
4257        const siteGroupId = themeDisplay.getSiteGroupId();
4258        const mediaTarget = document.getElementById('media-target-' + articleId);
4259
4260        if (!mediaTarget) return;
4261
4262        fetch('/o/headless-delivery/v1.0/sites/' + siteGroupId + '/structured-contents/by-key/' + articleId)
4263            .then(res => res.json())
4264            .then(data => {
4265                if (data.relatedContents && data.relatedContents.length > 0) {
4266                    const promises = data.relatedContents.map(c => fetch('/o/headless-delivery/v1.0/documents/' + c.id).then(r => r.json()));
4267                    Promise.all(promises).then(docs => {
4268                        let antes = '', depois = '';
4269                        docs.forEach(d => {
4270                            if (d.contentUrl) {
4271                                let title = (d.title || '').toLowerCase();
4272                                let url = d.contentUrl.replace(/(\?|&)download=true/g, '$1download=false');
4273                                if (title.includes('slider-antes')) antes = url;
4274                                if (title.includes('slider-depois')) depois = url;
4275                            }
4276                        });
4277
4278                        if (antes && depois) {
4279                            const playBtn = document.getElementById('play-btn-' + articleId);
4280                            if (playBtn) playBtn.classList.add('d-none');
4281
4282                            mediaTarget.innerHTML = `
4283    <div class="cx-slider-wrapper" style="position: absolute; inset: 0;" draggable="false" ondragstart="return false;">
4284        <style>
4285            .cx-container-61795641 { --pos: 50%; position: relative; width: 100%; height: 100%; overflow: hidden; display: flex; user-select: none; -webkit-user-drag: none; }
4286            .cx-panel-61795641 { position: absolute; inset: 0; width: 100%; height: 100%; }
4287            .cx-panel-61795641 img { width: 100%; height: 100%; object-fit: cover; pointer-events: none; display: block; -webkit-user-drag: none; }
4288            .cx-before-61795641 { clip-path: polygon(0 0, var(--pos) 0, var(--pos) 100%, 0 100%); z-index: 2; }
4289            .cx-slider-input-61795641 { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; z-index: 10; cursor: ew-resize; margin: 0; }
4290            .cx-handle-61795641 { position: absolute; top: 0; bottom: 0; left: var(--pos); width: 3px; background: #fff; transform: translateX(-50%); pointer-events: none; z-index: 8; box-shadow: 0 0 5px rgba(0,0,0,0.5); }
4291            .cx-handle-btn-61795641 { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 32px; height: 32px; background: #fff; display: flex; align-items: center; justify-content: center; border-radius: 50%; box-shadow: 0 2px 5px rgba(0,0,0,0.3); }
4292            .cx-handle-btn-61795641 svg { width: 18px; height: 18px; color: #333; }
4293        </style>
4294        <div class="cx-container-61795641" style="--pos: 50%;">
4295            <div class="cx-panel-61795641"><img src="` + depois + `" draggable="false"/></div>
4296            <div class="cx-panel-61795641 cx-before-61795641"><img src="` + antes + `" draggable="false" /></div>
4297            <input type="range" min="0" max="100" value="50" class="cx-slider-input-61795641" oninput="this.parentElement.style.setProperty('--pos', this.value + '%')" draggable="false" ondragstart="return false;">
4298            <div class="cx-handle-61795641">
4299                <div class="cx-handle-btn-61795641">
4300                    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
4301                        <path d="M10 16l-4-4 4-4M14 8l4 4-4 4" />
4302                    </svg>
4303                </div>
4304            </div>
4305        </div>
4306    </div>`;
4307                            const rangeInput = mediaTarget.querySelector('.cx-slider-input-' + articleId);
4308                            if (rangeInput) {
4309                                ['mousedown', 'touchstart', 'click'].forEach(evt => {
4310                                    rangeInput.addEventListener(evt, e => e.stopPropagation(), { passive: false });
4311                                });
4312                            }
4313                        }
4314                    });
4315                }
4316            }).catch(e => console.error("Erro Slider:", e));
4317    })();
4318
4319</script>
4319
4320            </div>
4321           </div>
4322           <div class="swiper-slide" style="overflow: hidden">
4323            <div class="journal-content-article " data-analytics-asset-id="61775669" data-analytics-asset-title="Prefeitura conclui icônico condomínio ‘Redondinhos’ em Heliópolis com entrega das últimas 120 moradias" data-analytics-asset-type="web-content" data-analytics-external-reference-code="bdfe3fb2-9456-e184-cc96-8850d492f9f4" data-analytics-web-content-resource-pk="61775671">
4324             <style>
4325    .destacador-image-top-vertical-layout {
4326        width: 100%;
4327        background: transparent;
4328        font-family: var(--font-family-sans-serif, system-ui, sans-serif);
4329    }
4330    .destacador-image-top-image-wrapper-home {
4331        position: relative;
4332        width: 100%;
4333        margin-bottom: 12px;
4334        aspect-ratio: 14 / 9;
4335        overflow: hidden;
4336        background-color: #e9ecef;
4337    }
4338    .destacador-image-top-category-tag {
4339        background-color: #00BCD4;
4340        color: #FFFFFF;
4341        padding: 6px 14px;
4342        font-size: 13px;
4343        font-weight: bold;
4344        text-transform: uppercase;
4345        position: absolute;
4346        top: 2%;
4347        left: 2%;
4348        z-index: 25;
4349        pointer-events: none;
4350    }
4351    .destacador-image-top-image-container {
4352        width: 100%;
4353        height: 100%;
4354        object-fit: cover;
4355        object-position: center;
4356        display: block;
4357    }
4358    .destacador-image-top-video-container {
4359        position: absolute;
4360        inset: 0;
4361        background-color: #000;
4362        z-index: 10;
4363    }
4364    .destacador-image-top-youtube-player {
4365        width: 100%;
4366        height: 100%;
4367    }
4368    .destacador-image-top-play-overlay {
4369        position: absolute;
4370        top: 50%;
4371        left: 50%;
4372        transform: translate(-50%, -50%);
4373        width: 72px;
4374        height: 72px;
4375        background-color: #ffd100;
4376        display: flex;
4377        align-items: center;
4378        justify-content: center;
4379        cursor: pointer;
4380        z-index: 20;
4381        border: none;
4382    }
4383    .destacador-image-top-play-overlay::before {
4384        content: '';
4385        border-left: 22px solid #1a1a1a;
4386        border-top: 14px solid transparent;
4387        border-bottom: 14px solid transparent;
4388        margin-left: 2px;
4389    }
4390    .destacador-image-top-title-slider {
4391        font-size: 26px;
4392        font-weight: bold;
4393        color: #333;
4394        margin-bottom: 8px;
4395    }
4396    .destacador-image-top-title-slider a {
4397        color: inherit;
4398        text-decoration: none;
4399        transition: color 0.2s;
4400    }
4401    .destacador-image-top-title-slider a:hover {
4402        color: #000;
4403    }
4404    .destacador-image-top-description {
4405        font-size: 15px;
4406        color: #666;
4407        line-height: 1.5;
4408        margin: 0;
4409    }
4410    .d-none {
4411        display: none !important;
4412    }
4413</style>
4414             <div class="destacador-image-top-vertical-layout" id="card-61775669">
4415              <div class="destacador-image-top-image-wrapper-home " id="wrapper-61775669">
4416               <div class="destacador-image-top-category-tag">Habitação</div>
4417               <div id="media-target-61775669" style="width: 100%; height: 100%;">
4418                <a href="/web/sampa-news/w/prefeitura-conclui-ic%C3%B4nico-condom%C3%ADnio-redondinhos-em-heli%C3%B3polis-com-entrega-das-%C3%BAltimas-120-moradias" style="display: block; width: 100%; height: 100%;" draggable="false"> <img class="destacador-image-top-image-container" src="https://sampanews.sp.gov.br/documents/24771855/0/WhatsApp+Image+2026-09-28+at+08.46.07+%281%29.jpg/3993bc4c-d0aa-f1dd-634d-30bf68b7d279?version=1.0&amp;t=1790599996890" alt="Prefeitura conclui icônico condomínio ‘Redondinhos’ em Heliópolis com entrega das últimas 120 moradias" draggable="false"> </a>
4419               </div>
4420              </div>
4421              <div class="destacador-image-top-content">
4422               <h2 class="destacador-image-top-title-slider"><a href="/web/sampa-news/w/prefeitura-conclui-ic%C3%B4nico-condom%C3%ADnio-redondinhos-em-heli%C3%B3polis-com-entrega-das-%C3%BAltimas-120-moradias">Prefeitura conclui icônico condomínio ‘Redondinhos’ em Heliópolis com entrega das últimas 120 moradias</a></h2>
4423               <a href="/web/sampa-news/w/prefeitura-conclui-ic%C3%B4nico-condom%C3%ADnio-redondinhos-em-heli%C3%B3polis-com-entrega-das-%C3%BAltimas-120-moradias" style="text-decoration: none; color: inherit; display: block;"> 
4424                <p class="destacador-image-top-description">
4424Chaves dos novos apartamentos foram entregues nesta sexta, durante o programa Prefeitura Presente Ipiranga, e marcam a conclusão de 1.200 moradias do conjunto</p> 
4425               </a>
4426              </div>
4427             </div>
4428             
4428<script>
4429    function playYouTubeVideo(id, url) {
4430        let videoId = url.match(/(?:v=|be\/|embed\/)([a-zA-Z0-9_-]{11})/)?.[1] || url;
4431        if (videoId) {
4432            document.getElementById('video-container-' + id).classList.remove('d-none');
4433            document.getElementById('play-btn-' + id).classList.add('d-none');
4434            document.getElementById('iframe-' + id).src = 'https://www.youtube.com/embed/' + videoId + '?autoplay=1&rel=0';
4435        }
4436    }
4437
4438    (function () {
4439        const articleId = '61775669';
4440        const siteGroupId = themeDisplay.getSiteGroupId();
4441        const mediaTarget = document.getElementById('media-target-' + articleId);
4442
4443        if (!mediaTarget) return;
4444
4445        fetch('/o/headless-delivery/v1.0/sites/' + siteGroupId + '/structured-contents/by-key/' + articleId)
4446            .then(res => res.json())
4447            .then(data => {
4448                if (data.relatedContents && data.relatedContents.length > 0) {
4449                    const promises = data.relatedContents.map(c => fetch('/o/headless-delivery/v1.0/documents/' + c.id).then(r => r.json()));
4450                    Promise.all(promises).then(docs => {
4451                        let antes = '', depois = '';
4452                        docs.forEach(d => {
4453                            if (d.contentUrl) {
4454                                let title = (d.title || '').toLowerCase();
4455                                let url = d.contentUrl.replace(/(\?|&)download=true/g, '$1download=false');
4456                                if (title.includes('slider-antes')) antes = url;
4457                                if (title.includes('slider-depois')) depois = url;
4458                            }
4459                        });
4460
4461                        if (antes && depois) {
4462                            const playBtn = document.getElementById('play-btn-' + articleId);
4463                            if (playBtn) playBtn.classList.add('d-none');
4464
4465                            mediaTarget.innerHTML = `
4466    <div class="cx-slider-wrapper" style="position: absolute; inset: 0;" draggable="false" ondragstart="return false;">
4467        <style>
4468            .cx-container-61775669 { --pos: 50%; position: relative; width: 100%; height: 100%; overflow: hidden; display: flex; user-select: none; -webkit-user-drag: none; }
4469            .cx-panel-61775669 { position: absolute; inset: 0; width: 100%; height: 100%; }
4470            .cx-panel-61775669 img { width: 100%; height: 100%; object-fit: cover; pointer-events: none; display: block; -webkit-user-drag: none; }
4471            .cx-before-61775669 { clip-path: polygon(0 0, var(--pos) 0, var(--pos) 100%, 0 100%); z-index: 2; }
4472            .cx-slider-input-61775669 { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; z-index: 10; cursor: ew-resize; margin: 0; }
4473            .cx-handle-61775669 { position: absolute; top: 0; bottom: 0; left: var(--pos); width: 3px; background: #fff; transform: translateX(-50%); pointer-events: none; z-index: 8; box-shadow: 0 0 5px rgba(0,0,0,0.5); }
4474            .cx-handle-btn-61775669 { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 32px; height: 32px; background: #fff; display: flex; align-items: center; justify-content: center; border-radius: 50%; box-shadow: 0 2px 5px rgba(0,0,0,0.3); }
4475            .cx-handle-btn-61775669 svg { width: 18px; height: 18px; color: #333; }
4476        </style>
4477        <div class="cx-container-61775669" style="--pos: 50%;">
4478            <div class="cx-panel-61775669"><img src="` + depois + `" draggable="false"/></div>
4479            <div class="cx-panel-61775669 cx-before-61775669"><img src="` + antes + `" draggable="false" /></div>
4480            <input type="range" min="0" max="100" value="50" class="cx-slider-input-61775669" oninput="this.parentElement.style.setProperty('--pos', this.value + '%')" draggable="false" ondragstart="return false;">
4481            <div class="cx-handle-61775669">
4482                <div class="cx-handle-btn-61775669">
4483                    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
4484                        <path d="M10 16l-4-4 4-4M14 8l4 4-4 4" />
4485                    </svg>
4486                </div>
4487            </div>
4488        </div>
4489    </div>`;
4490                            const rangeInput = mediaTarget.querySelector('.cx-slider-input-' + articleId);
4491                            if (rangeInput) {
4492                                ['mousedown', 'touchstart', 'click'].forEach(evt => {
4493                                    rangeInput.addEventListener(evt, e => e.stopPropagation(), { passive: false });
4494                                });
4495                            }
4496                        }
4497                    });
4498                }
4499            }).catch(e => console.error("Erro Slider:", e));
4500    })();
4501
4502</script>
4502
4503            </div>
4504           </div>
4505          </div>
4506         </div>
4507         <div class="sp-cshd-slider-controls-container">
4508          <button class="sp-cshd-slider-control sp-cshd-slider-control--prev sp-cshd-slider-control--side btn-control-pjpy" aria-label="Item anterior" onclick="forcarSlideAnterior(this)" style="z-index: 9999; pointer-events: auto;"> 
4509           <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
4510            <path d="M15 18L9 12L15 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
4511           </svg> 
4512          </button> <button class="sp-cshd-slider-control sp-cshd-slider-control--next sp-cshd-slider-control--side btn-control-pjpy" aria-label="Próximo item" onclick="forcarProximoSlide(this)" style="z-index: 9999; pointer-events: auto;"> 
4513           <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
4514            <path d="M9 18L15 12L9 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
4515           </svg> 
4516          </button>
4517         </div>
4518        </div>
4519       </div>
4520       <style>.psp-news-highlighter {
4521    position: relative;
4522}
4523
4524/* Container que segura os botões no meio do card */
4525.sp-cshd-slider-controls-container {
4526    position: absolute;
4527    top: 4%;
4528    left: 88%;
4529    width: 100%;
4530    transform: translateY(-50%);
4531    display: flex;
4532    pointer-events: none; /* Evita que o espaço vazio bloqueie cliques na imagem */
4533    z-index: 10;
4534}
4535
4536/* Estilo base dos seus botões */
4537.sp-cshd-slider-control {
4538    pointer-events: auto; /* Reativa o clique apenas em cima do botão */
4539    background-color: rgba(255, 255, 255, 0.9);
4540    border: none;
4541    width: 40px;
4542    height: 40px;
4543    display: flex;
4544    align-items: center;
4545    justify-content: center;
4546    cursor: pointer;
4547    box-shadow: 0 2px 4px rgba(0,0,0,0.15);
4548    color: #333;
4549    transition: background-color 0.2s ease;
4550}
4551
4552.sp-cshd-slider-control:hover {
4553    background-color: #fff;
4554    color: #00BCD4;
4555}
4556
4557/* Oculta os bullets antigos caso ainda venham do tema global */
4558.psp-news-highlighter .swiper-pagination {
4559    display: none !important;
4560}
4561
4562/* CSS media query dentro de um stylesheet */
4563@media (max-width: 600px) {
4564  .sp-cshd-slider-controls-container {
4565    top: 5%;
4566    left: 78%;
4567  }
4568}</style>
4569       
4569<script type="module">const configuration = {"itemTemplate":"DESTACADOR-DE-NOTICIAS","aspectRatio":"squared","collection":{"classPK":"25295325","itemType":"com.liferay.journal.model.JournalArticle","itemSubtype":"25294592","classNameId":"28822","title":"[Home] - Noticias Destaque Grande","type":"com.liferay.item.selector.criteria.InfoListItemSelectorReturnType"}}; const fragmentElement = document.querySelector('#fragment-79ae4819-9155-2181-4539-f8c1c779bbb9'); const fragmentElementId = 'fragment-79ae4819-9155-2181-4539-f8c1c779bbb9'; const fragmentEntryLinkNamespace = 'pjpy'; const fragmentNamespace = 'pjpy'; const layoutMode = 'view';// Funções globais atreladas diretamente à janela para evitar bloqueios do Liferay
4570window.forcarProximoSlide = function(botao) {
4571    const carrossel = botao.closest('.psp-news-highlighter').querySelector('.swiper');
4572    
4573    if (carrossel && carrossel.swiper) {
4574        carrossel.swiper.slideNext();
4575    } else {
4576        alert("Erro Crítico: A instância do Swiper não existe neste portal ou a classe mudou. Verifique se o autoplay dos slides está rodando sozinho.");
4577    }
4578};
4579
4580window.forcarSlideAnterior = function(botao) {
4581    const carrossel = botao.closest('.psp-news-highlighter').querySelector('.swiper');
4582    
4583    if (carrossel && carrossel.swiper) {
4584        carrossel.swiper.slidePrev();
4585    } else {
4586        alert("Erro Crítico: A instância do Swiper não existe neste portal ou a classe mudou.");
4587    }
4588};
4589
4590// Mantemos o inicializador apenas para iniciar os slides
4591(function() {
4592    const prefix = 'psp';
4593    const namespace = fragmentEntryLinkNamespace;
4594    const $wrapper = fragmentElement.querySelector(`.${prefix}-news-highlighter--${namespace}`);
4595    
4596    if (typeof PSP !== 'undefined' && PSP.initSwiper) {
4597        PSP.initSwiper({
4598            $scope: `.${prefix}-news-highlighter__swiper`,
4599            entriesSize: $wrapper.querySelectorAll(".swiper-slide").length,
4600            disableOnInteraction: true,
4601            allowTouchMove: true
4602        });
4603    } else if (typeof Swiper !== 'undefined') {
4604        new Swiper($wrapper.querySelector('.swiper'), {
4605            slidesPerView: 1, 
4606            allowTouchMove: true,
4607            autoplay: { delay: 5000 }
4608        });
4609    }
4610})();;</script>
4610
4611      </div>
4612      <div class="lfr-layout-structure-item-dd107ce7-eee9-e13b-cfcc-9bbf8526a2ad lfr-layout-structure-item-container  container-fluid container-fluid-max-xl" data-layout-structure-item-id="dd107ce7-eee9-e13b-cfcc-9bbf8526a2ad">
4613       <div class="lfr-layout-structure-item-73932101-1a68-8bf8-c705-49e1d3728484 lfr-layout-structure-item-collection" data-layout-structure-item-id="73932101-1a68-8bf8-c705-49e1d3728484" data-analytics-targetable-collection="com.liferay.layout.list.retriever.ClassedModelListObjectReference@708e5a21" id="analytics-targetable-collection-73932101-1a68-8bf8-c705-49e1d3728484">
4614        <div class="container-fluid overflow-hidden px-0">
4615         <div class="row align-items-start">
4616          <div class="col col-lg-4 col-sm-12 col-12 col-md-12">
4617           <div class="lfr-layout-structure-item-card-imagem-topo--copiar--0 lfr-layout-structure-item-89239ce9-5b3b-aa12-2678-2f2155a06be9 " data-layout-structure-item-id="89239ce9-5b3b-aa12-2678-2f2155a06be9">
4618            <div id="fragment-3895ef9e-eff0-a5ac-c75a-2da0339fc636">
4619             <div class="card-news-image-top-news-vertical-section">
4620              <!-- News Collection Container -->
4621              <div class="card-news-image-top-news-vertical-list">
4622               <!-- Individual News Item Template -->
4623               <div class="card-news-image-top-news-vertical-item">
4624                <!-- News Image (Top) -->
4625                <div class="card-news-image-top-news-vertical-image">
4626                 <div class="card-news-image-top-news-vertical-img">
4627                  <a href="https://sampanews.sp.gov.br/w/protocolo-de-monitoramento-cerebral-reduz-em-cerca-de-54-tempo-de-interna%C3%A7%C3%A3o-de-rec%C3%A9m-nascidos-em-utis-municipais-de-s%C3%A3o-paulo"> <img src="https://sampanews.sp.gov.br/documents/24771855/0/WhatsApp+Image+2026-09-23+at+14.17.34+%282%29.jpeg/541e8595-0ac7-3b9a-84c7-46798303da5d?version=1.0&amp;t=1790872614434" alt="Logo da Prefeitura de São Paulo"> </a>
4628                 </div>
4629                 <!-- Category Badge (Overlaid on Image) -->
4630                 <div class="card-news-image-top-news-vertical-category">
4631                  <div class="card-news-image-top-vertical-category-text">
4632                   <a href="https://sampanews.sp.gov.br/w/protocolo-de-monitoramento-cerebral-reduz-em-cerca-de-54-tempo-de-interna%C3%A7%C3%A3o-de-rec%C3%A9m-nascidos-em-utis-municipais-de-s%C3%A3o-paulo">Saúde</a>
4633                  </div>
4634                 </div>
4635                </div>
4636                <!-- News Content (Bottom) -->
4637                <div class="card-news-image-top-news-vertical-content">
4638                 <!-- Título Alternativo (PRIORIDADE - Visível por padrão) -->
4639                 <h2 data-lfr-editable-id="alt-title" data-lfr-editable-type="text" class="card-news-image-top-news-vertical-title-highlight card-news-alt-title"><a href="https://sampanews.sp.gov.br/w/protocolo-de-monitoramento-cerebral-reduz-em-cerca-de-54-tempo-de-interna%C3%A7%C3%A3o-de-rec%C3%A9m-nascidos-em-utis-municipais-de-s%C3%A3o-paulo"></a></h2>
4640                 <!-- Título Original (FALLBACK - Oculto por padrão) -->
4641                 <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" class="card-news-image-top-news-vertical-title-highlight d-none"><a href="https://sampanews.sp.gov.br/w/protocolo-de-monitoramento-cerebral-reduz-em-cerca-de-54-tempo-de-interna%C3%A7%C3%A3o-de-rec%C3%A9m-nascidos-em-utis-municipais-de-s%C3%A3o-paulo">Protocolo de monitoramento cerebral reduz em cerca de 54% tempo de internação de recém-nascidos em UTIs municipais de São Paulo</a></h2>
4642                </div>
4643               </div>
4644              </div>
4645             </div>
4646            </div>
4647            <style>.card-news-image-top-news-vertical-section a,
4648.card-news-image-top-news-vertical-section a:link,
4649.card-news-image-top-news-vertical-section a:visited,
4650.card-news-image-top-news-vertical-section a:hover,
4651.card-news-image-top-news-vertical-section a:active,
4652.card-news-image-top-news-vertical-section a:focus {
4653    color: inherit;
4654    text-decoration: none;
4655    outline: none;
4656    border: none;
4657    background: none;
4658    cursor: pointer;
4659}
4660
4661/* Ensure link reset applies to all nested elements */
4662.card-news-image-top-news-vertical-section a * {
4663    color: inherit;
4664    text-decoration: none;
4665}
4666
4667.card-news-image-top-resumo-news-vertical-section {
4668    padding: 20px 0px 20px 0px;
4669    background-color: transparent;
4670}
4671
4672.card-news-image-top-news-vertical-list {
4673    display: flex;
4674    flex-direction: column;
4675    gap: 0;
4676    max-width: 600px;
4677    margin: 0 auto;
4678    background-color: transparent;
4679}
4680
4681.card-news-image-top-news-vertical-item {
4682    display: flex;
4683    flex-direction: column;
4684    overflow: hidden;
4685    cursor: pointer;
4686    min-height: auto;
4687    background-color: transparent;
4688}
4689
4690/* News Image (Top) */
4691.card-news-image-top-news-vertical-image {
4692    position: relative;
4693    width: 100%;
4694    aspect-ratio: 100 / 62.5;
4695    overflow: hidden;
4696    background: #f8f9fa;
4697    border-bottom: 6px solid #a4d0d1;
4698    transition: all 0.3s ease;
4699}
4700
4701/* Hide image container when no image is present */
4702.card-news-image-top-news-vertical-image.no-image {
4703    display: none;
4704}
4705
4706.card-news-image-top-news-vertical-img,
4707.card-news-image-top-news-vertical-img img {
4708    width: 100%;
4709    height: 100%;
4710    object-fit: cover;
4711}
4712
4713/* News Content (Bottom) */
4714.card-news-image-top-news-vertical-content {
4715    flex: 1;
4716    padding: 2px 0px;
4717    display: flex;
4718    flex-direction: column;
4719    justify-content: flex-start;
4720    position: relative;
4721    background-color: transparent;
4722}
4723
4724/* Adjust content padding when no image */
4725.card-news-image-top-news-vertical-item.no-image .card-news-image-top-news-vertical-content {
4726    padding-top: 0;
4727}
4728
4729/* Category Badge (Overlaid on Image - Top Left) */
4730.card-news-image-top-news-vertical-category {
4731    position: absolute;
4732    top: 4px;
4733    left: 4px;
4734    z-index: 10;
4735}
4736
4737/* Move category to content area when no image */
4738.card-news-image-top-news-vertical-item.no-image .card-news-image-top-news-vertical-category {
4739    position: static;
4740    margin-bottom: 12px;
4741}
4742
4743.card-news-image-top-vertical-category-text {
4744    background: #a4d0d1;
4745    color: #333333;
4746    padding: 6px 12px;
4747    font-size: 12px;
4748    font-weight: 600;
4749    text-transform: uppercase;
4750    letter-spacing: 0.5px;
4751    display: inline-block;
4752}
4753
4754.card-news-image-top-news-vertical-title-highlight {
4755    font-size: 18px;
4756    font-weight: 700;
4757    line-height: 1.3;
4758    color: #212529;
4759    display: -webkit-box;
4760    -webkit-line-clamp: 3;
4761    -webkit-box-orient: vertical;
4762    overflow: hidden;
4763    margin-bottom: 15px;
4764}
4765
4766/* Utility class for hiding elements */
4767.d-none {
4768    display: none !important;
4769}
4770
4771/* Responsive Design */
4772@media (max-width: 768px) {
4773    .card-news-image-top-news-vertical-image {
4774        height: 250px;
4775    }
4776
4777    .card-news-image-top-news-vertical-section {
4778        padding: 0;
4779    }
4780
4781    .card-news-image-top-news-vertical-list {
4782        max-width: 100%;
4783        /* margin: 0 10px; */
4784    }
4785
4786    .card-news-image-top-news-vertical-content {
4787        padding: 10px 0px;
4788    }
4789
4790    .card-news-image-top-news-vertical-title-highlight {
4791        font-size: 18px;
4792    }
4793
4794    .card-news-image-top-vertical-category-text {
4795        font-size: 12px;
4796        padding: 5px 10px;
4797    }
4798
4799    .card-news-image-top-news-vertical-category {
4800        top: 12px;
4801        left: 12px;
4802    }
4803}
4804
4805@media (max-width: 480px) {
4806    .card-news-image-top-news-vertical-section {
4807        padding: 0;
4808    }
4809
4810    .card-news-image-top-news-vertical-image {
4811        /*height: 200px;*/
4812    }
4813
4814    .card-news-image-top-news-vertical-content {
4815        padding: 10px 0px;
4816    }
4817
4818    .card-news-image-top-news-vertical-title-highlight {
4819        font-size: 18px;
4820        margin-bottom: 12px;
4821    }
4822
4823    .card-news-image-top-news-vertical-category {
4824        top: 4px;
4825        left: 5px;
4826    }
4827}
4828
4829/* Animation for items appearing */
4830.card-news-image-top-news-vertical-item {
4831    opacity: 0;
4832    animation: fadeInUpVertical 0.6s ease forwards;
4833}
4834
4835.card-news-image-top-news-vertical-item:nth-child(1) {
4836    animation-delay: 0.1s;
4837}
4838
4839.card-news-image-top-news-vertical-item:nth-child(2) {
4840    animation-delay: 0.2s;
4841}
4842
4843.card-news-image-top-news-vertical-item:nth-child(3) {
4844    animation-delay: 0.3s;
4845}
4846
4847.card-news-image-top-news-vertical-item:nth-child(4) {
4848    animation-delay: 0.4s;
4849}
4850
4851@keyframes fadeInUpVertical {
4852    from {
4853        opacity: 0;
4854        transform: translateY(30px);
4855    }
4856
4857    to {
4858        opacity: 1;
4859        transform: translateY(0);
4860    }
4861}
4862
4863/* Print styles */
4864@media print {
4865    .card-news-image-top-vertical-category-text {
4866        background: #a4d0d1 !important;
4867        color: #333333 !important;
4868    }
4869}</style>
4870            
4870<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-3895ef9e-eff0-a5ac-c75a-2da0339fc636'); const fragmentElementId = 'fragment-3895ef9e-eff0-a5ac-c75a-2da0339fc636'; const fragmentEntryLinkNamespace = 'gsmq'; const fragmentNamespace = 'gsmq'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function() {
4871    let isUpdating = false;
4872    let observer = null;
4873    
4874    function checkForImages() {
4875        if (isUpdating) return;
4876        
4877        try {
4878            const newsItems = document.querySelectorAll('.card-news-image-top-news-vertical-item');
4879
4880            newsItems.forEach(function(item) {
4881                const imageContainer = item.querySelector('.card-news-image-top-news-vertical-image');
4882                const img = item.querySelector('.card-news-image-top-news-vertical-img img');
4883                const category = item.querySelector('.card-news-image-top-news-vertical-category');
4884                const content = item.querySelector('.card-news-image-top-news-vertical-content');
4885
4886                if (img && imageContainer) {
4887                    const isEmpty = !img.src ||
4888                                   img.src === '' ||
4889                                   img.src.includes('data:image/svg+xml') ||
4890                                   img.src.includes('placeholder') ||
4891                                   img.src.includes('default-image');
4892
4893                    const currentlyHasNoImage = item.classList.contains('no-image');
4894                    
4895                    if (isEmpty && !currentlyHasNoImage) {
4896                        imageContainer.classList.add('no-image');
4897                        item.classList.add('no-image');
4898
4899                        if (category && content && !content.contains(category)) {
4900                            content.insertBefore(category, content.firstChild);
4901                        }
4902                    } else if (!isEmpty && currentlyHasNoImage) {
4903                        imageContainer.classList.remove('no-image');
4904                        item.classList.remove('no-image');
4905
4906                        if (category && imageContainer && !imageContainer.contains(category)) {
4907                            imageContainer.appendChild(category);
4908                        }
4909                    }
4910                }
4911            });
4912        } catch (error) {
4913            console.error('Erro no checkForImages:', error);
4914        }
4915    }
4916
4917    function updateTitleDisplay() {
4918        if (isUpdating) return;
4919        isUpdating = true;
4920        
4921        try {
4922            const newsItems = document.querySelectorAll('.card-news-image-top-news-vertical-item');
4923
4924            newsItems.forEach(function(item) {
4925                const altTitleElement = item.querySelector('[data-lfr-editable-id="alt-title"]');
4926                const originalTitleElement = item.querySelector('[data-lfr-editable-id="title"]');
4927
4928                if (altTitleElement && originalTitleElement) {
4929                    const altTitleText = altTitleElement.textContent.trim();
4930                    
4931                    // Verifica se o título alternativo é válido
4932                    if (altTitleText &&
4933                        altTitleText.length > 0 &&
4934                        !altTitleText.includes('[Mapear campo') &&
4935                        altTitleText !== 'TitleAlternative' &&
4936                        altTitleText !== '') {
4937
4938                        // Mostra título alternativo e oculta original
4939                        altTitleElement.classList.remove('d-none');
4940                        originalTitleElement.classList.add('d-none');
4941                    } else {
4942                        // Oculta título alternativo e mostra original
4943                        altTitleElement.classList.add('d-none');
4944                        originalTitleElement.classList.remove('d-none');
4945                    }
4946                }
4947            });
4948        } catch (error) {
4949            console.error('Erro no updateTitleDisplay:', error);
4950        } finally {
4951            isUpdating = false;
4952        }
4953    }
4954
4955    function runBothUpdates() {
4956        checkForImages();
4957        updateTitleDisplay();
4958    }
4959
4960    function initializeObserver() {
4961        if (observer || !window.MutationObserver) return;
4962        
4963        observer = new MutationObserver(function(mutations) {
4964            if (isUpdating) return;
4965            
4966            let shouldUpdate = false;
4967            
4968            mutations.forEach(function(mutation) {
4969                if (mutation.type === 'childList') {
4970                    const target = mutation.target;
4971                    if (target.hasAttribute && 
4972                        (target.hasAttribute('data-lfr-editable-id') || 
4973                         target.closest('[data-lfr-editable-id]') ||
4974                         target.closest('.card-news-image-top-news-vertical-item'))) {
4975                        shouldUpdate = true;
4976                    }
4977                } else if (mutation.type === 'attributes' && 
4978                          mutation.attributeName === 'src' &&
4979                          mutation.target.tagName === 'IMG') {
4980                    shouldUpdate = true;
4981                }
4982            });
4983
4984            if (shouldUpdate) {
4985                clearTimeout(window.newsUpdateTimeout);
4986                window.newsUpdateTimeout = setTimeout(runBothUpdates, 150);
4987            }
4988        });
4989
4990        const newsSection = document.querySelector('.card-news-image-top-news-vertical-section') || document.body;
4991        const newsItems = document.querySelectorAll('.card-news-image-top-news-vertical-item');
4992        
4993        observer.observe(newsSection, {
4994            childList: true,
4995            subtree: true,
4996            attributes: true,
4997            attributeFilter: ['src'],
4998            characterData: false
4999        });
5000        
5001        newsItems.forEach(function(item) {
5002            observer.observe(item, {
5003                childList: true,
5004                subtree: true,
5005                attributes: true,
5006                attributeFilter: ['src']
5007            });
5008        });
5009    }
5010
5011    // Execução inicial
5012    setTimeout(function() {
5013        runBothUpdates();
5014        initializeObserver();
5015    }, 200);
5016
5017    setTimeout(function() {
5018        if (!isUpdating) {
5019            runBothUpdates();
5020        }
5021    }, 1000);
5022
5023    // Event listeners do Liferay
5024    if (window.Liferay && Liferay.on) {
5025        let liferayTimeout;
5026        
5027        function handleLiferayEvent() {
5028            clearTimeout(liferayTimeout);
5029            liferayTimeout = setTimeout(function() {
5030                if (!isUpdating) {
5031                    runBothUpdates();
5032                }
5033            }, 200);
5034        }
5035        
5036        Liferay.on('editableFieldChanged', handleLiferayEvent);
5037        Liferay.on('allPortletsReady', handleLiferayEvent);
5038    }
5039
5040    // Cleanup
5041    window.addEventListener('beforeunload', function() {
5042        if (observer) {
5043            observer.disconnect();
5044        }
5045        clearTimeout(window.newsUpdateTimeout);
5046    });
5047});;</script>
5047
5048           </div>
5049          </div>
5050          <div class="col col-lg-4 col-sm-12 col-12 col-md-12">
5051           <div class="lfr-layout-structure-item-card-imagem-topo--copiar--0 lfr-layout-structure-item-89239ce9-5b3b-aa12-2678-2f2155a06be9 " data-layout-structure-item-id="89239ce9-5b3b-aa12-2678-2f2155a06be9">
5052            <div id="fragment-145bb82c-dad2-2739-7ad3-217115009fa4">
5053             <div class="card-news-image-top-news-vertical-section">
5054              <!-- News Collection Container -->
5055              <div class="card-news-image-top-news-vertical-list">
5056               <!-- Individual News Item Template -->
5057               <div class="card-news-image-top-news-vertical-item">
5058                <!-- News Image (Top) -->
5059                <div class="card-news-image-top-news-vertical-image">
5060                 <div class="card-news-image-top-news-vertical-img">
5061                  <a href="https://sampanews.sp.gov.br/w/nas-escolas-municipais-gr%C3%AAmios-d%C3%A3o-voz-aos-alunos-e-transformam-ideias-em-projetos"> <img src="https://sampanews.sp.gov.br/documents/24771855/0/20260824_Gremio_Estudantil_SB-4.jpg/518ff365-2abf-916c-b73a-71eada2392a4?version=1.0&amp;t=1790185838231" alt="Logo da Prefeitura de São Paulo"> </a>
5062                 </div>
5063                 <!-- Category Badge (Overlaid on Image) -->
5064                 <div class="card-news-image-top-news-vertical-category">
5065                  <div class="card-news-image-top-vertical-category-text">
5066                   <a href="https://sampanews.sp.gov.br/w/nas-escolas-municipais-gr%C3%AAmios-d%C3%A3o-voz-aos-alunos-e-transformam-ideias-em-projetos">Educação</a>
5067                  </div>
5068                 </div>
5069                </div>
5070                <!-- News Content (Bottom) -->
5071                <div class="card-news-image-top-news-vertical-content">
5072                 <!-- Título Alternativo (PRIORIDADE - Visível por padrão) -->
5073                 <h2 data-lfr-editable-id="alt-title" data-lfr-editable-type="text" class="card-news-image-top-news-vertical-title-highlight card-news-alt-title"><a href="https://sampanews.sp.gov.br/w/nas-escolas-municipais-gr%C3%AAmios-d%C3%A3o-voz-aos-alunos-e-transformam-ideias-em-projetos"></a></h2>
5074                 <!-- Título Original (FALLBACK - Oculto por padrão) -->
5075                 <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" class="card-news-image-top-news-vertical-title-highlight d-none"><a href="https://sampanews.sp.gov.br/w/nas-escolas-municipais-gr%C3%AAmios-d%C3%A3o-voz-aos-alunos-e-transformam-ideias-em-projetos">Nas escolas municipais, Grêmios dão voz aos alunos e transformam ideias em projetos</a></h2>
5076                </div>
5077               </div>
5078              </div>
5079             </div>
5080            </div>
5081            
5081<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-145bb82c-dad2-2739-7ad3-217115009fa4'); const fragmentElementId = 'fragment-145bb82c-dad2-2739-7ad3-217115009fa4'; const fragmentEntryLinkNamespace = 'gsmq'; const fragmentNamespace = 'gsmq'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function() {
5082    let isUpdating = false;
5083    let observer = null;
5084    
5085    function checkForImages() {
5086        if (isUpdating) return;
5087        
5088        try {
5089            const newsItems = document.querySelectorAll('.card-news-image-top-news-vertical-item');
5090
5091            newsItems.forEach(function(item) {
5092                const imageContainer = item.querySelector('.card-news-image-top-news-vertical-image');
5093                const img = item.querySelector('.card-news-image-top-news-vertical-img img');
5094                const category = item.querySelector('.card-news-image-top-news-vertical-category');
5095                const content = item.querySelector('.card-news-image-top-news-vertical-content');
5096
5097                if (img && imageContainer) {
5098                    const isEmpty = !img.src ||
5099                                   img.src === '' ||
5100                                   img.src.includes('data:image/svg+xml') ||
5101                                   img.src.includes('placeholder') ||
5102                                   img.src.includes('default-image');
5103
5104                    const currentlyHasNoImage = item.classList.contains('no-image');
5105                    
5106                    if (isEmpty && !currentlyHasNoImage) {
5107                        imageContainer.classList.add('no-image');
5108                        item.classList.add('no-image');
5109
5110                        if (category && content && !content.contains(category)) {
5111                            content.insertBefore(category, content.firstChild);
5112                        }
5113                    } else if (!isEmpty && currentlyHasNoImage) {
5114                        imageContainer.classList.remove('no-image');
5115                        item.classList.remove('no-image');
5116
5117                        if (category && imageContainer && !imageContainer.contains(category)) {
5118                            imageContainer.appendChild(category);
5119                        }
5120                    }
5121                }
5122            });
5123        } catch (error) {
5124            console.error('Erro no checkForImages:', error);
5125        }
5126    }
5127
5128    function updateTitleDisplay() {
5129        if (isUpdating) return;
5130        isUpdating = true;
5131        
5132        try {
5133            const newsItems = document.querySelectorAll('.card-news-image-top-news-vertical-item');
5134
5135            newsItems.forEach(function(item) {
5136                const altTitleElement = item.querySelector('[data-lfr-editable-id="alt-title"]');
5137                const originalTitleElement = item.querySelector('[data-lfr-editable-id="title"]');
5138
5139                if (altTitleElement && originalTitleElement) {
5140                    const altTitleText = altTitleElement.textContent.trim();
5141                    
5142                    // Verifica se o título alternativo é válido
5143                    if (altTitleText &&
5144                        altTitleText.length > 0 &&
5145                        !altTitleText.includes('[Mapear campo') &&
5146                        altTitleText !== 'TitleAlternative' &&
5147                        altTitleText !== '') {
5148
5149                        // Mostra título alternativo e oculta original
5150                        altTitleElement.classList.remove('d-none');
5151                        originalTitleElement.classList.add('d-none');
5152                    } else {
5153                        // Oculta título alternativo e mostra original
5154                        altTitleElement.classList.add('d-none');
5155                        originalTitleElement.classList.remove('d-none');
5156                    }
5157                }
5158            });
5159        } catch (error) {
5160            console.error('Erro no updateTitleDisplay:', error);
5161        } finally {
5162            isUpdating = false;
5163        }
5164    }
5165
5166    function runBothUpdates() {
5167        checkForImages();
5168        updateTitleDisplay();
5169    }
5170
5171    function initializeObserver() {
5172        if (observer || !window.MutationObserver) return;
5173        
5174        observer = new MutationObserver(function(mutations) {
5175            if (isUpdating) return;
5176            
5177            let shouldUpdate = false;
5178            
5179            mutations.forEach(function(mutation) {
5180                if (mutation.type === 'childList') {
5181                    const target = mutation.target;
5182                    if (target.hasAttribute && 
5183                        (target.hasAttribute('data-lfr-editable-id') || 
5184                         target.closest('[data-lfr-editable-id]') ||
5185                         target.closest('.card-news-image-top-news-vertical-item'))) {
5186                        shouldUpdate = true;
5187                    }
5188                } else if (mutation.type === 'attributes' && 
5189                          mutation.attributeName === 'src' &&
5190                          mutation.target.tagName === 'IMG') {
5191                    shouldUpdate = true;
5192                }
5193            });
5194
5195            if (shouldUpdate) {
5196                clearTimeout(window.newsUpdateTimeout);
5197                window.newsUpdateTimeout = setTimeout(runBothUpdates, 150);
5198            }
5199        });
5200
5201        const newsSection = document.querySelector('.card-news-image-top-news-vertical-section') || document.body;
5202        const newsItems = document.querySelectorAll('.card-news-image-top-news-vertical-item');
5203        
5204        observer.observe(newsSection, {
5205            childList: true,
5206            subtree: true,
5207            attributes: true,
5208            attributeFilter: ['src'],
5209            characterData: false
5210        });
5211        
5212        newsItems.forEach(function(item) {
5213            observer.observe(item, {
5214                childList: true,
5215                subtree: true,
5216                attributes: true,
5217                attributeFilter: ['src']
5218            });
5219        });
5220    }
5221
5222    // Execução inicial
5223    setTimeout(function() {
5224        runBothUpdates();
5225        initializeObserver();
5226    }, 200);
5227
5228    setTimeout(function() {
5229        if (!isUpdating) {
5230            runBothUpdates();
5231        }
5232    }, 1000);
5233
5234    // Event listeners do Liferay
5235    if (window.Liferay && Liferay.on) {
5236        let liferayTimeout;
5237        
5238        function handleLiferayEvent() {
5239            clearTimeout(liferayTimeout);
5240            liferayTimeout = setTimeout(function() {
5241                if (!isUpdating) {
5242                    runBothUpdates();
5243                }
5244            }, 200);
5245        }
5246        
5247        Liferay.on('editableFieldChanged', handleLiferayEvent);
5248        Liferay.on('allPortletsReady', handleLiferayEvent);
5249    }
5250
5251    // Cleanup
5252    window.addEventListener('beforeunload', function() {
5253        if (observer) {
5254            observer.disconnect();
5255        }
5256        clearTimeout(window.newsUpdateTimeout);
5257    });
5258});;</script>
5258
5259           </div>
5260          </div>
5261          <div class="col col-lg-4 col-sm-12 col-12 col-md-12">
5262           <div class="lfr-layout-structure-item-card-imagem-topo--copiar--0 lfr-layout-structure-item-89239ce9-5b3b-aa12-2678-2f2155a06be9 " data-layout-structure-item-id="89239ce9-5b3b-aa12-2678-2f2155a06be9">
5263            <div id="fragment-afe7ede1-fcdc-b3e1-9b83-e7545d841f95">
5264             <div class="card-news-image-top-news-vertical-section">
5265              <!-- News Collection Container -->
5266              <div class="card-news-image-top-news-vertical-list">
5267               <!-- Individual News Item Template -->
5268               <div class="card-news-image-top-news-vertical-item">
5269                <!-- News Image (Top) -->
5270                <div class="card-news-image-top-news-vertical-image">
5271                 <div class="card-news-image-top-news-vertical-img">
5272                  <a href="https://sampanews.sp.gov.br/w/com-p%C3%BAblico-recorde-carnaval-de-rua-de-s%C3%A3o-paulo-coloca-dj-calvin-harris-no-guinness"> <img src="https://sampanews.sp.gov.br/documents/24771855/0/0220260208_Pre_Carnaval_Consolacao_SB.JPG.jpeg/443d71c9-e473-45b8-fbcd-ca4192b94613?version=1.0&amp;t=1790012564159" alt="Logo da Prefeitura de São Paulo"> </a>
5273                 </div>
5274                 <!-- Category Badge (Overlaid on Image) -->
5275                 <div class="card-news-image-top-news-vertical-category">
5276                  <div class="card-news-image-top-vertical-category-text">
5277                   <a href="https://sampanews.sp.gov.br/w/com-p%C3%BAblico-recorde-carnaval-de-rua-de-s%C3%A3o-paulo-coloca-dj-calvin-harris-no-guinness">Turismo E Negócios</a>
5278                  </div>
5279                 </div>
5280                </div>
5281                <!-- News Content (Bottom) -->
5282                <div class="card-news-image-top-news-vertical-content">
5283                 <!-- Título Alternativo (PRIORIDADE - Visível por padrão) -->
5284                 <h2 data-lfr-editable-id="alt-title" data-lfr-editable-type="text" class="card-news-image-top-news-vertical-title-highlight card-news-alt-title"><a href="https://sampanews.sp.gov.br/w/com-p%C3%BAblico-recorde-carnaval-de-rua-de-s%C3%A3o-paulo-coloca-dj-calvin-harris-no-guinness"></a></h2>
5285                 <!-- Título Original (FALLBACK - Oculto por padrão) -->
5286                 <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" class="card-news-image-top-news-vertical-title-highlight d-none"><a href="https://sampanews.sp.gov.br/w/com-p%C3%BAblico-recorde-carnaval-de-rua-de-s%C3%A3o-paulo-coloca-dj-calvin-harris-no-guinness">Com público recorde, Carnaval de Rua de São Paulo coloca DJ Calvin Harris no Guinness</a></h2>
5287                </div>
5288               </div>
5289              </div>
5290             </div>
5291            </div>
5292            
5292<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-afe7ede1-fcdc-b3e1-9b83-e7545d841f95'); const fragmentElementId = 'fragment-afe7ede1-fcdc-b3e1-9b83-e7545d841f95'; const fragmentEntryLinkNamespace = 'gsmq'; const fragmentNamespace = 'gsmq'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function() {
5293    let isUpdating = false;
5294    let observer = null;
5295    
5296    function checkForImages() {
5297        if (isUpdating) return;
5298        
5299        try {
5300            const newsItems = document.querySelectorAll('.card-news-image-top-news-vertical-item');
5301
5302            newsItems.forEach(function(item) {
5303                const imageContainer = item.querySelector('.card-news-image-top-news-vertical-image');
5304                const img = item.querySelector('.card-news-image-top-news-vertical-img img');
5305                const category = item.querySelector('.card-news-image-top-news-vertical-category');
5306                const content = item.querySelector('.card-news-image-top-news-vertical-content');
5307
5308                if (img && imageContainer) {
5309                    const isEmpty = !img.src ||
5310                                   img.src === '' ||
5311                                   img.src.includes('data:image/svg+xml') ||
5312                                   img.src.includes('placeholder') ||
5313                                   img.src.includes('default-image');
5314
5315                    const currentlyHasNoImage = item.classList.contains('no-image');
5316                    
5317                    if (isEmpty && !currentlyHasNoImage) {
5318                        imageContainer.classList.add('no-image');
5319                        item.classList.add('no-image');
5320
5321                        if (category && content && !content.contains(category)) {
5322                            content.insertBefore(category, content.firstChild);
5323                        }
5324                    } else if (!isEmpty && currentlyHasNoImage) {
5325                        imageContainer.classList.remove('no-image');
5326                        item.classList.remove('no-image');
5327
5328                        if (category && imageContainer && !imageContainer.contains(category)) {
5329                            imageContainer.appendChild(category);
5330                        }
5331                    }
5332                }
5333            });
5334        } catch (error) {
5335            console.error('Erro no checkForImages:', error);
5336        }
5337    }
5338
5339    function updateTitleDisplay() {
5340        if (isUpdating) return;
5341        isUpdating = true;
5342        
5343        try {
5344            const newsItems = document.querySelectorAll('.card-news-image-top-news-vertical-item');
5345
5346            newsItems.forEach(function(item) {
5347                const altTitleElement = item.querySelector('[data-lfr-editable-id="alt-title"]');
5348                const originalTitleElement = item.querySelector('[data-lfr-editable-id="title"]');
5349
5350                if (altTitleElement && originalTitleElement) {
5351                    const altTitleText = altTitleElement.textContent.trim();
5352                    
5353                    // Verifica se o título alternativo é válido
5354                    if (altTitleText &&
5355                        altTitleText.length > 0 &&
5356                        !altTitleText.includes('[Mapear campo') &&
5357                        altTitleText !== 'TitleAlternative' &&
5358                        altTitleText !== '') {
5359
5360                        // Mostra título alternativo e oculta original
5361                        altTitleElement.classList.remove('d-none');
5362                        originalTitleElement.classList.add('d-none');
5363                    } else {
5364                        // Oculta título alternativo e mostra original
5365                        altTitleElement.classList.add('d-none');
5366                        originalTitleElement.classList.remove('d-none');
5367                    }
5368                }
5369            });
5370        } catch (error) {
5371            console.error('Erro no updateTitleDisplay:', error);
5372        } finally {
5373            isUpdating = false;
5374        }
5375    }
5376
5377    function runBothUpdates() {
5378        checkForImages();
5379        updateTitleDisplay();
5380    }
5381
5382    function initializeObserver() {
5383        if (observer || !window.MutationObserver) return;
5384        
5385        observer = new MutationObserver(function(mutations) {
5386            if (isUpdating) return;
5387            
5388            let shouldUpdate = false;
5389            
5390            mutations.forEach(function(mutation) {
5391                if (mutation.type === 'childList') {
5392                    const target = mutation.target;
5393                    if (target.hasAttribute && 
5394                        (target.hasAttribute('data-lfr-editable-id') || 
5395                         target.closest('[data-lfr-editable-id]') ||
5396                         target.closest('.card-news-image-top-news-vertical-item'))) {
5397                        shouldUpdate = true;
5398                    }
5399                } else if (mutation.type === 'attributes' && 
5400                          mutation.attributeName === 'src' &&
5401                          mutation.target.tagName === 'IMG') {
5402                    shouldUpdate = true;
5403                }
5404            });
5405
5406            if (shouldUpdate) {
5407                clearTimeout(window.newsUpdateTimeout);
5408                window.newsUpdateTimeout = setTimeout(runBothUpdates, 150);
5409            }
5410        });
5411
5412        const newsSection = document.querySelector('.card-news-image-top-news-vertical-section') || document.body;
5413        const newsItems = document.querySelectorAll('.card-news-image-top-news-vertical-item');
5414        
5415        observer.observe(newsSection, {
5416            childList: true,
5417            subtree: true,
5418            attributes: true,
5419            attributeFilter: ['src'],
5420            characterData: false
5421        });
5422        
5423        newsItems.forEach(function(item) {
5424            observer.observe(item, {
5425                childList: true,
5426                subtree: true,
5427                attributes: true,
5428                attributeFilter: ['src']
5429            });
5430        });
5431    }
5432
5433    // Execução inicial
5434    setTimeout(function() {
5435        runBothUpdates();
5436        initializeObserver();
5437    }, 200);
5438
5439    setTimeout(function() {
5440        if (!isUpdating) {
5441            runBothUpdates();
5442        }
5443    }, 1000);
5444
5445    // Event listeners do Liferay
5446    if (window.Liferay && Liferay.on) {
5447        let liferayTimeout;
5448        
5449        function handleLiferayEvent() {
5450            clearTimeout(liferayTimeout);
5451            liferayTimeout = setTimeout(function() {
5452                if (!isUpdating) {
5453                    runBothUpdates();
5454                }
5455            }, 200);
5456        }
5457        
5458        Liferay.on('editableFieldChanged', handleLiferayEvent);
5459        Liferay.on('allPortletsReady', handleLiferayEvent);
5460    }
5461
5462    // Cleanup
5463    window.addEventListener('beforeunload', function() {
5464        if (observer) {
5465            observer.disconnect();
5466        }
5467        clearTimeout(window.newsUpdateTimeout);
5468    });
5469});;</script>
5469
5470           </div>
5471          </div>
5472         </div>
5473        </div>
5474       </div>
5475      </div>
5476     </div>
5477     <div class="col col-lg-3 col-sm-12 col-12 col-md-12">
5478      <div class="lfr-layout-structure-item-c8f2eb9b-99a3-a7d9-5b9b-1d0addc549d6 lfr-layout-structure-item-collection" data-layout-structure-item-id="c8f2eb9b-99a3-a7d9-5b9b-1d0addc549d6" data-analytics-targetable-collection="com.liferay.layout.list.retriever.ClassedModelListObjectReference@8efa68c" id="analytics-targetable-collection-c8f2eb9b-99a3-a7d9-5b9b-1d0addc549d6">
5479       <div class="container-fluid overflow-hidden px-0">
5480        <div class="row align-items-start">
5481         <div class="col col-lg-12 col-sm-12 col-12 col-md-12">
5482          <div class="lfr-layout-structure-item-card-imagem-topo--copiar--0 lfr-layout-structure-item-3736c7dc-9a0e-c578-4906-e82d4102a48e " data-layout-structure-item-id="3736c7dc-9a0e-c578-4906-e82d4102a48e">
5483           <div id="fragment-ced456b7-ceee-f643-8bd0-35849cc0a109">
5484            <div class="card-news-image-top-news-vertical-section">
5485             <!-- News Collection Container -->
5486             <div class="card-news-image-top-news-vertical-list">
5487              <!-- Individual News Item Template -->
5488              <div class="card-news-image-top-news-vertical-item">
5489               <!-- News Image (Top) -->
5490               <div class="card-news-image-top-news-vertical-image">
5491                <div class="card-news-image-top-news-vertical-img">
5492                 <a href="https://sampanews.sp.gov.br/e/noticia/29179/30564580" rel="nofollow"> <img src="https://sampanews.sp.gov.br/documents/34276/29473731/20250912_InventarioArboreo_SB_6.jpeg/edb1fdc8-6cf0-9bf0-604e-f77c55a7f51e?version=1.0&amp;t=1757692865387" alt="Logo da Prefeitura de São Paulo"> </a>
5493                </div>
5494                <!-- Category Badge (Overlaid on Image) -->
5495                <div class="card-news-image-top-news-vertical-category">
5496                 <div class="card-news-image-top-vertical-category-text">
5497                  <a href="https://sampanews.sp.gov.br/e/noticia/29179/30564580" rel="nofollow">Meio Ambiente</a>
5498                 </div>
5499                </div>
5500               </div>
5501               <!-- News Content (Bottom) -->
5502               <div class="card-news-image-top-news-vertical-content">
5503                <!-- Título Alternativo (PRIORIDADE - Visível por padrão) -->
5504                <h2 data-lfr-editable-id="alt-title" data-lfr-editable-type="text" class="card-news-image-top-news-vertical-title-highlight card-news-alt-title"><a href="https://sampanews.sp.gov.br/e/noticia/29179/30564580" rel="nofollow"></a></h2>
5505                <!-- Título Original (FALLBACK - Oculto por padrão) -->
5506                <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" class="card-news-image-top-news-vertical-title-highlight d-none"><a href="https://sampanews.sp.gov.br/e/noticia/29179/30564580" rel="nofollow">Mapeamento das árvores de SP com alta tecnologia começa pela Vila Mariana</a></h2>
5507               </div>
5508              </div>
5509             </div>
5510            </div>
5511           </div>
5512           
5512<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-ced456b7-ceee-f643-8bd0-35849cc0a109'); const fragmentElementId = 'fragment-ced456b7-ceee-f643-8bd0-35849cc0a109'; const fragmentEntryLinkNamespace = 'nqte'; const fragmentNamespace = 'nqte'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function() {
5513    let isUpdating = false;
5514    let observer = null;
5515    
5516    function checkForImages() {
5517        if (isUpdating) return;
5518        
5519        try {
5520            const newsItems = document.querySelectorAll('.card-news-image-top-news-vertical-item');
5521
5522            newsItems.forEach(function(item) {
5523                const imageContainer = item.querySelector('.card-news-image-top-news-vertical-image');
5524                const img = item.querySelector('.card-news-image-top-news-vertical-img img');
5525                const category = item.querySelector('.card-news-image-top-news-vertical-category');
5526                const content = item.querySelector('.card-news-image-top-news-vertical-content');
5527
5528                if (img && imageContainer) {
5529                    const isEmpty = !img.src ||
5530                                   img.src === '' ||
5531                                   img.src.includes('data:image/svg+xml') ||
5532                                   img.src.includes('placeholder') ||
5533                                   img.src.includes('default-image');
5534
5535                    const currentlyHasNoImage = item.classList.contains('no-image');
5536                    
5537                    if (isEmpty && !currentlyHasNoImage) {
5538                        imageContainer.classList.add('no-image');
5539                        item.classList.add('no-image');
5540
5541                        if (category && content && !content.contains(category)) {
5542                            content.insertBefore(category, content.firstChild);
5543                        }
5544                    } else if (!isEmpty && currentlyHasNoImage) {
5545                        imageContainer.classList.remove('no-image');
5546                        item.classList.remove('no-image');
5547
5548                        if (category && imageContainer && !imageContainer.contains(category)) {
5549                            imageContainer.appendChild(category);
5550                        }
5551                    }
5552                }
5553            });
5554        } catch (error) {
5555            console.error('Erro no checkForImages:', error);
5556        }
5557    }
5558
5559    function updateTitleDisplay() {
5560        if (isUpdating) return;
5561        isUpdating = true;
5562        
5563        try {
5564            const newsItems = document.querySelectorAll('.card-news-image-top-news-vertical-item');
5565
5566            newsItems.forEach(function(item) {
5567                const altTitleElement = item.querySelector('[data-lfr-editable-id="alt-title"]');
5568                const originalTitleElement = item.querySelector('[data-lfr-editable-id="title"]');
5569
5570                if (altTitleElement && originalTitleElement) {
5571                    const altTitleText = altTitleElement.textContent.trim();
5572                    
5573                    // Verifica se o título alternativo é válido
5574                    if (altTitleText &&
5575                        altTitleText.length > 0 &&
5576                        !altTitleText.includes('[Mapear campo') &&
5577                        altTitleText !== 'TitleAlternative' &&
5578                        altTitleText !== '') {
5579
5580                        // Mostra título alternativo e oculta original
5581                        altTitleElement.classList.remove('d-none');
5582                        originalTitleElement.classList.add('d-none');
5583                    } else {
5584                        // Oculta título alternativo e mostra original
5585                        altTitleElement.classList.add('d-none');
5586                        originalTitleElement.classList.remove('d-none');
5587                    }
5588                }
5589            });
5590        } catch (error) {
5591            console.error('Erro no updateTitleDisplay:', error);
5592        } finally {
5593            isUpdating = false;
5594        }
5595    }
5596
5597    function runBothUpdates() {
5598        checkForImages();
5599        updateTitleDisplay();
5600    }
5601
5602    function initializeObserver() {
5603        if (observer || !window.MutationObserver) return;
5604        
5605        observer = new MutationObserver(function(mutations) {
5606            if (isUpdating) return;
5607            
5608            let shouldUpdate = false;
5609            
5610            mutations.forEach(function(mutation) {
5611                if (mutation.type === 'childList') {
5612                    const target = mutation.target;
5613                    if (target.hasAttribute && 
5614                        (target.hasAttribute('data-lfr-editable-id') || 
5615                         target.closest('[data-lfr-editable-id]') ||
5616                         target.closest('.card-news-image-top-news-vertical-item'))) {
5617                        shouldUpdate = true;
5618                    }
5619                } else if (mutation.type === 'attributes' && 
5620                          mutation.attributeName === 'src' &&
5621                          mutation.target.tagName === 'IMG') {
5622                    shouldUpdate = true;
5623                }
5624            });
5625
5626            if (shouldUpdate) {
5627                clearTimeout(window.newsUpdateTimeout);
5628                window.newsUpdateTimeout = setTimeout(runBothUpdates, 150);
5629            }
5630        });
5631
5632        const newsSection = document.querySelector('.card-news-image-top-news-vertical-section') || document.body;
5633        const newsItems = document.querySelectorAll('.card-news-image-top-news-vertical-item');
5634        
5635        observer.observe(newsSection, {
5636            childList: true,
5637            subtree: true,
5638            attributes: true,
5639            attributeFilter: ['src'],
5640            characterData: false
5641        });
5642        
5643        newsItems.forEach(function(item) {
5644            observer.observe(item, {
5645                childList: true,
5646                subtree: true,
5647                attributes: true,
5648                attributeFilter: ['src']
5649            });
5650        });
5651    }
5652
5653    // Execução inicial
5654    setTimeout(function() {
5655        runBothUpdates();
5656        initializeObserver();
5657    }, 200);
5658
5659    setTimeout(function() {
5660        if (!isUpdating) {
5661            runBothUpdates();
5662        }
5663    }, 1000);
5664
5665    // Event listeners do Liferay
5666    if (window.Liferay && Liferay.on) {
5667        let liferayTimeout;
5668        
5669        function handleLiferayEvent() {
5670            clearTimeout(liferayTimeout);
5671            liferayTimeout = setTimeout(function() {
5672                if (!isUpdating) {
5673                    runBothUpdates();
5674                }
5675            }, 200);
5676        }
5677        
5678        Liferay.on('editableFieldChanged', handleLiferayEvent);
5679        Liferay.on('allPortletsReady', handleLiferayEvent);
5680    }
5681
5682    // Cleanup
5683    window.addEventListener('beforeunload', function() {
5684        if (observer) {
5685            observer.disconnect();
5686        }
5687        clearTimeout(window.newsUpdateTimeout);
5688    });
5689});;</script>
5689
5690          </div>
5691         </div>
5692         <div class="col col-lg-12 col-sm-12 col-12 col-md-12">
5693          <div class="lfr-layout-structure-item-card-imagem-topo--copiar--0 lfr-layout-structure-item-3736c7dc-9a0e-c578-4906-e82d4102a48e " data-layout-structure-item-id="3736c7dc-9a0e-c578-4906-e82d4102a48e">
5694           <div id="fragment-f27a2289-a4f6-9b22-e9a3-b8c73ab8d601">
5695            <div class="card-news-image-top-news-vertical-section">
5696             <!-- News Collection Container -->
5697             <div class="card-news-image-top-news-vertical-list">
5698              <!-- Individual News Item Template -->
5699              <div class="card-news-image-top-news-vertical-item">
5700               <!-- News Image (Top) -->
5701               <div class="card-news-image-top-news-vertical-image">
5702                <div class="card-news-image-top-news-vertical-img">
5703                 <a href="https://sampanews.sp.gov.br/e/noticia/29179/30453083" rel="nofollow"> <img src="https://sampanews.sp.gov.br/documents/24771855/26889788/Captura+de+tela+2025-10-01+085632.png/aa87bfab-69ff-97de-4ca5-05f21a40b4d2?version=1.0&amp;t=1761079783940" alt="Logo da Prefeitura de São Paulo"> </a>
5704                </div>
5705                <!-- Category Badge (Overlaid on Image) -->
5706                <div class="card-news-image-top-news-vertical-category">
5707                 <div class="card-news-image-top-vertical-category-text">
5708                  <a href="https://sampanews.sp.gov.br/e/noticia/29179/30453083" rel="nofollow">Segurança</a>
5709                 </div>
5710                </div>
5711               </div>
5712               <!-- News Content (Bottom) -->
5713               <div class="card-news-image-top-news-vertical-content">
5714                <!-- Título Alternativo (PRIORIDADE - Visível por padrão) -->
5715                <h2 data-lfr-editable-id="alt-title" data-lfr-editable-type="text" class="card-news-image-top-news-vertical-title-highlight card-news-alt-title"><a href="https://sampanews.sp.gov.br/e/noticia/29179/30453083" rel="nofollow"></a></h2>
5716                <!-- Título Original (FALLBACK - Oculto por padrão) -->
5717                <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" class="card-news-image-top-news-vertical-title-highlight d-none"><a href="https://sampanews.sp.gov.br/e/noticia/29179/30453083" rel="nofollow">Smart Sampa ajuda na prisão de foragido por estupro de vulnerável</a></h2>
5718               </div>
5719              </div>
5720             </div>
5721            </div>
5722           </div>
5723           
5723<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-f27a2289-a4f6-9b22-e9a3-b8c73ab8d601'); const fragmentElementId = 'fragment-f27a2289-a4f6-9b22-e9a3-b8c73ab8d601'; const fragmentEntryLinkNamespace = 'nqte'; const fragmentNamespace = 'nqte'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function() {
5724    let isUpdating = false;
5725    let observer = null;
5726    
5727    function checkForImages() {
5728        if (isUpdating) return;
5729        
5730        try {
5731            const newsItems = document.querySelectorAll('.card-news-image-top-news-vertical-item');
5732
5733            newsItems.forEach(function(item) {
5734                const imageContainer = item.querySelector('.card-news-image-top-news-vertical-image');
5735                const img = item.querySelector('.card-news-image-top-news-vertical-img img');
5736                const category = item.querySelector('.card-news-image-top-news-vertical-category');
5737                const content = item.querySelector('.card-news-image-top-news-vertical-content');
5738
5739                if (img && imageContainer) {
5740                    const isEmpty = !img.src ||
5741                                   img.src === '' ||
5742                                   img.src.includes('data:image/svg+xml') ||
5743                                   img.src.includes('placeholder') ||
5744                                   img.src.includes('default-image');
5745
5746                    const currentlyHasNoImage = item.classList.contains('no-image');
5747                    
5748                    if (isEmpty && !currentlyHasNoImage) {
5749                        imageContainer.classList.add('no-image');
5750                        item.classList.add('no-image');
5751
5752                        if (category && content && !content.contains(category)) {
5753                            content.insertBefore(category, content.firstChild);
5754                        }
5755                    } else if (!isEmpty && currentlyHasNoImage) {
5756                        imageContainer.classList.remove('no-image');
5757                        item.classList.remove('no-image');
5758
5759                        if (category && imageContainer && !imageContainer.contains(category)) {
5760                            imageContainer.appendChild(category);
5761                        }
5762                    }
5763                }
5764            });
5765        } catch (error) {
5766            console.error('Erro no checkForImages:', error);
5767        }
5768    }
5769
5770    function updateTitleDisplay() {
5771        if (isUpdating) return;
5772        isUpdating = true;
5773        
5774        try {
5775            const newsItems = document.querySelectorAll('.card-news-image-top-news-vertical-item');
5776
5777            newsItems.forEach(function(item) {
5778                const altTitleElement = item.querySelector('[data-lfr-editable-id="alt-title"]');
5779                const originalTitleElement = item.querySelector('[data-lfr-editable-id="title"]');
5780
5781                if (altTitleElement && originalTitleElement) {
5782                    const altTitleText = altTitleElement.textContent.trim();
5783                    
5784                    // Verifica se o título alternativo é válido
5785                    if (altTitleText &&
5786                        altTitleText.length > 0 &&
5787                        !altTitleText.includes('[Mapear campo') &&
5788                        altTitleText !== 'TitleAlternative' &&
5789                        altTitleText !== '') {
5790
5791                        // Mostra título alternativo e oculta original
5792                        altTitleElement.classList.remove('d-none');
5793                        originalTitleElement.classList.add('d-none');
5794                    } else {
5795                        // Oculta título alternativo e mostra original
5796                        altTitleElement.classList.add('d-none');
5797                        originalTitleElement.classList.remove('d-none');
5798                    }
5799                }
5800            });
5801        } catch (error) {
5802            console.error('Erro no updateTitleDisplay:', error);
5803        } finally {
5804            isUpdating = false;
5805        }
5806    }
5807
5808    function runBothUpdates() {
5809        checkForImages();
5810        updateTitleDisplay();
5811    }
5812
5813    function initializeObserver() {
5814        if (observer || !window.MutationObserver) return;
5815        
5816        observer = new MutationObserver(function(mutations) {
5817            if (isUpdating) return;
5818            
5819            let shouldUpdate = false;
5820            
5821            mutations.forEach(function(mutation) {
5822                if (mutation.type === 'childList') {
5823                    const target = mutation.target;
5824                    if (target.hasAttribute && 
5825                        (target.hasAttribute('data-lfr-editable-id') || 
5826                         target.closest('[data-lfr-editable-id]') ||
5827                         target.closest('.card-news-image-top-news-vertical-item'))) {
5828                        shouldUpdate = true;
5829                    }
5830                } else if (mutation.type === 'attributes' && 
5831                          mutation.attributeName === 'src' &&
5832                          mutation.target.tagName === 'IMG') {
5833                    shouldUpdate = true;
5834                }
5835            });
5836
5837            if (shouldUpdate) {
5838                clearTimeout(window.newsUpdateTimeout);
5839                window.newsUpdateTimeout = setTimeout(runBothUpdates, 150);
5840            }
5841        });
5842
5843        const newsSection = document.querySelector('.card-news-image-top-news-vertical-section') || document.body;
5844        const newsItems = document.querySelectorAll('.card-news-image-top-news-vertical-item');
5845        
5846        observer.observe(newsSection, {
5847            childList: true,
5848            subtree: true,
5849            attributes: true,
5850            attributeFilter: ['src'],
5851            characterData: false
5852        });
5853        
5854        newsItems.forEach(function(item) {
5855            observer.observe(item, {
5856                childList: true,
5857                subtree: true,
5858                attributes: true,
5859                attributeFilter: ['src']
5860            });
5861        });
5862    }
5863
5864    // Execução inicial
5865    setTimeout(function() {
5866        runBothUpdates();
5867        initializeObserver();
5868    }, 200);
5869
5870    setTimeout(function() {
5871        if (!isUpdating) {
5872            runBothUpdates();
5873        }
5874    }, 1000);
5875
5876    // Event listeners do Liferay
5877    if (window.Liferay && Liferay.on) {
5878        let liferayTimeout;
5879        
5880        function handleLiferayEvent() {
5881            clearTimeout(liferayTimeout);
5882            liferayTimeout = setTimeout(function() {
5883                if (!isUpdating) {
5884                    runBothUpdates();
5885                }
5886            }, 200);
5887        }
5888        
5889        Liferay.on('editableFieldChanged', handleLiferayEvent);
5890        Liferay.on('allPortletsReady', handleLiferayEvent);
5891    }
5892
5893    // Cleanup
5894    window.addEventListener('beforeunload', function() {
5895        if (observer) {
5896            observer.disconnect();
5897        }
5898        clearTimeout(window.newsUpdateTimeout);
5899    });
5900});;</script>
5900
5901          </div>
5902         </div>
5903        </div>
5904       </div>
5905      </div>
5906      <div class="lfr-layout-structure-item-pris-metro---integrado-com-power-bi-do-smartsampa lfr-layout-structure-item-b6c7671f-e681-a0ff-6589-112a996d1348 " data-layout-structure-item-id="b6c7671f-e681-a0ff-6589-112a996d1348">
5907       <div id="fragment-bf5895d1-aa7c-e38f-d576-70e64253ee5e">
5908        <div class="iframe-container">
5909         <div class="loader-overlay" id="loader">
5910          <div class="loader"></div>
5911         </div>
5912         <iframe class="pbi-frame" id="pbiFrame" src="https://app.powerbi.com/view?r=eyJrIjoiMDEwOTczZTQtODJlYS00MzBmLThkN2ItZDYwYWIzZmU5NDg3IiwidCI6ImYzOThkZjljLWZkMGMtNDgyOS1hMDAzLWM3NzBhMWM0YTA2MyJ9" allowfullscreen="true"></iframe> <img src="/documents/24771855/25160874/logo-smart-sampa-2.png" class="logo-overload">
5913        </div>
5914       </div>
5915       <style>.logo-overload {
5916    position: absolute;
5917    background: #000000;
5918    padding: 15px 0;
5919    display: block;
5920    top: 0;
5921    left: 50%;
5922    transform: translateX(-50%);
5923    width: 218px;
5924}
5925
5926.pbi-frame {
5927    display: block;
5928    width: 100%;
5929    height: 1015px;
5930    border: 0;
5931    clip-path: inset(0 0 60px 0);
5932}
5933
5934.loader-overlay {
5935    position: absolute;
5936    top: 0;
5937    left: 0;
5938    width: 100%;
5939    height: 850px;
5940    background: #000000;
5941    display: flex;
5942    align-items: center;
5943    justify-content: center;
5944    z-index: 99999;
5945}
5946
5947.loader {
5948    border: 4px solid #f3f3f3;
5949    border-top: 4px solid #ffed00;
5950    border-radius: 50%;
5951    width: 40px;
5952    height: 40px;
5953    animation: spin 1s linear infinite;
5954}
5955
5956@keyframes spin {
5957    0% {
5958        transform: rotate(0deg);
5959    }
5960
5961    100% {
5962        transform: rotate(360deg);
5963    }
5964}
5965
5966.iframe-container {
5967    position: relative;
5968    width: 100%;
5969}
5970
5971@media (max-width: 480px) {
5972    .pbi-frame {
5973        height: 850px;
5974    }
5975
5976    .logo-overload {
5977        width: 178px
5978    }
5979}
5980
5981@media (min-width: 481px) and (max-width: 768px) {
5982    .pbi-frame {
5983        height: 850px;
5984    }
5985
5986    .logo-overload {
5987        width: 178px
5988    }
5989}
5990
5991@media (min-width: 769px) and (max-width: 1024px) {
5992    .pbi-frame {
5993        height: 850px;
5994    }
5995}
5996
5997@media (min-width: 1025px) and (max-width: 1440px) {
5998    .pbi-frame {
5999        height: 1005px;
6000    }
6001}</style>
6002       
6002<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-bf5895d1-aa7c-e38f-d576-70e64253ee5e'); const fragmentElementId = 'fragment-bf5895d1-aa7c-e38f-d576-70e64253ee5e'; const fragmentEntryLinkNamespace = 'izyr'; const fragmentNamespace = 'izyr'; const layoutMode = 'view'; (function () {
6003    const loader = document.querySelector('#loader, .loader');
6004    const iframe = document.querySelector('iframe');
6005    let hidden = false;
6006
6007    function hide() {
6008      if (hidden || !loader) return;
6009      hidden = true;
6010      loader.style.display = 'none';
6011    }
6012
6013    // Fallback: sempre esconder após 3s
6014    setTimeout(hide, 3000);
6015
6016    // Se o iframe carregar, também espera 3s e esconde
6017    if (iframe) {
6018      iframe.addEventListener('load', () => setTimeout(hide, 3000));
6019      iframe.addEventListener('error', hide);
6020    }
6021
6022    // Compatível com Liferay SPA (Senna)
6023    if (window.Liferay && Liferay.on) {
6024      Liferay.on('endNavigate', () => setTimeout(hide, 3000));
6025      Liferay.on('allPortletsReady', () => setTimeout(hide, 3000));
6026    }
6027
6028    // Garantia adicional após o load da janela
6029    window.addEventListener('load', () => setTimeout(hide, 3000));
6030  })();;</script>
6030
6031      </div>
6032     </div>
6033    </div>
6034   </div>
6035  </div>
6036 </div>
6037 <div class="lfr-layout-structure-item-458bede2-63f0-e722-012f-f9f80ae498b4 lfr-layout-structure-item-container  container-fluid container-fluid-max-xl" data-layout-structure-item-id="458bede2-63f0-e722-012f-f9f80ae498b4">
6038  <div class="lfr-layout-structure-item-basic-component-html lfr-layout-structure-item-02ed58d7-861d-de80-1d1e-517b6c222c51 " data-layout-structure-item-id="02ed58d7-861d-de80-1d1e-517b6c222c51">
6039   <div id="fragment-f12e36f3-975a-89f9-44dc-d0d116306260">
6040    <div class="component-html" data-lfr-editable-id="element-html" data-lfr-editable-type="html">
6041     <span id="banner-home"></span>
6042     
6042<script type="">
6043document.addEventListener("DOMContentLoaded", () => {
6044  const params = new URLSearchParams(window.location.search);
6045  if (params.has("page_number_2c82e411-64a2-1e3a-2adb-4fdda168d508")) {
6046    const bannerHome = document.getElementById("banner-home");
6047    if (bannerHome) {
6048      bannerHome.scrollIntoView({ behavior: "smooth", block: "center" });
6049    }
6050  }
6051});
6052</script>
6052
6053    </div>
6054   </div>
6055  </div>
6056  <div class="lfr-layout-structure-item-2c82e411-64a2-1e3a-2adb-4fdda168d508 lfr-layout-structure-item-collection" data-layout-structure-item-id="2c82e411-64a2-1e3a-2adb-4fdda168d508" data-analytics-targetable-collection="com.liferay.layout.list.retriever.ClassedModelListObjectReference@2906b526" id="analytics-targetable-collection-2c82e411-64a2-1e3a-2adb-4fdda168d508">
6057   <div class="container-fluid overflow-hidden px-0">
6058    <div class="row align-items-start">
6059     <div class="col col-lg-12 col-sm-12 col-12 col-md-12">
6060      <div class="lfr-layout-structure-item-com-liferay-fragment-internal-renderer-contentobjectfragmentrenderer lfr-layout-structure-item-6162f8f9-26f5-1271-2631-be5aec8cd365 " data-layout-structure-item-id="6162f8f9-26f5-1271-2631-be5aec8cd365">
6061       <div class="journal-content-article " data-analytics-asset-id="61949470" data-analytics-asset-title="A CRACOLÂNDIA ACABOU" data-analytics-asset-type="web-content" data-analytics-external-reference-code="5d85a814-7a93-3fa3-4c83-678c111a2bf0" data-analytics-web-content-resource-pk="61949472">
6062        <div class="psp-banner">
6063         <a href="https://www.youtube.com/watch?v=VEjAkQOkN7g" target="_blank" title="A CRACOLÂNDIA ACABOU"> <span class="sr-only">Imagens de antes e depois de onde se localizava a cracolândia intercalando-se. Onde tinha tráfico de drogas, a Prefeitura fortaleceu a segurança e segue monitorando a região. O nosso Desafio continua - Saiba mais</span> <picture> <source media="(min-width: 768px)" srcset="/documents/49208/61949134/Cracolandia-02-Banner-1220x200.gif/f1de58be-e28a-6e40-0680-e2c7671b4f25?t=1790881912240"> <img src="/documents/49208/61949134/Cracolandia-02-Banner-320x220.gif/f9cfc1d5-0900-5ba7-c819-5729bdd7b219?t=1790881908145" alt="Imagens de antes e depois de onde se localizava a cracolândia intercalando-se.  Onde tinha tráfico de drogas, a Prefeitura fortaleceu a segurança e segue monitorando a região. O nosso Desafio continua - Saiba mais" loading="lazy"> </picture> </a>
6064        </div>
6065       </div>
6066      </div>
6067     </div>
6068    </div>
6069   </div>
6070   <div>
6071    <div class="pagination-bar pb-2 pt-3">
6072     <div class="pagination-results">Exibindo 1 - 1 de 2 resultados.</div>
6073     <ul class="pagination pagination-root">
6074      <li class="disabled page-item">
6075       <div class="page-link">
6076        <svg class="lexicon-icon lexicon-icon-angle-left" role="presentation">
6077         <use xlink:href="https://sampanews.sp.gov.br/o/dialect-theme/images/clay/icons.svg#angle-left" />
6078        </svg>
6079       </div>
6080      </li>
6081      <li class="active page-item"><a class="link-unstyled page-link">1</a></li>
6082      <li class="page-item"><a class="link-unstyled page-link">2</a></li>
6083      <li class="page-item"><a class="link-unstyled page-link">
6084        <svg class="lexicon-icon lexicon-icon-angle-right" role="presentation">
6085         <use xlink:href="https://sampanews.sp.gov.br/o/dialect-theme/images/clay/icons.svg#angle-right" />
6086        </svg>
6087       </a></li>
6088     </ul>
6089    </div>
6090    <div id="ffon"></div>
6091   </div>
6092  </div>
6093 </div>
6094 <div class="lfr-layout-structure-item-ae90708c-f297-e8d4-9a24-3ab6b6601138 lfr-layout-structure-item-container " data-layout-structure-item-id="ae90708c-f297-e8d4-9a24-3ab6b6601138" style="--background-image-file-entry-id:27865429;--lfr-background-image-ae90708c-f297-e8d4-9a24-3ab6b6601138: url(/documents/d/sampa-news/backgorund_session_yellow_cut2);" id="eomh">
6095  <style>@media (max-width:77px){#eomh{background-image: url(/o/adaptive-media/image/27865429/Thumbnail-300x300/backgorund_session_yellow_cut2.png?t=1753991474480) !important;}}@media (max-width:108px) and (min-width:77px){#eomh{background-image: url(/o/adaptive-media/image/27865429/Preview-1000x0/backgorund_session_yellow_cut2.png?t=1753991474480) !important;}}</style>
6096  <div class="lfr-layout-structure-item-93a81093-9e35-55e1-991b-ee8cbb348348 lfr-layout-structure-item-container  container-fluid container-fluid-max-xl" data-layout-structure-item-id="93a81093-9e35-55e1-991b-ee8cbb348348">
6097   <div class="lfr-layout-structure-item-container-slider lfr-layout-structure-item-d29dbb46-e6b8-33a7-f8da-b00b7f78fc3c " data-layout-structure-item-id="d29dbb46-e6b8-33a7-f8da-b00b7f78fc3c">
6098    <div id="fragment-1e106757-93a7-b591-fb85-13414c75089d">
6099     <div class="sp-csvc-fragment-slider-container" data-fragment-namespace="pkhq">
6100      <div class="sp-csvc-slider-container__wrapper">
6101       <!-- Header com título e controles -->
6102       <div class="sp-csvc-slider-container__header">
6103        <!-- Dropzone para título/componente customizado -->
6104        <div class="sp-csvc-slider-container__title-dropzone">
6105         <div id="title-dropzone" class="sp-csvc-dropzone-title">
6106          <div class="lfr-layout-structure-item-basic-component-heading lfr-layout-structure-item-2c44c6c8-7902-4fef-68a8-1b15d31b3e8a " data-layout-structure-item-id="2c44c6c8-7902-4fef-68a8-1b15d31b3e8a">
6107           <div id="fragment-ec493a00-2b3f-ecb9-6933-55e879e57ab2">
6108            <h2 class="component-heading mb-0 text-break" data-lfr-editable-id="element-text" data-lfr-editable-type="text">Nas Redes</h2>
6109           </div>
6110          </div>
6111         </div>
6112        </div>
6113       </div>
6114       <!-- Dropzone para coleção de itens com controles laterais -->
6115       <div class="sp-csvc-slider-container__content sp-csvc-psp-slide-crontol">
6116        <!-- Controle Anterior (Esquerda) -->
6117        <button class="sp-csvc-slider-control sp-csvc-slider-control--prev sp-csvc-slider-control--side" onclick="moveCarousel(-1)" aria-label="Item anterior" data-action="prev"> 
6118         <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
6119          <path d="M15 18L9 12L15 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
6120         </svg> 
6121        </button>
6122        <div class="sp-csvc-slider-viewport">
6123         <div id="collection-dropzone" class="sp-csvc-dropzone-collection">
6124          <div class="lfr-layout-structure-item-9b71ede5-44b4-bfac-5299-cf6b870b719a lfr-layout-structure-item-container  container-fluid container-fluid-max-xl" data-layout-structure-item-id="9b71ede5-44b4-bfac-5299-cf6b870b719a">
6125           <div class="lfr-layout-structure-item-b6ed9fbb-deb0-4225-c51a-d7a053f094b5 lfr-layout-structure-item-collection" data-layout-structure-item-id="b6ed9fbb-deb0-4225-c51a-d7a053f094b5" data-analytics-targetable-collection="com.liferay.layout.list.retriever.ClassedModelListObjectReference@36a641c0" id="analytics-targetable-collection-b6ed9fbb-deb0-4225-c51a-d7a053f094b5">
6126            <div class="container-fluid overflow-hidden px-0 align-items-start">
6127             <div class="row align-items-start">
6128              <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
6129               <div class="lfr-layout-structure-item-v-deos-curtos lfr-layout-structure-item-056a5513-7246-f6cc-cfe7-94581b625498 " data-layout-structure-item-id="056a5513-7246-f6cc-cfe7-94581b625498">
6130                <div id="fragment-f91d5dc7-cee8-48fd-fbe0-0bdd4d19cabc">
6131                 <!-- HTML do Fragmento -->
6132                 <div class="sampa-news-video-card">
6133                  <picture data-fileentryid="58716540"><source media="(max-width:193px)" srcset="/o/adaptive-media/image/58716540/Thumbnail-300x300/Captura+de+tela+2026-08-11+095123.png?t=1786452722311"><source media="(max-width:570px) and (min-width:193px)" srcset="/o/adaptive-media/image/58716540/Preview-1000x0/Captura+de+tela+2026-08-11+095123.png?t=1786452722311"><img class="sampa-news-video-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/Captura+de+tela+2026-08-11+095123.png/79f47b61-420e-63ef-8768-c5af1d8e5ffa?version=1.0&amp;t=1786452722311" alt="Avança Saúde Escolar" data-fileentryid="58716540"></picture> <span class="sampa-news-video-duration" data-lfr-editable-id="video-duration" data-lfr-editable-type="text" style="display:none;"></span>
6134                  <div class="sampa-news-video-player-button">
6135                   <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
6136                    <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
6137                   </svg>
6138                  </div>
6139                  <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/shorts/-0Pi5LzaNZg" style="display: none;" target="_self">https://www.youtube.com/shorts/-0Pi5LzaNZg</a> <iframe class="sampa-news-video-iframe" src="" title="YouTube Shorts Player" frameborder="0" scrolling="no" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>
6140    </iframe>
6141                  <div class="sampa-news-video-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Avança Saúde Escolar: enxergar melhor também é aprender melhor</div>
6142                 </div>
6143                </div>
6144                <style>/* Sampa News Video Fragment - Updated Layout */
6145.sampa-news-video-card {
6146    position: relative;
6147    background-color: #000;
6148    overflow: hidden;
6149    aspect-ratio: 9/16;
6150    cursor: pointer;
6151    transition: transform 0.3s ease, box-shadow 0.3s ease;
6152    display: flex;
6153    align-items: center;
6154    justify-content: center;
6155    border-bottom: 3px solid #ffc107;
6156}
6157
6158.sampa-news-video-thumbnail {
6159    position: absolute;
6160    top: 0;
6161    left: 0;
6162    width: 100%;
6163    height: 100%;
6164    object-fit: cover;
6165    z-index: 1;
6166}
6167
6168.sampa-news-video-card:hover {
6169    transform: translateY(-4px);
6170    box-shadow: 0 12px 24px rgba(0, 0, 0, 0.25);
6171}
6172
6173/* Duração do vídeo - canto superior esquerdo */
6174.sampa-news-video-duration {
6175    position: absolute;
6176    top: 5px;
6177    left: 5px;
6178    background-color: rgba(0, 0, 0, 0.8);
6179    color: #cbcbc0;
6180    padding: 4px 5px;
6181    font-size: 12px;
6182    font-weight: 600;
6183    z-index: 3;
6184    letter-spacing: 0.5px;
6185}
6186
6187/* Botão de play amarelo central */
6188.sampa-news-video-player-button {
6189    position: absolute;
6190    top: 50%;
6191    left: 50%;
6192    transform: translate(-50%, -50%);
6193    width: 50px;
6194    height: 50px;
6195    background-color: #FFD700;
6196    border-radius: 50%;
6197    display: flex;
6198    align-items: center;
6199    justify-content: center;
6200    transition: all 0.3s ease;
6201    z-index: 3;
6202    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
6203}
6204
6205.sampa-news-video-card:hover .sampa-news-video-player-button {
6206    background-color: #FFC107;
6207    transform: translate(-50%, -50%) scale(1.1);
6208    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.4);
6209}
6210
6211.sampa-news-play-icon {
6212    width: 20px;
6213    height: 20px;
6214    color: #000;
6215    margin-left: 3px;
6216}
6217
6218/* iFrame do vídeo */
6219.sampa-news-video-iframe {
6220    position: absolute;
6221    top: 0;
6222    left: 0;
6223    width: 100%;
6224    height: 100%;
6225    display: none;
6226    z-index: 10;
6227}
6228
6229.sampa-news-video-card.sampa-news-playing .sampa-news-video-iframe {
6230    display: block;
6231}
6232
6233.sampa-news-video-card.sampa-news-playing .sampa-news-video-player-button,
6234.sampa-news-video-card.sampa-news-playing .sampa-news-video-duration,
6235.sampa-news-video-card.sampa-news-playing .sampa-news-video-thumbnail,
6236.sampa-news-video-card.sampa-news-playing .sampa-news-video-title {
6237    display: none;
6238}
6239
6240/* Título do vídeo - parte inferior com gradiente */
6241.sampa-news-video-title {
6242    position: absolute;
6243    bottom: 0;
6244    left: 0;
6245    right: 0;
6246    background: linear-gradient(to top, rgba(0, 0, 0, 0.95) 0%, rgba(0, 0, 0, 0.7) 50%, transparent 100%);
6247    color: white;
6248    padding: 60px 16px 16px;
6249    font-size: 0.9375rem;
6250    line-height: 1.4;
6251    font-weight: 500;
6252    z-index: 3;
6253    text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
6254}
6255
6256/* Responsividade */
6257@media (max-width: 768px) {
6258    .sampa-news-video-player-button {
6259        width: 45px;
6260        height: 45px;
6261    }
6262    
6263    .sampa-news-play-icon {
6264        width: 18px;
6265        height: 18px;
6266    }
6267    
6268    .sampa-news-video-duration {
6269        font-size: 0.8125rem;
6270        padding: 5px 10px;
6271        top: 5px;
6272        left: 5px;
6273    }
6274    
6275    .sampa-news-video-title {
6276        font-size: 0.875rem;
6277        padding: 50px 14px 14px;
6278    }
6279}
6280
6281@media (max-width: 480px) {
6282    .sampa-news-video-player-button {
6283        width: 40px;
6284        height: 40px;
6285    }
6286    
6287    .sampa-news-play-icon {
6288        width: 16px;
6289        height: 16px;
6290    }
6291    
6292    .sampa-news-video-duration {
6293        font-size: 0.75rem;
6294        padding: 4px 8px;
6295        top: 5px;
6296        left: 5px;
6297    }
6298    
6299    .sampa-news-video-title {
6300        font-size: 0.8125rem;
6301        padding: 45px 12px 12px;
6302    }
6303}
6304
6305/* Grid container (caso use em conjunto) */
6306.sampa-news-videos-grid {
6307    display: grid;
6308    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
6309    gap: 1.5rem;
6310}
6311
6312@media (max-width: 768px) {
6313    .sampa-news-videos-grid {
6314        grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
6315        gap: 1.25rem;
6316    }
6317}
6318
6319@media (max-width: 480px) {
6320    .sampa-news-videos-grid {
6321        grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
6322        gap: 1rem;
6323    }
6324}
6325
6326/* Acessibilidade */
6327.sampa-news-video-card:focus-visible {
6328    outline: 3px solid #FFD700;
6329    outline-offset: 2px;
6330}
6331
6332/* Animação de loading (opcional) */
6333.sampa-news-video-card::before {
6334    content: '';
6335    position: absolute;
6336    top: 0;
6337    left: 0;
6338    right: 0;
6339    bottom: 0;
6340    background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);
6341    transform: translateX(-100%);
6342    transition: transform 0.6s ease;
6343    z-index: 2;
6344    pointer-events: none;
6345}
6346
6347.sampa-news-video-card:hover::before {
6348    transform: translateX(100%);
6349}</style>
6350                
6350<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-f91d5dc7-cee8-48fd-fbe0-0bdd4d19cabc'); const fragmentElementId = 'fragment-f91d5dc7-cee8-48fd-fbe0-0bdd4d19cabc'; const fragmentEntryLinkNamespace = 'wayh'; const fragmentNamespace = 'wayh'; const layoutMode = 'view';(function() {
6351    // Usar uma única função global para evitar conflitos
6352    if (typeof window.sampanewsVideoHandler === 'undefined') {
6353        
6354        // Cache selectors and regex patterns
6355        const videoPatterns = {
6356            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
6357            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
6358            watch: /[?&]v=([a-zA-Z0-9_-]+)/
6359        };
6360
6361        // Flag para evitar processamento durante inicialização
6362        let isInitializing = false;
6363        let debounceTimeout = null;
6364
6365        // Função para reproduzir vídeos
6366        window.sampanewsPlayVideo = function(card) {
6367            try {
6368                const iframe = card.querySelector('.sampa-news-video-iframe');
6369                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
6370                const url = linkElement?.getAttribute('href') || '';
6371                
6372                if (!url || url === '#' || url === '') {
6373                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
6374                    return;
6375                }
6376                
6377                // Converter URL do YouTube para embed
6378                let embedUrl = url;
6379                let videoIdMatch = null;
6380                
6381                // More efficient URL parsing
6382                if (url.includes('youtube.com/embed/')) {
6383                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0`;
6384                } else {
6385                    for (const [type, pattern] of Object.entries(videoPatterns)) {
6386                        if ((type === 'shorts' && url.includes('youtube.com/shorts/')) ||
6387                            (type === 'youtuBe' && url.includes('youtu.be/')) ||
6388                            (type === 'watch' && url.includes('youtube.com/watch'))) {
6389                            videoIdMatch = url.match(pattern);
6390                            break;
6391                        }
6392                    }
6393                    
6394                    if (videoIdMatch?.[1]) {
6395                        embedUrl = `https://www.youtube.com/embed/${videoIdMatch[1]}?autoplay=1&mute=0`;
6396                    }
6397                }
6398                
6399                // Parar vídeo atual se existir
6400                const playingCard = document.querySelector('.sampa-news-video-card.sampa-news-playing');
6401                if (playingCard && playingCard !== card) {
6402                    playingCard.classList.remove('sampa-news-playing');
6403                    const playingIframe = playingCard.querySelector('.sampa-news-video-iframe');
6404                    if (playingIframe) {
6405                        playingIframe.src = '';
6406                    }
6407                }
6408                
6409                // Iniciar novo vídeo
6410                card.classList.add('sampa-news-playing');
6411                if (iframe) {
6412                    iframe.src = embedUrl;
6413                }
6414            } catch (error) {
6415                console.error('Erro ao reproduzir vídeo:', error);
6416            }
6417        };
6418
6419        // Optimized event handler
6420        const handleCardClick = (e) => {
6421            e.preventDefault();
6422            e.stopPropagation();
6423            window.sampanewsPlayVideo(e.currentTarget);
6424        };
6425        
6426        // Função para inicializar um único card
6427        const initializeCard = (card) => {
6428            if (!card.hasAttribute('data-sampa-initialized')) {
6429                card.addEventListener('click', handleCardClick);
6430                card.setAttribute('data-sampa-initialized', 'true');
6431                return true;
6432            }
6433            return false;
6434        };
6435        
6436        // Função otimizada para processar apenas nós relevantes
6437        const processRelevantNodes = (nodes) => {
6438            if (isInitializing) return;
6439            
6440            let processedCount = 0;
6441            
6442            nodes.forEach(node => {
6443                if (node.nodeType === Node.ELEMENT_NODE) {
6444                    let cardsToProcess = [];
6445                    
6446                    // Verificar se o próprio nó é um card
6447                    if (node.matches && node.matches('.sampa-news-video-card')) {
6448                        cardsToProcess.push(node);
6449                    }
6450                    
6451                    // Verificar se contém cards (só se for um container relevante)
6452                    if (node.querySelector && 
6453                        (node.classList.contains('fragment') || 
6454                         node.classList.contains('portlet') ||
6455                         node.classList.contains('sampa-news') ||
6456                         node.querySelectorAll('.sampa-news-video-card').length > 0)) {
6457                        
6458                        const childCards = node.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
6459                        cardsToProcess.push(...childCards);
6460                    }
6461                    
6462                    // Inicializar cards encontrados
6463                    cardsToProcess.forEach(card => {
6464                        if (initializeCard(card)) {
6465                            processedCount++;
6466                        }
6467                    });
6468                }
6469            });
6470            
6471            if (processedCount > 0) {
6472                console.log(`Sampa News: Inicializados ${processedCount} novos cards de vídeo`);
6473            }
6474        };
6475        
6476        // Função para inicializar event listeners
6477        window.sampanewsInitVideoCards = function() {
6478            if (isInitializing) return;
6479            isInitializing = true;
6480            
6481            try {
6482                let initializedCount = 0;
6483                const cards = document.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
6484                
6485                cards.forEach(card => {
6486                    if (initializeCard(card)) {
6487                        initializedCount++;
6488                    }
6489                });
6490                
6491                if (initializedCount > 0) {
6492                    console.log(`Sampa News: Inicializados ${initializedCount} cards de vídeo`);
6493                }
6494            } catch (error) {
6495                console.error('Erro ao inicializar cards de vídeo:', error);
6496            } finally {
6497                isInitializing = false;
6498            }
6499        };
6500        
6501        // Marcar como inicializado
6502        window.sampanewsVideoHandler = true;
6503        
6504        // Inicializar na primeira execução
6505        if (document.readyState === 'loading') {
6506            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCards);
6507        } else {
6508            window.sampanewsInitVideoCards();
6509        }
6510    } else {
6511        // Se já existe, apenas reinicializa novos cards
6512        if (typeof window.sampanewsInitVideoCards === 'function') {
6513            window.sampanewsInitVideoCards();
6514        }
6515    }
6516    
6517    // Observer otimizado com proteção anti-loop
6518    if (typeof window.sampanewsObserver === 'undefined') {
6519        
6520        window.sampanewsObserver = new MutationObserver(mutations => {
6521            // Evitar processamento durante inicialização
6522            if (isInitializing) return;
6523            
6524            // Debounce para evitar execuções excessivas
6525            clearTimeout(debounceTimeout);
6526            debounceTimeout = setTimeout(() => {
6527                try {
6528                    const relevantNodes = [];
6529                    
6530                    mutations.forEach(mutation => {
6531                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
6532                            Array.from(mutation.addedNodes).forEach(node => {
6533                                // Só processar nós elemento que podem conter ou ser cards de vídeo
6534                                if (node.nodeType === Node.ELEMENT_NODE &&
6535                                    (node.classList.contains('sampa-news-video-card') ||
6536                                     node.querySelector?.('.sampa-news-video-card') ||
6537                                     node.classList.contains('fragment') ||
6538                                     node.classList.contains('portlet'))) {
6539                                    relevantNodes.push(node);
6540                                }
6541                            });
6542                        }
6543                    });
6544                    
6545                    if (relevantNodes.length > 0) {
6546                        processRelevantNodes(relevantNodes);
6547                    }
6548                } catch (error) {
6549                    console.error('Erro no observer de vídeos:', error);
6550                }
6551            }, 150); // Debounce de 150ms
6552        });
6553        
6554        // Observer mais específico - só monitora containers relevantes
6555        const observeTargets = [
6556            document.querySelector('.sampa-news-container'),
6557            document.querySelector('#main-content'),
6558            document.querySelector('.portlet-boundary'),
6559            document.body // Fallback
6560        ].filter(Boolean);
6561        
6562        observeTargets.forEach(target => {
6563            window.sampanewsObserver.observe(target, {
6564                childList: true,
6565                subtree: true
6566            });
6567        });
6568        
6569        // Cleanup ao sair da página
6570        window.addEventListener('beforeunload', function() {
6571            if (window.sampanewsObserver) {
6572                window.sampanewsObserver.disconnect();
6573            }
6574            clearTimeout(debounceTimeout);
6575        });
6576    }
6577})();;</script>
6577
6578               </div>
6579              </div>
6580              <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
6581               <div class="lfr-layout-structure-item-v-deos-curtos lfr-layout-structure-item-056a5513-7246-f6cc-cfe7-94581b625498 " data-layout-structure-item-id="056a5513-7246-f6cc-cfe7-94581b625498">
6582                <div id="fragment-45903e2f-3723-09c1-be5d-17e38f0388e0">
6583                 <!-- HTML do Fragmento -->
6584                 <div class="sampa-news-video-card">
6585                  <picture data-fileentryid="57873453"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/57873453/Thumbnail-300x300/20260806_entrega_de_unidades_habitacionais_Lapa_RP-38.jpg?t=1786114319987"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/57873453/Preview-1000x0/20260806_entrega_de_unidades_habitacionais_Lapa_RP-38.jpg?t=1786114319987"><img class="sampa-news-video-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/20260806_entrega_de_unidades_habitacionais_Lapa_RP-38.jpg/35999203-d1b6-024c-6c85-757825371fa2?version=1.0&amp;t=1786114319987" alt="Prefeitura Presente Lapa" data-fileentryid="57873453"></picture> <span class="sampa-news-video-duration" data-lfr-editable-id="video-duration" data-lfr-editable-type="text" style="display:none;"></span>
6586                  <div class="sampa-news-video-player-button">
6587                   <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
6588                    <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
6589                   </svg>
6590                  </div>
6591                  <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/shorts/_IIdTABGTyA" style="display: none;" target="_self">https://www.youtube.com/shorts/_IIdTABGTyA</a> <iframe class="sampa-news-video-iframe" src="" title="YouTube Shorts Player" frameborder="0" scrolling="no" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>
6592    </iframe>
6593                  <div class="sampa-news-video-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Prefeitura Presente Lapa: investimentos que estão transformando a região</div>
6594                 </div>
6595                </div>
6596                
6596<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-45903e2f-3723-09c1-be5d-17e38f0388e0'); const fragmentElementId = 'fragment-45903e2f-3723-09c1-be5d-17e38f0388e0'; const fragmentEntryLinkNamespace = 'wayh'; const fragmentNamespace = 'wayh'; const layoutMode = 'view';(function() {
6597    // Usar uma única função global para evitar conflitos
6598    if (typeof window.sampanewsVideoHandler === 'undefined') {
6599        
6600        // Cache selectors and regex patterns
6601        const videoPatterns = {
6602            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
6603            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
6604            watch: /[?&]v=([a-zA-Z0-9_-]+)/
6605        };
6606
6607        // Flag para evitar processamento durante inicialização
6608        let isInitializing = false;
6609        let debounceTimeout = null;
6610
6611        // Função para reproduzir vídeos
6612        window.sampanewsPlayVideo = function(card) {
6613            try {
6614                const iframe = card.querySelector('.sampa-news-video-iframe');
6615                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
6616                const url = linkElement?.getAttribute('href') || '';
6617                
6618                if (!url || url === '#' || url === '') {
6619                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
6620                    return;
6621                }
6622                
6623                // Converter URL do YouTube para embed
6624                let embedUrl = url;
6625                let videoIdMatch = null;
6626                
6627                // More efficient URL parsing
6628                if (url.includes('youtube.com/embed/')) {
6629                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0`;
6630                } else {
6631                    for (const [type, pattern] of Object.entries(videoPatterns)) {
6632                        if ((type === 'shorts' && url.includes('youtube.com/shorts/')) ||
6633                            (type === 'youtuBe' && url.includes('youtu.be/')) ||
6634                            (type === 'watch' && url.includes('youtube.com/watch'))) {
6635                            videoIdMatch = url.match(pattern);
6636                            break;
6637                        }
6638                    }
6639                    
6640                    if (videoIdMatch?.[1]) {
6641                        embedUrl = `https://www.youtube.com/embed/${videoIdMatch[1]}?autoplay=1&mute=0`;
6642                    }
6643                }
6644                
6645                // Parar vídeo atual se existir
6646                const playingCard = document.querySelector('.sampa-news-video-card.sampa-news-playing');
6647                if (playingCard && playingCard !== card) {
6648                    playingCard.classList.remove('sampa-news-playing');
6649                    const playingIframe = playingCard.querySelector('.sampa-news-video-iframe');
6650                    if (playingIframe) {
6651                        playingIframe.src = '';
6652                    }
6653                }
6654                
6655                // Iniciar novo vídeo
6656                card.classList.add('sampa-news-playing');
6657                if (iframe) {
6658                    iframe.src = embedUrl;
6659                }
6660            } catch (error) {
6661                console.error('Erro ao reproduzir vídeo:', error);
6662            }
6663        };
6664
6665        // Optimized event handler
6666        const handleCardClick = (e) => {
6667            e.preventDefault();
6668            e.stopPropagation();
6669            window.sampanewsPlayVideo(e.currentTarget);
6670        };
6671        
6672        // Função para inicializar um único card
6673        const initializeCard = (card) => {
6674            if (!card.hasAttribute('data-sampa-initialized')) {
6675                card.addEventListener('click', handleCardClick);
6676                card.setAttribute('data-sampa-initialized', 'true');
6677                return true;
6678            }
6679            return false;
6680        };
6681        
6682        // Função otimizada para processar apenas nós relevantes
6683        const processRelevantNodes = (nodes) => {
6684            if (isInitializing) return;
6685            
6686            let processedCount = 0;
6687            
6688            nodes.forEach(node => {
6689                if (node.nodeType === Node.ELEMENT_NODE) {
6690                    let cardsToProcess = [];
6691                    
6692                    // Verificar se o próprio nó é um card
6693                    if (node.matches && node.matches('.sampa-news-video-card')) {
6694                        cardsToProcess.push(node);
6695                    }
6696                    
6697                    // Verificar se contém cards (só se for um container relevante)
6698                    if (node.querySelector && 
6699                        (node.classList.contains('fragment') || 
6700                         node.classList.contains('portlet') ||
6701                         node.classList.contains('sampa-news') ||
6702                         node.querySelectorAll('.sampa-news-video-card').length > 0)) {
6703                        
6704                        const childCards = node.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
6705                        cardsToProcess.push(...childCards);
6706                    }
6707                    
6708                    // Inicializar cards encontrados
6709                    cardsToProcess.forEach(card => {
6710                        if (initializeCard(card)) {
6711                            processedCount++;
6712                        }
6713                    });
6714                }
6715            });
6716            
6717            if (processedCount > 0) {
6718                console.log(`Sampa News: Inicializados ${processedCount} novos cards de vídeo`);
6719            }
6720        };
6721        
6722        // Função para inicializar event listeners
6723        window.sampanewsInitVideoCards = function() {
6724            if (isInitializing) return;
6725            isInitializing = true;
6726            
6727            try {
6728                let initializedCount = 0;
6729                const cards = document.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
6730                
6731                cards.forEach(card => {
6732                    if (initializeCard(card)) {
6733                        initializedCount++;
6734                    }
6735                });
6736                
6737                if (initializedCount > 0) {
6738                    console.log(`Sampa News: Inicializados ${initializedCount} cards de vídeo`);
6739                }
6740            } catch (error) {
6741                console.error('Erro ao inicializar cards de vídeo:', error);
6742            } finally {
6743                isInitializing = false;
6744            }
6745        };
6746        
6747        // Marcar como inicializado
6748        window.sampanewsVideoHandler = true;
6749        
6750        // Inicializar na primeira execução
6751        if (document.readyState === 'loading') {
6752            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCards);
6753        } else {
6754            window.sampanewsInitVideoCards();
6755        }
6756    } else {
6757        // Se já existe, apenas reinicializa novos cards
6758        if (typeof window.sampanewsInitVideoCards === 'function') {
6759            window.sampanewsInitVideoCards();
6760        }
6761    }
6762    
6763    // Observer otimizado com proteção anti-loop
6764    if (typeof window.sampanewsObserver === 'undefined') {
6765        
6766        window.sampanewsObserver = new MutationObserver(mutations => {
6767            // Evitar processamento durante inicialização
6768            if (isInitializing) return;
6769            
6770            // Debounce para evitar execuções excessivas
6771            clearTimeout(debounceTimeout);
6772            debounceTimeout = setTimeout(() => {
6773                try {
6774                    const relevantNodes = [];
6775                    
6776                    mutations.forEach(mutation => {
6777                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
6778                            Array.from(mutation.addedNodes).forEach(node => {
6779                                // Só processar nós elemento que podem conter ou ser cards de vídeo
6780                                if (node.nodeType === Node.ELEMENT_NODE &&
6781                                    (node.classList.contains('sampa-news-video-card') ||
6782                                     node.querySelector?.('.sampa-news-video-card') ||
6783                                     node.classList.contains('fragment') ||
6784                                     node.classList.contains('portlet'))) {
6785                                    relevantNodes.push(node);
6786                                }
6787                            });
6788                        }
6789                    });
6790                    
6791                    if (relevantNodes.length > 0) {
6792                        processRelevantNodes(relevantNodes);
6793                    }
6794                } catch (error) {
6795                    console.error('Erro no observer de vídeos:', error);
6796                }
6797            }, 150); // Debounce de 150ms
6798        });
6799        
6800        // Observer mais específico - só monitora containers relevantes
6801        const observeTargets = [
6802            document.querySelector('.sampa-news-container'),
6803            document.querySelector('#main-content'),
6804            document.querySelector('.portlet-boundary'),
6805            document.body // Fallback
6806        ].filter(Boolean);
6807        
6808        observeTargets.forEach(target => {
6809            window.sampanewsObserver.observe(target, {
6810                childList: true,
6811                subtree: true
6812            });
6813        });
6814        
6815        // Cleanup ao sair da página
6816        window.addEventListener('beforeunload', function() {
6817            if (window.sampanewsObserver) {
6818                window.sampanewsObserver.disconnect();
6819            }
6820            clearTimeout(debounceTimeout);
6821        });
6822    }
6823})();;</script>
6823
6824               </div>
6825              </div>
6826              <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
6827               <div class="lfr-layout-structure-item-v-deos-curtos lfr-layout-structure-item-056a5513-7246-f6cc-cfe7-94581b625498 " data-layout-structure-item-id="056a5513-7246-f6cc-cfe7-94581b625498">
6828                <div id="fragment-dff2ff56-b559-6db1-6200-98b8b7db1bb5">
6829                 <!-- HTML do Fragmento -->
6830                 <div class="sampa-news-video-card">
6831                  <picture data-fileentryid="58713696"><source media="(max-width:178px)" srcset="/o/adaptive-media/image/58713696/Thumbnail-300x300/Captura+de+tela+2026-08-11+093319.png?t=1786452103567"><source media="(max-width:571px) and (min-width:178px)" srcset="/o/adaptive-media/image/58713696/Preview-1000x0/Captura+de+tela+2026-08-11+093319.png?t=1786452103567"><img class="sampa-news-video-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/Captura+de+tela+2026-08-11+093319.png/cc7699bc-ea5b-3499-d9d1-a9e22d2a71aa?version=1.0&amp;t=1786452103567" alt="Em São Paulo, o serviço de castração é gratuito e oferecido pela Prefeitura" data-fileentryid="58713696"></picture> <span class="sampa-news-video-duration" data-lfr-editable-id="video-duration" data-lfr-editable-type="text" style="display:none;"></span>
6832                  <div class="sampa-news-video-player-button">
6833                   <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
6834                    <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
6835                   </svg>
6836                  </div>
6837                  <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/shorts/jO3hBjHTY2s" style="display: none;" target="_self">https://www.youtube.com/shorts/jO3hBjHTY2s</a> <iframe class="sampa-news-video-iframe" src="" title="YouTube Shorts Player" frameborder="0" scrolling="no" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>
6838    </iframe>
6839                  <div class="sampa-news-video-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Em São Paulo, o serviço de castração é gratuito e oferecido pela Prefeitura</div>
6840                 </div>
6841                </div>
6842                
6842<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-dff2ff56-b559-6db1-6200-98b8b7db1bb5'); const fragmentElementId = 'fragment-dff2ff56-b559-6db1-6200-98b8b7db1bb5'; const fragmentEntryLinkNamespace = 'wayh'; const fragmentNamespace = 'wayh'; const layoutMode = 'view';(function() {
6843    // Usar uma única função global para evitar conflitos
6844    if (typeof window.sampanewsVideoHandler === 'undefined') {
6845        
6846        // Cache selectors and regex patterns
6847        const videoPatterns = {
6848            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
6849            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
6850            watch: /[?&]v=([a-zA-Z0-9_-]+)/
6851        };
6852
6853        // Flag para evitar processamento durante inicialização
6854        let isInitializing = false;
6855        let debounceTimeout = null;
6856
6857        // Função para reproduzir vídeos
6858        window.sampanewsPlayVideo = function(card) {
6859            try {
6860                const iframe = card.querySelector('.sampa-news-video-iframe');
6861                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
6862                const url = linkElement?.getAttribute('href') || '';
6863                
6864                if (!url || url === '#' || url === '') {
6865                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
6866                    return;
6867                }
6868                
6869                // Converter URL do YouTube para embed
6870                let embedUrl = url;
6871                let videoIdMatch = null;
6872                
6873                // More efficient URL parsing
6874                if (url.includes('youtube.com/embed/')) {
6875                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0`;
6876                } else {
6877                    for (const [type, pattern] of Object.entries(videoPatterns)) {
6878                        if ((type === 'shorts' && url.includes('youtube.com/shorts/')) ||
6879                            (type === 'youtuBe' && url.includes('youtu.be/')) ||
6880                            (type === 'watch' && url.includes('youtube.com/watch'))) {
6881                            videoIdMatch = url.match(pattern);
6882                            break;
6883                        }
6884                    }
6885                    
6886                    if (videoIdMatch?.[1]) {
6887                        embedUrl = `https://www.youtube.com/embed/${videoIdMatch[1]}?autoplay=1&mute=0`;
6888                    }
6889                }
6890                
6891                // Parar vídeo atual se existir
6892                const playingCard = document.querySelector('.sampa-news-video-card.sampa-news-playing');
6893                if (playingCard && playingCard !== card) {
6894                    playingCard.classList.remove('sampa-news-playing');
6895                    const playingIframe = playingCard.querySelector('.sampa-news-video-iframe');
6896                    if (playingIframe) {
6897                        playingIframe.src = '';
6898                    }
6899                }
6900                
6901                // Iniciar novo vídeo
6902                card.classList.add('sampa-news-playing');
6903                if (iframe) {
6904                    iframe.src = embedUrl;
6905                }
6906            } catch (error) {
6907                console.error('Erro ao reproduzir vídeo:', error);
6908            }
6909        };
6910
6911        // Optimized event handler
6912        const handleCardClick = (e) => {
6913            e.preventDefault();
6914            e.stopPropagation();
6915            window.sampanewsPlayVideo(e.currentTarget);
6916        };
6917        
6918        // Função para inicializar um único card
6919        const initializeCard = (card) => {
6920            if (!card.hasAttribute('data-sampa-initialized')) {
6921                card.addEventListener('click', handleCardClick);
6922                card.setAttribute('data-sampa-initialized', 'true');
6923                return true;
6924            }
6925            return false;
6926        };
6927        
6928        // Função otimizada para processar apenas nós relevantes
6929        const processRelevantNodes = (nodes) => {
6930            if (isInitializing) return;
6931            
6932            let processedCount = 0;
6933            
6934            nodes.forEach(node => {
6935                if (node.nodeType === Node.ELEMENT_NODE) {
6936                    let cardsToProcess = [];
6937                    
6938                    // Verificar se o próprio nó é um card
6939                    if (node.matches && node.matches('.sampa-news-video-card')) {
6940                        cardsToProcess.push(node);
6941                    }
6942                    
6943                    // Verificar se contém cards (só se for um container relevante)
6944                    if (node.querySelector && 
6945                        (node.classList.contains('fragment') || 
6946                         node.classList.contains('portlet') ||
6947                         node.classList.contains('sampa-news') ||
6948                         node.querySelectorAll('.sampa-news-video-card').length > 0)) {
6949                        
6950                        const childCards = node.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
6951                        cardsToProcess.push(...childCards);
6952                    }
6953                    
6954                    // Inicializar cards encontrados
6955                    cardsToProcess.forEach(card => {
6956                        if (initializeCard(card)) {
6957                            processedCount++;
6958                        }
6959                    });
6960                }
6961            });
6962            
6963            if (processedCount > 0) {
6964                console.log(`Sampa News: Inicializados ${processedCount} novos cards de vídeo`);
6965            }
6966        };
6967        
6968        // Função para inicializar event listeners
6969        window.sampanewsInitVideoCards = function() {
6970            if (isInitializing) return;
6971            isInitializing = true;
6972            
6973            try {
6974                let initializedCount = 0;
6975                const cards = document.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
6976                
6977                cards.forEach(card => {
6978                    if (initializeCard(card)) {
6979                        initializedCount++;
6980                    }
6981                });
6982                
6983                if (initializedCount > 0) {
6984                    console.log(`Sampa News: Inicializados ${initializedCount} cards de vídeo`);
6985                }
6986            } catch (error) {
6987                console.error('Erro ao inicializar cards de vídeo:', error);
6988            } finally {
6989                isInitializing = false;
6990            }
6991        };
6992        
6993        // Marcar como inicializado
6994        window.sampanewsVideoHandler = true;
6995        
6996        // Inicializar na primeira execução
6997        if (document.readyState === 'loading') {
6998            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCards);
6999        } else {
7000            window.sampanewsInitVideoCards();
7001        }
7002    } else {
7003        // Se já existe, apenas reinicializa novos cards
7004        if (typeof window.sampanewsInitVideoCards === 'function') {
7005            window.sampanewsInitVideoCards();
7006        }
7007    }
7008    
7009    // Observer otimizado com proteção anti-loop
7010    if (typeof window.sampanewsObserver === 'undefined') {
7011        
7012        window.sampanewsObserver = new MutationObserver(mutations => {
7013            // Evitar processamento durante inicialização
7014            if (isInitializing) return;
7015            
7016            // Debounce para evitar execuções excessivas
7017            clearTimeout(debounceTimeout);
7018            debounceTimeout = setTimeout(() => {
7019                try {
7020                    const relevantNodes = [];
7021                    
7022                    mutations.forEach(mutation => {
7023                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
7024                            Array.from(mutation.addedNodes).forEach(node => {
7025                                // Só processar nós elemento que podem conter ou ser cards de vídeo
7026                                if (node.nodeType === Node.ELEMENT_NODE &&
7027                                    (node.classList.contains('sampa-news-video-card') ||
7028                                     node.querySelector?.('.sampa-news-video-card') ||
7029                                     node.classList.contains('fragment') ||
7030                                     node.classList.contains('portlet'))) {
7031                                    relevantNodes.push(node);
7032                                }
7033                            });
7034                        }
7035                    });
7036                    
7037                    if (relevantNodes.length > 0) {
7038                        processRelevantNodes(relevantNodes);
7039                    }
7040                } catch (error) {
7041                    console.error('Erro no observer de vídeos:', error);
7042                }
7043            }, 150); // Debounce de 150ms
7044        });
7045        
7046        // Observer mais específico - só monitora containers relevantes
7047        const observeTargets = [
7048            document.querySelector('.sampa-news-container'),
7049            document.querySelector('#main-content'),
7050            document.querySelector('.portlet-boundary'),
7051            document.body // Fallback
7052        ].filter(Boolean);
7053        
7054        observeTargets.forEach(target => {
7055            window.sampanewsObserver.observe(target, {
7056                childList: true,
7057                subtree: true
7058            });
7059        });
7060        
7061        // Cleanup ao sair da página
7062        window.addEventListener('beforeunload', function() {
7063            if (window.sampanewsObserver) {
7064                window.sampanewsObserver.disconnect();
7065            }
7066            clearTimeout(debounceTimeout);
7067        });
7068    }
7069})();;</script>
7069
7070               </div>
7071              </div>
7072              <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
7073               <div class="lfr-layout-structure-item-v-deos-curtos lfr-layout-structure-item-056a5513-7246-f6cc-cfe7-94581b625498 " data-layout-structure-item-id="056a5513-7246-f6cc-cfe7-94581b625498">
7074                <div id="fragment-40a2c9c8-2fa5-19e2-6c66-c1233bb91d23">
7075                 <!-- HTML do Fragmento -->
7076                 <div class="sampa-news-video-card">
7077                  <picture data-fileentryid="58710215"><source media="(max-width:193px)" srcset="/o/adaptive-media/image/58710215/Thumbnail-300x300/Captura+de+tela+2026-08-11+092952.png?t=1786451408731"><source media="(max-width:572px) and (min-width:193px)" srcset="/o/adaptive-media/image/58710215/Preview-1000x0/Captura+de+tela+2026-08-11+092952.png?t=1786451408731"><img class="sampa-news-video-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/Captura+de+tela+2026-08-11+092952.png/4c6a5edb-e783-e860-2930-fcb6b000b360?version=1.0&amp;t=1786451408731" alt="Vila Reencontro" data-fileentryid="58710215"></picture> <span class="sampa-news-video-duration" data-lfr-editable-id="video-duration" data-lfr-editable-type="text" style="display:none;"></span>
7078                  <div class="sampa-news-video-player-button">
7079                   <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
7080                    <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
7081                   </svg>
7082                  </div>
7083                  <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/shorts/bKYFlOWqjp0" style="display: none;" target="_self">https://www.youtube.com/shorts/bKYFlOWqjp0</a> <iframe class="sampa-news-video-iframe" src="" title="YouTube Shorts Player" frameborder="0" scrolling="no" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>
7084    </iframe>
7085                  <div class="sampa-news-video-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Vila Reencontro: moradia é o primeiro passo para reconstruir caminhos</div>
7086                 </div>
7087                </div>
7088                
7088<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-40a2c9c8-2fa5-19e2-6c66-c1233bb91d23'); const fragmentElementId = 'fragment-40a2c9c8-2fa5-19e2-6c66-c1233bb91d23'; const fragmentEntryLinkNamespace = 'wayh'; const fragmentNamespace = 'wayh'; const layoutMode = 'view';(function() {
7089    // Usar uma única função global para evitar conflitos
7090    if (typeof window.sampanewsVideoHandler === 'undefined') {
7091        
7092        // Cache selectors and regex patterns
7093        const videoPatterns = {
7094            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
7095            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
7096            watch: /[?&]v=([a-zA-Z0-9_-]+)/
7097        };
7098
7099        // Flag para evitar processamento durante inicialização
7100        let isInitializing = false;
7101        let debounceTimeout = null;
7102
7103        // Função para reproduzir vídeos
7104        window.sampanewsPlayVideo = function(card) {
7105            try {
7106                const iframe = card.querySelector('.sampa-news-video-iframe');
7107                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
7108                const url = linkElement?.getAttribute('href') || '';
7109                
7110                if (!url || url === '#' || url === '') {
7111                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
7112                    return;
7113                }
7114                
7115                // Converter URL do YouTube para embed
7116                let embedUrl = url;
7117                let videoIdMatch = null;
7118                
7119                // More efficient URL parsing
7120                if (url.includes('youtube.com/embed/')) {
7121                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0`;
7122                } else {
7123                    for (const [type, pattern] of Object.entries(videoPatterns)) {
7124                        if ((type === 'shorts' && url.includes('youtube.com/shorts/')) ||
7125                            (type === 'youtuBe' && url.includes('youtu.be/')) ||
7126                            (type === 'watch' && url.includes('youtube.com/watch'))) {
7127                            videoIdMatch = url.match(pattern);
7128                            break;
7129                        }
7130                    }
7131                    
7132                    if (videoIdMatch?.[1]) {
7133                        embedUrl = `https://www.youtube.com/embed/${videoIdMatch[1]}?autoplay=1&mute=0`;
7134                    }
7135                }
7136                
7137                // Parar vídeo atual se existir
7138                const playingCard = document.querySelector('.sampa-news-video-card.sampa-news-playing');
7139                if (playingCard && playingCard !== card) {
7140                    playingCard.classList.remove('sampa-news-playing');
7141                    const playingIframe = playingCard.querySelector('.sampa-news-video-iframe');
7142                    if (playingIframe) {
7143                        playingIframe.src = '';
7144                    }
7145                }
7146                
7147                // Iniciar novo vídeo
7148                card.classList.add('sampa-news-playing');
7149                if (iframe) {
7150                    iframe.src = embedUrl;
7151                }
7152            } catch (error) {
7153                console.error('Erro ao reproduzir vídeo:', error);
7154            }
7155        };
7156
7157        // Optimized event handler
7158        const handleCardClick = (e) => {
7159            e.preventDefault();
7160            e.stopPropagation();
7161            window.sampanewsPlayVideo(e.currentTarget);
7162        };
7163        
7164        // Função para inicializar um único card
7165        const initializeCard = (card) => {
7166            if (!card.hasAttribute('data-sampa-initialized')) {
7167                card.addEventListener('click', handleCardClick);
7168                card.setAttribute('data-sampa-initialized', 'true');
7169                return true;
7170            }
7171            return false;
7172        };
7173        
7174        // Função otimizada para processar apenas nós relevantes
7175        const processRelevantNodes = (nodes) => {
7176            if (isInitializing) return;
7177            
7178            let processedCount = 0;
7179            
7180            nodes.forEach(node => {
7181                if (node.nodeType === Node.ELEMENT_NODE) {
7182                    let cardsToProcess = [];
7183                    
7184                    // Verificar se o próprio nó é um card
7185                    if (node.matches && node.matches('.sampa-news-video-card')) {
7186                        cardsToProcess.push(node);
7187                    }
7188                    
7189                    // Verificar se contém cards (só se for um container relevante)
7190                    if (node.querySelector && 
7191                        (node.classList.contains('fragment') || 
7192                         node.classList.contains('portlet') ||
7193                         node.classList.contains('sampa-news') ||
7194                         node.querySelectorAll('.sampa-news-video-card').length > 0)) {
7195                        
7196                        const childCards = node.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
7197                        cardsToProcess.push(...childCards);
7198                    }
7199                    
7200                    // Inicializar cards encontrados
7201                    cardsToProcess.forEach(card => {
7202                        if (initializeCard(card)) {
7203                            processedCount++;
7204                        }
7205                    });
7206                }
7207            });
7208            
7209            if (processedCount > 0) {
7210                console.log(`Sampa News: Inicializados ${processedCount} novos cards de vídeo`);
7211            }
7212        };
7213        
7214        // Função para inicializar event listeners
7215        window.sampanewsInitVideoCards = function() {
7216            if (isInitializing) return;
7217            isInitializing = true;
7218            
7219            try {
7220                let initializedCount = 0;
7221                const cards = document.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
7222                
7223                cards.forEach(card => {
7224                    if (initializeCard(card)) {
7225                        initializedCount++;
7226                    }
7227                });
7228                
7229                if (initializedCount > 0) {
7230                    console.log(`Sampa News: Inicializados ${initializedCount} cards de vídeo`);
7231                }
7232            } catch (error) {
7233                console.error('Erro ao inicializar cards de vídeo:', error);
7234            } finally {
7235                isInitializing = false;
7236            }
7237        };
7238        
7239        // Marcar como inicializado
7240        window.sampanewsVideoHandler = true;
7241        
7242        // Inicializar na primeira execução
7243        if (document.readyState === 'loading') {
7244            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCards);
7245        } else {
7246            window.sampanewsInitVideoCards();
7247        }
7248    } else {
7249        // Se já existe, apenas reinicializa novos cards
7250        if (typeof window.sampanewsInitVideoCards === 'function') {
7251            window.sampanewsInitVideoCards();
7252        }
7253    }
7254    
7255    // Observer otimizado com proteção anti-loop
7256    if (typeof window.sampanewsObserver === 'undefined') {
7257        
7258        window.sampanewsObserver = new MutationObserver(mutations => {
7259            // Evitar processamento durante inicialização
7260            if (isInitializing) return;
7261            
7262            // Debounce para evitar execuções excessivas
7263            clearTimeout(debounceTimeout);
7264            debounceTimeout = setTimeout(() => {
7265                try {
7266                    const relevantNodes = [];
7267                    
7268                    mutations.forEach(mutation => {
7269                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
7270                            Array.from(mutation.addedNodes).forEach(node => {
7271                                // Só processar nós elemento que podem conter ou ser cards de vídeo
7272                                if (node.nodeType === Node.ELEMENT_NODE &&
7273                                    (node.classList.contains('sampa-news-video-card') ||
7274                                     node.querySelector?.('.sampa-news-video-card') ||
7275                                     node.classList.contains('fragment') ||
7276                                     node.classList.contains('portlet'))) {
7277                                    relevantNodes.push(node);
7278                                }
7279                            });
7280                        }
7281                    });
7282                    
7283                    if (relevantNodes.length > 0) {
7284                        processRelevantNodes(relevantNodes);
7285                    }
7286                } catch (error) {
7287                    console.error('Erro no observer de vídeos:', error);
7288                }
7289            }, 150); // Debounce de 150ms
7290        });
7291        
7292        // Observer mais específico - só monitora containers relevantes
7293        const observeTargets = [
7294            document.querySelector('.sampa-news-container'),
7295            document.querySelector('#main-content'),
7296            document.querySelector('.portlet-boundary'),
7297            document.body // Fallback
7298        ].filter(Boolean);
7299        
7300        observeTargets.forEach(target => {
7301            window.sampanewsObserver.observe(target, {
7302                childList: true,
7303                subtree: true
7304            });
7305        });
7306        
7307        // Cleanup ao sair da página
7308        window.addEventListener('beforeunload', function() {
7309            if (window.sampanewsObserver) {
7310                window.sampanewsObserver.disconnect();
7311            }
7312            clearTimeout(debounceTimeout);
7313        });
7314    }
7315})();;</script>
7315
7316               </div>
7317              </div>
7318              <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
7319               <div class="lfr-layout-structure-item-v-deos-curtos lfr-layout-structure-item-056a5513-7246-f6cc-cfe7-94581b625498 " data-layout-structure-item-id="056a5513-7246-f6cc-cfe7-94581b625498">
7320                <div id="fragment-43faed1c-3097-cb5c-0c86-dd82f43802b2">
7321                 <!-- HTML do Fragmento -->
7322                 <div class="sampa-news-video-card">
7323                  <picture data-fileentryid="58707392"><source media="(max-width:182px)" srcset="/o/adaptive-media/image/58707392/Thumbnail-300x300/Captura+de+tela+2026-08-11+091941.png?t=1786450875856"><source media="(max-width:584px) and (min-width:182px)" srcset="/o/adaptive-media/image/58707392/Preview-1000x0/Captura+de+tela+2026-08-11+091941.png?t=1786450875856"><img class="sampa-news-video-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/Captura+de+tela+2026-08-11+091941.png/238bd83f-435b-155d-c924-9fd7fd4343ef?version=1.0&amp;t=1786450875856" alt="Theatro Municipal" data-fileentryid="58707392"></picture> <span class="sampa-news-video-duration" data-lfr-editable-id="video-duration" data-lfr-editable-type="text" style="display:none;"></span>
7324                  <div class="sampa-news-video-player-button">
7325                   <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
7326                    <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
7327                   </svg>
7328                  </div>
7329                  <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/shorts/Wfb4KhBSSgQ" style="display: none;" target="_self">https://www.youtube.com/shorts/Wfb4KhBSSgQ</a> <iframe class="sampa-news-video-iframe" src="" title="YouTube Shorts Player" frameborder="0" scrolling="no" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>
7330    </iframe>
7331                  <div class="sampa-news-video-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Já imaginou conhecer um dos cartões-postais de São Paulo usando as mãos?</div>
7332                 </div>
7333                </div>
7334                
7334<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-43faed1c-3097-cb5c-0c86-dd82f43802b2'); const fragmentElementId = 'fragment-43faed1c-3097-cb5c-0c86-dd82f43802b2'; const fragmentEntryLinkNamespace = 'wayh'; const fragmentNamespace = 'wayh'; const layoutMode = 'view';(function() {
7335    // Usar uma única função global para evitar conflitos
7336    if (typeof window.sampanewsVideoHandler === 'undefined') {
7337        
7338        // Cache selectors and regex patterns
7339        const videoPatterns = {
7340            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
7341            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
7342            watch: /[?&]v=([a-zA-Z0-9_-]+)/
7343        };
7344
7345        // Flag para evitar processamento durante inicialização
7346        let isInitializing = false;
7347        let debounceTimeout = null;
7348
7349        // Função para reproduzir vídeos
7350        window.sampanewsPlayVideo = function(card) {
7351            try {
7352                const iframe = card.querySelector('.sampa-news-video-iframe');
7353                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
7354                const url = linkElement?.getAttribute('href') || '';
7355                
7356                if (!url || url === '#' || url === '') {
7357                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
7358                    return;
7359                }
7360                
7361                // Converter URL do YouTube para embed
7362                let embedUrl = url;
7363                let videoIdMatch = null;
7364                
7365                // More efficient URL parsing
7366                if (url.includes('youtube.com/embed/')) {
7367                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0`;
7368                } else {
7369                    for (const [type, pattern] of Object.entries(videoPatterns)) {
7370                        if ((type === 'shorts' && url.includes('youtube.com/shorts/')) ||
7371                            (type === 'youtuBe' && url.includes('youtu.be/')) ||
7372                            (type === 'watch' && url.includes('youtube.com/watch'))) {
7373                            videoIdMatch = url.match(pattern);
7374                            break;
7375                        }
7376                    }
7377                    
7378                    if (videoIdMatch?.[1]) {
7379                        embedUrl = `https://www.youtube.com/embed/${videoIdMatch[1]}?autoplay=1&mute=0`;
7380                    }
7381                }
7382                
7383                // Parar vídeo atual se existir
7384                const playingCard = document.querySelector('.sampa-news-video-card.sampa-news-playing');
7385                if (playingCard && playingCard !== card) {
7386                    playingCard.classList.remove('sampa-news-playing');
7387                    const playingIframe = playingCard.querySelector('.sampa-news-video-iframe');
7388                    if (playingIframe) {
7389                        playingIframe.src = '';
7390                    }
7391                }
7392                
7393                // Iniciar novo vídeo
7394                card.classList.add('sampa-news-playing');
7395                if (iframe) {
7396                    iframe.src = embedUrl;
7397                }
7398            } catch (error) {
7399                console.error('Erro ao reproduzir vídeo:', error);
7400            }
7401        };
7402
7403        // Optimized event handler
7404        const handleCardClick = (e) => {
7405            e.preventDefault();
7406            e.stopPropagation();
7407            window.sampanewsPlayVideo(e.currentTarget);
7408        };
7409        
7410        // Função para inicializar um único card
7411        const initializeCard = (card) => {
7412            if (!card.hasAttribute('data-sampa-initialized')) {
7413                card.addEventListener('click', handleCardClick);
7414                card.setAttribute('data-sampa-initialized', 'true');
7415                return true;
7416            }
7417            return false;
7418        };
7419        
7420        // Função otimizada para processar apenas nós relevantes
7421        const processRelevantNodes = (nodes) => {
7422            if (isInitializing) return;
7423            
7424            let processedCount = 0;
7425            
7426            nodes.forEach(node => {
7427                if (node.nodeType === Node.ELEMENT_NODE) {
7428                    let cardsToProcess = [];
7429                    
7430                    // Verificar se o próprio nó é um card
7431                    if (node.matches && node.matches('.sampa-news-video-card')) {
7432                        cardsToProcess.push(node);
7433                    }
7434                    
7435                    // Verificar se contém cards (só se for um container relevante)
7436                    if (node.querySelector && 
7437                        (node.classList.contains('fragment') || 
7438                         node.classList.contains('portlet') ||
7439                         node.classList.contains('sampa-news') ||
7440                         node.querySelectorAll('.sampa-news-video-card').length > 0)) {
7441                        
7442                        const childCards = node.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
7443                        cardsToProcess.push(...childCards);
7444                    }
7445                    
7446                    // Inicializar cards encontrados
7447                    cardsToProcess.forEach(card => {
7448                        if (initializeCard(card)) {
7449                            processedCount++;
7450                        }
7451                    });
7452                }
7453            });
7454            
7455            if (processedCount > 0) {
7456                console.log(`Sampa News: Inicializados ${processedCount} novos cards de vídeo`);
7457            }
7458        };
7459        
7460        // Função para inicializar event listeners
7461        window.sampanewsInitVideoCards = function() {
7462            if (isInitializing) return;
7463            isInitializing = true;
7464            
7465            try {
7466                let initializedCount = 0;
7467                const cards = document.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
7468                
7469                cards.forEach(card => {
7470                    if (initializeCard(card)) {
7471                        initializedCount++;
7472                    }
7473                });
7474                
7475                if (initializedCount > 0) {
7476                    console.log(`Sampa News: Inicializados ${initializedCount} cards de vídeo`);
7477                }
7478            } catch (error) {
7479                console.error('Erro ao inicializar cards de vídeo:', error);
7480            } finally {
7481                isInitializing = false;
7482            }
7483        };
7484        
7485        // Marcar como inicializado
7486        window.sampanewsVideoHandler = true;
7487        
7488        // Inicializar na primeira execução
7489        if (document.readyState === 'loading') {
7490            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCards);
7491        } else {
7492            window.sampanewsInitVideoCards();
7493        }
7494    } else {
7495        // Se já existe, apenas reinicializa novos cards
7496        if (typeof window.sampanewsInitVideoCards === 'function') {
7497            window.sampanewsInitVideoCards();
7498        }
7499    }
7500    
7501    // Observer otimizado com proteção anti-loop
7502    if (typeof window.sampanewsObserver === 'undefined') {
7503        
7504        window.sampanewsObserver = new MutationObserver(mutations => {
7505            // Evitar processamento durante inicialização
7506            if (isInitializing) return;
7507            
7508            // Debounce para evitar execuções excessivas
7509            clearTimeout(debounceTimeout);
7510            debounceTimeout = setTimeout(() => {
7511                try {
7512                    const relevantNodes = [];
7513                    
7514                    mutations.forEach(mutation => {
7515                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
7516                            Array.from(mutation.addedNodes).forEach(node => {
7517                                // Só processar nós elemento que podem conter ou ser cards de vídeo
7518                                if (node.nodeType === Node.ELEMENT_NODE &&
7519                                    (node.classList.contains('sampa-news-video-card') ||
7520                                     node.querySelector?.('.sampa-news-video-card') ||
7521                                     node.classList.contains('fragment') ||
7522                                     node.classList.contains('portlet'))) {
7523                                    relevantNodes.push(node);
7524                                }
7525                            });
7526                        }
7527                    });
7528                    
7529                    if (relevantNodes.length > 0) {
7530                        processRelevantNodes(relevantNodes);
7531                    }
7532                } catch (error) {
7533                    console.error('Erro no observer de vídeos:', error);
7534                }
7535            }, 150); // Debounce de 150ms
7536        });
7537        
7538        // Observer mais específico - só monitora containers relevantes
7539        const observeTargets = [
7540            document.querySelector('.sampa-news-container'),
7541            document.querySelector('#main-content'),
7542            document.querySelector('.portlet-boundary'),
7543            document.body // Fallback
7544        ].filter(Boolean);
7545        
7546        observeTargets.forEach(target => {
7547            window.sampanewsObserver.observe(target, {
7548                childList: true,
7549                subtree: true
7550            });
7551        });
7552        
7553        // Cleanup ao sair da página
7554        window.addEventListener('beforeunload', function() {
7555            if (window.sampanewsObserver) {
7556                window.sampanewsObserver.disconnect();
7557            }
7558            clearTimeout(debounceTimeout);
7559        });
7560    }
7561})();;</script>
7561
7562               </div>
7563              </div>
7564              <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
7565               <div class="lfr-layout-structure-item-v-deos-curtos lfr-layout-structure-item-056a5513-7246-f6cc-cfe7-94581b625498 " data-layout-structure-item-id="056a5513-7246-f6cc-cfe7-94581b625498">
7566                <div id="fragment-ffc16ed0-df61-8dc4-4ffa-6f30cd2da76d">
7567                 <!-- HTML do Fragmento -->
7568                 <div class="sampa-news-video-card">
7569                  <picture data-fileentryid="55906318"><source media="(max-width:174px)" srcset="/o/adaptive-media/image/55906318/Thumbnail-300x300/Captura+de+tela+2026-07-31+124806.png?t=1785512902761"><source media="(max-width:477px) and (min-width:174px)" srcset="/o/adaptive-media/image/55906318/Preview-1000x0/Captura+de+tela+2026-07-31+124806.png?t=1785512902761"><img class="sampa-news-video-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/Captura+de+tela+2026-07-31+124806.png/346d374b-fdc1-f9c7-3a12-4238d56421a6?version=1.0&amp;t=1785512902761" alt="Centro de Esportes Radicais" data-fileentryid="55906318"></picture> <span class="sampa-news-video-duration" data-lfr-editable-id="video-duration" data-lfr-editable-type="text" style="display:none;"></span>
7570                  <div class="sampa-news-video-player-button">
7571                   <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
7572                    <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
7573                   </svg>
7574                  </div>
7575                  <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/shorts/gpIKIobMuGQ" style="display: none;" target="_self">https://www.youtube.com/shorts/gpIKIobMuGQ</a> <iframe class="sampa-news-video-iframe" src="" title="YouTube Shorts Player" frameborder="0" scrolling="no" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>
7576    </iframe>
7577                  <div class="sampa-news-video-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Centro de Esportes Radicais, no Bom Retiro, recebe a segunda edição do Férias Radicais</div>
7578                 </div>
7579                </div>
7580                
7580<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-ffc16ed0-df61-8dc4-4ffa-6f30cd2da76d'); const fragmentElementId = 'fragment-ffc16ed0-df61-8dc4-4ffa-6f30cd2da76d'; const fragmentEntryLinkNamespace = 'wayh'; const fragmentNamespace = 'wayh'; const layoutMode = 'view';(function() {
7581    // Usar uma única função global para evitar conflitos
7582    if (typeof window.sampanewsVideoHandler === 'undefined') {
7583        
7584        // Cache selectors and regex patterns
7585        const videoPatterns = {
7586            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
7587            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
7588            watch: /[?&]v=([a-zA-Z0-9_-]+)/
7589        };
7590
7591        // Flag para evitar processamento durante inicialização
7592        let isInitializing = false;
7593        let debounceTimeout = null;
7594
7595        // Função para reproduzir vídeos
7596        window.sampanewsPlayVideo = function(card) {
7597            try {
7598                const iframe = card.querySelector('.sampa-news-video-iframe');
7599                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
7600                const url = linkElement?.getAttribute('href') || '';
7601                
7602                if (!url || url === '#' || url === '') {
7603                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
7604                    return;
7605                }
7606                
7607                // Converter URL do YouTube para embed
7608                let embedUrl = url;
7609                let videoIdMatch = null;
7610                
7611                // More efficient URL parsing
7612                if (url.includes('youtube.com/embed/')) {
7613                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0`;
7614                } else {
7615                    for (const [type, pattern] of Object.entries(videoPatterns)) {
7616                        if ((type === 'shorts' && url.includes('youtube.com/shorts/')) ||
7617                            (type === 'youtuBe' && url.includes('youtu.be/')) ||
7618                            (type === 'watch' && url.includes('youtube.com/watch'))) {
7619                            videoIdMatch = url.match(pattern);
7620                            break;
7621                        }
7622                    }
7623                    
7624                    if (videoIdMatch?.[1]) {
7625                        embedUrl = `https://www.youtube.com/embed/${videoIdMatch[1]}?autoplay=1&mute=0`;
7626                    }
7627                }
7628                
7629                // Parar vídeo atual se existir
7630                const playingCard = document.querySelector('.sampa-news-video-card.sampa-news-playing');
7631                if (playingCard && playingCard !== card) {
7632                    playingCard.classList.remove('sampa-news-playing');
7633                    const playingIframe = playingCard.querySelector('.sampa-news-video-iframe');
7634                    if (playingIframe) {
7635                        playingIframe.src = '';
7636                    }
7637                }
7638                
7639                // Iniciar novo vídeo
7640                card.classList.add('sampa-news-playing');
7641                if (iframe) {
7642                    iframe.src = embedUrl;
7643                }
7644            } catch (error) {
7645                console.error('Erro ao reproduzir vídeo:', error);
7646            }
7647        };
7648
7649        // Optimized event handler
7650        const handleCardClick = (e) => {
7651            e.preventDefault();
7652            e.stopPropagation();
7653            window.sampanewsPlayVideo(e.currentTarget);
7654        };
7655        
7656        // Função para inicializar um único card
7657        const initializeCard = (card) => {
7658            if (!card.hasAttribute('data-sampa-initialized')) {
7659                card.addEventListener('click', handleCardClick);
7660                card.setAttribute('data-sampa-initialized', 'true');
7661                return true;
7662            }
7663            return false;
7664        };
7665        
7666        // Função otimizada para processar apenas nós relevantes
7667        const processRelevantNodes = (nodes) => {
7668            if (isInitializing) return;
7669            
7670            let processedCount = 0;
7671            
7672            nodes.forEach(node => {
7673                if (node.nodeType === Node.ELEMENT_NODE) {
7674                    let cardsToProcess = [];
7675                    
7676                    // Verificar se o próprio nó é um card
7677                    if (node.matches && node.matches('.sampa-news-video-card')) {
7678                        cardsToProcess.push(node);
7679                    }
7680                    
7681                    // Verificar se contém cards (só se for um container relevante)
7682                    if (node.querySelector && 
7683                        (node.classList.contains('fragment') || 
7684                         node.classList.contains('portlet') ||
7685                         node.classList.contains('sampa-news') ||
7686                         node.querySelectorAll('.sampa-news-video-card').length > 0)) {
7687                        
7688                        const childCards = node.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
7689                        cardsToProcess.push(...childCards);
7690                    }
7691                    
7692                    // Inicializar cards encontrados
7693                    cardsToProcess.forEach(card => {
7694                        if (initializeCard(card)) {
7695                            processedCount++;
7696                        }
7697                    });
7698                }
7699            });
7700            
7701            if (processedCount > 0) {
7702                console.log(`Sampa News: Inicializados ${processedCount} novos cards de vídeo`);
7703            }
7704        };
7705        
7706        // Função para inicializar event listeners
7707        window.sampanewsInitVideoCards = function() {
7708            if (isInitializing) return;
7709            isInitializing = true;
7710            
7711            try {
7712                let initializedCount = 0;
7713                const cards = document.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
7714                
7715                cards.forEach(card => {
7716                    if (initializeCard(card)) {
7717                        initializedCount++;
7718                    }
7719                });
7720                
7721                if (initializedCount > 0) {
7722                    console.log(`Sampa News: Inicializados ${initializedCount} cards de vídeo`);
7723                }
7724            } catch (error) {
7725                console.error('Erro ao inicializar cards de vídeo:', error);
7726            } finally {
7727                isInitializing = false;
7728            }
7729        };
7730        
7731        // Marcar como inicializado
7732        window.sampanewsVideoHandler = true;
7733        
7734        // Inicializar na primeira execução
7735        if (document.readyState === 'loading') {
7736            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCards);
7737        } else {
7738            window.sampanewsInitVideoCards();
7739        }
7740    } else {
7741        // Se já existe, apenas reinicializa novos cards
7742        if (typeof window.sampanewsInitVideoCards === 'function') {
7743            window.sampanewsInitVideoCards();
7744        }
7745    }
7746    
7747    // Observer otimizado com proteção anti-loop
7748    if (typeof window.sampanewsObserver === 'undefined') {
7749        
7750        window.sampanewsObserver = new MutationObserver(mutations => {
7751            // Evitar processamento durante inicialização
7752            if (isInitializing) return;
7753            
7754            // Debounce para evitar execuções excessivas
7755            clearTimeout(debounceTimeout);
7756            debounceTimeout = setTimeout(() => {
7757                try {
7758                    const relevantNodes = [];
7759                    
7760                    mutations.forEach(mutation => {
7761                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
7762                            Array.from(mutation.addedNodes).forEach(node => {
7763                                // Só processar nós elemento que podem conter ou ser cards de vídeo
7764                                if (node.nodeType === Node.ELEMENT_NODE &&
7765                                    (node.classList.contains('sampa-news-video-card') ||
7766                                     node.querySelector?.('.sampa-news-video-card') ||
7767                                     node.classList.contains('fragment') ||
7768                                     node.classList.contains('portlet'))) {
7769                                    relevantNodes.push(node);
7770                                }
7771                            });
7772                        }
7773                    });
7774                    
7775                    if (relevantNodes.length > 0) {
7776                        processRelevantNodes(relevantNodes);
7777                    }
7778                } catch (error) {
7779                    console.error('Erro no observer de vídeos:', error);
7780                }
7781            }, 150); // Debounce de 150ms
7782        });
7783        
7784        // Observer mais específico - só monitora containers relevantes
7785        const observeTargets = [
7786            document.querySelector('.sampa-news-container'),
7787            document.querySelector('#main-content'),
7788            document.querySelector('.portlet-boundary'),
7789            document.body // Fallback
7790        ].filter(Boolean);
7791        
7792        observeTargets.forEach(target => {
7793            window.sampanewsObserver.observe(target, {
7794                childList: true,
7795                subtree: true
7796            });
7797        });
7798        
7799        // Cleanup ao sair da página
7800        window.addEventListener('beforeunload', function() {
7801            if (window.sampanewsObserver) {
7802                window.sampanewsObserver.disconnect();
7803            }
7804            clearTimeout(debounceTimeout);
7805        });
7806    }
7807})();;</script>
7807
7808               </div>
7809              </div>
7810              <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
7811               <div class="lfr-layout-structure-item-v-deos-curtos lfr-layout-structure-item-056a5513-7246-f6cc-cfe7-94581b625498 " data-layout-structure-item-id="056a5513-7246-f6cc-cfe7-94581b625498">
7812                <div id="fragment-88c1e30d-c42d-46bc-636c-f4de924d9d0d">
7813                 <!-- HTML do Fragmento -->
7814                 <div class="sampa-news-video-card">
7815                  <picture data-fileentryid="55905854"><source media="(max-width:175px)" srcset="/o/adaptive-media/image/55905854/Thumbnail-300x300/Captura+de+tela+2026-07-31+124339.png?t=1785512646931"><source media="(max-width:478px) and (min-width:175px)" srcset="/o/adaptive-media/image/55905854/Preview-1000x0/Captura+de+tela+2026-07-31+124339.png?t=1785512646931"><img class="sampa-news-video-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/Captura+de+tela+2026-07-31+124339.png/9cc6796a-af26-e4fb-c385-e7a4ce18f35d?version=1.0&amp;t=1785512646931" alt="Centros Esportivos da Prefeitura" data-fileentryid="55905854"></picture> <span class="sampa-news-video-duration" data-lfr-editable-id="video-duration" data-lfr-editable-type="text" style="display:none;"></span>
7816                  <div class="sampa-news-video-player-button">
7817                   <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
7818                    <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
7819                   </svg>
7820                  </div>
7821                  <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/shorts/pNcYX0m5cUM" style="display: none;" target="_self">https://www.youtube.com/shorts/pNcYX0m5cUM</a> <iframe class="sampa-news-video-iframe" src="" title="YouTube Shorts Player" frameborder="0" scrolling="no" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>
7822    </iframe>
7823                  <div class="sampa-news-video-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Nos Centros Esportivos da Prefeitura, você encontra aulas gratuitas de defesa pessoal</div>
7824                 </div>
7825                </div>
7826                
7826<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-88c1e30d-c42d-46bc-636c-f4de924d9d0d'); const fragmentElementId = 'fragment-88c1e30d-c42d-46bc-636c-f4de924d9d0d'; const fragmentEntryLinkNamespace = 'wayh'; const fragmentNamespace = 'wayh'; const layoutMode = 'view';(function() {
7827    // Usar uma única função global para evitar conflitos
7828    if (typeof window.sampanewsVideoHandler === 'undefined') {
7829        
7830        // Cache selectors and regex patterns
7831        const videoPatterns = {
7832            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
7833            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
7834            watch: /[?&]v=([a-zA-Z0-9_-]+)/
7835        };
7836
7837        // Flag para evitar processamento durante inicialização
7838        let isInitializing = false;
7839        let debounceTimeout = null;
7840
7841        // Função para reproduzir vídeos
7842        window.sampanewsPlayVideo = function(card) {
7843            try {
7844                const iframe = card.querySelector('.sampa-news-video-iframe');
7845                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
7846                const url = linkElement?.getAttribute('href') || '';
7847                
7848                if (!url || url === '#' || url === '') {
7849                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
7850                    return;
7851                }
7852                
7853                // Converter URL do YouTube para embed
7854                let embedUrl = url;
7855                let videoIdMatch = null;
7856                
7857                // More efficient URL parsing
7858                if (url.includes('youtube.com/embed/')) {
7859                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0`;
7860                } else {
7861                    for (const [type, pattern] of Object.entries(videoPatterns)) {
7862                        if ((type === 'shorts' && url.includes('youtube.com/shorts/')) ||
7863                            (type === 'youtuBe' && url.includes('youtu.be/')) ||
7864                            (type === 'watch' && url.includes('youtube.com/watch'))) {
7865                            videoIdMatch = url.match(pattern);
7866                            break;
7867                        }
7868                    }
7869                    
7870                    if (videoIdMatch?.[1]) {
7871                        embedUrl = `https://www.youtube.com/embed/${videoIdMatch[1]}?autoplay=1&mute=0`;
7872                    }
7873                }
7874                
7875                // Parar vídeo atual se existir
7876                const playingCard = document.querySelector('.sampa-news-video-card.sampa-news-playing');
7877                if (playingCard && playingCard !== card) {
7878                    playingCard.classList.remove('sampa-news-playing');
7879                    const playingIframe = playingCard.querySelector('.sampa-news-video-iframe');
7880                    if (playingIframe) {
7881                        playingIframe.src = '';
7882                    }
7883                }
7884                
7885                // Iniciar novo vídeo
7886                card.classList.add('sampa-news-playing');
7887                if (iframe) {
7888                    iframe.src = embedUrl;
7889                }
7890            } catch (error) {
7891                console.error('Erro ao reproduzir vídeo:', error);
7892            }
7893        };
7894
7895        // Optimized event handler
7896        const handleCardClick = (e) => {
7897            e.preventDefault();
7898            e.stopPropagation();
7899            window.sampanewsPlayVideo(e.currentTarget);
7900        };
7901        
7902        // Função para inicializar um único card
7903        const initializeCard = (card) => {
7904            if (!card.hasAttribute('data-sampa-initialized')) {
7905                card.addEventListener('click', handleCardClick);
7906                card.setAttribute('data-sampa-initialized', 'true');
7907                return true;
7908            }
7909            return false;
7910        };
7911        
7912        // Função otimizada para processar apenas nós relevantes
7913        const processRelevantNodes = (nodes) => {
7914            if (isInitializing) return;
7915            
7916            let processedCount = 0;
7917            
7918            nodes.forEach(node => {
7919                if (node.nodeType === Node.ELEMENT_NODE) {
7920                    let cardsToProcess = [];
7921                    
7922                    // Verificar se o próprio nó é um card
7923                    if (node.matches && node.matches('.sampa-news-video-card')) {
7924                        cardsToProcess.push(node);
7925                    }
7926                    
7927                    // Verificar se contém cards (só se for um container relevante)
7928                    if (node.querySelector && 
7929                        (node.classList.contains('fragment') || 
7930                         node.classList.contains('portlet') ||
7931                         node.classList.contains('sampa-news') ||
7932                         node.querySelectorAll('.sampa-news-video-card').length > 0)) {
7933                        
7934                        const childCards = node.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
7935                        cardsToProcess.push(...childCards);
7936                    }
7937                    
7938                    // Inicializar cards encontrados
7939                    cardsToProcess.forEach(card => {
7940                        if (initializeCard(card)) {
7941                            processedCount++;
7942                        }
7943                    });
7944                }
7945            });
7946            
7947            if (processedCount > 0) {
7948                console.log(`Sampa News: Inicializados ${processedCount} novos cards de vídeo`);
7949            }
7950        };
7951        
7952        // Função para inicializar event listeners
7953        window.sampanewsInitVideoCards = function() {
7954            if (isInitializing) return;
7955            isInitializing = true;
7956            
7957            try {
7958                let initializedCount = 0;
7959                const cards = document.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
7960                
7961                cards.forEach(card => {
7962                    if (initializeCard(card)) {
7963                        initializedCount++;
7964                    }
7965                });
7966                
7967                if (initializedCount > 0) {
7968                    console.log(`Sampa News: Inicializados ${initializedCount} cards de vídeo`);
7969                }
7970            } catch (error) {
7971                console.error('Erro ao inicializar cards de vídeo:', error);
7972            } finally {
7973                isInitializing = false;
7974            }
7975        };
7976        
7977        // Marcar como inicializado
7978        window.sampanewsVideoHandler = true;
7979        
7980        // Inicializar na primeira execução
7981        if (document.readyState === 'loading') {
7982            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCards);
7983        } else {
7984            window.sampanewsInitVideoCards();
7985        }
7986    } else {
7987        // Se já existe, apenas reinicializa novos cards
7988        if (typeof window.sampanewsInitVideoCards === 'function') {
7989            window.sampanewsInitVideoCards();
7990        }
7991    }
7992    
7993    // Observer otimizado com proteção anti-loop
7994    if (typeof window.sampanewsObserver === 'undefined') {
7995        
7996        window.sampanewsObserver = new MutationObserver(mutations => {
7997            // Evitar processamento durante inicialização
7998            if (isInitializing) return;
7999            
8000            // Debounce para evitar execuções excessivas
8001            clearTimeout(debounceTimeout);
8002            debounceTimeout = setTimeout(() => {
8003                try {
8004                    const relevantNodes = [];
8005                    
8006                    mutations.forEach(mutation => {
8007                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
8008                            Array.from(mutation.addedNodes).forEach(node => {
8009                                // Só processar nós elemento que podem conter ou ser cards de vídeo
8010                                if (node.nodeType === Node.ELEMENT_NODE &&
8011                                    (node.classList.contains('sampa-news-video-card') ||
8012                                     node.querySelector?.('.sampa-news-video-card') ||
8013                                     node.classList.contains('fragment') ||
8014                                     node.classList.contains('portlet'))) {
8015                                    relevantNodes.push(node);
8016                                }
8017                            });
8018                        }
8019                    });
8020                    
8021                    if (relevantNodes.length > 0) {
8022                        processRelevantNodes(relevantNodes);
8023                    }
8024                } catch (error) {
8025                    console.error('Erro no observer de vídeos:', error);
8026                }
8027            }, 150); // Debounce de 150ms
8028        });
8029        
8030        // Observer mais específico - só monitora containers relevantes
8031        const observeTargets = [
8032            document.querySelector('.sampa-news-container'),
8033            document.querySelector('#main-content'),
8034            document.querySelector('.portlet-boundary'),
8035            document.body // Fallback
8036        ].filter(Boolean);
8037        
8038        observeTargets.forEach(target => {
8039            window.sampanewsObserver.observe(target, {
8040                childList: true,
8041                subtree: true
8042            });
8043        });
8044        
8045        // Cleanup ao sair da página
8046        window.addEventListener('beforeunload', function() {
8047            if (window.sampanewsObserver) {
8048                window.sampanewsObserver.disconnect();
8049            }
8050            clearTimeout(debounceTimeout);
8051        });
8052    }
8053})();;</script>
8053
8054               </div>
8055              </div>
8056              <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
8057               <div class="lfr-layout-structure-item-v-deos-curtos lfr-layout-structure-item-056a5513-7246-f6cc-cfe7-94581b625498 " data-layout-structure-item-id="056a5513-7246-f6cc-cfe7-94581b625498">
8058                <div id="fragment-c79ccceb-820f-3a38-da19-26db6ef9d7de">
8059                 <!-- HTML do Fragmento -->
8060                 <div class="sampa-news-video-card">
8061                  <picture data-fileentryid="55892547"><source media="(max-width:170px)" srcset="/o/adaptive-media/image/55892547/Thumbnail-300x300/Captura+de+tela+2026-07-31+121733.png?t=1785511066316"><source media="(max-width:467px) and (min-width:170px)" srcset="/o/adaptive-media/image/55892547/Preview-1000x0/Captura+de+tela+2026-07-31+121733.png?t=1785511066316"><img class="sampa-news-video-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/Captura+de+tela+2026-07-31+121733.png/03210a70-d362-16ca-c36f-d5b86d3260da?version=1.0&amp;t=1785511066316" alt="Rede Cozinha Escola" data-fileentryid="55892547"></picture> <span class="sampa-news-video-duration" data-lfr-editable-id="video-duration" data-lfr-editable-type="text" style="display:none;"></span>
8062                  <div class="sampa-news-video-player-button">
8063                   <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
8064                    <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
8065                   </svg>
8066                  </div>
8067                  <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/shorts/CJLZlTM-XTc" style="display: none;" target="_self">https://www.youtube.com/shorts/CJLZlTM-XTc</a> <iframe class="sampa-news-video-iframe" src="" title="YouTube Shorts Player" frameborder="0" scrolling="no" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>
8068    </iframe>
8069                  <div class="sampa-news-video-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Rede Cozinha Escola une segurança alimentar e geração de oportunidades</div>
8070                 </div>
8071                </div>
8072                
8072<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-c79ccceb-820f-3a38-da19-26db6ef9d7de'); const fragmentElementId = 'fragment-c79ccceb-820f-3a38-da19-26db6ef9d7de'; const fragmentEntryLinkNamespace = 'wayh'; const fragmentNamespace = 'wayh'; const layoutMode = 'view';(function() {
8073    // Usar uma única função global para evitar conflitos
8074    if (typeof window.sampanewsVideoHandler === 'undefined') {
8075        
8076        // Cache selectors and regex patterns
8077        const videoPatterns = {
8078            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
8079            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
8080            watch: /[?&]v=([a-zA-Z0-9_-]+)/
8081        };
8082
8083        // Flag para evitar processamento durante inicialização
8084        let isInitializing = false;
8085        let debounceTimeout = null;
8086
8087        // Função para reproduzir vídeos
8088        window.sampanewsPlayVideo = function(card) {
8089            try {
8090                const iframe = card.querySelector('.sampa-news-video-iframe');
8091                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
8092                const url = linkElement?.getAttribute('href') || '';
8093                
8094                if (!url || url === '#' || url === '') {
8095                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
8096                    return;
8097                }
8098                
8099                // Converter URL do YouTube para embed
8100                let embedUrl = url;
8101                let videoIdMatch = null;
8102                
8103                // More efficient URL parsing
8104                if (url.includes('youtube.com/embed/')) {
8105                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0`;
8106                } else {
8107                    for (const [type, pattern] of Object.entries(videoPatterns)) {
8108                        if ((type === 'shorts' && url.includes('youtube.com/shorts/')) ||
8109                            (type === 'youtuBe' && url.includes('youtu.be/')) ||
8110                            (type === 'watch' && url.includes('youtube.com/watch'))) {
8111                            videoIdMatch = url.match(pattern);
8112                            break;
8113                        }
8114                    }
8115                    
8116                    if (videoIdMatch?.[1]) {
8117                        embedUrl = `https://www.youtube.com/embed/${videoIdMatch[1]}?autoplay=1&mute=0`;
8118                    }
8119                }
8120                
8121                // Parar vídeo atual se existir
8122                const playingCard = document.querySelector('.sampa-news-video-card.sampa-news-playing');
8123                if (playingCard && playingCard !== card) {
8124                    playingCard.classList.remove('sampa-news-playing');
8125                    const playingIframe = playingCard.querySelector('.sampa-news-video-iframe');
8126                    if (playingIframe) {
8127                        playingIframe.src = '';
8128                    }
8129                }
8130                
8131                // Iniciar novo vídeo
8132                card.classList.add('sampa-news-playing');
8133                if (iframe) {
8134                    iframe.src = embedUrl;
8135                }
8136            } catch (error) {
8137                console.error('Erro ao reproduzir vídeo:', error);
8138            }
8139        };
8140
8141        // Optimized event handler
8142        const handleCardClick = (e) => {
8143            e.preventDefault();
8144            e.stopPropagation();
8145            window.sampanewsPlayVideo(e.currentTarget);
8146        };
8147        
8148        // Função para inicializar um único card
8149        const initializeCard = (card) => {
8150            if (!card.hasAttribute('data-sampa-initialized')) {
8151                card.addEventListener('click', handleCardClick);
8152                card.setAttribute('data-sampa-initialized', 'true');
8153                return true;
8154            }
8155            return false;
8156        };
8157        
8158        // Função otimizada para processar apenas nós relevantes
8159        const processRelevantNodes = (nodes) => {
8160            if (isInitializing) return;
8161            
8162            let processedCount = 0;
8163            
8164            nodes.forEach(node => {
8165                if (node.nodeType === Node.ELEMENT_NODE) {
8166                    let cardsToProcess = [];
8167                    
8168                    // Verificar se o próprio nó é um card
8169                    if (node.matches && node.matches('.sampa-news-video-card')) {
8170                        cardsToProcess.push(node);
8171                    }
8172                    
8173                    // Verificar se contém cards (só se for um container relevante)
8174                    if (node.querySelector && 
8175                        (node.classList.contains('fragment') || 
8176                         node.classList.contains('portlet') ||
8177                         node.classList.contains('sampa-news') ||
8178                         node.querySelectorAll('.sampa-news-video-card').length > 0)) {
8179                        
8180                        const childCards = node.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
8181                        cardsToProcess.push(...childCards);
8182                    }
8183                    
8184                    // Inicializar cards encontrados
8185                    cardsToProcess.forEach(card => {
8186                        if (initializeCard(card)) {
8187                            processedCount++;
8188                        }
8189                    });
8190                }
8191            });
8192            
8193            if (processedCount > 0) {
8194                console.log(`Sampa News: Inicializados ${processedCount} novos cards de vídeo`);
8195            }
8196        };
8197        
8198        // Função para inicializar event listeners
8199        window.sampanewsInitVideoCards = function() {
8200            if (isInitializing) return;
8201            isInitializing = true;
8202            
8203            try {
8204                let initializedCount = 0;
8205                const cards = document.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
8206                
8207                cards.forEach(card => {
8208                    if (initializeCard(card)) {
8209                        initializedCount++;
8210                    }
8211                });
8212                
8213                if (initializedCount > 0) {
8214                    console.log(`Sampa News: Inicializados ${initializedCount} cards de vídeo`);
8215                }
8216            } catch (error) {
8217                console.error('Erro ao inicializar cards de vídeo:', error);
8218            } finally {
8219                isInitializing = false;
8220            }
8221        };
8222        
8223        // Marcar como inicializado
8224        window.sampanewsVideoHandler = true;
8225        
8226        // Inicializar na primeira execução
8227        if (document.readyState === 'loading') {
8228            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCards);
8229        } else {
8230            window.sampanewsInitVideoCards();
8231        }
8232    } else {
8233        // Se já existe, apenas reinicializa novos cards
8234        if (typeof window.sampanewsInitVideoCards === 'function') {
8235            window.sampanewsInitVideoCards();
8236        }
8237    }
8238    
8239    // Observer otimizado com proteção anti-loop
8240    if (typeof window.sampanewsObserver === 'undefined') {
8241        
8242        window.sampanewsObserver = new MutationObserver(mutations => {
8243            // Evitar processamento durante inicialização
8244            if (isInitializing) return;
8245            
8246            // Debounce para evitar execuções excessivas
8247            clearTimeout(debounceTimeout);
8248            debounceTimeout = setTimeout(() => {
8249                try {
8250                    const relevantNodes = [];
8251                    
8252                    mutations.forEach(mutation => {
8253                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
8254                            Array.from(mutation.addedNodes).forEach(node => {
8255                                // Só processar nós elemento que podem conter ou ser cards de vídeo
8256                                if (node.nodeType === Node.ELEMENT_NODE &&
8257                                    (node.classList.contains('sampa-news-video-card') ||
8258                                     node.querySelector?.('.sampa-news-video-card') ||
8259                                     node.classList.contains('fragment') ||
8260                                     node.classList.contains('portlet'))) {
8261                                    relevantNodes.push(node);
8262                                }
8263                            });
8264                        }
8265                    });
8266                    
8267                    if (relevantNodes.length > 0) {
8268                        processRelevantNodes(relevantNodes);
8269                    }
8270                } catch (error) {
8271                    console.error('Erro no observer de vídeos:', error);
8272                }
8273            }, 150); // Debounce de 150ms
8274        });
8275        
8276        // Observer mais específico - só monitora containers relevantes
8277        const observeTargets = [
8278            document.querySelector('.sampa-news-container'),
8279            document.querySelector('#main-content'),
8280            document.querySelector('.portlet-boundary'),
8281            document.body // Fallback
8282        ].filter(Boolean);
8283        
8284        observeTargets.forEach(target => {
8285            window.sampanewsObserver.observe(target, {
8286                childList: true,
8287                subtree: true
8288            });
8289        });
8290        
8291        // Cleanup ao sair da página
8292        window.addEventListener('beforeunload', function() {
8293            if (window.sampanewsObserver) {
8294                window.sampanewsObserver.disconnect();
8295            }
8296            clearTimeout(debounceTimeout);
8297        });
8298    }
8299})();;</script>
8299
8300               </div>
8301              </div>
8302              <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
8303               <div class="lfr-layout-structure-item-v-deos-curtos lfr-layout-structure-item-056a5513-7246-f6cc-cfe7-94581b625498 " data-layout-structure-item-id="056a5513-7246-f6cc-cfe7-94581b625498">
8304                <div id="fragment-c28e1a95-6514-1192-ea01-245521c6236c">
8305                 <!-- HTML do Fragmento -->
8306                 <div class="sampa-news-video-card">
8307                  <picture data-fileentryid="55889845"><source media="(max-width:179px)" srcset="/o/adaptive-media/image/55889845/Thumbnail-300x300/Captura+de+tela+2026-07-31+120645.png?t=1785510431412"><source media="(max-width:485px) and (min-width:179px)" srcset="/o/adaptive-media/image/55889845/Preview-1000x0/Captura+de+tela+2026-07-31+120645.png?t=1785510431412"><img class="sampa-news-video-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/Captura+de+tela+2026-07-31+120645.png/ee8781e1-f477-14c1-4e14-b78f34de711d?version=1.0&amp;t=1785510431412" alt="EJA" data-fileentryid="55889845"></picture> <span class="sampa-news-video-duration" data-lfr-editable-id="video-duration" data-lfr-editable-type="text" style="display:none;"></span>
8308                  <div class="sampa-news-video-player-button">
8309                   <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
8310                    <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
8311                   </svg>
8312                  </div>
8313                  <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/shorts/MIN6rlZRrRo" style="display: none;" target="_self">https://www.youtube.com/shorts/MIN6rlZRrRo</a> <iframe class="sampa-news-video-iframe" src="" title="YouTube Shorts Player" frameborder="0" scrolling="no" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>
8314    </iframe>
8315                  <div class="sampa-news-video-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">EJA oferece ensino gratuito para quem deseja concluir o Ensino Fundamental ou o Ensino Médio</div>
8316                 </div>
8317                </div>
8318                
8318<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-c28e1a95-6514-1192-ea01-245521c6236c'); const fragmentElementId = 'fragment-c28e1a95-6514-1192-ea01-245521c6236c'; const fragmentEntryLinkNamespace = 'wayh'; const fragmentNamespace = 'wayh'; const layoutMode = 'view';(function() {
8319    // Usar uma única função global para evitar conflitos
8320    if (typeof window.sampanewsVideoHandler === 'undefined') {
8321        
8322        // Cache selectors and regex patterns
8323        const videoPatterns = {
8324            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
8325            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
8326            watch: /[?&]v=([a-zA-Z0-9_-]+)/
8327        };
8328
8329        // Flag para evitar processamento durante inicialização
8330        let isInitializing = false;
8331        let debounceTimeout = null;
8332
8333        // Função para reproduzir vídeos
8334        window.sampanewsPlayVideo = function(card) {
8335            try {
8336                const iframe = card.querySelector('.sampa-news-video-iframe');
8337                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
8338                const url = linkElement?.getAttribute('href') || '';
8339                
8340                if (!url || url === '#' || url === '') {
8341                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
8342                    return;
8343                }
8344                
8345                // Converter URL do YouTube para embed
8346                let embedUrl = url;
8347                let videoIdMatch = null;
8348                
8349                // More efficient URL parsing
8350                if (url.includes('youtube.com/embed/')) {
8351                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0`;
8352                } else {
8353                    for (const [type, pattern] of Object.entries(videoPatterns)) {
8354                        if ((type === 'shorts' && url.includes('youtube.com/shorts/')) ||
8355                            (type === 'youtuBe' && url.includes('youtu.be/')) ||
8356                            (type === 'watch' && url.includes('youtube.com/watch'))) {
8357                            videoIdMatch = url.match(pattern);
8358                            break;
8359                        }
8360                    }
8361                    
8362                    if (videoIdMatch?.[1]) {
8363                        embedUrl = `https://www.youtube.com/embed/${videoIdMatch[1]}?autoplay=1&mute=0`;
8364                    }
8365                }
8366                
8367                // Parar vídeo atual se existir
8368                const playingCard = document.querySelector('.sampa-news-video-card.sampa-news-playing');
8369                if (playingCard && playingCard !== card) {
8370                    playingCard.classList.remove('sampa-news-playing');
8371                    const playingIframe = playingCard.querySelector('.sampa-news-video-iframe');
8372                    if (playingIframe) {
8373                        playingIframe.src = '';
8374                    }
8375                }
8376                
8377                // Iniciar novo vídeo
8378                card.classList.add('sampa-news-playing');
8379                if (iframe) {
8380                    iframe.src = embedUrl;
8381                }
8382            } catch (error) {
8383                console.error('Erro ao reproduzir vídeo:', error);
8384            }
8385        };
8386
8387        // Optimized event handler
8388        const handleCardClick = (e) => {
8389            e.preventDefault();
8390            e.stopPropagation();
8391            window.sampanewsPlayVideo(e.currentTarget);
8392        };
8393        
8394        // Função para inicializar um único card
8395        const initializeCard = (card) => {
8396            if (!card.hasAttribute('data-sampa-initialized')) {
8397                card.addEventListener('click', handleCardClick);
8398                card.setAttribute('data-sampa-initialized', 'true');
8399                return true;
8400            }
8401            return false;
8402        };
8403        
8404        // Função otimizada para processar apenas nós relevantes
8405        const processRelevantNodes = (nodes) => {
8406            if (isInitializing) return;
8407            
8408            let processedCount = 0;
8409            
8410            nodes.forEach(node => {
8411                if (node.nodeType === Node.ELEMENT_NODE) {
8412                    let cardsToProcess = [];
8413                    
8414                    // Verificar se o próprio nó é um card
8415                    if (node.matches && node.matches('.sampa-news-video-card')) {
8416                        cardsToProcess.push(node);
8417                    }
8418                    
8419                    // Verificar se contém cards (só se for um container relevante)
8420                    if (node.querySelector && 
8421                        (node.classList.contains('fragment') || 
8422                         node.classList.contains('portlet') ||
8423                         node.classList.contains('sampa-news') ||
8424                         node.querySelectorAll('.sampa-news-video-card').length > 0)) {
8425                        
8426                        const childCards = node.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
8427                        cardsToProcess.push(...childCards);
8428                    }
8429                    
8430                    // Inicializar cards encontrados
8431                    cardsToProcess.forEach(card => {
8432                        if (initializeCard(card)) {
8433                            processedCount++;
8434                        }
8435                    });
8436                }
8437            });
8438            
8439            if (processedCount > 0) {
8440                console.log(`Sampa News: Inicializados ${processedCount} novos cards de vídeo`);
8441            }
8442        };
8443        
8444        // Função para inicializar event listeners
8445        window.sampanewsInitVideoCards = function() {
8446            if (isInitializing) return;
8447            isInitializing = true;
8448            
8449            try {
8450                let initializedCount = 0;
8451                const cards = document.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
8452                
8453                cards.forEach(card => {
8454                    if (initializeCard(card)) {
8455                        initializedCount++;
8456                    }
8457                });
8458                
8459                if (initializedCount > 0) {
8460                    console.log(`Sampa News: Inicializados ${initializedCount} cards de vídeo`);
8461                }
8462            } catch (error) {
8463                console.error('Erro ao inicializar cards de vídeo:', error);
8464            } finally {
8465                isInitializing = false;
8466            }
8467        };
8468        
8469        // Marcar como inicializado
8470        window.sampanewsVideoHandler = true;
8471        
8472        // Inicializar na primeira execução
8473        if (document.readyState === 'loading') {
8474            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCards);
8475        } else {
8476            window.sampanewsInitVideoCards();
8477        }
8478    } else {
8479        // Se já existe, apenas reinicializa novos cards
8480        if (typeof window.sampanewsInitVideoCards === 'function') {
8481            window.sampanewsInitVideoCards();
8482        }
8483    }
8484    
8485    // Observer otimizado com proteção anti-loop
8486    if (typeof window.sampanewsObserver === 'undefined') {
8487        
8488        window.sampanewsObserver = new MutationObserver(mutations => {
8489            // Evitar processamento durante inicialização
8490            if (isInitializing) return;
8491            
8492            // Debounce para evitar execuções excessivas
8493            clearTimeout(debounceTimeout);
8494            debounceTimeout = setTimeout(() => {
8495                try {
8496                    const relevantNodes = [];
8497                    
8498                    mutations.forEach(mutation => {
8499                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
8500                            Array.from(mutation.addedNodes).forEach(node => {
8501                                // Só processar nós elemento que podem conter ou ser cards de vídeo
8502                                if (node.nodeType === Node.ELEMENT_NODE &&
8503                                    (node.classList.contains('sampa-news-video-card') ||
8504                                     node.querySelector?.('.sampa-news-video-card') ||
8505                                     node.classList.contains('fragment') ||
8506                                     node.classList.contains('portlet'))) {
8507                                    relevantNodes.push(node);
8508                                }
8509                            });
8510                        }
8511                    });
8512                    
8513                    if (relevantNodes.length > 0) {
8514                        processRelevantNodes(relevantNodes);
8515                    }
8516                } catch (error) {
8517                    console.error('Erro no observer de vídeos:', error);
8518                }
8519            }, 150); // Debounce de 150ms
8520        });
8521        
8522        // Observer mais específico - só monitora containers relevantes
8523        const observeTargets = [
8524            document.querySelector('.sampa-news-container'),
8525            document.querySelector('#main-content'),
8526            document.querySelector('.portlet-boundary'),
8527            document.body // Fallback
8528        ].filter(Boolean);
8529        
8530        observeTargets.forEach(target => {
8531            window.sampanewsObserver.observe(target, {
8532                childList: true,
8533                subtree: true
8534            });
8535        });
8536        
8537        // Cleanup ao sair da página
8538        window.addEventListener('beforeunload', function() {
8539            if (window.sampanewsObserver) {
8540                window.sampanewsObserver.disconnect();
8541            }
8542            clearTimeout(debounceTimeout);
8543        });
8544    }
8545})();;</script>
8545
8546               </div>
8547              </div>
8548              <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
8549               <div class="lfr-layout-structure-item-v-deos-curtos lfr-layout-structure-item-056a5513-7246-f6cc-cfe7-94581b625498 " data-layout-structure-item-id="056a5513-7246-f6cc-cfe7-94581b625498">
8550                <div id="fragment-bba5f58d-db3f-a4cd-3b34-85ddbe85a7e5">
8551                 <!-- HTML do Fragmento -->
8552                 <div class="sampa-news-video-card">
8553                  <picture data-fileentryid="52967900"><source media="(max-width:242px)" srcset="/o/adaptive-media/image/52967900/Thumbnail-300x300/SaveClip.App_741757184_18320391655302625_3201352028729230421_n.jpg?t=1784211139508"><source media="(max-width:411px) and (min-width:242px)" srcset="/o/adaptive-media/image/52967900/Preview-1000x0/SaveClip.App_741757184_18320391655302625_3201352028729230421_n.jpg?t=1784211139508"><img class="sampa-news-video-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/SaveClip.App_741757184_18320391655302625_3201352028729230421_n.jpg/1905d5cd-8008-a7c8-6360-f700a2bec329?version=1.0&amp;t=1784211139508" alt="Paulistinha" data-fileentryid="52967900"></picture> <span class="sampa-news-video-duration" data-lfr-editable-id="video-duration" data-lfr-editable-type="text" style="display:none;"></span>
8554                  <div class="sampa-news-video-player-button">
8555                   <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
8556                    <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
8557                   </svg>
8558                  </div>
8559                  <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.instagram.com/p/DalHMs0lnE1/?img_index=1" style="display: none;" target="_self">https://www.instagram.com/p/DalHMs0lnE1/?img_index=1</a> <iframe class="sampa-news-video-iframe" src="" title="YouTube Shorts Player" frameborder="0" scrolling="no" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>
8560    </iframe>
8561                  <div class="sampa-news-video-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">São Paulo virou cenário de uma nova aventura com a Turma da Mônica</div>
8562                 </div>
8563                </div>
8564                
8564<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-bba5f58d-db3f-a4cd-3b34-85ddbe85a7e5'); const fragmentElementId = 'fragment-bba5f58d-db3f-a4cd-3b34-85ddbe85a7e5'; const fragmentEntryLinkNamespace = 'wayh'; const fragmentNamespace = 'wayh'; const layoutMode = 'view';(function() {
8565    // Usar uma única função global para evitar conflitos
8566    if (typeof window.sampanewsVideoHandler === 'undefined') {
8567        
8568        // Cache selectors and regex patterns
8569        const videoPatterns = {
8570            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
8571            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
8572            watch: /[?&]v=([a-zA-Z0-9_-]+)/
8573        };
8574
8575        // Flag para evitar processamento durante inicialização
8576        let isInitializing = false;
8577        let debounceTimeout = null;
8578
8579        // Função para reproduzir vídeos
8580        window.sampanewsPlayVideo = function(card) {
8581            try {
8582                const iframe = card.querySelector('.sampa-news-video-iframe');
8583                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
8584                const url = linkElement?.getAttribute('href') || '';
8585                
8586                if (!url || url === '#' || url === '') {
8587                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
8588                    return;
8589                }
8590                
8591                // Converter URL do YouTube para embed
8592                let embedUrl = url;
8593                let videoIdMatch = null;
8594                
8595                // More efficient URL parsing
8596                if (url.includes('youtube.com/embed/')) {
8597                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0`;
8598                } else {
8599                    for (const [type, pattern] of Object.entries(videoPatterns)) {
8600                        if ((type === 'shorts' && url.includes('youtube.com/shorts/')) ||
8601                            (type === 'youtuBe' && url.includes('youtu.be/')) ||
8602                            (type === 'watch' && url.includes('youtube.com/watch'))) {
8603                            videoIdMatch = url.match(pattern);
8604                            break;
8605                        }
8606                    }
8607                    
8608                    if (videoIdMatch?.[1]) {
8609                        embedUrl = `https://www.youtube.com/embed/${videoIdMatch[1]}?autoplay=1&mute=0`;
8610                    }
8611                }
8612                
8613                // Parar vídeo atual se existir
8614                const playingCard = document.querySelector('.sampa-news-video-card.sampa-news-playing');
8615                if (playingCard && playingCard !== card) {
8616                    playingCard.classList.remove('sampa-news-playing');
8617                    const playingIframe = playingCard.querySelector('.sampa-news-video-iframe');
8618                    if (playingIframe) {
8619                        playingIframe.src = '';
8620                    }
8621                }
8622                
8623                // Iniciar novo vídeo
8624                card.classList.add('sampa-news-playing');
8625                if (iframe) {
8626                    iframe.src = embedUrl;
8627                }
8628            } catch (error) {
8629                console.error('Erro ao reproduzir vídeo:', error);
8630            }
8631        };
8632
8633        // Optimized event handler
8634        const handleCardClick = (e) => {
8635            e.preventDefault();
8636            e.stopPropagation();
8637            window.sampanewsPlayVideo(e.currentTarget);
8638        };
8639        
8640        // Função para inicializar um único card
8641        const initializeCard = (card) => {
8642            if (!card.hasAttribute('data-sampa-initialized')) {
8643                card.addEventListener('click', handleCardClick);
8644                card.setAttribute('data-sampa-initialized', 'true');
8645                return true;
8646            }
8647            return false;
8648        };
8649        
8650        // Função otimizada para processar apenas nós relevantes
8651        const processRelevantNodes = (nodes) => {
8652            if (isInitializing) return;
8653            
8654            let processedCount = 0;
8655            
8656            nodes.forEach(node => {
8657                if (node.nodeType === Node.ELEMENT_NODE) {
8658                    let cardsToProcess = [];
8659                    
8660                    // Verificar se o próprio nó é um card
8661                    if (node.matches && node.matches('.sampa-news-video-card')) {
8662                        cardsToProcess.push(node);
8663                    }
8664                    
8665                    // Verificar se contém cards (só se for um container relevante)
8666                    if (node.querySelector && 
8667                        (node.classList.contains('fragment') || 
8668                         node.classList.contains('portlet') ||
8669                         node.classList.contains('sampa-news') ||
8670                         node.querySelectorAll('.sampa-news-video-card').length > 0)) {
8671                        
8672                        const childCards = node.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
8673                        cardsToProcess.push(...childCards);
8674                    }
8675                    
8676                    // Inicializar cards encontrados
8677                    cardsToProcess.forEach(card => {
8678                        if (initializeCard(card)) {
8679                            processedCount++;
8680                        }
8681                    });
8682                }
8683            });
8684            
8685            if (processedCount > 0) {
8686                console.log(`Sampa News: Inicializados ${processedCount} novos cards de vídeo`);
8687            }
8688        };
8689        
8690        // Função para inicializar event listeners
8691        window.sampanewsInitVideoCards = function() {
8692            if (isInitializing) return;
8693            isInitializing = true;
8694            
8695            try {
8696                let initializedCount = 0;
8697                const cards = document.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
8698                
8699                cards.forEach(card => {
8700                    if (initializeCard(card)) {
8701                        initializedCount++;
8702                    }
8703                });
8704                
8705                if (initializedCount > 0) {
8706                    console.log(`Sampa News: Inicializados ${initializedCount} cards de vídeo`);
8707                }
8708            } catch (error) {
8709                console.error('Erro ao inicializar cards de vídeo:', error);
8710            } finally {
8711                isInitializing = false;
8712            }
8713        };
8714        
8715        // Marcar como inicializado
8716        window.sampanewsVideoHandler = true;
8717        
8718        // Inicializar na primeira execução
8719        if (document.readyState === 'loading') {
8720            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCards);
8721        } else {
8722            window.sampanewsInitVideoCards();
8723        }
8724    } else {
8725        // Se já existe, apenas reinicializa novos cards
8726        if (typeof window.sampanewsInitVideoCards === 'function') {
8727            window.sampanewsInitVideoCards();
8728        }
8729    }
8730    
8731    // Observer otimizado com proteção anti-loop
8732    if (typeof window.sampanewsObserver === 'undefined') {
8733        
8734        window.sampanewsObserver = new MutationObserver(mutations => {
8735            // Evitar processamento durante inicialização
8736            if (isInitializing) return;
8737            
8738            // Debounce para evitar execuções excessivas
8739            clearTimeout(debounceTimeout);
8740            debounceTimeout = setTimeout(() => {
8741                try {
8742                    const relevantNodes = [];
8743                    
8744                    mutations.forEach(mutation => {
8745                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
8746                            Array.from(mutation.addedNodes).forEach(node => {
8747                                // Só processar nós elemento que podem conter ou ser cards de vídeo
8748                                if (node.nodeType === Node.ELEMENT_NODE &&
8749                                    (node.classList.contains('sampa-news-video-card') ||
8750                                     node.querySelector?.('.sampa-news-video-card') ||
8751                                     node.classList.contains('fragment') ||
8752                                     node.classList.contains('portlet'))) {
8753                                    relevantNodes.push(node);
8754                                }
8755                            });
8756                        }
8757                    });
8758                    
8759                    if (relevantNodes.length > 0) {
8760                        processRelevantNodes(relevantNodes);
8761                    }
8762                } catch (error) {
8763                    console.error('Erro no observer de vídeos:', error);
8764                }
8765            }, 150); // Debounce de 150ms
8766        });
8767        
8768        // Observer mais específico - só monitora containers relevantes
8769        const observeTargets = [
8770            document.querySelector('.sampa-news-container'),
8771            document.querySelector('#main-content'),
8772            document.querySelector('.portlet-boundary'),
8773            document.body // Fallback
8774        ].filter(Boolean);
8775        
8776        observeTargets.forEach(target => {
8777            window.sampanewsObserver.observe(target, {
8778                childList: true,
8779                subtree: true
8780            });
8781        });
8782        
8783        // Cleanup ao sair da página
8784        window.addEventListener('beforeunload', function() {
8785            if (window.sampanewsObserver) {
8786                window.sampanewsObserver.disconnect();
8787            }
8788            clearTimeout(debounceTimeout);
8789        });
8790    }
8791})();;</script>
8791
8792               </div>
8793              </div>
8794              <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
8795               <div class="lfr-layout-structure-item-v-deos-curtos lfr-layout-structure-item-056a5513-7246-f6cc-cfe7-94581b625498 " data-layout-structure-item-id="056a5513-7246-f6cc-cfe7-94581b625498">
8796                <div id="fragment-ef59f704-e125-a70d-dda5-bb5ce17d4d8e">
8797                 <!-- HTML do Fragmento -->
8798                 <div class="sampa-news-video-card">
8799                  <picture data-fileentryid="52966084"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/52966084/Thumbnail-300x300/20260706_inauguracao_UBS_Fatima_da_Silva_Cidade_Dutra_SB-01.jpg?t=1784210155673"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/52966084/Preview-1000x0/20260706_inauguracao_UBS_Fatima_da_Silva_Cidade_Dutra_SB-01.jpg?t=1784210155673"><img class="sampa-news-video-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/20260706_inauguracao_UBS_Fatima_da_Silva_Cidade_Dutra_SB-01.jpg/87d4ef20-cd46-fec6-f742-4306de619669?version=1.0&amp;t=1784210155673" alt="UBS Cidade Dutra" data-fileentryid="52966084"></picture> <span class="sampa-news-video-duration" data-lfr-editable-id="video-duration" data-lfr-editable-type="text" style="display:none;"></span>
8800                  <div class="sampa-news-video-player-button">
8801                   <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
8802                    <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
8803                   </svg>
8804                  </div>
8805                  <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/shorts/T7AUR7vUVkw" style="display: none;" target="_self">https://www.youtube.com/shorts/T7AUR7vUVkw</a> <iframe class="sampa-news-video-iframe" src="" title="YouTube Shorts Player" frameborder="0" scrolling="no" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>
8806    </iframe>
8807                  <div class="sampa-news-video-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Mais saúde, mais cuidado e mais acesso para a população da Zona Sul</div>
8808                 </div>
8809                </div>
8810                
8810<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-ef59f704-e125-a70d-dda5-bb5ce17d4d8e'); const fragmentElementId = 'fragment-ef59f704-e125-a70d-dda5-bb5ce17d4d8e'; const fragmentEntryLinkNamespace = 'wayh'; const fragmentNamespace = 'wayh'; const layoutMode = 'view';(function() {
8811    // Usar uma única função global para evitar conflitos
8812    if (typeof window.sampanewsVideoHandler === 'undefined') {
8813        
8814        // Cache selectors and regex patterns
8815        const videoPatterns = {
8816            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
8817            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
8818            watch: /[?&]v=([a-zA-Z0-9_-]+)/
8819        };
8820
8821        // Flag para evitar processamento durante inicialização
8822        let isInitializing = false;
8823        let debounceTimeout = null;
8824
8825        // Função para reproduzir vídeos
8826        window.sampanewsPlayVideo = function(card) {
8827            try {
8828                const iframe = card.querySelector('.sampa-news-video-iframe');
8829                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
8830                const url = linkElement?.getAttribute('href') || '';
8831                
8832                if (!url || url === '#' || url === '') {
8833                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
8834                    return;
8835                }
8836                
8837                // Converter URL do YouTube para embed
8838                let embedUrl = url;
8839                let videoIdMatch = null;
8840                
8841                // More efficient URL parsing
8842                if (url.includes('youtube.com/embed/')) {
8843                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0`;
8844                } else {
8845                    for (const [type, pattern] of Object.entries(videoPatterns)) {
8846                        if ((type === 'shorts' && url.includes('youtube.com/shorts/')) ||
8847                            (type === 'youtuBe' && url.includes('youtu.be/')) ||
8848                            (type === 'watch' && url.includes('youtube.com/watch'))) {
8849                            videoIdMatch = url.match(pattern);
8850                            break;
8851                        }
8852                    }
8853                    
8854                    if (videoIdMatch?.[1]) {
8855                        embedUrl = `https://www.youtube.com/embed/${videoIdMatch[1]}?autoplay=1&mute=0`;
8856                    }
8857                }
8858                
8859                // Parar vídeo atual se existir
8860                const playingCard = document.querySelector('.sampa-news-video-card.sampa-news-playing');
8861                if (playingCard && playingCard !== card) {
8862                    playingCard.classList.remove('sampa-news-playing');
8863                    const playingIframe = playingCard.querySelector('.sampa-news-video-iframe');
8864                    if (playingIframe) {
8865                        playingIframe.src = '';
8866                    }
8867                }
8868                
8869                // Iniciar novo vídeo
8870                card.classList.add('sampa-news-playing');
8871                if (iframe) {
8872                    iframe.src = embedUrl;
8873                }
8874            } catch (error) {
8875                console.error('Erro ao reproduzir vídeo:', error);
8876            }
8877        };
8878
8879        // Optimized event handler
8880        const handleCardClick = (e) => {
8881            e.preventDefault();
8882            e.stopPropagation();
8883            window.sampanewsPlayVideo(e.currentTarget);
8884        };
8885        
8886        // Função para inicializar um único card
8887        const initializeCard = (card) => {
8888            if (!card.hasAttribute('data-sampa-initialized')) {
8889                card.addEventListener('click', handleCardClick);
8890                card.setAttribute('data-sampa-initialized', 'true');
8891                return true;
8892            }
8893            return false;
8894        };
8895        
8896        // Função otimizada para processar apenas nós relevantes
8897        const processRelevantNodes = (nodes) => {
8898            if (isInitializing) return;
8899            
8900            let processedCount = 0;
8901            
8902            nodes.forEach(node => {
8903                if (node.nodeType === Node.ELEMENT_NODE) {
8904                    let cardsToProcess = [];
8905                    
8906                    // Verificar se o próprio nó é um card
8907                    if (node.matches && node.matches('.sampa-news-video-card')) {
8908                        cardsToProcess.push(node);
8909                    }
8910                    
8911                    // Verificar se contém cards (só se for um container relevante)
8912                    if (node.querySelector && 
8913                        (node.classList.contains('fragment') || 
8914                         node.classList.contains('portlet') ||
8915                         node.classList.contains('sampa-news') ||
8916                         node.querySelectorAll('.sampa-news-video-card').length > 0)) {
8917                        
8918                        const childCards = node.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
8919                        cardsToProcess.push(...childCards);
8920                    }
8921                    
8922                    // Inicializar cards encontrados
8923                    cardsToProcess.forEach(card => {
8924                        if (initializeCard(card)) {
8925                            processedCount++;
8926                        }
8927                    });
8928                }
8929            });
8930            
8931            if (processedCount > 0) {
8932                console.log(`Sampa News: Inicializados ${processedCount} novos cards de vídeo`);
8933            }
8934        };
8935        
8936        // Função para inicializar event listeners
8937        window.sampanewsInitVideoCards = function() {
8938            if (isInitializing) return;
8939            isInitializing = true;
8940            
8941            try {
8942                let initializedCount = 0;
8943                const cards = document.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
8944                
8945                cards.forEach(card => {
8946                    if (initializeCard(card)) {
8947                        initializedCount++;
8948                    }
8949                });
8950                
8951                if (initializedCount > 0) {
8952                    console.log(`Sampa News: Inicializados ${initializedCount} cards de vídeo`);
8953                }
8954            } catch (error) {
8955                console.error('Erro ao inicializar cards de vídeo:', error);
8956            } finally {
8957                isInitializing = false;
8958            }
8959        };
8960        
8961        // Marcar como inicializado
8962        window.sampanewsVideoHandler = true;
8963        
8964        // Inicializar na primeira execução
8965        if (document.readyState === 'loading') {
8966            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCards);
8967        } else {
8968            window.sampanewsInitVideoCards();
8969        }
8970    } else {
8971        // Se já existe, apenas reinicializa novos cards
8972        if (typeof window.sampanewsInitVideoCards === 'function') {
8973            window.sampanewsInitVideoCards();
8974        }
8975    }
8976    
8977    // Observer otimizado com proteção anti-loop
8978    if (typeof window.sampanewsObserver === 'undefined') {
8979        
8980        window.sampanewsObserver = new MutationObserver(mutations => {
8981            // Evitar processamento durante inicialização
8982            if (isInitializing) return;
8983            
8984            // Debounce para evitar execuções excessivas
8985            clearTimeout(debounceTimeout);
8986            debounceTimeout = setTimeout(() => {
8987                try {
8988                    const relevantNodes = [];
8989                    
8990                    mutations.forEach(mutation => {
8991                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
8992                            Array.from(mutation.addedNodes).forEach(node => {
8993                                // Só processar nós elemento que podem conter ou ser cards de vídeo
8994                                if (node.nodeType === Node.ELEMENT_NODE &&
8995                                    (node.classList.contains('sampa-news-video-card') ||
8996                                     node.querySelector?.('.sampa-news-video-card') ||
8997                                     node.classList.contains('fragment') ||
8998                                     node.classList.contains('portlet'))) {
8999                                    relevantNodes.push(node);
9000                                }
9001                            });
9002                        }
9003                    });
9004                    
9005                    if (relevantNodes.length > 0) {
9006                        processRelevantNodes(relevantNodes);
9007                    }
9008                } catch (error) {
9009                    console.error('Erro no observer de vídeos:', error);
9010                }
9011            }, 150); // Debounce de 150ms
9012        });
9013        
9014        // Observer mais específico - só monitora containers relevantes
9015        const observeTargets = [
9016            document.querySelector('.sampa-news-container'),
9017            document.querySelector('#main-content'),
9018            document.querySelector('.portlet-boundary'),
9019            document.body // Fallback
9020        ].filter(Boolean);
9021        
9022        observeTargets.forEach(target => {
9023            window.sampanewsObserver.observe(target, {
9024                childList: true,
9025                subtree: true
9026            });
9027        });
9028        
9029        // Cleanup ao sair da página
9030        window.addEventListener('beforeunload', function() {
9031            if (window.sampanewsObserver) {
9032                window.sampanewsObserver.disconnect();
9033            }
9034            clearTimeout(debounceTimeout);
9035        });
9036    }
9037})();;</script>
9037
9038               </div>
9039              </div>
9040              <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
9041               <div class="lfr-layout-structure-item-v-deos-curtos lfr-layout-structure-item-056a5513-7246-f6cc-cfe7-94581b625498 " data-layout-structure-item-id="056a5513-7246-f6cc-cfe7-94581b625498">
9042                <div id="fragment-96c53c6b-cc7d-c330-aa27-1c888b12dfab">
9043                 <!-- HTML do Fragmento -->
9044                 <div class="sampa-news-video-card">
9045                  <picture data-fileentryid="52964221"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/52964221/Thumbnail-300x300/20260707_entrega_296unidades_residencial_Mooca_RP-27.jpg?t=1784209902239"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/52964221/Preview-1000x0/20260707_entrega_296unidades_residencial_Mooca_RP-27.jpg?t=1784209902239"><img class="sampa-news-video-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/20260707_entrega_296unidades_residencial_Mooca_RP-27.jpg/7a7cb5f3-9168-7192-2c80-f4475a7b726d?version=1.0&amp;t=1784209902239" alt="Mooca" data-fileentryid="52964221"></picture> <span class="sampa-news-video-duration" data-lfr-editable-id="video-duration" data-lfr-editable-type="text" style="display:none;"></span>
9046                  <div class="sampa-news-video-player-button">
9047                   <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
9048                    <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
9049                   </svg>
9050                  </div>
9051                  <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/shorts/VoySNQixFFE" style="display: none;" target="_self">https://www.youtube.com/shorts/VoySNQixFFE</a> <iframe class="sampa-news-video-iframe" src="" title="YouTube Shorts Player" frameborder="0" scrolling="no" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>
9052    </iframe>
9053                  <div class="sampa-news-video-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">O sonho da casa própria acaba de ganhar um novo endereço na Mooca</div>
9054                 </div>
9055                </div>
9056                
9056<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-96c53c6b-cc7d-c330-aa27-1c888b12dfab'); const fragmentElementId = 'fragment-96c53c6b-cc7d-c330-aa27-1c888b12dfab'; const fragmentEntryLinkNamespace = 'wayh'; const fragmentNamespace = 'wayh'; const layoutMode = 'view';(function() {
9057    // Usar uma única função global para evitar conflitos
9058    if (typeof window.sampanewsVideoHandler === 'undefined') {
9059        
9060        // Cache selectors and regex patterns
9061        const videoPatterns = {
9062            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
9063            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
9064            watch: /[?&]v=([a-zA-Z0-9_-]+)/
9065        };
9066
9067        // Flag para evitar processamento durante inicialização
9068        let isInitializing = false;
9069        let debounceTimeout = null;
9070
9071        // Função para reproduzir vídeos
9072        window.sampanewsPlayVideo = function(card) {
9073            try {
9074                const iframe = card.querySelector('.sampa-news-video-iframe');
9075                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
9076                const url = linkElement?.getAttribute('href') || '';
9077                
9078                if (!url || url === '#' || url === '') {
9079                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
9080                    return;
9081                }
9082                
9083                // Converter URL do YouTube para embed
9084                let embedUrl = url;
9085                let videoIdMatch = null;
9086                
9087                // More efficient URL parsing
9088                if (url.includes('youtube.com/embed/')) {
9089                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0`;
9090                } else {
9091                    for (const [type, pattern] of Object.entries(videoPatterns)) {
9092                        if ((type === 'shorts' && url.includes('youtube.com/shorts/')) ||
9093                            (type === 'youtuBe' && url.includes('youtu.be/')) ||
9094                            (type === 'watch' && url.includes('youtube.com/watch'))) {
9095                            videoIdMatch = url.match(pattern);
9096                            break;
9097                        }
9098                    }
9099                    
9100                    if (videoIdMatch?.[1]) {
9101                        embedUrl = `https://www.youtube.com/embed/${videoIdMatch[1]}?autoplay=1&mute=0`;
9102                    }
9103                }
9104                
9105                // Parar vídeo atual se existir
9106                const playingCard = document.querySelector('.sampa-news-video-card.sampa-news-playing');
9107                if (playingCard && playingCard !== card) {
9108                    playingCard.classList.remove('sampa-news-playing');
9109                    const playingIframe = playingCard.querySelector('.sampa-news-video-iframe');
9110                    if (playingIframe) {
9111                        playingIframe.src = '';
9112                    }
9113                }
9114                
9115                // Iniciar novo vídeo
9116                card.classList.add('sampa-news-playing');
9117                if (iframe) {
9118                    iframe.src = embedUrl;
9119                }
9120            } catch (error) {
9121                console.error('Erro ao reproduzir vídeo:', error);
9122            }
9123        };
9124
9125        // Optimized event handler
9126        const handleCardClick = (e) => {
9127            e.preventDefault();
9128            e.stopPropagation();
9129            window.sampanewsPlayVideo(e.currentTarget);
9130        };
9131        
9132        // Função para inicializar um único card
9133        const initializeCard = (card) => {
9134            if (!card.hasAttribute('data-sampa-initialized')) {
9135                card.addEventListener('click', handleCardClick);
9136                card.setAttribute('data-sampa-initialized', 'true');
9137                return true;
9138            }
9139            return false;
9140        };
9141        
9142        // Função otimizada para processar apenas nós relevantes
9143        const processRelevantNodes = (nodes) => {
9144            if (isInitializing) return;
9145            
9146            let processedCount = 0;
9147            
9148            nodes.forEach(node => {
9149                if (node.nodeType === Node.ELEMENT_NODE) {
9150                    let cardsToProcess = [];
9151                    
9152                    // Verificar se o próprio nó é um card
9153                    if (node.matches && node.matches('.sampa-news-video-card')) {
9154                        cardsToProcess.push(node);
9155                    }
9156                    
9157                    // Verificar se contém cards (só se for um container relevante)
9158                    if (node.querySelector && 
9159                        (node.classList.contains('fragment') || 
9160                         node.classList.contains('portlet') ||
9161                         node.classList.contains('sampa-news') ||
9162                         node.querySelectorAll('.sampa-news-video-card').length > 0)) {
9163                        
9164                        const childCards = node.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
9165                        cardsToProcess.push(...childCards);
9166                    }
9167                    
9168                    // Inicializar cards encontrados
9169                    cardsToProcess.forEach(card => {
9170                        if (initializeCard(card)) {
9171                            processedCount++;
9172                        }
9173                    });
9174                }
9175            });
9176            
9177            if (processedCount > 0) {
9178                console.log(`Sampa News: Inicializados ${processedCount} novos cards de vídeo`);
9179            }
9180        };
9181        
9182        // Função para inicializar event listeners
9183        window.sampanewsInitVideoCards = function() {
9184            if (isInitializing) return;
9185            isInitializing = true;
9186            
9187            try {
9188                let initializedCount = 0;
9189                const cards = document.querySelectorAll('.sampa-news-video-card:not([data-sampa-initialized])');
9190                
9191                cards.forEach(card => {
9192                    if (initializeCard(card)) {
9193                        initializedCount++;
9194                    }
9195                });
9196                
9197                if (initializedCount > 0) {
9198                    console.log(`Sampa News: Inicializados ${initializedCount} cards de vídeo`);
9199                }
9200            } catch (error) {
9201                console.error('Erro ao inicializar cards de vídeo:', error);
9202            } finally {
9203                isInitializing = false;
9204            }
9205        };
9206        
9207        // Marcar como inicializado
9208        window.sampanewsVideoHandler = true;
9209        
9210        // Inicializar na primeira execução
9211        if (document.readyState === 'loading') {
9212            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCards);
9213        } else {
9214            window.sampanewsInitVideoCards();
9215        }
9216    } else {
9217        // Se já existe, apenas reinicializa novos cards
9218        if (typeof window.sampanewsInitVideoCards === 'function') {
9219            window.sampanewsInitVideoCards();
9220        }
9221    }
9222    
9223    // Observer otimizado com proteção anti-loop
9224    if (typeof window.sampanewsObserver === 'undefined') {
9225        
9226        window.sampanewsObserver = new MutationObserver(mutations => {
9227            // Evitar processamento durante inicialização
9228            if (isInitializing) return;
9229            
9230            // Debounce para evitar execuções excessivas
9231            clearTimeout(debounceTimeout);
9232            debounceTimeout = setTimeout(() => {
9233                try {
9234                    const relevantNodes = [];
9235                    
9236                    mutations.forEach(mutation => {
9237                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
9238                            Array.from(mutation.addedNodes).forEach(node => {
9239                                // Só processar nós elemento que podem conter ou ser cards de vídeo
9240                                if (node.nodeType === Node.ELEMENT_NODE &&
9241                                    (node.classList.contains('sampa-news-video-card') ||
9242                                     node.querySelector?.('.sampa-news-video-card') ||
9243                                     node.classList.contains('fragment') ||
9244                                     node.classList.contains('portlet'))) {
9245                                    relevantNodes.push(node);
9246                                }
9247                            });
9248                        }
9249                    });
9250                    
9251                    if (relevantNodes.length > 0) {
9252                        processRelevantNodes(relevantNodes);
9253                    }
9254                } catch (error) {
9255                    console.error('Erro no observer de vídeos:', error);
9256                }
9257            }, 150); // Debounce de 150ms
9258        });
9259        
9260        // Observer mais específico - só monitora containers relevantes
9261        const observeTargets = [
9262            document.querySelector('.sampa-news-container'),
9263            document.querySelector('#main-content'),
9264            document.querySelector('.portlet-boundary'),
9265            document.body // Fallback
9266        ].filter(Boolean);
9267        
9268        observeTargets.forEach(target => {
9269            window.sampanewsObserver.observe(target, {
9270                childList: true,
9271                subtree: true
9272            });
9273        });
9274        
9275        // Cleanup ao sair da página
9276        window.addEventListener('beforeunload', function() {
9277            if (window.sampanewsObserver) {
9278                window.sampanewsObserver.disconnect();
9279            }
9280            clearTimeout(debounceTimeout);
9281        });
9282    }
9283})();;</script>
9283
9284               </div>
9285              </div>
9286             </div>
9287            </div>
9288           </div>
9289          </div>
9290         </div>
9291        </div>
9292        <!-- Controle Próximo (Direita) -->
9293        <button class="sp-csvc-slider-control sp-csvc-slider-control--next sp-csvc-slider-control--side" onclick="moveCarousel(1)" aria-label="Próximo item" data-action="next"> 
9294         <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
9295          <path d="M9 18L15 12L9 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
9296         </svg> 
9297        </button>
9298       </div>
9299      </div>
9300     </div>
9301    </div>
9302    <style>.sp-csvc-psp-slide-crontol
9303  .lfr-layout-structure-item-collection
9304  > .container-fluid
9305  > .row {
9306  flex-wrap: nowrap;
9307  transition: transform 0.3s ease-in-out !important;
9308}
9309
9310.sp-csvc-psp-slide-crontol
9311  .lfr-layout-structure-item-collection
9312  > .container-fluid
9313  > .row
9314  > .col {
9315  flex: 0 0 calc(1 / 4 * 100%);
9316  max-width: calc(1 / 4 * 100%);
9317}
9318
9319/* Variáveis CSS para customização */
9320.sp-csvc-fragment-slider-container {
9321  --slider-text: #ffffff;
9322  --slider-icon: #000;
9323  --slider-accent: #ffd700;
9324  --control-bg: rgb(255, 255, 255);
9325  --control-hover-bg: rgb(233, 231, 231);
9326  --item-gap: 16px;
9327	--slider-padding: 0px 20px;
9328	--header-gap: 20px;
9329}
9330
9331/* Container principal */
9332.sp-csvc-fragment-slider-container {
9333  background-color: var(--slider-bg);
9334  color: var(--slider-text);
9335  padding: var(--slider-padding);
9336  position: relative;
9337  overflow: hidden;
9338}
9339
9340.sp-csvc-slider-container__wrapper {
9341  max-width: 1440px;
9342  margin: 0 auto;
9343  position: relative;
9344}
9345
9346/* Header com título e controles */
9347.sp-csvc-slider-container__header {
9348  display: flex;
9349  justify-content: space-between;
9350  align-items: center;
9351  margin-bottom: var(--header-gap);
9352  flex-wrap: wrap;
9353  gap: 20px;
9354}
9355
9356/* Dropzone do título */
9357.sp-csvc-slider-container__title-dropzone {
9358  flex: 1;
9359  min-width: 200px;
9360}
9361
9362.sp-csvc-dropzone-title {
9363  min-height: 40px;
9364}
9365
9366/* Título padrão */
9367.sp-csvc-default-title .sp-csvc-slider-title {
9368  margin: 0;
9369  font-size: clamp(1.5rem, 3vw, 2rem);
9370  font-weight: 700;
9371  display: flex;
9372  align-items: center;
9373  gap: 12px;
9374}
9375
9376.sp-csvc-default-title .sp-csvc-slider-title .sp-csvc-icon {
9377  font-size: 1.2em;
9378}
9379
9380/* Controles de navegação */
9381.sp-csvc-slider-container__controls {
9382  display: flex;
9383  gap: 8px;
9384}
9385
9386.sp-csvc-slider-control {
9387  width: 30px;
9388  height: 30px;
9389  border: 1px solid rgba(255, 255, 255, 0.3);
9390  background-color: var(--control-bg);
9391  color: var(--slider-icon);
9392  border-radius: 4px;
9393  cursor: pointer;
9394  display: flex;
9395  align-items: center;
9396  justify-content: center;
9397  transition: all 0.3s ease;
9398  padding: 0;
9399}
9400
9401.sp-csvc-slider-control:hover:not(:disabled) {
9402  background-color: var(--control-hover-bg);
9403  border-color: rgba(255, 255, 255, 0.5);
9404  transform: translateY(-1px);
9405}
9406
9407.sp-csvc-slider-control:disabled {
9408  opacity: 0.3;
9409  cursor: not-allowed;
9410}
9411
9412.sp-csvc-slider-control:focus-visible {
9413  outline: 2px solid var(--slider-accent);
9414  outline-offset: 2px;
9415}
9416
9417/* Área de conteúdo/slider */
9418.sp-csvc-slider-container__content {
9419  position: relative;
9420  width: 100%;
9421  display: flex;
9422  align-items: center;
9423}
9424
9425.sp-csvc-slider-viewport {
9426  width: 100%;
9427  overflow: hidden;
9428  position: relative;
9429}
9430
9431/* Dropzone da coleção */
9432.sp-csvc-dropzone-collection {
9433  min-height: 300px;
9434  position: relative;
9435}
9436
9437/* Placeholder do dropzone */
9438.sp-csvc-dropzone-placeholder {
9439  display: flex;
9440  align-items: center;
9441  justify-content: center;
9442  min-height: 300px;
9443  border: 2px dashed rgba(255, 255, 255, 0.3);
9444  border-radius: 8px;
9445  background-color: rgba(255, 255, 255, 0.05);
9446  color: rgba(255, 255, 255, 0.5);
9447  font-size: 1.125rem;
9448  text-align: center;
9449  padding: 40px;
9450}
9451
9452/* Quando houver conteúdo no dropzone */
9453.sp-csvc-dropzone-collection:not(:empty) .sp-csvc-dropzone-placeholder {
9454  display: none;
9455}
9456
9457/* FORÇA LAYOUT HORIZONTAL - Sobrescreve qualquer CSS de grid dos fragmentos filhos */
9458.sp-csvc-dropzone-collection > .collection-display-grid,
9459.sp-csvc-dropzone-collection > .row {
9460  display: flex !important;
9461  gap: var(--item-gap);
9462  transition: transform 0.5s ease;
9463  flex-wrap: nowrap !important;
9464  width: 100%;
9465}
9466
9467/* Força todos os elementos filhos a seguirem o layout flex */
9468.sp-csvc-dropzone-collection .collection-display-grid > *,
9469.sp-csvc-dropzone-collection .row > * {
9470  flex: 0 0 auto !important;
9471  width: calc((100% - (var(--item-gap) * 5)) / 6) !important;
9472  min-width: 150px;
9473  display: block !important; /* Remove qualquer display: grid dos filhos */
9474}
9475
9476/* Sobrescreve especificamente o CSS de grid dos vídeos-curtos */
9477.sp-csvc-dropzone-collection .sampa-news-videos-grid,
9478.sp-csvc-dropzone-collection .sampa-news-videos-grid > * {
9479  display: flex !important;
9480  grid-template-columns: none !important;
9481}
9482
9483/* Responsividade - mantém 6 itens mas ajusta tamanhos mínimos */
9484@media (max-width: 1200px) {
9485  .sp-csvc-dropzone-collection .collection-display-grid > *,
9486  .sp-csvc-dropzone-collection .row > * {
9487    min-width: 140px;
9488  }
9489}
9490
9491@media (max-width: 992px) {
9492  .sp-csvc-fragment-slider-container {
9493    --item-gap: 12px;
9494  }
9495
9496  .sp-csvc-psp-slide-crontol
9497    .lfr-layout-structure-item-collection
9498    > .container-fluid
9499    > .row
9500    > .col {
9501    flex: 0 0 calc(1 / 3 * 100%);
9502    max-width: calc(1 / 3 * 100%);
9503  }
9504
9505  .sp-csvc-dropzone-collection .collection-display-grid > *,
9506  .sp-csvc-dropzone-collection .row > * {
9507    min-width: 120px;
9508  }
9509}
9510
9511@media (max-width: 768px) {
9512  .sp-csvc-fragment-slider-container {
9513    --slider-padding: 20px;
9514    --item-gap: 10px;
9515  }
9516
9517  .sp-csvc-psp-slide-crontol
9518    .lfr-layout-structure-item-collection
9519    > .container-fluid
9520    > .row
9521    > .col {
9522    flex: 0 0 calc(1 / 3 * 100%);
9523    max-width: calc(1 / 3 * 100%);
9524  }
9525
9526  .sp-csvc-slider-container__header {
9527    flex-direction: column;
9528    align-items: flex-start;
9529  }
9530
9531  .sp-csvc-slider-container__controls {
9532    align-self: flex-end;
9533    margin-top: -40px;
9534  }
9535
9536  .sp-csvc-dropzone-collection .collection-display-grid > *,
9537  .sp-csvc-dropzone-collection .row > * {
9538    min-width: 100px;
9539  }
9540}
9541
9542@media (max-width: 600px) {
9543  /* Em telas muito pequenas, permite scroll horizontal */
9544  .sp-csvc-slider-viewport {
9545    overflow-x: auto;
9546    -webkit-overflow-scrolling: touch;
9547  }
9548
9549  .sp-csvc-psp-slide-crontol
9550    .lfr-layout-structure-item-collection
9551    > .container-fluid
9552    > .row
9553    > .col {
9554    flex: 0 0 calc(1 / 1 * 100%);
9555    max-width: calc(1 / 1 * 100%);
9556  }
9557
9558  .sp-csvc-dropzone-collection .collection-display-grid > *,
9559  .sp-csvc-dropzone-collection .row > * {
9560    min-width: 90px;
9561  }
9562}
9563
9564/* Modo claro */
9565@media (prefers-color-scheme: light) {
9566  .sp-csvc-fragment-slider-container.sp-csvc-light-mode {
9567    --slider-bg: #f5f5f5;
9568    --slider-text: #1a1a1a;
9569    --control-bg: rgba(0, 0, 0, 0.05);
9570    --control-hover-bg: rgba(0, 0, 0, 0.1);
9571  }
9572
9573  .sp-csvc-fragment-slider-container.sp-csvc-light-mode
9574    .sp-csvc-slider-control {
9575    border-color: rgba(0, 0, 0, 0.2);
9576  }
9577
9578  .sp-csvc-fragment-slider-container.sp-csvc-light-mode
9579    .sp-csvc-dropzone-placeholder {
9580    border-color: rgba(0, 0, 0, 0.2);
9581    background-color: rgba(0, 0, 0, 0.02);
9582    color: rgba(0, 0, 0, 0.5);
9583  }
9584}
9585
9586/* Estados do dropzone no editor */
9587.page-editor-layout-drop-zone-active .sp-csvc-dropzone-title,
9588.page-editor-layout-drop-zone-active .sp-csvc-dropzone-collection {
9589  background-color: rgba(255, 215, 0, 0.1);
9590  border: 2px dashed var(--slider-accent);
9591  min-height: 60px;
9592}
9593
9594/* Ajuste para hover nos controles laterais */
9595.sp-csvc-slider-control--side:hover:not(:disabled) {
9596  background-color: var(--control-hover-bg);
9597  border-color: rgba(255, 255, 255, 0.5);
9598  transform: translateY(-50%) scale(1.05);
9599}
9600
9601/* Ajustes responsivos para controles laterais */
9602@media (max-width: 768px) {
9603  .sp-csvc-dropzone-collection .collection-display-grid > *,
9604  .sp-csvc-dropzone-collection .row > * {
9605    min-width: 140px;
9606  }
9607}
9608
9609@media (max-width: 992px) {
9610  .sp-csvc-fragment-slider-container {
9611    --item-gap: 12px;
9612  }
9613
9614  .sp-csvc-psp-slide-crontol
9615    .lfr-layout-structure-item-collection
9616    > .container-fluid
9617    > .row
9618    > .col {
9619    flex: 0 0 calc(1 / 3 * 100%);
9620    max-width: calc(1 / 3 * 100%);
9621  }
9622
9623  .sp-csvc-dropzone-collection .collection-display-grid > *,
9624  .sp-csvc-dropzone-collection .row > * {
9625    min-width: 120px;
9626  }
9627}
9628
9629@media (max-width: 768px) {
9630  .sp-csvc-fragment-slider-container {
9631    --slider-padding: 20px;
9632    --item-gap: 10px;
9633  }
9634
9635  .sp-csvc-psp-slide-crontol
9636    .lfr-layout-structure-item-collection
9637    > .container-fluid
9638    > .row
9639    > .col {
9640    flex: 0 0 calc(1 / 3 * 100%);
9641    max-width: calc(1 / 3 * 100%);
9642  }
9643
9644  .sp-csvc-slider-container__header {
9645    flex-direction: column;
9646    align-items: flex-start;
9647  }
9648
9649  .sp-csvc-slider-container__controls {
9650    align-self: flex-end;
9651    margin-top: -40px;
9652  }
9653
9654  .sp-csvc-dropzone-collection .collection-display-grid > *,
9655  .sp-csvc-dropzone-collection .row > * {
9656    min-width: 100px;
9657  }
9658}
9659
9660@media (max-width: 600px) {
9661  /* Em telas muito pequenas, permite scroll horizontal */
9662  .sp-csvc-slider-viewport {
9663    overflow-x: auto;
9664    -webkit-overflow-scrolling: touch;
9665  }
9666
9667  .sp-csvc-psp-slide-crontol
9668    .lfr-layout-structure-item-collection
9669    > .container-fluid
9670    > .row
9671    > .col {
9672    flex: 0 0 calc(1 / 1 * 100%);
9673    max-width: calc(1 / 1 * 100%);
9674  }
9675
9676  .sp-csvc-dropzone-collection .collection-display-grid > *,
9677  .sp-csvc-dropzone-collection .row > * {
9678    min-width: 90px;
9679  }
9680}
9681
9682/* Modo claro */
9683@media (prefers-color-scheme: light) {
9684  .sp-csvc-fragment-slider-container.sp-csvc-light-mode {
9685    --slider-bg: #f5f5f5;
9686    --slider-text: #1a1a1a;
9687    --control-bg: rgba(0, 0, 0, 0.05);
9688    --control-hover-bg: rgba(0, 0, 0, 0.1);
9689  }
9690
9691  .sp-csvc-fragment-slider-container.sp-csvc-light-mode
9692    .sp-csvc-slider-control {
9693    border-color: rgba(0, 0, 0, 0.2);
9694  }
9695
9696  .sp-csvc-fragment-slider-container.sp-csvc-light-mode
9697    .sp-csvc-dropzone-placeholder {
9698    border-color: rgba(0, 0, 0, 0.2);
9699    background-color: rgba(0, 0, 0, 0.02);
9700    color: rgba(0, 0, 0, 0.5);
9701  }
9702}
9703
9704/* Estados do dropzone no editor */
9705.page-editor-layout-drop-zone-active .sp-csvc-dropzone-title,
9706.page-editor-layout-drop-zone-active .sp-csvc-dropzone-collection {
9707  background-color: rgba(255, 215, 0, 0.1);
9708  border: 2px dashed var(--slider-accent);
9709  min-height: 60px;
9710}
9711
9712/* Animação suave */
9713@media (prefers-reduced-motion: no-preference) {
9714  .sp-csvc-slider-control {
9715    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
9716  }
9717
9718  .sp-csvc-dropzone-collection > .collection-display-grid,
9719  .sp-csvc-dropzone-collection > .row {
9720    transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
9721  }
9722}
9723
9724/* Área de conteúdo/slider */
9725.sp-csvc-slider-container__content {
9726  position: relative;
9727  width: 100%;
9728  display: flex;
9729  align-items: center;
9730}
9731
9732.sp-csvc-slider-viewport {
9733  width: 100%;
9734  overflow: hidden;
9735  position: relative;
9736}
9737
9738/* Dropzone da coleção */
9739.sp-csvc-dropzone-collection {
9740  min-height: 300px;
9741  position: relative;
9742}
9743
9744/* Placeholder do dropzone */
9745.sp-csvc-dropzone-placeholder {
9746  display: flex;
9747  align-items: center;
9748  justify-content: center;
9749  min-height: 300px;
9750  border: 2px dashed rgba(255, 255, 255, 0.3);
9751  border-radius: 8px;
9752  background-color: rgba(255, 255, 255, 0.05);
9753  color: rgba(255, 255, 255, 0.5);
9754  font-size: 1.125rem;
9755  text-align: center;
9756  padding: 40px;
9757}
9758
9759/* Quando houver conteúdo no dropzone */
9760.sp-csvc-dropzone-collection:not(:empty) .sp-csvc-dropzone-placeholder {
9761  display: none;
9762}
9763
9764/* FORÇA LAYOUT HORIZONTAL - Sobrescreve qualquer CSS de grid dos fragmentos filhos */
9765.sp-csvc-dropzone-collection > .collection-display-grid,
9766.sp-csvc-dropzone-collection > .row {
9767  display: flex !important;
9768  gap: var(--item-gap);
9769  transition: transform 0.5s ease;
9770  flex-wrap: nowrap !important;
9771  width: 100%;
9772}
9773
9774/* Força todos os elementos filhos a seguirem o layout flex */
9775.sp-csvc-dropzone-collection .collection-display-grid > *,
9776.sp-csvc-dropzone-collection .row > * {
9777  flex: 0 0 auto !important;
9778  width: calc((100% - (var(--item-gap) * 5)) / 6) !important;
9779  min-width: 150px;
9780  display: block !important; /* Remove qualquer display: grid dos filhos */
9781}
9782
9783/* Sobrescreve especificamente o CSS de grid dos vídeos-curtos */
9784.sp-csvc-dropzone-collection .sampa-news-videos-grid,
9785.sp-csvc-dropzone-collection .sampa-news-videos-grid > * {
9786  display: flex !important;
9787  grid-template-columns: none !important;
9788}
9789
9790/* Responsividade - mantém 6 itens mas ajusta tamanhos mínimos */
9791@media (max-width: 1200px) {
9792  .sp-csvc-dropzone-collection .collection-display-grid > *,
9793  .sp-csvc-dropzone-collection .row > * {
9794    min-width: 140px;
9795  }
9796}
9797
9798@media (max-width: 992px) {
9799  .sp-csvc-fragment-slider-container {
9800    --item-gap: 12px;
9801  }
9802
9803  .sp-csvc-psp-slide-crontol
9804    .lfr-layout-structure-item-collection
9805    > .container-fluid
9806    > .row
9807    > .col {
9808    flex: 0 0 calc(1 / 3 * 100%);
9809    max-width: calc(1 / 3 * 100%);
9810  }
9811
9812  .sp-csvc-dropzone-collection .collection-display-grid > *,
9813  .sp-csvc-dropzone-collection .row > * {
9814    min-width: 120px;
9815  }
9816}
9817
9818@media (max-width: 768px) {
9819  .sp-csvc-fragment-slider-container {
9820    --slider-padding: 20px;
9821    --item-gap: 10px;
9822  }
9823
9824  .sp-csvc-psp-slide-crontol
9825    .lfr-layout-structure-item-collection
9826    > .container-fluid
9827    > .row
9828    > .col {
9829    flex: 0 0 calc(1 / 3 * 100%);
9830    max-width: calc(1 / 3 * 100%);
9831  }
9832
9833  .sp-csvc-slider-container__header {
9834    flex-direction: column;
9835    align-items: flex-start;
9836  }
9837
9838  .sp-csvc-slider-container__controls {
9839    align-self: flex-end;
9840    margin-top: -40px;
9841  }
9842
9843  .sp-csvc-dropzone-collection .collection-display-grid > *,
9844  .sp-csvc-dropzone-collection .row > * {
9845    min-width: 100px;
9846  }
9847}
9848
9849@media (max-width: 600px) {
9850  /* Em telas muito pequenas, permite scroll horizontal */
9851  .sp-csvc-slider-viewport {
9852    overflow-x: auto;
9853    -webkit-overflow-scrolling: touch;
9854  }
9855
9856  .sp-csvc-psp-slide-crontol
9857    .lfr-layout-structure-item-collection
9858    > .container-fluid
9859    > .row
9860    > .col {
9861    flex: 0 0 calc(1 / 1 * 100%);
9862    max-width: calc(1 / 1 * 100%);
9863  }
9864
9865  .sp-csvc-dropzone-collection .collection-display-grid > *,
9866  .sp-csvc-dropzone-collection .row > * {
9867    min-width: 90px;
9868  }
9869}
9870
9871/* Modo claro */
9872@media (prefers-color-scheme: light) {
9873  .sp-csvc-fragment-slider-container.sp-csvc-light-mode {
9874    --slider-bg: #f5f5f5;
9875    --slider-text: #1a1a1a;
9876    --control-bg: rgba(0, 0, 0, 0.05);
9877    --control-hover-bg: rgba(0, 0, 0, 0.1);
9878  }
9879
9880  .sp-csvc-fragment-slider-container.sp-csvc-light-mode
9881    .sp-csvc-slider-control {
9882    border-color: rgba(0, 0, 0, 0.2);
9883  }
9884
9885  .sp-csvc-fragment-slider-container.sp-csvc-light-mode
9886    .sp-csvc-dropzone-placeholder {
9887    border-color: rgba(0, 0, 0, 0.2);
9888    background-color: rgba(0, 0, 0, 0.02);
9889    color: rgba(0, 0, 0, 0.5);
9890  }
9891}
9892
9893/* Estados do dropzone no editor */
9894.page-editor-layout-drop-zone-active .sp-csvc-dropzone-title,
9895.page-editor-layout-drop-zone-active .sp-csvc-dropzone-collection {
9896  background-color: rgba(255, 215, 0, 0.1);
9897  border: 2px dashed var(--slider-accent);
9898  min-height: 60px;
9899}
9900
9901/* Animação suave */
9902@media (prefers-reduced-motion: no-preference) {
9903  .sp-csvc-slider-control {
9904    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
9905  }
9906
9907  .sp-csvc-dropzone-collection > .collection-display-grid,
9908  .sp-csvc-dropzone-collection > .row {
9909    transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
9910  }
9911}
9912
9913/* Controles laterais */
9914.sp-csvc-slider-control--side {
9915  position: absolute;
9916  top: 50%;
9917  transform: translateY(-50%);
9918  z-index: 10;
9919  background-color: #ffffff; /* Fundo branco */
9920  color: #000000; /* Ícone preto */
9921  border-color: rgba(255, 255, 255, 0.3);
9922}
9923
9924.sp-csvc-slider-control--prev.sp-csvc-slider-control--side {
9925  left: -22px;
9926}
9927
9928.sp-csvc-slider-control--next.sp-csvc-slider-control--side {
9929  right: -22px;
9930}
9931
9932/* Ajuste para hover nos controles laterais */
9933.sp-csvc-slider-control--side:hover:not(:disabled) {
9934  background-color: var(--control-hover-bg);
9935  border-color: rgba(255, 255, 255, 0.5);
9936  transform: translateY(-50%) scale(1.05);
9937}
9938
9939/* Remover o ajuste anterior para os controles no header */
9940.sp-csvc-slider-container__controls {
9941  align-self: flex-end;
9942  margin-top: 0;
9943}
9944
9945/* Ajustar posição dos controles laterais em telas menores */
9946.sp-csvc-slider-control--prev.sp-csvc-slider-control--side {
9947  left: -10px;
9948}
9949
9950.sp-csvc-slider-control--next.sp-csvc-slider-control--side {
9951  right: -10px;
9952}
9953}
9954
9955@media (max-width: 600px) {
9956  /* Em telas muito pequenas, permite scroll horizontal */
9957  .sp-csvc-slider-viewport {
9958    overflow-x: auto;
9959    -webkit-overflow-scrolling: touch;
9960  }
9961
9962  .sp-csvc-psp-slide-crontol
9963    .lfr-layout-structure-item-collection
9964    > .container-fluid
9965    > .row
9966    > .col {
9967    flex: 0 0 calc(1 / 1 * 100%);
9968    max-width: calc(1 / 1 * 100%);
9969  }
9970
9971  .sp-csvc-dropzone-collection .collection-display-grid > *,
9972  .sp-csvc-dropzone-collection .row > * {
9973    min-width: 90px;
9974  }
9975}
9976
9977/* Modo claro */
9978@media (prefers-color-scheme: light) {
9979  .sp-csvc-fragment-slider-container.sp-csvc-light-mode {
9980    --slider-bg: #f5f5f5;
9981    --slider-text: #1a1a1a;
9982    --control-bg: rgba(0, 0, 0, 0.05);
9983    --control-hover-bg: rgba(0, 0, 0, 0.1);
9984  }
9985
9986  .sp-csvc-fragment-slider-container.sp-csvc-light-mode
9987    .sp-csvc-slider-control {
9988    border-color: rgba(0, 0, 0, 0.2);
9989  }
9990
9991  .sp-csvc-fragment-slider-container.sp-csvc-light-mode
9992    .sp-csvc-dropzone-placeholder {
9993    border-color: rgba(0, 0, 0, 0.2);
9994    background-color: rgba(0, 0, 0, 0.02);
9995    color: rgba(0, 0, 0, 0.5);
9996  }
9997}
9998
9999/* Estados do dropzone no editor */
10000.page-editor-layout-drop-zone-active .sp-csvc-dropzone-title,
10001.page-editor-layout-drop-zone-active .sp-csvc-dropzone-collection {
10002  background-color: rgba(255, 215, 0, 0.1);
10003  border: 2px dashed var(--slider-accent);
10004  min-height: 60px;
10005}
10006
10007/* Animação suave */
10008@media (prefers-reduced-motion: no-preference) {
10009  .sp-csvc-slider-control {
10010    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
10011  }
10012
10013  .sp-csvc-dropzone-collection > .collection-display-grid,
10014  .sp-csvc-dropzone-collection > .row {
10015    transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
10016  }
10017}
10018}</style>
10019    
10019<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-1e106757-93a7-b591-fb85-13414c75089d'); const fragmentElementId = 'fragment-1e106757-93a7-b591-fb85-13414c75089d'; const fragmentEntryLinkNamespace = 'pkhq'; const fragmentNamespace = 'pkhq'; const layoutMode = 'view';let currentPosition = 0;
10020const track = document.querySelector(
10021  ".sp-csvc-psp-slide-crontol .lfr-layout-structure-item-collection > .container-fluid > .row"
10022);
10023
10024// Função para obter o limite de rolagens baseado no tamanho da tela
10025function getMaxScrolls() {
10026  // Mobile: até 768px = 9 rolagens, Desktop: acima de 768px = 3 rolagens
10027  return window.matchMedia('(max-width: 768px)').matches ? 9 : 3;
10028}
10029
10030function updateControlsVisibility() {
10031  const prevButton = document.querySelector('.sp-csvc-slider-control--prev');
10032  const nextButton = document.querySelector('.sp-csvc-slider-control--next');
10033  const maxScrolls = getMaxScrolls(); // Obtém o limite atual baseado no tamanho da tela
10034  
10035  if (prevButton && nextButton) {
10036    // Desabilita botão anterior se estiver na posição inicial
10037    prevButton.disabled = currentPosition <= 0;
10038    
10039    // Desabilita botão próximo se atingiu o limite de rolagens
10040    nextButton.disabled = currentPosition >= (maxScrolls - 1);
10041  }
10042}
10043
10044function moveCarousel(direction) {
10045  if (!track) return;
10046
10047  const totalItems = track.children.length;
10048  const itemsToShow = 1;
10049  const maxScrolls = getMaxScrolls(); // Obtém o limite atual baseado no tamanho da tela
10050  
10051  // NOVA LÓGICA: Limita baseado no tamanho da tela (3 desktop / 9 mobile)
10052  const maxPosition = Math.min(totalItems - itemsToShow, maxScrolls - 1);
10053
10054  // Calcular nova posição
10055  if (direction === 1 && currentPosition < maxPosition) {
10056    currentPosition++; // Próximo
10057  } else if (direction === -1 && currentPosition > 0) {
10058    currentPosition--; // Anterior
10059  }
10060
10061  // Mover o carrossel
10062  const movePercent = -(currentPosition * (100 / itemsToShow));
10063  track.style.transform = `translateX(${movePercent}%)`;
10064  
10065  // Atualizar visibilidade dos controles
10066  updateControlsVisibility();
10067}
10068
10069// Inicializar controles quando o DOM estiver carregado
10070document.addEventListener('DOMContentLoaded', function() {
10071  updateControlsVisibility();
10072});
10073
10074// Atualizar controles quando a tela for redimensionada (mudança mobile/desktop)
10075window.addEventListener('resize', function() {
10076  const maxScrolls = getMaxScrolls();
10077  
10078  // Se a posição atual exceder o novo limite, reposicionar
10079  if (currentPosition >= maxScrolls) {
10080    currentPosition = maxScrolls - 1;
10081    const movePercent = -(currentPosition * 100);
10082    if (track) {
10083      track.style.transform = `translateX(${movePercent}%)`;
10084    }
10085  }
10086  
10087  updateControlsVisibility();
10088});
10089
10090// Observar mudanças no conteúdo do dropzone
10091const observer = new MutationObserver(function(mutations) {
10092  mutations.forEach(function(mutation) {
10093    if (mutation.type === 'childList') {
10094      updateControlsVisibility();
10095    }
10096  });
10097});
10098
10099// Observar o dropzone da coleção
10100const dropzone = document.querySelector('.sp-csvc-dropzone-collection');
10101if (dropzone) {
10102  observer.observe(dropzone, { childList: true, subtree: true });
10103}
10104
10105window.moveCarousel = moveCarousel;;</script>
10105
10106   </div>
10107  </div>
10108 </div>
10109 <div class="lfr-layout-structure-item-72f4d028-7ee5-f50c-7f72-c4676f61d8bb lfr-layout-structure-item-container  container-fluid container-fluid-max-xl" data-layout-structure-item-id="72f4d028-7ee5-f50c-7f72-c4676f61d8bb">
10110  <div class="lfr-layout-structure-item-basic-component-spacer lfr-layout-structure-item-771de401-3bb0-36b2-ee61-265cb4eaf130 " data-layout-structure-item-id="771de401-3bb0-36b2-ee61-265cb4eaf130">
10111   <div id="fragment-67726eeb-6f2f-f549-0749-3ba1a59d2f69">
10112    <div class="py-2"></div>
10113   </div>
10114  </div>
10115  <div class="lfr-layout-structure-item-container-slider-videos-curtos--copiar- lfr-layout-structure-item-af15ea33-1591-2059-2268-9f44ef244eab " data-layout-structure-item-id="af15ea33-1591-2059-2268-9f44ef244eab">
10116   <div id="fragment-53f22e71-74a8-7694-7605-893f39d6f8ff">
10117    <div class="sp-csme-fragment-slider-container" data-fragment-namespace="baqm">
10118     <div class="sp-csme-slider-container__wrapper">
10119      <!-- Header com título e controles -->
10120      <div class="sp-csme-slider-container__header">
10121       <!-- Dropzone para título/componente customizado -->
10122       <div class="sp-csme-slider-container__title-dropzone">
10123        <div id="title-dropzone" class="sp-csme-dropzone-title"></div>
10124       </div>
10125      </div>
10126      <!-- Dropzone para coleção de itens -->
10127      <div class="sp-csme-slider-container__content sp-csme-psp-slide-crontol">
10128       <!-- Controle anterior -->
10129       <button class="sp-csme-slider-control sp-csme-slider-control--prev sp-csme-slider-control--side" onclick="moveCarouselCsme(-1)" aria-label="Item anterior" data-action="prev"> 
10130        <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
10131         <path d="M15 18L9 12L15 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
10132        </svg> 
10133       </button>
10134       <div class="sp-csme-slider-viewport">
10135        <div id="collection-dropzone" class="sp-csme-dropzone-collection">
10136         <div class="lfr-layout-structure-item-777eba26-0dfe-085b-6a65-21207764a12c lfr-layout-structure-item-collection" data-layout-structure-item-id="777eba26-0dfe-085b-6a65-21207764a12c" data-analytics-targetable-collection="com.liferay.layout.list.retriever.ClassedModelListObjectReference@11f36f64" id="analytics-targetable-collection-777eba26-0dfe-085b-6a65-21207764a12c">
10137          <div class="container-fluid overflow-hidden px-0">
10138           <div class="row align-items-center">
10139            <div class="col col-lg-1 col-sm-12 col-12 col-md-12">
10140             <div class="lfr-layout-structure-item-card-imagem-topo--copiar--1 lfr-layout-structure-item-5f76c8ac-a6f2-8969-1b4f-0a5378a70df1 " data-layout-structure-item-id="5f76c8ac-a6f2-8969-1b4f-0a5378a70df1">
10141              <div id="fragment-ff95dd4d-1ec6-50eb-03fa-948a0d11a196">
10142               <div class="card-news-image-top-banner-news-vertical-section">
10143                <!-- News Collection Container -->
10144                <div class="card-news-image-top-banner-news-vertical-list">
10145                 <!-- Individual News Item Template -->
10146                 <div class="card-news-image-top-banner-news-vertical-item">
10147                  <!-- News Image (Top) -->
10148                  <div class="card-news-image-top-banner-news-vertical-image">
10149                   <div class="card-news-image-top-banner-news-vertical-img">
10150                    <a href="https://sampanews.sp.gov.br/w/prefeitura-de-s%C3%A3o-paulo-tem-tr%C3%AAs-hospitais-em-rankings-internacionais-de-excel%C3%AAncia"><img src="https://sampanews.sp.gov.br/documents/24771855/0/20250703_Hospital_Menino_Jesus_SB-23.jpg/dd3f94ba-d47c-f1ff-f08d-02f70ac2f5ac?version=1.0&amp;t=1790175298043" alt="News Image"></a>
10151                   </div>
10152                   <!-- Category Badge (Overlaid on Image) -->
10153                   <div class="card-news-image-top-banner-news-vertical-category">
10154                    <div class="card-news-image-top-banner-vertical-category-text">
10155                     <a href="https://sampanews.sp.gov.br/w/prefeitura-de-s%C3%A3o-paulo-tem-tr%C3%AAs-hospitais-em-rankings-internacionais-de-excel%C3%AAncia">Saúde</a>
10156                    </div>
10157                   </div>
10158                  </div>
10159                  <!-- News Content (Bottom) -->
10160                  <div class="card-news-image-top-banner-news-vertical-content">
10161                   <!-- News Title -->
10162                   <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" t
10162ype="text" class="card-news-image-top-banner-news-vertical-title"><a href="https://sampanews.sp.gov.br/w/prefeitura-de-s%C3%A3o-paulo-tem-tr%C3%AAs-hospitais-em-rankings-internacionais-de-excel%C3%AAncia">Prefeitura de São Paulo tem três hospitais em rankings internacionais de excelência</a></h2>
10163                   <!-- News Headline/Description -->
10164                   <p id="news-headline" data-lfr-editable-id="description" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-headline"><a href="https://sampanews.sp.gov.br/w/prefeitura-de-s%C3%A3o-paulo-tem-tr%C3%AAs-hospitais-em-rankings-internacionais-de-excel%C3%AAncia">Vila Santa Catarina e M’Boi Mirim estão entre os 50 melhores da América Latina e Menino Jesus, entre os melhores hospitais pediátricos do mundo</a></p>
10165                  </div>
10166                 </div>
10167                </div>
10168               </div>
10169              </div>
10170              <style>.card-news-image-top-banner-news-vertical-section a,
10171    .card-news-image-top-banner-news-vertical-section a:link,
10172    .card-news-image-top-banner-news-vertical-section a:visited,
10173    .card-news-image-top-banner-news-vertical-section a:hover,
10174    .card-news-image-top-banner-news-vertical-section a:active,
10175    .card-news-image-top-banner-news-vertical-section a:focus {
10176        color: inherit;
10177        text-decoration: none;
10178        outline: none;
10179        border: none;
10180        background: none;
10181        cursor: inherit;
10182    }
10183
10184    /* Ensure link reset applies to all nested elements */
10185    .card-news-image-top-banner-news-vertical-section a * {
10186        color: inherit;
10187        text-decoration: none;
10188    }
10189
10190    .card-news-image-top-banner-resumo-news-vertical-section {
10191        padding: 20px 0px 20px 0px;
10192        background-color: transparent;
10193    }
10194
10195    .card-news-image-top-banner-news-vertical-list {
10196        display: flex;
10197        flex-direction: column;
10198        gap: 0;
10199        margin: 0 auto;
10200        background-color: transparent;
10201    }
10202
10203    .card-news-image-top-banner-news-vertical-item {
10204        display: flex;
10205        flex-direction: column;
10206        overflow: hidden;
10207        cursor: pointer;
10208        min-height: auto;
10209        background-color: transparent;
10210    }
10211
10212    /* News Image (Top) */
10213    .card-news-image-top-banner-news-vertical-image {
10214        position: relative;
10215        width: 100%;
10216        height: 600px;
10217        overflow: hidden;
10218        background: #f8f9fa;
10219        border-bottom: 6px solid #a4d0d1;
10220        transition: all 0.3s ease;
10221    }
10222
10223    /* Hide image container when no image is present */
10224    .card-news-image-top-banner-news-vertical-image.no-image {
10225        display: none;
10226    }
10227
10228    /* Alternative: If you prefer to show a placeholder when no image */
10229    /* .card-news-image-top-banner-news-vertical-image.no-image {
10230            height: 0;
10231            border-bottom: none;
10232            margin-bottom: 0;
10233        } */
10234
10235    .card-news-image-top-banner-news-vertical-img,
10236    .card-news-image-top-banner-news-vertical-img img {
10237        width: 100%;
10238        height: 100%;
10239        object-fit: cover;
10240    }
10241
10242    /* News Content (Bottom) */
10243    .card-news-image-top-banner-news-vertical-content {
10244        flex: 1;
10245        padding: 5px 0px;
10246        display: flex;
10247        flex-direction: column;
10248        justify-content: flex-start;
10249        position: relative;
10250        background-color: transparent;
10251    }
10252
10253    /* Adjust content padding when no image */
10254    .card-news-image-top-banner-news-vertical-item.no-image .card-news-image-top-banner-news-vertical-content {
10255        padding-top: 0;
10256    }
10257
10258    /* Category Badge (Overlaid on Image - Top Left) */
10259    .card-news-image-top-banner-news-vertical-category {
10260        position: absolute;
10261        top: 16px;
10262        left: 16px;
10263        z-index: 10;
10264    }
10265
10266    /* Move category to content area when no image */
10267    .card-news-image-top-banner-news-vertical-item.no-image .card-news-image-top-banner-news-vertical-category {
10268        position: static;
10269        margin-bottom: 12px;
10270    }
10271
10272    .card-news-image-top-banner-vertical-category-text {
10273        background: #a4d0d1;
10274        color: #333333;
10275        padding: 6px 12px;
10276        font-size: 12px;
10277        font-weight: 600;
10278        text-transform: uppercase;
10279        letter-spacing: 0.5px;
10280        display: inline-block;
10281    }
10282
10283    .card-news-image-top-banner-news-vertical-title {
10284        font-size: 22px;
10285        font-weight: 700;
10286        line-height: 1.3;
10287        color: #212529;
10288        margin: 0 0 16px 0;
10289        display: -webkit-box;
10290        -webkit-box-orient: vertical;
10291        overflow: hidden;
10292    }
10293
10294    .card-news-image-top-banner-news-vertical-headline {
10295        font-size: 14px;
10296        color: #4a4a4a;
10297        margin: 0;
10298        display: -webkit-box;
10299        -webkit-box-orient: vertical;
10300        overflow: hidden;
10301        flex-grow: 1;
10302    }
10303
10304    /* Responsive Design */
10305    @media (max-width: 768px) {
10306        .card-news-image-top-banner-news-vertical-image {
10307            height: 250px;
10308        }
10309
10310        .card-news-image-top-banner-news-vertical-section {
10311            padding: 0;
10312        }
10313
10314        .card-news-image-top-banner-news-vertical-list {
10315            max-width: 100%;
10316            margin: 0 10px;
10317        }
10318
10319        .card-news-image-top-banner-news-vertical-content {
10320            padding: 10px 0px;
10321        }
10322
10323        .card-news-image-top-banner-news-vertical-title {
10324            font-size: 20px;
10325        }
10326
10327        .card-news-image-top-banner-news-vertical-headline {
10328            font-size: 14px;
10329        }
10330
10331        .card-news-image-top-banner-vertical-category-text {
10332            font-size: 12px;
10333            padding: 5px 10px;
10334        }
10335
10336        .card-news-image-top-banner-news-vertical-category {
10337            top: 12px;
10338            left: 12px;
10339        }
10340    }
10341
10342    @media (max-width: 480px) {
10343        .card-news-image-top-banner-news-vertical-section {
10344            padding: 0;
10345        }
10346
10347        .card-news-image-top-banner-news-vertical-image {
10348            height: 200px;
10349        }
10350
10351        .card-news-image-top-banner-news-vertical-content {
10352            padding: 10px 0px;
10353        }
10354
10355        .card-news-image-top-banner-news-vertical-title {
10356            font-size: 18px;
10357            margin-bottom: 12px;
10358        }
10359
10360        .card-news-image-top-banner-news-vertical-headline {
10361            font-size: 13px;
10362        }
10363
10364        .card-news-image-top-banner-news-vertical-category {
10365            top: 10px;
10366            left: 10px;
10367        }
10368    }
10369
10370    /* Animation for items appearing */
10371    .card-news-image-top-banner-news-vertical-item {
10372        opacity: 0;
10373        animation: fadeInUpVertical 0.6s ease forwards;
10374    }
10375
10376    .card-news-image-top-banner-news-vertical-item:nth-child(1) {
10377        animation-delay: 0.1s;
10378    }
10379
10380    .card-news-image-top-banner-news-vertical-item:nth-child(2) {
10381        animation-delay: 0.2s;
10382    }
10383
10384    .card-news-image-top-banner-news-vertical-item:nth-child(3) {
10385        animation-delay: 0.3s;
10386    }
10387
10388    .card-news-image-top-banner-news-vertical-item:nth-child(4) {
10389        animation-delay: 0.4s;
10390    }
10391
10392    @keyframes fadeInUpVertical {
10393        from {
10394            opacity: 0;
10395            transform: translateY(30px);
10396        }
10397
10398        to {
10399            opacity: 1;
10400            transform: translateY(0);
10401        }
10402    }
10403
10404    /* Print styles */
10405    @media print {
10406        .card-news-image-top-banner-vertical-category-text {
10407            background: #a4d0d1 !important;
10408            color: #333333 !important;
10409        }
10410    }</style>
10411              
10411<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-ff95dd4d-1ec6-50eb-03fa-948a0d11a196'); const fragmentElementId = 'fragment-ff95dd4d-1ec6-50eb-03fa-948a0d11a196'; const fragmentEntryLinkNamespace = 'eklx'; const fragmentNamespace = 'eklx'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function () {
10412    let isProcessing = false; // Flag para evitar loops
10413    let observer = null;
10414    let debounceTimeout = null;
10415
10416    function checkForImages() {
10417        // Evita execução simultânea
10418        if (isProcessing) return;
10419        isProcessing = true;
10420
10421        try {
10422            const newsItems = document.querySelectorAll('.card-news-image-top-banner-news-vertical-item');
10423            
10424            newsItems.forEach(function (item) {
10425                const imageContainer = item.querySelector('.card-news-image-top-banner-news-vertical-image');
10426                const img = item.querySelector('.card-news-image-top-banner-news-vertical-img img');
10427                const category = item.querySelector('.card-news-image-top-banner-news-vertical-category');
10428                const content = item.querySelector('.card-news-image-top-banner-news-vertical-content');
10429                
10430                if (img && imageContainer) {
10431                    // Check if image has a valid source (not placeholder or empty)
10432                    const isEmpty = !img.src ||
10433                        img.src === '' ||
10434                        img.src.includes('data:image/svg+xml') ||
10435                        img.src.includes('placeholder') ||
10436                        img.src.includes('default-image');
10437
10438                    // Só modifica se necessário (evita loops desnecessários)
10439                    const currentlyHasNoImage = item.classList.contains('no-image');
10440                    
10441                    if (isEmpty && !currentlyHasNoImage) {
10442                        // Hide image container
10443                        imageContainer.classList.add('no-image');
10444                        item.classList.add('no-image');
10445                        
10446                        // Move category to content area if it exists and not already there
10447                        if (category && content && !content.contains(category)) {
10448                            content.insertBefore(category, content.firstChild);
10449                        }
10450                    } else if (!isEmpty && currentlyHasNoImage) {
10451                        // Show image container
10452                        imageContainer.classList.remove('no-image');
10453                        item.classList.remove('no-image');
10454                        
10455                        // Move category back to image area if it exists and not already there
10456                        if (category && imageContainer && !imageContainer.contains(category)) {
10457                            imageContainer.appendChild(category);
10458                        }
10459                    }
10460                }
10461            });
10462        } catch (error) {
10463            console.error('Erro no checkForImages (banner):', error);
10464        } finally {
10465            isProcessing = false;
10466        }
10467    }
10468
10469    // Função para inicializar o observer uma única vez
10470    function initializeObserver() {
10471        if (observer || !window.MutationObserver) return;
10472        
10473        observer = new MutationObserver(function (mutations) {
10474            // Evita loop: só executa se não estiver processando
10475            if (isProcessing) return;
10476            
10477            let shouldCheck = false;
10478            
10479            mutations.forEach(function (mutation) {
10480                // Só reage a mudanças relevantes
10481                if (mutation.type === 'childList') {
10482                    const target = mutation.target;
10483                    if (target.closest && 
10484                        target.closest('.card-news-image-top-banner-news-vertical-item')) {
10485                        shouldCheck = true;
10486                    }
10487                } else if (mutation.type === 'attributes' && 
10488                          mutation.attributeName === 'src' &&
10489                          mutation.target.tagName === 'IMG') {
10490                    // Só reage a mudanças de src em imagens
10491                    const img = mutation.target;
10492                    if (img.closest('.card-news-image-top-banner-news-vertical-item')) {
10493                        shouldCheck = true;
10494                    }
10495                }
10496            });
10497
10498            if (shouldCheck) {
10499                // Debounce: evita múltiplas execuções rápidas
10500                clearTimeout(debounceTimeout);
10501                debounceTimeout = setTimeout(checkForImages, 150);
10502            }
10503        });
10504
10505        // Observer em elementos relevantes
10506        const bannerSection = document.querySelector('.card-news-image-top-banner-news-vertical-section');
10507        const fallbackTargets = [
10508            bannerSection,
10509            document.querySelector('#main-content'),
10510            document.querySelector('.portlet-boundary'),
10511            document.body
10512        ].filter(Boolean);
10513        
10514        // Observa o primeiro target válido encontrado
10515        if (fallbackTargets.length > 0) {
10516            observer.observe(fallbackTargets[0], {
10517                childList: true,
10518                subtree: true,
10519                attributes: true,
10520                attributeFilter: ['src']
10521            });
10522            
10523            console.log('Banner News Observer inicializado em:', fallbackTargets[0].className || fallbackTargets[0].tagName);
10524        }
10525    }
10526
10527    // Execução inicial
10528    checkForImages();
10529    
10530    // Inicializar observer
10531    initializeObserver();
10532    
10533    // Check adicional após carregamento de imagens (backup)
10534    setTimeout(function() {
10535        if (!isProcessing) {
10536            checkForImages();
10537        }
10538    }, 200);
10539
10540    // Cleanup ao sair da página
10541    window.addEventListener('beforeunload', function() {
10542        if (observer) {
10543            observer.disconnect();
10544        }
10545        clearTimeout(debounceTimeout);
10546    });
10547});;</script>
10547
10548             </div>
10549            </div>
10550            <div class="col col-lg-1 col-sm-12 col-12 col-md-12">
10551             <div class="lfr-layout-structure-item-card-imagem-topo--copiar--1 lfr-layout-structure-item-5f76c8ac-a6f2-8969-1b4f-0a5378a70df1 " data-layout-structure-item-id="5f76c8ac-a6f2-8969-1b4f-0a5378a70df1">
10552              <div id="fragment-233827c6-dee4-cf93-d659-f0e40f2f2b3a">
10553               <div class="card-news-image-top-banner-news-vertical-section">
10554                <!-- News Collection Container -->
10555                <div class="card-news-image-top-banner-news-vertical-list">
10556                 <!-- Individual News Item Template -->
10557                 <div class="card-news-image-top-banner-news-vertical-item">
10558                  <!-- News Image (Top) -->
10559                  <div class="card-news-image-top-banner-news-vertical-image">
10560                   <div class="card-news-image-top-banner-news-vertical-img">
10561                    <a href="https://sampanews.sp.gov.br/w/espa%C3%A7o-motoboy-melhora-a-rotina-de-quem-trabalha-sobre-duas-rodas-em-s%C3%A3o-paulo"><img src="https://prefeitura.sp.gov.br/documents/d/prefeitura-de-sao-paulo/20260813_espacomotoboycentro_0004_lr-1-jpg" alt="News Image"></a>
10562                   </div>
10563                   <!-- Category Badge (Overlaid on Image) -->
10564                   <div class="card-news-image-top-banner-news-vertical-category">
10565                    <div class="card-news-image-top-banner-vertical-category-text">
10566                     <a href="https://sampanews.sp.gov.br/w/espa%C3%A7o-motoboy-melhora-a-rotina-de-quem-trabalha-sobre-duas-rodas-em-s%C3%A3o-paulo">Mobilidade</a>
10567                    </div>
10568                   </div>
10569                  </div>
10570                  <!-- News Content (Bottom) -->
10571                  <div class="card-news-image-top-banner-news-vertical-content">
10572                   <!-- News Title -->
10573                   <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-title"><a href="https://sampanews.sp.gov.br/w/espa%C3%A7o-motoboy-melhora-a-rotina-de-quem-trabalha-sobre-duas-rodas-em-s%C3%A3o-paulo">Espaço Motoboy melhora a rotina de quem trabalha sobre duas rodas em São Paulo</a></h2>
10574                   <!-- News Headline/Description -->
10575                   <p id="news-headline" data-lfr-editable-id="description" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-headline"><a href="https://sampanews.sp.gov.br/w/espa%C3%A7o-motoboy-melhora-a-rotina-de-quem-trabalha-sobre-duas-rodas-em-s%C3%A3o-paulo">Espaço da Prefeitura de São Paulo oferece condições adequadas para descanso, refeições e estacionamento</a></p>
10576                  </div>
10577                 </div>
10578                </div>
10579               </div>
10580              </div>
10581              
10581<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-233827c6-dee4-cf93-d659-f0e40f2f2b3a'); const fragmentElementId = 'fragment-233827c6-dee4-cf93-d659-f0e40f2f2b3a'; const fragmentEntryLinkNamespace = 'eklx'; const fragmentNamespace = 'eklx'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function () {
10582    let isProcessing = false; // Flag para evitar loops
10583    let observer = null;
10584    let debounceTimeout = null;
10585
10586    function checkForImages() {
10587        // Evita execução simultânea
10588        if (isProcessing) return;
10589        isProcessing = true;
10590
10591        try {
10592            const newsItems = document.querySelectorAll('.card-news-image-top-banner-news-vertical-item');
10593            
10594            newsItems.forEach(function (item) {
10595                const imageContainer = item.querySelector('.card-news-image-top-banner-news-vertical-image');
10596                const img = item.querySelector('.card-news-image-top-banner-news-vertical-img img');
10597                const category = item.querySelector('.card-news-image-top-banner-news-vertical-category');
10598                const content = item.querySelector('.card-news-image-top-banner-news-vertical-content');
10599                
10600                if (img && imageContainer) {
10601                    // Check if image has a valid source (not placeholder or empty)
10602                    const isEmpty = !img.src ||
10603                        img.src === '' ||
10604                        img.src.includes('data:image/svg+xml') ||
10605                        img.src.includes('placeholder') ||
10606                        img.src.includes('default-image');
10607
10608                    // Só modifica se necessário (evita loops desnecessários)
10609                    const currentlyHasNoImage = item.classList.contains('no-image');
10610                    
10611                    if (isEmpty && !currentlyHasNoImage) {
10612                        // Hide image container
10613                        imageContainer.classList.add('no-image');
10614                        item.classList.add('no-image');
10615                        
10616                        // Move category to content area if it exists and not already there
10617                        if (category && content && !content.contains(category)) {
10618                            content.insertBefore(category, content.firstChild);
10619                        }
10620                    } else if (!isEmpty && currentlyHasNoImage) {
10621                        // Show image container
10622                        imageContainer.classList.remove('no-image');
10623                        item.classList.remove('no-image');
10624                        
10625                        // Move category back to image area if it exists and not already there
10626                        if (category && imageContainer && !imageContainer.contains(category)) {
10627                            imageContainer.appendChild(category);
10628                        }
10629                    }
10630                }
10631            });
10632        } catch (error) {
10633            console.error('Erro no checkForImages (banner):', error);
10634        } finally {
10635            isProcessing = false;
10636        }
10637    }
10638
10639    // Função para inicializar o observer uma única vez
10640    function initializeObserver() {
10641        if (observer || !window.MutationObserver) return;
10642        
10643        observer = new MutationObserver(function (mutations) {
10644            // Evita loop: só executa se não estiver processando
10645            if (isProcessing) return;
10646            
10647            let shouldCheck = false;
10648            
10649            mutations.forEach(function (mutation) {
10650                // Só reage a mudanças relevantes
10651                if (mutation.type === 'childList') {
10652                    const target = mutation.target;
10653                    if (target.closest && 
10654                        target.closest('.card-news-image-top-banner-news-vertical-item')) {
10655                        shouldCheck = true;
10656                    }
10657                } else if (mutation.type === 'attributes' && 
10658                          mutation.attributeName === 'src' &&
10659                          mutation.target.tagName === 'IMG') {
10660                    // Só reage a mudanças de src em imagens
10661                    const img = mutation.target;
10662                    if (img.closest('.card-news-image-top-banner-news-vertical-item')) {
10663                        shouldCheck = true;
10664                    }
10665                }
10666            });
10667
10668            if (shouldCheck) {
10669                // Debounce: evita múltiplas execuções rápidas
10670                clearTimeout(debounceTimeout);
10671                debounceTimeout = setTimeout(checkForImages, 150);
10672            }
10673        });
10674
10675        // Observer em elementos relevantes
10676        const bannerSection = document.querySelector('.card-news-image-top-banner-news-vertical-section');
10677        const fallbackTargets = [
10678            bannerSection,
10679            document.querySelector('#main-content'),
10680            document.querySelector('.portlet-boundary'),
10681            document.body
10682        ].filter(Boolean);
10683        
10684        // Observa o primeiro target válido encontrado
10685        if (fallbackTargets.length > 0) {
10686            observer.observe(fallbackTargets[0], {
10687                childList: true,
10688                subtree: true,
10689                attributes: true,
10690                attributeFilter: ['src']
10691            });
10692            
10693            console.log('Banner News Observer inicializado em:', fallbackTargets[0].className || fallbackTargets[0].tagName);
10694        }
10695    }
10696
10697    // Execução inicial
10698    checkForImages();
10699    
10700    // Inicializar observer
10701    initializeObserver();
10702    
10703    // Check adicional após carregamento de imagens (backup)
10704    setTimeout(function() {
10705        if (!isProcessing) {
10706            checkForImages();
10707        }
10708    }, 200);
10709
10710    // Cleanup ao sair da página
10711    window.addEventListener('beforeunload', function() {
10712        if (observer) {
10713            observer.disconnect();
10714        }
10715        clearTimeout(debounceTimeout);
10716    });
10717});;</script>
10717
10718             </div>
10719            </div>
10720            <div class="col col-lg-1 col-sm-12 col-12 col-md-12">
10721             <div class="lfr-layout-structure-item-card-imagem-topo--copiar--1 lfr-layout-structure-item-5f76c8ac-a6f2-8969-1b4f-0a5378a70df1 " data-layout-structure-item-id="5f76c8ac-a6f2-8969-1b4f-0a5378a70df1">
10722              <div id="fragment-ee5459f5-46b6-f2c7-30dc-f6be94790203">
10723               <div class="card-news-image-top-banner-news-vertical-section">
10724                <!-- News Collection Container -->
10725                <div class="card-news-image-top-banner-news-vertical-list">
10726                 <!-- Individual News Item Template -->
10727                 <div class="card-news-image-top-banner-news-vertical-item">
10728                  <!-- News Image (Top) -->
10729                  <div class="card-news-image-top-banner-news-vertical-image">
10730                   <div class="card-news-image-top-banner-news-vertical-img">
10731                    <a href="https://sampanews.sp.gov.br/w/escritura-na-m%C3%A3o-prefeitura-alcan%C3%A7a-marca-hist%C3%B3rica-de-100-mil-documentos-de-propriedade-entregues-e-transforma-a-vida-das-fam%C3%ADlias-da-capital"><img src="https://sampanews.sp.gov.br/documents/24771855/0/Marco_TitulosEntregues_Banner_1600x1050px+%281%29.png/2cacb9e6-d558-e78d-9029-aad39da54d66?version=1.0&amp;t=1789144853596" alt="News Image"></a>
10732                   </div>
10733                   <!-- Category Badge (Overlaid on Image) -->
10734                   <div class="card-news-image-top-banner-news-vertical-category">
10735                    <div class="card-news-image-top-banner-vertical-category-text">
10736                     <a href="https://sampanews.sp.gov.br/w/escritura-na-m%C3%A3o-prefeitura-alcan%C3%A7a-marca-hist%C3%B3rica-de-100-mil-documentos-de-propriedade-entregues-e-transforma-a-vida-das-fam%C3%ADlias-da-capital">Habitação</a>
10737                    </div>
10738                   </div>
10739                  </div>
10740                  <!-- News Content (Bottom) -->
10741                  <div class="card-news-image-top-banner-news-vertical-content">
10742                   <!-- News Title -->
10743                   <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-title"><a href="https://sampanews.sp.gov.br/w/escritura-na-m%C3%A3o-prefeitura-alcan%C3%A7a-marca-hist%C3%B3rica-de-100-mil-documentos-de-propriedade-entregues-e-transforma-a-vida-das-fam%C3%ADlias-da-capital">Escritura na Mão: Prefeitura alcança marca histórica de 100 mil documentos de propriedade entregues e transforma a vida das famílias da capital</a></h2>
10744                   <!-- News Headline/Description -->
10745                   <p id="news-headline" data-lfr-editable-id="description" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-headline"><a href="https://sampanews.sp.gov.br/w/escritura-na-m%C3%A3o-prefeitura-alcan%C3%A7a-marca-hist%C3%B3rica-de-100-mil-documentos-de-propriedade-entregues-e-transforma-a-vida-das-fam%C3%ADlias-da-capital">Avanço da política habitacional da cidade foi atingido durante o Prefeitura Presente no Jaçanã e Tremembé, com a entrega de 2.846 escrituras na Zona Norte</a></p>
10746                  </div>
10747                 </div>
10748                </div>
10749               </div>
10750              </div>
10751              
10751<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-ee5459f5-46b6-f2c7-30dc-f6be94790203'); const fragmentElementId = 'fragment-ee5459f5-46b6-f2c7-30dc-f6be94790203'; const fragmentEntryLinkNamespace = 'eklx'; const fragmentNamespace = 'eklx'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function () {
10752    let isProcessing = false; // Flag para evitar loops
10753    let observer = null;
10754    let debounceTimeout = null;
10755
10756    function checkForImages() {
10757        // Evita execução simultânea
10758        if (isProcessing) return;
10759        isProcessing = true;
10760
10761        try {
10762            const newsItems = document.querySelectorAll('.card-news-image-top-banner-news-vertical-item');
10763            
10764            newsItems.forEach(function (item) {
10765                const imageContainer = item.querySelector('.card-news-image-top-banner-news-vertical-image');
10766                const img = item.querySelector('.card-news-image-top-banner-news-vertical-img img');
10767                const category = item.querySelector('.card-news-image-top-banner-news-vertical-category');
10768                const content = item.querySelector('.card-news-image-top-banner-news-vertical-content');
10769                
10770                if (img && imageContainer) {
10771                    // Check if image has a valid source (not placeholder or empty)
10772                    const isEmpty = !img.src ||
10773                        img.src === '' ||
10774                        img.src.includes('data:image/svg+xml') ||
10775                        img.src.includes('placeholder') ||
10776                        img.src.includes('default-image');
10777
10778                    // Só modifica se necessário (evita loops desnecessários)
10779                    const currentlyHasNoImage = item.classList.contains('no-image');
10780                    
10781                    if (isEmpty && !currentlyHasNoImage) {
10782                        // Hide image container
10783                        imageContainer.classList.add('no-image');
10784                        item.classList.add('no-image');
10785                        
10786                        // Move category to content area if it exists and not already there
10787                        if (category && content && !content.contains(category)) {
10788                            content.insertBefore(category, content.firstChild);
10789                        }
10790                    } else if (!isEmpty && currentlyHasNoImage) {
10791                        // Show image container
10792                        imageContainer.classList.remove('no-image');
10793                        item.classList.remove('no-image');
10794                        
10795                        // Move category back to image area if it exists and not already there
10796                        if (category && imageContainer && !imageContainer.contains(category)) {
10797                            imageContainer.appendChild(category);
10798                        }
10799                    }
10800                }
10801            });
10802        } catch (error) {
10803            console.error('Erro no checkForImages (banner):', error);
10804        } finally {
10805            isProcessing = false;
10806        }
10807    }
10808
10809    // Função para inicializar o observer uma única vez
10810    function initializeObserver() {
10811        if (observer || !window.MutationObserver) return;
10812        
10813        observer = new MutationObserver(function (mutations) {
10814            // Evita loop: só executa se não estiver processando
10815            if (isProcessing) return;
10816            
10817            let shouldCheck = false;
10818            
10819            mutations.forEach(function (mutation) {
10820                // Só reage a mudanças relevantes
10821                if (mutation.type === 'childList') {
10822                    const target = mutation.target;
10823                    if (target.closest && 
10824                        target.closest('.card-news-image-top-banner-news-vertical-item')) {
10825                        shouldCheck = true;
10826                    }
10827                } else if (mutation.type === 'attributes' && 
10828                          mutation.attributeName === 'src' &&
10829                          mutation.target.tagName === 'IMG') {
10830                    // Só reage a mudanças de src em imagens
10831                    const img = mutation.target;
10832                    if (img.closest('.card-news-image-top-banner-news-vertical-item')) {
10833                        shouldCheck = true;
10834                    }
10835                }
10836            });
10837
10838            if (shouldCheck) {
10839                // Debounce: evita múltiplas execuções rápidas
10840                clearTimeout(debounceTimeout);
10841                debounceTimeout = setTimeout(checkForImages, 150);
10842            }
10843        });
10844
10845        // Observer em elementos relevantes
10846        const bannerSection = document.querySelector('.card-news-image-top-banner-news-vertical-section');
10847        const fallbackTargets = [
10848            bannerSection,
10849            document.querySelector('#main-content'),
10850            document.querySelector('.portlet-boundary'),
10851            document.body
10852        ].filter(Boolean);
10853        
10854        // Observa o primeiro target válido encontrado
10855        if (fallbackTargets.length > 0) {
10856            observer.observe(fallbackTargets[0], {
10857                childList: true,
10858                subtree: true,
10859                attributes: true,
10860                attributeFilter: ['src']
10861            });
10862            
10863            console.log('Banner News Observer inicializado em:', fallbackTargets[0].className || fallbackTargets[0].tagName);
10864        }
10865    }
10866
10867    // Execução inicial
10868    checkForImages();
10869    
10870    // Inicializar observer
10871    initializeObserver();
10872    
10873    // Check adicional após carregamento de imagens (backup)
10874    setTimeout(function() {
10875        if (!isProcessing) {
10876            checkForImages();
10877        }
10878    }, 200);
10879
10880    // Cleanup ao sair da página
10881    window.addEventListener('beforeunload', function() {
10882        if (observer) {
10883            observer.disconnect();
10884        }
10885        clearTimeout(debounceTimeout);
10886    });
10887});;</script>
10887
10888             </div>
10889            </div>
10890            <div class="col col-lg-1 col-sm-12 col-12 col-md-12">
10891             <div class="lfr-layout-structure-item-card-imagem-topo--copiar--1 lfr-layout-structure-item-5f76c8ac-a6f2-8969-1b4f-0a5378a70df1 " data-layout-structure-item-id="5f76c8ac-a6f2-8969-1b4f-0a5378a70df1">
10892              <div id="fragment-f52ed679-fce5-79f9-2870-2a68df0ab06a">
10893               <div class="card-news-image-top-banner-news-vertical-section">
10894                <!-- News Collection Container -->
10895                <div class="card-news-image-top-banner-news-vertical-list">
10896                 <!-- Individual News Item Template -->
10897                 <div class="card-news-image-top-banner-news-vertical-item">
10898                  <!-- News Image (Top) -->
10899                  <div class="card-news-image-top-banner-news-vertical-image">
10900                   <div class="card-news-image-top-banner-news-vertical-img">
10901                    <a href="https://sampanews.sp.gov.br/w/prefeitura-qualifica-parque-independ%C3%AAncia-e-preserva-patrim%C3%B4nio-hist%C3%B3rico-ambiental-e-cultural-no-ipiranga"><img src="https://sampanews.sp.gov.br/documents/24771855/0/20260904_museu_do_ipiranga_RP-5.jpg/9d7103d3-8ad6-155f-0151-3bde7995a03b?version=1.0&amp;t=1788880807013" alt="News Image"></a>
10902                   </div>
10903                   <!-- Category Badge (Overlaid on Image) -->
10904                   <div class="card-news-image-top-banner-news-vertical-category">
10905                    <div class="card-news-image-top-banner-vertical-category-text">
10906                     <a href="https://sampanews.sp.gov.br/w/prefeitura-qualifica-parque-independ%C3%AAncia-e-preserva-patrim%C3%B4nio-hist%C3%B3rico-ambiental-e-cultural-no-ipiranga">Zeladoria</a>
10907                    </div>
10908                   </div>
10909                  </div>
10910                  <!-- News Content (Bottom) -->
10911                  <div class="card-news-image-top-banner-news-vertical-content">
10912                   <!-- News Title -->
10913                   <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-title"><a href="https://sampanews.sp.gov.br/w/prefeitura-qualifica-parque-independ%C3%AAncia-e-preserva-patrim%C3%B4nio-hist%C3%B3rico-ambiental-e-cultural-no-ipiranga">Prefeitura qualifica Parque Independência e preserva patrimônio histórico, ambiental e cultural no Ipiranga</a></h2>
10914                   <!-- News Headline/Description -->
10915                   <p id="news-headline" data-lfr-editable-id="description" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-headline"><a href="https://sampanews.sp.gov.br/w/prefeitura-qualifica-parque-independ%C3%AAncia-e-preserva-patrim%C3%B4nio-hist%C3%B3rico-ambiental-e-cultural-no-ipiranga">Área verde simbólica da cidade recebeu mais de R$ 13,5 milhões em investimentos, ganhou cerca de 45 mil m² e terá a reabertura da Cripta Imperial neste feriado de 7 de Setembro</a></p>
10916                  </div>
10917                 </div>
10918                </div>
10919               </div>
10920              </div>
10921              
10921<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-f52ed679-fce5-79f9-2870-2a68df0ab06a'); const fragmentElementId = 'fragment-f52ed679-fce5-79f9-2870-2a68df0ab06a'; const fragmentEntryLinkNamespace = 'eklx'; const fragmentNamespace = 'eklx'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function () {
10922    let isProcessing = false; // Flag para evitar loops
10923    let observer = null;
10924    let debounceTimeout = null;
10925
10926    function checkForImages() {
10927        // Evita execução simultânea
10928        if (isProcessing) return;
10929        isProcessing = true;
10930
10931        try {
10932            const newsItems = document.querySelectorAll('.card-news-image-top-banner-news-vertical-item');
10933            
10934            newsItems.forEach(function (item) {
10935                const imageContainer = item.querySelector('.card-news-image-top-banner-news-vertical-image');
10936                const img = item.querySelector('.card-news-image-top-banner-news-vertical-img img');
10937                const category = item.querySelector('.card-news-image-top-banner-news-vertical-category');
10938                const content = item.querySelector('.card-news-image-top-banner-news-vertical-content');
10939                
10940                if (img && imageContainer) {
10941                    // Check if image has a valid source (not placeholder or empty)
10942                    const isEmpty = !img.src ||
10943                        img.src === '' ||
10944                        img.src.includes('data:image/svg+xml') ||
10945                        img.src.includes('placeholder') ||
10946                        img.src.includes('default-image');
10947
10948                    // Só modifica se necessário (evita loops desnecessários)
10949                    const currentlyHasNoImage = item.classList.contains('no-image');
10950                    
10951                    if (isEmpty && !currentlyHasNoImage) {
10952                        // Hide image container
10953                        imageContainer.classList.add('no-image');
10954                        item.classList.add('no-image');
10955                        
10956                        // Move category to content area if it exists and not already there
10957                        if (category && content && !content.contains(category)) {
10958                            content.insertBefore(category, content.firstChild);
10959                        }
10960                    } else if (!isEmpty && currentlyHasNoImage) {
10961                        // Show image container
10962                        imageContainer.classList.remove('no-image');
10963                        item.classList.remove('no-image');
10964                        
10965                        // Move category back to image area if it exists and not already there
10966                        if (category && imageContainer && !imageContainer.contains(category)) {
10967                            imageContainer.appendChild(category);
10968                        }
10969                    }
10970                }
10971            });
10972        } catch (error) {
10973            console.error('Erro no checkForImages (banner):', error);
10974        } finally {
10975            isProcessing = false;
10976        }
10977    }
10978
10979    // Função para inicializar o observer uma única vez
10980    function initializeObserver() {
10981        if (observer || !window.MutationObserver) return;
10982        
10983        observer = new MutationObserver(function (mutations) {
10984            // Evita loop: só executa se não estiver processando
10985            if (isProcessing) return;
10986            
10987            let shouldCheck = false;
10988            
10989            mutations.forEach(function (mutation) {
10990                // Só reage a mudanças relevantes
10991                if (mutation.type === 'childList') {
10992                    const target = mutation.target;
10993                    if (target.closest && 
10994                        target.closest('.card-news-image-top-banner-news-vertical-item')) {
10995                        shouldCheck = true;
10996                    }
10997                } else if (mutation.type === 'attributes' && 
10998                          mutation.attributeName === 'src' &&
10999                          mutation.target.tagName === 'IMG') {
11000                    // Só reage a mudanças de src em imagens
11001                    const img = mutation.target;
11002                    if (img.closest('.card-news-image-top-banner-news-vertical-item')) {
11003                        shouldCheck = true;
11004                    }
11005                }
11006            });
11007
11008            if (shouldCheck) {
11009                // Debounce: evita múltiplas execuções rápidas
11010                clearTimeout(debounceTimeout);
11011                debounceTimeout = setTimeout(checkForImages, 150);
11012            }
11013        });
11014
11015        // Observer em elementos relevantes
11016        const bannerSection = document.querySelector('.card-news-image-top-banner-news-vertical-section');
11017        const fallbackTargets = [
11018            bannerSection,
11019            document.querySelector('#main-content'),
11020            document.querySelector('.portlet-boundary'),
11021            document.body
11022        ].filter(Boolean);
11023        
11024        // Observa o primeiro target válido encontrado
11025        if (fallbackTargets.length > 0) {
11026            observer.observe(fallbackTargets[0], {
11027                childList: true,
11028                subtree: true,
11029                attributes: true,
11030                attributeFilter: ['src']
11031            });
11032            
11033            console.log('Banner News Observer inicializado em:', fallbackTargets[0].className || fallbackTargets[0].tagName);
11034        }
11035    }
11036
11037    // Execução inicial
11038    checkForImages();
11039    
11040    // Inicializar observer
11041    initializeObserver();
11042    
11043    // Check adicional após carregamento de imagens (backup)
11044    setTimeout(function() {
11045        if (!isProcessing) {
11046            checkForImages();
11047        }
11048    }, 200);
11049
11050    // Cleanup ao sair da página
11051    window.addEventListener('beforeunload', function() {
11052        if (observer) {
11053            observer.disconnect();
11054        }
11055        clearTimeout(debounceTimeout);
11056    });
11057});;</script>
11057
11058             </div>
11059            </div>
11060            <div class="col col-lg-1 col-sm-12 col-12 col-md-12">
11061             <div class="lfr-layout-structure-item-card-imagem-topo--copiar--1 lfr-layout-structure-item-5f76c8ac-a6f2-8969-1b4f-0a5378a70df1 " data-layout-structure-item-id="5f76c8ac-a6f2-8969-1b4f-0a5378a70df1">
11062              <div id="fragment-e9e6469c-eb3d-dcc7-bd6b-48b98ac12e47">
11063               <div class="card-news-image-top-banner-news-vertical-section">
11064                <!-- News Collection Container -->
11065                <div class="card-news-image-top-banner-news-vertical-list">
11066                 <!-- Individual News Item Template -->
11067                 <div class="card-news-image-top-banner-news-vertical-item">
11068                  <!-- News Image (Top) -->
11069                  <div class="card-news-image-top-banner-news-vertical-image">
11070                   <div class="card-news-image-top-banner-news-vertical-img">
11071                    <a href="https://sampanews.sp.gov.br/w/prefeitura-inaugura-8%C2%BA-armaz%C3%A9m-solid%C3%A1rio-da-cidade-na-regi%C3%A3o-com-maior-concentra%C3%A7%C3%A3o-de-fam%C3%ADlias-no-cad%C3%BAnico"><img src="https://sampanews.sp.gov.br/documents/24771855/0/20260827_Armazem_Solidario_Grajau_SB-11.jpg/49bb2577-2653-c620-063a-f93fa5b99747?version=1.0&amp;t=1787849857140" alt="News Image"></a>
11072                   </div>
11073                   <!-- Category Badge (Overlaid on Image) -->
11074                   <div class="card-news-image-top-banner-news-vertical-category">
11075                    <div class="card-news-image-top-banner-vertical-category-text">
11076                     <a href="https://sampanews.sp.gov.br/w/prefeitura-inaugura-8%C2%BA-armaz%C3%A9m-solid%C3%A1rio-da-cidade-na-regi%C3%A3o-com-maior-concentra%C3%A7%C3%A3o-de-fam%C3%ADlias-no-cad%C3%BAnico">Assistência Social</a>
11077                    </div>
11078                   </div>
11079                  </div>
11080                  <!-- News Content (Bottom) -->
11081                  <div class="card-news-image-top-banner-news-vertical-content">
11082                   <!-- News Title -->
11083                   <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-title"><a href="https://sampanews.sp.gov.br/w/prefeitura-inaugura-8%C2%BA-armaz%C3%A9m-solid%C3%A1rio-da-cidade-na-regi%C3%A3o-com-maior-concentra%C3%A7%C3%A3o-de-fam%C3%ADlias-no-cad%C3%BAnico">Prefeitura inaugura 8º Armazém Solidário da cidade na região com maior concentração de famílias no CadÚnico</a></h2>
11084                   <!-- News Headline/Description -->
11085                   <p id="news-headline" data-lfr-editable-id="description" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-headline"><a href="https://sampanews.sp.gov.br/w/prefeitura-inaugura-8%C2%BA-armaz%C3%A9m-solid%C3%A1rio-da-cidade-na-regi%C3%A3o-com-maior-concentra%C3%A7%C3%A3o-de-fam%C3%ADlias-no-cad%C3%BAnico">Unidade do Grajaú comercializa 600 itens com até 50% de desconto, tem 40 funcionários que mora na região e capacidade para 700 atendimentos por dia</a></p>
11086                  </div>
11087                 </div>
11088                </div>
11089               </div>
11090              </div>
11091              
11091<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-e9e6469c-eb3d-dcc7-bd6b-48b98ac12e47'); const fragmentElementId = 'fragment-e9e6469c-eb3d-dcc7-bd6b-48b98ac12e47'; const fragmentEntryLinkNamespace = 'eklx'; const fragmentNamespace = 'eklx'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function () {
11092    let isProcessing = false; // Flag para evitar loops
11093    let observer = null;
11094    let debounceTimeout = null;
11095
11096    function checkForImages() {
11097        // Evita execução simultânea
11098        if (isProcessing) return;
11099        isProcessing = true;
11100
11101        try {
11102            const newsItems = document.querySelectorAll('.card-news-image-top-banner-news-vertical-item');
11103            
11104            newsItems.forEach(function (item) {
11105                const imageContainer = item.querySelector('.card-news-image-top-banner-news-vertical-image');
11106                const img = item.querySelector('.card-news-image-top-banner-news-vertical-img img');
11107                const category = item.querySelector('.card-news-image-top-banner-news-vertical-category');
11108                const content = item.querySelector('.card-news-image-top-banner-news-vertical-content');
11109                
11110                if (img && imageContainer) {
11111                    // Check if image has a valid source (not placeholder or empty)
11112                    const isEmpty = !img.src ||
11113                        img.src === '' ||
11114                        img.src.includes('data:image/svg+xml') ||
11115                        img.src.includes('placeholder') ||
11116                        img.src.includes('default-image');
11117
11118                    // Só modifica se necessário (evita loops desnecessários)
11119                    const currentlyHasNoImage = item.classList.contains('no-image');
11120                    
11121                    if (isEmpty && !currentlyHasNoImage) {
11122                        // Hide image container
11123                        imageContainer.classList.add('no-image');
11124                        item.classList.add('no-image');
11125                        
11126                        // Move category to content area if it exists and not already there
11127                        if (category && content && !content.contains(category)) {
11128                            content.insertBefore(category, content.firstChild);
11129                        }
11130                    } else if (!isEmpty && currentlyHasNoImage) {
11131                        // Show image container
11132                        imageContainer.classList.remove('no-image');
11133                        item.classList.remove('no-image');
11134                        
11135                        // Move category back to image area if it exists and not already there
11136                        if (category && imageContainer && !imageContainer.contains(category)) {
11137                            imageContainer.appendChild(category);
11138                        }
11139                    }
11140                }
11141            });
11142        } catch (error) {
11143            console.error('Erro no checkForImages (banner):', error);
11144        } finally {
11145            isProcessing = false;
11146        }
11147    }
11148
11149    // Função para inicializar o observer uma única vez
11150    function initializeObserver() {
11151        if (observer || !window.MutationObserver) return;
11152        
11153        observer = new MutationObserver(function (mutations) {
11154            // Evita loop: só executa se não estiver processando
11155            if (isProcessing) return;
11156            
11157            let shouldCheck = false;
11158            
11159            mutations.forEach(function (mutation) {
11160                // Só reage a mudanças relevantes
11161                if (mutation.type === 'childList') {
11162                    const target = mutation.target;
11163                    if (target.closest && 
11164                        target.closest('.card-news-image-top-banner-news-vertical-item')) {
11165                        shouldCheck = true;
11166                    }
11167                } else if (mutation.type === 'attributes' && 
11168                          mutation.attributeName === 'src' &&
11169                          mutation.target.tagName === 'IMG') {
11170                    // Só reage a mudanças de src em imagens
11171                    const img = mutation.target;
11172                    if (img.closest('.card-news-image-top-banner-news-vertical-item')) {
11173                        shouldCheck = true;
11174                    }
11175                }
11176            });
11177
11178            if (shouldCheck) {
11179                // Debounce: evita múltiplas execuções rápidas
11180                clearTimeout(debounceTimeout);
11181                debounceTimeout = setTimeout(checkForImages, 150);
11182            }
11183        });
11184
11185        // Observer em elementos relevantes
11186        const bannerSection = document.querySelector('.card-news-image-top-banner-news-vertical-section');
11187        const fallbackTargets = [
11188            bannerSection,
11189            document.querySelector('#main-content'),
11190            document.querySelector('.portlet-boundary'),
11191            document.body
11192        ].filter(Boolean);
11193        
11194        // Observa o primeiro target válido encontrado
11195        if (fallbackTargets.length > 0) {
11196            observer.observe(fallbackTargets[0], {
11197                childList: true,
11198                subtree: true,
11199                attributes: true,
11200                attributeFilter: ['src']
11201            });
11202            
11203            console.log('Banner News Observer inicializado em:', fallbackTargets[0].className || fallbackTargets[0].tagName);
11204        }
11205    }
11206
11207    // Execução inicial
11208    checkForImages();
11209    
11210    // Inicializar observer
11211    initializeObserver();
11212    
11213    // Check adicional após carregamento de imagens (backup)
11214    setTimeout(function() {
11215        if (!isProcessing) {
11216            checkForImages();
11217        }
11218    }, 200);
11219
11220    // Cleanup ao sair da página
11221    window.addEventListener('beforeunload', function() {
11222        if (observer) {
11223            observer.disconnect();
11224        }
11225        clearTimeout(debounceTimeout);
11226    });
11227});;</script>
11227
11228             </div>
11229            </div>
11230            <div class="col col-lg-1 col-sm-12 col-12 col-md-12">
11231             <div class="lfr-layout-structure-item-card-imagem-topo--copiar--1 lfr-layout-structure-item-5f76c8ac-a6f2-8969-1b4f-0a5378a70df1 " data-layout-structure-item-id="5f76c8ac-a6f2-8969-1b4f-0a5378a70df1">
11232              <div id="fragment-5fef57c6-5475-876b-9464-e3070c5c5998">
11233               <div class="card-news-image-top-banner-news-vertical-section">
11234                <!-- News Collection Container -->
11235                <div class="card-news-image-top-banner-news-vertical-list">
11236                 <!-- Individual News Item Template -->
11237                 <div class="card-news-image-top-banner-news-vertical-item">
11238                  <!-- News Image (Top) -->
11239                  <div class="card-news-image-top-banner-news-vertical-image">
11240                   <div class="card-news-image-top-banner-news-vertical-img">
11241                    <a href="https://sampanews.sp.gov.br/w/com-mais-parques-e-%C3%A1reas-verdes-s%C3%A3o-paulo-vira-cen%C3%A1rio-para-descoberta-de-aves-raras-at%C3%A9-no-centro"><img src="https://sampanews.sp.gov.br/documents/24771855/0/Vem+Passarinhar+Fazenda+Castanheiras_CIETE_SILV%C3%89RIO_SECOM.jpg.jpeg/4aab147c-b38b-333e-06c1-fce8a8c2e63e?version=1.0&amp;t=1787580776367" alt="News Image"></a>
11242                   </div>
11243                   <!-- Category Badge (Overlaid on Image) -->
11244                   <div class="card-news-image-top-banner-news-vertical-category">
11245                    <div class="card-news-image-top-banner-vertical-category-text">
11246                     <a href="https://sampanews.sp.gov.br/w/com-mais-parques-e-%C3%A1reas-verdes-s%C3%A3o-paulo-vira-cen%C3%A1rio-para-descoberta-de-aves-raras-at%C3%A9-no-centro">Meio Ambiente</a>
11247                    </div>
11248                   </div>
11249                  </div>
11250                  <!-- News Content (Bottom) -->
11251                  <div class="card-news-image-top-banner-news-vertical-content">
11252                   <!-- News Title -->
11253                   <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-title"><a href="https://sampanews.sp.gov.br/w/com-mais-parques-e-%C3%A1reas-verdes-s%C3%A3o-paulo-vira-cen%C3%A1rio-para-descoberta-de-aves-raras-at%C3%A9-no-centro">Com mais parques e áreas verdes, São Paulo vira cenário para descoberta de aves raras até no Centro</a></h2>
11254                   <!-- News Headline/Description -->
11255                   <p id="news-headline" data-lfr-editable-id="description" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-headline"><a href="https://sampanews.sp.gov.br/w/com-mais-parques-e-%C3%A1reas-verdes-s%C3%A3o-paulo-vira-cen%C3%A1rio-para-descoberta-de-aves-raras-at%C3%A9-no-centro">Passeios gratuitos da Prefeitura revelam uma biodiversidade que resiste e se espalha pela metrópole</a></p>
11256                  </div>
11257                 </div>
11258                </div>
11259               </div>
11260              </div>
11261              
11261<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-5fef57c6-5475-876b-9464-e3070c5c5998'); const fragmentElementId = 'fragment-5fef57c6-5475-876b-9464-e3070c5c5998'; const fragmentEntryLinkNamespace = 'eklx'; const fragmentNamespace = 'eklx'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function () {
11262    let isProcessing = false; // Flag para evitar loops
11263    let observer = null;
11264    let debounceTimeout = null;
11265
11266    function checkForImages() {
11267        // Evita execução simultânea
11268        if (isProcessing) return;
11269        isProcessing = true;
11270
11271        try {
11272            const newsItems = document.querySelectorAll('.card-news-image-top-banner-news-vertical-item');
11273            
11274            newsItems.forEach(function (item) {
11275                const imageContainer = item.querySelector('.card-news-image-top-banner-news-vertical-image');
11276                const img = item.querySelector('.card-news-image-top-banner-news-vertical-img img');
11277                const category = item.querySelector('.card-news-image-top-banner-news-vertical-category');
11278                const content = item.querySelector('.card-news-image-top-banner-news-vertical-content');
11279                
11280                if (img && imageContainer) {
11281                    // Check if image has a valid source (not placeholder or empty)
11282                    const isEmpty = !img.src ||
11283                        img.src === '' ||
11284                        img.src.includes('data:image/svg+xml') ||
11285                        img.src.includes('placeholder') ||
11286                        img.src.includes('default-image');
11287
11288                    // Só modifica se necessário (evita loops desnecessários)
11289                    const currentlyHasNoImage = item.classList.contains('no-image');
11290                    
11291                    if (isEmpty && !currentlyHasNoImage) {
11292                        // Hide image container
11293                        imageContainer.classList.add('no-image');
11294                        item.classList.add('no-image');
11295                        
11296                        // Move category to content area if it exists and not already there
11297                        if (category && content && !content.contains(category)) {
11298                            content.insertBefore(category, content.firstChild);
11299                        }
11300                    } else if (!isEmpty && currentlyHasNoImage) {
11301                        // Show image container
11302                        imageContainer.classList.remove('no-image');
11303                        item.classList.remove('no-image');
11304                        
11305                        // Move category back to image area if it exists and not already there
11306                        if (category && imageContainer && !imageContainer.contains(category)) {
11307                            imageContainer.appendChild(category);
11308                        }
11309                    }
11310                }
11311            });
11312        } catch (error) {
11313            console.error('Erro no checkForImages (banner):', error);
11314        } finally {
11315            isProcessing = false;
11316        }
11317    }
11318
11319    // Função para inicializar o observer uma única vez
11320    function initializeObserver() {
11321        if (observer || !window.MutationObserver) return;
11322        
11323        observer = new MutationObserver(function (mutations) {
11324            // Evita loop: só executa se não estiver processando
11325            if (isProcessing) return;
11326            
11327            let shouldCheck = false;
11328            
11329            mutations.forEach(function (mutation) {
11330                // Só reage a mudanças relevantes
11331                if (mutation.type === 'childList') {
11332                    const target = mutation.target;
11333                    if (target.closest && 
11334                        target.closest('.card-news-image-top-banner-news-vertical-item')) {
11335                        shouldCheck = true;
11336                    }
11337                } else if (mutation.type === 'attributes' && 
11338                          mutation.attributeName === 'src' &&
11339                          mutation.target.tagName === 'IMG') {
11340                    // Só reage a mudanças de src em imagens
11341                    const img = mutation.target;
11342                    if (img.closest('.card-news-image-top-banner-news-vertical-item')) {
11343                        shouldCheck = true;
11344                    }
11345                }
11346            });
11347
11348            if (shouldCheck) {
11349                // Debounce: evita múltiplas execuções rápidas
11350                clearTimeout(debounceTimeout);
11351                debounceTimeout = setTimeout(checkForImages, 150);
11352            }
11353        });
11354
11355        // Observer em elementos relevantes
11356        const bannerSection = document.querySelector('.card-news-image-top-banner-news-vertical-section');
11357        const fallbackTargets = [
11358            bannerSection,
11359            document.querySelector('#main-content'),
11360            document.querySelector('.portlet-boundary'),
11361            document.body
11362        ].filter(Boolean);
11363        
11364        // Observa o primeiro target válido encontrado
11365        if (fallbackTargets.length > 0) {
11366            observer.observe(fallbackTargets[0], {
11367                childList: true,
11368                subtree: true,
11369                attributes: true,
11370                attributeFilter: ['src']
11371            });
11372            
11373            console.log('Banner News Observer inicializado em:', fallbackTargets[0].className || fallbackTargets[0].tagName);
11374        }
11375    }
11376
11377    // Execução inicial
11378    checkForImages();
11379    
11380    // Inicializar observer
11381    initializeObserver();
11382    
11383    // Check adicional após carregamento de imagens (backup)
11384    setTimeout(function() {
11385        if (!isProcessing) {
11386            checkForImages();
11387        }
11388    }, 200);
11389
11390    // Cleanup ao sair da página
11391    window.addEventListener('beforeunload', function() {
11392        if (observer) {
11393            observer.disconnect();
11394        }
11395        clearTimeout(debounceTimeout);
11396    });
11397});;</script>
11397
11398             </div>
11399            </div>
11400            <div class="col col-lg-1 col-sm-12 col-12 col-md-12">
11401             <div class="lfr-layout-structure-item-card-imagem-topo--copiar--1 lfr-layout-structure-item-5f76c8ac-a6f2-8969-1b4f-0a5378a70df1 " data-layout-structure-item-id="5f76c8ac-a6f2-8969-1b4f-0a5378a70df1">
11402              <div id="fragment-1527eefa-7a21-e61a-17c1-7f94d0adf1c3">
11403               <div class="card-news-image-top-banner-news-vertical-section">
11404                <!-- News Collection Container -->
11405                <div class="card-news-image-top-banner-news-vertical-list">
11406                 <!-- Individual News Item Template -->
11407                 <div class="card-news-image-top-banner-news-vertical-item">
11408                  <!-- News Image (Top) -->
11409                  <div class="card-news-image-top-banner-news-vertical-image">
11410                   <div class="card-news-image-top-banner-news-vertical-img">
11411                    <a href="https://sampanews.sp.gov.br/w/s%C3%A3o-paulo-se-prepara-para-uma-cidade-mais-longeva"><img src="https://sampanews.sp.gov.br/documents/34276/0/Destaque+longevidade.jpg/daae5337-ad57-6f2f-89a5-59c991b1a7af?version=1.0&amp;t=1787346379739" alt="News Image"></a>
11412                   </div>
11413                   <!-- Category Badge (Overlaid on Image) -->
11414                   <div class="card-news-image-top-banner-news-vertical-category">
11415                    <div class="card-news-image-top-banner-vertical-category-text">
11416                     <a href="https://sampanews.sp.gov.br/w/s%C3%A3o-paulo-se-prepara-para-uma-cidade-mais-longeva">Gestão</a>
11417                    </div>
11418                   </div>
11419                  </div>
11420                  <!-- News Content (Bottom) -->
11421                  <div class="card-news-image-top-banner-news-vertical-content">
11422                   <!-- News Title -->
11423                   <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-title"><a href="https://sampanews.sp.gov.br/w/s%C3%A3o-paulo-se-prepara-para-uma-cidade-mais-longeva">São Paulo se prepara para uma cidade mais longeva</a></h2>
11424                   <!-- News Headline/Description -->
11425                   <p id="news-headline" data-lfr-editable-id="description" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-headline"><a href="https://sampanews.sp.gov.br/w/s%C3%A3o-paulo-se-prepara-para-uma-cidade-mais-longeva">Políticas públicas integradas em diferentes áreas preparam a capital para uma nova realidade demográfica, com ações voltadas à autonomia, qualidade de vida e participação social</a></p>
11426                  </div>
11427                 </div>
11428                </div>
11429               </div>
11430              </div>
11431              
11431<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-1527eefa-7a21-e61a-17c1-7f94d0adf1c3'); const fragmentElementId = 'fragment-1527eefa-7a21-e61a-17c1-7f94d0adf1c3'; const fragmentEntryLinkNamespace = 'eklx'; const fragmentNamespace = 'eklx'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function () {
11432    let isProcessing = false; // Flag para evitar loops
11433    let observer = null;
11434    let debounceTimeout = null;
11435
11436    function checkForImages() {
11437        // Evita execução simultânea
11438        if (isProcessing) return;
11439        isProcessing = true;
11440
11441        try {
11442            const newsItems = document.querySelectorAll('.card-news-image-top-banner-news-vertical-item');
11443            
11444            newsItems.forEach(function (item) {
11445                const imageContainer = item.querySelector('.card-news-image-top-banner-news-vertical-image');
11446                const img = item.querySelector('.card-news-image-top-banner-news-vertical-img img');
11447                const category = item.querySelector('.card-news-image-top-banner-news-vertical-category');
11448                const content = item.querySelector('.card-news-image-top-banner-news-vertical-content');
11449                
11450                if (img && imageContainer) {
11451                    // Check if image has a valid source (not placeholder or empty)
11452                    const isEmpty = !img.src ||
11453                        img.src === '' ||
11454                        img.src.includes('data:image/svg+xml') ||
11455                        img.src.includes('placeholder') ||
11456                        img.src.includes('default-image');
11457
11458                    // Só modifica se necessário (evita loops desnecessários)
11459                    const currentlyHasNoImage = item.classList.contains('no-image');
11460                    
11461                    if (isEmpty && !currentlyHasNoImage) {
11462                        // Hide image container
11463                        imageContainer.classList.add('no-image');
11464                        item.classList.add('no-image');
11465                        
11466                        // Move category to content area if it exists and not already there
11467                        if (category && content && !content.contains(category)) {
11468                            content.insertBefore(category, content.firstChild);
11469                        }
11470                    } else if (!isEmpty && currentlyHasNoImage) {
11471                        // Show image container
11472                        imageContainer.classList.remove('no-image');
11473                        item.classList.remove('no-image');
11474                        
11475                        // Move category back to image area if it exists and not already there
11476                        if (category && imageContainer && !imageContainer.contains(category)) {
11477                            imageContainer.appendChild(category);
11478                        }
11479                    }
11480                }
11481            });
11482        } catch (error) {
11483            console.error('Erro no checkForImages (banner):', error);
11484        } finally {
11485            isProcessing = false;
11486        }
11487    }
11488
11489    // Função para inicializar o observer uma única vez
11490    function initializeObserver() {
11491        if (observer || !window.MutationObserver) return;
11492        
11493        observer = new MutationObserver(function (mutations) {
11494            // Evita loop: só executa se não estiver processando
11495            if (isProcessing) return;
11496            
11497            let shouldCheck = false;
11498            
11499            mutations.forEach(function (mutation) {
11500                // Só reage a mudanças relevantes
11501                if (mutation.type === 'childList') {
11502                    const target = mutation.target;
11503                    if (target.closest && 
11504                        target.closest('.card-news-image-top-banner-news-vertical-item')) {
11505                        shouldCheck = true;
11506                    }
11507                } else if (mutation.type === 'attributes' && 
11508                          mutation.attributeName === 'src' &&
11509                          mutation.target.tagName === 'IMG') {
11510                    // Só reage a mudanças de src em imagens
11511                    const img = mutation.target;
11512                    if (img.closest('.card-news-image-top-banner-news-vertical-item')) {
11513                        shouldCheck = true;
11514                    }
11515                }
11516            });
11517
11518            if (shouldCheck) {
11519                // Debounce: evita múltiplas execuções rápidas
11520                clearTimeout(debounceTimeout);
11521                debounceTimeout = setTimeout(checkForImages, 150);
11522            }
11523        });
11524
11525        // Observer em elementos relevantes
11526        const bannerSection = document.querySelector('.card-news-image-top-banner-news-vertical-section');
11527        const fallbackTargets = [
11528            bannerSection,
11529            document.querySelector('#main-content'),
11530            document.querySelector('.portlet-boundary'),
11531            document.body
11532        ].filter(Boolean);
11533        
11534        // Observa o primeiro target válido encontrado
11535        if (fallbackTargets.length > 0) {
11536            observer.observe(fallbackTargets[0], {
11537                childList: true,
11538                subtree: true,
11539                attributes: true,
11540                attributeFilter: ['src']
11541            });
11542            
11543            console.log('Banner News Observer inicializado em:', fallbackTargets[0].className || fallbackTargets[0].tagName);
11544        }
11545    }
11546
11547    // Execução inicial
11548    checkForImages();
11549    
11550    // Inicializar observer
11551    initializeObserver();
11552    
11553    // Check adicional após carregamento de imagens (backup)
11554    setTimeout(function() {
11555        if (!isProcessing) {
11556            checkForImages();
11557        }
11558    }, 200);
11559
11560    // Cleanup ao sair da página
11561    window.addEventListener('beforeunload', function() {
11562        if (observer) {
11563            observer.disconnect();
11564        }
11565        clearTimeout(debounceTimeout);
11566    });
11567});;</script>
11567
11568             </div>
11569            </div>
11570            <div class="col col-lg-1 col-sm-12 col-12 col-md-12">
11571             <div class="lfr-layout-structure-item-card-imagem-topo--copiar--1 lfr-layout-structure-item-5f76c8ac-a6f2-8969-1b4f-0a5378a70df1 " data-layout-structure-item-id="5f76c8ac-a6f2-8969-1b4f-0a5378a70df1">
11572              <div id="fragment-080a8358-d0b3-5f94-8c09-012e45f21fdd">
11573               <div class="card-news-image-top-banner-news-vertical-section">
11574                <!-- News Collection Container -->
11575                <div class="card-news-image-top-banner-news-vertical-list">
11576                 <!-- Individual News Item Template -->
11577                 <div class="card-news-image-top-banner-news-vertical-item">
11578                  <!-- News Image (Top) -->
11579                  <div class="card-news-image-top-banner-news-vertical-image">
11580                   <div class="card-news-image-top-banner-news-vertical-img">
11581                    <a href="https://sampanews.sp.gov.br/w/aut%C3%B3dromo-de-interlagos-recebe-terceira-edi%C3%A7%C3%A3o-do-the-town-nos-dias-4-5-6-11-e-12-de-setembro-de-2027"><img src="https://sampanews.sp.gov.br/documents/24771855/0/Datas_Apresenta%C3%A7%C3%A3o+%281%29.png/28fca69d-cf69-399d-03d7-8b16470805ee?version=1.0&amp;t=1787329397927" alt="News Image"></a>
11582                   </div>
11583                   <!-- Category Badge (Overlaid on Image) -->
11584                   <div class="card-news-image-top-banner-news-vertical-category">
11585                    <div class="card-news-image-top-banner-vertical-category-text">
11586                     <a href="https://sampanews.sp.gov.br/w/aut%C3%B3dromo-de-interlagos-recebe-terceira-edi%C3%A7%C3%A3o-do-the-town-nos-dias-4-5-6-11-e-12-de-setembro-de-2027">Turismo E Negócios</a>
11587                    </div>
11588                   </div>
11589                  </div>
11590                  <!-- News Content (Bottom) -->
11591                  <div class="card-news-image-top-banner-news-vertical-content">
11592                   <!-- News Title -->
11593                   <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-title"><a href="https://sampanews.sp.gov.br/w/aut%C3%B3dromo-de-interlagos-recebe-terceira-edi%C3%A7%C3%A3o-do-the-town-nos-dias-4-5-6-11-e-12-de-setembro-de-2027">Autódromo de Interlagos recebe terceira edição do The Town nos dias 4, 5, 6, 11 e 12 de setembro de 2027</a></h2>
11594                   <!-- News Headline/Description -->
11595                   <p id="news-headline" data-lfr-editable-id="description" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-headline"><a href="https://sampanews.sp.gov.br/w/aut%C3%B3dromo-de-interlagos-recebe-terceira-edi%C3%A7%C3%A3o-do-the-town-nos-dias-4-5-6-11-e-12-de-setembro-de-2027">Anúncio das datas foi feito nesta sexta-feira (21), durante reunião na Prefeitura; festival já é um marco da cidade e prevê novos recordes no próximo ano</a></p>
11596                  </div>
11597                 </div>
11598                </div>
11599               </div>
11600              </div>
11601              
11601<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-080a8358-d0b3-5f94-8c09-012e45f21fdd'); const fragmentElementId = 'fragment-080a8358-d0b3-5f94-8c09-012e45f21fdd'; const fragmentEntryLinkNamespace = 'eklx'; const fragmentNamespace = 'eklx'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function () {
11602    let isProcessing = false; // Flag para evitar loops
11603    let observer = null;
11604    let debounceTimeout = null;
11605
11606    function checkForImages() {
11607        // Evita execução simultânea
11608        if (isProcessing) return;
11609        isProcessing = true;
11610
11611        try {
11612            const newsItems = document.querySelectorAll('.card-news-image-top-banner-news-vertical-item');
11613            
11614            newsItems.forEach(function (item) {
11615                const imageContainer = item.querySelector('.card-news-image-top-banner-news-vertical-image');
11616                const img = item.querySelector('.card-news-image-top-banner-news-vertical-img img');
11617                const category = item.querySelector('.card-news-image-top-banner-news-vertical-category');
11618                const content = item.querySelector('.card-news-image-top-banner-news-vertical-content');
11619                
11620                if (img && imageContainer) {
11621                    // Check if image has a valid source (not placeholder or empty)
11622                    const isEmpty = !img.src ||
11623                        img.src === '' ||
11624                        img.src.includes('data:image/svg+xml') ||
11625                        img.src.includes('placeholder') ||
11626                        img.src.includes('default-image');
11627
11628                    // Só modifica se necessário (evita loops desnecessários)
11629                    const currentlyHasNoImage = item.classList.contains('no-image');
11630                    
11631                    if (isEmpty && !currentlyHasNoImage) {
11632                        // Hide image container
11633                        imageContainer.classList.add('no-image');
11634                        item.classList.add('no-image');
11635                        
11636                        // Move category to content area if it exists and not already there
11637                        if (category && content && !content.contains(category)) {
11638                            content.insertBefore(category, content.firstChild);
11639                        }
11640                    } else if (!isEmpty && currentlyHasNoImage) {
11641                        // Show image container
11642                        imageContainer.classList.remove('no-image');
11643                        item.classList.remove('no-image');
11644                        
11645                        // Move category back to image area if it exists and not already there
11646                        if (category && imageContainer && !imageContainer.contains(category)) {
11647                            imageContainer.appendChild(category);
11648                        }
11649                    }
11650                }
11651            });
11652        } catch (error) {
11653            console.error('Erro no checkForImages (banner):', error);
11654        } finally {
11655            isProcessing = false;
11656        }
11657    }
11658
11659    // Função para inicializar o observer uma única vez
11660    function initializeObserver() {
11661        if (observer || !window.MutationObserver) return;
11662        
11663        observer = new MutationObserver(function (mutations) {
11664            // Evita loop: só executa se não estiver processando
11665            if (isProcessing) return;
11666            
11667            let shouldCheck = false;
11668            
11669            mutations.forEach(function (mutation) {
11670                // Só reage a mudanças relevantes
11671                if (mutation.type === 'childList') {
11672                    const target = mutation.target;
11673                    if (target.closest && 
11674                        target.closest('.card-news-image-top-banner-news-vertical-item')) {
11675                        shouldCheck = true;
11676                    }
11677                } else if (mutation.type === 'attributes' && 
11678                          mutation.attributeName === 'src' &&
11679                          mutation.target.tagName === 'IMG') {
11680                    // Só reage a mudanças de src em imagens
11681                    const img = mutation.target;
11682                    if (img.closest('.card-news-image-top-banner-news-vertical-item')) {
11683                        shouldCheck = true;
11684                    }
11685                }
11686            });
11687
11688            if (shouldCheck) {
11689                // Debounce: evita múltiplas execuções rápidas
11690                clearTimeout(debounceTimeout);
11691                debounceTimeout = setTimeout(checkForImages, 150);
11692            }
11693        });
11694
11695        // Observer em elementos relevantes
11696        const bannerSection = document.querySelector('.card-news-image-top-banner-news-vertical-section');
11697        const fallbackTargets = [
11698            bannerSection,
11699            document.querySelector('#main-content'),
11700            document.querySelector('.portlet-boundary'),
11701            document.body
11702        ].filter(Boolean);
11703        
11704        // Observa o primeiro target válido encontrado
11705        if (fallbackTargets.length > 0) {
11706            observer.observe(fallbackTargets[0], {
11707                childList: true,
11708                subtree: true,
11709                attributes: true,
11710                attributeFilter: ['src']
11711            });
11712            
11713            console.log('Banner News Observer inicializado em:', fallbackTargets[0].className || fallbackTargets[0].tagName);
11714        }
11715    }
11716
11717    // Execução inicial
11718    checkForImages();
11719    
11720    // Inicializar observer
11721    initializeObserver();
11722    
11723    // Check adicional após carregamento de imagens (backup)
11724    setTimeout(function() {
11725        if (!isProcessing) {
11726            checkForImages();
11727        }
11728    }, 200);
11729
11730    // Cleanup ao sair da página
11731    window.addEventListener('beforeunload', function() {
11732        if (observer) {
11733            observer.disconnect();
11734        }
11735        clearTimeout(debounceTimeout);
11736    });
11737});;</script>
11737
11738             </div>
11739            </div>
11740            <div class="col col-lg-1 col-sm-12 col-12 col-md-12">
11741             <div class="lfr-layout-structure-item-card-imagem-topo--copiar--1 lfr-layout-structure-item-5f76c8ac-a6f2-8969-1b4f-0a5378a70df1 " data-layout-structure-item-id="5f76c8ac-a6f2-8969-1b4f-0a5378a70df1">
11742              <div id="fragment-868401ee-303f-4f51-b04b-812dad07d5d3">
11743               <div class="card-news-image-top-banner-news-vertical-section">
11744                <!-- News Collection Container -->
11745                <div class="card-news-image-top-banner-news-vertical-list">
11746                 <!-- Individual News Item Template -->
11747                 <div class="card-news-image-top-banner-news-vertical-item">
11748                  <!-- News Image (Top) -->
11749                  <div class="card-news-image-top-banner-news-vertical-image">
11750                   <div class="card-news-image-top-banner-news-vertical-img">
11751                    <a href="https://sampanews.sp.gov.br/w/cidade-com-mais-jogos-s%C3%A3o-paulo-receber%C3%A1-10-partidas-da-copa-do-mundo-feminina-2027"><img src="https://sampanews.sp.gov.br/documents/24771855/0/260121_FWWC_LAUNCH_DIGITAL_HOST_CITIES-25.jpg/450494db-f97c-b5f6-0431-a1b5ca23d5de?version=1.0&amp;t=1787234480827" alt="News Image"></a>
11752                   </div>
11753                   <!-- Category Badge (Overlaid on Image) -->
11754                   <div class="card-news-image-top-banner-news-vertical-category">
11755                    <div class="card-news-image-top-banner-vertical-category-text">
11756                     <a href="https://sampanews.sp.gov.br/w/cidade-com-mais-jogos-s%C3%A3o-paulo-receber%C3%A1-10-partidas-da-copa-do-mundo-feminina-2027">Esportes</a>
11757                    </div>
11758                   </div>
11759                  </div>
11760                  <!-- News Content (Bottom) -->
11761                  <div class="card-news-image-top-banner-news-vertical-content">
11762                   <!-- News Title -->
11763                   <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-title"><a href="https://sampanews.sp.gov.br/w/cidade-com-mais-jogos-s%C3%A3o-paulo-receber%C3%A1-10-partidas-da-copa-do-mundo-feminina-2027">Cidade com mais jogos, São Paulo receberá 10 partidas da Copa do Mundo Feminina 2027</a></h2>
11764                   <!-- News Headline/Description -->
11765                   <p id="news-headline" data-lfr-editable-id="description" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-headline"><a href="https://sampanews.sp.gov.br/w/cidade-com-mais-jogos-s%C3%A3o-paulo-receber%C3%A1-10-partidas-da-copa-do-mundo-feminina-2027">Capital será sede do jogo da Seleção Brasileira na segunda rodada, de uma das semifinais e da disputa pelo terceiro lugar; Prefeitura atua para garantir estrutura e ampliar o legado do torneio</a></p>
11766                  </div>
11767                 </div>
11768                </div>
11769               </div>
11770              </div>
11771              
11771<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-868401ee-303f-4f51-b04b-812dad07d5d3'); const fragmentElementId = 'fragment-868401ee-303f-4f51-b04b-812dad07d5d3'; const fragmentEntryLinkNamespace = 'eklx'; const fragmentNamespace = 'eklx'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function () {
11772    let isProcessing = false; // Flag para evitar loops
11773    let observer = null;
11774    let debounceTimeout = null;
11775
11776    function checkForImages() {
11777        // Evita execução simultânea
11778        if (isProcessing) return;
11779        isProcessing = true;
11780
11781        try {
11782            const newsItems = document.querySelectorAll('.card-news-image-top-banner-news-vertical-item');
11783            
11784            newsItems.forEach(function (item) {
11785                const imageContainer = item.querySelector('.card-news-image-top-banner-news-vertical-image');
11786                const img = item.querySelector('.card-news-image-top-banner-news-vertical-img img');
11787                const category = item.querySelector('.card-news-image-top-banner-news-vertical-category');
11788                const content = item.querySelector('.card-news-image-top-banner-news-vertical-content');
11789                
11790                if (img && imageContainer) {
11791                    // Check if image has a valid source (not placeholder or empty)
11792                    const isEmpty = !img.src ||
11793                        img.src === '' ||
11794                        img.src.includes('data:image/svg+xml') ||
11795                        img.src.includes('placeholder') ||
11796                        img.src.includes('default-image');
11797
11798                    // Só modifica se necessário (evita loops desnecessários)
11799                    const currentlyHasNoImage = item.classList.contains('no-image');
11800                    
11801                    if (isEmpty && !currentlyHasNoImage) {
11802                        // Hide image container
11803                        imageContainer.classList.add('no-image');
11804                        item.classList.add('no-image');
11805                        
11806                        // Move category to content area if it exists and not already there
11807                        if (category && content && !content.contains(category)) {
11808                            content.insertBefore(category, content.firstChild);
11809                        }
11810                    } else if (!isEmpty && currentlyHasNoImage) {
11811                        // Show image container
11812                        imageContainer.classList.remove('no-image');
11813                        item.classList.remove('no-image');
11814                        
11815                        // Move category back to image area if it exists and not already there
11816                        if (category && imageContainer && !imageContainer.contains(category)) {
11817                            imageContainer.appendChild(category);
11818                        }
11819                    }
11820                }
11821            });
11822        } catch (error) {
11823            console.error('Erro no checkForImages (banner):', error);
11824        } finally {
11825            isProcessing = false;
11826        }
11827    }
11828
11829    // Função para inicializar o observer uma única vez
11830    function initializeObserver() {
11831        if (observer || !window.MutationObserver) return;
11832        
11833        observer = new MutationObserver(function (mutations) {
11834            // Evita loop: só executa se não estiver processando
11835            if (isProcessing) return;
11836            
11837            let shouldCheck = false;
11838            
11839            mutations.forEach(function (mutation) {
11840                // Só reage a mudanças relevantes
11841                if (mutation.type === 'childList') {
11842                    const target = mutation.target;
11843                    if (target.closest && 
11844                        target.closest('.card-news-image-top-banner-news-vertical-item')) {
11845                        shouldCheck = true;
11846                    }
11847                } else if (mutation.type === 'attributes' && 
11848                          mutation.attributeName === 'src' &&
11849                          mutation.target.tagName === 'IMG') {
11850                    // Só reage a mudanças de src em imagens
11851                    const img = mutation.target;
11852                    if (img.closest('.card-news-image-top-banner-news-vertical-item')) {
11853                        shouldCheck = true;
11854                    }
11855                }
11856            });
11857
11858            if (shouldCheck) {
11859                // Debounce: evita múltiplas execuções rápidas
11860                clearTimeout(debounceTimeout);
11861                debounceTimeout = setTimeout(checkForImages, 150);
11862            }
11863        });
11864
11865        // Observer em elementos relevantes
11866        const bannerSection = document.querySelector('.card-news-image-top-banner-news-vertical-section');
11867        const fallbackTargets = [
11868            bannerSection,
11869            document.querySelector('#main-content'),
11870            document.querySelector('.portlet-boundary'),
11871            document.body
11872        ].filter(Boolean);
11873        
11874        // Observa o primeiro target válido encontrado
11875        if (fallbackTargets.length > 0) {
11876            observer.observe(fallbackTargets[0], {
11877                childList: true,
11878                subtree: true,
11879                attributes: true,
11880                attributeFilter: ['src']
11881            });
11882            
11883            console.log('Banner News Observer inicializado em:', fallbackTargets[0].className || fallbackTargets[0].tagName);
11884        }
11885    }
11886
11887    // Execução inicial
11888    checkForImages();
11889    
11890    // Inicializar observer
11891    initializeObserver();
11892    
11893    // Check adicional após carregamento de imagens (backup)
11894    setTimeout(function() {
11895        if (!isProcessing) {
11896            checkForImages();
11897        }
11898    }, 200);
11899
11900    // Cleanup ao sair da página
11901    window.addEventListener('beforeunload', function() {
11902        if (observer) {
11903            observer.disconnect();
11904        }
11905        clearTimeout(debounceTimeout);
11906    });
11907});;</script>
11907
11908             </div>
11909            </div>
11910            <div class="col col-lg-1 col-sm-12 col-12 col-md-12">
11911             <div class="lfr-layout-structure-item-card-imagem-topo--copiar--1 lfr-layout-structure-item-5f76c8ac-a6f2-8969-1b4f-0a5378a70df1 " data-layout-structure-item-id="5f76c8ac-a6f2-8969-1b4f-0a5378a70df1">
11912              <div id="fragment-e35ccb5e-6ba5-42e4-8e38-5d461b23e475">
11913               <div class="card-news-image-top-banner-news-vertical-section">
11914                <!-- News Collection Container -->
11915                <div class="card-news-image-top-banner-news-vertical-list">
11916                 <!-- Individual News Item Template -->
11917                 <div class="card-news-image-top-banner-news-vertical-item">
11918                  <!-- News Image (Top) -->
11919                  <div class="card-news-image-top-banner-news-vertical-image">
11920                   <div class="card-news-image-top-banner-news-vertical-img">
11921                    <a href="https://sampanews.sp.gov.br/w/turismo-em-s%C3%A3o-paulo-registra-recorde-para-junho-e-movimenta-r-2-21-bilh%C3%B5es-na-economia"><img src="https://sampanews.sp.gov.br/documents/24771855/0/WhatsApp+Image+2026-08-18+at+14.51.54.jpeg/79e00c77-038a-6b40-8824-e901fc805c98?version=1.0&amp;t=1787090905874" alt="News Image"></a>
11922                   </div>
11923                   <!-- Category Badge (Overlaid on Image) -->
11924                   <div class="card-news-image-top-banner-news-vertical-category">
11925                    <div class="card-news-image-top-banner-vertical-category-text">
11926                     <a href="https://sampanews.sp.gov.br/w/turismo-em-s%C3%A3o-paulo-registra-recorde-para-junho-e-movimenta-r-2-21-bilh%C3%B5es-na-economia">Turismo E Negócios</a>
11927                    </div>
11928                   </div>
11929                  </div>
11930                  <!-- News Content (Bottom) -->
11931                  <div class="card-news-image-top-banner-news-vertical-content">
11932                   <!-- News Title -->
11933                   <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-title"><a href="https://sampanews.sp.gov.br/w/turismo-em-s%C3%A3o-paulo-registra-recorde-para-junho-e-movimenta-r-2-21-bilh%C3%B5es-na-economia">Turismo em São Paulo registra recorde para junho e movimenta R$ 2,21 bilhões na economia</a></h2>
11934                   <!-- News Headline/Description -->
11935                   <p id="news-headline" data-lfr-editable-id="description" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-headline"><a href="https://sampanews.sp.gov.br/w/turismo-em-s%C3%A3o-paulo-registra-recorde-para-junho-e-movimenta-r-2-21-bilh%C3%B5es-na-economia">Cidade recebeu 4,24 milhões de turistas no mês, alta de 20,5% em relação a junho de 2025; indicador de atividade turística também atingiu maior patamar da série histórica para o período</a></p>
11936                  </div>
11937                 </div>
11938                </div>
11939               </div>
11940              </div>
11941              
11941<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-e35ccb5e-6ba5-42e4-8e38-5d461b23e475'); const fragmentElementId = 'fragment-e35ccb5e-6ba5-42e4-8e38-5d461b23e475'; const fragmentEntryLinkNamespace = 'eklx'; const fragmentNamespace = 'eklx'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function () {
11942    let isProcessing = false; // Flag para evitar loops
11943    let observer = null;
11944    let debounceTimeout = null;
11945
11946    function checkForImages() {
11947        // Evita execução simultânea
11948        if (isProcessing) return;
11949        isProcessing = true;
11950
11951        try {
11952            const newsItems = document.querySelectorAll('.card-news-image-top-banner-news-vertical-item');
11953            
11954            newsItems.forEach(function (item) {
11955                const imageContainer = item.querySelector('.card-news-image-top-banner-news-vertical-image');
11956                const img = item.querySelector('.card-news-image-top-banner-news-vertical-img img');
11957                const category = item.querySelector('.card-news-image-top-banner-news-vertical-category');
11958                const content = item.querySelector('.card-news-image-top-banner-news-vertical-content');
11959                
11960                if (img && imageContainer) {
11961                    // Check if image has a valid source (not placeholder or empty)
11962                    const isEmpty = !img.src ||
11963                        img.src === '' ||
11964                        img.src.includes('data:image/svg+xml') ||
11965                        img.src.includes('placeholder') ||
11966                        img.src.includes('default-image');
11967
11968                    // Só modifica se necessário (evita loops desnecessários)
11969                    const currentlyHasNoImage = item.classList.contains('no-image');
11970                    
11971                    if (isEmpty && !currentlyHasNoImage) {
11972                        // Hide image container
11973                        imageContainer.classList.add('no-image');
11974                        item.classList.add('no-image');
11975                        
11976                        // Move category to content area if it exists and not already there
11977                        if (category && content && !content.contains(category)) {
11978                            content.insertBefore(category, content.firstChild);
11979                        }
11980                    } else if (!isEmpty && currentlyHasNoImage) {
11981                        // Show image container
11982                        imageContainer.classList.remove('no-image');
11983                        item.classList.remove('no-image');
11984                        
11985                        // Move category back to image area if it exists and not already there
11986                        if (category && imageContainer && !imageContainer.contains(category)) {
11987                            imageContainer.appendChild(category);
11988                        }
11989                    }
11990                }
11991            });
11992        } catch (error) {
11993            console.error('Erro no checkForImages (banner):', error);
11994        } finally {
11995            isProcessing = false;
11996        }
11997    }
11998
11999    // Função para inicializar o observer uma única vez
12000    function initializeObserver() {
12001        if (observer || !window.MutationObserver) return;
12002        
12003        observer = new MutationObserver(function (mutations) {
12004            // Evita loop: só executa se não estiver processando
12005            if (isProcessing) return;
12006            
12007            let shouldCheck = false;
12008            
12009            mutations.forEach(function (mutation) {
12010                // Só reage a mudanças relevantes
12011                if (mutation.type === 'childList') {
12012                    const target = mutation.target;
12013                    if (target.closest && 
12014                        target.closest('.card-news-image-top-banner-news-vertical-item')) {
12015                        shouldCheck = true;
12016                    }
12017                } else if (mutation.type === 'attributes' && 
12018                          mutation.attributeName === 'src' &&
12019                          mutation.target.tagName === 'IMG') {
12020                    // Só reage a mudanças de src em imagens
12021                    const img = mutation.target;
12022                    if (img.closest('.card-news-image-top-banner-news-vertical-item')) {
12023                        shouldCheck = true;
12024                    }
12025                }
12026            });
12027
12028            if (shouldCheck) {
12029                // Debounce: evita múltiplas execuções rápidas
12030                clearTimeout(debounceTimeout);
12031                debounceTimeout = setTimeout(checkForImages, 150);
12032            }
12033        });
12034
12035        // Observer em elementos relevantes
12036        const bannerSection = document.querySelector('.card-news-image-top-banner-news-vertical-section');
12037        const fallbackTargets = [
12038            bannerSection,
12039            document.querySelector('#main-content'),
12040            document.querySelector('.portlet-boundary'),
12041            document.body
12042        ].filter(Boolean);
12043        
12044        // Observa o primeiro target válido encontrado
12045        if (fallbackTargets.length > 0) {
12046            observer.observe(fallbackTargets[0], {
12047                childList: true,
12048                subtree: true,
12049                attributes: true,
12050                attributeFilter: ['src']
12051            });
12052            
12053            console.log('Banner News Observer inicializado em:', fallbackTargets[0].className || fallbackTargets[0].tagName);
12054        }
12055    }
12056
12057    // Execução inicial
12058    checkForImages();
12059    
12060    // Inicializar observer
12061    initializeObserver();
12062    
12063    // Check adicional após carregamento de imagens (backup)
12064    setTimeout(function() {
12065        if (!isProcessing) {
12066            checkForImages();
12067        }
12068    }, 200);
12069
12070    // Cleanup ao sair da página
12071    window.addEventListener('beforeunload', function() {
12072        if (observer) {
12073            observer.disconnect();
12074        }
12075        clearTimeout(debounceTimeout);
12076    });
12077});;</script>
12077
12078             </div>
12079            </div>
12080            <div class="col col-lg-1 col-sm-12 col-12 col-md-12">
12081             <div class="lfr-layout-structure-item-card-imagem-topo--copiar--1 lfr-layout-structure-item-5f76c8ac-a6f2-8969-1b4f-0a5378a70df1 " data-layout-structure-item-id="5f76c8ac-a6f2-8969-1b4f-0a5378a70df1">
12082              <div id="fragment-a4c9acff-79a5-746b-23a4-64146de015c0">
12083               <div class="card-news-image-top-banner-news-vertical-section">
12084                <!-- News Collection Container -->
12085                <div class="card-news-image-top-banner-news-vertical-list">
12086                 <!-- Individual News Item Template -->
12087                 <div class="card-news-image-top-banner-news-vertical-item">
12088                  <!-- News Image (Top) -->
12089                  <div class="card-news-image-top-banner-news-vertical-image">
12090                   <div class="card-news-image-top-banner-news-vertical-img">
12091                    <a href="https://sampanews.sp.gov.br/w/prefeitura-amplia-retrofit-no-centro-com-r-200-milh%C3%B5es-e-prioriza-moradia-popular"><img src="https://sampanews.sp.gov.br/documents/24771855/0/20260812_Edital_de_+Requalifica%C3%A7%C3%A3o_do_Centro_SB-00.jpg/d1652a19-52b7-f78e-c864-005e04cc4465?version=1.0&amp;t=1786971211122" alt="News Image"></a>
12092                   </div>
12093                   <!-- Category Badge (Overlaid on Image) -->
12094                   <div class="card-news-image-top-banner-news-vertical-category">
12095                    <div class="card-news-image-top-banner-vertical-category-text">
12096                     <a href="https://sampanews.sp.gov.br/w/prefeitura-amplia-retrofit-no-centro-com-r-200-milh%C3%B5es-e-prioriza-moradia-popular">Habitação</a>
12097                    </div>
12098                   </div>
12099                  </div>
12100                  <!-- News Content (Bottom) -->
12101                  <div class="card-news-image-top-banner-news-vertical-content">
12102                   <!-- News Title -->
12103                   <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-title"><a href="https://sampanews.sp.gov.br/w/prefeitura-amplia-retrofit-no-centro-com-r-200-milh%C3%B5es-e-prioriza-moradia-popular">Prefeitura amplia retrofit no Centro com R$ 200 milhões e prioriza moradia popular</a></h2>
12104                   <!-- News Headline/Description -->
12105                   <p id="news-headline" data-lfr-editable-id="description" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-headline"><a href="https://sampanews.sp.gov.br/w/prefeitura-amplia-retrofit-no-centro-com-r-200-milh%C3%B5es-e-prioriza-moradia-popular">Quarto chamamento da Subvenção Econômica vale para toda a região central e também incentiva a recuperação de cinemas de rua e equipamentos culturais; aporte total será de R$ 1 bilhão</a></p>
12106                  </div>
12107                 </div>
12108                </div>
12109               </div>
12110              </div>
12111              
12111<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-a4c9acff-79a5-746b-23a4-64146de015c0'); const fragmentElementId = 'fragment-a4c9acff-79a5-746b-23a4-64146de015c0'; const fragmentEntryLinkNamespace = 'eklx'; const fragmentNamespace = 'eklx'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function () {
12112    let isProcessing = false; // Flag para evitar loops
12113    let observer = null;
12114    let debounceTimeout = null;
12115
12116    function checkForImages() {
12117        // Evita execução simultânea
12118        if (isProcessing) return;
12119        isProcessing = true;
12120
12121        try {
12122            const newsItems = document.querySelectorAll('.card-news-image-top-banner-news-vertical-item');
12123            
12124            newsItems.forEach(function (item) {
12125                const imageContainer = item.querySelector('.card-news-image-top-banner-news-vertical-image');
12126                const img = item.querySelector('.card-news-image-top-banner-news-vertical-img img');
12127                const category = item.querySelector('.card-news-image-top-banner-news-vertical-category');
12128                const content = item.querySelector('.card-news-image-top-banner-news-vertical-content');
12129                
12130                if (img && imageContainer) {
12131                    // Check if image has a valid source (not placeholder or empty)
12132                    const isEmpty = !img.src ||
12133                        img.src === '' ||
12134                        img.src.includes('data:image/svg+xml') ||
12135                        img.src.includes('placeholder') ||
12136                        img.src.includes('default-image');
12137
12138                    // Só modifica se necessário (evita loops desnecessários)
12139                    const currentlyHasNoImage = item.classList.contains('no-image');
12140                    
12141                    if (isEmpty && !currentlyHasNoImage) {
12142                        // Hide image container
12143                        imageContainer.classList.add('no-image');
12144                        item.classList.add('no-image');
12145                        
12146                        // Move category to content area if it exists and not already there
12147                        if (category && content && !content.contains(category)) {
12148                            content.insertBefore(category, content.firstChild);
12149                        }
12150                    } else if (!isEmpty && currentlyHasNoImage) {
12151                        // Show image container
12152                        imageContainer.classList.remove('no-image');
12153                        item.classList.remove('no-image');
12154                        
12155                        // Move category back to image area if it exists and not already there
12156                        if (category && imageContainer && !imageContainer.contains(category)) {
12157                            imageContainer.appendChild(category);
12158                        }
12159                    }
12160                }
12161            });
12162        } catch (error) {
12163            console.error('Erro no checkForImages (banner):', error);
12164        } finally {
12165            isProcessing = false;
12166        }
12167    }
12168
12169    // Função para inicializar o observer uma única vez
12170    function initializeObserver() {
12171        if (observer || !window.MutationObserver) return;
12172        
12173        observer = new MutationObserver(function (mutations) {
12174            // Evita loop: só executa se não estiver processando
12175            if (isProcessing) return;
12176            
12177            let shouldCheck = false;
12178            
12179            mutations.forEach(function (mutation) {
12180                // Só reage a mudanças relevantes
12181                if (mutation.type === 'childList') {
12182                    const target = mutation.target;
12183                    if (target.closest && 
12184                        target.closest('.card-news-image-top-banner-news-vertical-item')) {
12185                        shouldCheck = true;
12186                    }
12187                } else if (mutation.type === 'attributes' && 
12188                          mutation.attributeName === 'src' &&
12189                          mutation.target.tagName === 'IMG') {
12190                    // Só reage a mudanças de src em imagens
12191                    const img = mutation.target;
12192                    if (img.closest('.card-news-image-top-banner-news-vertical-item')) {
12193                        shouldCheck = true;
12194                    }
12195                }
12196            });
12197
12198            if (shouldCheck) {
12199                // Debounce: evita múltiplas execuções rápidas
12200                clearTimeout(debounceTimeout);
12201                debounceTimeout = setTimeout(checkForImages, 150);
12202            }
12203        });
12204
12205        // Observer em elementos relevantes
12206        const bannerSection = document.querySelector('.card-news-image-top-banner-news-vertical-section');
12207        const fallbackTargets = [
12208            bannerSection,
12209            document.querySelector('#main-content'),
12210            document.querySelector('.portlet-boundary'),
12211            document.body
12212        ].filter(Boolean);
12213        
12214        // Observa o primeiro target válido encontrado
12215        if (fallbackTargets.length > 0) {
12216            observer.observe(fallbackTargets[0], {
12217                childList: true,
12218                subtree: true,
12219                attributes: true,
12220                attributeFilter: ['src']
12221            });
12222            
12223            console.log('Banner News Observer inicializado em:', fallbackTargets[0].className || fallbackTargets[0].tagName);
12224        }
12225    }
12226
12227    // Execução inicial
12228    checkForImages();
12229    
12230    // Inicializar observer
12231    initializeObserver();
12232    
12233    // Check adicional após carregamento de imagens (backup)
12234    setTimeout(function() {
12235        if (!isProcessing) {
12236            checkForImages();
12237        }
12238    }, 200);
12239
12240    // Cleanup ao sair da página
12241    window.addEventListener('beforeunload', function() {
12242        if (observer) {
12243            observer.disconnect();
12244        }
12245        clearTimeout(debounceTimeout);
12246    });
12247});;</script>
12247
12248             </div>
12249            </div>
12250            <div class="col col-lg-1 col-sm-12 col-12 col-md-12">
12251             <div class="lfr-layout-structure-item-card-imagem-topo--copiar--1 lfr-layout-structure-item-5f76c8ac-a6f2-8969-1b4f-0a5378a70df1 " data-layout-structure-item-id="5f76c8ac-a6f2-8969-1b4f-0a5378a70df1">
12252              <div id="fragment-44954fe3-bfc8-d207-33f7-be140d6cdc7a">
12253               <div class="card-news-image-top-banner-news-vertical-section">
12254                <!-- News Collection Container -->
12255                <div class="card-news-image-top-banner-news-vertical-list">
12256                 <!-- Individual News Item Template -->
12257                 <div class="card-news-image-top-banner-news-vertical-item">
12258                  <!-- News Image (Top) -->
12259                  <div class="card-news-image-top-banner-news-vertical-image">
12260                   <div class="card-news-image-top-banner-news-vertical-img">
12261                    <a href="https://sampanews.sp.gov.br/w/programas-da-prefeitura-incentivam-o-empreendedorismo-e-ampliam-pequenos-neg%C3%B3cios-em-s%C3%A3o-paulo"><img src="https://sampanews.sp.gov.br/documents/34276/0/daniel.jpg/1505bcfa-38b0-b9d3-a19e-a9622230b57b?version=1.0&amp;t=1786139903687" alt="News Image"></a>
12262                   </div>
12263                   <!-- Category Badge (Overlaid on Image) -->
12264                   <div class="card-news-image-top-banner-news-vertical-category">
12265                    <div class="card-news-image-top-banner-vertical-category-text">
12266                     <a href="https://sampanews.sp.gov.br/w/programas-da-prefeitura-incentivam-o-empreendedorismo-e-ampliam-pequenos-neg%C3%B3cios-em-s%C3%A3o-paulo">Trabalho</a>
12267                    </div>
12268                   </div>
12269                  </div>
12270                  <!-- News Content (Bottom) -->
12271                  <div class="card-news-image-top-banner-news-vertical-content">
12272                   <!-- News Title -->
12273                   <h2 id="news-title" data-lfr-editable-id="title" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-title"><a href="https://sampanews.sp.gov.br/w/programas-da-prefeitura-incentivam-o-empreendedorismo-e-ampliam-pequenos-neg%C3%B3cios-em-s%C3%A3o-paulo">Programas da Prefeitura incentivam o empreendedorismo e ampliam pequenos negócios em São Paulo</a></h2>
12274                   <!-- News Headline/Description -->
12275                   <p id="news-headline" data-lfr-editable-id="description" data-lfr-editable-type="text" type="text" class="card-news-image-top-banner-news-vertical-headline"><a href="https://sampanews.sp.gov.br/w/programas-da-prefeitura-incentivam-o-empreendedorismo-e-ampliam-pequenos-neg%C3%B3cios-em-s%C3%A3o-paulo">Iniciativas ajudam artesãos, afroempreendedores, profissionais da gastronomia e empreendedores em geral a divulgarem os seus produtos, conquistarem clientes e melhorarem a renda própria</a></p>
12276                  </div>
12277                 </div>
12278                </div>
12279               </div>
12280              </div>
12281              
12281<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-44954fe3-bfc8-d207-33f7-be140d6cdc7a'); const fragmentElementId = 'fragment-44954fe3-bfc8-d207-33f7-be140d6cdc7a'; const fragmentEntryLinkNamespace = 'eklx'; const fragmentNamespace = 'eklx'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function () {
12282    let isProcessing = false; // Flag para evitar loops
12283    let observer = null;
12284    let debounceTimeout = null;
12285
12286    function checkForImages() {
12287        // Evita execução simultânea
12288        if (isProcessing) return;
12289        isProcessing = true;
12290
12291        try {
12292            const newsItems = document.querySelectorAll('.card-news-image-top-banner-news-vertical-item');
12293            
12294            newsItems.forEach(function (item) {
12295                const imageContainer = item.querySelector('.card-news-image-top-banner-news-vertical-image');
12296                const img = item.querySelector('.card-news-image-top-banner-news-vertical-img img');
12297                const category = item.querySelector('.card-news-image-top-banner-news-vertical-category');
12298                const content = item.querySelector('.card-news-image-top-banner-news-vertical-content');
12299                
12300                if (img && imageContainer) {
12301                    // Check if image has a valid source (not placeholder or empty)
12302                    const isEmpty = !img.src ||
12303                        img.src === '' ||
12304                        img.src.includes('data:image/svg+xml') ||
12305                        img.src.includes('placeholder') ||
12306                        img.src.includes('default-image');
12307
12308                    // Só modifica se necessário (evita loops desnecessários)
12309                    const currentlyHasNoImage = item.classList.contains('no-image');
12310                    
12311                    if (isEmpty && !currentlyHasNoImage) {
12312                        // Hide image container
12313                        imageContainer.classList.add('no-image');
12314                        item.classList.add('no-image');
12315                        
12316                        // Move category to content area if it exists and not already there
12317                        if (category && content && !content.contains(category)) {
12318                            content.insertBefore(category, content.firstChild);
12319                        }
12320                    } else if (!isEmpty && currentlyHasNoImage) {
12321                        // Show image container
12322                        imageContainer.classList.remove('no-image');
12323                        item.classList.remove('no-image');
12324                        
12325                        // Move category back to image area if it exists and not already there
12326                        if (category && imageContainer && !imageContainer.contains(category)) {
12327                            imageContainer.appendChild(category);
12328                        }
12329                    }
12330                }
12331            });
12332        } catch (error) {
12333            console.error('Erro no checkForImages (banner):', error);
12334        } finally {
12335            isProcessing = false;
12336        }
12337    }
12338
12339    // Função para inicializar o observer uma única vez
12340    function initializeObserver() {
12341        if (observer || !window.MutationObserver) return;
12342        
12343        observer = new MutationObserver(function (mutations) {
12344            // Evita loop: só executa se não estiver processando
12345            if (isProcessing) return;
12346            
12347            let shouldCheck = false;
12348            
12349            mutations.forEach(function (mutation) {
12350                // Só reage a mudanças relevantes
12351                if (mutation.type === 'childList') {
12352                    const target = mutation.target;
12353                    if (target.closest && 
12354                        target.closest('.card-news-image-top-banner-news-vertical-item')) {
12355                        shouldCheck = true;
12356                    }
12357                } else if (mutation.type === 'attributes' && 
12358                          mutation.attributeName === 'src' &&
12359                          mutation.target.tagName === 'IMG') {
12360                    // Só reage a mudanças de src em imagens
12361                    const img = mutation.target;
12362                    if (img.closest('.card-news-image-top-banner-news-vertical-item')) {
12363                        shouldCheck = true;
12364                    }
12365                }
12366            });
12367
12368            if (shouldCheck) {
12369                // Debounce: evita múltiplas execuções rápidas
12370                clearTimeout(debounceTimeout);
12371                debounceTimeout = setTimeout(checkForImages, 150);
12372            }
12373        });
12374
12375        // Observer em elementos relevantes
12376        const bannerSection = document.querySelector('.card-news-image-top-banner-news-vertical-section');
12377        const fallbackTargets = [
12378            bannerSection,
12379            document.querySelector('#main-content'),
12380            document.querySelector('.portlet-boundary'),
12381            document.body
12382        ].filter(Boolean);
12383        
12384        // Observa o primeiro target válido encontrado
12385        if (fallbackTargets.length > 0) {
12386            observer.observe(fallbackTargets[0], {
12387                childList: true,
12388                subtree: true,
12389                attributes: true,
12390                attributeFilter: ['src']
12391            });
12392            
12393            console.log('Banner News Observer inicializado em:', fallbackTargets[0].className || fallbackTargets[0].tagName);
12394        }
12395    }
12396
12397    // Execução inicial
12398    checkForImages();
12399    
12400    // Inicializar observer
12401    initializeObserver();
12402    
12403    // Check adicional após carregamento de imagens (backup)
12404    setTimeout(function() {
12405        if (!isProcessing) {
12406            checkForImages();
12407        }
12408    }, 200);
12409
12410    // Cleanup ao sair da página
12411    window.addEventListener('beforeunload', function() {
12412        if (observer) {
12413            observer.disconnect();
12414        }
12415        clearTimeout(debounceTimeout);
12416    });
12417});;</script>
12417
12418             </div>
12419            </div>
12420           </div>
12421          </div>
12422         </div>
12423        </div>
12424       </div>
12425       <!-- Controle próximo -->
12426       <button class="sp-csme-slider-control sp-csme-slider-control--next sp-csme-slider-control--side" onclick="moveCarouselCsme(1)" aria-label="Próximo item" data-action="next"> 
12427        <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
12428         <path d="M9 18L15 12L9 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
12429        </svg> 
12430       </button>
12431      </div>
12432     </div>
12433    </div>
12434   </div>
12435   <style>.sp-csme-psp-slide-crontol
12436  .lfr-layout-structure-item-collection
12437  > .container-fluid
12438  > .row {
12439  flex-wrap: nowrap;
12440  transition: transform 0.3s ease-in-out !important;
12441}
12442
12443.sp-csme-psp-slide-crontol
12444  .lfr-layout-structure-item-collection
12445  > .container-fluid
12446  > .row
12447  > .col {
12448  flex: 0 0 calc(1 / 1 * 100%) !important;
12449  max-width: calc(1 / 1 * 100%) !important;
12450}
12451
12452/* Variáveis CSS para customização */
12453.sp-csme-fragment-slider-container {
12454  --slider-bg: transparent;
12455  --slider-text: #000000;
12456  --slider-icon: #ffffff;
12457  --slider-accent: #ffd700;
12458  --control-bg: #000000;
12459  --control-hover-bg: #131311;
12460	--slider-padding: 0 20px;
12461  --header-gap: 20px;
12462  --item-gap: 16px;
12463}
12464
12465/* Container principal */
12466.sp-csme-fragment-slider-container {
12467  background-color: var(--slider-bg);
12468  color: var(--slider-text);
12469  padding: var(--slider-padding);
12470  position: relative;
12471  overflow: hidden;
12472}
12473
12474.sp-csme-slider-container__wrapper {
12475  width: 95%;
12476  margin: 0 auto;
12477  position: relative;
12478}
12479
12480/* Header com título e controles */
12481.sp-csme-slider-container__header {
12482  display: flex;
12483  justify-content: space-between;
12484  align-items: center;
12485  margin-bottom: var(--header-gap);
12486  flex-wrap: wrap;
12487  gap: 20px;
12488}
12489
12490/* Dropzone do título */
12491.sp-csme-slider-container__title-dropzone {
12492  flex: 1;
12493  min-width: 200px;
12494}
12495
12496.sp-csme-dropzone-title {
12497  min-height: 40px;
12498}
12499
12500/* Título padrão */
12501.sp-csme-default-title .sp-csme-slider-title {
12502  margin: 0;
12503  font-size: clamp(1.5rem, 3vw, 2rem);
12504  font-weight: 700;
12505  display: flex;
12506  align-items: center;
12507  gap: 12px;
12508}
12509
12510.sp-csme-default-title .sp-csme-slider-title .sp-csme-icon {
12511  font-size: 1.2em;
12512}
12513
12514/* Controles de navegação */
12515.sp-csme-slider-container__controls {
12516  display: none; /* Oculta os controles originais do header */
12517}
12518
12519.sp-csme-slider-control {
12520  width: 44px;
12521  height: 44px;
12522  border: 1px solid rgba(255, 255, 255, 0.3);
12523  background-color: var(--control-bg);
12524  color: var(--slider-icon);
12525  border-radius: 4px;
12526  cursor: pointer;
12527  display: flex;
12528  align-items: center;
12529  justify-content: center;
12530  transition: all 0.3s ease;
12531  padding: 0;
12532}
12533
12534/* Estilos para controles laterais */
12535.sp-csme-slider-control--side {
12536  position: absolute;
12537  top: 50%;
12538  transform: translateY(-50%);
12539  width: 30px;
12540  height: 30px;
12541  z-index: 10;
12542  background-color: var(--control-bg);
12543  color: var(--slider-icon);
12544}
12545
12546.sp-csme-slider-control--prev.sp-csme-slider-control--side {
12547  left: -45px;
12548}
12549
12550.sp-csme-slider-control--next.sp-csme-slider-control--side {
12551  right: -45px;
12552}
12553
12554.sp-csme-slider-control:hover:not(:disabled) {
12555  background-color: var(--control-hover-bg);
12556  border-color: rgba(255, 255, 255, 0.5);
12557  transform: translateY(-1px);
12558}
12559
12560.sp-csme-slider-control--side:hover:not(:disabled) {
12561  transform: translateY(-50%) translateY(-1px);
12562}
12563
12564.sp-csme-slider-control:disabled {
12565  opacity: 0.3;
12566  cursor: not-allowed;
12567}
12568
12569.sp-csme-slider-control:focus-visible {
12570  outline: 2px solid var(--slider-accent);
12571  outline-offset: 2px;
12572}
12573
12574/* Área de conteúdo/slider */
12575.sp-csme-slider-container__content {
12576  position: relative;
12577  width: 100%;
12578}
12579
12580.sp-csme-slider-viewport {
12581  width: 100%;
12582  overflow: hidden;
12583  position: relative;
12584}
12585
12586/* Dropzone da coleção */
12587.sp-csme-dropzone-collection {
12588  min-height: 300px;
12589  position: relative;
12590}
12591
12592/* Placeholder do dropzone */
12593.sp-csme-dropzone-placeholder {
12594  display: flex;
12595  align-items: center;
12596  justify-content: center;
12597  min-height: 300px;
12598  border: 2px dashed rgba(255, 255, 255, 0.3);
12599  border-radius: 8px;
12600  background-color: rgba(255, 255, 255, 0.05);
12601  color: rgba(255, 255, 255, 0.5);
12602  font-size: 1.125rem;
12603  text-align: center;
12604  padding: 40px;
12605}
12606
12607/* Quando houver conteúdo no dropzone */
12608.sp-csme-dropzone-collection:not(:empty) .sp-csme-dropzone-placeholder {
12609  display: none;
12610}
12611
12612/* FORÇA LAYOUT HORIZONTAL - Sobrescreve qualquer CSS de grid dos fragmentos filhos */
12613.sp-csme-dropzone-collection > .collection-display-grid,
12614.sp-csme-dropzone-collection > .row {
12615  display: flex !important;
12616  gap: var(--item-gap);
12617  transition: transform 0.5s ease;
12618  flex-wrap: nowrap !important;
12619  width: 100%;
12620}
12621
12622/* Força todos os elementos filhos a seguirem o layout flex */
12623.sp-csme-dropzone-collection .collection-display-grid > *,
12624.sp-csme-dropzone-collection .row > * {
12625  flex: 0 0 auto !important;
12626  width: calc((100% - (var(--item-gap) * 5)) / 6) !important;
12627  min-width: 150px;
12628  display: block !important; /* Remove qualquer display: grid dos filhos */
12629}
12630
12631/* Sobrescreve especificamente o CSS de grid dos vídeos-curtos */
12632.sp-csme-dropzone-collection .sampa-news-videos-grid,
12633.sp-csme-dropzone-collection .sampa-news-videos-grid > * {
12634  display: flex !important;
12635  grid-template-columns: none !important;
12636}
12637
12638/* Responsividade - mantém 6 itens mas ajusta tamanhos mínimos */
12639@media (max-width: 1200px) {
12640  .sp-csme-dropzone-collection .collection-display-grid > *,
12641  .sp-csme-dropzone-collection .row > * {
12642    min-width: 140px;
12643  }
12644}
12645
12646@media (max-width: 992px) {
12647  .sp-csme-fragment-slider-container {
12648    --item-gap: 12px;
12649  }
12650
12651  .sp-csme-dropzone-collection .collection-display-grid > *,
12652  .sp-csme-dropzone-collection .row > * {
12653    min-width: 120px;
12654  }
12655}
12656
12657@media (max-width: 768px) {
12658  .sp-csme-fragment-slider-container {
12659    --slider-padding: 20px;
12660    --item-gap: 10px;
12661  }
12662
12663  .sp-csme-slider-container__header {
12664    flex-direction: column;
12665    align-items: flex-start;
12666  }
12667
12668  /* Ajusta posição dos controles laterais em telas menores */
12669  .sp-csme-slider-control--prev.sp-csme-slider-control--side {
12670    left: -25px;
12671  }
12672
12673  .sp-csme-slider-control--next.sp-csme-slider-control--side {
12674    right: -25px;
12675  }
12676
12677  .sp-csme-dropzone-collection .collection-display-grid > *,
12678  .sp-csme-dropzone-collection .row > * {
12679    min-width: 100px;
12680  }
12681}
12682
12683@media (max-width: 600px) {
12684  /* Em telas muito pequenas, move os controles para dentro */
12685  .sp-csme-slider-control--prev.sp-csme-slider-control--side {
12686    left: -25px;
12687  }
12688
12689  .sp-csme-slider-control--next.sp-csme-slider-control--side {
12690    right: -25px;
12691  }
12692
12693  .sp-csme-slider-viewport {
12694    overflow-x: auto;
12695    -webkit-overflow-scrolling: touch;
12696  }
12697
12698  .sp-csme-dropzone-collection .collection-display-grid > *,
12699  .sp-csme-dropzone-collection .row > * {
12700    min-width: 90px;
12701  }
12702}
12703
12704/* Modo claro */
12705@media (prefers-color-scheme: light) {
12706  .sp-csme-fragment-slider-container.sp-csme-light-mode {
12707    --slider-bg: #f5f5f5;
12708    --slider-text: #1a1a1a;
12709    --control-bg: rgba(0, 0, 0, 0.05);
12710    --control-hover-bg: rgba(0, 0, 0, 0.1);
12711  }
12712
12713  .sp-csme-fragment-slider-container.sp-csme-light-mode
12714    .sp-csme-slider-control {
12715    border-color: rgba(0, 0, 0, 0.2);
12716  }
12717
12718  .sp-csme-fragment-slider-container.sp-csme-light-mode
12719    .sp-csme-dropzone-placeholder {
12720    border-color: rgba(0, 0, 0, 0.2);
12721    background-color: rgba(0, 0, 0, 0.02);
12722    color: rgba(0, 0, 0, 0.5);
12723  }
12724}
12725
12726/* Estados do dropzone no editor */
12727.page-editor-layout-drop-zone-active .sp-csme-dropzone-title,
12728.page-editor-layout-drop-zone-active .sp-csme-dropzone-collection {
12729  background-color: rgba(255, 215, 0, 0.1);
12730  border: 2px dashed var(--slider-accent);
12731  min-height: 60px;
12732}
12733
12734/* Animação suave */
12735@media (prefers-reduced-motion: no-preference) {
12736  .sp-csme-slider-control {
12737    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
12738  }
12739
12740  .sp-csme-dropzone-collection > .collection-display-grid,
12741  .sp-csme-dropzone-collection > .row {
12742    transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
12743  }
12744}
12745</style>
12746   
12746<script type="module">const configuration = {"autoPlayInterval":"5","theme":"dark","autoPlay":false,"itemsPerView":"6"}; const fragmentElement = document.querySelector('#fragment-53f22e71-74a8-7694-7605-893f39d6f8ff'); const fragmentElementId = 'fragment-53f22e71-74a8-7694-7605-893f39d6f8ff'; const fragmentEntryLinkNamespace = 'baqm'; const fragmentNamespace = 'baqm'; const layoutMode = 'view';let currentPositionCsme = 0;
12747const trackCsme = document.querySelector(
12748  ".sp-csme-psp-slide-crontol .lfr-layout-structure-item-collection > .container-fluid > .row"
12749);
12750
12751function moveCarouselCsme(direction) {
12752  if (!trackCsme) return;
12753
12754  const totalItems = trackCsme.children.length;
12755  const itemsToShow = 1;
12756  const maxPosition = totalItems - itemsToShow;
12757
12758  // Calcular nova posição
12759  if (direction === 1 && currentPositionCsme < maxPosition) {
12760    currentPositionCsme++; // Próximo item
12761  } else if (direction === -1 && currentPositionCsme > 0) {
12762    currentPositionCsme--; // Anterior item
12763  }
12764
12765  // Mover o carrossel
12766  const movePercent = -(currentPositionCsme * (100 / itemsToShow));
12767  trackCsme.style.transform = `translateX(${movePercent}%)`;
12768}
12769
12770window.moveCarouselCsme = moveCarouselCsme;;</script>
12770
12771  </div>
12772  <div class="lfr-layout-structure-item-basic-component-spacer lfr-layout-structure-item-d1f0d388-4466-0767-e821-536b65adfa80 " data-layout-structure-item-id="d1f0d388-4466-0767-e821-536b65adfa80">
12773   <div id="fragment-3b75a963-a4f6-2672-ca18-835f0b730fc1">
12774    <div class="py-4"></div>
12775   </div>
12776  </div>
12777 </div>
12778 <div class="lfr-layout-structure-item-938319a6-4349-fec5-d594-85c5aef59a66 lfr-layout-structure-item-container " data-layout-structure-item-id="938319a6-4349-fec5-d594-85c5aef59a66" style="--background-image-file-entry-id:27865867;--lfr-background-image-938319a6-4349-fec5-d594-85c5aef59a66: url(/documents/d/sampa-news/backgorund_services_cut);" id="hdjz">
12779  <style>@media (max-width:77px){#hdjz{background-image: url(/o/adaptive-media/image/27865867/Thumbnail-300x300/backgorund_services_cut.png?t=1753991576973) !important;}}@media (max-width:108px) and (min-width:77px){#hdjz{background-image: url(/o/adaptive-media/image/27865867/Preview-1000x0/backgorund_services_cut.png?t=1753991576973) !important;}}</style>
12780  <div class="lfr-layout-structure-item-container-slider-videos-curtos--copiar--0 lfr-layout-structure-item-66ed157d-0fb5-0828-14f9-b01ec3a35453 " data-layout-structure-item-id="66ed157d-0fb5-0828-14f9-b01ec3a35453">
12781   <div id="fragment-17924fc6-e39a-25de-b702-4cf0bb7ca707">
12782    <div class="sp-csv-fragment-slider-container-black" data-fragment-namespace="vfkh">
12783     <div class="sp-csv-slider-container__wrapper">
12784      <!-- Header com título e controles -->
12785      <div class="sp-csv-slider-container__header">
12786       <!-- Dropzone para título/componente customizado -->
12787       <div class="sp-csv-slider-container__title-dropzone">
12788        <div id="title-dropzone" class="sp-csv-dropzone-title"></div>
12789       </div>
12790      </div>
12791      <!-- Dropzone para coleção de itens com controles laterais -->
12792      <div class="sp-csv-slider-container__content sp-csv-psp-slide-crontol">
12793       <!-- Controle Anterior (Esquerda) -->
12794       <button class="sp-csv-slider-control sp-csv-slider-control--prev sp-csv-slider-control--side" onclick="moveCarouselYoutubeSlider(-1)" aria-label="Item anterior" data-action="prev"> 
12795        <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
12796         <path d="M15 18L9 12L15 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
12797        </svg> 
12798       </button>
12799       <div class="sp-csv-slider-viewport">
12800        <div id="collection-dropzone" class="sp-csv-dropzone-collection">
12801         <div class="lfr-layout-structure-item-b888ce7b-4acf-a697-85a5-9a4b214ef2c3 lfr-layout-structure-item-container  container-fluid container-fluid-max-xl" data-layout-structure-item-id="b888ce7b-4acf-a697-85a5-9a4b214ef2c3">
12802          <div class="lfr-layout-structure-item-455aa658-af36-8405-de9b-b5d8c6b18e33 lfr-layout-structure-item-collection" data-layout-structure-item-id="455aa658-af36-8405-de9b-b5d8c6b18e33" data-analytics-targetable-collection="com.liferay.layout.list.retriever.ClassedModelListObjectReference@481619bf" id="analytics-targetable-collection-455aa658-af36-8405-de9b-b5d8c6b18e33">
12803           <div class="container-fluid overflow-hidden px-0 align-items-start">
12804            <div class="row align-items-start">
12805             <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
12806              <div class="lfr-layout-structure-item-v-deos-curtos--copiar- lfr-layout-structure-item-9bac24e4-19de-ef1c-1911-0f805a3398cd " data-layout-structure-item-id="9bac24e4-19de-ef1c-1911-0f805a3398cd">
12807               <div id="fragment-59cce4a7-b67b-f05e-43cb-749d4b471670">
12808                <!-- HTML do Fragmento -->
12809                <div class="sampa-news-video-horizontal-card">
12810                 <picture data-fileentryid="61739251"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/61739251/Thumbnail-300x300/Captura+de+tela+2026-09-24+133338.png?t=1790267628545"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/61739251/Preview-1000x0/Captura+de+tela+2026-09-24+133338.png?t=1790267628545"><img class="sampa-news-video-horizontal-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/2477185
128105/0/Captura+de+tela+2026-09-24+133338.png/20c63236-5457-6c41-6e45-1f8de045d2fb?version=1.0&amp;t=1790267628545" alt="Smart Sampa" data-fileentryid="61739251"></picture>
12811                 <div class="sampa-news-video-horizontal-player-button">
12812                  <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
12813                   <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
12814                  </svg>
12815                 </div>
12816                 <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/watch?v=e24o1mc45XQ" style="display: none;">https://www.youtube.com/watch?v=e24o1mc45XQ</a> <iframe class="sampa-news-video-horizontal-iframe" src="" title="YouTube Video Player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy">
12817  </iframe>
12818                 <div class="sampa-news-video-horizontal-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Traficante foragido da Justiça é preso pela GCM após identificação do Smart Sampa</div>
12819                </div>
12820               </div>
12821               <style> /* Sampa News Video Fragment - Updated Layout */
12822  .sampa-news-video-horizontal-card {
12823    position: relative;
12824    background-color: #000;
12825    overflow: hidden;
12826    aspect-ratio: 16/9;
12827    cursor: pointer;
12828    transition: transform 0.3s ease, box-shadow 0.3s ease;
12829    display: flex;
12830    align-items: center;
12831    justify-content: center;
12832    border-bottom: 3px solid #ffc107;
12833  }
12834
12835  .sampa-news-video-horizontal-thumbnail {
12836    position: absolute;
12837    top: 0;
12838    left: 0;
12839    width: 100%;
12840    height: 100%;
12841    object-fit: cover;
12842    z-index: 1;
12843  }
12844
12845  .sampa-news-video-horizontal-card:hover {
12846    transform: translateY(-4px);
12847    box-shadow: 0 12px 24px rgba(0, 0, 0, 0.25);
12848  }
12849
12850  /* Duração do vídeo - canto superior esquerdo */
12851  .sampa-news-video-horizontal-duration {
12852    position: absolute;
12853    top: 5px;
12854    left: 5px;
12855    background-color: rgba(0, 0, 0, 0.8);
12856    color: #cbcbc0;
12857    padding: 4px 5px;
12858    font-size: 12px;
12859    font-weight: 600;
12860    z-index: 3;
12861    letter-spacing: 0.5px;
12862  }
12863
12864  /* Botão de play amarelo central */
12865  .sampa-news-video-horizontal-player-button {
12866    position: absolute;
12867    top: 50%;
12868    left: 50%;
12869    transform: translate(-50%, -50%);
12870    width: 50px;
12871    height: 50px;
12872    background-color: #FFD700;
12873    border-radius: 50%;
12874    display: flex;
12875    align-items: center;
12876    justify-content: center;
12877    transition: all 0.3s ease;
12878    z-index: 3;
12879    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
12880  }
12881
12882  .sampa-news-video-horizontal-card:hover .sampa-news-video-horizontal-player-button {
12883    background-color: #FFC107;
12884    transform: translate(-50%, -50%) scale(1.1);
12885    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.4);
12886  }
12887
12888  .sampa-news-play-icon {
12889    width: 20px;
12890    height: 20px;
12891    color: #000;
12892    margin-left: 3px;
12893  }
12894
12895  /* iFrame do vídeo */
12896  .sampa-news-video-horizontal-iframe {
12897    position: absolute;
12898    top: 0;
12899    left: 0;
12900    width: 100%;
12901    height: 100%;
12902    display: none;
12903    z-index: 10;
12904  }
12905
12906  .sampa-news-video-horizontal-card.sampa-news-playing .sampa-news-video-horizontal-iframe {
12907    display: block;
12908  }
12909
12910  .sampa-news-video-horizontal-card.sampa-news-playing .sampa-news-video-horizontal-player-button,
12911  .sampa-news-video-horizontal-card.sampa-news-playing .sampa-news-video-horizontal-duration,
12912  .sampa-news-video-horizontal-card.sampa-news-playing .sampa-news-video-horizontal-thumbnail,
12913  .sampa-news-video-horizontal-card.sampa-news-playing .sampa-news-video-horizontal-title {
12914    display: none;
12915  }
12916
12917  /* Título do vídeo - parte inferior com gradiente */
12918  .sampa-news-video-horizontal-title {
12919    position: absolute;
12920    bottom: 0;
12921    left: 0;
12922    right: 0;
12923    background: linear-gradient(to top, rgba(0, 0, 0, 0.95) 0%, rgba(0, 0, 0, 0.7) 50%, transparent 100%);
12924    color: white;
12925    padding: 60px 16px 16px;
12926    font-size: 0.9375rem;
12927    line-height: 1.4;
12928    font-weight: 500;
12929    z-index: 3;
12930    text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
12931  }
12932
12933  /* Responsividade */
12934  @media (max-width: 768px) {
12935    .sampa-news-video-horizontal-player-button {
12936      width: 45px;
12937      height: 45px;
12938    }
12939
12940    .sampa-news-play-icon {
12941      width: 18px;
12942      height: 18px;
12943    }
12944
12945    .sampa-news-video-horizontal-duration {
12946      font-size: 0.8125rem;
12947      padding: 5px 10px;
12948      top: 5px;
12949      left: 5px;
12950    }
12951
12952    .sampa-news-video-horizontal-title {
12953      font-size: 0.875rem;
12954      padding: 50px 14px 14px;
12955    }
12956  }
12957
12958  @media (max-width: 480px) {
12959    .sampa-news-video-horizontal-player-button {
12960      width: 40px;
12961      height: 40px;
12962    }
12963
12964    .sampa-news-play-icon {
12965      width: 16px;
12966      height: 16px;
12967    }
12968
12969    .sampa-news-video-horizontal-duration {
12970      font-size: 0.75rem;
12971      padding: 4px 8px;
12972      top: 5px;
12973      left: 5px;
12974    }
12975
12976    .sampa-news-video-horizontal-title {
12977      font-size: 0.8125rem;
12978      padding: 45px 12px 12px;
12979    }
12980  }
12981
12982  /* Grid container (caso use em conjunto) */
12983  .sampa-news-video-horizontals-grid {
12984    display: grid;
12985    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
12986    gap: 1.5rem;
12987  }
12988
12989  @media (max-width: 768px) {
12990    .sampa-news-video-horizontals-grid {
12991      grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
12992      gap: 1.25rem;
12993    }
12994  }
12995
12996  @media (max-width: 480px) {
12997    .sampa-news-video-horizontals-grid {
12998      grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
12999      gap: 1rem;
13000    }
13001  }
13002
13003  /* Acessibilidade */
13004  .sampa-news-video-horizontal-card:focus-visible {
13005    outline: 3px solid #FFD700;
13006    outline-offset: 2px;
13007  }
13008
13009  /* Animação de loading (opcional) */
13010  .sampa-news-video-horizontal-card::before {
13011    content: '';
13012    position: absolute;
13013    top: 0;
13014    left: 0;
13015    right: 0;
13016    bottom: 0;
13017    background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);
13018    transform: translateX(-100%);
13019    transition: transform 0.6s ease;
13020    z-index: 2;
13021    pointer-events: none;
13022  }
13023
13024  .sampa-news-video-horizontal-card:hover::before {
13025    transform: translateX(100%);
13026  }</style>
13027               
13027<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-59cce4a7-b67b-f05e-43cb-749d4b471670'); const fragmentElementId = 'fragment-59cce4a7-b67b-f05e-43cb-749d4b471670'; const fragmentEntryLinkNamespace = 'zrpl'; const fragmentNamespace = 'zrpl'; const layoutMode = 'view';(function () {
13028    // Usar uma única função global para evitar conflitos
13029    if (typeof window.sampanewsVideoHandlerHorizontal === 'undefined') {
13030
13031        // Cache selectors and regex patterns
13032        const videoPatterns = {
13033            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
13034            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
13035            watch: /[?&]v=([a-zA-Z0-9_-]+)/
13036        };
13037
13038        // Flag para evitar processamento durante inicialização
13039        let isInitializing = false;
13040        let debounceTimeout = null;
13041
13042        // Função para reproduzir vídeos
13043        window.sampanewsPlayVideoHorizontal = function (card) {
13044            try {
13045                const iframe = card.querySelector('.sampa-news-video-horizontal-iframe');
13046                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
13047                const url = linkElement?.getAttribute('href') || '';
13048
13049                if (!url || url === '#' || url === '') {
13050                    console.error('URL do vídeo não configurada');
13051                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
13052                    return;
13053                }
13054
13055                // Função melhorada para extrair ID do vídeo
13056                function extractVideoId(url) {
13057                    const patterns = [
13058                        /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/|youtube\.com\/shorts\/)([a-zA-Z0-9_-]{11})/,
13059                        /^([a-zA-Z0-9_-]{11})$/ // ID direto
13060                    ];
13061
13062                    for (const pattern of patterns) {
13063                        const match = url.match(pattern);
13064                        if (match) {
13065                            return match[1];
13066                        }
13067                    }
13068                    return null;
13069                }
13070
13071                // Converter URL do YouTube para embed
13072                let embedUrl = url;
13073
13074                if (url.includes('youtube.com/embed/')) {
13075                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0&rel=0`;
13076                } else {
13077                    const videoId = extractVideoId(url);
13078                    if (videoId) {
13079                        embedUrl = `https://www.youtube.com/embed/${videoId}?autoplay=1&mute=0&rel=0&modestbranding=1`;
13080                    } else {
13081                        console.error('Não foi possível extrair o ID do vídeo da URL:', url);
13082                        alert('URL do YouTube inválida. Verifique se a URL está correta.');
13083                        return;
13084                    }
13085                }
13086
13087                // Parar outros vídeos que estão tocando
13088                const playingCard = document.querySelector('.sampa-news-video-horizontal-card.sampa-news-playing');
13089                if (playingCard && playingCard !== card) {
13090                    playingCard.classList.remove('sampa-news-playing');
13091                    const playingIframe = playingCard.querySelector('.sampa-news-video-horizontal-iframe');
13092                    if (playingIframe) {
13093                        playingIframe.src = '';
13094                    }
13095                }
13096
13097                // Verificar se iframe existe antes de configurar
13098                if (!iframe) {
13099                    console.error('Iframe não encontrado no card');
13100                    return;
13101                }
13102
13103                // Adicionar tratamento de erro para o iframe
13104                iframe.onerror = function () {
13105                    console.error('Erro ao carregar o iframe do vídeo');
13106                    alert('Erro ao carregar o vídeo. Verifique a URL e tente novamente.');
13107                    card.classList.remove('sampa-news-playing');
13108                };
13109
13110                iframe.onload = function () {
13111                    // Iframe carregado com sucesso
13112                };
13113
13114                // Aplicar a classe e definir o src
13115                card.classList.add('sampa-news-playing');
13116                iframe.src = embedUrl;
13117            } catch (error) {
13118                console.error('Erro ao reproduzir vídeo horizontal:', error);
13119            }
13120        };
13121
13122        // Optimized event handler
13123        const handleCardClick = (e) => {
13124            e.preventDefault();
13125            e.stopPropagation();
13126            window.sampanewsPlayVideoHorizontal(e.currentTarget);
13127        };
13128
13129        // Função para inicializar um único card
13130        const initializeCard = (card) => {
13131            if (!card.hasAttribute('data-sampa-initialized')) {
13132                card.addEventListener('click', handleCardClick);
13133                card.setAttribute('data-sampa-initialized', 'true');
13134                return true;
13135            }
13136            return false;
13137        };
13138
13139        // Função otimizada para processar apenas nós relevantes
13140        const processRelevantNodes = (nodes) => {
13141            if (isInitializing) return;
13142            
13143            let processedCount = 0;
13144            
13145            nodes.forEach(node => {
13146                if (node.nodeType === Node.ELEMENT_NODE) {
13147                    let cardsToProcess = [];
13148                    
13149                    // Verificar se o próprio nó é um card horizontal
13150                    if (node.matches && node.matches('.sampa-news-video-horizontal-card')) {
13151                        cardsToProcess.push(node);
13152                    }
13153                    
13154                    // Verificar se contém cards horizontais (só se for um container relevante)
13155                    if (node.querySelector && 
13156                        (node.classList.contains('fragment') || 
13157                         node.classList.contains('portlet') ||
13158                         node.classList.contains('sampa-news') ||
13159                         node.querySelectorAll('.sampa-news-video-horizontal-card').length > 0)) {
13160                        
13161                        const childCards = node.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
13162                        cardsToProcess.push(...childCards);
13163                    }
13164                    
13165                    // Inicializar cards encontrados
13166                    cardsToProcess.forEach(card => {
13167                        if (initializeCard(card)) {
13168                            processedCount++;
13169                        }
13170                    });
13171                }
13172            });
13173            
13174            if (processedCount > 0) {
13175                console.log(`Sampa News Horizontal: Inicializados ${processedCount} novos cards de vídeo`);
13176            }
13177        };
13178
13179        // Função para inicializar event listeners
13180        window.sampanewsInitVideoCardsHorizontal = function () {
13181            if (isInitializing) return;
13182            isInitializing = true;
13183            
13184            try {
13185                let initializedCount = 0;
13186                const cards = document.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
13187                
13188                cards.forEach(card => {
13189                    if (initializeCard(card)) {
13190                        initializedCount++;
13191                    }
13192                });
13193                
13194                if (initializedCount > 0) {
13195                    console.log(`Sampa News Horizontal: Inicializados ${initializedCount} cards de vídeo`);
13196                }
13197            } catch (error) {
13198                console.error('Erro ao inicializar cards de vídeo horizontais:', error);
13199            } finally {
13200                isInitializing = false;
13201            }
13202        };
13203
13204        // Marcar como inicializado
13205        window.sampanewsVideoHandlerHorizontal = true;
13206
13207        // Inicializar na primeira execução
13208        if (document.readyState === 'loading') {
13209            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCardsHorizontal);
13210        } else {
13211            window.sampanewsInitVideoCardsHorizontal();
13212        }
13213    } else {
13214        // Se já existe, apenas reinicializa novos cards
13215        if (typeof window.sampanewsInitVideoCardsHorizontal === 'function') {
13216            window.sampanewsInitVideoCardsHorizontal();
13217        }
13218    }
13219
13220    // Observer otimizado com proteção anti-loop
13221    if (typeof window.sampanewsObserverVideoCardsHorizontal === 'undefined') {
13222        
13223        window.sampanewsObserverVideoCardsHorizontal = new MutationObserver(mutations => {
13224            // Evitar processamento durante inicialização
13225            if (isInitializing) return;
13226            
13227            // Debounce para evitar execuções excessivas
13228            clearTimeout(debounceTimeout);
13229            debounceTimeout = setTimeout(() => {
13230                try {
13231                    const relevantNodes = [];
13232                    
13233                    mutations.forEach(mutation => {
13234                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
13235                            Array.from(mutation.addedNodes).forEac
13235h(node => {
13236                                // Só processar nós elemento que podem conter ou ser cards de vídeo horizontais
13237                                if (node.nodeType === Node.ELEMENT_NODE &&
13238                                    (node.classList.contains('sampa-news-video-horizontal-card') ||
13239                                     node.querySelector?.('.sampa-news-video-horizontal-card') ||
13240                                     node.classList.contains('fragment') ||
13241                                     node.classList.contains('portlet'))) {
13242                                    relevantNodes.push(node);
13243                                }
13244                            });
13245                        }
13246                    });
13247                    
13248                    if (relevantNodes.length > 0) {
13249                        processRelevantNodes(relevantNodes);
13250                    }
13251                } catch (error) {
13252                    console.error('Erro no observer de vídeos horizontais:', error);
13253                }
13254            }, 150); // Debounce de 150ms
13255        });
13256        
13257        // Observer mais específico - só monitora containers relevantes
13258        const observeTargets = [
13259            document.querySelector('.sampa-news-horizontal-container'),
13260            document.querySelector('.sampa-news-container'),
13261            document.querySelector('#main-content'),
13262            document.querySelector('.portlet-boundary'),
13263            document.body // Fallback
13264        ].filter(Boolean);
13265        
13266        observeTargets.forEach(target => {
13267            window.sampanewsObserverVideoCardsHorizontal.observe(target, {
13268                childList: true,
13269                subtree: true
13270            });
13271        });
13272        
13273        // Cleanup ao sair da página
13274        window.addEventListener('beforeunload', function() {
13275            if (window.sampanewsObserverVideoCardsHorizontal) {
13276                window.sampanewsObserverVideoCardsHorizontal.disconnect();
13277            }
13278            clearTimeout(debounceTimeout);
13279        });
13280    }
13281})();;</script>
13281
13282              </div>
13283             </div>
13284             <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
13285              <div class="lfr-layout-structure-item-v-deos-curtos--copiar- lfr-layout-structure-item-9bac24e4-19de-ef1c-1911-0f805a3398cd " data-layout-structure-item-id="9bac24e4-19de-ef1c-1911-0f805a3398cd">
13286               <div id="fragment-d86fa2ea-7eba-157b-83f0-5956931485d8">
13287                <!-- HTML do Fragmento -->
13288                <div class="sampa-news-video-horizontal-card">
13289                 <picture data-fileentryid="57833202"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/57833202/Thumbnail-300x300/Captura+de+tela+2026-08-07+083935.png?t=1786102800758"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/57833202/Preview-1000x0/Captura+de+tela+2026-08-07+083935.png?t=1786102800758"><img class="sampa-news-video-horizontal-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/Captura+de+tela+2026-08-07+083935.png/a230a553-f7b5-6bc7-136e-1b36e02e727c?version=1.0&amp;t=1786102800758" alt="Prefeitura Presente Lapa" data-fileentryid="57833202"></picture>
13290                 <div class="sampa-news-video-horizontal-player-button">
13291                  <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
13292                   <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
13293                  </svg>
13294                 </div>
13295                 <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/watch?v=eLzx89Jqk_c" style="display: none;">https://www.youtube.com/watch?v=eLzx89Jqk_c</a> <iframe class="sampa-news-video-horizontal-iframe" src="" title="YouTube Video Player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy">
13296  </iframe>
13297                 <div class="sampa-news-video-horizontal-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Prefeitura Presente Lapa recebe mais de R$ 1 bilhão em investimentos</div>
13298                </div>
13299               </div>
13300               
13300<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-d86fa2ea-7eba-157b-83f0-5956931485d8'); const fragmentElementId = 'fragment-d86fa2ea-7eba-157b-83f0-5956931485d8'; const fragmentEntryLinkNamespace = 'zrpl'; const fragmentNamespace = 'zrpl'; const layoutMode = 'view';(function () {
13301    // Usar uma única função global para evitar conflitos
13302    if (typeof window.sampanewsVideoHandlerHorizontal === 'undefined') {
13303
13304        // Cache selectors and regex patterns
13305        const videoPatterns = {
13306            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
13307            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
13308            watch: /[?&]v=([a-zA-Z0-9_-]+)/
13309        };
13310
13311        // Flag para evitar processamento durante inicialização
13312        let isInitializing = false;
13313        let debounceTimeout = null;
13314
13315        // Função para reproduzir vídeos
13316        window.sampanewsPlayVideoHorizontal = function (card) {
13317            try {
13318                const iframe = card.querySelector('.sampa-news-video-horizontal-iframe');
13319                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
13320                const url = linkElement?.getAttribute('href') || '';
13321
13322                if (!url || url === '#' || url === '') {
13323                    console.error('URL do vídeo não configurada');
13324                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
13325                    return;
13326                }
13327
13328                // Função melhorada para extrair ID do vídeo
13329                function extractVideoId(url) {
13330                    const patterns = [
13331                        /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/|youtube\.com\/shorts\/)([a-zA-Z0-9_-]{11})/,
13332                        /^([a-zA-Z0-9_-]{11})$/ // ID direto
13333                    ];
13334
13335                    for (const pattern of patterns) {
13336                        const match = url.match(pattern);
13337                        if (match) {
13338                            return match[1];
13339                        }
13340                    }
13341                    return null;
13342                }
13343
13344                // Converter URL do YouTube para embed
13345                let embedUrl = url;
13346
13347                if (url.includes('youtube.com/embed/')) {
13348                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0&rel=0`;
13349                } else {
13350                    const videoId = extractVideoId(url);
13351                    if (videoId) {
13352                        embedUrl = `https://www.youtube.com/embed/${videoId}?autoplay=1&mute=0&rel=0&modestbranding=1`;
13353                    } else {
13354                        console.error('Não foi possível extrair o ID do vídeo da URL:', url);
13355                        alert('URL do YouTube inválida. Verifique se a URL está correta.');
13356                        return;
13357                    }
13358                }
13359
13360                // Parar outros vídeos que estão tocando
13361                const playingCard = document.querySelector('.sampa-news-video-horizontal-card.sampa-news-playing');
13362                if (playingCard && playingCard !== card) {
13363                    playingCard.classList.remove('sampa-news-playing');
13364                    const playingIframe = playingCard.querySelector('.sampa-news-video-horizontal-iframe');
13365                    if (playingIframe) {
13366                        playingIframe.src = '';
13367                    }
13368                }
13369
13370                // Verificar se iframe existe antes de configurar
13371                if (!iframe) {
13372                    console.error('Iframe não encontrado no card');
13373                    return;
13374                }
13375
13376                // Adicionar tratamento de erro para o iframe
13377                iframe.onerror = function () {
13378                    console.error('Erro ao carregar o iframe do vídeo');
13379                    alert('Erro ao carregar o vídeo. Verifique a URL e tente novamente.');
13380                    card.classList.remove('sampa-news-playing');
13381                };
13382
13383                iframe.onload = function () {
13384                    // Iframe carregado com sucesso
13385                };
13386
13387                // Aplicar a classe e definir o src
13388                card.classList.add('sampa-news-playing');
13389                iframe.src = embedUrl;
13390            } catch (error) {
13391                console.error('Erro ao reproduzir vídeo horizontal:', error);
13392            }
13393        };
13394
13395        // Optimized event handler
13396        const handleCardClick = (e) => {
13397            e.preventDefault();
13398            e.stopPropagation();
13399            window.sampanewsPlayVideoHorizontal(e.currentTarget);
13400        };
13401
13402        // Função para inicializar um único card
13403        const initializeCard = (card) => {
13404            if (!card.hasAttribute('data-sampa-initialized')) {
13405                card.addEventListener('click', handleCardClick);
13406                card.setAttribute('data-sampa-initialized', 'true');
13407                return true;
13408            }
13409            return false;
13410        };
13411
13412        // Função otimizada para processar apenas nós relevantes
13413        const processRelevantNodes = (nodes) => {
13414            if (isInitializing) return;
13415            
13416            let processedCount = 0;
13417            
13418            nodes.forEach(node => {
13419                if (node.nodeType === Node.ELEMENT_NODE) {
13420                    let cardsToProcess = [];
13421                    
13422                    // Verificar se o próprio nó é um card horizontal
13423                    if (node.matches && node.matches('.sampa-news-video-horizontal-card')) {
13424                        cardsToProcess.push(node);
13425                    }
13426                    
13427                    // Verificar se contém cards horizontais (só se for um container relevante)
13428                    if (node.querySelector && 
13429                        (node.classList.contains('fragment') || 
13430                         node.classList.contains('portlet') ||
13431                         node.classList.contains('sampa-news') ||
13432                         node.querySelectorAll('.sampa-news-video-horizontal-card').length > 0)) {
13433                        
13434                        const childCards = node.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
13435                        cardsToProcess.push(...childCards);
13436                    }
13437                    
13438                    // Inicializar cards encontrados
13439                    cardsToProcess.forEach(card => {
13440                        if (initializeCard(card)) {
13441                            processedCount++;
13442                        }
13443                    });
13444                }
13445            });
13446            
13447            if (processedCount > 0) {
13448                console.log(`Sampa News Horizontal: Inicializados ${processedCount} novos cards de vídeo`);
13449            }
13450        };
13451
13452        // Função para inicializar event listeners
13453        window.sampanewsInitVideoCardsHorizontal = function () {
13454            if (isInitializing) return;
13455            isInitializing = true;
13456            
13457            try {
13458                let initializedCount = 0;
13459                const cards = document.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
13460                
13461                cards.forEach(card => {
13462                    if (initializeCard(card)) {
13463                        initializedCount++;
13464                    }
13465                });
13466                
13467                if (initializedCount > 0) {
13468                    console.log(`Sampa News Horizontal: Inicializados ${initializedCount} cards de vídeo`);
13469                }
13470            } catch (error) {
13471                console.error('Erro ao inicializar cards de vídeo horizontais:', error);
13472            } finally {
13473                isInitializing = false;
13474            }
13475        };
13476
13477        // Marcar como inicializado
13478        window.sampanewsVideoHandlerHorizontal = true;
13479
13480        // Inicializar na primeira execução
13481        if (document.readyState === 'loading') {
13482            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCardsHorizontal);
13483        } else {
13484            window.sampanewsInitVideoCardsHorizontal();
13485        }
13486    } else {
13487        // Se já existe, apenas reinicializa novos cards
13488        if (typeof window.sampanewsInitVideoCardsHorizontal === 'function') {
13489            window.sampanewsInitVideoCardsHorizontal();
13490        }
13491    }
13492
13493    // Observer otimizado com proteção anti-loop
13494    if (typeof window.sampanewsObserverVideoCardsHorizontal === 'undefined') {
13495        
13496        window.sampanewsObserverVideoCardsHorizontal = new MutationObserver(mutations => {
13497            // Evitar processamento durante inicialização
13498            if (isInitializing) return;
13499            
13500            // Debounce para evitar execuções excessivas
13501            clearTimeout(debounceTimeout);
13502            debounceTimeout = setTimeout(() => {
13503                try {
13504                    const relevantNodes = [];
13505                    
13506                    mutations.forEach(mutation => {
13507                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
13508                            Array.from(mutation.addedNodes).forEac
13508h(node => {
13509                                // Só processar nós elemento que podem conter ou ser cards de vídeo horizontais
13510                                if (node.nodeType === Node.ELEMENT_NODE &&
13511                                    (node.classList.contains('sampa-news-video-horizontal-card') ||
13512                                     node.querySelector?.('.sampa-news-video-horizontal-card') ||
13513                                     node.classList.contains('fragment') ||
13514                                     node.classList.contains('portlet'))) {
13515                                    relevantNodes.push(node);
13516                                }
13517                            });
13518                        }
13519                    });
13520                    
13521                    if (relevantNodes.length > 0) {
13522                        processRelevantNodes(relevantNodes);
13523                    }
13524                } catch (error) {
13525                    console.error('Erro no observer de vídeos horizontais:', error);
13526                }
13527            }, 150); // Debounce de 150ms
13528        });
13529        
13530        // Observer mais específico - só monitora containers relevantes
13531        const observeTargets = [
13532            document.querySelector('.sampa-news-horizontal-container'),
13533            document.querySelector('.sampa-news-container'),
13534            document.querySelector('#main-content'),
13535            document.querySelector('.portlet-boundary'),
13536            document.body // Fallback
13537        ].filter(Boolean);
13538        
13539        observeTargets.forEach(target => {
13540            window.sampanewsObserverVideoCardsHorizontal.observe(target, {
13541                childList: true,
13542                subtree: true
13543            });
13544        });
13545        
13546        // Cleanup ao sair da página
13547        window.addEventListener('beforeunload', function() {
13548            if (window.sampanewsObserverVideoCardsHorizontal) {
13549                window.sampanewsObserverVideoCardsHorizontal.disconnect();
13550            }
13551            clearTimeout(debounceTimeout);
13552        });
13553    }
13554})();;</script>
13554
13555              </div>
13556             </div>
13557             <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
13558              <div class="lfr-layout-structure-item-v-deos-curtos--copiar- lfr-layout-structure-item-9bac24e4-19de-ef1c-1911-0f805a3398cd " data-layout-structure-item-id="9bac24e4-19de-ef1c-1911-0f805a3398cd">
13559               <div id="fragment-9278a939-9117-1c6b-25f9-96bf6f3e5d1f">
13560                <!-- HTML do Fragmento -->
13561                <div class="sampa-news-video-horizontal-card">
13562                 <picture data-fileentryid="57833005"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/57833005/Thumbnail-300x300/Captura+de+tela+2026-08-07+083337.png?t=1786102428424"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/57833005/Preview-1000x0/Captura+de+tela+2026-08-07+083337.png?t=1786102428424"><img class="sampa-news-video-horizontal-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/Captura+de+tela+2026-08-07+083337.png/8c919e87-92b9-100c-46ca-ca89484a6582?version=1.0&amp;t=1786102428424" alt="campanha institucional" data-fileentryid="57833005"></picture>
13563                 <div class="sampa-news-video-horizontal-player-button">
13564                  <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
13565                   <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
13566                  </svg>
13567                 </div>
13568                 <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/watch?v=ASaCRAHLK1E" style="display: none;">https://www.youtube.com/watch?v=ASaCRAHLK1E</a> <iframe class="sampa-news-video-horizontal-iframe" src="" title="YouTube Video Player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy">
13569  </iframe>
13570                 <div class="sampa-news-video-horizontal-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">São Paulo está bombando</div>
13571                </div>
13572               </div>
13573               
13573<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-9278a939-9117-1c6b-25f9-96bf6f3e5d1f'); const fragmentElementId = 'fragment-9278a939-9117-1c6b-25f9-96bf6f3e5d1f'; const fragmentEntryLinkNamespace = 'zrpl'; const fragmentNamespace = 'zrpl'; const layoutMode = 'view';(function () {
13574    // Usar uma única função global para evitar conflitos
13575    if (typeof window.sampanewsVideoHandlerHorizontal === 'undefined') {
13576
13577        // Cache selectors and regex patterns
13578        const videoPatterns = {
13579            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
13580            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
13581            watch: /[?&]v=([a-zA-Z0-9_-]+)/
13582        };
13583
13584        // Flag para evitar processamento durante inicialização
13585        let isInitializing = false;
13586        let debounceTimeout = null;
13587
13588        // Função para reproduzir vídeos
13589        window.sampanewsPlayVideoHorizontal = function (card) {
13590            try {
13591                const iframe = card.querySelector('.sampa-news-video-horizontal-iframe');
13592                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
13593                const url = linkElement?.getAttribute('href') || '';
13594
13595                if (!url || url === '#' || url === '') {
13596                    console.error('URL do vídeo não configurada');
13597                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
13598                    return;
13599                }
13600
13601                // Função melhorada para extrair ID do vídeo
13602                function extractVideoId(url) {
13603                    const patterns = [
13604                        /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/|youtube\.com\/shorts\/)([a-zA-Z0-9_-]{11})/,
13605                        /^([a-zA-Z0-9_-]{11})$/ // ID direto
13606                    ];
13607
13608                    for (const pattern of patterns) {
13609                        const match = url.match(pattern);
13610                        if (match) {
13611                            return match[1];
13612                        }
13613                    }
13614                    return null;
13615                }
13616
13617                // Converter URL do YouTube para embed
13618                let embedUrl = url;
13619
13620                if (url.includes('youtube.com/embed/')) {
13621                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0&rel=0`;
13622                } else {
13623                    const videoId = extractVideoId(url);
13624                    if (videoId) {
13625                        embedUrl = `https://www.youtube.com/embed/${videoId}?autoplay=1&mute=0&rel=0&modestbranding=1`;
13626                    } else {
13627                        console.error('Não foi possível extrair o ID do vídeo da URL:', url);
13628                        alert('URL do YouTube inválida. Verifique se a URL está correta.');
13629                        return;
13630                    }
13631                }
13632
13633                // Parar outros vídeos que estão tocando
13634                const playingCard = document.querySelector('.sampa-news-video-horizontal-card.sampa-news-playing');
13635                if (playingCard && playingCard !== card) {
13636                    playingCard.classList.remove('sampa-news-playing');
13637                    const playingIframe = playingCard.querySelector('.sampa-news-video-horizontal-iframe');
13638                    if (playingIframe) {
13639                        playingIframe.src = '';
13640                    }
13641                }
13642
13643                // Verificar se iframe existe antes de configurar
13644                if (!iframe) {
13645                    console.error('Iframe não encontrado no card');
13646                    return;
13647                }
13648
13649                // Adicionar tratamento de erro para o iframe
13650                iframe.onerror = function () {
13651                    console.error('Erro ao carregar o iframe do vídeo');
13652                    alert('Erro ao carregar o vídeo. Verifique a URL e tente novamente.');
13653                    card.classList.remove('sampa-news-playing');
13654                };
13655
13656                iframe.onload = function () {
13657                    // Iframe carregado com sucesso
13658                };
13659
13660                // Aplicar a classe e definir o src
13661                card.classList.add('sampa-news-playing');
13662                iframe.src = embedUrl;
13663            } catch (error) {
13664                console.error('Erro ao reproduzir vídeo horizontal:', error);
13665            }
13666        };
13667
13668        // Optimized event handler
13669        const handleCardClick = (e) => {
13670            e.preventDefault();
13671            e.stopPropagation();
13672            window.sampanewsPlayVideoHorizontal(e.currentTarget);
13673        };
13674
13675        // Função para inicializar um único card
13676        const initializeCard = (card) => {
13677            if (!card.hasAttribute('data-sampa-initialized')) {
13678                card.addEventListener('click', handleCardClick);
13679                card.setAttribute('data-sampa-initialized', 'true');
13680                return true;
13681            }
13682            return false;
13683        };
13684
13685        // Função otimizada para processar apenas nós relevantes
13686        const processRelevantNodes = (nodes) => {
13687            if (isInitializing) return;
13688            
13689            let processedCount = 0;
13690            
13691            nodes.forEach(node => {
13692                if (node.nodeType === Node.ELEMENT_NODE) {
13693                    let cardsToProcess = [];
13694                    
13695                    // Verificar se o próprio nó é um card horizontal
13696                    if (node.matches && node.matches('.sampa-news-video-horizontal-card')) {
13697                        cardsToProcess.push(node);
13698                    }
13699                    
13700                    // Verificar se contém cards horizontais (só se for um container relevante)
13701                    if (node.querySelector && 
13702                        (node.classList.contains('fragment') || 
13703                         node.classList.contains('portlet') ||
13704                         node.classList.contains('sampa-news') ||
13705                         node.querySelectorAll('.sampa-news-video-horizontal-card').length > 0)) {
13706                        
13707                        const childCards = node.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
13708                        cardsToProcess.push(...childCards);
13709                    }
13710                    
13711                    // Inicializar cards encontrados
13712                    cardsToProcess.forEach(card => {
13713                        if (initializeCard(card)) {
13714                            processedCount++;
13715                        }
13716                    });
13717                }
13718            });
13719            
13720            if (processedCount > 0) {
13721                console.log(`Sampa News Horizontal: Inicializados ${processedCount} novos cards de vídeo`);
13722            }
13723        };
13724
13725        // Função para inicializar event listeners
13726        window.sampanewsInitVideoCardsHorizontal = function () {
13727            if (isInitializing) return;
13728            isInitializing = true;
13729            
13730            try {
13731                let initializedCount = 0;
13732                const cards = document.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
13733                
13734                cards.forEach(card => {
13735                    if (initializeCard(card)) {
13736                        initializedCount++;
13737                    }
13738                });
13739                
13740                if (initializedCount > 0) {
13741                    console.log(`Sampa News Horizontal: Inicializados ${initializedCount} cards de vídeo`);
13742                }
13743            } catch (error) {
13744                console.error('Erro ao inicializar cards de vídeo horizontais:', error);
13745            } finally {
13746                isInitializing = false;
13747            }
13748        };
13749
13750        // Marcar como inicializado
13751        window.sampanewsVideoHandlerHorizontal = true;
13752
13753        // Inicializar na primeira execução
13754        if (document.readyState === 'loading') {
13755            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCardsHorizontal);
13756        } else {
13757            window.sampanewsInitVideoCardsHorizontal();
13758        }
13759    } else {
13760        // Se já existe, apenas reinicializa novos cards
13761        if (typeof window.sampanewsInitVideoCardsHorizontal === 'function') {
13762            window.sampanewsInitVideoCardsHorizontal();
13763        }
13764    }
13765
13766    // Observer otimizado com proteção anti-loop
13767    if (typeof window.sampanewsObserverVideoCardsHorizontal === 'undefined') {
13768        
13769        window.sampanewsObserverVideoCardsHorizontal = new MutationObserver(mutations => {
13770            // Evitar processamento durante inicialização
13771            if (isInitializing) return;
13772            
13773            // Debounce para evitar execuções excessivas
13774            clearTimeout(debounceTimeout);
13775            debounceTimeout = setTimeout(() => {
13776                try {
13777                    const relevantNodes = [];
13778                    
13779                    mutations.forEach(mutation => {
13780                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
13781                            Array.from(mutation.addedNodes).forEac
13781h(node => {
13782                                // Só processar nós elemento que podem conter ou ser cards de vídeo horizontais
13783                                if (node.nodeType === Node.ELEMENT_NODE &&
13784                                    (node.classList.contains('sampa-news-video-horizontal-card') ||
13785                                     node.querySelector?.('.sampa-news-video-horizontal-card') ||
13786                                     node.classList.contains('fragment') ||
13787                                     node.classList.contains('portlet'))) {
13788                                    relevantNodes.push(node);
13789                                }
13790                            });
13791                        }
13792                    });
13793                    
13794                    if (relevantNodes.length > 0) {
13795                        processRelevantNodes(relevantNodes);
13796                    }
13797                } catch (error) {
13798                    console.error('Erro no observer de vídeos horizontais:', error);
13799                }
13800            }, 150); // Debounce de 150ms
13801        });
13802        
13803        // Observer mais específico - só monitora containers relevantes
13804        const observeTargets = [
13805            document.querySelector('.sampa-news-horizontal-container'),
13806            document.querySelector('.sampa-news-container'),
13807            document.querySelector('#main-content'),
13808            document.querySelector('.portlet-boundary'),
13809            document.body // Fallback
13810        ].filter(Boolean);
13811        
13812        observeTargets.forEach(target => {
13813            window.sampanewsObserverVideoCardsHorizontal.observe(target, {
13814                childList: true,
13815                subtree: true
13816            });
13817        });
13818        
13819        // Cleanup ao sair da página
13820        window.addEventListener('beforeunload', function() {
13821            if (window.sampanewsObserverVideoCardsHorizontal) {
13822                window.sampanewsObserverVideoCardsHorizontal.disconnect();
13823            }
13824            clearTimeout(debounceTimeout);
13825        });
13826    }
13827})();;</script>
13827
13828              </div>
13829             </div>
13830             <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
13831              <div class="lfr-layout-structure-item-v-deos-curtos--copiar- lfr-layout-structure-item-9bac24e4-19de-ef1c-1911-0f805a3398cd " data-layout-structure-item-id="9bac24e4-19de-ef1c-1911-0f805a3398cd">
13832               <div id="fragment-b4542b96-d635-aebf-88c6-ea626c245a52">
13833                <!-- HTML do Fragmento -->
13834                <div class="sampa-news-video-horizontal-card">
13835                 <picture data-fileentryid="57832911"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/57832911/Thumbnail-300x300/Captura+de+tela+2026-08-07+082931.png?t=1786102183990"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/57832911/Preview-1000x0/Captura+de+tela+2026-08-07+082931.png?t=1786102183990"><img class="sampa-news-video-horizontal-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/Captura+de+tela+2026-08-07+082931.png/af040e72-6833-4bbe-35cb-2314844a9e09?version=1.0&amp;t=1786102183990" alt="Campanha institucional pet" data-fileentryid="57832911"></picture>
13836                 <div class="sampa-news-video-horizontal-player-button">
13837                  <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
13838                   <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
13839                  </svg>
13840                 </div>
13841                 <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/watch?v=1kw0zXgA0Z4" style="display: none;">https://www.youtube.com/watch?v=1kw0zXgA0Z4</a> <iframe class="sampa-news-video-horizontal-iframe" src="" title="YouTube Video Player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy">
13842  </iframe>
13843                 <div class="sampa-news-video-horizontal-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Em São Paulo, o cuidado é para a família toda. E seu pet não fica de fora</div>
13844                </div>
13845               </div>
13846               
13846<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-b4542b96-d635-aebf-88c6-ea626c245a52'); const fragmentElementId = 'fragment-b4542b96-d635-aebf-88c6-ea626c245a52'; const fragmentEntryLinkNamespace = 'zrpl'; const fragmentNamespace = 'zrpl'; const layoutMode = 'view';(function () {
13847    // Usar uma única função global para evitar conflitos
13848    if (typeof window.sampanewsVideoHandlerHorizontal === 'undefined') {
13849
13850        // Cache selectors and regex patterns
13851        const videoPatterns = {
13852            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
13853            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
13854            watch: /[?&]v=([a-zA-Z0-9_-]+)/
13855        };
13856
13857        // Flag para evitar processamento durante inicialização
13858        let isInitializing = false;
13859        let debounceTimeout = null;
13860
13861        // Função para reproduzir vídeos
13862        window.sampanewsPlayVideoHorizontal = function (card) {
13863            try {
13864                const iframe = card.querySelector('.sampa-news-video-horizontal-iframe');
13865                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
13866                const url = linkElement?.getAttribute('href') || '';
13867
13868                if (!url || url === '#' || url === '') {
13869                    console.error('URL do vídeo não configurada');
13870                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
13871                    return;
13872                }
13873
13874                // Função melhorada para extrair ID do vídeo
13875                function extractVideoId(url) {
13876                    const patterns = [
13877                        /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/|youtube\.com\/shorts\/)([a-zA-Z0-9_-]{11})/,
13878                        /^([a-zA-Z0-9_-]{11})$/ // ID direto
13879                    ];
13880
13881                    for (const pattern of patterns) {
13882                        const match = url.match(pattern);
13883                        if (match) {
13884                            return match[1];
13885                        }
13886                    }
13887                    return null;
13888                }
13889
13890                // Converter URL do YouTube para embed
13891                let embedUrl = url;
13892
13893                if (url.includes('youtube.com/embed/')) {
13894                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0&rel=0`;
13895                } else {
13896                    const videoId = extractVideoId(url);
13897                    if (videoId) {
13898                        embedUrl = `https://www.youtube.com/embed/${videoId}?autoplay=1&mute=0&rel=0&modestbranding=1`;
13899                    } else {
13900                        console.error('Não foi possível extrair o ID do vídeo da URL:', url);
13901                        alert('URL do YouTube inválida. Verifique se a URL está correta.');
13902                        return;
13903                    }
13904                }
13905
13906                // Parar outros vídeos que estão tocando
13907                const playingCard = document.querySelector('.sampa-news-video-horizontal-card.sampa-news-playing');
13908                if (playingCard && playingCard !== card) {
13909                    playingCard.classList.remove('sampa-news-playing');
13910                    const playingIframe = playingCard.querySelector('.sampa-news-video-horizontal-iframe');
13911                    if (playingIframe) {
13912                        playingIframe.src = '';
13913                    }
13914                }
13915
13916                // Verificar se iframe existe antes de configurar
13917                if (!iframe) {
13918                    console.error('Iframe não encontrado no card');
13919                    return;
13920                }
13921
13922                // Adicionar tratamento de erro para o iframe
13923                iframe.onerror = function () {
13924                    console.error('Erro ao carregar o iframe do vídeo');
13925                    alert('Erro ao carregar o vídeo. Verifique a URL e tente novamente.');
13926                    card.classList.remove('sampa-news-playing');
13927                };
13928
13929                iframe.onload = function () {
13930                    // Iframe carregado com sucesso
13931                };
13932
13933                // Aplicar a classe e definir o src
13934                card.classList.add('sampa-news-playing');
13935                iframe.src = embedUrl;
13936            } catch (error) {
13937                console.error('Erro ao reproduzir vídeo horizontal:', error);
13938            }
13939        };
13940
13941        // Optimized event handler
13942        const handleCardClick = (e) => {
13943            e.preventDefault();
13944            e.stopPropagation();
13945            window.sampanewsPlayVideoHorizontal(e.currentTarget);
13946        };
13947
13948        // Função para inicializar um único card
13949        const initializeCard = (card) => {
13950            if (!card.hasAttribute('data-sampa-initialized')) {
13951                card.addEventListener('click', handleCardClick);
13952                card.setAttribute('data-sampa-initialized', 'true');
13953                return true;
13954            }
13955            return false;
13956        };
13957
13958        // Função otimizada para processar apenas nós relevantes
13959        const processRelevantNodes = (nodes) => {
13960            if (isInitializing) return;
13961            
13962            let processedCount = 0;
13963            
13964            nodes.forEach(node => {
13965                if (node.nodeType === Node.ELEMENT_NODE) {
13966                    let cardsToProcess = [];
13967                    
13968                    // Verificar se o próprio nó é um card horizontal
13969                    if (node.matches && node.matches('.sampa-news-video-horizontal-card')) {
13970                        cardsToProcess.push(node);
13971                    }
13972                    
13973                    // Verificar se contém cards horizontais (só se for um container relevante)
13974                    if (node.querySelector && 
13975                        (node.classList.contains('fragment') || 
13976                         node.classList.contains('portlet') ||
13977                         node.classList.contains('sampa-news') ||
13978                         node.querySelectorAll('.sampa-news-video-horizontal-card').length > 0)) {
13979                        
13980                        const childCards = node.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
13981                        cardsToProcess.push(...childCards);
13982                    }
13983                    
13984                    // Inicializar cards encontrados
13985                    cardsToProcess.forEach(card => {
13986                        if (initializeCard(card)) {
13987                            processedCount++;
13988                        }
13989                    });
13990                }
13991            });
13992            
13993            if (processedCount > 0) {
13994                console.log(`Sampa News Horizontal: Inicializados ${processedCount} novos cards de vídeo`);
13995            }
13996        };
13997
13998        // Função para inicializar event listeners
13999        window.sampanewsInitVideoCardsHorizontal = function () {
14000            if (isInitializing) return;
14001            isInitializing = true;
14002            
14003            try {
14004                let initializedCount = 0;
14005                const cards = document.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
14006                
14007                cards.forEach(card => {
14008                    if (initializeCard(card)) {
14009                        initializedCount++;
14010                    }
14011                });
14012                
14013                if (initializedCount > 0) {
14014                    console.log(`Sampa News Horizontal: Inicializados ${initializedCount} cards de vídeo`);
14015                }
14016            } catch (error) {
14017                console.error('Erro ao inicializar cards de vídeo horizontais:', error);
14018            } finally {
14019                isInitializing = false;
14020            }
14021        };
14022
14023        // Marcar como inicializado
14024        window.sampanewsVideoHandlerHorizontal = true;
14025
14026        // Inicializar na primeira execução
14027        if (document.readyState === 'loading') {
14028            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCardsHorizontal);
14029        } else {
14030            window.sampanewsInitVideoCardsHorizontal();
14031        }
14032    } else {
14033        // Se já existe, apenas reinicializa novos cards
14034        if (typeof window.sampanewsInitVideoCardsHorizontal === 'function') {
14035            window.sampanewsInitVideoCardsHorizontal();
14036        }
14037    }
14038
14039    // Observer otimizado com proteção anti-loop
14040    if (typeof window.sampanewsObserverVideoCardsHorizontal === 'undefined') {
14041        
14042        window.sampanewsObserverVideoCardsHorizontal = new MutationObserver(mutations => {
14043            // Evitar processamento durante inicialização
14044            if (isInitializing) return;
14045            
14046            // Debounce para evitar execuções excessivas
14047            clearTimeout(debounceTimeout);
14048            debounceTimeout = setTimeout(() => {
14049                try {
14050                    const relevantNodes = [];
14051                    
14052                    mutations.forEach(mutation => {
14053                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
14054                            Array.from(mutation.addedNodes).forEac
14054h(node => {
14055                                // Só processar nós elemento que podem conter ou ser cards de vídeo horizontais
14056                                if (node.nodeType === Node.ELEMENT_NODE &&
14057                                    (node.classList.contains('sampa-news-video-horizontal-card') ||
14058                                     node.querySelector?.('.sampa-news-video-horizontal-card') ||
14059                                     node.classList.contains('fragment') ||
14060                                     node.classList.contains('portlet'))) {
14061                                    relevantNodes.push(node);
14062                                }
14063                            });
14064                        }
14065                    });
14066                    
14067                    if (relevantNodes.length > 0) {
14068                        processRelevantNodes(relevantNodes);
14069                    }
14070                } catch (error) {
14071                    console.error('Erro no observer de vídeos horizontais:', error);
14072                }
14073            }, 150); // Debounce de 150ms
14074        });
14075        
14076        // Observer mais específico - só monitora containers relevantes
14077        const observeTargets = [
14078            document.querySelector('.sampa-news-horizontal-container'),
14079            document.querySelector('.sampa-news-container'),
14080            document.querySelector('#main-content'),
14081            document.querySelector('.portlet-boundary'),
14082            document.body // Fallback
14083        ].filter(Boolean);
14084        
14085        observeTargets.forEach(target => {
14086            window.sampanewsObserverVideoCardsHorizontal.observe(target, {
14087                childList: true,
14088                subtree: true
14089            });
14090        });
14091        
14092        // Cleanup ao sair da página
14093        window.addEventListener('beforeunload', function() {
14094            if (window.sampanewsObserverVideoCardsHorizontal) {
14095                window.sampanewsObserverVideoCardsHorizontal.disconnect();
14096            }
14097            clearTimeout(debounceTimeout);
14098        });
14099    }
14100})();;</script>
14100
14101              </div>
14102             </div>
14103             <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
14104              <div class="lfr-layout-structure-item-v-deos-curtos--copiar- lfr-layout-structure-item-9bac24e4-19de-ef1c-1911-0f805a3398cd " data-layout-structure-item-id="9bac24e4-19de-ef1c-1911-0f805a3398cd">
14105               <div id="fragment-ba987d42-d8d7-f7b4-76f0-0894501b5d27">
14106                <!-- HTML do Fragmento -->
14107                <div class="sampa-news-video-horizontal-card">
14108                 <picture data-fileentryid="55911435"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/55911435/Thumbnail-300x300/20260719_Entrega_EMEI_Antinio_Ermirio_de_Moraes_SB-04.jpg?t=1785513506484"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/55911435/Preview-1000x0/20260719_Entrega_EMEI_Antinio_Ermirio_de_Moraes_SB-04.jpg?t=1785513506484"><img class="sampa-news-video-horizontal-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/20260719_Entrega_EMEI_Antinio_Ermirio_de_Moraes_SB-04.jpg/6bc61248-7cde-7e99-d994-721dfa4cf148?version=1.0&amp;t=1785513506484" alt="EMEI Antônio Ermírio de Moraes" data-fileentryid="55911435"></picture>
14109                 <div class="sampa-news-video-horizontal-player-button">
14110                  <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
14111                   <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
14112                  </svg>
14113                 </div>
14114                 <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/watch?v=43ngLyjJZmI" style="display: none;">https://www.youtube.com/watch?v=43ngLyjJZmI</a> <iframe class="sampa-news-video-horizontal-iframe" src="" title="YouTube Video Player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy">
14115  </iframe>
14116                 <div class="sampa-news-video-horizontal-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Prefeitura inaugura EMEI Antônio Ermírio de Moraes na Zona Leste</div>
14117                </div>
14118               </div>
14119               
14119<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-ba987d42-d8d7-f7b4-76f0-0894501b5d27'); const fragmentElementId = 'fragment-ba987d42-d8d7-f7b4-76f0-0894501b5d27'; const fragmentEntryLinkNamespace = 'zrpl'; const fragmentNamespace = 'zrpl'; const layoutMode = 'view';(function () {
14120    // Usar uma única função global para evitar conflitos
14121    if (typeof window.sampanewsVideoHandlerHorizontal === 'undefined') {
14122
14123        // Cache selectors and regex patterns
14124        const videoPatterns = {
14125            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
14126            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
14127            watch: /[?&]v=([a-zA-Z0-9_-]+)/
14128        };
14129
14130        // Flag para evitar processamento durante inicialização
14131        let isInitializing = false;
14132        let debounceTimeout = null;
14133
14134        // Função para reproduzir vídeos
14135        window.sampanewsPlayVideoHorizontal = function (card) {
14136            try {
14137                const iframe = card.querySelector('.sampa-news-video-horizontal-iframe');
14138                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
14139                const url = linkElement?.getAttribute('href') || '';
14140
14141                if (!url || url === '#' || url === '') {
14142                    console.error('URL do vídeo não configurada');
14143                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
14144                    return;
14145                }
14146
14147                // Função melhorada para extrair ID do vídeo
14148                function extractVideoId(url) {
14149                    const patterns = [
14150                        /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/|youtube\.com\/shorts\/)([a-zA-Z0-9_-]{11})/,
14151                        /^([a-zA-Z0-9_-]{11})$/ // ID direto
14152                    ];
14153
14154                    for (const pattern of patterns) {
14155                        const match = url.match(pattern);
14156                        if (match) {
14157                            return match[1];
14158                        }
14159                    }
14160                    return null;
14161                }
14162
14163                // Converter URL do YouTube para embed
14164                let embedUrl = url;
14165
14166                if (url.includes('youtube.com/embed/')) {
14167                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0&rel=0`;
14168                } else {
14169                    const videoId = extractVideoId(url);
14170                    if (videoId) {
14171                        embedUrl = `https://www.youtube.com/embed/${videoId}?autoplay=1&mute=0&rel=0&modestbranding=1`;
14172                    } else {
14173                        console.error('Não foi possível extrair o ID do vídeo da URL:', url);
14174                        alert('URL do YouTube inválida. Verifique se a URL está correta.');
14175                        return;
14176                    }
14177                }
14178
14179                // Parar outros vídeos que estão tocando
14180                const playingCard = document.querySelector('.sampa-news-video-horizontal-card.sampa-news-playing');
14181                if (playingCard && playingCard !== card) {
14182                    playingCard.classList.remove('sampa-news-playing');
14183                    const playingIframe = playingCard.querySelector('.sampa-news-video-horizontal-iframe');
14184                    if (playingIframe) {
14185                        playingIframe.src = '';
14186                    }
14187                }
14188
14189                // Verificar se iframe existe antes de configurar
14190                if (!iframe) {
14191                    console.error('Iframe não encontrado no card');
14192                    return;
14193                }
14194
14195                // Adicionar tratamento de erro para o iframe
14196                iframe.onerror = function () {
14197                    console.error('Erro ao carregar o iframe do vídeo');
14198                    alert('Erro ao carregar o vídeo. Verifique a URL e tente novamente.');
14199                    card.classList.remove('sampa-news-playing');
14200                };
14201
14202                iframe.onload = function () {
14203                    // Iframe carregado com sucesso
14204                };
14205
14206                // Aplicar a classe e definir o src
14207                card.classList.add('sampa-news-playing');
14208                iframe.src = embedUrl;
14209            } catch (error) {
14210                console.error('Erro ao reproduzir vídeo horizontal:', error);
14211            }
14212        };
14213
14214        // Optimized event handler
14215        const handleCardClick = (e) => {
14216            e.preventDefault();
14217            e.stopPropagation();
14218            window.sampanewsPlayVideoHorizontal(e.currentTarget);
14219        };
14220
14221        // Função para inicializar um único card
14222        const initializeCard = (card) => {
14223            if (!card.hasAttribute('data-sampa-initialized')) {
14224                card.addEventListener('click', handleCardClick);
14225                card.setAttribute('data-sampa-initialized', 'true');
14226                return true;
14227            }
14228            return false;
14229        };
14230
14231        // Função otimizada para processar apenas nós relevantes
14232        const processRelevantNodes = (nodes) => {
14233            if (isInitializing) return;
14234            
14235            let processedCount = 0;
14236            
14237            nodes.forEach(node => {
14238                if (node.nodeType === Node.ELEMENT_NODE) {
14239                    let cardsToProcess = [];
14240                    
14241                    // Verificar se o próprio nó é um card horizontal
14242                    if (node.matches && node.matches('.sampa-news-video-horizontal-card')) {
14243                        cardsToProcess.push(node);
14244                    }
14245                    
14246                    // Verificar se contém cards horizontais (só se for um container relevante)
14247                    if (node.querySelector && 
14248                        (node.classList.contains('fragment') || 
14249                         node.classList.contains('portlet') ||
14250                         node.classList.contains('sampa-news') ||
14251                         node.querySelectorAll('.sampa-news-video-horizontal-card').length > 0)) {
14252                        
14253                        const childCards = node.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
14254                        cardsToProcess.push(...childCards);
14255                    }
14256                    
14257                    // Inicializar cards encontrados
14258                    cardsToProcess.forEach(card => {
14259                        if (initializeCard(card)) {
14260                            processedCount++;
14261                        }
14262                    });
14263                }
14264            });
14265            
14266            if (processedCount > 0) {
14267                console.log(`Sampa News Horizontal: Inicializados ${processedCount} novos cards de vídeo`);
14268            }
14269        };
14270
14271        // Função para inicializar event listeners
14272        window.sampanewsInitVideoCardsHorizontal = function () {
14273            if (isInitializing) return;
14274            isInitializing = true;
14275            
14276            try {
14277                let initializedCount = 0;
14278                const cards = document.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
14279                
14280                cards.forEach(card => {
14281                    if (initializeCard(card)) {
14282                        initializedCount++;
14283                    }
14284                });
14285                
14286                if (initializedCount > 0) {
14287                    console.log(`Sampa News Horizontal: Inicializados ${initializedCount} cards de vídeo`);
14288                }
14289            } catch (error) {
14290                console.error('Erro ao inicializar cards de vídeo horizontais:', error);
14291            } finally {
14292                isInitializing = false;
14293            }
14294        };
14295
14296        // Marcar como inicializado
14297        window.sampanewsVideoHandlerHorizontal = true;
14298
14299        // Inicializar na primeira execução
14300        if (document.readyState === 'loading') {
14301            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCardsHorizontal);
14302        } else {
14303            window.sampanewsInitVideoCardsHorizontal();
14304        }
14305    } else {
14306        // Se já existe, apenas reinicializa novos cards
14307        if (typeof window.sampanewsInitVideoCardsHorizontal === 'function') {
14308            window.sampanewsInitVideoCardsHorizontal();
14309        }
14310    }
14311
14312    // Observer otimizado com proteção anti-loop
14313    if (typeof window.sampanewsObserverVideoCardsHorizontal === 'undefined') {
14314        
14315        window.sampanewsObserverVideoCardsHorizontal = new MutationObserver(mutations => {
14316            // Evitar processamento durante inicialização
14317            if (isInitializing) return;
14318            
14319            // Debounce para evitar execuções excessivas
14320            clearTimeout(debounceTimeout);
14321            debounceTimeout = setTimeout(() => {
14322                try {
14323                    const relevantNodes = [];
14324                    
14325                    mutations.forEach(mutation => {
14326                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
14327                            Array.from(mutation.addedNodes).forEac
14327h(node => {
14328                                // Só processar nós elemento que podem conter ou ser cards de vídeo horizontais
14329                                if (node.nodeType === Node.ELEMENT_NODE &&
14330                                    (node.classList.contains('sampa-news-video-horizontal-card') ||
14331                                     node.querySelector?.('.sampa-news-video-horizontal-card') ||
14332                                     node.classList.contains('fragment') ||
14333                                     node.classList.contains('portlet'))) {
14334                                    relevantNodes.push(node);
14335                                }
14336                            });
14337                        }
14338                    });
14339                    
14340                    if (relevantNodes.length > 0) {
14341                        processRelevantNodes(relevantNodes);
14342                    }
14343                } catch (error) {
14344                    console.error('Erro no observer de vídeos horizontais:', error);
14345                }
14346            }, 150); // Debounce de 150ms
14347        });
14348        
14349        // Observer mais específico - só monitora containers relevantes
14350        const observeTargets = [
14351            document.querySelector('.sampa-news-horizontal-container'),
14352            document.querySelector('.sampa-news-container'),
14353            document.querySelector('#main-content'),
14354            document.querySelector('.portlet-boundary'),
14355            document.body // Fallback
14356        ].filter(Boolean);
14357        
14358        observeTargets.forEach(target => {
14359            window.sampanewsObserverVideoCardsHorizontal.observe(target, {
14360                childList: true,
14361                subtree: true
14362            });
14363        });
14364        
14365        // Cleanup ao sair da página
14366        window.addEventListener('beforeunload', function() {
14367            if (window.sampanewsObserverVideoCardsHorizontal) {
14368                window.sampanewsObserverVideoCardsHorizontal.disconnect();
14369            }
14370            clearTimeout(debounceTimeout);
14371        });
14372    }
14373})();;</script>
14373
14374              </div>
14375             </div>
14376             <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
14377              <div class="lfr-layout-structure-item-v-deos-curtos--copiar- lfr-layout-structure-item-9bac24e4-19de-ef1c-1911-0f805a3398cd " data-layout-structure-item-id="9bac24e4-19de-ef1c-1911-0f805a3398cd">
14378               <div id="fragment-350ad159-e413-d79e-cb11-c6cefdfc73eb">
14379                <!-- HTML do Fragmento -->
14380                <div class="sampa-news-video-horizontal-card">
14381                 <picture data-fileentryid="55875598"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/55875598/Thumbnail-300x300/Captura+de+tela+2026-07-31+112649.png?t=1785508023968"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/55875598/Preview-1000x0/Captura+de+tela+2026-07-31+112649.png?t=1785508023968"><img class="sampa-news-video-horizontal-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/Captura+de+tela+2026-07-31+112649.png/4e88de75-2331-3369-cd76-bd7c13562c83?version=1.0&amp;t=1785508023968" alt="UBS Cidade Dutra" data-fileentryid="55875598"></picture>
14382                 <div class="sampa-news-video-horizontal-player-button">
14383                  <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
14384                   <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
14385                  </svg>
14386                 </div>
14387                 <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/watch?v=Y0ETk8gMrYw" style="display: none;">https://www.youtube.com/watch?v=Y0ETk8gMrYw</a> <iframe class="sampa-news-video-horizontal-iframe" src="" title="YouTube Video Player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy">
14388  </iframe>
14389                 <div class="sampa-news-video-horizontal-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Prefeitura inaugura a 483ª UBS da capital</div>
14390                </div>
14391               </div>
14392               
14392<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-350ad159-e413-d79e-cb11-c6cefdfc73eb'); const fragmentElementId = 'fragment-350ad159-e413-d79e-cb11-c6cefdfc73eb'; const fragmentEntryLinkNamespace = 'zrpl'; const fragmentNamespace = 'zrpl'; const layoutMode = 'view';(function () {
14393    // Usar uma única função global para evitar conflitos
14394    if (typeof window.sampanewsVideoHandlerHorizontal === 'undefined') {
14395
14396        // Cache selectors and regex patterns
14397        const videoPatterns = {
14398            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
14399            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
14400            watch: /[?&]v=([a-zA-Z0-9_-]+)/
14401        };
14402
14403        // Flag para evitar processamento durante inicialização
14404        let isInitializing = false;
14405        let debounceTimeout = null;
14406
14407        // Função para reproduzir vídeos
14408        window.sampanewsPlayVideoHorizontal = function (card) {
14409            try {
14410                const iframe = card.querySelector('.sampa-news-video-horizontal-iframe');
14411                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
14412                const url = linkElement?.getAttribute('href') || '';
14413
14414                if (!url || url === '#' || url === '') {
14415                    console.error('URL do vídeo não configurada');
14416                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
14417                    return;
14418                }
14419
14420                // Função melhorada para extrair ID do vídeo
14421                function extractVideoId(url) {
14422                    const patterns = [
14423                        /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/|youtube\.com\/shorts\/)([a-zA-Z0-9_-]{11})/,
14424                        /^([a-zA-Z0-9_-]{11})$/ // ID direto
14425                    ];
14426
14427                    for (const pattern of patterns) {
14428                        const match = url.match(pattern);
14429                        if (match) {
14430                            return match[1];
14431                        }
14432                    }
14433                    return null;
14434                }
14435
14436                // Converter URL do YouTube para embed
14437                let embedUrl = url;
14438
14439                if (url.includes('youtube.com/embed/')) {
14440                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0&rel=0`;
14441                } else {
14442                    const videoId = extractVideoId(url);
14443                    if (videoId) {
14444                        embedUrl = `https://www.youtube.com/embed/${videoId}?autoplay=1&mute=0&rel=0&modestbranding=1`;
14445                    } else {
14446                        console.error('Não foi possível extrair o ID do vídeo da URL:', url);
14447                        alert('URL do YouTube inválida. Verifique se a URL está correta.');
14448                        return;
14449                    }
14450                }
14451
14452                // Parar outros vídeos que estão tocando
14453                const playingCard = document.querySelector('.sampa-news-video-horizontal-card.sampa-news-playing');
14454                if (playingCard && playingCard !== card) {
14455                    playingCard.classList.remove('sampa-news-playing');
14456                    const playingIframe = playingCard.querySelector('.sampa-news-video-horizontal-iframe');
14457                    if (playingIframe) {
14458                        playingIframe.src = '';
14459                    }
14460                }
14461
14462                // Verificar se iframe existe antes de configurar
14463                if (!iframe) {
14464                    console.error('Iframe não encontrado no card');
14465                    return;
14466                }
14467
14468                // Adicionar tratamento de erro para o iframe
14469                iframe.onerror = function () {
14470                    console.error('Erro ao carregar o iframe do vídeo');
14471                    alert('Erro ao carregar o vídeo. Verifique a URL e tente novamente.');
14472                    card.classList.remove('sampa-news-playing');
14473                };
14474
14475                iframe.onload = function () {
14476                    // Iframe carregado com sucesso
14477                };
14478
14479                // Aplicar a classe e definir o src
14480                card.classList.add('sampa-news-playing');
14481                iframe.src = embedUrl;
14482            } catch (error) {
14483                console.error('Erro ao reproduzir vídeo horizontal:', error);
14484            }
14485        };
14486
14487        // Optimized event handler
14488        const handleCardClick = (e) => {
14489            e.preventDefault();
14490            e.stopPropagation();
14491            window.sampanewsPlayVideoHorizontal(e.currentTarget);
14492        };
14493
14494        // Função para inicializar um único card
14495        const initializeCard = (card) => {
14496            if (!card.hasAttribute('data-sampa-initialized')) {
14497                card.addEventListener('click', handleCardClick);
14498                card.setAttribute('data-sampa-initialized', 'true');
14499                return true;
14500            }
14501            return false;
14502        };
14503
14504        // Função otimizada para processar apenas nós relevantes
14505        const processRelevantNodes = (nodes) => {
14506            if (isInitializing) return;
14507            
14508            let processedCount = 0;
14509            
14510            nodes.forEach(node => {
14511                if (node.nodeType === Node.ELEMENT_NODE) {
14512                    let cardsToProcess = [];
14513                    
14514                    // Verificar se o próprio nó é um card horizontal
14515                    if (node.matches && node.matches('.sampa-news-video-horizontal-card')) {
14516                        cardsToProcess.push(node);
14517                    }
14518                    
14519                    // Verificar se contém cards horizontais (só se for um container relevante)
14520                    if (node.querySelector && 
14521                        (node.classList.contains('fragment') || 
14522                         node.classList.contains('portlet') ||
14523                         node.classList.contains('sampa-news') ||
14524                         node.querySelectorAll('.sampa-news-video-horizontal-card').length > 0)) {
14525                        
14526                        const childCards = node.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
14527                        cardsToProcess.push(...childCards);
14528                    }
14529                    
14530                    // Inicializar cards encontrados
14531                    cardsToProcess.forEach(card => {
14532                        if (initializeCard(card)) {
14533                            processedCount++;
14534                        }
14535                    });
14536                }
14537            });
14538            
14539            if (processedCount > 0) {
14540                console.log(`Sampa News Horizontal: Inicializados ${processedCount} novos cards de vídeo`);
14541            }
14542        };
14543
14544        // Função para inicializar event listeners
14545        window.sampanewsInitVideoCardsHorizontal = function () {
14546            if (isInitializing) return;
14547            isInitializing = true;
14548            
14549            try {
14550                let initializedCount = 0;
14551                const cards = document.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
14552                
14553                cards.forEach(card => {
14554                    if (initializeCard(card)) {
14555                        initializedCount++;
14556                    }
14557                });
14558                
14559                if (initializedCount > 0) {
14560                    console.log(`Sampa News Horizontal: Inicializados ${initializedCount} cards de vídeo`);
14561                }
14562            } catch (error) {
14563                console.error('Erro ao inicializar cards de vídeo horizontais:', error);
14564            } finally {
14565                isInitializing = false;
14566            }
14567        };
14568
14569        // Marcar como inicializado
14570        window.sampanewsVideoHandlerHorizontal = true;
14571
14572        // Inicializar na primeira execução
14573        if (document.readyState === 'loading') {
14574            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCardsHorizontal);
14575        } else {
14576            window.sampanewsInitVideoCardsHorizontal();
14577        }
14578    } else {
14579        // Se já existe, apenas reinicializa novos cards
14580        if (typeof window.sampanewsInitVideoCardsHorizontal === 'function') {
14581            window.sampanewsInitVideoCardsHorizontal();
14582        }
14583    }
14584
14585    // Observer otimizado com proteção anti-loop
14586    if (typeof window.sampanewsObserverVideoCardsHorizontal === 'undefined') {
14587        
14588        window.sampanewsObserverVideoCardsHorizontal = new MutationObserver(mutations => {
14589            // Evitar processamento durante inicialização
14590            if (isInitializing) return;
14591            
14592            // Debounce para evitar execuções excessivas
14593            clearTimeout(debounceTimeout);
14594            debounceTimeout = setTimeout(() => {
14595                try {
14596                    const relevantNodes = [];
14597                    
14598                    mutations.forEach(mutation => {
14599                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
14600                            Array.from(mutation.addedNodes).forEac
14600h(node => {
14601                                // Só processar nós elemento que podem conter ou ser cards de vídeo horizontais
14602                                if (node.nodeType === Node.ELEMENT_NODE &&
14603                                    (node.classList.contains('sampa-news-video-horizontal-card') ||
14604                                     node.querySelector?.('.sampa-news-video-horizontal-card') ||
14605                                     node.classList.contains('fragment') ||
14606                                     node.classList.contains('portlet'))) {
14607                                    relevantNodes.push(node);
14608                                }
14609                            });
14610                        }
14611                    });
14612                    
14613                    if (relevantNodes.length > 0) {
14614                        processRelevantNodes(relevantNodes);
14615                    }
14616                } catch (error) {
14617                    console.error('Erro no observer de vídeos horizontais:', error);
14618                }
14619            }, 150); // Debounce de 150ms
14620        });
14621        
14622        // Observer mais específico - só monitora containers relevantes
14623        const observeTargets = [
14624            document.querySelector('.sampa-news-horizontal-container'),
14625            document.querySelector('.sampa-news-container'),
14626            document.querySelector('#main-content'),
14627            document.querySelector('.portlet-boundary'),
14628            document.body // Fallback
14629        ].filter(Boolean);
14630        
14631        observeTargets.forEach(target => {
14632            window.sampanewsObserverVideoCardsHorizontal.observe(target, {
14633                childList: true,
14634                subtree: true
14635            });
14636        });
14637        
14638        // Cleanup ao sair da página
14639        window.addEventListener('beforeunload', function() {
14640            if (window.sampanewsObserverVideoCardsHorizontal) {
14641                window.sampanewsObserverVideoCardsHorizontal.disconnect();
14642            }
14643            clearTimeout(debounceTimeout);
14644        });
14645    }
14646})();;</script>
14646
14647              </div>
14648             </div>
14649             <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
14650              <div class="lfr-layout-structure-item-v-deos-curtos--copiar- lfr-layout-structure-item-9bac24e4-19de-ef1c-1911-0f805a3398cd " data-layout-structure-item-id="9bac24e4-19de-ef1c-1911-0f805a3398cd">
14651               <div id="fragment-ced1d6ef-de29-e880-5e03-9407a6160c5a">
14652                <!-- HTML do Fragmento -->
14653                <div class="sampa-news-video-horizontal-card">
14654                 <picture data-fileentryid="55862059"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/55862059/Thumbnail-300x300/Captura+de+tela+2026-07-31+104425.png?t=1785505498181"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/55862059/Preview-1000x0/Captura+de+tela+2026-07-31+104425.png?t=1785505498181"><img class="sampa-news-video-horizontal-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/Captura+de+tela+2026-07-31+104425.png/32885ea1-935c-5498-d2f9-2b20bf43e1ec?version=1.0&amp;t=1785505498181" alt="Hospital Veterinário Municipal Cão Caramelo" data-fileentryid="55862059"></picture>
14655                 <div class="sampa-news-video-horizontal-player-button">
14656                  <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
14657                   <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
14658                  </svg>
14659                 </div>
14660                 <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/watch?v=8M0SXBWiJpE" style="display: none;">https://www.youtube.com/watch?v=8M0SXBWiJpE</a> <iframe class="sampa-news-video-horizontal-iframe" src="" title="YouTube Video Player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy">
14661  </iframe>
14662                 <div class="sampa-news-video-horizontal-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Hospital Veterinário Cão Caramelo é inaugurado em São Miguel</div>
14663                </div>
14664               </div>
14665               
14665<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-ced1d6ef-de29-e880-5e03-9407a6160c5a'); const fragmentElementId = 'fragment-ced1d6ef-de29-e880-5e03-9407a6160c5a'; const fragmentEntryLinkNamespace = 'zrpl'; const fragmentNamespace = 'zrpl'; const layoutMode = 'view';(function () {
14666    // Usar uma única função global para evitar conflitos
14667    if (typeof window.sampanewsVideoHandlerHorizontal === 'undefined') {
14668
14669        // Cache selectors and regex patterns
14670        const videoPatterns = {
14671            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
14672            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
14673            watch: /[?&]v=([a-zA-Z0-9_-]+)/
14674        };
14675
14676        // Flag para evitar processamento durante inicialização
14677        let isInitializing = false;
14678        let debounceTimeout = null;
14679
14680        // Função para reproduzir vídeos
14681        window.sampanewsPlayVideoHorizontal = function (card) {
14682            try {
14683                const iframe = card.querySelector('.sampa-news-video-horizontal-iframe');
14684                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
14685                const url = linkElement?.getAttribute('href') || '';
14686
14687                if (!url || url === '#' || url === '') {
14688                    console.error('URL do vídeo não configurada');
14689                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
14690                    return;
14691                }
14692
14693                // Função melhorada para extrair ID do vídeo
14694                function extractVideoId(url) {
14695                    const patterns = [
14696                        /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/|youtube\.com\/shorts\/)([a-zA-Z0-9_-]{11})/,
14697                        /^([a-zA-Z0-9_-]{11})$/ // ID direto
14698                    ];
14699
14700                    for (const pattern of patterns) {
14701                        const match = url.match(pattern);
14702                        if (match) {
14703                            return match[1];
14704                        }
14705                    }
14706                    return null;
14707                }
14708
14709                // Converter URL do YouTube para embed
14710                let embedUrl = url;
14711
14712                if (url.includes('youtube.com/embed/')) {
14713                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0&rel=0`;
14714                } else {
14715                    const videoId = extractVideoId(url);
14716                    if (videoId) {
14717                        embedUrl = `https://www.youtube.com/embed/${videoId}?autoplay=1&mute=0&rel=0&modestbranding=1`;
14718                    } else {
14719                        console.error('Não foi possível extrair o ID do vídeo da URL:', url);
14720                        alert('URL do YouTube inválida. Verifique se a URL está correta.');
14721                        return;
14722                    }
14723                }
14724
14725                // Parar outros vídeos que estão tocando
14726                const playingCard = document.querySelector('.sampa-news-video-horizontal-card.sampa-news-playing');
14727                if (playingCard && playingCard !== card) {
14728                    playingCard.classList.remove('sampa-news-playing');
14729                    const playingIframe = playingCard.querySelector('.sampa-news-video-horizontal-iframe');
14730                    if (playingIframe) {
14731                        playingIframe.src = '';
14732                    }
14733                }
14734
14735                // Verificar se iframe existe antes de configurar
14736                if (!iframe) {
14737                    console.error('Iframe não encontrado no card');
14738                    return;
14739                }
14740
14741                // Adicionar tratamento de erro para o iframe
14742                iframe.onerror = function () {
14743                    console.error('Erro ao carregar o iframe do vídeo');
14744                    alert('Erro ao carregar o vídeo. Verifique a URL e tente novamente.');
14745                    card.classList.remove('sampa-news-playing');
14746                };
14747
14748                iframe.onload = function () {
14749                    // Iframe carregado com sucesso
14750                };
14751
14752                // Aplicar a classe e definir o src
14753                card.classList.add('sampa-news-playing');
14754                iframe.src = embedUrl;
14755            } catch (error) {
14756                console.error('Erro ao reproduzir vídeo horizontal:', error);
14757            }
14758        };
14759
14760        // Optimized event handler
14761        const handleCardClick = (e) => {
14762            e.preventDefault();
14763            e.stopPropagation();
14764            window.sampanewsPlayVideoHorizontal(e.currentTarget);
14765        };
14766
14767        // Função para inicializar um único card
14768        const initializeCard = (card) => {
14769            if (!card.hasAttribute('data-sampa-initialized')) {
14770                card.addEventListener('click', handleCardClick);
14771                card.setAttribute('data-sampa-initialized', 'true');
14772                return true;
14773            }
14774            return false;
14775        };
14776
14777        // Função otimizada para processar apenas nós relevantes
14778        const processRelevantNodes = (nodes) => {
14779            if (isInitializing) return;
14780            
14781            let processedCount = 0;
14782            
14783            nodes.forEach(node => {
14784                if (node.nodeType === Node.ELEMENT_NODE) {
14785                    let cardsToProcess = [];
14786                    
14787                    // Verificar se o próprio nó é um card horizontal
14788                    if (node.matches && node.matches('.sampa-news-video-horizontal-card')) {
14789                        cardsToProcess.push(node);
14790                    }
14791                    
14792                    // Verificar se contém cards horizontais (só se for um container relevante)
14793                    if (node.querySelector && 
14794                        (node.classList.contains('fragment') || 
14795                         node.classList.contains('portlet') ||
14796                         node.classList.contains('sampa-news') ||
14797                         node.querySelectorAll('.sampa-news-video-horizontal-card').length > 0)) {
14798                        
14799                        const childCards = node.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
14800                        cardsToProcess.push(...childCards);
14801                    }
14802                    
14803                    // Inicializar cards encontrados
14804                    cardsToProcess.forEach(card => {
14805                        if (initializeCard(card)) {
14806                            processedCount++;
14807                        }
14808                    });
14809                }
14810            });
14811            
14812            if (processedCount > 0) {
14813                console.log(`Sampa News Horizontal: Inicializados ${processedCount} novos cards de vídeo`);
14814            }
14815        };
14816
14817        // Função para inicializar event listeners
14818        window.sampanewsInitVideoCardsHorizontal = function () {
14819            if (isInitializing) return;
14820            isInitializing = true;
14821            
14822            try {
14823                let initializedCount = 0;
14824                const cards = document.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
14825                
14826                cards.forEach(card => {
14827                    if (initializeCard(card)) {
14828                        initializedCount++;
14829                    }
14830                });
14831                
14832                if (initializedCount > 0) {
14833                    console.log(`Sampa News Horizontal: Inicializados ${initializedCount} cards de vídeo`);
14834                }
14835            } catch (error) {
14836                console.error('Erro ao inicializar cards de vídeo horizontais:', error);
14837            } finally {
14838                isInitializing = false;
14839            }
14840        };
14841
14842        // Marcar como inicializado
14843        window.sampanewsVideoHandlerHorizontal = true;
14844
14845        // Inicializar na primeira execução
14846        if (document.readyState === 'loading') {
14847            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCardsHorizontal);
14848        } else {
14849            window.sampanewsInitVideoCardsHorizontal();
14850        }
14851    } else {
14852        // Se já existe, apenas reinicializa novos cards
14853        if (typeof window.sampanewsInitVideoCardsHorizontal === 'function') {
14854            window.sampanewsInitVideoCardsHorizontal();
14855        }
14856    }
14857
14858    // Observer otimizado com proteção anti-loop
14859    if (typeof window.sampanewsObserverVideoCardsHorizontal === 'undefined') {
14860        
14861        window.sampanewsObserverVideoCardsHorizontal = new MutationObserver(mutations => {
14862            // Evitar processamento durante inicialização
14863            if (isInitializing) return;
14864            
14865            // Debounce para evitar execuções excessivas
14866            clearTimeout(debounceTimeout);
14867            debounceTimeout = setTimeout(() => {
14868                try {
14869                    const relevantNodes = [];
14870                    
14871                    mutations.forEach(mutation => {
14872                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
14873                            Array.from(mutation.addedNodes).forEac
14873h(node => {
14874                                // Só processar nós elemento que podem conter ou ser cards de vídeo horizontais
14875                                if (node.nodeType === Node.ELEMENT_NODE &&
14876                                    (node.classList.contains('sampa-news-video-horizontal-card') ||
14877                                     node.querySelector?.('.sampa-news-video-horizontal-card') ||
14878                                     node.classList.contains('fragment') ||
14879                                     node.classList.contains('portlet'))) {
14880                                    relevantNodes.push(node);
14881                                }
14882                            });
14883                        }
14884                    });
14885                    
14886                    if (relevantNodes.length > 0) {
14887                        processRelevantNodes(relevantNodes);
14888                    }
14889                } catch (error) {
14890                    console.error('Erro no observer de vídeos horizontais:', error);
14891                }
14892            }, 150); // Debounce de 150ms
14893        });
14894        
14895        // Observer mais específico - só monitora containers relevantes
14896        const observeTargets = [
14897            document.querySelector('.sampa-news-horizontal-container'),
14898            document.querySelector('.sampa-news-container'),
14899            document.querySelector('#main-content'),
14900            document.querySelector('.portlet-boundary'),
14901            document.body // Fallback
14902        ].filter(Boolean);
14903        
14904        observeTargets.forEach(target => {
14905            window.sampanewsObserverVideoCardsHorizontal.observe(target, {
14906                childList: true,
14907                subtree: true
14908            });
14909        });
14910        
14911        // Cleanup ao sair da página
14912        window.addEventListener('beforeunload', function() {
14913            if (window.sampanewsObserverVideoCardsHorizontal) {
14914                window.sampanewsObserverVideoCardsHorizontal.disconnect();
14915            }
14916            clearTimeout(debounceTimeout);
14917        });
14918    }
14919})();;</script>
14919
14920              </div>
14921             </div>
14922             <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
14923              <div class="lfr-layout-structure-item-v-deos-curtos--copiar- lfr-layout-structure-item-9bac24e4-19de-ef1c-1911-0f805a3398cd " data-layout-structure-item-id="9bac24e4-19de-ef1c-1911-0f805a3398cd">
14924               <div id="fragment-40735bda-41c9-6372-1b09-3cf4b39c2ebe">
14925                <!-- HTML do Fragmento -->
14926                <div class="sampa-news-video-horizontal-card">
14927                 <picture data-fileentryid="52567789"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/52567789/Thumbnail-300x300/20260701_PRA%C3%87A_DO_TRIUNFO_0035_JFD.jpg?t=1784047394707"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/52567789/Preview-1000x0/20260701_PRA%C3%87A_DO_TRIUNFO_0035_JFD.jpg?t=1784047394707"><img class="sampa-news-video-horizontal-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/24784844/20260701_PRA%C3%87A_DO_TRIUNFO_0035_JFD.jpg/b85c938c-9dd0-5446-f025-e7d9f5978736?version=1.0&amp;t=1784047394707" alt="Prefeitura entrega a Praça do Triunfo, onde antes ficava a extinta Cracolândia" data-fileentryid="52567789"></picture>
14928                 <div class="sampa-news-video-horizontal-player-button">
14929                  <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
14930                   <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
14931                  </svg>
14932                 </div>
14933                 <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/watch?v=vTARuP6mJ7g" style="display: none;">https://www.youtube.com/watch?v=vTARuP6mJ7g</a> <iframe class="sampa-news-video-horizontal-iframe" src="" title="YouTube Video Player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy">
14934  </iframe>
14935                 <div class="sampa-news-video-horizontal-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Prefeitura entrega a Praça do Triunfo, onde antes ficava a extinta Cracolândia</div>
14936                </div>
14937               </div>
14938               
14938<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-40735bda-41c9-6372-1b09-3cf4b39c2ebe'); const fragmentElementId = 'fragment-40735bda-41c9-6372-1b09-3cf4b39c2ebe'; const fragmentEntryLinkNamespace = 'zrpl'; const fragmentNamespace = 'zrpl'; const layoutMode = 'view';(function () {
14939    // Usar uma única função global para evitar conflitos
14940    if (typeof window.sampanewsVideoHandlerHorizontal === 'undefined') {
14941
14942        // Cache selectors and regex patterns
14943        const videoPatterns = {
14944            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
14945            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
14946            watch: /[?&]v=([a-zA-Z0-9_-]+)/
14947        };
14948
14949        // Flag para evitar processamento durante inicialização
14950        let isInitializing = false;
14951        let debounceTimeout = null;
14952
14953        // Função para reproduzir vídeos
14954        window.sampanewsPlayVideoHorizontal = function (card) {
14955            try {
14956                const iframe = card.querySelector('.sampa-news-video-horizontal-iframe');
14957                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
14958                const url = linkElement?.getAttribute('href') || '';
14959
14960                if (!url || url === '#' || url === '') {
14961                    console.error('URL do vídeo não configurada');
14962                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
14963                    return;
14964                }
14965
14966                // Função melhorada para extrair ID do vídeo
14967                function extractVideoId(url) {
14968                    const patterns = [
14969                        /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/|youtube\.com\/shorts\/)([a-zA-Z0-9_-]{11})/,
14970                        /^([a-zA-Z0-9_-]{11})$/ // ID direto
14971                    ];
14972
14973                    for (const pattern of patterns) {
14974                        const match = url.match(pattern);
14975                        if (match) {
14976                            return match[1];
14977                        }
14978                    }
14979                    return null;
14980                }
14981
14982                // Converter URL do YouTube para embed
14983                let embedUrl = url;
14984
14985                if (url.includes('youtube.com/embed/')) {
14986                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0&rel=0`;
14987                } else {
14988                    const videoId = extractVideoId(url);
14989                    if (videoId) {
14990                        embedUrl = `https://www.youtube.com/embed/${videoId}?autoplay=1&mute=0&rel=0&modestbranding=1`;
14991                    } else {
14992                        console.error('Não foi possível extrair o ID do vídeo da URL:', url);
14993                        alert('URL do YouTube inválida. Verifique se a URL está correta.');
14994                        return;
14995                    }
14996                }
14997
14998                // Parar outros vídeos que estão tocando
14999                const playingCard = document.querySelector('.sampa-news-video-horizontal-card.sampa-news-playing');
15000                if (playingCard && playingCard !== card) {
15001                    playingCard.classList.remove('sampa-news-playing');
15002                    const playingIframe = playingCard.querySelector('.sampa-news-video-horizontal-iframe');
15003                    if (playingIframe) {
15004                        playingIframe.src = '';
15005                    }
15006                }
15007
15008                // Verificar se iframe existe antes de configurar
15009                if (!iframe) {
15010                    console.error('Iframe não encontrado no card');
15011                    return;
15012                }
15013
15014                // Adicionar tratamento de erro para o iframe
15015                iframe.onerror = function () {
15016                    console.error('Erro ao carregar o iframe do vídeo');
15017                    alert('Erro ao carregar o vídeo. Verifique a URL e tente novamente.');
15018                    card.classList.remove('sampa-news-playing');
15019                };
15020
15021                iframe.onload = function () {
15022                    // Iframe carregado com sucesso
15023                };
15024
15025                // Aplicar a classe e definir o src
15026                card.classList.add('sampa-news-playing');
15027                iframe.src = embedUrl;
15028            } catch (error) {
15029                console.error('Erro ao reproduzir vídeo horizontal:', error);
15030            }
15031        };
15032
15033        // Optimized event handler
15034        const handleCardClick = (e) => {
15035            e.preventDefault();
15036            e.stopPropagation();
15037            window.sampanewsPlayVideoHorizontal(e.currentTarget);
15038        };
15039
15040        // Função para inicializar um único card
15041        const initializeCard = (card) => {
15042            if (!card.hasAttribute('data-sampa-initialized')) {
15043                card.addEventListener('click', handleCardClick);
15044                card.setAttribute('data-sampa-initialized', 'true');
15045                return true;
15046            }
15047            return false;
15048        };
15049
15050        // Função otimizada para processar apenas nós relevantes
15051        const processRelevantNodes = (nodes) => {
15052            if (isInitializing) return;
15053            
15054            let processedCount = 0;
15055            
15056            nodes.forEach(node => {
15057                if (node.nodeType === Node.ELEMENT_NODE) {
15058                    let cardsToProcess = [];
15059                    
15060                    // Verificar se o próprio nó é um card horizontal
15061                    if (node.matches && node.matches('.sampa-news-video-horizontal-card')) {
15062                        cardsToProcess.push(node);
15063                    }
15064                    
15065                    // Verificar se contém cards horizontais (só se for um container relevante)
15066                    if (node.querySelector && 
15067                        (node.classList.contains('fragment') || 
15068                         node.classList.contains('portlet') ||
15069                         node.classList.contains('sampa-news') ||
15070                         node.querySelectorAll('.sampa-news-video-horizontal-card').length > 0)) {
15071                        
15072                        const childCards = node.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
15073                        cardsToProcess.push(...childCards);
15074                    }
15075                    
15076                    // Inicializar cards encontrados
15077                    cardsToProcess.forEach(card => {
15078                        if (initializeCard(card)) {
15079                            processedCount++;
15080                        }
15081                    });
15082                }
15083            });
15084            
15085            if (processedCount > 0) {
15086                console.log(`Sampa News Horizontal: Inicializados ${processedCount} novos cards de vídeo`);
15087            }
15088        };
15089
15090        // Função para inicializar event listeners
15091        window.sampanewsInitVideoCardsHorizontal = function () {
15092            if (isInitializing) return;
15093            isInitializing = true;
15094            
15095            try {
15096                let initializedCount = 0;
15097                const cards = document.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
15098                
15099                cards.forEach(card => {
15100                    if (initializeCard(card)) {
15101                        initializedCount++;
15102                    }
15103                });
15104                
15105                if (initializedCount > 0) {
15106                    console.log(`Sampa News Horizontal: Inicializados ${initializedCount} cards de vídeo`);
15107                }
15108            } catch (error) {
15109                console.error('Erro ao inicializar cards de vídeo horizontais:', error);
15110            } finally {
15111                isInitializing = false;
15112            }
15113        };
15114
15115        // Marcar como inicializado
15116        window.sampanewsVideoHandlerHorizontal = true;
15117
15118        // Inicializar na primeira execução
15119        if (document.readyState === 'loading') {
15120            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCardsHorizontal);
15121        } else {
15122            window.sampanewsInitVideoCardsHorizontal();
15123        }
15124    } else {
15125        // Se já existe, apenas reinicializa novos cards
15126        if (typeof window.sampanewsInitVideoCardsHorizontal === 'function') {
15127            window.sampanewsInitVideoCardsHorizontal();
15128        }
15129    }
15130
15131    // Observer otimizado com proteção anti-loop
15132    if (typeof window.sampanewsObserverVideoCardsHorizontal === 'undefined') {
15133        
15134        window.sampanewsObserverVideoCardsHorizontal = new MutationObserver(mutations => {
15135            // Evitar processamento durante inicialização
15136            if (isInitializing) return;
15137            
15138            // Debounce para evitar execuções excessivas
15139            clearTimeout(debounceTimeout);
15140            debounceTimeout = setTimeout(() => {
15141                try {
15142                    const relevantNodes = [];
15143                    
15144                    mutations.forEach(mutation => {
15145                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
15146                            Array.from(mutation.addedNodes).forEac
15146h(node => {
15147                                // Só processar nós elemento que podem conter ou ser cards de vídeo horizontais
15148                                if (node.nodeType === Node.ELEMENT_NODE &&
15149                                    (node.classList.contains('sampa-news-video-horizontal-card') ||
15150                                     node.querySelector?.('.sampa-news-video-horizontal-card') ||
15151                                     node.classList.contains('fragment') ||
15152                                     node.classList.contains('portlet'))) {
15153                                    relevantNodes.push(node);
15154                                }
15155                            });
15156                        }
15157                    });
15158                    
15159                    if (relevantNodes.length > 0) {
15160                        processRelevantNodes(relevantNodes);
15161                    }
15162                } catch (error) {
15163                    console.error('Erro no observer de vídeos horizontais:', error);
15164                }
15165            }, 150); // Debounce de 150ms
15166        });
15167        
15168        // Observer mais específico - só monitora containers relevantes
15169        const observeTargets = [
15170            document.querySelector('.sampa-news-horizontal-container'),
15171            document.querySelector('.sampa-news-container'),
15172            document.querySelector('#main-content'),
15173            document.querySelector('.portlet-boundary'),
15174            document.body // Fallback
15175        ].filter(Boolean);
15176        
15177        observeTargets.forEach(target => {
15178            window.sampanewsObserverVideoCardsHorizontal.observe(target, {
15179                childList: true,
15180                subtree: true
15181            });
15182        });
15183        
15184        // Cleanup ao sair da página
15185        window.addEventListener('beforeunload', function() {
15186            if (window.sampanewsObserverVideoCardsHorizontal) {
15187                window.sampanewsObserverVideoCardsHorizontal.disconnect();
15188            }
15189            clearTimeout(debounceTimeout);
15190        });
15191    }
15192})();;</script>
15192
15193              </div>
15194             </div>
15195             <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
15196              <div class="lfr-layout-structure-item-v-deos-curtos--copiar- lfr-layout-structure-item-9bac24e4-19de-ef1c-1911-0f805a3398cd " data-layout-structure-item-id="9bac24e4-19de-ef1c-1911-0f805a3398cd">
15197               <div id="fragment-bd268469-10b2-4927-f798-51a50ed91ad1">
15198                <!-- HTML do Fragmento -->
15199                <div class="sampa-news-video-horizontal-card">
15200                 <picture data-fileentryid="52566940"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/52566940/Thumbnail-300x300/Captura+de+tela+2026-07-14+123341.png?t=1784047394940"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/52566940/Preview-1000x0/Captura+de+tela+2026-07-14+123341.png?t=1784047394940"><img class="sampa-news-video-horizontal-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/24784844/Captura+de+tela+2026-07-14+123341.png/3d4eae0e-2b61-fe94-44f3-7722b24c2ffb?version=1.0&amp;t=1784047394940" alt="Escritura na Mão entrega de 1.368 títulos em Capela do Socorro" data-fileentryid="52566940"></picture>
15201                 <div class="sampa-news-video-horizontal-player-button">
15202                  <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
15203                   <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
15204                  </svg>
15205                 </div>
15206                 <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/watch?v=y5G8DgbioE0" style="display: none;">https://www.youtube.com/watch?v=y5G8DgbioE0</a> <iframe class="sampa-news-video-horizontal-iframe" src="" title="YouTube Video Player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy">
15207  </iframe>
15208                 <div class="sampa-news-video-horizontal-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Escritura na Mão entrega de 1.368 títulos em Capela do Socorro</div>
15209                </div>
15210               </div>
15211               
15211<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-bd268469-10b2-4927-f798-51a50ed91ad1'); const fragmentElementId = 'fragment-bd268469-10b2-4927-f798-51a50ed91ad1'; const fragmentEntryLinkNamespace = 'zrpl'; const fragmentNamespace = 'zrpl'; const layoutMode = 'view';(function () {
15212    // Usar uma única função global para evitar conflitos
15213    if (typeof window.sampanewsVideoHandlerHorizontal === 'undefined') {
15214
15215        // Cache selectors and regex patterns
15216        const videoPatterns = {
15217            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
15218            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
15219            watch: /[?&]v=([a-zA-Z0-9_-]+)/
15220        };
15221
15222        // Flag para evitar processamento durante inicialização
15223        let isInitializing = false;
15224        let debounceTimeout = null;
15225
15226        // Função para reproduzir vídeos
15227        window.sampanewsPlayVideoHorizontal = function (card) {
15228            try {
15229                const iframe = card.querySelector('.sampa-news-video-horizontal-iframe');
15230                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
15231                const url = linkElement?.getAttribute('href') || '';
15232
15233                if (!url || url === '#' || url === '') {
15234                    console.error('URL do vídeo não configurada');
15235                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
15236                    return;
15237                }
15238
15239                // Função melhorada para extrair ID do vídeo
15240                function extractVideoId(url) {
15241                    const patterns = [
15242                        /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/|youtube\.com\/shorts\/)([a-zA-Z0-9_-]{11})/,
15243                        /^([a-zA-Z0-9_-]{11})$/ // ID direto
15244                    ];
15245
15246                    for (const pattern of patterns) {
15247                        const match = url.match(pattern);
15248                        if (match) {
15249                            return match[1];
15250                        }
15251                    }
15252                    return null;
15253                }
15254
15255                // Converter URL do YouTube para embed
15256                let embedUrl = url;
15257
15258                if (url.includes('youtube.com/embed/')) {
15259                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0&rel=0`;
15260                } else {
15261                    const videoId = extractVideoId(url);
15262                    if (videoId) {
15263                        embedUrl = `https://www.youtube.com/embed/${videoId}?autoplay=1&mute=0&rel=0&modestbranding=1`;
15264                    } else {
15265                        console.error('Não foi possível extrair o ID do vídeo da URL:', url);
15266                        alert('URL do YouTube inválida. Verifique se a URL está correta.');
15267                        return;
15268                    }
15269                }
15270
15271                // Parar outros vídeos que estão tocando
15272                const playingCard = document.querySelector('.sampa-news-video-horizontal-card.sampa-news-playing');
15273                if (playingCard && playingCard !== card) {
15274                    playingCard.classList.remove('sampa-news-playing');
15275                    const playingIframe = playingCard.querySelector('.sampa-news-video-horizontal-iframe');
15276                    if (playingIframe) {
15277                        playingIframe.src = '';
15278                    }
15279                }
15280
15281                // Verificar se iframe existe antes de configurar
15282                if (!iframe) {
15283                    console.error('Iframe não encontrado no card');
15284                    return;
15285                }
15286
15287                // Adicionar tratamento de erro para o iframe
15288                iframe.onerror = function () {
15289                    console.error('Erro ao carregar o iframe do vídeo');
15290                    alert('Erro ao carregar o vídeo. Verifique a URL e tente novamente.');
15291                    card.classList.remove('sampa-news-playing');
15292                };
15293
15294                iframe.onload = function () {
15295                    // Iframe carregado com sucesso
15296                };
15297
15298                // Aplicar a classe e definir o src
15299                card.classList.add('sampa-news-playing');
15300                iframe.src = embedUrl;
15301            } catch (error) {
15302                console.error('Erro ao reproduzir vídeo horizontal:', error);
15303            }
15304        };
15305
15306        // Optimized event handler
15307        const handleCardClick = (e) => {
15308            e.preventDefault();
15309            e.stopPropagation();
15310            window.sampanewsPlayVideoHorizontal(e.currentTarget);
15311        };
15312
15313        // Função para inicializar um único card
15314        const initializeCard = (card) => {
15315            if (!card.hasAttribute('data-sampa-initialized')) {
15316                card.addEventListener('click', handleCardClick);
15317                card.setAttribute('data-sampa-initialized', 'true');
15318                return true;
15319            }
15320            return false;
15321        };
15322
15323        // Função otimizada para processar apenas nós relevantes
15324        const processRelevantNodes = (nodes) => {
15325            if (isInitializing) return;
15326            
15327            let processedCount = 0;
15328            
15329            nodes.forEach(node => {
15330                if (node.nodeType === Node.ELEMENT_NODE) {
15331                    let cardsToProcess = [];
15332                    
15333                    // Verificar se o próprio nó é um card horizontal
15334                    if (node.matches && node.matches('.sampa-news-video-horizontal-card')) {
15335                        cardsToProcess.push(node);
15336                    }
15337                    
15338                    // Verificar se contém cards horizontais (só se for um container relevante)
15339                    if (node.querySelector && 
15340                        (node.classList.contains('fragment') || 
15341                         node.classList.contains('portlet') ||
15342                         node.classList.contains('sampa-news') ||
15343                         node.querySelectorAll('.sampa-news-video-horizontal-card').length > 0)) {
15344                        
15345                        const childCards = node.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
15346                        cardsToProcess.push(...childCards);
15347                    }
15348                    
15349                    // Inicializar cards encontrados
15350                    cardsToProcess.forEach(card => {
15351                        if (initializeCard(card)) {
15352                            processedCount++;
15353                        }
15354                    });
15355                }
15356            });
15357            
15358            if (processedCount > 0) {
15359                console.log(`Sampa News Horizontal: Inicializados ${processedCount} novos cards de vídeo`);
15360            }
15361        };
15362
15363        // Função para inicializar event listeners
15364        window.sampanewsInitVideoCardsHorizontal = function () {
15365            if (isInitializing) return;
15366            isInitializing = true;
15367            
15368            try {
15369                let initializedCount = 0;
15370                const cards = document.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
15371                
15372                cards.forEach(card => {
15373                    if (initializeCard(card)) {
15374                        initializedCount++;
15375                    }
15376                });
15377                
15378                if (initializedCount > 0) {
15379                    console.log(`Sampa News Horizontal: Inicializados ${initializedCount} cards de vídeo`);
15380                }
15381            } catch (error) {
15382                console.error('Erro ao inicializar cards de vídeo horizontais:', error);
15383            } finally {
15384                isInitializing = false;
15385            }
15386        };
15387
15388        // Marcar como inicializado
15389        window.sampanewsVideoHandlerHorizontal = true;
15390
15391        // Inicializar na primeira execução
15392        if (document.readyState === 'loading') {
15393            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCardsHorizontal);
15394        } else {
15395            window.sampanewsInitVideoCardsHorizontal();
15396        }
15397    } else {
15398        // Se já existe, apenas reinicializa novos cards
15399        if (typeof window.sampanewsInitVideoCardsHorizontal === 'function') {
15400            window.sampanewsInitVideoCardsHorizontal();
15401        }
15402    }
15403
15404    // Observer otimizado com proteção anti-loop
15405    if (typeof window.sampanewsObserverVideoCardsHorizontal === 'undefined') {
15406        
15407        window.sampanewsObserverVideoCardsHorizontal = new MutationObserver(mutations => {
15408            // Evitar processamento durante inicialização
15409            if (isInitializing) return;
15410            
15411            // Debounce para evitar execuções excessivas
15412            clearTimeout(debounceTimeout);
15413            debounceTimeout = setTimeout(() => {
15414                try {
15415                    const relevantNodes = [];
15416                    
15417                    mutations.forEach(mutation => {
15418                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
15419                            Array.from(mutation.addedNodes).forEac
15419h(node => {
15420                                // Só processar nós elemento que podem conter ou ser cards de vídeo horizontais
15421                                if (node.nodeType === Node.ELEMENT_NODE &&
15422                                    (node.classList.contains('sampa-news-video-horizontal-card') ||
15423                                     node.querySelector?.('.sampa-news-video-horizontal-card') ||
15424                                     node.classList.contains('fragment') ||
15425                                     node.classList.contains('portlet'))) {
15426                                    relevantNodes.push(node);
15427                                }
15428                            });
15429                        }
15430                    });
15431                    
15432                    if (relevantNodes.length > 0) {
15433                        processRelevantNodes(relevantNodes);
15434                    }
15435                } catch (error) {
15436                    console.error('Erro no observer de vídeos horizontais:', error);
15437                }
15438            }, 150); // Debounce de 150ms
15439        });
15440        
15441        // Observer mais específico - só monitora containers relevantes
15442        const observeTargets = [
15443            document.querySelector('.sampa-news-horizontal-container'),
15444            document.querySelector('.sampa-news-container'),
15445            document.querySelector('#main-content'),
15446            document.querySelector('.portlet-boundary'),
15447            document.body // Fallback
15448        ].filter(Boolean);
15449        
15450        observeTargets.forEach(target => {
15451            window.sampanewsObserverVideoCardsHorizontal.observe(target, {
15452                childList: true,
15453                subtree: true
15454            });
15455        });
15456        
15457        // Cleanup ao sair da página
15458        window.addEventListener('beforeunload', function() {
15459            if (window.sampanewsObserverVideoCardsHorizontal) {
15460                window.sampanewsObserverVideoCardsHorizontal.disconnect();
15461            }
15462            clearTimeout(debounceTimeout);
15463        });
15464    }
15465})();;</script>
15465
15466              </div>
15467             </div>
15468             <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
15469              <div class="lfr-layout-structure-item-v-deos-curtos--copiar- lfr-layout-structure-item-9bac24e4-19de-ef1c-1911-0f805a3398cd " data-layout-structure-item-id="9bac24e4-19de-ef1c-1911-0f805a3398cd">
15470               <div id="fragment-01920b6f-f166-5c21-07a8-e541666de90e">
15471                <!-- HTML do Fragmento -->
15472                <div class="sampa-news-video-horizontal-card">
15473                 <picture data-fileentryid="48225086"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/48225086/Thumbnail-300x300/WhatsApp+Image+2026-06-21+at+10.20.11.jpeg?t=1782128516099"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/48225086/Preview-1000x0/WhatsApp+Image+2026-06-21+at+10.20.11.jpeg?t=1782128516099"><img class="sampa-news-video-horizontal-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/WhatsApp+Image+2026-06-21+at+10.20.11.jpeg/2dedb0ab-afe5-da9a-af59-28c7573f83d9?version=1.0&amp;t=1782128516099" alt="500 ônibus elétricos que equivalem ao plantio de 3,2 milhões de árvores por ano" data-fileentryid="48225086"></picture>
15474                 <div class="sampa-news-video-horizontal-player-button">
15475                  <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
15476                   <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
15477                  </svg>
15478                 </div>
15479                 <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/watch?v=-6Sg86AaaeI" style="display: none;">https://www.youtube.com/watch?v=-6Sg86AaaeI</a> <iframe class="sampa-news-video-horizontal-iframe" src="" title="YouTube Video Player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy">
15480  </iframe>
15481                 <div class="sampa-news-video-horizontal-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">500 ônibus elétricos que equivalem ao plantio de 3,2 milhões de árvores por ano</div>
15482                </div>
15483               </div>
15484               
15484<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-01920b6f-f166-5c21-07a8-e541666de90e'); const fragmentElementId = 'fragment-01920b6f-f166-5c21-07a8-e541666de90e'; const fragmentEntryLinkNamespace = 'zrpl'; const fragmentNamespace = 'zrpl'; const layoutMode = 'view';(function () {
15485    // Usar uma única função global para evitar conflitos
15486    if (typeof window.sampanewsVideoHandlerHorizontal === 'undefined') {
15487
15488        // Cache selectors and regex patterns
15489        const videoPatterns = {
15490            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
15491            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
15492            watch: /[?&]v=([a-zA-Z0-9_-]+)/
15493        };
15494
15495        // Flag para evitar processamento durante inicialização
15496        let isInitializing = false;
15497        let debounceTimeout = null;
15498
15499        // Função para reproduzir vídeos
15500        window.sampanewsPlayVideoHorizontal = function (card) {
15501            try {
15502                const iframe = card.querySelector('.sampa-news-video-horizontal-iframe');
15503                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
15504                const url = linkElement?.getAttribute('href') || '';
15505
15506                if (!url || url === '#' || url === '') {
15507                    console.error('URL do vídeo não configurada');
15508                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
15509                    return;
15510                }
15511
15512                // Função melhorada para extrair ID do vídeo
15513                function extractVideoId(url) {
15514                    const patterns = [
15515                        /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/|youtube\.com\/shorts\/)([a-zA-Z0-9_-]{11})/,
15516                        /^([a-zA-Z0-9_-]{11})$/ // ID direto
15517                    ];
15518
15519                    for (const pattern of patterns) {
15520                        const match = url.match(pattern);
15521                        if (match) {
15522                            return match[1];
15523                        }
15524                    }
15525                    return null;
15526                }
15527
15528                // Converter URL do YouTube para embed
15529                let embedUrl = url;
15530
15531                if (url.includes('youtube.com/embed/')) {
15532                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0&rel=0`;
15533                } else {
15534                    const videoId = extractVideoId(url);
15535                    if (videoId) {
15536                        embedUrl = `https://www.youtube.com/embed/${videoId}?autoplay=1&mute=0&rel=0&modestbranding=1`;
15537                    } else {
15538                        console.error('Não foi possível extrair o ID do vídeo da URL:', url);
15539                        alert('URL do YouTube inválida. Verifique se a URL está correta.');
15540                        return;
15541                    }
15542                }
15543
15544                // Parar outros vídeos que estão tocando
15545                const playingCard = document.querySelector('.sampa-news-video-horizontal-card.sampa-news-playing');
15546                if (playingCard && playingCard !== card) {
15547                    playingCard.classList.remove('sampa-news-playing');
15548                    const playingIframe = playingCard.querySelector('.sampa-news-video-horizontal-iframe');
15549                    if (playingIframe) {
15550                        playingIframe.src = '';
15551                    }
15552                }
15553
15554                // Verificar se iframe existe antes de configurar
15555                if (!iframe) {
15556                    console.error('Iframe não encontrado no card');
15557                    return;
15558                }
15559
15560                // Adicionar tratamento de erro para o iframe
15561                iframe.onerror = function () {
15562                    console.error('Erro ao carregar o iframe do vídeo');
15563                    alert('Erro ao carregar o vídeo. Verifique a URL e tente novamente.');
15564                    card.classList.remove('sampa-news-playing');
15565                };
15566
15567                iframe.onload = function () {
15568                    // Iframe carregado com sucesso
15569                };
15570
15571                // Aplicar a classe e definir o src
15572                card.classList.add('sampa-news-playing');
15573                iframe.src = embedUrl;
15574            } catch (error) {
15575                console.error('Erro ao reproduzir vídeo horizontal:', error);
15576            }
15577        };
15578
15579        // Optimized event handler
15580        const handleCardClick = (e) => {
15581            e.preventDefault();
15582            e.stopPropagation();
15583            window.sampanewsPlayVideoHorizontal(e.currentTarget);
15584        };
15585
15586        // Função para inicializar um único card
15587        const initializeCard = (card) => {
15588            if (!card.hasAttribute('data-sampa-initialized')) {
15589                card.addEventListener('click', handleCardClick);
15590                card.setAttribute('data-sampa-initialized', 'true');
15591                return true;
15592            }
15593            return false;
15594        };
15595
15596        // Função otimizada para processar apenas nós relevantes
15597        const processRelevantNodes = (nodes) => {
15598            if (isInitializing) return;
15599            
15600            let processedCount = 0;
15601            
15602            nodes.forEach(node => {
15603                if (node.nodeType === Node.ELEMENT_NODE) {
15604                    let cardsToProcess = [];
15605                    
15606                    // Verificar se o próprio nó é um card horizontal
15607                    if (node.matches && node.matches('.sampa-news-video-horizontal-card')) {
15608                        cardsToProcess.push(node);
15609                    }
15610                    
15611                    // Verificar se contém cards horizontais (só se for um container relevante)
15612                    if (node.querySelector && 
15613                        (node.classList.contains('fragment') || 
15614                         node.classList.contains('portlet') ||
15615                         node.classList.contains('sampa-news') ||
15616                         node.querySelectorAll('.sampa-news-video-horizontal-card').length > 0)) {
15617                        
15618                        const childCards = node.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
15619                        cardsToProcess.push(...childCards);
15620                    }
15621                    
15622                    // Inicializar cards encontrados
15623                    cardsToProcess.forEach(card => {
15624                        if (initializeCard(card)) {
15625                            processedCount++;
15626                        }
15627                    });
15628                }
15629            });
15630            
15631            if (processedCount > 0) {
15632                console.log(`Sampa News Horizontal: Inicializados ${processedCount} novos cards de vídeo`);
15633            }
15634        };
15635
15636        // Função para inicializar event listeners
15637        window.sampanewsInitVideoCardsHorizontal = function () {
15638            if (isInitializing) return;
15639            isInitializing = true;
15640            
15641            try {
15642                let initializedCount = 0;
15643                const cards = document.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
15644                
15645                cards.forEach(card => {
15646                    if (initializeCard(card)) {
15647                        initializedCount++;
15648                    }
15649                });
15650                
15651                if (initializedCount > 0) {
15652                    console.log(`Sampa News Horizontal: Inicializados ${initializedCount} cards de vídeo`);
15653                }
15654            } catch (error) {
15655                console.error('Erro ao inicializar cards de vídeo horizontais:', error);
15656            } finally {
15657                isInitializing = false;
15658            }
15659        };
15660
15661        // Marcar como inicializado
15662        window.sampanewsVideoHandlerHorizontal = true;
15663
15664        // Inicializar na primeira execução
15665        if (document.readyState === 'loading') {
15666            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCardsHorizontal);
15667        } else {
15668            window.sampanewsInitVideoCardsHorizontal();
15669        }
15670    } else {
15671        // Se já existe, apenas reinicializa novos cards
15672        if (typeof window.sampanewsInitVideoCardsHorizontal === 'function') {
15673            window.sampanewsInitVideoCardsHorizontal();
15674        }
15675    }
15676
15677    // Observer otimizado com proteção anti-loop
15678    if (typeof window.sampanewsObserverVideoCardsHorizontal === 'undefined') {
15679        
15680        window.sampanewsObserverVideoCardsHorizontal = new MutationObserver(mutations => {
15681            // Evitar processamento durante inicialização
15682            if (isInitializing) return;
15683            
15684            // Debounce para evitar execuções excessivas
15685            clearTimeout(debounceTimeout);
15686            debounceTimeout = setTimeout(() => {
15687                try {
15688                    const relevantNodes = [];
15689                    
15690                    mutations.forEach(mutation => {
15691                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
15692                            Array.from(mutation.addedNodes).forEac
15692h(node => {
15693                                // Só processar nós elemento que podem conter ou ser cards de vídeo horizontais
15694                                if (node.nodeType === Node.ELEMENT_NODE &&
15695                                    (node.classList.contains('sampa-news-video-horizontal-card') ||
15696                                     node.querySelector?.('.sampa-news-video-horizontal-card') ||
15697                                     node.classList.contains('fragment') ||
15698                                     node.classList.contains('portlet'))) {
15699                                    relevantNodes.push(node);
15700                                }
15701                            });
15702                        }
15703                    });
15704                    
15705                    if (relevantNodes.length > 0) {
15706                        processRelevantNodes(relevantNodes);
15707                    }
15708                } catch (error) {
15709                    console.error('Erro no observer de vídeos horizontais:', error);
15710                }
15711            }, 150); // Debounce de 150ms
15712        });
15713        
15714        // Observer mais específico - só monitora containers relevantes
15715        const observeTargets = [
15716            document.querySelector('.sampa-news-horizontal-container'),
15717            document.querySelector('.sampa-news-container'),
15718            document.querySelector('#main-content'),
15719            document.querySelector('.portlet-boundary'),
15720            document.body // Fallback
15721        ].filter(Boolean);
15722        
15723        observeTargets.forEach(target => {
15724            window.sampanewsObserverVideoCardsHorizontal.observe(target, {
15725                childList: true,
15726                subtree: true
15727            });
15728        });
15729        
15730        // Cleanup ao sair da página
15731        window.addEventListener('beforeunload', function() {
15732            if (window.sampanewsObserverVideoCardsHorizontal) {
15733                window.sampanewsObserverVideoCardsHorizontal.disconnect();
15734            }
15735            clearTimeout(debounceTimeout);
15736        });
15737    }
15738})();;</script>
15738
15739              </div>
15740             </div>
15741             <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
15742              <div class="lfr-layout-structure-item-v-deos-curtos--copiar- lfr-layout-structure-item-9bac24e4-19de-ef1c-1911-0f805a3398cd " data-layout-structure-item-id="9bac24e4-19de-ef1c-1911-0f805a3398cd">
15743               <div id="fragment-065eff71-35b1-e61e-eec3-d83fd45e40e8">
15744                <!-- HTML do Fragmento -->
15745                <div class="sampa-news-video-horizontal-card">
15746                 <picture data-fileentryid="48222627"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/48222627/Thumbnail-300x300/20260621_entrega500onibuseletricos_0032_lr.jpg?t=1782128283599"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/48222627/Preview-1000x0/20260621_entrega500onibuseletricos_0032_lr.jpg?t=1782128283599"><img class="sampa-news-video-horizontal-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/20260621_entrega500onibuseletricos_0032_lr.jpg/ed205f9c-f723-960d-ce17-9dd630e66b48?version=1.0&amp;t=1782128283599" alt="Prefeitura amplia maior frota sustentável do país com entrega de mais 500 novos ônibus elétricos" data-fileentryid="48222627"></picture>
15747                 <div class="sampa-news-video-horizontal-player-button">
15748                  <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
15749                   <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
15750                  </svg>
15751                 </div>
15752                 <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/watch?v=W8qm5QiTP7A" style="display: none;">https://www.youtube.com/watch?v=W8qm5QiTP7A</a> <iframe class="sampa-news-video-horizontal-iframe" src="" title="YouTube Video Player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy">
15753  </iframe>
15754                 <div class="sampa-news-video-horizontal-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Prefeitura amplia maior frota sustentável do país com entrega de mais 500 novos ônibus elétricos</div>
15755                </div>
15756               </div>
15757               
15757<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-065eff71-35b1-e61e-eec3-d83fd45e40e8'); const fragmentElementId = 'fragment-065eff71-35b1-e61e-eec3-d83fd45e40e8'; const fragmentEntryLinkNamespace = 'zrpl'; const fragmentNamespace = 'zrpl'; const layoutMode = 'view';(function () {
15758    // Usar uma única função global para evitar conflitos
15759    if (typeof window.sampanewsVideoHandlerHorizontal === 'undefined') {
15760
15761        // Cache selectors and regex patterns
15762        const videoPatterns = {
15763            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
15764            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
15765            watch: /[?&]v=([a-zA-Z0-9_-]+)/
15766        };
15767
15768        // Flag para evitar processamento durante inicialização
15769        let isInitializing = false;
15770        let debounceTimeout = null;
15771
15772        // Função para reproduzir vídeos
15773        window.sampanewsPlayVideoHorizontal = function (card) {
15774            try {
15775                const iframe = card.querySelector('.sampa-news-video-horizontal-iframe');
15776                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
15777                const url = linkElement?.getAttribute('href') || '';
15778
15779                if (!url || url === '#' || url === '') {
15780                    console.error('URL do vídeo não configurada');
15781                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
15782                    return;
15783                }
15784
15785                // Função melhorada para extrair ID do vídeo
15786                function extractVideoId(url) {
15787                    const patterns = [
15788                        /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/|youtube\.com\/shorts\/)([a-zA-Z0-9_-]{11})/,
15789                        /^([a-zA-Z0-9_-]{11})$/ // ID direto
15790                    ];
15791
15792                    for (const pattern of patterns) {
15793                        const match = url.match(pattern);
15794                        if (match) {
15795                            return match[1];
15796                        }
15797                    }
15798                    return null;
15799                }
15800
15801                // Converter URL do YouTube para embed
15802                let embedUrl = url;
15803
15804                if (url.includes('youtube.com/embed/')) {
15805                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0&rel=0`;
15806                } else {
15807                    const videoId = extractVideoId(url);
15808                    if (videoId) {
15809                        embedUrl = `https://www.youtube.com/embed/${videoId}?autoplay=1&mute=0&rel=0&modestbranding=1`;
15810                    } else {
15811                        console.error('Não foi possível extrair o ID do vídeo da URL:', url);
15812                        alert('URL do YouTube inválida. Verifique se a URL está correta.');
15813                        return;
15814                    }
15815                }
15816
15817                // Parar outros vídeos que estão tocando
15818                const playingCard = document.querySelector('.sampa-news-video-horizontal-card.sampa-news-playing');
15819                if (playingCard && playingCard !== card) {
15820                    playingCard.classList.remove('sampa-news-playing');
15821                    const playingIframe = playingCard.querySelector('.sampa-news-video-horizontal-iframe');
15822                    if (playingIframe) {
15823                        playingIframe.src = '';
15824                    }
15825                }
15826
15827                // Verificar se iframe existe antes de configurar
15828                if (!iframe) {
15829                    console.error('Iframe não encontrado no card');
15830                    return;
15831                }
15832
15833                // Adicionar tratamento de erro para o iframe
15834                iframe.onerror = function () {
15835                    console.error('Erro ao carregar o iframe do vídeo');
15836                    alert('Erro ao carregar o vídeo. Verifique a URL e tente novamente.');
15837                    card.classList.remove('sampa-news-playing');
15838                };
15839
15840                iframe.onload = function () {
15841                    // Iframe carregado com sucesso
15842                };
15843
15844                // Aplicar a classe e definir o src
15845                card.classList.add('sampa-news-playing');
15846                iframe.src = embedUrl;
15847            } catch (error) {
15848                console.error('Erro ao reproduzir vídeo horizontal:', error);
15849            }
15850        };
15851
15852        // Optimized event handler
15853        const handleCardClick = (e) => {
15854            e.preventDefault();
15855            e.stopPropagation();
15856            window.sampanewsPlayVideoHorizontal(e.currentTarget);
15857        };
15858
15859        // Função para inicializar um único card
15860        const initializeCard = (card) => {
15861            if (!card.hasAttribute('data-sampa-initialized')) {
15862                card.addEventListener('click', handleCardClick);
15863                card.setAttribute('data-sampa-initialized', 'true');
15864                return true;
15865            }
15866            return false;
15867        };
15868
15869        // Função otimizada para processar apenas nós relevantes
15870        const processRelevantNodes = (nodes) => {
15871            if (isInitializing) return;
15872            
15873            let processedCount = 0;
15874            
15875            nodes.forEach(node => {
15876                if (node.nodeType === Node.ELEMENT_NODE) {
15877                    let cardsToProcess = [];
15878                    
15879                    // Verificar se o próprio nó é um card horizontal
15880                    if (node.matches && node.matches('.sampa-news-video-horizontal-card')) {
15881                        cardsToProcess.push(node);
15882                    }
15883                    
15884                    // Verificar se contém cards horizontais (só se for um container relevante)
15885                    if (node.querySelector && 
15886                        (node.classList.contains('fragment') || 
15887                         node.classList.contains('portlet') ||
15888                         node.classList.contains('sampa-news') ||
15889                         node.querySelectorAll('.sampa-news-video-horizontal-card').length > 0)) {
15890                        
15891                        const childCards = node.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
15892                        cardsToProcess.push(...childCards);
15893                    }
15894                    
15895                    // Inicializar cards encontrados
15896                    cardsToProcess.forEach(card => {
15897                        if (initializeCard(card)) {
15898                            processedCount++;
15899                        }
15900                    });
15901                }
15902            });
15903            
15904            if (processedCount > 0) {
15905                console.log(`Sampa News Horizontal: Inicializados ${processedCount} novos cards de vídeo`);
15906            }
15907        };
15908
15909        // Função para inicializar event listeners
15910        window.sampanewsInitVideoCardsHorizontal = function () {
15911            if (isInitializing) return;
15912            isInitializing = true;
15913            
15914            try {
15915                let initializedCount = 0;
15916                const cards = document.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
15917                
15918                cards.forEach(card => {
15919                    if (initializeCard(card)) {
15920                        initializedCount++;
15921                    }
15922                });
15923                
15924                if (initializedCount > 0) {
15925                    console.log(`Sampa News Horizontal: Inicializados ${initializedCount} cards de vídeo`);
15926                }
15927            } catch (error) {
15928                console.error('Erro ao inicializar cards de vídeo horizontais:', error);
15929            } finally {
15930                isInitializing = false;
15931            }
15932        };
15933
15934        // Marcar como inicializado
15935        window.sampanewsVideoHandlerHorizontal = true;
15936
15937        // Inicializar na primeira execução
15938        if (document.readyState === 'loading') {
15939            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCardsHorizontal);
15940        } else {
15941            window.sampanewsInitVideoCardsHorizontal();
15942        }
15943    } else {
15944        // Se já existe, apenas reinicializa novos cards
15945        if (typeof window.sampanewsInitVideoCardsHorizontal === 'function') {
15946            window.sampanewsInitVideoCardsHorizontal();
15947        }
15948    }
15949
15950    // Observer otimizado com proteção anti-loop
15951    if (typeof window.sampanewsObserverVideoCardsHorizontal === 'undefined') {
15952        
15953        window.sampanewsObserverVideoCardsHorizontal = new MutationObserver(mutations => {
15954            // Evitar processamento durante inicialização
15955            if (isInitializing) return;
15956            
15957            // Debounce para evitar execuções excessivas
15958            clearTimeout(debounceTimeout);
15959            debounceTimeout = setTimeout(() => {
15960                try {
15961                    const relevantNodes = [];
15962                    
15963                    mutations.forEach(mutation => {
15964                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
15965                            Array.from(mutation.addedNodes).forEac
15965h(node => {
15966                                // Só processar nós elemento que podem conter ou ser cards de vídeo horizontais
15967                                if (node.nodeType === Node.ELEMENT_NODE &&
15968                                    (node.classList.contains('sampa-news-video-horizontal-card') ||
15969                                     node.querySelector?.('.sampa-news-video-horizontal-card') ||
15970                                     node.classList.contains('fragment') ||
15971                                     node.classList.contains('portlet'))) {
15972                                    relevantNodes.push(node);
15973                                }
15974                            });
15975                        }
15976                    });
15977                    
15978                    if (relevantNodes.length > 0) {
15979                        processRelevantNodes(relevantNodes);
15980                    }
15981                } catch (error) {
15982                    console.error('Erro no observer de vídeos horizontais:', error);
15983                }
15984            }, 150); // Debounce de 150ms
15985        });
15986        
15987        // Observer mais específico - só monitora containers relevantes
15988        const observeTargets = [
15989            document.querySelector('.sampa-news-horizontal-container'),
15990            document.querySelector('.sampa-news-container'),
15991            document.querySelector('#main-content'),
15992            document.querySelector('.portlet-boundary'),
15993            document.body // Fallback
15994        ].filter(Boolean);
15995        
15996        observeTargets.forEach(target => {
15997            window.sampanewsObserverVideoCardsHorizontal.observe(target, {
15998                childList: true,
15999                subtree: true
16000            });
16001        });
16002        
16003        // Cleanup ao sair da página
16004        window.addEventListener('beforeunload', function() {
16005            if (window.sampanewsObserverVideoCardsHorizontal) {
16006                window.sampanewsObserverVideoCardsHorizontal.disconnect();
16007            }
16008            clearTimeout(debounceTimeout);
16009        });
16010    }
16011})();;</script>
16011
16012              </div>
16013             </div>
16014             <div class="col col-lg-1 col-sm-6 col-12 col-md-6">
16015              <div class="lfr-layout-structure-item-v-deos-curtos--copiar- lfr-layout-structure-item-9bac24e4-19de-ef1c-1911-0f805a3398cd " data-layout-structure-item-id="9bac24e4-19de-ef1c-1911-0f805a3398cd">
16016               <div id="fragment-8c5a9750-24cf-cd14-29a4-4e0ccad7cdde">
16017                <!-- HTML do Fragmento -->
16018                <div class="sampa-news-video-horizontal-card">
16019                 <picture data-fileentryid="48219774"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/48219774/Thumbnail-300x300/Captura+de+tela+2026-06-22+083047.png?t=1782127874919"><source media="(max-width:1000px) and (min-width:300px)" srcset="/o/adaptive-media/image/48219774/Preview-1000x0/Captura+de+tela+2026-06-22+083047.png?t=1782127874919"><img class="sampa-news-video-horizontal-thumbnail" data-lfr-editable-id="video-thumbnail" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/Captura+de+tela+2026-06-22+083047.png/05148fff-fd94-555e-bbc4-29bff0bf6c88?version=1.0&amp;t=1782127874919" alt="Arte Prefeitura apresenta o Paulistinha" data-fileentryid="48219774"></picture>
16020                 <div class="sampa-news-video-horizontal-player-button">
16021                  <svg class="sampa-news-play-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
16022                   <path d="M8 5v14l11-7L8 5z" fill="currentColor" />
16023                  </svg>
16024                 </div>
16025                 <a data-lfr-editable-id="video-url" data-lfr-editable-type="link" href="https://www.youtube.com/watch?v=jyrTOeg5ics" style="display: none;">https://www.youtube.com/watch?v=jyrTOeg5ics</a> <iframe class="sampa-news-video-horizontal-iframe" src="" title="YouTube Video Player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy">
16026  </iframe>
16027                 <div class="sampa-news-video-horizontal-title" data-lfr-editable-id="video-title" data-lfr-editable-type="text">Paulistinha, o novo mascote da cidade</div>
16028                </div>
16029               </div>
16030               
16030<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-8c5a9750-24cf-cd14-29a4-4e0ccad7cdde'); const fragmentElementId = 'fragment-8c5a9750-24cf-cd14-29a4-4e0ccad7cdde'; const fragmentEntryLinkNamespace = 'zrpl'; const fragmentNamespace = 'zrpl'; const layoutMode = 'view';(function () {
16031    // Usar uma única função global para evitar conflitos
16032    if (typeof window.sampanewsVideoHandlerHorizontal === 'undefined') {
16033
16034        // Cache selectors and regex patterns
16035        const videoPatterns = {
16036            shorts: /shorts\/([a-zA-Z0-9_-]+)/,
16037            youtuBe: /youtu\.be\/([a-zA-Z0-9_-]+)/,
16038            watch: /[?&]v=([a-zA-Z0-9_-]+)/
16039        };
16040
16041        // Flag para evitar processamento durante inicialização
16042        let isInitializing = false;
16043        let debounceTimeout = null;
16044
16045        // Função para reproduzir vídeos
16046        window.sampanewsPlayVideoHorizontal = function (card) {
16047            try {
16048                const iframe = card.querySelector('.sampa-news-video-horizontal-iframe');
16049                const linkElement = card.querySelector('a[data-lfr-editable-id$="video-url"]');
16050                const url = linkElement?.getAttribute('href') || '';
16051
16052                if (!url || url === '#' || url === '') {
16053                    console.error('URL do vídeo não configurada');
16054                    alert('Por favor, configure a URL do vídeo no editor do Liferay.\n\nNo modo de edição, clique no card e adicione o link do YouTube.');
16055                    return;
16056                }
16057
16058                // Função melhorada para extrair ID do vídeo
16059                function extractVideoId(url) {
16060                    const patterns = [
16061                        /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/|youtube\.com\/shorts\/)([a-zA-Z0-9_-]{11})/,
16062                        /^([a-zA-Z0-9_-]{11})$/ // ID direto
16063                    ];
16064
16065                    for (const pattern of patterns) {
16066                        const match = url.match(pattern);
16067                        if (match) {
16068                            return match[1];
16069                        }
16070                    }
16071                    return null;
16072                }
16073
16074                // Converter URL do YouTube para embed
16075                let embedUrl = url;
16076
16077                if (url.includes('youtube.com/embed/')) {
16078                    embedUrl = `${url}${url.includes('?') ? '&' : '?'}autoplay=1&mute=0&rel=0`;
16079                } else {
16080                    const videoId = extractVideoId(url);
16081                    if (videoId) {
16082                        embedUrl = `https://www.youtube.com/embed/${videoId}?autoplay=1&mute=0&rel=0&modestbranding=1`;
16083                    } else {
16084                        console.error('Não foi possível extrair o ID do vídeo da URL:', url);
16085                        alert('URL do YouTube inválida. Verifique se a URL está correta.');
16086                        return;
16087                    }
16088                }
16089
16090                // Parar outros vídeos que estão tocando
16091                const playingCard = document.querySelector('.sampa-news-video-horizontal-card.sampa-news-playing');
16092                if (playingCard && playingCard !== card) {
16093                    playingCard.classList.remove('sampa-news-playing');
16094                    const playingIframe = playingCard.querySelector('.sampa-news-video-horizontal-iframe');
16095                    if (playingIframe) {
16096                        playingIframe.src = '';
16097                    }
16098                }
16099
16100                // Verificar se iframe existe antes de configurar
16101                if (!iframe) {
16102                    console.error('Iframe não encontrado no card');
16103                    return;
16104                }
16105
16106                // Adicionar tratamento de erro para o iframe
16107                iframe.onerror = function () {
16108                    console.error('Erro ao carregar o iframe do vídeo');
16109                    alert('Erro ao carregar o vídeo. Verifique a URL e tente novamente.');
16110                    card.classList.remove('sampa-news-playing');
16111                };
16112
16113                iframe.onload = function () {
16114                    // Iframe carregado com sucesso
16115                };
16116
16117                // Aplicar a classe e definir o src
16118                card.classList.add('sampa-news-playing');
16119                iframe.src = embedUrl;
16120            } catch (error) {
16121                console.error('Erro ao reproduzir vídeo horizontal:', error);
16122            }
16123        };
16124
16125        // Optimized event handler
16126        const handleCardClick = (e) => {
16127            e.preventDefault();
16128            e.stopPropagation();
16129            window.sampanewsPlayVideoHorizontal(e.currentTarget);
16130        };
16131
16132        // Função para inicializar um único card
16133        const initializeCard = (card) => {
16134            if (!card.hasAttribute('data-sampa-initialized')) {
16135                card.addEventListener('click', handleCardClick);
16136                card.setAttribute('data-sampa-initialized', 'true');
16137                return true;
16138            }
16139            return false;
16140        };
16141
16142        // Função otimizada para processar apenas nós relevantes
16143        const processRelevantNodes = (nodes) => {
16144            if (isInitializing) return;
16145            
16146            let processedCount = 0;
16147            
16148            nodes.forEach(node => {
16149                if (node.nodeType === Node.ELEMENT_NODE) {
16150                    let cardsToProcess = [];
16151                    
16152                    // Verificar se o próprio nó é um card horizontal
16153                    if (node.matches && node.matches('.sampa-news-video-horizontal-card')) {
16154                        cardsToProcess.push(node);
16155                    }
16156                    
16157                    // Verificar se contém cards horizontais (só se for um container relevante)
16158                    if (node.querySelector && 
16159                        (node.classList.contains('fragment') || 
16160                         node.classList.contains('portlet') ||
16161                         node.classList.contains('sampa-news') ||
16162                         node.querySelectorAll('.sampa-news-video-horizontal-card').length > 0)) {
16163                        
16164                        const childCards = node.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
16165                        cardsToProcess.push(...childCards);
16166                    }
16167                    
16168                    // Inicializar cards encontrados
16169                    cardsToProcess.forEach(card => {
16170                        if (initializeCard(card)) {
16171                            processedCount++;
16172                        }
16173                    });
16174                }
16175            });
16176            
16177            if (processedCount > 0) {
16178                console.log(`Sampa News Horizontal: Inicializados ${processedCount} novos cards de vídeo`);
16179            }
16180        };
16181
16182        // Função para inicializar event listeners
16183        window.sampanewsInitVideoCardsHorizontal = function () {
16184            if (isInitializing) return;
16185            isInitializing = true;
16186            
16187            try {
16188                let initializedCount = 0;
16189                const cards = document.querySelectorAll('.sampa-news-video-horizontal-card:not([data-sampa-initialized])');
16190                
16191                cards.forEach(card => {
16192                    if (initializeCard(card)) {
16193                        initializedCount++;
16194                    }
16195                });
16196                
16197                if (initializedCount > 0) {
16198                    console.log(`Sampa News Horizontal: Inicializados ${initializedCount} cards de vídeo`);
16199                }
16200            } catch (error) {
16201                console.error('Erro ao inicializar cards de vídeo horizontais:', error);
16202            } finally {
16203                isInitializing = false;
16204            }
16205        };
16206
16207        // Marcar como inicializado
16208        window.sampanewsVideoHandlerHorizontal = true;
16209
16210        // Inicializar na primeira execução
16211        if (document.readyState === 'loading') {
16212            document.addEventListener('DOMContentLoaded', window.sampanewsInitVideoCardsHorizontal);
16213        } else {
16214            window.sampanewsInitVideoCardsHorizontal();
16215        }
16216    } else {
16217        // Se já existe, apenas reinicializa novos cards
16218        if (typeof window.sampanewsInitVideoCardsHorizontal === 'function') {
16219            window.sampanewsInitVideoCardsHorizontal();
16220        }
16221    }
16222
16223    // Observer otimizado com proteção anti-loop
16224    if (typeof window.sampanewsObserverVideoCardsHorizontal === 'undefined') {
16225        
16226        window.sampanewsObserverVideoCardsHorizontal = new MutationObserver(mutations => {
16227            // Evitar processamento durante inicialização
16228            if (isInitializing) return;
16229            
16230            // Debounce para evitar execuções excessivas
16231            clearTimeout(debounceTimeout);
16232            debounceTimeout = setTimeout(() => {
16233                try {
16234                    const relevantNodes = [];
16235                    
16236                    mutations.forEach(mutation => {
16237                        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
16238                            Array.from(mutation.addedNodes).forEac
16238h(node => {
16239                                // Só processar nós elemento que podem conter ou ser cards de vídeo horizontais
16240                                if (node.nodeType === Node.ELEMENT_NODE &&
16241                                    (node.classList.contains('sampa-news-video-horizontal-card') ||
16242                                     node.querySelector?.('.sampa-news-video-horizontal-card') ||
16243                                     node.classList.contains('fragment') ||
16244                                     node.classList.contains('portlet'))) {
16245                                    relevantNodes.push(node);
16246                                }
16247                            });
16248                        }
16249                    });
16250                    
16251                    if (relevantNodes.length > 0) {
16252                        processRelevantNodes(relevantNodes);
16253                    }
16254                } catch (error) {
16255                    console.error('Erro no observer de vídeos horizontais:', error);
16256                }
16257            }, 150); // Debounce de 150ms
16258        });
16259        
16260        // Observer mais específico - só monitora containers relevantes
16261        const observeTargets = [
16262            document.querySelector('.sampa-news-horizontal-container'),
16263            document.querySelector('.sampa-news-container'),
16264            document.querySelector('#main-content'),
16265            document.querySelector('.portlet-boundary'),
16266            document.body // Fallback
16267        ].filter(Boolean);
16268        
16269        observeTargets.forEach(target => {
16270            window.sampanewsObserverVideoCardsHorizontal.observe(target, {
16271                childList: true,
16272                subtree: true
16273            });
16274        });
16275        
16276        // Cleanup ao sair da página
16277        window.addEventListener('beforeunload', function() {
16278            if (window.sampanewsObserverVideoCardsHorizontal) {
16279                window.sampanewsObserverVideoCardsHorizontal.disconnect();
16280            }
16281            clearTimeout(debounceTimeout);
16282        });
16283    }
16284})();;</script>
16284
16285              </div>
16286             </div>
16287            </div>
16288           </div>
16289          </div>
16290         </div>
16291        </div>
16292       </div>
16293       <!-- Controle Próximo (Direita) -->
16294       <button class="sp-csv-slider-control sp-csv-slider-control--next sp-csv-slider-control--side" onclick="moveCarouselYoutubeSlider(1)" aria-label="Próximo item" data-action="next"> 
16295        <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
16296         <path d="M9 18L15 12L9 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
16297        </svg> 
16298       </button>
16299      </div>
16300     </div>
16301    </div>
16302   </div>
16303   <style>.sp-csv-psp-slide-crontol .lfr-layout-structure-item-collection > .container-fluid > .row {
16304  flex-wrap: nowrap;
16305  transition: transform 0.3s ease-in-out !important;
16306}
16307
16308.sp-csv-psp-slide-crontol .lfr-layout-structure-item-collection > .container-fluid > .row > .col {
16309  flex: 0 0 calc(1 / 2 * 100%);
16310  max-width: calc(1 / 2 * 100%);
16311}
16312
16313/* Variáveis CSS para customização */
16314.sp-csv-fragment-slider-container-black {
16315  --slider-bg: none;
16316  --slider-text: #ffffff;
16317  --slider-icon: #000;
16318  --slider-accent: #ffd700;
16319  --control-bg: rgb(255, 255, 255);
16320  --control-hover-bg: rgb(233, 231, 231);
16321  --item-gap: 16px;
16322  --slider-padding: 0px 20px;
16323  --header-gap: 20px;
16324}
16325
16326/* Container principal */
16327.sp-csv-fragment-slider-container-black {
16328  background-color: var(--slider-bg);
16329  color: var(--slider-text);
16330  padding: var(--slider-padding);
16331  position: relative;
16332  overflow: hidden;
16333}
16334
16335.sp-csv-slider-container__wrapper {
16336  max-width: 1200px;
16337  margin: 0 auto;
16338  position: relative;
16339}
16340
16341/* Header com título e controles */
16342.sp-csv-slider-container__header {
16343  display: flex;
16344  justify-content: space-between;
16345  align-items: center;
16346  margin-bottom: var(--header-gap);
16347  flex-wrap: wrap;
16348  gap: 20px;
16349}
16350
16351/* Dropzone do título */
16352.sp-csv-slider-container__title-dropzone {
16353  flex: 1;
16354  min-width: 200px;
16355}
16356
16357.sp-csv-dropzone-title {
16358  min-height: 40px;
16359}
16360
16361/* Título padrão */
16362.sp-csv-default-title .sp-csv-slider-title {
16363  margin: 0;
16364  font-size: clamp(1.5rem, 3vw, 2rem);
16365  font-weight: 700;
16366  display: flex;
16367  align-items: center;
16368  gap: 12px;
16369}
16370
16371.sp-csv-default-title .sp-csv-slider-title .sp-csv-icon {
16372  font-size: 1.2em;
16373}
16374
16375/* Controles de navegação */
16376.sp-csv-slider-container__controls {
16377  display: flex;
16378  gap: 8px;
16379  align-self: flex-end;
16380  margin-top: 0;
16381}
16382
16383.sp-csv-slider-control {
16384  width: 30px;
16385  height: 30px;
16386  border: 1px solid rgba(255, 255, 255, 0.3);
16387  background-color: var(--control-bg);
16388  color: var(--slider-icon);
16389  border-radius: 4px;
16390  cursor: pointer;
16391  display: flex;
16392  align-items: center;
16393  justify-content: center;
16394  transition: all 0.3s ease;
16395  padding: 0;
16396}
16397
16398.sp-csv-slider-control:hover:not(:disabled) {
16399  background-color: var(--control-hover-bg);
16400  border-color: rgba(255, 255, 255, 0.5);
16401  transform: translateY(-1px);
16402}
16403
16404.sp-csv-slider-control:disabled {
16405  opacity: 0.3;
16406  cursor: not-allowed;
16407}
16408
16409.sp-csv-slider-control:focus-visible {
16410  outline: 2px solid var(--slider-accent);
16411  outline-offset: 2px;
16412}
16413
16414/* Controles laterais */
16415.sp-csv-slider-control--side {
16416  position: absolute;
16417  top: 50%;
16418  transform: translateY(-50%);
16419  z-index: 10;
16420  background-color: #ffffff;
16421  color: #000000;
16422  border-color: rgba(255, 255, 255, 0.3);
16423}
16424
16425.sp-csv-slider-control--prev.sp-csv-slider-control--side {
16426  left: -22px;
16427}
16428
16429.sp-csv-slider-control--next.sp-csv-slider-control--side {
16430  right: -22px;
16431}
16432
16433.sp-csv-slider-control--side:hover:not(:disabled) {
16434  background-color: var(--control-hover-bg);
16435  border-color: rgba(255, 255, 255, 0.5);
16436  transform: translateY(-50%) scale(1.05);
16437}
16438
16439/* Área de conteúdo/slider */
16440.sp-csv-slider-container__content {
16441  position: relative;
16442  width: 100%;
16443  display: flex;
16444  align-items: center;
16445}
16446
16447.sp-csv-slider-viewport {
16448  width: 100%;
16449  overflow: hidden;
16450  position: relative;
16451}
16452
16453/* Dropzone da coleção */
16454.sp-csv-dropzone-collection {
16455  min-height: 300px;
16456  position: relative;
16457}
16458
16459/* Placeholder do dropzone */
16460.sp-csv-dropzone-placeholder {
16461  display: flex;
16462  align-items: center;
16463  justify-content: center;
16464  min-height: 300px;
16465  border: 2px dashed rgba(255, 255, 255, 0.3);
16466  border-radius: 8px;
16467  background-color: rgba(255, 255, 255, 0.05);
16468  color: rgba(255, 255, 255, 0.5);
16469  font-size: 1.125rem;
16470  text-align: center;
16471  padding: 40px;
16472}
16473
16474/* Quando houver conteúdo no dropzone */
16475.sp-csv-dropzone-collection:not(:empty) .sp-csv-dropzone-placeholder {
16476  display: none;
16477}
16478
16479/* FORÇA LAYOUT HORIZONTAL - Sobrescreve qualquer CSS de grid dos fragmentos filhos */
16480.sp-csv-dropzone-collection > .collection-display-grid,
16481.sp-csv-dropzone-collection > .row {
16482  display: flex !important;
16483  gap: var(--item-gap);
16484  transition: transform 0.5s ease;
16485  flex-wrap: nowrap !important;
16486  width: 100%;
16487}
16488
16489/* Força todos os elementos filhos a seguirem o layout flex */
16490.sp-csv-dropzone-collection .collection-display-grid > *,
16491.sp-csv-dropzone-collection .row > * {
16492  flex: 0 0 auto !important;
16493  width: calc((100% - (var(--item-gap) * 5)) / 6) !important;
16494  min-width: 150px;
16495  display: block !important;
16496}
16497
16498/* Sobrescreve especificamente o CSS de grid dos vídeos-curtos */
16499.sp-csv-dropzone-collection .sampa-news-videos-grid,
16500.sp-csv-dropzone-collection .sampa-news-videos-grid > * {
16501  display: flex !important;
16502  grid-template-columns: none !important;
16503}
16504
16505/* Responsividade */
16506@media (max-width: 1200px) {
16507  .sp-csv-dropzone-collection .collection-display-grid > *,
16508  .sp-csv-dropzone-collection .row > * {
16509    min-width: 140px;
16510  }
16511}
16512
16513@media (max-width: 992px) {
16514  .sp-csv-fragment-slider-container-black {
16515    --item-gap: 12px;
16516  }
16517
16518  .sp-csv-psp-slide-crontol .lfr-layout-structure-item-collection > .container-fluid > .row > .col {
16519    flex: 0 0 calc(1 / 3 * 100%);
16520    max-width: calc(1 / 3 * 100%);
16521  }
16522
16523  .sp-csv-dropzone-collection .collection-display-grid > *,
16524  .sp-csv-dropzone-collection .row > * {
16525    min-width: 120px;
16526  }
16527
16528  .sp-csv-slider-control--prev.sp-csv-slider-control--side {
16529    left: -10px;
16530  }
16531
16532  .sp-csv-slider-control--next.sp-csv-slider-control--side {
16533    right: -10px;
16534  }
16535}
16536
16537@media (max-width: 768px) {
16538  .sp-csv-fragment-slider-container-black {
16539    --slider-padding: 20px;
16540    --item-gap: 10px;
16541  }
16542
16543  .sp-csv-psp-slide-crontol .lfr-layout-structure-item-collection > .container-fluid > .row > .col {
16544    flex: 0 0 calc(1 / 3 * 100%);
16545    max-width: calc(1 / 3 * 100%);
16546  }
16547
16548  .sp-csv-slider-container__header {
16549    flex-direction: column;
16550    align-items: flex-start;
16551  }
16552
16553  .sp-csv-slider-container__controls {
16554    align-self: flex-end;
16555    margin-top: -40px;
16556  }
16557
16558  .sp-csv-dropzone-collection .collection-display-grid > *,
16559  .sp-csv-dropzone-collection .row > * {
16560    min-width: 100px;
16561  }
16562}
16563
16564@media (max-width: 600px) {
16565  .sp-csv-slider-viewport {
16566    overflow-x: auto;
16567    -webkit-overflow-scrolling: touch;
16568  }
16569
16570  .sp-csv-psp-slide-crontol .lfr-layout-structure-item-collection > .container-fluid > .row > .col {
16571    flex: 0 0 calc(1 / 1 * 100%);
16572    max-width: calc(1 / 1 * 100%);
16573  }
16574
16575  .sp-csv-dropzone-collection .collection-display-grid > *,
16576  .sp-csv-dropzone-collection .row > * {
16577    min-width: 90px;
16578  }
16579}
16580
16581/* Modo claro */
16582@media (prefers-color-scheme: light) {
16583  .sp-csv-fragment-slider-container-black.sp-csv-light-mode {
16584    --slider-bg: #f5f5f5;
16585    --slider-text: #1a1a1a;
16586    --control-bg: rgba(0, 0, 0, 0.05);
16587    --control-hover-bg: rgba(0, 0, 0, 0.1);
16588  }
16589
16590  .sp-csv-fragment-slider-container-black.sp-csv-light-mode .sp-csv-slider-control {
16591    border-color: rgba(0, 0, 0, 0.2);
16592  }
16593
16594  .sp-csv-fragment-slider-container-black.sp-csv-light-mode .sp-csv-dropzone-placeholder {
16595    border-color: rgba(0, 0, 0, 0.2);
16596    background-color: rgba(0, 0, 0, 0.02);
16597    color: rgba(0, 0, 0, 0.5);
16598  }
16599}
16600
16601/* Estados do dropzone no editor */
16602.page-editor-layout-drop-zone-active .sp-csv-dropzone-title,
16603.page-editor-layout-drop-zone-active .sp-csv-dropzone-collection {
16604  background-color: rgba(255, 215, 0, 0.1);
16605  border: 2px dashed var(--slider-accent);
16606  min-height: 60px;
16607}
16608
16609/* Animação suave */
16610@media (prefers-reduced-motion: no-preference) {
16611  .sp-csv-slider-control {
16612    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
16613  }
16614
16615  .sp-csv-dropzone-collection > .collection-display-grid,
16616  .sp-csv-dropzone-collection > .row {
16617    transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
16618  }
16619}</style>
16620   
16620<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-17924fc6-e39a-25de-b702-4cf0bb7ca707'); const fragmentElementId = 'fragment-17924fc6-e39a-25de-b702-4cf0bb7ca707'; const fragmentEntryLinkNamespace = 'vfkh'; const fragmentNamespace = 'vfkh'; const layoutMode = 'view';let currentPositionYoutube = 0;
16621const trackYoutube = document.querySelector(
16622  ".sp-csv-psp-slide-crontol .lfr-layout-structure-item-collection > .container-fluid > .row"
16623);
16624
16625// Função para obter o limite de rolagens baseado no tamanho da tela
16626function getMaxScrollsYoutube() {
16627  // Mobile: até 768px = 9 rolagens, Desktop: acima de 768px = 3 rolagens
16628  return window.matchMedia('(max-width: 768px)').matches ? 9 : 3;
16629}
16630
16631function updateControlsVisibilityYoutube() {
16632  const prevButton = document.querySelector('.sp-csv-slider-control--prev');
16633  const nextButton = document.querySelector('.sp-csv-slider-control--next');
16634  const maxScrolls = getMaxScrollsYoutube(); // Obtém o limite atual baseado no tamanho da tela
16635  
16636  if (prevButton && nextButton) {
16637    // Desabilita botão anterior se estiver na posição inicial
16638    prevButton.disabled = currentPositionYoutube <= 0;
16639    
16640    // Desabilita botão próximo se atingiu o limite de rolagens
16641    nextButton.disabled = currentPositionYoutube >= (maxScrolls - 1);
16642  }
16643}
16644
16645function moveCarouselYoutubeSlider(direction) {
16646  if (!trackYoutube) return;
16647
16648  const totalItems = trackYoutube.children.length;
16649  const itemsToShow = 1;
16650  const maxScrolls = getMaxScrollsYoutube(); // Obtém o limite atual baseado no tamanho da tela
16651  
16652  // LÓGICA: Limita baseado no tamanho da tela (3 desktop / 9 mobile)
16653  const maxPosition = Math.min(totalItems - itemsToShow, maxScrolls - 1);
16654
16655  // Calcular nova posição
16656  if (direction === 1 && currentPositionYoutube < maxPosition) {
16657    currentPositionYoutube++; // Próximo
16658  } else if (direction === -1 && currentPositionYoutube > 0) {
16659    currentPositionYoutube--; // Anterior
16660  }
16661
16662  // Mover o carrossel
16663  const movePercent = -(currentPositionYoutube * (100 / itemsToShow));
16664  trackYoutube.style.transform = `translateX(${movePercent}%)`;
16665  
16666  // Atualizar visibilidade dos controles
16667  updateControlsVisibilityYoutube();
16668}
16669
16670// Inicializar controles quando o DOM estiver carregado
16671document.addEventListener('DOMContentLoaded', function() {
16672  updateControlsVisibilityYoutube();
16673});
16674
16675// Atualizar controles quando a tela for redimensionada (mudança mobile/desktop)
16676window.addEventListener('resize', function() {
16677  const maxScrolls = getMaxScrollsYoutube();
16678  
16679  // Se a posição atual exceder o novo limite, reposicionar
16680  if (currentPositionYoutube >= maxScrolls) {
16681    currentPositionYoutube = maxScrolls - 1;
16682    const movePercent = -(currentPositionYoutube * 100);
16683    if (trackYoutube) {
16684      trackYoutube.style.transform = `translateX(${movePercent}%)`;
16685    }
16686  }
16687  
16688  updateControlsVisibilityYoutube();
16689});
16690
16691// Observar mudanças no conteúdo do dropzone
16692const observerYoutube = new MutationObserver(function(mutations) {
16693  mutations.forEach(function(mutation) {
16694    if (mutation.type === 'childList') {
16695      updateControlsVisibilityYoutube();
16696    }
16697  });
16698});
16699
16700// Observar o dropzone da coleção
16701const dropzoneYoutube = document.querySelector('.sp-csv-dropzone-collection');
16702if (dropzoneYoutube) {
16703  observerYoutube.observe(dropzoneYoutube, { childList: true, subtree: true });
16704}
16705
16706window.moveCarouselYoutubeSlider = moveCarouselYoutubeSlider;;</script>
16706
16707  </div>
16708 </div>
16709 <div class="lfr-layout-structure-item-b6401720-304c-add6-fc5e-ab184b7a8109 lfr-layout-structure-item-container " data-layout-structure-item-id="b6401720-304c-add6-fc5e-ab184b7a8109">
16710  <div class="lfr-layout-structure-item-2b767f47-90ee-fd64-b1d0-3445cc5ce721 lfr-layout-structure-item-container  container-fluid container-fluid-max-xl" data-layout-structure-item-id="2b767f47-90ee-fd64-b1d0-3445cc5ce721">
16711   <div class="lfr-layout-structure-item-container-slider-esportes-cultura-educacao lfr-layout-structure-item-251c80ef-42f9-c5cc-1e0c-ce391d756298 " data-layout-structure-item-id="251c80ef-42f9-c5cc-1e0c-ce391d756298">
16712    <div id="fragment-7068a1a1-d021-44bb-47f1-58143bb74464">
16713     <div class="sp-csee-fragment-slider-container" data-fragment-namespace="voos">
16714      <div class="sp-csee-slider-container__wrapper">
16715       <!-- Header com título e controles -->
16716       <div class="sp-csee-slider-container__header">
16717        <!-- Dropzone para título/componente customizado -->
16718        <div class="sp-csee-slider-container__title-dropzone">
16719         <div id="title-dropzone" class="sp-csee-dropzone-title">
16720          <div class="lfr-layout-structure-item-18d5c27c-cbbd-e247-6922-781948547104 lfr-layout-structure-item-container  container-fluid container-fluid-max-xl" data-layout-structure-item-id="18d5c27c-cbbd-e247-6922-781948547104">
16721           <div class="lfr-layout-structure-item-basic-component-image lfr-layout-structure-item-2c568581-edac-862c-7ec7-15352e5757b7 " data-layout-structure-item-id="2c568581-edac-862c-7ec7-15352e5757b7">
16722            <div id="fragment-ead44729-ea8e-90e4-27be-49042fed5eba">
16723             <div class="component-image overflow-hidden">
16724              <picture data-fileentryid="26573203"><source media="(max-width:32px)" srcset="/o/adaptive-media/image/26573203/Preview-1000x0/sports_soccer.png?t=1750456582831"><source media="(max-width:32px) and (min-width:32px)" srcset="/o/adaptive-media/image/26573203/Thumbnail-300x300/sports_soccer.png?t=1750456582831"><img alt="" class="w-0" data-lfr-editable-id="image-square" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/25160874/sports_soccer.png/218a5ca6-52a4-c906-25d8-5ead1f948a84?version=1.0&amp;t=1750456582831" data-fileentryid="26573203"></picture>
16725             </div>
16726            </div>
16727           </div>
16728           <div class="lfr-layout-structure-item-basic-component-heading lfr-layout-structure-item-50e3b793-7f10-5244-5efc-2b4aa2f121ec " data-layout-structure-item-id="50e3b793-7f10-5244-5efc-2b4aa2f121ec">
16729            <div id="fragment-f41a383e-7b7b-9601-b9c9-09643a9285d0">
16730             <h4 class="component-heading mb-0 text-break" data-lfr-editable-id="element-text" data-lfr-editable-type="text">Esporte, Cultura e Educação</h4>
16731            </div>
16732           </div>
16733          </div>
16734         </div>
16735        </div>
16736       </div>
16737       <!-- Dropzone para coleção de itens -->
16738       <div class="sp-csee-slider-container__content sp-csee-psp-slide-crontol">
16739        <!-- Controle anterior -->
16740        <button class="sp-csee-slider-control sp-csee-slider-control--prev sp-csee-slider-control--side" onclick="moveCarouselCsee(-1)" aria-label="Item anterior" data-action="prev"> 
16741         <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
16742          <path d="M15 18L9 12L15 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
16743         </svg> 
16744        </button>
16745        <div class="sp-csee-slider-viewport">
16746         <div id="collection-dropzone" class="sp-csee-dropzone-collection">
16747          <div class="lfr-layout-structure-item-3474a523-3380-cf7e-56f6-81279e604265 lfr-layout-structure-item-collection" data-layout-structure-item-id="3474a523-3380-cf7e-56f6-81279e604265" data-analytics-targetable-collection="com.liferay.layout.list.retriever.ClassedModelListObjectReference@24a23f93" id="analytics-targetable-collection-3474a523-3380-cf7e-56f6-81279e604265">
16748           <div class="container-fluid overflow-hidden px-0">
16749            <div class="row align-items-start">
16750             <div class="col col-lg-6 col-sm-12 col-12 col-md-12">
16751              <div class="lfr-layout-structure-item-card-imagem-acima-sem-resumo--copiar- lfr-layout-structure-item-01fadd11-5ead-8dfd-e96c-a0d4e3ebc41d " data-layout-structure-item-id="01fadd11-5ead-8dfd-e96c-a0d4e3ebc41d">
16752               <div id="fragment-914b87e1-232b-f83f-ac08-31da00c75ac5">
16753                <div class="card-image-top-vertical-layout">
16754                 <div class="card-image-top-image-wrapper">
16755                  <div class="card-image-top-category-tag" data-lfr-editable-id="category" data-lfr-editable-type="text">
16756                   <a href="https://sampanews.sp.gov.br/w/rep%C3%BAblica-est%C3%A1-entre-os-40-bairros-mais-legais-do-mundo-em-ranking-internacional">Turismo E Negócios</a>
16757                  </div>
16758                  <a href="https://sampanews.sp.gov.br/w/rep%C3%BAblica-est%C3%A1-entre-os-40-bairros-mais-legais-do-mundo-em-ranking-internacional"><img class="card-image-top-image-container" data-lfr-editable-id="small-image" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/2477185
167585/0/WhatsApp+Image+2026-09-18+at+13.29.24.jpeg/3482c0e2-1e8e-e769-e9f4-672d0e2982e5?version=1.0&amp;t=1789750542961" alt="Vista aérea de área urbana com edifícios e vias"></a>
16759                 </div>
16760                 <div class="card-image-top-content">
16761                  <!-- Título Alternativo (Prioridade) -->
16762                  <h2 data-lfr-editable-id="alt-title" data-lfr-editable-type="text" class="card-image-top-title card-image-top-alt-title"><a href="https://sampanews.sp.gov.br/w/rep%C3%BAblica-est%C3%A1-entre-os-40-bairros-mais-legais-do-mundo-em-ranking-internacional"></a></h2>
16763                  <!-- Título Original (Fallback - Oculto por padrão) -->
16764                  <h2 class="card-image-top-title d-none" data-lfr-editable-id="title" data-lfr-editable-type="text"><a href="https://sampanews.sp.gov.br/w/rep%C3%BAblica-est%C3%A1-entre-os-40-bairros-mais-legais-do-mundo-em-ranking-internacional">República está entre os 40 bairros mais legais do mundo em ranking internacional</a></h2>
16765                  <p class="card-image-top-description" data-lfr-editable-id="description" data-lfr-editable-type="text"><a href="https://sampanews.sp.gov.br/w/rep%C3%BAblica-est%C3%A1-entre-os-40-bairros-mais-legais-do-mundo-em-ranking-internacional">Região do Centro Histórico de São Paulo aparece na 25ª posição da lista da publicação britânica Time Out, que considera gastronomia, cultura, vida noturna, comércio local, qualidade de vida e senso de comunidade</a></p>
16766                 </div>
16767                </div>
16768               </div>
16769               <style>.card-image-top-vertical-layout {
16770    width: 100%;
16771    background: transparent;
16772}
16773
16774.card-image-top-image-wrapper {
16775    position: relative;
16776    width: 100%;
16777    margin-bottom: 10px;
16778	  aspect-ratio: 100 / 50;
16779}
16780
16781.card-image-top-image-wrapper > a,
16782.card-image-top-image-wrapper img {
16783    width: 100%;
16784	  height: 100%;
16785}
16786
16787.card-image-top-category-tag {
16788    background-color: #bea8c2;
16789    color: #000;
16790    padding: 8px 12px;
16791    font-size: 10px;
16792    font-weight: 600;
16793    display: inline-block;
16794    text-transform: uppercase;
16795    letter-spacing: 0.5px;
16796    border-radius: 2px;
16797    position: absolute;
16798    top: 4px;
16799    left: 4px;
16800    z-index: 10;
16801}
16802
16803.card-image-top-image-container {
16804    width: 100%;
16805    border-radius: 0;
16806    object-fit: cover;
16807    background-color: #d0d0d0;
16808    border-bottom: 6px solid #bea8c2;
16809    display: block;
16810}
16811
16812.card-image-top-content {
16813    width: 100%;
16814}
16815
16816.card-image-top-title {
16817    font-size: 26px;
16818    font-weight: 700;
16819    color: #1a1a1a;
16820    line-height: 1;
16821    text-decoration: none;
16822    margin-bottom: 15px;
16823	  line-height: normal;
16824}
16825
16826.card-image-top-title a {
16827    color: inherit;
16828    text-decoration: none;
16829    cursor: pointer;
16830}
16831
16832.card-image-top-description {
16833    font-size: 14px;
16834    color: #4a4a4a;
16835    line-height: 1.6;
16836    text-decoration: none;
16837    text-align: justify;
16838}
16839
16840.card-image-top-description a {
16841    color: inherit;
16842    text-decoration: none;
16843}
16844
16845.card-image-top-summary {
16846    font-size: 14px;
16847    color: #333;
16848    line-height: 1.6;
16849    margin: 0;
16850    padding-left: 0;
16851    list-style: none;
16852    text-decoration: none;
16853    background-color: #f8f9fa;
16854    padding: 16px;
16855    border-left: 4px solid #FF6B35;
16856    margin-top: 16px;
16857}
16858
16859.card-image-top-summary li {
16860    margin-bottom: 8px;
16861    padding-left: 0;
16862    position: relative;
16863}
16864
16865.card-image-top-summary li::before {
16866    display: none;
16867}
16868
16869.card-image-top-summary a {
16870    color: inherit;
16871    text-decoration: none;
16872}
16873
16874.card-image-top-category-tag a {
16875    color: inherit;
16876    text-decoration: none;
16877}
16878
16879.card-image-top-highlight-text {
16880    background-color: #fff3cd;
16881    padding: 12px;
16882    border-radius: 4px;
16883    font-style: italic;
16884    margin-top: 16px;
16885    border-left: 3px solid #ffc107;
16886}
16887
16888/* Utility class for hiding elements */
16889.d-none {
16890    display: none !important;
16891}
16892
16893/* Links dentro da lista de setas */
16894.card-image-top-arrow-list a {
16895    color: inherit;
16896    text-decoration: none;
16897}
16898
16899@media (max-width: 768px) {
16900    .card-image-top-image-container {
16901        /*height: 200px;*/
16902    }
16903    .card-image-top-title {
16904        font-size: 20px;
16905    }
16906    .card-image-top-description {
16907        font-size: 13px;
16908    }
16909    .card-image-top-summary {
16910        font-size: 13px;
16911        padding: 12px;
16912    }
16913	
16914	.card-image-top-image-wrapper {
16915	    aspect-ratio: 100 / 62.5;
16916	}
16917    .card-image-top-category-tag {
16918        top: 8px;
16919        left: 8px;
16920        padding: 6px 10px;
16921        font-size: 9px;
16922    }
16923    .card-image-top-arrow-list p {
16924        font-size: 13px;
16925        padding-left: 24px;
16926    }
16927    .card-image-top-arrow-list li {
16928        margin-bottom: 10px;
16929    }
16930    .card-image-top-arrow-list li::before {
16931        font-size: 14px;
16932        margin-right: 10px;
16933    }
16934}
16935
16936@media (max-width: 480px) {
16937    .card-image-top-title {
16938        font-size: 18px;
16939    }
16940    .card-image-top-description {
16941        font-size: 12px;
16942    }
16943    .card-image-top-image-container {
16944        height: 300px;
16945    }
16946    .card-image-top-category-tag {
16947        top: 6px;
16948        left: 6px;
16949        padding: 4px 8px;
16950        font-size: 8px;
16951    }
16952    .card-image-top-arrow-list p {
16953        font-size: 12px;
16954        padding-left: 22px;
16955    }
16956    .card-image-top-arrow-list li::before {
16957        font-size: 13px;
16958        margin-right: 8px;
16959    }
16960}</style>
16961               
16961<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-914b87e1-232b-f83f-ac08-31da00c75ac5'); const fragmentElementId = 'fragment-914b87e1-232b-f83f-ac08-31da00c75ac5'; const fragmentEntryLinkNamespace = 'axtl'; const fragmentNamespace = 'axtl'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function() {
16962    let isUpdating = false;
16963    let observer = null;
16964    
16965    function updateTitleDisplay() {
16966        if (isUpdating) return;
16967        isUpdating = true;
16968        
16969        try {
16970            const layoutItems = document.querySelectorAll('.card-image-top-vertical-layout');
16971
16972            layoutItems.forEach(function(item) {
16973                const altTitleElement = item.querySelector('[data-lfr-editable-id="alt-title"]');
16974                const originalTitleElement = item.querySelector('[data-lfr-editable-id="title"]');
16975
16976                if (altTitleElement && originalTitleElement) {
16977                    const altTitleText = altTitleElement.textContent.trim();
16978                    
16979                    // Verifica se o título alternativo é válido
16980                    if (altTitleText &&
16981                        altTitleText.length > 0 &&
16982                        !altTitleText.includes('[Mapear campo') &&
16983                        altTitleText !== 'TitleAlternative' &&
16984                        altTitleText !== '') {
16985
16986                        // Mostra título alternativo e oculta original
16987                        altTitleElement.classList.remove('d-none');
16988                        originalTitleElement.classList.add('d-none');
16989                    } else {
16990                        // Oculta título alternativo e mostra original
16991                        altTitleElement.classList.add('d-none');
16992                        originalTitleElement.classList.remove('d-none');
16993                    }
16994                }
16995            });
16996        } catch (error) {
16997            console.error('Erro no updateTitleDisplay:', error);
16998        } finally {
16999            isUpdating = false;
17000        }
17001    }
17002
17003    function initializeObserver() {
17004        if (observer || !window.MutationObserver) return;
17005        
17006        observer = new MutationObserver(function(mutations) {
17007            if (isUpdating) return;
17008            
17009            let shouldUpdate = false;
17010            
17011            mutations.forEach(function(mutation) {
17012                if (mutation.type === 'childList') {
17013                    const target = mutation.target;
17014                    if (target.hasAttribute && 
17015                        (target.hasAttribute('data-lfr-editable-id') || 
17016                         target.closest('[data-lfr-editable-id]'))) {
17017                        shouldUpdate = true;
17018                    }
17019                }
17020            });
17021
17022            if (shouldUpdate) {
17023                clearTimeout(window.titleUpdateTimeout);
17024                window.titleUpdateTimeout = setTimeout(updateTitleDisplay, 150);
17025            }
17026        });
17027
17028        const layoutItems = document.querySelectorAll('.card-image-top-vertical-layout');
17029        layoutItems.forEach(function(item) {
17030            observer.observe(item, {
17031                childList: true,
17032                subtree: true,
17033                characterData: false
17034            });
17035        });
17036    }
17037
17038    // Execução inicial
17039    setTimeout(function() {
17040        updateTitleDisplay();
17041        initializeObserver();
17042    }, 200);
17043
17044    setTimeout(function() {
17045        if (!isUpdating) {
17046            updateTitleDisplay();
17047        }
17048    }, 1000);
17049
17050    // Event listeners do Liferay
17051    if (window.Liferay && Liferay.on) {
17052        let liferayTimeout;
17053        
17054        Liferay.on('editableFieldChanged', function(event) {
17055            clearTimeout(liferayTimeout);
17056            liferayTimeout = setTimeout(function() {
17057                if (!isUpdating) {
17058                    updateTitleDisplay();
17059                }
17060            }, 200);
17061        });
17062
17063        Liferay.on('allPortletsReady', function() {
17064            clearTimeout(liferayTimeout);
17065            liferayTimeout = setTimeout(function() {
17066                if (!isUpdating) {
17067                    updateTitleDisplay();
17068                }
17069            }, 300);
17070        });
17071    }
17072
17073    // Cleanup
17074    window.addEventListener('beforeunload', function() {
17075        if (observer) {
17076            observer.disconnect();
17077        }
17078        clearTimeout(window.titleUpdateTimeout);
17079    });
17080});;</script>
17080
17081              </div>
17082             </div>
17083             <div class="col col-lg-6 col-sm-12 col-12 col-md-12">
17084              <div class="lfr-layout-structure-item-card-imagem-acima-sem-resumo--copiar- lfr-layout-structure-item-01fadd11-5ead-8dfd-e96c-a0d4e3ebc41d " data-layout-structure-item-id="01fadd11-5ead-8dfd-e96c-a0d4e3ebc41d">
17085               <div id="fragment-dece4344-a8f1-081c-d903-fbe8c801f281">
17086                <div class="card-image-top-vertical-layout">
17087                 <div class="card-image-top-image-wrapper">
17088                  <div class="card-image-top-category-tag" data-lfr-editable-id="category" data-lfr-editable-type="text">
17089                   <a href="https://sampanews.sp.gov.br/w/s%C3%A3o-paulo-entra-no-topo-de-ranking-mundial-do-turismo-corporativo-e-desbanca-londres-paris-e-madri">Turismo E Negócios</a>
17090                  </div>
17091                  <a href="https://sampanews.sp.gov.br/w/s%C3%A3o-paulo-entra-no-topo-de-ranking-mundial-do-turismo-corporativo-e-desbanca-londres-paris-e-madri"><img class="card-image-top-image-container" data-lfr-editable-id="small-image" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/0/WhatsApp+Image+2026-09-14+at+11.48.23.jpeg/910f372c-a24e-2bcc-9240-08e4625bf51a?version=1.0&amp;t=1789399665584" alt="Vista aérea de área urbana com edifícios e vias"></a>
17092                 </div>
17093                 <div class="card-image-top-content">
17094                  <!-- Título Alternativo (Prioridade) -->
17095                  <h2 data-lfr-editable-id="alt-title" data-lfr-editable-type="text" class="card-image-top-title card-image-top-alt-title"><a href="https://sampanews.sp.gov.br/w/s%C3%A3o-paulo-entra-no-topo-de-ranking-mundial-do-turismo-corporativo-e-desbanca-londres-paris-e-madri"></a></h2>
17096                  <!-- Título Original (Fallback - Oculto por padrão) -->
17097                  <h2 class="card-image-top-title d-none" data-lfr-editable-id="title" data-lfr-editable-type="text"><a href="https://sampanews.sp.gov.br/w/s%C3%A3o-paulo-entra-no-topo-de-ranking-mundial-do-turismo-corporativo-e-desbanca-londres-paris-e-madri">São Paulo entra no topo de ranking mundial do turismo corporativo e desbanca Londres, Paris e Madri</a></h2>
17098                  <p class="card-image-top-description" data-lfr-editable-id="description" data-lfr-editable-type="text"><a href="https://sampanews.sp.gov.br/w/s%C3%A3o-paulo-entra-no-topo-de-ranking-mundial-do-turismo-corporativo-e-desbanca-londres-paris-e-madri">Pesquisa aponta que a cidade fica atrás apenas de Nova York no ranking global e é o principal destino da América Latina para viagens de negócios</a></p>
17099                 </div>
17100                </div>
17101               </div>
17102               
17102<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-dece4344-a8f1-081c-d903-fbe8c801f281'); const fragmentElementId = 'fragment-dece4344-a8f1-081c-d903-fbe8c801f281'; const fragmentEntryLinkNamespace = 'axtl'; const fragmentNamespace = 'axtl'; const layoutMode = 'view';document.addEventListener('DOMContentLoaded', function() {
17103    let isUpdating = false;
17104    let observer = null;
17105    
17106    function updateTitleDisplay() {
17107        if (isUpdating) return;
17108        isUpdating = true;
17109        
17110        try {
17111            const layoutItems = document.querySelectorAll('.card-image-top-vertical-layout');
17112
17113            layoutItems.forEach(function(item) {
17114                const altTitleElement = item.querySelector('[data-lfr-editable-id="alt-title"]');
17115                const originalTitleElement = item.querySelector('[data-lfr-editable-id="title"]');
17116
17117                if (altTitleElement && originalTitleElement) {
17118                    const altTitleText = altTitleElement.textContent.trim();
17119                    
17120                    // Verifica se o título alternativo é válido
17121                    if (altTitleText &&
17122                        altTitleText.length > 0 &&
17123                        !altTitleText.includes('[Mapear campo') &&
17124                        altTitleText !== 'TitleAlternative' &&
17125                        altTitleText !== '') {
17126
17127                        // Mostra título alternativo e oculta original
17128                        altTitleElement.classList.remove('d-none');
17129                        originalTitleElement.classList.add('d-none');
17130                    } else {
17131                        // Oculta título alternativo e mostra original
17132                        altTitleElement.classList.add('d-none');
17133                        originalTitleElement.classList.remove('d-none');
17134                    }
17135                }
17136            });
17137        } catch (error) {
17138            console.error('Erro no updateTitleDisplay:', error);
17139        } finally {
17140            isUpdating = false;
17141        }
17142    }
17143
17144    function initializeObserver() {
17145        if (observer || !window.MutationObserver) return;
17146        
17147        observer = new MutationObserver(function(mutations) {
17148            if (isUpdating) return;
17149            
17150            let shouldUpdate = false;
17151            
17152            mutations.forEach(function(mutation) {
17153                if (mutation.type === 'childList') {
17154                    const target = mutation.target;
17155                    if (target.hasAttribute && 
17156                        (target.hasAttribute('data-lfr-editable-id') || 
17157                         target.closest('[data-lfr-editable-id]'))) {
17158                        shouldUpdate = true;
17159                    }
17160                }
17161            });
17162
17163            if (shouldUpdate) {
17164                clearTimeout(window.titleUpdateTimeout);
17165                window.titleUpdateTimeout = setTimeout(updateTitleDisplay, 150);
17166            }
17167        });
17168
17169        const layoutItems = document.querySelectorAll('.card-image-top-vertical-layout');
17170        layoutItems.forEach(function(item) {
17171            observer.observe(item, {
17172                childList: true,
17173                subtree: true,
17174                characterData: false
17175            });
17176        });
17177    }
17178
17179    // Execução inicial
17180    setTimeout(function() {
17181        updateTitleDisplay();
17182        initializeObserver();
17183    }, 200);
17184
17185    setTimeout(function() {
17186        if (!isUpdating) {
17187            updateTitleDisplay();
17188        }
17189    }, 1000);
17190
17191    // Event listeners do Liferay
17192    if (window.Liferay && Liferay.on) {
17193        let liferayTimeout;
17194        
17195        Liferay.on('editableFieldChanged', function(event) {
17196            clearTimeout(liferayTimeout);
17197            liferayTimeout = setTimeout(function() {
17198                if (!isUpdating) {
17199                    updateTitleDisplay();
17200                }
17201            }, 200);
17202        });
17203
17204        Liferay.on('allPortletsReady', function() {
17205            clearTimeout(liferayTimeout);
17206            liferayTimeout = setTimeout(function() {
17207                if (!isUpdating) {
17208                    updateTitleDisplay();
17209                }
17210            }, 300);
17211        });
17212    }
17213
17214    // Cleanup
17215    window.addEventListener('beforeunload', function() {
17216        if (observer) {
17217            observer.disconnect();
17218        }
17219        clearTimeout(window.titleUpdateTimeout);
17220    });
17221});;</script>
17221
17222              </div>
17223             </div>
17224            </div>
17225           </div>
17226          </div>
17227         </div>
17228        </div>
17229        <!-- Controle próximo -->
17230        <button class="sp-csee-slider-control sp-csee-slider-control--next sp-csee-slider-control--side" onclick="moveCarouselCsee(1)" aria-label="Próximo item" data-action="next"> 
17231         <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
17232          <path d="M9 18L15 12L9 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
17233         </svg> 
17234        </button>
17235       </div>
17236      </div>
17237     </div>
17238    </div>
17239    <style>.sp-csee-psp-slide-crontol
17240  .lfr-layout-structure-item-collection
17241  > .container-fluid
17242  > .row {
17243  flex-wrap: nowrap;
17244  transition: transform 0.3s ease-in-out !important;
17245}
17246
17247.sp-csee-psp-slide-crontol
17248  .lfr-layout-structure-item-collection
17249  > .container-fluid
17250  > .row
17251  > .col {
17252  flex: 0 0 calc(1 / 2 * 100%) !important;
17253  max-width: calc(1 / 2 * 100%) !important;
17254}
17255
17256/* Variáveis csee para customização */
17257.sp-csee-fragment-slider-container {
17258  --slider-bg: transparent;
17259  --slider-text: #000000;
17260  --slider-icon: #ffffff;
17261  --slider-accent: #ffd700;
17262  --control-bg: #000000;
17263  --control-hover-bg: #a8a8a8;
17264  --header-gap: 20px;
17265  --item-gap: 16px;
17266}
17267
17268/* Container principal */
17269.sp-csee-fragment-slider-container {
17270  background-color: var(--slider-bg);
17271  color: var(--slider-text);
17272  padding: var(--slider-padding);
17273  position: relative;
17274  overflow: hidden;
17275}
17276
17277.sp-csee-slider-container__wrapper {
17278  max-width: 1440px;
17279  margin: 0 auto;
17280  position: relative;
17281}
17282
17283/* Header com título e controles */
17284.sp-csee-slider-container__header {
17285  display: flex;
17286  justify-content: space-between;
17287  align-items: center;
17288  margin-bottom: var(--header-gap);
17289  flex-wrap: wrap;
17290  gap: 20px;
17291}
17292
17293/* Dropzone do título */
17294.sp-csee-slider-container__title-dropzone {
17295  flex: 1;
17296  min-width: 200px;
17297}
17298
17299.sp-csee-dropzone-title {
17300  min-height: 40px;
17301}
17302
17303/* Título padrão */
17304.sp-csee-default-title .sp-csee-slider-title {
17305  margin: 0;
17306  font-size: clamp(1.5rem, 3vw, 2rem);
17307  font-weight: 700;
17308  display: flex;
17309  align-items: center;
17310  gap: 12px;
17311}
17312
17313.sp-csee-default-title .sp-csee-slider-title .sp-csee-icon {
17314  font-size: 1.2em;
17315}
17316
17317/* Controles de navegação */
17318.sp-csee-slider-container__controls {
17319  display: none; /* Oculta os controles originais do header */
17320}
17321
17322.sp-csee-slider-control {
17323  width: 44px;
17324  height: 44px;
17325  border: 1px solid rgba(255, 255, 255, 0.3);
17326  background-color: var(--control-bg);
17327  color: var(--slider-icon);
17328  border-radius: 4px;
17329  cursor: pointer;
17330  display: flex;
17331  align-items: center;
17332  justify-content: center;
17333  transition: all 0.3s ease;
17334  padding: 0;
17335}
17336
17337/* Estilos para controles laterais */
17338.sp-csee-slider-control--side {
17339  position: absolute;
17340  top: 50%;
17341  transform: translateY(-50%);
17342  width: 30px;
17343  height: 30px;
17344  z-index: 10;
17345  background-color: var(--control-bg);
17346  color: var(--slider-icon);
17347}
17348
17349.sp-csee-slider-control--prev.sp-csee-slider-control--side {
17350  left: -45px;
17351}
17352
17353.sp-csee-slider-control--next.sp-csee-slider-control--side {
17354  right: -45px;
17355}
17356
17357.sp-csee-slider-control:hover:not(:disabled) {
17358  background-color: var(--control-hover-bg);
17359  border-color: rgba(255, 255, 255, 0.5);
17360  transform: translateY(-1px);
17361}
17362
17363.sp-csee-slider-control--side:hover:not(:disabled) {
17364  transform: translateY(-50%) translateY(-1px);
17365}
17366
17367.sp-csee-slider-control:disabled {
17368  opacity: 0.3;
17369  cursor: not-allowed;
17370}
17371
17372.sp-csee-slider-control:focus-visible {
17373  outline: 2px solid var(--slider-accent);
17374  outline-offset: 2px;
17375}
17376
17377/* Área de conteúdo/slider */
17378.sp-csee-slider-container__content {
17379  position: relative;
17380  width: 100%;
17381}
17382
17383.sp-csee-slider-viewport {
17384  width: 100%;
17385  overflow: hidden;
17386  position: relative;
17387}
17388
17389/* Dropzone da coleção */
17390.sp-csee-dropzone-collection {
17391  min-height: 300px;
17392  position: relative;
17393}
17394
17395/* Placeholder do dropzone */
17396.sp-csee-dropzone-placeholder {
17397  display: flex;
17398  align-items: center;
17399  justify-content: center;
17400  min-height: 300px;
17401  border: 2px dashed rgba(255, 255, 255, 0.3);
17402  border-radius: 8px;
17403  background-color: rgba(255, 255, 255, 0.05);
17404  color: rgba(255, 255, 255, 0.5);
17405  font-size: 1.125rem;
17406  text-align: center;
17407  padding: 40px;
17408}
17409
17410/* Quando houver conteúdo no dropzone */
17411.sp-csee-dropzone-collection:not(:empty) .sp-csee-dropzone-placeholder {
17412  display: none;
17413}
17414
17415/* FORÇA LAYOUT HORIZONTAL - Sobrescreve qualquer csee de grid dos fragmentos filhos */
17416.sp-csee-dropzone-collection > .collection-display-grid,
17417.sp-csee-dropzone-collection > .row {
17418  display: flex !important;
17419  gap: var(--item-gap);
17420  transition: transform 0.5s ease;
17421  flex-wrap: nowrap !important;
17422  width: 100%;
17423}
17424
17425/* Força todos os elementos filhos a seguirem o layout flex */
17426.sp-csee-dropzone-collection .collection-display-grid > *,
17427.sp-csee-dropzone-collection .row > * {
17428  flex: 0 0 auto !important;
17429  width: calc((100% - (var(--item-gap) * 5)) / 6) !important;
17430  min-width: 150px;
17431  display: block !important; /* Remove qualquer display: grid dos filhos */
17432}
17433
17434/* Sobrescreve especificamente o csee de grid dos vídeos-curtos */
17435.sp-csee-dropzone-collection .sampa-news-videos-grid,
17436.sp-csee-dropzone-collection .sampa-news-videos-grid > * {
17437  display: flex !important;
17438  grid-template-columns: none !important;
17439}
17440
17441/* Responsividade - mantém 6 itens mas ajusta tamanhos mínimos */
17442@media (max-width: 1200px) {
17443  .sp-csee-dropzone-collection .collection-display-grid > *,
17444  .sp-csee-dropzone-collection .row > * {
17445    min-width: 140px;
17446  }
17447}
17448
17449@media (max-width: 992px) {
17450  .sp-csee-fragment-slider-container {
17451    --item-gap: 12px;
17452  }
17453
17454  .sp-csee-dropzone-collection .collection-display-grid > *,
17455  .sp-csee-dropzone-collection .row > * {
17456    min-width: 120px;
17457  }
17458
17459  .sp-csee-psp-slide-crontol
17460    .lfr-layout-structure-item-collection
17461    > .container-fluid
17462    > .row
17463    > .col {
17464    flex: 0 0 calc(1 / 2 * 100%) !important;
17465    max-width: calc(1 / 2 * 100%) !important;
17466  }
17467}
17468
17469@media (max-width: 768px) {
17470  .sp-csee-fragment-slider-container {
17471    --slider-padding: 20px;
17472    --item-gap: 10px;
17473  }
17474
17475  .sp-csee-slider-container__header {
17476    flex-direction: column;
17477    align-items: flex-start;
17478  }
17479
17480  /* Ajusta posição dos controles laterais em telas menores */
17481  .sp-csee-slider-control--prev.sp-csee-slider-control--side {
17482    left: -35px;
17483  }
17484
17485  .sp-csee-slider-control--next.sp-csee-slider-control--side {
17486    right: -35px;
17487  }
17488
17489  .sp-csee-dropzone-collection .collection-display-grid > *,
17490  .sp-csee-dropzone-collection .row > * {
17491    min-width: 100px;
17492  }
17493
17494  .sp-csee-psp-slide-crontol
17495    .lfr-layout-structure-item-collection
17496    > .container-fluid
17497    > .row
17498    > .col {
17499    flex: 0 0 calc(1 / 1 * 100%) !important;
17500    max-width: calc(1 / 1 * 100%) !important;
17501  }
17502}
17503
17504@media (max-width: 600px) {
17505  /* Em telas muito pequenas, permite scroll horizontal */
17506  .sp-csee-slider-viewport {
17507    overflow-x: auto;
17508    -webkit-overflow-scrolling: touch;
17509  }
17510
17511  /* Em telas muito pequenas, move os controles para dentro */
17512  .sp-csee-slider-control--prev.sp-csee-slider-control--side {
17513    left: -20px;
17514  }
17515
17516  .sp-csee-slider-control--next.sp-csee-slider-control--side {
17517    right: -20px;
17518  }
17519
17520  .sp-csee-dropzone-collection .collection-display-grid > *,
17521  .sp-csee-dropzone-collection .row > * {
17522    min-width: 90px;
17523  }
17524
17525  .sp-csee-psp-slide-crontol
17526    .lfr-layout-structure-item-collection
17527    > .container-fluid
17528    > .row
17529    > .col {
17530    flex: 0 0 calc(1 / 1 * 100%) !important;
17531    max-width: calc(1 / 1 * 100%) !important;
17532  }
17533}
17534
17535/* Modo claro */
17536@media (prefers-color-scheme: light) {
17537  .sp-csee-fragment-slider-container.sp-csee-light-mode {
17538    --slider-bg: #f5f5f5;
17539    --slider-text: #1a1a1a;
17540    --control-bg: rgba(0, 0, 0, 0.05);
17541    --control-hover-bg: rgba(0, 0, 0, 0.1);
17542  }
17543
17544  .sp-csee-fragment-slider-container.sp-csee-light-mode
17545    .sp-csee-slider-control {
17546    border-color: rgba(0, 0, 0, 0.2);
17547  }
17548
17549  .sp-csee-fragment-slider-container.sp-csee-light-mode
17550    .sp-csee-dropzone-placeholder {
17551    border-color: rgba(0, 0, 0, 0.2);
17552    background-color: rgba(0, 0, 0, 0.02);
17553    color: rgba(0, 0, 0, 0.5);
17554  }
17555}
17556
17557/* Estados do dropzone no editor */
17558.page-editor-layout-drop-zone-active .sp-csee-dropzone-title,
17559.page-editor-layout-drop-zone-active .sp-csee-dropzone-collection {
17560  background-color: rgba(255, 215, 0, 0.1);
17561  border: 2px dashed var(--slider-accent);
17562  min-height: 60px;
17563}
17564
17565/* Animação suave */
17566@media (prefers-reduced-motion: no-preference) {
17567  .sp-csee-slider-control {
17568    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
17569  }
17570
17571  .sp-csee-dropzone-collection > .collection-display-grid,
17572  .sp-csee-dropzone-collection > .row {
17573    transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
17574  }
17575}
17576</style>
17577    
17577<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-7068a1a1-d021-44bb-47f1-58143bb74464'); const fragmentElementId = 'fragment-7068a1a1-d021-44bb-47f1-58143bb74464'; const fragmentEntryLinkNamespace = 'voos'; const fragmentNamespace = 'voos'; const layoutMode = 'view';let currentPositioncsee = 0;
17578const trackcsee = document.querySelector(
17579  ".sp-csee-psp-slide-crontol .lfr-layout-structure-item-collection > .container-fluid > .row"
17580);
17581
17582function moveCarouselCsee(direction) {
17583  if (!trackcsee) return;
17584
17585  const totalItems = trackcsee.children.length;
17586  const itemsToShow = 1;
17587  const maxPosition = totalItems - itemsToShow;
17588
17589  // Calcular nova posição
17590  if (direction === 1 && currentPositioncsee < maxPosition) {
17591    currentPositioncsee++; // Próximo item
17592  } else if (direction === -1 && currentPositioncsee > 0) {
17593    currentPositioncsee--; // Anterior item
17594  }
17595
17596  // Mover o carrossel
17597  const movePercent = -(currentPositioncsee * (100 / itemsToShow));
17598  trackcsee.style.transform = `translateX(${movePercent}%)`;
17599}
17600
17601window.moveCarouselCsee = moveCarouselCsee;
17602;</script>
17602
17603   </div>
17604  </div>
17605 </div>
17606 <div class="lfr-layout-structure-item-basic-component-spacer lfr-layout-structure-item-5c207207-189e-ba19-344f-90131fd19043 " data-layout-structure-item-id="5c207207-189e-ba19-344f-90131fd19043">
17607  <div id="fragment-98d9e031-53ad-9a91-9305-c24e9da96fb3">
17608   <div class="py-2"></div>
17609  </div>
17610 </div>
17611 <div class="lfr-layout-structure-item-0ed82d92-31d9-2e4f-ae86-b1bfeed5fcc7 lfr-layout-structure-item-container  container-fluid container-fluid-max-xl" data-layout-structure-item-id="0ed82d92-31d9-2e4f-ae86-b1bfeed5fcc7">
17612  <div class="lfr-layout-structure-item-e93ede66-c72d-50f5-e29d-1674d973daf1 lfr-layout-structure-item-container  container-fluid container-fluid-max-xl d-flex flex-row align-items-center" data-layout-structure-item-id="e93ede66-c72d-50f5-e29d-1674d973daf1">
17613   <div class="lfr-layout-structure-item-basic-component-image lfr-layout-structure-item-18ac4cac-31e1-c357-066d-207cba02e02b " data-layout-structure-item-id="18ac4cac-31e1-c357-066d-207cba02e02b">
17614    <div id="fragment-b9be6793-fc5e-915f-83a8-22cc86f9bb31">
17615     <div class="component-image overflow-hidden">
17616      <picture data-fileentryid="26572348"><source media="(max-width:32px)" srcset="/o/adaptive-media/image/26572348/Preview-1000x0/trending_up.png?t=1750453984807"><source media="(max-width:32px) and (min-width:32px)" srcset="/o/adaptive-media/image/26572348/Thumbnail-300x300/trending_up.png?t=1750453984807"><img alt="" class="w-0" data-lfr-editable-id="image-square" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/25160874/trending_up.png/a5c6caa9-cabf-97c5-5c8e-f85a8f33c463?version=1.0&amp;t=1750453984807" data-fileentryid="26572348"></picture>
17617     </div>
17618    </div>
17619   </div>
17620   <div class="lfr-layout-structure-item-basic-component-heading lfr-layout-structure-item-324ced43-56fa-b988-16d6-03bb2bbec373 " data-layout-structure-item-id="324ced43-56fa-b988-16d6-03bb2bbec373">
17621    <div id="fragment-babcc5f1-6ae8-6975-13a2-0624f9ed22b9">
17622     <h4 class="component-heading mb-0 text-break" data-lfr-editable-id="element-text" data-lfr-editable-type="text">Notícias mais lidas</h4>
17623    </div>
17624   </div>
17625  </div>
17626  <div class="lfr-layout-structure-item-com-liferay-asset-publisher-web-portlet-assetpublisherportlet lfr-layout-structure-item-e8069913-e246-7f5b-5e56-5536b81ed1b2 " data-layout-structure-item-id="e8069913-e246-7f5b-5e56-5536b81ed1b2">
17627   <div id="fragment-a745988a-53d7-c1dd-8a2f-63f768fee886">
17628    <link href="https://sampanews.sp.gov.br/o/asset-publisher-web/css/main.(EsKg1TyevJA).css" rel="stylesheet" type="text/css">
17629    <div class="portlet-boundary portlet-boundary_com_liferay_asset_publisher_web_portlet_AssetPublisherPortlet_  portlet-static portlet-static-end portlet-borderless portlet-asset-publisher " id="p_p_id_com_liferay_asset_publisher_web_portlet_AssetPublisherPortlet_INSTANCE_wcya_">
17630     <span id="p_com_liferay_asset_publisher_web_portlet_AssetPublisherPortlet_INSTANCE_wcya"></span>
17631     <section class="portlet" id="portlet_com_liferay_asset_publisher_web_portlet_AssetPublisherPortlet_INSTANCE_wcya">
17632      <div class="portlet-content">
17633       <div class=" portlet-content-container">
17634        <div class="portlet-body">
17635         <style>
17636		/* Custom styles for numbered two-column layout */
17637		.numbered-list {
17638			display: grid;
17639			grid-template-columns: 1fr 1fr;
17640			gap: 30px 40px;
17641			list-style: none;
17642			padding: 0;
17643			margin: 0;
17644			counter-reset: item-counter;
17645		}
17646		
17647		.numbered-item {
17648			display: flex;
17649			align-items: flex-start;
17650			counter-increment: item-counter;
17651			gap: 15px;
17652			border-bottom: 1px solid #e0e0e0;
17653		}
17654		
17655		/* Large number with square background */
17656		.numbered-item::before {
17657			content: counter(item-counter, decimal-leading-zero);
17658			font-size: 48px;
17659			font-weight: bold;
17660			color: #333;
17661			line-height: 1;
17662			min-width: 60px;
17663			height: 60px;
17664			flex-shrink: 0;
17665			background-color: #f8f8f8;
17666			display: flex;
17667			align-items: center;
17668			justify-content: center;
17669			border-radius: 4px;
17670		}
17671		
17672		.numbered-content {
17673			flex: 1;
17674			padding-top: 8px;
17675		}
17676		
17677		.numbered-title {
17678			display: block;
17679			color: #333 !important;
17680			font-size: 16px;
17681			font-weight: normal;
17682			text-decoration: none !important;
17683			line-height: 1.4;
17684			margin: 0;
17685			transition: color 0.2s ease;
17686		}
17687		
17688		.numbered-title:hover {
17689			color: #007bff !important;
17690			text-decoration: underline !important;
17691		}
17692		
17693		/* Remove any existing link styles */
17694		.numbered-title:visited,
17695		.numbered-title:active,
17696		.numbered-title:focus {
17697			color: #333 !important;
17698		}
17699		
17700		.numbered-title:hover:visited,
17701		.numbered-title:hover:active,
17702		.numbered-title:hover:focus {
17703			color: #007bff !important;
17704		}
17705		
17706		/* Responsive adjustments */
17707		@media (max-width: 992px) {
17708			.numbered-list {
17709				gap: 25px 30px;
17710			}
17711			
17712			.numbered-item::before {
17713				font-size: 42px;
17714				min-width: 55px;
17715				height: 55px;
17716			}
17717			
17718			.numbered-title {
17719				font-size: 15px;
17720			}
17721		}
17722		
17723		@media (max-width: 768px) {
17724			.numbered-list {
17725				grid-template-columns: 1fr;
17726				gap: 20px;
17727			}
17728			
17729			.numbered-item::before {
17730				font-size: 36px;
17731				min-width: 50px;
17732				height: 50px;
17733			}
17734			
17735			.numbered-item {
17736				gap: 12px;
17737				padding-bottom: 15px;
17738				margin-bottom: 15px;
17739			}
17740			
17741			.numbered-title {
17742				font-size: 14px;
17743			}
17744			
17745			.numbered-content {
17746				padding-top: 6px;
17747			}
17748		}
17749		
17750		@media (max-width: 480px) {
17751			.numbered-item::before {
17752				font-size: 28px;
17753				min-width: 45px;
17754				height: 45px;
17755			}
17756			
17757			.numbered-item {
17758				gap: 10px;
17759				padding-bottom: 12px;
17760				margin-bottom: 12px;
17761			}
17762			
17763			.numbered-title {
17764				font-size: 13px;
17765			}
17766			
17767			.numbered-content {
17768				padding-top: 4px;
17769			}
17770		}
17771	</style>
17772         <ul class="numbered-list">
17773          <li class="numbered-item">
17774           <div class="numbered-content">
17775            <a href="https://sampanews.sp.gov.br/w/prefeitura-elabora-or%C3%A7amento-anual-recorde-para-o-ano-2027-r-146-52-bilh%C3%B5es" class="numbered-title"> Prefeitura elabora orçamento anual recorde para o ano 2027: R$ 146,52 bilhões </a>
17776           </div>
17777          </li>
17778          <li class="numbered-item">
17779           <div class="numbered-content">
17780            <a href="https://sampanews.sp.gov.br/w/prefeitura-inaugura-35%C2%AA-upa-e-485%C2%AA-ubs-da-cidade-com-entrega-de-novas-unidades-em-perus" class="numbered-title"> Prefeitura inaugura 35ª UPA e 485ª UBS da cidade com entrega de novas unidades em Perus </a>
17781           </div>
17782          </li>
17783          <li class="numbered-item">
17784           <div class="numbered-content">
17785            <a href="https://sampanews.sp.gov.br/w/com-piscina-semiol%C3%ADmpica-coberta-e-aquecida-prefeitura-entrega-recupera%C3%A7%C3%A3o-e-moderniza%C3%A7%C3%A3o-completa-do-centro-esportivo-carioca" class="numbered-title"> Com piscina semiolímpica coberta e aquecida, Prefeitura entrega recuperação e modernização completa do Centro [...] </a>
17786           </div>
17787          </li>
17788          <li class="numbered-item">
17789           <div class="numbered-content">
17790            <a href="https://sampanews.sp.gov.br/w/prefeitura-atinge-marco-hist%C3%B3rico-de-2-mil-%C3%B4nibus-el%C3%A9tricos-na-frota-de-s%C3%A3o-paulo-com-entrega-de-mais-250-ve%C3%ADculos" class="numbered-title"> Prefeitura atinge marco histórico de 2 mil ônibus elétricos na frota de São Paulo com entrega de mais 250 veículos </a>
17791           </div>
17792          </li>
17793          <li class="numbered-item">
17794           <div class="numbered-content">
17795            <a href="https://sampanews.sp.gov.br/w/carnaval-2027-prefeitura-antecipa-organiza%C3%A7%C3%A3o-e-741-blocos-est%C3%A3o-inscritos-para-desfilarem-nas-ruas-da-cidade-17-6-a-mais-do-que-na-%C3%BAltima-edi%C3%A7%C3%A3o" class="numbered-title"> Carnaval 2027: Prefeitura antecipa organização e 741 blocos estão inscritos para desfilarem nas ruas da cidade, [...] </a>
17796           </div>
17797          </li>
17798          <li class="numbered-item">
17799           <div class="numbered-content">
17800            <a href="https://sampanews.sp.gov.br/w/fluxo-internacional-cresce-4-4-e-s%C3%A3o-paulo-recebe-1-7-milh%C3%A3o-de-turistas-at%C3%A9-agosto" class="numbered-title"> Fluxo internacional cresce 4,4% e São Paulo recebe 1,7 milhão de turistas até agosto </a>
17801           </div>
17802          </li>
17803          <li class="numbered-item">
17804           <div class="numbered-content">
17805            <a href="https://sampanews.sp.gov.br/w/cate-abre-outubro-com-mais-de-4.000-vagas-de-emprego-%C3%A1rea-de-atendimento-re%C3%BAne-300-oportunidades" class="numbered-title"> Cate abre outubro com mais de 4.000 vagas de emprego; área de atendimento reúne 300 oportunidades </a>
17806           </div>
17807          </li>
17808          <li class="numbered-item">
17809           <div class="numbered-content">
17810            <a href="https://sampanews.sp.gov.br/w/das-ruas-para-o-lar-uma-em-cada-quatro-pessoas-acolhidas-nas-vilas-reencontro-da-prefeitura-deixa-equipamento-e-conquista-autonomia" class="numbered-title"> Das ruas para o lar: uma em cada quatro pessoas acolhidas nas Vilas Reencontro da Prefeitura deixa equipamento e [...] </a>
17811           </div>
17812          </li>
17813         </ul>
17814        </div>
17815       </div>
17816      </div>
17817     </section>
17818    </div>
17819   </div>
17820  </div>
17821 </div>
17822</div>
17823<div class="lfr-layout-structure-item-0e4e0286-2d3d-6105-292a-481c7b3628ac lfr-layout-structure-item-container " data-layout-structure-item-id="0e4e0286-2d3d-6105-292a-481c7b3628ac">
17824 <div class="lfr-layout-structure-item-f63c70f8-2fda-8aa8-817c-809b3dfa0582 lfr-layout-structure-item-container  container-fluid container-fluid-max-xl" data-layout-structure-item-id="f63c70f8-2fda-8aa8-817c-809b3dfa0582">
17825  <div class="lfr-layout-structure-item-c073f31e-8df3-6785-2db6-155ced8b712d lfr-layout-structure-item-row " data-layout-structure-item-id="c073f31e-8df3-6785-2db6-155ced8b712d">
17826   <div class="row align-items-lg-center align-items-sm-center align-items-center align-items-md-center flex-lg-row flex-sm-row flex-row flex-md-row">
17827    <div class="col col-lg-4 col-sm-7 col-7 col-md-4 d-flex flex-column">
17828     <div class="lfr-layout-structure-item-basic-component-image lfr-layout-structure-item-f1af4e0e-942a-a376-58dd-f3d180ff9c38 " data-layout-structure-item-id="f1af4e0e-942a-a376-58dd-f3d180ff9c38">
17829      <div id="fragment-87b6f0a4-06bc-ed4b-211f-5afaaf749d5f">
17830       <div class="component-image overflow-hidden">
17831        <a href="/home"><picture data-fileentryid="29066958"><source media="(min-width:960px)" srcset="/o/adaptive-media/image/29066958/Thumbnail-300x300/sampanews_LOGO_final_fundo_preto.png?t=1756835438113"><source media="(max-width:300px)" srcset="/o/adaptive-media/image/29066958/Preview-1000x0/sampanews_LOGO_final_fundo_preto.png?t=1756835438113"><source media="(max-width:300px) and (min-width:300px)" srcset="/o/adaptive-media/image/29066958/Thumbnail-300x300/sampanews_LOGO_final_fundo_preto.png?t=1756835438113"><img alt="" class="w-0" data-lfr-editable-id="image-square" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/26522825/sampanews_LOGO_final_fundo_preto.png/5ab6573f-38dc-40dc-6d3b-a6cf98372dd3?version=1.0&amp;t=1756835438113" data-fileentryid="29066958" data-desktop-configuration="Thumbnail-300x300"></picture></a>
17832       </div>
17833      </div>
17834     </div>
17835    </div>
17836    <div class="col col-lg-8 col-sm-5 col-5 col-md-8 d-flex flex-column">
17837     <div class="lfr-layout-structure-item-basic-component-image lfr-layout-structure-item-ae4cf244-dac1-f2cb-bc24-fbc8b3fb3b9a " data-layout-structure-item-id="ae4cf244-dac1-f2cb-bc24-fbc8b3fb3b9a">
17838      <div id="fragment-4af3267f-1125-5fb7-5b74-93a32d2cdf08">
17839       <div class="component-image overflow-hidden">
17840        <a href="https://prefeitura.sp.gov.br/"><picture data-fileentryid="26571306"><source media="(min-width:960px)" srcset="/o/adaptive-media/image/26571306/Thumbnail-300x300/LOGO_PREFEITURA_COLOR.png?t=1750450063978"><source media="(max-width:171px)" srcset="/o/adaptive-media/image/26571306/Preview-1000x0/LOGO_PREFEITURA_COLOR.png?t=1750450063978"><source media="(max-width:171px) and (min-width:171px)" srcset="/o/adaptive-media/image/26571306/Thumbnail-300x300/LOGO_PREFEITURA_COLOR.png?t=1750450063978"><img alt="" class="w-0" data-lfr-editable-id="image-square" data-lfr-editable-type="image" src="https://sampanews.sp.gov.br/documents/24771855/25160874/LOGO_PREFEITURA_COLOR.png/8f4791d6-b89f-0902-de12-455983038e88?version=1.0&amp;t=1750450063978" data-fileentryid="26571306" data-desktop-configuration="Thumbnail-300x300"></picture></a>
17841       </div>
17842      </div>
17843     </div>
17844    </div>
17845   </div>
17846  </div>
17847  <div class="lfr-layout-structure-item-ce69843b-d12d-0fff-ea90-3244c32c44a6 lfr-layout-structure-item-row " data-layout-structure-item-id="ce69843b-d12d-0fff-ea90-3244c32c44a6">
17848   <div class="row align-items-lg-start align-items-sm-start align-items-start align-items-md-start flex-lg-row flex-sm-row flex-row flex-md-row">
17849    <div class="col col-lg-12 col-sm-12 col-12 col-md-12">
17850     <div class="lfr-layout-structure-item-footer--copiar- lfr-layout-structure-item-4f7ef626-8090-d7c5-0a6f-e11c0b076aa1 " data-layout-structure-item-id="4f7ef626-8090-d7c5-0a6f-e11c0b076aa1">
17851      <div id="fragment-c0df46a3-a51f-632a-78aa-51de698f9a5b">
17852       <!-- Layout em três colunas -->
17853       <div class="footer-three-columns">
17854        <!-- Primeira coluna - Mapa do Site (Parte 1) -->
17855        <div class="footer-column">
17856         <h3>Mapa do Site</h3>
17857         <ul>
17858          <li><a class="site-map-link" href="/home" tabindex="0" data-lfr-editable-id="home-link" data-lfr-editable-type="link"><b>Home</b></a></li>
17859          <li><a class="site-map-link" href="/noticias" tabindex="0" data-lfr-editable-id="lasted-news-link" data-lfr-editable-type="link">Ultimas Noticias</a></li>
17860          <li><a class="site-map-link" href="/web/sampa-news/animais" tabindex="0" data-lfr-editable-id="animais-link" data-lfr-editable-type="link">Animais</a></li>
17861          <li><a class="site-map-link" href="/artigos" tabindex="0" data-lfr-editable-id="artigos-link" data-lfr-editable-type="link">Artigos</a></li>
17862          <li><a class="site-map-link" href="/assistencia-social" tabindex="0" data-lfr-editable-id="assistencia-social-link" data-lfr-editable-type="link">Assistência Social</a></li>
17863          <li><a class="site-map-link" href="/cidadania" tabindex="0" data-lfr-editable-id="cidadania-link" data-lfr-editable-type="link">Cidadania</a></li>
17864          <li><a class="site-map-link" href="https://prefeitura.sp.gov.br/web/sampa-news/cultura" tabindex="0" data-lfr-editable-id="cultura-link" data-lfr-editable-type="link">Cultura</a></li>
17865          <li><a class="site-map-link" href="/economia" tabindex="0" data-lfr-editable-id="economia-link" data-lfr-editable-type="link">Economia</a></li>
17866          <li><a class="site-map-link" href="https://prefeitura.sp.gov.br/web/sampa-news/educacao" tabindex="0" data-lfr-editable-id="education-link" data-lfr-editable-type="link">Educação</a></li>
17867          <li><a class="site-map-link" href="/esporte-e-lazer" tabindex="0" data-lfr-editable-id="esporte-lazer-link" data-lfr-editable-type="link">Esporte e Lazer</a></li>
17868          <li><a class="site-map-link" href="https://prefeitura.sp.gov.br/web/sampa-news/gestao" tabindex="0" data-lfr-editable-id="gestao-link" data-lfr-editable-type="link">Gestão</a></li>
17869          <li><a class="site-map-link" href="/meio-ambiente" tabindex="0" data-lfr-editable-id="meio-ambiente-link" data-lfr-editable-type="link">Meio Ambiente</a></li>
17870          <li><a class="site-map-link" href="https://prefeitura.sp.gov.br/web/sampa-news/mobilidade" tabindex="0" data-lfr-editable-id="mobilidade-link" data-lfr-editable-type="link">Mobilidade</a></li>
17871         </ul>
17872        </div>
17873        <!-- Segunda coluna - Mapa do Site (Parte 2) -->
17874        <div class="footer-column">
17875         <h3>&nbsp;</h3>
17876         <!-- Espaço para alinhamento visual -->
17877         <ul>
17878          <li><a class="site-map-link" href="https://prefeitura.sp.gov.br/web/sampa-news/habitacao" tabindex="0" data-lfr-editable-id="habitacao-link" data-lfr-editable-type="link">Habitação</a></li>
17879          <li><a class="site-map-link" href="/inclusao" tabindex="0" data-lfr-editable-id="inclusao-link" data-lfr-editable-type="link">Inclusão</a></li>
17880          <li><a class="site-map-link" href="/infraestrutura-obras" tabindex="0" data-lfr-editable-id="infraestrutura-link" data-lfr-editable-type="link">Infraestrutura</a></li>
17881          <li><a class="site-map-link" href="https://prefeitura.sp.gov.br/web/sampa-news/saude" tabindex="0" data-lfr-editable-id="saude-link" data-lfr-editable-type="link">Saúde</a></li>
17882          <li><a class="site-map-link" href="https://prefeitura.sp.gov.br/web/sampa-news/seguranca" tabindex="0" data-lfr-editable-id="seguranca-link" data-lfr-editable-type="link">Segurança</a></li>
17883          <li><a class="site-map-link" href="https://prefeitura.sp.gov.br/web/sampa-news/servicos" tabindex="0" data-lfr-editable-id="servicos-link" data-lfr-editable-type="link">Serviços</a></li>
17884          <li><a class="site-map-link" href="/tecnologia" tabindex="0" data-lfr-editable-id="tecnologia-link" data-lfr-editable-type="link">Tecnologia</a></li>
17885          <li><a class="site-map-link" href="/trabalhos" tabindex="0" data-lfr-editable-id="trabalho-link" data-lfr-editable-type="link">Trabalho</a></li>
17886          <li><a class="site-map-link" href="https://prefeitura.sp.gov.br/web/sampa-news/turismo-e-negocios" tabindex="0" data-lfr-editable-id="turismo-negocios-link" data-lfr-editable-type="link">Turismo e Negócios</a></li>
17887          <!-- 
17888       <li><a class="site-map-link" href="/web/sampa-news/urbanismo" tabindex="0"
17889          data-lfr-editable-id="urban-link" data-lfr-editable-type="link">Urbanismo</a> 
17890			</li>
17891       -->
17892          <li><a class="site-map-link" href="/zeladoria" tabindex="0" data-lfr-editable-id="janitorial-link" data-lfr-editable-type="link">Zeladoria</a></li>
17893         </ul>
17894        </div>
17895        <!-- Terceira coluna - Links Úteis -->
17896        <div class="footer-column">
17897         <h3>Links Úteis</h3>
17898         <ul>
17899          <li><a class="useful-link" href="http://transparencia.prefeitura.sp.gov.br/sistema-eletronico-de-informacao-ao-cidadao-e-sic/" tabindex="0" data-lfr-editable-id="acesso-informacao-link" data-lfr-editable-type="link" target="_blank" rel="noopener noreferrer">Acesso à informação</a></li>
17900          <li><a class="useful-link" href="http://transparencia.prefeitura.sp.gov.br/" tabindex="0" data-lfr-editable-id="transparencia-sp-link" data-lfr-editable-type="link" target="_blank" rel="noopener noreferrer">Transparência São Paulo</a></li>
17901          <li><a class="useful-link" href="https://legislacao.prefeitura.sp.gov.br/" tabindex="0" data-lfr-editable-id="legislacao-link" data-lfr-editable-type="link" target="_blank" rel="noopener noreferrer">Legislação</a></li>
17902          <li><a class="useful-link" href="https://www.prefeitura.sp.gov.br/cidade/secretarias/ouvidoria/fale_com_a_ouvidoria/index.php?p=227268" tabindex="0" data-lfr-editable-id="ouvidoria-link" data-lfr-editable-type="link" target="_blank" rel="noopener noreferrer">Ouvidoria</a></li>
17903          <li><a class="useful-link" href="https://sp156.prefeitura.sp.gov.br/portal " tabindex="0" data-lfr-editable-id="sp156-link" data-lfr-editable-type="link" target="_blank" rel="noopener noreferrer">SP 156</a></li>
17904          <li><a class="useful-link" href="https://diariooficial.prefeitura.sp.gov.br/md_epubli_controlador.php?acao=inicio" tabindex="0" data-lfr-editable-id="diario-oficial-link" data-lfr-editable-type="link" target="_blank" rel="noopener noreferrer">Diário Oficial</a></li>
17905         </ul>
17906        </div>
17907       </div>
17908      </div>
17909      <style> /* Layout de três colunas */
17910  .footer-three-columns {
17911    display: flex;
17912    gap: 40px;
17913    margin-bottom: 40px;
17914  }
17915
17916  .footer-column {
17917    flex: 1;
17918    min-width: 0;
17919    /* Permite que o flex funcione corretamente */
17920  }
17921
17922  .footer-column h3 {
17923    font-size: 18px;
17924    margin-bottom: 15px;
17925    color: #FFF;
17926    font-weight: bold;
17927  }
17928
17929  .footer-column ul {
17930    list-style: none;
17931    padding: 0;
17932    margin: 0;
17933  }
17934
17935  .footer-column ul li {
17936    margin-bottom: 10px;
17937    font-size: 14px;
17938  }
17939
17940  /* Estilos para links do mapa do site */
17941  .site-map-link {
17942    color: #FFF;
17943    text-decoration: none;
17944    transition: color 0.2s;
17945  }
17946
17947  .site-map-link:hover {
17948    color: #0066cc;
17949  }
17950
17951  /* Estilos para links úteis */
17952  .useful-link {
17953    color: #FFF;
17954    text-decoration: none;
17955    transition: color 0.2s;
17956  }
17957
17958  .useful-link:hover {
17959    color: #0066cc;
17960  }
17961
17962  /* Layout responsivo */
17963  @media (max-width: 768px) {
17964    .footer-three-columns {
17965      flex-wrap: wrap;
17966      gap: 20px;
17967    }
17968    
17969    .footer-column {
17970      flex: 1 1 calc(50% - 10px); /* Duas colunas por linha */
17971      min-width: calc(50% - 10px);
17972    }
17973    
17974    .footer-column:nth-child(3) {
17975      flex: 1 1 100%; /* Terceira coluna ocupa linha inteira */
17976      min-width: 100%;
17977    }
17978
17979    .footer-column h3 {
17980      font-size: 16px;
17981    }
17982    
17983    .social-media-icons {
17984      justify-content: center;
17985    }
17986  }
17987
17988  @media (max-width: 480px) {
17989    .footer-three-columns {
17990      flex-direction: column;
17991      gap: 15px;
17992    }
17993    
17994    .footer-column {
17995      flex: 1 1 100%;
17996      min-width: 100%;
17997    }
17998    
17999    .footer-column ul li {
18000      font-size: 13px;
18001      margin-bottom: 8px;
18002    }
18003  }</style>
18004     </div>
18005    </div>
18006   </div>
18007  </div>
18008  <div class="lfr-layout-structure-item-90db2e82-84d8-cf24-4229-41ba02937a9b lfr-layout-structure-item-row " data-layout-structure-item-id="90db2e82-84d8-cf24-4229-41ba02937a9b">
18009   <div class="row align-items-lg-start align-items-sm-start align-items-start align-items-md-start flex-lg-row flex-sm-row flex-row flex-md-row">
18010    <div class="col col-lg-4 col-sm-12 col-12 col-md-4">
18011     <div class="lfr-layout-structure-item-basic-component-heading lfr-layout-structure-item-b880f6cc-95de-e23e-36ec-2c2c9a613f7b " data-layout-structure-item-id="b880f6cc-95de-e23e-36ec-2c2c9a613f7b">
18012      <div id="fragment-b9a58731-f6f9-a962-76cb-32dce4106ece">
18013       <h5 class="component-heading mb-0 text-break" data-lfr-editable-id="element-text" data-lfr-editable-type="text">Redes Sociais</h5>
18014      </div>
18015     </div>
18016     <div class="lfr-layout-structure-item-header---social-icons lfr-layout-structure-item-a032e5b8-7c93-33cc-6f97-0dc2c85bca3d " data-layout-structure-item-id="a032e5b8-7c93-33cc-6f97-0dc2c85bca3d">
18017      <div id="fragment-8f414a7b-7cc8-08d5-3503-c1cde3ffc10d">
18018       <div class="header-social-icons">
18019        <a href="#" target="_blank" rel="noopener noreferrer"> </a><a rel="noopener noreferrer" target="_blank" href="https://www.instagram.com/prefsp"><picture data-fileentryid="26457610"><source media="(max-width:40px)" srcset="/o/adaptive-media/image/26457610/Preview-1000x0/instagram-white.png?t=1750161447746"><source media="(max-width:40px) and (min-width:40px)" srcset="/o/adaptive-media/image/26457610/Thumbnail-300x300/instagram-white.png?t=1750161447746"><img src="https://sampanews.sp.gov.br/documents/24771855/25160874/instagram-white.png/aee303e5-2ac4-2da3-251f-8a75e09dbbef?version=1.0&amp;t=1750161447746" alt="Instagram" data-lfr-editable-id="Instagram" data-lfr-editable-type="image" tabindex="0" data-fileentryid="26457610"></picture></a> <a href="#" target="_blank" rel="noopener noreferrer"> </a><a rel="noopener noreferrer" target="_blank" href="https://www.facebook.com/PrefSP"><picture data-fileentryid="26457593"><source media="(max-width:40px)" srcset="/o/adaptive-media/image/26457593/Preview-1000x0/facebook-white.png?t=1750161447373"><source media="(max-width:40px) and (min-width:40px)" srcset="/o/adaptive-media/image/26457593/Thumbnail-300x300/facebook-white.png?t=1750161447373"><img src="https://sampanews.sp.gov.br/documents/24771855/25160874/facebook-white.png/9479f073-7635-32cd-094f-ca53f89d33fe?version=1.0&amp;t=1750161447373" alt="Facebook" data-lfr-editable-id="Facebook" data-lfr-editable-type="image" tabindex="0" data-fileentryid="26457593"></picture></a> <a href="#" target="_blank" rel="noopener noreferrer"> </a><a rel="noopener noreferrer" target="_blank" href="https://twitter.com/prefsp"><picture data-fileentryid="26457576"><source media="(max-width:40px)" srcset="/o/adaptive-media/image/26457576/Preview-1000x0/x-white.png?t=1750161446938"><source media="(max-width:40px) and (min-width:40px)" srcset="/o/adaptive-media/image/26457576/Thumbnail-300x300/x-white.png?t=1750161446938">
18019<img src="https://sampanews.sp.gov.br/documents/24771855/25160874/x-white.png/5d0e454f-1c52-3e70-e906-1c782ed7a36d?version=1.0&amp;t=1750161446938" alt="X (Twitter)" data-lfr-editable-id="X (Twitter)" data-lfr-editable-type="image" tabindex="0" data-fileentryid="26457576"></picture></a> <a href="#" target="_blank" rel="noopener noreferrer"> </a><a rel="noopener noreferrer" target="_blank" href="https://www.youtube.com/prefeiturasaopaulo"><picture data-fileentryid="26457559"><source media="(max-width:40px)" srcset="/o/adaptive-media/image/26457559/Preview-1000x0/youtube-white.png?t=1750161446597"><source media="(max-width:40px) and (min-width:40px)" srcset="/o/adaptive-media/image/26457559/Thumbnail-300x300/youtube-white.png?t=1750161446597"><img src="https://sampanews.sp.gov.br/documents/24771855/25160874/youtube-white.png/a1726933-d532-ae73-9f7d-4ff01c427a67?version=1.0&amp;t=1750161446597" alt="YouTube" data-lfr-editable-id="YouTube" data-lfr-editable-type="image" tabindex="0" data-fileentryid="26457559"></picture></a> <a href="#" target="_blank" rel="noopener noreferrer"> </a><a rel="noopener noreferrer" target="_blank" href="https://www.linkedin.com/company/cidade-de-sao-paulo/"><picture data-fileentryid="26457542"><source media="(max-width:40px)" srcset="/o/adaptive-media/image/26457542/Preview-1000x0/linkedin-white.png?t=1750161446196"><source media="(max-width:40px) and (min-width:40px)" srcset="/o/adaptive-media/image/26457542/Thumbnail-300x300/linkedin-white.png?t=1750161446196"><img src="https://sampanews.sp.gov.br/documents/24771855/25160874/linkedin-white.png/df01a457-dfef-1749-3c33-a553bd222984?version=1.0&amp;t=1750161446196" alt="LinkedIn" data-lfr-editable-id="LinkedIn" data-lfr-editable-type="image" tabindex="0" data-fileentryid="26457542"></picture></a> <a href="#" target="_blank" rel="noopener noreferrer"> </a><a rel="noopener noreferrer" target="_blank" href="https://www.tiktok.com/@prefsp"><picture data-fileentryid="26457525"><source media="(max-width:40px)" srcset="/o/adaptive-media/image/26457525/Preview-1000x0/tiktio-white.png?t=1750161445875"><source media="(max-width:40px) and (min-width:40px)" srcset="/o/adaptive-media/image/26457525/Thumbnail-300x300/tiktio-white.png?t=1750161445875"><img src="https://sampanews.sp.gov.br/documents/24771855/25160874/tiktio-white.png/1839d1b0-c830-d9cd-774a-491b83fcb26c?version=1.0&amp;t=1750161445875" alt="TikTok" data-lfr-editable-id="TikTok" data-lfr-editable-type="image" tabindex="0" data-fileentryid="26457525"></picture></a>
18020       </div>
18021      </div>
18022     </div>
18023    </div>
18024    <div class="col col-lg-8 col-sm-12 col-12 col-md-8"></div>
18025   </div>
18026  </div>
18027  <div class="lfr-layout-structure-item-basic-component-paragraph lfr-layout-structure-item-2314d530-f758-24d2-1905-25772952756d " data-layout-structure-item-id="2314d530-f758-24d2-1905-25772952756d">
18028   <div id="fragment-2626a3fe-c3ae-ce8b-1036-c7698243b8f7">
18029    <div class="clearfix component-paragraph text-break" data-lfr-editable-id="element-text" data-lfr-editable-type="rich-text">© COPYRIGHT 2025, Prefeitura Municipal de São Paulo, Viaduto do Chá, 15 - Centro - CEP: 01002-020</div>
18030   </div>
18031   <style>.component-paragraph img {
18032	max-width: 100%;
18033}</style>
18034  </div>
18035 </div>
18036</div>
18037<div class="lfr-layout-structure-item-hand-talk lfr-layout-structure-item-ef5f7ea5-1f45-7376-416f-03a425189823 " data-layout-structure-item-id="ef5f7ea5-1f45-7376-416f-03a425189823">
18038 <div id="fragment-efe79b2e-3ee7-47da-9dc6-207310c7e5b4">
18039  
18039<script src="https://plugin.handtalk.me/web/latest/handtalk.min.js"></script>
18039
18040  <div class="psp-handTalk-plugin alert alert-primary w-100 page-editor-only" role="alert">
18041   <h2 class="psp-heading psp-heading--size-4 text-uppercase font-weight-bold">HAND TALK</h2>
18042   <p>Clique neste componente para ter acesso as configurações do plugin Hand Talk</p>
18043  </div>
18044 </div>
18045 
18045<script type="module">const configuration = {"sideMobile":"right","side":"right","buttonColor":"a11yColorMain","highContrast":false,"mobileEnabled":true,"language":"ptBR-bzs","avatar":"HUGO","textEnabled":true,"alignAsDesktop":true,"align":"default","opacity":100,"alignMobile":"default"}; const fragmentElement = document.querySelector('#fragment-efe79b2e-3ee7-47da-9dc6-207310c7e5b4'); const fragmentElementId = 'fragment-efe79b2e-3ee7-47da-9dc6-207310c7e5b4'; const fragmentEntryLinkNamespace = 'fayq'; const fragmentNamespace = 'fayq'; const layoutMode = 'view';// Token estático - substitua pelo seu token real
18046const HANDTALK_TOKEN = "aa1f4871439ba18dabef482aae5fd934";
18047
18048let ht = new HT({
18049	//general
18050	token: HANDTALK_TOKEN, // Token agora é estático
18051	avatar: configuration.avatar,
18052	textEnabled: configuration.textEnabled,
18053
18054	//mobile
18055	mobileEnabled: configuration.mobileEnabled,
18056	mobileConfig: {
18057		align: configuration.alignAsDesktop ? configuration.align : configuration.alignMobile,
18058		side:  configuration.alignAsDesktop ? configuration.side : configuration.sideMobile,
18059		opacity: configuration.opacity,
18060		highContrast: configuration.highContrast,
18061		colorButton: configuration.colorButton,
18062	},
18063	maxTextSize: 500,
18064	//styles
18065	align: configuration.align,
18066	side: configuration.side,
18067	opacity: configuration.opacity,
18068	highContrast: configuration.highContrast,
18069	colorButton: configuration.colorButton,
18070	parentElement: document.querySelector("body")
18071});
18072
18073if(document.querySelector(".has-edit-mode-menu")){
18074  fragmentElement.querySelector(".psp-handTalk-plugin").classList.remove("d-none");
18075};</script>
18075
18076</div>
18077<div class="lfr-layout-structure-item-atualiza--o-din-mica-de-cores-e-fonte lfr-layout-structure-item-7cb7f005-b2e8-496f-a9f6-a1fe16a5b4af " data-layout-structure-item-id="7cb7f005-b2e8-496f-a9f6-a1fe16a5b4af">
18078 <div id="fragment-e7cd5922-c75d-ff87-6c1d-370c896d7f3a">
18079  <div></div>
18080 </div>
18081 <style>@import url('https://fonts.googleapis.com/css2?family=Lora:ital,wght@0,400..700;1,400..700&family=Nunito+Sans:ital,opsz,wght@0,6..12,200..1000;1,6..12,200..1000&display=swap');
18082
18083body, h1, h2, h3, h4, h5, a  {
18084font-family: "lora", sans-serif !important;  
18085}
18086  
18087p, span, strong, i, b, button, p > a {
18088font-family: "Nunito Sans", sans-serif !important;  
18089}
18090
18091.logo-section span {
18092font-family: "lora", sans-serif !important;  	
18093}</style>
18094 
18094<script type="module">const configuration = {}; const fragmentElement = document.querySelector('#fragment-e7cd5922-c75d-ff87-6c1d-370c896d7f3a'); const fragmentElementId = 'fragment-e7cd5922-c75d-ff87-6c1d-370c896d7f3a'; const fragmentEntryLinkNamespace = 'rykv'; const fragmentNamespace = 'rykv'; const layoutMode = 'view';(() => {
18095  // Mapeamento de categorias e cores
18096  const colors = {
18097    animais: "#bea8c2",
18098    "meio ambiente": "#4CAF50",
18099    serviços: "#CDDC39",
18100    servicos: "#CDDC39",
18101    mobilidade: "#907895",
18102    transporte: "#907895",
18103    educação: "#A4D0D1",
18104    educacao: "#A4D0D1",
18105    "urbanismo e infraestrutura": "#795548",
18106		urbanismo: "#795548",
18107    cultura: "#BC9C87",
18108    infraestrutura: "#795548",
18109    saúde: "#5084C1",
18110    saude: "#5084C1",
18111    "assistência social": "#D0BDBE",
18112    "assistencia social": "#D0BDBE",
18113    "trabalho e tecnologia": "#03A9F4",
18114    trabalho: "#03A9F4",
18115    segurança: "#B9D4C5",
18116    seguranca: "#B9D4C5",
18117    "esportes e lazer": "#2854C5",
18118    esportes: "#2854C5",
18119    lazer: "#2854C5",
18120    cidadania: "#EAC452",
18121    habitação: "#DA954B",
18122    habitacao: "#DA954B",
18123    economia: "#78A75A",
18124    "turismo e negócios": "#00BCD4",
18125    "turismo e negocios": "#00BCD4",
18126    turismo: "#00BCD4",
18127    inclusão: "#DA954B",
18128    inclusao: "#DA954B",
18129    zeladoria: "#8D6E63",
18130    artigos: "#795548",
18131    obras: "#795548",
18132		gestão: "#982442",
18133		gestao: "#982442",
18134		"Prefeitura Presente": "#ec6608",
18135  };
18136
18137  const selectors = {
18138    background: [
18139      ".card-image-top-category-tag",
18140      ".card-sidebar-news-geral-text-category-tag",
18141      ".card-news-image-top-vertical-category-text",
18142      ".cil-category-text",
18143      ".sampa-podcast-category",
18144      ".text-category-tag",
18145      ".sp-citcr-category",
18146      ".sp-citcr-category-text",
18147			".destacador-image-top-category-tag",
18148    ].join(","),
18149
18150    border: [
18151      ".card-news-image-top-news-vertical-image",
18152      ".card-image-top-image-container",
18153      ".cil-image",
18154      ".sampa-podcast-thumbnail",
18155      ".sp-citcr-img",
18156			".destacador-image-top-image-wrapper-home",
18157    ].join(","),
18158
18159    underline: ".card-sidebar-news-geral-title-underline",
18160    linkBefore: ".card-sidebar-news-geral-text-link",
18161    listItems: ".sp-citcr-text-summary li",
18162  };
18163
18164  // Cache unificado
18165  const processedElements = new WeakSet();
18166
18167  let timeoutId = null;
18168  let observer = null;
18169  let dynamicStyleSheet = null;
18170  let ruleIndex = 0;
18171
18172  // Função para criar/obter stylesheet dinâmica
18173  function getDynamicStyleSheet() {
18174    if (!dynamicStyleSheet) {
18175      const style = document.createElement("style");
18176      style.id = "category-dynamic-styles";
18177      document.head.appendChild(style);
18178      dynamicStyleSheet = style.sheet;
18179    }
18180    return dynamicStyleSheet;
18181  }
18182
18183  // Função para extrair a primeira categoria
18184  function getFirstCategory(text) {
18185    if (!text) return null;
18186    return text.trim().toLowerCase().split(",")[0].trim();
18187  }
18188
18189  // Função para encontrar categoria em um elemento
18190  function findCategoryForElement(el) {
18191    let parent = el;
18192    for (let i = 0; i < 5; i++) {
18193      const categoryEl = parent.querySelector
18194        ? parent.querySelector(selectors.background)
18195        : null;
18196      if (categoryEl) {
18197        return getFirstCategory(categoryEl.textContent);
18198      }
18199      parent = parent.parentElement;
18200      if (!parent) break;
18201    }
18202    return null;
18203  }
18204
18205  // Função para aplicar cor no ::before
18206  function applyBeforeColor(el, category, prefix = "category") {
18207    const uniqueClass = `${prefix}-${category.replace(
18208      /[^a-z0-9]/g,
18209      "-"
18210    )}-${ruleIndex++}`;
18211    el.classList.add(uniqueClass);
18212
18213    const stylesheet = getDynamicStyleSheet();
18214    const content =
18215      prefix === "category-li" ? 'content: "• "; margin-right: 8px;' : "";
18216    const rule = `.${uniqueClass}::before { ${content} color: ${colors[category]} !important; }`;
18217
18218    try {
18219      stylesheet.insertRule(rule, stylesheet.cssRules.length);
18220    } catch (e) {
18221      // Silently handle errors
18222    }
18223  }
18224
18225  function applyStyles() {
18226    // Apply background colors
18227    document.querySelectorAll(selectors.background).forEach((el) => {
18228      if (processedElements.has(el)) return;
18229
18230      const category = getFirstCategory(el.textContent);
18231      if (category && colors[category]) {
18232        el.style.backgroundColor = colors[category];
18233        el.style.color = "#000000";
18234        processedElements.add(el);
18235      }
18236    });
18237
18238    // Apply borders
18239    document.querySelectorAll(selectors.border).forEach((el) => {
18240      if (processedElements.has(el)) return;
18241
18242      const category = findCategoryForElement(el);
18243      if (category && colors[category]) {
18244        el.style.borderBottom = `6px solid ${colors[category]}`;
18245        processedElements.add(el);
18246      }
18247    });
18248
18249    // Apply underline background
18250    document.querySelectorAll(selectors.underline).forEach((el) => {
18251      if (processedElements.has(el)) return;
18252
18253      const category = findCategoryForElement(el);
18254      if (category && colors[category]) {
18255        el.style.backgroundColor = colors[category];
18256        el.style.setProperty("background-color", colors[category], "important");
18257        processedElements.add(el);
18258      }
18259    });
18260
18261    // Apply color to ::before of link elements
18262    document.querySelectorAll(selectors.linkBefore).forEach((el) => {
18263      if (processedElements.has(el)) return;
18264
18265      const category = findCategoryForElement(el);
18266      if (category && colors[category]) {
18267        applyBeforeColor(el, category, "category-link");
18268        processedElements.add(el);
18269      }
18270    });
18271
18272    // Apply color to ::before of li elements in sp-citcr-text-summary
18273    document.querySelectorAll(selectors.listItems).forEach((li) => {
18274      if (processedElements.has(li)) return;
18275
18276      const category = findCategoryForElement(li);
18277      if (category && colors[category]) {
18278        applyBeforeColor(li, category, "category-li");
18279        processedElements.add(li);
18280      }
18281    });
18282  }
18283
18284  // Função para limpar cache
18285  function clearCache() {
18286    processedElements.clear();
18287  }
18288
18289  // Debounced version
18290  function debouncedApplyStyles() {
18291    if (timeoutId) clearTimeout(timeoutId);
18292    timeoutId = setTimeout(() => {
18293      clearCache();
18294      applyStyles();
18295    }, 150);
18296  }
18297
18298  // Inicializar observer
18299  function initObserver() {
18300    if (observer) observer.disconnect();
18301    observer = new MutationObserver(debouncedApplyStyles);
18302    observer.observe(document.body, {
18303      childList: true,
18304      subtree: true,
18305      attributes: false,
18306      characterData: false,
18307    });
18308  }
18309
18310  // Cleanup
18311  function cleanup() {
18312    if (timeoutId) {
18313      clearTimeout(timeoutId);
18314      timeoutId = null;
18315    }
18316    if (observer) {
18317      observer.disconnect();
18318      observer = null;
18319    }
18320    const styleEl = document.getElementById("category-dynamic-styles");
18321    if (styleEl) {
18322      styleEl.remove();
18323      dynamicStyleSheet = null;
18324    }
18325  }
18326
18327  // Inicialização
18328  if (document.readyState === "loading") {
18329    document.addEventListener("DOMContentLoaded", () => {
18330      applyStyles();
18331      initObserver();
18332    });
18333  } else {
18334    applyStyles();
18335    initObserver();
18336  }
18337
18338  // Event listeners
18339  window.addEventListener("beforeunload", cleanup);
18340  window.addEventListener("popstate", cleanup);
18341
18342  document.addEventListener("visibilitychange", () => {
18343    if (document.hidden) {
18344      cleanup();
18345    } else {
18346      initObserver();
18347    }
18348  });
18349
18350  // Debug function
18351  window.forceApplyStyles = () => {
18352    clearCache();
18353    applyStyles();
18354  };
18355})();
18356;</script>
18356
18357</div>
18358
18359
18360
18361
18362		</div>
18363	
18364	
18365
18366
18367<form action="#" aria-hidden="true" class="hide" id="hrefFm" method="post" name="hrefFm"><span></span><button hidden type="submit">Oculto</button></form>
18368
18369	
18370		</div>
18371
18372	</div>
18373</div>
18374
18375
18376
18377
18378
18379
18380
18381
18382
18383
18384
18385
18386
18387
18388
18389
18390
18391
18392
18393
18394
18395
18396
18397
18398
18399
18400
18401
18402
18403
18404
18405
18406
18407
18408
18409
18410
18411
18412
18413
18414
18415
18416
18417
18418
18419
18420
18421
18422
18423
18424
18425
18426
18427
18428
18429
18430
18431
18432
18433
18434
18435
18436
18437
18438
18439
18440
18441
18442
18443
18444
18445
18446
18447
18448
18449
18450
18451
18452
18453
18454
18455
18456
18457
18458
18459
18460
18461
18462
18463
18464
18465
18466
18467
18468
18469
18470
18471
18472
18473
18474
18475
18476
18477
18478	
18479
18480
18481
18482
18483
18484
18485
18486
18487
18488	
18489
18490
18491
18492
18493
18494
18495
18496
18497
18498<script type="text/javascript">
18499
18500	
18501		
18502		
18503
18504			
18505
18506			
18507		
18508	
18509
18510
18511</script>
18511<script>
18512
18513</script>
18513
18514
18515
18516
18517
18518
18519
18520
18521
18522
18523
18524
18525
18526
18527
18528
18529	
18530
18531	
18532
18533	
18534
18535	
18536
18537	
18538
18539	
18540
18541	
18542
18543
18544
18545
18546
18547
18548
18549
18550
18551
18552
18553
18554
18555	
18555<script type="module">
18556		import {Session} from '/o/frontend-js-web/__liferay__/legacy.js';
18557
18558		if (Liferay.Session && Liferay.Session.destructor) {
18559			Liferay.Session.destructor();
18560		}
18561
18562		Liferay.Session = new Session(
18563			{
18564				autoExtend: true,
18565				redirectOnExpire: false,
18566				redirectUrl: 'https\x3a\x2f\x2fsampanews\x2esp\x2egov\x2ebr\x2fweb\x2fprefeitura-de-sao-paulo\x2f',
18567				rememberMe: false,
18568				sessionLength: 900,
18569				sessionTimeoutOffset: 250,
18570				warningLength: 60
18571			})
18572	</script>
18572
18573
18574
18575<script type="text/javascript">
18576
18577					window.dataLayer = window.dataLayer || [];
18578					function gtag(){dataLayer.push(arguments);}
18579					gtag('js', new Date());
18580					gtag('config', 'GFQF2C97ZC');
18581
18582					
18583
18584					
18585				
18586(function() {var $ = AUI.$;var _ = AUI._;
18587	var onShare = function (data) {
18588		if (window.Analytics) {
18589			Analytics.send('shared', 'SocialBookmarks', {
18590				className: data.className,
18591				classPK: data.classPK,
18592				type: data.type,
18593				url: data.url,
18594			});
18595		}
18596	};
18597
18598	var onDestroyPortlet = function () {
18599		Liferay.detach('socialBookmarks:share', onShare);
18600		Liferay.detach('destroyPortlet', onDestroyPortlet);
18601	};
18602
18603	Liferay.on('socialBookmarks:share', onShare);
18604	Liferay.on('destroyPortlet', onDestroyPortlet);
18605})();
18606(function() {var $ = AUI.$;var _ = AUI._;
18607	var onVote = function (event) {
18608		if (window.Analytics) {
18609			let title = event.contentTitle;
18610
18611			if (!title) {
18612				const dmNode = document.querySelector(
18613					'[data-analytics-file-entry-id="' + event.classPK + '"]'
18614				);
18615
18616				if (dmNode) {
18617					title = dmNode.dataset.analyticsFileEntryTitle;
18618				}
18619			}
18620
18621			Analytics.send('VOTE', 'Ratings', {
18622				className: event.className,
18623				classPK: event.classPK,
18624				externalReferenceCode: event.externalReferenceCode,
18625				ratingType: event.ratingType,
18626				score: event.score,
18627				title,
18628			});
18629		}
18630	};
18631
18632	var onDestroyPortlet = function () {
18633		Liferay.detach('ratings:vote', onVote);
18634		Liferay.detach('destroyPortlet', onDestroyPortlet);
18635	};
18636
18637	Liferay.on('ratings:vote', onVote);
18638	Liferay.on('destroyPortlet', onDestroyPortlet);
18639})();
18640(function() {var $ = AUI.$;var _ = AUI._;
18641	var onDestroyPortlet = function () {
18642		Liferay.detach('messagePosted', onMessagePosted);
18643		Liferay.detach('destroyPortlet', onDestroyPortlet);
18644	};
18645
18646	Liferay.on('destroyPortlet', onDestroyPortlet);
18647
18648	var onMessagePosted = function (event) {
18649		if (window.Analytics) {
18650			const eventProperties = {
18651				className: event.className,
18652				classPK: event.classPK,
18653				commentId: event.commentId,
18654				externalReferenceCode: event.externalReferenceCode,
18655				text: event.text,
18656			};
18657
18658			const blogNode = document.querySelector(
18659				'[data-analytics-asset-id="' + event.classPK + '"]'
18660			);
18661
18662			const dmNode = document.querySelector(
18663				'[data-analytics-file-entry-id="' + event.classPK + '"]'
18664			);
18665
18666			if (blogNode) {
18667				eventProperties.title = blogNode.dataset.analyticsAssetTitle;
18668			}
18669			else if (dmNode) {
18670				eventProperties.title = dmNode.dataset.analyticsFileEntryTitle;
18671			}
18672
18673			Analytics.send('posted', 'Comment', eventProperties);
18674		}
18675	};
18676
18677	Liferay.on('messagePosted', onMessagePosted);
18678})();
18679
18680	function getValueByAttribute(node, attr) {
18681		return (
18682			node.dataset[attr] ||
18683			(node.parentElement && node.parentElement.dataset[attr])
18684		);
18685	}
18686
18687	function sendDocumentDownloadedAnalyticsEvent(anchor) {
18688		var fileEntryId = getValueByAttribute(
18689			anchor,
18690			'analyticsFileEntryId'
18691		);
18692		var title = getValueByAttribute(
18693			anchor,
18694			'analyticsFileEntryTitle'
18695		);
18696		var version = getValueByAttribute(
18697			anchor,
18698			'analyticsFileEntryVersion'
18699		);
18700		var externalReferenceCode = getValueByAttribute(
18701			anchor,
18702			'analyticsExternalReferenceCode'
18703		);
18704
18705		if (fileEntryId) {
18706			Analytics.send('documentDownloaded', 'Document', {
18707				externalReferenceCode,
18708				fileEntryId,
18709				groupId: themeDisplay.getScopeGroupId(),
18710				preview:
18711					!!window._com_liferay_document_library_analytics_isViewFileEntry,
18712				title,
18713				version,
18714			});
18715		}
18716	}
18717
18718	function handleDownloadClick(event) {
18719		if (window.Analytics) {
18720			if (event.target.nodeName.toLowerCase() === 'a') {
18721				sendDocumentDownloadedAnalyticsEvent(
18722					event.target
18723				);
18724			}
18725			else if (
18726				event.target.parentNode &&
18727				event.target.parentNode.nodeName.toLowerCase() === 'a'
18728			) {
18729				sendDocumentDownloadedAnalyticsEvent(
18730					event.target.parentNode
18731				);
18732			}
18733			else {
18734				var target = event.target;
18735				var matchTextContent =
18736					target.textContent &&
18737					target.textContent.toLowerCase() ===
18738						'baixar';
18739				var matchTitle =
18740					target.title && target.title.toLowerCase() === 'download';
18741				var matchAction = target.action === 'download';
18742				var matchLexiconIcon = !!target.querySelector(
18743					'.lexicon-icon-download'
18744				);
18745				var matchLexiconClassName = target.classList.contains(
18746					'lexicon-icon-download'
18747				);
18748				var matchParentTitle =
18749					target.parentNode &&
18750					target.parentNode.title &&
18751					target.parentNode.title.toLowerCase() === 'download';
18752				var matchParentLexiconClassName =
18753					target.parentNode &&
18754					target.parentNode.classList.contains('lexicon-icon-download');
18755
18756				if (
18757					matchTextContent ||
18758					matchTitle ||
18759					matchParentTitle ||
18760					matchAction ||
18761					matchLexiconIcon ||
18762					matchLexiconClassName ||
18763					matchParentLexiconClassName
18764				) {
18765					var selectedFiles = document.querySelectorAll(
18766						'.form .custom-control-input:checked'
18767					);
18768
18769					selectedFiles.forEach(({value}) => {
18770						var selectedFile = document.querySelector(
18771							'[data-analytics-file-entry-id="' + value + '"]'
18772						);
18773
18774						sendDocumentDownloadedAnalyticsEvent(
18775							selectedFile
18776						);
18777					});
18778				}
18779			}
18780		}
18781	}
18782
18783	Liferay.once('destroyPortlet', () => {
18784		document.body.removeEventListener(
18785			'click',
18786			handleDownloadClick
18787		);
18788	});
18789
18790	Liferay.once('portletReady', () => {
18791		document.body.addEventListener(
18792			'click',
18793			handleDownloadClick
18794		);
18795	});
18796
18797
18798	if (window.svg4everybody && Liferay.Data.ICONS_INLINE_SVG) {
18799		svg4everybody(
18800			{
18801				polyfill: true,
18802				validate: function (src, svg, use) {
18803					return !src || !src.startsWith('#');
18804				}
18805			}
18806		);
18807	}
18808
18809(function() {var $ = AUI.$;var _ = AUI._;
18810	Liferay.Util.delegate(
18811		document,
18812		'focusin',
18813		'.portlet',
18814		function(event) {
18815			event.delegateTarget.closest('.portlet').classList.add('open');
18816		}
18817	);
18818
18819	Liferay.Util.delegate(
18820		document,
18821		'focusout',
18822		'.portlet',
18823		function(event) {
18824			event.delegateTarget.closest('.portlet').classList.remove('open');
18825		}
18826	);
18827})();
18828
18829	// <![CDATA[
18830
18831		
18832
18833		Liferay.currentURL = '\x2fweb\x2fsampa-news';
18834		Liferay.currentURLEncoded = '\x252Fweb\x252Fsampa-news';
18835
18836	// ]]>
18837
18838(function() {var $ = AUI.$;var _ = AUI._;
18839	var assetEntryId =
18840		'';
18841
18842	if (assetEntryId) {
18843		window.location.hash = assetEntryId;
18844	}
18845})();
18846
18847	
18848		Liferay.Portlet.register('com_liferay_asset_publisher_web_portlet_AssetPublisherPortlet_INSTANCE_wcya');
18849	
18850
18851	Liferay.Portlet.onLoad(
18852		{
18853			canEditTitle: false,
18854			columnPos: 0,
18855			isAjaxable: true,
18856			isStatic: 'end',
18857			namespacedId: 'p_p_id_com_liferay_asset_publisher_web_portlet_AssetPublisherPortlet_INSTANCE_wcya_',
18858			portletId: 'com_liferay_asset_publisher_web_portlet_AssetPublisherPortlet_INSTANCE_wcya',
18859			refreshURL: '\x2fc\x2fportal\x2frender_portlet\x3fp_l_id\x3d24449\x26p_p_id\x3dcom_liferay_asset_publisher_web_portlet_AssetPublisherPortlet_INSTANCE_wcya\x26p_p_lifecycle\x3d0\x26p_t_lifecycle\x3d0\x26p_p_state\x3dnormal\x26p_p_mode\x3dview\x26p_p_col_id\x3dnull\x26p_p_col_pos\x3dnull\x26p_p_col_count\x3dnull\x26p_p_static\x3d1\x26p_p_isolated\x3d1\x26currentURL\x3d\x252Fweb\x252Fsampa-news',
18860			refreshURLData: {}
18861		}
18862	);
18863
18864
18865	
18866		Liferay.Portlet.register('com_liferay_portal_search_web_search_bar_portlet_SearchBarPortlet_INSTANCE_vbck');
18867	
18868
18869	Liferay.Portlet.onLoad(
18870		{
18871			canEditTitle: false,
18872			columnPos: 0,
18873			isAjaxable: true,
18874			isStatic: 'end',
18875			namespacedId: 'p_p_id_com_liferay_portal_search_web_search_bar_portlet_SearchBarPortlet_INSTANCE_vbck_',
18876			portletId: 'com_liferay_portal_search_web_search_bar_portlet_SearchBarPortlet_INSTANCE_vbck',
18877			refreshURL: '\x2fc\x2fportal\x2frender_portlet\x3fp_l_id\x3d24449\x26p_p_id\x3dcom_liferay_portal_search_web_search_bar_portlet_SearchBarPortlet_INSTANCE_vbck\x26p_p_lifecycle\x3d0\x26p_t_lifecycle\x3d0\x26p_p_state\x3dnormal\x26p_p_mode\x3dview\x26p_p_col_id\x3dnull\x26p_p_col_pos\x3dnull\x26p_p_col_count\x3dnull\x26p_p_static\x3d1\x26p_p_isolated\x3d1\x26currentURL\x3d\x252Fweb\x252Fsampa-news',
18878			refreshURLData: {}
18879		}
18880	);
18881
18882
18883</script>
18883<script type="module">
18884import {InfoItemActionHandler as ComponentModule} from '/o/layout-taglib/__liferay__/render.js';
18885import {PaginationBar as componentModule} from '/o/frontend-taglib-clay/__liferay__/index.js';
18886import {NumericCollectionPaginationPropsTransformer as propsTransformer} from '/o/layout-taglib/__liferay__/render.js';
18887import {render} from '/o/portal-template-react-renderer-impl/__liferay__/index.js';
18888AUI().use(
18889  'liferay-menu',
18890function(A) {
18891{
18892render(componentModule, propsTransformer({"activeDelta":1,"totalItems":2,"componentId":null,"activePage":1,"hasBodyContent":false,"additionalProps":{"collectionId":"2c82e411-64a2-1e3a-2adb-4fdda168d508"},"locale":"{\"country\": \"BR\", \"displayCountry\": \"Brazil\", \"displayLanguage\": \"Portuguese\", \"displayName\": \"Portuguese (Brazil)\", \"displayScript\": \"\", \"displayVariant\": \"\", \"extensionKeys\":[],\"ISO3Country\": \"BRA\", \"ISO3Language\": \"por\", \"language\": \"pt\", \"script\": \"\", \"unicodeLocaleAttributes\":[], \"unicodeLocaleKeys\":[], \"variant\": \"\"}","labels":{"perPageItems":"{0} Itens","selectPerPageItems":"{0} Itens","paginationResults":"Exibindo {0} - {1} de {2} resultados."},"disabledPages":null,"cssClass":"pb-2 pt-3","portletId":null,"showDeltasDropDown":false,"id":null,"deltas":[{"label":10},{"label":20},{"label":30},{"label":50}],"ellipsisBuffer":2}), 'ffon');
18893}
18894{
18895Liferay.component('infoItemActionComponent', new ComponentModule({"executeInfoItemActionURL":"https:\/\/sampanews.sp.gov.br\/c\/portal\/execute_info_item_action?p_l_mode=view&plid=24449","namespace":"","spritemap":"https:\/\/sampanews.sp.gov.br\/o\/dialect-theme\/images\/clay\/icons.svg"}), { destroyOnNavigate: true, portletId: ''});
18896}
18897(function() {
18898var $ = AUI.$;var _ = AUI._;
18899	new Liferay.Menu();
18900
18901	var liferayNotices = Liferay.Data.notices;
18902
18903	for (var i = 0; i < liferayNotices.length; i++) {
18904		Liferay.Util.openToast(liferayNotices[i]);
18905	}
18906
18907})();
18908});
18909
18910</script>
18910
18911
18912
18913
18914
18915
18916
18917
18918
18919
18920<script src="/o/dialect-theme/js/main.(Dqv62sm20Lg).js" type="text/javascript"></script>
18920
18921
18922
18923
18924
18925<script type="module">
18926import {main} from '/o/frontend-js-tooltip-support-web/__liferay__/index.js';
18927{
18928main();
18929}
18930
18931</script>
18931<script type="module">
18932import {main} from '/o/frontend-js-bootstrap-support-web/__liferay__/index.js';
18933{
18934main();
18935}
18936
18937</script>
18937<script type="text/javascript">
18938Liferay.CustomDialogs = {enabled: false};
18939
18940</script>
18940<script>
18941
18942</script>
18942<script type="module">
18943import {runThirdPartyCookiesInterval} from '/o/cookies-banner-web/__liferay__/index.js';
18944{
18945runThirdPartyCookiesInterval();
18946}
18947
18948</script>
18948
18949
18950
18951
18952
18953
18954
18955
18956<div aria-label="banner cookies" class="cookies-banner cookies-banner-bottom" role="dialog">
18957	
18958
18959
18960
18961
18962
18963
18964
18965
18966
18967
18968
18969
18970
18971
18972
18973
18974
18975
18976
18977
18978
18979
18980
18981
18982
18983
18984
18985
18986
18987
18988
18989
18990
18991
18992
18993
18994
18995
18996
18997
18998
18999
19000
19001
19002
19003
19004
19005
19006
19007
19008
19009
19010
19011
19012
19013
19014
19015
19016
19017
19018
19019
19020
19021
19022
19023
19024
19025
19026
19027	
19028
19029	<div class="portlet-boundary portlet-boundary_com_liferay_cookies_banner_web_portlet_CookiesBannerPortlet_  portlet-static portlet-static-end portlet-borderless portlet-cookies-banner " id="p_p_id_com_liferay_cookies_banner_web_portlet_CookiesBannerPortlet_">
19030		<span id="p_com_liferay_cookies_banner_web_portlet_CookiesBannerPortlet"></span>
19031
19032
19033
19034
19035	
19036
19037	
19038		
19039		
19040			
19041
19042
19043
19044
19045
19046
19047
19048
19049
19050
19051
19052
19053
19054
19055
19056
19057
19058
19059
19060
19061
19062
19063
19064<div class="container-fluid container-fluid-max-xl container-view">
19065	<div class="row">
19066		<div class="autofit-row autofit-padded-no-gutters autofit-row-center autofit-float-sm-down px-2 px-md-0">
19067			<div class="autofit-col autofit-col-expand">
19068				<p class="mb-2 text-5 text-weight-semi-bold">
19069					A Prefeitura de São Paulo valoriza sua privacidade!
19070				</p>
19071
19072				<p class="mb-0">
19073					Em nosso site, utilizamos cookies, que são arquivos salvos no seu computador para auxiliar a coletar informações sobre suas preferências e sobre outras páginas da internet visitadas por você a fim de otimizar sua experiência de navegação em nosso site, apresentando conteúdos personalizados. Ao selecionar &#34;Aceitar todos&#34;, você consente com a utilização de cookies.
19074
19075					<a class="" href="https://prefeitura.sp.gov.br/web/controladoria_geral/w/acesso-%C3%A0-prote%C3%A7%C3%A3o-de-dados-pessoais" >Saiba mais</a>
19076				</p>
19077			</div>
19078
19079			<div class="autofit-col">
19080				<button class="btn btn-sm btn-link" id="_com_liferay_cookies_banner_web_portlet_CookiesBannerPortlet_configurationButton" type="button" >Configuração</button>
19081			</div>
19082
19083			<div class="autofit-col">
19084				<button class="btn btn-sm btn-secondary" id="_com_liferay_cookies_banner_web_portlet_CookiesBannerPortlet_acceptAllButton" type="button" >Aceitar tudo</button>
19085			</div>
19086
19087			
19088				<div class="autofit-col">
19089					<button class="btn btn-sm btn-secondary" id="_com_liferay_cookies_banner_web_portlet_CookiesBannerPortlet_declineAllButton" type="button" >Recusar tudo</button>
19090				</div>
19091			
19092		</div>
19093	</div>
19094</div>
19095
19096<script type="module">
19097import {CookiesBanner as ComponentModule} from '/o/cookies-banner-web/__liferay__/index.js';
19098{
19099Liferay.component('CookiesBanner', new ComponentModule({"configurationURL":"https:\/\/sampanews.sp.gov.br\/home?p_p_id=com_liferay_cookies_banner_web_portlet_CookiesBannerConfigurationPortlet&p_p_lifecycle=0&p_p_state=pop_up&_com_liferay_cookies_banner_web_portlet_CookiesBannerConfigurationPortlet_mvcPath=%2Fcookies_banner_configuration%2Fview.jsp&p_p_auth=EmQzbLXW","consentRenewalPeriod":12,"optionalConsentCookieTypeNames":["CONSENT_TYPE_FUNCTIONAL","CONSENT_TYPE_PERFORMANCE","CONSENT_TYPE_PERSONALIZATION"],"spritemap":"https:\/\/sampanews.sp.gov.br\/o\/dialect-theme\/images\/clay\/icons.svg","configurationNamespace":"com_liferay_cookies_banner_web_portlet_CookiesBannerConfigurationPortlet","modifiedDate":"1789563948751","namespace":"_com_liferay_cookies_banner_web_portlet_CookiesBannerPortlet_","requiredConsentCookieTypeNames":["CONSENT_TYPE_NECESSARY"],"includeDeclineAllButton":true,"title":"Configuração de cookie"}), { destroyOnNavigate: true, portletId: 'com_liferay_cookies_banner_web_portlet_CookiesBannerPortlet'});
19100}
19101
19102</script>
19102
19103		
19104	
19105
19106
19107
19108
19109
19110
19111
19112	</div>
19113
19114
19115
19116
19117
19118
19119
19120</div>
19120<script data-senna-track="temporary" type="text/javascript"  src="https://plugin.handtalk.me/web/latest/handtalk.min.js"></script>
19120<script data-senna-track="temporary" type="text/javascript"  src="/o/psp-js/main.js"></script>
19120
19121</body>
19122
19123</html>
19124		
19125	
19126

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.