From c986c31c01ef17113a10528a84a7ec9bcf9f12bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Vogel?= <104342347+cedricvogel-leo@users.noreply.github.com> Date: Fri, 6 Nov 2026 22:07:39 +0100 Subject: [PATCH] glpython's own logo: favicon, apple-touch-icon, the mark in the top bar The balance bike that is also an expression tree (the saddle a node, the lines to the wheels edges to two leaves), white on ink #1F3A5F: public/favicon.svg replaces Vite's, public/apple-touch-icon.png (180 px, full bleed) for the iPad home screen, and the mark in currentColor (GlpythonMark) replaces lucide's Sparkles in the top bar's ink square. public/icons.svg, the unused Vite template sprite, goes. Co-Authored-By: Claude Opus 5.5 --- index.html | 1 + public/apple-touch-icon.png | Bin 0 -> 6124 bytes public/favicon.svg | 10 +++++++++- public/icons.svg | 24 ------------------------ src/App.tsx | 5 +++-- src/GlpythonMark.tsx | 16 ++++++++++++++++ 6 files changed, 29 insertions(+), 27 deletions(-) create mode 100644 public/apple-touch-icon.png delete mode 100644 public/icons.svg create mode 100644 src/GlpythonMark.tsx diff --git a/index.html b/index.html index 8de4c0d..33e4ba6 100644 --- a/index.html +++ b/index.html @@ -3,6 +3,7 @@ + glpython diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0181109e422b5bb20c9f95f9bd0358e731293534 GIT binary patch literal 6124 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 literal 0 HcmV?d00001 diff --git a/public/favicon.svg b/public/favicon.svg index 6893eb1..1074aef 100644 --- a/public/favicon.svg +++ b/public/favicon.svg @@ -1 +1,9 @@ - \ No newline at end of file + +glpython + + + + + + + diff --git a/public/icons.svg b/public/icons.svg deleted file mode 100644 index e952219..0000000 --- a/public/icons.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/App.tsx b/src/App.tsx index 188b0c0..1e92ba2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,5 @@ import { useEffect, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react' -import { BookOpen, CircleHelp, Download, Info, EllipsisVertical, SlidersHorizontal, FileCode2, FilePlus2, Folder, FolderOpen, History, Link2, Lock, Pencil, Plus, RotateCcw, Sparkles, Trash2, Upload, X } from 'lucide-react' +import { BookOpen, CircleHelp, Download, Info, EllipsisVertical, SlidersHorizontal, FileCode2, FilePlus2, Folder, FolderOpen, History, Link2, Lock, Pencil, Plus, RotateCcw, Trash2, Upload, X } from 'lucide-react' import { GlPythonWorkspace, addProjectFile, deleteProjectFile, renameProjectFile, updateProjectFile } from 'glpython-editor' import type { Project, ProjectFileKind, WorkspaceCommand } from 'glpython-editor' import 'glpython-editor/style.css' @@ -8,6 +8,7 @@ import { exportProjectZip, importProjectFolder, importProjectZip } from './proje import { buildShareUrl, readSharedLinkFromLocation } from './projectShare' import { fetchLibrary, libraryHost, type LibraryState } from './libraries' import { renderMarkdown } from './markdown' +import { GlpythonMark } from './GlpythonMark' import { capabilitiesOf, DEFAULT_FEATURES, FEATURE_NAMES, readFeaturesParam, type Feature } from './features' import { answerTabQueries, claimTabId, isEmptyProject, newTabEntry, otherLiveTabIds, projectFingerprint, pruneEntries, recentlyClosed, removeEntry, saveEntry, startTab, type TabEntry } from './tabProjects' import { detectLocale, localeNames, saveLocale, translations, type Locale } from './i18n' @@ -423,7 +424,7 @@ function App() { return (
-
glpython
+
glpython
{shareCopied && {t.shareCopied}} diff --git a/src/GlpythonMark.tsx b/src/GlpythonMark.tsx new file mode 100644 index 0000000..ec4ecfc --- /dev/null +++ b/src/GlpythonMark.tsx @@ -0,0 +1,16 @@ +// glpython's mark (the logo without its square): a balance bike that is also +// an expression tree - the saddle a node, the two lines to the wheels edges +// to two leaves. In currentColor, for the top bar's ink square; the same +// drawing as public/favicon.svg. +export function GlpythonMark({ size = 16 }: { size?: number }) { + return ( + + ) +}