]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Downstream branding
authorVolker Theile <vtheile@suse.com>
Fri, 16 Jul 2021 12:50:58 +0000 (14:50 +0200)
committerStefen Allen <sallen@suse.com>
Thu, 9 Dec 2021 19:29:48 +0000 (12:29 -0700)
Adds the downstream branding to the ceph dashboard.

- New sign in page
- New about dialog
- Changed color scheme
- Replaced logos

Update on 04.09.2020 - Fixed bz:1175169, bz:1175161
Update on 25.09.2020 - Fixed bz:1175120

Signed-off-by: Sebastian Krah <skrah@suse.com>
(cherry picked from commit 7563f3305a12f155c5d171e93434f1372b977ae9)

Conflicts:
  src/pybind/mgr/dashboard/frontend/src/app/shared/services/doc.service.ts
  src/pybind/mgr/dashboard/frontend/src/app/shared/services/doc.service.spec.ts
  src/pybind/mgr/dashboard/frontend/src/styles/vendor.overrides.scss
  src/pybind/mgr/dashboard/frontend/src/styles/vendor.variables.scss

21 files changed:
src/pybind/mgr/dashboard/frontend/angular.json
src/pybind/mgr/dashboard/frontend/src/app/core/auth/login/login.component.brand.html [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/app/core/layouts/login-layout/login-layout.component.brand.html [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/app/core/navigation/about/about.component.brand.html [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/app/core/navigation/navigation/navigation.component.brand.html [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/app/shared/services/doc.service.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/doc.service.ts
src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Chameleon_L_Green-pos_sRGB-250.png [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Chameleon_L_Green-pos_sRGB-500.png [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Chameleon_L_White-neg_sRGB-250.png [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Logo-hor_L_White-neg_sRGB-250.png [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Logo-hor_L_White-neg_sRGB.svg [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Logo-vert_L_Green-pos_sRGB-500.png [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/assets/WorkSans-Light.ttf [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/assets/WorkSans-Medium.ttf [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/assets/WorkSans-Regular.ttf [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/assets/apple-touch-icon.png [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/assets/favicon.png [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/index.brand.html [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/styles/vendor/_style-overrides.scss
src/pybind/mgr/dashboard/frontend/src/styles/vendor/_variables.scss

index 3a3dac350acb197e4b81fe13733f027bd946f2fb..4b71dbe910d4237fcbfa330747abc11cf2e09c02 100644 (file)
               "extractLicenses": true,
               "vendorChunk": false,
               "buildOptimizer": true,
+              "index": {
+                "input": "src/index.brand.html",
+                "output": "index.html"
+              },
               "fileReplacements": [
                 {
                   "replace": "src/environments/environment.ts",
                   "with": "src/environments/environment.prod.ts"
+                },
+                {
+                  "replace": "src/app/core/layouts/login-layout/login-layout.component.html",
+                  "with": "src/app/core/layouts/login-layout/login-layout.component.brand.html"
+                },
+                {
+                  "replace": "src/app/core/auth/login/login.component.html",
+                  "with": "src/app/core/auth/login/login.component.brand.html"
+                },
+                {
+                  "replace": "src/app/core/navigation/navigation/navigation.component.html",
+                  "with": "src/app/core/navigation/navigation/navigation.component.brand.html"
+                },
+                {
+                  "replace": "src/app/core/navigation/about/about.component.html",
+                  "with": "src/app/core/navigation/about/about.component.brand.html"
                 }
               ]
             },
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/core/auth/login/login.component.brand.html b/src/pybind/mgr/dashboard/frontend/src/app/core/auth/login/login.component.brand.html
new file mode 100644 (file)
index 0000000..5e160b4
--- /dev/null
@@ -0,0 +1,52 @@
+<div *ngIf="isLoginActive">
+  <h2 i18n>Login</h2>
+  <form name="loginForm"
+        (ngSubmit)="login()"
+        #loginForm="ngForm"
+        novalidate>
+
+    <!-- Username -->
+    <div class="form-group has-feedback">
+      <input name="username"
+             [(ngModel)]="model.username"
+             #username="ngModel"
+             type="text"
+             placeholder="Enter your username..."
+             class="form-control"
+             required
+             autofocus>
+      <div class="invalid-feedback"
+           *ngIf="(loginForm.submitted || username.dirty) && username.invalid"
+           i18n>Username is required</div>
+    </div>
+
+    <!-- Password -->
+    <div class="form-group has-feedback">
+      <div class="input-group">
+        <input id="password"
+               name="password"
+               [(ngModel)]="model.password"
+               #password="ngModel"
+               type="password"
+               placeholder="Enter your password..."
+               class="form-control"
+               required>
+        <span class="input-group-append">
+          <button type="button"
+                  class="btn btn-outline-light btn-password"
+                  cdPasswordButton="password">
+          </button>
+        </span>
+      </div>
+      <div class="invalid-feedback"
+           *ngIf="(loginForm.submitted || password.dirty) && password.invalid"
+           i18n>Password is required</div>
+    </div>
+
+    <input type="submit"
+           class="btn btn-primary btn-block"
+           [disabled]="loginForm.invalid"
+           value="Login"
+           i18n-value>
+  </form>
+</div>
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/core/layouts/login-layout/login-layout.component.brand.html b/src/pybind/mgr/dashboard/frontend/src/app/core/layouts/login-layout/login-layout.component.brand.html
new file mode 100644 (file)
index 0000000..1c0914f
--- /dev/null
@@ -0,0 +1,54 @@
+<div class="login-suse">
+  <header>
+    <nav class="navbar">
+      <a class="navbar-brand"><span>SUSE Enterprise Storage</span></a>
+      <div class="form-inline">
+        <cd-language-selector></cd-language-selector>
+      </div>
+    </nav>
+  </header>
+
+  <section>
+    <div class="container">
+      <div class="row full-height vertical-align">
+        <div class="col-sm-6 d-none d-md-block">
+          <h1 i18n>SUSE Enterprise Storage</h1>
+          <p i18n>
+            <span i18n
+                  class="subheader">
+              AN INTELLIGENT SOFTWARE-DEFINED STORAGE SOLUTION, POWERED BY CEPH TECHNOLOGY,
+              WHICH ENABLES YOU TO TRANSFORM YOUR ENTERPRISE STORAGE INFRASTRUCTURE.
+            </span>
+            <ng-container i18n>
+              <span class="d-md-none d-lg-block">
+                Providing IT organizations with a simple to manage, agile infrastructure with increased speed of delivery,
+                durability and reliability. Accelerate innovation, reduce costs and alleviate proprietary hardware lock-in
+                by transforming your enterprise storage infrastructure with a truly open, and unified intelligent
+                software-defined storage solution.
+              </span>
+            </ng-container>
+          </p>
+        </div>
+
+        <div class="col-xs-12 col-md-5 col-sm-offset-1">
+          <router-outlet></router-outlet>
+        </div>
+      </div>
+    </div>
+  </section>
+
+  <footer>
+    <div class="container">
+      <div class="row">
+        <div class="col-sm-9">
+          <span>© 2020 Ceph contributors. Free software (LGPL 2.1)</span>
+        </div>
+        <div class="col-sm-3 text-right d-none d-sm-block">
+          <img alt="SUSE Logo"
+               src="assets/SUSE_Chameleon_L_White-neg_sRGB-250.png"
+               class="footer-logo">
+        </div>
+      </div>
+    </div>
+  </footer>
+</div>
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/about/about.component.brand.html b/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/about/about.component.brand.html
new file mode 100644 (file)
index 0000000..0a21d45
--- /dev/null
@@ -0,0 +1,60 @@
+<div class="modal-header">
+  <button type="button"
+          class="close float-right"
+          aria-label="Close"
+          (click)="modalRef.hide()">
+    <span aria-hidden="true">&times;</span>
+  </button>
+</div>
+<div class="modal-body">
+  <img src="assets/SUSE_Logo-vert_L_Green-pos_sRGB-500.png"
+       class="suse-logo"
+       alt="SUSE Enterprise Storage">
+  <h2>
+    SUSE Enterprise Storage
+  </h2>
+  <div class="product-versions">
+    <strong>Version</strong>
+    <br>
+    {{ versionNumber }}
+    {{ versionHash }}
+    <br>
+    {{ versionName }}
+  </div>
+  <br>
+  <ul class="list-unstyled">
+    <li class="row">
+      <strong class="col-6 col-sm-4">Ceph Manager</strong>
+      <span class="col-4 col-sm-4">{{ hostAddr }}</span>
+    </li>
+    <li class="row">
+      <strong class="col-6 col-sm-4">User</strong>
+      <span class="col-4 col-sm-4">{{ modalVariables.user }}</span>
+    </li>
+    <li class="row">
+      <strong class="col-6 col-sm-4">User Role</strong>
+      <span class="col-4 col-sm-4">{{ modalVariables.role }}</span>
+    </li>
+    <li class="row">
+      <strong class="col-6 col-sm-4">Browser</strong>
+      <span class="col-4 col-sm-4">{{ modalVariables.browserName }}</span>
+    </li>
+    <li class="row">
+      <strong class="col-6 col-sm-4">Browser Version</strong>
+      <span class="col-4 col-sm-4">{{ modalVariables.browserVersion }}</span>
+    </li>
+    <li class="row">
+      <strong class="col-6 col-sm-4">Browser OS</strong>
+      <span class="col-4 col-sm-4">{{ modalVariables.browserOS }}</span>
+    </li>
+  </ul>
+</div>
+<div class="modal-footer">
+  <div class="text-left">
+    {{ copyright }}
+    {{ projectConstants.license }}
+  </div>
+</div>
+
+<div class="green-background-1"></div>
+<div class="green-background-2"></div>
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/navigation/navigation.component.brand.html b/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/navigation/navigation.component.brand.html
new file mode 100644 (file)
index 0000000..06ce353
--- /dev/null
@@ -0,0 +1,270 @@
+<cd-pwd-expiration-notification></cd-pwd-expiration-notification>
+<cd-telemetry-notification></cd-telemetry-notification>
+<cd-notifications-sidebar></cd-notifications-sidebar>
+
+<div class="cd-navbar-top">
+  <nav class="navbar fixed-top navbar-expand-md navbar-dark cd-navbar-brand">
+    <button class="btn btn-link py-0"
+            (click)="showMenuSidebar = !showMenuSidebar">
+      <i class="fa fa-bars fa-2x"
+         aria-hidden="true"></i>
+    </button>
+
+    <a class="navbar-brand ml-2"
+       href="#">
+      <img src="assets/SUSE_Logo-hor_L_White-neg_sRGB.svg"
+           alt="Ceph" />
+    </a>
+
+    <button type="button"
+            class="navbar-toggler"
+            (click)="isCollapsed = !isCollapsed">
+      <span i18n
+            class="sr-only">Toggle navigation</span>
+      <span class="">
+        <i class="fa fa-navicon fa-lg"></i>
+      </span>
+    </button>
+
+    <div class="collapse navbar-collapse"
+         [collapse]="isCollapsed">
+      <ul class="nav navbar-nav cd-navbar-utility my-2 my-md-0">
+        <ng-container *ngTemplateOutlet="cd_utilities"> </ng-container>
+      </ul>
+    </div>
+  </nav>
+</div>
+
+<div class="wrapper">
+  <!-- Content -->
+  <nav id="sidebar"
+       [ngClass]="{'active': !showMenuSidebar}">
+    <ngx-simplebar [options]="simplebar">
+      <ul class="list-unstyled components cd-navbar-primary">
+        <ng-container *ngTemplateOutlet="cd_menu"> </ng-container>
+      </ul>
+    </ngx-simplebar>
+  </nav>
+
+  <!-- Page Content -->
+  <div id="content"
+       [ngClass]="{'active': !showMenuSidebar}">
+    <ng-content></ng-content>
+  </div>
+</div>
+
+<ng-template #cd_utilities>
+  <li class="nav-item ">
+    <cd-language-selector class="cd-navbar"></cd-language-selector>
+  </li>
+  <li class="nav-item ">
+    <cd-notifications class="cd-navbar"></cd-notifications>
+  </li>
+  <li class="nav-item ">
+    <cd-dashboard-help class="cd-navbar"></cd-dashboard-help>
+  </li>
+  <li class="nav-item ">
+    <cd-administration class="cd-navbar"></cd-administration>
+  </li>
+  <li class="nav-item ">
+    <cd-identity class="cd-navbar"></cd-identity>
+  </li>
+</ng-template>
+
+<ng-template #cd_menu >
+  <ng-container *ngIf="enabledFeature$ | async as enabledFeature">
+    <!-- Dashboard -->
+    <li routerLinkActive="active"
+        class="nav-item tc_menuitem_dashboard">
+      <a routerLink="/dashboard"
+         class="nav-link">
+        <span i18n>Dashboard</span>&nbsp;
+        <i [ngClass]="[icons.health, summaryData?.health_status === 'HEALTH_OK' ? 'health-ok' : '']"
+           [ngStyle]="summaryData?.health_status | healthColor"></i>
+      </a>
+    </li>
+
+    <!-- Cluster -->
+    <li routerLinkActive="active"
+        class="nav-item tc_menuitem_cluster"
+        *ngIf="permissions.hosts.read || permissions.monitor.read ||
+        permissions.osd.read || permissions.configOpt.read ||
+        permissions.log.read || permissions.prometheus.read">
+      <a (click)="toggleSubMenu('cluster')"
+         class="nav-link dropdown-toggle"
+         [attr.aria-expanded]="displayedSubMenu == 'cluster'"
+         aria-controls="collapseBasic">
+        <ng-container i18n>Cluster</ng-container>
+      </a>
+      <ul class="list-unstyled"
+          [collapse]="displayedSubMenu !== 'cluster'"
+          [isAnimated]="true">
+        <li routerLinkActive="active"
+            class="tc_submenuitem tc_submenuitem_hosts"
+            *ngIf="permissions.hosts.read">
+          <a i18n
+             routerLink="/hosts">Hosts</a>
+        </li>
+        <li routerLinkActive="active"
+            class="tc_submenuitem tc_submenuitem_cluster_inventory"
+            *ngIf="permissions.hosts.read">
+          <a i18n
+             routerLink="/inventory">Inventory</a>
+        </li>
+        <li routerLinkActive="active"
+            class="tc_submenuitem tc_submenuitem_cluster_monitor"
+            *ngIf="permissions.monitor.read">
+          <a i18n
+             routerLink="/monitor/">Monitors</a>
+        </li>
+        <li routerLinkActive="active"
+            class="tc_submenuitem tc_submenuitem_cluster_services"
+            *ngIf="permissions.hosts.read">
+          <a i18n
+             routerLink="/services/">Services</a>
+        </li>
+        <li routerLinkActive="active"
+            class="tc_submenuitem tc_submenuitem_osds"
+            *ngIf="permissions.osd.read">
+          <a i18n
+             routerLink="/osd">OSDs</a>
+        </li>
+        <li routerLinkActive="active"
+            class="tc_submenuitem tc_submenuitem_configuration"
+            *ngIf="permissions.configOpt.read">
+          <a i18n
+             routerLink="/configuration">Configuration</a>
+        </li>
+        <li routerLinkActive="active"
+            class="tc_submenuitem tc_submenuitem_crush"
+            *ngIf="permissions.osd.read">
+          <a i18n
+             routerLink="/crush-map">CRUSH map</a>
+        </li>
+        <li routerLinkActive="active"
+            class="tc_submenuitem tc_submenuitem_modules"
+            *ngIf="permissions.configOpt.read">
+          <a i18n
+             routerLink="/mgr-modules">Manager modules</a>
+        </li>
+        <li routerLinkActive="active"
+            class="tc_submenuitem tc_submenuitem_log"
+            *ngIf="permissions.log.read">
+          <a i18n
+             routerLink="/logs">Logs</a>
+        </li>
+        <li routerLinkActive="active"
+            class="tc_submenuitem tc_submenuitem_monitoring"
+            *ngIf="permissions.prometheus.read">
+          <a routerLink="/monitoring">
+            <ng-container i18n>Monitoring</ng-container>
+            <small *ngIf="prometheusAlertService.alerts.length > 0"
+                   class="badge badge-danger">{{ prometheusAlertService.alerts.length }}</small>
+          </a>
+        </li>
+      </ul>
+    </li>
+
+    <!-- Pools -->
+    <li routerLinkActive="active"
+        class="nav-item tc_menuitem_pool"
+        *ngIf="permissions.pool.read">
+      <a class="nav-link"
+         i18n
+         routerLink="/pool">Pools</a>
+    </li>
+
+    <!-- Block -->
+    <li routerLinkActive="active"
+        class="nav-item tc_menuitem_block"
+        *ngIf="(permissions.rbdImage.read || permissions.rbdMirroring.read || permissions.iscsi.read) &&
+        (enabledFeature.rbd || enabledFeature.mirroring || enabledFeature.iscsi)">
+      <a class="nav-link dropdown-toggle"
+         (click)="toggleSubMenu('block')"
+         [attr.aria-expanded]="displayedSubMenu == 'block'"
+         aria-controls="collapseBasic"
+         [ngStyle]="blockHealthColor()">
+        <ng-container i18n>Block</ng-container>
+      </a>
+
+      <ul class="list-unstyled"
+          [collapse]="displayedSubMenu !== 'block'"
+          [isAnimated]="true">
+        <li routerLinkActive="active"
+            class="tc_submenuitem tc_submenuitem_block_images"
+            *ngIf="permissions.rbdImage.read && enabledFeature.rbd">
+          <a i18n
+             routerLink="/block/rbd">Images</a>
+        </li>
+
+        <li routerLinkActive="active"
+            class="tc_submenuitem tc_submenuitem_block_mirroring"
+            *ngIf="permissions.rbdMirroring.read && enabledFeature.mirroring">
+          <a routerLink="/block/mirroring">
+            <ng-container i18n>Mirroring</ng-container>
+            <small *ngIf="summaryData?.rbd_mirroring?.warnings !== 0"
+                   class="badge badge-warning">{{ summaryData?.rbd_mirroring?.warnings }}</small>
+            <small *ngIf="summaryData?.rbd_mirroring?.errors !== 0"
+                   class="badge badge-danger">{{ summaryData?.rbd_mirroring?.errors }}</small>
+          </a>
+        </li>
+
+        <li routerLinkActive="active"
+            class="tc_submenuitem tc_submenuitem_block_iscsi"
+            *ngIf="permissions.iscsi.read && enabledFeature.iscsi">
+          <a i18n
+             routerLink="/block/iscsi">iSCSI</a>
+        </li>
+      </ul>
+    </li>
+
+    <!-- NFS -->
+    <li routerLinkActive="active"
+        class="nav-item tc_menuitem_nfs"
+        *ngIf="permissions.nfs.read && enabledFeature.nfs">
+      <a i18n
+         class="nav-link"
+         routerLink="/nfs">NFS</a>
+    </li>
+
+    <!-- Filesystem -->
+    <li routerLinkActive="active"
+        class="nav-item tc_menuitem_cephfs"
+        *ngIf="permissions.cephfs.read && enabledFeature.cephfs">
+      <a i18n
+         class="nav-link"
+         routerLink="/cephfs">Filesystems</a>
+    </li>
+
+    <!-- Object Gateway -->
+    <li routerLinkActive="active"
+        class="nav-item tc_menuitem_rgw"
+        *ngIf="permissions.rgw.read && enabledFeature.rgw">
+      <a class="nav-link dropdown-toggle"
+         (click)="toggleSubMenu('rgw')"
+         [attr.aria-expanded]="displayedSubMenu == 'rgw'"
+         aria-controls="collapseBasic">
+        <ng-container i18n>Object Gateway</ng-container>
+      </a>
+      <ul class="list-unstyled"
+          [collapse]="displayedSubMenu !== 'rgw'"
+          [isAnimated]="true">
+        <li routerLinkActive="active"
+            class="tc_submenuitem tc_submenuitem_rgw_daemons">
+          <a i18n
+             routerLink="/rgw/daemon">Daemons</a>
+        </li>
+        <li routerLinkActive="active"
+            class="tc_submenuitem tc_submenuitem_rgw_users">
+          <a i18n
+             routerLink="/rgw/user">Users</a>
+        </li>
+        <li routerLinkActive="active"
+            class="tc_submenuitem tc_submenuitem_rgw_buckets">
+          <a i18n
+             routerLink="/rgw/bucket">Buckets</a>
+        </li>
+      </ul>
+    </li>
+  </ng-container>
+</ng-template>
index 7c3bf24dd5d96b5874635e495eacce2fa5ed6b15..1198fdeb3fe9400770d5cb3b4d09fa4464ae5874 100644 (file)
@@ -22,13 +22,13 @@ describe('DocService', () => {
 
   it('should return full URL', () => {
     expect(service.urlGenerator('iscsi', 'foo')).toBe(
-      'https://docs.ceph.com/en/foo/mgr/dashboard/#enabling-iscsi-management'
+      'https://documentation.suse.com/ses/foo/single-html/mgr/dashboard/#enabling-iscsi-management'
     );
   });
 
   it('should return latest version URL for master', () => {
     expect(service.urlGenerator('orch', 'master')).toBe(
-      'https://docs.ceph.com/en/latest/mgr/orchestrator'
+      'https://documentation.suse.com/ses/master/single-html/mgr/orchestrator'
     );
   });
 
@@ -66,7 +66,7 @@ describe('DocService', () => {
 
       nextSummary('foo');
       expect(result).toEqual(
-        'https://docs.ceph.com/en/foo/mgr/dashboard/#enabling-prometheus-alerting'
+        'https://documentation.suse.com/ses/foo/single-html/mgr/dashboard/#enabling-prometheus-alerting'
       );
       expect(i).toBe(1);
       expect(subscriber.closed).toBe(true);
index 4cbb4cf185b38ae5347e3b2c315ca63819171578..03d6421a87fdfd4c25927d61217c909a734b9c55 100644 (file)
@@ -23,9 +23,8 @@ export class DocService {
     });
   }
 
-  urlGenerator(section: string, release = 'master'): string {
-    const docVersion = release === 'master' ? 'latest' : release;
-    const domain = `https://docs.ceph.com/en/${docVersion}/`;
+  urlGenerator(section: string, release = '7'): string {
+    const domain = `https://documentation.suse.com/ses/${release}/single-html/`;
     const domainCeph = `https://ceph.io/`;
 
     const sections = {
diff --git a/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Chameleon_L_Green-pos_sRGB-250.png b/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Chameleon_L_Green-pos_sRGB-250.png
new file mode 100644 (file)
index 0000000..5b8a880
Binary files /dev/null and b/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Chameleon_L_Green-pos_sRGB-250.png differ
diff --git a/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Chameleon_L_Green-pos_sRGB-500.png b/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Chameleon_L_Green-pos_sRGB-500.png
new file mode 100644 (file)
index 0000000..a721946
Binary files /dev/null and b/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Chameleon_L_Green-pos_sRGB-500.png differ
diff --git a/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Chameleon_L_White-neg_sRGB-250.png b/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Chameleon_L_White-neg_sRGB-250.png
new file mode 100644 (file)
index 0000000..09a3fdd
Binary files /dev/null and b/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Chameleon_L_White-neg_sRGB-250.png differ
diff --git a/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Logo-hor_L_White-neg_sRGB-250.png b/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Logo-hor_L_White-neg_sRGB-250.png
new file mode 100644 (file)
index 0000000..daabb08
Binary files /dev/null and b/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Logo-hor_L_White-neg_sRGB-250.png differ
diff --git a/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Logo-hor_L_White-neg_sRGB.svg b/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Logo-hor_L_White-neg_sRGB.svg
new file mode 100644 (file)
index 0000000..04eb099
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   x="0"
+   y="0"
+   width="212"
+   height="40"
+   viewBox="0 0 212 40"
+   id="svg928"
+   sodipodi:docname="SUSE_Logo-hor_L_White-neg_sRGB-small.svg"
+   inkscape:version="0.92.2 5c3e80d, 2017-08-06">
+  <metadata
+     id="metadata934">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs932" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1377"
+     inkscape:window-height="788"
+     id="namedview930"
+     showgrid="false"
+     inkscape:zoom="3.928371"
+     inkscape:cx="88.575497"
+     inkscape:cy="8.0371231"
+     inkscape:window-x="2087"
+     inkscape:window-y="74"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg928" />
+  <g
+     id="Layer_1"
+     transform="matrix(0.99914855,0,0,0.99914855,-29.494278,-27.623314)">
+    <g
+       id="g925">
+      <path
+         d="m 224.908,59.781 c -3.285,0 -5.958,-2.672 -5.958,-5.957 V 36.165 c 0,-3.285 2.673,-5.959 5.958,-5.959 h 13.555 c 1.062,0 1.926,0.864 1.926,1.925 0,1.061 -0.864,1.924 -1.926,1.924 h -13.555 c -1.162,0 -2.107,0.947 -2.107,2.11 v 6.95 h 13.294 c 1.006,0 1.824,0.819 1.824,1.825 0,1.006 -0.818,1.824 -1.824,1.824 h -13.294 v 7.06 c 0,1.163 0.945,2.107 2.107,2.107 h 13.555 c 1.062,0 1.926,0.865 1.926,1.926 0,1.062 -0.864,1.924 -1.926,1.924 z m -60.782,0.389 c -3.909,0 -6.92,-0.992 -8.95,-2.95 -2.028,-1.954 -3.056,-4.894 -3.056,-8.739 V 32.053 c 0,-1.231 1,-2.232 2.23,-2.232 1.231,0 2.232,1.001 2.232,2.232 v 15.839 c 0,2.877 0.62,5.034 1.843,6.408 1.229,1.384 3.146,2.085 5.701,2.085 2.553,0 4.472,-0.701 5.701,-2.085 1.222,-1.375 1.841,-3.531 1.841,-6.408 V 32.053 c 0,-1.231 1.002,-2.232 2.233,-2.232 1.231,0 2.232,1.001 2.232,2.232 v 16.428 c 0,3.843 -1.03,6.783 -3.059,8.739 -2.03,1.958 -5.039,2.95 -8.948,2.95 m 33.526,0 c -5.033,0 -8.868,-1.43 -11.394,-4.25 -0.731,-0.816 -0.685,-2.075 0.106,-2.865 l 0.008,-0.009 0.008,-0.008 c 0.401,-0.398 0.933,-0.616 1.499,-0.616 0.599,0 1.163,0.255 1.55,0.703 0.704,0.813 1.509,1.475 2.396,1.966 1.547,0.859 3.493,1.294 5.783,1.294 2.173,0 3.907,-0.383 5.154,-1.14 1.284,-0.776 1.936,-1.895 1.936,-3.327 0,-1.158 -0.59,-2.103 -1.754,-2.805 -1.132,-0.681 -3.042,-1.266 -5.84,-1.791 -2.718,-0.507 -4.909,-1.141 -6.513,-1.885 -1.586,-0.734 -2.751,-1.651 -3.464,-2.731 -0.713,-1.072 -1.074,-2.403 -1.074,-3.956 0,-1.639 0.46,-3.153 1.367,-4.498 0.909,-1.348 2.242,-2.435 3.963,-3.229 1.73,-0.798 3.778,-1.202 6.088,-1.202 2.7,0 5.034,0.494 6.941,1.47 1.28,0.654 2.439,1.556 3.448,2.68 0.77,0.861 0.698,2.194 -0.163,2.971 -0.388,0.349 -0.889,0.541 -1.409,0.541 -0.659,0 -1.269,-0.3 -1.671,-0.821 -0.572,-0.744 -1.216,-1.35 -1.917,-1.8 -1.296,-0.833 -3.039,-1.255 -5.183,-1.255 -2.116,0 -3.787,0.432 -4.966,1.284 -1.199,0.867 -1.808,1.999 -1.808,3.362 0,1.279 0.596,2.306 1.773,3.052 1.143,0.727 3.122,1.337 6.049,1.863 2.656,0.477 4.792,1.089 6.35,1.816 1.54,0.717 2.677,1.621 3.377,2.686 0.697,1.061 1.05,2.399 1.05,3.977 0,1.696 -0.488,3.207 -1.45,4.491 -0.97,1.291 -2.348,2.295 -4.093,2.984 -1.762,0.695 -3.829,1.048 -6.147,1.048 m -66.83,0.008 c -5.035,0 -8.868,-1.431 -11.395,-4.251 -0.731,-0.815 -0.684,-2.074 0.106,-2.865 l 0.012,-0.012 c 0.402,-0.4 0.936,-0.62 1.504,-0.62 0.6,0 1.165,0.256 1.549,0.703 0.702,0.812 1.507,1.474 2.395,1.966 1.548,0.86 3.494,1.295 5.784,1.295 2.172,0 3.906,-0.383 5.155,-1.14 1.284,-0.776 1.935,-1.895 1.935,-3.326 0,-1.16 -0.591,-2.103 -1.754,-2.805 -1.133,-0.683 -3.044,-1.269 -5.841,-1.794 -2.717,-0.506 -4.908,-1.141 -6.513,-1.883 -1.585,-0.735 -2.752,-1.654 -3.464,-2.731 -0.712,-1.073 -1.073,-2.404 -1.073,-3.956 0,-1.64 0.46,-3.152 1.366,-4.497 0.909,-1.35 2.243,-2.436 3.964,-3.23 1.728,-0.797 3.776,-1.202 6.088,-1.202 2.7,0 5.036,0.495 6.94,1.47 1.282,0.655 2.441,1.557 3.447,2.68 0.772,0.861 0.698,2.192 -0.161,2.97 -0.388,0.349 -0.889,0.541 -1.41,0.541 -0.659,0 -1.268,-0.299 -1.67,-0.82 -0.569,-0.743 -1.216,-1.35 -1.917,-1.801 -1.297,-0.834 -3.04,-1.256 -5.183,-1.256 -2.117,0 -3.787,0.433 -4.968,1.285 -1.198,0.87 -1.806,2.001 -1.806,3.362 0,1.279 0.596,2.306 1.772,3.053 1.144,0.727 3.122,1.336 6.051,1.863 2.653,0.475 4.79,1.086 6.351,1.815 1.54,0.72 2.674,1.624 3.374,2.685 0.698,1.06 1.052,2.398 1.052,3.979 0,1.697 -0.488,3.207 -1.452,4.489 -0.97,1.292 -2.347,2.297 -4.094,2.986 -1.761,0.695 -3.828,1.047 -6.144,1.047"
+         id="path921"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff" />
+      <path
+         d="m 101.177,40.296 c -0.461,-0.475 -1.218,-0.475 -1.677,0 -0.516,0.515 -0.455,1.405 0.186,1.83 0.39,0.259 0.913,0.259 1.305,0 0.638,-0.425 0.701,-1.315 0.186,-1.83 m -1.554,-4.188 c -3.283,-0.768 -6.232,2.181 -5.463,5.463 0.392,1.672 1.72,2.999 3.392,3.392 3.284,0.772 6.236,-2.182 5.463,-5.465 -0.394,-1.672 -1.721,-3 -3.392,-3.39 M 44.808,66.576 C 40.913,66.577 37.028,65 34.667,62.465 c -2.913,-3.13 -4.671,-6.274 -4.436,-12.271 0.148,-3.779 2.246,-7.929 5.613,-11.099 4.855,-4.578 11.356,-7.891 18.303,-9.332 2.679,-0.553 5.453,-0.834 8.245,-0.834 1.385,0 2.789,0.07 4.172,0.208 3.862,0.384 7.493,1.097 10.795,2.12 1.791,0.556 3.51,1.211 5.11,1.947 0.225,0.103 0.461,0.207 0.703,0.315 1.327,0.588 2.828,1.254 3.769,2.212 l 0.363,0.37 -0.001,-0.519 c 0,-1.121 -0.022,-2.279 -0.044,-3.401 -0.018,-0.967 -0.036,-1.88 -0.036,-2.634 0,-0.393 0.329,-0.637 0.636,-0.637 0.09,0 0.178,0.019 0.261,0.059 0.766,0.356 1.868,0.873 3.135,1.466 2.722,1.277 6.11,2.865 8.67,4.035 2.206,1.008 3.681,2.715 4.505,5.217 0.719,2.178 0.862,4.637 0.955,7.175 0.003,0.084 0.006,0.164 -0.018,0.211 -0.012,0.026 -0.094,0.137 -0.674,0.137 -0.091,0 -0.179,-0.002 -0.257,-0.004 -0.065,-0.003 -0.125,-0.005 -0.174,-0.005 l -0.031,10e-4 c -0.154,0.001 -0.331,0.003 -0.517,0.004 -0.541,0.003 -1.155,0.006 -1.606,0.024 -0.46,0.021 -0.92,0.032 -1.406,0.032 -0.662,0 -1.369,-0.02 -2.161,-0.06 -1.995,-0.098 -4.127,-0.943 -5.703,-2.261 -0.138,-0.117 -0.394,-0.198 -0.62,-0.198 -0.206,0 -0.378,0.065 -0.496,0.189 -0.313,0.322 -0.224,0.822 -0.026,1.024 0.836,0.843 1.734,1.391 2.824,1.954 1.293,0.665 2.664,0.864 4.322,0.961 0.618,0.036 1.238,0.055 1.844,0.055 0.985,0 1.964,-0.049 2.908,-0.147 l 0.233,-0.024 c 0.208,-0.022 0.386,-0.04 0.526,-0.05 -0.124,0.105 -0.308,0.249 -0.552,0.43 -1.001,0.743 -2.254,1.372 -3.725,1.866 -1.815,0.618 -3.796,0.96 -5.889,1.019 -0.205,0.005 -0.413,0.007 -0.619,0.007 -0.994,0 -2.006,-0.065 -3.007,-0.194 -0.259,-0.033 -0.521,-0.072 -0.776,-0.11 -0.361,-0.053 -0.736,-0.109 -1.11,-0.148 -0.086,-0.008 -0.173,-0.019 -0.26,-0.029 -0.258,-0.029 -0.525,-0.059 -0.793,-0.059 -0.206,0 -0.391,0.018 -0.563,0.055 -0.531,0.116 -0.993,0.402 -1.304,0.805 -0.458,0.599 -0.582,2.118 -0.337,2.775 0.485,1.309 1.57,2.04 2.549,2.624 0.317,0.189 0.66,0.341 0.99,0.491 0.816,0.365 1.526,0.683 1.757,1.414 -0.304,0.079 -1.216,0.136 -2.226,0.136 h -0.122 -3.173 c -0.005,0 -0.113,0.002 -0.286,0.002 -0.956,0 -1.698,-0.07 -2.034,-0.191 l -0.011,-0.005 c -0.005,-0.002 -0.011,-0.006 -0.019,-0.009 -0.288,-0.155 -0.429,-0.579 -0.544,-0.92 l -0.005,-0.017 c -0.162,-0.479 -0.436,-0.983 -0.891,-1.635 -0.894,-1.275 -2.038,-2.262 -3.06,-2.64 -1.477,-0.547 -2.359,-0.647 -3.563,-0.647 -0.346,0 -0.717,0.008 -1.146,0.019 -0.324,0.006 -0.678,0.014 -1.071,0.02 -0.304,0.003 -0.561,0.005 -0.788,0.005 -0.525,0 -0.875,-0.009 -1.28,-0.019 -0.492,-0.011 -1.05,-0.026 -2.058,-0.026 -0.324,0 -0.564,0.348 -0.642,0.932 -0.146,1.077 0.291,2.858 2.09,3.353 0.163,0.046 0.328,0.088 0.493,0.13 0.875,0.225 1.779,0.456 2.412,1.104 0.207,0.211 0.266,0.396 0.24,0.455 -0.012,0.031 -0.103,0.089 -0.353,0.089 h -6.219 c -1.042,0 -1.832,-0.043 -2.494,-0.605 -1.115,-0.94 -1.66,-2.204 -2.237,-3.54 l -0.093,-0.217 c -0.741,-1.712 -1.415,-3.072 -2.118,-4.281 -1.827,-3.137 -4.04,-5.419 -6.578,-6.779 -2.001,-1.072 -4.492,-1.688 -6.833,-1.688 -2.825,0 -5.45,0.869 -7.59,2.514 -2.151,1.649 -3.351,4.054 -3.381,6.77 -0.034,3.034 1.429,6.113 3.819,8.036 1.519,1.221 3.538,1.895 5.688,1.895 0.204,0 0.412,-0.006 0.618,-0.019 2.403,-0.14 4.516,-1.169 5.793,-2.827 1.046,-1.357 1.433,-3.044 1.089,-4.749 -0.29,-1.436 -1.14,-2.691 -2.273,-3.357 -0.765,-0.448 -1.719,-0.677 -2.837,-0.678 h -0.018 c -1.294,0 -2.289,0.327 -2.957,0.973 -0.934,0.906 -1.086,2.509 -0.338,3.575 0.099,0.143 0.215,0.279 0.326,0.41 0.323,0.383 0.601,0.715 0.535,1.155 -0.055,0.369 -0.368,0.677 -0.779,0.768 -0.103,0.024 -0.208,0.036 -0.313,0.036 -0.651,0 -1.218,-0.444 -1.579,-0.817 -1.339,-1.38 -1.76,-3.583 -1.023,-5.359 1.016,-2.454 3.744,-3.552 5.996,-3.552 0.078,0 0.156,10e-4 0.233,0.003 3.275,0.112 6.403,2.248 7.782,5.316 1.34,2.982 0.977,6.704 -0.923,9.48 -1.881,2.748 -5.222,4.326 -9.165,4.326 m 57.07,-26.042 c 0,1.824 -1.476,3.301 -3.299,3.301 -1.824,0 -3.3,-1.477 -3.3,-3.301 0,-1.823 1.476,-3.3 3.3,-3.3 1.823,0 3.299,1.477 3.299,3.3"
+         id="path923"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff" />
+    </g>
+  </g>
+</svg>
diff --git a/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Logo-vert_L_Green-pos_sRGB-500.png b/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Logo-vert_L_Green-pos_sRGB-500.png
new file mode 100644 (file)
index 0000000..121ac86
Binary files /dev/null and b/src/pybind/mgr/dashboard/frontend/src/assets/SUSE_Logo-vert_L_Green-pos_sRGB-500.png differ
diff --git a/src/pybind/mgr/dashboard/frontend/src/assets/WorkSans-Light.ttf b/src/pybind/mgr/dashboard/frontend/src/assets/WorkSans-Light.ttf
new file mode 100644 (file)
index 0000000..3e981fb
Binary files /dev/null and b/src/pybind/mgr/dashboard/frontend/src/assets/WorkSans-Light.ttf differ
diff --git a/src/pybind/mgr/dashboard/frontend/src/assets/WorkSans-Medium.ttf b/src/pybind/mgr/dashboard/frontend/src/assets/WorkSans-Medium.ttf
new file mode 100644 (file)
index 0000000..7a2645b
Binary files /dev/null and b/src/pybind/mgr/dashboard/frontend/src/assets/WorkSans-Medium.ttf differ
diff --git a/src/pybind/mgr/dashboard/frontend/src/assets/WorkSans-Regular.ttf b/src/pybind/mgr/dashboard/frontend/src/assets/WorkSans-Regular.ttf
new file mode 100644 (file)
index 0000000..0ac4520
Binary files /dev/null and b/src/pybind/mgr/dashboard/frontend/src/assets/WorkSans-Regular.ttf differ
diff --git a/src/pybind/mgr/dashboard/frontend/src/assets/apple-touch-icon.png b/src/pybind/mgr/dashboard/frontend/src/assets/apple-touch-icon.png
new file mode 100644 (file)
index 0000000..b298d51
Binary files /dev/null and b/src/pybind/mgr/dashboard/frontend/src/assets/apple-touch-icon.png differ
diff --git a/src/pybind/mgr/dashboard/frontend/src/assets/favicon.png b/src/pybind/mgr/dashboard/frontend/src/assets/favicon.png
new file mode 100644 (file)
index 0000000..2925c2d
Binary files /dev/null and b/src/pybind/mgr/dashboard/frontend/src/assets/favicon.png differ
diff --git a/src/pybind/mgr/dashboard/frontend/src/index.brand.html b/src/pybind/mgr/dashboard/frontend/src/index.brand.html
new file mode 100644 (file)
index 0000000..bf9e474
--- /dev/null
@@ -0,0 +1,30 @@
+<!doctype html>
+<html lang="en">
+<head>
+  <meta charset="utf-8">
+  <title>SUSE Enterprise Storage</title>
+
+  <script>
+    document.write('<base href="' + document.location+ '" />');
+  </script>
+
+  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+  <link rel="icon" type="image/png" href="assets/favicon.png" sizes="32x32">
+  <link rel="icon" type="image/png" href="assets/favicon.png" sizes="96x96">
+  <link rel="apple-touch-icon" sizes="180x180" href="assets/apple-touch-icon.png">
+</head>
+<body>
+<noscript>
+  <div class="noscript container"
+       ng-if="false">
+    <div class="jumbotron alert alert-danger">
+      <h2 i18n>JavaScript required!</h2>
+      <p i18n>A browser with JavaScript enabled is required in order to use this service.</p>
+      <p i18n>When using Internet Explorer, please check your security settings and add this address to your trusted sites.</p>
+    </div>
+  </div>
+</noscript>
+
+<cd-root></cd-root>
+</body>
+</html>
index 2fbea9824ac2cd87308555a04a2130c31243103c..2b075349e121484cb014413315e343dd39886d5e 100644 (file)
@@ -2,3 +2,385 @@
 
 Custom styles, third-party libraries, frameworks, design systems, ...
 */
+@import 'variables';
+
+@font-face {
+  font-family: 'WorkSansLight';
+  src: url('assets/WorkSans-Light.ttf') format('truetype');
+}
+@font-face {
+  font-family: 'WorkSansMedium';
+  src: url('assets/WorkSans-Medium.ttf') format('truetype');
+}
+@font-face {
+  font-family: 'WorkSansRegular';
+  src: url('assets/WorkSans-Regular.ttf') format('truetype');
+}
+
+/* Body */
+body {
+  font-family: 'WorkSansRegular', 'Verdana', Helvetica, Arial, sans-serif;
+}
+
+/* Header */
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  font-family: 'WorkSansMedium', 'Verdana', Helvetica, Arial, sans-serif;
+}
+.subheader {
+  font-family: 'WorkSansLight', 'Verdana', Helvetica, Arial, sans-serif;
+}
+
+/* Button */
+.btn-primary,
+.btn-secondary {
+  background-color: $color-primary !important;
+  border-color: $color-primary !important;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary,
+.btn-secondary:hover,
+.btn-secondary:focus,
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  background-color: lighten($color-primary, 10) !important;
+  border-color: lighten($color-primary, 10) !important;
+}
+.btn-secondary:focus {
+  box-shadow: 0 0 0 0.2rem rgba($color-primary, 0.5) !important;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary,
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  &:hover,
+  &:focus {
+    background-color: lighten($color-primary, 10) !important;
+    border-color: lighten($color-primary, 10) !important;
+  }
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active,
+.btn-secondary.disabled,
+.btn-secondary[disabled],
+fieldset[disabled] .btn-secondary,
+.btn-secondary.disabled:hover,
+.btn-secondary[disabled]:hover,
+fieldset[disabled] .btn-secondary:hover,
+.btn-secondary.disabled:focus,
+.btn-secondary[disabled]:focus,
+fieldset[disabled] .btn-secondary:focus,
+.btn-secondary.disabled:active,
+.btn-secondary[disabled]:active,
+fieldset[disabled] .btn-secondary:active,
+.btn-secondary.disabled.active,
+.btn-secondary[disabled].active,
+fieldset[disabled] .btn-secondary.active {
+  background-color: $color-primary !important;
+  border-color: $color-primary !important;
+}
+
+/* Icons */
+.ceph-icon {
+  background: {
+    image: url('assets/SUSE_Chameleon_L_Green-pos_sRGB-250.png');
+    clip: padding-box;
+    size: contain;
+    repeat: no-repeat;
+  }
+  padding: 15px;
+  margin-right: 1em;
+}
+
+/* Login */
+.login-suse {
+  font-family: 'WorkSansRegular', 'Verdana', Helvetica, Arial, sans-serif;
+  color: $color-soft-gray;
+  background-color: $color-login-background;
+  width: 100%;
+  margin: 0;
+
+  header {
+    margin-bottom: 30px;
+    background-color: $color-secondary;
+
+    .row {
+      margin: 0;
+
+      @media screen and (max-width: $screen-sm-max) {
+        margin-left: -15px;
+      }
+    }
+
+    .navbar {
+      border: 0;
+      margin: 0;
+      padding: 0 12px;
+
+      .navbar-brand {
+        font-size: 2rem;
+        line-height: 2.5rem;
+        height: 60px;
+        padding: 15px 15px;
+
+        span {
+          @media screen and (max-width: $screen-xs-max) {
+            display: none;
+          }
+        }
+      }
+
+      .form-inline {
+        .dropdown-toggle {
+          display: block;
+          border: 0;
+          padding: 21px 15px;
+
+          &:hover,
+          &:focus {
+            color: $color-black;
+            background-color: $color-primary;
+            text-decoration: none;
+          }
+
+          @media screen and (max-width: $screen-sm-max) {
+            margin-left: 15px;
+          }
+        }
+
+        .dropdown-menu {
+          @media screen and (max-width: $screen-sm-max) {
+            background-color: $color-white;
+          }
+        }
+      }
+    }
+
+    cd-language-selector .form-control {
+      background-color: transparent;
+      border: 0;
+      padding: 10px 0;
+    }
+  }
+
+  section {
+    display: inline-flex;
+    width: 100%;
+    min-height: 100vh;
+    margin: -90px auto -100px;
+
+    h1 {
+      margin-bottom: 3rem;
+      font-size: 4rem;
+      color: $color-primary;
+    }
+
+    p {
+      font-size: 1.2rem;
+    }
+
+    .subheader {
+      display: block;
+      margin-bottom: 1rem;
+      font-size: 1.4rem;
+      font-weight: bold;
+    }
+
+    h2 {
+      margin: 2.5rem 0;
+      font-size: 2.5rem;
+    }
+
+    .form-group {
+      border-left: 0;
+      background-color: $color-login-background;
+
+      &:focus-within {
+        border-left: 0;
+      }
+
+      input {
+        background-color: $color-white;
+        border-color: $color-white;
+        color: $body-color;
+        font-size: 13px;
+        height: 2.5rem;
+
+        &:focus {
+          border-color: rgba($color-primary, 0.8);
+          box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset, 0 0 8px 2px rgba($color-primary, 0.5);
+          outline: 0;
+        }
+      }
+    }
+
+    .btn-password {
+      color: $body-color;
+      border-left: 1px solid $body-color;
+      background-color: $color-white;
+
+      &:hover {
+        color: $color-white;
+        background-color: $color-secondary;
+      }
+
+      &:focus {
+        color: $body-color;
+        background-color: $color-white;
+        border-color: rgba($color-primary, 0.8);
+        box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset, 0 0 8px 2px rgba($color-primary, 0.5);
+        outline: 0;
+      }
+    }
+  }
+
+  footer {
+    margin-top: 30px;
+    height: 70px;
+    padding-top: 23px;
+    border-bottom: 16px solid $color-primary;
+
+    .footer-logo {
+      width: 50px;
+      margin-top: -16px;
+    }
+
+    .container {
+      padding-bottom: 10px;
+    }
+  }
+}
+
+/* About */
+.suse-logo {
+  width: 140px;
+  margin-bottom: 1.5rem;
+}
+
+.modal-content {
+  overflow: hidden;
+}
+
+.modal-header,
+.modal-body,
+.modal-footer {
+  z-index: 1;
+}
+
+.modal-footer {
+  position: relative;
+}
+
+.green-background-1,
+.green-background-2 {
+  width: 140%;
+  height: 400px;
+  left: -20%;
+  position: absolute;
+}
+
+.green-background-1 {
+  background-color: $color-green-contrast-1;
+  bottom: -240px;
+  transform: rotate(-11deg);
+}
+
+.green-background-2 {
+  background-color: $color-green-contrast-2;
+  bottom: -310px;
+  transform: rotate(-6deg);
+}
+
+// Dashboard
+
+.dashboard {
+  background-color: #ffffff !important;
+
+  .card {
+    background-color: #f5f5f5;
+  }
+}
+
+// Navigation
+@mixin suse-nav-link {
+  .nav-link,
+  a {
+    background-color: #f5f5f5 !important;
+    border-left: 5px solid transparent !important;
+    color: $body-color !important;
+    margin: 0 16px 0 0 !important;
+    padding: 8px 0 8px 21px !important;
+
+    &:hover {
+      background-color: transparent !important;
+      border-left: 5px solid $color-primary !important;
+    }
+  }
+}
+@mixin suse-nav-link-active {
+  background-color: $color-primary !important;
+  border-radius: 0 2px 2px 0;
+  color: #ffffff !important;
+
+  &:hover {
+    background-color: $color-primary !important;
+    border-left: 5px solid transparent !important;
+  }
+}
+
+nav#sidebar {
+  background-color: #f5f5f5 !important;
+  padding-top: 1.5rem;
+
+  .nav-item ul {
+    background-color: #f5f5f5 !important;
+
+    @include suse-nav-link;
+
+    a {
+      padding: 8px 0 8px 33px !important;
+    }
+
+    .active a {
+      @include suse-nav-link-active;
+    }
+  }
+
+  @include suse-nav-link;
+  .active .nav-link {
+    @include suse-nav-link-active;
+  }
+}
+
+.nav-item.active .fa-heartbeat.health-ok {
+  color: #ffffff !important;
+}
+
+// Logo
+
+.cd-navbar-top .cd-navbar-brand .navbar-brand > img {
+  height: 29px !important;
+}
index 1df7a90845c15548da7a22b7b6e69835f5385b18..27aa1b99d6107962e22e8eb2288ecdd76d43a19d 100644 (file)
@@ -14,4 +14,23 @@ Example:
   )
 );
 */
-@forward '../defaults/bootstrap-defaults';
+@import '../defaults/bootstrap-defaults';
+
+$body-color: #212529;
+
+$color-primary: #30ba78;
+$color-secondary: #0c322c;
+$color-accent: #ff6a52;
+
+$color-green-contrast-1: #e4f6ee;
+$color-green-contrast-2: #139448;
+
+$color-soft-gray: #f2f2f2;
+$color-white: #ffffff;
+
+$button-radius: 4px;
+
+$color-login-background: #0c322c;
+
+$breakpoint-mobile: 768px;
+$breakpoint-mobile-max: calc(#{$breakpoint-mobile} - 1px);