@rivinia/table 0.0.0-stage → 1.0.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,508 @@
1
+ import { CellSpan, SortDirection, SortState, SpanModel, TableRow, TableRowId, TextOverflow } from "@rivinia/table";
2
+ import * as i0 from "@angular/core";
3
+ import { TemplateRef } from "@angular/core";
4
+ /**
5
+ * The column shape the grid READS — a renderer-facing contract, not a copy of
6
+ * the core type.
7
+ *
8
+ * Why not `TableColumn<any>`: that looks like the obvious "some column" type,
9
+ * but it is not a supertype of a real one. Its accessor is
10
+ * `(keyof any & string) | ((row: any) => V)` = `string | …`, and a concrete
11
+ * `keyof Person & string` is narrower, so `TableColumn<Person>` would NOT be
12
+ * assignable to `TableColumn<any>` — a consumer could not pass their own
13
+ * typed columns at all. The same inversion repeats through `SpanContext`.
14
+ *
15
+ * So the callbacks here take `any` as their PARAMETER type (always assignable
16
+ * in both directions) instead of `any` as the type argument. The result is a
17
+ * genuine supertype: every `TableColumn<T>` is assignable to it.
18
+ *
19
+ * The renderer reads `id`, `header`, `accessor`, `format`, `sortable`,
20
+ * `width`, `flex`, `align`, `hidden`, `textOverflow` and `lines`. The rest is
21
+ * declared so a column literal typed as `TableUiColumn[]` can carry the full
22
+ * core vocabulary without an excess-property error: spans are rendered from
23
+ * `[spans]` (not from the column), `comparator` belongs to the core's sorting,
24
+ * and pinning is not implemented by this entry point.
25
+ */
26
+ interface TableUiColumn {
27
+ readonly id: string;
28
+ readonly header?: string;
29
+ readonly accessor?: string | ((row: any) => unknown);
30
+ readonly sortable?: boolean;
31
+ readonly width?: string;
32
+ /** 0 = fixed; > 0 absorbs free space. */
33
+ readonly flex?: number;
34
+ readonly pinned?: 'start' | 'end';
35
+ readonly align?: 'start' | 'center' | 'end';
36
+ readonly format?: (value: any, row: any, locale: string) => string;
37
+ readonly comparator?: (a: any, b: any) => number;
38
+ readonly hidden?: boolean;
39
+ readonly textOverflow?: TextOverflow;
40
+ readonly lines?: number;
41
+ readonly merge?: 'equal' | ((row: any, anchor: any) => boolean);
42
+ readonly colSpan?: number | ((context: any) => number);
43
+ readonly span?: (context: any) => CellSpan | null | undefined;
44
+ }
45
+ /** A row as the grid reads it. `TableRow<T>` has no variance, so this is safe. */
46
+ type TableUiRow = TableRow<any>;
47
+ /** Row height + padding preset. Token values per preset are in the CSS. */
48
+ type TableUiDensity = 'compact' | 'default' | 'comfortable';
49
+ /**
50
+ * The text a grid shows on its own. Everything here is also a `[labels]`
51
+ * override, so an Arabic page gets Arabic text without a second code path.
52
+ */
53
+ interface TableUiLabels {
54
+ /** The grid's accessible name when `[ariaLabel]` is unset. */
55
+ readonly grid: string;
56
+ /** Announced while `[loading]` is true (the skeletons are decorative). */
57
+ readonly loading: string;
58
+ /** Fallback when `[error]` holds something that is not an `Error`/string. */
59
+ readonly error: string;
60
+ /** Used when `[emptyMessage]` is unset. */
61
+ readonly empty: string;
62
+ /** The grid's `aria-describedby`: what the keyboard does. */
63
+ readonly keyboardHelp: string;
64
+ }
65
+ export declare const TABLE_UI_LABELS_EN: TableUiLabels;
66
+ export declare const TABLE_UI_LABELS_AR: TableUiLabels;
67
+ /**
68
+ * What a projected `[rvTableCell]` template receives.
69
+ *
70
+ * `$implicit` is the {@link TableRow} wrapper — the same shape the `rows`
71
+ * input holds — so `let-row` is what the grid itself sees. `data` is the
72
+ * consumer's own object, `value` is the accessor's resolved value BEFORE
73
+ * `format`, and `column` is the column definition. The value is untrusted
74
+ * (`unknown`) because the grid does not know the column's value type.
75
+ *
76
+ * ```html
77
+ * <ng-template rvTableCell="actions" let-row let-data="data">
78
+ * <button (click)="open(row.id)">Open {{ data.number }}</button>
79
+ * </ng-template>
80
+ * ```
81
+ */
82
+ interface TableUiCellContext<T = unknown> {
83
+ readonly $implicit: TableRow<T>;
84
+ /** The same row under a named key, for templates that already destructure. */
85
+ readonly row: TableRow<T>;
86
+ /** The consumer's own object (`row.data`). */
87
+ readonly data: T;
88
+ /** The accessor's value before `column.format`. */
89
+ readonly value: unknown;
90
+ /** The renderer-facing column definition the grid rendered. */
91
+ readonly column: TableUiColumn;
92
+ /** Position inside the rendered page, not the index in the full data set. */
93
+ readonly rowIndex: number;
94
+ }
95
+ /** Payload of `(selectionChange)`: the new set AND which row moved it. */
96
+ interface TableUiSelectionChange<T = unknown> {
97
+ readonly selected: ReadonlySet<TableRowId>;
98
+ /** `null` when no single row caused the change (programmatic or clear-all). */
99
+ readonly row: TableRow<T> | null;
100
+ }
101
+ /** One cell as the template sees it — everything resolved, nothing computed there. */
102
+ interface RenderCell {
103
+ readonly column: TableUiColumn;
104
+ readonly columnIndex: number;
105
+ readonly rowSpan: number;
106
+ readonly colSpan: number;
107
+ readonly spanned: boolean;
108
+ readonly overflow: TextOverflow;
109
+ /** `null` unless the column is a clamp column; drives `--rv-table-clamp-lines`. */
110
+ readonly lines: number | null;
111
+ readonly text: string;
112
+ /** Id of the visually-hidden full-text node, when the cell can be cut off. */
113
+ readonly describedBy: string | null;
114
+ readonly template: TemplateRef<TableUiCellContext> | null;
115
+ readonly context: TableUiCellContext;
116
+ /** Explicit placement, so covered positions leave no auto-flow hole. */
117
+ readonly gridRow: string;
118
+ readonly gridColumn: string;
119
+ }
120
+ interface RenderRow {
121
+ /** The effective row id (`[rowKey]` applied): what selection refers to. */
122
+ readonly id: TableRowId;
123
+ identityValid: boolean;
124
+ readonly row: TableUiRow;
125
+ /** Position inside the rendered page. */
126
+ readonly rowIndex: number;
127
+ /** 1-based position in the FULL data set; the header is row 1. */
128
+ readonly ariaRowIndex: number;
129
+ readonly selected: boolean;
130
+ readonly cells: readonly RenderCell[];
131
+ }
132
+ interface TableUiState {
133
+ readonly kind: 'error' | 'empty';
134
+ readonly message: string;
135
+ }
136
+ /**
137
+ * `<rv-table>` — a `role="grid"` data grid, built from divs on purpose.
138
+ *
139
+ * ## Why not `<table>`
140
+ * An interactive grid is `role="grid"`, not `role="table"`, so the roles have
141
+ * to be written either way. Once they are, a native table adds layout
142
+ * negotiation (`table-layout`), inconsistent sticky headers and no way to span
143
+ * a cell across ROWS without owning the row structure. Divs + CSS grid keep
144
+ * the geometry explicit and the ARIA exact.
145
+ *
146
+ * ## The consumer decides what a cell contains
147
+ * The column list carries geometry and a header; the CELL is either the
148
+ * column's `accessor` (+ optional `format`) or — for an actions column, a
149
+ * badge, an avatar — a projected template keyed by column id:
150
+ *
151
+ * ```html
152
+ * <rv-table [columns]="columns()" [rows]="rows()" [spans]="spans()" selectable>
153
+ * <ng-template rvTableCell="actions" let-row let-data="data">
154
+ * <button type="button" (click)="edit(row.id)">Edit {{ data.number }}</button>
155
+ * </ng-template>
156
+ * </rv-table>
157
+ * ```
158
+ *
159
+ * The table never knows that "actions" means actions: a column with an id and
160
+ * no `accessor` renders only the projected template. A template also WINS over
161
+ * an accessor when both exist — markup is an override, not a second source of
162
+ * truth for the column list (`[columns]` stays the only one).
163
+ *
164
+ * ## Spans
165
+ * `[spans]` is the core's resolved `SpanModel`: only anchors are rendered,
166
+ * covered positions have no element at all (nothing is hidden with a flag), and
167
+ * each anchor is placed on the shared CSS grid with an explicit
168
+ * `grid-row: <start> / span <n>` and `grid-column: <start> / span <n>`. Because
169
+ * the spans are real grid spans, a merged cell survives wrapping rows and
170
+ * needs no height arithmetic. `aria-rowspan` / `aria-colspan` are written only
171
+ * when greater than 1, and every cell carries `aria-colindex` (WAI-ARIA
172
+ * requires it once the grid is not a simple matrix).
173
+ *
174
+ * ## Keyboard
175
+ * One tab stop (roving `tabindex`), moved with the arrows through
176
+ * `spans.move()` — so moving INTO a merged cell lands on its anchor and moving
177
+ * inside one leaves it. Home/End pick the first/last anchor of the row,
178
+ * PageUp/PageDown move a screen, Enter activates the row, Space toggles
179
+ * selection. Horizontal arrows mirror in RTL; vertical ones never do.
180
+ *
181
+ * ## Theming
182
+ * Every colour and shape is read AT THE USE SITE as
183
+ * `var(--rv-table-<part>, var(--rv-<semantic>, <default>))`, so one
184
+ * `:root { --rv-bg: … }` reaches the grid. Nothing is declared on the host, so
185
+ * a token set anywhere on an ancestor wins (the D42/D46 rule).
186
+ * `[density]` only changes the FALLBACK of the size tokens, so an explicit
187
+ * token still wins over the preset.
188
+ *
189
+ * The override surface is documented and stable:
190
+ * classes `.rv-table-scroller`, `.rv-table-grid`, `.rv-table-head`,
191
+ * `.rv-table-head-cell`, `.rv-table-head-button`, `.rv-table-head-label`,
192
+ * `.rv-table-body`, `.rv-table-row`, `.rv-table-cell`, `.rv-table-text`,
193
+ * `.rv-table-sort`, `.rv-table-sort-rank`, `.rv-table-state`,
194
+ * `.rv-table-skeleton`, `.rv-table-sr-only`;
195
+ * hooks `[data-density]`, `[data-loading]`, `[data-sticky]`, `[data-selectable]`
196
+ * on the host, `[data-sortable]`, `[data-sorted]`, `[data-sort-rank]`,
197
+ * `[data-sort-direction]` on a header cell, and `[data-selected]`,
198
+ * `[data-span]`, `[data-align]`, `[data-overflow]`, `[data-row]`, `[data-col]`
199
+ * on a body cell. Component styles are injected at runtime and carry the
200
+ * component's scope attribute, so a plain `.rv-table-cell { … }` in an app
201
+ * stylesheet can lose at equal specificity: scope it as
202
+ * `rv-table .rv-table-cell { … }`, or use the tokens.
203
+ */
204
+ export declare class RiviniaTableComponent {
205
+ private readonly host;
206
+ private readonly scroller;
207
+ private readonly projectedCells;
208
+ /** The columns, in render order. Hidden ones are filtered out, not counted. */
209
+ readonly columns: import("@angular/core").InputSignal<readonly TableUiColumn[]>;
210
+ /** The page's rows (already filtered/sorted/paged by the consumer or core). */
211
+ readonly rows: import("@angular/core").InputSignal<readonly TableUiRow[]>;
212
+ /** The core's resolved span matrix for `rows` + visible columns. */
213
+ readonly spans: import("@angular/core").InputSignal<SpanModel | null>;
214
+ /** While true the grid is `aria-busy`, renders skeletons and no data rows. */
215
+ readonly loading: import("@angular/core").InputSignal<boolean>;
216
+ /**
217
+ * How many skeleton rows to draw. `'auto'` (default) mirrors the rows that
218
+ * are currently rendered, at least one — so the layout does not jump.
219
+ */
220
+ readonly skeletonRows: import("@angular/core").InputSignal<number | "auto">;
221
+ /** A failed load. `null`/`undefined` means "no error". */
222
+ readonly error: import("@angular/core").InputSignal<unknown>;
223
+ /** Text of the empty state. Unset falls back to the locale's label. */
224
+ readonly emptyMessage: import("@angular/core").InputSignal<string | undefined>;
225
+ /**
226
+ * Derives the id used by selection, tracking and `(rowActivate)` from the
227
+ * row's data. Unset uses `TableRow.id`, which is already stable.
228
+ */
229
+ readonly rowKey: import("@angular/core").InputSignal<((row: any) => TableRowId) | undefined>;
230
+ /** Renders row selection: `aria-selected`, Space, and click-to-select. */
231
+ readonly selectable: import("@angular/core").InputSignal<boolean>;
232
+ /**
233
+ * The selected row ids. Two-way: `[(selected)]`. A `Set` (not an array)
234
+ * because every row asks "am I selected?" on every render.
235
+ */
236
+ readonly selected: import("@angular/core").ModelSignal<ReadonlySet<TableRowId>>;
237
+ /**
238
+ * The active sort, highest priority first. Two-way: `[(sort)]`, and the
239
+ * model's own `(sortChange)` fires whenever this component changes it.
240
+ */
241
+ readonly sort: import("@angular/core").ModelSignal<readonly SortState[]>;
242
+ readonly density: import("@angular/core").InputSignal<TableUiDensity>;
243
+ /** Sticks the header to the top of the scroller. */
244
+ readonly stickyHeader: import("@angular/core").InputSignal<boolean>;
245
+ /**
246
+ * The number of rows in the FULL result set, for `aria-rowcount` when the
247
+ * consumer pages on the server. Unset derives it from the rows' `index`,
248
+ * which is exact when the grid renders the whole set.
249
+ */
250
+ readonly totalRows: import("@angular/core").InputSignal<number | undefined>;
251
+ /** Accessible name of the grid (`aria-label`). */
252
+ readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
253
+ /** Overrides for the built-in English/Arabic text. */
254
+ readonly labels: import("@angular/core").InputSignal<Partial<TableUiLabels> | undefined>;
255
+ /** Enter on a focused cell, or a double-click on a row. */
256
+ readonly rowActivate: import("@angular/core").OutputEmitterRef<TableUiRow>;
257
+ /**
258
+ * A row was selected/deselected by the user. The model already carries the
259
+ * new set (`selectedChange`); this output also names the row that moved.
260
+ */
261
+ readonly selectionChange: import("@angular/core").OutputEmitterRef<TableUiSelectionChange<unknown>>;
262
+ protected readonly instructionsId: string;
263
+ private readonly uid;
264
+ protected readonly visibleColumns: import("@angular/core").Signal<TableUiColumn[]>;
265
+ protected readonly columnCount: import("@angular/core").Signal<number>;
266
+ /**
267
+ * The ONE column geometry both the header and the body read.
268
+ *
269
+ * A flex column keeps its declared width as the track's FLOOR
270
+ * (`minmax(<width>, Nfr)`, design §5.2): with `minmax(0, Nfr)` a narrow
271
+ * container would collapse the column to zero and its content would vanish
272
+ * instead of scrolling. Fixed columns are their width, untouched.
273
+ */
274
+ protected readonly columnTemplate: import("@angular/core").Signal<string>;
275
+ /**
276
+ * The grid's intrinsic width, so the scroller actually scrolls instead of
277
+ * squeezing every column. It is the sum of the declared widths — which is
278
+ * why a column width should be a length (`px`, `rem`, `ch`), not `max-content`.
279
+ */
280
+ protected readonly minWidth: import("@angular/core").Signal<string>;
281
+ /**
282
+ * `aria-label` written on the HOST — `<rv-table aria-label="Invoices">` — is
283
+ * the attribute a consumer reaches for first, but the `role="grid"` element
284
+ * lives INSIDE the component, so the attribute would otherwise stop at the
285
+ * host and the grid would keep its fallback name ("Data grid"). Read on every
286
+ * change detection: it is a `getAttribute` call, and a dynamic label belongs
287
+ * on the `[ariaLabel]` input, which is reactive.
288
+ */
289
+ protected get hostLabel(): string | undefined;
290
+ protected readonly effectiveLabels: import("@angular/core").Signal<TableUiLabels>;
291
+ protected readonly locale: import("@angular/core").Signal<string>;
292
+ /** Column id → the consumer's template. Rebuilt only when content changes. */
293
+ private readonly cellTemplates;
294
+ /**
295
+ * Sort lookup by column id: direction plus 1-based priority. One map instead
296
+ * of a linear search per rendered header cell.
297
+ */
298
+ private readonly sortIndex;
299
+ /** The fully resolved view model. Nothing in the template computes. */
300
+ protected readonly renderedRows: import("@angular/core").Signal<readonly RenderRow[]>;
301
+ protected readonly skeletonList: import("@angular/core").Signal<unknown[]>;
302
+ protected readonly state: import("@angular/core").Signal<TableUiState | null>;
303
+ /**
304
+ * The rows that actually have DOM cells. While loading the skeletons replace
305
+ * them, and an error/empty state replaces them too, so the keyboard must not
306
+ * "move" into a row that has no element to focus.
307
+ */
308
+ protected readonly bodyRows: import("@angular/core").Signal<readonly RenderRow[]>;
309
+ /**
310
+ * The header row is row 1 (WAI-ARIA counts the header), so the grid's row
311
+ * count is the data count + 1. `-1` is legal ("unknown"), but a wrong count
312
+ * is worse than an honest one, so `[totalRows]` is the precise answer when
313
+ * the consumer pages on the server.
314
+ */
315
+ protected readonly rowCount: import("@angular/core").Signal<number>;
316
+ /** Row index in the rendered page; `-1` is the header row. */
317
+ private readonly active;
318
+ private pendingFocus;
319
+ /**
320
+ * The active cell, clamped to what is actually rendered. A stale row index
321
+ * (the data shrank) would otherwise leave the grid with no tab stop at all.
322
+ * While loading there are no data cells, so the header is the tab stop.
323
+ */
324
+ protected readonly effectiveActive: import("@angular/core").Signal<{
325
+ row: number;
326
+ column: number;
327
+ }>;
328
+ constructor();
329
+ protected isActive(row: number, column: number): boolean;
330
+ protected isSortable(column: TableUiColumn): boolean;
331
+ protected sortRank(column: TableUiColumn): number;
332
+ protected sortDirection(column: TableUiColumn): SortDirection | null;
333
+ /**
334
+ * `aria-sort` lives on exactly ONE header (the highest-priority sort), as
335
+ * WAI-ARIA requires; secondary sorted columns are shown with a rank badge
336
+ * and announce `none`, because the attribute has no "secondary" value.
337
+ */
338
+ protected ariaSort(column: TableUiColumn): 'ascending' | 'descending' | 'none' | null;
339
+ protected onHeaderClick(column: TableUiColumn, columnIndex: number, event: MouseEvent): void;
340
+ protected rowId(row: TableUiRow): TableRowId;
341
+ protected onRowActivate(item: RenderRow): void;
342
+ /**
343
+ * A double-click is a row activation. It is ignored when it lands on an
344
+ * interactive element inside a projected template: the action the user asked
345
+ * for (Edit, Open, a link) must not also fire the row's own activation.
346
+ */
347
+ protected onRowDoubleClick(item: RenderRow, event: MouseEvent): void;
348
+ protected onCellClick(item: RenderRow, cell: RenderCell, event: MouseEvent): void;
349
+ protected onCellFocus(row: number, column: number): void;
350
+ protected onKeydown(event: KeyboardEvent): void;
351
+ private onHeaderKey;
352
+ private cycleSort;
353
+ /**
354
+ * A page step stays inside the BODY. The header is reachable with ArrowUp,
355
+ * but PageUp from the first data row must not surprise the user by landing on
356
+ * the sort controls; page keys are a data-reading affordance.
357
+ */
358
+ private page;
359
+ private moveBy;
360
+ /** Clamp to the page, then snap onto the anchor of whatever cell is there. */
361
+ private moveTo;
362
+ private firstColumn;
363
+ private lastColumn;
364
+ /** One screen minus one row; 10 when there is no layout to measure (SSR, jsdom). */
365
+ private pageRows;
366
+ private focusCell;
367
+ /**
368
+ * Direction is read from the nearest `[dir]` FIRST, then from computed
369
+ * style: jsdom does not inherit computed direction, and `dir="auto"` needs
370
+ * the computed answer anyway.
371
+ */
372
+ private isRtl;
373
+ private buildCells;
374
+ private readValue;
375
+ private toggleRow;
376
+ private errorText;
377
+ static ɵfac: i0.ɵɵFactoryDeclaration<RiviniaTableComponent, never>;
378
+ static ɵcmp: i0.ɵɵComponentDeclaration<RiviniaTableComponent, "rv-table", never, {
379
+ "columns": {
380
+ "alias": "columns";
381
+ "required": true;
382
+ "isSignal": true;
383
+ };
384
+ "rows": {
385
+ "alias": "rows";
386
+ "required": false;
387
+ "isSignal": true;
388
+ };
389
+ "spans": {
390
+ "alias": "spans";
391
+ "required": false;
392
+ "isSignal": true;
393
+ };
394
+ "loading": {
395
+ "alias": "loading";
396
+ "required": false;
397
+ "isSignal": true;
398
+ };
399
+ "skeletonRows": {
400
+ "alias": "skeletonRows";
401
+ "required": false;
402
+ "isSignal": true;
403
+ };
404
+ "error": {
405
+ "alias": "error";
406
+ "required": false;
407
+ "isSignal": true;
408
+ };
409
+ "emptyMessage": {
410
+ "alias": "emptyMessage";
411
+ "required": false;
412
+ "isSignal": true;
413
+ };
414
+ "rowKey": {
415
+ "alias": "rowKey";
416
+ "required": false;
417
+ "isSignal": true;
418
+ };
419
+ "selectable": {
420
+ "alias": "selectable";
421
+ "required": false;
422
+ "isSignal": true;
423
+ };
424
+ "selected": {
425
+ "alias": "selected";
426
+ "required": false;
427
+ "isSignal": true;
428
+ };
429
+ "sort": {
430
+ "alias": "sort";
431
+ "required": false;
432
+ "isSignal": true;
433
+ };
434
+ "density": {
435
+ "alias": "density";
436
+ "required": false;
437
+ "isSignal": true;
438
+ };
439
+ "stickyHeader": {
440
+ "alias": "stickyHeader";
441
+ "required": false;
442
+ "isSignal": true;
443
+ };
444
+ "totalRows": {
445
+ "alias": "totalRows";
446
+ "required": false;
447
+ "isSignal": true;
448
+ };
449
+ "ariaLabel": {
450
+ "alias": "ariaLabel";
451
+ "required": false;
452
+ "isSignal": true;
453
+ };
454
+ "labels": {
455
+ "alias": "labels";
456
+ "required": false;
457
+ "isSignal": true;
458
+ };
459
+ }, {
460
+ "selected": "selectedChange";
461
+ "sort": "sortChange";
462
+ "rowActivate": "rowActivate";
463
+ "selectionChange": "selectionChange";
464
+ }, ["projectedCells"], ["[rvTableCell]"], true, never>;
465
+ }
466
+ /**
467
+ * `[rvTableCell]="columnId"` — the consumer's renderer for one column.
468
+ *
469
+ * Put it on an `<ng-template>`; the grid never renders the template directly,
470
+ * it asks for it BY COLUMN ID and instantiates it once per row. That is what
471
+ * makes an actions column possible without the table knowing anything about
472
+ * actions: the column list only declares geometry and a header, and the
473
+ * markup decides what a cell contains.
474
+ *
475
+ * ```html
476
+ * <rv-table [columns]="columns()" [rows]="rows()">
477
+ * <ng-template rvTableCell="actions" let-row let-data="data">
478
+ * <button type="button" (click)="edit(data)">Edit</button>
479
+ * </ng-template>
480
+ * </rv-table>
481
+ * ```
482
+ *
483
+ * A column whose id has no template and no `accessor` renders an empty cell,
484
+ * so declare the column for its width/header and supply the template here.
485
+ * The template wins over `accessor` when both exist: markup is an override.
486
+ *
487
+ * The context is {@link TableUiCellContext} — `$implicit` (and `row`) is the
488
+ * `TableRow`, `data` is your object, `value` is the accessor's value.
489
+ */
490
+ export declare class RvTableCell {
491
+ /**
492
+ * The id of the column this template renders. It must match a
493
+ * `TableColumn.id`; an id that matches nothing is simply never used (the
494
+ * grid cannot throw at render time for a template it was given).
495
+ */
496
+ readonly columnId: import("@angular/core").InputSignal<string>;
497
+ /** The template to instantiate. Injected from the `<ng-template>` host. */
498
+ readonly template: TemplateRef<TableUiCellContext>;
499
+ static ɵfac: i0.ɵɵFactoryDeclaration<RvTableCell, never>;
500
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RvTableCell, "[rvTableCell]", never, {
501
+ "columnId": {
502
+ "alias": "rvTableCell";
503
+ "required": true;
504
+ "isSignal": true;
505
+ };
506
+ }, {}, never, never, true, never>;
507
+ }
508
+ export type { TableUiCellContext, TableUiColumn, TableUiDensity, TableUiLabels, TableUiRow, TableUiSelectionChange };