import { _ as a, n as m, r as C, a as w, b as y, x as S, c as P } from "./class-map-CwiboTfb.mjs"; import { r as A, a as _, E as N } from "./animation-DjClVFum.mjs"; /** * @license * Copyright 2023 Google LLC * SPDX-License-Identifier: Apache-2.0 */ const I = Symbol("attachableController"); let c; c = new MutationObserver((i) => { var t; for (const e of i) (t = e.target[I]) == null || t.hostConnected(); }); class E { get htmlFor() { return this.host.getAttribute("for"); } set htmlFor(t) { t === null ? this.host.removeAttribute("for") : this.host.setAttribute("for", t); } get control() { return this.host.hasAttribute("for") ? !this.htmlFor || !this.host.isConnected ? null : this.host.getRootNode().querySelector(`#${this.htmlFor}`) : this.currentControl || this.host.parentElement; } set control(t) { t ? this.attach(t) : this.detach(); } /** * Creates a new controller for an `Attachable` element. * * @param host The `Attachable` element. * @param onControlChange A callback with two parameters for the previous and * next control. An `Attachable` element may perform setup or teardown * logic whenever the control changes. */ constructor(t, e) { this.host = t, this.onControlChange = e, this.currentControl = null, t.addController(this), t[I] = this, c == null || c.observe(t, { attributeFilter: ["for"] }); } attach(t) { t !== this.currentControl && (this.setCurrentControl(t), this.host.removeAttribute("for")); } detach() { this.setCurrentControl(null), this.host.setAttribute("for", ""); } /** @private */ hostConnected() { this.setCurrentControl(this.control); } /** @private */ hostDisconnected() { this.setCurrentControl(null); } setCurrentControl(t) { this.onControlChange(this.currentControl, t), this.currentControl = t; } } /** * @license * Copyright 2021 Google LLC * SPDX-License-Identifier: Apache-2.0 */ const R = ["focusin", "focusout", "pointerdown"]; class v extends C { constructor() { super(...arguments), this.visible = !1, this.inward = !1, this.attachableController = new E(this, this.onControlChange.bind(this)); } get htmlFor() { return this.attachableController.htmlFor; } set htmlFor(t) { this.attachableController.htmlFor = t; } get control() { return this.attachableController.control; } set control(t) { this.attachableController.control = t; } attach(t) { this.attachableController.attach(t); } detach() { this.attachableController.detach(); } connectedCallback() { super.connectedCallback(), this.setAttribute("aria-hidden", "true"); } /** @private */ handleEvent(t) { var e; if (!t[b]) { switch (t.type) { default: return; case "focusin": this.visible = ((e = this.control) == null ? void 0 : e.matches(":focus-visible")) ?? !1; break; case "focusout": case "pointerdown": this.visible = !1; break; } t[b] = !0; } } onControlChange(t, e) { for (const r of R) t == null || t.removeEventListener(r, this), e == null || e.addEventListener(r, this); } update(t) { t.has("visible") && this.dispatchEvent(new Event("visibility-changed")), super.update(t); } } a([ m({ type: Boolean, reflect: !0 }) ], v.prototype, "visible", void 0); a([ m({ type: Boolean, reflect: !0 }) ], v.prototype, "inward", void 0); const b = Symbol("handledByFocusRing"); /** * @license * Copyright 2024 Google LLC * SPDX-License-Identifier: Apache-2.0 */ const k = w`:host{animation-delay:0s,calc(var(--md-focus-ring-duration, 600ms)*.25);animation-duration:calc(var(--md-focus-ring-duration, 600ms)*.25),calc(var(--md-focus-ring-duration, 600ms)*.75);animation-timing-function:cubic-bezier(0.2, 0, 0, 1);box-sizing:border-box;color:var(--md-focus-ring-color, var(--md-sys-color-secondary, #625b71));display:none;pointer-events:none;position:absolute}:host([visible]){display:flex}:host(:not([inward])){animation-name:outward-grow,outward-shrink;border-end-end-radius:calc(var(--md-focus-ring-shape-end-end, var(--md-focus-ring-shape, var(--md-sys-shape-corner-full, 9999px))) + var(--md-focus-ring-outward-offset, 2px));border-end-start-radius:calc(var(--md-focus-ring-shape-end-start, var(--md-focus-ring-shape, var(--md-sys-shape-corner-full, 9999px))) + var(--md-focus-ring-outward-offset, 2px));border-start-end-radius:calc(var(--md-focus-ring-shape-start-end, var(--md-focus-ring-shape, var(--md-sys-shape-corner-full, 9999px))) + var(--md-focus-ring-outward-offset, 2px));border-start-start-radius:calc(var(--md-focus-ring-shape-start-start, var(--md-focus-ring-shape, var(--md-sys-shape-corner-full, 9999px))) + var(--md-focus-ring-outward-offset, 2px));inset:calc(-1*var(--md-focus-ring-outward-offset, 2px));outline:var(--md-focus-ring-width, 3px) solid currentColor}:host([inward]){animation-name:inward-grow,inward-shrink;border-end-end-radius:calc(var(--md-focus-ring-shape-end-end, var(--md-focus-ring-shape, var(--md-sys-shape-corner-full, 9999px))) - var(--md-focus-ring-inward-offset, 0px));border-end-start-radius:calc(var(--md-focus-ring-shape-end-start, var(--md-focus-ring-shape, var(--md-sys-shape-corner-full, 9999px))) - var(--md-focus-ring-inward-offset, 0px));border-start-end-radius:calc(var(--md-focus-ring-shape-start-end, var(--md-focus-ring-shape, var(--md-sys-shape-corner-full, 9999px))) - var(--md-focus-ring-inward-offset, 0px));border-start-start-radius:calc(var(--md-focus-ring-shape-start-start, var(--md-focus-ring-shape, var(--md-sys-shape-corner-full, 9999px))) - var(--md-focus-ring-inward-offset, 0px));border:var(--md-focus-ring-width, 3px) solid currentColor;inset:var(--md-focus-ring-inward-offset, 0px)}@keyframes outward-grow{from{outline-width:0}to{outline-width:var(--md-focus-ring-active-width, 8px)}}@keyframes outward-shrink{from{outline-width:var(--md-focus-ring-active-width, 8px)}}@keyframes inward-grow{from{border-width:0}to{border-width:var(--md-focus-ring-active-width, 8px)}}@keyframes inward-shrink{from{border-width:var(--md-focus-ring-active-width, 8px)}}@media(prefers-reduced-motion){:host{animation:none}} `; /** * @license * Copyright 2021 Google LLC * SPDX-License-Identifier: Apache-2.0 */ let f = class extends v { }; f.styles = [k]; f = a([ y("md-focus-ring") ], f); /** * @license * Copyright 2022 Google LLC * SPDX-License-Identifier: Apache-2.0 */ const L = 450, g = 225, F = 0.2, M = 10, O = 75, z = 0.35, D = "::after", G = "forwards"; var o; (function(i) { i[i.INACTIVE = 0] = "INACTIVE", i[i.TOUCH_DELAY = 1] = "TOUCH_DELAY", i[i.HOLDING = 2] = "HOLDING", i[i.WAITING_FOR_CLICK = 3] = "WAITING_FOR_CLICK"; })(o || (o = {})); const B = [ "click", "contextmenu", "pointercancel", "pointerdown", "pointerenter", "pointerleave", "pointerup" ], $ = 150, u = window.matchMedia("(forced-colors: active)"); class h extends C { constructor() { super(...arguments), this.disabled = !1, this.hovered = !1, this.pressed = !1, this.rippleSize = "", this.rippleScale = "", this.initialSize = 0, this.state = o.INACTIVE, this.checkBoundsAfterContextMenu = !1, this.attachableController = new E(this, this.onControlChange.bind(this)); } get htmlFor() { return this.attachableController.htmlFor; } set htmlFor(t) { this.attachableController.htmlFor = t; } get control() { return this.attachableController.control; } set control(t) { this.attachableController.control = t; } attach(t) { this.attachableController.attach(t); } detach() { this.attachableController.detach(); } connectedCallback() { super.connectedCallback(), this.setAttribute("aria-hidden", "true"); } render() { const t = { hovered: this.hovered, pressed: this.pressed }; return S`
`; } update(t) { t.has("disabled") && this.disabled && (this.hovered = !1, this.pressed = !1), super.update(t); } /** * TODO(b/269799771): make private * @private only public for slider */ handlePointerenter(t) { this.shouldReactToEvent(t) && (this.hovered = !0); } /** * TODO(b/269799771): make private * @private only public for slider */ handlePointerleave(t) { this.shouldReactToEvent(t) && (this.hovered = !1, this.state !== o.INACTIVE && this.endPressAnimation()); } handlePointerup(t) { if (this.shouldReactToEvent(t)) { if (this.state === o.HOLDING) { this.state = o.WAITING_FOR_CLICK; return; } if (this.state === o.TOUCH_DELAY) { this.state = o.WAITING_FOR_CLICK, this.startPressAnimation(this.rippleStartEvent); return; } } } async handlePointerdown(t) { if (this.shouldReactToEvent(t)) { if (this.rippleStartEvent = t, !this.isTouch(t)) { this.state = o.WAITING_FOR_CLICK, this.startPressAnimation(t); return; } this.checkBoundsAfterContextMenu && !this.inBounds(t) || (this.checkBoundsAfterContextMenu = !1, this.state = o.TOUCH_DELAY, await new Promise((e) => { setTimeout(e, $); }), this.state === o.TOUCH_DELAY && (this.state = o.HOLDING, this.startPressAnimation(t))); } } handleClick() { if (!this.disabled) { if (this.state === o.WAITING_FOR_CLICK) { this.endPressAnimation(); return; } this.state === o.INACTIVE && (this.startPressAnimation(), this.endPressAnimation()); } } handlePointercancel(t) { this.shouldReactToEvent(t) && this.endPressAnimation(); } handleContextmenu() { this.disabled || (this.checkBoundsAfterContextMenu = !0, this.endPressAnimation()); } determineRippleSize() { const { height: t, width: e } = this.getBoundingClientRect(), r = Math.max(t, e), n = Math.max(z * r, O), s = Math.floor(r * F), d = Math.sqrt(e ** 2 + t ** 2) + M; this.initialSize = s, this.rippleScale = `${(d + n) / s}`, this.rippleSize = `${s}px`; } getNormalizedPointerEventCoords(t) { const { scrollX: e, scrollY: r } = window, { left: n, top: s } = this.getBoundingClientRect(), l = e + n, d = r + s, { pageX: x, pageY: T } = t; return { x: x - l, y: T - d }; } getTranslationCoordinates(t) { const { height: e, width: r } = this.getBoundingClientRect(), n = { x: (r - this.initialSize) / 2, y: (e - this.initialSize) / 2 }; let s; return t instanceof PointerEvent ? s = this.getNormalizedPointerEventCoords(t) : s = { x: r / 2, y: e / 2 }, s = { x: s.x - this.initialSize / 2, y: s.y - this.initialSize / 2 }, { startPoint: s, endPoint: n }; } startPressAnimation(t) { var l; if (!this.mdRoot) return; this.pressed = !0, (l = this.growAnimation) == null || l.cancel(), this.determineRippleSize(); const { startPoint: e, endPoint: r } = this.getTranslationCoordinates(t), n = `${e.x}px, ${e.y}px`, s = `${r.x}px, ${r.y}px`; this.growAnimation = this.mdRoot.animate({ top: [0, 0], left: [0, 0], height: [this.rippleSize, this.rippleSize], width: [this.rippleSize, this.rippleSize], transform: [ `translate(${n}) scale(1)`, `translate(${s}) scale(${this.rippleScale})` ] }, { pseudoElement: D, duration: L, easing: N.STANDARD, fill: G }); } async endPressAnimation() { this.rippleStartEvent = void 0, this.state = o.INACTIVE; const t = this.growAnimation; let e = 1 / 0; if (typeof (t == null ? void 0 : t.currentTime) == "number" ? e = t.currentTime : t != null && t.currentTime && (e = t.currentTime.to("ms").value), e >= g) { this.pressed = !1; return; } await new Promise((r) => { setTimeout(r, g - e); }), this.growAnimation === t && (this.pressed = !1); } /** * Returns `true` if * - the ripple element is enabled * - the pointer is primary for the input type * - the pointer is the pointer that started the interaction, or will start * the interaction * - the pointer is a touch, or the pointer state has the primary button * held, or the pointer is hovering */ shouldReactToEvent(t) { if (this.disabled || !t.isPrimary || this.rippleStartEvent && this.rippleStartEvent.pointerId !== t.pointerId) return !1; if (t.type === "pointerenter" || t.type === "pointerleave") return !this.isTouch(t); const e = t.buttons === 1; return this.isTouch(t) || e; } /** * Check if the event is within the bounds of the element. * * This is only needed for the "stuck" contextmenu longpress on Chrome. */ inBounds({ x: t, y: e }) { const { top: r, left: n, bottom: s, right: l } = this.getBoundingClientRect(); return t >= n && t <= l && e >= r && e <= s; } isTouch({ pointerType: t }) { return t === "touch"; } /** @private */ async handleEvent(t) { if (!(u != null && u.matches)) switch (t.type) { case "click": this.handleClick(); break; case "contextmenu": this.handleContextmenu(); break; case "pointercancel": this.handlePointercancel(t); break; case "pointerdown": await this.handlePointerdown(t); break; case "pointerenter": this.handlePointerenter(t); break; case "pointerleave": this.handlePointerleave(t); break; case "pointerup": this.handlePointerup(t); break; } } onControlChange(t, e) { for (const r of B) t == null || t.removeEventListener(r, this), e == null || e.addEventListener(r, this); } } a([ m({ type: Boolean, reflect: !0 }) ], h.prototype, "disabled", void 0); a([ A() ], h.prototype, "hovered", void 0); a([ A() ], h.prototype, "pressed", void 0); a([ _(".surface") ], h.prototype, "mdRoot", void 0); /** * @license * Copyright 2024 Google LLC * SPDX-License-Identifier: Apache-2.0 */ const H = w`:host{display:flex;margin:auto;pointer-events:none}:host([disabled]){display:none}@media(forced-colors: active){:host{display:none}}:host,.surface{border-radius:inherit;position:absolute;inset:0;overflow:hidden}.surface{-webkit-tap-highlight-color:rgba(0,0,0,0)}.surface::before,.surface::after{content:"";opacity:0;position:absolute}.surface::before{background-color:var(--md-ripple-hover-color, var(--md-sys-color-on-surface, #1d1b20));inset:0;transition:opacity 15ms linear,background-color 15ms linear}.surface::after{background:radial-gradient(closest-side, var(--md-ripple-pressed-color, var(--md-sys-color-on-surface, #1d1b20)) max(100% - 70px, 65%), transparent 100%);transform-origin:center center;transition:opacity 375ms linear}.hovered::before{background-color:var(--md-ripple-hover-color, var(--md-sys-color-on-surface, #1d1b20));opacity:var(--md-ripple-hover-opacity, 0.08)}.pressed::after{opacity:var(--md-ripple-pressed-opacity, 0.12);transition-duration:105ms} `; /** * @license * Copyright 2022 Google LLC * SPDX-License-Identifier: Apache-2.0 */ let p = class extends h { }; p.styles = [H]; p = a([ y("md-ripple") ], p);