import type { Component } from "svelte"; import type { SimpleTableProps, SimpleTableConfig, ColumnDef, TableAPI, CellValue, CellRenderer, CellRendererProps, HeaderRenderer, HeaderRendererProps, FooterRendererProps, LoadingStateRendererProps, ErrorStateRendererProps, EmptyStateRendererProps, HeaderDropdownProps, ColumnEditorRowRendererProps, ColumnEditorCustomRendererProps, ColumnEditorConfig, RowButtonProps } from "simple-table-core"; /** * Default `TData` for Svelte props bags / helpers: open records so untyped * object arrays keep assigning to `rows` without `asRows`. * * Prefer typed `rows` / `columns` (`SvelteColumnDef`) so `TData` flows * into renderers and callbacks. Markup inference via `` may be * weaker than React/Solid JSX — typed column/renderer defs still give the demo win. */ export type SvelteDefaultRowData = Record; export interface TableInstance { mount(): void; update(config: Partial): void; destroy(): void; getAPI(): TableAPI; /** Re-measure `width: "auto"` columns after custom renderer DOM is present. */ refitAutoSizeColumns?(): void; } export type SvelteCellRenderer = CellRenderer | Component>; export type SvelteHeaderRenderer = HeaderRenderer | Component>; export type SvelteFooterRenderer = Component; export type SvelteHeaderDropdown = Component; export type SvelteColumnEditorRowRenderer = Component; export type SvelteColumnEditorCustomRenderer = Component; export type SvelteRowButton = Component>; export type SvelteLoadingStateRenderer = Component>; export type SvelteErrorStateRenderer = Component>; export type SvelteEmptyStateRenderer = Component>; export type SvelteIconElement = Component>; export interface SvelteIconsConfig { drag?: SvelteIconElement | HTMLElement | SVGSVGElement | string; expand?: SvelteIconElement | HTMLElement | SVGSVGElement | string; filter?: SvelteIconElement | HTMLElement | SVGSVGElement | string; headerCollapse?: SvelteIconElement | HTMLElement | SVGSVGElement | string; headerExpand?: SvelteIconElement | HTMLElement | SVGSVGElement | string; next?: SvelteIconElement | HTMLElement | SVGSVGElement | string; prev?: SvelteIconElement | HTMLElement | SVGSVGElement | string; sortDown?: SvelteIconElement | HTMLElement | SVGSVGElement | string; sortUp?: SvelteIconElement | HTMLElement | SVGSVGElement | string; pinnedLeftIcon?: SvelteIconElement | HTMLElement | SVGSVGElement | string; pinnedRightIcon?: SvelteIconElement | HTMLElement | SVGSVGElement | string; } export interface SvelteColumnEditorConfig extends Omit { rowRenderer?: SvelteColumnEditorRowRenderer; customRenderer?: SvelteColumnEditorCustomRenderer; } /** * Column definition for `columns`: same column metadata as core * columns, but `cellRenderer` / `headerRenderer` / `children` / `nestedTable` are Svelte-only. */ export interface SvelteColumnDef extends Omit, "cellRenderer" | "headerRenderer" | "children" | "nestedTable"> { cellRenderer?: SvelteCellRenderer; headerRenderer?: SvelteHeaderRenderer; children?: ReadonlyArray>; /** Nested grid; child columns may use a different row type than `TData`. */ nestedTable?: NestedTableSvelteConfig; } export interface SimpleTableSvelteProps extends Omit, "columns" | "footerRenderer" | "emptyStateRenderer" | "errorStateRenderer" | "loadingStateRenderer" | "tableEmptyStateRenderer" | "headerDropdown" | "columnEditorConfig" | "icons" | "rows" | "rowButtons" | "onColumnOrderChange" | "onColumnWidthChange" | "onHeaderEdit" | "onColumnSelect"> { /** Column definitions. */ columns?: ReadonlyArray>; onColumnOrderChange?: (newHeaders: SvelteColumnDef[]) => void; onColumnWidthChange?: (headers: SvelteColumnDef[]) => void; onHeaderEdit?: (header: SvelteColumnDef, newLabel: string) => void; onColumnSelect?: (header: SvelteColumnDef) => void; /** Row data; cast to vanilla `Row[]` inside the adapter. */ rows: readonly TData[]; footerRenderer?: SvelteFooterRenderer; loadingStateRenderer?: SvelteLoadingStateRenderer; errorStateRenderer?: SvelteErrorStateRenderer; emptyStateRenderer?: SvelteEmptyStateRenderer; /** Svelte component (no props) or plain markup — adapter mounts components for the vanilla table slot. */ tableEmptyStateRenderer?: Component | HTMLElement | string | null; headerDropdown?: SvelteHeaderDropdown; columnEditorConfig?: SvelteColumnEditorConfig; icons?: SvelteIconsConfig; /** Per-row action buttons; each entry is a Svelte component rendered into the row's selection column. */ rowButtons?: SvelteRowButton[]; } /** * TData-bound call signatures omitted at nest boundaries so * `SvelteColumnDef[]` assigns under a parent column without casts/`any`. * Child columns stay fully checked at their own declaration site. */ type SvelteColumnDefCallbacks = "cellRenderer" | "headerRenderer" | "children" | "nestedTable" | "comparator" | "exportValueGetter" | "valueFormatter" | "valueGetter" | "quickFilterGetter"; /** Column shape accepted on nested grids — metadata only, no TData-bound callbacks. */ export type NestedSvelteColumnDef = Omit, SvelteColumnDefCallbacks> & { children?: ReadonlyArray; nestedTable?: NestedTableSvelteConfig; }; /** * Nested grid props (no `rows` / inherited state renderers). * Child row shape may differ from the parent column's `TData`. */ export type NestedTableSvelteConfig = Omit & { columns?: ReadonlyArray; }; export type { CellRendererProps, HeaderRendererProps, FooterRendererProps, LoadingStateRendererProps, ErrorStateRendererProps, EmptyStateRendererProps, HeaderDropdownProps, ColumnEditorRowRendererProps, ColumnEditorCustomRendererProps, };