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/package-lock.json b/package-lock.json index d1b5e36f542..7b1662294b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "@types/source-map": "0.5.2", "express": "^5.1.0", "fflate": "^0.8.1", - "igniteui-theming": "^20.0.0", + "igniteui-theming": "^22.0.0", "igniteui-trial-watermark": "^3.1.0", "lodash-es": "^4.17.21", "rxjs": "^7.8.2", @@ -56,6 +56,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", @@ -83,6 +84,7 @@ "karma-spec-reporter": "^0.0.36", "lit-html": "^3.2.1", "ng-packagr": "^20.0.0", + "node-watch": "^0.7.4", "postcss": "^8.5.1", "postcss-scss": "^4.0.6", "prettier": "^3.3.3", @@ -8932,6 +8934,124 @@ "node": ">=0.10.0" } }, + "node_modules/concurrently": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.2.tgz", + "integrity": "sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "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-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/concurrently/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concurrently/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "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/configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -13633,9 +13753,9 @@ } }, "node_modules/igniteui-theming": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/igniteui-theming/-/igniteui-theming-20.0.0.tgz", - "integrity": "sha512-g+pxAskmX1g0wlwaO0MPcT8sMTbr3rzSEOJRWg26FBKcVE09cxPEbX2Vl9k7LdbBc5VdDoiAgsI9yvZhAUM0Xg==", + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/igniteui-theming/-/igniteui-theming-22.0.0.tgz", + "integrity": "sha512-usKRq5+XkChbcALOpAzfBMC5Bt8hYkkCVVrtNhnQqa3G7sjj2+Le2wTOHDRMIM8l6HbEoWR/XE7RiQuuMFBVKA==", "license": "MIT" }, "node_modules/igniteui-trial-watermark": { @@ -17985,6 +18105,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", @@ -22253,6 +22383,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.6.0", "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.6.0.tgz", @@ -23957,6 +24100,16 @@ "dev": true, "license": "MIT" }, + "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 db833f8676f..9433dd7e616 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": "ng build --configuration production", @@ -23,8 +23,10 @@ "test:i18n": "ts-node --skip-project ./projects/igniteui-angular/src/lib/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:migrations": "gulp copyMigrations && tsc --listEmittedFiles --project ./projects/igniteui-angular/migrations/tsconfig.json", "build:schematics": "gulp copySchematics && tsc --listEmittedFiles --project ./projects/igniteui-angular/schematics/tsconfig.json", "build:docs": "npm run build:typedoc:en:production && npm run build:sassdoc:en:production", @@ -75,7 +77,7 @@ "@types/source-map": "0.5.2", "express": "^5.1.0", "fflate": "^0.8.1", - "igniteui-theming": "^20.0.0", + "igniteui-theming": "^22.0.0", "igniteui-trial-watermark": "^3.1.0", "lodash-es": "^4.17.21", "rxjs": "^7.8.2", @@ -106,6 +108,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", @@ -133,6 +136,7 @@ "karma-spec-reporter": "^0.0.36", "lit-html": "^3.2.1", "ng-packagr": "^20.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/src/lib/action-strip/action-strip.component.scss b/projects/igniteui-angular/src/lib/action-strip/action-strip.component.scss new file mode 100644 index 00000000000..dd684163cd7 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/action-strip/action-strip.component.spec.ts b/projects/igniteui-angular/src/lib/action-strip/action-strip.component.spec.ts index d37ca681970..11f2dc0d7f0 100644 --- a/projects/igniteui-angular/src/lib/action-strip/action-strip.component.spec.ts +++ b/projects/igniteui-angular/src/lib/action-strip/action-strip.component.spec.ts @@ -7,7 +7,7 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { IgxIconComponent } from '../icon/icon.component'; 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/src/lib/action-strip/action-strip.component.ts b/projects/igniteui-angular/src/lib/action-strip/action-strip.component.ts index ff848fa4846..f9ce503f9c0 100644 --- a/projects/igniteui-angular/src/lib/action-strip/action-strip.component.ts +++ b/projects/igniteui-angular/src/lib/action-strip/action-strip.component.ts @@ -13,7 +13,8 @@ import { ChangeDetectorRef, AfterViewInit, ElementRef, - booleanAttribute + booleanAttribute, + ViewEncapsulation } from '@angular/core'; import { ActionStripResourceStringsEN, IActionStripResourceStrings } from '../core/i18n/action-strip-resources'; import { IgxDropDownComponent } from '../drop-down/drop-down.component'; @@ -73,6 +74,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/src/lib/action-strip/themes/_base.scss b/projects/igniteui-angular/src/lib/action-strip/themes/_base.scss new file mode 100644 index 00000000000..e903a2d23d1 --- /dev/null +++ b/projects/igniteui-angular/src/lib/action-strip/themes/_base.scss @@ -0,0 +1,140 @@ +@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}; + --igx-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'); + max-height: rem(36px); + + &: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/src/lib/action-strip/themes/dark/_index.scss b/projects/igniteui-angular/src/lib/action-strip/themes/dark/_index.scss new file mode 100644 index 00000000000..cefc00f9cde --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/action-strip/themes/dark/_tokens.scss b/projects/igniteui-angular/src/lib/action-strip/themes/dark/_tokens.scss new file mode 100644 index 00000000000..a28ec35fe65 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/action-strip/themes/light/_index.scss b/projects/igniteui-angular/src/lib/action-strip/themes/light/_index.scss new file mode 100644 index 00000000000..9436c880134 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/action-strip/themes/light/_tokens.scss b/projects/igniteui-angular/src/lib/action-strip/themes/light/_tokens.scss new file mode 100644 index 00000000000..f860918d21e --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/action-strip/themes/shared/_fluent.scss b/projects/igniteui-angular/src/lib/action-strip/themes/shared/_fluent.scss new file mode 100644 index 00000000000..d492ac4f591 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/action-strip/themes/shared/_index.scss b/projects/igniteui-angular/src/lib/action-strip/themes/shared/_index.scss new file mode 100644 index 00000000000..7760b2e7366 --- /dev/null +++ b/projects/igniteui-angular/src/lib/action-strip/themes/shared/_index.scss @@ -0,0 +1 @@ +@forward 'fluent'; diff --git a/projects/igniteui-angular/src/lib/avatar/avatar.component.scss b/projects/igniteui-angular/src/lib/avatar/avatar.component.scss new file mode 100644 index 00000000000..dd684163cd7 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/avatar/avatar.component.ts b/projects/igniteui-angular/src/lib/avatar/avatar.component.ts index 24b10eddfe7..9cea33ff68c 100644 --- a/projects/igniteui-angular/src/lib/avatar/avatar.component.ts +++ b/projects/igniteui-angular/src/lib/avatar/avatar.component.ts @@ -6,7 +6,8 @@ import { Input, OnInit, TemplateRef, - ViewChild + ViewChild, + ViewEncapsulation, } from '@angular/core'; import { normalizeURI } from '../core/utils'; @@ -53,6 +54,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/src/lib/avatar/themes/_base.scss b/projects/igniteui-angular/src/lib/avatar/themes/_base.scss new file mode 100644 index 00000000000..7e579d21bee --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/avatar/themes/dark/_index.scss b/projects/igniteui-angular/src/lib/avatar/themes/dark/_index.scss new file mode 100644 index 00000000000..9dbf039674c --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/avatar/themes/dark/_tokens.scss b/projects/igniteui-angular/src/lib/avatar/themes/dark/_tokens.scss new file mode 100644 index 00000000000..f5e829c9657 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/avatar/themes/light/_index.scss b/projects/igniteui-angular/src/lib/avatar/themes/light/_index.scss new file mode 100644 index 00000000000..b59827df365 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/avatar/themes/light/_tokens.scss b/projects/igniteui-angular/src/lib/avatar/themes/light/_tokens.scss new file mode 100644 index 00000000000..93ea480da81 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/avatar/themes/shared/_index.scss b/projects/igniteui-angular/src/lib/avatar/themes/shared/_index.scss new file mode 100644 index 00000000000..ca3dd3bc266 --- /dev/null +++ b/projects/igniteui-angular/src/lib/avatar/themes/shared/_index.scss @@ -0,0 +1 @@ +@forward 'indigo'; diff --git a/projects/igniteui-angular/src/lib/avatar/themes/shared/indigo.scss b/projects/igniteui-angular/src/lib/avatar/themes/shared/indigo.scss new file mode 100644 index 00000000000..22a540c4089 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/badge/badge.component.scss b/projects/igniteui-angular/src/lib/badge/badge.component.scss new file mode 100644 index 00000000000..dd684163cd7 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/badge/badge.component.ts b/projects/igniteui-angular/src/lib/badge/badge.component.ts index fe3990d8b12..1ddc94f900e 100644 --- a/projects/igniteui-angular/src/lib/badge/badge.component.ts +++ b/projects/igniteui-angular/src/lib/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 '../icon/icon.component'; 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/src/lib/badge/themes/_base.scss b/projects/igniteui-angular/src/lib/badge/themes/_base.scss new file mode 100644 index 00000000000..6885840bbb1 --- /dev/null +++ b/projects/igniteui-angular/src/lib/badge/themes/_base.scss @@ -0,0 +1,65 @@ +@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) { + --size: #{rem(22px)}; + --_badge-size: var(--size); + --igx-icon-size: calc(var(--_badge-size) / 2); + --igx-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; + + @include type-style(caption) { + margin: 0; + } + + @include e(value) { + white-space: nowrap; + padding-inline: rem(4px); + } + + @include m(info) { + background: color($color: 'info'); + } + + @include m(success) { + background: color($color: 'success'); + } + + @include m(warning) { + background: color($color: 'warn'); + } + + @include m(error) { + background: color($color: 'error'); + } + + @include m(outlined) { + box-shadow: inset 0 0 0 rem(2px) var-get($theme, 'border-color'); + } + + @include m(square) { + border-radius: var-get($theme, 'border-radius'); + } + + @include m(hidden) { + visibility: hidden; + } + } +} diff --git a/projects/igniteui-angular/src/lib/badge/themes/dark/_index.scss b/projects/igniteui-angular/src/lib/badge/themes/dark/_index.scss new file mode 100644 index 00000000000..855eddbf96a --- /dev/null +++ b/projects/igniteui-angular/src/lib/badge/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-badge, $tokens, dark); diff --git a/projects/igniteui-angular/src/lib/badge/themes/dark/_tokens.scss b/projects/igniteui-angular/src/lib/badge/themes/dark/_tokens.scss new file mode 100644 index 00000000000..e97bbab4aab --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/badge/themes/light/_index.scss b/projects/igniteui-angular/src/lib/badge/themes/light/_index.scss new file mode 100644 index 00000000000..ef28e1a85ae --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/badge/themes/light/_tokens.scss b/projects/igniteui-angular/src/lib/badge/themes/light/_tokens.scss new file mode 100644 index 00000000000..0643448a04f --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/badge/themes/shared/_index.scss b/projects/igniteui-angular/src/lib/badge/themes/shared/_index.scss new file mode 100644 index 00000000000..be6ed543149 --- /dev/null +++ b/projects/igniteui-angular/src/lib/badge/themes/shared/_index.scss @@ -0,0 +1,2 @@ +@forward 'bootstrap'; +@forward 'indigo'; diff --git a/projects/igniteui-angular/src/lib/badge/themes/shared/bootstrap.scss b/projects/igniteui-angular/src/lib/badge/themes/shared/bootstrap.scss new file mode 100644 index 00000000000..345ee74d9ec --- /dev/null +++ b/projects/igniteui-angular/src/lib/badge/themes/shared/bootstrap.scss @@ -0,0 +1,13 @@ +@use 'igniteui-theming/sass/bem' as *; +@use 'igniteui-theming/sass/typography' as *; +@use 'igniteui-theming/sass/themes/functions' as *; +@use 'styles/themes/standalone' as *; +@use '../light/tokens' as *; + +$_theme: $bootstrap; + +@include themed-block(igx-badge, bootstrap) { + @include m(outlined) { + box-shadow: inset 0 0 0 rem(1px) var-get($_theme, 'border-color'); + } +} diff --git a/projects/igniteui-angular/src/lib/badge/themes/shared/indigo.scss b/projects/igniteui-angular/src/lib/badge/themes/shared/indigo.scss new file mode 100644 index 00000000000..2ebf543a42f --- /dev/null +++ b/projects/igniteui-angular/src/lib/badge/themes/shared/indigo.scss @@ -0,0 +1,13 @@ +@use 'igniteui-theming/sass/bem' as *; +@use 'igniteui-theming/sass/typography' as *; +@use 'igniteui-theming/sass/themes/functions' as *; +@use 'styles/themes/standalone' as *; +@use '../light/tokens' as *; + +@include themed-block(igx-badge, indigo) { + --igx-icon-size: #{rem(12px)}; + + @include type-style(button) { + margin: 0; + } +} diff --git a/projects/igniteui-angular/src/lib/banner/banner.component.scss b/projects/igniteui-angular/src/lib/banner/banner.component.scss new file mode 100644 index 00000000000..dd684163cd7 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/banner/banner.component.spec.ts b/projects/igniteui-angular/src/lib/banner/banner.component.spec.ts index ee15d924432..2d52f6bb881 100644 --- a/projects/igniteui-angular/src/lib/banner/banner.component.spec.ts +++ b/projects/igniteui-angular/src/lib/banner/banner.component.spec.ts @@ -596,7 +596,7 @@ export class IgxBannerSampleComponent { -

Brad Stanley

+

Brad Stanley

Audi AG
diff --git a/projects/igniteui-angular/src/lib/banner/banner.component.ts b/projects/igniteui-angular/src/lib/banner/banner.component.ts index b6055d350a1..7c042831917 100644 --- a/projects/igniteui-angular/src/lib/banner/banner.component.ts +++ b/projects/igniteui-angular/src/lib/banner/banner.component.ts @@ -6,7 +6,8 @@ import { HostBinding, Input, Output, - ViewChild + ViewChild, + ViewEncapsulation } from '@angular/core'; import { IgxIconComponent } from '../icon/icon.component'; @@ -48,6 +49,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/src/lib/banner/themes/_base.scss b/projects/igniteui-angular/src/lib/banner/themes/_base.scss new file mode 100644 index 00000000000..86976dfc1a6 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/banner/themes/dark/_index.scss b/projects/igniteui-angular/src/lib/banner/themes/dark/_index.scss new file mode 100644 index 00000000000..77734d2b4da --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/banner/themes/dark/_tokens.scss b/projects/igniteui-angular/src/lib/banner/themes/dark/_tokens.scss new file mode 100644 index 00000000000..4115c0999b3 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/banner/themes/light/_index.scss b/projects/igniteui-angular/src/lib/banner/themes/light/_index.scss new file mode 100644 index 00000000000..bc1fd21cac9 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/banner/themes/light/_tokens.scss b/projects/igniteui-angular/src/lib/banner/themes/light/_tokens.scss new file mode 100644 index 00000000000..b11d036a277 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/banner/themes/shared/_fluent.scss b/projects/igniteui-angular/src/lib/banner/themes/shared/_fluent.scss new file mode 100644 index 00000000000..c8e8a5a8ea2 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/banner/themes/shared/_index.scss b/projects/igniteui-angular/src/lib/banner/themes/shared/_index.scss new file mode 100644 index 00000000000..c0b99f867cc --- /dev/null +++ b/projects/igniteui-angular/src/lib/banner/themes/shared/_index.scss @@ -0,0 +1,2 @@ +@forward 'indigo'; +@forward 'fluent'; diff --git a/projects/igniteui-angular/src/lib/banner/themes/shared/_indigo.scss b/projects/igniteui-angular/src/lib/banner/themes/shared/_indigo.scss new file mode 100644 index 00000000000..82c6f94d409 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/buttonGroup/buttonGroup.component.ts b/projects/igniteui-angular/src/lib/buttonGroup/buttonGroup.component.ts index 9d78e2fa85a..c9a66c0d666 100644 --- a/projects/igniteui-angular/src/lib/buttonGroup/buttonGroup.component.ts +++ b/projects/igniteui-angular/src/lib/buttonGroup/buttonGroup.component.ts @@ -12,7 +12,8 @@ import { ViewChildren, OnDestroy, ElementRef, - booleanAttribute + booleanAttribute, + ViewEncapsulation } from '@angular/core'; import { Subject } from 'rxjs'; import { IgxButtonDirective } from '../directives/button/button.directive'; @@ -56,6 +57,8 @@ let NEXT_ID = 0; @Component({ selector: 'igx-buttongroup', templateUrl: 'buttongroup-content.component.html', + styleUrl: 'buttongroup-content.component.css', + encapsulation: ViewEncapsulation.None, imports: [IgxButtonDirective, IgxRippleDirective, IgxIconComponent] }) export class IgxButtonGroupComponent implements AfterViewInit, OnDestroy { @@ -76,12 +79,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. @@ -285,6 +308,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/src/lib/buttonGroup/buttongroup-content.component.html b/projects/igniteui-angular/src/lib/buttonGroup/buttongroup-content.component.html index 58f674c856a..0c69724b6cd 100644 --- a/projects/igniteui-angular/src/lib/buttonGroup/buttongroup-content.component.html +++ b/projects/igniteui-angular/src/lib/buttonGroup/buttongroup-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/src/lib/buttonGroup/buttongroup-content.component.scss b/projects/igniteui-angular/src/lib/buttonGroup/buttongroup-content.component.scss new file mode 100644 index 00000000000..dd684163cd7 --- /dev/null +++ b/projects/igniteui-angular/src/lib/buttonGroup/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/src/lib/buttonGroup/themes/_base.scss b/projects/igniteui-angular/src/lib/buttonGroup/themes/_base.scss new file mode 100644 index 00000000000..9a18266e68b --- /dev/null +++ b/projects/igniteui-angular/src/lib/buttonGroup/themes/_base.scss @@ -0,0 +1,218 @@ +@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); + + 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) { + &: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/src/lib/buttonGroup/themes/dark/_index.scss b/projects/igniteui-angular/src/lib/buttonGroup/themes/dark/_index.scss new file mode 100644 index 00000000000..12286543b37 --- /dev/null +++ b/projects/igniteui-angular/src/lib/buttonGroup/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/src/lib/buttonGroup/themes/dark/_tokens.scss b/projects/igniteui-angular/src/lib/buttonGroup/themes/dark/_tokens.scss new file mode 100644 index 00000000000..9d1dad4dd22 --- /dev/null +++ b/projects/igniteui-angular/src/lib/buttonGroup/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/src/lib/buttonGroup/themes/light/_index.scss b/projects/igniteui-angular/src/lib/buttonGroup/themes/light/_index.scss new file mode 100644 index 00000000000..291f5c86ffb --- /dev/null +++ b/projects/igniteui-angular/src/lib/buttonGroup/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/src/lib/buttonGroup/themes/light/_tokens.scss b/projects/igniteui-angular/src/lib/buttonGroup/themes/light/_tokens.scss new file mode 100644 index 00000000000..255ef4315ea --- /dev/null +++ b/projects/igniteui-angular/src/lib/buttonGroup/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/src/lib/buttonGroup/themes/shared/_bootstrap.scss b/projects/igniteui-angular/src/lib/buttonGroup/themes/shared/_bootstrap.scss new file mode 100644 index 00000000000..01857d260e3 --- /dev/null +++ b/projects/igniteui-angular/src/lib/buttonGroup/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/src/lib/buttonGroup/themes/shared/_fluent.scss b/projects/igniteui-angular/src/lib/buttonGroup/themes/shared/_fluent.scss new file mode 100644 index 00000000000..01cb59963df --- /dev/null +++ b/projects/igniteui-angular/src/lib/buttonGroup/themes/shared/_fluent.scss @@ -0,0 +1,127 @@ +@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}; + --igx-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/src/lib/buttonGroup/themes/shared/_index.scss b/projects/igniteui-angular/src/lib/buttonGroup/themes/shared/_index.scss new file mode 100644 index 00000000000..097687c32b5 --- /dev/null +++ b/projects/igniteui-angular/src/lib/buttonGroup/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/src/lib/buttonGroup/themes/shared/_indigo.scss b/projects/igniteui-angular/src/lib/buttonGroup/themes/shared/_indigo.scss new file mode 100644 index 00000000000..11fff6a26d4 --- /dev/null +++ b/projects/igniteui-angular/src/lib/buttonGroup/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}; + --igx-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'); + 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/src/lib/buttonGroup/themes/shared/_material.scss b/projects/igniteui-angular/src/lib/buttonGroup/themes/shared/_material.scss new file mode 100644 index 00000000000..1bbac9cde6b --- /dev/null +++ b/projects/igniteui-angular/src/lib/buttonGroup/themes/shared/_material.scss @@ -0,0 +1,125 @@ +@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-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-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'); + } + } + } +} diff --git a/projects/igniteui-angular/src/lib/calendar/calendar.component.scss b/projects/igniteui-angular/src/lib/calendar/calendar.component.scss new file mode 100644 index 00000000000..dd684163cd7 --- /dev/null +++ b/projects/igniteui-angular/src/lib/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/src/lib/calendar/calendar.component.ts b/projects/igniteui-angular/src/lib/calendar/calendar.component.ts index 301ff268f53..d4f577c3c79 100644 --- a/projects/igniteui-angular/src/lib/calendar/calendar.component.ts +++ b/projects/igniteui-angular/src/lib/calendar/calendar.component.ts @@ -11,7 +11,7 @@ import { QueryList, OnDestroy, booleanAttribute, - HostListener, + HostListener, ViewEncapsulation, } from '@angular/core'; import { NgTemplateOutlet, DatePipe } from '@angular/common'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; @@ -71,6 +71,8 @@ let NEXT_ID = 0; ], selector: 'igx-calendar', templateUrl: 'calendar.component.html', + styleUrls: ['calendar.component.css', 'shared-themes/calendar-picker/calendar-picker.component.css'], + encapsulation: ViewEncapsulation.None, imports: [NgTemplateOutlet, IgxCalendarScrollPageDirective, IgxIconComponent, IgxDaysViewComponent, IgxMonthsViewComponent, IgxYearsViewComponent, DatePipe, IgxMonthViewSlotsCalendar, IgxGetViewDateCalendar] }) export class IgxCalendarComponent extends IgxCalendarBaseDirective implements AfterViewInit, OnDestroy { diff --git a/projects/igniteui-angular/src/lib/calendar/calendar.directives.ts b/projects/igniteui-angular/src/lib/calendar/calendar.directives.ts index 91381fcc2e2..9752d25a15f 100644 --- a/projects/igniteui-angular/src/lib/calendar/calendar.directives.ts +++ b/projects/igniteui-angular/src/lib/calendar/calendar.directives.ts @@ -70,17 +70,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; } @@ -95,21 +95,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/src/lib/calendar/days-view/day-item.component.html b/projects/igniteui-angular/src/lib/calendar/days-view/day-item.component.html index ea05eb65eb2..3fc372d64a9 100644 --- a/projects/igniteui-angular/src/lib/calendar/days-view/day-item.component.html +++ b/projects/igniteui-angular/src/lib/calendar/days-view/day-item.component.html @@ -1,6 +1,6 @@