@burdenoff/microfe-bigconsole 2026.805.2 → 2026.812.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/dist/bigconsole/components/DrilldownDashboardRenderer.js +118 -106
  2. package/dist/bigconsole/components/DrilldownDashboardRenderer.js.map +1 -1
  3. package/dist/bigconsole/components/DrilldownModal.js +54 -50
  4. package/dist/bigconsole/components/DrilldownModal.js.map +1 -1
  5. package/dist/bigconsole/components/builder/BuilderCanvas.js +2 -2
  6. package/dist/bigconsole/components/builder/BuilderCanvas.js.map +1 -1
  7. package/dist/bigconsole/components/builder/BuilderTopbar.js +3 -3
  8. package/dist/bigconsole/components/builder/BuilderTopbar.js.map +1 -1
  9. package/dist/bigconsole/components/builder/inspector/AdvancedSection.js +24 -25
  10. package/dist/bigconsole/components/builder/inspector/AdvancedSection.js.map +1 -1
  11. package/dist/bigconsole/components/builder/inspector/AppearanceSection.js +40 -29
  12. package/dist/bigconsole/components/builder/inspector/AppearanceSection.js.map +1 -1
  13. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +145 -111
  14. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js.map +1 -1
  15. package/dist/bigconsole/components/builder/inspector/GeneralSection.js +58 -44
  16. package/dist/bigconsole/components/builder/inspector/GeneralSection.js.map +1 -1
  17. package/dist/bigconsole/components/common/Section.js +70 -0
  18. package/dist/bigconsole/components/common/Section.js.map +1 -0
  19. package/dist/bigconsole/components/common/index.js +2 -0
  20. package/dist/bigconsole/components/common/sectionStyles.js +42 -0
  21. package/dist/bigconsole/components/common/sectionStyles.js.map +1 -0
  22. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +269 -251
  23. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
  24. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +214 -223
  25. package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
  26. package/dist/bigconsole/components/dashboard/DashboardGrid.js +12 -18
  27. package/dist/bigconsole/components/dashboard/DashboardGrid.js.map +1 -1
  28. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +110 -102
  29. package/dist/bigconsole/components/dashboard/DashboardToolbar.js.map +1 -1
  30. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +81 -68
  31. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
  32. package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js +125 -159
  33. package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js.map +1 -1
  34. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +147 -144
  35. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js.map +1 -1
  36. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +154 -153
  37. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js.map +1 -1
  38. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +82 -79
  39. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js.map +1 -1
  40. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +171 -284
  41. package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
  42. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +250 -273
  43. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  44. package/dist/bigconsole/components/dashboard/LiveBoardBanner.js +45 -53
  45. package/dist/bigconsole/components/dashboard/LiveBoardBanner.js.map +1 -1
  46. package/dist/bigconsole/components/dashboard/PageTabsManager/PageTabsManager.js +157 -148
  47. package/dist/bigconsole/components/dashboard/PageTabsManager/PageTabsManager.js.map +1 -1
  48. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +75 -83
  49. package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js.map +1 -1
  50. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +167 -161
  51. package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js.map +1 -1
  52. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +181 -190
  53. package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js.map +1 -1
  54. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js +101 -95
  55. package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js.map +1 -1
  56. package/dist/bigconsole/components/dashboard/StoreTemplatePicker.js +20 -18
  57. package/dist/bigconsole/components/dashboard/StoreTemplatePicker.js.map +1 -1
  58. package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -0
  59. package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js +26 -58
  60. package/dist/bigconsole/components/dashboard/TemplateSetupBanner.js.map +1 -1
  61. package/dist/bigconsole/components/dashboard/WidgetPalette.js +307 -229
  62. package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
  63. package/dist/bigconsole/components/datasink/CacheTTLSelector.js +128 -129
  64. package/dist/bigconsole/components/datasink/CacheTTLSelector.js.map +1 -1
  65. package/dist/bigconsole/components/datasink/DataSinkCard.js +78 -79
  66. package/dist/bigconsole/components/datasink/DataSinkCard.js.map +1 -1
  67. package/dist/bigconsole/components/datasink/DataSinkDataViewer.js +33 -34
  68. package/dist/bigconsole/components/datasink/DataSinkDataViewer.js.map +1 -1
  69. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +79 -61
  70. package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js.map +1 -1
  71. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +75 -64
  72. package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js.map +1 -1
  73. package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js +1 -1
  74. package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js.map +1 -1
  75. package/dist/bigconsole/components/datasink/DataSinkTableViewer.js +20 -19
  76. package/dist/bigconsole/components/datasink/DataSinkTableViewer.js.map +1 -1
  77. package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js +127 -171
  78. package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js.map +1 -1
  79. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +113 -117
  80. package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js.map +1 -1
  81. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +312 -307
  82. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
  83. package/dist/bigconsole/components/datasink/LinkedParsersPanel.js +65 -66
  84. package/dist/bigconsole/components/datasink/LinkedParsersPanel.js.map +1 -1
  85. package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js +121 -127
  86. package/dist/bigconsole/components/datasink/LinkedWorkflowsPanel.js.map +1 -1
  87. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +194 -189
  88. package/dist/bigconsole/components/datasink/RefreshTypeSelector.js.map +1 -1
  89. package/dist/bigconsole/components/datasink/SetupStateBadge.js +3 -3
  90. package/dist/bigconsole/components/datasink/SetupStateBadge.js.map +1 -1
  91. package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js +95 -95
  92. package/dist/bigconsole/components/datasink/WorkflowStatusPanel.js.map +1 -1
  93. package/dist/bigconsole/components/parser/DataSinkSelector.js +163 -131
  94. package/dist/bigconsole/components/parser/DataSinkSelector.js.map +1 -1
  95. package/dist/bigconsole/components/parser/ExpressionEditor.js +3 -3
  96. package/dist/bigconsole/components/parser/ExpressionEditor.js.map +1 -1
  97. package/dist/bigconsole/components/parser/ImportParserDialog.js +205 -260
  98. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  99. package/dist/bigconsole/components/parser/ParserCard.js +133 -114
  100. package/dist/bigconsole/components/parser/ParserCard.js.map +1 -1
  101. package/dist/bigconsole/components/parser/ParserSelector.js +193 -174
  102. package/dist/bigconsole/components/parser/ParserSelector.js.map +1 -1
  103. package/dist/bigconsole/components/parser/ParserStatusBadge.js +2 -2
  104. package/dist/bigconsole/components/parser/ParserStatusBadge.js.map +1 -1
  105. package/dist/bigconsole/components/parser/ParserTypeBadge.js +4 -4
  106. package/dist/bigconsole/components/parser/ParserTypeBadge.js.map +1 -1
  107. package/dist/bigconsole/components/pipeline/PipelineCard.js +134 -89
  108. package/dist/bigconsole/components/pipeline/PipelineCard.js.map +1 -1
  109. package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js +77 -64
  110. package/dist/bigconsole/components/pipeline/PipelineDeleteDialog.js.map +1 -1
  111. package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js +7 -10
  112. package/dist/bigconsole/components/pipeline/PipelineStatusBadge.js.map +1 -1
  113. package/dist/bigconsole/components/preview/AiPreviewContent.js +31 -32
  114. package/dist/bigconsole/components/preview/AiPreviewContent.js.map +1 -1
  115. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +152 -103
  116. package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js.map +1 -1
  117. package/dist/bigconsole/components/preview/AiPreviewPanel.js +193 -148
  118. package/dist/bigconsole/components/preview/AiPreviewPanel.js.map +1 -1
  119. package/dist/bigconsole/components/preview/previewShared.js +41 -23
  120. package/dist/bigconsole/components/preview/previewShared.js.map +1 -1
  121. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +405 -364
  122. package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
  123. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +265 -237
  124. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
  125. package/dist/bigconsole/components/widgets/PropertiesPanel.js +764 -821
  126. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  127. package/dist/bigconsole/components/widgets/WidgetErrorBoundary.js +7 -5
  128. package/dist/bigconsole/components/widgets/WidgetErrorBoundary.js.map +1 -1
  129. package/dist/bigconsole/components/widgets/WidgetHeader.js +7 -8
  130. package/dist/bigconsole/components/widgets/WidgetHeader.js.map +1 -1
  131. package/dist/bigconsole/components/widgets/WidgetWrapper.js +8 -7
  132. package/dist/bigconsole/components/widgets/WidgetWrapper.js.map +1 -1
  133. package/dist/bigconsole/components/widgets/adaptive-card/AdaptiveCardWidget.js +1 -1
  134. package/dist/bigconsole/components/widgets/adaptive-card/AdaptiveCardWidget.js.map +1 -1
  135. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +46 -49
  136. package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js.map +1 -1
  137. package/dist/bigconsole/components/widgets/chart/ChartConfig.js +154 -147
  138. package/dist/bigconsole/components/widgets/chart/ChartConfig.js.map +1 -1
  139. package/dist/bigconsole/components/widgets/comments/WidgetComments.js +118 -101
  140. package/dist/bigconsole/components/widgets/comments/WidgetComments.js.map +1 -1
  141. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +244 -191
  142. package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js.map +1 -1
  143. package/dist/bigconsole/components/widgets/form/FormWidget.js +167 -159
  144. package/dist/bigconsole/components/widgets/form/FormWidget.js.map +1 -1
  145. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +92 -76
  146. package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js.map +1 -1
  147. package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js +1 -1
  148. package/dist/bigconsole/components/widgets/gauge/GaugeWidget.js.map +1 -1
  149. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +89 -86
  150. package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js.map +1 -1
  151. package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js +2 -2
  152. package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js.map +1 -1
  153. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +64 -63
  154. package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js.map +1 -1
  155. package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js +2 -2
  156. package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js.map +1 -1
  157. package/dist/bigconsole/components/widgets/list/ListConfig.js +65 -58
  158. package/dist/bigconsole/components/widgets/list/ListConfig.js.map +1 -1
  159. package/dist/bigconsole/components/widgets/list/ListItem.js +1 -1
  160. package/dist/bigconsole/components/widgets/list/ListItem.js.map +1 -1
  161. package/dist/bigconsole/components/widgets/map-widget/MapWidget.js +1 -1
  162. package/dist/bigconsole/components/widgets/map-widget/MapWidget.js.map +1 -1
  163. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +79 -72
  164. package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js.map +1 -1
  165. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +35 -34
  166. package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js.map +1 -1
  167. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +20 -19
  168. package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js.map +1 -1
  169. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +181 -180
  170. package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js.map +1 -1
  171. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +100 -90
  172. package/dist/bigconsole/components/widgets/progress/ProgressConfig.js.map +1 -1
  173. package/dist/bigconsole/components/widgets/retention/RetentionWidget.js +3 -3
  174. package/dist/bigconsole/components/widgets/retention/RetentionWidget.js.map +1 -1
  175. package/dist/bigconsole/components/widgets/states/EmptyState.js +6 -4
  176. package/dist/bigconsole/components/widgets/states/EmptyState.js.map +1 -1
  177. package/dist/bigconsole/components/widgets/states/ErrorState.js +7 -5
  178. package/dist/bigconsole/components/widgets/states/ErrorState.js.map +1 -1
  179. package/dist/bigconsole/components/widgets/states/LoadingState.js +5 -4
  180. package/dist/bigconsole/components/widgets/states/LoadingState.js.map +1 -1
  181. package/dist/bigconsole/components/widgets/table/TableConfig.js +193 -172
  182. package/dist/bigconsole/components/widgets/table/TableConfig.js.map +1 -1
  183. package/dist/bigconsole/components/widgets/table/TableHeader.js +1 -1
  184. package/dist/bigconsole/components/widgets/table/TableHeader.js.map +1 -1
  185. package/dist/bigconsole/components/widgets/table/TableWidget.js +1 -1
  186. package/dist/bigconsole/components/widgets/table/TableWidget.js.map +1 -1
  187. package/dist/bigconsole/components/widgets/text-widget/TextWidget.js +1 -1
  188. package/dist/bigconsole/components/widgets/text-widget/TextWidget.js.map +1 -1
  189. package/dist/bigconsole/components/widgets/timeline/TimelineWidget.js +3 -3
  190. package/dist/bigconsole/components/widgets/timeline/TimelineWidget.js.map +1 -1
  191. package/dist/bigconsole/components/widgets/utils/conditionalFormat.js +2 -2
  192. package/dist/bigconsole/components/widgets/utils/conditionalFormat.js.map +1 -1
  193. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +283 -249
  194. package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js.map +1 -1
  195. package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js +28 -20
  196. package/dist/bigconsole/components/widgets/widget-actions/WidgetActions.js.map +1 -1
  197. package/dist/bigconsole/components/workflow/WorkflowCard.js +92 -77
  198. package/dist/bigconsole/components/workflow/WorkflowCard.js.map +1 -1
  199. package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js +70 -51
  200. package/dist/bigconsole/components/workflow/WorkflowDeleteDialog.js.map +1 -1
  201. package/dist/bigconsole/components/workflow/WorkflowStatusBadge.js +16 -17
  202. package/dist/bigconsole/components/workflow/WorkflowStatusBadge.js.map +1 -1
  203. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +46 -42
  204. package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js.map +1 -1
  205. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +372 -348
  206. package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
  207. package/dist/bigconsole/hooks/useModalFocusTrap.js +53 -0
  208. package/dist/bigconsole/hooks/useModalFocusTrap.js.map +1 -0
  209. package/dist/bigconsole/pages/DashboardBuilderPage.js +153 -142
  210. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  211. package/dist/bigconsole/pages/DashboardViewPage.js +230 -220
  212. package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
  213. package/dist/bigconsole/pages/DashboardsPage.js +832 -790
  214. package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
  215. package/dist/bigconsole/pages/DataParsersPage.js +249 -304
  216. package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
  217. package/dist/bigconsole/pages/DataSinkBuilderPage.js +324 -349
  218. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  219. package/dist/bigconsole/pages/DataSinkViewPage.js +336 -323
  220. package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
  221. package/dist/bigconsole/pages/DataSinksPage.js +356 -458
  222. package/dist/bigconsole/pages/DataSinksPage.js.map +1 -1
  223. package/dist/bigconsole/pages/DataSourcesPage.js +14 -8
  224. package/dist/bigconsole/pages/DataSourcesPage.js.map +1 -1
  225. package/dist/bigconsole/pages/HomePage.js +186 -193
  226. package/dist/bigconsole/pages/HomePage.js.map +1 -1
  227. package/dist/bigconsole/pages/InsightsPage.js +901 -724
  228. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  229. package/dist/bigconsole/pages/ParserBuilderPage.js +769 -675
  230. package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
  231. package/dist/bigconsole/pages/ParserViewPage.js +382 -354
  232. package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
  233. package/dist/bigconsole/pages/PipelineBuilderPage.js +540 -420
  234. package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
  235. package/dist/bigconsole/pages/PipelineViewPage.js +416 -384
  236. package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
  237. package/dist/bigconsole/pages/PipelinesPage.js +260 -309
  238. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  239. package/dist/bigconsole/pages/SettingsPage.js +177 -172
  240. package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
  241. package/dist/bigconsole/pages/WidgetDemoPage.js +278 -142
  242. package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
  243. package/dist/bigconsole/pages/WorkflowViewPage.js +382 -366
  244. package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
  245. package/dist/bigconsole/pages/WorkflowsPage.js +202 -316
  246. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  247. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +111 -109
  248. package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js.map +1 -1
  249. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +127 -126
  250. package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js.map +1 -1
  251. package/dist/bigconsole/renderers/adapters/CustomRenderer.js +103 -103
  252. package/dist/bigconsole/renderers/adapters/CustomRenderer.js.map +1 -1
  253. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ImportParserDialog.js","names":[],"sources":["../../../../src/bigconsole/components/parser/ImportParserDialog.tsx"],"sourcesContent":["/**\n * ImportParserDialog Component\n *\n * Modal dialog for importing a parser from JSON file.\n * Supports both creating new parsers and updating existing ones.\n */\n\nimport { type FC, memo, useState, useCallback, useEffect, useRef } from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Input } from '@burdenoff/fe-libs/ui';\nimport { Label } from '@burdenoff/fe-libs/ui';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { Card, CardContent } from '@burdenoff/fe-libs/ui';\nimport { Badge } from '@burdenoff/fe-libs/ui';\nimport { Upload, FileJson, Check, XCircle, ArrowLeft, RefreshCw, Info } from 'lucide-react';\nimport { useImportParser, type ImportParserOptions } from '../../hooks';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ImportParserDialogProps {\n isOpen: boolean;\n onClose: () => void;\n /** Console ID where the parser will be created */\n consoleId: string;\n onSuccess?: (parserId: string, parserName: string, originalUpdated: boolean) => void;\n}\n\ntype ImportStep = 'select' | 'preview' | 'importing' | 'complete';\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const ImportParserDialog: FC<ImportParserDialogProps> = memo(function ImportParserDialog({\n isOpen,\n onClose,\n consoleId,\n onSuccess,\n}) {\n const [step, setStep] = useState<ImportStep>('select');\n const [, setSelectedFile] = useState<File | null>(null);\n const [fileContent, setFileContent] = useState<string | null>(null);\n const [nameOverride, setNameOverride] = useState('');\n const [inputSinkKeyOverride, setInputSinkKeyOverride] = useState('');\n const [outputKeyOverride, setOutputKeyOverride] = useState('');\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const { loading, error, validationResult, importResult, validateImport, importParser, extractParserId, clearState } =\n useImportParser();\n\n // Reset state when dialog opens\n useEffect(() => {\n if (isOpen) {\n setStep('select');\n setSelectedFile(null);\n setFileContent(null);\n setNameOverride('');\n setInputSinkKeyOverride('');\n setOutputKeyOverride('');\n clearState();\n }\n }, [isOpen, clearState]);\n\n // Handle file selection\n const handleFileSelect = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n if (!file.name.endsWith('.json')) {\n alert('Please select a JSON file');\n return;\n }\n\n setSelectedFile(file);\n\n const reader = new FileReader();\n reader.onload = async (event) => {\n const content = event.target?.result as string;\n setFileContent(content);\n\n const result = validateImport(content);\n if (result.isValid && result.parserInfo) {\n setStep('preview');\n setNameOverride(result.parserInfo.name || '');\n setInputSinkKeyOverride(result.parserInfo.inputSinkKey || '');\n setOutputKeyOverride(result.parserInfo.outputKey || '');\n } else {\n setStep('preview');\n }\n };\n reader.onerror = () => {\n alert('Failed to read file');\n };\n reader.readAsText(file);\n },\n [validateImport]\n );\n\n // Handle file drop\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n const file = e.dataTransfer.files?.[0];\n if (file) {\n const dt = new DataTransfer();\n dt.items.add(file);\n if (fileInputRef.current) {\n fileInputRef.current.files = dt.files;\n fileInputRef.current.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n }, []);\n\n // Handle import\n const handleImport = useCallback(async () => {\n if (!fileContent) return;\n\n setStep('importing');\n\n const options: ImportParserOptions = {\n consoleId,\n name: nameOverride.trim() || undefined,\n inputSinkKey: inputSinkKeyOverride.trim() || undefined,\n outputKey: outputKeyOverride.trim() || undefined,\n };\n\n const result = await importParser(fileContent, options);\n\n if (result?.success && result.parser) {\n setStep('complete');\n onSuccess?.(result.parser.id, result.parser.name, result.originalUpdated ?? false);\n } else {\n setStep('preview');\n }\n }, [fileContent, consoleId, nameOverride, inputSinkKeyOverride, outputKeyOverride, importParser, onSuccess]);\n\n const canClose = !loading && step !== 'importing';\n const parserId = fileContent ? extractParserId(fileContent) : null;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && canClose && onClose()}>\n <DialogContent className=\"sm:max-w-lg max-h-[85vh] flex flex-col\">\n <DialogHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex size-10 items-center justify-center rounded-lg bg-action-primary-bg/10\">\n <Upload className=\"size-5 text-primary\" />\n </div>\n <DialogTitle>Import Parser</DialogTitle>\n </div>\n <DialogDescription>Upload a Parser export file to restore it into this workspace.</DialogDescription>\n </DialogHeader>\n\n <div className=\"flex-1 overflow-y-auto py-4 space-y-4\">\n {/* Step 1: File Selection */}\n {step === 'select' && (\n <div\n onDragOver={(e) => e.preventDefault()}\n onDrop={handleDrop}\n className=\"border-2 border-dashed rounded-lg p-8 text-center hover:border-primary transition-colors\"\n >\n <FileJson className=\"size-12 mx-auto text-text-secondary mb-4\" />\n <p className=\"text-sm mb-2\">Drag and drop a parser export file here</p>\n <p className=\"text-xs text-text-secondary mb-4\">or</p>\n <input ref={fileInputRef} type=\"file\" accept=\".json\" onChange={handleFileSelect} className=\"hidden\" />\n <Button onClick={() => fileInputRef.current?.click()} disabled={loading}>\n Browse Files\n </Button>\n <p className=\"text-xs text-text-secondary mt-4\">\n Only .json files exported from BigConsole are supported\n </p>\n </div>\n )}\n\n {/* Step 2: Preview & Options */}\n {(step === 'preview' || step === 'importing') && validationResult && (\n <>\n {/* Parser Info */}\n {validationResult.parserInfo && (\n <Card>\n <CardContent className=\"p-4 space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Parser</span>\n <span className=\"text-sm font-medium\">{validationResult.parserInfo.name}</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Type</span>\n <Badge variant=\"secondary\">{validationResult.parserInfo.type}</Badge>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Input Sink</span>\n <span className=\"text-xs font-mono\">{validationResult.parserInfo.inputSinkKey}</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Output Key</span>\n <span className=\"text-xs font-mono\">{validationResult.parserInfo.outputKey}</span>\n </div>\n {validationResult.parserInfo.exportedFrom && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Source ID</span>\n <span className=\"text-xs text-text-secondary font-mono truncate max-w-[180px]\">\n {validationResult.parserInfo.exportedFrom}\n </span>\n </div>\n )}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Schema Version</span>\n <span className=\"text-xs text-text-secondary\">{validationResult.parserInfo.schemaVersion}</span>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Validation Errors */}\n {validationResult.errors.length > 0 && (\n <Card className=\"border-status-error-border/50 bg-status-error-bg/5\">\n <CardContent className=\"p-3\">\n <div className=\"flex items-center gap-2 mb-2\">\n <XCircle className=\"size-4 text-status-error-text\" />\n <span className=\"text-sm font-medium text-status-error-text\">\n Errors ({validationResult.errors.length})\n </span>\n </div>\n <ul className=\"text-xs text-status-error-text space-y-1\">\n {validationResult.errors.map((err, idx) => (\n <li key={idx}>\n <span className=\"font-mono\">[{err.code}]</span> {err.message}\n </li>\n ))}\n </ul>\n </CardContent>\n </Card>\n )}\n\n {/* Import Options */}\n {validationResult.isValid && (\n <div className=\"space-y-4\">\n <p className=\"text-sm font-medium\">Import Options</p>\n\n {/* Import Info */}\n <Card className=\"border-blue-500/50 bg-blue-500/5\">\n <CardContent className=\"p-3\">\n <div className=\"flex items-start gap-2\">\n <Info className=\"size-4 text-blue-600 mt-0.5 shrink-0\" />\n <div className=\"text-xs text-blue-700 dark:text-blue-400\">\n {parserId ? (\n <>\n <p className=\"font-medium mb-1\">Import will check for existing parser</p>\n <p>\n If the original parser (ID:{' '}\n <code className=\"font-mono bg-blue-200/50 px-1 rounded\">{parserId.slice(0, 8)}...</code>\n ) exists:\n </p>\n <ul className=\"list-disc list-inside mt-1 space-y-0.5\">\n <li>With changes → Update the existing parser</li>\n <li>No changes → Show &quot;already exists&quot; message</li>\n </ul>\n <p className=\"mt-1\">If original doesn&apos;t exist → Create a new parser</p>\n </>\n ) : (\n <>\n <p className=\"font-medium mb-1\">A new parser will be created</p>\n <p>Import as a new parser with the specified configuration.</p>\n </>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"import-name\">Parser Name</Label>\n <Input\n id=\"import-name\"\n type=\"text\"\n value={nameOverride}\n onChange={(e) => setNameOverride(e.target.value)}\n placeholder={validationResult.parserInfo?.name || 'Parser name'}\n disabled={step === 'importing'}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"import-input-sink\">Input Sink Key</Label>\n <Input\n id=\"import-input-sink\"\n type=\"text\"\n value={inputSinkKeyOverride}\n onChange={(e) => setInputSinkKeyOverride(e.target.value)}\n placeholder={validationResult.parserInfo?.inputSinkKey || 'Input sink key'}\n disabled={step === 'importing'}\n />\n <p className=\"text-xs text-text-secondary\">The DataSink key to read input data from.</p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"import-output-key\">Output Key</Label>\n <Input\n id=\"import-output-key\"\n type=\"text\"\n value={outputKeyOverride}\n onChange={(e) => setOutputKeyOverride(e.target.value)}\n placeholder={validationResult.parserInfo?.outputKey || 'Output key'}\n disabled={step === 'importing'}\n />\n <p className=\"text-xs text-text-secondary\">The key to store parsed output data under.</p>\n </div>\n </div>\n )}\n </>\n )}\n\n {/* Step 3: Complete */}\n {step === 'complete' && importResult?.success && (\n <div className=\"text-center py-6\">\n {/* Already Exists - No Changes */}\n {importResult.alreadyExists && (\n <>\n <div className=\"size-16 mx-auto mb-4 rounded-full bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center\">\n <Info className=\"size-8 text-blue-600\" />\n </div>\n <h3 className=\"text-lg font-medium mb-2\">Parser Already Exists</h3>\n <p className=\"text-sm text-text-secondary mb-4\">\n Parser &quot;{importResult.parser?.name}&quot; already exists with the same data. No changes were\n made.\n </p>\n </>\n )}\n\n {/* Updated Existing */}\n {importResult.originalUpdated && !importResult.alreadyExists && (\n <>\n <div className=\"size-16 mx-auto mb-4 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center\">\n <RefreshCw className=\"size-8 text-green-600\" />\n </div>\n <h3 className=\"text-lg font-medium mb-2\">Parser Updated!</h3>\n <p className=\"text-sm text-text-secondary mb-4\">\n Parser &quot;{importResult.parser?.name}&quot; has been updated with the imported data.\n </p>\n </>\n )}\n\n {/* Created New */}\n {!importResult.originalUpdated && !importResult.alreadyExists && (\n <>\n <div className=\"size-16 mx-auto mb-4 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center\">\n <Check className=\"size-8 text-green-600\" />\n </div>\n <h3 className=\"text-lg font-medium mb-2\">Import Successful!</h3>\n <p className=\"text-sm text-text-secondary mb-4\">\n Parser &quot;{importResult.parser?.name}&quot; has been created.\n </p>\n </>\n )}\n </div>\n )}\n\n {/* Error */}\n {error && (\n <Card className=\"border-status-error-border/50 bg-status-error-bg/5\">\n <CardContent className=\"p-3\">\n <p className=\"text-sm text-status-error-text\">{error.message}</p>\n </CardContent>\n </Card>\n )}\n\n {importResult && !importResult.success && importResult.errorMessage && (\n <Card className=\"border-status-error-border/50 bg-status-error-bg/5\">\n <CardContent className=\"p-3\">\n <p className=\"text-sm text-status-error-text\">{importResult.errorMessage}</p>\n </CardContent>\n </Card>\n )}\n </div>\n\n <DialogFooter className=\"flex-row justify-between sm:justify-between\">\n <div>\n {step === 'preview' && (\n <Button\n variant=\"ghost\"\n onClick={() => {\n setStep('select');\n setSelectedFile(null);\n setFileContent(null);\n clearState();\n }}\n disabled={loading}\n >\n <ArrowLeft className=\"size-4\" />\n Back\n </Button>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n {step !== 'complete' && (\n <Button variant=\"outline\" onClick={onClose} disabled={!canClose}>\n Cancel\n </Button>\n )}\n\n {step === 'preview' && validationResult?.isValid && (\n <Button onClick={handleImport} disabled={loading}>\n <Upload className=\"size-4\" />\n Import Parser\n </Button>\n )}\n\n {step === 'importing' && (\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Spinner className=\"size-4\" />\n Importing...\n </div>\n )}\n\n {step === 'complete' && <Button onClick={onClose}>Done</Button>}\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n});\n\nexport default ImportParserDialog;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ImportParserDialog.js","names":[],"sources":["../../../../src/bigconsole/components/parser/ImportParserDialog.tsx"],"sourcesContent":["/**\n * ImportParserDialog Component\n *\n * Modal dialog for importing a parser from JSON file.\n * Supports both creating new parsers and updating existing ones.\n */\n\nimport { type FC, memo, useState, useCallback, useEffect, useRef } from 'react';\nimport {\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Input } from '@burdenoff/fe-libs/ui';\nimport { Label } from '@burdenoff/fe-libs/ui';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { Badge } from '@burdenoff/fe-libs/ui';\nimport { Upload, FileJson, Check, XCircle, ArrowLeft, RefreshCw, Info } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Section } from '../common';\nimport { useImportParser, type ImportParserOptions } from '../../hooks';\n\n/** Key/value row inside the \"parser to import\" summary. Wraps on narrow dialogs. */\nconst SUMMARY_ROW = 'flex flex-wrap items-center justify-between gap-x-2 gap-y-0.5';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ImportParserDialogProps {\n isOpen: boolean;\n onClose: () => void;\n /** Console ID where the parser will be created */\n consoleId: string;\n onSuccess?: (parserId: string, parserName: string, originalUpdated: boolean) => void;\n}\n\ntype ImportStep = 'select' | 'preview' | 'importing' | 'complete';\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const ImportParserDialog: FC<ImportParserDialogProps> = memo(function ImportParserDialog({\n isOpen,\n onClose,\n consoleId,\n onSuccess,\n}) {\n const { t } = useI18n();\n const [step, setStep] = useState<ImportStep>('select');\n const [, setSelectedFile] = useState<File | null>(null);\n const [fileContent, setFileContent] = useState<string | null>(null);\n const [nameOverride, setNameOverride] = useState('');\n const [inputSinkKeyOverride, setInputSinkKeyOverride] = useState('');\n const [outputKeyOverride, setOutputKeyOverride] = useState('');\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const { loading, error, validationResult, importResult, validateImport, importParser, extractParserId, clearState } =\n useImportParser();\n\n // Reset state when dialog opens\n useEffect(() => {\n if (isOpen) {\n setStep('select');\n setSelectedFile(null);\n setFileContent(null);\n setNameOverride('');\n setInputSinkKeyOverride('');\n setOutputKeyOverride('');\n clearState();\n }\n }, [isOpen, clearState]);\n\n // Handle file selection\n const handleFileSelect = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n if (!file.name.endsWith('.json')) {\n alert(t('bigconsole.parsers.import.selectJsonFile', 'Please select a JSON file'));\n return;\n }\n\n setSelectedFile(file);\n\n const reader = new FileReader();\n reader.onload = async (event) => {\n const content = event.target?.result as string;\n setFileContent(content);\n\n const result = validateImport(content);\n if (result.isValid && result.parserInfo) {\n setStep('preview');\n setNameOverride(result.parserInfo.name || '');\n setInputSinkKeyOverride(result.parserInfo.inputSinkKey || '');\n setOutputKeyOverride(result.parserInfo.outputKey || '');\n } else {\n setStep('preview');\n }\n };\n reader.onerror = () => {\n alert(t('bigconsole.parsers.import.readFileFailed', 'Failed to read file'));\n };\n reader.readAsText(file);\n },\n [validateImport, t]\n );\n\n // Handle file drop\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n const file = e.dataTransfer.files?.[0];\n if (file) {\n const dt = new DataTransfer();\n dt.items.add(file);\n if (fileInputRef.current) {\n fileInputRef.current.files = dt.files;\n fileInputRef.current.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n }, []);\n\n // Handle import\n const handleImport = useCallback(async () => {\n if (!fileContent) return;\n\n setStep('importing');\n\n const options: ImportParserOptions = {\n consoleId,\n name: nameOverride.trim() || undefined,\n inputSinkKey: inputSinkKeyOverride.trim() || undefined,\n outputKey: outputKeyOverride.trim() || undefined,\n };\n\n const result = await importParser(fileContent, options);\n\n if (result?.success && result.parser) {\n setStep('complete');\n onSuccess?.(result.parser.id, result.parser.name, result.originalUpdated ?? false);\n } else {\n setStep('preview');\n }\n }, [fileContent, consoleId, nameOverride, inputSinkKeyOverride, outputKeyOverride, importParser, onSuccess]);\n\n const canClose = !loading && step !== 'importing';\n const parserId = fileContent ? extractParserId(fileContent) : null;\n\n return (\n <ResponsiveDialog open={isOpen} onOpenChange={(open) => !open && canClose && onClose()}>\n <ResponsiveDialogContent className=\"sm:max-w-lg max-h-[85vh] flex flex-col\">\n <ResponsiveDialogHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex size-10 shrink-0 items-center justify-center rounded-lg bg-action-primary-bg/10\">\n <Upload className=\"size-5 text-action-primary-bg\" />\n </div>\n <ResponsiveDialogTitle>{t('bigconsole.parsers.import.title', 'Import Parser')}</ResponsiveDialogTitle>\n </div>\n <ResponsiveDialogDescription>\n {t(\n 'bigconsole.parsers.import.description',\n 'Upload a Parser export file to restore it into this workspace.'\n )}\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"flex-1 overflow-y-auto py-4 space-y-4\">\n {/* Step 1: File Selection */}\n {step === 'select' && (\n <div\n onDragOver={(e) => e.preventDefault()}\n onDrop={handleDrop}\n className=\"rounded-card border-2 border-dashed border-[var(--color-border-subtle)] bg-bg-sunken p-6 text-center hover:border-action-primary-bg motion-safe:transition-colors sm:p-8\"\n >\n <FileJson className=\"size-12 mx-auto text-text-secondary mb-4\" />\n <p className=\"text-sm mb-2\">\n {t('bigconsole.parsers.import.dropzoneTitle', 'Drag and drop a parser export file here')}\n </p>\n <p className=\"text-xs text-text-secondary mb-4\">{t('bigconsole.parsers.import.or', 'or')}</p>\n <input ref={fileInputRef} type=\"file\" accept=\".json\" onChange={handleFileSelect} className=\"hidden\" />\n <Button onClick={() => fileInputRef.current?.click()} disabled={loading}>\n {t('bigconsole.parsers.import.browseFiles', 'Browse Files')}\n </Button>\n <p className=\"text-xs text-text-secondary mt-4\">\n {t(\n 'bigconsole.parsers.import.supportedHint',\n 'Only .json files exported from BigConsole are supported'\n )}\n </p>\n </div>\n )}\n\n {/* Step 2: Preview & Options */}\n {(step === 'preview' || step === 'importing') && validationResult && (\n <>\n {/* Parser Info — read-only summary, so it is recessed */}\n {validationResult.parserInfo && (\n <Section\n emphasis=\"muted\"\n padding=\"compact\"\n headingLevel={3}\n title=\"Parser in this file\"\n bodyClassName=\"space-y-2\"\n data-testid=\"import-parser-summary\"\n >\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldParser', 'Parser')}\n </span>\n <span className=\"min-w-0 break-words text-sm font-medium text-text-primary\">\n {validationResult.parserInfo.name}\n </span>\n </div>\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldType', 'Type')}\n </span>\n <Badge variant=\"secondary\">{validationResult.parserInfo.type}</Badge>\n </div>\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldInputSink', 'Input Sink')}\n </span>\n <span className=\"min-w-0 break-all font-mono text-xs text-text-primary\">\n {validationResult.parserInfo.inputSinkKey}\n </span>\n </div>\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldOutputKey', 'Output Key')}\n </span>\n <span className=\"min-w-0 break-all font-mono text-xs text-text-primary\">\n {validationResult.parserInfo.outputKey}\n </span>\n </div>\n {validationResult.parserInfo.exportedFrom && (\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldSourceId', 'Source ID')}\n </span>\n <span className=\"min-w-0 max-w-full truncate font-mono text-xs text-text-secondary sm:max-w-[180px]\">\n {validationResult.parserInfo.exportedFrom}\n </span>\n </div>\n )}\n <div className={SUMMARY_ROW}>\n <span className=\"text-sm text-text-secondary\">\n {t('bigconsole.parsers.import.fieldSchemaVersion', 'Schema Version')}\n </span>\n <span className=\"text-xs text-text-secondary\">{validationResult.parserInfo.schemaVersion}</span>\n </div>\n </Section>\n )}\n\n {/* Validation Errors */}\n {validationResult.errors.length > 0 && (\n <Section\n tone=\"danger\"\n padding=\"compact\"\n headingLevel={3}\n title={t('bigconsole.parsers.import.errorsCount', 'Errors ({{count}})', {\n count: validationResult.errors.length,\n })}\n icon={<XCircle className=\"size-4 text-[var(--color-status-error-text)]\" />}\n data-testid=\"import-validation-errors\"\n >\n <ul className=\"space-y-1 text-xs text-status-error-text\">\n {validationResult.errors.map((err, idx) => (\n <li key={idx} className=\"break-words\">\n <span className=\"font-mono\">[{err.code}]</span> {err.message}\n </li>\n ))}\n </ul>\n </Section>\n )}\n\n {/* Import Options — the only interactive block, so it carries the surface */}\n {validationResult.isValid && (\n <Section\n headingLevel={3}\n title={t('bigconsole.parsers.import.optionsHeading', 'Import Options')}\n description=\"Override the imported names before creating the parser.\"\n bodyClassName=\"space-y-4\"\n data-testid=\"import-parser-options\"\n >\n {/* What import will do */}\n <Section\n tone=\"info\"\n padding=\"compact\"\n headingLevel={4}\n title={\n parserId\n ? t('bigconsole.parsers.import.checkExistingTitle', 'Import will check for existing parser')\n : t('bigconsole.parsers.import.newParserTitle', 'A new parser will be created')\n }\n icon={<Info className=\"size-4 text-[var(--color-status-info-text)]\" />}\n >\n <div className=\"text-xs text-text-secondary\">\n {parserId ? (\n <>\n <p>\n {t('bigconsole.parsers.import.ifOriginalExistsPrefix', 'If the original parser (ID:')}{' '}\n <code className=\"rounded bg-bg-sunken px-1 font-mono\">{parserId.slice(0, 8)}...</code>\n {t('bigconsole.parsers.import.ifOriginalExistsSuffix', ') exists:')}\n </p>\n <ul className=\"list-disc list-inside mt-1 space-y-0.5\">\n <li>\n {t('bigconsole.parsers.import.withChanges', 'With changes → Update the existing parser')}\n </li>\n <li>\n {t('bigconsole.parsers.import.noChanges', 'No changes → Show \"already exists\" message')}\n </li>\n </ul>\n <p className=\"mt-1\">\n {t(\n 'bigconsole.parsers.import.ifOriginalMissing',\n \"If original doesn't exist → Create a new parser\"\n )}\n </p>\n </>\n ) : (\n <p>\n {t(\n 'bigconsole.parsers.import.newParserBody',\n 'Import as a new parser with the specified configuration.'\n )}\n </p>\n )}\n </div>\n </Section>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"import-name\">{t('bigconsole.parsers.import.parserNameLabel', 'Parser Name')}</Label>\n <Input\n id=\"import-name\"\n type=\"text\"\n value={nameOverride}\n onChange={(e) => setNameOverride(e.target.value)}\n placeholder={\n validationResult.parserInfo?.name ||\n t('bigconsole.parsers.import.parserNamePlaceholder', 'Parser name')\n }\n disabled={step === 'importing'}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"import-input-sink\">\n {t('bigconsole.parsers.import.inputSinkKeyLabel', 'Input Sink Key')}\n </Label>\n <Input\n id=\"import-input-sink\"\n type=\"text\"\n value={inputSinkKeyOverride}\n onChange={(e) => setInputSinkKeyOverride(e.target.value)}\n placeholder={\n validationResult.parserInfo?.inputSinkKey ||\n t('bigconsole.parsers.import.inputSinkKeyPlaceholder', 'Input sink key')\n }\n disabled={step === 'importing'}\n />\n <p className=\"text-xs text-text-secondary\">\n {t('bigconsole.parsers.import.inputSinkKeyHelp', 'The DataSink key to read input data from.')}\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"import-output-key\">\n {t('bigconsole.parsers.import.outputKeyLabel', 'Output Key')}\n </Label>\n <Input\n id=\"import-output-key\"\n type=\"text\"\n value={outputKeyOverride}\n onChange={(e) => setOutputKeyOverride(e.target.value)}\n placeholder={\n validationResult.parserInfo?.outputKey ||\n t('bigconsole.parsers.import.outputKeyPlaceholder', 'Output key')\n }\n disabled={step === 'importing'}\n />\n <p className=\"text-xs text-text-secondary\">\n {t('bigconsole.parsers.import.outputKeyHelp', 'The key to store parsed output data under.')}\n </p>\n </div>\n </Section>\n )}\n </>\n )}\n\n {/* Step 3: Complete — one outcome block, toned by result */}\n {step === 'complete' && importResult?.success && (\n <Section\n tone={importResult.alreadyExists ? 'info' : 'success'}\n headingLevel={3}\n title={\n importResult.alreadyExists\n ? t('bigconsole.parsers.import.alreadyExistsTitle', 'Parser Already Exists')\n : importResult.originalUpdated\n ? t('bigconsole.parsers.import.updatedTitle', 'Parser Updated!')\n : t('bigconsole.parsers.import.createdTitle', 'Import Successful!')\n }\n icon={\n importResult.alreadyExists ? (\n <Info className=\"size-5 text-[var(--color-status-info-text)]\" />\n ) : importResult.originalUpdated ? (\n <RefreshCw className=\"size-5 text-[var(--color-status-success-text)]\" />\n ) : (\n <Check className=\"size-5 text-[var(--color-status-success-text)]\" />\n )\n }\n description={\n importResult.alreadyExists\n ? t(\n 'bigconsole.parsers.import.alreadyExistsBody',\n 'Parser \"{{name}}\" already exists with the same data. No changes were made.',\n { name: importResult.parser?.name ?? '' }\n )\n : importResult.originalUpdated\n ? t(\n 'bigconsole.parsers.import.updatedBody',\n 'Parser \"{{name}}\" has been updated with the imported data.',\n { name: importResult.parser?.name ?? '' }\n )\n : t('bigconsole.parsers.import.createdBody', 'Parser \"{{name}}\" has been created.', {\n name: importResult.parser?.name ?? '',\n })\n }\n data-testid=\"import-parser-outcome\"\n />\n )}\n\n {/* Error */}\n {error && (\n <Section\n tone=\"danger\"\n padding=\"compact\"\n headingLevel={3}\n title=\"Import failed\"\n data-testid=\"import-parser-error\"\n >\n <p className=\"break-words text-sm text-status-error-text\">{error.message}</p>\n </Section>\n )}\n\n {importResult && !importResult.success && importResult.errorMessage && (\n <Section\n tone=\"danger\"\n padding=\"compact\"\n headingLevel={3}\n title=\"Import failed\"\n data-testid=\"import-parser-result-error\"\n >\n <p className=\"break-words text-sm text-status-error-text\">{importResult.errorMessage}</p>\n </Section>\n )}\n </div>\n\n <ResponsiveDialogFooter className=\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-between\">\n <div>\n {step === 'preview' && (\n <Button\n variant=\"ghost\"\n onClick={() => {\n setStep('select');\n setSelectedFile(null);\n setFileContent(null);\n clearState();\n }}\n disabled={loading}\n >\n <ArrowLeft className=\"size-4\" />\n {t('bigconsole.parsers.import.back', 'Back')}\n </Button>\n )}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {step !== 'complete' && (\n <Button variant=\"outline\" onClick={onClose} disabled={!canClose}>\n {t('bigconsole.parsers.import.cancel', 'Cancel')}\n </Button>\n )}\n\n {step === 'preview' && validationResult?.isValid && (\n <Button onClick={handleImport} disabled={loading}>\n <Upload className=\"size-4\" />\n {t('bigconsole.parsers.import.importButton', 'Import Parser')}\n </Button>\n )}\n\n {step === 'importing' && (\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Spinner className=\"size-4\" />\n {t('bigconsole.parsers.import.importing', 'Importing...')}\n </div>\n )}\n\n {step === 'complete' && <Button onClick={onClose}>{t('bigconsole.parsers.import.done', 'Done')}</Button>}\n </div>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n});\n\nexport default ImportParserDialog;\n"],"mappings":"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"}
@@ -1,9 +1,12 @@
1
- import e from "./ParserTypeBadge.js";
2
- import t from "./ParserStatusBadge.js";
3
- import { memo as n, useCallback as r, useMemo as i } from "react";
4
- import { jsx as a, jsxs as o } from "react/jsx-runtime";
1
+ import { SECTION_FOCUS_RING as e } from "../common/sectionStyles.js";
2
+ import "../common/index.js";
3
+ import t from "./ParserTypeBadge.js";
4
+ import n from "./ParserStatusBadge.js";
5
+ import { memo as r, useCallback as i, useMemo as a } from "react";
6
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
5
7
  //#region src/bigconsole/components/parser/ParserCard.tsx
6
- function s(e) {
8
+ var c = `inline-flex h-control-md aspect-square items-center justify-center rounded-md text-text-secondary motion-safe:transition-colors hover:bg-bg-sunken hover:text-text-primary ${e}`;
9
+ function l(e) {
7
10
  let t = new Date(e);
8
11
  return new Intl.DateTimeFormat("en-US", {
9
12
  month: "short",
@@ -13,229 +16,245 @@ function s(e) {
13
16
  minute: "2-digit"
14
17
  }).format(t);
15
18
  }
16
- function c(e) {
19
+ function u(e) {
17
20
  let t = new Date(e), n = Date.now() - t.getTime(), r = Math.floor(n / 6e4);
18
21
  if (r < 1) return "just now";
19
22
  if (r < 60) return `${r}m ago`;
20
23
  let i = Math.floor(r / 60);
21
24
  if (i < 24) return `${i}h ago`;
22
25
  let a = Math.floor(i / 24);
23
- return a < 7 ? `${a}d ago` : s(e);
26
+ return a < 7 ? `${a}d ago` : l(e);
24
27
  }
25
- var l = ({ className: e }) => /* @__PURE__ */ a("svg", {
28
+ var d = ({ className: e }) => /* @__PURE__ */ o("svg", {
26
29
  className: e,
27
30
  fill: "none",
28
31
  stroke: "currentColor",
29
32
  viewBox: "0 0 24 24",
30
- children: /* @__PURE__ */ a("path", {
33
+ children: /* @__PURE__ */ o("path", {
31
34
  strokeLinecap: "round",
32
35
  strokeLinejoin: "round",
33
36
  strokeWidth: 1.5,
34
37
  d: "M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"
35
38
  })
36
- }), u = ({ className: e }) => /* @__PURE__ */ a("svg", {
39
+ }), f = ({ className: e }) => /* @__PURE__ */ o("svg", {
37
40
  className: e,
38
41
  fill: "none",
39
42
  stroke: "currentColor",
40
43
  viewBox: "0 0 24 24",
41
- children: /* @__PURE__ */ a("path", {
44
+ children: /* @__PURE__ */ o("path", {
42
45
  strokeLinecap: "round",
43
46
  strokeLinejoin: "round",
44
47
  strokeWidth: 1.5,
45
48
  d: "M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"
46
49
  })
47
- }), d = ({ className: e }) => /* @__PURE__ */ a("svg", {
50
+ }), p = ({ className: e }) => /* @__PURE__ */ o("svg", {
48
51
  className: e,
49
52
  fill: "none",
50
53
  stroke: "currentColor",
51
54
  viewBox: "0 0 24 24",
52
- children: /* @__PURE__ */ a("path", {
55
+ children: /* @__PURE__ */ o("path", {
53
56
  strokeLinecap: "round",
54
57
  strokeLinejoin: "round",
55
58
  strokeWidth: 1.5,
56
59
  d: "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4"
57
60
  })
58
- }), f = ({ className: e }) => /* @__PURE__ */ a("svg", {
61
+ }), m = ({ className: e }) => /* @__PURE__ */ o("svg", {
59
62
  className: e,
60
63
  fill: "none",
61
64
  stroke: "currentColor",
62
65
  viewBox: "0 0 24 24",
63
- children: /* @__PURE__ */ a("path", {
66
+ children: /* @__PURE__ */ o("path", {
64
67
  strokeLinecap: "round",
65
68
  strokeLinejoin: "round",
66
69
  strokeWidth: 2,
67
70
  d: "M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
68
71
  })
69
- }), p = ({ className: e }) => /* @__PURE__ */ o("svg", {
72
+ }), h = ({ className: e }) => /* @__PURE__ */ s("svg", {
70
73
  className: e,
71
74
  fill: "none",
72
75
  stroke: "currentColor",
73
76
  viewBox: "0 0 24 24",
74
- children: [/* @__PURE__ */ a("path", {
77
+ children: [/* @__PURE__ */ o("path", {
75
78
  strokeLinecap: "round",
76
79
  strokeLinejoin: "round",
77
80
  strokeWidth: 2,
78
81
  d: "M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z"
79
- }), /* @__PURE__ */ a("path", {
82
+ }), /* @__PURE__ */ o("path", {
80
83
  strokeLinecap: "round",
81
84
  strokeLinejoin: "round",
82
85
  strokeWidth: 2,
83
86
  d: "M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
84
87
  })]
85
- }), m = ({ className: e }) => /* @__PURE__ */ a("svg", {
88
+ }), g = ({ className: e }) => /* @__PURE__ */ o("svg", {
86
89
  className: e,
87
90
  fill: "none",
88
91
  stroke: "currentColor",
89
92
  viewBox: "0 0 24 24",
90
- children: /* @__PURE__ */ a("path", {
93
+ children: /* @__PURE__ */ o("path", {
91
94
  strokeLinecap: "round",
92
95
  strokeLinejoin: "round",
93
96
  strokeWidth: 2,
94
97
  d: "M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"
95
98
  })
96
- }), h = ({ className: e }) => /* @__PURE__ */ a("svg", {
99
+ }), _ = ({ className: e }) => /* @__PURE__ */ o("svg", {
97
100
  className: e,
98
101
  fill: "none",
99
102
  stroke: "currentColor",
100
103
  viewBox: "0 0 24 24",
101
- children: /* @__PURE__ */ a("path", {
104
+ children: /* @__PURE__ */ o("path", {
102
105
  strokeLinecap: "round",
103
106
  strokeLinejoin: "round",
104
107
  strokeWidth: 2,
105
108
  d: "M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"
106
109
  })
107
- }), g = ({ className: e }) => /* @__PURE__ */ a("svg", {
110
+ }), v = ({ className: e }) => /* @__PURE__ */ o("svg", {
108
111
  className: e,
109
112
  fill: "none",
110
113
  stroke: "currentColor",
111
114
  viewBox: "0 0 24 24",
112
- children: /* @__PURE__ */ a("path", {
115
+ children: /* @__PURE__ */ o("path", {
113
116
  strokeLinecap: "round",
114
117
  strokeLinejoin: "round",
115
118
  strokeWidth: 2,
116
119
  d: "M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"
117
120
  })
118
- }), _ = n(function({ parser: n, onView: _, onEdit: v, onTest: y, onExecute: b, onExport: x, onDelete: S }) {
119
- let C = r(() => {
120
- _?.(n.id);
121
- }, [_, n.id]), w = r((e) => {
122
- e.stopPropagation(), y?.(n.id);
123
- }, [y, n.id]), T = r((e) => {
124
- e.stopPropagation(), b?.(n.id);
125
- }, [b, n.id]), E = r((e) => {
126
- e.stopPropagation(), v?.(n.id);
127
- }, [v, n.id]), D = r((e) => {
128
- e.stopPropagation(), x?.(n.id);
129
- }, [x, n.id]), O = r((e) => {
130
- e.stopPropagation(), S?.(n.id);
131
- }, [S, n.id]);
132
- return /* @__PURE__ */ o("div", {
133
- onClick: C,
134
- className: "\n bg-bg-surface\n border border-border-default\n rounded-lg\n overflow-hidden\n cursor-pointer\n hover:border-action-primary-bg\n transition-colors\n ",
135
- children: [/* @__PURE__ */ o("div", {
136
- className: "h-24 bg-bg-sunken flex items-center justify-center relative",
137
- children: [
138
- i(() => {
139
- let e = "w-10 h-10 text-text-secondary/50";
140
- switch (n.type) {
141
- case "jq": return /* @__PURE__ */ a(l, { className: e });
142
- case "jsonata": return /* @__PURE__ */ a(u, { className: e });
143
- default: return /* @__PURE__ */ a(d, { className: e });
121
+ }), y = r(function({ parser: r, onView: y, onEdit: b, onTest: x, onExecute: S, onExport: C, onDelete: w }) {
122
+ let T = i(() => {
123
+ y?.(r.id);
124
+ }, [y, r.id]), E = i((e) => {
125
+ e.stopPropagation(), y?.(r.id);
126
+ }, [y, r.id]), D = i((e) => {
127
+ e.stopPropagation(), x?.(r.id);
128
+ }, [x, r.id]), O = i((e) => {
129
+ e.stopPropagation(), S?.(r.id);
130
+ }, [S, r.id]), k = i((e) => {
131
+ e.stopPropagation(), b?.(r.id);
132
+ }, [b, r.id]), A = i((e) => {
133
+ e.stopPropagation(), C?.(r.id);
134
+ }, [C, r.id]), j = i((e) => {
135
+ e.stopPropagation(), w?.(r.id);
136
+ }, [w, r.id]);
137
+ return /* @__PURE__ */ s("div", {
138
+ onClick: T,
139
+ className: "\n flex h-full flex-col\n bg-bg-elevated\n border border-[var(--color-border-default)]\n rounded-card\n overflow-hidden\n cursor-pointer\n hover:border-action-primary-bg\n motion-safe:transition-colors\n ",
140
+ children: [/* @__PURE__ */ s("div", {
141
+ className: "flex flex-wrap items-center justify-between gap-icon-gap border-b border-[var(--color-border-subtle)] bg-bg-sunken px-4 py-2",
142
+ children: [/* @__PURE__ */ s("span", {
143
+ className: "flex min-w-0 items-center gap-icon-gap",
144
+ children: [a(() => {
145
+ let e = "w-icon-sm h-icon-sm text-text-secondary";
146
+ switch (r.type) {
147
+ case "jq": return /* @__PURE__ */ o(d, { className: e });
148
+ case "jsonata": return /* @__PURE__ */ o(f, { className: e });
149
+ default: return /* @__PURE__ */ o(p, { className: e });
144
150
  }
145
- }, [n.type]),
146
- /* @__PURE__ */ a("div", {
147
- className: "absolute top-2 left-2",
148
- children: /* @__PURE__ */ a(e, {
149
- type: n.type,
150
- size: "sm"
151
- })
152
- }),
153
- /* @__PURE__ */ a("div", {
154
- className: "absolute top-2 right-2",
155
- children: /* @__PURE__ */ a(t, {
156
- status: n.status,
157
- size: "sm"
158
- })
159
- })
160
- ]
161
- }), /* @__PURE__ */ o("div", {
162
- className: "p-4",
151
+ }, [r.type]), /* @__PURE__ */ o(t, {
152
+ type: r.type,
153
+ size: "sm"
154
+ })]
155
+ }), /* @__PURE__ */ o(n, {
156
+ status: r.status,
157
+ size: "sm"
158
+ })]
159
+ }), /* @__PURE__ */ s("div", {
160
+ className: "flex flex-1 flex-col p-4",
163
161
  children: [
164
- /* @__PURE__ */ o("div", {
165
- className: "flex items-start justify-between mb-2",
166
- children: [/* @__PURE__ */ o("div", {
162
+ /* @__PURE__ */ s("div", {
163
+ className: "flex flex-wrap items-start justify-between gap-icon-gap mb-2",
164
+ children: [/* @__PURE__ */ s("div", {
167
165
  className: "flex-1 min-w-0",
168
- children: [/* @__PURE__ */ a("h3", {
169
- className: "text-sm font-semibold text-text-primary truncate",
170
- children: n.name || "Untitled Parser"
171
- }), /* @__PURE__ */ o("p", {
172
- className: "text-xs text-text-secondary truncate mt-0.5",
166
+ children: [/* @__PURE__ */ o("h3", {
167
+ className: "min-w-0 text-sm font-semibold text-text-primary",
168
+ children: /* @__PURE__ */ o("button", {
169
+ type: "button",
170
+ onClick: E,
171
+ className: `block w-full truncate rounded-sm text-left ${e}`,
172
+ children: r.name || "Untitled Parser"
173
+ })
174
+ }), /* @__PURE__ */ s("p", {
175
+ className: "text-xs font-mono text-text-secondary truncate mt-0.5",
176
+ title: `${r.inputSinkKey} → ${r.outputKey}`,
173
177
  children: [
174
- n.inputSinkKey,
178
+ r.inputSinkKey,
175
179
  " → ",
176
- n.outputKey
180
+ r.outputKey
177
181
  ]
178
182
  })]
179
- }), /* @__PURE__ */ o("div", {
180
- className: "flex items-center gap-1 ml-2",
183
+ }), /* @__PURE__ */ s("div", {
184
+ className: "flex flex-wrap items-center gap-icon-gap",
181
185
  children: [
182
- y && /* @__PURE__ */ a("button", {
186
+ x && /* @__PURE__ */ s("button", {
183
187
  type: "button",
184
- onClick: w,
185
- className: "\n p-1 rounded-md\n text-text-secondary\n hover:text-text-primary\n hover:bg-bg-sunken\n transition-colors\n ",
188
+ onClick: D,
189
+ className: c,
186
190
  title: "Test Parser",
187
- children: /* @__PURE__ */ a(f, { className: "w-4 h-4" })
191
+ children: [/* @__PURE__ */ o("span", {
192
+ className: "sr-only",
193
+ children: "Test parser"
194
+ }), /* @__PURE__ */ o(m, { className: "w-icon-sm h-icon-sm" })]
188
195
  }),
189
- b && /* @__PURE__ */ a("button", {
196
+ S && /* @__PURE__ */ s("button", {
190
197
  type: "button",
191
- onClick: T,
192
- className: "\n p-1 rounded-md\n text-text-secondary\n hover:text-text-primary\n hover:bg-bg-sunken\n transition-colors\n ",
198
+ onClick: O,
199
+ className: c,
193
200
  title: "Execute Parser",
194
- children: /* @__PURE__ */ a(p, { className: "w-4 h-4" })
201
+ children: [/* @__PURE__ */ o("span", {
202
+ className: "sr-only",
203
+ children: "Execute parser"
204
+ }), /* @__PURE__ */ o(h, { className: "w-icon-sm h-icon-sm" })]
195
205
  }),
196
- v && /* @__PURE__ */ a("button", {
206
+ b && /* @__PURE__ */ s("button", {
197
207
  type: "button",
198
- onClick: E,
199
- className: "\n p-1 rounded-md\n text-text-secondary\n hover:text-text-primary\n hover:bg-bg-sunken\n transition-colors\n ",
208
+ onClick: k,
209
+ className: c,
200
210
  title: "Edit Parser",
201
- children: /* @__PURE__ */ a(m, { className: "w-4 h-4" })
211
+ children: [/* @__PURE__ */ o("span", {
212
+ className: "sr-only",
213
+ children: "Edit parser"
214
+ }), /* @__PURE__ */ o(g, { className: "w-icon-sm h-icon-sm" })]
202
215
  }),
203
- x && /* @__PURE__ */ a("button", {
216
+ C && /* @__PURE__ */ s("button", {
204
217
  type: "button",
205
- onClick: D,
206
- className: "\n p-1 rounded-md\n text-text-secondary\n hover:text-text-primary\n hover:bg-bg-sunken\n transition-colors\n ",
218
+ onClick: A,
219
+ className: c,
207
220
  title: "Export Parser",
208
- children: /* @__PURE__ */ a(g, { className: "w-4 h-4" })
221
+ children: [/* @__PURE__ */ o("span", {
222
+ className: "sr-only",
223
+ children: "Export parser"
224
+ }), /* @__PURE__ */ o(v, { className: "w-icon-sm h-icon-sm" })]
209
225
  }),
210
- S && /* @__PURE__ */ a("button", {
226
+ w && /* @__PURE__ */ s("button", {
211
227
  type: "button",
212
- onClick: O,
213
- className: "\n p-1 rounded-md\n text-text-secondary\n hover:text-status-error-text\n hover:bg-status-error-bg/10\n transition-colors\n ",
228
+ onClick: j,
229
+ className: `${c} hover:text-[var(--color-status-error-text)]`,
214
230
  title: "Delete Parser",
215
- children: /* @__PURE__ */ a(h, { className: "w-4 h-4" })
231
+ children: [/* @__PURE__ */ o("span", {
232
+ className: "sr-only",
233
+ children: "Delete parser"
234
+ }), /* @__PURE__ */ o(_, { className: "w-icon-sm h-icon-sm" })]
216
235
  })
217
236
  ]
218
237
  })]
219
238
  }),
220
- n.description && /* @__PURE__ */ a("p", {
239
+ r.description && /* @__PURE__ */ o("p", {
221
240
  className: "text-xs text-text-secondary mb-3 line-clamp-2",
222
- children: n.description
241
+ children: r.description
223
242
  }),
224
- /* @__PURE__ */ o("div", {
225
- className: "flex items-center justify-between text-xs text-text-secondary",
226
- children: [/* @__PURE__ */ o("div", {
227
- className: "flex items-center gap-3",
228
- children: [/* @__PURE__ */ o("span", { children: ["v", n.version] }), n.ttl && /* @__PURE__ */ o("span", {
229
- title: `Cache TTL: ${n.ttl} seconds`,
243
+ /* @__PURE__ */ s("div", {
244
+ className: "mt-auto flex flex-wrap items-center justify-between gap-x-3 gap-y-1 border-t border-[var(--color-border-subtle)] pt-2 text-xs text-text-muted",
245
+ children: [/* @__PURE__ */ s("span", {
246
+ className: "flex flex-wrap items-center gap-3",
247
+ children: [/* @__PURE__ */ s("span", { children: ["v", r.version] }), r.ttl ? /* @__PURE__ */ s("span", {
248
+ title: `Cache TTL: ${r.ttl} seconds`,
230
249
  children: [
231
250
  "TTL: ",
232
- n.ttl,
251
+ r.ttl,
233
252
  "s"
234
253
  ]
235
- })]
236
- }), /* @__PURE__ */ a("span", {
237
- title: `Last updated: ${s(n.updatedAt)}`,
238
- children: c(n.updatedAt)
254
+ }) : null]
255
+ }), /* @__PURE__ */ o("span", {
256
+ title: `Last updated: ${l(r.updatedAt)}`,
257
+ children: u(r.updatedAt)
239
258
  })]
240
259
  })
241
260
  ]
@@ -243,6 +262,6 @@ var l = ({ className: e }) => /* @__PURE__ */ a("svg", {
243
262
  });
244
263
  });
245
264
  //#endregion
246
- export { _ as default };
265
+ export { y as default };
247
266
 
248
267
  //# sourceMappingURL=ParserCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ParserCard.js","names":[],"sources":["../../../../src/bigconsole/components/parser/ParserCard.tsx"],"sourcesContent":["/**\n * Parser Card\n *\n * Card component displaying parser information with action buttons.\n */\n\nimport { memo, useCallback, useMemo } from 'react';\nimport { ParserStatusBadge } from './ParserStatusBadge';\nimport { ParserTypeBadge } from './ParserTypeBadge';\nimport type { Parser } from '../../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface ParserCardProps {\n /** Parser to display */\n parser: Parser;\n /** Callback when card is clicked (view) */\n onView?: (id: string) => void;\n /** Callback to edit parser */\n onEdit?: (id: string) => void;\n /** Callback to test parser */\n onTest?: (id: string) => void;\n /** Callback to execute parser */\n onExecute?: (id: string) => void;\n /** Callback to export parser */\n onExport?: (id: string) => void;\n /** Callback to delete parser */\n onDelete?: (id: string) => void;\n /** Whether this card's delete action is in progress */\n isDeleting?: boolean;\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\n/**\n * Format date to locale string\n */\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return new Intl.DateTimeFormat('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n }).format(date);\n}\n\n/**\n * Format relative time from date string\n */\nfunction formatRelativeTime(dateString: string): string {\n const date = new Date(dateString);\n const diff = Date.now() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n\n if (minutes < 1) return 'just now';\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n\n return formatDate(dateString);\n}\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst JqIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n);\n\nconst JsonataIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n);\n\nconst DefaultIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4\"\n />\n </svg>\n);\n\nconst TestIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"\n />\n </svg>\n);\n\nconst PlayIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z\"\n />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n);\n\nconst EditIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n);\n\nconst DeleteIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n);\n\nconst ExportIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n);\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const ParserCard = memo(function ParserCard({\n parser,\n onView,\n onEdit,\n onTest,\n onExecute,\n onExport,\n onDelete,\n}: ParserCardProps) {\n // Handle card click\n const handleCardClick = useCallback(() => {\n onView?.(parser.id);\n }, [onView, parser.id]);\n\n // Handle action button clicks (stop propagation)\n const handleTest = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onTest?.(parser.id);\n },\n [onTest, parser.id]\n );\n\n const handleExecute = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onExecute?.(parser.id);\n },\n [onExecute, parser.id]\n );\n\n const handleEdit = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onEdit?.(parser.id);\n },\n [onEdit, parser.id]\n );\n\n const handleExport = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onExport?.(parser.id);\n },\n [onExport, parser.id]\n );\n\n const handleDelete = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onDelete?.(parser.id);\n },\n [onDelete, parser.id]\n );\n\n // Get type icon - memoized to avoid creating component during render\n const typeIcon = useMemo(() => {\n const iconClass = 'w-10 h-10 text-text-secondary/50';\n switch (parser.type) {\n case 'jq':\n return <JqIcon className={iconClass} />;\n case 'jsonata':\n return <JsonataIcon className={iconClass} />;\n default:\n return <DefaultIcon className={iconClass} />;\n }\n }, [parser.type]);\n\n return (\n <div\n onClick={handleCardClick}\n className={`\n bg-bg-surface\n border border-border-default\n rounded-lg\n overflow-hidden\n cursor-pointer\n hover:border-action-primary-bg\n transition-colors\n `}\n >\n {/* Header with icon and badges */}\n <div className=\"h-24 bg-bg-sunken flex items-center justify-center relative\">\n {typeIcon}\n\n {/* Type badge */}\n <div className=\"absolute top-2 left-2\">\n <ParserTypeBadge type={parser.type} size=\"sm\" />\n </div>\n\n {/* Status badge */}\n <div className=\"absolute top-2 right-2\">\n <ParserStatusBadge status={parser.status} size=\"sm\" />\n </div>\n </div>\n\n {/* Content */}\n <div className=\"p-4\">\n {/* Title and actions */}\n <div className=\"flex items-start justify-between mb-2\">\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-sm font-semibold text-text-primary truncate\">{parser.name || 'Untitled Parser'}</h3>\n <p className=\"text-xs text-text-secondary truncate mt-0.5\">\n {parser.inputSinkKey} → {parser.outputKey}\n </p>\n </div>\n\n {/* Action buttons */}\n <div className=\"flex items-center gap-1 ml-2\">\n {onTest && (\n <button\n type=\"button\"\n onClick={handleTest}\n className={`\n p-1 rounded-md\n text-text-secondary\n hover:text-text-primary\n hover:bg-bg-sunken\n transition-colors\n `}\n title=\"Test Parser\"\n >\n <TestIcon className=\"w-4 h-4\" />\n </button>\n )}\n\n {onExecute && (\n <button\n type=\"button\"\n onClick={handleExecute}\n className={`\n p-1 rounded-md\n text-text-secondary\n hover:text-text-primary\n hover:bg-bg-sunken\n transition-colors\n `}\n title=\"Execute Parser\"\n >\n <PlayIcon className=\"w-4 h-4\" />\n </button>\n )}\n\n {onEdit && (\n <button\n type=\"button\"\n onClick={handleEdit}\n className={`\n p-1 rounded-md\n text-text-secondary\n hover:text-text-primary\n hover:bg-bg-sunken\n transition-colors\n `}\n title=\"Edit Parser\"\n >\n <EditIcon className=\"w-4 h-4\" />\n </button>\n )}\n\n {onExport && (\n <button\n type=\"button\"\n onClick={handleExport}\n className={`\n p-1 rounded-md\n text-text-secondary\n hover:text-text-primary\n hover:bg-bg-sunken\n transition-colors\n `}\n title=\"Export Parser\"\n >\n <ExportIcon className=\"w-4 h-4\" />\n </button>\n )}\n\n {onDelete && (\n <button\n type=\"button\"\n onClick={handleDelete}\n className={`\n p-1 rounded-md\n text-text-secondary\n hover:text-status-error-text\n hover:bg-status-error-bg/10\n transition-colors\n `}\n title=\"Delete Parser\"\n >\n <DeleteIcon className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Description */}\n {parser.description && <p className=\"text-xs text-text-secondary mb-3 line-clamp-2\">{parser.description}</p>}\n\n {/* Footer with version and timestamps */}\n <div className=\"flex items-center justify-between text-xs text-text-secondary\">\n <div className=\"flex items-center gap-3\">\n <span>v{parser.version}</span>\n {parser.ttl && <span title={`Cache TTL: ${parser.ttl} seconds`}>TTL: {parser.ttl}s</span>}\n </div>\n <span title={`Last updated: ${formatDate(parser.updatedAt)}`}>{formatRelativeTime(parser.updatedAt)}</span>\n </div>\n </div>\n </div>\n );\n});\n\nexport default ParserCard;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ParserCard.js","names":[],"sources":["../../../../src/bigconsole/components/parser/ParserCard.tsx"],"sourcesContent":["/**\n * Parser Card\n *\n * Card component displaying parser information with action buttons.\n */\n\nimport { memo, useCallback, useMemo } from 'react';\nimport { ParserStatusBadge } from './ParserStatusBadge';\nimport { ParserTypeBadge } from './ParserTypeBadge';\nimport { SECTION_FOCUS_RING } from '../common';\nimport type { Parser } from '../../types';\n\n/**\n * Icon-only card actions are 40×40 so they clear the mobile touch minimum, and\n * they keep a visible focus ring because the card body is itself clickable.\n */\nconst CARD_ACTION_CLASSES = `inline-flex h-control-md aspect-square items-center justify-center rounded-md text-text-secondary motion-safe:transition-colors hover:bg-bg-sunken hover:text-text-primary ${SECTION_FOCUS_RING}`;\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface ParserCardProps {\n /** Parser to display */\n parser: Parser;\n /** Callback when card is clicked (view) */\n onView?: (id: string) => void;\n /** Callback to edit parser */\n onEdit?: (id: string) => void;\n /** Callback to test parser */\n onTest?: (id: string) => void;\n /** Callback to execute parser */\n onExecute?: (id: string) => void;\n /** Callback to export parser */\n onExport?: (id: string) => void;\n /** Callback to delete parser */\n onDelete?: (id: string) => void;\n /** Whether this card's delete action is in progress */\n isDeleting?: boolean;\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\n/**\n * Format date to locale string\n */\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return new Intl.DateTimeFormat('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n }).format(date);\n}\n\n/**\n * Format relative time from date string\n */\nfunction formatRelativeTime(dateString: string): string {\n const date = new Date(dateString);\n const diff = Date.now() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n\n if (minutes < 1) return 'just now';\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n\n return formatDate(dateString);\n}\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst JqIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n);\n\nconst JsonataIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n);\n\nconst DefaultIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4\"\n />\n </svg>\n);\n\nconst TestIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"\n />\n </svg>\n);\n\nconst PlayIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z\"\n />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n);\n\nconst EditIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n);\n\nconst DeleteIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n);\n\nconst ExportIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n);\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const ParserCard = memo(function ParserCard({\n parser,\n onView,\n onEdit,\n onTest,\n onExecute,\n onExport,\n onDelete,\n}: ParserCardProps) {\n // Handle card click\n const handleCardClick = useCallback(() => {\n onView?.(parser.id);\n }, [onView, parser.id]);\n\n // Title button — same action as the card surface, but must not double-fire\n const handleTitleClick = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onView?.(parser.id);\n },\n [onView, parser.id]\n );\n\n // Handle action button clicks (stop propagation)\n const handleTest = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onTest?.(parser.id);\n },\n [onTest, parser.id]\n );\n\n const handleExecute = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onExecute?.(parser.id);\n },\n [onExecute, parser.id]\n );\n\n const handleEdit = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onEdit?.(parser.id);\n },\n [onEdit, parser.id]\n );\n\n const handleExport = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onExport?.(parser.id);\n },\n [onExport, parser.id]\n );\n\n const handleDelete = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onDelete?.(parser.id);\n },\n [onDelete, parser.id]\n );\n\n // Get type icon - memoized to avoid creating component during render\n const typeIcon = useMemo(() => {\n const iconClass = 'w-icon-sm h-icon-sm text-text-secondary';\n switch (parser.type) {\n case 'jq':\n return <JqIcon className={iconClass} />;\n case 'jsonata':\n return <JsonataIcon className={iconClass} />;\n default:\n return <DefaultIcon className={iconClass} />;\n }\n }, [parser.type]);\n\n return (\n <div\n onClick={handleCardClick}\n className={`\n flex h-full flex-col\n bg-bg-elevated\n border border-[var(--color-border-default)]\n rounded-card\n overflow-hidden\n cursor-pointer\n hover:border-action-primary-bg\n motion-safe:transition-colors\n `}\n >\n {/* Identity strip — type + status, the two keys people scan a grid by */}\n <div className=\"flex flex-wrap items-center justify-between gap-icon-gap border-b border-[var(--color-border-subtle)] bg-bg-sunken px-4 py-2\">\n <span className=\"flex min-w-0 items-center gap-icon-gap\">\n {typeIcon}\n <ParserTypeBadge type={parser.type} size=\"sm\" />\n </span>\n <ParserStatusBadge status={parser.status} size=\"sm\" />\n </div>\n\n {/* Content */}\n <div className=\"flex flex-1 flex-col p-4\">\n {/* Title and actions */}\n <div className=\"flex flex-wrap items-start justify-between gap-icon-gap mb-2\">\n <div className=\"flex-1 min-w-0\">\n {/* The title is the card's keyboard-reachable \"open\" affordance. The card\n surface stays mouse-clickable, but it is NOT a `role=\"button\"` — that\n would nest the action buttons below inside another interactive element. */}\n <h3 className=\"min-w-0 text-sm font-semibold text-text-primary\">\n <button\n type=\"button\"\n onClick={handleTitleClick}\n className={`block w-full truncate rounded-sm text-left ${SECTION_FOCUS_RING}`}\n >\n {parser.name || 'Untitled Parser'}\n </button>\n </h3>\n <p\n className=\"text-xs font-mono text-text-secondary truncate mt-0.5\"\n title={`${parser.inputSinkKey} → ${parser.outputKey}`}\n >\n {parser.inputSinkKey} → {parser.outputKey}\n </p>\n </div>\n\n {/* Action buttons */}\n <div className=\"flex flex-wrap items-center gap-icon-gap\">\n {onTest && (\n <button type=\"button\" onClick={handleTest} className={CARD_ACTION_CLASSES} title=\"Test Parser\">\n <span className=\"sr-only\">Test parser</span>\n <TestIcon className=\"w-icon-sm h-icon-sm\" />\n </button>\n )}\n\n {onExecute && (\n <button type=\"button\" onClick={handleExecute} className={CARD_ACTION_CLASSES} title=\"Execute Parser\">\n <span className=\"sr-only\">Execute parser</span>\n <PlayIcon className=\"w-icon-sm h-icon-sm\" />\n </button>\n )}\n\n {onEdit && (\n <button type=\"button\" onClick={handleEdit} className={CARD_ACTION_CLASSES} title=\"Edit Parser\">\n <span className=\"sr-only\">Edit parser</span>\n <EditIcon className=\"w-icon-sm h-icon-sm\" />\n </button>\n )}\n\n {onExport && (\n <button type=\"button\" onClick={handleExport} className={CARD_ACTION_CLASSES} title=\"Export Parser\">\n <span className=\"sr-only\">Export parser</span>\n <ExportIcon className=\"w-icon-sm h-icon-sm\" />\n </button>\n )}\n\n {onDelete && (\n <button\n type=\"button\"\n onClick={handleDelete}\n className={`${CARD_ACTION_CLASSES} hover:text-[var(--color-status-error-text)]`}\n title=\"Delete Parser\"\n >\n <span className=\"sr-only\">Delete parser</span>\n <DeleteIcon className=\"w-icon-sm h-icon-sm\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Description */}\n {parser.description && <p className=\"text-xs text-text-secondary mb-3 line-clamp-2\">{parser.description}</p>}\n\n {/* Footer — supporting metadata, separated from the identity block above */}\n <div className=\"mt-auto flex flex-wrap items-center justify-between gap-x-3 gap-y-1 border-t border-[var(--color-border-subtle)] pt-2 text-xs text-text-muted\">\n <span className=\"flex flex-wrap items-center gap-3\">\n <span>v{parser.version}</span>\n {parser.ttl ? <span title={`Cache TTL: ${parser.ttl} seconds`}>TTL: {parser.ttl}s</span> : null}\n </span>\n <span title={`Last updated: ${formatDate(parser.updatedAt)}`}>{formatRelativeTime(parser.updatedAt)}</span>\n </div>\n </div>\n </div>\n );\n});\n\nexport default ParserCard;\n"],"mappings":"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"}