├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ └── config.yml └── workflows │ ├── docs.yml │ ├── lint.yml │ └── release-please.yml ├── .gitignore ├── .release-please-manifest.json ├── LICENSE ├── README.md ├── biome.json ├── dev ├── index.html ├── package.json ├── src │ ├── ChartsLab.tsx │ ├── index.css │ └── index.tsx ├── tsconfig.json └── vite.config.ts ├── docs ├── .env.example ├── .prettierignore ├── .prettierrc.json ├── astro.config.ts ├── package.json ├── public │ ├── banner.jpg │ ├── favicon.ico │ ├── favicon.svg │ ├── fonts │ │ └── MonaspaceNeon-Regular-v1.101.woff2 │ ├── readme │ │ └── solid-charts.png │ └── robots.txt ├── src │ ├── assets │ │ ├── global.css │ │ ├── header_logo_dark.svg │ │ ├── header_logo_light.svg │ │ └── shiki.css │ ├── components │ │ ├── Background.tsx │ │ ├── Head.astro │ │ ├── docs │ │ │ ├── Link.astro │ │ │ ├── TableOfContents.tsx │ │ │ ├── api │ │ │ │ ├── ApiReference.astro │ │ │ │ ├── items │ │ │ │ │ ├── ApiItemComponent.astro │ │ │ │ │ └── ApiItemSimple.astro │ │ │ │ └── lists │ │ │ │ │ ├── ApiProps.astro │ │ │ │ │ └── ApiTag.astro │ │ │ ├── code │ │ │ │ ├── Code.astro │ │ │ │ ├── CopyToClipboard.tsx │ │ │ │ └── RawCode.astro │ │ │ ├── headings │ │ │ │ ├── H2.astro │ │ │ │ └── H3.astro │ │ │ └── sidebar │ │ │ │ ├── NavLink.astro │ │ │ │ └── Navigation.astro │ │ ├── index │ │ │ └── IndexChart.tsx │ │ ├── scripts │ │ │ ├── PlatformScript.astro │ │ │ ├── SidebarNavScript.astro │ │ │ └── ThemeScript.astro │ │ └── topbar │ │ │ ├── Drawer.tsx │ │ │ ├── ThemeSelect.tsx │ │ │ ├── Topbar.astro │ │ │ └── search │ │ │ ├── Search.tsx │ │ │ ├── SearchDialog.tsx │ │ │ └── SearchItem.tsx │ ├── env.d.ts │ ├── examples │ │ ├── ExampleWrapper.tsx │ │ ├── docs │ │ │ ├── axis │ │ │ │ ├── multiple.tsx │ │ │ │ └── single.tsx │ │ │ ├── chart │ │ │ │ ├── object-data.tsx │ │ │ │ └── simple.tsx │ │ │ ├── curves │ │ │ │ ├── cardinal.tsx │ │ │ │ └── step.tsx │ │ │ ├── series │ │ │ │ ├── active-point.tsx │ │ │ │ ├── area.tsx │ │ │ │ ├── bar.tsx │ │ │ │ ├── line.tsx │ │ │ │ └── point.tsx │ │ │ ├── stacks │ │ │ │ ├── area.tsx │ │ │ │ └── bar.tsx │ │ │ └── usage │ │ │ │ └── first.tsx │ │ └── examples │ │ │ └── temp.tsx │ ├── layouts │ │ └── Docs.astro │ ├── lib │ │ └── typedoc │ │ │ ├── apiPages.ts │ │ │ ├── headings.ts │ │ │ ├── resolve │ │ │ ├── lib.ts │ │ │ ├── resolve.ts │ │ │ ├── resolveComponent.ts │ │ │ └── resolveSimple.ts │ │ │ └── types │ │ │ ├── apiReferences.ts │ │ │ ├── specifications.ts │ │ │ └── typedoc.ts │ └── pages │ │ ├── 404.astro │ │ ├── docs │ │ ├── axis.mdx │ │ ├── components │ │ │ ├── axis.mdx │ │ │ ├── chart.mdx │ │ │ └── series.mdx │ │ ├── curves.mdx │ │ ├── index.mdx │ │ ├── stacks.mdx │ │ └── usage.mdx │ │ ├── examples │ │ └── index.mdx │ │ └── index.astro ├── tsconfig.json ├── typesense.config.json └── vercel.json ├── package.json ├── packages └── solid-charts │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ ├── axis │ │ ├── Axis.tsx │ │ ├── Cursor.tsx │ │ ├── Grid.tsx │ │ ├── Label.tsx │ │ ├── Line.tsx │ │ ├── Mark.tsx │ │ ├── Tooltip.tsx │ │ ├── ValueLine.tsx │ │ └── context.ts │ ├── components │ │ ├── Chart.tsx │ │ └── context.ts │ ├── curves.ts │ ├── index.ts │ ├── lib │ │ ├── createBands.ts │ │ ├── createBaseLine.ts │ │ ├── createClosestTick.ts │ │ ├── createLabelTicks.ts │ │ ├── createPoints.ts │ │ ├── createScale.ts │ │ ├── createSeries.ts │ │ ├── createTicks.ts │ │ ├── dom │ │ │ ├── charSize.ts │ │ │ ├── createSize.ts │ │ │ └── createSvgSize.ts │ │ ├── types.ts │ │ └── utils.ts │ ├── series │ │ ├── Area.tsx │ │ ├── Bar.tsx │ │ ├── Line.tsx │ │ └── Point.tsx │ └── shapes │ │ └── Curve.tsx │ ├── tsconfig.json │ └── tsup.config.ts ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── release-please-config.json └── turbo.json /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: GiyoMoon 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: '🐛 Bug report' 2 | description: Create a report to help improve solid-charts 3 | title: "[Bug]: " 4 | labels: ["bug (unverified)"] 5 | assignees: 6 | - GiyoMoon 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: | 11 | Thank you for reporting a bug to solid-charts :pray::purple_heart: 12 | 13 | Before submitting a new bug/issue, please make sure to search for existing issues to avoid submitting duplicates: 14 | 15 | - [open issues](https://github.com/corvudev/solid-charts/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated) 16 | - [closed issues](https://github.com/corvudev/solid-charts/issues?q=is%3Aissue+is%3Aclosed+sort%3Aupdated+) 17 | - [solid-charts discussions](https://github.com/corvudev/solid-charts/discussions) 18 | - type: textarea 19 | id: description 20 | attributes: 21 | label: Bug description 22 | description: Please provide a clear description of what the bug is. 23 | validations: 24 | required: true 25 | - type: input 26 | id: link 27 | attributes: 28 | label: Reproduction Link 29 | description: | 30 | Provide a link to a live example, or a repository that can reproduce the bug. We can analyze and fix the bug much faster if you provide a clear and minimal example. Please read these tips for providing a minimal example: https://stackoverflow.com/help/mcve. 31 | 32 | You can use [Stackblitz](https://stackblitz.com/) to create a sharable reproduction. A public GitHub repository also works. 33 | placeholder: | 34 | https://stackblitz.com/edit/... or a public GitHub repository 35 | validations: 36 | required: true 37 | - type: textarea 38 | id: steps 39 | attributes: 40 | label: Reproduction Steps 41 | description: Describe how we can reproduce the bug with the provided link. 42 | placeholder: | 43 | 1. Click on ... 44 | 2. Open the console 45 | 3. See the error message 46 | validations: 47 | required: true 48 | - type: textarea 49 | id: expected 50 | attributes: 51 | label: Expected behavior 52 | description: Provide a clear description of what you expected to happen. 53 | placeholder: | 54 | I expected ... but ... is happening instead. 55 | validations: 56 | required: true 57 | - type: textarea 58 | id: additional 59 | attributes: 60 | label: Additional context 61 | description: Add any other context about the bug here. 62 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | -------------------------------------------------------------------------------- /.github/workflows/docs.yml: -------------------------------------------------------------------------------- 1 | name: docs 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | docs: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Check out 13 | uses: actions/checkout@v4 14 | 15 | - name: Install Vercel CLI 16 | run: npm install -g vercel@37.8.0 17 | 18 | - name: Deploy to vercel 19 | uses: BetaHuhn/deploy-to-vercel-action@v1 20 | with: 21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 22 | VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} 23 | VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} 24 | VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} 25 | 26 | - name: Typesense scraper 27 | uses: celsiusnarhwal/typesense-scraper@v2 28 | with: 29 | api-key: ${{ secrets.TYPESENSE_API_KEY }} 30 | host: search.solidcharts.dev 31 | port: 443 32 | protocol: https 33 | config: ./docs/typesense.config.json 34 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: lint 2 | 3 | on: 4 | push: 5 | branches: 6 | - '**' 7 | pull_request: 8 | 9 | concurrency: ${{ github.workflow }}-${{ github.ref }} 10 | 11 | jobs: 12 | lint: 13 | name: Lint 14 | runs-on: ubuntu-latest 15 | steps: 16 | - name: Check out 17 | uses: actions/checkout@v4 18 | 19 | - name: Install nodejs 20 | uses: actions/setup-node@v4 21 | with: 22 | node-version: lts/* 23 | 24 | - name: Install pnpm 25 | uses: pnpm/action-setup@v4 26 | with: 27 | version: 10.7.1 28 | run_install: false 29 | 30 | - name: Get pnpm store dir 31 | id: pnpm-cache 32 | shell: bash 33 | run: | 34 | echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT 35 | 36 | - name: pnpm cache 37 | uses: actions/cache@v4 38 | with: 39 | path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} 40 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 41 | restore-keys: | 42 | ${{ runner.os }}-pnpm-store- 43 | 44 | - name: Install dependencies 45 | run: | 46 | pnpm install 47 | 48 | - name: Lint 49 | run: | 50 | pnpm lint 51 | -------------------------------------------------------------------------------- /.github/workflows/release-please.yml: -------------------------------------------------------------------------------- 1 | name: release-please 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | release-please: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: release-please 13 | id: release-please 14 | uses: googleapis/release-please-action@v4 15 | 16 | - name: Check out 17 | if: ${{ steps.release-please.outputs.releases_created == 'true' }} 18 | uses: actions/checkout@v4 19 | 20 | - name: Install nodejs 21 | if: ${{ steps.release-please.outputs.releases_created == 'true' }} 22 | uses: actions/setup-node@v4 23 | with: 24 | node-version: lts/* 25 | 26 | - name: Install pnpm 27 | if: ${{ steps.release-please.outputs.releases_created == 'true' }} 28 | uses: pnpm/action-setup@v4 29 | with: 30 | version: 10.7.1 31 | run_install: false 32 | 33 | - name: Get pnpm store dir 34 | if: ${{ steps.release-please.outputs.releases_created == 'true' }} 35 | id: pnpm-cache 36 | shell: bash 37 | run: echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT 38 | 39 | - name: pnpm cache 40 | if: ${{ steps.release-please.outputs.releases_created == 'true' }} 41 | uses: actions/cache@v4 42 | with: 43 | path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} 44 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 45 | restore-keys: | 46 | ${{ runner.os }}-pnpm-store- 47 | 48 | - name: Install dependencies 49 | if: ${{ steps.release-please.outputs.releases_created == 'true' }} 50 | run: pnpm install --frozen-lockfile 51 | 52 | - name: Set pnpm auth token 53 | if: ${{ steps.release-please.outputs.releases_created == 'true' }} 54 | run: pnpm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}" 55 | env: 56 | NPM_TOKEN: ${{secrets.NPM_TOKEN}} 57 | 58 | - name: Publish to npm 59 | if: ${{ steps.release-please.outputs.releases_created == 'true' }} 60 | run: pnpm ci:publish 61 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .astro 2 | .env 3 | .turbo 4 | dist 5 | node_modules 6 | packages/*/README.md 7 | tsup.config.*.mjs 8 | api.json 9 | -------------------------------------------------------------------------------- /.release-please-manifest.json: -------------------------------------------------------------------------------- 1 | {"packages/solid-charts":"0.0.1"} 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Jasmin Noetzli 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | solid-charts banner 4 | 5 |
6 |
7 |
8 | 9 | [![NPM Version](https://img.shields.io/npm/v/solid-charts?color=1ABD94)](https://www.npmjs.com/package/solid-charts) 10 | [![NPM Downloads](https://img.shields.io/npm/dm/solid-charts?color=1ABD94)](https://www.npmjs.com/package/solid-charts) 11 | [![License](https://img.shields.io/github/license/corvudev/solid-charts?color=1ABD94)](https://github.com/corvudev/solid-charts/blob/main/LICENSE) 12 | 13 | **[Documentation](https://solidcharts.dev/) • [Discussion](https://github.com/corvudev/solid-charts/discussions) • [Discord](https://discord.com/invite/solidjs)** 14 |
15 | 16 | ## About 17 | Component based svg charts for SolidJS. Composable, unstyled, and tweakable. 18 | 19 | Read more at [solidcharts.dev](https://solidcharts.dev). 20 | 21 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", 3 | "vcs": { 4 | "enabled": true, 5 | "clientKind": "git", 6 | "useIgnoreFile": true 7 | }, 8 | "linter": { 9 | "enabled": true, 10 | "rules": { 11 | "recommended": true, 12 | "style": { 13 | "noNonNullAssertion": "off", 14 | "noParameterAssign": "off" 15 | }, 16 | "a11y": { 17 | "noNoninteractiveElementToInteractiveRole": "off", 18 | "noPositiveTabindex": "off", 19 | "noSvgWithoutTitle": "off", 20 | "useSemanticElements": "off" 21 | }, 22 | "correctness": { 23 | "noUnusedVariables": "error" 24 | }, 25 | "suspicious": { 26 | "noExplicitAny": "off" 27 | } 28 | } 29 | }, 30 | "formatter": { 31 | "enabled": true, 32 | "ignore": ["**/*.astro", "**/*.md", "**/package.json"], 33 | "indentStyle": "space", 34 | "indentWidth": 2 35 | }, 36 | "organizeImports": { 37 | "enabled": true 38 | }, 39 | "javascript": { 40 | "formatter": { 41 | "quoteStyle": "single", 42 | "semicolons": "asNeeded" 43 | } 44 | }, 45 | "overrides": [ 46 | { 47 | "include": ["**/*.astro"], 48 | "linter": { 49 | "rules": { 50 | "style": { 51 | "useConst": "off", 52 | "useImportType": "off" 53 | }, 54 | "correctness": { 55 | "noUnusedVariables": "off" 56 | }, 57 | "complexity": { 58 | "noForEach": "off" 59 | } 60 | } 61 | } 62 | } 63 | ] 64 | } 65 | -------------------------------------------------------------------------------- /dev/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | solid-charts 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /dev/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@solid-charts/dev", 3 | "private": true, 4 | "description": "solid-charts development environment", 5 | "license": "MIT", 6 | "author": { 7 | "name": "Jasmin Noetzli", 8 | "email": "code@jasi.dev", 9 | "url": "https://github.com/GiyoMoon" 10 | }, 11 | "type": "module", 12 | "scripts": { 13 | "build": "tsc --noEmit && vite build", 14 | "clean": "rm -rf .turbo dist node_modules", 15 | "dev": "vite dev", 16 | "lint": "biome check", 17 | "lint:fix": "biome check --fix", 18 | "preview": "vite preview" 19 | }, 20 | "dependencies": { 21 | "clsx": "^2.1.1", 22 | "solid-charts": "workspace:*", 23 | "solid-js": "^1.9.6" 24 | }, 25 | "devDependencies": { 26 | "@tailwindcss/vite": "^4.1.5", 27 | "tailwindcss": "^4.1.5", 28 | "typescript": "^5.8.3", 29 | "vite": "^6.3.5", 30 | "vite-plugin-solid": "^2.11.6", 31 | "vite-tsconfig-paths": "^5.1.4" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /dev/src/index.css: -------------------------------------------------------------------------------- 1 | @import "tailwindcss"; 2 | -------------------------------------------------------------------------------- /dev/src/index.tsx: -------------------------------------------------------------------------------- 1 | import './index.css' 2 | import { render } from 'solid-js/web' 3 | import ChartsLab from './ChartsLab' 4 | 5 | render(() => , document.getElementById('root')!) 6 | -------------------------------------------------------------------------------- /dev/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "ESNext", 4 | "target": "ESNext", 5 | "newLine": "LF", 6 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 7 | "moduleResolution": "Bundler", 8 | "noEmit": true, 9 | "allowSyntheticDefaultImports": true, 10 | "strict": true, 11 | "strictNullChecks": true, 12 | "esModuleInterop": true, 13 | "isolatedModules": true, 14 | "forceConsistentCasingInFileNames": true, 15 | "noUncheckedIndexedAccess": true, 16 | "skipLibCheck": true, 17 | "jsx": "preserve", 18 | "jsxImportSource": "solid-js" 19 | }, 20 | "exclude": ["node_modules", "dist"] 21 | } 22 | -------------------------------------------------------------------------------- /dev/vite.config.ts: -------------------------------------------------------------------------------- 1 | import tailwind from '@tailwindcss/vite' 2 | import { defineConfig } from 'vite' 3 | import solid from 'vite-plugin-solid' 4 | import tsConfigPaths from 'vite-tsconfig-paths' 5 | 6 | export default defineConfig({ 7 | plugins: [solid(), tailwind(), tsConfigPaths()], 8 | }) 9 | -------------------------------------------------------------------------------- /docs/.env.example: -------------------------------------------------------------------------------- 1 | PUBLIC_SEARCH_API_URL= 2 | PUBLIC_SEARCH_API_KEY= 3 | -------------------------------------------------------------------------------- /docs/.prettierignore: -------------------------------------------------------------------------------- 1 | * 2 | !*.md 3 | !*/ 4 | !*.astro 5 | !*/ 6 | -------------------------------------------------------------------------------- /docs/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["prettier-plugin-astro"], 3 | "overrides": [ 4 | { 5 | "files": "*.astro", 6 | "options": { 7 | "parser": "astro" 8 | } 9 | } 10 | ], 11 | "semi": false, 12 | "singleQuote": true 13 | } 14 | -------------------------------------------------------------------------------- /docs/astro.config.ts: -------------------------------------------------------------------------------- 1 | import mdx from '@astrojs/mdx' 2 | import sitemap, { ChangeFreqEnum } from '@astrojs/sitemap' 3 | import solid from '@astrojs/solid-js' 4 | import tailwind from '@tailwindcss/vite' 5 | import { defineConfig } from 'astro/config' 6 | 7 | // https://astro.build/config 8 | export default defineConfig({ 9 | integrations: [ 10 | mdx(), 11 | sitemap({ 12 | serialize(item) { 13 | if (item.url === 'https://solidcharts.dev/') { 14 | item.priority = 1 15 | } else { 16 | item.priority = 0.9 17 | } 18 | item.changefreq = ChangeFreqEnum.DAILY 19 | item.lastmod = new Date().toISOString() 20 | return item 21 | }, 22 | }), 23 | solid(), 24 | ], 25 | prefetch: { 26 | prefetchAll: true, 27 | }, 28 | markdown: { 29 | syntaxHighlight: false, 30 | }, 31 | site: 'https://solidcharts.dev', 32 | trailingSlash: 'always', 33 | experimental: { 34 | preserveScriptOrder: true, 35 | }, 36 | vite: { 37 | plugins: [tailwind()], 38 | }, 39 | }) 40 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@solid-charts/docs", 3 | "private": true, 4 | "description": "solidcharts.dev website", 5 | "homepage": "https://solidcharts.dev", 6 | "license": "MIT", 7 | "author": { 8 | "name": "Jasmin Noetzli", 9 | "email": "code@jasi.dev", 10 | "url": "https://github.com/GiyoMoon" 11 | }, 12 | "type": "module", 13 | "scripts": { 14 | "build": "astro build", 15 | "clean": "rm -rf .turbo dist node_modules", 16 | "dev": "astro dev", 17 | "lint": "biome check && prettier . --check", 18 | "lint:fix": "biome check --fix && prettier . --write", 19 | "preview": "astro preview" 20 | }, 21 | "dependencies": { 22 | "@astrojs/mdx": "^4.2.6", 23 | "@astrojs/sitemap": "^3.3.1", 24 | "@astrojs/solid-js": "^5.0.10", 25 | "@corvu/dialog": "^0.2.4", 26 | "@corvu/drawer": "^0.2.4", 27 | "@fontsource-variable/rubik": "^5.2.5", 28 | "@tailwindcss/forms": "^0.5.10", 29 | "@tailwindcss/vite": "^4.1.5", 30 | "astro": "^5.7.11", 31 | "clsx": "^2.1.1", 32 | "prettier": "^3.5.3", 33 | "prettier-plugin-astro": "^0.14.1", 34 | "shiki": "^3.4.0", 35 | "solid-charts": "workspace:*", 36 | "solid-js": "^1.9.6", 37 | "solid-list": "^0.3.0", 38 | "tailwindcss": "^4.1.5", 39 | "typescript": "^5.8.3" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /docs/public/banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corvudev/solid-charts/4a57ec06e41bd25e26797a298dd15e1d72aa2175/docs/public/banner.jpg -------------------------------------------------------------------------------- /docs/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corvudev/solid-charts/4a57ec06e41bd25e26797a298dd15e1d72aa2175/docs/public/favicon.ico -------------------------------------------------------------------------------- /docs/public/favicon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/public/fonts/MonaspaceNeon-Regular-v1.101.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corvudev/solid-charts/4a57ec06e41bd25e26797a298dd15e1d72aa2175/docs/public/fonts/MonaspaceNeon-Regular-v1.101.woff2 -------------------------------------------------------------------------------- /docs/public/readme/solid-charts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corvudev/solid-charts/4a57ec06e41bd25e26797a298dd15e1d72aa2175/docs/public/readme/solid-charts.png -------------------------------------------------------------------------------- /docs/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | Sitemap: https://solidcharts.dev/sitemap-index.xml 4 | -------------------------------------------------------------------------------- /docs/src/assets/global.css: -------------------------------------------------------------------------------- 1 | @import "tailwindcss"; 2 | 3 | @custom-variant dark (&:where(.dark, .dark *)); 4 | @custom-variant macos (&:where(.macos, .macos *)); 5 | 6 | @theme { 7 | --font-sans: "Rubik Variable", ui-sans-serif, system-ui, sans-serif, 8 | "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; 9 | --font-mono: "Mona Space", ui-monospace, SFMono-Regular, Menlo, Monaco, 10 | Consolas, "Liberation Mono", "Courier New", monospace; 11 | 12 | --color-sc-text: var(--sc-text); 13 | --color-sc-text-dark: var(--sc-text-dark); 14 | --color-sc-bg: var(--sc-bg); 15 | --color-sc-100: var(--sc-100); 16 | --color-sc-200: var(--sc-200); 17 | --color-sc-300: var(--sc-300); 18 | --color-sc-400: var(--sc-400); 19 | --color-sc-link: var(--sc-link); 20 | --color-sc-yellow: var(--sc-yellow); 21 | --color-sc-purple: var(--sc-purple); 22 | 23 | --animate-in: enter 150ms ease; 24 | --animate-out: exit 150ms ease; 25 | 26 | @keyframes enter { 27 | from { 28 | opacity: var(--tw-enter-opacity, 1); 29 | transform: translate3d( 30 | var(--tw-enter-translate-x, 0), 31 | var(--tw-enter-translate-y, 0), 32 | 0 33 | ) 34 | scale3d( 35 | var(--tw-enter-scale, 1), 36 | var(--tw-enter-scale, 1), 37 | var(--tw-enter-scale, 1) 38 | ); 39 | } 40 | } 41 | 42 | @keyframes exit { 43 | to { 44 | opacity: var(--tw-exit-opacity, 1); 45 | transform: translate3d( 46 | var(--tw-exit-translate-x, 0), 47 | var(--tw-exit-translate-y, 0), 48 | 0 49 | ) 50 | scale3d( 51 | var(--tw-exit-scale, 1), 52 | var(--tw-exit-scale, 1), 53 | var(--tw-exit-scale, 1) 54 | ); 55 | } 56 | } 57 | } 58 | 59 | @utility scrollbar-thin { 60 | scrollbar-width: thin; 61 | } 62 | 63 | @utility fade-in-* { 64 | --tw-enter-opacity: --value(percentage, ratio); 65 | } 66 | @utility fade-out-* { 67 | --tw-exit-opacity: --value(percentage, ratio); 68 | } 69 | 70 | @utility zoom-in-* { 71 | --tw-enter-scale: --value(percentage, ratio); 72 | } 73 | @utility zoom-out-* { 74 | --tw-exit-scale: --value(percentage, ratio); 75 | } 76 | 77 | @utility slide-in-from-top-* { 78 | --tw-enter-translate-y: calc(--value(percentage) * -1); 79 | --tw-enter-translate-y: calc(--value(ratio) * -100%); 80 | --tw-enter-translate-y: calc(--value(integer) * var(--spacing) * -1); 81 | } 82 | @utility slide-in-from-bottom-* { 83 | --tw-enter-translate-y: --value(percentage); 84 | --tw-enter-translate-y: calc(--value(ratio) * 100%); 85 | --tw-enter-translate-y: calc(--value(integer) * var(--spacing)); 86 | } 87 | @utility slide-in-from-left-* { 88 | --tw-enter-translate-x: calc(--value(percentage) * -1); 89 | --tw-enter-translate-x: calc(--value(ratio) * -100%); 90 | --tw-enter-translate-x: calc(--value(integer) * var(--spacing) * -1); 91 | } 92 | @utility slide-in-from-right-* { 93 | --tw-enter-translate-x: --value(percentage); 94 | --tw-enter-translate-x: calc(--value(ratio) * 100%); 95 | --tw-enter-translate-x: calc(--value(integer) * var(--spacing)); 96 | } 97 | 98 | @utility slide-out-to-top-* { 99 | --tw-exit-translate-y: calc(--value(percentage) * -1); 100 | --tw-exit-translate-y: calc(--value(ratio) * -100%); 101 | --tw-exit-translate-y: calc(--value(integer) * var(--spacing) * -1); 102 | } 103 | @utility slide-out-to-bottom-* { 104 | --tw-exit-translate-y: --value(percentage); 105 | --tw-exit-translate-y: calc(--value(ratio) * 100%); 106 | --tw-exit-translate-y: calc(--value(integer) * var(--spacing)); 107 | } 108 | @utility slide-out-to-left-* { 109 | --tw-exit-translate-x: calc(--value(percentage) * -1); 110 | --tw-exit-translate-x: calc(--value(ratio) * -100%); 111 | --tw-exit-translate-x: calc(--value(integer) * var(--spacing) * -1); 112 | } 113 | @utility slide-out-to-right-* { 114 | --tw-exit-translate-x: --value(percentage); 115 | --tw-exit-translate-x: calc(--value(ratio) * 100%); 116 | --tw-exit-translate-x: calc(--value(integer) * var(--spacing)); 117 | } 118 | 119 | @custom-variant prose-headings (:where(h1,h2,h3,h4):not(:where([class~=not-prose],[class~=not-prose] *))); 120 | @custom-variant prose-h1 (:where(h1):not(:where([class~=not-prose],[class~=not-prose] *))); 121 | @custom-variant prose-h2 (:where(h2):not(:where([class~=not-prose],[class~=not-prose] *))); 122 | @custom-variant prose-h3 (:where(h3):not(:where([class~=not-prose],[class~=not-prose] *))); 123 | @custom-variant prose-h4 (:where(h4):not(:where([class~=not-prose],[class~=not-prose] *))); 124 | @custom-variant prose-p (:where(p):not(:where([class~=not-prose],[class~=not-prose] *))); 125 | @custom-variant prose-a (:where(a):not(:where([class~=not-prose],[class~=not-prose] *))); 126 | @custom-variant prose-blockquote (:where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *))); 127 | @custom-variant prose-code (:where(code):not(:where([class~=not-prose],[class~=not-prose] *))); 128 | @custom-variant prose-ol (:where(ol):not(:where([class~=not-prose],[class~=not-prose] *))); 129 | @custom-variant prose-ul (:where(ul):not(:where([class~=not-prose],[class~=not-prose] *))); 130 | @custom-variant prose-li (:where(li):not(:where([class~=not-prose],[class~=not-prose] *))); 131 | 132 | @plugin '@tailwindcss/forms'; 133 | 134 | html { 135 | --sc-text-dark: #0f2321; 136 | --sc-text: #0f2321; 137 | --sc-bg: #f5fefb; 138 | --sc-100: #defcf0; 139 | --sc-200: #7ae5be; 140 | --sc-300: #4fdaac; 141 | --sc-400: #1abd94; 142 | --sc-link: #2e7e6a; 143 | --sc-yellow: #cedd23; 144 | --sc-purple: #9f7ccf; 145 | 146 | scrollbar-color: var(--sc-300) var(--sc-100); 147 | } 148 | 149 | html.dark { 150 | color-scheme: dark; 151 | --sc-text: #dbf0ee; 152 | --sc-bg: #161d1c; 153 | --sc-100: #21322c; 154 | --sc-200: #23574e; 155 | --sc-300: #296f60; 156 | --sc-400: #4fc4a7; 157 | --sc-link: #84dbc7; 158 | --sc-yellow: #666b2e; 159 | --sc-purple: #764cb1; 160 | } 161 | 162 | .changing-theme, 163 | .changing-theme * { 164 | transition: none !important; 165 | } 166 | 167 | @font-face { 168 | font-family: "Mona Space"; 169 | font-style: normal; 170 | font-display: swap; 171 | font-weight: normal; 172 | src: url("/fonts/MonaspaceNeon-Regular-v1.101.woff2") format("woff2"); 173 | } 174 | -------------------------------------------------------------------------------- /docs/src/assets/header_logo_dark.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /docs/src/assets/header_logo_light.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /docs/src/assets/shiki.css: -------------------------------------------------------------------------------- 1 | html { 2 | --shiki-background: var(--sc-100); 3 | --shiki-foreground: hsl(249, 87%, 6%); 4 | --shiki-token-comment: hsl(171, 21%, 35%); 5 | --shiki-token-constant: hsl(278, 80%, 47%); 6 | --shiki-token-string-expression: hsl(138, 70%, 25%); 7 | 8 | --shiki-token-keyword: hsl(206, 75%, 35%); 9 | --shiki-token-punctuation: hsl(206, 75%, 35%); 10 | --shiki-token-function: hsl(0, 70%, 46%); 11 | } 12 | 13 | html.dark { 14 | --shiki-foreground: hsl(253, 26%, 83%); 15 | --shiki-token-comment: hsl(156, 6%, 83%); 16 | --shiki-token-constant: hsl(278, 100%, 87%); 17 | --shiki-token-string-expression: hsl(138, 61%, 75%); 18 | 19 | --shiki-token-keyword: hsl(206, 65%, 75%); 20 | --shiki-token-punctuation: hsl(206, 65%, 75%); 21 | --shiki-token-function: hsl(0, 100%, 86%); 22 | } 23 | -------------------------------------------------------------------------------- /docs/src/components/Background.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | Match, 3 | Switch, 4 | type VoidComponent, 5 | createEffect, 6 | createSignal, 7 | onCleanup, 8 | } from 'solid-js' 9 | 10 | const Background: VoidComponent<{ type: 'home' | 'docs' }> = (props) => { 11 | const [x, setX] = createSignal(null) 12 | const [y, setY] = createSignal(null) 13 | 14 | createEffect(() => { 15 | const onPointerMove = (e: PointerEvent) => { 16 | setX(e.clientX) 17 | setY(e.clientY) 18 | } 19 | const onPointerOut = () => { 20 | setX(null) 21 | setY(null) 22 | } 23 | 24 | window.addEventListener('pointermove', onPointerMove) 25 | window.addEventListener('pointerout', onPointerOut) 26 | 27 | onCleanup(() => { 28 | window.removeEventListener('pointermove', onPointerMove) 29 | window.removeEventListener('pointerout', onPointerOut) 30 | }) 31 | }) 32 | 33 | return ( 34 | 35 | 36 |
37 |