SVG icon set
git clone https://git.lucas.co/cce-icons.git
Add app icons: a hicolor theme tree of names over the svg glyphs
Four new house-style glyphs — font (geometric capital A over a baseline
rule; drawn, not <text>, so rasterization is font-independent), layout
(tall pane beside two stacked on a squircle plate), table (header band +
knocked-out rules), cube (isometric, three faces lit by opacity) — plus
hicolor/scalable/apps/<binary-name>.svg symlinks mapping every launcher
app to its glyph. svg/ stays the sole source of artwork; an entry in
hicolor/ is a name, not a copy. ccebuild mirrors the tree into
$XDG_DATA_HOME/icons/hicolor/ (see hicolor/README.md for why hicolor,
and why there is deliberately no index.theme).
Co-Authored-By: Claude <[email protected]>
hicolor/README.md | 37 ++++++++++++++++++++++++++
hicolor/scalable/apps/cce-color-editor.svg | 1 +
hicolor/scalable/apps/cce-data-editor.svg | 1 +
hicolor/scalable/apps/cce-designer.svg | 1 +
hicolor/scalable/apps/cce-files.svg | 1 +
hicolor/scalable/apps/cce-fonts.svg | 1 +
hicolor/scalable/apps/cce-layout-interface.svg | 1 +
hicolor/scalable/apps/cce-preview.svg | 1 +
hicolor/scalable/apps/cce-system-interface.svg | 1 +
hicolor/scalable/apps/cce-test-interface.svg | 1 +
hicolor/scalable/apps/cce-text-editor.svg | 1 +
svg/cube.svg | 12 +++++++++
svg/font.svg | 12 +++++++++
svg/layout.svg | 14 ++++++++++
svg/table.svg | 16 +++++++++++
15 files changed, 101 insertions(+)
diff --git a/hicolor/README.md b/hicolor/README.md
new file mode 100644
index 0000000..f1b1282
--- /dev/null
+++ b/hicolor/README.md
@@ -0,0 +1,37 @@
+# App icons (`hicolor/`)
+
+The XDG icon theme cce apps are looked up in. `ccebuild install` mirrors this
+tree into `$XDG_DATA_HOME/icons/hicolor/`, so **the path here is the path there** —
+the size and context of an icon are its directory (`scalable/apps`), not a rule
+buried in the installer. Adding `48x48/apps/` or `scalable/mimetypes/` later needs
+no change to `ccebuild`.
+
+## Why `hicolor` and not the `cce` theme
+
+`hicolor` is the spec-mandated fallback: every implementation searches it last, no
+matter what the user's icon theme is set to. The sibling `cursors/` theme installs
+as `~/.local/share/icons/cce` and, as its README notes, **nothing selects it** —
+there is no icon-theme setting anywhere in the DE. An app icon put there would
+resolve for nobody. Putting them in `hicolor` means they resolve unconditionally.
+
+Deliberately **no `index.theme` here.** The system `hicolor-icon-theme` package
+already ships one at `/usr/share/icons/hicolor/index.theme` declaring every
+size/context directory, and a theme is the union of its per-base-dir trees. A
+second index in `$XDG_DATA_HOME` that listed only `scalable/apps` would be read
+first and make every other hicolor directory invisible.
+
+## Every file is a symlink into `../../../svg/`
+
+`svg/` stays the sole source (see the design-language notes there). An entry here
+is a *name*, not artwork: `cce-files.svg -> ../../../svg/folder.svg` says "the
+Files app is drawn with the folder glyph", and the glyph itself is edited in one
+place. The link is intra-repo, so it never dangles in a standalone clone; `install`
+dereferences it and writes a real file to the destination.
+
+## Adding an app
+
+1. The name must equal the `Icon=` key in the crate's `<crate>.desktop`, which by
+ convention is the binary name. `Icon=cce-files` ⇒ `cce-files.svg`.
+2. `ln -s ../../../svg/<glyph>.svg cce-<app>.svg` — or add a new glyph to `svg/`
+ first if none fits.
+3. `ccebuild install` picks it up with no edit to the installer.
diff --git a/hicolor/scalable/apps/cce-color-editor.svg b/hicolor/scalable/apps/cce-color-editor.svg
new file mode 120000
index 0000000..c9ff7c5
--- /dev/null
+++ b/hicolor/scalable/apps/cce-color-editor.svg
@@ -0,0 +1 @@
+../../../svg/palette.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/cce-data-editor.svg b/hicolor/scalable/apps/cce-data-editor.svg
new file mode 120000
index 0000000..b3a5e19
--- /dev/null
+++ b/hicolor/scalable/apps/cce-data-editor.svg
@@ -0,0 +1 @@
+../../../svg/table.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/cce-designer.svg b/hicolor/scalable/apps/cce-designer.svg
new file mode 120000
index 0000000..85712e3
--- /dev/null
+++ b/hicolor/scalable/apps/cce-designer.svg
@@ -0,0 +1 @@
+../../../svg/cube.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/cce-files.svg b/hicolor/scalable/apps/cce-files.svg
new file mode 120000
index 0000000..4a2793c
--- /dev/null
+++ b/hicolor/scalable/apps/cce-files.svg
@@ -0,0 +1 @@
+../../../svg/folder.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/cce-fonts.svg b/hicolor/scalable/apps/cce-fonts.svg
new file mode 120000
index 0000000..b8d8a70
--- /dev/null
+++ b/hicolor/scalable/apps/cce-fonts.svg
@@ -0,0 +1 @@
+../../../svg/font.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/cce-layout-interface.svg b/hicolor/scalable/apps/cce-layout-interface.svg
new file mode 120000
index 0000000..2c5e7db
--- /dev/null
+++ b/hicolor/scalable/apps/cce-layout-interface.svg
@@ -0,0 +1 @@
+../../../svg/layout.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/cce-preview.svg b/hicolor/scalable/apps/cce-preview.svg
new file mode 120000
index 0000000..c082162
--- /dev/null
+++ b/hicolor/scalable/apps/cce-preview.svg
@@ -0,0 +1 @@
+../../../svg/preview.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/cce-system-interface.svg b/hicolor/scalable/apps/cce-system-interface.svg
new file mode 120000
index 0000000..e970f03
--- /dev/null
+++ b/hicolor/scalable/apps/cce-system-interface.svg
@@ -0,0 +1 @@
+../../../svg/gear.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/cce-test-interface.svg b/hicolor/scalable/apps/cce-test-interface.svg
new file mode 120000
index 0000000..6aebdb0
--- /dev/null
+++ b/hicolor/scalable/apps/cce-test-interface.svg
@@ -0,0 +1 @@
+../../../svg/star.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/cce-text-editor.svg b/hicolor/scalable/apps/cce-text-editor.svg
new file mode 120000
index 0000000..d2baf3f
--- /dev/null
+++ b/hicolor/scalable/apps/cce-text-editor.svg
@@ -0,0 +1 @@
+../../../svg/pencil.svg
\ No newline at end of file
diff --git a/svg/cube.svg b/svg/cube.svg
new file mode 100644
index 0000000..04c594e
--- /dev/null
+++ b/svg/cube.svg
@@ -0,0 +1,12 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Cube: an isometric solid, three faces at descending opacity. This is the
+ back-layer language of folder.svg/copy.svg used as lighting rather than
+ depth — the same trick cce-ui's relief prims play, where a surface reads
+ as three-dimensional purely from how each facet catches the light. Top
+ face full, left 0.7, right 0.42; no outline, the tonal steps are the edges. -->
+ <g fill="#f1fa8c">
+ <path d="M20 6 L33 13 L20 20 L7 13 Z" />
+ <path d="M7 13 L20 20 L20 34 L7 27 Z" opacity="0.7" />
+ <path d="M33 13 L33 27 L20 34 L20 20 Z" opacity="0.42" />
+ </g>
+</svg>
diff --git a/svg/font.svg b/svg/font.svg
new file mode 100644
index 0000000..bfa026b
--- /dev/null
+++ b/svg/font.svg
@@ -0,0 +1,12 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Font: a capital A drawn as geometry, not text — resvg resolves <text>
+ through the shared fontdb, so a lettered glyph would render differently
+ depending on which faces are loaded. Stroked apex/legs/crossbar with
+ round joins, over a 0.55 back-layer baseline rule (the copy.svg/folder.svg
+ back-layer language) that reads the mark as type rather than a chevron. -->
+ <path d="M9 32 L20 8 L31 32" fill="none" stroke="#f1fa8c" stroke-width="4.5"
+ stroke-linecap="round" stroke-linejoin="round" />
+ <path d="M13.3 22.5 L26.7 22.5" fill="none" stroke="#f1fa8c" stroke-width="4.5"
+ stroke-linecap="round" />
+ <rect x="6" y="35" width="28" height="3.5" rx="1.75" fill="#f1fa8c" opacity="0.55" />
+</svg>
diff --git a/svg/layout.svg b/svg/layout.svg
new file mode 100644
index 0000000..f765156
--- /dev/null
+++ b/svg/layout.svg
@@ -0,0 +1,14 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Layout: tiled panes on a screen plate. The plate is the 0.55 back layer
+ (as in folder.svg/copy.svg) with squircle corners r=4.5 — the curve spans
+ 1.5r from each corner with control points at 0.5r, not circular rx arcs —
+ and the full-opacity panes sit inset on it, one tall beside two stacked,
+ which is the asymmetry that reads as a layout rather than a grid. -->
+ <path fill="#f1fa8c" opacity="0.55"
+ d="M3 11.75 C3 7.25 5.25 5 9.75 5 L30.25 5 C34.75 5 37 7.25 37 11.75 L37 28.25 C37 32.75 34.75 35 30.25 35 L9.75 35 C5.25 35 3 32.75 3 28.25 Z" />
+ <g fill="#f1fa8c">
+ <rect x="6.5" y="8.5" width="12" height="23" rx="3" />
+ <rect x="21.5" y="8.5" width="12" height="10" rx="3" />
+ <rect x="21.5" y="21.5" width="12" height="10" rx="3" />
+ </g>
+</svg>
diff --git a/svg/table.svg b/svg/table.svg
new file mode 100644
index 0000000..85040df
--- /dev/null
+++ b/svg/table.svg
@@ -0,0 +1,16 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Table: a 0.55 back-layer panel under a full-opacity header band, with the
+ row and column rules knocked out dark (the palette.svg well treatment)
+ rather than drawn as strokes — so the mark stays one silhouette at 16px
+ and only gains its grid as it scales up. Squircle corners r=4.5: the curve
+ spans 1.5r from each corner with control points at 0.5r. -->
+ <path fill="#f1fa8c" opacity="0.55"
+ d="M5 12.75 C5 8.25 7.25 6 11.75 6 L28.25 6 C32.75 6 35 8.25 35 12.75 L35 27.25 C35 31.75 32.75 34 28.25 34 L11.75 34 C7.25 34 5 31.75 5 27.25 Z" />
+ <path fill="#f1fa8c"
+ d="M5 12.75 C5 8.25 7.25 6 11.75 6 L28.25 6 C32.75 6 35 8.25 35 12.75 L35 15.5 L5 15.5 Z" />
+ <g fill="#282a36" opacity="0.35">
+ <rect x="5" y="21" width="30" height="2.5" />
+ <rect x="5" y="27" width="30" height="2.5" />
+ <rect x="18.75" y="15.5" width="2.5" height="18.5" />
+ </g>
+</svg>