Skip to content

Expand font choices and preview fonts in the dashboard selector #510

Closed

Description

@Anjiro81

Summary

The dashboard appearance settings should offer a substantially broader selection of custom fonts. Each font option in the selector should render using that font so users can preview the typeface directly, similar to a font picker in Microsoft Word.

Current Behavior

  • The dashboard provides a limited curated font list.
  • Font options in the dropdown do not preview their own typography, so users must select blindly.

Proposed Behavior

  • Expand the curated font catalog with additional fonts that are legally distributable and have recorded provenance/licensing.
  • Render each dropdown option using its corresponding font, while keeping the option name and accessible text clear.
  • Preserve the existing appearance-setting behavior for selecting and persisting a font.

Acceptance Criteria

  • The dashboard offers materially more custom-font choices than the current catalog.
  • Every font option previews its own typeface directly in the selector.
  • Added font assets include appropriate licensing/provenance information.
  • The selector remains keyboard accessible and clearly identifies each font by name.
  • Tests cover the font catalog and selector rendering behavior.

Technical Notes

Relevant areas include packages/dashboard/src/client appearance/font catalog and selector components, bundled font assets, provenance files, and dashboard UI tests. The implementation should keep asset size and loading behavior reasonable.

Activity

  1. m-aebrer commented on Sep 11, 2026

    @m-aebrer
    Collaborator

    Likely should include the option to upload a font file manually, for custom fonts.

  2. Anjiro81 commented on Oct 2, 2026

    @Anjiro81
    ContributorAuthor

    Issue Assessment

    Summary and confirmed scope

    Expand Dashboard's curated, legally distributable font catalog and let users see each typeface directly in the font picker, without changing browser-local selection/persistence.

    The manual-upload suggestion in this issue's discussion was explicitly clarified with the requester on 2026-10-02. Their selected scope was: “Catalog and preview picker only; handle uploads separately.” Browser-local and host-wide font uploads are therefore excluded from this change.

    Current state

    Inspected clean upstream master at e5a8b0a8f0b81f3c10cbba48927e661af6fe5c30:

    • packages/dashboard/src/client/state/appearance.ts defines seven picker entries: Theme default plus IBM Plex Mono, JetBrains Mono, Fira Code, Iosevka, OpenDyslexic, and Atkinson Hyperlegible. Stable IDs drive validation, localStorage, cross-tab synchronization, and data-font attributes.
    • src/client/components/theme-gallery.tsx renders a labelled native <select> with plain-text options. Theme cards preview the selected font, but picker options do not preview their own families.
    • src/client/styles/themes.css supplies local @font-face definitions and explicit font overrides. Five families use 17 bundled WOFF2 files totaling approximately 1.40 MB; IBM Plex Mono remains Google-hosted.
    • src/client/index.html restores persisted font IDs synchronously before stylesheet loading. Its inline allowlist must stay synchronized with the TypeScript catalog.
    • Assets already have SIL OFL licenses and provenance records, including pinned sources, processing details, and checksums for most families. packages/dashboard/package.json explicitly includes these legal records in published packages.
    • Unit, screen, and Chromium browser tests cover catalog identity, storage, bootstrap, applied typography, font loading, glyph fallback, and theme-card previews. Existing tests assume the seven-entry native selector.

    Gaps and implementation direction

    1. Broader catalog: add a meaningful selection of distinct, permissively licensed families. A reasonable planning target is roughly doubling the six explicit choices, with the exact set selected after source/license and payload checks. This is a proposed implementation target, not an additional acceptance criterion.
    2. Reliable per-option preview: styling native <option> elements alone does not reliably control OS-rendered menus across browsers. Prefer a focused accessible font-picker popup/listbox whose visible option labels render in their corresponding families. Preserve clear names, selected state, and Theme default behavior.
    3. Loading: keep the closed picker free of unrelated font requests. Opening the picker may load preview faces; heavyweight bold/italic variants should not all load merely to display regular-weight option labels. Existing lazy-loading assertions and documentation need to distinguish closed versus open picker behavior.
    4. Consistency: extend catalog types/validation, CSS mappings, the early bootstrap allowlist, and published license/provenance records together. Preserve existing IDs, storage keys, default removal, and cross-tab behavior.
    5. Tests/docs: exercise actual rendered previews and keyboard interaction, not just labels or CSS declarations. Update the root and package documentation describing the catalog and loading behavior.

    Ambiguities

    • The issue does not prescribe a font count or named new families; choose the final set during planning based on variety, licensing, supported faces, and payload.
    • No specific asset budget is stated. Record before/after sizes and test request behavior rather than introducing an arbitrary requirement.
    • Theme default is a behavior, not an independent typeface. Its picker preview should reflect the active theme's built-in typography without accidentally inheriting an explicit override.
    • Manual upload ambiguity is resolved as excluded for this change.

    Scope and complexity

    Medium-sized Dashboard client feature, localized mainly to appearance state, the font-picker component, styles, bootstrap, assets/package publishing metadata, tests, and documentation. No server API, RPC protocol, host-file upload, or new runtime dependency is expected.

    Explicitly out of scope / prior dispositions

    Risks and verification

    • A custom picker must retain accessible naming, focus management, arrow navigation, Home/End, typeahead, Enter/Space selection, Escape cancellation, outside dismissal, and ordinary Tab navigation. Touch/mobile layout must remain usable.
    • Per-option typography can be falsely “verified” while a fallback face is actually rendering. Real-browser tests should wait for intended font loading and inspect resolved families and request behavior.
    • Loading every bundled face on Settings mount would turn catalog expansion into a startup/network regression. Check closed-picker requests separately from open previews and active selection.
    • Modified/subset assets require accurate license handling, including Reserved Font Names where applicable. Preserve copyright/license files and ensure npm packaging includes them.
    • Keep catalog IDs, CSS family names, bootstrap literals, tests, and docs synchronized; an omitted bootstrap ID would cause a wrong-font first frame after reload.
    • New fonts may change line widths and glyph coverage; preserve fallback stacks and test representative controls/code/status glyphs rather than assuming every family is monospace.

    No code has been changed. Next step is a focused implementation plan and draft PR.


    Automated assessment by mach6

  3. Anjiro81 commented on Oct 2, 2026

    @Anjiro81
    ContributorAuthor

    Approved scope update — 2026-10-02

    The requester expanded the planned catalog: “15 each, so 30 total”, referring to serif and sans-serif Latin fonts, and then emphasized “don't remove the existing choices in the current dreb version. i want just to add options.”

    Implementation will therefore add 15 serif and 15 sans-serif families, preserving the current six explicit choices and Theme default unchanged: 36 explicit font choices plus Theme default. The expanded plan is maintained on #540.

    The requester accepted keeping this change Latin-focused. Dedicated Korean/Chinese/Indian-script font bundles are excluded; existing browser/system fallback for multilingual text remains intact. Manual font-file upload remains separate as previously confirmed.


    Progress tracked by mach6

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Nice to haveenhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions