1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <meta charset="utf-8"/> 5 <link href="https://media.base44.com/images/public/6a12368b6290c0485dac145c/06c994b69_Logov2InaBravo.png" rel="icon" type="image/svg+xml"/> 6 <meta content="width=device-width, initial-scale=1.0" name="viewport"/> 7 <link href="/manifest.json" rel="manifest"/> 8 <title> 9 Portfolio | Ina Bravo 10 </title> 11 <meta content="Portfolio on Ina Bravo. A sophisticated digital space for creative portfolios, professional showcases, a." name="description"/> 12 <meta content="Ina Bravo" name="author"/> 13 <!-- Open Graph / Social Sharing --> 14 <meta content="website" property="og:type"/> 15 <meta content="Portfolio | Ina Bravo" property="og:title"/> 16 <meta content="Portfolio on Ina Bravo. A sophisticated digital space for creative portfolios, professional showcases, a." property="og:description"/> 17 <meta content="https://media.base44.com/images/public/6a12368b6290c0485dac145c/cac6c747f_Logov2InaBravo.png/v1/fill/w_1200,h_630/cac6c747f_Logov2InaBravo.png" property="og:image"/> 18 <meta content="1024" property="og:image:width"/> 19 <meta content="819" property="og:image:height"/> 20 <meta content="Ina Bravo in conversation about brand-artist relations" property="og:image:alt"/> 21 <meta content="Ina Bravo" property="article:author"/> 22 <meta content="2026-06" property="article:published_time"/> 23 <meta content="Industry Insight" property="article:section"/> 24 <meta content="https://inabravo.com/portfolio" property="og:url"/> 25 <!-- Twitter Card --> 26 <meta content="summary_large_image" name="twitter:card"/> 27 <meta content="Portfolio | Ina Bravo" name="twitter:title"/> 28 <meta content="Portfolio on Ina Bravo. A sophisticated digital space for creative portfolios, professional showcases, a." name="twitter:description"/> 29 <meta content="https://media.base44.com/images/public/6a12368b6290c0485dac145c/cac6c747f_Logov2InaBravo.png/v1/fill/w_1200,h_630/cac6c747f_Logov2InaBravo.png" name="twitter:image"/> 30
30<script crossorigin="" src="/assets/index-CKwNm78i.js" type="module"> 31 </script>
31 32 <link crossorigin="" href="/assets/index-BAOGyvKn.css" rel="stylesheet"/> 33
33<script type="module"> 34 if (window.self === window.top) { 35 let lastPath = ""; 36 function getPageNameFromPath(path) { 37 const segments = path.split("/").filter(Boolean); 38 return segments[0] || null; 39 } 40 function trackPageView() { 41 const path = window.location.pathname; 42 if (path === lastPath) return; 43 lastPath = path; 44 const pageName = getPageNameFromPath(path) || "home"; 45 const appId = "6a12368b6290c0485dac145c"; 46 if (!appId) return; 47 fetch(`/api/app-logs/${appId}/log-user-in-app/${pageName}`, { 48 method: "POST", 49 }).catch(() => {}); 50 } 51 const originalPushState = history.pushState.bind(history); 52 history.pushState = function (...args) { 53 originalPushState(...args); 54 trackPageView(); 55 }; 56 const originalReplaceState = history.replaceState.bind(history); 57 history.replaceState = function (...args) { 58 originalReplaceState(...args); 59 trackPageView(); 60 }; 61 window.addEventListener("popstate", trackPageView); 62 trackPageView(); 63} 64 </script>
64 65 <meta content="Ina Bravo" property="og:site_name"/> 66 <meta content="https://inabravo.com/portfolio" name="twitter:url"/> 67
67<script> 68 (function () { 69 var titles = {"/": "Ina Bravo", "/partners": "Partners | Ina Bravo", "/services": "Services | Ina Bravo", "/speaking": "Speaking | Ina Bravo", "/portfolio": "Portfolio | Ina Bravo", "/artist-relations": "Article | Ina Bravo", "/home": "Ina Bravo"}; 70 // PascalCase boundaries -> "-", mirroring _PASCAL_BOUNDARY_RE without lookbehind 71 // (old Safari fails to PARSE a lookbehind, taking the whole script down). 72 var dashed = function (s) { 73 return s.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/([A-Z])([A-Z][a-z])/g, "$1-$2"); 74 }; 75 var decode = function (s) { 76 // A %2F inside ONE segment must not become a structural separator: /blog/foo%2Fbar is a 77 // dynamic slug, and letting it split would match a static /blog/foo/bar and write ITS title. 78 try { var d = decodeURIComponent(s); return d.indexOf("/") < 0 ? d : s; } catch (e) { return s; } 79 }; 80 var segments = function (path) { return path.split("/").filter(Boolean).map(decode); }; 81 var norm = function (path) { 82 var parts = segments(path).map(function (s) { return dashed(s).toLowerCase(); }); 83 return parts.length ? "/" + parts.join("/") : "/"; 84 }; 85 var lastPath = location.pathname, written = document.title, on = true; 86 var sync = function () { 87 // Path only: a hash/query change is the same page, and the SDK strips its own auth 88 // params with replaceState -- neither must clobber a server-rendered title in place. 89 if (!on || location.pathname === lastPath) return; 90 lastPath = location.pathname; 91 if (document.title !== written) { on = false; return; } 92 // Write ONLY a title the map proves. An unmapped path is a dynamic route (/blog/:slug) the 93 // map cannot carry, and writing a placeholder there is destructive, not merely vague: the 94 // prerender worker runs no setUserAgent, so its capture browser reads as human and executes 95 // this script, and coordinator.js's settle wait explicitly tolerates a full navigation -- 96 // a redirect landing on an unmapped path would bake the placeholder into the stored 97 // snapshot. Leaving the title alone degrades to today's behavior instead. 98 // Exact lookup only. A dash-stripped retry here would let a genuinely different /set-up 99 // claim /setup: the map carries a dash-free key only where a PascalCase boundary put the 100 // dashes there, and the client cannot tell the two apart. The map emits every reachable 101 // shape per segment instead (_client_url_variants). 102 var title = titles[norm(location.pathname)]; 103 if (title === undefined) return; 104 document.title = title; 105 // Re-read: the setter stores verbatim but the getter strips and collapses whitespace, so 106 // keeping the assigned string would make the next sync() read our own write as the app's. 107 written = document.title; 108 }; 109 var wrap = function (fn) { 110 // The history entry is already pushed by the time sync() runs, so a throw here would 111 // surface inside the host app's router and break navigation. This is injected into apps 112 // we cannot test, so it swallows rather than trusting the trace. 113 return function () { 114 var r = fn.apply(this, arguments); 115 try { sync(); } catch (e) {} 116 return r; 117 }; 118 }; 119 history.pushState = wrap(history.pushState); 120 history.replaceState = wrap(history.replaceState); 121 window.addEventListener("popstate", sync); 122})(); 123 </script>
123 124 <meta content="yes" name="mobile-web-app-capable"/> 125 <meta content="black" name="apple-mobile-web-app-status-bar-style"/> 126 <meta content="Ina Bravo" name="apple-mobile-web-app-title"/> 127 <link href="https://inabravo.com/portfolio" rel="canonical"/> 128
128<script data-seo-source="builder" type="application/ld+json"> 129 {"name": "Ina Bravo", "@context": "https://schema.org", "@type": "WebSite", "url": "https://inabravo.com"} 130 </script>
130 131
131<script data-seo-source="builder" type="application/ld+json"> 132 {"name": "Ina Bravo", "logo": "https://media.base44.com/images/public/6a12368b6290c0485dac145c/7cdf2e534_logo.png", "@context": "https://schema.org", "@type": "Organization", "url": "https://inabravo.com"} 133 </script>
133 134
134<script data-seo-source="builder" type="application/ld+json"> 135 {"@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [{"@type": "ListItem", "position": 1, "name": "Home", "item": "https://inabravo.com/"}, {"@type": "ListItem", "position": 2, "name": "Portfolio | Ina Bravo", "item": "https://inabravo.com/portfolio"}]} 136 </script>
136 137 </head> 138 <body> 139 <div id="root"> 140 <div data-seo-source="builder" id="seo-snapshot" style="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;"> 141 <main> 142 <header> 143 <h1> 144 Portfolio | Ina Bravo 145 </h1> 146 <p> 147 Portfolio on Ina Bravo. A sophisticated digital space for creative portfolios, professional showcases, a. 148 </p> 149 </header> 150 <nav aria-label="Pages"> 151 <h2> 152 Pages 153 </h2> 154 <ul> 155 <li> 156 <a href="/"> 157 Home 158 </a> 159 </li> 160 <li> 161 <a href="/partners"> 162 Partners 163 </a> 164 â Partners on Ina Bravo. A sophisticated digital space for creative portfolios, professional showcases, a. 165 </li> 166 <li> 167 <a href="/services"> 168 Services 169 </a> 170 â Services on Ina Bravo. A sophisticated digital space for creative portfolios, professional showcases, a. 171 </li> 172 <li> 173 <a href="/speaking"> 174 Speaking 175 </a> 176 â Speaking on Ina Bravo. A sophisticated digital space for creative portfolios, professional showcases, a. 177 </li> 178 <li> 179 <a href="/portfolio"> 180 Portfolio 181 </a> 182 â Portfolio on Ina Bravo. A sophisticated digital space for creative portfolios, professional showcases, a. 183 </li> 184 <li> 185 <a href="/artist-relations"> 186 Article 187 </a> 188 â Article on Ina Bravo. A sophisticated digital space for creative portfolios, professional showcases, a. 189 </li> 190 </ul> 191 </nav> 192 </main> 193 </div> 194 </div> 195 </body> 196</html>
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.