{"id":58310,"date":"2026-08-20T15:48:35","date_gmt":"2026-08-20T15:48:35","guid":{"rendered":"http:\/\/trueomni.com\/?page_id=58310"},"modified":"2026-08-20T15:49:10","modified_gmt":"2026-08-20T15:49:10","slug":"rosen-hotels","status":"publish","type":"page","link":"https:\/\/trueomni.com\/french\/rosen-hotels\/","title":{"rendered":"RosenHotels"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"58310\" class=\"elementor elementor-58310\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bf761dd e-con e-atomic-element e-flexbox-base e-default-div e-eaaadfb \" data-id=\"bf761dd\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"bf761dd\" data-e-type=\"e-flexbox\" data-id=\"bf761dd\">\n    \t\t<div class=\"elementor-element elementor-element-5627ff1 elementor-widget elementor-widget-html\" data-id=\"5627ff1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"en\" data-theme=\"light\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<title>Rosen Hotels &amp; Resorts \u00b7 TrueImpact \u00b7 Digital Guest Journey<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;600;700;800;900&display=swap\" rel=\"stylesheet\">\n<style>\n:root{\n  \/* ---- TrueOmni Design System tokens (blue #0EA1DC \u00b7 ink #0A0A0A \u00b7 bg #F5F7FA \u00b7 Inter) ---- *\/\n  --navy:#0D1A2D; --navy-2:#0A1420; --azure:#0EA1DC; --azure-d:#0B8AC4;\n  --deep:#0B8AC4; --ink:#0A0A0A; --slate:#6B7280; --amber:#C2641F;\n  \/* ---- validated chart palette (dataviz skill; passes CVD + normal-vision gates) ---- *\/\n  --s-hotels:#0EA1DC; --s-dining:#EB6834; --s-attractions:#008300; --s-events:#E87BA4;\n  --s-direct:#0EA1DC; --s-influenced:#0B8AC4; --s-local:#0EA1DC; --s-state:#1BAF7A;\n  --good:#0ca30c; --warn:#C2641F;\n  \/* ---- surfaces \/ ink (light) ---- *\/\n  --bg:#F5F7FA; --surface:#ffffff; --surface-2:#F1F5F9; --line:#E5E7EB;\n  --text:#0A0A0A; --text-2:#6B7280; --muted:#9CA3AF; --grid:#E5E7EB;\n  --tint:#E0F2FE;\n  --shadow:0 1px 2px rgba(13,26,45,.06),0 8px 24px rgba(13,26,45,.06);\n  --shadow-lg:0 24px 60px rgba(13,26,45,.16);\n  --radius:16px; --radius-sm:11px;\n  --font:'Inter','Segoe UI',system-ui,-apple-system,Roboto,Helvetica,Arial,sans-serif;\n}\nhtml[data-theme=\"dark\"]{\n  --navy:#0D1A2D; --azure:#3BB8ED; --deep:#0B8AC4;\n  --s-hotels:#38b6ec; --s-dining:#f0854f; --s-attractions:#37a637; --s-events:#e493b5;\n  --s-direct:#38b6ec; --s-influenced:#2f77c4; --s-local:#38b6ec; --s-state:#22c48a;\n  --bg:#0a1420; --surface:#101d2e; --surface-2:#0c1826; --line:#1e2f45;\n  --text:#eaf1f8; --text-2:#a9b7c8; --muted:#6f8098; --grid:#182636;\n  --shadow:0 1px 2px rgba(0,0,0,.4),0 10px 30px rgba(0,0,0,.35);\n  --shadow-lg:0 24px 60px rgba(0,0,0,.55);\n}\n*{box-sizing:border-box;margin:0;padding:0}\nhtml,body{background:var(--bg);color:var(--text);font-family:var(--font);-webkit-font-smoothing:antialiased;scroll-behavior:smooth}\nbody{font-size:15px;line-height:1.5}\na{color:inherit;text-decoration:none}\nbutton{font-family:inherit;cursor:pointer;border:0;background:none;color:inherit}\n.tnum{font-variant-numeric:tabular-nums}\n\n\/* ---------- Top bar ---------- *\/\n.topbar{position:sticky;top:0;z-index:50;background:linear-gradient(100deg,var(--navy) 0%,var(--navy-2) 100%);color:#fff;box-shadow:0 6px 20px rgba(10,26,49,.28)}\n.topbar-inner{max-width:1320px;margin:0 auto;padding:12px 24px;display:flex;align-items:center;gap:18px}\n.brand{display:flex;align-items:center;gap:11px;font-weight:700;letter-spacing:.2px}\n.brand .mark{width:30px;height:30px;border-radius:8px;background:linear-gradient(135deg,var(--azure),#0f6fa0);display:grid;place-items:center;box-shadow:0 4px 14px rgba(28,156,216,.45)}\n.brand .mark svg{width:17px;height:17px}\n.brand .name{font-size:16px}.brand .name b{color:var(--azure)}\n.brand .sub{font-size:10px;font-weight:600;letter-spacing:1.6px;color:#9fc7de;text-transform:uppercase;margin-top:1px;white-space:nowrap}\n.brand{flex:none}\n.segset button{white-space:nowrap}\n@media (max-width:1280px){.brand .sub{display:none}.live{display:none}}\n.destpick{display:flex;align-items:center;gap:7px;background:rgba(255,255,255,.11);border:1px solid rgba(255,255,255,.14);border-radius:9px;padding:6px 10px;color:#dceaf5}\n.destpick svg{width:15px;height:15px;flex:none;color:var(--azure)}\n.destpick select{background:transparent;border:0;color:#fff;font-family:inherit;font-size:13px;font-weight:700;outline:none;cursor:pointer;max-width:190px}\n.destpick select option{color:#12202f}\n.sample{font-size:10px;font-weight:800;letter-spacing:1.2px;color:#ffd79a;background:rgba(194,100,31,.28);border:1px solid rgba(255,183,120,.4);border-radius:6px;padding:4px 8px;white-space:nowrap}\n@media (max-width:1180px){.sample{display:none}}\n.live{display:flex;align-items:center;gap:7px;font-size:12px;color:#bfe0f0;font-weight:600;margin-left:2px}\n.dot{width:8px;height:8px;border-radius:50%;background:#3ee08a;box-shadow:0 0 0 0 rgba(62,224,138,.7);animation:pulse 2s infinite}\n@keyframes pulse{0%{box-shadow:0 0 0 0 rgba(62,224,138,.55)}70%{box-shadow:0 0 0 9px rgba(62,224,138,0)}100%{box-shadow:0 0 0 0 rgba(62,224,138,0)}}\n.spacer{flex:1}\n.controls{display:flex;align-items:center;gap:9px}\n.segset{display:flex;background:rgba(255,255,255,.09);border-radius:10px;padding:3px}\n.segset button{font-size:12.5px;font-weight:600;color:#c5d6e6;padding:6px 12px;border-radius:7px;transition:.15s}\n.segset button.on{background:var(--azure);color:#04141f;box-shadow:0 2px 8px rgba(28,156,216,.4)}\n.icon-btn{width:36px;height:36px;border-radius:9px;background:rgba(255,255,255,.1);display:grid;place-items:center;color:#dceaf5;transition:.15s}\n.icon-btn:hover{background:rgba(255,255,255,.2)}\n.icon-btn svg{width:18px;height:18px}\n.cta{background:var(--azure);color:#04141f;font-weight:700;font-size:13px;padding:9px 15px;border-radius:9px;display:flex;align-items:center;gap:7px;transition:.15s}\n.cta:hover{background:#33abe0;transform:translateY(-1px)}\n.cta svg{width:15px;height:15px}\n\n\/* ---------- Breadcrumb \/ subnav ---------- *\/\n.wrap{max-width:1320px;margin:0 auto;padding:22px 24px 60px}\n.crumbs{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--text-2);margin-bottom:16px;flex-wrap:wrap}\n.crumbs a{color:var(--azure);font-weight:600}\n.crumbs .sep{color:var(--muted)}\n.pagehead{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin-bottom:6px;flex-wrap:wrap}\n.pagehead h1{font-size:27px;letter-spacing:-.4px;line-height:1.15}\n.pagehead .eyebrow{font-size:11.5px;font-weight:700;letter-spacing:2px;text-transform:uppercase;color:var(--azure);margin-bottom:5px}\n.pagehead .meta{font-size:12.5px;color:var(--muted);text-align:right}\n\n\/* ---------- Cards \/ grid ---------- *\/\n.grid{display:grid;gap:16px}\n.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px 18px 16px}\n.card.pad0{padding:0;overflow:hidden}\n.card h3{font-size:13px;font-weight:700;letter-spacing:.2px;display:flex;align-items:center;gap:8px}\n.card h3 .hint{font-size:11px;color:var(--muted);font-weight:600}\n.card .ch-sub{font-size:12px;color:var(--text-2);margin-top:2px}\n.card-h{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:14px}\n\n\/* KPI hero band *\/\n.kpis{display:grid;grid-template-columns:1.5fr 1fr 1fr 1fr;gap:16px}\n.kpi{position:relative;overflow:hidden}\n.kpi.hero{background:linear-gradient(140deg,var(--navy),#123056 90%);color:#fff;border:0}\n.kpi .k-label{font-size:12px;color:var(--text-2);font-weight:600;display:flex;align-items:center;gap:6px}\n.kpi.hero .k-label{color:#a8c6db}\n.kpi .k-val{font-size:34px;font-weight:700;letter-spacing:-1px;margin-top:7px;line-height:1}\n.kpi.hero .k-val{font-size:44px}\n.kpi .k-val .cur{font-size:.62em;opacity:.7;font-weight:600;vertical-align:.14em;margin-right:1px}\n.kpi .k-delta{font-size:12.5px;font-weight:700;margin-top:9px;display:inline-flex;align-items:center;gap:5px}\n.k-delta.up{color:var(--good)} .kpi.hero .k-delta.up{color:#5ef0a5}\n.kpi .k-foot{font-size:11.5px;color:var(--muted);margin-top:8px}\n.kpi.hero .k-foot{color:#8fb2ca}\n.spark{position:absolute;right:14px;bottom:12px;opacity:.9}\n.kpi.hero .glow{position:absolute;right:-40px;top:-40px;width:180px;height:180px;background:radial-gradient(circle,rgba(28,156,216,.5),transparent 70%);pointer-events:none}\n\n.row-2{grid-template-columns:1.35fr 1fr}\n.row-3{grid-template-columns:repeat(3,1fr)}\n.row-map{grid-template-columns:1.15fr .85fr}\n\n\/* Map *\/\n.mapwrap{position:relative;padding:8px}\n.mapwrap svg{width:100%;height:auto;display:block}\n.mk{cursor:pointer;transition:.15s}\n.mk circle.hit{fill:transparent}\n.mk .pin{transition:.15s;stroke:var(--surface);stroke-width:2}\n.mk:hover .pin,.mk.active .pin{filter:brightness(1.08)}\n.mk:hover .ring,.mk.active .ring{opacity:1}\n.mk .ring{fill:none;stroke:var(--azure);stroke-width:2;opacity:0;transition:.15s}\n.mk text{font-size:9.5px;font-weight:700;fill:var(--text);paint-order:stroke;stroke:var(--surface);stroke-width:3px;stroke-linejoin:round}\n.ca-outline{fill:var(--surface-2);stroke:var(--line);stroke-width:1.5}\nhtml[data-theme=\"dark\"] .ca-outline{fill:#0c1c2e;stroke:#20344c}\n\n\/* Location list *\/\n.loclist{display:flex;flex-direction:column;gap:2px}\n.locrow{display:grid;grid-template-columns:1fr auto auto;align-items:center;gap:12px;padding:11px 12px;border-radius:11px;cursor:pointer;transition:.13s;border:1px solid transparent}\n.locrow:hover{background:var(--surface-2);border-color:var(--line);transform:translateX(2px)}\n.locrow .lr-name{font-weight:700;font-size:13.5px}\n.locrow .lr-sub{font-size:11.5px;color:var(--muted);margin-top:1px}\n.locrow .lr-val{font-weight:700;font-size:14px;text-align:right}\n.locrow .lr-bar{grid-column:1\/-1;height:5px;border-radius:3px;background:var(--grid);overflow:hidden;margin-top:2px}\n.locrow .lr-bar i{display:block;height:100%;border-radius:3px;background:linear-gradient(90deg,var(--azure),#0f6fa0)}\n.locrow .chev{color:var(--muted)}\n\n\/* Funnel *\/\n.funnel{display:flex;flex-direction:column;gap:9px;margin-top:4px}\n.fstage{position:relative}\n.fstage .fbar{height:38px;border-radius:9px;display:flex;align-items:center;padding:0 13px;color:#fff;font-weight:700;font-size:13px;transition:width .6s cubic-bezier(.2,.8,.2,1);box-shadow:0 2px 8px rgba(14,34,64,.12)}\n.fstage .fmeta{position:absolute;right:0;top:50%;transform:translateY(-50%);display:flex;gap:12px;align-items:center;font-size:12px;color:var(--text-2);padding-right:4px}\n.fstage .fmeta b{color:var(--text);font-size:13px}\n.fstage .frate{font-size:11px;color:var(--muted);font-weight:600}\n\n\/* Legend *\/\n.legend{display:flex;flex-wrap:wrap;gap:14px;margin-top:12px;font-size:12px;color:var(--text-2)}\n.legend .li{display:flex;align-items:center;gap:6px;font-weight:600}\n.legend .sw{width:11px;height:11px;border-radius:3px}\n.legend .sw.line{height:3px;width:16px;border-radius:2px}\n\n\/* partner segment cards *\/\n.seg-cards{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}\n.seg-card{border:1px solid var(--line);border-radius:var(--radius-sm);padding:14px;cursor:pointer;transition:.15s;background:var(--surface)}\n.seg-card:hover{transform:translateY(-3px);box-shadow:var(--shadow)}\n.seg-card .sc-top{display:flex;align-items:center;gap:8px;font-size:12.5px;font-weight:700}\n.seg-card .sc-ic{width:26px;height:26px;border-radius:7px;display:grid;place-items:center}\n.seg-card .sc-ic svg{width:15px;height:15px;color:#fff}\n.seg-card .sc-val{font-size:23px;font-weight:700;letter-spacing:-.5px;margin-top:11px}\n.seg-card .sc-sub{font-size:11.5px;color:var(--muted);margin-top:3px}\n.seg-card .sc-count{font-size:11.5px;color:var(--text-2);font-weight:600;margin-top:9px;display:flex;justify-content:space-between;border-top:1px solid var(--line);padding-top:8px}\n\n\/* table *\/\ntable{width:100%;border-collapse:collapse;font-size:13px}\nth,td{text-align:right;padding:10px 10px;border-bottom:1px solid var(--line)}\nth{font-size:11px;text-transform:uppercase;letter-spacing:.6px;color:var(--muted);font-weight:700}\nth:first-child,td:first-child{text-align:left}\ntbody tr{cursor:pointer;transition:.12s}\ntbody tr:hover{background:var(--surface-2)}\ntd .pill{display:inline-block;font-size:11px;font-weight:700;padding:2px 8px;border-radius:20px}\n.tag-hi{background:rgba(12,163,12,.13);color:var(--good)}\n.tag-mid{background:rgba(28,156,216,.14);color:var(--azure-d)}\n\n\/* AI insight banner *\/\n.ai-banner{display:flex;gap:14px;align-items:flex-start;background:linear-gradient(100deg,rgba(28,156,216,.08),rgba(20,80,140,.05));border:1px solid var(--line);border-left:3px solid var(--azure);border-radius:var(--radius);padding:15px 18px;margin-bottom:16px}\n.ai-banner .ai-ic{flex:none;width:34px;height:34px;border-radius:9px;background:linear-gradient(135deg,var(--azure),var(--deep));display:grid;place-items:center;box-shadow:0 4px 12px rgba(28,156,216,.35)}\n.ai-banner .ai-ic svg{width:18px;height:18px;color:#fff}\n.ai-banner .ai-txt{font-size:13.5px;color:var(--text);line-height:1.55}\n.ai-banner .ai-txt b{color:var(--text)}\n.ai-banner .ai-txt .em{color:var(--azure-d);font-weight:700}\nhtml[data-theme=\"dark\"] .ai-banner .ai-txt .em{color:var(--azure)}\n.ai-banner .ai-tag{font-size:10.5px;font-weight:700;letter-spacing:1.4px;text-transform:uppercase;color:var(--azure-d);margin-bottom:3px;display:block}\n\n\/* tooltip *\/\n.tt{position:fixed;z-index:99;pointer-events:none;background:var(--navy);color:#fff;font-size:12px;padding:9px 12px;border-radius:9px;box-shadow:var(--shadow-lg);opacity:0;transition:opacity .1s;max-width:230px;line-height:1.45}\n.tt .tt-t{font-weight:700;margin-bottom:3px;font-size:12.5px}\n.tt .tt-r{display:flex;justify-content:space-between;gap:16px;color:#bcd4e6}\n.tt .tt-r b{color:#fff}\nhtml[data-theme=\"dark\"] .tt{background:#020a14;border:1px solid #1e3350}\n\n\/* misc *\/\n.chip{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;padding:5px 11px;border-radius:20px;background:var(--surface-2);border:1px solid var(--line);color:var(--text-2)}\n.chip .sw{width:9px;height:9px;border-radius:50%}\n.stat-inline{display:flex;gap:26px;flex-wrap:wrap;margin-top:2px}\n.stat-inline .si b{display:block;font-size:20px;font-weight:700;letter-spacing:-.4px}\n.stat-inline .si span{font-size:11.5px;color:var(--muted);font-weight:600}\n.backbtn{display:inline-flex;align-items:center;gap:6px;font-size:13px;font-weight:600;color:var(--azure);margin-bottom:12px}\n.backbtn svg{width:15px;height:15px}\n.gauge-track{height:9px;border-radius:5px;background:var(--grid);overflow:hidden;margin-top:8px}\n.gauge-track i{display:block;height:100%;border-radius:5px;background:linear-gradient(90deg,var(--s-state),#0f9c6d)}\n.note{font-size:11px;color:var(--muted);margin-top:12px;line-height:1.5}\n\/* engagement filters *\/\n.filters{display:flex;flex-wrap:wrap;gap:10px 18px;align-items:center;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:12px 16px;margin-bottom:16px}\n.fgroup{display:flex;align-items:center;gap:8px}\n.fgroup>.flab{font-size:11px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:var(--muted)}\n.fseg{display:flex;background:var(--surface-2);border:1px solid var(--line);border-radius:9px;padding:3px;gap:2px}\n.fseg button{font-size:12.5px;font-weight:600;color:var(--text-2);padding:6px 12px;border-radius:6px;transition:.14s;white-space:nowrap}\n.fseg button.on{background:var(--azure);color:#04141f}\n.fsel{font-family:inherit;font-size:13px;font-weight:600;color:var(--text);background:var(--surface-2);border:1px solid var(--line);border-radius:8px;padding:7px 11px;cursor:pointer;outline:none}\n.fspace{flex:1}\n\/* A\/B test card *\/\n.ab-card{border:1px solid var(--line);border-radius:var(--radius-sm);padding:15px 16px;background:var(--surface)}\n.ab-head{display:flex;justify-content:space-between;align-items:flex-start;gap:10px;margin-bottom:12px}\n.ab-head .abt{font-size:13.5px;font-weight:700}\n.ab-head .abs{font-size:11px;color:var(--muted);margin-top:2px}\n.ab-badge{font-size:11px;font-weight:800;padding:4px 9px;border-radius:20px;white-space:nowrap}\n.ab-win{background:rgba(12,163,12,.14);color:var(--good)}\n.ab-none{background:rgba(139,150,165,.16);color:var(--text-2)}\n.ab-var{display:grid;grid-template-columns:auto 1fr auto;gap:10px;align-items:center;padding:9px 0;border-top:1px solid var(--line)}\n.ab-tag{width:22px;height:22px;border-radius:6px;display:grid;place-items:center;font-size:12px;font-weight:800;color:#fff}\n.ab-nm{font-size:12.5px;font-weight:600}\n.ab-sub{font-size:11px;color:var(--muted)}\n.ab-conv{text-align:right}\n.ab-conv b{font-size:19px;font-weight:700;letter-spacing:-.5px}\n.ab-conv span{font-size:10.5px;color:var(--muted);display:block}\n.ab-bar{grid-column:1\/-1;height:6px;border-radius:3px;background:var(--grid);overflow:hidden;margin-top:-2px}\n.ab-bar i{display:block;height:100%;border-radius:3px}\n.ab-foot{display:flex;justify-content:space-between;font-size:11.5px;color:var(--text-2);margin-top:11px;border-top:1px solid var(--line);padding-top:10px}\n.ab-foot b{color:var(--text)}\n.conv-pill{font-size:11px;font-weight:700;padding:2px 8px;border-radius:20px;background:rgba(28,156,216,.14);color:var(--azure-d)}\nhtml[data-theme=\"dark\"] .conv-pill{color:var(--azure)}\n.toggle-tbl{font-size:11.5px;color:var(--azure-d);font-weight:600;cursor:pointer}\nhtml[data-theme=\"dark\"] .toggle-tbl{color:var(--azure)}\n.hidden{display:none!important}\n.fade{animation:fade .35s ease}\n@keyframes fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}\n.footer{max-width:1320px;margin:0 auto;padding:20px 24px 40px;color:var(--muted);font-size:11.5px;display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;border-top:1px solid var(--line);margin-top:20px}\n\n@media (max-width:1080px){\n  .kpis{grid-template-columns:1fr 1fr}.row-2,.row-map,.row-3{grid-template-columns:1fr}.seg-cards{grid-template-columns:1fr 1fr}\n}\n@media print{\n  .topbar,.cta,.icon-btn,.segset,.toggle-tbl{display:none!important}\n  body{background:#fff}.card{box-shadow:none;border:1px solid #ccc;break-inside:avoid}\n}\n\n\/* ===================== TrueOmni Design System overrides ===================== *\/\n.eyebrow{color:var(--azure)!important;text-transform:uppercase;letter-spacing:.12em;font-weight:600}\n.eyebrow::before{content:'\\2500\\2500  ';color:var(--azure);font-weight:700;letter-spacing:0}\n.card{border-top:3px solid var(--azure)}\n.pagehead h1{letter-spacing:-.01em}\n.pagehead h1::after{content:'\\2022';color:var(--azure);margin-left:3px;font-weight:900}\n.crumbs a{color:var(--azure)}\n\n\/* ============ Hospitality variant additions ============ *\/\n.modbanner{display:flex;gap:13px;align-items:flex-start;background:linear-gradient(100deg,rgba(194,100,31,.10),rgba(194,100,31,.04));border:1px solid rgba(194,100,31,.30);border-left:3px solid var(--amber);border-radius:var(--radius);padding:13px 16px;margin-bottom:16px}\n.modbanner .mb-ic{flex:none;width:30px;height:30px;border-radius:8px;background:var(--amber);display:grid;place-items:center}\n.modbanner .mb-ic svg{width:16px;height:16px;color:#fff}\n.modbanner .mb-t{font-size:10.5px;font-weight:800;letter-spacing:1.4px;text-transform:uppercase;color:var(--amber);margin-bottom:3px}\n.modbanner .mb-x{font-size:12.5px;color:var(--text-2);line-height:1.55}\n.modbanner .mb-x b{color:var(--text)}\n.badge-mod{font-size:9.5px;font-weight:800;letter-spacing:1.1px;text-transform:uppercase;color:var(--amber);background:rgba(194,100,31,.13);border:1px solid rgba(194,100,31,.32);border-radius:5px;padding:2px 6px;vertical-align:2px;white-space:nowrap}\n.badge-src{font-size:9.5px;font-weight:800;letter-spacing:1.1px;text-transform:uppercase;color:var(--s-state);background:rgba(27,175,122,.13);border:1px solid rgba(27,175,122,.32);border-radius:5px;padding:2px 6px;vertical-align:2px;white-space:nowrap}\n\n\/* huge hero stat *\/\n.bigstat{background:linear-gradient(140deg,var(--navy),#123056 92%);color:#fff;border-radius:var(--radius);padding:34px 34px 30px;position:relative;overflow:hidden;border-top:3px solid var(--azure)}\n.bigstat .glow{position:absolute;right:-70px;top:-70px;width:320px;height:320px;background:radial-gradient(circle,rgba(28,156,216,.42),transparent 70%);pointer-events:none}\n.bigstat .glow2{position:absolute;left:-90px;bottom:-120px;width:300px;height:300px;background:radial-gradient(circle,rgba(28,156,216,.16),transparent 70%);pointer-events:none}\n.bigstat .bs-eye{font-size:11px;font-weight:800;letter-spacing:2.2px;text-transform:uppercase;color:var(--azure);margin-bottom:14px}\n.bigstat .bs-num{font-size:clamp(72px,13vw,148px);font-weight:900;letter-spacing:-.055em;line-height:.86;background:linear-gradient(180deg,#fff 30%,#8fd4f2);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}\n.bigstat .bs-lead{font-size:clamp(16px,2.1vw,23px);font-weight:700;line-height:1.32;max-width:760px;margin-top:16px;letter-spacing:-.01em}\n.bigstat .bs-rule{width:64px;height:3px;background:var(--azure);border-radius:2px;margin:22px 0 16px}\n.bigstat .bs-sub{font-size:14.5px;color:#bcdcef;line-height:1.6;max-width:720px;font-weight:600}\n.bigstat .bs-sub b{color:#fff}\n.bigstat .bs-cite{font-size:11px;color:#7fa6c0;margin-top:18px;line-height:1.5}\n.bigstat .bs-cite a{color:#8fd4f2;text-decoration:underline;text-underline-offset:2px}\n\n\/* four pillars *\/\n.pillars{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}\n.pillar{background:var(--surface);border:1px solid var(--line);border-top:3px solid var(--azure);border-radius:var(--radius);box-shadow:var(--shadow);padding:16px;cursor:pointer;transition:.16s;position:relative;overflow:hidden;display:flex;flex-direction:column}\n.pillar:hover{transform:translateY(-4px);box-shadow:var(--shadow-lg)}\n.pillar .p-n{position:absolute;right:12px;top:8px;font-size:40px;font-weight:900;color:var(--line);line-height:1;letter-spacing:-.05em}\n.pillar .p-ic{width:34px;height:34px;border-radius:9px;background:linear-gradient(135deg,var(--azure),var(--deep));display:grid;place-items:center;box-shadow:0 4px 12px rgba(14,161,220,.32)}\n.pillar .p-ic svg{width:18px;height:18px;color:#fff}\n.pillar .p-t{font-size:14px;font-weight:800;margin-top:12px;letter-spacing:-.01em}\n.pillar .p-s{font-size:11.5px;color:var(--azure);font-weight:700;text-transform:uppercase;letter-spacing:.9px;margin-top:3px}\n.pillar .p-l{list-style:none;margin-top:11px;display:flex;flex-direction:column;gap:5px;flex:1}\n.pillar .p-l li{font-size:12px;color:var(--text-2);display:flex;gap:7px;align-items:flex-start;line-height:1.4}\n.pillar .p-l li::before{content:'';flex:none;width:4px;height:4px;border-radius:50%;background:var(--azure);margin-top:6px}\n.pillar .p-f{margin-top:13px;border-top:1px solid var(--line);padding-top:10px}\n.pillar .p-f b{font-size:20px;font-weight:800;letter-spacing:-.5px;display:block}\n.pillar .p-f span{font-size:10.5px;color:var(--muted);font-weight:700;text-transform:uppercase;letter-spacing:.7px}\n\n\/* chain \/ flow *\/\n.chain{display:flex;align-items:stretch;gap:0;flex-wrap:wrap;background:var(--surface);border:1px solid var(--line);border-top:3px solid var(--azure);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden}\n.chain .cs{flex:1;min-width:150px;padding:16px 15px;border-right:1px solid var(--line);position:relative}\n.chain .cs:last-child{border-right:0;background:linear-gradient(140deg,rgba(14,161,220,.09),transparent)}\n.chain .cs .cs-k{font-size:10px;font-weight:800;letter-spacing:1.5px;text-transform:uppercase;color:var(--azure)}\n.chain .cs .cs-v{font-size:25px;font-weight:800;letter-spacing:-1px;margin-top:7px;line-height:1}\n.chain .cs .cs-l{font-size:11.5px;color:var(--text-2);margin-top:5px;font-weight:600;line-height:1.4}\n.chain .cs .cs-r{font-size:10.5px;color:var(--muted);margin-top:7px;font-weight:700}\n\n\/* sliders *\/\n.sliders{display:grid;grid-template-columns:repeat(auto-fit,minmax(206px,1fr));gap:16px 22px;background:var(--surface);border:1px solid var(--line);border-top:3px solid var(--azure);border-radius:var(--radius);box-shadow:var(--shadow);padding:17px 20px;margin-bottom:16px}\n.sl .sl-h{display:flex;justify-content:space-between;align-items:baseline;gap:8px}\n.sl .sl-lab{font-size:11px;font-weight:800;letter-spacing:.9px;text-transform:uppercase;color:var(--muted)}\n.sl .sl-val{font-size:18px;font-weight:800;letter-spacing:-.5px;color:var(--azure-d)}\nhtml[data-theme=\"dark\"] .sl .sl-val{color:var(--azure)}\n.sl input[type=range]{-webkit-appearance:none;appearance:none;width:100%;height:5px;border-radius:3px;background:var(--grid);margin-top:11px;outline:none;cursor:pointer}\n.sl input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:17px;height:17px;border-radius:50%;background:var(--azure);border:3px solid var(--surface);box-shadow:0 2px 7px rgba(14,161,220,.5);cursor:pointer}\n.sl input[type=range]::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:var(--azure);border:3px solid var(--surface);box-shadow:0 2px 7px rgba(14,161,220,.5);cursor:pointer;border-width:3px}\n.sl .sl-f{font-size:10.5px;color:var(--muted);margin-top:7px;font-weight:600;line-height:1.4}\n.sl-reset{align-self:center;justify-self:end}\n\n\/* sensitivity grid *\/\n.sens{width:100%;border-collapse:separate;border-spacing:5px;font-size:13px}\n.sens th{font-size:10px;text-transform:uppercase;letter-spacing:.9px;color:var(--muted);font-weight:800;padding:4px 6px;text-align:center;border:0}\n.sens th.rh{text-align:left}\n.sens td{text-align:center;padding:13px 8px;border-radius:10px;font-weight:800;font-size:16px;letter-spacing:-.5px;border:1px solid var(--line);background:var(--surface-2);cursor:default;transition:.14s}\n.sens td.rh{text-align:left;font-size:12px;font-weight:800;background:transparent;border:0;color:var(--text-2);letter-spacing:0;text-transform:uppercase}\n.sens td span{display:block;font-size:9.5px;font-weight:700;color:var(--muted);letter-spacing:.6px;margin-top:3px;text-transform:uppercase}\n.sens td.live{outline:2px solid var(--azure);outline-offset:1px}\n.sens td:hover{transform:scale(1.03)}\n\n\/* amenity chips *\/\n.amen{display:flex;flex-wrap:wrap;gap:8px;margin-top:4px}\n.amen .a{display:inline-flex;align-items:center;gap:7px;font-size:12px;font-weight:700;padding:7px 12px;border-radius:9px;background:var(--surface-2);border:1px solid var(--line);color:var(--text)}\n.amen .a i{width:8px;height:8px;border-radius:2px;flex:none}\n.amen .a em{font-style:normal;color:var(--muted);font-weight:700;font-size:11px}\n\n\/* provenance ledger *\/\n.ledger td:first-child{font-weight:700}\n.ledger td{font-size:12.5px;vertical-align:top;text-align:left}\n.ledger th{text-align:left}\n.ledger td.num{text-align:right;font-weight:800;white-space:nowrap}\n.ledger a{color:var(--azure-d);text-decoration:underline;text-underline-offset:2px}\nhtml[data-theme=\"dark\"] .ledger a{color:var(--azure)}\n\n\/* deflect list *\/\n.deflect{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:9px;margin-top:4px}\n.deflect .d{border:1px solid var(--line);border-radius:var(--radius-sm);padding:11px 12px;background:var(--surface-2)}\n.deflect .d b{font-size:17px;font-weight:800;letter-spacing:-.5px;display:block}\n.deflect .d span{font-size:11px;color:var(--text-2);font-weight:700;display:block;margin-top:2px;line-height:1.35}\n.quote{border-left:3px solid var(--azure);padding:4px 0 4px 16px;font-size:15.5px;font-weight:700;line-height:1.45;letter-spacing:-.01em;color:var(--text)}\n.quote span{display:block;font-size:12.5px;font-weight:600;color:var(--text-2);margin-top:8px;line-height:1.55}\n@media (max-width:1080px){.pillars{grid-template-columns:1fr 1fr}}\n@media (max-width:700px){.pillars{grid-template-columns:1fr}.chain .cs{min-width:100%;border-right:0;border-bottom:1px solid var(--line)}}\n<\/style>\n<\/head>\n<body>\n<div class=\"topbar\">\n  <div class=\"topbar-inner\">\n    <div class=\"brand\">\n      <span class=\"mark\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2.2\" stroke-linecap=\"round\"><path d=\"M3 21h18M5 21V7l7-4 7 4v14M9 21v-5h6v5\"\/><\/svg><\/span>\n      <span><span class=\"name\">True<b>Impact<\/b><\/span><span class=\"sub\">Hospitality \u00b7 Guest Journey<\/span><\/span>\n    <\/div>\n    <div class=\"destpick\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 21h18M5 21V5a2 2 0 012-2h10a2 2 0 012 2v16M9 7h1m4 0h1M9 11h1m4 0h1M9 15h1m4 0h1\"\/><\/svg>\n      <select id=\"propSel\"><\/select>\n    <\/div>\n    <span class=\"sample\" id=\"modChip\">MODELED \u00b7 ILLUSTRATIVE<\/span>\n    <span class=\"live\"><span class=\"dot\"><\/span> Sensitivity model<\/span>\n    <span class=\"spacer\"><\/span>\n    <div class=\"controls\">\n      <div class=\"segset\" id=\"navSel\"><\/div>\n      <button class=\"icon-btn\" id=\"themeBtn\" title=\"Toggle theme\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M21 12.8A9 9 0 1111.2 3a7 7 0 009.8 9.8z\"\/><\/svg><\/button>\n      <button class=\"cta\" id=\"printBtn\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"><path d=\"M6 9V2h12v7M6 18H4a2 2 0 01-2-2v-5h20v5a2 2 0 01-2 2h-2M6 14h12v8H6z\"\/><\/svg> Export<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n<div class=\"wrap\" id=\"app\"><\/div>\n<div class=\"footer\">\n  <span><b>TrueOmni TrueImpact<\/b> \u00b7 Rosen Hotels &amp; Resorts \u00b7 Digital Guest Journey sensitivity model<\/span>\n  <span id=\"footNote\">Illustrative planning model \u00b7 not a revenue forecast \u00b7 not Rosen-reported performance<\/span>\n<\/div>\n<div class=\"tt\" id=\"tt\"><\/div>\n\n<script id=\"model\">\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   ROSEN HOTELS & RESORTS \u2014 TrueImpact HOSPITALITY model\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   SOURCED (real, citable):\n     \u00b7 6,338 rooms across 7 properties  \u2014 Rosen's own corporate copy + each\n       property fact sheet (see PROPS[].src)\n     \u00b7 Rosen Shingle Creek: 15 dining\/lounging venues, 13,000 sq ft spa,\n       18-hole Arnold Palmer course \u2014 rosenshinglecreek.com fact sheet\n     \u00b7 70% \/ 82% \/ 30% \/ 3x-upsell industry stats \u2014 Mews + Talker Research\n   MODELED (planning assumptions, NOT Rosen-reported):\n     \u00b7 occupancy, guests per occupied room, length of stay\n     \u00b7 engagement %, conversion %, average transaction\n     \u00b7 kiosk & screen counts, amenity revenue mix, ad rate card\n   Every modeled figure carries a MODELED badge in the UI.\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\nconst CUSTOMER = { name:'Rosen Hotels & Resorts', short:'Rosen', market:'Greater Orlando \u00b7 International Drive' };\n\n\/* ---- SOURCED: property inventory ---------------------------------------- *\/\nconst PROPS = [\n  { id:'shingle', name:'Rosen Shingle Creek',            rooms:1501, cls:'Convention resort',\n    kiosks:8, screens:28, phase:1, venues:15, meeting:524000,\n    note:'255-acre convention resort \u00b7 15 dining\/lounging venues \u00b7 13,000 sq ft spa \u00b7 18-hole Arnold Palmer course',\n    src:'https:\/\/www.rosenshinglecreek.com\/about-us\/fact-sheet\/' },\n  { id:'centre',  name:'Rosen Centre Hotel',             rooms:1334, cls:'Convention hotel',\n    kiosks:6, screens:20, phase:1, venues:9, meeting:160000,\n    note:'Skybridge to OCCC \u00b7 9 dining outlets \u00b7 spa & salon \u00b7 160,000+ sq ft meeting space',\n    src:'https:\/\/www.rosencentre.com\/about-us\/hotel-fact-sheet\/' },\n  { id:'plaza',   name:'Rosen Plaza Hotel',              rooms:800,  cls:'Convention hotel',\n    kiosks:4, screens:12, phase:1, venues:7, meeting:60000,\n    note:'Connected to OCCC \u00b7 7 dining\/lounging venues \u00b7 3NINE event venue',\n    src:'https:\/\/www.rosenplaza.com\/about-us\/fact-sheet\/' },\n  { id:'pointe',  name:'Rosen Inn at Pointe Orlando',    rooms:1020, cls:'Leisure inn',\n    kiosks:4, screens:10, phase:2, venues:4, meeting:0,\n    note:'26 acres \u00b7 4 dining options \u00b7 3 pools \u00b7 steps from Pointe Orlando',\n    src:'https:\/\/www.roseninn9000.com\/rooms' },\n  { id:'intl',    name:'Rosen Inn International',        rooms:728,  cls:'Leisure inn',\n    kiosks:3, screens:8, phase:2, venues:3, meeting:0,\n    note:'7600 International Drive \u00b7 Fountain View Caf\u00e9 \u00b7 free Universal shuttle',\n    src:'https:\/\/www.roseninn7600.com\/rooms' },\n  { id:'lbv',     name:'Rosen Inn Lake Buena Vista',     rooms:640,  cls:'Leisure inn',\n    kiosks:3, screens:7, phase:3, venues:2, meeting:0,\n    note:'Disney Good Neighbor Hotel \u00b7 Ozzie\u2019s Splash Zone \u00b7 2 pools',\n    src:'https:\/\/www.rosenlbv.com\/rooms' },\n  { id:'univ',    name:'Rosen Inn closest to Universal', rooms:315,  cls:'Leisure inn',\n    kiosks:2, screens:5, phase:3, venues:2, meeting:0,\n    note:'6327 International Drive \u00b7 closest Rosen property to Universal Orlando',\n    src:'https:\/\/www.roseninn6327.com\/rooms' },\n];\n\n\/* ---- MODELED: planning assumptions (all user-adjustable) ---------------- *\/\nconst DEF = {\n  occupancy: 0.70,   \/\/ MODELED \u2014 illustrative, not Rosen-reported\n  guestsPerRoom: 1.8,\/\/ MODELED\n  los: 2.9,          \/\/ MODELED avg length of stay (nights) \u2014 convention\/leisure blend\n  engagement: 0.20,  \/\/ MODELED \u2014 guests touching kiosk \/ mobile \/ signage CTA \/ AI concierge\n  conversion: 0.10,  \/\/ MODELED \u2014 engaged guests who transact\n  avgTicket: 50,     \/\/ MODELED \u2014 avg ancillary transaction value\n  kioskShare: 0.30,  \/\/ SOURCED benchmark \u2014 Mews: 30% of reservations at US kiosk hotels\n  fdMinutes: 4.0,    \/\/ MODELED \u2014 associate minutes per front-desk check-in\n  baseUpsell: 4.50,  \/\/ MODELED \u2014 upsell revenue per front-desk check-in\n};\nlet S = { ...DEF };\n\n\/* ---- MODELED: where ancillary revenue lands ---------------------------- *\/\nconst AMENITY_MIX = [\n  { id:'dining',    name:'Restaurants & bars',        share:.26, color:'var(--s-dining)',      ticket:58 },\n  { id:'attract',   name:'Attraction & event tickets',share:.19, color:'var(--s-attractions)', ticket:96 },\n  { id:'upgrade',   name:'Room upgrades & late c\/o',  share:.16, color:'var(--azure)',         ticket:44 },\n  { id:'spa',       name:'Spa & wellness',            share:.13, color:'var(--s-events)',      ticket:135 },\n  { id:'transport', name:'Transportation & transfers',share:.11, color:'var(--deep)',          ticket:38 },\n  { id:'golf',      name:'Golf & recreation',         share:.09, color:'var(--good)',          ticket:110 },\n  { id:'pool',      name:'Pool, cabanas & packages',  share:.06, color:'var(--amber)',         ticket:150 },\n];\n\n\/* ---- MODELED: front-desk transactions that can move to self-service ---- *\/\nconst DEFLECT = [\n  { name:'Check-in',                    share:.28 },\n  { name:'Check-out & folio',           share:.17 },\n  { name:'Directions & wayfinding',     share:.14 },\n  { name:'Restaurant info & booking',   share:.13 },\n  { name:'General FAQs \/ hotel info',   share:.11 },\n  { name:'Transportation & shuttles',   share:.10 },\n  { name:'Amenity & activity booking',  share:.07 },\n];\n\n\/* ---- MODELED: Omni Media Network (lobby & venue signage) --------------- *\/\nconst MEDIA = {\n  perScreenMo:{ floor:200, mid:450, strong:800 },\n  loopSec:60, spotSec:15, viewShare:.62, imprPerPasserby:1.6, dwellSec:8,\n  fillMature:.65, capitalPerScreen:4200, softwarePerScreenYr:600,\n  formats:[\n    { id:'wall',    name:'Lobby hero \/ video wall',       share:.32, color:'var(--azure)' },\n    { id:'portrait',name:'Portrait posters (corridor)',   share:.26, color:'var(--deep)' },\n    { id:'wayfind', name:'Wayfinding & directory',        share:.21, color:'var(--s-attractions)' },\n    { id:'menu',    name:'Venue menu & promo boards',     share:.15, color:'var(--s-dining)' },\n    { id:'outdoor', name:'Outdoor \/ pool deck',           share:.06, color:'var(--amber)' },\n  ],\n};\n\n\/* ---- SOURCED: the industry evidence base ------------------------------- *\/\nconst EVIDENCE = [\n  { v:'70%',  t:'of U.S. travelers say they would check themselves in via app or self-service kiosk instead of a traditional front desk.',\n    s:'Mews \/ Talker Research \u00b7 2,000 U.S. travelers \u00b7 Apr\u2013May 2025',\n    u:'https:\/\/www.mews.com\/en\/press\/the-rise-of-self-check-in-hotels' },\n  { v:'82%',  t:'of Gen Z travelers prefer the app or kiosk approach \u2014 the cohort filling Orlando\u2019s leisure and convention rooms next.',\n    s:'Mews \/ Talker Research \u00b7 same survey',\n    u:'https:\/\/www.mews.com\/en\/press\/the-rise-of-self-check-in-hotels' },\n  { v:'30%',  t:'of reservations at U.S. hotels running kiosks are checked in through the kiosk \u2014 vs a 20% global average.',\n    s:'Mews operational data \u00b7 Jun 2025',\n    u:'https:\/\/www.mews.com\/en\/blog\/hotel-check-in-experience' },\n  { v:'3\u00d7', t:'more likely to buy an upsell when a guest checks in at a kiosk \u2014 producing nearly 70% more upsell revenue per check-in.',\n    s:'Mews \u00b7 kiosk product data',\n    u:'https:\/\/www.mews.com\/en\/products\/check-in-kiosk' },\n];\n\n\/* ---- the engine -------------------------------------------------------- *\/\nfunction scope(){\n  const id = state.prop;\n  return id==='all' ? PROPS : PROPS.filter(p=>p.id===id);\n}\nfunction derive(o=S, ps=scope()){\n  const rooms   = ps.reduce((a,p)=>a+p.rooms,0);\n  const kiosks  = ps.reduce((a,p)=>a+p.kiosks,0);\n  const screens = ps.reduce((a,p)=>a+p.screens,0);\n  const venues  = ps.reduce((a,p)=>a+p.venues,0);\n  const meeting = ps.reduce((a,p)=>a+p.meeting,0);\n\n  const roomNights = rooms * 365;               \/\/ capacity\n  const occNights  = roomNights * o.occupancy;  \/\/ occupied room nights\n  const stays      = occNights * o.guestsPerRoom; \/\/ guest stays\n  const arrivals   = occNights \/ o.los;         \/\/ check-in events\n\n  const engaged    = stays * o.engagement;\n  const converters = engaged * o.conversion;\n  const gtv        = converters * o.avgTicket;  \/\/ gross transaction value\n  const perStay    = stays ? gtv \/ stays : 0;\n  const perRoom    = rooms ? gtv \/ rooms : 0;\n\n  \/\/ front desk\n  const kioskCheckins = arrivals * o.kioskShare;\n  const fdHoursTotal  = kioskCheckins * o.fdMinutes \/ 60;      \/\/ associate hours touched\n  const fdHoursSaved  = fdHoursTotal \/ 3;                      \/\/ Mews: kiosk cuts check-in time ~1\/3\n  const upsellInc     = kioskCheckins * o.baseUpsell * 0.70;   \/\/ \"nearly 70% more upsell revenue\"\n  const totalTx       = arrivals * 4.1;                        \/\/ MODELED front-desk interactions per stay\n\n  \/\/ media\n  const reach       = stays * MEDIA.viewShare;\n  const impressions = reach * MEDIA.imprPerPasserby;\n  const adBand = {};\n  for(const k in MEDIA.perScreenMo) adBand[k] = screens * MEDIA.perScreenMo[k] * 12;\n  \/\/ perScreenMo bands are already stated NET of fill (revenue per screen at mature\n  \/\/ 65% fill) \u2014 so do NOT apply fillMature again here or the number is double-discounted.\n  const adRev = adBand.mid;\n  const cpm   = impressions ? adRev \/ (impressions\/1000) : 0;\n  const spotsPerLoop = Math.round(MEDIA.loopSec \/ MEDIA.spotSec);\n  const capital = screens*MEDIA.capitalPerScreen + kiosks*9500;\n\n  return { rooms,kiosks,screens,venues,meeting,roomNights,occNights,stays,arrivals,\n           engaged,converters,gtv,perStay,perRoom,\n           kioskCheckins,fdHoursTotal,fdHoursSaved,upsellInc,totalTx,\n           reach,impressions,adBand,adRev,cpm,spotsPerLoop,capital,\n           totalOpportunity: gtv + upsellInc + adRev };\n}\n<\/script>\n\n<script id=\"helpers\">\n\/* ---- formatters -------------------------------------------------------- *\/\nconst $  = s => document.querySelector(s);\nconst $$ = s => Array.from(document.querySelectorAll(s));\nconst nf  = n => Math.round(n).toLocaleString('en-US');\nfunction abbr(n){\n  const a=Math.abs(n);\n  if(a>=1e9) return (n\/1e9).toFixed(2).replace(\/\\.00$\/,'')+'B';\n  if(a>=1e6) return (n\/1e6).toFixed(2).replace(\/\\.00$\/,'')+'M';\n  if(a>=1e3) return (n\/1e3).toFixed(0)+'K';\n  return nf(n);\n}\nfunction abbr1(n){\n  const a=Math.abs(n);\n  if(a>=1e6) return (n\/1e6).toFixed(1)+'M';\n  if(a>=1e3) return (n\/1e3).toFixed(0)+'K';\n  return nf(n);\n}\nconst money  = n => '$'+abbr(n);\nconst money0 = n => '$'+nf(n);\nconst pct    = n => (n*100).toFixed(n*100<10?1:0)+'%';\nconst pct0   = n => Math.round(n*100)+'%';\n\n\/* ---- tooltip ----------------------------------------------------------- *\/\nconst TT=$('#tt');\nfunction ttShow(e,html){ TT.innerHTML=html; TT.style.opacity=1;\n  const p=8; let x=e.clientX+14, y=e.clientY-10;\n  const r=TT.getBoundingClientRect();\n  if(x+r.width>innerWidth-p) x=e.clientX-r.width-14;\n  if(y+r.height>innerHeight-p) y=innerHeight-r.height-p;\n  TT.style.left=x+'px'; TT.style.top=Math.max(p,y)+'px';\n}\nfunction ttHide(){ TT.style.opacity=0; }\nfunction bindTT(root){\n  root.querySelectorAll('[data-tt]').forEach(el=>{\n    el.addEventListener('mousemove',e=>ttShow(e,el.dataset.tt));\n    el.addEventListener('mouseleave',ttHide);\n  });\n}\n\n\/* ---- SVG chart helpers (hand-rolled, no deps) -------------------------- *\/\nfunction svgOpen(w,h){ return `<svg viewBox=\"0 0 ${w} ${h}\" style=\"width:100%;height:auto;display:block;overflow:visible\">`; }\n\n\/* vertical bars with value labels *\/\nfunction barChart(data,{w=620,h=250,pad=38,fmt=abbr,color='var(--azure)',highlight=-1}={}){\n  const max=Math.max(...data.map(d=>d.v))*1.16||1;\n  const iw=w-pad-14, bw=iw\/data.length, bar=Math.min(bw*.56,76);\n  let s=svgOpen(w,h);\n  for(let g=0;g<=4;g++){\n    const y=14+(h-pad-14)*(g\/4), val=max*(1-g\/4);\n    s+=`<line x1=\"${pad}\" y1=\"${y}\" x2=\"${w-6}\" y2=\"${y}\" stroke=\"var(--grid)\" stroke-width=\"1\"\/>`;\n    s+=`<text x=\"${pad-7}\" y=\"${y+3.5}\" text-anchor=\"end\" font-size=\"9.5\" font-weight=\"700\" fill=\"var(--muted)\">${fmt(val)}<\/text>`;\n  }\n  data.forEach((d,i)=>{\n    const bh=Math.max(2,(d.v\/max)*(h-pad-14));\n    const x=pad+bw*i+(bw-bar)\/2, y=14+(h-pad-14)-bh;\n    const c=d.color||color;\n    s+=`<g data-tt=\"<div class='tt-t'>${d.l}<\/div><div class='tt-r'><span>${d.k||'Value'}<\/span><b>${d.tt||fmt(d.v)}<\/b><\/div>\">`;\n    s+=`<rect x=\"${x}\" y=\"${y}\" width=\"${bar}\" height=\"${bh}\" rx=\"6\" fill=\"${c}\" opacity=\"${highlight<0||highlight===i?1:.42}\"\/>`;\n    s+=`<text x=\"${x+bar\/2}\" y=\"${y-6}\" text-anchor=\"middle\" font-size=\"12\" font-weight=\"800\" fill=\"var(--text)\">${d.tt||fmt(d.v)}<\/text>`;\n    s+=`<text x=\"${x+bar\/2}\" y=\"${h-13}\" text-anchor=\"middle\" font-size=\"10.5\" font-weight=\"700\" fill=\"var(--text-2)\">${d.l}<\/text>`;\n    if(d.l2) s+=`<text x=\"${x+bar\/2}\" y=\"${h-2}\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"600\" fill=\"var(--muted)\">${d.l2}<\/text>`;\n    s+=`<\/g>`;\n  });\n  return s+'<\/svg>';\n}\n\n\/* horizontal ranked bars *\/\nfunction hbarChart(data,{w=560,rh=30,fmt=abbr,lw=190}={}){\n  const max=Math.max(...data.map(d=>d.v))||1, h=data.length*rh+6;\n  let s=svgOpen(w,h);\n  data.forEach((d,i)=>{\n    const y=i*rh+4, bw=Math.max(2,(d.v\/max)*(w-lw-96));\n    s+=`<g data-tt=\"<div class='tt-t'>${d.l}<\/div><div class='tt-r'><span>${d.k||'Value'}<\/span><b>${d.tt||fmt(d.v)}<\/b><\/div>${d.sub?`<div class='tt-r'><span>${d.sub}<\/span><\/div>`:''}\">`;\n    s+=`<text x=\"0\" y=\"${y+16}\" font-size=\"12\" font-weight=\"700\" fill=\"var(--text)\">${d.l}<\/text>`;\n    s+=`<rect x=\"${lw}\" y=\"${y+6}\" width=\"${w-lw-96}\" height=\"13\" rx=\"6.5\" fill=\"var(--grid)\"\/>`;\n    s+=`<rect x=\"${lw}\" y=\"${y+6}\" width=\"${bw}\" height=\"13\" rx=\"6.5\" fill=\"${d.color||'var(--azure)'}\"\/>`;\n    s+=`<text x=\"${w}\" y=\"${y+17}\" text-anchor=\"end\" font-size=\"12\" font-weight=\"800\" fill=\"var(--text)\">${d.tt||fmt(d.v)}<\/text>`;\n    s+=`<\/g>`;\n  });\n  return s+'<\/svg>';\n}\n\n\/* stacked single bar (100%) *\/\nfunction stackBar(data,{w=620,h=44,fmt=abbr}={}){\n  const tot=data.reduce((a,d)=>a+d.v,0)||1; let x=0;\n  let s=svgOpen(w,h);\n  data.forEach(d=>{\n    const bw=(d.v\/tot)*w;\n    s+=`<g data-tt=\"<div class='tt-t'>${d.l}<\/div><div class='tt-r'><span>Share<\/span><b>${pct(d.v\/tot)}<\/b><\/div><div class='tt-r'><span>Value<\/span><b>${fmt(d.v)}<\/b><\/div>\">`;\n    s+=`<rect x=\"${x}\" y=\"0\" width=\"${Math.max(0,bw-2)}\" height=\"${h}\" rx=\"5\" fill=\"${d.color}\"\/>`;\n    if(bw>58) s+=`<text x=\"${x+bw\/2-1}\" y=\"${h\/2+4.5}\" text-anchor=\"middle\" font-size=\"11.5\" font-weight=\"800\" fill=\"#fff\">${pct0(d.v\/tot)}<\/text>`;\n    s+=`<\/g>`; x+=bw;\n  });\n  return s+'<\/svg>';\n}\n\n\/* funnel *\/\nfunction funnelHTML(stages){\n  const max=stages[0].v||1;\n  return `<div class=\"funnel\">`+stages.map((st,i)=>{\n    const wpc=Math.max(11,(st.v\/max)*100);\n    const rate=i? (stages[i-1].v? st.v\/stages[i-1].v : 0) : 1;\n    return `<div class=\"fstage\">\n      <div class=\"fbar\" style=\"width:${wpc}%;background:linear-gradient(90deg,var(--azure),var(--deep))\">\n        <span>${st.l}<\/span><\/div>\n      <div class=\"fmeta\"><b>${st.fmt||abbr(st.v)}<\/b>${i?`<span class=\"frate\">${pct(rate)} of prior<\/span>`:`<span class=\"frate\">base<\/span>`}<\/div>\n    <\/div>`;\n  }).join('')+`<\/div>`;\n}\n\n\/* line \/ area chart *\/\nfunction lineChart(series,labels,{w=620,h=230,pad=42,fmt=abbr}={}){\n  const all=series.flatMap(s=>s.v), max=Math.max(...all)*1.15||1;\n  const iw=w-pad-12, ih=h-30;\n  const X=i=>pad+(iw*i\/Math.max(1,labels.length-1)), Y=v=>14+ih-(v\/max)*ih;\n  let s=svgOpen(w,h);\n  for(let g=0;g<=4;g++){ const y=14+ih*(g\/4);\n    s+=`<line x1=\"${pad}\" y1=\"${y}\" x2=\"${w-6}\" y2=\"${y}\" stroke=\"var(--grid)\"\/>`;\n    s+=`<text x=\"${pad-7}\" y=\"${y+3.5}\" text-anchor=\"end\" font-size=\"9.5\" font-weight=\"700\" fill=\"var(--muted)\">${fmt(max*(1-g\/4))}<\/text>`;}\n  labels.forEach((l,i)=>{ if(labels.length<=14||i%2===0)\n    s+=`<text x=\"${X(i)}\" y=\"${h-4}\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"700\" fill=\"var(--text-2)\">${l}<\/text>`;});\n  series.forEach(ser=>{\n    const pts=ser.v.map((v,i)=>`${X(i)},${Y(v)}`).join(' ');\n    s+=`<polyline points=\"${pts}\" fill=\"none\" stroke=\"${ser.color}\" stroke-width=\"2.6\" stroke-linejoin=\"round\" stroke-linecap=\"round\"\/>`;\n    ser.v.forEach((v,i)=>{ s+=`<circle cx=\"${X(i)}\" cy=\"${Y(v)}\" r=\"3.4\" fill=\"${ser.color}\" stroke=\"var(--surface)\" stroke-width=\"1.6\"\n      data-tt=\"<div class='tt-t'>${ser.name}<\/div><div class='tt-r'><span>${labels[i]}<\/span><b>${fmt(v)}<\/b><\/div>\"\/>`;});\n  });\n  return s+'<\/svg>';\n}\n<\/script>\n\n<script id=\"app-logic\">\nconst ICONS = {\n  desk:'<path d=\"M3 21h18M4 21V10h16v11M8 10V6a4 4 0 018 0v4M9 15h6\"\/>',\n  conc:'<path d=\"M12 3a7 7 0 017 7v4l1.5 3H3.5L5 14v-4a7 7 0 017-7zM9 21h6\"\/>',\n  hotel:'<path d=\"M3 21h18M5 21V5a2 2 0 012-2h10a2 2 0 012 2v16M9 7h1m4 0h1M9 11h1m4 0h1M9 15h6v6H9z\"\/>',\n  mob:'<rect x=\"6\" y=\"2\" width=\"12\" height=\"20\" rx=\"3\"\/><path d=\"M11 18h2\"\/>',\n  rev:'<path d=\"M12 2v20M17 6H9.5a3.5 3.5 0 000 7h5a3.5 3.5 0 010 7H6\"\/>',\n  warn:'<path d=\"M12 9v4m0 4h.01M10.3 3.9L2.4 17.6A2 2 0 004.1 20.6h15.8a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0z\"\/>',\n  spark:'<path d=\"M12 3l1.9 5.6L19.5 10l-5.6 1.9L12 17.5l-1.9-5.6L4.5 10l5.6-1.4L12 3z\"\/>',\n};\n\nconst PAGES = [\n  { id:'overview',  label:'Overview'    },\n  { id:'journey',   label:'Journey'     },\n  { id:'revenue',   label:'Revenue'     },\n  { id:'ops',       label:'Front Desk'  },\n  { id:'media',     label:'Media'       },\n  { id:'props',     label:'Properties'  },\n  { id:'method',    label:'Method'      },\n];\n\nconst state = { page:'overview', prop:'all' };\n\n\/* ---------- shared fragments ---------- *\/\nfunction modBanner(txt){\n  return `<div class=\"modbanner\"><div class=\"mb-ic\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\">${ICONS.warn}<\/svg><\/div>\n  <div><div class=\"mb-t\">Illustrative model<\/div><div class=\"mb-x\">${txt}<\/div><\/div><\/div>`;\n}\nfunction head(eyebrow,h1,meta){\n  return `<div class=\"pagehead\"><div><div class=\"eyebrow\">${eyebrow}<\/div><h1>${h1}<\/h1><\/div>\n    <div class=\"meta\">${meta}<\/div><\/div>`;\n}\nfunction sliderBar(keys){\n  const CFG = {\n    occupancy:    { lab:'Occupancy',        min:40, max:95, step:1, s:1,   fmt:v=>pct0(v),      foot:'Annual portfolio average \u00b7 modeled' },\n    guestsPerRoom:{ lab:'Guests \/ room',    min:1,  max:3,  step:.1,s:1,   fmt:v=>v.toFixed(1), foot:'Guests per occupied room \u00b7 modeled' },\n    engagement:   { lab:'Engagement',       min:0,  max:40, step:1, s:1,   fmt:v=>pct0(v),      foot:'Guests using kiosk, mobile, signage CTA or AI concierge' },\n    conversion:   { lab:'Conversion',       min:0,  max:25, step:1, s:1,   fmt:v=>pct0(v),      foot:'Engaged guests who complete a transaction' },\n    avgTicket:    { lab:'Avg transaction',  min:10, max:200,step:5, s:0,   fmt:v=>'$'+v,        foot:'Blended ancillary basket \u00b7 modeled' },\n    kioskShare:   { lab:'Kiosk check-in',   min:0,  max:70, step:1, s:1,   fmt:v=>pct0(v),      foot:'Mews benchmark at U.S. kiosk hotels: 30%' },\n    los:          { lab:'Length of stay',   min:1,  max:6,  step:.1,s:0,   fmt:v=>v.toFixed(1)+' nt', foot:'Average nights per stay \u00b7 modeled' },\n  };\n  return `<div class=\"sliders\">`+keys.map(k=>{\n    const c=CFG[k], v=S[k], shown=c.s? v : v;\n    return `<div class=\"sl\"><div class=\"sl-h\"><span class=\"sl-lab\">${c.lab}<\/span><span class=\"sl-val\" id=\"v-${k}\">${c.fmt(v)}<\/span><\/div>\n      <input type=\"range\" id=\"s-${k}\" min=\"${c.min}\" max=\"${c.max}\" step=\"${c.step}\" value=\"${c.s? Math.round(v*100*100)\/100 : v}\" data-k=\"${k}\" data-scale=\"${c.s}\">\n      <div class=\"sl-f\">${c.foot}<\/div><\/div>`;\n  }).join('')+`<div class=\"sl sl-reset\"><button class=\"chip\" id=\"resetBtn\"><svg viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"><path d=\"M3 12a9 9 0 1015-6.7L21 8M21 3v5h-5\"\/><\/svg> Reset assumptions<\/button><\/div><\/div>`;\n}\nfunction scopeLabel(){ return state.prop==='all' ? 'All 7 properties' : PROPS.find(p=>p.id===state.prop).name; }\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 PAGE: OVERVIEW \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction pgOverview(){\n  const m=derive(), e=EVIDENCE[0];\n  const scen=[.10,.20,.30].map(x=>({ l:pct0(x), l2:'engagement', v:m.stays*x, k:'Engaged guests', tt:abbr1(m.stays*x) }));\n  const liveIdx = Math.abs(S.engagement-.10)<.005?0 : Math.abs(S.engagement-.20)<.005?1 : Math.abs(S.engagement-.30)<.005?2 : -1;\n\n  return `\n  ${modBanner(`An <b>illustrative model<\/b> based on guest volume and other public information \u2014 Rosen\u2019s published ${nf(m.rooms)} rooms across seven properties. Occupancy, guests per room, engagement and conversion are all <b>easily changed by moving the sliders<\/b>, and the whole model recalculates.`)}\n\n  <div class=\"bigstat\">\n    <div class=\"glow\"><\/div><div class=\"glow2\"><\/div>\n    <div class=\"bs-eye\">The signal executives should act on<\/div>\n    <div class=\"bs-num\">${e.v}<\/div>\n    <div class=\"bs-lead\">of U.S. travelers say they would skip the traditional front desk for app or kiosk check-in.<\/div>\n    <div class=\"bs-rule\"><\/div>\n    <div class=\"bs-sub\">The opportunity isn\u2019t to eliminate the front desk. It\u2019s to <b>automate the transactions so associates can focus on the relationships.<\/b><\/div>\n    <div class=\"bs-cite\">Source: <a href=\"${e.u}\" target=\"_blank\" rel=\"noopener\">${e.s}<\/a> \u00b7 82% among Gen Z travelers.<\/div>\n  <\/div>\n\n  <div style=\"height:16px\"><\/div>\n  ${sliderBar(['occupancy','guestsPerRoom','engagement','conversion','avgTicket'])}\n\n  <div class=\"chain\">\n    <div class=\"cs\"><div class=\"cs-k\">Sourced base<\/div><div class=\"cs-v tnum\">${nf(m.rooms)}<\/div>\n      <div class=\"cs-l\">Guest rooms &amp; suites<\/div><div class=\"cs-r\"><span class=\"badge-src\">Rosen published<\/span><\/div><\/div>\n    <div class=\"cs\"><div class=\"cs-k\">People<\/div><div class=\"cs-v tnum\">${abbr1(m.stays)}<\/div>\n      <div class=\"cs-l\">Modeled annual guest stays<\/div><div class=\"cs-r\">${abbr1(m.occNights)} occupied room nights<\/div><\/div>\n    <div class=\"cs\"><div class=\"cs-k\">Engage<\/div><div class=\"cs-v tnum\">${abbr1(m.engaged)}<\/div>\n      <div class=\"cs-l\">Engaged guests at ${pct0(S.engagement)}<\/div><div class=\"cs-r\">kiosk \u00b7 mobile \u00b7 signage \u00b7 AI<\/div><\/div>\n    <div class=\"cs\"><div class=\"cs-k\">Convert<\/div><div class=\"cs-v tnum\">${abbr1(m.converters)}<\/div>\n      <div class=\"cs-l\">Transacting guests at ${pct0(S.conversion)}<\/div><div class=\"cs-r\">${money0(S.avgTicket)} avg basket<\/div><\/div>\n    <div class=\"cs\"><div class=\"cs-k\">Revenue<\/div><div class=\"cs-v tnum\" style=\"color:var(--azure-d)\">${money(m.gtv)}<\/div>\n      <div class=\"cs-l\">Potential gross transaction value<\/div><div class=\"cs-r\"><span class=\"badge-mod\">Modeled<\/span><\/div><\/div>\n  <\/div>\n\n  <div style=\"height:16px\"><\/div>\n  <div class=\"kpis\">\n    <div class=\"card kpi hero\"><div class=\"glow\"><\/div>\n      <div class=\"k-label\">Total annual opportunity <span class=\"badge-mod\" style=\"color:#ffd79a;background:rgba(255,215,154,.15);border-color:rgba(255,215,154,.35)\">Modeled<\/span><\/div>\n      <div class=\"k-val tnum\">${money(m.totalOpportunity)}<\/div>\n      <div class=\"k-foot\">Ancillary GTV ${money(m.gtv)} + kiosk upsell lift ${money(m.upsellInc)} + media network ${money(m.adRev)}<\/div><\/div>\n    <div class=\"card kpi\"><div class=\"k-label\">Ancillary GTV<\/div><div class=\"k-val tnum\">${money(m.gtv)}<\/div>\n      <div class=\"k-foot\">${abbr1(m.converters)} transactions \u00d7 ${money0(S.avgTicket)}<\/div><\/div>\n    <div class=\"card kpi\"><div class=\"k-label\">Front-desk transactions in scope<\/div><div class=\"k-val tnum\">${abbr1(m.totalTx)}<\/div>\n      <div class=\"k-foot\">${abbr1(m.arrivals)} arrivals \u00b7 4.1 desk interactions per stay<\/div><\/div>\n    <div class=\"card kpi\"><div class=\"k-label\">Associate hours returned<\/div><div class=\"k-val tnum\">${nf(m.fdHoursSaved)}<\/div>\n      <div class=\"k-foot\">Hours moved from transactions to hospitality<\/div><\/div>\n  <\/div>\n\n  <div style=\"height:16px\"><\/div>\n  <div class=\"eyebrow\" style=\"margin-bottom:10px\">One connected ecosystem \u00b7 four guest moments<\/div>\n  <div class=\"pillars\">\n    ${pillar(1,'desk','Front Desk','Automation',['Self check-in &amp; check-out','ID &amp; payment capture','Key issue \/ digital key','Folio &amp; express checkout'],abbr1(m.kioskCheckins),'kiosk check-ins')}\n    ${pillar(2,'conc','Concierge','AI + Kiosk',['AI assistant, 24\/7','Recommendations &amp; itineraries','Directions &amp; transportation','Every question, measured'],abbr1(m.engaged*0.42),'concierge sessions')}\n    ${pillar(3,'hotel','Amenities','On property',[`${nf(m.venues)} dining &amp; venue outlets in scope`,'Spa, golf, pool &amp; cabanas','Events, tickets &amp; tours','Signage that sells'],money(m.gtv*0.71),'venue-led GTV')}\n    ${pillar(4,'mob','Mobile','Pre \u2192 post stay',['Pre-arrival upsell','In-stay ordering','Offers &amp; packages','Post-stay rebooking'],money(m.gtv*0.29),'mobile-led GTV')}\n  <\/div>\n\n  <div style=\"height:16px\"><\/div>\n  <div class=\"grid row-2\">\n    <div class=\"card\"><div class=\"card-h\"><div><h3>Engagement opportunity <span class=\"badge-mod\">Modeled<\/span><\/h3>\n      <div class=\"ch-sub\">Guests interacting with a kiosk, mobile experience, signage CTA or AI concierge<\/div><\/div><\/div>\n      ${barChart(scen,{h:250,fmt:abbr1,highlight:liveIdx})}\n      <div class=\"note\">Modeled from ${nf(m.rooms)} rooms, ${pct0(S.occupancy)} occupancy and ${S.guestsPerRoom.toFixed(1)} guests per occupied room. These are planning assumptions, not Rosen-reported results.<\/div>\n    <\/div>\n    <div class=\"card\"><div class=\"card-h\"><div><h3>TrueImpact chain<\/h3>\n      <div class=\"ch-sub\">People \u2192 Engage \u2192 Discover \u2192 Convert \u2192 Revenue<\/div><\/div><\/div>\n      ${funnelHTML([\n        {l:'Guest stays',        v:m.stays,          fmt:abbr1(m.stays)},\n        {l:'Engaged',            v:m.engaged,        fmt:abbr1(m.engaged)},\n        {l:'Discover an amenity',v:m.engaged*.55,    fmt:abbr1(m.engaged*.55)},\n        {l:'Convert',            v:m.converters,     fmt:abbr1(m.converters)},\n      ])}\n      <div class=\"note\">Discovery step modeled at 55% of engaged sessions reaching an amenity, offer or booking screen. Conversion is the slider value (${pct0(S.conversion)}).<\/div>\n    <\/div>\n  <\/div>\n\n  <div style=\"height:16px\"><\/div>\n  <div class=\"card\"><div class=\"card-h\"><div><h3>The evidence base <span class=\"badge-src\">Sourced<\/span><\/h3>\n    <div class=\"ch-sub\">Published industry research \u2014 not modeled, not Rosen-specific<\/div><\/div><\/div>\n    <div class=\"grid row-2\" style=\"grid-template-columns:repeat(4,1fr);gap:12px\">\n    ${EVIDENCE.map(x=>`<div class=\"seg-card\" style=\"cursor:default\">\n      <div class=\"sc-val\" style=\"font-size:36px;color:var(--azure-d)\">${x.v}<\/div>\n      <div class=\"sc-sub\" style=\"font-size:12px;color:var(--text-2);line-height:1.5;margin-top:8px\">${x.t}<\/div>\n      <div class=\"sc-count\" style=\"display:block\"><a href=\"${x.u}\" target=\"_blank\" rel=\"noopener\" style=\"color:var(--azure-d);text-decoration:underline;font-size:10.5px\">${x.s}<\/a><\/div>\n    <\/div>`).join('')}\n    <\/div>\n  <\/div>`;\n}\nfunction pillar(n,ic,t,s,items,val,vlab){\n  return `<div class=\"pillar\" data-goto=\"journey\">\n    <div class=\"p-n\">${n}<\/div>\n    <div class=\"p-ic\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${ICONS[ic]}<\/svg><\/div>\n    <div class=\"p-t\">${t}<\/div><div class=\"p-s\">${s}<\/div>\n    <ul class=\"p-l\">${items.map(i=>`<li>${i}<\/li>`).join('')}<\/ul>\n    <div class=\"p-f\"><b class=\"tnum\">${val}<\/b><span>${vlab} <span class=\"badge-mod\">Mod<\/span><\/span><\/div><\/div>`;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 PAGE: JOURNEY \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction pgJourney(){\n  const m=derive();\n  const stages=[\n    { ic:'desk', t:'1 \u00b7 Front Desk', s:'Automation',\n      lead:'Self-service doesn\u2019t replace hospitality. It frees associates to deliver it.',\n      body:`At U.S. hotels running kiosks, <b>30% of reservations<\/b> already check in through the kiosk. Applied to ${scopeLabel()}, that is <b>${abbr1(m.kioskCheckins)} kiosk check-ins<\/b> a year out of ${abbr1(m.arrivals)} modeled arrivals \u2014 and roughly <b>${nf(m.fdHoursSaved)} associate hours<\/b> returned from transaction handling to guest relationships.`,\n      kpis:[[abbr1(m.arrivals),'Modeled arrivals \/ yr'],[abbr1(m.kioskCheckins),'Kiosk check-ins'],[nf(m.fdHoursSaved),'Associate hrs returned'],[money(m.upsellInc),'Upsell lift']],\n      list:DEFLECT.map(d=>({l:d.name, v:m.totalTx*d.share, color:'var(--azure)', k:'Interactions \/ yr', tt:abbr1(m.totalTx*d.share)})) },\n    { ic:'conc', t:'2 \u00b7 Concierge', s:'AI + Kiosk + Mobile',\n      lead:'Every question a guest asks becomes a measurable, monetizable moment.',\n      body:`\u201cWhere should we eat?\u201d \u201cWhat\u2019s on tonight?\u201d \u201cHow do I get to Universal?\u201d \u201cCan I book a cabana?\u201d Today those arrive at a desk and vanish. Routed through <b>lobby kiosk \u2192 digital signage \u2192 mobile \u2192 AI concierge<\/b>, each one is answered instantly and logged \u2014 so Rosen learns what ${abbr1(m.stays)} guests a year actually want.`,\n      kpis:[[abbr1(m.engaged*0.42),'Concierge sessions'],['24\/7','Coverage'],[nf(m.venues),'Venues in scope'],['100%','Interactions measured']],\n      list:[\n        {l:'Dining recommendations', v:.28},{l:'Attractions &amp; tickets', v:.21},\n        {l:'Directions &amp; transport', v:.18},{l:'Hotel &amp; event info', v:.14},\n        {l:'Amenity booking', v:.11},{l:'Multi-language \/ ADA', v:.08},\n      ].map(d=>({l:d.l, v:m.engaged*0.42*d.v, color:'var(--deep)', k:'Sessions \/ yr', tt:abbr1(m.engaged*0.42*d.v)})) },\n    { ic:'hotel', t:'3 \u00b7 Amenities', s:'Ancillary revenue',\n      lead:'This is the largest financial opportunity in the model.',\n      body:`Rosen already owns the inventory \u2014 Shingle Creek alone lists <b>15 dining and lounging venues, a 13,000 sq ft spa and an 18-hole Arnold Palmer course<\/b>. The ecosystem becomes the digital sales layer across all of it. At ${pct0(S.engagement)} engagement and ${pct0(S.conversion)} conversion, that is <b>${money(m.gtv)}<\/b> in potential gross transaction value.`,\n      kpis:[[money(m.gtv),'Ancillary GTV'],[abbr1(m.converters),'Transactions'],['$'+S.avgTicket,'Avg basket'],['$'+m.perStay.toFixed(2),'Per guest stay']],\n      list:AMENITY_MIX.map(a=>({l:a.name, v:m.gtv*a.share, color:a.color, k:'Modeled GTV', sub:'Typical basket $'+a.ticket, tt:money(m.gtv*a.share)})) },\n    { ic:'mob', t:'4 \u00b7 Mobile', s:'Pre-arrival \u2192 post-stay',\n      lead:'The only channel that reaches the guest before they arrive and after they leave.',\n      body:`Kiosks and signage own the on-property moment. Mobile extends the same ecosystem to the <b>pre-arrival window<\/b> (where upgrade and package attachment is highest), the in-stay window, and the <b>post-stay rebooking<\/b> window \u2014 all on one measured guest record.`,\n      kpis:[[money(m.gtv*0.29),'Mobile-led GTV'],[abbr1(m.engaged*0.31),'Mobile sessions'],['4','Journey windows'],['1','Guest record']],\n      list:[\n        {l:'Pre-arrival upsell &amp; upgrade', v:.34},{l:'In-stay ordering &amp; booking', v:.29},\n        {l:'Offers &amp; packages', v:.22},{l:'Post-stay rebooking', v:.15},\n      ].map(d=>({l:d.l, v:m.gtv*0.29*d.v, color:'var(--azure)', k:'Modeled GTV', tt:money(m.gtv*0.29*d.v)})) },\n  ];\n\n  return `\n  ${head('The digital guest journey','Front Desk \u2192 Concierge \u2192 Amenities \u2192 Mobile',`${scopeLabel()}<br>${nf(m.rooms)} rooms \u00b7 ${m.kiosks} kiosks \u00b7 ${m.screens} screens`)}\n  ${modBanner(`Volumes on this page derive from the same modeled base as the overview. The channel splits (concierge session mix, mobile share, front-desk interaction mix) are <b>TrueOmni planning assumptions<\/b> drawn from comparable deployments \u2014 not Rosen data.`)}\n  ${sliderBar(['engagement','conversion','avgTicket','kioskShare'])}\n  ${stages.map(st=>`\n    <div class=\"card\" style=\"margin-bottom:16px\">\n      <div style=\"display:flex;gap:14px;align-items:flex-start\">\n        <div class=\"p-ic\" style=\"flex:none\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${ICONS[st.ic]}<\/svg><\/div>\n        <div style=\"flex:1\">\n          <div class=\"eyebrow\" style=\"font-size:10.5px\">${st.s}<\/div>\n          <h3 style=\"font-size:19px;letter-spacing:-.02em;margin-top:2px\">${st.t}<\/h3>\n          <div class=\"quote\" style=\"margin-top:12px\">${st.lead}<span>${st.body}<\/span><\/div>\n        <\/div>\n      <\/div>\n      <div class=\"deflect\" style=\"margin-top:16px\">\n        ${st.kpis.map(k=>`<div class=\"d\"><b class=\"tnum\">${k[0]}<\/b><span>${k[1]}<\/span><\/div>`).join('')}\n      <\/div>\n      <div style=\"margin-top:16px\">${hbarChart(st.list,{lw:210})}<\/div>\n    <\/div>`).join('')}`;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 PAGE: REVENUE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction pgRevenue(){\n  const m=derive();\n  const ENG=[.10,.20,.30], CNV=[.05,.10,.15];\n  const cell=(e,c)=>m.stays*e*c*S.avgTicket;\n  const mix=AMENITY_MIX.map(a=>({l:a.name, v:m.gtv*a.share, color:a.color, k:'Modeled GTV', tt:money(m.gtv*a.share)}));\n\n  return `\n  ${head('Sensitivity model','What becomes possible when engagement is measured',`${scopeLabel()}<br>${abbr1(m.stays)} modeled guest stays`)}\n  ${modBanner(`This is a <b>sensitivity model, not a revenue forecast.<\/b> It shows the range Rosen would be operating in at different engagement and conversion levels. No cell on this page is a commitment or a projection of Rosen results.`)}\n  ${sliderBar(['occupancy','guestsPerRoom','los','engagement','conversion','avgTicket'])}\n\n  <div class=\"kpis\">\n    <div class=\"card kpi hero\"><div class=\"glow\"><\/div><div class=\"k-label\">Potential gross transaction value<\/div>\n      <div class=\"k-val tnum\">${money(m.gtv)}<\/div>\n      <div class=\"k-foot\">${abbr1(m.stays)} stays \u00d7 ${pct0(S.engagement)} engaged \u00d7 ${pct0(S.conversion)} converted \u00d7 ${money0(S.avgTicket)}<\/div><\/div>\n    <div class=\"card kpi\"><div class=\"k-label\">Per guest stay<\/div><div class=\"k-val tnum\">$${m.perStay.toFixed(2)}<\/div>\n      <div class=\"k-foot\">Blended across every guest, engaged or not<\/div><\/div>\n    <div class=\"card kpi\"><div class=\"k-label\">Per available room \/ yr<\/div><div class=\"k-val tnum\">$${nf(m.perRoom)}<\/div>\n      <div class=\"k-foot\">Ancillary GTV \u00f7 ${nf(m.rooms)} rooms<\/div><\/div>\n    <div class=\"card kpi\"><div class=\"k-label\">Transacting guests<\/div><div class=\"k-val tnum\">${abbr1(m.converters)}<\/div>\n      <div class=\"k-foot\">${pct(S.engagement*S.conversion)} of all modeled guest stays<\/div><\/div>\n  <\/div>\n\n  <div style=\"height:16px\"><\/div>\n  <div class=\"grid row-2\">\n    <div class=\"card\"><div class=\"card-h\"><div><h3>Sensitivity grid <span class=\"badge-mod\">Modeled<\/span><\/h3>\n      <div class=\"ch-sub\">Engagement \u00d7 conversion at a ${money0(S.avgTicket)} average transaction \u00b7 the live slider position is outlined<\/div><\/div><\/div>\n      <table class=\"sens\"><thead><tr><th class=\"rh\">Engagement<\/th>${CNV.map(c=>`<th>${pct0(c)} conversion<\/th>`).join('')}<\/tr><\/thead>\n      <tbody>${ENG.map(e=>`<tr><td class=\"rh\">${pct0(e)}<span style=\"text-transform:none;letter-spacing:0\">${abbr1(m.stays*e)} guests<\/span><\/td>\n        ${CNV.map(c=>{\n          const live = Math.abs(S.engagement-e)<.005 && Math.abs(S.conversion-c)<.005;\n          return `<td class=\"${live?'live':''}\" data-tt=\"<div class='tt-t'>${pct0(e)} engagement \u00b7 ${pct0(c)} conversion<\/div><div class='tt-r'><span>Engaged<\/span><b>${abbr1(m.stays*e)}<\/b><\/div><div class='tt-r'><span>Transactions<\/span><b>${abbr1(m.stays*e*c)}<\/b><\/div><div class='tt-r'><span>GTV<\/span><b>${money(cell(e,c))}<\/b><\/div>\">${money(cell(e,c))}<span>${abbr1(m.stays*e*c)} tx<\/span><\/td>`;\n        }).join('')}<\/tr>`).join('')}<\/tbody><\/table>\n      <div class=\"note\">Read this as a range, not a target. The point of the grid is that <b>measurement moves Rosen from the top-left cell toward the bottom-right<\/b> \u2014 the difference between the corners is ${money(cell(.30,.15)-cell(.10,.05))} of annual transaction value on the same guest base.<\/div>\n    <\/div>\n    <div class=\"card\"><div class=\"card-h\"><div><h3>Where the revenue lands<\/h3>\n      <div class=\"ch-sub\">Modeled amenity mix at ${money(m.gtv)} GTV<\/div><\/div><\/div>\n      ${hbarChart(mix,{lw:200})}\n      <div style=\"margin-top:14px\">${stackBar(mix,{h:38})}<\/div>\n      <div class=\"amen\" style=\"margin-top:12px\">${AMENITY_MIX.map(a=>`<span class=\"a\"><i style=\"background:${a.color}\"><\/i>${a.name} <em>${pct0(a.share)}<\/em><\/span>`).join('')}<\/div>\n      <div class=\"note\">Mix is a TrueOmni planning assumption based on comparable resort deployments, weighted toward Rosen\u2019s actual venue inventory (${nf(m.venues)} outlets in scope). Rosen\u2019s real outlet-level revenue split would replace it.<\/div>\n    <\/div>\n  <\/div>\n\n  <div style=\"height:16px\"><\/div>\n  <div class=\"card\"><div class=\"card-h\"><div><h3>Engagement curve <span class=\"badge-mod\">Modeled<\/span><\/h3>\n    <div class=\"ch-sub\">GTV across the full engagement range at ${pct0(S.conversion)} conversion and ${money0(S.avgTicket)} average transaction<\/div><\/div><\/div>\n    ${(()=>{const labs=[],v1=[],v2=[],v3=[];\n      for(let e=0;e<=40;e+=5){ labs.push(e+'%');\n        v1.push(m.stays*(e\/100)*.05*S.avgTicket); v2.push(m.stays*(e\/100)*.10*S.avgTicket); v3.push(m.stays*(e\/100)*.15*S.avgTicket);}\n      return lineChart([\n        {name:'15% conversion',v:v3,color:'var(--azure)'},\n        {name:'10% conversion',v:v2,color:'var(--deep)'},\n        {name:'5% conversion', v:v1,color:'var(--s-attractions)'},\n      ],labs,{h:250,fmt:money});})()}\n    <div class=\"legend\"><span class=\"li\"><span class=\"sw\" style=\"background:var(--azure)\"><\/span>15% conversion<\/span>\n      <span class=\"li\"><span class=\"sw\" style=\"background:var(--deep)\"><\/span>10% conversion<\/span>\n      <span class=\"li\"><span class=\"sw\" style=\"background:var(--s-attractions)\"><\/span>5% conversion<\/span><\/div>\n  <\/div>`;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 PAGE: OPS \/ FRONT DESK \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction pgOps(){\n  const m=derive();\n  const rows=DEFLECT.map(d=>({l:d.name, v:m.totalTx*d.share, color:'var(--azure)', k:'Interactions \/ yr', tt:abbr1(m.totalTx*d.share)}));\n  const shares=[.15,.30,.45,.60].map(x=>({l:pct0(x), l2:'kiosk share', v:m.arrivals*x*S.fdMinutes\/60\/3, k:'Associate hours returned', tt:abbr1(m.arrivals*x*S.fdMinutes\/60\/3)}));\n  return `\n  ${head('Operational opportunity','Automate the transaction. Keep the hospitality.',`${scopeLabel()}<br>${abbr1(m.arrivals)} modeled arrivals \/ yr`)}\n  ${modBanner(`Arrivals derive from occupied room nights \u00f7 a modeled ${S.los.toFixed(1)}-night average stay. The interaction mix and the ${S.fdMinutes.toFixed(1)}-minute front-desk handling time are <b>TrueOmni planning assumptions<\/b>. The 30% kiosk share and the one-third time reduction are <a href=\"https:\/\/www.mews.com\/en\/blog\/hotel-check-in-experience\" target=\"_blank\" rel=\"noopener\" style=\"color:var(--azure-d)\">published Mews benchmarks<\/a>, not Rosen measurements.`)}\n  ${sliderBar(['occupancy','los','kioskShare'])}\n\n  <div class=\"kpis\">\n    <div class=\"card kpi hero\"><div class=\"glow\"><\/div><div class=\"k-label\">Associate hours returned to hospitality<\/div>\n      <div class=\"k-val tnum\">${nf(m.fdHoursSaved)}<\/div>\n      <div class=\"k-foot\">${abbr1(m.kioskCheckins)} kiosk check-ins \u00d7 ${S.fdMinutes.toFixed(1)} min \u00d7 one-third time reduction<\/div><\/div>\n    <div class=\"card kpi\"><div class=\"k-label\">Front-desk interactions in scope<\/div><div class=\"k-val tnum\">${abbr1(m.totalTx)}<\/div>\n      <div class=\"k-foot\">4.1 desk touches per modeled stay<\/div><\/div>\n    <div class=\"card kpi\"><div class=\"k-label\">Kiosk check-ins<\/div><div class=\"k-val tnum\">${abbr1(m.kioskCheckins)}<\/div>\n      <div class=\"k-foot\">At ${pct0(S.kioskShare)} of ${abbr1(m.arrivals)} arrivals<\/div><\/div>\n    <div class=\"card kpi\"><div class=\"k-label\">Kiosk upsell lift<\/div><div class=\"k-val tnum\">${money(m.upsellInc)}<\/div>\n      <div class=\"k-foot\">Nearly 70% more upsell revenue per kiosk check-in<\/div><\/div>\n  <\/div>\n\n  <div style=\"height:16px\"><\/div>\n  <div class=\"grid row-2\">\n    <div class=\"card\"><div class=\"card-h\"><div><h3>What moves off the desk <span class=\"badge-mod\">Modeled<\/span><\/h3>\n      <div class=\"ch-sub\">Annual interaction volume by type \u00b7 all seven categories are kiosk, mobile or AI-concierge addressable<\/div><\/div><\/div>\n      ${hbarChart(rows,{lw:215})}\n      <div class=\"note\">This is not a headcount-reduction argument. It is a <b>reallocation<\/b> argument: ${abbr1(m.totalTx)} transactional interactions a year currently consume associate attention that could go to the guests who actually want a human.<\/div>\n    <\/div>\n    <div class=\"card\"><div class=\"card-h\"><div><h3>Hours returned by kiosk adoption<\/h3>\n      <div class=\"ch-sub\">Associate hours freed as kiosk check-in share rises<\/div><\/div><\/div>\n      ${barChart(shares,{h:250,fmt:abbr1})}\n      <div class=\"note\">The 30% column is the published Mews benchmark for U.S. hotels running kiosks. 60% is included only to show the shape of the curve \u2014 it is not a claim about achievable adoption.<\/div>\n    <\/div>\n  <\/div>\n\n  <div style=\"height:16px\"><\/div>\n  <div class=\"card\"><div class=\"ai-banner\" style=\"margin:0\">\n    <div class=\"ai-ic\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"${'M12 3l1.9 5.6L19.5 10l-5.6 1.9L12 17.5l-1.9-5.6L4.5 10l5.6-1.4L12 3z'}\"\/><\/svg><\/div>\n    <div class=\"ai-txt\"><span class=\"ai-tag\">The executive read<\/span>\n      Rosen\u2019s culture is the product \u2014 <b>the Rosen Way<\/b> is built on associate wellbeing and exceptional guest service. That is exactly why the automation case here is framed as <span class=\"em\">reallocation, not replacement<\/span>. At ${pct0(S.kioskShare)} kiosk adoption the model returns <b>${nf(m.fdHoursSaved)} associate hours a year<\/b> from folio printing and direction-giving to the interactions guests remember \u2014 while the same kiosks generate <b>${money(m.upsellInc)}<\/b> in upsell lift that a queue at the desk never captures.<\/div>\n  <\/div><\/div>`;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 PAGE: MEDIA \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction pgMedia(){\n  const m=derive();\n  const fmts=MEDIA.formats.map(f=>({l:f.name, v:m.adRev*f.share, color:f.color, k:'Modeled ad revenue', tt:money(m.adRev*f.share)}));\n  const bands=[\n    {l:'Floor',  l2:'$200\/screen\/mo', v:m.adBand.floor,  tt:money(m.adBand.floor)},\n    {l:'Mid',    l2:'$450\/screen\/mo', v:m.adBand.mid,    tt:money(m.adBand.mid), color:'var(--azure)'},\n    {l:'Strong', l2:'$800\/screen\/mo', v:m.adBand.strong, tt:money(m.adBand.strong)},\n  ];\n  return `\n  ${head('Omni Media Network','Screens that inform \u2014 and sell',`${scopeLabel()}<br>${m.kiosks} kiosks \u00b7 ${m.screens} screens`)}\n  ${modBanner(`<b>Kiosks transact; signage broadcasts.<\/b> Screen impressions on this page are reach \u2014 they are deliberately <b>not<\/b> fed into the engagement, conversion or GTV figures elsewhere in this dashboard, so nothing is double-counted. Screen counts and the rate card are TrueOmni planning assumptions pending Rosen\u2019s real screen inventory and any existing media agreements.`)}\n\n  <div class=\"kpis\">\n    <div class=\"card kpi hero\"><div class=\"glow\"><\/div><div class=\"k-label\">Total advertising revenue potential<\/div>\n      <div class=\"k-val tnum\">${money(m.adRev)}<\/div>\n      <div class=\"k-foot\">${m.screens} screens at the mid band \u00b7 ${pct0(MEDIA.fillMature)} mature fill rate<\/div><\/div>\n    <div class=\"card kpi\"><div class=\"k-label\">Screen impressions \/ yr<\/div><div class=\"k-val tnum\">${abbr1(m.impressions)}<\/div>\n      <div class=\"k-foot\">${abbr1(m.reach)} reach \u00d7 ${MEDIA.imprPerPasserby} impressions per pass<\/div><\/div>\n    <div class=\"card kpi\"><div class=\"k-label\">Effective CPM<\/div><div class=\"k-val tnum\">$${m.cpm.toFixed(2)}<\/div>\n      <div class=\"k-foot\">${MEDIA.dwellSec}s average dwell \u00b7 ${m.spotsPerLoop} spots per ${MEDIA.loopSec}s loop<\/div><\/div>\n    <div class=\"card kpi\"><div class=\"k-label\">Revenue per screen \/ yr<\/div><div class=\"k-val tnum\">$${nf(m.screens? m.adRev\/m.screens : 0)}<\/div>\n      <div class=\"k-foot\">Share of voice ${pct(1\/m.spotsPerLoop)} per advertiser<\/div><\/div>\n  <\/div>\n\n  <div style=\"height:16px\"><\/div>\n  <div class=\"grid row-2\">\n    <div class=\"card\"><div class=\"card-h\"><div><h3>Revenue by screen format <span class=\"badge-mod\">Modeled<\/span><\/h3>\n      <div class=\"ch-sub\">At the mid rate band across ${m.screens} screens<\/div><\/div><\/div>\n      ${hbarChart(fmts,{lw:210})}\n      <div style=\"margin-top:14px\">${stackBar(fmts,{h:38})}<\/div>\n    <\/div>\n    <div class=\"card\"><div class=\"card-h\"><div><h3>Rate band sensitivity<\/h3>\n      <div class=\"ch-sub\">Annual advertising revenue at three $\/screen\/month bands<\/div><\/div><\/div>\n      ${barChart(bands,{h:250,fmt:money,highlight:1})}\n      <div class=\"note\">Rosen\u2019s own venues, spa, golf and events are the first advertisers on this network \u2014 which means much of this value can be captured as internal cross-promotion before a single third-party advertiser is sold.<\/div>\n    <\/div>\n  <\/div>\n\n  <div style=\"height:16px\"><\/div>\n  <div class=\"card\"><div class=\"card-h\"><div><h3>Network build by property <span class=\"badge-mod\">Modeled<\/span><\/h3>\n    <div class=\"ch-sub\">Suggested kiosk and screen distribution, weighted by rooms and venue density<\/div><\/div><\/div>\n    <table><thead><tr><th>Property<\/th><th>Class<\/th><th>Rooms<\/th><th>Kiosks<\/th><th>Screens<\/th><th>Phase<\/th><th>Screens \/ kiosk<\/th><\/tr><\/thead>\n    <tbody>${PROPS.map(p=>`<tr><td><b>${p.name}<\/b><\/td><td style=\"text-align:left;color:var(--text-2)\">${p.cls}<\/td>\n      <td class=\"tnum\">${nf(p.rooms)}<\/td><td class=\"tnum\">${p.kiosks}<\/td><td class=\"tnum\">${p.screens}<\/td>\n      <td><span class=\"pill ${p.phase===1?'tag-hi':'tag-mid'}\">Phase ${p.phase}<\/span><\/td>\n      <td class=\"tnum\">${(p.screens\/p.kiosks).toFixed(1)}<\/td><\/tr>`).join('')}\n      <tr style=\"font-weight:800\"><td>Total<\/td><td><\/td><td class=\"tnum\">${nf(PROPS.reduce((a,p)=>a+p.rooms,0))}<\/td>\n      <td class=\"tnum\">${PROPS.reduce((a,p)=>a+p.kiosks,0)}<\/td><td class=\"tnum\">${PROPS.reduce((a,p)=>a+p.screens,0)}<\/td><td><\/td><td><\/td><\/tr>\n    <\/tbody><\/table>\n    <div class=\"note\">Phase 1 is the three convention hotels \u2014 the fastest proof, highest arrival density and the guests most likely to self-serve. Phase 2\u20133 extends to the leisure inns.<\/div>\n  <\/div>`;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 PAGE: PROPERTIES \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction pgProps(){\n  const rows=PROPS.map(p=>{\n    const stays=p.rooms*365*S.occupancy*S.guestsPerRoom;\n    const gtv=stays*S.engagement*S.conversion*S.avgTicket;\n    return {...p, stays, gtv};\n  }).sort((a,b)=>b.gtv-a.gtv);\n  const tot=rows.reduce((a,r)=>({rooms:a.rooms+r.rooms,stays:a.stays+r.stays,gtv:a.gtv+r.gtv,k:a.k+r.kiosks,s:a.s+r.screens}),{rooms:0,stays:0,gtv:0,k:0,s:0});\n  return `\n  ${head('Portfolio','Seven properties \u00b7 one connected ecosystem',`${nf(tot.rooms)} rooms \u00b7 Greater Orlando`)}\n  ${modBanner(`Room counts are <b>sourced from each property\u2019s own published fact sheet<\/b> (linked in the table). Guest stays and GTV are modeled by applying the portfolio-wide occupancy and engagement assumptions uniformly to each property \u2014 in reality a convention hotel and a leisure inn will differ, and Rosen\u2019s property-level occupancy would sharpen this materially.`)}\n  ${sliderBar(['occupancy','guestsPerRoom','engagement','conversion','avgTicket'])}\n  <div class=\"card\"><div class=\"card-h\"><div><h3>Property detail<\/h3>\n    <div class=\"ch-sub\">Click any row to scope the whole dashboard to that property<\/div><\/div><\/div>\n    <table><thead><tr><th>Property<\/th><th>Class<\/th><th>Rooms<\/th><th>Venues<\/th><th>Modeled stays<\/th><th>Modeled GTV<\/th><th>Kiosks<\/th><th>Screens<\/th><th>Source<\/th><\/tr><\/thead>\n    <tbody>${rows.map(r=>`<tr data-prop=\"${r.id}\">\n      <td><b>${r.name}<\/b><div style=\"font-size:11px;color:var(--muted);font-weight:600;margin-top:2px;max-width:330px;line-height:1.4\">${r.note}<\/div><\/td>\n      <td style=\"text-align:left;color:var(--text-2)\">${r.cls}<\/td>\n      <td class=\"tnum\">${nf(r.rooms)}<\/td><td class=\"tnum\">${r.venues}<\/td>\n      <td class=\"tnum\">${abbr1(r.stays)}<\/td><td class=\"tnum\"><b>${money(r.gtv)}<\/b><\/td>\n      <td class=\"tnum\">${r.kiosks}<\/td><td class=\"tnum\">${r.screens}<\/td>\n      <td><a href=\"${r.src}\" target=\"_blank\" rel=\"noopener\" style=\"color:var(--azure-d);text-decoration:underline;font-size:11px\">fact sheet<\/a><\/td><\/tr>`).join('')}\n      <tr style=\"font-weight:800\"><td>Portfolio total<\/td><td><\/td><td class=\"tnum\">${nf(tot.rooms)}<\/td>\n      <td class=\"tnum\">${PROPS.reduce((a,p)=>a+p.venues,0)}<\/td>\n      <td class=\"tnum\">${abbr1(tot.stays)}<\/td><td class=\"tnum\">${money(tot.gtv)}<\/td>\n      <td class=\"tnum\">${tot.k}<\/td><td class=\"tnum\">${tot.s}<\/td><td><\/td><\/tr>\n    <\/tbody><\/table>\n  <\/div>\n  <div style=\"height:16px\"><\/div>\n  <div class=\"grid row-2\">\n    <div class=\"card\"><div class=\"card-h\"><div><h3>Modeled GTV by property<\/h3><div class=\"ch-sub\">At current slider settings<\/div><\/div><\/div>\n      ${hbarChart(rows.map(r=>({l:r.name.replace('Rosen ','').replace('Inn closest to Universal','Inn \u00b7 Universal').replace('Inn at Pointe Orlando','Inn \u00b7 Pointe'), v:r.gtv, color:r.phase===1?'var(--azure)':'var(--deep)', k:'Modeled GTV', sub:nf(r.rooms)+' rooms', tt:money(r.gtv)})),{lw:170,fmt:money})}\n    <\/div>\n    <div class=\"card\"><div class=\"card-h\"><div><h3>Where the rooms are<\/h3><div class=\"ch-sub\">Sourced room counts \u00b7 ${nf(tot.rooms)} total<\/div><\/div><\/div>\n      ${hbarChart(rows.map(r=>({l:r.name.replace('Rosen ','').replace('Inn closest to Universal','Inn \u00b7 Universal').replace('Inn at Pointe Orlando','Inn \u00b7 Pointe'), v:r.rooms, color:'var(--s-state)', k:'Rooms', tt:nf(r.rooms)})),{lw:170,fmt:nf})}\n      <div class=\"note\">Convention hotels (Shingle Creek, Centre, Plaza) hold ${pct((1501+1334+800)\/6338)} of the rooms and effectively all of the ~744,000 sq ft of meeting space \u2014 which is why they lead the phasing.<\/div>\n    <\/div>\n  <\/div>`;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 PAGE: METHOD \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction pgMethod(){\n  const m=derive();\n  const L=[\n    ['Guest rooms &amp; suites','6,338','SOURCED','Sum of seven published property fact sheets; matches Rosen\u2019s own corporate copy.','https:\/\/www.rosenshinglecreek.com\/about-us\/','src'],\n    ['Properties','7','SOURCED','rosenhotels.com \u2014 \u201cseven hotel properties serving greater Orlando.\u201d','https:\/\/www.rosenhotels.com\/our-brands\/','src'],\n    ['Shingle Creek venues \/ spa \/ golf','15 venues \u00b7 13,000 sq ft \u00b7 18 holes','SOURCED','Verbatim on the Shingle Creek fact sheet (Arnold Palmer Design Company course).','https:\/\/www.rosenshinglecreek.com\/about-us\/fact-sheet\/','src'],\n    ['Portfolio meeting space','~744,000 sq ft','SOURCED','Sum of the three convention hotels\u2019 published figures; corroborated by trade press (\u201cmore than 740,000 sq ft\u201d).','https:\/\/www.rosencentre.com\/about-us\/hotel-fact-sheet\/','src'],\n    ['Traveler kiosk preference','70% \u00b7 82% Gen Z','SOURCED','Mews \/ Talker Research, 2,000 U.S. travelers, Apr\u2013May 2025.','https:\/\/www.mews.com\/en\/press\/the-rise-of-self-check-in-hotels','src'],\n    ['Kiosk check-in share','30% (U.S.)','SOURCED','Mews operational data, Jun 2025 \u2014 vs a 20% global average.','https:\/\/www.mews.com\/en\/blog\/hotel-check-in-experience','src'],\n    ['Kiosk upsell effect','3\u00d7 likelihood \u00b7 ~70% more revenue','SOURCED','Mews kiosk product data.','https:\/\/www.mews.com\/en\/products\/check-in-kiosk','src'],\n    ['Occupancy',pct0(S.occupancy),'MODELED','Planning assumption. Rosen has not provided occupancy. This is the single input that most changes every number on this dashboard.','','mod'],\n    ['Guests per occupied room',S.guestsPerRoom.toFixed(1),'MODELED','Planning assumption reflecting an Orlando leisure\/convention blend.','','mod'],\n    ['Average length of stay',S.los.toFixed(1)+' nights','MODELED','Planning assumption; drives the arrivals and therefore all front-desk figures.','','mod'],\n    ['Engagement rate',pct0(S.engagement),'MODELED','Share of guest stays that touch a kiosk, mobile experience, signage CTA or AI concierge. Presented as a 10\/20\/30% range, never a single claim.','','mod'],\n    ['Conversion rate',pct0(S.conversion),'MODELED','Share of engaged guests who transact. Presented as a 5\/10\/15% range.','','mod'],\n    ['Average transaction',money0(S.avgTicket),'MODELED','Blended ancillary basket across dining, spa, golf, tickets, transport and upgrades.','','mod'],\n    ['Amenity revenue mix','7 categories','MODELED','TrueOmni assumption from comparable resort deployments, weighted to Rosen\u2019s venue inventory. Rosen\u2019s outlet-level revenue split would replace it.','','mod'],\n    ['Front-desk handling time',S.fdMinutes.toFixed(1)+' min','MODELED','Associate minutes per front-desk check-in.','','mod'],\n    ['Desk interactions per stay','4.1','MODELED','Check-in, check-out, plus directions\/FAQ\/booking touches.','','mod'],\n    ['Kiosk &amp; screen counts',m.kiosks+' kiosks \u00b7 '+m.screens+' screens','MODELED','Suggested Phase 1\u20133 network sized to rooms and venue density. Not a quote, not a scope document.','','mod'],\n    ['Media rate card','$200 \/ $450 \/ $800 per screen\/mo','MODELED','Floor \/ mid \/ strong bands at 65% mature fill. Rosen\u2019s existing media agreements would supersede.','','mod'],\n  ];\n  return `\n  ${head('Methodology','Every number, and where it came from','Sourced vs modeled \u00b7 full ledger')}\n  ${modBanner(`This dashboard is a <b>sensitivity model built on Rosen\u2019s published room count<\/b>. It contains no Rosen occupancy, guest, revenue or performance data, because none was provided. Nothing here should be read as a forecast of Rosen results.`)}\n\n  <div class=\"card\"><div class=\"card-h\"><div><h3>Provenance ledger<\/h3>\n    <div class=\"ch-sub\">${L.filter(r=>r[5]==='src').length} sourced inputs \u00b7 ${L.filter(r=>r[5]==='mod').length} modeled assumptions<\/div><\/div><\/div>\n    <table class=\"ledger\"><thead><tr><th>Input<\/th><th class=\"num\">Value<\/th><th>Basis<\/th><th>Note<\/th><\/tr><\/thead>\n    <tbody>${L.map(r=>`<tr style=\"cursor:default\"><td>${r[0]}<\/td><td class=\"num\">${r[1]}<\/td>\n      <td><span class=\"badge-${r[5]==='src'?'src':'mod'}\">${r[2]}<\/span><\/td>\n      <td style=\"max-width:520px;line-height:1.5;color:var(--text-2)\">${r[3]}${r[4]?` <a href=\"${r[4]}\" target=\"_blank\" rel=\"noopener\">source<\/a>`:''}<\/td><\/tr>`).join('')}\n    <\/tbody><\/table>\n  <\/div>\n\n  <div style=\"height:16px\"><\/div>\n  <div class=\"grid row-2\">\n    <div class=\"card\"><div class=\"card-h\"><div><h3>The calculation chain<\/h3><div class=\"ch-sub\">Reproducible from the sourced base<\/div><\/div><\/div>\n      <table><tbody>\n        <tr style=\"cursor:default\"><td>Rooms <span class=\"badge-src\">Sourced<\/span><\/td><td class=\"tnum\">${nf(m.rooms)}<\/td><\/tr>\n        <tr style=\"cursor:default\"><td>\u00d7 365 = room nights available<\/td><td class=\"tnum\">${nf(m.roomNights)}<\/td><\/tr>\n        <tr style=\"cursor:default\"><td>\u00d7 ${pct0(S.occupancy)} occupancy = occupied room nights<\/td><td class=\"tnum\">${nf(m.occNights)}<\/td><\/tr>\n        <tr style=\"cursor:default\"><td>\u00d7 ${S.guestsPerRoom.toFixed(1)} guests\/room = <b>guest stays<\/b><\/td><td class=\"tnum\"><b>${nf(m.stays)}<\/b><\/td><\/tr>\n        <tr style=\"cursor:default\"><td>\u00f7 ${S.los.toFixed(1)} nights = arrivals (check-in events)<\/td><td class=\"tnum\">${nf(m.arrivals)}<\/td><\/tr>\n        <tr style=\"cursor:default\"><td>\u00d7 ${pct0(S.engagement)} engagement = engaged guests<\/td><td class=\"tnum\">${nf(m.engaged)}<\/td><\/tr>\n        <tr style=\"cursor:default\"><td>\u00d7 ${pct0(S.conversion)} conversion = transactions<\/td><td class=\"tnum\">${nf(m.converters)}<\/td><\/tr>\n        <tr style=\"cursor:default\"><td>\u00d7 ${money0(S.avgTicket)} = <b>potential GTV<\/b><\/td><td class=\"tnum\"><b>${money0(Math.round(m.gtv))}<\/b><\/td><\/tr>\n      <\/tbody><\/table>\n    <\/div>\n    <div class=\"card\"><div class=\"card-h\"><div><h3>What would sharpen this<\/h3>\n      <div class=\"ch-sub\">Five Rosen inputs that would replace modeled assumptions with fact<\/div><\/div><\/div>\n      <div class=\"deflect\" style=\"grid-template-columns:1fr\">\n        <div class=\"d\"><b>1 \u00b7 Occupancy &amp; ADR by property<\/b><span>Replaces the single largest modeled input and makes every downstream figure Rosen\u2019s own.<\/span><\/div>\n        <div class=\"d\"><b>2 \u00b7 Average guests per occupied room<\/b><span>Convention and leisure properties differ sharply; one blended number understates the inns.<\/span><\/div>\n        <div class=\"d\"><b>3 \u00b7 Current ancillary revenue by outlet<\/b><span>Turns the modeled amenity mix into a real baseline, so the model measures lift rather than absolute value.<\/span><\/div>\n        <div class=\"d\"><b>4 \u00b7 Front-desk staffing &amp; handling times<\/b><span>Converts \u201cassociate hours returned\u201d into a labor figure Rosen\u2019s own operators recognize.<\/span><\/div>\n        <div class=\"d\"><b>5 \u00b7 Existing screen inventory &amp; media agreements<\/b><span>Determines how much of the media network is net-new revenue versus re-platformed inventory.<\/span><\/div>\n      <\/div>\n      <div class=\"note\">With those five inputs this stops being an illustration and becomes a Rosen-specific business case.<\/div>\n    <\/div>\n  <\/div>`;\n}\n\n\/* ---------- router ---------- *\/\nconst RENDER = { overview:pgOverview, journey:pgJourney, revenue:pgRevenue, ops:pgOps, media:pgMedia, props:pgProps, method:pgMethod };\n\nfunction render(){\n  const app=$('#app');\n  app.innerHTML=`<div class=\"fade\">${RENDER[state.page]()}<\/div>`;\n  bindTT(app);\n\n  \/\/ sliders\n  app.querySelectorAll('input[type=range]').forEach(inp=>{\n    inp.addEventListener('input',()=>{\n      const k=inp.dataset.k, scale=inp.dataset.scale==='1';\n      S[k] = scale ? (+inp.value)\/100 : (+inp.value);\n      render();\n      const nx=$('#'+inp.id); if(nx){ nx.focus({preventScroll:true}); }\n    });\n  });\n  const rb=$('#resetBtn'); if(rb) rb.addEventListener('click',()=>{ S={...DEF}; render(); });\n\n  \/\/ pillar \/ row navigation\n  app.querySelectorAll('[data-goto]').forEach(el=>el.addEventListener('click',()=>{ state.page=el.dataset.goto; nav(); }));\n  app.querySelectorAll('[data-prop]').forEach(el=>el.addEventListener('click',()=>{\n    state.prop=el.dataset.prop; $('#propSel').value=state.prop; state.page='overview'; nav();\n  }));\n}\nfunction nav(){\n  $('#navSel').innerHTML = PAGES.map(p=>`<button data-p=\"${p.id}\" class=\"${state.page===p.id?'on':''}\">${p.label}<\/button>`).join('');\n  $$('#navSel button').forEach(b=>b.addEventListener('click',()=>{ state.page=b.dataset.p; nav(); window.scrollTo({top:0,behavior:'smooth'}); }));\n  render();\n}\nfunction boot(){\n  $('#propSel').innerHTML = `<option value=\"all\">All 7 properties \u00b7 6,338 rooms<\/option>`+\n    PROPS.map(p=>`<option value=\"${p.id}\">${p.name} \u00b7 ${nf(p.rooms)}<\/option>`).join('');\n  $('#propSel').addEventListener('change',e=>{ state.prop=e.target.value; render(); });\n  $('#themeBtn').addEventListener('click',()=>{\n    const h=document.documentElement;\n    h.dataset.theme = h.dataset.theme==='dark'?'light':'dark'; render();\n  });\n  $('#printBtn').addEventListener('click',()=>window.print());\n  nav();\n}\nboot();\n<\/script>\n<\/body>\n<\/html>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Rosen Hotels &amp; Resorts \u00b7 TrueImpact \u00b7 Digital Guest Journey TrueImpactHospitality \u00b7 Guest Journey MODELED \u00b7 ILLUSTRATIVE Sensitivity model Export TrueOmni TrueImpact \u00b7 Rosen Hotels &amp; Resorts \u00b7 Digital Guest Journey sensitivity model Illustrative planning model \u00b7 not a revenue forecast \u00b7 not Rosen-reported performance<\/p>","protected":false},"author":11,"featured_media":57099,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"_acf_changed":false,"inline_featured_image":false,"postBodyCss":"","postBodyMargin":[],"postBodyPadding":[],"postBodyBackground":{"backgroundType":"classic","gradient":""},"_thinkrank_schema_form_data":"","_thinkrank_selected_schema_type":"","_thinkrank_additional_schemas":"","_thinkrank_canonical_url":"","_thinkrank_og_title":"","_thinkrank_og_description":"","_thinkrank_og_image":"","_thinkrank_twitter_title":"","_thinkrank_twitter_description":"","_thinkrank_twitter_image":"","_thinkrank_imported_from":"","_thinkrank_focus_keywords":[],"_thinkrank_focus_keyword":"","_thinkrank_robots_meta_enabled":0,"_thinkrank_robots_meta":"[]","_thinkrank_advanced_robots_meta":"[]","_thinkrank_exclude_from_search":0,"_thinkrank_exclude_from_archives":0,"_thinkrank_primary_category":0,"footnotes":""},"class_list":["post-58310","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.9 (Yoast SEO v28.7) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>RosenHotels - TrueOmni<\/title>\n<meta name=\"description\" content=\"Rosen Hotels\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/trueomni.com\/french\/rosen-hotels\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"RosenHotels\" \/>\n<meta property=\"og:description\" content=\"Rosen Hotels\" \/>\n<meta property=\"og:url\" content=\"https:\/\/trueomni.com\/french\/rosen-hotels\/\" \/>\n<meta property=\"og:site_name\" content=\"TrueOmni\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/trueomni\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-20T15:49:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/trueomni.com\/wp-content\/uploads\/2026\/05\/Travel-TrueOmni-TNT-IVE-Kiosks-2026-Website-1024x753.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"753\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/trueomni.com\\\/rosen-hotels\\\/\",\"url\":\"https:\\\/\\\/trueomni.com\\\/rosen-hotels\\\/\",\"name\":\"RosenHotels - TrueOmni\",\"isPartOf\":{\"@id\":\"http:\\\/\\\/trueomni.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/trueomni.com\\\/rosen-hotels\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/trueomni.com\\\/rosen-hotels\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/trueomni.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Travel-TrueOmni-TNT-IVE-Kiosks-2026-Website-scaled.png\",\"datePublished\":\"2026-08-20T15:48:35+00:00\",\"dateModified\":\"2026-08-20T15:49:10+00:00\",\"description\":\"Rosen Hotels\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/trueomni.com\\\/rosen-hotels\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/trueomni.com\\\/rosen-hotels\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/trueomni.com\\\/rosen-hotels\\\/#primaryimage\",\"url\":\"https:\\\/\\\/trueomni.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Travel-TrueOmni-TNT-IVE-Kiosks-2026-Website-scaled.png\",\"contentUrl\":\"https:\\\/\\\/trueomni.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Travel-TrueOmni-TNT-IVE-Kiosks-2026-Website-scaled.png\",\"width\":2560,\"height\":1883,\"caption\":\"TrueOmni interactive kiosks in a hotel lobby\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/trueomni.com\\\/rosen-hotels\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"http:\\\/\\\/trueomni.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"RosenHotels\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\\\/\\\/trueomni.com\\\/#website\",\"url\":\"http:\\\/\\\/trueomni.com\\\/\",\"name\":\"TrueOmni\",\"description\":\"TrueOmni Self-Service Digital Customer Experience Company\",\"publisher\":{\"@id\":\"http:\\\/\\\/trueomni.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\\\/\\\/trueomni.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"http:\\\/\\\/trueomni.com\\\/#organization\",\"name\":\"TRUE OMNI LLC\",\"alternateName\":\"TRUE OMNI LLC\",\"url\":\"http:\\\/\\\/trueomni.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"http:\\\/\\\/trueomni.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"http:\\\/\\\/trueomni.com\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/TrueOmni-Logo-2.png\",\"contentUrl\":\"http:\\\/\\\/trueomni.com\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/TrueOmni-Logo-2.png\",\"width\":1000,\"height\":230,\"caption\":\"TRUE OMNI LLC\"},\"image\":{\"@id\":\"http:\\\/\\\/trueomni.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/trueomni\\\/\"],\"description\":\"TrueOmni is the leader in digital self-service solutions, offering innovative kiosks, digital signage, and mobile marketing platforms. Enhance customer engagement and streamline operations with our cutting-edge technology tailored for the hospitality, retail, and tourism industries.\",\"email\":\"info@trueomni.com\",\"telephone\":\"8333006664\",\"legalName\":\"True Omni LLC\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"RosenHotels - TrueOmni","description":"Rosen Hotels","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/trueomni.com\/french\/rosen-hotels\/","og_locale":"fr_FR","og_type":"article","og_title":"RosenHotels","og_description":"Rosen Hotels","og_url":"https:\/\/trueomni.com\/french\/rosen-hotels\/","og_site_name":"TrueOmni","article_publisher":"https:\/\/www.facebook.com\/trueomni\/","article_modified_time":"2026-08-20T15:49:10+00:00","og_image":[{"width":1024,"height":753,"url":"https:\/\/trueomni.com\/wp-content\/uploads\/2026\/05\/Travel-TrueOmni-TNT-IVE-Kiosks-2026-Website-1024x753.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/trueomni.com\/rosen-hotels\/","url":"https:\/\/trueomni.com\/rosen-hotels\/","name":"RosenHotels - TrueOmni","isPartOf":{"@id":"http:\/\/trueomni.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/trueomni.com\/rosen-hotels\/#primaryimage"},"image":{"@id":"https:\/\/trueomni.com\/rosen-hotels\/#primaryimage"},"thumbnailUrl":"https:\/\/trueomni.com\/wp-content\/uploads\/2026\/05\/Travel-TrueOmni-TNT-IVE-Kiosks-2026-Website-scaled.png","datePublished":"2026-08-20T15:48:35+00:00","dateModified":"2026-08-20T15:49:10+00:00","description":"Rosen Hotels","breadcrumb":{"@id":"https:\/\/trueomni.com\/rosen-hotels\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/trueomni.com\/rosen-hotels\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/trueomni.com\/rosen-hotels\/#primaryimage","url":"https:\/\/trueomni.com\/wp-content\/uploads\/2026\/05\/Travel-TrueOmni-TNT-IVE-Kiosks-2026-Website-scaled.png","contentUrl":"https:\/\/trueomni.com\/wp-content\/uploads\/2026\/05\/Travel-TrueOmni-TNT-IVE-Kiosks-2026-Website-scaled.png","width":2560,"height":1883,"caption":"TrueOmni interactive kiosks in a hotel lobby"},{"@type":"BreadcrumbList","@id":"https:\/\/trueomni.com\/rosen-hotels\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"http:\/\/trueomni.com\/"},{"@type":"ListItem","position":2,"name":"RosenHotels"}]},{"@type":"WebSite","@id":"http:\/\/trueomni.com\/#website","url":"http:\/\/trueomni.com\/","name":"TrueOmni","description":"TrueOmni, entreprise sp\u00e9cialis\u00e9e dans l&#039;exp\u00e9rience client num\u00e9rique en libre-service","publisher":{"@id":"http:\/\/trueomni.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/trueomni.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"http:\/\/trueomni.com\/#organization","name":"TRUE OMNI LLC","alternateName":"TRUE OMNI LLC","url":"http:\/\/trueomni.com\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"http:\/\/trueomni.com\/#\/schema\/logo\/image\/","url":"http:\/\/trueomni.com\/wp-content\/uploads\/2024\/06\/TrueOmni-Logo-2.png","contentUrl":"http:\/\/trueomni.com\/wp-content\/uploads\/2024\/06\/TrueOmni-Logo-2.png","width":1000,"height":230,"caption":"TRUE OMNI LLC"},"image":{"@id":"http:\/\/trueomni.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/trueomni\/"],"description":"TrueOmni is the leader in digital self-service solutions, offering innovative kiosks, digital signage, and mobile marketing platforms. Enhance customer engagement and streamline operations with our cutting-edge technology tailored for the hospitality, retail, and tourism industries.","email":"info@trueomni.com","telephone":"8333006664","legalName":"True Omni LLC"}]}},"_links":{"self":[{"href":"https:\/\/trueomni.com\/french\/wp-json\/wp\/v2\/pages\/58310","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trueomni.com\/french\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/trueomni.com\/french\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/trueomni.com\/french\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/trueomni.com\/french\/wp-json\/wp\/v2\/comments?post=58310"}],"version-history":[{"count":4,"href":"https:\/\/trueomni.com\/french\/wp-json\/wp\/v2\/pages\/58310\/revisions"}],"predecessor-version":[{"id":58314,"href":"https:\/\/trueomni.com\/french\/wp-json\/wp\/v2\/pages\/58310\/revisions\/58314"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trueomni.com\/french\/wp-json\/wp\/v2\/media\/57099"}],"wp:attachment":[{"href":"https:\/\/trueomni.com\/french\/wp-json\/wp\/v2\/media?parent=58310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}