@relax.js/core 1.0.0 → 1.0.2

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,64 @@
1
+ # DataLoader
2
+
3
+ An interface for loading paginated, sortable data from any data source. Components like tables use this to fetch data on demand as users navigate pages or change sort order.
4
+
5
+ ## Interface
6
+
7
+ ```ts
8
+ interface DataLoader {
9
+ load(options: {
10
+ page: number;
11
+ pageSize: number;
12
+ sort: { column: string; direction: 'asc' | 'desc' }[];
13
+ }): Promise<{ rows: Record<string, any>[]; totalCount: number }>;
14
+ }
15
+ ```
16
+
17
+ ### `load(options)`
18
+
19
+ | Option | Type | Description |
20
+ |-----------|-----------------------------------------------|---------------------------------|
21
+ | `page` | `number` | 1-based page number to load |
22
+ | `pageSize` | `number` | Number of rows per page |
23
+ | `sort` | `{ column: string; direction: 'asc' \| 'desc' }[]` | Sort specifications |
24
+
25
+ **Returns** `Promise<{ rows: Record<string, any>[]; totalCount: number }>`
26
+
27
+ - `rows` - The data for the requested page
28
+ - `totalCount` - Total number of rows across all pages (used for pagination)
29
+
30
+ ## Example
31
+
32
+ ```ts
33
+ import { DataLoader } from '@anthropic-ai/relax.js/core';
34
+
35
+ class UserDataLoader implements DataLoader {
36
+ async load(options) {
37
+ const params = new URLSearchParams({
38
+ page: options.page.toString(),
39
+ pageSize: options.pageSize.toString(),
40
+ sort: JSON.stringify(options.sort),
41
+ });
42
+
43
+ const response = await fetch(`/api/users?${params}`);
44
+ return response.json();
45
+ }
46
+ }
47
+ ```
48
+
49
+ ## Using with Pager
50
+
51
+ ```ts
52
+ import { DataLoader, Pager, PageSelectedEvent } from '@anthropic-ai/relax.js/core';
53
+
54
+ const loader: DataLoader = new UserDataLoader();
55
+ const result = await loader.load({ page: 1, pageSize: 25, sort: [] });
56
+
57
+ const pager = new Pager(container, result.totalCount, 25);
58
+
59
+ container.addEventListener('pageselected', async (e: PageSelectedEvent) => {
60
+ const data = await loader.load({ page: e.page, pageSize: 25, sort: [] });
61
+ pager.update(data.totalCount);
62
+ // render data.rows...
63
+ });
64
+ ```
package/docs/Pager.md ADDED
@@ -0,0 +1,59 @@
1
+ # Pager
2
+
3
+ Renders pagination buttons (Previous, page numbers, Next) inside a container element and dispatches a `PageSelectedEvent` when the user clicks a page.
4
+
5
+ ## Usage
6
+
7
+ ```ts
8
+ import { Pager, PageSelectedEvent } from '@anthropic-ai/relax.js/core';
9
+
10
+ const container = document.querySelector('.pager');
11
+ const pager = new Pager(container, totalCount, pageSize);
12
+
13
+ container.addEventListener('pageselected', (e: PageSelectedEvent) => {
14
+ console.log('Selected page:', e.page);
15
+ });
16
+ ```
17
+
18
+ ## Constructor
19
+
20
+ ```ts
21
+ new Pager(container: HTMLElement, totalCount: number, pageSize: number)
22
+ ```
23
+
24
+ | Parameter | Description |
25
+ |-------------|--------------------------------------|
26
+ | `container` | The element to render buttons into |
27
+ | `totalCount`| Total number of items across all pages |
28
+ | `pageSize` | Number of items per page |
29
+
30
+ ## Methods
31
+
32
+ ### `update(totalCount: number)`
33
+
34
+ Updates the total count and re-renders the buttons. If the current page exceeds the new page count, it resets to the last page.
35
+
36
+ ### `getCurrentPage(): number`
37
+
38
+ Returns the current 1-based page number.
39
+
40
+ ## PageSelectedEvent
41
+
42
+ Dispatched on the container element when the user selects a page. Bubbles and is composed.
43
+
44
+ | Property | Type | Description |
45
+ |----------|----------|---------------------------|
46
+ | `page` | `number` | The selected page number |
47
+
48
+ ### Listening for page changes
49
+
50
+ ```ts
51
+ container.addEventListener('pageselected', (e: PageSelectedEvent) => {
52
+ const rows = await loader.load({
53
+ page: e.page,
54
+ pageSize: 25,
55
+ sort: [],
56
+ });
57
+ // render rows...
58
+ });
59
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@relax.js/core",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Ship faster with less code. Web Component library with routing, forms, DI, templating, and i18n. No virtual DOM, no build magic, no surprise re-renders.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",