mvc-kit 2.12.5 → 2.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/BEST_PRACTICES.md +1390 -0
  2. package/agent-config/bin/postinstall.mjs +4 -3
  3. package/agent-config/bin/setup.mjs +5 -1
  4. package/agent-config/claude-code/agents/mvc-kit-architect.md +16 -8
  5. package/agent-config/claude-code/skills/guide/SKILL.md +29 -7
  6. package/agent-config/claude-code/skills/guide/patterns.md +12 -0
  7. package/agent-config/claude-code/skills/guide/recipes.md +510 -0
  8. package/agent-config/claude-code/skills/guide/testing.md +297 -0
  9. package/agent-config/claude-code/skills/review/SKILL.md +3 -13
  10. package/agent-config/claude-code/skills/review/checklist.md +30 -5
  11. package/agent-config/claude-code/skills/scaffold/SKILL.md +4 -13
  12. package/agent-config/lib/install-claude.mjs +90 -25
  13. package/dist/Channel.cjs +276 -300
  14. package/dist/Channel.cjs.map +1 -1
  15. package/dist/Channel.js +275 -299
  16. package/dist/Channel.js.map +1 -1
  17. package/dist/Collection.cjs +424 -504
  18. package/dist/Collection.cjs.map +1 -1
  19. package/dist/Collection.js +423 -503
  20. package/dist/Collection.js.map +1 -1
  21. package/dist/Controller.cjs +70 -67
  22. package/dist/Controller.cjs.map +1 -1
  23. package/dist/Controller.js +69 -66
  24. package/dist/Controller.js.map +1 -1
  25. package/dist/EventBus.cjs +77 -88
  26. package/dist/EventBus.cjs.map +1 -1
  27. package/dist/EventBus.js +76 -87
  28. package/dist/EventBus.js.map +1 -1
  29. package/dist/Feed.cjs +81 -77
  30. package/dist/Feed.cjs.map +1 -1
  31. package/dist/Feed.js +80 -76
  32. package/dist/Feed.js.map +1 -1
  33. package/dist/Model.cjs +181 -207
  34. package/dist/Model.cjs.map +1 -1
  35. package/dist/Model.js +179 -205
  36. package/dist/Model.js.map +1 -1
  37. package/dist/Pagination.cjs +75 -73
  38. package/dist/Pagination.cjs.map +1 -1
  39. package/dist/Pagination.js +74 -72
  40. package/dist/Pagination.js.map +1 -1
  41. package/dist/Pending.cjs +255 -287
  42. package/dist/Pending.cjs.map +1 -1
  43. package/dist/Pending.js +253 -285
  44. package/dist/Pending.js.map +1 -1
  45. package/dist/PersistentCollection.cjs +242 -285
  46. package/dist/PersistentCollection.cjs.map +1 -1
  47. package/dist/PersistentCollection.js +241 -284
  48. package/dist/PersistentCollection.js.map +1 -1
  49. package/dist/Resource.cjs +166 -174
  50. package/dist/Resource.cjs.map +1 -1
  51. package/dist/Resource.js +164 -172
  52. package/dist/Resource.js.map +1 -1
  53. package/dist/Selection.cjs +84 -94
  54. package/dist/Selection.cjs.map +1 -1
  55. package/dist/Selection.js +83 -93
  56. package/dist/Selection.js.map +1 -1
  57. package/dist/Service.cjs +54 -55
  58. package/dist/Service.cjs.map +1 -1
  59. package/dist/Service.js +53 -54
  60. package/dist/Service.js.map +1 -1
  61. package/dist/Sorting.cjs +102 -101
  62. package/dist/Sorting.cjs.map +1 -1
  63. package/dist/Sorting.js +102 -101
  64. package/dist/Sorting.js.map +1 -1
  65. package/dist/Trackable.cjs +112 -80
  66. package/dist/Trackable.cjs.map +1 -1
  67. package/dist/Trackable.js +111 -79
  68. package/dist/Trackable.js.map +1 -1
  69. package/dist/ViewModel.cjs +528 -576
  70. package/dist/ViewModel.cjs.map +1 -1
  71. package/dist/ViewModel.js +525 -573
  72. package/dist/ViewModel.js.map +1 -1
  73. package/dist/bindPublicMethods.cjs +43 -24
  74. package/dist/bindPublicMethods.cjs.map +1 -1
  75. package/dist/bindPublicMethods.js +43 -24
  76. package/dist/bindPublicMethods.js.map +1 -1
  77. package/dist/errors.cjs +67 -68
  78. package/dist/errors.cjs.map +1 -1
  79. package/dist/errors.js +68 -71
  80. package/dist/errors.js.map +1 -1
  81. package/dist/mvc-kit.cjs +44 -46
  82. package/dist/mvc-kit.js +5 -32
  83. package/dist/produceDraft.cjs +105 -95
  84. package/dist/produceDraft.cjs.map +1 -1
  85. package/dist/produceDraft.js +106 -97
  86. package/dist/produceDraft.js.map +1 -1
  87. package/dist/react/components/CardList.cjs +30 -40
  88. package/dist/react/components/CardList.cjs.map +1 -1
  89. package/dist/react/components/CardList.js +31 -41
  90. package/dist/react/components/CardList.js.map +1 -1
  91. package/dist/react/components/DataTable.cjs +146 -169
  92. package/dist/react/components/DataTable.cjs.map +1 -1
  93. package/dist/react/components/DataTable.js +147 -170
  94. package/dist/react/components/DataTable.js.map +1 -1
  95. package/dist/react/components/InfiniteScroll.cjs +51 -42
  96. package/dist/react/components/InfiniteScroll.cjs.map +1 -1
  97. package/dist/react/components/InfiniteScroll.js +52 -43
  98. package/dist/react/components/InfiniteScroll.js.map +1 -1
  99. package/dist/react/components/types.cjs +10 -6
  100. package/dist/react/components/types.cjs.map +1 -1
  101. package/dist/react/components/types.js +11 -9
  102. package/dist/react/components/types.js.map +1 -1
  103. package/dist/react/guards.cjs +10 -6
  104. package/dist/react/guards.cjs.map +1 -1
  105. package/dist/react/guards.js +11 -9
  106. package/dist/react/guards.js.map +1 -1
  107. package/dist/react/provider.cjs +23 -20
  108. package/dist/react/provider.cjs.map +1 -1
  109. package/dist/react/provider.js +23 -21
  110. package/dist/react/provider.js.map +1 -1
  111. package/dist/react/use-event-bus.cjs +24 -20
  112. package/dist/react/use-event-bus.cjs.map +1 -1
  113. package/dist/react/use-event-bus.js +24 -21
  114. package/dist/react/use-event-bus.js.map +1 -1
  115. package/dist/react/use-instance.cjs +43 -36
  116. package/dist/react/use-instance.cjs.map +1 -1
  117. package/dist/react/use-instance.js +43 -36
  118. package/dist/react/use-instance.js.map +1 -1
  119. package/dist/react/use-local.cjs +48 -64
  120. package/dist/react/use-local.cjs.map +1 -1
  121. package/dist/react/use-local.js +47 -63
  122. package/dist/react/use-local.js.map +1 -1
  123. package/dist/react/use-model.cjs +84 -98
  124. package/dist/react/use-model.cjs.map +1 -1
  125. package/dist/react/use-model.js +84 -100
  126. package/dist/react/use-model.js.map +1 -1
  127. package/dist/react/use-singleton.cjs +19 -23
  128. package/dist/react/use-singleton.cjs.map +1 -1
  129. package/dist/react/use-singleton.js +16 -20
  130. package/dist/react/use-singleton.js.map +1 -1
  131. package/dist/react/use-subscribe-only.cjs +28 -22
  132. package/dist/react/use-subscribe-only.cjs.map +1 -1
  133. package/dist/react/use-subscribe-only.js +28 -22
  134. package/dist/react/use-subscribe-only.js.map +1 -1
  135. package/dist/react/use-teardown.cjs +20 -19
  136. package/dist/react/use-teardown.cjs.map +1 -1
  137. package/dist/react/use-teardown.js +20 -19
  138. package/dist/react/use-teardown.js.map +1 -1
  139. package/dist/react-native/NativeCollection.cjs +98 -78
  140. package/dist/react-native/NativeCollection.cjs.map +1 -1
  141. package/dist/react-native/NativeCollection.js +97 -77
  142. package/dist/react-native/NativeCollection.js.map +1 -1
  143. package/dist/react-native.cjs +2 -4
  144. package/dist/react-native.js +1 -4
  145. package/dist/react.cjs +24 -26
  146. package/dist/react.js +1 -17
  147. package/dist/singleton.cjs +28 -22
  148. package/dist/singleton.cjs.map +1 -1
  149. package/dist/singleton.js +29 -26
  150. package/dist/singleton.js.map +1 -1
  151. package/dist/walkPrototypeChain.cjs +20 -12
  152. package/dist/walkPrototypeChain.cjs.map +1 -1
  153. package/dist/walkPrototypeChain.js +21 -13
  154. package/dist/walkPrototypeChain.js.map +1 -1
  155. package/dist/web/IndexedDBCollection.cjs +53 -36
  156. package/dist/web/IndexedDBCollection.cjs.map +1 -1
  157. package/dist/web/IndexedDBCollection.js +52 -35
  158. package/dist/web/IndexedDBCollection.js.map +1 -1
  159. package/dist/web/WebStorageCollection.cjs +82 -84
  160. package/dist/web/WebStorageCollection.cjs.map +1 -1
  161. package/dist/web/WebStorageCollection.js +81 -83
  162. package/dist/web/WebStorageCollection.js.map +1 -1
  163. package/dist/web/idb.cjs +107 -99
  164. package/dist/web/idb.cjs.map +1 -1
  165. package/dist/web/idb.js +108 -105
  166. package/dist/web/idb.js.map +1 -1
  167. package/dist/web.cjs +4 -6
  168. package/dist/web.js +1 -5
  169. package/dist/wrapAsyncMethods.cjs +141 -168
  170. package/dist/wrapAsyncMethods.cjs.map +1 -1
  171. package/dist/wrapAsyncMethods.js +141 -168
  172. package/dist/wrapAsyncMethods.js.map +1 -1
  173. package/examples/primitive/channel.ts +109 -0
  174. package/examples/primitive/collection.ts +118 -0
  175. package/examples/primitive/controller.ts +118 -0
  176. package/examples/primitive/counter.ts +108 -0
  177. package/examples/primitive/env.d.ts +1 -0
  178. package/examples/primitive/eventbus.ts +77 -0
  179. package/examples/primitive/feed.ts +162 -0
  180. package/examples/primitive/model.ts +82 -0
  181. package/examples/primitive/pagination.ts +91 -0
  182. package/examples/primitive/pending.ts +189 -0
  183. package/examples/primitive/persistent-collection.ts +116 -0
  184. package/examples/primitive/resource.ts +114 -0
  185. package/examples/primitive/selection.ts +96 -0
  186. package/examples/primitive/sorting.ts +112 -0
  187. package/examples/primitive/timer.ts +58 -0
  188. package/examples/primitive/trackable.ts +225 -0
  189. package/examples/primitive/tsconfig.json +20 -0
  190. package/examples/primitive/viewmodel-service.ts +161 -0
  191. package/examples/react/AuthExample/index.html +12 -0
  192. package/examples/react/AuthExample/src/App.tsx +29 -0
  193. package/examples/react/AuthExample/src/components/AdminPage.tsx +51 -0
  194. package/examples/react/AuthExample/src/components/AppHeader.tsx +32 -0
  195. package/examples/react/AuthExample/src/components/AuthGuard.tsx +50 -0
  196. package/examples/react/AuthExample/src/components/AuthScreen.tsx +181 -0
  197. package/examples/react/AuthExample/src/components/DashboardPage.tsx +41 -0
  198. package/examples/react/AuthExample/src/components/ProfilePage.tsx +44 -0
  199. package/examples/react/AuthExample/src/components/Toast.tsx +41 -0
  200. package/examples/react/AuthExample/src/env.d.ts +10 -0
  201. package/examples/react/AuthExample/src/events/AppEventBus.ts +7 -0
  202. package/examples/react/AuthExample/src/main.tsx +10 -0
  203. package/examples/react/AuthExample/src/mock/api.ts +78 -0
  204. package/examples/react/AuthExample/src/models/LoginFormModel.ts +19 -0
  205. package/examples/react/AuthExample/src/models/RegisterFormModel.ts +25 -0
  206. package/examples/react/AuthExample/src/services/AuthService.ts +21 -0
  207. package/examples/react/AuthExample/src/styles.css +445 -0
  208. package/examples/react/AuthExample/src/types/auth.ts +12 -0
  209. package/examples/react/AuthExample/src/viewmodels/AuthViewModel.ts +111 -0
  210. package/examples/react/AuthExample/tsconfig.json +22 -0
  211. package/examples/react/AuthExample/vite.config.ts +18 -0
  212. package/examples/react/ComplexApp/index.html +12 -0
  213. package/examples/react/ComplexApp/src/App.tsx +17 -0
  214. package/examples/react/ComplexApp/src/channels/ActivityChannel.ts +24 -0
  215. package/examples/react/ComplexApp/src/channels/DashboardChannel.ts +26 -0
  216. package/examples/react/ComplexApp/src/channels/ErrorsChannel.ts +5 -0
  217. package/examples/react/ComplexApp/src/channels/LatencyChannel.ts +5 -0
  218. package/examples/react/ComplexApp/src/channels/OrdersChannel.ts +5 -0
  219. package/examples/react/ComplexApp/src/channels/RevenueChannel.ts +5 -0
  220. package/examples/react/ComplexApp/src/channels/TrafficChannel.ts +5 -0
  221. package/examples/react/ComplexApp/src/channels/UsersMetricChannel.ts +5 -0
  222. package/examples/react/ComplexApp/src/collections/DashboardCollection.ts +6 -0
  223. package/examples/react/ComplexApp/src/collections/ErrorsCollection.ts +3 -0
  224. package/examples/react/ComplexApp/src/collections/LatencyCollection.ts +3 -0
  225. package/examples/react/ComplexApp/src/collections/OrdersCollection.ts +3 -0
  226. package/examples/react/ComplexApp/src/collections/RevenueCollection.ts +3 -0
  227. package/examples/react/ComplexApp/src/collections/TrafficCollection.ts +3 -0
  228. package/examples/react/ComplexApp/src/collections/UsersMetricCollection.ts +3 -0
  229. package/examples/react/ComplexApp/src/components/activity/ActivityFeed.tsx +31 -0
  230. package/examples/react/ComplexApp/src/components/activity/ActivityItemRow.tsx +35 -0
  231. package/examples/react/ComplexApp/src/components/dashboard/DashboardCard.tsx +37 -0
  232. package/examples/react/ComplexApp/src/components/dashboard/DashboardPage.tsx +34 -0
  233. package/examples/react/ComplexApp/src/components/layout/Navbar.tsx +32 -0
  234. package/examples/react/ComplexApp/src/components/layout/SocialFeedPanel.tsx +57 -0
  235. package/examples/react/ComplexApp/src/components/shared/Spinner.tsx +3 -0
  236. package/examples/react/ComplexApp/src/components/shared/StatusIndicator.tsx +13 -0
  237. package/examples/react/ComplexApp/src/components/shared/Toast.tsx +40 -0
  238. package/examples/react/ComplexApp/src/env.d.ts +10 -0
  239. package/examples/react/ComplexApp/src/events/AppEventBus.ts +7 -0
  240. package/examples/react/ComplexApp/src/main.tsx +10 -0
  241. package/examples/react/ComplexApp/src/mock-remote/MockWebSocket.ts +38 -0
  242. package/examples/react/ComplexApp/src/mock-remote/activity-api.ts +48 -0
  243. package/examples/react/ComplexApp/src/mock-remote/dashboard-generators.ts +45 -0
  244. package/examples/react/ComplexApp/src/mock-remote/delay.ts +18 -0
  245. package/examples/react/ComplexApp/src/mock-remote/social-api.ts +55 -0
  246. package/examples/react/ComplexApp/src/resources/ActivityResource.ts +12 -0
  247. package/examples/react/ComplexApp/src/resources/SocialFeedResource.ts +17 -0
  248. package/examples/react/ComplexApp/src/styles.css +463 -0
  249. package/examples/react/ComplexApp/src/types/activity.ts +8 -0
  250. package/examples/react/ComplexApp/src/types/dashboard.ts +5 -0
  251. package/examples/react/ComplexApp/src/types/social.ts +8 -0
  252. package/examples/react/ComplexApp/src/types/users.ts +6 -0
  253. package/examples/react/ComplexApp/src/viewmodels/ActivityFeedViewModel.ts +68 -0
  254. package/examples/react/ComplexApp/src/viewmodels/AppStateViewModel.ts +26 -0
  255. package/examples/react/ComplexApp/src/viewmodels/DashboardCardViewModel.ts +69 -0
  256. package/examples/react/ComplexApp/src/viewmodels/ErrorsCardViewModel.ts +9 -0
  257. package/examples/react/ComplexApp/src/viewmodels/LatencyCardViewModel.ts +9 -0
  258. package/examples/react/ComplexApp/src/viewmodels/OrdersCardViewModel.ts +9 -0
  259. package/examples/react/ComplexApp/src/viewmodels/RevenueCardViewModel.ts +9 -0
  260. package/examples/react/ComplexApp/src/viewmodels/SocialFeedViewModel.ts +39 -0
  261. package/examples/react/ComplexApp/src/viewmodels/TrafficCardViewModel.ts +9 -0
  262. package/examples/react/ComplexApp/src/viewmodels/UsersMetricCardViewModel.ts +9 -0
  263. package/examples/react/ComplexApp/tsconfig.json +22 -0
  264. package/examples/react/ComplexApp/vite.config.ts +18 -0
  265. package/examples/react/FullApp/index.html +12 -0
  266. package/examples/react/FullApp/src/App.tsx +28 -0
  267. package/examples/react/FullApp/src/collections/ConversationsCollection.ts +4 -0
  268. package/examples/react/FullApp/src/collections/LocationsCollection.ts +4 -0
  269. package/examples/react/FullApp/src/components/auth/LoginPage.tsx +80 -0
  270. package/examples/react/FullApp/src/components/dashboard/DashboardPage.tsx +29 -0
  271. package/examples/react/FullApp/src/components/dashboard/RecentActivityCard.tsx +35 -0
  272. package/examples/react/FullApp/src/components/dashboard/StatsCard.tsx +19 -0
  273. package/examples/react/FullApp/src/components/layout/AppShell.tsx +31 -0
  274. package/examples/react/FullApp/src/components/layout/Header.tsx +25 -0
  275. package/examples/react/FullApp/src/components/layout/Sidebar.tsx +29 -0
  276. package/examples/react/FullApp/src/components/locations/LocationFilters.tsx +60 -0
  277. package/examples/react/FullApp/src/components/locations/LocationForm.tsx +112 -0
  278. package/examples/react/FullApp/src/components/locations/LocationProfilePage.tsx +81 -0
  279. package/examples/react/FullApp/src/components/locations/LocationsPage.tsx +127 -0
  280. package/examples/react/FullApp/src/components/messaging/ConversationList.tsx +59 -0
  281. package/examples/react/FullApp/src/components/messaging/MessageBubble.tsx +22 -0
  282. package/examples/react/FullApp/src/components/messaging/MessageThread.tsx +100 -0
  283. package/examples/react/FullApp/src/components/messaging/MessagingPage.tsx +52 -0
  284. package/examples/react/FullApp/src/components/shared/ErrorBanner.tsx +3 -0
  285. package/examples/react/FullApp/src/components/shared/Spinner.tsx +7 -0
  286. package/examples/react/FullApp/src/components/shared/Toast.tsx +41 -0
  287. package/examples/react/FullApp/src/components/users/UserFilters.tsx +59 -0
  288. package/examples/react/FullApp/src/components/users/UsersPage.tsx +80 -0
  289. package/examples/react/FullApp/src/components/users/UsersTable.tsx +52 -0
  290. package/examples/react/FullApp/src/env.d.ts +10 -0
  291. package/examples/react/FullApp/src/events/AppEventBus.ts +7 -0
  292. package/examples/react/FullApp/src/main.tsx +10 -0
  293. package/examples/react/FullApp/src/mock/delay.ts +21 -0
  294. package/examples/react/FullApp/src/mock/locations.ts +76 -0
  295. package/examples/react/FullApp/src/mock/messages.ts +237 -0
  296. package/examples/react/FullApp/src/mock/users.ts +84 -0
  297. package/examples/react/FullApp/src/models/LocationFormModel.ts +31 -0
  298. package/examples/react/FullApp/src/models/LoginFormModel.ts +19 -0
  299. package/examples/react/FullApp/src/resources/UsersResource.ts +12 -0
  300. package/examples/react/FullApp/src/services/AuthService.ts +18 -0
  301. package/examples/react/FullApp/src/services/LocationService.ts +23 -0
  302. package/examples/react/FullApp/src/services/MessageService.ts +65 -0
  303. package/examples/react/FullApp/src/services/UserService.ts +23 -0
  304. package/examples/react/FullApp/src/styles.css +767 -0
  305. package/examples/react/FullApp/src/types/conversation.ts +7 -0
  306. package/examples/react/FullApp/src/types/location.ts +12 -0
  307. package/examples/react/FullApp/src/types/message.ts +7 -0
  308. package/examples/react/FullApp/src/types/user.ts +10 -0
  309. package/examples/react/FullApp/src/viewmodels/AuthViewModel.ts +51 -0
  310. package/examples/react/FullApp/src/viewmodels/ConversationsViewModel.ts +89 -0
  311. package/examples/react/FullApp/src/viewmodels/DashboardViewModel.ts +56 -0
  312. package/examples/react/FullApp/src/viewmodels/LocationProfileViewModel.ts +81 -0
  313. package/examples/react/FullApp/src/viewmodels/LocationsViewModel.ts +113 -0
  314. package/examples/react/FullApp/src/viewmodels/MessageThreadViewModel.ts +83 -0
  315. package/examples/react/FullApp/src/viewmodels/UsersViewModel.ts +88 -0
  316. package/examples/react/FullApp/tsconfig.json +22 -0
  317. package/examples/react/FullApp/vite.config.ts +18 -0
  318. package/examples/react/WorkerApp/index.html +12 -0
  319. package/examples/react/WorkerApp/src/App.tsx +24 -0
  320. package/examples/react/WorkerApp/src/channels/MessagingChannel.ts +46 -0
  321. package/examples/react/WorkerApp/src/channels/WorkerStatusChannel.ts +35 -0
  322. package/examples/react/WorkerApp/src/components/auth/LoginPage.tsx +60 -0
  323. package/examples/react/WorkerApp/src/components/layout/AppShell.tsx +31 -0
  324. package/examples/react/WorkerApp/src/components/layout/Header.tsx +23 -0
  325. package/examples/react/WorkerApp/src/components/layout/Sidebar.tsx +28 -0
  326. package/examples/react/WorkerApp/src/components/messaging/ComposeBar.tsx +33 -0
  327. package/examples/react/WorkerApp/src/components/messaging/ConversationList.tsx +59 -0
  328. package/examples/react/WorkerApp/src/components/messaging/MessageBubble.tsx +45 -0
  329. package/examples/react/WorkerApp/src/components/messaging/MessageThread.tsx +93 -0
  330. package/examples/react/WorkerApp/src/components/messaging/MessagingPage.tsx +53 -0
  331. package/examples/react/WorkerApp/src/components/shared/ErrorBanner.tsx +3 -0
  332. package/examples/react/WorkerApp/src/components/shared/PendingBanner.tsx +37 -0
  333. package/examples/react/WorkerApp/src/components/shared/Spinner.tsx +7 -0
  334. package/examples/react/WorkerApp/src/components/shared/Toast.tsx +41 -0
  335. package/examples/react/WorkerApp/src/components/shift/ShiftPage.tsx +98 -0
  336. package/examples/react/WorkerApp/src/components/shift/ShiftTimer.tsx +24 -0
  337. package/examples/react/WorkerApp/src/components/shift/SiteSelector.tsx +27 -0
  338. package/examples/react/WorkerApp/src/components/sites/SiteFilters.tsx +61 -0
  339. package/examples/react/WorkerApp/src/components/sites/SitesPage.tsx +102 -0
  340. package/examples/react/WorkerApp/src/env.d.ts +10 -0
  341. package/examples/react/WorkerApp/src/events/AppEventBus.ts +7 -0
  342. package/examples/react/WorkerApp/src/main.tsx +10 -0
  343. package/examples/react/WorkerApp/src/mock/MockWebSocket.ts +38 -0
  344. package/examples/react/WorkerApp/src/mock/delay.ts +31 -0
  345. package/examples/react/WorkerApp/src/mock/messages.ts +120 -0
  346. package/examples/react/WorkerApp/src/mock/shifts.ts +57 -0
  347. package/examples/react/WorkerApp/src/mock/sites.ts +14 -0
  348. package/examples/react/WorkerApp/src/mock/workers.ts +12 -0
  349. package/examples/react/WorkerApp/src/models/ComposeMessageModel.ts +17 -0
  350. package/examples/react/WorkerApp/src/resources/ConversationsResource.ts +10 -0
  351. package/examples/react/WorkerApp/src/resources/MessagesResource.ts +32 -0
  352. package/examples/react/WorkerApp/src/resources/ShiftResource.ts +73 -0
  353. package/examples/react/WorkerApp/src/resources/SitesResource.ts +11 -0
  354. package/examples/react/WorkerApp/src/resources/WorkersResource.ts +11 -0
  355. package/examples/react/WorkerApp/src/styles.css +756 -0
  356. package/examples/react/WorkerApp/src/types/conversation.ts +7 -0
  357. package/examples/react/WorkerApp/src/types/message.ts +7 -0
  358. package/examples/react/WorkerApp/src/types/shift.ts +13 -0
  359. package/examples/react/WorkerApp/src/types/site.ts +8 -0
  360. package/examples/react/WorkerApp/src/types/worker.ts +8 -0
  361. package/examples/react/WorkerApp/src/viewmodels/AuthViewModel.ts +41 -0
  362. package/examples/react/WorkerApp/src/viewmodels/ConversationsViewModel.ts +83 -0
  363. package/examples/react/WorkerApp/src/viewmodels/MessageThreadViewModel.ts +113 -0
  364. package/examples/react/WorkerApp/src/viewmodels/ShiftViewModel.ts +147 -0
  365. package/examples/react/WorkerApp/src/viewmodels/SitesViewModel.ts +82 -0
  366. package/examples/react/WorkerApp/tsconfig.json +22 -0
  367. package/examples/react/WorkerApp/vite.config.ts +18 -0
  368. package/package.json +11 -9
  369. package/src/Pending.test.ts +1 -2
  370. package/src/Sorting.test.ts +1 -1
  371. package/src/produceDraft.test.ts +3 -3
  372. package/src/react/components/CardList.test.tsx +1 -1
  373. package/src/react/components/DataTable.test.tsx +1 -1
  374. package/src/react/components/InfiniteScroll.test.tsx +5 -5
  375. package/dist/mvc-kit.cjs.map +0 -1
  376. package/dist/mvc-kit.js.map +0 -1
  377. package/dist/react-native.cjs.map +0 -1
  378. package/dist/react-native.js.map +0 -1
  379. package/dist/react.cjs.map +0 -1
  380. package/dist/react.js.map +0 -1
  381. package/dist/web.cjs.map +0 -1
  382. package/dist/web.js.map +0 -1
@@ -1,105 +1,114 @@
1
- const __DEV__ = typeof __MVC_KIT_DEV__ !== "undefined" && __MVC_KIT_DEV__;
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
- if (value === null || typeof value !== "object") return false;
4
- const proto = Object.getPrototypeOf(value);
5
- return proto === Object.prototype || proto === null;
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
- let copy = null;
9
- const children = /* @__PURE__ */ new Map();
10
- function ensureCopy() {
11
- if (!copy) copy = { ...original };
12
- return copy;
13
- }
14
- const proxy = new Proxy({}, {
15
- get(_, prop) {
16
- if (typeof prop === "symbol") return original[prop];
17
- const key = prop;
18
- if (children.has(key)) return children.get(key).proxy;
19
- const source = copy ?? original;
20
- const value = source[key];
21
- if (isPlainObject(value)) {
22
- const child = createDraftNode(value);
23
- children.set(key, child);
24
- return child.proxy;
25
- }
26
- if (__DEV__ && Array.isArray(value)) {
27
- return Object.freeze([...value]);
28
- }
29
- return value;
30
- },
31
- set(_, prop, value) {
32
- if (typeof prop === "symbol") return true;
33
- const key = prop;
34
- const source = copy ?? original;
35
- if (source[key] !== value) {
36
- ensureCopy();
37
- copy[key] = value;
38
- children.delete(key);
39
- }
40
- return true;
41
- },
42
- ownKeys() {
43
- return Reflect.ownKeys(copy ?? original);
44
- },
45
- getOwnPropertyDescriptor(_, prop) {
46
- const source = copy ?? original;
47
- if (Object.prototype.hasOwnProperty.call(source, prop)) {
48
- return { value: source[prop], writable: true, enumerable: true, configurable: true };
49
- }
50
- return void 0;
51
- },
52
- has(_, prop) {
53
- return prop in (copy ?? original);
54
- }
55
- });
56
- return {
57
- proxy,
58
- changed() {
59
- if (copy) return true;
60
- for (const child of children.values()) {
61
- if (child.changed()) return true;
62
- }
63
- return false;
64
- },
65
- finalize() {
66
- for (const [key, child] of children) {
67
- if (child.changed()) {
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
- const root = createDraftNode(state);
78
- mutator(root.proxy);
79
- if (!root.changed()) return null;
80
- const finalized = root.finalize();
81
- const partial = {};
82
- let hasChanges = false;
83
- for (const key of Object.keys(finalized)) {
84
- if (finalized[key] !== state[key]) {
85
- partial[key] = finalized[key];
86
- hasChanges = true;
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
- let explicitReturn;
93
- const draftChanges = produceDraft(state, (draft) => {
94
- const result = updater(draft);
95
- if (result !== void 0 && result !== null && typeof result === "object") {
96
- explicitReturn = result;
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
- export {
102
- produceDraft,
103
- resolveDraftUpdater
104
- };
105
- //# sourceMappingURL=produceDraft.js.map
111
+ //#endregion
112
+ export { produceDraft, resolveDraftUpdater };
113
+
114
+ //# sourceMappingURL=produceDraft.js.map
@@ -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"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,oBAAoB,eAAe;AAM1D,SAAS,cAAc,OAAkD;AACvE,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,QAAM,QAAQ,OAAO,eAAe,KAAK;AACzC,SAAO,UAAU,OAAO,aAAa,UAAU;AACjD;AAQA,SAAS,gBAAkC,UAAqC;AAC9E,MAAI,OAAuC;AAC3C,QAAM,+BAAe,IAAA;AAErB,WAAS,aAAsC;AAC7C,QAAI,CAAC,KAAM,QAAO,EAAE,GAAI,SAAA;AACxB,WAAO;AAAA,EACT;AAIA,QAAM,QAAQ,IAAI,MAAM,IAAS;AAAA,IAC/B,IAAI,GAAG,MAAM;AACX,UAAI,OAAO,SAAS,SAAU,QAAQ,SAAiB,IAAI;AAE3D,YAAM,MAAM;AAGZ,UAAI,SAAS,IAAI,GAAG,UAAU,SAAS,IAAI,GAAG,EAAG;AAGjD,YAAM,SAAc,QAAQ;AAC5B,YAAM,QAAQ,OAAO,GAAG;AAGxB,UAAI,cAAc,KAAK,GAAG;AACxB,cAAM,QAAQ,gBAAgB,KAAgC;AAC9D,iBAAS,IAAI,KAAK,KAAK;AACvB,eAAO,MAAM;AAAA,MACf;AAIA,UAAI,WAAW,MAAM,QAAQ,KAAK,GAAG;AACnC,eAAO,OAAO,OAAO,CAAC,GAAG,KAAK,CAAC;AAAA,MACjC;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,IAAI,GAAG,MAAM,OAAO;AAClB,UAAI,OAAO,SAAS,SAAU,QAAO;AAErC,YAAM,MAAM;AACZ,YAAM,SAAc,QAAQ;AAE5B,UAAI,OAAO,GAAG,MAAM,OAAO;AACzB,mBAAA;AACA,aAAM,GAAG,IAAI;AAEb,iBAAS,OAAO,GAAG;AAAA,MACrB;AACA,aAAO;AAAA,IACT;AAAA,IAEA,UAAU;AACR,aAAO,QAAQ,QAAS,QAAQ,QAAmB;AAAA,IACrD;AAAA,IAEA,yBAAyB,GAAG,MAAM;AAChC,YAAM,SAAU,QAAQ;AACxB,UAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,IAAI,GAAG;AACtD,eAAO,EAAE,OAAO,OAAO,IAAc,GAAG,UAAU,MAAM,YAAY,MAAM,cAAc,KAAA;AAAA,MAC1F;AACA,aAAO;AAAA,IACT;AAAA,IAEA,IAAI,GAAG,MAAM;AACX,aAAO,SAAU,QAAQ;AAAA,IAC3B;AAAA,EAAA,CACD;AAED,SAAO;AAAA,IACL;AAAA,IAEA,UAAmB;AACjB,UAAI,KAAM,QAAO;AACjB,iBAAW,SAAS,SAAS,UAAU;AACrC,YAAI,MAAM,QAAA,EAAW,QAAO;AAAA,MAC9B;AACA,aAAO;AAAA,IACT;AAAA,IAEA,WAAc;AAEZ,iBAAW,CAAC,KAAK,KAAK,KAAK,UAAU;AACnC,YAAI,MAAM,WAAW;AACnB,qBAAA;AACA,eAAM,GAAG,IAAI,MAAM,SAAA;AAAA,QACrB;AAAA,MACF;AACA,aAAQ,QAAQ;AAAA,IAClB;AAAA,EAAA;AAEJ;AAaO,SAAS,aACd,OACA,SACmB;AACnB,QAAM,OAAO,gBAAgB,KAAK;AAClC,UAAQ,KAAK,KAAK;AAElB,MAAI,CAAC,KAAK,QAAA,EAAW,QAAO;AAE5B,QAAM,YAAY,KAAK,SAAA;AAGvB,QAAM,UAAmC,CAAA;AACzC,MAAI,aAAa;AAEjB,aAAW,OAAO,OAAO,KAAK,SAAS,GAAG;AACxC,QAAK,UAAkB,GAAG,MAAO,MAAc,GAAG,GAAG;AACnD,cAAQ,GAAG,IAAK,UAAkB,GAAG;AACrC,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,SAAO,aAAc,UAAyB;AAChD;AAOO,SAAS,oBACd,OACA,SACmB;AACnB,MAAI;AACJ,QAAM,eAAe,aAAgB,OAAO,CAAC,UAAU;AACrD,UAAM,SAAS,QAAQ,KAAK;AAC5B,QAAI,WAAW,UAAa,WAAW,QAAQ,OAAO,WAAW,UAAU;AACzE,uBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AACD,SAAO,kBAAkB;AAC3B;"}
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
- "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
- );
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
- //# sourceMappingURL=CardList.cjs.map
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"],"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;;"}
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 { 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
- );
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
- export {
40
- CardList
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"],"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;"}
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"}