09869aed00709a9315132ba5f57efe36e2f20950
DisplayFont was not a feature (FSD+ A-6): the whole slice was one presentational component that renders a Font styled by typography, with no model/domain/action. To get typography it reached sideways into a sibling feature (`$features/AdjustTypography/model`) — a feature->feature edge (C-1), the symptom of the mislayering, not the disease. Fix by inversion, mirroring the existing `status` prop pattern: - move FontSampler into entities/Font/ui (it now uses only entity siblings + $shared/ui) - it accepts a `typography` prop typed to a minimal contract defined in the component; the AdjustTypography store satisfies it structurally, so the entity has no dependency on the feature - SampleList (owns both) injects its typographySettingsStore as the prop - delete the DisplayFont slice; export FontSampler from the Font barrel; relocate the story (now passes a mock typography) Resolves A-6, A-7, and the FontSampler half of C-1. Verified: 0 type errors, 0 lint (boundary rule satisfied), 905 unit + 213 component tests, production build OK.
chore(dprint): update markup_fmt plugin version, fix @render indentation and add couple of new rules
GlyphDiff
A modern font exploration and comparison tool for browsing fonts from Google Fonts and Fontshare with real-time visual comparisons, advanced filtering, and customizable typography.
Features
- Multi-Provider Catalog: Browse fonts from Google Fonts and Fontshare in one place
- Side-by-Side Comparison: Compare up to 4 fonts simultaneously with customizable text, size, and typography settings
- Advanced Filtering: Filter by category, provider, character subsets, and weight
- Virtual Scrolling: Fast, smooth browsing of thousands of fonts
- Responsive UI: Beautiful interface built with Tailwind CSS
- Type-Safe: Full TypeScript coverage with strict mode enabled
Tech Stack
- Framework: Svelte 5 with reactive primitives (runes)
- Styling: Tailwind CSS v4
- Components: Bits UI primitives
- State Management: TanStack Query for async data
- Architecture: Feature-Sliced Design (FSD)
- Quality: oxlint (linting), dprint (formatting), lefthook (git hooks)
Project Structure
src/
├── app/ # App shell, layout, providers
├── widgets/ # Composed UI blocks (ComparisonSlider, SampleList, FontSearch)
├── features/ # Business features (filters, search, display)
├── entities/ # Domain models and stores (Font, Breadcrumb)
├── shared/ # Reusable utilities, UI components, helpers
└── routes/ # Page-level components
Quick Start
# Install dependencies
yarn install
# Start development server
yarn dev
# Build for production
yarn build
# Preview production build
yarn preview
Available Scripts
| Command | Description |
|---|---|
yarn dev |
Start development server |
yarn build |
Build for production |
yarn preview |
Preview production build |
yarn check |
Run Svelte type checking |
yarn lint |
Run oxlint |
yarn format |
Format code with dprint |
yarn test:unit |
Run unit tests |
yarn test:unit:ui |
Run Vitest UI |
yarn storybook |
Start Storybook dev server |
Code Style
- Path Aliases: Use
$app/,$shared/,$features/,$entities/,$widgets/,$routes/ - Components: PascalCase (e.g.,
ComparisonSlider.svelte) - Formatting: 100 char line width, 4-space indent, single quotes
- Type Safety: Strict TypeScript with JSDoc comments for public APIs
Architecture Notes
This project follows the Feature-Sliced Design (FSD) methodology for clean separation of concerns. The application uses Svelte 5's new runes system ($state, $derived, $effect) for reactive state management.
License
MIT
Description
A modern font exploration and comparison tool for browsing fonts from different sources with real-time visual comparisons
https://glyphdiff.com
Languages
TypeScript
73.2%
Svelte
24.9%
CSS
1.7%