diff --git a/app/globals.css b/app/globals.css
index 6b8508af..696d0810 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -52,6 +52,15 @@ html.dark {
--bg-subtle: rgba(255,255,255,0.04);
}
+.catppuccin-file-icon {
+ display: block;
+ flex-shrink: 0;
+ background: center / contain no-repeat var(--catppuccin-icon-light);
+}
+html.dark .catppuccin-file-icon {
+ background-image: var(--catppuccin-icon-dark);
+}
+
/* Theme toggle: circular wipe via View Transitions API.
Disable the UA cross-fade; the actual clip-path animation is driven by
Element.animate() in hooks/useTheme.ts after transition.ready resolves. */
diff --git a/components/FileIcons.tsx b/components/FileIcons.tsx
index 6ce7a9a6..b46d21a9 100644
--- a/components/FileIcons.tsx
+++ b/components/FileIcons.tsx
@@ -1,249 +1,126 @@
-// Flat monochrome file & folder icons — all use currentColor / var(--text-dim)
+import type { CSSProperties } from "react";
+
interface IconProps {
size?: number;
}
-const DIM = "var(--text-dim)";
+type CatppuccinIconName =
+ | "_file"
+ | "_folder"
+ | "_folder_open"
+ | "bash"
+ | "config"
+ | "css"
+ | "database"
+ | "docker"
+ | "env"
+ | "git"
+ | "graphql"
+ | "html"
+ | "javascript"
+ | "javascript-react"
+ | "json"
+ | "lock"
+ | "npm-lock"
+ | "bun-lock"
+ | "next"
+ | "eslint"
+ | "markdown"
+ | "ms-word"
+ | "pdf"
+ | "python"
+ | "rust"
+ | "sass"
+ | "terraform"
+ | "toml"
+ | "typescript"
+ | "typescript-react"
+ | "yaml"
+ | "go";
-// ── Folder ────────────────────────────────────────────────────────────────
+const CATPPUCCIN_ICONS_ROOT = "/icons/catppuccin";
-export function FolderIcon({ size = 14, open = false }: IconProps & { open?: boolean }) {
- if (open) {
- return (
-
- );
- }
- return (
-
- );
-}
-
-// ── Generic file (fallback) ────────────────────────────────────────────────
+function CatppuccinIcon({ name, size = 14 }: IconProps & { name: CatppuccinIconName }) {
+ const style = {
+ width: size,
+ height: size,
+ "--catppuccin-icon-light": `url(${CATPPUCCIN_ICONS_ROOT}/latte/${name}.svg)`,
+ "--catppuccin-icon-dark": `url(${CATPPUCCIN_ICONS_ROOT}/mocha/${name}.svg)`,
+ } as CSSProperties;
-export function GenericFileIcon({ size = 14 }: IconProps) {
return (
-
+
);
}
-// ── File with label text (used for most types) ────────────────────────────
-// Renders the file outline + a short text badge
+export function FolderIcon({ size = 14, open = false }: IconProps & { open?: boolean }) {
+ return ;
+}
-function LabelFileIcon({ label, size = 14 }: { label: string; size?: number }) {
- const s = size / 14; // scale factor
- return (
-
- );
+export function GenericFileIcon({ size = 14 }: IconProps) {
+ return ;
}
-// ── Specific icons ────────────────────────────────────────────────────────
+const EXTENSION_ICONS: Record = {
+ ts: "typescript",
+ tsx: "typescript-react",
+ js: "javascript",
+ mjs: "javascript",
+ cjs: "javascript",
+ jsx: "javascript-react",
+ py: "python",
+ json: "json",
+ jsonl: "json",
+ css: "css",
+ less: "css",
+ scss: "sass",
+ html: "html",
+ htm: "html",
+ md: "markdown",
+ mdx: "markdown",
+ yaml: "yaml",
+ yml: "yaml",
+ toml: "toml",
+ sh: "bash",
+ bash: "bash",
+ zsh: "bash",
+ fish: "bash",
+ rs: "rust",
+ go: "go",
+ sql: "database",
+ graphql: "graphql",
+ gql: "graphql",
+ tf: "terraform",
+ hcl: "terraform",
+ docx: "ms-word",
+ pdf: "pdf",
+ lock: "lock",
+};
-export function TypeScriptIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function TypeScriptReactIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function JavaScriptIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function JavaScriptReactIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function PythonIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function JsonIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function CssIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function ScssIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function HtmlIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function MarkdownIcon({ size = 14 }: IconProps) {
- // file outline + M↓ symbol
- return (
-
- );
-}
-export function YamlIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function TomlIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function ShellIcon({ size = 14 }: IconProps) {
- // file outline + > prompt
- return (
-
- );
-}
-export function RustIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function GoIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function SqlIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function GraphqlIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function TerraformIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function DockerfileIcon({ size = 14 }: IconProps) {
- // file outline + container stack
- return (
-
- );
+function getSpecialFileIcon(name: string): CatppuccinIconName | undefined {
+ if (name === "dockerfile" || name.startsWith("dockerfile.")) return "docker";
+ if (name === ".env" || name.startsWith(".env.")) return "env";
+ if ([".gitignore", ".gitattributes", ".gitmodules"].includes(name)) return "git";
+ if (name === "package-lock.json") return "npm-lock";
+ if (name === "bun.lock") return "bun-lock";
+ if (["next.config.js", "next.config.mjs", "next.config.cjs", "next.config.ts"].includes(name)) return "next";
+ if ([".eslintrc", ".eslintrc.js", ".eslintrc.json", ".eslintrc.yml", "eslint.config.mjs", "eslint.config.js"].includes(name)) return "eslint";
+ if (["yarn.lock", "pnpm-lock.yaml", "cargo.lock"].includes(name)) return "lock";
+ if (name.endsWith(".config.ts") || name.endsWith(".config.js") || name.endsWith(".config.mjs") || name.endsWith(".config.cjs")) return "config";
+ return undefined;
}
-export function EnvIcon({ size = 14 }: IconProps) {
- // file outline + key symbol
- return (
-
- );
-}
-export function GitIcon({ size = 14 }: IconProps) {
- // file outline + git branch lines
- return (
-
- );
-}
-export function LockFileIcon({ size = 14 }: IconProps) {
- return (
-
- );
-}
-export function DocFileIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function PdfFileIcon({ size = 14 }: IconProps) {
- return ;
-}
-export function ConfigIcon({ size = 14 }: IconProps) {
- return (
-
- );
-}
-
-// ── Main resolver ─────────────────────────────────────────────────────────
export function getFileIcon(name: string, size = 14): React.ReactNode {
const lower = name.toLowerCase();
- const ext = lower.split(".").pop() ?? "";
-
- if (lower === "dockerfile" || lower.startsWith("dockerfile.")) return ;
- if (lower === ".env" || lower.startsWith(".env.")) return ;
- if (lower === ".gitignore" || lower === ".gitattributes" || lower === ".gitmodules") return ;
- if (lower === "package-lock.json" || lower === "yarn.lock" || lower === "bun.lock" || lower === "pnpm-lock.yaml" || lower === "cargo.lock") return ;
- if (lower.endsWith(".config.ts") || lower.endsWith(".config.js") || lower.endsWith(".config.mjs") || lower.endsWith(".config.cjs")) return ;
- if ([".eslintrc", ".eslintrc.js", ".eslintrc.json", ".eslintrc.yml", "eslint.config.mjs", "eslint.config.js"].includes(lower)) return ;
+ const specialIcon = getSpecialFileIcon(lower);
+ if (specialIcon) return ;
- switch (ext) {
- case "ts": return ;
- case "tsx": return ;
- case "js":
- case "mjs":
- case "cjs": return ;
- case "jsx": return ;
- case "py": return ;
- case "json":
- case "jsonl": return ;
- case "css":
- case "less": return ;
- case "scss": return ;
- case "html":
- case "htm": return ;
- case "md":
- case "mdx": return ;
- case "yaml":
- case "yml": return ;
- case "toml": return ;
- case "sh":
- case "bash":
- case "zsh":
- case "fish": return ;
- case "rs": return ;
- case "go": return ;
- case "sql": return ;
- case "graphql":
- case "gql": return ;
- case "tf":
- case "hcl": return ;
- case "docx": return ;
- case "pdf": return ;
- case "lock": return ;
- default: return ;
- }
+ const ext = lower.split(".").pop() ?? "";
+ const icon = EXTENSION_ICONS[ext];
+ return icon ? : ;
}
diff --git a/public/icons/catppuccin/LICENSE b/public/icons/catppuccin/LICENSE
new file mode 100644
index 00000000..a17469de
--- /dev/null
+++ b/public/icons/catppuccin/LICENSE
@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) 2023 Catppuccin
+Copyright (c) 2023 thang-nm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/public/icons/catppuccin/README.md b/public/icons/catppuccin/README.md
new file mode 100644
index 00000000..274e4d92
--- /dev/null
+++ b/public/icons/catppuccin/README.md
@@ -0,0 +1,8 @@
+# Catppuccin file icons
+
+This directory contains a selected subset of [Catppuccin Icons for VSCode](https://github.com/catppuccin/vscode-icons), version `v1.26.0` (`b6915da9f6889b683a110aa747de96c2820a537d`).
+
+- `latte/` is used in Pi Web's light theme.
+- `mocha/` is used in Pi Web's dark theme.
+
+The copied assets are licensed under the MIT License. See [LICENSE](./LICENSE).
diff --git a/public/icons/catppuccin/latte/_file.svg b/public/icons/catppuccin/latte/_file.svg
new file mode 100644
index 00000000..a3bd1d0c
--- /dev/null
+++ b/public/icons/catppuccin/latte/_file.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/latte/_folder.svg b/public/icons/catppuccin/latte/_folder.svg
new file mode 100644
index 00000000..de099fab
--- /dev/null
+++ b/public/icons/catppuccin/latte/_folder.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/latte/_folder_open.svg b/public/icons/catppuccin/latte/_folder_open.svg
new file mode 100644
index 00000000..0e3967c7
--- /dev/null
+++ b/public/icons/catppuccin/latte/_folder_open.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/latte/bash.svg b/public/icons/catppuccin/latte/bash.svg
new file mode 100644
index 00000000..0224341e
--- /dev/null
+++ b/public/icons/catppuccin/latte/bash.svg
@@ -0,0 +1,7 @@
+
diff --git a/public/icons/catppuccin/latte/bun-lock.svg b/public/icons/catppuccin/latte/bun-lock.svg
new file mode 100644
index 00000000..32b5b5f5
--- /dev/null
+++ b/public/icons/catppuccin/latte/bun-lock.svg
@@ -0,0 +1,8 @@
+
diff --git a/public/icons/catppuccin/latte/config.svg b/public/icons/catppuccin/latte/config.svg
new file mode 100644
index 00000000..5c59073b
--- /dev/null
+++ b/public/icons/catppuccin/latte/config.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/latte/css.svg b/public/icons/catppuccin/latte/css.svg
new file mode 100644
index 00000000..d3a631e4
--- /dev/null
+++ b/public/icons/catppuccin/latte/css.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/latte/database.svg b/public/icons/catppuccin/latte/database.svg
new file mode 100644
index 00000000..a94da60f
--- /dev/null
+++ b/public/icons/catppuccin/latte/database.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/latte/docker.svg b/public/icons/catppuccin/latte/docker.svg
new file mode 100644
index 00000000..e616b6e0
--- /dev/null
+++ b/public/icons/catppuccin/latte/docker.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/latte/env.svg b/public/icons/catppuccin/latte/env.svg
new file mode 100644
index 00000000..b71316d6
--- /dev/null
+++ b/public/icons/catppuccin/latte/env.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/latte/eslint.svg b/public/icons/catppuccin/latte/eslint.svg
new file mode 100644
index 00000000..5420ddbc
--- /dev/null
+++ b/public/icons/catppuccin/latte/eslint.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/latte/git.svg b/public/icons/catppuccin/latte/git.svg
new file mode 100644
index 00000000..25fe218a
--- /dev/null
+++ b/public/icons/catppuccin/latte/git.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/latte/go.svg b/public/icons/catppuccin/latte/go.svg
new file mode 100644
index 00000000..28b03070
--- /dev/null
+++ b/public/icons/catppuccin/latte/go.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/latte/graphql.svg b/public/icons/catppuccin/latte/graphql.svg
new file mode 100644
index 00000000..d937a0ad
--- /dev/null
+++ b/public/icons/catppuccin/latte/graphql.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/latte/html.svg b/public/icons/catppuccin/latte/html.svg
new file mode 100644
index 00000000..09fe5116
--- /dev/null
+++ b/public/icons/catppuccin/latte/html.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/latte/javascript-react.svg b/public/icons/catppuccin/latte/javascript-react.svg
new file mode 100644
index 00000000..be3e8428
--- /dev/null
+++ b/public/icons/catppuccin/latte/javascript-react.svg
@@ -0,0 +1,8 @@
+
diff --git a/public/icons/catppuccin/latte/javascript.svg b/public/icons/catppuccin/latte/javascript.svg
new file mode 100644
index 00000000..6886c812
--- /dev/null
+++ b/public/icons/catppuccin/latte/javascript.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/latte/json.svg b/public/icons/catppuccin/latte/json.svg
new file mode 100644
index 00000000..472329ca
--- /dev/null
+++ b/public/icons/catppuccin/latte/json.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/latte/lock.svg b/public/icons/catppuccin/latte/lock.svg
new file mode 100644
index 00000000..d9cabc21
--- /dev/null
+++ b/public/icons/catppuccin/latte/lock.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/latte/markdown.svg b/public/icons/catppuccin/latte/markdown.svg
new file mode 100644
index 00000000..5c2de66f
--- /dev/null
+++ b/public/icons/catppuccin/latte/markdown.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/latte/ms-word.svg b/public/icons/catppuccin/latte/ms-word.svg
new file mode 100644
index 00000000..7af20ae1
--- /dev/null
+++ b/public/icons/catppuccin/latte/ms-word.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/latte/next.svg b/public/icons/catppuccin/latte/next.svg
new file mode 100644
index 00000000..008a1b9a
--- /dev/null
+++ b/public/icons/catppuccin/latte/next.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/latte/npm-lock.svg b/public/icons/catppuccin/latte/npm-lock.svg
new file mode 100644
index 00000000..d8f3abc9
--- /dev/null
+++ b/public/icons/catppuccin/latte/npm-lock.svg
@@ -0,0 +1,7 @@
+
diff --git a/public/icons/catppuccin/latte/pdf.svg b/public/icons/catppuccin/latte/pdf.svg
new file mode 100644
index 00000000..b8fef72a
--- /dev/null
+++ b/public/icons/catppuccin/latte/pdf.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/latte/python.svg b/public/icons/catppuccin/latte/python.svg
new file mode 100644
index 00000000..57ff32a5
--- /dev/null
+++ b/public/icons/catppuccin/latte/python.svg
@@ -0,0 +1,8 @@
+
diff --git a/public/icons/catppuccin/latte/rust.svg b/public/icons/catppuccin/latte/rust.svg
new file mode 100644
index 00000000..6f604661
--- /dev/null
+++ b/public/icons/catppuccin/latte/rust.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/latte/sass.svg b/public/icons/catppuccin/latte/sass.svg
new file mode 100644
index 00000000..d1ca68d6
--- /dev/null
+++ b/public/icons/catppuccin/latte/sass.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/latte/terraform.svg b/public/icons/catppuccin/latte/terraform.svg
new file mode 100644
index 00000000..80b3c936
--- /dev/null
+++ b/public/icons/catppuccin/latte/terraform.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/latte/toml.svg b/public/icons/catppuccin/latte/toml.svg
new file mode 100644
index 00000000..2290522e
--- /dev/null
+++ b/public/icons/catppuccin/latte/toml.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/latte/typescript-react.svg b/public/icons/catppuccin/latte/typescript-react.svg
new file mode 100644
index 00000000..a63329ba
--- /dev/null
+++ b/public/icons/catppuccin/latte/typescript-react.svg
@@ -0,0 +1,8 @@
+
diff --git a/public/icons/catppuccin/latte/typescript.svg b/public/icons/catppuccin/latte/typescript.svg
new file mode 100644
index 00000000..18d0b1ad
--- /dev/null
+++ b/public/icons/catppuccin/latte/typescript.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/latte/yaml.svg b/public/icons/catppuccin/latte/yaml.svg
new file mode 100644
index 00000000..75261fbf
--- /dev/null
+++ b/public/icons/catppuccin/latte/yaml.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/_file.svg b/public/icons/catppuccin/mocha/_file.svg
new file mode 100644
index 00000000..02ad12fe
--- /dev/null
+++ b/public/icons/catppuccin/mocha/_file.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/_folder.svg b/public/icons/catppuccin/mocha/_folder.svg
new file mode 100644
index 00000000..6a521698
--- /dev/null
+++ b/public/icons/catppuccin/mocha/_folder.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/_folder_open.svg b/public/icons/catppuccin/mocha/_folder_open.svg
new file mode 100644
index 00000000..e66842a2
--- /dev/null
+++ b/public/icons/catppuccin/mocha/_folder_open.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/bash.svg b/public/icons/catppuccin/mocha/bash.svg
new file mode 100644
index 00000000..cd7f25b9
--- /dev/null
+++ b/public/icons/catppuccin/mocha/bash.svg
@@ -0,0 +1,7 @@
+
diff --git a/public/icons/catppuccin/mocha/bun-lock.svg b/public/icons/catppuccin/mocha/bun-lock.svg
new file mode 100644
index 00000000..91474632
--- /dev/null
+++ b/public/icons/catppuccin/mocha/bun-lock.svg
@@ -0,0 +1,8 @@
+
diff --git a/public/icons/catppuccin/mocha/config.svg b/public/icons/catppuccin/mocha/config.svg
new file mode 100644
index 00000000..b54c7f89
--- /dev/null
+++ b/public/icons/catppuccin/mocha/config.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/css.svg b/public/icons/catppuccin/mocha/css.svg
new file mode 100644
index 00000000..e263e090
--- /dev/null
+++ b/public/icons/catppuccin/mocha/css.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/mocha/database.svg b/public/icons/catppuccin/mocha/database.svg
new file mode 100644
index 00000000..44cd9b16
--- /dev/null
+++ b/public/icons/catppuccin/mocha/database.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/docker.svg b/public/icons/catppuccin/mocha/docker.svg
new file mode 100644
index 00000000..02a91617
--- /dev/null
+++ b/public/icons/catppuccin/mocha/docker.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/env.svg b/public/icons/catppuccin/mocha/env.svg
new file mode 100644
index 00000000..4a444fda
--- /dev/null
+++ b/public/icons/catppuccin/mocha/env.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/eslint.svg b/public/icons/catppuccin/mocha/eslint.svg
new file mode 100644
index 00000000..1543d1b1
--- /dev/null
+++ b/public/icons/catppuccin/mocha/eslint.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/mocha/git.svg b/public/icons/catppuccin/mocha/git.svg
new file mode 100644
index 00000000..f66c6e51
--- /dev/null
+++ b/public/icons/catppuccin/mocha/git.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/mocha/go.svg b/public/icons/catppuccin/mocha/go.svg
new file mode 100644
index 00000000..9c402b3e
--- /dev/null
+++ b/public/icons/catppuccin/mocha/go.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/graphql.svg b/public/icons/catppuccin/mocha/graphql.svg
new file mode 100644
index 00000000..6425cd4b
--- /dev/null
+++ b/public/icons/catppuccin/mocha/graphql.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/html.svg b/public/icons/catppuccin/mocha/html.svg
new file mode 100644
index 00000000..756a2515
--- /dev/null
+++ b/public/icons/catppuccin/mocha/html.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/mocha/javascript-react.svg b/public/icons/catppuccin/mocha/javascript-react.svg
new file mode 100644
index 00000000..f350d827
--- /dev/null
+++ b/public/icons/catppuccin/mocha/javascript-react.svg
@@ -0,0 +1,8 @@
+
diff --git a/public/icons/catppuccin/mocha/javascript.svg b/public/icons/catppuccin/mocha/javascript.svg
new file mode 100644
index 00000000..8647aee9
--- /dev/null
+++ b/public/icons/catppuccin/mocha/javascript.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/mocha/json.svg b/public/icons/catppuccin/mocha/json.svg
new file mode 100644
index 00000000..1b7b2bd7
--- /dev/null
+++ b/public/icons/catppuccin/mocha/json.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/lock.svg b/public/icons/catppuccin/mocha/lock.svg
new file mode 100644
index 00000000..44ed745b
--- /dev/null
+++ b/public/icons/catppuccin/mocha/lock.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/markdown.svg b/public/icons/catppuccin/mocha/markdown.svg
new file mode 100644
index 00000000..5aef18a9
--- /dev/null
+++ b/public/icons/catppuccin/mocha/markdown.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/ms-word.svg b/public/icons/catppuccin/mocha/ms-word.svg
new file mode 100644
index 00000000..5c86c172
--- /dev/null
+++ b/public/icons/catppuccin/mocha/ms-word.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/mocha/next.svg b/public/icons/catppuccin/mocha/next.svg
new file mode 100644
index 00000000..f5ccf157
--- /dev/null
+++ b/public/icons/catppuccin/mocha/next.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/mocha/npm-lock.svg b/public/icons/catppuccin/mocha/npm-lock.svg
new file mode 100644
index 00000000..9e131268
--- /dev/null
+++ b/public/icons/catppuccin/mocha/npm-lock.svg
@@ -0,0 +1,7 @@
+
diff --git a/public/icons/catppuccin/mocha/pdf.svg b/public/icons/catppuccin/mocha/pdf.svg
new file mode 100644
index 00000000..c5c055eb
--- /dev/null
+++ b/public/icons/catppuccin/mocha/pdf.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/python.svg b/public/icons/catppuccin/mocha/python.svg
new file mode 100644
index 00000000..c7100c09
--- /dev/null
+++ b/public/icons/catppuccin/mocha/python.svg
@@ -0,0 +1,8 @@
+
diff --git a/public/icons/catppuccin/mocha/rust.svg b/public/icons/catppuccin/mocha/rust.svg
new file mode 100644
index 00000000..898f91cb
--- /dev/null
+++ b/public/icons/catppuccin/mocha/rust.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/mocha/sass.svg b/public/icons/catppuccin/mocha/sass.svg
new file mode 100644
index 00000000..314f7a84
--- /dev/null
+++ b/public/icons/catppuccin/mocha/sass.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/terraform.svg b/public/icons/catppuccin/mocha/terraform.svg
new file mode 100644
index 00000000..e9e082ea
--- /dev/null
+++ b/public/icons/catppuccin/mocha/terraform.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/toml.svg b/public/icons/catppuccin/mocha/toml.svg
new file mode 100644
index 00000000..6253d354
--- /dev/null
+++ b/public/icons/catppuccin/mocha/toml.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/icons/catppuccin/mocha/typescript-react.svg b/public/icons/catppuccin/mocha/typescript-react.svg
new file mode 100644
index 00000000..d4951441
--- /dev/null
+++ b/public/icons/catppuccin/mocha/typescript-react.svg
@@ -0,0 +1,8 @@
+
diff --git a/public/icons/catppuccin/mocha/typescript.svg b/public/icons/catppuccin/mocha/typescript.svg
new file mode 100644
index 00000000..2ddb5d73
--- /dev/null
+++ b/public/icons/catppuccin/mocha/typescript.svg
@@ -0,0 +1,6 @@
+
diff --git a/public/icons/catppuccin/mocha/yaml.svg b/public/icons/catppuccin/mocha/yaml.svg
new file mode 100644
index 00000000..74a560e3
--- /dev/null
+++ b/public/icons/catppuccin/mocha/yaml.svg
@@ -0,0 +1,3 @@
+