@agnos-ui/core
Version:
Framework-agnostic headless component library.
334 lines (333 loc) • 10.9 kB
TypeScript
import type { TransitionFn } from '../../services/transitions/baseTransitions';
import type { ConfigValidator, Directive, PropsConfig, Widget, WidgetFactory } from '../../types';
import type { WidgetsCommonPropsAndState } from '../commonProps';
/**
* Properties for the Accordion component.
*/
export interface AccordionProps extends WidgetsCommonPropsAndState {
/**
* If `true`, only one accordion-item at the time can stay open.
*
* @defaultValue `false`
*/
closeOthers: boolean;
/**
* An event fired when an item is shown.
*
* Event payload is the id of the item.
*
* @defaultValue
* ```ts
* () => {}
* ```
*/
onItemShown: (itemId: string) => void;
/**
* An event fired when an item is hidden.
*
* Event payload is the id of the item.
*
* @defaultValue
* ```ts
* () => {}
* ```
*/
onItemHidden: (itemId: string) => void;
/**
* If `true`, the accordion-item body container will be removed from the DOM when the accordion-item is collapsed. It will be just hidden otherwise.
*
* @defaultValue `true`
*/
itemDestroyOnHide: boolean;
/**
* If `true`, accordion-item will be animated.
*
* @defaultValue `true`
*/
itemAnimated: boolean;
/**
* The transition to use for the accordion-item body-container when the accordion-item is toggled.
*
* @defaultValue
* ```ts
* () => {}
* ```
*/
itemTransition: TransitionFn;
/**
* CSS classes to add on the accordion-item DOM element.
*
* @defaultValue `''`
*/
itemClassName: string;
/**
* CSS classes to add on the accordion-item header DOM element.
*
* @defaultValue `''`
*/
itemHeaderClassName: string;
/**
* CSS classes to add on the accordion-item toggle button DOM element.
*
* @defaultValue `''`
*/
itemButtonClassName: string;
/**
* CSS classes to add on the accordion-item body container DOM element.
* The accordion-item body container is the DOM element on what the itemTransition is applied.
*
* @defaultValue `''`
*/
itemBodyContainerClassName: string;
/**
* CSS classes to add on the accordion-item body DOM element.
*
* @defaultValue `''`
*/
itemBodyClassName: string;
/**
* The html heading level to use for the accordion-item-header.
*
* @defaultValue `2`
*/
itemHeadingLevel: 1 | 2 | 3 | 4 | 5 | 6;
}
/**
* Represents the state of an Accordion component.
*/
export interface AccordionState extends WidgetsCommonPropsAndState {
/**
* Array containing all the accordion-items contained in the accordion.
*/
itemWidgets: AccordionItemWidget[];
}
/**
* Interface representing the API for an accordion component.
*/
export interface AccordionApi {
/**
* Given the itemId, will expand the corresponding accordion-item.
*
* If the itemId is not valid, nothing will happen.
* @returns A promise that resolves when the expand operation is completed.
*/
expand(itemId: string): Promise<void>;
/**
* Given the itemId, will collapse the corresponding accordion-item.
*
* If the itemId is not valid, nothing will happen.
* @returns A promise that resolves when the collapse operation is completed.
*/
collapse(itemId: string): Promise<void>;
/**
* Given the itemId, will toggle the corresponding accordion-item.
*
* @returns A promise that resolves when the toggle operation is completed.
* If the itemId is not valid, nothing will happen.
*/
toggle(itemId: string): Promise<void>;
/**
* It will expand all the items in the accordion.
*
* If `closeOthers` is `true` it will expand only the last accordion-item.
*
* @returns A promise that resolves when all the expand operations are completed.
*/
expandAll(): Promise<void>;
/**
* It will collapse all the accordion-items in the accordion.
*
* @returns A promise that resolves when all the collapse operations are completed.
*/
collapseAll(): Promise<void>;
/**
* Creates a new accordionItem.
*/
registerItem(itemConfig?: PropsConfig<AccordionItemProps>): AccordionItemWidget;
}
/**
* Interface representing the directives used in the Accordion component.
*/
export interface AccordionDirectives {
/**
* Directive to put on the accordion DOM element
*/
accordionDirective: Directive;
}
/**
* Represents an Accordion widget with specific properties, state, API, and directives.
*/
export type AccordionWidget = Widget<AccordionProps, AccordionState, AccordionApi, AccordionDirectives>;
/**
* Interface representing the API for an accordion item.
*/
export interface AccordionItemApi {
/**
* It will collapse the accordion-item.
* @returns A promise that resolves when the collapse operation is completed.
*/
collapse(): Promise<void>;
/**
* It will expand the accordion-item.
* @returns A promise that resolves when the expand operation is completed.
*/
expand(): Promise<void>;
/**
* It will toggle the accordion-item.
* @returns A promise that resolves when the toggle operation is completed.
*/
toggle(): Promise<void>;
/**
* Method to be called after the initialization to allow animations.
*/
initDone(): void;
}
/**
* Interface representing the directives used in an accordion item.
*/
export interface AccordionItemDirectives {
/**
* Directive to use in special cases, if the accordion header does not use a button element to control the collapsing.
*/
toggleDirective: Directive;
/**
* Directive to put on the button element that will control the collapsing of the accordion-item.
*/
buttonDirective: Directive;
/**
* Directive to put on the accordion-item header that will contain the button element.
*/
headerDirective: Directive;
/**
* Directive to put on the accordion-item body.
*/
bodyDirective: Directive;
/**
* Directive to apply the itemTransition
*/
transitionDirective: Directive;
/**
* Directive to apply aria attributes to the expanded body panel
*/
bodyContainerAttrsDirective: Directive;
/**
* Directive to be put on the accordion-item body container. It will handle the animation.
*/
bodyContainerDirective: Directive;
/**
* Directive to be put on the accordion-item. It will handle adding the accordion-item to the accordion.
*/
itemDirective: Directive;
}
/**
* Interface representing the common properties and state for an accordion item.
*/
interface AccordionItemCommonPropsAndState extends WidgetsCommonPropsAndState {
/**
* If `true`, the accordion-item will be visible (expanded). Otherwise, it will be hidden (collapsed).
*/
visible: boolean;
/**
* If `true`, the accordion-item will be disabled.
* It will not react to user's clicks, but still will be possible to toggle programmatically.
*/
disabled: boolean;
/**
* The id of the accordion-item. It can be used for controlling the accordion-item via the accordion api.
*/
id: string;
/**
* CSS classes to add on the accordion-item header DOM element.
*/
headerClassName: string;
/**
* CSS classes to add on the accordion-item collapse DOM element.
*/
buttonClassName: string;
/**
* CSS classes to add on the accordion-item body container DOM element.
* The accordion-item body container is the DOM element on what the itemTransition is applied.
*/
bodyContainerClassName: string;
/**
* CSS classes to add on the accordion-item body DOM element.
*/
bodyClassName: string;
/**
* The html heading level to use for the accordion-item-header.
*/
headingLevel: 1 | 2 | 3 | 4 | 5 | 6;
}
/**
* Properties for an AccordionItem component.
*/
export interface AccordionItemProps extends AccordionItemCommonPropsAndState {
/**
* If `true`, accordion-item will be animated.
*/
animated: boolean;
/**
* The transition to use for the accordion-item body-container when the accordion-item is toggled.
*/
transition: TransitionFn;
/**
* If `true`, the accordion-item body container will be removed from the DOM when the accordion-item is collapsed. It will be just hidden otherwise.
*/
destroyOnHide: boolean;
/**
* An event fired when an item is shown.
*/
onShown: () => void;
/**
* An event fired when an item is hidden.
*/
onHidden: () => void;
/**
* An event fired when the `visible` value changes.
*
* Event payload is the new value of visible.
*/
onVisibleChange: (visible: boolean) => void;
}
/**
* Represents the state of an accordion item.
*/
export interface AccordionItemState extends AccordionItemCommonPropsAndState {
/**
* If `true` the content of the accordion-item collapse should be in DOM. Its value depends on the
* value of the `visible` and `destroyOnHide`.
*/
shouldBeInDOM: boolean;
}
/**
* Represents a widget for an accordion item.
*/
export type AccordionItemWidget = Widget<AccordionItemProps, AccordionItemState, AccordionItemApi, AccordionItemDirectives>;
/**
* Retrieve a shallow copy of the default accordion config
* @returns the default accordion config
*/
export declare function getAccordionDefaultConfig(): AccordionProps;
/**
* Creates a new AccordionItem widget instance.
* @param config - config of the accordion item, either as a store or as an object containing values or stores.
* @returns a new accordion item widget instance
*/
export declare function createAccordionItem(config?: PropsConfig<AccordionItemProps>): AccordionItemWidget;
/**
* Create an accordion WidgetFactory based on an item factory and the list of item props that should inherit from the parent accordion
*
* @param itemFactory - the item factory
* @param accordionItemProps - the list of item props
* @param accordionConfig - the default accordion config
* @param accordionValidator - the validator of props
* @returns the accordion widget factory
*/
export declare function factoryCreateAccordion(itemFactory?: WidgetFactory<AccordionItemWidget>, accordionItemProps?: string[], accordionConfig?: AccordionProps, accordionValidator?: ConfigValidator<AccordionProps>): WidgetFactory<AccordionWidget>;
/**
* Creates a new Accordion widget instance.
* @param config - config of the accordion, either as a store or as an object containing values or stores.
* @returns a new accordion widget instance
*/
export declare const createAccordion: WidgetFactory<AccordionWidget>;
export {};