argus-table 0.1.0 → 0.2.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.
Files changed (59) hide show
  1. package/README.md +25 -2
  2. package/dist/announce.js +27 -0
  3. package/dist/announce.js.map +1 -0
  4. package/dist/argus-column.js +121 -0
  5. package/dist/argus-column.js.map +1 -0
  6. package/dist/argus-table.js +585 -83
  7. package/dist/argus-table.js.map +1 -1
  8. package/dist/cdn/argus-table.js +79 -4533
  9. package/dist/cdn/argus-table.js.map +1 -1
  10. package/dist/controllers/auto-width.js +89 -0
  11. package/dist/controllers/auto-width.js.map +1 -0
  12. package/dist/controllers/column-children.js +41 -0
  13. package/dist/controllers/column-children.js.map +1 -0
  14. package/dist/controllers/data-controller.js +177 -0
  15. package/dist/controllers/data-controller.js.map +1 -0
  16. package/dist/controllers/reorder-drag.js +160 -0
  17. package/dist/controllers/reorder-drag.js.map +1 -0
  18. package/dist/controllers/resize-drag.js +3 -0
  19. package/dist/controllers/resize-drag.js.map +1 -1
  20. package/dist/controllers/table-controller.js +2 -1
  21. package/dist/controllers/table-controller.js.map +1 -1
  22. package/dist/controllers/virtual-controller.js +149 -10
  23. package/dist/controllers/virtual-controller.js.map +1 -1
  24. package/dist/core/src/columns/column-order.js +50 -0
  25. package/dist/core/src/columns/column-order.js.map +1 -0
  26. package/dist/core/src/columns/resolve-columns.js +5 -1
  27. package/dist/core/src/columns/resolve-columns.js.map +1 -1
  28. package/dist/core/src/data/page-cache.js +143 -0
  29. package/dist/core/src/data/page-cache.js.map +1 -0
  30. package/dist/core/src/grid/row-layout.js +58 -0
  31. package/dist/core/src/grid/row-layout.js.map +1 -0
  32. package/dist/core/src/table/create-table.js +112 -14
  33. package/dist/core/src/table/create-table.js.map +1 -1
  34. package/dist/core/src/table/sorted-row-model.js +86 -0
  35. package/dist/core/src/table/sorted-row-model.js.map +1 -0
  36. package/dist/core/src/virtual/scroll-scale.js +74 -0
  37. package/dist/core/src/virtual/scroll-scale.js.map +1 -0
  38. package/dist/core/src/virtual/steady-window.js +30 -0
  39. package/dist/core/src/virtual/steady-window.js.map +1 -0
  40. package/dist/custom-elements.json +1463 -62
  41. package/dist/events.js +5 -1
  42. package/dist/events.js.map +1 -1
  43. package/dist/index.d.ts +252 -27
  44. package/dist/index.js +3 -2
  45. package/dist/max-height.js +68 -0
  46. package/dist/max-height.js.map +1 -0
  47. package/dist/render/body.js +53 -20
  48. package/dist/render/body.js.map +1 -1
  49. package/dist/render/cells.js +21 -4
  50. package/dist/render/cells.js.map +1 -1
  51. package/dist/render/content.js +12 -5
  52. package/dist/render/content.js.map +1 -1
  53. package/dist/render/header.js +21 -4
  54. package/dist/render/header.js.map +1 -1
  55. package/dist/render/pinned-rows.js +29 -0
  56. package/dist/render/pinned-rows.js.map +1 -0
  57. package/dist/styles/base.js +1 -1
  58. package/dist/styles/base.js.map +1 -1
  59. package/package.json +2 -1
package/README.md CHANGED
@@ -1,3 +1,7 @@
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/Joessst-Dev/argus-table/main/brand/argus-table-logo.svg" alt="Argus Table" width="240" height="240">
3
+ </p>
4
+
1
5
  # argus-table
2
6
 
3
7
  `<argus-table>` is a data table web component built with Lit and TanStack. It works in any framework, or none.
@@ -5,7 +9,7 @@
5
9
  - **Virtualized rows:** 100,000 rows scroll smoothly, and the DOM stays the same size.
6
10
  - **Pinned columns** at the start or end, which mirror in right-to-left layouts.
7
11
  - **Sorting and resizing:** by mouse or keyboard, controlled or uncontrolled.
8
- - **Accessible:** the WAI-ARIA grid pattern, with one tab stop and arrow-key navigation.
12
+ - **Accessible:** the WAI-ARIA grid pattern, with one tab stop and keyboard navigation by cell, row, page and corner.
9
13
  - **Plain CSS styling:** `--argus-*` tokens and `::part()` names. Cell content is light DOM, so your own CSS and components work inside cells.
10
14
 
11
15
  **[Docs and live examples](https://joessst-dev.github.io/argus-table/)** · [GitHub](https://github.com/Joessst-Dev/argus-table)
@@ -47,6 +51,25 @@ npm i argus-table @argus-table/themes
47
51
  - **Label:** give it a name with `aria-label` or `aria-labelledby`.
48
52
  - **Columns and data** are JavaScript properties, because they hold objects and functions.
49
53
  - **Cells:** a column's `cell` function can return a string, a number, a DOM node or a Lit template.
54
+ - **Theme:** `default.css` is neutral and uses the page's font. `material.css` is a Material-inspired alternative (load Roboto yourself). Both are optional, and the table is usable without either.
55
+
56
+ ## Rows from a server
57
+
58
+ For more rows than you want to send at once, set `dataSource` instead of `data`. The table asks for the pages in view as the user scrolls, shows skeleton rows until they arrive, and aborts requests for pages that scroll away:
59
+
60
+ ```js
61
+ table.dataSource = {
62
+ pageSize: 100,
63
+ async getRows({ start, end, sorting, signal }) {
64
+ const params = new URLSearchParams({ offset: start, limit: end - start });
65
+ if (sorting[0]) params.set('sort', `${sorting[0].id}:${sorting[0].desc ? 'desc' : 'asc'}`);
66
+ const res = await fetch(`/api/orders?${params}`, { signal });
67
+ return res.json(); // { rows, total? }
68
+ },
69
+ };
70
+ ```
71
+
72
+ `end` is exclusive. Without a `total`, the table grows as pages arrive and stops at a page with fewer rows than it asked for. Sorting happens on the server. A page that fails fires `argus-load-error` and shows a Retry button; `table.refresh()` loads the rows in view again.
50
73
 
51
74
  ## Without a bundler
52
75
 
@@ -62,6 +85,6 @@ The CDN build has every dependency bundled:
62
85
 
63
86
  ## Status
64
87
 
65
- This is v0.1, an early release. Names can still change before 1.0. Infinite loading, pinned rows, auto column widths, column reordering and framework wrappers come in v0.2. See the [roadmap](https://github.com/Joessst-Dev/argus-table/blob/main/docs/plan/plan/12-roadmap.md).
88
+ This is an early release. Names can still change before 1.0. Pinned rows, auto column widths, column reordering and framework wrappers come in v0.2. See the [roadmap](https://github.com/Joessst-Dev/argus-table/blob/main/docs/plan/plan/12-roadmap.md).
66
89
 
67
90
  MIT licensed.
@@ -0,0 +1,27 @@
1
+ // src/announce.ts
2
+ var region;
3
+ /**
4
+ * Says something to screen readers through a polite live region. The region
5
+ * lives in the document body, not in the table: a grid may only own rows, so a
6
+ * status element inside it would break the grid's structure. One region serves
7
+ * every table on the page. It is visually hidden with inline styles, so page
8
+ * CSS can't reveal it.
9
+ */
10
+ function announce(doc, message) {
11
+ if (!region?.isConnected || region.ownerDocument !== doc) {
12
+ region = doc.createElement("div");
13
+ region.setAttribute("aria-live", "polite");
14
+ region.setAttribute("aria-atomic", "true");
15
+ region.dataset.argusAnnouncer = "";
16
+ region.style.cssText = "position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap";
17
+ doc.body.append(region);
18
+ }
19
+ const target = region;
20
+ target.textContent = "";
21
+ setTimeout(() => {
22
+ target.textContent = message;
23
+ }, 50);
24
+ }
25
+ export { announce };
26
+
27
+ //# sourceMappingURL=announce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"announce.js","names":[],"sources":["../src/announce.ts"],"sourcesContent":["let region: HTMLElement | undefined;\n\n/**\n * Says something to screen readers through a polite live region. The region\n * lives in the document body, not in the table: a grid may only own rows, so a\n * status element inside it would break the grid's structure. One region serves\n * every table on the page. It is visually hidden with inline styles, so page\n * CSS can't reveal it.\n */\nexport function announce(doc: Document, message: string): void {\n if (!region?.isConnected || region.ownerDocument !== doc) {\n region = doc.createElement('div');\n region.setAttribute('aria-live', 'polite');\n region.setAttribute('aria-atomic', 'true');\n region.dataset.argusAnnouncer = '';\n region.style.cssText =\n 'position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap';\n doc.body.append(region);\n }\n const target = region;\n // A new text node each time, so the same message twice is still announced.\n target.textContent = '';\n setTimeout(() => {\n target.textContent = message;\n }, 50);\n}\n"],"mappings":";AAAA,IAAI;;;;;;;;AASJ,SAAgB,SAAS,KAAe,SAAuB;CAC7D,IAAI,CAAC,QAAQ,eAAe,OAAO,kBAAkB,KAAK;EACxD,SAAS,IAAI,cAAc,KAAK;EAChC,OAAO,aAAa,aAAa,QAAQ;EACzC,OAAO,aAAa,eAAe,MAAM;EACzC,OAAO,QAAQ,iBAAiB;EAChC,OAAO,MAAM,UACX;EACF,IAAI,KAAK,OAAO,MAAM;CACxB;CACA,MAAM,SAAS;CAEf,OAAO,cAAc;CACrB,iBAAiB;EACf,OAAO,cAAc;CACvB,GAAG,EAAE;AACP"}
@@ -0,0 +1,121 @@
1
+ import __decorate from "./_virtual/_@oxc-project_runtime@0.156.0/helpers/esm/decorate.js";
2
+ import { ReactiveElement, html } from "lit";
3
+ import { customElement, property } from "lit/decorators.js";
4
+ import { templateContent } from "lit/directives/template-content.js";
5
+ // src/argus-column.ts
6
+ /**
7
+ * Tables watching their `<argus-column>` children, by table element. Columns
8
+ * call their parent's entry when they connect, disconnect or change, so the
9
+ * table needs no MutationObserver on its own children (which would fire on
10
+ * every light-DOM cell render while scrolling).
11
+ */
12
+ var watchers = /* @__PURE__ */ new WeakMap();
13
+ /** Calls `onChange` whenever an `<argus-column>` child of `host` is added, removed, moved or changed. */
14
+ function watchColumns(host, onChange) {
15
+ watchers.set(host, onChange);
16
+ }
17
+ function unwatchColumns(host) {
18
+ watchers.delete(host);
19
+ }
20
+ function notify(parent) {
21
+ if (parent) watchers.get(parent)?.();
22
+ }
23
+ /** `width` attribute: `"90"` or `"90px"` → 90, `"auto"`, `"2fr"` → `{ flex: 2 }`. */
24
+ var widthConverter = { fromAttribute(value) {
25
+ if (value === null) return void 0;
26
+ const text = value.trim().toLowerCase();
27
+ if (text === "auto") return "auto";
28
+ const match = /^(\d*\.?\d+)(px|fr)?$/.exec(text);
29
+ if (!match) return void 0;
30
+ const n = Number(match[1]);
31
+ return match[2] === "fr" ? { flex: n } : n;
32
+ } };
33
+ /**
34
+ * Boolean attribute with a default that may be `true`: absent → unset (the
35
+ * default applies), `"false"` → `false`, anything else → `true`.
36
+ */
37
+ var flagConverter = { fromAttribute(value) {
38
+ return value === null ? void 0 : value.trim().toLowerCase() !== "false";
39
+ } };
40
+ var ArgusColumn = class ArgusColumn extends ReactiveElement {
41
+ constructor(..._args) {
42
+ super(..._args);
43
+ this.columnId = "";
44
+ this.#parent = null;
45
+ this.#children = new MutationObserver(() => {
46
+ this.#def = void 0;
47
+ this.requestUpdate();
48
+ });
49
+ }
50
+ #parent;
51
+ #def;
52
+ #children;
53
+ /** Data only: no shadow root, nothing rendered. */
54
+ createRenderRoot() {
55
+ return this;
56
+ }
57
+ connectedCallback() {
58
+ super.connectedCallback();
59
+ this.#children.observe(this, { childList: true });
60
+ this.#parent = this.parentElement;
61
+ notify(this.#parent);
62
+ }
63
+ disconnectedCallback() {
64
+ super.disconnectedCallback();
65
+ this.#children.disconnect();
66
+ const parent = this.#parent;
67
+ this.#parent = null;
68
+ notify(parent);
69
+ }
70
+ /**
71
+ * The column as the table reads it. Unset fields stay `undefined`, which the
72
+ * table reads as its defaults. An unknown `pin` is ignored and an unknown
73
+ * `align` falls back to `start`.
74
+ */
75
+ toColumnDef() {
76
+ if (this.#def) return this.#def;
77
+ const template = [...this.children].find((c) => c instanceof HTMLTemplateElement);
78
+ return this.#def = {
79
+ id: this.columnId,
80
+ header: this.header,
81
+ accessor: this.accessor,
82
+ cell: this.cell ?? (template && (() => html`${templateContent(template)}`)),
83
+ width: this.width,
84
+ minWidth: this.minWidth,
85
+ maxWidth: this.maxWidth,
86
+ pin: this.pin,
87
+ align: this.align,
88
+ sortable: this.sortable,
89
+ resizable: this.resizable,
90
+ reorderable: this.reorderable
91
+ };
92
+ }
93
+ willUpdate() {
94
+ this.#def = void 0;
95
+ }
96
+ updated() {
97
+ notify(this.#parent);
98
+ }
99
+ };
100
+ __decorate([property({ attribute: "column-id" })], ArgusColumn.prototype, "columnId", void 0);
101
+ __decorate([property()], ArgusColumn.prototype, "header", void 0);
102
+ __decorate([property()], ArgusColumn.prototype, "accessor", void 0);
103
+ __decorate([property({ attribute: false })], ArgusColumn.prototype, "cell", void 0);
104
+ __decorate([property({ converter: widthConverter })], ArgusColumn.prototype, "width", void 0);
105
+ __decorate([property({
106
+ attribute: "min-width",
107
+ type: Number
108
+ })], ArgusColumn.prototype, "minWidth", void 0);
109
+ __decorate([property({
110
+ attribute: "max-width",
111
+ type: Number
112
+ })], ArgusColumn.prototype, "maxWidth", void 0);
113
+ __decorate([property()], ArgusColumn.prototype, "pin", void 0);
114
+ __decorate([property()], ArgusColumn.prototype, "align", void 0);
115
+ __decorate([property({ converter: flagConverter })], ArgusColumn.prototype, "sortable", void 0);
116
+ __decorate([property({ converter: flagConverter })], ArgusColumn.prototype, "resizable", void 0);
117
+ __decorate([property({ converter: flagConverter })], ArgusColumn.prototype, "reorderable", void 0);
118
+ ArgusColumn = __decorate([customElement("argus-column")], ArgusColumn);
119
+ export { ArgusColumn, unwatchColumns, watchColumns };
120
+
121
+ //# sourceMappingURL=argus-column.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argus-column.js","names":["_decorate"],"sources":["../src/argus-column.ts"],"sourcesContent":["import { html, ReactiveElement, type ComplexAttributeConverter } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { templateContent } from 'lit/directives/template-content.js';\nimport type {\n CellContent,\n CellContext,\n ColumnAlign,\n ColumnDef,\n ColumnPin,\n ColumnWidth,\n} from './types.js';\n\n/**\n * Tables watching their `<argus-column>` children, by table element. Columns\n * call their parent's entry when they connect, disconnect or change, so the\n * table needs no MutationObserver on its own children (which would fire on\n * every light-DOM cell render while scrolling).\n */\nconst watchers = new WeakMap<Element, () => void>();\n\n/** Calls `onChange` whenever an `<argus-column>` child of `host` is added, removed, moved or changed. */\nexport function watchColumns(host: Element, onChange: () => void): void {\n watchers.set(host, onChange);\n}\n\nexport function unwatchColumns(host: Element): void {\n watchers.delete(host);\n}\n\nfunction notify(parent: Element | null): void {\n if (parent) watchers.get(parent)?.();\n}\n\n/** `width` attribute: `\"90\"` or `\"90px\"` → 90, `\"auto\"`, `\"2fr\"` → `{ flex: 2 }`. */\nconst widthConverter: ComplexAttributeConverter<ColumnWidth | undefined> = {\n fromAttribute(value) {\n if (value === null) return undefined;\n const text = value.trim().toLowerCase();\n if (text === 'auto') return 'auto';\n const match = /^(\\d*\\.?\\d+)(px|fr)?$/.exec(text);\n if (!match) return undefined;\n const n = Number(match[1]);\n return match[2] === 'fr' ? { flex: n } : n;\n },\n};\n\n/**\n * Boolean attribute with a default that may be `true`: absent → unset (the\n * default applies), `\"false\"` → `false`, anything else → `true`.\n */\nconst flagConverter: ComplexAttributeConverter<boolean | undefined> = {\n fromAttribute(value) {\n return value === null ? undefined : value.trim().toLowerCase() !== 'false';\n },\n};\n\n/**\n * One column of the parent `<argus-table>`, written as markup instead of an entry in\n * its `columns` property. It is data only and renders nothing.\n *\n * Only direct children of the table count, in document order. A non-empty `columns`\n * property wins over the children. Adding, removing, moving or changing a column\n * updates the table; sizes, order and sorting are kept by `column-id`.\n *\n * A `<template>` child is the content of every cell in the column (static: the same\n * for each row). Set the `cell` property for content that depends on the row.\n *\n * @summary Declarative column of an `<argus-table>`.\n */\n@customElement('argus-column')\nexport class ArgusColumn<T = unknown> extends ReactiveElement {\n /** Stable key, used in state objects, events and persistence. Must be unique within the table. */\n @property({ attribute: 'column-id' })\n columnId = '';\n\n /** Header content: text as an attribute; a Lit template, a node or a function as a property. */\n @property()\n header?: CellContent | (() => CellContent);\n\n /**\n * How to read the cell value: a property path such as `customer.name`, or (as a\n * property) a function of the row and its index.\n */\n @property()\n accessor?: string | ((row: T, index: number) => unknown);\n\n /** Cell content from the row: `(row, context) => content`. Property only; wins over a `<template>` child. */\n @property({ attribute: false })\n cell?: (row: T, context: CellContext<T>) => CellContent;\n\n /** Width: `90` (px), `auto` to fit the content, or `2fr` for a share of the free space. Default: 150 px. */\n @property({ converter: widthConverter })\n width?: ColumnWidth;\n\n /** Lower bound for resizing and for flex columns, in px. Default: 40. */\n @property({ attribute: 'min-width', type: Number })\n minWidth?: number;\n\n /** Upper bound for resizing, in px. Default: no limit. */\n @property({ attribute: 'max-width', type: Number })\n maxWidth?: number;\n\n /** Pins the column to the `start` or `end` side. */\n @property()\n pin?: ColumnPin;\n\n /** Text alignment: `start`, `center` or `end`. Default: `start`. */\n @property()\n align?: ColumnAlign;\n\n /** Whether the header can be clicked to sort. Default: `false`. */\n @property({ converter: flagConverter })\n sortable?: boolean;\n\n /** Whether the column can be resized. Default: `true`; `resizable=\"false\"` turns it off. */\n @property({ converter: flagConverter })\n resizable?: boolean;\n\n /** Whether the column can be moved. Default: `true`; `reorderable=\"false\"` turns it off. */\n @property({ converter: flagConverter })\n reorderable?: boolean;\n\n #parent: Element | null = null;\n #def: ColumnDef<T> | undefined;\n readonly #children = new MutationObserver(() => {\n this.#def = undefined;\n this.requestUpdate();\n });\n\n /** Data only: no shadow root, nothing rendered. */\n protected override createRenderRoot(): HTMLElement {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#children.observe(this, { childList: true });\n this.#parent = this.parentElement;\n notify(this.#parent);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#children.disconnect();\n const parent = this.#parent;\n this.#parent = null;\n notify(parent);\n }\n\n /**\n * The column as the table reads it. Unset fields stay `undefined`, which the\n * table reads as its defaults. An unknown `pin` is ignored and an unknown\n * `align` falls back to `start`.\n */\n toColumnDef(): ColumnDef<T> {\n if (this.#def) return this.#def;\n const template = [...this.children].find((c) => c instanceof HTMLTemplateElement);\n return (this.#def = {\n id: this.columnId,\n header: this.header,\n accessor: this.accessor,\n cell: this.cell ?? (template && (() => html`${templateContent(template)}`)),\n width: this.width,\n minWidth: this.minWidth,\n maxWidth: this.maxWidth,\n pin: this.pin,\n align: this.align,\n sortable: this.sortable,\n resizable: this.resizable,\n reorderable: this.reorderable,\n });\n }\n\n protected override willUpdate(): void {\n this.#def = undefined;\n }\n\n protected override updated(): void {\n notify(this.#parent);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'argus-column': ArgusColumn;\n }\n}\n"],"mappings":"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"}