New app icon: a mark that survives being 16 pixels tall #20
No files matched your search
@@ -1,3 +1,8 @@
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="branding/triple-c-lockup-dark.svg">
|
||||
<img src="branding/triple-c-lockup-light.svg" alt="Triple-C — Coding Container" width="429" height="112">
|
||||
</picture>
|
||||
|
||||
# Triple-C (Claude-Code-Container)
|
||||
|
||||
Triple-C is a cross-platform desktop application that sandboxes Claude Code inside Docker containers. Each project chooses its own **permission mode** — from Plan (read-only) through to Bypass (`--dangerously-skip-permissions`), which gives Claude unrestricted access within the sandbox.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Triple-C</title>
|
||||
</head>
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128" role="img" aria-label="Triple-C">
|
||||
<title>Triple-C application icon, small-size variant</title>
|
||||
<!-- Source for every raster ≤ 32 px: the small mark, drawn at 82% so the strokes
|
||||
survive being resampled down to 16 px. See build-icons.py. -->
|
||||
<rect width="128" height="128" rx="28.16" fill="#0D1117"/>
|
||||
<g transform="translate(2.9236 2.9236) scale(0.95418)">
|
||||
<g fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M112 50 L112 38 A22 22 0 0 0 90 16 L38 16 A22 22 0 0 0 16 38 L16 90 A22 22 0 0 0 38 112 L90 112 A22 22 0 0 0 112 90 L112 78"
|
||||
stroke="#58A6FF" stroke-width="14"/>
|
||||
<path d="M46 50 L62 66 L46 82" stroke="#F0821E" stroke-width="13"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 812 B |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 918 B After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 17 KiB |
@@ -33,6 +33,7 @@
|
||||
"icons/128x128.png",
|
||||
"icons/128x128@2x.png",
|
||||
"icons/icon.ico",
|
||||
"icons/icon.icns",
|
||||
"icons/icon.png"
|
||||
]
|
||||
},
|
||||
|
||||
@@ -33,4 +33,33 @@ describe("Window icon configuration", () => {
|
||||
expect(config.bundle.icon).toContain("icons/icon.ico");
|
||||
expect(config.bundle.icon).toContain("icons/icon.png");
|
||||
});
|
||||
|
||||
it("icon.ico carries the small sizes Windows draws in the taskbar", () => {
|
||||
// A single-image .ico is the taskbar bug: Windows upscales 16x16 into every
|
||||
// other slot. Regenerate with `python3 branding/build-icons.py`.
|
||||
const ico = readFileSync(resolve(srcTauriDir, "icons/icon.ico"));
|
||||
const count = ico.readUInt16LE(4);
|
||||
expect(count).toBeGreaterThan(1);
|
||||
|
||||
// Directory entries start at byte 6; width/height of 0 means 256.
|
||||
const widths = new Set<number>();
|
||||
for (let i = 0; i < count; i++) {
|
||||
const w = ico[6 + i * 16];
|
||||
widths.add(w === 0 ? 256 : w);
|
||||
}
|
||||
for (const size of [16, 24, 32, 48, 256]) {
|
||||
expect(widths).toContain(size);
|
||||
}
|
||||
});
|
||||
|
||||
it("icon.icns exists and is bundled for macOS", () => {
|
||||
const icnsPath = resolve(srcTauriDir, "icons/icon.icns");
|
||||
expect(existsSync(icnsPath)).toBe(true);
|
||||
expect(readFileSync(icnsPath).subarray(0, 4).toString("ascii")).toBe("icns");
|
||||
|
||||
const config = JSON.parse(
|
||||
readFileSync(resolve(srcTauriDir, "tauri.conf.json"), "utf-8")
|
||||
);
|
||||
expect(config.bundle.icon).toContain("icons/icon.icns");
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,58 @@
|
||||
# Branding
|
||||
|
||||
The mark is a container with its right wall opened, so the enclosure itself is the letter **C**,
|
||||
holding a `>_` prompt. Container plus shell, in one closed shape — no type inside the icon, so
|
||||
nothing goes illegible when the app is 16 px tall in a taskbar.
|
||||
|
||||
## Files
|
||||
|
||||
| File | What it is |
|
||||
|---|---|
|
||||
| `triple-c-mark.svg` | The mark alone, transparent. Use on any ground. |
|
||||
| `triple-c-mark-small.svg` | Optical variant for 32 px and below. |
|
||||
| `triple-c-icon.svg` | The app icon: mark at 70% on a `#0D1117` tile, 22% corner radius. |
|
||||
| `triple-c-icon-small.svg` | The app icon at small sizes — small mark, drawn at 82%. |
|
||||
| `triple-c-lockup-dark.svg` | Horizontal lockup for dark backgrounds. Wordmark is outlined, so no font is needed to render it. |
|
||||
| `triple-c-lockup-light.svg` | The same for light backgrounds. |
|
||||
| `triple-c-icon-1024.png` | Master raster, generated. |
|
||||
| `build-icons.py` | Regenerates every packaged icon from the SVGs. |
|
||||
|
||||
## Palette
|
||||
|
||||
| Role | Dark ground | Light ground |
|
||||
|---|---|---|
|
||||
| Frame | `#58A6FF` (`--accent`) | `#1F6FEB` (`--accent-emphasis`) |
|
||||
| Prompt | `#F0821E` | `#C4610F` |
|
||||
| Tile | `#0D1117` (`--bg-primary`) | — |
|
||||
| Wordmark | `#E6EDF3` (`--text-primary`) | `#131C25` |
|
||||
|
||||
The frame and prompt colours are the app's own accent tokens from `app/src/index.css`, which is why
|
||||
the icon sits on the app's chrome instead of fighting it. Orange is the only equity carried over
|
||||
from the previous marks, and it is now an accent rather than a background.
|
||||
|
||||
## Two sources, not one
|
||||
|
||||
`build-icons.py` renders sizes ≥ 48 px from `triple-c-icon.svg` and sizes ≤ 32 px from
|
||||
`triple-c-icon-small.svg`. At small sizes the cursor bar closes up against the chevron and a 12 px
|
||||
frame stroke resamples to a grey smear, so the small variant drops the cursor, widens the mouth,
|
||||
thickens the strokes and draws the mark larger inside the tile.
|
||||
|
||||
This matters most for `icon.ico`: Windows picks the 16 px entry for the window corner and 24/32 px
|
||||
for the taskbar. The previous `.ico` contained a *single* 16 px image, which Windows then upscaled
|
||||
everywhere else — the likely cause of `screenshot_for_fix/task_bar_icon_not_correct.png`. The
|
||||
current one carries 16, 24, 32, 48, 64, 128 and 256, each rendered from vector rather than
|
||||
downsampled from one bitmap.
|
||||
|
||||
## Regenerating
|
||||
|
||||
```bash
|
||||
pip install cairosvg pillow
|
||||
python3 branding/build-icons.py
|
||||
```
|
||||
|
||||
Writes `app/src-tauri/icons/{32x32,128x128,128x128@2x,icon}.png`, `icon.ico`, `icon.icns`,
|
||||
`app/public/favicon.svg` and `branding/triple-c-icon-1024.png`. Do not hand-edit those — edit the
|
||||
SVG and re-run.
|
||||
|
||||
The lockups are committed sources, not generated: their wordmark is Liberation Mono Bold converted
|
||||
to outlines (`-1.6` tracking, 44 px cap height), so re-cutting it needs the font and `fonttools`.
|
||||
@@ -0,0 +1,11 @@
|
||||
# Archive
|
||||
|
||||
The marks Triple-C shipped before the current one, kept for reference.
|
||||
|
||||
| File | Notes |
|
||||
|---|---|
|
||||
| `triple-c-app-logo.png` | First mark: orange tile, overlapping C letterforms, "TRIPLE-C / CONTAINERIZED CODING" set inside the icon. |
|
||||
| `triple-c-app-logov2.png` | Second mark: orange sunburst with "Triple-C / Coding Container" over it, transparent ground. |
|
||||
|
||||
Both were drawn at poster size and carried type inside the icon, so nothing in them survived the
|
||||
16–32 px range where an app icon actually lives. Neither is referenced by the app or the build.
|
||||
|
After Width: | Height: | Size: 97 KiB |
@@ -0,0 +1,122 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Render every packaged icon from the SVG sources in this directory.
|
||||
|
||||
pip install cairosvg pillow
|
||||
python3 branding/build-icons.py
|
||||
|
||||
The SVGs are the source of truth; everything under app/src-tauri/icons/ and the
|
||||
favicon are generated. Two sources, not one, on purpose:
|
||||
|
||||
triple-c-icon.svg used for 48 px and up
|
||||
triple-c-icon-small.svg used for 32 px and down
|
||||
|
||||
At 16-32 px the cursor bar closes up against the chevron and the frame's 12 px
|
||||
stroke resamples to a grey smear, so the small source drops the cursor, widens
|
||||
the mouth and draws the mark larger in the tile. Windows picks the 16 and 24 px
|
||||
entries out of the .ico for the taskbar and window corner, which is exactly
|
||||
where the old single-size .ico was falling over.
|
||||
"""
|
||||
|
||||
import io
|
||||
import struct
|
||||
from pathlib import Path
|
||||
|
||||
import cairosvg
|
||||
from PIL import Image
|
||||
|
||||
BRANDING = Path(__file__).resolve().parent
|
||||
REPO = BRANDING.parent
|
||||
ICONS = REPO / "app" / "src-tauri" / "icons"
|
||||
PUBLIC = REPO / "app" / "public"
|
||||
|
||||
FULL_SRC = BRANDING / "triple-c-icon.svg"
|
||||
SMALL_SRC = BRANDING / "triple-c-icon-small.svg"
|
||||
|
||||
# Below this, render from the small source.
|
||||
SMALL_MAX = 32
|
||||
|
||||
# .ico entries. Windows uses 16 in the window corner and 24/32 in the taskbar,
|
||||
# 48 in list views and 256 in the "extra large icons" view.
|
||||
ICO_SIZES = [16, 24, 32, 48, 64, 128, 256]
|
||||
|
||||
# .icns entries: (chunk type, pixel size). PNG-backed chunks, macOS 10.7+.
|
||||
ICNS_ENTRIES = [
|
||||
(b"ic11", 32), # 16pt @2x
|
||||
(b"ic12", 64), # 32pt @2x
|
||||
(b"ic07", 128), # 128pt
|
||||
(b"ic13", 256), # 128pt @2x
|
||||
(b"ic08", 256), # 256pt
|
||||
(b"ic14", 512), # 256pt @2x
|
||||
(b"ic09", 512), # 512pt
|
||||
(b"ic10", 1024), # 512pt @2x
|
||||
]
|
||||
|
||||
|
||||
def render(size: int) -> Image.Image:
|
||||
"""Rasterise the right source at `size` px square."""
|
||||
src = SMALL_SRC if size <= SMALL_MAX else FULL_SRC
|
||||
png = cairosvg.svg2png(url=str(src), output_width=size, output_height=size)
|
||||
return Image.open(io.BytesIO(png)).convert("RGBA")
|
||||
|
||||
|
||||
def write_png(size: int, path: Path) -> None:
|
||||
render(size).save(path, "PNG", optimize=True)
|
||||
print(f" {path.relative_to(REPO)} {size}x{size}")
|
||||
|
||||
|
||||
def write_ico(path: Path) -> None:
|
||||
"""Hand-assemble the .ico so each entry can come from its own source.
|
||||
|
||||
Pillow's save(sizes=...) downsamples one image, which would put the
|
||||
12 px-stroke artwork into the 16 px entry — the thing this avoids.
|
||||
"""
|
||||
images = [render(s) for s in ICO_SIZES]
|
||||
payloads = []
|
||||
for img in images:
|
||||
buf = io.BytesIO()
|
||||
img.save(buf, "PNG", optimize=True) # PNG-compressed entries, Vista+
|
||||
payloads.append(buf.getvalue())
|
||||
|
||||
offset = 6 + 16 * len(images)
|
||||
header = struct.pack("<HHH", 0, 1, len(images))
|
||||
entries, blob = b"", b""
|
||||
for img, data in zip(images, payloads):
|
||||
w = 0 if img.width >= 256 else img.width
|
||||
h = 0 if img.height >= 256 else img.height
|
||||
entries += struct.pack("<BBBBHHII", w, h, 0, 0, 1, 32, len(data), offset)
|
||||
blob += data
|
||||
offset += len(data)
|
||||
path.write_bytes(header + entries + blob)
|
||||
print(f" {path.relative_to(REPO)} {', '.join(str(s) for s in ICO_SIZES)}")
|
||||
|
||||
|
||||
def write_icns(path: Path) -> None:
|
||||
chunks = b""
|
||||
for kind, size in ICNS_ENTRIES:
|
||||
buf = io.BytesIO()
|
||||
render(size).save(buf, "PNG", optimize=True)
|
||||
data = buf.getvalue()
|
||||
chunks += kind + struct.pack(">I", len(data) + 8) + data
|
||||
path.write_bytes(b"icns" + struct.pack(">I", len(chunks) + 8) + chunks)
|
||||
print(f" {path.relative_to(REPO)} {', '.join(str(s) for _, s in ICNS_ENTRIES)}")
|
||||
|
||||
|
||||
def main() -> None:
|
||||
print("branding/")
|
||||
write_png(1024, BRANDING / "triple-c-icon-1024.png")
|
||||
|
||||
print("app/src-tauri/icons/")
|
||||
write_png(32, ICONS / "32x32.png")
|
||||
write_png(128, ICONS / "128x128.png")
|
||||
write_png(256, ICONS / "128x128@2x.png")
|
||||
write_png(512, ICONS / "icon.png")
|
||||
write_ico(ICONS / "icon.ico")
|
||||
write_icns(ICONS / "icon.icns")
|
||||
|
||||
print("app/public/")
|
||||
(PUBLIC / "favicon.svg").write_text(SMALL_SRC.read_text())
|
||||
print(f" {(PUBLIC / 'favicon.svg').relative_to(REPO)} (copy of {SMALL_SRC.name})")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
After Width: | Height: | Size: 36 KiB |
@@ -0,0 +1,13 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128" role="img" aria-label="Triple-C">
|
||||
<title>Triple-C application icon, small-size variant</title>
|
||||
<!-- Source for every raster ≤ 32 px: the small mark, drawn at 82% so the strokes
|
||||
survive being resampled down to 16 px. See build-icons.py. -->
|
||||
<rect width="128" height="128" rx="28.16" fill="#0D1117"/>
|
||||
<g transform="translate(2.9236 2.9236) scale(0.95418)">
|
||||
<g fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M112 50 L112 38 A22 22 0 0 0 90 16 L38 16 A22 22 0 0 0 16 38 L16 90 A22 22 0 0 0 38 112 L90 112 A22 22 0 0 0 112 90 L112 78"
|
||||
stroke="#58A6FF" stroke-width="14"/>
|
||||
<path d="M46 50 L62 66 L46 82" stroke="#F0821E" stroke-width="13"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 812 B |
@@ -0,0 +1,14 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128" role="img" aria-label="Triple-C">
|
||||
<title>Triple-C application icon</title>
|
||||
<!-- App icon: the mark on the app's own ground (bg-primary), at 70% of the tile.
|
||||
Source for every raster ≥ 48 px. See build-icons.py. -->
|
||||
<rect width="128" height="128" rx="28.16" fill="#0D1117"/>
|
||||
<g transform="translate(10.8988 10.8988) scale(0.82963)">
|
||||
<g fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M112 46 L112 38 A22 22 0 0 0 90 16 L38 16 A22 22 0 0 0 16 38 L16 90 A22 22 0 0 0 38 112 L90 112 A22 22 0 0 0 112 90 L112 82"
|
||||
stroke="#58A6FF" stroke-width="12"/>
|
||||
<path d="M42 50 L58 66 L42 82" stroke="#F0821E" stroke-width="11"/>
|
||||
<path d="M68 82 L88 82" stroke="#F0821E" stroke-width="11"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 855 B |
@@ -0,0 +1,13 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 429 112" width="429" height="112" role="img" aria-label="Triple-C — Coding Container">
|
||||
<title>Triple-C — Coding Container</title>
|
||||
<g transform="translate(3.3333 13.3333) scale(0.66667)">
|
||||
<g fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M112 46 L112 38 A22 22 0 0 0 90 16 L38 16 A22 22 0 0 0 16 38 L16 90 A22 22 0 0 0 38 112 L90 112 A22 22 0 0 0 112 90 L112 82" stroke="#58A6FF" stroke-width="12"/>
|
||||
<path d="M42 50 L58 66 L42 82" stroke="#F0821E" stroke-width="11"/>
|
||||
<path d="M68 82 L88 82" stroke="#F0821E" stroke-width="11"/>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="#E6EDF3"><path d="M132.85396590066716 28.436619718309856V65.0H123.23202372127503V28.436619718309856H109.9896219421794V21.0H146.0963676797628V28.436619718309856Z"/><path d="M181.74469977761305 37.3409933283914Q178.09162342475906 36.72127501853224 174.8299481097109 36.72127501853224Q169.7417346182357 36.72127501853224 166.7573017049666 40.5700518902891Q163.77286879169753 44.41882876204596 163.77286879169753 50.713862120088955V65.0H154.64017790956262V42.135656041512235Q154.64017790956262 39.65678280207561 154.19985174203111 36.29725722757598Q153.7595255744996 32.93773165307635 152.94410674573757 29.708673091178646H161.78324684951815Q162.9574499629355 33.948851000741286 163.2836174944403 37.14529280948851H163.41408450704225Q165.04492216456634 32.70941438102298 167.8173461823573 30.882876204595995Q170.58977020014825 29.05633802816901 175.02564862861377 29.05633802816901Q178.4177909562639 29.05633802816901 181.74469977761305 29.610822831727205Z"/><path d="M210.8696812453669 58.80281690140845H222.383395107487V65.0H188.8207561156412V58.80281690140845H201.70437361008152V35.9058561897702H192.24551519644177V29.708673091178646H210.8696812453669ZM201.70437361008152 23.34840622683469V16.59673832468495H210.8696812453669V23.34840622683469Z"/><path d="M236.896071163825 29.708673091178646Q237.0917716827279 30.39362490733877 237.2385470719051 32.44848035581913Q237.38532246108224 34.50333580429948 237.38532246108224 35.44922164566346H237.51578947368418Q239.0813936249073 32.35063009636768 241.70704225352108 30.687175685693106Q244.33269088213487 29.02372127501853 247.82268346923644 29.02372127501853Q253.69369903632315 29.02372127501853 257.03691623424754 33.948851000741286Q260.38013343217193 38.87398072646404 260.38013343217193 47.289103039288364Q260.38013343217193 55.93254262416605 257.00429948109706 60.79243884358784Q253.6284655300222 65.65233506300963 247.46389918458112 65.65233506300963Q243.97390659747958 65.65233506300963 241.3971830985915 64.07042253521126Q238.82045959970344 62.4885100074129 237.45055596738322 59.42253521126761H237.38532246108224L237.45055596738322 65.22831727205337V78.86212008895478H228.2852483320978V37.40622683469236Q228.2852483320978 34.14455151964418 228.02431430689396 29.708673091178646ZM237.32008895478128 47.51742031134174Q237.32008895478128 51.39881393624907 238.16812453669382 54.02446256486286Q239.01616011860634 56.65011119347665 240.56545589325424 58.03632320237213Q242.1147516679021 59.42253521126761 244.20222386953296 59.42253521126761Q247.49651593773163 59.42253521126761 249.1599703484062 56.32394366197183Q250.82342475908075 53.225352112676056 250.82342475908075 47.289103039288364Q250.82342475908075 41.2876204595997 249.11104521868046 38.286879169755366Q247.39866567828017 35.28613787991104 244.2674573758339 35.28613787991104Q242.24521868050405 35.28613787991104 240.64699777613043 36.737583395107485Q239.04877687175681 38.18902891030393 238.18443291326906 40.89621942179392Q237.32008895478128 43.60340993328391 237.32008895478128 47.51742031134174Z"/><path d="M292.27753891771675 58.737583395107485 299.3553743513713 58.80281690140845V65.0L287.97212750185315 64.8369162342476Q284.7430689399555 64.2824314306894 281.7423276501111 61.96664195700519Q280.3398072646404 60.89028910303929 279.4917716827279 58.280948851000744Q278.7415863602668 56.06300963676797 278.67635285396585 52.73610081541883V22.7939214232765H269.2174944403261V16.59673832468495H287.84166048925124V53.779836916234245Q287.9068939955522 56.584877687175684 288.59184581171235 57.36767976278725Q289.47249814677537 58.378799110452185 292.27753891771675 58.737583395107485ZM292.4732394366197 58.80281690140845ZM287.84166048925124 53.779836916234245ZM288.1352112676056 65.0ZM278.67635285396585 52.73610081541883Z"/><path d="M320.8480355819125 65.65233506300963Q312.62861378799107 65.65233506300963 308.160118606375 60.808747220163085Q303.69162342475903 55.96515937731653 303.69162342475903 47.191252779836915Q303.69162342475903 41.320237212750186 305.79540400296514 37.275759822090436Q307.8991845811712 33.231282431430685 311.78057820607853 31.143810229799847Q315.66197183098586 29.05633802816901 320.9785025945144 29.05633802816901Q328.7086730911786 29.05633802816901 332.9814677538917 34.20978502594514Q337.25426241660483 39.363232023721274 337.25426241660483 48.85470719051149V49.11564121571534H313.31356560415117Q313.31356560415117 53.91030392883617 315.44996293550776 56.71534469977761Q317.5863602668643 59.52038547071905 321.30467012601923 59.52038547071905Q323.7183098591549 59.52038547071905 325.5774647887323 58.49295774647887Q327.43661971830977 57.465530022238696 328.08895478131944 55.312824314306894L336.7323943661971 56.06300963676797Q334.9384729429206 60.66197183098591 330.763528539659 63.15715344699777Q326.5885841363973 65.65233506300963 320.8480355819125 65.65233506300963ZM320.8480355819125 34.8295033358043Q317.48851000741286 34.8295033358043 315.4988880652335 37.096367679762785Q313.50926612305403 39.363232023721274 313.3787991104521 43.3750926Line truncated
|
||||
<g fill="#F0821E"><path d="M349.4837657524091 51.65974796145293V43.70126019273536H368.4014825796886V51.65974796145293Z"/><path d="M389.7962935507783 42.787991104521865Q389.7962935507783 50.12676056338028 392.079466271312 54.10600444773907Q394.36263899184576 58.08524833209785 398.8963676797627 58.08524833209785Q404.18028169014076 58.08524833209785 406.7243884358783 50.12676056338028L415.6287620459599 51.82283172720534Q411.2907338769458 65.65233506300963 398.79851742031127 65.65233506300963Q389.6332097850259 65.65233506300963 384.8222386953298 59.830244625648625Q380.0112676056337 54.00815418828762 380.0112676056337 42.787991104521865Q380.0112676056337 20.315048183839878 398.5375833951074 20.315048183839878Q404.60429948109703 20.315048183839878 408.6977020014825 23.511489992587098Q412.79110452186796 26.70793180133432 414.7154929577464 33.00296515937731L405.84373610081536 35.15567086730911Q404.8978502594514 31.698295033358043 403.00607857672344 29.790214974054855Q401.1143068939955 27.882134914751667 398.6680504077093 27.882134914751667Q389.7962935507783 27.882134914751667 389.7962935507783 42.787991104521865Z"/></g>
|
||||
<g fill="#7C8FA3"><path d="M116.64229950319375 89.49538679914833Q118.53726046841732 89.49538679914833 119.27537260468418 87.59332860184529L121.09936124911285 88.28176011355572Q120.51029098651526 89.72959545777147 119.37118523775727 90.43577004968063Q118.23207948899929 91.14194464158977 116.64229950319375 91.14194464158977Q114.2292405961675 91.14194464158977 112.91270404542229 89.77572746628815Q111.59616749467708 88.40951029098652 111.59616749467708 85.95386799148332Q111.59616749467708 83.49112845990064 112.86657203690561 82.17104329311569Q114.13697657913414 80.85095812633074 116.5500354861604 80.85095812633074Q118.31014904187367 80.85095812633074 119.41731724627395 81.5571327182399Q120.52448545067423 82.26330731014905 120.97161107168205 83.63307310149042L119.1263307310149 84.13697657913414Q118.89212207239177 83.3846699787083 118.20723917672109 82.94109297374024Q117.52235628105039 82.49751596877218 116.59261887863732 82.49751596877218Q115.17317246273953 82.49751596877218 114.43860894251242 83.37757274662881Q113.7040454222853 84.25762952448545 113.7040454222853 85.95386799148332Q113.7040454222853 87.67849538679914 114.4599006387509 88.58694109297375Q115.21575585521647 89.49538679914833 116.64229950319375 89.49538679914833Z"/><path d="M135.59233498935416 85.95386799148332Q135.59233498935416 87.5152590489709 134.97487579843863 88.70049680624557Q134.35741660752308 89.88573456352023 133.20766501064585 90.51383960255501Q132.05791341376863 91.14194464158977 130.524911284599 91.14194464158977Q128.16863023420868 91.14194464158977 126.83080198722499 89.75443577004967Q125.49297374024131 88.36692689850958 125.49297374024131 85.95386799148332Q125.49297374024131 83.54790631653655 126.82725337118524 82.19943222143365Q128.16153300212918 80.85095812633074 130.53910574875798 80.85095812633074Q132.9166784953868 80.85095812633074 134.2545067423705 82.21362668559263Q135.59233498935416 83.5762952448545 135.59233498935416 85.95386799148332ZM133.45606813342798 85.95386799148332Q133.45606813342798 84.33569907735983 132.68956706884316 83.416607523066Q131.92306600425835 82.49751596877218 130.53910574875798 82.49751596877218Q129.13385379701916 82.49751596877218 128.36735273243434 83.40951029098652Q127.60085166784954 84.32150461320086 127.60085166784954 85.95386799148332Q127.60085166784954 87.60042583392477 128.38509581263307 88.54790631653655Q129.1693399574166 89.49538679914833 130.524911284599 89.49538679914833Q131.93016323633782 89.49538679914833 132.6931156848829 88.57274662881477Q133.45606813342798 87.65010645848119 133.45606813342798 85.95386799148332Z"/><path d="M149.48914123491838 85.92547906316537Q149.48914123491838 87.47267565649396 148.88232789212208 88.62597586941092Q148.27551454932578 89.7792760823279 147.16479772888573 90.38963804116395Q146.0540809084457 91.0 144.62044002838894 91.0H140.5750177430802V81.0H144.1946061036196Q146.72122072391767 81.0 148.10518097941804 82.27395315826828Q149.48914123491838 83.54790631653655 149.48914123491838 85.92547906316537ZM147.38126330731015 85.92547906316537Q147.38126330731015 84.31440738112136 146.54378992193045 83.46628814762242Q145.70631653655076 82.61816891412349 144.15202271114265 82.61816891412349H142.66870120652945V89.38183108587651H144.4430092264017Q145.79148332150461 89.38183108587651 146.58637331440738 88.45209368346346Q147.38126330731015 87.52235628105039 147.38126330731015 85.92547906316537Z"/><path d="M154.47182398864442 91.0V81.0H156.56550745209367V91.0Z"/><path d="M167.99957416607523 91.0 163.641873669269 83.29950319375443Q163.7696238466998 84.4208658623137 163.7696238466998 85.10220014194464V91.0H161.91014904187367V81.0H164.30191625266147L168.72349183818312 88.76437189496096Q168.5957416607523 87.69268985095813 168.5957416607523 86.8126330731015V81.0H170.45521646557845V91.0Z"/><path d="M180.55500354861604 89.50248403122782Q181.3711852377573 89.50248403122782 182.1376863023421 89.26472675656494Q182.9041873669269 89.02696948190206 183.32292405961675 88.65791341376863V87.27395315826827H180.88147622427255V85.72675656493968H185.23917672107876V89.40312278211498Q184.444286728176 90.21930447125621 183.1703335699077 90.680624556423Q181.89638041163946 91.14194464158977 180.49822569198014 91.14194464158977Q178.0567778566359 91.14194464158977 176.74378992193044 89.78992193044712Q175.43080198722498 88.43789921930447 175.43080198722498 85.95386799148332Q175.43080198722498 83.48403122782115 176.75088715400994 82.16749467707595Q178.07097232079488 80.85095812633074 180.54790631653654 80.85095812633074Q184.0681334279631 80.85095812633074 185.0262597586941 83.4556422995032L183.0958126330731 84.0376153300213Q182.78353442157558 83.27821149751597 182.1163946061036 82.88786373314407Q181.44925479063164 82.49751596877218 180.54790631653654 82.49751596877218Q179.07168204400284 82.49751596877218 178.30518097941803 83.39176721078779Q177.5386799148332 84.2860184528034 177.5386799148332 85.95386799148332Q177.5386799148332 87.65010645848119 178.33002129169626 88.5762952448545Q179.12136266855927 89.502Line truncated
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 17 KiB |
@@ -0,0 +1,13 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 429 112" width="429" height="112" role="img" aria-label="Triple-C — Coding Container">
|
||||
<title>Triple-C — Coding Container</title>
|
||||
<g transform="translate(3.3333 13.3333) scale(0.66667)">
|
||||
<g fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M112 46 L112 38 A22 22 0 0 0 90 16 L38 16 A22 22 0 0 0 16 38 L16 90 A22 22 0 0 0 38 112 L90 112 A22 22 0 0 0 112 90 L112 82" stroke="#1F6FEB" stroke-width="12"/>
|
||||
<path d="M42 50 L58 66 L42 82" stroke="#C4610F" stroke-width="11"/>
|
||||
<path d="M68 82 L88 82" stroke="#C4610F" stroke-width="11"/>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="#131C25"><path d="M132.85396590066716 28.436619718309856V65.0H123.23202372127503V28.436619718309856H109.9896219421794V21.0H146.0963676797628V28.436619718309856Z"/><path d="M181.74469977761305 37.3409933283914Q178.09162342475906 36.72127501853224 174.8299481097109 36.72127501853224Q169.7417346182357 36.72127501853224 166.7573017049666 40.5700518902891Q163.77286879169753 44.41882876204596 163.77286879169753 50.713862120088955V65.0H154.64017790956262V42.135656041512235Q154.64017790956262 39.65678280207561 154.19985174203111 36.29725722757598Q153.7595255744996 32.93773165307635 152.94410674573757 29.708673091178646H161.78324684951815Q162.9574499629355 33.948851000741286 163.2836174944403 37.14529280948851H163.41408450704225Q165.04492216456634 32.70941438102298 167.8173461823573 30.882876204595995Q170.58977020014825 29.05633802816901 175.02564862861377 29.05633802816901Q178.4177909562639 29.05633802816901 181.74469977761305 29.610822831727205Z"/><path d="M210.8696812453669 58.80281690140845H222.383395107487V65.0H188.8207561156412V58.80281690140845H201.70437361008152V35.9058561897702H192.24551519644177V29.708673091178646H210.8696812453669ZM201.70437361008152 23.34840622683469V16.59673832468495H210.8696812453669V23.34840622683469Z"/><path d="M236.896071163825 29.708673091178646Q237.0917716827279 30.39362490733877 237.2385470719051 32.44848035581913Q237.38532246108224 34.50333580429948 237.38532246108224 35.44922164566346H237.51578947368418Q239.0813936249073 32.35063009636768 241.70704225352108 30.687175685693106Q244.33269088213487 29.02372127501853 247.82268346923644 29.02372127501853Q253.69369903632315 29.02372127501853 257.03691623424754 33.948851000741286Q260.38013343217193 38.87398072646404 260.38013343217193 47.289103039288364Q260.38013343217193 55.93254262416605 257.00429948109706 60.79243884358784Q253.6284655300222 65.65233506300963 247.46389918458112 65.65233506300963Q243.97390659747958 65.65233506300963 241.3971830985915 64.07042253521126Q238.82045959970344 62.4885100074129 237.45055596738322 59.42253521126761H237.38532246108224L237.45055596738322 65.22831727205337V78.86212008895478H228.2852483320978V37.40622683469236Q228.2852483320978 34.14455151964418 228.02431430689396 29.708673091178646ZM237.32008895478128 47.51742031134174Q237.32008895478128 51.39881393624907 238.16812453669382 54.02446256486286Q239.01616011860634 56.65011119347665 240.56545589325424 58.03632320237213Q242.1147516679021 59.42253521126761 244.20222386953296 59.42253521126761Q247.49651593773163 59.42253521126761 249.1599703484062 56.32394366197183Q250.82342475908075 53.225352112676056 250.82342475908075 47.289103039288364Q250.82342475908075 41.2876204595997 249.11104521868046 38.286879169755366Q247.39866567828017 35.28613787991104 244.2674573758339 35.28613787991104Q242.24521868050405 35.28613787991104 240.64699777613043 36.737583395107485Q239.04877687175681 38.18902891030393 238.18443291326906 40.89621942179392Q237.32008895478128 43.60340993328391 237.32008895478128 47.51742031134174Z"/><path d="M292.27753891771675 58.737583395107485 299.3553743513713 58.80281690140845V65.0L287.97212750185315 64.8369162342476Q284.7430689399555 64.2824314306894 281.7423276501111 61.96664195700519Q280.3398072646404 60.89028910303929 279.4917716827279 58.280948851000744Q278.7415863602668 56.06300963676797 278.67635285396585 52.73610081541883V22.7939214232765H269.2174944403261V16.59673832468495H287.84166048925124V53.779836916234245Q287.9068939955522 56.584877687175684 288.59184581171235 57.36767976278725Q289.47249814677537 58.378799110452185 292.27753891771675 58.737583395107485ZM292.4732394366197 58.80281690140845ZM287.84166048925124 53.779836916234245ZM288.1352112676056 65.0ZM278.67635285396585 52.73610081541883Z"/><path d="M320.8480355819125 65.65233506300963Q312.62861378799107 65.65233506300963 308.160118606375 60.808747220163085Q303.69162342475903 55.96515937731653 303.69162342475903 47.191252779836915Q303.69162342475903 41.320237212750186 305.79540400296514 37.275759822090436Q307.8991845811712 33.231282431430685 311.78057820607853 31.143810229799847Q315.66197183098586 29.05633802816901 320.9785025945144 29.05633802816901Q328.7086730911786 29.05633802816901 332.9814677538917 34.20978502594514Q337.25426241660483 39.363232023721274 337.25426241660483 48.85470719051149V49.11564121571534H313.31356560415117Q313.31356560415117 53.91030392883617 315.44996293550776 56.71534469977761Q317.5863602668643 59.52038547071905 321.30467012601923 59.52038547071905Q323.7183098591549 59.52038547071905 325.5774647887323 58.49295774647887Q327.43661971830977 57.465530022238696 328.08895478131944 55.312824314306894L336.7323943661971 56.06300963676797Q334.9384729429206 60.66197183098591 330.763528539659 63.15715344699777Q326.5885841363973 65.65233506300963 320.8480355819125 65.65233506300963ZM320.8480355819125 34.8295033358043Q317.48851000741286 34.8295033358043 315.4988880652335 37.096367679762785Q313.50926612305403 39.363232023721274 313.3787991104521 43.3750926Line truncated
|
||||
<g fill="#C4610F"><path d="M349.4837657524091 51.65974796145293V43.70126019273536H368.4014825796886V51.65974796145293Z"/><path d="M389.7962935507783 42.787991104521865Q389.7962935507783 50.12676056338028 392.079466271312 54.10600444773907Q394.36263899184576 58.08524833209785 398.8963676797627 58.08524833209785Q404.18028169014076 58.08524833209785 406.7243884358783 50.12676056338028L415.6287620459599 51.82283172720534Q411.2907338769458 65.65233506300963 398.79851742031127 65.65233506300963Q389.6332097850259 65.65233506300963 384.8222386953298 59.830244625648625Q380.0112676056337 54.00815418828762 380.0112676056337 42.787991104521865Q380.0112676056337 20.315048183839878 398.5375833951074 20.315048183839878Q404.60429948109703 20.315048183839878 408.6977020014825 23.511489992587098Q412.79110452186796 26.70793180133432 414.7154929577464 33.00296515937731L405.84373610081536 35.15567086730911Q404.8978502594514 31.698295033358043 403.00607857672344 29.790214974054855Q401.1143068939955 27.882134914751667 398.6680504077093 27.882134914751667Q389.7962935507783 27.882134914751667 389.7962935507783 42.787991104521865Z"/></g>
|
||||
<g fill="#5A6B7D"><path d="M116.64229950319375 89.49538679914833Q118.53726046841732 89.49538679914833 119.27537260468418 87.59332860184529L121.09936124911285 88.28176011355572Q120.51029098651526 89.72959545777147 119.37118523775727 90.43577004968063Q118.23207948899929 91.14194464158977 116.64229950319375 91.14194464158977Q114.2292405961675 91.14194464158977 112.91270404542229 89.77572746628815Q111.59616749467708 88.40951029098652 111.59616749467708 85.95386799148332Q111.59616749467708 83.49112845990064 112.86657203690561 82.17104329311569Q114.13697657913414 80.85095812633074 116.5500354861604 80.85095812633074Q118.31014904187367 80.85095812633074 119.41731724627395 81.5571327182399Q120.52448545067423 82.26330731014905 120.97161107168205 83.63307310149042L119.1263307310149 84.13697657913414Q118.89212207239177 83.3846699787083 118.20723917672109 82.94109297374024Q117.52235628105039 82.49751596877218 116.59261887863732 82.49751596877218Q115.17317246273953 82.49751596877218 114.43860894251242 83.37757274662881Q113.7040454222853 84.25762952448545 113.7040454222853 85.95386799148332Q113.7040454222853 87.67849538679914 114.4599006387509 88.58694109297375Q115.21575585521647 89.49538679914833 116.64229950319375 89.49538679914833Z"/><path d="M135.59233498935416 85.95386799148332Q135.59233498935416 87.5152590489709 134.97487579843863 88.70049680624557Q134.35741660752308 89.88573456352023 133.20766501064585 90.51383960255501Q132.05791341376863 91.14194464158977 130.524911284599 91.14194464158977Q128.16863023420868 91.14194464158977 126.83080198722499 89.75443577004967Q125.49297374024131 88.36692689850958 125.49297374024131 85.95386799148332Q125.49297374024131 83.54790631653655 126.82725337118524 82.19943222143365Q128.16153300212918 80.85095812633074 130.53910574875798 80.85095812633074Q132.9166784953868 80.85095812633074 134.2545067423705 82.21362668559263Q135.59233498935416 83.5762952448545 135.59233498935416 85.95386799148332ZM133.45606813342798 85.95386799148332Q133.45606813342798 84.33569907735983 132.68956706884316 83.416607523066Q131.92306600425835 82.49751596877218 130.53910574875798 82.49751596877218Q129.13385379701916 82.49751596877218 128.36735273243434 83.40951029098652Q127.60085166784954 84.32150461320086 127.60085166784954 85.95386799148332Q127.60085166784954 87.60042583392477 128.38509581263307 88.54790631653655Q129.1693399574166 89.49538679914833 130.524911284599 89.49538679914833Q131.93016323633782 89.49538679914833 132.6931156848829 88.57274662881477Q133.45606813342798 87.65010645848119 133.45606813342798 85.95386799148332Z"/><path d="M149.48914123491838 85.92547906316537Q149.48914123491838 87.47267565649396 148.88232789212208 88.62597586941092Q148.27551454932578 89.7792760823279 147.16479772888573 90.38963804116395Q146.0540809084457 91.0 144.62044002838894 91.0H140.5750177430802V81.0H144.1946061036196Q146.72122072391767 81.0 148.10518097941804 82.27395315826828Q149.48914123491838 83.54790631653655 149.48914123491838 85.92547906316537ZM147.38126330731015 85.92547906316537Q147.38126330731015 84.31440738112136 146.54378992193045 83.46628814762242Q145.70631653655076 82.61816891412349 144.15202271114265 82.61816891412349H142.66870120652945V89.38183108587651H144.4430092264017Q145.79148332150461 89.38183108587651 146.58637331440738 88.45209368346346Q147.38126330731015 87.52235628105039 147.38126330731015 85.92547906316537Z"/><path d="M154.47182398864442 91.0V81.0H156.56550745209367V91.0Z"/><path d="M167.99957416607523 91.0 163.641873669269 83.29950319375443Q163.7696238466998 84.4208658623137 163.7696238466998 85.10220014194464V91.0H161.91014904187367V81.0H164.30191625266147L168.72349183818312 88.76437189496096Q168.5957416607523 87.69268985095813 168.5957416607523 86.8126330731015V81.0H170.45521646557845V91.0Z"/><path d="M180.55500354861604 89.50248403122782Q181.3711852377573 89.50248403122782 182.1376863023421 89.26472675656494Q182.9041873669269 89.02696948190206 183.32292405961675 88.65791341376863V87.27395315826827H180.88147622427255V85.72675656493968H185.23917672107876V89.40312278211498Q184.444286728176 90.21930447125621 183.1703335699077 90.680624556423Q181.89638041163946 91.14194464158977 180.49822569198014 91.14194464158977Q178.0567778566359 91.14194464158977 176.74378992193044 89.78992193044712Q175.43080198722498 88.43789921930447 175.43080198722498 85.95386799148332Q175.43080198722498 83.48403122782115 176.75088715400994 82.16749467707595Q178.07097232079488 80.85095812633074 180.54790631653654 80.85095812633074Q184.0681334279631 80.85095812633074 185.0262597586941 83.4556422995032L183.0958126330731 84.0376153300213Q182.78353442157558 83.27821149751597 182.1163946061036 82.88786373314407Q181.44925479063164 82.49751596877218 180.54790631653654 82.49751596877218Q179.07168204400284 82.49751596877218 178.30518097941803 83.39176721078779Q177.5386799148332 84.2860184528034 177.5386799148332 85.95386799148332Q177.5386799148332 87.65010645848119 178.33002129169626 88.5762952448545Q179.12136266855927 89.502Line truncated
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 17 KiB |
@@ -0,0 +1,10 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128" role="img" aria-label="Triple-C">
|
||||
<title>Triple-C mark, small-size variant</title>
|
||||
<!-- Optical variant for 32 px and below: heavier strokes, wider mouth, no cursor bar.
|
||||
Below ~40 px the cursor closes up against the chevron and the frame goes to mush. -->
|
||||
<g fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M112 50 L112 38 A22 22 0 0 0 90 16 L38 16 A22 22 0 0 0 16 38 L16 90 A22 22 0 0 0 38 112 L90 112 A22 22 0 0 0 112 90 L112 78"
|
||||
stroke="#58A6FF" stroke-width="14"/>
|
||||
<path d="M46 50 L62 66 L46 82" stroke="#F0821E" stroke-width="13"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 690 B |
@@ -0,0 +1,11 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128" role="img" aria-label="Triple-C">
|
||||
<title>Triple-C mark</title>
|
||||
<!-- The container frame, opened on the right so the enclosure itself is the letter C. -->
|
||||
<g fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M112 46 L112 38 A22 22 0 0 0 90 16 L38 16 A22 22 0 0 0 16 38 L16 90 A22 22 0 0 0 38 112 L90 112 A22 22 0 0 0 112 90 L112 82"
|
||||
stroke="#58A6FF" stroke-width="12"/>
|
||||
<!-- The prompt: chevron and cursor. -->
|
||||
<path d="M42 50 L58 66 L42 82" stroke="#F0821E" stroke-width="11"/>
|
||||
<path d="M68 82 L88 82" stroke="#F0821E" stroke-width="11"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 691 B |