react-auto-smart-table 1.0.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/README.md ADDED
@@ -0,0 +1,130 @@
1
+ # React Smart Table ✨
2
+
3
+ > A zero-configuration, intelligent data table for React that visually explains your data instantly.
4
+
5
+ ![Demo Banner](https://via.placeholder.com/800x400?text=React+Smart+Table+Demo) <!-- Placeholder for hero image -->
6
+
7
+ Drop in your raw JSON datasets and watch `<SmartTable />` automatically infer the schema, generate columns, detect semantic types, allow rich filtering, wire sorting heuristics, and build beautiful analytics widgets.
8
+
9
+ All powered by an intelligent Schema Inference Engine scaling up to 10,000+ virtualized rows gracefully.
10
+
11
+ ---
12
+
13
+ ## ⚡ Features
14
+
15
+ - 🧠 **Zero-Config Schema Inference:** Pass an array of objects. That's it. It automatically figures out if columns are emails, URLs, dates, currenices, booleans, or percentages.
16
+ - 🎨 **Semantic Cell Renderers:** Emails become clickable, booleans become Badges, Currencies format intelligently.
17
+ - 📊 **Insight Engine Chart Generation:** Enable the `insights` prop to instantly detect groupings and metrics. We manufacture Recharts widgets out of thin air to visualize your table data perfectly.
18
+ - 🎛️ **Intelligent Filtering & Sorting:** Deep filtering built-in. Strings get fuzzy search, numbers get min/max range sliders, dates get calendar pickers.
19
+ - 🚀 **Extreme Performance:** Built on `react-virtual`, instantly renders lists with thousands of objects without freezing the DOM.
20
+ - 🔌 **Plugin SDK:** Inject your own custom Type Detectors and Cell Renderers. Want to render a bespoke Jira Ticket tag? Register a plugin in 3 lines of code.
21
+
22
+ ---
23
+
24
+ ## 📦 Installation
25
+ ```bash
26
+ npm install react-smart-table
27
+ ```
28
+
29
+ *(Note: Ensure you have `react`, `react-dom`, and `recharts` installed as peer dependencies)*
30
+
31
+ ```bash
32
+ npm install react react-dom recharts
33
+ ```
34
+
35
+ ---
36
+
37
+ ## 🎮 Interactive Playing (Demo)
38
+
39
+ Want to see `<SmartTable />` in action immediately? We have provided a live React playground.
40
+
41
+ ```bash
42
+ cd playground
43
+ npm install
44
+ npm run dev
45
+ ```
46
+
47
+ ---
48
+
49
+ ## 🚀 Basic Usage
50
+
51
+ The design philosophy is that one line of code builds a functional dashboard.
52
+
53
+ ```tsx
54
+ import React from 'react';
55
+ import { SmartTable } from 'react-smart-table';
56
+
57
+ const dataset = [
58
+ { id: 1, name: "Alice", email: "alice@example.com", revenue: 5400.5, active: true },
59
+ { id: 2, name: "Bob", email: "bob@example.com", revenue: 800.75, active: false },
60
+ // ... thousands of rows
61
+ ];
62
+
63
+ export function App() {
64
+ return (
65
+ <div style={{ height: '600px' }}>
66
+ {/* 1 Line. Infinite Power. */}
67
+ <SmartTable data={dataset} />
68
+ </div>
69
+ );
70
+ }
71
+ ```
72
+
73
+ ---
74
+
75
+ ## 🔥 Advanced Usage
76
+
77
+ Unlock the full suite of the table by opting into features via component props.
78
+
79
+ ```tsx
80
+ <SmartTable
81
+ data={dataset}
82
+ sortable={true}
83
+ filterable={true}
84
+ pagination={true}
85
+ insights={true} // Triggers the Recharts visualizer
86
+ />
87
+ ```
88
+
89
+ ### Writing a Custom Plugin
90
+
91
+ Need custom parsing rules? Override the inference engine!
92
+
93
+ ```tsx
94
+ import { SmartTable, SmartTablePlugin } from 'react-smart-table';
95
+
96
+ const customStatusPlugin: SmartTablePlugin = {
97
+ detect: (key, sample) => {
98
+ // If column name has 'status', take it over.
99
+ if (key.toLowerCase() === 'status') return 'custom-status';
100
+ return null;
101
+ },
102
+ render: ({ value }) => {
103
+ const color = value === 'Failed' ? 'red' : 'green';
104
+ return <span style={{ color }}>{value}</span>;
105
+ }
106
+ }
107
+
108
+ // Pass it into the component
109
+ <SmartTable data={dataset} plugins={[customStatusPlugin]} />
110
+ ```
111
+
112
+ ---
113
+
114
+ ## 🏗️ Architecture
115
+
116
+ - **Phase 1: Analytics Inference:** Calculates confidence scores based on sampled rows resolving deterministic types (`src/analyzer`).
117
+ - **Phase 2: Renderer Factory:** Injects React nodes based on the schema mapping output.
118
+ - **Phase 3: Hook Isolation:** Filters, Sorting, and Pagination maintain their own state context cleanly separated from UI templates.
119
+ - **Phase 4: Insight Builder:** Generates aggregation metrics traversing Categorical parameters vs Numeric outputs building a configuration map for rendering Recharts.
120
+
121
+ ## 💡 Contributing
122
+
123
+ We welcome pull requests and issues!
124
+
125
+ 1. Clone the repository
126
+ 2. Run `npm install`
127
+ 3. Run Vitest Unit/Integration testing suit `npm run test`
128
+
129
+ ---
130
+ *Created carefully using rigorous step-based execution.*
package/dist/index.css ADDED
@@ -0,0 +1,404 @@
1
+ @import "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap";
2
+
3
+ /* src/styles.css */
4
+ :root {
5
+ --rst-primary: #6366f1;
6
+ --rst-primary-soft: rgba(99, 102, 241, 0.1);
7
+ --rst-bg: #f8fafc;
8
+ --rst-card-bg: #ffffff;
9
+ --rst-border: #e2e8f0;
10
+ --rst-text-main: #1e293b;
11
+ --rst-text-muted: #64748b;
12
+ --rst-text-title: #0f172a;
13
+ --rst-radius: 12px;
14
+ --rst-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
15
+ --rst-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
16
+ }
17
+ .rst-container {
18
+ font-family:
19
+ "Inter",
20
+ system-ui,
21
+ -apple-system,
22
+ sans-serif;
23
+ color: var(--rst-text-main);
24
+ background-color: transparent;
25
+ width: 100%;
26
+ max-width: 1400px;
27
+ margin: 0 auto;
28
+ display: flex;
29
+ flex-direction: column;
30
+ gap: 24px;
31
+ min-width: 0;
32
+ }
33
+ .rst-main-header {
34
+ margin-bottom: 8px;
35
+ }
36
+ .rst-main-header h2 {
37
+ font-size: 24px;
38
+ font-weight: 700;
39
+ color: var(--rst-text-title);
40
+ margin: 0 0 4px 0;
41
+ }
42
+ .rst-main-header p {
43
+ font-size: 14px;
44
+ color: var(--rst-text-muted);
45
+ margin: 0;
46
+ }
47
+ .rst-toggle-filters-btn {
48
+ background: transparent;
49
+ border: 1px solid var(--rst-border);
50
+ color: var(--rst-text-muted);
51
+ padding: 6px 12px;
52
+ border-radius: 8px;
53
+ font-size: 12px;
54
+ font-weight: 600;
55
+ cursor: pointer;
56
+ transition: all 0.2s;
57
+ }
58
+ .rst-toggle-filters-btn:hover {
59
+ background: #f1f5f9;
60
+ color: var(--rst-primary);
61
+ border-color: var(--rst-primary);
62
+ }
63
+ .rst-summary-strip {
64
+ display: flex;
65
+ align-items: center;
66
+ flex-wrap: wrap;
67
+ gap: 8px;
68
+ margin-bottom: 4px;
69
+ font-size: 13px;
70
+ color: var(--rst-text-muted);
71
+ font-weight: 500;
72
+ }
73
+ .rst-dot {
74
+ color: #cbd5e1;
75
+ }
76
+ .rst-card {
77
+ background: var(--rst-card-bg);
78
+ border-radius: var(--rst-radius);
79
+ border: 1px solid var(--rst-border);
80
+ box-shadow: var(--rst-shadow);
81
+ overflow: hidden;
82
+ }
83
+ .rst-insights-panel {
84
+ display: flex;
85
+ flex-direction: column;
86
+ gap: 16px;
87
+ }
88
+ .rst-insights-panel h3 {
89
+ font-size: 18px;
90
+ font-weight: 600;
91
+ color: var(--rst-text-title);
92
+ margin: 0;
93
+ }
94
+ .rst-insights-grid {
95
+ display: grid;
96
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
97
+ gap: 24px;
98
+ }
99
+ .rst-insight-card {
100
+ background: var(--rst-card-bg) !important;
101
+ border: 1px solid var(--rst-border) !important;
102
+ border-radius: var(--rst-radius) !important;
103
+ padding: 16px !important;
104
+ box-shadow: var(--rst-shadow) !important;
105
+ transition: transform 0.2s ease, box-shadow 0.2s ease !important;
106
+ max-width: 100%;
107
+ box-sizing: border-box;
108
+ }
109
+ .rst-insight-card:hover {
110
+ transform: translateY(-2px);
111
+ box-shadow: var(--rst-shadow-lg) !important;
112
+ }
113
+ .rst-insight-card h4.rst-insight-title {
114
+ font-size: 14px;
115
+ font-weight: 600;
116
+ color: var(--rst-text-title) !important;
117
+ margin: 0 0 20px 0 !important;
118
+ display: block;
119
+ border-bottom: 1px solid #f1f5f9;
120
+ padding-bottom: 12px;
121
+ }
122
+ .rst-filter-panel {
123
+ padding: 24px;
124
+ display: grid !important;
125
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
126
+ gap: 16px;
127
+ }
128
+ .rst-filter-group {
129
+ display: flex;
130
+ flex-direction: column;
131
+ gap: 8px;
132
+ }
133
+ .rst-filter-group label {
134
+ font-size: 13px;
135
+ font-weight: 600;
136
+ color: var(--rst-text-muted);
137
+ }
138
+ .rst-filter-group input {
139
+ width: 100%;
140
+ padding: 10px 12px;
141
+ border: 1px solid var(--rst-border);
142
+ border-radius: 8px;
143
+ font-size: 14px;
144
+ color: var(--rst-text-title);
145
+ background: #fff;
146
+ transition: all 0.2s ease;
147
+ outline: none;
148
+ }
149
+ .rst-filter-group input:hover {
150
+ border-color: #cbd5e1;
151
+ }
152
+ .rst-filter-group input:focus {
153
+ border-color: var(--rst-primary);
154
+ box-shadow: 0 0 0 3px var(--rst-primary-soft);
155
+ }
156
+ .rst-filter-clear-btn {
157
+ grid-column: 1 / -1;
158
+ justify-self: start;
159
+ padding: 8px 16px;
160
+ background-color: #f1f5f9;
161
+ color: #475569;
162
+ border: 1px solid var(--rst-border);
163
+ border-radius: 8px;
164
+ font-size: 13px;
165
+ font-weight: 600;
166
+ cursor: pointer;
167
+ transition: background-color 0.15s;
168
+ }
169
+ .rst-filter-clear-btn:hover {
170
+ background-color: #e2e8f0;
171
+ }
172
+ .rst-filter-range {
173
+ display: flex;
174
+ gap: 8px;
175
+ }
176
+ .rst-filter-range input {
177
+ flex: 1;
178
+ min-width: 0;
179
+ }
180
+ .rst-filter-toggle {
181
+ padding: 10px 12px;
182
+ border: 1px solid var(--rst-border);
183
+ border-radius: 8px;
184
+ font-size: 14px;
185
+ font-weight: 500;
186
+ cursor: pointer;
187
+ transition: all 0.2s;
188
+ text-align: center;
189
+ }
190
+ .rst-filter-toggle:hover {
191
+ border-color: #cbd5e1;
192
+ }
193
+ .rst-table-container {
194
+ overflow-x: auto;
195
+ width: 100%;
196
+ max-width: 100%;
197
+ min-width: 0;
198
+ }
199
+ .rst-table {
200
+ width: 100%;
201
+ min-width: 800px;
202
+ border-collapse: separate;
203
+ border-spacing: 0;
204
+ background-color: var(--rst-card-bg);
205
+ text-align: left;
206
+ table-layout: auto;
207
+ }
208
+ .rst-table thead,
209
+ .rst-table tbody {
210
+ width: 100%;
211
+ }
212
+ .rst-table thead {
213
+ position: sticky;
214
+ top: 0;
215
+ z-index: 10;
216
+ }
217
+ .rst-table th {
218
+ background-color: #f8fafc;
219
+ color: var(--rst-text-muted);
220
+ font-weight: 600;
221
+ font-size: 12px;
222
+ letter-spacing: 0.05em;
223
+ padding: 12px 14px;
224
+ border-bottom: 1px solid var(--rst-border);
225
+ text-transform: uppercase;
226
+ white-space: nowrap;
227
+ }
228
+ .rst-table td {
229
+ padding: 12px 14px;
230
+ border-bottom: 1px solid #f1f5f9;
231
+ color: var(--rst-text-main);
232
+ font-size: 14px;
233
+ line-height: 1.5;
234
+ transition: background-color 0.15s ease;
235
+ }
236
+ .rst-col-xs {
237
+ width: 60px;
238
+ min-width: 60px;
239
+ }
240
+ .rst-col-sm {
241
+ width: 120px;
242
+ min-width: 120px;
243
+ }
244
+ .rst-col-md {
245
+ width: 160px;
246
+ min-width: 160px;
247
+ }
248
+ .rst-col-lg {
249
+ width: 220px;
250
+ min-width: 220px;
251
+ }
252
+ .rst-col-flex {
253
+ min-width: 200px;
254
+ }
255
+ .rst-td {
256
+ overflow: hidden;
257
+ text-overflow: ellipsis;
258
+ white-space: nowrap;
259
+ }
260
+ .rst-td-type-email,
261
+ .rst-td-type-url,
262
+ .rst-td-col-description {
263
+ white-space: normal;
264
+ word-break: break-word;
265
+ }
266
+ .rst-td-type-number,
267
+ .rst-th-type-number,
268
+ .rst-td-type-currency,
269
+ .rst-th-type-currency,
270
+ .rst-td-type-percentage,
271
+ .rst-th-type-percentage,
272
+ .rst-td-col-revenue,
273
+ .rst-th-col-revenue,
274
+ .rst-td-col-amount,
275
+ .rst-th-col-amount,
276
+ .rst-td-col-price,
277
+ .rst-th-col-price,
278
+ .rst-td-col-score,
279
+ .rst-th-col-score {
280
+ text-align: right;
281
+ font-variant-numeric: tabular-nums;
282
+ }
283
+ .rst-th-type-number .rst-header-content,
284
+ .rst-th-type-currency .rst-header-content,
285
+ .rst-th-type-percentage .rst-header-content,
286
+ .rst-th-col-revenue .rst-header-content,
287
+ .rst-th-col-amount .rst-header-content,
288
+ .rst-th-col-price .rst-header-content,
289
+ .rst-th-col-score .rst-header-content {
290
+ justify-content: flex-end;
291
+ }
292
+ .rst-badge {
293
+ display: inline-flex;
294
+ align-items: center;
295
+ justify-content: center;
296
+ min-width: 48px;
297
+ padding: 4px 10px;
298
+ border-radius: 999px;
299
+ font-size: 11px;
300
+ font-weight: 700;
301
+ text-transform: uppercase;
302
+ letter-spacing: 0.02em;
303
+ }
304
+ .rst-badge-yes {
305
+ background: #dcfce7;
306
+ color: #166534;
307
+ }
308
+ .rst-badge-no {
309
+ background: #fee2e2;
310
+ color: #991b1b;
311
+ }
312
+ .rst-table tbody tr {
313
+ transition: background-color 0.2s ease;
314
+ }
315
+ .rst-table tbody tr:nth-child(even) {
316
+ background-color: #fafafa;
317
+ }
318
+ .rst-table tbody tr:hover {
319
+ background-color: #f1f5f9;
320
+ }
321
+ .rst-sortable {
322
+ cursor: pointer;
323
+ }
324
+ .rst-sortable:hover {
325
+ background-color: #f1f5f9;
326
+ color: var(--rst-primary);
327
+ }
328
+ .rst-sort-icon {
329
+ font-size: 10px;
330
+ margin-left: 6px;
331
+ opacity: 0.5;
332
+ transition: opacity 0.2s, color 0.2s;
333
+ }
334
+ .rst-sort-active .rst-sort-icon {
335
+ opacity: 1;
336
+ color: var(--rst-primary);
337
+ }
338
+ .rst-pagination {
339
+ padding: 16px 24px;
340
+ display: flex;
341
+ justify-content: flex-end;
342
+ align-items: center;
343
+ gap: 16px;
344
+ background-color: #fff;
345
+ border-top: 1px solid var(--rst-border);
346
+ }
347
+ .rst-pagination button {
348
+ background-color: #ffffff;
349
+ border: 1px solid var(--rst-border);
350
+ color: #475569;
351
+ font-weight: 500;
352
+ padding: 8px 14px;
353
+ border-radius: 8px;
354
+ font-size: 13px;
355
+ cursor: pointer;
356
+ transition: all 0.2s;
357
+ }
358
+ .rst-pagination button:hover:not(:disabled) {
359
+ background-color: #f1f5f9;
360
+ border-color: #cbd5e1;
361
+ }
362
+ .rst-pagination button:disabled {
363
+ opacity: 0.5;
364
+ cursor: not-allowed;
365
+ background-color: #f8fafc;
366
+ }
367
+ .rst-pagination span {
368
+ font-size: 13px;
369
+ font-weight: 500;
370
+ color: var(--rst-text-muted);
371
+ }
372
+ @media (max-width: 800px) {
373
+ .rst-container {
374
+ padding: 0;
375
+ max-width: 100%;
376
+ overflow: hidden;
377
+ }
378
+ .rst-insights-grid {
379
+ grid-template-columns: 1fr;
380
+ gap: 16px;
381
+ width: 100%;
382
+ }
383
+ .rst-insight-card {
384
+ padding: 12px !important;
385
+ }
386
+ .rst-filter-panel {
387
+ padding: 12px;
388
+ grid-template-columns: 1fr;
389
+ }
390
+ .rst-summary-strip {
391
+ font-size: 11px;
392
+ gap: 4px;
393
+ }
394
+ }
395
+ .rst-empty {
396
+ padding: 64px;
397
+ text-align: center;
398
+ color: var(--rst-text-muted);
399
+ background-color: var(--rst-card-bg);
400
+ border-radius: var(--rst-radius);
401
+ border: 2px dashed var(--rst-border);
402
+ font-size: 15px;
403
+ }
404
+ /*# sourceMappingURL=index.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/styles.css"],"sourcesContent":["/* SmartTable Modern Premium Dashboard UI */\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');\n\n:root {\n --rst-primary: #6366f1;\n --rst-primary-soft: rgba(99, 102, 241, 0.1);\n --rst-bg: #f8fafc;\n --rst-card-bg: #ffffff;\n --rst-border: #e2e8f0;\n --rst-text-main: #1e293b;\n --rst-text-muted: #64748b;\n --rst-text-title: #0f172a;\n --rst-radius: 12px;\n --rst-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --rst-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n}\n\n.rst-container {\n font-family: 'Inter', system-ui, -apple-system, sans-serif;\n color: var(--rst-text-main);\n background-color: transparent;\n width: 100%;\n max-width: 1400px;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: 24px;\n min-width: 0;\n}\n\n/* Layout Sections */\n.rst-main-header {\n margin-bottom: 8px;\n}\n\n.rst-main-header h2 {\n font-size: 24px;\n font-weight: 700;\n color: var(--rst-text-title);\n margin: 0 0 4px 0;\n}\n\n.rst-main-header p {\n font-size: 14px;\n color: var(--rst-text-muted);\n margin: 0;\n}\n\n.rst-toggle-filters-btn {\n background: transparent;\n border: 1px solid var(--rst-border);\n color: var(--rst-text-muted);\n padding: 6px 12px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.rst-toggle-filters-btn:hover {\n background: #f1f5f9;\n color: var(--rst-primary);\n border-color: var(--rst-primary);\n}\n\n.rst-summary-strip {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n margin-bottom: 4px;\n font-size: 13px;\n color: var(--rst-text-muted);\n font-weight: 500;\n}\n\n.rst-dot {\n color: #cbd5e1;\n}\n\n.rst-card {\n background: var(--rst-card-bg);\n border-radius: var(--rst-radius);\n border: 1px solid var(--rst-border);\n box-shadow: var(--rst-shadow);\n overflow: hidden;\n}\n\n/* Insights Panel Styles */\n.rst-insights-panel {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.rst-insights-panel h3 {\n font-size: 18px;\n font-weight: 600;\n color: var(--rst-text-title);\n margin: 0;\n}\n\n.rst-insights-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 24px;\n}\n\n.rst-insight-card {\n background: var(--rst-card-bg) !important;\n border: 1px solid var(--rst-border) !important;\n border-radius: var(--rst-radius) !important;\n padding: 16px !important;\n box-shadow: var(--rst-shadow) !important;\n transition: transform 0.2s ease, box-shadow 0.2s ease !important;\n max-width: 100%;\n box-sizing: border-box;\n}\n\n.rst-insight-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--rst-shadow-lg) !important;\n}\n\n.rst-insight-card h4.rst-insight-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--rst-text-title) !important;\n margin: 0 0 20px 0 !important;\n display: block;\n border-bottom: 1px solid #f1f5f9;\n padding-bottom: 12px;\n}\n\n/* Filter Panel Styles */\n.rst-filter-panel {\n padding: 24px;\n display: grid !important;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 16px;\n}\n\n.rst-filter-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.rst-filter-group label {\n font-size: 13px;\n font-weight: 600;\n color: var(--rst-text-muted);\n}\n\n.rst-filter-group input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--rst-border);\n border-radius: 8px;\n font-size: 14px;\n color: var(--rst-text-title);\n background: #fff;\n transition: all 0.2s ease;\n outline: none;\n}\n\n.rst-filter-group input:hover {\n border-color: #cbd5e1;\n}\n\n.rst-filter-group input:focus {\n border-color: var(--rst-primary);\n box-shadow: 0 0 0 3px var(--rst-primary-soft);\n}\n\n.rst-filter-clear-btn {\n grid-column: 1 / -1;\n justify-self: start;\n padding: 8px 16px;\n background-color: #f1f5f9;\n color: #475569;\n border: 1px solid var(--rst-border);\n border-radius: 8px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: background-color 0.15s;\n}\n\n.rst-filter-clear-btn:hover {\n background-color: #e2e8f0;\n}\n\n.rst-filter-range {\n display: flex;\n gap: 8px;\n}\n\n.rst-filter-range input {\n flex: 1;\n min-width: 0;\n}\n\n.rst-filter-toggle {\n padding: 10px 12px;\n border: 1px solid var(--rst-border);\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n text-align: center;\n}\n\n.rst-filter-toggle:hover {\n border-color: #cbd5e1;\n}\n\n/* Table Container & Table Styles */\n.rst-table-container {\n overflow-x: auto;\n width: 100%;\n max-width: 100%;\n min-width: 0;\n}\n\n.rst-table {\n width: 100%;\n min-width: 800px; /* Reduced from 900px to be slightly more mobile-friendly */\n border-collapse: separate;\n border-spacing: 0;\n background-color: var(--rst-card-bg);\n text-align: left;\n table-layout: auto;\n}\n\n.rst-table thead, .rst-table tbody {\n width: 100%;\n}\n\n.rst-table thead {\n position: sticky;\n top: 0;\n z-index: 10;\n}\n\n.rst-table th {\n background-color: #f8fafc;\n color: var(--rst-text-muted);\n font-weight: 600;\n font-size: 12px;\n letter-spacing: 0.05em;\n padding: 12px 14px;\n border-bottom: 1px solid var(--rst-border);\n text-transform: uppercase;\n white-space: nowrap;\n}\n\n.rst-table td {\n padding: 12px 14px;\n border-bottom: 1px solid #f1f5f9;\n color: var(--rst-text-main);\n font-size: 14px;\n line-height: 1.5;\n transition: background-color 0.15s ease;\n}\n\n/* Adaptive Width Classes */\n.rst-col-xs { width: 60px; min-width: 60px; }\n.rst-col-sm { width: 120px; min-width: 120px; }\n.rst-col-md { width: 160px; min-width: 160px; }\n.rst-col-lg { width: 220px; min-width: 220px; }\n.rst-col-flex { min-width: 200px; }\n\n/* Content Control */\n.rst-td {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.rst-td-type-email, .rst-td-type-url, .rst-td-col-description {\n white-space: normal;\n word-break: break-word;\n}\n\n/* Numeric Columns Alignment */\n.rst-td-type-number, .rst-th-type-number,\n.rst-td-type-currency, .rst-th-type-currency,\n.rst-td-type-percentage, .rst-th-type-percentage,\n.rst-td-col-revenue, .rst-th-col-revenue,\n.rst-td-col-amount, .rst-th-col-amount,\n.rst-td-col-price, .rst-th-col-price,\n.rst-td-col-score, .rst-th-col-score {\n text-align: right;\n font-variant-numeric: tabular-nums;\n}\n\n.rst-th-type-number .rst-header-content,\n.rst-th-type-currency .rst-header-content,\n.rst-th-type-percentage .rst-header-content,\n.rst-th-col-revenue .rst-header-content,\n.rst-th-col-amount .rst-header-content,\n.rst-th-col-price .rst-header-content,\n.rst-th-col-score .rst-header-content {\n justify-content: flex-end;\n}\n\n/* Status Badges */\n.rst-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 48px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.02em;\n}\n\n.rst-badge-yes {\n background: #dcfce7;\n color: #166534;\n}\n\n.rst-badge-no {\n background: #fee2e2;\n color: #991b1b;\n}\n\n.rst-table tbody tr {\n transition: background-color 0.2s ease;\n}\n\n.rst-table tbody tr:nth-child(even) {\n background-color: #fafafa;\n}\n\n.rst-table tbody tr:hover {\n background-color: #f1f5f9;\n}\n\n/* Sort & Column Helpers */\n.rst-sortable {\n cursor: pointer;\n}\n\n.rst-sortable:hover {\n background-color: #f1f5f9;\n color: var(--rst-primary);\n}\n\n.rst-sort-icon {\n font-size: 10px;\n margin-left: 6px;\n opacity: 0.5;\n transition: opacity 0.2s, color 0.2s;\n}\n\n.rst-sort-active .rst-sort-icon {\n opacity: 1;\n color: var(--rst-primary);\n}\n\n/* Pagination Styles */\n.rst-pagination {\n padding: 16px 24px;\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 16px;\n background-color: #fff;\n border-top: 1px solid var(--rst-border);\n}\n\n.rst-pagination button {\n background-color: #ffffff;\n border: 1px solid var(--rst-border);\n color: #475569;\n font-weight: 500;\n padding: 8px 14px;\n border-radius: 8px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.rst-pagination button:hover:not(:disabled) {\n background-color: #f1f5f9;\n border-color: #cbd5e1;\n}\n\n.rst-pagination button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n background-color: #f8fafc;\n}\n\n.rst-pagination span {\n font-size: 13px;\n font-weight: 500;\n color: var(--rst-text-muted);\n}\n\n/* Mobile/Desktop Stacking Rules */\n@media (max-width: 800px) {\n .rst-container {\n padding: 0;\n max-width: 100%;\n overflow: hidden;\n }\n \n .rst-insights-grid {\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n }\n \n .rst-insight-card {\n padding: 12px !important;\n }\n \n .rst-filter-panel {\n padding: 12px;\n grid-template-columns: 1fr;\n }\n \n .rst-summary-strip {\n font-size: 11px;\n gap: 4px;\n }\n}\n\n/* Empty State */\n.rst-empty {\n padding: 64px;\n text-align: center;\n color: var(--rst-text-muted);\n background-color: var(--rst-card-bg);\n border-radius: var(--rst-radius);\n border: 2px dashed var(--rst-border);\n font-size: 15px;\n}\n"],"mappings":"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","names":[]}