diff --git a/gallery/src/pages/components/ha-dropdown.markdown b/gallery/src/pages/components/ha-dropdown.markdown new file mode 100644 index 000000000000..f277140a463d --- /dev/null +++ b/gallery/src/pages/components/ha-dropdown.markdown @@ -0,0 +1,55 @@ +--- +title: Dropdown +--- + +# Dropdown `` + +## Implementation + +A compact, accessible dropdown menu for choosing actions or settings. `ha-dropdown` supports composed menu items (``) for icons, submenus, checkboxes, disabled entries, and destructive variants. Use composition with `slot="trigger"` to control the trigger button and use `` for rich item content. + +### Example usage (composition) + +```html + + Dropdown + + + + Cut + + + + + Copy + + + + + Paste + + + + Show images + Show all images + Show thumbnails + + + Emoji shortcuts + Word wrap + + + + Delete + + +``` + +### API + +This component is based on the webawesome dropdown component. +Check the [webawesome documentation](https://webawesome.com/docs/components/dropdown/) for more details. diff --git a/gallery/src/pages/components/ha-dropdown.ts b/gallery/src/pages/components/ha-dropdown.ts new file mode 100644 index 000000000000..12c467fe5c19 --- /dev/null +++ b/gallery/src/pages/components/ha-dropdown.ts @@ -0,0 +1,133 @@ +import { + mdiContentCopy, + mdiContentCut, + mdiContentPaste, + mdiDelete, +} from "@mdi/js"; +import type { TemplateResult } from "lit"; +import { css, html, LitElement } from "lit"; +import { customElement } from "lit/decorators"; +import "../../../../src/components/ha-button"; +import "../../../../src/components/ha-card"; +import "../../../../src/components/ha-svg-icon"; +import "../../../../src/components/ha-dropdown-item"; +import "@home-assistant/webawesome/dist/components/icon/icon"; +import "@home-assistant/webawesome/dist/components/button/button"; +import "@home-assistant/webawesome/dist/components/dropdown/dropdown"; +import "../../../../src/components/ha-dropdown"; +import "@home-assistant/webawesome/dist/components/popup/popup"; +import { applyThemesOnElement } from "../../../../src/common/dom/apply_themes_on_element"; +import "../../../../src/components/ha-icon-button"; + +@customElement("demo-components-ha-dropdown") +export class DemoHaDropdown extends LitElement { + protected render(): TemplateResult { + return html` + ${["light", "dark"].map( + (mode) => html` +
+ +
+ + Dropdown + + + + Cut + + + + Copy + + + + Paste + + + Show images + Show All Images + Show Thumbnails + + Emoji Shortcuts + Word Wrap + + + Delete + + +
+
+
+ ` + )} + `; + } + + firstUpdated(changedProps) { + super.firstUpdated(changedProps); + applyThemesOnElement( + this.shadowRoot!.querySelector(".dark"), + { + default_theme: "default", + default_dark_theme: "default", + themes: {}, + darkMode: true, + theme: "default", + }, + undefined, + undefined, + true + ); + } + + static styles = css` + :host { + display: flex; + justify-content: center; + } + .dark, + .light { + display: block; + background-color: var(--primary-background-color); + padding: 0 50px; + } + .button { + padding: unset; + } + ha-card { + margin: 24px auto; + } + .card-content { + display: flex; + flex-direction: column; + gap: 24px; + } + .card-content div { + display: flex; + gap: 8px; + } + `; +} + +declare global { + interface HTMLElementTagNameMap { + "demo-components-ha-dropdown": DemoHaDropdown; + } +} diff --git a/src/components/ha-dropdown-item.ts b/src/components/ha-dropdown-item.ts new file mode 100644 index 000000000000..05a4a5139bff --- /dev/null +++ b/src/components/ha-dropdown-item.ts @@ -0,0 +1,33 @@ +import DropdownItem from "@home-assistant/webawesome/dist/components/dropdown-item/dropdown-item"; +import { css, type CSSResultGroup } from "lit"; +import { customElement } from "lit/decorators"; + +/** + * Home Assistant dropdown item component + * + * @element ha-dropdown-item + * @extends {DropdownItem} + * + * @summary + * A stylable dropdown item component supporting Home Assistant theming, variants, and appearances based on webawesome dropdown item. + * + */ +@customElement("ha-dropdown-item") +export class HaDropdownItem extends DropdownItem { + static get styles(): CSSResultGroup { + return [ + DropdownItem.styles, + css` + :host { + min-height: 40px; + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-dropdown-item": HaDropdownItem; + } +} diff --git a/src/components/ha-dropdown.ts b/src/components/ha-dropdown.ts new file mode 100644 index 000000000000..9db576b886d2 --- /dev/null +++ b/src/components/ha-dropdown.ts @@ -0,0 +1,45 @@ +import Dropdown from "@home-assistant/webawesome/dist/components/dropdown/dropdown"; +import { css, type CSSResultGroup } from "lit"; +import { customElement, property } from "lit/decorators"; + +/** + * Home Assistant dropdown component + * + * @element ha-dropdown + * @extends {Dropdown} + * + * @summary + * A stylable dropdown component supporting Home Assistant theming, variants, and appearances based on webawesome dropdown. + * + */ +@customElement("ha-dropdown") +export class HaDropdown extends Dropdown { + @property({ attribute: false }) dropdownTag = "ha-dropdown"; + + @property({ attribute: false }) dropdownItemTag = "ha-dropdown-item"; + + static get styles(): CSSResultGroup { + return [ + Dropdown.styles, + css` + :host { + --wa-color-surface-border: var(--ha-color-border-normal); + --wa-color-surface-raised: var( + --card-background-color, + var(--ha-dialog-surface-background, var(--mdc-theme-surface, #fff)), + ); + } + + #menu { + --wa-shadow-m: 0px 4px 8px 0px var(--ha-color-shadow); + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-dropdown": HaDropdown; + } +} diff --git a/src/panels/profile/ha-refresh-tokens-card.ts b/src/panels/profile/ha-refresh-tokens-card.ts index 7ee2b77be07d..ff10317f4b23 100644 --- a/src/panels/profile/ha-refresh-tokens-card.ts +++ b/src/panels/profile/ha-refresh-tokens-card.ts @@ -29,6 +29,8 @@ import { } from "../../dialogs/generic/show-dialog-box"; import { haStyle } from "../../resources/styles"; import type { HomeAssistant } from "../../types"; +import "../../components/ha-dropdown-item"; +import "../../components/ha-dropdown"; // Client ID used by iOS app const iOSclientId = "https://home-assistant.io/iOS"; @@ -146,19 +148,18 @@ class HaRefreshTokens extends LitElement { )}
- + - - + -
- ${this.hass.localize("ui.common.delete")} -
-
-
+ ${this.hass.localize("ui.common.delete")} + +
` diff --git a/src/resources/theme/color/semantic.globals.ts b/src/resources/theme/color/semantic.globals.ts index fbb874d77bbb..2efb06cef2fc 100644 --- a/src/resources/theme/color/semantic.globals.ts +++ b/src/resources/theme/color/semantic.globals.ts @@ -155,6 +155,10 @@ export const semanticColorStyles = css` /* Surfaces */ --ha-color-surface-default: var(--ha-color-neutral-95); + --ha-color-on-surface-default: var(--ha-color-neutral-05); + + /* shadow */ + --ha-color-shadow: rgba(0, 0, 0, 0.2); } `; @@ -286,5 +290,9 @@ export const darkSemanticColorStyles = css` /* Surfaces */ --ha-color-surface-default: var(--ha-color-neutral-10); + --ha-color-on-surface-default: var(--ha-color-neutral-95); + + /* shadow */ + --ha-color-shadow: rgba(255, 255, 255, 0.2); } `; diff --git a/src/resources/theme/color/wa.globals.ts b/src/resources/theme/color/wa.globals.ts index 0ace8cb1a52b..c699e7adabba 100644 --- a/src/resources/theme/color/wa.globals.ts +++ b/src/resources/theme/color/wa.globals.ts @@ -52,7 +52,9 @@ export const waColorStyles = css` --wa-color-danger-on-normal: var(--ha-color-on-danger-normal); --wa-color-danger-on-quiet: var(--ha-color-on-danger-quiet); - --wa-color-surface-default: var(--card-background-color); + --wa-color-text-normal: var(--ha-color-text-primary); + --wa-color-surface-default: var(--card-background-color); + --wa-color-surface-raised: var(--ha-dialog-surface-background, var(--mdc-theme-surface, #fff)); --wa-panel-border-radius: var(--ha-border-radius-3xl); --wa-panel-border-style: solid; --wa-panel-border-width: 1px; diff --git a/src/resources/theme/wa.globals.ts b/src/resources/theme/wa.globals.ts index 34ab8cca65f6..75c93386c77a 100644 --- a/src/resources/theme/wa.globals.ts +++ b/src/resources/theme/wa.globals.ts @@ -16,7 +16,17 @@ export const waMainStyles = css` --wa-font-weight-action: var(--ha-font-weight-medium); --wa-transition-fast: 75ms; --wa-transition-easing: ease; - --wa-border-width-l: var(--ha-border-radius-lg); + + --wa-border-style: solid; + --wa-border-width-s: var(--ha-border-width-sm); + --wa-border-width-m: var(--ha-border-width-md); + --wa-border-width-l: var(--ha-border-width-lg); + --wa-border-radius-s: var(--ha-border-radius-sm); + --wa-border-radius-m: var(--ha-border-radius-md); + --wa-border-radius-l: var(--ha-border-radius-lg); + + --wa-line-height-condensed: 1.25; + --wa-space-xl: 32px; }