Initial commit with Sveltekit + format files

This commit is contained in:
pheralb
2025-08-21 10:26:07 +01:00
parent ca4f397e0a
commit 459457a7e1
97 changed files with 3892 additions and 9893 deletions
+2 -1
View File
@@ -1,10 +1,11 @@
// See https://kit.svelte.dev/docs/types#app
// See https://svelte.dev/docs/kit/types#app.d.ts
// for information about these interfaces
declare global {
namespace App {
// interface Error {}
// interface Locals {}
// interface PageData {}
// interface PageState {}
// interface Platform {}
}
}
+3 -30
View File
@@ -2,37 +2,10 @@
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<meta name="robots" content="index, follow" />
<meta name="author" content="@pheralb_" />
<meta name="description" content="A beautiful library with SVG logos" />
<!-- Favicon -->
<link rel="icon" type="image/svg+xml" href="%sveltekit.assets%/images/logo.svg" />
<link rel="icon" type="image/ico" href="%sveltekit.assets%/images/logo_ico.ico" />
<!-- OG -->
<meta property="og:type" content="website" />
<meta property="og:title" content="svgl" />
<meta property="og:description" content="A beautiful library with SVG logos" />
<meta property="og:url" content="https://svgl.app" />
<meta property="og:image" content="https://svgl.app/images/screenshot.png" />
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Svgl" />
<meta name="twitter:description" content="A beautiful library with SVG logos" />
<meta name="twitter:creator" content="@pheralb_" />
<meta name="twitter:image" content="https://svgl.app/images/screenshot.png" />
<!-- Title -->
<title>A beautiful library with SVG logos - Svgl</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head%
</head>
<body
data-sveltekit-preload-data="hover"
class="min-h-screen scroll-smooth overscroll-none bg-white font-sans text-mini antialiased [text-rendering:optimizeLegibility;] selection:bg-neutral-200 dark:bg-dark dark:text-white dark:selection:bg-neutral-700"
>
<div>%sveltekit.body%</div>
<body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div>
</body>
</html>
-3
View File
@@ -1,3 +0,0 @@
<div class="container mx-auto px-6 pt-4 xl:px-[18px]">
<slot />
</div>
-514
View File
@@ -1,514 +0,0 @@
<script lang="ts">
import type { iSVG } from '@/types/svg';
import { ClipboardIcon, CopyIcon, Loader, X } from 'lucide-svelte';
import { toast } from 'svelte-sonner';
import * as Popover from '@/ui/popover';
import * as Tabs from '@/ui/tabs';
import { buttonStyles } from '@/ui/styles';
// Utils:
import { cn } from '@/utils/cn';
import { clipboard } from '@/utils/clipboard';
import { copyToClipboard as figmaCopyToClipboard } from '@/figma/copy-to-clipboard';
import { getPrefixFromSvgUrl, prefixSvgIds } from '@/utils/prefixSvgIds';
// Templates:
import { getSource } from '@/templates/getSource';
import { getReactCode } from '@/templates/getReactCode';
import { getVueCode } from '@/templates/getVueCode';
import { getSvelteCode } from '@/templates/getSvelteCode';
import { getAngularCode } from '@/templates/getAngularCode';
import { getWebComponent } from '@/templates/getWebComponent';
import { getAstroCode } from '@/templates/getAstroCode';
//Icons:
import ReactIcon from '@/components/icons/reactIcon.svelte';
import VueIcon from '@/components/icons/vueIcon.svelte';
import SvelteIcon from '@/components/icons/svelteIcon.svelte';
import AngularIcon from '@/components/icons/angularIcon.svelte';
import WebComponentIcon from '@/components/icons/webComponentIcon.svelte';
import AstroIcon from '@/components/icons/astroIcon.svelte';
// Props:
export let iconSize = 24;
export let iconStroke = 2;
export let isInFigma = false;
export let isWordmarkSvg = false;
export let svgInfo: iSVG;
// Variables:
let optionsOpen = false;
let isLoading = false;
const getSvgUrl = () => {
let svgUrlToCopy;
const dark = document.documentElement.classList.contains('dark');
if (isWordmarkSvg) {
const svgHasTheme = typeof svgInfo.wordmark !== 'string';
if (!svgHasTheme) {
svgUrlToCopy =
typeof svgInfo.wordmark === 'string'
? svgInfo.wordmark
: "Something went wrong. Couldn't copy the SVG.";
}
svgUrlToCopy =
typeof svgInfo.wordmark !== 'string'
? dark
? svgInfo.wordmark?.dark
: svgInfo.wordmark?.light
: svgInfo.wordmark;
} else {
const svgHasTheme = typeof svgInfo.route !== 'string';
if (!svgHasTheme) {
svgUrlToCopy =
typeof svgInfo.route === 'string'
? svgInfo.route
: "Something went wrong. Couldn't copy the SVG.";
}
svgUrlToCopy =
typeof svgInfo.route !== 'string'
? dark
? svgInfo.route.dark
: svgInfo.route.light
: svgInfo.route;
}
return svgUrlToCopy;
};
// Copy SVG to clipboard:
const copyToClipboard = async () => {
const svgUrlToCopy = getSvgUrl();
optionsOpen = false;
let content = await getSource({
url: svgUrlToCopy
});
if (svgUrlToCopy) {
content = prefixSvgIds(content, getPrefixFromSvgUrl(svgUrlToCopy));
}
if (isInFigma) {
figmaCopyToClipboard(content);
}
await clipboard(content);
const category = Array.isArray(svgInfo.category)
? svgInfo.category.sort().join(' - ')
: svgInfo.category;
if (isInFigma) {
toast.success('Ready to paste in Figma', {
description: `${svgInfo.title} - ${category}`
});
return;
}
if (isWordmarkSvg) {
toast.success('Copied wordmark SVG to clipboard', {
description: `${svgInfo.title} - ${category}`
});
return;
}
toast.success('Copied to clipboard', {
description: `${svgInfo.title} - ${category}`
});
};
// Convert SVG as React component:
const convertSvgReactComponent = async (tsx: boolean) => {
const svgUrlToCopy = getSvgUrl();
optionsOpen = false;
isLoading = true;
const title = svgInfo.title.split(' ').join('');
let content = await getSource({
url: svgUrlToCopy
});
if (svgUrlToCopy) {
content = prefixSvgIds(content, getPrefixFromSvgUrl(svgUrlToCopy));
}
const dataComponent = { code: content, typescript: tsx, name: title };
const { data, error } = await getReactCode(dataComponent);
if (error || !data) {
toast.error('Failed to fetch React component', {
description: `${error ?? ''}`,
duration: 5000
});
isLoading = false;
return;
}
await clipboard(data);
toast.success(`Copied as React ${tsx ? 'TSX' : 'JSX'} component`, {
description: `${svgInfo.title} - ${svgInfo.category}`
});
isLoading = false;
};
// Copy SVG as Vue Component:
const convertSvgVueComponent = async (ts: boolean) => {
try {
const svgUrlToCopy = getSvgUrl();
optionsOpen = false;
let content = await getSource({
url: svgUrlToCopy
});
if (svgUrlToCopy) {
content = prefixSvgIds(content, getPrefixFromSvgUrl(svgUrlToCopy));
}
const copyCode = getVueCode({
content: content,
lang: ts ? 'ts' : 'js'
});
if (copyCode) {
await clipboard(copyCode);
}
const category = Array.isArray(svgInfo?.category)
? svgInfo.category.sort().join(' - ')
: svgInfo.category;
toast.success(`Copied as Vue ${ts ? 'TS' : 'JS'} component`, {
description: `${svgInfo?.title} - ${category}`
});
} catch (err) {
console.error(`Error copying Vue component:`, err);
toast.error(`Failed to copy Vue component`);
}
};
// Copy SVG as Svelte Component:
const convertSvgSvelteComponent = async (ts: boolean) => {
try {
const svgUrlToCopy = getSvgUrl();
optionsOpen = false;
let content = await getSource({
url: svgUrlToCopy
});
if (svgUrlToCopy) {
content = prefixSvgIds(content, getPrefixFromSvgUrl(svgUrlToCopy));
}
const copyCode = getSvelteCode({
content: content,
lang: ts ? 'ts' : 'js'
});
if (copyCode) {
await clipboard(copyCode);
}
const category = Array.isArray(svgInfo?.category)
? svgInfo.category.sort().join(' - ')
: svgInfo.category;
toast.success(`Copied as Svelte ${ts ? 'TS' : 'JS'} component`, {
description: `${svgInfo?.title} - ${category}`
});
} catch (err) {
console.error(`Error copying Svelte component:`, err);
toast.error(`Failed to copy Svelte component`);
}
};
// Copy SVG as Standalone Angular component:
const convertSvgAngularComponent = async () => {
isLoading = true;
optionsOpen = false;
const title = svgInfo.title.split(' ').join('');
const svgUrlToCopy = getSvgUrl();
let content = await getSource({
url: svgUrlToCopy
});
if (svgUrlToCopy) {
content = prefixSvgIds(content, getPrefixFromSvgUrl(svgUrlToCopy));
}
if (!content) {
toast.error('Failed to fetch the SVG content', {
duration: 5000
});
isLoading = false;
return;
}
const angularComponent = getAngularCode({
componentName: title,
svgContent: content
});
await clipboard(angularComponent);
toast.success(`Copied as Standalone Angular component`, {
description: `${svgInfo.title} - ${svgInfo.category}`
});
isLoading = false;
};
// Copy SVG as Web Component:
const convertSvgWebComponent = async () => {
isLoading = true;
optionsOpen = false;
const title = svgInfo.title.split(' ').join('');
const svgUrlToCopy = getSvgUrl();
let content = await getSource({
url: svgUrlToCopy
});
if (svgUrlToCopy) {
content = prefixSvgIds(content, getPrefixFromSvgUrl(svgUrlToCopy));
}
if (!content) {
toast.error('Failed to fetch the SVG content', {
duration: 5000
});
isLoading = false;
return;
}
const webComponentCode = getWebComponent({
name: title,
content: content
});
await clipboard(webComponentCode);
toast.success(`Copied as Web Component`, {
description: `${svgInfo.title} - ${svgInfo.category}`
});
isLoading = false;
};
// Copy SVG as Astro component:
const convertSvgAstroComponent = async () => {
isLoading = true;
optionsOpen = false;
const svgUrlToCopy = getSvgUrl();
let content = await getSource({
url: svgUrlToCopy
});
if (svgUrlToCopy) {
content = prefixSvgIds(content, getPrefixFromSvgUrl(svgUrlToCopy));
}
if (!content) {
toast.error('Failed to fetch the SVG content', {
duration: 5000
});
isLoading = false;
return;
}
const astroComponentCode = getAstroCode({
svgContent: content
});
await clipboard(astroComponentCode);
toast.success(`Copied as Astro Component`, {
description: `${svgInfo.title} - ${svgInfo.category}`
});
isLoading = false;
};
</script>
<Popover.Root open={optionsOpen} onOpenChange={(isOpen) => (optionsOpen = isOpen)}>
<Popover.Trigger
title="Copy SVG element as svg file, React TSX code, or React JSX code"
class="flex items-center space-x-2 rounded-md p-2 duration-100 hover:bg-neutral-200 dark:hover:bg-neutral-700/40"
>
{#if optionsOpen}
<X size={iconSize} strokeWidth={iconStroke} />
{:else if isLoading}
<Loader size={iconSize} strokeWidth={iconStroke} class="animate-spin" />
{:else}
<CopyIcon size={iconSize} strokeWidth={iconStroke} />
{/if}
</Popover.Trigger>
<Popover.Content class="flex flex-col space-y-2 p-4" sideOffset={2}>
<Tabs.Root value="source" class="flex w-full flex-col space-y-1">
<Tabs.List>
<Tabs.Trigger value="source">Source</Tabs.Trigger>
<div
class="ml-3 flex flex-row space-x-0.5 border-l border-dashed border-neutral-200 pl-3 dark:border-neutral-800"
>
<Tabs.Trigger value="web-component" title="Web Component">
<WebComponentIcon iconSize={21} />
</Tabs.Trigger>
<Tabs.Trigger value="react" title="React">
<ReactIcon iconSize={20} />
</Tabs.Trigger>
<Tabs.Trigger value="vue" title="Vue">
<VueIcon iconSize={20} />
</Tabs.Trigger>
<Tabs.Trigger value="svelte" title="Svelte">
<SvelteIcon iconSize={20} />
</Tabs.Trigger>
<Tabs.Trigger value="angular" title="Angular">
<AngularIcon iconSize={20} />
</Tabs.Trigger>
<Tabs.Trigger value="astro" title="Astro" class="text-black dark:text-white">
<AstroIcon iconSize={21} />
</Tabs.Trigger>
</div>
</Tabs.List>
<Tabs.Content value="source">
<section class="flex flex-col space-y-2">
<button
class={cn(buttonStyles, 'w-full rounded-md')}
title={isWordmarkSvg ? 'Copy wordmark SVG to clipboard' : 'Copy SVG to clipboard'}
on:click={() => copyToClipboard()}
>
<ClipboardIcon size={16} strokeWidth={2} />
<span>Copy SVG</span>
</button>
</section>
</Tabs.Content>
<Tabs.Content value="react">
<section class="flex flex-col space-y-2">
<button
class={cn(buttonStyles, 'w-full rounded-md')}
title="Copy as React component"
disabled={isLoading}
on:click={() => convertSvgReactComponent(true)}
>
<ReactIcon iconSize={18} />
<span>Copy TSX</span>
</button>
<button
class={cn(buttonStyles, 'w-full rounded-md')}
title="Copy as React component"
disabled={isLoading}
on:click={() => convertSvgReactComponent(false)}
>
<ReactIcon iconSize={18} />
<span>Copy JSX</span>
</button>
</section>
</Tabs.Content>
<Tabs.Content value="svelte">
<section class="flex flex-col space-y-2">
<button
class={cn(buttonStyles, 'w-full rounded-md')}
title="Copy as Svelte component"
disabled={isLoading}
on:click={() => convertSvgSvelteComponent(false)}
>
<SvelteIcon iconSize={18} />
<span>Copy JS</span>
</button>
<button
class={cn(buttonStyles, 'w-full rounded-md')}
title="Copy as Svelte component"
disabled={isLoading}
on:click={() => convertSvgSvelteComponent(true)}
>
<SvelteIcon iconSize={18} />
<span>Copy TS</span>
</button>
</section>
</Tabs.Content>
<Tabs.Content value="vue">
<section class="flex flex-col space-y-2">
<button
class={cn(buttonStyles, 'w-full rounded-md')}
title="Copy as Vue component"
disabled={isLoading}
on:click={() => convertSvgVueComponent(false)}
>
<VueIcon iconSize={18} />
<span>Copy JS</span>
</button>
<button
class={cn(buttonStyles, 'w-full rounded-md')}
title="Copy as Vue component"
disabled={isLoading}
on:click={() => convertSvgVueComponent(true)}
>
<VueIcon iconSize={18} />
<span>Copy TS</span>
</button>
</section>
</Tabs.Content>
<Tabs.Content value="angular">
<section class="flex flex-col space-y-2">
<button
class={cn(buttonStyles, 'w-full rounded-md')}
title="Copy as Standalone Component"
disabled={isLoading}
on:click={() => convertSvgAngularComponent()}
>
<AngularIcon iconSize={18} />
<span>Copy Standalone Component</span>
</button>
</section>
</Tabs.Content>
<Tabs.Content value="web-component">
<section class="flex flex-col space-y-2">
<button
class={cn(buttonStyles, 'w-full rounded-md')}
title="Copy as Web Component"
disabled={isLoading}
on:click={() => convertSvgWebComponent()}
>
<WebComponentIcon iconSize={18} />
<span>Copy Web Component</span>
</button>
</section>
</Tabs.Content>
<Tabs.Content value="astro">
<section class="flex flex-col space-y-2">
<button
class={cn(buttonStyles, 'w-full rounded-md')}
title="Copy as Astro Component"
disabled={isLoading}
on:click={() => convertSvgAstroComponent()}
>
<AstroIcon iconSize={18} />
<span>Copy Astro Component</span>
</button>
</section>
</Tabs.Content>
</Tabs.Root>
<div
class="mt-1 flex w-full items-center text-center text-[12px] text-neutral-600 dark:text-neutral-400"
>
<p>
Remember to request permission from the creators for the use of the SVG. Modification is not
allowed.
</p>
</div>
</Popover.Content>
</Popover.Root>
-298
View File
@@ -1,298 +0,0 @@
<script lang="ts">
import type { iSVG } from '@/types/svg';
import JSZip from 'jszip';
import download from 'downloadjs';
import { toast } from 'svelte-sonner';
import { DownloadIcon } from 'lucide-svelte';
import { getSource } from '@/templates/getSource';
import {
Dialog,
DialogTrigger,
DialogContent,
DialogHeader,
DialogTitle,
DialogDescription,
DialogFooter
} from '@/ui/dialog';
import { buttonStyles } from '@/ui/styles';
import { cn } from '@/utils/cn';
import { getPrefixFromSvgUrl, prefixSvgIds } from '@/utils/prefixSvgIds';
// Props:
export let svgInfo: iSVG;
export let isDarkTheme: () => boolean;
// Shared:
let iconStroke = 1.8;
let iconSize = 16;
let mainDownloadStyles =
'flex items-center space-x-2 rounded-md p-2 duration-100 hover:bg-neutral-200 dark:hover:bg-neutral-700/40';
let cardDownloadStyles =
'flex w-full h-full flex-col p-4 rounded-md shadow-sm dark:bg-neutral-800/20 bg-neutral-200/10 border border-neutral-200 dark:border-neutral-800 space-y-2';
// Functions:
const downloadSvg = async (url?: string) => {
let content = await getSource({
url: url
});
if (url) {
content = prefixSvgIds(content, getPrefixFromSvgUrl(url));
}
download(content || '', url?.split('/').pop() || '', 'image/svg+xml');
const category = Array.isArray(svgInfo.category)
? svgInfo.category.sort().join(' - ')
: svgInfo.category;
toast.success(`Downloading...`, {
description: `${svgInfo.title} - ${category}`
});
};
// Download all variants:
const downloadAllVariants = async ({
lightRoute,
darkRoute,
isWordmark
}: {
lightRoute: string;
darkRoute: string;
isWordmark?: boolean;
}) => {
const zip = new JSZip();
let lightSvg = await getSource({
url: lightRoute
});
let darkSvg = await getSource({
url: darkRoute
});
lightSvg = prefixSvgIds(
lightSvg,
svgInfo.title.toLowerCase() + (isWordmark ? '_wordmark_light' : '_light')
);
darkSvg = prefixSvgIds(
darkSvg,
svgInfo.title.toLowerCase() + (isWordmark ? '_wordmark_dark' : '_dark')
);
if (isWordmark) {
zip.file(`${svgInfo.title}_wordmark_light.svg`, lightSvg);
zip.file(`${svgInfo.title}_wordmark_dark.svg`, darkSvg);
} else {
zip.file(`${svgInfo.title}_light.svg`, lightSvg);
zip.file(`${svgInfo.title}_dark.svg`, darkSvg);
}
zip.generateAsync({ type: 'blob' }).then((content) => {
download(
content,
isWordmark ? `${svgInfo.title}_wordmark_light_dark.zip` : `${svgInfo.title}_light_dark.zip`,
'application/zip'
);
});
const category = Array.isArray(svgInfo.category)
? svgInfo.category.sort().join(' - ')
: svgInfo.category;
toast.success('Downloading light & dark variants...', {
description: isWordmark
? `${svgInfo.title} - Wordmark - ${category}`
: `${svgInfo.title} - ${category}`
});
};
</script>
{#if typeof svgInfo.route === 'string' && svgInfo.wordmark === undefined}
<button
title="Download Light & Dark variants"
class={mainDownloadStyles}
on:click={() => {
if (typeof svgInfo.route === 'string') {
downloadSvg(svgInfo.route);
return;
}
}}
>
<DownloadIcon size={iconSize} strokeWidth={iconStroke} />
</button>
{:else}
<Dialog>
<DialogTrigger title="Download SVG" class={mainDownloadStyles}>
<DownloadIcon size={iconSize} strokeWidth={iconStroke} />
</DialogTrigger>
<DialogContent class="max-w-[630px]">
<DialogHeader>
<DialogTitle>Download {svgInfo.title} SVG</DialogTitle>
<DialogDescription>This logo has multiple options to download:</DialogDescription>
</DialogHeader>
<div
class={cn(
'flex h-full flex-col space-y-2 pb-0.5 pt-4',
'md:flex-row md:items-center md:justify-center md:space-x-2 md:space-y-0'
)}
>
{#if typeof svgInfo.route === 'string'}
<div class={cardDownloadStyles}>
<img
src={isDarkTheme() ? svgInfo.route : svgInfo.route}
alt={svgInfo.title}
class="my-4 h-8"
/>
<button
title="Download logo"
class={buttonStyles}
on:click={() => {
if (typeof svgInfo.route === 'string') {
downloadSvg(svgInfo.route);
return;
}
}}
>
<DownloadIcon class="mr-2" size={iconSize} />
<p>Icon logo</p>
</button>
</div>
{:else}
<div class={cardDownloadStyles}>
<img
src={isDarkTheme() ? svgInfo.route.dark : svgInfo.route.light}
alt={svgInfo.title}
class="my-4 h-10"
/>
<button
title="Logo with light & dark variants"
class={buttonStyles}
on:click={() => {
if (typeof svgInfo.route !== 'string') {
downloadAllVariants({
lightRoute: svgInfo.route.light,
darkRoute: svgInfo.route.dark
});
}
}}
>
<DownloadIcon size={iconSize} />
<p>Light & dark variants</p>
</button>
<button
title="Download light variant"
class={buttonStyles}
on:click={() => {
if (typeof svgInfo.route !== 'string') {
downloadSvg(svgInfo.route.light);
return;
}
}}
>
<DownloadIcon class="mr-2" size={iconSize} />
Only light variant
</button>
<button
title="Download dark variant"
class={buttonStyles}
on:click={() => {
if (typeof svgInfo.route !== 'string') {
downloadSvg(svgInfo.route.dark);
return;
}
}}
>
<DownloadIcon class="mr-2" size={iconSize} />
Only dark variant
</button>
</div>
{/if}
{#if typeof svgInfo.wordmark === 'string' && svgInfo.wordmark !== undefined}
<div class={cardDownloadStyles}>
<img
src={isDarkTheme() ? svgInfo.wordmark : svgInfo.wordmark}
alt={svgInfo.title}
class="my-4 h-8"
/>
<button
title="Download Wordmark logo"
class={buttonStyles}
on:click={() => {
if (typeof svgInfo.wordmark === 'string') {
downloadSvg(svgInfo.wordmark);
return;
}
}}
>
<DownloadIcon class="mr-2" size={iconSize} />
<p>Wordmark logo</p>
</button>
</div>
{/if}
{#if typeof svgInfo.wordmark !== 'string' && svgInfo.wordmark !== undefined}
<div class={cardDownloadStyles}>
<img
src={isDarkTheme() ? svgInfo.wordmark.dark : svgInfo.wordmark.light}
alt={svgInfo.title}
class="my-4 h-10"
/>
<button
title="Download Wordmark light variant"
class={buttonStyles}
on:click={() => {
if (typeof svgInfo.wordmark !== 'string') {
downloadAllVariants({
lightRoute: svgInfo.wordmark?.light || '',
darkRoute: svgInfo.wordmark?.dark || '',
isWordmark: true
});
return;
}
}}
>
<DownloadIcon class="mr-2" size={iconSize} />
Light & dark variants
</button>
<button
title="Download Wordmark light variant"
class={buttonStyles}
on:click={() => {
if (typeof svgInfo.wordmark !== 'string') {
downloadSvg(svgInfo.wordmark?.light);
return;
}
}}
>
<DownloadIcon class="mr-2" size={iconSize} />
Wordmark light variant
</button>
<button
title="Download Wordmark dark variant"
class={buttonStyles}
on:click={() => {
if (typeof svgInfo.wordmark !== 'string') {
downloadSvg(svgInfo.wordmark?.dark);
return;
}
}}
>
<DownloadIcon class="mr-2" size={iconSize} />
Wordmark dark variant
</button>
</div>
{/if}
</div>
<DialogFooter class="mt-3 text-xs text-neutral-600 dark:text-neutral-400">
<p>
Remember to request permission from the creators for the use of the SVG. Modification is
not allowed.
</p>
</DialogFooter>
</DialogContent>
</Dialog>
{/if}
-34
View File
@@ -1,34 +0,0 @@
<script lang="ts">
import { cn } from '@/utils/cn';
type methodType = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
export let method: methodType;
export let title: string;
export let description: string;
</script>
<div class={cn('border-2 border-neutral-100 dark:border-neutral-800 rounded-lg', 'p-4 mb-2')}>
<div class="flex items-center space-x-4 mb-4">
<p
class={cn(
'm-0 rounded-md font-medium px-1.5 py-0.5 text-sm leading-5 select-none',
method === 'GET' &&
' text-green-600 dark:text-green-500 bg-green-400/20 dark:bg-green-400/20',
method === 'POST' && ' text-blue-600 dark:text-blue-500 bg-blue-400/20 dark:bg-blue-400/20',
method === 'PUT' &&
' text-yellow-600 dark:text-yellow-500 bg-yellow-400/20 dark:bg-yellow-400/20',
method === 'PATCH' &&
' text-yellow-600 dark:text-yellow-500 bg-yellow-400/20 dark:bg-yellow-400/20',
method === 'DELETE' && ' text-red-600 dark:text-red-500 bg-red-400/20 dark:bg-red-400/20'
)}
>
{method}
</p>
<div class="flex flex-col space-y-0 m-0">
<h3 class="m-0 font-medium">{title}</h3>
<p class="mb-0 font-mono text-sm">{description}</p>
</div>
</div>
<slot />
</div>
-5
View File
@@ -1,5 +0,0 @@
<div
class="mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-2 lg:grid-cols-4 xl:grid-cols-5"
>
<slot />
</div>
-54
View File
@@ -1,54 +0,0 @@
<script lang="ts">
import { toast } from 'svelte-sonner';
import * as ContextMenu from '@/ui/context-menu';
import { ArrowUpRightIcon, CopyIcon, StarsIcon } from 'lucide-svelte';
import Logo from './icons/logo.svelte';
import { clipboard } from '@/utils/clipboard';
import GithubIcon from './icons/githubIcon.svelte';
import { getSource } from '@/templates/getSource';
const logoUrl = '/library/svgl.svg';
const copyToClipboard = async () => {
const content = await getSource({
url: logoUrl
});
await clipboard(content);
toast.success('Copied to clipboard', {
description: `Svgl - Library`
});
};
const openUrl = (url: string) => {
window.open(url, '_blank');
};
</script>
<ContextMenu.Root>
<ContextMenu.Trigger class="flex items-center space-x-2">
<a href="/" aria-label="Go to the SVGL v4.1 home page">
<div class="flex items-center space-x-2 opacity-100 transition-opacity hover:opacity-80">
<svelte:component this={Logo} />
<span class="hidden text-xl font-medium tracking-tight md:block">svgl</span>
</div>
</a>
</ContextMenu.Trigger>
<ContextMenu.Content>
<ContextMenu.Item on:click={() => copyToClipboard()}>
<CopyIcon size={16} strokeWidth={1.5} />
<span>Copy as SVG</span>
</ContextMenu.Item>
<ContextMenu.Item on:click={() => openUrl('https://github.com/pheralb/svgl')}>
<GithubIcon iconSize={16} />
<span>Repository</span>
<ArrowUpRightIcon class="text-neutral-400 dark:text-neutral-500" size={14} strokeWidth={2} />
</ContextMenu.Item>
<ContextMenu.Item disabled class="font-mono">
<StarsIcon size={16} strokeWidth={1.5} />
<span>v4.6.1</span>
</ContextMenu.Item>
</ContextMenu.Content>
</ContextMenu.Root>
-48
View File
@@ -1,48 +0,0 @@
<script lang="ts">
import type { IconProps } from '@/types/icon';
export let iconSize: IconProps['size'];
</script>
<svg
xmlns="http://www.w3.org/2000/svg"
width={iconSize || 16}
height={iconSize || 16}
viewBox="0 0 242 256"
><g clip-path="url(#a)"
><mask
id="b"
width="242"
height="256"
x="0"
y="0"
maskUnits="userSpaceOnUse"
style="mask-type:luminance"><path fill="#fff" d="M0 0h242v256H0V0Z" /></mask
><g mask="url(#b)"
><path
fill="url(#c)"
d="m241 43-9 136L149 0l92 43Zm-58 176-62 36-63-36 12-31h101l12 31ZM121 68l32 80H88l33-80ZM9 179 0 43 92 0 9 179Z"
/><path
fill="url(#d)"
d="m241 43-9 136L149 0l92 43Zm-58 176-62 36-63-36 12-31h101l12 31ZM121 68l32 80H88l33-80ZM9 179 0 43 92 0 9 179Z"
/></g
></g
><defs
><linearGradient id="c" x1="53.2" x2="245" y1="231.9" y2="140.7" gradientUnits="userSpaceOnUse"
><stop stop-color="#E40035" /><stop offset=".2" stop-color="#F60A48" /><stop
offset=".4"
stop-color="#F20755"
/><stop offset=".5" stop-color="#DC087D" /><stop offset=".7" stop-color="#9717E7" /><stop
offset="1"
stop-color="#6C00F5"
/></linearGradient
>
<linearGradient id="d" x1="44.5" x2="170" y1="30.7" y2="174" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF31D9" /><stop
offset="1"
stop-color="#FF5BE1"
stop-opacity="0"
/></linearGradient
><clipPath id="a"><path fill="#fff" d="M0 0h242v256H0z" /></clipPath></defs
></svg
>
-20
View File
@@ -1,20 +0,0 @@
<script lang="ts">
import type { IconProps } from '@/types/icon';
export let iconSize: IconProps['size'];
</script>
<svg
viewBox="0 0 256 366"
xmlns="http://www.w3.org/2000/svg"
width={iconSize || 16}
height={iconSize || 16}
preserveAspectRatio="xMidYMid"
><path
fill="currentColor"
d="M182.022 9.147c2.982 3.702 4.502 8.697 7.543 18.687L256 246.074a276.467 276.467 0 0 0-79.426-26.891L133.318 73.008a5.63 5.63 0 0 0-10.802.017L79.784 219.11A276.453 276.453 0 0 0 0 246.04L66.76 27.783c3.051-9.972 4.577-14.959 7.559-18.654a24.541 24.541 0 0 1 9.946-7.358C88.67 0 93.885 0 104.314 0h47.683c10.443 0 15.664 0 20.074 1.774a24.545 24.545 0 0 1 9.95 7.373Z"
/><path
fill="#FF5D01"
d="M189.972 256.46c-10.952 9.364-32.812 15.751-57.992 15.751-30.904 0-56.807-9.621-63.68-22.56-2.458 7.415-3.009 15.903-3.009 21.324 0 0-1.619 26.623 16.898 45.14 0-9.615 7.795-17.41 17.41-17.41 16.48 0 16.46 14.378 16.446 26.043l-.001 1.041c0 17.705 10.82 32.883 26.21 39.28a35.685 35.685 0 0 1-3.588-15.647c0-16.886 9.913-23.173 21.435-30.48 9.167-5.814 19.353-12.274 26.372-25.232a47.588 47.588 0 0 0 5.742-22.735c0-5.06-.786-9.938-2.243-14.516Z"
/></svg
>
-18
View File
@@ -1,18 +0,0 @@
<script lang="ts">
import type { IconProps } from '@/types/icon';
export let iconSize: IconProps['size'];
</script>
<svg
width={iconSize || 16}
height={iconSize || 16}
fill="none"
xmlns="http://www.w3.org/2000/svg"
preserveAspectRatio="xMidYMid"
viewBox="0 0 256 256"
><path
d="M128.001 0C57.317 0 0 57.307 0 128.001c0 56.554 36.676 104.535 87.535 121.46 6.397 1.185 8.746-2.777 8.746-6.158 0-3.052-.12-13.135-.174-23.83-35.61 7.742-43.124-15.103-43.124-15.103-5.823-14.795-14.213-18.73-14.213-18.73-11.613-7.944.876-7.78.876-7.78 12.853.902 19.621 13.19 19.621 13.19 11.417 19.568 29.945 13.911 37.249 10.64 1.149-8.272 4.466-13.92 8.127-17.116-28.431-3.236-58.318-14.212-58.318-63.258 0-13.975 5-25.394 13.188-34.358-1.329-3.224-5.71-16.242 1.24-33.874 0 0 10.749-3.44 35.21 13.121 10.21-2.836 21.16-4.258 32.038-4.307 10.878.049 21.837 1.47 32.066 4.307 24.431-16.56 35.165-13.12 35.165-13.12 6.967 17.63 2.584 30.65 1.255 33.873 8.207 8.964 13.173 20.383 13.173 34.358 0 49.163-29.944 59.988-58.447 63.157 4.591 3.972 8.682 11.762 8.682 23.704 0 17.126-.148 30.91-.148 35.126 0 3.407 2.304 7.398 8.792 6.14C219.37 232.5 256 184.537 256 128.002 256 57.307 198.691 0 128.001 0Zm-80.06 182.34c-.282.636-1.283.827-2.194.39-.929-.417-1.45-1.284-1.15-1.922.276-.655 1.279-.838 2.205-.399.93.418 1.46 1.293 1.139 1.931Zm6.296 5.618c-.61.566-1.804.303-2.614-.591-.837-.892-.994-2.086-.375-2.66.63-.566 1.787-.301 2.626.591.838.903 1 2.088.363 2.66Zm4.32 7.188c-.785.545-2.067.034-2.86-1.104-.784-1.138-.784-2.503.017-3.05.795-.547 2.058-.055 2.861 1.075.782 1.157.782 2.522-.019 3.08Zm7.304 8.325c-.701.774-2.196.566-3.29-.49-1.119-1.032-1.43-2.496-.726-3.27.71-.776 2.213-.558 3.315.49 1.11 1.03 1.45 2.505.701 3.27Zm9.442 2.81c-.31 1.003-1.75 1.459-3.199 1.033-1.448-.439-2.395-1.613-2.103-2.626.301-1.01 1.747-1.484 3.207-1.028 1.446.436 2.396 1.602 2.095 2.622Zm10.744 1.193c.036 1.055-1.193 1.93-2.715 1.95-1.53.034-2.769-.82-2.786-1.86 0-1.065 1.202-1.932 2.733-1.958 1.522-.03 2.768.818 2.768 1.868Zm10.555-.405c.182 1.03-.875 2.088-2.387 2.37-1.485.271-2.861-.365-3.05-1.386-.184-1.056.893-2.114 2.376-2.387 1.514-.263 2.868.356 3.061 1.403Z"
fill="currentColor"
/>
</svg>
-60
View File
@@ -1,60 +0,0 @@
<svg
width="30"
name="SVGL Logo"
viewBox="0 0 512 512"
fill="none"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
class=""
><rect
id="r4"
width="512"
height="512"
x="0"
y="0"
rx="128"
fill="#222"
stroke="#FFFFFF"
stroke-width="0"
stroke-opacity="100%"
paint-order="stroke"
></rect><rect
width="512"
height="512"
x="0"
y="0"
fill="url(#r6)"
rx="128"
style="mix-blend-mode: overlay;"
></rect><clipPath id="clip"><use xlink:href="#r4"></use></clipPath><defs
><linearGradient
id="r5"
gradientUnits="userSpaceOnUse"
gradientTransform="rotate(135)"
style="transform-origin: center center;"
><stop stop-color="#222"></stop><stop offset="1" stop-color="#222222"></stop></linearGradient
><radialGradient
id="r6"
cx="0"
cy="0"
r="1"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(256) rotate(90) scale(512)"
><stop stop-color="white"></stop><stop offset="1" stop-color="white" stop-opacity="0"
></stop></radialGradient
></defs
><svg
xmlns="http://www.w3.org/2000/svg"
width="310"
height="310"
fill="#e8e8e8"
viewBox="0 0 256 256"
x="101"
y="101"
alignment-baseline="middle"
style="color: rgb(255, 255, 255);"
><path
d="M168,32H88A56.06,56.06,0,0,0,32,88v80a56.06,56.06,0,0,0,56,56h48a8.07,8.07,0,0,0,2.53-.41c26.23-8.75,76.31-58.83,85.06-85.06A8.07,8.07,0,0,0,224,136V88A56.06,56.06,0,0,0,168,32ZM48,168V88A40,40,0,0,1,88,48h80a40,40,0,0,1,40,40v40H184a56.06,56.06,0,0,0-56,56v24H88A40,40,0,0,1,48,168Zm96,35.14V184a40,40,0,0,1,40-40h19.14C191,163.5,163.5,191,144,203.14Z"
></path></svg
></svg
>

Before

Width:  |  Height:  |  Size: 1.7 KiB

-22
View File
@@ -1,22 +0,0 @@
<script lang="ts">
import type { IconProps } from '@/types/icon';
export let iconSize: IconProps['size'];
export let className: IconProps['className'];
</script>
<svg
width={iconSize || 28}
height={iconSize || 28}
class={className}
viewBox="0 0 28 28"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M7 18.079V21L0 14L1.46 12.54L7 18.081V18.079ZM9.921 21H7L14 28L15.46 26.54L9.921 21ZM26.535 15.462L27.996 14L13.996 0L12.538 1.466L18.077 7.004H14.73L10.864 3.146L9.404 4.606L11.809 7.01H10.129V17.876H20.994V16.196L23.399 18.6L24.859 17.14L20.994 13.274V9.927L26.535 15.462ZM7.73 6.276L6.265 7.738L7.833 9.304L9.294 7.844L7.73 6.276ZM20.162 18.708L18.702 20.17L20.268 21.738L21.73 20.276L20.162 18.708ZM4.596 9.41L3.134 10.872L7 14.738V11.815L4.596 9.41ZM16.192 21.006H13.268L17.134 24.872L18.596 23.41L16.192 21.006Z"
fill="#FF6363"
/>
</svg>
File diff suppressed because one or more lines are too long
-19
View File
@@ -1,19 +0,0 @@
<script lang="ts">
import type { IconProps } from '@/types/icon';
export let iconSize: IconProps['size'];
</script>
<svg
xmlns="http://www.w3.org/2000/svg"
width={iconSize || 16}
height={iconSize || 16}
viewBox="0 0 256 308"
><path
fill="#FF3E00"
d="M239.682 40.707C211.113-.182 154.69-12.301 113.895 13.69L42.247 59.356a82.2 82.2 0 0 0-37.135 55.056a86.57 86.57 0 0 0 8.536 55.576a82.4 82.4 0 0 0-12.296 30.719a87.6 87.6 0 0 0 14.964 66.244c28.574 40.893 84.997 53.007 125.787 27.016l71.648-45.664a82.18 82.18 0 0 0 37.135-55.057a86.6 86.6 0 0 0-8.53-55.577a82.4 82.4 0 0 0 12.29-30.718a87.57 87.57 0 0 0-14.963-66.244"
/><path
fill="#FFF"
d="M106.889 270.841c-23.102 6.007-47.497-3.036-61.103-22.648a52.7 52.7 0 0 1-9.003-39.85a50 50 0 0 1 1.713-6.693l1.35-4.115l3.671 2.697a92.5 92.5 0 0 0 28.036 14.007l2.663.808l-.245 2.659a16.07 16.07 0 0 0 2.89 10.656a17.14 17.14 0 0 0 18.397 6.828a15.8 15.8 0 0 0 4.403-1.935l71.67-45.672a14.92 14.92 0 0 0 6.734-9.977a15.92 15.92 0 0 0-2.713-12.011a17.16 17.16 0 0 0-18.404-6.832a15.8 15.8 0 0 0-4.396 1.933l-27.35 17.434a52.3 52.3 0 0 1-14.553 6.391c-23.101 6.007-47.497-3.036-61.101-22.649a52.68 52.68 0 0 1-9.004-39.849a49.43 49.43 0 0 1 22.34-33.114l71.664-45.677a52.2 52.2 0 0 1 14.563-6.398c23.101-6.007 47.497 3.036 61.101 22.648a52.7 52.7 0 0 1 9.004 39.85a51 51 0 0 1-1.713 6.692l-1.35 4.116l-3.67-2.693a92.4 92.4 0 0 0-28.037-14.013l-2.664-.809l.246-2.658a16.1 16.1 0 0 0-2.89-10.656a17.14 17.14 0 0 0-18.398-6.828a15.8 15.8 0 0 0-4.402 1.935l-71.67 45.674a14.9 14.9 0 0 0-6.73 9.975a15.9 15.9 0 0 0 2.709 12.012a17.16 17.16 0 0 0 18.404 6.832a15.8 15.8 0 0 0 4.402-1.935l27.345-17.427a52.2 52.2 0 0 1 14.552-6.397c23.101-6.006 47.497 3.037 61.102 22.65a52.68 52.68 0 0 1 9.003 39.848a49.45 49.45 0 0 1-22.34 33.12l-71.664 45.673a52.2 52.2 0 0 1-14.563 6.398"
/></svg
>
-16
View File
@@ -1,16 +0,0 @@
<script lang="ts">
import type { IconProps } from '@/types/icon';
export let iconSize: IconProps['size'];
</script>
<svg
xmlns="http://www.w3.org/2000/svg"
width={iconSize || 16}
height={iconSize || 16}
viewBox="0 0 256 221"
><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0z" /><path
fill="#41B883"
d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0z"
/><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0z" /></svg
>
@@ -1,18 +0,0 @@
<script lang="ts">
import type { IconProps } from '@/types/icon';
export let iconSize: IconProps['size'];
</script>
<svg viewBox="0 0 128 128" width={iconSize || 16} height={iconSize || 16}>
<path
fill="var(--bgcolor, #fff)"
d="m31 12-1 1L2 63l29 51h67l15-26v-2l14-23-15-24v-2L98 12H31zm21 30h21l13 21-13 21H52L40 63z"
/>
<path fill="#166da5" d="m122 63-12 21-18-21 18-21z" />
<path fill="#8fdb69" d="M108 88 89 65 78 84l17 26z" />
<path fill="#166da5" d="M108 38 89 61 78 42l17-26z" />
<path d="M63 110 35 63l28-47H33L6 63l27 47z" />
<path fill="#287bbe" d="m50 38 13-22h32l13 22zm28 4h32l11 19H89z" />
<path fill="#ddf021" d="m50 88 13 22h32l13-22zm28-4h32l11-19H89z" />
</svg>
-19
View File
@@ -1,19 +0,0 @@
<script lang="ts">
import type { IconProps } from '@/types/icon';
export let size: IconProps['size'];
export let color: IconProps['color'];
</script>
<svg
xmlns="http://www.w3.org/2000/svg"
width={size || 16}
height={size || 16}
name="Twitter"
fill="none"
viewBox="0 0 1200 1227"
><path
fill={color || 'currentColor'}
d="M714.163 519.284 1160.89 0h-105.86L667.137 450.887 357.328 0H0l468.492 681.821L0 1226.37h105.866l409.625-476.152 327.181 476.152H1200L714.137 519.284h.026ZM569.165 687.828l-47.468-67.894-377.686-540.24h162.604l304.797 435.991 47.468 67.894 396.2 566.721H892.476L569.165 687.854v-.026Z"
/>
</svg>
-105
View File
@@ -1,105 +0,0 @@
<script lang="ts">
export let currentPath: string;
import { cn } from '@/utils/cn';
import Theme from './theme.svelte';
import { ArrowUpRight, CloudyIcon } from 'lucide-svelte';
import XIcon from './icons/xIcon.svelte';
import GithubIcon from './icons/githubIcon.svelte';
import HeaderLogoLink from './headerLogoLink.svelte';
const externalLinks = [
{
name: 'API',
url: '/api',
icon: CloudyIcon,
external: false,
label: "Go to the SVGL's API section"
},
{
name: 'Extensions',
url: 'https://github.com/pheralb/svgl?tab=readme-ov-file#-extensions',
icon: ArrowUpRight,
external: true,
label: "Go to the SVGL's extensions section"
},
{
name: 'Submit logo',
url: 'https://github.com/pheralb/svgl#-getting-started',
icon: ArrowUpRight,
external: true,
label: "Submit logo and go to the SVGL's getting started section"
}
];
</script>
<nav
class={cn(
'bg-white dark:bg-neutral-900',
'w-full border-b border-neutral-200 px-5 py-4 dark:border-neutral-800',
'sticky top-0 z-50',
'bg-white/90 backdrop-blur-md dark:bg-neutral-900/90'
)}
>
<div class="mx-auto flex items-center justify-between">
<HeaderLogoLink />
<div class="flex items-center space-x-0 md:space-x-7">
<div
class="flex items-center divide-x divide-dashed divide-neutral-300 dark:divide-neutral-700 md:space-x-4"
>
{#each externalLinks as link}
<a
href={link.url}
target={link.external ? '_blank' : ''}
aria-label={link.label ?? link.name}
class={cn(
'group flex items-center pl-2 text-[15px] opacity-80 transition-opacity hover:opacity-100 md:pl-3',
currentPath === link.url &&
'underline decoration-neutral-500 decoration-dotted underline-offset-8'
)}
>
{#if !link.external}
<svelte:component
this={link.icon}
size={16}
strokeWidth={1.5}
class="mr-2"
name={link.name}
/>
{/if}
<span class={cn('hidden md:block', !link.external && 'block')}>{link.name}</span>
{#if link.external}
<svelte:component
this={link.icon}
size={16}
name="External link"
strokeWidth={1.5}
class="ml-1 hidden transition-transform duration-300 group-hover:-translate-y-[1px] group-hover:translate-x-[1px] md:block"
/>
{/if}
</a>
{/each}
</div>
<div class="flex items-center space-x-4">
<a
href="https://twitter.com/pheralb_"
target="_blank"
class="flex items-center space-x-1 opacity-80 transition-opacity hover:opacity-100"
title="Twitter"
>
<XIcon size={16} color="currentColor" />
</a>
<a
href="https://github.com/pheralb/svgl"
target="_blank"
class="flex items-center space-x-1 opacity-80 transition-opacity hover:opacity-100"
title="GitHub"
>
<GithubIcon iconSize={19} />
</a>
<Theme />
</div>
</div>
</div>
</nav>
-29
View File
@@ -1,29 +0,0 @@
<script lang="ts">
import { buttonStyles } from '@/ui/styles';
export let notFoundTerm: string;
import { PackageOpen, ArrowUpRight } from 'lucide-svelte';
</script>
<div class="mt-6 flex w-full flex-col items-center justify-center text-gray-600 dark:text-gray-400">
<PackageOpen size={40} class="mb-4" />
<p class="text-xl mb-1 font-medium">Couldn't find the Icon</p>
<p class="text-md mb-4 font-mono">"{notFoundTerm}"</p>
<div class="flex items-center space-x-1">
<a
href="https://github.com/pheralb/svgl?tab=readme-ov-file#-getting-started"
target="_blank"
class={buttonStyles}
>
<span>Submit logo</span>
<ArrowUpRight size={16} />
</a>
<a
href="https://github.com/pheralb/svgl/issues/new?assignees=pheralb&labels=request&projects=&template=request-svg-.md&title=%5BRequest%5D%3A"
target="_blank"
class={buttonStyles}
>
<span>Request Icon</span>
<ArrowUpRight size={16} />
</a>
</div>
</div>
-77
View File
@@ -1,77 +0,0 @@
<script lang="ts">
import { page } from '$app/stores';
import { inputStyles } from '@/ui/styles';
import { Command, SearchIcon } from 'lucide-svelte';
export let searchTerm: string;
export let placeholder: string = 'Search...';
export let clearSearch: () => void;
import { X } from 'lucide-svelte';
let inputElement;
function focusInput(node: HTMLElement) {
const handleKeydown = (event: KeyboardEvent) => {
if ((event.metaKey || event.ctrlKey) && event.key === 'k') {
event.preventDefault();
node.focus();
}
};
window.addEventListener('keydown', handleKeydown);
return {
destroy() {
window.removeEventListener('keydown', handleKeydown);
}
};
}
let searchParams = {} as { [key: string]: string };
$: {
if ($page) {
searchParams = Object.fromEntries($page.url.searchParams);
if (!searchParams?.search) {
clearSearch();
}
}
}
</script>
<div class="sticky top-[63px] z-50">
<div class="relative w-full text-[16px]">
<div class="absolute inset-y-0 left-0 flex items-center pl-3 text-neutral-500">
<div class="pointer-events-none">
<SearchIcon size={20} strokeWidth={searchTerm ? 2.5 : 1.5} />
</div>
</div>
<input
type="text"
{placeholder}
autocomplete="off"
class={inputStyles}
bind:value={searchTerm}
on:input
use:focusInput
bind:this={inputElement}
/>
{#if searchTerm.length > 0}
<div class="absolute inset-y-0 right-0 flex items-center pr-3">
<button
type="button"
class="focus:outline-none focus:ring-1 focus:ring-neutral-300"
on:click={clearSearch}
>
<X size={18} />
</button>
</div>
{:else}
<div class="absolute inset-y-0 right-0 flex items-center pr-4 text-neutral-500">
<div class="flex h-full items-center pointer-events-none gap-x-1 font-mono">
<Command size={16} />
<span>K</span>
</div>
</div>
{/if}
</div>
</div>
-239
View File
@@ -1,239 +0,0 @@
<script lang="ts">
import type { iSVG } from '@/types/svg';
// Utils:
import { cn } from '@/utils/cn';
// Icons:
import {
LinkIcon,
ChevronsRight,
Baseline,
Sparkles,
EllipsisIcon,
TagIcon,
XIcon,
PaletteIcon
} from 'lucide-svelte';
// Components & styles:
import DownloadSvg from './downloadSvg.svelte';
import CopySvg from './copySvg.svelte';
import { badgeStyles, buttonStyles } from '@/ui/styles';
import * as Popover from '@/ui/popover';
// Figma
import { onMount } from 'svelte';
import { insertSVG as figmaInsertSVG } from '@/figma/insert-svg';
import { getSource } from '@/templates/getSource';
// Props:
export let svgInfo: iSVG;
export let searchTerm: string;
let isInFigma = false;
onMount(() => {
const searchParams = new URLSearchParams(window.location.search);
isInFigma = searchParams.get('figma') === '1';
});
// Wordmark SVG:
let wordmarkSvg = false;
$: {
if (searchTerm) {
wordmarkSvg = false;
}
}
const insertSVG = async (url?: string) => {
const content = (await getSource({
url
})) as string;
figmaInsertSVG(content);
};
// Icon Stroke & Size:
let iconStroke = 1.8;
let iconSize = 16;
// Max Categories:
let maxVisibleCategories = 1;
let moreTagsOptions = false;
// Global Styles:
const globalImageStyles = 'mb-4 mt-2 h-10 select-none pointer-events-none';
const btnStyles =
'flex items-center space-x-2 rounded-md p-2 duration-100 hover:bg-neutral-200 dark:hover:bg-neutral-700/40';
</script>
<div
class="group flex flex-col items-center justify-center rounded-md border border-neutral-200 p-4 transition-colors duration-100 hover:bg-neutral-100/80 dark:border-neutral-800 dark:hover:bg-neutral-800/20"
>
<!-- Image -->
{#if wordmarkSvg == true && svgInfo.wordmark !== undefined}
<img
class={cn('hidden dark:block', globalImageStyles)}
src={typeof svgInfo.wordmark !== 'string'
? svgInfo.wordmark?.dark || ''
: svgInfo.wordmark || ''}
alt={svgInfo.title}
title={svgInfo.title}
loading="lazy"
/>
<img
class={cn('block dark:hidden', globalImageStyles)}
src={typeof svgInfo.wordmark !== 'string'
? svgInfo.wordmark?.light || ''
: svgInfo.wordmark || ''}
alt={svgInfo.title}
title={svgInfo.title}
loading="lazy"
/>
{:else}
<img
class={cn('hidden dark:block', globalImageStyles)}
src={typeof svgInfo.route !== 'string' ? svgInfo.route.dark : svgInfo.route}
alt={svgInfo.title}
title={svgInfo.title}
loading="lazy"
/>
<img
class={cn('block dark:hidden', globalImageStyles)}
src={typeof svgInfo.route !== 'string' ? svgInfo.route.light : svgInfo.route}
alt={svgInfo.title}
title={svgInfo.title}
loading="lazy"
/>
{/if}
<!-- Title -->
<div class="mb-3 flex flex-col items-center justify-center space-y-1">
<p class="select-all truncate text-balance text-center text-[15px] font-medium">
{svgInfo.title}
</p>
<div class="flex items-center justify-center space-x-1">
{#if Array.isArray(svgInfo.category)}
{#each svgInfo.category.slice(0, maxVisibleCategories) as c, index}
<a
href={`/directory/${c.toLowerCase()}`}
class={badgeStyles}
title={`This icon is part of the ${svgInfo.category} category`}>{c}</a
>
{/each}
{#if svgInfo.category.length > maxVisibleCategories}
<Popover.Root
open={moreTagsOptions}
onOpenChange={(isOpen) => (moreTagsOptions = isOpen)}
>
<Popover.Trigger class={badgeStyles} title="More Tags">
{#if moreTagsOptions}
<XIcon size={15} strokeWidth={1.5} />
{:else}
<EllipsisIcon size={15} strokeWidth={1.5} />
{/if}
</Popover.Trigger>
<Popover.Content class="flex flex-col space-y-2">
<p class="font-medium">More tags:</p>
{#each svgInfo.category.slice(maxVisibleCategories) as c}
<a
href={`/directory/${c.toLowerCase()}`}
class={cn(buttonStyles, 'w-full rounded-md')}
>
<TagIcon size={15} strokeWidth={1.5} />
<span>{c}</span>
</a>
{/each}
</Popover.Content>
</Popover.Root>
{/if}
{:else}
<a href={`/directory/${svgInfo.category.toLowerCase()}`} class={badgeStyles}>
{svgInfo.category}
</a>
{/if}
</div>
</div>
<!-- Actions -->
<div class="flex items-center space-x-1">
{#if isInFigma}
<button
title="Insert to figma"
on:click={() => {
const svgHasTheme = typeof svgInfo.route !== 'string';
if (!svgHasTheme) {
insertSVG(
typeof svgInfo.route === 'string'
? svgInfo.route
: "Something went wrong. Couldn't copy the SVG."
);
return;
}
const dark = document.documentElement.classList.contains('dark');
insertSVG(
typeof svgInfo.route !== 'string'
? dark
? svgInfo.route.dark
: svgInfo.route.light
: svgInfo.route
);
}}
class={btnStyles}
>
<ChevronsRight size={iconSize} strokeWidth={iconStroke} />
</button>
{/if}
{#if wordmarkSvg && svgInfo.wordmark !== undefined}
<CopySvg {iconSize} {iconStroke} {svgInfo} isInFigma={false} isWordmarkSvg={true} />
{:else}
<CopySvg {iconSize} {iconStroke} {svgInfo} isInFigma={false} isWordmarkSvg={false} />
{/if}
<DownloadSvg
{svgInfo}
isDarkTheme={() => {
const dark = document.documentElement.classList.contains('dark');
return dark;
}}
/>
<a
href={svgInfo.url}
title="Website"
target="_blank"
rel="noopener noreferrer"
class={btnStyles}
>
<LinkIcon size={iconSize} strokeWidth={iconStroke} />
</a>
{#if svgInfo.wordmark !== undefined}
<button
title={wordmarkSvg ? 'Show logo SVG' : 'Show wordmark SVG'}
on:click={() => {
wordmarkSvg = !wordmarkSvg;
}}
class={btnStyles}
>
{#if wordmarkSvg}
<Sparkles size={iconSize} strokeWidth={iconStroke} />
{:else}
<Baseline size={iconSize} strokeWidth={iconStroke} />
{/if}
</button>
{/if}
{#if svgInfo.brandUrl !== undefined}
<a
href={svgInfo.brandUrl}
title="Brand Assets"
target="_blank"
rel="noopener noreferrer"
class={btnStyles}
>
<PaletteIcon size={iconSize} strokeWidth={iconStroke} />
</a>
{/if}
</div>
</div>
-14
View File
@@ -1,14 +0,0 @@
<script lang="ts">
import { toggleMode, mode } from 'mode-watcher';
// Icons:
import { MoonIcon, SunIcon } from 'lucide-svelte';
</script>
<button on:click={toggleMode} aria-label="Toggle dark mode" class="opacity-80 hover:opacity-100">
{#if $mode === 'light'}
<SunIcon size={20} strokeWidth={1.5} />
{:else}
<MoonIcon size={20} strokeWidth={1.5} />
{/if}
</button>
-10
View File
@@ -1,10 +0,0 @@
<script lang="ts">
import { fly } from 'svelte/transition';
export let pathname: string = '';
</script>
{#key pathname}
<div in:fly={{ x: 0, y: 23, duration: 450 }}>
<slot />
</div>
{/key}
-45
View File
@@ -1,45 +0,0 @@
<script lang="ts">
import { AlertTriangleIcon, Check } from 'lucide-svelte';
import { browser } from '$app/environment';
import { buttonStyles } from '@/ui/styles';
import { cn } from '@/utils/cn';
let warning = false;
let warningName = 'svgl_warn_message';
const initialValue = browser ? window.localStorage.getItem(warningName) : true;
</script>
{#if !warning && !initialValue}
<div
class="flex w-full flex-col items-center justify-between space-x-0 space-y-2 border-b border-neutral-200 bg-neutral-100/60 px-3 py-2 text-neutral-700 dark:border-neutral-800 dark:bg-neutral-800/40 dark:text-neutral-300 md:flex-row md:space-x-2 md:space-y-0"
>
<div class="flex items-center space-x-2">
<AlertTriangleIcon
size={18}
strokeWidth={2}
class="mr-1 flex-shrink-0 animate-pulse text-yellow-600 dark:text-yellow-500"
/>
<p>
All SVGs include links to the respective products or companies that own them. <strong
>Please contact the owner directly if you need to use their logo.</strong
>
If you are the owner of an SVG and would like it removed,
<a
target="_blank"
class="underline decoration-neutral-500 decoration-dotted underline-offset-4"
href="https://github.com/pheralb/svgl/issues/new">create an issue</a
> on GitHub.
</p>
</div>
<button
class={cn(buttonStyles, 'h-10 text-sm')}
on:click={() => {
localStorage.setItem(warningName, 'true');
warning = true;
}}
>
<Check size={14} strokeWidth={2} />
<span>Accept</span>
</button>
</div>
{/if}
+62 -58
View File
@@ -1,87 +1,91 @@
import type { Extension } from '@/types/extensions';
import type { Extension } from "@/types/extensions";
export const extensions: Extension[] = [
{
name: 'SVGL for Raycast',
description: 'Search SVG logos via svgl using Raycast.',
url: 'https://www.raycast.com/1weiho/svgl',
image: 'https://github.com/pheralb/svgl/raw/main/static/library/raycast.svg',
name: "SVGL for Raycast",
description: "Search SVG logos via svgl using Raycast.",
url: "https://www.raycast.com/1weiho/svgl",
image:
"https://github.com/pheralb/svgl/raw/main/static/library/raycast.svg",
created_by: {
name: '1weiho',
socialUrl: 'https://x.com/1weiho'
}
name: "1weiho",
socialUrl: "https://x.com/1weiho",
},
},
{
name: 'SVGL for PowerToys',
description: 'Search & copy SVG logos in PowerToys Run.',
url: 'https://svgl.sameerjs.com/',
image: 'https://github.com/pheralb/svgl/raw/main/static/library/powertoys.svg',
name: "SVGL for PowerToys",
description: "Search & copy SVG logos in PowerToys Run.",
url: "https://svgl.sameerjs.com/",
image:
"https://github.com/pheralb/svgl/raw/main/static/library/powertoys.svg",
created_by: {
name: 'SameerJS6',
socialUrl: 'https://svgl.sameerjs.com/'
}
name: "SameerJS6",
socialUrl: "https://svgl.sameerjs.com/",
},
},
{
name: 'SVGL for React',
name: "SVGL for React",
description:
'An open-source NPM package that offers a collection of high-quality SVGL logos for React.',
url: 'https://github.com/ridemountainpig/svgl-react?tab=readme-ov-file',
"An open-source NPM package that offers a collection of high-quality SVGL logos for React.",
url: "https://github.com/ridemountainpig/svgl-react?tab=readme-ov-file",
image:
'https://raw.githubusercontent.com/pheralb/svgl/0d4514c9521688e76c6a1b426f3054a424d96aa5/static/library/react_dark.svg',
"https://raw.githubusercontent.com/pheralb/svgl/0d4514c9521688e76c6a1b426f3054a424d96aa5/static/library/react_dark.svg",
created_by: {
name: 'ridemountainpig',
socialUrl: 'https://twitter.com/ridemountainpig'
}
name: "ridemountainpig",
socialUrl: "https://twitter.com/ridemountainpig",
},
},
{
name: 'SVGL Badges',
description: 'A beautiful badges with svgl SVG logos.',
url: 'https://svgl-badge.vercel.app/',
name: "SVGL Badges",
description: "A beautiful badges with svgl SVG logos.",
url: "https://svgl-badge.vercel.app/",
image:
'https://camo.githubusercontent.com/b516f0f725ad1827dd854f16ec08626569d02ab827cd06b4f42163e519b813c7/68747470733a2f2f7376676c2d62616467652e76657263656c2e6170702f6170692f4c6962726172792f5376676c3f7468656d653d6c69676874',
"https://camo.githubusercontent.com/b516f0f725ad1827dd854f16ec08626569d02ab827cd06b4f42163e519b813c7/68747470733a2f2f7376676c2d62616467652e76657263656c2e6170702f6170692f4c6962726172792f5376676c3f7468656d653d6c69676874",
created_by: {
name: 'ridemountainpig',
socialUrl: 'https://twitter.com/ridemountainpig'
}
name: "ridemountainpig",
socialUrl: "https://twitter.com/ridemountainpig",
},
},
{
name: 'Magic',
description: 'AI extension for Cursor & other IDEs.',
url: 'https://21st.dev/magic',
image: 'https://github.com/serafimcloud/21st/blob/main/apps/web/public/icon.png?raw=true',
name: "Magic",
description: "AI extension for Cursor & other IDEs.",
url: "https://21st.dev/magic",
image:
"https://github.com/serafimcloud/21st/blob/main/apps/web/public/icon.png?raw=true",
created_by: {
name: 'serafim',
socialUrl: 'https://x.com/serafimcloud'
}
name: "serafim",
socialUrl: "https://x.com/serafimcloud",
},
},
{
name: 'svgls',
description: 'A CLI for easily adding SVG icons to your project.',
url: 'https://github.com/sujjeee/svgls',
image: 'https://github.com/pheralb/svgl/raw/main/static/library/svgl.svg',
name: "svgls",
description: "A CLI for easily adding SVG icons to your project.",
url: "https://github.com/sujjeee/svgls",
image: "https://github.com/pheralb/svgl/raw/main/static/library/svgl.svg",
created_by: {
name: 'Sujjeee',
socialUrl: 'https://twitter.com/sujjeeee'
}
name: "Sujjeee",
socialUrl: "https://twitter.com/sujjeeee",
},
},
{
name: 'SVGL for Figma',
description: 'Add svgs from svgl to your Figma project.',
url: 'https://www.figma.com/community/plugin/1320306989350693206/svgl',
image: 'https://github.com/pheralb/svgl/raw/main/static/library/figma.svg',
name: "SVGL for Figma",
description: "Add svgs from svgl to your Figma project.",
url: "https://www.figma.com/community/plugin/1320306989350693206/svgl",
image: "https://github.com/pheralb/svgl/raw/main/static/library/figma.svg",
created_by: {
name: 'Quill',
socialUrl: 'https://x.com/quillzhou'
}
name: "Quill",
socialUrl: "https://x.com/quillzhou",
},
},
{
name: 'SVGL for VSCode',
description: 'SVGL directly in your VSCode.',
url: 'https://marketplace.visualstudio.com/items?itemName=EsteveSegura.svgl',
image: 'https://github.com/pheralb/svgl/blob/main/static/library/vscode.svg',
name: "SVGL for VSCode",
description: "SVGL directly in your VSCode.",
url: "https://marketplace.visualstudio.com/items?itemName=EsteveSegura.svgl",
image:
"https://github.com/pheralb/svgl/blob/main/static/library/vscode.svg",
created_by: {
name: 'GiR',
socialUrl: 'https://x.com/girlazote'
}
}
name: "GiR",
socialUrl: "https://x.com/girlazote",
},
},
];
+9 -5
View File
@@ -1,5 +1,5 @@
import type { iSVG } from '@/types/svg';
import { svgs } from './svgs';
import type { iSVG } from "@/types/svg";
import { svgs } from "./svgs";
export const svgsData = svgs.map((svg: iSVG, index: number) => {
return { id: index, ...svg };
@@ -7,17 +7,21 @@ export const svgsData = svgs.map((svg: iSVG, index: number) => {
export const getCategories = () => {
const categories = svgs
.flatMap((svg) => (Array.isArray(svg.category) ? svg.category : [svg.category]))
.flatMap((svg) =>
Array.isArray(svg.category) ? svg.category : [svg.category],
)
.filter((category, index, array) => array.indexOf(category) === index);
return categories;
};
export const getCategoriesForDirectory = () => {
const categories = svgs
.flatMap((svg) => (Array.isArray(svg.category) ? svg.category : [svg.category]))
.flatMap((svg) =>
Array.isArray(svg.category) ? svg.category : [svg.category],
)
.filter((category, index, array) => array.indexOf(category) === index)
.map((category) => ({
slug: category.toLowerCase()
slug: category.toLowerCase(),
}));
return categories;
};
+2414 -2414
View File
@@ -1,3812 +1,3812 @@
import type { iSVG } from '@/types/svg';
import type { iSVG } from "@/types/svg";
export const svgs: iSVG[] = [
{
title: 'Google Classroom',
category: ['Google', 'Education'],
route: '/library/google-classroom.svg',
url: 'https://edu.google.com/workspace-for-education/products/classroom/',
brandUrl: 'https://developers.google.com/workspace/classroom/brand'
title: "Google Classroom",
category: ["Google", "Education"],
route: "/library/google-classroom.svg",
url: "https://edu.google.com/workspace-for-education/products/classroom/",
brandUrl: "https://developers.google.com/workspace/classroom/brand",
},
{
title: 'Kimi',
category: 'AI',
route: '/library/kimi.svg',
url: 'https://kimi.ai/'
title: "Kimi",
category: "AI",
route: "/library/kimi.svg",
url: "https://kimi.ai/",
},
{
title: 'Perspective',
category: 'Software',
title: "Perspective",
category: "Software",
route: {
light: '/library/perspective-light.svg',
dark: '/library/perspective-dark.svg'
light: "/library/perspective-light.svg",
dark: "/library/perspective-dark.svg",
},
wordmark: {
light: '/library/perspective-wordmark-light.svg',
dark: '/library/perspective-wordmark-dark.svg'
light: "/library/perspective-wordmark-light.svg",
dark: "/library/perspective-wordmark-dark.svg",
},
url: 'https://perspective.co/'
url: "https://perspective.co/",
},
{
title: 'Windsurf',
category: ['Software', 'AI'],
route: '/library/windsurf-logo.svg',
url: 'https://codeium.com/windsurf'
title: "Windsurf",
category: ["Software", "AI"],
route: "/library/windsurf-logo.svg",
url: "https://codeium.com/windsurf",
},
{
title: 'Mattermost',
category: 'Software',
title: "Mattermost",
category: "Software",
route: {
light: '/library/mattermost-light.svg',
dark: '/library/mattermost-dark.svg'
light: "/library/mattermost-light.svg",
dark: "/library/mattermost-dark.svg",
},
url: 'http://mattermost.com/'
url: "http://mattermost.com/",
},
{
title: 'Inngest',
category: 'Software',
title: "Inngest",
category: "Software",
route: {
light: '/library/inngest-light.svg',
dark: '/library/inngest-dark.svg'
light: "/library/inngest-light.svg",
dark: "/library/inngest-dark.svg",
},
url: 'https://inngest.com/'
url: "https://inngest.com/",
},
{
title: 'daisyUI',
category: 'Library',
route: '/library/daisyui.svg',
url: 'https://daisyui.com/'
title: "daisyUI",
category: "Library",
route: "/library/daisyui.svg",
url: "https://daisyui.com/",
},
{
title: 'PayPal',
category: 'Payment',
route: '/library/paypal.svg',
wordmark: '/library/paypal-wordmark.svg',
url: 'https://paypal.com'
title: "PayPal",
category: "Payment",
route: "/library/paypal.svg",
wordmark: "/library/paypal-wordmark.svg",
url: "https://paypal.com",
},
{
title: 'Google Drive',
category: 'Google',
route: '/library/drive.svg',
url: 'https://www.google.com/drive/'
title: "Google Drive",
category: "Google",
route: "/library/drive.svg",
url: "https://www.google.com/drive/",
},
{
title: 'Amazon Q',
category: 'AI',
route: '/library/amazon-q.svg',
url: 'https://aws.amazon.com/q'
title: "Amazon Q",
category: "AI",
route: "/library/amazon-q.svg",
url: "https://aws.amazon.com/q",
},
{
title: 'UV',
category: 'Devtool',
route: '/library/uv.svg',
url: 'https://docs.astral.sh/uv/'
title: "UV",
category: "Devtool",
route: "/library/uv.svg",
url: "https://docs.astral.sh/uv/",
},
{
title: 'Milanote',
category: 'Software',
title: "Milanote",
category: "Software",
route: {
light: '/library/milanote-light.svg',
dark: '/library/milanote-dark.svg'
light: "/library/milanote-light.svg",
dark: "/library/milanote-dark.svg",
},
wordmark: {
light: '/library/milanote-wordmark-light.svg',
dark: '/library/milanote-wordmark-dark.svg'
light: "/library/milanote-wordmark-light.svg",
dark: "/library/milanote-wordmark-dark.svg",
},
url: 'https://milanote.com'
url: "https://milanote.com",
},
{
title: 'Together AI',
category: 'AI',
title: "Together AI",
category: "AI",
route: {
light: '/library/togetherai_light.svg',
dark: '/library/togetherai_dark.svg'
light: "/library/togetherai_light.svg",
dark: "/library/togetherai_dark.svg",
},
url: 'https://www.together.ai/'
url: "https://www.together.ai/",
},
{
title: 'Suno',
category: 'AI',
route: '/library/suno.svg',
title: "Suno",
category: "AI",
route: "/library/suno.svg",
wordmark: {
light: '/library/suno_wordmark_light.svg',
dark: '/library/suno_wordmark_dark.svg'
light: "/library/suno_wordmark_light.svg",
dark: "/library/suno_wordmark_dark.svg",
},
url: 'https://suno.com/'
url: "https://suno.com/",
},
{
title: 'Groq',
category: 'AI',
route: '/library/groq.svg',
title: "Groq",
category: "AI",
route: "/library/groq.svg",
wordmark: {
light: '/library/groq_wordmark_light.svg',
dark: '/library/groq_wordmark_dark.svg'
light: "/library/groq_wordmark_light.svg",
dark: "/library/groq_wordmark_dark.svg",
},
url: 'https://groq.com/'
url: "https://groq.com/",
},
{
title: 'Cohere',
category: 'AI',
route: '/library/cohere.svg',
wordmark: '/library/cohere_wordmark.svg',
url: 'https://cohere.com/'
title: "Cohere",
category: "AI",
route: "/library/cohere.svg",
wordmark: "/library/cohere_wordmark.svg",
url: "https://cohere.com/",
},
{
title: 'Ollama',
category: 'AI',
title: "Ollama",
category: "AI",
route: {
light: '/library/ollama_light.svg',
dark: '/library/ollama_dark.svg'
light: "/library/ollama_light.svg",
dark: "/library/ollama_dark.svg",
},
url: 'https://www.ollama.com/'
url: "https://www.ollama.com/",
},
{
title: 'Cisco',
category: 'Software',
title: "Cisco",
category: "Software",
route: {
light: '/library/cisco_light.svg',
dark: '/library/cisco_dark.svg'
light: "/library/cisco_light.svg",
dark: "/library/cisco_dark.svg",
},
url: 'https://www.cisco.com/'
url: "https://www.cisco.com/",
},
{
title: 'Animate',
category: ['Software', 'Design'],
route: '/library/animate.svg',
url: 'https://www.adobe.com/products/animate'
title: "Animate",
category: ["Software", "Design"],
route: "/library/animate.svg",
url: "https://www.adobe.com/products/animate",
},
{
title: 'Apollo.io',
category: 'Software',
route: '/library/apollo.io.svg',
url: 'https://www.apollo.io/'
title: "Apollo.io",
category: "Software",
route: "/library/apollo.io.svg",
url: "https://www.apollo.io/",
},
{
title: 'Blender',
category: ['Software', 'Design'],
route: '/library/blender.svg',
url: 'https://blender.org/',
brandUrl: 'https://www.blender.org/about/logo/'
title: "Blender",
category: ["Software", "Design"],
route: "/library/blender.svg",
url: "https://blender.org/",
brandUrl: "https://www.blender.org/about/logo/",
},
{
title: 'Lua',
category: 'Language',
route: '/library/lua.svg',
url: 'https://lua.org/'
title: "Lua",
category: "Language",
route: "/library/lua.svg",
url: "https://lua.org/",
},
{
title: 'Mercado Pago',
category: 'Payment',
route: '/library/mercado-pago.svg',
wordmark: '/library/mercado-pago-wordmark.svg',
url: 'https://www.mercadopago.com/developers/'
title: "Mercado Pago",
category: "Payment",
route: "/library/mercado-pago.svg",
wordmark: "/library/mercado-pago-wordmark.svg",
url: "https://www.mercadopago.com/developers/",
},
{
title: 'Basewell',
category: ['AI', 'Software'],
route: '/library/basewell.svg',
url: 'https://www.basewell.com/'
title: "Basewell",
category: ["AI", "Software"],
route: "/library/basewell.svg",
url: "https://www.basewell.com/",
},
{
title: 'ahooks',
category: 'Library',
route: '/library/ahooks.svg',
title: "ahooks",
category: "Library",
route: "/library/ahooks.svg",
wordmark: {
light: '/library/ahooks-wordmark-light.svg',
dark: '/library/ahooks-wordmark-dark.svg'
light: "/library/ahooks-wordmark-light.svg",
dark: "/library/ahooks-wordmark-dark.svg",
},
url: 'https://ahooks.js.org/'
url: "https://ahooks.js.org/",
},
{
title: 'Discord',
category: 'Software',
route: '/library/discord.svg',
url: 'https://discord.com/',
brandUrl: 'https://discord.com/branding'
title: "Discord",
category: "Software",
route: "/library/discord.svg",
url: "https://discord.com/",
brandUrl: "https://discord.com/branding",
},
{
title: 'Aliexpress',
category: 'Software',
route: '/library/aliexpress-icon.svg',
wordmark: '/library/aliexpress-logo.svg',
url: 'https://aliexpress.com/'
title: "Aliexpress",
category: "Software",
route: "/library/aliexpress-icon.svg",
wordmark: "/library/aliexpress-logo.svg",
url: "https://aliexpress.com/",
},
{
title: 'Preact',
category: 'Library',
route: '/library/preact.svg',
url: 'https://preactjs.com/'
title: "Preact",
category: "Library",
route: "/library/preact.svg",
url: "https://preactjs.com/",
},
{
title: 'React',
category: 'Library',
title: "React",
category: "Library",
route: {
light: '/library/react_light.svg',
dark: '/library/react_dark.svg'
light: "/library/react_light.svg",
dark: "/library/react_dark.svg",
},
wordmark: {
light: '/library/react_wordmark_light.svg',
dark: '/library/react_wordmark_dark.svg'
light: "/library/react_wordmark_light.svg",
dark: "/library/react_wordmark_dark.svg",
},
url: 'https://react.dev/'
url: "https://react.dev/",
},
{
title: 'Svelte',
category: 'Library',
route: '/library/svelte.svg',
url: 'https://svelte.dev/'
title: "Svelte",
category: "Library",
route: "/library/svelte.svg",
url: "https://svelte.dev/",
},
{
title: 'Vue',
category: 'Framework',
route: '/library/vue.svg',
url: 'https://vuejs.org/'
title: "Vue",
category: "Framework",
route: "/library/vue.svg",
url: "https://vuejs.org/",
},
{
title: 'Vuetify',
category: 'Library',
route: '/library/vuetify.svg',
url: 'https://vuetifyjs.com/',
brandUrl: 'https://vuetifyjs.com/en/resources/brand-kit/'
title: "Vuetify",
category: "Library",
route: "/library/vuetify.svg",
url: "https://vuetifyjs.com/",
brandUrl: "https://vuetifyjs.com/en/resources/brand-kit/",
},
{
title: 'Nuxt',
category: 'Framework',
route: '/library/nuxt.svg',
url: 'https://nuxtjs.org/',
brandUrl: 'https://nuxt.com/design-kit'
title: "Nuxt",
category: "Framework",
route: "/library/nuxt.svg",
url: "https://nuxtjs.org/",
brandUrl: "https://nuxt.com/design-kit",
},
{
title: 'Visual Studio Code',
category: 'Software',
route: '/library/vscode.svg',
url: 'https://code.visualstudio.com/',
brandUrl: 'https://code.visualstudio.com/brand'
title: "Visual Studio Code",
category: "Software",
route: "/library/vscode.svg",
url: "https://code.visualstudio.com/",
brandUrl: "https://code.visualstudio.com/brand",
},
{
title: 'Ton',
category: 'Crypto',
route: '/library/ton.svg',
url: 'https://ton.org/'
title: "Ton",
category: "Crypto",
route: "/library/ton.svg",
url: "https://ton.org/",
},
{
title: 'Locofy',
category: 'AI',
route: '/library/locofy.svg',
url: 'https://www.locofy.ai/'
title: "Locofy",
category: "AI",
route: "/library/locofy.svg",
url: "https://www.locofy.ai/",
},
{
title: 'Runway',
category: 'AI',
route: '/library/runway.svg',
url: 'https://runwayml.com/'
title: "Runway",
category: "AI",
route: "/library/runway.svg",
url: "https://runwayml.com/",
},
{
title: 'Yarn',
category: 'Software',
route: '/library/yarn.svg',
url: 'https://yarnpkg.com/'
title: "Yarn",
category: "Software",
route: "/library/yarn.svg",
url: "https://yarnpkg.com/",
},
{
title: 'JWT',
category: ['Library', 'Authentication'],
route: '/library/jwt.svg',
url: 'https://jwt.io/'
title: "JWT",
category: ["Library", "Authentication"],
route: "/library/jwt.svg",
url: "https://jwt.io/",
},
{
title: 'Strapi',
category: 'CMS',
route: '/library/strapi.svg',
url: 'https://strapi.io/',
brandUrl: 'https://handbook.strapi.io/strapi-brand-book-2022'
title: "Strapi",
category: "CMS",
route: "/library/strapi.svg",
url: "https://strapi.io/",
brandUrl: "https://handbook.strapi.io/strapi-brand-book-2022",
},
{
title: 'Figma',
category: 'Design',
route: '/library/figma.svg',
url: 'https://www.figma.com/',
brandUrl: 'https://www.figma.com/using-the-figma-brand/'
title: "Figma",
category: "Design",
route: "/library/figma.svg",
url: "https://www.figma.com/",
brandUrl: "https://www.figma.com/using-the-figma-brand/",
},
{
title: 'Spotify',
category: 'Music',
route: '/library/spotify.svg',
wordmark: '/library/spotify_wordmark.svg',
url: 'https://www.spotify.com/'
title: "Spotify",
category: "Music",
route: "/library/spotify.svg",
wordmark: "/library/spotify_wordmark.svg",
url: "https://www.spotify.com/",
},
{
title: 'WorkOS',
category: ['Software', 'Authentication'],
title: "WorkOS",
category: ["Software", "Authentication"],
route: {
light: '/library/workos.svg',
dark: '/library/workos-light.svg'
light: "/library/workos.svg",
dark: "/library/workos-light.svg",
},
url: 'https://workos.com/'
url: "https://workos.com/",
},
{
title: 'Whop',
category: 'Marketplace',
title: "Whop",
category: "Marketplace",
route: {
light: '/library/whop.svg',
dark: '/library/whop-light.svg'
light: "/library/whop.svg",
dark: "/library/whop-light.svg",
},
url: 'https://whop.com/'
url: "https://whop.com/",
},
{
title: 'Postman',
category: 'Software',
route: '/library/postman.svg',
url: 'https://www.getpostman.com/'
title: "Postman",
category: "Software",
route: "/library/postman.svg",
url: "https://www.getpostman.com/",
},
{
title: 'Discord.js',
category: 'Library',
route: '/library/djs.svg',
url: 'https://discord.js.org/'
title: "Discord.js",
category: "Library",
route: "/library/djs.svg",
url: "https://discord.js.org/",
},
{
title: 'OpenSea',
category: 'Crypto',
route: '/library/opensea.svg',
url: 'https://opensea.io/'
title: "OpenSea",
category: "Crypto",
route: "/library/opensea.svg",
url: "https://opensea.io/",
},
{
title: 'Algolia',
category: 'Library',
route: '/library/algolia.svg',
url: 'https://www.algolia.com/'
title: "Algolia",
category: "Library",
route: "/library/algolia.svg",
url: "https://www.algolia.com/",
},
{
title: 'Bootstrap',
category: 'Framework',
route: '/library/bootstrap.svg',
url: 'https://getbootstrap.com/',
brandUrl: 'https://getbootstrap.com/docs/4.0/about/brand/'
title: "Bootstrap",
category: "Framework",
route: "/library/bootstrap.svg",
url: "https://getbootstrap.com/",
brandUrl: "https://getbootstrap.com/docs/4.0/about/brand/",
},
{
title: 'Facebook',
category: 'Social',
route: '/library/facebook.svg',
url: 'https://www.facebook.com/',
brandUrl: 'https://about.meta.com/brand/resources/facebook/logo/'
title: "Facebook",
category: "Social",
route: "/library/facebook.svg",
url: "https://www.facebook.com/",
brandUrl: "https://about.meta.com/brand/resources/facebook/logo/",
},
{
title: 'Twitter',
category: 'Social',
route: '/library/twitter.svg',
url: 'https://twitter.com/'
title: "Twitter",
category: "Social",
route: "/library/twitter.svg",
url: "https://twitter.com/",
},
{
title: 'Esbuild',
category: 'Compiler',
route: '/library/esbuild.svg',
url: 'https://esbuild.github.io/'
title: "Esbuild",
category: "Compiler",
route: "/library/esbuild.svg",
url: "https://esbuild.github.io/",
},
{
title: 'Deno',
category: 'Library',
title: "Deno",
category: "Library",
route: {
light: '/library/deno.svg',
dark: '/library/deno_dark.svg'
light: "/library/deno.svg",
dark: "/library/deno_dark.svg",
},
wordmark: {
light: '/library/deno_wordmark.svg',
dark: '/library/deno_wordmark_dark.svg'
light: "/library/deno_wordmark.svg",
dark: "/library/deno_wordmark_dark.svg",
},
brandUrl: 'https://deno.com/brand',
url: 'https://deno.com/'
brandUrl: "https://deno.com/brand",
url: "https://deno.com/",
},
{
title: 'Gatsby',
category: 'Framework',
route: '/library/gatsby.svg',
url: 'https://www.gatsbyjs.org/'
title: "Gatsby",
category: "Framework",
route: "/library/gatsby.svg",
url: "https://www.gatsbyjs.org/",
},
{
title: 'NPM',
category: 'Software',
route: '/library/npm.svg',
url: 'https://www.npmjs.com/'
title: "NPM",
category: "Software",
route: "/library/npm.svg",
url: "https://www.npmjs.com/",
},
{
title: 'Nuget',
category: 'Software',
route: '/library/nuget.svg',
url: 'https://www.nuget.org/'
title: "Nuget",
category: "Software",
route: "/library/nuget.svg",
url: "https://www.nuget.org/",
},
{
title: 'Homebrew',
category: 'Software',
route: '/library/homebrew.svg',
url: 'https://brew.sh/'
title: "Homebrew",
category: "Software",
route: "/library/homebrew.svg",
url: "https://brew.sh/",
},
{
title: 'Sublime Text',
category: 'Software',
route: '/library/sublimetext.svg',
url: 'https://www.sublimetext.com/'
title: "Sublime Text",
category: "Software",
route: "/library/sublimetext.svg",
url: "https://www.sublimetext.com/",
},
{
title: 'Turborepo',
category: ['Library', 'Vercel', 'Monorepo'],
route: '/library/turborepo.svg',
url: 'https://turborepo.org/'
title: "Turborepo",
category: ["Library", "Vercel", "Monorepo"],
route: "/library/turborepo.svg",
url: "https://turborepo.org/",
},
{
title: 'Tailwind CSS',
category: 'Framework',
route: '/library/tailwindcss.svg',
title: "Tailwind CSS",
category: "Framework",
route: "/library/tailwindcss.svg",
wordmark: {
light: '/library/tailwindcss-wordmark.svg',
dark: '/library/tailwindcss-wordmark-dark.svg'
light: "/library/tailwindcss-wordmark.svg",
dark: "/library/tailwindcss-wordmark-dark.svg",
},
brandUrl: 'https://tailwindcss.com/brand',
url: 'https://tailwindcss.com/'
brandUrl: "https://tailwindcss.com/brand",
url: "https://tailwindcss.com/",
},
{
title: 'Styled Components',
category: 'Library',
route: '/library/styledcomponents.svg',
url: 'https://styled-components.com/'
title: "Styled Components",
category: "Library",
route: "/library/styledcomponents.svg",
url: "https://styled-components.com/",
},
{
title: 'Angular',
category: 'Framework',
route: '/library/angular.svg',
url: 'https://angular.dev/',
brandUrl: 'https://angular.dev/press-kit'
title: "Angular",
category: "Framework",
route: "/library/angular.svg",
url: "https://angular.dev/",
brandUrl: "https://angular.dev/press-kit",
},
{
title: 'Blitz',
category: 'Framework',
route: '/library/blitzjs.svg',
url: 'https://blitzjs.com/'
title: "Blitz",
category: "Framework",
route: "/library/blitzjs.svg",
url: "https://blitzjs.com/",
},
{
title: 'Lit',
category: 'Library',
route: '/library/lit.svg',
url: 'https://lit.dev/'
title: "Lit",
category: "Library",
route: "/library/lit.svg",
url: "https://lit.dev/",
},
{
title: 'Atom',
category: 'Software',
route: '/library/atom.svg',
url: 'https://atom.io/'
title: "Atom",
category: "Software",
route: "/library/atom.svg",
url: "https://atom.io/",
},
{
title: 'YouTube',
category: ['Google', 'Social'],
route: '/library/youtube.svg',
wordmark: '/library/youtube-wordmark.svg',
url: 'https://www.youtube.com/'
title: "YouTube",
category: ["Google", "Social"],
route: "/library/youtube.svg",
wordmark: "/library/youtube-wordmark.svg",
url: "https://www.youtube.com/",
},
{
title: 'Astro',
category: 'Framework',
title: "Astro",
category: "Framework",
route: {
light: '/library/astro.svg',
dark: '/library/astro_dark.svg'
light: "/library/astro.svg",
dark: "/library/astro_dark.svg",
},
url: 'https://astro.build/',
brandUrl: 'https://astro.build/press/'
url: "https://astro.build/",
brandUrl: "https://astro.build/press/",
},
{
title: 'Google',
category: 'Google',
route: '/library/google.svg',
wordmark: '/library/google-wordmark.svg',
url: 'https://www.google.com/'
title: "Google",
category: "Google",
route: "/library/google.svg",
wordmark: "/library/google-wordmark.svg",
url: "https://www.google.com/",
},
{
title: 'Framer',
category: 'Software',
title: "Framer",
category: "Software",
route: {
light: '/library/framer.svg',
dark: '/library/framer_dark.svg'
light: "/library/framer.svg",
dark: "/library/framer_dark.svg",
},
url: 'https://framer.com/'
url: "https://framer.com/",
},
{
title: 'Netflix',
category: 'Entertainment',
route: '/library/netflix.svg',
url: 'https://www.netflix.com/',
brandUrl: 'https://brand.netflix.com/en/assets/logos'
title: "Netflix",
category: "Entertainment",
route: "/library/netflix.svg",
url: "https://www.netflix.com/",
brandUrl: "https://brand.netflix.com/en/assets/logos",
},
{
title: 'Firefox',
category: 'Browser',
route: '/library/firefox.svg',
url: 'https://www.mozilla.org/en-US/firefox/',
brandUrl: 'https://mozilla.design/firefox/'
title: "Firefox",
category: "Browser",
route: "/library/firefox.svg",
url: "https://www.mozilla.org/en-US/firefox/",
brandUrl: "https://mozilla.design/firefox/",
},
{
title: 'LinkedIn',
category: 'Social',
route: '/library/linkedin.svg',
url: 'https://www.linkedin.com/',
brandUrl: 'https://brand.linkedin.com/'
title: "LinkedIn",
category: "Social",
route: "/library/linkedin.svg",
url: "https://www.linkedin.com/",
brandUrl: "https://brand.linkedin.com/",
},
{
title: 'Telegram',
category: 'Social',
route: '/library/telegram.svg',
url: 'https://web.telegram.org/'
title: "Telegram",
category: "Social",
route: "/library/telegram.svg",
url: "https://web.telegram.org/",
},
{
title: 'Matrix',
category: 'Social',
title: "Matrix",
category: "Social",
route: {
light: '/library/matrix-light.svg',
dark: '/library/matrix-dark.svg'
light: "/library/matrix-light.svg",
dark: "/library/matrix-dark.svg",
},
url: 'https://matrix.org/'
url: "https://matrix.org/",
},
{
title: 'WhatsApp',
category: 'Social',
route: '/library/whatsapp.svg',
url: 'https://web.whatsapp.com/'
title: "WhatsApp",
category: "Social",
route: "/library/whatsapp.svg",
url: "https://web.whatsapp.com/",
},
{
title: 'Headless UI',
category: 'Library',
route: '/library/headlessui.svg',
url: 'https://headlessui.dev/'
title: "Headless UI",
category: "Library",
route: "/library/headlessui.svg",
url: "https://headlessui.dev/",
},
{
title: 'Kotlin',
category: 'Language',
route: '/library/kotlin.svg',
url: 'https://kotlinlang.org/'
title: "Kotlin",
category: "Language",
route: "/library/kotlin.svg",
url: "https://kotlinlang.org/",
},
{
title: 'Storybook',
category: 'Software',
route: '/library/storybook.svg',
url: 'https://storybook.js.org/'
title: "Storybook",
category: "Software",
route: "/library/storybook.svg",
url: "https://storybook.js.org/",
},
{
title: 'Netlify',
category: 'Hosting',
route: '/library/netlify.svg',
url: 'https://www.netlify.com/'
title: "Netlify",
category: "Hosting",
route: "/library/netlify.svg",
url: "https://www.netlify.com/",
},
{
title: 'Solidjs',
category: 'Framework',
route: '/library/solidjs.svg',
url: 'https://www.solidjs.com/'
title: "Solidjs",
category: "Framework",
route: "/library/solidjs.svg",
url: "https://www.solidjs.com/",
},
{
title: 'MongoDB',
category: 'Database',
route: '/library/mongodb.svg',
wordmark: '/library/mongodb-wordmark.svg',
url: 'https://www.mongodb.com/',
brandUrl: 'https://www.mongodb.com/company/newsroom/brand-resources'
title: "MongoDB",
category: "Database",
route: "/library/mongodb.svg",
wordmark: "/library/mongodb-wordmark.svg",
url: "https://www.mongodb.com/",
brandUrl: "https://www.mongodb.com/company/newsroom/brand-resources",
},
{
title: 'Moon',
category: 'Framework',
route: '/library/moon.svg',
url: 'https://moonjs.org/'
title: "Moon",
category: "Framework",
route: "/library/moon.svg",
url: "https://moonjs.org/",
},
{
title: 'Payload CMS',
category: 'CMS',
title: "Payload CMS",
category: "CMS",
route: {
light: '/library/payload.svg',
dark: '/library/payload_dark.svg'
light: "/library/payload.svg",
dark: "/library/payload_dark.svg",
},
url: 'https://payloadcms.com'
url: "https://payloadcms.com",
},
{
title: 'Fly',
category: 'Hosting',
route: '/library/fly.svg',
url: 'https://fly.io',
brandUrl: 'https://fly.io/docs/about/brand/'
title: "Fly",
category: "Hosting",
route: "/library/fly.svg",
url: "https://fly.io",
brandUrl: "https://fly.io/docs/about/brand/",
},
{
title: 'LearnThis',
category: 'Education',
route: '/library/learnthis.svg',
url: 'https://learnthisacademy.com'
title: "LearnThis",
category: "Education",
route: "/library/learnthis.svg",
url: "https://learnthisacademy.com",
},
{
title: 'Visual Studio',
category: 'Software',
route: '/library/visual-studio.svg',
url: 'https://visualstudio.microsoft.com'
title: "Visual Studio",
category: "Software",
route: "/library/visual-studio.svg",
url: "https://visualstudio.microsoft.com",
},
{
title: 'Chakra UI',
category: 'Library',
route: '/library/chakra-ui.svg',
url: 'https://chakra-ui.com'
title: "Chakra UI",
category: "Library",
route: "/library/chakra-ui.svg",
url: "https://chakra-ui.com",
},
{
title: 'Express.js',
category: 'Framework',
title: "Express.js",
category: "Framework",
route: {
light: '/library/expressjs.svg',
dark: '/library/expressjs_dark.svg'
light: "/library/expressjs.svg",
dark: "/library/expressjs_dark.svg",
},
url: 'https://expressjs.com'
url: "https://expressjs.com",
},
{
title: 'Fastify',
category: 'Framework',
title: "Fastify",
category: "Framework",
route: {
light: '/library/fastify.svg',
dark: '/library/fastify_dark.svg'
light: "/library/fastify.svg",
dark: "/library/fastify_dark.svg",
},
url: 'https://www.fastify.io'
url: "https://www.fastify.io",
},
{
title: 'JavaScript',
category: 'Language',
route: '/library/javascript.svg',
url: 'https://developer.mozilla.org/docs/Web/JavaScript'
title: "JavaScript",
category: "Language",
route: "/library/javascript.svg",
url: "https://developer.mozilla.org/docs/Web/JavaScript",
},
{
title: 'jQuery',
category: 'Library',
title: "jQuery",
category: "Library",
route: {
light: '/library/jquery.svg',
dark: '/library/jquery_dark.svg'
light: "/library/jquery.svg",
dark: "/library/jquery_dark.svg",
},
url: 'https://jquery.com'
url: "https://jquery.com",
},
{
title: 'Rapid API',
category: 'Software',
route: '/library/rapidapi.svg',
url: 'https://rapidapi.com'
title: "Rapid API",
category: "Software",
route: "/library/rapidapi.svg",
url: "https://rapidapi.com",
},
{
title: 'TypeScript',
category: 'Language',
route: '/library/typescript.svg',
url: 'https://www.typescriptlang.org'
title: "TypeScript",
category: "Language",
route: "/library/typescript.svg",
url: "https://www.typescriptlang.org",
},
{
title: 'Bun',
category: 'Library',
route: '/library/bun.svg',
url: 'https://bun.sh',
brandUrl: 'https://bun.sh/press-kit'
title: "Bun",
category: "Library",
route: "/library/bun.svg",
url: "https://bun.sh",
brandUrl: "https://bun.sh/press-kit",
},
{
title: 'BuildShip',
category: 'AI',
route: '/library/buildship.svg',
url: 'https://buildship.com/'
title: "BuildShip",
category: "AI",
route: "/library/buildship.svg",
url: "https://buildship.com/",
},
{
title: 'Twilio',
category: ['Software', 'Authentication'],
route: '/library/twilio.svg',
url: 'https://twilio.com'
title: "Twilio",
category: ["Software", "Authentication"],
route: "/library/twilio.svg",
url: "https://twilio.com",
},
{
title: 'Arc',
category: 'Social',
title: "Arc",
category: "Social",
route: {
light: '/library/arc.svg',
dark: '/library/arc_dark.svg'
light: "/library/arc.svg",
dark: "/library/arc_dark.svg",
},
url: 'https://arc.dev'
url: "https://arc.dev",
},
{
title: 'Arc',
category: 'Software',
title: "Arc",
category: "Software",
route: {
light: '/library/arc_fintech_light.svg',
dark: '/library/arc_fintech_dark.svg'
light: "/library/arc_fintech_light.svg",
dark: "/library/arc_fintech_dark.svg",
},
url: 'https://arc.tech'
url: "https://arc.tech",
},
{
title: 'Qwik',
category: 'Framework',
route: '/library/qwik.svg',
url: 'https://qwik.builder.io/'
title: "Qwik",
category: "Framework",
route: "/library/qwik.svg",
url: "https://qwik.builder.io/",
},
{
title: 'Coinbase',
category: 'Crypto',
route: '/library/coinbase.svg',
title: "Coinbase",
category: "Crypto",
route: "/library/coinbase.svg",
wordmark: {
light: '/library/coinbase-wordmark-light.svg',
dark: '/library/coinbase-wordmark-dark.svg'
light: "/library/coinbase-wordmark-light.svg",
dark: "/library/coinbase-wordmark-dark.svg",
},
url: 'https://www.coinbase.com/'
url: "https://www.coinbase.com/",
},
{
title: 'Authy',
category: ['Software', 'Authentication'],
route: '/library/authy.svg',
url: 'https://authy.com/'
title: "Authy",
category: ["Software", "Authentication"],
route: "/library/authy.svg",
url: "https://authy.com/",
},
{
title: 'NestJS',
category: 'Framework',
route: '/library/nestjs.svg',
url: 'https://nestjs.com/'
title: "NestJS",
category: "Framework",
route: "/library/nestjs.svg",
url: "https://nestjs.com/",
},
{
title: 'GitHub Copilot',
category: 'Software',
title: "GitHub Copilot",
category: "Software",
route: {
light: '/library/copilot.svg',
dark: '/library/copilot_dark.svg'
light: "/library/copilot.svg",
dark: "/library/copilot_dark.svg",
},
url: 'https://github.com/features/copilot'
url: "https://github.com/features/copilot",
},
{
title: 'Railway',
category: 'Software',
title: "Railway",
category: "Software",
route: {
light: '/library/railway.svg',
dark: '/library/railway_dark.svg'
light: "/library/railway.svg",
dark: "/library/railway_dark.svg",
},
url: 'https://railway.app/'
url: "https://railway.app/",
},
{
title: 'Docusaurus',
category: 'Software',
route: '/library/docusaurus.svg',
url: 'https://docusaurus.io/'
title: "Docusaurus",
category: "Software",
route: "/library/docusaurus.svg",
url: "https://docusaurus.io/",
},
{
title: 'Twitch',
category: 'Entertainment',
route: '/library/twitch.svg',
url: 'https://twitch.tv'
title: "Twitch",
category: "Entertainment",
route: "/library/twitch.svg",
url: "https://twitch.tv",
},
{
title: 'GoDaddy',
category: 'Hosting',
title: "GoDaddy",
category: "Hosting",
route: {
light: '/library/godaddy.svg',
dark: '/library/godaddy_dark.svg'
light: "/library/godaddy.svg",
dark: "/library/godaddy_dark.svg",
},
url: 'https://www.godaddy.com/'
url: "https://www.godaddy.com/",
},
{
title: 'Udemy',
category: 'Education',
title: "Udemy",
category: "Education",
route: {
light: '/library/udemy.svg',
dark: '/library/udemy_dark.svg'
light: "/library/udemy.svg",
dark: "/library/udemy_dark.svg",
},
url: 'https://www.udemy.com/'
url: "https://www.udemy.com/",
},
{
title: 'GraphQL',
category: 'Language',
route: '/library/graphql.svg',
url: 'https://graphql.org/'
title: "GraphQL",
category: "Language",
route: "/library/graphql.svg",
url: "https://graphql.org/",
},
{
title: 'Grok',
category: 'AI',
title: "Grok",
category: "AI",
route: {
light: '/library/grok-light.svg',
dark: '/library/grok-dark.svg'
light: "/library/grok-light.svg",
dark: "/library/grok-dark.svg",
},
wordmark: {
light: '/library/grok-wordmark-light.svg',
dark: '/library/grok-wordmark-dark.svg'
light: "/library/grok-wordmark-light.svg",
dark: "/library/grok-wordmark-dark.svg",
},
url: 'https://grok.com/'
url: "https://grok.com/",
},
{
title: 'GitLab',
category: 'Software',
route: '/library/gitlab.svg',
url: 'https://gitlab.com/'
title: "GitLab",
category: "Software",
route: "/library/gitlab.svg",
url: "https://gitlab.com/",
},
{
title: 'Prisma',
category: 'Software',
title: "Prisma",
category: "Software",
route: {
light: '/library/prisma.svg',
dark: '/library/prisma_dark.svg'
light: "/library/prisma.svg",
dark: "/library/prisma_dark.svg",
},
url: 'https://prisma.io/'
url: "https://prisma.io/",
},
{
title: 'Go',
category: 'Language',
title: "Go",
category: "Language",
route: {
light: '/library/golang.svg',
dark: '/library/golang_dark.svg'
light: "/library/golang.svg",
dark: "/library/golang_dark.svg",
},
url: 'https://go.dev/'
url: "https://go.dev/",
},
{
title: 'Platzi',
category: 'Education',
route: '/library/platzi.svg',
url: 'https://platzi.com/'
title: "Platzi",
category: "Education",
route: "/library/platzi.svg",
url: "https://platzi.com/",
},
{
title: 'Coursera',
category: 'Education',
route: '/library/coursera.svg',
url: 'https://www.coursera.org/'
title: "Coursera",
category: "Education",
route: "/library/coursera.svg",
url: "https://www.coursera.org/",
},
{
title: 'Udacity',
category: 'Education',
route: '/library/udacity.svg',
url: 'https://www.udacity.com/'
title: "Udacity",
category: "Education",
route: "/library/udacity.svg",
url: "https://www.udacity.com/",
},
{
title: 'Kubernetes',
category: 'Software',
route: '/library/kubernetes.svg',
url: 'https://kubernetes.io/'
title: "Kubernetes",
category: "Software",
route: "/library/kubernetes.svg",
url: "https://kubernetes.io/",
},
{
title: 'Docker',
category: 'Software',
route: '/library/docker.svg',
url: 'https://www.docker.com/',
brandUrl: 'https://www.docker.com/company/newsroom/media-resources/'
title: "Docker",
category: "Software",
route: "/library/docker.svg",
url: "https://www.docker.com/",
brandUrl: "https://www.docker.com/company/newsroom/media-resources/",
},
{
title: 'Amazon Web Services',
category: 'Software',
title: "Amazon Web Services",
category: "Software",
route: {
light: '/library/aws_light.svg',
dark: '/library/aws_dark.svg'
light: "/library/aws_light.svg",
dark: "/library/aws_dark.svg",
},
url: 'https://aws.amazon.com/'
url: "https://aws.amazon.com/",
},
{
title: 'Microsoft Azure',
category: 'Software',
route: '/library/azure.svg',
url: 'https://azure.microsoft.com/'
title: "Microsoft Azure",
category: "Software",
route: "/library/azure.svg",
url: "https://azure.microsoft.com/",
},
{
title: 'Heroku',
category: 'Software',
route: '/library/heroku.svg',
url: 'https://www.heroku.com/'
title: "Heroku",
category: "Software",
route: "/library/heroku.svg",
url: "https://www.heroku.com/",
},
{
title: 'JetBrains',
category: 'Software',
route: '/library/jetbrains.svg',
url: 'https://www.jetbrains.com/',
brandUrl: 'https://www.jetbrains.com/company/brand/'
title: "JetBrains",
category: "Software",
route: "/library/jetbrains.svg",
url: "https://www.jetbrains.com/",
brandUrl: "https://www.jetbrains.com/company/brand/",
},
{
title: 'JetBrains Rider',
category: 'Software',
route: '/library/rider.svg',
url: 'https://www.jetbrains.com/rider/'
title: "JetBrains Rider",
category: "Software",
route: "/library/rider.svg",
url: "https://www.jetbrains.com/rider/",
},
{
title: 'PlanetScale',
category: 'Database',
title: "PlanetScale",
category: "Database",
route: {
light: '/library/planetscale.svg',
dark: '/library/planetscale_dark.svg'
light: "/library/planetscale.svg",
dark: "/library/planetscale_dark.svg",
},
url: 'https://planetscale.com/'
url: "https://planetscale.com/",
},
{
title: 'Playwright',
category: 'Framework',
route: '/library/playwright.svg',
url: 'https://playwright.dev/'
title: "Playwright",
category: "Framework",
route: "/library/playwright.svg",
url: "https://playwright.dev/",
},
{
title: 'Atlassian',
category: 'Software',
route: '/library/atlassian.svg',
url: 'https://www.atlassian.com/'
title: "Atlassian",
category: "Software",
route: "/library/atlassian.svg",
url: "https://www.atlassian.com/",
},
{
title: 'Discourse',
category: 'Software',
route: '/library/discourse.svg',
url: 'https://discourse.org/'
title: "Discourse",
category: "Software",
route: "/library/discourse.svg",
url: "https://discourse.org/",
},
{
title: 'Ember',
category: 'Framework',
route: '/library/ember.svg',
url: 'https://emberjs.com/'
title: "Ember",
category: "Framework",
route: "/library/ember.svg",
url: "https://emberjs.com/",
},
{
title: 'Expo',
category: 'Software',
route: '/library/expo.svg',
url: 'https://expo.dev/'
title: "Expo",
category: "Software",
route: "/library/expo.svg",
url: "https://expo.dev/",
},
{
title: 'Flutter',
category: 'Framework',
route: '/library/flutter.svg',
url: 'https://flutter.dev/',
brandUrl: 'https://flutter.dev/brand'
title: "Flutter",
category: "Framework",
route: "/library/flutter.svg",
url: "https://flutter.dev/",
brandUrl: "https://flutter.dev/brand",
},
{
title: 'Auth0',
category: ['Library', 'Authentication'],
route: '/library/auth0.svg',
url: 'https://auth0.com/'
title: "Auth0",
category: ["Library", "Authentication"],
route: "/library/auth0.svg",
url: "https://auth0.com/",
},
{
title: 'Fresh',
category: 'Framework',
route: '/library/fresh.svg',
url: 'https://fresh.deno.dev/'
title: "Fresh",
category: "Framework",
route: "/library/fresh.svg",
url: "https://fresh.deno.dev/",
},
{
title: 'Git',
category: 'Software',
route: '/library/git.svg',
url: 'https://git-scm.com/'
title: "Git",
category: "Software",
route: "/library/git.svg",
url: "https://git-scm.com/",
},
{
title: 'Hostgator',
category: 'Hosting',
route: '/library/hostgator.svg',
url: 'https://www.hostgator.com/'
title: "Hostgator",
category: "Hosting",
route: "/library/hostgator.svg",
url: "https://www.hostgator.com/",
},
{
title: 'IntelliJ IDEA',
category: 'Software',
route: '/library/intellijidea.svg',
url: 'https://www.jetbrains.com/idea/'
title: "IntelliJ IDEA",
category: "Software",
route: "/library/intellijidea.svg",
url: "https://www.jetbrains.com/idea/",
},
{
title: 'Jasmine',
category: 'Framework',
route: '/library/jasmine.svg',
url: 'https://jasmine.github.io/'
title: "Jasmine",
category: "Framework",
route: "/library/jasmine.svg",
url: "https://jasmine.github.io/",
},
{
title: 'Java',
category: 'Language',
route: '/library/java.svg',
url: 'https://www.java.com/'
title: "Java",
category: "Language",
route: "/library/java.svg",
url: "https://www.java.com/",
},
{
title: 'Jest',
category: 'Framework',
route: '/library/jest.svg',
url: 'https://jestjs.io/'
title: "Jest",
category: "Framework",
route: "/library/jest.svg",
url: "https://jestjs.io/",
},
{
title: 'JetBrains',
category: 'Software',
route: '/library/jetbrainsSolid.svg',
url: 'https://www.jetbrains.com/'
title: "JetBrains",
category: "Software",
route: "/library/jetbrainsSolid.svg",
url: "https://www.jetbrains.com/",
},
{
title: 'KrakenJS',
category: 'Framework',
route: '/library/krakenjs.svg',
url: 'https://krakenjs.com/'
title: "KrakenJS",
category: "Framework",
route: "/library/krakenjs.svg",
url: "https://krakenjs.com/",
},
{
title: 'Laravel',
category: 'Framework',
route: '/library/laravel.svg',
url: 'https://laravel.com/'
title: "Laravel",
category: "Framework",
route: "/library/laravel.svg",
url: "https://laravel.com/",
},
{
title: 'MariaDB',
category: 'Database',
route: '/library/mariadb.svg',
url: 'https://mariadb.org/'
title: "MariaDB",
category: "Database",
route: "/library/mariadb.svg",
url: "https://mariadb.org/",
},
{
title: 'Material UI',
category: 'Framework',
route: '/library/materialui.svg',
url: 'https://mui.com/'
title: "Material UI",
category: "Framework",
route: "/library/materialui.svg",
url: "https://mui.com/",
},
{
title: 'MySQL',
category: 'Database',
route: '/library/mysql.svg',
url: 'https://www.mysql.com/'
title: "MySQL",
category: "Database",
route: "/library/mysql.svg",
url: "https://www.mysql.com/",
},
{
title: 'Parcel',
category: 'Compiler',
route: '/library/parcel.svg',
url: 'https://parceljs.org/'
title: "Parcel",
category: "Compiler",
route: "/library/parcel.svg",
url: "https://parceljs.org/",
},
{
title: 'PM2',
category: 'Framework',
route: '/library/pm2.svg',
url: 'https://pm2.io/'
title: "PM2",
category: "Framework",
route: "/library/pm2.svg",
url: "https://pm2.io/",
},
{
title: 'PostgreSQL',
category: 'Database',
route: '/library/postgresql.svg',
url: 'https://www.postgresql.org/'
title: "PostgreSQL",
category: "Database",
route: "/library/postgresql.svg",
url: "https://www.postgresql.org/",
},
{
title: 'React Query',
category: 'Framework',
route: '/library/reactquery.svg',
url: 'https://tanstack.com/query/v4'
title: "React Query",
category: "Framework",
route: "/library/reactquery.svg",
url: "https://tanstack.com/query/v4",
},
{
title: 'Devto',
category: 'Community',
title: "Devto",
category: "Community",
route: {
light: '/library/devto-light.svg',
dark: '/library/devto-dark.svg'
light: "/library/devto-light.svg",
dark: "/library/devto-dark.svg",
},
url: 'https://dev.to/'
url: "https://dev.to/",
},
{
title: 'Redis',
category: 'Database',
route: '/library/redis.svg',
url: 'https://redis.io/'
title: "Redis",
category: "Database",
route: "/library/redis.svg",
url: "https://redis.io/",
},
{
title: 'RedwoodJS',
category: 'Framework',
route: '/library/redwoodjs.svg',
url: 'https://redwoodjs.com/'
title: "RedwoodJS",
category: "Framework",
route: "/library/redwoodjs.svg",
url: "https://redwoodjs.com/",
},
{
title: 'Ruby',
category: 'Language',
route: '/library/ruby.svg',
url: 'https://www.ruby-lang.org/'
title: "Ruby",
category: "Language",
route: "/library/ruby.svg",
url: "https://www.ruby-lang.org/",
},
{
title: 'Scala',
category: 'Language',
route: '/library/scala.svg',
url: 'https://www.scala-lang.org/'
title: "Scala",
category: "Language",
route: "/library/scala.svg",
url: "https://www.scala-lang.org/",
},
{
title: 'Sequelize',
category: 'Framework',
route: '/library/sequelize.svg',
url: 'https://sequelize.org/'
title: "Sequelize",
category: "Framework",
route: "/library/sequelize.svg",
url: "https://sequelize.org/",
},
{
title: 'Spinnaker',
category: 'Software',
route: '/library/spinnaker.svg',
url: 'https://spinnaker.io/'
title: "Spinnaker",
category: "Software",
route: "/library/spinnaker.svg",
url: "https://spinnaker.io/",
},
{
title: 'SQLite',
category: 'Database',
route: '/library/sqlite.svg',
url: 'https://www.sqlite.org/'
title: "SQLite",
category: "Database",
route: "/library/sqlite.svg",
url: "https://www.sqlite.org/",
},
{
title: 'Swagger',
category: 'Software',
route: '/library/swagger.svg',
url: 'https://swagger.io/'
title: "Swagger",
category: "Software",
route: "/library/swagger.svg",
url: "https://swagger.io/",
},
{
title: 'Swift',
category: 'Language',
route: '/library/swift.svg',
url: 'https://swift.org/'
title: "Swift",
category: "Language",
route: "/library/swift.svg",
url: "https://swift.org/",
},
{
title: 'TypeORM',
category: 'Database',
route: '/library/typeorm.svg',
url: 'https://typeorm.io/'
title: "TypeORM",
category: "Database",
route: "/library/typeorm.svg",
url: "https://typeorm.io/",
},
{
title: 'Unity',
category: 'Software',
title: "Unity",
category: "Software",
route: {
light: '/library/unity.svg',
dark: '/library/unity_dark.svg'
light: "/library/unity.svg",
dark: "/library/unity_dark.svg",
},
url: 'https://unity.com/'
url: "https://unity.com/",
},
{
title: 'Vim',
category: 'Software',
route: '/library/vim.svg',
url: 'https://www.vim.org/'
title: "Vim",
category: "Software",
route: "/library/vim.svg",
url: "https://www.vim.org/",
},
{
title: 'Pocketbase',
category: 'Database',
route: '/library/pocket-base.svg',
url: 'https://pocketbase.io/'
title: "Pocketbase",
category: "Database",
route: "/library/pocket-base.svg",
url: "https://pocketbase.io/",
},
{
title: 'OpenBootcamp',
category: 'Education',
route: '/library/openbootcamp.svg',
url: 'https://open-bootcamp.com/'
title: "OpenBootcamp",
category: "Education",
route: "/library/openbootcamp.svg",
url: "https://open-bootcamp.com/",
},
{
title: 'Digital Ocean',
category: 'Software',
route: '/library/digitalocean.svg',
url: 'https://www.digitalocean.com/'
title: "Digital Ocean",
category: "Software",
route: "/library/digitalocean.svg",
url: "https://www.digitalocean.com/",
},
{
title: 'Disney+',
category: 'Entertainment',
route: '/library/disneyplus.svg',
url: 'https://www.disneyplus.com/'
title: "Disney+",
category: "Entertainment",
route: "/library/disneyplus.svg",
url: "https://www.disneyplus.com/",
},
{
title: 'React Router',
category: 'Library',
route: '/library/reactrouter.svg',
url: 'https://reactrouter.com/en/main'
title: "React Router",
category: "Library",
route: "/library/reactrouter.svg",
url: "https://reactrouter.com/en/main",
},
{
title: 'AMP',
category: 'Library',
route: '/library/amp.svg',
url: 'https://amp.dev/'
title: "AMP",
category: "Library",
route: "/library/amp.svg",
url: "https://amp.dev/",
},
{
title: 'Developer Student Club',
category: 'Community',
route: '/library/gdsc.svg',
url: 'https://gdsc.community.dev/'
title: "Developer Student Club",
category: "Community",
route: "/library/gdsc.svg",
url: "https://gdsc.community.dev/",
},
{
title: 'Brave Browser',
category: 'Browser',
route: '/library/brave.svg',
url: 'https://brave.com/',
brandUrl: 'https://brave.com/brave-branding-assets/'
title: "Brave Browser",
category: "Browser",
route: "/library/brave.svg",
url: "https://brave.com/",
brandUrl: "https://brave.com/brave-branding-assets/",
},
{
title: 'Eclipse IDE',
category: 'Software',
route: '/library/eclipse.svg',
url: 'https://www.eclipse.org/'
title: "Eclipse IDE",
category: "Software",
route: "/library/eclipse.svg",
url: "https://www.eclipse.org/",
},
{
title: 'Three.js',
category: 'Library',
title: "Three.js",
category: "Library",
route: {
light: '/library/threejs-light.svg',
dark: '/library/threejs-dark.svg'
light: "/library/threejs-light.svg",
dark: "/library/threejs-dark.svg",
},
url: 'https://threejs.org/'
url: "https://threejs.org/",
},
{
title: 'HTML5',
category: 'Language',
route: '/library/html5.svg',
url: 'https://es.wikipedia.org/wiki/HTML5'
title: "HTML5",
category: "Language",
route: "/library/html5.svg",
url: "https://es.wikipedia.org/wiki/HTML5",
},
{
title: 'CSS (New)',
category: 'Language',
route: '/library/css.svg',
url: 'https://es.wikipedia.org/wiki/CSS'
title: "CSS (New)",
category: "Language",
route: "/library/css.svg",
url: "https://es.wikipedia.org/wiki/CSS",
},
{
title: 'CSS',
category: 'Language',
route: '/library/css_old.svg',
url: 'https://es.wikipedia.org/wiki/CSS'
title: "CSS",
category: "Language",
route: "/library/css_old.svg",
url: "https://es.wikipedia.org/wiki/CSS",
},
{
title: 'midudev',
category: 'Community',
route: '/library/midudev.svg',
url: 'https://midu.dev'
title: "midudev",
category: "Community",
route: "/library/midudev.svg",
url: "https://midu.dev",
},
{
title: 'Apple',
category: 'Software',
title: "Apple",
category: "Software",
route: {
light: '/library/apple.svg',
dark: '/library/apple_dark.svg'
light: "/library/apple.svg",
dark: "/library/apple_dark.svg",
},
url: 'https://www.apple.com'
url: "https://www.apple.com",
},
{
title: 'Windows',
category: 'Software',
route: '/library/windows.svg',
url: 'https://www.microsoft.com/windows'
title: "Windows",
category: "Software",
route: "/library/windows.svg",
url: "https://www.microsoft.com/windows",
},
{
title: 'Python',
category: 'Language',
route: '/library/python.svg',
url: 'https://www.python.org/'
title: "Python",
category: "Language",
route: "/library/python.svg",
url: "https://www.python.org/",
},
{
title: 'Solidity',
category: 'Language',
route: '/library/solidity.svg',
url: 'https://soliditylang.org/'
title: "Solidity",
category: "Language",
route: "/library/solidity.svg",
url: "https://soliditylang.org/",
},
{
title: 'Turbopack',
category: 'Software',
route: '/library/turbopack.svg',
url: 'https://turbo.build/'
title: "Turbopack",
category: "Software",
route: "/library/turbopack.svg",
url: "https://turbo.build/",
},
{
title: 'Builder',
category: 'CMS',
route: '/library/builder.svg',
url: 'https://builder.io/'
title: "Builder",
category: "CMS",
route: "/library/builder.svg",
url: "https://builder.io/",
},
{
title: 'Babel',
category: 'Compiler',
route: '/library/babel.svg',
url: 'https://babeljs.io/'
title: "Babel",
category: "Compiler",
route: "/library/babel.svg",
url: "https://babeljs.io/",
},
{
title: 'Surrealdb',
category: 'Database',
route: '/library/surrealdb.svg',
url: 'https://surrealdb.com/'
title: "Surrealdb",
category: "Database",
route: "/library/surrealdb.svg",
url: "https://surrealdb.com/",
},
{
title: 'Jetbrains Space',
category: 'Software',
route: '/library/jetbrains-space.svg',
url: 'https://www.jetbrains.com/space/'
title: "Jetbrains Space",
category: "Software",
route: "/library/jetbrains-space.svg",
url: "https://www.jetbrains.com/space/",
},
{
title: 'Stimulus',
category: 'Framework',
route: '/library/stimulus.svg',
url: 'https://stimulus.hotwired.dev/'
title: "Stimulus",
category: "Framework",
route: "/library/stimulus.svg",
url: "https://stimulus.hotwired.dev/",
},
{
title: 'WindiCSS',
category: 'Framework',
route: '/library/windicss.svg',
url: 'https://windicss.org/'
title: "WindiCSS",
category: "Framework",
route: "/library/windicss.svg",
url: "https://windicss.org/",
},
{
title: 'Mastodon',
category: 'Social',
route: '/library/mastodon.svg',
url: 'https://joinmastodon.org/'
title: "Mastodon",
category: "Social",
route: "/library/mastodon.svg",
url: "https://joinmastodon.org/",
},
{
title: 'Upstash',
category: 'Database',
route: '/library/upstash.svg',
url: 'https://upstash.com/',
brandUrl: 'https://upstash.com/brand'
title: "Upstash",
category: "Database",
route: "/library/upstash.svg",
url: "https://upstash.com/",
brandUrl: "https://upstash.com/brand",
},
{
title: 'Storyblok',
category: 'CMS',
route: '/library/storyblok.svg',
url: 'https://www.storyblok.com/'
title: "Storyblok",
category: "CMS",
route: "/library/storyblok.svg",
url: "https://www.storyblok.com/",
},
{
title: 'Cloudflare Workers',
category: 'Software',
route: '/library/cloudflare-workers.svg',
url: 'https://workers.cloudflare.com/'
title: "Cloudflare Workers",
category: "Software",
route: "/library/cloudflare-workers.svg",
url: "https://workers.cloudflare.com/",
},
{
title: 'Cloudflare',
category: 'Software',
route: '/library/cloudflare.svg',
url: 'https://www.cloudflare.com/'
title: "Cloudflare",
category: "Software",
route: "/library/cloudflare.svg",
url: "https://www.cloudflare.com/",
},
{
title: 'Bing',
category: 'Browser',
route: '/library/bing.svg',
url: 'https://www.bing.com/'
title: "Bing",
category: "Browser",
route: "/library/bing.svg",
url: "https://www.bing.com/",
},
{
title: 'Cloudinary',
category: 'Software',
route: '/library/cloudinary.svg',
url: 'https://cloudinary.com/'
title: "Cloudinary",
category: "Software",
route: "/library/cloudinary.svg",
url: "https://cloudinary.com/",
},
{
title: 'Dart',
category: 'Language',
route: '/library/dart.svg',
url: 'https://dart.dev/'
title: "Dart",
category: "Language",
route: "/library/dart.svg",
url: "https://dart.dev/",
},
{
title: 'hCaptcha',
category: 'Software',
route: '/library/hcaptcha.svg',
url: 'https://www.hcaptcha.com/'
title: "hCaptcha",
category: "Software",
route: "/library/hcaptcha.svg",
url: "https://www.hcaptcha.com/",
},
{
title: 'Appwrite',
category: 'Software',
route: '/library/appwrite.svg',
url: 'https://appwrite.io/'
title: "Appwrite",
category: "Software",
route: "/library/appwrite.svg",
url: "https://appwrite.io/",
},
{
title: 'Loom',
category: 'Software',
route: '/library/loom.svg',
url: 'https://www.loom.com/'
title: "Loom",
category: "Software",
route: "/library/loom.svg",
url: "https://www.loom.com/",
},
{
title: 'Hulu',
category: 'Entertainment',
title: "Hulu",
category: "Entertainment",
route: {
light: '/library/hulu.svg',
dark: '/library/hulu-dark.svg'
light: "/library/hulu.svg",
dark: "/library/hulu-dark.svg",
},
url: 'https://www.hulu.com/'
url: "https://www.hulu.com/",
},
{
title: 'Stackblitz',
category: 'Software',
route: '/library/stackblitz.svg',
url: 'https://stackblitz.com/'
title: "Stackblitz",
category: "Software",
route: "/library/stackblitz.svg",
url: "https://stackblitz.com/",
},
{
title: 'Binance',
category: 'Crypto',
route: '/library/binance.svg',
url: 'https://binance.com/'
title: "Binance",
category: "Crypto",
route: "/library/binance.svg",
url: "https://binance.com/",
},
{
title: 'Messenger',
category: 'Social',
route: '/library/messenger.svg',
url: 'https://www.messenger.com/'
title: "Messenger",
category: "Social",
route: "/library/messenger.svg",
url: "https://www.messenger.com/",
},
{
title: 'NHost',
category: 'Hosting',
route: '/library/nhost.svg',
url: 'https://nhost.io/'
title: "NHost",
category: "Hosting",
route: "/library/nhost.svg",
url: "https://nhost.io/",
},
{
title: 'Medusa',
category: 'Software',
route: '/library/medusa.svg',
url: 'https://medusajs.com/'
title: "Medusa",
category: "Software",
route: "/library/medusa.svg",
url: "https://medusajs.com/",
},
{
title: 'WordPress',
category: ['Software', 'CMS'],
route: '/library/wordpress.svg',
url: 'https://wordpress.org/',
brandUrl: 'https://wordpress.org/about/logos/'
title: "WordPress",
category: ["Software", "CMS"],
route: "/library/wordpress.svg",
url: "https://wordpress.org/",
brandUrl: "https://wordpress.org/about/logos/",
},
{
title: 'Microsoft',
category: 'Software',
route: '/library/microsoft.svg',
url: 'https://www.microsoft.com/'
title: "Microsoft",
category: "Software",
route: "/library/microsoft.svg",
url: "https://www.microsoft.com/",
},
{
title: 'Elementor',
category: 'Software',
route: '/library/elementor.svg',
url: 'https://elementor.com/'
title: "Elementor",
category: "Software",
route: "/library/elementor.svg",
url: "https://elementor.com/",
},
{
title: 'Kick',
category: 'Entertainment',
title: "Kick",
category: "Entertainment",
route: {
light: '/library/kick-light.svg',
dark: '/library/kick-dark.svg'
light: "/library/kick-light.svg",
dark: "/library/kick-dark.svg",
},
url: 'https://kick.com/'
url: "https://kick.com/",
},
{
title: 'Prime video',
category: 'Entertainment',
route: '/library/prime-video.svg',
url: 'https://primevideo.com/'
title: "Prime video",
category: "Entertainment",
route: "/library/prime-video.svg",
url: "https://primevideo.com/",
},
{
title: 'Chrome',
category: 'Browser',
route: '/library/chrome.svg',
url: 'https://chrome.com/'
title: "Chrome",
category: "Browser",
route: "/library/chrome.svg",
url: "https://chrome.com/",
},
{
title: 'RxJS',
category: 'Library',
route: '/library/rxjs.svg',
url: 'https://rxjs.dev/'
title: "RxJS",
category: "Library",
route: "/library/rxjs.svg",
url: "https://rxjs.dev/",
},
{
title: 'Electron',
category: 'Library',
route: '/library/electron.svg',
url: 'https://www.electronjs.org'
title: "Electron",
category: "Library",
route: "/library/electron.svg",
url: "https://www.electronjs.org",
},
{
title: 'Redux',
category: 'Library',
route: '/library/redux.svg',
url: 'https://redux.js.org/'
title: "Redux",
category: "Library",
route: "/library/redux.svg",
url: "https://redux.js.org/",
},
{
title: 'Trust Wallet',
category: 'Crypto',
route: '/library/trust.svg',
url: 'https://trustwallet.com/'
title: "Trust Wallet",
category: "Crypto",
route: "/library/trust.svg",
url: "https://trustwallet.com/",
},
{
title: 'Php',
category: 'Language',
title: "Php",
category: "Language",
route: {
light: '/library/php.svg',
dark: '/library/php_dark.svg'
light: "/library/php.svg",
dark: "/library/php_dark.svg",
},
url: 'https://www.php.net/'
url: "https://www.php.net/",
},
{
title: 'Hugo',
category: 'Framework',
route: '/library/hugo.svg',
url: 'https://gohugo.io/'
title: "Hugo",
category: "Framework",
route: "/library/hugo.svg",
url: "https://gohugo.io/",
},
{
title: 'Sass',
category: 'Language',
route: '/library/sass.svg',
url: 'https://sass-lang.com/'
title: "Sass",
category: "Language",
route: "/library/sass.svg",
url: "https://sass-lang.com/",
},
{
title: 'Arc',
category: 'Browser',
route: '/library/arc_browser.svg',
url: 'https://arc.net/'
title: "Arc",
category: "Browser",
route: "/library/arc_browser.svg",
url: "https://arc.net/",
},
{
title: 'Pinia',
category: 'Library',
route: '/library/pinia.svg',
url: 'https://pinia.vuejs.org/'
title: "Pinia",
category: "Library",
route: "/library/pinia.svg",
url: "https://pinia.vuejs.org/",
},
{
title: 'Neon',
category: 'Database',
route: '/library/neon.svg',
url: 'https://neon.tech/'
title: "Neon",
category: "Database",
route: "/library/neon.svg",
url: "https://neon.tech/",
},
{
title: 'Infojobs',
category: 'Social',
route: '/library/infojobs-logo.svg',
url: 'https://www.infojobs.net/'
title: "Infojobs",
category: "Social",
route: "/library/infojobs-logo.svg",
url: "https://www.infojobs.net/",
},
{
title: 'Linear',
category: 'Software',
route: '/library/linear.svg',
url: 'https://linear.app/'
title: "Linear",
category: "Software",
route: "/library/linear.svg",
url: "https://linear.app/",
},
{
title: 'Tor',
category: 'Browser',
route: '/library/tor.svg',
url: 'https://www.torproject.org/'
title: "Tor",
category: "Browser",
route: "/library/tor.svg",
url: "https://www.torproject.org/",
},
{
title: 'Codesandbox',
category: 'Software',
route: '/library/codesandbox-square.svg',
url: 'https://codesandbox.io/'
title: "Codesandbox",
category: "Software",
route: "/library/codesandbox-square.svg",
url: "https://codesandbox.io/",
},
{
title: 'Skype',
category: 'Social',
route: '/library/skype.svg',
url: 'https://www.skype.com/'
title: "Skype",
category: "Social",
route: "/library/skype.svg",
url: "https://www.skype.com/",
},
{
title: 'Tauri',
category: 'Library',
route: '/library/tauri.svg',
url: 'https://tauri.app/'
title: "Tauri",
category: "Library",
route: "/library/tauri.svg",
url: "https://tauri.app/",
},
{
title: 'WebKit',
category: 'Software',
route: '/library/webkit.svg',
url: 'https://webkit.org/'
title: "WebKit",
category: "Software",
route: "/library/webkit.svg",
url: "https://webkit.org/",
},
{
title: 'DuckDuckGo',
category: ['Software', 'Browser'],
route: '/library/duckduckgo.svg',
wordmark: '/library/duckduckgo-wordmark.svg',
url: 'https://duckduckgo.com/'
title: "DuckDuckGo",
category: ["Software", "Browser"],
route: "/library/duckduckgo.svg",
wordmark: "/library/duckduckgo-wordmark.svg",
url: "https://duckduckgo.com/",
},
{
title: 'Obsidian',
category: 'Software',
route: '/library/obsidian.svg',
url: 'https://obsidian.md/',
brandUrl: 'https://obsidian.md/brand'
title: "Obsidian",
category: "Software",
route: "/library/obsidian.svg",
url: "https://obsidian.md/",
brandUrl: "https://obsidian.md/brand",
},
{
title: 'Zod',
category: 'Library',
route: '/library/zod.svg',
url: 'https://zod.dev/'
title: "Zod",
category: "Library",
route: "/library/zod.svg",
url: "https://zod.dev/",
},
{
title: 'Valibot',
category: 'Library',
route: '/library/valibot.svg',
title: "Valibot",
category: "Library",
route: "/library/valibot.svg",
wordmark: {
light: '/library/valibot-wordmark-light.svg',
dark: '/library/valibot-wordmark-dark.svg'
light: "/library/valibot-wordmark-light.svg",
dark: "/library/valibot-wordmark-dark.svg",
},
url: 'https://valibot.dev'
url: "https://valibot.dev",
},
{
title: 'Dreamweaver',
category: 'Software',
route: '/library/dw.svg',
url: 'https://www.adobe.com/products/dreamweaver.html'
title: "Dreamweaver",
category: "Software",
route: "/library/dw.svg",
url: "https://www.adobe.com/products/dreamweaver.html",
},
{
title: 'OpenAI',
category: 'AI',
title: "OpenAI",
category: "AI",
route: {
light: '/library/openai.svg',
dark: '/library/openai_dark.svg'
light: "/library/openai.svg",
dark: "/library/openai_dark.svg",
},
wordmark: {
light: '/library/openai_wordmark_light.svg',
dark: '/library/openai_wordmark_dark.svg'
light: "/library/openai_wordmark_light.svg",
dark: "/library/openai_wordmark_dark.svg",
},
url: 'https://openai.com/',
brandUrl: 'https://openai.com/brand/'
url: "https://openai.com/",
brandUrl: "https://openai.com/brand/",
},
{
title: 'Threads',
category: 'Social',
title: "Threads",
category: "Social",
route: {
light: '/library/threads.svg',
dark: '/library/threads_dark.svg'
light: "/library/threads.svg",
dark: "/library/threads_dark.svg",
},
url: 'https://threads.net/'
url: "https://threads.net/",
},
{
title: 'Instagram',
category: 'Social',
title: "Instagram",
category: "Social",
route: {
light: '/library/instagram.svg',
dark: '/library/instagram_dark.svg'
light: "/library/instagram.svg",
dark: "/library/instagram_dark.svg",
},
url: 'https://www.instagram.com/',
brandUrl: 'https://about.instagram.com/brand'
url: "https://www.instagram.com/",
brandUrl: "https://about.instagram.com/brand",
},
{
title: 'VueUse',
category: 'Library',
route: '/library/vueuse.svg',
url: 'https://vueuse.org/'
title: "VueUse",
category: "Library",
route: "/library/vueuse.svg",
url: "https://vueuse.org/",
},
{
title: 'Microsoft SQL Server ',
category: 'Database',
route: '/library/sql-server.svg',
url: 'https://www.microsoft.com/en-us/sql-server/'
title: "Microsoft SQL Server ",
category: "Database",
route: "/library/sql-server.svg",
url: "https://www.microsoft.com/en-us/sql-server/",
},
{
title: 'Hono',
category: 'Framework',
route: '/library/hono.svg',
url: 'https://hono.dev/'
title: "Hono",
category: "Framework",
route: "/library/hono.svg",
url: "https://hono.dev/",
},
{
title: 'Million',
category: 'Library',
route: '/library/million.svg',
url: 'https://million.dev/'
title: "Million",
category: "Library",
route: "/library/million.svg",
url: "https://million.dev/",
},
{
title: 'PandaCSS',
category: 'Library',
route: '/library/pandacss.svg',
url: 'https://panda-css.com/'
title: "PandaCSS",
category: "Library",
route: "/library/pandacss.svg",
url: "https://panda-css.com/",
},
{
title: 'Pulumi',
category: 'Software',
route: '/library/pulumi.svg',
url: 'https://www.pulumi.com/'
title: "Pulumi",
category: "Software",
route: "/library/pulumi.svg",
url: "https://www.pulumi.com/",
},
{
title: 'FastAPI',
category: 'Framework',
route: '/library/fastapi.svg',
url: 'https://fastapi.tiangolo.com/'
title: "FastAPI",
category: "Framework",
route: "/library/fastapi.svg",
url: "https://fastapi.tiangolo.com/",
},
{
title: 'Codium',
category: 'AI',
route: '/library/codium.svg',
url: 'https://www.codium.ai/'
title: "Codium",
category: "AI",
route: "/library/codium.svg",
url: "https://www.codium.ai/",
},
{
title: 'Crossplane',
category: 'Framework',
route: '/library/crossplane.svg',
url: 'https://crossplane.io/'
title: "Crossplane",
category: "Framework",
route: "/library/crossplane.svg",
url: "https://crossplane.io/",
},
{
title: 'Volta',
category: 'Software',
title: "Volta",
category: "Software",
route: {
light: '/library/volta-dark.svg',
dark: '/library/volta-light.svg'
light: "/library/volta-dark.svg",
dark: "/library/volta-light.svg",
},
url: 'https://volta.net/'
url: "https://volta.net/",
},
{
title: 'Typesense',
category: 'Software',
route: '/library/typesense.svg',
url: 'https://typesense.org/'
title: "Typesense",
category: "Software",
route: "/library/typesense.svg",
url: "https://typesense.org/",
},
{
title: 'Bitcoin',
category: 'Crypto',
route: '/library/btc.svg',
url: 'https://bitcoin.org/'
title: "Bitcoin",
category: "Crypto",
route: "/library/btc.svg",
url: "https://bitcoin.org/",
},
{
title: 'Ethereum',
category: 'Crypto',
route: '/library/eth.svg',
url: 'https://ethereum.org/'
title: "Ethereum",
category: "Crypto",
route: "/library/eth.svg",
url: "https://ethereum.org/",
},
{
title: 'Solana',
category: 'Crypto',
route: '/library/sol.svg',
url: 'https://solana.com/'
title: "Solana",
category: "Crypto",
route: "/library/sol.svg",
url: "https://solana.com/",
},
{
title: 'Dogecoin',
category: 'Crypto',
route: '/library/doge.svg',
url: 'https://dogecoin.com/'
title: "Dogecoin",
category: "Crypto",
route: "/library/doge.svg",
url: "https://dogecoin.com/",
},
{
title: 'XRP',
category: 'Crypto',
route: '/library/xrp.svg',
url: 'https://xrpl.org/'
title: "XRP",
category: "Crypto",
route: "/library/xrp.svg",
url: "https://xrpl.org/",
},
{
title: 'BNB',
category: 'Crypto',
route: '/library/bnb.svg',
url: 'https://www.bnbchain.org/'
title: "BNB",
category: "Crypto",
route: "/library/bnb.svg",
url: "https://www.bnbchain.org/",
},
{
title: 'Link',
category: 'Crypto',
route: '/library/link.svg',
title: "Link",
category: "Crypto",
route: "/library/link.svg",
wordmark: {
light: '/library/link-wordmark-light.svg',
dark: '/library/link-wordmark-dark.svg'
light: "/library/link-wordmark-light.svg",
dark: "/library/link-wordmark-dark.svg",
},
url: 'https://chain.link/'
url: "https://chain.link/",
},
{
title: 'Polygon',
category: 'Crypto',
route: '/library/matic.svg',
url: 'https://polygon.technology/'
title: "Polygon",
category: "Crypto",
route: "/library/matic.svg",
url: "https://polygon.technology/",
},
{
title: 'Algorand',
category: 'Crypto',
route: '/library/algorand.svg',
url: 'https://algorand.org/'
title: "Algorand",
category: "Crypto",
route: "/library/algorand.svg",
url: "https://algorand.org/",
},
{
title: 'Tether',
category: 'Crypto',
route: '/library/tether.svg',
url: 'https://tether.to/'
title: "Tether",
category: "Crypto",
route: "/library/tether.svg",
url: "https://tether.to/",
},
{
title: 'X (formerly Twitter)',
category: 'Social',
title: "X (formerly Twitter)",
category: "Social",
route: {
light: '/library/x.svg',
dark: '/library/x_dark.svg'
light: "/library/x.svg",
dark: "/library/x_dark.svg",
},
url: 'https://x.com',
brandUrl: 'https://about.x.com/en/who-we-are/brand-toolkit'
url: "https://x.com",
brandUrl: "https://about.x.com/en/who-we-are/brand-toolkit",
},
{
title: 'Adobe',
category: 'Design',
route: '/library/adobe.svg',
url: 'https://www.adobe.com/'
title: "Adobe",
category: "Design",
route: "/library/adobe.svg",
url: "https://www.adobe.com/",
},
{
title: 'After Effects',
category: 'Design',
route: '/library/after-effects.svg',
url: 'https://www.adobe.com/products/aftereffects'
title: "After Effects",
category: "Design",
route: "/library/after-effects.svg",
url: "https://www.adobe.com/products/aftereffects",
},
{
title: 'Canva',
category: 'Design',
route: '/library/canva.svg',
url: 'https://www.canva.com/'
title: "Canva",
category: "Design",
route: "/library/canva.svg",
url: "https://www.canva.com/",
},
{
title: 'Illustrator',
category: 'Design',
route: '/library/illustrator.svg',
url: 'https://www.adobe.com/products/illustrator'
title: "Illustrator",
category: "Design",
route: "/library/illustrator.svg",
url: "https://www.adobe.com/products/illustrator",
},
{
title: 'InDesign',
category: 'Design',
route: '/library/indesign.svg',
url: 'https://www.adobe.com/products/indesign'
title: "InDesign",
category: "Design",
route: "/library/indesign.svg",
url: "https://www.adobe.com/products/indesign",
},
{
title: 'Lightroom',
category: 'Design',
route: '/library/lightroom.svg',
url: 'https://www.adobe.com/products/photoshop-lightroom'
title: "Lightroom",
category: "Design",
route: "/library/lightroom.svg",
url: "https://www.adobe.com/products/photoshop-lightroom",
},
{
title: 'Photoshop',
category: 'Design',
route: '/library/photoshop.svg',
url: 'https://www.adobe.com/products/photoshop'
title: "Photoshop",
category: "Design",
route: "/library/photoshop.svg",
url: "https://www.adobe.com/products/photoshop",
},
{
title: 'Premiere',
category: 'Design',
route: '/library/premiere.svg',
url: 'https://www.adobe.com/products/premiere'
title: "Premiere",
category: "Design",
route: "/library/premiere.svg",
url: "https://www.adobe.com/products/premiere",
},
{
title: 'VK',
category: 'Social',
route: '/library/vk.svg',
url: 'https://vk.com'
title: "VK",
category: "Social",
route: "/library/vk.svg",
url: "https://vk.com",
},
{
title: 'Hoppscotch',
category: 'Software',
route: '/library/hoppscotch.svg',
url: 'https://hoppscotch.com',
brandUrl: 'https://hoppscotch.com/brand'
title: "Hoppscotch",
category: "Software",
route: "/library/hoppscotch.svg",
url: "https://hoppscotch.com",
brandUrl: "https://hoppscotch.com/brand",
},
{
title: 'Opera',
category: 'Browser',
route: '/library/opera.svg',
url: 'https://www.opera.com',
brandUrl: 'https://brand.opera.com/'
title: "Opera",
category: "Browser",
route: "/library/opera.svg",
url: "https://www.opera.com",
brandUrl: "https://brand.opera.com/",
},
{
title: 'Salesforce',
category: 'Software',
route: '/library/salesforce.svg',
url: 'https://www.salesforce.com',
brandUrl: 'https://brand.salesforce.com/'
title: "Salesforce",
category: "Software",
route: "/library/salesforce.svg",
url: "https://www.salesforce.com",
brandUrl: "https://brand.salesforce.com/",
},
{
title: 'Unreal Engine',
category: 'Software',
title: "Unreal Engine",
category: "Software",
route: {
light: '/library/unreal_engine.svg',
dark: '/library/unreal_engine_dark.svg'
light: "/library/unreal_engine.svg",
dark: "/library/unreal_engine_dark.svg",
},
url: 'https://www.unrealengine.com/'
url: "https://www.unrealengine.com/",
},
{
title: 'Godot Engine',
category: 'Software',
route: '/library/godot_engine.svg',
url: 'https://godotengine.org/'
title: "Godot Engine",
category: "Software",
route: "/library/godot_engine.svg",
url: "https://godotengine.org/",
},
{
title: 'Datadog',
category: 'Software',
route: '/library/datadog.svg',
url: 'https://www.datadoghq.com/'
title: "Datadog",
category: "Software",
route: "/library/datadog.svg",
url: "https://www.datadoghq.com/",
},
{
title: 'Tron',
category: 'Crypto',
route: '/library/tron.svg',
url: 'https://tron.network/'
title: "Tron",
category: "Crypto",
route: "/library/tron.svg",
url: "https://tron.network/",
},
{
title: 'Randevum',
category: 'Software',
route: '/library/randevum.svg',
url: 'https://www.randevum.co'
title: "Randevum",
category: "Software",
route: "/library/randevum.svg",
url: "https://www.randevum.co",
},
{
title: 'Chromium',
category: 'Browser',
route: '/library/chromium.svg',
url: 'https://www.chromium.org'
title: "Chromium",
category: "Browser",
route: "/library/chromium.svg",
url: "https://www.chromium.org",
},
{
title: 'Edge',
category: 'Browser',
route: '/library/edge.svg',
url: 'https://www.microsoft.com/en-us/edge'
title: "Edge",
category: "Browser",
route: "/library/edge.svg",
url: "https://www.microsoft.com/en-us/edge",
},
{
title: 'Safari',
category: 'Browser',
route: '/library/safari.svg',
url: 'https://www.apple.com/safari'
title: "Safari",
category: "Browser",
route: "/library/safari.svg",
url: "https://www.apple.com/safari",
},
{
title: 'Vivaldi',
category: 'Browser',
route: '/library/vivaldi.svg',
url: 'https://vivaldi.com'
title: "Vivaldi",
category: "Browser",
route: "/library/vivaldi.svg",
url: "https://vivaldi.com",
},
{
title: 'Beacon',
category: 'Software',
route: '/library/Beacon-Logo.svg',
url: 'https://www.beacon.com'
title: "Beacon",
category: "Software",
route: "/library/Beacon-Logo.svg",
url: "https://www.beacon.com",
},
{
title: 'Affinity Designer',
category: 'Design',
route: '/library/affinity_designer.svg',
url: 'https://affinity.serif.com/en-us/designer/'
title: "Affinity Designer",
category: "Design",
route: "/library/affinity_designer.svg",
url: "https://affinity.serif.com/en-us/designer/",
},
{
title: 'Affinity Photo',
category: 'Software',
route: '/library/affinity_photo.svg',
url: 'https://affinity.serif.com/en-us/photo/'
title: "Affinity Photo",
category: "Software",
route: "/library/affinity_photo.svg",
url: "https://affinity.serif.com/en-us/photo/",
},
{
title: 'Affinity Publisher',
category: 'Software',
route: '/library/affinity_publisher.svg',
url: 'https://affinity.serif.com/en-us/publisher/'
title: "Affinity Publisher",
category: "Software",
route: "/library/affinity_publisher.svg",
url: "https://affinity.serif.com/en-us/publisher/",
},
{
title: 'Roblox',
category: 'Software',
title: "Roblox",
category: "Software",
route: {
dark: '/library/roblox.svg',
light: '/library/roblox_light.svg'
dark: "/library/roblox.svg",
light: "/library/roblox_light.svg",
},
url: 'https://www.roblox.com/'
url: "https://www.roblox.com/",
},
{
title: 'Stately.ai',
category: 'Software',
title: "Stately.ai",
category: "Software",
route: {
light: '/library/stately.svg',
dark: '/library/stately_dark.svg'
light: "/library/stately.svg",
dark: "/library/stately_dark.svg",
},
url: 'https://stately.ai/'
url: "https://stately.ai/",
},
{
title: 'XState',
category: 'Library',
title: "XState",
category: "Library",
route: {
light: '/library/xstate.svg',
dark: '/library/xstate_dark.svg'
light: "/library/xstate.svg",
dark: "/library/xstate_dark.svg",
},
url: 'https://github.com/statelyai/xstate'
url: "https://github.com/statelyai/xstate",
},
{
title: 'Hashnode',
category: 'Social',
route: '/library/hashnode.svg',
url: 'https://hashnode.com'
title: "Hashnode",
category: "Social",
route: "/library/hashnode.svg",
url: "https://hashnode.com",
},
{
title: 'Rowy',
category: 'CMS',
route: '/library/rowy.svg',
url: 'https://www.rowy.io/'
title: "Rowy",
category: "CMS",
route: "/library/rowy.svg",
url: "https://www.rowy.io/",
},
{
title: 'Cal.com',
category: 'Software',
title: "Cal.com",
category: "Software",
route: {
light: '/library/cal.svg',
dark: '/library/cal_dark.svg'
light: "/library/cal.svg",
dark: "/library/cal_dark.svg",
},
url: 'https://cal.com',
brandUrl: 'https://design.cal.com/'
url: "https://cal.com",
brandUrl: "https://design.cal.com/",
},
{
title: 'Calendly',
category: 'Software',
route: '/library/calendly.svg',
url: 'https://calendly.com/'
title: "Calendly",
category: "Software",
route: "/library/calendly.svg",
url: "https://calendly.com/",
},
{
title: 'Mintlify',
category: 'Software',
route: '/library/mintlify.svg',
url: 'https://mintlify.com/'
title: "Mintlify",
category: "Software",
route: "/library/mintlify.svg",
url: "https://mintlify.com/",
},
{
title: 'Patreon',
category: 'Social',
title: "Patreon",
category: "Social",
route: {
light: '/library/patreon.svg',
dark: '/library/patreon_dark.svg'
light: "/library/patreon.svg",
dark: "/library/patreon_dark.svg",
},
url: 'https://www.patreon.com/'
url: "https://www.patreon.com/",
},
{
title: 'Peerlist',
category: 'Social',
route: '/library/peerlist.svg',
url: 'https://www.peerlist.io/'
title: "Peerlist",
category: "Social",
route: "/library/peerlist.svg",
url: "https://www.peerlist.io/",
},
{
title: 'Product Hunt',
category: 'Software',
route: '/library/producthunt.svg',
url: 'https://www.producthunt.com/'
title: "Product Hunt",
category: "Software",
route: "/library/producthunt.svg",
url: "https://www.producthunt.com/",
},
{
title: 'Remotion',
category: 'Framework',
route: '/library/remotion.svg',
url: 'https://www.remotion.dev/'
title: "Remotion",
category: "Framework",
route: "/library/remotion.svg",
url: "https://www.remotion.dev/",
},
{
title: 'Warp',
category: 'Software',
route: '/library/warp.svg',
url: 'https://www.warp.dev/'
title: "Warp",
category: "Software",
route: "/library/warp.svg",
url: "https://www.warp.dev/",
},
{
title: 'SST',
category: 'Framework',
route: '/library/sst.svg',
url: 'https://sst.dev/'
title: "SST",
category: "Framework",
route: "/library/sst.svg",
url: "https://sst.dev/",
},
{
title: 'Documenso',
category: 'Software',
title: "Documenso",
category: "Software",
route: {
light: '/library/documenso.svg',
dark: '/library/documenso_dark.svg'
light: "/library/documenso.svg",
dark: "/library/documenso_dark.svg",
},
url: 'https://documenso.com'
url: "https://documenso.com",
},
{
title: 'Bash',
category: 'Language',
title: "Bash",
category: "Language",
route: {
light: '/library/bash.svg',
dark: '/library/bash_dark.svg'
light: "/library/bash.svg",
dark: "/library/bash_dark.svg",
},
url: 'https://www.gnu.org/software/bash/'
url: "https://www.gnu.org/software/bash/",
},
{
title: 'C',
category: 'Language',
route: '/library/c.svg',
url: 'https://en.wikipedia.org/wiki/C_(programming_language)'
title: "C",
category: "Language",
route: "/library/c.svg",
url: "https://en.wikipedia.org/wiki/C_(programming_language)",
},
{
title: 'C++',
category: 'Language',
route: '/library/c-plusplus.svg',
url: 'https://en.wikipedia.org/wiki/C%2B%2B'
title: "C++",
category: "Language",
route: "/library/c-plusplus.svg",
url: "https://en.wikipedia.org/wiki/C%2B%2B",
},
{
title: 'Cobol',
category: 'Language',
route: '/library/cobol.svg',
url: 'https://en.wikipedia.org/wiki/COBOL'
title: "Cobol",
category: "Language",
route: "/library/cobol.svg",
url: "https://en.wikipedia.org/wiki/COBOL",
},
{
title: 'Fortran',
category: 'Language',
route: '/library/fortran.svg',
url: 'https://fortran-lang.org/'
title: "Fortran",
category: "Language",
route: "/library/fortran.svg",
url: "https://fortran-lang.org/",
},
{
title: 'Haskell',
category: 'Language',
route: '/library/haskell.svg',
url: 'https://www.haskell.org/'
title: "Haskell",
category: "Language",
route: "/library/haskell.svg",
url: "https://www.haskell.org/",
},
{
title: 'matlab',
category: 'Language',
route: '/library/matlab.svg',
url: 'https://www.mathworks.com/products/matlab.html'
title: "matlab",
category: "Language",
route: "/library/matlab.svg",
url: "https://www.mathworks.com/products/matlab.html",
},
{
title: 'R',
category: 'Language',
title: "R",
category: "Language",
route: {
light: '/library/r.svg',
dark: '/library/r_dark.svg'
light: "/library/r.svg",
dark: "/library/r_dark.svg",
},
url: 'https://www.r-project.org/'
url: "https://www.r-project.org/",
},
{
title: 'Rust',
category: 'Language',
title: "Rust",
category: "Language",
route: {
light: '/library/rust.svg',
dark: '/library/rust_dark.svg'
light: "/library/rust.svg",
dark: "/library/rust_dark.svg",
},
url: 'https://www.rust-lang.org/'
url: "https://www.rust-lang.org/",
},
{
title: 'Zig',
category: 'Language',
route: '/library/zig.svg',
url: 'https://ziglang.org/'
title: "Zig",
category: "Language",
route: "/library/zig.svg",
url: "https://ziglang.org/",
},
{
title: 'Instatus',
category: 'Software',
title: "Instatus",
category: "Software",
route: {
light: '/library/instatus.svg',
dark: '/library/instatus_dark.svg'
light: "/library/instatus.svg",
dark: "/library/instatus_dark.svg",
},
url: 'https://instatus.com'
url: "https://instatus.com",
},
{
title: 'Front',
category: 'Software',
route: '/library/front.svg',
url: 'https://front.com'
title: "Front",
category: "Software",
route: "/library/front.svg",
url: "https://front.com",
},
{
title: 'Monero',
category: 'Crypto',
route: '/library/monero.svg',
url: 'https://www.getmonero.org/'
title: "Monero",
category: "Crypto",
route: "/library/monero.svg",
url: "https://www.getmonero.org/",
},
{
title: 'Axiom',
category: 'Software',
title: "Axiom",
category: "Software",
route: {
dark: '/library/axiom-dark.svg',
light: '/library/axiom-light.svg'
dark: "/library/axiom-dark.svg",
light: "/library/axiom-light.svg",
},
wordmark: {
light: '/library/axiom-wordmark-light.svg',
dark: '/library/axiom-wordmark-dark.svg'
light: "/library/axiom-wordmark-light.svg",
dark: "/library/axiom-wordmark-dark.svg",
},
url: 'https://axiom.co/'
url: "https://axiom.co/",
},
{
title: 'Django',
category: 'Framework',
route: '/library/django.svg',
url: 'https://www.djangoproject.com/',
brandUrl: 'https://www.djangoproject.com/community/logos/'
title: "Django",
category: "Framework",
route: "/library/django.svg",
url: "https://www.djangoproject.com/",
brandUrl: "https://www.djangoproject.com/community/logos/",
},
{
title: 'Zeabur',
category: 'Hosting',
title: "Zeabur",
category: "Hosting",
route: {
light: '/library/zeabur-light.svg',
dark: '/library/zeabur-dark.svg'
light: "/library/zeabur-light.svg",
dark: "/library/zeabur-dark.svg",
},
wordmark: {
light: '/library/zeabur_wordmark_light.svg',
dark: '/library/zeabur_wordmark_dark.svg'
light: "/library/zeabur_wordmark_light.svg",
dark: "/library/zeabur_wordmark_dark.svg",
},
url: 'https://zeabur.com/'
url: "https://zeabur.com/",
},
{
title: 'MetaMask',
category: 'Crypto',
route: '/library/metamask.svg',
url: 'https://metamask.io/'
title: "MetaMask",
category: "Crypto",
route: "/library/metamask.svg",
url: "https://metamask.io/",
},
{
title: 'shadcn/ui',
category: 'Library',
title: "shadcn/ui",
category: "Library",
route: {
light: '/library/shadcn-ui.svg',
dark: '/library/shadcn-ui_dark.svg'
light: "/library/shadcn-ui.svg",
dark: "/library/shadcn-ui_dark.svg",
},
url: 'https://ui.shadcn.com/'
url: "https://ui.shadcn.com/",
},
{
title: 'putio',
category: 'Software',
route: '/library/putio.svg',
url: 'https://put.io/'
title: "putio",
category: "Software",
route: "/library/putio.svg",
url: "https://put.io/",
},
{
title: 'Pinterest',
category: 'Social',
route: '/library/pinterest.svg',
url: 'https://pinterest.com/'
title: "Pinterest",
category: "Social",
route: "/library/pinterest.svg",
url: "https://pinterest.com/",
},
{
title: 'Reflex',
category: 'Software',
title: "Reflex",
category: "Software",
route: {
light: '/library/reflex-dark.svg',
dark: '/library/reflex-light.svg'
light: "/library/reflex-dark.svg",
dark: "/library/reflex-light.svg",
},
url: 'https://reflex.dev/'
url: "https://reflex.dev/",
},
{
title: 'Stripe',
category: ['Software', 'Payment'],
route: '/library/stripe.svg',
url: 'https://stripe.com/'
title: "Stripe",
category: ["Software", "Payment"],
route: "/library/stripe.svg",
url: "https://stripe.com/",
},
{
title: 'Linux',
category: 'Software',
route: '/library/linux.svg',
url: 'https://www.linux.org/'
title: "Linux",
category: "Software",
route: "/library/linux.svg",
url: "https://www.linux.org/",
},
{
title: 'XD',
category: 'Design',
route: '/library/adobe-xd.svg',
url: 'https://www.adobe.com/products/xd'
title: "XD",
category: "Design",
route: "/library/adobe-xd.svg",
url: "https://www.adobe.com/products/xd",
},
{
title: 'Axure',
category: 'Design',
route: '/library/axure.svg',
url: 'https://www.axure.com/'
title: "Axure",
category: "Design",
route: "/library/axure.svg",
url: "https://www.axure.com/",
},
{
title: 'Penpot',
category: 'Design',
title: "Penpot",
category: "Design",
route: {
light: '/library/penpot.svg',
dark: '/library/penpot_dark.svg'
light: "/library/penpot.svg",
dark: "/library/penpot_dark.svg",
},
url: 'https://penpot.app/'
url: "https://penpot.app/",
},
{
title: 'Sketch',
category: 'Design',
title: "Sketch",
category: "Design",
route: {
light: '/library/sketch_light.svg',
dark: '/library/sketch.svg'
light: "/library/sketch_light.svg",
dark: "/library/sketch.svg",
},
url: 'https://www.sketch.com/'
url: "https://www.sketch.com/",
},
{
title: 'Gimp',
category: 'Design',
route: '/library/gimp.svg',
url: 'https://www.gimp.org/'
title: "Gimp",
category: "Design",
route: "/library/gimp.svg",
url: "https://www.gimp.org/",
},
{
title: 'Ubuntu',
category: 'Software',
route: '/library/ubuntu.svg',
url: 'https://ubuntu.com/',
brandUrl: 'https://design.ubuntu.com/brand'
title: "Ubuntu",
category: "Software",
route: "/library/ubuntu.svg",
url: "https://ubuntu.com/",
brandUrl: "https://design.ubuntu.com/brand",
},
{
title: 'Cypress',
category: 'Framework',
route: '/library/cypress.svg',
url: 'https://www.cypress.io/'
title: "Cypress",
category: "Framework",
route: "/library/cypress.svg",
url: "https://www.cypress.io/",
},
{
title: 'Reddit',
category: 'Social',
route: '/library/reddit.svg',
url: 'https://www.reddit.com/',
brandUrl: 'https://redditinc.com/brand'
title: "Reddit",
category: "Social",
route: "/library/reddit.svg",
url: "https://www.reddit.com/",
brandUrl: "https://redditinc.com/brand",
},
{
title: 'JetBrains WebStorm',
category: 'Software',
route: '/library/webstorm.svg',
url: 'https://www.jetbrains.com/webstorm/'
title: "JetBrains WebStorm",
category: "Software",
route: "/library/webstorm.svg",
url: "https://www.jetbrains.com/webstorm/",
},
{
title: 'JetBrains PyCharm',
category: 'Software',
route: '/library/pycharm.svg',
url: 'https://www.jetbrains.com/pycharm/'
title: "JetBrains PyCharm",
category: "Software",
route: "/library/pycharm.svg",
url: "https://www.jetbrains.com/pycharm/",
},
{
title: 'JetBrains Fleet',
category: 'Software',
route: '/library/fleet.svg',
url: 'https://www.jetbrains.com/fleet/'
title: "JetBrains Fleet",
category: "Software",
route: "/library/fleet.svg",
url: "https://www.jetbrains.com/fleet/",
},
{
title: 'JetBrains RubyMine',
category: 'Software',
route: '/library/rubymine.svg',
url: 'https://www.jetbrains.com/ruby/'
title: "JetBrains RubyMine",
category: "Software",
route: "/library/rubymine.svg",
url: "https://www.jetbrains.com/ruby/",
},
{
title: 'JetBrains PhpStorm',
category: 'Software',
route: '/library/phpstorm.svg',
url: 'https://www.jetbrains.com/phpstorm/'
title: "JetBrains PhpStorm",
category: "Software",
route: "/library/phpstorm.svg",
url: "https://www.jetbrains.com/phpstorm/",
},
{
title: 'Monkeytype',
category: 'Software',
route: '/library/monkeytype.svg',
title: "Monkeytype",
category: "Software",
route: "/library/monkeytype.svg",
wordmark: {
dark: '/library/monkeytype-wordmark-dark.svg',
light: '/library/monkeytype-wordmark-light.svg'
dark: "/library/monkeytype-wordmark-dark.svg",
light: "/library/monkeytype-wordmark-light.svg",
},
url: 'https://monkeytype.com/'
url: "https://monkeytype.com/",
},
{
title: 'PyCharm',
category: 'Software',
route: '/library/pycharm.svg',
url: 'https://www.jetbrains.com/pycharm/'
title: "PyCharm",
category: "Software",
route: "/library/pycharm.svg",
url: "https://www.jetbrains.com/pycharm/",
},
{
title: 'Shopify',
category: 'CMS',
route: '/library/shopify.svg',
title: "Shopify",
category: "CMS",
route: "/library/shopify.svg",
wordmark: {
dark: '/library/shopify-wordmark-dark.svg',
light: '/library/shopify-wordmark-light.svg'
dark: "/library/shopify-wordmark-dark.svg",
light: "/library/shopify-wordmark-light.svg",
},
url: 'https://www.shopify.com',
brandUrl: 'https://www.shopify.com/brand-assets'
url: "https://www.shopify.com",
brandUrl: "https://www.shopify.com/brand-assets",
},
{
title: 'Webflow',
category: 'CMS',
route: '/library/webflow.svg',
title: "Webflow",
category: "CMS",
route: "/library/webflow.svg",
wordmark: {
dark: '/library/webflow-wordmark-dark.svg',
light: '/library/webflow-wordmark-light.svg'
dark: "/library/webflow-wordmark-dark.svg",
light: "/library/webflow-wordmark-light.svg",
},
url: 'https://www.webflow.com',
brandUrl: 'https://brand-at.webflow.io/resources'
url: "https://www.webflow.com",
brandUrl: "https://brand-at.webflow.io/resources",
},
{
title: 'Sanity',
category: 'CMS',
route: '/library/sanity.svg',
url: 'https://www.sanity.io'
title: "Sanity",
category: "CMS",
route: "/library/sanity.svg",
url: "https://www.sanity.io",
},
{
title: 'sky',
category: 'Entertainment',
route: '/library/sky.svg',
url: 'https://www.sky.com'
title: "sky",
category: "Entertainment",
route: "/library/sky.svg",
url: "https://www.sky.com",
},
{
title: 'Airbnb',
category: 'Software',
route: '/library/airbnb.svg',
wordmark: '/library/airbnb-wordmark.svg',
url: 'https://www.airbnb.com'
title: "Airbnb",
category: "Software",
route: "/library/airbnb.svg",
wordmark: "/library/airbnb-wordmark.svg",
url: "https://www.airbnb.com",
},
{
title: 'Uber',
category: 'Software',
title: "Uber",
category: "Software",
route: {
light: '/library/uber_light.svg',
dark: '/library/uber_dark.svg'
light: "/library/uber_light.svg",
dark: "/library/uber_dark.svg",
},
url: 'https://www.uber.com',
brandUrl: 'https://brand.uber.com/'
url: "https://www.uber.com",
brandUrl: "https://brand.uber.com/",
},
{
title: 'Gmail',
category: ['Google', 'Software'],
route: '/library/gmail.svg',
url: 'https://www.gmail.com'
title: "Gmail",
category: ["Google", "Software"],
route: "/library/gmail.svg",
url: "https://www.gmail.com",
},
{
title: 'Outlook',
category: 'Software',
route: '/library/outlook.svg',
url: 'https://www.outlook.com'
title: "Outlook",
category: "Software",
route: "/library/outlook.svg",
url: "https://www.outlook.com",
},
{
title: 'Slack',
category: 'Software',
route: '/library/slack.svg',
wordmark: '/library/slack-wordmark.svg',
url: 'https://www.slack.com'
title: "Slack",
category: "Software",
route: "/library/slack.svg",
wordmark: "/library/slack-wordmark.svg",
url: "https://www.slack.com",
},
{
title: 'Snapchat',
category: 'Software',
route: '/library/snapchat.svg',
url: 'https://www.snapchat.com'
title: "Snapchat",
category: "Software",
route: "/library/snapchat.svg",
url: "https://www.snapchat.com",
},
{
title: 'Ebay',
category: 'Software',
route: '/library/ebay.svg',
url: 'https://www.ebay.com'
title: "Ebay",
category: "Software",
route: "/library/ebay.svg",
url: "https://www.ebay.com",
},
{
title: 'IBM',
category: 'Software',
route: '/library/ibm.svg',
url: 'https://www.ibm.com'
title: "IBM",
category: "Software",
route: "/library/ibm.svg",
url: "https://www.ibm.com",
},
{
title: 'TrustPilot',
category: 'Software',
route: '/library/trustpilot.svg',
url: 'https://www.trustpilot.com'
title: "TrustPilot",
category: "Software",
route: "/library/trustpilot.svg",
url: "https://www.trustpilot.com",
},
{
title: 'Raycast',
category: 'Software',
route: '/library/raycast.svg',
title: "Raycast",
category: "Software",
route: "/library/raycast.svg",
wordmark: {
light: '/library/raycast-wordmark-light.svg',
dark: '/library/raycast-wordmark-dark.svg'
light: "/library/raycast-wordmark-light.svg",
dark: "/library/raycast-wordmark-dark.svg",
},
url: 'https://raycast.com/'
url: "https://raycast.com/",
},
{
title: 'Flow Launcher',
category: ['Software', 'Devtool'],
route: '/library/FlowLauncher.svg',
url: 'https://www.flowlauncher.com/'
title: "Flow Launcher",
category: ["Software", "Devtool"],
route: "/library/FlowLauncher.svg",
url: "https://www.flowlauncher.com/",
},
{
title: 'Hack The Box',
category: 'Cybersecurity',
route: '/library/hack-the-box.svg',
title: "Hack The Box",
category: "Cybersecurity",
route: "/library/hack-the-box.svg",
wordmark: {
light: '/library/hack-the-box-wordmark-light.svg',
dark: '/library/hack-the-box-wordmark-dark.svg'
light: "/library/hack-the-box-wordmark-light.svg",
dark: "/library/hack-the-box-wordmark-dark.svg",
},
url: 'https://www.hackthebox.com/'
url: "https://www.hackthebox.com/",
},
{
title: 'Procure',
category: 'Marketplace',
route: '/library/procure.svg',
url: 'https://procure.biz/'
title: "Procure",
category: "Marketplace",
route: "/library/procure.svg",
url: "https://procure.biz/",
},
{
title: 'Julia',
category: 'Language',
route: '/library/julia.svg',
url: 'https://julialang.org/'
title: "Julia",
category: "Language",
route: "/library/julia.svg",
url: "https://julialang.org/",
},
{
title: 'SWC',
category: 'Compiler',
route: '/library/swc.svg',
url: 'https://swc.rs/'
title: "SWC",
category: "Compiler",
route: "/library/swc.svg",
url: "https://swc.rs/",
},
{
title: 'PlayStation',
category: 'Software',
route: '/library/playstation.svg',
url: 'https://www.playstation.com/'
title: "PlayStation",
category: "Software",
route: "/library/playstation.svg",
url: "https://www.playstation.com/",
},
{
title: 'Xbox',
category: 'Software',
route: '/library/xbox.svg',
url: 'https://www.xbox.com/'
title: "Xbox",
category: "Software",
route: "/library/xbox.svg",
url: "https://www.xbox.com/",
},
{
title: 'Cody',
category: 'AI',
route: '/library/cody.svg',
url: 'https://about.sourcegraph.com/'
title: "Cody",
category: "AI",
route: "/library/cody.svg",
url: "https://about.sourcegraph.com/",
},
{
title: 'Sourcegraph',
category: 'AI',
route: '/library/sourcegraph.svg',
url: 'https://about.sourcegraph.com/'
title: "Sourcegraph",
category: "AI",
route: "/library/sourcegraph.svg",
url: "https://about.sourcegraph.com/",
},
{
title: 'Perplexity AI',
category: 'AI',
route: '/library/perplexity.svg',
title: "Perplexity AI",
category: "AI",
route: "/library/perplexity.svg",
wordmark: {
light: '/library/perplexity_wordmark_light.svg',
dark: '/library/perplexity_wordmark_dark.svg'
light: "/library/perplexity_wordmark_light.svg",
dark: "/library/perplexity_wordmark_dark.svg",
},
url: 'https://perplexity.ai/'
url: "https://perplexity.ai/",
},
{
title: 'Spring',
category: 'Framework',
route: '/library/spring.svg',
url: 'https://spring.io/'
title: "Spring",
category: "Framework",
route: "/library/spring.svg",
url: "https://spring.io/",
},
{
title: 'Directus',
category: 'CMS',
route: '/library/directus.svg',
url: 'https://directus.io/'
title: "Directus",
category: "CMS",
route: "/library/directus.svg",
url: "https://directus.io/",
},
{
title: 'Pnpm',
category: 'Software',
title: "Pnpm",
category: "Software",
route: {
light: '/library/pnpm.svg',
dark: '/library/pnpm_dark.svg'
light: "/library/pnpm.svg",
dark: "/library/pnpm_dark.svg",
},
wordmark: {
light: '/library/pnpm_wordmark_light.svg',
dark: '/library/pnpm_wordmark_dark.svg'
light: "/library/pnpm_wordmark_light.svg",
dark: "/library/pnpm_wordmark_dark.svg",
},
url: 'https://pnpm.io/'
url: "https://pnpm.io/",
},
{
title: 'Emacs',
category: 'Software',
route: '/library/emacs.svg',
url: 'https://www.gnu.org/software/emacs/'
title: "Emacs",
category: "Software",
route: "/library/emacs.svg",
url: "https://www.gnu.org/software/emacs/",
},
{
title: 'Svgl',
category: 'Library',
route: '/library/svgl.svg',
url: 'https://svgl.app'
title: "Svgl",
category: "Library",
route: "/library/svgl.svg",
url: "https://svgl.app",
},
{
title: 'Google Idx',
category: ['Software', 'Google'],
route: '/library/google-idx.svg',
url: 'https://idx.dev/'
title: "Google Idx",
category: ["Software", "Google"],
route: "/library/google-idx.svg",
url: "https://idx.dev/",
},
{
title: 'Remix',
category: 'Framework',
title: "Remix",
category: "Framework",
route: {
light: '/library/remix_light.svg',
dark: '/library/remix_dark.svg'
light: "/library/remix_light.svg",
dark: "/library/remix_dark.svg",
},
wordmark: {
light: '/library/remix_wordmark_light.svg',
dark: '/library/remix_wordmark_dark.svg'
light: "/library/remix_wordmark_light.svg",
dark: "/library/remix_wordmark_dark.svg",
},
url: 'https://remix.run/',
brandUrl: 'https://remix.run/brand'
url: "https://remix.run/",
brandUrl: "https://remix.run/brand",
},
{
title: 'Steam',
category: 'Software',
route: '/library/steam.svg',
url: 'https://store.steampowered.com/'
title: "Steam",
category: "Software",
route: "/library/steam.svg",
url: "https://store.steampowered.com/",
},
{
title: 'Tabby',
category: 'Software',
route: '/library/tabby.svg',
url: 'https://tabby.sh/'
title: "Tabby",
category: "Software",
route: "/library/tabby.svg",
url: "https://tabby.sh/",
},
{
title: '1Password',
category: 'Software',
title: "1Password",
category: "Software",
route: {
light: '/library/1password-light.svg',
dark: '/library/1password-dark.svg'
light: "/library/1password-light.svg",
dark: "/library/1password-dark.svg",
},
url: 'https://1password.com'
url: "https://1password.com",
},
{
title: 'Flask',
category: 'Framework',
title: "Flask",
category: "Framework",
route: {
light: '/library/flask-light.svg',
dark: '/library/flask-dark.svg'
light: "/library/flask-light.svg",
dark: "/library/flask-dark.svg",
},
wordmark: {
light: '/library/flask-wordmark-light.svg',
dark: '/library/flask-wordmark-dark.svg'
light: "/library/flask-wordmark-light.svg",
dark: "/library/flask-wordmark-dark.svg",
},
url: 'https://flask.palletsprojects.com/'
url: "https://flask.palletsprojects.com/",
},
{
title: 'Alacritty',
category: 'Software',
route: '/library/alacritty.svg',
url: 'https://alacritty.org'
title: "Alacritty",
category: "Software",
route: "/library/alacritty.svg",
url: "https://alacritty.org",
},
{
title: 'Qt',
category: 'Software',
route: '/library/qt.svg',
url: 'https://www.qt.io/'
title: "Qt",
category: "Software",
route: "/library/qt.svg",
url: "https://www.qt.io/",
},
{
title: 'Bitwarden',
category: ['Software', 'Authentication'],
route: '/library/bitwarden.svg',
url: 'https://bitwarden.com/',
brandUrl: 'https://bitwarden.com/brand/'
title: "Bitwarden",
category: ["Software", "Authentication"],
route: "/library/bitwarden.svg",
url: "https://bitwarden.com/",
brandUrl: "https://bitwarden.com/brand/",
},
{
title: 'Voicemod',
category: 'Entertainment',
title: "Voicemod",
category: "Entertainment",
route: {
light: '/library/voicemod_light.svg',
dark: '/library/voicemod_dark.svg'
light: "/library/voicemod_light.svg",
dark: "/library/voicemod_dark.svg",
},
url: 'https://voicemod.net/'
url: "https://voicemod.net/",
},
{
title: 'Neovim',
category: 'Software',
route: '/library/neovim.svg',
url: 'https://neovim.io/'
title: "Neovim",
category: "Software",
route: "/library/neovim.svg",
url: "https://neovim.io/",
},
{
title: 'Pitch',
category: 'Design',
route: '/library/pitch.svg',
url: 'https://pitch.com'
title: "Pitch",
category: "Design",
route: "/library/pitch.svg",
url: "https://pitch.com",
},
{
title: 'Biomejs',
category: 'Compiler',
route: '/library/biomejs.svg',
url: 'https://biomejs.dev/'
title: "Biomejs",
category: "Compiler",
route: "/library/biomejs.svg",
url: "https://biomejs.dev/",
},
{
title: 'Gradio',
category: 'Software',
route: '/library/gradio.svg',
url: 'https://www.gradio.app/'
title: "Gradio",
category: "Software",
route: "/library/gradio.svg",
url: "https://www.gradio.app/",
},
{
title: 'Meta',
category: 'Social',
route: '/library/meta.svg',
url: 'https://about.meta.com/es/',
brandUrl: 'https://about.meta.com/brand/resources/'
title: "Meta",
category: "Social",
route: "/library/meta.svg",
url: "https://about.meta.com/es/",
brandUrl: "https://about.meta.com/brand/resources/",
},
{
title: 'Stability AI',
category: 'AI',
route: '/library/stability-ai.svg',
url: 'https://stability.ai/'
title: "Stability AI",
category: "AI",
route: "/library/stability-ai.svg",
url: "https://stability.ai/",
},
{
title: 'Google PaLM',
category: ['AI', 'Google'],
route: '/library/google-palm.svg',
url: 'https://ai.google/discover/palm2/'
title: "Google PaLM",
category: ["AI", "Google"],
route: "/library/google-palm.svg",
url: "https://ai.google/discover/palm2/",
},
{
title: 'Android',
category: 'Software',
route: '/library/android-icon.svg',
url: 'https://www.android.com/'
title: "Android",
category: "Software",
route: "/library/android-icon.svg",
url: "https://www.android.com/",
},
{
title: 'Sentry',
category: 'Software',
route: '/library/sentry.svg',
url: 'https://sentry.io/',
brandUrl: 'https://sentry.io/branding/'
title: "Sentry",
category: "Software",
route: "/library/sentry.svg",
url: "https://sentry.io/",
brandUrl: "https://sentry.io/branding/",
},
{
title: 'Grafana',
category: 'Software',
route: '/library/grafana.svg',
url: 'https://grafana.com/'
title: "Grafana",
category: "Software",
route: "/library/grafana.svg",
url: "https://grafana.com/",
},
{
title: 'Notion',
category: 'Software',
route: '/library/notion.svg',
url: 'https://notion.so/'
title: "Notion",
category: "Software",
route: "/library/notion.svg",
url: "https://notion.so/",
},
{
title: 'Litecoin',
category: 'Crypto',
route: '/library/litecoin.svg',
url: 'https://litecoin.org/'
title: "Litecoin",
category: "Crypto",
route: "/library/litecoin.svg",
url: "https://litecoin.org/",
},
{
title: 'ElysiaJS',
category: 'Framework',
route: '/library/elysiajs.svg',
url: 'https://elysiajs.com/'
title: "ElysiaJS",
category: "Framework",
route: "/library/elysiajs.svg",
url: "https://elysiajs.com/",
},
{
title: 'TensorFlow',
category: 'Library',
route: '/library/tensorflow.svg',
url: 'https://www.tensorflow.org/'
title: "TensorFlow",
category: "Library",
route: "/library/tensorflow.svg",
url: "https://www.tensorflow.org/",
},
{
title: 'Midday',
category: 'AI',
route: '/library/midday.svg',
url: 'https://midday.ai/'
title: "Midday",
category: "AI",
route: "/library/midday.svg",
url: "https://midday.ai/",
},
{
title: 'C#',
category: 'Language',
route: '/library/csharp.svg',
url: 'https://dotnet.microsoft.com/languages/csharp'
title: "C#",
category: "Language",
route: "/library/csharp.svg",
url: "https://dotnet.microsoft.com/languages/csharp",
},
{
title: 'Replicate',
category: 'AI',
title: "Replicate",
category: "AI",
route: {
light: '/library/replicate_light.svg',
dark: '/library/replicate_dark.svg'
light: "/library/replicate_light.svg",
dark: "/library/replicate_dark.svg",
},
wordmark: {
light: '/library/replicate-wordmark_light.svg',
dark: '/library/replicate-wordmark_dark.svg'
light: "/library/replicate-wordmark_light.svg",
dark: "/library/replicate-wordmark_dark.svg",
},
url: 'https://replicate.com/'
url: "https://replicate.com/",
},
{
title: 'Markdown',
category: 'Language',
title: "Markdown",
category: "Language",
route: {
light: '/library/markdown-light.svg',
dark: '/library/markdown-dark.svg'
light: "/library/markdown-light.svg",
dark: "/library/markdown-dark.svg",
},
url: 'https://www.markdownguide.org/'
url: "https://www.markdownguide.org/",
},
{
title: 'Radix UI',
category: 'Library',
title: "Radix UI",
category: "Library",
route: {
light: '/library/radix-ui_light.svg',
dark: '/library/radix-ui_dark.svg'
light: "/library/radix-ui_light.svg",
dark: "/library/radix-ui_dark.svg",
},
url: 'https://www.radix-ui.com/'
url: "https://www.radix-ui.com/",
},
{
title: 'Web.dev',
category: 'Education',
route: '/library/webdev.svg',
url: 'https://web.dev/'
title: "Web.dev",
category: "Education",
route: "/library/webdev.svg",
url: "https://web.dev/",
},
{
title: 'SWR',
category: 'Library',
title: "SWR",
category: "Library",
route: {
light: '/library/swr-light.svg',
dark: '/library/swr-dark.svg'
light: "/library/swr-light.svg",
dark: "/library/swr-dark.svg",
},
url: 'https://swr.vercel.app/'
url: "https://swr.vercel.app/",
},
{
title: 'Refine',
category: 'Framework',
title: "Refine",
category: "Framework",
route: {
light: '/library/refine_dark.svg',
dark: '/library/refine_light.svg'
light: "/library/refine_dark.svg",
dark: "/library/refine_light.svg",
},
url: 'https://refine.dev/'
url: "https://refine.dev/",
},
{
title: 'Youtube Music',
category: ['Google', 'Music'],
route: '/library/youtube_music.svg',
title: "Youtube Music",
category: ["Google", "Music"],
route: "/library/youtube_music.svg",
wordmark: {
light: '/library/youtube_music_wordmark_light.svg',
dark: '/library/youtube_music_wordmark_dark.svg'
light: "/library/youtube_music_wordmark_light.svg",
dark: "/library/youtube_music_wordmark_dark.svg",
},
url: 'https://music.youtube.com/'
url: "https://music.youtube.com/",
},
{
title: 'TIDAL',
category: 'Music',
title: "TIDAL",
category: "Music",
route: {
light: '/library/tidal_light.svg',
dark: '/library/tidal_dark.svg'
light: "/library/tidal_light.svg",
dark: "/library/tidal_dark.svg",
},
wordmark: {
light: '/library/tidal_wordmark_light.svg',
dark: '/library/tidal_wordmark_dark.svg'
light: "/library/tidal_wordmark_light.svg",
dark: "/library/tidal_wordmark_dark.svg",
},
url: 'https://tidal.com/'
url: "https://tidal.com/",
},
{
title: 'OBS',
category: 'Software',
route: '/library/obs.svg',
url: 'https://obsproject.com/'
title: "OBS",
category: "Software",
route: "/library/obs.svg",
url: "https://obsproject.com/",
},
{
title: 'Stack Overflow',
category: 'Software',
route: '/library/stackoverflow.svg',
wordmark: '/library/stackoverflow_wordmark.svg',
url: 'https://stackoverflow.com/',
brandUrl: 'https://stackoverflow.design/brand/'
title: "Stack Overflow",
category: "Software",
route: "/library/stackoverflow.svg",
wordmark: "/library/stackoverflow_wordmark.svg",
url: "https://stackoverflow.com/",
brandUrl: "https://stackoverflow.design/brand/",
},
{
title: 'TikTok',
category: 'Social',
route: '/library/tiktok.svg',
url: 'https://www.tiktok.com/'
title: "TikTok",
category: "Social",
route: "/library/tiktok.svg",
url: "https://www.tiktok.com/",
},
{
title: 'Ngrok',
category: 'Software',
title: "Ngrok",
category: "Software",
route: {
dark: '/library/ngrok-dark.svg',
light: '/library/ngrok-light.svg'
dark: "/library/ngrok-dark.svg",
light: "/library/ngrok-light.svg",
},
url: 'https://ngrok.com'
url: "https://ngrok.com",
},
{
title: 'Lemon Squeezy',
category: 'Software',
route: '/library/lemonsqueezy.svg',
url: 'https://www.lemonsqueezy.com'
title: "Lemon Squeezy",
category: "Software",
route: "/library/lemonsqueezy.svg",
url: "https://www.lemonsqueezy.com",
},
{
title: 'Asana',
category: 'Software',
route: '/library/asana-logo.svg',
title: "Asana",
category: "Software",
route: "/library/asana-logo.svg",
wordmark: {
dark: '/library/asana-wordmark-dark.svg',
light: '/library/asana-wordmark-light.svg'
dark: "/library/asana-wordmark-dark.svg",
light: "/library/asana-wordmark-light.svg",
},
url: 'https://asana.com'
url: "https://asana.com",
},
{
title: 'UpLeveled',
category: 'Education',
route: '/library/upleveled.svg',
wordmark: '/library/upleveled-wordmark.svg',
url: 'https://upleveled.io/'
title: "UpLeveled",
category: "Education",
route: "/library/upleveled.svg",
wordmark: "/library/upleveled-wordmark.svg",
url: "https://upleveled.io/",
},
{
title: 'Zoom',
category: 'Software',
route: '/library/zoom.svg',
url: 'https://zoom.us/'
title: "Zoom",
category: "Software",
route: "/library/zoom.svg",
url: "https://zoom.us/",
},
{
title: 'Tina',
category: 'CMS',
route: '/library/tina.svg',
wordmark: '/library/tina_wordmark.svg',
url: 'https://tina.io/'
title: "Tina",
category: "CMS",
route: "/library/tina.svg",
wordmark: "/library/tina_wordmark.svg",
url: "https://tina.io/",
},
{
title: 'Next.js',
category: ['Framework', 'Vercel'],
route: '/library/nextjs_icon_dark.svg',
title: "Next.js",
category: ["Framework", "Vercel"],
route: "/library/nextjs_icon_dark.svg",
wordmark: {
light: '/library/nextjs_logo_light.svg',
dark: '/library/nextjs_logo_dark.svg'
light: "/library/nextjs_logo_light.svg",
dark: "/library/nextjs_logo_dark.svg",
},
url: 'https://nextjs.org/'
url: "https://nextjs.org/",
},
{
title: 'Mistral AI',
category: 'AI',
route: '/library/mistral-ai_logo.svg',
wordmark: '/library/mistral-ai_wordmark.svg',
url: 'https://mistral.ai/'
title: "Mistral AI",
category: "AI",
route: "/library/mistral-ai_logo.svg",
wordmark: "/library/mistral-ai_wordmark.svg",
url: "https://mistral.ai/",
},
{
title: 'Hugging Face',
category: 'AI',
route: '/library/hugging_face.svg',
url: 'https://huggingface.co/',
brandUrl: 'https://huggingface.co/brand'
title: "Hugging Face",
category: "AI",
route: "/library/hugging_face.svg",
url: "https://huggingface.co/",
brandUrl: "https://huggingface.co/brand",
},
{
title: 'Node.js',
category: 'Library',
route: '/library/nodejs.svg',
url: 'https://nodejs.org/',
brandUrl: 'https://nodejs.org/en/about/branding'
title: "Node.js",
category: "Library",
route: "/library/nodejs.svg",
url: "https://nodejs.org/",
brandUrl: "https://nodejs.org/en/about/branding",
},
{
title: 'Raindrop.io',
category: 'Software',
route: '/library/raindrop.svg',
url: 'https://raindrop.io/'
title: "Raindrop.io",
category: "Software",
route: "/library/raindrop.svg",
url: "https://raindrop.io/",
},
{
title: 'Microsoft Todo',
category: 'Software',
route: '/library/microsoft-todo.svg',
url: 'https://to-do.office.com/'
title: "Microsoft Todo",
category: "Software",
route: "/library/microsoft-todo.svg",
url: "https://to-do.office.com/",
},
{
title: 'Manifest',
category: ['Software', 'AI', 'Database'],
route: '/library/manifest.svg',
url: 'https://manifest.build',
brandUrl: 'https://manifest.build/brand-assets'
title: "Manifest",
category: ["Software", "AI", "Database"],
route: "/library/manifest.svg",
url: "https://manifest.build",
brandUrl: "https://manifest.build/brand-assets",
},
{
title: 'Supabase',
category: 'Database',
route: '/library/supabase.svg',
url: 'https://supabase.com/',
title: "Supabase",
category: "Database",
route: "/library/supabase.svg",
url: "https://supabase.com/",
wordmark: {
light: '/library/supabase_wordmark_light.svg',
dark: '/library/supabase_wordmark_dark.svg'
light: "/library/supabase_wordmark_light.svg",
dark: "/library/supabase_wordmark_dark.svg",
},
brandUrl: 'https://supabase.com/brand-assets'
brandUrl: "https://supabase.com/brand-assets",
},
{
title: 'Gleam',
category: 'Language',
route: '/library/gleam.svg',
url: 'https://gleam.run/'
title: "Gleam",
category: "Language",
route: "/library/gleam.svg",
url: "https://gleam.run/",
},
{
title: 'Flowbite',
category: 'Framework',
route: '/library/flowbite.svg',
url: 'https://flowbite.com/'
title: "Flowbite",
category: "Framework",
route: "/library/flowbite.svg",
url: "https://flowbite.com/",
},
{
title: 'Hume AI',
category: 'AI',
route: '/library/hume-ai.svg',
url: 'https://hume.ai/'
title: "Hume AI",
category: "AI",
route: "/library/hume-ai.svg",
url: "https://hume.ai/",
},
{
title: 'Resend',
category: 'Software',
url: 'https://resend.com/',
title: "Resend",
category: "Software",
url: "https://resend.com/",
route: {
light: '/library/resend-icon-black.svg',
dark: '/library/resend-icon-white.svg'
light: "/library/resend-icon-black.svg",
dark: "/library/resend-icon-white.svg",
},
wordmark: {
light: '/library/resend-wordmark-black.svg',
dark: '/library/resend-wordmark-white.svg'
light: "/library/resend-wordmark-black.svg",
dark: "/library/resend-wordmark-white.svg",
},
brandUrl: 'https://resend.com/brand'
brandUrl: "https://resend.com/brand",
},
{
title: 'Layers',
category: 'Design',
title: "Layers",
category: "Design",
route: {
light: '/library/layers_light.svg',
dark: '/library/layers_dark.svg'
light: "/library/layers_light.svg",
dark: "/library/layers_dark.svg",
},
url: 'https://layers.to/'
url: "https://layers.to/",
},
{
title: 'Exome',
category: 'Library',
route: '/library/exome.svg',
url: 'https://exome.dev/'
title: "Exome",
category: "Library",
route: "/library/exome.svg",
url: "https://exome.dev/",
},
{
title: 'Poper',
category: 'AI',
route: '/library/poper.svg',
url: 'https://www.poper.ai'
title: "Poper",
category: "AI",
route: "/library/poper.svg",
url: "https://www.poper.ai",
},
{
title: 'Dub',
category: 'Software',
title: "Dub",
category: "Software",
route: {
light: '/library/dub.svg',
dark: '/library/dub_dark_logo.svg'
light: "/library/dub.svg",
dark: "/library/dub_dark_logo.svg",
},
wordmark: {
light: '/library/dub_light_wordmark.svg',
dark: '/library/dub_dark_wordmark.svg'
light: "/library/dub_light_wordmark.svg",
dark: "/library/dub_dark_wordmark.svg",
},
url: 'https://dub.co',
brandUrl: 'https://dub.co/brand'
url: "https://dub.co",
brandUrl: "https://dub.co/brand",
},
{
title: 'Turso',
category: ['Database', 'Software'],
title: "Turso",
category: ["Database", "Software"],
route: {
light: '/library/turso-light.svg',
dark: '/library/turso-dark.svg'
light: "/library/turso-light.svg",
dark: "/library/turso-dark.svg",
},
wordmark: {
light: '/library/turso-wordmark-light.svg',
dark: '/library/turso-wordmark-dark.svg'
light: "/library/turso-wordmark-light.svg",
dark: "/library/turso-wordmark-dark.svg",
},
url: 'https://turso.tech'
url: "https://turso.tech",
},
{
title: 'RelaGit',
category: 'Software',
title: "RelaGit",
category: "Software",
route: {
light: '/library/relagit-icon-light.svg',
dark: '/library/relagit-icon-dark.svg'
light: "/library/relagit-icon-light.svg",
dark: "/library/relagit-icon-dark.svg",
},
wordmark: {
light: '/library/relagit-wordmark-light.svg',
dark: '/library/relagit-wordmark-dark.svg'
light: "/library/relagit-wordmark-light.svg",
dark: "/library/relagit-wordmark-dark.svg",
},
url: 'https://rela.dev'
url: "https://rela.dev",
},
{
title: 'T3 Stack',
category: 'Framework',
title: "T3 Stack",
category: "Framework",
route: {
light: '/library/t3-dark.svg',
dark: '/library/t3-light.svg'
light: "/library/t3-dark.svg",
dark: "/library/t3-light.svg",
},
url: 'https://create.t3.gg/'
url: "https://create.t3.gg/",
},
{
title: 'Apple Music',
category: 'Music',
route: '/library/apple-music-icon.svg',
title: "Apple Music",
category: "Music",
route: "/library/apple-music-icon.svg",
wordmark: {
light: '/library/apple-music-wordmark-light.svg',
dark: '/library/apple-music-wordmark-dark.svg'
light: "/library/apple-music-wordmark-light.svg",
dark: "/library/apple-music-wordmark-dark.svg",
},
url: 'https://music.apple.com/'
url: "https://music.apple.com/",
},
{
title: 'YGeeker',
category: 'Software',
route: '/library/ygeeker.svg',
url: 'https://www.ygeeker.com'
title: "YGeeker",
category: "Software",
route: "/library/ygeeker.svg",
url: "https://www.ygeeker.com",
},
{
title: 'PostCSS',
category: 'Compiler',
route: '/library/postcss.svg',
wordmark: '/library/postcss_wordmark.svg',
url: 'https://postcss.org/'
title: "PostCSS",
category: "Compiler",
route: "/library/postcss.svg",
wordmark: "/library/postcss_wordmark.svg",
url: "https://postcss.org/",
},
{
title: 'SVG',
category: ['Language', 'Design'],
route: '/library/svg.svg',
wordmark: '/library/svg_wordmark.svg',
url: 'https://www.w3.org/TR/SVG/'
title: "SVG",
category: ["Language", "Design"],
route: "/library/svg.svg",
wordmark: "/library/svg_wordmark.svg",
url: "https://www.w3.org/TR/SVG/",
},
{
title: 'Todoist',
category: 'Software',
route: '/library/todoist.svg',
wordmark: '/library/todoist-wordmark.svg',
url: 'https://todoist.com/'
title: "Todoist",
category: "Software",
route: "/library/todoist.svg",
wordmark: "/library/todoist-wordmark.svg",
url: "https://todoist.com/",
},
{
title: 'Apidog',
category: 'Software',
route: '/library/apidog.svg',
url: 'https://apidog.com/'
title: "Apidog",
category: "Software",
route: "/library/apidog.svg",
url: "https://apidog.com/",
},
{
title: 'Chart.js',
category: 'Library',
route: '/library/chartjs.svg',
url: 'https://www.chartjs.org/'
title: "Chart.js",
category: "Library",
route: "/library/chartjs.svg",
url: "https://www.chartjs.org/",
},
{
title: 'JSON Schema',
category: 'Library',
route: '/library/json-schema.svg',
url: 'https://json-schema.org/'
title: "JSON Schema",
category: "Library",
route: "/library/json-schema.svg",
url: "https://json-schema.org/",
},
{
title: 'v0',
category: 'Vercel',
title: "v0",
category: "Vercel",
route: {
light: '/library/v0_light.svg',
dark: '/library/v0_dark.svg'
light: "/library/v0_light.svg",
dark: "/library/v0_dark.svg",
},
url: 'https://v0.dev/'
url: "https://v0.dev/",
},
{
title: 'Bento',
category: 'Software',
route: '/library/bento.svg',
url: 'https://bento.me/home'
title: "Bento",
category: "Software",
route: "/library/bento.svg",
url: "https://bento.me/home",
},
{
title: 'Firebase',
category: ['Hosting', 'Google'],
route: '/library/firebase.svg',
wordmark: '/library/firebase-wordmark.svg',
url: 'https://firebase.google.com/'
title: "Firebase",
category: ["Hosting", "Google"],
route: "/library/firebase.svg",
wordmark: "/library/firebase-wordmark.svg",
url: "https://firebase.google.com/",
},
{
title: 'Prettier',
category: 'Library',
title: "Prettier",
category: "Library",
route: {
light: '/library/prettier-icon-light.svg',
dark: '/library/prettier-icon-dark.svg'
light: "/library/prettier-icon-light.svg",
dark: "/library/prettier-icon-dark.svg",
},
url: 'https://prettier.io/'
url: "https://prettier.io/",
},
{
title: 'Leap Wallet',
category: ['Crypto', 'Software', 'Payment'],
route: '/library/leap-wallet.svg',
title: "Leap Wallet",
category: ["Crypto", "Software", "Payment"],
route: "/library/leap-wallet.svg",
wordmark: {
light: '/library/leap-wallet-wordmark-light.svg',
dark: '/library/leap-wallet-wordmark-dark.svg'
light: "/library/leap-wallet-wordmark-light.svg",
dark: "/library/leap-wallet-wordmark-dark.svg",
},
url: 'https://leapwallet.io/'
url: "https://leapwallet.io/",
},
{
title: 'Nx',
category: ['Devtool', 'Monorepo'],
title: "Nx",
category: ["Devtool", "Monorepo"],
route: {
light: '/library/nx_light.svg',
dark: '/library/nx_dark.svg'
light: "/library/nx_light.svg",
dark: "/library/nx_dark.svg",
},
url: 'https://nx.dev'
url: "https://nx.dev",
},
{
title: 'Google Colaboratory',
category: ['Google', 'Software'],
route: '/library/Google_Colaboratory.svg',
url: 'https://colab.research.google.com/'
title: "Google Colaboratory",
category: ["Google", "Software"],
route: "/library/Google_Colaboratory.svg",
url: "https://colab.research.google.com/",
},
{
title: 'Raspberry PI',
category: ['Hardware', 'Software'],
route: '/library/raspberry_pi.svg',
url: 'https://www.raspberrypi.com/'
title: "Raspberry PI",
category: ["Hardware", "Software"],
route: "/library/raspberry_pi.svg",
url: "https://www.raspberrypi.com/",
},
{
title: 'Vite',
category: ['Devtool', 'VoidZero'],
route: '/library/vitejs.svg',
url: 'https://vitejs.dev'
title: "Vite",
category: ["Devtool", "VoidZero"],
route: "/library/vitejs.svg",
url: "https://vitejs.dev",
},
{
title: 'Vitest',
category: ['Framework', 'VoidZero'],
route: '/library/vitest.svg',
url: 'https://vitest.dev/'
title: "Vitest",
category: ["Framework", "VoidZero"],
route: "/library/vitest.svg",
url: "https://vitest.dev/",
},
{
title: 'Oxc',
category: ['Devtool', 'VoidZero'],
route: '/library/oxc.svg',
url: 'https://oxc.rs/'
title: "Oxc",
category: ["Devtool", "VoidZero"],
route: "/library/oxc.svg",
url: "https://oxc.rs/",
},
{
title: 'Rolldown',
category: ['Compiler', 'VoidZero'],
route: '/library/rolldown.svg',
url: 'https://rolldown.rs/'
title: "Rolldown",
category: ["Compiler", "VoidZero"],
route: "/library/rolldown.svg",
url: "https://rolldown.rs/",
},
{
title: 'ManzDev',
category: ['Community'],
route: '/library/manzdev.svg',
url: 'https://manz.dev/'
title: "ManzDev",
category: ["Community"],
route: "/library/manzdev.svg",
url: "https://manz.dev/",
},
{
title: 'Afordin',
category: ['Community'],
title: "Afordin",
category: ["Community"],
route: {
light: '/library/afordin-light.svg',
dark: '/library/afordin-dark.svg'
light: "/library/afordin-light.svg",
dark: "/library/afordin-dark.svg",
},
url: 'https://github.com/Afordin'
url: "https://github.com/Afordin",
},
{
title: 'MediaWiki',
category: ['Software', 'CMS'],
route: '/library/mediawiki.svg',
title: "MediaWiki",
category: ["Software", "CMS"],
route: "/library/mediawiki.svg",
wordmark: {
light: '/library/mediawiki-wordmark-light.svg',
dark: '/library/mediawiki-wordmark-dark.svg'
light: "/library/mediawiki-wordmark-light.svg",
dark: "/library/mediawiki-wordmark-dark.svg",
},
url: 'https://www.mediawiki.org/'
url: "https://www.mediawiki.org/",
},
{
title: 'Carrd',
category: ['Social'],
route: '/library/carrd.svg',
url: 'https://carrd.co/'
title: "Carrd",
category: ["Social"],
route: "/library/carrd.svg",
url: "https://carrd.co/",
},
{
title: 'Claude AI',
category: 'AI',
route: '/library/claude-ai-icon.svg',
title: "Claude AI",
category: "AI",
route: "/library/claude-ai-icon.svg",
wordmark: {
light: '/library/claude-ai-wordmark-icon_light.svg',
dark: '/library/claude-ai-wordmark-icon_dark.svg'
light: "/library/claude-ai-wordmark-icon_light.svg",
dark: "/library/claude-ai-wordmark-icon_dark.svg",
},
url: 'https://claude.ai/'
url: "https://claude.ai/",
},
{
title: 'UnoCSS',
category: 'Devtool',
route: '/library/unocss.svg',
url: 'https://unocss.dev/'
title: "UnoCSS",
category: "Devtool",
route: "/library/unocss.svg",
url: "https://unocss.dev/",
},
{
title: 'tRPC',
category: 'Framework',
route: '/library/trpc.svg',
title: "tRPC",
category: "Framework",
route: "/library/trpc.svg",
wordmark: {
light: '/library/trpc_wordmark_light.svg',
dark: 'library/trpc_wordmark_dark.svg'
light: "/library/trpc_wordmark_light.svg",
dark: "library/trpc_wordmark_dark.svg",
},
url: 'https://trpc.io/'
url: "https://trpc.io/",
},
{
title: 'Bluesky',
category: 'Social',
route: '/library/bluesky.svg',
url: 'https://blueskyweb.xyz/'
title: "Bluesky",
category: "Social",
route: "/library/bluesky.svg",
url: "https://blueskyweb.xyz/",
},
{
title: 'Drizzle ORM',
category: ['Library', 'Database'],
title: "Drizzle ORM",
category: ["Library", "Database"],
route: {
light: '/library/drizzle-orm_light.svg',
dark: '/library/drizzle-orm_dark.svg'
light: "/library/drizzle-orm_light.svg",
dark: "/library/drizzle-orm_dark.svg",
},
url: 'https://orm.drizzle.team/'
url: "https://orm.drizzle.team/",
},
{
title: 'daily.dev',
category: ['Social', 'Community'],
title: "daily.dev",
category: ["Social", "Community"],
route: {
light: '/library/daily-dev-ligth.svg',
dark: '/library/daily-dev-dark.svg'
light: "/library/daily-dev-ligth.svg",
dark: "/library/daily-dev-dark.svg",
},
url: 'https://daily.dev/'
url: "https://daily.dev/",
},
{
title: 'Polars',
category: 'Library',
route: '/library/polars-logo.svg',
url: 'https://pola.rs/'
title: "Polars",
category: "Library",
route: "/library/polars-logo.svg",
url: "https://pola.rs/",
},
{
title: 'Zed',
category: 'Software',
title: "Zed",
category: "Software",
route: {
light: '/library/zed-logo.svg',
dark: '/library/zed-logo_dark.svg'
light: "/library/zed-logo.svg",
dark: "/library/zed-logo_dark.svg",
},
url: 'https://zed.dev/'
url: "https://zed.dev/",
},
{
title: 'Polar',
category: ['Software', 'Payment'],
title: "Polar",
category: ["Software", "Payment"],
route: {
light: '/library/polar-sh_light.svg',
dark: '/library/polar-sh_dark.svg'
light: "/library/polar-sh_light.svg",
dark: "/library/polar-sh_dark.svg",
},
url: 'https://polar.sh/'
url: "https://polar.sh/",
},
{
title: 'bolt',
category: 'Devtool',
title: "bolt",
category: "Devtool",
route: {
light: '/library/bolt-new.svg',
dark: '/library/bolt-new_dark.svg'
light: "/library/bolt-new.svg",
dark: "/library/bolt-new_dark.svg",
},
url: 'https://bolt.new/'
url: "https://bolt.new/",
},
{
title: 'JSON',
category: 'Language',
route: '/library/json.svg',
url: 'https://json.org/'
title: "JSON",
category: "Language",
route: "/library/json.svg",
url: "https://json.org/",
},
{
title: 'nuqs',
category: 'Library',
title: "nuqs",
category: "Library",
route: {
light: '/library/nuqs.svg',
dark: '/library/nuqs_dark.svg'
light: "/library/nuqs.svg",
dark: "/library/nuqs_dark.svg",
},
wordmark: {
light: '/library/nuqs-wordmark.svg',
dark: '/library/nuqs-wordmark_dark.svg'
light: "/library/nuqs-wordmark.svg",
dark: "/library/nuqs-wordmark_dark.svg",
},
url: 'https://nuqs.47ng.com/'
url: "https://nuqs.47ng.com/",
},
{
title: 'SoundCloud',
category: 'Music',
title: "SoundCloud",
category: "Music",
route: {
light: '/library/soundcloud-logo.svg',
dark: '/library/soundcloud-logo_dark.svg'
light: "/library/soundcloud-logo.svg",
dark: "/library/soundcloud-logo_dark.svg",
},
wordmark: {
light: '/library/soundcloud-wordmark.svg',
dark: 'library/soundcloud-wordmark_dark.svg'
light: "/library/soundcloud-wordmark.svg",
dark: "library/soundcloud-wordmark_dark.svg",
},
url: 'https://soundcloud.com/'
url: "https://soundcloud.com/",
},
{
title: 'Mermaid',
category: ['Library'],
title: "Mermaid",
category: ["Library"],
route: {
light: '/library/mermaid-logo-light.svg',
dark: '/library/mermaid-logo-dark.svg'
light: "/library/mermaid-logo-light.svg",
dark: "/library/mermaid-logo-dark.svg",
},
url: 'https://mermaid.js.org/'
url: "https://mermaid.js.org/",
},
{
title: 'Home Assistant',
category: ['IoT', 'Software'],
route: '/library/home-assistant.svg',
title: "Home Assistant",
category: ["IoT", "Software"],
route: "/library/home-assistant.svg",
wordmark: {
light: '/library/home-assistant-wordmark.svg',
dark: '/library/home-assistant-wordmark-dark.svg'
light: "/library/home-assistant-wordmark.svg",
dark: "/library/home-assistant-wordmark-dark.svg",
},
url: 'https://github.com/home-assistant/assets/tree/master/logo'
url: "https://github.com/home-assistant/assets/tree/master/logo",
},
{
title: 'UXAnaRangel',
category: ['Community'],
title: "UXAnaRangel",
category: ["Community"],
route: {
light: '/library/uxanarangel-light.svg',
dark: '/library/uxanarangel-dark.svg'
light: "/library/uxanarangel-light.svg",
dark: "/library/uxanarangel-dark.svg",
},
url: 'https://uxanarangel.com/'
url: "https://uxanarangel.com/",
},
{
title: 'UXCorpRangel',
category: ['Community'],
title: "UXCorpRangel",
category: ["Community"],
route: {
light: '/library/uxcorprangel-light.svg',
dark: '/library/uxcorprangel-dark.svg'
light: "/library/uxcorprangel-light.svg",
dark: "/library/uxcorprangel-dark.svg",
},
url: 'https://github.com/UXCorpRangel/'
url: "https://github.com/UXCorpRangel/",
},
{
title: 'PostHog',
category: 'Devtool',
route: '/library/posthog.svg',
title: "PostHog",
category: "Devtool",
route: "/library/posthog.svg",
wordmark: {
light: '/library/posthog-wordmark.svg',
dark: '/library/posthog-wordmark_dark.svg'
light: "/library/posthog-wordmark.svg",
dark: "/library/posthog-wordmark_dark.svg",
},
url: 'https://posthog.com/',
brandUrl: 'https://posthog.com/handbook/company/brand-assets'
url: "https://posthog.com/",
brandUrl: "https://posthog.com/handbook/company/brand-assets",
},
{
title: 'PowerToys',
category: 'Software',
route: '/library/powertoys.svg',
url: 'https://learn.microsoft.com/en-us/windows/powertoys/'
title: "PowerToys",
category: "Software",
route: "/library/powertoys.svg",
url: "https://learn.microsoft.com/en-us/windows/powertoys/",
},
{
title: 'PowerShell',
category: 'Language',
route: '/library/powershell.svg',
url: 'https://learn.microsoft.com/en-us/powershell/'
title: "PowerShell",
category: "Language",
route: "/library/powershell.svg",
url: "https://learn.microsoft.com/en-us/powershell/",
},
{
title: 'Lottielab',
category: 'Design',
route: '/library/lottielab.svg',
url: 'https://www.lottielab.com/'
title: "Lottielab",
category: "Design",
route: "/library/lottielab.svg",
url: "https://www.lottielab.com/",
},
{
title: 'TanStack',
category: ['Software', 'Library'],
route: '/library/tanstack.svg',
url: 'https://tanstack.com/'
title: "TanStack",
category: ["Software", "Library"],
route: "/library/tanstack.svg",
url: "https://tanstack.com/",
},
{
title: 'TypeGPU',
category: ['Software', 'Library'],
title: "TypeGPU",
category: ["Software", "Library"],
route: {
light: '/library/typegpu-light.svg',
dark: '/library/typegpu-dark.svg'
light: "/library/typegpu-light.svg",
dark: "/library/typegpu-dark.svg",
},
wordmark: {
light: '/library/typegpu-wordmark-light.svg',
dark: '/library/typegpu-wordmark-dark.svg'
light: "/library/typegpu-wordmark-light.svg",
dark: "/library/typegpu-wordmark-dark.svg",
},
url: 'https://typegpu.com'
url: "https://typegpu.com",
},
{
title: 'dotenv',
category: ['Config', 'Library', 'Devtool'],
route: '/library/dotenv.svg',
url: 'https://github.com/motdotla/dotenv'
title: "dotenv",
category: ["Config", "Library", "Devtool"],
route: "/library/dotenv.svg",
url: "https://github.com/motdotla/dotenv",
},
{
title: 'dotenvx',
category: ['Secrets', 'Config', 'Devtool'],
route: '/library/dotenvx.svg',
url: 'https://dotenvx.com'
title: "dotenvx",
category: ["Secrets", "Config", "Devtool"],
route: "/library/dotenvx.svg",
url: "https://dotenvx.com",
},
{
title: 'Motion',
category: 'Library',
title: "Motion",
category: "Library",
route: {
light: '/library/motion.svg',
dark: '/library/motion_dark.svg'
light: "/library/motion.svg",
dark: "/library/motion_dark.svg",
},
url: 'https://motion.dev/'
url: "https://motion.dev/",
},
{
title: 'Keycloak',
category: 'Authentication',
route: '/library/keycloak.svg',
url: 'https://keycloak.org'
title: "Keycloak",
category: "Authentication",
route: "/library/keycloak.svg",
url: "https://keycloak.org",
},
{
title: 'DeepSeek',
category: 'AI',
route: '/library/deepseek.svg',
wordmark: '/library/deepseek_wordmark.svg',
url: 'https://deepseek.com/'
title: "DeepSeek",
category: "AI",
route: "/library/deepseek.svg",
wordmark: "/library/deepseek_wordmark.svg",
url: "https://deepseek.com/",
},
{
title: 'Shiki',
category: 'Library',
route: '/library/shiki.svg',
url: 'https://shiki.style/'
title: "Shiki",
category: "Library",
route: "/library/shiki.svg",
url: "https://shiki.style/",
},
{
title: 'Dropbox',
category: ['Hosting', 'Software'],
route: '/library/dropbox.svg',
title: "Dropbox",
category: ["Hosting", "Software"],
route: "/library/dropbox.svg",
wordmark: {
light: '/library/dropbox_wordmark.svg',
dark: '/library/dropbox_wordmark_dark.svg'
light: "/library/dropbox_wordmark.svg",
dark: "/library/dropbox_wordmark_dark.svg",
},
url: 'https://www.dropbox.com/',
brandUrl: 'https://brand.dropbox.com/'
url: "https://www.dropbox.com/",
brandUrl: "https://brand.dropbox.com/",
},
{
title: 'Open WebUI',
category: ['AI', 'Software'],
route: '/library/openwebui.svg',
url: 'https://openwebui.com/'
title: "Open WebUI",
category: ["AI", "Software"],
route: "/library/openwebui.svg",
url: "https://openwebui.com/",
},
{
title: 'Base UI',
category: 'Library',
title: "Base UI",
category: "Library",
route: {
light: '/library/base-ui.svg',
dark: '/library/base-ui-dark.svg'
light: "/library/base-ui.svg",
dark: "/library/base-ui-dark.svg",
},
url: 'https://base-ui.com/'
url: "https://base-ui.com/",
},
{
title: 'Vercel',
category: ['Hosting', 'Vercel'],
title: "Vercel",
category: ["Hosting", "Vercel"],
route: {
light: '/library/vercel.svg',
dark: '/library/vercel_dark.svg'
light: "/library/vercel.svg",
dark: "/library/vercel_dark.svg",
},
wordmark: {
light: '/library/vercel_wordmark.svg',
dark: '/library/vercel_wordmark_dark.svg'
light: "/library/vercel_wordmark.svg",
dark: "/library/vercel_wordmark_dark.svg",
},
brandUrl: 'https://vercel.com/geist/brands',
url: 'https://vercel.com/'
brandUrl: "https://vercel.com/geist/brands",
url: "https://vercel.com/",
},
{
title: 'Model Context Protocol',
category: ['AI', 'Framework'],
title: "Model Context Protocol",
category: ["AI", "Framework"],
route: {
light: '/library/model-context-protocol-light.svg',
dark: '/library/model-context-protocol-dark.svg'
light: "/library/model-context-protocol-light.svg",
dark: "/library/model-context-protocol-dark.svg",
},
wordmark: {
light: '/library/model-context-protocol-wordmark-light.svg',
dark: '/library/model-context-protocol-wordmark-dark.svg'
light: "/library/model-context-protocol-wordmark-light.svg",
dark: "/library/model-context-protocol-wordmark-dark.svg",
},
url: 'https://modelcontextprotocol.io/'
url: "https://modelcontextprotocol.io/",
},
{
title: 'Socket.io',
category: 'Software',
title: "Socket.io",
category: "Software",
route: {
dark: '/library/socketio-dark.svg',
light: '/library/socketio-light.svg'
dark: "/library/socketio-dark.svg",
light: "/library/socketio-light.svg",
},
url: 'https://socket.io/'
url: "https://socket.io/",
},
{
title: 'Ant Design',
category: 'Library',
route: '/library/ant-design-dark-theme.svg',
url: 'https://ant.design/'
title: "Ant Design",
category: "Library",
route: "/library/ant-design-dark-theme.svg",
url: "https://ant.design/",
},
{
title: 'VSCodium',
category: 'Software',
route: '/library/vscodium.svg',
url: 'https://vscodium.com/'
title: "VSCodium",
category: "Software",
route: "/library/vscodium.svg",
url: "https://vscodium.com/",
},
{
title: 'Zen Browser',
category: 'Browser',
title: "Zen Browser",
category: "Browser",
route: {
light: '/library/zen-browser-light.svg',
dark: '/library/zen-browser-dark.svg'
light: "/library/zen-browser-light.svg",
dark: "/library/zen-browser-dark.svg",
},
wordmark: {
light: '/library/zen-browser-wordmark-light.svg',
dark: '/library/zen-browser-wordmark-dark.svg'
light: "/library/zen-browser-wordmark-light.svg",
dark: "/library/zen-browser-wordmark-dark.svg",
},
url: 'https://zen-browser.app/'
url: "https://zen-browser.app/",
},
{
title: 'Gemini',
category: ['Google', 'AI'],
route: '/library/gemini.svg',
wordmark: '/library/gemini_wordmark.svg',
url: 'https://gemini.google.com/'
title: "Gemini",
category: ["Google", "AI"],
route: "/library/gemini.svg",
wordmark: "/library/gemini_wordmark.svg",
url: "https://gemini.google.com/",
},
{
title: 'xAI (Grok)',
category: ['AI'],
title: "xAI (Grok)",
category: ["AI"],
route: {
light: '/library/xai_light.svg',
dark: '/library/xai_dark.svg'
light: "/library/xai_light.svg",
dark: "/library/xai_dark.svg",
},
url: 'https://grok.com/'
url: "https://grok.com/",
},
{
title: 'Qwen',
category: ['AI'],
title: "Qwen",
category: ["AI"],
route: {
light: '/library/qwen_light.svg',
dark: '/library/qwen_dark.svg'
light: "/library/qwen_light.svg",
dark: "/library/qwen_dark.svg",
},
url: 'https://chat.qwenlm.ai/'
url: "https://chat.qwenlm.ai/",
},
{
title: 'Inflection AI',
category: 'AI',
title: "Inflection AI",
category: "AI",
route: {
light: '/library/inflectionai_light.svg',
dark: '/library/inflectionai_dark.svg'
light: "/library/inflectionai_light.svg",
dark: "/library/inflectionai_dark.svg",
},
wordmark: {
light: '/library/inflectionai_wordmark_light.svg',
dark: '/library/inflectionai_wordmark_dark.svg'
light: "/library/inflectionai_wordmark_light.svg",
dark: "/library/inflectionai_wordmark_dark.svg",
},
url: 'https://inflection.ai/'
url: "https://inflection.ai/",
},
{
title: 'D3.js',
category: 'Library',
route: '/library/D3.svg',
url: 'https://d3js.org/'
title: "D3.js",
category: "Library",
route: "/library/D3.svg",
url: "https://d3js.org/",
},
{
title: 'Anthropic',
category: 'AI',
title: "Anthropic",
category: "AI",
route: {
light: '/library/anthropic_black.svg',
dark: '/library/anthropic_white.svg'
light: "/library/anthropic_black.svg",
dark: "/library/anthropic_white.svg",
},
wordmark: {
light: '/library/anthropic_black_wordmark.svg',
dark: '/library/anthropic_white_wordmark.svg'
light: "/library/anthropic_black_wordmark.svg",
dark: "/library/anthropic_white_wordmark.svg",
},
url: 'https://www.anthropic.com/'
url: "https://www.anthropic.com/",
},
{
title: 'Replit',
category: 'AI',
route: '/library/replit.svg',
title: "Replit",
category: "AI",
route: "/library/replit.svg",
wordmark: {
light: '/library/replit-wordmark-light.svg',
dark: '/library/replit-wordmark-dark.svg'
light: "/library/replit-wordmark-light.svg",
dark: "/library/replit-wordmark-dark.svg",
},
url: 'https://replit.com/',
brandUrl: 'https://replit.com/brandkit'
url: "https://replit.com/",
brandUrl: "https://replit.com/brandkit",
},
{
title: 'Magic UI',
category: 'Library',
route: '/library/magicui.svg',
url: 'https://magicui.design/'
title: "Magic UI",
category: "Library",
route: "/library/magicui.svg",
url: "https://magicui.design/",
},
{
title: 'Web Components',
category: 'Library',
route: '/library/webcomponents.svg',
url: 'https://www.webcomponents.org/'
title: "Web Components",
category: "Library",
route: "/library/webcomponents.svg",
url: "https://www.webcomponents.org/",
},
{
title: 'Designali',
category: ['Software', 'Design'],
route: '/library/designali.svg',
url: 'https://designali.in'
title: "Designali",
category: ["Software", "Design"],
route: "/library/designali.svg",
url: "https://designali.in",
},
{
title: 'CurseForge',
category: ['Marketplace', 'Community'],
title: "CurseForge",
category: ["Marketplace", "Community"],
route: {
light: '/library/curseforge.svg',
dark: '/library/curseforge-dark.svg'
light: "/library/curseforge.svg",
dark: "/library/curseforge-dark.svg",
},
wordmark: {
light: '/library/curseforge-wordmark.svg',
dark: '/library/curseforge-wordmark-dark.svg'
light: "/library/curseforge-wordmark.svg",
dark: "/library/curseforge-wordmark-dark.svg",
},
url: 'https://curseforge.com/',
url: "https://curseforge.com/",
brandUrl:
'https://www.figma.com/file/YYn36CxVpcT6aPKDXIH9JG/CurseForge-Brandbook?type=design&node-id=0-1&t=dvC0gPtyP36PQdsi-0'
"https://www.figma.com/file/YYn36CxVpcT6aPKDXIH9JG/CurseForge-Brandbook?type=design&node-id=0-1&t=dvC0gPtyP36PQdsi-0",
},
{
title: 'Cursor',
category: ['Software'],
title: "Cursor",
category: ["Software"],
route: {
light: '/library/cursor_light.svg',
dark: '/library/cursor_dark.svg'
light: "/library/cursor_light.svg",
dark: "/library/cursor_dark.svg",
},
wordmark: {
light: '/library/cursor_wordmark_light.svg',
dark: '/library/cursor_wordmark_dark.svg'
light: "/library/cursor_wordmark_light.svg",
dark: "/library/cursor_wordmark_dark.svg",
},
url: 'https://www.cursor.com'
url: "https://www.cursor.com",
},
{
title: 'Ghostty',
category: ['Software'],
route: '/library/ghostty.svg',
title: "Ghostty",
category: ["Software"],
route: "/library/ghostty.svg",
wordmark: {
dark: '/library/ghostty_wordmark_dark.svg',
light: '/library/ghostty_wordmark_light.svg'
dark: "/library/ghostty_wordmark_dark.svg",
light: "/library/ghostty_wordmark_light.svg",
},
url: 'https://ghostty.org/'
url: "https://ghostty.org/",
},
{
title: 'Better Auth',
category: ['Authentication', 'Library'],
title: "Better Auth",
category: ["Authentication", "Library"],
route: {
light: '/library/better-auth_light.svg',
dark: '/library/better-auth_dark.svg'
light: "/library/better-auth_light.svg",
dark: "/library/better-auth_dark.svg",
},
wordmark: {
dark: '/library/better-auth_wordmark_dark.svg',
light: '/library/better-auth_wordmark_light.svg'
dark: "/library/better-auth_wordmark_dark.svg",
light: "/library/better-auth_wordmark_light.svg",
},
url: 'https://www.better-auth.com/'
url: "https://www.better-auth.com/",
},
{
title: 'Buy Me a Coffee',
category: ['Software'],
route: '/library/bmc.svg',
brandUrl: 'https://buymeacoffee.com/brand',
url: 'https://buymeacoffee.com/'
title: "Buy Me a Coffee",
category: ["Software"],
route: "/library/bmc.svg",
brandUrl: "https://buymeacoffee.com/brand",
url: "https://buymeacoffee.com/",
},
{
title: 'GitHub',
category: 'Software',
title: "GitHub",
category: "Software",
route: {
light: '/library/github_light.svg',
dark: '/library/github_dark.svg'
light: "/library/github_light.svg",
dark: "/library/github_dark.svg",
},
wordmark: {
light: '/library/github_wordmark_light.svg',
dark: '/library/github_wordmark_dark.svg'
light: "/library/github_wordmark_light.svg",
dark: "/library/github_wordmark_dark.svg",
},
url: 'https://github.com/',
brandUrl: 'https://brand.github.com/'
url: "https://github.com/",
brandUrl: "https://brand.github.com/",
},
{
title: 'Firebase Studio',
category: ['AI', 'Google'],
route: '/library/firebase-studio.svg',
url: 'https://firebase.studio/'
title: "Firebase Studio",
category: ["AI", "Google"],
route: "/library/firebase-studio.svg",
url: "https://firebase.studio/",
},
{
title: 'HeroUI',
category: 'Library',
title: "HeroUI",
category: "Library",
route: {
light: '/library/heroui_black.svg',
dark: '/library/heroui_light.svg'
light: "/library/heroui_black.svg",
dark: "/library/heroui_light.svg",
},
url: 'https://www.heroui.com/'
url: "https://www.heroui.com/",
},
{
title: 'Convex',
category: ['Database', 'Software'],
route: '/library/convex.svg',
title: "Convex",
category: ["Database", "Software"],
route: "/library/convex.svg",
wordmark: {
light: '/library/convex_wordmark_light.svg',
dark: '/library/convex_wordmark_dark.svg'
light: "/library/convex_wordmark_light.svg",
dark: "/library/convex_wordmark_dark.svg",
},
url: 'https://www.convex.dev/'
url: "https://www.convex.dev/",
},
{
title: 'Clerk',
category: ['Software', 'Authentication'],
title: "Clerk",
category: ["Software", "Authentication"],
route: {
light: '/library/clerk-light.svg',
dark: '/library/clerk-dark.svg'
light: "/library/clerk-light.svg",
dark: "/library/clerk-dark.svg",
},
wordmark: {
light: '/library/clerk-wordmark-light.svg',
dark: '/library/clerk-wordmark-dark.svg'
light: "/library/clerk-wordmark-light.svg",
dark: "/library/clerk-wordmark-dark.svg",
},
url: 'https://clerk.com/',
brandUrl: 'https://clerk.com/design'
url: "https://clerk.com/",
brandUrl: "https://clerk.com/design",
},
{
title: 'Terraform',
category: ['Software', 'Language', 'IaC'],
route: '/library/terraform.svg',
url: 'https://terraform.io',
brandUrl: 'https://brand.hashicorp.com'
title: "Terraform",
category: ["Software", "Language", "IaC"],
route: "/library/terraform.svg",
url: "https://terraform.io",
brandUrl: "https://brand.hashicorp.com",
},
{
title: 'Rspack',
category: 'Compiler',
route: '/library/rspack.svg',
url: 'https://rspack.rs/'
title: "Rspack",
category: "Compiler",
route: "/library/rspack.svg",
url: "https://rspack.rs/",
},
{
title: 'Rsbuild',
category: ['Devtool', 'Compiler'],
route: '/library/rsbuild.svg',
url: 'https://rsbuild.rs'
title: "Rsbuild",
category: ["Devtool", "Compiler"],
route: "/library/rsbuild.svg",
url: "https://rsbuild.rs",
},
{
title: 'React Wheel Picker',
category: 'Library',
title: "React Wheel Picker",
category: "Library",
route: {
light: '/library/react-wheel-picker_light.svg',
dark: '/library/react-wheel-picker_dark.svg'
light: "/library/react-wheel-picker_light.svg",
dark: "/library/react-wheel-picker_dark.svg",
},
url: 'https://react-wheel-picker.chanhdai.com'
url: "https://react-wheel-picker.chanhdai.com",
},
{
title: 'cPanel',
category: 'Software',
route: '/library/cP_orange.svg',
wordmark: '/library/cPanel_orange_wordmark.svg',
url: 'https://cpanel.net/',
brandUrl: 'https://cpanel.net/company/cpanel-brand-guide/'
title: "cPanel",
category: "Software",
route: "/library/cP_orange.svg",
wordmark: "/library/cPanel_orange_wordmark.svg",
url: "https://cpanel.net/",
brandUrl: "https://cpanel.net/company/cpanel-brand-guide/",
},
{
title: 'Lovable',
category: 'AI',
route: '/library/lovable.svg',
url: 'https://lovable.dev/',
brandUrl: 'https://lovable.dev/brand'
title: "Lovable",
category: "AI",
route: "/library/lovable.svg",
url: "https://lovable.dev/",
brandUrl: "https://lovable.dev/brand",
},
{
title: 'Mocha',
category: 'AI',
title: "Mocha",
category: "AI",
route: {
light: '/library/mocha-light.svg',
dark: '/library/mocha-dark.svg'
light: "/library/mocha-light.svg",
dark: "/library/mocha-dark.svg",
},
wordmark: {
light: '/library/mocha-light_wordmark.svg',
dark: '/library/mocha-dark_wordmark.svg'
light: "/library/mocha-light_wordmark.svg",
dark: "/library/mocha-dark_wordmark.svg",
},
url: 'https://getmocha.com/'
url: "https://getmocha.com/",
},
{
title: 'OpenRouter',
category: 'AI',
title: "OpenRouter",
category: "AI",
route: {
light: '/library/openrouter_light.svg',
dark: '/library/openrouter_dark.svg'
light: "/library/openrouter_light.svg",
dark: "/library/openrouter_dark.svg",
},
url: 'https://openrouter.ai/'
url: "https://openrouter.ai/",
},
{
title: 'OpenHunts',
category: ['Platform', 'Community'],
route: '/library/openhunts.svg',
url: 'https://openhunts.com'
title: "OpenHunts",
category: ["Platform", "Community"],
route: "/library/openhunts.svg",
url: "https://openhunts.com",
},
{
title: 'Kokonut UI',
category: 'Library',
title: "Kokonut UI",
category: "Library",
route: {
light: '/library/kokonutui-light.svg',
dark: '/library/kokonutui-dark.svg'
light: "/library/kokonutui-light.svg",
dark: "/library/kokonutui-dark.svg",
},
url: 'https://kokonutui.com/'
url: "https://kokonutui.com/",
},
{
title: 'Google Cloud',
category: ['Google', 'Hosting'],
route: '/library/google-cloud.svg',
url: 'https://cloud.google.com/'
title: "Google Cloud",
category: ["Google", "Hosting"],
route: "/library/google-cloud.svg",
url: "https://cloud.google.com/",
},
{
title: 'Effect TS',
category: 'Library',
title: "Effect TS",
category: "Library",
route: {
light: '/library/effect_light.svg',
dark: '/library/effect_dark.svg'
light: "/library/effect_light.svg",
dark: "/library/effect_dark.svg",
},
url: 'https://effect.website/',
url: "https://effect.website/",
brandUrl:
'https://sparkling-lancer-5bd.notion.site/Effect-logo-guidelines-14280adbc6354eaa8bd173e1bc0128a4'
"https://sparkling-lancer-5bd.notion.site/Effect-logo-guidelines-14280adbc6354eaa8bd173e1bc0128a4",
},
{
title: 'Ark UI',
category: 'Library',
route: '/library/ark-ui.svg',
url: 'https://ark-ui.com/'
title: "Ark UI",
category: "Library",
route: "/library/ark-ui.svg",
url: "https://ark-ui.com/",
},
{
title: 'Mantine',
category: 'Library',
route: '/library/mantine.svg',
url: 'https://mantine.dev'
title: "Mantine",
category: "Library",
route: "/library/mantine.svg",
url: "https://mantine.dev",
},
{
title: 'ESLint',
category: 'Library',
route: '/library/eslint.svg',
url: 'https://eslint.org/'
title: "ESLint",
category: "Library",
route: "/library/eslint.svg",
url: "https://eslint.org/",
},
{
title: 'PlainSignal',
category: 'Analytics',
route: '/library/plainsignal.svg',
url: 'https://plainsignal.com/'
title: "PlainSignal",
category: "Analytics",
route: "/library/plainsignal.svg",
url: "https://plainsignal.com/",
},
{
title: 'Heptabase',
category: 'Software',
route: '/library/heptabase.svg',
url: 'https://heptabase.com/'
}
title: "Heptabase",
category: "Software",
route: "/library/heptabase.svg",
url: "https://heptabase.com/",
},
];
+20 -11
View File
@@ -148,17 +148,26 @@ https://api.svgl.app/svg/adobe.svg
```html
// Returns:
<svg width="91" height="80" viewBox="0 0 91 80" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_906_1839)">
<path d="M56.9686 0H90.4318V80L56.9686 0Z" fill="#EB1000"/>
<path d="M33.4632 0H0V80L33.4632 0Z" fill="#EB1000"/>
<path d="M45.1821 29.4668L66.5199 80.0002H52.5657L46.1982 63.9461H30.6182L45.1821 29.4668Z" fill="#EB1000"/>
</g>
<defs>
<clipPath id="clip0_906_1839">
<rect width="90.4318" height="80" fill="white"/>
</clipPath>
</defs>
<svg
width="91"
height="80"
viewBox="0 0 91 80"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clip-path="url(#clip0_906_1839)">
<path d="M56.9686 0H90.4318V80L56.9686 0Z" fill="#EB1000" />
<path d="M33.4632 0H0V80L33.4632 0Z" fill="#EB1000" />
<path
d="M45.1821 29.4668L66.5199 80.0002H52.5657L46.1982 63.9461H30.6182L45.1821 29.4668Z"
fill="#EB1000"
/>
</g>
<defs>
<clipPath id="clip0_906_1839">
<rect width="90.4318" height="80" fill="white" />
</clipPath>
</defs>
</svg>
```
+18 -15
View File
@@ -1,37 +1,40 @@
declare const SITE_URL: string
declare const SITE_URL: string;
figma.showUI(`<script>window.location.href = '${SITE_URL}'</script>`, {
width: 400,
height: 700,
})
});
figma.ui.onmessage = async (message, props) => {
if (!SITE_URL.includes(props.origin)) {
return
return;
}
switch (message.type) {
case 'EVAL': {
const fn = eval.call(null, message.code)
case "EVAL": {
const fn = eval.call(null, message.code);
try {
const result = await fn(figma, message.params)
const result = await fn(figma, message.params);
figma.ui.postMessage({
type: 'EVAL_RESULT',
type: "EVAL_RESULT",
result,
id: message.id,
})
});
} catch (e) {
figma.ui.postMessage({
type: 'EVAL_REJECT',
error: typeof e === 'string' ? e : e && typeof e === 'object' && 'message' in e ? e.message : null,
type: "EVAL_REJECT",
error:
typeof e === "string"
? e
: e && typeof e === "object" && "message" in e
? e.message
: null,
id: message.id,
})
});
}
break
break;
}
}
}
};
+3 -3
View File
@@ -7,12 +7,12 @@ export function copyToClipboard(value: string) {
// @ts-ignore
window.copy(value);
} else {
const area = document.createElement('textarea');
const area = document.createElement("textarea");
document.body.appendChild(area);
area.value = value;
// area.focus();
area.select();
const result = document.execCommand('copy');
const result = document.execCommand("copy");
document.body.removeChild(area);
if (!result) {
throw new Error();
@@ -23,4 +23,4 @@ export function copyToClipboard(value: string) {
return false;
}
return true;
}
}
+37 -23
View File
@@ -23,7 +23,7 @@
* ```
*/
class FigmaAPI {
private id = 0
private id = 0;
/**
* Run a function in the Figma plugin context. The function cannot reference
@@ -31,50 +31,64 @@ class FigmaAPI {
* serializable. If you need to pass in variables, you can do so by passing
* them as the second parameter.
*/
run<T, U>(fn: (figma: PluginAPI, params: U) => Promise<T> | T, params?: U): Promise<T> {
run<T, U>(
fn: (figma: PluginAPI, params: U) => Promise<T> | T,
params?: U,
): Promise<T> {
return new Promise((resolve, reject) => {
const id = this.id++
const id = this.id++;
const cb = (event: MessageEvent) => {
if (event.origin !== 'https://www.figma.com' && event.origin !== 'https://staging.figma.com') {
return
if (
event.origin !== "https://www.figma.com" &&
event.origin !== "https://staging.figma.com"
) {
return;
}
if (event.data.pluginMessage?.type === 'EVAL_RESULT') {
if (event.data.pluginMessage?.type === "EVAL_RESULT") {
if (event.data.pluginMessage.id === id) {
window.removeEventListener('message', cb)
resolve(event.data.pluginMessage.result)
window.removeEventListener("message", cb);
resolve(event.data.pluginMessage.result);
}
}
if (event.data.pluginMessage?.type === 'EVAL_REJECT') {
if (event.data.pluginMessage?.type === "EVAL_REJECT") {
if (event.data.pluginMessage.id === id) {
window.removeEventListener('message', cb)
const message = event.data.pluginMessage.error
reject(new Error(typeof message === 'string' ? message : 'An error occurred in FigmaAPI.run()'))
window.removeEventListener("message", cb);
const message = event.data.pluginMessage.error;
reject(
new Error(
typeof message === "string"
? message
: "An error occurred in FigmaAPI.run()",
),
);
}
}
}
window.addEventListener('message', cb)
};
window.addEventListener("message", cb);
const msg = {
pluginMessage: {
type: 'EVAL',
type: "EVAL",
code: fn.toString(),
id,
params,
},
pluginId: '*',
}
pluginId: "*",
};
;['https://www.figma.com', 'https://staging.figma.com'].forEach((origin) => {
["https://www.figma.com", "https://staging.figma.com"].forEach(
(origin) => {
try {
parent.postMessage(msg, origin)
parent.postMessage(msg, origin);
} catch (e) {
console.error(e)
console.error(e);
}
})
})
},
);
});
}
}
export const figmaAPI = new FigmaAPI()
export const figmaAPI = new FigmaAPI();
+10 -10
View File
@@ -1,22 +1,22 @@
import { figmaAPI } from './figma-api'
import { figmaAPI } from "./figma-api";
export async function insertSVG(svgString: string) {
if (!svgString) return
if (!svgString) return;
figmaAPI.run(
async (figma, { svgString }: { svgString: string }) => {
const node = figma.createNodeFromSvg(svgString)
const selectedNode = figma.currentPage.selection[0]
const node = figma.createNodeFromSvg(svgString);
const selectedNode = figma.currentPage.selection[0];
if (selectedNode) {
node.x = selectedNode.x + selectedNode.width + 20
node.y = selectedNode.y
node.x = selectedNode.x + selectedNode.width + 20;
node.y = selectedNode.y;
}
figma.currentPage.appendChild(node)
figma.currentPage.selection = [node]
figma.viewport.scrollAndZoomIntoView([node])
figma.currentPage.appendChild(node);
figma.currentPage.selection = [node];
figma.viewport.scrollAndZoomIntoView([node]);
},
{ svgString },
)
);
}
-14
View File
@@ -1,14 +0,0 @@
import { describe, it, expect } from 'vitest';
import { svgs } from './data/svgs';
describe('Get svgs by category', () => {
it('should have a category named "Social"', () => {
expect(svgs.find((svg) => svg.category === 'Social')).toBeDefined();
});
});
describe('Get a specific svg', () => {
it('should have a svg named "Discord"', () => {
expect(svgs.find((svg) => svg.title === 'Discord')).toBeDefined();
});
});
-5
View File
@@ -1,5 +0,0 @@
<script lang="ts">
import { redirect } from '@sveltejs/kit';
redirect(301, '/');
</script>
+8 -103
View File
@@ -1,107 +1,12 @@
<script lang="ts">
import { page } from '$app/stores';
import "../app.css";
import favicon from "$lib/assets/favicon.svg";
// Global styles:
import '@/styles/app.css';
import { cn } from '@/utils/cn';
import { ModeWatcher, mode } from 'mode-watcher';
// Categories:
import type { tCategory } from '@/types/categories';
import { svgs } from '@/data/svgs';
import { getCategories } from '@/data';
// Toaster:
import { Toaster } from 'svelte-sonner';
// Components for all pages:
import Transition from '@/components/transition.svelte';
import Warning from '@/components/warning.svelte';
// Layout:
import Navbar from '@/components/navbar.svelte';
import { sidebarCategoryCountStyles } from '@/ui/styles';
import { sidebarItemStyles } from '@/ui/styles';
// Get category counts:
const categories: tCategory[] = getCategories();
let categoryCounts: Record<string, number> = {};
categories.forEach((category) => {
categoryCounts[category] = svgs.filter((svg) => svg.category.includes(category)).length;
});
// Get main pathname:
$: pathname = $page.url.pathname;
let { children } = $props();
</script>
<ModeWatcher />
<Navbar currentPath={pathname} />
<main>
<aside
class={cn(
'z-50 w-full overflow-y-auto overflow-x-hidden',
'dark:border-neutral-800 md:fixed md:left-0 md:h-[calc(100vh-63px)] md:w-56 md:pb-0',
'bg-white dark:bg-neutral-900',
'opacity-95 backdrop-blur-md',
'border-b border-neutral-200 dark:border-neutral-800 md:border-r'
)}
>
<div class="md:px-3 md:py-6">
<nav
class="flex items-center space-x-1 overflow-y-auto px-6 pb-2 pt-2 md:mb-3 md:flex-col md:space-x-0 md:space-y-1 md:overflow-y-visible md:px-0 md:pt-0"
>
<a
href="/"
class={cn(
sidebarItemStyles,
pathname === '/'
? 'bg-neutral-200 font-medium text-dark dark:bg-neutral-700/30 dark:text-white'
: ''
)}
data-sveltekit-preload-data>All</a
>
<!-- Order alfabetically: -->
{#each categories.sort() as category}
<a
href={`/directory/${category.toLowerCase()}`}
data-sveltekit-preload-data
class={cn(
sidebarItemStyles,
pathname === `/directory/${category.toLowerCase()}`
? 'bg-neutral-200 font-medium text-dark dark:bg-neutral-700/30 dark:text-white'
: ''
)}
>
<span>{category}</span>
<span
class={cn(
sidebarCategoryCountStyles,
pathname === `/directory/${category.toLowerCase()}`
? 'border-neutral-300 dark:border-neutral-700'
: '',
'hidden font-mono text-xs md:inline'
)}>{categoryCounts[category]}</span
>
</a>
{/each}
</nav>
</div>
</aside>
<div class="ml-0 pb-6 md:ml-56">
<Warning />
<Transition {pathname}>
<slot />
</Transition>
<Toaster
position="bottom-right"
theme={$mode}
class="toaster group"
toastOptions={{
classes: {
toast: 'group toast dark:group-[.toaster]:bg-neutral-900 group-[.toaster]:font-sans',
description: 'group-[.toast]:text-xs font-mono'
}
}}
/>
</div>
</main>
<svelte:head>
<link rel="icon" href={favicon} />
</svelte:head>
{@render children?.()}
+5 -171
View File
@@ -1,171 +1,5 @@
<script lang="ts">
import type { iSVG } from '@/types/svg';
import { cn } from '@/utils/cn';
import { onMount } from 'svelte';
import { queryParam } from 'sveltekit-search-params';
import Fuse from 'fuse.js';
// Get all svgs:
import { svgsData } from '@/data';
const allSvgs = JSON.parse(JSON.stringify(svgsData));
// Cache sorted arrays
const latestSorted = [...allSvgs].sort((a, b) => b.id! - a.id!);
const alphabeticallySorted = [...allSvgs].sort((a, b) => a.title.localeCompare(b.title));
// Fuzzy search setup:
const fuse = new Fuse<iSVG>(allSvgs, {
keys: ['title'],
threshold: 0.35,
ignoreLocation: true,
isCaseSensitive: false,
shouldSort: true
});
// Components:
import Search from '@/components/search.svelte';
import Container from '@/components/container.svelte';
import SvgCard from '@/components/svgCard.svelte';
import Grid from '@/components/grid.svelte';
import NotFound from '@/components/notFound.svelte';
// URL params
const searchParam = queryParam('search');
// Icons:
import { ArrowDown, ArrowDownUpIcon, ArrowUpDownIcon, TrashIcon } from 'lucide-svelte';
import { buttonStyles } from '@/ui/styles';
let sorted: boolean = false;
let showAll: boolean = false;
// Search:
let searchTerm = '';
let filteredSvgs: iSVG[] = [];
let displaySvgs: iSVG[] = [];
let maxDisplay = 24;
const updateDisplaySvgs = () => {
displaySvgs = showAll ? filteredSvgs : filteredSvgs.slice(0, maxDisplay);
};
// Hybrid search strategy:
// - Simple string matching for queries < 3 chars
// - Fuzzy search for longer queries (handle typos and partial matches)
const searchSvgs = () => {
$searchParam = searchTerm || null;
if (!searchTerm) {
filteredSvgs = sorted ? alphabeticallySorted : latestSorted;
updateDisplaySvgs();
return;
}
if (searchTerm.length < 3) {
filteredSvgs = allSvgs.filter((svg: iSVG) =>
svg.title.toLowerCase().includes(searchTerm.toLowerCase())
);
} else {
filteredSvgs = fuse.search(searchTerm).map((result) => result.item);
}
updateDisplaySvgs();
};
// Clear search:
const clearSearch = () => {
searchTerm = '';
// Use current sort state to determine order
filteredSvgs = sorted ? alphabeticallySorted : latestSorted;
updateDisplaySvgs();
};
// Sort:
const sort = () => {
sorted = !sorted;
filteredSvgs = sorted ? alphabeticallySorted : latestSorted;
updateDisplaySvgs();
};
onMount(() => {
if ($searchParam) {
searchTerm = $searchParam;
}
searchSvgs();
});
$: {
if (showAll || filteredSvgs) {
updateDisplaySvgs();
}
}
</script>
<svelte:head>
<title>A beautiful library with SVG logos - Svgl</title>
</svelte:head>
<Search
bind:searchTerm
on:input={searchSvgs}
clearSearch={() => clearSearch()}
placeholder={`Search ${allSvgs.length} logos...`}
/>
<Container>
<div class={cn('mb-4 flex items-center justify-end', searchTerm.length > 0 && 'justify-between')}>
{#if searchTerm.length > 0}
<button
class={cn(
'flex items-center justify-center space-x-1 rounded-md py-1.5 text-sm font-medium opacity-80 transition-opacity hover:opacity-100',
filteredSvgs.length === 0 && 'hidden'
)}
on:click={() => clearSearch()}
>
<TrashIcon size={16} strokeWidth={2} class="mr-1" />
<span>Clear results</span>
</button>
{/if}
<button
class={cn(
'flex items-center justify-center space-x-1 rounded-md py-1.5 text-sm font-medium opacity-80 transition-opacity hover:opacity-100',
filteredSvgs.length === 0 && 'hidden'
)}
on:click={() => sort()}
>
{#if sorted}
<ArrowDownUpIcon size={16} strokeWidth={2} class="mr-1" />
{:else}
<ArrowUpDownIcon size={16} strokeWidth={2} class="mr-1" />
{/if}
<span>{sorted ? 'Sort by latest' : 'Sort A-Z'}</span>
</button>
</div>
<Grid>
{#each displaySvgs as svg}
<SvgCard svgInfo={svg} {searchTerm} />
{/each}
</Grid>
{#if filteredSvgs.length > maxDisplay && !showAll}
<div class="mt-4 flex items-center justify-center">
<button
class={buttonStyles}
on:click={() => {
showAll = true;
updateDisplaySvgs();
}}
>
<div class="relative flex items-center space-x-2">
<ArrowDown size={16} strokeWidth={2} />
<span>Load All SVGs</span>
<span class="opacity-70">
({filteredSvgs.length - maxDisplay} more)
</span>
</div>
</button>
</div>
{/if}
{#if filteredSvgs.length === 0}
<NotFound notFoundTerm={searchTerm} />
{/if}
</Container>
<h1>Welcome to SvelteKit</h1>
<p>
Visit <a href="https://svelte.dev/docs/kit">svelte.dev/docs/kit</a> to read the
documentation
</p>
-50
View File
@@ -1,50 +0,0 @@
<script>
import { cn } from '@/utils/cn';
export let data;
</script>
<svelte:head>
<title>{data.meta.title} - SVGL</title>
<meta property="og:type" content="article" />
<meta property="og:title" content={data.meta.title} />
<meta property="og:description" content={data.meta.description} />
</svelte:head>
<section
class="bg-white bg-[url('/images/hero-pattern_light.svg')] dark:bg-neutral-900 dark:bg-[url('/images/hero-pattern_dark.svg')]"
>
<div class="relative z-10 mx-auto max-w-screen-xl px-4 py-8 text-center lg:py-20">
<div class="flex items-center justify-center space-x-4 text-center">
<h1
class="mb-4 text-4xl font-bold leading-none tracking-tight text-neutral-900 dark:text-white md:text-5xl lg:text-6xl"
>
API Reference
</h1>
<span class="relative inline-block overflow-hidden rounded-full p-[1px] shadow-sm">
<span
class="absolute inset-[-1000%] animate-[spin_4s_linear_infinite] bg-[conic-gradient(from_90deg_at_50%_50%,#f4f4f5_0%,#f4f4f5_50%,#737373_100%)] dark:bg-[conic-gradient(from_90deg_at_50%_50%,#121212_0%,#121212_50%,#737373_100%)]"
/>
<div
class="inline-flex h-full w-full cursor-default items-center justify-center rounded-full border border-neutral-100 bg-neutral-100 px-3 py-1 font-mono text-xs font-medium backdrop-blur-3xl dark:border-neutral-800 dark:bg-neutral-900 dark:text-white"
>
v1
</div>
</span>
</div>
<p class="text-lg font-normal text-gray-500 dark:text-gray-200 sm:px-16 lg:px-48 lg:text-xl">
The API reference is a detailed documentation of all the endpoints available in the API.
</p>
</div>
</section>
<article
class={cn(
'prose dark:prose-invert',
'mx-auto max-w-3xl px-4 py-10',
'prose-h2:font-medium prose-h2:tracking-tight prose-h2:underline prose-h2:decoration-neutral-300 prose-h2:underline-offset-[6px] prose-h2:transition-opacity hover:prose-h2:opacity-70 dark:prose-h2:decoration-neutral-700/65',
'prose-pre:m-0 prose-pre:border prose-pre:border-neutral-200 dark:prose-pre:border dark:prose-pre:border-neutral-800/65',
'prose-inline-code:rounded prose-inline-code:border prose-inline-code:border-neutral-300 prose-inline-code:bg-neutral-200/50 prose-inline-code:p-[2px] prose-inline-code:font-mono prose-inline-code:dark:border-neutral-800 prose-inline-code:dark:bg-neutral-800/50'
)}
>
<svelte:component this={data.content} />
</article>
-14
View File
@@ -1,14 +0,0 @@
import { error } from '@sveltejs/kit';
export async function load() {
try {
const documentTitle = 'api';
const post = await import(`../../docs/${documentTitle}.md`);
return {
content: post.default,
meta: post.metadata
};
} catch (e) {
throw error(404, `Could not find this page`);
}
}
-37
View File
@@ -1,37 +0,0 @@
import type { RequestEvent } from '../$types';
import { transform } from '@svgr/core';
import { json, redirect } from '@sveltejs/kit';
import { ratelimit } from '@/server/redis';
// SVGR Plugins:
import svgrJSX from '@svgr/plugin-jsx';
export const GET = async () => {
return redirect(301, 'https://svgl.app/api');
};
export const POST = async ({ request }: RequestEvent) => {
try {
const body = await request.json();
const svgCode = body.code;
const typescript = body.typescript;
const name = body.name.replace(/[^a-zA-Z0-9]/g, '');
const jsCode = await transform(
svgCode,
{
plugins: [svgrJSX],
icon: true,
typescript: typescript
},
{ componentName: name }
);
return json({ data: jsCode }, { status: 200 });
} catch (error) {
return json({ error: `⚠️ api/svgs/svgr - Error: ${error}` }, { status: 500 });
}
};
@@ -1,16 +0,0 @@
<script>
import Container from '@/components/container.svelte';
import { ArrowLeft } from 'lucide-svelte';
</script>
<Container>
<a href="/">
<div
class="flex items-center space-x-2 duration-100 hover:text-neutral-500 dark:text-neutral-400 dark:hover:text-white group md:mt-2"
>
<ArrowLeft size={20} class="group-hover:-translate-x-[2px] group-hover:duration-200" />
<span>View all</span>
</div>
</a>
</Container>
<slot />
-67
View File
@@ -1,67 +0,0 @@
<script lang="ts">
import type { PageData } from './$types';
import type { iSVG } from '@/types/svg';
import { queryParam } from 'sveltekit-search-params';
export let data: PageData;
let svgsByCategory = data.svgs || [];
let category = data.category || '';
// Components:
import Container from '@/components/container.svelte';
import Grid from '@/components/grid.svelte';
import Search from '@/components/search.svelte';
import SvgCard from '@/components/svgCard.svelte';
import NotFound from '@/components/notFound.svelte';
// URL params
const searchParam = queryParam('search');
// Search:
let searchTerm = $searchParam || '';
let filteredSvgs: iSVG[] = [];
if (searchTerm.length === 0) {
filteredSvgs = svgsByCategory.sort((a: iSVG, b: iSVG) => {
return a.title.localeCompare(b.title);
});
}
const searchSvgs = () => {
$searchParam = searchTerm || null;
return (filteredSvgs = svgsByCategory.filter((svg: iSVG) => {
let svgTitle = svg.title.toLowerCase();
return svgTitle.includes(searchTerm.toLowerCase());
}));
};
const clearSearch = () => {
searchTerm = '';
searchSvgs();
};
if ($searchParam) {
searchSvgs();
}
</script>
<svelte:head>
<title>{category} logos - Svgl</title>
</svelte:head>
<Container>
<Search
bind:searchTerm
on:input={searchSvgs}
clearSearch={() => clearSearch()}
placeholder={`Search ${filteredSvgs.length} ${category} logos...`}
/>
<Grid>
{#each filteredSvgs as svg}
<SvgCard svgInfo={svg} {searchTerm} />
{/each}
</Grid>
{#if filteredSvgs.length === 0}
<NotFound notFoundTerm={searchTerm} />
{/if}
</Container>
-32
View File
@@ -1,32 +0,0 @@
import type { PageLoad, EntryGenerator } from './$types';
import type { iSVG } from '@/types/svg';
import { error } from '@sveltejs/kit';
import { svgs } from '@/data/svgs';
import { getCategoriesForDirectory } from '@/data';
export const entries: EntryGenerator = () => {
const categories = getCategoriesForDirectory();
return categories;
};
export const load = (async ({ params }) => {
const { slug } = params;
const svgsByCategory = svgs.filter((svg: iSVG) => {
if (Array.isArray(svg.category)) {
return svg.category.some((categoryItem) => categoryItem.toLowerCase() === slug.toLowerCase());
} else {
return svg.category.toLowerCase() === slug.toLowerCase();
}
});
if (svgsByCategory.length === 0) {
throw error(404, 'Category not found');
}
return {
category: slug,
svgs: svgsByCategory
};
}) satisfies PageLoad;
-16
View File
@@ -1,16 +0,0 @@
import { Redis } from '@upstash/redis';
import { Ratelimit } from '@upstash/ratelimit';
import { UPSTASH_REDIS_TOKEN, UPSTASH_REDIS_URL, SVGL_API_REQUESTS } from '$env/static/private';
const cleanUrl = UPSTASH_REDIS_URL.replace(/^['"]|['"]$/g, '').trim();
const redis = new Redis({
url: cleanUrl,
token: UPSTASH_REDIS_TOKEN
});
export const ratelimit = new Ratelimit({
redis: redis,
limiter: Ratelimit.slidingWindow(Number(SVGL_API_REQUESTS), '60s'),
analytics: true
});
-83
View File
@@ -1,83 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
--sb-track-color: rgb(229 229 229 / 0.5);
--sb-thumb-color: #d4d4d4;
--sb-size: 10px;
}
.dark {
--sb-track-color: #171717;
--sb-thumb-color: #404040;
--sb-size: 10px;
}
}
@layer base {
body,
nav {
scrollbar-color: var(--sb-thumb-color) transparent;
}
body::-webkit-scrollbar {
width: var(--sb-size);
}
body::-webkit-scrollbar-track {
background: var(--sb-track-color);
}
body::-webkit-scrollbar-thumb {
background: var(--sb-thumb-color);
}
aside::-webkit-scrollbar {
width: var(--sb-size);
}
aside::-webkit-scrollbar-track {
background: var(--sb-track-color);
}
aside::-webkit-scrollbar-thumb {
background: var(--sb-thumb-color);
}
nav::-webkit-scrollbar {
width: var(--sb-size);
}
nav::-webkit-scrollbar-track {
background: var(--sb-track-color);
}
nav::-webkit-scrollbar-thumb {
background: var(--sb-thumb-color);
}
}
@font-face {
font-family: 'InterVariable';
src: url('/fonts/InterVariable.woff2') format('woff2');
font-weight: 100 900;
font-display: swap;
font-style: normal;
}
@font-face {
font-family: 'GeistMono';
src: url('/fonts/GeistMonoVariableVF.woff2') format('woff2');
font-display: swap;
}
html.dark .shiki,
html.dark .shiki span {
color: var(--shiki-dark) !important;
background-color: transparent !important;
font-style: var(--shiki-dark-font-style) !important;
font-weight: var(--shiki-dark-font-weight) !important;
text-decoration: var(--shiki-dark-text-decoration) !important;
}
+1
View File
@@ -0,0 +1 @@
@import "tailwindcss";
+1 -1
View File
@@ -6,7 +6,7 @@ interface AngularComponentParams {
export function getAngularCode(params: AngularComponentParams): string {
const updatedSvgContent = params.svgContent.replace(
/<svg([^>]*)>/,
`<svg$1 [attr.width]="size.width" [attr.height]="size.height">`
`<svg$1 [attr.width]="size.width" [attr.height]="size.height">`,
);
return `
+4 -4
View File
@@ -4,11 +4,11 @@ interface AstroComponentParams {
export function getAstroCode({ svgContent }: AstroComponentParams): string {
const cleanedSvg = svgContent
.replace(/\s*(width|height)="[^"]*"/gi, '')
.replace(/\s*(width|height)='[^']*'/gi, '')
.replace(/\s*(width|height)=\{[^}]*\}/gi, '')
.replace(/\s*(width|height)="[^"]*"/gi, "")
.replace(/\s*(width|height)='[^']*'/gi, "")
.replace(/\s*(width|height)=\{[^}]*\}/gi, "")
.replace(/<svg([^>]*)>/i, (match, attrs) => {
const cleanedAttrs = attrs.replace(/\s*\{?\.\.\.Astro\.props\}?\s*/i, '');
const cleanedAttrs = attrs.replace(/\s*\{?\.\.\.Astro\.props\}?\s*/i, "");
return `<svg ${cleanedAttrs} {...Astro.props}>`;
});
+5 -5
View File
@@ -5,15 +5,15 @@ interface ReactComponentParams {
}
export const getReactCode = async (
params: ReactComponentParams
params: ReactComponentParams,
): Promise<{ data?: string; error?: string }> => {
try {
const getCode = await fetch('/api/svgs/svgr', {
method: 'POST',
const getCode = await fetch("/api/svgs/svgr", {
method: "POST",
headers: {
'Content-Type': 'application/json'
"Content-Type": "application/json",
},
body: JSON.stringify(params)
body: JSON.stringify(params),
});
const data = await getCode.json();
return data;
+1 -1
View File
@@ -3,7 +3,7 @@ interface SourceParams {
}
export const getSource = async (params: SourceParams) => {
const response = await fetch(params.url || '');
const response = await fetch(params.url || "");
const content = await response.text();
return content;
};
+6 -3
View File
@@ -1,4 +1,4 @@
import { parseSvgContent } from '@/utils/parseSvgContent';
import { parseSvgContent } from "@/utils/parseSvgContent";
interface SvelteComponentParams {
lang: string;
@@ -6,8 +6,11 @@ interface SvelteComponentParams {
}
export const getSvelteCode = (params: SvelteComponentParams) => {
const { templateContent, componentStyle } = parseSvgContent(params.content, 'Svelte');
return `<script${params.lang ? ` lang="${params.lang}"` : ''}></script>
const { templateContent, componentStyle } = parseSvgContent(
params.content,
"Svelte",
);
return `<script${params.lang ? ` lang="${params.lang}"` : ""}></script>
${templateContent}
${componentStyle}
+6 -3
View File
@@ -1,4 +1,4 @@
import { parseSvgContent } from '@/utils/parseSvgContent';
import { parseSvgContent } from "@/utils/parseSvgContent";
interface VueComponentParams {
lang: string;
@@ -6,8 +6,11 @@ interface VueComponentParams {
}
export const getVueCode = (params: VueComponentParams) => {
const { templateContent, componentStyle } = parseSvgContent(params.content, 'Vue');
return `<script setup${params.lang ? ` lang="${params.lang}"` : ''}></script>
const { templateContent, componentStyle } = parseSvgContent(
params.content,
"Vue",
);
return `<script setup${params.lang ? ` lang="${params.lang}"` : ""}></script>
<template>
${templateContent}
</template>
+33 -33
View File
@@ -1,34 +1,34 @@
export type tCategory =
| 'All'
| 'AI'
| 'Software'
| 'Hardware'
| 'Library'
| 'Hosting'
| 'Framework'
| 'Devtool'
| 'Monorepo'
| 'CMS'
| 'Database'
| 'Compiler'
| 'Crypto'
| 'Cybersecurity'
| 'Social'
| 'Entertainment'
| 'Browser'
| 'Language'
| 'Education'
| 'Design'
| 'Community'
| 'Marketplace'
| 'Music'
| 'Vercel'
| 'Google'
| 'Payment'
| 'VoidZero'
| 'Authentication'
| 'IoT'
| 'Config'
| 'Secrets'
| 'IaC'
| 'Analytics';
| "All"
| "AI"
| "Software"
| "Hardware"
| "Library"
| "Hosting"
| "Framework"
| "Devtool"
| "Monorepo"
| "CMS"
| "Database"
| "Compiler"
| "Crypto"
| "Cybersecurity"
| "Social"
| "Entertainment"
| "Browser"
| "Language"
| "Education"
| "Design"
| "Community"
| "Marketplace"
| "Music"
| "Vercel"
| "Google"
| "Payment"
| "VoidZero"
| "Authentication"
| "IoT"
| "Config"
| "Secrets"
| "IaC"
| "Analytics";
+1 -1
View File
@@ -1,4 +1,4 @@
import type { tCategory } from './categories';
import type { tCategory } from "./categories";
export type ThemeOptions = {
dark: string;
-36
View File
@@ -1,36 +0,0 @@
<script lang="ts">
import { cn } from '@/utils/cn';
import { AlertTriangleIcon, CheckCircleIcon, InfoIcon, XCircleIcon } from 'lucide-svelte';
type iAlertType = 'success' | 'error' | 'warning' | 'info';
export let type: iAlertType = 'info';
const icons = {
success: CheckCircleIcon,
error: XCircleIcon,
warning: AlertTriangleIcon,
info: InfoIcon
};
</script>
<div
class={cn(
'flex items-center space-x-3 rounded-lg border px-3 py-2 text-sm dark:border-gray-700/20 dark:text-gray-200',
type === 'success' &&
'border-emerald-600/20 bg-emerald-100/50 text-emerald-900 selection:bg-emerald-500/20 dark:border-emerald-500/30 dark:bg-emerald-500/10 dark:text-emerald-200 dark:selection:bg-emerald-500/30',
type === 'error' &&
'border-red-600/20 bg-red-100/50 text-red-900 selection:bg-red-500/20 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-200 dark:selection:bg-red-500/30',
type === 'warning' &&
'border-yellow-600/20 bg-yellow-100/50 text-yellow-900 selection:bg-yellow-500/20 dark:border-yellow-500/30 dark:bg-yellow-500/10 dark:text-yellow-200 dark:selection:bg-yellow-500/30',
type === 'info' &&
'border-blue-600/20 bg-blue-100/50 text-blue-900 selection:bg-blue-500/20 dark:border-blue-500/30 dark:bg-blue-500/10 dark:text-blue-200 dark:selection:bg-blue-500/30'
)}
>
{#if icons[type]}
<svelte:component this={icons[type]} class="flex-shrink-0" size={16} />
{/if}
<div>
<slot />
</div>
</div>
@@ -1,35 +0,0 @@
<script lang="ts">
import { ContextMenu as ContextMenuPrimitive } from 'bits-ui';
import { CheckIcon } from 'lucide-svelte';
import { cn } from '@/utils/cn';
type $$Props = ContextMenuPrimitive.CheckboxItemProps;
type $$Events = ContextMenuPrimitive.CheckboxItemEvents;
let className: $$Props['class'] = undefined;
export { className as class };
export let checked: $$Props['checked'] = undefined;
</script>
<ContextMenuPrimitive.CheckboxItem
bind:checked
class={cn(
'data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
className
)}
{...$$restProps}
on:click
on:keydown
on:focusin
on:focusout
on:pointerdown
on:pointerleave
on:pointermove
>
<span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
<ContextMenuPrimitive.CheckboxIndicator>
<CheckIcon class="h-4 w-4" />
</ContextMenuPrimitive.CheckboxIndicator>
</span>
<slot />
</ContextMenuPrimitive.CheckboxItem>
@@ -1,25 +0,0 @@
<script lang="ts">
import { ContextMenu as ContextMenuPrimitive } from 'bits-ui';
import { cn } from '@/utils/cn';
import { flyAndScale } from '@/utils/flyAndScale';
type $$Props = ContextMenuPrimitive.ContentProps;
let className: $$Props['class'] = undefined;
export let transition: $$Props['transition'] = flyAndScale;
export let transitionConfig: $$Props['transitionConfig'] = undefined;
export { className as class };
</script>
<ContextMenuPrimitive.Content
{transition}
{transitionConfig}
class={cn(
'bg-white dark:bg-neutral-900 text-popover-foreground z-50 min-w-[8rem] rounded-md border border-neutral-200 dark:border-neutral-800 p-1 shadow-md focus:outline-none',
className
)}
{...$$restProps}
on:keydown
>
<slot />
</ContextMenuPrimitive.Content>
@@ -1,31 +0,0 @@
<script lang="ts">
import { ContextMenu as ContextMenuPrimitive } from 'bits-ui';
import { cn } from '@/utils/cn';
type $$Props = ContextMenuPrimitive.ItemProps & {
inset?: boolean;
};
type $$Events = ContextMenuPrimitive.ItemEvents;
let className: $$Props['class'] = undefined;
export let inset: $$Props['inset'] = undefined;
export { className as class };
</script>
<ContextMenuPrimitive.Item
class={cn(
'data-[highlighted]:bg-neutral-100 dark:data-[highlighted]:bg-neutral-800 data-[highlighted]:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 space-x-2',
inset && 'pl-8',
className
)}
{...$$restProps}
on:click
on:keydown
on:focusin
on:focusout
on:pointerdown
on:pointerleave
on:pointermove
>
<slot />
</ContextMenuPrimitive.Item>
@@ -1,19 +0,0 @@
<script lang="ts">
import { ContextMenu as ContextMenuPrimitive } from 'bits-ui';
import { cn } from '@/utils/cn';
type $$Props = ContextMenuPrimitive.LabelProps & {
inset?: boolean;
};
let className: $$Props['class'] = undefined;
export let inset: $$Props['inset'] = undefined;
export { className as class };
</script>
<ContextMenuPrimitive.Label
class={cn('text-foreground px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)}
{...$$restProps}
>
<slot />
</ContextMenuPrimitive.Label>
-31
View File
@@ -1,31 +0,0 @@
import { ContextMenu as ContextMenuPrimitive } from 'bits-ui';
import Item from './context-menu-item.svelte';
import Label from './context-menu-label.svelte';
import Content from './context-menu-content.svelte';
import CheckboxItem from './context-menu-checkbox-item.svelte';
const Sub = ContextMenuPrimitive.Sub;
const Root = ContextMenuPrimitive.Root;
const Trigger = ContextMenuPrimitive.Trigger;
const Group = ContextMenuPrimitive.Group;
export {
Sub,
Root,
Item,
Label,
Group,
Trigger,
Content,
CheckboxItem,
//
Root as ContextMenu,
Sub as ContextMenuSub,
Item as ContextMenuItem,
Label as ContextMenuLabel,
Group as ContextMenuGroup,
Content as ContextMenuContent,
Trigger as ContextMenuTrigger,
CheckboxItem as ContextMenuCheckboxItem
};
-38
View File
@@ -1,38 +0,0 @@
<script lang="ts">
import { Dialog as DialogPrimitive } from 'bits-ui';
import * as Dialog from '@/ui/dialog';
import { cn } from '@/utils/cn';
import { X } from 'lucide-svelte';
import { flyAndScale } from '@/utils/flyAndScale';
type $$Props = DialogPrimitive.ContentProps;
let className: $$Props['class'] = undefined;
export let transition: $$Props['transition'] = flyAndScale;
export let transitionConfig: $$Props['transitionConfig'] = {
duration: 200
};
export { className as class };
</script>
<Dialog.Portal>
<Dialog.Overlay />
<DialogPrimitive.Content
{transition}
{transitionConfig}
class={cn(
'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] border border-neutral-200 dark:border-neutral-800 dark:bg-neutral-900 bg-white p-6 shadow-lg sm:rounded-lg md:w-full',
className
)}
{...$$restProps}
>
<slot />
<DialogPrimitive.Close
class="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground"
>
<X class="h-4 w-4" />
<span class="sr-only">Close</span>
</DialogPrimitive.Close>
</DialogPrimitive.Content>
</Dialog.Portal>
-13
View File
@@ -1,13 +0,0 @@
<script lang="ts">
import { Dialog as DialogPrimitive } from 'bits-ui';
import { cn } from '@/utils/cn';
type $$Props = DialogPrimitive.DescriptionProps;
let className: $$Props['class'] = undefined;
export { className as class };
</script>
<DialogPrimitive.Description class={cn('text-sm opacity-70 mb-2', className)} {...$$restProps}>
<slot />
</DialogPrimitive.Description>
-16
View File
@@ -1,16 +0,0 @@
<script lang="ts">
import { cn } from '@/utils/cn';
import type { HTMLAttributes } from 'svelte/elements';
type $$Props = HTMLAttributes<HTMLDivElement>;
let className: $$Props['class'] = undefined;
export { className as class };
</script>
<div
class={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)}
{...$$restProps}
>
<slot />
</div>
-13
View File
@@ -1,13 +0,0 @@
<script lang="ts">
import { cn } from '@/utils/cn';
import type { HTMLAttributes } from 'svelte/elements';
type $$Props = HTMLAttributes<HTMLDivElement>;
let className: $$Props['class'] = undefined;
export { className as class };
</script>
<div class={cn('flex flex-col space-y-1.5 text-center sm:text-left', className)} {...$$restProps}>
<slot />
</div>
-24
View File
@@ -1,24 +0,0 @@
<script lang="ts">
import { Dialog as DialogPrimitive } from 'bits-ui';
import { cn } from '@/utils/cn';
import { fade } from 'svelte/transition';
type $$Props = DialogPrimitive.OverlayProps;
let className: $$Props['class'] = undefined;
export let transition: $$Props['transition'] = fade;
export let transitionConfig: $$Props['transitionConfig'] = {
duration: 150
};
export { className as class };
</script>
<DialogPrimitive.Overlay
{transition}
{transitionConfig}
class={cn(
'fixed inset-0 z-50 bg-neutral-100/80 dark:bg-neutral-900/80 backdrop-blur-sm',
className
)}
{...$$restProps}
/>
-8
View File
@@ -1,8 +0,0 @@
<script lang="ts">
import { Dialog as DialogPrimitive } from 'bits-ui';
type $$Props = DialogPrimitive.PortalProps;
</script>
<DialogPrimitive.Portal {...$$restProps}>
<slot />
</DialogPrimitive.Portal>
-16
View File
@@ -1,16 +0,0 @@
<script lang="ts">
import { Dialog as DialogPrimitive } from 'bits-ui';
import { cn } from '@/utils/cn';
type $$Props = DialogPrimitive.TitleProps;
let className: $$Props['class'] = undefined;
export { className as class };
</script>
<DialogPrimitive.Title
class={cn('text-lg font-semibold leading-none tracking-tight', className)}
{...$$restProps}
>
<slot />
</DialogPrimitive.Title>
-34
View File
@@ -1,34 +0,0 @@
import { Dialog as DialogPrimitive } from 'bits-ui';
const Root = DialogPrimitive.Root;
const Trigger = DialogPrimitive.Trigger;
import Title from './dialog-title.svelte';
import Portal from './dialog-portal.svelte';
import Footer from './dialog-footer.svelte';
import Header from './dialog-header.svelte';
import Overlay from './dialog-overlay.svelte';
import Content from './dialog-content.svelte';
import Description from './dialog-description.svelte';
export {
Root,
Title,
Portal,
Footer,
Header,
Trigger,
Overlay,
Content,
Description,
//
Root as Dialog,
Title as DialogTitle,
Portal as DialogPortal,
Footer as DialogFooter,
Header as DialogHeader,
Trigger as DialogTrigger,
Overlay as DialogOverlay,
Content as DialogContent,
Description as DialogDescription
};
-16
View File
@@ -1,16 +0,0 @@
import { Popover as PopoverPrimitive } from 'bits-ui';
import Content from './popover-content.svelte';
const Root = PopoverPrimitive.Root;
const Trigger = PopoverPrimitive.Trigger;
const Close = PopoverPrimitive.Close;
export {
Root,
Content,
Trigger,
Close,
Root as Popover,
Content as PopoverContent,
Trigger as PopoverTrigger,
Close as PopoverClose
};
-29
View File
@@ -1,29 +0,0 @@
<script lang="ts">
import { Popover as PopoverPrimitive } from 'bits-ui';
import { cn } from '@/utils/cn';
import { flyAndScale } from '@/utils/flyAndScale';
type $$Props = PopoverPrimitive.ContentProps;
let className: $$Props['class'] = undefined;
export let transition: $$Props['transition'] = flyAndScale;
export let transitionConfig: $$Props['transitionConfig'] = undefined;
export let align: $$Props['align'] = 'center';
export let sideOffset: $$Props['sideOffset'] = 4;
export { className as class };
</script>
<PopoverPrimitive.Content
{transition}
{transitionConfig}
{align}
{sideOffset}
{...$$restProps}
class={cn(
'z-50 w-auto max-w-96 rounded-md border border-neutral-200 bg-white p-3 shadow-md outline-none dark:border-neutral-800 dark:bg-neutral-900',
className
)}
>
<slot />
</PopoverPrimitive.Content>
-14
View File
@@ -1,14 +0,0 @@
export const buttonStyles =
'flex items-center space-x-2 relative h-10 rounded-full border border-neutral-200 dark:border-neutral-800 bg-transparent px-4 text-neutral-950 dark:text-white hover:bg-neutral-200/50 dark:hover:bg-neutral-800/50 focus:outline-none focus:ring-1 focus:ring-neutral-300 dark:focus:ring-neutral-700 transition-colors duration-100 disabled:opacity-50 disabled:cursor-not-allowed';
export const inputStyles =
'w-full border-b border-neutral-300 bg-white p-3 px-11 placeholder-neutral-500 focus:outline-none focus:ring-1 focus:ring-neutral-300 dark:border-neutral-800 dark:bg-neutral-900 dark:focus:ring-neutral-700';
export const badgeStyles =
'inline-flex items-center px-2.5 py-0.5 rounded-full font-medium bg-neutral-100 dark:bg-neutral-800/50 border border-neutral-200 dark:border-neutral-800 text-neutral-600 dark:text-neutral-400 text-xs font-mono hover:underline hover:bg-neutral-200 dark:hover:bg-neutral-700/50 transition-colors duration-100';
export const sidebarItemStyles =
'flex w-full items-center space-x-3 justify-between rounded-md p-2 transition-none duration-100 text-neutral-600 hover:text-dark dark:hover:text-white dark:text-neutral-400 hover:bg-neutral-200 dark:hover:bg-neutral-700/40 text-sm';
export const sidebarCategoryCountStyles =
'px-2.5 py-0.5 rounded-full font-medium bg-neutral-100 dark:bg-neutral-800/50 border border-neutral-200 dark:border-neutral-800 text-neutral-600 dark:text-neutral-400 text-xs font-mono';
-18
View File
@@ -1,18 +0,0 @@
import { Tabs as TabsPrimitive } from 'bits-ui';
import Content from './tabs-content.svelte';
import List from './tabs-list.svelte';
import Trigger from './tabs-trigger.svelte';
const Root = TabsPrimitive.Root;
export {
Root,
Content,
List,
Trigger,
//
Root as Tabs,
Content as TabsContent,
List as TabsList,
Trigger as TabsTrigger
};
-21
View File
@@ -1,21 +0,0 @@
<script lang="ts">
import { Tabs as TabsPrimitive } from 'bits-ui';
import { cn } from '@/utils/cn';
type $$Props = TabsPrimitive.ContentProps;
let className: $$Props['class'] = undefined;
export let value: $$Props['value'];
export { className as class };
</script>
<TabsPrimitive.Content
class={cn(
'focus-visible:ring-ring mt-1 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',
className
)}
{value}
{...$$restProps}
>
<slot />
</TabsPrimitive.Content>
-16
View File
@@ -1,16 +0,0 @@
<script lang="ts">
import { Tabs as TabsPrimitive } from 'bits-ui';
import { cn } from '@/utils/cn';
type $$Props = TabsPrimitive.ListProps;
let className: $$Props['class'] = undefined;
export { className as class };
</script>
<TabsPrimitive.List
class={cn('mb-2 flex flex-wrap items-center justify-center rounded-lg', className)}
{...$$restProps}
>
<slot />
</TabsPrimitive.List>
-25
View File
@@ -1,25 +0,0 @@
<script lang="ts">
import { Tabs as TabsPrimitive } from 'bits-ui';
import { cn } from '@/utils/cn';
type $$Props = TabsPrimitive.TriggerProps;
type $$Events = TabsPrimitive.TriggerEvents;
let className: $$Props['class'] = undefined;
export let value: $$Props['value'];
export { className as class };
</script>
<TabsPrimitive.Trigger
class={cn(
'inline-flex items-center justify-center whitespace-nowrap rounded-md px-2.5 py-1 text-sm font-medium text-neutral-500 transition-all hover:bg-neutral-300/40 hover:text-black focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-200 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-neutral-300/40 data-[state=active]:text-black data-[state=active]:shadow dark:text-neutral-400 dark:hover:bg-neutral-800/40 dark:hover:text-white dark:focus-visible:ring-neutral-800 dark:data-[state=active]:bg-neutral-800/40 dark:data-[state=active]:text-white',
className
)}
{value}
{...$$restProps}
on:click
on:keydown
on:focus
>
<slot />
</TabsPrimitive.Trigger>
-15
View File
@@ -1,15 +0,0 @@
const MIMETYPE = 'text/plain';
export const clipboard = async (content: string) => {
try {
const clipboardItem = new ClipboardItem({
[MIMETYPE]: new Blob([content], { type: MIMETYPE })
});
setTimeout(async () => {
await navigator.clipboard.write([clipboardItem]);
}, 200);
} catch (error) {
await navigator.clipboard.writeText(content);
}
};
-6
View File
@@ -1,6 +0,0 @@
import { clsx, type ClassValue } from 'clsx';
import { twMerge } from 'tailwind-merge';
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
-43
View File
@@ -1,43 +0,0 @@
import { cubicOut } from 'svelte/easing';
import type { TransitionConfig } from 'svelte/transition';
type FlyAndScaleParams = {
y?: number;
x?: number;
start?: number;
duration?: number;
};
export const flyAndScale = (
node: Element,
params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 }
): TransitionConfig => {
const style = getComputedStyle(node);
const transform = style.transform === 'none' ? '' : style.transform;
const scaleConversion = (valueA: number, scaleA: [number, number], scaleB: [number, number]) => {
const [minA, maxA] = scaleA;
const [minB, maxB] = scaleB;
const percentage = (valueA - minA) / (maxA - minA);
const valueB = percentage * (maxB - minB) + minB;
return valueB;
};
const styleToString = (style: Record<string, number | string | undefined>): string => {
return Object.keys(style).reduce((str, key) => {
if (style[key] === undefined) return str;
return str + key + ':' + style[key] + ';';
}, '');
};
return {
duration: params.duration ?? 200,
delay: 0,
css: (t) => {
const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]);
const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]);
const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]);
return styleToString({
transform: transform + 'translate3d(' + x + 'px, ' + y + 'px, 0) scale(' + scale + ')',
opacity: t
});
},
easing: cubicOut
};
};
-10
View File
@@ -1,10 +0,0 @@
export async function fetchGitHubStars() {
const res = await fetch('https://api.github.com/repos/pheralb/svgl');
const response = await res.json();
const starsFormated =
response.stargazers_count > 1000
? `${(response.stargazers_count / 1000).toFixed(1)}K`
: response.stargazers_count;
return starsFormated;
}
-26
View File
@@ -1,26 +0,0 @@
export const parseSvgContent = (content: string, framework: 'Vue' | 'Svelte') => {
if (content.includes('<?xml')) {
content = content.replace(/<\?xml[^>]*\?>/i, '');
}
// Regular expression to match <style> tags in the SVG content
const styleTagRegex = /<style[^>]*>([\s\S]*?)<\/style>/gi;
// Extract styles and store them in an array
const styles = [];
let matched;
while ((matched = styleTagRegex.exec(content)) !== null) {
styles.push(matched[1]); // Add the style content (not including the style tag)
}
// Remove <style> tags from the SVG content
const templateContent = content.replace(styleTagRegex, '');
const componentStyle = styles.length
? `<style${framework === 'Vue' ? ' scoped' : ''}>\n${styles.join('\n')}\n</style>`
: '';
return {
componentStyle,
templateContent
};
};
-21
View File
@@ -1,21 +0,0 @@
import { optimize } from 'svgo';
export const getPrefixFromSvgUrl = (svgUrl: string) => {
return svgUrl.split('/').pop()!.replace('.svg', '').split('-').join('_');
};
export const prefixSvgIds = (content: string, prefix: string): string => {
const result = optimize(content, {
plugins: [
{
name: 'prefixIds',
params: {
prefix
}
}
],
multipass: false
});
return (result as { data: string }).data;
};