mirror of
https://github.com/pheralb/svgl.git
synced 2025-12-29 08:01:36 +08:00
✨ Initial commit with Sveltekit + format files
This commit is contained in:
Vendored
+2
-1
@@ -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
@@ -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>
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
<div class="container mx-auto px-6 pt-4 xl:px-[18px]">
|
||||
<slot />
|
||||
</div>
|
||||
@@ -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>
|
||||
@@ -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}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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
|
||||
>
|
||||
@@ -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
|
||||
>
|
||||
@@ -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>
|
||||
@@ -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 |
@@ -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
@@ -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
|
||||
>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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}
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
@@ -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
@@ -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
@@ -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 },
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
@@ -1,5 +0,0 @@
|
||||
<script lang="ts">
|
||||
import { redirect } from '@sveltejs/kit';
|
||||
|
||||
redirect(301, '/');
|
||||
</script>
|
||||
+8
-103
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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`);
|
||||
}
|
||||
}
|
||||
@@ -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 />
|
||||
@@ -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>
|
||||
@@ -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;
|
||||
@@ -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
|
||||
});
|
||||
@@ -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;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
@import "tailwindcss";
|
||||
@@ -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,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,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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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
@@ -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
@@ -1,4 +1,4 @@
|
||||
import type { tCategory } from './categories';
|
||||
import type { tCategory } from "./categories";
|
||||
|
||||
export type ThemeOptions = {
|
||||
dark: string;
|
||||
|
||||
@@ -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>
|
||||
@@ -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
|
||||
};
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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}
|
||||
/>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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
|
||||
};
|
||||
@@ -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
|
||||
};
|
||||
@@ -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>
|
||||
@@ -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';
|
||||
@@ -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
|
||||
};
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
@@ -1,6 +0,0 @@
|
||||
import { clsx, type ClassValue } from 'clsx';
|
||||
import { twMerge } from 'tailwind-merge';
|
||||
|
||||
export function cn(...inputs: ClassValue[]) {
|
||||
return twMerge(clsx(inputs));
|
||||
}
|
||||
@@ -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
|
||||
};
|
||||
};
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
};
|
||||
};
|
||||
@@ -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;
|
||||
};
|
||||
Reference in New Issue
Block a user