1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-20 02:03:39 +00:00
Files
browser/libs/components/src/tabs/shared/tab-list-item.directive.ts

91 lines
2.4 KiB
TypeScript

import { FocusableOption } from "@angular/cdk/a11y";
import { Directive, ElementRef, HostBinding, Input } from "@angular/core";
/**
* Directive used for styling tab header items for both nav links (anchor tags)
* and content tabs (button tags)
*/
@Directive({ selector: "[bitTabListItem]" })
export class TabListItemDirective implements FocusableOption {
@Input() active: boolean;
@Input() disabled: boolean;
@HostBinding("attr.disabled")
get disabledAttr() {
return this.disabled || null; // native disabled attr must be null when false
}
constructor(private elementRef: ElementRef) {}
focus() {
this.elementRef.nativeElement.focus();
}
click() {
this.elementRef.nativeElement.click();
}
@HostBinding("class")
get classList(): string[] {
return this.baseClassList
.concat(this.active ? this.activeClassList : [])
.concat(this.disabled ? this.disabledClassList : [])
.concat(this.textColorClassList);
}
/**
* Classes used for styling tab item text color.
* Separate text color class list required to override bootstrap classes in Web.
*/
get textColorClassList(): string[] {
if (this.disabled) {
return ["!tw-text-muted", "hover:!tw-text-muted"];
}
if (this.active) {
return ["!tw-text-primary-500", "hover:!tw-text-primary-700"];
}
return ["!tw-text-main", "hover:!tw-text-main"];
}
get baseClassList(): string[] {
return [
"tw-block",
"tw-relative",
"tw-py-2",
"tw-px-4",
"tw-font-semibold",
"tw-transition",
"tw-rounded-t",
"tw-border-0",
"tw-border-x",
"tw-border-t-4",
"tw-border-transparent",
"tw-border-solid",
"tw-bg-transparent",
"hover:tw-underline",
"focus-visible:tw-z-10",
"focus-visible:tw-outline-none",
"focus-visible:tw-ring-2",
"focus-visible:tw-ring-primary-700",
];
}
get disabledClassList(): string[] {
return ["!tw-bg-secondary-100", "!tw-no-underline", "tw-cursor-not-allowed"];
}
get activeClassList(): string[] {
return [
"tw--mb-px",
"tw-border-x-secondary-300",
"tw-border-t-primary-500",
"tw-border-b",
"tw-border-b-background",
"!tw-bg-background",
"hover:tw-border-t-primary-700",
"focus-visible:tw-border-t-primary-700",
"focus-visible:!tw-text-primary-700",
];
}
}