Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ All notable changes to `ichava/core` follow [Keep a Changelog](https://keepachan

## [Unreleased]

### Changed

- Docs, config comments and test notes name icon-browser where they named react-icon-browser, which is retired: the browser that shares the SVG caps and monochrome rule, and its svg-baseline spec, live in icon-browser since 2026-11-12. CHANGELOG history is unchanged.

## [0.1.0] - 2026-11-13

First release of `ichava/core`. The repository is published as a single commit; the 0.1.x tags cut between 2026-10-23 and 2026-10-27 (v0.1.0 to v0.1.3) are folded into this release, and their notes are kept below under *Archived history*.
Expand Down
4 changes: 2 additions & 2 deletions config/ichava-core.php
Original file line number Diff line number Diff line change
Expand Up @@ -496,8 +496,8 @@
| is served as an empty string, never raw.
|
| `max_elements` counts elements, not nodes: text and whitespace nodes
| are bounded by `max_bytes`. Both values match react-icon-browser and
| icon-sets-sync, so the three runtimes refuse the same files. Both are
| are bounded by `max_bytes`. Both values match icon-browser's browser
| and icon-sets-sync, so the three runtimes refuse the same files. Both are
| at least 4x the largest measured across all 135,112 SVGs in the
| icon-sets-* packs on 2026-11-04 (1,053,328 bytes; 6,741 elements).
| The per-kind serving budget (`max_file_size`,
Expand Down
4 changes: 2 additions & 2 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ flowchart TB
meta["<i>ichava/ichava</i><br/>pre-split monolith, superseded by core<br/>ARCHIVED 2026-09-22, read-only"]
toolkit["<b>ichava/icon-sets-sync</b><br/>Docker-first sync tool<br/>refreshes vendored SVGs via PR<br/>(not installed by users)"]
motion["<i>ichava/js-motion</i><br/>SVG animation engine<br/>~205 presets, no runtime deps<br/>(outside the Composer graph)"]
react["<i>@ichava/react-icon-browser</i><br/>React 19 rebuild of the front end<br/>PRIVATE, not on npm"]
react["<i>ichava/react-icon-browser</i><br/>React 19 rebuild of the front end<br/>RETIRED 2026-11-13, source now in icon-browser"]

browser -- depends on --> core
tabler -- depends on --> core
Expand All @@ -45,7 +45,7 @@ flowchart TB
toolkit -. CI refreshes .-> tabler
toolkit -. CI refreshes .-> flag
toolkit -. CI refreshes .-> twemoji
react -. replaces the SPA in .-> browser
react -. folded into .-> browser

classDef engine fill:#1f6feb,stroke:#1f6feb,color:#fff
classDef http fill:#8957e5,stroke:#8957e5,color:#fff
Expand Down
4 changes: 2 additions & 2 deletions docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,8 @@ string, never raw.
| `svg.max_bytes` (`ICHAVA_SVG_MAX_BYTES`) | 4,500,000 | before the SVG is parsed |
| `svg.max_elements` (`ICHAVA_SVG_MAX_ELEMENTS`) | 30,000 | while the tree is walked; counts elements only, since `max_bytes` bounds text and whitespace |

Both values match `react-icon-browser` and `icon-sets-sync`, so all three runtimes refuse the same
files. On 2026-11-04, across all 135,112 SVGs in the `icon-sets-*` packs, the largest file was
Both values match icon-browser's browser (`limits.svgMaxChars` and `svgMaxNodes`, formerly in
react-icon-browser) and `icon-sets-sync`, so all three runtimes refuse the same files. On 2026-11-04, across all 135,112 SVGs in the `icon-sets-*` packs, the largest file was
1,053,328 bytes and the most elements in one file was 6,741, so both caps are at least 4x the
largest real file. The serve path also checks the kind's `max_file_size` before it reads the file.

Expand Down
4 changes: 2 additions & 2 deletions src/Constants/IchavaConstants.php
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ final class IchavaConstants
* which stays the tighter limit on the serve path. Measured 2026-11-04 over
* all 135,112 SVGs under the icon-sets-* packs: the largest is 1,053,328
* bytes (a parked metronic brand logo), so 4,500,000 is at least 4x that.
* The value matches react-icon-browser and icon-sets-sync, so the three
* The value matches icon-browser's browser and icon-sets-sync, so the three
* runtimes refuse the same files.
*
* Because it bounds the whole input, it also bounds the text and
Expand All @@ -119,7 +119,7 @@ final class IchavaConstants
/**
* Most ELEMENTS the SVG sanitiser will walk before refusing the document.
*
* Elements, not nodes: the same count react-icon-browser and icon-sets-sync
* Elements, not nodes: the same count icon-browser's browser and icon-sets-sync
* use, and the same value, so the three runtimes agree. Text and whitespace
* nodes are bounded by the byte cap above instead. Measured 2026-11-04 over
* the same 135,112 SVGs: the most elements in one file is 6,741 (bundled
Expand Down
3 changes: 2 additions & 1 deletion src/Services/Traits/ConvertsMonochromeToCurrentColor.php
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,8 @@ private function paintValues(DOMElement $element): array
* channel at most 0x40 and within 0x18 of the others. Twemoji's heavy dollar sign
* is #292F33, which pure-black matching missed, so it stayed near-black on a dark
* page. A dark colour with a hue (navy, maroon) is still a colour. Mirrors
* react-icon-browser's monochrome.ts, so both catalogs paint an icon the same way.
* icon-browser's resources/js/modules/svg/infrastructure/monochrome.ts (formerly react-icon-browser's), so both
* catalogs paint an icon the same way.
*/
private function isBlackPaint(string $value): bool
{
Expand Down
4 changes: 2 additions & 2 deletions tests/Unit/SvgArchetypeRegressionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
* This is construct-level rather than pixel-level, and that is a deliberate
* limit worth stating. It cannot see that a gradient renders the wrong colour;
* it can see that the gradient lost its stops, which is the failure mode that
* actually occurred. Pixel comparison for the SPA lives in
* `react-icon-browser/e2e/svg-baseline.spec.ts`.
* actually occurred. Pixel comparison for the browser lives in
* `icon-browser/e2e/browser/svg-baseline.spec.ts` (public packs only).
*
* Fixtures and their provenance: `tests/fixtures/archetypes/manifest.json`.
*/
Expand Down
2 changes: 1 addition & 1 deletion tests/Unit/SvgPresentationParityTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
* stripped.
*
* tests/fixtures/svg/presentation-vectors.json is byte-identical in core,
* react-icon-browser and js-icon-components, and copies its rows from the Go
* icon-browser and js-icon-components, and copies its rows from the Go
* table in icon-sets-sync, so all four sanitisers make the same decisions.
*/
function presentationSanitise(string $svg): string
Expand Down
Loading