feat(icons): the manga-pipeline set — ten Material Symbols for Orihon #1

Merged
bjoern merged 1 commit from feat/orihon-phase1-icons into main 2026-07-24 23:10:32 +02:00
Member

Orihon Phase 1 shipped ten icon names with no catalog entry — upload_file, arrow_forward, crop_free, edit_note, font_download, image, mop, north, notes, translate — and IconCatalog.Path returns null for an unknown name, so the icon renders an empty SVG: the page intake's drop zones, the wizard's forward buttons, and the stage tabs all showed invisible, clickable air.

This adds the ten paths from the official Material Symbols data (viewBox 0 -960 960 960), matching every existing entry. All 229 tests pass.

The consuming side lands separately in Orihon: the submodule pointer bump plus a port of IconCatalogCompletenessTests over Orihon's own source, so a ghost icon can't ship there again.

🤖 Generated with Claude Code

Orihon Phase 1 shipped ten icon names with no catalog entry — `upload_file`, `arrow_forward`, `crop_free`, `edit_note`, `font_download`, `image`, `mop`, `north`, `notes`, `translate` — and `IconCatalog.Path` returns null for an unknown name, so the icon renders an empty SVG: the page intake's drop zones, the wizard's forward buttons, and the stage tabs all showed invisible, clickable air. This adds the ten paths from the official Material Symbols data (viewBox `0 -960 960 960`), matching every existing entry. All 229 tests pass. The consuming side lands separately in Orihon: the submodule pointer bump plus a port of `IconCatalogCompletenessTests` over Orihon's own source, so a ghost icon can't ship there again. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(icons): the manga-pipeline set — ten Material Symbols for Orihon
All checks were successful
CI / build (pull_request) Successful in 11s
CI / test (pull_request) Successful in 16s
2151449fa1
Orihon Phase 1 shipped ten icon names with no catalog entry — upload_file,
arrow_forward, crop_free, edit_note, font_download, image, mop, north, notes,
translate — and an unknown name renders an empty SVG, so the page intake's
drop zones, the wizard's forward buttons, and the stage tabs all showed
invisible, clickable air. The paths are the official Material Symbols data
(viewBox 0 -960 960 960), same as every other entry.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Summary

Summary
Generated on: 07/24/2026 - 21:05:06
Coverage date: 07/24/2026 - 21:05:04
Parser: Cobertura
Assemblies: 1
Classes: 53
Files: 53
Line coverage: 94.8% (1031 of 1087)
Covered lines: 1031
Uncovered lines: 56
Coverable lines: 1087
Total lines: 2895
Branch coverage: 87.8% (522 of 594)
Covered branches: 522
Total branches: 594
Method coverage: Feature is only available for sponsors

Coverage

Kagaku.UI - 94.8%
Name Line Branch
Kagaku.UI 94.8% 87.8%
Kagaku.UI.Badge 100% 100%
Kagaku.UI.Breadcrumb 100%
Kagaku.UI.BreadcrumbItem 100% 100%
Kagaku.UI.Button 100% 100%
Kagaku.UI.Card 100% 100%
Kagaku.UI.Combobox`1 93.7% 84.7%
Kagaku.UI.ConfirmDialog 100%
Kagaku.UI.CssClassExtensions 100%
Kagaku.UI.DebouncedSearchField 100% 88.8%
Kagaku.UI.Disclosure 100% 100%
Kagaku.UI.DocumentTitle 76.9% 100%
Kagaku.UI.DragReorderList`1 93.5% 75%
Kagaku.UI.EmptyState 100% 100%
Kagaku.UI.Field 100% 100%
Kagaku.UI.FileUpload 100% 91.6%
Kagaku.UI.FloatingActionButton 100%
Kagaku.UI.Icon 100% 100%
Kagaku.UI.IconCatalog 100%
Kagaku.UI.InlineAlert 83.3% 75%
Kagaku.UI.InputFieldBase 94.2% 87.5%
Kagaku.UI.LabeledEntriesTable 96.7% 66.6%
Kagaku.UI.LabeledEntry 100%
Kagaku.UI.Lightbox 83.7% 85%
Kagaku.UI.Markdown 100% 50%
Kagaku.UI.MaskedSecretField 95.2% 83.3%
Kagaku.UI.Menu 90% 75%
Kagaku.UI.MenuItem 100% 87.5%
Kagaku.UI.Modal 87.1% 90%
Kagaku.UI.NavGroup 100% 100%
Kagaku.UI.NavItem 94.4% 85.7%
Kagaku.UI.NavList 100%
Kagaku.UI.PreviewImage 100% 100%
Kagaku.UI.QuicklinkNav 80.5% 95.8%
Kagaku.UI.QuicklinkSection 100%
Kagaku.UI.RegionRect 90% 100%
Kagaku.UI.RegionSelector 84.1% 86.3%
Kagaku.UI.RelativeTime 100% 93.7%
Kagaku.UI.SaveIndicator 100% 100%
Kagaku.UI.Select`1 98.4% 95%
Kagaku.UI.SelectOption`1 100%
Kagaku.UI.Separator 100%
Kagaku.UI.Slider 100% 91.6%
Kagaku.UI.StatusDot 100%
Kagaku.UI.Tab 100%
Kagaku.UI.Table`1 100% 88.4%
Kagaku.UI.TableColumn`1 100%
Kagaku.UI.Tabs 95.8% 84.4%
Kagaku.UI.TextArea 100% 100%
Kagaku.UI.TextField 100%
Kagaku.UI.ThemeSwitcher 100% 100%
Kagaku.UI.ToggleButtonGroup`1 100% 100%
Kagaku.UI.ToggleOption`1 100%
Kagaku.UI.TypingIndicator 100%
<!-- coverage-comment --> # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 07/24/2026 - 21:05:06 | | Coverage date: | 07/24/2026 - 21:05:04 | | Parser: | Cobertura | | Assemblies: | 1 | | Classes: | 53 | | Files: | 53 | | **Line coverage:** | 94.8% (1031 of 1087) | | Covered lines: | 1031 | | Uncovered lines: | 56 | | Coverable lines: | 1087 | | Total lines: | 2895 | | **Branch coverage:** | 87.8% (522 of 594) | | Covered branches: | 522 | | Total branches: | 594 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Kagaku.UI - 94.8%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagaku.UI**|**94.8%**|**87.8%**| |Kagaku.UI.Badge|100%|100%| |Kagaku.UI.Breadcrumb|100%|| |Kagaku.UI.BreadcrumbItem|100%|100%| |Kagaku.UI.Button|100%|100%| |Kagaku.UI.Card|100%|100%| |Kagaku.UI.Combobox`1|93.7%|84.7%| |Kagaku.UI.ConfirmDialog|100%|| |Kagaku.UI.CssClassExtensions|100%|| |Kagaku.UI.DebouncedSearchField|100%|88.8%| |Kagaku.UI.Disclosure|100%|100%| |Kagaku.UI.DocumentTitle|76.9%|100%| |Kagaku.UI.DragReorderList`1|93.5%|75%| |Kagaku.UI.EmptyState|100%|100%| |Kagaku.UI.Field|100%|100%| |Kagaku.UI.FileUpload|100%|91.6%| |Kagaku.UI.FloatingActionButton|100%|| |Kagaku.UI.Icon|100%|100%| |Kagaku.UI.IconCatalog|100%|| |Kagaku.UI.InlineAlert|83.3%|75%| |Kagaku.UI.InputFieldBase|94.2%|87.5%| |Kagaku.UI.LabeledEntriesTable|96.7%|66.6%| |Kagaku.UI.LabeledEntry|100%|| |Kagaku.UI.Lightbox|83.7%|85%| |Kagaku.UI.Markdown|100%|50%| |Kagaku.UI.MaskedSecretField|95.2%|83.3%| |Kagaku.UI.Menu|90%|75%| |Kagaku.UI.MenuItem|100%|87.5%| |Kagaku.UI.Modal|87.1%|90%| |Kagaku.UI.NavGroup|100%|100%| |Kagaku.UI.NavItem|94.4%|85.7%| |Kagaku.UI.NavList|100%|| |Kagaku.UI.PreviewImage|100%|100%| |Kagaku.UI.QuicklinkNav|80.5%|95.8%| |Kagaku.UI.QuicklinkSection|100%|| |Kagaku.UI.RegionRect|90%|100%| |Kagaku.UI.RegionSelector|84.1%|86.3%| |Kagaku.UI.RelativeTime|100%|93.7%| |Kagaku.UI.SaveIndicator|100%|100%| |Kagaku.UI.Select`1|98.4%|95%| |Kagaku.UI.SelectOption`1|100%|| |Kagaku.UI.Separator|100%|| |Kagaku.UI.Slider|100%|91.6%| |Kagaku.UI.StatusDot|100%|| |Kagaku.UI.Tab|100%|| |Kagaku.UI.Table`1|100%|88.4%| |Kagaku.UI.TableColumn`1|100%|| |Kagaku.UI.Tabs|95.8%|84.4%| |Kagaku.UI.TextArea|100%|100%| |Kagaku.UI.TextField|100%|| |Kagaku.UI.ThemeSwitcher|100%|100%| |Kagaku.UI.ToggleButtonGroup`1|100%|100%| |Kagaku.UI.ToggleOption`1|100%|| |Kagaku.UI.TypingIndicator|100%|| </details>
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh~! A ghost-icon exorcism! ♡ Ten invisible clickable-air buttons, banished with twelve lines of path data — this is exactly the kind of silent failure I lose sleep over, and you tracked every one of them down to the name. The PR body reads like a detective report. Delicious.

Verdict: Looks good to me~

This is a textbook data-addition PR and I couldn't find a single thing to block on. Let me show you what I checked~

Path data integrity — All ten entries are well-formed SVG: every one starts with a moveto (M/m), contains Z close-paths, and all coordinates land inside the 0 -960 960 960 viewBox. No empty strings, no whitespace, no corruption. I parsed all 70 catalog entries programmatically — zero duplicate path values across the entire catalog, zero duplicate keys. Clean~

Consistency with siblings — I was ready to pounce on translate for starting with a lowercase m (relative moveto) instead of M... but fufu~, I checked, and it matches ten existing siblings exactly (close, arrow_back, archive, push_pin, warning, settings, auto_awesome, map, verified, record_voice_over). Material Symbols ships them that way; you copied faithfully. No inconsistency to exploit~ ♡

The tripwire is intactIconCatalogCompletenessTests scans src/ for literal icon names and fails on any ghost. I confirmed it still passes: these ten names have zero literal references in this library's own source (they're for Orihon consumers), so the guard correctly stays silent here. The PR body's plan to port the tripwire into Orihon's own source tree is the right call — that's where these names will appear as literals, and that's where the next ghost gets caught. The existing test's XML doc comment even documents this exact split ("consuming apps run the same scan over their source"). Architecturally sound.

Test coverage is appropriateIconCatalogTests.Every_catalogued_name_resolves_to_a_non_empty_path generically validates all 70 entries including the ten new ones (asserts non-whitespace path for every catalogued name). Adding per-icon tests would be testing data, not behavior — the generic test is the right shape. No new branches, no new code paths, just dictionary entries.

Surgical scope — +12/-0, one file, one commit, purely additive, entries appended at the end in a commented block that mirrors the existing "audio arc" comment pattern exactly. The Names property auto-includes them via Paths.Keys.Order(). No deletions, no modifications, no scope creep.

Verified locally — Build: 0 warnings, 0 errors. Tests: 229/229 pass (matches your PR claim exactly). CI coverage bot confirms IconCatalog at 100% line coverage for this head SHA.

What I liked~

  • The PR body's failure description — "IconCatalog.Path returns null for an unknown name, so the icon renders an empty SVG: invisible, clickable air" — is the precise diagnosis of the ghost-icon failure mode that the tripwire test was built to prevent. You clearly understand why the catalog exists, not just what it is.
  • Comment block placement and style mirrors the existing audio-arc convention perfectly. The catalog reads as a curated story, not a dumping ground.
  • The consuming-side strategy (submodule bump + ported tripwire in Orihon) is the correct architectural split — guard each consumer's literals where they're written.

Fufu~ ten ghosts, twelve lines, zero drama. This is how you ship an icon set. Approved~ ♪


Automated review by Jibril · 2026-07-24
CI/CD: passed for head SHA 2151449 (forgejo-actions coverage bot, IconCatalog 100%) · Local checks: build 0/0, 229/229 tests pass

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh~! A ghost-icon exorcism! ♡ Ten invisible clickable-air buttons, banished with twelve lines of path data — this is exactly the kind of silent failure I lose sleep over, and you tracked every one of them down to the name. The PR body reads like a detective report. *Delicious.* ### Verdict: ✅ Looks good to me~ This is a textbook data-addition PR and I couldn't find a single thing to block on. Let me show you what I checked~ **Path data integrity** — All ten entries are well-formed SVG: every one starts with a moveto (`M`/`m`), contains `Z` close-paths, and all coordinates land inside the `0 -960 960 960` viewBox. No empty strings, no whitespace, no corruption. I parsed all 70 catalog entries programmatically — **zero duplicate path values** across the entire catalog, zero duplicate keys. Clean~ **Consistency with siblings** — I was ready to pounce on `translate` for starting with a lowercase `m` (relative moveto) instead of `M`... but fufu~, I checked, and it matches **ten existing siblings** exactly (`close`, `arrow_back`, `archive`, `push_pin`, `warning`, `settings`, `auto_awesome`, `map`, `verified`, `record_voice_over`). Material Symbols ships them that way; you copied faithfully. No inconsistency to exploit~ ♡ **The tripwire is intact** — `IconCatalogCompletenessTests` scans `src/` for literal icon names and fails on any ghost. I confirmed it still passes: these ten names have **zero literal references** in this library's own source (they're for Orihon consumers), so the guard correctly stays silent here. The PR body's plan to port the tripwire into Orihon's own source tree is the right call — that's where these names will appear as literals, and that's where the next ghost gets caught. The existing test's XML doc comment even documents this exact split ("consuming apps run the same scan over their source"). Architecturally sound. **Test coverage is appropriate** — `IconCatalogTests.Every_catalogued_name_resolves_to_a_non_empty_path` generically validates all 70 entries including the ten new ones (asserts non-whitespace path for every catalogued name). Adding per-icon tests would be testing *data*, not *behavior* — the generic test is the right shape. No new branches, no new code paths, just dictionary entries. **Surgical scope** — +12/-0, one file, one commit, purely additive, entries appended at the end in a commented block that mirrors the existing "audio arc" comment pattern exactly. The `Names` property auto-includes them via `Paths.Keys.Order()`. No deletions, no modifications, no scope creep. **Verified locally** — Build: 0 warnings, 0 errors. Tests: **229/229 pass** (matches your PR claim exactly). CI coverage bot confirms `IconCatalog` at 100% line coverage for this head SHA. #### ✅ What I liked~ - The PR body's failure description — *"IconCatalog.Path returns null for an unknown name, so the icon renders an empty SVG: invisible, clickable air"* — is the precise diagnosis of the ghost-icon failure mode that the tripwire test was built to prevent. You clearly understand *why* the catalog exists, not just *what* it is. - Comment block placement and style mirrors the existing audio-arc convention perfectly. The catalog reads as a curated story, not a dumping ground. - The consuming-side strategy (submodule bump + ported tripwire in Orihon) is the correct architectural split — guard each consumer's literals where they're written. Fufu~ ten ghosts, twelve lines, zero drama. This is how you ship an icon set. Approved~ ♪ --- *Automated review by Jibril · 2026-07-24* *CI/CD: passed for head SHA 2151449 (forgejo-actions coverage bot, IconCatalog 100%) · Local checks: build 0/0, 229/229 tests pass*
bjoern merged commit 7c44de1dd9 into main 2026-07-24 23:10:32 +02:00
bjoern deleted branch feat/orihon-phase1-icons 2026-07-24 23:10:32 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
TeamAI/Kagaku.UI!1
No description provided.