Files
open-metadata--openmetadata/openmetadata-ui/src/main/resources/ui/index.html
T
wehub-resource-sync bf2343b7e4
Integration Tests - MySQL + Elasticsearch / Detect Changes (push) Has been cancelled
Integration Tests - MySQL + Elasticsearch / integration-tests-mysql-elasticsearch (push) Has been cancelled
Integration Tests - PostgreSQL + Elasticsearch + Redis / Detect Changes (push) Has been cancelled
Integration Tests - PostgreSQL + Elasticsearch + Redis / integration-tests-postgres-elasticsearch-redis (push) Has been cancelled
Integration Tests - PostgreSQL + OpenSearch / Detect Changes (push) Has been cancelled
Integration Tests - PostgreSQL + OpenSearch / integration-tests-postgres-opensearch (push) Has been cancelled
Java Checkstyle / java-checkstyle (push) Has been cancelled
Maven Collate Tests / maven-collate-ci (push) Has been cancelled
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests-status (push) Has been cancelled
Publish Package to Maven Central Repository / publish-maven-packages (push) Has been cancelled
OpenMetadata Service Unit Tests / Detect Changes (push) Has been cancelled
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (push) Has been cancelled
OpenMetadata Service Unit Tests / k8s_operator-unit-tests (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:35:45 +08:00

317 lines
10 KiB
HTML

<!--
Copyright 2022 Collate.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="msapplication-TileColor" content="#ffffff" />
<meta
name="msapplication-TileImage"
content="${basePath}favicons/ms-icon-144x144.png" />
<meta name="theme-color" content="#ffffff" />
<meta name="description" content="OpenMetadata Application" />
<meta property="og:title" content="OpenMetadata" />
<meta property="og:description" content="OpenMetadata Application" />
<meta
property="og:image"
content="${basePath}favicons/android-icon-192x192.png" />
<script nonce="${cspNonce}">
window.BASE_PATH = '${basePath}';
</script>
<!--
Theme restore — runs before any bundle parses so the boot shell paints
in the user's last theme instead of always flashing the light skeleton
and re-painting once React reads localStorage. Mirrors Linear's inline
splash trick (see linear.app/changelog): pre-paint reads of stable
localStorage keys avoid a visible re-theme on cold load. The bundle's
ThemeProvider re-reads the same `ui-theme` key on mount and stays in
sync with the class we set here. `appStart` mark gives the bundle a
RUM anchor to measure HTML-parse → first paint vs. JS-ready.
-->
<script nonce="${cspNonce}">
try {
if (localStorage.getItem('ui-theme') === 'dark') {
document.documentElement.classList.add('dark-mode');
}
} catch (e) {}
try {
performance.mark('appStart');
} catch (e) {}
</script>
<link rel="shortcut icon" href="${basePath}favicon.png" type="image/png" />
<link
rel="apple-touch-icon"
sizes="57x57"
href="${basePath}favicons/apple-icon-57x57.png" />
<link
rel="apple-touch-icon"
sizes="60x60"
href="${basePath}favicons/apple-icon-60x60.png" />
<link
rel="apple-touch-icon"
sizes="72x72"
href="${basePath}favicons/apple-icon-72x72.png" />
<link
rel="apple-touch-icon"
sizes="76x76"
href="${basePath}favicons/apple-icon-76x76.png" />
<link
rel="apple-touch-icon"
sizes="114x114"
href="${basePath}favicons/apple-icon-114x114.png" />
<link
rel="apple-touch-icon"
sizes="120x120"
href="${basePath}favicons/apple-icon-120x120.png" />
<link
rel="apple-touch-icon"
sizes="144x144"
href="${basePath}favicons/apple-icon-144x144.png" />
<link
rel="apple-touch-icon"
sizes="152x152"
href="${basePath}favicons/apple-icon-152x152.png" />
<link
rel="apple-touch-icon"
sizes="180x180"
href="${basePath}favicons/apple-icon-180x180.png" />
<link
rel="icon"
type="image/png"
sizes="192x192"
href="${basePath}favicons/android-icon-192x192.png" />
<link
rel="icon"
type="image/png"
sizes="32x32"
href="${basePath}favicons/favicon-32x32.png" />
<link
rel="icon"
type="image/png"
sizes="96x96"
href="${basePath}favicons/favicon-96x96.png" />
<link
rel="icon"
type="image/png"
sizes="16x16"
href="${basePath}favicons/favicon-16x16.png" />
<link rel="manifest" href="${basePath}manifest.json" />
<!--
governance.png and data-collaboration.png are only used on the /signin
and onboarding pages. The previous eager-preload script fired on every
page load (~200 KB combined). Removed — the bundle's signin route loads
them on demand via standard <img>, and the rest of the app never reads
them. Saves 2 image fetches per page view for signed-in users.
-->
<script id="google-tag-manager" nonce="${cspNonce}">
let isSandbox = location.host === 'sandbox.open-metadata.org';
if (isSandbox) {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'gtm.start': new Date().getTime(),
event: 'gtm.js',
});
const gtmScript = document.createElement('script');
gtmScript.async = true;
gtmScript.setAttribute('nonce', '${cspNonce}');
gtmScript.src =
'https://www.googletagmanager.com/gtm.js?id=GTM-554C968W';
document.head.appendChild(gtmScript);
}
</script>
<title>OpenMetadata</title>
<!--
Inlined loading shell. Shown the instant the HTML is parsed — about a
second before the React bundle finishes executing on a cold tab. Lives
inside <head> as a <style> + inside <div id="root"> as DOM, so it's
replaced atomically when React calls createRoot().render() on root.
No external CSS, no JS, no fonts — first paint is bounded by the HTML
parser, not the network.
-->
<style nonce="${cspNonce}">
.om-boot-shell {
position: fixed;
inset: 0;
background: #fafafa;
display: flex;
flex-direction: column;
font-family:
-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
color: #535862;
z-index: 0;
}
.om-boot-shell__bar {
height: 56px;
border-bottom: 1px solid #e9eaeb;
background: #ffffff;
display: flex;
align-items: center;
padding: 0 20px;
gap: 16px;
}
.om-boot-shell__logo {
height: 28px;
width: 28px;
border-radius: 6px;
background: linear-gradient(135deg, #4b48ff, #6f6cff);
}
.om-boot-shell__body {
display: flex;
flex: 1;
min-height: 0;
}
.om-boot-shell__sidebar {
width: 240px;
border-right: 1px solid #e9eaeb;
background: #ffffff;
padding: 16px 12px;
}
.om-boot-shell__skeleton {
height: 14px;
margin: 12px 4px;
border-radius: 6px;
background: linear-gradient(
90deg,
#f0f1f2 25%,
#e3e5e8 37%,
#f0f1f2 63%
);
background-size: 400% 100%;
animation: om-boot-shimmer 1.4s ease infinite;
}
.om-boot-shell__skeleton--short {
width: 60%;
}
.om-boot-shell__skeleton--medium {
width: 80%;
}
.om-boot-shell__main {
flex: 1;
padding: 24px 32px;
}
.om-boot-shell__title {
height: 22px;
width: 280px;
margin-bottom: 24px;
border-radius: 8px;
background: linear-gradient(
90deg,
#f0f1f2 25%,
#e3e5e8 37%,
#f0f1f2 63%
);
background-size: 400% 100%;
animation: om-boot-shimmer 1.4s ease infinite;
}
.om-boot-shell__card {
height: 96px;
margin-bottom: 16px;
border-radius: 12px;
background: linear-gradient(
90deg,
#f0f1f2 25%,
#e3e5e8 37%,
#f0f1f2 63%
);
background-size: 400% 100%;
animation: om-boot-shimmer 1.4s ease infinite;
}
@keyframes om-boot-shimmer {
0% {
background-position: 100% 50%;
}
100% {
background-position: 0 50%;
}
}
/*
When React mounts it replaces the children of #root, so the shell
unmounts naturally. The .om-boot-shell--hidden class is here as a
belt-and-braces escape hatch if something delays unmount.
*/
.om-boot-shell--hidden {
display: none;
}
/*
Dark variant — applied by the pre-paint script above when
localStorage.ui-theme is "dark". Matches the dark-mode CSS variables
the bundle eventually sets via ThemeProvider, so the visual transition
from shell to React UI is seamless instead of a light→dark flash.
*/
.dark-mode .om-boot-shell {
background: #0e0f11;
color: #94959b;
}
.dark-mode .om-boot-shell__bar,
.dark-mode .om-boot-shell__sidebar {
background: #16181b;
border-color: #2a2d31;
}
.dark-mode .om-boot-shell__skeleton,
.dark-mode .om-boot-shell__title,
.dark-mode .om-boot-shell__card {
background: linear-gradient(
90deg,
#1f2226 25%,
#2a2d31 37%,
#1f2226 63%
);
background-size: 400% 100%;
}
</style>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root">
<div class="om-boot-shell" aria-hidden="true">
<div class="om-boot-shell__bar">
<div class="om-boot-shell__logo"></div>
</div>
<div class="om-boot-shell__body">
<aside class="om-boot-shell__sidebar">
<div class="om-boot-shell__skeleton om-boot-shell__skeleton--medium"></div>
<div class="om-boot-shell__skeleton om-boot-shell__skeleton--short"></div>
<div class="om-boot-shell__skeleton om-boot-shell__skeleton--medium"></div>
<div class="om-boot-shell__skeleton om-boot-shell__skeleton--short"></div>
<div class="om-boot-shell__skeleton om-boot-shell__skeleton--medium"></div>
<div class="om-boot-shell__skeleton om-boot-shell__skeleton--short"></div>
<div class="om-boot-shell__skeleton om-boot-shell__skeleton--medium"></div>
</aside>
<main class="om-boot-shell__main">
<div class="om-boot-shell__title"></div>
<div class="om-boot-shell__card"></div>
<div class="om-boot-shell__card"></div>
<div class="om-boot-shell__card"></div>
</main>
</div>
</div>
</div>
<img
referrerpolicy="no-referrer-when-downgrade"
src="https://static.scarf.sh/a.png?x-pxid=9744b844-501a-4ca1-ad54-29b13e6b4642"
style="display: none"
alt="" />
<script type="module" src="/src/index.tsx"></script>
</body>
</html>