Restyle Market Intelligence dashboard to match LinkedIn Analytics design

Adopts the navy/blue gradient palette, rounded card headers, muted
gray-blue borders, and Source Sans Pro font stack from the LinkedIn
Analytics dashboard. Replaces the top tab bar with a left sidebar
(logo, brand mark, nav, Update/Edit + Upload + Report actions), and
makes the Sources tab collapsible to match Contacts.
This commit is contained in:
mckinley committed 2026-07-22 16:36:12 +02:00
1 parent 6b7b1f5739
commit eff87b4315
4 files changed
+164 -75

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

+164 -75
View File
@@ -6,57 +6,74 @@
<title>TXproducts Market Intelligence</title>
<style>
:root {
--bg: #F4F8FC;
--bg: #F7F9FC;
--surface: #FFFFFF;
--surface2: #EBF3FA;
--border: #C8DCEE;
--border-l: #DDE9F5;
--blue: #1A8DBF;
--navy: #1B4E7A;
--surface2: #E8F0FE;
--border: #E0E7EF;
--border-l: #EAEFF5;
--blue: #2D6A9F;
--navy: #1B3A5C;
--grad: linear-gradient(90deg, var(--navy) 0%, var(--blue) 100%);
--yellow: #FFD600;
--amber: #C97000;
--amber-bg: #FFF4E0;
--green: #1A8A60;
--green-bg: #E5F5EE;
--red: #C0303A;
--red-bg: #FDEAEC;
--txt: #1A2B3C;
--txt-s: #3D5A72;
--txt-m: #7A96AE;
--txt: #1A2533;
--txt-s: #3D5266;
--txt-m: #6B7A8D;
--mono: 'SF Mono','Fira Mono','Menlo','Courier New',monospace;
--sans: 'Helvetica Neue','Arial',sans-serif;
--shadow: 0 1px 4px rgba(26,78,122,0.08), 0 0 0 1px var(--border);
--sans: -apple-system,'Source Sans Pro','Segoe UI',Helvetica,Arial,sans-serif;
--shadow: 0 1px 3px rgba(27,58,92,0.06), 0 0 0 1px var(--border);
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { background: var(--bg); color: var(--txt); font-family: var(--sans); font-size: 15px; line-height: 1.6; min-height: 100vh; }
/* HEADER */
header { position: sticky; top: 0; z-index: 100; background: var(--surface); border-bottom: 2px solid var(--blue); box-shadow: 0 2px 12px rgba(26,78,122,0.10); }
.header-inner { max-width: 1440px; margin: 0 auto; padding: 0 28px; display: flex; align-items: center; height: 80px; gap: 0; }
.logo-wrap { display: flex; align-items: center; gap: 14px; margin-right: 40px; text-decoration: none; flex-shrink: 0; }
.logo-img { height: 48px; width: 48px; object-fit: contain; }
.logo-text { display: flex; flex-direction: column; line-height: 1.1; }
.logo-name { font-size: 21px; font-weight: 800; color: var(--navy); letter-spacing: 0.01em; }
.logo-sub { font-size: 12px; font-weight: 500; color: var(--blue); letter-spacing: 0.10em; text-transform: uppercase; }
nav { display: flex; gap: 2px; flex: 1; }
.tab { background: none; border: none; border-bottom: 3px solid transparent; color: var(--txt-m); padding: 10px 20px; font-size: 16px; font-family: var(--sans); font-weight: 500; letter-spacing: 0.03em; cursor: pointer; transition: color 0.15s, border-color 0.15s; white-space: nowrap; }
.tab:hover { color: var(--navy); }
.tab.active { color: var(--navy); border-bottom-color: var(--blue); font-weight: 700; }
.tab:focus-visible { outline: 2px solid var(--blue); outline-offset: -2px; }
.hdate { font-family: var(--mono); font-size: 13px; color: var(--txt-m); white-space: nowrap; margin-left: auto; }
/* LAYOUT */
.main { max-width: 1440px; margin: 0 auto; padding: 32px 28px 72px; }
.layout { display: flex; align-items: flex-start; min-height: 100vh; }
/* SIDEBAR */
.sidebar { width: 240px; min-width: 240px; min-height: 100vh; position: sticky; top: 0; align-self: flex-start; background: var(--surface); border-right: 1px solid var(--border); padding: 20px 16px; display: flex; flex-direction: column; }
.sidebar-logo { max-width: 200px; width: 100%; display: block; margin: 0 auto 2px; }
.sidebar-brand { display: flex; align-items: center; justify-content: center; margin: 0 0 14px; }
.sidebar-brand-shot { width: 100%; height: auto; display: block; }
.sidebar hr { border: none; border-top: 1px solid var(--border); margin: 10px 0; }
.sidebar-date-box { background: var(--grad); border-radius: 8px; padding: 8px 10px; margin-bottom: 12px; text-align: center; }
.sidebar-date-lbl { font-size: 11px; font-weight: 400; text-transform: uppercase; letter-spacing: 0.05em; color: rgba(255,255,255,0.85); }
.sidebar-date-val { font-family: var(--sans); font-size: 17px; font-weight: 800; color: #fff; }
.sidebar-nav { display: flex; flex-direction: column; gap: 2px; margin: 4px 0; }
.sidebar-nav-btn { display: block; width: 100%; text-align: left; background: none; border: none; border-left: 3px solid transparent; color: var(--txt-m); font-weight: 500; font-size: 0.92rem; font-family: var(--sans); padding: 9px 10px; border-radius: 4px; cursor: pointer; }
.sidebar-nav-btn:hover { background: var(--bg); color: var(--navy); }
.sidebar-nav-btn.active { background: var(--surface2); color: var(--navy); font-weight: 700; border-left: 3px solid var(--blue); }
.sidebar-nav-btn:focus-visible { outline: 2px solid var(--blue); outline-offset: -2px; }
.sidebar-footer { font-size: 12px; color: var(--txt-m); margin-top: auto; text-align: center; padding-top: 10px; }
.sidebar-action-btn { display: block; width: 100%; padding: 9px 10px; background: var(--grad); color: #fff; border: none; border-radius: 6px; font-size: 0.8rem; font-weight: 700; font-family: var(--sans); cursor: pointer; text-align: center; margin-bottom: 8px; }
.sidebar-action-btn:hover { filter: brightness(1.08); }
.sidebar-action-btn.is-save { background: var(--green); }
.sidebar-dropzone { border: 1px dashed var(--border); border-radius: 6px; padding: 10px 8px; text-align: center; font-size: 0.72rem; color: var(--txt-m); cursor: pointer; background: var(--surface); margin-bottom: 6px; }
.sidebar-dropzone:hover { background: var(--bg); border-color: var(--blue); color: var(--navy); }
.upload-note { font-size: 0.68rem; color: var(--txt-m); line-height: 1.4; text-align: center; margin-bottom: 12px; }
@media print {
.sidebar { display: none !important; }
.layout { display: block !important; }
.main { padding: 0 !important; }
body { background: #fff !important; }
}
.main { flex: 1; min-width: 0; padding: 32px 28px 72px; }
.section { display: none; }
.section.active { display: block; }
.sec-head { margin-bottom: 24px; }
.sec-title { font-size: 22px; font-weight: 800; color: var(--navy); text-wrap: balance; margin-bottom: 4px; }
.sec-sub { font-size: 14px; color: var(--txt-s); }
.sec-head { background: var(--grad); border-radius: 8px; padding: 16px 22px 15px; margin-bottom: 24px; }
.sec-title { font-size: 22px; font-weight: 800; color: #fff; text-wrap: balance; margin-bottom: 4px; }
.sec-sub { font-size: 14px; color: rgba(255,255,255,0.84); }
.disclaimer { background: var(--amber-bg); border: 1px solid #F0C060; border-left: 4px solid var(--amber); padding: 11px 15px; font-size: 13px; color: #6B4000; margin-bottom: 22px; line-height: 1.5; border-radius: 2px; }
.disclaimer { background: var(--amber-bg); border: 1px solid #F0C060; border-left: 4px solid var(--amber); padding: 11px 15px; font-size: 13px; color: #6B4000; margin-bottom: 22px; line-height: 1.5; border-radius: 0 6px 6px 0; }
/* KPI STRIP */
.kpi-strip { display: grid; grid-template-columns: repeat(4,1fr); gap: 14px; margin-bottom: 26px; }
.kpi { background: var(--surface); box-shadow: var(--shadow); border-top: 3px solid var(--blue); padding: 18px 20px 16px; border-radius: 2px; }
.kpi { background: var(--surface); box-shadow: var(--shadow); border-top: 3px solid var(--navy); padding: 18px 20px 16px; border-radius: 8px; }
.kpi-lbl { font-size: 11px; font-weight: 600; letter-spacing: 0.09em; text-transform: uppercase; color: var(--txt-m); margin-bottom: 10px; }
.kpi-val { font-family: var(--mono); font-size: 30px; font-weight: 700; color: var(--navy); line-height: 1; font-variant-numeric: tabular-nums; margin-bottom: 6px; }
.kpi-sub { font-size: 13px; color: var(--txt-s); line-height: 1.3; }
@@ -68,8 +85,8 @@
/* GRID */
.two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
.three-col { display: grid; grid-template-columns: repeat(3,1fr); gap: 18px; }
.panel { background: var(--surface); box-shadow: var(--shadow); padding: 20px; border-radius: 2px; }
.panel-title { font-size: 11px; font-weight: 700; letter-spacing: 0.09em; text-transform: uppercase; color: var(--txt-m); margin-bottom: 16px; padding-bottom: 12px; border-bottom: 1px solid var(--border-l); }
.panel { background: var(--surface); box-shadow: var(--shadow); padding: 20px; border-radius: 8px; overflow: hidden; }
.panel-title { font-size: 12px; font-weight: 700; letter-spacing: 0.09em; text-transform: uppercase; color: #fff; margin: -20px -20px 16px -20px; padding: 11px 20px; background: var(--grad); border-radius: 8px 8px 0 0; }
/* BARS */
.bar-row { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
@@ -83,15 +100,16 @@
/* PAIN ITEMS */
.pain-list { display: flex; flex-direction: column; gap: 10px; }
.pain-item { background: var(--surface2); border: 1px solid var(--border-l); border-left: 4px solid var(--amber); padding: 12px 14px; border-radius: 0 2px 2px 0; }
.pain-item { background: var(--surface2); border: 1px solid var(--border-l); border-left: 4px solid var(--amber); padding: 12px 14px; border-radius: 0 8px 8px 0; }
.pain-head { font-size: 13px; font-weight: 700; color: var(--txt); margin-bottom: 4px; }
.pain-body { font-size: 13px; color: var(--txt-s); line-height: 1.55; }
/* COMPETITOR CARDS */
.comp-grid { display: grid; grid-template-columns: repeat(2,1fr); gap: 16px; }
.comp-card { background: var(--surface); box-shadow: var(--shadow); padding: 18px; border-radius: 2px; }
.comp-card { background: var(--surface); box-shadow: var(--shadow); padding: 18px; border-radius: 8px; overflow: hidden; }
.comp-card.highlight { border-top: 3px solid var(--red); }
.comp-name { font-size: 15px; font-weight: 800; color: var(--navy); margin-bottom: 2px; }
.comp-name { display: block; font-size: 14px; font-weight: 800; color: #fff; margin: -18px -18px 10px -18px; padding: 10px 18px 8px; background: var(--grad); border-radius: 8px 8px 0 0; }
.comp-card.highlight .comp-name { border-radius: 0; }
.comp-loc { font-size: 12px; color: var(--txt-m); margin-bottom: 10px; }
.comp-desc { font-size: 13px; color: var(--txt-s); line-height: 1.55; margin-bottom: 12px; }
.profile-btn { display: inline-block; margin-top: 10px; font-size: 12px; font-weight: 700; color: var(--red); background: var(--red-bg); border: 1px solid #e8a0a5; border-radius: 20px; padding: 4px 12px; cursor: pointer; font-family: var(--sans); transition: background 0.15s; }
@@ -132,7 +150,7 @@
.acc-open + .acc-body { display: block; }
.acc-section { margin-bottom: 12px; }
/* legacy aliases kept for Sources tab */
.cat-header { display: flex; align-items: center; gap: 14px; padding: 12px 16px; border-radius: 2px 2px 0 0; border-bottom: none; }
.cat-header { display: flex; align-items: center; gap: 14px; padding: 12px 16px; border-radius: 8px 8px 0 0; border-bottom: none; }
.cat-header-f { background: #E3F2FB; border-left: 4px solid var(--blue); }
.cat-header-c { background: var(--amber-bg); border-left: 4px solid var(--amber); }
.cat-header-p { background: var(--green-bg); border-left: 4px solid var(--green); }
@@ -143,7 +161,7 @@
.cat-p { background: #B8EDD5; color: #0D4D30; }
/* TABLE */
.tbl-wrap { overflow-x: auto; background: var(--surface); box-shadow: var(--shadow); border-radius: 0 0 2px 2px; }
.tbl-wrap { overflow-x: auto; background: var(--surface); box-shadow: var(--shadow); border-radius: 0 0 8px 8px; }
table { width: 100%; border-collapse: collapse; font-size: 14px; }
thead th { font-size: 11px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--txt-m); text-align: left; padding: 11px 16px; border-bottom: 2px solid var(--border); background: var(--surface2); white-space: nowrap; }
tbody tr { border-bottom: 1px solid var(--border-l); transition: background 0.1s; }
@@ -165,7 +183,7 @@
/* CLIENT GRID */
.client-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 14px; margin-top: 20px; }
.client-card { background: var(--surface); box-shadow: var(--shadow); padding: 16px; border-radius: 2px; border-top: 2px solid var(--border); }
.client-card { background: var(--surface); box-shadow: var(--shadow); padding: 16px; border-radius: 8px; border-top: 2px solid var(--navy); }
.client-name { font-size: 14px; font-weight: 700; color: var(--navy); margin-bottom: 4px; }
.client-detail { font-size: 13px; color: var(--txt-s); line-height: 1.4; }
@@ -184,35 +202,52 @@
.kpi-strip { grid-template-columns: 1fr 1fr; }
.three-col { grid-template-columns: 1fr; }
.client-grid { grid-template-columns: 1fr; }
nav .tab { padding: 8px 10px; font-size: 12px; }
.hdate { display: none; }
.header-inner { padding: 0 16px; }
.main { padding: 20px 16px 60px; }
}
@media (max-width: 720px) {
.layout { flex-direction: column; }
.sidebar { width: 100%; min-width: 0; height: auto; position: static; }
}
</style>
</head>
<body>
<header>
<div class="header-inner">
<a class="logo-wrap" href="#">
<img class="logo-img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAMgCAIAAABUEpE/AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFUGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4KPHg6eG1wbWV0YSB4bWxuczp4PSdhZG9iZTpuczptZXRhLyc+CjxyZGY6UkRGIHhtbG5zOnJkZj0naHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyc+CgogPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9JycKICB4bWxuczpBdHRyaWI9J2h0dHA6Ly9ucy5hdHRyaWJ1dGlvbi5jb20vYWRzLzEuMC8nPgogIDxBdHRyaWI6QWRzPgogICA8cmRmOlNlcT4KICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0nUmVzb3VyY2UnPgogICAgIDxBdHRyaWI6Q3JlYXRlZD4yMDI2LTA1LTI5PC9BdHRyaWI6Q3JlYXRlZD4KICAgICA8QXR0cmliOkRhdGE+eyZxdW90O2RvYyZxdW90OzomcXVvdDtEQUhMQzJTRUI1SSZxdW90OywmcXVvdDt1c2VyJnF1b3Q7OiZxdW90O1VBR0ZnQkc5ZVJvJnF1b3Q7LCZxdW90O2JyYW5kJnF1b3Q7OiZxdW90O0JBR0ZnRmZVc1d3JnF1b3Q7fTwvQXR0cmliOkRhdGE+CiAgICAgPEF0dHJpYjpFeHRJZD42MzMwY2U5Zi04YjY5LTQxYWItYjYxOC05MWQ3Njk0ZDNjZGY8L0F0dHJpYjpFeHRJZD4KICAgICA8QXR0cmliOkZiSWQ+NTI1MjY1OTE0MTc5NTgwPC9BdHRyaWI6RmJJZD4KICAgICA8QXR0cmliOlRvdWNoVHlwZT4yPC9BdHRyaWI6VG91Y2hUeXBlPgogICAgPC9yZGY6bGk+CiAgIDwvcmRmOlNlcT4KICA8L0F0dHJpYjpBZHM+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0nJwogIHhtbG5zOmRjPSdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4x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 truncated
<div class="logo-text">
<span class="logo-name">TXproducts</span>
<span class="logo-sub">Market Intelligence</span>
</div>
</a>
<nav>
<button class="tab active" onclick="show('overview',this)">Overview</button>
<button class="tab" onclick="show('verticals',this)">Verticals</button>
<button class="tab" onclick="show('painpoints',this)">Pain Points</button>
<button class="tab" onclick="show('competitors',this)">Competitors</button>
<button class="tab" onclick="show('contacts',this)">Contacts</button>
<button class="tab" onclick="show('sources',this)">Sources</button>
</nav>
<div class="hdate">26 Jun 2026</div>
<div class="layout">
<aside class="sidebar">
<img class="sidebar-logo" src="data:image/png;base64,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 truncated
<div class="sidebar-brand">
<img class="sidebar-brand-shot" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAiwAAACXCAYAAAA25QB2AAABQ2lDQ1BJQ0MgUHJvZmlsZQAAKJF9kD9LQmEUxn+WYVRIQzU1CE3CNU2lP6M5RNAgVmRt16t5A7WX65UI+gCNTX2CaGzMxqC1TSiIPkFr4FJyO69aWlEHDufH8z6c9+HA0KipVNkPVKquk11bDeV290KBFwLMECTCimnVVCqT2RALn/N7tR7w6dmM6F2/3/+tsUKxZsl8l45ZynHBZwhnjlyl+UR4ypFQwmeaS12+0Jzv8k3Hs5VNC98LT1q2WRB+FjbyA3ppgCvlutXLoNNPFKvbm3qP9Cw54iRZJkG0Rwt/+JMdf5pDFMc4HFDCxiVEShRFmaLwOlUs5jGE48SkF/Wdf96vr9lLsvpKvor2tYLkvo5C8LSvhZswPQd3dWU65tdVfS1/bT8R7/J4A0bOPe91BwJhaD963lvD89qXMPwEt60PX6Faxgrmnu0AAABWZVhJZk1NACoAAAAIAAGHaQAEAAAAAQAAABoAAAAAAAOShgAHAAAAEgAAAESgAgAEAAAAAQAAAiygAwAEAAAAAQAAAJcAAAAAQVNDSUkAAABTY3JlZW5zaG90KWVrPgAAAdZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDYuMC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MTUxPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjU1NjwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlVzZXJDb21tZW50PlNjcmVlbnNob3Q8L2V4aWY6VXNlckNvbW1lbnQ+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgrrajxDAABAAElEQVR4Ae1dBZgUR9OuBHd353B3d4Id7ho0SJAED/qFEIIFCCQBQtBAAiS4W3DncHcLboc7+f95+9Jzs3srM7uzd7t7Vc+zzExPd3X3O8tNbelH/6cQMTECjAAjwAgwAowAI+DFCHzsxWvjpTECjAAjwAgwAowAIyAQYIGFvwiMACPACDACjAAj4PUIsMDi9Y+IF8gIMAKMACPACDACLLDwd4ARYAQYAUaAEWAEvB4BFli8/hHxAhkBRoARYAQYAUaABRb+DjACjAAjwAgwAoyA1yMQ1etXyAtkBBgBRoARYAQiIQLIOrJnzx66fPkylSxZkgICAuijjz6KhEiEbJkFlkj76HnjjAAjwAgwAt6MAISVVq1a0fv37ylr1qw0d+5cSps2rTcv2aNrY5OQR+Fl5owAI8AIMAKMgGsILFmyhN6+fUsfPnygW7du0ZUrV1xj5CejWGDxkwfJ22AEGAFGgBHwLwRevHihbujff/8Vmha1IRKesMASCR86b5kRYAQYAUaAEfA1BFhg8bUnxutlBBgBRoARYAQiIQIssETCh85bZgQYAUaAEWAEfA0BFlh87YnxehkBRoARYAQYgUiIAAsskfCh85YZAUaAEWAEXEMAuVHw8Wfy1j1yHhZ//tbx3hgBRoARYARMQQAv8UOHDtHJkycpffr0VLZsWYoWLZopvL2JyYMHD2jr1q307t07qlixIqVKlcprlscCi9c8Cl4II8AIMAKMgLcicObMGWrXrh0FBwdTnDhxqHXr1tSnTx+KGTOmx5acMGFClXfUqFEpevTo6rUnTrC3Ll26UFBQkNAiNW/WnEaPGe012XXZJOSJp848GQFGgBFgBPwKgUuXLtGjR48I+VCePXtG06dPp++//56ePHnisX22bdtWpONPnDgxFStWjHLkyOGRuaA9guaoYcOGtHfvXqFdQXbdU6dPeZX5izUsHnn8zJQRYAQYAUbAnxCAwJApUyZR1wf7QgbaX3/9VVyPGDGC0qRJY/p2c+bMKdLxw0yTOXNmguBiNkFYgUalb9++BKEM1yBodCpVquQ12hWs6SNlcf7tPYRdMjECjAAjwAgwAm4i8Pz5c2rZsqXwZYGmBYRihEWLFqUZM2ZQkiRJvOoF72y7SPm/ceNG6tSpk0j/L/vD9NS4cWP69ttvPWrykvPpPbJJSC9S3I8RYAQYAUYgUiMQN25c+vnnn6lu3bqqYILf/AcOHKAmTZqIyspSkPF2oCCszJkzhwYMGGAhrMBvZuDAgTRq1CivElaAJ2tYvP1bxetjBBgBRoAR8CoE4N8xfPhwmjVrlvBpkYtLliyZaCtUqJAq0Mh73nSEOQsCCbRCEFwkffzxxzR+/HihXcG5t1GUYQp526J4PYwAI8AIMAKMgLcigJc5fFqiRIlCR48eVYsSvnz5ktauXUupU6emrFmzkje+9F+9eiVMPXPnzlXXDZwDAgJo8uTJFBgY6JXrxhpZwwIUmBgBRoARYAQYAYMIvHnzhtatW0dfffWViBySwzNkyCDMLdmzZ5dNXnOEVgXaIWiJQPDBQa6V3377jeDk641ClgTP+3Q+cmV8ZAQYAUaAEWAEvBiBGDFiUO3atYV5JXny5KoZCJoWaDK8ke7evauagaAhKlWqlHC8zZ07t1cLK8CSBRZv/EbxmhgBRoARYAR8AgG89OvVqyd8VwoXLiySyjVq1IiyZMni1vrhzGvr4xZTZXCbNm2oZMmSFDt2bGrWrBlNmjTJI+HS7q7T1ng2CdlChdsYAUaAEWAEGAEDCFhnCIGpxQghFf7Tp0/p+vXrIjX+4cOH6cKFC/Tw4UOC6SlevHjCNwZmm1IlS1HpMqUpUaJEQkAyasbRrtXoOo3syey+LLCYjSjzYwQYAUaAEWAEdCKAMOgdO3YIX5j9+/fTlStXVP8SrWAh2UkBI1asWJQ/f34qXbo01alTRySWMyq4SJ6+cmSBxVeeFK+TEWAEGAFGwG8QgDBy48YN6t69Ox05ckQVUoxuEAIM8sP06NGDunXrpvrRGOXjC/1ZYPGFp8RrZAQYAUaAEfAbBF68eEFLliwR/iO3b982ZV8QXIoUKSIilooXLy5Crk1h7EVMLASWSfPX0txV271oebwURoARYAQYAU8i0Kd1bWpRo4wnp2DeGgTgp/L111/T8uXLhW+K5pbbpxBaUG/ou+++E9FL0nzkNmMvYRCm+OGVm/e8ZGm8DEaAEWAEGAFGwH8QCA4OFsLK0qVLLTLkOtohhA589KT8h5kJTrowDT1+/FhEAaEukL8QhzX7y5PkfTACjAAjwAh4LQJPnjyhQYMGCVOQHuEDG4ET7RdffEHTpk0zlIEW6fbHjBlDGzZsUKsvey0wBhYWRsNiYCx3ZQQYAUaAEWAEGAEnCEDzsWDBAlqzZo0hAaJVq1bUr18/oWEpWLCgiCA6c+aMk9lCbkOb079/f0JCuEyZMvmFMy5rWHQ9eu7ECDACjAAjwAi4hsDp06dpypQphiOB4DwrTULIw4JsukYIWp0+ffoIM5GRcd7alwUWb30yvC5GgBFgBBgBn0cAlZE7duxoWGiAoBI1alRVM4JrmIikACOPzgA6dOgQrV+/3lk3n7jPJiGfeEy8SEaAEWAEGAFfQwCmoNWrV4t8KzjXQxBEUDwR1ZPTpEmjDokWLZpIEocoIEkIjz5w4AA9evRINoU5osjhvHnzqHHjxoTaR75MLLD48tPjtTMCjAAjwAh4LQKvX7+mtWvXqsUGnS0UZp9evXpR3bp1RSp+1PuRBGGjU6dOFtFCEEZ27txJ7du3d+gbA5MUqkqj5pEvE5uEfPnp8doZAUaAEWAEvBYBhBhDA6JHu4K6QOPHjxdCSapUqUT2WutU+zARIUxZfiDQVKlSRdQTcgQCooYmT55MqFfky8QCiy8/PV47I8AIMAKMgFciACEFtYEePHjgdH0QRAYMGEA1a9YUfipOB/zXAXPs2bOHXr586XQICileunTJaT9v7sAmIW9+Orw2RoARYAQYAZ9FQK+zKyowV61aVXWwRZ6WU6dO0e7dux1mw71z547ImKsnrwu0LMePH6fs2bOr8/gasCyw+NoT4/UyAowAI8AIeD0C0H4cPHhQ1zozZ84sUurLzjAjwV8FJiVnpMfcBB4Qaq5du+aMnVffZ4HFqx8PL44RYAQYAUbAFxFADpT79+/rWjoifxAFBIIAgjpDekxJuphrOt29e1fkgpFzaW75xCkLLD7xmOwvMmnCeFSqQHabHVAX6sSF6zbv6W0snjcrpUiSwGb3rUGn6NmLVzbvOWsMSJeScgekVbt9+PAvrdl5WL02elKmYA5KnCCu7mGPnjwn4HP7QbDyy0NfuKFkbj3Xqu2HdDnVyfExY0SnqiXzyUtxvP/oKe09ft6izXoei5suXJy9covOX7tF8eLEoopFc7vAQf+QZy9e09agk/oHcE9GwM8QgMCil549eyYiiaJEiSKGlCxZkhYuXEjI4WImwddFj/nIzDnN5MUCi5loRgCvnJnS0pzh3WzOfOj0ZarS5Vub9/Q0Ih/AnOFdFYEloc3updoMobNXbtq856xxeNcmVKN0QYtuFToMo+MXXFNZDmhfj0rlty24WUxidfHm3Xv65/YDWrb1AP28cL0uAcx6rhSVPqN37z9YcbZ9GTXKxzT7m65UrVR+Line truncated
</div>
</header>
<div class="sidebar-date-box">
<div class="sidebar-date-lbl">Data As Of</div>
<div class="sidebar-date-val">Jun 26, 2026</div>
</div>
<nav class="sidebar-nav">
<button class="sidebar-nav-btn active" onclick="show('overview',this)">Overview</button>
<button class="sidebar-nav-btn" onclick="show('verticals',this)">Verticals</button>
<button class="sidebar-nav-btn" onclick="show('painpoints',this)">Pain Points</button>
<button class="sidebar-nav-btn" onclick="show('competitors',this)">Competitors</button>
<button class="sidebar-nav-btn" onclick="show('contacts',this)">Contacts</button>
<button class="sidebar-nav-btn" onclick="show('sources',this)">Sources</button>
</nav>
<div style="display:flex;align-items:center;gap:6px;margin:14px 0 8px;position:relative;">
<button class="sidebar-action-btn" id="editBtn" onclick="toggleEdit(this)" style="flex:1;margin-bottom:0;">Update/Edit</button>
<button onclick="toggleTip('sidebar-help-tip')" style="width:22px;height:22px;border-radius:50%;border:2px solid #fff;background:var(--yellow);color:var(--txt);font-size:12px;font-weight:800;cursor:pointer;line-height:1;padding:0;flex-shrink:0;box-shadow:0 1px 4px rgba(0,0,0,0.3);" title="How do editing and uploading work?">?</button>
<div id="sidebar-help-tip" style="display:none;position:absolute;bottom:100%;right:0;z-index:200;margin-bottom:8px;width:206px;text-align:left;background:var(--surface);border:1px solid var(--border);border-left:4px solid var(--yellow);border-radius:8px;padding:14px 16px;box-shadow:0 4px 16px rgba(26,78,122,0.18);">
<div style="font-size:11px;font-weight:800;color:var(--navy);margin-bottom:8px;text-transform:uppercase;letter-spacing:0.05em;">How these work</div>
<div style="font-size:12px;color:var(--txt-s);line-height:1.5;margin-bottom:8px;"><strong style="color:var(--navy);">Update/Edit</strong> turns on in-page editing. Click <strong style="color:var(--navy);">Save Changes</strong> when done &mdash; it downloads an updated index.html. Replace the file on Nextcloud with it so the team sees your edits.</div>
<div style="font-size:12px;color:var(--txt-s);line-height:1.5;margin-bottom:8px;"><strong style="color:var(--navy);">Upload</strong> can't process files here &mdash; this page has no server. Save new source files straight into this project's Nextcloud folder instead.</div>
<div style="font-size:12px;color:var(--txt-s);line-height:1.5;"><strong style="color:var(--navy);">Generate Report</strong> opens your browser's print dialog for the tab you're currently viewing &mdash; choose "Save as PDF" there.</div>
</div>
</div>
<button class="sidebar-action-btn is-save" id="saveEditsBtn" style="display:none;" onclick="saveEdits()">Save Changes (Download)</button>
<div class="sidebar-dropzone" onclick="document.getElementById('fileUpload').click()">
Upload New Data<br>Drag files here, or click to browse
</div>
<input type="file" id="fileUpload" multiple style="display:none" onchange="handleUpload(this)">
<button class="sidebar-action-btn" onclick="window.print()">Generate Report (Print / PDF)</button>
<div class="sidebar-footer">TXproducts &middot; Internal Tool &middot; 2026</div>
</aside>
<div class="main">
@@ -257,10 +292,10 @@
<div class="sec-head" style="position:relative;">
<div style="display:flex;align-items:center;gap:10px;">
<div class="sec-title">Target Industry Verticals</div>
<button onclick="toggleTip('vert-tip')" style="width:22px;height:22px;border-radius:50%;border:2px solid var(--blue);background:var(--surface);color:var(--blue);font-size:13px;font-weight:800;cursor:pointer;line-height:1;padding:0;flex-shrink:0;" title="What is a vertical?">?</button>
<button onclick="toggleTip('vert-tip')" style="width:22px;height:22px;border-radius:50%;border:2px solid #fff;background:var(--yellow);color:var(--txt);font-size:12px;font-weight:800;cursor:pointer;line-height:1;padding:0;flex-shrink:0;box-shadow:0 1px 4px rgba(0,0,0,0.3);" title="What is a vertical?">?</button>
</div>
<div class="sec-sub">Who buys beamtime and why, with confirmed industrial users at DESY</div>
<div id="vert-tip" style="display:none;position:absolute;top:100%;left:0;z-index:100;margin-top:8px;background:var(--surface);border:1px solid var(--border);border-left:4px solid var(--blue);border-radius:8px;padding:16px 20px;max-width:480px;box-shadow:0 4px 16px rgba(26,78,122,0.13);">
<div id="vert-tip" style="display:none;position:absolute;top:100%;left:0;z-index:100;margin-top:8px;background:var(--surface);border:1px solid var(--border);border-left:4px solid var(--yellow);border-radius:8px;padding:16px 20px;max-width:480px;box-shadow:0 4px 16px rgba(26,78,122,0.13);">
<div style="font-size:13px;font-weight:800;color:var(--navy);margin-bottom:6px;text-transform:uppercase;letter-spacing:0.06em;">What is an industry vertical?</div>
<div style="font-size:14px;color:var(--txt);line-height:1.65;margin-bottom:10px;"><strong style="color:var(--navy);">Vertical selling</strong> means targeting a specific industry sector, such as pharma, aerospace, or energy. Each vertical has its own reasons to use synchrotron beamtime, its own budget holders, and its own language. We tailor the pitch to what matters most to that sector.</div>
<div style="font-size:14px;color:var(--txt);line-height:1.65;"><strong style="color:var(--navy);">Horizontal selling</strong> is the opposite: one generic message pushed to all industries at once. It is faster to produce but less persuasive, because no single sector sees itself reflected in it. A company selling "cloud storage" to everyone is horizontal. A company selling "clinical trial data compliance for pharma" is vertical.</div>
@@ -826,8 +861,12 @@
<div class="section" id="sources">
<div class="sec-head"><div class="sec-title">Sources</div><div class="sec-sub">All research sources organized by category. Data collected June 2026 via automated web research.</div></div>
<div class="cat-section">
<div class="cat-header cat-header-f"><span class="cat cat-f">Market Sizing</span><span class="cat-desc">Reports used for global market value, CAGR, and vertical breakdown figures.</span></div>
<div class="acc-section">
<button class="acc-header acc-header-f" onclick="toggleAcc('acc-src-market-sizing',this)">
<div class="acc-left"><span class="cat cat-f">Market Sizing</span><span class="cat-desc">Reports used for global market value, CAGR, and vertical breakdown figures.</span></div>
<span class="acc-chevron">▾</span>
</button>
<div class="acc-body" id="acc-src-market-sizing">
<div class="tbl-wrap"><table>
<thead><tr><th>Source</th><th>Key Data Point</th><th>Link</th></tr></thead>
<tbody>
@@ -839,10 +878,15 @@
<tr><td class="name">NSLS-II Industry Workshop Report (2020)</td><td>Documented barriers: unfamiliarity, no expertise, long lead times, cost, legal concerns</td><td><a class="li-link" href="https://www.bnl.gov/nsls2/docs/pdf/2020-industry-workshop-report.pdf" target="_blank">View PDF</a></td></tr>
</tbody>
</table></div>
</div>
</div>
<div class="cat-section">
<div class="cat-header cat-header-p"><span class="cat cat-p">Industrial Users — ESRF</span><span class="cat-desc">Named individuals and case studies from ESRF facility publications.</span></div>
<div class="acc-section">
<button class="acc-header acc-header-p" onclick="toggleAcc('acc-src-industrial-users-esrf',this)">
<div class="acc-left"><span class="cat cat-p">Industrial Users — ESRF</span><span class="cat-desc">Named individuals and case studies from ESRF facility publications.</span></div>
<span class="acc-chevron">▾</span>
</button>
<div class="acc-body" id="acc-src-industrial-users-esrf">
<div class="tbl-wrap"><table>
<thead><tr><th>Source</th><th>Contacts / Data</th><th>Link</th></tr></thead>
<tbody>
@@ -854,10 +898,15 @@
<tr><td class="name">PMC: How ESRF helps industry (2013)</td><td>Edward P. Mitchell (Business Development, ESRF)</td><td><a class="li-link" href="https://pmc.ncbi.nlm.nih.gov/articles/PMC3689532/" target="_blank">View paper</a></td></tr>
</tbody>
</table></div>
</div>
</div>
<div class="cat-section">
<div class="cat-header cat-header-p"><span class="cat cat-p">Industrial Users — DESY PETRA III</span><span class="cat-desc">Named individuals and case studies from DESY innovation pages and publications.</span></div>
<div class="acc-section">
<button class="acc-header acc-header-p" onclick="toggleAcc('acc-src-industrial-users-desy-petra-iii',this)">
<div class="acc-left"><span class="cat cat-p">Industrial Users — DESY PETRA III</span><span class="cat-desc">Named individuals and case studies from DESY innovation pages and publications.</span></div>
<span class="acc-chevron">▾</span>
</button>
<div class="acc-body" id="acc-src-industrial-users-desy-petra-iii">
<div class="tbl-wrap"><table>
<thead><tr><th>Source</th><th>Contacts / Data</th><th>Link</th></tr></thead>
<tbody>
@@ -869,10 +918,15 @@
<tr><td class="name">DESY Innovation: Industrial case studies index</td><td>GKN Aerospace, OHB, Hilti, BioNTech, Captor, Haldor Topsoe, SKF, Beiersdorf confirmed</td><td><a class="li-link" href="https://innovation.desy.de/for_industry/case_studies/index_eng.html" target="_blank">View index</a></td></tr>
</tbody>
</table></div>
</div>
</div>
<div class="cat-section">
<div class="cat-header cat-header-p"><span class="cat cat-p">Industrial Users — Diamond Light Source</span><span class="cat-desc">Named individuals from Diamond industrial case studies (Harwell, UK).</span></div>
<div class="acc-section">
<button class="acc-header acc-header-p" onclick="toggleAcc('acc-src-industrial-users-diamond-light-source',this)">
<div class="acc-left"><span class="cat cat-p">Industrial Users — Diamond Light Source</span><span class="cat-desc">Named individuals from Diamond industrial case studies (Harwell, UK).</span></div>
<span class="acc-chevron">▾</span>
</button>
<div class="acc-body" id="acc-src-industrial-users-diamond-light-source">
<div class="tbl-wrap"><table>
<thead><tr><th>Source</th><th>Contacts / Data</th><th>Link</th></tr></thead>
<tbody>
@@ -881,10 +935,15 @@
<tr><td class="name">Diamond: Engineering case studies index</td><td>Rolls-Royce, GSK, Unilever mentioned as industrial users</td><td><a class="li-link" href="https://www.diamond.ac.uk/industry/Case-Studies/Engineering-Case-Studies.html" target="_blank">View index</a></td></tr>
</tbody>
</table></div>
</div>
</div>
<div class="cat-section">
<div class="cat-header cat-header-c"><span class="cat cat-c">Competitors</span><span class="cat-desc">Sources for commercial beamtime service providers.</span></div>
<div class="acc-section">
<button class="acc-header acc-header-c" onclick="toggleAcc('acc-src-competitors',this)">
<div class="acc-left"><span class="cat cat-c">Competitors</span><span class="cat-desc">Sources for commercial beamtime service providers.</span></div>
<span class="acc-chevron">▾</span>
</button>
<div class="acc-body" id="acc-src-competitors">
<div class="tbl-wrap"><table>
<thead><tr><th>Source</th><th>Key Data</th><th>Link</th></tr></thead>
<tbody>
@@ -894,9 +953,11 @@
<tr><td class="name">NSLS-II Industry page</td><td>Jun Wang contact; access modes (general, proprietary, rapid)</td><td><a class="li-link" href="https://www.bnl.gov/nsls2/industry/" target="_blank">View page</a></td></tr>
</tbody>
</table></div>
</div>
</div>
</div>
</div>
</div>
<script>
@@ -954,9 +1015,37 @@ function toggleTip(id) {
setTimeout(function(){ document.addEventListener('click', closeTip); }, 0);
}
}
function toggleEdit(btn) {
var main = document.querySelector('.main');
var on = main.getAttribute('contenteditable') === 'true';
main.setAttribute('contenteditable', on ? 'false' : 'true');
main.style.outline = on ? 'none' : '2px dashed var(--blue)';
btn.textContent = on ? 'Update/Edit' : 'Stop Editing';
document.getElementById('saveEditsBtn').style.display = on ? 'none' : 'block';
}
function saveEdits() {
var main = document.querySelector('.main');
main.setAttribute('contenteditable', 'false');
main.style.outline = 'none';
document.getElementById('saveEditsBtn').style.display = 'none';
document.getElementById('editBtn').textContent = 'Update/Edit';
var html = '<!DOCTYPE html>\n' + document.documentElement.outerHTML;
var blob = new Blob([html], {type: 'text/html'});
var a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = 'index.html';
document.body.appendChild(a);
a.click();
a.remove();
}
function handleUpload(input) {
if (!input.files.length) return;
var names = Array.from(input.files).map(function(f){ return f.name; }).join(', ');
alert('Selected: ' + names + ' — this page has no server, so save it directly to the Nextcloud folder to share it with the team.');
}
function show(id, btn) {
document.querySelectorAll('.section').forEach(s => s.classList.remove('active'));
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
document.querySelectorAll('.sidebar-nav-btn').forEach(t => t.classList.remove('active'));
document.getElementById(id).classList.add('active');
btn.classList.add('active');
}