Oops! The page you're looking for could not be found.
11 |Please check the URL or go back to the homepage.
12 |├── .editorconfig ├── .github └── workflows │ ├── build.yml │ ├── deploy.yml │ └── test.yml ├── .gitignore ├── .husky └── pre-commit ├── .prettierignore ├── .prettierrc.mjs ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── assets └── preview.webp ├── astro.config.mjs ├── e2e ├── ports.test.ts └── themeSwitcher.test.ts ├── package.json ├── playwright.config.ts ├── pnpm-lock.yaml ├── public ├── CNAME ├── embed.png ├── favicon.png ├── humans.txt ├── maintainers │ ├── 256x256 │ │ └── placeholder.webp │ └── 64x64 │ │ └── placeholder.webp ├── pronunciation.mp3 └── robots.txt ├── renovate.json ├── src ├── components │ ├── PageIntro.astro │ ├── Pills.svelte │ ├── ProfilePicture.svelte │ ├── ThemeSelect.svelte │ └── ThemeSwitcher.astro ├── content.config.ts ├── data │ ├── blog │ │ ├── celebrating-three-years-of-catppuccin.mdx │ │ ├── celebrating-three-years-of-catppuccin.png │ │ ├── state-of-catppuccin-2024.mdx │ │ ├── why-we-ditched-the-icon-for-external-links.mdx │ │ └── why-we-ditched-the-icon-for-external-links.png │ ├── governance.ts │ ├── icons.json │ ├── icons.ts │ ├── icons │ │ ├── logo-text.svg │ │ ├── logo.svg │ │ ├── lucide-user-round-x.svg │ │ ├── magnifying-glass.svg │ │ ├── org │ │ │ ├── core.svg │ │ │ ├── moderator.svg │ │ │ ├── staff.svg │ │ │ └── userstyles-staff.svg │ │ ├── ports │ │ │ ├── cursors.svg │ │ │ ├── folders.svg │ │ │ ├── gboard.svg │ │ │ ├── gitui.svg │ │ │ ├── hexchat.svg │ │ │ ├── lxqt.svg │ │ │ ├── minecraft.svg │ │ │ ├── qutebrowser.svg │ │ │ ├── windows-files.svg │ │ │ ├── zathura.svg │ │ │ └── zellij.svg │ │ └── speaker-high-volume.svg │ ├── links.ts │ ├── ports.ts │ ├── propertyBasedSet.ts │ └── scripts │ │ ├── convertIconsToJson.ts │ │ └── fetchMaintainerAvatars.ts ├── layouts │ ├── Default.astro │ ├── Landing.astro │ ├── Skeleton.astro │ └── components │ │ ├── AccentBar.astro │ │ ├── Footer.astro │ │ ├── Head.astro │ │ └── Navigation.astro ├── pages │ ├── 404 │ │ └── index.astro │ ├── _components │ │ └── LaptopIllustration.astro │ ├── blog │ │ ├── [id].astro │ │ ├── _components │ │ │ └── ArticleCard.astro │ │ ├── _logic │ │ │ ├── [id].test.ts │ │ │ └── [id].ts │ │ └── index.astro │ ├── community │ │ ├── _components │ │ │ ├── TeamName.astro │ │ │ └── UserCard.astro │ │ └── index.astro │ ├── index.astro │ ├── licensing │ │ └── index.astro │ ├── palette │ │ ├── _components │ │ │ ├── CopyToClipboardButton.svelte │ │ │ └── FlavorName.astro │ │ └── index.astro │ ├── ports │ │ ├── _components │ │ │ ├── PortCard.svelte │ │ │ ├── PortExplorer.svelte │ │ │ ├── PortGrid.svelte │ │ │ ├── PortMaintainers.svelte │ │ │ ├── SearchBar.svelte │ │ │ └── state.svelte.ts │ │ └── index.astro │ └── rss.xml.js └── styles │ ├── _buttons.scss │ ├── _palette.scss │ ├── _scaffolding.scss │ ├── _tables.scss │ ├── _typography.scss │ ├── _utils.scss │ └── global.scss ├── svelte.config.js ├── tsconfig.json └── vitest.config.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # EditorConfig is awesome: https://EditorConfig.org 4 | 5 | root = true 6 | 7 | [*] 8 | charset = utf-8 9 | indent_size = 2 10 | indent_style = space 11 | max_line_length = 120 12 | end_of_line = lf 13 | insert_final_newline = true 14 | trim_trailing_whitespace = true 15 | 16 | # documentation, utils 17 | [*.{md,mdx,diff}] 18 | trim_trailing_whitespace = false 19 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build Site 2 | 3 | on: 4 | pull_request: 5 | types: [opened, synchronize, reopened, closed] 6 | branches: [main] 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | if: ${{ github.repository == 'catppuccin/website' }} 12 | permissions: 13 | pull-requests: write 14 | steps: 15 | - uses: actions/checkout@v4 16 | - uses: withastro/action@v4 17 | - name: Build & Deploy To Surge 18 | if: ${{ env.surge_token != '' }} 19 | uses: afc163/surge-preview@a17bbee72e236f18b248797bbf21f1f9f06900e6 20 | id: preview_step 21 | with: 22 | surge_token: ${{ secrets.SURGE_TOKEN }} 23 | dist: dist 24 | build: echo "Website Already Built" 25 | teardown: "true" 26 | failOnError: "true" 27 | env: 28 | surge_token: ${{ secrets.SURGE_TOKEN }} 29 | - name: Output Preview URL 30 | if: ${{ env.surge_token != '' }} 31 | run: echo "url => ${{ steps.preview_step.outputs.preview_url }}" 32 | env: 33 | surge_token: ${{ secrets.SURGE_TOKEN }} 34 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy Site 2 | 3 | on: 4 | workflow_dispatch: 5 | schedule: 6 | - cron: "0 0 * * *" 7 | push: 8 | branches: [main] 9 | 10 | permissions: 11 | contents: read 12 | pages: write 13 | id-token: write 14 | 15 | jobs: 16 | build: 17 | runs-on: ubuntu-latest 18 | steps: 19 | - uses: actions/checkout@v4 20 | - uses: withastro/action@v4 21 | env: 22 | CATPPUCCIN_PROD: true 23 | 24 | deploy: 25 | needs: build 26 | runs-on: ubuntu-latest 27 | environment: 28 | name: github-pages 29 | url: ${{ steps.deployment.outputs.page_url }} 30 | steps: 31 | - name: Deploy to GitHub Pages 32 | id: deployment 33 | uses: actions/deploy-pages@v4 34 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: e2e 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: [main] 7 | pull_request: 8 | branches: [main] 9 | 10 | jobs: 11 | test: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | - uses: pnpm/action-setup@v4 16 | - uses: actions/setup-node@v4 17 | with: 18 | node-version: lts/* 19 | cache: pnpm 20 | - run: pnpm i --frozen-lockfile 21 | - run: pnpm dlx playwright install --with-deps 22 | - run: pnpm run maintainers 23 | - run: pnpm run test:e2e 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # build output 2 | dist/ 3 | coverage/ 4 | 5 | # generated types 6 | .astro/ 7 | 8 | # dependencies 9 | node_modules/ 10 | 11 | # logs 12 | npm-debug.log* 13 | yarn-debug.log* 14 | yarn-error.log* 15 | pnpm-debug.log* 16 | 17 | # environment variables 18 | .env 19 | .env.production 20 | 21 | # macOS-specific files 22 | .DS_Store 23 | 24 | # GitHub avatars 25 | src/data/maintainers 26 | public/maintainers/64x64/* 27 | public/maintainers/256x256/* 28 | !public/maintainers/64x64/placeholder.webp 29 | !public/maintainers/256x256/placeholder.webp 30 | 31 | # Playwright 32 | /test-results/ 33 | /playwright-report/ 34 | /blob-report/ 35 | /playwright/.cache/ 36 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | pnpm check && pnpm lint-staged -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # Content Collections 2 | **/*.mdx 3 | 4 | # Package Managers 5 | package-lock.json 6 | pnpm-lock.yaml 7 | yarn.lock 8 | -------------------------------------------------------------------------------- /.prettierrc.mjs: -------------------------------------------------------------------------------- 1 | // .prettierrc.mjs 2 | /** @type {import("prettier").Config} */ 3 | export default { 4 | printWidth: 120, 5 | bracketSameLine: true, 6 | plugins: ["prettier-plugin-astro"], 7 | overrides: [ 8 | { 9 | files: "*.astro", 10 | options: { 11 | parser: "astro", 12 | }, 13 | }, 14 | ], 15 | }; 16 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "esbenp.prettier-vscode", 3 | "[javascript]": { 4 | "editor.defaultFormatter": "esbenp.prettier-vscode" 5 | }, 6 | "[typescript]": { 7 | "editor.defaultFormatter": "esbenp.prettier-vscode" 8 | }, 9 | "[svelte]": { 10 | "editor.defaultFormatter": "svelte.svelte-vscode" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Catppuccin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this website and associated documentation files (the "Website"), to deal in the 7 | Website without restriction, including without limitation the rights to use, 8 | copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 9 | Website, and to permit persons to whom the Website is furnished to do so, 10 | 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 Website. 14 | 15 | The Website is provided "as is", without warranty of any kind, express or 16 | implied, including but not limited to the warranties of merchantability, fitness 17 | for a particular purpose and noninfringement. In no event shall the authors or 18 | copyright holders be liable for any claim, damages or other liability, whether 19 | in an action of contract, tort or otherwise, araising from, out of or in 20 | connection with the Website or the use or other dealings in the Website. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
15 |
16 |
35 |
36 |
Copyright © 2021-present Catppuccin Org 38 |
41 | -------------------------------------------------------------------------------- /assets/preview.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catppuccin/website/34e28ce3b625acfa9a288af2744f67454b03d89e/assets/preview.webp -------------------------------------------------------------------------------- /astro.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "astro/config"; 2 | import sitemap from "@astrojs/sitemap"; 3 | import svelte from "@astrojs/svelte"; 4 | import mdx from "@astrojs/mdx"; 5 | import icon from "astro-icon"; 6 | import { rehypeHeadingIds } from "@astrojs/markdown-remark"; 7 | import rehypeAutolinkHeadings from "rehype-autolink-headings"; 8 | import yaml from "@rollup/plugin-yaml"; 9 | import astroExpressiveCode from "astro-expressive-code"; 10 | import getReadingTime from "reading-time"; 11 | import { toString } from "mdast-util-to-string"; 12 | 13 | const remarkReadingTime = () => { 14 | return function (tree, { data }) { 15 | const textOnPage = toString(tree); 16 | const readingTime = getReadingTime(textOnPage); 17 | data.astro.frontmatter.minutesRead = readingTime.text; 18 | }; 19 | }; 20 | 21 | // https://astro.build/config 22 | export default defineConfig({ 23 | site: "https://catppuccin.com", 24 | vite: { 25 | plugins: [yaml()], 26 | }, 27 | markdown: { 28 | rehypePlugins: [ 29 | rehypeHeadingIds, 30 | [ 31 | rehypeAutolinkHeadings, 32 | { 33 | behavior: "wrap", 34 | headingProperties: { 35 | className: ["rehype-heading"], 36 | }, 37 | properties: { 38 | className: ["rehype-heading-link"], 39 | }, 40 | }, 41 | ], 42 | ], 43 | }, 44 | integrations: [ 45 | astroExpressiveCode({ 46 | themes: ["catppuccin-latte", "catppuccin-mocha", "catppuccin-frappe", "catppuccin-macchiato"], 47 | themeCssSelector: (theme) => { 48 | const themeName = theme.name.split("-")[1]; 49 | const selector = `[data-theme='${themeName}']`; 50 | return selector; 51 | }, 52 | useDarkModeMediaQuery: true, 53 | // Stop it from auto-correcting colour contrast 54 | minSyntaxHighlightingColorContrast: 0, 55 | styleOverrides: { 56 | frames: { 57 | tooltipSuccessBackground: "var(--green)", 58 | tooltipSuccessForeground: "var(--base)", 59 | }, 60 | textMarkers: { 61 | insBackground: "color-mix(in oklab, var(--green) 25%, var(--mantle));", 62 | insBorderColor: "var(--surface0)", 63 | delBackground: "color-mix(in oklab, var(--red) 25%, var(--mantle));", 64 | delBorderColor: "var(--surface0)", 65 | }, 66 | codePaddingInline: "var(--space-md)", 67 | uiFontSize: "1.5rem", 68 | codeFontSize: "1.4rem", 69 | codeBackground: "var(--mantle)", 70 | }, 71 | }), 72 | sitemap(), 73 | icon({ 74 | iconDir: "src/data/icons", 75 | }), 76 | svelte(), 77 | mdx({ 78 | remarkPlugins: [remarkReadingTime], 79 | }), 80 | ], 81 | }); 82 | -------------------------------------------------------------------------------- /e2e/ports.test.ts: -------------------------------------------------------------------------------- 1 | import { categories, ports } from "@data/ports"; 2 | import { test, expect } from "@playwright/test"; 3 | 4 | test("search filter works", async ({ page }) => { 5 | await page.goto("/ports"); 6 | 7 | await page.getByRole("textbox").fill("tailwindcss"); 8 | await page.waitForTimeout(100); 9 | 10 | expect(await page.locator(".port-card").count()).toBe(1); 11 | expect(new URL(page.url()).searchParams.get("q")).toBe("tailwindcss"); 12 | }); 13 | 14 | test("platform filter works", async ({ page }) => { 15 | await page.goto("/ports"); 16 | 17 | await page.getByLabel("Linux").evaluate((element) => (element as HTMLElement).click()); 18 | 19 | expect(await page.locator(".port-card").count()).toBe(ports.filter((port) => port.platform.includes("linux")).length); 20 | expect(new URL(page.url()).searchParams.get("p")).toBe("linux"); 21 | }); 22 | 23 | test("category filter works", async ({ page }) => { 24 | await page.goto("/ports"); 25 | 26 | await page.getByLabel("Userstyles").evaluate((element) => (element as HTMLElement).click()); 27 | 28 | expect(await page.locator(".port-card").count()).toBe(categories.find((cat) => cat.key === "userstyle")?.portCount); 29 | expect(new URL(page.url()).searchParams.get("c")).toBe("userstyle"); 30 | 31 | // Deselect the category on another click 32 | await page.getByLabel("Userstyles").evaluate((element) => (element as HTMLElement).click()); 33 | 34 | expect(await page.locator(".port-card").count()).toBe(ports.length); 35 | }); 36 | 37 | test("ports and userstyles are differentiated", async ({ page }) => { 38 | await page.goto("/ports"); 39 | 40 | await page.getByRole("textbox").fill("mdbook"); 41 | await page.waitForTimeout(200); 42 | 43 | expect(await page.locator(".port-card").count()).toBe(2); 44 | expect(new URL(page.url()).searchParams.get("q")).toBe("mdbook"); 45 | const portNames = page.locator(".port-name"); 46 | expect(portNames.nth(0)).toContainText(/mdBook \(userstyle\)/i); 47 | expect(portNames.nth(1)).toContainText(/mdBook/i); 48 | }); 49 | -------------------------------------------------------------------------------- /e2e/themeSwitcher.test.ts: -------------------------------------------------------------------------------- 1 | import { flavors } from "@catppuccin/palette"; 2 | import { test, expect, type Page } from "@playwright/test"; 3 | 4 | test.use({ colorScheme: "light" }); 5 | 6 | const assertCssVariable = async (page: Page, actual: string, expected: string) => { 7 | const cssVar = await page.evaluate( 8 | (varName) => getComputedStyle(document.documentElement).getPropertyValue(varName).trim(), 9 | actual, 10 | ); 11 | expect(cssVar).toBe(expected); 12 | }; 13 | 14 | test("changing theme works", async ({ page }) => { 15 | await page.goto("/"); 16 | await assertCssVariable(page, "--base", flavors.latte.colors.base.hex); 17 | expect(await page.evaluate(() => localStorage.getItem("theme"))).toBe(null); 18 | const themeSwitcher = page.locator("#themeSelector"); 19 | await expect(themeSwitcher).toBeVisible(); 20 | expect(await themeSwitcher.inputValue()).toBe("system"); 21 | 22 | await themeSwitcher.selectOption("frappe"); 23 | 24 | expect(await page.evaluate(() => localStorage.getItem("theme"))).toBe("frappe"); 25 | await assertCssVariable(page, "--base", flavors.frappe.colors.base.hex); 26 | }); 27 | 28 | test("changing theme with view transitions works", async ({ page }) => { 29 | await page.goto("/blog/"); 30 | await assertCssVariable(page, "--base", flavors.latte.colors.base.hex); 31 | expect(await page.evaluate(() => localStorage.getItem("theme"))).toBe(null); 32 | const themeSwitcher = page.locator("#themeSelector"); 33 | await expect(themeSwitcher).toBeVisible(); 34 | expect(await themeSwitcher.inputValue()).toBe("system"); 35 | 36 | await themeSwitcher.selectOption("macchiato"); 37 | 38 | expect(await page.evaluate(() => localStorage.getItem("theme"))).toBe("macchiato"); 39 | await assertCssVariable(page, "--base", flavors.macchiato.colors.base.hex); 40 | 41 | await page.goto("/blog/celebrating-three-years-of-catppuccin/"); 42 | await assertCssVariable(page, "--base", flavors.macchiato.colors.base.hex); 43 | 44 | await page.goto("/blog/"); 45 | await assertCssVariable(page, "--base", flavors.macchiato.colors.base.hex); 46 | }); 47 | 48 | test("theme switches on media query", async ({ page }) => { 49 | await page.goto("/"); 50 | await assertCssVariable(page, "--base", flavors.latte.colors.base.hex); 51 | expect(await page.evaluate(() => localStorage.getItem("theme"))).toBe(null); 52 | const themeSwitcher = page.locator("#themeSelector"); 53 | await expect(themeSwitcher).toBeVisible(); 54 | expect(await themeSwitcher.inputValue()).toBe("system"); 55 | 56 | await assertCssVariable(page, "--base", flavors.latte.colors.base.hex); 57 | await page.emulateMedia({ colorScheme: "dark" }); 58 | await assertCssVariable(page, "--base", flavors.mocha.colors.base.hex); 59 | }); 60 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "website", 3 | "version": "0.0.1", 4 | "private": true, 5 | "type": "module", 6 | "scripts": { 7 | "astro": "astro", 8 | "build": "pnpm run maintainers && pnpm run test:run && astro check && astro build", 9 | "check": "astro check", 10 | "dev": "astro dev", 11 | "fmt": "prettier --plugin=prettier-plugin-astro . --write", 12 | "icons": "pnpm tsx src/data/scripts/convertIconsToJson.ts", 13 | "maintainers": "pnpm tsx src/data/scripts/fetchMaintainerAvatars.ts", 14 | "prepare": "husky", 15 | "preview": "astro preview", 16 | "start": "astro dev", 17 | "test": "vitest", 18 | "test:run": "vitest run", 19 | "test:cov": "vitest run --coverage", 20 | "test:e2e": "pnpm exec playwright test", 21 | "test:e2e:ui": "pnpm exec playwright test --ui", 22 | "test:ci": "vitest run && pnpm run test:e2e" 23 | }, 24 | "lint-staged": { 25 | "src/**/*": "pnpm run fmt" 26 | }, 27 | "devDependencies": { 28 | "@astrojs/check": "^0.9.4", 29 | "@astrojs/markdown-remark": "^6.3.1", 30 | "@astrojs/mdx": "^4.2.5", 31 | "@astrojs/rss": "^4.0.10", 32 | "@astrojs/sitemap": "^3.4.0", 33 | "@astrojs/svelte": "^7.0.11", 34 | "@catppuccin/catppuccin": "github:catppuccin/catppuccin#7e4506607b8a6c298ce0876e385c52281e879245", 35 | "@catppuccin/palette": "^1.7.1", 36 | "@iconify-json/ph": "^1.2.1", 37 | "@iconify-json/simple-icons": "^1.2.33", 38 | "@iconify/svelte": "^5.0.0", 39 | "@iconify/tools": "^4.1.2", 40 | "@iconify/types": "^2.0.0", 41 | "@playwright/test": "^1.52.0", 42 | "@rollup/plugin-yaml": "^4.1.2", 43 | "@types/node": "^22.15.18", 44 | "@vitest/coverage-v8": "^3.1.3", 45 | "astro": "^5.7.13", 46 | "astro-expressive-code": "^0.41.0", 47 | "astro-icon": "1.1.5", 48 | "fuse.js": "^7.1.0", 49 | "husky": "^9.1.7", 50 | "lint-staged": "^16.0.0", 51 | "mdast-util-to-string": "^4.0.0", 52 | "playwright": "^1.52.0", 53 | "prettier": "^3.5.3", 54 | "prettier-plugin-astro": "^0.14.1", 55 | "reading-time": "^1.5.0", 56 | "rehype-autolink-headings": "^7.1.0", 57 | "sass": "^1.89.0", 58 | "sharp": "^0.34.0", 59 | "surge": "^0.24.6", 60 | "svelte": "^5.30.2", 61 | "svelte-intersection-observer-action": "^0.0.5", 62 | "tsx": "^4.19.2", 63 | "typescript": "^5.7.2", 64 | "vitest": "^3.1.3", 65 | "yaml": "^2.8.0" 66 | }, 67 | "packageManager": "pnpm@10.11.0", 68 | "engines": { 69 | "node": ">=22" 70 | }, 71 | "pnpm": { 72 | "onlyBuiltDependencies": [ 73 | "@parcel/watcher", 74 | "esbuild", 75 | "sharp" 76 | ] 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /playwright.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig, devices } from "@playwright/test"; 2 | 3 | /** 4 | * See https://playwright.dev/docs/test-configuration. 5 | */ 6 | export default defineConfig({ 7 | testDir: "./e2e", 8 | /* Run tests in files in parallel */ 9 | fullyParallel: true, 10 | /* Fail the build on CI if you accidentally left test.only in the source code. */ 11 | forbidOnly: !!process.env.CI, 12 | /* Retry on CI only */ 13 | retries: process.env.CI ? 2 : 0, 14 | /* Opt out of parallel tests on CI. */ 15 | workers: process.env.CI ? 1 : undefined, 16 | /* Reporter to use. See https://playwright.dev/docs/test-reporters */ 17 | reporter: "html", 18 | /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ 19 | use: { 20 | /* Base URL to use in actions like `await page.goto('/')`. */ 21 | baseURL: "http://localhost:4321/", 22 | 23 | /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ 24 | trace: "on-first-retry", 25 | }, 26 | 27 | /* Configure projects for major browsers */ 28 | projects: [ 29 | { 30 | name: "chromium", 31 | use: { ...devices["Desktop Chrome"] }, 32 | }, 33 | { 34 | name: "firefox", 35 | use: { ...devices["Desktop Firefox"] }, 36 | }, 37 | ], 38 | 39 | webServer: { 40 | command: "pnpm dev", 41 | url: "http://localhost:4321/", 42 | reuseExistingServer: !process.env.CI, 43 | }, 44 | }); 45 | -------------------------------------------------------------------------------- /public/CNAME: -------------------------------------------------------------------------------- 1 | catppuccin.com -------------------------------------------------------------------------------- /public/embed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catppuccin/website/34e28ce3b625acfa9a288af2744f67454b03d89e/public/embed.png -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catppuccin/website/34e28ce3b625acfa9a288af2744f67454b03d89e/public/favicon.png -------------------------------------------------------------------------------- /public/humans.txt: -------------------------------------------------------------------------------- 1 | Catppuccin is not led by one person, 4 main teams are responsible for various different aspects of the project. 2 | And of course you! Whether you maintain your own port; have contributed via a pull request; or raised an issue. 3 | The community is at the heart and soul of Catppuccin. 4 | 5 | 6 | /* CORE */ 7 | Pocco 8 | GitHub: https://github.com/pocco81 9 | From: USA 10 | 11 | Hammy 12 | GitHub: https://github.com/sgoudham 13 | Website: https://goudham.com 14 | From: Scotland 15 | 16 | Lemon 17 | GitHub: https://github.com/unseen-ninja 18 | Website: https://unseen.ninja 19 | Discord: unseen.ninja 20 | From: Germany 21 | 22 | /* STAFF */ 23 | Spooky 24 | GitHub: https://github.com/ghostx31 25 | From: India 26 | 27 | Taka 28 | GitHub: https://github.com/taka0o 29 | From: Canada 30 | 31 | Isabel 32 | GitHub: https://github.com/isabelincorp 33 | From: USA 34 | 35 | pigeon 36 | GitHub: https://github.com/backwardspy 37 | Website: https://pigeon.life 38 | From: UK 39 | 40 | Amy 41 | GitHub: https://github.com/nullishamy 42 | From: UK 43 | 44 | /* USERSTYLES STAFF */ 45 | Bell 46 | GitHub: https://github.com/isabelroses 47 | Website: https://isabelroses.com 48 | From: UK 49 | 50 | uncenter 51 | GitHub: https://github.com/uncenter 52 | Website: https://uncenter.dev 53 | From: USA 54 | 55 | /* MODERATOR */ 56 | Nyx 57 | GitHub: https://github.com/nyxkrage 58 | E-Mail: carsten@kragelund.me 59 | From: Denmark 60 | 61 | Etzelia 62 | GitHub: https://github.com/jolheiser 63 | Website: https://jolheiser.com 64 | From: USA 65 | -------------------------------------------------------------------------------- /public/maintainers/256x256/placeholder.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catppuccin/website/34e28ce3b625acfa9a288af2744f67454b03d89e/public/maintainers/256x256/placeholder.webp -------------------------------------------------------------------------------- /public/maintainers/64x64/placeholder.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catppuccin/website/34e28ce3b625acfa9a288af2744f67454b03d89e/public/maintainers/64x64/placeholder.webp -------------------------------------------------------------------------------- /public/pronunciation.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catppuccin/website/34e28ce3b625acfa9a288af2744f67454b03d89e/public/pronunciation.mp3 -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | User-agent: GPTBot 4 | Disallow: / 5 | User-agent: ChatGPT-User 6 | Disallow: / 7 | User-agent: Google-Extended 8 | Disallow: / 9 | User-agent: CCBot 10 | Disallow: / 11 | User-agent: PerplexityBot 12 | Disallow: / 13 | 14 | Sitemap: https://catppuccin.com/sitemap-index.xml 15 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": ["config:recommended"] 4 | } 5 | -------------------------------------------------------------------------------- /src/components/PageIntro.astro: -------------------------------------------------------------------------------- 1 | --- 2 | interface Props { 3 | title: string; 4 | } 5 | 6 | const { title } = Astro.props; 7 | --- 8 | 9 |Oops! The page you're looking for could not be found.
11 |Please check the URL or go back to the homepage.
12 |{post.data.summary}
42 | 55 |{post.data.summary}
44 |{description}
23 |18 | Catppuccin is not governed or controlled by one person, 4 main teams are responsible for different parts of the 19 | project. 20 |
21 |22 | And of course you! Whether you maintain your own port; have contributed via a pull request; or raised 23 | an issue. The community is at the heart and soul of Catppuccin. 24 |
25 |38 | 39 | {team.identifier === "userstyles-staff" ? ( 40 | <> 41 | Overseers of all catppuccin/userstyles. 42 | > 43 | ) : ( 44 | team.description 45 | )} 46 | 47 |
48 |{team.responsibilities}
49 |62 | Maintainers of ports and userstyles, {currentMaintainers.length} in total. 63 |
64 |Responsible for the upkeep of their respective repositories.
65 |A community-driven color scheme meant for coding, designing, and much more!
13 | 39 |Copyright (c) {new Date(Date.now()).getFullYear()} Catppuccin
10 |11 | Permission is hereby granted, free of charge, to any person obtaining a copy of this website and associated 12 | documentation files (the "Website"), to deal in the Website without restriction, including without limitation the 13 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Website, and to 14 | permit persons to whom the Website is furnished to do so, subject to the following conditions: 15 |
16 |17 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of 18 | the Website. 19 |
20 |21 | The Website is provided »as is«, without warranty of any kind, express or implied, including but not 22 | limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event 23 | shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action 24 | of contract, tort or otherwise, araising from, out of or in connection with the Website or the use or other 25 | dealings in the Website. 26 |
27 |32 | The homepage illustration is designed by fullvector on 33 | freepik and has been modified for this website. 34 |
35 |26 | Catppuccin consists of 4 beautiful pastel color palettes, named flavors. The theme comes in one 27 | light and three dark variants: 28 |
45 | If you'd like to use them for your own project, refer to our 46 | style guide 47 | for general use cases and guidelines. Additionally, you can find integrations with popular frameworks and tools in 48 | catppuccin/palette. 49 |
50 | 51 | 52 |Color | 66 |Hex | 67 |RGB | 68 |HSL | 69 |
---|---|---|---|
75 | {name}76 | |
77 |
78 | |
82 |
83 | |
87 |
88 | |
92 |
{port.name}
26 |Sorry, we couldn't find any ports matching your search :(
16 |17 | You can request a port to be themed by raising a 18 | port request in catppuccin/catppuccin. 21 |
22 |17 | Catppuccin provides {ports.length} ports, covering a wide range of applications, tools, websites, 18 | and just about anything you can imagine! 19 |
20 |