react-open-source-grid 1.7.23 → 1.7.25
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/lib/index.cjs +152 -190
- package/dist/lib/index.js +150 -188
- package/package.json +8 -37
- package/dist/404.html +0 -23
- package/dist/CNAME +0 -1
- package/dist/assets/components/AccessibilityDemo.d.ts +0 -8
- package/dist/assets/components/ApiReferencePage.d.ts +0 -2
- package/dist/assets/components/BenchmarkDemo.d.ts +0 -2
- package/dist/assets/components/CellRenderersDemo.d.ts +0 -16
- package/dist/assets/components/CodeBlock.d.ts +0 -10
- package/dist/assets/components/ColumnFiltersDemo.d.ts +0 -5
- package/dist/assets/components/CompleteApiReferencePage.d.ts +0 -2
- package/dist/assets/components/ContextMenuDemo.d.ts +0 -12
- package/dist/assets/components/DemoGridPage.d.ts +0 -2
- package/dist/assets/components/DensityModeDemo.d.ts +0 -12
- package/dist/assets/components/FacetedSearchDemo.d.ts +0 -8
- package/dist/assets/components/FeatureGallery.d.ts +0 -2
- package/dist/assets/components/FilteredSearchDemo.d.ts +0 -7
- package/dist/assets/components/GridApiDemoPage.d.ts +0 -2
- package/dist/assets/components/InfiniteScrollDemo.d.ts +0 -13
- package/dist/assets/components/LayoutPersistenceDemo.d.ts +0 -2
- package/dist/assets/components/LiveMarketDemo.d.ts +0 -18
- package/dist/assets/components/MarketDataExamples.d.ts +0 -42
- package/dist/assets/components/RowDraggingDemo.d.ts +0 -3
- package/dist/assets/components/RowPinningDemo.d.ts +0 -12
- package/dist/assets/components/ThemesDemo.d.ts +0 -17
- package/dist/assets/components/TooltipDemo.d.ts +0 -1
- package/dist/assets/components/TreeDataDemo.d.ts +0 -3
- package/dist/assets/components/VirtualScrollDemo.d.ts +0 -13
- package/dist/assets/index-BzDbdtZY.css +0 -1
- package/dist/assets/index-DHtd8tTR.js +0 -2273
- package/dist/assets/index.js +0 -1
- package/dist/assets/layoutPersistence-C509RwQB.js +0 -1
- package/dist/docs/ACCESSIBILITY_VPAT.pdf +0 -0
- package/dist/index.html +0 -105
- package/dist/lib/App.d.ts +0 -3
- package/dist/lib/components/AccessibilityDemo.d.ts +0 -8
- package/dist/lib/components/AdvancedEditorsDemo.d.ts +0 -15
- package/dist/lib/components/ApiReferencePage.d.ts +0 -2
- package/dist/lib/components/BenchmarkDemo.d.ts +0 -2
- package/dist/lib/components/CellRenderersDemo.d.ts +0 -16
- package/dist/lib/components/ChartsDemo.d.ts +0 -9
- package/dist/lib/components/CodeBlock.d.ts +0 -16
- package/dist/lib/components/ColumnFiltersDemo.d.ts +0 -5
- package/dist/lib/components/CompleteApiReferencePage.d.ts +0 -2
- package/dist/lib/components/ContextMenuDemo.d.ts +0 -12
- package/dist/lib/components/DemoGridPage.d.ts +0 -3
- package/dist/lib/components/DensityModeDemo.d.ts +0 -12
- package/dist/lib/components/FacetedSearchDemo.d.ts +0 -8
- package/dist/lib/components/FeatureGallery.d.ts +0 -2
- package/dist/lib/components/FilteredSearchDemo.d.ts +0 -7
- package/dist/lib/components/GridApiDemoPage.d.ts +0 -2
- package/dist/lib/components/GroupByDemo.d.ts +0 -3
- package/dist/lib/components/HomePage.d.ts +0 -1
- package/dist/lib/components/HorizontalScrollBugDemo.d.ts +0 -2
- package/dist/lib/components/InfiniteScrollDemo.d.ts +0 -13
- package/dist/lib/components/LayoutPersistenceDemo.d.ts +0 -2
- package/dist/lib/components/LiveMarketDemo.d.ts +0 -18
- package/dist/lib/components/MarketDataExamples.d.ts +0 -42
- package/dist/lib/components/MasterDetailDemo.d.ts +0 -2
- package/dist/lib/components/PivotDemo.d.ts +0 -8
- package/dist/lib/components/RowDraggingDemo.d.ts +0 -3
- package/dist/lib/components/RowPinningDemo.d.ts +0 -12
- package/dist/lib/components/ServerSideFeaturesDemo.d.ts +0 -10
- package/dist/lib/components/ThemesDemo.d.ts +0 -17
- package/dist/lib/components/TooltipDemo.d.ts +0 -1
- package/dist/lib/components/TreeDataDemo.d.ts +0 -3
- package/dist/lib/components/VirtualScrollDemo.d.ts +0 -13
- package/dist/lib/main.d.ts +0 -1
- package/dist/logo.png +0 -0
- package/dist/robots.txt +0 -11
- package/dist/sitemap.xml +0 -180
- package/dist/vite.svg +0 -1
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
/**
|
|
3
|
-
* CellRenderersDemo - Showcase of Custom Cell Renderer Framework
|
|
4
|
-
*
|
|
5
|
-
* This demo demonstrates all available custom cell renderers:
|
|
6
|
-
* - StatusChip: Color-coded status badges
|
|
7
|
-
* - ProgressBar: Visual progress indicators
|
|
8
|
-
* - IconCell: Cells with icons
|
|
9
|
-
* - ImageCell: Cells with images/avatars
|
|
10
|
-
* - ButtonCell: Actionable buttons
|
|
11
|
-
* - BadgeCell: Generic badge component
|
|
12
|
-
* - PriorityIndicator: Priority levels
|
|
13
|
-
* - Rating: Star ratings
|
|
14
|
-
* - CurrencyCell: Formatted currency values
|
|
15
|
-
*/
|
|
16
|
-
export declare const CellRenderersDemo: React.FC;
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
/**
|
|
3
|
-
* ContextMenuDemo Component
|
|
4
|
-
*
|
|
5
|
-
* Demonstrates the context menu feature with:
|
|
6
|
-
* - Right-click on cells: Copy, Copy with Headers, Export Selected Range, Filter by Value
|
|
7
|
-
* - Right-click on headers: Pin/Unpin, Auto-size, Resize to Fit, Hide Column, Filter by Value
|
|
8
|
-
* - Custom menu items
|
|
9
|
-
* - Enable/disable context menu options
|
|
10
|
-
*/
|
|
11
|
-
export declare const ContextMenuDemo: React.FC;
|
|
12
|
-
export default ContextMenuDemo;
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
/**
|
|
3
|
-
* DensityModeDemo - Showcase of DataGrid Density Modes
|
|
4
|
-
*
|
|
5
|
-
* Demonstrates:
|
|
6
|
-
* - Compact mode: Minimal spacing for maximum data density
|
|
7
|
-
* - Normal mode: Balanced spacing for general use
|
|
8
|
-
* - Comfortable mode: Generous spacing for accessibility
|
|
9
|
-
* - Persistent density preference (localStorage)
|
|
10
|
-
* - Segmented control UI
|
|
11
|
-
*/
|
|
12
|
-
export declare const DensityModeDemo: React.FC;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* InfiniteScrollDemo Component
|
|
3
|
-
*
|
|
4
|
-
* Demonstrates infinite scrolling with server-side data source
|
|
5
|
-
* handling 100M+ rows with:
|
|
6
|
-
* - Server-side filtering
|
|
7
|
-
* - Server-side sorting
|
|
8
|
-
* - Block caching
|
|
9
|
-
* - Virtual scrolling
|
|
10
|
-
*/
|
|
11
|
-
import React from 'react';
|
|
12
|
-
export declare const InfiniteScrollDemo: React.FC;
|
|
13
|
-
export default InfiniteScrollDemo;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* LiveMarketDemo.tsx
|
|
3
|
-
*
|
|
4
|
-
* Full demo page showcasing high-performance market data grid with:
|
|
5
|
-
* - Live streaming data (WebSocket mock feed)
|
|
6
|
-
* - 50 symbols with continuous updates
|
|
7
|
-
* - Pause/Resume controls
|
|
8
|
-
* - Performance metrics
|
|
9
|
-
* - Connection status
|
|
10
|
-
* - Density mode toggle
|
|
11
|
-
* - Flash animations
|
|
12
|
-
*/
|
|
13
|
-
import React from 'react';
|
|
14
|
-
import './LiveMarketDemo.css';
|
|
15
|
-
/**
|
|
16
|
-
* LiveMarketDemo Component
|
|
17
|
-
*/
|
|
18
|
-
export declare const LiveMarketDemo: React.FC;
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MARKET_DATA_EXAMPLE.tsx
|
|
3
|
-
*
|
|
4
|
-
* Complete working example of Market Data Mode implementation.
|
|
5
|
-
* Copy this file to get started quickly with live market data.
|
|
6
|
-
*/
|
|
7
|
-
import React from 'react';
|
|
8
|
-
/**
|
|
9
|
-
* Simple Market Data Example
|
|
10
|
-
*
|
|
11
|
-
* This example demonstrates:
|
|
12
|
-
* - Creating a market data engine
|
|
13
|
-
* - Setting up a mock WebSocket feed
|
|
14
|
-
* - Configuring columns for market data
|
|
15
|
-
* - Rendering the grid with live updates
|
|
16
|
-
*/
|
|
17
|
-
export declare const SimpleMarketExample: React.FC;
|
|
18
|
-
/**
|
|
19
|
-
* Advanced Market Data Example
|
|
20
|
-
*
|
|
21
|
-
* This example demonstrates:
|
|
22
|
-
* - Full control panel with pause/resume
|
|
23
|
-
* - Performance metrics display
|
|
24
|
-
* - Density mode toggle
|
|
25
|
-
* - Flash animation toggle
|
|
26
|
-
* - Connection status
|
|
27
|
-
*/
|
|
28
|
-
export declare const AdvancedMarketExample: React.FC;
|
|
29
|
-
/**
|
|
30
|
-
* Real WebSocket Example
|
|
31
|
-
*
|
|
32
|
-
* This example shows how to connect to a real WebSocket server.
|
|
33
|
-
* Replace the URL with your actual WebSocket endpoint.
|
|
34
|
-
*/
|
|
35
|
-
export declare const RealWebSocketExample: React.FC;
|
|
36
|
-
/**
|
|
37
|
-
* Custom Formatting Example
|
|
38
|
-
*
|
|
39
|
-
* Shows how to customize cell rendering for market data.
|
|
40
|
-
*/
|
|
41
|
-
export declare const CustomFormattingExample: React.FC;
|
|
42
|
-
export default SimpleMarketExample;
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
/**
|
|
3
|
-
* RowPinningDemo - Demonstrates row pinning feature
|
|
4
|
-
*
|
|
5
|
-
* This demo showcases:
|
|
6
|
-
* - Pin rows to top or bottom
|
|
7
|
-
* - Pinned rows remain sticky during scroll
|
|
8
|
-
* - Works with sorting and filtering
|
|
9
|
-
* - Works with virtual scrolling
|
|
10
|
-
* - Context menu integration
|
|
11
|
-
*/
|
|
12
|
-
export declare const RowPinningDemo: React.FC;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
/**
|
|
3
|
-
* ThemesDemo - Showcase of DataGrid Theme System
|
|
4
|
-
*
|
|
5
|
-
* Demonstrates all available themes:
|
|
6
|
-
* - Quartz (Modern White)
|
|
7
|
-
* - Alpine (Classic Business)
|
|
8
|
-
* - Material
|
|
9
|
-
* - Dark Mode
|
|
10
|
-
* - Nord (Arctic)
|
|
11
|
-
* - Dracula
|
|
12
|
-
* - Solarized Light
|
|
13
|
-
* - Solarized Dark
|
|
14
|
-
* - Monokai
|
|
15
|
-
* - One Dark
|
|
16
|
-
*/
|
|
17
|
-
export declare const ThemesDemo: React.FC;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const TooltipDemo: () => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
/**
|
|
3
|
-
* VirtualScrollDemo - Demonstrates virtual scrolling with large datasets
|
|
4
|
-
*
|
|
5
|
-
* This demo showcases:
|
|
6
|
-
* - 50,000+ rows
|
|
7
|
-
* - 200+ columns
|
|
8
|
-
* - Ultra-fast rendering with windowing
|
|
9
|
-
* - Dynamic row heights
|
|
10
|
-
* - Cell recycling
|
|
11
|
-
*/
|
|
12
|
-
export declare const VirtualScrollDemo: React.FC;
|
|
13
|
-
export default VirtualScrollDemo;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
*{box-sizing:border-box;margin:0;padding:0}html,body,#root{width:100%;height:100%}body{color:#333;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:#fafafa;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-size:14px;line-height:1.6}input,button,textarea,select{font-family:inherit;font-size:inherit}button{cursor:pointer;background:0 0;border:none;margin:0;padding:0}:root{--color-primary:#06c;--color-primary-light:#e8f0ff;--color-primary-dark:#004ca3;--color-neutral-dark:#1a1a1a;--color-neutral-light:#f5f5f5;--color-border:#d9d9d9;--color-border-light:#efefef;--color-bg-hover:#f0f0f0;--color-text-primary:#262626;--color-text-secondary:#666;--grid-border:#e5e7eb;--grid-border-width:1px;--grid-border-radius:6px;--grid-bg:#fff;--grid-bg-alt:#f9fafb;--grid-header-bg:#f3f4f6;--grid-footer-bg:#f9fafb;--grid-text:#111827;--grid-text-secondary:#6b7280;--grid-text-muted:#9ca3af;--grid-header-text:#374151;--grid-primary:#3b82f6;--grid-selected:#3b82f614;--grid-hover:#f9fafb;--grid-active:#eff6ff;--grid-cell-padding:10px 12px;--grid-header-padding:10px 12px;--grid-font-size:13px;--grid-font-size-sm:12px;--grid-header-font-weight:600;--grid-shadow-light:0 1px 3px 0 #00000014;--grid-text-inverse:#fff}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#a1a1a1}.virtual-scroller-container{scrollbar-width:thin;scrollbar-color:#c1c1c1 #f1f1f1}.virtual-scroller-container::-webkit-scrollbar{-webkit-appearance:none;width:12px;height:12px}.virtual-scroller-container::-webkit-scrollbar-track{background:#f1f1f1;border-radius:0}.virtual-scroller-container::-webkit-scrollbar-thumb{background:#c1c1c1;border:2px solid #f1f1f1;border-radius:6px}.virtual-scroller-container::-webkit-scrollbar-thumb:hover{background:#a1a1a1}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.master-detail-cell{justify-content:center;align-items:center;width:100%;height:100%;padding:0;display:flex}.master-detail-cell-empty{width:100%;height:100%}.master-detail-toggle{cursor:pointer;color:inherit;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;padding:4px 8px;transition:all .15s;display:flex}.master-detail-toggle:hover{background-color:#0000000d}.master-detail-toggle:focus{outline:2px solid var(--primary-color,#06c);outline-offset:2px}.master-detail-toggle:active{transform:scale(.95)}.master-detail-icon{-webkit-user-select:none;user-select:none;font-size:12px;line-height:1;transition:transform .2s;display:inline-block}.master-detail-icon.expanded,.master-detail-icon.collapsed{transform:rotate(0)}.detail-row{background-color:var(--detail-row-bg,#f8f9fa);border-top:1px solid var(--border-color,#e0e0e0);border-bottom:1px solid var(--border-color,#e0e0e0);transition:max-height .3s,opacity .3s;overflow:hidden}.detail-row.expanding{animation:.3s forwards expandDetail}.detail-row.collapsing{animation:.3s forwards collapseDetail}@keyframes expandDetail{0%{opacity:0;max-height:0}to{opacity:1;max-height:2000px}}@keyframes collapseDetail{0%{opacity:1;max-height:2000px}to{opacity:0;max-height:0}}.detail-row-content{box-sizing:border-box;width:100%;padding:12px}.detail-row-wrapper{display:table-row}.detail-row-cell{vertical-align:top;padding:0;display:table-cell}[data-theme=dark] .master-detail-toggle:hover{background-color:#ffffff1a}[data-theme=dark] .detail-row{background-color:#ffffff08;border-top:1px solid #ffffff1a;border-bottom:1px solid #ffffff1a}.context-menu{background:var(--context-menu-bg,#fff);border:1px solid var(--context-menu-border,#d0d0d0);z-index:10000;min-width:200px;max-width:320px;color:var(--context-menu-text,#333);-webkit-user-select:none;user-select:none;border-radius:6px;padding:4px 0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;line-height:1.5;animation:.12s ease-out contextMenuFadeIn;position:fixed;box-shadow:0 4px 16px #00000026}@keyframes contextMenuFadeIn{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.context-menu-item{cursor:pointer;align-items:center;gap:8px;padding:8px 12px;transition:background-color .1s;display:flex;position:relative}.context-menu-item:hover:not(.disabled){background-color:var(--context-menu-hover-bg,#f0f0f0)}.context-menu-item:active:not(.disabled){background-color:var(--context-menu-active-bg,#e5e5e5)}.context-menu-item.disabled{opacity:.4;cursor:not-allowed}.context-menu-item.danger{color:var(--context-menu-danger,#dc3545)}.context-menu-item.danger:hover:not(.disabled){background-color:var(--context-menu-danger-hover-bg,#fff0f0)}.context-menu-icon{flex-shrink:0;justify-content:center;align-items:center;width:20px;font-size:16px;display:flex}.context-menu-label{white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.context-menu-shortcut{color:var(--context-menu-shortcut,#888);margin-left:auto;padding-left:16px;font-size:12px}.context-menu-arrow{color:var(--context-menu-arrow,#888);margin-left:auto;font-size:10px}.context-menu-separator{background-color:var(--context-menu-separator,#e0e0e0);height:1px;margin:4px 0}.context-menu-item-wrapper{position:relative}.context-menu-submenu{background:var(--context-menu-bg,#fff);border:1px solid var(--context-menu-border,#d0d0d0);z-index:10001;border-radius:6px;min-width:180px;margin-left:-4px;padding:4px 0;animation:.15s ease-out submenuFadeIn;position:absolute;top:0;left:100%;box-shadow:0 4px 16px #00000026}@keyframes submenuFadeIn{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}.context-menu-item.has-submenu{padding-right:24px}@media (prefers-color-scheme:dark){.context-menu{--context-menu-bg:#2a2a2a;--context-menu-border:#404040;--context-menu-text:#e0e0e0;--context-menu-hover-bg:#3a3a3a;--context-menu-active-bg:#4a4a4a;--context-menu-separator:#404040;--context-menu-shortcut:#999;--context-menu-arrow:#999;--context-menu-danger:#ff6b6b;--context-menu-danger-hover-bg:#3a2a2a}}.data-grid.theme-quartz .context-menu{--context-menu-bg:#fff;--context-menu-border:#c5c5c5;--context-menu-text:#000;--context-menu-hover-bg:#e6f2ff;--context-menu-active-bg:#cce5ff}.data-grid.theme-alpine .context-menu{--context-menu-bg:#f8f9fa;--context-menu-border:#dee2e6;--context-menu-text:#212529;--context-menu-hover-bg:#e9ecef;--context-menu-active-bg:#dee2e6}.data-grid.theme-balham .context-menu{--context-menu-bg:#fff;--context-menu-border:#bdc3c7;--context-menu-text:#2c3e50;--context-menu-hover-bg:#ecf0f1;--context-menu-active-bg:#d5dbdb}.data-grid.theme-material .context-menu{--context-menu-bg:#fff;--context-menu-border:#e0e0e0;--context-menu-text:#212121;--context-menu-hover-bg:#f5f5f5;--context-menu-active-bg:#eee;border-radius:4px;box-shadow:0 2px 4px #0003}.context-menu-item:focus{outline:2px solid var(--context-menu-focus,#06c);outline-offset:-2px}.context-menu-item:focus:not(:focus-visible){outline:none}.market-data-grid{background:#fff;border:1px solid #e0e0e0;width:100%;height:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;font-size:13px;overflow:auto}.market-grid-header{z-index:10;background:#f5f5f5;border-bottom:2px solid #d0d0d0;position:sticky;top:0}.market-grid-header-row{min-width:100%;display:flex}.market-grid-header-cell{color:#333;white-space:nowrap;text-overflow:ellipsis;-webkit-user-select:none;user-select:none;border-right:1px solid #e0e0e0;padding:10px 12px;font-weight:600;overflow:hidden}.market-grid-header-cell:last-child{border-right:none}.market-grid-body{min-width:100%}.market-grid-row{cursor:pointer;border-bottom:1px solid #f0f0f0;transition:background-color .1s;display:flex}.market-grid-row:hover{background-color:#f9f9f9}.market-grid-row:active{background-color:#f0f0f0}.market-grid-cell{white-space:nowrap;text-overflow:ellipsis;border-right:1px solid #f5f5f5;align-items:center;padding:8px 12px;display:flex;position:relative;overflow:hidden}.market-grid-cell:last-child{border-right:none}.numeric-cell{font-variant-numeric:tabular-nums;justify-content:flex-end;font-family:Monaco,Menlo,Consolas,monospace}@keyframes flashUp{0%{background-color:#4caf5000}20%{background-color:#4caf5066}to{background-color:#4caf5000}}@keyframes flashDown{0%{background-color:#f4433600}20%{background-color:#f4433666}to{background-color:#f4433600}}.cell-flash-up{animation:.5s ease-out flashUp}.cell-flash-down{animation:.5s ease-out flashDown}.change-positive{color:#4caf50;font-weight:600}.change-negative{color:#f44336;font-weight:600}.market-grid-cell[data-field=bid]{color:#2196f3;font-weight:500}.market-grid-cell[data-field=ask]{color:#ff5722;font-weight:500}.market-grid-cell[data-field=price]{font-size:14px;font-weight:700}.market-grid-cell[data-field=volume],.market-grid-cell[data-field=size]{color:#666;font-size:12px}.market-grid-cell[data-field=symbol],.market-grid-cell[data-field=id]{color:#1976d2;font-family:Monaco,Menlo,Consolas,monospace;font-weight:700}.density-compact .market-grid-header-cell{padding:6px 8px;font-size:12px}.density-compact .market-grid-cell{padding:4px 8px;font-size:12px}.density-compact .market-grid-cell[data-field=price]{font-size:13px}.density-compact .market-grid-row{min-height:28px}.market-grid-cell[data-field=high]{color:#4caf50}.market-grid-cell[data-field=low]{color:#f44336}.market-data-grid.loading{opacity:.6;pointer-events:none}.market-data-grid.loading:after{content:"";border:4px solid #f3f3f3;border-top-color:#2196f3;border-radius:50%;width:40px;height:40px;animation:1s linear infinite spin;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}@keyframes spin{0%{transform:translate(-50%,-50%)rotate(0)}to{transform:translate(-50%,-50%)rotate(360deg)}}.market-data-grid.paused{border:2px solid #ff9800}.market-data-grid.paused:before{content:"PAUSED";color:#fff;z-index:1000;letter-spacing:1px;background:#ff9800;border-radius:4px;padding:4px 12px;font-size:11px;font-weight:700;position:absolute;top:10px;right:10px}.market-data-grid.throttled{border:2px solid #f44336}.market-data-grid.throttled:before{content:"THROTTLED";color:#fff;z-index:1000;letter-spacing:1px;background:#f44336;border-radius:4px;padding:4px 12px;font-size:11px;font-weight:700;position:absolute;top:10px;right:10px}.market-data-grid::-webkit-scrollbar{width:12px;height:12px}.market-data-grid::-webkit-scrollbar-track{background:#f5f5f5}.market-data-grid::-webkit-scrollbar-thumb{background:#ccc;border-radius:6px}.market-data-grid::-webkit-scrollbar-thumb:hover{background:#999}.market-data-wrapper{width:100%;height:100%;position:relative}.market-metrics-overlay{color:#0f0;z-index:1000;pointer-events:none;background:#000000bf;border-radius:4px;padding:8px 12px;font-family:Monaco,Menlo,Consolas,monospace;font-size:11px;line-height:1.6;position:absolute;top:10px;left:10px}.market-metrics-overlay .metric{justify-content:space-between;gap:12px;display:flex}.market-metrics-overlay .metric-label{color:#888}.market-metrics-overlay .metric-value{color:#0f0;font-weight:700}.market-metrics-overlay .metric-value.warning{color:#ff9800}.market-metrics-overlay .metric-value.critical{color:#f44336}.connection-status{z-index:1000;letter-spacing:.5px;border-radius:12px;padding:4px 10px;font-size:11px;font-weight:700;position:absolute;top:10px;right:120px}.connection-status.connected{color:#fff;background:#4caf50}.connection-status.connecting{color:#fff;background:#ff9800}.connection-status.disconnected{color:#fff;background:#f44336}.connection-status.reconnecting{color:#fff;background:#ff9800;animation:1s ease-in-out infinite pulse}@media (max-width:768px){.market-data-grid{font-size:11px}.market-grid-cell{padding:6px 8px}.market-grid-header-cell{padding:8px}}.live-market-demo{background:#fafafa;flex-direction:column;max-width:100%;height:100vh;padding:20px;display:flex}.demo-header{margin-bottom:20px}.demo-header h1{color:#1976d2;margin:0 0 8px;font-size:28px;font-weight:700}.demo-description{color:#666;margin:0;font-size:14px}.demo-controls{background:#fff;border-radius:8px;justify-content:space-between;align-items:center;gap:16px;margin-bottom:16px;padding:16px;display:flex;box-shadow:0 2px 4px #0000001a}.control-group{flex-wrap:wrap;gap:12px;display:flex}.control-btn{cursor:pointer;white-space:nowrap;background:#fff;border:2px solid #e0e0e0;border-radius:6px;padding:10px 20px;font-size:14px;font-weight:600;transition:all .2s}.control-btn:hover{background:#f5f9ff;border-color:#2196f3}.control-btn.active{color:#fff;background:#2196f3;border-color:#2196f3}.control-btn.paused{color:#fff;background:#ff9800;border-color:#ff9800}.connection-info{align-items:center;gap:12px;display:flex}.status-badge{letter-spacing:.5px;border-radius:16px;padding:6px 14px;font-size:11px;font-weight:700}.status-badge.connected{color:#fff;background:#4caf50}.status-badge.connecting{color:#fff;background:#ff9800}.status-badge.disconnected{color:#fff;background:#f44336}.status-badge.reconnecting{color:#fff;background:#ff9800;animation:1s ease-in-out infinite pulse-badge}@keyframes pulse-badge{0%,to{opacity:1}50%{opacity:.6}}.metric-badge{color:#1976d2;background:#e3f2fd;border-radius:4px;padding:6px 12px;font-size:13px;font-weight:600}.metrics-panel{background:#000000d9;border-radius:6px;flex-wrap:wrap;gap:20px;margin-bottom:16px;padding:12px 16px;display:flex}.metric-item{align-items:center;gap:8px;display:flex}.metric-label{color:#888;font-size:13px;font-weight:500}.metric-value{color:#0f0;font-family:Monaco,Menlo,Consolas,monospace;font-size:14px;font-weight:700}.metric-value.warning{color:#ff9800}.metric-value.critical{color:#f44336}.metric-item.warning{background:#ff980033;border-radius:4px;padding:4px 12px}.grid-container{background:#fff;border-radius:8px;flex:1;min-height:600px;position:relative;overflow:hidden;box-shadow:0 2px 8px #0000001a}.grid-container.paused{border:3px solid #ff9800}.grid-container.throttled{border:3px solid #f44336}.grid-container.paused:before{content:"PAUSED";color:#fff;z-index:1000;letter-spacing:1px;background:#ff9800;border-radius:6px;padding:8px 16px;font-size:12px;font-weight:700;position:absolute;top:16px;right:16px;box-shadow:0 2px 6px #0003}.grid-container.throttled:after{content:"CPU THROTTLED";color:#fff;z-index:1000;letter-spacing:1px;background:#f44336;border-radius:6px;padding:8px 16px;font-size:12px;font-weight:700;animation:1s ease-in-out infinite pulse-warning;position:absolute;top:56px;right:16px;box-shadow:0 2px 6px #0003}@keyframes pulse-warning{0%,to{opacity:1}50%{opacity:.7}}.demo-footer{background:#fff;border-radius:8px;margin-top:16px;padding:16px;box-shadow:0 2px 4px #0000001a}.demo-footer p{color:#666;margin:0;font-size:13px;line-height:1.6}.demo-footer strong{color:#333}@media (max-width:1024px){.demo-controls{flex-direction:column;align-items:stretch}.connection-info,.metrics-panel{justify-content:center}}@media (max-width:768px){.live-market-demo{padding:12px}.demo-header h1{font-size:22px}.control-btn{padding:8px 16px;font-size:13px}.metrics-panel{font-size:12px}}.editor-container{width:100%;color:var(--text-color,#333);background:var(--bg-color,#fff);z-index:1000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;position:relative}.editor-input-wrapper{border:2px solid var(--primary-color,#06c);background:var(--bg-color,#fff);border-radius:4px;align-items:center;display:flex;position:relative;overflow:hidden}.editor-input-wrapper:focus-within{border-color:var(--primary-color,#06c);box-shadow:0 0 0 3px #0066cc1a}.editor-input{color:var(--text-color,#333);background:0 0;border:none;outline:none;flex:1;padding:8px 12px;font-family:inherit;font-size:14px}.editor-input::placeholder{color:var(--text-muted,#999)}.editor-dropdown-icon,.editor-calendar-icon{color:var(--text-muted,#999);pointer-events:none;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;padding:0 8px;display:flex}.editor-input-actions{align-items:center;gap:4px;padding-right:8px;display:flex}.editor-clear-btn{background:var(--bg-hover,#f0f0f0);cursor:pointer;width:20px;height:20px;color:var(--text-muted,#999);border:none;border-radius:50%;justify-content:center;align-items:center;padding:0;font-size:18px;line-height:1;transition:all .2s;display:flex}.editor-clear-btn:hover{background:var(--bg-active,#e0e0e0);color:var(--text-color,#333)}.editor-dropdown{background:var(--bg-color,#fff);border:1px solid var(--border-color,#ddd);z-index:10000;border-radius:4px;max-height:300px;margin-top:4px;position:fixed;overflow-y:auto;box-shadow:0 4px 12px #00000026}.editor-dropdown-empty{text-align:center;color:var(--text-muted,#999);padding:16px;font-style:italic}.editor-dropdown-option{cursor:pointer;border-bottom:1px solid var(--border-light,#f0f0f0);align-items:center;padding:10px 12px;transition:background-color .15s;display:flex}.editor-dropdown-option:last-child{border-bottom:none}.editor-dropdown-option:hover:not(.disabled){background:var(--bg-hover,#f5f5f5)}.editor-dropdown-option.focused:not(.disabled){background:var(--bg-hover,#f0f0f0)}.editor-dropdown-option.selected{background:var(--primary-light,#e6f2ff);color:var(--primary-color,#06c)}.editor-dropdown-option.disabled{opacity:.5;cursor:not-allowed}.editor-option-content{flex:1;align-items:center;gap:8px;display:flex}.editor-option-icon{align-items:center;font-size:16px;display:flex}.editor-option-text{flex:1}.editor-option-label{font-weight:500}.editor-option-description{color:var(--text-muted,#999);margin-top:2px;font-size:12px}.editor-richselect-container{min-width:200px}.editor-richselect-input{min-width:150px}.editor-date-container{min-width:250px}.editor-calendar{min-width:280px;padding:12px}.editor-calendar-header{border-bottom:1px solid var(--border-color,#ddd);justify-content:space-between;align-items:center;margin-bottom:12px;padding-bottom:8px;display:flex}.editor-calendar-title{font-size:15px;font-weight:600}.editor-calendar-nav{cursor:pointer;width:32px;height:32px;color:var(--text-color,#333);background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;font-size:20px;transition:background-color .15s;display:flex}.editor-calendar-nav:hover{background:var(--bg-hover,#f0f0f0)}.editor-calendar-weekdays{grid-template-columns:repeat(7,1fr);gap:4px;margin-bottom:4px;display:grid}.editor-calendar-weekday{text-align:center;color:var(--text-muted,#999);padding:4px;font-size:12px;font-weight:600}.editor-calendar-days{grid-template-columns:repeat(7,1fr);gap:2px;display:grid}.editor-calendar-day{aspect-ratio:1;cursor:pointer;color:var(--text-color,#333);background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;font-size:14px;transition:all .15s;display:flex}.editor-calendar-day:hover:not(:disabled){background:var(--bg-hover,#f0f0f0)}.editor-calendar-day.today{color:var(--primary-color,#06c);font-weight:700}.editor-calendar-day.selected{background:var(--primary-color,#06c);color:#fff;font-weight:600}.editor-calendar-day.other-month{color:var(--text-muted,#ccc)}.editor-calendar-day:disabled{opacity:.3;cursor:not-allowed}.editor-calendar-time{border-top:1px solid var(--border-color,#ddd);margin-top:12px;padding-top:12px}.editor-time-input{border:1px solid var(--border-color,#ddd);border-radius:4px;width:100%;padding:8px;font-family:inherit;font-size:14px}.editor-numeric-container{min-width:150px}.editor-numeric-input{text-align:right;padding-right:4px}.editor-numeric-prefix,.editor-numeric-suffix{color:var(--text-muted,#999);-webkit-user-select:none;user-select:none;padding:0 8px;font-weight:500}.editor-numeric-steppers{border-left:1px solid var(--border-color,#ddd);flex-direction:column;display:flex}.editor-numeric-stepper{cursor:pointer;width:24px;height:50%;color:var(--text-color,#333);background:0 0;border:none;justify-content:center;align-items:center;padding:0;font-size:10px;transition:background-color .15s;display:flex}.editor-numeric-stepper:hover:not(:disabled){background:var(--bg-hover,#f0f0f0)}.editor-numeric-stepper:disabled{opacity:.3;cursor:not-allowed}.editor-numeric-increment{border-bottom:1px solid var(--border-color,#ddd)}.editor-numeric-range{color:var(--text-muted,#999);justify-content:space-between;margin-top:4px;padding:4px 8px;font-size:11px;display:flex}.editor-multiselect-container{min-width:250px}.editor-multiselect-wrapper{flex-wrap:wrap;gap:4px;padding:6px}.editor-multiselect-tags{flex-wrap:wrap;flex:1;gap:4px;min-width:0;display:flex}.editor-tag{background:var(--primary-light,#e6f2ff);color:var(--primary-color,#06c);white-space:nowrap;border-radius:12px;align-items:center;gap:4px;max-width:150px;padding:4px 8px;font-size:12px;display:inline-flex}.editor-tag-icon{font-size:14px}.editor-tag-label{text-overflow:ellipsis;overflow:hidden}.editor-tag-remove{cursor:pointer;color:currentColor;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;width:16px;height:16px;padding:0;font-size:16px;line-height:1;transition:background-color .15s;display:flex}.editor-tag-remove:hover{background:#0000001a}.editor-tag-collapsed{background:var(--bg-hover,#f0f0f0);color:var(--text-muted,#666);font-weight:500}.editor-multiselect-input{flex:1;min-width:80px;padding:4px}.editor-multiselect-option{gap:8px}.editor-multiselect-checkbox{cursor:pointer;width:16px;height:16px;margin:0}.editor-markdown-container{background:var(--bg-color,#fff);border:2px solid var(--primary-color,#06c);border-radius:4px;flex-direction:column;min-width:400px;max-width:800px;display:flex;overflow:hidden}.editor-markdown-toolbar{border-bottom:1px solid var(--border-color,#ddd);background:var(--bg-light,#f9f9f9);justify-content:space-between;padding:8px;display:flex}.editor-markdown-toolbar-group{gap:4px;display:flex}.editor-toolbar-btn{border:1px solid var(--border-color,#ddd);background:var(--bg-color,#fff);cursor:pointer;border-radius:4px;justify-content:center;align-items:center;width:32px;height:32px;font-size:14px;transition:all .15s;display:flex}.editor-toolbar-btn:hover{background:var(--bg-hover,#f0f0f0);border-color:var(--primary-color,#06c)}.editor-toolbar-btn.active{background:var(--primary-color,#06c);color:#fff;border-color:var(--primary-color,#06c)}.editor-markdown-content{flex:1;display:flex;overflow:hidden}.editor-markdown-content.split .editor-markdown-editor{border-right:1px solid var(--border-color,#ddd);width:50%}.editor-markdown-content.split .editor-markdown-preview{width:50%}.editor-markdown-editor{flex-direction:column;flex:1;display:flex;position:relative}.editor-textarea{resize:none;width:100%;color:var(--text-color,#333);background:var(--bg-color,#fff);border:none;outline:none;flex:1;padding:12px;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:13px;line-height:1.6}.editor-markdown-char-count{background:var(--bg-light,#f9f9f9);color:var(--text-muted,#999);pointer-events:none;border-radius:4px;padding:4px 8px;font-size:11px;position:absolute;bottom:8px;right:8px}.editor-markdown-char-count.warning{color:var(--danger-color,#d32f2f);font-weight:600}.editor-markdown-preview{background:var(--bg-light,#fafafa);flex-direction:column;display:flex;overflow:hidden}.editor-markdown-preview-label{text-transform:uppercase;color:var(--text-muted,#999);border-bottom:1px solid var(--border-color,#ddd);letter-spacing:.5px;padding:8px 12px;font-size:11px;font-weight:600}.editor-markdown-preview-content{flex:1;padding:12px;line-height:1.6;overflow-y:auto}.editor-markdown-preview-content h1{color:var(--text-color,#333);margin:16px 0 8px;font-size:24px}.editor-markdown-preview-content h2{color:var(--text-color,#333);margin:14px 0 7px;font-size:20px}.editor-markdown-preview-content h3{color:var(--text-color,#333);margin:12px 0 6px;font-size:16px}.editor-markdown-preview-content p{margin:8px 0}.editor-markdown-preview-content code{background:var(--bg-hover,#f0f0f0);border-radius:3px;padding:2px 6px;font-family:Monaco,Menlo,monospace;font-size:.9em}.editor-markdown-preview-content a{color:var(--primary-color,#06c);text-decoration:none}.editor-markdown-preview-content a:hover{text-decoration:underline}.editor-markdown-preview-content ul{margin:8px 0;padding-left:24px}.editor-markdown-preview-content li{margin:4px 0}.editor-markdown-empty{color:var(--text-muted,#999);font-style:italic}.editor-markdown-footer{border-top:1px solid var(--border-color,#ddd);background:var(--bg-light,#f9f9f9);justify-content:space-between;align-items:center;padding:8px 12px;display:flex}.editor-markdown-hint{color:var(--text-muted,#999);font-size:12px}.editor-markdown-hint kbd{background:var(--bg-color,#fff);border:1px solid var(--border-color,#ddd);border-radius:3px;padding:2px 6px;font-family:inherit;font-size:11px;font-weight:600}.editor-markdown-actions{gap:8px;display:flex}.editor-btn{border:1px solid var(--border-color,#ddd);background:var(--bg-color,#fff);color:var(--text-color,#333);cursor:pointer;border-radius:4px;padding:6px 16px;font-size:13px;font-weight:500;transition:all .15s}.editor-btn:hover{background:var(--bg-hover,#f0f0f0)}.editor-btn-primary{background:var(--primary-color,#06c);color:#fff;border-color:var(--primary-color,#06c)}.editor-btn-primary:hover{background:var(--primary-dark,#0052a3);border-color:var(--primary-dark,#0052a3)}.editor-btn-secondary{background:0 0}.editor-btn-secondary:hover{background:var(--bg-hover,#f0f0f0)}@media (max-width:768px){.editor-markdown-container{min-width:300px;max-width:100%}.editor-markdown-content.split{flex-direction:column}.editor-markdown-content.split .editor-markdown-editor,.editor-markdown-content.split .editor-markdown-preview{border-right:none;width:100%}.editor-markdown-content.split .editor-markdown-editor{border-bottom:1px solid var(--border-color,#ddd)}}.dark-theme .editor-container{--text-color:#e0e0e0;--text-muted:#999;--bg-color:#1e1e1e;--bg-light:#252525;--bg-hover:#2a2a2a;--bg-active:#333;--border-color:#3a3a3a;--border-light:#2a2a2a;--primary-color:#4a9eff;--primary-light:#4a9eff33;--primary-dark:#3a8eef;--danger-color:#f44336}.editor-container button:focus-visible,.editor-input:focus-visible,.editor-textarea:focus-visible{outline:2px solid var(--primary-color,#06c);outline-offset:2px}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.quick-chart{background:#fff;border-radius:8px;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;display:flex;overflow:hidden;box-shadow:0 4px 16px #0000001a}.quick-chart--dark{color:#fff;background:#1a1a1a;box-shadow:0 4px 16px #00000080}.quick-chart__header{background:#f5f5f5;border-bottom:1px solid #e0e0e0;justify-content:space-between;align-items:center;padding:12px 16px;display:flex}.quick-chart--dark .quick-chart__header{background:#252525;border-bottom-color:#333}.quick-chart__title{color:#333;margin:0;font-size:16px;font-weight:600}.quick-chart--dark .quick-chart__title{color:#fff}.quick-chart__controls{align-items:center;gap:8px;display:flex}.quick-chart__type-selector{background:#fff;border:1px solid #ddd;border-radius:6px;gap:4px;padding:4px;display:flex}.quick-chart--dark .quick-chart__type-selector{background:#2a2a2a;border-color:#444}.quick-chart__type-btn{cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;width:32px;height:32px;padding:0;font-size:16px;transition:background-color .2s;display:flex}.quick-chart__type-btn:hover{background:#f0f0f0}.quick-chart--dark .quick-chart__type-btn:hover{background:#3a3a3a}.quick-chart__type-btn--active{background:#e3f2fd}.quick-chart--dark .quick-chart__type-btn--active{background:#1e3a5f}.quick-chart__btn{cursor:pointer;background:#fff;border:1px solid #ddd;border-radius:4px;justify-content:center;align-items:center;width:32px;height:32px;padding:0;font-size:16px;transition:all .2s;display:flex}.quick-chart__btn:hover{background:#f0f0f0;border-color:#999}.quick-chart--dark .quick-chart__btn{color:#fff;background:#2a2a2a;border-color:#444}.quick-chart--dark .quick-chart__btn:hover{background:#3a3a3a;border-color:#666}.quick-chart__close{color:#666;font-size:24px;line-height:1}.quick-chart__close:hover{color:#d32f2f;background:#ffebee}.quick-chart--dark .quick-chart__close{color:#aaa}.quick-chart--dark .quick-chart__close:hover{color:#ff5252;background:#3a1f1f}.quick-chart__body{flex:1;min-height:0;padding:16px}@media (max-width:768px){.quick-chart__header{flex-direction:column;align-items:flex-start;gap:8px}.quick-chart__controls{justify-content:flex-end;width:100%}}.chart-overlay{z-index:9999;pointer-events:none;position:fixed;inset:0}.chart-overlay__backdrop{pointer-events:all;background:#0000004d;animation:.2s ease-out fadeIn;position:absolute;inset:0}.chart-overlay__container{pointer-events:all;transition:box-shadow .2s;animation:.3s ease-out slideIn;position:absolute}.chart-overlay__container--draggable{cursor:move}.chart-overlay__container--dragging{cursor:grabbing;transition:none;box-shadow:0 8px 32px #0003!important}.chart-overlay__container--draggable .quick-chart__header{cursor:move}.chart-overlay__container--dragging .quick-chart__header{cursor:grabbing}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideIn{0%{opacity:0;transform:scale(.95)translateY(10px)}to{opacity:1;transform:scale(1)translateY(0)}}@media (max-width:768px){.chart-overlay__container{transform:translateY(-50%);width:calc(100% - 20px)!important;height:400px!important;top:50%!important;left:10px!important}}.charts-demo{max-width:1400px;margin:0 auto;padding:20px}.charts-demo__header{margin-bottom:24px}.charts-demo__title{color:#1a1a1a;margin:0 0 12px;font-size:32px;font-weight:700}.charts-demo__description{color:#666;margin:0;font-size:16px;line-height:1.6}.charts-demo__instructions{background:#f5f5f5;border-left:4px solid #2196f3;border-radius:8px;margin-bottom:24px;padding:20px}.charts-demo__instructions h2{color:#1a1a1a;margin:0 0 12px;font-size:18px}.charts-demo__instructions ol{margin:0;padding-left:24px}.charts-demo__instructions li{color:#444;margin-bottom:8px;line-height:1.6}.charts-demo__toolbar{background:#fff;border-radius:8px;flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:20px;padding:16px;display:flex;box-shadow:0 2px 8px #00000014}.charts-demo__btn{cursor:pointer;background:#fff;border:1px solid #ddd;border-radius:6px;align-items:center;gap:6px;padding:10px 18px;font-size:14px;font-weight:500;transition:all .2s;display:flex}.charts-demo__btn:hover:not(:disabled){background:#f5f5f5;border-color:#999;transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.charts-demo__btn:disabled{opacity:.5;cursor:not-allowed}.charts-demo__btn--primary{color:#fff;background:#2196f3;border-color:#2196f3}.charts-demo__btn--primary:hover:not(:disabled){background:#1976d2;border-color:#1976d2}.charts-demo__selection-info{color:#1565c0;background:#e3f2fd;border-radius:4px;margin-left:auto;padding:8px 12px;font-size:13px;font-weight:500}.charts-demo__grid-container{border-radius:8px;margin-bottom:40px;overflow:hidden;box-shadow:0 2px 8px #00000014}.charts-demo__code-section{margin-bottom:40px}.charts-demo__code-section h2{color:#1a1a1a;margin-bottom:16px;font-size:24px}.charts-demo__features{margin-top:40px}.charts-demo__features h2{color:#1a1a1a;margin-bottom:20px;font-size:24px}.charts-demo__feature-grid{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;display:grid}.charts-demo__feature{background:#fff;border-radius:8px;padding:24px;transition:transform .2s,box-shadow .2s;box-shadow:0 2px 8px #00000014}.charts-demo__feature:hover{transform:translateY(-2px);box-shadow:0 4px 16px #0000001f}.charts-demo__feature h3{color:#1a1a1a;margin:0 0 8px;font-size:18px}.charts-demo__feature p{color:#666;margin:0;line-height:1.6}.profit-positive{color:#2e7d32;font-weight:600}.profit-negative{color:#c62828;font-weight:600}@media (max-width:768px){.charts-demo{padding:16px}.charts-demo__title{font-size:24px}.charts-demo__toolbar{flex-direction:column;align-items:stretch}.charts-demo__btn{justify-content:center;width:100%}.charts-demo__selection-info{text-align:center;margin-left:0}.charts-demo__feature-grid{grid-template-columns:1fr}}#root{width:100%;height:100%}.btn-primary{color:#fff;cursor:pointer;background-color:#06c;border:none;border-radius:4px;padding:8px 16px;font-size:14px;font-weight:500;transition:all .2s}.btn-primary:hover{background-color:#0052a3;box-shadow:0 2px 8px #06c3}.btn-primary:active{background-color:#003d7a;transform:translateY(1px)}.btn-secondary{color:#262626;cursor:pointer;background-color:#fff;border:1px solid #d9d9d9;border-radius:4px;padding:8px 16px;font-size:14px;font-weight:500;transition:all .2s}.btn-secondary:hover{background-color:#f5f5f5;border-color:#bfbfbf}.datagrid-container{background-color:#fff;border:1px solid #d9d9d9;border-radius:4px;overflow:hidden;box-shadow:0 1px 3px #00000014}.datagrid-toolbar{background-color:#fafafa;border-bottom:1px solid #efefef;justify-content:space-between;align-items:center;gap:12px;padding:12px 16px;display:flex}.datagrid-toolbar-title{color:#262626;font-size:14px;font-weight:600}.filter-input{border:1px solid #d9d9d9;border-radius:4px;padding:6px 12px;font-size:14px;transition:all .2s}.filter-input:focus{border-color:#06c;outline:none;box-shadow:0 0 0 3px #0066cc1a}.loading-state{color:#8c8c8c;justify-content:center;align-items:center;height:400px;font-size:14px;display:flex}@media (max-width:768px){.datagrid-toolbar{flex-direction:column;align-items:flex-start}}
|