@kodiak-finance/orderly-layout-split 2.9.2-alpha.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.
- package/dist/index.d.mts +506 -0
- package/dist/index.d.ts +506 -0
- package/dist/index.js +3385 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +3326 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/resizable.tsx","../src/components/SplitLayout.tsx","../src/constants.ts","../src/utils/splitLayoutUtils.ts","../src/SplitLayoutConfigContext.tsx","../src/components/icons/OrderEntryIcon.tsx","../src/components/icons/MarketLeftIcon.tsx","../src/components/icons/MarketTopIcon.tsx","../src/components/icons/MarketBottomIcon.tsx","../src/components/icons/MarketHideIcon.tsx","../src/components/SymbolBarLayoutSwitcher.tsx","../src/hooks/useViewportBreakpoint.ts","../src/hooks/useSplitLayout.ts","../src/components/TradingSortablePanel.tsx","../src/components/TradingSplitLayout.tsx","../src/components/SplitTradingLayout.tsx","../src/splitTradingStrategy.ts","../src/plugin.tsx","../src/components/SplitTradingDesktopContext.tsx","../src/components/SplitTradingDesktopChrome.tsx","../src/SplitPresetContext.tsx","../src/components/CollapsiblePanel.tsx","../src/components/SortNodeRenderer.tsx","../src/components/SplitNodeRenderer.tsx","../src/utils/splitRendererUtils.ts","../src/SplitRenderer.tsx","../src/splitStrategy.ts","../src/components/SplitInlinedLayout.tsx"],"names":["jsx","cn","useMemo","jsxs","React","Fragment","useCallback","useEffect","Box","TRADING_PANEL_IDS","CSS","useLocalStorage","useState","useRef","Flex","dropAnimationConfig","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","arrayMove","DndContext","closestCenter","restrictToVerticalAxis","SortableContext","verticalListSortingStrategy","DragOverlay","createContext","useContext","Text","IndicatorIcon","useSortable","childIndex","restPath"],"mappings":"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","file":"index.mjs","sourcesContent":["import * as ResizablePrimitive from \"react-resizable-panels\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\n\nfunction ResizablePanelGroup({\n className,\n ...props\n}: ResizablePrimitive.GroupProps) {\n return (\n <ResizablePrimitive.Group\n data-slot=\"resizable-panel-group\"\n className={cn(\n \"aria-[orientation=vertical]:oui-flex-col oui-flex oui-w-full oui-h-full\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ResizablePanel({\n className,\n ...props\n}: ResizablePrimitive.PanelProps) {\n return (\n <ResizablePrimitive.Panel\n data-slot=\"resizable-panel\"\n className={cn(className)}\n {...props}\n />\n );\n}\n\nfunction ResizableHandle({\n withHandle,\n className,\n ...props\n}: ResizablePrimitive.SeparatorProps & {\n withHandle?: boolean;\n}) {\n return (\n <ResizablePrimitive.Separator\n data-slot=\"resizable-handle\"\n className={cn(\n \"oui-bg-primary focus:oui-ring-0 focus-visible:oui-ring-0 focus-visible:oui-outline-none after:oui-absolute after:oui-inset-y-0 after:oui-left-1/2 after:oui-w-1 after:-oui-translate-x-1/2 aria-[orientation=horizontal]:oui-h-px aria-[orientation=horizontal]:oui-w-full aria-[orientation=horizontal]:after:oui-left-0 aria-[orientation=horizontal]:after:oui-h-1 aria-[orientation=horizontal]:after:oui-w-full aria-[orientation=horizontal]:after:oui-translate-x-0 aria-[orientation=horizontal]:after:-oui-translate-y-1/2 [&[aria-orientation=horizontal]>div]:oui-rotate-90 oui-relative oui-flex oui-w-px oui-items-center oui-justify-center\",\n className,\n )}\n {...props}\n >\n {withHandle && (\n <div className=\"oui-bg-primary oui-z-10 oui-flex oui-h-6 oui-w-1 oui-shrink-0 oui-rounded-lg\" />\n )}\n </ResizablePrimitive.Separator>\n );\n}\n\nexport { ResizableHandle, ResizablePanel, ResizablePanelGroup };\n","import React, { PropsWithChildren, useCallback, useMemo } from \"react\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport type { SplitLayoutClassNames } from \"../types\";\nimport {\n ResizablePanelGroup,\n ResizablePanel,\n ResizableHandle,\n} from \"./ui/resizable\";\n\n/**\n * Converts sizes array (e.g. [\"40%\", \"auto\", \"30%\"]) to defaultLayout object for ResizablePanelGroup.\n * Ensures preset sizes are applied to child panels (including nested split/sort).\n * Skips \"fixed\" entries (they are not wrapped in ResizablePanel).\n */\nfunction sizesToDefaultLayout(\n sizes: string[] | undefined,\n count: number,\n): Record<string, number> | undefined {\n if (!sizes || sizes.length !== count) return undefined;\n const result: Record<string, number> = {};\n let fixedTotal = 0;\n const autoIndices: number[] = [];\n for (let i = 0; i < count; i++) {\n const s = sizes[i];\n if (s === \"fixed\") continue; // fixed panels are not in Group\n const num = parseFloat(String(s).replace(/%/g, \"\"));\n if (!isNaN(num)) {\n result[String(i)] = Math.round(num);\n fixedTotal += num;\n } else {\n autoIndices.push(i);\n }\n }\n if (autoIndices.length > 0) {\n const remainder = Math.max(0, 100 - fixedTotal);\n const autoSize = remainder / autoIndices.length;\n for (const i of autoIndices) {\n result[String(i)] = Math.round(autoSize);\n }\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n/** Per-panel constraints for minSize, maxSize (both \"%\" format), and fixed. */\nexport interface PanelConstraints {\n minSize?: string;\n maxSize?: string;\n /** When true, panel cannot be resized (ResizablePanel disabled) */\n disabled?: boolean;\n}\n\n/**\n * Props for SplitLayout component.\n * Uses Resizable (react-resizable-panels); no dependency on @uiw/react-split.\n */\nexport interface SplitLayoutProps extends PropsWithChildren {\n /** Layout orientation: horizontal or vertical */\n orientation: \"horizontal\" | \"vertical\";\n /** Optional initial sizes per panel (e.g. [\"40%\", \"60%\"], \"auto\" for equal share, \"fixed\" for non-resizable content) */\n sizes?: string[];\n /** Optional per-panel constraints (minSize, maxSize in \"%\", disabled for fixed) */\n panelConstraints?: PanelConstraints[];\n /** Callback when panel sizes change (full array of percentage strings) */\n onSizeChange?: (sizes: string[]) => void;\n /** Optional class name for the group container */\n className?: string;\n /** Optional inline style for the group container */\n style?: React.CSSProperties;\n /** Optional classNames for panel group, panel, and handle (from plugin options). */\n classNames?: SplitLayoutClassNames;\n /** Optional gap between panels in px (total; handle margin = gap/2 each side). Undefined preserves default 3px per side. */\n gap?: number;\n}\n\n/**\n * SplitLineBar-equivalent className for ResizableHandle.\n * Keeps existing handle style: transparent default, primary-light + shadow on hover/active/focus.\n * Thickness and orientation are delegated to the underlying ResizableHandle implementation.\n */\nconst SPLIT_HANDLE_BASE_CLASSNAME = [\n \"!oui-transition-none\",\n \"!oui-shadow-none\",\n \"!oui-bg-transparent\",\n \"hover:!oui-bg-primary-light\",\n \"hover:!oui-shadow-[0px_0px_2px_0px]\",\n \"hover:!oui-shadow-primary-light/80\",\n \"active:!oui-bg-primary-light\",\n \"active:!oui-shadow-[0px_0px_2px_0px]\",\n \"active:!oui-shadow-primary-light/80\",\n // \"focus:!oui-bg-primary-light\",\n // \"focus:!oui-shadow-[0px_0px_4px_0px]\",\n // \"focus:!oui-shadow-primary-light/80\",\n];\n\nexport function SplitLayout({\n orientation,\n sizes,\n panelConstraints,\n onSizeChange,\n children,\n className,\n style,\n classNames,\n gap,\n}: SplitLayoutProps): React.ReactElement {\n const childArray = React.Children.toArray(children);\n const count = childArray.length;\n\n /** Apply preset sizes to Group so child panels (including nested split/sort) get correct initial layout. */\n const defaultLayout = useMemo(\n () => sizesToDefaultLayout(sizes, count),\n [sizes, count],\n );\n\n const handleLayoutChanged = useCallback(\n (layout: { [id: string]: number }) => {\n const panelIds = Array.from({ length: count }, (_, i) => String(i));\n const sizesAsStrings = panelIds.map((id, index) => {\n const value = layout[id];\n if (typeof value === \"number\") {\n return `${Math.round(value)}%`;\n }\n const originalSize = sizes?.[index];\n return originalSize ?? \"auto\";\n });\n onSizeChange?.(sizesAsStrings);\n },\n [onSizeChange, count],\n );\n\n if (count === 0) return <></>;\n\n /** Handle margin: gap = total px between panels (gap/2 each side). Undefined → 3px per side (backward compat). */\n const marginPx = gap != null ? gap * 2 : 4;\n const handleStyle: React.CSSProperties =\n orientation === \"horizontal\"\n ? { width: 2, marginLeft: marginPx, marginRight: marginPx }\n : { height: 2, marginTop: marginPx, marginBottom: marginPx };\n\n return (\n <ResizablePanelGroup\n orientation={orientation}\n defaultLayout={defaultLayout}\n onLayoutChanged={handleLayoutChanged}\n className={cn(className, classNames?.panelGroup)}\n style={style}\n >\n {childArray.map((child, index) => {\n const constraints = panelConstraints?.[index];\n const size = sizes?.[index];\n const isFixed = size === \"fixed\";\n const nextIsFixed = sizes?.[index + 1] === \"fixed\";\n\n return (\n <React.Fragment key={`panel-${index}`}>\n {isFixed ? (\n child\n ) : (\n <ResizablePanel\n id={String(index)}\n defaultSize={size}\n minSize={constraints?.minSize}\n maxSize={constraints?.maxSize}\n disabled={constraints?.disabled}\n className={classNames?.panel}\n >\n {child}\n </ResizablePanel>\n )}\n {index < count - 1 && !isFixed && !nextIsFixed && (\n <ResizableHandle\n className={cn(SPLIT_HANDLE_BASE_CLASSNAME, classNames?.handle)}\n style={handleStyle}\n />\n )}\n </React.Fragment>\n );\n })}\n </ResizablePanelGroup>\n );\n}\n\nSplitLayout.displayName = \"SplitLayout\";\n","import type { SplitLayoutBreakpointKey, SplitLayoutBreakpoints } from \"./types\";\n\n/** Breakpoint key order (largest to smallest). */\nexport const BREAKPOINT_KEYS: SplitLayoutBreakpointKey[] = [\n \"lg\",\n \"md\",\n \"sm\",\n \"xs\",\n];\n\n/** Default breakpoint widths (min width in px; aligned with layout-grid). */\nexport const BREAKPOINT_VALUES: SplitLayoutBreakpoints = {\n lg: 1680,\n md: 1440,\n sm: 1280,\n xs: 768,\n};\n\n/** @deprecated Use BREAKPOINT_KEYS */\nexport const SPLIT_BREAKPOINT_ORDER = BREAKPOINT_KEYS;\n\n/** @deprecated Use BREAKPOINT_VALUES */\nexport const DEFAULT_SPLIT_BREAKPOINTS = BREAKPOINT_VALUES;\n\n/** Viewport-based breakpoint keys for responsive split layout. */\nexport type ViewportBreakpointKey = SplitLayoutBreakpointKey;\n\n/** Viewport breakpoint values (max width in px). */\nexport const VIEWPORT_BREAKPOINTS = BREAKPOINT_VALUES;\n\n/** @deprecated Use BREAKPOINT_KEYS */\nexport const VIEWPORT_BREAKPOINT_ORDER = BREAKPOINT_KEYS;\n\n/** LocalStorage key for selected split preset id. */\nexport const SPLIT_PRESET_ID_STORAGE_KEY =\n \"orderly_trading_desktop_split_preset\";\n\n/** Base key for per-preset layout persistence; actual key is `${SPLIT_LAYOUT_STORAGE_KEY_PREFIX}_${presetId}`. */\nexport const SPLIT_LAYOUT_STORAGE_KEY_PREFIX =\n \"orderly_trading_desktop_layout_split\";\n","import {\n SPLIT_BREAKPOINT_ORDER,\n DEFAULT_SPLIT_BREAKPOINTS,\n} from \"../constants\";\nimport type {\n SplitLayoutNode,\n SplitLayoutModel,\n SplitLayoutBreakpointKey,\n} from \"../types\";\n\n/**\n * Returns a stable sortable id for a child node (panel uses id, others use path).\n * Never returns empty string to avoid React duplicate key warnings when id is missing.\n */\nexport function getSortableIdForChild(\n child: SplitLayoutNode,\n path: number[],\n index: number,\n): string {\n if (child.type === \"panel\" && child.id) {\n return child.id;\n }\n return `sortable-${path.join(\"-\")}-${index}`;\n}\n\n/**\n * Reorders children at the given path and returns the updated root.\n * Used when user drags to reorder within a sort container.\n */\nexport function updateOrderAtPath(\n node: SplitLayoutNode,\n path: number[],\n newOrder: SplitLayoutNode[],\n): SplitLayoutNode {\n if (node.type === \"panel\") return node;\n if (path.length === 0) {\n return { ...node, children: newOrder };\n }\n const [childIndex, ...restPath] = path;\n const updatedChildren = [...node.children];\n if (childIndex < updatedChildren.length) {\n updatedChildren[childIndex] = updateOrderAtPath(\n updatedChildren[childIndex],\n restPath,\n newOrder,\n );\n }\n return { ...node, children: updatedChildren };\n}\n\n/**\n * Creates default split layout for given panel IDs (strategy.defaultLayout).\n * This is a fallback when getInitialLayout is not provided.\n * Same simple horizontal tree for all breakpoints.\n *\n * @param panelIds - Panel IDs to include\n * @returns Split layout model with layouts and breakpoints\n */\nexport function createDefaultSplitLayout(panelIds: string[]): SplitLayoutModel {\n if (panelIds.length === 0) {\n throw new Error(\n \"Cannot create default split layout: no panel IDs provided\",\n );\n }\n\n let singleRoot: SplitLayoutNode;\n if (panelIds.length === 1) {\n singleRoot = { type: \"panel\", id: panelIds[0] };\n } else {\n singleRoot = {\n type: \"split\",\n orientation: \"horizontal\",\n children: panelIds.map((panelId) => ({\n type: \"panel\" as const,\n id: panelId,\n })),\n };\n }\n\n const layouts = {\n lg: singleRoot,\n md: singleRoot,\n sm: singleRoot,\n xs: singleRoot,\n };\n\n return {\n layouts,\n breakpoints: DEFAULT_SPLIT_BREAKPOINTS,\n };\n}\n\n/**\n * Rule-based layout types for preset rules.\n */\ninterface SplitLayoutRule {\n lg?: SplitLayoutNode;\n md?: SplitLayoutNode;\n sm?: SplitLayoutNode;\n xs?: SplitLayoutNode;\n}\n\n/**\n * Builds runtime SplitLayoutNode for one breakpoint from a rule.\n * Falls back to md when the breakpoint has no rule tree.\n */\nexport function buildSplitLayoutFromRule(\n rule: SplitLayoutRule,\n breakpointKey: SplitLayoutBreakpointKey,\n): SplitLayoutNode {\n const tree = rule[breakpointKey] ?? rule.md;\n if (!tree) {\n throw new Error(\n `Split layout rule must define at least 'md'; missing for ${breakpointKey}`,\n );\n }\n return tree as SplitLayoutNode;\n}\n\n/**\n * Builds full responsive SplitLayoutModel from a rule (all breakpoints).\n * Missing rule entries for a breakpoint use the lg tree.\n */\nexport function createDefaultSplitLayoutFromRule(\n rule: SplitLayoutRule,\n): SplitLayoutModel {\n const layouts = {} as SplitLayoutModel[\"layouts\"];\n for (const bp of SPLIT_BREAKPOINT_ORDER) {\n layouts[bp] = buildSplitLayoutFromRule(rule, bp);\n }\n\n return {\n layouts,\n breakpoints: DEFAULT_SPLIT_BREAKPOINTS,\n };\n}\n\n/**\n * Creates a default trading split layout.\n * Uses the first built-in preset rule for structure.\n */\nexport function createTradingSplitLayout(): SplitLayoutModel {\n const presets = getDefaultSplitPresets();\n const preset = presets[0];\n if (!preset) throw new Error(\"Split layout: no default presets\");\n return createDefaultSplitLayoutFromRule(preset.rule);\n}\n\n/**\n * Trading split layout preset.\n */\nexport interface SplitLayoutPreset {\n id: string;\n name: string;\n rule: SplitLayoutRule;\n}\n\n/**\n * Default split layout presets for trading.\n * These are the built-in presets that define the trading layout structure.\n */\nexport function getDefaultSplitPresets(): SplitLayoutPreset[] {\n // These presets are loaded dynamically to avoid circular dependencies\n // In production, this would come from the trading package\n return [];\n}\n\n/** Checks that value is a valid orientation. */\nfunction isValidOrientation(v: unknown): v is \"horizontal\" | \"vertical\" {\n return v === \"horizontal\" || v === \"vertical\";\n}\n\n/** Validates a container node (split or sort): orientation + children array. */\nfunction validateContainerNode(n: Record<string, unknown>): boolean {\n return (\n isValidOrientation(n.orientation) &&\n Array.isArray(n.children) &&\n (n.children as unknown[]).every((c) => validateSplitLayoutNode(c))\n );\n}\n\n/**\n * Validates a runtime split layout node recursively.\n */\nfunction validateSplitLayoutNode(node: unknown): node is SplitLayoutNode {\n if (!node || typeof node !== \"object\") return false;\n const n = node as Record<string, unknown>;\n\n if (n.type === \"panel\") {\n return (\n typeof n.id === \"string\" &&\n n.id.length > 0 &&\n (n.size === undefined || typeof n.size === \"string\") &&\n (n.minSize === undefined || typeof n.minSize === \"string\") &&\n (n.maxSize === undefined || typeof n.maxSize === \"string\") &&\n (n.disabled === undefined || typeof n.disabled === \"boolean\") &&\n (n.className === undefined || typeof n.className === \"string\") &&\n (n.style === undefined || typeof n.style === \"object\")\n );\n }\n if (n.type === \"split\" || n.type === \"sort\") return validateContainerNode(n);\n return false;\n}\n\n/**\n * Validates that an object has required layouts and breakpoints for the model shape.\n */\nfunction validateSplitLayoutModel(parsed: unknown): parsed is SplitLayoutModel {\n if (!parsed || typeof parsed !== \"object\") return false;\n const p = parsed as Record<string, unknown>;\n const layoutsSource = p.layouts ?? p.roots;\n if (!layoutsSource || typeof layoutsSource !== \"object\") return false;\n if (!p.breakpoints || typeof p.breakpoints !== \"object\") return false;\n const layouts = layoutsSource as Record<string, unknown>;\n const bp = p.breakpoints as Record<string, unknown>;\n for (const k of SPLIT_BREAKPOINT_ORDER) {\n if (!validateSplitLayoutNode(layouts[k]) || typeof bp[k] !== \"number\") {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Serializes split layout model to JSON (layouts + breakpoints only).\n */\nexport function serializeSplitLayout(layout: SplitLayoutModel): string {\n return JSON.stringify(layout);\n}\n\n/**\n * Deserializes JSON to split layout model; validates layouts and breakpoints.\n * No conversion: panel nodes keep `id` as stored.\n */\nexport function deserializeSplitLayout(json: string): SplitLayoutModel {\n try {\n const parsed = JSON.parse(json) as unknown;\n if (!validateSplitLayoutModel(parsed)) {\n throw new Error(\n \"Invalid split layout: must have layouts (lg,md,sm,xs) and breakpoints\",\n );\n }\n const layout = parsed as SplitLayoutModel & {\n roots?: SplitLayoutModel[\"layouts\"];\n };\n const layoutsSource = layout.layouts ?? layout.roots;\n const layouts = {} as SplitLayoutModel[\"layouts\"];\n for (const bp of SPLIT_BREAKPOINT_ORDER) {\n layouts[bp] = layoutsSource[bp];\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- omit roots when returning layouts\n const { roots: _roots, ...rest } = layout;\n return { ...rest, layouts };\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to deserialize split layout: ${error.message}`);\n }\n throw new Error(`Failed to deserialize split layout: ${error}`);\n }\n}\n","/**\n * Context for split layout configuration (panels, layout, breakpoint, callbacks).\n * Provides configuration to SplitNodeRenderer without prop drilling.\n */\nimport React, { createContext, useContext, useMemo } from \"react\";\nimport type { PanelRegistry } from \"@kodiak-finance/orderly-layout-core\";\nimport type { SplitLayoutClassNames, SplitLayoutModel } from \"./types\";\n\nexport interface SplitLayoutConfigValue {\n /** Registry of panel components (id -> React.ReactNode). */\n panels: PanelRegistry;\n /** Current layout model with breakpoint roots. */\n layout: SplitLayoutModel;\n /** Current breakpoint key (e.g. \"md\", \"sm\"). */\n breakpoint: keyof SplitLayoutModel[\"layouts\"];\n /** Callback when layout model changes. */\n onLayoutChange: (layout: SplitLayoutModel) => void;\n /** Callback when panel sizes change at a path. */\n onSizeChange: (path: number[], sizes: string[]) => void;\n /** Callback when panel sizes should be persisted (e.g., on resize end). */\n onSizePersist?: (path: number[], sizes: string[]) => void;\n /** Optional classNames for panel group, panel, and handle (from plugin options). */\n classNames?: SplitLayoutClassNames;\n /** Optional gap between panels in px (from plugin options). */\n gap?: number;\n /** Set of collapsed panel IDs. */\n collapsedPanels: Set<string>;\n /** Toggle collapse state for a panel. */\n togglePanelCollapse: (panelId: string) => void;\n /** Check if a panel is collapsed. */\n isPanelCollapsed: (panelId: string) => boolean;\n /** Map of panel IDs that are collapsible. */\n collapsiblePanels: Map<string, boolean>;\n /** Check if a panel is collapsible. */\n isPanelCollapsible: (panelId: string) => boolean;\n}\n\nconst SplitLayoutConfigContext = createContext<SplitLayoutConfigValue | null>(\n null,\n);\n\nexport interface SplitLayoutConfigProviderProps {\n /** Registry of panel components. */\n panels: PanelRegistry;\n /** Current layout model. */\n layout: SplitLayoutModel;\n /** Current breakpoint key. */\n breakpoint: keyof SplitLayoutModel[\"layouts\"];\n /** Callback when layout model changes. */\n onLayoutChange: (layout: SplitLayoutModel) => void;\n /** Callback when panel sizes change. */\n onSizeChange: (path: number[], sizes: string[]) => void;\n /** Callback when panel sizes should be persisted. */\n onSizePersist?: (path: number[], sizes: string[]) => void;\n /** Optional classNames for panel group, panel, and handle. */\n classNames?: SplitLayoutClassNames;\n /** Optional gap between panels in px. */\n gap?: number;\n /** Set of collapsed panel IDs. */\n collapsedPanels: Set<string>;\n /** Toggle collapse state for a panel. */\n togglePanelCollapse: (panelId: string) => void;\n /** Check if a panel is collapsed. */\n isPanelCollapsed: (panelId: string) => boolean;\n /** Map of panel IDs that are collapsible. */\n collapsiblePanels: Map<string, boolean>;\n /** Check if a panel is collapsible. */\n isPanelCollapsible: (panelId: string) => boolean;\n children: React.ReactNode;\n}\n\n/**\n * Provides layout configuration to SplitNodeRenderer.\n * Use at the root of the split layout renderer.\n */\nexport function SplitLayoutConfigProvider({\n panels,\n layout,\n breakpoint,\n onLayoutChange,\n onSizeChange,\n onSizePersist,\n classNames,\n gap,\n collapsedPanels,\n togglePanelCollapse,\n isPanelCollapsed,\n collapsiblePanels,\n isPanelCollapsible,\n children,\n}: SplitLayoutConfigProviderProps): React.ReactElement {\n const value = useMemo<SplitLayoutConfigValue>(\n () => ({\n panels,\n layout,\n breakpoint,\n onLayoutChange,\n onSizeChange,\n onSizePersist,\n classNames,\n gap,\n collapsedPanels,\n togglePanelCollapse,\n isPanelCollapsed,\n collapsiblePanels,\n isPanelCollapsible,\n }),\n [\n panels,\n layout,\n breakpoint,\n onLayoutChange,\n onSizeChange,\n onSizePersist,\n classNames,\n gap,\n collapsedPanels,\n togglePanelCollapse,\n isPanelCollapsed,\n collapsiblePanels,\n isPanelCollapsible,\n ],\n );\n\n return (\n <SplitLayoutConfigContext.Provider value={value}>\n {children}\n </SplitLayoutConfigContext.Provider>\n );\n}\n\n/**\n * Hook to read layout config from context.\n * Throws if used outside SplitLayoutConfigProvider.\n */\nexport function useSplitLayoutConfig(): SplitLayoutConfigValue {\n const ctx = useContext(SplitLayoutConfigContext);\n if (!ctx) {\n throw new Error(\n \"useSplitLayoutConfig must be used within SplitLayoutConfigProvider\",\n );\n }\n return ctx;\n}\n","import type React from \"react\";\nimport type { SVGProps } from \"react\";\n\n/**\n * Order-entry column icon used inside the advanced layout cards.\n * Copied from trading SwitchLayout to keep visual style consistent.\n */\nexport const OrderEntryIcon: React.FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"36\"\n height=\"84\"\n viewBox=\"0 0 36 84\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <rect width=\"36\" height=\"17\" rx=\"2\" fill=\"rgb(var(--oui-color-base-7))\" />\n <rect\n y=\"19\"\n width=\"36\"\n height=\"54\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-7))\"\n />\n <rect\n y=\"75\"\n width=\"36\"\n height=\"9\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-7))\"\n />\n <rect\n x=\"3\"\n y=\"79\"\n width=\"30\"\n height=\"1\"\n rx=\"0.5\"\n fill=\"url(#paint0_linear_17647_26849)\"\n />\n <rect\n x=\"3\"\n y=\"22\"\n width=\"14\"\n height=\"6\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-success-darken))\"\n />\n <rect\n x=\"19\"\n y=\"22\"\n width=\"14\"\n height=\"6\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-danger-darken))\"\n />\n <rect\n x=\"3\"\n y=\"11\"\n width=\"14\"\n height=\"3\"\n rx=\"1.5\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n <rect\n x=\"19\"\n y=\"11\"\n width=\"14\"\n height=\"3\"\n rx=\"1.5\"\n fill=\"rgb(var(--oui-color-primary-darken))\"\n />\n <rect\n x=\"3\"\n y=\"62\"\n width=\"30\"\n height=\"8\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-success-darken))\"\n />\n <defs>\n <linearGradient\n id=\"paint0_linear_17647_26849\"\n x1=\"33\"\n y1=\"79.5\"\n x2=\"3\"\n y2=\"79.5\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"rgb(var(--oui-color-primary-light))\" />\n <stop offset=\"1\" stopColor=\"rgb(var(--oui-gradient-brand-start))\" />\n </linearGradient>\n </defs>\n </svg>\n);\n","import type React from \"react\";\nimport type { SVGProps } from \"react\";\n\nexport interface MarketIconProps extends SVGProps<SVGSVGElement> {\n isSelected?: boolean;\n isHovered?: boolean;\n}\n\n/**\n * Markets-left layout preview icon.\n * Copied from trading SwitchLayout to keep visual style consistent.\n */\nexport const MarketLeftIcon: React.FC<MarketIconProps> = ({\n isSelected,\n isHovered,\n ...props\n}) => {\n const getStrokeColor = () => {\n if (isSelected) return \"rgb(var(--oui-color-primary-light))\";\n if (isHovered) return \"rgb(var(--oui-color-primary-light))\";\n return \"rgb(var(--oui-color-base-5))\";\n };\n\n return (\n <svg\n width=\"148\"\n height=\"100\"\n viewBox=\"0 0 148 100\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <rect\n x=\"2\"\n y=\"2\"\n width=\"144\"\n height=\"96\"\n rx=\"10\"\n fill=\"rgb(var(--oui-color-base-10))\"\n stroke={getStrokeColor()}\n strokeWidth=\"4\"\n />\n <rect\n x=\"8\"\n y=\"8\"\n width=\"24\"\n height=\"84\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-7))\"\n />\n <rect\n x=\"16\"\n y=\"10\"\n width=\"4\"\n height=\"2\"\n rx=\"1\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n <rect\n x=\"21\"\n y=\"10\"\n width=\"4\"\n height=\"2\"\n rx=\"1\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n <rect\n x=\"26\"\n y=\"10\"\n width=\"4\"\n height=\"2\"\n rx=\"1\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n <rect\n x=\"10\"\n y=\"10\"\n width=\"5\"\n height=\"2\"\n rx=\"1\"\n fill=\"rgb(var(--oui-color-primary-darken))\"\n />\n <rect\n x=\"10\"\n y=\"14\"\n width=\"20\"\n height=\"76\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-5))\"\n />\n </svg>\n );\n};\n","import type React from \"react\";\nimport type { SVGProps } from \"react\";\nimport type { MarketIconProps } from \"./MarketLeftIcon\";\n\n/**\n * Markets-top layout preview icon.\n * Copied from trading SwitchLayout to keep visual style consistent.\n */\nexport const MarketTopIcon: React.FC<MarketIconProps> = ({\n isSelected,\n isHovered,\n ...props\n}) => {\n const getStrokeColor = () => {\n if (isSelected) return \"rgb(var(--oui-color-primary-light))\";\n if (isHovered) return \"rgb(var(--oui-color-primary-light))\";\n return \"rgb(var(--oui-color-base-5))\";\n };\n\n return (\n <svg\n width=\"148\"\n height=\"100\"\n viewBox=\"0 0 148 100\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <rect\n x=\"2\"\n y=\"2\"\n width=\"144\"\n height=\"96\"\n rx=\"10\"\n fill=\"rgb(var(--oui-color-base-10))\"\n stroke={getStrokeColor()}\n strokeWidth=\"4\"\n />\n <rect\n x=\"8\"\n y=\"8\"\n width=\"132\"\n height=\"8\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-7))\"\n />\n <g clipPath=\"url(#clip0_31319_74729)\">\n <rect\n x=\"10\"\n y=\"10\"\n width=\"16\"\n height=\"4\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-primary-darken))\"\n />\n <rect\n x=\"28\"\n y=\"10\"\n width=\"16\"\n height=\"4\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n <rect\n x=\"46\"\n y=\"10\"\n width=\"16\"\n height=\"4\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n <rect\n x=\"64\"\n y=\"10\"\n width=\"16\"\n height=\"4\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n <rect\n x=\"82\"\n y=\"10\"\n width=\"16\"\n height=\"4\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n <rect\n x=\"100\"\n y=\"10\"\n width=\"16\"\n height=\"4\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n <rect\n x=\"118\"\n y=\"10\"\n width=\"16\"\n height=\"4\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n <rect\n x=\"136\"\n y=\"10\"\n width=\"16\"\n height=\"4\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_31319_74729\">\n <rect\n width=\"130\"\n height=\"4\"\n fill=\"rgb(var(--oui-color-base-foreground))\"\n transform=\"translate(10 10)\"\n />\n </clipPath>\n </defs>\n </svg>\n );\n};\n","import type React from \"react\";\nimport type { SVGProps } from \"react\";\nimport type { MarketIconProps } from \"./MarketLeftIcon\";\n\n/**\n * Markets-bottom layout preview icon.\n * Copied from trading SwitchLayout to keep visual style consistent.\n */\nexport const MarketBottomIcon: React.FC<MarketIconProps> = ({\n isSelected,\n isHovered,\n ...props\n}) => {\n const getStrokeColor = () => {\n if (isSelected) return \"rgb(var(--oui-color-primary-light))\";\n if (isHovered) return \"rgb(var(--oui-color-primary-light))\";\n return \"rgb(var(--oui-color-base-5))\";\n };\n\n return (\n <svg\n width=\"148\"\n height=\"100\"\n viewBox=\"0 0 148 100\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <rect\n x=\"2\"\n y=\"2\"\n width=\"144\"\n height=\"96\"\n rx=\"10\"\n fill=\"rgb(var(--oui-color-base-10))\"\n stroke={getStrokeColor()}\n strokeWidth=\"4\"\n />\n <rect\n x=\"8\"\n y=\"84\"\n width=\"132\"\n height=\"8\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-7))\"\n />\n <g clipPath=\"url(#clip0_31319_74743)\">\n <rect\n x=\"10\"\n y=\"86\"\n width=\"16\"\n height=\"4\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-primary-darken))\"\n />\n <rect\n x=\"28\"\n y=\"86\"\n width=\"16\"\n height=\"4\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n <rect\n x=\"46\"\n y=\"86\"\n width=\"16\"\n height=\"4\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n <rect\n x=\"64\"\n y=\"86\"\n width=\"16\"\n height=\"4\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n <rect\n x=\"82\"\n y=\"86\"\n width=\"16\"\n height=\"4\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n <rect\n x=\"100\"\n y=\"86\"\n width=\"16\"\n height=\"4\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n <rect\n x=\"118\"\n y=\"86\"\n width=\"16\"\n height=\"4\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n <rect\n x=\"136\"\n y=\"86\"\n width=\"16\"\n height=\"4\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-4))\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_31319_74743\">\n <rect\n width=\"130\"\n height=\"4\"\n fill=\"rgb(var(--oui-color-base-foreground))\"\n transform=\"translate(10 86)\"\n />\n </clipPath>\n </defs>\n </svg>\n );\n};\n","import type React from \"react\";\nimport type { SVGProps } from \"react\";\nimport type { MarketIconProps } from \"./MarketLeftIcon\";\n\n/**\n * Markets-hide layout preview icon.\n * Copied from trading SwitchLayout to keep visual style consistent.\n */\nexport const MarketHideIcon: React.FC<MarketIconProps> = ({\n isSelected,\n isHovered,\n ...props\n}) => {\n const getStrokeColor = () => {\n if (isSelected) return \"rgb(var(--oui-color-primary-light))\";\n if (isHovered) return \"rgb(var(--oui-color-primary-light))\";\n return \"rgb(var(--oui-color-base-5))\";\n };\n\n return (\n <svg\n width=\"148\"\n height=\"100\"\n viewBox=\"0 0 148 100\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <rect\n x=\"2\"\n y=\"2\"\n width=\"144\"\n height=\"96\"\n rx=\"10\"\n fill=\"rgb(var(--oui-color-base-10))\"\n stroke={getStrokeColor()}\n strokeWidth=\"4\"\n />\n <g clipPath=\"url(#clip0_31319_74757)\">\n <rect\n x=\"8\"\n y=\"8\"\n width=\"132\"\n height=\"84\"\n rx=\"2\"\n fill=\"rgb(var(--oui-color-base-7))\"\n />\n <rect\n x=\"66.8789\"\n y=\"-76\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 66.8789 -76)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"73.9492\"\n y=\"-68.929\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 73.9492 -68.929)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"81.0195\"\n y=\"-61.8579\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 81.0195 -61.8579)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"88.0938\"\n y=\"-54.7867\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 88.0938 -54.7867)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"95.1641\"\n y=\"-47.7157\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 95.1641 -47.7157)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"102.234\"\n y=\"-40.6447\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 102.234 -40.6447)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"109.305\"\n y=\"-33.5736\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 109.305 -33.5736)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"116.375\"\n y=\"-26.5026\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 116.375 -26.5026)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"123.449\"\n y=\"-19.4315\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 123.449 -19.4315)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"130.52\"\n y=\"-12.3604\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 130.52 -12.3604)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"137.59\"\n y=\"-5.28931\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 137.59 -5.28931)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"144.66\"\n y=\"1.78174\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 144.66 1.78174)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"151.73\"\n y=\"8.85278\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 151.73 8.85278)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"158.805\"\n y=\"15.9238\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 158.805 15.9238)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"165.875\"\n y=\"22.995\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 165.875 22.995)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"172.945\"\n y=\"30.066\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 172.945 30.066)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"180.016\"\n y=\"37.1371\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 180.016 37.1371)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"187.086\"\n y=\"44.2081\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 187.086 44.2081)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"194.156\"\n y=\"51.2792\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 194.156 51.2792)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n <rect\n x=\"201.23\"\n y=\"58.3503\"\n width=\"4\"\n height=\"188\"\n rx=\"2\"\n transform=\"rotate(45 201.23 58.3503)\"\n fill=\"rgb(var(--oui-color-base-6))\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_31319_74757\">\n <rect\n width=\"132\"\n height=\"84\"\n fill=\"rgb(var(--oui-color-base-foreground))\"\n transform=\"translate(8 8)\"\n />\n </clipPath>\n </defs>\n </svg>\n );\n};\n","import React from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n CloseIcon,\n cn,\n Divider,\n DropdownMenuContent,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuTrigger,\n Flex,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n MarketLeftIcon,\n MarketTopIcon,\n MarketBottomIcon,\n MarketHideIcon,\n} from \"./icons\";\nimport { OrderEntryIcon } from \"./icons/OrderEntryIcon\";\n\ntype LayoutPosition = \"left\" | \"right\";\n\n// Local copy of market layout positions\ntype MarketLayoutPosition = \"left\" | \"top\" | \"bottom\" | \"hide\";\n\ninterface LayoutSwitchButtonProps {\n layout: LayoutPosition;\n markets: MarketLayoutPosition;\n onLayoutChange: (layout: LayoutPosition) => void;\n onMarketChange: (markets: MarketLayoutPosition) => void;\n}\n\n/**\n * Dropdown UI for switching between advanced left/right and markets left/top/bottom/hide.\n */\nconst LayoutSwitchButton: React.FC<LayoutSwitchButtonProps> = ({\n layout,\n markets,\n onLayoutChange,\n onMarketChange,\n}) => {\n const { t } = useTranslation();\n const [open, setOpen] = React.useState(false);\n const [hoveredMarket, setHoveredMarket] =\n React.useState<MarketLayoutPosition | null>(null);\n\n const renderLayoutItem = (position: LayoutPosition) => (\n <Flex\n direction=\"column\"\n gapY={2}\n onClick={() => {\n onLayoutChange(position);\n setOpen(false);\n }}\n className=\"oui-group\"\n >\n <Flex\n justify={position === \"right\" ? \"end\" : \"start\"}\n className={cn(\n \"oui-w-[148px] oui-h-[100px]\",\n \"oui-bg-base-10 oui-rounded-[10px]\",\n \"oui-border-[4px] oui-border-base-5 group-hover:oui-border-primary-light\",\n layout === position && \"!oui-border-primary-light\",\n )}\n >\n <Box p={1}>\n <OrderEntryIcon />\n </Box>\n </Flex>\n <Text\n size=\"2xs\"\n intensity={54}\n className={cn(\n \"oui-text-base-contrast-54 group-hover:oui-text-base-contrast-80\",\n layout === position && \"oui-text-base-contrast-80\",\n )}\n >\n {String(\n position === \"right\"\n ? t(\"trading.layout.advanced.right\")\n : t(\"trading.layout.advanced.left\"),\n )}\n </Text>\n </Flex>\n );\n\n const renderMarketItem = (position: MarketLayoutPosition) => {\n const isSelected = markets === position;\n const isHovered = hoveredMarket === position;\n\n const getLabel = () => {\n switch (position) {\n case \"left\":\n return t(\"trading.layout.markets.left\");\n case \"top\":\n return t(\"trading.layout.markets.top\");\n case \"bottom\":\n return t(\"trading.layout.markets.bottom\");\n case \"hide\":\n return t(\"trading.layout.markets.hide\");\n default:\n return t(\"trading.layout.markets.left\");\n }\n };\n\n return (\n <Flex\n direction=\"column\"\n gapY={2}\n onClick={() => {\n onMarketChange(position);\n setOpen(false);\n }}\n onMouseEnter={() => setHoveredMarket(position)}\n onMouseLeave={() => setHoveredMarket(null)}\n className=\"oui-group\"\n >\n <Flex justify=\"center\" className=\"oui-w-[148px] oui-h-[100px]\">\n {position === \"left\" && (\n <MarketLeftIcon isSelected={isSelected} isHovered={isHovered} />\n )}\n {position === \"top\" && (\n <MarketTopIcon isSelected={isSelected} isHovered={isHovered} />\n )}\n {position === \"bottom\" && (\n <MarketBottomIcon isSelected={isSelected} isHovered={isHovered} />\n )}\n {position === \"hide\" && (\n <MarketHideIcon isSelected={isSelected} isHovered={isHovered} />\n )}\n </Flex>\n <Text\n size=\"2xs\"\n intensity={54}\n className={cn(\n \"oui-text-base-contrast-54 group-hover:oui-text-base-contrast-80\",\n isSelected && \"oui-text-base-contrast-80\",\n )}\n >\n {String(getLabel())}\n </Text>\n </Flex>\n );\n };\n\n const content = (\n <>\n <Flex\n itemAlign=\"center\"\n justify=\"between\"\n mt={3}\n className=\"oui-mb-[10px] oui-min-w-[500px]\"\n >\n <Text size=\"base\" intensity={98}>\n {t(\"trading.layout\")}\n </Text>\n <CloseIcon\n size={16}\n className=\"oui-cursor-pointer oui-text-base-contrast-80\"\n opacity={0.98}\n onClick={() => {\n setOpen(false);\n }}\n />\n </Flex>\n <Divider />\n <Flex direction=\"column\" gapY={2} mt={5} itemAlign=\"start\">\n <Text size=\"xs\" intensity={98}>\n {String(t(\"trading.layout.advanced\"))}\n </Text>\n <Flex gapX={6}>\n {renderLayoutItem(\"left\")}\n {renderLayoutItem(\"right\")}\n </Flex>\n </Flex>\n <Flex direction=\"column\" gapY={2} mt={5} itemAlign=\"start\">\n <Text size=\"xs\" intensity={98}>\n {String(t(\"trading.layout.markets\"))}\n </Text>\n <Flex gapX={6}>\n {renderMarketItem(\"left\")}\n {renderMarketItem(\"top\")}\n {renderMarketItem(\"bottom\")}\n {renderMarketItem(\"hide\")}\n </Flex>\n </Flex>\n </>\n );\n\n return (\n <DropdownMenuRoot open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <Flex\n px={3}\n className={cn(\n \"oui-rounded-md\",\n \"oui-h-[28px]\",\n \"oui-cursor-pointer oui-transition-all\",\n \"oui-bg-base-6 hover:oui-bg-base-4\",\n \"oui-text-base-contrast-54 hover:oui-text-base-contrast-80\",\n )}\n gapX={1}\n ml={3}\n justify=\"center\"\n itemAlign=\"center\"\n >\n <Text size=\"2xs\" weight=\"semibold\">\n {t(\"trading.layout\")}\n </Text>\n </Flex>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n onCloseAutoFocus={(e) => e.preventDefault()}\n onClick={(e) => e.stopPropagation()}\n align=\"end\"\n className={cn(\"oui-bg-base-8 oui-p-5 oui-pt-0 oui-font-semibold\")}\n >\n {content}\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n );\n};\n\n/**\n * Symbol bar trailing control for layout switching.\n * Note: In the fixed layout approach, this component needs to be connected to\n * the layout state management (e.g., via context or props).\n * This is a simplified version that shows the UI but requires external state management.\n */\nexport const SymbolBarLayoutSwitcher: React.FC<{\n layout?: LayoutPosition;\n marketLayout?: MarketLayoutPosition;\n onLayoutChange?: (layout: LayoutPosition) => void;\n onMarketLayoutChange?: (markets: MarketLayoutPosition) => void;\n}> = ({\n layout = \"right\",\n marketLayout = \"left\",\n onLayoutChange,\n onMarketLayoutChange,\n}) => {\n if (!onLayoutChange || !onMarketLayoutChange) {\n // When no callbacks provided, don't render\n return <></>;\n }\n\n return (\n <LayoutSwitchButton\n layout={layout}\n markets={marketLayout}\n onLayoutChange={onLayoutChange}\n onMarketChange={onMarketLayoutChange}\n />\n );\n};\n","import { useState, useEffect } from \"react\";\nimport { BREAKPOINT_KEYS, VIEWPORT_BREAKPOINTS } from \"../constants\";\nimport type { ViewportBreakpointKey } from \"../constants\";\n\n/**\n * Returns the current viewport breakpoint key (largest breakpoint whose max width >= viewport width).\n */\nexport function getViewportBreakpointKey(\n viewportWidth: number,\n breakpoints = VIEWPORT_BREAKPOINTS,\n): ViewportBreakpointKey {\n for (const bp of BREAKPOINT_KEYS) {\n // console.log(\"-------->>>>>>\", viewportWidth, breakpoints[bp], bp);\n if (viewportWidth >= breakpoints[bp]) return bp;\n }\n return \"xs\";\n}\n\nexport interface UseViewportBreakpointOptions {\n /** Breakpoint map; defaults to VIEWPORT_BREAKPOINTS. */\n breakpoints?: typeof VIEWPORT_BREAKPOINTS;\n /** Initial width when ref not yet mounted. */\n fallbackWidth?: number;\n}\n\n/**\n * Observes viewport width and returns current breakpoint key.\n * Uses ResizeObserver on document.documentElement; before mount uses fallbackWidth.\n *\n * @param options - Optional breakpoints and fallbackWidth\n * @returns Current breakpoint key (lg | md | sm | xs)\n */\nexport function useViewportBreakpoint(\n options: UseViewportBreakpointOptions = {},\n): ViewportBreakpointKey {\n const {\n breakpoints = VIEWPORT_BREAKPOINTS,\n fallbackWidth = typeof window !== \"undefined\" ? window.innerWidth : 1440,\n } = options;\n const [width, setWidth] = useState(fallbackWidth);\n\n useEffect(() => {\n const element = document.documentElement;\n if (!element) return;\n\n setWidth(window.innerWidth);\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n setWidth(entry.contentRect.width);\n }\n });\n\n resizeObserver.observe(element);\n\n return () => resizeObserver.disconnect();\n }, []);\n\n const bp = getViewportBreakpointKey(width, breakpoints);\n return bp;\n}\n","/**\n * useSplitLayout - Hook for computing split layout state and sizes\n *\n * Mirrors the layout computation logic from trading.script.tsx but for the layout-split plugin.\n * Computes sizes via localStorage persistence and returns layout state values.\n */\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useLocalStorage, useMediaQuery } from \"@kodiak-finance/orderly-hooks\";\nimport { TRADING_PANEL_IDS } from \"@kodiak-finance/orderly-layout-core\";\nimport type { SplitLayoutBreakpointKey } from \"../types\";\nimport { useViewportBreakpoint } from \"./useViewportBreakpoint\";\n\n// Layout dimension constants (from trading.script.tsx)\nexport const ORDER_ENTRY_MIN_WIDTH = 280;\nexport const ORDER_ENTRY_MAX_WIDTH = 360;\n\nexport const ORDERBOOK_MIN_WIDTH = 280;\nexport const ORDERBOOK_MAX_WIDTH = 732;\n\nexport const ORDERBOOK_MIN_HEIGHT = 464;\nexport const ORDERBOOK_MAX_HEIGHT = 728;\n\nexport const TRADINGVIEW_MIN_HEIGHT = 320;\nexport const TRADINGVIEW_MIN_WIDTH = 540;\n\nexport const DATA_LIST_MAX_HEIGHT = 800;\nexport const DATA_LIST_INITIAL_HEIGHT = 350;\n\nexport const SPACE = 8;\nexport const SYMBOL_INFO_BAR_HEIGHT = 54;\n\n// Storage keys\nconst ORDERLY_ORDER_ENTRY_SIDE_MARKETS_LAYOUT =\n \"orderly_order_entry_side_markets_layout\";\nconst ORDERLY_SIDE_MARKETS_MODE_KEY = \"orderly_side_markets_mode\";\nconst ORDERLY_HORIZONTAL_MARKETS_LAYOUT = \"orderly_horizontal_markets_layout\";\n\nconst ORDERLY_MAIN_SPLIT_SIZE = \"orderly_main_split_size\";\nconst ORDERLY_DATA_LIST_SPLIT_SIZE = \"orderly_datalist_split_size\";\nconst ORDERLY_ORDERBOOK_SPLIT_SIZE = \"orderly_orderbook_split_size\";\nconst ORDERLY_DATA_LIST_SPLIT_HEIGHT_SM = \"orderly_datalist_split_height_sm\";\nconst ORDERLY_ORDERBOOK_SPLIT_HEIGHT_SM = \"orderly_orderbook_split_height_sm\";\nconst ORDERLY_ORDER_ENTRY_EXTRA_HEIGHT = \"orderly_order_entry_extra_height\";\n\nexport type MarketLayoutPosition = \"left\" | \"top\" | \"bottom\" | \"hide\";\nexport type PanelSize = \"small\" | \"middle\" | \"large\";\n\nexport interface UseSplitLayoutOptions {\n symbol?: string;\n /** Initial layout side (order entry left/right) */\n initialLayout?: \"left\" | \"right\";\n /** Initial market layout position */\n initialMarketLayout?: MarketLayoutPosition;\n /** Whether user can trade */\n canTrade?: boolean;\n /** First time depositor */\n isFirstTimeDeposit?: boolean;\n /** Disable features */\n disableFeatures?: Record<string, boolean>;\n /** Navigate callback */\n onRouteChange?: (route: { href: string; name: string }) => void;\n}\n\nexport interface UseSplitLayoutReturn {\n // Layout position state\n layout: \"left\" | \"right\";\n setLayout: (layout: \"left\" | \"right\") => void;\n marketLayout: MarketLayoutPosition;\n setMarketLayout: (layout: MarketLayoutPosition) => void;\n\n // Breakpoint state\n breakpoint: SplitLayoutBreakpointKey;\n max2XL: boolean; // max-width: 1279px\n min3XL: boolean; // min-width: 1440px\n max4XL: boolean; // max-width: 1680px\n horizontalDraggable: boolean;\n\n // Panel size state (for collapsible markets)\n panelSize: PanelSize;\n setPanelSize: (size: PanelSize) => void;\n marketsWidth: number;\n\n // Split sizes (persisted)\n mainSplitSize: string;\n setMainSplitSize: (size: string) => void;\n orderBookSplitSize: string;\n setOrderbookSplitSize: (size: string) => void;\n dataListSplitSize: string;\n setDataListSplitSize: (size: string) => void;\n dataListSplitHeightSM: string;\n setDataListSplitHeightSM: (size: string) => void;\n orderBookSplitHeightSM: string;\n setOrderbookSplitHeightSM: (size: string) => void;\n\n // Extra height for order entry\n extraHeight: number;\n setExtraHeight: (height: number) => void;\n\n // Data list height\n dataListHeight: number;\n\n // Trading view max height\n tradingviewMaxHeight: number;\n\n // Layout tree (for backward compat with LayoutHost)\n layoutTree: SplitLayoutNode;\n\n // Constants\n symbolInfoBarHeight: number;\n space: number;\n orderbookMinWidth: number;\n orderbookMaxWidth: number;\n orderbookMinHeight: number;\n orderbookMaxHeight: number;\n tradingviewMinHeight: number;\n orderEntryMinWidth: number;\n orderEntryMaxWidth: number;\n}\n\n/** Simplified split layout node for backward compat */\nexport type SplitLayoutNode =\n | {\n type: \"panel\";\n id: string;\n size?: string;\n minSize?: string;\n maxSize?: string;\n disabled?: boolean;\n }\n | {\n type: \"split\";\n orientation: \"horizontal\" | \"vertical\";\n children: SplitLayoutNode[];\n size?: string;\n }\n | {\n type: \"sort\";\n orientation: \"horizontal\" | \"vertical\";\n children: SplitLayoutNode[];\n size?: string;\n };\n\n/**\n * Builds a simplified layout tree for the current breakpoint and layout settings\n */\nfunction buildLayoutTree(\n layout: \"left\" | \"right\",\n marketLayout: MarketLayoutPosition,\n max2XL: boolean,\n): SplitLayoutNode {\n // For max2XL (≤1279px), use vertical layout\n if (max2XL) {\n return buildSMLayoutTree(layout, marketLayout);\n }\n return buildLGLayoutTree(layout, marketLayout);\n}\n\nfunction buildLGLayoutTree(\n layout: \"left\" | \"right\",\n marketLayout: MarketLayoutPosition,\n): SplitLayoutNode {\n const orderEntrySort: SplitLayoutNode = {\n type: \"sort\",\n orientation: \"vertical\",\n children: [\n { type: \"panel\", id: TRADING_PANEL_IDS.MARGIN },\n { type: \"panel\", id: TRADING_PANEL_IDS.ASSETS },\n { type: \"panel\", id: TRADING_PANEL_IDS.ORDER_ENTRY },\n ],\n };\n\n const tvObSplit: SplitLayoutNode = {\n type: \"split\",\n orientation: \"horizontal\",\n children: [\n { type: \"panel\", id: TRADING_PANEL_IDS.TRADING_VIEW },\n { type: \"panel\", id: TRADING_PANEL_IDS.ORDERBOOK },\n ],\n };\n\n const mainCol: SplitLayoutNode = {\n type: \"split\",\n orientation: \"vertical\",\n children: [\n {\n type: \"panel\",\n id: TRADING_PANEL_IDS.SYMBOL_INFO_BAR,\n size: \"fixed\",\n disabled: true,\n },\n tvObSplit,\n { type: \"panel\", id: TRADING_PANEL_IDS.DATA_LIST },\n ],\n };\n\n if (marketLayout === \"top\") {\n return {\n type: \"split\",\n orientation: \"vertical\",\n children: [\n {\n type: \"panel\",\n id: TRADING_PANEL_IDS.HORIZONTAL_MARKETS,\n size: \"fixed\",\n disabled: true,\n },\n layout === \"left\"\n ? {\n type: \"split\",\n orientation: \"horizontal\",\n children: [orderEntrySort, mainCol],\n }\n : {\n type: \"split\",\n orientation: \"horizontal\",\n children: [mainCol, orderEntrySort],\n },\n ],\n };\n }\n\n if (marketLayout === \"bottom\") {\n return layout === \"left\"\n ? {\n type: \"split\",\n orientation: \"horizontal\",\n children: [\n orderEntrySort,\n {\n type: \"split\",\n orientation: \"vertical\",\n children: [\n mainCol,\n {\n type: \"panel\",\n id: TRADING_PANEL_IDS.HORIZONTAL_MARKETS,\n size: \"fixed\",\n disabled: true,\n },\n ],\n },\n ],\n }\n : {\n type: \"split\",\n orientation: \"horizontal\",\n children: [\n {\n type: \"split\",\n orientation: \"vertical\",\n children: [\n mainCol,\n {\n type: \"panel\",\n id: TRADING_PANEL_IDS.HORIZONTAL_MARKETS,\n size: \"fixed\",\n disabled: true,\n },\n ],\n },\n orderEntrySort,\n ],\n };\n }\n\n // marketLayout === \"left\" or \"hide\"\n if (marketLayout === \"hide\") {\n return layout === \"left\"\n ? {\n type: \"split\",\n orientation: \"horizontal\",\n children: [orderEntrySort, mainCol],\n }\n : {\n type: \"split\",\n orientation: \"horizontal\",\n children: [mainCol, orderEntrySort],\n };\n }\n\n // marketLayout === \"left\"\n return {\n type: \"split\",\n orientation: \"horizontal\",\n children: [\n {\n type: \"panel\",\n id: TRADING_PANEL_IDS.MARKETS,\n size: \"fixed\",\n disabled: true,\n },\n layout === \"left\"\n ? {\n type: \"split\",\n orientation: \"horizontal\",\n children: [orderEntrySort, mainCol],\n }\n : {\n type: \"split\",\n orientation: \"horizontal\",\n children: [mainCol, orderEntrySort],\n },\n ],\n };\n}\n\nfunction buildSMLayoutTree(\n layout: \"left\" | \"right\",\n marketLayout: MarketLayoutPosition,\n): SplitLayoutNode {\n const orderEntrySort: SplitLayoutNode = {\n type: \"sort\",\n orientation: \"vertical\",\n children: [\n { type: \"panel\", id: TRADING_PANEL_IDS.MARGIN },\n { type: \"panel\", id: TRADING_PANEL_IDS.ASSETS },\n { type: \"panel\", id: TRADING_PANEL_IDS.ORDER_ENTRY },\n ],\n };\n\n const tvObSplit: SplitLayoutNode = {\n type: \"split\",\n orientation: \"vertical\",\n children: [\n { type: \"panel\", id: TRADING_PANEL_IDS.TRADING_VIEW },\n { type: \"panel\", id: TRADING_PANEL_IDS.ORDERBOOK },\n ],\n };\n\n const mainCol: SplitLayoutNode = {\n type: \"split\",\n orientation: \"vertical\",\n children: [\n {\n type: \"panel\",\n id: TRADING_PANEL_IDS.SYMBOL_INFO_BAR,\n size: \"fixed\",\n disabled: true,\n },\n tvObSplit,\n { type: \"panel\", id: TRADING_PANEL_IDS.DATA_LIST },\n ],\n };\n\n if (marketLayout === \"top\") {\n return {\n type: \"split\",\n orientation: \"vertical\",\n children: [\n {\n type: \"panel\",\n id: TRADING_PANEL_IDS.HORIZONTAL_MARKETS,\n size: \"fixed\",\n disabled: true,\n },\n {\n type: \"split\",\n orientation: \"vertical\",\n children: [orderEntrySort, mainCol],\n },\n ],\n };\n }\n\n if (marketLayout === \"hide\") {\n return {\n type: \"split\",\n orientation: \"vertical\",\n children: [orderEntrySort, mainCol],\n };\n }\n\n // marketLayout === \"left\" or \"bottom\"\n if (marketLayout === \"bottom\") {\n return {\n type: \"split\",\n orientation: \"vertical\",\n children: [\n mainCol,\n {\n type: \"panel\",\n id: TRADING_PANEL_IDS.HORIZONTAL_MARKETS,\n size: \"fixed\",\n disabled: true,\n },\n ],\n };\n }\n\n // marketLayout === \"left\"\n return {\n type: \"split\",\n orientation: \"vertical\",\n children: [\n {\n type: \"split\",\n orientation: \"horizontal\",\n children: [orderEntrySort, mainCol],\n },\n ],\n };\n}\n\n/**\n * Hook for computing split layout state and sizes\n */\nexport function useSplitLayout(\n options: UseSplitLayoutOptions = {},\n): UseSplitLayoutReturn {\n const {\n initialLayout = \"right\",\n initialMarketLayout = \"left\",\n canTrade = true,\n isFirstTimeDeposit = false,\n } = options;\n\n // Media queries\n const max2XL = useMediaQuery(\"(max-width: 1279px)\");\n const min3XL = useMediaQuery(\"(min-width: 1440px)\");\n const max4XL = useMediaQuery(\"(max-width: 1680px)\");\n\n // Breakpoint\n const breakpoint = useViewportBreakpoint();\n\n // Layout position state (order entry side)\n const [layout, setLayout] = useLocalStorage<\"left\" | \"right\">(\n ORDERLY_ORDER_ENTRY_SIDE_MARKETS_LAYOUT,\n initialLayout,\n );\n\n // Market layout position state\n const [marketLayout, setMarketLayout] = useLocalStorage<MarketLayoutPosition>(\n ORDERLY_HORIZONTAL_MARKETS_LAYOUT,\n initialMarketLayout,\n );\n\n // Markets panel size (small/middle/large)\n const [panelSize, setPanelSize] = useLocalStorage<PanelSize>(\n ORDERLY_SIDE_MARKETS_MODE_KEY,\n \"large\",\n );\n\n // Compute markets width based on panel size\n const marketsWidth = useMemo(() => {\n switch (panelSize) {\n case \"small\":\n return 0;\n case \"middle\":\n return 70;\n case \"large\":\n return 280;\n default:\n return 0;\n }\n }, [panelSize]);\n\n // Horizontal draggable (only on lg+ screens)\n const horizontalDraggable = min3XL;\n\n // Split sizes (persisted)\n const [mainSplitSize, setMainSplitSize] = useLocalStorage(\n ORDERLY_MAIN_SPLIT_SIZE,\n `${ORDER_ENTRY_MIN_WIDTH}px`,\n );\n\n const [orderBookSplitSize, setOrderbookSplitSize] = useLocalStorage(\n ORDERLY_ORDERBOOK_SPLIT_SIZE,\n \"280px\",\n );\n\n const [dataListSplitSize, setDataListSplitSize] = useLocalStorage(\n ORDERLY_DATA_LIST_SPLIT_SIZE,\n `${DATA_LIST_INITIAL_HEIGHT}px`,\n );\n\n const [dataListSplitHeightSM, setDataListSplitHeightSM] = useLocalStorage(\n ORDERLY_DATA_LIST_SPLIT_HEIGHT_SM,\n \"350px\",\n );\n\n const [orderBookSplitHeightSM, setOrderbookSplitHeightSM] = useLocalStorage(\n ORDERLY_ORDERBOOK_SPLIT_HEIGHT_SM,\n \"280px\",\n );\n\n const [extraHeight, setExtraHeight] = useLocalStorage(\n ORDERLY_ORDER_ENTRY_EXTRA_HEIGHT,\n 0,\n );\n\n // Extra height handler\n const onTradingviewAndOrderbookDragging = useCallback(\n (preSize: number, nextSize: number, boxHeight: number) => {\n if (!boxHeight) return;\n\n const splitTradingviewHeight = (boxHeight * preSize) / 100;\n const splitOrderbookHeight = (boxHeight * nextSize) / 100;\n\n const tradingviewHeight = Math.min(\n Math.max(splitTradingviewHeight, TRADINGVIEW_MIN_HEIGHT),\n max2XL ? 1200 : 600,\n );\n\n const orderbookHeight = Math.min(\n Math.max(splitOrderbookHeight, ORDERBOOK_MIN_HEIGHT),\n ORDERBOOK_MAX_HEIGHT,\n );\n\n if (splitOrderbookHeight >= orderbookHeight) {\n const offset = splitOrderbookHeight - orderbookHeight;\n setExtraHeight(Math.max(0, (extraHeight as number) - offset));\n } else if (\n tradingviewHeight + orderbookHeight <\n (max2XL ? 1200 : 600) + ORDERBOOK_MAX_HEIGHT\n ) {\n const height =\n tradingviewHeight + orderbookHeight + SPACE + SYMBOL_INFO_BAR_HEIGHT;\n const offset = Math.max(0, height - 0); // orderEntryHeight would be needed here\n setExtraHeight((extraHeight as number) + offset);\n }\n },\n [max2XL, extraHeight, setExtraHeight],\n );\n\n // Trading view max height\n const tradingviewMaxHeight = max2XL ? 1200 : 600;\n\n // Data list height\n const dataListHeight = canTrade ? 379 : 277;\n\n // Compute markets collapse state\n const memoizedPanelSize = useMemo<PanelSize>(() => {\n const normalized = panelSize === \"large\" ? \"large\" : \"middle\";\n return horizontalDraggable ? normalized : \"middle\";\n }, [horizontalDraggable, panelSize]);\n\n // Build layout tree for backward compat\n const layoutTree = useMemo(\n () => buildLayoutTree(layout, marketLayout, max2XL),\n [layout, marketLayout, max2XL],\n );\n\n return {\n // Layout position\n layout,\n setLayout,\n marketLayout,\n setMarketLayout,\n\n // Breakpoint\n breakpoint,\n max2XL,\n min3XL,\n max4XL,\n horizontalDraggable,\n\n // Markets panel\n panelSize: memoizedPanelSize,\n setPanelSize: (size: PanelSize) => setPanelSize(size),\n marketsWidth,\n\n // Split sizes\n mainSplitSize,\n setMainSplitSize,\n orderBookSplitSize,\n setOrderbookSplitSize,\n dataListSplitSize,\n setDataListSplitSize,\n dataListSplitHeightSM,\n setDataListSplitHeightSM,\n orderBookSplitHeightSM,\n setOrderbookSplitHeightSM,\n\n // Extra height\n extraHeight: extraHeight as number,\n setExtraHeight: setExtraHeight as (height: number) => void,\n\n // Data list\n dataListHeight,\n\n // Trading view\n tradingviewMaxHeight,\n\n // Layout tree (for compat)\n layoutTree,\n\n // Constants\n symbolInfoBarHeight: SYMBOL_INFO_BAR_HEIGHT,\n space: SPACE,\n orderbookMinWidth: ORDERBOOK_MIN_WIDTH,\n orderbookMaxWidth: ORDERBOOK_MAX_WIDTH,\n orderbookMinHeight: ORDERBOOK_MIN_HEIGHT,\n orderbookMaxHeight: ORDERBOOK_MAX_HEIGHT,\n tradingviewMinHeight: TRADINGVIEW_MIN_HEIGHT,\n orderEntryMinWidth: ORDER_ENTRY_MIN_WIDTH,\n orderEntryMaxWidth: ORDER_ENTRY_MAX_WIDTH,\n };\n}\n","/**\n * TradingSortablePanel - Drag-and-drop sortable panel for order-entry column.\n *\n * Ported from packages/trading-next/src/components/desktop/layout/sortablePanel.tsx.\n * Uses @dnd-kit/sortable (already a layout-split dep). Renders a drag-indicator\n * button when showIndicator is true and a placeholder while the item is being dragged.\n */\nimport React, {\n type FC,\n type PropsWithChildren,\n type SVGProps,\n useEffect,\n useRef,\n} from \"react\";\nimport { useSortable } from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { Box, cn } from \"@kodiak-finance/orderly-ui\";\n\nexport type TradingSortablePanelProps = {\n /** Unique DnD id for this panel (matches SortableContext items array). */\n id: string;\n /** Additional class name for the outer box. */\n className?: string;\n /**\n * When true, shows the vertical drag-handle indicator button.\n * Typically set when the user can trade (canTrade && !isFirstTimeDeposit).\n */\n showIndicator: boolean;\n /**\n * When true, renders the drag-overlay variant (slightly scaled down).\n * Pass this when rendering inside DragOverlay.\n */\n dragOverlay?: boolean;\n};\n\n/**\n * Three-dot vertical drag handle icon.\n */\nconst IndicatorIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"10\"\n height=\"16\"\n viewBox=\"0 0 10 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <rect x=\"2\" y=\"2\" width=\"6\" height=\"2\" rx=\"1\" />\n <rect x=\"2\" y=\"7\" width=\"6\" height=\"2\" rx=\"1\" />\n <rect x=\"2\" y=\"12\" width=\"6\" height=\"2\" rx=\"1\" />\n </svg>\n);\n\n/**\n * Sortable panel that wraps order-entry widgets (margin, assets, order form).\n * While actively dragging, renders a fixed-size placeholder with a hatched border\n * so the layout doesn't collapse; the real content is rendered in DragOverlay.\n */\nexport const TradingSortablePanel: FC<\n PropsWithChildren<TradingSortablePanelProps>\n> = (props) => {\n const { showIndicator, dragOverlay } = props;\n const nodeRef = useRef<HTMLDivElement>(null);\n const [dimensions, setDimensions] = React.useState<{\n width: number;\n height: number;\n } | null>(null);\n\n const {\n setNodeRef,\n attributes,\n listeners,\n transform,\n transition,\n isDragging,\n setActivatorNodeRef,\n } = useSortable({ id: props.id });\n\n /** Capture element dimensions when drag starts so the placeholder can match. */\n useEffect(() => {\n if (isDragging && nodeRef.current && !dimensions) {\n const rect = nodeRef.current.getBoundingClientRect();\n setDimensions({ width: rect.width, height: rect.height });\n } else if (!isDragging && dimensions) {\n setDimensions(null);\n }\n }, [isDragging, dimensions]);\n\n /** Combine sortable ref with our measurement ref. */\n const combinedRef = (node: HTMLDivElement | null) => {\n setNodeRef(node);\n (nodeRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n };\n\n /** While dragging render a dashed placeholder that preserves space. */\n if (isDragging && dimensions && !dragOverlay) {\n return (\n <Box\n intensity={900}\n r=\"2xl\"\n p={3}\n className=\"oui-relative\"\n style={{\n ...style,\n width: dimensions.width,\n height: dimensions.height,\n minWidth: dimensions.width,\n minHeight: dimensions.height,\n maxWidth: dimensions.width,\n maxHeight: dimensions.height,\n border: \"1px solid rgb(var(--oui-color-primary))\",\n backgroundImage: `repeating-linear-gradient(135deg, rgb(var(--oui-color-base-6)) 0px, rgb(var(--oui-color-base-6)) 4px, transparent 4px, transparent 8px)`,\n }}\n />\n );\n }\n\n return (\n <Box\n intensity={900}\n r=\"2xl\"\n p={3}\n width=\"100%\"\n className={cn(\"oui-relative\", props.className)}\n ref={combinedRef}\n style={style}\n >\n <div\n className={cn(\n \"inner-content oui-transition-transform\",\n dragOverlay && \"oui-scale-95\",\n )}\n >\n {props.children}\n </div>\n {showIndicator && (\n <button\n {...attributes}\n {...listeners}\n className=\"oui-absolute oui-right-0 oui-top-4 oui-cursor-move oui-py-1\"\n style={{ touchAction: \"none\" }}\n ref={setActivatorNodeRef}\n >\n <IndicatorIcon className=\"oui-text-base-contrast-20 hover:oui-text-base-contrast-80\" />\n </button>\n )}\n </Box>\n );\n};\n","/**\n * TradingSplitLayout - @uiw/react-split wrapper for trading layout.\n *\n * Ported from packages/trading-next/src/components/desktop/layout/splitLayout/.\n * Keeps all layout logic inside layout-split; trading-next only provides panels.\n */\nimport React, {\n forwardRef,\n HTMLAttributes,\n PropsWithChildren,\n useMemo,\n} from \"react\";\nimport Split, { SplitProps } from \"@uiw/react-split\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\n\n// ─── Split line bar ───────────────────────────────────────────────────────────\n\ntype SplitLineBarProps = Pick<SplitProps, \"mode\"> &\n HTMLAttributes<HTMLDivElement>;\n\n/**\n * Styled drag handle for TradingSplitLayout.\n * Transparent by default; primary-light highlight on hover/active/focus.\n */\nconst SplitLineBar: React.FC<SplitLineBarProps> = (props) => {\n const { onMouseDown, mode = \"horizontal\", ...rest } = props;\n\n /** When the split container adds the \"disable\" class, make handle non-interactive. */\n const disable = useMemo(\n () => props.className?.split(\" \").includes(\"disable\"),\n [props.className],\n );\n\n const filteredCls = useMemo(\n () => props.className?.split(\" \").filter((cls) => cls !== \"disable\"),\n [props.className],\n );\n\n return (\n <div\n {...rest}\n className={cn(\n filteredCls,\n \"!oui-transition-none\",\n \"!oui-shadow-none !oui-bg-transparent\",\n \"hover:!oui-bg-primary-light hover:!oui-shadow-[0px_0px_4px_0px] hover:!oui-shadow-primary-light/80\",\n \"active:!oui-bg-primary-light active:!oui-shadow-[0px_0px_4px_0px] active:!oui-shadow-primary-light/80\",\n \"focus:!oui-bg-primary-light focus:!oui-shadow-[0px_0px_4px_0px] focus:!oui-shadow-primary-light/80\",\n mode === \"horizontal\"\n ? \"!oui-w-[2px] !oui-min-w-[2px] !oui-mx-[3px]\"\n : \"!oui-h-[2px] !oui-min-h-[2px] !oui-my-[3px]\",\n disable && \"oui-pointer-events-none\",\n )}\n >\n <div\n onMouseDown={onMouseDown}\n className={cn(\n \"!oui-transition-none\",\n mode === \"horizontal\" ? \"after:!oui-w-[2px]\" : \"after:!oui-h-[2px]\",\n \"after:!oui-bg-transparent after:!oui-shadow-transparent\",\n )}\n />\n </div>\n );\n};\n\n// ─── TradingSplitLayout ───────────────────────────────────────────────────────\n\ntype TradingSplitLayoutProps = PropsWithChildren<SplitProps> & {\n /** Called with the pixel width/height string of the first panel on drag end. */\n onSizeChange?: (size: string) => void;\n};\n\n/**\n * Thin forwardRef wrapper around @uiw/react-split with a styled SplitLineBar.\n * API matches the internal splitLayout used in trading.ui.desktop.tsx.\n */\nexport const TradingSplitLayout = forwardRef<Split, TradingSplitLayoutProps>(\n (props, ref) => {\n const { onSizeChange, ...rest } = props;\n return (\n <Split\n ref={ref}\n {...rest}\n lineBar\n renderBar={(barProps) => (\n <SplitLineBar {...barProps} mode={props.mode} />\n )}\n onDragEnd={(_, width) => onSizeChange?.(`${width}`)}\n />\n );\n },\n);\n\nTradingSplitLayout.displayName = \"TradingSplitLayout\";\n","/**\n * SplitTradingLayout - LayoutStrategy Renderer for the split trading desktop layout.\n *\n * Implements LayoutRendererProps<Record<string, unknown>> so it can be used as\n * the Renderer in splitTradingStrategy. Receives the PanelRegistry from LayoutHost\n * (populated by trading-next's createTradingPanelRegistry) and all layout state\n * comes from useSplitLayout internally.\n *\n * This mirrors the JSX structure of trading.ui.desktop.tsx but all panel content\n * is sourced from the panels registry - no direct widget imports.\n */\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n DragOverlay,\n type DragStartEvent,\n type DragEndEvent,\n type Modifier,\n type ClientRect,\n} from \"@dnd-kit/core\";\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\";\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS, type Transform } from \"@dnd-kit/utilities\";\nimport { useLocalStorage } from \"@kodiak-finance/orderly-hooks\";\nimport type {\n LayoutRendererProps,\n PanelRegistry,\n} from \"@kodiak-finance/orderly-layout-core\";\nimport { TRADING_PANEL_IDS } from \"@kodiak-finance/orderly-layout-core\";\nimport { TradingviewFullscreenKey } from \"@kodiak-finance/orderly-types\";\nimport { Box, cn, Flex } from \"@kodiak-finance/orderly-ui\";\nimport {\n useSplitLayout,\n ORDER_ENTRY_MIN_WIDTH,\n ORDER_ENTRY_MAX_WIDTH,\n ORDERBOOK_MIN_WIDTH,\n ORDERBOOK_MAX_WIDTH,\n ORDERBOOK_MIN_HEIGHT,\n ORDERBOOK_MAX_HEIGHT,\n TRADINGVIEW_MIN_HEIGHT,\n TRADINGVIEW_MIN_WIDTH,\n DATA_LIST_INITIAL_HEIGHT,\n DATA_LIST_MAX_HEIGHT,\n SPACE,\n} from \"../hooks/useSplitLayout\";\nimport { TradingSortablePanel } from \"./TradingSortablePanel\";\nimport { TradingSplitLayout } from \"./TradingSplitLayout\";\n\n// ─── Legacy re-exports (keep for backward compat) ────────────────────────────\n\n/** @deprecated Use PanelRegistry from @kodiak-finance/orderly-layout-core instead. */\nexport type SplitLayoutPanelRegistryEntry = {\n node: React.ReactNode;\n props?: Record<string, unknown>;\n};\n\n/** @deprecated Use PanelRegistry from @kodiak-finance/orderly-layout-core instead. */\nexport type SplitLayoutPanelRegistry = PanelRegistry;\n\n// ─── Layout constants ─────────────────────────────────────────────────────────\n\n/** Scroll-bar width reserve for min-width calculations. */\nconst SCROLLBAR_WIDTH = 6;\nconst TOP_BAR_HEIGHT = 48;\nconst BOTTOM_BAR_HEIGHT = 29;\n\n/** LocalStorage key for sortable order-entry panel ordering. */\nconst ORDER_ENTRY_SORT_KEY = \"orderly_order_entry_sortable_items\";\n\n/** Default sortable items using TRADING_PANEL_IDS (panel registry keys). */\nconst DEFAULT_SORTABLE_ITEMS = [\n TRADING_PANEL_IDS.MARGIN,\n TRADING_PANEL_IDS.ASSETS,\n TRADING_PANEL_IDS.ORDER_ENTRY,\n];\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\n/**\n * SplitTradingLayout implements LayoutRendererProps so it works as the Renderer\n * in splitTradingStrategy. The panels registry is built by trading-next's\n * DesktopLayout and passed through LayoutHost.\n */\nexport type SplitTradingLayoutProps = LayoutRendererProps<\n Record<string, unknown>\n>;\n\n// ─── Drop animation ──────────────────────────────────────────────────────────\n\n/**\n * Scale + shake drop animation for drag overlay.\n * Matches the animation in the original trading DesktopLayout.\n */\nconst dropAnimationConfig = {\n keyframes({\n transform,\n }: {\n transform: { initial: Transform; final: Transform };\n }) {\n return [\n {\n transform: CSS.Transform.toString({\n ...transform.initial,\n scaleX: 1.05,\n scaleY: 1.05,\n }),\n },\n {\n transform: CSS.Transform.toString({\n ...transform.final,\n scaleX: 1,\n scaleY: 1,\n }),\n },\n ];\n },\n sideEffects: ({\n active,\n dragOverlay,\n }: {\n active: { node: HTMLElement };\n dragOverlay: { node: HTMLElement };\n }) => {\n active.node.style.opacity = \"0\";\n const inner = dragOverlay.node.querySelector(\".inner-content\");\n if (inner) inner.classList.add(\"oui-animate-shake\");\n return () => {\n active.node.style.opacity = \"\";\n };\n },\n};\n\n/**\n * DnD modifier: scale the dragged item slightly to indicate it is being dragged.\n */\nconst scaleModifier: Modifier = ({\n transform,\n draggingNodeRect,\n}: {\n transform: Transform;\n draggingNodeRect: ClientRect | null;\n}) => {\n if (draggingNodeRect) {\n return { ...transform, scaleX: 2.05, scaleY: 2.05 };\n }\n return transform;\n};\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\n/**\n * Full trading desktop layout that implements LayoutRendererProps.\n *\n * Receives the PanelRegistry from LayoutHost (populated by trading-next's\n * createTradingPanelRegistry). All layout state is managed by useSplitLayout\n * and local hooks — no dependency on DesktopLayoutProps.\n */\nexport function SplitTradingLayout(\n props: SplitTradingLayoutProps,\n): React.ReactElement {\n const { panels, className } = props;\n\n // ── Layout state from useSplitLayout (split sizes, positions, markets) ────\n const {\n layout,\n marketLayout,\n max2XL,\n max4XL,\n horizontalDraggable,\n panelSize,\n setPanelSize,\n marketsWidth,\n mainSplitSize,\n setMainSplitSize,\n orderBookSplitSize,\n setOrderbookSplitSize,\n dataListSplitSize,\n setDataListSplitSize,\n dataListSplitHeightSM,\n setDataListSplitHeightSM,\n orderBookSplitHeightSM,\n setOrderbookSplitHeightSM,\n tradingviewMaxHeight: tradindviewMaxHeight,\n extraHeight,\n setExtraHeight,\n dataListHeight: dataListMinHeight,\n symbolInfoBarHeight,\n } = useSplitLayout();\n\n /** TradingView fullscreen state — shared via localStorage with ui-tradingview. */\n const [tradingViewFullScreen] = useLocalStorage(\n TradingviewFullscreenKey,\n false,\n );\n\n // ── Markets animation state ───────────────────────────────────────────────\n const [animating, setAnimating] = useState(false);\n const onPanelSizeChange = (size: \"small\" | \"middle\" | \"large\") => {\n setPanelSize(size);\n setAnimating(true);\n };\n\n // ── DnD sortable state for order-entry panels (persisted) ─────────────────\n const [sortableItems, setSortableItems] = useLocalStorage<string[]>(\n ORDER_ENTRY_SORT_KEY,\n DEFAULT_SORTABLE_ITEMS,\n );\n\n // ── Refs for split containers and order entry measurement ─────────────────\n const tradingviewAndOrderbookSplitRef = useRef<any>(null);\n const max2XLSplitRef = useRef<any>(null);\n const orderEntryViewRef = useRef<HTMLDivElement>(null);\n const [orderEntryHeight, setOrderEntryHeight] = useState(0);\n\n /** Observe order entry column height for max2XL min-height constraint. */\n useEffect(() => {\n const el = orderEntryViewRef.current;\n if (!el) return;\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) setOrderEntryHeight(entry.contentRect.height);\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, []);\n\n /** Reset extra height spacer when data list is dragged (avoids stale offset). */\n const onDataListSplitHeightDragging = useCallback(() => {\n setExtraHeight(0);\n }, [setExtraHeight]);\n\n /** No-op dragging handler; extraHeight is managed by useSplitLayout. */\n const onTradingviewAndOrderbookDragging = useCallback(() => {}, []);\n\n const [activeId, setActiveId] = useState<string | null>(null);\n\n /** showPositionIcon: show drag handle when there are sortable panels. Always true for split layout. */\n const showPositionIcon = true;\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n\n /**\n * Track which item is being dragged so DragOverlay can render it.\n */\n function handleDragStart(event: DragStartEvent) {\n setActiveId(event.active.id as string);\n }\n\n /**\n * Reorder sortableItems when an item is dropped onto a new position.\n */\n function handleDragEnd(event: DragEndEvent) {\n const { active, over } = event;\n if (active.id !== over?.id && over) {\n const oldIndex = sortableItems.indexOf(active.id as string);\n const newIndex = sortableItems.indexOf(over.id as string);\n if (oldIndex !== -1 && newIndex !== -1) {\n setSortableItems(arrayMove(sortableItems, oldIndex, newIndex));\n }\n }\n setActiveId(null);\n }\n\n // ── Layout size callbacks ─────────────────────────────────────────────────\n\n const onMainSplitSizeChange = (width: string) =>\n layout === \"left\"\n ? setMainSplitSize(`${100 - Math.min(Number(width), 100)}`)\n : setMainSplitSize(width);\n\n // ── Derived layout values ─────────────────────────────────────────────────\n\n const minScreenHeight = useMemo(() => {\n return tradingViewFullScreen\n ? 0\n : symbolInfoBarHeight +\n ORDERBOOK_MAX_HEIGHT +\n DATA_LIST_INITIAL_HEIGHT +\n SPACE * 4;\n }, [tradingViewFullScreen, symbolInfoBarHeight]);\n\n const minScreenHeightSM =\n TOP_BAR_HEIGHT +\n BOTTOM_BAR_HEIGHT +\n symbolInfoBarHeight +\n TRADINGVIEW_MIN_HEIGHT +\n ORDERBOOK_MIN_HEIGHT +\n dataListMinHeight +\n SPACE * 4;\n\n const containerPaddingX = useMemo(() => (max4XL ? 12 : 8), [max4XL]);\n\n // ── Panel helpers ─────────────────────────────────────────────────────────\n\n /** Retrieve a panel ReactNode from the registry by TRADING_PANEL_IDS key. */\n const getPanel = (id: string): React.ReactNode =>\n panels.get(id)?.node ?? null;\n\n // ── Sub-views (match trading.ui.desktop.tsx naming exactly) ───────────────\n\n const horizontalMarketsView = getPanel(TRADING_PANEL_IDS.HORIZONTAL_MARKETS);\n\n const stickyHorizontalMarketsView = (\n <Box\n className={cn(\n \"oui-trading-markets-container\",\n \"oui-bg-base-10\",\n \"oui-sticky oui-z-30 oui-mb-[-8px] oui-py-2\",\n !max4XL && \"oui-mt-[-8px]\",\n )}\n style={{\n bottom: 0,\n minWidth:\n (max4XL ? 1024 : 1440) - SCROLLBAR_WIDTH - containerPaddingX * 2,\n }}\n >\n {horizontalMarketsView}\n </Box>\n );\n\n const marketsWidget = getPanel(TRADING_PANEL_IDS.MARKETS);\n\n const marketsView = (\n <Box\n intensity={900}\n pt={3}\n r=\"2xl\"\n height=\"100%\"\n width={marketsWidth}\n style={{ minWidth: marketsWidth }}\n className=\"oui-trading-markets-container oui-transition-all oui-duration-150\"\n onTransitionEnd={() => setAnimating(false)}\n >\n {!animating && marketLayout === \"left\" && marketsWidget}\n </Box>\n );\n\n const symbolInfoBarView = (\n <Box\n className=\"oui-trading-symbolInfoBar-container\"\n intensity={900}\n r=\"2xl\"\n px={3}\n width=\"100%\"\n style={{ minHeight: symbolInfoBarHeight, height: symbolInfoBarHeight }}\n >\n {getPanel(TRADING_PANEL_IDS.SYMBOL_INFO_BAR)}\n </Box>\n );\n\n const tradingviewWidget = getPanel(TRADING_PANEL_IDS.TRADING_VIEW);\n\n const tradingView = (\n <Box\n width=\"100%\"\n height=\"100%\"\n intensity={900}\n r=\"2xl\"\n style={{ flex: 1, minWidth: TRADINGVIEW_MIN_WIDTH }}\n className=\"oui-trading-tradingview-container oui-overflow-hidden\"\n >\n {tradingviewWidget}\n </Box>\n );\n\n const orderbookView = (\n <Box\n r=\"2xl\"\n height=\"100%\"\n style={{\n minWidth: ORDERBOOK_MIN_WIDTH,\n maxWidth: horizontalDraggable\n ? ORDERBOOK_MAX_WIDTH\n : ORDERBOOK_MIN_WIDTH,\n width: orderBookSplitSize,\n }}\n className=\"oui-trading-orderBook-container oui-overflow-hidden\"\n >\n {getPanel(TRADING_PANEL_IDS.ORDERBOOK)}\n </Box>\n );\n\n const dataListView = (\n <Box\n intensity={900}\n r=\"2xl\"\n p={2}\n style={{\n height: dataListSplitSize,\n minHeight: DATA_LIST_INITIAL_HEIGHT,\n }}\n className=\"oui-trading-dataList-container oui-overflow-hidden\"\n >\n {getPanel(TRADING_PANEL_IDS.DATA_LIST)}\n </Box>\n );\n\n /**\n * The right-column sortable panels: margin/risk, assets, order entry.\n * Panels are rendered in the order stored in sortableItems.\n */\n const orderEntryView = (\n <Flex\n className=\"oui-trading-orderEntry-container\"\n gapY={2}\n direction=\"column\"\n height=\"100%\"\n style={{\n minWidth: ORDER_ENTRY_MIN_WIDTH,\n maxWidth: horizontalDraggable\n ? ORDER_ENTRY_MAX_WIDTH\n : ORDER_ENTRY_MIN_WIDTH,\n width: mainSplitSize,\n }}\n >\n {sortableItems.map((id: string) => (\n <TradingSortablePanel\n key={id}\n id={id}\n showIndicator={showPositionIcon}\n className={cn(\n id === TRADING_PANEL_IDS.MARGIN && \"oui-trading-riskRate-container\",\n id === TRADING_PANEL_IDS.ASSETS &&\n \"oui-trading-assetsView-container oui-border oui-border-line-12\",\n id === TRADING_PANEL_IDS.ORDER_ENTRY &&\n \"oui-trading-orderEntry-container\",\n // Support legacy short-name keys\n id === \"margin\" && \"oui-trading-riskRate-container\",\n id === \"assets\" &&\n \"oui-trading-assetsView-container oui-border oui-border-line-12\",\n id === \"orderEntry\" && \"oui-trading-orderEntry-container\",\n )}\n >\n {getPanel(id)}\n </TradingSortablePanel>\n ))}\n </Flex>\n );\n\n /**\n * TradingView + orderbook horizontal split.\n * On ≥4xl screens with layout=\"right\", also includes the markets sidebar.\n */\n const renderTradingView = () => {\n if (max4XL && layout === \"right\") {\n return (\n <Flex\n gap={2}\n className=\"oui-flex-1 oui-overflow-hidden\"\n style={{ minWidth: marketsWidth + TRADINGVIEW_MIN_WIDTH + SPACE }}\n >\n {marketLayout === \"left\" && marketsView}\n {tradingView}\n </Flex>\n );\n }\n return tradingView;\n };\n\n const tradingViewAndOrderbookView = (\n <TradingSplitLayout\n style={{ flex: 1, minHeight: ORDERBOOK_MIN_HEIGHT }}\n onSizeChange={setOrderbookSplitSize}\n disable={!horizontalDraggable}\n >\n {renderTradingView()}\n {orderbookView}\n </TradingSplitLayout>\n );\n\n const renderTradingViewAndOrderbookView = () => {\n if (max4XL && layout === \"left\") {\n return (\n <Flex\n gapX={2}\n style={{ minHeight: ORDERBOOK_MIN_HEIGHT }}\n height=\"100%\"\n >\n {tradingViewAndOrderbookView}\n {marketLayout === \"left\" && marketsView}\n </Flex>\n );\n }\n return tradingViewAndOrderbookView;\n };\n\n const mainView = (\n <Flex\n direction=\"column\"\n className=\"oui-flex-1 oui-overflow-hidden\"\n gap={2}\n style={{\n minWidth: max4XL\n ? marketsWidth +\n TRADINGVIEW_MIN_WIDTH +\n ORDERBOOK_MIN_WIDTH +\n SPACE * 2\n : TRADINGVIEW_MIN_WIDTH + ORDERBOOK_MIN_WIDTH + SPACE,\n }}\n >\n {symbolInfoBarView}\n <TradingSplitLayout\n style={{\n maxHeight: `calc(100% - ${symbolInfoBarHeight}px - ${SPACE}px)`,\n }}\n className=\"oui-w-full\"\n mode=\"vertical\"\n onSizeChange={setDataListSplitSize}\n >\n {renderTradingViewAndOrderbookView()}\n {dataListView}\n </TradingSplitLayout>\n </Flex>\n );\n\n // ── Shared DnD overlay content ────────────────────────────────────────────\n\n const dragOverlayContent = activeId ? (\n <TradingSortablePanel\n id={activeId}\n showIndicator={showPositionIcon}\n dragOverlay\n className=\"oui-shadow-lg oui-shadow-base-9\"\n >\n {getPanel(activeId)}\n </TradingSortablePanel>\n ) : null;\n\n // ─────────────────────────────────────────────────────────────────────────\n // ≤1279px (max2XL) — compact vertical layout\n // Matches the max2XL branch in trading.ui.desktop.tsx DesktopLayout\n // ─────────────────────────────────────────────────────────────────────────\n if (max2XL) {\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n modifiers={[restrictToVerticalAxis]}\n >\n <SortableContext\n items={sortableItems}\n strategy={verticalListSortingStrategy}\n >\n <Box height=\"100%\">\n {marketLayout === \"top\" && (\n <Box\n className={cn(\n \"oui-trading-markets-container oui-mt-2 oui-max-h-8 oui-px-3\",\n className,\n )}\n >\n {horizontalMarketsView}\n </Box>\n )}\n\n <TradingSplitLayout\n ref={max2XLSplitRef}\n style={{\n minHeight: minScreenHeightSM,\n minWidth: 1024 - SCROLLBAR_WIDTH,\n }}\n className={cn(\n \"oui-flex oui-flex-1\",\n \"oui-size-full oui-min-w-[1018px]\",\n \"oui-px-3 oui-py-2\",\n className,\n )}\n onSizeChange={setDataListSplitHeightSM}\n onDragging={onDataListSplitHeightDragging}\n mode=\"vertical\"\n >\n {/* Top: symbol bar + TradingView/Orderbook split + order entry */}\n <Flex\n gapX={2}\n itemAlign=\"stretch\"\n className={cn(\n \"oui-flex-1\",\n layout === \"left\" && \"oui-flex-row-reverse\",\n )}\n style={{\n minHeight: Math.max(\n symbolInfoBarHeight +\n TRADINGVIEW_MIN_HEIGHT +\n ORDERBOOK_MIN_HEIGHT +\n SPACE * 2,\n orderEntryHeight,\n ),\n maxHeight:\n symbolInfoBarHeight +\n tradindviewMaxHeight +\n ORDERBOOK_MAX_HEIGHT +\n SPACE * 2,\n }}\n >\n {/* Chart + orderbook column */}\n <Flex\n height=\"100%\"\n className=\"oui-w-[calc(100%_-_280px_-_12px)] oui-flex-1\"\n direction=\"column\"\n gapY={2}\n >\n {symbolInfoBarView}\n <Flex\n width=\"100%\"\n height=\"100%\"\n gapX={2}\n itemAlign=\"stretch\"\n style={{\n minHeight:\n TRADINGVIEW_MIN_HEIGHT + ORDERBOOK_MIN_HEIGHT + SPACE,\n maxHeight:\n tradindviewMaxHeight + ORDERBOOK_MAX_HEIGHT + SPACE,\n }}\n className={cn(\n \"oui-flex-1\",\n layout === \"left\" && \"oui-flex-row-reverse\",\n )}\n >\n {marketLayout === \"left\" && (\n <Box\n intensity={900}\n pt={3}\n r=\"2xl\"\n width={marketsWidth}\n style={{\n minHeight:\n TRADINGVIEW_MIN_HEIGHT +\n ORDERBOOK_MIN_HEIGHT +\n SPACE,\n maxHeight:\n tradindviewMaxHeight + ORDERBOOK_MAX_HEIGHT + SPACE,\n }}\n >\n {marketsWidget}\n </Box>\n )}\n {/* TradingView / orderbook vertical split */}\n <TradingSplitLayout\n ref={tradingviewAndOrderbookSplitRef}\n mode=\"vertical\"\n style={{ width: `calc(100% - ${marketsWidth}px)` }}\n className=\"oui-flex-1\"\n onSizeChange={setOrderbookSplitHeightSM}\n onDragging={onTradingviewAndOrderbookDragging}\n >\n <Box\n width=\"100%\"\n intensity={900}\n r=\"2xl\"\n style={{\n minHeight: TRADINGVIEW_MIN_HEIGHT,\n maxHeight: tradindviewMaxHeight,\n height: 1200,\n }}\n >\n {tradingviewWidget}\n </Box>\n <Box\n r=\"2xl\"\n height=\"100%\"\n width=\"100%\"\n style={{\n minHeight: ORDERBOOK_MIN_HEIGHT,\n maxHeight: ORDERBOOK_MAX_HEIGHT,\n height: orderBookSplitHeightSM,\n }}\n className=\"oui-flex-1\"\n >\n {getPanel(TRADING_PANEL_IDS.ORDERBOOK)}\n </Box>\n </TradingSplitLayout>\n </Flex>\n </Flex>\n\n {/* Order-entry column (margin + assets + order form) */}\n <Flex\n ref={orderEntryViewRef}\n id=\"orderEntryView\"\n gapY={3}\n direction=\"column\"\n className=\"oui-relative\"\n style={{\n width: ORDER_ENTRY_MIN_WIDTH,\n height: \"max-content\",\n }}\n >\n <Flex\n gapY={2}\n direction=\"column\"\n height=\"100%\"\n style={{\n minWidth: ORDER_ENTRY_MIN_WIDTH,\n maxWidth: horizontalDraggable\n ? ORDER_ENTRY_MAX_WIDTH\n : ORDER_ENTRY_MIN_WIDTH,\n width: mainSplitSize,\n }}\n >\n {sortableItems.map((id: string) => (\n <TradingSortablePanel\n key={id}\n id={id}\n showIndicator={showPositionIcon}\n className={cn(\n id === TRADING_PANEL_IDS.MARGIN &&\n \"oui-trading-riskRate-container\",\n id === TRADING_PANEL_IDS.ASSETS &&\n \"oui-trading-assetsView-container oui-border oui-border-line-12\",\n id === TRADING_PANEL_IDS.ORDER_ENTRY &&\n \"oui-trading-orderEntry-container\",\n id === \"margin\" && \"oui-trading-riskRate-container\",\n id === \"assets\" &&\n \"oui-trading-assetsView-container oui-border oui-border-line-12\",\n id === \"orderEntry\" &&\n \"oui-trading-orderEntry-container\",\n )}\n >\n {getPanel(id)}\n </TradingSortablePanel>\n ))}\n </Flex>\n <Box height={extraHeight} />\n </Flex>\n </Flex>\n\n {/* Data list (positions/orders) */}\n <Box\n intensity={900}\n r=\"2xl\"\n p={2}\n style={{\n height: dataListSplitHeightSM,\n minHeight: Math.max(dataListMinHeight, 0),\n maxHeight: DATA_LIST_MAX_HEIGHT,\n }}\n className=\"oui-overflow-hidden\"\n >\n {getPanel(TRADING_PANEL_IDS.DATA_LIST)}\n </Box>\n\n {marketLayout === \"bottom\" && stickyHorizontalMarketsView}\n </TradingSplitLayout>\n </Box>\n </SortableContext>\n <DragOverlay dropAnimation={dropAnimationConfig}>\n {dragOverlayContent}\n </DragOverlay>\n </DndContext>\n );\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // ≥1280px — full desktop layout\n // Matches the non-max2XL branch in trading.ui.desktop.tsx DesktopLayout\n // ─────────────────────────────────────────────────────────────────────────\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n modifiers={[restrictToVerticalAxis]}\n >\n <SortableContext\n items={sortableItems}\n strategy={verticalListSortingStrategy}\n >\n <Flex\n style={{\n minHeight: minScreenHeight,\n minWidth: 1440 - SCROLLBAR_WIDTH,\n }}\n className={cn(\n className,\n \"oui-justify-start\",\n tradingViewFullScreen &&\n \"oui-relative oui-h-[calc(100vh-80px)] oui-w-screen oui-overflow-hidden !oui-p-0\",\n )}\n width=\"100%\"\n p={2}\n gap={2}\n itemAlign=\"stretch\"\n direction=\"column\"\n >\n {/* Horizontal markets bar on top */}\n {marketLayout === \"top\" && horizontalMarketsView}\n\n {/* Main content row */}\n <Flex\n className={cn(\n \"oui-flex-1 oui-overflow-hidden\",\n layout === \"left\" && \"oui-flex-row-reverse\",\n )}\n gap={2}\n >\n {!max4XL && marketLayout === \"left\" && marketsView}\n\n {/* Horizontal split: order-entry | main content */}\n <TradingSplitLayout\n className=\"oui-flex oui-flex-1 oui-overflow-hidden\"\n onSizeChange={onMainSplitSizeChange}\n disable={!horizontalDraggable}\n >\n {layout === \"left\" && orderEntryView}\n {mainView}\n {layout === \"right\" && orderEntryView}\n </TradingSplitLayout>\n </Flex>\n\n {marketLayout === \"bottom\" && stickyHorizontalMarketsView}\n </Flex>\n </SortableContext>\n\n <DragOverlay dropAnimation={dropAnimationConfig}>\n {dragOverlayContent}\n </DragOverlay>\n </DndContext>\n );\n}\n","import type { LayoutStrategy } from \"@kodiak-finance/orderly-layout-core\";\nimport { SplitTradingLayout } from \"./components/SplitTradingLayout\";\n\n/**\n * Split trading layout strategy.\n *\n * Implements the full trading desktop layout (chart, orderbook, order entry,\n * data list, markets) with resizable split panels and drag-to-reorder order\n * entry sub-panels. All state is managed internally by the Renderer.\n *\n * Pass this as `layoutStrategy` to DesktopLayout (via the interceptor in\n * registerLayoutSplitPlugin) so LayoutHost calls SplitTradingLayout as the\n * Renderer with the PanelRegistry built by trading-next.\n */\nexport const splitTradingStrategy: LayoutStrategy<Record<string, unknown>> = {\n id: \"split-trading\",\n displayName: \"Split Trading Layout\",\n /** No layout model needed — state is managed internally by SplitTradingLayout. */\n defaultLayout: () => ({}),\n serialize: () => \"{}\",\n deserialize: () => ({}),\n /** SplitTradingLayout implements LayoutRendererProps<Record<string, unknown>>. */\n Renderer: SplitTradingLayout as LayoutStrategy<\n Record<string, unknown>\n >[\"Renderer\"],\n};\n","/// <reference types=\"@kodiak-finance/orderly-trading-next\" />\nimport React from \"react\";\nimport type { LayoutStrategy } from \"@kodiak-finance/orderly-layout-core\";\nimport type { OrderlySDK } from \"@kodiak-finance/orderly-ui\";\nimport { createInterceptor } from \"@kodiak-finance/orderly-ui\";\nimport { SymbolBarLayoutSwitcher } from \"./components/SymbolBarLayoutSwitcher\";\nimport { splitTradingStrategy } from \"./splitTradingStrategy\";\n\n/** Plugin registration options */\nexport interface LayoutSplitPluginOptions {\n gap?: number;\n classNames?: {\n panelGroup?: string;\n panel?: string;\n handle?: string;\n container?: string;\n };\n}\n\nconst PLUGIN_ID = \"orderly-layout-split\";\nconst PLUGIN_NAME = \"Split Layout\";\nconst PLUGIN_VERSION = \"1.0.0\";\n\n/**\n * Registers the split trading layout plugin.\n *\n * Intercepts `Trading.Layout.Desktop` and injects `layoutStrategy` into the\n * original DesktopLayout component — exactly like GridDesktopInjector.\n * DesktopLayout calls LayoutHost, which calls splitTradingStrategy.Renderer\n * (SplitTradingLayout) with the PanelRegistry built by trading-next.\n */\nexport function registerLayoutSplitPlugin(\n options: LayoutSplitPluginOptions = {},\n): (SDK: OrderlySDK) => void {\n return (SDK: OrderlySDK) => {\n SDK.registerPlugin({\n id: PLUGIN_ID,\n name: PLUGIN_NAME,\n version: PLUGIN_VERSION,\n orderlyVersion: \">=1.0.0\",\n interceptors: [\n createInterceptor(\"Trading.Layout.Desktop\", (Original, props) => (\n <Original\n {...props}\n layoutStrategy={splitTradingStrategy as unknown as LayoutStrategy}\n // State is managed internally by SplitTradingLayout — no model to persist here.\n getInitialLayout={() => ({})}\n disableLayoutPersistence={true}\n />\n )),\n createInterceptor(\n \"Trading.SymbolInfoBar.Desktop\",\n (Original, props) => (\n <Original\n {...props}\n trailing={\n <>\n {props.trailing}\n <SymbolBarLayoutSwitcher />\n </>\n }\n />\n ),\n ),\n ],\n });\n };\n}\n","/**\n * React Context for trading desktop props passed from TradingWidget via SplitTradingDesktopChrome.\n * Any component under SplitTradingDesktopChrome (e.g. SplitNodeRenderer, SortNodeRenderer, panel content)\n * can use useSplitTradingDesktopContext() to access TradingState and layout-related props without prop drilling.\n */\nimport React from \"react\";\nimport type { DesktopLayoutProps } from \"../types\";\n\n/** Context value: full desktop layout props (TradingState + layout injection). Null when outside provider. */\nexport const SplitTradingDesktopContext =\n React.createContext<DesktopLayoutProps | null>(null);\n\n/** Display name for React DevTools. */\nSplitTradingDesktopContext.displayName = \"SplitTradingDesktopContext\";\n\n/**\n * Hook to read trading desktop props from context.\n * Returns null when used outside SplitTradingDesktopChrome (e.g. in tests or non-split layout).\n * @returns DesktopLayoutProps or null\n */\nexport function useSplitTradingDesktopContext(): DesktopLayoutProps | null {\n return React.useContext(SplitTradingDesktopContext);\n}\n","/**\n * Split layout chrome: DnD for order-entry sortable, Flex wrapper.\n * Wraps the minimal desktop layout (Trading’s DesktopLayout); strategy is injected by the plugin.\n */\nimport React, { useMemo, useState } from \"react\";\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n DragOverlay,\n DragStartEvent,\n DragEndEvent,\n} from \"@dnd-kit/core\";\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\";\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS, Transform } from \"@dnd-kit/utilities\";\nimport { Box, cn, Flex } from \"@kodiak-finance/orderly-ui\";\nimport type { DesktopLayoutProps } from \"../types\";\nimport { SplitTradingDesktopContext } from \"./SplitTradingDesktopContext\";\n\nexport interface SplitTradingDesktopChromeProps extends DesktopLayoutProps {\n /** The minimal desktop layout (panels + LayoutHost) to wrap */\n children: React.ReactNode;\n}\n\n/**\n * Drop animation for drag overlay (scale + shake)\n */\nfunction useDropAnimationConfig() {\n return useMemo(\n () => ({\n keyframes({\n transform,\n }: {\n transform: { initial: Transform; final: Transform };\n }) {\n return [\n {\n transform: CSS.Transform.toString({\n ...transform.initial,\n scaleX: 1.05,\n scaleY: 1.05,\n }),\n },\n {\n transform: CSS.Transform.toString({\n ...transform.final,\n scaleX: 1,\n scaleY: 1,\n }),\n },\n ];\n },\n sideEffects: ({\n active,\n dragOverlay,\n }: {\n active: { node: HTMLElement };\n dragOverlay: { node: HTMLElement };\n }) => {\n active.node.style.opacity = \"0\";\n const inner = dragOverlay.node.querySelector(\".inner-content\");\n if (inner) inner.classList.add(\"oui-animate-shake\");\n return () => {\n active.node.style.opacity = \"\";\n };\n },\n }),\n [],\n );\n}\n\n/**\n * Wraps Trading’s minimal desktop layout with split-specific chrome:\n * DnD (order-entry sortable), Flex structure. Markets rendered by LayoutHost from rule tree.\n */\nexport function SplitTradingDesktopChrome(\n props: SplitTradingDesktopChromeProps,\n): React.ReactElement {\n // max2XL: trading script breakpoint (max-width 1279px); split chrome used to read isSM from a local stub.\n const {\n children,\n max2XL,\n tradingViewFullScreen,\n sortableItems,\n setSortableItems,\n className,\n } = props;\n\n const [activeId, setActiveId] = useState<string | null>(null);\n\n const dropAnimationConfig = useDropAnimationConfig();\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n\n const handleDragStart = (event: DragStartEvent) => {\n setActiveId(event.active.id as string);\n };\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (active.id !== over?.id && over) {\n const oldIndex = sortableItems?.indexOf(active.id as string) ?? -1;\n const newIndex = sortableItems?.indexOf(over.id as string) ?? -1;\n if (oldIndex !== -1 && newIndex !== -1) {\n setSortableItems?.(\n arrayMove(sortableItems ?? [], oldIndex, newIndex) as string[],\n );\n }\n }\n setActiveId(null);\n };\n\n // const minScreenHeight = useMemo(\n // () =>\n // tradingViewFullScreen\n // ? 0\n // : orderbookMaxHeight + dataListInitialHeight + space * 4 + 56,\n // [tradingViewFullScreen],\n // );\n\n return (\n <SplitTradingDesktopContext.Provider value={props}>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n modifiers={[restrictToVerticalAxis]}\n >\n <SortableContext\n items={sortableItems ?? []}\n strategy={verticalListSortingStrategy}\n >\n {max2XL ? (\n <Box height=\"100%\" className={className}>\n {children}\n </Box>\n ) : (\n <Flex\n style={\n {\n // minHeight: minScreenHeight,\n // minWidth: 1440 - scrollBarWidth,\n }\n }\n className={cn(\n className,\n \"oui-flex-1 oui-justify-start oui-overflow-hidden\",\n tradingViewFullScreen &&\n \"oui-relative oui-h-[calc(100vh-80px)] oui-w-screen oui-overflow-hidden !oui-p-0\",\n )}\n width=\"100%\"\n p={2}\n gap={2}\n itemAlign=\"stretch\"\n direction=\"column\"\n >\n {children}\n </Flex>\n )}\n </SortableContext>\n <DragOverlay dropAnimation={dropAnimationConfig}>\n {/* DragOverlay children must be ReactNode (not a render prop in @dnd-kit/core v6). */}\n {activeId ? (\n <div className=\"oui-pointer-events-none oui-opacity-80\">\n id: {activeId}\n </div>\n ) : null}\n {/* <OrderEntryDragOverlayContent\n activeId={activeId}\n showPositionIcon={props.showPositionIcon}\n symbol={props.symbol}\n disableFeatures={props.disableFeatures}\n navigateToPortfolio={props.navigateToPortfolio}\n isFirstTimeDeposit={props.isFirstTimeDeposit}\n /> */}\n </DragOverlay>\n </DndContext>\n </SplitTradingDesktopContext.Provider>\n );\n}\n","/**\n * Context for split layout configuration.\n * Provides showIndicator for sort indicator visibility and classNames.\n * Note: The preset system has been deprecated in favor of fixed layout approach.\n */\nimport React, { createContext, useContext } from \"react\";\nimport type { SplitLayoutClassNames } from \"./types\";\n\nexport interface SplitPresetContextValue {\n /** Optional classNames for panel group, panel, and handle (from plugin options). */\n classNames?: SplitLayoutClassNames;\n /** Optional gap between panels in px (similar to Tailwind gap-*; applied to handle margin). */\n gap?: number;\n /** When true, show drag handle on sortable panels; when false, hide it. */\n showIndicator?: boolean;\n}\n\nconst SplitPresetContext = createContext<SplitPresetContextValue | null>(null);\n\nexport interface SplitPresetProviderProps {\n /** Optional classNames for panel group, panel, and handle (from plugin options). */\n classNames?: SplitLayoutClassNames;\n /** Optional gap between panels in px (similar to Tailwind gap-*). */\n gap?: number;\n /** Optional showIndicator for sort indicator visibility. */\n showIndicator?: boolean;\n children: React.ReactNode;\n}\n\n/**\n * Provides basic split layout configuration.\n * Note: The preset system has been deprecated.\n */\nexport function SplitPresetProvider({\n classNames,\n gap,\n showIndicator,\n children,\n}: SplitPresetProviderProps): React.ReactElement {\n const value: SplitPresetContextValue = {\n classNames: classNames ?? undefined,\n gap: gap ?? undefined,\n showIndicator,\n };\n\n return (\n <SplitPresetContext.Provider value={value}>\n {children}\n </SplitPresetContext.Provider>\n );\n}\n\nexport function useSplitPresetContext(): SplitPresetContextValue | null {\n return useContext(SplitPresetContext);\n}\n","import React, { useMemo, type FC, type SVGProps } from \"react\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport { Flex, Text } from \"@kodiak-finance/orderly-ui\";\n\nexport const ExpandIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M6.326 8.826a.84.84 0 0 0-.6.234L2.16 12.627v-2.135H.492v4.167c0 .46.373.833.834.833h4.166v-1.667H3.357l3.567-3.567a.857.857 0 0 0 0-1.198.84.84 0 0 0-.598-.234M10.502.492V2.16h2.135L9.07 5.726a.857.857 0 0 0 0 1.199.86.86 0 0 0 1.197 0l3.568-3.568v2.135h1.667V1.326a.834.834 0 0 0-.834-.834z\" />\n </svg>\n);\n\nexport const CollapseIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M14.668.492a.85.85 0 0 0-.599.234l-3.567 3.568V2.159H8.835v4.167c0 .46.373.833.833.833h4.167V5.492H11.7l3.569-3.567a.86.86 0 0 0 0-1.199.85.85 0 0 0-.6-.234m-12.5 8.334v1.666h2.135L.736 14.06a.86.86 0 0 0 0 1.198.86.86 0 0 0 1.198 0l3.568-3.567v2.134h1.666V9.66a.834.834 0 0 0-.833-.833z\" />\n </svg>\n);\n\nexport interface CollapsiblePanelProps {\n /** Panel title */\n title?: React.ReactNode;\n /** Whether the panel can be collapsed */\n collapsible?: boolean;\n /** Current collapsed state */\n collapsed?: boolean;\n /** Callback to toggle collapse state */\n onToggle?: () => void;\n /** Minimum size (used when collapsed) */\n minSize?: string;\n /** Maximum size (used when expanded) */\n maxSize?: string;\n /** Panel content */\n children?: React.ReactNode;\n /** Additional className for wrapper */\n className?: string;\n /** Additional style for wrapper */\n style?: React.CSSProperties;\n}\n\n/**\n * A collapsible panel component with title and collapse/expand functionality.\n */\nexport const CollapsiblePanel: React.FC<CollapsiblePanelProps> = ({\n title,\n collapsible,\n collapsed,\n onToggle,\n minSize,\n maxSize,\n children,\n className,\n style,\n}) => {\n // Calculate width based on collapsed state\n const computedStyle = Object.assign(\n {},\n style,\n typeof collapsible !== \"undefined\"\n ? collapsed\n ? { width: minSize }\n : { width: maxSize }\n : {},\n );\n\n const bodyClassName = useMemo(() => {\n return typeof !!title ? \"oui-h-[calc(100%_-_40px)]\" : \"oui-h-full\";\n }, [title]);\n\n const renderCollapsibleHeader = () => {\n // if (typeof collapsible !== \"undefined\" && !collapsible) return null;\n\n return (\n <Flex\n className={cn(\n \"oui-text-base-contrast-36\",\n // collapsed ? \"oui-absolute oui-end-[-20px] oui-z-50\" : \"oui-relative\",\n )}\n justify={collapsed ? \"center\" : \"between\"}\n width=\"100%\"\n px={3}\n pt={3}\n >\n {!collapsed && title && (\n <Text size=\"base\" intensity={80}>\n {title}\n </Text>\n )}\n <button\n onClick={onToggle}\n className={cn(\"oui-cursor-pointer hover:oui-text-base-contrast-80\")}\n >\n {collapsed ? (\n <ExpandIcon className=\"oui-text-base-contrast-36\" />\n ) : (\n <CollapseIcon className=\"oui-text-base-contrast-36\" />\n )}\n </button>\n </Flex>\n );\n };\n\n return (\n <div\n className={cn(\n \"oui-flex oui-flex-col oui-gap-y-5 oui-overflow-hidden oui-rounded-2xl oui-bg-base-9 oui-w-full oui-h-full\",\n className,\n )}\n style={computedStyle}\n >\n {renderCollapsibleHeader()}\n\n <div className={cn(\"oui-collapsible-content\", bodyClassName)}>\n {React.cloneElement(children as React.ReactElement, {\n collapsed,\n // panelSize: \"small\",\n })}\n </div>\n </div>\n );\n};\n","import React, { useCallback } from \"react\";\nimport { RestrictToVerticalAxis } from \"@dnd-kit/abstract/modifiers\";\nimport { DragDropProvider } from \"@dnd-kit/react\";\nimport { useSortable, isSortable } from \"@dnd-kit/react/sortable\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport { useSplitLayoutConfig } from \"../SplitLayoutConfigContext\";\nimport { useSplitPresetContext } from \"../SplitPresetContext\";\nimport type { SplitLayoutNode } from \"../types\";\nimport {\n getSortableIdForChild,\n updateOrderAtPath,\n} from \"../utils/splitLayoutUtils\";\nimport { SplitNodeRenderer } from \"./SplitNodeRenderer\";\n\nconst DEFAULT_SHOW_INDICATOR = true;\n\n/**\n * Drag handle icon used for sortable panels.\n */\nfunction IndicatorIcon(\n props: React.SVGProps<SVGSVGElement>,\n): React.ReactElement {\n return (\n <svg\n width=\"10\"\n height=\"16\"\n viewBox=\"0 0 10 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <rect x=\"2\" y=\"2\" width=\"6\" height=\"2\" rx=\"1\" />\n <rect x=\"2\" y=\"7\" width=\"6\" height=\"2\" rx=\"1\" />\n <rect x=\"2\" y=\"12\" width=\"6\" height=\"2\" rx=\"1\" />\n </svg>\n );\n}\n\ninterface SortableSortChildProps {\n id: string;\n child: SplitLayoutNode;\n path: number[];\n rootNode: SplitLayoutNode;\n showIndicator: boolean;\n index: number;\n}\n\n/**\n * Wraps a split layout child in a sortable wrapper using the new dnd-kit React API.\n */\nfunction SortableSortChild({\n id,\n child,\n showIndicator,\n path,\n rootNode,\n index,\n}: SortableSortChildProps): React.ReactElement {\n const { ref, handleRef, isDragging } = useSortable({\n id,\n index,\n });\n\n const showHandle = showIndicator && child.type === \"panel\";\n\n return (\n <div\n ref={ref}\n className={cn(\"oui-relative\", isDragging && \"oui-opacity-50\")}\n >\n {showHandle && (\n <button\n className=\"oui-absolute oui-right-0 oui-top-4 oui-cursor-move oui-py-1\"\n style={{ touchAction: \"none\" }}\n // Connect drag handle explicitly so dragging from the handle starts the sortable interaction.\n ref={handleRef}\n >\n <IndicatorIcon\n className={cn(\n \"oui-text-base-contrast-20 hover:oui-text-base-contrast-80\",\n )}\n />\n </button>\n )}\n <SplitNodeRenderer node={child} path={path} rootNode={rootNode} />\n </div>\n );\n}\n\n/** Props for sort container renderer (node is narrowed to sort type). */\nexport interface SortNodeRendererProps {\n node: Extract<SplitLayoutNode, { type: \"sort\" }>;\n path: number[];\n rootNode: SplitLayoutNode;\n classNames?: {\n panel?: string;\n };\n}\n\n/**\n * Renders a sort container using the latest dnd-kit React API.\n */\nexport function SortNodeRenderer({\n node,\n path,\n rootNode,\n classNames,\n}: SortNodeRendererProps): React.ReactElement {\n const { onLayoutChange, layout, breakpoint } = useSplitLayoutConfig();\n const { orientation, children } = node;\n const ctx = useSplitPresetContext();\n const showIndicator = ctx?.showIndicator ?? DEFAULT_SHOW_INDICATOR;\n const items = children.map((child: SplitLayoutNode, index: number) =>\n getSortableIdForChild(child, path, index),\n );\n const isVertical = orientation === \"vertical\";\n\n const handleDragEnd = useCallback(\n (event: unknown) => {\n const anyEvent = event as {\n operation?: { source: unknown };\n canceled?: boolean;\n };\n\n if (!anyEvent.operation || anyEvent.canceled) return;\n\n const { source } = anyEvent.operation as {\n source: unknown;\n };\n\n if (!isSortable(source)) return;\n\n const { initialIndex, index } = source;\n if (initialIndex === index) return;\n\n const newOrder = [...(children as SplitLayoutNode[])];\n const [removed] = newOrder.splice(initialIndex, 1);\n newOrder.splice(index, 0, removed);\n\n const updatedRoot = updateOrderAtPath(rootNode, path, newOrder);\n\n onLayoutChange({\n ...layout,\n layouts: {\n ...layout.layouts,\n [breakpoint]: updatedRoot,\n },\n });\n },\n [children, path, rootNode, breakpoint, layout, onLayoutChange],\n );\n\n return (\n <div>\n <DragDropProvider\n onDragEnd={handleDragEnd}\n modifiers={(defaults) => [...defaults, RestrictToVerticalAxis]}\n >\n <div\n className={cn(\n isVertical\n ? \"oui-flex oui-w-full oui-flex-col oui-gap-2\"\n : \"oui-flex oui-w-full oui-flex-row oui-gap-2\",\n node.className,\n classNames?.panel,\n )}\n style={node.style}\n >\n {children.map((child: SplitLayoutNode, index: number) => (\n <SortableSortChild\n key={items[index]}\n id={items[index]}\n child={child}\n showIndicator={showIndicator}\n path={[...path, index]}\n rootNode={rootNode}\n index={index}\n />\n ))}\n </div>\n </DragDropProvider>\n </div>\n );\n}\n","import React from \"react\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport { useSplitLayoutConfig } from \"../SplitLayoutConfigContext\";\nimport type { SplitLayoutNode } from \"../types\";\nimport { CollapsiblePanel } from \"./CollapsiblePanel\";\nimport { SortNodeRenderer } from \"./SortNodeRenderer\";\nimport { SplitLayout } from \"./SplitLayout\";\n\n/** Shared props for recursively rendering a split layout node tree. */\nexport interface SplitNodeRendererProps {\n node: SplitLayoutNode;\n path: number[];\n rootNode: SplitLayoutNode;\n}\n\nexport function SplitNodeRenderer({\n node,\n path,\n rootNode,\n}: SplitNodeRendererProps): React.ReactElement | null {\n const {\n panels,\n onSizeChange,\n onSizePersist,\n classNames,\n gap,\n isPanelCollapsed,\n togglePanelCollapse,\n isPanelCollapsible,\n } = useSplitLayoutConfig();\n\n if (node.type === \"panel\") {\n const panelWrapper = panels.get(node.id);\n const panel = panelWrapper?.node;\n if (!panel) {\n /** Placeholder when panel not in registry (empty or unknown id). */\n return (\n <div\n className={cn(\n \"oui-text-base-contrast-40 oui-rounded-2xl oui-bg-base-9 oui-p-3 oui-text-xs\",\n node.size !== \"fixed\" && \"oui-size-full\",\n classNames?.panel,\n node.className,\n )}\n style={node.style}\n data-panel-id={node.id}\n >\n {node.id ? `Panel not found: ${node.id}` : \"Panel not found\"}\n </div>\n );\n }\n const title =\n node.title ?? (panelWrapper?.props?.title as string | undefined);\n\n // Use CollapsiblePanel only when collapsible is explicitly set\n if (typeof node.collapsible !== \"undefined\") {\n return (\n <CollapsiblePanel\n title={title}\n collapsible={node.collapsible || isPanelCollapsible(node.id)}\n collapsed={isPanelCollapsed(node.id)}\n onToggle={() => togglePanelCollapse(node.id)}\n minSize={node.minSize}\n maxSize={node.maxSize}\n className={cn(\n node.size !== \"fixed\" && \"oui-size-full\",\n classNames?.panel,\n node.className,\n )}\n style={node.style}\n data-panel-id={node.id}\n >\n {panel}\n </CollapsiblePanel>\n );\n }\n\n // Non-collapsible panel: render as regular div\n return (\n <div\n className={cn(\n \"oui-overflow-hidden oui-rounded-2xl oui-bg-base-9\",\n node.size !== \"fixed\" && \"oui-size-full\",\n classNames?.panel,\n node.className,\n )}\n style={node.style}\n data-panel-id={node.id}\n >\n {panel}\n </div>\n );\n }\n\n if (node.type === \"sort\") {\n return (\n <SortNodeRenderer\n node={node as Extract<SplitLayoutNode, { type: \"sort\" }>}\n path={path}\n rootNode={rootNode}\n classNames={classNames}\n />\n );\n }\n\n // type === \"split\"\n const { orientation, children } = node;\n const sizes = children.map((child) => child.size ?? \"auto\");\n const panelConstraints = children.map((child) => ({\n // Nested split/sort nodes need minSize to prevent collapse (lib default 0% causes inner area to collapse)\n minSize:\n child.minSize ??\n (child.type === \"split\" || child.type === \"sort\" ? \"10%\" : undefined),\n maxSize: child.maxSize,\n disabled: child.disabled,\n }));\n\n return (\n <SplitLayout\n orientation={orientation}\n sizes={sizes}\n panelConstraints={panelConstraints}\n onSizeChange={(sizesAsStrings) => {\n onSizeChange(path, sizesAsStrings);\n onSizePersist?.(path, sizesAsStrings);\n }}\n classNames={classNames}\n gap={gap}\n className={node.className}\n style={node.style}\n >\n {children.map((child, index) => (\n <SplitNodeRenderer\n key={`child-${index}`}\n node={child}\n path={[...path, index]}\n rootNode={rootNode}\n />\n ))}\n </SplitLayout>\n );\n}\n","import type { SplitLayoutNode } from \"../types\";\n\n/**\n * Returns the split/sort node at the given path (used to read current state for change detection).\n *\n * @param node - Root node of the layout tree\n * @param path - Index path to the target node\n */\nexport function getNodeAtPath(\n node: SplitLayoutNode,\n path: number[],\n): SplitLayoutNode | null {\n if (path.length === 0) return node;\n if (node.type === \"panel\") return null;\n const [childIndex, ...restPath] = path;\n if (childIndex >= node.children.length) return null;\n return getNodeAtPath(node.children[childIndex], restPath);\n}\n\n/**\n * Derives sizes array from split children (size per child).\n *\n * @param children - Split children nodes\n * @returns Array of size strings, defaulting to \"auto\" when missing\n */\nexport function getSizesFromChildren(children: SplitLayoutNode[]): string[] {\n return children.map((child) => child.size ?? \"auto\");\n}\n\n/**\n * Returns true if two size arrays are effectively equal (same rounded percentages).\n * Avoids propagating onLayoutChanged when react-resizable-panels reports the same layout on mount.\n *\n * @param current - Current sizes (from tree)\n * @param next - Next sizes (from resize callback)\n */\nexport function sizesAreEqual(\n current: string[] | undefined,\n next: string[],\n): boolean {\n if (!current || current.length !== next.length) return false;\n const toNum = (value: string) =>\n Math.round(parseFloat(String(value).replace(/%/g, \"\")) || 0);\n return current.every((c, index) => toNum(c) === toNum(next[index]));\n}\n\n/**\n * Deep clone and update defaultCollapsed for a panel across the entire tree.\n * Updates ALL nodes with matching panelId (used when updating all breakpoints).\n */\nexport function updateDefaultCollapsedAtPath(\n node: SplitLayoutNode,\n panelId: string,\n defaultCollapsed: boolean,\n): SplitLayoutNode {\n if (node.type === \"panel\" && node.id === panelId) {\n return { ...node, defaultCollapsed };\n }\n\n if (node.type === \"split\" || node.type === \"sort\") {\n return {\n ...node,\n children: node.children.map((child) =>\n updateDefaultCollapsedAtPath(child, panelId, defaultCollapsed),\n ),\n };\n }\n\n return node;\n}\n\n/**\n * Deep clone and update sizes at a specific path in the split tree.\n * When path targets a split, updates each child's size from the new sizes array.\n *\n * @param node - The root node\n * @param path - Array of indices representing the path to the target split\n * @param newSizes - Full sizes array from onSizeChange (updates children[].size)\n * @returns Updated node (immutable update)\n */\nexport function updateSizeAtPath(\n node: SplitLayoutNode,\n path: number[],\n newSizes: string[],\n): SplitLayoutNode {\n if (node.type === \"panel\") {\n const size = newSizes[0];\n return size !== undefined ? { ...node, size } : node;\n }\n\n // Sort nodes don't have resizable children; recurse only if path continues.\n if (node.type === \"sort\") {\n if (path.length === 0) return node;\n const [childIndex, ...restPath] = path;\n const updatedChildren = [...node.children];\n if (childIndex < updatedChildren.length) {\n updatedChildren[childIndex] = updateSizeAtPath(\n updatedChildren[childIndex],\n restPath,\n newSizes,\n );\n }\n return { ...node, children: updatedChildren };\n }\n\n const updatedNode: SplitLayoutNode = {\n ...node,\n children: [...node.children],\n };\n\n if (path.length === 0) {\n updatedNode.children = node.children.map((child, index) => ({\n ...child,\n size: newSizes[index] ?? child.size ?? \"auto\",\n }));\n return updatedNode;\n }\n\n const [childIndex, ...restPath] = path;\n if (childIndex < updatedNode.children.length) {\n updatedNode.children[childIndex] = updateSizeAtPath(\n updatedNode.children[childIndex],\n restPath,\n newSizes,\n );\n }\n\n return updatedNode;\n}\n","import React, { useRef, useCallback, useMemo } from \"react\";\nimport type { LayoutRendererProps } from \"@kodiak-finance/orderly-layout-core\";\nimport { SplitLayoutConfigProvider } from \"./SplitLayoutConfigContext\";\nimport { useSplitPresetContext } from \"./SplitPresetContext\";\nimport { SplitNodeRenderer } from \"./components/SplitNodeRenderer\";\nimport { BREAKPOINT_KEYS } from \"./constants\";\nimport { useViewportBreakpoint } from \"./hooks/useViewportBreakpoint\";\nimport type { SplitLayoutModel, SplitLayoutNode } from \"./types\";\nimport {\n getNodeAtPath,\n getSizesFromChildren,\n sizesAreEqual,\n updateSizeAtPath,\n updateDefaultCollapsedAtPath,\n} from \"./utils/splitRendererUtils\";\n\n/**\n * Recursively collect panel IDs that are collapsible.\n */\nfunction getCollapsiblePanels(node: SplitLayoutNode): Map<string, boolean> {\n const collapsible = new Map<string, boolean>();\n\n const traverse = (n: SplitLayoutNode) => {\n if (n.type === \"panel\" && n.id) {\n collapsible.set(n.id, n.collapsible ?? false);\n }\n if (n.type === \"split\" || n.type === \"sort\") {\n for (const child of n.children ?? []) {\n traverse(child);\n }\n }\n };\n\n traverse(node);\n return collapsible;\n}\n\n/**\n * Creates an updated layout with new sizes at the given path.\n */\nfunction createUpdatedLayout(\n rootNode: SplitLayoutNode,\n layout: SplitLayoutModel,\n breakpoint: string,\n path: number[],\n sizes: string[],\n): SplitLayoutModel {\n const updatedRoot = updateSizeAtPath(rootNode, path, sizes);\n return {\n ...layout,\n layouts: {\n ...layout.layouts,\n [breakpoint]: updatedRoot,\n },\n };\n}\n\n/**\n * Split layout renderer: picks root by current breakpoint (from viewport width),\n * renders that tree, and on size change updates only the current breakpoint's root.\n */\nexport function SplitRenderer(\n props: LayoutRendererProps<SplitLayoutModel>,\n): React.ReactElement {\n const { layout, panels, onLayoutChange, onLayoutPersist, className, style } =\n props;\n\n const ctx = useSplitPresetContext();\n const containerRef = useRef<HTMLDivElement>(null);\n const presetName = ctx?.presets?.find(\n (p) => p.id === ctx?.selectedPresetId,\n )?.name;\n const breakpoint = useViewportBreakpoint({\n fallbackWidth: typeof window !== \"undefined\" ? window.innerWidth : 1440,\n });\n\n const rootNode = layout.layouts[breakpoint];\n\n const computeUpdatedLayout = useCallback(\n (path: number[], sizes: string[]) => {\n const nodeAtPath = getNodeAtPath(rootNode, path);\n const currentSizes =\n nodeAtPath?.type === \"split\"\n ? getSizesFromChildren(nodeAtPath.children)\n : undefined;\n if (sizesAreEqual(currentSizes, sizes)) {\n return null;\n }\n return createUpdatedLayout(rootNode, layout, breakpoint, path, sizes);\n },\n [layout, breakpoint, rootNode],\n );\n\n const handleSizeChange = useCallback(\n (path: number[], sizes: string[]) => {\n const updatedLayout = computeUpdatedLayout(path, sizes);\n if (updatedLayout) {\n onLayoutChange(updatedLayout);\n }\n },\n [computeUpdatedLayout, onLayoutChange],\n );\n\n const handleSizePersist = useCallback(\n (path: number[], sizes: string[]) => {\n if (!onLayoutPersist) return;\n const updatedLayout = computeUpdatedLayout(path, sizes);\n if (updatedLayout) {\n onLayoutPersist(updatedLayout);\n }\n },\n [computeUpdatedLayout, onLayoutPersist],\n );\n\n const collapsiblePanels = useMemo(\n () => getCollapsiblePanels(rootNode),\n [rootNode],\n );\n\n const collapsedPanels = useMemo(() => {\n const collapsed = new Set<string>();\n const traverse = (node: SplitLayoutNode) => {\n if (node.type === \"panel\" && node.id && node.defaultCollapsed) {\n collapsed.add(node.id);\n }\n if (node.type === \"split\" || node.type === \"sort\") {\n node.children?.forEach(traverse);\n }\n };\n traverse(rootNode);\n return collapsed;\n }, [rootNode]);\n\n const computeUpdatedLayoutForCollapse = useCallback(\n (panelId: string, collapsed: boolean) => {\n const updatedLayouts: SplitLayoutModel[\"layouts\"] = {} as any;\n for (const bp of BREAKPOINT_KEYS) {\n if (layout.layouts[bp]) {\n updatedLayouts[bp] = updateDefaultCollapsedAtPath(\n layout.layouts[bp],\n panelId,\n collapsed,\n );\n }\n }\n return { ...layout, layouts: updatedLayouts };\n },\n [layout],\n );\n\n const isPanelCollapsible = useCallback(\n (panelId: string) => collapsiblePanels.get(panelId) ?? false,\n [collapsiblePanels],\n );\n\n const togglePanelCollapse = useCallback(\n (panelId: string) => {\n const isCurrentlyCollapsed = collapsedPanels.has(panelId);\n const updatedLayout = computeUpdatedLayoutForCollapse(\n panelId,\n !isCurrentlyCollapsed,\n );\n onLayoutChange(updatedLayout);\n onLayoutPersist?.(updatedLayout);\n },\n [\n collapsedPanels,\n computeUpdatedLayoutForCollapse,\n onLayoutChange,\n onLayoutPersist,\n ],\n );\n\n const isPanelCollapsed = useCallback(\n (panelId: string) => collapsedPanels.has(panelId),\n [collapsedPanels],\n );\n\n if (panels.size === 0) {\n return (\n <div ref={containerRef} className={className} style={style}>\n {/* Empty state - no panels registered */}\n </div>\n );\n }\n\n return (\n <div ref={containerRef} className={className}>\n <SplitLayoutConfigProvider\n panels={panels}\n layout={layout}\n breakpoint={breakpoint}\n onLayoutChange={onLayoutChange}\n onSizeChange={handleSizeChange}\n onSizePersist={handleSizePersist}\n classNames={ctx?.classNames}\n gap={ctx?.gap}\n collapsedPanels={collapsedPanels}\n togglePanelCollapse={togglePanelCollapse}\n isPanelCollapsed={isPanelCollapsed}\n collapsiblePanels={collapsiblePanels}\n isPanelCollapsible={isPanelCollapsible}\n >\n <SplitNodeRenderer node={rootNode} path={[]} rootNode={rootNode} />\n </SplitLayoutConfigProvider>\n <div\n className=\"oui-fixed oui-right-2 oui-bottom-5 oui-text-lg oui-text-trade-loss oui-flex oui-flex-col oui-items-end\"\n style={{ zIndex: 1000 }}\n >\n <span>{breakpoint}</span>\n {presetName && <span className=\"oui-text-sm\">{presetName}</span>}\n <button\n onClick={() => ctx?.reset()}\n className=\"oui-mt-1 oui-px-2 oui-py-1 oui-text-sm oui-bg-gray-500 oui-text-white oui-rounded\"\n >\n Reset\n </button>\n </div>\n </div>\n );\n}\n","import type { LayoutStrategy } from \"@kodiak-finance/orderly-layout-core\";\nimport { SplitRenderer } from \"./SplitRenderer\";\nimport type { SplitLayoutModel, SplitLayoutNode } from \"./types\";\nimport {\n createDefaultSplitLayout,\n serializeSplitLayout,\n deserializeSplitLayout,\n} from \"./utils/splitLayoutUtils\";\n\n/**\n * Split layout strategy implementation\n * Provides split-pane layout with resizable panels\n */\nexport const splitStrategy: LayoutStrategy<SplitLayoutModel> = {\n id: \"split\",\n displayName: \"Split Layout\",\n defaultLayout: createDefaultSplitLayout,\n serialize: serializeSplitLayout,\n deserialize: deserializeSplitLayout,\n Renderer: SplitRenderer,\n};\n","/**\n * SplitInlinedLayout - Legacy component kept for backward compatibility.\n *\n * The split plugin no longer uses this component (plugin.tsx now renders\n * SplitTradingLayout directly). Kept exported so external consumers are not broken.\n */\nimport React from \"react\";\nimport type { LayoutStrategy } from \"@kodiak-finance/orderly-layout-core\";\nimport { splitStrategy } from \"../splitStrategy\";\nimport type { DesktopLayoutProps } from \"../types\";\nimport { SplitTradingDesktopChrome } from \"./SplitTradingDesktopChrome\";\n\n/** @deprecated Use SplitTradingLayout directly. */\nexport function SplitInlinedLayout({\n Original,\n props,\n}: {\n Original: React.ComponentType<DesktopLayoutProps>;\n props: DesktopLayoutProps;\n}): React.ReactElement {\n const layoutStrategy =\n (props.layoutStrategy as LayoutStrategy | undefined) ??\n (splitStrategy as unknown as LayoutStrategy);\n\n return (\n <SplitTradingDesktopChrome {...props}>\n <Original {...props} layoutStrategy={layoutStrategy} />\n </SplitTradingDesktopChrome>\n );\n}\n"]}
|