├── docs ├── .nojekyll ├── public │ ├── .nojekyll │ ├── logo.png │ └── screenshots │ │ ├── screenshot1.png │ │ ├── screenshot2.png │ │ └── screenshot3.png ├── .vitepress │ ├── cache │ │ └── deps │ │ │ ├── package.json │ │ │ ├── vue.js.map │ │ │ ├── vitepress___@vueuse_core.js.map │ │ │ └── _metadata.json │ ├── theme │ │ ├── index.ts │ │ └── custom.css │ └── config.mts ├── package.json ├── license.md ├── acknowledgments.md └── index.md ├── src ├── vite-env.d.ts ├── components │ ├── ui │ │ ├── aspect-ratio.tsx │ │ ├── skeleton.tsx │ │ ├── collapsible.tsx │ │ ├── textarea.tsx │ │ ├── label.tsx │ │ ├── input.tsx │ │ ├── separator.tsx │ │ ├── progress.tsx │ │ ├── toaster.tsx │ │ ├── sonner.tsx │ │ ├── checkbox.tsx │ │ ├── switch.tsx │ │ ├── badge.tsx │ │ ├── hover-card.tsx │ │ ├── tooltip.tsx │ │ ├── popover.tsx │ │ ├── radio-group.tsx │ │ ├── alert.tsx │ │ ├── scroll-area.tsx │ │ ├── resizable.tsx │ │ ├── tabs.tsx │ │ ├── button.tsx │ │ ├── card.tsx │ │ ├── accordion.tsx │ │ ├── breadcrumb.tsx │ │ ├── pagination.tsx │ │ ├── table.tsx │ │ ├── drawer.tsx │ │ ├── dialog.tsx │ │ ├── sheet.tsx │ │ ├── form.tsx │ │ ├── alert-dialog.tsx │ │ ├── toast.tsx │ │ ├── command.tsx │ │ ├── navigation-menu.tsx │ │ ├── multi-select.tsx │ │ └── select.tsx │ ├── theme │ │ ├── mode-toggle.tsx │ │ └── theme-provider.tsx │ ├── common │ │ ├── FloatingActionButton.tsx │ │ └── ConnectionPill.tsx │ ├── charts │ │ └── CustomChartTooltip.tsx │ ├── workspace │ │ ├── SortableTab.tsx │ │ ├── WorkspaceTabs.tsx │ │ └── SqlTab.tsx │ ├── layout │ │ ├── ConnectionSwitcher.tsx │ │ └── MobileNavDrawer.tsx │ └── explorer │ │ └── DataExplorer.tsx ├── lib │ ├── utils.ts │ └── chartUtils.ts ├── pages │ ├── NotFound.tsx │ └── Home.tsx ├── hooks │ ├── useQueryFromURL.ts │ └── use-toast.ts └── main.tsx ├── public ├── databases │ ├── manifest.json │ └── README.md ├── logo.png ├── logo-light.png └── logo-padding.png ├── tsconfig.json ├── .gitignore ├── index.html ├── .dockerignore ├── components.json ├── tsconfig.node.json ├── docker-compose.yml ├── eslint.config.js ├── tsconfig.app.json ├── .github ├── ISSUE_TEMPLATE │ ├── feature.yml │ └── bug.yml └── workflows │ ├── 3-deploy-docs.yml.disabled │ ├── deploy-pages.yml │ ├── 2-docker-build.yml │ └── 1-release.yml.disabled ├── vite.config.ts ├── inject-env.js ├── Dockerfile ├── LICENSE.md ├── package.json └── README.md /docs/.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/public/.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /public/databases/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "databases": [] 3 | } 4 | -------------------------------------------------------------------------------- /docs/.vitepress/cache/deps/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module" 3 | } 4 | -------------------------------------------------------------------------------- /public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibero-data/duck-ui/HEAD/public/logo.png -------------------------------------------------------------------------------- /docs/public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibero-data/duck-ui/HEAD/docs/public/logo.png -------------------------------------------------------------------------------- /public/logo-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibero-data/duck-ui/HEAD/public/logo-light.png -------------------------------------------------------------------------------- /public/logo-padding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibero-data/duck-ui/HEAD/public/logo-padding.png -------------------------------------------------------------------------------- /docs/public/screenshots/screenshot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibero-data/duck-ui/HEAD/docs/public/screenshots/screenshot1.png -------------------------------------------------------------------------------- /docs/public/screenshots/screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibero-data/duck-ui/HEAD/docs/public/screenshots/screenshot2.png -------------------------------------------------------------------------------- /docs/public/screenshots/screenshot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibero-data/duck-ui/HEAD/docs/public/screenshots/screenshot3.png -------------------------------------------------------------------------------- /docs/.vitepress/cache/deps/vue.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /src/components/ui/aspect-ratio.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" 4 | 5 | const AspectRatio = AspectRatioPrimitive.Root 6 | 7 | export { AspectRatio } 8 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "@/*": ["./src/*"] 6 | } 7 | }, 8 | "files": [], 9 | "references": [ 10 | { "path": "./tsconfig.app.json" }, 11 | { "path": "./tsconfig.node.json" } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ch-ui-docs", 3 | "version": "1.0.1", 4 | "private": true, 5 | "scripts": { 6 | "docs:dev": "vitepress dev", 7 | "docs:build": "vitepress build", 8 | "docs:preview": "vitepress preview" 9 | }, 10 | "devDependencies": { 11 | "vitepress": "^1.0.0" 12 | } 13 | } -------------------------------------------------------------------------------- /src/components/ui/skeleton.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils" 2 | 3 | function Skeleton({ 4 | className, 5 | ...props 6 | }: React.HTMLAttributes) { 7 | return ( 8 |
12 | ) 13 | } 14 | 15 | export { Skeleton } 16 | -------------------------------------------------------------------------------- /src/components/ui/collapsible.tsx: -------------------------------------------------------------------------------- 1 | import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" 2 | 3 | const Collapsible = CollapsiblePrimitive.Root 4 | 5 | const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger 6 | 7 | const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent 8 | 9 | export { Collapsible, CollapsibleTrigger, CollapsibleContent } 10 | -------------------------------------------------------------------------------- /docs/.vitepress/theme/index.ts: -------------------------------------------------------------------------------- 1 | import DefaultTheme from "vitepress/theme"; 2 | import "./custom.css"; 3 | import ScreenshotGallery from "../components/ScreenshotGallery.vue"; 4 | 5 | export default { 6 | ...DefaultTheme, 7 | enhanceApp({ app }: { app: import("vue").App }) { 8 | // Register global components 9 | app.component("ScreenshotGallery", ScreenshotGallery); 10 | }, 11 | }; 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | /vscode/* 18 | !.vscode/extensions.json 19 | .idea 20 | .DS_Store 21 | *.suo 22 | *.ntvs* 23 | *.njsproj 24 | *.sln 25 | *.sw? 26 | .env 27 | 28 | post.md -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Duck UI 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | # Ignore node_modules (local dependencies) 2 | node_modules 3 | 4 | # Ignore build artifacts 5 | dist 6 | 7 | # Ignore configuration files that shouldn't be shared 8 | .env 9 | .vscode 10 | .idea 11 | 12 | # Ignore miscellaneous system files and logs 13 | .DS_Store 14 | npm-debug.log 15 | yarn-debug.log 16 | yarn-error.log 17 | package-lock.json 18 | 19 | # Ignore Git-specific files 20 | .git 21 | .gitignore 22 | 23 | /docs -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "default", 4 | "rsc": false, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.js", 8 | "css": "src/index.css", 9 | "baseColor": "neutral", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | }, 20 | "iconLibrary": "lucide" 21 | } -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 | "target": "ES2022", 5 | "lib": ["ES2023"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | 16 | /* Linting */ 17 | "strict": true, 18 | "noUnusedLocals": true, 19 | "noUnusedParameters": true, 20 | "noFallthroughCasesInSwitch": true, 21 | "noUncheckedSideEffectImports": true 22 | }, 23 | "include": ["vite.config.ts"] 24 | } 25 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | duck-ui: 3 | image: ghcr.io/ibero-data/duck-ui:latest 4 | restart: always 5 | ports: 6 | - "${DUCK_UI_PORT:-5522}:5522" 7 | environment: 8 | # External connection (optional) 9 | - DUCK_UI_EXTERNAL_CONNECTION_NAME=${DUCK_UI_EXTERNAL_CONNECTION_NAME:-} 10 | - DUCK_UI_EXTERNAL_HOST=${DUCK_UI_EXTERNAL_HOST:-} 11 | - DUCK_UI_EXTERNAL_PORT=${DUCK_UI_EXTERNAL_PORT:-} 12 | - DUCK_UI_EXTERNAL_USER=${DUCK_UI_EXTERNAL_USER:-} 13 | - DUCK_UI_EXTERNAL_PASS=${DUCK_UI_EXTERNAL_PASS:-} 14 | - DUCK_UI_EXTERNAL_DATABASE_NAME=${DUCK_UI_EXTERNAL_DATABASE_NAME:-} 15 | # DuckDB configuration 16 | - DUCK_UI_ALLOW_UNSIGNED_EXTENSIONS=${DUCK_UI_ALLOW_UNSIGNED_EXTENSIONS:-false} -------------------------------------------------------------------------------- /src/components/ui/textarea.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | const Textarea = React.forwardRef< 6 | HTMLTextAreaElement, 7 | React.ComponentProps<"textarea"> 8 | >(({ className, ...props }, ref) => { 9 | return ( 10 |