@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.d.mts CHANGED
@@ -188,7 +188,7 @@ interface PdfViewerProps {
188
188
  onMoveEnd?: () => void;
189
189
  mode: 'designer' | 'signer';
190
190
  currentSigner?: string;
191
- renderFieldContent?: (field: FormField) => React.ReactNode;
191
+ renderFieldContent?: (field: FormField, pageWidthPt?: number, pageHeightPt?: number) => React.ReactNode;
192
192
  zoom?: number;
193
193
  /** Called with field IDs inside a drag-selection rectangle */
194
194
  onMarqueeSelect?: (ids: string[]) => void;
package/dist/index.d.ts CHANGED
@@ -188,7 +188,7 @@ interface PdfViewerProps {
188
188
  onMoveEnd?: () => void;
189
189
  mode: 'designer' | 'signer';
190
190
  currentSigner?: string;
191
- renderFieldContent?: (field: FormField) => React.ReactNode;
191
+ renderFieldContent?: (field: FormField, pageWidthPt?: number, pageHeightPt?: number) => React.ReactNode;
192
192
  zoom?: number;
193
193
  /** Called with field IDs inside a drag-selection rectangle */
194
194
  onMarqueeSelect?: (ids: string[]) => void;
package/dist/index.js CHANGED
@@ -416,6 +416,8 @@ function PdfViewer({
416
416
  selectedIds: selectedFieldIds,
417
417
  mode,
418
418
  currentSigner,
419
+ pageWidthPt: page.pdfWidth,
420
+ pageHeightPt: page.pdfHeight,
419
421
  renderContent: renderFieldContent
420
422
  },
421
423
  field.id
@@ -506,6 +508,8 @@ function FieldOverlayItem({
506
508
  selectedIds,
507
509
  mode,
508
510
  currentSigner,
511
+ pageWidthPt,
512
+ pageHeightPt,
509
513
  renderContent
510
514
  }) {
511
515
  const overlayRef = (0, import_react.useRef)(null);
@@ -632,7 +636,7 @@ function FieldOverlayItem({
632
636
  onMouseDown: handleMouseDown,
633
637
  children: [
634
638
  mode === "designer" && !isRedact && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "field-overlay-label", style: { backgroundColor: color }, children: field.label }),
635
- renderContent ? renderContent(field) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "field-overlay-placeholder", children: field.value || field.placeholder }),
639
+ renderContent ? renderContent(field, pageWidthPt, pageHeightPt) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "field-overlay-placeholder", children: field.value || field.placeholder }),
636
640
  mode === "designer" && isSelected && !field.locked && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
637
641
  "div",
638
642
  {
@@ -2278,6 +2282,30 @@ function resolveAllFormulas(fields, customTransforms, values) {
2278
2282
  });
2279
2283
  }
2280
2284
 
2285
+ // src/utils/fitText.ts
2286
+ function fitFontSize(o) {
2287
+ let size = o.autoShrink ? Math.min(o.fontSize, o.fieldHeightPt * 0.7) : o.fontSize;
2288
+ if (o.autoShrink && o.value) {
2289
+ const padding = 4;
2290
+ while (size > 4) {
2291
+ if (o.measure(o.value, size) <= o.fieldWidthPt - padding) break;
2292
+ size -= 0.5;
2293
+ }
2294
+ }
2295
+ return size;
2296
+ }
2297
+ var measureCtx = null;
2298
+ function measureTextWidth(text, size, opts) {
2299
+ if (typeof document === "undefined") return text.length * size * 0.5;
2300
+ if (!measureCtx) measureCtx = document.createElement("canvas").getContext("2d");
2301
+ if (!measureCtx) return text.length * size * 0.5;
2302
+ const family = getCssFontFamily(opts?.fontFamily) || "Helvetica, Arial, sans-serif";
2303
+ measureCtx.font = `${opts?.italic ? "italic " : ""}${opts?.bold ? "bold " : ""}${size}px ${family}`;
2304
+ const base = measureCtx.measureText(text).width;
2305
+ const spacing = opts?.letterSpacing ? opts.letterSpacing * Math.max(0, text.length - 1) : 0;
2306
+ return base + spacing;
2307
+ }
2308
+
2281
2309
  // src/utils/pdfFiller.ts
2282
2310
  var FONT_VARIANTS = {
2283
2311
  Helvetica: [import_pdf_lib.StandardFonts.Helvetica, import_pdf_lib.StandardFonts.HelveticaBold, import_pdf_lib.StandardFonts.HelveticaOblique, import_pdf_lib.StandardFonts.HelveticaBoldOblique],
@@ -2369,14 +2397,14 @@ async function renderFieldsOnPages(pages, fields, getFont, getSignature) {
2369
2397
  const font = await getFont(field.fontFamily || "Helvetica", field.bold, field.italic);
2370
2398
  const spacing = field.letterSpacing || 0;
2371
2399
  const textWidthAtSize = (text, size) => font.widthOfTextAtSize(text, size) + spacing * (text.length - 1);
2372
- let fontSize = field.autoShrink ? Math.min(field.fontSize, h * 0.7) : field.fontSize;
2373
- if (field.autoShrink) {
2374
- const padding = 4;
2375
- while (fontSize > 4) {
2376
- if (textWidthAtSize(field.value, fontSize) <= w - padding) break;
2377
- fontSize -= 0.5;
2378
- }
2379
- }
2400
+ const fontSize = fitFontSize({
2401
+ value: field.value,
2402
+ fontSize: field.fontSize,
2403
+ autoShrink: field.autoShrink,
2404
+ fieldWidthPt: w,
2405
+ fieldHeightPt: h,
2406
+ measure: textWidthAtSize
2407
+ });
2380
2408
  const textX = x + 2;
2381
2409
  const baselineY = y + h * 0.3;
2382
2410
  if (spacing > 0) {
@@ -2881,7 +2909,7 @@ ${row.join(",")}`, "csv");
2881
2909
  setSubmitting(false);
2882
2910
  }
2883
2911
  }, [pdfSource, fields, callbackUrl, allRequiredFilled, onComplete, isLastSigner, signer, onSignerComplete, includeAuditTrail, exportFormat, onExport, getValues, transforms]);
2884
- const renderFieldContent = (0, import_react7.useCallback)((field) => {
2912
+ const renderFieldContent = (0, import_react7.useCallback)((field, pageWidthPt, pageHeightPt) => {
2885
2913
  if (isRedactField(field)) {
2886
2914
  return null;
2887
2915
  }
@@ -2920,8 +2948,23 @@ ${row.join(",")}`, "csv");
2920
2948
  if (field.type === "signed-date") {
2921
2949
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "field-overlay-value", children: field.value || (/* @__PURE__ */ new Date()).toLocaleDateString() });
2922
2950
  }
2951
+ const fieldWidthPt = pageWidthPt ? field.width / 100 * pageWidthPt : Infinity;
2952
+ const fieldHeightPt = pageHeightPt ? field.height / 100 * pageHeightPt : 0;
2953
+ const effectiveFontSize = pageWidthPt ? fitFontSize({
2954
+ value: field.value || "",
2955
+ fontSize: field.fontSize,
2956
+ autoShrink: field.autoShrink,
2957
+ fieldWidthPt,
2958
+ fieldHeightPt,
2959
+ measure: (t, s) => measureTextWidth(t, s, {
2960
+ fontFamily: field.fontFamily,
2961
+ bold: field.bold,
2962
+ italic: field.italic,
2963
+ letterSpacing: field.letterSpacing
2964
+ })
2965
+ }) : field.fontSize;
2923
2966
  const fontStyle = {
2924
- fontSize: `${field.fontSize}pt`,
2967
+ fontSize: `${effectiveFontSize}pt`,
2925
2968
  letterSpacing: field.letterSpacing ? `${field.letterSpacing}pt` : void 0,
2926
2969
  lineHeight: field.lineHeight ? `${field.lineHeight}` : void 0,
2927
2970
  ...getCssTextStyle(field)