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&t=1754334121435&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&t=1754334121435&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&t=1754334121435&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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> </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&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&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&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&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&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&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 "Aceitar todos", 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.