@coveord/plasma-mantine
Version:
A Plasma flavoured Mantine theme
195 lines • 6.75 kB
TypeScript
import { __InputWrapperProps, BoxProps, Factory, MantineSpacing, StylesApiProps } from '@mantine/core';
import { ForwardedRef, ReactNode } from 'react';
import { CustomComponentThemeExtend } from '../../utils/createFactoryComponent.js';
import { CollectionColumnDef } from './CollectionColumn.types.js';
import { CollectionLayout } from './layouts/CollectionLayout.types.js';
/**
* Base props shared by both column-based and children-based patterns
*/
interface BaseCollectionProps<T> extends __InputWrapperProps, BoxProps, StylesApiProps<CollectionFactory> {
/**
* The default value each new item should have
*/
newItem: T | (() => T);
/**
* The list of items to display inside the collection
*
* @default []
*/
value?: T[];
/**
* Defines how each item is uniquely identified. It is highly recommended that you specify this prop to an ID that makes sense.
*
* This method is required when using this component with ReactHookForm.
*
* @see {@link https://react-hook-form.com/api/usefieldarray/} for using a collection with ReactHookForm.
*
* @param originalItem The original item
* @param itemIndex The index of the original item
*/
getItemId?: (originalItem: T, itemIndex: number) => string;
/**
* Unused, has no effect
*/
onFocus?: () => void;
/**
* Function called whenever the value needs to be updated
*
* @param value The whole list of items after the change
*/
onChange?: (value: T[]) => void;
/**
* Function called after an item is removed from the collection using the remove button
*
* @param itemIndex The index of the item that was removed
*/
onRemoveItem?: (itemIndex: number) => void;
/**
* Function that gets called whenever a collection item needs to be reordered
*
* @param payload The origin and destination index of the item to reorder
*/
onReorderItem?: (payload: {
from: number;
to: number;
}) => void;
/**
* Function that gets called when a new item needs to be added to the collection
*
* @param value The value of the item to insert
* @param index The index of the new item to insert
*/
onInsertItem?: (value: T, index: number) => void;
/**
* Whether the collection should have drag and drop behavior enabled
*
* @default false
*/
draggable?: boolean;
/**
* Whether the collection is disabled, or in other words in read only mode
*
* @default false
*/
disabled?: boolean;
/**
* Whether the collection is readOnly. If true, the collection will not allow adding or removing items
*
* @default false
*/
readOnly?: boolean;
/**
* Function that determines if the add item button should be enabled given the current items of the collection.
* The button is always enabled if this props remains undefined
*
* @param values The current items of the collection
*/
allowAdd?: boolean | ((values: T[]) => boolean);
/**
* The label of the add item button
*
* @default "Add item"
*/
addLabel?: ReactNode;
/**
* The tooltip text displayed when hovering over the disabled add item button
*
* @default 'There is already an empty item'
*/
addDisabledTooltip?: string;
/**
* The gap between the collection items
*
* @default 'md'
*/
gap?: MantineSpacing;
/**
* Whether the collection is required. When required is true, the collection will hide the remove button if there is only one item
*
* @default false
*/
required?: boolean;
}
/**
* Collection with column-based layout
*/
interface CollectionWithColumns<T> extends BaseCollectionProps<T> {
/**
* Column definitions for the collection
*/
columns: Array<CollectionColumnDef<T>>;
/**
* Layout component to use for rendering
* @default CollectionLayouts.Horizontal
*/
layout?: CollectionLayout;
/**
* Must not have children when using columns
*/
children?: never;
}
/**
* Collection with legacy children render prop
*/
interface CollectionWithChildren<T> extends BaseCollectionProps<T> {
/**
* A render function called for each item passed in the `value` prop.
*
* @param item The current item's value
* @param index The current item's index
*/
children: (item: T, index: number) => ReactNode;
/**
* Must not have columns when using children
*/
columns?: never;
/**
* Must not have layout when using children
*/
layout?: never;
}
/**
* Collection props - either columns OR children, never both
*/
export type CollectionProps<T> = CollectionWithColumns<T> | CollectionWithChildren<T>;
export type CollectionStylesNames = 'root' | 'item' | 'items' | 'itemDragging' | 'dragHandle' | 'removeButton';
export type CollectionFactory = Factory<{
props: CollectionProps<unknown>;
ref: HTMLDivElement;
stylesNames: CollectionStylesNames;
}>;
export declare const Collection: {
<T>(props: CollectionProps<T> & {
ref?: ForwardedRef<HTMLDivElement>;
}): import("react/jsx-runtime").JSX.Element;
displayName: string;
extend: CustomComponentThemeExtend<{
props: CollectionProps<unknown>;
ref: HTMLDivElement;
stylesNames: CollectionStylesNames;
}>;
Layouts: {
readonly Horizontal: {
({ children }: import("./layouts/shared/layoutConstants.js").LayoutProps): import("react/jsx-runtime").JSX.Element;
Body: <T>(props: import("./layouts/shared/layoutConstants.js").LayoutBodyProps<T> & {
ref?: ForwardedRef<HTMLDivElement>;
}) => import("react/jsx-runtime").JSX.Element;
Header: (props: import("./layouts/shared/layoutConstants.js").LayoutHeaderProps & {
ref?: ForwardedRef<HTMLDivElement>;
}) => import("react/jsx-runtime").JSX.Element;
displayName: string;
};
readonly Vertical: {
({ children }: import("./layouts/shared/layoutConstants.js").LayoutProps): import("react/jsx-runtime").JSX.Element;
Body: <T>(props: import("./layouts/shared/layoutConstants.js").LayoutBodyProps<T> & {
ref?: ForwardedRef<HTMLDivElement>;
}) => import("react/jsx-runtime").JSX.Element;
Header: (_props: import("./layouts/shared/layoutConstants.js").LayoutHeaderProps & {
ref?: ForwardedRef<HTMLDivElement>;
}) => null;
displayName: string;
};
};
};
export {};
//# sourceMappingURL=Collection.d.ts.map