mvc-kit 2.8.0 → 2.10.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 (152) hide show
  1. package/README.md +31 -0
  2. package/agent-config/claude-code/skills/guide/anti-patterns.md +67 -3
  3. package/agent-config/claude-code/skills/guide/api-reference.md +170 -2
  4. package/agent-config/claude-code/skills/guide/patterns.md +158 -0
  5. package/agent-config/copilot/copilot-instructions.md +56 -0
  6. package/agent-config/cursor/cursorrules +56 -0
  7. package/dist/Channel.cjs +5 -0
  8. package/dist/Channel.cjs.map +1 -1
  9. package/dist/Channel.d.ts +1 -0
  10. package/dist/Channel.d.ts.map +1 -1
  11. package/dist/Channel.js +5 -0
  12. package/dist/Channel.js.map +1 -1
  13. package/dist/Collection.cjs +55 -14
  14. package/dist/Collection.cjs.map +1 -1
  15. package/dist/Collection.d.ts +2 -2
  16. package/dist/Collection.d.ts.map +1 -1
  17. package/dist/Collection.js +55 -14
  18. package/dist/Collection.js.map +1 -1
  19. package/dist/Controller.cjs +5 -0
  20. package/dist/Controller.cjs.map +1 -1
  21. package/dist/Controller.d.ts +1 -0
  22. package/dist/Controller.d.ts.map +1 -1
  23. package/dist/Controller.js +5 -0
  24. package/dist/Controller.js.map +1 -1
  25. package/dist/EventBus.cjs +5 -0
  26. package/dist/EventBus.cjs.map +1 -1
  27. package/dist/EventBus.d.ts +1 -0
  28. package/dist/EventBus.d.ts.map +1 -1
  29. package/dist/EventBus.js +5 -0
  30. package/dist/EventBus.js.map +1 -1
  31. package/dist/Feed.cjs +90 -0
  32. package/dist/Feed.cjs.map +1 -0
  33. package/dist/Feed.d.ts +47 -0
  34. package/dist/Feed.d.ts.map +1 -0
  35. package/dist/Feed.js +90 -0
  36. package/dist/Feed.js.map +1 -0
  37. package/dist/Model.cjs +6 -3
  38. package/dist/Model.cjs.map +1 -1
  39. package/dist/Model.d.ts +1 -1
  40. package/dist/Model.d.ts.map +1 -1
  41. package/dist/Model.js +6 -3
  42. package/dist/Model.js.map +1 -1
  43. package/dist/Pagination.cjs +86 -0
  44. package/dist/Pagination.cjs.map +1 -0
  45. package/dist/Pagination.d.ts +39 -0
  46. package/dist/Pagination.d.ts.map +1 -0
  47. package/dist/Pagination.js +86 -0
  48. package/dist/Pagination.js.map +1 -0
  49. package/dist/Pending.cjs +301 -0
  50. package/dist/Pending.cjs.map +1 -0
  51. package/dist/Pending.d.ts +91 -0
  52. package/dist/Pending.d.ts.map +1 -0
  53. package/dist/Pending.js +301 -0
  54. package/dist/Pending.js.map +1 -0
  55. package/dist/PersistentCollection.cjs +9 -6
  56. package/dist/PersistentCollection.cjs.map +1 -1
  57. package/dist/PersistentCollection.d.ts +6 -1
  58. package/dist/PersistentCollection.d.ts.map +1 -1
  59. package/dist/PersistentCollection.js +9 -6
  60. package/dist/PersistentCollection.js.map +1 -1
  61. package/dist/Resource.cjs +3 -0
  62. package/dist/Resource.cjs.map +1 -1
  63. package/dist/Resource.d.ts +3 -0
  64. package/dist/Resource.d.ts.map +1 -1
  65. package/dist/Resource.js +3 -0
  66. package/dist/Resource.js.map +1 -1
  67. package/dist/Selection.cjs +103 -0
  68. package/dist/Selection.cjs.map +1 -0
  69. package/dist/Selection.d.ts +37 -0
  70. package/dist/Selection.d.ts.map +1 -0
  71. package/dist/Selection.js +103 -0
  72. package/dist/Selection.js.map +1 -0
  73. package/dist/Service.cjs +5 -0
  74. package/dist/Service.cjs.map +1 -1
  75. package/dist/Service.d.ts +1 -0
  76. package/dist/Service.d.ts.map +1 -1
  77. package/dist/Service.js +5 -0
  78. package/dist/Service.js.map +1 -1
  79. package/dist/Sorting.cjs +116 -0
  80. package/dist/Sorting.cjs.map +1 -0
  81. package/dist/Sorting.d.ts +43 -0
  82. package/dist/Sorting.d.ts.map +1 -0
  83. package/dist/Sorting.js +116 -0
  84. package/dist/Sorting.js.map +1 -0
  85. package/dist/ViewModel.cjs +45 -17
  86. package/dist/ViewModel.cjs.map +1 -1
  87. package/dist/ViewModel.d.ts +13 -4
  88. package/dist/ViewModel.d.ts.map +1 -1
  89. package/dist/ViewModel.js +45 -17
  90. package/dist/ViewModel.js.map +1 -1
  91. package/dist/bindPublicMethods.cjs +27 -0
  92. package/dist/bindPublicMethods.cjs.map +1 -0
  93. package/dist/bindPublicMethods.d.ts +18 -0
  94. package/dist/bindPublicMethods.d.ts.map +1 -0
  95. package/dist/bindPublicMethods.js +27 -0
  96. package/dist/bindPublicMethods.js.map +1 -0
  97. package/dist/index.d.ts +8 -0
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/mvc-kit.cjs +10 -0
  100. package/dist/mvc-kit.cjs.map +1 -1
  101. package/dist/mvc-kit.js +10 -0
  102. package/dist/mvc-kit.js.map +1 -1
  103. package/dist/react/components/CardList.cjs +42 -0
  104. package/dist/react/components/CardList.cjs.map +1 -0
  105. package/dist/react/components/CardList.d.ts +22 -0
  106. package/dist/react/components/CardList.d.ts.map +1 -0
  107. package/dist/react/components/CardList.js +42 -0
  108. package/dist/react/components/CardList.js.map +1 -0
  109. package/dist/react/components/DataTable.cjs +179 -0
  110. package/dist/react/components/DataTable.cjs.map +1 -0
  111. package/dist/react/components/DataTable.d.ts +30 -0
  112. package/dist/react/components/DataTable.d.ts.map +1 -0
  113. package/dist/react/components/DataTable.js +179 -0
  114. package/dist/react/components/DataTable.js.map +1 -0
  115. package/dist/react/components/InfiniteScroll.cjs +44 -0
  116. package/dist/react/components/InfiniteScroll.cjs.map +1 -0
  117. package/dist/react/components/InfiniteScroll.d.ts +21 -0
  118. package/dist/react/components/InfiniteScroll.d.ts.map +1 -0
  119. package/dist/react/components/InfiniteScroll.js +44 -0
  120. package/dist/react/components/InfiniteScroll.js.map +1 -0
  121. package/dist/react/components/types.cjs +15 -0
  122. package/dist/react/components/types.cjs.map +1 -0
  123. package/dist/react/components/types.d.ts +71 -0
  124. package/dist/react/components/types.d.ts.map +1 -0
  125. package/dist/react/components/types.js +15 -0
  126. package/dist/react/components/types.js.map +1 -0
  127. package/dist/react/index.d.ts +7 -0
  128. package/dist/react/index.d.ts.map +1 -1
  129. package/dist/react-native/NativeCollection.cjs +3 -0
  130. package/dist/react-native/NativeCollection.cjs.map +1 -1
  131. package/dist/react-native/NativeCollection.d.ts +3 -0
  132. package/dist/react-native/NativeCollection.d.ts.map +1 -1
  133. package/dist/react-native/NativeCollection.js +3 -0
  134. package/dist/react-native/NativeCollection.js.map +1 -1
  135. package/dist/react.cjs +6 -0
  136. package/dist/react.cjs.map +1 -1
  137. package/dist/react.js +6 -0
  138. package/dist/react.js.map +1 -1
  139. package/dist/walkPrototypeChain.cjs.map +1 -1
  140. package/dist/walkPrototypeChain.d.ts +1 -1
  141. package/dist/walkPrototypeChain.js.map +1 -1
  142. package/dist/web/idb.cjs.map +1 -1
  143. package/dist/web/idb.d.ts +18 -0
  144. package/dist/web/idb.d.ts.map +1 -1
  145. package/dist/web/idb.js.map +1 -1
  146. package/dist/wrapAsyncMethods.cjs +36 -44
  147. package/dist/wrapAsyncMethods.cjs.map +1 -1
  148. package/dist/wrapAsyncMethods.d.ts +2 -0
  149. package/dist/wrapAsyncMethods.d.ts.map +1 -1
  150. package/dist/wrapAsyncMethods.js +36 -44
  151. package/dist/wrapAsyncMethods.js.map +1 -1
  152. package/package.json +2 -1
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const walkPrototypeChain = require("./walkPrototypeChain.cjs");
4
+ const methodCache = /* @__PURE__ */ new WeakMap();
5
+ function bindPublicMethods(instance, stopPrototype = Object.prototype, exclude) {
6
+ const ctor = instance.constructor;
7
+ let methods = methodCache.get(ctor);
8
+ if (!methods) {
9
+ methods = [];
10
+ const seen = /* @__PURE__ */ new Set();
11
+ walkPrototypeChain.walkPrototypeChain(instance, stopPrototype, (key, desc) => {
12
+ if (seen.has(key)) return;
13
+ seen.add(key);
14
+ if (desc.get || desc.set) return;
15
+ if (typeof desc.value !== "function") return;
16
+ if (key.startsWith("_")) return;
17
+ if (exclude?.has(key)) return;
18
+ methods.push({ key, fn: desc.value });
19
+ });
20
+ methodCache.set(ctor, methods);
21
+ }
22
+ for (let i = 0; i < methods.length; i++) {
23
+ instance[methods[i].key] = methods[i].fn.bind(instance);
24
+ }
25
+ }
26
+ exports.bindPublicMethods = bindPublicMethods;
27
+ //# sourceMappingURL=bindPublicMethods.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bindPublicMethods.cjs","sources":["../src/bindPublicMethods.ts"],"sourcesContent":["import { walkPrototypeChain } from './walkPrototypeChain';\n\n/** Cached list of bindable method keys + prototype functions per class. */\nconst methodCache = new WeakMap<Function, Array<{ key: string; fn: Function }>>();\n\n/**\n * Auto-binds all public methods on the instance so they can be passed\n * as callbacks without losing `this` context (point-free style).\n *\n * Walks the prototype chain from the instance up to (but not including)\n * `stopPrototype` (defaults to `Object.prototype`). Skips `_`-prefixed\n * methods, getters/setters, and any keys in the `exclude` set.\n * Most-derived version wins for override chains.\n *\n * Results are cached per class constructor in a WeakMap — subsequent\n * instances of the same class skip the prototype walk entirely.\n *\n * @param exclude Keys to skip (e.g. protected/internal methods that should\n * not be bound). Must be the same set for all instances of a given class\n * since the result is cached by constructor.\n */\nexport function bindPublicMethods(\n instance: object,\n stopPrototype: object = Object.prototype,\n exclude?: ReadonlySet<string>,\n): void {\n const ctor = instance.constructor;\n let methods = methodCache.get(ctor);\n\n if (!methods) {\n methods = [];\n const seen = new Set<string>();\n walkPrototypeChain(instance, stopPrototype, (key, desc) => {\n if (seen.has(key)) return;\n seen.add(key);\n if (desc.get || desc.set) return;\n if (typeof desc.value !== 'function') return;\n if (key.startsWith('_')) return;\n if (exclude?.has(key)) return;\n methods!.push({ key, fn: desc.value });\n });\n methodCache.set(ctor, methods);\n }\n\n for (let i = 0; i < methods.length; i++) {\n (instance as any)[methods[i].key] = methods[i].fn.bind(instance);\n }\n}\n"],"names":["walkPrototypeChain"],"mappings":";;;AAGA,MAAM,kCAAkB,QAAA;AAkBjB,SAAS,kBACd,UACA,gBAAwB,OAAO,WAC/B,SACM;AACN,QAAM,OAAO,SAAS;AACtB,MAAI,UAAU,YAAY,IAAI,IAAI;AAElC,MAAI,CAAC,SAAS;AACZ,cAAU,CAAA;AACV,UAAM,2BAAW,IAAA;AACjBA,uBAAAA,mBAAmB,UAAU,eAAe,CAAC,KAAK,SAAS;AACzD,UAAI,KAAK,IAAI,GAAG,EAAG;AACnB,WAAK,IAAI,GAAG;AACZ,UAAI,KAAK,OAAO,KAAK,IAAK;AAC1B,UAAI,OAAO,KAAK,UAAU,WAAY;AACtC,UAAI,IAAI,WAAW,GAAG,EAAG;AACzB,UAAI,SAAS,IAAI,GAAG,EAAG;AACvB,cAAS,KAAK,EAAE,KAAK,IAAI,KAAK,OAAO;AAAA,IACvC,CAAC;AACD,gBAAY,IAAI,MAAM,OAAO;AAAA,EAC/B;AAEA,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACtC,aAAiB,QAAQ,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,EAAE,GAAG,KAAK,QAAQ;AAAA,EACjE;AACF;;"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Auto-binds all public methods on the instance so they can be passed
3
+ * as callbacks without losing `this` context (point-free style).
4
+ *
5
+ * Walks the prototype chain from the instance up to (but not including)
6
+ * `stopPrototype` (defaults to `Object.prototype`). Skips `_`-prefixed
7
+ * methods, getters/setters, and any keys in the `exclude` set.
8
+ * Most-derived version wins for override chains.
9
+ *
10
+ * Results are cached per class constructor in a WeakMap — subsequent
11
+ * instances of the same class skip the prototype walk entirely.
12
+ *
13
+ * @param exclude Keys to skip (e.g. protected/internal methods that should
14
+ * not be bound). Must be the same set for all instances of a given class
15
+ * since the result is cached by constructor.
16
+ */
17
+ export declare function bindPublicMethods(instance: object, stopPrototype?: object, exclude?: ReadonlySet<string>): void;
18
+ //# sourceMappingURL=bindPublicMethods.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bindPublicMethods.d.ts","sourceRoot":"","sources":["../src/bindPublicMethods.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,aAAa,GAAE,MAAyB,EACxC,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAC5B,IAAI,CAsBN"}
@@ -0,0 +1,27 @@
1
+ import { walkPrototypeChain } from "./walkPrototypeChain.js";
2
+ const methodCache = /* @__PURE__ */ new WeakMap();
3
+ function bindPublicMethods(instance, stopPrototype = Object.prototype, exclude) {
4
+ const ctor = instance.constructor;
5
+ let methods = methodCache.get(ctor);
6
+ if (!methods) {
7
+ methods = [];
8
+ const seen = /* @__PURE__ */ new Set();
9
+ walkPrototypeChain(instance, stopPrototype, (key, desc) => {
10
+ if (seen.has(key)) return;
11
+ seen.add(key);
12
+ if (desc.get || desc.set) return;
13
+ if (typeof desc.value !== "function") return;
14
+ if (key.startsWith("_")) return;
15
+ if (exclude?.has(key)) return;
16
+ methods.push({ key, fn: desc.value });
17
+ });
18
+ methodCache.set(ctor, methods);
19
+ }
20
+ for (let i = 0; i < methods.length; i++) {
21
+ instance[methods[i].key] = methods[i].fn.bind(instance);
22
+ }
23
+ }
24
+ export {
25
+ bindPublicMethods
26
+ };
27
+ //# sourceMappingURL=bindPublicMethods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bindPublicMethods.js","sources":["../src/bindPublicMethods.ts"],"sourcesContent":["import { walkPrototypeChain } from './walkPrototypeChain';\n\n/** Cached list of bindable method keys + prototype functions per class. */\nconst methodCache = new WeakMap<Function, Array<{ key: string; fn: Function }>>();\n\n/**\n * Auto-binds all public methods on the instance so they can be passed\n * as callbacks without losing `this` context (point-free style).\n *\n * Walks the prototype chain from the instance up to (but not including)\n * `stopPrototype` (defaults to `Object.prototype`). Skips `_`-prefixed\n * methods, getters/setters, and any keys in the `exclude` set.\n * Most-derived version wins for override chains.\n *\n * Results are cached per class constructor in a WeakMap — subsequent\n * instances of the same class skip the prototype walk entirely.\n *\n * @param exclude Keys to skip (e.g. protected/internal methods that should\n * not be bound). Must be the same set for all instances of a given class\n * since the result is cached by constructor.\n */\nexport function bindPublicMethods(\n instance: object,\n stopPrototype: object = Object.prototype,\n exclude?: ReadonlySet<string>,\n): void {\n const ctor = instance.constructor;\n let methods = methodCache.get(ctor);\n\n if (!methods) {\n methods = [];\n const seen = new Set<string>();\n walkPrototypeChain(instance, stopPrototype, (key, desc) => {\n if (seen.has(key)) return;\n seen.add(key);\n if (desc.get || desc.set) return;\n if (typeof desc.value !== 'function') return;\n if (key.startsWith('_')) return;\n if (exclude?.has(key)) return;\n methods!.push({ key, fn: desc.value });\n });\n methodCache.set(ctor, methods);\n }\n\n for (let i = 0; i < methods.length; i++) {\n (instance as any)[methods[i].key] = methods[i].fn.bind(instance);\n }\n}\n"],"names":[],"mappings":";AAGA,MAAM,kCAAkB,QAAA;AAkBjB,SAAS,kBACd,UACA,gBAAwB,OAAO,WAC/B,SACM;AACN,QAAM,OAAO,SAAS;AACtB,MAAI,UAAU,YAAY,IAAI,IAAI;AAElC,MAAI,CAAC,SAAS;AACZ,cAAU,CAAA;AACV,UAAM,2BAAW,IAAA;AACjB,uBAAmB,UAAU,eAAe,CAAC,KAAK,SAAS;AACzD,UAAI,KAAK,IAAI,GAAG,EAAG;AACnB,WAAK,IAAI,GAAG;AACZ,UAAI,KAAK,OAAO,KAAK,IAAK;AAC1B,UAAI,OAAO,KAAK,UAAU,WAAY;AACtC,UAAI,IAAI,WAAW,GAAG,EAAG;AACzB,UAAI,SAAS,IAAI,GAAG,EAAG;AACvB,cAAS,KAAK,EAAE,KAAK,IAAI,KAAK,OAAO;AAAA,IACvC,CAAC;AACD,gBAAY,IAAI,MAAM,OAAO;AAAA,EAC/B;AAEA,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACtC,aAAiB,QAAQ,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,EAAE,GAAG,KAAK,QAAQ;AAAA,EACjE;AACF;"}
package/dist/index.d.ts CHANGED
@@ -11,6 +11,14 @@ export { Service } from './Service';
11
11
  export { EventBus } from './EventBus';
12
12
  export { Channel } from './Channel';
13
13
  export type { ChannelStatus } from './Channel';
14
+ export { Sorting } from './Sorting';
15
+ export type { SortDescriptor } from './Sorting';
16
+ export { Pagination } from './Pagination';
17
+ export { Selection } from './Selection';
18
+ export { Feed } from './Feed';
19
+ export type { FeedPage } from './Feed';
20
+ export { Pending } from './Pending';
21
+ export type { PendingOperation, PendingEntry } from './Pending';
14
22
  export type { AppError } from './errors';
15
23
  export { HttpError, isAbortError, classifyError } from './errors';
16
24
  export { singleton, hasSingleton, teardown, teardownAll } from './singleton';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,YAAY,GACb,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAG1D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG/C,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGlE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,YAAY,GACb,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAG1D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG/C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGhE,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGlE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
package/dist/mvc-kit.cjs CHANGED
@@ -9,6 +9,11 @@ const Controller = require("./Controller.cjs");
9
9
  const Service = require("./Service.cjs");
10
10
  const EventBus = require("./EventBus.cjs");
11
11
  const Channel = require("./Channel.cjs");
12
+ const Sorting = require("./Sorting.cjs");
13
+ const Pagination = require("./Pagination.cjs");
14
+ const Selection = require("./Selection.cjs");
15
+ const Feed = require("./Feed.cjs");
16
+ const Pending = require("./Pending.cjs");
12
17
  const errors = require("./errors.cjs");
13
18
  const singleton = require("./singleton.cjs");
14
19
  exports.ViewModel = ViewModel.ViewModel;
@@ -20,6 +25,11 @@ exports.Controller = Controller.Controller;
20
25
  exports.Service = Service.Service;
21
26
  exports.EventBus = EventBus.EventBus;
22
27
  exports.Channel = Channel.Channel;
28
+ exports.Sorting = Sorting.Sorting;
29
+ exports.Pagination = Pagination.Pagination;
30
+ exports.Selection = Selection.Selection;
31
+ exports.Feed = Feed.Feed;
32
+ exports.Pending = Pending.Pending;
23
33
  exports.HttpError = errors.HttpError;
24
34
  exports.classifyError = errors.classifyError;
25
35
  exports.isAbortError = errors.isAbortError;
@@ -1 +1 @@
1
- {"version":3,"file":"mvc-kit.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"mvc-kit.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/mvc-kit.js CHANGED
@@ -7,6 +7,11 @@ import { Controller } from "./Controller.js";
7
7
  import { Service } from "./Service.js";
8
8
  import { EventBus } from "./EventBus.js";
9
9
  import { Channel } from "./Channel.js";
10
+ import { Sorting } from "./Sorting.js";
11
+ import { Pagination } from "./Pagination.js";
12
+ import { Selection } from "./Selection.js";
13
+ import { Feed } from "./Feed.js";
14
+ import { Pending } from "./Pending.js";
10
15
  import { HttpError, classifyError, isAbortError } from "./errors.js";
11
16
  import { hasSingleton, singleton, teardown, teardownAll } from "./singleton.js";
12
17
  export {
@@ -14,11 +19,16 @@ export {
14
19
  Collection,
15
20
  Controller,
16
21
  EventBus,
22
+ Feed,
17
23
  HttpError,
18
24
  Model,
25
+ Pagination,
26
+ Pending,
19
27
  PersistentCollection,
20
28
  Resource,
29
+ Selection,
21
30
  Service,
31
+ Sorting,
22
32
  ViewModel,
23
33
  classifyError,
24
34
  hasSingleton,
@@ -1 +1 @@
1
- {"version":3,"file":"mvc-kit.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
1
+ {"version":3,"file":"mvc-kit.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const defaultKeyOf = (item) => item.id;
5
+ function CardList({
6
+ items,
7
+ renderItem,
8
+ keyOf = defaultKeyOf,
9
+ layout = "list",
10
+ columns = 3,
11
+ gap = "1rem",
12
+ loading,
13
+ error,
14
+ renderEmpty,
15
+ renderLoading,
16
+ renderError,
17
+ className,
18
+ "aria-label": ariaLabel
19
+ }) {
20
+ if (loading && renderLoading) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderLoading() });
21
+ if (error && renderError) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderError(error) });
22
+ if (items.length === 0 && renderEmpty) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderEmpty() });
23
+ const style = layout === "grid" ? {
24
+ display: "grid",
25
+ gridTemplateColumns: `repeat(var(--card-list-columns, ${columns}), 1fr)`,
26
+ gap: `var(--card-list-gap, ${gap})`
27
+ } : void 0;
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
+ );
40
+ }
41
+ exports.CardList = CardList;
42
+ //# sourceMappingURL=CardList.cjs.map
@@ -0,0 +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"],"names":["jsx","Fragment"],"mappings":";;;AAkBA,MAAM,eAAe,CAAC,SAAc,KAAK;AAMlC,SAAS,SAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAqB;AACnB,MAAI,WAAW,cAAe,QAAOA,2BAAAA,IAAAC,WAAAA,UAAA,EAAG,2BAAgB;AACxD,MAAI,SAAS,YAAa,QAAOD,+BAAAC,WAAAA,UAAA,EAAG,UAAA,YAAY,KAAK,GAAE;AACvD,MAAI,MAAM,WAAW,KAAK,YAAa,QAAOD,+BAAAC,WAAAA,UAAA,EAAG,yBAAc;AAE/D,QAAM,QAAQ,WAAW,SACrB;AAAA,IACE,SAAS;AAAA,IACT,qBAAqB,mCAAmC,OAAO;AAAA,IAC/D,KAAK,wBAAwB,GAAG;AAAA,EAAA,IAElC;AAEJ,SACED,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,kBAAe;AAAA,MACf,eAAa;AAAA,MACb;AAAA,MACA,cAAY;AAAA,MACZ;AAAA,MAEC,gBAAM,IAAI,CAAC,MAAM,yCACf,MAAA,EAAqB,cAAY,OAC/B,UAAA,WAAW,MAAM,KAAK,KADhB,MAAM,IAAI,CAEnB,CACD;AAAA,IAAA;AAAA,EAAA;AAGP;;"}
@@ -0,0 +1,22 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { AsyncStateProps } from './types';
3
+ /** Props for the CardList headless component. */
4
+ export interface CardListProps<T> extends AsyncStateProps {
5
+ items: T[];
6
+ renderItem: (item: T, index: number) => ReactNode;
7
+ keyOf?: (item: T) => string | number;
8
+ layout?: 'list' | 'grid';
9
+ columns?: number;
10
+ gap?: string;
11
+ renderEmpty?: () => ReactNode;
12
+ renderLoading?: () => ReactNode;
13
+ renderError?: (error: string) => ReactNode;
14
+ className?: string;
15
+ 'aria-label'?: string;
16
+ }
17
+ /**
18
+ * Headless list/grid component with render-prop items.
19
+ * Renders a semantic `<ul>` with optional CSS grid layout.
20
+ */
21
+ export declare function CardList<T>({ items, renderItem, keyOf, layout, columns, gap, loading, error, renderEmpty, renderLoading, renderError, className, 'aria-label': ariaLabel, }: CardListProps<T>): import("react/jsx-runtime").JSX.Element;
22
+ //# sourceMappingURL=CardList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CardList.d.ts","sourceRoot":"","sources":["../../../src/react/components/CardList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,iDAAiD;AACjD,MAAM,WAAW,aAAa,CAAC,CAAC,CAAE,SAAQ,eAAe;IACvD,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IAClD,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,SAAS,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,SAAS,CAAC;IAChC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAC1B,KAAK,EACL,UAAU,EACV,KAAoB,EACpB,MAAe,EACf,OAAW,EACX,GAAY,EACZ,OAAO,EACP,KAAK,EACL,WAAW,EACX,aAAa,EACb,WAAW,EACX,SAAS,EACT,YAAY,EAAE,SAAS,GACxB,EAAE,aAAa,CAAC,CAAC,CAAC,2CA6BlB"}
@@ -0,0 +1,42 @@
1
+ import { jsx, Fragment } from "react/jsx-runtime";
2
+ const defaultKeyOf = (item) => item.id;
3
+ function CardList({
4
+ items,
5
+ renderItem,
6
+ keyOf = defaultKeyOf,
7
+ layout = "list",
8
+ columns = 3,
9
+ gap = "1rem",
10
+ loading,
11
+ error,
12
+ renderEmpty,
13
+ renderLoading,
14
+ renderError,
15
+ className,
16
+ "aria-label": ariaLabel
17
+ }) {
18
+ if (loading && renderLoading) return /* @__PURE__ */ jsx(Fragment, { children: renderLoading() });
19
+ if (error && renderError) return /* @__PURE__ */ jsx(Fragment, { children: renderError(error) });
20
+ if (items.length === 0 && renderEmpty) return /* @__PURE__ */ jsx(Fragment, { children: renderEmpty() });
21
+ const style = layout === "grid" ? {
22
+ display: "grid",
23
+ gridTemplateColumns: `repeat(var(--card-list-columns, ${columns}), 1fr)`,
24
+ gap: `var(--card-list-gap, ${gap})`
25
+ } : void 0;
26
+ return /* @__PURE__ */ jsx(
27
+ "ul",
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
+ );
38
+ }
39
+ export {
40
+ CardList
41
+ };
42
+ //# sourceMappingURL=CardList.js.map
@@ -0,0 +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"],"names":[],"mappings":";AAkBA,MAAM,eAAe,CAAC,SAAc,KAAK;AAMlC,SAAS,SAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAqB;AACnB,MAAI,WAAW,cAAe,QAAO,oBAAA,UAAA,EAAG,2BAAgB;AACxD,MAAI,SAAS,YAAa,QAAO,oBAAA,UAAA,EAAG,UAAA,YAAY,KAAK,GAAE;AACvD,MAAI,MAAM,WAAW,KAAK,YAAa,QAAO,oBAAA,UAAA,EAAG,yBAAc;AAE/D,QAAM,QAAQ,WAAW,SACrB;AAAA,IACE,SAAS;AAAA,IACT,qBAAqB,mCAAmC,OAAO;AAAA,IAC/D,KAAK,wBAAwB,GAAG;AAAA,EAAA,IAElC;AAEJ,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,kBAAe;AAAA,MACf,eAAa;AAAA,MACb;AAAA,MACA,cAAY;AAAA,MACZ;AAAA,MAEC,gBAAM,IAAI,CAAC,MAAM,8BACf,MAAA,EAAqB,cAAY,OAC/B,UAAA,WAAW,MAAM,KAAK,KADhB,MAAM,IAAI,CAEnB,CACD;AAAA,IAAA;AAAA,EAAA;AAGP;"}
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const types = require("./types.cjs");
5
+ function resolveSelectionProp(selection) {
6
+ if (types.isSelectionHelper(selection)) {
7
+ return {
8
+ selected: selection.selected,
9
+ onToggle: (key) => selection.toggle(key),
10
+ onToggleAll: (allKeys) => selection.toggleAll(allKeys)
11
+ };
12
+ }
13
+ return {
14
+ selected: selection.selected,
15
+ onToggle: selection.onToggle,
16
+ onToggleAll: (allKeys) => selection.onToggleAll(allKeys)
17
+ };
18
+ }
19
+ function resolveSortProp(sort, onSort) {
20
+ if (types.isSortingHelper(sort)) {
21
+ return { sorts: sort.sorts, onSort: (key) => sort.toggle(key) };
22
+ }
23
+ return { sorts: sort, onSort };
24
+ }
25
+ function resolvePaginationProp(pagination, pageSize, paginationTotal) {
26
+ if (types.isPaginationHelper(pagination)) {
27
+ const total2 = paginationTotal ?? 0;
28
+ const ps2 = pagination.pageSize;
29
+ const pageCount2 = Math.max(1, Math.ceil(total2 / ps2));
30
+ const page2 = pagination.page;
31
+ return {
32
+ page: page2,
33
+ pageCount: pageCount2,
34
+ total: total2,
35
+ pageSize: ps2,
36
+ hasPrev: page2 > 1,
37
+ hasNext: page2 < pageCount2,
38
+ goToPage: (p) => pagination.setPage(p),
39
+ goPrev: () => pagination.setPage(page2 - 1),
40
+ goNext: () => pagination.setPage(page2 + 1)
41
+ };
42
+ }
43
+ const total = pagination.total;
44
+ const ps = pageSize ?? 10;
45
+ const pageCount = Math.max(1, Math.ceil(total / ps));
46
+ const page = pagination.page;
47
+ return {
48
+ page,
49
+ pageCount,
50
+ total,
51
+ pageSize: ps,
52
+ hasPrev: page > 1,
53
+ hasNext: page < pageCount,
54
+ goToPage: pagination.onPageChange,
55
+ goPrev: () => pagination.onPageChange(page - 1),
56
+ goNext: () => pagination.onPageChange(page + 1)
57
+ };
58
+ }
59
+ const defaultKeyOf = (item) => item.id;
60
+ function getAriaSortValue(key, sorts) {
61
+ if (!sorts) return "none";
62
+ const desc = sorts.find((s) => s.key === key);
63
+ if (!desc) return "none";
64
+ return desc.direction === "asc" ? "ascending" : "descending";
65
+ }
66
+ function DataTable({
67
+ items,
68
+ columns,
69
+ keyOf = defaultKeyOf,
70
+ pageSize,
71
+ sort,
72
+ onSort,
73
+ selection,
74
+ loading,
75
+ error,
76
+ pagination,
77
+ paginationTotal,
78
+ renderEmpty,
79
+ renderLoading,
80
+ renderError,
81
+ renderSortIndicator,
82
+ renderRow,
83
+ renderPagination,
84
+ className,
85
+ "aria-label": ariaLabel
86
+ }) {
87
+ if (loading && renderLoading) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderLoading() });
88
+ if (error && renderError) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderError(error) });
89
+ if (items.length === 0 && renderEmpty) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderEmpty() });
90
+ const resolvedSelection = selection ? resolveSelectionProp(selection) : void 0;
91
+ let resolvedSorts;
92
+ let resolvedOnSort;
93
+ if (sort) {
94
+ const resolved = resolveSortProp(sort, onSort);
95
+ resolvedSorts = resolved.sorts;
96
+ resolvedOnSort = resolved.onSort;
97
+ }
98
+ let displayItems = items;
99
+ let paginationInfo;
100
+ if (pagination) {
101
+ paginationInfo = resolvePaginationProp(pagination, pageSize, paginationTotal);
102
+ } else if (pageSize && !pagination) {
103
+ displayItems = items.slice(0, pageSize);
104
+ }
105
+ const allKeys = resolvedSelection ? displayItems.map((item) => keyOf(item)) : [];
106
+ const allSelected = resolvedSelection && allKeys.length > 0 && allKeys.every((k) => resolvedSelection.selected.has(k));
107
+ const someSelected = resolvedSelection && allKeys.some((k) => resolvedSelection.selected.has(k));
108
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-component": "data-table", className, children: [
109
+ /* @__PURE__ */ jsxRuntime.jsxs("table", { role: "grid", "aria-label": ariaLabel, children: [
110
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
111
+ resolvedSelection && /* @__PURE__ */ jsxRuntime.jsx("th", { "data-column": "select", children: /* @__PURE__ */ jsxRuntime.jsx(
112
+ "input",
113
+ {
114
+ type: "checkbox",
115
+ checked: !!allSelected,
116
+ ref: (el) => {
117
+ if (el) el.indeterminate = !!someSelected && !allSelected;
118
+ },
119
+ onChange: () => resolvedSelection.onToggleAll(allKeys),
120
+ "aria-label": "Select all"
121
+ }
122
+ ) }),
123
+ columns.map((col) => {
124
+ const isSortable = col.sortable && resolvedOnSort;
125
+ const sortDesc = resolvedSorts?.find((s) => s.key === col.key);
126
+ const isActive = !!sortDesc;
127
+ const sortIndex = resolvedSorts ? resolvedSorts.findIndex((s) => s.key === col.key) : -1;
128
+ return /* @__PURE__ */ jsxRuntime.jsx(
129
+ "th",
130
+ {
131
+ "data-sortable": isSortable ? "" : void 0,
132
+ "data-sorted": isActive ? "" : void 0,
133
+ "data-align": col.align,
134
+ style: col.width ? { width: col.width } : void 0,
135
+ "aria-sort": isSortable ? getAriaSortValue(col.key, resolvedSorts) : void 0,
136
+ children: isSortable ? /* @__PURE__ */ jsxRuntime.jsxs("button", { type: "button", onClick: () => resolvedOnSort(col.key), children: [
137
+ col.header,
138
+ renderSortIndicator?.({
139
+ active: isActive,
140
+ direction: sortDesc?.direction ?? "asc",
141
+ index: sortIndex,
142
+ onToggle: () => resolvedOnSort(col.key)
143
+ })
144
+ ] }) : col.header
145
+ },
146
+ col.key
147
+ );
148
+ })
149
+ ] }) }),
150
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: displayItems.map((item, index) => {
151
+ const key = keyOf(item);
152
+ const isSelected = resolvedSelection?.selected.has(key);
153
+ const cells = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
154
+ resolvedSelection && /* @__PURE__ */ jsxRuntime.jsx("td", { "data-column": "select", children: /* @__PURE__ */ jsxRuntime.jsx(
155
+ "input",
156
+ {
157
+ type: "checkbox",
158
+ checked: !!isSelected,
159
+ onChange: () => resolvedSelection.onToggle(key),
160
+ "aria-label": `Select row ${key}`
161
+ }
162
+ ) }),
163
+ columns.map((col) => /* @__PURE__ */ jsxRuntime.jsx(
164
+ "td",
165
+ {
166
+ "data-align": col.align,
167
+ children: col.render(item, index)
168
+ },
169
+ col.key
170
+ ))
171
+ ] });
172
+ return /* @__PURE__ */ jsxRuntime.jsx("tr", { "data-selected": isSelected ? "" : void 0, children: renderRow ? renderRow(item, index, cells) : cells }, key);
173
+ }) })
174
+ ] }),
175
+ paginationInfo && renderPagination?.(paginationInfo)
176
+ ] });
177
+ }
178
+ exports.DataTable = DataTable;
179
+ //# sourceMappingURL=DataTable.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.cjs","sources":["../../../src/react/components/DataTable.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type {\n Column,\n SortHeaderProps,\n SelectionState,\n SelectionHelper,\n PaginationState,\n PaginationHelper,\n PaginationInfo,\n SortingHelper,\n AsyncStateProps,\n} from './types';\nimport { isSelectionHelper, isPaginationHelper, isSortingHelper } from './types';\nimport type { SortDescriptor } from '../../Sorting';\n\n// ── Prop resolution helpers ──\n\ninterface ResolvedSelection {\n selected: ReadonlySet<any>;\n onToggle: (key: any) => void;\n onToggleAll: (allKeys: any[]) => void;\n}\n\nfunction resolveSelectionProp(selection: SelectionState | SelectionHelper): ResolvedSelection {\n if (isSelectionHelper(selection)) {\n return {\n selected: selection.selected,\n onToggle: (key) => selection.toggle(key),\n onToggleAll: (allKeys) => selection.toggleAll(allKeys),\n };\n }\n return {\n selected: selection.selected,\n onToggle: selection.onToggle,\n onToggleAll: (allKeys) => selection.onToggleAll(allKeys),\n };\n}\n\nfunction resolveSortProp(\n sort: readonly SortDescriptor[] | SortingHelper,\n onSort?: (key: string) => void,\n): { sorts: readonly SortDescriptor[]; onSort: ((key: string) => void) | undefined } {\n if (isSortingHelper(sort)) {\n return { sorts: sort.sorts, onSort: (key) => sort.toggle(key) };\n }\n return { sorts: sort, onSort };\n}\n\nfunction resolvePaginationProp(\n pagination: PaginationState | PaginationHelper,\n pageSize?: number,\n paginationTotal?: number,\n): PaginationInfo {\n if (isPaginationHelper(pagination)) {\n const total = paginationTotal ?? 0;\n const ps = pagination.pageSize;\n const pageCount = Math.max(1, Math.ceil(total / ps));\n const page = pagination.page;\n return {\n page,\n pageCount,\n total,\n pageSize: ps,\n hasPrev: page > 1,\n hasNext: page < pageCount,\n goToPage: (p) => pagination.setPage(p),\n goPrev: () => pagination.setPage(page - 1),\n goNext: () => pagination.setPage(page + 1),\n };\n }\n const total = pagination.total;\n const ps = pageSize ?? 10;\n const pageCount = Math.max(1, Math.ceil(total / ps));\n const page = pagination.page;\n return {\n page,\n pageCount,\n total,\n pageSize: ps,\n hasPrev: page > 1,\n hasNext: page < pageCount,\n goToPage: pagination.onPageChange,\n goPrev: () => pagination.onPageChange(page - 1),\n goNext: () => pagination.onPageChange(page + 1),\n };\n}\n\n/** Props for the DataTable headless component. */\nexport interface DataTableProps<T> extends AsyncStateProps {\n items: T[];\n columns: Column<T>[];\n keyOf?: (item: T) => string | number;\n pageSize?: number;\n\n // Controlled state — accepts object-literal OR helper instance\n sort?: readonly SortDescriptor[] | SortingHelper;\n onSort?: (key: string) => void;\n selection?: SelectionState | SelectionHelper;\n pagination?: PaginationState | PaginationHelper;\n paginationTotal?: number;\n\n // Render slots\n renderEmpty?: () => ReactNode;\n renderLoading?: () => ReactNode;\n renderError?: (error: string) => ReactNode;\n renderSortIndicator?: (props: SortHeaderProps) => ReactNode;\n renderRow?: (item: T, index: number, defaultCells: ReactNode) => ReactNode;\n renderPagination?: (info: PaginationInfo) => ReactNode;\n\n className?: string;\n 'aria-label'?: string;\n}\n\nconst defaultKeyOf = (item: any) => item.id;\n\nfunction getAriaSortValue(key: string, sorts: readonly SortDescriptor[] | undefined): 'ascending' | 'descending' | 'none' {\n if (!sorts) return 'none';\n const desc = sorts.find(s => s.key === key);\n if (!desc) return 'none';\n return desc.direction === 'asc' ? 'ascending' : 'descending';\n}\n\n/**\n * Headless data table with sort headers, selection checkboxes, and pagination slots.\n * Renders semantic HTML (`<table>`) with data attributes for styling.\n * Accepts Sorting/Selection/Pagination helpers directly via duck-typing.\n */\nexport function DataTable<T>({\n items,\n columns,\n keyOf = defaultKeyOf,\n pageSize,\n sort,\n onSort,\n selection,\n loading,\n error,\n pagination,\n paginationTotal,\n renderEmpty,\n renderLoading,\n renderError,\n renderSortIndicator,\n renderRow,\n renderPagination,\n className,\n 'aria-label': ariaLabel,\n}: DataTableProps<T>) {\n if (loading && renderLoading) return <>{renderLoading()}</>;\n if (error && renderError) return <>{renderError(error)}</>;\n if (items.length === 0 && renderEmpty) return <>{renderEmpty()}</>;\n\n // ── Resolve props ──\n const resolvedSelection = selection ? resolveSelectionProp(selection) : undefined;\n\n let resolvedSorts: readonly SortDescriptor[] | undefined;\n let resolvedOnSort: ((key: string) => void) | undefined;\n if (sort) {\n const resolved = resolveSortProp(sort, onSort);\n resolvedSorts = resolved.sorts;\n resolvedOnSort = resolved.onSort;\n }\n\n let displayItems = items;\n let paginationInfo: PaginationInfo | undefined;\n if (pagination) {\n paginationInfo = resolvePaginationProp(pagination, pageSize, paginationTotal);\n } else if (pageSize && !pagination) {\n displayItems = items.slice(0, pageSize);\n }\n\n // Selection: check indeterminate state\n const allKeys = resolvedSelection ? displayItems.map(item => keyOf(item)) : [];\n const allSelected = resolvedSelection && allKeys.length > 0 && allKeys.every(k => resolvedSelection!.selected.has(k));\n const someSelected = resolvedSelection && allKeys.some(k => resolvedSelection!.selected.has(k));\n\n return (\n <div data-component=\"data-table\" className={className}>\n <table role=\"grid\" aria-label={ariaLabel}>\n <thead>\n <tr>\n {resolvedSelection && (\n <th data-column=\"select\">\n <input\n type=\"checkbox\"\n checked={!!allSelected}\n ref={(el) => {\n if (el) el.indeterminate = !!someSelected && !allSelected;\n }}\n onChange={() => resolvedSelection!.onToggleAll(allKeys)}\n aria-label=\"Select all\"\n />\n </th>\n )}\n {columns.map((col) => {\n const isSortable = col.sortable && resolvedOnSort;\n const sortDesc = resolvedSorts?.find(s => s.key === col.key);\n const isActive = !!sortDesc;\n const sortIndex = resolvedSorts ? resolvedSorts.findIndex(s => s.key === col.key) : -1;\n\n return (\n <th\n key={col.key}\n data-sortable={isSortable ? '' : undefined}\n data-sorted={isActive ? '' : undefined}\n data-align={col.align}\n style={col.width ? { width: col.width } : undefined}\n aria-sort={isSortable ? getAriaSortValue(col.key, resolvedSorts) : undefined}\n >\n {isSortable ? (\n <button type=\"button\" onClick={() => resolvedOnSort!(col.key)}>\n {col.header}\n {renderSortIndicator?.({\n active: isActive,\n direction: sortDesc?.direction ?? 'asc',\n index: sortIndex,\n onToggle: () => resolvedOnSort!(col.key),\n })}\n </button>\n ) : (\n col.header\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {displayItems.map((item, index) => {\n const key = keyOf(item);\n const isSelected = resolvedSelection?.selected.has(key);\n\n const cells = (\n <>\n {resolvedSelection && (\n <td data-column=\"select\">\n <input\n type=\"checkbox\"\n checked={!!isSelected}\n onChange={() => resolvedSelection!.onToggle(key)}\n aria-label={`Select row ${key}`}\n />\n </td>\n )}\n {columns.map((col) => (\n <td\n key={col.key}\n data-align={col.align}\n >\n {col.render(item, index)}\n </td>\n ))}\n </>\n );\n\n return (\n <tr key={key} data-selected={isSelected ? '' : undefined}>\n {renderRow ? renderRow(item, index, cells) : cells}\n </tr>\n );\n })}\n </tbody>\n </table>\n {paginationInfo && renderPagination?.(paginationInfo)}\n </div>\n );\n}\n"],"names":["isSelectionHelper","isSortingHelper","isPaginationHelper","total","ps","pageCount","page","jsx","Fragment","jsxs"],"mappings":";;;;AAuBA,SAAS,qBAAqB,WAAgE;AAC5F,MAAIA,MAAAA,kBAAkB,SAAS,GAAG;AAChC,WAAO;AAAA,MACL,UAAU,UAAU;AAAA,MACpB,UAAU,CAAC,QAAQ,UAAU,OAAO,GAAG;AAAA,MACvC,aAAa,CAAC,YAAY,UAAU,UAAU,OAAO;AAAA,IAAA;AAAA,EAEzD;AACA,SAAO;AAAA,IACL,UAAU,UAAU;AAAA,IACpB,UAAU,UAAU;AAAA,IACpB,aAAa,CAAC,YAAY,UAAU,YAAY,OAAO;AAAA,EAAA;AAE3D;AAEA,SAAS,gBACP,MACA,QACmF;AACnF,MAAIC,MAAAA,gBAAgB,IAAI,GAAG;AACzB,WAAO,EAAE,OAAO,KAAK,OAAO,QAAQ,CAAC,QAAQ,KAAK,OAAO,GAAG,EAAA;AAAA,EAC9D;AACA,SAAO,EAAE,OAAO,MAAM,OAAA;AACxB;AAEA,SAAS,sBACP,YACA,UACA,iBACgB;AAChB,MAAIC,MAAAA,mBAAmB,UAAU,GAAG;AAClC,UAAMC,SAAQ,mBAAmB;AACjC,UAAMC,MAAK,WAAW;AACtB,UAAMC,aAAY,KAAK,IAAI,GAAG,KAAK,KAAKF,SAAQC,GAAE,CAAC;AACnD,UAAME,QAAO,WAAW;AACxB,WAAO;AAAA,MACL,MAAAA;AAAAA,MACA,WAAAD;AAAAA,MACA,OAAAF;AAAAA,MACA,UAAUC;AAAAA,MACV,SAASE,QAAO;AAAA,MAChB,SAASA,QAAOD;AAAAA,MAChB,UAAU,CAAC,MAAM,WAAW,QAAQ,CAAC;AAAA,MACrC,QAAQ,MAAM,WAAW,QAAQC,QAAO,CAAC;AAAA,MACzC,QAAQ,MAAM,WAAW,QAAQA,QAAO,CAAC;AAAA,IAAA;AAAA,EAE7C;AACA,QAAM,QAAQ,WAAW;AACzB,QAAM,KAAK,YAAY;AACvB,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,EAAE,CAAC;AACnD,QAAM,OAAO,WAAW;AACxB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB,UAAU,WAAW;AAAA,IACrB,QAAQ,MAAM,WAAW,aAAa,OAAO,CAAC;AAAA,IAC9C,QAAQ,MAAM,WAAW,aAAa,OAAO,CAAC;AAAA,EAAA;AAElD;AA4BA,MAAM,eAAe,CAAC,SAAc,KAAK;AAEzC,SAAS,iBAAiB,KAAa,OAAmF;AACxH,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,MAAM,KAAK,CAAA,MAAK,EAAE,QAAQ,GAAG;AAC1C,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,cAAc,QAAQ,cAAc;AAClD;AAOO,SAAS,UAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAsB;AACpB,MAAI,WAAW,cAAe,QAAOC,2BAAAA,IAAAC,WAAAA,UAAA,EAAG,2BAAgB;AACxD,MAAI,SAAS,YAAa,QAAOD,+BAAAC,WAAAA,UAAA,EAAG,UAAA,YAAY,KAAK,GAAE;AACvD,MAAI,MAAM,WAAW,KAAK,YAAa,QAAOD,+BAAAC,WAAAA,UAAA,EAAG,yBAAc;AAG/D,QAAM,oBAAoB,YAAY,qBAAqB,SAAS,IAAI;AAExE,MAAI;AACJ,MAAI;AACJ,MAAI,MAAM;AACR,UAAM,WAAW,gBAAgB,MAAM,MAAM;AAC7C,oBAAgB,SAAS;AACzB,qBAAiB,SAAS;AAAA,EAC5B;AAEA,MAAI,eAAe;AACnB,MAAI;AACJ,MAAI,YAAY;AACd,qBAAiB,sBAAsB,YAAY,UAAU,eAAe;AAAA,EAC9E,WAAW,YAAY,CAAC,YAAY;AAClC,mBAAe,MAAM,MAAM,GAAG,QAAQ;AAAA,EACxC;AAGA,QAAM,UAAU,oBAAoB,aAAa,IAAI,UAAQ,MAAM,IAAI,CAAC,IAAI,CAAA;AAC5E,QAAM,cAAc,qBAAqB,QAAQ,SAAS,KAAK,QAAQ,MAAM,CAAA,MAAK,kBAAmB,SAAS,IAAI,CAAC,CAAC;AACpH,QAAM,eAAe,qBAAqB,QAAQ,KAAK,OAAK,kBAAmB,SAAS,IAAI,CAAC,CAAC;AAE9F,SACEC,2BAAAA,KAAC,OAAA,EAAI,kBAAe,cAAa,WAC/B,UAAA;AAAA,IAAAA,2BAAAA,KAAC,SAAA,EAAM,MAAK,QAAO,cAAY,WAC7B,UAAA;AAAA,MAAAF,2BAAAA,IAAC,SAAA,EACC,0CAAC,MAAA,EACE,UAAA;AAAA,QAAA,qBACCA,2BAAAA,IAAC,MAAA,EAAG,eAAY,UACd,UAAAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,CAAC,CAAC;AAAA,YACX,KAAK,CAAC,OAAO;AACX,kBAAI,GAAI,IAAG,gBAAgB,CAAC,CAAC,gBAAgB,CAAC;AAAA,YAChD;AAAA,YACA,UAAU,MAAM,kBAAmB,YAAY,OAAO;AAAA,YACtD,cAAW;AAAA,UAAA;AAAA,QAAA,GAEf;AAAA,QAED,QAAQ,IAAI,CAAC,QAAQ;AACpB,gBAAM,aAAa,IAAI,YAAY;AACnC,gBAAM,WAAW,eAAe,KAAK,OAAK,EAAE,QAAQ,IAAI,GAAG;AAC3D,gBAAM,WAAW,CAAC,CAAC;AACnB,gBAAM,YAAY,gBAAgB,cAAc,UAAU,OAAK,EAAE,QAAQ,IAAI,GAAG,IAAI;AAEpF,iBACEA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEC,iBAAe,aAAa,KAAK;AAAA,cACjC,eAAa,WAAW,KAAK;AAAA,cAC7B,cAAY,IAAI;AAAA,cAChB,OAAO,IAAI,QAAQ,EAAE,OAAO,IAAI,UAAU;AAAA,cAC1C,aAAW,aAAa,iBAAiB,IAAI,KAAK,aAAa,IAAI;AAAA,cAElE,UAAA,aACCE,2BAAAA,KAAC,UAAA,EAAO,MAAK,UAAS,SAAS,MAAM,eAAgB,IAAI,GAAG,GACzD,UAAA;AAAA,gBAAA,IAAI;AAAA,gBACJ,sBAAsB;AAAA,kBACrB,QAAQ;AAAA,kBACR,WAAW,UAAU,aAAa;AAAA,kBAClC,OAAO;AAAA,kBACP,UAAU,MAAM,eAAgB,IAAI,GAAG;AAAA,gBAAA,CACxC;AAAA,cAAA,EAAA,CACH,IAEA,IAAI;AAAA,YAAA;AAAA,YAlBD,IAAI;AAAA,UAAA;AAAA,QAsBf,CAAC;AAAA,MAAA,EAAA,CACH,EAAA,CACF;AAAA,qCACC,SAAA,EACE,UAAA,aAAa,IAAI,CAAC,MAAM,UAAU;AACjC,cAAM,MAAM,MAAM,IAAI;AACtB,cAAM,aAAa,mBAAmB,SAAS,IAAI,GAAG;AAEtD,cAAM,QACJA,2BAAAA,KAAAD,WAAAA,UAAA,EACG,UAAA;AAAA,UAAA,qBACCD,2BAAAA,IAAC,MAAA,EAAG,eAAY,UACd,UAAAA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,CAAC,CAAC;AAAA,cACX,UAAU,MAAM,kBAAmB,SAAS,GAAG;AAAA,cAC/C,cAAY,cAAc,GAAG;AAAA,YAAA;AAAA,UAAA,GAEjC;AAAA,UAED,QAAQ,IAAI,CAAC,QACZA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEC,cAAY,IAAI;AAAA,cAEf,UAAA,IAAI,OAAO,MAAM,KAAK;AAAA,YAAA;AAAA,YAHlB,IAAI;AAAA,UAAA,CAKZ;AAAA,QAAA,GACH;AAGF,eACEA,2BAAAA,IAAC,MAAA,EAAa,iBAAe,aAAa,KAAK,QAC5C,UAAA,YAAY,UAAU,MAAM,OAAO,KAAK,IAAI,SADtC,GAET;AAAA,MAEJ,CAAC,EAAA,CACH;AAAA,IAAA,GACF;AAAA,IACC,kBAAkB,mBAAmB,cAAc;AAAA,EAAA,GACtD;AAEJ;;"}
@@ -0,0 +1,30 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { Column, SortHeaderProps, SelectionState, SelectionHelper, PaginationState, PaginationHelper, PaginationInfo, SortingHelper, AsyncStateProps } from './types';
3
+ import type { SortDescriptor } from '../../Sorting';
4
+ /** Props for the DataTable headless component. */
5
+ export interface DataTableProps<T> extends AsyncStateProps {
6
+ items: T[];
7
+ columns: Column<T>[];
8
+ keyOf?: (item: T) => string | number;
9
+ pageSize?: number;
10
+ sort?: readonly SortDescriptor[] | SortingHelper;
11
+ onSort?: (key: string) => void;
12
+ selection?: SelectionState | SelectionHelper;
13
+ pagination?: PaginationState | PaginationHelper;
14
+ paginationTotal?: number;
15
+ renderEmpty?: () => ReactNode;
16
+ renderLoading?: () => ReactNode;
17
+ renderError?: (error: string) => ReactNode;
18
+ renderSortIndicator?: (props: SortHeaderProps) => ReactNode;
19
+ renderRow?: (item: T, index: number, defaultCells: ReactNode) => ReactNode;
20
+ renderPagination?: (info: PaginationInfo) => ReactNode;
21
+ className?: string;
22
+ 'aria-label'?: string;
23
+ }
24
+ /**
25
+ * Headless data table with sort headers, selection checkboxes, and pagination slots.
26
+ * Renders semantic HTML (`<table>`) with data attributes for styling.
27
+ * Accepts Sorting/Selection/Pagination helpers directly via duck-typing.
28
+ */
29
+ export declare function DataTable<T>({ items, columns, keyOf, pageSize, sort, onSort, selection, loading, error, pagination, paginationTotal, renderEmpty, renderLoading, renderError, renderSortIndicator, renderRow, renderPagination, className, 'aria-label': ariaLabel, }: DataTableProps<T>): import("react/jsx-runtime").JSX.Element;
30
+ //# sourceMappingURL=DataTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/react/components/DataTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EACV,MAAM,EACN,eAAe,EACf,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AA0EpD,kDAAkD;AAClD,MAAM,WAAW,cAAc,CAAC,CAAC,CAAE,SAAQ,eAAe;IACxD,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,IAAI,CAAC,EAAE,SAAS,cAAc,EAAE,GAAG,aAAa,CAAC;IACjD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,cAAc,GAAG,eAAe,CAAC;IAC7C,UAAU,CAAC,EAAE,eAAe,GAAG,gBAAgB,CAAC;IAChD,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,WAAW,CAAC,EAAE,MAAM,SAAS,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,SAAS,CAAC;IAChC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IAC3C,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,SAAS,CAAC;IAC5D,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,KAAK,SAAS,CAAC;IAC3E,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,SAAS,CAAC;IAEvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAWD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,EAC3B,KAAK,EACL,OAAO,EACP,KAAoB,EACpB,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,SAAS,EACT,OAAO,EACP,KAAK,EACL,UAAU,EACV,eAAe,EACf,WAAW,EACX,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,YAAY,EAAE,SAAS,GACxB,EAAE,cAAc,CAAC,CAAC,CAAC,2CAuHnB"}