@shoroborno/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cdn.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import type { FontMetadata, GetFontUrlOptions } from './types.js';
2
+ export declare const DEFAULT_CDN_BASE = "https://cdn.jsdelivr.net/gh/Taraldinn/soroborno-cdn@main/public/fonts";
3
+ /**
4
+ * Resolves a full CDN URL for a font file
5
+ */
6
+ export declare function resolveCdnUrl(fontId: string, fileName: string, customCdn?: string): string;
7
+ /**
8
+ * Generates the full CDN URL for a specific font weight, style, and format
9
+ */
10
+ export declare function getFontUrl(font: FontMetadata, options?: GetFontUrlOptions): string;
11
+ /**
12
+ * Returns the CDN URL for the prebuilt CSS stylesheet of a font
13
+ */
14
+ export declare function getFontStylesheetUrl(fontId: string, customCdn?: string): string;
15
+ //# sourceMappingURL=cdn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdn.d.ts","sourceRoot":"","sources":["../src/cdn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAElE,eAAO,MAAM,gBAAgB,0EAA0E,CAAC;AAExG;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAG1F;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CAyBR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/E"}
package/dist/cdn.js ADDED
@@ -0,0 +1,37 @@
1
+ export const DEFAULT_CDN_BASE = 'https://cdn.jsdelivr.net/gh/Taraldinn/soroborno-cdn@main/public/fonts';
2
+ /**
3
+ * Resolves a full CDN URL for a font file
4
+ */
5
+ export function resolveCdnUrl(fontId, fileName, customCdn) {
6
+ const base = (customCdn || DEFAULT_CDN_BASE).replace(/\/$/, '');
7
+ return `${base}/${fontId}/${fileName}`;
8
+ }
9
+ /**
10
+ * Generates the full CDN URL for a specific font weight, style, and format
11
+ */
12
+ export function getFontUrl(font, options = {}) {
13
+ const targetWeight = options.weight || 400;
14
+ const targetStyle = options.style || 'normal';
15
+ const targetFormat = options.format || 'woff2';
16
+ // Find exact variant or closest variant
17
+ let variant = font.variants.find(v => v.weight === targetWeight && v.style === targetStyle);
18
+ if (!variant) {
19
+ variant = font.variants.find(v => v.weight === targetWeight) || font.variants[0];
20
+ }
21
+ if (!variant) {
22
+ throw new Error(`No font variants found for font '${font.id}'`);
23
+ }
24
+ let fileName = variant.files[targetFormat];
25
+ if (!fileName) {
26
+ // Fall back to woff2 -> ttf -> otf
27
+ fileName = variant.files.woff2 || variant.files.ttf || variant.files.otf || variant.originalFileName;
28
+ }
29
+ return resolveCdnUrl(font.id, fileName, options.cdnBaseUrl);
30
+ }
31
+ /**
32
+ * Returns the CDN URL for the prebuilt CSS stylesheet of a font
33
+ */
34
+ export function getFontStylesheetUrl(fontId, customCdn) {
35
+ return resolveCdnUrl(fontId, 'font.css', customCdn);
36
+ }
37
+ //# sourceMappingURL=cdn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdn.js","sourceRoot":"","sources":["../src/cdn.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAG,uEAAuE,CAAC;AAExG;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,QAAgB,EAAE,SAAkB;IAChF,MAAM,IAAI,GAAG,CAAC,SAAS,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAChE,OAAO,GAAG,IAAI,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,IAAkB,EAClB,UAA6B,EAAE;IAE/B,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC;IAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC;IAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC;IAE/C,wCAAwC;IACxC,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,IAAI,CAAC,CAAC,KAAK,KAAK,WAAW,CAC1D,CAAC;IAEF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,mCAAmC;QACnC,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC;IACvG,CAAC;IAED,OAAO,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,SAAkB;IACrE,OAAO,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AACtD,CAAC"}
package/dist/css.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import type { FontMetadata, GetFontCssOptions, FontVariant } from './types.js';
2
+ /**
3
+ * Generates an @font-face CSS rule for a specific variant
4
+ */
5
+ export declare function generateVariantCss(family: string, variant: FontVariant, fontId: string, options?: GetFontCssOptions): string;
6
+ /**
7
+ * Generates complete CSS declarations for a font
8
+ */
9
+ export declare function getFontCss(font: FontMetadata, options?: GetFontCssOptions): string;
10
+ //# sourceMappingURL=css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG/E;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CA4BR;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CA+BR"}
package/dist/css.js ADDED
@@ -0,0 +1,63 @@
1
+ import { resolveCdnUrl } from './cdn.js';
2
+ /**
3
+ * Generates an @font-face CSS rule for a specific variant
4
+ */
5
+ export function generateVariantCss(family, variant, fontId, options = {}) {
6
+ const display = options.display || 'swap';
7
+ const srcParts = [];
8
+ if (variant.files.woff2) {
9
+ const url = resolveCdnUrl(fontId, variant.files.woff2, options.cdnBaseUrl);
10
+ srcParts.push(`url('${url}') format('woff2')`);
11
+ }
12
+ if (variant.files.woff) {
13
+ const url = resolveCdnUrl(fontId, variant.files.woff, options.cdnBaseUrl);
14
+ srcParts.push(`url('${url}') format('woff')`);
15
+ }
16
+ if (variant.files.ttf) {
17
+ const url = resolveCdnUrl(fontId, variant.files.ttf, options.cdnBaseUrl);
18
+ srcParts.push(`url('${url}') format('truetype')`);
19
+ }
20
+ if (variant.files.otf) {
21
+ const url = resolveCdnUrl(fontId, variant.files.otf, options.cdnBaseUrl);
22
+ srcParts.push(`url('${url}') format('opentype')`);
23
+ }
24
+ return `@font-face {
25
+ font-family: '${family}';
26
+ font-style: ${variant.style};
27
+ font-weight: ${variant.weight};
28
+ font-display: ${display};
29
+ src: ${srcParts.join(',\n ')};
30
+ }`;
31
+ }
32
+ /**
33
+ * Generates complete CSS declarations for a font
34
+ */
35
+ export function getFontCss(font, options = {}) {
36
+ const chunks = [
37
+ `/* Soroborno Font: ${font.displayName} (${font.id}) */`,
38
+ `/* License: ${font.license.name} */\n`
39
+ ];
40
+ let variants = font.variants;
41
+ if (options.weights && options.weights.length > 0) {
42
+ variants = variants.filter(v => options.weights.map(Number).includes(v.weight));
43
+ }
44
+ if (options.styles && options.styles.length > 0) {
45
+ variants = variants.filter(v => options.styles.includes(v.style));
46
+ }
47
+ for (const variant of variants) {
48
+ chunks.push(generateVariantCss(font.family, variant, font.id, options));
49
+ }
50
+ if (options.includeUtilityClass) {
51
+ const fallback = font.category === 'serif' ? 'serif' : font.category === 'monospace' ? 'monospace' : 'sans-serif';
52
+ chunks.push(`
53
+ .font-${font.id} {
54
+ font-family: '${font.family}', ${fallback};
55
+ }
56
+
57
+ :root {
58
+ --font-${font.id}: '${font.family}', ${fallback};
59
+ }`);
60
+ }
61
+ return chunks.join('\n\n') + '\n';
62
+ }
63
+ //# sourceMappingURL=css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.js","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from './types.js';
2
+ export * from './cdn.js';
3
+ export * from './css.js';
4
+ export * from './registry.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export * from './types.js';
2
+ export * from './cdn.js';
3
+ export * from './css.js';
4
+ export * from './registry.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { FontMetadata } from './types.js';
2
+ declare class FontRegistry {
3
+ private fontsMap;
4
+ private aliasMap;
5
+ /**
6
+ * Registers a list of fonts into the registry
7
+ */
8
+ registerAll(fonts: FontMetadata[]): void;
9
+ /**
10
+ * Registers a single font into the registry
11
+ */
12
+ register(font: FontMetadata): void;
13
+ /**
14
+ * Looks up a font by its id or alias
15
+ */
16
+ get(idOrAlias: string): FontMetadata | undefined;
17
+ /**
18
+ * Lists all registered fonts with optional filters
19
+ */
20
+ list(filter?: {
21
+ category?: string;
22
+ weight?: number;
23
+ hasStyle?: string;
24
+ }): FontMetadata[];
25
+ /**
26
+ * Returns the count of registered fonts
27
+ */
28
+ size(): number;
29
+ }
30
+ export declare const globalRegistry: FontRegistry;
31
+ export declare function getFont(id: string): FontMetadata | undefined;
32
+ export declare function listFonts(filter?: {
33
+ category?: string;
34
+ weight?: number;
35
+ }): FontMetadata[];
36
+ export declare function getFontFamily(id: string): string | undefined;
37
+ export {};
38
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,cAAM,YAAY;IAChB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,QAAQ,CAA6B;IAE7C;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI;IAMxC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IASlC;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAgBhD;;OAEG;IACH,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,EAAE;IAgBxF;;OAEG;IACH,IAAI,IAAI,MAAM;CAGf;AAED,eAAO,MAAM,cAAc,cAAqB,CAAC;AAEjD,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE5D;AAED,wBAAgB,SAAS,CAAC,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,EAAE,CAEzF;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE5D"}
@@ -0,0 +1,74 @@
1
+ class FontRegistry {
2
+ fontsMap = new Map();
3
+ aliasMap = new Map();
4
+ /**
5
+ * Registers a list of fonts into the registry
6
+ */
7
+ registerAll(fonts) {
8
+ for (const font of fonts) {
9
+ this.register(font);
10
+ }
11
+ }
12
+ /**
13
+ * Registers a single font into the registry
14
+ */
15
+ register(font) {
16
+ this.fontsMap.set(font.id, font);
17
+ if (font.aliases) {
18
+ for (const alias of font.aliases) {
19
+ this.aliasMap.set(alias.toLowerCase(), font.id);
20
+ }
21
+ }
22
+ }
23
+ /**
24
+ * Looks up a font by its id or alias
25
+ */
26
+ get(idOrAlias) {
27
+ if (!idOrAlias)
28
+ return undefined;
29
+ const direct = this.fontsMap.get(idOrAlias);
30
+ if (direct)
31
+ return direct;
32
+ const lower = idOrAlias.toLowerCase();
33
+ const resolvedId = this.aliasMap.get(lower);
34
+ if (resolvedId) {
35
+ return this.fontsMap.get(resolvedId);
36
+ }
37
+ // Try finding by normalized id
38
+ const normalized = lower.replace(/[\s_]+/g, '-');
39
+ return this.fontsMap.get(normalized);
40
+ }
41
+ /**
42
+ * Lists all registered fonts with optional filters
43
+ */
44
+ list(filter) {
45
+ let result = Array.from(this.fontsMap.values());
46
+ if (filter?.category) {
47
+ result = result.filter(f => f.category === filter.category);
48
+ }
49
+ if (filter?.weight) {
50
+ result = result.filter(f => f.weights.includes(filter.weight));
51
+ }
52
+ if (filter?.hasStyle) {
53
+ result = result.filter(f => f.styles.includes(filter.hasStyle));
54
+ }
55
+ return result;
56
+ }
57
+ /**
58
+ * Returns the count of registered fonts
59
+ */
60
+ size() {
61
+ return this.fontsMap.size;
62
+ }
63
+ }
64
+ export const globalRegistry = new FontRegistry();
65
+ export function getFont(id) {
66
+ return globalRegistry.get(id);
67
+ }
68
+ export function listFonts(filter) {
69
+ return globalRegistry.list(filter);
70
+ }
71
+ export function getFontFamily(id) {
72
+ return globalRegistry.get(id)?.family;
73
+ }
74
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ export type FontWeight = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;
2
+ export type FontStyle = 'normal' | 'italic' | 'oblique';
3
+ export type FontFormat = 'woff2' | 'woff' | 'ttf' | 'otf';
4
+ export type FontCategory = 'bangla' | 'sans-serif' | 'serif' | 'display' | 'handwriting' | 'monospace';
5
+ export interface LicenseInfo {
6
+ name: string;
7
+ url?: string;
8
+ text?: string;
9
+ }
10
+ export interface FontVariantFiles {
11
+ ttf?: string;
12
+ otf?: string;
13
+ woff?: string;
14
+ woff2?: string;
15
+ }
16
+ export interface FontVariant {
17
+ weight: FontWeight;
18
+ style: FontStyle;
19
+ files: FontVariantFiles;
20
+ originalFileName: string;
21
+ }
22
+ export interface FontMetadata {
23
+ id: string;
24
+ family: string;
25
+ displayName: string;
26
+ description: string;
27
+ category: FontCategory;
28
+ designer: string;
29
+ designerUrl?: string;
30
+ version: string;
31
+ license: LicenseInfo;
32
+ subsets: string[];
33
+ weights: FontWeight[];
34
+ styles: FontStyle[];
35
+ variants: FontVariant[];
36
+ aliases?: string[];
37
+ popularity?: number;
38
+ }
39
+ export interface GetFontUrlOptions {
40
+ weight?: FontWeight | number;
41
+ style?: FontStyle;
42
+ format?: FontFormat;
43
+ cdnBaseUrl?: string;
44
+ }
45
+ export interface GetFontCssOptions {
46
+ weights?: (FontWeight | number)[];
47
+ styles?: FontStyle[];
48
+ display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';
49
+ cdnBaseUrl?: string;
50
+ includeUtilityClass?: boolean;
51
+ }
52
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAC7E,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AACxD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;AAEvG,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,gBAAgB,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;IAClC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "@shoroborno/core",
3
+ "version": "0.1.0",
4
+ "description": "Framework-independent core font lookup, URL resolver, and CSS utilities for Soroborno",
5
+ "main": "./dist/index.cjs",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "require": "./dist/index.cjs",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "build": "tsc"
17
+ },
18
+ "keywords": ["bangla", "fonts", "typography", "bengali", "soroborno"],
19
+ "author": "Taraldinn",
20
+ "license": "MIT"
21
+ }
package/src/cdn.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import type { FontMetadata, GetFontUrlOptions } from './types.js';
2
+ export declare const DEFAULT_CDN_BASE = "https://cdn.jsdelivr.net/gh/Taraldinn/soroborno-cdn@main/public/fonts";
3
+ /**
4
+ * Resolves a full CDN URL for a font file
5
+ */
6
+ export declare function resolveCdnUrl(fontId: string, fileName: string, customCdn?: string): string;
7
+ /**
8
+ * Generates the full CDN URL for a specific font weight, style, and format
9
+ */
10
+ export declare function getFontUrl(font: FontMetadata, options?: GetFontUrlOptions): string;
11
+ /**
12
+ * Returns the CDN URL for the prebuilt CSS stylesheet of a font
13
+ */
14
+ export declare function getFontStylesheetUrl(fontId: string, customCdn?: string): string;
15
+ //# sourceMappingURL=cdn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdn.d.ts","sourceRoot":"","sources":["cdn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAElE,eAAO,MAAM,gBAAgB,0EAA0E,CAAC;AAExG;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAG1F;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CAyBR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/E"}
package/src/cdn.js ADDED
@@ -0,0 +1,37 @@
1
+ export const DEFAULT_CDN_BASE = 'https://cdn.jsdelivr.net/gh/Taraldinn/soroborno-cdn@main/public/fonts';
2
+ /**
3
+ * Resolves a full CDN URL for a font file
4
+ */
5
+ export function resolveCdnUrl(fontId, fileName, customCdn) {
6
+ const base = (customCdn || DEFAULT_CDN_BASE).replace(/\/$/, '');
7
+ return `${base}/${fontId}/${fileName}`;
8
+ }
9
+ /**
10
+ * Generates the full CDN URL for a specific font weight, style, and format
11
+ */
12
+ export function getFontUrl(font, options = {}) {
13
+ const targetWeight = options.weight || 400;
14
+ const targetStyle = options.style || 'normal';
15
+ const targetFormat = options.format || 'woff2';
16
+ // Find exact variant or closest variant
17
+ let variant = font.variants.find(v => v.weight === targetWeight && v.style === targetStyle);
18
+ if (!variant) {
19
+ variant = font.variants.find(v => v.weight === targetWeight) || font.variants[0];
20
+ }
21
+ if (!variant) {
22
+ throw new Error(`No font variants found for font '${font.id}'`);
23
+ }
24
+ let fileName = variant.files[targetFormat];
25
+ if (!fileName) {
26
+ // Fall back to woff2 -> ttf -> otf
27
+ fileName = variant.files.woff2 || variant.files.ttf || variant.files.otf || variant.originalFileName;
28
+ }
29
+ return resolveCdnUrl(font.id, fileName, options.cdnBaseUrl);
30
+ }
31
+ /**
32
+ * Returns the CDN URL for the prebuilt CSS stylesheet of a font
33
+ */
34
+ export function getFontStylesheetUrl(fontId, customCdn) {
35
+ return resolveCdnUrl(fontId, 'font.css', customCdn);
36
+ }
37
+ //# sourceMappingURL=cdn.js.map
package/src/cdn.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdn.js","sourceRoot":"","sources":["cdn.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAG,uEAAuE,CAAC;AAExG;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,QAAgB,EAAE,SAAkB;IAChF,MAAM,IAAI,GAAG,CAAC,SAAS,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAChE,OAAO,GAAG,IAAI,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,IAAkB,EAClB,UAA6B,EAAE;IAE/B,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC;IAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC;IAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC;IAE/C,wCAAwC;IACxC,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,IAAI,CAAC,CAAC,KAAK,KAAK,WAAW,CAC1D,CAAC;IAEF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,mCAAmC;QACnC,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC;IACvG,CAAC;IAED,OAAO,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,SAAkB;IACrE,OAAO,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AACtD,CAAC"}
package/src/cdn.ts ADDED
@@ -0,0 +1,51 @@
1
+ import type { FontMetadata, GetFontUrlOptions } from './types.js';
2
+
3
+ export const DEFAULT_CDN_BASE = 'https://cdn.jsdelivr.net/gh/Taraldinn/soroborno-cdn@main/public/fonts';
4
+
5
+ /**
6
+ * Resolves a full CDN URL for a font file
7
+ */
8
+ export function resolveCdnUrl(fontId: string, fileName: string, customCdn?: string): string {
9
+ const base = (customCdn || DEFAULT_CDN_BASE).replace(/\/$/, '');
10
+ return `${base}/${fontId}/${fileName}`;
11
+ }
12
+
13
+ /**
14
+ * Generates the full CDN URL for a specific font weight, style, and format
15
+ */
16
+ export function getFontUrl(
17
+ font: FontMetadata,
18
+ options: GetFontUrlOptions = {}
19
+ ): string {
20
+ const targetWeight = options.weight || 400;
21
+ const targetStyle = options.style || 'normal';
22
+ const targetFormat = options.format || 'woff2';
23
+
24
+ // Find exact variant or closest variant
25
+ let variant = font.variants.find(
26
+ v => v.weight === targetWeight && v.style === targetStyle
27
+ );
28
+
29
+ if (!variant) {
30
+ variant = font.variants.find(v => v.weight === targetWeight) || font.variants[0];
31
+ }
32
+
33
+ if (!variant) {
34
+ throw new Error(`No font variants found for font '${font.id}'`);
35
+ }
36
+
37
+ let fileName = variant.files[targetFormat];
38
+ if (!fileName) {
39
+ // Fall back to woff2 -> ttf -> otf
40
+ fileName = variant.files.woff2 || variant.files.ttf || variant.files.otf || variant.originalFileName;
41
+ }
42
+
43
+ return resolveCdnUrl(font.id, fileName, options.cdnBaseUrl);
44
+ }
45
+
46
+ /**
47
+ * Returns the CDN URL for the prebuilt CSS stylesheet of a font
48
+ */
49
+ export function getFontStylesheetUrl(fontId: string, customCdn?: string): string {
50
+ return resolveCdnUrl(fontId, 'font.css', customCdn);
51
+ }
package/src/css.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import type { FontMetadata, GetFontCssOptions, FontVariant } from './types.js';
2
+ /**
3
+ * Generates an @font-face CSS rule for a specific variant
4
+ */
5
+ export declare function generateVariantCss(family: string, variant: FontVariant, fontId: string, options?: GetFontCssOptions): string;
6
+ /**
7
+ * Generates complete CSS declarations for a font
8
+ */
9
+ export declare function getFontCss(font: FontMetadata, options?: GetFontCssOptions): string;
10
+ //# sourceMappingURL=css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.d.ts","sourceRoot":"","sources":["css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG/E;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CA4BR;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CA+BR"}
package/src/css.js ADDED
@@ -0,0 +1,63 @@
1
+ import { resolveCdnUrl } from './cdn.js';
2
+ /**
3
+ * Generates an @font-face CSS rule for a specific variant
4
+ */
5
+ export function generateVariantCss(family, variant, fontId, options = {}) {
6
+ const display = options.display || 'swap';
7
+ const srcParts = [];
8
+ if (variant.files.woff2) {
9
+ const url = resolveCdnUrl(fontId, variant.files.woff2, options.cdnBaseUrl);
10
+ srcParts.push(`url('${url}') format('woff2')`);
11
+ }
12
+ if (variant.files.woff) {
13
+ const url = resolveCdnUrl(fontId, variant.files.woff, options.cdnBaseUrl);
14
+ srcParts.push(`url('${url}') format('woff')`);
15
+ }
16
+ if (variant.files.ttf) {
17
+ const url = resolveCdnUrl(fontId, variant.files.ttf, options.cdnBaseUrl);
18
+ srcParts.push(`url('${url}') format('truetype')`);
19
+ }
20
+ if (variant.files.otf) {
21
+ const url = resolveCdnUrl(fontId, variant.files.otf, options.cdnBaseUrl);
22
+ srcParts.push(`url('${url}') format('opentype')`);
23
+ }
24
+ return `@font-face {
25
+ font-family: '${family}';
26
+ font-style: ${variant.style};
27
+ font-weight: ${variant.weight};
28
+ font-display: ${display};
29
+ src: ${srcParts.join(',\n ')};
30
+ }`;
31
+ }
32
+ /**
33
+ * Generates complete CSS declarations for a font
34
+ */
35
+ export function getFontCss(font, options = {}) {
36
+ const chunks = [
37
+ `/* Soroborno Font: ${font.displayName} (${font.id}) */`,
38
+ `/* License: ${font.license.name} */\n`
39
+ ];
40
+ let variants = font.variants;
41
+ if (options.weights && options.weights.length > 0) {
42
+ variants = variants.filter(v => options.weights.map(Number).includes(v.weight));
43
+ }
44
+ if (options.styles && options.styles.length > 0) {
45
+ variants = variants.filter(v => options.styles.includes(v.style));
46
+ }
47
+ for (const variant of variants) {
48
+ chunks.push(generateVariantCss(font.family, variant, font.id, options));
49
+ }
50
+ if (options.includeUtilityClass) {
51
+ const fallback = font.category === 'serif' ? 'serif' : font.category === 'monospace' ? 'monospace' : 'sans-serif';
52
+ chunks.push(`
53
+ .font-${font.id} {
54
+ font-family: '${font.family}', ${fallback};
55
+ }
56
+
57
+ :root {
58
+ --font-${font.id}: '${font.family}', ${fallback};
59
+ }`);
60
+ }
61
+ return chunks.join('\n\n') + '\n';
62
+ }
63
+ //# sourceMappingURL=css.js.map
package/src/css.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.js","sourceRoot":"","sources":["css.ts"],"names":[],"mappings":"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"}
package/src/css.ts ADDED
@@ -0,0 +1,79 @@
1
+ import type { FontMetadata, GetFontCssOptions, FontVariant } from './types.js';
2
+ import { resolveCdnUrl } from './cdn.js';
3
+
4
+ /**
5
+ * Generates an @font-face CSS rule for a specific variant
6
+ */
7
+ export function generateVariantCss(
8
+ family: string,
9
+ variant: FontVariant,
10
+ fontId: string,
11
+ options: GetFontCssOptions = {}
12
+ ): string {
13
+ const display = options.display || 'swap';
14
+ const srcParts: string[] = [];
15
+
16
+ if (variant.files.woff2) {
17
+ const url = resolveCdnUrl(fontId, variant.files.woff2, options.cdnBaseUrl);
18
+ srcParts.push(`url('${url}') format('woff2')`);
19
+ }
20
+ if (variant.files.woff) {
21
+ const url = resolveCdnUrl(fontId, variant.files.woff, options.cdnBaseUrl);
22
+ srcParts.push(`url('${url}') format('woff')`);
23
+ }
24
+ if (variant.files.ttf) {
25
+ const url = resolveCdnUrl(fontId, variant.files.ttf, options.cdnBaseUrl);
26
+ srcParts.push(`url('${url}') format('truetype')`);
27
+ }
28
+ if (variant.files.otf) {
29
+ const url = resolveCdnUrl(fontId, variant.files.otf, options.cdnBaseUrl);
30
+ srcParts.push(`url('${url}') format('opentype')`);
31
+ }
32
+
33
+ return `@font-face {
34
+ font-family: '${family}';
35
+ font-style: ${variant.style};
36
+ font-weight: ${variant.weight};
37
+ font-display: ${display};
38
+ src: ${srcParts.join(',\n ')};
39
+ }`;
40
+ }
41
+
42
+ /**
43
+ * Generates complete CSS declarations for a font
44
+ */
45
+ export function getFontCss(
46
+ font: FontMetadata,
47
+ options: GetFontCssOptions = {}
48
+ ): string {
49
+ const chunks: string[] = [
50
+ `/* Soroborno Font: ${font.displayName} (${font.id}) */`,
51
+ `/* License: ${font.license.name} */\n`
52
+ ];
53
+
54
+ let variants = font.variants;
55
+ if (options.weights && options.weights.length > 0) {
56
+ variants = variants.filter(v => options.weights!.map(Number).includes(v.weight));
57
+ }
58
+ if (options.styles && options.styles.length > 0) {
59
+ variants = variants.filter(v => options.styles!.includes(v.style));
60
+ }
61
+
62
+ for (const variant of variants) {
63
+ chunks.push(generateVariantCss(font.family, variant, font.id, options));
64
+ }
65
+
66
+ if (options.includeUtilityClass) {
67
+ const fallback = font.category === 'serif' ? 'serif' : font.category === 'monospace' ? 'monospace' : 'sans-serif';
68
+ chunks.push(`
69
+ .font-${font.id} {
70
+ font-family: '${font.family}', ${fallback};
71
+ }
72
+
73
+ :root {
74
+ --font-${font.id}: '${font.family}', ${fallback};
75
+ }`);
76
+ }
77
+
78
+ return chunks.join('\n\n') + '\n';
79
+ }
package/src/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from './types.js';
2
+ export * from './cdn.js';
3
+ export * from './css.js';
4
+ export * from './registry.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
package/src/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export * from './types.js';
2
+ export * from './cdn.js';
3
+ export * from './css.js';
4
+ export * from './registry.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
package/src/index.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from './types.js';
2
+ export * from './cdn.js';
3
+ export * from './css.js';
4
+ export * from './registry.js';
@@ -0,0 +1,38 @@
1
+ import type { FontMetadata } from './types.js';
2
+ declare class FontRegistry {
3
+ private fontsMap;
4
+ private aliasMap;
5
+ /**
6
+ * Registers a list of fonts into the registry
7
+ */
8
+ registerAll(fonts: FontMetadata[]): void;
9
+ /**
10
+ * Registers a single font into the registry
11
+ */
12
+ register(font: FontMetadata): void;
13
+ /**
14
+ * Looks up a font by its id or alias
15
+ */
16
+ get(idOrAlias: string): FontMetadata | undefined;
17
+ /**
18
+ * Lists all registered fonts with optional filters
19
+ */
20
+ list(filter?: {
21
+ category?: string;
22
+ weight?: number;
23
+ hasStyle?: string;
24
+ }): FontMetadata[];
25
+ /**
26
+ * Returns the count of registered fonts
27
+ */
28
+ size(): number;
29
+ }
30
+ export declare const globalRegistry: FontRegistry;
31
+ export declare function getFont(id: string): FontMetadata | undefined;
32
+ export declare function listFonts(filter?: {
33
+ category?: string;
34
+ weight?: number;
35
+ }): FontMetadata[];
36
+ export declare function getFontFamily(id: string): string | undefined;
37
+ export {};
38
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,cAAM,YAAY;IAChB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,QAAQ,CAA6B;IAE7C;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI;IAMxC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IASlC;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAgBhD;;OAEG;IACH,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,EAAE;IAgBxF;;OAEG;IACH,IAAI,IAAI,MAAM;CAGf;AAED,eAAO,MAAM,cAAc,cAAqB,CAAC;AAEjD,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE5D;AAED,wBAAgB,SAAS,CAAC,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,EAAE,CAEzF;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE5D"}
@@ -0,0 +1,74 @@
1
+ class FontRegistry {
2
+ fontsMap = new Map();
3
+ aliasMap = new Map();
4
+ /**
5
+ * Registers a list of fonts into the registry
6
+ */
7
+ registerAll(fonts) {
8
+ for (const font of fonts) {
9
+ this.register(font);
10
+ }
11
+ }
12
+ /**
13
+ * Registers a single font into the registry
14
+ */
15
+ register(font) {
16
+ this.fontsMap.set(font.id, font);
17
+ if (font.aliases) {
18
+ for (const alias of font.aliases) {
19
+ this.aliasMap.set(alias.toLowerCase(), font.id);
20
+ }
21
+ }
22
+ }
23
+ /**
24
+ * Looks up a font by its id or alias
25
+ */
26
+ get(idOrAlias) {
27
+ if (!idOrAlias)
28
+ return undefined;
29
+ const direct = this.fontsMap.get(idOrAlias);
30
+ if (direct)
31
+ return direct;
32
+ const lower = idOrAlias.toLowerCase();
33
+ const resolvedId = this.aliasMap.get(lower);
34
+ if (resolvedId) {
35
+ return this.fontsMap.get(resolvedId);
36
+ }
37
+ // Try finding by normalized id
38
+ const normalized = lower.replace(/[\s_]+/g, '-');
39
+ return this.fontsMap.get(normalized);
40
+ }
41
+ /**
42
+ * Lists all registered fonts with optional filters
43
+ */
44
+ list(filter) {
45
+ let result = Array.from(this.fontsMap.values());
46
+ if (filter?.category) {
47
+ result = result.filter(f => f.category === filter.category);
48
+ }
49
+ if (filter?.weight) {
50
+ result = result.filter(f => f.weights.includes(filter.weight));
51
+ }
52
+ if (filter?.hasStyle) {
53
+ result = result.filter(f => f.styles.includes(filter.hasStyle));
54
+ }
55
+ return result;
56
+ }
57
+ /**
58
+ * Returns the count of registered fonts
59
+ */
60
+ size() {
61
+ return this.fontsMap.size;
62
+ }
63
+ }
64
+ export const globalRegistry = new FontRegistry();
65
+ export function getFont(id) {
66
+ return globalRegistry.get(id);
67
+ }
68
+ export function listFonts(filter) {
69
+ return globalRegistry.list(filter);
70
+ }
71
+ export function getFontFamily(id) {
72
+ return globalRegistry.get(id)?.family;
73
+ }
74
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import type { FontMetadata } from './types.js';
2
+
3
+ class FontRegistry {
4
+ private fontsMap = new Map<string, FontMetadata>();
5
+ private aliasMap = new Map<string, string>();
6
+
7
+ /**
8
+ * Registers a list of fonts into the registry
9
+ */
10
+ registerAll(fonts: FontMetadata[]): void {
11
+ for (const font of fonts) {
12
+ this.register(font);
13
+ }
14
+ }
15
+
16
+ /**
17
+ * Registers a single font into the registry
18
+ */
19
+ register(font: FontMetadata): void {
20
+ this.fontsMap.set(font.id, font);
21
+ if (font.aliases) {
22
+ for (const alias of font.aliases) {
23
+ this.aliasMap.set(alias.toLowerCase(), font.id);
24
+ }
25
+ }
26
+ }
27
+
28
+ /**
29
+ * Looks up a font by its id or alias
30
+ */
31
+ get(idOrAlias: string): FontMetadata | undefined {
32
+ if (!idOrAlias) return undefined;
33
+ const direct = this.fontsMap.get(idOrAlias);
34
+ if (direct) return direct;
35
+
36
+ const lower = idOrAlias.toLowerCase();
37
+ const resolvedId = this.aliasMap.get(lower);
38
+ if (resolvedId) {
39
+ return this.fontsMap.get(resolvedId);
40
+ }
41
+
42
+ // Try finding by normalized id
43
+ const normalized = lower.replace(/[\s_]+/g, '-');
44
+ return this.fontsMap.get(normalized);
45
+ }
46
+
47
+ /**
48
+ * Lists all registered fonts with optional filters
49
+ */
50
+ list(filter?: { category?: string; weight?: number; hasStyle?: string }): FontMetadata[] {
51
+ let result = Array.from(this.fontsMap.values());
52
+
53
+ if (filter?.category) {
54
+ result = result.filter(f => f.category === filter.category);
55
+ }
56
+ if (filter?.weight) {
57
+ result = result.filter(f => f.weights.includes(filter.weight as any));
58
+ }
59
+ if (filter?.hasStyle) {
60
+ result = result.filter(f => f.styles.includes(filter.hasStyle as any));
61
+ }
62
+
63
+ return result;
64
+ }
65
+
66
+ /**
67
+ * Returns the count of registered fonts
68
+ */
69
+ size(): number {
70
+ return this.fontsMap.size;
71
+ }
72
+ }
73
+
74
+ export const globalRegistry = new FontRegistry();
75
+
76
+ export function getFont(id: string): FontMetadata | undefined {
77
+ return globalRegistry.get(id);
78
+ }
79
+
80
+ export function listFonts(filter?: { category?: string; weight?: number }): FontMetadata[] {
81
+ return globalRegistry.list(filter);
82
+ }
83
+
84
+ export function getFontFamily(id: string): string | undefined {
85
+ return globalRegistry.get(id)?.family;
86
+ }
package/src/types.d.ts ADDED
@@ -0,0 +1,52 @@
1
+ export type FontWeight = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;
2
+ export type FontStyle = 'normal' | 'italic' | 'oblique';
3
+ export type FontFormat = 'woff2' | 'woff' | 'ttf' | 'otf';
4
+ export type FontCategory = 'bangla' | 'sans-serif' | 'serif' | 'display' | 'handwriting' | 'monospace';
5
+ export interface LicenseInfo {
6
+ name: string;
7
+ url?: string;
8
+ text?: string;
9
+ }
10
+ export interface FontVariantFiles {
11
+ ttf?: string;
12
+ otf?: string;
13
+ woff?: string;
14
+ woff2?: string;
15
+ }
16
+ export interface FontVariant {
17
+ weight: FontWeight;
18
+ style: FontStyle;
19
+ files: FontVariantFiles;
20
+ originalFileName: string;
21
+ }
22
+ export interface FontMetadata {
23
+ id: string;
24
+ family: string;
25
+ displayName: string;
26
+ description: string;
27
+ category: FontCategory;
28
+ designer: string;
29
+ designerUrl?: string;
30
+ version: string;
31
+ license: LicenseInfo;
32
+ subsets: string[];
33
+ weights: FontWeight[];
34
+ styles: FontStyle[];
35
+ variants: FontVariant[];
36
+ aliases?: string[];
37
+ popularity?: number;
38
+ }
39
+ export interface GetFontUrlOptions {
40
+ weight?: FontWeight | number;
41
+ style?: FontStyle;
42
+ format?: FontFormat;
43
+ cdnBaseUrl?: string;
44
+ }
45
+ export interface GetFontCssOptions {
46
+ weights?: (FontWeight | number)[];
47
+ styles?: FontStyle[];
48
+ display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';
49
+ cdnBaseUrl?: string;
50
+ includeUtilityClass?: boolean;
51
+ }
52
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAC7E,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AACxD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;AAEvG,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,gBAAgB,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;IAClC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B"}
package/src/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":""}
package/src/types.ts ADDED
@@ -0,0 +1,57 @@
1
+ export type FontWeight = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;
2
+ export type FontStyle = 'normal' | 'italic' | 'oblique';
3
+ export type FontFormat = 'woff2' | 'woff' | 'ttf' | 'otf';
4
+ export type FontCategory = 'bangla' | 'sans-serif' | 'serif' | 'display' | 'handwriting' | 'monospace';
5
+
6
+ export interface LicenseInfo {
7
+ name: string;
8
+ url?: string;
9
+ text?: string;
10
+ }
11
+
12
+ export interface FontVariantFiles {
13
+ ttf?: string;
14
+ otf?: string;
15
+ woff?: string;
16
+ woff2?: string;
17
+ }
18
+
19
+ export interface FontVariant {
20
+ weight: FontWeight;
21
+ style: FontStyle;
22
+ files: FontVariantFiles;
23
+ originalFileName: string;
24
+ }
25
+
26
+ export interface FontMetadata {
27
+ id: string;
28
+ family: string;
29
+ displayName: string;
30
+ description: string;
31
+ category: FontCategory;
32
+ designer: string;
33
+ designerUrl?: string;
34
+ version: string;
35
+ license: LicenseInfo;
36
+ subsets: string[];
37
+ weights: FontWeight[];
38
+ styles: FontStyle[];
39
+ variants: FontVariant[];
40
+ aliases?: string[];
41
+ popularity?: number;
42
+ }
43
+
44
+ export interface GetFontUrlOptions {
45
+ weight?: FontWeight | number;
46
+ style?: FontStyle;
47
+ format?: FontFormat;
48
+ cdnBaseUrl?: string;
49
+ }
50
+
51
+ export interface GetFontCssOptions {
52
+ weights?: (FontWeight | number)[];
53
+ styles?: FontStyle[];
54
+ display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';
55
+ cdnBaseUrl?: string;
56
+ includeUtilityClass?: boolean;
57
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src",
6
+ "module": "ESNext",
7
+ "moduleResolution": "Bundler"
8
+ },
9
+ "include": ["src/**/*"]
10
+ }