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.
Files changed (73) hide show
  1. package/dist/lib/index.cjs +152 -190
  2. package/dist/lib/index.js +150 -188
  3. package/package.json +8 -37
  4. package/dist/404.html +0 -23
  5. package/dist/CNAME +0 -1
  6. package/dist/assets/components/AccessibilityDemo.d.ts +0 -8
  7. package/dist/assets/components/ApiReferencePage.d.ts +0 -2
  8. package/dist/assets/components/BenchmarkDemo.d.ts +0 -2
  9. package/dist/assets/components/CellRenderersDemo.d.ts +0 -16
  10. package/dist/assets/components/CodeBlock.d.ts +0 -10
  11. package/dist/assets/components/ColumnFiltersDemo.d.ts +0 -5
  12. package/dist/assets/components/CompleteApiReferencePage.d.ts +0 -2
  13. package/dist/assets/components/ContextMenuDemo.d.ts +0 -12
  14. package/dist/assets/components/DemoGridPage.d.ts +0 -2
  15. package/dist/assets/components/DensityModeDemo.d.ts +0 -12
  16. package/dist/assets/components/FacetedSearchDemo.d.ts +0 -8
  17. package/dist/assets/components/FeatureGallery.d.ts +0 -2
  18. package/dist/assets/components/FilteredSearchDemo.d.ts +0 -7
  19. package/dist/assets/components/GridApiDemoPage.d.ts +0 -2
  20. package/dist/assets/components/InfiniteScrollDemo.d.ts +0 -13
  21. package/dist/assets/components/LayoutPersistenceDemo.d.ts +0 -2
  22. package/dist/assets/components/LiveMarketDemo.d.ts +0 -18
  23. package/dist/assets/components/MarketDataExamples.d.ts +0 -42
  24. package/dist/assets/components/RowDraggingDemo.d.ts +0 -3
  25. package/dist/assets/components/RowPinningDemo.d.ts +0 -12
  26. package/dist/assets/components/ThemesDemo.d.ts +0 -17
  27. package/dist/assets/components/TooltipDemo.d.ts +0 -1
  28. package/dist/assets/components/TreeDataDemo.d.ts +0 -3
  29. package/dist/assets/components/VirtualScrollDemo.d.ts +0 -13
  30. package/dist/assets/index-BzDbdtZY.css +0 -1
  31. package/dist/assets/index-DHtd8tTR.js +0 -2273
  32. package/dist/assets/index.js +0 -1
  33. package/dist/assets/layoutPersistence-C509RwQB.js +0 -1
  34. package/dist/docs/ACCESSIBILITY_VPAT.pdf +0 -0
  35. package/dist/index.html +0 -105
  36. package/dist/lib/App.d.ts +0 -3
  37. package/dist/lib/components/AccessibilityDemo.d.ts +0 -8
  38. package/dist/lib/components/AdvancedEditorsDemo.d.ts +0 -15
  39. package/dist/lib/components/ApiReferencePage.d.ts +0 -2
  40. package/dist/lib/components/BenchmarkDemo.d.ts +0 -2
  41. package/dist/lib/components/CellRenderersDemo.d.ts +0 -16
  42. package/dist/lib/components/ChartsDemo.d.ts +0 -9
  43. package/dist/lib/components/CodeBlock.d.ts +0 -16
  44. package/dist/lib/components/ColumnFiltersDemo.d.ts +0 -5
  45. package/dist/lib/components/CompleteApiReferencePage.d.ts +0 -2
  46. package/dist/lib/components/ContextMenuDemo.d.ts +0 -12
  47. package/dist/lib/components/DemoGridPage.d.ts +0 -3
  48. package/dist/lib/components/DensityModeDemo.d.ts +0 -12
  49. package/dist/lib/components/FacetedSearchDemo.d.ts +0 -8
  50. package/dist/lib/components/FeatureGallery.d.ts +0 -2
  51. package/dist/lib/components/FilteredSearchDemo.d.ts +0 -7
  52. package/dist/lib/components/GridApiDemoPage.d.ts +0 -2
  53. package/dist/lib/components/GroupByDemo.d.ts +0 -3
  54. package/dist/lib/components/HomePage.d.ts +0 -1
  55. package/dist/lib/components/HorizontalScrollBugDemo.d.ts +0 -2
  56. package/dist/lib/components/InfiniteScrollDemo.d.ts +0 -13
  57. package/dist/lib/components/LayoutPersistenceDemo.d.ts +0 -2
  58. package/dist/lib/components/LiveMarketDemo.d.ts +0 -18
  59. package/dist/lib/components/MarketDataExamples.d.ts +0 -42
  60. package/dist/lib/components/MasterDetailDemo.d.ts +0 -2
  61. package/dist/lib/components/PivotDemo.d.ts +0 -8
  62. package/dist/lib/components/RowDraggingDemo.d.ts +0 -3
  63. package/dist/lib/components/RowPinningDemo.d.ts +0 -12
  64. package/dist/lib/components/ServerSideFeaturesDemo.d.ts +0 -10
  65. package/dist/lib/components/ThemesDemo.d.ts +0 -17
  66. package/dist/lib/components/TooltipDemo.d.ts +0 -1
  67. package/dist/lib/components/TreeDataDemo.d.ts +0 -3
  68. package/dist/lib/components/VirtualScrollDemo.d.ts +0 -13
  69. package/dist/lib/main.d.ts +0 -1
  70. package/dist/logo.png +0 -0
  71. package/dist/robots.txt +0 -11
  72. package/dist/sitemap.xml +0 -180
  73. 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,10 +0,0 @@
1
- import React from 'react';
2
- interface CodeBlockProps {
3
- code: string;
4
- language?: string;
5
- title?: string;
6
- showLineNumbers?: boolean;
7
- maxHeight?: string;
8
- }
9
- export declare const CodeBlock: React.FC<CodeBlockProps>;
10
- export default CodeBlock;
@@ -1,5 +0,0 @@
1
- import React from 'react';
2
- /**
3
- * Demo component showcasing the Column Filters feature
4
- */
5
- export declare const ColumnFiltersDemo: React.FC;
@@ -1,2 +0,0 @@
1
- import React from 'react';
2
- export declare const CompleteApiReferencePage: 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,2 +0,0 @@
1
- import React from 'react';
2
- export declare const DemoGridPage: React.FC;
@@ -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,8 +0,0 @@
1
- /**
2
- * FacetedSearchDemo Component
3
- *
4
- * Demonstrates the FacetedSearch feature with e-commerce and analytics use cases.
5
- */
6
- import React from 'react';
7
- export declare const FacetedSearchDemo: React.FC;
8
- export default FacetedSearchDemo;
@@ -1,2 +0,0 @@
1
- export declare const FeatureGallery: () => import("react/jsx-runtime").JSX.Element;
2
- export default FeatureGallery;
@@ -1,7 +0,0 @@
1
- import React from 'react';
2
- /**
3
- * FilteredSearchDemo - Showcase of Advanced Search with Token-Based Filtering
4
- * Similar to GitLab/GitHub's advanced search interface
5
- */
6
- export declare const FilteredSearchDemo: React.FC;
7
- export default FilteredSearchDemo;
@@ -1,2 +0,0 @@
1
- import React from 'react';
2
- export declare const GridApiDemoPage: 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,2 +0,0 @@
1
- import React from 'react';
2
- export declare const LayoutPersistenceDemo: React.FC;
@@ -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,3 +0,0 @@
1
- import React from 'react';
2
- export declare const RowDraggingDemo: React.FC;
3
- export default RowDraggingDemo;
@@ -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,3 +0,0 @@
1
- import React from 'react';
2
- export declare const TreeDataDemo: React.FC;
3
- export default TreeDataDemo;
@@ -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}}