mvc-kit 2.12.5 → 2.13.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/agent-config/bin/postinstall.mjs +4 -3
- package/agent-config/bin/setup.mjs +5 -1
- package/agent-config/claude-code/agents/mvc-kit-architect.md +11 -8
- package/agent-config/claude-code/skills/guide/SKILL.md +20 -7
- package/agent-config/claude-code/skills/guide/patterns.md +12 -0
- package/agent-config/claude-code/skills/guide/recipes.md +510 -0
- package/agent-config/claude-code/skills/guide/testing.md +297 -0
- package/agent-config/claude-code/skills/review/SKILL.md +3 -13
- package/agent-config/claude-code/skills/review/checklist.md +30 -5
- package/agent-config/claude-code/skills/scaffold/SKILL.md +4 -13
- package/agent-config/lib/install-claude.mjs +84 -25
- package/dist/Channel.cjs +276 -300
- package/dist/Channel.cjs.map +1 -1
- package/dist/Channel.js +275 -299
- package/dist/Channel.js.map +1 -1
- package/dist/Collection.cjs +424 -504
- package/dist/Collection.cjs.map +1 -1
- package/dist/Collection.js +423 -503
- package/dist/Collection.js.map +1 -1
- package/dist/Controller.cjs +70 -67
- package/dist/Controller.cjs.map +1 -1
- package/dist/Controller.js +69 -66
- package/dist/Controller.js.map +1 -1
- package/dist/EventBus.cjs +77 -88
- package/dist/EventBus.cjs.map +1 -1
- package/dist/EventBus.js +76 -87
- package/dist/EventBus.js.map +1 -1
- package/dist/Feed.cjs +81 -77
- package/dist/Feed.cjs.map +1 -1
- package/dist/Feed.js +80 -76
- package/dist/Feed.js.map +1 -1
- package/dist/Model.cjs +181 -207
- package/dist/Model.cjs.map +1 -1
- package/dist/Model.js +179 -205
- package/dist/Model.js.map +1 -1
- package/dist/Pagination.cjs +75 -73
- package/dist/Pagination.cjs.map +1 -1
- package/dist/Pagination.js +74 -72
- package/dist/Pagination.js.map +1 -1
- package/dist/Pending.cjs +255 -287
- package/dist/Pending.cjs.map +1 -1
- package/dist/Pending.js +253 -285
- package/dist/Pending.js.map +1 -1
- package/dist/PersistentCollection.cjs +242 -285
- package/dist/PersistentCollection.cjs.map +1 -1
- package/dist/PersistentCollection.js +241 -284
- package/dist/PersistentCollection.js.map +1 -1
- package/dist/Resource.cjs +166 -174
- package/dist/Resource.cjs.map +1 -1
- package/dist/Resource.js +164 -172
- package/dist/Resource.js.map +1 -1
- package/dist/Selection.cjs +84 -94
- package/dist/Selection.cjs.map +1 -1
- package/dist/Selection.js +83 -93
- package/dist/Selection.js.map +1 -1
- package/dist/Service.cjs +54 -55
- package/dist/Service.cjs.map +1 -1
- package/dist/Service.js +53 -54
- package/dist/Service.js.map +1 -1
- package/dist/Sorting.cjs +102 -101
- package/dist/Sorting.cjs.map +1 -1
- package/dist/Sorting.js +102 -101
- package/dist/Sorting.js.map +1 -1
- package/dist/Trackable.cjs +112 -80
- package/dist/Trackable.cjs.map +1 -1
- package/dist/Trackable.js +111 -79
- package/dist/Trackable.js.map +1 -1
- package/dist/ViewModel.cjs +528 -576
- package/dist/ViewModel.cjs.map +1 -1
- package/dist/ViewModel.js +525 -573
- package/dist/ViewModel.js.map +1 -1
- package/dist/bindPublicMethods.cjs +43 -24
- package/dist/bindPublicMethods.cjs.map +1 -1
- package/dist/bindPublicMethods.js +43 -24
- package/dist/bindPublicMethods.js.map +1 -1
- package/dist/errors.cjs +67 -68
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.js +68 -71
- package/dist/errors.js.map +1 -1
- package/dist/mvc-kit.cjs +44 -46
- package/dist/mvc-kit.js +5 -32
- package/dist/produceDraft.cjs +105 -95
- package/dist/produceDraft.cjs.map +1 -1
- package/dist/produceDraft.js +106 -97
- package/dist/produceDraft.js.map +1 -1
- package/dist/react/components/CardList.cjs +30 -40
- package/dist/react/components/CardList.cjs.map +1 -1
- package/dist/react/components/CardList.js +31 -41
- package/dist/react/components/CardList.js.map +1 -1
- package/dist/react/components/DataTable.cjs +146 -169
- package/dist/react/components/DataTable.cjs.map +1 -1
- package/dist/react/components/DataTable.js +147 -170
- package/dist/react/components/DataTable.js.map +1 -1
- package/dist/react/components/InfiniteScroll.cjs +51 -42
- package/dist/react/components/InfiniteScroll.cjs.map +1 -1
- package/dist/react/components/InfiniteScroll.js +52 -43
- package/dist/react/components/InfiniteScroll.js.map +1 -1
- package/dist/react/components/types.cjs +10 -6
- package/dist/react/components/types.cjs.map +1 -1
- package/dist/react/components/types.js +11 -9
- package/dist/react/components/types.js.map +1 -1
- package/dist/react/guards.cjs +10 -6
- package/dist/react/guards.cjs.map +1 -1
- package/dist/react/guards.js +11 -9
- package/dist/react/guards.js.map +1 -1
- package/dist/react/provider.cjs +23 -20
- package/dist/react/provider.cjs.map +1 -1
- package/dist/react/provider.js +23 -21
- package/dist/react/provider.js.map +1 -1
- package/dist/react/use-event-bus.cjs +24 -20
- package/dist/react/use-event-bus.cjs.map +1 -1
- package/dist/react/use-event-bus.js +24 -21
- package/dist/react/use-event-bus.js.map +1 -1
- package/dist/react/use-instance.cjs +43 -36
- package/dist/react/use-instance.cjs.map +1 -1
- package/dist/react/use-instance.js +43 -36
- package/dist/react/use-instance.js.map +1 -1
- package/dist/react/use-local.cjs +48 -64
- package/dist/react/use-local.cjs.map +1 -1
- package/dist/react/use-local.js +47 -63
- package/dist/react/use-local.js.map +1 -1
- package/dist/react/use-model.cjs +84 -98
- package/dist/react/use-model.cjs.map +1 -1
- package/dist/react/use-model.js +84 -100
- package/dist/react/use-model.js.map +1 -1
- package/dist/react/use-singleton.cjs +19 -23
- package/dist/react/use-singleton.cjs.map +1 -1
- package/dist/react/use-singleton.js +16 -20
- package/dist/react/use-singleton.js.map +1 -1
- package/dist/react/use-subscribe-only.cjs +28 -22
- package/dist/react/use-subscribe-only.cjs.map +1 -1
- package/dist/react/use-subscribe-only.js +28 -22
- package/dist/react/use-subscribe-only.js.map +1 -1
- package/dist/react/use-teardown.cjs +20 -19
- package/dist/react/use-teardown.cjs.map +1 -1
- package/dist/react/use-teardown.js +20 -19
- package/dist/react/use-teardown.js.map +1 -1
- package/dist/react-native/NativeCollection.cjs +98 -78
- package/dist/react-native/NativeCollection.cjs.map +1 -1
- package/dist/react-native/NativeCollection.js +97 -77
- package/dist/react-native/NativeCollection.js.map +1 -1
- package/dist/react-native.cjs +2 -4
- package/dist/react-native.js +1 -4
- package/dist/react.cjs +24 -26
- package/dist/react.js +1 -17
- package/dist/singleton.cjs +28 -22
- package/dist/singleton.cjs.map +1 -1
- package/dist/singleton.js +29 -26
- package/dist/singleton.js.map +1 -1
- package/dist/walkPrototypeChain.cjs +20 -12
- package/dist/walkPrototypeChain.cjs.map +1 -1
- package/dist/walkPrototypeChain.js +21 -13
- package/dist/walkPrototypeChain.js.map +1 -1
- package/dist/web/IndexedDBCollection.cjs +53 -36
- package/dist/web/IndexedDBCollection.cjs.map +1 -1
- package/dist/web/IndexedDBCollection.js +52 -35
- package/dist/web/IndexedDBCollection.js.map +1 -1
- package/dist/web/WebStorageCollection.cjs +82 -84
- package/dist/web/WebStorageCollection.cjs.map +1 -1
- package/dist/web/WebStorageCollection.js +81 -83
- package/dist/web/WebStorageCollection.js.map +1 -1
- package/dist/web/idb.cjs +107 -99
- package/dist/web/idb.cjs.map +1 -1
- package/dist/web/idb.js +108 -105
- package/dist/web/idb.js.map +1 -1
- package/dist/web.cjs +4 -6
- package/dist/web.js +1 -5
- package/dist/wrapAsyncMethods.cjs +141 -168
- package/dist/wrapAsyncMethods.cjs.map +1 -1
- package/dist/wrapAsyncMethods.js +141 -168
- package/dist/wrapAsyncMethods.js.map +1 -1
- package/package.json +8 -8
- package/src/Pending.test.ts +1 -2
- package/src/Sorting.test.ts +1 -1
- package/src/produceDraft.test.ts +3 -3
- package/src/react/components/CardList.test.tsx +1 -1
- package/src/react/components/DataTable.test.tsx +1 -1
- package/src/react/components/InfiniteScroll.test.tsx +5 -5
- package/dist/mvc-kit.cjs.map +0 -1
- package/dist/mvc-kit.js.map +0 -1
- package/dist/react-native.cjs.map +0 -1
- package/dist/react-native.js.map +0 -1
- package/dist/react.cjs.map +0 -1
- package/dist/react.js.map +0 -1
- package/dist/web.cjs.map +0 -1
- package/dist/web.js.map +0 -1
package/dist/produceDraft.js
CHANGED
|
@@ -1,105 +1,114 @@
|
|
|
1
|
-
|
|
1
|
+
//#region src/produceDraft.ts
|
|
2
|
+
var __DEV__ = typeof __MVC_KIT_DEV__ !== "undefined" && __MVC_KIT_DEV__;
|
|
3
|
+
/**
|
|
4
|
+
* Checks if a value is a plain object (POJO).
|
|
5
|
+
* Returns false for arrays, Dates, class instances, null, etc.
|
|
6
|
+
*/
|
|
2
7
|
function isPlainObject(value) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
8
|
+
if (value === null || typeof value !== "object") return false;
|
|
9
|
+
const proto = Object.getPrototypeOf(value);
|
|
10
|
+
return proto === Object.prototype || proto === null;
|
|
6
11
|
}
|
|
7
12
|
function createDraftNode(original) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
ensureCopy();
|
|
69
|
-
copy[key] = child.finalize();
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return copy ?? original;
|
|
73
|
-
}
|
|
74
|
-
};
|
|
13
|
+
let copy = null;
|
|
14
|
+
const children = /* @__PURE__ */ new Map();
|
|
15
|
+
function ensureCopy() {
|
|
16
|
+
if (!copy) copy = { ...original };
|
|
17
|
+
return copy;
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
proxy: new Proxy({}, {
|
|
21
|
+
get(_, prop) {
|
|
22
|
+
if (typeof prop === "symbol") return original[prop];
|
|
23
|
+
const key = prop;
|
|
24
|
+
if (children.has(key)) return children.get(key).proxy;
|
|
25
|
+
const value = (copy ?? original)[key];
|
|
26
|
+
if (isPlainObject(value)) {
|
|
27
|
+
const child = createDraftNode(value);
|
|
28
|
+
children.set(key, child);
|
|
29
|
+
return child.proxy;
|
|
30
|
+
}
|
|
31
|
+
if (__DEV__ && Array.isArray(value)) return Object.freeze([...value]);
|
|
32
|
+
return value;
|
|
33
|
+
},
|
|
34
|
+
set(_, prop, value) {
|
|
35
|
+
if (typeof prop === "symbol") return true;
|
|
36
|
+
const key = prop;
|
|
37
|
+
if ((copy ?? original)[key] !== value) {
|
|
38
|
+
ensureCopy();
|
|
39
|
+
copy[key] = value;
|
|
40
|
+
children.delete(key);
|
|
41
|
+
}
|
|
42
|
+
return true;
|
|
43
|
+
},
|
|
44
|
+
ownKeys() {
|
|
45
|
+
return Reflect.ownKeys(copy ?? original);
|
|
46
|
+
},
|
|
47
|
+
getOwnPropertyDescriptor(_, prop) {
|
|
48
|
+
const source = copy ?? original;
|
|
49
|
+
if (Object.prototype.hasOwnProperty.call(source, prop)) return {
|
|
50
|
+
value: source[prop],
|
|
51
|
+
writable: true,
|
|
52
|
+
enumerable: true,
|
|
53
|
+
configurable: true
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
has(_, prop) {
|
|
57
|
+
return prop in (copy ?? original);
|
|
58
|
+
}
|
|
59
|
+
}),
|
|
60
|
+
changed() {
|
|
61
|
+
if (copy) return true;
|
|
62
|
+
for (const child of children.values()) if (child.changed()) return true;
|
|
63
|
+
return false;
|
|
64
|
+
},
|
|
65
|
+
finalize() {
|
|
66
|
+
for (const [key, child] of children) if (child.changed()) {
|
|
67
|
+
ensureCopy();
|
|
68
|
+
copy[key] = child.finalize();
|
|
69
|
+
}
|
|
70
|
+
return copy ?? original;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
75
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Creates a copy-on-write draft proxy of the given state, runs the mutator,
|
|
76
|
+
* and returns only the changed top-level keys as a Partial.
|
|
77
|
+
* Returns null if nothing was modified.
|
|
78
|
+
*
|
|
79
|
+
* - Nested plain objects use copy-on-write structural sharing
|
|
80
|
+
* - Same-value assignments are no-ops
|
|
81
|
+
* - Reads reflect prior writes within the same draft
|
|
82
|
+
* - Only POJOs are proxied; class instances, arrays, Dates pass through as-is
|
|
83
|
+
* - Arrays must be replaced via assignment, not mutated in place
|
|
84
|
+
*/
|
|
76
85
|
function produceDraft(state, mutator) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
return hasChanges ? partial : null;
|
|
86
|
+
const root = createDraftNode(state);
|
|
87
|
+
mutator(root.proxy);
|
|
88
|
+
if (!root.changed()) return null;
|
|
89
|
+
const finalized = root.finalize();
|
|
90
|
+
const partial = {};
|
|
91
|
+
let hasChanges = false;
|
|
92
|
+
for (const key of Object.keys(finalized)) if (finalized[key] !== state[key]) {
|
|
93
|
+
partial[key] = finalized[key];
|
|
94
|
+
hasChanges = true;
|
|
95
|
+
}
|
|
96
|
+
return hasChanges ? partial : null;
|
|
90
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Resolves a function-form updater through produceDraft.
|
|
100
|
+
* Handles both patterns: explicit return (existing updater) and void return (draft mode).
|
|
101
|
+
* Returns the partial to apply, or null if nothing changed.
|
|
102
|
+
*/
|
|
91
103
|
function resolveDraftUpdater(state, updater) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
});
|
|
99
|
-
return explicitReturn ?? draftChanges;
|
|
104
|
+
let explicitReturn;
|
|
105
|
+
const draftChanges = produceDraft(state, (draft) => {
|
|
106
|
+
const result = updater(draft);
|
|
107
|
+
if (result !== void 0 && result !== null && typeof result === "object") explicitReturn = result;
|
|
108
|
+
});
|
|
109
|
+
return explicitReturn ?? draftChanges;
|
|
100
110
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
//# sourceMappingURL=produceDraft.js.map
|
|
111
|
+
//#endregion
|
|
112
|
+
export { produceDraft, resolveDraftUpdater };
|
|
113
|
+
|
|
114
|
+
//# sourceMappingURL=produceDraft.js.map
|
package/dist/produceDraft.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"produceDraft.js","sources":["../src/produceDraft.ts"],"sourcesContent":["const __DEV__ = typeof __MVC_KIT_DEV__ !== 'undefined' && __MVC_KIT_DEV__;\n\n/**\n * Checks if a value is a plain object (POJO).\n * Returns false for arrays, Dates, class instances, null, etc.\n */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== 'object') return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\ninterface DraftNode<T extends object = object> {\n proxy: T;\n changed(): boolean;\n finalize(): T;\n}\n\nfunction createDraftNode<T extends object>(original: Readonly<T>): DraftNode<T> {\n let copy: Record<string, unknown> | null = null;\n const children = new Map<string, DraftNode>();\n\n function ensureCopy(): Record<string, unknown> {\n if (!copy) copy = { ...(original as Record<string, unknown>) };\n return copy;\n }\n\n // Use empty object as proxy target to avoid invariant violations\n // with frozen state objects. All reads/writes go through the handler.\n const proxy = new Proxy({} as T, {\n get(_, prop) {\n if (typeof prop === 'symbol') return (original as any)[prop];\n\n const key = prop as string;\n\n // Return cached child draft proxy\n if (children.has(key)) return children.get(key)!.proxy;\n\n // Read from copy (if mutated) or original\n const source: any = copy ?? original;\n const value = source[key];\n\n // Auto-draft nested plain objects\n if (isPlainObject(value)) {\n const child = createDraftNode(value as Record<string, unknown>);\n children.set(key, child);\n return child.proxy;\n }\n\n // DEV: freeze arrays so mutation methods (push, splice) throw immediately\n // instead of silently mutating the original state\n if (__DEV__ && Array.isArray(value)) {\n return Object.freeze([...value]);\n }\n\n return value;\n },\n\n set(_, prop, value) {\n if (typeof prop === 'symbol') return true;\n\n const key = prop as string;\n const source: any = copy ?? original;\n\n if (source[key] !== value) {\n ensureCopy();\n copy![key] = value;\n // Discard child draft — value was fully replaced\n children.delete(key);\n }\n return true;\n },\n\n ownKeys() {\n return Reflect.ownKeys((copy ?? original) as object);\n },\n\n getOwnPropertyDescriptor(_, prop) {\n const source = (copy ?? original) as Record<string, unknown>;\n if (Object.prototype.hasOwnProperty.call(source, prop)) {\n return { value: source[prop as string], writable: true, enumerable: true, configurable: true };\n }\n return undefined;\n },\n\n has(_, prop) {\n return prop in ((copy ?? original) as object);\n },\n });\n\n return {\n proxy,\n\n changed(): boolean {\n if (copy) return true;\n for (const child of children.values()) {\n if (child.changed()) return true;\n }\n return false;\n },\n\n finalize(): T {\n // Merge child results bottom-up\n for (const [key, child] of children) {\n if (child.changed()) {\n ensureCopy();\n copy![key] = child.finalize();\n }\n }\n return (copy ?? original) as T;\n },\n };\n}\n\n/**\n * Creates a copy-on-write draft proxy of the given state, runs the mutator,\n * and returns only the changed top-level keys as a Partial.\n * Returns null if nothing was modified.\n *\n * - Nested plain objects use copy-on-write structural sharing\n * - Same-value assignments are no-ops\n * - Reads reflect prior writes within the same draft\n * - Only POJOs are proxied; class instances, arrays, Dates pass through as-is\n * - Arrays must be replaced via assignment, not mutated in place\n */\nexport function produceDraft<S extends object>(\n state: Readonly<S>,\n mutator: (draft: S) => void,\n): Partial<S> | null {\n const root = createDraftNode(state);\n mutator(root.proxy);\n\n if (!root.changed()) return null;\n\n const finalized = root.finalize();\n\n // Extract only changed top-level keys\n const partial: Record<string, unknown> = {};\n let hasChanges = false;\n\n for (const key of Object.keys(finalized)) {\n if ((finalized as any)[key] !== (state as any)[key]) {\n partial[key] = (finalized as any)[key];\n hasChanges = true;\n }\n }\n\n return hasChanges ? (partial as Partial<S>) : null;\n}\n\n/**\n * Resolves a function-form updater through produceDraft.\n * Handles both patterns: explicit return (existing updater) and void return (draft mode).\n * Returns the partial to apply, or null if nothing changed.\n */\nexport function resolveDraftUpdater<S extends object>(\n state: Readonly<S>,\n updater: (stateOrDraft: S) => Partial<S> | void,\n): Partial<S> | null {\n let explicitReturn: Partial<S> | undefined;\n const draftChanges = produceDraft<S>(state, (draft) => {\n const result = updater(draft);\n if (result !== undefined && result !== null && typeof result === 'object') {\n explicitReturn = result;\n }\n });\n return explicitReturn ?? draftChanges;\n}\n"],"
|
|
1
|
+
{"version":3,"file":"produceDraft.js","names":[],"sources":["../src/produceDraft.ts"],"sourcesContent":["const __DEV__ = typeof __MVC_KIT_DEV__ !== 'undefined' && __MVC_KIT_DEV__;\n\n/**\n * Checks if a value is a plain object (POJO).\n * Returns false for arrays, Dates, class instances, null, etc.\n */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== 'object') return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\ninterface DraftNode<T extends object = object> {\n proxy: T;\n changed(): boolean;\n finalize(): T;\n}\n\nfunction createDraftNode<T extends object>(original: Readonly<T>): DraftNode<T> {\n let copy: Record<string, unknown> | null = null;\n const children = new Map<string, DraftNode>();\n\n function ensureCopy(): Record<string, unknown> {\n if (!copy) copy = { ...(original as Record<string, unknown>) };\n return copy;\n }\n\n // Use empty object as proxy target to avoid invariant violations\n // with frozen state objects. All reads/writes go through the handler.\n const proxy = new Proxy({} as T, {\n get(_, prop) {\n if (typeof prop === 'symbol') return (original as any)[prop];\n\n const key = prop as string;\n\n // Return cached child draft proxy\n if (children.has(key)) return children.get(key)!.proxy;\n\n // Read from copy (if mutated) or original\n const source: any = copy ?? original;\n const value = source[key];\n\n // Auto-draft nested plain objects\n if (isPlainObject(value)) {\n const child = createDraftNode(value as Record<string, unknown>);\n children.set(key, child);\n return child.proxy;\n }\n\n // DEV: freeze arrays so mutation methods (push, splice) throw immediately\n // instead of silently mutating the original state\n if (__DEV__ && Array.isArray(value)) {\n return Object.freeze([...value]);\n }\n\n return value;\n },\n\n set(_, prop, value) {\n if (typeof prop === 'symbol') return true;\n\n const key = prop as string;\n const source: any = copy ?? original;\n\n if (source[key] !== value) {\n ensureCopy();\n copy![key] = value;\n // Discard child draft — value was fully replaced\n children.delete(key);\n }\n return true;\n },\n\n ownKeys() {\n return Reflect.ownKeys((copy ?? original) as object);\n },\n\n getOwnPropertyDescriptor(_, prop) {\n const source = (copy ?? original) as Record<string, unknown>;\n if (Object.prototype.hasOwnProperty.call(source, prop)) {\n return { value: source[prop as string], writable: true, enumerable: true, configurable: true };\n }\n return undefined;\n },\n\n has(_, prop) {\n return prop in ((copy ?? original) as object);\n },\n });\n\n return {\n proxy,\n\n changed(): boolean {\n if (copy) return true;\n for (const child of children.values()) {\n if (child.changed()) return true;\n }\n return false;\n },\n\n finalize(): T {\n // Merge child results bottom-up\n for (const [key, child] of children) {\n if (child.changed()) {\n ensureCopy();\n copy![key] = child.finalize();\n }\n }\n return (copy ?? original) as T;\n },\n };\n}\n\n/**\n * Creates a copy-on-write draft proxy of the given state, runs the mutator,\n * and returns only the changed top-level keys as a Partial.\n * Returns null if nothing was modified.\n *\n * - Nested plain objects use copy-on-write structural sharing\n * - Same-value assignments are no-ops\n * - Reads reflect prior writes within the same draft\n * - Only POJOs are proxied; class instances, arrays, Dates pass through as-is\n * - Arrays must be replaced via assignment, not mutated in place\n */\nexport function produceDraft<S extends object>(\n state: Readonly<S>,\n mutator: (draft: S) => void,\n): Partial<S> | null {\n const root = createDraftNode(state);\n mutator(root.proxy);\n\n if (!root.changed()) return null;\n\n const finalized = root.finalize();\n\n // Extract only changed top-level keys\n const partial: Record<string, unknown> = {};\n let hasChanges = false;\n\n for (const key of Object.keys(finalized)) {\n if ((finalized as any)[key] !== (state as any)[key]) {\n partial[key] = (finalized as any)[key];\n hasChanges = true;\n }\n }\n\n return hasChanges ? (partial as Partial<S>) : null;\n}\n\n/**\n * Resolves a function-form updater through produceDraft.\n * Handles both patterns: explicit return (existing updater) and void return (draft mode).\n * Returns the partial to apply, or null if nothing changed.\n */\nexport function resolveDraftUpdater<S extends object>(\n state: Readonly<S>,\n updater: (stateOrDraft: S) => Partial<S> | void,\n): Partial<S> | null {\n let explicitReturn: Partial<S> | undefined;\n const draftChanges = produceDraft<S>(state, (draft) => {\n const result = updater(draft);\n if (result !== undefined && result !== null && typeof result === 'object') {\n explicitReturn = result;\n }\n });\n return explicitReturn ?? draftChanges;\n}\n"],"mappings":";AAAA,IAAM,UAAU,OAAO,oBAAoB,eAAe;;;;;AAM1D,SAAS,cAAc,OAAkD;AACvE,KAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;CACxD,MAAM,QAAQ,OAAO,eAAe,MAAM;AAC1C,QAAO,UAAU,OAAO,aAAa,UAAU;;AASjD,SAAS,gBAAkC,UAAqC;CAC9E,IAAI,OAAuC;CAC3C,MAAM,2BAAW,IAAI,KAAwB;CAE7C,SAAS,aAAsC;AAC7C,MAAI,CAAC,KAAM,QAAO,EAAE,GAAI,UAAsC;AAC9D,SAAO;;AAkET,QAAO;EACL,OA9DY,IAAI,MAAM,EAAE,EAAO;GAC/B,IAAI,GAAG,MAAM;AACX,QAAI,OAAO,SAAS,SAAU,QAAQ,SAAiB;IAEvD,MAAM,MAAM;AAGZ,QAAI,SAAS,IAAI,IAAI,CAAE,QAAO,SAAS,IAAI,IAAI,CAAE;IAIjD,MAAM,SADc,QAAQ,UACP;AAGrB,QAAI,cAAc,MAAM,EAAE;KACxB,MAAM,QAAQ,gBAAgB,MAAiC;AAC/D,cAAS,IAAI,KAAK,MAAM;AACxB,YAAO,MAAM;;AAKf,QAAI,WAAW,MAAM,QAAQ,MAAM,CACjC,QAAO,OAAO,OAAO,CAAC,GAAG,MAAM,CAAC;AAGlC,WAAO;;GAGT,IAAI,GAAG,MAAM,OAAO;AAClB,QAAI,OAAO,SAAS,SAAU,QAAO;IAErC,MAAM,MAAM;AAGZ,SAFoB,QAAQ,UAEjB,SAAS,OAAO;AACzB,iBAAY;AACZ,UAAM,OAAO;AAEb,cAAS,OAAO,IAAI;;AAEtB,WAAO;;GAGT,UAAU;AACR,WAAO,QAAQ,QAAS,QAAQ,SAAoB;;GAGtD,yBAAyB,GAAG,MAAM;IAChC,MAAM,SAAU,QAAQ;AACxB,QAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,KAAK,CACpD,QAAO;KAAE,OAAO,OAAO;KAAiB,UAAU;KAAM,YAAY;KAAM,cAAc;KAAM;;GAKlG,IAAI,GAAG,MAAM;AACX,WAAO,SAAU,QAAQ;;GAE5B,CAAC;EAKA,UAAmB;AACjB,OAAI,KAAM,QAAO;AACjB,QAAK,MAAM,SAAS,SAAS,QAAQ,CACnC,KAAI,MAAM,SAAS,CAAE,QAAO;AAE9B,UAAO;;EAGT,WAAc;AAEZ,QAAK,MAAM,CAAC,KAAK,UAAU,SACzB,KAAI,MAAM,SAAS,EAAE;AACnB,gBAAY;AACZ,SAAM,OAAO,MAAM,UAAU;;AAGjC,UAAQ,QAAQ;;EAEnB;;;;;;;;;;;;;AAcH,SAAgB,aACd,OACA,SACmB;CACnB,MAAM,OAAO,gBAAgB,MAAM;AACnC,SAAQ,KAAK,MAAM;AAEnB,KAAI,CAAC,KAAK,SAAS,CAAE,QAAO;CAE5B,MAAM,YAAY,KAAK,UAAU;CAGjC,MAAM,UAAmC,EAAE;CAC3C,IAAI,aAAa;AAEjB,MAAK,MAAM,OAAO,OAAO,KAAK,UAAU,CACtC,KAAK,UAAkB,SAAU,MAAc,MAAM;AACnD,UAAQ,OAAQ,UAAkB;AAClC,eAAa;;AAIjB,QAAO,aAAc,UAAyB;;;;;;;AAQhD,SAAgB,oBACd,OACA,SACmB;CACnB,IAAI;CACJ,MAAM,eAAe,aAAgB,QAAQ,UAAU;EACrD,MAAM,SAAS,QAAQ,MAAM;AAC7B,MAAI,WAAW,KAAA,KAAa,WAAW,QAAQ,OAAO,WAAW,SAC/D,kBAAiB;GAEnB;AACF,QAAO,kBAAkB"}
|
|
@@ -1,42 +1,32 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
29
|
-
"ul",
|
|
30
|
-
{
|
|
31
|
-
role: "list",
|
|
32
|
-
"data-component": "card-list",
|
|
33
|
-
"data-layout": layout,
|
|
34
|
-
className,
|
|
35
|
-
"aria-label": ariaLabel,
|
|
36
|
-
style,
|
|
37
|
-
children: items.map((item, index) => /* @__PURE__ */ jsxRuntime.jsx("li", { "data-index": index, children: renderItem(item, index) }, keyOf(item)))
|
|
38
|
-
}
|
|
39
|
-
);
|
|
1
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
2
|
+
//#region src/react/components/CardList.tsx
|
|
3
|
+
var defaultKeyOf = (item) => item.id;
|
|
4
|
+
/**
|
|
5
|
+
* Headless list/grid component with render-prop items.
|
|
6
|
+
* Renders a semantic `<ul>` with optional CSS grid layout.
|
|
7
|
+
*/
|
|
8
|
+
function CardList({ items, renderItem, keyOf = defaultKeyOf, layout = "list", columns = 3, gap = "1rem", loading, error, renderEmpty, renderLoading, renderError, className, "aria-label": ariaLabel }) {
|
|
9
|
+
if (loading && renderLoading) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: renderLoading() });
|
|
10
|
+
if (error && renderError) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: renderError(error) });
|
|
11
|
+
if (items.length === 0 && renderEmpty) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: renderEmpty() });
|
|
12
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
|
|
13
|
+
role: "list",
|
|
14
|
+
"data-component": "card-list",
|
|
15
|
+
"data-layout": layout,
|
|
16
|
+
className,
|
|
17
|
+
"aria-label": ariaLabel,
|
|
18
|
+
style: layout === "grid" ? {
|
|
19
|
+
display: "grid",
|
|
20
|
+
gridTemplateColumns: `repeat(var(--card-list-columns, ${columns}), 1fr)`,
|
|
21
|
+
gap: `var(--card-list-gap, ${gap})`
|
|
22
|
+
} : void 0,
|
|
23
|
+
children: items.map((item, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
|
|
24
|
+
"data-index": index,
|
|
25
|
+
children: renderItem(item, index)
|
|
26
|
+
}, keyOf(item)))
|
|
27
|
+
});
|
|
40
28
|
}
|
|
29
|
+
//#endregion
|
|
41
30
|
exports.CardList = CardList;
|
|
42
|
-
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=CardList.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CardList.cjs","sources":["../../../src/react/components/CardList.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { AsyncStateProps } from './types';\n\n/** Props for the CardList headless component. */\nexport interface CardListProps<T> extends AsyncStateProps {\n items: T[];\n renderItem: (item: T, index: number) => ReactNode;\n keyOf?: (item: T) => string | number;\n layout?: 'list' | 'grid';\n columns?: number;\n gap?: string;\n renderEmpty?: () => ReactNode;\n renderLoading?: () => ReactNode;\n renderError?: (error: string) => ReactNode;\n className?: string;\n 'aria-label'?: string;\n}\n\nconst defaultKeyOf = (item: any) => item.id;\n\n/**\n * Headless list/grid component with render-prop items.\n * Renders a semantic `<ul>` with optional CSS grid layout.\n */\nexport function CardList<T>({\n items,\n renderItem,\n keyOf = defaultKeyOf,\n layout = 'list',\n columns = 3,\n gap = '1rem',\n loading,\n error,\n renderEmpty,\n renderLoading,\n renderError,\n className,\n 'aria-label': ariaLabel,\n}: CardListProps<T>) {\n if (loading && renderLoading) return <>{renderLoading()}</>;\n if (error && renderError) return <>{renderError(error)}</>;\n if (items.length === 0 && renderEmpty) return <>{renderEmpty()}</>;\n\n const style = layout === 'grid'\n ? {\n display: 'grid',\n gridTemplateColumns: `repeat(var(--card-list-columns, ${columns}), 1fr)`,\n gap: `var(--card-list-gap, ${gap})`,\n } as const\n : undefined;\n\n return (\n <ul\n role=\"list\"\n data-component=\"card-list\"\n data-layout={layout}\n className={className}\n aria-label={ariaLabel}\n style={style}\n >\n {items.map((item, index) => (\n <li key={keyOf(item)} data-index={index}>\n {renderItem(item, index)}\n </li>\n ))}\n </ul>\n );\n}\n"],"
|
|
1
|
+
{"version":3,"file":"CardList.cjs","names":[],"sources":["../../../src/react/components/CardList.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { AsyncStateProps } from './types';\n\n/** Props for the CardList headless component. */\nexport interface CardListProps<T> extends AsyncStateProps {\n items: T[];\n renderItem: (item: T, index: number) => ReactNode;\n keyOf?: (item: T) => string | number;\n layout?: 'list' | 'grid';\n columns?: number;\n gap?: string;\n renderEmpty?: () => ReactNode;\n renderLoading?: () => ReactNode;\n renderError?: (error: string) => ReactNode;\n className?: string;\n 'aria-label'?: string;\n}\n\nconst defaultKeyOf = (item: any) => item.id;\n\n/**\n * Headless list/grid component with render-prop items.\n * Renders a semantic `<ul>` with optional CSS grid layout.\n */\nexport function CardList<T>({\n items,\n renderItem,\n keyOf = defaultKeyOf,\n layout = 'list',\n columns = 3,\n gap = '1rem',\n loading,\n error,\n renderEmpty,\n renderLoading,\n renderError,\n className,\n 'aria-label': ariaLabel,\n}: CardListProps<T>) {\n if (loading && renderLoading) return <>{renderLoading()}</>;\n if (error && renderError) return <>{renderError(error)}</>;\n if (items.length === 0 && renderEmpty) return <>{renderEmpty()}</>;\n\n const style = layout === 'grid'\n ? {\n display: 'grid',\n gridTemplateColumns: `repeat(var(--card-list-columns, ${columns}), 1fr)`,\n gap: `var(--card-list-gap, ${gap})`,\n } as const\n : undefined;\n\n return (\n <ul\n role=\"list\"\n data-component=\"card-list\"\n data-layout={layout}\n className={className}\n aria-label={ariaLabel}\n style={style}\n >\n {items.map((item, index) => (\n <li key={keyOf(item)} data-index={index}>\n {renderItem(item, index)}\n </li>\n ))}\n </ul>\n );\n}\n"],"mappings":";;AAkBA,IAAM,gBAAgB,SAAc,KAAK;;;;;AAMzC,SAAgB,SAAY,EAC1B,OACA,YACA,QAAQ,cACR,SAAS,QACT,UAAU,GACV,MAAM,QACN,SACA,OACA,aACA,eACA,aACA,WACA,cAAc,aACK;AACnB,KAAI,WAAW,cAAe,QAAO,iBAAA,GAAA,kBAAA,KAAA,kBAAA,UAAA,EAAA,UAAG,eAAe,EAAI,CAAA;AAC3D,KAAI,SAAS,YAAa,QAAO,iBAAA,GAAA,kBAAA,KAAA,kBAAA,UAAA,EAAA,UAAG,YAAY,MAAM,EAAI,CAAA;AAC1D,KAAI,MAAM,WAAW,KAAK,YAAa,QAAO,iBAAA,GAAA,kBAAA,KAAA,kBAAA,UAAA,EAAA,UAAG,aAAa,EAAI,CAAA;AAUlE,QACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;EACE,MAAK;EACL,kBAAe;EACf,eAAa;EACF;EACX,cAAY;EACL,OAfG,WAAW,SACrB;GACE,SAAS;GACT,qBAAqB,mCAAmC,QAAQ;GAChE,KAAK,wBAAwB,IAAI;GAClC,GACD,KAAA;YAWC,MAAM,KAAK,MAAM,UAChB,iBAAA,GAAA,kBAAA,KAAC,MAAD;GAAsB,cAAY;aAC/B,WAAW,MAAM,MAAM;GACrB,EAFI,MAAM,KAAK,CAEf,CACL;EACC,CAAA"}
|
|
@@ -1,42 +1,32 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
{
|
|
29
|
-
role: "list",
|
|
30
|
-
"data-component": "card-list",
|
|
31
|
-
"data-layout": layout,
|
|
32
|
-
className,
|
|
33
|
-
"aria-label": ariaLabel,
|
|
34
|
-
style,
|
|
35
|
-
children: items.map((item, index) => /* @__PURE__ */ jsx("li", { "data-index": index, children: renderItem(item, index) }, keyOf(item)))
|
|
36
|
-
}
|
|
37
|
-
);
|
|
1
|
+
import { Fragment, jsx } from "react/jsx-runtime";
|
|
2
|
+
//#region src/react/components/CardList.tsx
|
|
3
|
+
var defaultKeyOf = (item) => item.id;
|
|
4
|
+
/**
|
|
5
|
+
* Headless list/grid component with render-prop items.
|
|
6
|
+
* Renders a semantic `<ul>` with optional CSS grid layout.
|
|
7
|
+
*/
|
|
8
|
+
function CardList({ items, renderItem, keyOf = defaultKeyOf, layout = "list", columns = 3, gap = "1rem", loading, error, renderEmpty, renderLoading, renderError, className, "aria-label": ariaLabel }) {
|
|
9
|
+
if (loading && renderLoading) return /* @__PURE__ */ jsx(Fragment, { children: renderLoading() });
|
|
10
|
+
if (error && renderError) return /* @__PURE__ */ jsx(Fragment, { children: renderError(error) });
|
|
11
|
+
if (items.length === 0 && renderEmpty) return /* @__PURE__ */ jsx(Fragment, { children: renderEmpty() });
|
|
12
|
+
return /* @__PURE__ */ jsx("ul", {
|
|
13
|
+
role: "list",
|
|
14
|
+
"data-component": "card-list",
|
|
15
|
+
"data-layout": layout,
|
|
16
|
+
className,
|
|
17
|
+
"aria-label": ariaLabel,
|
|
18
|
+
style: layout === "grid" ? {
|
|
19
|
+
display: "grid",
|
|
20
|
+
gridTemplateColumns: `repeat(var(--card-list-columns, ${columns}), 1fr)`,
|
|
21
|
+
gap: `var(--card-list-gap, ${gap})`
|
|
22
|
+
} : void 0,
|
|
23
|
+
children: items.map((item, index) => /* @__PURE__ */ jsx("li", {
|
|
24
|
+
"data-index": index,
|
|
25
|
+
children: renderItem(item, index)
|
|
26
|
+
}, keyOf(item)))
|
|
27
|
+
});
|
|
38
28
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
//# sourceMappingURL=CardList.js.map
|
|
29
|
+
//#endregion
|
|
30
|
+
export { CardList };
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=CardList.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CardList.js","sources":["../../../src/react/components/CardList.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { AsyncStateProps } from './types';\n\n/** Props for the CardList headless component. */\nexport interface CardListProps<T> extends AsyncStateProps {\n items: T[];\n renderItem: (item: T, index: number) => ReactNode;\n keyOf?: (item: T) => string | number;\n layout?: 'list' | 'grid';\n columns?: number;\n gap?: string;\n renderEmpty?: () => ReactNode;\n renderLoading?: () => ReactNode;\n renderError?: (error: string) => ReactNode;\n className?: string;\n 'aria-label'?: string;\n}\n\nconst defaultKeyOf = (item: any) => item.id;\n\n/**\n * Headless list/grid component with render-prop items.\n * Renders a semantic `<ul>` with optional CSS grid layout.\n */\nexport function CardList<T>({\n items,\n renderItem,\n keyOf = defaultKeyOf,\n layout = 'list',\n columns = 3,\n gap = '1rem',\n loading,\n error,\n renderEmpty,\n renderLoading,\n renderError,\n className,\n 'aria-label': ariaLabel,\n}: CardListProps<T>) {\n if (loading && renderLoading) return <>{renderLoading()}</>;\n if (error && renderError) return <>{renderError(error)}</>;\n if (items.length === 0 && renderEmpty) return <>{renderEmpty()}</>;\n\n const style = layout === 'grid'\n ? {\n display: 'grid',\n gridTemplateColumns: `repeat(var(--card-list-columns, ${columns}), 1fr)`,\n gap: `var(--card-list-gap, ${gap})`,\n } as const\n : undefined;\n\n return (\n <ul\n role=\"list\"\n data-component=\"card-list\"\n data-layout={layout}\n className={className}\n aria-label={ariaLabel}\n style={style}\n >\n {items.map((item, index) => (\n <li key={keyOf(item)} data-index={index}>\n {renderItem(item, index)}\n </li>\n ))}\n </ul>\n );\n}\n"],"
|
|
1
|
+
{"version":3,"file":"CardList.js","names":[],"sources":["../../../src/react/components/CardList.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { AsyncStateProps } from './types';\n\n/** Props for the CardList headless component. */\nexport interface CardListProps<T> extends AsyncStateProps {\n items: T[];\n renderItem: (item: T, index: number) => ReactNode;\n keyOf?: (item: T) => string | number;\n layout?: 'list' | 'grid';\n columns?: number;\n gap?: string;\n renderEmpty?: () => ReactNode;\n renderLoading?: () => ReactNode;\n renderError?: (error: string) => ReactNode;\n className?: string;\n 'aria-label'?: string;\n}\n\nconst defaultKeyOf = (item: any) => item.id;\n\n/**\n * Headless list/grid component with render-prop items.\n * Renders a semantic `<ul>` with optional CSS grid layout.\n */\nexport function CardList<T>({\n items,\n renderItem,\n keyOf = defaultKeyOf,\n layout = 'list',\n columns = 3,\n gap = '1rem',\n loading,\n error,\n renderEmpty,\n renderLoading,\n renderError,\n className,\n 'aria-label': ariaLabel,\n}: CardListProps<T>) {\n if (loading && renderLoading) return <>{renderLoading()}</>;\n if (error && renderError) return <>{renderError(error)}</>;\n if (items.length === 0 && renderEmpty) return <>{renderEmpty()}</>;\n\n const style = layout === 'grid'\n ? {\n display: 'grid',\n gridTemplateColumns: `repeat(var(--card-list-columns, ${columns}), 1fr)`,\n gap: `var(--card-list-gap, ${gap})`,\n } as const\n : undefined;\n\n return (\n <ul\n role=\"list\"\n data-component=\"card-list\"\n data-layout={layout}\n className={className}\n aria-label={ariaLabel}\n style={style}\n >\n {items.map((item, index) => (\n <li key={keyOf(item)} data-index={index}>\n {renderItem(item, index)}\n </li>\n ))}\n </ul>\n );\n}\n"],"mappings":";;AAkBA,IAAM,gBAAgB,SAAc,KAAK;;;;;AAMzC,SAAgB,SAAY,EAC1B,OACA,YACA,QAAQ,cACR,SAAS,QACT,UAAU,GACV,MAAM,QACN,SACA,OACA,aACA,eACA,aACA,WACA,cAAc,aACK;AACnB,KAAI,WAAW,cAAe,QAAO,oBAAA,UAAA,EAAA,UAAG,eAAe,EAAI,CAAA;AAC3D,KAAI,SAAS,YAAa,QAAO,oBAAA,UAAA,EAAA,UAAG,YAAY,MAAM,EAAI,CAAA;AAC1D,KAAI,MAAM,WAAW,KAAK,YAAa,QAAO,oBAAA,UAAA,EAAA,UAAG,aAAa,EAAI,CAAA;AAUlE,QACE,oBAAC,MAAD;EACE,MAAK;EACL,kBAAe;EACf,eAAa;EACF;EACX,cAAY;EACL,OAfG,WAAW,SACrB;GACE,SAAS;GACT,qBAAqB,mCAAmC,QAAQ;GAChE,KAAK,wBAAwB,IAAI;GAClC,GACD,KAAA;YAWC,MAAM,KAAK,MAAM,UAChB,oBAAC,MAAD;GAAsB,cAAY;aAC/B,WAAW,MAAM,MAAM;GACrB,EAFI,MAAM,KAAK,CAEf,CACL;EACC,CAAA"}
|