Customizing Lepton Theme

Adding Custom Style

There is a customStyle boolean configuration in ThemeLeptonModule's forRoot method. If this configuration is true, the style selection box is not included in the theme settings form and ThemeLeptonModule does not load its own styles. In this case, a custom style file must be added to the styles array in angular.json or must be imported by style.scss.

Only angular project styles can be changed in this way. If the authorization flow is authorization code flow, MVC pages (login, profile, etc) are not affected by this change.

Custom style implementation can be done with the following steps

Set customStyle property to true where is ThemeLeptonModule imported with forRoot method.

// app.module.ts
ThemeLeptonModule.forRoot({
    customStyle: true
})

Import your style file to src/style.scss

/* style.scss */
import 'your-custom-style';

Or add your style file to the styles arrays which in angular.json file

// angular.json
{
   // other configurations 
  "projects": {
    "YourProject": {
      // other configurations
      "architect": {
        "build": {
            "styles": [
              // other styles  
              "your-custom-style-file"
            ],
          },
        },
        "test": {
          "options": {
            "styles": [
               // other styles  
              "your-custom-style-file"
            ],
          }
        },
      }
    }
  }
}

Inserting Custom Content To Lepton Menu

Lepton menu can take custom content both before and after the menu items displayed. In order to achieve this, pass a component as content through the parameters of ThemeLeptonModule.forRoot when you import the module in your root module, i.e. AppModule. Let's take a look at some examples.

Placing Custom Content Before & After Menu Items

First step is to create a component which will serve as the custom content.

@Component({
  template: `<a href="https://support.my-domain.com">
    <span class="lp-icon"><i class="fas fa-headset"></i></span>
    <span class="lp-text">Support Issues</span>
    <div class="d-flex justify-content-end">
      <span class="badge badge-pill badge-warning">{{ issueCount$ | async }}</span>
    </div>
  </a>`,
})
export class SupportLinkComponent {
  issueCount$ = of(26); // dummy count, replace this with an actual service
}

@NgModule({
  declarations: [SupportLinkComponent],
  imports: [CommonModule],
})
export class SupportLinkModule {}

Now, pass this component as contentAfterRoutes option to ThemeLeptonModule.

@NgModule({
  imports: [
    // other imports are removed for sake of brevity
    SupportLinkModule,
    ThemeLeptonModule.forRoot({
      contentAfterRoutes: [SupportLinkComponent],
    })
  ],
})
export class AppModule {}

If you start the dev server, you must see the inserted content as follows:

Placing the content before menu items is straightforward: Just replace contentAfterRoutes with contentBeforeRoutes.

Placing a Search Input Before Menu Items

The Lepton package has a search component designed to work with the routes in the menu. You can simply import the module and pass the component as contentBeforeRoutes option to ThemeLeptonModule.

import { MenuSearchComponent, MenuSearchModule } from '@volo/abp.ng.theme.lepton/extensions';

@NgModule({
  imports: [
    // other imports are removed for sake of brevity

    MenuSearchModule.forRoot({
      limit: 3 // search result limit (default: Infinity)
    }),
    ThemeLeptonModule.forRoot({
      contentBeforeRoutes: [MenuSearchComponent],
    })
  ],
})
export class AppModule {}

Here is how the search input works:

Please note that the search component filters only the routes and cannot hide custom content inserted to the menu. If you need both, you will have to build your own search input.

Contributors


Last updated: April 21, 2021 Edit this page on GitHub

Was this page helpful?

Please make a selection.

To help us improve, please share your reason for the negative feedback in the field below.

Please enter a note.

Thank you for your valuable feedback!

Please note that although we cannot respond to feedback, our team will use your comments to improve the experience.

In this document
Community Talks

What’s New with .NET 9 & ABP 9?

21 Nov, 17:00
Online
Watch the Event
Mastering ABP Framework Book
Mastering ABP Framework

This book will help you gain a complete understanding of the framework and modern web application development techniques.

Learn More