import type { JSX, ValidComponent } from "@solidjs/web"; import { dynamic } from "@solidjs/web"; import { createRenderEffect, omit, untrack } from "solid-js"; import { useCollapsible } from "../../collapsible/create-collapsible.tsx"; import { ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT, ARROW_UP, END, HOME, } from "../../internals/composite/composite-constants.ts"; import { isElementDisabled } from "../../internals/dom/is-element-disabled.ts"; import { mergeRootProps } from "../../internals/merge-root-props"; import { resolveClassStyle } from "../../internals/resolve-class-style"; import type { BaseUIComponentProps, NativeButtonProps, } from "../../internals/types"; import { useButton } from "../../internals/use-button/use-button"; import { type AccordionItemState, useAccordionItemContext, } from "../accordion-item-context.ts"; import { useAccordionRootContext } from "../accordion-root-context.ts"; export interface AccordionTriggerState extends AccordionItemState {} export interface AccordionTriggerProps extends NativeButtonProps, BaseUIComponentProps<"button", AccordionTriggerState> { /** Tag/component to render. Defaults to `"button"`. */ as?: ValidComponent; } const SUPPORTED_KEYS = new Set([ ARROW_DOWN, ARROW_UP, ARROW_RIGHT, ARROW_LEFT, HOME, END, ]); /** * Walk the accordion's registered items and collect the trigger element from * each non-disabled item. Mirrors Base UI React's `getActiveTriggers`. * * Shadow-DOM-safe DOM traversal via `isElementDisabled` from * `src/internals/dom/` (the shadow-DOM-safe helper). `querySelector` is used * to find the trigger within each item — we target `[type="button"]` and * `[role="button"]` so both native and non-native triggers work. */ function getActiveTriggers( accordionItemRefs: Array, ): HTMLElement[] { const output: HTMLElement[] = []; for (const section of accordionItemRefs) { if (!section || isElementDisabled(section)) continue; const trigger = section.querySelector( '[type="button"], [role="button"]', ); if (trigger && !isElementDisabled(trigger)) { output.push(trigger); } } return output; } /** * Button that expands or collapses its item's panel. Renders a `