@unlev/exeq 0.5.1 → 0.5.2

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/index.mjs CHANGED
@@ -344,6 +344,8 @@ function PdfViewer({
344
344
  selectedIds: selectedFieldIds,
345
345
  mode,
346
346
  currentSigner,
347
+ pageWidthPt: page.pdfWidth,
348
+ pageHeightPt: page.pdfHeight,
347
349
  renderContent: renderFieldContent
348
350
  },
349
351
  field.id
@@ -434,6 +436,8 @@ function FieldOverlayItem({
434
436
  selectedIds,
435
437
  mode,
436
438
  currentSigner,
439
+ pageWidthPt,
440
+ pageHeightPt,
437
441
  renderContent
438
442
  }) {
439
443
  const overlayRef = useRef(null);
@@ -560,7 +564,7 @@ function FieldOverlayItem({
560
564
  onMouseDown: handleMouseDown,
561
565
  children: [
562
566
  mode === "designer" && !isRedact && /* @__PURE__ */ jsx("div", { className: "field-overlay-label", style: { backgroundColor: color }, children: field.label }),
563
- renderContent ? renderContent(field) : /* @__PURE__ */ jsx("div", { className: "field-overlay-placeholder", children: field.value || field.placeholder }),
567
+ renderContent ? renderContent(field, pageWidthPt, pageHeightPt) : /* @__PURE__ */ jsx("div", { className: "field-overlay-placeholder", children: field.value || field.placeholder }),
564
568
  mode === "designer" && isSelected && !field.locked && /* @__PURE__ */ jsx(
565
569
  "div",
566
570
  {
@@ -2210,6 +2214,30 @@ function resolveAllFormulas(fields, customTransforms, values) {
2210
2214
  });
2211
2215
  }
2212
2216
 
2217
+ // src/utils/fitText.ts
2218
+ function fitFontSize(o) {
2219
+ let size = o.autoShrink ? Math.min(o.fontSize, o.fieldHeightPt * 0.7) : o.fontSize;
2220
+ if (o.autoShrink && o.value) {
2221
+ const padding = 4;
2222
+ while (size > 4) {
2223
+ if (o.measure(o.value, size) <= o.fieldWidthPt - padding) break;
2224
+ size -= 0.5;
2225
+ }
2226
+ }
2227
+ return size;
2228
+ }
2229
+ var measureCtx = null;
2230
+ function measureTextWidth(text, size, opts) {
2231
+ if (typeof document === "undefined") return text.length * size * 0.5;
2232
+ if (!measureCtx) measureCtx = document.createElement("canvas").getContext("2d");
2233
+ if (!measureCtx) return text.length * size * 0.5;
2234
+ const family = getCssFontFamily(opts?.fontFamily) || "Helvetica, Arial, sans-serif";
2235
+ measureCtx.font = `${opts?.italic ? "italic " : ""}${opts?.bold ? "bold " : ""}${size}px ${family}`;
2236
+ const base = measureCtx.measureText(text).width;
2237
+ const spacing = opts?.letterSpacing ? opts.letterSpacing * Math.max(0, text.length - 1) : 0;
2238
+ return base + spacing;
2239
+ }
2240
+
2213
2241
  // src/utils/pdfFiller.ts
2214
2242
  var FONT_VARIANTS = {
2215
2243
  Helvetica: [StandardFonts.Helvetica, StandardFonts.HelveticaBold, StandardFonts.HelveticaOblique, StandardFonts.HelveticaBoldOblique],
@@ -2301,14 +2329,14 @@ async function renderFieldsOnPages(pages, fields, getFont, getSignature) {
2301
2329
  const font = await getFont(field.fontFamily || "Helvetica", field.bold, field.italic);
2302
2330
  const spacing = field.letterSpacing || 0;
2303
2331
  const textWidthAtSize = (text, size) => font.widthOfTextAtSize(text, size) + spacing * (text.length - 1);
2304
- let fontSize = field.autoShrink ? Math.min(field.fontSize, h * 0.7) : field.fontSize;
2305
- if (field.autoShrink) {
2306
- const padding = 4;
2307
- while (fontSize > 4) {
2308
- if (textWidthAtSize(field.value, fontSize) <= w - padding) break;
2309
- fontSize -= 0.5;
2310
- }
2311
- }
2332
+ const fontSize = fitFontSize({
2333
+ value: field.value,
2334
+ fontSize: field.fontSize,
2335
+ autoShrink: field.autoShrink,
2336
+ fieldWidthPt: w,
2337
+ fieldHeightPt: h,
2338
+ measure: textWidthAtSize
2339
+ });
2312
2340
  const textX = x + 2;
2313
2341
  const baselineY = y + h * 0.3;
2314
2342
  if (spacing > 0) {
@@ -2813,7 +2841,7 @@ ${row.join(",")}`, "csv");
2813
2841
  setSubmitting(false);
2814
2842
  }
2815
2843
  }, [pdfSource, fields, callbackUrl, allRequiredFilled, onComplete, isLastSigner, signer, onSignerComplete, includeAuditTrail, exportFormat, onExport, getValues, transforms]);
2816
- const renderFieldContent = useCallback5((field) => {
2844
+ const renderFieldContent = useCallback5((field, pageWidthPt, pageHeightPt) => {
2817
2845
  if (isRedactField(field)) {
2818
2846
  return null;
2819
2847
  }
@@ -2852,8 +2880,23 @@ ${row.join(",")}`, "csv");
2852
2880
  if (field.type === "signed-date") {
2853
2881
  return /* @__PURE__ */ jsx6("div", { className: "field-overlay-value", children: field.value || (/* @__PURE__ */ new Date()).toLocaleDateString() });
2854
2882
  }
2883
+ const fieldWidthPt = pageWidthPt ? field.width / 100 * pageWidthPt : Infinity;
2884
+ const fieldHeightPt = pageHeightPt ? field.height / 100 * pageHeightPt : 0;
2885
+ const effectiveFontSize = pageWidthPt ? fitFontSize({
2886
+ value: field.value || "",
2887
+ fontSize: field.fontSize,
2888
+ autoShrink: field.autoShrink,
2889
+ fieldWidthPt,
2890
+ fieldHeightPt,
2891
+ measure: (t, s) => measureTextWidth(t, s, {
2892
+ fontFamily: field.fontFamily,
2893
+ bold: field.bold,
2894
+ italic: field.italic,
2895
+ letterSpacing: field.letterSpacing
2896
+ })
2897
+ }) : field.fontSize;
2855
2898
  const fontStyle = {
2856
- fontSize: `${field.fontSize}pt`,
2899
+ fontSize: `${effectiveFontSize}pt`,
2857
2900
  letterSpacing: field.letterSpacing ? `${field.letterSpacing}pt` : void 0,
2858
2901
  lineHeight: field.lineHeight ? `${field.lineHeight}` : void 0,
2859
2902
  ...getCssTextStyle(field)