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
317 lines
10 KiB
HTML
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>
|