refactor/code-splitting #31

Merged
ilia merged 32 commits from refactor/code-splitting into main 2026-04-08 06:34:20 +00:00
6 changed files with 44 additions and 37 deletions
Showing only changes of commit b602b5022b - Show all commits

View File

@@ -8,6 +8,8 @@ export type {
FontFeatures,
FontFiles,
FontItem,
FontLoadRequestConfig,
FontLoadStatus,
FontMetadata,
FontProvider,
// Fontshare API types
@@ -37,7 +39,6 @@ export type {
export {
appliedFontsManager,
createUnifiedFontStore,
type FontConfigRequest,
type UnifiedFontStore,
unifiedFontStore,
} from './store';

View File

@@ -1,36 +1,13 @@
import { SvelteMap } from 'svelte/reactivity';
import type {
FontLoadRequestConfig,
FontLoadStatus,
} from '../../types';
import {
getEffectiveConcurrency,
yieldToMainThread,
} from './utils';
/** Loading state of a font. Failed loads may be retried up to MAX_RETRIES. */
export type FontStatus = 'loading' | 'loaded' | 'error';
/** Configuration for a font load request. */
export interface FontConfigRequest {
/**
* Unique identifier for the font (e.g., "lato", "roboto").
*/
id: string;
/**
* Actual font family name recognized by the browser (e.g., "Lato", "Roboto").
*/
name: string;
/**
* URL pointing to the font file (typically .ttf or .woff2).
*/
url: string;
/**
* Numeric weight (100-900). Variable fonts load once per ID regardless of weight.
*/
weight: number;
/**
* Variable fonts load once per ID; static fonts load per weight.
*/
isVariable?: boolean;
}
/**
* Manages web font loading with caching, adaptive concurrency, and automatic cleanup.
*
@@ -62,7 +39,7 @@ export class AppliedFontsManager {
#usageTracker = new Map<string, number>();
// Fonts queued for loading by `touch()`, processed by `#processQueue()`
#queue = new Map<string, FontConfigRequest>();
#queue = new Map<string, FontLoadRequestConfig>();
// Handle for scheduled queue processing (requestIdleCallback or setTimeout)
#timeoutId: ReturnType<typeof setTimeout> | null = null;
@@ -94,7 +71,7 @@ export class AppliedFontsManager {
readonly #CACHE_NAME = 'font-cache-v1'; // Versioned for future invalidation
// Reactive status map for Svelte components to track font states
statuses = new SvelteMap<string, FontStatus>();
statuses = new SvelteMap<string, FontLoadStatus>();
// Starts periodic cleanup timer (browser-only).
constructor() {
@@ -114,7 +91,7 @@ export class AppliedFontsManager {
* Retry behavior: 'loaded' and 'loading' fonts are skipped; 'error' fonts retry if count < MAX_RETRIES.
* Scheduling: Prefers requestIdleCallback (150ms timeout), falls back to setTimeout(16ms).
*/
touch(configs: FontConfigRequest[]) {
touch(configs: FontLoadRequestConfig[]) {
if (this.#abortController.signal.aborted) return;
const now = Date.now();

View File

@@ -14,7 +14,4 @@ export {
} from './unifiedFontStore.svelte';
// Applied fonts manager (CSS loading - unchanged)
export {
appliedFontsManager,
type FontConfigRequest,
} from './appliedFontsStore/appliedFontsStore.svelte';
export { appliedFontsManager } from './appliedFontsStore/appliedFontsStore.svelte';

View File

@@ -56,3 +56,5 @@ export type {
FontCollectionSort,
FontCollectionState,
} from './store';
export * from './store/appliedFonts';

View File

@@ -0,0 +1,30 @@
/**
* Configuration for a font load request.
*/
export interface FontLoadRequestConfig {
/**
* Unique identifier for the font (e.g., "lato", "roboto").
*/
id: string;
/**
* Actual font family name recognized by the browser (e.g., "Lato", "Roboto").
*/
name: string;
/**
* URL pointing to the font file (typically .ttf or .woff2).
*/
url: string;
/**
* Numeric weight (100-900). Variable fonts load once per ID regardless of weight.
*/
weight: number;
/**
* Variable fonts load once per ID; static fonts load per weight.
*/
isVariable?: boolean;
}
/**
* Loading state of a font.
*/
export type FontLoadStatus = 'loading' | 'loaded' | 'error';

View File

@@ -15,7 +15,7 @@ import type {
import { fade } from 'svelte/transition';
import { getFontUrl } from '../../lib';
import {
type FontConfigRequest,
type FontLoadRequestConfig,
type UnifiedFont,
appliedFontsManager,
unifiedFontStore,
@@ -54,7 +54,7 @@ const isLoading = $derived(
);
function handleInternalVisibleChange(visibleItems: UnifiedFont[]) {
const configs: FontConfigRequest[] = [];
const configs: FontLoadRequestConfig[] = [];
visibleItems.forEach(item => {
const url = getFontUrl(item, weight);