@vobs/table 1.0.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.
- package/dist/column-settings.cjs +1036 -0
- package/dist/column-settings.cjs.map +1 -0
- package/dist/column-settings.d.cts +7 -0
- package/dist/column-settings.d.ts +7 -0
- package/dist/column-settings.js +1034 -0
- package/dist/column-settings.js.map +1 -0
- package/dist/data-table.cjs +1671 -0
- package/dist/data-table.cjs.map +1 -0
- package/dist/data-table.d.cts +7 -0
- package/dist/data-table.d.ts +7 -0
- package/dist/data-table.js +1669 -0
- package/dist/data-table.js.map +1 -0
- package/dist/icons.cjs +835 -0
- package/dist/icons.cjs.map +1 -0
- package/dist/icons.d.cts +8 -0
- package/dist/icons.d.ts +8 -0
- package/dist/icons.js +833 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.cjs +2067 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +2059 -0
- package/dist/index.js.map +1 -0
- package/dist/persistence.cjs +86 -0
- package/dist/persistence.cjs.map +1 -0
- package/dist/persistence.d.cts +8 -0
- package/dist/persistence.d.ts +8 -0
- package/dist/persistence.js +83 -0
- package/dist/persistence.js.map +1 -0
- package/dist/styles/styles.css +1 -0
- package/dist/styles/table.css +209 -0
- package/dist/types.cjs +4 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +164 -0
- package/dist/types.d.ts +164 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.cjs +525 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +19 -0
- package/dist/utils.d.ts +19 -0
- package/dist/utils.js +511 -0
- package/dist/utils.js.map +1 -0
- package/package.json +38 -11
- package/src/data-table.ts +26 -10
- package/src/icons.ts +14 -0
- package/src/index.ts +1 -0
- package/src/types.ts +4 -2
package/dist/types.d.ts
ADDED
|
@@ -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 };
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"types.js"}
|
package/dist/utils.cjs
ADDED
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
5
|
+
|
|
6
|
+
// packages/reactivity/src/debug.ts
|
|
7
|
+
var activeDebugHooks = null;
|
|
8
|
+
function hasDebugHooks() {
|
|
9
|
+
return activeDebugHooks !== null;
|
|
10
|
+
}
|
|
11
|
+
__name(hasDebugHooks, "hasDebugHooks");
|
|
12
|
+
function invokeDebug(name, ...args) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
__name(invokeDebug, "invokeDebug");
|
|
16
|
+
|
|
17
|
+
// packages/reactivity/src/owner.ts
|
|
18
|
+
var currentOwner = null;
|
|
19
|
+
function getCurrentOwner() {
|
|
20
|
+
return currentOwner;
|
|
21
|
+
}
|
|
22
|
+
__name(getCurrentOwner, "getCurrentOwner");
|
|
23
|
+
|
|
24
|
+
// packages/reactivity/src/signal.ts
|
|
25
|
+
var currentSubscriber = null;
|
|
26
|
+
function getCurrentSubscriber() {
|
|
27
|
+
return currentSubscriber;
|
|
28
|
+
}
|
|
29
|
+
__name(getCurrentSubscriber, "getCurrentSubscriber");
|
|
30
|
+
function setCurrentSubscriber(subscriber) {
|
|
31
|
+
currentSubscriber = subscriber;
|
|
32
|
+
}
|
|
33
|
+
__name(setCurrentSubscriber, "setCurrentSubscriber");
|
|
34
|
+
|
|
35
|
+
// packages/reactivity/src/scheduler.ts
|
|
36
|
+
var _Scheduler = class _Scheduler {
|
|
37
|
+
constructor() {
|
|
38
|
+
this.dirtyEffects = /* @__PURE__ */ new Set();
|
|
39
|
+
this.lowPriorityEffects = /* @__PURE__ */ new Set();
|
|
40
|
+
// flush 不可重入(flushing 标志保证),缓冲数组可在轮次间安全复用,避免每轮分配。
|
|
41
|
+
this.normalBuffer = [];
|
|
42
|
+
this.lowBuffer = [];
|
|
43
|
+
this.flushing = false;
|
|
44
|
+
this.scheduled = false;
|
|
45
|
+
this.batchDepth = 0;
|
|
46
|
+
}
|
|
47
|
+
schedule(effect2) {
|
|
48
|
+
if (effect2.disposed) return;
|
|
49
|
+
this.dirtyEffects.add(effect2);
|
|
50
|
+
this.lowPriorityEffects.delete(effect2);
|
|
51
|
+
this.ensureScheduled();
|
|
52
|
+
}
|
|
53
|
+
/** Queue an effect behind normal updates while preserving deterministic order. */
|
|
54
|
+
scheduleLow(effect2) {
|
|
55
|
+
if (effect2.disposed) return;
|
|
56
|
+
if (!this.dirtyEffects.has(effect2)) this.lowPriorityEffects.add(effect2);
|
|
57
|
+
this.ensureScheduled();
|
|
58
|
+
}
|
|
59
|
+
ensureScheduled() {
|
|
60
|
+
if (this.batchDepth === 0 && !this.flushing && !this.scheduled) {
|
|
61
|
+
this.scheduled = true;
|
|
62
|
+
queueMicrotask(() => {
|
|
63
|
+
this.scheduled = false;
|
|
64
|
+
this.flush();
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
remove(effect2) {
|
|
69
|
+
this.dirtyEffects.delete(effect2);
|
|
70
|
+
this.lowPriorityEffects.delete(effect2);
|
|
71
|
+
}
|
|
72
|
+
batch(fn) {
|
|
73
|
+
this.batchDepth++;
|
|
74
|
+
try {
|
|
75
|
+
return fn();
|
|
76
|
+
} finally {
|
|
77
|
+
this.batchDepth--;
|
|
78
|
+
if (this.batchDepth === 0) this.flush();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
flush() {
|
|
82
|
+
if (this.flushing || this.batchDepth > 0) return;
|
|
83
|
+
this.flushing = true;
|
|
84
|
+
let rounds = 0;
|
|
85
|
+
let firstError;
|
|
86
|
+
let hasError = false;
|
|
87
|
+
try {
|
|
88
|
+
while (this.dirtyEffects.size > 0 || this.lowPriorityEffects.size > 0) {
|
|
89
|
+
if (++rounds > 100) {
|
|
90
|
+
this.dirtyEffects.clear();
|
|
91
|
+
this.lowPriorityEffects.clear();
|
|
92
|
+
throw new Error("Vobs: \u54CD\u5E94\u5F0F\u66F4\u65B0\u8D85\u8FC7 100 \u8F6E\uFF0C\u53EF\u80FD\u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56");
|
|
93
|
+
}
|
|
94
|
+
this.collectRunnable(this.dirtyEffects, this.normalBuffer);
|
|
95
|
+
this.collectRunnable(this.lowPriorityEffects, this.lowBuffer);
|
|
96
|
+
sortEffects(this.normalBuffer);
|
|
97
|
+
sortEffects(this.lowBuffer);
|
|
98
|
+
for (const effect2 of this.normalBuffer) {
|
|
99
|
+
try {
|
|
100
|
+
effect2.run();
|
|
101
|
+
} catch (error) {
|
|
102
|
+
if (!hasError) {
|
|
103
|
+
firstError = error;
|
|
104
|
+
hasError = true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
for (const effect2 of this.lowBuffer) {
|
|
109
|
+
try {
|
|
110
|
+
effect2.run();
|
|
111
|
+
} catch (error) {
|
|
112
|
+
if (!hasError) {
|
|
113
|
+
firstError = error;
|
|
114
|
+
hasError = true;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
this.normalBuffer.length = 0;
|
|
119
|
+
this.lowBuffer.length = 0;
|
|
120
|
+
}
|
|
121
|
+
} finally {
|
|
122
|
+
this.normalBuffer.length = 0;
|
|
123
|
+
this.lowBuffer.length = 0;
|
|
124
|
+
this.flushing = false;
|
|
125
|
+
}
|
|
126
|
+
if (hasError) throw firstError;
|
|
127
|
+
}
|
|
128
|
+
/** 收集未 disposed 的 effect 并清空源集合;run() 期间新调度的 effect 留给下一轮。 */
|
|
129
|
+
collectRunnable(source, target) {
|
|
130
|
+
for (const effect2 of source) {
|
|
131
|
+
if (!effect2.disposed) target.push(effect2);
|
|
132
|
+
}
|
|
133
|
+
source.clear();
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
__name(_Scheduler, "Scheduler");
|
|
137
|
+
var Scheduler = _Scheduler;
|
|
138
|
+
function sortEffects(effects) {
|
|
139
|
+
if (effects.length > 1) {
|
|
140
|
+
effects.sort((a, b) => b.depth - a.depth || a.order - b.order);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
__name(sortEffects, "sortEffects");
|
|
144
|
+
var scheduler = new Scheduler();
|
|
145
|
+
|
|
146
|
+
// packages/reactivity/src/effect.ts
|
|
147
|
+
var nextEffectOrder = 1;
|
|
148
|
+
function cleanupDependencies(subscriber) {
|
|
149
|
+
for (const dependency of subscriber.dependencies) {
|
|
150
|
+
dependency.unsubscribe(subscriber);
|
|
151
|
+
}
|
|
152
|
+
subscriber.dependencies.clear();
|
|
153
|
+
}
|
|
154
|
+
__name(cleanupDependencies, "cleanupDependencies");
|
|
155
|
+
function effect(callback) {
|
|
156
|
+
const owner = getCurrentOwner();
|
|
157
|
+
let cleanup;
|
|
158
|
+
let dirty = true;
|
|
159
|
+
let disposed = false;
|
|
160
|
+
const eff = {
|
|
161
|
+
order: nextEffectOrder++,
|
|
162
|
+
depth: owner?.depth ?? 0,
|
|
163
|
+
dependencies: /* @__PURE__ */ new Set(),
|
|
164
|
+
get disposed() {
|
|
165
|
+
return disposed;
|
|
166
|
+
},
|
|
167
|
+
notify() {
|
|
168
|
+
if (disposed || dirty) return;
|
|
169
|
+
dirty = true;
|
|
170
|
+
scheduler.schedule(eff);
|
|
171
|
+
},
|
|
172
|
+
run() {
|
|
173
|
+
if (disposed || !dirty) return;
|
|
174
|
+
dirty = false;
|
|
175
|
+
const previousCleanup = cleanup;
|
|
176
|
+
cleanup = void 0;
|
|
177
|
+
let cleanupError;
|
|
178
|
+
if (previousCleanup) {
|
|
179
|
+
try {
|
|
180
|
+
previousCleanup();
|
|
181
|
+
} catch (error) {
|
|
182
|
+
cleanupError = error;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
cleanupDependencies(eff);
|
|
186
|
+
const previous = getCurrentSubscriber();
|
|
187
|
+
setCurrentSubscriber(eff);
|
|
188
|
+
let thrown;
|
|
189
|
+
let handled = false;
|
|
190
|
+
try {
|
|
191
|
+
const result = owner ? owner.run(callback) : callback();
|
|
192
|
+
cleanup = typeof result === "function" ? result : void 0;
|
|
193
|
+
} catch (error) {
|
|
194
|
+
thrown = error;
|
|
195
|
+
handled = false;
|
|
196
|
+
if (!handled) throw error;
|
|
197
|
+
} finally {
|
|
198
|
+
setCurrentSubscriber(previous);
|
|
199
|
+
}
|
|
200
|
+
if (cleanupError && !thrown) throw cleanupError;
|
|
201
|
+
},
|
|
202
|
+
scheduleLow() {
|
|
203
|
+
if (disposed || dirty) return;
|
|
204
|
+
dirty = true;
|
|
205
|
+
scheduler.scheduleLow(eff);
|
|
206
|
+
},
|
|
207
|
+
dispose() {
|
|
208
|
+
if (disposed) return;
|
|
209
|
+
disposed = true;
|
|
210
|
+
dirty = false;
|
|
211
|
+
scheduler.remove(eff);
|
|
212
|
+
const previousCleanup = cleanup;
|
|
213
|
+
cleanup = void 0;
|
|
214
|
+
let cleanupError;
|
|
215
|
+
if (previousCleanup) {
|
|
216
|
+
try {
|
|
217
|
+
previousCleanup();
|
|
218
|
+
} catch (error) {
|
|
219
|
+
cleanupError = error;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
cleanupDependencies(eff);
|
|
223
|
+
if (cleanupError) throw cleanupError;
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
eff.run();
|
|
227
|
+
return eff;
|
|
228
|
+
}
|
|
229
|
+
__name(effect, "effect");
|
|
230
|
+
|
|
231
|
+
// packages/runtime/src/debug.ts
|
|
232
|
+
var activeRuntimeDebugHooks = null;
|
|
233
|
+
function getRuntimeDebugHooks() {
|
|
234
|
+
return activeRuntimeDebugHooks;
|
|
235
|
+
}
|
|
236
|
+
__name(getRuntimeDebugHooks, "getRuntimeDebugHooks");
|
|
237
|
+
function invokeRuntimeDebug(name, ...args) {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
__name(invokeRuntimeDebug, "invokeRuntimeDebug");
|
|
241
|
+
function readDebugValue(read) {
|
|
242
|
+
try {
|
|
243
|
+
return read();
|
|
244
|
+
} catch {
|
|
245
|
+
return "[Uninspectable]";
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
__name(readDebugValue, "readDebugValue");
|
|
249
|
+
function describeDebugNode(node) {
|
|
250
|
+
if (!node || typeof node !== "object") return "node";
|
|
251
|
+
const value = node;
|
|
252
|
+
const name = typeof value.tagName === "string" ? value.tagName.toLowerCase() : typeof value.nodeName === "string" ? value.nodeName.toLowerCase() : "node";
|
|
253
|
+
const id = typeof value.id === "string" && value.id ? `#${value.id}` : "";
|
|
254
|
+
const className = typeof value.className === "string" && value.className ? `.${value.className.trim().split(/\s+/).filter(Boolean).join(".")}` : "";
|
|
255
|
+
return `${name}${id}${className}`;
|
|
256
|
+
}
|
|
257
|
+
__name(describeDebugNode, "describeDebugNode");
|
|
258
|
+
|
|
259
|
+
// packages/runtime/src/hmr.ts
|
|
260
|
+
var globalTarget = globalThis;
|
|
261
|
+
var hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: /* @__PURE__ */ new Map() };
|
|
262
|
+
globalTarget.__VOBS_HMR__ = hmrGlobal;
|
|
263
|
+
function markHmrInstanceMounted(node, parent) {
|
|
264
|
+
const instance = hmrInstances.get(node);
|
|
265
|
+
if (instance) instance.parent = parent;
|
|
266
|
+
}
|
|
267
|
+
__name(markHmrInstanceMounted, "markHmrInstanceMounted");
|
|
268
|
+
var hmrInstances = /* @__PURE__ */ new WeakMap();
|
|
269
|
+
function getRenderer() {
|
|
270
|
+
{
|
|
271
|
+
throw new Error("\u6E32\u67D3\u5668\u672A\u521D\u59CB\u5316");
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
__name(getRenderer, "getRenderer");
|
|
275
|
+
function createText(content) {
|
|
276
|
+
return getRenderer().createText(content);
|
|
277
|
+
}
|
|
278
|
+
__name(createText, "createText");
|
|
279
|
+
function createComment(content) {
|
|
280
|
+
return getRenderer().createComment(content);
|
|
281
|
+
}
|
|
282
|
+
__name(createComment, "createComment");
|
|
283
|
+
function insertBefore(parent, child, anchor) {
|
|
284
|
+
if (isVobsFragment(child)) {
|
|
285
|
+
child.mount(parent, isVobsFragment(anchor) ? anchor.start : anchor);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
getRenderer().insertBefore(parent, child, isVobsFragment(anchor) ? anchor.start : anchor);
|
|
289
|
+
markHmrInstanceMounted(child, parent);
|
|
290
|
+
}
|
|
291
|
+
__name(insertBefore, "insertBefore");
|
|
292
|
+
function setTextContent(node, content) {
|
|
293
|
+
getRenderer().setTextContent(node, content);
|
|
294
|
+
}
|
|
295
|
+
__name(setTextContent, "setTextContent");
|
|
296
|
+
function setAttribute(node, key, value) {
|
|
297
|
+
getRenderer().setAttribute(node, key, value);
|
|
298
|
+
}
|
|
299
|
+
__name(setAttribute, "setAttribute");
|
|
300
|
+
|
|
301
|
+
// packages/runtime/src/fragment.ts
|
|
302
|
+
function createFragment(factory) {
|
|
303
|
+
const start = createComment("vobs:fragment:start");
|
|
304
|
+
const end = createComment("vobs:fragment:end");
|
|
305
|
+
let parent = null;
|
|
306
|
+
let initialized = false;
|
|
307
|
+
const fragment = {
|
|
308
|
+
kind: "vobs-fragment",
|
|
309
|
+
start,
|
|
310
|
+
end,
|
|
311
|
+
mount(nextParent, anchor) {
|
|
312
|
+
if (parent && parent !== nextParent) {
|
|
313
|
+
throw new Error("Vobs Fragment: \u4E0D\u80FD\u8DE8\u7236\u8282\u70B9\u79FB\u52A8 Fragment");
|
|
314
|
+
}
|
|
315
|
+
if (initialized) {
|
|
316
|
+
moveRange(nextParent, start, end, anchor);
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
const renderer = getRenderer();
|
|
320
|
+
renderer.insertBefore(nextParent, start, anchor);
|
|
321
|
+
renderer.insertBefore(nextParent, end, anchor);
|
|
322
|
+
parent = nextParent;
|
|
323
|
+
initialized = true;
|
|
324
|
+
factory(nextParent, end);
|
|
325
|
+
},
|
|
326
|
+
unmount(nextParent) {
|
|
327
|
+
if (!initialized || parent !== nextParent) {
|
|
328
|
+
throw new Error("Vobs Fragment: Fragment \u4E0D\u5C5E\u4E8E\u6307\u5B9A\u7236\u8282\u70B9");
|
|
329
|
+
}
|
|
330
|
+
const renderer = getRenderer();
|
|
331
|
+
let current = renderer.nextSibling(start);
|
|
332
|
+
while (current && current !== end) {
|
|
333
|
+
const next = renderer.nextSibling(current);
|
|
334
|
+
renderer.removeChild(nextParent, current);
|
|
335
|
+
current = next;
|
|
336
|
+
}
|
|
337
|
+
renderer.removeChild(nextParent, start);
|
|
338
|
+
renderer.removeChild(nextParent, end);
|
|
339
|
+
parent = null;
|
|
340
|
+
initialized = false;
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
return fragment;
|
|
344
|
+
}
|
|
345
|
+
__name(createFragment, "createFragment");
|
|
346
|
+
function isVobsFragment(value) {
|
|
347
|
+
return Boolean(value) && typeof value === "object" && value.kind === "vobs-fragment";
|
|
348
|
+
}
|
|
349
|
+
__name(isVobsFragment, "isVobsFragment");
|
|
350
|
+
function moveRange(parent, start, end, anchor) {
|
|
351
|
+
const renderer = getRenderer();
|
|
352
|
+
const nodes = [start];
|
|
353
|
+
let current = renderer.nextSibling(start);
|
|
354
|
+
while (current) {
|
|
355
|
+
nodes.push(current);
|
|
356
|
+
if (current === end) break;
|
|
357
|
+
current = renderer.nextSibling(current);
|
|
358
|
+
}
|
|
359
|
+
if (nodes[nodes.length - 1] !== end) {
|
|
360
|
+
throw new Error("Vobs Fragment: \u627E\u4E0D\u5230\u7ED3\u675F\u951A\u70B9");
|
|
361
|
+
}
|
|
362
|
+
for (const node of nodes) renderer.insertBefore(parent, node, anchor);
|
|
363
|
+
}
|
|
364
|
+
__name(moveRange, "moveRange");
|
|
365
|
+
|
|
366
|
+
// packages/table/src/utils.ts
|
|
367
|
+
function readProp(props, name, fallback) {
|
|
368
|
+
const value = Reflect.get(props, name);
|
|
369
|
+
return value === void 0 ? fallback : value;
|
|
370
|
+
}
|
|
371
|
+
__name(readProp, "readProp");
|
|
372
|
+
function hasProp(props, name) {
|
|
373
|
+
return name in props;
|
|
374
|
+
}
|
|
375
|
+
__name(hasProp, "hasProp");
|
|
376
|
+
function bindClassList(root, props, classes) {
|
|
377
|
+
effect(() => {
|
|
378
|
+
const userClasses = [readString(props, "class"), readString(props, "className")];
|
|
379
|
+
setAttribute(root, "class", [...classes(), ...userClasses].filter(Boolean).join(" "));
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
__name(bindClassList, "bindClassList");
|
|
383
|
+
function bindCommonAttributes(root, props, skip) {
|
|
384
|
+
const ignored = /* @__PURE__ */ new Set([...skip, "class", "className", "style", "children"]);
|
|
385
|
+
effect(() => {
|
|
386
|
+
for (const name of Object.keys(props)) {
|
|
387
|
+
if (ignored.has(name) || name.startsWith("on")) continue;
|
|
388
|
+
if (name !== "id" && name !== "title" && name !== "role" && name !== "tabIndex" && !name.startsWith("aria-") && !name.startsWith("data-")) continue;
|
|
389
|
+
const value = Reflect.get(props, name);
|
|
390
|
+
if (value === void 0 || value === null || value === false) removeAttribute(root, normalizeAttributeName(name));
|
|
391
|
+
else setAttribute(root, normalizeAttributeName(name), String(value));
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
__name(bindCommonAttributes, "bindCommonAttributes");
|
|
396
|
+
function bindStyle(root, props, internal = () => "") {
|
|
397
|
+
effect(() => {
|
|
398
|
+
const value = [internal(), readString(props, "style")].filter(Boolean).join("; ");
|
|
399
|
+
if (value) setAttribute(root, "style", value);
|
|
400
|
+
else removeAttribute(root, "style");
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
__name(bindStyle, "bindStyle");
|
|
404
|
+
function bindText2(node, read) {
|
|
405
|
+
effect(() => setTextContent(node, String(read() ?? "")));
|
|
406
|
+
}
|
|
407
|
+
__name(bindText2, "bindText");
|
|
408
|
+
function resolveSlot(value) {
|
|
409
|
+
const resolved = typeof value === "function" ? value() : value;
|
|
410
|
+
if (resolved === void 0 || resolved === null) return null;
|
|
411
|
+
if (typeof resolved === "string" || typeof resolved === "number") return createText(String(resolved));
|
|
412
|
+
if (Array.isArray(resolved)) {
|
|
413
|
+
return createFragment((parent, anchor) => {
|
|
414
|
+
for (const child of resolved) {
|
|
415
|
+
const node = resolveSlot(child);
|
|
416
|
+
if (node) insertBefore(parent, node, anchor);
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
return resolved;
|
|
421
|
+
}
|
|
422
|
+
__name(resolveSlot, "resolveSlot");
|
|
423
|
+
function setOptionalAttribute(node, name, value) {
|
|
424
|
+
if (value === void 0 || value === null || value === false || value === "") removeAttribute(node, name);
|
|
425
|
+
else setAttribute(node, name, String(value));
|
|
426
|
+
}
|
|
427
|
+
__name(setOptionalAttribute, "setOptionalAttribute");
|
|
428
|
+
function normalizePixels(value) {
|
|
429
|
+
if (value === void 0) return void 0;
|
|
430
|
+
return typeof value === "number" ? `${value}px` : value;
|
|
431
|
+
}
|
|
432
|
+
__name(normalizePixels, "normalizePixels");
|
|
433
|
+
function createDefaultColumnSettings(columns, visibleColumnIds) {
|
|
434
|
+
const columnOrder = columns.map((column) => column.id);
|
|
435
|
+
const requested = new Set(visibleColumnIds ?? columns.filter((column) => column.visible !== false).map((column) => column.id));
|
|
436
|
+
const visible = columnOrder.filter((id) => requested.has(id) && columns.some((column) => column.id === id && column.visible !== false));
|
|
437
|
+
if (visible.length === 0) {
|
|
438
|
+
const fallback = columns.find((column) => column.visible !== false);
|
|
439
|
+
if (fallback) visible.push(fallback.id);
|
|
440
|
+
}
|
|
441
|
+
return { visibleColumnIds: visible, columnOrder, columnWidths: {} };
|
|
442
|
+
}
|
|
443
|
+
__name(createDefaultColumnSettings, "createDefaultColumnSettings");
|
|
444
|
+
function normalizeColumnSettings(columns, settings, visibleColumnIds) {
|
|
445
|
+
const fallback = createDefaultColumnSettings(columns, visibleColumnIds);
|
|
446
|
+
const knownIds = new Set(fallback.columnOrder);
|
|
447
|
+
const configuredOrder = Array.isArray(settings?.columnOrder) ? settings.columnOrder : void 0;
|
|
448
|
+
const order = uniqueKnownIds(configuredOrder, knownIds);
|
|
449
|
+
for (const id of fallback.columnOrder) {
|
|
450
|
+
if (!order.includes(id)) order.push(id);
|
|
451
|
+
}
|
|
452
|
+
const configuredVisible = Array.isArray(settings?.visibleColumnIds) ? settings.visibleColumnIds : void 0;
|
|
453
|
+
const requestedVisible = new Set(configuredVisible ?? fallback.visibleColumnIds);
|
|
454
|
+
const visible = order.filter((id) => requestedVisible.has(id) && columns.some((column) => column.id === id && column.visible !== false));
|
|
455
|
+
if (visible.length === 0) {
|
|
456
|
+
const fallbackVisible = order.find((id) => columns.some((column) => column.id === id && column.visible !== false));
|
|
457
|
+
if (fallbackVisible) visible.push(fallbackVisible);
|
|
458
|
+
}
|
|
459
|
+
const columnWidths = {};
|
|
460
|
+
const configuredWidths = settings?.columnWidths && typeof settings.columnWidths === "object" && !Array.isArray(settings.columnWidths) ? settings.columnWidths : {};
|
|
461
|
+
for (const [id, width] of Object.entries(configuredWidths)) {
|
|
462
|
+
if (knownIds.has(id) && isColumnWidthValue(width)) columnWidths[id] = width;
|
|
463
|
+
}
|
|
464
|
+
return { visibleColumnIds: visible, columnOrder: order, columnWidths };
|
|
465
|
+
}
|
|
466
|
+
__name(normalizeColumnSettings, "normalizeColumnSettings");
|
|
467
|
+
function orderColumns(columns, columnOrder) {
|
|
468
|
+
if (!columnOrder || columnOrder.length === 0) return columns;
|
|
469
|
+
const byId = new Map(columns.map((column) => [column.id, column]));
|
|
470
|
+
const ordered = [];
|
|
471
|
+
const seen = /* @__PURE__ */ new Set();
|
|
472
|
+
for (const id of columnOrder) {
|
|
473
|
+
const column = byId.get(id);
|
|
474
|
+
if (column && !seen.has(id)) {
|
|
475
|
+
ordered.push(column);
|
|
476
|
+
seen.add(id);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
for (const column of columns) {
|
|
480
|
+
if (!seen.has(column.id)) ordered.push(column);
|
|
481
|
+
}
|
|
482
|
+
return ordered;
|
|
483
|
+
}
|
|
484
|
+
__name(orderColumns, "orderColumns");
|
|
485
|
+
function isColumnWidthValue(value) {
|
|
486
|
+
return typeof value === "number" ? Number.isFinite(value) && value > 0 : typeof value === "string" && value.trim().length > 0 && !/[;{}]/u.test(value);
|
|
487
|
+
}
|
|
488
|
+
__name(isColumnWidthValue, "isColumnWidthValue");
|
|
489
|
+
function uniqueKnownIds(values, knownIds) {
|
|
490
|
+
const result = [];
|
|
491
|
+
for (const id of values ?? []) {
|
|
492
|
+
if (knownIds.has(id) && !result.includes(id)) result.push(id);
|
|
493
|
+
}
|
|
494
|
+
return result;
|
|
495
|
+
}
|
|
496
|
+
__name(uniqueKnownIds, "uniqueKnownIds");
|
|
497
|
+
function readString(props, name) {
|
|
498
|
+
const value = Reflect.get(props, name);
|
|
499
|
+
return typeof value === "string" ? value : void 0;
|
|
500
|
+
}
|
|
501
|
+
__name(readString, "readString");
|
|
502
|
+
function normalizeAttributeName(name) {
|
|
503
|
+
return name === "tabIndex" ? "tabindex" : name;
|
|
504
|
+
}
|
|
505
|
+
__name(normalizeAttributeName, "normalizeAttributeName");
|
|
506
|
+
function removeAttribute(node, name) {
|
|
507
|
+
node.removeAttribute(name);
|
|
508
|
+
}
|
|
509
|
+
__name(removeAttribute, "removeAttribute");
|
|
510
|
+
|
|
511
|
+
exports.bindClassList = bindClassList;
|
|
512
|
+
exports.bindCommonAttributes = bindCommonAttributes;
|
|
513
|
+
exports.bindStyle = bindStyle;
|
|
514
|
+
exports.bindText = bindText2;
|
|
515
|
+
exports.createDefaultColumnSettings = createDefaultColumnSettings;
|
|
516
|
+
exports.hasProp = hasProp;
|
|
517
|
+
exports.isColumnWidthValue = isColumnWidthValue;
|
|
518
|
+
exports.normalizeColumnSettings = normalizeColumnSettings;
|
|
519
|
+
exports.normalizePixels = normalizePixels;
|
|
520
|
+
exports.orderColumns = orderColumns;
|
|
521
|
+
exports.readProp = readProp;
|
|
522
|
+
exports.resolveSlot = resolveSlot;
|
|
523
|
+
exports.setOptionalAttribute = setOptionalAttribute;
|
|
524
|
+
//# sourceMappingURL=utils.cjs.map
|
|
525
|
+
//# sourceMappingURL=utils.cjs.map
|