@vobs/table 1.1.0 → 1.2.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.
Files changed (49) hide show
  1. package/dist/column-settings.cjs +1036 -0
  2. package/dist/column-settings.cjs.map +1 -0
  3. package/dist/column-settings.d.cts +7 -0
  4. package/dist/column-settings.d.ts +7 -0
  5. package/dist/column-settings.js +1034 -0
  6. package/dist/column-settings.js.map +1 -0
  7. package/dist/data-table.cjs +1671 -0
  8. package/dist/data-table.cjs.map +1 -0
  9. package/dist/data-table.d.cts +7 -0
  10. package/dist/data-table.d.ts +7 -0
  11. package/dist/data-table.js +1669 -0
  12. package/dist/data-table.js.map +1 -0
  13. package/dist/icons.cjs +835 -0
  14. package/dist/icons.cjs.map +1 -0
  15. package/dist/icons.d.cts +8 -0
  16. package/dist/icons.d.ts +8 -0
  17. package/dist/icons.js +833 -0
  18. package/dist/icons.js.map +1 -0
  19. package/dist/index.cjs +2067 -0
  20. package/dist/index.cjs.map +1 -0
  21. package/dist/index.d.cts +8 -0
  22. package/dist/index.d.ts +8 -0
  23. package/dist/index.js +2059 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/persistence.cjs +86 -0
  26. package/dist/persistence.cjs.map +1 -0
  27. package/dist/persistence.d.cts +8 -0
  28. package/dist/persistence.d.ts +8 -0
  29. package/dist/persistence.js +83 -0
  30. package/dist/persistence.js.map +1 -0
  31. package/dist/styles/styles.css +1 -0
  32. package/dist/styles/table.css +209 -0
  33. package/dist/types.cjs +4 -0
  34. package/dist/types.cjs.map +1 -0
  35. package/dist/types.d.cts +164 -0
  36. package/dist/types.d.ts +164 -0
  37. package/dist/types.js +3 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/utils.cjs +525 -0
  40. package/dist/utils.cjs.map +1 -0
  41. package/dist/utils.d.cts +19 -0
  42. package/dist/utils.d.ts +19 -0
  43. package/dist/utils.js +511 -0
  44. package/dist/utils.js.map +1 -0
  45. package/package.json +38 -11
  46. package/src/data-table.ts +26 -10
  47. package/src/icons.ts +14 -0
  48. package/src/index.ts +1 -0
  49. package/src/types.ts +4 -2
@@ -0,0 +1,86 @@
1
+ 'use strict';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
+
6
+ // packages/table/src/persistence.ts
7
+ function createColumnSettingsPersistence(storage, key) {
8
+ const normalizedKey = key.trim();
9
+ if (!normalizedKey) throw new Error("VOBS_TABLE001: column settings key \u4E0D\u80FD\u4E3A\u7A7A");
10
+ return {
11
+ load() {
12
+ return storage.get(normalizedKey);
13
+ },
14
+ save(settings) {
15
+ storage.set(normalizedKey, settings);
16
+ },
17
+ reset() {
18
+ storage.remove(normalizedKey);
19
+ }
20
+ };
21
+ }
22
+ __name(createColumnSettingsPersistence, "createColumnSettingsPersistence");
23
+ function createLocalColumnSettingsPersistence(key, storage) {
24
+ const normalizedKey = key.trim();
25
+ if (!normalizedKey) throw new Error("VOBS_TABLE001: column settings key \u4E0D\u80FD\u4E3A\u7A7A");
26
+ const memory = /* @__PURE__ */ new Map();
27
+ let backend = storage ?? resolveLocalStorage();
28
+ return {
29
+ load() {
30
+ const raw = read();
31
+ if (!raw) return void 0;
32
+ try {
33
+ const value = JSON.parse(raw);
34
+ return isColumnSettings(value) ? value : void 0;
35
+ } catch {
36
+ return void 0;
37
+ }
38
+ },
39
+ save(settings) {
40
+ const raw = JSON.stringify(settings);
41
+ memory.set(normalizedKey, raw);
42
+ try {
43
+ backend?.setItem(normalizedKey, raw);
44
+ } catch {
45
+ backend = void 0;
46
+ }
47
+ },
48
+ reset() {
49
+ memory.delete(normalizedKey);
50
+ try {
51
+ backend?.removeItem(normalizedKey);
52
+ } catch {
53
+ backend = void 0;
54
+ }
55
+ }
56
+ };
57
+ function read() {
58
+ try {
59
+ return backend?.getItem(normalizedKey) ?? memory.get(normalizedKey) ?? null;
60
+ } catch {
61
+ backend = void 0;
62
+ return memory.get(normalizedKey) ?? null;
63
+ }
64
+ }
65
+ }
66
+ __name(createLocalColumnSettingsPersistence, "createLocalColumnSettingsPersistence");
67
+ function resolveLocalStorage() {
68
+ if (typeof window === "undefined") return void 0;
69
+ try {
70
+ return window.localStorage;
71
+ } catch {
72
+ return void 0;
73
+ }
74
+ }
75
+ __name(resolveLocalStorage, "resolveLocalStorage");
76
+ function isColumnSettings(value) {
77
+ if (!value || typeof value !== "object") return false;
78
+ const candidate = value;
79
+ return Array.isArray(candidate.visibleColumnIds) && candidate.visibleColumnIds.every((id) => typeof id === "string") && Array.isArray(candidate.columnOrder) && candidate.columnOrder.every((id) => typeof id === "string") && Boolean(candidate.columnWidths) && typeof candidate.columnWidths === "object" && !Array.isArray(candidate.columnWidths);
80
+ }
81
+ __name(isColumnSettings, "isColumnSettings");
82
+
83
+ exports.createColumnSettingsPersistence = createColumnSettingsPersistence;
84
+ exports.createLocalColumnSettingsPersistence = createLocalColumnSettingsPersistence;
85
+ //# sourceMappingURL=persistence.cjs.map
86
+ //# sourceMappingURL=persistence.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/persistence.ts"],"names":[],"mappings":"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","file":"persistence.cjs","sourcesContent":["import type {\n DataTableColumnSettings,\n DataTableColumnSettingsPersistence,\n DataTableColumnSettingsStorage\n} from './types'\n\nexport function createColumnSettingsPersistence(\n storage: DataTableColumnSettingsStorage,\n key: string\n): DataTableColumnSettingsPersistence {\n const normalizedKey = key.trim()\n if (!normalizedKey) throw new Error('VOBS_TABLE001: column settings key 不能为空')\n\n return {\n load(): DataTableColumnSettings | null | undefined {\n return storage.get<DataTableColumnSettings>(normalizedKey)\n },\n save(settings: DataTableColumnSettings): void {\n storage.set(normalizedKey, settings)\n },\n reset(): void {\n storage.remove(normalizedKey)\n }\n }\n}\n\nexport function createLocalColumnSettingsPersistence(\n key: string,\n storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>\n): DataTableColumnSettingsPersistence {\n const normalizedKey = key.trim()\n if (!normalizedKey) throw new Error('VOBS_TABLE001: column settings key 不能为空')\n const memory = new Map<string, string>()\n let backend = storage ?? resolveLocalStorage()\n\n return {\n load(): DataTableColumnSettings | undefined {\n const raw = read()\n if (!raw) return undefined\n try {\n const value: unknown = JSON.parse(raw)\n return isColumnSettings(value) ? value : undefined\n } catch {\n return undefined\n }\n },\n save(settings: DataTableColumnSettings): void {\n const raw = JSON.stringify(settings)\n memory.set(normalizedKey, raw)\n try {\n backend?.setItem(normalizedKey, raw)\n } catch {\n backend = undefined\n }\n },\n reset(): void {\n memory.delete(normalizedKey)\n try {\n backend?.removeItem(normalizedKey)\n } catch {\n backend = undefined\n }\n }\n }\n\n function read(): string | null {\n try {\n return backend?.getItem(normalizedKey) ?? memory.get(normalizedKey) ?? null\n } catch {\n backend = undefined\n return memory.get(normalizedKey) ?? null\n }\n }\n}\n\nfunction resolveLocalStorage(): Pick<Storage, 'getItem' | 'setItem' | 'removeItem'> | undefined {\n if (typeof window === 'undefined') return undefined\n try {\n return window.localStorage\n } catch {\n return undefined\n }\n}\n\nfunction isColumnSettings(value: unknown): value is DataTableColumnSettings {\n if (!value || typeof value !== 'object') return false\n const candidate = value as {\n visibleColumnIds?: unknown\n columnOrder?: unknown\n columnWidths?: unknown\n }\n return Array.isArray(candidate.visibleColumnIds)\n && candidate.visibleColumnIds.every(id => typeof id === 'string')\n && Array.isArray(candidate.columnOrder)\n && candidate.columnOrder.every(id => typeof id === 'string')\n && Boolean(candidate.columnWidths)\n && typeof candidate.columnWidths === 'object'\n && !Array.isArray(candidate.columnWidths)\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { DataTableColumnSettingsStorage, DataTableColumnSettingsPersistence } from './types.cjs';
2
+ import '@vobs/reactivity';
3
+ import '@vobs/vobs';
4
+
5
+ declare function createColumnSettingsPersistence(storage: DataTableColumnSettingsStorage, key: string): DataTableColumnSettingsPersistence;
6
+ declare function createLocalColumnSettingsPersistence(key: string, storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>): DataTableColumnSettingsPersistence;
7
+
8
+ export { createColumnSettingsPersistence, createLocalColumnSettingsPersistence };
@@ -0,0 +1,8 @@
1
+ import { DataTableColumnSettingsStorage, DataTableColumnSettingsPersistence } from './types.js';
2
+ import '@vobs/reactivity';
3
+ import '@vobs/vobs';
4
+
5
+ declare function createColumnSettingsPersistence(storage: DataTableColumnSettingsStorage, key: string): DataTableColumnSettingsPersistence;
6
+ declare function createLocalColumnSettingsPersistence(key: string, storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>): DataTableColumnSettingsPersistence;
7
+
8
+ export { createColumnSettingsPersistence, createLocalColumnSettingsPersistence };
@@ -0,0 +1,83 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // packages/table/src/persistence.ts
5
+ function createColumnSettingsPersistence(storage, key) {
6
+ const normalizedKey = key.trim();
7
+ if (!normalizedKey) throw new Error("VOBS_TABLE001: column settings key \u4E0D\u80FD\u4E3A\u7A7A");
8
+ return {
9
+ load() {
10
+ return storage.get(normalizedKey);
11
+ },
12
+ save(settings) {
13
+ storage.set(normalizedKey, settings);
14
+ },
15
+ reset() {
16
+ storage.remove(normalizedKey);
17
+ }
18
+ };
19
+ }
20
+ __name(createColumnSettingsPersistence, "createColumnSettingsPersistence");
21
+ function createLocalColumnSettingsPersistence(key, storage) {
22
+ const normalizedKey = key.trim();
23
+ if (!normalizedKey) throw new Error("VOBS_TABLE001: column settings key \u4E0D\u80FD\u4E3A\u7A7A");
24
+ const memory = /* @__PURE__ */ new Map();
25
+ let backend = storage ?? resolveLocalStorage();
26
+ return {
27
+ load() {
28
+ const raw = read();
29
+ if (!raw) return void 0;
30
+ try {
31
+ const value = JSON.parse(raw);
32
+ return isColumnSettings(value) ? value : void 0;
33
+ } catch {
34
+ return void 0;
35
+ }
36
+ },
37
+ save(settings) {
38
+ const raw = JSON.stringify(settings);
39
+ memory.set(normalizedKey, raw);
40
+ try {
41
+ backend?.setItem(normalizedKey, raw);
42
+ } catch {
43
+ backend = void 0;
44
+ }
45
+ },
46
+ reset() {
47
+ memory.delete(normalizedKey);
48
+ try {
49
+ backend?.removeItem(normalizedKey);
50
+ } catch {
51
+ backend = void 0;
52
+ }
53
+ }
54
+ };
55
+ function read() {
56
+ try {
57
+ return backend?.getItem(normalizedKey) ?? memory.get(normalizedKey) ?? null;
58
+ } catch {
59
+ backend = void 0;
60
+ return memory.get(normalizedKey) ?? null;
61
+ }
62
+ }
63
+ }
64
+ __name(createLocalColumnSettingsPersistence, "createLocalColumnSettingsPersistence");
65
+ function resolveLocalStorage() {
66
+ if (typeof window === "undefined") return void 0;
67
+ try {
68
+ return window.localStorage;
69
+ } catch {
70
+ return void 0;
71
+ }
72
+ }
73
+ __name(resolveLocalStorage, "resolveLocalStorage");
74
+ function isColumnSettings(value) {
75
+ if (!value || typeof value !== "object") return false;
76
+ const candidate = value;
77
+ return Array.isArray(candidate.visibleColumnIds) && candidate.visibleColumnIds.every((id) => typeof id === "string") && Array.isArray(candidate.columnOrder) && candidate.columnOrder.every((id) => typeof id === "string") && Boolean(candidate.columnWidths) && typeof candidate.columnWidths === "object" && !Array.isArray(candidate.columnWidths);
78
+ }
79
+ __name(isColumnSettings, "isColumnSettings");
80
+
81
+ export { createColumnSettingsPersistence, createLocalColumnSettingsPersistence };
82
+ //# sourceMappingURL=persistence.js.map
83
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/persistence.ts"],"names":[],"mappings":"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","file":"persistence.js","sourcesContent":["import type {\n DataTableColumnSettings,\n DataTableColumnSettingsPersistence,\n DataTableColumnSettingsStorage\n} from './types'\n\nexport function createColumnSettingsPersistence(\n storage: DataTableColumnSettingsStorage,\n key: string\n): DataTableColumnSettingsPersistence {\n const normalizedKey = key.trim()\n if (!normalizedKey) throw new Error('VOBS_TABLE001: column settings key 不能为空')\n\n return {\n load(): DataTableColumnSettings | null | undefined {\n return storage.get<DataTableColumnSettings>(normalizedKey)\n },\n save(settings: DataTableColumnSettings): void {\n storage.set(normalizedKey, settings)\n },\n reset(): void {\n storage.remove(normalizedKey)\n }\n }\n}\n\nexport function createLocalColumnSettingsPersistence(\n key: string,\n storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>\n): DataTableColumnSettingsPersistence {\n const normalizedKey = key.trim()\n if (!normalizedKey) throw new Error('VOBS_TABLE001: column settings key 不能为空')\n const memory = new Map<string, string>()\n let backend = storage ?? resolveLocalStorage()\n\n return {\n load(): DataTableColumnSettings | undefined {\n const raw = read()\n if (!raw) return undefined\n try {\n const value: unknown = JSON.parse(raw)\n return isColumnSettings(value) ? value : undefined\n } catch {\n return undefined\n }\n },\n save(settings: DataTableColumnSettings): void {\n const raw = JSON.stringify(settings)\n memory.set(normalizedKey, raw)\n try {\n backend?.setItem(normalizedKey, raw)\n } catch {\n backend = undefined\n }\n },\n reset(): void {\n memory.delete(normalizedKey)\n try {\n backend?.removeItem(normalizedKey)\n } catch {\n backend = undefined\n }\n }\n }\n\n function read(): string | null {\n try {\n return backend?.getItem(normalizedKey) ?? memory.get(normalizedKey) ?? null\n } catch {\n backend = undefined\n return memory.get(normalizedKey) ?? null\n }\n }\n}\n\nfunction resolveLocalStorage(): Pick<Storage, 'getItem' | 'setItem' | 'removeItem'> | undefined {\n if (typeof window === 'undefined') return undefined\n try {\n return window.localStorage\n } catch {\n return undefined\n }\n}\n\nfunction isColumnSettings(value: unknown): value is DataTableColumnSettings {\n if (!value || typeof value !== 'object') return false\n const candidate = value as {\n visibleColumnIds?: unknown\n columnOrder?: unknown\n columnWidths?: unknown\n }\n return Array.isArray(candidate.visibleColumnIds)\n && candidate.visibleColumnIds.every(id => typeof id === 'string')\n && Array.isArray(candidate.columnOrder)\n && candidate.columnOrder.every(id => typeof id === 'string')\n && Boolean(candidate.columnWidths)\n && typeof candidate.columnWidths === 'object'\n && !Array.isArray(candidate.columnWidths)\n}\n"]}
@@ -0,0 +1 @@
1
+ @import './table.css';
@@ -0,0 +1,209 @@
1
+ .vobs-data-table {
2
+ background: var(--vobs-table-surface, var(--bg-base-secondary, #fff));
3
+ border: 1px solid var(--vobs-table-border, var(--border-neutral-l1, #d0d7de));
4
+ border-radius: var(--vobs-table-radius, 4px);
5
+ color: var(--vobs-table-text, var(--text-default, #1f2328));
6
+ overflow: hidden;
7
+ }
8
+
9
+ .vobs-data-table__toolbar,
10
+ .vobs-data-table__footer {
11
+ padding: var(--vobs-table-space, 12px);
12
+ border-color: var(--vobs-table-border, var(--border-neutral-l1, #d0d7de));
13
+ }
14
+
15
+ .vobs-data-table__toolbar { border-bottom: 1px solid var(--vobs-table-border, var(--border-neutral-l1, #d0d7de)); }
16
+ .vobs-data-table__footer { border-top: 1px solid var(--vobs-table-border, var(--border-neutral-l1, #d0d7de)); }
17
+ .vobs-data-table__viewport { width: 100%; overflow-x: auto; }
18
+ .vobs-data-table__table { width: 100%; border-collapse: collapse; table-layout: fixed; }
19
+ .vobs-data-table th,
20
+ .vobs-data-table td {
21
+ padding: var(--vobs-table-cell-padding, 10px 12px);
22
+ border-bottom: 1px solid var(--vobs-table-border, var(--border-neutral-l1, #d0d7de));
23
+ text-align: start;
24
+ vertical-align: middle;
25
+ }
26
+ .vobs-data-table th { color: var(--vobs-table-muted, var(--text-tertiary, #57606a)); font-size: 0.85em; font-weight: 600; }
27
+ .vobs-data-table--sticky-header thead th {
28
+ position: sticky;
29
+ top: var(--vobs-table-sticky-top, 0px);
30
+ z-index: 2;
31
+ background: var(--vobs-table-header-surface, var(--vobs-table-surface, var(--bg-base-secondary, #fff)));
32
+ box-shadow: 0 1px 0 var(--vobs-table-border, var(--border-neutral-l1, #d0d7de));
33
+ }
34
+ .vobs-data-table tbody tr:last-child td { border-bottom: 0; }
35
+ .vobs-data-table [data-align="center"] { text-align: center; }
36
+ .vobs-data-table [data-align="end"] { text-align: end; font-variant-numeric: tabular-nums; }
37
+ .vobs-data-table tr[data-clickable="true"] { cursor: pointer; }
38
+ .vobs-data-table tr[data-clickable="true"]:hover { background: var(--vobs-table-row-hover, var(--bg-overlay-l2, rgba(0, 0, 0, .04))); }
39
+ .vobs-data-table__sort,
40
+ .vobs-data-table__page-button {
41
+ border: 0;
42
+ background: transparent;
43
+ color: inherit;
44
+ cursor: pointer;
45
+ font: inherit;
46
+ }
47
+ .vobs-data-table__sort { display: inline-flex; align-items: center; gap: 6px; padding: 0; }
48
+ .vobs-data-table__sort:hover,
49
+ .vobs-data-table__sort:focus-visible { color: var(--vobs-table-sort-active, var(--text-brand, #32F08C)); }
50
+ .vobs-data-table__sort-icon {
51
+ display: inline-flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ min-width: 1em;
55
+ color: var(--vobs-table-muted, var(--text-tertiary, #57606a));
56
+ }
57
+ .vobs-data-table th[data-sort-direction] .vobs-data-table__sort-icon {
58
+ color: var(--vobs-table-sort-active, var(--text-brand, #32F08C));
59
+ }
60
+ .vobs-data-table__state { padding: 32px 12px; color: var(--vobs-table-muted, var(--text-tertiary, #57606a)); text-align: center; }
61
+ .vobs-data-table__spacer { padding: 0; border: 0; }
62
+ .vobs-data-table__footer-content,
63
+ .vobs-data-table__pagination { display: flex; align-items: center; gap: 8px; }
64
+ .vobs-data-table__footer-content { justify-content: space-between; flex-wrap: wrap; }
65
+ .vobs-data-table__summary {
66
+ color: var(--vobs-table-muted, var(--text-tertiary, #57606a));
67
+ font-size: 0.85em;
68
+ font-weight: 600;
69
+ white-space: nowrap;
70
+ }
71
+ .vobs-data-table__pagination { flex-wrap: wrap; justify-content: flex-end; }
72
+ .vobs-data-table__pagination-pages { display: inline-flex; align-items: center; gap: 4px; }
73
+ .vobs-data-table__page-button {
74
+ display: inline-flex;
75
+ align-items: center;
76
+ justify-content: center;
77
+ border: 1px solid var(--vobs-table-border, var(--border-neutral-l1, #d0d7de));
78
+ border-radius: 2px;
79
+ min-width: 24px;
80
+ height: 24px;
81
+ padding: 0 6px;
82
+ }
83
+ .vobs-data-table__page-button.is-active {
84
+ background: var(--vobs-table-active, var(--bg-overlay-l2, rgba(0, 0, 0, .06)));
85
+ border-color: var(--vobs-table-active-border, var(--border-neutral-l2, #afb8c1));
86
+ }
87
+ .vobs-data-table__page-button:disabled { cursor: not-allowed; opacity: .45; }
88
+ .vobs-data-table__page-ellipsis { min-width: 24px; text-align: center; color: var(--vobs-table-muted, var(--text-tertiary, #57606a)); }
89
+ .vobs-data-table__pagination-jump { display: inline-flex; align-items: center; gap: 6px; }
90
+ .vobs-data-table__page-size { display: inline-flex; align-items: center; gap: 6px; margin-left: 4px; color: var(--vobs-table-muted, var(--text-tertiary, #57606a)); font-size: 0.85em; font-weight: 600; white-space: nowrap; }
91
+ .vobs-data-table__page-size-select {
92
+ box-sizing: border-box;
93
+ height: 24px;
94
+ padding: 0 20px 0 6px;
95
+ color: inherit;
96
+ background: var(--bg-overlay-l1, transparent);
97
+ border: 1px solid var(--vobs-table-border, var(--border-neutral-l1, #d0d7de));
98
+ border-radius: 2px;
99
+ font: inherit;
100
+ font-weight: 400;
101
+ }
102
+ .vobs-data-table__jump-label { display: inline-flex; align-items: center; gap: 6px; color: var(--vobs-table-muted, var(--text-tertiary, #57606a)); font-size: 0.85em; font-weight: 600; }
103
+ .vobs-data-table__jump-input {
104
+ box-sizing: border-box;
105
+ width: 52px;
106
+ height: 24px;
107
+ padding: 0 5px;
108
+ color: inherit;
109
+ background: transparent;
110
+ border: 1px solid var(--vobs-table-border, var(--border-neutral-l1, #d0d7de));
111
+ border-radius: 2px;
112
+ font: inherit;
113
+ font-weight: 400;
114
+ text-align: center;
115
+ }
116
+ .vobs-data-table__jump-submit { min-width: 32px; }
117
+
118
+ .vobs-column-settings { position: relative; display: inline-block; }
119
+ .vobs-column-settings__trigger { cursor: pointer; list-style: none; }
120
+ .vobs-column-settings__trigger::-webkit-details-marker { display: none; }
121
+ .vobs-column-settings__panel {
122
+ position: absolute;
123
+ z-index: 10;
124
+ right: 0;
125
+ min-width: 160px;
126
+ margin-top: 4px;
127
+ padding: 8px;
128
+ background: var(--vobs-table-surface, var(--bg-base-secondary, #fff));
129
+ border: 1px solid var(--vobs-table-border, var(--border-neutral-l1, #d0d7de));
130
+ border-radius: var(--vobs-table-radius, 4px);
131
+ box-shadow: 0 8px 24px rgba(0, 0, 0, .16);
132
+ }
133
+ .vobs-column-settings__option { display: flex; align-items: center; gap: 8px; padding: 4px; white-space: nowrap; }
134
+ .vobs-column-settings__reset {
135
+ display: block;
136
+ width: 100%;
137
+ margin-bottom: 8px;
138
+ padding: 4px 6px;
139
+ color: var(--vobs-table-muted, var(--text-tertiary, #57606a));
140
+ background: transparent;
141
+ border: 1px solid var(--vobs-table-border, var(--border-neutral-l1, #d0d7de));
142
+ border-radius: 2px;
143
+ cursor: pointer;
144
+ font: inherit;
145
+ text-align: start;
146
+ }
147
+ .vobs-column-settings__reset:hover,
148
+ .vobs-column-settings__move:hover:not(:disabled) {
149
+ color: var(--vobs-table-text, var(--text-default, #1f2328));
150
+ background: var(--vobs-table-row-hover, var(--bg-overlay-l2, rgba(0, 0, 0, .04)));
151
+ }
152
+ .vobs-column-settings__visibility,
153
+ .vobs-column-settings__layout {
154
+ display: grid;
155
+ gap: 2px;
156
+ }
157
+ .vobs-column-settings__layout {
158
+ margin-top: 8px;
159
+ padding-top: 8px;
160
+ border-top: 1px solid var(--vobs-table-border, var(--border-neutral-l1, #d0d7de));
161
+ }
162
+ .vobs-column-settings__layout-option {
163
+ display: flex;
164
+ align-items: center;
165
+ justify-content: space-between;
166
+ gap: 12px;
167
+ padding: 4px;
168
+ }
169
+ .vobs-column-settings__layout-label {
170
+ min-width: 0;
171
+ overflow: hidden;
172
+ text-overflow: ellipsis;
173
+ white-space: nowrap;
174
+ }
175
+ .vobs-column-settings__layout-controls {
176
+ display: inline-flex;
177
+ align-items: center;
178
+ gap: 3px;
179
+ flex: 0 0 auto;
180
+ }
181
+ .vobs-column-settings__move {
182
+ display: inline-flex;
183
+ align-items: center;
184
+ justify-content: center;
185
+ width: 24px;
186
+ height: 24px;
187
+ padding: 0;
188
+ color: inherit;
189
+ background: transparent;
190
+ border: 1px solid var(--vobs-table-border, var(--border-neutral-l1, #d0d7de));
191
+ border-radius: 2px;
192
+ cursor: pointer;
193
+ font: inherit;
194
+ line-height: 1;
195
+ }
196
+ .vobs-column-settings__move:disabled { cursor: not-allowed; opacity: .45; }
197
+ .vobs-column-settings__width {
198
+ box-sizing: border-box;
199
+ width: 64px;
200
+ height: 24px;
201
+ padding: 0 5px;
202
+ color: inherit;
203
+ background: transparent;
204
+ border: 1px solid var(--vobs-table-border, var(--border-neutral-l1, #d0d7de));
205
+ border-radius: 2px;
206
+ font: inherit;
207
+ text-align: end;
208
+ }
209
+ .vobs-column-settings__width::placeholder { color: var(--vobs-table-muted, var(--text-tertiary, #57606a)); }
package/dist/types.cjs ADDED
@@ -0,0 +1,4 @@
1
+ 'use strict';
2
+
3
+ //# sourceMappingURL=types.cjs.map
4
+ //# sourceMappingURL=types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"types.cjs"}
@@ -0,0 +1,164 @@
1
+ import { Signal } from '@vobs/reactivity';
2
+ import { VobsNode } from '@vobs/vobs';
3
+
4
+ type DataTableAlign = 'start' | 'center' | 'end';
5
+ type DataTableSortDirection = 'asc' | 'desc';
6
+ type DataTableSortType = 'text' | 'number' | 'date' | 'boolean';
7
+ type DataTableSortingMode = 'client' | 'server';
8
+ type DataTablePaginationMode = 'simple' | 'standard' | 'all';
9
+ interface DataTableSort {
10
+ readonly columnId: string;
11
+ readonly direction: DataTableSortDirection;
12
+ /** Optional backend field supplied by the column definition. */
13
+ readonly sortKey?: string;
14
+ }
15
+ interface DataTableQuery {
16
+ readonly page: number;
17
+ readonly pageSize: number;
18
+ readonly sort: DataTableSort | null;
19
+ readonly filters: Readonly<Record<string, unknown>>;
20
+ }
21
+ interface DataTablePage<Row> {
22
+ readonly rows: readonly Row[];
23
+ readonly total?: number;
24
+ }
25
+ type DataTableResourceData<Row> = readonly Row[] | DataTablePage<Row>;
26
+ interface DataTableResource<Row> {
27
+ readonly data: {
28
+ readonly value: DataTableResourceData<Row> | null;
29
+ };
30
+ readonly error: {
31
+ readonly value: Error | null;
32
+ };
33
+ readonly loading: {
34
+ readonly value: boolean;
35
+ };
36
+ refetch(): Promise<unknown>;
37
+ }
38
+ type DataTableChildren = VobsNode | string | number | readonly DataTableChildren[] | (() => DataTableChildren | null | undefined);
39
+ interface DataTableColumn<Row = Record<string, unknown>> {
40
+ readonly id: string;
41
+ readonly label: string;
42
+ readonly key?: keyof Row;
43
+ readonly render?: (row: Row, index: number) => DataTableChildren;
44
+ readonly compare?: (left: Row, right: Row) => number;
45
+ /** Value used by the built-in client sorter when compare is not provided. */
46
+ readonly sortValue?: (row: Row) => unknown;
47
+ /** Optional value kind for deterministic client-side sorting. */
48
+ readonly sortType?: DataTableSortType;
49
+ /** Backend field mapping; emitted together with the stable column id in DataTableSort. */
50
+ readonly sortKey?: string;
51
+ /** Apply a filter value supplied by the page or another external filter control. */
52
+ readonly filter?: (row: Row, value: unknown) => boolean;
53
+ readonly sortable?: boolean;
54
+ /** Marks a column as supported by an external filter UI; no control is rendered in the table. */
55
+ readonly filterable?: boolean;
56
+ readonly visible?: boolean;
57
+ readonly align?: DataTableAlign;
58
+ readonly width?: string | number;
59
+ readonly minWidth?: string | number;
60
+ }
61
+ interface DataTableColumnSettings {
62
+ readonly visibleColumnIds: readonly string[];
63
+ readonly columnOrder: readonly string[];
64
+ readonly columnWidths: Readonly<Record<string, string | number>>;
65
+ }
66
+ interface DataTableColumnSettingsPersistence {
67
+ load(): DataTableColumnSettings | null | undefined;
68
+ save(settings: DataTableColumnSettings): void;
69
+ reset?(): void;
70
+ }
71
+ /** Minimal storage shape accepted by createColumnSettingsPersistence. */
72
+ interface DataTableColumnSettingsStorage {
73
+ get<T>(key: string): T | null | undefined;
74
+ set<T>(key: string, value: T): void;
75
+ remove(key: string): void;
76
+ }
77
+ interface DataTableIcons {
78
+ readonly ascending?: DataTableChildren;
79
+ readonly descending?: DataTableChildren;
80
+ readonly unsorted?: DataTableChildren;
81
+ readonly previous?: DataTableChildren;
82
+ readonly next?: DataTableChildren;
83
+ }
84
+ interface DataTablePaginationContext {
85
+ readonly page: number;
86
+ readonly pageCount: number;
87
+ readonly pageSize: number;
88
+ readonly pageSizeOptions: readonly number[];
89
+ readonly total: number;
90
+ readonly visibleCount: number;
91
+ readonly goToPage: (page: number) => void;
92
+ readonly setPageSize: (pageSize: number) => void;
93
+ }
94
+ type DataTablePagination = DataTableChildren | ((context: DataTablePaginationContext) => DataTableChildren | null | undefined);
95
+ interface DataTableCommonProps {
96
+ readonly class?: string;
97
+ readonly className?: string;
98
+ readonly style?: string;
99
+ readonly id?: string;
100
+ readonly title?: string;
101
+ readonly role?: string;
102
+ readonly tabIndex?: number;
103
+ readonly [name: `aria-${string}`]: string | number | boolean | undefined;
104
+ readonly [name: `data-${string}`]: string | number | boolean | undefined;
105
+ }
106
+ interface KitDataTableProps<Row = Record<string, unknown>> extends DataTableCommonProps {
107
+ readonly columns?: readonly DataTableColumn<Row>[];
108
+ readonly rows?: readonly Row[];
109
+ readonly resource?: DataTableResource<Row>;
110
+ readonly rowKey?: (row: Row, index: number) => unknown;
111
+ /** 传入 Signal 时受控分页:表格翻页后自动写回信号。 */
112
+ readonly page?: number | Signal<number>;
113
+ readonly pageSize?: number | Signal<number>;
114
+ readonly total?: number;
115
+ readonly sort?: DataTableSort | null;
116
+ /** Client sorts loaded rows; server leaves row order to the resource owner. */
117
+ readonly sortingMode?: DataTableSortingMode;
118
+ /** Query state is owned by the caller when provided and is never edited by table-owned inputs. */
119
+ readonly filters?: Readonly<Record<string, unknown>>;
120
+ readonly columnSettings?: DataTableColumnSettings;
121
+ readonly visibleColumnIds?: readonly string[];
122
+ readonly virtual?: boolean;
123
+ readonly stickyHeader?: boolean;
124
+ readonly virtualHeight?: number;
125
+ readonly rowHeight?: number;
126
+ readonly overscan?: number;
127
+ readonly loading?: DataTableChildren;
128
+ readonly empty?: DataTableChildren;
129
+ readonly error?: (error: Error, retry: () => Promise<unknown>) => DataTableChildren;
130
+ readonly toolbar?: DataTableChildren;
131
+ readonly footer?: DataTableChildren;
132
+ readonly pagination?: DataTablePagination;
133
+ readonly paginationMode?: DataTablePaginationMode;
134
+ readonly pageSizeOptions?: readonly number[];
135
+ readonly pageSizeLabel?: string;
136
+ readonly icons?: DataTableIcons;
137
+ readonly previousLabel?: string;
138
+ readonly nextLabel?: string;
139
+ readonly jumpToLabel?: string;
140
+ readonly jumpToPlaceholder?: string;
141
+ readonly jumpToSubmitLabel?: string;
142
+ /** Formats the footer summary. The last two arguments are visible row count and page size. */
143
+ readonly pageLabel?: (page: number, pageCount: number, total: number, visibleCount: number, pageSize: number) => string;
144
+ /** Receives table-originated sort and pagination changes for a page-level query controller. */
145
+ readonly onQueryChange?: (query: DataTableQuery) => void;
146
+ readonly onRowClick?: (row: Row, index: number) => void;
147
+ readonly onVisibleColumnIdsChange?: (ids: readonly string[]) => void;
148
+ }
149
+ interface KitColumnSettingsProps<Row = Record<string, unknown>> extends DataTableCommonProps {
150
+ readonly columns?: readonly DataTableColumn<Row>[];
151
+ readonly settings?: DataTableColumnSettings;
152
+ readonly persistence?: DataTableColumnSettingsPersistence;
153
+ readonly visibleColumnIds?: readonly string[];
154
+ readonly trigger?: DataTableChildren;
155
+ readonly label?: string;
156
+ readonly closeLabel?: string;
157
+ readonly resetLabel?: string;
158
+ readonly onChange?: (ids: readonly string[]) => void;
159
+ readonly onSettingsChange?: (settings: DataTableColumnSettings) => void;
160
+ readonly onReset?: () => void;
161
+ readonly onPersistenceError?: (error: unknown) => void;
162
+ }
163
+
164
+ export type { DataTableAlign, DataTableChildren, DataTableColumn, DataTableColumnSettings, DataTableColumnSettingsPersistence, DataTableColumnSettingsStorage, DataTableCommonProps, DataTableIcons, DataTablePage, DataTablePagination, DataTablePaginationContext, DataTablePaginationMode, DataTableQuery, DataTableResource, DataTableResourceData, DataTableSort, DataTableSortDirection, DataTableSortType, DataTableSortingMode, KitColumnSettingsProps, KitDataTableProps };