Compare commits
No commits in common. "fd200b02faab8addf00f667e0c43ff0d033a1f49" and "0314e0bbaa83ca5aeef46aa10702fed9fe46ecdc" have entirely different histories.
fd200b02fa
...
0314e0bbaa
15 changed files with 145 additions and 2575 deletions
|
|
@ -40,7 +40,6 @@
|
|||
"vitest": "^2.1.8"
|
||||
},
|
||||
"dependencies": {
|
||||
"activity-calendar-widget": "^0.0.18",
|
||||
"lucide-svelte": "^0.544.0",
|
||||
"svelte-simple-icons": "^1.0.3"
|
||||
}
|
||||
|
|
|
|||
1694
pnpm-lock.yaml
generated
1694
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load diff
|
|
@ -1,92 +1,8 @@
|
|||
<script lang="ts">
|
||||
import '../app.css';
|
||||
let { children } = $props();
|
||||
|
||||
import ThemeToggle from './theme.svelte';
|
||||
</script>
|
||||
|
||||
<div class="flex min-h-screen bg-dark-bg">
|
||||
<div class="absolute right-0 top-0">
|
||||
<ThemeToggle />
|
||||
</div>
|
||||
|
||||
<!-- Left Section - Hidden on mobile, visible on lg screens -->
|
||||
<div class="relative hidden border-r border-dark-neutral lg:flex lg:w-1/4">
|
||||
<!-- Diagonal line pattern -->
|
||||
<div class="absolute inset-0">
|
||||
<svg class="h-full w-full" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<pattern id="diagonal-left" patternUnits="userSpaceOnUse" width="40" height="40">
|
||||
<line x1="0" y1="40" x2="40" y2="0" stroke="#928374" stroke-width="1" />
|
||||
</pattern>
|
||||
<linearGradient id="fade-left" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" style="stop-color:white;stop-opacity:0.3" />
|
||||
<stop offset="100%" style="stop-color:white;stop-opacity:0.1" />
|
||||
</linearGradient>
|
||||
<mask id="fade-mask-left">
|
||||
<rect width="100%" height="100%" fill="url(#fade-left)" />
|
||||
</mask>
|
||||
</defs>
|
||||
<rect width="100%" height="100%" fill="url(#diagonal-left)" mask="url(#fade-mask-left)" />
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Main Content Section -->
|
||||
<div class="relative min-w-[800px] flex-1 lg:w-1/2">
|
||||
<!-- Left diagonal border -->
|
||||
<div class="absolute bottom-0 left-0 top-0 w-8 overflow-hidden lg:w-12">
|
||||
<svg class="h-full w-full" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="none">
|
||||
<defs>
|
||||
<pattern id="diagonal-border-left" patternUnits="userSpaceOnUse" width="12" height="12">
|
||||
<line x1="0" y1="12" x2="12" y2="0" stroke="#928374" stroke-width="1" />
|
||||
</pattern>
|
||||
</defs>
|
||||
<rect width="100%" height="100%" fill="url(#diagonal-border-left)" />
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
<!-- Main content area -->
|
||||
<div class="min-h-screen px-12 py-8 lg:px-24">
|
||||
{@render children()}
|
||||
</div>
|
||||
|
||||
<!-- Right diagonal border -->
|
||||
<div class="absolute bottom-0 right-0 top-0 w-8 overflow-hidden lg:w-12">
|
||||
<svg class="h-full w-full" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="none">
|
||||
<defs>
|
||||
<pattern id="diagonal-border-right" patternUnits="userSpaceOnUse" width="12" height="12">
|
||||
<line x1="0" y1="12" x2="12" y2="0" stroke="#928374" stroke-width="1" />
|
||||
</pattern>
|
||||
</defs>
|
||||
<rect width="100%" height="100%" fill="url(#diagonal-border-right)" />
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Right Section - Hidden on mobile, visible on lg screens -->
|
||||
<div class="relative hidden border-l border-dark-neutral lg:flex lg:w-1/4">
|
||||
<!-- Diagonal line pattern -->
|
||||
<div class="absolute inset-0">
|
||||
<svg class="h-full w-full" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<pattern id="diagonal-right" patternUnits="userSpaceOnUse" width="40" height="40">
|
||||
<line x1="0" y1="40" x2="40" y2="0" stroke="#928374" stroke-width="1" />
|
||||
</pattern>
|
||||
<linearGradient id="fade-right" x1="100%" y1="0%" x2="0%" y2="0%">
|
||||
<stop offset="0%" style="stop-color:white;stop-opacity:0.3" />
|
||||
<stop offset="100%" style="stop-color:white;stop-opacity:0.2" />
|
||||
</linearGradient>
|
||||
<mask id="fade-mask-right">
|
||||
<rect width="100%" height="100%" fill="url(#fade-right)" />
|
||||
</mask>
|
||||
</defs>
|
||||
<rect width="100%" height="100%" fill="url(#diagonal-right)" mask="url(#fade-mask-right)" />
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<div class="">
|
||||
{@render children()}
|
||||
</div>
|
||||
|
||||
<style>
|
||||
/* Additional custom styles if needed */
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
<script>
|
||||
import Project from './project.svelte';
|
||||
import Bio from './bio.svelte';
|
||||
import LanguageStats from './languages.svelte';
|
||||
import ThemeToggle from './theme.svelte';
|
||||
import TiltCard from './tiltcard.svelte';
|
||||
|
||||
// Assuming icons for Github, Gitlab, Codeberg (Code), Forgejo (GitBranch)
|
||||
import { Github, Gitlab, Code, GitBranch } from 'lucide-svelte';
|
||||
|
||||
const repository = {
|
||||
label: 'Repository',
|
||||
label: 'Forge',
|
||||
url: 'https://git.light7734.com/light7734/light',
|
||||
iconComponent: GitBranch
|
||||
};
|
||||
|
|
@ -34,95 +34,41 @@
|
|||
const graphicsApis = ['Vulkan', 'Metal', 'DirectX12'];
|
||||
|
||||
const cicd = ['Drone', 'Docker'];
|
||||
const lorem_ipsum =
|
||||
'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum';
|
||||
</script>
|
||||
|
||||
<div
|
||||
class="min-h-screen bg-light-bg text-light-fg transition-colors duration-300 dark:bg-dark-bg dark:text-dark-fg"
|
||||
class="flex min-h-screen bg-gruvboxLight-bg text-gruvboxLight-fg transition-colors duration-300 dark:bg-gruvboxDark-bg dark:text-gruvboxDark-fg"
|
||||
>
|
||||
<ThemeToggle />
|
||||
<main class="bg-card p-8 transition-all duration-300 ease-out">
|
||||
<Bio description={lorem_ipsum} avatar="/pfp.jpg" />
|
||||
|
||||
<br />
|
||||
|
||||
<div class="relative left-1/2 flex w-screen max-w-none -translate-x-1/2 items-center">
|
||||
<div class="border-border flex-grow border-t border-t-dark-neutral"></div>
|
||||
<h1
|
||||
class="rounded-lg px-4 align-middle font-mono text-4xl transition-all duration-300 ease-out"
|
||||
>
|
||||
PROJECTS
|
||||
</h1>
|
||||
<div class="border-border flex-grow border-t border-t-dark-neutral"></div>
|
||||
<div class="flex-1 bg-[#1d2021]"></div>
|
||||
<main class="bg-card relative flex-[10] p-8 transition-all duration-300 ease-out">
|
||||
<div class="absolute right-0 top-0">
|
||||
<ThemeToggle />
|
||||
</div>
|
||||
|
||||
<h1>Bio</h1>
|
||||
|
||||
<br />
|
||||
|
||||
<Project
|
||||
title="Light"
|
||||
headline="Dependency free, cross-platform and feature-rich 3D game engine."
|
||||
description={lorem_ipsum}
|
||||
title="LIGHT"
|
||||
description_preview="Dependency free, cross-platform, cross-graphics-api, bleeding-edge game engine."
|
||||
description="Dependency free, cross-platform, cross-graphics-api, bleeding-edge game engine."
|
||||
icon="/light.svg"
|
||||
{repository}
|
||||
{mirrors}
|
||||
{gallery}
|
||||
{features}
|
||||
{languages}
|
||||
{graphicsApis}
|
||||
{cicd}
|
||||
/>
|
||||
<br />
|
||||
|
||||
<br />
|
||||
<Project
|
||||
title="Dazzle"
|
||||
headline="Best way to learn is to teach, here be my articles."
|
||||
description={lorem_ipsum}
|
||||
icon="/signature.svg"
|
||||
{repository}
|
||||
{mirrors}
|
||||
{gallery}
|
||||
{features}
|
||||
/>
|
||||
<br />
|
||||
|
||||
<Project
|
||||
title="BONFIRE"
|
||||
headline="You're enjoying its warmth on your eyes! :D"
|
||||
description={lorem_ipsum}
|
||||
icon="/signature.svg"
|
||||
{repository}
|
||||
{mirrors}
|
||||
{gallery}
|
||||
{features}
|
||||
/>
|
||||
<br />
|
||||
|
||||
<Project
|
||||
title="HIKARI"
|
||||
headline="Toy raytracer written in Rust using Vulkan"
|
||||
description={lorem_ipsum}
|
||||
icon="/hikari.svg"
|
||||
{repository}
|
||||
{mirrors}
|
||||
{gallery}
|
||||
{features}
|
||||
/>
|
||||
<br />
|
||||
|
||||
<div class="relative left-1/2 flex w-screen max-w-none -translate-x-1/2 items-center">
|
||||
<div class="border-border flex-grow border-t border-t-dark-neutral"></div>
|
||||
<h1
|
||||
class="rounded-lg px-4 align-middle font-mono text-4xl transition-all duration-300 ease-out"
|
||||
>
|
||||
EXPERIENCE
|
||||
</h1>
|
||||
<div class="border-border flex-grow border-t border-t-dark-neutral"></div>
|
||||
</div>
|
||||
<br />
|
||||
|
||||
<Project
|
||||
title="BITWYRE"
|
||||
headline="C++ Engineer"
|
||||
description={lorem_ipsum}
|
||||
icon="/bitwyre-white.svg"
|
||||
title="LIGHT"
|
||||
description_preview="Dependency free, cross-platform, cross-graphics-api, bleeding-edge game engine."
|
||||
description="Detailed description here."
|
||||
icon="/light.svg"
|
||||
{repository}
|
||||
{mirrors}
|
||||
{gallery}
|
||||
|
|
@ -131,34 +77,8 @@
|
|||
{graphicsApis}
|
||||
{cicd}
|
||||
/>
|
||||
<br />
|
||||
|
||||
<Project
|
||||
title="Systematic Trading Group"
|
||||
headline="C++ Engineer"
|
||||
description={lorem_ipsum}
|
||||
icon=""
|
||||
{repository}
|
||||
{mirrors}
|
||||
{gallery}
|
||||
{features}
|
||||
{languages}
|
||||
{graphicsApis}
|
||||
{cicd}
|
||||
/>
|
||||
<br />
|
||||
|
||||
<div class="relative left-1/2 flex w-screen max-w-none -translate-x-1/2 items-center">
|
||||
<div class="border-border flex-grow border-t border-t-dark-neutral"></div>
|
||||
<h1
|
||||
class="rounded-lg px-4 align-middle font-mono text-4xl transition-all duration-300 ease-out"
|
||||
>
|
||||
CONTACT :D
|
||||
</h1>
|
||||
<div class="border-border flex-grow border-t border-t-dark-neutral"></div>
|
||||
</div>
|
||||
<br />
|
||||
</main>
|
||||
<div class="flex-1 bg-[#1d2021]"></div>
|
||||
</div>
|
||||
<!-- Brief Bio
|
||||
-->
|
||||
|
|
@ -237,7 +157,7 @@ Bonfire is powered by:
|
|||
-->
|
||||
|
||||
<!-- Work Experience -->
|
||||
<!-- Brief Bitwyre -->
|
||||
<!-- Brief Bitwyrek -->
|
||||
<!-- Details -->
|
||||
|
||||
<!-- Brief STG -->
|
||||
|
|
|
|||
|
|
@ -1,25 +0,0 @@
|
|||
<script lang="ts">
|
||||
import TiltCard from './tiltcard.svelte';
|
||||
|
||||
export let avatar: string;
|
||||
export let description: string;
|
||||
</script>
|
||||
|
||||
<div
|
||||
class="relative mx-auto flex w-full max-w-2xl rounded-l border-b border-l border-t shadow-lg duration-300 ease-out hover:scale-[1.01] hover:shadow-[5px_5px_5px_#000000]"
|
||||
>
|
||||
<div class="m-4">
|
||||
<h1 class="font-mono text-4xl">LIGHT 7734</h1>
|
||||
<p class="text-muted-foreground leading-relaxed">
|
||||
{description}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="mx-auto flex max-w-2xl origin-center">
|
||||
<img
|
||||
src={avatar}
|
||||
alt="author"
|
||||
class="h-full w-full object-cover transition-transform duration-100 ease-out"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,266 +0,0 @@
|
|||
<script lang="ts">
|
||||
export let repositoryUrl: string;
|
||||
|
||||
interface LanguageData {
|
||||
[key: string]: number;
|
||||
}
|
||||
|
||||
interface ParsedRepo {
|
||||
platform: 'github' | 'gitlab' | 'codeberg' | 'forgejo';
|
||||
owner: string;
|
||||
repo: string;
|
||||
}
|
||||
|
||||
let languages: LanguageData = {};
|
||||
let loading = true;
|
||||
let error = '';
|
||||
|
||||
// Parse repository URL to determine platform and extract owner/repo
|
||||
function parseRepoUrl(url: string): ParsedRepo | null {
|
||||
try {
|
||||
const urlObj = new URL(url);
|
||||
const hostname = urlObj.hostname;
|
||||
const pathParts = urlObj.pathname.split('/').filter((p) => p);
|
||||
|
||||
if (pathParts.length < 2) return null;
|
||||
|
||||
let platform: ParsedRepo['platform'];
|
||||
if (hostname.includes('github.com')) {
|
||||
platform = 'github';
|
||||
} else if (hostname.includes('gitlab.com')) {
|
||||
platform = 'gitlab';
|
||||
} else if (hostname.includes('codeberg.org')) {
|
||||
platform = 'codeberg';
|
||||
} else {
|
||||
platform = 'forgejo'; // Assume forgejo for custom instances
|
||||
}
|
||||
|
||||
return {
|
||||
platform,
|
||||
owner: pathParts[0],
|
||||
repo: pathParts[1].replace('.git', '')
|
||||
};
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Fetch language data from GitHub API
|
||||
async function fetchGitHub(owner: string, repo: string) {
|
||||
const response = await fetch(`https://api.github.com/repos/${owner}/${repo}/languages`);
|
||||
if (!response.ok) throw new Error('Failed to fetch from GitHub');
|
||||
return await response.json();
|
||||
}
|
||||
|
||||
// Fetch language data from GitLab API
|
||||
async function fetchGitLab(owner: string, repo: string) {
|
||||
const projectPath = encodeURIComponent(`${owner}/${repo}`);
|
||||
const response = await fetch(`https://gitlab.com/api/v4/projects/${projectPath}/languages`);
|
||||
if (!response.ok) throw new Error('Failed to fetch from GitLab');
|
||||
return await response.json();
|
||||
}
|
||||
|
||||
// Fetch language data from Codeberg API (Gitea-based)
|
||||
async function fetchCodeberg(owner: string, repo: string) {
|
||||
// Codeberg uses Gitea API which doesn't have direct language stats
|
||||
// We'll use GitHub's linguist approach or fallback
|
||||
const response = await fetch(`https://codeberg.org/api/v1/repos/${owner}/${repo}/languages`);
|
||||
if (!response.ok) throw new Error('Failed to fetch from Codeberg');
|
||||
return await response.json();
|
||||
}
|
||||
|
||||
// Calculate percentages
|
||||
function calculatePercentages(data: LanguageData) {
|
||||
const total = Object.values(data).reduce((sum, val) => sum + val, 0);
|
||||
return Object.entries(data)
|
||||
.map(([name, bytes]) => ({
|
||||
name,
|
||||
bytes,
|
||||
percentage: ((bytes / total) * 100).toFixed(1)
|
||||
}))
|
||||
.sort((a, b) => b.bytes - a.bytes);
|
||||
}
|
||||
|
||||
// Color mapping for common languages
|
||||
const languageColors: { [key: string]: string } = {
|
||||
'C++': '#f34b7d',
|
||||
CMake: '#da3434',
|
||||
Shell: '#89e051',
|
||||
JavaScript: '#f1e05a',
|
||||
TypeScript: '#3178c6',
|
||||
Python: '#3572A5',
|
||||
Java: '#b07219',
|
||||
Go: '#00ADD8',
|
||||
Rust: '#dea584',
|
||||
HTML: '#e34c26',
|
||||
CSS: '#563d7c',
|
||||
Other: '#858585'
|
||||
};
|
||||
|
||||
// Fetch languages on mount or when URL changes
|
||||
$: if (repositoryUrl) {
|
||||
fetchLanguages();
|
||||
}
|
||||
|
||||
async function fetchLanguages() {
|
||||
loading = true;
|
||||
error = '';
|
||||
|
||||
try {
|
||||
const parsed = parseRepoUrl(repositoryUrl);
|
||||
if (!parsed) {
|
||||
throw new Error('Invalid repository URL');
|
||||
}
|
||||
|
||||
let data: LanguageData;
|
||||
switch (parsed.platform) {
|
||||
case 'github':
|
||||
data = await fetchGitHub(parsed.owner, parsed.repo);
|
||||
break;
|
||||
case 'gitlab':
|
||||
data = await fetchGitLab(parsed.owner, parsed.repo);
|
||||
break;
|
||||
case 'codeberg':
|
||||
data = await fetchCodeberg(parsed.owner, parsed.repo);
|
||||
break;
|
||||
default:
|
||||
throw new Error('Unsupported platform');
|
||||
}
|
||||
|
||||
languages = data;
|
||||
} catch (e) {
|
||||
error = e instanceof Error ? e.message : 'Failed to fetch language data';
|
||||
languages = {};
|
||||
} finally {
|
||||
loading = false;
|
||||
}
|
||||
}
|
||||
|
||||
$: languageStats = calculatePercentages(languages);
|
||||
$: otherLanguages = languageStats.slice(3);
|
||||
$: otherPercentage = otherLanguages
|
||||
.reduce((sum, lang) => sum + parseFloat(lang.percentage), 0)
|
||||
.toFixed(1);
|
||||
$: displayedLanguages = (() => {
|
||||
const topThree = languageStats.slice(0, 3);
|
||||
if (otherLanguages.length > 0) {
|
||||
return [
|
||||
...topThree,
|
||||
{
|
||||
name: 'Other',
|
||||
bytes: otherLanguages.reduce((sum, lang) => sum + lang.bytes, 0),
|
||||
percentage: otherPercentage
|
||||
}
|
||||
];
|
||||
}
|
||||
return topThree;
|
||||
})();
|
||||
</script>
|
||||
|
||||
<div class="language-stats block">
|
||||
{#if loading}
|
||||
<div class="loading">Loading...</div>
|
||||
{:else if error}
|
||||
<div class="error">{error}</div>
|
||||
{:else if languageStats.length > 0}
|
||||
<div class="progress-bar">
|
||||
{#each displayedLanguages as lang}
|
||||
<div
|
||||
class="progress-segment"
|
||||
style="width: {lang.percentage}%; background-color: {languageColors[lang.name] ||
|
||||
'#858585'}"
|
||||
title="{lang.name}: {lang.percentage}%"
|
||||
></div>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
<ul class="language-list">
|
||||
{#each displayedLanguages as lang}
|
||||
<li>
|
||||
<span
|
||||
class="language-dot"
|
||||
style="background-color: {languageColors[lang.name] || '#858585'}"
|
||||
></span>
|
||||
<span class="language-name">{lang.name}</span>
|
||||
<span class="language-percentage">{lang.percentage}%</span>
|
||||
</li>
|
||||
{/each}
|
||||
</ul>
|
||||
{:else}
|
||||
<div class="no-data">No language data available</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.language-stats {
|
||||
background-color: #282828;
|
||||
color: #c9d1d9;
|
||||
padding: 16px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid #30363d;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
margin: 0 0 12px 0;
|
||||
color: #c9d1d9;
|
||||
}
|
||||
|
||||
.progress-bar {
|
||||
display: flex;
|
||||
height: 8px;
|
||||
background-color: #21262d;
|
||||
border-radius: 6px;
|
||||
overflow: hidden;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.progress-segment {
|
||||
height: 100%;
|
||||
transition: width 0.3s ease;
|
||||
}
|
||||
|
||||
.language-list {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.language-list li {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.language-dot {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
border-radius: 50%;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.language-name {
|
||||
color: #c9d1d9;
|
||||
}
|
||||
|
||||
.language-percentage {
|
||||
color: #8b949e;
|
||||
}
|
||||
|
||||
.loading,
|
||||
.error,
|
||||
.no-data {
|
||||
padding: 16px;
|
||||
text-align: center;
|
||||
color: #8b949e;
|
||||
}
|
||||
|
||||
.error {
|
||||
color: #f85149;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -1,7 +1,5 @@
|
|||
<script lang="ts">
|
||||
import { ChevronDown, ChevronUp, ExternalLink, BookText } from 'lucide-svelte';
|
||||
|
||||
import LanguageStats from './languages.svelte';
|
||||
import { ChevronDown, ChevronUp, ExternalLink } from 'lucide-svelte';
|
||||
import TiltCard from './tiltcard.svelte';
|
||||
|
||||
import { Github, Gitlab, Code, GitBranch } from 'lucide-svelte';
|
||||
|
|
@ -18,7 +16,7 @@
|
|||
}
|
||||
|
||||
export let title: string;
|
||||
export let headline: string;
|
||||
export let description_preview: string;
|
||||
export let description: string;
|
||||
export let icon: string;
|
||||
export let repository: ProjectLink = { label: 'Forgejo', url: '', iconComponent: GitBranch };
|
||||
|
|
@ -27,113 +25,88 @@
|
|||
{ label: 'Gitlab', url: '', iconComponent: Gitlab },
|
||||
{ label: 'Codeberg', url: '', iconComponent: Code }
|
||||
];
|
||||
export let documentation: string = '';
|
||||
export let gallery: string[] = [];
|
||||
export let features: string[] = [];
|
||||
export let languages: Language[] = [];
|
||||
export let graphicsApis: string[] = [];
|
||||
export let cicd: string[] = [];
|
||||
|
||||
let expansionStage = 0; // 0: collapsed, 1: description, 2: gallery, 3: source code
|
||||
const MAX_STAGE = 1;
|
||||
const MAX_STAGE = 3;
|
||||
|
||||
function toggleExpansion() {
|
||||
expansionStage = expansionStage >= MAX_STAGE ? 0 : expansionStage + 1;
|
||||
}
|
||||
|
||||
import { slide } from 'svelte/transition';
|
||||
|
||||
let tiltX = 0;
|
||||
let tiltY = 0;
|
||||
|
||||
function handleMouseMove(event: MouseEvent) {
|
||||
const card = event.currentTarget as HTMLElement;
|
||||
const rect = card.getBoundingClientRect();
|
||||
const x = event.clientX - rect.left;
|
||||
const y = event.clientY - rect.top;
|
||||
const centerX = rect.width / 2;
|
||||
const centerY = rect.height / 2;
|
||||
const percentX = (x - centerX) / centerX;
|
||||
const percentY = (centerY - y) / centerY; // Invert Y for natural tilt
|
||||
const maxTilt = 2;
|
||||
tiltX = percentY * maxTilt;
|
||||
tiltY = percentX * maxTilt;
|
||||
}
|
||||
|
||||
function handleMouseLeave() {
|
||||
tiltX = 0;
|
||||
tiltY = 0;
|
||||
}
|
||||
</script>
|
||||
|
||||
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
||||
<div
|
||||
class="bg-card border-border relative mx-auto w-full max-w-2xl rounded-lg border transition-all duration-300 ease-out hover:scale-[1.01] hover:shadow-[5px_5px_5px_#000000]"
|
||||
style="transform: perspective(1000px) rotateX({tiltX}deg) rotateY({tiltY}deg);"
|
||||
on:mousemove={handleMouseMove}
|
||||
on:mouseleave={handleMouseLeave}
|
||||
>
|
||||
<div class="p-6">
|
||||
{#if icon !== ''}
|
||||
<div class="mb-4 flex items-center gap-4">
|
||||
<div class="flex-shrink-0">
|
||||
<TiltCard imageSrc={icon} imageAlt="{title} icon" width="256px" height="256px" />
|
||||
</div>
|
||||
<div class="m-4 min-w-0 flex-1">
|
||||
<div>
|
||||
<h1 class="font-mono text-4xl uppercase">{title}</h1>
|
||||
|
||||
<div class="border-border w-full self-center border-t p-1"></div>
|
||||
<p class="text-muted-foreground leading-relaxed">
|
||||
{headline}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4 flex items-center gap-4">
|
||||
<div class="flex-shrink-0">
|
||||
<TiltCard imageSrc={icon} imageAlt="{title} icon" width="256px" height="256px" />
|
||||
</div>
|
||||
{:else}
|
||||
<div class="m-4 min-w-0 flex-1">
|
||||
<div>
|
||||
<h1 class="font-mono text-3xl">{title}</h1>
|
||||
<div class="min-w-0 flex-1">
|
||||
<TiltCard imageSrc="/light_text.svg" imageAlt="{title} icon" width="auto" height="auto" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="border-border w-full self-center border-t p-1"></div>
|
||||
<p class="text-muted-foreground leading-relaxed">
|
||||
{headline}
|
||||
</p>
|
||||
</div>
|
||||
<p class="text-muted-foreground leading-relaxed">
|
||||
{expansionStage >= 1 ? description : description_preview}
|
||||
</p>
|
||||
|
||||
{#if expansionStage >= 1}
|
||||
<div class="py-4" transition:slide={{ duration: 300 }}>
|
||||
{#if features.length > 0 || languages.length > 0 || graphicsApis.length > 0 || cicd.length > 0}
|
||||
{#if features.length > 0}
|
||||
<h3 class="text-muted-foreground mb-3 text-sm font-semibold uppercase tracking-wide">
|
||||
Features
|
||||
</h3>
|
||||
<ul class="text-muted-foreground mb-2 list-disc pl-5">
|
||||
{#each features as feature}
|
||||
<li>{feature}</li>
|
||||
{/each}
|
||||
</ul>
|
||||
{/if}
|
||||
<h4 class="mb-1 font-medium">Technology behind {title}:</h4>
|
||||
{#if languages.length > 0}
|
||||
<h5 class="mb-1 text-sm">Languages:</h5>
|
||||
<div class="mb-2 flex flex-wrap gap-2">
|
||||
{#each languages as lang}
|
||||
<span class="flex items-center gap-1">
|
||||
{#if lang.icon}
|
||||
<img src={lang.icon} alt="{lang.name} icon" class="ivert h-4 w-4" />
|
||||
{/if}
|
||||
{lang.name}
|
||||
</span>
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
{#if graphicsApis.length > 0}
|
||||
<h5 class="mb-1 text-sm">Graphics APIs:</h5>
|
||||
<div class="mb-2 flex flex-wrap gap-2">
|
||||
{#each graphicsApis as api}
|
||||
<span>{api}</span>
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
{#if cicd.length > 0}
|
||||
<h5 class="mb-1 text-sm">CICD:</h5>
|
||||
<div class="mb-2 flex flex-wrap gap-2">
|
||||
{#each cicd as tool}
|
||||
<span>{tool}</span>
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if expansionStage >= 1}
|
||||
<div transition:slide={{ duration: 500 }} class="ease-out">
|
||||
<p class="text-muted-foreground pb-8 leading-relaxed">
|
||||
{description}
|
||||
</p>
|
||||
|
||||
<!-- LANGUAGES -->
|
||||
|
||||
<h3 class="text-muted-foreground mb-3 text-sm font-semibold uppercase tracking-wide">
|
||||
Supported Graphics-APIs
|
||||
</h3>
|
||||
|
||||
<div class="flex flex-wrap gap-3">
|
||||
<p>Vulkan</p>
|
||||
|
||||
<p>DirectX</p>
|
||||
|
||||
<p>Metal</p>
|
||||
</div>
|
||||
|
||||
<h3 class="text-muted-foreground mb-3 text-sm font-semibold uppercase tracking-wide">
|
||||
Features
|
||||
</h3>
|
||||
|
||||
<!-- FEATURES -->
|
||||
<ul class="text-muted-foreground mb-2 list-disc pl-5">
|
||||
{#each features as feature}
|
||||
<li>{feature}</li>
|
||||
{/each}
|
||||
</ul>
|
||||
<h4 class="mb-1 font-medium">{title}'s Tech Stack':</h4>
|
||||
|
||||
<!-- GALLERY -->
|
||||
|
||||
{#if expansionStage >= 2 && gallery.length > 0}
|
||||
<div transition:slide={{ duration: 300 }}>
|
||||
<h3 class="text-muted-foreground mb-3 text-sm font-semibold uppercase tracking-wide">
|
||||
Gallery
|
||||
</h3>
|
||||
|
|
@ -142,55 +115,47 @@
|
|||
<img src={img} alt="{title} screenshot" class="rounded object-cover" />
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="mx-auto w-full py-4">
|
||||
<LanguageStats repositoryUrl="https://github.com/light7734/light" />
|
||||
</div>
|
||||
|
||||
<div class="flex items-start justify-start gap-0">
|
||||
<div class="flex-none">
|
||||
<h3 class="text-muted-foreground mb-2 text-sm font-semibold uppercase tracking-wide">
|
||||
Source
|
||||
</h3>
|
||||
<div class="flex flex-wrap gap-3">
|
||||
<a
|
||||
href={repository.url}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="text-accent-foreground flex items-center gap-1 transition-colors duration-200 hover:underline"
|
||||
>
|
||||
<svelte:component this={repository.iconComponent} class="h-4 w-4" />
|
||||
{repository.label}
|
||||
</a>
|
||||
|
||||
<a
|
||||
href={documentation}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="text-accent-foreground flex items-center gap-1 transition-colors duration-200 hover:underline"
|
||||
>
|
||||
<BookText class="h-4 w-4" />
|
||||
Documentation
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="border-border mx-4 h-8 self-center border-l"></div>
|
||||
<div class="flex-none">
|
||||
<h3 class="text-muted-foreground mb-2 text-sm font-semibold uppercase tracking-wide">
|
||||
Mirrors
|
||||
</h3>
|
||||
<div class="flex flex-wrap gap-3">
|
||||
{#each mirrors as link}
|
||||
{#if expansionStage >= 3}
|
||||
<div transition:slide={{ duration: 300 }}>
|
||||
<div class="border-border border-t pt-4">
|
||||
<div class="flex items-start justify-start gap-0">
|
||||
<div class="flex-none">
|
||||
<h3 class="text-muted-foreground mb-2 text-sm font-semibold uppercase tracking-wide">
|
||||
Repository
|
||||
</h3>
|
||||
<div class="flex flex-wrap gap-3">
|
||||
<a
|
||||
href={link.url}
|
||||
href={repository.url}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="text-accent-foreground flex items-center gap-1 transition-colors duration-200 hover:underline"
|
||||
>
|
||||
<svelte:component this={link.iconComponent} class="h-4 w-4" />
|
||||
{link.label}
|
||||
<svelte:component this={repository.iconComponent} class="h-4 w-4" />
|
||||
{repository.label}
|
||||
</a>
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
<div class="border-border mx-4 h-8 self-center border-l"></div>
|
||||
<div class="flex-none">
|
||||
<h3 class="text-muted-foreground mb-2 text-sm font-semibold uppercase tracking-wide">
|
||||
Mirrors
|
||||
</h3>
|
||||
<div class="flex flex-wrap gap-3">
|
||||
{#each mirrors as link}
|
||||
<a
|
||||
href={link.url}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="text-accent-foreground flex items-center gap-1 transition-colors duration-200 hover:underline"
|
||||
>
|
||||
<svelte:component this={link.iconComponent} class="h-4 w-4" />
|
||||
{link.label}
|
||||
</a>
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -212,7 +177,11 @@
|
|||
/>
|
||||
<span class="font-bold">
|
||||
{#if expansionStage === 0}
|
||||
DETAILS
|
||||
FEATURES
|
||||
{:else if expansionStage === 1}
|
||||
GALLERY
|
||||
{:else if expansionStage === 2}
|
||||
SOURCE
|
||||
{/if}
|
||||
</span>
|
||||
<ChevronDown
|
||||
|
|
|
|||
|
|
@ -5,13 +5,13 @@
|
|||
export let height: string = '400px';
|
||||
|
||||
let cardElement: HTMLDivElement;
|
||||
let rotateX = -10;
|
||||
let rotateY = 5;
|
||||
let rotateX = 0;
|
||||
let rotateY = 0;
|
||||
let isHovered = false;
|
||||
|
||||
// Derived shadow offsets
|
||||
let shadowX = -rotateY * 0.7;
|
||||
let shadowY = rotateX * 0.7;
|
||||
let shadowX = 0;
|
||||
let shadowY = 0;
|
||||
let shadowBlur = 20;
|
||||
|
||||
function handleMouseMove(event: MouseEvent) {
|
||||
|
|
@ -39,16 +39,16 @@
|
|||
|
||||
function handleMouseLeave() {
|
||||
isHovered = false;
|
||||
rotateX = -10;
|
||||
rotateY = 5;
|
||||
shadowX = -rotateY * 0.7;
|
||||
shadowY = rotateX * 0.7;
|
||||
rotateX = 0;
|
||||
rotateY = 0;
|
||||
shadowX = 0;
|
||||
shadowY = 0;
|
||||
}
|
||||
</script>
|
||||
|
||||
<div
|
||||
bind:this={cardElement}
|
||||
class="cursor-pointer duration-100"
|
||||
class="cursor-pointer"
|
||||
class:scale-[1.03]={isHovered}
|
||||
style="
|
||||
width: {width};
|
||||
|
|
|
|||
|
|
@ -1,40 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="200"
|
||||
height="200"
|
||||
viewBox="0 0 200 200"
|
||||
fill="none"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
sodipodi:docname="bitwyre-white.svg"
|
||||
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview8"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:zoom="4"
|
||||
inkscape:cx="119"
|
||||
inkscape:cy="89.125"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1368"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg8" />
|
||||
<path
|
||||
d="m 30.576717,83.977559 c 0,3.629767 1.502691,7.110901 4.177481,9.677461 2.67479,2.566559 6.302579,4.008482 10.085304,4.008482 h 61.024308 c 5.44143,0.0066 10.82165,1.10324 15.79626,3.219298 4.97459,2.11606 9.43426,5.20513 13.09348,9.06959 3.65921,3.86467 6.43745,8.4196 8.15708,13.37348 1.71962,4.95367 2.34268,10.19745 1.82938,15.39568 -1.89473,19.41451 -19.70281,33.86296 -40.01718,33.86296 H 54.966083 l -0.713023,-40.7256 h 51.65147 c 11.92237,-0.0409 23.56979,-3.44018 33.49712,-9.7757 -3.40635,-8.09888 -9.87625,-14.66334 -18.11362,-18.37823 -5.10529,2.28541 -10.66682,3.47953 -16.30037,3.49977 H 44.513476 c -1.828274,-0.002 -3.639061,0.34098 -5.328689,1.01121 -1.689628,0.67 -3.224847,1.6536 -4.517629,2.89419 -1.292805,1.24038 -2.317796,2.71359 -3.016209,4.33498 -0.698411,1.62115 -1.05652,3.35873 -1.053837,5.1131 0,21.35018 0.122242,60.86347 0,61.62596 0,3.62977 1.502704,7.11091 4.177494,9.67747 2.67479,2.56678 6.302556,4.00871 10.085281,4.00871 h 61.024403 c 8.53602,-0.007 16.98301,-1.66603 24.83616,-4.87658 7.85314,-3.21033 14.95115,-7.90698 20.87001,-13.80927 5.91885,-5.90206 10.53703,-12.88848 13.57848,-20.54191 3.04146,-7.65321 4.44403,-15.8165 4.12353,-24.00166 C 167.98836,99.696962 138.72935,74.104068 104.33562,74.104068 H 54.966083 V 28.647082 h 50.938447 c 22.02595,0 39.87476,18.495567 39.01908,40.882044 -0.16313,4.421938 -1.10692,8.785205 -2.79159,12.903895 4.03771,2.5355 7.78091,5.478473 11.16587,8.778533 2.78145,2.730378 5.31051,5.687156 7.5591,8.837196 5.43682,-9.465549 8.37497,-20.064947 8.55765,-30.871648 C 170.00573,33.398037 140.19636,4.1296475 104.70236,4.1296475 h -60.2092 c -1.826572,-0.00253 -3.63575,0.3404171 -5.324042,1.0093793 -1.688315,0.6689392 -3.222614,1.6507203 -4.515144,2.8891573 -1.292528,1.2384372 -2.317887,2.7092339 -3.017519,4.3282719 -0.699609,1.619038 -1.05974,3.354544 -1.059738,5.107235 z"
|
||||
fill="#c4e648"
|
||||
id="path1"
|
||||
style="stroke-width:2.30082" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.9 KiB |
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 16 KiB |
|
|
@ -1,219 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="256"
|
||||
height="256"
|
||||
viewBox="0 0 67.733335 67.733333"
|
||||
version="1.1"
|
||||
id="svg5"
|
||||
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||
sodipodi:docname="signature.svg"
|
||||
inkscape:export-filename="../../dev/homepage/static/icons/light-signature.svg"
|
||||
inkscape:export-xdpi="260.56308"
|
||||
inkscape:export-ydpi="260.56308"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview7"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#505050"
|
||||
inkscape:document-units="mm"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.7207031"
|
||||
inkscape:cx="52.885357"
|
||||
inkscape:cy="22.374574"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1368"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g4684">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid195"
|
||||
originx="-167.07149"
|
||||
originy="-150.50133"
|
||||
spacingy="1"
|
||||
spacingx="1"
|
||||
units="mm" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs2">
|
||||
<inkscape:path-effect
|
||||
effect="bspline"
|
||||
id="path-effect1666"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
weight="33.333333"
|
||||
steps="2"
|
||||
helper_size="0"
|
||||
apply_no_weight="true"
|
||||
apply_with_weight="true"
|
||||
only_selected="false"
|
||||
uniform="false" />
|
||||
<inkscape:path-effect
|
||||
effect="bspline"
|
||||
id="path-effect1662"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
weight="33.333333"
|
||||
steps="2"
|
||||
helper_size="0"
|
||||
apply_no_weight="true"
|
||||
apply_with_weight="true"
|
||||
only_selected="false"
|
||||
uniform="false" />
|
||||
<inkscape:path-effect
|
||||
effect="bspline"
|
||||
id="path-effect1658"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
weight="33.333333"
|
||||
steps="2"
|
||||
helper_size="0"
|
||||
apply_no_weight="true"
|
||||
apply_with_weight="true"
|
||||
only_selected="false"
|
||||
uniform="false" />
|
||||
</defs>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-167.07147,-150.50134)">
|
||||
<g
|
||||
id="g4379"
|
||||
transform="translate(-0.29179467,1.7868585)">
|
||||
<g
|
||||
id="g4684"
|
||||
transform="translate(68.433557,0.36864027)">
|
||||
<g
|
||||
id="g1"
|
||||
transform="matrix(1.3652447,0,0,1.3652447,-36.177454,-41.698065)">
|
||||
<path
|
||||
style="fill:#e21a41;fill-opacity:1;stroke:#f9234f;stroke-width:1.63477;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 144.13928,163.012 v 15.83879"
|
||||
id="path3842" />
|
||||
<path
|
||||
style="fill:#e21a41;fill-opacity:1;stroke:#f9234f;stroke-width:1.63477;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 144.13928,163.012 v -4.09618"
|
||||
id="path3816-3" />
|
||||
<path
|
||||
style="fill:#e21a41;fill-opacity:1;stroke:#f9234f;stroke-width:1.63477;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 138.32593,162.97429 v 15.73479"
|
||||
id="path3814" />
|
||||
<path
|
||||
style="fill:#e21a41;fill-opacity:1;stroke:#f9234f;stroke-width:1.63477;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 138.32593,163.012 v -4.09618"
|
||||
id="path3816" />
|
||||
<path
|
||||
id="path10278"
|
||||
style="font-variation-settings:normal;fill:none;fill-opacity:1;stroke:#f9234f;stroke-width:1.63477;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 125.4646,163.02464 c 2.60728,1e-5 19.71736,3e-5 22.32464,3e-5 m -28.2592,5.93476 c 1.9817,-0.0315 3.68063,-0.1617 5.26753,-0.35482 2.16665,-0.26368 3.92726,-1.10542 5.68779,-2.2273 1.24498,-0.77443 2.06899,-1.44122 2.59564,-2.81191 0.0687,-0.17881 -0.78257,1.93239 -0.7316,1.74612 m -16.77615,-2.36044 v 15.89971 h -3.95653 7.91306 -0.37449 m 12.24438,-29.67403 c -2.44251,0.0408 -5.05234,1.47746 -5.67981,3.97585 -0.43118,1.81153 -0.19288,3.69013 -0.25501,5.53575 v 2.35801 m -5.93481,7.91306 c 2.44251,-0.0408 5.05233,-1.47744 5.67981,-3.97584 0.43118,-1.81153 0.19289,-3.69013 0.25502,-5.53575 v -2.35801 m -5.93509,21.76096 c 0.0696,-1.1e-4 0.139,-10e-4 0.20817,-0.004 2.12556,-0.0783 4.04109,-1.29353 5.55145,-2.7154 3.6883,-3.63561 5.89813,-7.8054 7.81721,-12.55894"
|
||||
sodipodi:nodetypes="ccsscccccscccccccccccccc" />
|
||||
<path
|
||||
id="path10258"
|
||||
style="fill:none;stroke:#f9234f;stroke-width:1.63476;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 111.61671,168.95923 c 0,0 -5.93482,0 -5.93482,-5.9348 0,-5.9348 0,-5.9348 0,-5.9348 m -5.934804,-7.91307 c 0,0 5.934824,0 5.934824,5.9348 0,5.9348 0,5.9348 0,5.9348" />
|
||||
<path
|
||||
style="fill:#e21a41;stroke:#f9234f;stroke-width:1.63477;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 119.51392,162.92392 h -7.90137"
|
||||
id="path11846" />
|
||||
<path
|
||||
style="fill:#e21a41;fill-opacity:1;stroke:#f9234f;stroke-width:1.63477;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="M 131.39967,149.17676 H 147.4523 Z"
|
||||
id="path3806" />
|
||||
<path
|
||||
style="fill:#e21a41;fill-opacity:1;stroke:#f9234f;stroke-width:1.63477;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 132.98657,163.012 v -4.09618"
|
||||
id="path3816-8" />
|
||||
</g>
|
||||
<g
|
||||
id="g1010"
|
||||
transform="matrix(1.0724352,0,0,1.0724352,10.658069,-80.071456)">
|
||||
<path
|
||||
id="path8741"
|
||||
style="font-variation-settings:normal;fill:none;fill-opacity:1;stroke:#f9234f;stroke-width:1.52639;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 125.62677,186.12006 c 2.43431,1e-5 4.58863,-0.0118 7.02294,-0.0118 m -12.56378,5.55286 c 1.85023,-0.0294 3.43645,-0.15098 4.91807,-0.33128 2.02291,-0.24619 3.66671,-1.03209 5.31044,-2.07953 1.16238,-0.72306 1.93172,-1.34561 2.42343,-2.62536 0.0641,-0.16695 -0.73065,1.80419 -0.68306,1.63027 m -15.66316,-2.20384 v 14.84487 h -3.69403 7.38807 -0.34964 m 11.43204,-27.70534 c -2.28046,0.0381 -4.71715,1.37944 -5.30299,3.71207 -0.40258,1.69135 -0.18008,3.44531 -0.23809,5.16849 v 2.20157 m -5.54108,7.38808 c 2.28047,-0.0381 4.71715,-1.37943 5.30299,-3.71207 0.40258,-1.69134 0.1801,-3.44531 0.23811,-5.16849 v -2.20157 m -5.54134,20.31726 c 0.065,-1.1e-4 0.12978,-7.1e-4 0.19436,-0.004 1.98455,-0.0731 3.77299,-1.20772 5.18315,-2.53525 3.4436,-3.39441 5.50682,-7.28756 7.29859,-11.72573"
|
||||
sodipodi:nodetypes="ccsscccccscccccccccccccc" />
|
||||
<path
|
||||
id="path8743"
|
||||
style="fill:none;stroke:#f9234f;stroke-width:1.5263;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 112.6976,191.66093 c 0,0 -5.54108,0 -5.54108,-5.54106 0,-5.54106 0,-5.54106 0,-5.54106 m -5.54105,-7.38809 c 0,0 5.54108,0 5.54108,5.54106 0,5.54106 0,5.54106 0,5.54106" />
|
||||
<path
|
||||
style="fill:#e21a41;stroke:#f9234f;stroke-width:1.52632;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 120.07088,186.02602 h -7.37715"
|
||||
id="path8745" />
|
||||
<path
|
||||
style="fill:#e21a41;fill-opacity:1;stroke:#f9234f;stroke-width:1.52632;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 131.16809,173.1909 h 6.06924 z"
|
||||
id="path8747"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<path
|
||||
style="fill:#e21a41;fill-opacity:1;stroke:#f9234f;stroke-width:1.52632;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 132.64971,186.10826 v -3.82442"
|
||||
id="path8749" />
|
||||
<path
|
||||
style="fill:#e21a41;fill-opacity:1;stroke:#f9234f;stroke-width:1.52639;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:2.4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill;stop-color:#000000"
|
||||
d="m 136.47413,186.10826 h -3.82442"
|
||||
id="path8751" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4454-5"
|
||||
transform="translate(44.965349,-46.218985)">
|
||||
<path
|
||||
id="path10278-5-3"
|
||||
style="font-variation-settings:normal;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2.72044;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 125.4646,163.02464 c 2.60728,1e-5 6.34288,3e-5 8.95016,3e-5 m -14.88472,5.93476 c 1.9817,-0.0315 3.68063,-0.1617 5.26753,-0.35482 2.16665,-0.26368 3.92726,-1.10542 5.68779,-2.2273 1.24498,-0.77443 2.06899,-1.44122 2.59564,-2.81191 0.0687,-0.17881 -0.78257,1.93239 -0.7316,1.74612 m -16.77615,-2.36044 v 15.89971 h -4.4857 8.44223 -0.37449 m 12.24438,-29.67403 c -2.44251,0.0408 -5.05234,1.47746 -5.67981,3.97585 -0.43118,1.81153 -0.19288,3.69013 -0.25501,5.53575 v 2.35801 m -5.93481,7.91306 c 2.44251,-0.0408 5.05233,-1.47744 5.67981,-3.97584 0.43118,-1.81153 0.19289,-3.69013 0.25502,-5.53575 v -2.35801 m -5.93509,21.76096 c 0.0696,-1.1e-4 0.139,-10e-4 0.20817,-0.004 2.12556,-0.0783 4.04109,-1.29353 5.55145,-2.7154 3.6883,-3.63561 5.89813,-7.8054 7.81721,-12.55894"
|
||||
sodipodi:nodetypes="ccsscccccscccccccccccccc" />
|
||||
</g>
|
||||
<path
|
||||
id="path10258-2-2"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:2.72044;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 156.58206,122.74025 c 0,0 -5.93482,0 -5.93482,-5.9348 0,-5.9348 0,-5.9348 0,-5.9348 m -5.93481,-7.91307 c 0,0 5.93483,0 5.93483,5.9348 0,5.9348 0,5.9348 0,5.9348" />
|
||||
<path
|
||||
style="fill:#e21a41;stroke:#ffffff;stroke-width:2.72044;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="M 164.47927,116.70494 H 156.5779"
|
||||
id="path11846-5-7" />
|
||||
<path
|
||||
style="fill:#e21a41;fill-opacity:1;stroke:#ffffff;stroke-width:2.72044;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 176.36502,102.95778 h 16.5818 z"
|
||||
id="path3806-4-0"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<path
|
||||
style="fill:#e21a41;fill-opacity:1;stroke:#ffffff;stroke-width:2.72044;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 177.95192,116.79302 v -4.09618"
|
||||
id="path3816-8-4-9" />
|
||||
<path
|
||||
id="path10278-1"
|
||||
style="font-variation-settings:normal;fill:none;fill-opacity:1;stroke:#e21a41;stroke-width:1.63477;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 170.42995,116.80566 c 2.60728,1e-5 6.34288,3e-5 8.95016,3e-5 m -14.88472,5.93476 c 1.9817,-0.0315 3.68063,-0.1617 5.26753,-0.35482 2.16665,-0.26368 3.92726,-1.10542 5.68779,-2.2273 1.24498,-0.77443 2.06899,-1.44122 2.59564,-2.81191 0.0687,-0.17881 -0.78257,1.93239 -0.7316,1.74612 M 160.5386,116.7321 v 15.89971 h -3.95653 7.91306 -0.37449 m 12.24438,-29.67403 c -2.44251,0.0408 -5.05234,1.47746 -5.67981,3.97585 -0.43118,1.81153 -0.19288,3.69013 -0.25501,5.53575 v 2.35801 m -5.93481,7.91306 c 2.44251,-0.0408 5.05233,-1.47744 5.67981,-3.97584 0.43118,-1.81153 0.19289,-3.69013 0.25502,-5.53575 v -2.35801 m -5.93509,21.76096 c 0.0696,-1.1e-4 0.139,-0.001 0.20817,-0.004 2.12556,-0.0783 4.04109,-1.29353 5.55145,-2.7154 3.6883,-3.63561 5.89813,-7.8054 7.81721,-12.55894"
|
||||
sodipodi:nodetypes="ccsscccccscccccccccccccc" />
|
||||
<path
|
||||
id="path10258-8"
|
||||
style="fill:none;stroke:#e21a41;stroke-width:1.63476;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 156.58206,122.74025 c 0,0 -5.93482,0 -5.93482,-5.9348 0,-5.9348 0,-5.9348 0,-5.9348 m -5.93481,-7.91307 c 0,0 5.93483,0 5.93483,5.9348 0,5.9348 0,5.9348 0,5.9348" />
|
||||
<path
|
||||
style="fill:#e21a41;stroke:#e21a41;stroke-width:1.63477;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="M 164.47927,116.70494 H 156.5779"
|
||||
id="path11846-7" />
|
||||
<path
|
||||
style="fill:#e21a41;fill-opacity:1;stroke:#e21a41;stroke-width:1.63477;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 176.36502,102.95778 h 16.05263 z"
|
||||
id="path3806-9" />
|
||||
<path
|
||||
style="fill:#e21a41;fill-opacity:1;stroke:#e21a41;stroke-width:1.63477;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 177.95192,116.79302 v -4.09618"
|
||||
id="path3816-8-2" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 15 KiB |
|
|
@ -1 +0,0 @@
|
|||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Vulkan</title><path d="M13.411 15.12h-.875v-2.798c.28.156.649.442.875.719zm-7.383 0H4.936l-1.423-4.4h.992l.979 3.093h.013l.992-3.093h.999zm4.394 0h-.833v-.444h-.017c-.112.185-.255.319-.432.401s-.358.123-.541.123q-.3525 0-.576-.093c-.151-.063-.267-.149-.354-.261-.086-.112-.146-.25-.181-.412-.034-.162-.052-.343-.052-.539v-1.961h.876v1.799c0 .263.041.459.123.589.082.129.229.194.438.194.237 0 .41-.071.518-.214.107-.142.159-.375.159-.699v-1.669h.876zm3.134-1.918-.002-.123 1.104-1.147h1.035l-1.201 1.171 1.337 2.017h-1.061zm2.433-.289c.013-.205.065-.375.155-.511.091-.136.205-.244.345-.326.141-.082.298-.14.473-.174.174-.035.349-.052.526-.052.16 0 .324.011.487.034.164.024.315.067.451.132.136.067.246.157.332.274.087.116.13.272.13.466v1.659c0 .144.009.282.024.412.017.131.045.23.086.295h-.889c-.017-.05-.03-.099-.041-.151a1.2 1.2 0 0 1-.021-.157c-.141.144-.304.243-.494.302-.19.058-.382.086-.581.086-.151 0-.293-.02-.424-.056a.99.99 0 0 1-.346-.173c-.099-.077-.176-.177-.23-.295-.056-.119-.085-.261-.085-.425 0-.181.033-.33.095-.447.065-.116.147-.211.246-.28.102-.069.216-.123.345-.158.13-.034.259-.062.391-.084.131-.019.261-.036.388-.049s.24-.031.339-.056c.099-.024.177-.061.235-.108.058-.048.084-.117.08-.207 0-.095-.015-.171-.048-.225a.32.32 0 0 0-.123-.129.51.51 0 0 0-.179-.063c-.069-.01-.14-.015-.218-.015-.172 0-.308.037-.407.11-.1.074-.156.197-.173.369zm2.021.647c-.037.033-.084.059-.138.078a1.04 1.04 0 0 1-.179.045c-.065.013-.13.022-.201.031-.069.008-.14.019-.209.03a1.7 1.7 0 0 0-.194.049c-.065.022-.119.048-.166.084a.39.39 0 0 0-.114.132c-.029.054-.044.121-.044.203 0 .077.015.144.044.196.028.054.069.095.116.127.05.031.108.052.173.065.064.013.133.019.202.019.173 0 .307-.028.402-.086.094-.058.163-.127.209-.207.045-.08.073-.162.082-.244.011-.082.015-.148.015-.196zm1.443-1.628h.833v.444h.017c.11-.185.254-.319.431-.403s.358-.127.542-.127c.235 0 .427.032.576.094.148.065.267.154.353.266.087.112.147.25.182.412.034.162.051.343.051.539v1.961h-.875v-1.799c0-.263-.041-.46-.123-.589-.082-.13-.229-.194-.438-.194-.24 0-.41.071-.518.213-.108.143-.16.376-.16.699v1.67h-.875zm-8.451-.55c.302.149.593.31.876.483v3.253h-.876zm-8.93.159c-.261.768.203 1.635 1.156 2.408-2.122-.911-3.496-2.244-3.184-3.38.434-1.573 3.932-2.177 7.481-1.491 3.136.606 5.416 2.375 5.884 3.617-1.035-.936-2.621-1.883-4.562-2.37-3.235-.816-6.268-.27-6.775 1.216m11.341.613c-.207-.328-.502-.667-.875-1.001v-.436h.875zM24 14.652c0 .265-.207.472-.479.472-.267 0-.481-.207-.481-.472 0-.259.214-.466.481-.466.27 0 .479.207.479.466m-.839 0c0 .207.153.373.364.373.205 0 .356-.164.356-.369 0-.207-.151-.375-.358-.375-.209 0-.362.166-.362.371m.287.246h-.108v-.466c.043-.009.103-.015.179-.015.088 0 .127.015.162.034.026.02.045.056.045.104 0 .052-.039.09-.097.108v.006c.045.017.071.052.086.114.015.072.024.1.035.117h-.117c-.015-.017-.023-.061-.036-.114-.009-.052-.037-.074-.097-.074h-.052zm.002-.266h.052c.06 0 .108-.019.108-.069 0-.043-.031-.071-.1-.071-.028 0-.047.002-.06.007z"/></svg>
|
||||
|
Before Width: | Height: | Size: 3 KiB |
|
|
@ -10,7 +10,7 @@ export default {
|
|||
extend: {
|
||||
colors: {
|
||||
// Gruvbox Light
|
||||
light: {
|
||||
gruvboxLight: {
|
||||
bg: '#fbf1c7',
|
||||
fg: '#3c3836',
|
||||
primary: '#458588',
|
||||
|
|
@ -28,7 +28,7 @@ export default {
|
|||
},
|
||||
|
||||
// Gruvbox Dark
|
||||
dark: {
|
||||
gruvboxDark: {
|
||||
bg: '#282828',
|
||||
fg: '#ebdbb2',
|
||||
primary: '#83a598',
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue