redesign: project home, default theme, user settings, groups removed from UI

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Rokojori 2026-07-14 22:27:03 +02:00
parent 4b913eb53f
commit acba5c819b
38 changed files with 8174 additions and 101 deletions

View File

@ -117,7 +117,7 @@ function createMainWindow(): void {
title: 'Roject',
} );
mainWindow.loadURL( `http://localhost:${PORT}/dashboard.html` );
mainWindow.loadURL( `http://localhost:${PORT}/` );
const localBase = `http://localhost:${PORT}/`;
@ -137,7 +137,7 @@ function createMainWindow(): void {
if ( url.includes( '/api/auth/refresh-session' ) ) {
event.preventDefault();
const redirectParam = new URL( url ).searchParams.get( 'redirect' );
const fallback = `http://localhost:${PORT}/dashboard.html`;
const fallback = `http://localhost:${PORT}/`;
if ( currentTokens ) {
const fresh = await refreshTokens( currentTokens.refreshToken );

View File

@ -66,7 +66,7 @@ class EditorShell extends HTMLElement {
this.innerHTML = `
<div class="es-header">
<a class="es-back" href="/projects.html"></a>
<a class="es-back" href="/"></a>
<span class="es-title">${projectName}</span>
<div class="es-portrait-btns">
<button class="es-pb-btn" data-panel="left"></button>

View File

@ -0,0 +1,46 @@
project-home {
display: block;
width: 100%;
min-height: 100vh;
}
.ph-hero {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
background: radial-gradient( ellipse at 40% 35%, #282b3c 0%, #000 70% );
gap: 2.5rem;
}
.ph-brand {
font-family: 'Barlow', sans-serif;
font-weight: 900;
font-style: italic;
font-size: clamp( 3rem, 12vw, 7rem );
text-transform: uppercase;
letter-spacing: 0.03em;
color: #fff;
text-shadow: 0 0 80px rgba( 255, 255, 255, 0.12 );
}
.ph-login {
font-family: 'Barlow', sans-serif;
font-weight: 700;
font-style: italic;
text-transform: uppercase;
letter-spacing: 0.1em;
font-size: 1rem;
color: rgba( 255, 255, 255, 0.6 );
text-decoration: none;
padding: 0.65rem 2.2rem;
border: 1px solid rgba( 255, 255, 255, 0.25 );
border-radius: 4px;
transition: border-color 0.2s, color 0.2s;
}
.ph-login:hover {
border-color: rgba( 255, 255, 255, 0.7 );
color: #fff;
}

View File

@ -0,0 +1,52 @@
const AUTH_HOST = 'https://account.rokojori.com';
const APP_URL = 'https://roject.rokojori.com';
interface JwtUser {
userId: string;
email: string;
roles: string[];
products: string[];
}
class ProjectHome extends HTMLElement {
async connectedCallback(): Promise<void> {
const res = await fetch( '/api/auth/me' );
if ( !res.ok ) {
const loginHref = `${ AUTH_HOST }/login.html?redirect=${ encodeURIComponent( APP_URL ) }`;
this.innerHTML = `
<div class="ph-hero">
<h1 class="ph-brand">Roject</h1>
<a class="ph-login" href="${ loginHref }">Log in</a>
</div>
`;
return;
}
const user = await res.json() as JwtUser;
const settingsRes = await fetch( '/api/user/settings' );
const settings = settingsRes.ok ? await settingsRes.json() as Record<string, unknown> : {};
const theme = ( settings[ 'theme' ] as string | undefined ) ?? 'default';
await this.loadTheme( theme, user );
}
private async loadTheme( theme: string, user: JwtUser ): Promise<void> {
if ( theme === 'italic-neon' ) {
const italicNeonPath = '../project-list-italic-neon/project-list-italic-neon.js';
await import( italicNeonPath );
const el = document.createElement( 'project-list-italic-neon' ) as HTMLElement & { user: JwtUser };
el.user = user;
this.appendChild( el );
} else {
await import( '../project-list-default/project-list-default.js' );
const el = document.createElement( 'project-list-default' ) as HTMLElement & { user: JwtUser };
el.user = user;
this.appendChild( el );
}
}
}
customElements.define( 'project-home', ProjectHome );
export {};

View File

@ -0,0 +1,460 @@
project-list-default {
display: block;
min-height: 100vh;
background: radial-gradient( ellipse at 40% 35%, #282b3c 0%, #000 70% );
color: #fff;
overflow-x: hidden;
}
/* ── Nav ─────────────────────────────────── */
.pld-nav {
display: flex;
align-items: center;
padding: 0 2rem;
height: 84px;
position: fixed;
overflow: visible;
width: 100vw;
}
/* Logo: wrapper = inner area (570×240 at 0.35x = 200×84).
Full image (1592×637 at 0.35x = 557×223) positioned so inner
area aligns with wrapper decorative FX bleed outside. */
.pld-logo-wrap {
position: relative;
width: 200px;
height: 84px;
flex-shrink: 0;
overflow: visible;
margin-left: -40px;
}
.pld-logo {
width: 557px;
height: auto;
position: absolute;
left: -179px;
top: -69px;
pointer-events: none;
user-select: none;
}
/* User group — email + logout, whole thing is one click target */
.pld-user-group {
position: relative;
margin-left: auto;
text-decoration: none;
cursor: pointer;
display: block;
line-height: 1;
}
.pld-email {
display: block;
font-size: 0.82rem;
color: rgba( 255, 255, 255, 0.38 );
transition: color 0.15s;
white-space: nowrap;
}
.pld-user-group:hover .pld-email {
color: rgba( 255, 255, 255, 0.7 );
}
.pld-logout-label {
position: absolute;
top: 100%;
right: 0;
margin-top: 0.35em;
font-family: 'Barlow', sans-serif;
font-weight: 700;
font-style: italic;
text-transform: uppercase;
letter-spacing: 0.08em;
font-size: 1.25rem;
color: rgba( 255, 255, 255, 0.55 );
white-space: nowrap;
opacity: 0;
transform: translateY( -5px );
transition: opacity 0.15s, transform 0.15s;
}
.pld-user-group:hover .pld-logout-label {
opacity: 1;
transform: translateY( 0 );
}
/* ── Main layout ─────────────────────────── */
.pld-main {
padding: 2.5rem 2rem 5rem;
max-width: 80em;
margin: auto;
}
/* ── Project list ────────────────────────── */
.pld-list {
display: flex;
flex-direction: column;
gap: 0.1rem;
margin-bottom: 3rem;
}
@keyframes pld-row-in {
from { opacity: 0; transform: translateX( -18px ); }
to { opacity: 1; transform: translateX( 0 ); }
}
.pld-row {
display: flex;
align-items: center;
gap: 1.5rem;
padding: 2rem 2rem;
cursor: pointer;
border-radius: 26px;
position: relative;
animation: pld-row-in 0.32s cubic-bezier( 0.22, 0.68, 0, 1.15 ) both;
transition: background 0.18s;
overflow: visible;
margin: 0.5em 0em
}
.pld-row:hover .pld-name
{
text-shadow: 0em 0.03em 0.2em hsl(200, 90%, 10%);
}
.pld-row:hover {
background: rgba( 255, 255, 255, 0.035 );
}
/* ── Badge ───────────────────────────────── */
.pld-badge-wrap {
position: relative;
flex-shrink: 0;
width: 7em;
height: 7em;
margin-right: 1.5em;
}
.pld-badge {
width: 100%;
height: 100%;
border-radius: 15%;
background: radial-gradient(circle at 38% 37%, color-mix(in srgb, var(--project-color) 51%, transparent), var(--project-color));
}
.new-project .pld-badge {
outline-style: dashed;
outline-width: 0.3em;
outline-color: #fff;
outline-offset: 2px;
background: transparent;
}
.new-project .pld-name {
color: rgba( 255, 255, 255, 0.8 );
}
.new-project:hover .pld-name {
color: #fff;
}
.new-project .pld-btn-delete,
.new-project .pld-btn-members {
display: none;
pointer-events: none;
}
/* Create project dialog overlay */
.pld-create-overlay {
position: fixed;
inset: 0;
background: rgba( 0, 0, 0, 0.72 );
display: flex;
align-items: center;
justify-content: center;
z-index: 200;
}
.pld-cp-input {
width: 100%;
box-sizing: border-box;
}
.pld-cp-actions {
display: flex;
gap: 0.5rem;
justify-content: flex-end;
margin-top: 1rem;
}
/* ── Overlay buttons on badge ────────────── */
.pld-btn-delete,
.pld-btn-members {
position: absolute;
width: 24px;
height: 24px;
border-radius: 50%;
border: none;
padding: 4px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transform: scale( 0.6 );
transition: opacity 0.14s, transform 0.14s;
z-index: 5;
box-shadow: 0 2px 8px rgba( 0, 0, 0, 0.55 );
}
.pld-row:hover .pld-btn-delete,
.pld-row:hover .pld-btn-members {
opacity: 1;
transform: scale( 1 );
}
.pld-btn-delete {
top: -7px;
left: -7px;
background: #b02050;
}
.pld-btn-delete:hover { background: #e93978; }
.pld-btn-members {
bottom: -7px;
left: -7px;
background: #0574a8;
}
.pld-btn-members:hover { background: #04bdff; }
.pld-btn-delete svg,
.pld-btn-members svg {
width: 14px;
height: 14px;
}
/* ── Project name ────────────────────────── */
.pld-name {
font-family: 'Barlow', sans-serif;
font-weight: 900;
font-style: italic;
font-size: 5em;
letter-spacing: 0.04em;
text-transform: uppercase;
color: var( --project-color );
transform: matrix( 0.953, 0, -0.102, 1.049, 0, 0 );
transform-origin: left center;
display: inline-block;
user-select: none;
text-shadow: 0em 0.03em 0.2em hsl(200, 90%, 10%,0);
}
/* ── Create form ─────────────────────────── */
.pld-create-form {
display: flex;
gap: 0.5rem;
align-items: center;
}
.pld-create-input {
flex: 1;
max-width: 300px;
padding: 0.55rem 0.9rem;
background: rgba( 255, 255, 255, 0.05 );
border: 1px solid rgba( 255, 255, 255, 0.14 );
border-radius: 6px;
color: #fff;
font-size: 0.88rem;
font-family: inherit;
outline: none;
transition: border-color 0.15s;
}
.pld-create-input::placeholder { color: rgba( 255, 255, 255, 0.28 ); }
.pld-create-input:focus { border-color: rgba( 255, 255, 255, 0.38 ); }
.pld-create-btn {
padding: 0.55rem 1.3rem;
background: rgba( 255, 255, 255, 0.07 );
border: 1px solid rgba( 255, 255, 255, 0.18 );
border-radius: 6px;
color: rgba( 255, 255, 255, 0.75 );
font-family: 'Barlow', sans-serif;
font-weight: 700;
font-style: italic;
text-transform: uppercase;
letter-spacing: 0.07em;
font-size: 0.82rem;
cursor: pointer;
transition: background 0.15s, color 0.15s;
}
.pld-create-btn:hover {
background: rgba( 255, 255, 255, 0.13 );
color: #fff;
}
/* ── Members overlay ─────────────────────── */
.pld-members-overlay {
position: fixed;
inset: 0;
background: rgba( 0, 0, 0, 0.72 );
display: flex;
align-items: center;
justify-content: center;
z-index: 200;
}
.pld-mp {
background: #131320;
border: 1px solid rgba( 255, 255, 255, 0.1 );
border-radius: 12px;
padding: 1.75rem 2rem;
width: min( 480px, 92vw );
max-height: 80vh;
overflow-y: auto;
}
.pld-mp-title {
font-family: 'Barlow', sans-serif;
font-weight: 900;
font-style: italic;
text-transform: uppercase;
font-size: 1.25rem;
letter-spacing: 0.04em;
color: #fff;
margin-bottom: 1.25rem;
}
.pld-mp-list {
list-style: none;
padding: 0;
margin: 0 0 1rem;
}
.pld-mp-list li {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 0.5rem 0;
border-bottom: 1px solid rgba( 255, 255, 255, 0.06 );
font-size: 0.88rem;
}
.pld-mp-owner-row { font-weight: 500; }
.pld-mp-email {
flex: 1;
color: rgba( 255, 255, 255, 0.75 );
word-break: break-all;
}
.pld-mp-role {
font-size: 0.72rem;
color: rgba( 255, 255, 255, 0.38 );
padding: 0.15rem 0.5rem;
border: 1px solid rgba( 255, 255, 255, 0.14 );
border-radius: 3px;
white-space: nowrap;
}
.pld-mp-empty {
color: rgba( 255, 255, 255, 0.32 );
font-size: 0.85rem;
padding: 0.5rem 0;
}
.pld-mp-loading {
color: rgba( 255, 255, 255, 0.45 );
font-size: 0.9rem;
text-align: center;
padding: 2rem 0;
}
.pld-mp-add-form {
display: flex;
gap: 0.5rem;
flex-wrap: wrap;
margin-top: 1.25rem;
}
.pld-mp-input {
flex: 1;
min-width: 150px;
padding: 0.45rem 0.7rem;
background: rgba( 255, 255, 255, 0.05 );
border: 1px solid rgba( 255, 255, 255, 0.14 );
border-radius: 5px;
color: #fff;
font-size: 0.85rem;
font-family: inherit;
}
.pld-mp-select {
padding: 0.45rem 0.6rem;
background: rgba( 255, 255, 255, 0.05 );
border: 1px solid rgba( 255, 255, 255, 0.14 );
border-radius: 5px;
color: #fff;
font-size: 0.85rem;
}
.pld-mp-btn {
padding: 0.45rem 0.9rem;
background: rgba( 255, 255, 255, 0.07 );
border: 1px solid rgba( 255, 255, 255, 0.17 );
border-radius: 5px;
color: rgba( 255, 255, 255, 0.75 );
cursor: pointer;
font-size: 0.85rem;
transition: background 0.14s, color 0.14s;
}
.pld-mp-btn:hover {
background: rgba( 255, 255, 255, 0.13 );
color: #fff;
}
.pld-mp-close {
margin-top: 1.25rem;
width: 100%;
justify-content: center;
}
/* ── Mobile ──────────────────────────────── */
@media ( max-width: 600px ) {
.pld-name {
transform: none;
font-size: 1.15rem;
}
.pld-row {
animation: none;
opacity: 1;
}
.pld-btn-delete,
.pld-btn-members {
opacity: 1;
transform: scale( 1 );
}
.pld-main {
padding: 1.5rem 1rem 4rem;
}
}

View File

@ -0,0 +1,248 @@
import { showConfirmDialog } from '../confirm-dialog/confirm-dialog.js';
const AUTH_HOST = 'https://account.rokojori.com';
const APP_URL = 'https://roject.rokojori.com';
interface JwtUser {
userId: string;
email: string;
}
interface Project {
id: string;
name: string;
owner_id: string;
}
interface ProjectMember {
id: string;
project_id: string;
member_type: 'user' | 'group';
member_id: string;
role: string;
}
function hueFromId( id: string ): number {
let h = 0;
for ( let i = 0; i < id.length; i++ ) {
h = ( h * 31 + id.charCodeAt( i ) ) % 360;
}
return Math.abs( h );
}
class ProjectListDefault extends HTMLElement {
user: JwtUser | null = null;
async connectedCallback(): Promise<void> {
await this.render();
}
private async render(): Promise<void> {
const res = await fetch( '/api/projects' );
const projects = res.ok ? await res.json() as Project[] : [];
const logoutHref = `${ AUTH_HOST }/api/auth/logout?redirect=${ encodeURIComponent( APP_URL ) }`;
this.innerHTML = `
<nav class="pld-nav">
<div class="pld-logo-wrap">
<img class="pld-logo" src="/rojos/roject-logo-570x240-1592x637.webp" alt="Roject">
</div>
<a class="pld-user-group" href="${ logoutHref }">
<span class="pld-email">${ this.user?.email ?? '' }</span>
<span class="pld-logout-label">Log out</span>
</a>
</nav>
<main class="pld-main">
<div class="pld-list">
<div class="pld-row new-project" id="pld-new-row">
<div class="pld-badge-wrap">
<div class="pld-badge"></div>
</div>
<span class="pld-name">New Project</span>
</div>
${ projects.map( ( p, i ) => this.rowHtml( p, i ) ).join( '' ) }
</div>
</main>
<div class="pld-members-overlay" style="display:none"></div>
<div class="pld-create-overlay" style="display:none"></div>
`;
this.bindEvents( projects );
}
private rowHtml( p: Project, i: number ): string {
const color = `hsl( ${ hueFromId( p.id ) }, 95%, 45% )`;
return `
<div class="pld-row" data-id="${ p.id }" data-name="${ p.name }" data-owner="${ p.owner_id }"
style="--project-color: ${ color }; animation-delay: ${ 0.04 + i * 0.06 }s">
<div class="pld-badge-wrap">
<div class="pld-badge" style="animation-delay: ${ i * 0.45 }s"></div>
<button class="pld-btn-delete" data-id="${ p.id }" data-name="${ p.name }" title="Delete">
<svg viewBox="0 0 20 20" fill="none" stroke="#fff" stroke-width="2.5" stroke-linecap="round">
<line x1="5" y1="5" x2="15" y2="15"/><line x1="15" y1="5" x2="5" y2="15"/>
</svg>
</button>
<button class="pld-btn-members" data-id="${ p.id }" title="Members">
<svg viewBox="0 0 20 20" fill="none" stroke="#fff" stroke-width="1.8" stroke-linecap="round">
<circle cx="10" cy="7.5" r="3"/>
<path d="M3.5 17.5c0-3.6 2.9-6 6.5-6s6.5 2.4 6.5 6"/>
</svg>
</button>
</div>
<span class="pld-name">${ p.name.toUpperCase() }</span>
</div>
`;
}
private bindEvents( projects: Project[] ): void {
this.querySelector( '#pld-new-row' )!.addEventListener( 'click', () => this.openCreateDialog() );
this.querySelectorAll( '.pld-row:not(.new-project)' ).forEach( row => {
row.addEventListener( 'click', ( e: Event ) => {
if ( ( e.target as HTMLElement ).closest( '.pld-btn-delete, .pld-btn-members' ) ) return;
const el = row as HTMLElement;
location.href = `/editor.html?project=${ el.dataset.id }&name=${ encodeURIComponent( el.dataset.name! ) }`;
} );
} );
this.querySelectorAll( '.pld-btn-delete' ).forEach( btn => {
btn.addEventListener( 'click', async ( e: Event ) => {
e.stopPropagation();
const el = btn as HTMLElement;
const ok = await showConfirmDialog( {
icon: '🗑',
title: 'Delete Project',
message: `Delete "${ el.dataset.name }"? This cannot be undone.`,
confirmLabel: 'Delete',
cancelLabel: 'Cancel',
danger: true
} );
if ( !ok ) return;
await fetch( `/api/projects/${ el.dataset.id }`, { method: 'DELETE' } );
await this.render();
} );
} );
this.querySelectorAll( '.pld-btn-members' ).forEach( btn => {
btn.addEventListener( 'click', ( e: Event ) => {
e.stopPropagation();
const id = ( btn as HTMLElement ).dataset.id!;
const row = this.querySelector( `.pld-row[data-id="${ id }"]` ) as HTMLElement;
this.openMembersPanel( id, row );
} );
} );
}
private openCreateDialog(): void {
const overlay = this.querySelector( '.pld-create-overlay' ) as HTMLElement;
overlay.style.display = 'flex';
overlay.innerHTML = `
<div class="pld-mp">
<h3 class="pld-mp-title">New Project</h3>
<form class="pld-cp-form">
<input class="pld-mp-input pld-cp-input" type="text" name="name"
placeholder="Project name" required autocomplete="off">
<div class="pld-cp-actions">
<button type="button" class="pld-mp-btn pld-cp-cancel">Cancel</button>
<button type="submit" class="pld-mp-btn">Create</button>
</div>
</form>
</div>
`;
const panel = overlay.querySelector( '.pld-mp' )!;
panel.addEventListener( 'click', e => e.stopPropagation() );
overlay.addEventListener( 'click', () => { overlay.style.display = 'none'; }, { once: true } );
const input = overlay.querySelector( '.pld-cp-input' ) as HTMLInputElement;
setTimeout( () => input.focus(), 30 );
overlay.querySelector( '.pld-cp-cancel' )!.addEventListener( 'click', () => {
overlay.style.display = 'none';
} );
overlay.querySelector( '.pld-cp-form' )!.addEventListener( 'submit', async ( e: Event ) => {
e.preventDefault();
const name = input.value.trim();
if ( !name ) return;
overlay.style.display = 'none';
const res = await fetch( '/api/projects', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify( { name } )
} );
if ( res.ok ) await this.render();
} );
}
private async openMembersPanel( projectId: string, row: HTMLElement ): Promise<void> {
const overlay = this.querySelector( '.pld-members-overlay' ) as HTMLElement;
overlay.style.display = 'flex';
overlay.innerHTML = `<div class="pld-mp"><p class="pld-mp-loading">Loading…</p></div>`;
const panel = overlay.querySelector( '.pld-mp' )!;
panel.addEventListener( 'click', e => e.stopPropagation() );
overlay.addEventListener( 'click', () => { overlay.style.display = 'none'; }, { once: true } );
const res = await fetch( `/api/projects/${ projectId }/members` );
const members = res.ok ? await res.json() as ProjectMember[] : [];
const ownerId = row.dataset.owner ?? '';
const isOwner = this.user?.userId === ownerId;
const ownerLabel = isOwner ? this.user!.email : ownerId;
panel.innerHTML = `
<h3 class="pld-mp-title">${ row.dataset.name }</h3>
<ul class="pld-mp-list">
<li class="pld-mp-owner-row">
<span class="pld-mp-email">${ ownerLabel }</span>
<span class="pld-mp-role">owner</span>
</li>
${ members.map( m => `
<li>
<span class="pld-mp-email">${ m.member_id }</span>
<span class="pld-mp-role">${ m.role }</span>
${ isOwner ? `<button class="pld-mp-remove" data-pid="${ projectId }" data-mid="${ m.id }">Remove</button>` : '' }
</li>
` ).join( '' ) }
${ members.length === 0 ? '<li class="pld-mp-empty">No additional members</li>' : '' }
</ul>
${ isOwner ? `
<form class="pld-mp-add-form">
<input name="email" type="email" placeholder="Email address" class="pld-mp-input" required>
<select name="role" class="pld-mp-select">
<option value="viewer">Viewer</option>
<option value="editor">Editor</option>
<option value="admin">Admin</option>
</select>
<button type="submit" class="pld-mp-btn">Add</button>
</form>
` : '' }
<button class="pld-mp-close pld-mp-btn">Close</button>
`;
panel.querySelector( '.pld-mp-close' )!.addEventListener( 'click', () => { overlay.style.display = 'none'; } );
panel.querySelectorAll( '.pld-mp-remove' ).forEach( btn => {
btn.addEventListener( 'click', async () => {
const el = btn as HTMLElement;
await fetch( `/api/projects/${ el.dataset.pid }/members/${ el.dataset.mid }`, { method: 'DELETE' } );
await this.openMembersPanel( projectId, row );
} );
} );
const addForm = panel.querySelector( '.pld-mp-add-form' ) as HTMLFormElement | null;
addForm?.addEventListener( 'submit', async ( e: Event ) => {
e.preventDefault();
const data = Object.fromEntries( new FormData( e.target as HTMLFormElement ) );
await fetch( `/api/projects/${ projectId }/members`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify( data )
} );
await this.openMembersPanel( projectId, row );
} );
}
}
customElements.define( 'project-list-default', ProjectListDefault );

25
source/pages/index.html Normal file
View File

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Roject</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Barlow:ital,wght@1,900;1,700&display=swap">
<link rel="stylesheet" href="/components/confirm-dialog/confirm-dialog.css">
<link rel="stylesheet" href="/components/project-home/project-home.css">
<link rel="stylesheet" href="/components/project-list-default/project-list-default.css">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html, body { height: 100%; }
body { font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; background: #000; }
</style>
</head>
<body>
<confirm-dialog></confirm-dialog>
<project-home></project-home>
<script type="module" src="/components/confirm-dialog/confirm-dialog.js"></script>
<script type="module" src="/components/project-home/project-home.js"></script>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

View File

@ -88,6 +88,24 @@ export const projects = {
}
};
export interface UserSetting {
userId: string;
settings: Record<string, unknown>;
}
export const userSettings = {
forUser( userId: string ): Record<string, unknown> | null {
return read<UserSetting>( 'user_settings' ).find( s => s.userId === userId )?.settings ?? null;
},
save( userId: string, settings: Record<string, unknown> ): Record<string, unknown> {
const all = read<UserSetting>( 'user_settings' );
const idx = all.findIndex( s => s.userId === userId );
if ( idx >= 0 ) { all[ idx ].settings = settings; } else { all.push( { userId, settings } ); }
write( 'user_settings', all );
return settings;
}
};
export const projectMembers = {
forProject: (projectId: string): ProjectMember[] => read<ProjectMember>('project_members').filter(m => m.project_id === projectId),
add(data: Omit<ProjectMember, 'id'>): ProjectMember {

View File

@ -3,12 +3,12 @@ import cookieParser from 'cookie-parser';
import path from 'path';
import { ROOT } from './rootDir';
import { jwtMiddleware, requireAuth } from './middleware/auth';
import groupsRouter from './routes/groups';
import projectsRouter from './routes/projects';
import filesRouter from './routes/files';
import localesRouter from './routes/locales';
import layoutRouter from './routes/layout';
import rojosRouter from './routes/rojos';
import userSettingsRouter from './routes/userSettings';
import { generateLocales } from './localeGenerator';
import deployRouter from './routes/deploy';
import { EmailService } from './email/EmailService';
@ -25,16 +25,16 @@ app.use( jwtMiddleware );
app.use( express.static( path.join( ROOT, 'build', 'app' ) ) );
app.use( '/api/groups', groupsRouter );
app.use( '/api/projects', projectsRouter );
app.use( '/api/files', filesRouter );
app.use( '/api/locales', localesRouter );
app.use( '/api/layout', layoutRouter );
app.use( '/api/rojos', rojosRouter );
app.use( '/api/user/settings', userSettingsRouter );
app.get( '/api/auth/me', requireAuth, ( req, res ) => res.json( req.user ) );
app.get( '/', ( _req, res ) => res.redirect( '/dashboard.html' ) );
app.get( '/edit', ( _req, res ) => res.redirect( '/editor.html' ) );
export function startServer( port: number ): void {
app.listen( port, () =>

View File

@ -0,0 +1,17 @@
import { Router } from 'express';
import { requireAuth } from '../middleware/auth';
import { userSettings } from '../db';
const router = Router();
router.use( requireAuth );
router.get( '/', ( req, res ) => {
res.json( userSettings.forUser( req.user!.userId ) ?? {} );
} );
router.put( '/', ( req, res ) => {
const settings = req.body as Record<string, unknown>;
res.json( userSettings.save( req.user!.userId, settings ) );
} );
export default router;

View File

@ -33,6 +33,7 @@ var NAV_DATA = {
title: 'Actions',
path: 'actions/index.html',
children: [
{ title: 'Update Board', path: 'actions/update-board/index.html' },
{ title: 'Update History', path: 'actions/update-history/index.html' },
{ title: 'Update Outline', path: 'actions/update-outline/index.html' },
]

View File

@ -25,15 +25,15 @@
inkscape:deskcolor="#333333"
inkscape:document-units="px"
showgrid="false"
inkscape:zoom="0.20890503"
inkscape:cx="1605.9929"
inkscape:cy="1093.7985"
inkscape:zoom="0.14771816"
inkscape:cx="1397.9324"
inkscape:cy="470.49055"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g17" /><defs
inkscape:current-layer="g27" /><defs
id="defs2"><linearGradient
id="linearGradient19"
inkscape:collect="never"><stop
@ -280,19 +280,41 @@
cy="950.70941"
fx="1119.998"
fy="950.70941"
r="624.87445" /></defs><g
r="624.87445" /><filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter72"
x="-0.02048285"
y="-0.082298482"
width="1.0409657"
height="1.164597"><feGaussianBlur
inkscape:collect="always"
stdDeviation="6.0393534"
id="feGaussianBlur72" /></filter><filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter87"
x="-0.02092748"
y="-0.084084969"
width="1.041855"
height="1.1681699"><feGaussianBlur
inkscape:collect="always"
stdDeviation="6.2156756"
id="feGaussianBlur87" /></filter></defs><g
inkscape:label="Content"
inkscape:groupmode="layer"
id="layer1"
style="fill:#ffffff;fill-opacity:1"><rect
style="fill:#000000;stroke-linecap:round;stroke-linejoin:round;fill-opacity:1"
style="fill:#000000;fill-opacity:1;stroke-linecap:round;stroke-linejoin:round"
id="rect1"
width="3840"
height="2160"
x="0"
y="0"
ry="7.9545546" /><g
id="g17"
ry="7.9545546"
inkscape:label="BG" /><g
id="g26"
inkscape:label="BG Gradient"
transform="translate(38.057367,61.315595)"><ellipse
style="opacity:1;mix-blend-mode:normal;fill:#0a0066;fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter10)"
id="path10"
@ -307,10 +329,14 @@
cy="1143.0068"
rx="1200.6875"
ry="480.27499"
transform="matrix(0.59256734,0,0,0.55929452,795.32629,304.17302)" /><g
transform="matrix(0.59256734,0,0,0.55929452,795.32629,304.17302)" /></g><g
id="g87"
inkscape:label="Title"><g
id="g12"
style="opacity:1;filter:url(#filter12)"
transform="matrix(0.69112949,0,0,0.69112949,491.63996,291.80532)"><text
style="filter:url(#filter12)"
transform="matrix(0.69112949,0,0,0.69112949,529.69733,353.12091)"
inkscape:label="Shadow"
sodipodi:insensitive="true"><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:457.124px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke-width:11.4281;stroke-linecap:round;stroke-linejoin:round;filter:url(#filter11)"
x="1423.6522"
@ -332,7 +358,11 @@
id="tspan12"
x="1423.6522"
y="1196.2206"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:#000000;fill-opacity:1;stroke-width:11.4281">ROJECT</tspan></text></g><text
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:#000000;fill-opacity:1;stroke-width:11.4281">ROJECT</tspan></text></g><g
id="g25"
inkscape:label="Title"
transform="translate(38.057367,61.315595)"
sodipodi:insensitive="true"><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:315.932px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;opacity:1;fill:url(#linearGradient10);stroke-width:7.8983;stroke-linecap:round;stroke-linejoin:round"
x="1484.9595"
@ -365,39 +395,177 @@
id="tspan3"
x="1513.8538"
y="1085.8309"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:url(#linearGradient6);fill-opacity:1;stroke-width:7.8983">ROJECT</tspan></text><g
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:url(#linearGradient6);fill-opacity:1;stroke-width:7.8983">ROJECT</tspan></text></g><g
id="g86"
style="fill:#ffffff;fill-opacity:1;display:inline;opacity:0.725207"
inkscape:label="White Highlights"><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1435.1443,979.66538 -33.5441,159.29112"
id="path27"
sodipodi:nodetypes="cc" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1889.9057,980.18693 -29.7155,137.11577"
id="path28" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1758.3085,1109.6616 c 0,0 -13.1597,29.7155 -1.6981,57.733"
id="path29" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1967.5806,978.4889 -25.0459,123.9561"
id="path30" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2347.5271,1026.7226 -25.0459,123.9561"
id="path31" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2305.0736,979.12567 -7.4288,32.05033"
id="path32" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2195.5452,978.27595 c 0,0 -19.6906,4.89329 -28.4589,9.76086 -11.5655,6.42041 -22.4448,14.77749 -30.7788,25.05009 -8.2702,10.194 -13.5851,22.6594 -18.0282,35.0113 -5.8348,16.2213 -11.0372,50.5248 -11.0372,50.5248"
id="path33"
sodipodi:nodetypes="caaac" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1678.5133,978.27595 c 0,0 -19.6906,4.89329 -28.4589,9.76086 -11.5655,6.42041 -22.4448,14.77749 -30.7788,25.05009 -8.2702,10.194 -13.5851,22.6594 -18.0282,35.0113 -5.8348,16.2213 -11.0372,50.5248 -11.0372,50.5248"
id="path34"
sodipodi:nodetypes="caaac" /><path
style="opacity:1;fill:#ff0404;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1935.7525,1136.8301 -6.3677,29.7155"
id="path57" /><path
style="opacity:1;fill:#ff0404;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1394.5059,1165.6965 -5.0941,20.8009"
id="path58" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2101.3102,1128.7644 c 0,0 -1.7724,9.7315 -1.698,14.6455 0.081,5.3581 0.4954,10.8723 2.3341,15.9057 1.6585,4.5402 4.6858,8.499 7.6384,12.3261 2.3234,3.0117 4.93,5.8463 7.8568,8.2758 3.3069,2.7451 10.8249,7.0044 10.8249,7.0044"
id="path59"
sodipodi:nodetypes="caaaac" /></g><g
id="g65"
style="display:inline;opacity:0.54958678;mix-blend-mode:screen;fill:#ffffff;fill-opacity:1;stroke:#ff9f02;stroke-opacity:1;filter:url(#filter72)"
inkscape:label="Side Glow Orange"
transform="translate(-5.5)"><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1557.5166,983.15848 10.1882,18.67832 0.4245,29.7155 -2.9716,23.3479 -13.1597,25.4704 -13.1597,12.7352 -16.5558,8.0657 c 0,0 -2.547,2.547 -2.9715,4.245 -0.4245,1.6981 5.0941,39.0547 5.0941,39.0547 l 6.3676,26.3194 3.396,22.9234 -7.2166,5.9431 -26.7439,-0.4245"
id="path60" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1746.4223,1013.723 -1.6981,33.1115 -12.7352,51.7899 -19.5273,55.1859"
id="path61" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1927.2623,1016.27 -33.1115,134.9933 -13.5843,18.6783"
id="path62" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2098.7491,974.26209 -10.5859,45.38151"
id="path63"
sodipodi:nodetypes="cc" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2048.2174,1063.403 -6.7893,45.7962"
id="path64"
sodipodi:nodetypes="cc" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2065.6123,1152.1404 -11.8609,45.7962"
id="path65"
sodipodi:nodetypes="cc" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2224.4173,969.99876 22.9234,11.03719 12.3107,12.73521 8.4901,27.59294 -5.0941,23.7724"
id="path66" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2249.4632,1127.0664 -4.2451,18.2538 c 0,0 -10.1881,20.8008 -14.0087,22.4989 -3.8206,1.698 -30.989,23.7724 -30.989,23.7724 l -11.8862,4.6696"
id="path67" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2451.9531,970.84778 -7.6411,51.78982"
id="path68" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2389.5506,1024.7602 -36.9322,174.0479"
id="path69" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1932.7809,971.69679 -2.9715,19.95183"
id="path70" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1689.5383,1183.1013 -17.8293,15.7068 -42.8752,8.0656"
id="path71" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1856.3696,1188.1954 -16.1312,10.1882 -16.5558,1.2735"
id="path72" /></g><g
id="g85"
style="display:inline;opacity:0.56405;mix-blend-mode:screen;fill:#ffffff;fill-opacity:1;stroke:#0226ff;stroke-opacity:1;filter:url(#filter87)"
transform="translate(8.693769)"
inkscape:label="Side Glow Blue"
sodipodi:insensitive="true"><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1557.5166,983.15848 10.1882,18.67832 0.4245,29.7155 -2.9716,23.3479 -13.1597,25.4704 -13.1597,12.7352 -16.5558,8.0657 c 0,0 -2.547,2.547 -2.9715,4.245 -0.4245,1.6981 5.0941,39.0547 5.0941,39.0547 l 6.3676,26.3194 3.396,22.9234 -7.2166,5.9431 -26.7439,-0.4245"
id="path73" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1746.4223,1013.723 -1.6981,33.1115 -12.7352,51.7899 -19.5273,55.1859"
id="path74" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1927.2623,1016.27 -33.1115,134.9933 -13.5843,18.6783"
id="path75" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2098.7491,974.26209 -10.5859,45.38151"
id="path76"
sodipodi:nodetypes="cc" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2048.2174,1063.403 -6.7893,45.7962"
id="path77"
sodipodi:nodetypes="cc" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2065.6123,1152.1404 -11.8609,45.7962"
id="path78"
sodipodi:nodetypes="cc" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2224.4173,969.99876 22.9234,11.03719 12.3107,12.73521 8.4901,27.59294 -5.0941,23.7724"
id="path79" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2249.4632,1127.0664 -4.2451,18.2538 c 0,0 -10.1881,20.8008 -14.0087,22.4989 -3.8206,1.698 -30.989,23.7724 -30.989,23.7724 l -11.8862,4.6696"
id="path80" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2451.9531,970.84778 -7.6411,51.78982"
id="path81" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2389.5506,1024.7602 -36.9322,174.0479"
id="path82" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1932.7809,971.69679 -2.9715,19.95183"
id="path83" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1689.5383,1183.1013 -17.8293,15.7068 -42.8752,8.0656"
id="path84" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1856.3696,1188.1954 -16.1312,10.1882 -16.5558,1.2735"
id="path85" /></g></g><g
id="g16"
transform="translate(9.5737285,-66.875187)"><text
transform="translate(47.631095,-5.559592)"
inkscape:label="Slogan"><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:67.5143px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;opacity:1;fill:#0056f5;fill-opacity:1;stroke:none;stroke-width:16.8787;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
x="1480.9904"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:67.5143px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;opacity:1;fill:#0056f5;fill-opacity:1;stroke:none;stroke-width:16.8787;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
x="1835.4407"
y="1349.8354"
id="text15"><tspan
sodipodi:role="line"
id="tspan15"
x="1480.9904"
x="1835.4407"
y="1349.8354"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Kode Mono';-inkscape-font-specification:'Kode Mono Bold';fill:#0056f5;fill-opacity:1;stroke-width:16.8787">COMPUTER! ZOOM IN!</tspan></text><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:67.5143px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;opacity:1;fill:#00f526;fill-opacity:1;stroke:none;stroke-width:16.8787;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
x="1480.9904"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:67.5143px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;opacity:1;fill:#00f526;fill-opacity:1;stroke:none;stroke-width:16.8787;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
x="1835.4407"
y="1342.0404"
id="text16"><tspan
sodipodi:role="line"
id="tspan16"
x="1480.9904"
x="1835.4407"
y="1342.0404"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Kode Mono';-inkscape-font-specification:'Kode Mono Bold';fill:#00f526;fill-opacity:1;stroke-width:16.8787">COMPUTER! ZOOM IN!</tspan></text><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:67.5143px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;opacity:1;fill:#00cbf5;fill-opacity:1;stroke:none;stroke-width:16.8787;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
x="1480.9904"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:67.5143px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;opacity:1;fill:#00cbf5;fill-opacity:1;stroke:none;stroke-width:16.8787;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
x="1835.4407"
y="1344.5404"
id="text14"><tspan
sodipodi:role="line"
id="tspan14"
x="1480.9904"
x="1835.4407"
y="1344.5404"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Kode Mono';-inkscape-font-specification:'Kode Mono Bold';fill:#00cbf5;fill-opacity:1;stroke-width:16.8787">COMPUTER! ZOOM IN!</tspan></text></g><rect
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Kode Mono';-inkscape-font-specification:'Kode Mono Bold';fill:#00cbf5;fill-opacity:1;stroke-width:16.8787">COMPUTER! ZOOM IN!</tspan></text></g><g
id="g27"
transform="translate(38.057367,61.315595)"
style="display:inline"
inkscape:label="Glow FX"><rect
style="opacity:0.208678;mix-blend-mode:screen;fill:url(#linearGradient4);stroke:none;stroke-width:9.67817;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3"
width="4009.1892"
@ -420,7 +588,7 @@
y="987.79419"
ry="0.045129254" /><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:642.307px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;opacity:0.05319149;mix-blend-mode:screen;fill:#04ff1d;fill-opacity:1;stroke-width:16.0577;stroke-linecap:round;stroke-linejoin:round"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:642.307px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;opacity:0.0531915;mix-blend-mode:screen;fill:#04ff1d;fill-opacity:1;stroke-width:16.0577;stroke-linecap:round;stroke-linejoin:round"
x="1045.7648"
y="1203.9724"
id="text17"
@ -431,7 +599,7 @@
y="1203.9724"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:#04ff1d;fill-opacity:1;stroke-width:16.0577">ROJECT</tspan></text><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:650.011px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;opacity:0.07021277;mix-blend-mode:screen;fill:#ea04ff;fill-opacity:1;stroke-width:16.2503;stroke-linecap:round;stroke-linejoin:round"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:650.011px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;opacity:0.0702127;mix-blend-mode:screen;fill:#ea04ff;fill-opacity:1;stroke-width:16.2503;stroke-linecap:round;stroke-linejoin:round"
x="1042.5992"
y="1194.2871"
id="text18"
@ -442,7 +610,7 @@
y="1194.2871"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:#ea04ff;fill-opacity:1;stroke-width:16.2503">ROJECT</tspan></text><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:650.011px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;opacity:0.02553191;mix-blend-mode:screen;fill:#f7ff04;fill-opacity:1;stroke-width:16.2503;stroke-linecap:round;stroke-linejoin:round"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:650.011px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;opacity:0.0255319;mix-blend-mode:screen;fill:#f7ff04;fill-opacity:1;stroke-width:16.2503;stroke-linecap:round;stroke-linejoin:round"
x="1056.5159"
y="1201.1315"
id="text19"
@ -452,7 +620,7 @@
x="1056.5159"
y="1201.1315"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:#f7ff04;fill-opacity:1;stroke-width:16.2503">ROJECT</tspan></text><ellipse
style="opacity:0.01652893;mix-blend-mode:screen;fill:url(#radialGradient20);fill-opacity:1;stroke:none;stroke-width:18.4735;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
style="opacity:0.0165289;mix-blend-mode:screen;fill:url(#radialGradient20);fill-opacity:1;stroke:none;stroke-width:18.4735;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path19"
cx="1936.1583"
cy="1044.0532"
@ -464,7 +632,7 @@
cy="1096.7087"
rx="314.21021"
ry="314.69763" /><ellipse
style="opacity:0.10638298;mix-blend-mode:screen;fill:url(#radialGradient24);fill-opacity:1;stroke:none;stroke-width:13.8885;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter24)"
style="opacity:0.106383;mix-blend-mode:screen;fill:url(#radialGradient24);fill-opacity:1;stroke:none;stroke-width:13.8885;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter24)"
id="ellipse24"
cx="1500.5537"
cy="1304.9374"
@ -478,7 +646,7 @@
y="-1783.2252"
ry="0.049766306"
transform="rotate(100.78149)" /><ellipse
style="opacity:0.10743802;mix-blend-mode:screen;fill:url(#radialGradient25);fill-opacity:1;stroke:none;stroke-width:13.8885;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter24)"
style="display:inline;opacity:0.107438;mix-blend-mode:screen;fill:url(#radialGradient25);fill-opacity:1;stroke:none;stroke-width:13.8885;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter24)"
id="ellipse25"
cx="1653.7334"
cy="845.39844"

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

@ -0,0 +1,863 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="3840"
height="2160"
viewBox="0 0 3840 2160"
version="1.1"
id="svg5"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="default.svg"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview7"
pagecolor="#333333"
bordercolor="#404040"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#333333"
inkscape:document-units="px"
showgrid="false"
inkscape:zoom="0.41781006"
inkscape:cx="-1493.5016"
inkscape:cy="3112.6584"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g101" /><defs
id="defs2"><linearGradient
id="linearGradient99"
inkscape:collect="never"><stop
style="stop-color:#04ffd1;stop-opacity:0.51381218;"
offset="0"
id="stop101" /><stop
style="stop-color:#04ffd1;stop-opacity:1;"
offset="1"
id="stop100" /></linearGradient><linearGradient
id="linearGradient97"
inkscape:collect="never"><stop
style="stop-color:#e93978;stop-opacity:0.62430942;"
offset="0"
id="stop99" /><stop
style="stop-color:#e93978;stop-opacity:1;"
offset="1"
id="stop98" /></linearGradient><linearGradient
id="linearGradient95"
inkscape:collect="never"><stop
style="stop-color:#04bdff;stop-opacity:0.53867406;"
offset="0"
id="stop97" /><stop
style="stop-color:#04bdff;stop-opacity:1;"
offset="1"
id="stop96" /></linearGradient><linearGradient
id="linearGradient94"
inkscape:collect="never"><stop
style="stop-color:#282b3c;stop-opacity:1;"
offset="0"
id="stop94" /><stop
style="stop-color:#000000;stop-opacity:1;"
offset="1"
id="stop95" /></linearGradient><linearGradient
id="linearGradient90"
inkscape:collect="never"><stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop90" /><stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop91" /></linearGradient><linearGradient
id="linearGradient19"
inkscape:collect="never"><stop
style="stop-color:#040bff;stop-opacity:0;"
offset="0.37807184"
id="stop19" /><stop
style="stop-color:#28ece5;stop-opacity:0.26666668;"
offset="0.71330941"
id="stop22" /><stop
style="stop-color:#15ff04;stop-opacity:0.5333333;"
offset="0.86158413"
id="stop21" /><stop
style="stop-color:#f8de48;stop-opacity:1;"
offset="0.93746954"
id="stop23" /><stop
style="stop-color:#ff0404;stop-opacity:0;"
offset="1"
id="stop20" /></linearGradient><linearGradient
id="linearGradient3"
inkscape:collect="never"><stop
style="stop-color:#0495ff;stop-opacity:0;"
offset="0"
id="stop3" /><stop
style="stop-color:#0495ff;stop-opacity:1;"
offset="0.46630496"
id="stop15" /><stop
style="stop-color:#0495ff;stop-opacity:0;"
offset="1"
id="stop4" /></linearGradient><linearGradient
id="linearGradient12"
inkscape:collect="never"><stop
style="stop-color:#00bcf5;stop-opacity:1;"
offset="0"
id="stop12" /><stop
style="stop-color:#296af5;stop-opacity:0.65098041;"
offset="0.3475728"
id="stop14" /><stop
style="stop-color:#7800f5;stop-opacity:0;"
offset="1"
id="stop13" /></linearGradient><linearGradient
id="linearGradient9"
inkscape:collect="never"><stop
style="stop-color:#ff26a7;stop-opacity:1;"
offset="0"
id="stop9" /><stop
style="stop-color:#ff3426;stop-opacity:1;"
offset="1"
id="stop10" /></linearGradient><linearGradient
id="linearGradient7"
inkscape:collect="never"><stop
style="stop-color:#2636ff;stop-opacity:1;"
offset="0"
id="stop7" /><stop
style="stop-color:#29006f;stop-opacity:1;"
offset="1"
id="stop8" /></linearGradient><linearGradient
id="linearGradient5"
inkscape:collect="never"><stop
style="stop-color:#beffc5;stop-opacity:1;"
offset="0"
id="stop5" /><stop
style="stop-color:#26c5ff;stop-opacity:1;"
offset="0.53096259"
id="stop11" /><stop
style="stop-color:#0051eb;stop-opacity:1;"
offset="1"
id="stop6" /></linearGradient><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath7940"><rect
style="fill:#333333;fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect7942"
width="1440"
height="810"
x="0"
y="0" /></clipPath><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient5"
id="linearGradient6"
x1="2094.8511"
y1="824.97723"
x2="2175.8127"
y2="1376.4214"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.69112949,0,0,0.69112949,529.92586,259.08767)" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient7"
id="linearGradient8"
x1="2107.4609"
y1="790.479"
x2="2563.2524"
y2="1203.4646"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.69112949,0,0,0.69112949,529.92586,259.08767)" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient9"
id="linearGradient10"
x1="1966.5072"
y1="1228.4695"
x2="1874.9818"
y2="528.3299"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.69112949,0,0,0.69112949,529.92586,259.08767)" /><filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter10"
x="-0.32921062"
y="-0.82302656"
width="1.6584212"
height="2.6460531"><feGaussianBlur
inkscape:collect="always"
stdDeviation="329.39922"
id="feGaussianBlur10" /></filter><filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter11"
x="-0.017136762"
y="-0.0835418"
width="1.0342735"
height="1.1670836"><feGaussianBlur
inkscape:collect="always"
stdDeviation="11.456677"
id="feGaussianBlur11" /></filter><filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter12"
x="-0.1102434"
y="-0.51284629"
width="1.2203709"
height="2.0256926"><feGaussianBlur
inkscape:collect="always"
stdDeviation="61.763442"
id="feGaussianBlur12" /></filter><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient12"
id="radialGradient13"
cx="1008.5775"
cy="617.15338"
fx="1008.5775"
fy="617.15338"
r="749.229"
gradientTransform="matrix(3.747293,0,0,0.21523126,-1392.2413,742.81336)"
gradientUnits="userSpaceOnUse" /><filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter16"
x="-0.32921062"
y="-0.82302656"
width="1.6584212"
height="2.6460531"><feGaussianBlur
inkscape:collect="always"
stdDeviation="329.39922"
id="feGaussianBlur16" /></filter><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient3"
id="linearGradient4"
x1="564.68774"
y1="994.08865"
x2="2793.1636"
y2="994.08865"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.62449476,0,0,0.04518098,-782.4473,78.113255)" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient3"
id="linearGradient15"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.7990724,0,0,0.03619034,-71.449763,1118.434)"
x1="564.68774"
y1="994.08865"
x2="2793.1636"
y2="994.08865" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient3"
id="linearGradient16"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.62449476,0,0,0.01256241,-754.38778,93.218765)"
x1="564.68774"
y1="994.08865"
x2="2793.1636"
y2="994.08865" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient5"
id="linearGradient17"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.4051037,0,0,1.4051038,-1136.1343,-483.68581)"
x1="2094.8511"
y1="824.97723"
x2="2175.8127"
y2="1376.4214" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient19"
id="radialGradient20"
cx="1119.998"
cy="950.70941"
fx="1119.998"
fy="950.70941"
r="624.87445"
gradientTransform="matrix(0.34712042,0,0,0.34765894,-33.450507,-207.77582)"
gradientUnits="userSpaceOnUse" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient19"
id="radialGradient23"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.17454512,0,0,0.1748159,-48.699567,-25.174513)"
cx="1119.998"
cy="950.70941"
fx="1119.998"
fy="950.70941"
r="624.87445" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient19"
id="radialGradient24"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.75180429,0,0,0.75297064,658.53439,589.08112)"
cx="1119.998"
cy="950.70941"
fx="1119.998"
fy="950.70941"
r="624.87445" /><filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter24"
x="-0.166101"
y="-0.16584373"
width="1.332202"
height="1.3316875"><feGaussianBlur
inkscape:collect="always"
stdDeviation="65.026231"
id="feGaussianBlur24" /></filter><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient3"
id="linearGradient24"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.1914799,0,0,0.0138532,-250.58535,-274.02297)"
x1="564.68774"
y1="994.08865"
x2="2793.1636"
y2="994.08865" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient19"
id="radialGradient25"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.75180429,0,0,0.75297064,811.71404,129.54216)"
cx="1119.998"
cy="950.70941"
fx="1119.998"
fy="950.70941"
r="624.87445" /><filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter72"
x="-0.02048285"
y="-0.082298482"
width="1.0409657"
height="1.164597"><feGaussianBlur
inkscape:collect="always"
stdDeviation="6.0393534"
id="feGaussianBlur72" /></filter><filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter87"
x="-0.02092748"
y="-0.084084969"
width="1.041855"
height="1.1681699"><feGaussianBlur
inkscape:collect="always"
stdDeviation="6.2156756"
id="feGaussianBlur87" /></filter><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient90"
id="linearGradient91"
x1="1860.8627"
y1="2098.6846"
x2="1860.8627"
y2="1628.0042"
gradientUnits="userSpaceOnUse" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient90"
id="linearGradient93"
gradientUnits="userSpaceOnUse"
x1="1860.8627"
y1="2338.822"
x2="1860.8627"
y2="1788.3641"
gradientTransform="translate(27.869358,-2338.8221)" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient94"
id="radialGradient95"
cx="1920"
cy="1080"
fx="1920"
fy="1080"
r="1920"
gradientTransform="matrix(1.7192751,0,0,1.324141,-1381.0082,-350.07229)"
gradientUnits="userSpaceOnUse" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient95"
id="radialGradient97"
cx="1083.5778"
cy="591.74402"
fx="1083.5778"
fy="591.74402"
r="184.21703"
gradientTransform="matrix(1,0,0,1.0326088,0,-19.691775)"
gradientUnits="userSpaceOnUse" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient97"
id="radialGradient99"
cx="1097.7074"
cy="1603.3074"
fx="1097.7074"
fy="1603.3074"
r="184.21703"
gradientTransform="matrix(1.6794372,0,0,1.7342017,-743.15021,-1179.0033)"
gradientUnits="userSpaceOnUse" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient99"
id="radialGradient101"
cx="1076.0927"
cy="1088.3387"
fx="1076.0927"
fy="1088.3387"
r="184.21703"
gradientTransform="matrix(1.5456838,0,0,1.5960864,-575.91544,-670.79369)"
gradientUnits="userSpaceOnUse" /></defs><g
inkscape:label="Content"
inkscape:groupmode="layer"
id="layer1"
style="fill:#ffffff;fill-opacity:1"><rect
style="fill:url(#radialGradient95);fill-opacity:1;stroke-linecap:round;stroke-linejoin:round"
id="rect1"
width="3840"
height="2160"
x="0"
y="0"
ry="7.9545546"
inkscape:label="BG" /><rect
style="display:inline;opacity:0.053719;mix-blend-mode:screen;fill:url(#linearGradient15);stroke:none;stroke-width:5.10331;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect15"
width="4009.1892"
height="14.339585"
x="944.46436"
y="1147.2405"
ry="0.045129254" /><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:185.911px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;mix-blend-mode:screen;fill:#04bdff;fill-opacity:1;stroke-width:4.64778;stroke-linecap:round;stroke-linejoin:round"
x="1534.5441"
y="641.80176"
id="text87"
transform="matrix(0.95321043,0,-0.10226778,1.0490863,0,0)"><tspan
sodipodi:role="line"
id="tspan87"
x="0"
y="0"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:#04bdff;fill-opacity:1;stroke-width:4.64778">MY PROJECT</tspan></text><rect
style="fill:url(#radialGradient97);fill-opacity:1;stroke:none;stroke-width:8.33839;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect87"
width="368.43405"
height="380.44824"
x="909.55615"
y="413.65512"
ry="73.820305" /><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:185.911px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;mix-blend-mode:screen;fill:#04ffd1;fill-opacity:1;stroke-width:4.64778;stroke-linecap:round;stroke-linejoin:round"
x="1584.4788"
y="1107.2302"
id="text88"
transform="matrix(0.95321043,0,-0.10226778,1.0490863,0,0)"><tspan
sodipodi:role="line"
id="tspan88"
x="1584.4788"
y="1107.2302"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:#04ffd1;fill-opacity:1;stroke-width:4.64778">SUPER COOL IDEA</tspan></text><rect
style="fill:url(#radialGradient101);fill-opacity:1;stroke:none;stroke-width:8.33839;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect88"
width="368.43405"
height="380.44824"
x="909.55615"
y="901.92981"
ry="73.820305" /><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:185.911px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;mix-blend-mode:screen;fill:#e93978;fill-opacity:1;stroke-width:4.64778;stroke-linecap:round;stroke-linejoin:round"
x="1637.0114"
y="1596.8718"
id="text89"
transform="matrix(0.95321043,0,-0.10226778,1.0490863,0,0)"><tspan
sodipodi:role="line"
id="tspan89"
x="1637.0114"
y="1596.8718"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:#e93978;fill-opacity:1;stroke-width:4.64778">SECRET PROJECT</tspan></text><rect
style="fill:url(#radialGradient99);fill-opacity:1;stroke:none;stroke-width:8.33839;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect89"
width="368.43405"
height="380.44824"
x="909.55615"
y="1415.606"
ry="73.820305" /><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:185.911px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;mix-blend-mode:screen;fill:#e9a939;fill-opacity:1;stroke-width:4.64778;stroke-linecap:round;stroke-linejoin:round"
x="1688.3158"
y="2075.0669"
id="text92"
transform="matrix(0.95321043,0,-0.10226778,1.0490863,0,0)"><tspan
sodipodi:role="line"
id="tspan92"
x="1688.3158"
y="2075.0669"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:#e9a939;fill-opacity:1;stroke-width:4.64778">SECRET PROJECT</tspan></text><rect
style="fill:#e9a939;fill-opacity:1;stroke:none;stroke-width:8.33839;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect92"
width="368.43405"
height="380.44824"
x="909.55615"
y="1917.2737"
ry="73.820305" /><rect
style="display:inline;opacity:1;fill:url(#linearGradient91);fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect90"
width="3829.8118"
height="566.01849"
x="-27.869196"
y="1532.6661"
ry="0"
transform="translate(38.057367,61.315595)" /><rect
style="display:inline;opacity:1;fill:url(#linearGradient93);fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect93"
width="3829.8118"
height="806.15601"
x="0"
y="-806.15601"
ry="0"
transform="scale(1,-1)"
sodipodi:insensitive="true" /><g
id="g101"><rect
style="opacity:0;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:10.5587;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect101"
width="1591.7172"
height="636.85852"
x="-2254.7554"
y="3150.8455"
inkscape:label="export logo"
inkscape:export-filename="C:\rokojori\projects\web-projects\roject\source\rojos\roject-logo-570x240-1592x637.webp"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96" /><g
id="g94"
style="display:inline"
transform="translate(-1830.355,3284.2183)"><rect
style="display:inline;opacity:0.208678;mix-blend-mode:screen;fill:url(#linearGradient4);fill-opacity:1;stroke:none;stroke-width:3.35949;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3"
width="1391.6715"
height="17.90192"
x="-429.80276"
y="114.0762"
ry="0.05634056"
transform="translate(38.057367,61.315595)" /><rect
style="display:inline;opacity:0.163223;mix-blend-mode:screen;fill:url(#linearGradient16);fill-opacity:1;stroke:none;stroke-width:1.77146;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect16"
width="1391.6715"
height="4.9775629"
x="-401.74323"
y="103.21809"
ry="0.015665285"
transform="translate(38.057367,61.315595)" /><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:225.632px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;opacity:0.0702127;mix-blend-mode:screen;fill:#ea04ff;fill-opacity:1;stroke-width:5.64081;stroke-linecap:round;stroke-linejoin:round"
x="5.0927005"
y="186.10992"
id="text18"
transform="matrix(0.95321043,0,-0.10226778,1.0490863,38.057367,61.315595)"><tspan
sodipodi:role="line"
id="tspan18"
x="5.0927005"
y="186.10992"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:#ea04ff;fill-opacity:1;stroke-width:5.64081">ROJECT</tspan></text><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:225.632px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;opacity:0.0255319;mix-blend-mode:screen;fill:#f7ff04;fill-opacity:1;stroke-width:5.64081;stroke-linecap:round;stroke-linejoin:round"
x="9.9234495"
y="188.48569"
id="text19"
transform="matrix(0.95321043,0,-0.10226778,1.0490863,38.057367,61.315595)"><tspan
sodipodi:role="line"
id="tspan19"
x="9.9234495"
y="188.48569"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:#f7ff04;fill-opacity:1;stroke-width:5.64081">ROJECT</tspan></text><ellipse
style="display:inline;opacity:0.0165289;mix-blend-mode:screen;fill:url(#radialGradient20);fill-opacity:1;stroke:none;stroke-width:6.41253;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path19"
cx="355.32367"
cy="122.74678"
rx="216.90669"
ry="217.24318"
transform="translate(38.057367,61.315595)" /><ellipse
style="display:inline;opacity:0.0785124;mix-blend-mode:screen;fill:url(#radialGradient23);fill-opacity:1;stroke:none;stroke-width:3.22446;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="ellipse23"
cx="146.79062"
cy="141.02461"
rx="109.06878"
ry="109.23798"
transform="translate(38.057367,61.315595)" /><ellipse
style="display:inline;opacity:0.106383;mix-blend-mode:screen;fill:url(#radialGradient24);fill-opacity:1;stroke:none;stroke-width:13.8885;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter24)"
id="ellipse24"
cx="1500.5537"
cy="1304.9374"
rx="469.78329"
ry="470.51205"
transform="matrix(0.34712042,0,0,0.34712042,-278.69904,-178.34982)" /><rect
style="display:inline;opacity:0.208678;mix-blend-mode:screen;fill:url(#linearGradient24);fill-opacity:1;stroke:none;stroke-width:1.03007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect24"
width="426.70831"
height="5.4890099"
x="-142.45898"
y="-262.99619"
ry="0.017274901"
transform="rotate(100.78149,-6.3419947,46.404872)" /><ellipse
style="display:inline;opacity:0.107438;mix-blend-mode:screen;fill:url(#radialGradient25);fill-opacity:1;stroke:none;stroke-width:13.8885;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter24)"
id="ellipse25"
cx="1653.7334"
cy="845.39844"
rx="469.78329"
ry="470.51205"
transform="matrix(0.11905646,0,0,0.11905646,105.1045,19.439942)" /><g
id="g26"
inkscape:label="BG Gradient"
transform="matrix(0.34712042,0,0,0.34712042,-278.69901,-178.34983)"><ellipse
style="opacity:1;mix-blend-mode:normal;fill:#0a0066;fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter10)"
id="path10"
cx="1834.5552"
cy="1143.0068"
rx="1200.6875"
ry="480.27499"
transform="matrix(0.69112949,0,0,0.69112949,566.63996,353.0411)" /><ellipse
style="opacity:1;mix-blend-mode:screen;fill:#005d78;fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter16)"
id="ellipse16"
cx="1834.5552"
cy="1143.0068"
rx="1200.6875"
ry="480.27499"
transform="matrix(0.59256734,0,0,0.55929452,795.32629,304.17302)" /></g><g
id="g87"
inkscape:label="Title"
transform="matrix(0.34712042,0,0,0.34712042,-291.90948,-199.63372)"><g
id="g12"
style="filter:url(#filter12)"
transform="matrix(0.69112949,0,0,0.69112949,529.69733,353.12091)"
inkscape:label="Shadow"
sodipodi:insensitive="true"><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:457.124px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke-width:11.4281;stroke-linecap:round;stroke-linejoin:round;filter:url(#filter11)"
x="1423.6522"
y="1196.2206"
id="text11"
transform="matrix(0.95321043,0,-0.10226778,1.0490863,-55,0)"><tspan
sodipodi:role="line"
id="tspan11"
x="1423.6522"
y="1196.2206"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:#000000;fill-opacity:1;stroke-width:11.4281">ROJECT</tspan></text><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:457.124px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke-width:11.4281;stroke-linecap:round;stroke-linejoin:round;filter:url(#filter11)"
x="1423.6522"
y="1196.2206"
id="text12"
transform="matrix(0.95321043,0,-0.10226778,1.0490863,-4.2276373,0)"><tspan
sodipodi:role="line"
id="tspan12"
x="1423.6522"
y="1196.2206"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:#000000;fill-opacity:1;stroke-width:11.4281">ROJECT</tspan></text></g><g
id="g25"
inkscape:label="Title"
transform="translate(38.057367,61.315595)"
sodipodi:insensitive="true"><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:315.932px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;opacity:1;fill:url(#linearGradient10);stroke-width:7.8983;stroke-linecap:round;stroke-linejoin:round"
x="1484.9595"
y="1087.6149"
id="text2"
transform="matrix(0.95321043,0,-0.10226778,1.0490863,0,0)"><tspan
sodipodi:role="line"
id="tspan2"
x="1484.9595"
y="1087.6149"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:url(#linearGradient10);fill-opacity:1;stroke-width:7.8983">ROJECT</tspan></text><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:315.932px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;opacity:1;fill:url(#linearGradient8);stroke-width:7.8983;stroke-linecap:round;stroke-linejoin:round"
x="1498.2201"
y="1087.0574"
id="text1"
transform="matrix(0.95321043,0,-0.10226778,1.0490863,0,0)"><tspan
sodipodi:role="line"
id="tspan1"
x="1498.2201"
y="1087.0574"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:url(#linearGradient8);fill-opacity:1;stroke-width:7.8983">ROJECT</tspan></text><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:315.932px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';writing-mode:lr-tb;direction:ltr;display:inline;opacity:1;fill:url(#linearGradient6);stroke-width:7.8983;stroke-linecap:round;stroke-linejoin:round"
x="1513.8538"
y="1085.8309"
id="text3"
transform="matrix(0.95321043,0,-0.10226778,1.0490863,0,0)"><tspan
sodipodi:role="line"
id="tspan3"
x="1513.8538"
y="1085.8309"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';fill:url(#linearGradient6);fill-opacity:1;stroke-width:7.8983">ROJECT</tspan></text></g><g
id="g86"
style="display:inline;opacity:0.725207;fill:#ffffff;fill-opacity:1"
inkscape:label="White Highlights"><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1435.1443,979.66538 -33.5441,159.29112"
id="path27"
sodipodi:nodetypes="cc" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1889.9057,980.18693 -29.7155,137.11577"
id="path28" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1758.3085,1109.6616 c 0,0 -13.1597,29.7155 -1.6981,57.733"
id="path29" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1967.5806,978.4889 -25.0459,123.9561"
id="path30" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2347.5271,1026.7226 -25.0459,123.9561"
id="path31" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2305.0736,979.12567 -7.4288,32.05033"
id="path32" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2195.5452,978.27595 c 0,0 -19.6906,4.89329 -28.4589,9.76086 -11.5655,6.42041 -22.4448,14.77749 -30.7788,25.05009 -8.2702,10.194 -13.5851,22.6594 -18.0282,35.0113 -5.8348,16.2213 -11.0372,50.5248 -11.0372,50.5248"
id="path33"
sodipodi:nodetypes="caaac" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1678.5133,978.27595 c 0,0 -19.6906,4.89329 -28.4589,9.76086 -11.5655,6.42041 -22.4448,14.77749 -30.7788,25.05009 -8.2702,10.194 -13.5851,22.6594 -18.0282,35.0113 -5.8348,16.2213 -11.0372,50.5248 -11.0372,50.5248"
id="path34"
sodipodi:nodetypes="caaac" /><path
style="opacity:1;fill:#ff0404;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1935.7525,1136.8301 -6.3677,29.7155"
id="path57" /><path
style="opacity:1;fill:#ff0404;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1394.5059,1165.6965 -5.0941,20.8009"
id="path58" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2101.3102,1128.7644 c 0,0 -1.7724,9.7315 -1.698,14.6455 0.081,5.3581 0.4954,10.8723 2.3341,15.9057 1.6585,4.5402 4.6858,8.499 7.6384,12.3261 2.3234,3.0117 4.93,5.8463 7.8568,8.2758 3.3069,2.7451 10.8249,7.0044 10.8249,7.0044"
id="path59"
sodipodi:nodetypes="caaaac" /></g><g
id="g65"
style="display:inline;opacity:0.549587;mix-blend-mode:screen;fill:#ffffff;fill-opacity:1;stroke:#ff9f02;stroke-opacity:1;filter:url(#filter72)"
inkscape:label="Side Glow Orange"
transform="translate(-5.5)"><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1557.5166,983.15848 10.1882,18.67832 0.4245,29.7155 -2.9716,23.3479 -13.1597,25.4704 -13.1597,12.7352 -16.5558,8.0657 c 0,0 -2.547,2.547 -2.9715,4.245 -0.4245,1.6981 5.0941,39.0547 5.0941,39.0547 l 6.3676,26.3194 3.396,22.9234 -7.2166,5.9431 -26.7439,-0.4245"
id="path60" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1746.4223,1013.723 -1.6981,33.1115 -12.7352,51.7899 -19.5273,55.1859"
id="path61" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1927.2623,1016.27 -33.1115,134.9933 -13.5843,18.6783"
id="path62" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2098.7491,974.26209 -10.5859,45.38151"
id="path63"
sodipodi:nodetypes="cc" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2048.2174,1063.403 -6.7893,45.7962"
id="path64"
sodipodi:nodetypes="cc" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2065.6123,1152.1404 -11.8609,45.7962"
id="path65"
sodipodi:nodetypes="cc" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2224.4173,969.99876 22.9234,11.03719 12.3107,12.73521 8.4901,27.59294 -5.0941,23.7724"
id="path66" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2249.4632,1127.0664 -4.2451,18.2538 c 0,0 -10.1881,20.8008 -14.0087,22.4989 -3.8206,1.698 -30.989,23.7724 -30.989,23.7724 l -11.8862,4.6696"
id="path67" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2451.9531,970.84778 -7.6411,51.78982"
id="path68" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2389.5506,1024.7602 -36.9322,174.0479"
id="path69" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1932.7809,971.69679 -2.9715,19.95183"
id="path70" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1689.5383,1183.1013 -17.8293,15.7068 -42.8752,8.0656"
id="path71" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9f02;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1856.3696,1188.1954 -16.1312,10.1882 -16.5558,1.2735"
id="path72" /></g><g
id="g85"
style="display:inline;opacity:0.56405;mix-blend-mode:screen;fill:#ffffff;fill-opacity:1;stroke:#0226ff;stroke-opacity:1;filter:url(#filter87)"
transform="translate(8.693769)"
inkscape:label="Side Glow Blue"
sodipodi:insensitive="true"><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1557.5166,983.15848 10.1882,18.67832 0.4245,29.7155 -2.9716,23.3479 -13.1597,25.4704 -13.1597,12.7352 -16.5558,8.0657 c 0,0 -2.547,2.547 -2.9715,4.245 -0.4245,1.6981 5.0941,39.0547 5.0941,39.0547 l 6.3676,26.3194 3.396,22.9234 -7.2166,5.9431 -26.7439,-0.4245"
id="path73" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1746.4223,1013.723 -1.6981,33.1115 -12.7352,51.7899 -19.5273,55.1859"
id="path74" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1927.2623,1016.27 -33.1115,134.9933 -13.5843,18.6783"
id="path75" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2098.7491,974.26209 -10.5859,45.38151"
id="path76"
sodipodi:nodetypes="cc" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2048.2174,1063.403 -6.7893,45.7962"
id="path77"
sodipodi:nodetypes="cc" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2065.6123,1152.1404 -11.8609,45.7962"
id="path78"
sodipodi:nodetypes="cc" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2224.4173,969.99876 22.9234,11.03719 12.3107,12.73521 8.4901,27.59294 -5.0941,23.7724"
id="path79" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2249.4632,1127.0664 -4.2451,18.2538 c 0,0 -10.1881,20.8008 -14.0087,22.4989 -3.8206,1.698 -30.989,23.7724 -30.989,23.7724 l -11.8862,4.6696"
id="path80" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2451.9531,970.84778 -7.6411,51.78982"
id="path81" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 2389.5506,1024.7602 -36.9322,174.0479"
id="path82" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1932.7809,971.69679 -2.9715,19.95183"
id="path83" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1689.5383,1183.1013 -17.8293,15.7068 -42.8752,8.0656"
id="path84" /><path
style="opacity:1;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1856.3696,1188.1954 -16.1312,10.1882 -16.5558,1.2735"
id="path85" /></g></g><g
id="g16"
transform="matrix(0.34712042,0,0,0.34712042,-275.37576,-201.56357)"
inkscape:label="Slogan"><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:67.5143px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;opacity:1;fill:#0056f5;fill-opacity:1;stroke:none;stroke-width:16.8787;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
x="1835.4407"
y="1349.8354"
id="text15"><tspan
sodipodi:role="line"
id="tspan15"
x="1835.4407"
y="1349.8354"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Kode Mono';-inkscape-font-specification:'Kode Mono Bold';fill:#0056f5;fill-opacity:1;stroke-width:16.8787">COMPUTER! ZOOM IN!</tspan></text><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:67.5143px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;opacity:1;fill:#00f526;fill-opacity:1;stroke:none;stroke-width:16.8787;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
x="1835.4407"
y="1342.0404"
id="text16"><tspan
sodipodi:role="line"
id="tspan16"
x="1835.4407"
y="1342.0404"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Kode Mono';-inkscape-font-specification:'Kode Mono Bold';fill:#00f526;fill-opacity:1;stroke-width:16.8787">COMPUTER! ZOOM IN!</tspan></text><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:900;font-stretch:normal;font-size:67.5143px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Heavy Italic';text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;opacity:1;fill:#00cbf5;fill-opacity:1;stroke:none;stroke-width:16.8787;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
x="1835.4407"
y="1344.5404"
id="text14"><tspan
sodipodi:role="line"
id="tspan14"
x="1835.4407"
y="1344.5404"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Kode Mono';-inkscape-font-specification:'Kode Mono Bold';fill:#00cbf5;fill-opacity:1;stroke-width:16.8787">COMPUTER! ZOOM IN!</tspan></text></g></g><rect
style="opacity:0;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect102"
width="569.68854"
height="240.27089"
x="-1743.7411"
y="3349.1392" /></g><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:500;font-stretch:normal;font-size:56px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Medium Italic';writing-mode:lr-tb;direction:ltr;display:inline;mix-blend-mode:screen;fill:#04bdff;fill-opacity:1;stroke-width:2.26031;stroke-linecap:round;stroke-linejoin:round"
x="3479.2214"
y="127.57011"
id="text91"
transform="matrix(0.95321043,0,-0.10226778,1.0490863,0,0)"><tspan
sodipodi:role="line"
id="tspan91"
x="3479.2214"
y="127.57011"
style="font-style:italic;font-variant:normal;font-weight:500;font-stretch:normal;font-size:56px;font-family:Barlow;-inkscape-font-specification:'Barlow Medium Italic';fill:#04bdff;fill-opacity:1;stroke-width:2.26031">josef@rokojori.com</tspan></text></g></svg>

After

Width:  |  Height:  |  Size: 49 KiB

View File

@ -0,0 +1,372 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
ITALIC NEON — PATTERN TEMPLATE
================================
HOW TO USE:
1. File > Save As > pattern-01.svg (increment number for each new pattern)
2. Edit ONLY the "Pattern (edit this)" layer — all other layers are guides
3. Draw white shapes (fill="#ffffff") within the 0-100 coordinate area
4. Shapes: use <rect rx="..." ry="..."> for circles/pills, or <ellipse>
- Circle: <rect x="35" y="35" width="30" height="30" rx="15" ry="15" fill="#ffffff"/>
- Horizontal pill: <rect x="20" y="42" width="60" height="16" rx="8" ry="8" fill="#ffffff"/>
- Ellipse: <ellipse cx="50" cy="50" rx="25" ry="15" fill="#ffffff"/>
5. Stay within x: 0-100, y: 0-100. Leave ~5 units of margin from edges.
6. Aim for 1-8 shapes, non-overlapping, with geometric/symmetric relations.
7. The skew is applied at render time — draw flat, it will look correct in the icon.
The black rect is the inner icon area. The purple rect is the outer chrome (color varies per project at runtime).
-->
<svg
width="540"
height="540"
viewBox="-20 -20 140 140"
version="1.1"
id="template"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="pattern-01.svg"
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"
xmlns:sodipodi0="http://sodipodi.sourceforge.net/DTD/sodipodi-0.0.dtd">
<defs
id="defs30" />
<sodipodi:namedview
id="namedview30"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.1614884"
inkscape:cx="224.2812"
inkscape:cy="238.05663"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer-pattern" />
<sodipodi0:namedview
id="namedview"
pagecolor="#1a1a2e"
bordercolor="#555555"
inkscape:document-units="px"
showgrid="true"
inkscape:current-layer="layer-pattern">
<inkscape:grid
type="xygrid"
units="px"
spacingx="5"
spacingy="5"
empspacing="2"
color="#2a2a4a"
empcolor="#3a3a6a"
opacity="0.8"
empopacity="1" />
</sodipodi0:namedview>
<!-- CHROME GUIDE — locked, context only, not exported as pattern data -->
<g
inkscape:label="Chrome (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-chrome"
sodipodi0:insensitive="true">
<!-- Outer colored rect: placeholder purple, will use project color at runtime -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="#6600cc"
opacity="0.35"
id="rect1" />
<!-- Glow hint -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="none"
stroke="#8833ff"
stroke-width="1.5"
opacity="0.5"
id="rect2" />
<!-- Inner black area = the 0,0 → 100,100 pattern space -->
<rect
x="0"
y="0"
width="100"
height="100"
rx="14"
ry="14"
fill="#000000"
id="rect3" />
</g>
<!-- GRID GUIDE — locked -->
<g
inkscape:label="Grid (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-grid"
sodipodi0:insensitive="true">
<!-- Minor lines every 10 units -->
<line
x1="10"
y1="0"
x2="10"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line3" />
<line
x1="20"
y1="0"
x2="20"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line4" />
<line
x1="30"
y1="0"
x2="30"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line5" />
<line
x1="40"
y1="0"
x2="40"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line6" />
<line
x1="60"
y1="0"
x2="60"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line7" />
<line
x1="70"
y1="0"
x2="70"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line8" />
<line
x1="80"
y1="0"
x2="80"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line9" />
<line
x1="90"
y1="0"
x2="90"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line10" />
<line
x1="0"
y1="10"
x2="100"
y2="10"
stroke="#1e1e3a"
stroke-width="0.5"
id="line11" />
<line
x1="0"
y1="20"
x2="100"
y2="20"
stroke="#1e1e3a"
stroke-width="0.5"
id="line12" />
<line
x1="0"
y1="30"
x2="100"
y2="30"
stroke="#1e1e3a"
stroke-width="0.5"
id="line13" />
<line
x1="0"
y1="40"
x2="100"
y2="40"
stroke="#1e1e3a"
stroke-width="0.5"
id="line14" />
<line
x1="0"
y1="60"
x2="100"
y2="60"
stroke="#1e1e3a"
stroke-width="0.5"
id="line15" />
<line
x1="0"
y1="70"
x2="100"
y2="70"
stroke="#1e1e3a"
stroke-width="0.5"
id="line16" />
<line
x1="0"
y1="80"
x2="100"
y2="80"
stroke="#1e1e3a"
stroke-width="0.5"
id="line17" />
<line
x1="0"
y1="90"
x2="100"
y2="90"
stroke="#1e1e3a"
stroke-width="0.5"
id="line18" />
<!-- Center crosshair -->
<line
x1="50"
y1="0"
x2="50"
y2="100"
stroke="#2a2a5a"
stroke-width="0.8"
id="line19" />
<line
x1="0"
y1="50"
x2="100"
y2="50"
stroke="#2a2a5a"
stroke-width="0.8"
id="line20" />
<!-- Pattern area border -->
<rect
x="0"
y="0"
width="100"
height="100"
fill="none"
stroke="#333366"
stroke-width="0.6"
id="rect20" />
<!-- Quarter markers -->
<rect
x="25"
y="0"
width="50"
height="0"
fill="none"
stroke="#2a2a5a"
stroke-width="0.4"
id="rect21" />
<text
x="1"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text21">0</text>
<text
x="23"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text22">25</text>
<text
x="48"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text23">50</text>
<text
x="73"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text24">75</text>
<text
x="97"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text25">100</text>
<text
x="-14"
y="4"
font-size="3"
fill="#444488"
font-family="monospace"
id="text26">0</text>
<text
x="-14"
y="29"
font-size="3"
fill="#444488"
font-family="monospace"
id="text27">25</text>
<text
x="-14"
y="54"
font-size="3"
fill="#444488"
font-family="monospace"
id="text28">50</text>
<text
x="-14"
y="79"
font-size="3"
fill="#444488"
font-family="monospace"
id="text29">75</text>
<text
x="-18"
y="103"
font-size="3"
fill="#444488"
font-family="monospace"
id="text30">100</text>
</g>
<!-- PATTERN — edit this layer only -->
<!-- Shapes must use fill="#ffffff". Stay within 0-100. -->
<g
inkscape:label="Pattern (edit this)"
inkscape:groupmode="layer"
id="layer-pattern">
<!-- Example: single centered circle. Replace with your design. -->
<rect
x="35"
y="35"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect30" />
</g>
</svg>

View File

@ -0,0 +1,381 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
ITALIC NEON — PATTERN TEMPLATE
================================
HOW TO USE:
1. File > Save As > pattern-01.svg (increment number for each new pattern)
2. Edit ONLY the "Pattern (edit this)" layer — all other layers are guides
3. Draw white shapes (fill="#ffffff") within the 0-100 coordinate area
4. Shapes: use <rect rx="..." ry="..."> for circles/pills, or <ellipse>
- Circle: <rect x="35" y="35" width="30" height="30" rx="15" ry="15" fill="#ffffff"/>
- Horizontal pill: <rect x="20" y="42" width="60" height="16" rx="8" ry="8" fill="#ffffff"/>
- Ellipse: <ellipse cx="50" cy="50" rx="25" ry="15" fill="#ffffff"/>
5. Stay within x: 0-100, y: 0-100. Leave ~5 units of margin from edges.
6. Aim for 1-8 shapes, non-overlapping, with geometric/symmetric relations.
7. The skew is applied at render time — draw flat, it will look correct in the icon.
The black rect is the inner icon area. The purple rect is the outer chrome (color varies per project at runtime).
-->
<svg
width="540"
height="540"
viewBox="-20 -20 140 140"
version="1.1"
id="template"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="pattern-02.svg"
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"
xmlns:sodipodi0="http://sodipodi.sourceforge.net/DTD/sodipodi-0.0.dtd">
<defs
id="defs30" />
<sodipodi:namedview
id="namedview30"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.1614884"
inkscape:cx="224.2812"
inkscape:cy="238.05663"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer-pattern" />
<sodipodi0:namedview
id="namedview"
pagecolor="#1a1a2e"
bordercolor="#555555"
inkscape:document-units="px"
showgrid="true"
inkscape:current-layer="layer-pattern">
<inkscape:grid
type="xygrid"
units="px"
spacingx="5"
spacingy="5"
empspacing="2"
color="#2a2a4a"
empcolor="#3a3a6a"
opacity="0.8"
empopacity="1" />
</sodipodi0:namedview>
<!-- CHROME GUIDE — locked, context only, not exported as pattern data -->
<g
inkscape:label="Chrome (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-chrome"
sodipodi0:insensitive="true">
<!-- Outer colored rect: placeholder purple, will use project color at runtime -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="#6600cc"
opacity="0.35"
id="rect1" />
<!-- Glow hint -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="none"
stroke="#8833ff"
stroke-width="1.5"
opacity="0.5"
id="rect2" />
<!-- Inner black area = the 0,0 → 100,100 pattern space -->
<rect
x="0"
y="0"
width="100"
height="100"
rx="14"
ry="14"
fill="#000000"
id="rect3" />
</g>
<!-- GRID GUIDE — locked -->
<g
inkscape:label="Grid (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-grid"
sodipodi0:insensitive="true">
<!-- Minor lines every 10 units -->
<line
x1="10"
y1="0"
x2="10"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line3" />
<line
x1="20"
y1="0"
x2="20"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line4" />
<line
x1="30"
y1="0"
x2="30"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line5" />
<line
x1="40"
y1="0"
x2="40"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line6" />
<line
x1="60"
y1="0"
x2="60"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line7" />
<line
x1="70"
y1="0"
x2="70"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line8" />
<line
x1="80"
y1="0"
x2="80"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line9" />
<line
x1="90"
y1="0"
x2="90"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line10" />
<line
x1="0"
y1="10"
x2="100"
y2="10"
stroke="#1e1e3a"
stroke-width="0.5"
id="line11" />
<line
x1="0"
y1="20"
x2="100"
y2="20"
stroke="#1e1e3a"
stroke-width="0.5"
id="line12" />
<line
x1="0"
y1="30"
x2="100"
y2="30"
stroke="#1e1e3a"
stroke-width="0.5"
id="line13" />
<line
x1="0"
y1="40"
x2="100"
y2="40"
stroke="#1e1e3a"
stroke-width="0.5"
id="line14" />
<line
x1="0"
y1="60"
x2="100"
y2="60"
stroke="#1e1e3a"
stroke-width="0.5"
id="line15" />
<line
x1="0"
y1="70"
x2="100"
y2="70"
stroke="#1e1e3a"
stroke-width="0.5"
id="line16" />
<line
x1="0"
y1="80"
x2="100"
y2="80"
stroke="#1e1e3a"
stroke-width="0.5"
id="line17" />
<line
x1="0"
y1="90"
x2="100"
y2="90"
stroke="#1e1e3a"
stroke-width="0.5"
id="line18" />
<!-- Center crosshair -->
<line
x1="50"
y1="0"
x2="50"
y2="100"
stroke="#2a2a5a"
stroke-width="0.8"
id="line19" />
<line
x1="0"
y1="50"
x2="100"
y2="50"
stroke="#2a2a5a"
stroke-width="0.8"
id="line20" />
<!-- Pattern area border -->
<rect
x="0"
y="0"
width="100"
height="100"
fill="none"
stroke="#333366"
stroke-width="0.6"
id="rect20" />
<!-- Quarter markers -->
<rect
x="25"
y="0"
width="50"
height="0"
fill="none"
stroke="#2a2a5a"
stroke-width="0.4"
id="rect21" />
<text
x="1"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text21">0</text>
<text
x="23"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text22">25</text>
<text
x="48"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text23">50</text>
<text
x="73"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text24">75</text>
<text
x="97"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text25">100</text>
<text
x="-14"
y="4"
font-size="3"
fill="#444488"
font-family="monospace"
id="text26">0</text>
<text
x="-14"
y="29"
font-size="3"
fill="#444488"
font-family="monospace"
id="text27">25</text>
<text
x="-14"
y="54"
font-size="3"
fill="#444488"
font-family="monospace"
id="text28">50</text>
<text
x="-14"
y="79"
font-size="3"
fill="#444488"
font-family="monospace"
id="text29">75</text>
<text
x="-18"
y="103"
font-size="3"
fill="#444488"
font-family="monospace"
id="text30">100</text>
</g>
<!-- PATTERN — edit this layer only -->
<!-- Shapes must use fill="#ffffff". Stay within 0-100. -->
<g
inkscape:label="Pattern (edit this)"
inkscape:groupmode="layer"
id="layer-pattern">
<!-- Example: single centered circle. Replace with your design. -->
<rect
x="61.562344"
y="10.000148"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect30" />
<rect
x="9.5537233"
y="62.678406"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect31" />
</g>
</svg>

View File

@ -0,0 +1,381 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
ITALIC NEON — PATTERN TEMPLATE
================================
HOW TO USE:
1. File > Save As > pattern-01.svg (increment number for each new pattern)
2. Edit ONLY the "Pattern (edit this)" layer — all other layers are guides
3. Draw white shapes (fill="#ffffff") within the 0-100 coordinate area
4. Shapes: use <rect rx="..." ry="..."> for circles/pills, or <ellipse>
- Circle: <rect x="35" y="35" width="30" height="30" rx="15" ry="15" fill="#ffffff"/>
- Horizontal pill: <rect x="20" y="42" width="60" height="16" rx="8" ry="8" fill="#ffffff"/>
- Ellipse: <ellipse cx="50" cy="50" rx="25" ry="15" fill="#ffffff"/>
5. Stay within x: 0-100, y: 0-100. Leave ~5 units of margin from edges.
6. Aim for 1-8 shapes, non-overlapping, with geometric/symmetric relations.
7. The skew is applied at render time — draw flat, it will look correct in the icon.
The black rect is the inner icon area. The purple rect is the outer chrome (color varies per project at runtime).
-->
<svg
width="540"
height="540"
viewBox="-20 -20 140 140"
version="1.1"
id="template"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="pattern-03.svg"
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"
xmlns:sodipodi0="http://sodipodi.sourceforge.net/DTD/sodipodi-0.0.dtd">
<defs
id="defs30" />
<sodipodi:namedview
id="namedview30"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.1614884"
inkscape:cx="224.2812"
inkscape:cy="238.05663"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer-pattern" />
<sodipodi0:namedview
id="namedview"
pagecolor="#1a1a2e"
bordercolor="#555555"
inkscape:document-units="px"
showgrid="true"
inkscape:current-layer="layer-pattern">
<inkscape:grid
type="xygrid"
units="px"
spacingx="5"
spacingy="5"
empspacing="2"
color="#2a2a4a"
empcolor="#3a3a6a"
opacity="0.8"
empopacity="1" />
</sodipodi0:namedview>
<!-- CHROME GUIDE — locked, context only, not exported as pattern data -->
<g
inkscape:label="Chrome (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-chrome"
sodipodi0:insensitive="true">
<!-- Outer colored rect: placeholder purple, will use project color at runtime -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="#6600cc"
opacity="0.35"
id="rect1" />
<!-- Glow hint -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="none"
stroke="#8833ff"
stroke-width="1.5"
opacity="0.5"
id="rect2" />
<!-- Inner black area = the 0,0 → 100,100 pattern space -->
<rect
x="0"
y="0"
width="100"
height="100"
rx="14"
ry="14"
fill="#000000"
id="rect3" />
</g>
<!-- GRID GUIDE — locked -->
<g
inkscape:label="Grid (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-grid"
sodipodi0:insensitive="true">
<!-- Minor lines every 10 units -->
<line
x1="10"
y1="0"
x2="10"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line3" />
<line
x1="20"
y1="0"
x2="20"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line4" />
<line
x1="30"
y1="0"
x2="30"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line5" />
<line
x1="40"
y1="0"
x2="40"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line6" />
<line
x1="60"
y1="0"
x2="60"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line7" />
<line
x1="70"
y1="0"
x2="70"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line8" />
<line
x1="80"
y1="0"
x2="80"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line9" />
<line
x1="90"
y1="0"
x2="90"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line10" />
<line
x1="0"
y1="10"
x2="100"
y2="10"
stroke="#1e1e3a"
stroke-width="0.5"
id="line11" />
<line
x1="0"
y1="20"
x2="100"
y2="20"
stroke="#1e1e3a"
stroke-width="0.5"
id="line12" />
<line
x1="0"
y1="30"
x2="100"
y2="30"
stroke="#1e1e3a"
stroke-width="0.5"
id="line13" />
<line
x1="0"
y1="40"
x2="100"
y2="40"
stroke="#1e1e3a"
stroke-width="0.5"
id="line14" />
<line
x1="0"
y1="60"
x2="100"
y2="60"
stroke="#1e1e3a"
stroke-width="0.5"
id="line15" />
<line
x1="0"
y1="70"
x2="100"
y2="70"
stroke="#1e1e3a"
stroke-width="0.5"
id="line16" />
<line
x1="0"
y1="80"
x2="100"
y2="80"
stroke="#1e1e3a"
stroke-width="0.5"
id="line17" />
<line
x1="0"
y1="90"
x2="100"
y2="90"
stroke="#1e1e3a"
stroke-width="0.5"
id="line18" />
<!-- Center crosshair -->
<line
x1="50"
y1="0"
x2="50"
y2="100"
stroke="#2a2a5a"
stroke-width="0.8"
id="line19" />
<line
x1="0"
y1="50"
x2="100"
y2="50"
stroke="#2a2a5a"
stroke-width="0.8"
id="line20" />
<!-- Pattern area border -->
<rect
x="0"
y="0"
width="100"
height="100"
fill="none"
stroke="#333366"
stroke-width="0.6"
id="rect20" />
<!-- Quarter markers -->
<rect
x="25"
y="0"
width="50"
height="0"
fill="none"
stroke="#2a2a5a"
stroke-width="0.4"
id="rect21" />
<text
x="1"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text21">0</text>
<text
x="23"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text22">25</text>
<text
x="48"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text23">50</text>
<text
x="73"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text24">75</text>
<text
x="97"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text25">100</text>
<text
x="-14"
y="4"
font-size="3"
fill="#444488"
font-family="monospace"
id="text26">0</text>
<text
x="-14"
y="29"
font-size="3"
fill="#444488"
font-family="monospace"
id="text27">25</text>
<text
x="-14"
y="54"
font-size="3"
fill="#444488"
font-family="monospace"
id="text28">50</text>
<text
x="-14"
y="79"
font-size="3"
fill="#444488"
font-family="monospace"
id="text29">75</text>
<text
x="-18"
y="103"
font-size="3"
fill="#444488"
font-family="monospace"
id="text30">100</text>
</g>
<!-- PATTERN — edit this layer only -->
<!-- Shapes must use fill="#ffffff". Stay within 0-100. -->
<g
inkscape:label="Pattern (edit this)"
inkscape:groupmode="layer"
id="layer-pattern">
<!-- Example: single centered circle. Replace with your design. -->
<rect
x="34.776787"
y="9.107296"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect30" />
<rect
x="35"
y="59.330212"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect31" />
</g>
</svg>

View File

@ -0,0 +1,392 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
ITALIC NEON — PATTERN TEMPLATE
================================
HOW TO USE:
1. File > Save As > pattern-01.svg (increment number for each new pattern)
2. Edit ONLY the "Pattern (edit this)" layer — all other layers are guides
3. Draw white shapes (fill="#ffffff") within the 0-100 coordinate area
4. Shapes: use <rect rx="..." ry="..."> for circles/pills, or <ellipse>
- Circle: <rect x="35" y="35" width="30" height="30" rx="15" ry="15" fill="#ffffff"/>
- Horizontal pill: <rect x="20" y="42" width="60" height="16" rx="8" ry="8" fill="#ffffff"/>
- Ellipse: <ellipse cx="50" cy="50" rx="25" ry="15" fill="#ffffff"/>
5. Stay within x: 0-100, y: 0-100. Leave ~5 units of margin from edges.
6. Aim for 1-8 shapes, non-overlapping, with geometric/symmetric relations.
7. The skew is applied at render time — draw flat, it will look correct in the icon.
The black rect is the inner icon area. The purple rect is the outer chrome (color varies per project at runtime).
-->
<svg
width="540"
height="540"
viewBox="-20 -20 140 140"
version="1.1"
id="template"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="pattern-04.svg"
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"
xmlns:sodipodi0="http://sodipodi.sourceforge.net/DTD/sodipodi-0.0.dtd">
<defs
id="defs30" />
<sodipodi:namedview
id="namedview30"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.1614884"
inkscape:cx="224.2812"
inkscape:cy="238.05663"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer-pattern" />
<sodipodi0:namedview
id="namedview"
pagecolor="#1a1a2e"
bordercolor="#555555"
inkscape:document-units="px"
showgrid="true"
inkscape:current-layer="layer-pattern">
<inkscape:grid
type="xygrid"
units="px"
spacingx="5"
spacingy="5"
empspacing="2"
color="#2a2a4a"
empcolor="#3a3a6a"
opacity="0.8"
empopacity="1" />
</sodipodi0:namedview>
<!-- CHROME GUIDE — locked, context only, not exported as pattern data -->
<g
inkscape:label="Chrome (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-chrome"
sodipodi0:insensitive="true">
<!-- Outer colored rect: placeholder purple, will use project color at runtime -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="#6600cc"
opacity="0.35"
id="rect1" />
<!-- Glow hint -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="none"
stroke="#8833ff"
stroke-width="1.5"
opacity="0.5"
id="rect2" />
<!-- Inner black area = the 0,0 → 100,100 pattern space -->
<rect
x="0"
y="0"
width="100"
height="100"
rx="14"
ry="14"
fill="#000000"
id="rect3" />
</g>
<!-- GRID GUIDE — locked -->
<g
inkscape:label="Grid (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-grid"
sodipodi0:insensitive="true">
<!-- Minor lines every 10 units -->
<line
x1="10"
y1="0"
x2="10"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line3" />
<line
x1="20"
y1="0"
x2="20"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line4" />
<line
x1="30"
y1="0"
x2="30"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line5" />
<line
x1="40"
y1="0"
x2="40"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line6" />
<line
x1="60"
y1="0"
x2="60"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line7" />
<line
x1="70"
y1="0"
x2="70"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line8" />
<line
x1="80"
y1="0"
x2="80"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line9" />
<line
x1="90"
y1="0"
x2="90"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line10" />
<line
x1="0"
y1="10"
x2="100"
y2="10"
stroke="#1e1e3a"
stroke-width="0.5"
id="line11" />
<line
x1="0"
y1="20"
x2="100"
y2="20"
stroke="#1e1e3a"
stroke-width="0.5"
id="line12" />
<line
x1="0"
y1="30"
x2="100"
y2="30"
stroke="#1e1e3a"
stroke-width="0.5"
id="line13" />
<line
x1="0"
y1="40"
x2="100"
y2="40"
stroke="#1e1e3a"
stroke-width="0.5"
id="line14" />
<line
x1="0"
y1="60"
x2="100"
y2="60"
stroke="#1e1e3a"
stroke-width="0.5"
id="line15" />
<line
x1="0"
y1="70"
x2="100"
y2="70"
stroke="#1e1e3a"
stroke-width="0.5"
id="line16" />
<line
x1="0"
y1="80"
x2="100"
y2="80"
stroke="#1e1e3a"
stroke-width="0.5"
id="line17" />
<line
x1="0"
y1="90"
x2="100"
y2="90"
stroke="#1e1e3a"
stroke-width="0.5"
id="line18" />
<!-- Center crosshair -->
<line
x1="50"
y1="0"
x2="50"
y2="100"
stroke="#2a2a5a"
stroke-width="0.8"
id="line19" />
<line
x1="0"
y1="50"
x2="100"
y2="50"
stroke="#2a2a5a"
stroke-width="0.8"
id="line20" />
<!-- Pattern area border -->
<rect
x="0"
y="0"
width="100"
height="100"
fill="none"
stroke="#333366"
stroke-width="0.6"
id="rect20" />
<!-- Quarter markers -->
<rect
x="25"
y="0"
width="50"
height="0"
fill="none"
stroke="#2a2a5a"
stroke-width="0.4"
id="rect21" />
<text
x="1"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text21">0</text>
<text
x="23"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text22">25</text>
<text
x="48"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text23">50</text>
<text
x="73"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text24">75</text>
<text
x="97"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text25">100</text>
<text
x="-14"
y="4"
font-size="3"
fill="#444488"
font-family="monospace"
id="text26">0</text>
<text
x="-14"
y="29"
font-size="3"
fill="#444488"
font-family="monospace"
id="text27">25</text>
<text
x="-14"
y="54"
font-size="3"
fill="#444488"
font-family="monospace"
id="text28">50</text>
<text
x="-14"
y="79"
font-size="3"
fill="#444488"
font-family="monospace"
id="text29">75</text>
<text
x="-18"
y="103"
font-size="3"
fill="#444488"
font-family="monospace"
id="text30">100</text>
</g>
<!-- PATTERN — edit this layer only -->
<!-- Shapes must use fill="#ffffff". Stay within 0-100. -->
<g
inkscape:label="Pattern (edit this)"
inkscape:groupmode="layer"
id="layer-pattern">
<!-- Example: single centered circle. Replace with your design. -->
<rect
x="34.776787"
y="9.107296"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect30" />
<rect
x="7.9912314"
y="69.374794"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect31"
style="stroke-width:0.434527" />
<rect
x="78.303314"
y="69.374794"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect32"
style="stroke-width:0.434527" />
</g>
</svg>

View File

@ -0,0 +1,401 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
ITALIC NEON — PATTERN TEMPLATE
================================
HOW TO USE:
1. File > Save As > pattern-01.svg (increment number for each new pattern)
2. Edit ONLY the "Pattern (edit this)" layer — all other layers are guides
3. Draw white shapes (fill="#ffffff") within the 0-100 coordinate area
4. Shapes: use <rect rx="..." ry="..."> for circles/pills, or <ellipse>
- Circle: <rect x="35" y="35" width="30" height="30" rx="15" ry="15" fill="#ffffff"/>
- Horizontal pill: <rect x="20" y="42" width="60" height="16" rx="8" ry="8" fill="#ffffff"/>
- Ellipse: <ellipse cx="50" cy="50" rx="25" ry="15" fill="#ffffff"/>
5. Stay within x: 0-100, y: 0-100. Leave ~5 units of margin from edges.
6. Aim for 1-8 shapes, non-overlapping, with geometric/symmetric relations.
7. The skew is applied at render time — draw flat, it will look correct in the icon.
The black rect is the inner icon area. The purple rect is the outer chrome (color varies per project at runtime).
-->
<svg
width="540"
height="540"
viewBox="-20 -20 140 140"
version="1.1"
id="template"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="pattern-05.svg"
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"
xmlns:sodipodi0="http://sodipodi.sourceforge.net/DTD/sodipodi-0.0.dtd">
<defs
id="defs30" />
<sodipodi:namedview
id="namedview30"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.1614884"
inkscape:cx="224.2812"
inkscape:cy="238.05663"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer-pattern" />
<sodipodi0:namedview
id="namedview"
pagecolor="#1a1a2e"
bordercolor="#555555"
inkscape:document-units="px"
showgrid="true"
inkscape:current-layer="layer-pattern">
<inkscape:grid
type="xygrid"
units="px"
spacingx="5"
spacingy="5"
empspacing="2"
color="#2a2a4a"
empcolor="#3a3a6a"
opacity="0.8"
empopacity="1" />
</sodipodi0:namedview>
<!-- CHROME GUIDE — locked, context only, not exported as pattern data -->
<g
inkscape:label="Chrome (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-chrome"
sodipodi0:insensitive="true">
<!-- Outer colored rect: placeholder purple, will use project color at runtime -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="#6600cc"
opacity="0.35"
id="rect1" />
<!-- Glow hint -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="none"
stroke="#8833ff"
stroke-width="1.5"
opacity="0.5"
id="rect2" />
<!-- Inner black area = the 0,0 → 100,100 pattern space -->
<rect
x="0"
y="0"
width="100"
height="100"
rx="14"
ry="14"
fill="#000000"
id="rect3" />
</g>
<!-- GRID GUIDE — locked -->
<g
inkscape:label="Grid (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-grid"
sodipodi0:insensitive="true">
<!-- Minor lines every 10 units -->
<line
x1="10"
y1="0"
x2="10"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line3" />
<line
x1="20"
y1="0"
x2="20"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line4" />
<line
x1="30"
y1="0"
x2="30"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line5" />
<line
x1="40"
y1="0"
x2="40"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line6" />
<line
x1="60"
y1="0"
x2="60"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line7" />
<line
x1="70"
y1="0"
x2="70"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line8" />
<line
x1="80"
y1="0"
x2="80"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line9" />
<line
x1="90"
y1="0"
x2="90"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line10" />
<line
x1="0"
y1="10"
x2="100"
y2="10"
stroke="#1e1e3a"
stroke-width="0.5"
id="line11" />
<line
x1="0"
y1="20"
x2="100"
y2="20"
stroke="#1e1e3a"
stroke-width="0.5"
id="line12" />
<line
x1="0"
y1="30"
x2="100"
y2="30"
stroke="#1e1e3a"
stroke-width="0.5"
id="line13" />
<line
x1="0"
y1="40"
x2="100"
y2="40"
stroke="#1e1e3a"
stroke-width="0.5"
id="line14" />
<line
x1="0"
y1="60"
x2="100"
y2="60"
stroke="#1e1e3a"
stroke-width="0.5"
id="line15" />
<line
x1="0"
y1="70"
x2="100"
y2="70"
stroke="#1e1e3a"
stroke-width="0.5"
id="line16" />
<line
x1="0"
y1="80"
x2="100"
y2="80"
stroke="#1e1e3a"
stroke-width="0.5"
id="line17" />
<line
x1="0"
y1="90"
x2="100"
y2="90"
stroke="#1e1e3a"
stroke-width="0.5"
id="line18" />
<!-- Center crosshair -->
<line
x1="50"
y1="0"
x2="50"
y2="100"
stroke="#2a2a5a"
stroke-width="0.8"
id="line19" />
<line
x1="0"
y1="50"
x2="100"
y2="50"
stroke="#2a2a5a"
stroke-width="0.8"
id="line20" />
<!-- Pattern area border -->
<rect
x="0"
y="0"
width="100"
height="100"
fill="none"
stroke="#333366"
stroke-width="0.6"
id="rect20" />
<!-- Quarter markers -->
<rect
x="25"
y="0"
width="50"
height="0"
fill="none"
stroke="#2a2a5a"
stroke-width="0.4"
id="rect21" />
<text
x="1"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text21">0</text>
<text
x="23"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text22">25</text>
<text
x="48"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text23">50</text>
<text
x="73"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text24">75</text>
<text
x="97"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text25">100</text>
<text
x="-14"
y="4"
font-size="3"
fill="#444488"
font-family="monospace"
id="text26">0</text>
<text
x="-14"
y="29"
font-size="3"
fill="#444488"
font-family="monospace"
id="text27">25</text>
<text
x="-14"
y="54"
font-size="3"
fill="#444488"
font-family="monospace"
id="text28">50</text>
<text
x="-14"
y="79"
font-size="3"
fill="#444488"
font-family="monospace"
id="text29">75</text>
<text
x="-18"
y="103"
font-size="3"
fill="#444488"
font-family="monospace"
id="text30">100</text>
</g>
<!-- PATTERN — edit this layer only -->
<!-- Shapes must use fill="#ffffff". Stay within 0-100. -->
<g
inkscape:label="Pattern (edit this)"
inkscape:groupmode="layer"
id="layer-pattern">
<!-- Example: single centered circle. Replace with your design. -->
<rect
x="34.776787"
y="9.107296"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect30" />
<rect
x="22.500074"
y="43.48209"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect31"
style="stroke-width:0.434527" />
<rect
x="63.348045"
y="44.15173"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect32"
style="stroke-width:0.434527" />
<rect
x="34.776787"
y="61.33913"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect33" />
</g>
</svg>

View File

@ -0,0 +1,401 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
ITALIC NEON — PATTERN TEMPLATE
================================
HOW TO USE:
1. File > Save As > pattern-01.svg (increment number for each new pattern)
2. Edit ONLY the "Pattern (edit this)" layer — all other layers are guides
3. Draw white shapes (fill="#ffffff") within the 0-100 coordinate area
4. Shapes: use <rect rx="..." ry="..."> for circles/pills, or <ellipse>
- Circle: <rect x="35" y="35" width="30" height="30" rx="15" ry="15" fill="#ffffff"/>
- Horizontal pill: <rect x="20" y="42" width="60" height="16" rx="8" ry="8" fill="#ffffff"/>
- Ellipse: <ellipse cx="50" cy="50" rx="25" ry="15" fill="#ffffff"/>
5. Stay within x: 0-100, y: 0-100. Leave ~5 units of margin from edges.
6. Aim for 1-8 shapes, non-overlapping, with geometric/symmetric relations.
7. The skew is applied at render time — draw flat, it will look correct in the icon.
The black rect is the inner icon area. The purple rect is the outer chrome (color varies per project at runtime).
-->
<svg
width="540"
height="540"
viewBox="-20 -20 140 140"
version="1.1"
id="template"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="pattern-06.svg"
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"
xmlns:sodipodi0="http://sodipodi.sourceforge.net/DTD/sodipodi-0.0.dtd">
<defs
id="defs30" />
<sodipodi:namedview
id="namedview30"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.1614884"
inkscape:cx="224.2812"
inkscape:cy="238.05663"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer-pattern" />
<sodipodi0:namedview
id="namedview"
pagecolor="#1a1a2e"
bordercolor="#555555"
inkscape:document-units="px"
showgrid="true"
inkscape:current-layer="layer-pattern">
<inkscape:grid
type="xygrid"
units="px"
spacingx="5"
spacingy="5"
empspacing="2"
color="#2a2a4a"
empcolor="#3a3a6a"
opacity="0.8"
empopacity="1" />
</sodipodi0:namedview>
<!-- CHROME GUIDE — locked, context only, not exported as pattern data -->
<g
inkscape:label="Chrome (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-chrome"
sodipodi0:insensitive="true">
<!-- Outer colored rect: placeholder purple, will use project color at runtime -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="#6600cc"
opacity="0.35"
id="rect1" />
<!-- Glow hint -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="none"
stroke="#8833ff"
stroke-width="1.5"
opacity="0.5"
id="rect2" />
<!-- Inner black area = the 0,0 → 100,100 pattern space -->
<rect
x="0"
y="0"
width="100"
height="100"
rx="14"
ry="14"
fill="#000000"
id="rect3" />
</g>
<!-- GRID GUIDE — locked -->
<g
inkscape:label="Grid (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-grid"
sodipodi0:insensitive="true">
<!-- Minor lines every 10 units -->
<line
x1="10"
y1="0"
x2="10"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line3" />
<line
x1="20"
y1="0"
x2="20"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line4" />
<line
x1="30"
y1="0"
x2="30"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line5" />
<line
x1="40"
y1="0"
x2="40"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line6" />
<line
x1="60"
y1="0"
x2="60"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line7" />
<line
x1="70"
y1="0"
x2="70"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line8" />
<line
x1="80"
y1="0"
x2="80"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line9" />
<line
x1="90"
y1="0"
x2="90"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line10" />
<line
x1="0"
y1="10"
x2="100"
y2="10"
stroke="#1e1e3a"
stroke-width="0.5"
id="line11" />
<line
x1="0"
y1="20"
x2="100"
y2="20"
stroke="#1e1e3a"
stroke-width="0.5"
id="line12" />
<line
x1="0"
y1="30"
x2="100"
y2="30"
stroke="#1e1e3a"
stroke-width="0.5"
id="line13" />
<line
x1="0"
y1="40"
x2="100"
y2="40"
stroke="#1e1e3a"
stroke-width="0.5"
id="line14" />
<line
x1="0"
y1="60"
x2="100"
y2="60"
stroke="#1e1e3a"
stroke-width="0.5"
id="line15" />
<line
x1="0"
y1="70"
x2="100"
y2="70"
stroke="#1e1e3a"
stroke-width="0.5"
id="line16" />
<line
x1="0"
y1="80"
x2="100"
y2="80"
stroke="#1e1e3a"
stroke-width="0.5"
id="line17" />
<line
x1="0"
y1="90"
x2="100"
y2="90"
stroke="#1e1e3a"
stroke-width="0.5"
id="line18" />
<!-- Center crosshair -->
<line
x1="50"
y1="0"
x2="50"
y2="100"
stroke="#2a2a5a"
stroke-width="0.8"
id="line19" />
<line
x1="0"
y1="50"
x2="100"
y2="50"
stroke="#2a2a5a"
stroke-width="0.8"
id="line20" />
<!-- Pattern area border -->
<rect
x="0"
y="0"
width="100"
height="100"
fill="none"
stroke="#333366"
stroke-width="0.6"
id="rect20" />
<!-- Quarter markers -->
<rect
x="25"
y="0"
width="50"
height="0"
fill="none"
stroke="#2a2a5a"
stroke-width="0.4"
id="rect21" />
<text
x="1"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text21">0</text>
<text
x="23"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text22">25</text>
<text
x="48"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text23">50</text>
<text
x="73"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text24">75</text>
<text
x="97"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text25">100</text>
<text
x="-14"
y="4"
font-size="3"
fill="#444488"
font-family="monospace"
id="text26">0</text>
<text
x="-14"
y="29"
font-size="3"
fill="#444488"
font-family="monospace"
id="text27">25</text>
<text
x="-14"
y="54"
font-size="3"
fill="#444488"
font-family="monospace"
id="text28">50</text>
<text
x="-14"
y="79"
font-size="3"
fill="#444488"
font-family="monospace"
id="text29">75</text>
<text
x="-18"
y="103"
font-size="3"
fill="#444488"
font-family="monospace"
id="text30">100</text>
</g>
<!-- PATTERN — edit this layer only -->
<!-- Shapes must use fill="#ffffff". Stay within 0-100. -->
<g
inkscape:label="Pattern (edit this)"
inkscape:groupmode="layer"
id="layer-pattern">
<!-- Example: single centered circle. Replace with your design. -->
<rect
x="9.3305092"
y="10.223361"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect30" />
<rect
x="17.812603"
y="47.723133"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect31"
style="stroke-width:0.434527" />
<rect
x="68.258736"
y="38.34819"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect32"
style="stroke-width:0.434527" />
<rect
x="61.56234"
y="59.553425"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect33" />
</g>
</svg>

View File

@ -0,0 +1,411 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
ITALIC NEON — PATTERN TEMPLATE
================================
HOW TO USE:
1. File > Save As > pattern-01.svg (increment number for each new pattern)
2. Edit ONLY the "Pattern (edit this)" layer — all other layers are guides
3. Draw white shapes (fill="#ffffff") within the 0-100 coordinate area
4. Shapes: use <rect rx="..." ry="..."> for circles/pills, or <ellipse>
- Circle: <rect x="35" y="35" width="30" height="30" rx="15" ry="15" fill="#ffffff"/>
- Horizontal pill: <rect x="20" y="42" width="60" height="16" rx="8" ry="8" fill="#ffffff"/>
- Ellipse: <ellipse cx="50" cy="50" rx="25" ry="15" fill="#ffffff"/>
5. Stay within x: 0-100, y: 0-100. Leave ~5 units of margin from edges.
6. Aim for 1-8 shapes, non-overlapping, with geometric/symmetric relations.
7. The skew is applied at render time — draw flat, it will look correct in the icon.
The black rect is the inner icon area. The purple rect is the outer chrome (color varies per project at runtime).
-->
<svg
width="540"
height="540"
viewBox="-20 -20 140 140"
version="1.1"
id="template"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="pattern-07.svg"
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"
xmlns:sodipodi0="http://sodipodi.sourceforge.net/DTD/sodipodi-0.0.dtd">
<defs
id="defs30" />
<sodipodi:namedview
id="namedview30"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.1614884"
inkscape:cx="224.2812"
inkscape:cy="238.05663"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer-pattern" />
<sodipodi0:namedview
id="namedview"
pagecolor="#1a1a2e"
bordercolor="#555555"
inkscape:document-units="px"
showgrid="true"
inkscape:current-layer="layer-pattern">
<inkscape:grid
type="xygrid"
units="px"
spacingx="5"
spacingy="5"
empspacing="2"
color="#2a2a4a"
empcolor="#3a3a6a"
opacity="0.8"
empopacity="1" />
</sodipodi0:namedview>
<!-- CHROME GUIDE — locked, context only, not exported as pattern data -->
<g
inkscape:label="Chrome (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-chrome"
sodipodi0:insensitive="true">
<!-- Outer colored rect: placeholder purple, will use project color at runtime -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="#6600cc"
opacity="0.35"
id="rect1" />
<!-- Glow hint -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="none"
stroke="#8833ff"
stroke-width="1.5"
opacity="0.5"
id="rect2" />
<!-- Inner black area = the 0,0 → 100,100 pattern space -->
<rect
x="0"
y="0"
width="100"
height="100"
rx="14"
ry="14"
fill="#000000"
id="rect3" />
</g>
<!-- GRID GUIDE — locked -->
<g
inkscape:label="Grid (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-grid"
sodipodi0:insensitive="true">
<!-- Minor lines every 10 units -->
<line
x1="10"
y1="0"
x2="10"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line3" />
<line
x1="20"
y1="0"
x2="20"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line4" />
<line
x1="30"
y1="0"
x2="30"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line5" />
<line
x1="40"
y1="0"
x2="40"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line6" />
<line
x1="60"
y1="0"
x2="60"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line7" />
<line
x1="70"
y1="0"
x2="70"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line8" />
<line
x1="80"
y1="0"
x2="80"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line9" />
<line
x1="90"
y1="0"
x2="90"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line10" />
<line
x1="0"
y1="10"
x2="100"
y2="10"
stroke="#1e1e3a"
stroke-width="0.5"
id="line11" />
<line
x1="0"
y1="20"
x2="100"
y2="20"
stroke="#1e1e3a"
stroke-width="0.5"
id="line12" />
<line
x1="0"
y1="30"
x2="100"
y2="30"
stroke="#1e1e3a"
stroke-width="0.5"
id="line13" />
<line
x1="0"
y1="40"
x2="100"
y2="40"
stroke="#1e1e3a"
stroke-width="0.5"
id="line14" />
<line
x1="0"
y1="60"
x2="100"
y2="60"
stroke="#1e1e3a"
stroke-width="0.5"
id="line15" />
<line
x1="0"
y1="70"
x2="100"
y2="70"
stroke="#1e1e3a"
stroke-width="0.5"
id="line16" />
<line
x1="0"
y1="80"
x2="100"
y2="80"
stroke="#1e1e3a"
stroke-width="0.5"
id="line17" />
<line
x1="0"
y1="90"
x2="100"
y2="90"
stroke="#1e1e3a"
stroke-width="0.5"
id="line18" />
<!-- Center crosshair -->
<line
x1="50"
y1="0"
x2="50"
y2="100"
stroke="#2a2a5a"
stroke-width="0.8"
id="line19" />
<line
x1="0"
y1="50"
x2="100"
y2="50"
stroke="#2a2a5a"
stroke-width="0.8"
id="line20" />
<!-- Pattern area border -->
<rect
x="0"
y="0"
width="100"
height="100"
fill="none"
stroke="#333366"
stroke-width="0.6"
id="rect20" />
<!-- Quarter markers -->
<rect
x="25"
y="0"
width="50"
height="0"
fill="none"
stroke="#2a2a5a"
stroke-width="0.4"
id="rect21" />
<text
x="1"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text21">0</text>
<text
x="23"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text22">25</text>
<text
x="48"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text23">50</text>
<text
x="73"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text24">75</text>
<text
x="97"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text25">100</text>
<text
x="-14"
y="4"
font-size="3"
fill="#444488"
font-family="monospace"
id="text26">0</text>
<text
x="-14"
y="29"
font-size="3"
fill="#444488"
font-family="monospace"
id="text27">25</text>
<text
x="-14"
y="54"
font-size="3"
fill="#444488"
font-family="monospace"
id="text28">50</text>
<text
x="-14"
y="79"
font-size="3"
fill="#444488"
font-family="monospace"
id="text29">75</text>
<text
x="-18"
y="103"
font-size="3"
fill="#444488"
font-family="monospace"
id="text30">100</text>
</g>
<!-- PATTERN — edit this layer only -->
<!-- Shapes must use fill="#ffffff". Stay within 0-100. -->
<g
inkscape:label="Pattern (edit this)"
inkscape:groupmode="layer"
id="layer-pattern">
<!-- Example: single centered circle. Replace with your design. -->
<rect
x="22.276861"
y="22.500074"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect30" />
<rect
x="78.526527"
y="78.52652"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect31"
style="stroke-width:0.434527" />
<rect
x="58.66058"
y="28.973246"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect32"
style="stroke-width:0.434527" />
<rect
x="49.732052"
y="50.401695"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect33" />
<rect
x="8.8840828"
y="9.1072884"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect34"
style="stroke-width:0.434527" />
</g>
</svg>

View File

@ -0,0 +1,411 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
ITALIC NEON — PATTERN TEMPLATE
================================
HOW TO USE:
1. File > Save As > pattern-01.svg (increment number for each new pattern)
2. Edit ONLY the "Pattern (edit this)" layer — all other layers are guides
3. Draw white shapes (fill="#ffffff") within the 0-100 coordinate area
4. Shapes: use <rect rx="..." ry="..."> for circles/pills, or <ellipse>
- Circle: <rect x="35" y="35" width="30" height="30" rx="15" ry="15" fill="#ffffff"/>
- Horizontal pill: <rect x="20" y="42" width="60" height="16" rx="8" ry="8" fill="#ffffff"/>
- Ellipse: <ellipse cx="50" cy="50" rx="25" ry="15" fill="#ffffff"/>
5. Stay within x: 0-100, y: 0-100. Leave ~5 units of margin from edges.
6. Aim for 1-8 shapes, non-overlapping, with geometric/symmetric relations.
7. The skew is applied at render time — draw flat, it will look correct in the icon.
The black rect is the inner icon area. The purple rect is the outer chrome (color varies per project at runtime).
-->
<svg
width="540"
height="540"
viewBox="-20 -20 140 140"
version="1.1"
id="template"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="pattern-08.svg"
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"
xmlns:sodipodi0="http://sodipodi.sourceforge.net/DTD/sodipodi-0.0.dtd">
<defs
id="defs30" />
<sodipodi:namedview
id="namedview30"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.1614884"
inkscape:cx="236.3347"
inkscape:cy="243.22241"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer-pattern" />
<sodipodi0:namedview
id="namedview"
pagecolor="#1a1a2e"
bordercolor="#555555"
inkscape:document-units="px"
showgrid="true"
inkscape:current-layer="layer-pattern">
<inkscape:grid
type="xygrid"
units="px"
spacingx="5"
spacingy="5"
empspacing="2"
color="#2a2a4a"
empcolor="#3a3a6a"
opacity="0.8"
empopacity="1" />
</sodipodi0:namedview>
<!-- CHROME GUIDE — locked, context only, not exported as pattern data -->
<g
inkscape:label="Chrome (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-chrome"
sodipodi0:insensitive="true">
<!-- Outer colored rect: placeholder purple, will use project color at runtime -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="#6600cc"
opacity="0.35"
id="rect1" />
<!-- Glow hint -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="none"
stroke="#8833ff"
stroke-width="1.5"
opacity="0.5"
id="rect2" />
<!-- Inner black area = the 0,0 → 100,100 pattern space -->
<rect
x="0"
y="0"
width="100"
height="100"
rx="14"
ry="14"
fill="#000000"
id="rect3" />
</g>
<!-- GRID GUIDE — locked -->
<g
inkscape:label="Grid (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-grid"
sodipodi0:insensitive="true">
<!-- Minor lines every 10 units -->
<line
x1="10"
y1="0"
x2="10"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line3" />
<line
x1="20"
y1="0"
x2="20"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line4" />
<line
x1="30"
y1="0"
x2="30"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line5" />
<line
x1="40"
y1="0"
x2="40"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line6" />
<line
x1="60"
y1="0"
x2="60"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line7" />
<line
x1="70"
y1="0"
x2="70"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line8" />
<line
x1="80"
y1="0"
x2="80"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line9" />
<line
x1="90"
y1="0"
x2="90"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line10" />
<line
x1="0"
y1="10"
x2="100"
y2="10"
stroke="#1e1e3a"
stroke-width="0.5"
id="line11" />
<line
x1="0"
y1="20"
x2="100"
y2="20"
stroke="#1e1e3a"
stroke-width="0.5"
id="line12" />
<line
x1="0"
y1="30"
x2="100"
y2="30"
stroke="#1e1e3a"
stroke-width="0.5"
id="line13" />
<line
x1="0"
y1="40"
x2="100"
y2="40"
stroke="#1e1e3a"
stroke-width="0.5"
id="line14" />
<line
x1="0"
y1="60"
x2="100"
y2="60"
stroke="#1e1e3a"
stroke-width="0.5"
id="line15" />
<line
x1="0"
y1="70"
x2="100"
y2="70"
stroke="#1e1e3a"
stroke-width="0.5"
id="line16" />
<line
x1="0"
y1="80"
x2="100"
y2="80"
stroke="#1e1e3a"
stroke-width="0.5"
id="line17" />
<line
x1="0"
y1="90"
x2="100"
y2="90"
stroke="#1e1e3a"
stroke-width="0.5"
id="line18" />
<!-- Center crosshair -->
<line
x1="50"
y1="0"
x2="50"
y2="100"
stroke="#2a2a5a"
stroke-width="0.8"
id="line19" />
<line
x1="0"
y1="50"
x2="100"
y2="50"
stroke="#2a2a5a"
stroke-width="0.8"
id="line20" />
<!-- Pattern area border -->
<rect
x="0"
y="0"
width="100"
height="100"
fill="none"
stroke="#333366"
stroke-width="0.6"
id="rect20" />
<!-- Quarter markers -->
<rect
x="25"
y="0"
width="50"
height="0"
fill="none"
stroke="#2a2a5a"
stroke-width="0.4"
id="rect21" />
<text
x="1"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text21">0</text>
<text
x="23"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text22">25</text>
<text
x="48"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text23">50</text>
<text
x="73"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text24">75</text>
<text
x="97"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text25">100</text>
<text
x="-14"
y="4"
font-size="3"
fill="#444488"
font-family="monospace"
id="text26">0</text>
<text
x="-14"
y="29"
font-size="3"
fill="#444488"
font-family="monospace"
id="text27">25</text>
<text
x="-14"
y="54"
font-size="3"
fill="#444488"
font-family="monospace"
id="text28">50</text>
<text
x="-14"
y="79"
font-size="3"
fill="#444488"
font-family="monospace"
id="text29">75</text>
<text
x="-18"
y="103"
font-size="3"
fill="#444488"
font-family="monospace"
id="text30">100</text>
</g>
<!-- PATTERN — edit this layer only -->
<!-- Shapes must use fill="#ffffff". Stay within 0-100. -->
<g
inkscape:label="Pattern (edit this)"
inkscape:groupmode="layer"
id="layer-pattern">
<!-- Example: single centered circle. Replace with your design. -->
<rect
x="16.696537"
y="10.223361"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect30" />
<rect
x="54.196316"
y="77.85688"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect31"
style="stroke-width:0.434527" />
<rect
x="33.660728"
y="78.303307"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect32"
style="stroke-width:0.434527" />
<rect
x="53.526672"
y="11.116214"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect33" />
<rect
x="44.151733"
y="63.124828"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect34"
style="stroke-width:0.434527" />
</g>
</svg>

View File

@ -0,0 +1,391 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
ITALIC NEON — PATTERN TEMPLATE
================================
HOW TO USE:
1. File > Save As > pattern-01.svg (increment number for each new pattern)
2. Edit ONLY the "Pattern (edit this)" layer — all other layers are guides
3. Draw white shapes (fill="#ffffff") within the 0-100 coordinate area
4. Shapes: use <rect rx="..." ry="..."> for circles/pills, or <ellipse>
- Circle: <rect x="35" y="35" width="30" height="30" rx="15" ry="15" fill="#ffffff"/>
- Horizontal pill: <rect x="20" y="42" width="60" height="16" rx="8" ry="8" fill="#ffffff"/>
- Ellipse: <ellipse cx="50" cy="50" rx="25" ry="15" fill="#ffffff"/>
5. Stay within x: 0-100, y: 0-100. Leave ~5 units of margin from edges.
6. Aim for 1-8 shapes, non-overlapping, with geometric/symmetric relations.
7. The skew is applied at render time — draw flat, it will look correct in the icon.
The black rect is the inner icon area. The purple rect is the outer chrome (color varies per project at runtime).
-->
<svg
width="540"
height="540"
viewBox="-20 -20 140 140"
version="1.1"
id="template"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="pattern-09.svg"
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"
xmlns:sodipodi0="http://sodipodi.sourceforge.net/DTD/sodipodi-0.0.dtd">
<defs
id="defs30" />
<sodipodi:namedview
id="namedview30"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.1614884"
inkscape:cx="236.3347"
inkscape:cy="243.22241"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer-pattern" />
<sodipodi0:namedview
id="namedview"
pagecolor="#1a1a2e"
bordercolor="#555555"
inkscape:document-units="px"
showgrid="true"
inkscape:current-layer="layer-pattern">
<inkscape:grid
type="xygrid"
units="px"
spacingx="5"
spacingy="5"
empspacing="2"
color="#2a2a4a"
empcolor="#3a3a6a"
opacity="0.8"
empopacity="1" />
</sodipodi0:namedview>
<!-- CHROME GUIDE — locked, context only, not exported as pattern data -->
<g
inkscape:label="Chrome (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-chrome"
sodipodi0:insensitive="true">
<!-- Outer colored rect: placeholder purple, will use project color at runtime -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="#6600cc"
opacity="0.35"
id="rect1" />
<!-- Glow hint -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="none"
stroke="#8833ff"
stroke-width="1.5"
opacity="0.5"
id="rect2" />
<!-- Inner black area = the 0,0 → 100,100 pattern space -->
<rect
x="0"
y="0"
width="100"
height="100"
rx="14"
ry="14"
fill="#000000"
id="rect3" />
</g>
<!-- GRID GUIDE — locked -->
<g
inkscape:label="Grid (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-grid"
sodipodi0:insensitive="true">
<!-- Minor lines every 10 units -->
<line
x1="10"
y1="0"
x2="10"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line3" />
<line
x1="20"
y1="0"
x2="20"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line4" />
<line
x1="30"
y1="0"
x2="30"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line5" />
<line
x1="40"
y1="0"
x2="40"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line6" />
<line
x1="60"
y1="0"
x2="60"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line7" />
<line
x1="70"
y1="0"
x2="70"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line8" />
<line
x1="80"
y1="0"
x2="80"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line9" />
<line
x1="90"
y1="0"
x2="90"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line10" />
<line
x1="0"
y1="10"
x2="100"
y2="10"
stroke="#1e1e3a"
stroke-width="0.5"
id="line11" />
<line
x1="0"
y1="20"
x2="100"
y2="20"
stroke="#1e1e3a"
stroke-width="0.5"
id="line12" />
<line
x1="0"
y1="30"
x2="100"
y2="30"
stroke="#1e1e3a"
stroke-width="0.5"
id="line13" />
<line
x1="0"
y1="40"
x2="100"
y2="40"
stroke="#1e1e3a"
stroke-width="0.5"
id="line14" />
<line
x1="0"
y1="60"
x2="100"
y2="60"
stroke="#1e1e3a"
stroke-width="0.5"
id="line15" />
<line
x1="0"
y1="70"
x2="100"
y2="70"
stroke="#1e1e3a"
stroke-width="0.5"
id="line16" />
<line
x1="0"
y1="80"
x2="100"
y2="80"
stroke="#1e1e3a"
stroke-width="0.5"
id="line17" />
<line
x1="0"
y1="90"
x2="100"
y2="90"
stroke="#1e1e3a"
stroke-width="0.5"
id="line18" />
<!-- Center crosshair -->
<line
x1="50"
y1="0"
x2="50"
y2="100"
stroke="#2a2a5a"
stroke-width="0.8"
id="line19" />
<line
x1="0"
y1="50"
x2="100"
y2="50"
stroke="#2a2a5a"
stroke-width="0.8"
id="line20" />
<!-- Pattern area border -->
<rect
x="0"
y="0"
width="100"
height="100"
fill="none"
stroke="#333366"
stroke-width="0.6"
id="rect20" />
<!-- Quarter markers -->
<rect
x="25"
y="0"
width="50"
height="0"
fill="none"
stroke="#2a2a5a"
stroke-width="0.4"
id="rect21" />
<text
x="1"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text21">0</text>
<text
x="23"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text22">25</text>
<text
x="48"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text23">50</text>
<text
x="73"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text24">75</text>
<text
x="97"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text25">100</text>
<text
x="-14"
y="4"
font-size="3"
fill="#444488"
font-family="monospace"
id="text26">0</text>
<text
x="-14"
y="29"
font-size="3"
fill="#444488"
font-family="monospace"
id="text27">25</text>
<text
x="-14"
y="54"
font-size="3"
fill="#444488"
font-family="monospace"
id="text28">50</text>
<text
x="-14"
y="79"
font-size="3"
fill="#444488"
font-family="monospace"
id="text29">75</text>
<text
x="-18"
y="103"
font-size="3"
fill="#444488"
font-family="monospace"
id="text30">100</text>
</g>
<!-- PATTERN — edit this layer only -->
<!-- Shapes must use fill="#ffffff". Stay within 0-100. -->
<g
inkscape:label="Pattern (edit this)"
inkscape:groupmode="layer"
id="layer-pattern">
<!-- Example: single centered circle. Replace with your design. -->
<rect
x="8.8840837"
y="35.66964"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect30" />
<rect
x="44.151737"
y="43.928509"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect32"
style="stroke-width:0.434527" />
<rect
x="64.017685"
y="35.446426"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect33" />
</g>
</svg>

View File

@ -0,0 +1,392 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
ITALIC NEON — PATTERN TEMPLATE
================================
HOW TO USE:
1. File > Save As > pattern-01.svg (increment number for each new pattern)
2. Edit ONLY the "Pattern (edit this)" layer — all other layers are guides
3. Draw white shapes (fill="#ffffff") within the 0-100 coordinate area
4. Shapes: use <rect rx="..." ry="..."> for circles/pills, or <ellipse>
- Circle: <rect x="35" y="35" width="30" height="30" rx="15" ry="15" fill="#ffffff"/>
- Horizontal pill: <rect x="20" y="42" width="60" height="16" rx="8" ry="8" fill="#ffffff"/>
- Ellipse: <ellipse cx="50" cy="50" rx="25" ry="15" fill="#ffffff"/>
5. Stay within x: 0-100, y: 0-100. Leave ~5 units of margin from edges.
6. Aim for 1-8 shapes, non-overlapping, with geometric/symmetric relations.
7. The skew is applied at render time — draw flat, it will look correct in the icon.
The black rect is the inner icon area. The purple rect is the outer chrome (color varies per project at runtime).
-->
<svg
width="540"
height="540"
viewBox="-20 -20 140 140"
version="1.1"
id="template"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="pattern-10.svg"
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"
xmlns:sodipodi0="http://sodipodi.sourceforge.net/DTD/sodipodi-0.0.dtd">
<defs
id="defs30" />
<sodipodi:namedview
id="namedview30"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.1614884"
inkscape:cx="236.3347"
inkscape:cy="243.22241"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer-pattern" />
<sodipodi0:namedview
id="namedview"
pagecolor="#1a1a2e"
bordercolor="#555555"
inkscape:document-units="px"
showgrid="true"
inkscape:current-layer="layer-pattern">
<inkscape:grid
type="xygrid"
units="px"
spacingx="5"
spacingy="5"
empspacing="2"
color="#2a2a4a"
empcolor="#3a3a6a"
opacity="0.8"
empopacity="1" />
</sodipodi0:namedview>
<!-- CHROME GUIDE — locked, context only, not exported as pattern data -->
<g
inkscape:label="Chrome (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-chrome"
sodipodi0:insensitive="true">
<!-- Outer colored rect: placeholder purple, will use project color at runtime -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="#6600cc"
opacity="0.35"
id="rect1" />
<!-- Glow hint -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="none"
stroke="#8833ff"
stroke-width="1.5"
opacity="0.5"
id="rect2" />
<!-- Inner black area = the 0,0 → 100,100 pattern space -->
<rect
x="0"
y="0"
width="100"
height="100"
rx="14"
ry="14"
fill="#000000"
id="rect3" />
</g>
<!-- GRID GUIDE — locked -->
<g
inkscape:label="Grid (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-grid"
sodipodi0:insensitive="true">
<!-- Minor lines every 10 units -->
<line
x1="10"
y1="0"
x2="10"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line3" />
<line
x1="20"
y1="0"
x2="20"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line4" />
<line
x1="30"
y1="0"
x2="30"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line5" />
<line
x1="40"
y1="0"
x2="40"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line6" />
<line
x1="60"
y1="0"
x2="60"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line7" />
<line
x1="70"
y1="0"
x2="70"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line8" />
<line
x1="80"
y1="0"
x2="80"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line9" />
<line
x1="90"
y1="0"
x2="90"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line10" />
<line
x1="0"
y1="10"
x2="100"
y2="10"
stroke="#1e1e3a"
stroke-width="0.5"
id="line11" />
<line
x1="0"
y1="20"
x2="100"
y2="20"
stroke="#1e1e3a"
stroke-width="0.5"
id="line12" />
<line
x1="0"
y1="30"
x2="100"
y2="30"
stroke="#1e1e3a"
stroke-width="0.5"
id="line13" />
<line
x1="0"
y1="40"
x2="100"
y2="40"
stroke="#1e1e3a"
stroke-width="0.5"
id="line14" />
<line
x1="0"
y1="60"
x2="100"
y2="60"
stroke="#1e1e3a"
stroke-width="0.5"
id="line15" />
<line
x1="0"
y1="70"
x2="100"
y2="70"
stroke="#1e1e3a"
stroke-width="0.5"
id="line16" />
<line
x1="0"
y1="80"
x2="100"
y2="80"
stroke="#1e1e3a"
stroke-width="0.5"
id="line17" />
<line
x1="0"
y1="90"
x2="100"
y2="90"
stroke="#1e1e3a"
stroke-width="0.5"
id="line18" />
<!-- Center crosshair -->
<line
x1="50"
y1="0"
x2="50"
y2="100"
stroke="#2a2a5a"
stroke-width="0.8"
id="line19" />
<line
x1="0"
y1="50"
x2="100"
y2="50"
stroke="#2a2a5a"
stroke-width="0.8"
id="line20" />
<!-- Pattern area border -->
<rect
x="0"
y="0"
width="100"
height="100"
fill="none"
stroke="#333366"
stroke-width="0.6"
id="rect20" />
<!-- Quarter markers -->
<rect
x="25"
y="0"
width="50"
height="0"
fill="none"
stroke="#2a2a5a"
stroke-width="0.4"
id="rect21" />
<text
x="1"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text21">0</text>
<text
x="23"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text22">25</text>
<text
x="48"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text23">50</text>
<text
x="73"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text24">75</text>
<text
x="97"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text25">100</text>
<text
x="-14"
y="4"
font-size="3"
fill="#444488"
font-family="monospace"
id="text26">0</text>
<text
x="-14"
y="29"
font-size="3"
fill="#444488"
font-family="monospace"
id="text27">25</text>
<text
x="-14"
y="54"
font-size="3"
fill="#444488"
font-family="monospace"
id="text28">50</text>
<text
x="-14"
y="79"
font-size="3"
fill="#444488"
font-family="monospace"
id="text29">75</text>
<text
x="-18"
y="103"
font-size="3"
fill="#444488"
font-family="monospace"
id="text30">100</text>
</g>
<!-- PATTERN — edit this layer only -->
<!-- Shapes must use fill="#ffffff". Stay within 0-100. -->
<g
inkscape:label="Pattern (edit this)"
inkscape:groupmode="layer"
id="layer-pattern">
<!-- Example: single centered circle. Replace with your design. -->
<rect
x="34.776787"
y="35.223213"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect30" />
<rect
x="43.258888"
y="72.94619"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect32"
style="stroke-width:0.434527" />
<rect
x="43.258888"
y="13.348329"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect34"
style="stroke-width:0.434527" />
</g>
</svg>

View File

@ -0,0 +1,412 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
ITALIC NEON — PATTERN TEMPLATE
================================
HOW TO USE:
1. File > Save As > pattern-01.svg (increment number for each new pattern)
2. Edit ONLY the "Pattern (edit this)" layer — all other layers are guides
3. Draw white shapes (fill="#ffffff") within the 0-100 coordinate area
4. Shapes: use <rect rx="..." ry="..."> for circles/pills, or <ellipse>
- Circle: <rect x="35" y="35" width="30" height="30" rx="15" ry="15" fill="#ffffff"/>
- Horizontal pill: <rect x="20" y="42" width="60" height="16" rx="8" ry="8" fill="#ffffff"/>
- Ellipse: <ellipse cx="50" cy="50" rx="25" ry="15" fill="#ffffff"/>
5. Stay within x: 0-100, y: 0-100. Leave ~5 units of margin from edges.
6. Aim for 1-8 shapes, non-overlapping, with geometric/symmetric relations.
7. The skew is applied at render time — draw flat, it will look correct in the icon.
The black rect is the inner icon area. The purple rect is the outer chrome (color varies per project at runtime).
-->
<svg
width="540"
height="540"
viewBox="-20 -20 140 140"
version="1.1"
id="template"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="pattern-11.svg"
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"
xmlns:sodipodi0="http://sodipodi.sourceforge.net/DTD/sodipodi-0.0.dtd">
<defs
id="defs30" />
<sodipodi:namedview
id="namedview30"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.1614884"
inkscape:cx="236.3347"
inkscape:cy="243.22241"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer-pattern" />
<sodipodi0:namedview
id="namedview"
pagecolor="#1a1a2e"
bordercolor="#555555"
inkscape:document-units="px"
showgrid="true"
inkscape:current-layer="layer-pattern">
<inkscape:grid
type="xygrid"
units="px"
spacingx="5"
spacingy="5"
empspacing="2"
color="#2a2a4a"
empcolor="#3a3a6a"
opacity="0.8"
empopacity="1" />
</sodipodi0:namedview>
<!-- CHROME GUIDE — locked, context only, not exported as pattern data -->
<g
inkscape:label="Chrome (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-chrome"
sodipodi0:insensitive="true">
<!-- Outer colored rect: placeholder purple, will use project color at runtime -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="#6600cc"
opacity="0.35"
id="rect1" />
<!-- Glow hint -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="none"
stroke="#8833ff"
stroke-width="1.5"
opacity="0.5"
id="rect2" />
<!-- Inner black area = the 0,0 → 100,100 pattern space -->
<rect
x="0"
y="0"
width="100"
height="100"
rx="14"
ry="14"
fill="#000000"
id="rect3" />
</g>
<!-- GRID GUIDE — locked -->
<g
inkscape:label="Grid (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-grid"
sodipodi0:insensitive="true">
<!-- Minor lines every 10 units -->
<line
x1="10"
y1="0"
x2="10"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line3" />
<line
x1="20"
y1="0"
x2="20"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line4" />
<line
x1="30"
y1="0"
x2="30"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line5" />
<line
x1="40"
y1="0"
x2="40"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line6" />
<line
x1="60"
y1="0"
x2="60"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line7" />
<line
x1="70"
y1="0"
x2="70"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line8" />
<line
x1="80"
y1="0"
x2="80"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line9" />
<line
x1="90"
y1="0"
x2="90"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line10" />
<line
x1="0"
y1="10"
x2="100"
y2="10"
stroke="#1e1e3a"
stroke-width="0.5"
id="line11" />
<line
x1="0"
y1="20"
x2="100"
y2="20"
stroke="#1e1e3a"
stroke-width="0.5"
id="line12" />
<line
x1="0"
y1="30"
x2="100"
y2="30"
stroke="#1e1e3a"
stroke-width="0.5"
id="line13" />
<line
x1="0"
y1="40"
x2="100"
y2="40"
stroke="#1e1e3a"
stroke-width="0.5"
id="line14" />
<line
x1="0"
y1="60"
x2="100"
y2="60"
stroke="#1e1e3a"
stroke-width="0.5"
id="line15" />
<line
x1="0"
y1="70"
x2="100"
y2="70"
stroke="#1e1e3a"
stroke-width="0.5"
id="line16" />
<line
x1="0"
y1="80"
x2="100"
y2="80"
stroke="#1e1e3a"
stroke-width="0.5"
id="line17" />
<line
x1="0"
y1="90"
x2="100"
y2="90"
stroke="#1e1e3a"
stroke-width="0.5"
id="line18" />
<!-- Center crosshair -->
<line
x1="50"
y1="0"
x2="50"
y2="100"
stroke="#2a2a5a"
stroke-width="0.8"
id="line19" />
<line
x1="0"
y1="50"
x2="100"
y2="50"
stroke="#2a2a5a"
stroke-width="0.8"
id="line20" />
<!-- Pattern area border -->
<rect
x="0"
y="0"
width="100"
height="100"
fill="none"
stroke="#333366"
stroke-width="0.6"
id="rect20" />
<!-- Quarter markers -->
<rect
x="25"
y="0"
width="50"
height="0"
fill="none"
stroke="#2a2a5a"
stroke-width="0.4"
id="rect21" />
<text
x="1"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text21">0</text>
<text
x="23"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text22">25</text>
<text
x="48"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text23">50</text>
<text
x="73"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text24">75</text>
<text
x="97"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text25">100</text>
<text
x="-14"
y="4"
font-size="3"
fill="#444488"
font-family="monospace"
id="text26">0</text>
<text
x="-14"
y="29"
font-size="3"
fill="#444488"
font-family="monospace"
id="text27">25</text>
<text
x="-14"
y="54"
font-size="3"
fill="#444488"
font-family="monospace"
id="text28">50</text>
<text
x="-14"
y="79"
font-size="3"
fill="#444488"
font-family="monospace"
id="text29">75</text>
<text
x="-18"
y="103"
font-size="3"
fill="#444488"
font-family="monospace"
id="text30">100</text>
</g>
<!-- PATTERN — edit this layer only -->
<!-- Shapes must use fill="#ffffff". Stay within 0-100. -->
<g
inkscape:label="Pattern (edit this)"
inkscape:groupmode="layer"
id="layer-pattern">
<!-- Example: single centered circle. Replace with your design. -->
<rect
x="34.776787"
y="35.223213"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect30" />
<rect
x="68.481949"
y="68.481926"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect32"
style="stroke-width:0.434527" />
<rect
x="17.812611"
y="18.928654"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect34"
style="stroke-width:0.434527" />
<rect
x="67.365891"
y="17.589373"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect37"
style="stroke-width:0.434527" />
<rect
x="18.035822"
y="68.25872"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect38"
style="stroke-width:0.434527" />
</g>
</svg>

View File

@ -0,0 +1,402 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
ITALIC NEON — PATTERN TEMPLATE
================================
HOW TO USE:
1. File > Save As > pattern-01.svg (increment number for each new pattern)
2. Edit ONLY the "Pattern (edit this)" layer — all other layers are guides
3. Draw white shapes (fill="#ffffff") within the 0-100 coordinate area
4. Shapes: use <rect rx="..." ry="..."> for circles/pills, or <ellipse>
- Circle: <rect x="35" y="35" width="30" height="30" rx="15" ry="15" fill="#ffffff"/>
- Horizontal pill: <rect x="20" y="42" width="60" height="16" rx="8" ry="8" fill="#ffffff"/>
- Ellipse: <ellipse cx="50" cy="50" rx="25" ry="15" fill="#ffffff"/>
5. Stay within x: 0-100, y: 0-100. Leave ~5 units of margin from edges.
6. Aim for 1-8 shapes, non-overlapping, with geometric/symmetric relations.
7. The skew is applied at render time — draw flat, it will look correct in the icon.
The black rect is the inner icon area. The purple rect is the outer chrome (color varies per project at runtime).
-->
<svg
width="540"
height="540"
viewBox="-20 -20 140 140"
version="1.1"
id="template"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="pattern-12.svg"
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"
xmlns:sodipodi0="http://sodipodi.sourceforge.net/DTD/sodipodi-0.0.dtd">
<defs
id="defs30" />
<sodipodi:namedview
id="namedview30"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.1614884"
inkscape:cx="236.3347"
inkscape:cy="243.22241"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer-pattern" />
<sodipodi0:namedview
id="namedview"
pagecolor="#1a1a2e"
bordercolor="#555555"
inkscape:document-units="px"
showgrid="true"
inkscape:current-layer="layer-pattern">
<inkscape:grid
type="xygrid"
units="px"
spacingx="5"
spacingy="5"
empspacing="2"
color="#2a2a4a"
empcolor="#3a3a6a"
opacity="0.8"
empopacity="1" />
</sodipodi0:namedview>
<!-- CHROME GUIDE — locked, context only, not exported as pattern data -->
<g
inkscape:label="Chrome (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-chrome"
sodipodi0:insensitive="true">
<!-- Outer colored rect: placeholder purple, will use project color at runtime -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="#6600cc"
opacity="0.35"
id="rect1" />
<!-- Glow hint -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="none"
stroke="#8833ff"
stroke-width="1.5"
opacity="0.5"
id="rect2" />
<!-- Inner black area = the 0,0 → 100,100 pattern space -->
<rect
x="0"
y="0"
width="100"
height="100"
rx="14"
ry="14"
fill="#000000"
id="rect3" />
</g>
<!-- GRID GUIDE — locked -->
<g
inkscape:label="Grid (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-grid"
sodipodi0:insensitive="true">
<!-- Minor lines every 10 units -->
<line
x1="10"
y1="0"
x2="10"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line3" />
<line
x1="20"
y1="0"
x2="20"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line4" />
<line
x1="30"
y1="0"
x2="30"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line5" />
<line
x1="40"
y1="0"
x2="40"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line6" />
<line
x1="60"
y1="0"
x2="60"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line7" />
<line
x1="70"
y1="0"
x2="70"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line8" />
<line
x1="80"
y1="0"
x2="80"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line9" />
<line
x1="90"
y1="0"
x2="90"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line10" />
<line
x1="0"
y1="10"
x2="100"
y2="10"
stroke="#1e1e3a"
stroke-width="0.5"
id="line11" />
<line
x1="0"
y1="20"
x2="100"
y2="20"
stroke="#1e1e3a"
stroke-width="0.5"
id="line12" />
<line
x1="0"
y1="30"
x2="100"
y2="30"
stroke="#1e1e3a"
stroke-width="0.5"
id="line13" />
<line
x1="0"
y1="40"
x2="100"
y2="40"
stroke="#1e1e3a"
stroke-width="0.5"
id="line14" />
<line
x1="0"
y1="60"
x2="100"
y2="60"
stroke="#1e1e3a"
stroke-width="0.5"
id="line15" />
<line
x1="0"
y1="70"
x2="100"
y2="70"
stroke="#1e1e3a"
stroke-width="0.5"
id="line16" />
<line
x1="0"
y1="80"
x2="100"
y2="80"
stroke="#1e1e3a"
stroke-width="0.5"
id="line17" />
<line
x1="0"
y1="90"
x2="100"
y2="90"
stroke="#1e1e3a"
stroke-width="0.5"
id="line18" />
<!-- Center crosshair -->
<line
x1="50"
y1="0"
x2="50"
y2="100"
stroke="#2a2a5a"
stroke-width="0.8"
id="line19" />
<line
x1="0"
y1="50"
x2="100"
y2="50"
stroke="#2a2a5a"
stroke-width="0.8"
id="line20" />
<!-- Pattern area border -->
<rect
x="0"
y="0"
width="100"
height="100"
fill="none"
stroke="#333366"
stroke-width="0.6"
id="rect20" />
<!-- Quarter markers -->
<rect
x="25"
y="0"
width="50"
height="0"
fill="none"
stroke="#2a2a5a"
stroke-width="0.4"
id="rect21" />
<text
x="1"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text21">0</text>
<text
x="23"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text22">25</text>
<text
x="48"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text23">50</text>
<text
x="73"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text24">75</text>
<text
x="97"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text25">100</text>
<text
x="-14"
y="4"
font-size="3"
fill="#444488"
font-family="monospace"
id="text26">0</text>
<text
x="-14"
y="29"
font-size="3"
fill="#444488"
font-family="monospace"
id="text27">25</text>
<text
x="-14"
y="54"
font-size="3"
fill="#444488"
font-family="monospace"
id="text28">50</text>
<text
x="-14"
y="79"
font-size="3"
fill="#444488"
font-family="monospace"
id="text29">75</text>
<text
x="-18"
y="103"
font-size="3"
fill="#444488"
font-family="monospace"
id="text30">100</text>
</g>
<!-- PATTERN — edit this layer only -->
<!-- Shapes must use fill="#ffffff". Stay within 0-100. -->
<g
inkscape:label="Pattern (edit this)"
inkscape:groupmode="layer"
id="layer-pattern">
<!-- Example: single centered circle. Replace with your design. -->
<rect
x="8.4376574"
y="33.883934"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect30" />
<rect
x="63.794476"
y="43.035648"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect32"
style="stroke-width:0.434527" />
<rect
x="43.258888"
y="9.3304958"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect34"
style="stroke-width:0.434527" />
<rect
x="43.258888"
y="78.303307"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect38"
style="stroke-width:0.434527" />
</g>
</svg>

View File

@ -0,0 +1,391 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
ITALIC NEON — PATTERN TEMPLATE
================================
HOW TO USE:
1. File > Save As > pattern-01.svg (increment number for each new pattern)
2. Edit ONLY the "Pattern (edit this)" layer — all other layers are guides
3. Draw white shapes (fill="#ffffff") within the 0-100 coordinate area
4. Shapes: use <rect rx="..." ry="..."> for circles/pills, or <ellipse>
- Circle: <rect x="35" y="35" width="30" height="30" rx="15" ry="15" fill="#ffffff"/>
- Horizontal pill: <rect x="20" y="42" width="60" height="16" rx="8" ry="8" fill="#ffffff"/>
- Ellipse: <ellipse cx="50" cy="50" rx="25" ry="15" fill="#ffffff"/>
5. Stay within x: 0-100, y: 0-100. Leave ~5 units of margin from edges.
6. Aim for 1-8 shapes, non-overlapping, with geometric/symmetric relations.
7. The skew is applied at render time — draw flat, it will look correct in the icon.
The black rect is the inner icon area. The purple rect is the outer chrome (color varies per project at runtime).
-->
<svg
width="540"
height="540"
viewBox="-20 -20 140 140"
version="1.1"
id="template"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="pattern-13.svg"
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"
xmlns:sodipodi0="http://sodipodi.sourceforge.net/DTD/sodipodi-0.0.dtd">
<defs
id="defs30" />
<sodipodi:namedview
id="namedview30"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.1614884"
inkscape:cx="236.3347"
inkscape:cy="243.22241"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer-pattern" />
<sodipodi0:namedview
id="namedview"
pagecolor="#1a1a2e"
bordercolor="#555555"
inkscape:document-units="px"
showgrid="true"
inkscape:current-layer="layer-pattern">
<inkscape:grid
type="xygrid"
units="px"
spacingx="5"
spacingy="5"
empspacing="2"
color="#2a2a4a"
empcolor="#3a3a6a"
opacity="0.8"
empopacity="1" />
</sodipodi0:namedview>
<!-- CHROME GUIDE — locked, context only, not exported as pattern data -->
<g
inkscape:label="Chrome (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-chrome"
sodipodi0:insensitive="true">
<!-- Outer colored rect: placeholder purple, will use project color at runtime -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="#6600cc"
opacity="0.35"
id="rect1" />
<!-- Glow hint -->
<rect
x="-14"
y="-14"
width="128"
height="128"
rx="20"
ry="20"
fill="none"
stroke="#8833ff"
stroke-width="1.5"
opacity="0.5"
id="rect2" />
<!-- Inner black area = the 0,0 → 100,100 pattern space -->
<rect
x="0"
y="0"
width="100"
height="100"
rx="14"
ry="14"
fill="#000000"
id="rect3" />
</g>
<!-- GRID GUIDE — locked -->
<g
inkscape:label="Grid (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-grid"
sodipodi0:insensitive="true">
<!-- Minor lines every 10 units -->
<line
x1="10"
y1="0"
x2="10"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line3" />
<line
x1="20"
y1="0"
x2="20"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line4" />
<line
x1="30"
y1="0"
x2="30"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line5" />
<line
x1="40"
y1="0"
x2="40"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line6" />
<line
x1="60"
y1="0"
x2="60"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line7" />
<line
x1="70"
y1="0"
x2="70"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line8" />
<line
x1="80"
y1="0"
x2="80"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line9" />
<line
x1="90"
y1="0"
x2="90"
y2="100"
stroke="#1e1e3a"
stroke-width="0.5"
id="line10" />
<line
x1="0"
y1="10"
x2="100"
y2="10"
stroke="#1e1e3a"
stroke-width="0.5"
id="line11" />
<line
x1="0"
y1="20"
x2="100"
y2="20"
stroke="#1e1e3a"
stroke-width="0.5"
id="line12" />
<line
x1="0"
y1="30"
x2="100"
y2="30"
stroke="#1e1e3a"
stroke-width="0.5"
id="line13" />
<line
x1="0"
y1="40"
x2="100"
y2="40"
stroke="#1e1e3a"
stroke-width="0.5"
id="line14" />
<line
x1="0"
y1="60"
x2="100"
y2="60"
stroke="#1e1e3a"
stroke-width="0.5"
id="line15" />
<line
x1="0"
y1="70"
x2="100"
y2="70"
stroke="#1e1e3a"
stroke-width="0.5"
id="line16" />
<line
x1="0"
y1="80"
x2="100"
y2="80"
stroke="#1e1e3a"
stroke-width="0.5"
id="line17" />
<line
x1="0"
y1="90"
x2="100"
y2="90"
stroke="#1e1e3a"
stroke-width="0.5"
id="line18" />
<!-- Center crosshair -->
<line
x1="50"
y1="0"
x2="50"
y2="100"
stroke="#2a2a5a"
stroke-width="0.8"
id="line19" />
<line
x1="0"
y1="50"
x2="100"
y2="50"
stroke="#2a2a5a"
stroke-width="0.8"
id="line20" />
<!-- Pattern area border -->
<rect
x="0"
y="0"
width="100"
height="100"
fill="none"
stroke="#333366"
stroke-width="0.6"
id="rect20" />
<!-- Quarter markers -->
<rect
x="25"
y="0"
width="50"
height="0"
fill="none"
stroke="#2a2a5a"
stroke-width="0.4"
id="rect21" />
<text
x="1"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text21">0</text>
<text
x="23"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text22">25</text>
<text
x="48"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text23">50</text>
<text
x="73"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text24">75</text>
<text
x="97"
y="-2"
font-size="3"
fill="#444488"
font-family="monospace"
id="text25">100</text>
<text
x="-14"
y="4"
font-size="3"
fill="#444488"
font-family="monospace"
id="text26">0</text>
<text
x="-14"
y="29"
font-size="3"
fill="#444488"
font-family="monospace"
id="text27">25</text>
<text
x="-14"
y="54"
font-size="3"
fill="#444488"
font-family="monospace"
id="text28">50</text>
<text
x="-14"
y="79"
font-size="3"
fill="#444488"
font-family="monospace"
id="text29">75</text>
<text
x="-18"
y="103"
font-size="3"
fill="#444488"
font-family="monospace"
id="text30">100</text>
</g>
<!-- PATTERN — edit this layer only -->
<!-- Shapes must use fill="#ffffff". Stay within 0-100. -->
<g
inkscape:label="Pattern (edit this)"
inkscape:groupmode="layer"
id="layer-pattern">
<!-- Example: single centered circle. Replace with your design. -->
<rect
x="8.4376574"
y="33.883934"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect30" />
<rect
x="76.964043"
y="78.749733"
width="13.035815"
height="13.035815"
rx="6.5179076"
ry="6.5179076"
fill="#ffffff"
id="rect38"
style="stroke-width:0.434527" />
<rect
x="63.794472"
y="5.0894618"
width="30"
height="30"
rx="15"
ry="15"
fill="#ffffff"
id="rect39" />
</g>
</svg>

View File

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
ITALIC NEON — PATTERN TEMPLATE
================================
HOW TO USE:
1. File > Save As > pattern-01.svg (increment number for each new pattern)
2. Edit ONLY the "Pattern (edit this)" layer — all other layers are guides
3. Draw white shapes (fill="#ffffff") within the 0-100 coordinate area
4. Shapes: use <rect rx="..." ry="..."> for circles/pills, or <ellipse>
- Circle: <rect x="35" y="35" width="30" height="30" rx="15" ry="15" fill="#ffffff"/>
- Horizontal pill: <rect x="20" y="42" width="60" height="16" rx="8" ry="8" fill="#ffffff"/>
- Ellipse: <ellipse cx="50" cy="50" rx="25" ry="15" fill="#ffffff"/>
5. Stay within x: 0-100, y: 0-100. Leave ~5 units of margin from edges.
6. Aim for 1-8 shapes, non-overlapping, with geometric/symmetric relations.
7. The skew is applied at render time — draw flat, it will look correct in the icon.
The black rect is the inner icon area. The purple rect is the outer chrome (color varies per project at runtime).
-->
<svg
width="540"
height="540"
viewBox="-20 -20 140 140"
version="1.1"
id="template"
inkscape:version="1.4.3"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.0.dtd"
xmlns="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview"
pagecolor="#1a1a2e"
bordercolor="#555555"
inkscape:document-units="px"
showgrid="true"
inkscape:current-layer="layer-pattern">
<inkscape:grid type="xygrid" units="px" spacingx="5" spacingy="5" empspacing="2"
color="#2a2a4a" empcolor="#3a3a6a" opacity="0.8" empopacity="1"/>
</sodipodi:namedview>
<!-- CHROME GUIDE — locked, context only, not exported as pattern data -->
<g inkscape:label="Chrome (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-chrome"
sodipodi:insensitive="true">
<!-- Outer colored rect: placeholder purple, will use project color at runtime -->
<rect x="-14" y="-14" width="128" height="128" rx="20" ry="20"
fill="#6600cc" opacity="0.35"/>
<!-- Glow hint -->
<rect x="-14" y="-14" width="128" height="128" rx="20" ry="20"
fill="none" stroke="#8833ff" stroke-width="1.5" opacity="0.5"/>
<!-- Inner black area = the 0,0 → 100,100 pattern space -->
<rect x="0" y="0" width="100" height="100" rx="14" ry="14"
fill="#000000"/>
</g>
<!-- GRID GUIDE — locked -->
<g inkscape:label="Grid (guide — do not edit)"
inkscape:groupmode="layer"
id="layer-grid"
sodipodi:insensitive="true">
<!-- Minor lines every 10 units -->
<line x1="10" y1="0" x2="10" y2="100" stroke="#1e1e3a" stroke-width="0.5"/>
<line x1="20" y1="0" x2="20" y2="100" stroke="#1e1e3a" stroke-width="0.5"/>
<line x1="30" y1="0" x2="30" y2="100" stroke="#1e1e3a" stroke-width="0.5"/>
<line x1="40" y1="0" x2="40" y2="100" stroke="#1e1e3a" stroke-width="0.5"/>
<line x1="60" y1="0" x2="60" y2="100" stroke="#1e1e3a" stroke-width="0.5"/>
<line x1="70" y1="0" x2="70" y2="100" stroke="#1e1e3a" stroke-width="0.5"/>
<line x1="80" y1="0" x2="80" y2="100" stroke="#1e1e3a" stroke-width="0.5"/>
<line x1="90" y1="0" x2="90" y2="100" stroke="#1e1e3a" stroke-width="0.5"/>
<line x1="0" y1="10" x2="100" y2="10" stroke="#1e1e3a" stroke-width="0.5"/>
<line x1="0" y1="20" x2="100" y2="20" stroke="#1e1e3a" stroke-width="0.5"/>
<line x1="0" y1="30" x2="100" y2="30" stroke="#1e1e3a" stroke-width="0.5"/>
<line x1="0" y1="40" x2="100" y2="40" stroke="#1e1e3a" stroke-width="0.5"/>
<line x1="0" y1="60" x2="100" y2="60" stroke="#1e1e3a" stroke-width="0.5"/>
<line x1="0" y1="70" x2="100" y2="70" stroke="#1e1e3a" stroke-width="0.5"/>
<line x1="0" y1="80" x2="100" y2="80" stroke="#1e1e3a" stroke-width="0.5"/>
<line x1="0" y1="90" x2="100" y2="90" stroke="#1e1e3a" stroke-width="0.5"/>
<!-- Center crosshair -->
<line x1="50" y1="0" x2="50" y2="100" stroke="#2a2a5a" stroke-width="0.8"/>
<line x1="0" y1="50" x2="100" y2="50" stroke="#2a2a5a" stroke-width="0.8"/>
<!-- Pattern area border -->
<rect x="0" y="0" width="100" height="100" fill="none" stroke="#333366" stroke-width="0.6"/>
<!-- Quarter markers -->
<rect x="25" y="0" width="50" height="0" fill="none" stroke="#2a2a5a" stroke-width="0.4"/>
<text x="1" y="-2" font-size="3" fill="#444488" font-family="monospace">0</text>
<text x="23" y="-2" font-size="3" fill="#444488" font-family="monospace">25</text>
<text x="48" y="-2" font-size="3" fill="#444488" font-family="monospace">50</text>
<text x="73" y="-2" font-size="3" fill="#444488" font-family="monospace">75</text>
<text x="97" y="-2" font-size="3" fill="#444488" font-family="monospace">100</text>
<text x="-14" y="4" font-size="3" fill="#444488" font-family="monospace">0</text>
<text x="-14" y="29" font-size="3" fill="#444488" font-family="monospace">25</text>
<text x="-14" y="54" font-size="3" fill="#444488" font-family="monospace">50</text>
<text x="-14" y="79" font-size="3" fill="#444488" font-family="monospace">75</text>
<text x="-18" y="103" font-size="3" fill="#444488" font-family="monospace">100</text>
</g>
<!-- PATTERN — edit this layer only -->
<!-- Shapes must use fill="#ffffff". Stay within 0-100. -->
<g inkscape:label="Pattern (edit this)"
inkscape:groupmode="layer"
id="layer-pattern">
<!-- Example: single centered circle. Replace with your design. -->
<rect x="35" y="35" width="30" height="30" rx="15" ry="15" fill="#ffffff"/>
</g>
</svg>

View File

@ -0,0 +1,640 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="3840"
height="2160"
viewBox="0 0 3840 2160"
version="1.1"
id="svg5"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="italic-neon.svg"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview7"
pagecolor="#333333"
bordercolor="#404040"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#333333"
inkscape:document-units="px"
showgrid="false"
inkscape:zoom="0.20890503"
inkscape:cx="1797.4675"
inkscape:cy="1170.3883"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g13" /><defs
id="defs2"><linearGradient
id="linearGradient65"
inkscape:collect="never"><stop
style="stop-color:#414caa;stop-opacity:1;"
offset="0"
id="stop64" /><stop
style="stop-color:#2422cf;stop-opacity:0.77900553;"
offset="1"
id="stop65" /></linearGradient><linearGradient
id="linearGradient63"
inkscape:collect="never"><stop
style="stop-color:#0076fd;stop-opacity:1"
offset="0"
id="stop62" /><stop
style="stop-color:#1a84c5;stop-opacity:0.6767956;"
offset="1"
id="stop63" /></linearGradient><linearGradient
id="linearGradient60"
inkscape:collect="never"><stop
style="stop-color:#ffea64;stop-opacity:1;"
offset="0"
id="stop59" /><stop
style="stop-color:#ffa264;stop-opacity:1;"
offset="1"
id="stop60" /></linearGradient><linearGradient
id="linearGradient56"
inkscape:collect="never"><stop
style="stop-color:#000041;stop-opacity:1;"
offset="0"
id="stop56" /><stop
style="stop-color:#000041;stop-opacity:0.7845304;"
offset="1"
id="stop57" /></linearGradient><linearGradient
id="linearGradient46"
inkscape:collect="never"><stop
style="stop-color:#611b0c;stop-opacity:1;"
offset="0"
id="stop48" /><stop
style="stop-color:#4b0429;stop-opacity:0;"
offset="1"
id="stop47" /></linearGradient><linearGradient
id="linearGradient45"
inkscape:collect="never"><stop
style="stop-color:#2d1717;stop-opacity:1;"
offset="0"
id="stop45" /><stop
style="stop-color:#0f0f15;stop-opacity:1;"
offset="1"
id="stop46" /></linearGradient><linearGradient
id="linearGradient43"
inkscape:collect="never"><stop
style="stop-color:#1a84c5;stop-opacity:1;"
offset="0"
id="stop43" /><stop
style="stop-color:#1a84c5;stop-opacity:0.6767956;"
offset="1"
id="stop44" /></linearGradient><linearGradient
id="linearGradient40"
inkscape:collect="never"><stop
style="stop-color:#9a133a;stop-opacity:1;"
offset="0"
id="stop40" /><stop
style="stop-color:#9a1375;stop-opacity:0.50552487;"
offset="1"
id="stop41" /></linearGradient><linearGradient
id="linearGradient38"
inkscape:collect="never"><stop
style="stop-color:#850d4f;stop-opacity:1;"
offset="0"
id="stop38" /><stop
style="stop-color:#5a2c66;stop-opacity:1;"
offset="1"
id="stop39" /></linearGradient><linearGradient
id="linearGradient36"
inkscape:collect="never"><stop
style="stop-color:#283069;stop-opacity:1;"
offset="0"
id="stop36" /><stop
style="stop-color:#0c0b46;stop-opacity:0.77900553;"
offset="1"
id="stop37" /></linearGradient><linearGradient
id="linearGradient7"
inkscape:collect="never"><stop
style="stop-color:#ffda25;stop-opacity:1;"
offset="0"
id="stop7" /><stop
style="stop-color:#ff3e25;stop-opacity:1;"
offset="1"
id="stop8" /></linearGradient><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath7940"><rect
style="fill:#333333;fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect7942"
width="1440"
height="810"
x="0"
y="0" /></clipPath><filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter5"
x="-0.2561334"
y="-0.24780269"
width="1.5122668"
height="1.4956054"><feGaussianBlur
inkscape:collect="always"
stdDeviation="69.411603"
id="feGaussianBlur5" /></filter><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient60"
id="linearGradient8"
x1="1669.6682"
y1="768.40881"
x2="1682.3977"
y2="1245.6689"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-116.04751,13.150766)" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient7"
id="linearGradient15"
gradientUnits="userSpaceOnUse"
x1="1669.6682"
y1="768.40881"
x2="1682.3977"
y2="1245.6689" /><linearGradient
xlink:href="#linearGradient7"
id="linearGradient21"
gradientUnits="userSpaceOnUse"
x1="1669.6682"
y1="768.40881"
x2="1682.3977"
y2="1245.6689"
gradientTransform="translate(21.551594,-189.27249)"
inkscape:collect="never" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient65"
id="linearGradient37"
x1="-624.23932"
y1="876.91034"
x2="6438.915"
y2="1084.6312"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-114.6496,13.663333)" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient38"
id="linearGradient39"
x1="543.13513"
y1="909.59547"
x2="4564.0665"
y2="909.59547"
gradientUnits="userSpaceOnUse" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient40"
id="linearGradient41"
x1="544.56726"
y1="712.94585"
x2="4565.4987"
y2="712.94585"
gradientUnits="userSpaceOnUse" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient43"
id="linearGradient44"
x1="3747.958"
y1="-84.731155"
x2="4035.8533"
y2="482.54166"
gradientUnits="userSpaceOnUse" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient45"
id="radialGradient46"
cx="1934.041"
cy="-286.27405"
fx="1934.041"
fy="-286.27405"
r="1920"
gradientTransform="matrix(1.4338096,0,0,1.1246674,-857.83344,320.13179)"
gradientUnits="userSpaceOnUse" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient46"
id="radialGradient48"
cx="1095.6782"
cy="1786.6388"
fx="1095.6782"
fy="1786.6388"
r="869.29773"
gradientTransform="matrix(1,0,0,0.97237571,2493.9563,-386.25002)"
gradientUnits="userSpaceOnUse" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient36"
id="linearGradient54"
gradientUnits="userSpaceOnUse"
x1="543.13513"
y1="909.59547"
x2="4564.0665"
y2="909.59547" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient7"
id="linearGradient55"
gradientUnits="userSpaceOnUse"
x1="1669.6682"
y1="768.40881"
x2="1682.3977"
y2="1245.6689" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient56"
id="radialGradient57"
cx="1034.474"
cy="856.92493"
fx="1034.474"
fy="856.92493"
r="276.50925"
gradientTransform="matrix(1,0,0,1.0336182,-154.9789,-10.503984)"
gradientUnits="userSpaceOnUse" /><radialGradient
xlink:href="#linearGradient63"
id="radialGradient62"
cx="3726.292"
cy="288.33737"
fx="3726.292"
fy="288.33737"
r="600.08325"
gradientTransform="matrix(2.0952238,-0.88278288,-1.2179052,2.1199119,-3615.4392,2810.7434)"
gradientUnits="userSpaceOnUse" /><filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter65"
x="-0.052118368"
y="-0.60273221"
width="1.1042367"
height="2.2054644"><feGaussianBlur
inkscape:collect="always"
stdDeviation="41.388646"
id="feGaussianBlur65" /></filter></defs><g
inkscape:label="Content"
inkscape:groupmode="layer"
id="layer1"
style="fill:#ffffff;fill-opacity:1"><rect
style="opacity:1;fill:url(#radialGradient46);fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect1"
width="3840"
height="2160"
x="0"
y="0"
ry="7.9545546" /><g
id="g8"
transform="matrix(0.51477218,0,0,0.51477218,750.18195,221.32555)"
style="opacity:1"><rect
style="opacity:1;fill:none;fill-opacity:1;stroke:#115dff;stroke-width:3.96021;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect65"
width="4167.8018"
height="605.45441"
x="418.77679"
y="671.59515"
ry="72.055"
transform="matrix(1,0,-0.27133169,0.9624859,0,0)" /><rect
style="opacity:0.08085106;fill:none;fill-opacity:1;stroke:#11cbff;stroke-width:19.80102824;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:stroke fill markers;stroke-dasharray:none"
id="rect56"
width="4167.8018"
height="605.45441"
x="380.40701"
y="631.54047"
ry="72.055"
transform="matrix(1,0,-0.27133169,0.9624859,0,0)" /><rect
style="opacity:0.38723404;fill:none;fill-opacity:1;stroke:#0226ff;stroke-width:10.193;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:stroke fill markers"
id="rect55"
width="4167.8018"
height="605.45441"
x="336.33093"
y="594.06683"
ry="72.055"
transform="matrix(1,0,-0.27133169,0.9624859,0,0)" /><rect
style="opacity:1;fill:url(#linearGradient37);fill-opacity:1;stroke:none;stroke-width:10.193;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect8"
width="4020.9314"
height="493.97916"
x="428.48553"
y="676.26923"
ry="72.055"
transform="matrix(1,0,-0.27133169,0.9624859,0,0)" /><text
xml:space="preserve"
style="font-weight:bold;font-size:229.213px;line-height:1.4;font-family:'Kode Mono';-inkscape-font-specification:'Kode Mono Bold';writing-mode:lr-tb;direction:ltr;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:57.3032;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers;filter:url(#filter65)"
x="1368.9021"
y="968.88202"
id="text65"
transform="skewX(-9.9600568)"><tspan
sodipodi:role="line"
id="tspan65"
x="1368.9021"
y="968.88202"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Bold';fill:#000000;fill-opacity:1;stroke-width:57.3032">MY-OWN-PROJECT</tspan></text><text
xml:space="preserve"
style="font-weight:bold;font-size:229.213px;line-height:1.4;font-family:'Kode Mono';-inkscape-font-specification:'Kode Mono Bold';writing-mode:lr-tb;direction:ltr;opacity:1;fill:#0065d9;fill-opacity:1;stroke:none;stroke-width:57.3032;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
x="1350.876"
y="959.84082"
id="text7"
transform="skewX(-9.9600568)"><tspan
sodipodi:role="line"
id="tspan7"
x="1350.876"
y="959.84082"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Bold';fill:#0065d9;fill-opacity:1;stroke-width:57.3032">MY-OWN-PROJECT</tspan></text><text
xml:space="preserve"
style="font-weight:bold;font-size:229.213px;line-height:1.4;font-family:'Kode Mono';-inkscape-font-specification:'Kode Mono Bold';writing-mode:lr-tb;direction:ltr;opacity:1;fill:url(#linearGradient8);fill-opacity:1;stroke:none;stroke-width:57.3032;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
x="1329.0663"
y="935.90649"
id="text6"
transform="skewX(-9.9600568)"><tspan
sodipodi:role="line"
id="tspan6"
x="1329.0663"
y="935.90649"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Bold';fill:url(#linearGradient8);fill-opacity:1;stroke-width:57.3032">MY-OWN-PROJECT</tspan></text><g
id="g6"
transform="matrix(0.74186024,0,0,0.74186024,284.22401,182.48817)"><rect
style="opacity:1;mix-blend-mode:normal;fill:#3b46a0;fill-opacity:1;stroke:none;stroke-width:10.1616;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers;filter:url(#filter5)"
id="rect5"
width="650.3949"
height="672.26007"
x="732.64203"
y="542.77356"
ry="169.38864"
transform="matrix(1.158109,0,-0.28862323,1.1215673,-292.16247,-116.85116)" /><g
id="g5"><rect
style="opacity:1;fill:#004fdb;fill-opacity:1;stroke:none;stroke-width:10.1616;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect2"
width="650.3949"
height="672.26007"
x="577.66315"
y="561.07788"
ry="169.38864"
transform="matrix(1,0,-0.2492194,0.96844705,0,0)" /><rect
style="opacity:1;fill:url(#radialGradient57);stroke:none;stroke-width:8.64022;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect3"
width="553.01849"
height="571.60999"
x="602.98584"
y="589.42426"
ry="144.02795"
transform="matrix(1,0,-0.2492194,0.96844705,0,0)" /><rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2.99946;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect4"
width="191.9814"
height="198.43549"
x="646.90363"
y="639.01685"
ry="93.48381"
transform="matrix(1,0,-0.2492194,0.96844705,0,0)" /></g></g></g><g
id="g15"
transform="matrix(0.51477218,0,0,0.51477218,780.64536,655.48683)"><text
xml:space="preserve"
style="font-weight:bold;font-size:229.213px;line-height:1.4;font-family:'Kode Mono';-inkscape-font-specification:'Kode Mono Bold';writing-mode:lr-tb;direction:ltr;opacity:1;fill:#5c25ff;fill-opacity:1;stroke:none;stroke-width:57.3032;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
x="1466.9235"
y="946.69006"
id="text8"
transform="skewX(-9.9600568)"><tspan
sodipodi:role="line"
id="tspan8"
x="1466.9235"
y="946.69006"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Bold';fill:#5c25ff;fill-opacity:1;stroke-width:57.3032">VIVI NUMBER ONE</tspan></text><rect
style="opacity:0.52766;fill:url(#linearGradient39);stroke:none;stroke-width:10.193;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect9"
width="4020.9314"
height="493.97916"
x="543.13513"
y="662.6059"
ry="72.055"
transform="matrix(1,0,-0.27133169,0.9624859,0,0)" /><text
xml:space="preserve"
style="font-weight:bold;font-size:229.213px;line-height:1.4;font-family:'Kode Mono';-inkscape-font-specification:'Kode Mono Bold';writing-mode:lr-tb;direction:ltr;opacity:1;fill:url(#linearGradient15);fill-opacity:1;stroke:none;stroke-width:57.3032;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
x="1445.1138"
y="922.75574"
id="text9"
transform="skewX(-9.9600568)"><tspan
sodipodi:role="line"
id="tspan9"
x="1445.1138"
y="922.75574"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Bold';fill:url(#linearGradient15);fill-opacity:1;stroke-width:57.3032">VIVI NUMBER ONE</tspan></text><g
id="g14"
transform="matrix(0.74186024,0,0,0.74186024,284.22401,182.48817)"><rect
style="opacity:1;mix-blend-mode:normal;fill:#863ba0;fill-opacity:1;stroke:none;stroke-width:10.1616;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers;filter:url(#filter5)"
id="rect10"
width="650.3949"
height="672.26007"
x="732.64203"
y="542.77356"
ry="169.38864"
transform="matrix(1.158109,0,-0.28862323,1.1215673,-132.62178,-134.5779)" /><g
id="g13"><rect
style="opacity:1;fill:#bb00db;fill-opacity:1;stroke:none;stroke-width:10.1616;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect11"
width="650.3949"
height="672.26007"
x="732.64203"
y="542.77356"
ry="169.38864"
transform="matrix(1,0,-0.2492194,0.96844705,0,0)" /><rect
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:8.64022;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect12"
width="553.01849"
height="571.60999"
x="757.96472"
y="571.11993"
ry="144.02795"
transform="matrix(1,0,-0.2492194,0.96844705,0,0)" /><rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2.99946;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect13"
width="191.9814"
height="198.43549"
x="1044.7726"
y="728.56091"
ry="93.48381"
transform="matrix(1,0,-0.2492194,0.96844705,0,0)" /><rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2.99946;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect21"
width="191.9814"
height="198.43549"
x="805.70337"
y="740.81641"
ry="93.48381"
transform="matrix(1,0,-0.2492194,0.96844705,0,0)" /><rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.88797;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect22"
width="120.84007"
height="124.9025"
x="950.50409"
y="615.8103"
ry="58.842106"
transform="matrix(1,0,-0.2492194,0.96844705,0,0)" /><rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.88797;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect23"
width="120.84007"
height="124.9025"
x="971.18292"
y="936.90436"
ry="58.842106"
transform="matrix(1,0,-0.2492194,0.96844705,0,0)" /></g></g></g><g
id="g21"
transform="matrix(0.51477218,0,0,0.51477218,737.93709,1148.1585)"><g
id="g24"
transform="translate(0,105.65989)"><text
xml:space="preserve"
style="font-weight:bold;font-size:229.213px;line-height:1.4;font-family:'Kode Mono';-inkscape-font-specification:'Kode Mono Bold';writing-mode:lr-tb;direction:ltr;opacity:1;fill:#5c25ff;fill-opacity:1;stroke:none;stroke-width:57.3032;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
x="1488.4751"
y="757.41754"
id="text15"
transform="skewX(-9.9600568)"><tspan
sodipodi:role="line"
id="tspan15"
x="1488.4751"
y="757.41754"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Bold';fill:#5c25ff;fill-opacity:1;stroke-width:57.3032">SOME OTHER PROJECT</tspan></text><rect
style="opacity:0.52766;fill:url(#linearGradient41);stroke:none;stroke-width:10.193;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect15"
width="4020.9314"
height="493.97916"
x="544.56726"
y="465.95627"
ry="72.055"
transform="matrix(1,0,-0.27133169,0.9624859,0,0)" /><text
xml:space="preserve"
style="font-weight:bold;font-size:229.213px;line-height:1.4;font-family:'Kode Mono';-inkscape-font-specification:'Kode Mono Bold';writing-mode:lr-tb;direction:ltr;opacity:1;fill:url(#linearGradient21);fill-opacity:1;stroke:none;stroke-width:57.3032;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
x="1466.6654"
y="733.48322"
id="text16"
transform="skewX(-9.9600568)"><tspan
sodipodi:role="line"
id="tspan16"
x="1466.6654"
y="733.48322"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Bold';fill:url(#linearGradient21);fill-opacity:1;stroke-width:57.3032">SOME OTHER PROJECT</tspan></text><g
id="g20"
transform="matrix(0.74186024,0,0,0.74186024,339.01342,-6.7843222)"><rect
style="opacity:1;mix-blend-mode:normal;fill:#a03b66;fill-opacity:1;stroke:none;stroke-width:10.1616;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers;filter:url(#filter5)"
id="rect16"
width="650.3949"
height="672.26007"
x="732.64203"
y="542.77356"
ry="169.38864"
transform="matrix(1.158109,0,-0.28862323,1.1215673,-132.62178,-134.5779)" /><g
id="g19"><rect
style="opacity:1;fill:#db004b;fill-opacity:1;stroke:none;stroke-width:10.1616;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect17"
width="650.3949"
height="672.26007"
x="732.64203"
y="542.77356"
ry="169.38864"
transform="matrix(1,0,-0.2492194,0.96844705,0,0)" /><rect
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:8.64022;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect18"
width="553.01849"
height="571.60999"
x="757.96472"
y="571.11993"
ry="144.02795"
transform="matrix(1,0,-0.2492194,0.96844705,0,0)" /><rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2.31831;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect19"
width="148.38416"
height="153.37257"
x="826.74255"
y="601.6474"
ry="72.254478"
transform="matrix(1,0,-0.2492194,0.96844705,0,0)" /><rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2.31831;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
id="rect24"
width="148.38416"
height="153.37257"
x="814.33466"
y="922.28735"
ry="72.254478"
transform="matrix(1,0,-0.2492194,0.96844705,0,0)" /></g></g></g></g><g
id="g28"
transform="matrix(0.52065651,0,0,0.52065651,1519.624,20.867626)"
style="stroke:none;stroke-opacity:1"><rect
style="opacity:1;fill:#0076fd;fill-opacity:1;stroke:none;stroke-width:19.3165;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:stroke fill markers"
id="rect36"
width="1200.1665"
height="389.25839"
x="3188.9819"
y="69.372932"
ry="130.26378"
transform="matrix(1,0,-0.1503105,0.98863884,0,0)" /><g
id="g36"
style="fill:#000000;fill-opacity:1"
transform="translate(5951.8249,49.825586)"><text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:500;font-stretch:normal;font-size:54.9038px;line-height:1.4;font-family:Barlow;-inkscape-font-specification:'Barlow Medium Italic';writing-mode:lr-tb;direction:ltr;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:13.726;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
x="148.1445"
y="149.99455"
id="text24"
transform="matrix(1.9206521,0,0,1.9206521,-2918.669,-40.079449)"><tspan
sodipodi:role="line"
id="tspan24"
x="148.1445"
y="149.99455"
style="font-style:italic;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Barlow;-inkscape-font-specification:'Barlow Medium Italic';fill:#000000;fill-opacity:1;stroke-width:13.726">josef@rokojori.com</tspan></text><g
id="g29"
transform="matrix(0.48281691,0,-0.09911318,0.48281691,-4222.0102,71.895415)"
style="fill:#000000;fill-opacity:1"><rect
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:stroke fill markers"
id="rect25"
width="7.6411281"
height="94.240585"
x="3170.2192"
y="81.069603"
ry="3.820564" /><rect
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:stroke fill markers"
id="rect26"
width="7.6411281"
height="94.240585"
x="43.533764"
y="-3288.8032"
ry="3.820564"
transform="rotate(90)" /><rect
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:stroke fill markers"
id="rect27"
width="7.6411281"
height="94.240585"
x="43.533764"
y="-3430.2549"
ry="3.820564"
transform="rotate(90)" /><rect
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:stroke fill markers"
id="rect28"
width="7.6411281"
height="94.240585"
x="3170.2192"
y="225.8365"
ry="3.820564" /></g><g
id="g35"
transform="matrix(-0.48281691,0,0.07417883,-0.48281691,-169.54742,355.53317)"
style="fill:#000000;fill-opacity:1"><rect
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:stroke fill markers"
id="rect32"
width="7.6411281"
height="94.240585"
x="3170.2192"
y="81.069603"
ry="3.820564" /><rect
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:stroke fill markers"
id="rect33"
width="7.6411281"
height="94.240585"
x="43.533764"
y="-3288.8032"
ry="3.820564"
transform="rotate(90)" /><rect
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:stroke fill markers"
id="rect34"
width="7.6411281"
height="94.240585"
x="43.533764"
y="-3430.2549"
ry="3.820564"
transform="rotate(90)" /><rect
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:stroke fill markers"
id="rect35"
width="7.6411281"
height="94.240585"
x="3170.2192"
y="225.8365"
ry="3.820564" /></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -20,6 +20,18 @@
<section>
<div class="card">
<h3>Update Board</h3>
<p>
Review what was done in a session and keep the three boards accurate —
moving completed tasks and bugs to Done, adding new To Do items, and
recommending whether Update Outline is also needed.
</p>
<p style="margin-top:0.75rem">
<a href="update-board/index.html">Read the action</a>
</p>
</div>
<div class="card">
<h3>Update History</h3>
<p>

View File

@ -0,0 +1,98 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Update Board — Roject</title>
<link rel="stylesheet" href="../../_assets_/styles.css">
<link rel="stylesheet" href="../../_assets_/nav.css">
</head>
<body>
<div class="page">
<header>
<h1>Update Board</h1>
<p class="subtitle">Review what was done in this session and keep the three boards accurate.</p>
</header>
<section>
<h2>Summary</h2>
<div class="card">
<p>
At an appropriate point in a working session, read the boards and the recent git
history, then propose which items should move, be added, or be removed.
Present the proposal to the user first. Only after approval, apply the changes.
Never move items silently.
</p>
</div>
</section>
<section>
<h2>Steps</h2>
<div class="card">
<h3>Step 1 — Read the current state</h3>
<p>Read all three board files:</p>
<pre><code>workspace/boards/tasks.html
workspace/boards/bugs.html
workspace/boards/backlog.html</code></pre>
<p style="margin-top:0.75rem">
Also read the recent git log and the current session's history entry (if one exists)
to understand what was actually completed.
</p>
</div>
<div class="card">
<h3>Step 2 — Propose changes</h3>
<p>
Present a clear proposal to the user before touching any file.
For each proposed change, state the item name, the board, and the action:
</p>
<ul style="margin-top:0.5rem;padding-left:1.25rem;line-height:1.8">
<li><strong>Move to Done</strong> — task or bug that was completed this session</li>
<li><strong>Move to In Progress</strong> — task that was started but not finished</li>
<li><strong>Move to To Do</strong> — new task worth adding now</li>
<li><strong>Remove</strong> — item that is no longer relevant</li>
<li><strong>Add to Backlog</strong> — idea or future work surfaced during the session</li>
</ul>
<p style="margin-top:0.75rem">
Also note whether <strong>Update Outline</strong> should be run — recommend it
when new systems, subsystems, or conventions were added that the outline does not
yet describe.
</p>
<p style="margin-top:0.75rem">Wait for the user to confirm before continuing.</p>
</div>
<div class="card">
<h3>Step 3 — Apply the changes</h3>
<p>
After the user approves the proposal, edit the board HTML files accordingly.
Use the correct colour class for each lane:
</p>
<ul style="margin-top:0.5rem;padding-left:1.25rem;line-height:1.8">
<li><code>class="green hide-content"</code> — Done (Tasks)</li>
<li><code>class="red hide-content"</code> — Critical (Bugs)</li>
<li><code>class="yellow hide-content"</code> — In Progress (Tasks) or Visual/UI/UX (Bugs)</li>
<li><code>class="blue hide-content"</code> — To Do (Tasks) or MVP (Backlog)</li>
<li><code>class="purple hide-content"</code> — Nice To Have (Backlog)</li>
<li><code>class="orange hide-content"</code> — To The Moon (Backlog)</li>
</ul>
<p style="margin-top:0.75rem">
Keep the Done lane in Tasks focused — if it grows beyond three or four items,
ask the user whether old Done items should be cleared out.
</p>
</div>
</section>
<footer>
Roject &mdash; update board
</footer>
</div>
<script>var NAV_ROOT = '../../';</script>
<script src="../../_assets_/nav-data.js"></script>
<script src="../../_assets_/nav.js"></script>
</body>
</html>

View File

@ -22,15 +22,6 @@
<div class="lane">
<div class="lane-header">Critical</div>
<task-item class="red hide-content">
<task-title>Projects Lookup/Editing Broken</task-title>
<task-content>
The projects a user can view should only be the ones the user created
or is a member of. Currently a second account can open and edit the content
of a project belonging to the first account.
</task-content>
</task-item>
<task-item class="red hide-content">
<task-title>401 Not Handled in Data-Fetching Components</task-title>
<task-content>
@ -69,11 +60,28 @@
</task-content>
</task-item>
<task-item class="yellow hide-content">
</div>
<div class="lane">
<div class="lane-header">Done</div>
<task-item class="green hide-content">
<task-title>Projects Lookup/Editing Broken</task-title>
<task-content>
Fixed. GET /api/projects now filters to owner-or-member only. All file routes
(tree, read, write, rename, delete) go through checkAccess() in projectAccess.ts.
Delete and member-management routes verify ownership. A single memberMatchesUser()
function centralises the comparison so migrating from email to user ID later
requires changing one line.
</task-content>
</task-item>
<task-item class="green hide-content">
<task-title>Member List Shows Raw UUIDs</task-title>
<task-content>
The member list UI displays raw UUIDs instead of usernames.
Should resolve user IDs to display names via the auth service.
Fixed. Members are now stored by email (Option B interim). The member panel
shows the owner's email first, then added members by email with their role badge.
Add-member form takes an email address and role; the member_type select is gone.
</task-content>
</task-item>

View File

@ -56,10 +56,13 @@
</task-item>
<task-item class="blue hide-content">
<task-title>CI deploy email notification</task-title>
<task-title>Investigate Gitea webhook auto-deploy</task-title>
<task-content>
The /api/deploy endpoint should send an email notification after each successful
restart so deploys are visible without checking server logs.
The webhook did not fire on the last two pushes to main. Check the Gitea
webhook delivery log for the response code from /api/deploy. Also run
journalctl -u roject -n 100 on the server to see whether the endpoint
was reached at all. Most likely causes: signature mismatch, wrong branch
ref, or the deploy command failing silently.
</task-content>
</task-item>
@ -89,6 +92,16 @@
<div class="lane">
<div class="lane-header">Done</div>
<task-item class="green hide-content">
<task-title>CI deploy email notification</task-title>
<task-content>
EmailService added to Roject (SMTP via Nodemailer, same credentials as rokojori-auth).
Startup email sent from startServer() listen callback; deploy email sent from
/api/deploy after signature verification passes. reportEmail defined as a static
field on EmailService.
</task-content>
</task-item>
<task-item class="green hide-content">
<task-title>Electron Desktop App Shell</task-title>
<task-content>

View File

@ -0,0 +1,41 @@
[ Redesign of Roject ]
- Dashboard, Groups and Projects will be removed as html
- Effectively there will be:
a) "/" ( one for not logged in, one for logged in )
b) "/edit"
When the user is not logged in, the dynamic roject svg will be shown.
Else the overview of the projects is shown.
[ UX Update ]
Every theme will be able to edit the project by hovering and clicking on it.
Member management and project deletion are button overlays that only appear on the left side of the element.
On top left there will be an circle with an X for deletion, on bottom left there will be an icon for member management.
[ Different themes ]
The styling/themes of the entry point/project list will change dynamically everyday (or when the user clicks a button).
There will be one styling that matches the roject logo, which will be used when the user chooses to not have different themes.
The themes should be a little bit an interactive journey, with a strong focus on flash websites from around 2008-2010.
They will have big, bold fonts, strong colors, a lot of animations. We will create the themes one by one together.
We would start with two: The default one and the italic-neon one.
[ Default Theme ]
The default theme uses Barlow as font-family. Every project has one color that is chosen automatically.
It has one rounded rect left and the title is written in uppercase Barlow Bold Italic.
A mock is here: workspace/_assets_/themes/default.svg
[ Italic Neon heme ]
The theme uses Barlow as font-family. Every project has one color that is chosen automatically.
It has one procedural icon on the left and the title is written in uppercase Barlow Bold Italic.
Every element has a background skewed rounded rect that has a slight gradient from warmer to colder color from left to right.
The icon is a skewed rounded rect with a glow. Inside is a black skwed rounded rect and on top
there are 1-8 white skewed circles, which can be a third high/wide and can be placed to form a symbol/glyph, mainly non overlapping
with strong geometric relations, symmetry prefered.
A mock is here: workspace/_assets_/themes/italic-neon.svg
For both description try to use the information from the image, because the text can have missing information. For instance the colors
vary slightly in Italic Neon from warm (hue towards yellow, less satur, brighter ) to cold (hue towards blue, more satur, darker )

View File

@ -208,13 +208,96 @@
</div>
</section>
<section>
<h2>Project home redesign</h2>
<div class="card">
<h3>Backend: user settings &amp; server cleanup</h3>
<p>
Added <code>UserSetting</code> interface and <code>userSettings</code> CRUD module
to <code>source/server/db.ts</code> (persisted in <code>user_settings.json</code>).
Created <code>source/server/routes/userSettings.ts</code> with
<code>GET / PUT /api/user/settings</code> (requires auth).
Cleaned up <code>source/server/index.ts</code>: removed the groups router and
explicit <code>/</code> redirect; added <code>/edit</code><code>/editor.html</code>
redirect and wired the new userSettings route.
</p>
<div class="tags">
<span class="tag">user_settings.json</span>
<span class="tag">/api/user/settings</span>
<span class="tag">groups router removed</span>
</div>
</div>
<div class="card">
<h3>project-home component</h3>
<p>
New <code>source/pages/index.html</code> entry point loads Barlow 900 Italic
from Google Fonts and the <code>project-home</code> component.
<code>project-home</code> checks auth: logged-out → full-screen dark hero with
brand text and login link; logged-in → fetches user settings, reads
<code>settings.theme</code>, and dynamically imports the matching theme component
(<code>project-list-default</code> by default; <code>project-list-italic-neon</code>
planned).
</p>
<div class="tags">
<span class="tag">source/pages/index.html</span>
<span class="tag">project-home</span>
<span class="tag">dynamic import</span>
</div>
</div>
<div class="card">
<h3>project-list-default component (default theme)</h3>
<p>
Full default theme: dark radial-gradient background, fixed nav with Roject logo
(webp, inner area positioned at 70% scale) and a user-group element where hover
slides in "Log out" beneath the email — clicking anywhere triggers logout.
Each project row: 7em×7em rounded badge with project colour (hue from UUID via
31-hash), radial-gradient fill (centre at 51% alpha), Barlow 900 Italic skewed
name in project colour. Hover reveals delete (×) and members buttons over the
badge corners. A "New Project…" dashed-outline card sits first in the list and
opens a name dialog on click. Rows animate in staggered on load.
Back arrow in the editor updated to <code>/</code>.
</p>
<div class="tags">
<span class="tag">project-list-default</span>
<span class="tag">hueFromId (31-hash)</span>
<span class="tag">Barlow skew matrix</span>
<span class="tag">new-project dialog</span>
</div>
</div>
<div class="decision">
<strong>Groups removed from the UI</strong>
<p>
The redesign spec removed groups entirely from the frontend and server routes.
The data layer (<code>groups</code> / <code>groupMembers</code> in db.ts) is
retained in case groups return later via rokojori-auth; only the router and all
UI references were deleted.
</p>
</div>
<div class="decision">
<strong>Theme preference stored server-side, not in localStorage</strong>
<p>
JWT settings from rokojori-auth are read-only. A local
<code>user_settings.json</code> DB file with a generic
<code>Record&lt;string, unknown&gt;</code> value map provides per-user persistence
for any app setting (starting with <code>theme</code>) without requiring changes
to the auth service.
</p>
</div>
</section>
<section>
<h2>What's next</h2>
<div class="card">
<p>
See <a href="../../../../boards/tasks.html">Tasks board</a> for the current sprint.
Local filesystem access and remote projects in Electron are the two active items.
Italic Neon theme (batch 2): skewed cards, warm→cold gradient, hand-crafted SVG
pattern icons (13 files already drawn), daily auto-rotation + user toggle.
See <a href="../../../../boards/tasks.html">Tasks board</a> for the full sprint.
</p>
</div>
</section>

View File

@ -21,7 +21,7 @@
<div class="card">
<h3><a href="2026/07-July/14-Monday/index.html">Monday, 14 July 2026</a></h3>
<p>Electron desktop app shell — login window, JWT auth via API, Authorization header injection, token persistence, ROJECT_ROOT path fix, ELECTRON_RUN_AS_NODE workaround. Workspace boards system (Tasks/Bugs/Backlog) with custom task-item elements; outline shortened; workspace index quick orientation added.</p>
<p>Electron desktop app shell, workspace boards system. Full project home redesign: new <code>/</code> entry point, project-home component (hero / theme dispatch), default theme (logo nav, UUID-coloured badges, Barlow skewed names, new-project dialog), user settings backend, groups removed from UI.</p>
</div>
<div class="card">

View File

@ -52,12 +52,30 @@
</div>
<div class="card">
<h3>Groups, projects &amp; storage</h3>
<h3>Projects &amp; storage</h3>
<p>
Groups and projects with member management (viewer / editor / admin roles).
Projects with member management (viewer / editor / admin roles).
Each project gets a real directory on disk at <code>storage/&lt;uuid&gt;/root/</code>
with a default <code>index.html</code> on creation. All data lives as JSON files
in <code>data/</code> — no external database.
in <code>build/data/db/</code> — no external database. Groups exist in the data
layer but have been removed from the UI; they may return later via rokojori-auth.
</p>
</div>
<div class="card">
<h3>Project home &amp; theme system</h3>
<p>
The root <code>/</code> serves a new <code>index.html</code> entry point that
loads the <code>project-home</code> component. Logged-out users see a full-screen
dark hero; logged-in users get the active theme component dynamically imported.
The default theme (<code>project-list-default</code>) renders a dark
radial-gradient page with a Roject logo nav, per-project coloured badges (hue
from UUID via 31-hash, <code>hsl(h, 95%, 45%)</code>), Barlow 900 Italic
uppercase project names, hover-revealed delete / member buttons, and a dashed
"New Project" card that opens a name dialog on click. Theme preference is
persisted server-side in <code>user_settings.json</code> via
<code>GET / PUT /api/user/settings</code>. A second theme (Italic Neon) is
planned. <code>/edit</code> redirects to the existing <code>/editor.html</code>.
</p>
</div>
@ -76,6 +94,20 @@
</p>
</div>
<div class="card">
<h3>Project access control</h3>
<p>
<code>source/server/projectAccess.ts</code> is the single point of truth for
ownership and membership checks. <code>GET /api/projects</code> filters to
projects the requesting user owns or is a member of. Every file route
(tree, read, write, rename, delete) calls <code>checkAccess()</code> before
touching the filesystem. Delete and member-management routes verify ownership.
Members are currently stored by email address (Option B interim);
<code>memberMatchesUser()</code> is the one line to change when migrating to
user-ID-based lookup via rokojori-auth.
</p>
</div>
<div class="card">
<h3>AI chat &amp; utilities</h3>
<p>
@ -85,6 +117,9 @@
An <code>EmailService</code> facade (<code>source/server/email/</code>) provides
a <code>sendEmail()</code> entry point backed by a swappable <code>EmailSender</code>
interface; the default is <code>SMTPEmailSender</code> (Nodemailer).
<code>EmailService.reportEmail</code> is a static field holding the admin
notification address; Roject sends emails on server startup and on each
verified deploy request.
</p>
</div>