From b9661ad901734d24eec04373a3f045c0e25727f1 Mon Sep 17 00:00:00 2001 From: Dmitry Nehaychik <4dmitr@gmail.com> Date: Fri, 29 Mar 2019 10:45:12 +0300 Subject: [PATCH] feat(icons): new `nb-icon` component, icons library, and @nebular/eva-icons package (#1319) BREAKING CHANGE: Starting from version 4.0, Nebular introduces new `nb-icon` component and `NbIconLibraries` service to host SVG and Font icon packs. As a breaking change, Nebular moves from `nebular-icons` package to much more popular [Eva Icons pack](https://akveo.github.io/eva-icons/) consisting of 480+ beautiful SVG icons. We believe this will bring more quality and variety to interfaces based on Nebular. Now all Nebular components internally use `` component utilizing Eva Icons SVG icons. More details on [nb-icon](https://akveo.github.io/nebular/docs/components/icon) component. There are two ways to upgrade: **Migrate to Eva Icons** (recommended): 1) install Eva Icons Nebular package `npm i @nebular/eva-icons` 2) register `NbEvaIconsModule` in the `app.module.ts` ``` import { NbEvaIconsModule } form '@nebular/eva-icons'; @NgModule({ imports: [ // ... NbEvaIconsModule, ], }) ``` 3) Search for all usages of ``. Full icons list https://akveo.github.io/eva-icons/. 4) Search for `icon: 'nb-*'` references in properties for such components as Menu, Actions, Tabs, etc. Replace those with `icon: 'icon-name'`. Please note, there is no need to specify any icon prefix (such as `eva-` or `nb-`) since prefix is specified when the icon package is registered in Nebular. 4) Update styles if necessary. 5) if you have `nebular-icons` installed, remove the package and all references. **Continue using nebular-icons** This option is also possible, but please note, Nebular Component will still use Eva Icons pack for internal component icons, such as `close`, `arrow-down`, `arrow-up`, etc. 1) Register nebular-icons as a pack for Nebular in your `app.component.ts` ``` import { NbIconLibraries } from '@nebular/theme'; constructor(private iconLibraries: NbIconLibraries) { this.iconLibraries.registerFontPack('nebular', { iconClassPrefix: 'nb' }); this.iconLibraries.setDefaultPack('nebular'); } ``` 3) Search for all usages of `` without the `nb-` prefix since prefix is specified when the icon package is registered in Nebular. 4) Search for `icon: 'nb-*'` references in properties for such components as Menu, Actions, Tabs, etc. Replace those with `icon: 'icon-name'` without `nb-` prefix since it is unnecessary and covered under the hood. Please open an issue if you have any questions or having difficulties to migrate. --- DEV_DOCS.md | 2 + angular.json | 6 - .../components/header/header.component.scss | 4 +- .../components/header/header.component.ts | 2 +- .../page-tabs/page-tabs.component.scss | 31 +- .../page-tabs/page-tabs.component.ts | 10 +- .../components/search/search.component.scss | 2 +- .../components/search/search.component.ts | 2 +- docs/app/@theme/styles/styles.scss | 2 +- docs/app/@theme/theme.module.ts | 6 + .../live-example-block.component.html | 8 +- .../live-example-block.component.scss | 6 +- .../pager-block/pager-block.component.scss | 2 +- .../pager-block/pager-block.component.ts | 4 +- .../tabbed-example-block.component.html | 2 +- .../tabbed-example-block.component.scss | 5 +- .../theme-block/theme-block.component.html | 2 +- .../theme-block/theme-block.component.scss | 2 + .../documentation.component.scss | 4 + docs/app/example/example-404.component.scss | 2 +- docs/app/example/example-404.component.ts | 4 +- docs/app/example/example.module.ts | 2 - docs/articles/install-into-existing.md | 6 + docs/assets/fonts/feather/feather.eot | Bin 62084 -> 0 bytes docs/assets/fonts/feather/feather.svg | 849 ------------------ docs/assets/fonts/feather/feather.ttf | Bin 61920 -> 0 bytes docs/assets/fonts/feather/feather.woff | Bin 29500 -> 0 bytes docs/assets/images/components/icon.svg | 196 ++++ docs/structure.ts | 9 + docs/tsconfig.app.json | 3 +- package-lock.json | 20 +- package.json | 4 +- src/app/app.module.ts | 2 + src/app/playground-components.ts | 23 + src/framework/auth/auth.module.ts | 2 + .../auth/components/auth.component.scss | 2 +- .../auth/components/auth.component.ts | 2 +- src/framework/eva-icons/README.md | 1 + src/framework/eva-icons/eva-icons.module.ts | 63 ++ src/framework/eva-icons/index.ts | 7 + src/framework/eva-icons/package.json | 32 + src/framework/icons/README.md | 2 + src/framework/icons/package.json | 2 +- .../accordion/_accordion.component.theme.scss | 2 +- .../accordion-item-header.component.ts | 3 +- .../components/accordion/accordion.module.ts | 3 +- .../actions/_actions.component.theme.scss | 10 +- .../components/actions/actions.component.scss | 6 +- .../components/actions/actions.component.ts | 6 +- .../components/actions/actions.module.ts | 2 + .../components/button/button.component.scss | 16 + .../components/button/button.component.ts | 22 + .../theme/components/card/card.module.ts | 3 +- .../card/flip-card/flip-card.component.ts | 4 +- .../card/reveal-card/reveal-card.component.ts | 2 +- .../chat/_chat.component.theme.scss | 16 +- .../components/chat/chat-form.component.ts | 8 +- .../chat/chat-message-file.component.ts | 8 +- .../chat/chat-message-map.component.ts | 2 +- .../theme/components/chat/chat.module.ts | 2 + .../icon/_icon.component.theme.scss | 31 + .../theme/components/icon/icon-libraries.ts | 189 ++++ .../theme/components/icon/icon-pack.ts | 26 + .../theme/components/icon/icon.component.scss | 3 + .../components/icon/icon.component.spec.ts | 59 ++ .../theme/components/icon/icon.component.ts | 206 +++++ .../theme/components/icon/icon.module.ts | 56 ++ .../theme/components/icon/icon.spec.ts | 75 ++ src/framework/theme/components/icon/icon.ts | 49 + .../components/icon/icons-libraries.spec.ts | 153 ++++ .../theme/components/input/input.spec.ts | 2 +- .../components/menu/menu-item.component.html | 14 +- .../theme/components/menu/menu.module.ts | 3 +- .../theme/components/menu/menu.spec.ts | 9 +- .../route-tabset/route-tabset.component.scss | 4 +- .../route-tabset/route-tabset.component.ts | 6 +- .../route-tabset/route-tabset.module.ts | 2 + .../components/search/search.component.ts | 4 +- .../theme/components/search/search.module.ts | 2 + .../stepper/_stepper.component.theme.scss | 2 +- .../components/stepper/stepper.component.html | 3 +- .../components/stepper/stepper.module.ts | 2 + .../theme/components/stepper/stepper.spec.ts | 2 + .../components/tabset/tabset.component.ts | 2 +- .../theme/components/tabset/tabset.module.ts | 2 + .../toastr/_toast.component.theme.scss | 44 +- .../components/toastr/toast.component.html | 4 +- .../components/toastr/toast.component.scss | 2 +- .../components/toastr/toast.component.ts | 4 + .../theme/components/toastr/toastr-config.ts | 19 +- .../theme/components/toastr/toastr.module.ts | 3 +- .../components/tooltip/tooltip.component.scss | 6 +- .../components/tooltip/tooltip.component.ts | 2 +- .../components/tooltip/tooltip.module.ts | 8 +- .../theme/components/tooltip/tooltip.spec.ts | 17 +- .../tree-grid/_tree-grid.component.theme.scss | 19 +- .../tree-grid-row-toggle.component.ts | 5 +- .../tree-grid/tree-grid-sort.component.ts | 7 +- .../components/tree-grid/tree-grid.module.ts | 3 +- .../components/window/window.component.ts | 8 +- .../theme/components/window/window.module.ts | 3 +- src/framework/theme/index.ts | 5 + src/framework/theme/package.json | 5 +- .../theme/schematics/ng-add/index.spec.ts | 8 +- .../theme/schematics/ng-add/index.ts | 4 +- .../ng-add/register-modules/index.ts | 1 + .../theme/styles/global/_components.scss | 2 + .../theme/styles/themes/_default.scss | 13 +- src/playground/playground.module.ts | 1 + .../action/action-badge.component.html | 6 +- .../action/action-showcase.component.html | 10 +- .../action/action-sizes.component.html | 24 +- .../action/action-test.component.ts | 50 +- .../action/action-width.component.html | 4 +- .../button/button-icon.component.html | 8 + .../button/button-icon.component.ts | 21 + .../button/button-routing.module.ts | 5 + .../with-layout/button/button.module.ts | 6 +- .../with-layout/chat/bot-replies.ts | 8 +- .../chat-conversation-showcase.component.ts | 2 +- .../with-layout/chat/chat-drop.component.ts | 2 +- .../chat-message-types-showcase.component.ts | 4 +- .../chat/chat-showcase.component.ts | 2 +- src/playground/with-layout/chat/messages.ts | 2 +- .../icon/icon-colors.component.html | 9 + .../with-layout/icon/icon-colors.component.ts | 15 + .../with-layout/icon/icon-routing.module.ts | 28 + .../icon/icon-showcase.component.html | 6 + .../icon/icon-showcase.component.ts | 17 + .../with-layout/icon/icon.module.ts | 28 + .../menu/menu-link-params.component.ts | 2 +- .../with-layout/menu/menu-service-items.ts | 16 +- .../menu/menu-service.component.ts | 2 +- .../menu/menu-showcase.component.ts | 4 + .../progress-bar-interactive.component.html | 4 +- .../tabset/route-tabset-showcase.component.ts | 6 +- .../tabset/tabset-icon.component.html | 18 +- .../toastr/toastr-icon.component.ts | 4 +- .../tooltip/tooltip-with-icon.component.html | 4 +- .../tree-grid/components/fs-icon.component.ts | 2 +- .../with-layout/tree-grid/tree-grid.module.ts | 4 +- .../typography-showcase.component.html | 2 +- .../with-layout/with-layout-routing.module.ts | 4 + .../context-menu-test.component.ts | 4 +- .../layout/layout-subheader.component.html | 6 +- .../menu/menu-test.component.ts | 22 +- 146 files changed, 1761 insertions(+), 1149 deletions(-) delete mode 100755 docs/assets/fonts/feather/feather.eot delete mode 100755 docs/assets/fonts/feather/feather.svg delete mode 100755 docs/assets/fonts/feather/feather.ttf delete mode 100755 docs/assets/fonts/feather/feather.woff create mode 100644 docs/assets/images/components/icon.svg create mode 100644 src/framework/eva-icons/README.md create mode 100644 src/framework/eva-icons/eva-icons.module.ts create mode 100644 src/framework/eva-icons/index.ts create mode 100644 src/framework/eva-icons/package.json create mode 100644 src/framework/theme/components/icon/_icon.component.theme.scss create mode 100644 src/framework/theme/components/icon/icon-libraries.ts create mode 100644 src/framework/theme/components/icon/icon-pack.ts create mode 100644 src/framework/theme/components/icon/icon.component.scss create mode 100644 src/framework/theme/components/icon/icon.component.spec.ts create mode 100644 src/framework/theme/components/icon/icon.component.ts create mode 100644 src/framework/theme/components/icon/icon.module.ts create mode 100644 src/framework/theme/components/icon/icon.spec.ts create mode 100644 src/framework/theme/components/icon/icon.ts create mode 100644 src/framework/theme/components/icon/icons-libraries.spec.ts create mode 100644 src/playground/with-layout/button/button-icon.component.html create mode 100644 src/playground/with-layout/button/button-icon.component.ts create mode 100644 src/playground/with-layout/icon/icon-colors.component.html create mode 100644 src/playground/with-layout/icon/icon-colors.component.ts create mode 100644 src/playground/with-layout/icon/icon-routing.module.ts create mode 100644 src/playground/with-layout/icon/icon-showcase.component.html create mode 100644 src/playground/with-layout/icon/icon-showcase.component.ts create mode 100644 src/playground/with-layout/icon/icon.module.ts diff --git a/DEV_DOCS.md b/DEV_DOCS.md index 408d02738f..dad29bc1ac 100644 --- a/DEV_DOCS.md +++ b/DEV_DOCS.md @@ -334,6 +334,8 @@ To give the user capability switch between live and inline representation of the # Release +0. For major version, search for `@breaking-change` to make sure all breaking changes are covered. + To start a new release (publish the framework packages on NPM) you need: 1. create a new release branch called `release:v1.0.2` diff --git a/angular.json b/angular.json index b31d35ec14..e35e497c22 100644 --- a/angular.json +++ b/angular.json @@ -26,7 +26,6 @@ "src/favicon.ico" ], "styles": [ - "node_modules/nebular-icons/scss/nebular-icons.scss", "src/styles.scss" ], "scripts": [] @@ -77,7 +76,6 @@ "tsConfig": "src/tsconfig.spec.json", "scripts": [], "styles": [ - "node_modules/nebular-icons/scss/nebular-icons.scss", "src/styles.scss" ], "assets": [ @@ -147,7 +145,6 @@ "src/favicon.ico" ], "styles": [ - "node_modules/nebular-icons/scss/nebular-icons.scss", "src/styles.scss" ], "scripts": [] @@ -198,7 +195,6 @@ "tsConfig": "src/tsconfig.spec.json", "scripts": [], "styles": [ - "node_modules/nebular-icons/scss/nebular-icons.scss", "src/styles.scss" ], "assets": [ @@ -266,7 +262,6 @@ "node_modules/bootstrap/dist/css/bootstrap.css", "node_modules/docsearch.js/dist/cdn/docsearch.min.css", "node_modules/highlight.js/styles/dracula.css", - "node_modules/nebular-icons/scss/nebular-icons.scss", "docs/app/@theme/styles/styles.scss" ], "scripts": [ @@ -321,7 +316,6 @@ ], "styles": [ "node_modules/highlight.js/styles/dracula.css", - "node_modules/nebular-icons/scss/nebular-icons.scss", "docs/app/@theme/styles/styles.scss" ], "assets": [ diff --git a/docs/app/@theme/components/header/header.component.scss b/docs/app/@theme/components/header/header.component.scss index 77eb3773bc..f2280dea68 100644 --- a/docs/app/@theme/components/header/header.component.scss +++ b/docs/app/@theme/components/header/header.component.scss @@ -22,8 +22,10 @@ flex: 1 0 auto; padding: 0 0.5rem; - .nb-menu { + nb-icon { vertical-align: middle; + font-size: 1.75rem; + color: $version-fg; } } diff --git a/docs/app/@theme/components/header/header.component.ts b/docs/app/@theme/components/header/header.component.ts index 7071250423..e630a56223 100644 --- a/docs/app/@theme/components/header/header.component.ts +++ b/docs/app/@theme/components/header/header.component.ts @@ -8,7 +8,7 @@ import { NgdVersionService } from '../../services'; template: `
- +
- + diff --git a/docs/app/blocks/components/live-example-block/live-example-block.component.scss b/docs/app/blocks/components/live-example-block/live-example-block.component.scss index 2182194854..e5ec9a957b 100644 --- a/docs/app/blocks/components/live-example-block/live-example-block.component.scss +++ b/docs/app/blocks/components/live-example-block/live-example-block.component.scss @@ -40,7 +40,7 @@ display: flex; width: 100%; - .icon { + nb-icon { font-size: 0.95rem; } } @@ -73,7 +73,7 @@ color: transparent; } - .icon { + nb-icon { color: $action-fg; position: absolute; top: 50%; @@ -156,7 +156,7 @@ padding: 0 2.5rem; } - .icon { + nb-icon { left: 1.25rem; transform: translate(0, -50%); } diff --git a/docs/app/blocks/components/pager-block/pager-block.component.scss b/docs/app/blocks/components/pager-block/pager-block.component.scss index 90e6c269fc..eea8c64725 100644 --- a/docs/app/blocks/components/pager-block/pager-block.component.scss +++ b/docs/app/blocks/components/pager-block/pager-block.component.scss @@ -32,7 +32,7 @@ font-weight: 500; font-size: 1.2rem; - i { + nb-icon { color: $arrow-fg; margin-top: 0.3rem; } diff --git a/docs/app/blocks/components/pager-block/pager-block.component.ts b/docs/app/blocks/components/pager-block/pager-block.component.ts index 2865311470..48c90e422a 100644 --- a/docs/app/blocks/components/pager-block/pager-block.component.ts +++ b/docs/app/blocks/components/pager-block/pager-block.component.ts @@ -11,7 +11,7 @@ import { NgdPaginationService } from '../../../@theme/services';
- + {{ paginationItem.prev.title }}
Previous page
@@ -23,7 +23,7 @@ import { NgdPaginationService } from '../../../@theme/services'; [attr.title]="paginationItem.next.title">
{{ paginationItem.next.title }} - +
Next page
diff --git a/docs/app/blocks/components/tabbed-example-block/tabbed-example-block.component.html b/docs/app/blocks/components/tabbed-example-block/tabbed-example-block.component.html index c449372404..432cfa3080 100644 --- a/docs/app/blocks/components/tabbed-example-block/tabbed-example-block.component.html +++ b/docs/app/blocks/components/tabbed-example-block/tabbed-example-block.component.html @@ -2,7 +2,7 @@ *ngIf="hasViewSwitch" class="btn action-item action-button" (click)="switchToLiveView()"> - + Live view diff --git a/docs/app/blocks/components/tabbed-example-block/tabbed-example-block.component.scss b/docs/app/blocks/components/tabbed-example-block/tabbed-example-block.component.scss index 253f48115e..b9a62d2c0d 100644 --- a/docs/app/blocks/components/tabbed-example-block/tabbed-example-block.component.scss +++ b/docs/app/blocks/components/tabbed-example-block/tabbed-example-block.component.scss @@ -22,8 +22,9 @@ font-weight: normal; font-size: 0.9rem; - .icon { - font-size: 0.95rem; + nb-icon { + font-size: 1rem; + vertical-align: middle; } &:focus, &:active, &:hover { diff --git a/docs/app/blocks/components/theme-block/theme-block.component.html b/docs/app/blocks/components/theme-block/theme-block.component.html index 56b9a9f7db..e35d65ee5f 100644 --- a/docs/app/blocks/components/theme-block/theme-block.component.html +++ b/docs/app/blocks/components/theme-block/theme-block.component.html @@ -31,7 +31,7 @@

{{ vm.themeTitle }} Theme

- + {{ parent.prop }} ({{ parent.theme }}) diff --git a/docs/app/blocks/components/theme-block/theme-block.component.scss b/docs/app/blocks/components/theme-block/theme-block.component.scss index 247a848abb..b952940d10 100644 --- a/docs/app/blocks/components/theme-block/theme-block.component.scss +++ b/docs/app/blocks/components/theme-block/theme-block.component.scss @@ -9,7 +9,9 @@ $selected-row-bg: nb-theme(color-gray-light); .inheritance-icon { + font-size: 1rem; margin: 0 0.25rem; + vertical-align: middle; } .inheritance-property { diff --git a/docs/app/documentation/documentation.component.scss b/docs/app/documentation/documentation.component.scss index d2b253381d..d620435cc3 100644 --- a/docs/app/documentation/documentation.component.scss +++ b/docs/app/documentation/documentation.component.scss @@ -76,6 +76,10 @@ } } + nb-icon { + display: none; + } + .menu-items .menu-item .menu-item a { &:hover, &.active, &:focus { text-shadow: 0.5px 0 0 currentColor; diff --git a/docs/app/example/example-404.component.scss b/docs/app/example/example-404.component.scss index 6457cca5a5..50b8c3282e 100644 --- a/docs/app/example/example-404.component.scss +++ b/docs/app/example/example-404.component.scss @@ -1,4 +1,4 @@ -::ng-deep nb-layout-column { +:host { align-items: center; display: flex; color: gray; diff --git a/docs/app/example/example-404.component.ts b/docs/app/example/example-404.component.ts index 727fe1ff18..28f3aabe9b 100644 --- a/docs/app/example/example-404.component.ts +++ b/docs/app/example/example-404.component.ts @@ -4,9 +4,7 @@ import { NbThemeService } from '@nebular/theme'; @Component({ selector: 'ngd-example-404', template: ` - - Example not found. - + Example not found. `, styleUrls: ['./example-404.component.scss'], }) diff --git a/docs/app/example/example.module.ts b/docs/app/example/example.module.ts index a18eaf05c1..c433862c66 100644 --- a/docs/app/example/example.module.ts +++ b/docs/app/example/example.module.ts @@ -8,14 +8,12 @@ import { NgModule } from '@angular/core'; import { NgdExampleRoutingModule } from './example-routing.module'; import { NgdExampleComponent } from './example.component'; -import { NgdThemeModule } from '../@theme/theme.module'; import { NgdExample404Component } from './example-404.component'; @NgModule({ imports: [ NgdExampleRoutingModule, - NgdThemeModule, ], declarations: [ NgdExampleComponent, diff --git a/docs/articles/install-into-existing.md b/docs/articles/install-into-existing.md index 2d369e311b..6984a14c80 100644 --- a/docs/articles/install-into-existing.md +++ b/docs/articles/install-into-existing.md @@ -59,6 +59,12 @@ At this step, we assume you already have Angular modules installed. ```bash npm install --save @nebular/theme @angular/cdk @angular/animations ``` +Also, you may want to install Eva Icons pack, which is a recommended SVG icons library starting from Nebular 4.0. +```bash +npm install --save @nebular/eva-icons +``` +More details on [how to use Nebular Eva Icons are here](docs/components/icon/overview#nbiconcomponent). + Additionally you can install Auth and Security `npm install --save @nebular/auth @nebular/security`
diff --git a/docs/assets/fonts/feather/feather.eot b/docs/assets/fonts/feather/feather.eot deleted file mode 100755 index 58371d908585297e19aae091f772f66c9d9d590d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62084 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 diff --git a/docs/assets/fonts/feather/feather.svg b/docs/assets/fonts/feather/feather.svg deleted file mode 100755 index 5dda143b66..0000000000 --- a/docs/assets/fonts/feather/feather.svg +++ /dev/null @@ -1,849 +0,0 @@ - - - - - -Created by iconfont - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/fonts/feather/feather.ttf b/docs/assets/fonts/feather/feather.ttf deleted file mode 100755 index 0b33dac7826e8cfc7ee0337f00078bd9aea7f5c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61920 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

cpn7P<>?JF|ZS3*!lYlI>4O8@Yv2jr$ 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

diff --git a/src/framework/eva-icons/README.md b/src/framework/eva-icons/README.md new file mode 100644 index 0000000000..6b7e7c8727 --- /dev/null +++ b/src/framework/eva-icons/README.md @@ -0,0 +1 @@ +### @nebular/eva-icons module, more details https://akveo.github.io/nebular/ diff --git a/src/framework/eva-icons/eva-icons.module.ts b/src/framework/eva-icons/eva-icons.module.ts new file mode 100644 index 0000000000..b81fccde8f --- /dev/null +++ b/src/framework/eva-icons/eva-icons.module.ts @@ -0,0 +1,63 @@ +/* + * @license + * Copyright Akveo. All Rights Reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +import { NgModule } from '@angular/core'; +import { NbIconLibraries, NbSvgIcon, NbIcons } from '@nebular/theme'; +import { icons } from 'eva-icons'; + +interface NbOriginalEvaIcon { + toSvg(options: NbEvaIconOptions); +} + +export interface NbEvaIconOptions { + width: string, + height: string, + fill: string, + animation: { + type: string, + hover: boolean, + infinite: boolean, + }, +} + +export class NbEvaSvgIcon extends NbSvgIcon { + + constructor(protected name, protected content: NbOriginalEvaIcon) { + super(name, ''); + } + + getContent(options): string { + return this.content.toSvg({ + width: '100%', + height: '100%', + fill: 'currentColor', + ...options, + }); + } +} + +@NgModule({}) +export class NbEvaIconsModule { + + private NAME = 'eva'; + + constructor(iconLibrary: NbIconLibraries) { + iconLibrary.registerSvgPack(this.NAME, this.createIcons()); + iconLibrary.setDefaultPack(this.NAME); + } + + private createIcons(): NbIcons { + return Object + .entries(icons) + .map(([name, icon]) => { + return [name, new NbEvaSvgIcon(name, icon)] as [string, NbSvgIcon]; + }) + .reduce((newIcons, [name, icon]: [string, NbSvgIcon]) => { + newIcons[name] = icon; + return newIcons; + }, {}); + } +} diff --git a/src/framework/eva-icons/index.ts b/src/framework/eva-icons/index.ts new file mode 100644 index 0000000000..68fc82358e --- /dev/null +++ b/src/framework/eva-icons/index.ts @@ -0,0 +1,7 @@ +/* + * @license + * Copyright Akveo. All Rights Reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +export * from './eva-icons.module'; diff --git a/src/framework/eva-icons/package.json b/src/framework/eva-icons/package.json new file mode 100644 index 0000000000..7b5792cc10 --- /dev/null +++ b/src/framework/eva-icons/package.json @@ -0,0 +1,32 @@ +{ + "name": "@nebular/eva-icons", + "version": "3.4.0", + "description": "@nebular/eva-icons", + "main": "./bundles/eva-icons.umd.js", + "module": "./index.js", + "typings": "./index.d.ts", + "author": "akveo", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/akveo/nebular.git" + }, + "bugs": { + "url": "https://github.com/akveo/nebular/issues" + }, + "homepage": "https://github.com/akveo/nebular#readme", + "keywords": [ + "angular", + "typescript", + "ng2-admin", + "ngx-admin", + "icons", + "theme", + "nebular", + "eva-icons" + ], + "peerDependencies": { + "@nebular/theme": "3.4.0", + "eva-icons": "^1.1.1" + } +} diff --git a/src/framework/icons/README.md b/src/framework/icons/README.md index 06f56454f9..e7c53dbc2b 100644 --- a/src/framework/icons/README.md +++ b/src/framework/icons/README.md @@ -1 +1,3 @@ # Nebular icons - amazing icons crafted with love by Akveo team + +### This package is deprecated. Please check [Eva Icons](https://akveo.github.io/eva-icons/) and new [nb-icon](https://akveo.github.io/nebular/docs/components/icon) component. diff --git a/src/framework/icons/package.json b/src/framework/icons/package.json index 7025c732c8..40b1c3b554 100644 --- a/src/framework/icons/package.json +++ b/src/framework/icons/package.json @@ -1,6 +1,6 @@ { "name": "nebular-icons", - "version": "1.1.0", + "version": "1.1.1", "description": "Nebular icons - amazing icons crafted with love by Akveo team", "author": "akveo", "license": "MIT", diff --git a/src/framework/theme/components/accordion/_accordion.component.theme.scss b/src/framework/theme/components/accordion/_accordion.component.theme.scss index 0f56682f43..f494583a47 100644 --- a/src/framework/theme/components/accordion/_accordion.component.theme.scss +++ b/src/framework/theme/components/accordion/_accordion.component.theme.scss @@ -29,7 +29,7 @@ position: relative; @include nb-accordion-item-header(); - i { + nb-icon { position: absolute; @include nb-ltr(right, 1rem); @include nb-rtl(left, 1rem); diff --git a/src/framework/theme/components/accordion/accordion-item-header.component.ts b/src/framework/theme/components/accordion/accordion-item-header.component.ts index cd6f0e87b1..3dc2567b9d 100644 --- a/src/framework/theme/components/accordion/accordion-item-header.component.ts +++ b/src/framework/theme/components/accordion/accordion-item-header.component.ts @@ -29,7 +29,8 @@ import { NbAccordionItemComponent } from './accordion-item.component'; - + + `, animations: [ trigger('expansionIndicator', [ diff --git a/src/framework/theme/components/accordion/accordion.module.ts b/src/framework/theme/components/accordion/accordion.module.ts index 34ab98cdb9..ccf8a104f0 100644 --- a/src/framework/theme/components/accordion/accordion.module.ts +++ b/src/framework/theme/components/accordion/accordion.module.ts @@ -7,6 +7,7 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NbIconModule } from '../icon/icon.module'; import { NbAccordionComponent } from './accordion.component'; import { NbAccordionItemComponent } from './accordion-item.component'; import { NbAccordionItemHeaderComponent } from './accordion-item-header.component'; @@ -20,7 +21,7 @@ const NB_ACCORDION_COMPONENTS = [ ]; @NgModule({ - imports: [CommonModule], + imports: [CommonModule, NbIconModule], exports: [...NB_ACCORDION_COMPONENTS], declarations: [...NB_ACCORDION_COMPONENTS], providers: [], diff --git a/src/framework/theme/components/actions/_actions.component.theme.scss b/src/framework/theme/components/actions/_actions.component.theme.scss index e5d34588c0..ce441a046e 100644 --- a/src/framework/theme/components/actions/_actions.component.theme.scss +++ b/src/framework/theme/components/actions/_actions.component.theme.scss @@ -26,7 +26,7 @@ } } - i.control-icon { + nb-icon { color: nb-theme(actions-fg); font-size: nb-theme(actions-size-small); } @@ -39,7 +39,7 @@ &.inverse { nb-action { - i.control-icon { + nb-icon { color: nb-theme(actions-bg); } @@ -51,7 +51,7 @@ &.small { nb-action { height: nb-theme(actions-size-small); - i.control-icon { + nb-icon { font-size: nb-theme(actions-size-small); } } @@ -59,7 +59,7 @@ &.medium { nb-action { height: nb-theme(actions-size-medium); - i.control-icon { + nb-icon { font-size: nb-theme(actions-size-medium); } } @@ -67,7 +67,7 @@ &.large { nb-action { height: nb-theme(actions-size-large); - i.control-icon { + nb-icon { font-size: nb-theme(actions-size-large); } } diff --git a/src/framework/theme/components/actions/actions.component.scss b/src/framework/theme/components/actions/actions.component.scss index 34afbf7e0e..a4a401a9ba 100644 --- a/src/framework/theme/components/actions/actions.component.scss +++ b/src/framework/theme/components/actions/actions.component.scss @@ -15,10 +15,8 @@ align-items: center; position: relative; - i.control-icon { - &:hover { - cursor: pointer; - } + nb-icon:hover { + cursor: pointer; } &.disabled { diff --git a/src/framework/theme/components/actions/actions.component.ts b/src/framework/theme/components/actions/actions.component.ts index bbf187c1a7..174aee57cf 100644 --- a/src/framework/theme/components/actions/actions.component.ts +++ b/src/framework/theme/components/actions/actions.component.ts @@ -19,20 +19,20 @@ import { convertToBoolProperty } from '../helpers'; [routerLink]="link" [title]="title" *ngIf="link"> - + - + - + diff --git a/src/framework/theme/components/actions/actions.module.ts b/src/framework/theme/components/actions/actions.module.ts index d8c08654a0..853c9aebe3 100644 --- a/src/framework/theme/components/actions/actions.module.ts +++ b/src/framework/theme/components/actions/actions.module.ts @@ -11,6 +11,7 @@ import { NbSharedModule } from '../shared/shared.module'; import { NbActionComponent, NbActionsComponent } from './actions.component'; import { NbBadgeModule } from '../badge/badge.module'; +import { NbIconModule } from '../icon/icon.module'; const NB_ACTIONS_COMPONENTS = [ NbActionComponent, @@ -21,6 +22,7 @@ const NB_ACTIONS_COMPONENTS = [ imports: [ NbSharedModule, NbBadgeModule, + NbIconModule, ], declarations: [ ...NB_ACTIONS_COMPONENTS, diff --git a/src/framework/theme/components/button/button.component.scss b/src/framework/theme/components/button/button.component.scss index cbbae4913f..b6387efaf1 100644 --- a/src/framework/theme/components/button/button.component.scss +++ b/src/framework/theme/components/button/button.component.scss @@ -4,6 +4,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. */ +@import '../../styles/core/mixins'; + :host { text-transform: uppercase; letter-spacing: 0.4px; @@ -26,4 +28,18 @@ &.btn-full-width { width: 100%; } + + ::ng-deep nb-icon { + vertical-align: top; + } + + &.icon-start:not(.icon-end) ::ng-deep nb-icon { + @include nb-ltr(margin-right, 0.75rem); + @include nb-rtl(margin-left, 0.75rem); + } + + &.icon-end:not(.icon-start) ::ng-deep nb-icon { + @include nb-ltr(margin-left, 0.75rem); + @include nb-rtl(margin-right, 0.75rem); + } } diff --git a/src/framework/theme/components/button/button.component.ts b/src/framework/theme/components/button/button.component.ts index b4a2ffb98a..7148c7c162 100644 --- a/src/framework/theme/components/button/button.component.ts +++ b/src/framework/theme/components/button/button.component.ts @@ -55,6 +55,9 @@ import { convertToBoolProperty } from '../helpers'; * Button can be made `fullWidth`: * @stacked-example(Full Width Button, button/button-full-width.component.html) * + * Icon can be placed inside of a button as a child element: + * @stacked-example(Icon Button, button/button-icon.component.html) + * * @styles * * btn-fg: @@ -209,6 +212,20 @@ export class NbButtonComponent { return this.disabled ? '-1' : '0'; } + @HostBinding('class.icon-start') + get iconLeft(): boolean { + const el = this.hostElement.nativeElement; + const icon = this.iconElement; + return !!(icon && el.firstChild === icon); + } + + @HostBinding('class.icon-end') + get iconRight(): boolean { + const el = this.hostElement.nativeElement; + const icon = this.iconElement; + return !!(icon && el.lastChild === icon); + } + @HostBinding('class.btn-full-width') fullWidth = false; @@ -241,6 +258,11 @@ export class NbButtonComponent { this.shape = val; } + private get iconElement() { + const el = this.hostElement.nativeElement; + return el.querySelector('nb-icon'); + } + /** * Adds `hero` styles * @param {boolean} val diff --git a/src/framework/theme/components/card/card.module.ts b/src/framework/theme/components/card/card.module.ts index 5a1873058f..deeef96ee4 100644 --- a/src/framework/theme/components/card/card.module.ts +++ b/src/framework/theme/components/card/card.module.ts @@ -7,7 +7,7 @@ import { NgModule } from '@angular/core'; import { NbSharedModule } from '../shared/shared.module'; - +import { NbIconModule } from '../icon/icon.module'; import { NbCardComponent, NbCardBodyComponent, @@ -33,6 +33,7 @@ const NB_CARD_COMPONENTS = [ @NgModule({ imports: [ NbSharedModule, + NbIconModule, ], declarations: [ ...NB_CARD_COMPONENTS, diff --git a/src/framework/theme/components/card/flip-card/flip-card.component.ts b/src/framework/theme/components/card/flip-card/flip-card.component.ts index f8ceff734d..1f6d2dab4e 100644 --- a/src/framework/theme/components/card/flip-card/flip-card.component.ts +++ b/src/framework/theme/components/card/flip-card/flip-card.component.ts @@ -63,13 +63,13 @@ import { Component, Input, HostBinding } from '@angular/core'; diff --git a/src/framework/theme/components/card/reveal-card/reveal-card.component.ts b/src/framework/theme/components/card/reveal-card/reveal-card.component.ts index 6ddf270c8e..dd7f79ef3e 100644 --- a/src/framework/theme/components/card/reveal-card/reveal-card.component.ts +++ b/src/framework/theme/components/card/reveal-card/reveal-card.component.ts @@ -63,7 +63,7 @@ import { Component, Input, HostBinding } from '@angular/core'; - + `, }) diff --git a/src/framework/theme/components/chat/_chat.component.theme.scss b/src/framework/theme/components/chat/_chat.component.theme.scss index 99b305b5ab..3d618fda0f 100644 --- a/src/framework/theme/components/chat/_chat.component.theme.scss +++ b/src/framework/theme/components/chat/_chat.component.theme.scss @@ -12,6 +12,10 @@ border-radius: nb-theme(chat-border-radius); box-shadow: nb-theme(chat-shadow); + nb-icon { + font-size: inherit; + } + .header { color: nb-theme(chat-fg-text); padding: nb-theme(chat-padding); @@ -261,12 +265,17 @@ @include nb-rtl(border-bottom-right-radius, 0); @include nb-rtl(border-top-right-radius, 0); padding: 0 1.5rem; + color: white; &.with-icon { - font-size: 3rem; + font-size: 1.25rem; line-height: 1; padding: 0 1.25rem 0 0.875rem; text-align: center; + + nb-icon { + vertical-align: middle; + } } } @@ -293,7 +302,6 @@ margin-bottom: 0.5rem; border: 1px solid nb-theme(chat-form-fg); text-align: center; - line-height: 3rem; font-size: 2rem; color: nb-theme(chat-form-fg); position: relative; @@ -306,6 +314,10 @@ line-height: 1; cursor: pointer; } + + nb-icon { + vertical-align: middle; + } } } } diff --git a/src/framework/theme/components/chat/chat-form.component.ts b/src/framework/theme/components/chat/chat-form.component.ts index 1399b240e2..73fc7a31cc 100644 --- a/src/framework/theme/components/chat/chat-form.component.ts +++ b/src/framework/theme/components/chat/chat-form.component.ts @@ -60,7 +60,9 @@ import { DomSanitizer } from '@angular/platform-browser';
×
-
+ +
+ ×
@@ -72,7 +74,7 @@ import { DomSanitizer } from '@angular/platform-browser'; placeholder="{{ fileOver ? 'Drop file to send' : 'Type a message' }}" (keyup.enter)="sendMessage()">
`, @@ -99,7 +101,7 @@ export class NbChatFormComponent { * Send button icon, shown if `buttonTitle` is empty * @type {string} */ - @Input() buttonIcon: string = 'nb-paper-plane'; + @Input() buttonIcon: string = 'paper-plane-outline'; /** * Show send button diff --git a/src/framework/theme/components/chat/chat-message-file.component.ts b/src/framework/theme/components/chat/chat-message-file.component.ts index 6d8cdd1f67..09ed9e4959 100644 --- a/src/framework/theme/components/chat/chat-message-file.component.ts +++ b/src/framework/theme/components/chat/chat-message-file.component.ts @@ -23,16 +23,16 @@ import { DomSanitizer } from '@angular/platform-browser'; - -
+ +
`, diff --git a/src/framework/theme/components/chat/chat-message-map.component.ts b/src/framework/theme/components/chat/chat-message-map.component.ts index e55ee24e0c..3cf6c75285 100644 --- a/src/framework/theme/components/chat/chat-message-map.component.ts +++ b/src/framework/theme/components/chat/chat-message-map.component.ts @@ -57,7 +57,7 @@ export class NbChatMessageMapComponent { // tslint:disable-next-line url: `https://maps.googleapis.com/maps/api/staticmap?center=${this.latitude},${this.longitude}&zoom=12&size=400x400&key=${this.mapKey}`, type: 'image/png', - icon: 'nb-location', + icon: 'location', }; } diff --git a/src/framework/theme/components/chat/chat.module.ts b/src/framework/theme/components/chat/chat.module.ts index 25e4d9be06..a571bbd51c 100644 --- a/src/framework/theme/components/chat/chat.module.ts +++ b/src/framework/theme/components/chat/chat.module.ts @@ -7,6 +7,7 @@ import { ModuleWithProviders, NgModule } from '@angular/core'; import { NbSharedModule } from '../shared/shared.module'; +import { NbIconModule } from '../icon/icon.module'; import { NbChatComponent } from './chat.component'; import { NbChatMessageComponent } from './chat-message.component'; @@ -30,6 +31,7 @@ const NB_CHAT_COMPONENTS = [ @NgModule({ imports: [ NbSharedModule, + NbIconModule, ], declarations: [ ...NB_CHAT_COMPONENTS, diff --git a/src/framework/theme/components/icon/_icon.component.theme.scss b/src/framework/theme/components/icon/_icon.component.theme.scss new file mode 100644 index 0000000000..7b7e2a3a1a --- /dev/null +++ b/src/framework/theme/components/icon/_icon.component.theme.scss @@ -0,0 +1,31 @@ +/** + * @license + * Copyright Akveo. All Rights Reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +@mixin nb-icon-theme() { + nb-icon { + font-size: nb-theme(icon-font-size); + line-height: nb-theme(icon-line-height); + width: 1em; + height: 1em; + + &.primary-icon { + color: nb-theme(icon-primary-fg); + } + &.info-icon { + color: nb-theme(icon-info-fg); + } + &.success-icon { + color: nb-theme(icon-success-fg); + } + &.warning-icon { + color: nb-theme(icon-warning-fg); + } + &.danger-icon { + color: nb-theme(icon-danger-fg); + } + } +} + diff --git a/src/framework/theme/components/icon/icon-libraries.ts b/src/framework/theme/components/icon/icon-libraries.ts new file mode 100644 index 0000000000..b1c24a1bfc --- /dev/null +++ b/src/framework/theme/components/icon/icon-libraries.ts @@ -0,0 +1,189 @@ +/** + * @license + * Copyright Akveo. All Rights Reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +import { Injectable } from '@angular/core'; +import { NbFontIconPackParams, NbIconPack, NbIconPackParams, NbIconPackType, NbIcons } from './icon-pack'; +import { NbFontIcon, NbIcon, NbSvgIcon } from './icon'; + +export class NbIconDefinition { + name: string; + type: string; + pack: string; + icon: NbIcon; +} + +function throwPackNotFoundError(name: string) { + throw Error(`Icon Pack '${name}' is not registered`); +} + +function throwNoDefaultPackError() { + throw Error('Default pack is not registered.'); +} + +function throwIconNotFoundError(name: string, pack: string) { + throw Error(`Icon '${name}' is not registered in pack '${pack}'. Check icon name or consider switching icon pack.`); +} + +function throwWrongPackTypeError(name: string, type: string, desiredType: string) { + throw Error(`Pack '${name}' is not an '${desiredType}' Pack and its type is '${type}'`); +} + +/** + * This service allows to register multiple icon packs to use them later within `` component. + */ +@Injectable({providedIn: 'root'}) +export class NbIconLibraries { + + protected packs: Map = new Map(); + protected defaultPack: NbIconPack; + + /** + * Registers new Svg icon pack + * @param {string} name + * @param {NbIcon} icons + * @param {NbIconPackParams} params + */ + registerSvgPack(name: string, icons: NbIcons, params: NbIconPackParams= {}) { + this.packs.set(name, { + name, + icons: new Map(Object.entries(icons)), + params, + type: NbIconPackType.SVG, + }); + } + + /** + * Registers new font pack + * @param {string} name + * @param {NbIconPackParams} params + */ + registerFontPack(name: string, params: NbFontIconPackParams = {}) { + this.packs.set(name, { + name, + params, + icons: new Map(), + type: NbIconPackType.FONT, + }); + } + + /** + * Returns pack by name + * @param {string} name + */ + getPack(name: string): NbIconPack { + return this.packs.get(name); + } + + /** + * Sets pack as a default + * @param {string} name + */ + setDefaultPack(name: string) { + if (!this.packs.has(name)) { + throwPackNotFoundError(name); + } + + this.defaultPack = this.packs.get(name); + } + + /** + * Returns Svg icon + * @param {string} name + * @param {string} pack + * + * @returns NbIconDefinition + */ + getSvgIcon(name: string, pack?: string): NbIconDefinition { + const iconsPack = pack ? this.getPackOrThrow(pack) : this.getDefaultPackOrThrow(); + + if (iconsPack.type !== NbIconPackType.SVG) { + throwWrongPackTypeError(iconsPack.name, iconsPack.type, 'SVG'); + } + + const icon = this.getIconFromPack(name, iconsPack); + + return { + name, + pack: iconsPack.name, + type: NbIconPackType.SVG, + icon: this.createSvgIcon(name, icon, iconsPack.params), + }; + } + + /** + * Returns Font icon + * @param {string} name + * @param {string} pack + * + * @returns NbIconDefinition + */ + getFontIcon(name: string, pack?: string): NbIconDefinition { + const iconsPack = pack ? this.getPackOrThrow(pack) : this.getDefaultPackOrThrow(); + + if (iconsPack.type !== NbIconPackType.FONT) { + throwWrongPackTypeError(iconsPack.name, iconsPack.type, 'Font'); + } + + const icon = this.getIconFromPack(name, iconsPack, false); + + return { + name, + pack: iconsPack.name, + type: NbIconPackType.FONT, + icon: this.createFontIcon(name, icon ? icon : '', iconsPack.params), + }; + } + + /** + * Returns an icon + * @param {string} name + * @param {string} pack + * + * @returns NbIconDefinition + */ + getIcon(name: string, pack?: string): NbIconDefinition { + const iconsPack = pack ? this.getPackOrThrow(pack) : this.getDefaultPackOrThrow(); + + if (iconsPack.type === NbIconPackType.SVG) { + return this.getSvgIcon(name, pack); + } + + return this.getFontIcon(name, pack); + } + + protected createSvgIcon(name: string, content: NbIcon | string, params: NbIconPackParams): NbSvgIcon { + return content instanceof NbSvgIcon ? content : new NbSvgIcon(name, content, params); + } + + protected createFontIcon(name: string, content: NbIcon | string, params: NbFontIconPackParams): NbFontIcon { + return content instanceof NbFontIcon ? content : new NbFontIcon(name, content, params); + } + + protected getPackOrThrow(name: string): NbIconPack { + + const pack: NbIconPack = this.packs.get(name); + if (!pack) { + throwPackNotFoundError(name); + } + return pack; + } + + protected getDefaultPackOrThrow(): NbIconPack { + + if (!this.defaultPack) { + throwNoDefaultPackError(); + } + return this.defaultPack; + } + + protected getIconFromPack(name: string, pack: NbIconPack, shouldThrow = true): NbIcon | string { + if (shouldThrow && !pack.icons.has(name)) { + throwIconNotFoundError(name, pack.name); + } + + return pack.icons.get(name); + } +} diff --git a/src/framework/theme/components/icon/icon-pack.ts b/src/framework/theme/components/icon/icon-pack.ts new file mode 100644 index 0000000000..fde06381f8 --- /dev/null +++ b/src/framework/theme/components/icon/icon-pack.ts @@ -0,0 +1,26 @@ +import { NbIcon } from './icon'; + +export interface NbIcons { + [key: string]: NbIcon | string; +} + +export enum NbIconPackType { + SVG = 'svg', + FONT = 'font', +} + +export interface NbIconPackParams { + packClass?: string, + [name: string]: any, +} + +export interface NbFontIconPackParams extends NbIconPackParams { + iconClassPrefix?: string, +} + +export interface NbIconPack { + name: string; + type: NbIconPackType; + icons: Map; + params: NbIconPackParams, +} diff --git a/src/framework/theme/components/icon/icon.component.scss b/src/framework/theme/components/icon/icon.component.scss new file mode 100644 index 0000000000..48bb062ea7 --- /dev/null +++ b/src/framework/theme/components/icon/icon.component.scss @@ -0,0 +1,3 @@ +:host { + display: inline-block; +} diff --git a/src/framework/theme/components/icon/icon.component.spec.ts b/src/framework/theme/components/icon/icon.component.spec.ts new file mode 100644 index 0000000000..e6a38b9449 --- /dev/null +++ b/src/framework/theme/components/icon/icon.component.spec.ts @@ -0,0 +1,59 @@ +/** + * @license + * Copyright Akveo. All Rights Reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +import { Component, ElementRef, Input, ViewChild } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NbIconModule } from './icon.module'; +import { NbIconLibraries } from './icon-libraries'; + + +@Component({ + template: ` + + `, +}) +class IconTestComponent { + @ViewChild('iconEl', { read: ElementRef }) iconElement; + + @Input() icon; +} + +describe('Component: NbIcon', () => { + + let iconTestComponent: IconTestComponent; + let fixture: ComponentFixture; + let iconElement: ElementRef; + let iconsLibrary: NbIconLibraries; + + beforeEach(() => { + + const bed = TestBed.configureTestingModule({ + imports: [ NbIconModule ], + providers: [ NbIconLibraries ], + declarations: [ IconTestComponent ], + }); + + fixture = bed.createComponent(IconTestComponent); + iconsLibrary = bed.get(NbIconLibraries); + + iconsLibrary + .registerSvgPack('svg-pack', { home: '' }, { packClass: 'custom-pack' }); + iconsLibrary.setDefaultPack('svg-pack'); + + iconTestComponent = fixture.componentInstance; + iconElement = iconTestComponent.iconElement; + }); + + it('should render icon', () => { + iconTestComponent.icon = 'home'; + fixture.detectChanges(); + const svg = iconElement.nativeElement.querySelector('svg'); + + expect(iconElement.nativeElement.classList.contains('custom-pack')).toBeTruthy(); + expect(svg.innerHTML).toContain(''); + }); +}); diff --git a/src/framework/theme/components/icon/icon.component.ts b/src/framework/theme/components/icon/icon.component.ts new file mode 100644 index 0000000000..d99c3d38f1 --- /dev/null +++ b/src/framework/theme/components/icon/icon.component.ts @@ -0,0 +1,206 @@ +/** + * @license + * Copyright Akveo. All Rights Reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +import { + ChangeDetectionStrategy, + Component, + ElementRef, + HostBinding, + Input, + OnChanges, + OnInit, + Renderer2, +} from '@angular/core'; +import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; + +import { NbIconLibraries } from './icon-libraries'; + +/** + * Icon component. Allows to render both `svg` and `font` icons. + * Starting from Nebular 4.0 uses [Eva Icons](https://akveo.github.io/eva-icons/) pack by default. + * + * Basic icon example: + * @stacked-example(Showcase, icon/icon-showcase.component) + * + * Icon configuration: + * + * ```html + * + * ``` + * ### Installation + * + * By default Nebular comes without any pre-installed icon pack. + * Starting with Nebular 4.0.0 we ship separate package called `@nebular/eva-icons` + * which integrates SVG [Eva Icons](https://akveo.github.io/eva-icons/) pack to Nebular. To add it to your + * project run: + * ```sh + * npm i @nebular/eva-icons + * ``` + * This command will install Nebular Eva Icons pack. Then register `NbEvaIconsModule` into your app module or any child + * module you need to have the icons in: + * ```ts + * import { NbEvaIconsModule } form '@nebular/eva-icons'; + * + * @NgModule({ + * imports: [ + * // ... + * NbEvaIconsModule, + * ], + * }) + * export class PageModule { } + * ``` + * Last thing, import `NbIconModule` to your feature module where you need to show an icon: + * ```ts + * @NgModule({ + * imports: [ + * // ... + * NbIconModule, + * ], + * }) + * export class PageModule { } + * ``` + * ### Usage + * + * Icon can be colored using `status` input: + * ```html + * + * ``` + * + * Colored icons: + * @stacked-example(Colored Icons, icon/icon-colors.component) + * + * In case you need to specify an icon from a specific icon pack, this could be done using `pack` input property: + * ```html + * + * ``` + * Additional icon settings (if available by the icon pack) could be passed using `options` input: + * + * ```html + * + * ``` + * + * @styles + * + * icon-font-size: + * icon-width: + * icon-height: + * icon-primary-fg: + * icon-info-fg: + * icon-success-fg: + * icon-warning-fg: + * icon-danger-fg: + */ +@Component({ + selector: 'nb-icon', + styleUrls: [`./icon.component.scss`], + template: '', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class NbIconComponent implements OnChanges, OnInit { + + static readonly STATUS_PRIMARY = 'primary'; + static readonly STATUS_INFO = 'info'; + static readonly STATUS_SUCCESS = 'success'; + static readonly STATUS_WARNING = 'warning'; + static readonly STATUS_DANGER = 'danger'; + + private iconDef; + private prevClasses = []; + + @HostBinding('innerHtml') + html: SafeHtml; + + @HostBinding('class.primary-icon') + get primary() { + return this.status === NbIconComponent.STATUS_PRIMARY; + } + + @HostBinding('class.info-icon') + get info() { + return this.status === NbIconComponent.STATUS_INFO; + } + + @HostBinding('class.success-icon') + get success() { + return this.status === NbIconComponent.STATUS_SUCCESS; + } + + @HostBinding('class.warning-icon') + get warning() { + return this.status === NbIconComponent.STATUS_WARNING; + } + + @HostBinding('class.danger-icon') + get danger() { + return this.status === NbIconComponent.STATUS_DANGER; + } + + /** + * Icon name + * @param {string} status + */ + @Input() icon: string; + + /** + * Icon pack name + * @param {string} status + */ + @Input() pack: string; + + /** + * Additional icon settings + * @param {[name: string]: any} + */ + @Input() options: { [name: string]: any }; + + /** + * Icon status (adds specific styles): + * primary, info, success, warning, danger + * @param {string} status + */ + @Input() status: string; + + constructor( + private sanitizer: DomSanitizer, + private iconLibrary: NbIconLibraries, + private el: ElementRef, + private renderer: Renderer2, + ) {} + + ngOnInit() { + this.iconDef = this.renderIcon(this.icon, this.pack, this.options); + } + + ngOnChanges() { + if (this.iconDef) { + this.iconDef = this.renderIcon(this.icon, this.pack, this.options); + } + } + + renderIcon(name: string, pack?: string, options?: { [name: string]: any }) { + const iconDefinition = this.iconLibrary.getIcon(name, pack); + + const content = iconDefinition.icon.getContent(options); + if (content) { + this.html = this.sanitizer.bypassSecurityTrustHtml(content); + } + + this.assignClasses(iconDefinition.icon.getClasses(options)); + return iconDefinition; + } + + protected assignClasses(classes: string[]) { + this.prevClasses.forEach((className: string) => { + this.renderer.removeClass(this.el.nativeElement, className); + }); + + classes.forEach((className: string) => { + this.renderer.addClass(this.el.nativeElement, className); + }); + + this.prevClasses = classes; + } +} diff --git a/src/framework/theme/components/icon/icon.module.ts b/src/framework/theme/components/icon/icon.module.ts new file mode 100644 index 0000000000..781672e992 --- /dev/null +++ b/src/framework/theme/components/icon/icon.module.ts @@ -0,0 +1,56 @@ +/** + * @license + * Copyright Akveo. All Rights Reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { NbIconComponent } from './icon.component'; +import { NbIconLibraries } from './icon-libraries'; + +@NgModule({ + imports: [ + CommonModule, + ], + declarations: [ + NbIconComponent, + ], + exports: [ + NbIconComponent, + ], +}) +export class NbIconModule { + + private essentialsPackName = 'nebular-essentials'; + + constructor(private iconsLibrary: NbIconLibraries) { + + // in case of consequent calls we don't need to enable `nebular-essentials` pack again + if (this.iconsLibrary.getPack(this.essentialsPackName)) { + return; + } + + // tslint:disable:max-line-length + this.iconsLibrary.registerSvgPack(this.essentialsPackName, { + 'chevron-down-outline': '', + 'chevron-up-outline': '', + 'chevron-left-outline': '', + 'chevron-right-outline': '', + 'checkmark-outline': '', + 'paper-plane-outline': '', + 'file-text-outline': '', + 'alert-triangle-outline': '', + 'question-mark-outline': '', + 'email-outline': '', + 'flash-outline': '', + 'search-outline': '', + 'close-outline': '', + 'collapse-outline': '', + 'expand-outline': '', + 'minus-outline': '', + }); + // tslint:enable:max-line-length + } +} diff --git a/src/framework/theme/components/icon/icon.spec.ts b/src/framework/theme/components/icon/icon.spec.ts new file mode 100644 index 0000000000..12e1424ee4 --- /dev/null +++ b/src/framework/theme/components/icon/icon.spec.ts @@ -0,0 +1,75 @@ +/** + * @license + * Copyright Akveo. All Rights Reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +import { NbFontIcon, NbSvgIcon } from './icon'; + + +describe('icon', () => { + let fontIcon: NbFontIcon; + let svgIcon: NbSvgIcon; + + + it(`font icon renders`, () => { + + fontIcon = new NbFontIcon('home', 'custom', { + packClass: 'custom-pack', + iconClassPrefix: 'cp', + }); + + expect(fontIcon.getContent()).toEqual('custom'); + }); + + it(`font icon getClasses return classes`, () => { + + fontIcon = new NbFontIcon('home', '', { + packClass: 'custom-pack', + }); + + expect(fontIcon.getClasses()).toEqual(['custom-pack', 'home']); + }); + + it(`font icon getClasses return class with prefix`, () => { + + fontIcon = new NbFontIcon('home', '', { + packClass: 'custom-pack', + iconClassPrefix: 'cp', + }); + + expect(fontIcon.getClasses()).toEqual(['custom-pack', 'cp-home']); + }); + + it(`font icon getClasses return class with name only`, () => { + + fontIcon = new NbFontIcon('home', ''); + + expect(fontIcon.getClasses()).toEqual(['home']); + }); + + it(`svg icon renders`, () => { + + svgIcon = new NbSvgIcon('home', 'content', { + packClass: 'custom-pack', + }); + + expect(svgIcon.getContent()).toEqual('content'); + }); + + it(`svg icon getClasses return class`, () => { + + svgIcon = new NbSvgIcon('home', '', { + packClass: 'custom-pack', + }); + + expect(svgIcon.getClasses()).toEqual(['custom-pack']); + }); + + it(`svg icon getClasses return class without name`, () => { + + svgIcon = new NbSvgIcon('home', ''); + + expect(svgIcon.getClasses()).toEqual([]); + }); +}); diff --git a/src/framework/theme/components/icon/icon.ts b/src/framework/theme/components/icon/icon.ts new file mode 100644 index 0000000000..a598f50c31 --- /dev/null +++ b/src/framework/theme/components/icon/icon.ts @@ -0,0 +1,49 @@ +import { NbFontIconPackParams, NbIconPackParams } from './icon-pack'; + +export interface NbIconOptions { + [name: string]: any; +} + +export interface NbIcon { + getClasses(options?: NbIconOptions): string[]; + getContent(options?: NbIconOptions): string; +} + +export class NbFontIcon implements NbIcon { + + constructor(protected name, protected content: any, protected params: NbFontIconPackParams = {}) {} + + getClasses(options?: NbIconOptions): string[] { + const classes = []; + + if (this.params.packClass) { + classes.push(this.params.packClass); + } + + const name = this.params.iconClassPrefix ? `${this.params.iconClassPrefix}-${this.name}` : this.name; + classes.push(name); + return classes; + } + + getContent(options?: NbIconOptions): string { + return this.content; + } +} + +export class NbSvgIcon implements NbIcon { + + constructor(protected name, protected content: any, protected params: NbIconPackParams = {}) {} + + getClasses(options?: NbIconOptions): string[] { + const classes = []; + + if (this.params.packClass) { + classes.push(this.params.packClass); + } + return classes; + } + + getContent(options?: NbIconOptions): string { + return this.content; + } +} diff --git a/src/framework/theme/components/icon/icons-libraries.spec.ts b/src/framework/theme/components/icon/icons-libraries.spec.ts new file mode 100644 index 0000000000..bdba40e237 --- /dev/null +++ b/src/framework/theme/components/icon/icons-libraries.spec.ts @@ -0,0 +1,153 @@ +import { TestBed } from '@angular/core/testing'; + +import { NbIconLibraries } from './icon-libraries'; +import { NbSvgIcon } from './icon'; + + +describe('icons-library', () => { + let iconsLibrary: NbIconLibraries; + + beforeEach(() => { + TestBed.resetTestingModule(); + const bed = TestBed.configureTestingModule({ + providers: [ + NbIconLibraries, + ], + }); + iconsLibrary = bed.get(NbIconLibraries); + }); + + it('should register raw svg icon', () => { + + iconsLibrary.registerSvgPack('super-pack', { home: '', gear: '' }); + iconsLibrary.setDefaultPack('super-pack'); + + const icon = iconsLibrary.getSvgIcon('home'); + + expect(icon.icon.getContent()).toEqual(''); + expect(icon.name).toEqual('home'); + expect(icon.pack).toEqual('super-pack'); + expect(icon.type).toEqual('svg'); + }); + + it('should register NbSvgIcon svg icon', () => { + + iconsLibrary.registerSvgPack('super-pack', { + home: new NbSvgIcon('home', '', { packClass: 'sp' }), + }); + iconsLibrary.setDefaultPack('super-pack'); + + const icon = iconsLibrary.getSvgIcon('home'); + + expect(icon.icon.getContent()).toEqual(''); + expect(icon.icon.getClasses()).toEqual(['sp']); + expect(icon.name).toEqual('home'); + expect(icon.pack).toEqual('super-pack'); + expect(icon.type).toEqual('svg'); + }); + + it('should register custom svg icon', () => { + + class CustomSvgIcon extends NbSvgIcon { + getContent() { + return 'custom'; + } + } + + iconsLibrary.registerSvgPack('super-pack', { + home: new CustomSvgIcon('home', '', { packClass: 'sp' }), + }); + iconsLibrary.setDefaultPack('super-pack'); + + const icon = iconsLibrary.getSvgIcon('home'); + + expect(icon.icon.getContent()).toEqual('custom'); + expect(icon.icon.getClasses()).toEqual(['sp']); + expect(icon.name).toEqual('home'); + expect(icon.pack).toEqual('super-pack'); + expect(icon.type).toEqual('svg'); + }); + + it('should throw for unknown svg icon', () => { + + iconsLibrary.registerSvgPack('super-pack', { home: '', gear: '' }); + iconsLibrary.setDefaultPack('super-pack'); + + + expect(() => iconsLibrary.getSvgIcon('unknown')) + // tslint:disable-next-line:max-line-length + .toThrowError(`Icon 'unknown' is not registered in pack 'super-pack'. Check icon name or consider switching icon pack.`); + }); + + it('should throw for no default pack', () => { + expect(() => iconsLibrary.getSvgIcon('unknown')).toThrowError('Default pack is not registered.'); + }); + + it('should throw for wrong pack type', () => { + + iconsLibrary.registerSvgPack('super-pack', { home: '', gear: '' }); + iconsLibrary.registerFontPack('font-pack'); + iconsLibrary.setDefaultPack('font-pack'); + + + expect(() => iconsLibrary.getSvgIcon('unknown')) + .toThrowError(`Pack 'font-pack' is not an 'SVG' Pack and its type is 'font'`); + }); + + it('should throw for wrong pack', () => { + + iconsLibrary.registerSvgPack('super-pack', { home: '', gear: '' }); + iconsLibrary.registerFontPack('font-pack'); + iconsLibrary.setDefaultPack('super-pack'); + + expect(() => iconsLibrary.getSvgIcon('unknown')) + // tslint:disable-next-line:max-line-length + .toThrowError(`Icon 'unknown' is not registered in pack 'super-pack'. Check icon name or consider switching icon pack.`); + }); + + it('should throw for wrong pack when setting default', () => { + + iconsLibrary.registerFontPack('font-pack'); + + expect(() => iconsLibrary.setDefaultPack('super-pack')) + .toThrowError(`Icon Pack 'super-pack' is not registered`); + }); + + it('should register font icon', () => { + + iconsLibrary.registerFontPack('font-pack', { packClass: 'font', iconClassPrefix: 'fp' }); + iconsLibrary.setDefaultPack('font-pack'); + + const icon = iconsLibrary.getFontIcon('home'); + + expect(icon.icon.getContent()).toEqual(''); + expect(icon.icon.getClasses()).toEqual(['font', 'fp-home']); + expect(icon.name).toEqual('home'); + expect(icon.pack).toEqual('font-pack'); + expect(icon.type).toEqual('font'); + }); + + + it('should return icon', () => { + + iconsLibrary.registerSvgPack('super-pack', { home: '', gear: '' }); + iconsLibrary.registerFontPack('font-pack', { packClass: 'font', iconClassPrefix: 'fp' }); + iconsLibrary.setDefaultPack('font-pack'); + + const icon = iconsLibrary.getIcon('home'); + const svgIcon = iconsLibrary.getIcon('home', 'super-pack'); + + expect(icon.icon.getContent()).toEqual(''); + expect(icon.icon.getClasses()).toEqual(['font', 'fp-home']); + expect(icon.icon.getClasses()).toEqual(['font', 'fp-home']); + expect(icon.name).toEqual('home'); + expect(icon.pack).toEqual('font-pack'); + expect(icon.type).toEqual('font'); + + expect(svgIcon.icon.getContent()).toEqual(''); + expect(svgIcon.name).toEqual('home'); + expect(svgIcon.pack).toEqual('super-pack'); + expect(svgIcon.type).toEqual('svg'); + }); + +}); diff --git a/src/framework/theme/components/input/input.spec.ts b/src/framework/theme/components/input/input.spec.ts index 7c373cc584..68e15d6f18 100644 --- a/src/framework/theme/components/input/input.spec.ts +++ b/src/framework/theme/components/input/input.spec.ts @@ -44,7 +44,7 @@ describe('Directive: NbInput', () => { let inputElement: Element; let textareaElement: Element; - beforeEach(() => {; + beforeEach(() => { fixture = TestBed.configureTestingModule({ imports: [ NbInputModule ], diff --git a/src/framework/theme/components/menu/menu-item.component.html b/src/framework/theme/components/menu/menu-item.component.html index c3bb5f4081..4918e43bdf 100644 --- a/src/framework/theme/components/menu/menu-item.component.html +++ b/src/framework/theme/components/menu/menu-item.component.html @@ -1,5 +1,5 @@ - + {{ menuItem.title }} - + {{ menuItem.title }} - + {{ menuItem.title }} - + {{ menuItem.title }} - + {{ menuItem.title }} - + +
    some-icon' }); + iconLibs.setDefaultPack('test') } function createSingleMenuComponent(menuItems, menuTag = 'menu') { @@ -84,9 +89,9 @@ describe('NbMenuItem', () => { }); it('should set icon to menu item', () => { - const { fixture } = createSingleMenuComponent([{ title: 'Home', icon: 'test-icon' }]); + const { fixture } = createSingleMenuComponent([{ title: 'Home', icon: 'some-icon' }]); const iconWrapper = fixture.nativeElement.querySelector('.menu-icon'); - expect(iconWrapper.classList).toContain('test-icon'); + expect(iconWrapper.textContent).toContain('some-icon'); }); it('should set title to menu item', () => { diff --git a/src/framework/theme/components/route-tabset/route-tabset.component.scss b/src/framework/theme/components/route-tabset/route-tabset.component.scss index fb30b44a16..ce53f16ebd 100644 --- a/src/framework/theme/components/route-tabset/route-tabset.component.scss +++ b/src/framework/theme/components/route-tabset/route-tabset.component.scss @@ -36,12 +36,12 @@ left: 0; } - i { + nb-icon { font-size: 1.5rem; vertical-align: middle; } - i + span { + nb-icon + span { @include nb-ltr(margin-left, 0.5rem); @include nb-rtl(margin-right, 0.5rem); } diff --git a/src/framework/theme/components/route-tabset/route-tabset.component.ts b/src/framework/theme/components/route-tabset/route-tabset.component.ts index 270cddd9a3..7a8ee62e73 100644 --- a/src/framework/theme/components/route-tabset/route-tabset.component.ts +++ b/src/framework/theme/components/route-tabset/route-tabset.component.ts @@ -16,7 +16,7 @@ import { convertToBoolProperty } from '../helpers'; * { * title: 'Route tab #1', * route: '/pages/description', - * icon: 'nb-home', + * icon: 'home', * responsive: true, // hide title before `route-tabs-icon-only-max-width` value * }, * { @@ -68,7 +68,7 @@ import { convertToBoolProperty } from '../helpers'; class="route-tab disabled" tabindex="-1"> - + {{ tab.title }} @@ -82,7 +82,7 @@ import { convertToBoolProperty } from '../helpers'; tabindex="0" class="route-tab"> - + {{ tab.title }} diff --git a/src/framework/theme/components/route-tabset/route-tabset.module.ts b/src/framework/theme/components/route-tabset/route-tabset.module.ts index a0f96e883f..47c5b54d3d 100644 --- a/src/framework/theme/components/route-tabset/route-tabset.module.ts +++ b/src/framework/theme/components/route-tabset/route-tabset.module.ts @@ -9,10 +9,12 @@ import { NgModule } from '@angular/core'; import { NbSharedModule } from '../shared/shared.module'; import { NbRouteTabsetComponent } from './route-tabset.component'; +import { NbIconModule } from '../icon/icon.module'; @NgModule({ imports: [ NbSharedModule, + NbIconModule, ], declarations: [ NbRouteTabsetComponent, diff --git a/src/framework/theme/components/search/search.component.ts b/src/framework/theme/components/search/search.component.ts index 6cfe819763..22b30ad159 100644 --- a/src/framework/theme/components/search/search.component.ts +++ b/src/framework/theme/components/search/search.component.ts @@ -48,7 +48,7 @@ import { NbOverlayService, NbOverlayRef, NbPortalDirective } from '../cdk'; template: `

pbc)3Ac_0U3Y~NK%Az8w4h7yC9w1S(7VM$WSNx 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 T5l0h?&i6PN+!y;ai{-xo5r~;7 diff --git a/docs/assets/fonts/feather/feather.woff b/docs/assets/fonts/feather/feather.woff deleted file mode 100755 index 9b03a72a0145306a5b3f61434109b27b7bc223d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29500 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/structure.ts b/docs/structure.ts index e5a9315d05..3482803ad9 100644 --- a/docs/structure.ts +++ b/docs/structure.ts @@ -420,6 +420,15 @@ export const structure = [ 'NbAlertComponent', ], }, + { + type: 'tabs', + name: 'Icon', + icon: 'icon.svg', + source: [ + 'NbIconComponent', + 'NbIconLibraries', + ], + }, { type: 'tabs', name: 'Spinner', diff --git a/docs/tsconfig.app.json b/docs/tsconfig.app.json index 52d70edd56..289ccf8992 100644 --- a/docs/tsconfig.app.json +++ b/docs/tsconfig.app.json @@ -19,7 +19,8 @@ "@nebular/theme": ["../src/framework/theme"], "@nebular/theme/*": ["../src/framework/theme/*"], "@nebular/auth": ["../src/framework/auth"], - "@nebular/security": ["../src/framework/security"] + "@nebular/security": ["../src/framework/security"], + "@nebular/eva-icons": ["../src/framework/eva-icons"] } }, "exclude": [ diff --git a/package-lock.json b/package-lock.json index 1c568ed82a..97e1816ace 100644 --- a/package-lock.json +++ b/package-lock.json @@ -683,7 +683,7 @@ }, "@google-cloud/common": { "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.17.0.tgz", + "resolved": "http://registry.npmjs.org/@google-cloud/common/-/common-0.17.0.tgz", "integrity": "sha512-HRZLSU762E6HaKoGfJGa8W95yRjb9rY7LePhjaHK9ILAnFacMuUGVamDbTHu1csZomm1g3tZTtXfX/aAhtie/Q==", "dev": true, "optional": true, @@ -3738,13 +3738,13 @@ "dependencies": { "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -6014,6 +6014,11 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, + "eva-icons": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eva-icons/-/eva-icons-1.1.1.tgz", + "integrity": "sha512-Uf7JQMA1lWQLLtHuk1lbMlwP4i3W0jjTy5SCYBGeR6DLPub5Ls2QiJlVT59llphVObXSVwaMuofevwgUZWf1CQ==" + }, "event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", @@ -12760,11 +12765,6 @@ "dev": true, "optional": true }, - "nebular-icons": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/nebular-icons/-/nebular-icons-1.1.0.tgz", - "integrity": "sha512-4TkJgDrjXw8qsOsc2NN6OBlRJYAJJpvqtjV+gpv+NV6amPgMPQNNuEvbenYXAMFmjs3uShgKOvmpnCX8Ua1oWQ==" - }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -13509,7 +13509,7 @@ }, "onetime": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, @@ -13610,7 +13610,7 @@ }, "p-cancelable": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "resolved": "http://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", "dev": true, "optional": true diff --git a/package.json b/package.json index eb5abde44c..9c79a4b3a7 100644 --- a/package.json +++ b/package.json @@ -101,6 +101,7 @@ "core-js": "2.5.7", "date-fns": ">=2.0.0-alpha.16 <=2.0.0-alpha.27", "docsearch.js": "^2.5.2", + "eva-icons": "^1.1.1", "gulp-bump": "2.7.0", "highlight.js": "9.12.0", "intersection-observer": "0.5.0", @@ -109,7 +110,6 @@ "leaflet": "1.0.3", "marked": "0.3.9", "moment": "^2.22.2", - "nebular-icons": "1.1.0", "normalize.css": "8.0.0", "rxjs": "6.3.0", "socicon": "3.0.5", @@ -176,4 +176,4 @@ "uglifyjs-webpack-plugin": "1.1.5" }, "schematics": "./schematics/dist/collection.json" -} \ No newline at end of file +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts index d23580d7ea..0a981cd355 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -17,6 +17,7 @@ import { LayoutDirectionToggleComponent } from './layout-direction-toggle/layout import { LayoutThemeToggleComponent } from './layout-theme-toggle/layout-theme-toggle.component'; import { ComponentsOverlayComponent } from './components-list/components-overlay.component'; import { ComponentsListComponent} from './components-list/components-list.component'; +import { NbEvaIconsModule } from '@nebular/eva-icons'; @NgModule({ imports: [ @@ -31,6 +32,7 @@ import { ComponentsListComponent} from './components-list/components-list.compon }, ], { useHash: true }), NbThemeModule.forRoot(), + NbEvaIconsModule, ], declarations: [ AppComponent, diff --git a/src/app/playground-components.ts b/src/app/playground-components.ts index 793d5594c3..68435a00b7 100644 --- a/src/app/playground-components.ts +++ b/src/app/playground-components.ts @@ -174,6 +174,12 @@ export const PLAYGROUND_COMPONENTS: ComponentLink[] = [ component: 'ButtonTypesComponent', name: 'Button Types', }, + { + path: 'button-icon.component', + link: '/button/button-icon.component', + component: 'ButtonIconComponent', + name: 'Button Icon', + }, ], }, { @@ -1320,6 +1326,23 @@ export const PLAYGROUND_COMPONENTS: ComponentLink[] = [ }, ], }, + { + path: 'icon', + children: [ + { + path: 'icon-showcase.component', + link: '/icon/icon-showcase.component', + component: 'IconShowcaseComponent', + name: 'Icon Showcase', + }, + { + path: 'icon-colors.component', + link: '/icon/icon-colors.component', + component: 'IconColorsComponent', + name: 'Icon Colors', + }, + ], + }, { path: 'context-menu', children: [ diff --git a/src/framework/auth/auth.module.ts b/src/framework/auth/auth.module.ts index b61fdaaff1..082d695b62 100644 --- a/src/framework/auth/auth.module.ts +++ b/src/framework/auth/auth.module.ts @@ -9,6 +9,7 @@ import { NbButtonModule, NbCardModule, NbCheckboxModule, + NbIconModule, NbInputModule, NbLayoutModule, } from '@nebular/theme'; @@ -94,6 +95,7 @@ export function nbNoOpInterceptorFilter(req: HttpRequest): boolean { NbButtonModule, RouterModule, FormsModule, + NbIconModule, ], declarations: [ NbAuthComponent, diff --git a/src/framework/auth/components/auth.component.scss b/src/framework/auth/components/auth.component.scss index d2c4f9f20b..ce6b0c4cb1 100644 --- a/src/framework/auth/components/auth.component.scss +++ b/src/framework/auth/components/auth.component.scss @@ -11,7 +11,7 @@ .navigation .link { text-decoration: none; - .icon { + nb-icon { font-size: 2rem; } } diff --git a/src/framework/auth/components/auth.component.ts b/src/framework/auth/components/auth.component.ts index cd5e020619..aa432f7722 100644 --- a/src/framework/auth/components/auth.component.ts +++ b/src/framework/auth/components/auth.component.ts @@ -18,7 +18,7 @@ import { takeWhile } from 'rxjs/operators';