mirror of
https://github.com/home-assistant/frontend.git
synced 2025-11-09 19:09:48 +00:00
83 lines
2.7 KiB
TypeScript
83 lines
2.7 KiB
TypeScript
import ButtonGroup from "@awesome.me/webawesome/dist/components/button-group/button-group";
|
|
import { customElement } from "lit/decorators";
|
|
import type { HaButton } from "./ha-button";
|
|
import { StateSet } from "../resources/polyfills/stateset";
|
|
|
|
export type Appearance = "accent" | "filled" | "outlined" | "plain";
|
|
|
|
/**
|
|
* Finds an ha-button element either as the current element or within its descendants.
|
|
* @param el - The HTML element to search from
|
|
* @returns The found HaButton element, or null if not found
|
|
*/
|
|
function findButton(el: HTMLElement) {
|
|
const selector = "ha-button";
|
|
return (el.closest(selector) ?? el.querySelector(selector)) as HaButton;
|
|
}
|
|
|
|
/**
|
|
* @element ha-button-group
|
|
* @extends {ButtonGroup}
|
|
* @summary
|
|
* Group buttons. Extend Webawesome to be able to work with ha-button tags
|
|
*
|
|
* @documentation https://webawesome.com/components/button-group
|
|
*/
|
|
@customElement("ha-button-group") // @ts-expect-error Intentionally overriding private methods
|
|
export class HaButtonGroup extends ButtonGroup {
|
|
attachInternals() {
|
|
const internals = super.attachInternals();
|
|
Object.defineProperty(internals, "states", {
|
|
value: new StateSet(this, internals.states),
|
|
});
|
|
return internals;
|
|
}
|
|
|
|
// @ts-expect-error updateClassNames is used in super class
|
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
private override updateClassNames() {
|
|
const slottedElements = [
|
|
...this.defaultSlot.assignedElements({ flatten: true }),
|
|
] as HTMLElement[];
|
|
this.hasOutlined = false;
|
|
|
|
slottedElements.forEach((el) => {
|
|
const index = slottedElements.indexOf(el);
|
|
const button = findButton(el);
|
|
|
|
if (button) {
|
|
if ((button as HaButton).appearance === "outlined")
|
|
this.hasOutlined = true;
|
|
if (this.size) button.setAttribute("size", this.size);
|
|
button.classList.add("wa-button-group__button");
|
|
button.classList.toggle(
|
|
"wa-button-group__horizontal",
|
|
this.orientation === "horizontal"
|
|
);
|
|
button.classList.toggle(
|
|
"wa-button-group__vertical",
|
|
this.orientation === "vertical"
|
|
);
|
|
button.classList.toggle("wa-button-group__button-first", index === 0);
|
|
button.classList.toggle(
|
|
"wa-button-group__button-inner",
|
|
index > 0 && index < slottedElements.length - 1
|
|
);
|
|
button.classList.toggle(
|
|
"wa-button-group__button-last",
|
|
index === slottedElements.length - 1
|
|
);
|
|
|
|
// use button-group variant
|
|
button.setAttribute("variant", this.variant);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
declare global {
|
|
interface HTMLElementTagNameMap {
|
|
"ha-button-group": HaButtonGroup;
|
|
}
|
|
}
|