@alneas/appkit-react 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (659) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/README.md +85 -15
  3. package/consumer-ai/SKILL.md +12 -0
  4. package/consumer-ai/api-index.json +103754 -0
  5. package/consumer-ai/package-context.json +409 -0
  6. package/dist/ai/action/ExecutionHistory.cjs.map +1 -1
  7. package/dist/ai/action/ExecutionHistory.d.cts +32 -2
  8. package/dist/ai/action/ExecutionHistory.d.ts +32 -2
  9. package/dist/ai/action/ExecutionHistory.js.map +1 -1
  10. package/dist/ai/action/ScreenActionContext.cjs.map +1 -1
  11. package/dist/ai/action/ScreenActionContext.d.cts +15 -2
  12. package/dist/ai/action/ScreenActionContext.d.ts +15 -2
  13. package/dist/ai/action/ScreenActionContext.js.map +1 -1
  14. package/dist/ai/action/context.cjs.map +1 -1
  15. package/dist/ai/action/context.d.cts +19 -3
  16. package/dist/ai/action/context.d.ts +19 -3
  17. package/dist/ai/action/context.js.map +1 -1
  18. package/dist/ai/action/types.d.cts +35 -3
  19. package/dist/ai/action/types.d.ts +35 -3
  20. package/dist/ai/action/use-execution-session.cjs.map +1 -1
  21. package/dist/ai/action/use-execution-session.d.cts +17 -1
  22. package/dist/ai/action/use-execution-session.d.ts +17 -1
  23. package/dist/ai/action/use-execution-session.js.map +1 -1
  24. package/dist/ai/action/use-screen-action-registry.cjs.map +1 -1
  25. package/dist/ai/action/use-screen-action-registry.d.cts +77 -8
  26. package/dist/ai/action/use-screen-action-registry.d.ts +77 -8
  27. package/dist/ai/action/use-screen-action-registry.js.map +1 -1
  28. package/dist/ai/action/use-screen-action.cjs.map +1 -1
  29. package/dist/ai/action/use-screen-action.d.cts +23 -6
  30. package/dist/ai/action/use-screen-action.d.ts +23 -6
  31. package/dist/ai/action/use-screen-action.js.map +1 -1
  32. package/dist/ai/action/use-screen-context.cjs.map +1 -1
  33. package/dist/ai/action/use-screen-context.d.cts +42 -5
  34. package/dist/ai/action/use-screen-context.d.ts +42 -5
  35. package/dist/ai/action/use-screen-context.js.map +1 -1
  36. package/dist/ai/ai-chat/transport.cjs.map +1 -1
  37. package/dist/ai/ai-chat/transport.d.cts +35 -8
  38. package/dist/ai/ai-chat/transport.d.ts +35 -8
  39. package/dist/ai/ai-chat/transport.js.map +1 -1
  40. package/dist/ai/generative-ui/GenerativeUIRenderer.cjs.map +1 -1
  41. package/dist/ai/generative-ui/GenerativeUIRenderer.d.cts +21 -3
  42. package/dist/ai/generative-ui/GenerativeUIRenderer.d.ts +21 -3
  43. package/dist/ai/generative-ui/GenerativeUIRenderer.js.map +1 -1
  44. package/dist/ai/generative-ui/error-boundary.cjs.map +1 -1
  45. package/dist/ai/generative-ui/error-boundary.d.cts +98 -2
  46. package/dist/ai/generative-ui/error-boundary.d.ts +98 -2
  47. package/dist/ai/generative-ui/error-boundary.js.map +1 -1
  48. package/dist/ai/generative-ui/registry.cjs.map +1 -1
  49. package/dist/ai/generative-ui/registry.d.cts +96 -7
  50. package/dist/ai/generative-ui/registry.d.ts +96 -7
  51. package/dist/ai/generative-ui/registry.js.map +1 -1
  52. package/dist/ai/proposal/ProposalFieldReview.cjs.map +1 -1
  53. package/dist/ai/proposal/ProposalFieldReview.d.cts +170 -8
  54. package/dist/ai/proposal/ProposalFieldReview.d.ts +170 -8
  55. package/dist/ai/proposal/ProposalFieldReview.js.map +1 -1
  56. package/dist/ai/proposal/types.d.cts +97 -26
  57. package/dist/ai/proposal/types.d.ts +97 -26
  58. package/dist/ai/proposal/use-proposal-batch-review.cjs.map +1 -1
  59. package/dist/ai/proposal/use-proposal-batch-review.d.cts +133 -7
  60. package/dist/ai/proposal/use-proposal-batch-review.d.ts +133 -7
  61. package/dist/ai/proposal/use-proposal-batch-review.js.map +1 -1
  62. package/dist/ai/proposal/use-proposal-review.cjs.map +1 -1
  63. package/dist/ai/proposal/use-proposal-review.d.cts +47 -5
  64. package/dist/ai/proposal/use-proposal-review.d.ts +47 -5
  65. package/dist/ai/proposal/use-proposal-review.js.map +1 -1
  66. package/dist/avatar.svg +1 -0
  67. package/dist/consumer-ai/SKILL.md +6 -0
  68. package/dist/consumer-ai/api-index.json +103754 -0
  69. package/dist/consumer-ai/package-context.json +5 -3
  70. package/dist/mockServiceWorker.js +361 -0
  71. package/dist/styles.css +1 -1
  72. package/dist/tools/components/auth/AuthForms.cjs.map +1 -1
  73. package/dist/tools/components/auth/AuthForms.d.cts +131 -81
  74. package/dist/tools/components/auth/AuthForms.d.ts +131 -81
  75. package/dist/tools/components/auth/AuthForms.js.map +1 -1
  76. package/dist/tools/components/auth/AuthGuard.cjs.map +1 -1
  77. package/dist/tools/components/auth/AuthGuard.d.cts +31 -4
  78. package/dist/tools/components/auth/AuthGuard.d.ts +31 -4
  79. package/dist/tools/components/auth/AuthGuard.js.map +1 -1
  80. package/dist/tools/components/auth/AuthProvider.cjs.map +1 -1
  81. package/dist/tools/components/auth/AuthProvider.d.cts +39 -42
  82. package/dist/tools/components/auth/AuthProvider.d.ts +39 -42
  83. package/dist/tools/components/auth/AuthProvider.js.map +1 -1
  84. package/dist/tools/components/auth/ProtectedRoute.cjs.map +1 -1
  85. package/dist/tools/components/auth/ProtectedRoute.d.cts +75 -60
  86. package/dist/tools/components/auth/ProtectedRoute.d.ts +75 -60
  87. package/dist/tools/components/auth/ProtectedRoute.js.map +1 -1
  88. package/dist/tools/components/auth/SignInButton.cjs.map +1 -1
  89. package/dist/tools/components/auth/SignInButton.d.cts +26 -18
  90. package/dist/tools/components/auth/SignInButton.d.ts +26 -18
  91. package/dist/tools/components/auth/SignInButton.js.map +1 -1
  92. package/dist/tools/components/auth/UserProfileProvider.cjs.map +1 -1
  93. package/dist/tools/components/auth/UserProfileProvider.d.cts +48 -20
  94. package/dist/tools/components/auth/UserProfileProvider.d.ts +48 -20
  95. package/dist/tools/components/auth/UserProfileProvider.js.map +1 -1
  96. package/dist/tools/components/auth/adapters/better-auth-adapter.cjs.map +1 -1
  97. package/dist/tools/components/auth/adapters/better-auth-adapter.d.cts +371 -51
  98. package/dist/tools/components/auth/adapters/better-auth-adapter.d.ts +371 -51
  99. package/dist/tools/components/auth/adapters/better-auth-adapter.js.map +1 -1
  100. package/dist/tools/components/auth/adapters/mock-adapter.cjs.map +1 -1
  101. package/dist/tools/components/auth/adapters/mock-adapter.d.cts +149 -28
  102. package/dist/tools/components/auth/adapters/mock-adapter.d.ts +149 -28
  103. package/dist/tools/components/auth/adapters/mock-adapter.js.map +1 -1
  104. package/dist/tools/components/auth/auth-session.cjs.map +1 -1
  105. package/dist/tools/components/auth/auth-session.d.cts +147 -1
  106. package/dist/tools/components/auth/auth-session.d.ts +147 -1
  107. package/dist/tools/components/auth/auth-session.js.map +1 -1
  108. package/dist/tools/components/auth/session-cache.cjs.map +1 -1
  109. package/dist/tools/components/auth/session-cache.d.cts +88 -24
  110. package/dist/tools/components/auth/session-cache.d.ts +88 -24
  111. package/dist/tools/components/auth/session-cache.js.map +1 -1
  112. package/dist/tools/components/auth/types.cjs.map +1 -1
  113. package/dist/tools/components/auth/types.d.cts +329 -106
  114. package/dist/tools/components/auth/types.d.ts +329 -106
  115. package/dist/tools/components/auth/types.js.map +1 -1
  116. package/dist/tools/components/auth/useAuth.cjs.map +1 -1
  117. package/dist/tools/components/auth/useAuth.d.cts +110 -17
  118. package/dist/tools/components/auth/useAuth.d.ts +110 -17
  119. package/dist/tools/components/auth/useAuth.js.map +1 -1
  120. package/dist/tools/components/auth/useAuthGuard.cjs.map +1 -1
  121. package/dist/tools/components/auth/useAuthGuard.d.cts +49 -38
  122. package/dist/tools/components/auth/useAuthGuard.d.ts +49 -38
  123. package/dist/tools/components/auth/useAuthGuard.js.map +1 -1
  124. package/dist/tools/components/auth/useRoleCheck.cjs.map +1 -1
  125. package/dist/tools/components/auth/useRoleCheck.d.cts +48 -1
  126. package/dist/tools/components/auth/useRoleCheck.d.ts +48 -1
  127. package/dist/tools/components/auth/useRoleCheck.js.map +1 -1
  128. package/dist/tools/components/auth/useUserProfile.cjs.map +1 -1
  129. package/dist/tools/components/auth/useUserProfile.d.cts +66 -1
  130. package/dist/tools/components/auth/useUserProfile.d.ts +66 -1
  131. package/dist/tools/components/auth/useUserProfile.js.map +1 -1
  132. package/dist/tools/components/barcode/BarcodeGenerator.cjs.map +1 -1
  133. package/dist/tools/components/barcode/BarcodeGenerator.d.cts +32 -18
  134. package/dist/tools/components/barcode/BarcodeGenerator.d.ts +32 -18
  135. package/dist/tools/components/barcode/BarcodeGenerator.js.map +1 -1
  136. package/dist/tools/components/barcode/QRCodeGenerator.cjs +1 -1
  137. package/dist/tools/components/barcode/QRCodeGenerator.cjs.map +1 -1
  138. package/dist/tools/components/barcode/QRCodeGenerator.d.cts +20 -13
  139. package/dist/tools/components/barcode/QRCodeGenerator.d.ts +20 -13
  140. package/dist/tools/components/barcode/QRCodeGenerator.js +1 -1
  141. package/dist/tools/components/barcode/QRCodeGenerator.js.map +1 -1
  142. package/dist/tools/components/barcode/QRCodeScanner.cjs.map +1 -1
  143. package/dist/tools/components/barcode/QRCodeScanner.d.cts +32 -1
  144. package/dist/tools/components/barcode/QRCodeScanner.d.ts +32 -1
  145. package/dist/tools/components/barcode/QRCodeScanner.js.map +1 -1
  146. package/dist/tools/components/calendar/ResourceCalendar.cjs.map +1 -1
  147. package/dist/tools/components/calendar/ResourceCalendar.d.cts +17 -42
  148. package/dist/tools/components/calendar/ResourceCalendar.d.ts +17 -42
  149. package/dist/tools/components/calendar/ResourceCalendar.js.map +1 -1
  150. package/dist/tools/components/calendar/views/ResourceView.cjs +1 -1
  151. package/dist/tools/components/calendar/views/ResourceView.cjs.map +1 -1
  152. package/dist/tools/components/calendar/views/ResourceView.js +2 -2
  153. package/dist/tools/components/calendar/views/ResourceView.js.map +1 -1
  154. package/dist/tools/components/chart/ComposedChart.cjs.map +1 -1
  155. package/dist/tools/components/chart/ComposedChart.d.cts +54 -1
  156. package/dist/tools/components/chart/ComposedChart.d.ts +54 -1
  157. package/dist/tools/components/chart/ComposedChart.js.map +1 -1
  158. package/dist/tools/components/chart/SimpleAreaChart.cjs.map +1 -1
  159. package/dist/tools/components/chart/SimpleAreaChart.d.cts +41 -1
  160. package/dist/tools/components/chart/SimpleAreaChart.d.ts +41 -1
  161. package/dist/tools/components/chart/SimpleAreaChart.js.map +1 -1
  162. package/dist/tools/components/chart/SimpleBarChart.cjs.map +1 -1
  163. package/dist/tools/components/chart/SimpleBarChart.d.cts +34 -24
  164. package/dist/tools/components/chart/SimpleBarChart.d.ts +34 -24
  165. package/dist/tools/components/chart/SimpleBarChart.js.map +1 -1
  166. package/dist/tools/components/chart/SimpleLineChart.cjs.map +1 -1
  167. package/dist/tools/components/chart/SimpleLineChart.d.cts +31 -28
  168. package/dist/tools/components/chart/SimpleLineChart.d.ts +31 -28
  169. package/dist/tools/components/chart/SimpleLineChart.js.map +1 -1
  170. package/dist/tools/components/chart/SimplePieChart.cjs.map +1 -1
  171. package/dist/tools/components/chart/SimplePieChart.d.cts +28 -22
  172. package/dist/tools/components/chart/SimplePieChart.d.ts +28 -22
  173. package/dist/tools/components/chart/SimplePieChart.js.map +1 -1
  174. package/dist/tools/components/chart/SimpleRadarChart.cjs.map +1 -1
  175. package/dist/tools/components/chart/SimpleRadarChart.d.cts +38 -1
  176. package/dist/tools/components/chart/SimpleRadarChart.d.ts +38 -1
  177. package/dist/tools/components/chart/SimpleRadarChart.js.map +1 -1
  178. package/dist/tools/components/chart/SimpleScatterChart.cjs.map +1 -1
  179. package/dist/tools/components/chart/SimpleScatterChart.d.cts +44 -1
  180. package/dist/tools/components/chart/SimpleScatterChart.d.ts +44 -1
  181. package/dist/tools/components/chart/SimpleScatterChart.js.map +1 -1
  182. package/dist/tools/components/chart/StackedBarChart.cjs.map +1 -1
  183. package/dist/tools/components/chart/StackedBarChart.d.cts +38 -1
  184. package/dist/tools/components/chart/StackedBarChart.d.ts +38 -1
  185. package/dist/tools/components/chart/StackedBarChart.js.map +1 -1
  186. package/dist/tools/components/data-table/data-table.cjs +1 -1
  187. package/dist/tools/components/data-table/data-table.cjs.map +1 -1
  188. package/dist/tools/components/data-table/data-table.js +286 -263
  189. package/dist/tools/components/data-table/data-table.js.map +1 -1
  190. package/dist/tools/components/data-table/table-utils.cjs.map +1 -1
  191. package/dist/tools/components/data-table/table-utils.d.cts +45 -35
  192. package/dist/tools/components/data-table/table-utils.d.ts +45 -35
  193. package/dist/tools/components/data-table/table-utils.js.map +1 -1
  194. package/dist/tools/components/editable-table/editable-table.cjs +1 -1
  195. package/dist/tools/components/editable-table/editable-table.cjs.map +1 -1
  196. package/dist/tools/components/editable-table/editable-table.js +15 -2
  197. package/dist/tools/components/editable-table/editable-table.js.map +1 -1
  198. package/dist/tools/components/error/ErrorDialog.cjs +1 -1
  199. package/dist/tools/components/error/ErrorDialog.cjs.map +1 -1
  200. package/dist/tools/components/error/ErrorDialog.js +1 -1
  201. package/dist/tools/components/error/ErrorDialog.js.map +1 -1
  202. package/dist/tools/components/error/ErrorInline.cjs +1 -1
  203. package/dist/tools/components/error/ErrorInline.cjs.map +1 -1
  204. package/dist/tools/components/error/ErrorInline.js +1 -1
  205. package/dist/tools/components/error/ErrorInline.js.map +1 -1
  206. package/dist/tools/components/error/ErrorNotification.cjs +1 -1
  207. package/dist/tools/components/error/ErrorNotification.cjs.map +1 -1
  208. package/dist/tools/components/error/ErrorNotification.js +10 -10
  209. package/dist/tools/components/error/ErrorNotification.js.map +1 -1
  210. package/dist/tools/components/file-browser/FilePreview.cjs +1 -1
  211. package/dist/tools/components/file-browser/FilePreview.cjs.map +1 -1
  212. package/dist/tools/components/file-browser/FilePreview.js +28 -26
  213. package/dist/tools/components/file-browser/FilePreview.js.map +1 -1
  214. package/dist/tools/components/filter/filter.cjs.map +1 -1
  215. package/dist/tools/components/filter/filter.d.cts +23 -34
  216. package/dist/tools/components/filter/filter.d.ts +23 -34
  217. package/dist/tools/components/filter/filter.js.map +1 -1
  218. package/dist/tools/components/form/EnhancedDetailPage.cjs.map +1 -1
  219. package/dist/tools/components/form/EnhancedDetailPage.d.cts +47 -42
  220. package/dist/tools/components/form/EnhancedDetailPage.d.ts +47 -42
  221. package/dist/tools/components/form/EnhancedDetailPage.js.map +1 -1
  222. package/dist/tools/components/form/form-grid.cjs.map +1 -1
  223. package/dist/tools/components/form/form-grid.d.cts +44 -22
  224. package/dist/tools/components/form/form-grid.d.ts +44 -22
  225. package/dist/tools/components/form/form-grid.js.map +1 -1
  226. package/dist/tools/components/gantt/GanttChart.cjs +1 -1
  227. package/dist/tools/components/gantt/GanttChart.cjs.map +1 -1
  228. package/dist/tools/components/gantt/GanttChart.d.cts +20 -1
  229. package/dist/tools/components/gantt/GanttChart.d.ts +20 -1
  230. package/dist/tools/components/gantt/GanttChart.js +3 -0
  231. package/dist/tools/components/gantt/GanttChart.js.map +1 -1
  232. package/dist/tools/components/gantt/components/GanttTaskBar.cjs +1 -1
  233. package/dist/tools/components/gantt/components/GanttTaskBar.cjs.map +1 -1
  234. package/dist/tools/components/gantt/components/GanttTaskBar.js +2 -1
  235. package/dist/tools/components/gantt/components/GanttTaskBar.js.map +1 -1
  236. package/dist/tools/components/header/header.cjs +1 -1
  237. package/dist/tools/components/header/header.cjs.map +1 -1
  238. package/dist/tools/components/header/header.d.cts +103 -40
  239. package/dist/tools/components/header/header.d.ts +103 -40
  240. package/dist/tools/components/header/header.js +1 -1
  241. package/dist/tools/components/header/header.js.map +1 -1
  242. package/dist/tools/components/i18n/LanguageSwitcher.cjs.map +1 -1
  243. package/dist/tools/components/i18n/LanguageSwitcher.d.cts +18 -14
  244. package/dist/tools/components/i18n/LanguageSwitcher.d.ts +18 -14
  245. package/dist/tools/components/i18n/LanguageSwitcher.js.map +1 -1
  246. package/dist/tools/components/kanban/KanbanBoard.cjs +1 -1
  247. package/dist/tools/components/kanban/KanbanBoard.cjs.map +1 -1
  248. package/dist/tools/components/kanban/KanbanBoard.d.cts +16 -34
  249. package/dist/tools/components/kanban/KanbanBoard.d.ts +16 -34
  250. package/dist/tools/components/kanban/KanbanBoard.js +3 -0
  251. package/dist/tools/components/kanban/KanbanBoard.js.map +1 -1
  252. package/dist/tools/components/kanban/KanbanColumn.cjs +1 -1
  253. package/dist/tools/components/kanban/KanbanColumn.cjs.map +1 -1
  254. package/dist/tools/components/kanban/KanbanColumn.js +1 -1
  255. package/dist/tools/components/kanban/KanbanColumn.js.map +1 -1
  256. package/dist/tools/components/kanban/kanban-compound.cjs +1 -1
  257. package/dist/tools/components/kanban/kanban-compound.cjs.map +1 -1
  258. package/dist/tools/components/kanban/kanban-compound.js +4 -1
  259. package/dist/tools/components/kanban/kanban-compound.js.map +1 -1
  260. package/dist/tools/components/kanban/kanban-primitives.cjs +1 -1
  261. package/dist/tools/components/kanban/kanban-primitives.cjs.map +1 -1
  262. package/dist/tools/components/kanban/kanban-primitives.js +0 -1
  263. package/dist/tools/components/kanban/kanban-primitives.js.map +1 -1
  264. package/dist/tools/components/priority-queue/PriorityCard.cjs +1 -1
  265. package/dist/tools/components/priority-queue/PriorityCard.cjs.map +1 -1
  266. package/dist/tools/components/priority-queue/PriorityCard.js +3 -1
  267. package/dist/tools/components/priority-queue/PriorityCard.js.map +1 -1
  268. package/dist/tools/components/sidebar/SmartSidebar.cjs.map +1 -1
  269. package/dist/tools/components/sidebar/SmartSidebar.d.cts +41 -43
  270. package/dist/tools/components/sidebar/SmartSidebar.d.ts +41 -43
  271. package/dist/tools/components/sidebar/SmartSidebar.js.map +1 -1
  272. package/dist/tools/components/splash/SplashScreen.cjs.map +1 -1
  273. package/dist/tools/components/splash/SplashScreen.d.cts +43 -68
  274. package/dist/tools/components/splash/SplashScreen.d.ts +43 -68
  275. package/dist/tools/components/splash/SplashScreen.js.map +1 -1
  276. package/dist/tools/components/workflow/WorkflowStatusPanel.cjs +1 -1
  277. package/dist/tools/components/workflow/WorkflowStatusPanel.cjs.map +1 -1
  278. package/dist/tools/components/workflow/WorkflowStatusPanel.js +2 -2
  279. package/dist/tools/components/workflow/WorkflowStatusPanel.js.map +1 -1
  280. package/dist/tools/lib/data-access/data-access-context.cjs.map +1 -1
  281. package/dist/tools/lib/data-access/data-access-context.d.cts +15 -6
  282. package/dist/tools/lib/data-access/data-access-context.d.ts +15 -6
  283. package/dist/tools/lib/data-access/data-access-context.js.map +1 -1
  284. package/dist/tools/lib/data-access/react-query-provider.cjs.map +1 -1
  285. package/dist/tools/lib/data-access/react-query-provider.d.cts +19 -2
  286. package/dist/tools/lib/data-access/react-query-provider.d.ts +19 -2
  287. package/dist/tools/lib/data-access/react-query-provider.js.map +1 -1
  288. package/dist/tools/lib/data-access/react-query.cjs.map +1 -1
  289. package/dist/tools/lib/data-access/react-query.d.cts +365 -90
  290. package/dist/tools/lib/data-access/react-query.d.ts +365 -90
  291. package/dist/tools/lib/data-access/react-query.js.map +1 -1
  292. package/dist/tools/lib/error/AppError.cjs.map +1 -1
  293. package/dist/tools/lib/error/AppError.d.cts +157 -63
  294. package/dist/tools/lib/error/AppError.d.ts +157 -63
  295. package/dist/tools/lib/error/AppError.js.map +1 -1
  296. package/dist/tools/lib/hooks/useAsyncWithTimeout.cjs.map +1 -1
  297. package/dist/tools/lib/hooks/useAsyncWithTimeout.d.cts +79 -26
  298. package/dist/tools/lib/hooks/useAsyncWithTimeout.d.ts +79 -26
  299. package/dist/tools/lib/hooks/useAsyncWithTimeout.js.map +1 -1
  300. package/dist/tools/lib/hooks/useError.cjs.map +1 -1
  301. package/dist/tools/lib/hooks/useError.d.cts +51 -16
  302. package/dist/tools/lib/hooks/useError.d.ts +51 -16
  303. package/dist/tools/lib/hooks/useError.js.map +1 -1
  304. package/dist/tools/lib/schema/ajv.cjs +1 -1
  305. package/dist/tools/lib/schema/ajv.cjs.map +1 -1
  306. package/dist/tools/lib/schema/ajv.d.cts +19 -8
  307. package/dist/tools/lib/schema/ajv.d.ts +19 -8
  308. package/dist/tools/lib/schema/ajv.js +2 -1
  309. package/dist/tools/lib/schema/ajv.js.map +1 -1
  310. package/dist/tools/lib/state/error-store.cjs.map +1 -1
  311. package/dist/tools/lib/state/error-store.d.cts +61 -10
  312. package/dist/tools/lib/state/error-store.d.ts +61 -10
  313. package/dist/tools/lib/state/error-store.js.map +1 -1
  314. package/dist/tools/lib/state/store-factory.cjs.map +1 -1
  315. package/dist/tools/lib/state/store-factory.d.cts +25 -4
  316. package/dist/tools/lib/state/store-factory.d.ts +25 -4
  317. package/dist/tools/lib/state/store-factory.js.map +1 -1
  318. package/dist/tools/lib/state/ui-store.cjs.map +1 -1
  319. package/dist/tools/lib/state/ui-store.d.cts +39 -0
  320. package/dist/tools/lib/state/ui-store.d.ts +39 -0
  321. package/dist/tools/lib/state/ui-store.js.map +1 -1
  322. package/dist/ui/components/theme/theme-context.cjs.map +1 -1
  323. package/dist/ui/components/theme/theme-context.d.cts +171 -1
  324. package/dist/ui/components/theme/theme-context.d.ts +171 -1
  325. package/dist/ui/components/theme/theme-context.js.map +1 -1
  326. package/dist/ui/components/theme/theme-provider.cjs.map +1 -1
  327. package/dist/ui/components/theme/theme-provider.d.cts +31 -19
  328. package/dist/ui/components/theme/theme-provider.d.ts +31 -19
  329. package/dist/ui/components/theme/theme-provider.js.map +1 -1
  330. package/dist/ui/components/theme/theme-script.cjs.map +1 -1
  331. package/dist/ui/components/theme/theme-script.d.cts +16 -1
  332. package/dist/ui/components/theme/theme-script.d.ts +16 -1
  333. package/dist/ui/components/theme/theme-script.js.map +1 -1
  334. package/dist/ui/components/theme/theme-switcher.cjs +1 -1
  335. package/dist/ui/components/theme/theme-switcher.cjs.map +1 -1
  336. package/dist/ui/components/theme/theme-switcher.d.cts +82 -13
  337. package/dist/ui/components/theme/theme-switcher.d.ts +82 -13
  338. package/dist/ui/components/theme/theme-switcher.js +8 -0
  339. package/dist/ui/components/theme/theme-switcher.js.map +1 -1
  340. package/dist/ui/components/ui/accordion.cjs.map +1 -1
  341. package/dist/ui/components/ui/accordion.d.cts +60 -0
  342. package/dist/ui/components/ui/accordion.d.ts +60 -0
  343. package/dist/ui/components/ui/accordion.js.map +1 -1
  344. package/dist/ui/components/ui/adjustable-pane.cjs.map +1 -1
  345. package/dist/ui/components/ui/adjustable-pane.d.cts +44 -26
  346. package/dist/ui/components/ui/adjustable-pane.d.ts +44 -26
  347. package/dist/ui/components/ui/adjustable-pane.js.map +1 -1
  348. package/dist/ui/components/ui/alert-dialog.cjs.map +1 -1
  349. package/dist/ui/components/ui/alert-dialog.d.cts +179 -2
  350. package/dist/ui/components/ui/alert-dialog.d.ts +179 -2
  351. package/dist/ui/components/ui/alert-dialog.js.map +1 -1
  352. package/dist/ui/components/ui/alert.cjs.map +1 -1
  353. package/dist/ui/components/ui/alert.d.cts +52 -4
  354. package/dist/ui/components/ui/alert.d.ts +52 -4
  355. package/dist/ui/components/ui/alert.js.map +1 -1
  356. package/dist/ui/components/ui/aspect-ratio.cjs.map +1 -1
  357. package/dist/ui/components/ui/aspect-ratio.d.cts +16 -1
  358. package/dist/ui/components/ui/aspect-ratio.d.ts +16 -1
  359. package/dist/ui/components/ui/aspect-ratio.js.map +1 -1
  360. package/dist/ui/components/ui/avatar.cjs.map +1 -1
  361. package/dist/ui/components/ui/avatar.d.cts +87 -3
  362. package/dist/ui/components/ui/avatar.d.ts +87 -3
  363. package/dist/ui/components/ui/avatar.js.map +1 -1
  364. package/dist/ui/components/ui/badge-components.cjs.map +1 -1
  365. package/dist/ui/components/ui/badge-components.d.cts +13 -1
  366. package/dist/ui/components/ui/badge-components.d.ts +13 -1
  367. package/dist/ui/components/ui/badge-components.js.map +1 -1
  368. package/dist/ui/components/ui/badge-variants.cjs.map +1 -1
  369. package/dist/ui/components/ui/badge-variants.d.cts +15 -0
  370. package/dist/ui/components/ui/badge-variants.d.ts +15 -0
  371. package/dist/ui/components/ui/badge-variants.js.map +1 -1
  372. package/dist/ui/components/ui/breadcrumb.cjs.map +1 -1
  373. package/dist/ui/components/ui/breadcrumb.d.cts +91 -7
  374. package/dist/ui/components/ui/breadcrumb.d.ts +91 -7
  375. package/dist/ui/components/ui/breadcrumb.js.map +1 -1
  376. package/dist/ui/components/ui/button-components.cjs.map +1 -1
  377. package/dist/ui/components/ui/button-components.d.cts +18 -6
  378. package/dist/ui/components/ui/button-components.d.ts +18 -6
  379. package/dist/ui/components/ui/button-components.js.map +1 -1
  380. package/dist/ui/components/ui/button-group-components.cjs.map +1 -1
  381. package/dist/ui/components/ui/button-group-components.d.cts +39 -3
  382. package/dist/ui/components/ui/button-group-components.d.ts +39 -3
  383. package/dist/ui/components/ui/button-group-components.js.map +1 -1
  384. package/dist/ui/components/ui/button-group-variants.cjs.map +1 -1
  385. package/dist/ui/components/ui/button-group-variants.d.cts +15 -0
  386. package/dist/ui/components/ui/button-group-variants.d.ts +15 -0
  387. package/dist/ui/components/ui/button-group-variants.js.map +1 -1
  388. package/dist/ui/components/ui/button-variants.cjs.map +1 -1
  389. package/dist/ui/components/ui/button-variants.d.cts +13 -2
  390. package/dist/ui/components/ui/button-variants.d.ts +13 -2
  391. package/dist/ui/components/ui/button-variants.js.map +1 -1
  392. package/dist/ui/components/ui/card.cjs.map +1 -1
  393. package/dist/ui/components/ui/card.d.cts +106 -2
  394. package/dist/ui/components/ui/card.d.ts +106 -2
  395. package/dist/ui/components/ui/card.js.map +1 -1
  396. package/dist/ui/components/ui/checkbox-group.cjs.map +1 -1
  397. package/dist/ui/components/ui/checkbox-group.d.cts +13 -1
  398. package/dist/ui/components/ui/checkbox-group.d.ts +13 -1
  399. package/dist/ui/components/ui/checkbox-group.js.map +1 -1
  400. package/dist/ui/components/ui/checkbox.cjs.map +1 -1
  401. package/dist/ui/components/ui/checkbox.d.cts +17 -6
  402. package/dist/ui/components/ui/checkbox.d.ts +17 -6
  403. package/dist/ui/components/ui/checkbox.js.map +1 -1
  404. package/dist/ui/components/ui/collapsible.cjs.map +1 -1
  405. package/dist/ui/components/ui/collapsible.d.cts +39 -3
  406. package/dist/ui/components/ui/collapsible.d.ts +39 -3
  407. package/dist/ui/components/ui/collapsible.js.map +1 -1
  408. package/dist/ui/components/ui/combobox-components.cjs.map +1 -1
  409. package/dist/ui/components/ui/combobox-components.d.cts +209 -14
  410. package/dist/ui/components/ui/combobox-components.d.ts +209 -14
  411. package/dist/ui/components/ui/combobox-components.js.map +1 -1
  412. package/dist/ui/components/ui/combobox-hooks.cjs.map +1 -1
  413. package/dist/ui/components/ui/combobox-hooks.d.cts +13 -1
  414. package/dist/ui/components/ui/combobox-hooks.d.ts +13 -1
  415. package/dist/ui/components/ui/combobox-hooks.js.map +1 -1
  416. package/dist/ui/components/ui/command.cjs.map +1 -1
  417. package/dist/ui/components/ui/command.d.cts +132 -9
  418. package/dist/ui/components/ui/command.d.ts +132 -9
  419. package/dist/ui/components/ui/command.js.map +1 -1
  420. package/dist/ui/components/ui/context-menu.cjs.map +1 -1
  421. package/dist/ui/components/ui/context-menu.d.cts +233 -2
  422. package/dist/ui/components/ui/context-menu.d.ts +233 -2
  423. package/dist/ui/components/ui/context-menu.js.map +1 -1
  424. package/dist/ui/components/ui/dialog.cjs.map +1 -1
  425. package/dist/ui/components/ui/dialog.d.cts +157 -5
  426. package/dist/ui/components/ui/dialog.d.ts +157 -5
  427. package/dist/ui/components/ui/dialog.js.map +1 -1
  428. package/dist/ui/components/ui/drawer.cjs.map +1 -1
  429. package/dist/ui/components/ui/drawer.d.cts +130 -10
  430. package/dist/ui/components/ui/drawer.d.ts +130 -10
  431. package/dist/ui/components/ui/drawer.js.map +1 -1
  432. package/dist/ui/components/ui/dropdown-menu.cjs.map +1 -1
  433. package/dist/ui/components/ui/dropdown-menu.d.cts +225 -6
  434. package/dist/ui/components/ui/dropdown-menu.d.ts +225 -6
  435. package/dist/ui/components/ui/dropdown-menu.js.map +1 -1
  436. package/dist/ui/components/ui/empty.cjs.map +1 -1
  437. package/dist/ui/components/ui/empty.d.cts +78 -6
  438. package/dist/ui/components/ui/empty.d.ts +78 -6
  439. package/dist/ui/components/ui/empty.js.map +1 -1
  440. package/dist/ui/components/ui/field.cjs.map +1 -1
  441. package/dist/ui/components/ui/field.d.cts +180 -6
  442. package/dist/ui/components/ui/field.d.ts +180 -6
  443. package/dist/ui/components/ui/field.js.map +1 -1
  444. package/dist/ui/components/ui/file-icon.cjs.map +1 -1
  445. package/dist/ui/components/ui/file-icon.d.cts +32 -4
  446. package/dist/ui/components/ui/file-icon.d.ts +32 -4
  447. package/dist/ui/components/ui/file-icon.js.map +1 -1
  448. package/dist/ui/components/ui/hover-card.cjs.map +1 -1
  449. package/dist/ui/components/ui/hover-card.d.cts +39 -3
  450. package/dist/ui/components/ui/hover-card.d.ts +39 -3
  451. package/dist/ui/components/ui/hover-card.js.map +1 -1
  452. package/dist/ui/components/ui/input-group.cjs.map +1 -1
  453. package/dist/ui/components/ui/input-group.d.cts +84 -6
  454. package/dist/ui/components/ui/input-group.d.ts +84 -6
  455. package/dist/ui/components/ui/input-group.js.map +1 -1
  456. package/dist/ui/components/ui/input-otp.cjs.map +1 -1
  457. package/dist/ui/components/ui/input-otp.d.cts +58 -4
  458. package/dist/ui/components/ui/input-otp.d.ts +58 -4
  459. package/dist/ui/components/ui/input-otp.js.map +1 -1
  460. package/dist/ui/components/ui/input.cjs.map +1 -1
  461. package/dist/ui/components/ui/input.d.cts +18 -10
  462. package/dist/ui/components/ui/input.d.ts +18 -10
  463. package/dist/ui/components/ui/input.js.map +1 -1
  464. package/dist/ui/components/ui/item.cjs.map +1 -1
  465. package/dist/ui/components/ui/item.d.cts +130 -10
  466. package/dist/ui/components/ui/item.d.ts +130 -10
  467. package/dist/ui/components/ui/item.js.map +1 -1
  468. package/dist/ui/components/ui/kbd.cjs.map +1 -1
  469. package/dist/ui/components/ui/kbd.d.cts +26 -2
  470. package/dist/ui/components/ui/kbd.d.ts +26 -2
  471. package/dist/ui/components/ui/kbd.js.map +1 -1
  472. package/dist/ui/components/ui/label.cjs.map +1 -1
  473. package/dist/ui/components/ui/label.d.cts +15 -0
  474. package/dist/ui/components/ui/label.d.ts +15 -0
  475. package/dist/ui/components/ui/label.js.map +1 -1
  476. package/dist/ui/components/ui/layout.cjs +1 -1
  477. package/dist/ui/components/ui/layout.cjs.map +1 -1
  478. package/dist/ui/components/ui/layout.d.cts +45 -11
  479. package/dist/ui/components/ui/layout.d.ts +45 -11
  480. package/dist/ui/components/ui/layout.js +22 -20
  481. package/dist/ui/components/ui/layout.js.map +1 -1
  482. package/dist/ui/components/ui/menubar.cjs.map +1 -1
  483. package/dist/ui/components/ui/menubar.d.cts +220 -16
  484. package/dist/ui/components/ui/menubar.d.ts +220 -16
  485. package/dist/ui/components/ui/menubar.js.map +1 -1
  486. package/dist/ui/components/ui/meter.cjs.map +1 -1
  487. package/dist/ui/components/ui/meter.d.cts +52 -4
  488. package/dist/ui/components/ui/meter.d.ts +52 -4
  489. package/dist/ui/components/ui/meter.js.map +1 -1
  490. package/dist/ui/components/ui/mobile-form-variants.cjs.map +1 -1
  491. package/dist/ui/components/ui/mobile-form-variants.d.cts +30 -0
  492. package/dist/ui/components/ui/mobile-form-variants.d.ts +30 -0
  493. package/dist/ui/components/ui/mobile-form-variants.js.map +1 -1
  494. package/dist/ui/components/ui/mobile-form.cjs.map +1 -1
  495. package/dist/ui/components/ui/mobile-form.d.cts +186 -9
  496. package/dist/ui/components/ui/mobile-form.d.ts +186 -9
  497. package/dist/ui/components/ui/mobile-form.js.map +1 -1
  498. package/dist/ui/components/ui/navigation-menu-components.cjs.map +1 -1
  499. package/dist/ui/components/ui/navigation-menu-components.d.cts +104 -8
  500. package/dist/ui/components/ui/navigation-menu-components.d.ts +104 -8
  501. package/dist/ui/components/ui/navigation-menu-components.js.map +1 -1
  502. package/dist/ui/components/ui/navigation-menu-variants.cjs.map +1 -1
  503. package/dist/ui/components/ui/navigation-menu-variants.d.cts +15 -0
  504. package/dist/ui/components/ui/navigation-menu-variants.d.ts +15 -0
  505. package/dist/ui/components/ui/navigation-menu-variants.js.map +1 -1
  506. package/dist/ui/components/ui/number-field.cjs.map +1 -1
  507. package/dist/ui/components/ui/number-field.d.cts +78 -6
  508. package/dist/ui/components/ui/number-field.d.ts +78 -6
  509. package/dist/ui/components/ui/number-field.js.map +1 -1
  510. package/dist/ui/components/ui/pagination.cjs.map +1 -1
  511. package/dist/ui/components/ui/pagination.d.cts +99 -7
  512. package/dist/ui/components/ui/pagination.d.ts +99 -7
  513. package/dist/ui/components/ui/pagination.js.map +1 -1
  514. package/dist/ui/components/ui/password-input.cjs.map +1 -1
  515. package/dist/ui/components/ui/password-input.d.cts +10 -7
  516. package/dist/ui/components/ui/password-input.d.ts +10 -7
  517. package/dist/ui/components/ui/password-input.js.map +1 -1
  518. package/dist/ui/components/ui/popover.cjs.map +1 -1
  519. package/dist/ui/components/ui/popover.d.cts +86 -2
  520. package/dist/ui/components/ui/popover.d.ts +86 -2
  521. package/dist/ui/components/ui/popover.js.map +1 -1
  522. package/dist/ui/components/ui/progress.cjs.map +1 -1
  523. package/dist/ui/components/ui/progress.d.cts +72 -2
  524. package/dist/ui/components/ui/progress.d.ts +72 -2
  525. package/dist/ui/components/ui/progress.js.map +1 -1
  526. package/dist/ui/components/ui/radio-card.cjs.map +1 -1
  527. package/dist/ui/components/ui/radio-card.d.cts +32 -4
  528. package/dist/ui/components/ui/radio-card.d.ts +32 -4
  529. package/dist/ui/components/ui/radio-card.js.map +1 -1
  530. package/dist/ui/components/ui/radio-group.cjs.map +1 -1
  531. package/dist/ui/components/ui/radio-group.d.cts +28 -2
  532. package/dist/ui/components/ui/radio-group.d.ts +28 -2
  533. package/dist/ui/components/ui/radio-group.js.map +1 -1
  534. package/dist/ui/components/ui/resizable.cjs.map +1 -1
  535. package/dist/ui/components/ui/resizable.d.cts +42 -3
  536. package/dist/ui/components/ui/resizable.d.ts +42 -3
  537. package/dist/ui/components/ui/resizable.js.map +1 -1
  538. package/dist/ui/components/ui/responsive-list.cjs.map +1 -1
  539. package/dist/ui/components/ui/responsive-list.d.cts +176 -13
  540. package/dist/ui/components/ui/responsive-list.d.ts +176 -13
  541. package/dist/ui/components/ui/responsive-list.js.map +1 -1
  542. package/dist/ui/components/ui/scroll-area.cjs.map +1 -1
  543. package/dist/ui/components/ui/scroll-area.d.cts +28 -1
  544. package/dist/ui/components/ui/scroll-area.d.ts +28 -1
  545. package/dist/ui/components/ui/scroll-area.js.map +1 -1
  546. package/dist/ui/components/ui/searchable-select-input.cjs.map +1 -1
  547. package/dist/ui/components/ui/searchable-select-input.d.cts +199 -49
  548. package/dist/ui/components/ui/searchable-select-input.d.ts +199 -49
  549. package/dist/ui/components/ui/searchable-select-input.js.map +1 -1
  550. package/dist/ui/components/ui/select.cjs.map +1 -1
  551. package/dist/ui/components/ui/select.d.cts +205 -40
  552. package/dist/ui/components/ui/select.d.ts +205 -40
  553. package/dist/ui/components/ui/select.js.map +1 -1
  554. package/dist/ui/components/ui/separator.cjs.map +1 -1
  555. package/dist/ui/components/ui/separator.d.cts +13 -2
  556. package/dist/ui/components/ui/separator.d.ts +13 -2
  557. package/dist/ui/components/ui/separator.js.map +1 -1
  558. package/dist/ui/components/ui/sheet.cjs.map +1 -1
  559. package/dist/ui/components/ui/sheet.d.cts +128 -3
  560. package/dist/ui/components/ui/sheet.d.ts +128 -3
  561. package/dist/ui/components/ui/sheet.js.map +1 -1
  562. package/dist/ui/components/ui/skeleton.cjs.map +1 -1
  563. package/dist/ui/components/ui/skeleton.d.cts +13 -1
  564. package/dist/ui/components/ui/skeleton.d.ts +13 -1
  565. package/dist/ui/components/ui/skeleton.js.map +1 -1
  566. package/dist/ui/components/ui/slider.cjs.map +1 -1
  567. package/dist/ui/components/ui/slider.d.cts +13 -7
  568. package/dist/ui/components/ui/slider.d.ts +13 -7
  569. package/dist/ui/components/ui/slider.js.map +1 -1
  570. package/dist/ui/components/ui/spinner.cjs.map +1 -1
  571. package/dist/ui/components/ui/spinner.d.cts +13 -1
  572. package/dist/ui/components/ui/spinner.d.ts +13 -1
  573. package/dist/ui/components/ui/spinner.js.map +1 -1
  574. package/dist/ui/components/ui/switch.cjs.map +1 -1
  575. package/dist/ui/components/ui/switch.d.cts +26 -0
  576. package/dist/ui/components/ui/switch.d.ts +26 -0
  577. package/dist/ui/components/ui/switch.js.map +1 -1
  578. package/dist/ui/components/ui/table.cjs.map +1 -1
  579. package/dist/ui/components/ui/table.d.cts +118 -2
  580. package/dist/ui/components/ui/table.d.ts +118 -2
  581. package/dist/ui/components/ui/table.js.map +1 -1
  582. package/dist/ui/components/ui/tabs-components.cjs.map +1 -1
  583. package/dist/ui/components/ui/tabs-components.d.cts +52 -5
  584. package/dist/ui/components/ui/tabs-components.d.ts +52 -5
  585. package/dist/ui/components/ui/tabs-components.js.map +1 -1
  586. package/dist/ui/components/ui/tabs-variants.cjs.map +1 -1
  587. package/dist/ui/components/ui/tabs-variants.d.cts +15 -0
  588. package/dist/ui/components/ui/tabs-variants.d.ts +15 -0
  589. package/dist/ui/components/ui/tabs-variants.js.map +1 -1
  590. package/dist/ui/components/ui/textarea.cjs.map +1 -1
  591. package/dist/ui/components/ui/textarea.d.cts +23 -0
  592. package/dist/ui/components/ui/textarea.d.ts +23 -0
  593. package/dist/ui/components/ui/textarea.js.map +1 -1
  594. package/dist/ui/components/ui/toast.cjs.map +1 -1
  595. package/dist/ui/components/ui/toast.d.cts +136 -0
  596. package/dist/ui/components/ui/toast.d.ts +136 -0
  597. package/dist/ui/components/ui/toast.js.map +1 -1
  598. package/dist/ui/components/ui/toaster.cjs.map +1 -1
  599. package/dist/ui/components/ui/toaster.d.cts +12 -3
  600. package/dist/ui/components/ui/toaster.d.ts +12 -3
  601. package/dist/ui/components/ui/toaster.js.map +1 -1
  602. package/dist/ui/components/ui/toggle-components.cjs.map +1 -1
  603. package/dist/ui/components/ui/toggle-components.d.cts +15 -0
  604. package/dist/ui/components/ui/toggle-components.d.ts +15 -0
  605. package/dist/ui/components/ui/toggle-components.js.map +1 -1
  606. package/dist/ui/components/ui/toggle-group.cjs.map +1 -1
  607. package/dist/ui/components/ui/toggle-group.d.cts +33 -0
  608. package/dist/ui/components/ui/toggle-group.d.ts +33 -0
  609. package/dist/ui/components/ui/toggle-group.js.map +1 -1
  610. package/dist/ui/components/ui/toggle-variants.cjs.map +1 -1
  611. package/dist/ui/components/ui/toggle-variants.d.cts +15 -0
  612. package/dist/ui/components/ui/toggle-variants.d.ts +15 -0
  613. package/dist/ui/components/ui/toggle-variants.js.map +1 -1
  614. package/dist/ui/components/ui/toolbar.cjs.map +1 -1
  615. package/dist/ui/components/ui/toolbar.d.cts +94 -7
  616. package/dist/ui/components/ui/toolbar.d.ts +94 -7
  617. package/dist/ui/components/ui/toolbar.js.map +1 -1
  618. package/dist/ui/components/ui/tooltip.cjs.map +1 -1
  619. package/dist/ui/components/ui/tooltip.d.cts +54 -3
  620. package/dist/ui/components/ui/tooltip.d.ts +54 -3
  621. package/dist/ui/components/ui/tooltip.js.map +1 -1
  622. package/dist/ui/lib/hooks/use-gps.cjs.map +1 -1
  623. package/dist/ui/lib/hooks/use-gps.d.cts +29 -4
  624. package/dist/ui/lib/hooks/use-gps.d.ts +29 -4
  625. package/dist/ui/lib/hooks/use-gps.js.map +1 -1
  626. package/dist/ui/lib/hooks/use-is-client.cjs.map +1 -1
  627. package/dist/ui/lib/hooks/use-is-client.d.cts +11 -2
  628. package/dist/ui/lib/hooks/use-is-client.d.ts +11 -2
  629. package/dist/ui/lib/hooks/use-is-client.js.map +1 -1
  630. package/dist/ui/lib/hooks/use-keyboard-shortcut.cjs.map +1 -1
  631. package/dist/ui/lib/hooks/use-keyboard-shortcut.d.cts +48 -18
  632. package/dist/ui/lib/hooks/use-keyboard-shortcut.d.ts +48 -18
  633. package/dist/ui/lib/hooks/use-keyboard-shortcut.js.map +1 -1
  634. package/dist/ui/lib/hooks/use-mobile.cjs.map +1 -1
  635. package/dist/ui/lib/hooks/use-mobile.d.cts +11 -3
  636. package/dist/ui/lib/hooks/use-mobile.d.ts +11 -3
  637. package/dist/ui/lib/hooks/use-mobile.js.map +1 -1
  638. package/dist/ui/lib/hooks/use-toast.cjs.map +1 -1
  639. package/dist/ui/lib/hooks/use-toast.d.cts +184 -15
  640. package/dist/ui/lib/hooks/use-toast.d.ts +184 -15
  641. package/dist/ui/lib/hooks/use-toast.js.map +1 -1
  642. package/dist/ui/lib/ime-utils.cjs.map +1 -1
  643. package/dist/ui/lib/ime-utils.d.cts +40 -13
  644. package/dist/ui/lib/ime-utils.d.ts +40 -13
  645. package/dist/ui/lib/ime-utils.js.map +1 -1
  646. package/dist/ui/lib/utils.cjs.map +1 -1
  647. package/dist/ui/lib/utils.d.cts +9 -6
  648. package/dist/ui/lib/utils.d.ts +9 -6
  649. package/dist/ui/lib/utils.js.map +1 -1
  650. package/docs/ai.md +34 -1
  651. package/docs/exports.md +5 -1
  652. package/docs/index.md +89 -16
  653. package/docs/migration.md +268 -0
  654. package/docs/request-form.md +4 -1
  655. package/docs/tools.md +4 -1
  656. package/docs/ui.md +4 -1
  657. package/llms-full.txt +499 -36
  658. package/llms.txt +4 -0
  659. package/package.json +35 -5
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorDialog.cjs","names":["Info","AlertTriangle","X","AlertCircle","useErrorStore","AppError","Dialog","DialogContent","DialogHeader","cn","DialogTitle","DialogDescription","DialogFooter","Button","require_runtime","require_ui_lib_utils","require_ui_components_ui_button_components","require_ui_components_ui_dialog","require_common_actions_ok","require_errors_code","require_errors_dialogtitle1","require_tools_lib_error_AppError","require_tools_lib_state_error_store","react_jsx_runtime","react","lucide_react","severityConfig","ErrorDialog","propError","propOpen","dialogErrors","getErrorsByMode","storeError","displayError","isOpen","handleClose","removeError","onClose","handlePrimaryAction","onPrimaryAction","handleSecondaryAction","onSecondaryAction","severity","config","Icon","open","secondaryActionLabel","testId","primaryActionLabel"],"sources":["../../../../src/tools/components/error/ErrorDialog.tsx"],"sourcesContent":["import React from 'react';\nimport { AlertCircle, X, AlertTriangle, Info } from 'lucide-react';\nimport * as m from '../../paraglide/messages.js';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../ui/dialog';\nimport { Button } from '../ui/button';\nimport { cn } from \"../../lib/utils\";\nimport { AppError, ErrorSeverity } from \"../../lib/error\";\nimport { useErrorStore } from \"../../lib/state/error-store\";\n\n/**\n * ErrorDialogProps\n * エラーダイアログのプロップス\n *\n * ## AI/Automation Features\n * - `testId`: Stable selector on dialog and buttons\n * - Pattern: `{testId}`, `{testId}-primary`, `{testId}-secondary`\n * - `data-severity`: error, warning, info, critical\n */\nexport interface ErrorDialogProps {\n /** AI/E2E Test用の安定ID / Stable test identifier */\n testId?: string;\n /** 直接表示するエラー (制御モード) */\n error?: AppError | null;\n /** 開閉状態 (制御モード) */\n open?: boolean;\n /** 閉じるときのコールバック */\n onClose?: () => void;\n /** 主要アクションのラベル。デフォルト: 'OK' */\n primaryActionLabel?: string;\n /** 主要アクションのコールバック */\n onPrimaryAction?: () => void;\n /** セカンダリアクションのラベル */\n secondaryActionLabel?: string;\n /** セカンダリアクションのコールバック */\n onSecondaryAction?: () => void;\n}\n\nconst severityConfig: Record<\n ErrorSeverity,\n {\n icon: React.ElementType;\n iconBgClass: string;\n iconClass: string;\n titleClass: string;\n }\n> = {\n info: {\n icon: Info,\n iconBgClass: 'bg-blue-500',\n iconClass: 'text-white',\n titleClass: 'text-blue-600 dark:text-blue-400',\n },\n warning: {\n icon: AlertTriangle,\n iconBgClass: 'bg-amber-500',\n iconClass: 'text-white',\n titleClass: 'text-amber-600 dark:text-amber-400',\n },\n error: {\n icon: X,\n iconBgClass: 'bg-red-500',\n iconClass: 'text-white',\n titleClass: 'text-red-600 dark:text-red-400',\n },\n critical: {\n icon: AlertCircle,\n iconBgClass: 'bg-red-600',\n iconClass: 'text-white',\n titleClass: 'text-red-600 dark:text-red-400',\n },\n};\n\n/**\n * ErrorDialog Component\n * エラーダイアログコンポーネント\n *\n * Modal dialog for important errors.\n * 重要なエラーをモーダルで表示します。\n *\n * ## AI/Automation Features\n * - `data-testid`: Container and action buttons\n * - `data-severity`: Error severity level\n *\n * @example With testId\n * ```tsx\n * <ErrorDialog\n * testId=\"api-error\"\n * error={error}\n * open={isOpen}\n * onClose={() => setIsOpen(false)}\n * primaryActionLabel=\"再試行\"\n * onPrimaryAction={handleRetry}\n * />\n * // Container: data-testid=\"api-error\"\n * // Primary button: data-testid=\"api-error-primary\"\n * ```\n */\nexport function ErrorDialog({\n testId,\n error: propError,\n open: propOpen,\n onClose,\n primaryActionLabel,\n onPrimaryAction,\n secondaryActionLabel,\n onSecondaryAction,\n}: ErrorDialogProps) {\n const { removeError, getErrorsByMode } = useErrorStore();\n\n // Store からダイアログモードのエラーを取得 (制御モードでない場合)\n const dialogErrors = getErrorsByMode('dialog');\n const storeError = dialogErrors.length > 0 ? dialogErrors[0] : null;\n\n // 制御モードか Store モードかで表示するエラーを決定\n const displayError = propError ?? storeError?.error ?? null;\n const isOpen = propOpen ?? storeError !== null;\n\n const handleClose = () => {\n if (storeError) {\n removeError(storeError.id);\n }\n onClose?.();\n };\n\n const handlePrimaryAction = () => {\n onPrimaryAction?.();\n handleClose();\n };\n\n const handleSecondaryAction = () => {\n onSecondaryAction?.();\n handleClose();\n };\n\n if (!displayError) {\n return null;\n }\n\n const severity = displayError instanceof AppError ? displayError.severity : 'error';\n const config = severityConfig[severity];\n const Icon = config.icon;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <DialogContent testId={testId} data-severity={severity} className='sm:max-w-md'>\n <DialogHeader>\n <div className='flex items-center gap-3'>\n <div className={cn('rounded-full p-1.5', config.iconBgClass)}>\n <Icon className={cn('h-4 w-4', config.iconClass)} aria-hidden='true' />\n </div>\n <DialogTitle className={config.titleClass}>\n {m.errors_dialogTitle({ defaultValue: 'エラー' })}\n </DialogTitle>\n </div>\n </DialogHeader>\n <DialogDescription className='text-foreground'>{displayError.message}</DialogDescription>\n {displayError instanceof AppError &&\n displayError.code &&\n displayError.code !== 'error/unknown' && (\n <p className='text-xs text-muted-foreground mt-2'>\n {m.errors_code({ defaultValue: 'コード' })}: {displayError.code}\n </p>\n )}\n <DialogFooter className='gap-2 sm:gap-0'>\n {secondaryActionLabel && (\n <Button\n testId={testId ? `${testId}-secondary` : undefined}\n variant='outline'\n onClick={handleSecondaryAction}\n >\n {secondaryActionLabel}\n </Button>\n )}\n <Button testId={testId ? `${testId}-primary` : undefined} onClick={handlePrimaryAction}>\n {primaryActionLabel ?? m.common_actions_ok({ defaultValue: 'OK' })}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"A,6oBA4CA,IAAM0B,EAQF,CACF,KAAM,CACJ,KAAM1B,EAAAA,KACN,YAAa,cACb,UAAW,aACX,WAAY,kCACd,EACA,QAAS,CACP,KAAMC,EAAAA,cACN,YAAa,eACb,UAAW,aACX,WAAY,oCACd,EACA,MAAO,CACL,KAAMC,EAAAA,EACN,YAAa,aACb,UAAW,aACX,WAAY,gCACd,EACA,SAAU,CACR,KAAMC,EAAAA,YACN,YAAa,aACb,UAAW,aACX,WAAY,gCACd,CACF,EA2BA,SAAgBwB,EAAY,CAC1B,SACA,MAAOC,EACP,KAAMC,EACN,UACA,qBACA,kBACA,uBACA,qBACmB,CACnB,GAAM,CAAE,cAAa,mBAAoBzB,EAAAA,cAAc,EAGjD0B,EAAeC,EAAgB,QAAQ,EACvCC,EAAaF,EAAa,OAAS,EAAIA,EAAa,GAAK,KAGzDG,EAAeL,GAAaI,GAAY,OAAS,KACjDE,EAASL,GAAYG,IAAe,KAEpCG,MAAoB,CACpBH,GACFI,EAAYJ,EAAW,EAAE,EAE3BK,IAAU,CACZ,EAEMC,MAA4B,CAChCC,IAAkB,EAClBJ,EAAY,CACd,EAEMK,MAA8B,CAClCC,IAAoB,EACpBN,EAAY,CACd,EAEA,GAAI,CAACF,EACH,OAAO,KAGT,IAAMS,EAAWT,aAAwB5B,EAAAA,SAAW4B,EAAa,SAAW,QACtEU,EAASjB,EAAegB,GACxBE,EAAOD,EAAO,KAEpB,OACE,EAAApB,EAAA,IAAA,CAACjB,EAAAA,OAAD,CAAQ,KAAM4B,EAAQ,aAAe,GAAS,CAACW,GAAQV,EAAY,EACjE,UAAA,EAAAZ,EAAA,KAAA,CAAChB,EAAAA,cAAD,CAAuB,SAAQ,gBAAemC,EAAU,UAAU,cAAlE,SAAA,EACE,EAAAnB,EAAA,IAAA,CAACf,EAAAA,aAAD,CAAA,UACE,EAAAe,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,0BAAf,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWd,EAAAA,GAAG,qBAAsBkC,EAAO,WAAW,EACzD,UAAA,EAAApB,EAAA,IAAA,CAACqB,EAAD,CAAM,UAAWnC,EAAAA,GAAG,UAAWkC,EAAO,SAAS,EAAG,cAAY,MAAQ,CAAA,CACnE,CAAA,GACL,EAAApB,EAAA,IAAA,CAACb,EAAAA,YAAD,CAAa,UAAWiC,EAAO,WAC5B,SAAAvB,EAAA,mBAAqB,CAAE,aAAc,KAAM,CAAC,CAClC,CAAA,CACV,CACO,CAAA,CAAA,CAAA,GACd,EAAAG,EAAA,IAAA,CAACZ,EAAAA,kBAAD,CAAmB,UAAU,kBAAmB,SAAAsB,EAAa,OAA2B,CAAA,EACvFA,aAAwB5B,EAAAA,UACvB4B,EAAa,MACbA,EAAa,OAAS,kBACpB,EAAAV,EAAA,KAAA,CAAC,IAAD,CAAG,UAAU,qCAAb,SAAA,CACiBJ,EAAA,YAAA,CAAE,aAAc,KAAM,CAAC,EAAE,KAAGc,EAAa,IACvD,C,IAEP,EAAAV,EAAA,KAAA,CAACX,EAAAA,aAAD,CAAc,UAAU,iBAAxB,SAAA,CACGkC,IACC,EAAAvB,EAAA,IAAA,CAACV,EAAAA,OAAD,CACE,OAAQkC,EAAS,GAAGA,EAAO,YAAc,IAAA,GACzC,QAAQ,UACR,QAASP,EAER,SAAAM,CACK,CAAA,GAEV,EAAAvB,EAAA,IAAA,CAACV,EAAAA,OAAD,CAAQ,OAAQkC,EAAS,GAAGA,EAAO,UAAY,IAAA,GAAW,QAAST,EAChE,SAAAU,GAAA9B,EAAA,kBAA0C,CAAE,aAAc,IAAK,CAAC,CAC3D,CAAA,CACI,C,EACD,C,EACT,CAAA,CAEZ,C"}
1
+ {"version":3,"file":"ErrorDialog.cjs","names":["Info","AlertTriangle","X","AlertCircle","useErrorStore","AppError","Dialog","DialogContent","DialogHeader","cn","DialogTitle","DialogDescription","DialogFooter","Button","require_runtime","require_ui_lib_utils","require_ui_components_ui_button_components","require_ui_components_ui_dialog","require_common_actions_ok","require_errors_code","require_errors_dialogtitle1","require_tools_lib_error_AppError","require_tools_lib_state_error_store","react_jsx_runtime","react","lucide_react","severityConfig","ErrorDialog","propError","propOpen","dialogErrors","getErrorsByMode","storeError","displayError","isOpen","handleClose","removeError","onClose","handlePrimaryAction","onPrimaryAction","handleSecondaryAction","onSecondaryAction","severity","config","Icon","open","secondaryActionLabel","testId","primaryActionLabel"],"sources":["../../../../src/tools/components/error/ErrorDialog.tsx"],"sourcesContent":["import React from 'react';\nimport { AlertCircle, X, AlertTriangle, Info } from 'lucide-react';\nimport * as m from '../../paraglide/messages.js';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../ui/dialog';\nimport { Button } from '../ui/button';\nimport { cn } from \"../../lib/utils\";\nimport { AppError, ErrorSeverity } from \"../../lib/error\";\nimport { useErrorStore } from \"../../lib/state/error-store\";\n\n/**\n * ErrorDialogProps\n * エラーダイアログのプロップス\n *\n * ## AI/Automation Features\n * - `testId`: Stable selector on dialog and buttons\n * - Pattern: `{testId}`, `{testId}-primary`, `{testId}-secondary`\n * - `data-severity`: error, warning, info, critical\n */\nexport interface ErrorDialogProps {\n /** AI/E2E Test用の安定ID / Stable test identifier */\n testId?: string;\n /** 直接表示するエラー (制御モード) */\n error?: AppError | null;\n /** 開閉状態 (制御モード) */\n open?: boolean;\n /** 閉じるときのコールバック */\n onClose?: () => void;\n /** 主要アクションのラベル。デフォルト: 'OK' */\n primaryActionLabel?: string;\n /** 主要アクションのコールバック */\n onPrimaryAction?: () => void;\n /** セカンダリアクションのラベル */\n secondaryActionLabel?: string;\n /** セカンダリアクションのコールバック */\n onSecondaryAction?: () => void;\n}\n\nconst severityConfig: Record<\n ErrorSeverity,\n {\n icon: React.ElementType;\n iconBgClass: string;\n iconClass: string;\n titleClass: string;\n }\n> = {\n info: {\n icon: Info,\n iconBgClass: 'bg-blue-500',\n iconClass: 'text-white',\n titleClass: 'text-blue-600 dark:text-blue-400',\n },\n warning: {\n icon: AlertTriangle,\n iconBgClass: 'bg-amber-500',\n iconClass: 'text-white',\n titleClass: 'text-amber-800 dark:text-amber-400',\n },\n error: {\n icon: X,\n iconBgClass: 'bg-red-500',\n iconClass: 'text-white',\n titleClass: 'text-red-600 dark:text-red-400',\n },\n critical: {\n icon: AlertCircle,\n iconBgClass: 'bg-red-600',\n iconClass: 'text-white',\n titleClass: 'text-red-600 dark:text-red-400',\n },\n};\n\n/**\n * ErrorDialog Component\n * エラーダイアログコンポーネント\n *\n * Modal dialog for important errors.\n * 重要なエラーをモーダルで表示します。\n *\n * ## AI/Automation Features\n * - `data-testid`: Container and action buttons\n * - `data-severity`: Error severity level\n *\n * @example With testId\n * ```tsx\n * <ErrorDialog\n * testId=\"api-error\"\n * error={error}\n * open={isOpen}\n * onClose={() => setIsOpen(false)}\n * primaryActionLabel=\"再試行\"\n * onPrimaryAction={handleRetry}\n * />\n * // Container: data-testid=\"api-error\"\n * // Primary button: data-testid=\"api-error-primary\"\n * ```\n */\nexport function ErrorDialog({\n testId,\n error: propError,\n open: propOpen,\n onClose,\n primaryActionLabel,\n onPrimaryAction,\n secondaryActionLabel,\n onSecondaryAction,\n}: ErrorDialogProps) {\n const { removeError, getErrorsByMode } = useErrorStore();\n\n // Store からダイアログモードのエラーを取得 (制御モードでない場合)\n const dialogErrors = getErrorsByMode('dialog');\n const storeError = dialogErrors.length > 0 ? dialogErrors[0] : null;\n\n // 制御モードか Store モードかで表示するエラーを決定\n const displayError = propError ?? storeError?.error ?? null;\n const isOpen = propOpen ?? storeError !== null;\n\n const handleClose = () => {\n if (storeError) {\n removeError(storeError.id);\n }\n onClose?.();\n };\n\n const handlePrimaryAction = () => {\n onPrimaryAction?.();\n handleClose();\n };\n\n const handleSecondaryAction = () => {\n onSecondaryAction?.();\n handleClose();\n };\n\n if (!displayError) {\n return null;\n }\n\n const severity = displayError instanceof AppError ? displayError.severity : 'error';\n const config = severityConfig[severity];\n const Icon = config.icon;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <DialogContent testId={testId} data-severity={severity} className='sm:max-w-md'>\n <DialogHeader>\n <div className='flex items-center gap-3'>\n <div className={cn('rounded-full p-1.5', config.iconBgClass)}>\n <Icon className={cn('h-4 w-4', config.iconClass)} aria-hidden='true' />\n </div>\n <DialogTitle className={config.titleClass}>\n {m.errors_dialogTitle({ defaultValue: 'エラー' })}\n </DialogTitle>\n </div>\n </DialogHeader>\n <DialogDescription className='text-foreground'>{displayError.message}</DialogDescription>\n {displayError instanceof AppError &&\n displayError.code &&\n displayError.code !== 'error/unknown' && (\n <p className='text-xs text-muted-foreground mt-2'>\n {m.errors_code({ defaultValue: 'コード' })}: {displayError.code}\n </p>\n )}\n <DialogFooter className='gap-2 sm:gap-0'>\n {secondaryActionLabel && (\n <Button\n testId={testId ? `${testId}-secondary` : undefined}\n variant='outline'\n onClick={handleSecondaryAction}\n >\n {secondaryActionLabel}\n </Button>\n )}\n <Button testId={testId ? `${testId}-primary` : undefined} onClick={handlePrimaryAction}>\n {primaryActionLabel ?? m.common_actions_ok({ defaultValue: 'OK' })}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"A,6oBA4CA,IAAM0B,EAQF,CACF,KAAM,CACJ,KAAM1B,EAAAA,KACN,YAAa,cACb,UAAW,aACX,WAAY,kCACd,EACA,QAAS,CACP,KAAMC,EAAAA,cACN,YAAa,eACb,UAAW,aACX,WAAY,oCACd,EACA,MAAO,CACL,KAAMC,EAAAA,EACN,YAAa,aACb,UAAW,aACX,WAAY,gCACd,EACA,SAAU,CACR,KAAMC,EAAAA,YACN,YAAa,aACb,UAAW,aACX,WAAY,gCACd,CACF,EA2BA,SAAgBwB,EAAY,CAC1B,SACA,MAAOC,EACP,KAAMC,EACN,UACA,qBACA,kBACA,uBACA,qBACmB,CACnB,GAAM,CAAE,cAAa,mBAAoBzB,EAAAA,cAAc,EAGjD0B,EAAeC,EAAgB,QAAQ,EACvCC,EAAaF,EAAa,OAAS,EAAIA,EAAa,GAAK,KAGzDG,EAAeL,GAAaI,GAAY,OAAS,KACjDE,EAASL,GAAYG,IAAe,KAEpCG,MAAoB,CACpBH,GACFI,EAAYJ,EAAW,EAAE,EAE3BK,IAAU,CACZ,EAEMC,MAA4B,CAChCC,IAAkB,EAClBJ,EAAY,CACd,EAEMK,MAA8B,CAClCC,IAAoB,EACpBN,EAAY,CACd,EAEA,GAAI,CAACF,EACH,OAAO,KAGT,IAAMS,EAAWT,aAAwB5B,EAAAA,SAAW4B,EAAa,SAAW,QACtEU,EAASjB,EAAegB,GACxBE,EAAOD,EAAO,KAEpB,OACE,EAAApB,EAAA,IAAA,CAACjB,EAAAA,OAAD,CAAQ,KAAM4B,EAAQ,aAAe,GAAS,CAACW,GAAQV,EAAY,EACjE,UAAA,EAAAZ,EAAA,KAAA,CAAChB,EAAAA,cAAD,CAAuB,SAAQ,gBAAemC,EAAU,UAAU,cAAlE,SAAA,EACE,EAAAnB,EAAA,IAAA,CAACf,EAAAA,aAAD,CAAA,UACE,EAAAe,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,0BAAf,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWd,EAAAA,GAAG,qBAAsBkC,EAAO,WAAW,EACzD,UAAA,EAAApB,EAAA,IAAA,CAACqB,EAAD,CAAM,UAAWnC,EAAAA,GAAG,UAAWkC,EAAO,SAAS,EAAG,cAAY,MAAQ,CAAA,CACnE,CAAA,GACL,EAAApB,EAAA,IAAA,CAACb,EAAAA,YAAD,CAAa,UAAWiC,EAAO,WAC5B,SAAAvB,EAAA,mBAAqB,CAAE,aAAc,KAAM,CAAC,CAClC,CAAA,CACV,CACO,CAAA,CAAA,CAAA,GACd,EAAAG,EAAA,IAAA,CAACZ,EAAAA,kBAAD,CAAmB,UAAU,kBAAmB,SAAAsB,EAAa,OAA2B,CAAA,EACvFA,aAAwB5B,EAAAA,UACvB4B,EAAa,MACbA,EAAa,OAAS,kBACpB,EAAAV,EAAA,KAAA,CAAC,IAAD,CAAG,UAAU,qCAAb,SAAA,CACiBJ,EAAA,YAAA,CAAE,aAAc,KAAM,CAAC,EAAE,KAAGc,EAAa,IACvD,C,IAEP,EAAAV,EAAA,KAAA,CAACX,EAAAA,aAAD,CAAc,UAAU,iBAAxB,SAAA,CACGkC,IACC,EAAAvB,EAAA,IAAA,CAACV,EAAAA,OAAD,CACE,OAAQkC,EAAS,GAAGA,EAAO,YAAc,IAAA,GACzC,QAAQ,UACR,QAASP,EAER,SAAAM,CACK,CAAA,GAEV,EAAAvB,EAAA,IAAA,CAACV,EAAAA,OAAD,CAAQ,OAAQkC,EAAS,GAAGA,EAAO,UAAY,IAAA,GAAW,QAAST,EAChE,SAAAU,GAAA9B,EAAA,kBAA0C,CAAE,aAAc,IAAK,CAAC,CAC3D,CAAA,CACI,C,EACD,C,EACT,CAAA,CAEZ,C"}
@@ -22,7 +22,7 @@ var y = {
22
22
  icon: g,
23
23
  iconBgClass: "bg-amber-500",
24
24
  iconClass: "text-white",
25
- titleClass: "text-amber-600 dark:text-amber-400"
25
+ titleClass: "text-amber-800 dark:text-amber-400"
26
26
  },
27
27
  error: {
28
28
  icon: v,
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorDialog.js","names":["m.errors_dialogTitle","m.errors_code","m.common_actions_ok","errors_dialogtitle1","severityConfig","Info","AlertTriangle","X","AlertCircle","ErrorDialog","propError","propOpen","useErrorStore","dialogErrors","getErrorsByMode","storeError","displayError","isOpen","handleClose","removeError","onClose","handlePrimaryAction","onPrimaryAction","handleSecondaryAction","onSecondaryAction","severity","AppError","config","Icon","Dialog","open","DialogContent","DialogHeader","cn","DialogTitle","DialogDescription","errors_code","DialogFooter","secondaryActionLabel","Button","testId","primaryActionLabel","common_actions_ok"],"sources":["../../../../src/tools/components/error/ErrorDialog.tsx"],"sourcesContent":["import React from 'react';\nimport { AlertCircle, X, AlertTriangle, Info } from 'lucide-react';\nimport * as m from '../../paraglide/messages.js';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../ui/dialog';\nimport { Button } from '../ui/button';\nimport { cn } from \"../../lib/utils\";\nimport { AppError, ErrorSeverity } from \"../../lib/error\";\nimport { useErrorStore } from \"../../lib/state/error-store\";\n\n/**\n * ErrorDialogProps\n * エラーダイアログのプロップス\n *\n * ## AI/Automation Features\n * - `testId`: Stable selector on dialog and buttons\n * - Pattern: `{testId}`, `{testId}-primary`, `{testId}-secondary`\n * - `data-severity`: error, warning, info, critical\n */\nexport interface ErrorDialogProps {\n /** AI/E2E Test用の安定ID / Stable test identifier */\n testId?: string;\n /** 直接表示するエラー (制御モード) */\n error?: AppError | null;\n /** 開閉状態 (制御モード) */\n open?: boolean;\n /** 閉じるときのコールバック */\n onClose?: () => void;\n /** 主要アクションのラベル。デフォルト: 'OK' */\n primaryActionLabel?: string;\n /** 主要アクションのコールバック */\n onPrimaryAction?: () => void;\n /** セカンダリアクションのラベル */\n secondaryActionLabel?: string;\n /** セカンダリアクションのコールバック */\n onSecondaryAction?: () => void;\n}\n\nconst severityConfig: Record<\n ErrorSeverity,\n {\n icon: React.ElementType;\n iconBgClass: string;\n iconClass: string;\n titleClass: string;\n }\n> = {\n info: {\n icon: Info,\n iconBgClass: 'bg-blue-500',\n iconClass: 'text-white',\n titleClass: 'text-blue-600 dark:text-blue-400',\n },\n warning: {\n icon: AlertTriangle,\n iconBgClass: 'bg-amber-500',\n iconClass: 'text-white',\n titleClass: 'text-amber-600 dark:text-amber-400',\n },\n error: {\n icon: X,\n iconBgClass: 'bg-red-500',\n iconClass: 'text-white',\n titleClass: 'text-red-600 dark:text-red-400',\n },\n critical: {\n icon: AlertCircle,\n iconBgClass: 'bg-red-600',\n iconClass: 'text-white',\n titleClass: 'text-red-600 dark:text-red-400',\n },\n};\n\n/**\n * ErrorDialog Component\n * エラーダイアログコンポーネント\n *\n * Modal dialog for important errors.\n * 重要なエラーをモーダルで表示します。\n *\n * ## AI/Automation Features\n * - `data-testid`: Container and action buttons\n * - `data-severity`: Error severity level\n *\n * @example With testId\n * ```tsx\n * <ErrorDialog\n * testId=\"api-error\"\n * error={error}\n * open={isOpen}\n * onClose={() => setIsOpen(false)}\n * primaryActionLabel=\"再試行\"\n * onPrimaryAction={handleRetry}\n * />\n * // Container: data-testid=\"api-error\"\n * // Primary button: data-testid=\"api-error-primary\"\n * ```\n */\nexport function ErrorDialog({\n testId,\n error: propError,\n open: propOpen,\n onClose,\n primaryActionLabel,\n onPrimaryAction,\n secondaryActionLabel,\n onSecondaryAction,\n}: ErrorDialogProps) {\n const { removeError, getErrorsByMode } = useErrorStore();\n\n // Store からダイアログモードのエラーを取得 (制御モードでない場合)\n const dialogErrors = getErrorsByMode('dialog');\n const storeError = dialogErrors.length > 0 ? dialogErrors[0] : null;\n\n // 制御モードか Store モードかで表示するエラーを決定\n const displayError = propError ?? storeError?.error ?? null;\n const isOpen = propOpen ?? storeError !== null;\n\n const handleClose = () => {\n if (storeError) {\n removeError(storeError.id);\n }\n onClose?.();\n };\n\n const handlePrimaryAction = () => {\n onPrimaryAction?.();\n handleClose();\n };\n\n const handleSecondaryAction = () => {\n onSecondaryAction?.();\n handleClose();\n };\n\n if (!displayError) {\n return null;\n }\n\n const severity = displayError instanceof AppError ? displayError.severity : 'error';\n const config = severityConfig[severity];\n const Icon = config.icon;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <DialogContent testId={testId} data-severity={severity} className='sm:max-w-md'>\n <DialogHeader>\n <div className='flex items-center gap-3'>\n <div className={cn('rounded-full p-1.5', config.iconBgClass)}>\n <Icon className={cn('h-4 w-4', config.iconClass)} aria-hidden='true' />\n </div>\n <DialogTitle className={config.titleClass}>\n {m.errors_dialogTitle({ defaultValue: 'エラー' })}\n </DialogTitle>\n </div>\n </DialogHeader>\n <DialogDescription className='text-foreground'>{displayError.message}</DialogDescription>\n {displayError instanceof AppError &&\n displayError.code &&\n displayError.code !== 'error/unknown' && (\n <p className='text-xs text-muted-foreground mt-2'>\n {m.errors_code({ defaultValue: 'コード' })}: {displayError.code}\n </p>\n )}\n <DialogFooter className='gap-2 sm:gap-0'>\n {secondaryActionLabel && (\n <Button\n testId={testId ? `${testId}-secondary` : undefined}\n variant='outline'\n onClick={handleSecondaryAction}\n >\n {secondaryActionLabel}\n </Button>\n )}\n <Button testId={testId ? `${testId}-primary` : undefined} onClick={handlePrimaryAction}>\n {primaryActionLabel ?? m.common_actions_ok({ defaultValue: 'OK' })}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AA4CA,IAAMI,IAQF;CACF,MAAM;EACJ,MAAMC;EACN,aAAa;EACb,WAAW;EACX,YAAY;CACd;CACA,SAAS;EACP,MAAMC;EACN,aAAa;EACb,WAAW;EACX,YAAY;CACd;CACA,OAAO;EACL,MAAMC;EACN,aAAa;EACb,WAAW;EACX,YAAY;CACd;CACA,UAAU;EACR,MAAMC;EACN,aAAa;EACb,WAAW;EACX,YAAY;CACd;AACF;AA2BA,SAAgBC,EAAY,EAC1B,WACA,OAAOC,GACP,MAAMC,GACN,YACA,uBACA,oBACA,yBACA,wBACmB;CACnB,IAAM,EAAE,gBAAa,uBAAoBC,EAAc,GAGjDC,IAAeC,EAAgB,QAAQ,GACvCC,IAAaF,EAAa,SAAS,IAAIA,EAAa,KAAK,MAGzDG,IAAeN,KAAaK,GAAY,SAAS,MACjDE,IAASN,KAAYI,MAAe,MAEpCG,UAAoB;EAIxB,AAHIH,KACFI,EAAYJ,EAAW,EAAE,GAE3BK,IAAU;CACZ,GAEMC,UAA4B;EAEhC,AADAC,IAAkB,GAClBJ,EAAY;CACd,GAEMK,UAA8B;EAElC,AADAC,IAAoB,GACpBN,EAAY;CACd;CAEA,IAAI,CAACF,GACH,OAAO;CAGT,IAAMS,IAAWT,aAAwBU,IAAWV,EAAa,WAAW,SACtEW,IAASvB,EAAeqB,IACxBG,IAAOD,EAAO;CAEpB,OACE,kBAACE,GAAD;EAAQ,MAAMZ;EAAQ,eAAe,MAAS,CAACa,KAAQZ,EAAY;EACjE,UAAA,kBAACa,GAAD;GAAuB;GAAQ,iBAAeN;GAAU,WAAU;GAAlE,UAAA;IACE,kBAACO,GAAD,EAAA,UACE,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAAC,OAAD;MAAK,WAAWC,EAAG,sBAAsBN,EAAO,WAAW;MACzD,UAAA,kBAACC,GAAD;OAAM,WAAWK,EAAG,WAAWN,EAAO,SAAS;OAAG,eAAY;MAAQ,CAAA;KACnE,CAAA,GACL,kBAACO,GAAD;MAAa,WAAWP,EAAO;MAC5B,UAAA3B,EAAqB,EAAE,cAAc,MAAM,CAAC;KAClC,CAAA,CACV;IACO,CAAA,EAAA,CAAA;IACd,kBAACmC,GAAD;KAAmB,WAAU;KAAmB,UAAAnB,EAAa;IAA2B,CAAA;IACvFA,aAAwBU,KACvBV,EAAa,QACbA,EAAa,SAAS,mBACpB,kBAAC,KAAD;KAAG,WAAU;KAAb,UAAA;MACGf,EAAc,EAAE,cAAc,MAAM,CAAC;MAAE;MAAGe,EAAa;KACvD;;IAEP,kBAACqB,GAAD;KAAc,WAAU;KAAxB,UAAA,CACGC,KACC,kBAACC,GAAD;MACE,QAAQC,IAAS,GAAGA,EAAO,cAAc,KAAA;MACzC,SAAQ;MACR,SAASjB;MAER,UAAAe;KACK,CAAA,GAEV,kBAACC,GAAD;MAAQ,QAAQC,IAAS,GAAGA,EAAO,YAAY,KAAA;MAAW,SAASnB;MAChE,UAAAoB,KAAsBvC,EAAoB,EAAE,cAAc,KAAK,CAAC;KAC3D,CAAA,CACI;;GACD;;CACT,CAAA;AAEZ"}
1
+ {"version":3,"file":"ErrorDialog.js","names":["m.errors_dialogTitle","m.errors_code","m.common_actions_ok","errors_dialogtitle1","severityConfig","Info","AlertTriangle","X","AlertCircle","ErrorDialog","propError","propOpen","useErrorStore","dialogErrors","getErrorsByMode","storeError","displayError","isOpen","handleClose","removeError","onClose","handlePrimaryAction","onPrimaryAction","handleSecondaryAction","onSecondaryAction","severity","AppError","config","Icon","Dialog","open","DialogContent","DialogHeader","cn","DialogTitle","DialogDescription","errors_code","DialogFooter","secondaryActionLabel","Button","testId","primaryActionLabel","common_actions_ok"],"sources":["../../../../src/tools/components/error/ErrorDialog.tsx"],"sourcesContent":["import React from 'react';\nimport { AlertCircle, X, AlertTriangle, Info } from 'lucide-react';\nimport * as m from '../../paraglide/messages.js';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../ui/dialog';\nimport { Button } from '../ui/button';\nimport { cn } from \"../../lib/utils\";\nimport { AppError, ErrorSeverity } from \"../../lib/error\";\nimport { useErrorStore } from \"../../lib/state/error-store\";\n\n/**\n * ErrorDialogProps\n * エラーダイアログのプロップス\n *\n * ## AI/Automation Features\n * - `testId`: Stable selector on dialog and buttons\n * - Pattern: `{testId}`, `{testId}-primary`, `{testId}-secondary`\n * - `data-severity`: error, warning, info, critical\n */\nexport interface ErrorDialogProps {\n /** AI/E2E Test用の安定ID / Stable test identifier */\n testId?: string;\n /** 直接表示するエラー (制御モード) */\n error?: AppError | null;\n /** 開閉状態 (制御モード) */\n open?: boolean;\n /** 閉じるときのコールバック */\n onClose?: () => void;\n /** 主要アクションのラベル。デフォルト: 'OK' */\n primaryActionLabel?: string;\n /** 主要アクションのコールバック */\n onPrimaryAction?: () => void;\n /** セカンダリアクションのラベル */\n secondaryActionLabel?: string;\n /** セカンダリアクションのコールバック */\n onSecondaryAction?: () => void;\n}\n\nconst severityConfig: Record<\n ErrorSeverity,\n {\n icon: React.ElementType;\n iconBgClass: string;\n iconClass: string;\n titleClass: string;\n }\n> = {\n info: {\n icon: Info,\n iconBgClass: 'bg-blue-500',\n iconClass: 'text-white',\n titleClass: 'text-blue-600 dark:text-blue-400',\n },\n warning: {\n icon: AlertTriangle,\n iconBgClass: 'bg-amber-500',\n iconClass: 'text-white',\n titleClass: 'text-amber-800 dark:text-amber-400',\n },\n error: {\n icon: X,\n iconBgClass: 'bg-red-500',\n iconClass: 'text-white',\n titleClass: 'text-red-600 dark:text-red-400',\n },\n critical: {\n icon: AlertCircle,\n iconBgClass: 'bg-red-600',\n iconClass: 'text-white',\n titleClass: 'text-red-600 dark:text-red-400',\n },\n};\n\n/**\n * ErrorDialog Component\n * エラーダイアログコンポーネント\n *\n * Modal dialog for important errors.\n * 重要なエラーをモーダルで表示します。\n *\n * ## AI/Automation Features\n * - `data-testid`: Container and action buttons\n * - `data-severity`: Error severity level\n *\n * @example With testId\n * ```tsx\n * <ErrorDialog\n * testId=\"api-error\"\n * error={error}\n * open={isOpen}\n * onClose={() => setIsOpen(false)}\n * primaryActionLabel=\"再試行\"\n * onPrimaryAction={handleRetry}\n * />\n * // Container: data-testid=\"api-error\"\n * // Primary button: data-testid=\"api-error-primary\"\n * ```\n */\nexport function ErrorDialog({\n testId,\n error: propError,\n open: propOpen,\n onClose,\n primaryActionLabel,\n onPrimaryAction,\n secondaryActionLabel,\n onSecondaryAction,\n}: ErrorDialogProps) {\n const { removeError, getErrorsByMode } = useErrorStore();\n\n // Store からダイアログモードのエラーを取得 (制御モードでない場合)\n const dialogErrors = getErrorsByMode('dialog');\n const storeError = dialogErrors.length > 0 ? dialogErrors[0] : null;\n\n // 制御モードか Store モードかで表示するエラーを決定\n const displayError = propError ?? storeError?.error ?? null;\n const isOpen = propOpen ?? storeError !== null;\n\n const handleClose = () => {\n if (storeError) {\n removeError(storeError.id);\n }\n onClose?.();\n };\n\n const handlePrimaryAction = () => {\n onPrimaryAction?.();\n handleClose();\n };\n\n const handleSecondaryAction = () => {\n onSecondaryAction?.();\n handleClose();\n };\n\n if (!displayError) {\n return null;\n }\n\n const severity = displayError instanceof AppError ? displayError.severity : 'error';\n const config = severityConfig[severity];\n const Icon = config.icon;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <DialogContent testId={testId} data-severity={severity} className='sm:max-w-md'>\n <DialogHeader>\n <div className='flex items-center gap-3'>\n <div className={cn('rounded-full p-1.5', config.iconBgClass)}>\n <Icon className={cn('h-4 w-4', config.iconClass)} aria-hidden='true' />\n </div>\n <DialogTitle className={config.titleClass}>\n {m.errors_dialogTitle({ defaultValue: 'エラー' })}\n </DialogTitle>\n </div>\n </DialogHeader>\n <DialogDescription className='text-foreground'>{displayError.message}</DialogDescription>\n {displayError instanceof AppError &&\n displayError.code &&\n displayError.code !== 'error/unknown' && (\n <p className='text-xs text-muted-foreground mt-2'>\n {m.errors_code({ defaultValue: 'コード' })}: {displayError.code}\n </p>\n )}\n <DialogFooter className='gap-2 sm:gap-0'>\n {secondaryActionLabel && (\n <Button\n testId={testId ? `${testId}-secondary` : undefined}\n variant='outline'\n onClick={handleSecondaryAction}\n >\n {secondaryActionLabel}\n </Button>\n )}\n <Button testId={testId ? `${testId}-primary` : undefined} onClick={handlePrimaryAction}>\n {primaryActionLabel ?? m.common_actions_ok({ defaultValue: 'OK' })}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AA4CA,IAAMI,IAQF;CACF,MAAM;EACJ,MAAMC;EACN,aAAa;EACb,WAAW;EACX,YAAY;CACd;CACA,SAAS;EACP,MAAMC;EACN,aAAa;EACb,WAAW;EACX,YAAY;CACd;CACA,OAAO;EACL,MAAMC;EACN,aAAa;EACb,WAAW;EACX,YAAY;CACd;CACA,UAAU;EACR,MAAMC;EACN,aAAa;EACb,WAAW;EACX,YAAY;CACd;AACF;AA2BA,SAAgBC,EAAY,EAC1B,WACA,OAAOC,GACP,MAAMC,GACN,YACA,uBACA,oBACA,yBACA,wBACmB;CACnB,IAAM,EAAE,gBAAa,uBAAoBC,EAAc,GAGjDC,IAAeC,EAAgB,QAAQ,GACvCC,IAAaF,EAAa,SAAS,IAAIA,EAAa,KAAK,MAGzDG,IAAeN,KAAaK,GAAY,SAAS,MACjDE,IAASN,KAAYI,MAAe,MAEpCG,UAAoB;EAIxB,AAHIH,KACFI,EAAYJ,EAAW,EAAE,GAE3BK,IAAU;CACZ,GAEMC,UAA4B;EAEhC,AADAC,IAAkB,GAClBJ,EAAY;CACd,GAEMK,UAA8B;EAElC,AADAC,IAAoB,GACpBN,EAAY;CACd;CAEA,IAAI,CAACF,GACH,OAAO;CAGT,IAAMS,IAAWT,aAAwBU,IAAWV,EAAa,WAAW,SACtEW,IAASvB,EAAeqB,IACxBG,IAAOD,EAAO;CAEpB,OACE,kBAACE,GAAD;EAAQ,MAAMZ;EAAQ,eAAe,MAAS,CAACa,KAAQZ,EAAY;EACjE,UAAA,kBAACa,GAAD;GAAuB;GAAQ,iBAAeN;GAAU,WAAU;GAAlE,UAAA;IACE,kBAACO,GAAD,EAAA,UACE,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAAC,OAAD;MAAK,WAAWC,EAAG,sBAAsBN,EAAO,WAAW;MACzD,UAAA,kBAACC,GAAD;OAAM,WAAWK,EAAG,WAAWN,EAAO,SAAS;OAAG,eAAY;MAAQ,CAAA;KACnE,CAAA,GACL,kBAACO,GAAD;MAAa,WAAWP,EAAO;MAC5B,UAAA3B,EAAqB,EAAE,cAAc,MAAM,CAAC;KAClC,CAAA,CACV;IACO,CAAA,EAAA,CAAA;IACd,kBAACmC,GAAD;KAAmB,WAAU;KAAmB,UAAAnB,EAAa;IAA2B,CAAA;IACvFA,aAAwBU,KACvBV,EAAa,QACbA,EAAa,SAAS,mBACpB,kBAAC,KAAD;KAAG,WAAU;KAAb,UAAA;MACGf,EAAc,EAAE,cAAc,MAAM,CAAC;MAAE;MAAGe,EAAa;KACvD;;IAEP,kBAACqB,GAAD;KAAc,WAAU;KAAxB,UAAA,CACGC,KACC,kBAACC,GAAD;MACE,QAAQC,IAAS,GAAGA,EAAO,cAAc,KAAA;MACzC,SAAQ;MACR,SAASjB;MAER,UAAAe;KACK,CAAA,GAEV,kBAACC,GAAD;MAAQ,QAAQC,IAAS,GAAGA,EAAO,YAAY,KAAA;MAAW,SAASnB;MAChE,UAAAoB,KAAsBvC,EAAoB,EAAE,cAAc,KAAK,CAAC;KAC3D,CAAA,CACI;;GACD;;CACT,CAAA;AAEZ"}
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../ui/lib/utils.cjs"),n=require("../../lib/error/AppError.cjs");let r=require("react/jsx-runtime"),i=require("react");i=e.__toESM(i,1);let a=require("lucide-react");var o={info:{icon:a.Info,className:`text-blue-600 dark:text-blue-400`},warning:{icon:a.AlertTriangle,className:`text-amber-600 dark:text-amber-400`},error:{icon:a.XCircle,className:`text-destructive`},critical:{icon:a.AlertCircle,className:`text-destructive`}};function s({testId:e,error:i,code:a,message:s,className:c,severity:l=`error`,hideIcon:u=!1}){let d=null,f=l;if(i?i instanceof n.AppError?(d=i.message,f=i.severity):d=i.message:a?d=a:s&&(d=s),!d)return null;let p=o[f],m=p.icon;return(0,r.jsxs)(`div`,{"data-testid":e,"data-severity":f,className:t.cn(`flex items-center gap-2 text-sm`,p.className,c),role:`alert`,children:[!u&&(0,r.jsx)(m,{className:`h-4 w-4 flex-shrink-0`,"aria-hidden":`true`}),(0,r.jsx)(`span`,{children:d})]})}exports.ErrorInline=s;
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../ui/lib/utils.cjs"),n=require("../../lib/error/AppError.cjs");let r=require("react/jsx-runtime"),i=require("react");i=e.__toESM(i,1);let a=require("lucide-react");var o={info:{icon:a.Info,className:`text-blue-600 dark:text-blue-400`},warning:{icon:a.AlertTriangle,className:`text-amber-800 dark:text-amber-400`},error:{icon:a.XCircle,className:`text-destructive`},critical:{icon:a.AlertCircle,className:`text-destructive`}};function s({testId:e,error:i,code:a,message:s,className:c,severity:l=`error`,hideIcon:u=!1}){let d=null,f=l;if(i?i instanceof n.AppError?(d=i.message,f=i.severity):d=i.message:a?d=a:s&&(d=s),!d)return null;let p=o[f],m=p.icon;return(0,r.jsxs)(`div`,{"data-testid":e,"data-severity":f,className:t.cn(`flex items-center gap-2 text-sm`,p.className,c),role:`alert`,children:[!u&&(0,r.jsx)(m,{className:`h-4 w-4 flex-shrink-0`,"aria-hidden":`true`}),(0,r.jsx)(`span`,{children:d})]})}exports.ErrorInline=s;
2
2
  //# sourceMappingURL=ErrorInline.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorInline.cjs","names":["Info","AlertTriangle","XCircle","AlertCircle","AppError","cn","require_runtime","require_ui_lib_utils","require_tools_lib_error_AppError","react_jsx_runtime","react","lucide_react","severityConfig","ErrorInline","displayMessage","displaySeverity","severity","error","code","message","config","Icon","testId","className","hideIcon"],"sources":["../../../../src/tools/components/error/ErrorInline.tsx"],"sourcesContent":["import React from 'react';\nimport { AlertCircle, XCircle, AlertTriangle, Info } from 'lucide-react';\nimport { cn } from \"../../lib/utils\";\nimport { AppError, ErrorSeverity } from \"../../lib/error\";\n\n/**\n * ErrorInlineProps\n * インラインエラーのプロップス\n *\n * ## AI/Automation Features\n * - `testId`: Stable selector on container\n * - `data-severity`: error, warning, info, critical\n */\nexport interface ErrorInlineProps {\n /** AI/E2E Test用の安定ID / Stable test identifier */\n testId?: string;\n /** 表示するエラー */\n error?: AppError | Error | null;\n /** またはエラーコード (i18n から取得) */\n code?: string;\n /** エラーメッセージ (直接指定する場合) */\n message?: string;\n /** 追加の CSS クラス */\n className?: string;\n /** 重要度 (アイコンと色を決定) */\n severity?: ErrorSeverity;\n /** アイコンを非表示にする */\n hideIcon?: boolean;\n}\n\nconst severityConfig: Record<ErrorSeverity, { icon: React.ElementType; className: string }> = {\n info: { icon: Info, className: 'text-blue-600 dark:text-blue-400' },\n warning: { icon: AlertTriangle, className: 'text-amber-600 dark:text-amber-400' },\n error: { icon: XCircle, className: 'text-destructive' },\n critical: { icon: AlertCircle, className: 'text-destructive' },\n};\n\n/**\n * ErrorInline Component\n * インラインエラー表示コンポーネント\n *\n * Inline error display near form fields or submit buttons.\n * フォームのフィールド近くや送信ボタン周辺に表示します。\n *\n * ## AI/Automation Features\n * - `data-testid`: Container element\n * - `data-severity`: Error severity level\n *\n * @example With testId\n * ```tsx\n * <ErrorInline testId=\"form-error\" error={formError} />\n * ```\n */\nexport function ErrorInline({\n testId,\n error,\n code,\n message,\n className,\n severity = 'error',\n hideIcon = false,\n}: ErrorInlineProps) {\n // 表示するメッセージを決定\n let displayMessage: string | null = null;\n let displaySeverity = severity;\n\n if (error) {\n if (error instanceof AppError) {\n displayMessage = error.message;\n displaySeverity = error.severity;\n } else {\n displayMessage = error.message;\n }\n } else if (code) {\n // Use the code directly as message - dynamic i18n key lookup not supported in Paraglide\n displayMessage = code;\n } else if (message) {\n displayMessage = message;\n }\n\n // 表示するものがなければ何も表示しない\n if (!displayMessage) {\n return null;\n }\n\n const config = severityConfig[displaySeverity];\n const Icon = config.icon;\n\n return (\n <div\n data-testid={testId}\n data-severity={displaySeverity}\n className={cn('flex items-center gap-2 text-sm', config.className, className)}\n role='alert'\n >\n {!hideIcon && <Icon className='h-4 w-4 flex-shrink-0' aria-hidden='true' />}\n <span>{displayMessage}</span>\n </div>\n );\n}\n"],"mappings":"A,iUA8BA,IAAMY,EAAwF,CAC5F,KAAM,CAAE,KAAMZ,EAAAA,KAAM,UAAW,kCAAmC,EAClE,QAAS,CAAE,KAAMC,EAAAA,cAAe,UAAW,oCAAqC,EAChF,MAAO,CAAE,KAAMC,EAAAA,QAAS,UAAW,kBAAmB,EACtD,SAAU,CAAE,KAAMC,EAAAA,YAAa,UAAW,kBAAmB,CAC/D,EAkBA,SAAgBU,EAAY,CAC1B,SACA,QACA,OACA,UACA,YACA,WAAW,QACX,WAAW,IACQ,CAEnB,IAAIC,EAAgC,KAChCC,EAAkBC,EAiBtB,GAfIC,EACEA,aAAiBb,EAAAA,UACnB,EAAiBa,EAAM,QACvB,EAAkBA,EAAM,UAExB,EAAiBA,EAAM,QAEhBC,EAET,EAAiBA,EACRC,IACT,EAAiBA,GAIf,CAACL,EACH,OAAO,KAGT,IAAMM,EAASR,EAAeG,GACxBM,EAAOD,EAAO,KAEpB,OACE,EAAAX,EAAA,KAAA,CAAC,MAAD,CACE,cAAaa,EACb,gBAAeP,EACf,UAAWV,EAAAA,GAAG,kCAAmCe,EAAO,UAAWG,CAAS,EAC5E,KAAK,QAJP,SAAA,CAMG,CAACC,IAAY,EAAAf,EAAA,IAAA,CAACY,EAAD,CAAM,UAAU,wBAAwB,cAAY,MAAQ,CAAA,GAC1E,EAAAZ,EAAA,IAAA,CAAC,OAAD,CAAA,SAAOK,CAAqB,CAAA,CACzB,C,EAET,C"}
1
+ {"version":3,"file":"ErrorInline.cjs","names":["Info","AlertTriangle","XCircle","AlertCircle","AppError","cn","require_runtime","require_ui_lib_utils","require_tools_lib_error_AppError","react_jsx_runtime","react","lucide_react","severityConfig","ErrorInline","displayMessage","displaySeverity","severity","error","code","message","config","Icon","testId","className","hideIcon"],"sources":["../../../../src/tools/components/error/ErrorInline.tsx"],"sourcesContent":["import React from 'react';\nimport { AlertCircle, XCircle, AlertTriangle, Info } from 'lucide-react';\nimport { cn } from \"../../lib/utils\";\nimport { AppError, ErrorSeverity } from \"../../lib/error\";\n\n/**\n * ErrorInlineProps\n * インラインエラーのプロップス\n *\n * ## AI/Automation Features\n * - `testId`: Stable selector on container\n * - `data-severity`: error, warning, info, critical\n */\nexport interface ErrorInlineProps {\n /** AI/E2E Test用の安定ID / Stable test identifier */\n testId?: string;\n /** 表示するエラー */\n error?: AppError | Error | null;\n /** またはエラーコード (i18n から取得) */\n code?: string;\n /** エラーメッセージ (直接指定する場合) */\n message?: string;\n /** 追加の CSS クラス */\n className?: string;\n /** 重要度 (アイコンと色を決定) */\n severity?: ErrorSeverity;\n /** アイコンを非表示にする */\n hideIcon?: boolean;\n}\n\nconst severityConfig: Record<ErrorSeverity, { icon: React.ElementType; className: string }> = {\n info: { icon: Info, className: 'text-blue-600 dark:text-blue-400' },\n warning: { icon: AlertTriangle, className: 'text-amber-800 dark:text-amber-400' },\n error: { icon: XCircle, className: 'text-destructive' },\n critical: { icon: AlertCircle, className: 'text-destructive' },\n};\n\n/**\n * ErrorInline Component\n * インラインエラー表示コンポーネント\n *\n * Inline error display near form fields or submit buttons.\n * フォームのフィールド近くや送信ボタン周辺に表示します。\n *\n * ## AI/Automation Features\n * - `data-testid`: Container element\n * - `data-severity`: Error severity level\n *\n * @example With testId\n * ```tsx\n * <ErrorInline testId=\"form-error\" error={formError} />\n * ```\n */\nexport function ErrorInline({\n testId,\n error,\n code,\n message,\n className,\n severity = 'error',\n hideIcon = false,\n}: ErrorInlineProps) {\n // 表示するメッセージを決定\n let displayMessage: string | null = null;\n let displaySeverity = severity;\n\n if (error) {\n if (error instanceof AppError) {\n displayMessage = error.message;\n displaySeverity = error.severity;\n } else {\n displayMessage = error.message;\n }\n } else if (code) {\n // Use the code directly as message - dynamic i18n key lookup not supported in Paraglide\n displayMessage = code;\n } else if (message) {\n displayMessage = message;\n }\n\n // 表示するものがなければ何も表示しない\n if (!displayMessage) {\n return null;\n }\n\n const config = severityConfig[displaySeverity];\n const Icon = config.icon;\n\n return (\n <div\n data-testid={testId}\n data-severity={displaySeverity}\n className={cn('flex items-center gap-2 text-sm', config.className, className)}\n role='alert'\n >\n {!hideIcon && <Icon className='h-4 w-4 flex-shrink-0' aria-hidden='true' />}\n <span>{displayMessage}</span>\n </div>\n );\n}\n"],"mappings":"A,iUA8BA,IAAMY,EAAwF,CAC5F,KAAM,CAAE,KAAMZ,EAAAA,KAAM,UAAW,kCAAmC,EAClE,QAAS,CAAE,KAAMC,EAAAA,cAAe,UAAW,oCAAqC,EAChF,MAAO,CAAE,KAAMC,EAAAA,QAAS,UAAW,kBAAmB,EACtD,SAAU,CAAE,KAAMC,EAAAA,YAAa,UAAW,kBAAmB,CAC/D,EAkBA,SAAgBU,EAAY,CAC1B,SACA,QACA,OACA,UACA,YACA,WAAW,QACX,WAAW,IACQ,CAEnB,IAAIC,EAAgC,KAChCC,EAAkBC,EAiBtB,GAfIC,EACEA,aAAiBb,EAAAA,UACnB,EAAiBa,EAAM,QACvB,EAAkBA,EAAM,UAExB,EAAiBA,EAAM,QAEhBC,EAET,EAAiBA,EACRC,IACT,EAAiBA,GAIf,CAACL,EACH,OAAO,KAGT,IAAMM,EAASR,EAAeG,GACxBM,EAAOD,EAAO,KAEpB,OACE,EAAAX,EAAA,KAAA,CAAC,MAAD,CACE,cAAaa,EACb,gBAAeP,EACf,UAAWV,EAAAA,GAAG,kCAAmCe,EAAO,UAAWG,CAAS,EAC5E,KAAK,QAJP,SAAA,CAMG,CAACC,IAAY,EAAAf,EAAA,IAAA,CAACY,EAAD,CAAM,UAAU,wBAAwB,cAAY,MAAQ,CAAA,GAC1E,EAAAZ,EAAA,IAAA,CAAC,OAAD,CAAA,SAAOK,CAAqB,CAAA,CACzB,C,EAET,C"}
@@ -12,7 +12,7 @@ var c = {
12
12
  },
13
13
  warning: {
14
14
  icon: a,
15
- className: "text-amber-600 dark:text-amber-400"
15
+ className: "text-amber-800 dark:text-amber-400"
16
16
  },
17
17
  error: {
18
18
  icon: s,
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorInline.js","names":["severityConfig","Info","AlertTriangle","XCircle","AlertCircle","ErrorInline","displayMessage","displaySeverity","severity","error","AppError","code","message","config","Icon","testId","cn","className","hideIcon"],"sources":["../../../../src/tools/components/error/ErrorInline.tsx"],"sourcesContent":["import React from 'react';\nimport { AlertCircle, XCircle, AlertTriangle, Info } from 'lucide-react';\nimport { cn } from \"../../lib/utils\";\nimport { AppError, ErrorSeverity } from \"../../lib/error\";\n\n/**\n * ErrorInlineProps\n * インラインエラーのプロップス\n *\n * ## AI/Automation Features\n * - `testId`: Stable selector on container\n * - `data-severity`: error, warning, info, critical\n */\nexport interface ErrorInlineProps {\n /** AI/E2E Test用の安定ID / Stable test identifier */\n testId?: string;\n /** 表示するエラー */\n error?: AppError | Error | null;\n /** またはエラーコード (i18n から取得) */\n code?: string;\n /** エラーメッセージ (直接指定する場合) */\n message?: string;\n /** 追加の CSS クラス */\n className?: string;\n /** 重要度 (アイコンと色を決定) */\n severity?: ErrorSeverity;\n /** アイコンを非表示にする */\n hideIcon?: boolean;\n}\n\nconst severityConfig: Record<ErrorSeverity, { icon: React.ElementType; className: string }> = {\n info: { icon: Info, className: 'text-blue-600 dark:text-blue-400' },\n warning: { icon: AlertTriangle, className: 'text-amber-600 dark:text-amber-400' },\n error: { icon: XCircle, className: 'text-destructive' },\n critical: { icon: AlertCircle, className: 'text-destructive' },\n};\n\n/**\n * ErrorInline Component\n * インラインエラー表示コンポーネント\n *\n * Inline error display near form fields or submit buttons.\n * フォームのフィールド近くや送信ボタン周辺に表示します。\n *\n * ## AI/Automation Features\n * - `data-testid`: Container element\n * - `data-severity`: Error severity level\n *\n * @example With testId\n * ```tsx\n * <ErrorInline testId=\"form-error\" error={formError} />\n * ```\n */\nexport function ErrorInline({\n testId,\n error,\n code,\n message,\n className,\n severity = 'error',\n hideIcon = false,\n}: ErrorInlineProps) {\n // 表示するメッセージを決定\n let displayMessage: string | null = null;\n let displaySeverity = severity;\n\n if (error) {\n if (error instanceof AppError) {\n displayMessage = error.message;\n displaySeverity = error.severity;\n } else {\n displayMessage = error.message;\n }\n } else if (code) {\n // Use the code directly as message - dynamic i18n key lookup not supported in Paraglide\n displayMessage = code;\n } else if (message) {\n displayMessage = message;\n }\n\n // 表示するものがなければ何も表示しない\n if (!displayMessage) {\n return null;\n }\n\n const config = severityConfig[displaySeverity];\n const Icon = config.icon;\n\n return (\n <div\n data-testid={testId}\n data-severity={displaySeverity}\n className={cn('flex items-center gap-2 text-sm', config.className, className)}\n role='alert'\n >\n {!hideIcon && <Icon className='h-4 w-4 flex-shrink-0' aria-hidden='true' />}\n <span>{displayMessage}</span>\n </div>\n );\n}\n"],"mappings":";;;;;;;AA8BA,IAAMA,IAAwF;CAC5F,MAAM;EAAE,MAAMC;EAAM,WAAW;CAAmC;CAClE,SAAS;EAAE,MAAMC;EAAe,WAAW;CAAqC;CAChF,OAAO;EAAE,MAAMC;EAAS,WAAW;CAAmB;CACtD,UAAU;EAAE,MAAMC;EAAa,WAAW;CAAmB;AAC/D;AAkBA,SAAgBC,EAAY,EAC1B,WACA,UACA,SACA,YACA,cACA,cAAW,SACX,cAAW,MACQ;CAEnB,IAAIC,IAAgC,MAChCC,IAAkBC;CAiBtB,IAfIC,IACEA,aAAiBC,KACnB,IAAiBD,EAAM,SACvB,IAAkBA,EAAM,YAExB,IAAiBA,EAAM,UAEhBE,IAET,IAAiBA,IACRC,MACT,IAAiBA,IAIf,CAACN,GACH,OAAO;CAGT,IAAMO,IAASb,EAAeO,IACxBO,IAAOD,EAAO;CAEpB,OACE,kBAAC,OAAD;EACE,eAAaE;EACb,iBAAeR;EACf,WAAWS,EAAG,mCAAmCH,EAAO,WAAWI,CAAS;EAC5E,MAAK;EAJP,UAAA,CAMG,CAACC,KAAY,kBAACJ,GAAD;GAAM,WAAU;GAAwB,eAAY;EAAQ,CAAA,GAC1E,kBAAC,QAAD,EAAA,UAAOR,EAAqB,CAAA,CACzB;;AAET"}
1
+ {"version":3,"file":"ErrorInline.js","names":["severityConfig","Info","AlertTriangle","XCircle","AlertCircle","ErrorInline","displayMessage","displaySeverity","severity","error","AppError","code","message","config","Icon","testId","cn","className","hideIcon"],"sources":["../../../../src/tools/components/error/ErrorInline.tsx"],"sourcesContent":["import React from 'react';\nimport { AlertCircle, XCircle, AlertTriangle, Info } from 'lucide-react';\nimport { cn } from \"../../lib/utils\";\nimport { AppError, ErrorSeverity } from \"../../lib/error\";\n\n/**\n * ErrorInlineProps\n * インラインエラーのプロップス\n *\n * ## AI/Automation Features\n * - `testId`: Stable selector on container\n * - `data-severity`: error, warning, info, critical\n */\nexport interface ErrorInlineProps {\n /** AI/E2E Test用の安定ID / Stable test identifier */\n testId?: string;\n /** 表示するエラー */\n error?: AppError | Error | null;\n /** またはエラーコード (i18n から取得) */\n code?: string;\n /** エラーメッセージ (直接指定する場合) */\n message?: string;\n /** 追加の CSS クラス */\n className?: string;\n /** 重要度 (アイコンと色を決定) */\n severity?: ErrorSeverity;\n /** アイコンを非表示にする */\n hideIcon?: boolean;\n}\n\nconst severityConfig: Record<ErrorSeverity, { icon: React.ElementType; className: string }> = {\n info: { icon: Info, className: 'text-blue-600 dark:text-blue-400' },\n warning: { icon: AlertTriangle, className: 'text-amber-800 dark:text-amber-400' },\n error: { icon: XCircle, className: 'text-destructive' },\n critical: { icon: AlertCircle, className: 'text-destructive' },\n};\n\n/**\n * ErrorInline Component\n * インラインエラー表示コンポーネント\n *\n * Inline error display near form fields or submit buttons.\n * フォームのフィールド近くや送信ボタン周辺に表示します。\n *\n * ## AI/Automation Features\n * - `data-testid`: Container element\n * - `data-severity`: Error severity level\n *\n * @example With testId\n * ```tsx\n * <ErrorInline testId=\"form-error\" error={formError} />\n * ```\n */\nexport function ErrorInline({\n testId,\n error,\n code,\n message,\n className,\n severity = 'error',\n hideIcon = false,\n}: ErrorInlineProps) {\n // 表示するメッセージを決定\n let displayMessage: string | null = null;\n let displaySeverity = severity;\n\n if (error) {\n if (error instanceof AppError) {\n displayMessage = error.message;\n displaySeverity = error.severity;\n } else {\n displayMessage = error.message;\n }\n } else if (code) {\n // Use the code directly as message - dynamic i18n key lookup not supported in Paraglide\n displayMessage = code;\n } else if (message) {\n displayMessage = message;\n }\n\n // 表示するものがなければ何も表示しない\n if (!displayMessage) {\n return null;\n }\n\n const config = severityConfig[displaySeverity];\n const Icon = config.icon;\n\n return (\n <div\n data-testid={testId}\n data-severity={displaySeverity}\n className={cn('flex items-center gap-2 text-sm', config.className, className)}\n role='alert'\n >\n {!hideIcon && <Icon className='h-4 w-4 flex-shrink-0' aria-hidden='true' />}\n <span>{displayMessage}</span>\n </div>\n );\n}\n"],"mappings":";;;;;;;AA8BA,IAAMA,IAAwF;CAC5F,MAAM;EAAE,MAAMC;EAAM,WAAW;CAAmC;CAClE,SAAS;EAAE,MAAMC;EAAe,WAAW;CAAqC;CAChF,OAAO;EAAE,MAAMC;EAAS,WAAW;CAAmB;CACtD,UAAU;EAAE,MAAMC;EAAa,WAAW;CAAmB;AAC/D;AAkBA,SAAgBC,EAAY,EAC1B,WACA,UACA,SACA,YACA,cACA,cAAW,SACX,cAAW,MACQ;CAEnB,IAAIC,IAAgC,MAChCC,IAAkBC;CAiBtB,IAfIC,IACEA,aAAiBC,KACnB,IAAiBD,EAAM,SACvB,IAAkBA,EAAM,YAExB,IAAiBA,EAAM,UAEhBE,IAET,IAAiBA,IACRC,MACT,IAAiBA,IAIf,CAACN,GACH,OAAO;CAGT,IAAMO,IAASb,EAAeO,IACxBO,IAAOD,EAAO;CAEpB,OACE,kBAAC,OAAD;EACE,eAAaE;EACb,iBAAeR;EACf,WAAWS,EAAG,mCAAmCH,EAAO,WAAWI,CAAS;EAC5E,MAAK;EAJP,UAAA,CAMG,CAACC,KAAY,kBAACJ,GAAD;GAAM,WAAU;GAAwB,eAAY;EAAQ,CAAA,GAC1E,kBAAC,QAAD,EAAA,UAAOR,EAAqB,CAAA,CACzB;;AAET"}
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../ui/lib/utils.cjs"),n=require("../../lib/state/error-store.cjs");let r=require("react/jsx-runtime"),i=require("react");i=e.__toESM(i,1);let a=require("lucide-react");var o={info:{icon:a.Info,bgClass:`bg-blue-50`,borderClass:`border-blue-200`,iconBgClass:`bg-blue-500`,iconClass:`text-white`},warning:{icon:a.AlertTriangle,bgClass:`bg-amber-50`,borderClass:`border-amber-200`,iconBgClass:`bg-amber-500`,iconClass:`text-white`},error:{icon:a.X,bgClass:`bg-red-50`,borderClass:`border-red-200`,iconBgClass:`bg-red-500`,iconClass:`text-white`},critical:{icon:a.AlertCircle,bgClass:`bg-red-100`,borderClass:`border-red-300`,iconBgClass:`bg-red-600`,iconClass:`text-white`},success:{icon:a.CheckCircle,bgClass:`bg-green-50`,borderClass:`border-green-200`,iconBgClass:`bg-green-500`,iconClass:`text-white`}},s={"top-left":`top-4 left-4`,"top-center":`top-4 left-1/2 -translate-x-1/2`,"top-right":`top-4 right-4`,"bottom-left":`bottom-4 left-4`,"bottom-center":`bottom-4 left-1/2 -translate-x-1/2`,"bottom-right":`bottom-4 right-4`};function c({className:e,maxVisible:i=5,position:a=`top-right`}){let{removeError:o,getErrorsByMode:c}=n.useErrorStore(),u=c(`notification`).slice(-i);return u.length===0?null:(0,r.jsx)(`div`,{className:t.cn(`fixed z-[100] flex flex-col gap-2 w-full max-w-md pointer-events-none`,s[a],e),children:u.map(e=>(0,r.jsx)(l,{item:e,onDismiss:()=>o(e.id)},e.id))})}function l({item:e,onDismiss:n}){let i=o[e.severity],s=i.icon;return(0,r.jsxs)(`div`,{className:t.cn(`pointer-events-auto flex items-start gap-3 rounded-lg border p-4 shadow-lg`,`animate-in slide-in-from-right-full fade-in duration-300`,i.bgClass,i.borderClass),role:`alert`,children:[(0,r.jsx)(`div`,{className:t.cn(`rounded-full p-1.5 flex-shrink-0`,i.iconBgClass),children:(0,r.jsx)(s,{className:t.cn(`h-4 w-4`,i.iconClass)})}),(0,r.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,r.jsx)(`p`,{className:`text-sm font-medium text-foreground`,children:e.error.message}),e.error.code&&e.error.code!==`error/unknown`&&(0,r.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:e.error.code})]}),(0,r.jsx)(`button`,{onClick:n,className:`flex-shrink-0 rounded-md p-1 text-muted-foreground hover:text-foreground hover:bg-black/5 dark:hover:bg-white/10 transition-colors`,"aria-label":`Close`,children:(0,r.jsx)(a.X,{className:`h-4 w-4`})})]})}exports.ErrorNotification=c;
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../ui/lib/utils.cjs"),n=require("../../lib/state/error-store.cjs");let r=require("react/jsx-runtime"),i=require("react");i=e.__toESM(i,1);let a=require("lucide-react");var o={info:{icon:a.Info,bgClass:`bg-blue-50 dark:bg-blue-950`,borderClass:`border-blue-200 dark:border-blue-800`,iconBgClass:`bg-blue-500`,iconClass:`text-white`},warning:{icon:a.AlertTriangle,bgClass:`bg-amber-50 dark:bg-amber-950`,borderClass:`border-amber-200 dark:border-amber-800`,iconBgClass:`bg-amber-500`,iconClass:`text-white`},error:{icon:a.X,bgClass:`bg-red-50 dark:bg-red-950`,borderClass:`border-red-200 dark:border-red-800`,iconBgClass:`bg-red-500`,iconClass:`text-white`},critical:{icon:a.AlertCircle,bgClass:`bg-red-100 dark:bg-red-950`,borderClass:`border-red-300 dark:border-red-800`,iconBgClass:`bg-red-600`,iconClass:`text-white`},success:{icon:a.CheckCircle,bgClass:`bg-green-50 dark:bg-green-950`,borderClass:`border-green-200 dark:border-green-800`,iconBgClass:`bg-green-500`,iconClass:`text-white`}},s={"top-left":`top-4 left-4`,"top-center":`top-4 left-1/2 -translate-x-1/2`,"top-right":`top-4 right-4`,"bottom-left":`bottom-4 left-4`,"bottom-center":`bottom-4 left-1/2 -translate-x-1/2`,"bottom-right":`bottom-4 right-4`};function c({className:e,maxVisible:i=5,position:a=`top-right`}){let{removeError:o,getErrorsByMode:c}=n.useErrorStore(),u=c(`notification`).slice(-i);return u.length===0?null:(0,r.jsx)(`div`,{className:t.cn(`fixed z-[100] flex flex-col gap-2 w-full max-w-md pointer-events-none`,s[a],e),children:u.map(e=>(0,r.jsx)(l,{item:e,onDismiss:()=>o(e.id)},e.id))})}function l({item:e,onDismiss:n}){let i=o[e.severity],s=i.icon;return(0,r.jsxs)(`div`,{className:t.cn(`pointer-events-auto flex items-start gap-3 rounded-lg border p-4 shadow-lg`,`animate-in slide-in-from-right-full fade-in duration-300`,i.bgClass,i.borderClass),role:`alert`,children:[(0,r.jsx)(`div`,{className:t.cn(`rounded-full p-1.5 flex-shrink-0`,i.iconBgClass),children:(0,r.jsx)(s,{className:t.cn(`h-4 w-4`,i.iconClass)})}),(0,r.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,r.jsx)(`p`,{className:`text-sm font-medium text-foreground`,children:e.error.message}),e.error.code&&e.error.code!==`error/unknown`&&(0,r.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:e.error.code})]}),(0,r.jsx)(`button`,{onClick:n,className:`flex-shrink-0 rounded-md p-1 text-muted-foreground hover:text-foreground hover:bg-black/5 dark:hover:bg-white/10 transition-colors`,"aria-label":`Close`,children:(0,r.jsx)(a.X,{className:`h-4 w-4`})})]})}exports.ErrorNotification=c;
2
2
  //# sourceMappingURL=ErrorNotification.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorNotification.cjs","names":["Info","AlertTriangle","X","AlertCircle","CheckCircle","useErrorStore","cn","require_runtime","require_ui_lib_utils","require_tools_lib_state_error_store","react_jsx_runtime","react","lucide_react","severityConfig","positionClasses","ErrorNotification","notificationErrors","getErrorsByMode","maxVisible","position","className","NotificationItem","removeError","item","config","Icon","onDismiss"],"sources":["../../../../src/tools/components/error/ErrorNotification.tsx"],"sourcesContent":["import React from 'react';\nimport { X, AlertCircle, AlertTriangle, Info, CheckCircle } from 'lucide-react';\nimport { cn } from \"../../lib/utils\";\nimport { ErrorSeverity } from \"../../lib/error\";\nimport { useErrorStore, ErrorItem } from \"../../lib/state/error-store\";\n\nexport interface ErrorNotificationProps {\n /** 追加の CSS クラス */\n className?: string;\n /** 通知の最大表示数。デフォルト: 5 */\n maxVisible?: number;\n /** 表示位置。デフォルト: 'top-right' */\n position?:\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n}\n\nconst severityConfig: Record<\n ErrorSeverity | 'success',\n {\n icon: React.ElementType;\n bgClass: string;\n borderClass: string;\n iconBgClass: string;\n iconClass: string;\n }\n> = {\n info: {\n icon: Info,\n bgClass: 'bg-blue-50',\n borderClass: 'border-blue-200',\n iconBgClass: 'bg-blue-500',\n iconClass: 'text-white',\n },\n warning: {\n icon: AlertTriangle,\n bgClass: 'bg-amber-50',\n borderClass: 'border-amber-200',\n iconBgClass: 'bg-amber-500',\n iconClass: 'text-white',\n },\n error: {\n icon: X,\n bgClass: 'bg-red-50',\n borderClass: 'border-red-200',\n iconBgClass: 'bg-red-500',\n iconClass: 'text-white',\n },\n critical: {\n icon: AlertCircle,\n bgClass: 'bg-red-100',\n borderClass: 'border-red-300',\n iconBgClass: 'bg-red-600',\n iconClass: 'text-white',\n },\n success: {\n icon: CheckCircle,\n bgClass: 'bg-green-50',\n borderClass: 'border-green-200',\n iconBgClass: 'bg-green-500',\n iconClass: 'text-white',\n },\n};\n\nconst positionClasses: Record<NonNullable<ErrorNotificationProps['position']>, string> = {\n 'top-left': 'top-4 left-4',\n 'top-center': 'top-4 left-1/2 -translate-x-1/2',\n 'top-right': 'top-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n 'bottom-right': 'bottom-4 right-4',\n};\n\n/**\n * 通知バナー表示コンポーネント\n * 画面の角に通知を表示します。\n *\n * @example\n * ```tsx\n * // ErrorProvider 内で自動的に使用されます\n * <ErrorNotification position=\"top-right\" maxVisible={3} />\n * ```\n */\nexport function ErrorNotification({\n className,\n maxVisible = 5,\n position = 'top-right',\n}: ErrorNotificationProps) {\n const { removeError, getErrorsByMode } = useErrorStore();\n\n // notification モードのエラーのみ表示\n const notificationErrors = getErrorsByMode('notification').slice(-maxVisible);\n\n if (notificationErrors.length === 0) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'fixed z-[100] flex flex-col gap-2 w-full max-w-md pointer-events-none',\n positionClasses[position],\n className,\n )}\n >\n {notificationErrors.map((item) => (\n <NotificationItem key={item.id} item={item} onDismiss={() => removeError(item.id)} />\n ))}\n </div>\n );\n}\n\ninterface NotificationItemProps {\n item: ErrorItem;\n onDismiss: () => void;\n}\n\nfunction NotificationItem({ item, onDismiss }: NotificationItemProps) {\n const config = severityConfig[item.severity];\n const Icon = config.icon;\n\n return (\n <div\n className={cn(\n 'pointer-events-auto flex items-start gap-3 rounded-lg border p-4 shadow-lg',\n 'animate-in slide-in-from-right-full fade-in duration-300',\n config.bgClass,\n config.borderClass,\n )}\n role='alert'\n >\n <div className={cn('rounded-full p-1.5 flex-shrink-0', config.iconBgClass)}>\n <Icon className={cn('h-4 w-4', config.iconClass)} />\n </div>\n <div className='flex-1 min-w-0'>\n <p className='text-sm font-medium text-foreground'>{item.error.message}</p>\n {item.error.code && item.error.code !== 'error/unknown' && (\n <p className='mt-1 text-xs text-muted-foreground'>{item.error.code}</p>\n )}\n </div>\n <button\n onClick={onDismiss}\n className='flex-shrink-0 rounded-md p-1 text-muted-foreground hover:text-foreground hover:bg-black/5 dark:hover:bg-white/10 transition-colors'\n aria-label='Close'\n >\n <X className='h-4 w-4' />\n </button>\n </div>\n );\n}\n"],"mappings":"A,oUAqBA,IAAMa,EASF,CACF,KAAM,CACJ,KAAMb,EAAAA,KACN,QAAS,aACT,YAAa,kBACb,YAAa,cACb,UAAW,YACb,EACA,QAAS,CACP,KAAMC,EAAAA,cACN,QAAS,cACT,YAAa,mBACb,YAAa,eACb,UAAW,YACb,EACA,MAAO,CACL,KAAMC,EAAAA,EACN,QAAS,YACT,YAAa,iBACb,YAAa,aACb,UAAW,YACb,EACA,SAAU,CACR,KAAMC,EAAAA,YACN,QAAS,aACT,YAAa,iBACb,YAAa,aACb,UAAW,YACb,EACA,QAAS,CACP,KAAMC,EAAAA,YACN,QAAS,cACT,YAAa,mBACb,YAAa,eACb,UAAW,YACb,CACF,EAEMU,EAAmF,CACvF,WAAY,eACZ,aAAc,kCACd,YAAa,gBACb,cAAe,kBACf,gBAAiB,qCACjB,eAAgB,kBAClB,EAYA,SAAgBC,EAAkB,CAChC,YACA,aAAa,EACb,WAAW,aACc,CACzB,GAAM,CAAE,cAAa,mBAAoBV,EAAAA,cAAc,EAGjDW,EAAqBC,EAAgB,cAAc,CAAC,CAAC,MAAM,CAACC,CAAU,EAM5E,OAJIF,EAAmB,SAAW,EACzB,MAIP,EAAAN,EAAA,IAAA,CAAC,MAAD,CACE,UAAWJ,EAAAA,GACT,wEACAQ,EAAgBK,GAChBC,CACF,EAEC,SAAAJ,EAAmB,IAAK,IACvB,EAAAN,EAAA,IAAA,CAACW,EAAD,CAAsC,OAAM,cAAiBC,EAAYC,EAAK,EAAE,CAAI,EAA7DA,EAAK,EAAwD,CACrF,CACE,CAAA,CAET,CAOA,SAASF,EAAiB,CAAE,OAAM,aAAoC,CACpE,IAAMG,EAASX,EAAeU,EAAK,UAC7BE,EAAOD,EAAO,KAEpB,OACE,EAAAd,EAAA,KAAA,CAAC,MAAD,CACE,UAAWJ,EAAAA,GACT,6EACA,2DACAkB,EAAO,QACPA,EAAO,WACT,EACA,KAAK,QAPP,SAAA,EASE,EAAAd,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWJ,EAAAA,GAAG,mCAAoCkB,EAAO,WAAW,EACvE,UAAA,EAAAd,EAAA,IAAA,CAACe,EAAD,CAAM,UAAWnB,EAAAA,GAAG,UAAWkB,EAAO,SAAS,CAAI,CAAA,CAChD,CAAA,GACL,EAAAd,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,iBAAf,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,sCAAuC,SAAAa,EAAK,MAAM,OAAW,CAAA,EACzEA,EAAK,MAAM,MAAQA,EAAK,MAAM,OAAS,kBACtC,EAAAb,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,qCAAsC,SAAAa,EAAK,MAAM,IAAQ,CAAA,CAErE,C,IACL,EAAAb,EAAA,IAAA,CAAC,SAAD,CACE,QAASgB,EACT,UAAU,qIACV,aAAW,QAEX,UAAA,EAAAhB,EAAA,IAAA,CAACR,EAAAA,EAAD,CAAG,UAAU,SAAW,CAAA,CAClB,CAAA,CACL,C,EAET,C"}
1
+ {"version":3,"file":"ErrorNotification.cjs","names":["Info","AlertTriangle","X","AlertCircle","CheckCircle","useErrorStore","cn","require_runtime","require_ui_lib_utils","require_tools_lib_state_error_store","react_jsx_runtime","react","lucide_react","severityConfig","positionClasses","ErrorNotification","notificationErrors","getErrorsByMode","maxVisible","position","className","NotificationItem","removeError","item","config","Icon","onDismiss"],"sources":["../../../../src/tools/components/error/ErrorNotification.tsx"],"sourcesContent":["import React from 'react';\nimport { X, AlertCircle, AlertTriangle, Info, CheckCircle } from 'lucide-react';\nimport { cn } from \"../../lib/utils\";\nimport { ErrorSeverity } from \"../../lib/error\";\nimport { useErrorStore, ErrorItem } from \"../../lib/state/error-store\";\n\nexport interface ErrorNotificationProps {\n /** 追加の CSS クラス */\n className?: string;\n /** 通知の最大表示数。デフォルト: 5 */\n maxVisible?: number;\n /** 表示位置。デフォルト: 'top-right' */\n position?:\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n}\n\nconst severityConfig: Record<\n ErrorSeverity | 'success',\n {\n icon: React.ElementType;\n bgClass: string;\n borderClass: string;\n iconBgClass: string;\n iconClass: string;\n }\n> = {\n info: {\n icon: Info,\n bgClass: 'bg-blue-50 dark:bg-blue-950',\n borderClass: 'border-blue-200 dark:border-blue-800',\n iconBgClass: 'bg-blue-500',\n iconClass: 'text-white',\n },\n warning: {\n icon: AlertTriangle,\n bgClass: 'bg-amber-50 dark:bg-amber-950',\n borderClass: 'border-amber-200 dark:border-amber-800',\n iconBgClass: 'bg-amber-500',\n iconClass: 'text-white',\n },\n error: {\n icon: X,\n bgClass: 'bg-red-50 dark:bg-red-950',\n borderClass: 'border-red-200 dark:border-red-800',\n iconBgClass: 'bg-red-500',\n iconClass: 'text-white',\n },\n critical: {\n icon: AlertCircle,\n bgClass: 'bg-red-100 dark:bg-red-950',\n borderClass: 'border-red-300 dark:border-red-800',\n iconBgClass: 'bg-red-600',\n iconClass: 'text-white',\n },\n success: {\n icon: CheckCircle,\n bgClass: 'bg-green-50 dark:bg-green-950',\n borderClass: 'border-green-200 dark:border-green-800',\n iconBgClass: 'bg-green-500',\n iconClass: 'text-white',\n },\n};\n\nconst positionClasses: Record<NonNullable<ErrorNotificationProps['position']>, string> = {\n 'top-left': 'top-4 left-4',\n 'top-center': 'top-4 left-1/2 -translate-x-1/2',\n 'top-right': 'top-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n 'bottom-right': 'bottom-4 right-4',\n};\n\n/**\n * 通知バナー表示コンポーネント\n * 画面の角に通知を表示します。\n *\n * @example\n * ```tsx\n * // ErrorProvider 内で自動的に使用されます\n * <ErrorNotification position=\"top-right\" maxVisible={3} />\n * ```\n */\nexport function ErrorNotification({\n className,\n maxVisible = 5,\n position = 'top-right',\n}: ErrorNotificationProps) {\n const { removeError, getErrorsByMode } = useErrorStore();\n\n // notification モードのエラーのみ表示\n const notificationErrors = getErrorsByMode('notification').slice(-maxVisible);\n\n if (notificationErrors.length === 0) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'fixed z-[100] flex flex-col gap-2 w-full max-w-md pointer-events-none',\n positionClasses[position],\n className,\n )}\n >\n {notificationErrors.map((item) => (\n <NotificationItem key={item.id} item={item} onDismiss={() => removeError(item.id)} />\n ))}\n </div>\n );\n}\n\ninterface NotificationItemProps {\n item: ErrorItem;\n onDismiss: () => void;\n}\n\nfunction NotificationItem({ item, onDismiss }: NotificationItemProps) {\n const config = severityConfig[item.severity];\n const Icon = config.icon;\n\n return (\n <div\n className={cn(\n 'pointer-events-auto flex items-start gap-3 rounded-lg border p-4 shadow-lg',\n 'animate-in slide-in-from-right-full fade-in duration-300',\n config.bgClass,\n config.borderClass,\n )}\n role='alert'\n >\n <div className={cn('rounded-full p-1.5 flex-shrink-0', config.iconBgClass)}>\n <Icon className={cn('h-4 w-4', config.iconClass)} />\n </div>\n <div className='flex-1 min-w-0'>\n <p className='text-sm font-medium text-foreground'>{item.error.message}</p>\n {item.error.code && item.error.code !== 'error/unknown' && (\n <p className='mt-1 text-xs text-muted-foreground'>{item.error.code}</p>\n )}\n </div>\n <button\n onClick={onDismiss}\n className='flex-shrink-0 rounded-md p-1 text-muted-foreground hover:text-foreground hover:bg-black/5 dark:hover:bg-white/10 transition-colors'\n aria-label='Close'\n >\n <X className='h-4 w-4' />\n </button>\n </div>\n );\n}\n"],"mappings":"A,oUAqBA,IAAMa,EASF,CACF,KAAM,CACJ,KAAMb,EAAAA,KACN,QAAS,8BACT,YAAa,uCACb,YAAa,cACb,UAAW,YACb,EACA,QAAS,CACP,KAAMC,EAAAA,cACN,QAAS,gCACT,YAAa,yCACb,YAAa,eACb,UAAW,YACb,EACA,MAAO,CACL,KAAMC,EAAAA,EACN,QAAS,4BACT,YAAa,qCACb,YAAa,aACb,UAAW,YACb,EACA,SAAU,CACR,KAAMC,EAAAA,YACN,QAAS,6BACT,YAAa,qCACb,YAAa,aACb,UAAW,YACb,EACA,QAAS,CACP,KAAMC,EAAAA,YACN,QAAS,gCACT,YAAa,yCACb,YAAa,eACb,UAAW,YACb,CACF,EAEMU,EAAmF,CACvF,WAAY,eACZ,aAAc,kCACd,YAAa,gBACb,cAAe,kBACf,gBAAiB,qCACjB,eAAgB,kBAClB,EAYA,SAAgBC,EAAkB,CAChC,YACA,aAAa,EACb,WAAW,aACc,CACzB,GAAM,CAAE,cAAa,mBAAoBV,EAAAA,cAAc,EAGjDW,EAAqBC,EAAgB,cAAc,CAAC,CAAC,MAAM,CAACC,CAAU,EAM5E,OAJIF,EAAmB,SAAW,EACzB,MAIP,EAAAN,EAAA,IAAA,CAAC,MAAD,CACE,UAAWJ,EAAAA,GACT,wEACAQ,EAAgBK,GAChBC,CACF,EAEC,SAAAJ,EAAmB,IAAK,IACvB,EAAAN,EAAA,IAAA,CAACW,EAAD,CAAsC,OAAM,cAAiBC,EAAYC,EAAK,EAAE,CAAI,EAA7DA,EAAK,EAAwD,CACrF,CACE,CAAA,CAET,CAOA,SAASF,EAAiB,CAAE,OAAM,aAAoC,CACpE,IAAMG,EAASX,EAAeU,EAAK,UAC7BE,EAAOD,EAAO,KAEpB,OACE,EAAAd,EAAA,KAAA,CAAC,MAAD,CACE,UAAWJ,EAAAA,GACT,6EACA,2DACAkB,EAAO,QACPA,EAAO,WACT,EACA,KAAK,QAPP,SAAA,EASE,EAAAd,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWJ,EAAAA,GAAG,mCAAoCkB,EAAO,WAAW,EACvE,UAAA,EAAAd,EAAA,IAAA,CAACe,EAAD,CAAM,UAAWnB,EAAAA,GAAG,UAAWkB,EAAO,SAAS,CAAI,CAAA,CAChD,CAAA,GACL,EAAAd,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,iBAAf,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,sCAAuC,SAAAa,EAAK,MAAM,OAAW,CAAA,EACzEA,EAAK,MAAM,MAAQA,EAAK,MAAM,OAAS,kBACtC,EAAAb,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,qCAAsC,SAAAa,EAAK,MAAM,IAAQ,CAAA,CAErE,C,IACL,EAAAb,EAAA,IAAA,CAAC,SAAD,CACE,QAASgB,EACT,UAAU,qIACV,aAAW,QAEX,UAAA,EAAAhB,EAAA,IAAA,CAACR,EAAAA,EAAD,CAAG,UAAU,SAAW,CAAA,CAClB,CAAA,CACL,C,EAET,C"}
@@ -8,36 +8,36 @@ import { AlertCircle as i, AlertTriangle as a, CheckCircle as o, Info as s, X as
8
8
  var l = {
9
9
  info: {
10
10
  icon: s,
11
- bgClass: "bg-blue-50",
12
- borderClass: "border-blue-200",
11
+ bgClass: "bg-blue-50 dark:bg-blue-950",
12
+ borderClass: "border-blue-200 dark:border-blue-800",
13
13
  iconBgClass: "bg-blue-500",
14
14
  iconClass: "text-white"
15
15
  },
16
16
  warning: {
17
17
  icon: a,
18
- bgClass: "bg-amber-50",
19
- borderClass: "border-amber-200",
18
+ bgClass: "bg-amber-50 dark:bg-amber-950",
19
+ borderClass: "border-amber-200 dark:border-amber-800",
20
20
  iconBgClass: "bg-amber-500",
21
21
  iconClass: "text-white"
22
22
  },
23
23
  error: {
24
24
  icon: c,
25
- bgClass: "bg-red-50",
26
- borderClass: "border-red-200",
25
+ bgClass: "bg-red-50 dark:bg-red-950",
26
+ borderClass: "border-red-200 dark:border-red-800",
27
27
  iconBgClass: "bg-red-500",
28
28
  iconClass: "text-white"
29
29
  },
30
30
  critical: {
31
31
  icon: i,
32
- bgClass: "bg-red-100",
33
- borderClass: "border-red-300",
32
+ bgClass: "bg-red-100 dark:bg-red-950",
33
+ borderClass: "border-red-300 dark:border-red-800",
34
34
  iconBgClass: "bg-red-600",
35
35
  iconClass: "text-white"
36
36
  },
37
37
  success: {
38
38
  icon: o,
39
- bgClass: "bg-green-50",
40
- borderClass: "border-green-200",
39
+ bgClass: "bg-green-50 dark:bg-green-950",
40
+ borderClass: "border-green-200 dark:border-green-800",
41
41
  iconBgClass: "bg-green-500",
42
42
  iconClass: "text-white"
43
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorNotification.js","names":["severityConfig","Info","AlertTriangle","X","AlertCircle","CheckCircle","positionClasses","ErrorNotification","useErrorStore","notificationErrors","getErrorsByMode","maxVisible","cn","position","className","NotificationItem","removeError","item","config","Icon","onDismiss"],"sources":["../../../../src/tools/components/error/ErrorNotification.tsx"],"sourcesContent":["import React from 'react';\nimport { X, AlertCircle, AlertTriangle, Info, CheckCircle } from 'lucide-react';\nimport { cn } from \"../../lib/utils\";\nimport { ErrorSeverity } from \"../../lib/error\";\nimport { useErrorStore, ErrorItem } from \"../../lib/state/error-store\";\n\nexport interface ErrorNotificationProps {\n /** 追加の CSS クラス */\n className?: string;\n /** 通知の最大表示数。デフォルト: 5 */\n maxVisible?: number;\n /** 表示位置。デフォルト: 'top-right' */\n position?:\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n}\n\nconst severityConfig: Record<\n ErrorSeverity | 'success',\n {\n icon: React.ElementType;\n bgClass: string;\n borderClass: string;\n iconBgClass: string;\n iconClass: string;\n }\n> = {\n info: {\n icon: Info,\n bgClass: 'bg-blue-50',\n borderClass: 'border-blue-200',\n iconBgClass: 'bg-blue-500',\n iconClass: 'text-white',\n },\n warning: {\n icon: AlertTriangle,\n bgClass: 'bg-amber-50',\n borderClass: 'border-amber-200',\n iconBgClass: 'bg-amber-500',\n iconClass: 'text-white',\n },\n error: {\n icon: X,\n bgClass: 'bg-red-50',\n borderClass: 'border-red-200',\n iconBgClass: 'bg-red-500',\n iconClass: 'text-white',\n },\n critical: {\n icon: AlertCircle,\n bgClass: 'bg-red-100',\n borderClass: 'border-red-300',\n iconBgClass: 'bg-red-600',\n iconClass: 'text-white',\n },\n success: {\n icon: CheckCircle,\n bgClass: 'bg-green-50',\n borderClass: 'border-green-200',\n iconBgClass: 'bg-green-500',\n iconClass: 'text-white',\n },\n};\n\nconst positionClasses: Record<NonNullable<ErrorNotificationProps['position']>, string> = {\n 'top-left': 'top-4 left-4',\n 'top-center': 'top-4 left-1/2 -translate-x-1/2',\n 'top-right': 'top-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n 'bottom-right': 'bottom-4 right-4',\n};\n\n/**\n * 通知バナー表示コンポーネント\n * 画面の角に通知を表示します。\n *\n * @example\n * ```tsx\n * // ErrorProvider 内で自動的に使用されます\n * <ErrorNotification position=\"top-right\" maxVisible={3} />\n * ```\n */\nexport function ErrorNotification({\n className,\n maxVisible = 5,\n position = 'top-right',\n}: ErrorNotificationProps) {\n const { removeError, getErrorsByMode } = useErrorStore();\n\n // notification モードのエラーのみ表示\n const notificationErrors = getErrorsByMode('notification').slice(-maxVisible);\n\n if (notificationErrors.length === 0) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'fixed z-[100] flex flex-col gap-2 w-full max-w-md pointer-events-none',\n positionClasses[position],\n className,\n )}\n >\n {notificationErrors.map((item) => (\n <NotificationItem key={item.id} item={item} onDismiss={() => removeError(item.id)} />\n ))}\n </div>\n );\n}\n\ninterface NotificationItemProps {\n item: ErrorItem;\n onDismiss: () => void;\n}\n\nfunction NotificationItem({ item, onDismiss }: NotificationItemProps) {\n const config = severityConfig[item.severity];\n const Icon = config.icon;\n\n return (\n <div\n className={cn(\n 'pointer-events-auto flex items-start gap-3 rounded-lg border p-4 shadow-lg',\n 'animate-in slide-in-from-right-full fade-in duration-300',\n config.bgClass,\n config.borderClass,\n )}\n role='alert'\n >\n <div className={cn('rounded-full p-1.5 flex-shrink-0', config.iconBgClass)}>\n <Icon className={cn('h-4 w-4', config.iconClass)} />\n </div>\n <div className='flex-1 min-w-0'>\n <p className='text-sm font-medium text-foreground'>{item.error.message}</p>\n {item.error.code && item.error.code !== 'error/unknown' && (\n <p className='mt-1 text-xs text-muted-foreground'>{item.error.code}</p>\n )}\n </div>\n <button\n onClick={onDismiss}\n className='flex-shrink-0 rounded-md p-1 text-muted-foreground hover:text-foreground hover:bg-black/5 dark:hover:bg-white/10 transition-colors'\n aria-label='Close'\n >\n <X className='h-4 w-4' />\n </button>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAqBA,IAAMA,IASF;CACF,MAAM;EACJ,MAAMC;EACN,SAAS;EACT,aAAa;EACb,aAAa;EACb,WAAW;CACb;CACA,SAAS;EACP,MAAMC;EACN,SAAS;EACT,aAAa;EACb,aAAa;EACb,WAAW;CACb;CACA,OAAO;EACL,MAAMC;EACN,SAAS;EACT,aAAa;EACb,aAAa;EACb,WAAW;CACb;CACA,UAAU;EACR,MAAMC;EACN,SAAS;EACT,aAAa;EACb,aAAa;EACb,WAAW;CACb;CACA,SAAS;EACP,MAAMC;EACN,SAAS;EACT,aAAa;EACb,aAAa;EACb,WAAW;CACb;AACF,GAEMC,IAAmF;CACvF,YAAY;CACZ,cAAc;CACd,aAAa;CACb,eAAe;CACf,iBAAiB;CACjB,gBAAgB;AAClB;AAYA,SAAgBC,EAAkB,EAChC,cACA,gBAAa,GACb,cAAW,eACc;CACzB,IAAM,EAAE,gBAAa,uBAAoBC,EAAc,GAGjDC,IAAqBC,EAAgB,cAAc,CAAC,CAAC,MAAM,CAACC,CAAU;CAM5E,OAJIF,EAAmB,WAAW,IACzB,OAIP,kBAAC,OAAD;EACE,WAAWG,EACT,yEACAN,EAAgBO,IAChBC,CACF;EAEC,UAAAL,EAAmB,KAAK,MACvB,kBAACM,GAAD;GAAsC;GAAM,iBAAiBC,EAAYC,EAAK,EAAE;EAAI,GAA7DA,EAAK,EAAwD,CACrF;CACE,CAAA;AAET;AAOA,SAASF,EAAiB,EAAE,SAAM,gBAAoC;CACpE,IAAMG,IAASlB,EAAeiB,EAAK,WAC7BE,IAAOD,EAAO;CAEpB,OACE,kBAAC,OAAD;EACE,WAAWN,EACT,8EACA,4DACAM,EAAO,SACPA,EAAO,WACT;EACA,MAAK;EAPP,UAAA;GASE,kBAAC,OAAD;IAAK,WAAWN,EAAG,oCAAoCM,EAAO,WAAW;IACvE,UAAA,kBAACC,GAAD,EAAM,WAAWP,EAAG,WAAWM,EAAO,SAAS,EAAI,CAAA;GAChD,CAAA;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,KAAD;KAAG,WAAU;KAAuC,UAAAD,EAAK,MAAM;IAAW,CAAA,GACzEA,EAAK,MAAM,QAAQA,EAAK,MAAM,SAAS,mBACtC,kBAAC,KAAD;KAAG,WAAU;KAAsC,UAAAA,EAAK,MAAM;IAAQ,CAAA,CAErE;;GACL,kBAAC,UAAD;IACE,SAASG;IACT,WAAU;IACV,cAAW;IAEX,UAAA,kBAACjB,GAAD,EAAG,WAAU,UAAW,CAAA;GAClB,CAAA;EACL;;AAET"}
1
+ {"version":3,"file":"ErrorNotification.js","names":["severityConfig","Info","AlertTriangle","X","AlertCircle","CheckCircle","positionClasses","ErrorNotification","useErrorStore","notificationErrors","getErrorsByMode","maxVisible","cn","position","className","NotificationItem","removeError","item","config","Icon","onDismiss"],"sources":["../../../../src/tools/components/error/ErrorNotification.tsx"],"sourcesContent":["import React from 'react';\nimport { X, AlertCircle, AlertTriangle, Info, CheckCircle } from 'lucide-react';\nimport { cn } from \"../../lib/utils\";\nimport { ErrorSeverity } from \"../../lib/error\";\nimport { useErrorStore, ErrorItem } from \"../../lib/state/error-store\";\n\nexport interface ErrorNotificationProps {\n /** 追加の CSS クラス */\n className?: string;\n /** 通知の最大表示数。デフォルト: 5 */\n maxVisible?: number;\n /** 表示位置。デフォルト: 'top-right' */\n position?:\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n}\n\nconst severityConfig: Record<\n ErrorSeverity | 'success',\n {\n icon: React.ElementType;\n bgClass: string;\n borderClass: string;\n iconBgClass: string;\n iconClass: string;\n }\n> = {\n info: {\n icon: Info,\n bgClass: 'bg-blue-50 dark:bg-blue-950',\n borderClass: 'border-blue-200 dark:border-blue-800',\n iconBgClass: 'bg-blue-500',\n iconClass: 'text-white',\n },\n warning: {\n icon: AlertTriangle,\n bgClass: 'bg-amber-50 dark:bg-amber-950',\n borderClass: 'border-amber-200 dark:border-amber-800',\n iconBgClass: 'bg-amber-500',\n iconClass: 'text-white',\n },\n error: {\n icon: X,\n bgClass: 'bg-red-50 dark:bg-red-950',\n borderClass: 'border-red-200 dark:border-red-800',\n iconBgClass: 'bg-red-500',\n iconClass: 'text-white',\n },\n critical: {\n icon: AlertCircle,\n bgClass: 'bg-red-100 dark:bg-red-950',\n borderClass: 'border-red-300 dark:border-red-800',\n iconBgClass: 'bg-red-600',\n iconClass: 'text-white',\n },\n success: {\n icon: CheckCircle,\n bgClass: 'bg-green-50 dark:bg-green-950',\n borderClass: 'border-green-200 dark:border-green-800',\n iconBgClass: 'bg-green-500',\n iconClass: 'text-white',\n },\n};\n\nconst positionClasses: Record<NonNullable<ErrorNotificationProps['position']>, string> = {\n 'top-left': 'top-4 left-4',\n 'top-center': 'top-4 left-1/2 -translate-x-1/2',\n 'top-right': 'top-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n 'bottom-right': 'bottom-4 right-4',\n};\n\n/**\n * 通知バナー表示コンポーネント\n * 画面の角に通知を表示します。\n *\n * @example\n * ```tsx\n * // ErrorProvider 内で自動的に使用されます\n * <ErrorNotification position=\"top-right\" maxVisible={3} />\n * ```\n */\nexport function ErrorNotification({\n className,\n maxVisible = 5,\n position = 'top-right',\n}: ErrorNotificationProps) {\n const { removeError, getErrorsByMode } = useErrorStore();\n\n // notification モードのエラーのみ表示\n const notificationErrors = getErrorsByMode('notification').slice(-maxVisible);\n\n if (notificationErrors.length === 0) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'fixed z-[100] flex flex-col gap-2 w-full max-w-md pointer-events-none',\n positionClasses[position],\n className,\n )}\n >\n {notificationErrors.map((item) => (\n <NotificationItem key={item.id} item={item} onDismiss={() => removeError(item.id)} />\n ))}\n </div>\n );\n}\n\ninterface NotificationItemProps {\n item: ErrorItem;\n onDismiss: () => void;\n}\n\nfunction NotificationItem({ item, onDismiss }: NotificationItemProps) {\n const config = severityConfig[item.severity];\n const Icon = config.icon;\n\n return (\n <div\n className={cn(\n 'pointer-events-auto flex items-start gap-3 rounded-lg border p-4 shadow-lg',\n 'animate-in slide-in-from-right-full fade-in duration-300',\n config.bgClass,\n config.borderClass,\n )}\n role='alert'\n >\n <div className={cn('rounded-full p-1.5 flex-shrink-0', config.iconBgClass)}>\n <Icon className={cn('h-4 w-4', config.iconClass)} />\n </div>\n <div className='flex-1 min-w-0'>\n <p className='text-sm font-medium text-foreground'>{item.error.message}</p>\n {item.error.code && item.error.code !== 'error/unknown' && (\n <p className='mt-1 text-xs text-muted-foreground'>{item.error.code}</p>\n )}\n </div>\n <button\n onClick={onDismiss}\n className='flex-shrink-0 rounded-md p-1 text-muted-foreground hover:text-foreground hover:bg-black/5 dark:hover:bg-white/10 transition-colors'\n aria-label='Close'\n >\n <X className='h-4 w-4' />\n </button>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAqBA,IAAMA,IASF;CACF,MAAM;EACJ,MAAMC;EACN,SAAS;EACT,aAAa;EACb,aAAa;EACb,WAAW;CACb;CACA,SAAS;EACP,MAAMC;EACN,SAAS;EACT,aAAa;EACb,aAAa;EACb,WAAW;CACb;CACA,OAAO;EACL,MAAMC;EACN,SAAS;EACT,aAAa;EACb,aAAa;EACb,WAAW;CACb;CACA,UAAU;EACR,MAAMC;EACN,SAAS;EACT,aAAa;EACb,aAAa;EACb,WAAW;CACb;CACA,SAAS;EACP,MAAMC;EACN,SAAS;EACT,aAAa;EACb,aAAa;EACb,WAAW;CACb;AACF,GAEMC,IAAmF;CACvF,YAAY;CACZ,cAAc;CACd,aAAa;CACb,eAAe;CACf,iBAAiB;CACjB,gBAAgB;AAClB;AAYA,SAAgBC,EAAkB,EAChC,cACA,gBAAa,GACb,cAAW,eACc;CACzB,IAAM,EAAE,gBAAa,uBAAoBC,EAAc,GAGjDC,IAAqBC,EAAgB,cAAc,CAAC,CAAC,MAAM,CAACC,CAAU;CAM5E,OAJIF,EAAmB,WAAW,IACzB,OAIP,kBAAC,OAAD;EACE,WAAWG,EACT,yEACAN,EAAgBO,IAChBC,CACF;EAEC,UAAAL,EAAmB,KAAK,MACvB,kBAACM,GAAD;GAAsC;GAAM,iBAAiBC,EAAYC,EAAK,EAAE;EAAI,GAA7DA,EAAK,EAAwD,CACrF;CACE,CAAA;AAET;AAOA,SAASF,EAAiB,EAAE,SAAM,gBAAoC;CACpE,IAAMG,IAASlB,EAAeiB,EAAK,WAC7BE,IAAOD,EAAO;CAEpB,OACE,kBAAC,OAAD;EACE,WAAWN,EACT,8EACA,4DACAM,EAAO,SACPA,EAAO,WACT;EACA,MAAK;EAPP,UAAA;GASE,kBAAC,OAAD;IAAK,WAAWN,EAAG,oCAAoCM,EAAO,WAAW;IACvE,UAAA,kBAACC,GAAD,EAAM,WAAWP,EAAG,WAAWM,EAAO,SAAS,EAAI,CAAA;GAChD,CAAA;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,KAAD;KAAG,WAAU;KAAuC,UAAAD,EAAK,MAAM;IAAW,CAAA,GACzEA,EAAK,MAAM,QAAQA,EAAK,MAAM,SAAS,mBACtC,kBAAC,KAAD;KAAG,WAAU;KAAsC,UAAAA,EAAK,MAAM;IAAQ,CAAA,CAErE;;GACL,kBAAC,UAAD;IACE,SAASG;IACT,WAAU;IACV,cAAW;IAEX,UAAA,kBAACjB,GAAD,EAAG,WAAU,UAAW,CAAA;GAClB,CAAA;EACL;;AAET"}
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../ui/components/ui/button-components.cjs"),t=require("../../../ui/components/ui/dialog.cjs"),n=require("../../../ui/components/ui/file-icon.cjs");let r=require("react/jsx-runtime"),i=require("react"),a=require("lucide-react");function o({node:o,url:s,onClose:c}){let[l,u]=(0,i.useState)(!0),[d,f]=(0,i.useState)(null),p=!!o&&!!s,m=o?.contentType?.toLowerCase()||``,h=m.includes(`image/`),g=m.includes(`pdf`),_=m.includes(`text/`)||m.includes(`json`)||m.includes(`javascript`)||m.includes(`typescript`);return(0,i.useEffect)(()=>{p&&_&&s?(queueMicrotask(()=>{u(!0)}),fetch(s).then(e=>e.text()).then(e=>{f(e),u(!1)}).catch(()=>{f(`Failed to load text content.`),u(!1)})):queueMicrotask(()=>{u(!1),f(null)})},[p,_,s]),o?(0,r.jsx)(t.Dialog,{open:p,onOpenChange:e=>!e&&c(),children:(0,r.jsxs)(t.DialogContent,{className:`max-w-4xl w-[90vw] h-[85vh] flex flex-col p-0 overflow-hidden gap-0`,children:[(0,r.jsxs)(t.DialogHeader,{className:`p-4 border-b flex-row items-center justify-between space-y-0`,children:[(0,r.jsxs)(`div`,{className:`flex items-center gap-3 pr-8`,children:[(0,r.jsx)(n.FileIcon,{kind:o.kind,contentType:o.contentType,className:`h-5 w-5`}),(0,r.jsx)(t.DialogTitle,{className:`text-base font-semibold truncate`,children:o.name})]}),(0,r.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,r.jsxs)(e.Button,{variant:`outline`,size:`sm`,className:`h-8 gap-2`,nativeButton:!1,render:(0,r.jsx)(`a`,{href:s||`#`,download:o.name}),children:[(0,r.jsx)(a.Download,{className:`h-3.5 w-3.5`}),(0,r.jsx)(`span`,{children:`Download`})]}),(0,r.jsx)(e.Button,{variant:`ghost`,size:`sm`,className:`h-8`,nativeButton:!1,render:(0,r.jsx)(`a`,{href:s||`#`,target:`_blank`,rel:`noreferrer`,"aria-label":`Open in new tab`}),children:(0,r.jsx)(a.ExternalLink,{className:`h-3.5 w-3.5`})})]})]}),(0,r.jsxs)(`div`,{className:`flex-1 bg-muted/20 relative overflow-auto flex items-center justify-center`,children:[l&&(0,r.jsx)(`div`,{className:`absolute inset-0 flex items-center justify-center bg-background/50 z-10`,children:(0,r.jsx)(a.Loader2,{className:`h-8 w-8 animate-spin text-muted-foreground`})}),h&&s&&(0,r.jsx)(`img`,{src:s,alt:o.name,className:`max-w-full max-h-full object-contain shadow-lg`,onLoad:()=>u(!1)}),g&&s&&(0,r.jsx)(`iframe`,{src:`${s}#toolbar=0`,title:o.name,className:`w-full h-full border-none`,onLoad:()=>u(!1)}),_&&d!==null&&(0,r.jsx)(`pre`,{className:`w-full h-full p-6 font-mono text-xs overflow-auto bg-background whitespace-pre-wrap`,children:d}),!h&&!g&&!_&&(0,r.jsxs)(`div`,{className:`text-center p-12`,children:[(0,r.jsx)(n.FileIcon,{kind:o.kind,contentType:o.contentType,className:`h-16 w-16 mx-auto mb-4 opacity-20`}),(0,r.jsx)(`p`,{className:`text-muted-foreground`,children:`Preview not available for this file type.`}),(0,r.jsx)(`p`,{className:`text-xs mt-2`,children:`Please download the file to view it.`})]})]})]})}):null}exports.FilePreview=o;
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../ui/components/ui/button-variants.cjs"),t=require("../../../ui/components/ui/dialog.cjs"),n=require("../../../ui/components/ui/file-icon.cjs");let r=require("react/jsx-runtime"),i=require("react"),a=require("lucide-react");function o({node:o,url:s,onClose:c}){let[l,u]=(0,i.useState)(!0),[d,f]=(0,i.useState)(null),p=!!o&&!!s,m=o?.contentType?.toLowerCase()||``,h=m.includes(`image/`),g=m.includes(`pdf`),_=m.includes(`text/`)||m.includes(`json`)||m.includes(`javascript`)||m.includes(`typescript`);return(0,i.useEffect)(()=>{let e=new AbortController;return p&&_&&s?(queueMicrotask(()=>{e.signal.aborted||(u(!0),f(null))}),fetch(s,{signal:e.signal}).then(e=>{if(!e.ok)throw Error(`Failed to load text content.`);return e.text()}).then(t=>{e.signal.aborted||(f(t),u(!1))}).catch(()=>{e.signal.aborted||(f(`Failed to load text content.`),u(!1))})):queueMicrotask(()=>{e.signal.aborted||(u(!1),f(null))}),()=>e.abort()},[p,_,s]),o?(0,r.jsx)(t.Dialog,{open:p,onOpenChange:e=>!e&&c(),children:(0,r.jsxs)(t.DialogContent,{className:`max-w-4xl w-[90vw] h-[85vh] flex flex-col p-0 overflow-hidden gap-0`,children:[(0,r.jsxs)(t.DialogHeader,{className:`p-4 border-b flex-row items-center justify-between space-y-0`,children:[(0,r.jsxs)(`div`,{className:`flex items-center gap-3 pr-8`,children:[(0,r.jsx)(n.FileIcon,{kind:o.kind,contentType:o.contentType,className:`h-5 w-5`}),(0,r.jsx)(t.DialogTitle,{className:`text-base font-semibold truncate`,children:o.name})]}),(0,r.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,r.jsxs)(`a`,{className:e.buttonVariants({variant:`outline`,size:`sm`,className:`h-8 gap-2`}),href:s||`#`,download:o.name,children:[(0,r.jsx)(a.Download,{className:`h-3.5 w-3.5`}),(0,r.jsx)(`span`,{children:`Download`})]}),(0,r.jsx)(`a`,{className:e.buttonVariants({variant:`ghost`,size:`sm`,className:`h-8`}),href:s||`#`,target:`_blank`,rel:`noreferrer`,"aria-label":`Open in new tab`,children:(0,r.jsx)(a.ExternalLink,{className:`h-3.5 w-3.5`})})]})]}),(0,r.jsxs)(`div`,{className:`flex-1 bg-muted/20 relative overflow-auto flex items-center justify-center`,children:[l&&(0,r.jsx)(`div`,{className:`absolute inset-0 flex items-center justify-center bg-background/50 z-10`,children:(0,r.jsx)(a.Loader2,{className:`h-8 w-8 animate-spin text-muted-foreground`})}),h&&s&&(0,r.jsx)(`img`,{src:s,alt:o.name,className:`max-w-full max-h-full object-contain shadow-lg`,onLoad:()=>u(!1)}),g&&s&&(0,r.jsx)(`iframe`,{src:`${s}#toolbar=0`,title:o.name,className:`w-full h-full border-none`,onLoad:()=>u(!1)}),_&&d!==null&&(0,r.jsx)(`pre`,{className:`w-full h-full p-6 font-mono text-xs overflow-auto bg-background whitespace-pre-wrap`,children:d}),!h&&!g&&!_&&(0,r.jsxs)(`div`,{className:`text-center p-12`,children:[(0,r.jsx)(n.FileIcon,{kind:o.kind,contentType:o.contentType,className:`h-16 w-16 mx-auto mb-4 opacity-20`}),(0,r.jsx)(`p`,{className:`text-muted-foreground`,children:`Preview not available for this file type.`}),(0,r.jsx)(`p`,{className:`text-xs mt-2`,children:`Please download the file to view it.`})]})]})]})}):null}exports.FilePreview=o;
2
2
  //# sourceMappingURL=FilePreview.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"FilePreview.cjs","names":["useState","Dialog","DialogContent","DialogHeader","FileIcon","DialogTitle","Button","Download","ExternalLink","Loader2","require_ui_components_ui_button_components","require_ui_components_ui_dialog","require_ui_components_ui_file_icon","react_jsx_runtime","react","lucide_react","FilePreview","loading","setLoading","textContent","setTextContent","isOpen","node","url","mime","isImage","isPdf","isText","res","text","open","onClose"],"sources":["../../../../src/tools/components/file-browser/FilePreview.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '../ui/dialog';\nimport type { FileNode } from './types';\nimport { FileIcon } from '../ui/file-icon';\nimport { Loader2, Download, ExternalLink } from 'lucide-react';\nimport { Button } from '../ui/button';\n\nexport interface FilePreviewProps {\n /** プレビュー対象のノード */\n node: FileNode | null;\n /** 署名付きURL */\n url: string | null;\n /** モーダルを閉じる時のコールバック */\n onClose: () => void;\n}\n\n/**\n * ファイルのプレビューを表示するモーダルコンポーネント\n */\nexport function FilePreview({ node, url, onClose }: FilePreviewProps) {\n const [loading, setLoading] = useState(true);\n const [textContent, setTextContent] = useState<string | null>(null);\n\n const isOpen = !!node && !!url;\n const mime = node?.contentType?.toLowerCase() || '';\n const isImage = mime.includes('image/');\n const isPdf = mime.includes('pdf');\n const isText =\n mime.includes('text/') ||\n mime.includes('json') ||\n mime.includes('javascript') ||\n mime.includes('typescript');\n\n useEffect(() => {\n if (isOpen && isText && url) {\n queueMicrotask(() => {\n setLoading(true);\n });\n fetch(url)\n .then((res) => res.text())\n .then((text) => {\n setTextContent(text);\n setLoading(false);\n })\n .catch(() => {\n setTextContent('Failed to load text content.');\n setLoading(false);\n });\n } else {\n queueMicrotask(() => {\n setLoading(false);\n setTextContent(null);\n });\n }\n }, [isOpen, isText, url]);\n\n if (!node) return null;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className='max-w-4xl w-[90vw] h-[85vh] flex flex-col p-0 overflow-hidden gap-0'>\n <DialogHeader className='p-4 border-b flex-row items-center justify-between space-y-0'>\n <div className='flex items-center gap-3 pr-8'>\n <FileIcon kind={node.kind} contentType={node.contentType} className='h-5 w-5' />\n <DialogTitle className='text-base font-semibold truncate'>{node.name}</DialogTitle>\n </div>\n <div className='flex items-center gap-2'>\n <Button variant='outline' size='sm' className='h-8 gap-2' nativeButton={false} render={<a href={url || '#'} download={node.name} />}>\n <Download className='h-3.5 w-3.5' />\n <span>Download</span>\n </Button>\n <Button variant='ghost' size='sm' className='h-8' nativeButton={false} render={<a href={url || '#'} target='_blank' rel='noreferrer' aria-label='Open in new tab' />}>\n <ExternalLink className='h-3.5 w-3.5' />\n </Button>\n </div>\n </DialogHeader>\n\n <div className='flex-1 bg-muted/20 relative overflow-auto flex items-center justify-center'>\n {loading && (\n <div className='absolute inset-0 flex items-center justify-center bg-background/50 z-10'>\n <Loader2 className='h-8 w-8 animate-spin text-muted-foreground' />\n </div>\n )}\n\n {isImage && url && (\n <img\n src={url}\n alt={node.name}\n className='max-w-full max-h-full object-contain shadow-lg'\n onLoad={() => setLoading(false)}\n />\n )}\n\n {isPdf && url && (\n <iframe\n src={`${url}#toolbar=0`}\n title={node.name}\n className='w-full h-full border-none'\n onLoad={() => setLoading(false)}\n />\n )}\n\n {isText && textContent !== null && (\n <pre className='w-full h-full p-6 font-mono text-xs overflow-auto bg-background whitespace-pre-wrap'>\n {textContent}\n </pre>\n )}\n\n {!isImage && !isPdf && !isText && (\n <div className='text-center p-12'>\n <FileIcon\n kind={node.kind}\n contentType={node.contentType}\n className='h-16 w-16 mx-auto mb-4 opacity-20'\n />\n <p className='text-muted-foreground'>Preview not available for this file type.</p>\n <p className='text-xs mt-2'>Please download the file to view it.</p>\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FilePreview.cjs","names":["useState","Dialog","DialogContent","DialogHeader","FileIcon","DialogTitle","buttonVariants","Download","ExternalLink","Loader2","require_ui_components_ui_button_variants","require_ui_components_ui_dialog","require_ui_components_ui_file_icon","react_jsx_runtime","react","lucide_react","FilePreview","loading","setLoading","textContent","setTextContent","isOpen","node","url","mime","isImage","isPdf","isText","controller","res","text","open","onClose"],"sources":["../../../../src/tools/components/file-browser/FilePreview.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '../ui/dialog';\nimport type { FileNode } from './types';\nimport { FileIcon } from '../ui/file-icon';\nimport { Loader2, Download, ExternalLink } from 'lucide-react';\nimport { buttonVariants } from '../ui/button';\n\nexport interface FilePreviewProps {\n /** プレビュー対象のノード */\n node: FileNode | null;\n /** 署名付きURL */\n url: string | null;\n /** モーダルを閉じる時のコールバック */\n onClose: () => void;\n}\n\n/**\n * ファイルのプレビューを表示するモーダルコンポーネント\n */\nexport function FilePreview({ node, url, onClose }: FilePreviewProps) {\n const [loading, setLoading] = useState(true);\n const [textContent, setTextContent] = useState<string | null>(null);\n\n const isOpen = !!node && !!url;\n const mime = node?.contentType?.toLowerCase() || '';\n const isImage = mime.includes('image/');\n const isPdf = mime.includes('pdf');\n const isText =\n mime.includes('text/') ||\n mime.includes('json') ||\n mime.includes('javascript') ||\n mime.includes('typescript');\n\n useEffect(() => {\n const controller = new AbortController();\n if (isOpen && isText && url) {\n queueMicrotask(() => {\n if (controller.signal.aborted) return;\n setLoading(true);\n setTextContent(null);\n });\n fetch(url, { signal: controller.signal })\n .then((res) => {\n if (!res.ok) throw new Error('Failed to load text content.');\n return res.text();\n })\n .then((text) => {\n if (controller.signal.aborted) return;\n setTextContent(text);\n setLoading(false);\n })\n .catch(() => {\n if (controller.signal.aborted) return;\n setTextContent('Failed to load text content.');\n setLoading(false);\n });\n } else {\n queueMicrotask(() => {\n if (controller.signal.aborted) return;\n setLoading(false);\n setTextContent(null);\n });\n }\n return () => controller.abort();\n }, [isOpen, isText, url]);\n\n if (!node) return null;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className='max-w-4xl w-[90vw] h-[85vh] flex flex-col p-0 overflow-hidden gap-0'>\n <DialogHeader className='p-4 border-b flex-row items-center justify-between space-y-0'>\n <div className='flex items-center gap-3 pr-8'>\n <FileIcon kind={node.kind} contentType={node.contentType} className='h-5 w-5' />\n <DialogTitle className='text-base font-semibold truncate'>{node.name}</DialogTitle>\n </div>\n <div className='flex items-center gap-2'>\n <a className={buttonVariants({ variant: 'outline', size: 'sm', className: 'h-8 gap-2' })} href={url || '#'} download={node.name}>\n <Download className='h-3.5 w-3.5' />\n <span>Download</span>\n </a>\n <a className={buttonVariants({ variant: 'ghost', size: 'sm', className: 'h-8' })} href={url || '#'} target='_blank' rel='noreferrer' aria-label='Open in new tab'>\n <ExternalLink className='h-3.5 w-3.5' />\n </a>\n </div>\n </DialogHeader>\n\n <div className='flex-1 bg-muted/20 relative overflow-auto flex items-center justify-center'>\n {loading && (\n <div className='absolute inset-0 flex items-center justify-center bg-background/50 z-10'>\n <Loader2 className='h-8 w-8 animate-spin text-muted-foreground' />\n </div>\n )}\n\n {isImage && url && (\n <img\n src={url}\n alt={node.name}\n className='max-w-full max-h-full object-contain shadow-lg'\n onLoad={() => setLoading(false)}\n />\n )}\n\n {isPdf && url && (\n <iframe\n src={`${url}#toolbar=0`}\n title={node.name}\n className='w-full h-full border-none'\n onLoad={() => setLoading(false)}\n />\n )}\n\n {isText && textContent !== null && (\n <pre className='w-full h-full p-6 font-mono text-xs overflow-auto bg-background whitespace-pre-wrap'>\n {textContent}\n </pre>\n )}\n\n {!isImage && !isPdf && !isText && (\n <div className='text-center p-12'>\n <FileIcon\n kind={node.kind}\n contentType={node.contentType}\n className='h-16 w-16 mx-auto mb-4 opacity-20'\n />\n <p className='text-muted-foreground'>Preview not available for this file type.</p>\n <p className='text-xs mt-2'>Please download the file to view it.</p>\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { Button as e } from "../../../ui/components/ui/button-components.js";
2
+ import { buttonVariants as e } from "../../../ui/components/ui/button-variants.js";
3
3
  import { Dialog as t, DialogContent as n, DialogHeader as r, DialogTitle as i } from "../../../ui/components/ui/dialog.js";
4
4
  import { FileIcon as a } from "../../../ui/components/ui/file-icon.js";
5
5
  import { jsx as o, jsxs as s } from "react/jsx-runtime";
@@ -9,15 +9,19 @@ import { Download as u, ExternalLink as d, Loader2 as f } from "lucide-react";
9
9
  function p({ node: p, url: m, onClose: h }) {
10
10
  let [g, _] = l(!0), [v, y] = l(null), b = !!p && !!m, x = p?.contentType?.toLowerCase() || "", S = x.includes("image/"), C = x.includes("pdf"), w = x.includes("text/") || x.includes("json") || x.includes("javascript") || x.includes("typescript");
11
11
  return c(() => {
12
- b && w && m ? (queueMicrotask(() => {
13
- _(!0);
14
- }), fetch(m).then((e) => e.text()).then((e) => {
15
- y(e), _(!1);
12
+ let e = new AbortController();
13
+ return b && w && m ? (queueMicrotask(() => {
14
+ e.signal.aborted || (_(!0), y(null));
15
+ }), fetch(m, { signal: e.signal }).then((e) => {
16
+ if (!e.ok) throw Error("Failed to load text content.");
17
+ return e.text();
18
+ }).then((t) => {
19
+ e.signal.aborted || (y(t), _(!1));
16
20
  }).catch(() => {
17
- y("Failed to load text content."), _(!1);
21
+ e.signal.aborted || (y("Failed to load text content."), _(!1));
18
22
  })) : queueMicrotask(() => {
19
- _(!1), y(null);
20
- });
23
+ e.signal.aborted || (_(!1), y(null));
24
+ }), () => e.abort();
21
25
  }, [
22
26
  b,
23
27
  w,
@@ -41,27 +45,25 @@ function p({ node: p, url: m, onClose: h }) {
41
45
  })]
42
46
  }), /* @__PURE__ */ s("div", {
43
47
  className: "flex items-center gap-2",
44
- children: [/* @__PURE__ */ s(e, {
45
- variant: "outline",
46
- size: "sm",
47
- className: "h-8 gap-2",
48
- nativeButton: !1,
49
- render: /* @__PURE__ */ o("a", {
50
- href: m || "#",
51
- download: p.name
48
+ children: [/* @__PURE__ */ s("a", {
49
+ className: e({
50
+ variant: "outline",
51
+ size: "sm",
52
+ className: "h-8 gap-2"
52
53
  }),
54
+ href: m || "#",
55
+ download: p.name,
53
56
  children: [/* @__PURE__ */ o(u, { className: "h-3.5 w-3.5" }), /* @__PURE__ */ o("span", { children: "Download" })]
54
- }), /* @__PURE__ */ o(e, {
55
- variant: "ghost",
56
- size: "sm",
57
- className: "h-8",
58
- nativeButton: !1,
59
- render: /* @__PURE__ */ o("a", {
60
- href: m || "#",
61
- target: "_blank",
62
- rel: "noreferrer",
63
- "aria-label": "Open in new tab"
57
+ }), /* @__PURE__ */ o("a", {
58
+ className: e({
59
+ variant: "ghost",
60
+ size: "sm",
61
+ className: "h-8"
64
62
  }),
63
+ href: m || "#",
64
+ target: "_blank",
65
+ rel: "noreferrer",
66
+ "aria-label": "Open in new tab",
65
67
  children: /* @__PURE__ */ o(d, { className: "h-3.5 w-3.5" })
66
68
  })]
67
69
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"FilePreview.js","names":["FileIcon","FileIcon$1","FilePreview","loading","setLoading","useState","textContent","setTextContent","isOpen","node","url","mime","isImage","isPdf","isText","useEffect","res","text","Dialog","open","onClose","DialogContent","DialogHeader","DialogTitle","Button","Download","ExternalLink","Loader2"],"sources":["../../../../src/tools/components/file-browser/FilePreview.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '../ui/dialog';\nimport type { FileNode } from './types';\nimport { FileIcon } from '../ui/file-icon';\nimport { Loader2, Download, ExternalLink } from 'lucide-react';\nimport { Button } from '../ui/button';\n\nexport interface FilePreviewProps {\n /** プレビュー対象のノード */\n node: FileNode | null;\n /** 署名付きURL */\n url: string | null;\n /** モーダルを閉じる時のコールバック */\n onClose: () => void;\n}\n\n/**\n * ファイルのプレビューを表示するモーダルコンポーネント\n */\nexport function FilePreview({ node, url, onClose }: FilePreviewProps) {\n const [loading, setLoading] = useState(true);\n const [textContent, setTextContent] = useState<string | null>(null);\n\n const isOpen = !!node && !!url;\n const mime = node?.contentType?.toLowerCase() || '';\n const isImage = mime.includes('image/');\n const isPdf = mime.includes('pdf');\n const isText =\n mime.includes('text/') ||\n mime.includes('json') ||\n mime.includes('javascript') ||\n mime.includes('typescript');\n\n useEffect(() => {\n if (isOpen && isText && url) {\n queueMicrotask(() => {\n setLoading(true);\n });\n fetch(url)\n .then((res) => res.text())\n .then((text) => {\n setTextContent(text);\n setLoading(false);\n })\n .catch(() => {\n setTextContent('Failed to load text content.');\n setLoading(false);\n });\n } else {\n queueMicrotask(() => {\n setLoading(false);\n setTextContent(null);\n });\n }\n }, [isOpen, isText, url]);\n\n if (!node) return null;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className='max-w-4xl w-[90vw] h-[85vh] flex flex-col p-0 overflow-hidden gap-0'>\n <DialogHeader className='p-4 border-b flex-row items-center justify-between space-y-0'>\n <div className='flex items-center gap-3 pr-8'>\n <FileIcon kind={node.kind} contentType={node.contentType} className='h-5 w-5' />\n <DialogTitle className='text-base font-semibold truncate'>{node.name}</DialogTitle>\n </div>\n <div className='flex items-center gap-2'>\n <Button variant='outline' size='sm' className='h-8 gap-2' nativeButton={false} render={<a href={url || '#'} download={node.name} />}>\n <Download className='h-3.5 w-3.5' />\n <span>Download</span>\n </Button>\n <Button variant='ghost' size='sm' className='h-8' nativeButton={false} render={<a href={url || '#'} target='_blank' rel='noreferrer' aria-label='Open in new tab' />}>\n <ExternalLink className='h-3.5 w-3.5' />\n </Button>\n </div>\n </DialogHeader>\n\n <div className='flex-1 bg-muted/20 relative overflow-auto flex items-center justify-center'>\n {loading && (\n <div className='absolute inset-0 flex items-center justify-center bg-background/50 z-10'>\n <Loader2 className='h-8 w-8 animate-spin text-muted-foreground' />\n </div>\n )}\n\n {isImage && url && (\n <img\n src={url}\n alt={node.name}\n className='max-w-full max-h-full object-contain shadow-lg'\n onLoad={() => setLoading(false)}\n />\n )}\n\n {isPdf && url && (\n <iframe\n src={`${url}#toolbar=0`}\n title={node.name}\n className='w-full h-full border-none'\n onLoad={() => setLoading(false)}\n />\n )}\n\n {isText && textContent !== null && (\n <pre className='w-full h-full p-6 font-mono text-xs overflow-auto bg-background whitespace-pre-wrap'>\n {textContent}\n </pre>\n )}\n\n {!isImage && !isPdf && !isText && (\n <div className='text-center p-12'>\n <FileIcon\n kind={node.kind}\n contentType={node.contentType}\n className='h-16 w-16 mx-auto mb-4 opacity-20'\n />\n <p className='text-muted-foreground'>Preview not available for this file type.</p>\n <p className='text-xs mt-2'>Please download the file to view it.</p>\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FilePreview.js","names":["FileIcon","FileIcon$1","FilePreview","loading","setLoading","useState","textContent","setTextContent","isOpen","node","url","mime","isImage","isPdf","isText","useEffect","controller","res","text","Dialog","open","onClose","DialogContent","DialogHeader","DialogTitle","buttonVariants","Download","ExternalLink","Loader2"],"sources":["../../../../src/tools/components/file-browser/FilePreview.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '../ui/dialog';\nimport type { FileNode } from './types';\nimport { FileIcon } from '../ui/file-icon';\nimport { Loader2, Download, ExternalLink } from 'lucide-react';\nimport { buttonVariants } from '../ui/button';\n\nexport interface FilePreviewProps {\n /** プレビュー対象のノード */\n node: FileNode | null;\n /** 署名付きURL */\n url: string | null;\n /** モーダルを閉じる時のコールバック */\n onClose: () => void;\n}\n\n/**\n * ファイルのプレビューを表示するモーダルコンポーネント\n */\nexport function FilePreview({ node, url, onClose }: FilePreviewProps) {\n const [loading, setLoading] = useState(true);\n const [textContent, setTextContent] = useState<string | null>(null);\n\n const isOpen = !!node && !!url;\n const mime = node?.contentType?.toLowerCase() || '';\n const isImage = mime.includes('image/');\n const isPdf = mime.includes('pdf');\n const isText =\n mime.includes('text/') ||\n mime.includes('json') ||\n mime.includes('javascript') ||\n mime.includes('typescript');\n\n useEffect(() => {\n const controller = new AbortController();\n if (isOpen && isText && url) {\n queueMicrotask(() => {\n if (controller.signal.aborted) return;\n setLoading(true);\n setTextContent(null);\n });\n fetch(url, { signal: controller.signal })\n .then((res) => {\n if (!res.ok) throw new Error('Failed to load text content.');\n return res.text();\n })\n .then((text) => {\n if (controller.signal.aborted) return;\n setTextContent(text);\n setLoading(false);\n })\n .catch(() => {\n if (controller.signal.aborted) return;\n setTextContent('Failed to load text content.');\n setLoading(false);\n });\n } else {\n queueMicrotask(() => {\n if (controller.signal.aborted) return;\n setLoading(false);\n setTextContent(null);\n });\n }\n return () => controller.abort();\n }, [isOpen, isText, url]);\n\n if (!node) return null;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className='max-w-4xl w-[90vw] h-[85vh] flex flex-col p-0 overflow-hidden gap-0'>\n <DialogHeader className='p-4 border-b flex-row items-center justify-between space-y-0'>\n <div className='flex items-center gap-3 pr-8'>\n <FileIcon kind={node.kind} contentType={node.contentType} className='h-5 w-5' />\n <DialogTitle className='text-base font-semibold truncate'>{node.name}</DialogTitle>\n </div>\n <div className='flex items-center gap-2'>\n <a className={buttonVariants({ variant: 'outline', size: 'sm', className: 'h-8 gap-2' })} href={url || '#'} download={node.name}>\n <Download className='h-3.5 w-3.5' />\n <span>Download</span>\n </a>\n <a className={buttonVariants({ variant: 'ghost', size: 'sm', className: 'h-8' })} href={url || '#'} target='_blank' rel='noreferrer' aria-label='Open in new tab'>\n <ExternalLink className='h-3.5 w-3.5' />\n </a>\n </div>\n </DialogHeader>\n\n <div className='flex-1 bg-muted/20 relative overflow-auto flex items-center justify-center'>\n {loading && (\n <div className='absolute inset-0 flex items-center justify-center bg-background/50 z-10'>\n <Loader2 className='h-8 w-8 animate-spin text-muted-foreground' />\n </div>\n )}\n\n {isImage && url && (\n <img\n src={url}\n alt={node.name}\n className='max-w-full max-h-full object-contain shadow-lg'\n onLoad={() => setLoading(false)}\n />\n )}\n\n {isPdf && url && (\n <iframe\n src={`${url}#toolbar=0`}\n title={node.name}\n className='w-full h-full border-none'\n onLoad={() => setLoading(false)}\n />\n )}\n\n {isText && textContent !== null && (\n <pre className='w-full h-full p-6 font-mono text-xs overflow-auto bg-background whitespace-pre-wrap'>\n {textContent}\n </pre>\n )}\n\n {!isImage && !isPdf && !isText && (\n <div className='text-center p-12'>\n <FileIcon\n kind={node.kind}\n contentType={node.contentType}\n className='h-16 w-16 mx-auto mb-4 opacity-20'\n />\n <p className='text-muted-foreground'>Preview not available for this file type.</p>\n <p className='text-xs mt-2'>Please download the file to view it.</p>\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"filter.cjs","names":["useFilter","cn","FieldFactory","FilterInput","Button","require_ui_lib_utils","require_ui_components_ui_button_components","require_tools_components_ui_field","require_filter_apply","require_filter_reset","require_tools_components_filter_use_filter","require_tools_components_filter_filter_inputs","react_jsx_runtime","SchemaFilter","fieldSpecs","globalLabelPosition","globalLabelWidth","globalOverlappingLabel","globalShowPlaceholderOnAll","globalInputClassName","autoApply","onChange","displayApplyLabel","applyLabel","displayResetLabel","resetLabel","handleApply","filter","handleReset","reset","testId","className","fields","field","values","setField","value","debounceMs","isEmpty"],"sources":["../../../../src/tools/components/filter/filter.tsx"],"sourcesContent":["/**\n * @fileoverview フィルターUIコンポーネント\n *\n * スキーマベースのフィルターUIを提供します。\n * useFilterフックと各種フィルター入力を組み合わせて、\n * 完全なフィルタリングUIを構築します。\n *\n * @module filter/filter\n */\n\n'use client';\n\nimport * as m from '../../paraglide/messages.js';\nimport { cn } from \"../../lib/utils\";\nimport { Button } from '../ui/button';\nimport { FilterInput } from './filter-inputs';\nimport { useFilter } from './use-filter';\nimport { FilterProps, FilterResult } from './filter-types';\nimport { FieldFactory } from '../ui/field';\n\n// =============================================================================\n// Filter Component\n// =============================================================================\n\n/**\n * Filter Component\n * フィルターUIコンポーネント\n *\n * Schema-based filter UI with type inference.\n * スキーマからフィールド型を推論し、適切なフィルター入力を自動選択します。\n * MongoDBスタイルのフィルターオブジェクトを生成し、useFindと連携できます。\n *\n * ## AI/Automation Features\n * - `data-testid`: Container, apply/reset buttons\n * - Pattern: `{testId}`, `{testId}-apply`, `{testId}-reset`\n * - Filter inputs auto-generate testId from field name\n *\n * @example Basic usage with testId\n * ```tsx\n * <Filter\n * testId=\"user-filter\"\n * schema={userSchema}\n * fields={['name', 'age', 'status']}\n * showPlaceholderOnAll={true}\n * onChange={(filter) => setQueryFilter(filter)}\n * />\n * // Container: data-testid=\"user-filter\"\n * // Apply button: data-testid=\"user-filter-apply\"\n * // Reset button: data-testid=\"user-filter-reset\"\n * // Filter inputs auto-generate testId from field name\n *\n * @example Customizing filter widths\n * ```tsx\n * <Filter\n * schema={userSchema}\n * fields={[\n * { field: 'name', className: 'min-w-[300px]' }, // Specific field\n * 'status'\n * ]}\n * inputClassName=\"min-w-[200px]\" // Global default for this instance\n * />\n * ```\n */\nexport function SchemaFilter({\n testId,\n schema,\n fields: fieldSpecs,\n defaultValues,\n onChange,\n autoApply = true,\n applyLabel = '適用',\n resetLabel,\n className,\n labelPosition: globalLabelPosition,\n labelWidth: globalLabelWidth,\n overlappingLabel: globalOverlappingLabel,\n showPlaceholderOnAll: globalShowPlaceholderOnAll,\n inputClassName: globalInputClassName,\n locale, // Add locale to destructured props\n debounceMs,\n}: FilterProps) {\n const { values, filter, fields, setField, reset, isEmpty } = useFilter({\n schema,\n fields: fieldSpecs,\n defaultValues,\n onChange: autoApply ? onChange : undefined,\n debounceMs,\n });\n\n const displayApplyLabel = applyLabel || m.filter_apply();\n const displayResetLabel = resetLabel || m.filter_reset();\n\n /**\n * 適用ボタンのハンドラー\n */\n const handleApply = () => {\n onChange?.(filter);\n };\n\n /**\n * リセットボタンのハンドラー\n */\n const handleReset = () => {\n reset();\n if (!autoApply) {\n onChange?.({});\n }\n };\n\n return (\n <div\n data-testid={testId}\n className={cn(\n 'w-full',\n 'grid gap-x-4 gap-y-2',\n // Responsive grid: 1 column on small screens, 2 columns on sm+\n 'grid-cols-1 sm:grid-cols-2',\n className,\n )}\n >\n {fields.map((field) => (\n <FieldFactory\n key={field.field}\n data-testid={testId ? `${testId}-${field.field}` : undefined}\n label={field.label}\n labelPosition={field.labelPosition || globalLabelPosition || 'responsive'}\n labelWidth={field.labelWidth || globalLabelWidth}\n overlappingLabel={\n field.overlappingLabel !== undefined ? field.overlappingLabel : globalOverlappingLabel\n }\n showPlaceholderOnAll={\n field.showPlaceholderOnAll !== undefined\n ? field.showPlaceholderOnAll\n : globalShowPlaceholderOnAll\n }\n >\n <FilterInput\n field={field}\n value={values[field.field]}\n onChange={(value) => setField(field.field, value)}\n showPlaceholderOnAll={\n field.showPlaceholderOnAll !== undefined\n ? field.showPlaceholderOnAll\n : globalShowPlaceholderOnAll\n }\n className={field.className || globalInputClassName}\n locale={locale} // Pass locale down\n debounceMs={field.debounceMs !== undefined ? field.debounceMs : debounceMs}\n />\n </FieldFactory>\n ))}\n\n {/* ボタン(autoApply=falseの場合のみ表示) */}\n {!autoApply && (\n <div className='flex items-end gap-2'>\n <Button\n testId={testId ? `${testId}-apply` : undefined}\n onClick={handleApply}\n variant='default'\n >\n {displayApplyLabel}\n </Button>\n <Button\n testId={testId ? `${testId}-reset` : undefined}\n onClick={handleReset}\n variant='outline'\n disabled={isEmpty}\n >\n {displayResetLabel}\n </Button>\n </div>\n )}\n\n {/* autoApply時のリセットボタン */}\n {autoApply && !isEmpty && (\n <div className='flex items-end'>\n <Button\n testId={testId ? `${testId}-reset` : undefined}\n onClick={handleReset}\n variant='ghost'\n size='sm'\n >\n {displayResetLabel}\n </Button>\n </div>\n )}\n </div>\n );\n}\nSchemaFilter.displayName = 'SchemaFilter';\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport type { FilterProps, FilterResult };\n"],"mappings":"A,obA+DA,SAAgBa,EAAa,CAC3B,SACA,SACA,OAAQC,EACR,gBACA,WACA,YAAY,GACZ,aAAa,KACb,aACA,YACA,cAAeC,EACf,WAAYC,EACZ,iBAAkBC,EAClB,qBAAsBC,EACtB,eAAgBC,EAChB,SACA,cACc,CACd,GAAM,CAAE,SAAQ,SAAQ,SAAQ,WAAU,QAAO,WAAYnB,EAAAA,UAAU,CACrE,SACA,OAAQc,EACR,gBACA,SAAUM,EAAYC,EAAW,IAAA,GACjC,YACF,CAAC,EAEKC,EAAoBC,GAAAf,EAAA,aAA6B,EACjDgB,EAAoBC,GAAAhB,EAAA,aAA6B,EAKjDiB,MAAoB,CACxBL,IAAWM,CAAM,CACnB,EAKMC,MAAoB,CACxBC,EAAM,EACDT,GACHC,IAAW,CAAC,CAAC,CAEjB,EAEA,OACE,EAAAT,EAAA,KAAA,CAAC,MAAD,CACE,cAAakB,EACb,UAAW7B,EAAAA,GACT,SACA,uBAEA,6BACA8B,CACF,EARF,SAAA,CAUGC,EAAO,IAAK,IACX,EAAApB,EAAA,IAAA,CAACV,EAAAA,aAAD,CAEE,cAAa4B,EAAS,GAAGA,EAAO,GAAGG,EAAM,QAAU,IAAA,GACnD,MAAOA,EAAM,MACb,cAAeA,EAAM,eAAiBlB,GAAuB,aAC7D,WAAYkB,EAAM,YAAcjB,EAChC,iBACEiB,EAAM,mBAAqB,IAAA,GAAqChB,EAAzBgB,EAAM,iBAE/C,qBACEA,EAAM,uBAAyB,IAAA,GAE3Bf,EADAe,EAAM,qBAIZ,UAAA,EAAArB,EAAA,IAAA,CAACT,EAAAA,YAAD,CACS,QACP,MAAO+B,EAAOD,EAAM,OACpB,SAAW,GAAUE,EAASF,EAAM,MAAOG,CAAK,EAChD,qBACEH,EAAM,uBAAyB,IAAA,GAE3Bf,EADAe,EAAM,qBAGZ,UAAWA,EAAM,WAAad,EACtB,SACR,WAAYc,EAAM,aAAe,IAAA,GAA+BI,EAAnBJ,EAAM,UACpD,CAAA,CACW,EA3BPA,EAAM,KA2BC,CACf,EAGA,CAACb,IACA,EAAAR,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,uBAAf,SAAA,EACE,EAAAA,EAAA,IAAA,CAACR,EAAAA,OAAD,CACE,OAAQ0B,EAAS,GAAGA,EAAO,QAAU,IAAA,GACrC,QAASJ,EACT,QAAQ,UAEP,SAAAJ,CACK,CAAA,GACR,EAAAV,EAAA,IAAA,CAACR,EAAAA,OAAD,CACE,OAAQ0B,EAAS,GAAGA,EAAO,QAAU,IAAA,GACrC,QAASF,EACT,QAAQ,UACR,SAAUU,EAET,SAAAd,CACK,CAAA,CACL,C,GAINJ,GAAa,CAACkB,IACb,EAAA1B,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iBACb,UAAA,EAAAA,EAAA,IAAA,CAACR,EAAAA,OAAD,CACE,OAAQ0B,EAAS,GAAGA,EAAO,QAAU,IAAA,GACrC,QAASF,EACT,QAAQ,QACR,KAAK,KAEJ,SAAAJ,CACK,CAAA,CACL,CAAA,CAEJ,C,EAET,CACA,EAAa,YAAc,e"}
1
+ {"version":3,"file":"filter.cjs","names":["useFilter","cn","FieldFactory","FilterInput","Button","require_ui_lib_utils","require_ui_components_ui_button_components","require_tools_components_ui_field","require_filter_apply","require_filter_reset","require_tools_components_filter_use_filter","require_tools_components_filter_filter_inputs","react_jsx_runtime","SchemaFilter","fieldSpecs","globalLabelPosition","globalLabelWidth","globalOverlappingLabel","globalShowPlaceholderOnAll","globalInputClassName","autoApply","onChange","displayApplyLabel","applyLabel","displayResetLabel","resetLabel","handleApply","filter","handleReset","reset","testId","className","fields","field","values","setField","value","debounceMs","isEmpty"],"sources":["../../../../src/tools/components/filter/filter.tsx"],"sourcesContent":["/**\n * @fileoverview フィルターUIコンポーネント\n *\n * スキーマベースのフィルターUIを提供します。\n * useFilterフックと各種フィルター入力を組み合わせて、\n * 完全なフィルタリングUIを構築します。\n *\n * @module filter/filter\n */\n\n'use client';\n\nimport * as m from '../../paraglide/messages.js';\nimport { cn } from \"../../lib/utils\";\nimport { Button } from '../ui/button';\nimport { FilterInput } from './filter-inputs';\nimport { useFilter } from './use-filter';\nimport { FilterProps, FilterResult } from './filter-types';\nimport { FieldFactory } from '../ui/field';\n\n// =============================================================================\n// Filter Component\n// =============================================================================\n\n/**\n * Renders schema-derived filter inputs and emits a MongoDB-style filter object.\n * @param props - Field specifications, optional collection schema, labels and change callback; see {@link FilterProps}.\n * @returns A responsive filter grid with apply/reset buttons when autoApply is false.\n * @remarks Import Appkit CSS. This component creates local filter state; the host must apply the\n * emitted filter to its own data query. autoApply defaults to true; false defers onChange\n * until Apply or Reset. Reset emits an empty filter in manual mode. layout is currently ignored.\n * With testId, the root uses data-testid=testId and field wrappers use `${testId}-${field}`.\n * Manual apply/reset buttons use `${testId}-apply` and `${testId}-reset`; they are absent in auto mode.\n * @example\n * ```tsx\n * import { useState } from 'react';\n * import { SchemaFilter, type CollectionSchema, type FilterResult } from '@alneas/appkit-react/tools/filter';\n * import '@alneas/appkit-react/styles';\n *\n * const schema: CollectionSchema = {\n * name: { type: 'string', label: 'Name' },\n * status: { type: 'enum', enum: ['active', 'inactive'], label: 'Status' },\n * };\n * export function UserFilter() {\n * const [filter, setFilter] = useState<FilterResult>({});\n * return <><SchemaFilter testId=\"user-filter\" schema={schema} autoApply={false}\n * fields={[{ field: 'name', className: 'min-w-[300px]' }, 'status']}\n * inputClassName=\"min-w-[200px]\" onChange={setFilter} />\n * <pre>{JSON.stringify(filter)}</pre></>;\n * }\n * ```\n */\nexport function SchemaFilter({\n testId,\n schema,\n fields: fieldSpecs,\n defaultValues,\n onChange,\n autoApply = true,\n applyLabel = '適用',\n resetLabel,\n className,\n labelPosition: globalLabelPosition,\n labelWidth: globalLabelWidth,\n overlappingLabel: globalOverlappingLabel,\n showPlaceholderOnAll: globalShowPlaceholderOnAll,\n inputClassName: globalInputClassName,\n locale, // Add locale to destructured props\n debounceMs,\n}: FilterProps) {\n const { values, filter, fields, setField, reset, isEmpty } = useFilter({\n schema,\n fields: fieldSpecs,\n defaultValues,\n onChange: autoApply ? onChange : undefined,\n debounceMs,\n });\n\n const displayApplyLabel = applyLabel || m.filter_apply();\n const displayResetLabel = resetLabel || m.filter_reset();\n\n /**\n * 適用ボタンのハンドラー\n */\n const handleApply = () => {\n onChange?.(filter);\n };\n\n /**\n * リセットボタンのハンドラー\n */\n const handleReset = () => {\n reset();\n if (!autoApply) {\n onChange?.({});\n }\n };\n\n return (\n <div\n data-testid={testId}\n className={cn(\n 'w-full',\n 'grid gap-x-4 gap-y-2',\n // Responsive grid: 1 column on small screens, 2 columns on sm+\n 'grid-cols-1 sm:grid-cols-2',\n className,\n )}\n >\n {fields.map((field) => (\n <FieldFactory\n key={field.field}\n data-testid={testId ? `${testId}-${field.field}` : undefined}\n label={field.label}\n labelPosition={field.labelPosition || globalLabelPosition || 'responsive'}\n labelWidth={field.labelWidth || globalLabelWidth}\n overlappingLabel={\n field.overlappingLabel !== undefined ? field.overlappingLabel : globalOverlappingLabel\n }\n showPlaceholderOnAll={\n field.showPlaceholderOnAll !== undefined\n ? field.showPlaceholderOnAll\n : globalShowPlaceholderOnAll\n }\n >\n <FilterInput\n field={field}\n value={values[field.field]}\n onChange={(value) => setField(field.field, value)}\n showPlaceholderOnAll={\n field.showPlaceholderOnAll !== undefined\n ? field.showPlaceholderOnAll\n : globalShowPlaceholderOnAll\n }\n className={field.className || globalInputClassName}\n locale={locale} // Pass locale down\n debounceMs={field.debounceMs !== undefined ? field.debounceMs : debounceMs}\n />\n </FieldFactory>\n ))}\n\n {/* ボタン(autoApply=falseの場合のみ表示) */}\n {!autoApply && (\n <div className='flex items-end gap-2'>\n <Button\n testId={testId ? `${testId}-apply` : undefined}\n onClick={handleApply}\n variant='default'\n >\n {displayApplyLabel}\n </Button>\n <Button\n testId={testId ? `${testId}-reset` : undefined}\n onClick={handleReset}\n variant='outline'\n disabled={isEmpty}\n >\n {displayResetLabel}\n </Button>\n </div>\n )}\n\n {/* autoApply時のリセットボタン */}\n {autoApply && !isEmpty && (\n <div className='flex items-end'>\n <Button\n testId={testId ? `${testId}-reset` : undefined}\n onClick={handleReset}\n variant='ghost'\n size='sm'\n >\n {displayResetLabel}\n </Button>\n </div>\n )}\n </div>\n );\n}\nSchemaFilter.displayName = 'SchemaFilter';\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport type { FilterProps, FilterResult };\n"],"mappings":"A,obAoDA,SAAgBa,EAAa,CAC3B,SACA,SACA,OAAQC,EACR,gBACA,WACA,YAAY,GACZ,aAAa,KACb,aACA,YACA,cAAeC,EACf,WAAYC,EACZ,iBAAkBC,EAClB,qBAAsBC,EACtB,eAAgBC,EAChB,SACA,cACc,CACd,GAAM,CAAE,SAAQ,SAAQ,SAAQ,WAAU,QAAO,WAAYnB,EAAAA,UAAU,CACrE,SACA,OAAQc,EACR,gBACA,SAAUM,EAAYC,EAAW,IAAA,GACjC,YACF,CAAC,EAEKC,EAAoBC,GAAAf,EAAA,aAA6B,EACjDgB,EAAoBC,GAAAhB,EAAA,aAA6B,EAKjDiB,MAAoB,CACxBL,IAAWM,CAAM,CACnB,EAKMC,MAAoB,CACxBC,EAAM,EACDT,GACHC,IAAW,CAAC,CAAC,CAEjB,EAEA,OACE,EAAAT,EAAA,KAAA,CAAC,MAAD,CACE,cAAakB,EACb,UAAW7B,EAAAA,GACT,SACA,uBAEA,6BACA8B,CACF,EARF,SAAA,CAUGC,EAAO,IAAK,IACX,EAAApB,EAAA,IAAA,CAACV,EAAAA,aAAD,CAEE,cAAa4B,EAAS,GAAGA,EAAO,GAAGG,EAAM,QAAU,IAAA,GACnD,MAAOA,EAAM,MACb,cAAeA,EAAM,eAAiBlB,GAAuB,aAC7D,WAAYkB,EAAM,YAAcjB,EAChC,iBACEiB,EAAM,mBAAqB,IAAA,GAAqChB,EAAzBgB,EAAM,iBAE/C,qBACEA,EAAM,uBAAyB,IAAA,GAE3Bf,EADAe,EAAM,qBAIZ,UAAA,EAAArB,EAAA,IAAA,CAACT,EAAAA,YAAD,CACS,QACP,MAAO+B,EAAOD,EAAM,OACpB,SAAW,GAAUE,EAASF,EAAM,MAAOG,CAAK,EAChD,qBACEH,EAAM,uBAAyB,IAAA,GAE3Bf,EADAe,EAAM,qBAGZ,UAAWA,EAAM,WAAad,EACtB,SACR,WAAYc,EAAM,aAAe,IAAA,GAA+BI,EAAnBJ,EAAM,UACpD,CAAA,CACW,EA3BPA,EAAM,KA2BC,CACf,EAGA,CAACb,IACA,EAAAR,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,uBAAf,SAAA,EACE,EAAAA,EAAA,IAAA,CAACR,EAAAA,OAAD,CACE,OAAQ0B,EAAS,GAAGA,EAAO,QAAU,IAAA,GACrC,QAASJ,EACT,QAAQ,UAEP,SAAAJ,CACK,CAAA,GACR,EAAAV,EAAA,IAAA,CAACR,EAAAA,OAAD,CACE,OAAQ0B,EAAS,GAAGA,EAAO,QAAU,IAAA,GACrC,QAASF,EACT,QAAQ,UACR,SAAUU,EAET,SAAAd,CACK,CAAA,CACL,C,GAINJ,GAAa,CAACkB,IACb,EAAA1B,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iBACb,UAAA,EAAAA,EAAA,IAAA,CAACR,EAAAA,OAAD,CACE,OAAQ0B,EAAS,GAAGA,EAAO,QAAU,IAAA,GACrC,QAASF,EACT,QAAQ,QACR,KAAK,KAEJ,SAAAJ,CACK,CAAA,CACL,CAAA,CAEJ,C,EAET,CACA,EAAa,YAAc,e"}