@ogxjs/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/README.md +102 -0
- package/dist/builder.d.ts +75 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +243 -0
- package/dist/cache.d.ts +32 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +71 -0
- package/dist/css.d.ts +83 -0
- package/dist/css.d.ts.map +1 -0
- package/dist/css.js +1 -0
- package/dist/font-registry.d.ts +34 -0
- package/dist/font-registry.d.ts.map +1 -0
- package/dist/font-registry.js +59 -0
- package/dist/fonts/inter/inter-300.ttf +0 -0
- package/dist/fonts/inter/inter-400.ttf +0 -0
- package/dist/fonts/inter/inter-500.ttf +0 -0
- package/dist/fonts/inter/inter-600.ttf +0 -0
- package/dist/fonts/inter/inter-700.ttf +0 -0
- package/dist/fonts.d.ts +29 -0
- package/dist/fonts.d.ts.map +1 -0
- package/dist/fonts.js +90 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/ogx.d.ts +16 -0
- package/dist/ogx.d.ts.map +1 -0
- package/dist/ogx.js +104 -0
- package/dist/presets/blog.d.ts +31 -0
- package/dist/presets/blog.d.ts.map +1 -0
- package/dist/presets/blog.js +98 -0
- package/dist/presets/docs.d.ts +23 -0
- package/dist/presets/docs.d.ts.map +1 -0
- package/dist/presets/docs.js +87 -0
- package/dist/presets/index.d.ts +20 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +11 -0
- package/dist/presets/minimal.d.ts +20 -0
- package/dist/presets/minimal.d.ts.map +1 -0
- package/dist/presets/minimal.js +53 -0
- package/dist/presets/social.d.ts +29 -0
- package/dist/presets/social.d.ts.map +1 -0
- package/dist/presets/social.js +66 -0
- package/dist/render-png.d.ts +7 -0
- package/dist/render-png.d.ts.map +1 -0
- package/dist/render-png.js +19 -0
- package/dist/render-svg.d.ts +7 -0
- package/dist/render-svg.d.ts.map +1 -0
- package/dist/render-svg.js +123 -0
- package/dist/render.d.ts +10 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +180 -0
- package/dist/tailwind/colors.d.ts +6 -0
- package/dist/tailwind/colors.d.ts.map +1 -0
- package/dist/tailwind/colors.js +281 -0
- package/dist/tailwind/index.d.ts +2 -0
- package/dist/tailwind/index.d.ts.map +1 -0
- package/dist/tailwind/index.js +1 -0
- package/dist/tailwind/parser.d.ts +15 -0
- package/dist/tailwind/parser.d.ts.map +1 -0
- package/dist/tailwind/parser.js +1037 -0
- package/dist/tailwind/scales.d.ts +26 -0
- package/dist/tailwind/scales.d.ts.map +1 -0
- package/dist/tailwind/scales.js +126 -0
- package/dist/tailwind/test-parser.d.ts +2 -0
- package/dist/tailwind/test-parser.d.ts.map +1 -0
- package/dist/tailwind/test-parser.js +10 -0
- package/dist/targets.d.ts +67 -0
- package/dist/targets.d.ts.map +1 -0
- package/dist/targets.js +25 -0
- package/dist/types.d.ts +173 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/utils/assets.d.ts +11 -0
- package/dist/utils/assets.d.ts.map +1 -0
- package/dist/utils/assets.js +35 -0
- package/dist/utils/color.d.ts +14 -0
- package/dist/utils/color.d.ts.map +1 -0
- package/dist/utils/color.js +68 -0
- package/dist/utils/text.d.ts +14 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +50 -0
- package/package.json +71 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import satori from "satori";
|
|
2
|
+
/**
|
|
3
|
+
* Estimate the best font size to fit text within a container
|
|
4
|
+
* Uses binary search with Satori's layout engine for accuracy
|
|
5
|
+
*/
|
|
6
|
+
export async function calculateFittingFontSize(text, options) {
|
|
7
|
+
const { maxWidth, maxHeight = Infinity, minFontSize = 12, maxFontSize = 200, fonts, } = options;
|
|
8
|
+
let low = minFontSize;
|
|
9
|
+
let high = maxFontSize;
|
|
10
|
+
let optimal = minFontSize;
|
|
11
|
+
// We need a simple element to measure
|
|
12
|
+
const getLayout = async (fontSize) => {
|
|
13
|
+
const svg = await satori({
|
|
14
|
+
type: "div",
|
|
15
|
+
props: {
|
|
16
|
+
style: {
|
|
17
|
+
display: "flex",
|
|
18
|
+
fontSize: `${fontSize}px`,
|
|
19
|
+
},
|
|
20
|
+
children: text,
|
|
21
|
+
},
|
|
22
|
+
}, {
|
|
23
|
+
width: maxWidth * 2,
|
|
24
|
+
fonts: fonts.map((f) => ({
|
|
25
|
+
name: f.name,
|
|
26
|
+
data: f.data,
|
|
27
|
+
weight: f.weight,
|
|
28
|
+
style: f.style,
|
|
29
|
+
})),
|
|
30
|
+
});
|
|
31
|
+
const widthMatch = svg.match(/width="([\d.]+)"/);
|
|
32
|
+
const heightMatch = svg.match(/height="([\d.]+)"/);
|
|
33
|
+
return {
|
|
34
|
+
width: widthMatch?.[1] ? parseFloat(widthMatch[1]) : 0,
|
|
35
|
+
height: heightMatch?.[1] ? parseFloat(heightMatch[1]) : 0,
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
while (low <= high) {
|
|
39
|
+
const mid = Math.floor((low + high) / 2);
|
|
40
|
+
const layout = await getLayout(mid);
|
|
41
|
+
if (layout.width <= maxWidth && layout.height <= maxHeight) {
|
|
42
|
+
optimal = mid;
|
|
43
|
+
low = mid + 1;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
high = mid - 1;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return optimal;
|
|
50
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ogxjs/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "High-performance Open Graph image generator with Tailwind CSS support",
|
|
5
|
+
"author": "Carlos Eduardo",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/carlosedujs/ogx.git",
|
|
9
|
+
"directory": "packages/core"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://ogx.dev",
|
|
12
|
+
"bugs": "https://github.com/carlosedujs/ogx/issues",
|
|
13
|
+
"type": "module",
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./svg": {
|
|
22
|
+
"types": "./dist/render-svg.d.ts",
|
|
23
|
+
"import": "./dist/render-svg.js"
|
|
24
|
+
},
|
|
25
|
+
"./png": {
|
|
26
|
+
"types": "./dist/render-png.d.ts",
|
|
27
|
+
"import": "./dist/render-png.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist"
|
|
32
|
+
],
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@resvg/resvg-js": "^2.6.2",
|
|
35
|
+
"satori": "^0.12.1"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/bun": "^1.2.4",
|
|
39
|
+
"@types/node": "^20.19.27",
|
|
40
|
+
"@vercel/og": "^0.8.6",
|
|
41
|
+
"@vitest/ui": "^4.0.16",
|
|
42
|
+
"bun-types": "^1.3.5",
|
|
43
|
+
"tsx": "^4.21.0",
|
|
44
|
+
"vitest": "^4.0.16"
|
|
45
|
+
},
|
|
46
|
+
"peerDependencies": {
|
|
47
|
+
"typescript": ">=5.0.0"
|
|
48
|
+
},
|
|
49
|
+
"keywords": [
|
|
50
|
+
"og-image",
|
|
51
|
+
"opengraph",
|
|
52
|
+
"satori",
|
|
53
|
+
"tailwind",
|
|
54
|
+
"social-image"
|
|
55
|
+
],
|
|
56
|
+
"license": "MIT",
|
|
57
|
+
"publishConfig": {
|
|
58
|
+
"access": "public"
|
|
59
|
+
},
|
|
60
|
+
"scripts": {
|
|
61
|
+
"build": "tsc && mkdir -p dist/fonts/inter && cp src/fonts/inter/*.ttf dist/fonts/inter/",
|
|
62
|
+
"dev": "tsc --watch",
|
|
63
|
+
"check-types": "tsc --noEmit",
|
|
64
|
+
"test": "vitest run",
|
|
65
|
+
"test:watch": "vitest",
|
|
66
|
+
"test:ui": "vitest --ui",
|
|
67
|
+
"test:integration": "node src/__tests__/integration/integration.test.ts",
|
|
68
|
+
"test:pure": "node src/__tests__/pure/engine.test.ts",
|
|
69
|
+
"bench": "tsx src/__tests__/benchmarks/comprehensive-bench.ts"
|
|
70
|
+
}
|
|
71
|
+
}
|