+ {/* Toolbar */}
+
+
+ {/* JSON Viewer */}
+
+ {!props.data ? (
+
+ ) : (
+
+ )}
+
+
+ )
+})
diff --git a/packages/pinorama-studio/src/modules/log-explorer/components/log-details/styles/json-viewer.css b/packages/pinorama-studio/src/modules/log-explorer/components/log-details/styles/json-viewer.css
new file mode 100644
index 0000000..818506c
--- /dev/null
+++ b/packages/pinorama-studio/src/modules/log-explorer/components/log-details/styles/json-viewer.css
@@ -0,0 +1,51 @@
+.json-view-container {
+ @apply whitespace-pre-wrap font-mono text-sm pl-1
+}
+
+.punctuation {
+ @apply text-muted-foreground
+}
+
+.expander {
+ @apply mr-1
+}
+
+.expand-icon, .collapse-icon {
+ @apply inline-flex w-[14px] ml-[-14px] text-lg leading-none text-muted-foreground/40
+}
+
+.expand-icon::after {
+ content: 'â–¸';
+}
+
+.collapse-icon::after {
+ content: 'â–¾';
+}
+
+.collapsed-content {
+ @apply mx-1
+}
+
+.collapsed-content::after {
+ content: '...';
+}
+
+.basic-element-style {
+ @apply my-1 mx-4 p-0
+}
+
+.label, .clickable-label {
+ @apply mr-2 font-semibold
+}
+
+.value-string {
+ @apply text-sky-400
+}
+
+.value-number, .value-boolean, .value-null, .value-undefined, .value-other {
+ @apply text-rose-400
+}
+
+.collapse-icon {}
+.expand-icon {}
+
diff --git a/packages/pinorama-studio/src/modules/log-explorer/components/log-explorer.tsx b/packages/pinorama-studio/src/modules/log-explorer/components/log-explorer.tsx
new file mode 100644
index 0000000..cc0434e
--- /dev/null
+++ b/packages/pinorama-studio/src/modules/log-explorer/components/log-explorer.tsx
@@ -0,0 +1,265 @@
+import {
+ forwardRef,
+ useCallback,
+ useImperativeHandle,
+ useRef,
+ useState
+} from "react"
+
+import { usePinoramaConnection } from "@/hooks"
+import { UnplugIcon } from "lucide-react"
+import { useIntl } from "react-intl"
+
+import { EmptyStateBlock } from "@/components/empty-state"
+import {
+ ResizableHandle,
+ ResizablePanel,
+ ResizablePanelGroup
+} from "@/components/ui/resizable"
+import { type ImperativeLogDetailsHandle, LogDetails } from "./log-details"
+import { LogFilters } from "./log-filters"
+import { type ImperativeLogViewerHandle, LogViewer } from "./log-viewer"
+
+import { useAppConfig } from "@/contexts"
+import type { AnyOrama } from "@orama/orama"
+import type { PinoramaDocument } from "pinorama-types"
+import type { ImperativePanelHandle } from "react-resizable-panels"
+import type { SearchFilters } from "./log-filters/types"
+
+const PANEL_SIZES = {
+ filters: { base: 20, min: 10 },
+ details: { base: 25, min: 25 }
+}
+
+export type ImperativeLogExplorerHandle = {
+ showFilters: () => void
+ showDetails: () => void
+ maximizeDetails: () => void
+ clearFilters: () => void
+ liveMode: () => void
+ refresh: () => void
+ focusSearch: () => void
+ selectNextRow: () => void
+ selectPreviousRow: () => void
+ copyToClipboard: () => void
+ clearSelection: () => void
+ incrementFiltersSize: () => void
+ decrementFiltersSize: () => void
+ incrementDetailsSize: () => void
+ decrementDetailsSize: () => void
+}
+
+export const LogExplorer = forwardRef