Files
clide/.claude/skills/ui-design/scripts/gen-phosphor-glyphs.py
T
jpmschweitzerandClaude Opus 4.8 628db30645 ui-design skill: full Phosphor glyph reference page (1512 glyphs)
Mirror assets/fonts/phosphor/codepoints.csv into a readable, greppable
markdown table at references/phosphor-glyphs.md — codepoint · kebab · Pascal,
with an "In clide" column flagging the ~45 glyphs already wired into
PhosphorIcons (reach for those first). Generated by scripts/gen-phosphor-
glyphs.py (regenerate after a font bump). Point icons.md + SKILL.md at it.

Supports glyph-picking for T-275 (composer permission-mode icons) and any
future icon work.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 18:11:26 +02:00

59 lines
2.3 KiB
Python

#!/usr/bin/env python3
"""Generate the Phosphor glyph reference page for the ui-design skill.
Mirrors `assets/fonts/phosphor/codepoints.csv` (the full bundled glyph set)
into a readable, greppable markdown table at
`.claude/skills/ui-design/references/phosphor-glyphs.md`, flagging which
glyphs clide already defines in `lib/widgets/src/icons/phosphor.dart`.
Run from the repo root: python3 .claude/skills/ui-design/scripts/gen-phosphor-glyphs.py
"""
import csv
import pathlib
import re
ROOT = pathlib.Path(__file__).resolve().parents[4]
CSV = ROOT / "assets/fonts/phosphor/codepoints.csv"
DART = ROOT / "lib/widgets/src/icons/phosphor.dart"
OUT = ROOT / ".claude/skills/ui-design/references/phosphor-glyphs.md"
# Codepoint -> camelCase accessor already defined in PhosphorIcons.
defined = {}
for m in re.finditer(r"static const (\w+) = PhosphorIconPainter\((0x[0-9a-fA-F]+)\)", DART.read_text()):
defined[int(m.group(2), 16)] = m.group(1)
rows = list(csv.DictReader(CSV.open()))
n_def = sum(1 for r in rows if int(r["codepoint"], 16) in defined)
lines = [
"---",
"name: phosphor-glyphs",
"type: reference",
"tags: [icons, phosphor, ui-design]",
"---",
"",
"# Phosphor glyphs — full reference (v2.0.8)",
"",
f"All **{len(rows)}** glyphs bundled in clide's Phosphor font "
"(`assets/fonts/phosphor/`, MIT). Generated from "
"`assets/fonts/phosphor/codepoints.csv` — **do not hand-edit**; regenerate with "
"`python3 .claude/skills/ui-design/scripts/gen-phosphor-glyphs.py`.",
"",
f"The **In clide** column flags the **{n_def}** glyphs already wired into "
"`PhosphorIcons` (`lib/widgets/src/icons/phosphor.dart`) — reach for those first. "
"To use any other glyph, add a one-line `static const` to that class with the "
"codepoint below, then `ClideIcon(PhosphorIcons.<name>, size: 13)`. Keep additions "
"to icons we actually use — don't bulk-import.",
"",
"| Codepoint | Name (kebab) | Pascal | In clide |",
"|---|---|---|---|",
]
for r in rows:
cp = r["codepoint"]
accessor = defined.get(int(cp, 16))
in_clide = f"`PhosphorIcons.{accessor}`" if accessor else ""
lines.append(f"| `{cp}` | {r['name']} | {r['pascal_name']} | {in_clide} |")
OUT.write_text("\n".join(lines) + "\n")
print(f"wrote {OUT.relative_to(ROOT)}{len(rows)} glyphs, {n_def} already defined")