@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 +15 -0
- package/dist/cdn.d.ts.map +1 -0
- package/dist/cdn.js +37 -0
- package/dist/cdn.js.map +1 -0
- package/dist/css.d.ts +10 -0
- package/dist/css.d.ts.map +1 -0
- package/dist/css.js +63 -0
- package/dist/css.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +38 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +74 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +52 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +21 -0
- package/src/cdn.d.ts +15 -0
- package/src/cdn.d.ts.map +1 -0
- package/src/cdn.js +37 -0
- package/src/cdn.js.map +1 -0
- package/src/cdn.ts +51 -0
- package/src/css.d.ts +10 -0
- package/src/css.d.ts.map +1 -0
- package/src/css.js +63 -0
- package/src/css.js.map +1 -0
- package/src/css.ts +79 -0
- package/src/index.d.ts +5 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +5 -0
- package/src/index.js.map +1 -0
- package/src/index.ts +4 -0
- package/src/registry.d.ts +38 -0
- package/src/registry.d.ts.map +1 -0
- package/src/registry.js +74 -0
- package/src/registry.js.map +1 -0
- package/src/registry.ts +86 -0
- package/src/types.d.ts +52 -0
- package/src/types.d.ts.map +1 -0
- package/src/types.js +2 -0
- package/src/types.js.map +1 -0
- package/src/types.ts +57 -0
- package/tsconfig.json +10 -0
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
|
package/dist/cdn.js.map
ADDED
|
@@ -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
|
package/dist/css.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.js","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/registry.js
ADDED
|
@@ -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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"}
|
package/dist/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":["../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 @@
|
|
|
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
|
package/src/cdn.d.ts.map
ADDED
|
@@ -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
|
package/src/css.d.ts.map
ADDED
|
@@ -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":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAc,EACd,OAAoB,EACpB,MAAc,EACd,UAA6B,EAAE;IAE/B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;IAC1C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3E,QAAQ,CAAC,IAAI,CAAC,QAAQ,GAAG,oBAAoB,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1E,QAAQ,CAAC,IAAI,CAAC,QAAQ,GAAG,mBAAmB,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACzE,QAAQ,CAAC,IAAI,CAAC,QAAQ,GAAG,uBAAuB,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACzE,QAAQ,CAAC,IAAI,CAAC,QAAQ,GAAG,uBAAuB,CAAC,CAAC;IACpD,CAAC;IAED,OAAO;kBACS,MAAM;gBACR,OAAO,CAAC,KAAK;iBACZ,OAAO,CAAC,MAAM;kBACb,OAAO;SAChB,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;EAClC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,IAAkB,EAClB,UAA6B,EAAE;IAE/B,MAAM,MAAM,GAAa;QACvB,sBAAsB,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,EAAE,MAAM;QACxD,eAAe,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO;KACxC,CAAC;IAEF,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC7B,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,OAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;QAClH,MAAM,CAAC,IAAI,CAAC;QACR,IAAI,CAAC,EAAE;kBACG,IAAI,CAAC,MAAM,MAAM,QAAQ;;;;WAIhC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,MAAM,MAAM,QAAQ;EAC/C,CAAC,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AACpC,CAAC"}
|
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 @@
|
|
|
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
package/src/index.js.map
ADDED
|
@@ -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,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"}
|
package/src/registry.js
ADDED
|
@@ -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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"}
|
package/src/registry.ts
ADDED
|
@@ -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
package/src/types.js.map
ADDED
|
@@ -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
|
+
}
|