@suds-cli/table 0.0.1-alpha.0 → 0.1.0-alpha.1

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.
package/dist/index.js CHANGED
@@ -1,4 +1,416 @@
1
- export { TableModel } from './model.js';
2
- export { defaultKeyMap } from './keymap.js';
3
- export { defaultStyles } from './styles.js';
1
+ import { borderStyles, Style, width, joinHorizontal, defaultBorderStyle } from '@suds-cli/chapstick';
2
+ import { newBinding, matches } from '@suds-cli/key';
3
+ import { KeyMsg } from '@suds-cli/tea';
4
+
5
+ // src/model.ts
6
+ var defaultKeyMap = {
7
+ lineUp: newBinding({
8
+ keys: ["up", "k"],
9
+ help: { key: "\u2191/k", desc: "up" }
10
+ }),
11
+ lineDown: newBinding({
12
+ keys: ["down", "j"],
13
+ help: { key: "\u2193/j", desc: "down" }
14
+ }),
15
+ pageUp: newBinding({
16
+ keys: ["pgup", "b", "ctrl+u"],
17
+ help: { key: "pgup/b", desc: "page up" }
18
+ }),
19
+ pageDown: newBinding({
20
+ keys: ["pgdown", "f", "ctrl+d"],
21
+ help: { key: "pgdn/f", desc: "page down" }
22
+ }),
23
+ halfPageUp: newBinding({
24
+ keys: ["u"],
25
+ help: { key: "u", desc: "\xBD page up" }
26
+ }),
27
+ halfPageDown: newBinding({
28
+ keys: ["d"],
29
+ help: { key: "d", desc: "\xBD page down" }
30
+ }),
31
+ gotoTop: newBinding({
32
+ keys: ["home", "g"],
33
+ help: { key: "home/g", desc: "go to start" }
34
+ }),
35
+ gotoBottom: newBinding({
36
+ keys: ["end", "G"],
37
+ help: { key: "end/G", desc: "go to end" }
38
+ })
39
+ };
40
+ function defaultStyles() {
41
+ return {
42
+ header: new Style().bold(true).padding(0, 1),
43
+ cell: new Style().padding(0, 1),
44
+ selected: new Style().background("#7D56F4").foreground("#FFFFFF"),
45
+ border: new Style().foreground("#383838"),
46
+ borderStyle: borderStyles.normal
47
+ };
48
+ }
49
+
50
+ // src/model.ts
51
+ var ELLIPSIS = "\u2026";
52
+ function clamp(value, min, max) {
53
+ if (Number.isNaN(value)) return min;
54
+ if (max < min) return min;
55
+ return Math.min(max, Math.max(min, value));
56
+ }
57
+ function clampOffset(offset, rowCount, height, cursor) {
58
+ if (height <= 0) return 0;
59
+ const maxOffset = Math.max(0, rowCount - height);
60
+ let nextOffset = clamp(offset, 0, maxOffset);
61
+ if (cursor < nextOffset) {
62
+ nextOffset = cursor;
63
+ } else if (cursor >= nextOffset + height) {
64
+ nextOffset = Math.max(0, cursor - height + 1);
65
+ }
66
+ return nextOffset;
67
+ }
68
+ function truncateWithEllipsis(text, width$1) {
69
+ const target = Math.max(0, width$1);
70
+ if (target === 0) return "";
71
+ if (width(text) <= target) return text;
72
+ if (target === 1) return ELLIPSIS;
73
+ let acc = "";
74
+ for (const ch of text) {
75
+ if (width(acc + ch) >= target) {
76
+ break;
77
+ }
78
+ acc += ch;
79
+ if (width(acc) === target - 1) {
80
+ break;
81
+ }
82
+ }
83
+ return `${acc}${ELLIPSIS}`;
84
+ }
85
+ function padToWidth(input, width$1) {
86
+ const current = width(input);
87
+ const missing = Math.max(0, width$1 - current);
88
+ return `${input}${" ".repeat(missing)}`;
89
+ }
90
+ function calculateColumnWidths(columns, totalWidth, bordered) {
91
+ const borderWidth = bordered ? columns.length + 1 : 0;
92
+ const available = Math.max(0, totalWidth - borderWidth);
93
+ const fixed = columns.map((c) => Math.max(0, c.width));
94
+ const totalFixed = fixed.reduce((a, b) => a + b, 0);
95
+ if (totalFixed > available && totalFixed > 0) {
96
+ const scale = available / totalFixed;
97
+ return fixed.map((w) => Math.max(0, Math.floor(w * scale)));
98
+ }
99
+ return fixed;
100
+ }
101
+ function mergeKeyMap(base, overrides) {
102
+ return {
103
+ lineUp: overrides?.lineUp ?? base.lineUp,
104
+ lineDown: overrides?.lineDown ?? base.lineDown,
105
+ pageUp: overrides?.pageUp ?? base.pageUp,
106
+ pageDown: overrides?.pageDown ?? base.pageDown,
107
+ halfPageUp: overrides?.halfPageUp ?? base.halfPageUp,
108
+ halfPageDown: overrides?.halfPageDown ?? base.halfPageDown,
109
+ gotoTop: overrides?.gotoTop ?? base.gotoTop,
110
+ gotoBottom: overrides?.gotoBottom ?? base.gotoBottom
111
+ };
112
+ }
113
+ function mergeStyles(overrides, borderStyleOverride) {
114
+ const base = defaultStyles();
115
+ const merged = {
116
+ ...base,
117
+ ...overrides
118
+ };
119
+ if (borderStyleOverride) {
120
+ merged.borderStyle = borderStyleOverride;
121
+ } else if (!merged.borderStyle) {
122
+ merged.borderStyle = defaultBorderStyle;
123
+ }
124
+ return merged;
125
+ }
126
+ function totalColumnWidth(columns, bordered) {
127
+ const base = columns.reduce((sum, col) => sum + Math.max(0, col.width), 0);
128
+ return bordered ? base + Math.max(0, columns.length - 1) : base;
129
+ }
130
+ function fixedWidthCell(text, width) {
131
+ if (width <= 0) return "";
132
+ const truncated = truncateWithEllipsis(text, width);
133
+ return new Style().width(width).maxWidth(width).alignHorizontal("left").inline(true).render(truncated);
134
+ }
135
+ function wrapWithBorder(line, innerWidth, styles) {
136
+ const width = Math.max(0, innerWidth);
137
+ const padded = padToWidth(line, width);
138
+ const wrapped = `${styles.borderStyle.left}${padded}${styles.borderStyle.right}`;
139
+ return styles.border.render(wrapped);
140
+ }
141
+ function renderTopBorder(innerWidth, styles) {
142
+ const line = `${styles.borderStyle.topLeft}${styles.borderStyle.top.repeat(Math.max(0, innerWidth))}${styles.borderStyle.topRight}`;
143
+ return styles.border.render(line);
144
+ }
145
+ function renderSeparator(innerWidth, styles) {
146
+ const line = `${styles.borderStyle.left}${styles.borderStyle.top.repeat(Math.max(0, innerWidth))}${styles.borderStyle.right}`;
147
+ return styles.border.render(line);
148
+ }
149
+ function renderBottomBorder(innerWidth, styles) {
150
+ const line = `${styles.borderStyle.bottomLeft}${styles.borderStyle.bottom.repeat(Math.max(0, innerWidth))}${styles.borderStyle.bottomRight}`;
151
+ return styles.border.render(line);
152
+ }
153
+ var TableModel = class _TableModel {
154
+ columns;
155
+ rows;
156
+ cursor;
157
+ offset;
158
+ focused;
159
+ height;
160
+ width;
161
+ autoWidth;
162
+ keyMap;
163
+ styles;
164
+ bordered;
165
+ columnWidths;
166
+ constructor(state) {
167
+ this.columns = state.columns;
168
+ this.rows = state.rows;
169
+ this.cursor = state.cursor;
170
+ this.offset = state.offset;
171
+ this.focused = state.focused;
172
+ this.height = state.height;
173
+ this.width = state.width;
174
+ this.autoWidth = state.autoWidth;
175
+ this.keyMap = state.keyMap;
176
+ this.styles = state.styles;
177
+ this.bordered = state.bordered;
178
+ this.columnWidths = state.columnWidths;
179
+ }
180
+ /** Create a new table model. */
181
+ static new(options) {
182
+ const rows = [...options.rows ?? []];
183
+ const bordered = options.bordered ?? false;
184
+ const styles = mergeStyles(options.styles, options.borderStyle);
185
+ const width = options.width ?? totalColumnWidth(options.columns, bordered) ?? 0;
186
+ const autoWidth = options.width === void 0;
187
+ const height = Math.max(0, options.height ?? rows.length);
188
+ const columnWidths = autoWidth ? options.columns.map((c) => Math.max(0, c.width)) : calculateColumnWidths(options.columns, width, bordered);
189
+ const cursor = clamp(
190
+ options.focused ? 0 : 0,
191
+ 0,
192
+ Math.max(rows.length - 1, 0)
193
+ );
194
+ const offset = clampOffset(0, rows.length, height, cursor);
195
+ return new _TableModel({
196
+ columns: [...options.columns],
197
+ rows,
198
+ cursor,
199
+ offset,
200
+ focused: options.focused ?? false,
201
+ height,
202
+ width,
203
+ autoWidth,
204
+ keyMap: mergeKeyMap(defaultKeyMap, options.keyMap),
205
+ styles,
206
+ bordered,
207
+ columnWidths
208
+ });
209
+ }
210
+ /** Tea init hook (no-op). */
211
+ init() {
212
+ return null;
213
+ }
214
+ /** Handle key messages when focused. */
215
+ update(msg) {
216
+ if (!this.focused || !(msg instanceof KeyMsg)) {
217
+ return [this, null];
218
+ }
219
+ if (matches(msg, this.keyMap.lineUp)) {
220
+ return [this.moveUp(1), null];
221
+ }
222
+ if (matches(msg, this.keyMap.lineDown)) {
223
+ return [this.moveDown(1), null];
224
+ }
225
+ if (matches(msg, this.keyMap.pageUp)) {
226
+ return [this.moveUp(this.height || 1), null];
227
+ }
228
+ if (matches(msg, this.keyMap.pageDown)) {
229
+ return [this.moveDown(this.height || 1), null];
230
+ }
231
+ if (matches(msg, this.keyMap.halfPageUp)) {
232
+ return [this.moveUp(Math.max(1, Math.floor(this.height / 2))), null];
233
+ }
234
+ if (matches(msg, this.keyMap.halfPageDown)) {
235
+ return [this.moveDown(Math.max(1, Math.floor(this.height / 2))), null];
236
+ }
237
+ if (matches(msg, this.keyMap.gotoTop)) {
238
+ return [this.gotoTop(), null];
239
+ }
240
+ if (matches(msg, this.keyMap.gotoBottom)) {
241
+ return [this.gotoBottom(), null];
242
+ }
243
+ return [this, null];
244
+ }
245
+ /** Render the header and visible rows as a string. */
246
+ view() {
247
+ const header = this.renderHeader();
248
+ const headerWidth = width(header);
249
+ const start = this.offset;
250
+ const end = Math.min(start + this.height, this.rows.length);
251
+ const visibleRows = this.renderAllRows().slice(start, end);
252
+ const paddedRows = [...visibleRows];
253
+ while (paddedRows.length < this.height) {
254
+ paddedRows.push(this.renderEmptyRow());
255
+ }
256
+ const rowWidth = paddedRows.length > 0 ? width(paddedRows[0] ?? "") : 0;
257
+ const innerWidth = Math.max(headerWidth, rowWidth);
258
+ if (!this.bordered) {
259
+ return [
260
+ padToWidth(header, innerWidth),
261
+ ...paddedRows.map((r) => padToWidth(r, innerWidth))
262
+ ].join("\n");
263
+ }
264
+ const wrap = (line) => wrapWithBorder(line, innerWidth, this.styles);
265
+ return [
266
+ renderTopBorder(innerWidth, this.styles),
267
+ wrap(padToWidth(header, innerWidth)),
268
+ renderSeparator(innerWidth, this.styles),
269
+ ...paddedRows.map((r) => wrap(padToWidth(r, innerWidth))),
270
+ renderBottomBorder(innerWidth, this.styles)
271
+ ].join("\n");
272
+ }
273
+ /** Current selected row, if any. */
274
+ selectedRow() {
275
+ if (this.rows.length === 0) return void 0;
276
+ return this.rows[this.cursor];
277
+ }
278
+ /** Current selected index. */
279
+ selectedIndex() {
280
+ return this.cursor;
281
+ }
282
+ /** Replace columns. */
283
+ setColumns(columns) {
284
+ return this.with({
285
+ columns: [...columns]
286
+ });
287
+ }
288
+ /** Replace rows. */
289
+ setRows(rows) {
290
+ return this.with({
291
+ rows: [...rows]
292
+ });
293
+ }
294
+ /** Append a single row. */
295
+ appendRow(row) {
296
+ return this.setRows([...this.rows, row]);
297
+ }
298
+ /** Remove a row by index. */
299
+ removeRow(index) {
300
+ if (index < 0 || index >= this.rows.length) return this;
301
+ const next = [...this.rows];
302
+ next.splice(index, 1);
303
+ return this.setRows(next);
304
+ }
305
+ /** Set the selected index (clamped). */
306
+ setSelectedIndex(index) {
307
+ return this.with({ cursor: index });
308
+ }
309
+ /** Move the cursor up by n rows. */
310
+ moveUp(n = 1) {
311
+ const delta = Math.max(1, n);
312
+ return this.with({ cursor: this.cursor - delta });
313
+ }
314
+ /** Move the cursor down by n rows. */
315
+ moveDown(n = 1) {
316
+ const delta = Math.max(1, n);
317
+ return this.with({ cursor: this.cursor + delta });
318
+ }
319
+ /** Jump to the first row. */
320
+ gotoTop() {
321
+ return this.with({ cursor: 0 });
322
+ }
323
+ /** Jump to the last row. */
324
+ gotoBottom() {
325
+ return this.with({ cursor: this.rows.length - 1 });
326
+ }
327
+ /** Focus the table. */
328
+ focus() {
329
+ if (this.focused) return this;
330
+ return this.with({ focused: true });
331
+ }
332
+ /** Blur the table. */
333
+ blur() {
334
+ if (!this.focused) return this;
335
+ return this.with({ focused: false });
336
+ }
337
+ /** Set the visible height (rows). */
338
+ setHeight(height) {
339
+ return this.with({ height });
340
+ }
341
+ /** Set the total width. */
342
+ setWidth(width) {
343
+ return this.with({ width });
344
+ }
345
+ renderHeader() {
346
+ const cells = this.columns.map((col, i) => {
347
+ const width = this.columnWidths[i] ?? col.width;
348
+ const fixedCell = fixedWidthCell(col.title, width);
349
+ return this.styles.header.render(fixedCell);
350
+ });
351
+ return joinHorizontal(...cells);
352
+ }
353
+ renderRow(row, index) {
354
+ const isSelected = this.focused && index === this.cursor;
355
+ const cells = this.columns.map((col, i) => {
356
+ const width = this.columnWidths[i] ?? col.width;
357
+ const value = row[i] ?? "";
358
+ const fixedCell = fixedWidthCell(value, width);
359
+ return this.styles.cell.render(fixedCell);
360
+ });
361
+ const joined = joinHorizontal(...cells);
362
+ if (isSelected) {
363
+ return this.styles.selected.render(joined);
364
+ }
365
+ return joined;
366
+ }
367
+ renderEmptyRow() {
368
+ const cells = this.columns.map((col, i) => {
369
+ const width = this.columnWidths[i] ?? col.width;
370
+ const fixedCell = fixedWidthCell("", width);
371
+ return this.styles.cell.render(fixedCell);
372
+ });
373
+ return joinHorizontal(...cells);
374
+ }
375
+ renderAllRows() {
376
+ return this.rows.map((row, i) => this.renderRow(row, i));
377
+ }
378
+ with(patch) {
379
+ const nextColumns = patch.columns ?? this.columns;
380
+ const nextRows = patch.rows ?? this.rows;
381
+ const nextHeight = patch.height ?? this.height;
382
+ const nextWidth = patch.width ?? this.width;
383
+ const autoWidth = patch.width !== void 0 ? false : this.autoWidth;
384
+ const nextBordered = patch.bordered ?? this.bordered;
385
+ const nextColumnWidths = autoWidth ? nextColumns.map((c) => Math.max(0, c.width)) : calculateColumnWidths(nextColumns, nextWidth, nextBordered);
386
+ const cursor = clamp(
387
+ patch.cursor ?? this.cursor,
388
+ 0,
389
+ Math.max(nextRows.length - 1, 0)
390
+ );
391
+ const offset = clampOffset(
392
+ patch.offset ?? this.offset,
393
+ nextRows.length,
394
+ nextHeight,
395
+ cursor
396
+ );
397
+ return new _TableModel({
398
+ columns: [...nextColumns],
399
+ rows: [...nextRows],
400
+ cursor,
401
+ offset,
402
+ focused: patch.focused ?? this.focused,
403
+ height: Math.max(0, nextHeight),
404
+ width: Math.max(0, nextWidth),
405
+ autoWidth,
406
+ keyMap: patch.keyMap ?? this.keyMap,
407
+ styles: patch.styles ?? this.styles,
408
+ bordered: nextBordered,
409
+ columnWidths: nextColumnWidths
410
+ });
411
+ }
412
+ };
413
+
414
+ export { TableModel, defaultKeyMap, defaultStyles };
415
+ //# sourceMappingURL=index.js.map
4
416
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAG3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA"}
1
+ {"version":3,"sources":["../src/keymap.ts","../src/styles.ts","../src/model.ts"],"names":["width","textWidth","Style"],"mappings":"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","file":"index.js","sourcesContent":["import { newBinding, type Binding } from '@suds-cli/key'\n\n/** Key bindings for table navigation. @public */\nexport interface TableKeyMap {\n lineUp: Binding\n lineDown: Binding\n pageUp: Binding\n pageDown: Binding\n halfPageUp: Binding\n halfPageDown: Binding\n gotoTop: Binding\n gotoBottom: Binding\n}\n\n/** Default key bindings matching Bubble Tea tables. @public */\nexport const defaultKeyMap: TableKeyMap = {\n lineUp: newBinding({\n keys: ['up', 'k'],\n help: { key: '↑/k', desc: 'up' },\n }),\n lineDown: newBinding({\n keys: ['down', 'j'],\n help: { key: '↓/j', desc: 'down' },\n }),\n pageUp: newBinding({\n keys: ['pgup', 'b', 'ctrl+u'],\n help: { key: 'pgup/b', desc: 'page up' },\n }),\n pageDown: newBinding({\n keys: ['pgdown', 'f', 'ctrl+d'],\n help: { key: 'pgdn/f', desc: 'page down' },\n }),\n halfPageUp: newBinding({\n keys: ['u'],\n help: { key: 'u', desc: '½ page up' },\n }),\n halfPageDown: newBinding({\n keys: ['d'],\n help: { key: 'd', desc: '½ page down' },\n }),\n gotoTop: newBinding({\n keys: ['home', 'g'],\n help: { key: 'home/g', desc: 'go to start' },\n }),\n gotoBottom: newBinding({\n keys: ['end', 'G'],\n help: { key: 'end/G', desc: 'go to end' },\n }),\n}\n","import { Style, borderStyles, type BorderStyle } from '@suds-cli/chapstick'\n\n/** Styles applied to parts of the table. @public */\nexport interface TableStyles {\n header: Style\n cell: Style\n selected: Style\n border: Style\n borderStyle: BorderStyle\n}\n\n/** Default table styles. @public */\nexport function defaultStyles(): TableStyles {\n return {\n header: new Style().bold(true).padding(0, 1),\n cell: new Style().padding(0, 1),\n selected: new Style().background('#7D56F4').foreground('#FFFFFF'),\n border: new Style().foreground('#383838'),\n borderStyle: borderStyles.normal,\n }\n}\n","import {\n Style,\n borderStyles,\n defaultBorderStyle,\n joinHorizontal,\n width as textWidth,\n type BorderStyle,\n} from '@suds-cli/chapstick'\nimport { matches } from '@suds-cli/key'\nimport { KeyMsg, type Cmd, type Msg } from '@suds-cli/tea'\nimport { defaultKeyMap, type TableKeyMap } from './keymap.js'\nimport { defaultStyles, type TableStyles } from './styles.js'\nimport type { Column, Row, TableOptions } from './types.js'\n\nconst ELLIPSIS = '…'\n\nfunction clamp(value: number, min: number, max: number): number {\n if (Number.isNaN(value)) return min\n if (max < min) return min\n return Math.min(max, Math.max(min, value))\n}\n\nfunction clampOffset(\n offset: number,\n rowCount: number,\n height: number,\n cursor: number,\n): number {\n if (height <= 0) return 0\n const maxOffset = Math.max(0, rowCount - height)\n let nextOffset = clamp(offset, 0, maxOffset)\n if (cursor < nextOffset) {\n nextOffset = cursor\n } else if (cursor >= nextOffset + height) {\n nextOffset = Math.max(0, cursor - height + 1)\n }\n return nextOffset\n}\n\nfunction truncateWithEllipsis(text: string, width: number): string {\n const target = Math.max(0, width)\n if (target === 0) return ''\n if (textWidth(text) <= target) return text\n if (target === 1) return ELLIPSIS\n\n let acc = ''\n for (const ch of text) {\n if (textWidth(acc + ch) >= target) {\n break\n }\n acc += ch\n if (textWidth(acc) === target - 1) {\n break\n }\n }\n return `${acc}${ELLIPSIS}`\n}\n\nfunction padToWidth(input: string, width: number): string {\n const current = textWidth(input)\n const missing = Math.max(0, width - current)\n return `${input}${' '.repeat(missing)}`\n}\n\nfunction calculateColumnWidths(\n columns: Column[],\n totalWidth: number,\n bordered: boolean,\n): number[] {\n const borderWidth = bordered ? columns.length + 1 : 0\n const available = Math.max(0, totalWidth - borderWidth)\n const fixed = columns.map((c) => Math.max(0, c.width))\n const totalFixed = fixed.reduce((a, b) => a + b, 0)\n\n if (totalFixed > available && totalFixed > 0) {\n const scale = available / totalFixed\n return fixed.map((w) => Math.max(0, Math.floor(w * scale)))\n }\n return fixed\n}\n\nfunction mergeKeyMap(\n base: TableKeyMap,\n overrides?: Partial<TableKeyMap>,\n): TableKeyMap {\n return {\n lineUp: overrides?.lineUp ?? base.lineUp,\n lineDown: overrides?.lineDown ?? base.lineDown,\n pageUp: overrides?.pageUp ?? base.pageUp,\n pageDown: overrides?.pageDown ?? base.pageDown,\n halfPageUp: overrides?.halfPageUp ?? base.halfPageUp,\n halfPageDown: overrides?.halfPageDown ?? base.halfPageDown,\n gotoTop: overrides?.gotoTop ?? base.gotoTop,\n gotoBottom: overrides?.gotoBottom ?? base.gotoBottom,\n }\n}\n\nfunction mergeStyles(\n overrides?: Partial<TableStyles>,\n borderStyleOverride?: BorderStyle,\n): TableStyles {\n const base = defaultStyles()\n const merged: TableStyles = {\n ...base,\n ...overrides,\n }\n if (borderStyleOverride) {\n merged.borderStyle = borderStyleOverride\n } else if (!merged.borderStyle) {\n merged.borderStyle = defaultBorderStyle\n }\n return merged\n}\n\nfunction totalColumnWidth(columns: Column[], bordered: boolean): number {\n const base = columns.reduce((sum, col) => sum + Math.max(0, col.width), 0)\n return bordered ? base + Math.max(0, columns.length - 1) : base\n}\n\nfunction _innerWidthFrom(\n widths: number[],\n bordered: boolean,\n columnCount: number,\n): number {\n const base = widths.reduce((sum, w) => sum + Math.max(0, w), 0)\n return bordered ? base + Math.max(0, columnCount - 1) : base\n}\n\n/** Create a fixed-width cell (like lipgloss Width+MaxWidth+Inline). */\nfunction fixedWidthCell(text: string, width: number): string {\n if (width <= 0) return ''\n const truncated = truncateWithEllipsis(text, width)\n // Use alignHorizontal to ensure padding to target width\n return new Style()\n .width(width)\n .maxWidth(width)\n .alignHorizontal('left')\n .inline(true)\n .render(truncated)\n}\n\nfunction _verticalChar(styles: TableStyles): string {\n return styles.borderStyle?.left ?? borderStyles.normal.left\n}\n\nfunction wrapWithBorder(\n line: string,\n innerWidth: number,\n styles: TableStyles,\n): string {\n const width = Math.max(0, innerWidth)\n const padded = padToWidth(line, width)\n const wrapped = `${styles.borderStyle.left}${padded}${styles.borderStyle.right}`\n return styles.border.render(wrapped)\n}\n\nfunction renderTopBorder(innerWidth: number, styles: TableStyles): string {\n const line = `${styles.borderStyle.topLeft}${styles.borderStyle.top.repeat(Math.max(0, innerWidth))}${styles.borderStyle.topRight}`\n return styles.border.render(line)\n}\n\nfunction renderSeparator(innerWidth: number, styles: TableStyles): string {\n const line = `${styles.borderStyle.left}${styles.borderStyle.top.repeat(Math.max(0, innerWidth))}${styles.borderStyle.right}`\n return styles.border.render(line)\n}\n\nfunction renderBottomBorder(innerWidth: number, styles: TableStyles): string {\n const line = `${styles.borderStyle.bottomLeft}${styles.borderStyle.bottom.repeat(Math.max(0, innerWidth))}${styles.borderStyle.bottomRight}`\n return styles.border.render(line)\n}\n\ninterface TableState {\n columns: Column[]\n rows: Row[]\n cursor: number\n offset: number\n focused: boolean\n height: number\n width: number\n autoWidth: boolean\n keyMap: TableKeyMap\n styles: TableStyles\n bordered: boolean\n columnWidths: number[]\n}\n\n/**\n * Scrollable, selectable table model.\n * @public\n */\nexport class TableModel {\n readonly columns: Column[]\n readonly rows: Row[]\n readonly cursor: number\n readonly offset: number\n readonly focused: boolean\n readonly height: number\n readonly width: number\n readonly autoWidth: boolean\n readonly keyMap: TableKeyMap\n readonly styles: TableStyles\n readonly bordered: boolean\n readonly columnWidths: number[]\n\n private constructor(state: TableState) {\n this.columns = state.columns\n this.rows = state.rows\n this.cursor = state.cursor\n this.offset = state.offset\n this.focused = state.focused\n this.height = state.height\n this.width = state.width\n this.autoWidth = state.autoWidth\n this.keyMap = state.keyMap\n this.styles = state.styles\n this.bordered = state.bordered\n this.columnWidths = state.columnWidths\n }\n\n /** Create a new table model. */\n static new(options: TableOptions): TableModel {\n const rows = [...(options.rows ?? [])]\n const bordered = options.bordered ?? false\n const styles = mergeStyles(options.styles, options.borderStyle)\n const width =\n options.width ?? totalColumnWidth(options.columns, bordered) ?? 0\n const autoWidth = options.width === undefined\n const height = Math.max(0, options.height ?? rows.length)\n const columnWidths = autoWidth\n ? options.columns.map((c) => Math.max(0, c.width))\n : calculateColumnWidths(options.columns, width, bordered)\n const cursor = clamp(\n options.focused ? 0 : 0,\n 0,\n Math.max(rows.length - 1, 0),\n )\n const offset = clampOffset(0, rows.length, height, cursor)\n return new TableModel({\n columns: [...options.columns],\n rows,\n cursor,\n offset,\n focused: options.focused ?? false,\n height,\n width,\n autoWidth,\n keyMap: mergeKeyMap(defaultKeyMap, options.keyMap),\n styles,\n bordered,\n columnWidths,\n })\n }\n\n /** Tea init hook (no-op). */\n init(): Cmd<Msg> {\n return null\n }\n\n /** Handle key messages when focused. */\n update(msg: Msg): [TableModel, Cmd<Msg>] {\n if (!this.focused || !(msg instanceof KeyMsg)) {\n return [this, null]\n }\n\n if (matches(msg, this.keyMap.lineUp)) {\n return [this.moveUp(1), null]\n }\n if (matches(msg, this.keyMap.lineDown)) {\n return [this.moveDown(1), null]\n }\n if (matches(msg, this.keyMap.pageUp)) {\n return [this.moveUp(this.height || 1), null]\n }\n if (matches(msg, this.keyMap.pageDown)) {\n return [this.moveDown(this.height || 1), null]\n }\n if (matches(msg, this.keyMap.halfPageUp)) {\n return [this.moveUp(Math.max(1, Math.floor(this.height / 2))), null]\n }\n if (matches(msg, this.keyMap.halfPageDown)) {\n return [this.moveDown(Math.max(1, Math.floor(this.height / 2))), null]\n }\n if (matches(msg, this.keyMap.gotoTop)) {\n return [this.gotoTop(), null]\n }\n if (matches(msg, this.keyMap.gotoBottom)) {\n return [this.gotoBottom(), null]\n }\n return [this, null]\n }\n\n /** Render the header and visible rows as a string. */\n view(): string {\n const header = this.renderHeader()\n const headerWidth = textWidth(header)\n\n const start = this.offset\n const end = Math.min(start + this.height, this.rows.length)\n const visibleRows = this.renderAllRows().slice(start, end)\n\n // Pad with empty rows if needed\n const paddedRows = [...visibleRows]\n while (paddedRows.length < this.height) {\n paddedRows.push(this.renderEmptyRow())\n }\n\n // Calculate inner width for borders (max of header and all rows)\n const rowWidth = paddedRows.length > 0 ? textWidth(paddedRows[0] ?? '') : 0\n const innerWidth = Math.max(headerWidth, rowWidth)\n\n if (!this.bordered) {\n return [\n padToWidth(header, innerWidth),\n ...paddedRows.map((r) => padToWidth(r, innerWidth)),\n ].join('\\n')\n }\n\n const wrap = (line: string) => wrapWithBorder(line, innerWidth, this.styles)\n return [\n renderTopBorder(innerWidth, this.styles),\n wrap(padToWidth(header, innerWidth)),\n renderSeparator(innerWidth, this.styles),\n ...paddedRows.map((r) => wrap(padToWidth(r, innerWidth))),\n renderBottomBorder(innerWidth, this.styles),\n ].join('\\n')\n }\n\n /** Current selected row, if any. */\n selectedRow(): Row | undefined {\n if (this.rows.length === 0) return undefined\n return this.rows[this.cursor]\n }\n\n /** Current selected index. */\n selectedIndex(): number {\n return this.cursor\n }\n\n /** Replace columns. */\n setColumns(columns: Column[]): TableModel {\n return this.with({\n columns: [...columns],\n })\n }\n\n /** Replace rows. */\n setRows(rows: Row[]): TableModel {\n return this.with({\n rows: [...rows],\n })\n }\n\n /** Append a single row. */\n appendRow(row: Row): TableModel {\n return this.setRows([...this.rows, row])\n }\n\n /** Remove a row by index. */\n removeRow(index: number): TableModel {\n if (index < 0 || index >= this.rows.length) return this\n const next = [...this.rows]\n next.splice(index, 1)\n return this.setRows(next)\n }\n\n /** Set the selected index (clamped). */\n setSelectedIndex(index: number): TableModel {\n return this.with({ cursor: index })\n }\n\n /** Move the cursor up by n rows. */\n moveUp(n = 1): TableModel {\n const delta = Math.max(1, n)\n return this.with({ cursor: this.cursor - delta })\n }\n\n /** Move the cursor down by n rows. */\n moveDown(n = 1): TableModel {\n const delta = Math.max(1, n)\n return this.with({ cursor: this.cursor + delta })\n }\n\n /** Jump to the first row. */\n gotoTop(): TableModel {\n return this.with({ cursor: 0 })\n }\n\n /** Jump to the last row. */\n gotoBottom(): TableModel {\n return this.with({ cursor: this.rows.length - 1 })\n }\n\n /** Focus the table. */\n focus(): TableModel {\n if (this.focused) return this\n return this.with({ focused: true })\n }\n\n /** Blur the table. */\n blur(): TableModel {\n if (!this.focused) return this\n return this.with({ focused: false })\n }\n\n /** Set the visible height (rows). */\n setHeight(height: number): TableModel {\n return this.with({ height })\n }\n\n /** Set the total width. */\n setWidth(width: number): TableModel {\n return this.with({ width })\n }\n\n private renderHeader(): string {\n // Match Go: fixed-width cell → header style (with padding) → joinHorizontal\n const cells = this.columns.map((col, i) => {\n const width = this.columnWidths[i] ?? col.width\n const fixedCell = fixedWidthCell(col.title, width)\n return this.styles.header.render(fixedCell)\n })\n return joinHorizontal(...cells)\n }\n\n private renderRow(row: Row, index: number): string {\n // Match Go: fixed-width cell → cell style (with padding) → join → selected wraps whole row\n const isSelected = this.focused && index === this.cursor\n\n const cells = this.columns.map((col, i) => {\n const width = this.columnWidths[i] ?? col.width\n const value = row[i] ?? ''\n const fixedCell = fixedWidthCell(value, width)\n return this.styles.cell.render(fixedCell)\n })\n\n const joined = joinHorizontal(...cells)\n\n // Selected style wraps the entire row (just colors, no padding change)\n if (isSelected) {\n return this.styles.selected.render(joined)\n }\n return joined\n }\n\n private renderEmptyRow(): string {\n // Same as renderRow but with empty content\n const cells = this.columns.map((col, i) => {\n const width = this.columnWidths[i] ?? col.width\n const fixedCell = fixedWidthCell('', width)\n return this.styles.cell.render(fixedCell)\n })\n return joinHorizontal(...cells)\n }\n\n private renderAllRows(): string[] {\n return this.rows.map((row, i) => this.renderRow(row, i))\n }\n\n private with(patch: Partial<TableState>): TableModel {\n const nextColumns = patch.columns ?? this.columns\n const nextRows = patch.rows ?? this.rows\n const nextHeight = patch.height ?? this.height\n const nextWidth = patch.width ?? this.width\n const autoWidth = patch.width !== undefined ? false : this.autoWidth\n const nextBordered = patch.bordered ?? this.bordered\n const nextColumnWidths = autoWidth\n ? nextColumns.map((c) => Math.max(0, c.width))\n : calculateColumnWidths(nextColumns, nextWidth, nextBordered)\n const cursor = clamp(\n patch.cursor ?? this.cursor,\n 0,\n Math.max(nextRows.length - 1, 0),\n )\n const offset = clampOffset(\n patch.offset ?? this.offset,\n nextRows.length,\n nextHeight,\n cursor,\n )\n return new TableModel({\n columns: [...nextColumns],\n rows: [...nextRows],\n cursor,\n offset,\n focused: patch.focused ?? this.focused,\n height: Math.max(0, nextHeight),\n width: Math.max(0, nextWidth),\n autoWidth,\n keyMap: patch.keyMap ?? this.keyMap,\n styles: patch.styles ?? this.styles,\n bordered: nextBordered,\n columnWidths: nextColumnWidths,\n })\n }\n}\n"]}
package/package.json CHANGED
@@ -1,32 +1,45 @@
1
1
  {
2
2
  "name": "@suds-cli/table",
3
- "version": "0.0.1-alpha.0",
4
3
  "description": "Tabular data display with scrolling and selection for Suds",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "types": "./dist/index.d.ts",
8
- "files": [
9
- "dist"
10
- ],
4
+ "version": "0.1.0-alpha.1",
11
5
  "dependencies": {
12
- "@suds-cli/chapstick": "0.1.0-alpha.0",
13
- "@suds-cli/key": "0.0.0",
14
- "@suds-cli/tea": "0.0.0"
6
+ "@suds-cli/chapstick": "0.1.0-alpha.1",
7
+ "@suds-cli/key": "0.1.0-alpha.0",
8
+ "@suds-cli/tea": "0.1.0-alpha.0"
15
9
  },
16
10
  "devDependencies": {
17
11
  "typescript": "5.8.2",
18
- "vitest": "^4.0.15"
12
+ "vitest": "^4.0.16"
19
13
  },
20
14
  "engines": {
21
15
  "node": ">=20.0.0"
22
16
  },
17
+ "exports": {
18
+ ".": {
19
+ "import": {
20
+ "types": "./dist/index.d.ts",
21
+ "default": "./dist/index.js"
22
+ },
23
+ "require": {
24
+ "types": "./dist/index.d.cts",
25
+ "default": "./dist/index.cjs"
26
+ }
27
+ },
28
+ "./package.json": "./package.json"
29
+ },
30
+ "files": [
31
+ "dist"
32
+ ],
33
+ "main": "./dist/index.cjs",
34
+ "module": "./dist/index.js",
35
+ "type": "module",
36
+ "types": "./dist/index.d.ts",
23
37
  "scripts": {
24
- "clean": "rm -rf dist",
25
- "build": "pnpm run clean && tsc -p ./tsconfig.json",
26
- "test": "vitest run",
27
- "generate:api-report": "api-extractor run --local",
38
+ "build": "tsup",
28
39
  "check:api-report": "pnpm run generate:api-report",
29
40
  "check:eslint": "pnpm run lint",
30
- "lint": "eslint \"{src,test}/**/*.{ts,tsx}\""
41
+ "generate:api-report": "api-extractor run --local",
42
+ "lint": "eslint \"{src,test}/**/*.{ts,tsx}\"",
43
+ "test": "vitest run"
31
44
  }
32
45
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA"}
package/dist/keymap.d.ts DELETED
@@ -1,15 +0,0 @@
1
- import { type Binding } from '@suds-cli/key';
2
- /** Key bindings for table navigation. @public */
3
- export interface TableKeyMap {
4
- lineUp: Binding;
5
- lineDown: Binding;
6
- pageUp: Binding;
7
- pageDown: Binding;
8
- halfPageUp: Binding;
9
- halfPageDown: Binding;
10
- gotoTop: Binding;
11
- gotoBottom: Binding;
12
- }
13
- /** Default key bindings matching Bubble Tea tables. @public */
14
- export declare const defaultKeyMap: TableKeyMap;
15
- //# sourceMappingURL=keymap.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"keymap.d.ts","sourceRoot":"","sources":["../src/keymap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,eAAe,CAAA;AAExD,iDAAiD;AACjD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,EAAE,OAAO,CAAA;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,+DAA+D;AAC/D,eAAO,MAAM,aAAa,EAAE,WAiC3B,CAAA"}
package/dist/keymap.js DELETED
@@ -1,37 +0,0 @@
1
- import { newBinding } from '@suds-cli/key';
2
- /** Default key bindings matching Bubble Tea tables. @public */
3
- export const defaultKeyMap = {
4
- lineUp: newBinding({
5
- keys: ['up', 'k'],
6
- help: { key: '↑/k', desc: 'up' },
7
- }),
8
- lineDown: newBinding({
9
- keys: ['down', 'j'],
10
- help: { key: '↓/j', desc: 'down' },
11
- }),
12
- pageUp: newBinding({
13
- keys: ['pgup', 'b', 'ctrl+u'],
14
- help: { key: 'pgup/b', desc: 'page up' },
15
- }),
16
- pageDown: newBinding({
17
- keys: ['pgdown', 'f', 'ctrl+d'],
18
- help: { key: 'pgdn/f', desc: 'page down' },
19
- }),
20
- halfPageUp: newBinding({
21
- keys: ['u'],
22
- help: { key: 'u', desc: '½ page up' },
23
- }),
24
- halfPageDown: newBinding({
25
- keys: ['d'],
26
- help: { key: 'd', desc: '½ page down' },
27
- }),
28
- gotoTop: newBinding({
29
- keys: ['home', 'g'],
30
- help: { key: 'home/g', desc: 'go to start' },
31
- }),
32
- gotoBottom: newBinding({
33
- keys: ['end', 'G'],
34
- help: { key: 'end/G', desc: 'go to end' },
35
- }),
36
- };
37
- //# sourceMappingURL=keymap.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"keymap.js","sourceRoot":"","sources":["../src/keymap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgB,MAAM,eAAe,CAAA;AAcxD,+DAA+D;AAC/D,MAAM,CAAC,MAAM,aAAa,GAAgB;IACxC,MAAM,EAAE,UAAU,CAAC;QACjB,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC;QACjB,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;KACjC,CAAC;IACF,QAAQ,EAAE,UAAU,CAAC;QACnB,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC;QACnB,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE;KACnC,CAAC;IACF,MAAM,EAAE,UAAU,CAAC;QACjB,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC;QAC7B,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;KACzC,CAAC;IACF,QAAQ,EAAE,UAAU,CAAC;QACnB,IAAI,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC;QAC/B,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;KAC3C,CAAC;IACF,UAAU,EAAE,UAAU,CAAC;QACrB,IAAI,EAAE,CAAC,GAAG,CAAC;QACX,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE;KACtC,CAAC;IACF,YAAY,EAAE,UAAU,CAAC;QACvB,IAAI,EAAE,CAAC,GAAG,CAAC;QACX,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE;KACxC,CAAC;IACF,OAAO,EAAE,UAAU,CAAC;QAClB,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC;QACnB,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE;KAC7C,CAAC;IACF,UAAU,EAAE,UAAU,CAAC;QACrB,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC;QAClB,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE;KAC1C,CAAC;CACH,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AASA,OAAO,EAAU,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,eAAe,CAAA;AAC1D,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AA8K3D;;;GAGG;AACH,qBAAa,UAAU;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAA;IAE/B,OAAO;IAeP,gCAAgC;IAChC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU;IAiC7C,6BAA6B;IAC7B,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC;IAIhB,wCAAwC;IACxC,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAgCxC,sDAAsD;IACtD,IAAI,IAAI,MAAM;IAmCd,oCAAoC;IACpC,WAAW,IAAI,GAAG,GAAG,SAAS;IAK9B,8BAA8B;IAC9B,aAAa,IAAI,MAAM;IAIvB,uBAAuB;IACvB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU;IAMzC,oBAAoB;IACpB,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,UAAU;IAMhC,2BAA2B;IAC3B,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,UAAU;IAI/B,6BAA6B;IAC7B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAOpC,wCAAwC;IACxC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAI3C,oCAAoC;IACpC,MAAM,CAAC,CAAC,SAAI,GAAG,UAAU;IAKzB,sCAAsC;IACtC,QAAQ,CAAC,CAAC,SAAI,GAAG,UAAU;IAK3B,6BAA6B;IAC7B,OAAO,IAAI,UAAU;IAIrB,4BAA4B;IAC5B,UAAU,IAAI,UAAU;IAIxB,uBAAuB;IACvB,KAAK,IAAI,UAAU;IAKnB,sBAAsB;IACtB,IAAI,IAAI,UAAU;IAKlB,qCAAqC;IACrC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU;IAIrC,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAInC,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,IAAI;CAoCb"}