Changelog
All notable changes to FontOps
[1.2.1] — 2026-08-11
Fixed
- Compile error on Unity 6.4 and newer. Unity replaced the 32-bit
InstanceID with the 64-bit EntityId and rejects Object.GetInstanceID(). FontOps now calls GetEntityId() on those versions, behind UNITY_6000_4_OR_NEWER — Unity 2022.3 through 6.3 compile exactly as before
- Console error on Unity 6.4 and newer from the built-in
d_winbtn_win_close icon Unity removed. The search bar’s clear button renders its own ✕ glyph instead
- “Folder not found” warnings when opening the window. The My Fonts scanner no longer passes provider download folders to
AssetDatabase.FindAssets until they exist, so a fresh project logs nothing
Upgrade note (from 1.1.0)
- Unity’s
.unitypackage import never deletes files, so updating over an existing 1.1.0 install leaves the removed Editor/FontOpsTmpInspector.cs behind, which no longer compiles (CS0117: 'InlineFontPickerWindow' does not contain a definition for 'DrawInspectorButton'). Delete Packages/dev.davgtz.fontops/Editor/FontOpsTmpInspector.cs (and its .meta) after importing — or delete the whole Packages/dev.davgtz.fontops/ folder first for a clean install. Fresh installs are unaffected
[1.2.0] — 2026-07-10
Changed
- Inline font picker redesigned as a miniature of the main window. The full-width picker banner is gone — a magnifying-glass button now sits directly beside the Font Asset field, and beside every other serialized
TMP_FontAsset field, via a PropertyDrawer. The TMP inspector subclasses from 1.1.0 are removed; no inspector is overridden anymore
- The popup shares the main window’s stylesheet and design tokens: branded header with an OPEN FONTOPS shortcut, debounced search with clear button, a favorites toggle synced with the Search tab, palette roles grouped under their palette’s name, colored provider source badges, and per-row favorite hearts
- Live font previews load per page, respecting the auto-preview setting and sharing the main window’s preview cache
- GET MORE pagination — 20 per page with a footer pager, replacing the old “+ N more — refine your search” cutoff
- Expandable catalog rows: click a row to list every style, each typeset in its own face and individually installable. ↓ installs Regular and assigns it, ⇊ installs all styles
- Tooltips on every control (catalog rows surface category, style count, and license), the popup is movable by dragging its header, and Esc closes it
- Assignment goes through the serialized property, so Undo, multi-object editing, and prefab overrides work anywhere the button appears
[1.1.0] — 2026-06-12
Added
- Fontshare (OSS) provider: OFL-only subset of the Fontshare catalog. Closed-source (ITF FFL) fonts are filtered at ingest via the
license_type == "sil_ofl" guard. Per-family ZIP download + deterministic weight-suffix resolver so italic variants never ship with the wrong glyphs. OFL.txt dropped alongside installed TTFs
- Fontsource provider: 2,077 fonts — a strict superset of Google Fonts plus 126 uniques. Per-variant TTFs served directly from jsDelivr, no ZIP step. License normalised to canonical labels at catalog time;
LICENSE.txt fetched once per family on first install
- Fontsource per-font version lazy-fetch: cards now populate the
version field on demand from /v1/fonts/{id}. Card sub-info and specimen VERSION row update once the request lands
- Cross-source dedup on the ALL view: when the same family appears in multiple catalogs, the highest-priority source wins and losing catalogs stack as multi-source badges. Fontsource's explicit per-font license overrides the winner when present
IFontProvider interface + FontProviderRegistry: every provider registers itself via [InitializeOnLoadMethod]; Settings rows and scanner folders auto-wire from the registry
- Shared adapters:
DiskCache (catalog JSON), HttpDownloader (UnityWebRequest lifecycle + optional progress bar), FontVariantLabel (canonical weight/italic parser), FontInstallManifest (per-family .fontops.json sidecar for bulletproof variant labels)
- Template-driven Settings UI: per-provider download-folder rows generated at runtime by iterating
FontProviderRegistry.All
- Multi-provider scanner awareness:
ScanLocalFonts, ScanEntireProject, and the palette-less audit all see every provider's configured folder
- Palette-less general audit: Text Auditor
SCAN PROJECT with no palette assigned produces a usage/quality report with grade, placeholder flags, and installed-but-unused families
- Inline font picker on every TMP_Text inspector: a FontOps button at the top of the TextMeshPro / TextMeshProUGUI inspector opens a searchable dropdown with three sections — palette roles, every installed
TMP_FontAsset, and not-yet-installed catalog families (installed TTF→SDF and assigned in one click) — each entry typeset in its own face. Assigns with Undo, prefab-aware, multi-selection included
- Google Fonts license from
/metadata/fonts/{family} JSON: canonical license sourced from the authoritative endpoint instead of HTML-scraping the specimen page
- Custom
.unitypackage exporter (Tools → FontOps → Export): ships the UPM package from Packages/ with Samples~ contents included
- Asset Store metadata:
Third Party Notices.md (now also covering the bundled OFL sample fonts) and documentationUrl pointing to the live docs site
Changed
- Documentation nav rename: “Google Fonts” tab → “Providers” (now a hub covering all three integrations)
FontRoleEntry split into its own file to fix Unity MonoScript binding (the CreateAsset “No script asset” error when multiple public types share a filename)
- Dedup priority order:
[GF, Fontsource, Fontshare] when GF API key is set; [Fontsource, Fontshare] otherwise
- Architecture pass:
FontRoleStyle is the single style-conversion module behind every preview surface; FontSwapper renamed to FontProjectScanner; the all-provider preview cache extracted to FontPreviewCache; the install epilogue (write → import → manifest → license → TMP SDF) consolidated behind FontInstaller
- Variant UNINSTALL now asks for confirmation (asset deletion has no Undo)
Fixed
- Licensing: removed the independent
LICENSE.md EULA that conflicted with the Asset Store EULA. Bundled sample fonts (Montserrat, Roboto) now carry their required SIL OFL 1.1 license files and are credited in Third Party Notices.md
- The package exporter now actually ships
Samples~ (previously skipped, silently dropping demo scenes, palettes, and fonts) and excludes Tests/ and store marketing artwork
- Failed font installs are no longer silent — single installs show an error dialog, INSTALL ALL aggregates one dialog per batch with details in the Console
- Palette roles without an assigned font are flagged (“NO FONT”) instead of silently falling back
- BeVietnamPro (and every multi-weight Fontshare family with italics) no longer ships wrong-glyphs-under-correct-filenames. Deterministic weight-suffix match replaces the old fuzzy token scorer
- Google Fonts license no longer mis-flags Apache/OFL fonts as UFL 1.0
- Fontsource license now correctly overrides the GF HTML-scrape result during cross-source dedup
FontComplianceIgnore and FontPaletteApplier now bind correctly after a stale-Library-cache edge case in Unity hosts
Deferred / Withdrawn
- Text Editor sub-tab (Tools): pulled from this release to ship polished in v1.2. The auditor's per-row EDIT buttons went with it — rows still open and ping the component for editing in the Inspector
- League of Moveable Type provider (shipped in
e2dbcd5, reverted in 0933e0b). Phase 2 of the provider roadmap (LoMT, Indestructible Type, Collletttivo, Velvetyne, OSP Foundry, Open Foundry) was cancelled after the scope rule tightened to API-only providers. Only Google Fonts, Fontshare, and Fontsource ship. Source for LoMT and an unshipped Indestructible implementation is preserved outside the repo for future reference
[1.0.0] — 2026-04-07
Added
- Palette Extractor tool tab: AI-assisted prompt to analyze selected text components and recommend palette roles, with importable JSON output and one-click Import JSON button
- Smart Role Recommendation: auto-analyze text vs palette and recommend closest role or suggest new ones
- Auditor Ignore System: mark text components to exclude from compliance checks
- Role Naming Guide in documentation
- Responsive editor layout: docks at any size, compact mode below 700px
- Scoreboard demo samples (tactical vs party themes) with pre-built palettes for first-time user experience
- FontOps Playground sample: guided FTUE scene with reusable RoleSection prefab
- FontPaletteApplier runtime component: per-property override toggles, custom inspector with live preview, comparison table, and Undo-supported apply
- Self-contained HTML documentation with CSS mockups of every UI panel
- Documentation buttons: sidebar footer DOCS button + Settings section 05
- UIDesignTokens.cs centralizing all inline style values
- Third Party Notices.md and EULA-compatible LICENSE.md (removed in 1.1.0 — an independent license conflicts with the Asset Store EULA)
Changed
- Package renamed from “Font Manager” to “FontOps” across all branding, menus, and documentation
- Package technical name changed to
dev.davgtz.fontops (Asset Store alignment)
- C# namespaces changed from
DGD.FontManager to dev.davgtz.fontops
- Menu path simplified to Tools → FontOps
- Dynamic package root resolution supports both Packages/ and Assets/ install paths (Asset Store compatible)
- Atlas Size and Generate Atlas settings now wired to TMP asset creation (default: 1024, Dynamic)
- Auditor asset groups start collapsed after scan
- All hardcoded inline styles replaced with design token references
- Documentation folder visible in Asset Store packages
Fixed
- TwoPaneSplitView crash when opening Text Editor tab
- Editor panel collapse button not working
- Generate Atlas and Atlas Size settings were stored but never used
- Tools tab UX improvements for palette extractor workflow
[0.3.0] — 2026-04-05
Added
- Font Scanner tool tab: full-project font asset discovery, source classification (Google/Package/Custom), duplicate detection with MD5 hashing, font organization, TMP asset creation
- Text Auditor tool tab: hierarchy-based view of all text components across scenes and prefabs, prefab instance detection with override tracking, compliance filter pills, inline EDIT/IGNORE/RESTORE actions
- Text Editor tool tab: dedicated editing view with font, style, size, spacing, color fields and palette role application
- Compliance auto-runs on scan when a palette is selected
- Scanner ignored fonts persistence via EditorPrefs
- UPM Samples: Scoreboard demo scenes (tactical vs party) with shared prefabs and pre-built palettes
Changed
- Tools tab redesigned from flat collapsibles to sub-tabbed layout (Font Scanner | Text Auditor | Text Editor)
- Removed Find & Replace tab (redundant with auditor + editor workflow)
[0.2.0] — 2026-04-01
Added
- “Architectural Utility” dark UI redesign with design token system
- Collapsible sidebar navigation with Unity built-in icons
- My Fonts tab with sub-tabs: font library + palette editor
- Palette system: inline role editing, type system preview, import/export, autosave, dirty tracking with snapshot restore
- Font variant palette role tags
- Paginated search with category pills and sort modes
- Expandable font cards with right inspector panel
[0.1.0] — 2026-03-25
Added
- Initial package structure and UPM manifest
- Font Palette system with typographic roles (Header, Subheader, Body, Caption, Button, Custom)
- Google Fonts integration with optional API key support
- Font Swapper for project-wide font find-and-replace
- Compliance Checker to audit text components against palette rules
- Editor window with Browse, Palette, Swap, Audit, and Settings tabs