@@ -858,10 +915,10 @@ exports[`CollapsibleNav renders links grouped by category 1`] = `
>
@@ -1954,15 +2011,7 @@ exports[`CollapsibleNav renders the default nav 1`] = `
"serverBasePath": "/test",
}
}
- branding={
- Object {
- "darkMode": false,
- "mark": Object {
- "darkModeUrl": "/darkModeLogo",
- "defaultUrl": "/defaultModeLogo",
- },
- }
- }
+ branding={Object {}}
closeNav={[Function]}
customNavLink$={
BehaviorSubject {
@@ -2017,6 +2066,71 @@ exports[`CollapsibleNav renders the default nav 1`] = `
id="collapsibe-nav"
isLocked={false}
isNavOpen={false}
+ logos={
+ Object {
+ "AnimatedMark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_spinner_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_spinner_on_light.svg",
+ },
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_spinner_on_light.svg",
+ },
+ "Application": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_dashboards_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_dashboards_on_light.svg",
+ },
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_dashboards_on_light.svg",
+ },
+ "CenterMark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_center_mark_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_center_mark_on_light.svg",
+ },
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_center_mark_on_light.svg",
+ },
+ "Mark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_mark_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_mark_on_light.svg",
+ },
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_mark_on_light.svg",
+ },
+ "OpenSearch": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_on_light.svg",
+ },
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_on_light.svg",
+ },
+ "colorScheme": "light",
+ }
+ }
navLinks$={
BehaviorSubject {
"_isScalar": false,
@@ -2199,15 +2313,7 @@ exports[`CollapsibleNav renders the default nav 2`] = `
"serverBasePath": "/test",
}
}
- branding={
- Object {
- "darkMode": false,
- "mark": Object {
- "darkModeUrl": "/darkModeLogo",
- "defaultUrl": "/defaultModeLogo",
- },
- }
- }
+ branding={Object {}}
closeNav={[Function]}
customNavLink$={
BehaviorSubject {
@@ -2263,6 +2369,71 @@ exports[`CollapsibleNav renders the default nav 2`] = `
isLocked={false}
isNavOpen={false}
isOpen={true}
+ logos={
+ Object {
+ "AnimatedMark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_spinner_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_spinner_on_light.svg",
+ },
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_spinner_on_light.svg",
+ },
+ "Application": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_dashboards_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_dashboards_on_light.svg",
+ },
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_dashboards_on_light.svg",
+ },
+ "CenterMark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_center_mark_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_center_mark_on_light.svg",
+ },
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_center_mark_on_light.svg",
+ },
+ "Mark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_mark_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_mark_on_light.svg",
+ },
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_mark_on_light.svg",
+ },
+ "OpenSearch": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_on_light.svg",
+ },
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_on_light.svg",
+ },
+ "colorScheme": "light",
+ }
+ }
navLinks$={
BehaviorSubject {
"_isScalar": false,
@@ -2445,15 +2616,7 @@ exports[`CollapsibleNav renders the default nav 3`] = `
"serverBasePath": "/test",
}
}
- branding={
- Object {
- "darkMode": false,
- "mark": Object {
- "darkModeUrl": "/darkModeLogo",
- "defaultUrl": "/defaultModeLogo",
- },
- }
- }
+ branding={Object {}}
closeNav={[Function]}
customNavLink$={
BehaviorSubject {
@@ -2509,6 +2672,71 @@ exports[`CollapsibleNav renders the default nav 3`] = `
isLocked={true}
isNavOpen={false}
isOpen={true}
+ logos={
+ Object {
+ "AnimatedMark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_spinner_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_spinner_on_light.svg",
+ },
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_spinner_on_light.svg",
+ },
+ "Application": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_dashboards_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_dashboards_on_light.svg",
+ },
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_dashboards_on_light.svg",
+ },
+ "CenterMark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_center_mark_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_center_mark_on_light.svg",
+ },
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_center_mark_on_light.svg",
+ },
+ "Mark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_mark_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_mark_on_light.svg",
+ },
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_mark_on_light.svg",
+ },
+ "OpenSearch": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_on_light.svg",
+ },
+ "type": "default",
+ "url": "/test/ui/logos/opensearch_on_light.svg",
+ },
+ "colorScheme": "light",
+ }
+ }
navLinks$={
BehaviorSubject {
"_isScalar": false,
@@ -2922,7 +3150,7 @@ exports[`CollapsibleNav renders the default nav 3`] = `
`;
-exports[`CollapsibleNav renders the nav bar with custom logo in dark mode 1`] = `
+exports[`CollapsibleNav with custom branding renders the nav bar in dark mode 1`] = `
@@ -3476,7 +3773,7 @@ exports[`CollapsibleNav renders the nav bar with custom logo in dark mode 1`] =
}
className="euiCollapsibleNavGroup euiCollapsibleNavGroup--withHeading"
- data-test-opensearch-logo="/darkModeLogo"
+ data-test-opensearch-logo="/custom/branded/mark-darkmode.svg"
data-test-subj="collapsibleNavGroup-opensearchDashboards"
id="mockId"
initialIsOpen={true}
@@ -3487,7 +3784,7 @@ exports[`CollapsibleNav renders the nav bar with custom logo in dark mode 1`] =
>
@@ -3536,10 +3833,10 @@ exports[`CollapsibleNav renders the nav bar with custom logo in dark mode 1`] =
>
@@ -3968,7 +4265,7 @@ exports[`CollapsibleNav renders the nav bar with custom logo in dark mode 1`] =
`;
-exports[`CollapsibleNav renders the nav bar with custom logo in dark mode 2`] = `
+exports[`CollapsibleNav with custom branding renders the nav bar in default mode 1`] = `
@@ -4521,7 +4887,7 @@ exports[`CollapsibleNav renders the nav bar with custom logo in dark mode 2`] =
}
className="euiCollapsibleNavGroup euiCollapsibleNavGroup--withHeading"
- data-test-opensearch-logo="/defaultModeLogo"
+ data-test-opensearch-logo="/custom/branded/mark.svg"
data-test-subj="collapsibleNavGroup-opensearchDashboards"
id="mockId"
initialIsOpen={true}
@@ -4532,7 +4898,7 @@ exports[`CollapsibleNav renders the nav bar with custom logo in dark mode 2`] =
>
@@ -4581,10 +4947,10 @@ exports[`CollapsibleNav renders the nav bar with custom logo in dark mode 2`] =
>
@@ -5013,7 +5379,7 @@ exports[`CollapsibleNav renders the nav bar with custom logo in dark mode 2`] =
`;
-exports[`CollapsibleNav renders the nav bar with custom logo in dark mode 3`] = `
+exports[`CollapsibleNav without custom branding renders the nav bar in dark mode 1`] = `
@@ -5564,7 +5994,7 @@ exports[`CollapsibleNav renders the nav bar with custom logo in dark mode 3`] =
}
className="euiCollapsibleNavGroup euiCollapsibleNavGroup--withHeading"
- data-test-opensearch-logo="undefined/opensearch_mark_default_mode.svg"
+ data-test-opensearch-logo="/test/ui/logos/opensearch_mark_on_dark.svg"
data-test-subj="collapsibleNavGroup-opensearchDashboards"
id="mockId"
initialIsOpen={true}
@@ -5575,7 +6005,7 @@ exports[`CollapsibleNav renders the nav bar with custom logo in dark mode 3`] =
>
@@ -5624,10 +6054,10 @@ exports[`CollapsibleNav renders the nav bar with custom logo in dark mode 3`] =
>
@@ -6056,7 +6486,7 @@ exports[`CollapsibleNav renders the nav bar with custom logo in dark mode 3`] =
`;
-exports[`CollapsibleNav renders the nav bar with custom logo in default mode 1`] = `
+exports[`CollapsibleNav without custom branding renders the nav bar in default mode 1`] = `
-
-
-
-
-
-
-`;
-
-exports[`CollapsibleNav renders the nav bar with custom logo in default mode 2`] = `
-
@@ -7653,7 +7097,7 @@ exports[`CollapsibleNav renders the nav bar with custom logo in default mode 2`]
}
className="euiCollapsibleNavGroup euiCollapsibleNavGroup--withHeading"
- data-test-opensearch-logo="undefined/opensearch_mark_default_mode.svg"
+ data-test-opensearch-logo="/test/ui/logos/opensearch_mark_on_light.svg"
data-test-subj="collapsibleNavGroup-opensearchDashboards"
id="mockId"
initialIsOpen={true}
@@ -7664,7 +7108,7 @@ exports[`CollapsibleNav renders the nav bar with custom logo in default mode 2`]
>
@@ -7713,10 +7157,10 @@ exports[`CollapsibleNav renders the nav bar with custom logo in default mode 2`]
>
diff --git a/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap
index 4c2beb329a98..b9da5ac37dbe 100644
--- a/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap
+++ b/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap
@@ -247,18 +247,7 @@ exports[`Header handles visibility and lock changes 1`] = `
"serverBasePath": "/test",
}
}
- branding={
- Object {
- "applicationTitle": "OpenSearch Dashboards",
- "darkMode": false,
- "logo": Object {
- "defaultUrl": "/",
- },
- "mark": Object {
- "defaultUrl": "/",
- },
- }
- }
+ branding={Object {}}
breadcrumbs$={
BehaviorSubject {
"_isScalar": false,
@@ -1437,6 +1426,71 @@ exports[`Header handles visibility and lock changes 1`] = `
"thrownError": null,
}
}
+ logos={
+ Object {
+ "AnimatedMark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_spinner_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_spinner_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_spinner_on_light.svg",
+ },
+ "Application": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_dashboards_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_dashboards_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_dashboards_on_light.svg",
+ },
+ "CenterMark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_center_mark_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_center_mark_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_center_mark_on_light.svg",
+ },
+ "Mark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_mark_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_mark_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_mark_on_light.svg",
+ },
+ "OpenSearch": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_on_light.svg",
+ },
+ "colorScheme": "light",
+ }
+ }
navControlsCenter$={
BehaviorSubject {
"_isScalar": false,
@@ -1888,18 +1942,8 @@ exports[`Header handles visibility and lock changes 1`] = `
"borders": "none",
"items": Array [
@@ -2928,18 +3092,7 @@ exports[`Header handles visibility and lock changes 1`] = `
className="euiHeaderSectionItem euiHeaderSectionItem--borderRight"
>
@@ -3594,19 +3866,16 @@ exports[`Header handles visibility and lock changes 1`] = `
"thrownError": null,
}
}
- isDarkMode={false}
>
@@ -3614,32 +3883,39 @@ exports[`Header handles visibility and lock changes 1`] = `
breadcrumbs={
Array [
Object {
- "className": "osdBreadcrumbs",
"data-test-subj": "breadcrumb first last",
"text": "test",
},
]
}
- className="euiHeaderBreadcrumbs osdHeaderBreadcrumbs"
+ className="euiHeaderBreadcrumbs"
data-test-subj="breadcrumbs"
max={10}
truncate={true}
>
@@ -5601,18 +5877,6 @@ exports[`Header handles visibility and lock changes 1`] = `
"serverBasePath": "/test",
}
}
- branding={
- Object {
- "applicationTitle": "OpenSearch Dashboards",
- "darkMode": false,
- "logo": Object {
- "defaultUrl": "/",
- },
- "mark": Object {
- "defaultUrl": "/",
- },
- }
- }
closeNav={[Function]}
customNavLink$={
BehaviorSubject {
@@ -5672,6 +5936,71 @@ exports[`Header handles visibility and lock changes 1`] = `
id="mockId"
isLocked={true}
isNavOpen={false}
+ logos={
+ Object {
+ "AnimatedMark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_spinner_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_spinner_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_spinner_on_light.svg",
+ },
+ "Application": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_dashboards_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_dashboards_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_dashboards_on_light.svg",
+ },
+ "CenterMark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_center_mark_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_center_mark_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_center_mark_on_light.svg",
+ },
+ "Mark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_mark_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_mark_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_mark_on_light.svg",
+ },
+ "OpenSearch": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_on_light.svg",
+ },
+ "colorScheme": "light",
+ }
+ }
navLinks$={
BehaviorSubject {
"_isScalar": false,
@@ -6610,14 +6939,6 @@ exports[`Header renders condensed header 1`] = `
}
branding={
Object {
- "applicationTitle": "Foobar Dashboards",
- "darkMode": false,
- "logo": Object {
- "defaultUrl": "/foo",
- },
- "mark": Object {
- "defaultUrl": "/foo",
- },
"useExpandedHeader": false,
}
}
@@ -7753,6 +8074,71 @@ exports[`Header renders condensed header 1`] = `
"thrownError": null,
}
}
+ logos={
+ Object {
+ "AnimatedMark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_spinner_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_spinner_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_spinner_on_light.svg",
+ },
+ "Application": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_dashboards_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_dashboards_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_dashboards_on_light.svg",
+ },
+ "CenterMark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_center_mark_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_center_mark_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_center_mark_on_light.svg",
+ },
+ "Mark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_mark_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_mark_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_mark_on_light.svg",
+ },
+ "OpenSearch": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_on_light.svg",
+ },
+ "colorScheme": "light",
+ }
+ }
navControlsCenter$={
BehaviorSubject {
"_isScalar": false,
@@ -8256,14 +8642,6 @@ exports[`Header renders condensed header 1`] = `
@@ -8837,19 +9337,16 @@ exports[`Header renders condensed header 1`] = `
"thrownError": null,
}
}
- isDarkMode={false}
>
@@ -8857,32 +9354,39 @@ exports[`Header renders condensed header 1`] = `
breadcrumbs={
Array [
Object {
- "className": "osdBreadcrumbs",
"data-test-subj": "breadcrumb first",
"text": "test",
},
]
}
- className="euiHeaderBreadcrumbs osdHeaderBreadcrumbs"
+ className="euiHeaderBreadcrumbs"
data-test-subj="breadcrumbs"
max={10}
truncate={true}
>
@@ -10844,19 +11348,6 @@ exports[`Header renders condensed header 1`] = `
"serverBasePath": "/test",
}
}
- branding={
- Object {
- "applicationTitle": "Foobar Dashboards",
- "darkMode": false,
- "logo": Object {
- "defaultUrl": "/foo",
- },
- "mark": Object {
- "defaultUrl": "/foo",
- },
- "useExpandedHeader": false,
- }
- }
closeNav={[Function]}
customNavLink$={
BehaviorSubject {
@@ -10911,6 +11402,71 @@ exports[`Header renders condensed header 1`] = `
id="mockId"
isLocked={false}
isNavOpen={false}
+ logos={
+ Object {
+ "AnimatedMark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_spinner_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_spinner_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_spinner_on_light.svg",
+ },
+ "Application": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_dashboards_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_dashboards_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_dashboards_on_light.svg",
+ },
+ "CenterMark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_center_mark_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_center_mark_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_center_mark_on_light.svg",
+ },
+ "Mark": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_mark_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_mark_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_mark_on_light.svg",
+ },
+ "OpenSearch": Object {
+ "dark": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_on_dark.svg",
+ },
+ "light": Object {
+ "type": "default",
+ "url": "/ui/logos/opensearch_on_light.svg",
+ },
+ "type": "default",
+ "url": "/ui/logos/opensearch_on_light.svg",
+ },
+ "colorScheme": "light",
+ }
+ }
navLinks$={
BehaviorSubject {
"_isScalar": false,
diff --git a/src/core/public/chrome/ui/header/__snapshots__/header_breadcrumbs.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/header_breadcrumbs.test.tsx.snap
index 2308839a19a9..5080b23e99c2 100644
--- a/src/core/public/chrome/ui/header/__snapshots__/header_breadcrumbs.test.tsx.snap
+++ b/src/core/public/chrome/ui/header/__snapshots__/header_breadcrumbs.test.tsx.snap
@@ -3,7 +3,7 @@
exports[`HeaderBreadcrumbs renders updates to the breadcrumbs$ observable 1`] = `
@@ -15,7 +15,7 @@ exports[`HeaderBreadcrumbs renders updates to the breadcrumbs$ observable 2`] =
Array [
@@ -23,7 +23,7 @@ Array [
,
diff --git a/src/core/public/chrome/ui/header/__snapshots__/header_logo.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/header_logo.test.tsx.snap
index 10212cd27561..ed8ee0c5f18c 100644
--- a/src/core/public/chrome/ui/header/__snapshots__/header_logo.test.tsx.snap
+++ b/src/core/public/chrome/ui/header/__snapshots__/header_logo.test.tsx.snap
@@ -1,1868 +1,39 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`Header logo in dark mode uses custom logo dark mode URL 1`] = `
-
-
-
-
-
-`;
-
-exports[`Header logo in dark mode uses custom logo default mode URL if no dark mode logo provided 1`] = `
-
-
-
-
-
-`;
-
-exports[`Header logo in dark mode uses opensearch logo if custom mark provided without logo 1`] = `
-
-
-
-
-
-`;
-
-exports[`Header logo in dark mode uses opensearch logo if no logo provided 1`] = `
-
-
-
-
-
-`;
-
-exports[`Header logo in default mode uses custom logo default mode URL 1`] = `
-
-
-
-
-
-`;
-
-exports[`Header logo in default mode uses opensearch logo if custom mark provided without logo 1`] = `
-
-
-
-
-
-`;
-
-exports[`Header logo in default mode uses opensearch logo if no branding provided 1`] = `
-
-
-
-
-
-`;
-
-exports[`Header logo in default mode uses opensearch logo if no logo provided 1`] = `
-
-
-
-
-
+exports[`Header logo uses branded application title when provided 1`] = `
+
+
+
+`;
+
+exports[`Header logo uses default application title when not branded 1`] = `
+
+
+
`;
diff --git a/src/core/public/chrome/ui/header/__snapshots__/home_icon.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/home_icon.test.tsx.snap
index 63e83acd78e3..c1a7c11b69f9 100644
--- a/src/core/public/chrome/ui/header/__snapshots__/home_icon.test.tsx.snap
+++ b/src/core/public/chrome/ui/header/__snapshots__/home_icon.test.tsx.snap
@@ -1,1995 +1,45 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`Home button icon in condensed dark mode uses custom mark dark mode URL 1`] = `
-
-
-
-
-
-`;
-
-exports[`Home button icon in condensed dark mode uses custom mark default mode URL if no dark mode mark provided 1`] = `
-
-
-
-
-
-`;
-
-exports[`Home button icon in condensed dark mode uses opensearch mark if custom logo provided without mark 1`] = `
-
-
-
-
-
-`;
-
-exports[`Home button icon in condensed dark mode uses opensearch mark if no mark provided 1`] = `
-
-
-
-
-
-`;
-
-exports[`Home button icon in condensed light mode uses custom mark default mode URL 1`] = `
-
-
-
-
-
-`;
-
-exports[`Home button icon in condensed light mode uses opensearch mark if custom logo provided without mark 1`] = `
-
-
-
-
-
-`;
-
-exports[`Home button icon in condensed light mode uses opensearch mark if no mark provided 1`] = `
-
-
-
-
-
-`;
-
-exports[`Home button icon in dark mode uses custom mark dark mode URL 1`] = `
-
-
-
-
-
-`;
-
-exports[`Home button icon in dark mode uses custom mark default mode URL if no dark mode mark provided 1`] = `
-
-
-
-
-
-`;
-
-exports[`Home button icon in dark mode uses home icon if custom logo provided without mark 1`] = `
-
-
-
-
-
-`;
-
-exports[`Home button icon in dark mode uses home icon if no mark provided 1`] = `
-
-
-
-
-
-`;
-
-exports[`Home button icon in light mode uses custom mark default mode URL 1`] = `
-
-
-
-
-
-`;
-
-exports[`Home button icon in light mode uses home icon if custom logo provided without mark 1`] = `
-
-
-
-
-
-`;
-
-exports[`Home button icon in light mode uses home icon if no branding provided 1`] = `
-
-
-
-
-
-`;
-
-exports[`Home button icon in light mode uses home icon if no mark provided 1`] = `
-
-
-
-
-
+exports[`Home icon, custom branded, uses the custom logo when header is expanded 1`] = `
+
+`;
+
+exports[`Home icon, custom branded, uses the custom logo when header is not expanded 1`] = `
+
+`;
+
+exports[`Home icon, unbranded, uses the home icon when header is expanded 1`] = `
+
+`;
+
+exports[`Home icon, unbranded, uses the mark logo when header is not expanded 1`] = `
+
`;
diff --git a/src/core/public/chrome/ui/header/collapsible_nav.test.tsx b/src/core/public/chrome/ui/header/collapsible_nav.test.tsx
index dc44fe5053fe..955b7d7ca242 100644
--- a/src/core/public/chrome/ui/header/collapsible_nav.test.tsx
+++ b/src/core/public/chrome/ui/header/collapsible_nav.test.tsx
@@ -37,6 +37,7 @@ import { ChromeNavLink, DEFAULT_APP_CATEGORIES } from '../../..';
import { httpServiceMock } from '../../../http/http_service.mock';
import { ChromeRecentlyAccessedHistoryItem } from '../../recently_accessed';
import { CollapsibleNav } from './collapsible_nav';
+import { getLogos } from '../../../../common';
jest.mock('@elastic/eui/lib/services/accessibility/html_id_generator', () => ({
htmlIdGenerator: () => () => 'mockId',
@@ -64,10 +65,22 @@ function mockRecentNavLink({ label = 'recent' }: Partial Promise.resolve(),
navigateToUrl: () => Promise.resolve(),
customNavLink$: new BehaviorSubject(undefined),
- branding: {
- darkMode: false,
- mark: {
- defaultUrl: '/defaultModeLogo',
- darkModeUrl: '/darkModeLogo',
- },
- },
+ branding,
+ logos: getLogos(branding, mockBasePath.serverBasePath),
};
}
@@ -212,77 +220,79 @@ describe('CollapsibleNav', () => {
expectNavIsClosed(component);
});
- it('renders the nav bar with custom logo in default mode', () => {
- const navLinks = [
- mockLink({ category: opensearchDashboards }),
- mockLink({ category: observability }),
- ];
- const recentNavLinks = [mockRecentNavLink({})];
- const component = mount(
-
- );
- // check if nav bar renders default mode custom logo
- expect(component).toMatchSnapshot();
+ describe('with custom branding', () => {
+ it('renders the nav bar in default mode', () => {
+ const navLinks = [
+ mockLink({ category: opensearchDashboards }),
+ mockLink({ category: observability }),
+ ];
+ const recentNavLinks = [mockRecentNavLink({})];
+ const component = mount(
+
+ );
- // check if nav bar renders the original default mode opensearch mark
- component.setProps({
- branding: {
- darkMode: false,
- mark: {},
- },
+ expect(component).toMatchSnapshot();
});
- expect(component).toMatchSnapshot();
- });
- it('renders the nav bar with custom logo in dark mode', () => {
- const navLinks = [
- mockLink({ category: opensearchDashboards }),
- mockLink({ category: observability }),
- ];
- const recentNavLinks = [mockRecentNavLink({})];
- const component = mount(
-
- );
- // check if nav bar renders dark mode custom logo
- component.setProps({
- branding: {
- darkMode: true,
- mark: {
- defaultUrl: '/defaultModeLogo',
- darkModeUrl: '/darkModeLogo',
- },
- },
+ it('renders the nav bar in dark mode', () => {
+ const navLinks = [
+ mockLink({ category: opensearchDashboards }),
+ mockLink({ category: observability }),
+ ];
+ const recentNavLinks = [mockRecentNavLink({})];
+ const component = mount(
+
+ );
+
+ expect(component).toMatchSnapshot();
});
- expect(component).toMatchSnapshot();
+ });
- // check if nav bar renders default mode custom logo
- component.setProps({
- branding: {
- darkMode: true,
- mark: {
- defaultUrl: '/defaultModeLogo',
- },
- },
+ describe('without custom branding', () => {
+ it('renders the nav bar in default mode', () => {
+ const navLinks = [
+ mockLink({ category: opensearchDashboards }),
+ mockLink({ category: observability }),
+ ];
+ const recentNavLinks = [mockRecentNavLink({})];
+ const component = mount(
+
+ );
+
+ expect(component).toMatchSnapshot();
});
- expect(component).toMatchSnapshot();
- // check if nav bar renders the original dark mode opensearch mark
- component.setProps({
- branding: {
- darkMode: false,
- mark: {},
- },
+ it('renders the nav bar in dark mode', () => {
+ const navLinks = [
+ mockLink({ category: opensearchDashboards }),
+ mockLink({ category: observability }),
+ ];
+ const recentNavLinks = [mockRecentNavLink({})];
+ const component = mount(
+
+ );
+
+ expect(component).toMatchSnapshot();
});
- expect(component).toMatchSnapshot();
});
});
diff --git a/src/core/public/chrome/ui/header/collapsible_nav.tsx b/src/core/public/chrome/ui/header/collapsible_nav.tsx
index 51d43d96f7fd..8b178200114a 100644
--- a/src/core/public/chrome/ui/header/collapsible_nav.tsx
+++ b/src/core/public/chrome/ui/header/collapsible_nav.tsx
@@ -50,7 +50,7 @@ import { InternalApplicationStart } from '../../../application/types';
import { HttpStart } from '../../../http';
import { OnIsLockedUpdate } from './';
import { createEuiListItem, createRecentNavLink, isModifiedOrPrevented } from './nav_link';
-import { ChromeBranding } from '../../chrome_service';
+import type { Logos } from '../../../../common/types';
function getAllCategories(allCategorizedLinks: Record) {
const allCategories = {} as Record;
@@ -101,7 +101,7 @@ interface Props {
navigateToApp: InternalApplicationStart['navigateToApp'];
navigateToUrl: InternalApplicationStart['navigateToUrl'];
customNavLink$: Rx.Observable;
- branding: ChromeBranding;
+ logos: Logos;
}
export function CollapsibleNav({
@@ -115,7 +115,7 @@ export function CollapsibleNav({
closeNav,
navigateToApp,
navigateToUrl,
- branding,
+ logos,
...observables
}: Props) {
const navLinks = useObservable(observables.navLinks$, []).filter((link) => !link.hidden);
@@ -138,42 +138,6 @@ export function CollapsibleNav({
});
};
- const DEFAULT_OPENSEARCH_MARK = `${branding.assetFolderUrl}/opensearch_mark_default_mode.svg`;
- const DARKMODE_OPENSEARCH_MARK = `${branding.assetFolderUrl}/opensearch_mark_dark_mode.svg`;
-
- const darkMode = branding.darkMode;
- const markDefault = branding.mark?.defaultUrl;
- const markDarkMode = branding.mark?.darkModeUrl;
-
- /**
- * Use branding configurations to check which URL to use for rendering
- * side menu opensearch logo in default mode
- *
- * @returns a valid custom URL or original default mode opensearch mark if no valid URL is provided
- */
- const customSideMenuLogoDefaultMode = () => {
- return markDefault ?? DEFAULT_OPENSEARCH_MARK;
- };
-
- /**
- * Use branding configurations to check which URL to use for rendering
- * side menu opensearch logo in dark mode
- *
- * @returns a valid custom URL or original dark mode opensearch mark if no valid URL is provided
- */
- const customSideMenuLogoDarkMode = () => {
- return markDarkMode ?? markDefault ?? DARKMODE_OPENSEARCH_MARK;
- };
-
- /**
- * Render custom side menu logo for both default mode and dark mode
- *
- * @returns a valid logo URL
- */
- const customSideMenuLogo = () => {
- return darkMode ? customSideMenuLogoDarkMode() : customSideMenuLogoDefaultMode();
- };
-
return (
{
const category = categoryDictionary[categoryName]!;
const opensearchLinkLogo =
- category.id === 'opensearchDashboards' ? customSideMenuLogo() : category.euiIconType;
+ category.id === 'opensearchDashboards' ? logos.Mark.url : category.euiIconType;
return (
{},
- branding: {
- darkMode: false,
- logo: { defaultUrl: '/' },
- mark: { defaultUrl: '/' },
- applicationTitle: 'OpenSearch Dashboards',
- },
+ branding: {},
survey: '/',
+ logos: chromeServiceMock.createStartContract().logos,
};
}
@@ -102,17 +98,17 @@ describe('Header', () => {
const recentlyAccessed$ = new BehaviorSubject([
{ link: '', label: 'dashboard', id: 'dashboard' },
]);
- const component = mountWithIntl(
-
- );
+ const props = {
+ ...mockProps(),
+ isVisible$,
+ breadcrumbs$,
+ navLinks$,
+ recentlyAccessed$,
+ isLocked$,
+ customNavLink$,
+ };
+
+ const component = mountWithIntl();
expect(component.find('EuiHeader').exists()).toBeFalsy();
expect(component.find('EuiProgress').exists()).toBeTruthy();
@@ -120,7 +116,6 @@ describe('Header', () => {
component.update();
expect(component.find('EuiHeader.primaryHeader').exists()).toBeTruthy();
expect(component.find('EuiHeader.expandedHeader').exists()).toBeTruthy();
- expect(component.find('HeaderLogo').exists()).toBeTruthy();
expect(component.find('HeaderNavControls')).toHaveLength(5);
expect(component.find('[data-test-subj="toggleNavButton"]').exists()).toBeTruthy();
expect(component.find('HomeLoader').exists()).toBeTruthy();
@@ -131,6 +126,11 @@ describe('Header', () => {
expect(component.find('EuiFlyout[aria-label="Primary"]').exists()).toBeFalsy();
+ const headerLogo = component.find('HeaderLogo');
+ expect(headerLogo.exists()).toBeTruthy();
+ expect(headerLogo.prop('backgroundColorScheme')).toEqual('dark');
+ expect(headerLogo.prop('logos')).toEqual(props.logos);
+
act(() => isLocked$.next(true));
component.update();
expect(component.find('EuiFlyout[aria-label="Primary"]').exists()).toBeTruthy();
@@ -139,16 +139,13 @@ describe('Header', () => {
it('renders condensed header', () => {
const branding = {
- darkMode: false,
- logo: { defaultUrl: '/foo' },
- mark: { defaultUrl: '/foo' },
- applicationTitle: 'Foobar Dashboards',
useExpandedHeader: false,
};
const props = {
...mockProps(),
branding,
};
+
const component = mountWithIntl();
expect(component.find('EuiHeader.primaryHeader').exists()).toBeTruthy();
diff --git a/src/core/public/chrome/ui/header/header.tsx b/src/core/public/chrome/ui/header/header.tsx
index a78371f4f264..acc7c6869145 100644
--- a/src/core/public/chrome/ui/header/header.tsx
+++ b/src/core/public/chrome/ui/header/header.tsx
@@ -30,6 +30,7 @@
import {
EuiHeader,
+ EuiHeaderProps,
EuiHeaderSection,
EuiHeaderSectionItem,
EuiHeaderSectionItemButton,
@@ -63,6 +64,7 @@ import { HomeLoader } from './home_loader';
import { HeaderNavControls } from './header_nav_controls';
import { HeaderActionMenu } from './header_action_menu';
import { HeaderLogo } from './header_logo';
+import type { Logos } from '../../../../common/types';
export interface HeaderProps {
opensearchDashboardsVersion: string;
@@ -89,6 +91,7 @@ export interface HeaderProps {
loadingCount$: ReturnType;
onIsLockedUpdate: OnIsLockedUpdate;
branding: ChromeBranding;
+ logos: Logos;
survey: string | undefined;
}
@@ -101,6 +104,7 @@ export function Header({
homeHref,
branding,
survey,
+ logos,
...observables
}: HeaderProps) {
const isVisible = useObservable(observables.isVisible$, false);
@@ -114,7 +118,9 @@ export function Header({
const toggleCollapsibleNavRef = createRef void }>();
const navId = htmlIdGenerator()();
const className = classnames('hide-for-sharing', 'headerGlobalNav');
- const { useExpandedHeader = true, darkMode } = branding;
+ const { useExpandedHeader = true } = branding;
+
+ const expandedHeaderColorScheme: EuiHeaderProps['theme'] = 'dark';
return (
<>
@@ -123,7 +129,7 @@ export function Header({
{useExpandedHeader && (
,
],
borders: 'none',
@@ -194,6 +203,7 @@ export function Header({
navLinks$={observables.navLinks$}
navigateToApp={application.navigateToApp}
branding={branding}
+ logos={logos}
loadingCount$={observables.loadingCount$}
/>
@@ -202,7 +212,6 @@ export function Header({
@@ -254,7 +263,7 @@ export function Header({
}
}}
customNavLink$={observables.customNavLink$}
- branding={branding}
+ logos={logos}
/>
>
diff --git a/src/core/public/chrome/ui/header/header_breadcrumbs.scss b/src/core/public/chrome/ui/header/header_breadcrumbs.scss
deleted file mode 100644
index 5ac333e1615a..000000000000
--- a/src/core/public/chrome/ui/header/header_breadcrumbs.scss
+++ /dev/null
@@ -1,107 +0,0 @@
-@import "../../../../public/variables";
-
-$firstBreadcrumbPolygon: polygon(
- 0% 0%,
- 100% 0%,
- calc(100% - #{$euiSizeS}) 100%,
- 0% 100%
-);
-$breadcrumbPolygon: polygon(
- $euiSizeS 0%,
- 100% 0%,
- calc(100% - #{$euiSizeS}) 100%,
- 0% 100%
-);
-
-/* remove background color on autofocus for euiBreadcrumbs in Popover */
-.euiBreadcrumbs__inPopover {
- .euiLink.euiLink--text:focus {
- background: none;
- }
-}
-
-.osdHeaderBreadcrumbs {
- /* common for both light & dark theme */
- .osdBreadcrumbs,
- &--dark .osdBreadcrumbs {
- clip-path: $breadcrumbPolygon;
- padding: $euiSizeXS - 2.5 $euiSizeL - $euiSizeXS;
-
- &:first-child {
- clip-path: $firstBreadcrumbPolygon;
- }
- }
-
- .osdBreadcrumbs {
- background-color: $osdHeaderBreadcrumbGrayBackground;
-
- &:last-child {
- background-color: $osdHeaderBreadcrumbBlueBackground;
- }
- }
-
- /* only light mode */
- .euiBreadcrumb__collapsedLink {
- color: $osdHeaderBreadcrumbCollapsedLink;
- background: $euiColorEmptyShade;
- }
-
- .euiLink.euiLink--subdued:focus {
- background: $euiColorEmptyShade;
- outline: $euiSizeXS - 1 solid $osdHeaderBreadcrumbBlueBackground;
- }
-
- /* common for dark & light mode */
- &,
- &--dark {
- /*
- filter defines a custom filter effect by grouping atomic filter primitives!
- here we are using Gaussian filter with stdDeviation for applying
- border-radius on clipped background.
- */
- filter: url("../../public/assets/round_filter.svg#round");
-
- button {
- line-height: inherit;
- }
-
- .euiBreadcrumbSeparator {
- display: none;
- }
-
- .euiPopover__anchor {
- padding: 0 $euiSizeS;
- }
-
- .euiBreadcrumb:not(.euiBreadcrumb:last-child) {
- margin-right: 0;
- }
- }
-
- /* only dark mode */
- &--dark {
- .osdBreadcrumbs {
- background-color: $osdHeaderBreadcrumbMidnightSkyMediumBackground;
- color: $osdHeaderBreadcrumbMidnightSkyMediumLightColor;
-
- &:hover {
- color: $osdHeaderBreadcrumbMidnightSkyMediumLightHoverColor;
- }
-
- &:last-child {
- background-color: $osdHeaderBreadcrumbPacificSkyDarkestBackground;
- color: $euiColorFullShade;
- }
- }
-
- .euiBreadcrumb__collapsedLink {
- color: $euiColorGhost;
- background: $euiColorEmptyShade;
- }
-
- .euiLink.euiLink--subdued:focus {
- background: $euiColorEmptyShade;
- outline: $euiSizeXS - 1 solid $osdHeaderBreadcrumbPacificSkyDarkestBackground;
- }
- }
-}
diff --git a/src/core/public/chrome/ui/header/header_breadcrumbs.test.tsx b/src/core/public/chrome/ui/header/header_breadcrumbs.test.tsx
index d95e7881cf5a..2008a3f6c493 100644
--- a/src/core/public/chrome/ui/header/header_breadcrumbs.test.tsx
+++ b/src/core/public/chrome/ui/header/header_breadcrumbs.test.tsx
@@ -38,11 +38,7 @@ describe('HeaderBreadcrumbs', () => {
it('renders updates to the breadcrumbs$ observable', () => {
const breadcrumbs$ = new BehaviorSubject([{ text: 'First' }]);
const wrapper = mount(
-
+
);
expect(wrapper.find('.euiBreadcrumb')).toMatchSnapshot();
diff --git a/src/core/public/chrome/ui/header/header_breadcrumbs.tsx b/src/core/public/chrome/ui/header/header_breadcrumbs.tsx
index ba81b61e8bcd..ca50b15d5af6 100644
--- a/src/core/public/chrome/ui/header/header_breadcrumbs.tsx
+++ b/src/core/public/chrome/ui/header/header_breadcrumbs.tsx
@@ -35,18 +35,14 @@ import useObservable from 'react-use/lib/useObservable';
import { Observable } from 'rxjs';
import { ChromeBreadcrumb } from '../../chrome_service';
-import './header_breadcrumbs.scss';
-
interface Props {
appTitle$: Observable;
breadcrumbs$: Observable;
- isDarkMode?: boolean;
}
-export function HeaderBreadcrumbs({ appTitle$, breadcrumbs$, isDarkMode }: Props) {
+export function HeaderBreadcrumbs({ appTitle$, breadcrumbs$ }: Props) {
const appTitle = useObservable(appTitle$, 'OpenSearch Dashboards');
const breadcrumbs = useObservable(breadcrumbs$, []);
- const className = isDarkMode ? 'osdHeaderBreadcrumbs--dark' : 'osdHeaderBreadcrumbs';
let crumbs = breadcrumbs;
if (breadcrumbs.length === 0 && appTitle) {
@@ -61,15 +57,7 @@ export function HeaderBreadcrumbs({ appTitle$, breadcrumbs$, isDarkMode }: Props
i === 0 && 'first',
i === breadcrumbs.length - 1 && 'last'
),
- className: classNames('osdBreadcrumbs'),
}));
- return (
-
- );
+ return ;
}
diff --git a/src/core/public/chrome/ui/header/header_logo.test.tsx b/src/core/public/chrome/ui/header/header_logo.test.tsx
index 0ac5a03b3589..c43073ec7f48 100644
--- a/src/core/public/chrome/ui/header/header_logo.test.tsx
+++ b/src/core/public/chrome/ui/header/header_logo.test.tsx
@@ -5,165 +5,100 @@
import React from 'react';
import { BehaviorSubject } from 'rxjs';
-import { mountWithIntl } from 'test_utils/enzyme_helpers';
-import { HeaderLogo, DEFAULT_DARK_LOGO, DEFAULT_LOGO } from './header_logo';
+import { mountWithIntl, shallowWithIntl } from 'test_utils/enzyme_helpers';
+import { HeaderLogo } from './header_logo';
+import { getLogosMock } from '../../../../common/mocks';
+const mockTitle = 'Page Title';
const mockProps = () => ({
href: '/',
navLinks$: new BehaviorSubject([]),
forceNavigation$: new BehaviorSubject(false),
navigateToApp: jest.fn(),
branding: {},
+ logos: getLogosMock.default,
});
-describe('Header logo ', () => {
- describe('in default mode ', () => {
- it('uses opensearch logo if no branding provided', () => {
- const branding = {};
- const props = {
- ...mockProps(),
- branding,
- };
- const component = mountWithIntl();
- const img = component.find('.logoContainer img');
- expect(img.prop('src')).toEqual(`/${DEFAULT_LOGO}`);
- expect(img.prop('alt')).toEqual(`opensearch dashboards logo`);
- expect(component).toMatchSnapshot();
- });
+describe('Header logo', () => {
+ it("uses the light color-scheme's Application logo by default", () => {
+ const props = {
+ ...mockProps(),
+ };
+ const component = shallowWithIntl();
+ const img = component.find('.logoContainer img');
+ expect(img.prop('src')).toEqual(props.logos.Application.light.url);
+ });
- it('uses opensearch logo if no logo provided', () => {
- const branding = {
- darkMode: false,
- logo: {},
- mark: {},
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- };
- const props = {
- ...mockProps(),
- branding,
- };
- const component = mountWithIntl();
- const img = component.find('.logoContainer img');
- expect(img.prop('src')).toEqual(`${branding.assetFolderUrl}/${DEFAULT_LOGO}`);
- expect(img.prop('alt')).toEqual(`${branding.applicationTitle} logo`);
- expect(component).toMatchSnapshot();
- });
+ it("uses the light color-scheme's Application logo if the header's theme is not dark", () => {
+ const props = {
+ ...mockProps(),
+ backgroundColorScheme: 'light' as const,
+ };
+ const component = shallowWithIntl();
+ const img = component.find('.logoContainer img');
+ expect(img.prop('src')).toEqual(props.logos.Application.light.url);
+ });
- it('uses opensearch logo if custom mark provided without logo', () => {
- const branding = {
- darkMode: false,
- logo: {},
- mark: { defaultUrl: '/defaultModeMark' },
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- };
- const props = {
- ...mockProps(),
- branding,
- };
- const component = mountWithIntl();
- const img = component.find('.logoContainer img');
- expect(img.prop('src')).toEqual(`${branding.assetFolderUrl}/${DEFAULT_LOGO}`);
- expect(img.prop('alt')).toEqual(`${branding.applicationTitle} logo`);
- expect(component).toMatchSnapshot();
- });
+ it("uses the normal color-scheme's Application logo if the header's theme is not dark", () => {
+ const props = {
+ ...mockProps(),
+ backgroundColorScheme: 'normal' as const,
+ };
+ const component = shallowWithIntl();
+ const img = component.find('.logoContainer img');
+ expect(img.prop('src')).toEqual(props.logos.Application.light.url);
+ });
- it('uses custom logo default mode URL', () => {
- const branding = {
- darkMode: false,
- logo: { defaultUrl: '/defaultModeLogo' },
- mark: {},
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- };
- const props = {
- ...mockProps(),
- branding,
- };
- const component = mountWithIntl();
- const img = component.find('.logoContainer img');
- expect(img.prop('src')).toEqual(branding.logo.defaultUrl);
- expect(img.prop('alt')).toEqual(`${branding.applicationTitle} logo`);
- expect(component).toMatchSnapshot();
- });
+ it("uses the dark color-scheme's Application logo if the header's theme is dark", () => {
+ const props = {
+ ...mockProps(),
+ backgroundColorScheme: 'dark' as const,
+ };
+ const component = shallowWithIntl();
+ const img = component.find('.logoContainer img');
+ expect(img.prop('src')).toEqual(props.logos.Application.dark.url);
});
- describe('in dark mode ', () => {
- it('uses opensearch logo if no logo provided', () => {
- const branding = {
- darkMode: true,
- logo: {},
- mark: {},
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- };
- const props = {
- ...mockProps(),
- branding,
- };
- const component = mountWithIntl();
- const img = component.find('.logoContainer img');
- expect(img.prop('src')).toEqual(`${branding.assetFolderUrl}/${DEFAULT_DARK_LOGO}`);
- expect(img.prop('alt')).toEqual(`${branding.applicationTitle} logo`);
- expect(component).toMatchSnapshot();
- });
+ it('uses default application title when not branded', () => {
+ const props = {
+ ...mockProps(),
+ };
+ const component = shallowWithIntl();
+ const img = component.find('.logoContainer img');
+ expect(img.prop('data-test-subj')).toEqual(`defaultLogo`);
+ expect(img.prop('alt')).toEqual(`opensearch dashboards logo`);
+ expect(component).toMatchSnapshot();
+ });
- it('uses opensearch logo if custom mark provided without logo', () => {
- const branding = {
- darkMode: true,
- logo: {},
- mark: { defaultUrl: '/defaultModeMark' },
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- };
- const props = {
- ...mockProps(),
- branding,
- };
- const component = mountWithIntl();
- const img = component.find('.logoContainer img');
- expect(img.prop('src')).toEqual(`${branding.assetFolderUrl}/${DEFAULT_DARK_LOGO}`);
- expect(img.prop('alt')).toEqual(`${branding.applicationTitle} logo`);
- expect(component).toMatchSnapshot();
- });
+ it('uses branded application title when provided', () => {
+ const props = {
+ ...mockProps(),
+ logos: getLogosMock.branded,
+ branding: {
+ applicationTitle: mockTitle,
+ },
+ };
+ const component = shallowWithIntl();
+ const img = component.find('.logoContainer img');
+ expect(img.prop('data-test-subj')).toEqual(`customLogo`);
+ expect(img.prop('alt')).toEqual(`${mockTitle} logo`);
+ expect(component).toMatchSnapshot();
+ });
- it('uses custom logo default mode URL if no dark mode logo provided', () => {
- const branding = {
- darkMode: true,
- logo: { defaultUrl: '/defaultModeLogo' },
- mark: {},
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- };
+ describe('onClick', () => {
+ it('uses default application title when not branded', () => {
const props = {
...mockProps(),
- branding,
};
const component = mountWithIntl();
- const img = component.find('.logoContainer img');
- expect(img.prop('src')).toEqual(branding.logo.defaultUrl);
- expect(img.prop('alt')).toEqual(`${branding.applicationTitle} logo`);
- expect(component).toMatchSnapshot();
- });
+ component.find('.logoContainer img').simulate('click');
- it('uses custom logo dark mode URL', () => {
- const branding = {
- darkMode: true,
- logo: { defaultUrl: '/defaultModeLogo', darkModeUrl: '/darkModeLogo' },
- mark: {},
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- };
- const props = {
- ...mockProps(),
- branding,
- };
- const component = mountWithIntl();
- const img = component.find('.logoContainer img');
- expect(img.prop('src')).toEqual(branding.logo.darkModeUrl);
- expect(img.prop('alt')).toEqual(`${branding.applicationTitle} logo`);
- expect(component).toMatchSnapshot();
+ expect(props.navigateToApp).toHaveBeenCalledTimes(1);
+ expect(props.navigateToApp).toHaveBeenCalledWith('home');
});
+
+ // ToDo: Add tests for onClick
+ // https://github.com/opensearch-project/OpenSearch-Dashboards/issues/4692
+ it.todo('performs all the complications');
});
});
diff --git a/src/core/public/chrome/ui/header/header_logo.tsx b/src/core/public/chrome/ui/header/header_logo.tsx
index 26b1783e132b..b5fddee0e595 100644
--- a/src/core/public/chrome/ui/header/header_logo.tsx
+++ b/src/core/public/chrome/ui/header/header_logo.tsx
@@ -35,21 +35,7 @@ import useObservable from 'react-use/lib/useObservable';
import { Observable } from 'rxjs';
import { ChromeNavLink } from '../..';
import { ChromeBranding } from '../../chrome_service';
-
-function findClosestAnchor(element: HTMLElement): HTMLAnchorElement | void {
- let current = element;
- while (current) {
- if (current.tagName === 'A') {
- return current as HTMLAnchorElement;
- }
-
- if (!current.parentElement || current.parentElement === document.body) {
- return undefined;
- }
-
- current = current.parentElement;
- }
-}
+import type { Logos } from '../../../../common/types';
function onClick(
event: React.MouseEvent,
@@ -57,7 +43,7 @@ function onClick(
navLinks: ChromeNavLink[],
navigateToApp: (appId: string) => void
) {
- const anchor = findClosestAnchor((event as any).nativeEvent.target);
+ const anchor = (event.nativeEvent.target as HTMLAnchorElement)?.closest('a');
if (!anchor) {
return;
}
@@ -96,32 +82,37 @@ function onClick(
}
}
-export const DEFAULT_DARK_LOGO = 'opensearch_logo_dark_mode.svg';
-export const DEFAULT_LOGO = 'opensearch_logo_default_mode.svg';
interface Props {
href: string;
navLinks$: Observable;
forceNavigation$: Observable;
navigateToApp: (appId: string) => void;
branding: ChromeBranding;
+ logos: Logos;
+ /* indicates the background color-scheme this element will appear over
+ * `'normal'` and `'light'` are synonyms of being `undefined`, to mean not `'dark'`
+ */
+ backgroundColorScheme?: 'normal' | 'light' | 'dark';
}
-export function HeaderLogo({ href, navigateToApp, branding, ...observables }: Props) {
+export function HeaderLogo({
+ href,
+ navigateToApp,
+ branding,
+ logos,
+ backgroundColorScheme,
+ ...observables
+}: Props) {
const forceNavigation = useObservable(observables.forceNavigation$, false);
const navLinks = useObservable(observables.navLinks$, []);
- const {
- darkMode,
- assetFolderUrl = '',
- logo = {},
- applicationTitle = 'opensearch dashboards',
- } = branding;
- const { defaultUrl: logoUrl, darkModeUrl: darkLogoUrl } = logo;
+ const { applicationTitle = 'opensearch dashboards' } = branding;
- const customLogo = darkMode ? darkLogoUrl ?? logoUrl : logoUrl;
- const defaultLogo = darkMode ? DEFAULT_DARK_LOGO : DEFAULT_LOGO;
+ const {
+ [backgroundColorScheme === 'dark' ? 'dark' : 'light']: { url: logoURL },
+ type: logoType,
+ } = logos.Application;
+ const testSubj = `${logoType}Logo`;
- const logoSrc = customLogo ? customLogo : `${assetFolderUrl}/${defaultLogo}`;
- const testSubj = customLogo ? 'customLogo' : 'defaultLogo';
const alt = `${applicationTitle} logo`;
return (
@@ -136,8 +127,8 @@ export function HeaderLogo({ href, navigateToApp, branding, ...observables }: Pr
>
{
- describe('in condensed light mode ', () => {
- it('uses opensearch mark if no mark provided', () => {
- const branding = {
- darkMode: false,
- logo: {},
- mark: {},
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- useExpandedHeader: false,
- };
- const component = mountWithIntl();
- const icon = component.find('EuiIcon');
- expect(icon.prop('type')).toEqual(`${branding.assetFolderUrl}/${DEFAULT_MARK}`);
- expect(icon.prop('title')).toEqual(`${branding.applicationTitle} home`);
- expect(component).toMatchSnapshot();
- });
+import { shallow } from 'enzyme';
+import { HomeIcon } from './home_icon';
+import { getLogosMock } from '../../../../common/mocks';
- it('uses opensearch mark if custom logo provided without mark', () => {
- const branding = {
- darkMode: false,
- logo: { defaultUrl: '/defaultModeLogo' },
- mark: {},
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- useExpandedHeader: false,
- };
- const component = mountWithIntl();
- const icon = component.find('EuiIcon');
- expect(icon.prop('type')).toEqual(`${branding.assetFolderUrl}/${DEFAULT_MARK}`);
- expect(icon.prop('title')).toEqual(`${branding.applicationTitle} home`);
- expect(component).toMatchSnapshot();
- });
+const mockTitle = 'Page Title';
- it('uses custom mark default mode URL', () => {
- const branding = {
- darkMode: false,
- logo: {},
- mark: { defaultUrl: '/defaultModeMark' },
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- useExpandedHeader: false,
- };
- const component = mountWithIntl();
- const icon = component.find('EuiIcon');
- expect(icon.prop('type')).toEqual(branding.mark.defaultUrl);
- expect(icon.prop('title')).toEqual(`${branding.applicationTitle} home`);
- expect(component).toMatchSnapshot();
+describe('Home icon,', () => {
+ describe('unbranded,', () => {
+ const mockProps = () => ({
+ branding: {},
+ logos: getLogosMock.default,
});
- });
- describe('in condensed dark mode ', () => {
- it('uses opensearch mark if no mark provided', () => {
- const branding = {
- darkMode: true,
- logo: {},
- mark: {},
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- useExpandedHeader: false,
- };
- const component = mountWithIntl();
+ it('uses the home icon by default', () => {
+ const props = mockProps();
+ const component = shallow();
const icon = component.find('EuiIcon');
- expect(icon.prop('type')).toEqual(`${branding.assetFolderUrl}/${DEFAULT_DARK_MARK}`);
- expect(icon.prop('title')).toEqual(`${branding.applicationTitle} home`);
- expect(component).toMatchSnapshot();
+ expect(icon.prop('data-test-subj')).toEqual('homeIcon');
+ expect(icon.prop('type')).toEqual('home');
+ expect(icon.prop('size')).toEqual('m');
+ expect(icon.prop('title')).toEqual('opensearch dashboards home');
});
- it('uses opensearch mark if custom logo provided without mark', () => {
- const branding = {
- darkMode: true,
- logo: { defaultUrl: '/defaultModeLogo' },
- mark: {},
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- useExpandedHeader: false,
+ it('uses the home icon when header is expanded', () => {
+ const props = {
+ ...mockProps(),
+ branding: {
+ useExpandedHeader: true,
+ },
};
- const component = mountWithIntl();
+ const component = shallow();
const icon = component.find('EuiIcon');
- expect(icon.prop('type')).toEqual(`${branding.assetFolderUrl}/${DEFAULT_DARK_MARK}`);
- expect(icon.prop('title')).toEqual(`${branding.applicationTitle} home`);
- expect(component).toMatchSnapshot();
- });
+ expect(icon.prop('data-test-subj')).toEqual('homeIcon');
+ expect(icon.prop('type')).toEqual('home');
+ expect(icon.prop('size')).toEqual('m');
+ expect(icon.prop('title')).toEqual('opensearch dashboards home');
- it('uses custom mark default mode URL if no dark mode mark provided', () => {
- const branding = {
- darkMode: true,
- logo: {},
- mark: { defaultUrl: '/defaultModeMark' },
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- useExpandedHeader: false,
- };
- const component = mountWithIntl();
- const icon = component.find('EuiIcon');
- expect(icon.prop('type')).toEqual(branding.mark.defaultUrl);
- expect(icon.prop('title')).toEqual(`${branding.applicationTitle} home`);
expect(component).toMatchSnapshot();
});
- it('uses custom mark dark mode URL', () => {
- const branding = {
- darkMode: true,
- logo: {},
- mark: { defaultUrl: '/defaultModeMark', darkModeUrl: '/darkModeMark' },
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- useExpandedHeader: false,
+ it('uses the mark logo when header is not expanded', () => {
+ const props = {
+ ...mockProps(),
+ branding: {
+ useExpandedHeader: false,
+ },
};
- const component = mountWithIntl();
+ const component = shallow();
const icon = component.find('EuiIcon');
- expect(icon.prop('type')).toEqual(branding.mark.darkModeUrl);
- expect(icon.prop('title')).toEqual(`${branding.applicationTitle} home`);
+ expect(icon.prop('data-test-subj')).toEqual('defaultMark');
+ expect(icon.prop('type')).toEqual(props.logos.Mark.url);
+ expect(icon.prop('size')).toEqual('l');
+ expect(icon.prop('title')).toEqual('opensearch dashboards home');
+
expect(component).toMatchSnapshot();
});
});
- describe('in light mode ', () => {
- it('uses home icon if no branding provided', () => {
- const branding = {};
- const component = mountWithIntl();
- const icon = component.find('EuiIcon');
- expect(icon.prop('type')).toEqual('home');
- expect(icon.prop('size')).toEqual(`m`);
- expect(icon.prop('title')).toEqual(`opensearch dashboards home`);
- expect(component).toMatchSnapshot();
+ describe('custom branded,', () => {
+ const mockProps = () => ({
+ branding: {
+ applicationTitle: mockTitle,
+ },
+ logos: getLogosMock.branded,
});
- it('uses home icon if no mark provided', () => {
- const branding = {
- darkMode: false,
- logo: {},
- mark: {},
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- };
- const component = mountWithIntl();
+ it('uses the custom logo by default', () => {
+ const props = mockProps();
+ const component = shallow();
const icon = component.find('EuiIcon');
- expect(icon.prop('type')).toEqual('home');
- expect(icon.prop('size')).toEqual(`m`);
- expect(icon.prop('title')).toEqual(`${branding.applicationTitle} home`);
- expect(component).toMatchSnapshot();
+ expect(icon.prop('data-test-subj')).toEqual('customMark');
+ expect(icon.prop('type')).toEqual(props.logos.Mark.url);
+ expect(icon.prop('size')).toEqual('l');
+ expect(icon.prop('title')).toEqual(`${mockTitle} home`);
});
- it('uses home icon if custom logo provided without mark', () => {
- const branding = {
- darkMode: false,
- logo: { defaultUrl: '/defaultModeLogo' },
- mark: {},
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- };
- const component = mountWithIntl();
- const icon = component.find('EuiIcon');
- expect(icon.prop('type')).toEqual('home');
- expect(icon.prop('size')).toEqual(`m`);
- expect(icon.prop('title')).toEqual(`${branding.applicationTitle} home`);
- expect(component).toMatchSnapshot();
- });
+ it('uses the custom logo when header is expanded', () => {
+ const props = mockProps();
+ // @ts-expect-error
+ props.branding.useExpandedHeader = true;
- it('uses custom mark default mode URL', () => {
- const branding = {
- darkMode: false,
- logo: {},
- mark: { defaultUrl: '/defaultModeMark' },
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- };
- const component = mountWithIntl();
+ const component = shallow();
const icon = component.find('EuiIcon');
- expect(icon.prop('type')).toEqual(branding.mark.defaultUrl);
- expect(icon.prop('size')).toEqual(`l`);
- expect(icon.prop('title')).toEqual(`${branding.applicationTitle} home`);
- expect(component).toMatchSnapshot();
- });
- });
+ expect(icon.prop('data-test-subj')).toEqual('customMark');
+ expect(icon.prop('type')).toEqual(props.logos.Mark.url);
+ expect(icon.prop('size')).toEqual('l');
+ expect(icon.prop('title')).toEqual(`${mockTitle} home`);
- describe('in dark mode ', () => {
- it('uses home icon if no mark provided', () => {
- const branding = {
- darkMode: true,
- logo: {},
- mark: {},
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- };
- const component = mountWithIntl();
- const icon = component.find('EuiIcon');
- expect(icon.prop('type')).toEqual('home');
- expect(icon.prop('size')).toEqual(`m`);
- expect(icon.prop('title')).toEqual(`${branding.applicationTitle} home`);
expect(component).toMatchSnapshot();
});
- it('uses home icon if custom logo provided without mark', () => {
- const branding = {
- darkMode: true,
- logo: { defaultUrl: '/defaultModeLogo' },
- mark: {},
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- };
- const component = mountWithIntl();
- const icon = component.find('EuiIcon');
- expect(icon.prop('type')).toEqual('home');
- expect(icon.prop('size')).toEqual(`m`);
- expect(icon.prop('title')).toEqual(`${branding.applicationTitle} home`);
- expect(component).toMatchSnapshot();
- });
+ it('uses the custom logo when header is not expanded', () => {
+ const props = mockProps();
+ // @ts-expect-error
+ props.branding.useExpandedHeader = false;
- it('uses custom mark default mode URL if no dark mode mark provided', () => {
- const branding = {
- darkMode: true,
- logo: {},
- mark: { defaultUrl: '/defaultModeMark' },
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- };
- const component = mountWithIntl();
+ const component = shallow();
const icon = component.find('EuiIcon');
- expect(icon.prop('type')).toEqual(branding.mark.defaultUrl);
- expect(icon.prop('size')).toEqual(`l`);
- expect(icon.prop('title')).toEqual(`${branding.applicationTitle} home`);
- expect(component).toMatchSnapshot();
- });
+ expect(icon.prop('data-test-subj')).toEqual('customMark');
+ expect(icon.prop('type')).toEqual(props.logos.Mark.url);
+ expect(icon.prop('size')).toEqual('l');
+ expect(icon.prop('title')).toEqual(`${mockTitle} home`);
- it('uses custom mark dark mode URL', () => {
- const branding = {
- darkMode: true,
- logo: {},
- mark: { defaultUrl: '/defaultModeMark', darkModeUrl: '/darkModeMark' },
- applicationTitle: 'custom title',
- assetFolderUrl: 'base/ui/default_branding',
- };
- const component = mountWithIntl();
- const icon = component.find('EuiIcon');
- expect(icon.prop('type')).toEqual(branding.mark.darkModeUrl);
- expect(icon.prop('size')).toEqual(`l`);
- expect(icon.prop('title')).toEqual(`${branding.applicationTitle} home`);
expect(component).toMatchSnapshot();
});
});
diff --git a/src/core/public/chrome/ui/header/home_icon.tsx b/src/core/public/chrome/ui/header/home_icon.tsx
index 9260fc19ccae..2c0beb5a26cb 100644
--- a/src/core/public/chrome/ui/header/home_icon.tsx
+++ b/src/core/public/chrome/ui/header/home_icon.tsx
@@ -4,51 +4,46 @@
*/
import React from 'react';
-import { EuiIcon } from '@elastic/eui';
+import { EuiIcon, IconSize } from '@elastic/eui';
import { ChromeBranding } from '../../chrome_service';
+import type { Logos } from '../../../../common/types';
-export const DEFAULT_MARK = 'opensearch_mark_default_mode.svg';
-export const DEFAULT_DARK_MARK = 'opensearch_mark_dark_mode.svg';
+interface Props {
+ branding: ChromeBranding;
+ logos: Logos;
+}
/**
* Use branding configurations to render the header mark on the nav bar.
- *
- * @param {ChromeBranding} - branding object consist of mark, darkmode selection, asset path and title
- * @returns Mark component which is going to be rendered on the main page header bar.
*/
-export const HomeIcon = ({
- darkMode,
- assetFolderUrl = '',
- mark,
- applicationTitle = 'opensearch dashboards',
- useExpandedHeader = true,
-}: ChromeBranding) => {
- const { defaultUrl: markUrl, darkModeUrl: darkMarkUrl } = mark ?? {};
-
- const customMark = darkMode ? darkMarkUrl ?? markUrl : markUrl;
- const defaultMark = darkMode ? DEFAULT_DARK_MARK : DEFAULT_MARK;
-
- const getIconProps = () => {
- const iconType = customMark
- ? customMark
- : useExpandedHeader
- ? 'home'
- : `${assetFolderUrl}/${defaultMark}`;
- const testSubj = customMark ? 'customMark' : useExpandedHeader ? 'homeIcon' : 'defaultMark';
- const title = `${applicationTitle} home`;
- // marks look better at the large size, but the home icon should be medium to fit in with other icons
- const size = iconType === 'home' ? ('m' as const) : ('l' as const);
-
- return {
- 'data-test-subj': testSubj,
- 'data-test-image-url': iconType,
- type: iconType,
- title,
- size,
- };
- };
-
- const props = getIconProps();
-
- return ;
+export const HomeIcon = ({ branding, logos }: Props) => {
+ const { applicationTitle = 'opensearch dashboards', useExpandedHeader = true } = branding;
+
+ const { url: markURL, type: markType } = logos.Mark;
+
+ let markIcon = markURL;
+ let testSubj = `${markType}Mark`;
+ // Marks look better at the large size
+ let markIconSize: IconSize = 'l';
+
+ // If no custom branded mark was set, use `home` icon only for expanded headers
+ if (markType !== 'custom' && useExpandedHeader) {
+ markIcon = 'home';
+ testSubj = 'homeIcon';
+ // Home icon should be medium to fit in with other icons
+ markIconSize = 'm';
+ }
+
+ const alt = `${applicationTitle} home`;
+
+ return (
+
+ );
};
diff --git a/src/core/public/chrome/ui/header/home_loader.tsx b/src/core/public/chrome/ui/header/home_loader.tsx
index 0083df43ff8b..9463b41060f7 100644
--- a/src/core/public/chrome/ui/header/home_loader.tsx
+++ b/src/core/public/chrome/ui/header/home_loader.tsx
@@ -39,6 +39,7 @@ import { ChromeNavLink } from '../..';
import { ChromeBranding } from '../../chrome_service';
import { LoadingIndicator } from '../loading_indicator';
import { HomeIcon } from './home_icon';
+import type { Logos } from '../../../../common/types';
function findClosestAnchor(element: HTMLElement): HTMLAnchorElement | void {
let current = element;
@@ -107,9 +108,10 @@ interface Props {
loadingCount$: Observable;
navigateToApp: (appId: string) => void;
branding: ChromeBranding;
+ logos: Logos;
}
-export function HomeLoader({ href, navigateToApp, branding, ...observables }: Props) {
+export function HomeLoader({ href, navigateToApp, branding, logos, ...observables }: Props) {
const forceNavigation = useObservable(observables.forceNavigation$, false);
const navLinks = useObservable(observables.navLinks$, []);
const loadingCount = useObservable(observables.loadingCount$, 0);
@@ -130,7 +132,7 @@ export function HomeLoader({ href, navigateToApp, branding, ...observables }: Pr
>
{!(loadingCount > 0) && (
-
+
)}
diff --git a/src/core/public/core_app/styles/_globals_v8dark.scss b/src/core/public/core_app/styles/_globals_v8dark.scss
index 2b92b49bcbfa..2100e9762cac 100644
--- a/src/core/public/core_app/styles/_globals_v8dark.scss
+++ b/src/core/public/core_app/styles/_globals_v8dark.scss
@@ -2,6 +2,6 @@
// ---
// prepended to all .scss imports (from JS, when v8dark theme selected)
-@import "@elastic/eui/src/themes/eui-amsterdam/eui_amsterdam_colors_dark";
-@import "@elastic/eui/src/themes/eui-amsterdam/eui_amsterdam_globals";
+@import "@elastic/eui/src/themes/eui-next/eui_next_colors_dark";
+@import "@elastic/eui/src/themes/eui-next/eui_next_globals";
@import "./mixins";
diff --git a/src/core/public/core_app/styles/_globals_v8light.scss b/src/core/public/core_app/styles/_globals_v8light.scss
index 914dbb3e3831..ccc07e14e637 100644
--- a/src/core/public/core_app/styles/_globals_v8light.scss
+++ b/src/core/public/core_app/styles/_globals_v8light.scss
@@ -2,6 +2,6 @@
// ---
// prepended to all .scss imports (from JS, when v8light theme selected)
-@import "@elastic/eui/src/themes/eui-amsterdam/eui_amsterdam_colors_light";
-@import "@elastic/eui/src/themes/eui-amsterdam/eui_amsterdam_globals";
+@import "@elastic/eui/src/themes/eui-next/eui_next_colors_light";
+@import "@elastic/eui/src/themes/eui-next/eui_next_globals";
@import "./mixins";
diff --git a/src/core/public/index.ts b/src/core/public/index.ts
index 9a38771f513e..03ef6b6392f9 100644
--- a/src/core/public/index.ts
+++ b/src/core/public/index.ts
@@ -50,7 +50,6 @@ import './index.scss';
import {
ChromeBadge,
- ChromeBrand,
ChromeBreadcrumb,
ChromeHelpExtension,
ChromeHelpExtensionMenuLink,
@@ -89,6 +88,7 @@ import {
} from './context';
import { Branding } from '../types';
+export type { Logos } from '../common';
export { PackageInfo, EnvironmentMode } from '../server/types';
/** @interal */
export { CoreContext, CoreSystem } from './core_system';
@@ -193,7 +193,7 @@ export {
ErrorToastOptions,
} from './notifications';
-export { MountPoint, UnmountCallback, PublicUiSettingsParams } from './types';
+export { MountPoint, UnmountCallback, PublicUiSettingsParams, ChromeBrand } from './types';
export { URL_MAX_LENGTH } from './core_app';
@@ -298,7 +298,6 @@ export interface CoreStart {
export {
Capabilities,
ChromeBadge,
- ChromeBrand,
ChromeBreadcrumb,
ChromeHelpExtension,
ChromeHelpExtensionMenuLink,
diff --git a/src/core/public/saved_objects/saved_objects_client.test.ts b/src/core/public/saved_objects/saved_objects_client.test.ts
index 19b140ad3a12..cc3405f246c5 100644
--- a/src/core/public/saved_objects/saved_objects_client.test.ts
+++ b/src/core/public/saved_objects/saved_objects_client.test.ts
@@ -471,10 +471,7 @@ describe('SavedObjectsClient', () => {
"fields": Array [
"title",
],
- "has_reference": Object {
- "id": "1",
- "type": "reference",
- },
+ "has_reference": "{\\"id\\":\\"1\\",\\"type\\":\\"reference\\"}",
"page": 10,
"per_page": 100,
"search": "what is the meaning of life?|life",
diff --git a/src/core/public/saved_objects/saved_objects_client.ts b/src/core/public/saved_objects/saved_objects_client.ts
index d43b75b2171d..6e5482614e40 100644
--- a/src/core/public/saved_objects/saved_objects_client.ts
+++ b/src/core/public/saved_objects/saved_objects_client.ts
@@ -348,7 +348,13 @@ export class SavedObjectsClient {
};
const renamedQuery = renameKeys
(renameMap, options);
- const query = pick.apply(null, [renamedQuery, ...Object.values(renameMap)]);
+ const query = pick.apply(null, [renamedQuery, ...Object.values(renameMap)]) as Partial<
+ Record
+ >;
+
+ // has_reference needs post-processing since it is an object that needs to be read as
+ // a query param
+ if (query.has_reference) query.has_reference = JSON.stringify(query.has_reference);
const request: ReturnType = this.savedObjectsFetch(path, {
method: 'GET',
diff --git a/src/core/public/styles/_ace_overrides.scss b/src/core/public/styles/_ace_overrides.scss
index 3f0e3f57d868..5393cdf39894 100644
--- a/src/core/public/styles/_ace_overrides.scss
+++ b/src/core/public/styles/_ace_overrides.scss
@@ -6,12 +6,14 @@
// In order to override the TM (Textmate) theme of Ace/Brace, everywhere,
// it is being scoped by a known outer selector
-.application {
+.coreSystemRootDomElement {
.ace-tm {
$aceBackground: tintOrShade($euiColorLightShade, 50%, 0);
background-color: $euiColorLightestShade;
color: $euiTextColor;
+ /* stylelint-disable-next-line @osd/stylelint/no_restricted_properties */
+ font-family: var(--font-code);
.ace_scrollbar {
@include euiScrollBar;
diff --git a/src/core/public/types.ts b/src/core/public/types.ts
index 0c1d6b70c728..ebbdd53f3cf5 100644
--- a/src/core/public/types.ts
+++ b/src/core/public/types.ts
@@ -37,6 +37,8 @@ export {
StringValidationRegex,
} from '../../core/types';
+export type { Logos } from '../common/types';
+
/**
* A function that should mount DOM content inside the provided container element
* and return a handler to unmount it.
@@ -55,3 +57,12 @@ export type MountPoint = (element: T) => Un
* @public
*/
export type UnmountCallback = () => void;
+
+/**
+ * @deprecated: Use Branding instead
+ * @public
+ */
+export interface ChromeBrand {
+ logo?: string;
+ smallLogo?: string;
+}
diff --git a/src/core/server/core_app/assets/default_branding/opensearch_logo_dark_mode.svg b/src/core/server/core_app/assets/default_branding/opensearch_logo_dark_mode.svg
deleted file mode 100644
index 5fc96631974a..000000000000
--- a/src/core/server/core_app/assets/default_branding/opensearch_logo_dark_mode.svg
+++ /dev/null
@@ -1,95 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/src/core/server/core_app/assets/default_branding/opensearch_logo_default_mode.svg b/src/core/server/core_app/assets/default_branding/opensearch_logo_default_mode.svg
deleted file mode 100644
index 9ee816341523..000000000000
--- a/src/core/server/core_app/assets/default_branding/opensearch_logo_default_mode.svg
+++ /dev/null
@@ -1,95 +0,0 @@
-
-
-
diff --git a/src/core/server/core_app/assets/favicons/android-chrome-192x192.png b/src/core/server/core_app/assets/favicons/android-chrome-192x192.png
index 3fb291f8830c..a256e84b28b8 100644
Binary files a/src/core/server/core_app/assets/favicons/android-chrome-192x192.png and b/src/core/server/core_app/assets/favicons/android-chrome-192x192.png differ
diff --git a/src/core/server/core_app/assets/favicons/android-chrome-512x512.png b/src/core/server/core_app/assets/favicons/android-chrome-512x512.png
index 47bc1a2bd52b..404fbfad398f 100644
Binary files a/src/core/server/core_app/assets/favicons/android-chrome-512x512.png and b/src/core/server/core_app/assets/favicons/android-chrome-512x512.png differ
diff --git a/src/core/server/core_app/assets/favicons/apple-touch-icon.png b/src/core/server/core_app/assets/favicons/apple-touch-icon.png
index 3fdcfd3f09ed..00b8c190b08c 100644
Binary files a/src/core/server/core_app/assets/favicons/apple-touch-icon.png and b/src/core/server/core_app/assets/favicons/apple-touch-icon.png differ
diff --git a/src/core/server/core_app/assets/favicons/favicon-32x32.png b/src/core/server/core_app/assets/favicons/favicon-32x32.png
index ce2d8fe187fe..3046f5df76f1 100644
Binary files a/src/core/server/core_app/assets/favicons/favicon-32x32.png and b/src/core/server/core_app/assets/favicons/favicon-32x32.png differ
diff --git a/src/core/server/core_app/assets/favicons/manifest.json b/src/core/server/core_app/assets/favicons/manifest.json
index 9153b046420b..1318668560ac 100644
--- a/src/core/server/core_app/assets/favicons/manifest.json
+++ b/src/core/server/core_app/assets/favicons/manifest.json
@@ -3,12 +3,12 @@
"short_name": "",
"icons": [
{
- "src": "/android-chrome-192x192.png",
+ "src": "android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
- "src": "/android-chrome-512x512.png",
+ "src": "android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
diff --git a/src/core/server/core_app/assets/favicons/mstile-144x144.png b/src/core/server/core_app/assets/favicons/mstile-144x144.png
index 577ecfed1c02..5a379489e086 100644
Binary files a/src/core/server/core_app/assets/favicons/mstile-144x144.png and b/src/core/server/core_app/assets/favicons/mstile-144x144.png differ
diff --git a/src/core/server/core_app/assets/favicons/mstile-150x150.png b/src/core/server/core_app/assets/favicons/mstile-150x150.png
index 938310ed5537..b064558a1eda 100644
Binary files a/src/core/server/core_app/assets/favicons/mstile-150x150.png and b/src/core/server/core_app/assets/favicons/mstile-150x150.png differ
diff --git a/src/core/server/core_app/assets/favicons/mstile-310x150.png b/src/core/server/core_app/assets/favicons/mstile-310x150.png
index 6be5bf986934..d938be9ee090 100644
Binary files a/src/core/server/core_app/assets/favicons/mstile-310x150.png and b/src/core/server/core_app/assets/favicons/mstile-310x150.png differ
diff --git a/src/core/server/core_app/assets/favicons/mstile-310x310.png b/src/core/server/core_app/assets/favicons/mstile-310x310.png
index b45858ef4bad..0790cc1a7f5f 100644
Binary files a/src/core/server/core_app/assets/favicons/mstile-310x310.png and b/src/core/server/core_app/assets/favicons/mstile-310x310.png differ
diff --git a/src/core/server/core_app/assets/favicons/mstile-70x70.png b/src/core/server/core_app/assets/favicons/mstile-70x70.png
index 399a42ff6ae5..5155640f0976 100644
Binary files a/src/core/server/core_app/assets/favicons/mstile-70x70.png and b/src/core/server/core_app/assets/favicons/mstile-70x70.png differ
diff --git a/src/core/server/core_app/assets/favicons/safari-pinned-tab.svg b/src/core/server/core_app/assets/favicons/safari-pinned-tab.svg
index 6ea5f91851f0..5f8b7cfd8576 100644
--- a/src/core/server/core_app/assets/favicons/safari-pinned-tab.svg
+++ b/src/core/server/core_app/assets/favicons/safari-pinned-tab.svg
@@ -1,45 +1 @@
-
-
-
+
diff --git a/src/core/server/core_app/assets/fonts/readme.md b/src/core/server/core_app/assets/fonts/readme.md
index 55cdd675b1d2..dd77b8b2ce91 100644
--- a/src/core/server/core_app/assets/fonts/readme.md
+++ b/src/core/server/core_app/assets/fonts/readme.md
@@ -1,6 +1,9 @@
## Font usage
-OpenSearch Dashboards packages two fonts:
+OpenSearch Dashboards packages four fonts:
+
+* [Source Sans 3](https://github.com/adobe-fonts/source-sans) v3.052
+* [Source Code Pro](https://github.com/adobe-fonts/source-code-pro) upright v2.042 and italic v1.062.
* [Inter UI](https://rsms.me/inter/) fonts were pulled from their site and are at v3.2
* [Roboto Mono](https://fonts.google.com/specimen/Roboto+Mono) was pulled from the Google Fonts website on January 22, 2019.
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/LICENSE.md b/src/core/server/core_app/assets/fonts/source_code_pro/LICENSE.md
new file mode 100644
index 000000000000..4cb7aaecdc0f
--- /dev/null
+++ b/src/core/server/core_app/assets/fonts/source_code_pro/LICENSE.md
@@ -0,0 +1,93 @@
+© 2023 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Black.otf.woff b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Black.otf.woff
new file mode 100644
index 000000000000..405e907329af
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Black.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Black.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Black.ttf.woff2
new file mode 100644
index 000000000000..94986c870b84
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Black.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-BlackIt.otf.woff b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-BlackIt.otf.woff
new file mode 100644
index 000000000000..f483d0e5c538
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-BlackIt.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-BlackIt.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-BlackIt.ttf.woff2
new file mode 100644
index 000000000000..b7601922aa32
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-BlackIt.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Bold.otf.woff b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Bold.otf.woff
new file mode 100644
index 000000000000..c3f5524760e0
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Bold.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Bold.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Bold.ttf.woff2
new file mode 100644
index 000000000000..5ce97745e3b4
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Bold.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-BoldIt.otf.woff b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-BoldIt.otf.woff
new file mode 100644
index 000000000000..04ed805df11a
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-BoldIt.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-BoldIt.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-BoldIt.ttf.woff2
new file mode 100644
index 000000000000..89ec6123d1b5
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-BoldIt.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-ExtraLight.otf.woff b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-ExtraLight.otf.woff
new file mode 100644
index 000000000000..1477902a4f28
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-ExtraLight.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-ExtraLight.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-ExtraLight.ttf.woff2
new file mode 100644
index 000000000000..45e25c9174fd
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-ExtraLight.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-ExtraLightIt.otf.woff b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-ExtraLightIt.otf.woff
new file mode 100644
index 000000000000..a2789f8818bc
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-ExtraLightIt.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-ExtraLightIt.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-ExtraLightIt.ttf.woff2
new file mode 100644
index 000000000000..b6133c119bf5
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-ExtraLightIt.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-It.otf.woff b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-It.otf.woff
new file mode 100644
index 000000000000..2add4be738e4
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-It.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-It.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-It.ttf.woff2
new file mode 100644
index 000000000000..86a225f4a07d
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-It.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Light.otf.woff b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Light.otf.woff
new file mode 100644
index 000000000000..4539e374f177
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Light.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Light.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Light.ttf.woff2
new file mode 100644
index 000000000000..2a62569287d3
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Light.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-LightIt.otf.woff b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-LightIt.otf.woff
new file mode 100644
index 000000000000..9224b22f3dfc
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-LightIt.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-LightIt.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-LightIt.ttf.woff2
new file mode 100644
index 000000000000..d64d5710e6e5
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-LightIt.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Medium.otf.woff b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Medium.otf.woff
new file mode 100644
index 000000000000..03ae712d2a86
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Medium.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Medium.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Medium.ttf.woff2
new file mode 100644
index 000000000000..9a9c02eac147
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Medium.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-MediumIt.otf.woff b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-MediumIt.otf.woff
new file mode 100644
index 000000000000..5c7320a76a27
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-MediumIt.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-MediumIt.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-MediumIt.ttf.woff2
new file mode 100644
index 000000000000..92b1befaf80a
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-MediumIt.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Regular.otf.woff b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Regular.otf.woff
new file mode 100644
index 000000000000..31a4a7d83309
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Regular.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Regular.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Regular.ttf.woff2
new file mode 100644
index 000000000000..40826f1a6795
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Regular.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Semibold.otf.woff b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Semibold.otf.woff
new file mode 100644
index 000000000000..c5db9a31d55b
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Semibold.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Semibold.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Semibold.ttf.woff2
new file mode 100644
index 000000000000..db50145e5c52
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-Semibold.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-SemiboldIt.otf.woff b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-SemiboldIt.otf.woff
new file mode 100644
index 000000000000..5022a5337b1b
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-SemiboldIt.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-SemiboldIt.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-SemiboldIt.ttf.woff2
new file mode 100644
index 000000000000..89c84391a52c
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodePro-SemiboldIt.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodeVF-Italic.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodeVF-Italic.ttf.woff2
new file mode 100644
index 000000000000..7df879d0881a
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodeVF-Italic.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodeVF-Upright.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodeVF-Upright.ttf.woff2
new file mode 100644
index 000000000000..c4c9147aaf14
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_code_pro/SourceCodeVF-Upright.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/LICENSE.md b/src/core/server/core_app/assets/fonts/source_sans_3/LICENSE.md
new file mode 100644
index 000000000000..4cb7aaecdc0f
--- /dev/null
+++ b/src/core/server/core_app/assets/fonts/source_sans_3/LICENSE.md
@@ -0,0 +1,93 @@
+© 2023 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Black.otf.woff b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Black.otf.woff
new file mode 100644
index 000000000000..93ee7d9953fd
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Black.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Black.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Black.ttf.woff2
new file mode 100644
index 000000000000..e02c23f82d5a
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Black.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-BlackIt.otf.woff b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-BlackIt.otf.woff
new file mode 100644
index 000000000000..b174a639d798
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-BlackIt.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-BlackIt.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-BlackIt.ttf.woff2
new file mode 100644
index 000000000000..82eec7583653
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-BlackIt.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Bold.otf.woff b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Bold.otf.woff
new file mode 100644
index 000000000000..6d59fe54bb3e
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Bold.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Bold.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Bold.ttf.woff2
new file mode 100644
index 000000000000..916ad418f91a
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Bold.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-BoldIt.otf.woff b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-BoldIt.otf.woff
new file mode 100644
index 000000000000..c6e81dbe7733
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-BoldIt.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-BoldIt.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-BoldIt.ttf.woff2
new file mode 100644
index 000000000000..6c14c8babeb9
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-BoldIt.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-ExtraLight.otf.woff b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-ExtraLight.otf.woff
new file mode 100644
index 000000000000..e1abd35452bd
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-ExtraLight.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-ExtraLight.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-ExtraLight.ttf.woff2
new file mode 100644
index 000000000000..2736d57d5ac2
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-ExtraLight.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-ExtraLightIt.otf.woff b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-ExtraLightIt.otf.woff
new file mode 100644
index 000000000000..7ac0efa8876b
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-ExtraLightIt.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-ExtraLightIt.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-ExtraLightIt.ttf.woff2
new file mode 100644
index 000000000000..61206be234a2
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-ExtraLightIt.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-It.otf.woff b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-It.otf.woff
new file mode 100644
index 000000000000..e855241addf4
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-It.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-It.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-It.ttf.woff2
new file mode 100644
index 000000000000..6d9eab98a652
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-It.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Light.otf.woff b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Light.otf.woff
new file mode 100644
index 000000000000..5bc57652489e
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Light.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Light.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Light.ttf.woff2
new file mode 100644
index 000000000000..0fe3b02cf319
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Light.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-LightIt.otf.woff b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-LightIt.otf.woff
new file mode 100644
index 000000000000..3a2c66372885
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-LightIt.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-LightIt.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-LightIt.ttf.woff2
new file mode 100644
index 000000000000..8b5ed0d454c8
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-LightIt.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Medium.otf.woff b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Medium.otf.woff
new file mode 100644
index 000000000000..762a10731a57
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Medium.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Medium.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Medium.ttf.woff2
new file mode 100644
index 000000000000..ff95f90d5be2
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Medium.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-MediumIt.otf.woff b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-MediumIt.otf.woff
new file mode 100644
index 000000000000..621c0f548aa4
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-MediumIt.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-MediumIt.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-MediumIt.ttf.woff2
new file mode 100644
index 000000000000..3492f7600e90
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-MediumIt.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Regular.otf.woff b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Regular.otf.woff
new file mode 100644
index 000000000000..30895f79f7ea
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Regular.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Regular.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Regular.ttf.woff2
new file mode 100644
index 000000000000..e2401aa9f8a0
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Regular.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Semibold.otf.woff b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Semibold.otf.woff
new file mode 100644
index 000000000000..e5483931521c
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Semibold.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Semibold.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Semibold.ttf.woff2
new file mode 100644
index 000000000000..a9aced0785d9
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-Semibold.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-SemiboldIt.otf.woff b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-SemiboldIt.otf.woff
new file mode 100644
index 000000000000..ee41e959e944
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-SemiboldIt.otf.woff differ
diff --git a/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-SemiboldIt.ttf.woff2 b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-SemiboldIt.ttf.woff2
new file mode 100644
index 000000000000..1556ee303c83
Binary files /dev/null and b/src/core/server/core_app/assets/fonts/source_sans_3/SourceSans3-SemiboldIt.ttf.woff2 differ
diff --git a/src/core/server/core_app/assets/logos/opensearch.svg b/src/core/server/core_app/assets/logos/opensearch.svg
new file mode 100644
index 000000000000..9795f6c332ab
--- /dev/null
+++ b/src/core/server/core_app/assets/logos/opensearch.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/core/server/core_app/assets/logos/opensearch_center_mark.svg b/src/core/server/core_app/assets/logos/opensearch_center_mark.svg
new file mode 100644
index 000000000000..42a29b55050c
--- /dev/null
+++ b/src/core/server/core_app/assets/logos/opensearch_center_mark.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/core/server/core_app/assets/logos/opensearch_center_mark_on_dark.svg b/src/core/server/core_app/assets/logos/opensearch_center_mark_on_dark.svg
new file mode 100644
index 000000000000..43091f7d039a
--- /dev/null
+++ b/src/core/server/core_app/assets/logos/opensearch_center_mark_on_dark.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/core/server/core_app/assets/logos/opensearch_center_mark_on_light.svg b/src/core/server/core_app/assets/logos/opensearch_center_mark_on_light.svg
new file mode 100644
index 000000000000..5a0d83c568b7
--- /dev/null
+++ b/src/core/server/core_app/assets/logos/opensearch_center_mark_on_light.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/core/server/core_app/assets/logos/opensearch_dashboards.svg b/src/core/server/core_app/assets/logos/opensearch_dashboards.svg
new file mode 100644
index 000000000000..35f56544a26c
--- /dev/null
+++ b/src/core/server/core_app/assets/logos/opensearch_dashboards.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/core/server/core_app/assets/logos/opensearch_dashboards_darkmode.svg b/src/core/server/core_app/assets/logos/opensearch_dashboards_darkmode.svg
new file mode 100644
index 000000000000..ba023b5b9a37
--- /dev/null
+++ b/src/core/server/core_app/assets/logos/opensearch_dashboards_darkmode.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/core/server/core_app/assets/logos/opensearch_dashboards_on_dark.svg b/src/core/server/core_app/assets/logos/opensearch_dashboards_on_dark.svg
new file mode 100644
index 000000000000..ba023b5b9a37
--- /dev/null
+++ b/src/core/server/core_app/assets/logos/opensearch_dashboards_on_dark.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/core/server/core_app/assets/logos/opensearch_dashboards_on_light.svg b/src/core/server/core_app/assets/logos/opensearch_dashboards_on_light.svg
new file mode 100644
index 000000000000..bb85dcdd10ed
--- /dev/null
+++ b/src/core/server/core_app/assets/logos/opensearch_dashboards_on_light.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/core/server/core_app/assets/logos/opensearch_mark.svg b/src/core/server/core_app/assets/logos/opensearch_mark.svg
new file mode 100644
index 000000000000..b1986db87913
--- /dev/null
+++ b/src/core/server/core_app/assets/logos/opensearch_mark.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/core/server/core_app/assets/logos/opensearch_mark_on_dark.svg b/src/core/server/core_app/assets/logos/opensearch_mark_on_dark.svg
new file mode 100644
index 000000000000..d202064dea30
--- /dev/null
+++ b/src/core/server/core_app/assets/logos/opensearch_mark_on_dark.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/core/server/core_app/assets/logos/opensearch_mark_on_light.svg b/src/core/server/core_app/assets/logos/opensearch_mark_on_light.svg
new file mode 100644
index 000000000000..2c6bc1ee17e0
--- /dev/null
+++ b/src/core/server/core_app/assets/logos/opensearch_mark_on_light.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/core/server/core_app/assets/logos/opensearch_on_dark.svg b/src/core/server/core_app/assets/logos/opensearch_on_dark.svg
new file mode 100644
index 000000000000..1830ff7f6683
--- /dev/null
+++ b/src/core/server/core_app/assets/logos/opensearch_on_dark.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/core/server/core_app/assets/logos/opensearch_on_light.svg b/src/core/server/core_app/assets/logos/opensearch_on_light.svg
new file mode 100644
index 000000000000..f716c67e58f9
--- /dev/null
+++ b/src/core/server/core_app/assets/logos/opensearch_on_light.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/core/server/core_app/assets/logos/opensearch_spinner.svg b/src/core/server/core_app/assets/logos/opensearch_spinner.svg
new file mode 100644
index 000000000000..98c6f2af6189
--- /dev/null
+++ b/src/core/server/core_app/assets/logos/opensearch_spinner.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/core/server/core_app/assets/logos/opensearch_spinner_on_dark.svg b/src/core/server/core_app/assets/logos/opensearch_spinner_on_dark.svg
new file mode 100644
index 000000000000..8d2b16595121
--- /dev/null
+++ b/src/core/server/core_app/assets/logos/opensearch_spinner_on_dark.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/core/server/core_app/assets/logos/opensearch_spinner_on_light.svg b/src/core/server/core_app/assets/logos/opensearch_spinner_on_light.svg
new file mode 100644
index 000000000000..41ab3c960b94
--- /dev/null
+++ b/src/core/server/core_app/assets/logos/opensearch_spinner_on_light.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/core/server/legacy/legacy_service.ts b/src/core/server/legacy/legacy_service.ts
index ae7e85b98d67..165a67aa1f83 100644
--- a/src/core/server/legacy/legacy_service.ts
+++ b/src/core/server/legacy/legacy_service.ts
@@ -275,6 +275,10 @@ export class LegacyService implements CoreService {
addClientWrapper: setupDeps.core.savedObjects.addClientWrapper,
registerType: setupDeps.core.savedObjects.registerType,
getImportExportObjectLimit: setupDeps.core.savedObjects.getImportExportObjectLimit,
+ setRepositoryFactoryProvider: setupDeps.core.savedObjects.setRepositoryFactoryProvider,
+ setStatus: () => {
+ throw new Error(`core.savedObjects.setStatus is unsupported in legacy`);
+ },
},
status: {
isStatusPageAnonymous: setupDeps.core.status.isStatusPageAnonymous,
diff --git a/src/core/server/plugins/plugin_context.ts b/src/core/server/plugins/plugin_context.ts
index 521a8dd2f7b0..ab028e169a71 100644
--- a/src/core/server/plugins/plugin_context.ts
+++ b/src/core/server/plugins/plugin_context.ts
@@ -204,6 +204,8 @@ export function createPluginSetupContext(
addClientWrapper: deps.savedObjects.addClientWrapper,
registerType: deps.savedObjects.registerType,
getImportExportObjectLimit: deps.savedObjects.getImportExportObjectLimit,
+ setRepositoryFactoryProvider: deps.savedObjects.setRepositoryFactoryProvider,
+ setStatus: deps.savedObjects.setStatus,
},
status: {
core$: deps.status.core$,
diff --git a/src/core/server/rendering/__snapshots__/rendering_service.test.ts.snap b/src/core/server/rendering/__snapshots__/rendering_service.test.ts.snap
index 1913a972ab8c..ad92d759a832 100644
--- a/src/core/server/rendering/__snapshots__/rendering_service.test.ts.snap
+++ b/src/core/server/rendering/__snapshots__/rendering_service.test.ts.snap
@@ -106,7 +106,7 @@ Object {
}
`;
-exports[`RenderingService setup() render() renders "core" page driven by settings 1`] = `
+exports[`RenderingService setup() render() renders "core" page driven by defaults 1`] = `
Object {
"anonymousStatusPage": false,
"basePath": "/mock-server-basepath",
@@ -148,6 +148,59 @@ Object {
"name": "title",
},
},
+ "user": Object {},
+ },
+ },
+ "serverBasePath": "/mock-server-basepath",
+ "survey": "https://survey.opensearch.org",
+ "uiPlugins": Array [],
+ "vars": Object {},
+ "version": Any,
+}
+`;
+
+exports[`RenderingService setup() render() renders "core" page driven by settings 1`] = `
+Object {
+ "anonymousStatusPage": false,
+ "basePath": "/mock-server-basepath",
+ "branch": Any,
+ "branding": Object {
+ "applicationTitle": "OpenSearch Dashboards",
+ "assetFolderUrl": "/mock-server-basepath/ui/default_branding",
+ "darkMode": true,
+ "loadingLogo": Object {},
+ "logo": Object {},
+ "mark": Object {},
+ "useExpandedHeader": true,
+ },
+ "buildNumber": Any,
+ "csp": Object {
+ "warnLegacyBrowsers": true,
+ },
+ "env": Object {
+ "mode": Object {
+ "dev": Any,
+ "name": Any,
+ "prod": Any,
+ },
+ "packageInfo": Object {
+ "branch": Any,
+ "buildNum": Any,
+ "buildSha": Any,
+ "dist": Any,
+ "version": Any,
+ },
+ },
+ "i18n": Object {
+ "translationsUrl": "/mock-server-basepath/translations/en.json",
+ },
+ "legacyMetadata": Object {
+ "uiSettings": Object {
+ "defaults": Object {
+ "theme:darkMode": Object {
+ "value": false,
+ },
+ },
"user": Object {
"theme:darkMode": Object {
"userValue": true,
@@ -216,6 +269,59 @@ Object {
}
`;
+exports[`RenderingService setup() render() renders "core" page with no defaults or overrides 1`] = `
+Object {
+ "anonymousStatusPage": false,
+ "basePath": "/mock-server-basepath",
+ "branch": Any,
+ "branding": Object {
+ "applicationTitle": "OpenSearch Dashboards",
+ "assetFolderUrl": "/mock-server-basepath/ui/default_branding",
+ "darkMode": false,
+ "loadingLogo": Object {},
+ "logo": Object {},
+ "mark": Object {},
+ "useExpandedHeader": true,
+ },
+ "buildNumber": Any,
+ "csp": Object {
+ "warnLegacyBrowsers": true,
+ },
+ "env": Object {
+ "mode": Object {
+ "dev": Any,
+ "name": Any