@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.
Files changed (82) hide show
  1. package/README.md +102 -0
  2. package/dist/builder.d.ts +75 -0
  3. package/dist/builder.d.ts.map +1 -0
  4. package/dist/builder.js +243 -0
  5. package/dist/cache.d.ts +32 -0
  6. package/dist/cache.d.ts.map +1 -0
  7. package/dist/cache.js +71 -0
  8. package/dist/css.d.ts +83 -0
  9. package/dist/css.d.ts.map +1 -0
  10. package/dist/css.js +1 -0
  11. package/dist/font-registry.d.ts +34 -0
  12. package/dist/font-registry.d.ts.map +1 -0
  13. package/dist/font-registry.js +59 -0
  14. package/dist/fonts/inter/inter-300.ttf +0 -0
  15. package/dist/fonts/inter/inter-400.ttf +0 -0
  16. package/dist/fonts/inter/inter-500.ttf +0 -0
  17. package/dist/fonts/inter/inter-600.ttf +0 -0
  18. package/dist/fonts/inter/inter-700.ttf +0 -0
  19. package/dist/fonts.d.ts +29 -0
  20. package/dist/fonts.d.ts.map +1 -0
  21. package/dist/fonts.js +90 -0
  22. package/dist/index.d.ts +18 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +19 -0
  25. package/dist/ogx.d.ts +16 -0
  26. package/dist/ogx.d.ts.map +1 -0
  27. package/dist/ogx.js +104 -0
  28. package/dist/presets/blog.d.ts +31 -0
  29. package/dist/presets/blog.d.ts.map +1 -0
  30. package/dist/presets/blog.js +98 -0
  31. package/dist/presets/docs.d.ts +23 -0
  32. package/dist/presets/docs.d.ts.map +1 -0
  33. package/dist/presets/docs.js +87 -0
  34. package/dist/presets/index.d.ts +20 -0
  35. package/dist/presets/index.d.ts.map +1 -0
  36. package/dist/presets/index.js +11 -0
  37. package/dist/presets/minimal.d.ts +20 -0
  38. package/dist/presets/minimal.d.ts.map +1 -0
  39. package/dist/presets/minimal.js +53 -0
  40. package/dist/presets/social.d.ts +29 -0
  41. package/dist/presets/social.d.ts.map +1 -0
  42. package/dist/presets/social.js +66 -0
  43. package/dist/render-png.d.ts +7 -0
  44. package/dist/render-png.d.ts.map +1 -0
  45. package/dist/render-png.js +19 -0
  46. package/dist/render-svg.d.ts +7 -0
  47. package/dist/render-svg.d.ts.map +1 -0
  48. package/dist/render-svg.js +123 -0
  49. package/dist/render.d.ts +10 -0
  50. package/dist/render.d.ts.map +1 -0
  51. package/dist/render.js +180 -0
  52. package/dist/tailwind/colors.d.ts +6 -0
  53. package/dist/tailwind/colors.d.ts.map +1 -0
  54. package/dist/tailwind/colors.js +281 -0
  55. package/dist/tailwind/index.d.ts +2 -0
  56. package/dist/tailwind/index.d.ts.map +1 -0
  57. package/dist/tailwind/index.js +1 -0
  58. package/dist/tailwind/parser.d.ts +15 -0
  59. package/dist/tailwind/parser.d.ts.map +1 -0
  60. package/dist/tailwind/parser.js +1037 -0
  61. package/dist/tailwind/scales.d.ts +26 -0
  62. package/dist/tailwind/scales.d.ts.map +1 -0
  63. package/dist/tailwind/scales.js +126 -0
  64. package/dist/tailwind/test-parser.d.ts +2 -0
  65. package/dist/tailwind/test-parser.d.ts.map +1 -0
  66. package/dist/tailwind/test-parser.js +10 -0
  67. package/dist/targets.d.ts +67 -0
  68. package/dist/targets.d.ts.map +1 -0
  69. package/dist/targets.js +25 -0
  70. package/dist/types.d.ts +173 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +10 -0
  73. package/dist/utils/assets.d.ts +11 -0
  74. package/dist/utils/assets.d.ts.map +1 -0
  75. package/dist/utils/assets.js +35 -0
  76. package/dist/utils/color.d.ts +14 -0
  77. package/dist/utils/color.d.ts.map +1 -0
  78. package/dist/utils/color.js +68 -0
  79. package/dist/utils/text.d.ts +14 -0
  80. package/dist/utils/text.d.ts.map +1 -0
  81. package/dist/utils/text.js +50 -0
  82. 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
+ }