Skip to content

Commit b1d567d

Browse files
committed
Add viewer pagination metadata
1 parent fde9f5c commit b1d567d

8 files changed

Lines changed: 53 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22

33
All notable changes to this package are documented here.
44

5+
## 0.4.2 - 2026-05-12
6+
7+
- Added `getPageCount()` and `getPageInfo()` to the DOM viewer so custom pagination controls can read the current page state.
8+
59
## 0.4.1 - 2026-05-12
610

711
- Added ecosystem recipes showing how to combine `json-html-kit` with small parsing and table utilities.
812
- Added GitHub Actions CI for typechecking, building and testing on Node.js 20 and 22.
913
- Documented package quality signals in the README.
10-

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,11 +167,13 @@ const viewer = createJsonHtmlViewer(container, hugeRows, {
167167
});
168168

169169
viewer.nextPage();
170+
viewer.getPageInfo();
170171
viewer.setPage(10);
171172
viewer.destroy();
172173
```
173174

174175
The viewer is intentionally separate from `renderJsonToHtml`. The renderer stays static and string-based; the viewer owns DOM state for pagination.
176+
Use `getPageInfo()` or `getPageCount()` when your UI needs to render its own pagination controls.
175177

176178
## Custom themes
177179

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "json-html-kit",
3-
"version": "0.4.1",
3+
"version": "0.4.2",
44
"description": "Render arbitrary JSON as safe, themed, human-friendly HTML tables.",
55
"type": "module",
66
"sideEffects": false,

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export {
77
export { createTheme, getThemeCss, getThemePreset, getThemeStyleTag, injectThemeCss, themes } from './lib/themes.js';
88
export type {
99
JsonHtmlRenderer,
10+
JsonHtmlViewerPageInfo,
1011
JsonHtmlRenderOptions,
1112
JsonHtmlStyleOptions,
1213
JsonHtmlTableMode,

src/lib/render.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,25 @@ export function createJsonHtmlViewer(element: Element, value: unknown, options:
157157
getPage() {
158158
return page;
159159
},
160+
getPageCount() {
161+
return getViewerPageCount(data, pageSize);
162+
},
163+
getPageInfo() {
164+
const totalItems = Array.isArray(data) ? data.length : 1;
165+
const pageCount = getViewerPageCount(data, pageSize);
166+
const clampedPage = clamp(page, 0, pageCount - 1);
167+
const startIndex = Array.isArray(data) && totalItems > 0 ? clampedPage * pageSize : 0;
168+
const endIndex = Array.isArray(data) ? Math.min(startIndex + pageSize, totalItems) : totalItems;
169+
170+
return {
171+
page: clampedPage,
172+
pageCount,
173+
pageSize,
174+
totalItems,
175+
startIndex,
176+
endIndex
177+
};
178+
},
160179
nextPage() {
161180
viewer.setPage(page + 1);
162181
},
@@ -182,6 +201,10 @@ export function createJsonHtmlViewer(element: Element, value: unknown, options:
182201
return viewer;
183202
}
184203

204+
function getViewerPageCount(data: unknown, pageSize: number): number {
205+
return Array.isArray(data) ? Math.max(1, Math.ceil(data.length / pageSize)) : 1;
206+
}
207+
185208
function resolveRenderOptions(options: JsonHtmlRenderOptions): ResolvedRenderOptions {
186209
return {
187210
...DEFAULT_OPTIONS,

src/lib/types.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,20 @@ export interface JsonHtmlViewerOptions extends JsonHtmlRenderOptions {
6060
initialPage?: number;
6161
}
6262

63+
export interface JsonHtmlViewerPageInfo {
64+
page: number;
65+
pageCount: number;
66+
pageSize: number;
67+
totalItems: number;
68+
startIndex: number;
69+
endIndex: number;
70+
}
71+
6372
export interface JsonHtmlViewer {
6473
destroy(): void;
6574
getPage(): number;
75+
getPageCount(): number;
76+
getPageInfo(): JsonHtmlViewerPageInfo;
6677
nextPage(): void;
6778
previousPage(): void;
6879
render(): void;

tests/render.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,15 @@ describe('createJsonHtmlViewer', () => {
131131
viewer.nextPage();
132132

133133
expect(viewer.getPage()).toBe(1);
134+
expect(viewer.getPageCount()).toBe(2);
135+
expect(viewer.getPageInfo()).toEqual({
136+
page: 1,
137+
pageCount: 2,
138+
pageSize: 2,
139+
totalItems: 3,
140+
startIndex: 2,
141+
endIndex: 3
142+
});
134143
expect(element.textContent).toContain('Showing 3-3 of 3 items');
135144
expect(element.textContent).toContain('Katherine');
136145

0 commit comments

Comments
 (0)