@ui-organized/angular-table 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1455 @@
1
+ import * as _ui_organized_table_core from '@ui-organized/table-core';
2
+ import { RowData, BulkSelection, UioTableFeatures, TableRowModel, TableChrome, TableColumn as TableColumn$1, TableSize, TableVariant, SelectionMode, ReorderSetting, VirtualConfig, DataTableQuery, TableEditPatch, ResponsiveConfig, TableFilterCondition, FilterOperatorDef, TableMode, SelectionState, TableFilterType, ConditionDescription, TableFilterFacetOption, FilterOperatorArity, EditState, TableEditContext, DetailState, GridCursor, HorizontalScrollState, ReorderMode, DropSide, TableRowScope, Store, ElementProps, TableHeaderInstance, TableFilterValue } from '@ui-organized/table-core';
3
+ export { DataTableQuery, ReorderSetting, ResponsiveConfig, SelectionMode, TableDateDef, TableDateSetting, TableFilterCondition, TableFilterType, TableMode, TableRowModel, TableRowScope, TableSize, TableVariant, VirtualConfig } from '@ui-organized/table-core';
4
+ import * as _angular_core from '@angular/core';
5
+ import { TemplateRef, Signal, WritableSignal, InjectionToken, Renderer2, OnInit } from '@angular/core';
6
+ import * as _ui_organized_angular from '@ui-organized/angular';
7
+ import { IconName, ButtonIntent, internalGlyph, AccordionItem } from '@ui-organized/angular';
8
+ import { AngularTable, TableState } from '@tanstack/angular-table';
9
+ import { AngularVirtualizer } from '@tanstack/angular-virtual';
10
+ import * as _ui_organized_angular_table from '@ui-organized/angular-table';
11
+ import * as _tanstack_table_core from '@tanstack/table-core';
12
+
13
+ /**
14
+ * Anything Angular will render from a renderer function.
15
+ *
16
+ * The counterpart of React's `ReactNode` in the one place a framework type
17
+ * legitimately enters — a custom cell or edit renderer, which core declares as
18
+ * `unknown` precisely so each adapter can narrow it to its own. A `TemplateRef`
19
+ * is Angular's "a piece of markup you can hand around"; a string is the common
20
+ * case and costs the caller nothing.
21
+ */
22
+ type AngularNode = TemplateRef<unknown> | string | number | null | undefined;
23
+ /** The Angular column type. Identical to core's, with `meta.edit.render` narrowed. */
24
+ type TableColumn<T extends RowData> = TableColumn$1<T>;
25
+ type TableEditRenderer<T extends RowData> = (ctx: TableEditContext<T>) => AngularNode;
26
+ /**
27
+ * A condition a table starts with. `id` is omitted because the table assigns
28
+ * them — deterministically, so baselines and assertions stay stable.
29
+ */
30
+ type TableFilterInput = Omit<TableFilterCondition, "id">;
31
+ /** One filterable column, as the "Add filter" list sees it. */
32
+ interface FilterableField {
33
+ columnId: string;
34
+ label: string;
35
+ type: TableFilterType;
36
+ /** How many conditions already target it. Shown as a suffix in the list. */
37
+ count: number;
38
+ }
39
+ /**
40
+ * ── How this API is reactive ────────────────────────────────────────────────
41
+ *
42
+ * React's `DataTableApi` is a plain object rebuilt on every render, so its
43
+ * fields are values. Angular's factory runs **once**, so anything derived has to
44
+ * arrive as a `Signal` or it is a snapshot of the first frame that never updates
45
+ * again — the single most likely way to port this file wrongly, and one that
46
+ * fails silently: the table renders correctly and then never changes.
47
+ *
48
+ * So the rule is uniform and worth stating once: **derived state is a `Signal`,
49
+ * actions are plain functions.** A template reads `api.rows()` and calls
50
+ * `api.selection.toggle(...)`. Nothing in between is a bare value.
51
+ */
52
+ interface FiltersApi {
53
+ /** Every applied condition, in the order added. What the chips render from. */
54
+ conditions: Signal<TableFilterCondition[]>;
55
+ /** Columns that may be filtered, in menu order. */
56
+ fields: Signal<FilterableField[]>;
57
+ /**
58
+ * Add a condition on a column, starting on its default operator. Returns the
59
+ * id it assigned, so the caller can open that chip's editor immediately.
60
+ */
61
+ add: (columnId: string) => string;
62
+ update: (id: string, patch: Partial<Omit<TableFilterCondition, "id" | "columnId">>) => void;
63
+ /**
64
+ * Move a condition to another column — the chip's field segment. Keeps the
65
+ * operator and value when both columns read them the same way, and starts
66
+ * over on the new column's default otherwise (`retargetCondition`).
67
+ */
68
+ changeField: (id: string, columnId: string) => void;
69
+ /** Put a condition back as it was — Escape in an open editor. */
70
+ restore: (condition: TableFilterCondition) => void;
71
+ remove: (id: string) => void;
72
+ clear: () => void;
73
+ /** The chip's words, decided in core so every adapter agrees. */
74
+ describe: (condition: TableFilterCondition) => ConditionDescription;
75
+ /** The operators a condition's column offers, in menu order. */
76
+ operatorsFor: (condition: TableFilterCondition) => {
77
+ id: string;
78
+ label: string;
79
+ }[];
80
+ /** Enum choices with faceted counts, and whether each would yield nothing. */
81
+ optionsFor: (condition: TableFilterCondition) => TableFilterFacetOption[];
82
+ /** The filter type of a condition's column. Decides which editor renders. */
83
+ typeOf: (condition: TableFilterCondition) => TableFilterType;
84
+ /** How many operands the condition's operator takes. Decides the editor's shape. */
85
+ arityOf: (condition: TableFilterCondition) => FilterOperatorArity;
86
+ /** Chips past the collapse limit are hidden until this is true. */
87
+ expanded: Signal<boolean>;
88
+ setExpanded: (expanded: boolean) => void;
89
+ /**
90
+ * The condition whose editor is open. `add` sets it, so a filter chosen from
91
+ * the header opens for editing without the two components having to know
92
+ * about each other.
93
+ */
94
+ editing: Signal<string | null>;
95
+ setEditing: (id: string | null) => void;
96
+ /** Announced in the live region on add, remove, change and clear. */
97
+ announcement: Signal<string>;
98
+ }
99
+ interface BulkAction<T extends RowData> {
100
+ id: string;
101
+ label: string;
102
+ /** The icon's native name in the active library (`"pencil"`), registered with `registerIcons`. */
103
+ icon?: IconName;
104
+ /** Routes through `AlertDialog` before running. */
105
+ destructive?: boolean;
106
+ /** Confirmation copy. Defaults are derived from `label`. */
107
+ confirm?: {
108
+ title?: string;
109
+ description?: string;
110
+ confirmLabel?: string;
111
+ };
112
+ onRun: (rows: T[], selection: BulkSelection) => void | Promise<void>;
113
+ }
114
+ /**
115
+ * A button in the table's header — "New user", "Import", "Refresh". The table's
116
+ * own actions, as opposed to a row's or a selection's.
117
+ */
118
+ interface TableAction {
119
+ id: string;
120
+ label: string;
121
+ /** The icon's native name in the active library (`"pencil"`), registered with `registerIcons`. */
122
+ icon?: IconName;
123
+ /** Button hierarchy. Defaults to `tertiary` — chrome, not a call to action. */
124
+ intent?: ButtonIntent;
125
+ /** Drop the visible label and keep only the icon. `label` still names it. */
126
+ iconOnly?: boolean;
127
+ disabled?: boolean;
128
+ onRun: () => void | Promise<void>;
129
+ }
130
+ interface RowAction<T extends RowData> {
131
+ id: string;
132
+ label: string;
133
+ /** The icon's native name in the active library (`"pencil"`), registered with `registerIcons`. */
134
+ icon?: IconName;
135
+ destructive?: boolean;
136
+ disabled?: (row: T) => boolean;
137
+ onRun: (row: T) => void | Promise<void>;
138
+ }
139
+ interface DetailConfig<T extends RowData> {
140
+ render: (row: T) => AngularNode;
141
+ /** Sheet title. Defaults to the primary column's value. */
142
+ title?: (row: T) => string;
143
+ description?: (row: T) => string;
144
+ /** Footer actions, rendered after the built-in Close. */
145
+ footer?: (row: T) => AngularNode;
146
+ }
147
+ interface EmptyStateConfig {
148
+ title?: string;
149
+ description?: string;
150
+ action?: AngularNode;
151
+ }
152
+ /**
153
+ * The options, read reactively.
154
+ *
155
+ * Handed to `createDataTable` as a **getter** — `createDataTable(() => ({ ... }))`
156
+ * — so every field is read inside a `computed` and a signal-backed source keeps
157
+ * the table in step. A component built on this passes its own `input()` signals
158
+ * through the getter, which is what `<uio-data-table>` does.
159
+ */
160
+ interface UseDataTableOptions<T extends RowData> {
161
+ data: readonly T[];
162
+ columns: readonly TableColumn<T>[];
163
+ /**
164
+ * The table's accessible name. Required, not optional: it becomes the
165
+ * `<caption>`, and a table announced as "table" and nothing else is the most
166
+ * common data-table accessibility failure there is.
167
+ */
168
+ label: string;
169
+ /** Show the caption instead of hiding it visually. */
170
+ captionVisible?: boolean;
171
+ /**
172
+ * Stable row identity. Selection, inline edit and the detail sheet are keyed
173
+ * by it; without one they follow row *position*, which breaks on every sort.
174
+ */
175
+ getRowId?: (row: T, index: number) => string;
176
+ size?: TableSize;
177
+ variant?: TableVariant;
178
+ selection?: SelectionMode;
179
+ sortable?: boolean;
180
+ filterable?: boolean;
181
+ searchable?: boolean;
182
+ paginated?: boolean;
183
+ pageSize?: number;
184
+ resizable?: boolean;
185
+ /**
186
+ * Lets people rearrange the columns by dragging a header, or with its move
187
+ * buttons (and Alt+Arrow on a focused header). Adds "Reset column order" to
188
+ * the Columns menu.
189
+ *
190
+ * - `true` / `"always"`: movable at any time; the move buttons appear on
191
+ * hover and focus.
192
+ * - `"toggle"`: movable only in a reorder mode, switched from the toolbar.
193
+ *
194
+ * The table's own columns (selection, row actions) and pinned columns stay
195
+ * where they are.
196
+ */
197
+ reorderable?: ReorderSetting;
198
+ hideableColumns?: boolean;
199
+ /** The header's sort button. On by default whenever any column is sortable. */
200
+ sortMenu?: boolean;
201
+ /** Offer CSV download and clipboard copy in the toolbar. */
202
+ exportable?: boolean;
203
+ /** Row virtualization. `true` uses the defaults; an object tunes them. */
204
+ virtual?: boolean | VirtualConfig;
205
+ /** Caps the scroll viewport. A table with no cap cannot scroll or virtualize. */
206
+ maxHeight?: number | string;
207
+ loading?: boolean;
208
+ error?: AngularNode;
209
+ empty?: EmptyStateConfig;
210
+ /** Server-driven mode. Sorting, filtering and pagination stop happening locally. */
211
+ manual?: boolean;
212
+ /** Total matching rows. Required in `manual` mode — the client cannot count. */
213
+ rowCount?: number;
214
+ onQueryChange?: (query: DataTableQuery) => void;
215
+ /** Infinite scroll: fires as the viewport approaches the end of the rows. */
216
+ onLoadMore?: () => void;
217
+ onRowClick?: (row: T) => void;
218
+ onEdit?: (patch: TableEditPatch<T>) => void | Promise<void>;
219
+ rowActions?: RowAction<T>[];
220
+ bulkActions?: BulkAction<T>[];
221
+ /** The table's own actions, rendered in the header row. */
222
+ actions?: TableAction[];
223
+ detail?: DetailConfig<T>;
224
+ responsive?: ResponsiveConfig;
225
+ defaultSorting?: {
226
+ id: string;
227
+ desc: boolean;
228
+ }[];
229
+ defaultColumnVisibility?: Record<string, boolean>;
230
+ /**
231
+ * Conditions the table starts with. Also the only way to render a chip in a
232
+ * static surface — a visual baseline, an axe scan, a jsdom test.
233
+ */
234
+ defaultFilters?: TableFilterInput[];
235
+ /** Extra or replacement operators, including for localizing labels. */
236
+ filterOperators?: FilterOperatorDef[];
237
+ }
238
+ interface SelectionApi<T extends RowData> {
239
+ mode: Signal<SelectionMode>;
240
+ state: Signal<SelectionState>;
241
+ /** Rows the user believes are selected, including the all-matching case. */
242
+ count: Signal<number>;
243
+ /** Rows actually loaded and selected. */
244
+ rows: Signal<T[]>;
245
+ isSelected: (rowId: string) => boolean;
246
+ toggle: (rowId: string, checked: boolean, shift?: boolean) => void;
247
+ togglePage: (checked: boolean) => void;
248
+ selectAllMatching: () => void;
249
+ clear: () => void;
250
+ header: Signal<{
251
+ checked: boolean;
252
+ indeterminate: boolean;
253
+ }>;
254
+ /** True when the page is fully selected and more rows match beyond it. */
255
+ canSelectAllMatching: Signal<boolean>;
256
+ totalMatching: Signal<number>;
257
+ asBulk: () => BulkSelection;
258
+ }
259
+ interface EditApi<T extends RowData> {
260
+ enabled: Signal<boolean>;
261
+ state: Signal<EditState>;
262
+ isEditing: (rowId: string, columnId: string) => boolean;
263
+ start: (row: TableRowModel<T>, columnId: string) => void;
264
+ setValue: (value: unknown) => void;
265
+ commit: () => void;
266
+ cancel: () => void;
267
+ contextFor: (row: TableRowModel<T>, columnId: string) => TableEditContext<T> | null;
268
+ }
269
+ interface DetailApi<T extends RowData> {
270
+ enabled: Signal<boolean>;
271
+ state: Signal<DetailState>;
272
+ row: Signal<T | null>;
273
+ total: Signal<number>;
274
+ open: (rowId: string) => void;
275
+ close: () => void;
276
+ step: (direction: -1 | 1) => void;
277
+ canStep: (direction: -1 | 1) => boolean;
278
+ setDirty: (dirty: boolean) => void;
279
+ /** Answer the "discard unsaved changes?" prompt. */
280
+ resolveConfirm: (discard: boolean) => void;
281
+ }
282
+ interface FocusApi {
283
+ cursor: Signal<GridCursor>;
284
+ /**
285
+ * Follow focus that has already moved. Updates the cursor and takes no focus
286
+ * of its own — which is what keeps it from pulling focus back out of an open
287
+ * inline editor.
288
+ */
289
+ setCursor: (cursor: GridCursor) => void;
290
+ /** Move the cursor and take DOM focus with it. */
291
+ focusCell: (cursor: GridCursor) => void;
292
+ isFocused: (rowIndex: number, colIndex: number) => boolean;
293
+ }
294
+ interface VirtualApi {
295
+ enabled: Signal<boolean>;
296
+ /**
297
+ * The adapter's own proxy, not a signal wrapping one: it is callable — the
298
+ * raw virtualizer is `virtualizer()` — and its `getVirtualItems` and
299
+ * `getTotalSize` are already signals. Wrapping it again would add a `()` that
300
+ * bought nothing.
301
+ */
302
+ virtualizer: AngularVirtualizer<HTMLElement, HTMLElement>;
303
+ spacers: Signal<{
304
+ top: number;
305
+ bottom: number;
306
+ }>;
307
+ }
308
+ /**
309
+ * The viewport's horizontal overflow, live. `overflowing` is false whenever
310
+ * every column fits — which is what lets a scroll control render itself only
311
+ * when there is something to scroll to.
312
+ */
313
+ interface HorizontalScrollApi {
314
+ state: Signal<HorizontalScrollState>;
315
+ /** Move most of a viewport width: `-1` towards the first column, `1` away. */
316
+ by: (direction: -1 | 1) => void;
317
+ }
318
+ /** A header drag in progress: what is moving, and where it would land. */
319
+ interface ColumnDrag {
320
+ source: string;
321
+ target: string | null;
322
+ side: DropSide;
323
+ }
324
+ /** Same members as React's `ReorderApi`, with state as signals. */
325
+ interface ReorderApi {
326
+ /** The `reorderable` setting, resolved. */
327
+ mode: Signal<ReorderMode>;
328
+ /** Columns can be moved right now: always, or inside toggle mode. */
329
+ active: Signal<boolean>;
330
+ /** Enters or leaves reorder mode. Only meaningful when `mode` is `"toggle"`. */
331
+ setActive: (active: boolean) => void;
332
+ /** Visible, not pinned, and not one of the table's own columns. */
333
+ isMovable: (columnId: string) => boolean;
334
+ canMove: (columnId: string, direction: -1 | 1) => boolean;
335
+ /** One place left or right, past the nearest movable visible column. */
336
+ move: (columnId: string, direction: -1 | 1) => void;
337
+ drop: (sourceId: string, targetId: string, side: DropSide) => void;
338
+ drag: Signal<ColumnDrag | null>;
339
+ setDrag: (drag: ColumnDrag | null) => void;
340
+ }
341
+ /** One row as the renderer sees it: the model, plus both of its indices. */
342
+ interface RenderRow<T extends RowData> {
343
+ row: TableRowModel<T>;
344
+ /** The cursor coordinate: where the row sits on the current page. */
345
+ index: number;
346
+ /** What `aria-rowindex` reports: where it sits in the whole dataset. */
347
+ absoluteIndex: number;
348
+ }
349
+ interface DataTableApi<T extends RowData> {
350
+ /**
351
+ * The raw TanStack instance. Exposed deliberately as the escape hatch: every
352
+ * feature the wrapper does not cover is reachable through it, which is what
353
+ * stops a missing prop from being a fork.
354
+ *
355
+ * The *Angular* instance, so its signal-backed atoms come with it. Not a
356
+ * signal — the instance is created once and mutated in place; its reactivity
357
+ * lives in the atoms it holds.
358
+ */
359
+ table: AngularTable<UioTableFeatures, T>;
360
+ /**
361
+ * The controlled state — sorting, pagination, visibility, selection.
362
+ *
363
+ * React's adapter hangs a `state` getter off the table instance; Angular's
364
+ * exposes signal-backed `atoms` instead. It is handed back here rather than
365
+ * reached for on the engine because the table is controlled: these values are
366
+ * the source of truth and the engine is downstream of them.
367
+ */
368
+ state: Signal<Partial<TableState<UioTableFeatures>>>;
369
+ /** The rows to render — the current page, before virtualization. */
370
+ rows: Signal<TableRowModel<T>[]>;
371
+ /** The rows actually rendered, which under virtualization is a window. */
372
+ renderRows: Signal<RenderRow<T>[]>;
373
+ chrome: Signal<TableChrome>;
374
+ options: UseDataTableOptions<T>;
375
+ size: Signal<TableSize>;
376
+ variant: Signal<TableVariant>;
377
+ label: Signal<string>;
378
+ captionVisible: Signal<boolean>;
379
+ interactive: Signal<boolean>;
380
+ mode: Signal<TableMode>;
381
+ loading: Signal<boolean>;
382
+ /** The urgent search value. Bind an input to this, never to the deferred one. */
383
+ search: Signal<string>;
384
+ setSearch: (value: string) => void;
385
+ selection: SelectionApi<T>;
386
+ filters: FiltersApi;
387
+ edit: EditApi<T>;
388
+ detail: DetailApi<T>;
389
+ focus: FocusApi;
390
+ virtual: VirtualApi;
391
+ scroll: HorizontalScrollApi;
392
+ reorder: ReorderApi;
393
+ columnWidths: Signal<Record<string, number>>;
394
+ /**
395
+ * The root and viewport nodes, as writable signals a directive fills in.
396
+ *
397
+ * Angular has no per-element ref callback and `viewChild` cannot reach into a
398
+ * *projected* node, which the viewport is — so `UioTableElementRef` writes
399
+ * into these. A signal rather than a plain field because the resize and
400
+ * scroll observers below are `effect`s that have to re-run when the node
401
+ * arrives.
402
+ */
403
+ rootRef: WritableSignal<HTMLElement | null>;
404
+ viewportRef: WritableSignal<HTMLElement | null>;
405
+ exportCsv: (scope?: TableRowScope) => void;
406
+ copySelection: (scope?: TableRowScope) => Promise<boolean>;
407
+ onGridKeyDown: (event: KeyboardEvent) => void;
408
+ activate: (row: TableRowModel<T>) => void;
409
+ primaryColumnId: Signal<string | undefined>;
410
+ }
411
+
412
+ declare function createDataTable<T extends RowData>(options: () => UseDataTableOptions<T>): DataTableApi<T>;
413
+
414
+ /**
415
+ * Binds one of core's framework-free stores to Angular signals.
416
+ *
417
+ * `@ui-organized/table-core`'s `state.ts` chose `{ getState, subscribe,
418
+ * dispatch }` because it is exactly what React's `useSyncExternalStore` wants —
419
+ * and the shape turns out to cost nothing anywhere else: Vue mirrors it with a
420
+ * `shallowRef`, Svelte with `$state`, and this with a `signal`.
421
+ *
422
+ * The store's two invariants are what make it safe: `getState()` returns the
423
+ * same reference until something actually changes, and a no-op action notifies
424
+ * nobody. So the mirror only ever changes when the state did.
425
+ *
426
+ * `DestroyRef` rather than `ngOnDestroy`, because this is called from an
427
+ * injection context rather than from a class that has lifecycle hooks.
428
+ */
429
+ declare function trackStore<S, A>(store: Store<S, A>): Signal<S>;
430
+
431
+ declare function createDeferred<T>(source: () => T): Signal<T>;
432
+
433
+ /**
434
+ * The styled parts are usable on their own — that is the whole point of layer 2
435
+ * — so they need somewhere to find the table without every one of them taking
436
+ * the api as an input through four levels of markup.
437
+ *
438
+ * An `InjectionToken` on the element injector, which is Angular's spelling of
439
+ * the same arrangement React uses a context object for: the component that owns
440
+ * the table provides it, every part injects it, and a part rendered outside one
441
+ * says so with a message that names the fix.
442
+ */
443
+ declare const UIO_DATA_TABLE: InjectionToken<DataTableApi<any>>;
444
+ /** Providers for a component that owns a table. */
445
+ declare function provideDataTable<T extends RowData>(factory: () => DataTableApi<T>): {
446
+ provide: InjectionToken<DataTableApi<any>>;
447
+ useFactory: () => DataTableApi<T>;
448
+ };
449
+ declare function injectDataTable<T extends RowData = RowData>(): DataTableApi<T>;
450
+ /** For parts that are legitimately optional inside a table (toolbars reused elsewhere). */
451
+ declare function injectOptionalDataTable<T extends RowData = RowData>(): DataTableApi<T> | null;
452
+
453
+ /**
454
+ * The two columns the table adds for itself.
455
+ *
456
+ * They are built here rather than in the factory because their cells render real
457
+ * components — `Checkbox`, `Menu` — and each reads the table from the injector,
458
+ * which works because cells render inside the provider.
459
+ *
460
+ * `flexRenderComponent` rather than a bare component: the Angular adapter's
461
+ * `FlexRender` identifies a component by the wrapper this returns, which is how
462
+ * it tells "a component to mount" from "a string to print". The plan expected
463
+ * this to need hand-rolled `TemplateRef` plumbing; v9's adapter ships it.
464
+ */
465
+ declare function selectionColumn<T extends RowData>(): TableColumn<T>;
466
+ declare function actionsColumn<T extends RowData>(): TableColumn<T>;
467
+
468
+ interface Applied {
469
+ attributes: Set<string>;
470
+ styles: Set<string>;
471
+ }
472
+ declare function applyElementProps(element: HTMLElement, renderer: Renderer2, props: ElementProps, previous: Applied): Applied;
473
+ declare class UioTableProps {
474
+ readonly props: Signal<ElementProps>;
475
+ private readonly host;
476
+ private readonly renderer;
477
+ private applied;
478
+ constructor();
479
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableProps, never>;
480
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UioTableProps, "[uioTableProps]", never, { "props": { "alias": "uioTableProps"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
481
+ }
482
+
483
+ /**
484
+ * Hand an element to a signal when it mounts, and `null` when it goes.
485
+ *
486
+ * React takes a callback ref for the root and the viewport; Vue binds a template
487
+ * ref and watches it; Svelte uses an action. Angular has neither a per-element
488
+ * ref callback nor a `viewChild` that can reach a **projected** node — and the
489
+ * viewport is projected, because `<uio-table-viewport>` is written by the caller
490
+ * inside `<uio-table>`. Writing into the api's own signal is what makes the
491
+ * node's arrival reactive, which the resize and scroll observers need.
492
+ *
493
+ * ```html
494
+ * <div [uioTableElementRef]="table.rootRef">
495
+ * ```
496
+ */
497
+ declare class UioTableElementRef {
498
+ readonly target: _angular_core.InputSignal<WritableSignal<HTMLElement>>;
499
+ private readonly host;
500
+ constructor();
501
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableElementRef, never>;
502
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UioTableElementRef, "[uioTableElementRef]", never, { "target": { "alias": "uioTableElementRef"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
503
+ }
504
+
505
+ /**
506
+ * ── Why the host is the `<span>` ────────────────────────────────────────────
507
+ *
508
+ * Both of these are rendered by `flexRenderComponent`, which creates the
509
+ * component's host element — so the host is a node in the table whether it is
510
+ * wanted or not. Selecting on `span[uioTableSelectCell]` rather than a custom
511
+ * element makes that unavoidable node *be* the hit target React renders, instead
512
+ * of an extra `<uio-table-select-cell>` wrapped around it.
513
+ *
514
+ * The same reasoning as everywhere else in this package: an Angular component
515
+ * always has a host element, so the only way to match React's DOM is to make the
516
+ * host the element React renders.
517
+ */
518
+ /**
519
+ * The header's tri-state checkbox: from empty it selects the rows on screen;
520
+ * from checked or mixed it clears the selection. What the box shows decides
521
+ * the click, not the box's own next state — see `headerToggleTarget`.
522
+ */
523
+ declare class UioTableSelectAllCell {
524
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
525
+ protected readonly selectAllLabel: _angular_core.Signal<string>;
526
+ protected toggle(): void;
527
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableSelectAllCell, never>;
528
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableSelectAllCell, "span[uioTableSelectAllCell]", never, {}, {}, never, never, true, never>;
529
+ }
530
+ /**
531
+ * A row's selection checkbox, with shift-click range selection.
532
+ *
533
+ * Given a `UioCheckbox` with a closed prop API, the wrapper records `shiftKey`
534
+ * from the pointer or keyboard event that *precedes* the change, which the
535
+ * change handler then reads. It needs no change to `@ui-organized/angular`,
536
+ * which is the point: widening a component's API to serve one consumer is how a
537
+ * design system's props turn into a junk drawer.
538
+ */
539
+ declare class UioTableSelectCell {
540
+ readonly rowId: _angular_core.InputSignal<string>;
541
+ readonly rowLabel: _angular_core.InputSignal<string>;
542
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
543
+ private shift;
544
+ protected remember(event: MouseEvent | KeyboardEvent): void;
545
+ protected change(checked: boolean): void;
546
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableSelectCell, never>;
547
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableSelectCell, "span[uioTableSelectCell]", never, { "rowId": { "alias": "rowId"; "required": true; "isSignal": true; }; "rowLabel": { "alias": "rowLabel"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
548
+ }
549
+
550
+ /**
551
+ * The actions column's header: a name for assistive tech and nothing visible.
552
+ *
553
+ * A component rather than a plain string, because the string would be *shown* —
554
+ * a column of ellipsis buttons under a visible "Actions" heading is not what the
555
+ * design draws, and a column with no accessible name at all is worse.
556
+ */
557
+ declare class UioTableActionsHeader {
558
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableActionsHeader, never>;
559
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableActionsHeader, "uio-table-actions-header", never, {}, {}, never, never, true, never>;
560
+ }
561
+
562
+ /**
563
+ * A part that applies core's prop bag to **its own host element**.
564
+ *
565
+ * `UioTableProps` is the directive for the ordinary case — a plain element in
566
+ * someone's template, `<td [uioTableProps]="…">`. It cannot serve a component
567
+ * that computes its own props, because `hostDirectives` exposes the input for
568
+ * *binding* and a component has no way to bind an input to itself.
569
+ *
570
+ * So the parts that own their props extend this instead. Subclasses declare
571
+ * `tableProps` as a `computed` and the effect below keeps the host in step,
572
+ * diffing exactly as the directive does — see `applyElementProps` for why
573
+ * diffing rather than assigning is load-bearing.
574
+ */
575
+ declare abstract class UioTablePropsHost {
576
+ /** The bag this part puts on its own host element. */
577
+ protected abstract readonly tableProps: Signal<ElementProps>;
578
+ private readonly propsHost;
579
+ private readonly propsRenderer;
580
+ constructor();
581
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTablePropsHost, never>;
582
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UioTablePropsHost, never, never, {}, {}, never, never, true, never>;
583
+ }
584
+
585
+ /**
586
+ * The parts, flat-exported — `UioTableHeader`, not `Table.Header`. That is the
587
+ * repo's convention everywhere else (`UioDialogContent`, `UioMenuItem`) and
588
+ * there is no reason for the table to be the exception.
589
+ *
590
+ * The DOM they compose to:
591
+ *
592
+ * <div uioTable> class="data-table" root, size + variant
593
+ * <div uioTableToolbar> …
594
+ * <div uioTableViewport> class="data-table__viewport", then <table>
595
+ * <thead uioTableHeader>
596
+ * <tbody uioTableBody> spacer / rows / spacer
597
+ * <div uioTablePagination>
598
+ *
599
+ * ── Why every part is an attribute directive ────────────────────────────────
600
+ *
601
+ * `@ui-organized/angular` puts its components on the caller's own element
602
+ * (`<button uioButton>`, `<span uioChip>`) rather than on a custom element, and
603
+ * the table has two reasons of its own to do the same. A custom element between
604
+ * `<table>` and `<thead>` is invalid HTML — the browser hoists the `<thead>`
605
+ * straight back out — so `<uio-table-header>` cannot exist at all. And anywhere
606
+ * else, a host element is a DOM node the other three libraries do not render,
607
+ * which the parity gate reports as a difference on every case.
608
+ *
609
+ * So the caller writes the element and the part decorates it. Each one also
610
+ * binds core's prop bag through `UioTablePropsHost` rather than unpacking it
611
+ * field by field — see `../core/element-props.ts` for why that is the whole of
612
+ * Angular's "no prop spread" cost.
613
+ */
614
+ /** The root: size, variant, and the element every part measures itself against. */
615
+ declare class UioTable extends UioTablePropsHost {
616
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
617
+ protected readonly tableProps: _angular_core.Signal<_ui_organized_table_core.ElementProps>;
618
+ private readonly element;
619
+ constructor();
620
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTable, never>;
621
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UioTable, "div[uioTable]", never, {}, {}, never, never, true, never>;
622
+ }
623
+ /**
624
+ * The scroll container and the `<table>` element, which are inseparable: a
625
+ * viewport with two tables in it means nothing, and `<caption>` and `<colgroup>`
626
+ * have to be emitted between them.
627
+ */
628
+ declare class UioTableViewport extends UioTablePropsHost {
629
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
630
+ protected readonly tableProps: _angular_core.Signal<_ui_organized_table_core.ElementProps | {
631
+ style: {
632
+ maxHeight: string | number;
633
+ width?: string | number;
634
+ minWidth?: string | number;
635
+ maxWidth?: string | number;
636
+ height?: string | number;
637
+ minHeight?: string | number;
638
+ left?: string | number;
639
+ right?: string | number;
640
+ top?: string | number;
641
+ position?: "sticky" | "relative" | "absolute" | "static";
642
+ tableLayout?: "fixed" | "auto";
643
+ textAlign?: "left" | "center" | "right" | "start" | "end";
644
+ zIndex?: number;
645
+ transform?: string;
646
+ };
647
+ className?: string;
648
+ role?: string;
649
+ tabIndex?: number;
650
+ id?: string;
651
+ scope?: "col" | "row" | "colgroup" | "rowgroup";
652
+ colSpan?: number;
653
+ hidden?: boolean;
654
+ title?: string;
655
+ }>;
656
+ protected readonly tableAttrs: _angular_core.Signal<_ui_organized_table_core.ElementProps>;
657
+ protected readonly caption: _angular_core.Signal<_ui_organized_table_core.ElementProps>;
658
+ protected readonly columns: _angular_core.Signal<_tanstack_table_core.Column<_ui_organized_table_core.UioTableFeatures, _tanstack_table_core.RowData, unknown>[]>;
659
+ private readonly element;
660
+ constructor();
661
+ protected colProps(columnId: string): _ui_organized_table_core.ElementProps;
662
+ protected onKeyDown(event: KeyboardEvent): void;
663
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableViewport, never>;
664
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableViewport, "div[uioTableViewport]", never, {}, {}, never, ["*"], true, never>;
665
+ }
666
+ declare class UioTableHeader {
667
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
668
+ protected readonly groups: _angular_core.Signal<_tanstack_table_core.HeaderGroup<_ui_organized_table_core.UioTableFeatures, _tanstack_table_core.RowData>[]>;
669
+ protected readonly rowProps: _ui_organized_table_core.ElementProps;
670
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableHeader, never>;
671
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableHeader, "thead[uioTableHeader]", never, {}, {}, never, never, true, never>;
672
+ }
673
+ /**
674
+ * The body, and the four states it decides between on its own.
675
+ *
676
+ * Projected content wins: layer-2 composition is the point of these parts.
677
+ * Otherwise `<tbody uioTableBody>` alone is a complete table body — the error,
678
+ * the loading skeleton, the empty state and the rows are all its business.
679
+ */
680
+ declare class UioTableBody {
681
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
682
+ protected readonly spacers: _angular_core.Signal<{
683
+ top: number;
684
+ bottom: number;
685
+ }>;
686
+ protected readonly state: _angular_core.Signal<"error" | "loading" | "empty" | "rows">;
687
+ protected spacerRow(height: number): _ui_organized_table_core.ElementProps;
688
+ protected spacerCell(height: number): _ui_organized_table_core.ElementProps;
689
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableBody, never>;
690
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableBody, "tbody[uioTableBody]", never, {}, {}, never, ["*"], true, never>;
691
+ }
692
+
693
+ /**
694
+ * Pointer drag and keyboard, on one control.
695
+ *
696
+ * The drag is TanStack's own handler; the keyboard is core's `resizeKeyDown`, so
697
+ * the two cannot drift. It is a `role="separator"` with `aria-valuenow`, which is
698
+ * what makes the column width something a screen reader can report rather than
699
+ * something only a mouse can discover.
700
+ */
701
+ declare class UioTableResizeHandle<T extends RowData> extends UioTablePropsHost {
702
+ readonly header: _angular_core.InputSignal<TableHeaderInstance<T>>;
703
+ protected readonly table: _ui_organized_angular_table.DataTableApi<T>;
704
+ private readonly column;
705
+ private readonly bounds;
706
+ /** Applied to this button by `UioTablePropsHost`. */
707
+ protected readonly tableProps: _angular_core.Signal<_ui_organized_table_core.ElementProps>;
708
+ /** Stops the header's sort button from firing on the same press. */
709
+ protected startResize(event: MouseEvent | TouchEvent): void;
710
+ protected onKeyDown(event: KeyboardEvent): void;
711
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableResizeHandle<any>, never>;
712
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableResizeHandle<any>, "button[uioTableResizeHandle]", never, { "header": { "alias": "header"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
713
+ }
714
+ /** One header cell: the sort control, the roving tab stop, and the resize grip. */
715
+ declare class UioTableHeadCell<T extends RowData> extends UioTablePropsHost {
716
+ protected readonly glyph: typeof internalGlyph;
717
+ readonly header: _angular_core.InputSignal<TableHeaderInstance<T>>;
718
+ readonly index: _angular_core.InputSignal<number>;
719
+ protected readonly table: _ui_organized_angular_table.DataTableApi<T>;
720
+ protected readonly column: _angular_core.Signal<_tanstack_table_core.Column<_ui_organized_table_core.UioTableFeatures, T, any>>;
721
+ protected readonly sortable: _angular_core.Signal<boolean>;
722
+ protected readonly sorted: _angular_core.Signal<false | _tanstack_table_core.SortDirection>;
723
+ protected readonly interactive: _angular_core.Signal<boolean>;
724
+ protected readonly editable: _angular_core.Signal<boolean>;
725
+ protected readonly sortIcon: _angular_core.Signal<"sort-desc" | "sort-asc">;
726
+ private readonly focused;
727
+ protected readonly tabIndex: _angular_core.Signal<0 | -1>;
728
+ /** Applied to this `<th>` by `UioTablePropsHost`. */
729
+ protected readonly tableProps: _angular_core.Signal<_ui_organized_table_core.ElementProps>;
730
+ protected onFocus(): void;
731
+ protected readonly movable: _angular_core.Signal<boolean>;
732
+ protected readonly headerText: _angular_core.Signal<string>;
733
+ protected readonly dragging: _angular_core.Signal<boolean>;
734
+ protected readonly dropSide: _angular_core.Signal<_ui_organized_table_core.DropSide>;
735
+ protected onDragStart(event: DragEvent): void;
736
+ protected onDragOver(event: DragEvent): void;
737
+ protected onDrop(event: DragEvent): void;
738
+ protected onDragEnd(): void;
739
+ /**
740
+ * Re-rendering in the new order moves this header's DOM node, and a moved
741
+ * node drops focus. Put it back on the same button — or on the other one,
742
+ * when this move took the column to the end it pointed at. Only after a
743
+ * keyboard press: a mouse click does not leave focus on the button.
744
+ */
745
+ protected pressMove(direction: -1 | 1, event: MouseEvent, own: HTMLButtonElement, other: HTMLButtonElement): void;
746
+ protected toggleSort(event: Event): void;
747
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableHeadCell<any>, never>;
748
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableHeadCell<any>, "th[uioTableHeadCell]", never, { "header": { "alias": "header"; "required": true; "isSignal": true; }; "index": { "alias": "index"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
749
+ }
750
+
751
+ /**
752
+ * One cell.
753
+ *
754
+ * The identifying column is a real row header, which is what makes a screen
755
+ * reader announce "Ada Lovelace, Role, Engineer" instead of just "Engineer" —
756
+ * so the row picks `th` or `td` and this decorates whichever it wrote. Angular
757
+ * has no dynamic element by name, and a component selector that matched both
758
+ * would be two selectors on one class, so the tag choice lives in the row's
759
+ * template and the behaviour lives here.
760
+ */
761
+ declare class UioTableCell<T extends RowData> extends UioTablePropsHost {
762
+ readonly cell: _angular_core.InputSignal<_tanstack_table_core.Cell_Core<_ui_organized_table_core.UioTableFeatures, T, any>>;
763
+ readonly row: _angular_core.InputSignal<TableRowModel<T>>;
764
+ readonly index: _angular_core.InputSignal<number>;
765
+ readonly rowIndex: _angular_core.InputSignal<number>;
766
+ readonly primary: _angular_core.InputSignal<boolean>;
767
+ protected readonly table: _ui_organized_angular_table.DataTableApi<T>;
768
+ private readonly host;
769
+ protected readonly column: Signal<_tanstack_table_core.Column<_ui_organized_table_core.UioTableFeatures, T, any>>;
770
+ private readonly meta;
771
+ private readonly editable;
772
+ protected readonly editing: Signal<_ui_organized_table_core.TableEditContext<T>>;
773
+ private readonly focused;
774
+ /** Applied to this cell by `UioTablePropsHost`. */
775
+ protected readonly tableProps: Signal<_ui_organized_table_core.ElementProps>;
776
+ protected readonly editorTemplate: Signal<unknown>;
777
+ constructor();
778
+ protected onFocus(): void;
779
+ /**
780
+ * One click opens the editor. The click stops here either way: it must not
781
+ * also activate the row (open its detail sheet), and a click *inside* the open
782
+ * editor must not restart the edit and throw the draft away.
783
+ */
784
+ protected onClick(event: Event): void;
785
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableCell<any>, never>;
786
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableCell<any>, "[uioTableCell]", never, { "cell": { "alias": "cell"; "required": true; "isSignal": true; }; "row": { "alias": "row"; "required": true; "isSignal": true; }; "index": { "alias": "index"; "required": true; "isSignal": true; }; "rowIndex": { "alias": "rowIndex"; "required": true; "isSignal": true; }; "primary": { "alias": "primary"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
787
+ }
788
+ /**
789
+ * One row.
790
+ *
791
+ * React memoizes this on a hand-written nine-field comparator, and threads every
792
+ * value it needs through props so the comparator can see them. Angular needs
793
+ * neither: a signal-driven template updates only what changed, so the row takes
794
+ * what genuinely *varies per row* as inputs and reads the rest from the
795
+ * injector.
796
+ */
797
+ declare class UioTableRow<T extends RowData> extends UioTablePropsHost {
798
+ readonly row: _angular_core.InputSignal<TableRowModel<T>>;
799
+ readonly index: _angular_core.InputSignal<number>;
800
+ readonly absoluteIndex: _angular_core.InputSignal<number>;
801
+ protected readonly table: _ui_organized_angular_table.DataTableApi<T>;
802
+ private readonly host;
803
+ protected readonly cells: Signal<_tanstack_table_core.Cell_Core<_ui_organized_table_core.UioTableFeatures, T, unknown>[]>;
804
+ /** Applied to this `<tr>` by `UioTablePropsHost`. */
805
+ protected readonly tableProps: Signal<_ui_organized_table_core.ElementProps>;
806
+ constructor();
807
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableRow<any>, never>;
808
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableRow<any>, "tr[uioTableRow]", never, { "row": { "alias": "row"; "required": true; "isSignal": true; }; "index": { "alias": "index"; "required": true; "isSignal": true; }; "absoluteIndex": { "alias": "absoluteIndex"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
809
+ }
810
+
811
+ /**
812
+ * Empty, loading and error all live *inside* `<tbody>` rather than replacing the
813
+ * table.
814
+ *
815
+ * Keeping the header on screen keeps the column widths, the scroll position and
816
+ * the filter controls exactly where they were — so clearing a filter that
817
+ * emptied the table does not also move every control the user was about to
818
+ * click.
819
+ */
820
+ declare class UioTableEmpty {
821
+ readonly title: _angular_core.InputSignal<string>;
822
+ readonly description: _angular_core.InputSignal<string>;
823
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
824
+ protected readonly heading: _angular_core.Signal<string>;
825
+ protected readonly detail: _angular_core.Signal<string>;
826
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableEmpty, never>;
827
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableEmpty, "tr[uioTableEmpty]", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
828
+ }
829
+ /**
830
+ * Skeleton rows sized to the real row height, so the table does not resize when
831
+ * the data lands — which is the entire reason to prefer a skeleton to a spinner.
832
+ * (There is no Spinner in the library, which settles it anyway.)
833
+ */
834
+ declare class UioTableLoading {
835
+ readonly rows: _angular_core.InputSignal<number>;
836
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
837
+ protected readonly columns: _angular_core.Signal<_tanstack_table_core.Column<_ui_organized_table_core.UioTableFeatures, _tanstack_table_core.RowData, unknown>[]>;
838
+ protected readonly bars: _angular_core.Signal<number[]>;
839
+ protected readonly barHeight: _angular_core.Signal<10 | 12>;
840
+ protected widthFor(columnId: string): string;
841
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableLoading, never>;
842
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableLoading, "[uioTableLoading]", never, { "rows": { "alias": "rows"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
843
+ }
844
+ declare class UioTableError {
845
+ readonly title: _angular_core.InputSignal<string>;
846
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
847
+ /** The table's `error` option, when it is a plain string. */
848
+ protected readonly message: _angular_core.Signal<string>;
849
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableError, never>;
850
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableError, "tr[uioTableError]", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
851
+ }
852
+
853
+ /**
854
+ * The row above the table: search, filters, and the controls that change what
855
+ * the table shows rather than what it contains.
856
+ *
857
+ * Not a `UioToolbar` — that is a `role="toolbar"` with roving focus, which is
858
+ * right for a cluster of icon buttons and wrong for a row containing a text
859
+ * input.
860
+ *
861
+ * ── Why the controls are inline rather than six exported parts ──────────────
862
+ *
863
+ * React, Vue and Svelte export `TableSearch`, `TableSortMenu`, `TableViewOptions`,
864
+ * `TableExportMenu`, `TableActions` and `TableScrollButtons` separately, and each
865
+ * renders exactly the element it is — a fragment, in effect. **An Angular
866
+ * component always has a host element**, so each of those would put a node in
867
+ * the DOM that the other three do not render, and every parity case would differ.
868
+ *
869
+ * A directive on the caller's element is the usual escape, and it does not work
870
+ * here: these parts configure themselves *from the table* rather than from
871
+ * bindings, so a host directive would need the caller to bind what the part
872
+ * already knows.
873
+ *
874
+ * So Angular's layer 2 is one part coarser here. The toolbar is still a part —
875
+ * `<div uioTableToolbar>` — and everything it composes is still core's decision;
876
+ * what a consumer loses is the ability to reorder the six controls, which the
877
+ * other three allow. Recorded rather than hidden.
878
+ */
879
+ declare class UioTableToolbar {
880
+ protected readonly glyph: typeof internalGlyph;
881
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
882
+ protected readonly searchable: _angular_core.Signal<boolean>;
883
+ protected readonly hideable: _angular_core.Signal<boolean>;
884
+ protected readonly exportable: _angular_core.Signal<boolean>;
885
+ protected readonly filterable: _angular_core.Signal<boolean>;
886
+ protected readonly actions: _angular_core.Signal<TableAction[]>;
887
+ protected readonly scroll: _angular_core.Signal<_ui_organized_table_core.HorizontalScrollState>;
888
+ protected readonly cards: _angular_core.Signal<boolean>;
889
+ protected readonly hasSelection: _angular_core.Signal<boolean>;
890
+ protected readonly reorderToggle: _angular_core.Signal<boolean>;
891
+ /**
892
+ * The export menu's items report through `UioMenu (select)`, not their own:
893
+ * `UioMenuItem` has no `select` output, so `(select)` on an item binds a DOM
894
+ * event that never fires.
895
+ */
896
+ protected runExport(value: string): void;
897
+ protected readonly searchLabel: _angular_core.Signal<string>;
898
+ protected readonly filterFields: _angular_core.Signal<_ui_organized_angular_table.FilterableField[]>;
899
+ protected readonly sortableColumns: _angular_core.Signal<_tanstack_table_core.Column<_ui_organized_table_core.UioTableFeatures, _tanstack_table_core.RowData, unknown>[]>;
900
+ protected readonly toggleable: _angular_core.Signal<_ui_organized_table_core.TableColumnInstance<_tanstack_table_core.RowData>[]>;
901
+ protected readonly sortMenu: _angular_core.Signal<boolean>;
902
+ private readonly activeSort;
903
+ protected readonly activeSortId: _angular_core.Signal<string>;
904
+ protected readonly sortDirection: _angular_core.Signal<"asc" | "desc">;
905
+ protected readonly sortIcon: _angular_core.Signal<_ui_organized_angular.IconGlyph>;
906
+ protected iconOf(action: TableAction): IconName | undefined;
907
+ protected isIconOnly(action: TableAction): boolean;
908
+ protected headerOf(column: {
909
+ id: string;
910
+ columnDef: {
911
+ header?: unknown;
912
+ };
913
+ }): string;
914
+ protected chooseColumn(id: string): void;
915
+ protected chooseDirection(next: string): void;
916
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableToolbar, never>;
917
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableToolbar, "div[uioTableToolbar]", never, {}, {}, never, never, true, never>;
918
+ }
919
+
920
+ /**
921
+ * Focus has to land somewhere deliberate when a chip disappears, or it falls to
922
+ * `<body>` and a keyboard user loses their place entirely.
923
+ */
924
+ declare function focusAfterRemoval(removedId: string): void;
925
+ /**
926
+ * The value half of a condition editor.
927
+ *
928
+ * Which control appears follows from **type and operator together**, never from
929
+ * the type alone — that is the whole point of separating the two. A date column
930
+ * shows one date field for "is before", two for "is between", and a number plus
931
+ * a unit for "is in the last".
932
+ */
933
+ declare class UioTableFilterValueEditor {
934
+ readonly condition: _angular_core.InputSignal<TableFilterCondition>;
935
+ readonly arity: _angular_core.InputSignal<FilterOperatorArity>;
936
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
937
+ protected readonly query: _angular_core.WritableSignal<string>;
938
+ protected readonly BOOLEAN_ITEMS: {
939
+ value: string;
940
+ label: string;
941
+ }[];
942
+ protected readonly UNITS: {
943
+ value: string;
944
+ label: string;
945
+ }[];
946
+ private readonly type;
947
+ /** One switch value rather than nested conditions, which a template cannot nest. */
948
+ protected readonly kind: _angular_core.Signal<"number" | "boolean" | "text" | "date" | "enum" | "none" | "relative-date">;
949
+ private readonly options;
950
+ protected readonly searchable: _angular_core.Signal<boolean>;
951
+ protected readonly listboxOptions: _angular_core.Signal<{
952
+ value: string;
953
+ label: string;
954
+ disabled: boolean;
955
+ }[]>;
956
+ protected readonly selectedValues: _angular_core.Signal<string[]>;
957
+ protected readonly booleanValue: _angular_core.Signal<string>;
958
+ protected numberAt(index: number): number | null;
959
+ protected stringAt(index: number): string;
960
+ private set;
961
+ protected setAt(index: number, value: TableFilterValue): void;
962
+ protected setBoolean(value: string): void;
963
+ protected setSelected(values: string[]): void;
964
+ protected setUnit(unit: string): void;
965
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableFilterValueEditor, never>;
966
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableFilterValueEditor, "[uioTableFilterValueEditor]", never, { "condition": { "alias": "condition"; "required": true; "isSignal": true; }; "arity": { "alias": "arity"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
967
+ }
968
+ /**
969
+ * One condition's value editor (Figma 2298:726): the value, then a rule and a
970
+ * remove. The field and the operator have segments of their own on the chip,
971
+ * so the editor carries only what the value segment opens.
972
+ */
973
+ declare class UioTableFilterEditor {
974
+ protected readonly glyph: typeof internalGlyph;
975
+ readonly condition: _angular_core.InputSignal<TableFilterCondition>;
976
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
977
+ protected readonly arity: _angular_core.Signal<FilterOperatorArity>;
978
+ protected remove(): void;
979
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableFilterEditor, never>;
980
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableFilterEditor, "[uioTableFilterEditor]", never, { "condition": { "alias": "condition"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
981
+ }
982
+ type ChipMenu = "field" | "operator";
983
+ /**
984
+ * One condition, as a segmented chip (Figma 2462:2636): "Name | is greater than
985
+ * | 30". Each segment opens the control for the one parameter it shows — the
986
+ * field menu, the operator menu, the value editor — so changing a filter is one
987
+ * click on the part you mean rather than a trip through a form.
988
+ *
989
+ * Removal lives in the field menu and at the foot of the value editor, not in a
990
+ * dismiss button: a fourth 24px target in a row of segments is a coin-flip on
991
+ * touch, and an operator that takes no value ("is empty") has no value editor to
992
+ * put it in.
993
+ */
994
+ declare class UioTableFilterChip {
995
+ readonly condition: _angular_core.InputSignal<TableFilterCondition>;
996
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
997
+ private readonly editor;
998
+ protected readonly editing: _angular_core.Signal<boolean>;
999
+ private readonly settled;
1000
+ protected readonly open: _angular_core.Signal<boolean>;
1001
+ private readonly host;
1002
+ protected readonly menu: _angular_core.WritableSignal<ChipMenu>;
1003
+ protected readonly description: _angular_core.Signal<_ui_organized_table_core.ConditionDescription>;
1004
+ protected readonly takesValue: _angular_core.Signal<boolean>;
1005
+ protected readonly operators: _angular_core.Signal<{
1006
+ id: string;
1007
+ label: string;
1008
+ }[]>;
1009
+ private snapshot;
1010
+ constructor();
1011
+ protected setOpen(next: boolean): void;
1012
+ protected setMenu(name: ChipMenu, next: boolean): void;
1013
+ protected remove(): void;
1014
+ protected onKeyDown(event: KeyboardEvent): void;
1015
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableFilterChip, never>;
1016
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableFilterChip, "[uioTableFilterChip]", never, { "condition": { "alias": "condition"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1017
+ }
1018
+ /**
1019
+ * The applied filters, on their own line under the header (Figma 2298:362).
1020
+ *
1021
+ * A *summary*, not a control panel: the filter button lives in the header above,
1022
+ * and this line does not exist until the user has actually filtered something. A
1023
+ * bar that is always present and usually empty is chrome that teaches people to
1024
+ * stop looking at it.
1025
+ */
1026
+ declare class UioTableFilters {
1027
+ protected readonly glyph: typeof internalGlyph;
1028
+ private readonly presence;
1029
+ constructor();
1030
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
1031
+ protected readonly conditions: _angular_core.Signal<TableFilterCondition[]>;
1032
+ protected readonly filterFields: _angular_core.Signal<_ui_organized_angular_table.FilterableField[]>;
1033
+ protected readonly render: _angular_core.Signal<boolean>;
1034
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableFilters, never>;
1035
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableFilters, "div[uioTableFilters]", never, {}, {}, never, never, true, never>;
1036
+ }
1037
+
1038
+ /**
1039
+ * Wraps the library's `Pagination`, which takes a page *count* — the conversion
1040
+ * from row count and page size happens here so consumers never do that
1041
+ * arithmetic themselves and get the off-by-one wrong.
1042
+ */
1043
+ declare class UioTablePagination {
1044
+ readonly showPageSize: _angular_core.InputSignal<boolean>;
1045
+ readonly pageSizes: _angular_core.InputSignal<number[]>;
1046
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
1047
+ private readonly pagination;
1048
+ protected readonly pageIndex: _angular_core.Signal<number>;
1049
+ protected readonly pageSize: _angular_core.Signal<number>;
1050
+ protected readonly pageSizeValue: _angular_core.Signal<string>;
1051
+ private readonly total;
1052
+ protected readonly pageCount: _angular_core.Signal<number>;
1053
+ protected readonly status: _angular_core.Signal<string>;
1054
+ protected readonly sizeOptions: _angular_core.Signal<{
1055
+ value: string;
1056
+ label: string;
1057
+ }[]>;
1058
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTablePagination, never>;
1059
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTablePagination, "div[uioTablePagination]", never, { "showPageSize": { "alias": "showPageSize"; "required": false; "isSignal": true; }; "pageSizes": { "alias": "pageSizes"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1060
+ }
1061
+
1062
+ /**
1063
+ * Appears only while something is selected, and then takes the place of the
1064
+ * toolbar's sort, filter and table actions: with rows selected, what to do
1065
+ * with them is the decision in front of the user, so it sits where they were
1066
+ * already looking rather than on a line of its own. The count, and the offer
1067
+ * to select the rows off screen, are in `UioTableSelectionFooter` under the
1068
+ * rows.
1069
+ *
1070
+ * Plain buttons in a labelled group, with no surface of its own. It shares the
1071
+ * toolbar row with the search box, so `role="toolbar"`'s roving focus would
1072
+ * make it the only cluster in that row that Tab skips through. Destructive
1073
+ * actions route through `UioAlertDialog`; "archive 40,000 rows" is not an
1074
+ * undo-able mis-click.
1075
+ */
1076
+ declare class UioTableSelectionBar<T extends RowData> {
1077
+ private readonly presence;
1078
+ constructor();
1079
+ readonly actions: _angular_core.InputSignal<BulkAction<T>[]>;
1080
+ protected readonly table: _ui_organized_angular_table.DataTableApi<T>;
1081
+ protected readonly confirming: _angular_core.WritableSignal<BulkAction<T>>;
1082
+ protected readonly items: _angular_core.Signal<BulkAction<T>[]>;
1083
+ protected readonly count: _angular_core.Signal<number>;
1084
+ private readonly rowsWord;
1085
+ protected readonly confirmTitle: _angular_core.Signal<string>;
1086
+ protected readonly confirmDescription: _angular_core.Signal<string>;
1087
+ protected readonly confirmLabel: _angular_core.Signal<string>;
1088
+ protected iconOf(action: BulkAction<T>): IconName | undefined;
1089
+ private run;
1090
+ protected choose(action: BulkAction<T>): void;
1091
+ protected runConfirmed(): void;
1092
+ protected onOpenChange(open: boolean): void;
1093
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableSelectionBar<any>, never>;
1094
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableSelectionBar<any>, "div[uioTableSelectionBar]", never, { "actions": { "alias": "actions"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1095
+ }
1096
+
1097
+ /**
1098
+ * Enters and leaves reorder mode, for `reorderable: "toggle"`.
1099
+ *
1100
+ * A directive on a `uioButton` rather than a component of its own: React's
1101
+ * toggle is a single `<button>`, and an Angular component would put a host
1102
+ * element around it. So the button is the caller's, and this supplies what it
1103
+ * does and what it is called:
1104
+ *
1105
+ * <button uioButton uioTableReorderToggle #reorder="uioTableReorderToggle"
1106
+ * [intent]="reorder.active() ? 'primary' : 'secondary'">{{ reorder.text() }}</button>
1107
+ *
1108
+ * The label says what a press does next — "Reorder", then "Done" — rather
1109
+ * than carrying a pressed state, so it reads the same to a screen reader as
1110
+ * it does on screen. Render it only while `table.reorder.mode()` is "toggle"
1111
+ * and the table is not in card mode, as the toolbar does.
1112
+ */
1113
+ declare class UioTableReorderToggle {
1114
+ private readonly table;
1115
+ readonly active: _angular_core.Signal<boolean>;
1116
+ readonly text: _angular_core.Signal<"Done" | "Reorder">;
1117
+ protected toggle(): void;
1118
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableReorderToggle, never>;
1119
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UioTableReorderToggle, "button[uioTableReorderToggle]", ["uioTableReorderToggle"], {}, {}, never, never, true, never>;
1120
+ }
1121
+
1122
+ /**
1123
+ * Under the rows: how many are selected, and the offer to select the matching
1124
+ * rows that are not on screen.
1125
+ *
1126
+ * At the bottom rather than in the toolbar, because that is where the user's
1127
+ * eye is once they have ticked down a page — and where the visible rows run
1128
+ * out is where "there are more of these" belongs. The bulk actions stay in the
1129
+ * toolbar (see `UioTableSelectionBar`).
1130
+ *
1131
+ * The offer is a real button, and counts the rows it would *add*: "Select
1132
+ * 99,981 hidden rows" says plainly that the ticks so far only reached what was
1133
+ * visible.
1134
+ */
1135
+ declare class UioTableSelectionFooter {
1136
+ private readonly presence;
1137
+ constructor();
1138
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
1139
+ protected readonly count: _angular_core.Signal<number>;
1140
+ protected readonly countLabel: _angular_core.Signal<string>;
1141
+ protected readonly hiddenLabel: _angular_core.Signal<string>;
1142
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableSelectionFooter, never>;
1143
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableSelectionFooter, "div[uioTableSelectionFooter]", never, {}, {}, never, never, true, never>;
1144
+ }
1145
+
1146
+ /**
1147
+ * The row under the toolbar: what is filtered.
1148
+ *
1149
+ * The selection's bulk actions used to share this line. They now replace the
1150
+ * toolbar's own controls while anything is selected (see `UioTableToolbar`), so
1151
+ * acting on the selection happens in the row the user was already reading.
1152
+ *
1153
+ * It renders nothing at all until there is a filter to show, so an empty row
1154
+ * never takes a slice of the table's `gap` — and nothing in card mode, where
1155
+ * the filter sheet holds them.
1156
+ */
1157
+ declare class UioTableSubBar {
1158
+ private readonly presence;
1159
+ constructor();
1160
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
1161
+ protected readonly render: _angular_core.Signal<boolean>;
1162
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableSubBar, never>;
1163
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableSubBar, "div[uioTableSubBar]", never, {}, {}, never, never, true, never>;
1164
+ }
1165
+
1166
+ /**
1167
+ * Per-row actions, as a menu rather than a row of buttons.
1168
+ *
1169
+ * A menu is one tab stop per row instead of three, which matters a great deal
1170
+ * when there are two hundred rows — and it is the only affordance that survives
1171
+ * card mode unchanged.
1172
+ *
1173
+ * The six menu parts this needs are the ones §E added to `@ui-organized/angular`
1174
+ * before this package could exist.
1175
+ */
1176
+ declare class UioTableRowActions<T extends RowData> {
1177
+ protected readonly glyph: typeof internalGlyph;
1178
+ /** The row the actions operate on. */
1179
+ readonly row: _angular_core.InputSignal<T>;
1180
+ /**
1181
+ * Overrides the table's own `rowActions`. Only needed when the part is used
1182
+ * outside a `<uio-data-table>`.
1183
+ */
1184
+ readonly actions: _angular_core.InputSignal<RowAction<T>[]>;
1185
+ /** Accessible name for the trigger. Defaults to "Row actions". */
1186
+ readonly label: _angular_core.InputSignal<string>;
1187
+ protected readonly table: _ui_organized_angular_table.DataTableApi<T>;
1188
+ protected readonly items: _angular_core.Signal<RowAction<T>[]>;
1189
+ protected run(id: string): void;
1190
+ protected iconOf(action: RowAction<T>): IconName | undefined;
1191
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableRowActions<any>, never>;
1192
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableRowActions<any>, "[uioTableRowActions]", never, { "row": { "alias": "row"; "required": true; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1193
+ }
1194
+
1195
+ /**
1196
+ * One card: the row's title, its controls in the top-right corner, and every
1197
+ * other visible column as a label and value.
1198
+ *
1199
+ * Title first, then the row's controls: the actions menu, and the checkbox
1200
+ * last, in the corner a thumb reaches and where a ticked card is easiest to scan
1201
+ * for down a list.
1202
+ */
1203
+ declare class UioTableCard<T extends RowData> {
1204
+ readonly row: _angular_core.InputSignal<TableRowModel<T>>;
1205
+ readonly index: _angular_core.InputSignal<number>;
1206
+ /** Column ids in card order — `cardFieldOrder`, computed once by the list. */
1207
+ readonly fieldOrder: _angular_core.InputSignal<readonly string[]>;
1208
+ protected readonly table: _ui_organized_angular_table.DataTableApi<T>;
1209
+ private readonly host;
1210
+ protected readonly selected: _angular_core.Signal<boolean>;
1211
+ protected readonly selectable: _angular_core.Signal<boolean>;
1212
+ protected readonly hasActions: _angular_core.Signal<boolean>;
1213
+ protected readonly clickable: _angular_core.Signal<boolean>;
1214
+ private readonly cells;
1215
+ protected readonly primaryCell: _angular_core.Signal<_tanstack_table_core.Cell_Core<_ui_organized_table_core.UioTableFeatures, T, unknown>>;
1216
+ /** The words the card's controls are named with: "Select Ada Lovelace". */
1217
+ protected readonly titleText: _angular_core.Signal<string>;
1218
+ protected readonly fields: _angular_core.Signal<{
1219
+ id: string;
1220
+ cell: _tanstack_table_core.Cell_Core<_ui_organized_table_core.UioTableFeatures, T, unknown>;
1221
+ label: string;
1222
+ }[]>;
1223
+ constructor();
1224
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableCard<any>, never>;
1225
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableCard<any>, "li[uioTableCard]", never, { "row": { "alias": "row"; "required": true; "isSignal": true; }; "index": { "alias": "index"; "required": true; "isSignal": true; }; "fieldOrder": { "alias": "fieldOrder"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1226
+ }
1227
+ /**
1228
+ * Card mode: one card per row, below the breakpoint.
1229
+ *
1230
+ * The table is *replaced*, not hidden — rendering both trees and hiding one with
1231
+ * a container query would double the DOM and defeat virtualization on exactly
1232
+ * the devices that can least afford it. Selection, row actions and the detail
1233
+ * sheet all keep working, because they are table state rather than table markup.
1234
+ *
1235
+ * The host is `display: contents` and the list is inside it, because the list
1236
+ * is a `<ul>` with rows and a `<table>` with the empty state without them, and
1237
+ * an Angular host element cannot change its tag.
1238
+ */
1239
+ declare class UioTableCards {
1240
+ protected readonly table: _ui_organized_angular_table.DataTableApi<RowData>;
1241
+ private readonly list;
1242
+ protected readonly fieldOrder: _angular_core.Signal<string[]>;
1243
+ protected readonly spacers: _angular_core.Signal<{
1244
+ top: number;
1245
+ bottom: number;
1246
+ }>;
1247
+ protected readonly maxHeight: _angular_core.Signal<string>;
1248
+ constructor();
1249
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableCards, never>;
1250
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableCards, "div[uioTableCards]", never, {}, {}, never, never, true, never>;
1251
+ }
1252
+
1253
+ declare class UioTableSortSheet {
1254
+ /** Button label and sheet title. */
1255
+ readonly label: _angular_core.InputSignal<string>;
1256
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
1257
+ protected readonly DIRECTIONS: {
1258
+ value: string;
1259
+ label: string;
1260
+ }[];
1261
+ protected readonly columns: Signal<_tanstack_table_core.Column<_ui_organized_table_core.UioTableFeatures, _tanstack_table_core.RowData, unknown>[]>;
1262
+ protected readonly columnOptions: Signal<{
1263
+ value: string;
1264
+ label: string;
1265
+ }[]>;
1266
+ private readonly sorting;
1267
+ protected readonly count: Signal<number>;
1268
+ protected readonly activeId: Signal<string>;
1269
+ protected readonly direction: Signal<"asc" | "desc">;
1270
+ protected readonly icon: Signal<_ui_organized_angular.IconGlyph>;
1271
+ private readonly sheet;
1272
+ constructor();
1273
+ protected chooseColumn(id: string): void;
1274
+ protected chooseDirection(next: string): void;
1275
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableSortSheet, never>;
1276
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableSortSheet, "[uioTableSortSheet]", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1277
+ }
1278
+ /**
1279
+ * One condition inside a field's section: its relation, its value, and a way
1280
+ * to clear it. The field is the section, so there is no field control.
1281
+ */
1282
+ declare class UioTableFilterSheetCondition {
1283
+ protected readonly glyph: typeof internalGlyph;
1284
+ readonly condition: _angular_core.InputSignal<TableFilterCondition>;
1285
+ readonly fieldLabel: _angular_core.InputSignal<string>;
1286
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
1287
+ protected readonly description: Signal<_ui_organized_table_core.ConditionDescription>;
1288
+ protected readonly arity: Signal<_ui_organized_table_core.FilterOperatorArity>;
1289
+ protected readonly operatorOptions: Signal<{
1290
+ value: string;
1291
+ label: string;
1292
+ }[]>;
1293
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableFilterSheetCondition, never>;
1294
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableFilterSheetCondition, "div[uioTableFilterSheetCondition]", never, { "condition": { "alias": "condition"; "required": true; "isSignal": true; }; "fieldLabel": { "alias": "fieldLabel"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1295
+ }
1296
+ /**
1297
+ * Marks the template for one field's section, so the sheet can hand the
1298
+ * accordion one `TemplateRef` per field. `AccordionItem.content` takes a
1299
+ * template but passes it no context, so the field cannot be a template
1300
+ * variable; a view created from this template keeps the `@for` iteration it
1301
+ * was declared in, and with it the field.
1302
+ */
1303
+ declare class UioTableSheetSection {
1304
+ readonly field: _angular_core.InputSignal<string>;
1305
+ readonly template: TemplateRef<unknown>;
1306
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableSheetSection, never>;
1307
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UioTableSheetSection, "ng-template[uioTableSheetSection]", never, { "field": { "alias": "uioTableSheetSection"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1308
+ }
1309
+ /**
1310
+ * Every filterable field at once, one accordion section each, so filtering on
1311
+ * a phone is "open the field, pick the value" rather than "add a filter,
1312
+ * choose its field, then pick the value".
1313
+ *
1314
+ * Each section edits a real condition. While the sheet is open every field has
1315
+ * at least one, so its editor has something to write to: the sheet adds an
1316
+ * empty draft for any field without one. A draft is an incomplete condition,
1317
+ * which the filter model keeps but never applies, so drafts change nothing
1318
+ * until they are given a value; the badge counts only complete conditions;
1319
+ * and closing the sheet removes the drafts nobody filled in.
1320
+ */
1321
+ declare class UioTableFilterSheet {
1322
+ protected readonly glyph: typeof internalGlyph;
1323
+ /** Button label and sheet title. */
1324
+ readonly label: _angular_core.InputSignal<string>;
1325
+ protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
1326
+ private readonly sheet;
1327
+ private readonly sectionTemplates;
1328
+ protected readonly fields: Signal<_ui_organized_angular_table.FilterableField[]>;
1329
+ protected readonly allFields: Signal<string[]>;
1330
+ private readonly applied;
1331
+ protected readonly count: Signal<number>;
1332
+ private readonly isOpen;
1333
+ /** Sections the user has collapsed or expanded; null until they touch one. */
1334
+ protected readonly expanded: _angular_core.WritableSignal<readonly (string | number)[]>;
1335
+ /**
1336
+ * The accordion's items. The title is the field, and once something is
1337
+ * applied, what it is: "Role: is any of Admin". It has to be one string —
1338
+ * `AccordionItem.title` takes no template — so the summary rides in the
1339
+ * title rather than in a styled line of its own beneath it.
1340
+ */
1341
+ protected readonly sections: Signal<AccordionItem[]>;
1342
+ constructor();
1343
+ protected conditionsOf(columnId: string): TableFilterCondition[];
1344
+ protected onOpenChange(open: boolean): void;
1345
+ /** Only what is applied: the drafts stay, so every section keeps its editor. */
1346
+ protected clearApplied(): void;
1347
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableFilterSheet, never>;
1348
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableFilterSheet, "[uioTableFilterSheet]", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1349
+ }
1350
+
1351
+ /**
1352
+ * Layer 3: the whole table from an input object.
1353
+ *
1354
+ * It composes exactly the parts a consumer would compose by hand — which is the
1355
+ * test of whether layer 2 is real. Anything this does that the parts cannot is a
1356
+ * gap in the parts, not a feature of the wrapper.
1357
+ *
1358
+ * ── Why the inputs are spelled out ──────────────────────────────────────────
1359
+ *
1360
+ * React, Vue and Svelte all hand their whole props object to the composable. An
1361
+ * Angular component has no such object: `input()` is one signal per option, and
1362
+ * the options getter below assembles them. That is the last of the three costs
1363
+ * Angular carries, and it is the cheap one — it costs length, not correctness,
1364
+ * and it buys a properly typed template API in exchange.
1365
+ */
1366
+ declare class UioDataTable<T extends RowData> implements OnInit {
1367
+ readonly data: _angular_core.InputSignal<readonly T[]>;
1368
+ readonly columns: _angular_core.InputSignal<readonly TableColumn<T>[]>;
1369
+ /**
1370
+ * The table's accessible name. Required, not optional: it becomes the
1371
+ * `<caption>`, and a table announced as "table" and nothing else is the most
1372
+ * common data-table accessibility failure there is.
1373
+ */
1374
+ readonly label: _angular_core.InputSignal<string>;
1375
+ readonly captionVisible: _angular_core.InputSignal<boolean>;
1376
+ readonly getRowId: _angular_core.InputSignal<(row: T, index: number) => string>;
1377
+ readonly size: _angular_core.InputSignal<TableSize>;
1378
+ readonly variant: _angular_core.InputSignal<TableVariant>;
1379
+ readonly selection: _angular_core.InputSignal<SelectionMode>;
1380
+ readonly sortable: _angular_core.InputSignal<boolean>;
1381
+ readonly filterable: _angular_core.InputSignal<boolean>;
1382
+ readonly searchable: _angular_core.InputSignal<boolean>;
1383
+ readonly paginated: _angular_core.InputSignal<boolean>;
1384
+ readonly pageSize: _angular_core.InputSignal<number>;
1385
+ readonly resizable: _angular_core.InputSignal<boolean>;
1386
+ /**
1387
+ * Lets people rearrange the columns by dragging a header, or with its move
1388
+ * buttons (and Alt+Arrow on a focused header). Adds "Reset column order" to
1389
+ * the Columns menu.
1390
+ *
1391
+ * - `true` / `"always"`: movable at any time; the move buttons appear on
1392
+ * hover and focus.
1393
+ * - `"toggle"`: movable only in a reorder mode, switched from the toolbar.
1394
+ *
1395
+ * The table's own columns (selection, row actions) and pinned columns stay
1396
+ * where they are.
1397
+ */
1398
+ readonly reorderable: _angular_core.InputSignal<ReorderSetting>;
1399
+ readonly hideableColumns: _angular_core.InputSignal<boolean>;
1400
+ readonly sortMenu: _angular_core.InputSignal<boolean>;
1401
+ readonly exportable: _angular_core.InputSignal<boolean>;
1402
+ readonly virtual: _angular_core.InputSignal<boolean | VirtualConfig>;
1403
+ readonly maxHeight: _angular_core.InputSignal<string | number>;
1404
+ readonly loading: _angular_core.InputSignal<boolean>;
1405
+ readonly error: _angular_core.InputSignal<AngularNode>;
1406
+ readonly empty: _angular_core.InputSignal<EmptyStateConfig>;
1407
+ readonly manual: _angular_core.InputSignal<boolean>;
1408
+ readonly rowCount: _angular_core.InputSignal<number>;
1409
+ readonly onQueryChange: _angular_core.InputSignal<(query: DataTableQuery) => void>;
1410
+ readonly onLoadMore: _angular_core.InputSignal<() => void>;
1411
+ readonly onRowClick: _angular_core.InputSignal<(row: T) => void>;
1412
+ readonly onEdit: _angular_core.InputSignal<(patch: TableEditPatch<T>) => void | Promise<void>>;
1413
+ readonly rowActions: _angular_core.InputSignal<RowAction<T>[]>;
1414
+ readonly bulkActions: _angular_core.InputSignal<BulkAction<T>[]>;
1415
+ readonly actions: _angular_core.InputSignal<TableAction[]>;
1416
+ readonly detail: _angular_core.InputSignal<DetailConfig<T>>;
1417
+ readonly responsive: _angular_core.InputSignal<ResponsiveConfig>;
1418
+ readonly defaultSorting: _angular_core.InputSignal<{
1419
+ id: string;
1420
+ desc: boolean;
1421
+ }[]>;
1422
+ readonly defaultColumnVisibility: _angular_core.InputSignal<Record<string, boolean>>;
1423
+ readonly defaultFilters: _angular_core.InputSignal<TableFilterInput[]>;
1424
+ /** Every input, as the one object the shared factory reads. */
1425
+ private readonly options;
1426
+ private readonly injector;
1427
+ /**
1428
+ * Public because the provider above reads it; not part of the template API.
1429
+ *
1430
+ * Built in `ngOnInit` rather than in a field initialiser, and that is forced
1431
+ * rather than chosen: `createDataTable` reads `data`, `columns` and `label`
1432
+ * immediately — `injectTable` has to construct a table out of them — and a
1433
+ * **required input has no value during construction**. Angular says so
1434
+ * outright (NG0950), and the table simply failed to bootstrap.
1435
+ *
1436
+ * `runInInjectionContext` because `ngOnInit` is not one, and the factory needs
1437
+ * `inject` for `DestroyRef`, `injectTable` and `injectVirtualizer`. The
1438
+ * provider above resolves lazily — a child injects it while the view is being
1439
+ * created, which is after this has run.
1440
+ */
1441
+ private created;
1442
+ /**
1443
+ * Built on first ask rather than in `ngOnInit`, so the order between this
1444
+ * component's lifecycle and a child part's injection stops mattering. Either
1445
+ * way the inputs are set by the time it runs, which is the whole constraint.
1446
+ */
1447
+ ensureApi(): DataTableApi<T>;
1448
+ ngOnInit(): void;
1449
+ protected readonly cards: _angular_core.Signal<boolean>;
1450
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioDataTable<any>, never>;
1451
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioDataTable<any>, "div[uioDataTable]", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "captionVisible": { "alias": "captionVisible"; "required": false; "isSignal": true; }; "getRowId": { "alias": "getRowId"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "selection": { "alias": "selection"; "required": false; "isSignal": true; }; "sortable": { "alias": "sortable"; "required": false; "isSignal": true; }; "filterable": { "alias": "filterable"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "paginated": { "alias": "paginated"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; "hideableColumns": { "alias": "hideableColumns"; "required": false; "isSignal": true; }; "sortMenu": { "alias": "sortMenu"; "required": false; "isSignal": true; }; "exportable": { "alias": "exportable"; "required": false; "isSignal": true; }; "virtual": { "alias": "virtual"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "empty": { "alias": "empty"; "required": false; "isSignal": true; }; "manual": { "alias": "manual"; "required": false; "isSignal": true; }; "rowCount": { "alias": "rowCount"; "required": false; "isSignal": true; }; "onQueryChange": { "alias": "onQueryChange"; "required": false; "isSignal": true; }; "onLoadMore": { "alias": "onLoadMore"; "required": false; "isSignal": true; }; "onRowClick": { "alias": "onRowClick"; "required": false; "isSignal": true; }; "onEdit": { "alias": "onEdit"; "required": false; "isSignal": true; }; "rowActions": { "alias": "rowActions"; "required": false; "isSignal": true; }; "bulkActions": { "alias": "bulkActions"; "required": false; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "detail": { "alias": "detail"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "defaultSorting": { "alias": "defaultSorting"; "required": false; "isSignal": true; }; "defaultColumnVisibility": { "alias": "defaultColumnVisibility"; "required": false; "isSignal": true; }; "defaultFilters": { "alias": "defaultFilters"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof UioTable; inputs: {}; outputs: {}; }]>;
1452
+ }
1453
+
1454
+ export { UIO_DATA_TABLE, UioDataTable, UioTable, UioTableActionsHeader, UioTableBody, UioTableCard, UioTableCards, UioTableCell, UioTableElementRef, UioTableEmpty, UioTableError, UioTableFilterChip, UioTableFilterEditor, UioTableFilterSheet, UioTableFilterSheetCondition, UioTableFilterValueEditor, UioTableFilters, UioTableHeadCell, UioTableHeader, UioTableLoading, UioTablePagination, UioTableProps, UioTableReorderToggle, UioTableResizeHandle, UioTableRow, UioTableRowActions, UioTableSelectAllCell, UioTableSelectCell, UioTableSelectionBar, UioTableSelectionFooter, UioTableSheetSection, UioTableSortSheet, UioTableSubBar, UioTableToolbar, UioTableViewport, actionsColumn, applyElementProps, createDataTable, createDeferred, focusAfterRemoval, injectDataTable, injectOptionalDataTable, provideDataTable, selectionColumn, trackStore };
1455
+ export type { AngularNode, BulkAction, DataTableApi, DetailApi, DetailConfig, EditApi, EmptyStateConfig, FilterableField, FiltersApi, FocusApi, HorizontalScrollApi, RenderRow, RowAction, SelectionApi, TableAction, TableColumn, TableEditRenderer, TableFilterInput, UseDataTableOptions, VirtualApi };