diff --git a/README.md b/README.md index 5af9a895513ea5c46e55a86206cef4ec66f59029..ef680b56b4cf536b5a15495cb970bdaa6f90f404 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,58 @@ --- title: Dataframe Sandbox -emoji: 📊 -colorFrom: red -colorTo: blue +emoji: 🔥 +colorFrom: pink +colorTo: gray sdk: static pinned: false -license: apache-2.0 app_build_command: npm run build app_file: dist/index.html --- -# @gradio/dataframe Demo +# Svelte + TS + Vite -An interactive demonstration of the `@gradio/dataframe` component showcasing its features including editing, searching, filtering, and various configuration options. +This template should help get you started developing with Svelte and TypeScript in Vite. -## Features +## Recommended IDE Setup -- 🎯 **Interactive Canvas** - Live dataframe component with real-time controls -- 📖 **Comprehensive Documentation** - Complete API reference and usage examples -- 🔍 **Event Handling** - Demonstration of component events and callbacks -- 💻 **Source Code** - Full implementation code with syntax highlighting -- 🌙 **Dark Mode** - Toggle between light and dark themes -- 📱 **Responsive Design** - Works on desktop and mobile devices -- 🛠️ **Resizable Controls** - Drag to adjust controls panel height +[VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). -## Usage +## Need an official Svelte framework? -Explore different dataframe configurations using the examples panel, adjust settings with the controls panel, and see real-time updates to understand the component's capabilities. +Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. -## Built with +## Technical considerations -- **Svelte 5** - Modern reactive framework -- **Vite** - Fast build tool and dev server -- **Tailwind CSS** - Utility-first CSS framework -- **@gradio/dataframe** - Standalone dataframe component +**Why use this over SvelteKit?** + +- It brings its own routing solution which might not be preferable for some users. +- It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. + +This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. + +Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate. + +**Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** + +Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information. + +**Why include `.vscode/extensions.json`?** + +Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project. + +**Why enable `allowJs` in the TS template?** + +While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant. + +**Why is HMR not preserving my local component state?** + +HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr). + +If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR. + +```ts +// store.ts +// An extremely simple external store +import { writable } from "svelte/store"; +export default writable(0); +``` diff --git a/index.html b/index.html index a1807858f82c05d9148ecb7229e750ba048e21ca..b6c5f0afafd6f2e009ed3d2c5de7351bcf7fb12d 100644 --- a/index.html +++ b/index.html @@ -1,9 +1,10 @@ - +
+ -- A standalone dataframe component from Gradio that provides interactive table functionality with editing, searching, and data manipulation capabilities. -
-- A standalone dataframe component from Gradio that provides interactive table functionality with editing, searching, and data manipulation capabilities. -
-npm install @gradio/dataframe
- | Prop | -Type | -Default | -Description | -
|---|---|---|---|
value |
- DataFrame | Array | List | -null | -Data to display. Supports pandas, numpy, polars, and list of lists | -
headers |
- string[] | -null | -List of column header names | -
datatype |
- string | string[] | -"str" | -Data types: "str", "number", "bool", "date", "markdown", "html", "image", "auto" | -
interactive |
- boolean | -null | -Whether users can edit the dataframe (inferred if not provided) | -
label |
- string | -null | -Label text that appears above the component | -
show_label |
- boolean | -null | -Whether to display the label | -
max_height |
- number | string | -500 | -Maximum height in pixels or CSS units | -
show_row_numbers |
- boolean | -false | -Display row numbers in a separate column | -
show_search |
- "none" | "search" | "filter" | -"none" | -Show search input and filter functionality | -
show_copy_button |
- boolean | -false | -Show button to copy table data to clipboard | -
show_fullscreen_button |
- boolean | -false | -Show button to view table in fullscreen mode | -
wrap |
- boolean | -false | -Enable text wrapping in table cells | -
line_breaks |
- boolean | -true | -Enable GitHub-flavored Markdown line breaks (for markdown columns) | -
column_widths |
- (string | number)[] | -null | -Width of each column in pixels ("100px") or percentage ("10%") | -
max_chars |
- number | -null | -Maximum characters to display per cell before truncating | -
row_count |
- number | [number, "fixed" | "dynamic"] | -[1, "dynamic"] | -Limit number of rows and whether users can add/delete rows | -
col_count |
- number | [number, "fixed" | "dynamic"] | -null | -Limit number of columns and whether users can add/delete columns | -
pinned_columns |
- number | -null | -Number of columns to pin from the left | -
static_columns |
- number[] | -null | -Column indices that should not be editable | -
type |
- "pandas" | "numpy" | "array" | "polars" | -"pandas" | -Type of value returned by the component | -
- The dataframe component fires several events that you can listen to for user interactions and data changes. -
-change
- Fired when the table data is modified by the user.
-select
- Fired when a cell is selected or focused.
-input
- Fired during user input, useful for real-time validation.
-All events provide data through the e.detail property:
- Complete example showing how to implement the dataframe component with all features. -
-+ Check out SvelteKit, the official Svelte app framework powered by Vite! +
- let datatype = ` + JSON.stringify(datatype) + `; ++ Click on the Vite and Svelte logos to learn more +
+ - function handleChange(e: any) { - console.log("Data changed:", e.detail); + diff --git a/src/app.css b/src/app.css index 9d5e2c38b7df3dc70ca99b79e20c8e892680ba4a..61ba367832ad77dd81568fe7b66af119713fb56f 100644 --- a/src/app.css +++ b/src/app.css @@ -1,696 +1,79 @@ -@import "tailwindcss"; - -/* Base styles */ -body { - margin: 0; - padding: 0; - font-family: "Nunito Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; - font-size: 14px; - line-height: 1.6; - color: #2e3438; - background-color: #f6f9fc; -} - -/* Storybook-specific styles */ -.storybook-header { - font-family: "Nunito Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; -} - -/* Override link styles for Storybook design */ -a { - color: inherit; - text-decoration: none; -} - -/* Button reset for Storybook style */ -button { - font-family: inherit; - border: none; - cursor: pointer; - background: none; -} - -/* Input styles for controls */ -input, select { - font-family: inherit; -} - -/* Storybook accent colors */ :root { - --storybook-primary: #F87701; - --storybook-secondary: #ff4785; - --storybook-green: #37d67a; - --storybook-orange: #fc521f; - --storybook-yellow: #ffae00; - --storybook-red: #fa5a5a; - --storybook-gray-1: #f6f9fc; - --storybook-gray-2: #e0e0e0; - --storybook-gray-3: #999; - --storybook-gray-4: #666; - --storybook-gray-5: #333; - --storybook-gray-6: #2b2b2b; - --storybook-gray-7: #1a1a1a; -} - -/* Gradio Dataframe CSS Variables */ -:root { - --gr-df-table-bg-even: #ffffff; - --gr-df-table-bg-odd: #f9fafb; - --gr-df-copied-cell-color: #dbeafe; - --gr-df-table-border: #e5e7eb; - --gr-df-table-text: #374151; - --gr-df-accent: #3b82f6; - --gr-df-accent-soft: #dbeafe; - --gr-df-font-size: 14px; - --gr-df-font-mono: ui-monospace, SFMono-Regular, monospace; - --gr-df-font-sans: system-ui, -apple-system, sans-serif; - --gr-df-table-radius: 8px; -} - - -/* Custom theme examples */ -.purple-theme { - --gr-df-accent: #7c3aed; - --gr-df-accent-soft: #ede9fe; - --gr-df-copied-cell-color: #ede9fe; -} - -.green-theme { - --gr-df-accent: #059669; - --gr-df-accent-soft: #d1fae5; - --gr-df-copied-cell-color: #d1fae5; -} - -.orange-theme { - --gr-df-accent: #ea580c; - --gr-df-accent-soft: #fed7aa; - --gr-df-copied-cell-color: #fed7aa; -} - -/* Dark Mode Theme */ -.dark { - /* Override root CSS variables for dark mode */ - --gr-df-table-bg-even: #1f2937; - --gr-df-table-bg-odd: #111827; - --gr-df-copied-cell-color: #374151; - --gr-df-table-border: #374151; - --gr-df-table-text: #f9fafb; - --gr-df-accent: #60a5fa; - --gr-df-accent-soft: #1e3a8a; - - /* Dark mode for body and base elements */ - background-color: #0f172a; - color: #f1f5f9; -} - -/* Dark mode specific overrides for the interface */ -.dark .bg-white { - background-color: #1e293b; -} - -.dark .bg-\[#f6f9fc\] { - background-color: #0f172a; -} - -.dark .bg-\[#f8fafc\] { - background-color: #1e293b; -} - -/* Dark mode for dataframe container background */ -.dark div[class*="bg-[#f8fafc]"] { - background-color: #1e293b; -} - -.dark .rounded-lg.bg-\[#f8fafc\] { - background-color: #1e293b; -} - -.dark .rounded-xl.bg-\[#f8fafc\] { - background-color: #1e293b; -} - -/* Comprehensive dark mode overrides for all light backgrounds */ -.dark div, -.dark section, -.dark main, -.dark header, -.dark footer, -.dark aside, -.dark nav { - /* Override common light background colors */ -} - -.dark [class*="bg-white"]:not(button):not(.btn):not([role="button"]) { - background-color: #1e293b; -} - -.dark [class*="bg-[#f6f9fc]"]:not(button):not(.btn):not([role="button"]) { - background-color: #0f172a; -} - -.dark [class*="bg-[#f8fafc]"]:not(button):not(.btn):not([role="button"]) { - background-color: #1e293b; -} - -.dark [class*="bg-[#f9fafb]"]:not(button):not(.btn):not([role="button"]) { - background-color: #1e293b; -} - -.dark [class*="bg-[#fafafa]"]:not(button):not(.btn):not([role="button"]) { - background-color: #1e293b; -} - -.dark [class*="bg-gray-50"]:not(button):not(.btn):not([role="button"]) { - background-color: #1e293b; -} - -.dark [class*="bg-gray-100"]:not(button):not(.btn):not([role="button"]) { - background-color: #334155; -} - -/* Dark mode for all text colors */ -.dark [class*="text-[#2e3438]"] { - color: #f1f5f9; -} - -.dark [class*="text-[#374151]"] { - color: #e2e8f0 ; -} - -.dark [class*="text-[#64748b]"] { - color: #94a3b8 ; -} - -.dark [class*="text-[#9ca3af]"] { - color: #6b7280 ; -} - -.dark [class*="text-[#6b7280]"] { - color: #9ca3af ; -} - -/* Dark mode for all border colors */ -.dark [class*="border-[#e0e0e0]"] { - border-color: #475569; -} - -.dark [class*="border-[#e5e7eb]"] { - border-color: #475569; -} - -.dark [class*="border-[#d1d5db]"] { - border-color: #475569; -} - -.dark [class*="border-[#e2e8f0]"] { - border-color: #475569; -} - -.dark .border-\[#d1d5db\] { - border-color: #475569; -} - -.dark .border-\[#e0e0e0\] { - border-color: #475569; -} - -.dark .border-\[#e2e8f0\] { - border-color: #475569; -} - -.dark .text-\[#2e3438\] { - color: #f1f5f9; -} - -.dark .text-\[#73828c\] { - color: #cbd5e1; -} - -.dark .text-\[#64748b\] { - color: #94a3b8 ; -} - -.dark .text-\[#374151\] { - color: #e2e8f0 ; -} - -.dark .text-\[#1e293b\] { - color: #f8fafc ; -} - -.dark .text-\[#9ca3af\] { - color: #6b7280 ; -} - -/* Dark mode hover states */ -.dark .hover\:bg-\[#f6f9fc\]:hover { - background-color: #334155; -} - -.dark .hover\:text-\[#2e3438\]:hover { - color: #f1f5f9; -} - -.dark .hover\:border-\[#cbd5e1\]:hover { - border-color: #64748b ; -} - -/* Dark mode focus states */ -.dark .focus\:ring-\[#F87701\]:focus { - --tw-ring-color: #f97316 ; -} - -.dark .focus\:border-\[#F87701\]:focus { - border-color: #f97316 ; -} - -/* Dark mode for example cards */ -.dark .bg-\[#f1f5f9\] { - background-color: #475569; -} - -.dark .bg-\[#fef7f0\] { - background-color: #1e3a8a ; -} - -.dark .border-\[#F87701\] { - border-color: #60a5fa ; -} - -/* Dark mode for selected example card backgrounds - more specific selectors */ -.dark .rounded-xl.border-2.bg-\[#fef7f0\] { - background-color: #1e3a8a ; - border-color: #60a5fa ; -} - -.dark .rounded-xl.border-2.border-\[#F87701\] { - background-color: #1e3a8a ; - border-color: #60a5fa ; -} - -/* Dark mode for example card selected state colors */ -.dark .bg-\[#F87701\] { - background-color: #60a5fa ; -} - -/* Force dark mode on selected example cards using attribute selectors */ -.dark div[class*="bg-[#fef7f0]"] { - background-color: #1e3a8a ; -} - -.dark div[class*="border-[#F87701]"] { - border-color: #60a5fa ; -} - -.dark div[class*="bg-[#F87701]"] { - background-color: #60a5fa ; -} - -/* Maximum specificity override for selected example cards in dark mode */ -html.dark body div.space-y-2 button div.rounded-xl { - background-color: #1e3a8a ; - border-color: #60a5fa ; -} - -/* Target any div with the specific orange background class in dark mode */ -html.dark [class~="bg-[#fef7f0]"] { - background-color: #1e3a8a ; -} - -html.dark [class~="border-[#F87701]"] { - border-color: #60a5fa ; -} - -/* Nuclear option - override any element with these exact classes */ -.dark * { - --selected-bg: #1e3a8a; - --selected-border: #60a5fa; -} - -.dark .bg-\[#fef7f0\], -.dark [style*="background"], -.dark .rounded-xl[class*="bg-[#fef7f0]"] { - background-color: var(--selected-bg) ; - background: var(--selected-bg) ; -} - -.dark .border-\[#F87701\], -.dark .rounded-xl[class*="border-[#F87701]"] { - border-color: var(--selected-border) ; -} - -/* Dark mode for select dropdown */ -.dark select { - background-color: #1e293b; - color: #f1f5f9; - border-color: #475569; -} - -.dark select option { - background-color: #1e293b; - color: #f1f5f9; -} - -/* Dark mode for gradients */ -.dark .bg-gradient-to-r { - background: linear-gradient(to right, #1e293b, #0f172a) ; -} - -/* Dark mode for shadows */ -.dark .shadow-lg { - box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.2) ; -} - -.dark .hover\:shadow-sm:hover { - box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.3) ; -} - -/* Dark mode for code blocks and syntax highlighting */ -.dark code { - background-color: #374151 ; - color: #f9fafb ; -} - -.dark pre { - background-color: #1f2937 ; - border-color: #475569; -} - -/* Dark mode for tables */ -.dark table { - background-color: #1e293b; -} - -.dark th, .dark td { - border-color: #475569; - color: #f1f5f9; -} - -.dark thead { - background-color: #374151 ; -} - -.dark tbody tr:hover { - background-color: #334155; -} - -/* Dark mode for mobile overlay */ -.dark .bg-black { - background-color: rgba(0, 0, 0, 0.8) ; -} - -/* Additional dark mode text color fixes */ -.dark h1, .dark h2, .dark h3, .dark h4, .dark h5, .dark h6 { - color: #f1f5f9; -} - -.dark p { - color: #cbd5e1; -} - -.dark label { - color: #f1f5f9; -} - -/* Dark mode for specific text color classes that might be missed */ -.dark .text-gray-600 { - color: #94a3b8 ; -} - -.dark .text-gray-700 { - color: #cbd5e1; -} - -.dark .text-gray-800 { - color: #e2e8f0 ; -} - -.dark .text-gray-900 { - color: #f1f5f9; -} - -/* Dark mode for any remaining light backgrounds */ -.dark .bg-gray-50 { - background-color: #1e293b; -} - -.dark .bg-gray-100 { - background-color: #334155; -} - -.dark .bg-gray-200 { - background-color: #475569; -} - -/* Dark mode for input placeholders */ -.dark input::placeholder { - color: #94a3b8 ; -} - -.dark textarea::placeholder { - color: #94a3b8 ; -} - -/* Dark mode for any white text that should be dark in light mode but light in dark mode */ -.dark .text-white { - color: #f1f5f9; -} - -/* Ensure dataframe component inherits dark theme properly */ -.dark [data-testid="dataframe"] { - background-color: #1e293b; - color: #f1f5f9; -} - -/* Dark mode for any remaining border colors */ -.dark .border-gray-200 { - border-color: #475569; -} - -.dark .border-gray-300 { - border-color: #64748b ; -} - -/* Dark mode for button text that might not be covered */ -.dark button { - color: inherit ; -} - -/* Dark mode for links */ -.dark a { - color: #60a5fa ; -} - -.dark a:hover { - color: #93c5fd ; -} - -/* Force dark mode on all text elements that might be using default colors */ -.dark * { - border-color: #475569; -} - -/* Specific overrides for components that might not inherit properly */ -.dark .text-current { - color: #f1f5f9; -} - -/* Dark mode for any remaining light text colors */ -.dark .text-black { - color: #f1f5f9; -} - -/* Dark mode for the dataframe component wrapper */ -.dark div[class*="dataframe"] { - background-color: #1e293b; - color: #f1f5f9; -} - -/* Dark mode for any input elements */ -.dark input { - background-color: #1e293b; - color: #f1f5f9; - border-color: #475569; -} - -/* Dark mode for checkboxes and form controls */ -.dark input[type="checkbox"] { - background-color: #374151 ; - border-color: #6b7280 ; -} - -.dark input[type="checkbox"]:checked { - background-color: #60a5fa ; - border-color: #60a5fa ; -} - -/* Page titles */ -.page-title { - @apply text-lg md:text-xl lg:text-2xl font-bold text-[#2e3438] mb-3 md:mb-4 tracking-tight; -} - -/* Section titles */ -.section-title { - @apply text-lg font-bold text-[#2e3438] mb-4; -} - -/* Subsection titles */ -.subsection-title { - @apply text-base font-bold text-[#2e3438] mb-2; -} - -/* Content cards */ -.content-card { - @apply bg-white rounded-xl md:rounded-2xl shadow-lg border border-[#e0e0e0] p-4 sm:p-6 md:p-6 lg:p-8 xl:p-12; -} - -/* Navigation buttons */ -.nav-button { - @apply flex items-center py-1 px-2 text-xs mb-1 font-medium transition-all duration-200 rounded-sm; -} - -.nav-button-active { - @apply border-[#F87701] bg-[#fef7f0]; -} - -.nav-button-inactive { - @apply text-[#73828c] hover:text-[#2e3438] hover:bg-[#f6f9fc]; -} - -.example-card { - @apply flex items-center py-1 px-2 text-xs font-medium transition-all duration-200 rounded-sm; -} - -/* Example card containers */ -.example-card-active { - @apply border-[#F87701] bg-[#fef7f0]; -} - -.example-card-inactive { - @apply border-[#e2e8f0] bg-white; -} - -/* Example card icons */ -.example-icon { - @apply w-6 h-6 rounded-lg flex items-center justify-center mr-2 transition-colors duration-200; -} - -.example-icon-active { - @apply bg-[#F87701] text-white; -} - -.example-icon-inactive { - @apply bg-[#f1f5f9] text-[#64748b]; -} - -/* Text styles */ -.description-text { - @apply text-sm md:text-base lg:text-lg text-[#73828c] leading-relaxed font-medium; -} - -.feature-text { - @apply text-sm text-[#64748b] leading-relaxed font-medium; -} - -/* Event sections */ -.event-section { - @apply border border-[#e2e8f0] rounded-xl p-8 bg-gradient-to-r from-[#f8fafc] to-white; -} - -/* Main layout containers */ -.main-container { - @apply max-w-full md:max-w-3xl lg:max-w-5xl xl:max-w-6xl mx-auto ; -} - -.page-wrapper { - @apply flex-1 bg-[#f6f9fc] p-4 sm:p-6 md:p-6 lg:p-8 xl:p-12 overflow-auto; -} - -/* Dark mode overrides for new classes */ -.dark .page-title, -.dark .section-title, -.dark .subsection-title { - color: #f1f5f9; -} - -.dark .content-card { - background-color: #1e293b; - border-color: #475569; -} - -.dark .nav-button-active { - background-color: #1e3a8a; -} - -.dark .nav-button-inactive { - color: #cbd5e1; -} + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; -.dark .nav-button-inactive:hover { - color: #f1f5f9; - background-color: #334155; -} - -.dark .example-card-active { - background-color: #1e3a8a; -} - -.dark .example-card-inactive { - background-color: #1e293b ; -} - -.dark .example-card-inactive:hover { - background-color: #334155; -} - -.dark .example-icon-active { - background-color: #60a5fa; -} + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; -.dark .description-text, -.dark .feature-text { - color: #cbd5e1; + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } -.dark .event-section { - background: linear-gradient(to right, #1e293b, #0f172a); - border-color: #475569; -} - -div[role*="slider"] { - border-top: 1px solid #d1d5db; +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; } -/* Resizable controls panel styling */ -.drag-handle { - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; +a:hover { + color: #535bf2; } -.drag-handle:hover { - background-color: #f9fafb; +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; } -.drag-handle.dragging { - background-color: #f3f4f6; - cursor: ns-resize; +h1 { + font-size: 3.2em; + line-height: 1.1; } -/* Dark mode for drag handle */ -.dark .drag-handle:hover { - background-color: #374151; +.card { + padding: 2em; } -.dark .drag-handle.dragging { - background-color: #4b5563; +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; } -/* Prevent text selection during drag */ -body.dragging { - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - cursor: ns-resize; +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } } diff --git a/src/lib/ConfigPanel.svelte b/src/lib/ConfigPanel.svelte deleted file mode 100644 index ad24fb4836ab680e9a6b9739968302893ff1c2bf..0000000000000000000000000000000000000000 --- a/src/lib/ConfigPanel.svelte +++ /dev/null @@ -1,342 +0,0 @@ - - - -Configure search functionality
-Height constraint for the table (200-1000px)
-Maximum characters per cell (leave empty for no limit)
-Display label shown above the dataframe
-Add new rows and columns to the dataframe
- -Export your data in different formats
- -Export your data in different formats
- -{@html highlightedCode}
-