diff --git a/.gitignore b/.gitignore index a4542ab1403..1a2a47eda4a 100644 --- a/.gitignore +++ b/.gitignore @@ -48,6 +48,10 @@ src/**/*.js src/**/*.js.map src/**/*.css.map +# Artefacts +projects/igniteui-angular/**/*.component.css + +# Typedoc Theme # Typedoc and SassDoc Themes extras/sassdoc/**/* extras/docs/themes/typedoc/bin diff --git a/angular.json b/angular.json index a8157cba8d9..65a0eccadc7 100644 --- a/angular.json +++ b/angular.json @@ -359,8 +359,8 @@ "budgets": [ { "type": "allScript", - "maximumWarning": "2.5mb", - "maximumError": "3mb" + "maximumWarning": "4mb", + "maximumError": "5mb" }, { "type": "bundle", @@ -370,8 +370,8 @@ }, { "type": "anyComponentStyle", - "maximumWarning": "2kb", - "maximumError": "4kb" + "maximumWarning": "200kb", + "maximumError": "300kb" } ], "fileReplacements": [ @@ -494,8 +494,8 @@ }, { "type": "anyComponentStyle", - "maximumWarning": "2kb", - "maximumError": "4kb" + "maximumWarning": "200kb", + "maximumError": "300kb" } ], "outputHashing": "all", @@ -585,8 +585,8 @@ }, { "type": "anyComponentStyle", - "maximumWarning": "4kB", - "maximumError": "8kB" + "maximumWarning": "200kB", + "maximumError": "300kB" } ], "outputHashing": "all" diff --git a/package-lock.json b/package-lock.json index dd645501a94..f838049c30b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "express": "^5.2.1", "fflate": "^0.8.1", "igniteui-i18n-core": "^1.0.2", - "igniteui-theming": "^25.0.3", + "igniteui-theming": "^25.1.0", "igniteui-trial-watermark": "^3.1.0", "jspdf": "^4.2.1", "lodash-es": "^4.17.21", @@ -62,6 +62,7 @@ "@typescript-eslint/eslint-plugin": "^8.33.1", "@typescript-eslint/parser": "^8.33.1", "autoprefixer": "^10.4.16", + "concurrently": "^9.1.2", "del": "^6.0.0", "eslint": "^9.28.0", "fs-extra": "^11.3.0", @@ -94,6 +95,7 @@ "karma-spec-reporter": "^0.0.36", "lit-html": "^3.2.1", "ng-packagr": "^21.0.0", + "node-watch": "^0.7.4", "postcss": "^8.5.1", "postcss-scss": "^4.0.6", "prettier": "^3.3.3", @@ -9258,6 +9260,122 @@ "node": ">=0.10.0" } }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/concurrently/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -14081,9 +14199,9 @@ } }, "node_modules/igniteui-theming": { - "version": "25.0.3", - "resolved": "https://registry.npmjs.org/igniteui-theming/-/igniteui-theming-25.0.3.tgz", - "integrity": "sha512-Lq6NusLS6zOjL1E/5942+UNrvf4goeQlVb9XcCSzk7rMyA9Q6ybf9ltLHAag8O/vsIjMsr9FxJaJV3mTYErXzg==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/igniteui-theming/-/igniteui-theming-25.1.0.tgz", + "integrity": "sha512-qM55JURFepSLjU0cl1g8J7E05BXxTp7aQ6oUu4j5ZBZEhKAGCaxZZdMtBSkcKcyghjwkDvurpihzjdnvv76YAg==", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.25.0", @@ -18891,6 +19009,16 @@ "dev": true, "license": "MIT" }, + "node_modules/node-watch": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.4.tgz", + "integrity": "sha512-RinNxoz4W1cep1b928fuFhvAQ5ag/+1UlMDV7rbyGthBIgsiEouS4kvRayvvboxii4m8eolKOIBo3OjDqbc+uQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -22409,31 +22537,6 @@ "sassdoc-extras": "^2.5.0" } }, - "node_modules/sassdoc-theme-default/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/sassdoc-theme-default/node_modules/commander": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", @@ -22462,19 +22565,6 @@ "jsonfile": "^2.1.0" } }, - "node_modules/sassdoc-theme-default/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "extraneous": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/sassdoc-theme-default/node_modules/jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", @@ -22511,32 +22601,6 @@ } } }, - "node_modules/sassdoc-theme-default/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/sassdoc-theme-default/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/sassdoc/node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -23347,6 +23411,19 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/shiki": { "version": "3.23.0", "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.23.0.tgz", @@ -25082,6 +25159,16 @@ "node": ">=6" } }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", diff --git a/package.json b/package.json index 5f4e7e32737..88946bd391b 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "ng serve --open --hmr", + "start": "concurrently -r \"npm run build:styles:components\" \"npm run watch:styles\" \"ng serve --open --hmr\"", "start:elements": "ng serve --project igniteui-angular-elements", "start:performance": "ng serve --project igniteui-angular-performance", "build": "npm run build:lib && npm run build:elements && npm run build:extras && npm run build:schematics && npm run build:migrations && npm run build:i18n", @@ -23,8 +23,10 @@ "test:i18n": "ts-node --skip-project ./projects/igniteui-angular/core/src/core/i18n/tests/tests.mjs", "test:elements": "ng test igniteui-angular-elements --watch=false --no-progress --code-coverage --source-map=false", "test:elements:watch": "ng test igniteui-angular-elements", - "build:lib": "ng build igniteui-angular --configuration production && npm run build:styles", - "build:styles": "node scripts/build-styles.mjs", + "build:lib": "npm run build:styles:components && ng build igniteui-angular --configuration production && npm run build:styles", + "build:styles": "node scripts/build-theme-styles.mjs", + "build:styles:components": "node scripts/build-component-styles.mjs", + "watch:styles": "node scripts/watch-styles.mjs", "build:extras": "ng build igniteui-angular-extras --configuration production && npm run build:extras-migrations", "build:extras-migrations": "gulp copyExtrasMigrations && tsc --listEmittedFiles --project ./projects/igniteui-angular-extras/migrations/tsconfig.json", "test:extras": "ng test igniteui-angular-extras --watch=false --no-progress --code-coverage", @@ -82,7 +84,7 @@ "express": "^5.2.1", "fflate": "^0.8.1", "igniteui-i18n-core": "^1.0.2", - "igniteui-theming": "^25.0.3", + "igniteui-theming": "^25.1.0", "igniteui-trial-watermark": "^3.1.0", "jspdf": "^4.2.1", "lodash-es": "^4.17.21", @@ -117,6 +119,7 @@ "@typescript-eslint/eslint-plugin": "^8.33.1", "@typescript-eslint/parser": "^8.33.1", "autoprefixer": "^10.4.16", + "concurrently": "^9.1.2", "del": "^6.0.0", "eslint": "^9.28.0", "fs-extra": "^11.3.0", @@ -149,6 +152,7 @@ "karma-spec-reporter": "^0.0.36", "lit-html": "^3.2.1", "ng-packagr": "^21.0.0", + "node-watch": "^0.7.4", "postcss": "^8.5.1", "postcss-scss": "^4.0.6", "prettier": "^3.3.3", diff --git a/projects/igniteui-angular-extras/src/lib/context-menu/chart-dialog/chart-dialog.component.ts b/projects/igniteui-angular-extras/src/lib/context-menu/chart-dialog/chart-dialog.component.ts index 0bdcfc028f2..146e3016de9 100644 --- a/projects/igniteui-angular-extras/src/lib/context-menu/chart-dialog/chart-dialog.component.ts +++ b/projects/igniteui-angular-extras/src/lib/context-menu/chart-dialog/chart-dialog.component.ts @@ -16,7 +16,11 @@ import { CommonModule } from '@angular/common'; import * as charts from '../../../images/charts'; import { Subject } from 'rxjs'; import { IgxIconComponent } from 'igniteui-angular/icon'; -import { IgxIconButtonDirective, IgxRippleDirective, IgxDividerDirective } from 'igniteui-angular/directives'; +import { + IgxIconButtonDirective, + IgxRippleDirective, + IgxDividerComponent +} from 'igniteui-angular/directives'; import { SvgPipe } from '../../pipes/svg.pipe'; @Component({ @@ -24,7 +28,7 @@ import { SvgPipe } from '../../pipes/svg.pipe'; templateUrl: './chart-dialog.component.html', styleUrls: ['./chart-dialog.component.scss'], encapsulation: ViewEncapsulation.None, - imports: [CommonModule, IgxIconComponent, IgxIconButtonDirective, IgxRippleDirective, IgxDividerDirective, SvgPipe], + imports: [CommonModule, IgxIconComponent, IgxIconButtonDirective, IgxRippleDirective, IgxDividerComponent, SvgPipe], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class IgxChartMenuComponent implements AfterViewInit, OnDestroy { diff --git a/projects/igniteui-angular/action-strip/src/action-strip/action-strip.component.scss b/projects/igniteui-angular/action-strip/src/action-strip/action-strip.component.scss new file mode 100644 index 00000000000..dd684163cd7 --- /dev/null +++ b/projects/igniteui-angular/action-strip/src/action-strip/action-strip.component.scss @@ -0,0 +1,4 @@ +@use 'themes/base'; +@use 'themes/shared'; +@use 'themes/light'; +@use 'themes/dark'; diff --git a/projects/igniteui-angular/action-strip/src/action-strip/action-strip.component.spec.ts b/projects/igniteui-angular/action-strip/src/action-strip/action-strip.component.spec.ts index 5f17dcfc137..9f8445a4633 100644 --- a/projects/igniteui-angular/action-strip/src/action-strip/action-strip.component.spec.ts +++ b/projects/igniteui-angular/action-strip/src/action-strip/action-strip.component.spec.ts @@ -7,7 +7,7 @@ import { IgxIconComponent } from 'igniteui-angular/icon'; import { wait } from '../../../test-utils/ui-interactions.spec'; const ACTION_STRIP_CONTAINER_CSS = 'igx-action-strip__actions'; -const DROP_DOWN_LIST = 'igx-drop-down__list'; +const DROP_DOWN_LIST = 'igx-drop-down'; describe('igxActionStrip', () => { let fixture; diff --git a/projects/igniteui-angular/action-strip/src/action-strip/action-strip.component.ts b/projects/igniteui-angular/action-strip/src/action-strip/action-strip.component.ts index d56215f99d8..b039faaa42f 100644 --- a/projects/igniteui-angular/action-strip/src/action-strip/action-strip.component.ts +++ b/projects/igniteui-angular/action-strip/src/action-strip/action-strip.component.ts @@ -13,6 +13,7 @@ import { AfterViewInit, ElementRef, booleanAttribute, + ViewEncapsulation, inject, DestroyRef, AfterContentInit @@ -80,6 +81,8 @@ export class IgxActionStripMenuItemDirective { @Component({ selector: 'igx-action-strip', templateUrl: 'action-strip.component.html', + styleUrl: 'action-strip.component.css', + encapsulation: ViewEncapsulation.None, imports: [ NgTemplateOutlet, IgxIconButtonDirective, diff --git a/projects/igniteui-angular/action-strip/src/action-strip/themes/_base.scss b/projects/igniteui-angular/action-strip/src/action-strip/themes/_base.scss new file mode 100644 index 00000000000..07e1e5ee9c9 --- /dev/null +++ b/projects/igniteui-angular/action-strip/src/action-strip/themes/_base.scss @@ -0,0 +1,139 @@ +@use 'igniteui-theming/sass/bem' as *; +@use 'igniteui-theming/sass/themes' as *; +@use 'igniteui-theming/sass/typography' as *; +@use 'igniteui-theming/sass/color/functions' as *; +@use 'styles/themes/standalone' as *; +@use 'light/tokens' as *; + +$_theme: $material; + +@include layer(base) { + $icon-size: sizable(rem(14px), rem(14px), rem(18px)); + + %actions { + display: flex; + align-items: center; + justify-content: center; + } + + %menu-item { + [igxLabel] { + cursor: pointer; + } + + &.igx-drop-down__item { + igx-icon + [igxLabel] { + margin-inline-start: pad-inline(rem(8px), rem(10px), rem(12px)); + } + } + } + + @include b(igx-action-strip) { + @include sizable(); + + --action-strip-size: var(--component-size); + --button-size: #{sizable(rem(28px), rem(28px), rem(36px))}; + + display: flex; + align-items: center; + justify-content: flex-end; + position: absolute; + width: 100%; + height: 100%; + pointer-events: none; + top: 0; + inset-inline-start: 0; + background: var-get($_theme, 'background'); + color: inherit; + padding-inline: pad-inline(rem(12px), rem(16px), rem(24px)); + padding-block: 0; + z-index: 9999; + + [igxIconButton] { + --component-size: var(--action-strip-size); + + width: var(--button-size); + height: var(--button-size); + + igx-icon { + --component-size: var(--action-strip-size); + + --ig-icon-size: #{$icon-size}; + } + } + + @include e(actions) { + display: inline-flex; + align-items: center; + justify-content: center; + pointer-events: all; + position: relative; + color: var-get($_theme, 'icon-color'); + border-radius: var-get($_theme, 'actions-border-radius'); + background: var-get($_theme, 'actions-background'); + + &:last-child { + margin-inline-end: 0; + } + + igx-icon { + color: var-get($_theme, 'icon-color'); + } + + [igxIconButton] { + border-radius: var-get($_theme, 'actions-border-radius'); + + igx-icon { + color: var-get($_theme, 'icon-color'); + } + } + } + + @include e(delete) { + igx-icon { + color: var-get($_theme, 'delete-action'); + } + + [igxIconButton] { + igx-icon { + color: var-get($_theme, 'delete-action'); + } + } + } + + @include e(editing-actions) { + @extend %actions; + + > [igxButton] { + margin-inline-start: rem(4px); + + &:first-of-type { + margin-inline-start: 0; + } + } + } + + @include e(pinning-actions) { + @extend %actions; + } + + @include e(menu-item) { + @extend %menu-item; + } + + @include e(menu-item, $m: 'danger') { + @extend %menu-item; + + color: color($color: 'error'); + + &:hover { + color: color($color: 'error'); + } + } + + @include e(menu-button) { + display: flex; + align-items: center; + } + } +} diff --git a/projects/igniteui-angular/action-strip/src/action-strip/themes/dark/_index.scss b/projects/igniteui-angular/action-strip/src/action-strip/themes/dark/_index.scss new file mode 100644 index 00000000000..cefc00f9cde --- /dev/null +++ b/projects/igniteui-angular/action-strip/src/action-strip/themes/dark/_index.scss @@ -0,0 +1,6 @@ +@use 'sass:meta'; +@use 'tokens'; +@use 'styles/themes/standalone' as *; + +$tokens: meta.module-variables(tokens); +@include themes(igx-action-strip, $tokens, dark); diff --git a/projects/igniteui-angular/action-strip/src/action-strip/themes/dark/_tokens.scss b/projects/igniteui-angular/action-strip/src/action-strip/themes/dark/_tokens.scss new file mode 100644 index 00000000000..a28ec35fe65 --- /dev/null +++ b/projects/igniteui-angular/action-strip/src/action-strip/themes/dark/_tokens.scss @@ -0,0 +1,7 @@ +@use 'igniteui-theming/sass/themes' as *; +@use 'igniteui-theming/sass/themes/schemas/components/dark/action-strip' as *; + +$material: digest-schema($dark-material-action-strip); +$bootstrap: digest-schema($dark-bootstrap-action-strip); +$fluent: digest-schema($dark-fluent-action-strip); +$indigo: digest-schema($dark-indigo-action-strip); diff --git a/projects/igniteui-angular/action-strip/src/action-strip/themes/light/_index.scss b/projects/igniteui-angular/action-strip/src/action-strip/themes/light/_index.scss new file mode 100644 index 00000000000..9436c880134 --- /dev/null +++ b/projects/igniteui-angular/action-strip/src/action-strip/themes/light/_index.scss @@ -0,0 +1,6 @@ +@use 'sass:meta'; +@use 'tokens'; +@use 'styles/themes/standalone' as *; + +$tokens: meta.module-variables(tokens); +@include themes(igx-action-strip, $tokens, light); diff --git a/projects/igniteui-angular/action-strip/src/action-strip/themes/light/_tokens.scss b/projects/igniteui-angular/action-strip/src/action-strip/themes/light/_tokens.scss new file mode 100644 index 00000000000..f860918d21e --- /dev/null +++ b/projects/igniteui-angular/action-strip/src/action-strip/themes/light/_tokens.scss @@ -0,0 +1,8 @@ +@use 'igniteui-theming/sass/themes' as *; +@use 'igniteui-theming/sass/themes/schemas/components/light/action-strip' as *; + +$base: digest-schema($light-action-strip); +$material: digest-schema($material-action-strip); +$bootstrap: digest-schema($bootstrap-action-strip); +$fluent: digest-schema($fluent-action-strip); +$indigo: digest-schema($indigo-action-strip); diff --git a/projects/igniteui-angular/action-strip/src/action-strip/themes/shared/_fluent.scss b/projects/igniteui-angular/action-strip/src/action-strip/themes/shared/_fluent.scss new file mode 100644 index 00000000000..d492ac4f591 --- /dev/null +++ b/projects/igniteui-angular/action-strip/src/action-strip/themes/shared/_fluent.scss @@ -0,0 +1,10 @@ +@use 'igniteui-theming/sass/bem' as *; +@use 'igniteui-theming/sass/typography' as *; +@use 'styles/themes/standalone' as *; + +@include themed-block(igx-action-strip, fluent) { + [igxIconButton] { + --button-size: #{sizable(rem(28px), rem(28px), rem(32px))}; + } +} + \ No newline at end of file diff --git a/projects/igniteui-angular/action-strip/src/action-strip/themes/shared/_index.scss b/projects/igniteui-angular/action-strip/src/action-strip/themes/shared/_index.scss new file mode 100644 index 00000000000..7760b2e7366 --- /dev/null +++ b/projects/igniteui-angular/action-strip/src/action-strip/themes/shared/_index.scss @@ -0,0 +1 @@ +@forward 'fluent'; diff --git a/projects/igniteui-angular/avatar/src/avatar/avatar.component.scss b/projects/igniteui-angular/avatar/src/avatar/avatar.component.scss new file mode 100644 index 00000000000..dd684163cd7 --- /dev/null +++ b/projects/igniteui-angular/avatar/src/avatar/avatar.component.scss @@ -0,0 +1,4 @@ +@use 'themes/base'; +@use 'themes/shared'; +@use 'themes/light'; +@use 'themes/dark'; diff --git a/projects/igniteui-angular/avatar/src/avatar/avatar.component.ts b/projects/igniteui-angular/avatar/src/avatar/avatar.component.ts index 91ead023fea..e7d6c65a46f 100644 --- a/projects/igniteui-angular/avatar/src/avatar/avatar.component.ts +++ b/projects/igniteui-angular/avatar/src/avatar/avatar.component.ts @@ -1,5 +1,15 @@ import { NgTemplateOutlet } from '@angular/common'; -import { Component, ElementRef, HostBinding, Input, OnInit, TemplateRef, ViewChild, inject } from '@angular/core'; +import { + Component, + ElementRef, + HostBinding, + Input, + OnInit, + TemplateRef, + ViewChild, + ViewEncapsulation, + inject +} from '@angular/core'; import { normalizeURI } from 'igniteui-angular/core'; import { IgxIconComponent } from 'igniteui-angular/icon'; @@ -45,6 +55,8 @@ export type IgxAvatarType = (typeof IgxAvatarType)[keyof typeof IgxAvatarType]; @Component({ selector: 'igx-avatar', templateUrl: 'avatar.component.html', + styleUrl: 'avatar.component.css', + encapsulation: ViewEncapsulation.None, imports: [IgxIconComponent, NgTemplateOutlet] }) export class IgxAvatarComponent implements OnInit { diff --git a/projects/igniteui-angular/avatar/src/avatar/themes/_base.scss b/projects/igniteui-angular/avatar/src/avatar/themes/_base.scss new file mode 100644 index 00000000000..7e579d21bee --- /dev/null +++ b/projects/igniteui-angular/avatar/src/avatar/themes/_base.scss @@ -0,0 +1,62 @@ +@use 'igniteui-theming/sass/animations' as *; +@use 'igniteui-theming/sass/bem' as *; +@use 'igniteui-theming/sass/themes' as *; +@use 'styles/themes/standalone' as *; +@use 'light/tokens' as *; + +$theme: $material; + +@include layer(base) { + @include b(igx-avatar) { + @include sizable(); + + --component-size: var(--ig-size, #{var-get($theme, 'default-size')}); + + position: relative; + display: inline-flex; + justify-content: center; + align-items: center; + user-select: none; + color: var-get($theme, 'color'); + background: var-get($theme, 'background'); + vertical-align: middle; + outline-style: none; + flex-shrink: 0; + width: var-get($theme, 'size'); + height: var-get($theme, 'size'); + + igx-icon { + --ig-size: 3; + + color: var-get($theme, 'icon-color'); + } + + &::after { + box-shadow: none; + transition: box-shadow 0.15s $ease-in-out-quad; + } + + @include e(image) { + width: 100%; + height: 100%; + border-radius: inherit; + background-size: cover; + background-repeat: no-repeat; + background-position: center; + } + + @include m(circle) { + border-radius: calc(#{var-get($theme, 'size')} / 2); + } + + @include m(rounded) { + border-radius: var-get($theme, 'border-radius'); + } + + @include m(initials) { + text-transform: uppercase; + font-size: calc(#{var-get($theme, 'size')} / 2); + line-height: calc(#{var-get($theme, 'size')} / 2); + } + } +} diff --git a/projects/igniteui-angular/avatar/src/avatar/themes/dark/_index.scss b/projects/igniteui-angular/avatar/src/avatar/themes/dark/_index.scss new file mode 100644 index 00000000000..9dbf039674c --- /dev/null +++ b/projects/igniteui-angular/avatar/src/avatar/themes/dark/_index.scss @@ -0,0 +1,6 @@ +@use 'sass:meta'; +@use 'tokens'; +@use 'styles/themes/standalone' as *; + +$tokens: meta.module-variables(tokens); +@include themes(igx-avatar, $tokens, dark); diff --git a/projects/igniteui-angular/avatar/src/avatar/themes/dark/_tokens.scss b/projects/igniteui-angular/avatar/src/avatar/themes/dark/_tokens.scss new file mode 100644 index 00000000000..f5e829c9657 --- /dev/null +++ b/projects/igniteui-angular/avatar/src/avatar/themes/dark/_tokens.scss @@ -0,0 +1,7 @@ +@use 'igniteui-theming/sass/themes' as *; +@use 'igniteui-theming/sass/themes/schemas/components/dark/avatar' as *; + +$material: digest-schema($dark-material-avatar); +$bootstrap: digest-schema($dark-bootstrap-avatar); +$fluent: digest-schema($dark-fluent-avatar); +$indigo: digest-schema($dark-indigo-avatar); diff --git a/projects/igniteui-angular/avatar/src/avatar/themes/light/_index.scss b/projects/igniteui-angular/avatar/src/avatar/themes/light/_index.scss new file mode 100644 index 00000000000..b59827df365 --- /dev/null +++ b/projects/igniteui-angular/avatar/src/avatar/themes/light/_index.scss @@ -0,0 +1,6 @@ +@use 'sass:meta'; +@use 'tokens'; +@use 'styles/themes/standalone' as *; + +$tokens: meta.module-variables(tokens); +@include themes(igx-avatar, $tokens, light); diff --git a/projects/igniteui-angular/avatar/src/avatar/themes/light/_tokens.scss b/projects/igniteui-angular/avatar/src/avatar/themes/light/_tokens.scss new file mode 100644 index 00000000000..93ea480da81 --- /dev/null +++ b/projects/igniteui-angular/avatar/src/avatar/themes/light/_tokens.scss @@ -0,0 +1,8 @@ +@use 'igniteui-theming/sass/themes' as *; +@use 'igniteui-theming/sass/themes/schemas/components/light/avatar' as *; + +$base: digest-schema($light-avatar); +$material: digest-schema($material-avatar); +$bootstrap: digest-schema($bootstrap-avatar); +$fluent: digest-schema($fluent-avatar); +$indigo: digest-schema($indigo-avatar); diff --git a/projects/igniteui-angular/avatar/src/avatar/themes/shared/_index.scss b/projects/igniteui-angular/avatar/src/avatar/themes/shared/_index.scss new file mode 100644 index 00000000000..ca3dd3bc266 --- /dev/null +++ b/projects/igniteui-angular/avatar/src/avatar/themes/shared/_index.scss @@ -0,0 +1 @@ +@forward 'indigo'; diff --git a/projects/igniteui-angular/avatar/src/avatar/themes/shared/indigo.scss b/projects/igniteui-angular/avatar/src/avatar/themes/shared/indigo.scss new file mode 100644 index 00000000000..22a540c4089 --- /dev/null +++ b/projects/igniteui-angular/avatar/src/avatar/themes/shared/indigo.scss @@ -0,0 +1,8 @@ +@use 'igniteui-theming/sass/bem' as *; +@use 'styles/themes/standalone' as *; + +@include themed-block(igx-avatar, indigo) { + igx-icon { + --ig-size: 1; + } +} diff --git a/projects/igniteui-angular/badge/src/badge/badge.component.scss b/projects/igniteui-angular/badge/src/badge/badge.component.scss new file mode 100644 index 00000000000..dd684163cd7 --- /dev/null +++ b/projects/igniteui-angular/badge/src/badge/badge.component.scss @@ -0,0 +1,4 @@ +@use 'themes/base'; +@use 'themes/shared'; +@use 'themes/light'; +@use 'themes/dark'; diff --git a/projects/igniteui-angular/badge/src/badge/badge.component.ts b/projects/igniteui-angular/badge/src/badge/badge.component.ts index 99baa5ae77e..f15b95f80dd 100644 --- a/projects/igniteui-angular/badge/src/badge/badge.component.ts +++ b/projects/igniteui-angular/badge/src/badge/badge.component.ts @@ -1,4 +1,4 @@ -import { booleanAttribute, Component, HostBinding, Input } from '@angular/core'; +import { booleanAttribute, Component, HostBinding, Input, ViewEncapsulation } from '@angular/core'; import { IgxIconComponent } from 'igniteui-angular/icon'; let NEXT_ID = 0; @@ -38,7 +38,9 @@ export type IgxBadgeType = (typeof IgxBadgeType)[keyof typeof IgxBadgeType]; */ @Component({ selector: 'igx-badge', + styleUrl: 'badge.component.css', templateUrl: 'badge.component.html', + encapsulation: ViewEncapsulation.None, imports: [IgxIconComponent] }) export class IgxBadgeComponent { diff --git a/projects/igniteui-angular/badge/src/badge/themes/_base.scss b/projects/igniteui-angular/badge/src/badge/themes/_base.scss new file mode 100644 index 00000000000..5770d4d1cb5 --- /dev/null +++ b/projects/igniteui-angular/badge/src/badge/themes/_base.scss @@ -0,0 +1,89 @@ +@use 'igniteui-theming/sass/bem' as *; +@use 'igniteui-theming/sass/themes' as *; +@use 'igniteui-theming/sass/typography' as *; +@use 'igniteui-theming/sass/color/functions' as *; +@use 'styles/themes/standalone' as *; +@use './light/tokens' as *; + +$theme: $material; + +@include layer(base) { + @include b(igx-badge) { + @include sizable(); + + --component-size: var(--ig-size, #{var-get($theme, 'default-size')}); + --badge-size: var(--component-size); + --_badge-size: #{var-get($theme, 'size')}; + + --ig-icon-size: #{sizable(rem(12px), rem(14px), rem(16px))}; + --ig-icon-color: #{var-get($theme, 'icon-color')}; + + display: inline-flex; + justify-content: center; + align-items: center; + min-width: var(--_badge-size); + min-height: var(--_badge-size); + color: var-get($theme, 'text-color'); + background: var-get($theme, 'background-color'); + border-radius: calc(var(--size) / 2); + box-shadow: var-get($theme, 'elevation'); + overflow: hidden; + font-size: sizable(var(--ig-caption-font-size), var(--ig-body-2-font-size), var(--ig-body-2-font-size)); + font-weight: sizable(var(--ig-caption-font-weight), var(--ig-body-2-font-weight), var(--ig-body-2-font-weight)); + line-height: sizable(var(--ig-caption-line-height), var(--ig-body-2-line-height), var(--ig-body-2-line-height)); + letter-spacing: sizable(var(--ig-caption-letter-spacing), var(--ig-body-2-letter-spacing), var(--ig-body-2-letter-spacing)); + text-transform: sizable(var(--ig-caption-text-transform), var(--ig-body-2-text-transform), var(--ig-body-2-text-transform)); + + @include e(value) { + white-space: nowrap; + padding-inline: pad-inline(rem(4px), rem(6px), rem(8px)); + } + + @include m(info) { + background: color($color: 'info', $variant: 800); + } + + @include m(success) { + background: color($color: 'success', $variant: 900); + } + + @include m(warning) { + background: color($color: 'warn'); + color: contrast-color($color: 'warn', $variant: 500); + + igx-icon { + color: contrast-color($color: 'warn', $variant: 500); + } + } + + @include m(error) { + background: color($color: 'error', $variant: 700); + color: contrast-color($color: 'error', $variant: 900); + } + + @include m(outlined) { + box-shadow: 0 0 0 rem(2px) var-get($theme, 'border-color'); + } + + @include m(square) { + border-radius: var-get($theme, 'border-radius'); + } + + @include m(dot) { + --_dot-size: #{var-get($theme, 'dot-size')}; + + min-width: var(--_dot-size); + min-height: var(--_dot-size); + padding: 0; + + igx-icon, + > * { + display: none; + } + } + + @include m(hidden) { + visibility: hidden; + } + } +} diff --git a/projects/igniteui-angular/badge/src/badge/themes/dark/_index.scss b/projects/igniteui-angular/badge/src/badge/themes/dark/_index.scss new file mode 100644 index 00000000000..2b57c62473b --- /dev/null +++ b/projects/igniteui-angular/badge/src/badge/themes/dark/_index.scss @@ -0,0 +1,7 @@ +@use 'sass:meta'; +@use 'tokens'; +@use 'styles/themes/standalone' as *; +@use 'indigo'; + +$tokens: meta.module-variables(tokens); +@include themes(igx-badge, $tokens, dark); diff --git a/projects/igniteui-angular/badge/src/badge/themes/dark/_indigo.scss b/projects/igniteui-angular/badge/src/badge/themes/dark/_indigo.scss new file mode 100644 index 00000000000..1a503ba3eb4 --- /dev/null +++ b/projects/igniteui-angular/badge/src/badge/themes/dark/_indigo.scss @@ -0,0 +1,14 @@ +@use 'igniteui-theming/sass/bem' as *; +@use 'igniteui-theming/sass/color/functions' as *; +@use 'styles/themes/standalone' as *; +@use '../light/tokens' as *; + +@include themed-block(igx-badge, indigo, dark) { + @include m(warning) { + color: color($color: 'gray', $variant: 50); + + igx-icon { + color: color($color: 'gray', $variant: 50); + } + } +} diff --git a/projects/igniteui-angular/badge/src/badge/themes/dark/_tokens.scss b/projects/igniteui-angular/badge/src/badge/themes/dark/_tokens.scss new file mode 100644 index 00000000000..e97bbab4aab --- /dev/null +++ b/projects/igniteui-angular/badge/src/badge/themes/dark/_tokens.scss @@ -0,0 +1,7 @@ +@use 'igniteui-theming/sass/themes' as *; +@use 'igniteui-theming/sass/themes/schemas/components/dark/badge' as *; + +$material: digest-schema($dark-material-badge); +$bootstrap: digest-schema($dark-bootstrap-badge); +$fluent: digest-schema($dark-fluent-badge); +$indigo: digest-schema($dark-indigo-badge); diff --git a/projects/igniteui-angular/badge/src/badge/themes/light/_index.scss b/projects/igniteui-angular/badge/src/badge/themes/light/_index.scss new file mode 100644 index 00000000000..ef28e1a85ae --- /dev/null +++ b/projects/igniteui-angular/badge/src/badge/themes/light/_index.scss @@ -0,0 +1,6 @@ +@use 'sass:meta'; +@use 'tokens'; +@use 'styles/themes/standalone' as *; + +$tokens: meta.module-variables(tokens); +@include themes(igx-badge, $tokens, light); diff --git a/projects/igniteui-angular/badge/src/badge/themes/light/_tokens.scss b/projects/igniteui-angular/badge/src/badge/themes/light/_tokens.scss new file mode 100644 index 00000000000..0643448a04f --- /dev/null +++ b/projects/igniteui-angular/badge/src/badge/themes/light/_tokens.scss @@ -0,0 +1,8 @@ +@use 'igniteui-theming/sass/themes' as *; +@use 'igniteui-theming/sass/themes/schemas/components/light/badge' as *; + +$base: digest-schema($light-badge); +$material: digest-schema($material-badge); +$bootstrap: digest-schema($bootstrap-badge); +$fluent: digest-schema($fluent-badge); +$indigo: digest-schema($indigo-badge); diff --git a/projects/igniteui-angular/badge/src/badge/themes/shared/_index.scss b/projects/igniteui-angular/badge/src/badge/themes/shared/_index.scss new file mode 100644 index 00000000000..e9d8e587687 --- /dev/null +++ b/projects/igniteui-angular/badge/src/badge/themes/shared/_index.scss @@ -0,0 +1,3 @@ +@forward 'bootstrap'; +@forward 'indigo'; +@forward 'fluent'; diff --git a/projects/igniteui-angular/badge/src/badge/themes/shared/bootstrap.scss b/projects/igniteui-angular/badge/src/badge/themes/shared/bootstrap.scss new file mode 100644 index 00000000000..78fa4c0eff2 --- /dev/null +++ b/projects/igniteui-angular/badge/src/badge/themes/shared/bootstrap.scss @@ -0,0 +1,23 @@ +@use 'igniteui-theming/sass/bem' as *; +@use 'igniteui-theming/sass/typography' as *; +@use 'igniteui-theming/sass/themes/functions' as *; +@use 'igniteui-theming/sass/color/functions' as *; +@use 'styles/themes/standalone' as *; +@use '../light/tokens' as *; + +$_theme: $bootstrap; + +@include themed-block(igx-badge, bootstrap) { + @include m(success) { + background: color($color: 'success', $variant: 500); + } + + @include m(info) { + background: color($color: 'info', $variant: 500); + } + + @include m(error) { + background: color($color: 'error', $variant: 500); + color: contrast-color($color: 'error', $variant: 100); + } +} diff --git a/projects/igniteui-angular/badge/src/badge/themes/shared/fluent.scss b/projects/igniteui-angular/badge/src/badge/themes/shared/fluent.scss new file mode 100644 index 00000000000..8fc38531e2e --- /dev/null +++ b/projects/igniteui-angular/badge/src/badge/themes/shared/fluent.scss @@ -0,0 +1,22 @@ +@use 'igniteui-theming/sass/bem' as *; +@use 'igniteui-theming/sass/typography' as *; +@use 'igniteui-theming/sass/themes/functions' as *; +@use 'igniteui-theming/sass/color/functions' as *; +@use 'styles/themes/standalone' as *; +@use '../light/tokens' as *; + +$_theme: $fluent; + +@include themed-block(igx-badge, fluent) { + @include m(success) { + background: color($color: 'success', $variant: 500); + } + + @include m(info) { + background: color($color: 'info', $variant: 700); + } + + @include m(error) { + background: color($color: 'error', $variant: 500); + } +} diff --git a/projects/igniteui-angular/badge/src/badge/themes/shared/indigo.scss b/projects/igniteui-angular/badge/src/badge/themes/shared/indigo.scss new file mode 100644 index 00000000000..54db2ade96a --- /dev/null +++ b/projects/igniteui-angular/badge/src/badge/themes/shared/indigo.scss @@ -0,0 +1,39 @@ +@use 'igniteui-theming/sass/bem' as *; +@use 'igniteui-theming/sass/typography' as *; +@use 'igniteui-theming/sass/themes/functions' as *; +@use 'igniteui-theming/sass/color/functions' as *; +@use 'styles/themes/standalone' as *; +@use '../light/tokens' as *; + +@include themed-block(igx-badge, indigo) { + --ig-icon-size: #{sizable(rem(8px), rem(10px), rem(12px))}; + + @include type-style('button', false) { + font-size: sizable(rem(9px), rem(10px), var(--ig-button-font-size)); + line-height: sizable(rem(12px), rem(14px), var(--ig-button-line-height)); + } + + @include e(value) { + padding-inline: pad-inline(rem(4px), rem(6px), rem(6px)); + } + + @include m(success) { + background: color($color: 'success', $variant: 700); + } + + @include m(info) { + background: color($color: 'info', $variant: 500); + } + + @include m(error) { + background: color($color: 'error', $variant: 500); + } + + @include m(warning) { + color: color($color: 'gray', $variant: 900); + + igx-icon { + color: color($color: 'gray', $variant: 900); + } + } +} diff --git a/projects/igniteui-angular/banner/src/banner/banner.component.scss b/projects/igniteui-angular/banner/src/banner/banner.component.scss new file mode 100644 index 00000000000..dd684163cd7 --- /dev/null +++ b/projects/igniteui-angular/banner/src/banner/banner.component.scss @@ -0,0 +1,4 @@ +@use 'themes/base'; +@use 'themes/shared'; +@use 'themes/light'; +@use 'themes/dark'; diff --git a/projects/igniteui-angular/banner/src/banner/banner.component.spec.ts b/projects/igniteui-angular/banner/src/banner/banner.component.spec.ts index 0dad3dffeab..cb127d107ec 100644 --- a/projects/igniteui-angular/banner/src/banner/banner.component.spec.ts +++ b/projects/igniteui-angular/banner/src/banner/banner.component.spec.ts @@ -596,7 +596,7 @@ export class IgxBannerSampleComponent { -

Brad Stanley

+

Brad Stanley

Audi AG
diff --git a/projects/igniteui-angular/banner/src/banner/banner.component.ts b/projects/igniteui-angular/banner/src/banner/banner.component.ts index 8de0f4b6ed6..364c5ca8bc7 100644 --- a/projects/igniteui-angular/banner/src/banner/banner.component.ts +++ b/projects/igniteui-angular/banner/src/banner/banner.component.ts @@ -8,7 +8,8 @@ import { inject, Input, Output, - ViewChild + ViewChild, + ViewEncapsulation } from '@angular/core'; import { IgxIconComponent } from 'igniteui-angular/icon'; @@ -52,6 +53,8 @@ export interface BannerCancelEventArgs extends BannerEventArgs, CancelableEventA @Component({ selector: 'igx-banner', templateUrl: 'banner.component.html', + styleUrl: 'banner.component.css', + encapsulation: ViewEncapsulation.None, imports: [IgxExpansionPanelComponent, IgxExpansionPanelBodyComponent, IgxButtonDirective, IgxRippleDirective] }) export class IgxBannerComponent implements IToggleView { diff --git a/projects/igniteui-angular/banner/src/banner/themes/_base.scss b/projects/igniteui-angular/banner/src/banner/themes/_base.scss new file mode 100644 index 00000000000..86976dfc1a6 --- /dev/null +++ b/projects/igniteui-angular/banner/src/banner/themes/_base.scss @@ -0,0 +1,92 @@ +@use 'igniteui-theming/sass/animations' as *; +@use 'igniteui-theming/sass/bem' as *; +@use 'igniteui-theming/sass/themes' as *; +@use 'igniteui-theming/sass/typography' as *; +@use 'styles/themes/standalone' as *; +@use 'light/tokens' as *; + +$theme: $material; + +@include layer(base) { + %actions { + display: flex; + flex-wrap: wrap; + align-self: flex-end; + gap: rem(8px); + + > a { + display: inline-flex; + align-items: center; + } + } + + %flex-center-block { + display: flex; + align-items: center; + } + + @include b(igx-banner-host) { + igx-expansion-panel-body { + padding: 0 !important; + } + } + + @include b(igx-banner) { + @include sizable(); + --component-size: var(--ig-size, var(--ig-size-large)); + + display: flex; + justify-content: flex-end; + flex-wrap: wrap; + gap: rem(8px); + padding: rem(16px) rem(8px); + min-width: rem(320px); + background: var-get($theme, 'banner-background'); + box-shadow: inset 0 rem(-1px) 0 0 var-get($theme, 'banner-border-color'); + border-radius: var-get($theme, 'border-radius'); + + igc-icon, + igx-icon, + igc-button, + [igxButton] { + --component-size: var(--ig-size, var(--ig-size-large)); + } + + @include e(message) { + @extend %flex-center-block; + + min-width: rem(150px); + flex: 1 0 0%; + gap: rem(16px); + padding: 0 rem(8px); + } + + @include e(illustration) { + @extend %flex-center-block; + + justify-content: center; + color: var-get($theme, 'banner-illustration-color'); + } + + @include e(text) { + @include type-style(body-2) { + margin-block: 0; + } + + color: var-get($theme, 'banner-message-color'); + flex: 1 0 0%; + + > *:not(hr) { + margin-block-start: 0 !important; + } + } + + @include e(actions) { + @extend %actions; + + > igx-banner-actions { + @extend %actions; + } + } + } +} diff --git a/projects/igniteui-angular/banner/src/banner/themes/dark/_index.scss b/projects/igniteui-angular/banner/src/banner/themes/dark/_index.scss new file mode 100644 index 00000000000..77734d2b4da --- /dev/null +++ b/projects/igniteui-angular/banner/src/banner/themes/dark/_index.scss @@ -0,0 +1,6 @@ +@use 'sass:meta'; +@use 'tokens'; +@use 'styles/themes/standalone' as *; + +$tokens: meta.module-variables(tokens); +@include themes(igx-banner, $tokens, dark); diff --git a/projects/igniteui-angular/banner/src/banner/themes/dark/_tokens.scss b/projects/igniteui-angular/banner/src/banner/themes/dark/_tokens.scss new file mode 100644 index 00000000000..4115c0999b3 --- /dev/null +++ b/projects/igniteui-angular/banner/src/banner/themes/dark/_tokens.scss @@ -0,0 +1,7 @@ +@use 'igniteui-theming/sass/themes' as *; +@use 'igniteui-theming/sass/themes/schemas/components/dark/banner' as *; + +$material: digest-schema($dark-material-banner); +$bootstrap: digest-schema($dark-bootstrap-banner); +$fluent: digest-schema($dark-fluent-banner); +$indigo: digest-schema($dark-indigo-banner); diff --git a/projects/igniteui-angular/banner/src/banner/themes/light/_index.scss b/projects/igniteui-angular/banner/src/banner/themes/light/_index.scss new file mode 100644 index 00000000000..bc1fd21cac9 --- /dev/null +++ b/projects/igniteui-angular/banner/src/banner/themes/light/_index.scss @@ -0,0 +1,6 @@ +@use 'sass:meta'; +@use 'tokens'; +@use 'styles/themes/standalone' as *; + +$tokens: meta.module-variables(tokens); +@include themes(igx-banner, $tokens, light); diff --git a/projects/igniteui-angular/banner/src/banner/themes/light/_tokens.scss b/projects/igniteui-angular/banner/src/banner/themes/light/_tokens.scss new file mode 100644 index 00000000000..b11d036a277 --- /dev/null +++ b/projects/igniteui-angular/banner/src/banner/themes/light/_tokens.scss @@ -0,0 +1,8 @@ +@use 'igniteui-theming/sass/themes' as *; +@use 'igniteui-theming/sass/themes/schemas/components/light/banner' as *; + +$base: digest-schema($light-banner); +$material: digest-schema($material-banner); +$bootstrap: digest-schema($bootstrap-banner); +$fluent: digest-schema($fluent-banner); +$indigo: digest-schema($indigo-banner); diff --git a/projects/igniteui-angular/banner/src/banner/themes/shared/_fluent.scss b/projects/igniteui-angular/banner/src/banner/themes/shared/_fluent.scss new file mode 100644 index 00000000000..c8e8a5a8ea2 --- /dev/null +++ b/projects/igniteui-angular/banner/src/banner/themes/shared/_fluent.scss @@ -0,0 +1,11 @@ +@use 'igniteui-theming/sass/bem' as *; +@use 'igniteui-theming/sass/typography' as *; +@use 'styles/themes/standalone' as *; + +@include themed-block(igx-banner, fluent) { + @include e(text) { + @include type-style(caption) { + margin-block: 0; + } + } +} diff --git a/projects/igniteui-angular/banner/src/banner/themes/shared/_index.scss b/projects/igniteui-angular/banner/src/banner/themes/shared/_index.scss new file mode 100644 index 00000000000..c0b99f867cc --- /dev/null +++ b/projects/igniteui-angular/banner/src/banner/themes/shared/_index.scss @@ -0,0 +1,2 @@ +@forward 'indigo'; +@forward 'fluent'; diff --git a/projects/igniteui-angular/banner/src/banner/themes/shared/_indigo.scss b/projects/igniteui-angular/banner/src/banner/themes/shared/_indigo.scss new file mode 100644 index 00000000000..82c6f94d409 --- /dev/null +++ b/projects/igniteui-angular/banner/src/banner/themes/shared/_indigo.scss @@ -0,0 +1,23 @@ +@use 'igniteui-theming/sass/bem' as *; +@use 'igniteui-theming/sass/typography' as *; +@use 'styles/themes/standalone' as *; +@use '../light/tokens' as *; + +$theme: $indigo; + +@include themed-block(igx-banner, indigo) { + box-shadow: inset 0 0 0 rem(1px) var-get($theme, 'banner-border-color'); + padding: rem(16px); + + igc-icon, + igx-icon, + igc-button, + [igxButton] { + --component-size: var(--ig-size, var(--ig-size-medium)); + } + + @include e(message) { + gap: rem(8px); + padding: initial; + } +} diff --git a/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav-content.component.ts b/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav-content.component.ts index f9d9a3241cd..3630b2fe5c9 100644 --- a/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav-content.component.ts +++ b/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav-content.component.ts @@ -1,9 +1,10 @@ -import { Component, HostBinding } from '@angular/core'; +import { Component, HostBinding, ViewEncapsulation } from '@angular/core'; import { IgxTabContentBase, IgxTabContentDirective } from 'igniteui-angular/tabs'; @Component({ selector: 'igx-bottom-nav-content', templateUrl: 'bottom-nav-content.component.html', + encapsulation: ViewEncapsulation.None, providers: [{ provide: IgxTabContentBase, useExisting: IgxBottomNavContentComponent }], imports: [] }) diff --git a/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav-header.component.ts b/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav-header.component.ts index 6a043964b57..0c8da59914a 100644 --- a/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav-header.component.ts +++ b/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav-header.component.ts @@ -1,9 +1,10 @@ -import { Component, HostBinding } from '@angular/core'; +import { Component, HostBinding, ViewEncapsulation } from '@angular/core'; import { IgxTabHeaderBase, IgxTabHeaderDirective } from 'igniteui-angular/tabs'; @Component({ selector: 'igx-bottom-nav-header', templateUrl: 'bottom-nav-header.component.html', + encapsulation: ViewEncapsulation.None, providers: [{ provide: IgxTabHeaderBase, useExisting: IgxBottomNavHeaderComponent }], standalone: true }) @@ -23,7 +24,5 @@ export class IgxBottomNavHeaderComponent extends IgxTabHeaderDirective { /** @hidden */ @HostBinding('class.igx-bottom-nav__menu-item') - public get cssClass(): boolean { - return (!this.tab.disabled && !this.tab.selected); - } + public readonly cssClass = 'igx-bottom-nav__menu-item'; } diff --git a/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav-item.component.ts b/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav-item.component.ts index 51c62ddc373..45d7d913ee4 100644 --- a/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav-item.component.ts +++ b/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav-item.component.ts @@ -1,9 +1,10 @@ -import { Component } from '@angular/core'; +import { Component, ViewEncapsulation } from '@angular/core'; import { IgxTabItemDirective } from 'igniteui-angular/tabs'; @Component({ selector: 'igx-bottom-nav-item', templateUrl: 'bottom-nav-item.component.html', + encapsulation: ViewEncapsulation.None, providers: [{ provide: IgxTabItemDirective, useExisting: IgxBottomNavItemComponent }], standalone: true }) diff --git a/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav.component.scss b/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav.component.scss new file mode 100644 index 00000000000..dd684163cd7 --- /dev/null +++ b/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav.component.scss @@ -0,0 +1,4 @@ +@use 'themes/base'; +@use 'themes/shared'; +@use 'themes/light'; +@use 'themes/dark'; diff --git a/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav.component.ts b/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav.component.ts index 90de22cd5a7..62738d03249 100644 --- a/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav.component.ts +++ b/projects/igniteui-angular/bottom-nav/src/bottom-nav/bottom-nav.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, HostBinding, ViewEncapsulation } from '@angular/core'; import { NgTemplateOutlet } from '@angular/common'; import { IgxTabsBase, IgxTabsDirective } from 'igniteui-angular/tabs'; @@ -40,15 +40,22 @@ let NEXT_BOTTOM_NAV_ITEM_ID = 0; @Component({ selector: 'igx-bottom-nav', templateUrl: 'bottom-nav.component.html', + styleUrl: 'bottom-nav.component.css', + encapsulation: ViewEncapsulation.None, providers: [{ provide: IgxTabsBase, useExisting: IgxBottomNavComponent }], imports: [NgTemplateOutlet] }) export class IgxBottomNavComponent extends IgxTabsDirective { /** @hidden */ public override disableAnimation = true; + /** @hidden */ protected override componentName = 'igx-bottom-nav'; + /** @hidden @internal */ + @HostBinding('class.igx-bottom-nav') + public readonly hostClass = 'igx-bottom-nav'; + /** @hidden */ protected getNextTabId() { return NEXT_BOTTOM_NAV_ITEM_ID++; diff --git a/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/_base.scss b/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/_base.scss new file mode 100644 index 00000000000..7785c810a31 --- /dev/null +++ b/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/_base.scss @@ -0,0 +1,132 @@ +@use 'igniteui-theming/sass/animations' as *; +@use 'igniteui-theming/sass/bem' as *; +@use 'igniteui-theming/sass/typography' as *; +@use 'igniteui-theming/sass/themes' as *; +@use 'styles/themes/standalone' as *; +@use 'light/tokens' as *; + +$theme: $material; + +@include layer(base) { + @include b(igx-bottom-nav) { + @include e(panel) { + display: block; + + &:focus { + outline-style: none; + } + + &:empty { + display: none; + } + } + + @include e(menu) { + display: flex; + position: fixed; + justify-content: center; + align-items: center; + inset-inline-start: 0; + inset-inline-end: 0; + height: rem(56px); + background: var-get($theme, 'background'); + border-top: rem(1px) solid var-get($theme, 'border-color'); + overflow: hidden; + z-index: 8; + } + + @include e(menu, $m: top) { + inset-block-start: 0; + inset-block-end: inherit; + box-shadow: var-get($theme, 'elevation'); + } + + @include e(menu, $m: bottom) { + inset-block-start: inherit; + inset-block-end: 0; + box-shadow: var-get($theme, 'elevation'); + } + + @include e(menu-item) { + display: flex; + position: relative; + flex-flow: column nowrap; + flex: 1; + gap: rem(4px); + align-items: center; + justify-content: center; + min-width: rem(80px); + max-width: rem(168px); + height: 100%; + cursor: pointer; + user-select: none; + overflow: hidden; + padding: 0 rem(12px, 16px); + -webkit-tap-highlight-color: transparent; + outline-style: none; + color: var-get($theme, 'label-color'); + + igx-icon { + --component-size: 3; + } + + [igxBottomNavHeaderIcon] { + display: flex; + position: relative; + justify-content: center; + color: var-get($theme, 'icon-color'); + padding: 0 rem(8px); + height: rem(24px); + transform: translateZ(0); + transition: transform 0.15s $ease-in-out-quad; + z-index: 1; + } + + [igxBottomNavHeaderLabel] { + @include type-style(caption) { + margin: 0; + } + + @include ellipsis(); + + color: var-get($theme, 'label-color'); + max-width: 100%; + text-align: center; + transform: translateZ(0); + transition: transform 0.15s $ease-in-out-quad; + z-index: 1; + } + } + + @include e(menu-item, $m: selected) { + transition: + color 0.15s $ease-in-out-quad, + opacity 0.25s $ease-in-out-quad; + + [igxBottomNavHeaderIcon] { + color: var-get($theme, 'icon-selected-color'); + inset-block-start: rem(-2px); + transform: translateY(-2px); + } + + [igxBottomNavHeaderLabel] { + color: var-get($theme, 'label-selected-color'); + transform: translateY(-2px) scale(1.166667); + } + } + + @include e(menu-item, $m: disabled) { + cursor: default; + pointer-events: none; + opacity: 0.5; + + [igxBottomNavHeaderIcon] { + color: var-get($theme, 'icon-disabled-color'); + } + + [igxBottomNavHeaderLabel] { + color: var-get($theme, 'label-disabled-color'); + } + } + } +} diff --git a/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/dark/_index.scss b/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/dark/_index.scss new file mode 100644 index 00000000000..3d008e60802 --- /dev/null +++ b/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/dark/_index.scss @@ -0,0 +1,6 @@ +@use 'sass:meta'; +@use 'tokens'; +@use 'styles/themes/standalone' as *; + +$tokens: meta.module-variables(tokens); +@include themes(igx-bottom-nav, $tokens, dark); diff --git a/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/dark/_tokens.scss b/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/dark/_tokens.scss new file mode 100644 index 00000000000..dd092c3bb75 --- /dev/null +++ b/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/dark/_tokens.scss @@ -0,0 +1,7 @@ +@use 'igniteui-theming/sass/themes' as *; +@use 'igniteui-theming/sass/themes/schemas/components/dark/bottom-nav' as *; + +$material: digest-schema($dark-material-bottom-nav); +$bootstrap: digest-schema($dark-bootstrap-bottom-nav); +$fluent: digest-schema($dark-fluent-bottom-nav); +$indigo: digest-schema($dark-indigo-bottom-nav); diff --git a/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/light/_index.scss b/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/light/_index.scss new file mode 100644 index 00000000000..da394dea2be --- /dev/null +++ b/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/light/_index.scss @@ -0,0 +1,6 @@ +@use 'sass:meta'; +@use 'tokens'; +@use 'styles/themes/standalone' as *; + +$tokens: meta.module-variables(tokens); +@include themes(igx-bottom-nav, $tokens, light); diff --git a/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/light/_tokens.scss b/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/light/_tokens.scss new file mode 100644 index 00000000000..a6c88b0bbe6 --- /dev/null +++ b/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/light/_tokens.scss @@ -0,0 +1,8 @@ +@use 'igniteui-theming/sass/themes' as *; +@use 'igniteui-theming/sass/themes/schemas/components/light/bottom-nav' as *; + +$base: digest-schema($light-bottom-nav); +$material: digest-schema($material-bottom-nav); +$bootstrap: digest-schema($bootstrap-bottom-nav); +$fluent: digest-schema($fluent-bottom-nav); +$indigo: digest-schema($indigo-bottom-nav); diff --git a/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/shared/_index.scss b/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/shared/_index.scss new file mode 100644 index 00000000000..ca3dd3bc266 --- /dev/null +++ b/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/shared/_index.scss @@ -0,0 +1 @@ +@forward 'indigo'; diff --git a/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/shared/_indigo.scss b/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/shared/_indigo.scss new file mode 100644 index 00000000000..8994664f911 --- /dev/null +++ b/projects/igniteui-angular/bottom-nav/src/bottom-nav/themes/shared/_indigo.scss @@ -0,0 +1,26 @@ +@use 'igniteui-theming/sass/typography' as *; +@use 'igniteui-theming/sass/bem' as *; +@use 'styles/themes/standalone' as *; + +@include themed-block(igx-bottom-nav, indigo) { + @include e(menu-item) { + igx-icon { + --size: #{rem(16px)}; + } + + [igxBottomNavHeaderIcon], + [igxBottomNavHeaderLabel] { + transform: unset; + transition: none; + } + + [igxBottomNavHeaderIcon] { + padding: unset; + height: auto; + } + } + + @include e(menu-item, $m: disabled) { + opacity: unset; + } +} diff --git a/projects/igniteui-angular/button-group/src/button-group/button-group-content.component.html b/projects/igniteui-angular/button-group/src/button-group/button-group-content.component.html index 58f674c856a..0c69724b6cd 100644 --- a/projects/igniteui-angular/button-group/src/button-group/button-group-content.component.html +++ b/projects/igniteui-angular/button-group/src/button-group/button-group-content.component.html @@ -1,23 +1,21 @@ -
- @for (button of values; track button) { - - } - -
+@for (button of values; track button) { + +} + diff --git a/projects/igniteui-angular/button-group/src/button-group/button-group.component.ts b/projects/igniteui-angular/button-group/src/button-group/button-group.component.ts index f11590b12c7..ed15c000c91 100644 --- a/projects/igniteui-angular/button-group/src/button-group/button-group.component.ts +++ b/projects/igniteui-angular/button-group/src/button-group/button-group.component.ts @@ -1,4 +1,21 @@ -import { AfterViewInit, Component, ContentChildren, ChangeDetectorRef, EventEmitter, HostBinding, Input, Output, QueryList, Renderer2, ViewChildren, OnDestroy, ElementRef, booleanAttribute, inject } from '@angular/core'; +import { + AfterViewInit, + Component, + ContentChildren, + ChangeDetectorRef, + EventEmitter, + HostBinding, + Input, + Output, + QueryList, + Renderer2, + ViewChildren, + OnDestroy, + ElementRef, + booleanAttribute, + ViewEncapsulation, + inject +} from '@angular/core'; import { Subject } from 'rxjs'; import { IgxButtonDirective } from 'igniteui-angular/directives'; import { IgxRippleDirective } from 'igniteui-angular/directives'; @@ -41,6 +58,8 @@ let NEXT_ID = 0; @Component({ selector: 'igx-buttongroup', templateUrl: 'button-group-content.component.html', + styleUrl: 'buttongroup-content.component.css', + encapsulation: ViewEncapsulation.None, imports: [IgxButtonDirective, IgxRippleDirective, IgxIconComponent] }) export class IgxButtonGroupComponent implements AfterViewInit, OnDestroy { @@ -65,12 +84,32 @@ export class IgxButtonGroupComponent implements AfterViewInit, OnDestroy { @Input() public id = `igx-buttongroup-${NEXT_ID++}`; + /** @hidden @internal */ + @HostBinding('class.igx-button-group') + public cssClass = 'igx-button-group'; + + /** @hidden @internal */ + /** * @hidden */ @HostBinding('style.zIndex') public zIndex = 0; + /** + * Sets/gets the role attribute value. + * + * @example + * ```typescript + * @ViewChild("MyButtonGroup", { read: IgxButtonGroupComponent }) + * public badge: IgxButtonGroupComponent; + * + * buttonGroup.role = 'group'; + * ``` + */ + @HostBinding('attr.role') + public role = 'group'; + /** * Allows you to set a style using the `itemContentCssClass` input. * The value should be the CSS class name that will be applied to the button group. @@ -274,6 +313,7 @@ export class IgxButtonGroupComponent implements AfterViewInit, OnDestroy { * } * ``` */ + @HostBinding('class.igx-button-group--vertical') public get isVertical(): boolean { return this._isVertical; } diff --git a/projects/igniteui-angular/button-group/src/button-group/buttongroup-content.component.scss b/projects/igniteui-angular/button-group/src/button-group/buttongroup-content.component.scss new file mode 100644 index 00000000000..dd684163cd7 --- /dev/null +++ b/projects/igniteui-angular/button-group/src/button-group/buttongroup-content.component.scss @@ -0,0 +1,4 @@ +@use 'themes/base'; +@use 'themes/shared'; +@use 'themes/light'; +@use 'themes/dark'; diff --git a/projects/igniteui-angular/button-group/src/button-group/themes/_base.scss b/projects/igniteui-angular/button-group/src/button-group/themes/_base.scss new file mode 100644 index 00000000000..9188dcf005d --- /dev/null +++ b/projects/igniteui-angular/button-group/src/button-group/themes/_base.scss @@ -0,0 +1,223 @@ +@use 'igniteui-theming/sass/bem' as *; +@use 'igniteui-theming/sass/themes' as *; +@use 'igniteui-theming/sass/typography' as *; +@use 'styles/themes/standalone' as *; +@use './light/tokens' as *; + +$_theme: $material; + +@include layer(base) { + @include b(igx-button-group) { + --item-min-width: #{rem(42px)}; + --ig-icon-size: #{rem(18px)}; + + display: flex; + box-shadow: var-get($_theme, 'elevation'); + border-radius: var-get($_theme, 'border-radius'); + + button { + // The margin here is required to fix a bug in Safari #7858 + margin-top: 0; + margin-inline-end: 0; + margin-bottom: 0; + } + + @include e(item) { + @include type-style(button) { + text-align: center; + } + + border: rem(1px) solid var-get($_theme, 'item-border-color'); + color: var-get($_theme, 'item-text-color'); + background: var-get($_theme, 'item-background'); + min-width: var(--item-min-width); + display: flex; + flex: 1 0 0%; + justify-content: center; + align-items: center; + text-decoration: none; + cursor: pointer; + user-select: none; + position: relative; + z-index: 0; + + igx-icon { + color: var-get($_theme, 'item-icon-color'); + } + + &:hover { + color: var-get($_theme, 'item-hover-text-color'); + background: var-get($_theme, 'item-hover-background'); + border-color: var-get($_theme, 'item-hover-border-color'); + + igx-icon { + color: var-get($_theme, 'item-hover-icon-color'); + } + } + + &:active { + color: var-get($_theme, 'item-hover-text-color'); + background: var-get($_theme, 'item-hover-background'); + border-color: var-get($_theme, 'item-hover-border-color'); + + igx-icon { + color: var-get($_theme, 'item-hover-icon-color'); + } + } + + &[igxButton] { + border-radius: 0; + } + + &[igxButton][disabled='true'] { + color: var-get($_theme, 'disabled-text-color'); + background: var-get($_theme, 'disabled-background-color'); + border-color: var-get($_theme, 'item-disabled-border'); + + igx-icon { + color: var-get($_theme, 'disabled-text-color'); + } + } + + &[igxButton].igx-button--focused { + color: var-get($_theme, 'item-hover-text-color'); + background: var-get($_theme, 'item-hover-background'); + border-color: var-get($_theme, 'item-hover-border-color'); + + igx-icon { + color: var-get($_theme, 'item-hover-icon-color'); + } + + &:hover { + color: var-get($_theme, 'item-hover-text-color'); + background: var-get($_theme, 'item-hover-background'); + + igx-icon { + color: var-get($_theme, 'item-hover-icon-color'); + } + } + } + + &:not(:nth-child(1)) { + margin-inline-start: rem(-1px); + } + + &:first-of-type { + border-start-start-radius: inherit; + border-end-start-radius: inherit; + } + + &:last-of-type { + border-start-end-radius: inherit; + border-end-end-radius: inherit; + } + } + + @include e(item, $m: selected) { + color: var-get($_theme, 'item-selected-text-color'); + background: var-get($_theme, 'item-selected-background'); + border-color: var-get($_theme, 'item-selected-border-color'); + position: relative; + z-index: 1; + + &[igxButton] { + border-color: var-get($_theme, 'item-selected-border-color'); + } + + igx-icon { + color: var-get($_theme, 'item-selected-icon-color'); + } + + &:hover { + border-color: var-get($_theme, 'item-selected-hover-border-color'); + color: var-get($_theme, 'item-selected-hover-text-color'); + background: var-get($_theme, 'item-selected-hover-background'); + + igx-icon { + color: var-get($_theme, 'item-selected-hover-icon-color'); + } + } + + &[igxButton].igx-button--focused { + &:hover { + color: var-get($_theme, 'item-selected-hover-text-color'); + background: var-get($_theme, 'item-selected-hover-background'); + border-color: var-get($_theme, 'item-selected-hover-border-color'); + } + + &:active { + background: var-get($_theme, 'item-selected-hover-background'); + color: var-get($_theme, 'item-selected-hover-text-color'); + + &::before { + background: var-get($_theme, 'item-selected-focus-background'); + } + + igx-icon { + color: var-get($_theme, 'item-selected-hover-icon-color'); + } + } + } + + &[igxButton][disabled='true'] { + position: relative; + + &::before { + position: absolute; + content: ''; + top: 0; + bottom: 0; + inset-inline-end: 0; + inset-inline-start: 0; + background: var-get($_theme, 'disabled-selected-background'); + } + } + } + + @include e(item-content) { + display: flex; + align-items: center; + flex-flow: row nowrap; + min-width: 0; + + * ~ * { + margin-inline-start: rem(10px, 16px); + } + } + + @include e(button-text) { + @include ellipsis(); + + width: 100%; + } + + @include m(vertical) { + flex-flow: column; + + @include e(item) { + // in case the display of the group is set to inline-block and the group hase a width, + // the items need to have width 100% to fill the group container + width: 100%; + + &:not(:nth-child(1)) { + margin-top: rem(-1px) !important; + margin-inline-start: 0; + } + + &:first-of-type { + border-start-start-radius: inherit; + border-start-end-radius: inherit; + border-end-start-radius: 0; + border-end-end-radius: 0; + } + + &:last-of-type { + border-start-start-radius: 0; + border-start-end-radius: 0; + border-end-start-radius: inherit; + border-end-end-radius: inherit; + } + } + } + } +} diff --git a/projects/igniteui-angular/button-group/src/button-group/themes/dark/_index.scss b/projects/igniteui-angular/button-group/src/button-group/themes/dark/_index.scss new file mode 100644 index 00000000000..12286543b37 --- /dev/null +++ b/projects/igniteui-angular/button-group/src/button-group/themes/dark/_index.scss @@ -0,0 +1,6 @@ +@use 'sass:meta'; +@use 'tokens'; +@use 'styles/themes/standalone' as *; + +$tokens: meta.module-variables(tokens); +@include themes(igx-button-group, $tokens, dark); diff --git a/projects/igniteui-angular/button-group/src/button-group/themes/dark/_tokens.scss b/projects/igniteui-angular/button-group/src/button-group/themes/dark/_tokens.scss new file mode 100644 index 00000000000..9d1dad4dd22 --- /dev/null +++ b/projects/igniteui-angular/button-group/src/button-group/themes/dark/_tokens.scss @@ -0,0 +1,7 @@ +@use 'igniteui-theming/sass/themes' as *; +@use 'igniteui-theming/sass/themes/schemas/components/dark/button-group' as *; + +$material: digest-schema($dark-material-button-group); +$bootstrap: digest-schema($dark-bootstrap-button-group); +$fluent: digest-schema($dark-fluent-button-group); +$indigo: digest-schema($dark-indigo-button-group); diff --git a/projects/igniteui-angular/button-group/src/button-group/themes/light/_index.scss b/projects/igniteui-angular/button-group/src/button-group/themes/light/_index.scss new file mode 100644 index 00000000000..291f5c86ffb --- /dev/null +++ b/projects/igniteui-angular/button-group/src/button-group/themes/light/_index.scss @@ -0,0 +1,6 @@ +@use 'sass:meta'; +@use 'tokens'; +@use 'styles/themes/standalone' as *; + +$tokens: meta.module-variables(tokens); +@include themes(igx-button-group, $tokens, light); diff --git a/projects/igniteui-angular/button-group/src/button-group/themes/light/_tokens.scss b/projects/igniteui-angular/button-group/src/button-group/themes/light/_tokens.scss new file mode 100644 index 00000000000..255ef4315ea --- /dev/null +++ b/projects/igniteui-angular/button-group/src/button-group/themes/light/_tokens.scss @@ -0,0 +1,8 @@ +@use 'igniteui-theming/sass/themes' as *; +@use 'igniteui-theming/sass/themes/schemas/components/light/button-group' as *; + +$base: digest-schema($light-button-group); +$material: digest-schema($material-button-group); +$bootstrap: digest-schema($bootstrap-button-group); +$fluent: digest-schema($fluent-button-group); +$indigo: digest-schema($indigo-button-group); diff --git a/projects/igniteui-angular/button-group/src/button-group/themes/shared/_bootstrap.scss b/projects/igniteui-angular/button-group/src/button-group/themes/shared/_bootstrap.scss new file mode 100644 index 00000000000..01857d260e3 --- /dev/null +++ b/projects/igniteui-angular/button-group/src/button-group/themes/shared/_bootstrap.scss @@ -0,0 +1,76 @@ +@use 'igniteui-theming/sass/typography' as *; +@use 'igniteui-theming/sass/bem' as *; +@use 'styles/themes/standalone' as *; +@use '../light/tokens' as *; + +$_theme: $bootstrap; + +@include themed-block(igx-button-group, bootstrap) { + %item-overlay { + &::before { + content: ''; + z-index: -1; + position: absolute; + pointer-events: none; + width: 100%; + height: 100%; + background: var-get($_theme, 'item-focused-background'); + } + } + + @include e(item) { + &:active { + @extend %item-overlay; + } + + &[igxButton].igx-button--focused { + background: var-get($_theme, 'item-background'); + z-index: 1; + + &:hover, + &:active { + background: var-get($_theme, 'item-hover-background'); + color: var-get($_theme, 'item-hover-text-color'); + + igx-icon { + color: var-get($_theme, 'item-hover-icon-color'); + } + } + } + } + + @include e(item, $m: selected) { + &:active { + @extend %item-overlay; + + color: var-get($_theme, 'item-selected-text-color'); + border-color: var-get($_theme, 'item-selected-border-color'); + background: var-get($_theme, 'item-selected-hover-background'); + + &::before { + background: var-get($_theme, 'item-selected-focus-background'); + } + } + + &[igxButton].igx-button--focused { + color: var-get($_theme, 'item-selected-text-color'); + border-color: var-get($_theme, 'item-selected-border-color'); + background: var-get($_theme, 'item-selected-background'); + + igx-icon { + color: var-get($_theme, 'item-selected-icon-color'); + } + + &:hover, + &:active { + background: var-get($_theme, 'item-selected-hover-background'); + color: var-get($_theme, 'item-selected-hover-text-color'); + border-color: var-get($_theme, 'item-selected-hover-border-color'); + + igx-icon { + color: var-get($_theme, 'item-selected-hover-icon-color'); + } + } + } + } +} diff --git a/projects/igniteui-angular/button-group/src/button-group/themes/shared/_fluent.scss b/projects/igniteui-angular/button-group/src/button-group/themes/shared/_fluent.scss new file mode 100644 index 00000000000..1edff571c00 --- /dev/null +++ b/projects/igniteui-angular/button-group/src/button-group/themes/shared/_fluent.scss @@ -0,0 +1,126 @@ +@use 'igniteui-theming/sass/typography' as *; +@use 'igniteui-theming/sass/bem' as *; +@use 'styles/themes/standalone' as *; +@use '../light/tokens' as *; + +$_theme: $fluent; + +@include themed-block(igx-button-group, fluent) { + $outline-btn-indent: rem(2px); + + %item-overlay { + &::before { + content: ''; + z-index: -1; + position: absolute; + pointer-events: none; + width: 100%; + height: 100%; + } + } + + @include e(item) { + igx-icon { + color: var-get($_theme, 'item-icon-color'); + $icon-size: rem(18px); + + --ig-icon-size: #{$icon-size}; + } + + &:active { + background: var-get($_theme, 'item-focused-background'); + color: var-get($_theme, 'item-text-color'); + border-color: var-get($_theme, 'item-border-color'); + } + + &[igxButton].igx-button--focused { + background: var-get($_theme, 'item-background'); + color: var-get($_theme, 'item-text-color'); + border-color: var-get($_theme, 'item-border-color'); + + igx-icon { + color: var-get($_theme, 'item-icon-color'); + } + + &::after { + content: ''; + position: absolute; + inset-block-start: $outline-btn-indent; + inset-inline-start: $outline-btn-indent; + pointer-events: none; + width: calc(100% - (#{$outline-btn-indent} * 2)); + height: calc(100% - (#{$outline-btn-indent} * 2)); + box-shadow: 0 0 0 rem(1px) var-get($_theme, 'item-focused-border-color'); + } + + &:hover { + color: var-get($_theme, 'item-hover-text-color'); + background: var-get($_theme, 'item-hover-background'); + + igx-icon { + color: var-get($_theme, 'item-hover-icon-color'); + } + } + + &:active { + background: var-get($_theme, 'item-focused-background'); + } + } + + &[igxButton][disabled='true'] { + igx-icon { + color: var-get($_theme, 'disabled-text-color'); + } + } + } + + @include e(item, $m: selected) { + &:hover { + @extend %item-overlay; + + background: var-get($_theme, 'item-selected-background'); + color: var-get($_theme, 'item-selected-text-color'); + + &::before { + background: var-get($_theme, 'item-selected-hover-background'); + } + } + + &:active { + background: var-get($_theme, 'item-selected-focus-background'); + color: var-get($_theme, 'item-selected-text-color'); + + igx-icon { + color: var-get($_theme, 'item-selected-icon-color'); + } + } + + &[igxButton].igx-button--focused { + background: var-get($_theme, 'item-selected-background'); + color: var-get($_theme, 'item-selected-text-color'); + + igx-icon { + color: var-get($_theme, 'item-selected-icon-color'); + } + + &:hover { + @extend %item-overlay; + + background: var-get($_theme, 'item-selected-background'); + color: var-get($_theme, 'item-selected-text-color'); + + igx-icon { + color: var-get($_theme, 'item-selected-hover-icon-color'); + } + + &::before { + background: var-get($_theme, 'item-selected-focus-hover-background'); + } + } + + &:active { + background: var-get($_theme, 'item-selected-focus-background'); + } + } + } +} diff --git a/projects/igniteui-angular/button-group/src/button-group/themes/shared/_index.scss b/projects/igniteui-angular/button-group/src/button-group/themes/shared/_index.scss new file mode 100644 index 00000000000..097687c32b5 --- /dev/null +++ b/projects/igniteui-angular/button-group/src/button-group/themes/shared/_index.scss @@ -0,0 +1,4 @@ +@forward 'material'; +@forward 'bootstrap'; +@forward 'fluent'; +@forward 'indigo'; \ No newline at end of file diff --git a/projects/igniteui-angular/button-group/src/button-group/themes/shared/_indigo.scss b/projects/igniteui-angular/button-group/src/button-group/themes/shared/_indigo.scss new file mode 100644 index 00000000000..cc87330fd0d --- /dev/null +++ b/projects/igniteui-angular/button-group/src/button-group/themes/shared/_indigo.scss @@ -0,0 +1,108 @@ +@use 'igniteui-theming/sass/typography' as *; +@use 'igniteui-theming/sass/bem' as *; +@use 'styles/themes/standalone' as *; +@use '../light/tokens' as *; + +$_theme: $indigo; + +@include themed-block(igx-button-group, indigo) { + --item-min-width: rem(32px); + + %hover { + border-color: var-get($_theme, 'item-hover-border-color'); + color: var-get($_theme, 'item-hover-text-color'); + background: var-get($_theme, 'item-hover-background'); + + igx-icon { + color: var-get($_theme, 'item-hover-icon-color'); + } + } + + %hover-selected { + background: var-get($_theme, 'item-selected-hover-background'); + color: var-get($_theme, 'item-selected-hover-text-color'); + border-color: var-get($_theme, 'item-selected-hover-border-color'); + + igx-icon { + color: var-get($_theme, 'item-selected-hover-icon-color'); + } + } + + @include e(item) { + @include type-style(body-2); + + padding-inline: pad-inline(rem(6px), rem(8px), rem(10px)); + + igx-icon { + $icon-size: rem(16px); + + --ig-icon-size: #{$icon-size}; + } + + &:hover { + @extend %hover; + + z-index: 1; + } + + &:active { + @extend %hover; + + z-index: 2; + } + + &[igxButton].igx-button--focused { + color: var-get($_theme, 'item-focused-text-color'); + background: var-get($_theme, 'item-focused-background'); + border-color: var-get($_theme, 'item-focused-border-color'); + box-shadow: 0 0 0 rem(3px) var-get($_theme, 'idle-shadow-color'); + z-index: 2; + + igx-icon { + color: var-get($_theme, 'item-icon-color'); + } + + &:hover, + &:active { + @extend %hover; + } + } + } + + @include e(item, $m: selected) { + &:hover, + &:active { + @extend %hover-selected; + } + + &[igxButton].igx-button--focused { + box-shadow: 0 0 0 rem(3px) var-get($_theme, 'selected-shadow-color'); + border-color: var-get($_theme, 'item-selected-border-color'); + background: var-get($_theme, 'item-selected-background'); + color: var-get($_theme, 'item-selected-text-color'); + + igx-icon { + color: var-get($_theme, 'item-selected-icon-color'); + } + + &:hover, + &:active { + @extend %hover-selected; + } + } + + &[igxButton][disabled='true'] { + color: var-get($_theme, 'disabled-selected-text-color'); + background: var-get($_theme, 'disabled-selected-background'); + border: none; + + igx-icon { + color: var-get($_theme, 'disabled-selected-icon-color'); + } + + &::before { + display: none; + } + } + } +} diff --git a/projects/igniteui-angular/button-group/src/button-group/themes/shared/_material.scss b/projects/igniteui-angular/button-group/src/button-group/themes/shared/_material.scss new file mode 100644 index 00000000000..ea32c2dd14a --- /dev/null +++ b/projects/igniteui-angular/button-group/src/button-group/themes/shared/_material.scss @@ -0,0 +1,130 @@ +@use 'igniteui-theming/sass/typography' as *; +@use 'igniteui-theming/sass/bem' as *; +@use 'styles/themes/standalone' as *; +@use '../light/tokens' as *; + +$_theme: $material; + +@include themed-block(igx-button-group, material) { + %item-overlay { + &::before { + content: ''; + z-index: -1; + position: absolute; + pointer-events: none; + width: 100%; + height: 100%; + } + } + + @include e(item) { + &:hover, + &:active { + @extend %item-overlay; + + background: var-get($_theme, 'item-background'); + } + + &:hover { + &::before { + background: var-get($_theme, 'item-hover-background'); + } + } + + &[igxButton].igx-button--focused { + @extend %item-overlay; + + background: var-get($_theme, 'item-background'); + + &::before { + background: var-get($_theme, 'item-hover-background'); + } + + &:hover { + background: var-get($_theme, 'item-background'); + + &::before { + background: var-get($_theme, 'item-focused-hover-background'); + } + } + + &:active { + background: var-get($_theme, 'item-background'); + color: var-get($_theme, 'item-hover-text-color'); + + igx-icon { + color: var-get($_theme, 'item-hover-icon-color'); + } + + &::before { + background: var-get($_theme, 'item-focused-background'); + } + } + } + } + + @include e(item, $m: selected) { + &:hover { + @extend %item-overlay; + + background: var-get($_theme, 'item-selected-background'); + + &::before { + background: var-get($_theme, 'item-selected-hover-background'); + } + } + + &:active { + @extend %item-overlay; + + color: var-get($_theme, 'item-selected-hover-text-color'); + background: var-get($_theme, 'item-selected-background'); + border-color: var-get($_theme, 'item-selected-border-color'); + + igx-icon { + color: var-get($_theme, 'item-selected-hover-icon-color'); + } + + &::before { + background: var-get($_theme, 'item-selected-focus-background'); + } + } + + &[igxButton].igx-button--focused { + background: var-get($_theme, 'item-selected-background'); + color: var-get($_theme, 'item-selected-hover-text-color'); + border-color: var-get($_theme, 'item-selected-hover-border-color'); + + &::before { + background: var-get($_theme, 'item-selected-hover-background'); + } + + igx-icon { + color: var-get($_theme, 'item-selected-hover-icon-color'); + } + + &:hover { + @extend %item-overlay; + + background: var-get($_theme, 'item-selected-background'); + + &::before { + background: var-get($_theme, 'item-selected-focus-hover-background'); + } + + igx-icon { + color: var-get($_theme, 'item-selected-hover-icon-color'); + } + } + + &:active { + background: var-get($_theme, 'item-selected-background'); + color: var-get($_theme, 'item-selected-hover-text-color'); + + igx-icon { + color: var-get($_theme, 'item-selected-hover-icon-color'); + } + } + } + } +} diff --git a/projects/igniteui-angular/calendar/src/calendar/calendar.component.scss b/projects/igniteui-angular/calendar/src/calendar/calendar.component.scss new file mode 100644 index 00000000000..dd684163cd7 --- /dev/null +++ b/projects/igniteui-angular/calendar/src/calendar/calendar.component.scss @@ -0,0 +1,4 @@ +@use 'themes/base'; +@use 'themes/shared'; +@use 'themes/light'; +@use 'themes/dark'; diff --git a/projects/igniteui-angular/calendar/src/calendar/calendar.component.ts b/projects/igniteui-angular/calendar/src/calendar/calendar.component.ts index c8c8de763ac..71f5c1326e6 100644 --- a/projects/igniteui-angular/calendar/src/calendar/calendar.component.ts +++ b/projects/igniteui-angular/calendar/src/calendar/calendar.component.ts @@ -10,7 +10,7 @@ import { ViewChildren, QueryList, booleanAttribute, - HostListener, + HostListener, ViewEncapsulation, } from '@angular/core'; import { NgTemplateOutlet } from '@angular/common'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; @@ -70,7 +70,19 @@ let NEXT_ID = 0; ], selector: 'igx-calendar', templateUrl: 'calendar.component.html', - imports: [NgTemplateOutlet, IgxCalendarScrollPageDirective, IgxIconComponent, IgxDaysViewComponent, IgxMonthsViewComponent, IgxYearsViewComponent, IgxDateFormatterPipe, IgxMonthViewSlotsCalendar, IgxGetViewDateCalendar] + styleUrls: ['calendar.component.css', 'shared-themes/calendar-picker/calendar-picker.component.css'], + encapsulation: ViewEncapsulation.None, + imports: [ + NgTemplateOutlet, + IgxCalendarScrollPageDirective, + IgxIconComponent, + IgxDaysViewComponent, + IgxMonthsViewComponent, + IgxYearsViewComponent, + IgxDateFormatterPipe, + IgxMonthViewSlotsCalendar, + IgxGetViewDateCalendar + ] }) export class IgxCalendarComponent extends IgxCalendarBaseDirective implements AfterViewInit { /** diff --git a/projects/igniteui-angular/calendar/src/calendar/calendar.directives.ts b/projects/igniteui-angular/calendar/src/calendar/calendar.directives.ts index 93688d4dc74..3a479081b07 100644 --- a/projects/igniteui-angular/calendar/src/calendar/calendar.directives.ts +++ b/projects/igniteui-angular/calendar/src/calendar/calendar.directives.ts @@ -56,17 +56,17 @@ export abstract class IgxCalendarViewBaseDirective { standalone: true }) export class IgxCalendarYearDirective extends IgxCalendarViewBaseDirective { - @HostBinding('class.igx-calendar-view__item--current') + @HostBinding('class.igx-calendar-view-item--current') public get isCurrent(): boolean { return CalendarDay.today.year === this.value.getFullYear(); } - @HostBinding('class.igx-calendar-view__item--selected') + @HostBinding('class.igx-calendar-view-item--selected') public get isSelected(): boolean { return this.value.getFullYear() === this.date.getFullYear(); } - @HostBinding('class.igx-calendar-view__item--active') + @HostBinding('class.igx-calendar-view-item--active') public get isActive(): boolean { return this.isSelected && this.showActive; } @@ -81,21 +81,21 @@ export class IgxCalendarYearDirective extends IgxCalendarViewBaseDirective { standalone: true }) export class IgxCalendarMonthDirective extends IgxCalendarViewBaseDirective { - @HostBinding('class.igx-calendar-view__item--current') + @HostBinding('class.igx-calendar-view-item--current') public get isCurrent(): boolean { const today = CalendarDay.today; const date = CalendarDay.from(this.value); return date.year === today.year && date.month === today.month; } - @HostBinding('class.igx-calendar-view__item--selected') + @HostBinding('class.igx-calendar-view-item--selected') public get isSelected(): boolean { return (this.value.getFullYear() === this.date.getFullYear() && this.value.getMonth() === this.date.getMonth() ); } - @HostBinding('class.igx-calendar-view__item--active') + @HostBinding('class.igx-calendar-view-item--active') public get isActive(): boolean { return this.isSelected && this.showActive; } diff --git a/projects/igniteui-angular/calendar/src/calendar/days-view/day-item.component.html b/projects/igniteui-angular/calendar/src/calendar/days-view/day-item.component.html index ea05eb65eb2..3fc372d64a9 100644 --- a/projects/igniteui-angular/calendar/src/calendar/days-view/day-item.component.html +++ b/projects/igniteui-angular/calendar/src/calendar/days-view/day-item.component.html @@ -1,6 +1,6 @@