@unmade/text-renderer 1.0.0 → 1.1.1

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 (67) hide show
  1. package/dist/__vite-browser-external-CijFC1_R.js +7 -0
  2. package/dist/baselines/index.d.ts +40 -0
  3. package/dist/ce-adapter/index.cjs +1 -1
  4. package/dist/ce-adapter/index.js +154 -152
  5. package/dist/chunk-3b4jIN3o.js +13 -0
  6. package/dist/constants.d.ts +5 -0
  7. package/dist/glyph/svg-glyph-converter.d.ts +42 -0
  8. package/dist/helpers/bbox.d.ts +33 -0
  9. package/dist/helpers/matrix.d.ts +8 -0
  10. package/dist/helpers/point.d.ts +17 -0
  11. package/dist/helpers/xml.d.ts +1 -0
  12. package/dist/index.d.ts +16 -249
  13. package/dist/index.js +1543 -1954
  14. package/dist/loading/createLoadedFont.d.ts +53 -0
  15. package/dist/loading/index.d.ts +4 -0
  16. package/dist/measuring/conversion.d.ts +2 -0
  17. package/dist/measuring/index.d.ts +28 -0
  18. package/dist/node/baselines/index.d.ts +40 -0
  19. package/dist/node/ce-adapter/ce-types.d.ts +171 -0
  20. package/dist/node/ce-adapter/extractTextPlacements.d.ts +11 -0
  21. package/dist/node/ce-adapter/index.d.ts +12 -0
  22. package/dist/node/ce-adapter/mapStateToRendererOptions.d.ts +13 -0
  23. package/dist/node/ce-adapter/types.d.ts +56 -0
  24. package/dist/node/constants.d.ts +5 -0
  25. package/dist/node/glyph/svg-glyph-converter.d.ts +42 -0
  26. package/dist/node/helpers/bbox.d.ts +33 -0
  27. package/dist/node/helpers/matrix.d.ts +8 -0
  28. package/dist/node/helpers/point.d.ts +17 -0
  29. package/dist/node/helpers/xml.d.ts +1 -0
  30. package/dist/node/index.d.ts +16 -249
  31. package/dist/node/index.js +821 -895
  32. package/dist/node/loading/createLoadedFont.d.ts +53 -0
  33. package/dist/node/loading/index.d.ts +4 -0
  34. package/dist/node/measuring/conversion.d.ts +2 -0
  35. package/dist/node/measuring/index.d.ts +28 -0
  36. package/dist/node/renderText.d.ts +5 -0
  37. package/dist/node/rendering/index.d.ts +42 -0
  38. package/dist/node/svg/index.d.ts +11 -0
  39. package/dist/node/types.d.ts +72 -0
  40. package/dist/renderText.d.ts +5 -0
  41. package/dist/rendering/index.d.ts +42 -0
  42. package/dist/svg/index.d.ts +11 -0
  43. package/dist/types.d.ts +72 -0
  44. package/dist/worker/baselines/index.d.ts +40 -0
  45. package/dist/worker/ce-adapter/ce-types.d.ts +171 -0
  46. package/dist/worker/ce-adapter/extractTextPlacements.d.ts +11 -0
  47. package/dist/worker/ce-adapter/index.d.ts +12 -0
  48. package/dist/worker/ce-adapter/mapStateToRendererOptions.d.ts +13 -0
  49. package/dist/worker/ce-adapter/types.d.ts +56 -0
  50. package/dist/worker/constants.d.ts +5 -0
  51. package/dist/worker/glyph/svg-glyph-converter.d.ts +42 -0
  52. package/dist/worker/helpers/bbox.d.ts +33 -0
  53. package/dist/worker/helpers/matrix.d.ts +8 -0
  54. package/dist/worker/helpers/point.d.ts +17 -0
  55. package/dist/worker/helpers/xml.d.ts +1 -0
  56. package/dist/worker/index.d.ts +16 -249
  57. package/dist/worker/index.js +8003 -9677
  58. package/dist/worker/loading/createLoadedFont.d.ts +53 -0
  59. package/dist/worker/loading/index.d.ts +4 -0
  60. package/dist/worker/measuring/conversion.d.ts +2 -0
  61. package/dist/worker/measuring/index.d.ts +28 -0
  62. package/dist/worker/renderText.d.ts +5 -0
  63. package/dist/worker/rendering/index.d.ts +42 -0
  64. package/dist/worker/svg/index.d.ts +11 -0
  65. package/dist/worker/types.d.ts +72 -0
  66. package/package.json +11 -10
  67. package/dist/__vite-browser-external-l0sNRNKZ.js +0 -1
@@ -0,0 +1,53 @@
1
+ import { Face, Font } from 'harfbuzzjs';
2
+ export interface SVGGlyphData {
3
+ svg: string;
4
+ viewbox: string;
5
+ }
6
+ export interface LoadedFont {
7
+ unitsPerEm: number;
8
+ names: {
9
+ fontFamily: string;
10
+ };
11
+ svgGlyphs?: Map<number, SVGGlyphData>;
12
+ charToGlyph(char: string): {
13
+ index: number;
14
+ advanceWidth: number;
15
+ name: string;
16
+ getBoundingBox(): {
17
+ x1: number;
18
+ y1: number;
19
+ x2: number;
20
+ y2: number;
21
+ };
22
+ };
23
+ getPath(text: string, x: number, y: number, fontSize: number, options?: {
24
+ drawSVG?: boolean;
25
+ }): {
26
+ getBoundingBox(): {
27
+ x1: number;
28
+ y1: number;
29
+ x2: number;
30
+ y2: number;
31
+ };
32
+ toPathData(decimals?: number): string;
33
+ };
34
+ getPaths(text: string, x: number, y: number, fontSize: number, options?: {
35
+ drawSVG?: boolean;
36
+ }): Array<{
37
+ getBoundingBox(): {
38
+ x1: number;
39
+ y1: number;
40
+ x2: number;
41
+ y2: number;
42
+ };
43
+ toPathData(decimals?: number): string;
44
+ }>;
45
+ }
46
+ export declare function boundsFromPath(pathData: string): {
47
+ x1: number;
48
+ y1: number;
49
+ x2: number;
50
+ y2: number;
51
+ } | null;
52
+ export declare function transformPath(pathData: string, scaleX: number, scaleY: number, dx: number): string;
53
+ export declare function createLoadedFont(face: Face, font: Font, familyName: string, svgGlyphs?: Map<number, SVGGlyphData>): LoadedFont;
@@ -0,0 +1,4 @@
1
+ import { createLoadedFont, LoadedFont } from './createLoadedFont';
2
+ export { createLoadedFont, type LoadedFont };
3
+ export declare const getFontCache: () => Map<string, LoadedFont>;
4
+ export declare const loadFont: (fontUrl: string, fetchSVGGlyphs?: boolean) => Promise<LoadedFont>;
@@ -0,0 +1,2 @@
1
+ export declare function millimetersToInches(value: number): number;
2
+ export declare function inchesToMillimeters(value: number): number;
@@ -0,0 +1,28 @@
1
+ import { LoadedFont } from '../loading';
2
+ import { BoxDimensions, PhysicalSize, TextSpacing } from '../types';
3
+ export interface GetFontSizeFromPhysicalSizeOptions {
4
+ font: LoadedFont;
5
+ boxDimensions: BoxDimensions;
6
+ physicalSize: PhysicalSize;
7
+ spacing?: TextSpacing;
8
+ }
9
+ export interface GetTextMetricsAtFontSizeOptions {
10
+ font: LoadedFont;
11
+ text: string;
12
+ fontSize: number;
13
+ spacing?: TextSpacing;
14
+ }
15
+ /**
16
+ * This is the character we use to calculate font sizes
17
+ * when fixed physical text height is set for a placement.
18
+ *
19
+ * The 'I' character is used because of its flat top and bottom.
20
+ * https://en.wikipedia.org/wiki/Cap_height
21
+ */
22
+ export declare const getStandardCharacter: (font: LoadedFont) => string;
23
+ export declare const getFontSizeFromPhysicalSize: ({ font, boxDimensions, physicalSize, spacing, }: GetFontSizeFromPhysicalSizeOptions) => number;
24
+ export declare const getTextMetricsAtFontSize: ({ font, text, fontSize, spacing, }: GetTextMetricsAtFontSizeOptions) => {
25
+ width: number;
26
+ height: number;
27
+ baseline: number;
28
+ };
@@ -0,0 +1,5 @@
1
+ import { RenderTextOptions } from './types';
2
+ /**
3
+ * Synchronous text renderer. Requires a pre-loaded font.
4
+ */
5
+ export declare const renderText: (options: RenderTextOptions) => string;
@@ -0,0 +1,42 @@
1
+ import { LoadedFont } from '../loading';
2
+ import { ColourMap, GlyphFill, HorizontalTextAlignmentValues, TextSpacing } from '../types';
3
+ export interface SvgGlyphEntry {
4
+ content: string;
5
+ viewBox: string;
6
+ x: number;
7
+ y: number;
8
+ width: number;
9
+ height: number;
10
+ glyphIndex: number;
11
+ }
12
+ export interface PathEntry {
13
+ attributes: {
14
+ d: string;
15
+ 'data-character': string;
16
+ transform: string;
17
+ };
18
+ path: unknown;
19
+ matrix: DOMMatrix;
20
+ glyphData: {
21
+ index: number;
22
+ bbox: {
23
+ x1: number;
24
+ y1: number;
25
+ x2: number;
26
+ y2: number;
27
+ };
28
+ };
29
+ svgGlyph?: SvgGlyphEntry;
30
+ fills?: GlyphFill[];
31
+ }
32
+ export declare const fontUnitsToPixels: (value: number, fontSize: number, unitsPerEm: number) => number;
33
+ export interface GetTextAsPathDataOptions {
34
+ font: LoadedFont;
35
+ baselinePath: string;
36
+ text: string;
37
+ fontSize: number;
38
+ spacing?: TextSpacing;
39
+ horizontalAlignment?: HorizontalTextAlignmentValues;
40
+ colourMap?: ColourMap;
41
+ }
42
+ export declare const getTextAsPathData: ({ font, baselinePath, text, fontSize, spacing, horizontalAlignment, colourMap, }: GetTextAsPathDataOptions) => PathEntry[];
@@ -0,0 +1,11 @@
1
+ import { PathEntry } from '../rendering';
2
+ import { BoxDimensions, ColourInfo, TextSpacing } from '../types';
3
+ export interface AssembleSvgOptions {
4
+ boxDimensions: BoxDimensions;
5
+ paths: PathEntry[];
6
+ spacing?: TextSpacing;
7
+ fontSize?: number;
8
+ fillColour?: ColourInfo;
9
+ strokeColour?: ColourInfo;
10
+ }
11
+ export declare const assembleSvg: ({ boxDimensions, paths, spacing, fontSize, fillColour, strokeColour, }: AssembleSvgOptions) => string;
@@ -0,0 +1,72 @@
1
+ import { LoadedFont } from './loading';
2
+ export type MeasurementUnits = 'mm' | 'in';
3
+ export type BoxDimensions = {
4
+ width: number;
5
+ height: number;
6
+ physicalWidth: number;
7
+ physicalHeight: number;
8
+ physicalUnits: MeasurementUnits;
9
+ };
10
+ export type VerticalTextAlignmentValues = 'centre' | 'top' | 'bottom';
11
+ export type HorizontalTextAlignmentValues = 'left' | 'centre' | 'right' | 'distributed';
12
+ export type PhysicalSize = [height: number, units: MeasurementUnits];
13
+ export type BaselineType = 'flat' | 'curved';
14
+ export type BaselineConfig = {
15
+ type: 'flat';
16
+ } | {
17
+ type: 'curved';
18
+ } | {
19
+ type: 'custom';
20
+ path: string;
21
+ };
22
+ export interface ColourInfo {
23
+ readonly hex: string;
24
+ readonly reference?: string;
25
+ }
26
+ export interface GlyphFill {
27
+ readonly pathData: string;
28
+ readonly colour: ColourInfo;
29
+ }
30
+ /** Maps original hex colour → replacement ColourInfo. */
31
+ export type ColourMap = Readonly<Record<string, ColourInfo>>;
32
+ export interface TextSpacing {
33
+ readonly outlineWidth: number;
34
+ readonly letterSpacing: number;
35
+ readonly letterSpacingOutline: number;
36
+ }
37
+ /** Options for synchronous renderText (font already loaded). */
38
+ export interface RenderTextOptions {
39
+ text: string;
40
+ font: LoadedFont;
41
+ physicalSize: PhysicalSize;
42
+ /** When provided, bypasses the physicalSize → font size calculation. */
43
+ fontSize?: number;
44
+ boxDimensions: BoxDimensions;
45
+ spacing?: TextSpacing;
46
+ verticalAlignment?: VerticalTextAlignmentValues;
47
+ baseline?: BaselineType | BaselineConfig;
48
+ horizontalAlignment?: HorizontalTextAlignmentValues;
49
+ fillColour?: ColourInfo;
50
+ strokeColour?: ColourInfo;
51
+ colourMap?: ColourMap;
52
+ }
53
+ /** Options for async getRenderedText (loads font from URL). */
54
+ export interface GetRenderedTextOptions {
55
+ text: string;
56
+ fontUrl: string;
57
+ physicalSize: PhysicalSize;
58
+ /**
59
+ * Fallback font size (in pixels) to use if the calculated size causes a
60
+ * TOO_WIDE error. Useful when the caller has an authoritative size (e.g.
61
+ * from the CE) that avoids floating-point rounding issues.
62
+ */
63
+ fontSizeFallback?: number;
64
+ boxDimensions: BoxDimensions;
65
+ spacing?: TextSpacing;
66
+ verticalAlignment?: VerticalTextAlignmentValues;
67
+ baseline?: BaselineType | BaselineConfig;
68
+ horizontalAlignment?: HorizontalTextAlignmentValues;
69
+ fillColour?: ColourInfo;
70
+ strokeColour?: ColourInfo;
71
+ colourMap?: ColourMap;
72
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unmade/text-renderer",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "description": "Pure function text renderer for SVG output",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -70,23 +70,24 @@
70
70
  "typecheck": "tsc --noEmit"
71
71
  },
72
72
  "dependencies": {
73
- "@unmade/platform": "^0.1.2",
74
- "@unmade/svg-helpers": "^0.1.1",
75
- "harfbuzzjs": "^1.2.1"
73
+ "@unmade/platform": "^0.1.3",
74
+ "@unmade/svg-helpers": "^0.1.3",
75
+ "harfbuzzjs": "^1.4.0"
76
76
  },
77
77
  "peerDependencies": {
78
- "svg-path-properties": "^1.3.0"
78
+ "svg-path-properties": "^2.0.2"
79
79
  },
80
80
  "devDependencies": {
81
81
  "@resvg/resvg-js": "^2.6.2",
82
82
  "@types/pngjs": "^6.0.5",
83
+ "@typescript/typescript6": "^6.0.2",
83
84
  "pixelmatch": "^7.2.0",
84
85
  "pngjs": "^7.0.0",
85
- "svg-path-properties": "^1.3.0",
86
- "typescript": "^5.9.3",
87
- "vite": "^7.3.1",
88
- "vite-plugin-dts": "^4.5.4",
89
- "vitest": "^4.1.8"
86
+ "svg-path-properties": "^2.0.2",
87
+ "typescript": "^7.0.2",
88
+ "vite": "^8.0.16",
89
+ "vite-plugin-dts": "^5.0.3",
90
+ "vitest": "^4.1.10"
90
91
  },
91
92
  "keywords": [
92
93
  "text",