uicore-ts 1.1.88 → 1.1.102

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.
@@ -29,12 +29,19 @@ var import_UIView = require("./UIView");
29
29
  const _UITextView = class extends import_UIView.UIView {
30
30
  constructor(elementID, textViewType = _UITextView.type.paragraph, viewHTMLElement = null) {
31
31
  super(elementID, viewHTMLElement, textViewType);
32
- this._textColor = _UITextView.defaultTextColor;
33
- this._isSingleLine = import_UIObject.YES;
34
32
  this.textPrefix = "";
35
33
  this.textSuffix = "";
36
34
  this._notificationAmount = 0;
35
+ this._textColor = _UITextView.defaultTextColor;
36
+ this._isSingleLine = import_UIObject.YES;
37
37
  this._automaticFontSizeSelection = import_UIObject.NO;
38
+ this._fontInvalidationTriggers = {
39
+ fontSize: this.style.fontSize || "",
40
+ fontFamily: this.style.fontFamily || "",
41
+ fontWeight: this.style.fontWeight || "",
42
+ fontStyle: this.style.fontStyle || "",
43
+ styleClasses: this.styleClasses.join(",")
44
+ };
38
45
  this.changesOften = import_UIObject.NO;
39
46
  this._intrinsicHeightCache = new import_UIObject.UIObject();
40
47
  this._intrinsicWidthCache = new import_UIObject.UIObject();
@@ -53,16 +60,84 @@ const _UITextView = class extends import_UIView.UIView {
53
60
  );
54
61
  }
55
62
  }
56
- static _determinePXAndPTRatios() {
57
- if (_UITextView._ptToPx) {
58
- return;
63
+ didReceiveBroadcastEvent(event) {
64
+ super.didReceiveBroadcastEvent(event);
65
+ }
66
+ willMoveToSuperview(superview) {
67
+ super.willMoveToSuperview(superview);
68
+ }
69
+ layoutSubviews() {
70
+ super.layoutSubviews();
71
+ if (this._automaticFontSizeSelection) {
72
+ this.fontSize = _UITextView.automaticallyCalculatedFontSize(
73
+ new import_UIRectangle.UIRectangle(0, 0, 1 * this.viewHTMLElement.offsetHeight, 1 * this.viewHTMLElement.offsetWidth),
74
+ this.intrinsicContentSize(),
75
+ this.fontSize,
76
+ this._minFontSize,
77
+ this._maxFontSize
78
+ );
59
79
  }
60
- const o = document.createElement("div");
61
- o.style.width = "1000pt";
62
- document.body.appendChild(o);
63
- _UITextView._ptToPx = o.clientWidth / 1e3;
64
- document.body.removeChild(o);
65
- _UITextView._pxToPt = 1 / _UITextView._ptToPx;
80
+ }
81
+ _invalidateMeasurementStyles() {
82
+ this._cachedMeasurementStyles = void 0;
83
+ import_UITextMeasurement.UITextMeasurement.invalidateElement(this.viewHTMLElement);
84
+ this._intrinsicSizesCache = {};
85
+ }
86
+ _getMeasurementStyles() {
87
+ if (this._cachedMeasurementStyles) {
88
+ return this._cachedMeasurementStyles;
89
+ }
90
+ const computed = window.getComputedStyle(this.viewHTMLElement);
91
+ const fontSize = parseFloat(computed.fontSize);
92
+ this._cachedMeasurementStyles = {
93
+ font: [
94
+ computed.fontStyle,
95
+ computed.fontVariant,
96
+ computed.fontWeight,
97
+ computed.fontSize,
98
+ computed.fontFamily
99
+ ].join(" "),
100
+ fontSize,
101
+ lineHeight: this._parseLineHeight(computed.lineHeight, fontSize),
102
+ whiteSpace: computed.whiteSpace,
103
+ paddingLeft: parseFloat(computed.paddingLeft) || 0,
104
+ paddingRight: parseFloat(computed.paddingRight) || 0,
105
+ paddingTop: parseFloat(computed.paddingTop) || 0,
106
+ paddingBottom: parseFloat(computed.paddingBottom) || 0
107
+ };
108
+ return this._cachedMeasurementStyles;
109
+ }
110
+ _parseLineHeight(lineHeight, fontSize) {
111
+ if (lineHeight === "normal") {
112
+ return fontSize * 1.2;
113
+ }
114
+ if (lineHeight.endsWith("px")) {
115
+ return parseFloat(lineHeight);
116
+ }
117
+ const numericLineHeight = parseFloat(lineHeight);
118
+ if (!isNaN(numericLineHeight)) {
119
+ return fontSize * numericLineHeight;
120
+ }
121
+ return fontSize * 1.2;
122
+ }
123
+ _shouldUseFastMeasurement() {
124
+ const content = this.text || this.innerHTML;
125
+ if (this._innerHTMLKey || this._localizedTextObject) {
126
+ return false;
127
+ }
128
+ if (this.notificationAmount > 0) {
129
+ return false;
130
+ }
131
+ const hasComplexHTML = /<(?!\/?(b|i|em|strong|span|br)\b)[^>]+>/i.test(content);
132
+ return !hasComplexHTML;
133
+ }
134
+ setUseFastMeasurement(useFast) {
135
+ this._useFastMeasurement = useFast;
136
+ this._intrinsicSizesCache = {};
137
+ }
138
+ invalidateMeasurementStrategy() {
139
+ this._useFastMeasurement = void 0;
140
+ this._invalidateMeasurementStyles();
66
141
  }
67
142
  get textAlignment() {
68
143
  return this.style.textAlign;
@@ -126,6 +201,7 @@ const _UITextView = class extends import_UIView.UIView {
126
201
  this._intrinsicSizesCache = {};
127
202
  this.invalidateMeasurementStrategy();
128
203
  this._invalidateMeasurementStyles();
204
+ this.clearIntrinsicSizeCache();
129
205
  this.setNeedsLayout();
130
206
  }
131
207
  set innerHTML(innerHTML) {
@@ -149,7 +225,9 @@ const _UITextView = class extends import_UIView.UIView {
149
225
  this.style.fontSize = "" + fontSize + "pt";
150
226
  this._intrinsicHeightCache = new import_UIObject.UIObject();
151
227
  this._intrinsicWidthCache = new import_UIObject.UIObject();
228
+ this._invalidateFontCache();
152
229
  this._invalidateMeasurementStyles();
230
+ this.clearIntrinsicSizeCache();
153
231
  }
154
232
  }
155
233
  useAutomaticFontSize(minFontSize = import_UIObject.nil, maxFontSize = import_UIObject.nil) {
@@ -158,6 +236,42 @@ const _UITextView = class extends import_UIView.UIView {
158
236
  this._maxFontSize = maxFontSize;
159
237
  this.setNeedsLayout();
160
238
  }
239
+ _getFontCacheKey() {
240
+ const currentTriggers = {
241
+ fontSize: this.style.fontSize || "",
242
+ fontFamily: this.style.fontFamily || "",
243
+ fontWeight: this.style.fontWeight || "",
244
+ fontStyle: this.style.fontStyle || "",
245
+ styleClasses: this.styleClasses.join(",")
246
+ };
247
+ const hasChanged = currentTriggers.fontSize !== this._fontInvalidationTriggers.fontSize || currentTriggers.fontFamily !== this._fontInvalidationTriggers.fontFamily || currentTriggers.fontWeight !== this._fontInvalidationTriggers.fontWeight || currentTriggers.fontStyle !== this._fontInvalidationTriggers.fontStyle || currentTriggers.styleClasses !== this._fontInvalidationTriggers.styleClasses;
248
+ if (!this._cachedFontKey || hasChanged) {
249
+ const computed = this.computedStyle;
250
+ this._cachedFontKey = [
251
+ computed.fontStyle,
252
+ computed.fontVariant,
253
+ computed.fontWeight,
254
+ computed.fontSize,
255
+ computed.fontFamily
256
+ ].join("_").replace(/[.\s]/g, "_");
257
+ this._fontInvalidationTriggers = currentTriggers;
258
+ }
259
+ return this._cachedFontKey;
260
+ }
261
+ _invalidateFontCache() {
262
+ this._cachedFontKey = void 0;
263
+ }
264
+ static _determinePXAndPTRatios() {
265
+ if (_UITextView._ptToPx) {
266
+ return;
267
+ }
268
+ const o = document.createElement("div");
269
+ o.style.width = "1000pt";
270
+ document.body.appendChild(o);
271
+ _UITextView._ptToPx = o.clientWidth / 1e3;
272
+ document.body.removeChild(o);
273
+ _UITextView._pxToPt = 1 / _UITextView._ptToPx;
274
+ }
161
275
  static automaticallyCalculatedFontSize(bounds, currentSize, currentFontSize, minFontSize, maxFontSize) {
162
276
  minFontSize = (0, import_UIObject.FIRST)(minFontSize, 1);
163
277
  maxFontSize = (0, import_UIObject.FIRST)(maxFontSize, 1e11);
@@ -176,29 +290,8 @@ const _UITextView = class extends import_UIView.UIView {
176
290
  }
177
291
  return maxFittingFontSize;
178
292
  }
179
- didReceiveBroadcastEvent(event) {
180
- super.didReceiveBroadcastEvent(event);
181
- }
182
- willMoveToSuperview(superview) {
183
- super.willMoveToSuperview(superview);
184
- }
185
- layoutSubviews() {
186
- super.layoutSubviews();
187
- if (this._automaticFontSizeSelection) {
188
- this.fontSize = _UITextView.automaticallyCalculatedFontSize(
189
- new import_UIRectangle.UIRectangle(0, 0, 1 * this.viewHTMLElement.offsetHeight, 1 * this.viewHTMLElement.offsetWidth),
190
- this.intrinsicContentSize(),
191
- this.fontSize,
192
- this._minFontSize,
193
- this._maxFontSize
194
- );
195
- }
196
- }
197
293
  intrinsicContentHeight(constrainingWidth = 0) {
198
- const keyPath = (this.viewHTMLElement.innerHTML + "_csf_" + this.computedStyle.font).replace(new RegExp(
199
- "\\.",
200
- "g"
201
- ), "_") + "." + ("" + constrainingWidth).replace(new RegExp("\\.", "g"), "_");
294
+ const keyPath = this.viewHTMLElement.innerHTML + "_csf_" + this._getFontCacheKey() + "." + ("" + constrainingWidth).replace(new RegExp("\\.", "g"), "_");
202
295
  let cacheObject = _UITextView._intrinsicHeightCache;
203
296
  if (this.changesOften) {
204
297
  cacheObject = this._intrinsicHeightCache;
@@ -208,13 +301,14 @@ const _UITextView = class extends import_UIView.UIView {
208
301
  result = super.intrinsicContentHeight(constrainingWidth);
209
302
  cacheObject.setValueForKeyPath(keyPath, result);
210
303
  }
304
+ if (isNaN(result) || !result && !this.text) {
305
+ result = super.intrinsicContentHeight(constrainingWidth);
306
+ cacheObject.setValueForKeyPath(keyPath, result);
307
+ }
211
308
  return result;
212
309
  }
213
310
  intrinsicContentWidth(constrainingHeight = 0) {
214
- const keyPath = (this.viewHTMLElement.innerHTML + "_csf_" + this.computedStyle.font).replace(new RegExp(
215
- "\\.",
216
- "g"
217
- ), "_") + "." + ("" + constrainingHeight).replace(new RegExp("\\.", "g"), "_");
311
+ const keyPath = this.viewHTMLElement.innerHTML + "_csf_" + this._getFontCacheKey() + "." + ("" + constrainingHeight).replace(new RegExp("\\.", "g"), "_");
218
312
  let cacheObject = _UITextView._intrinsicWidthCache;
219
313
  if (this.changesOften) {
220
314
  cacheObject = this._intrinsicWidthCache;
@@ -226,95 +320,13 @@ const _UITextView = class extends import_UIView.UIView {
226
320
  }
227
321
  return result;
228
322
  }
229
- _invalidateMeasurementStyles() {
230
- this._cachedMeasurementStyles = void 0;
231
- import_UITextMeasurement.UITextMeasurement.invalidateElement(this.viewHTMLElement);
232
- this._intrinsicSizesCache = {};
323
+ addStyleClass(styleClass) {
324
+ super.addStyleClass(styleClass);
325
+ this._invalidateFontCache();
233
326
  }
234
- _getMeasurementStyles() {
235
- if (this._cachedMeasurementStyles) {
236
- return this._cachedMeasurementStyles;
237
- }
238
- const computed = window.getComputedStyle(this.viewHTMLElement);
239
- const fontSize = parseFloat(computed.fontSize);
240
- this._cachedMeasurementStyles = {
241
- font: [
242
- computed.fontStyle,
243
- computed.fontVariant,
244
- computed.fontWeight,
245
- computed.fontSize,
246
- computed.fontFamily
247
- ].join(" "),
248
- fontSize,
249
- lineHeight: this._parseLineHeight(computed.lineHeight, fontSize),
250
- whiteSpace: computed.whiteSpace,
251
- paddingLeft: parseFloat(computed.paddingLeft) || 0,
252
- paddingRight: parseFloat(computed.paddingRight) || 0,
253
- paddingTop: parseFloat(computed.paddingTop) || 0,
254
- paddingBottom: parseFloat(computed.paddingBottom) || 0
255
- };
256
- return this._cachedMeasurementStyles;
257
- }
258
- _parseLineHeight(lineHeight, fontSize) {
259
- if (lineHeight === "normal") {
260
- return fontSize * 1.2;
261
- }
262
- if (lineHeight.endsWith("px")) {
263
- return parseFloat(lineHeight);
264
- }
265
- const numericLineHeight = parseFloat(lineHeight);
266
- if (!isNaN(numericLineHeight)) {
267
- return fontSize * numericLineHeight;
268
- }
269
- return fontSize * 1.2;
270
- }
271
- intrinsicContentSizeWithConstraints(constrainingHeight = 0, constrainingWidth = 0) {
272
- var _a;
273
- const cacheKey = "h_" + constrainingHeight + "__w_" + constrainingWidth;
274
- const cachedResult = this._intrinsicSizesCache[cacheKey];
275
- if (cachedResult) {
276
- return cachedResult;
277
- }
278
- const shouldUseFastPath = (_a = this._useFastMeasurement) != null ? _a : this._shouldUseFastMeasurement();
279
- let result;
280
- if (shouldUseFastPath) {
281
- const styles = this._getMeasurementStyles();
282
- const size = import_UITextMeasurement.UITextMeasurement.calculateTextSize(
283
- this.viewHTMLElement,
284
- this.text || this.innerHTML,
285
- constrainingWidth || void 0,
286
- constrainingHeight || void 0,
287
- styles
288
- );
289
- result = new import_UIRectangle.UIRectangle(0, 0, size.height, size.width);
290
- } else {
291
- result = super.intrinsicContentSizeWithConstraints(constrainingHeight, constrainingWidth);
292
- }
293
- this._intrinsicSizesCache[cacheKey] = result.copy();
294
- return result;
295
- }
296
- _shouldUseFastMeasurement() {
297
- const content = this.text || this.innerHTML;
298
- if (this._innerHTMLKey || this._localizedTextObject) {
299
- return false;
300
- }
301
- if (this.notificationAmount > 0) {
302
- return false;
303
- }
304
- const hasComplexHTML = /<(?!\/?(b|i|em|strong|span|br)\b)[^>]+>/i.test(content);
305
- return !hasComplexHTML;
306
- }
307
- setUseFastMeasurement(useFast) {
308
- this._useFastMeasurement = useFast;
309
- this._intrinsicSizesCache = {};
310
- }
311
- invalidateMeasurementStrategy() {
312
- this._useFastMeasurement = void 0;
313
- this._invalidateMeasurementStyles();
314
- }
315
- intrinsicContentSize() {
316
- const result = this.intrinsicContentSizeWithConstraints(import_UIObject.nil, import_UIObject.nil);
317
- return result;
327
+ removeStyleClass(styleClass) {
328
+ super.removeStyleClass(styleClass);
329
+ this._invalidateFontCache();
318
330
  }
319
331
  };
320
332
  let UITextView = _UITextView;
@@ -341,7 +353,6 @@ UITextView.textAlignment = {
341
353
  "right": "right",
342
354
  "justify": "justify"
343
355
  };
344
- UITextView._determinePXAndPTRatios();
345
356
  // Annotate the CommonJS export names for ESM import in node:
346
357
  0 && (module.exports = {
347
358
  UITextView
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../scripts/UITextView.ts"],
4
- "sourcesContent": ["import { UIColor } from \"./UIColor\"\nimport { UILocalizedTextObject } from \"./UIInterfaces\"\nimport { FIRST, IS, IS_LIKE_NULL, nil, NO, UIObject, YES } from \"./UIObject\"\nimport { UIRectangle } from \"./UIRectangle\"\nimport type { ValueOf } from \"./UIObject\"\nimport { TextMeasurementStyle, UITextMeasurement } from \"./UITextMeasurement\"\nimport { UIView, UIViewBroadcastEvent } from \"./UIView\"\n\n\nexport class UITextView extends UIView {\n \n \n _textColor: UIColor = UITextView.defaultTextColor\n _textAlignment?: ValueOf<typeof UITextView.textAlignment>\n \n _isSingleLine = YES\n \n textPrefix = \"\"\n textSuffix = \"\"\n \n _notificationAmount = 0\n \n _minFontSize?: number\n _maxFontSize?: number\n \n _automaticFontSizeSelection = NO\n \n changesOften = NO\n \n static defaultTextColor = UIColor.blackColor\n static notificationTextColor = UIColor.redColor\n \n static _intrinsicHeightCache: { [x: string]: { [x: string]: number; }; } & UIObject = new UIObject() as any\n static _intrinsicWidthCache: { [x: string]: { [x: string]: number; }; } & UIObject = new UIObject() as any\n \n _intrinsicHeightCache: { [x: string]: { [x: string]: number; }; } & UIObject = new UIObject() as any\n _intrinsicWidthCache: { [x: string]: { [x: string]: number; }; } & UIObject = new UIObject() as any\n \n \n static _ptToPx: number\n static _pxToPt: number\n _text?: string\n \n private _useFastMeasurement: boolean | undefined;\n private _cachedMeasurementStyles: TextMeasurementStyle | undefined;\n \n override usesVirtualLayoutingForIntrinsicSizing = NO\n \n \n constructor(\n elementID?: string,\n textViewType: string | ValueOf<typeof UITextView.type> = UITextView.type.paragraph,\n viewHTMLElement = null\n ) {\n \n super(elementID, viewHTMLElement, textViewType)\n \n this.text = \"\"\n \n this.style.overflow = \"hidden\"\n this.style.textOverflow = \"ellipsis\"\n this.isSingleLine = YES\n \n this.textColor = this.textColor\n \n this.userInteractionEnabled = YES\n \n \n if (textViewType == UITextView.type.textArea) {\n \n this.pausesPointerEvents = YES\n \n this.addTargetForControlEvent(\n UIView.controlEvent.PointerUpInside,\n (sender, event) => sender.focus()\n )\n \n \n }\n \n \n }\n \n \n static _determinePXAndPTRatios() {\n \n if (UITextView._ptToPx) {\n return\n }\n \n const o = document.createElement(\"div\")\n o.style.width = \"1000pt\"\n document.body.appendChild(o)\n UITextView._ptToPx = o.clientWidth / 1000\n document.body.removeChild(o)\n UITextView._pxToPt = 1 / UITextView._ptToPx\n \n }\n \n \n static type = {\n \n \"paragraph\": \"p\",\n \"header1\": \"h1\",\n \"header2\": \"h2\",\n \"header3\": \"h3\",\n \"header4\": \"h4\",\n \"header5\": \"h5\",\n \"header6\": \"h6\",\n \"textArea\": \"textarea\",\n \"textField\": \"input\",\n \"span\": \"span\",\n \"label\": \"label\"\n \n } as const\n \n \n static textAlignment = {\n \n \"left\": \"left\",\n \"center\": \"center\",\n \"right\": \"right\",\n \"justify\": \"justify\"\n \n } as const\n \n get textAlignment() {\n // @ts-ignore\n return this.style.textAlign\n }\n \n set textAlignment(textAlignment: ValueOf<typeof UITextView.textAlignment>) {\n this._textAlignment = textAlignment\n this.style.textAlign = textAlignment\n }\n \n \n get textColor() {\n return this._textColor\n }\n \n set textColor(color: UIColor) {\n \n this._textColor = color || UITextView.defaultTextColor\n this.style.color = this._textColor.stringValue\n \n }\n \n \n get isSingleLine() {\n \n return this._isSingleLine\n \n }\n \n set isSingleLine(isSingleLine: boolean) {\n \n this._isSingleLine = isSingleLine\n \n this._intrinsicHeightCache = new UIObject() as any\n this._intrinsicWidthCache = new UIObject() as any\n \n if (isSingleLine) {\n \n this.style.whiteSpace = \"pre\"\n \n return\n \n }\n \n this.style.whiteSpace = \"pre-wrap\"\n \n this.invalidateMeasurementStrategy()\n \n }\n \n \n get notificationAmount() {\n \n return this._notificationAmount\n \n }\n \n set notificationAmount(notificationAmount: number) {\n \n if (this._notificationAmount == notificationAmount) {\n \n return\n \n }\n \n this._notificationAmount = notificationAmount\n \n this.text = this.text\n \n this.setNeedsLayoutUpToRootView()\n \n this.notificationAmountDidChange(notificationAmount)\n \n }\n \n notificationAmountDidChange(notificationAmount: number) {\n \n \n }\n \n \n get text() {\n \n return (this._text || this.viewHTMLElement.innerHTML)\n \n }\n \n set text(text) {\n this._text = text\n var notificationText = \"\"\n if (this.notificationAmount) {\n notificationText = \"<span style=\\\"color: \" + UITextView.notificationTextColor.stringValue + \";\\\">\" +\n (\" (\" + this.notificationAmount + \")\").bold() + \"</span>\"\n }\n \n if (this.viewHTMLElement.innerHTML != this.textPrefix + text + this.textSuffix + notificationText) {\n this.viewHTMLElement.innerHTML = this.textPrefix + FIRST(text, \"\") + this.textSuffix + notificationText\n }\n \n if (this.changesOften) {\n this._intrinsicHeightCache = new UIObject() as any\n this._intrinsicWidthCache = new UIObject() as any\n }\n // Invalidate measurement strategy when text changes significantly\n this._useFastMeasurement = undefined;\n this._intrinsicSizesCache = {};\n this.invalidateMeasurementStrategy()\n this._invalidateMeasurementStyles()\n \n this.setNeedsLayout()\n \n }\n \n override set innerHTML(innerHTML: string) {\n \n this.text = innerHTML\n this.invalidateMeasurementStrategy()\n \n }\n \n override get innerHTML() {\n \n return this.viewHTMLElement.innerHTML\n \n }\n \n \n setText(key: string, defaultString: string, parameters?: { [x: string]: string | UILocalizedTextObject }) {\n \n this.setInnerHTML(key, defaultString, parameters)\n this.invalidateMeasurementStrategy()\n \n }\n \n \n get fontSize() {\n \n const style = this.style.fontSize || window.getComputedStyle(this.viewHTMLElement, null).fontSize\n \n const result = (parseFloat(style) * UITextView._pxToPt)\n \n return result\n \n }\n \n set fontSize(fontSize: number) {\n \n if (fontSize != this.fontSize) {\n \n this.style.fontSize = \"\" + fontSize + \"pt\"\n \n this._intrinsicHeightCache = new UIObject() as any\n this._intrinsicWidthCache = new UIObject() as any // MEETOD LUUA!!!!\n \n this._invalidateMeasurementStyles() // Invalidate when font changes\n \n }\n \n }\n \n \n \n useAutomaticFontSize(minFontSize: number = nil, maxFontSize: number = nil) {\n \n this._automaticFontSizeSelection = YES\n \n this._minFontSize = minFontSize\n this._maxFontSize = maxFontSize\n \n this.setNeedsLayout()\n \n }\n \n \n static automaticallyCalculatedFontSize(\n bounds: UIRectangle,\n currentSize: UIRectangle,\n currentFontSize: number,\n minFontSize?: number,\n maxFontSize?: number\n ) {\n \n minFontSize = FIRST(minFontSize, 1)\n maxFontSize = FIRST(maxFontSize, 100000000000)\n \n const heightMultiplier = bounds.height / (currentSize.height + 1)\n const widthMultiplier = bounds.width / (currentSize.width + 1)\n \n var multiplier = heightMultiplier\n if (heightMultiplier > widthMultiplier) {\n multiplier = widthMultiplier\n }\n \n const maxFittingFontSize = currentFontSize * multiplier\n \n if (maxFittingFontSize > maxFontSize) {\n return maxFontSize\n }\n \n if (minFontSize > maxFittingFontSize) {\n return minFontSize\n }\n \n return maxFittingFontSize\n \n }\n \n \n override didReceiveBroadcastEvent(event: UIViewBroadcastEvent) {\n \n super.didReceiveBroadcastEvent(event)\n \n }\n \n \n override willMoveToSuperview(superview: UIView) {\n \n super.willMoveToSuperview(superview)\n \n }\n \n \n override layoutSubviews() {\n \n super.layoutSubviews()\n \n \n if (this._automaticFontSizeSelection) {\n \n this.fontSize = UITextView.automaticallyCalculatedFontSize(\n new UIRectangle(0, 0, 1 *\n this.viewHTMLElement.offsetHeight, 1 *\n this.viewHTMLElement.offsetWidth),\n this.intrinsicContentSize(),\n this.fontSize,\n this._minFontSize,\n this._maxFontSize\n )\n \n \n }\n \n \n }\n \n \n override intrinsicContentHeight(constrainingWidth = 0) {\n \n const keyPath = (this.viewHTMLElement.innerHTML + \"_csf_\" + this.computedStyle.font).replace(new RegExp(\n \"\\\\.\",\n \"g\"\n ), \"_\") + \".\" +\n (\"\" + constrainingWidth).replace(new RegExp(\"\\\\.\", \"g\"), \"_\")\n \n let cacheObject = UITextView._intrinsicHeightCache\n \n if (this.changesOften) {\n \n // @ts-ignore\n cacheObject = this._intrinsicHeightCache\n \n \n }\n \n \n var result = cacheObject.valueForKeyPath(keyPath)\n \n \n if (IS_LIKE_NULL(result)) {\n \n result = super.intrinsicContentHeight(constrainingWidth)\n \n cacheObject.setValueForKeyPath(keyPath, result)\n \n \n }\n \n \n return result\n \n }\n \n override intrinsicContentWidth(constrainingHeight = 0) {\n \n const keyPath = (this.viewHTMLElement.innerHTML + \"_csf_\" + this.computedStyle.font).replace(new RegExp(\n \"\\\\.\",\n \"g\"\n ), \"_\") + \".\" +\n (\"\" + constrainingHeight).replace(new RegExp(\"\\\\.\", \"g\"), \"_\")\n \n let cacheObject = UITextView._intrinsicWidthCache\n \n if (this.changesOften) {\n \n // @ts-ignore\n cacheObject = this._intrinsicWidthCache\n \n \n }\n \n \n var result = cacheObject.valueForKeyPath(keyPath)\n \n \n if (IS_LIKE_NULL(result)) {\n \n result = super.intrinsicContentWidth(constrainingHeight)\n \n cacheObject.setValueForKeyPath(keyPath, result)\n \n \n }\n \n \n return result\n \n }\n \n \n // Call this when styles change (fontSize, padding, etc.)\n private _invalidateMeasurementStyles(): void {\n this._cachedMeasurementStyles = undefined;\n UITextMeasurement.invalidateElement(this.viewHTMLElement);\n this._intrinsicSizesCache = {};\n }\n \n // Extract styles ONCE and cache them (avoids getComputedStyle)\n private _getMeasurementStyles(): TextMeasurementStyle {\n if (this._cachedMeasurementStyles) {\n return this._cachedMeasurementStyles;\n }\n \n // Only call getComputedStyle once and cache the result\n const computed = window.getComputedStyle(this.viewHTMLElement);\n const fontSize = parseFloat(computed.fontSize);\n \n this._cachedMeasurementStyles = {\n font: [\n computed.fontStyle,\n computed.fontVariant,\n computed.fontWeight,\n computed.fontSize,\n computed.fontFamily\n ].join(' '),\n fontSize: fontSize,\n lineHeight: this._parseLineHeight(computed.lineHeight, fontSize),\n whiteSpace: computed.whiteSpace,\n paddingLeft: parseFloat(computed.paddingLeft) || 0,\n paddingRight: parseFloat(computed.paddingRight) || 0,\n paddingTop: parseFloat(computed.paddingTop) || 0,\n paddingBottom: parseFloat(computed.paddingBottom) || 0\n };\n \n return this._cachedMeasurementStyles;\n }\n \n private _parseLineHeight(lineHeight: string, fontSize: number): number {\n if (lineHeight === 'normal') {\n return fontSize * 1.2;\n }\n if (lineHeight.endsWith('px')) {\n return parseFloat(lineHeight);\n }\n const numericLineHeight = parseFloat(lineHeight);\n if (!isNaN(numericLineHeight)) {\n return fontSize * numericLineHeight;\n }\n return fontSize * 1.2;\n }\n \n // Override the intrinsic size method\n override intrinsicContentSizeWithConstraints(\n constrainingHeight: number = 0,\n constrainingWidth: number = 0\n ): UIRectangle {\n const cacheKey = \"h_\" + constrainingHeight + \"__w_\" + constrainingWidth;\n const cachedResult = this._intrinsicSizesCache[cacheKey];\n if (cachedResult) {\n return cachedResult;\n }\n \n // Determine measurement strategy\n const shouldUseFastPath = this._useFastMeasurement ?? this._shouldUseFastMeasurement();\n \n let result: UIRectangle;\n \n if (shouldUseFastPath) {\n // Fast path: canvas-based measurement with pre-extracted styles\n const styles = this._getMeasurementStyles();\n const size = UITextMeasurement.calculateTextSize(\n this.viewHTMLElement,\n this.text || this.innerHTML,\n constrainingWidth || undefined,\n constrainingHeight || undefined,\n styles // Pass pre-computed styles to avoid getComputedStyle!\n );\n result = new UIRectangle(0, 0, size.height, size.width);\n } else {\n // Fallback: original DOM-based measurement for complex content\n result = super.intrinsicContentSizeWithConstraints(constrainingHeight, constrainingWidth);\n }\n \n this._intrinsicSizesCache[cacheKey] = result.copy();\n return result;\n }\n \n // Helper to determine if we can use fast measurement\n private _shouldUseFastMeasurement(): boolean {\n const content = this.text || this.innerHTML;\n \n // If using dynamic innerHTML with parameters, use DOM measurement\n if (this._innerHTMLKey || this._localizedTextObject) {\n return false;\n }\n \n // Check for notification badges\n if (this.notificationAmount > 0) {\n return false; // Has span with colored text\n }\n \n // Check content complexity\n const hasComplexHTML = /<(?!\\/?(b|i|em|strong|span|br)\\b)[^>]+>/i.test(content);\n \n return !hasComplexHTML;\n }\n \n // Optional: Allow manual override for specific instances\n setUseFastMeasurement(useFast: boolean): void {\n this._useFastMeasurement = useFast;\n this._intrinsicSizesCache = {};\n }\n \n // Optional: Force re-evaluation of measurement strategy\n invalidateMeasurementStrategy(): void {\n this._useFastMeasurement = undefined;\n this._invalidateMeasurementStyles();\n }\n \n \n \n \n \n override intrinsicContentSize() {\n \n // This works but is slow\n const result = this.intrinsicContentSizeWithConstraints(nil, nil)\n \n return result\n \n }\n \n \n}\n\n\nUITextView._determinePXAndPTRatios()\n\n\n// /**\n// * Uses canvas.measureText to compute and return the width of the given text of given font in pixels.\n// * \n// * @param {String} text The text to be rendered.\n// * @param {String} font The css font descriptor that text is to be rendered with (e.g. \"bold 14px verdana\").\n// * \n// * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393\n// */\n// function getTextMetrics(text, font) {\n// // re-use canvas object for better performance\n// var canvas = getTextMetrics.canvas || (getTextMetrics.canvas = document.createElement(\"canvas\"));\n// var context = canvas.getContext(\"2d\");\n// context.font = font;\n// var metrics = context.measureText(text);\n// return metrics;\n// }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAwB;AAExB,sBAAgE;AAChE,yBAA4B;AAE5B,+BAAwD;AACxD,oBAA6C;AAGtC,MAAM,cAAN,cAAyB,qBAAO;AAAA,EAwCnC,YACI,WACA,eAAyD,YAAW,KAAK,WACzE,kBAAkB,MACpB;AAEE,UAAM,WAAW,iBAAiB,YAAY;AA3ClD,sBAAsB,YAAW;AAGjC,yBAAgB;AAEhB,sBAAa;AACb,sBAAa;AAEb,+BAAsB;AAKtB,uCAA8B;AAE9B,wBAAe;AAQf,iCAA+E,IAAI,yBAAS;AAC5F,gCAA8E,IAAI,yBAAS;AAU3F,SAAS,yCAAyC;AAW9C,SAAK,OAAO;AAEZ,SAAK,MAAM,WAAW;AACtB,SAAK,MAAM,eAAe;AAC1B,SAAK,eAAe;AAEpB,SAAK,YAAY,KAAK;AAEtB,SAAK,yBAAyB;AAG9B,QAAI,gBAAgB,YAAW,KAAK,UAAU;AAE1C,WAAK,sBAAsB;AAE3B,WAAK;AAAA,QACD,qBAAO,aAAa;AAAA,QACpB,CAAC,QAAQ,UAAU,OAAO,MAAM;AAAA,MACpC;AAAA,IAGJ;AAAA,EAGJ;AAAA,EAGA,OAAO,0BAA0B;AAE7B,QAAI,YAAW,SAAS;AACpB;AAAA,IACJ;AAEA,UAAM,IAAI,SAAS,cAAc,KAAK;AACtC,MAAE,MAAM,QAAQ;AAChB,aAAS,KAAK,YAAY,CAAC;AAC3B,gBAAW,UAAU,EAAE,cAAc;AACrC,aAAS,KAAK,YAAY,CAAC;AAC3B,gBAAW,UAAU,IAAI,YAAW;AAAA,EAExC;AAAA,EA6BA,IAAI,gBAAgB;AAEhB,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,IAAI,cAAc,eAAyD;AACvE,SAAK,iBAAiB;AACtB,SAAK,MAAM,YAAY;AAAA,EAC3B;AAAA,EAGA,IAAI,YAAY;AACZ,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,UAAU,OAAgB;AAE1B,SAAK,aAAa,SAAS,YAAW;AACtC,SAAK,MAAM,QAAQ,KAAK,WAAW;AAAA,EAEvC;AAAA,EAGA,IAAI,eAAe;AAEf,WAAO,KAAK;AAAA,EAEhB;AAAA,EAEA,IAAI,aAAa,cAAuB;AAEpC,SAAK,gBAAgB;AAErB,SAAK,wBAAwB,IAAI,yBAAS;AAC1C,SAAK,uBAAuB,IAAI,yBAAS;AAEzC,QAAI,cAAc;AAEd,WAAK,MAAM,aAAa;AAExB;AAAA,IAEJ;AAEA,SAAK,MAAM,aAAa;AAExB,SAAK,8BAA8B;AAAA,EAEvC;AAAA,EAGA,IAAI,qBAAqB;AAErB,WAAO,KAAK;AAAA,EAEhB;AAAA,EAEA,IAAI,mBAAmB,oBAA4B;AAE/C,QAAI,KAAK,uBAAuB,oBAAoB;AAEhD;AAAA,IAEJ;AAEA,SAAK,sBAAsB;AAE3B,SAAK,OAAO,KAAK;AAEjB,SAAK,2BAA2B;AAEhC,SAAK,4BAA4B,kBAAkB;AAAA,EAEvD;AAAA,EAEA,4BAA4B,oBAA4B;AAAA,EAGxD;AAAA,EAGA,IAAI,OAAO;AAEP,WAAQ,KAAK,SAAS,KAAK,gBAAgB;AAAA,EAE/C;AAAA,EAEA,IAAI,KAAK,MAAM;AACX,SAAK,QAAQ;AACb,QAAI,mBAAmB;AACvB,QAAI,KAAK,oBAAoB;AACzB,yBAAmB,yBAA0B,YAAW,sBAAsB,cAAc,SACvF,OAAO,KAAK,qBAAqB,KAAK,KAAK,IAAI;AAAA,IACxD;AAEA,QAAI,KAAK,gBAAgB,aAAa,KAAK,aAAa,OAAO,KAAK,aAAa,kBAAkB;AAC/F,WAAK,gBAAgB,YAAY,KAAK,iBAAa,uBAAM,MAAM,EAAE,IAAI,KAAK,aAAa;AAAA,IAC3F;AAEA,QAAI,KAAK,cAAc;AACnB,WAAK,wBAAwB,IAAI,yBAAS;AAC1C,WAAK,uBAAuB,IAAI,yBAAS;AAAA,IAC7C;AAEA,SAAK,sBAAsB;AAC3B,SAAK,uBAAuB,CAAC;AAC7B,SAAK,8BAA8B;AACnC,SAAK,6BAA6B;AAElC,SAAK,eAAe;AAAA,EAExB;AAAA,EAEA,IAAa,UAAU,WAAmB;AAEtC,SAAK,OAAO;AACZ,SAAK,8BAA8B;AAAA,EAEvC;AAAA,EAEA,IAAa,YAAY;AAErB,WAAO,KAAK,gBAAgB;AAAA,EAEhC;AAAA,EAGA,QAAQ,KAAa,eAAuB,YAA8D;AAEtG,SAAK,aAAa,KAAK,eAAe,UAAU;AAChD,SAAK,8BAA8B;AAAA,EAEvC;AAAA,EAGA,IAAI,WAAW;AAEX,UAAM,QAAQ,KAAK,MAAM,YAAY,OAAO,iBAAiB,KAAK,iBAAiB,IAAI,EAAE;AAEzF,UAAM,SAAU,WAAW,KAAK,IAAI,YAAW;AAE/C,WAAO;AAAA,EAEX;AAAA,EAEA,IAAI,SAAS,UAAkB;AAE3B,QAAI,YAAY,KAAK,UAAU;AAE3B,WAAK,MAAM,WAAW,KAAK,WAAW;AAEtC,WAAK,wBAAwB,IAAI,yBAAS;AAC1C,WAAK,uBAAuB,IAAI,yBAAS;AAEzC,WAAK,6BAA6B;AAAA,IAEtC;AAAA,EAEJ;AAAA,EAIA,qBAAqB,cAAsB,qBAAK,cAAsB,qBAAK;AAEvE,SAAK,8BAA8B;AAEnC,SAAK,eAAe;AACpB,SAAK,eAAe;AAEpB,SAAK,eAAe;AAAA,EAExB;AAAA,EAGA,OAAO,gCACH,QACA,aACA,iBACA,aACA,aACF;AAEE,sBAAc,uBAAM,aAAa,CAAC;AAClC,sBAAc,uBAAM,aAAa,IAAY;AAE7C,UAAM,mBAAmB,OAAO,UAAU,YAAY,SAAS;AAC/D,UAAM,kBAAkB,OAAO,SAAS,YAAY,QAAQ;AAE5D,QAAI,aAAa;AACjB,QAAI,mBAAmB,iBAAiB;AACpC,mBAAa;AAAA,IACjB;AAEA,UAAM,qBAAqB,kBAAkB;AAE7C,QAAI,qBAAqB,aAAa;AAClC,aAAO;AAAA,IACX;AAEA,QAAI,cAAc,oBAAoB;AAClC,aAAO;AAAA,IACX;AAEA,WAAO;AAAA,EAEX;AAAA,EAGS,yBAAyB,OAA6B;AAE3D,UAAM,yBAAyB,KAAK;AAAA,EAExC;AAAA,EAGS,oBAAoB,WAAmB;AAE5C,UAAM,oBAAoB,SAAS;AAAA,EAEvC;AAAA,EAGS,iBAAiB;AAEtB,UAAM,eAAe;AAGrB,QAAI,KAAK,6BAA6B;AAElC,WAAK,WAAW,YAAW;AAAA,QACvB,IAAI,+BAAY,GAAG,GAAG,IAClB,KAAK,gBAAgB,cAAc,IACnC,KAAK,gBAAgB,WAAW;AAAA,QACpC,KAAK,qBAAqB;AAAA,QAC1B,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,MACT;AAAA,IAGJ;AAAA,EAGJ;AAAA,EAGS,uBAAuB,oBAAoB,GAAG;AAEnD,UAAM,WAAW,KAAK,gBAAgB,YAAY,UAAU,KAAK,cAAc,MAAM,QAAQ,IAAI;AAAA,MACzF;AAAA,MACA;AAAA,IACJ,GAAG,GAAG,IAAI,OACT,KAAK,mBAAmB,QAAQ,IAAI,OAAO,OAAO,GAAG,GAAG,GAAG;AAEhE,QAAI,cAAc,YAAW;AAE7B,QAAI,KAAK,cAAc;AAGnB,oBAAc,KAAK;AAAA,IAGvB;AAGA,QAAI,SAAS,YAAY,gBAAgB,OAAO;AAGhD,YAAI,8BAAa,MAAM,GAAG;AAEtB,eAAS,MAAM,uBAAuB,iBAAiB;AAEvD,kBAAY,mBAAmB,SAAS,MAAM;AAAA,IAGlD;AAGA,WAAO;AAAA,EAEX;AAAA,EAES,sBAAsB,qBAAqB,GAAG;AAEnD,UAAM,WAAW,KAAK,gBAAgB,YAAY,UAAU,KAAK,cAAc,MAAM,QAAQ,IAAI;AAAA,MACzF;AAAA,MACA;AAAA,IACJ,GAAG,GAAG,IAAI,OACT,KAAK,oBAAoB,QAAQ,IAAI,OAAO,OAAO,GAAG,GAAG,GAAG;AAEjE,QAAI,cAAc,YAAW;AAE7B,QAAI,KAAK,cAAc;AAGnB,oBAAc,KAAK;AAAA,IAGvB;AAGA,QAAI,SAAS,YAAY,gBAAgB,OAAO;AAGhD,YAAI,8BAAa,MAAM,GAAG;AAEtB,eAAS,MAAM,sBAAsB,kBAAkB;AAEvD,kBAAY,mBAAmB,SAAS,MAAM;AAAA,IAGlD;AAGA,WAAO;AAAA,EAEX;AAAA,EAIQ,+BAAqC;AACzC,SAAK,2BAA2B;AAChC,+CAAkB,kBAAkB,KAAK,eAAe;AACxD,SAAK,uBAAuB,CAAC;AAAA,EACjC;AAAA,EAGQ,wBAA8C;AAClD,QAAI,KAAK,0BAA0B;AAC/B,aAAO,KAAK;AAAA,IAChB;AAGA,UAAM,WAAW,OAAO,iBAAiB,KAAK,eAAe;AAC7D,UAAM,WAAW,WAAW,SAAS,QAAQ;AAE7C,SAAK,2BAA2B;AAAA,MAC5B,MAAM;AAAA,QACF,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,MACb,EAAE,KAAK,GAAG;AAAA,MACV;AAAA,MACA,YAAY,KAAK,iBAAiB,SAAS,YAAY,QAAQ;AAAA,MAC/D,YAAY,SAAS;AAAA,MACrB,aAAa,WAAW,SAAS,WAAW,KAAK;AAAA,MACjD,cAAc,WAAW,SAAS,YAAY,KAAK;AAAA,MACnD,YAAY,WAAW,SAAS,UAAU,KAAK;AAAA,MAC/C,eAAe,WAAW,SAAS,aAAa,KAAK;AAAA,IACzD;AAEA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEQ,iBAAiB,YAAoB,UAA0B;AACnE,QAAI,eAAe,UAAU;AACzB,aAAO,WAAW;AAAA,IACtB;AACA,QAAI,WAAW,SAAS,IAAI,GAAG;AAC3B,aAAO,WAAW,UAAU;AAAA,IAChC;AACA,UAAM,oBAAoB,WAAW,UAAU;AAC/C,QAAI,CAAC,MAAM,iBAAiB,GAAG;AAC3B,aAAO,WAAW;AAAA,IACtB;AACA,WAAO,WAAW;AAAA,EACtB;AAAA,EAGS,oCACL,qBAA6B,GAC7B,oBAA4B,GACjB;AApfnB;AAqfQ,UAAM,WAAW,OAAO,qBAAqB,SAAS;AACtD,UAAM,eAAe,KAAK,qBAAqB;AAC/C,QAAI,cAAc;AACd,aAAO;AAAA,IACX;AAGA,UAAM,qBAAoB,UAAK,wBAAL,YAA4B,KAAK,0BAA0B;AAErF,QAAI;AAEJ,QAAI,mBAAmB;AAEnB,YAAM,SAAS,KAAK,sBAAsB;AAC1C,YAAM,OAAO,2CAAkB;AAAA,QAC3B,KAAK;AAAA,QACL,KAAK,QAAQ,KAAK;AAAA,QAClB,qBAAqB;AAAA,QACrB,sBAAsB;AAAA,QACtB;AAAA,MACJ;AACA,eAAS,IAAI,+BAAY,GAAG,GAAG,KAAK,QAAQ,KAAK,KAAK;AAAA,IAC1D,OAAO;AAEH,eAAS,MAAM,oCAAoC,oBAAoB,iBAAiB;AAAA,IAC5F;AAEA,SAAK,qBAAqB,YAAY,OAAO,KAAK;AAClD,WAAO;AAAA,EACX;AAAA,EAGQ,4BAAqC;AACzC,UAAM,UAAU,KAAK,QAAQ,KAAK;AAGlC,QAAI,KAAK,iBAAiB,KAAK,sBAAsB;AACjD,aAAO;AAAA,IACX;AAGA,QAAI,KAAK,qBAAqB,GAAG;AAC7B,aAAO;AAAA,IACX;AAGA,UAAM,iBAAiB,2CAA2C,KAAK,OAAO;AAE9E,WAAO,CAAC;AAAA,EACZ;AAAA,EAGA,sBAAsB,SAAwB;AAC1C,SAAK,sBAAsB;AAC3B,SAAK,uBAAuB,CAAC;AAAA,EACjC;AAAA,EAGA,gCAAsC;AAClC,SAAK,sBAAsB;AAC3B,SAAK,6BAA6B;AAAA,EACtC;AAAA,EAMS,uBAAuB;AAG5B,UAAM,SAAS,KAAK,oCAAoC,qBAAK,mBAAG;AAEhE,WAAO;AAAA,EAEX;AAGJ;AAzjBO,IAAM,aAAN;AAAM,WAoBF,mBAAmB,uBAAQ;AApBzB,WAqBF,wBAAwB,uBAAQ;AArB9B,WAuBF,wBAA+E,IAAI,yBAAS;AAvB1F,WAwBF,uBAA8E,IAAI,yBAAS;AAxBzF,WA2FF,OAAO;AAAA,EAEV,aAAa;AAAA,EACb,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,SAAS;AAEb;AAzGS,WA4GF,gBAAgB;AAAA,EAEnB,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW;AAEf;AAycJ,WAAW,wBAAwB;",
4
+ "sourcesContent": ["import { UIColor } from \"./UIColor\"\nimport { UILocalizedTextObject } from \"./UIInterfaces\"\nimport { FIRST, IS_LIKE_NULL, nil, NO, UIObject, ValueOf, YES } from \"./UIObject\"\nimport { UIRectangle } from \"./UIRectangle\"\nimport { TextMeasurementStyle, UITextMeasurement } from \"./UITextMeasurement\"\nimport { UIView, UIViewBroadcastEvent } from \"./UIView\"\n\n\nexport class UITextView extends UIView {\n \n //#region Static Properties\n \n static defaultTextColor = UIColor.blackColor\n static notificationTextColor = UIColor.redColor\n \n // Global caches for all UILabels\n static _intrinsicHeightCache: { [x: string]: { [x: string]: number; }; } & UIObject = new UIObject() as any\n static _intrinsicWidthCache: { [x: string]: { [x: string]: number; }; } & UIObject = new UIObject() as any\n \n static _ptToPx: number\n static _pxToPt: number\n \n static type = {\n \"paragraph\": \"p\",\n \"header1\": \"h1\",\n \"header2\": \"h2\",\n \"header3\": \"h3\",\n \"header4\": \"h4\",\n \"header5\": \"h5\",\n \"header6\": \"h6\",\n \"textArea\": \"textarea\",\n \"textField\": \"input\",\n \"span\": \"span\",\n \"label\": \"label\"\n } as const\n \n static textAlignment = {\n \"left\": \"left\",\n \"center\": \"center\",\n \"right\": \"right\",\n \"justify\": \"justify\"\n } as const\n \n //#endregion\n \n //#region Constructor\n \n constructor(\n elementID?: string,\n textViewType: string | ValueOf<typeof UITextView.type> = UITextView.type.paragraph,\n viewHTMLElement = null\n ) {\n \n super(elementID, viewHTMLElement, textViewType)\n \n this.text = \"\"\n \n this.style.overflow = \"hidden\"\n this.style.textOverflow = \"ellipsis\"\n this.isSingleLine = YES\n \n this.textColor = this.textColor\n \n this.userInteractionEnabled = YES\n \n if (textViewType == UITextView.type.textArea) {\n this.pausesPointerEvents = YES\n this.addTargetForControlEvent(\n UIView.controlEvent.PointerUpInside,\n (sender, event) => sender.focus()\n )\n }\n }\n \n //#endregion\n \n //#region Lifecycle Methods\n \n override didReceiveBroadcastEvent(event: UIViewBroadcastEvent) {\n super.didReceiveBroadcastEvent(event)\n }\n \n override willMoveToSuperview(superview: UIView) {\n super.willMoveToSuperview(superview)\n }\n \n override layoutSubviews() {\n super.layoutSubviews()\n \n if (this._automaticFontSizeSelection) {\n this.fontSize = UITextView.automaticallyCalculatedFontSize(\n new UIRectangle(0, 0, 1 *\n this.viewHTMLElement.offsetHeight, 1 *\n this.viewHTMLElement.offsetWidth),\n this.intrinsicContentSize(),\n this.fontSize,\n this._minFontSize,\n this._maxFontSize\n )\n }\n }\n \n //#endregion\n \n //#region Measurement & Sizing - Private Methods\n \n private _invalidateMeasurementStyles(): void {\n this._cachedMeasurementStyles = undefined\n UITextMeasurement.invalidateElement(this.viewHTMLElement)\n this._intrinsicSizesCache = {}\n }\n \n private _getMeasurementStyles(): TextMeasurementStyle {\n if (this._cachedMeasurementStyles) {\n return this._cachedMeasurementStyles\n }\n \n const computed = window.getComputedStyle(this.viewHTMLElement)\n const fontSize = parseFloat(computed.fontSize)\n \n this._cachedMeasurementStyles = {\n font: [\n computed.fontStyle,\n computed.fontVariant,\n computed.fontWeight,\n computed.fontSize,\n computed.fontFamily\n ].join(\" \"),\n fontSize: fontSize,\n lineHeight: this._parseLineHeight(computed.lineHeight, fontSize),\n whiteSpace: computed.whiteSpace,\n paddingLeft: parseFloat(computed.paddingLeft) || 0,\n paddingRight: parseFloat(computed.paddingRight) || 0,\n paddingTop: parseFloat(computed.paddingTop) || 0,\n paddingBottom: parseFloat(computed.paddingBottom) || 0\n }\n \n return this._cachedMeasurementStyles\n }\n \n private _parseLineHeight(lineHeight: string, fontSize: number): number {\n if (lineHeight === \"normal\") {\n return fontSize * 1.2\n }\n if (lineHeight.endsWith(\"px\")) {\n return parseFloat(lineHeight)\n }\n const numericLineHeight = parseFloat(lineHeight)\n if (!isNaN(numericLineHeight)) {\n return fontSize * numericLineHeight\n }\n return fontSize * 1.2\n }\n \n private _shouldUseFastMeasurement(): boolean {\n const content = this.text || this.innerHTML\n \n if (this._innerHTMLKey || this._localizedTextObject) {\n return false\n }\n \n if (this.notificationAmount > 0) {\n return false\n }\n \n const hasComplexHTML = /<(?!\\/?(b|i|em|strong|span|br)\\b)[^>]+>/i.test(content)\n \n return !hasComplexHTML\n }\n \n //#endregion\n \n //#region Measurement & Sizing - Public Methods\n \n setUseFastMeasurement(useFast: boolean): void {\n this._useFastMeasurement = useFast\n this._intrinsicSizesCache = {}\n }\n \n invalidateMeasurementStrategy(): void {\n this._useFastMeasurement = undefined\n this._invalidateMeasurementStyles()\n }\n \n //#endregion\n \n //#region Getters & Setters - Text Alignment\n \n get textAlignment() {\n // @ts-ignore\n return this.style.textAlign\n }\n \n set textAlignment(textAlignment: ValueOf<typeof UITextView.textAlignment>) {\n this._textAlignment = textAlignment\n this.style.textAlign = textAlignment\n }\n \n //#endregion\n \n //#region Getters & Setters - Text Color\n \n get textColor() {\n return this._textColor\n }\n \n set textColor(color: UIColor) {\n this._textColor = color || UITextView.defaultTextColor\n this.style.color = this._textColor.stringValue\n }\n \n //#endregion\n \n //#region Getters & Setters - Single Line\n \n get isSingleLine() {\n return this._isSingleLine\n }\n \n set isSingleLine(isSingleLine: boolean) {\n this._isSingleLine = isSingleLine\n \n this._intrinsicHeightCache = new UIObject() as any\n this._intrinsicWidthCache = new UIObject() as any\n \n if (isSingleLine) {\n this.style.whiteSpace = \"pre\"\n return\n }\n \n this.style.whiteSpace = \"pre-wrap\"\n this.invalidateMeasurementStrategy()\n }\n \n //#endregion\n \n //#region Getters & Setters - Notification Amount\n \n get notificationAmount() {\n return this._notificationAmount\n }\n \n set notificationAmount(notificationAmount: number) {\n if (this._notificationAmount == notificationAmount) {\n return\n }\n \n this._notificationAmount = notificationAmount\n this.text = this.text\n this.setNeedsLayoutUpToRootView()\n this.notificationAmountDidChange(notificationAmount)\n }\n \n notificationAmountDidChange(notificationAmount: number) {\n }\n \n //#endregion\n \n //#region Getters & Setters - Text Content\n \n get text() {\n return (this._text || this.viewHTMLElement.innerHTML)\n }\n \n set text(text) {\n this._text = text\n var notificationText = \"\"\n if (this.notificationAmount) {\n notificationText = \"<span style=\\\"color: \" + UITextView.notificationTextColor.stringValue + \";\\\">\" +\n (\" (\" + this.notificationAmount + \")\").bold() + \"</span>\"\n }\n \n if (this.viewHTMLElement.innerHTML != this.textPrefix + text + this.textSuffix + notificationText) {\n this.viewHTMLElement.innerHTML = this.textPrefix + FIRST(text, \"\") + this.textSuffix + notificationText\n }\n \n if (this.changesOften) {\n this._intrinsicHeightCache = new UIObject() as any\n this._intrinsicWidthCache = new UIObject() as any\n }\n \n this._useFastMeasurement = undefined\n this._intrinsicSizesCache = {}\n this.invalidateMeasurementStrategy()\n this._invalidateMeasurementStyles()\n this.clearIntrinsicSizeCache()\n \n this.setNeedsLayout()\n }\n \n override set innerHTML(innerHTML: string) {\n this.text = innerHTML\n this.invalidateMeasurementStrategy()\n }\n \n override get innerHTML() {\n return this.viewHTMLElement.innerHTML\n }\n \n setText(key: string, defaultString: string, parameters?: { [x: string]: string | UILocalizedTextObject }) {\n this.setInnerHTML(key, defaultString, parameters)\n this.invalidateMeasurementStrategy()\n }\n \n //#endregion\n \n //#region Getters & Setters - Font Size\n \n get fontSize() {\n const style = this.style.fontSize || window.getComputedStyle(this.viewHTMLElement, null).fontSize\n const result = (parseFloat(style) * UITextView._pxToPt)\n return result\n }\n \n set fontSize(fontSize: number) {\n if (fontSize != this.fontSize) {\n this.style.fontSize = \"\" + fontSize + \"pt\"\n \n this._intrinsicHeightCache = new UIObject() as any\n this._intrinsicWidthCache = new UIObject() as any\n \n this._invalidateFontCache()\n this._invalidateMeasurementStyles()\n this.clearIntrinsicSizeCache()\n }\n }\n \n useAutomaticFontSize(minFontSize: number = nil, maxFontSize: number = nil) {\n this._automaticFontSizeSelection = YES\n this._minFontSize = minFontSize\n this._maxFontSize = maxFontSize\n this.setNeedsLayout()\n }\n \n //#endregion\n \n //#region Font Caching - Private Methods\n \n /**\n * Get a stable cache key for the font without triggering reflow.\n * Only computes font on first access or when font properties change.\n */\n private _getFontCacheKey(): string {\n // Check if font-related properties have changed\n const currentTriggers = {\n fontSize: this.style.fontSize || \"\",\n fontFamily: this.style.fontFamily || \"\",\n fontWeight: this.style.fontWeight || \"\",\n fontStyle: this.style.fontStyle || \"\",\n styleClasses: this.styleClasses.join(\",\")\n }\n \n const hasChanged =\n currentTriggers.fontSize !== this._fontInvalidationTriggers.fontSize ||\n currentTriggers.fontFamily !== this._fontInvalidationTriggers.fontFamily ||\n currentTriggers.fontWeight !== this._fontInvalidationTriggers.fontWeight ||\n currentTriggers.fontStyle !== this._fontInvalidationTriggers.fontStyle ||\n currentTriggers.styleClasses !== this._fontInvalidationTriggers.styleClasses\n \n if (!this._cachedFontKey || hasChanged) {\n // Only access computedStyle when we know something changed\n const computed = this.computedStyle\n this._cachedFontKey = [\n computed.fontStyle,\n computed.fontVariant,\n computed.fontWeight,\n computed.fontSize,\n computed.fontFamily\n ].join(\"_\").replace(/[.\\s]/g, \"_\")\n \n this._fontInvalidationTriggers = currentTriggers\n }\n \n return this._cachedFontKey\n }\n \n /**\n * Invalidate font cache when font properties change\n */\n private _invalidateFontCache(): void {\n this._cachedFontKey = undefined\n }\n \n //#endregion\n \n //#region Static Methods\n \n static _determinePXAndPTRatios() {\n if (UITextView._ptToPx) {\n return\n }\n \n const o = document.createElement(\"div\")\n o.style.width = \"1000pt\"\n document.body.appendChild(o)\n UITextView._ptToPx = o.clientWidth / 1000\n document.body.removeChild(o)\n UITextView._pxToPt = 1 / UITextView._ptToPx\n }\n \n static automaticallyCalculatedFontSize(\n bounds: UIRectangle,\n currentSize: UIRectangle,\n currentFontSize: number,\n minFontSize?: number,\n maxFontSize?: number\n ) {\n minFontSize = FIRST(minFontSize, 1)\n maxFontSize = FIRST(maxFontSize, 100000000000)\n \n const heightMultiplier = bounds.height / (currentSize.height + 1)\n const widthMultiplier = bounds.width / (currentSize.width + 1)\n \n var multiplier = heightMultiplier\n if (heightMultiplier > widthMultiplier) {\n multiplier = widthMultiplier\n }\n \n const maxFittingFontSize = currentFontSize * multiplier\n \n if (maxFittingFontSize > maxFontSize) {\n return maxFontSize\n }\n \n if (minFontSize > maxFittingFontSize) {\n return minFontSize\n }\n \n return maxFittingFontSize\n }\n \n //#endregion\n \n //#region Instance Properties - Text Content\n \n _text?: string\n textPrefix = \"\"\n textSuffix = \"\"\n _notificationAmount = 0\n \n //#endregion\n \n //#region Instance Properties - Styling\n \n _textColor: UIColor = UITextView.defaultTextColor\n _textAlignment?: ValueOf<typeof UITextView.textAlignment>\n _isSingleLine = YES\n \n //#endregion\n \n //#region Instance Properties - Font & Sizing\n \n _minFontSize?: number\n _maxFontSize?: number\n _automaticFontSizeSelection = NO\n \n // Cache for the computed font string\n private _cachedFontKey?: string\n private _fontInvalidationTriggers = {\n fontSize: this.style.fontSize || \"\",\n fontFamily: this.style.fontFamily || \"\",\n fontWeight: this.style.fontWeight || \"\",\n fontStyle: this.style.fontStyle || \"\",\n styleClasses: this.styleClasses.join(\",\")\n }\n \n //#endregion\n \n //#region Instance Properties - Caching & Performance\n \n changesOften = NO\n \n // Local cache for this instance if the label changes often\n _intrinsicHeightCache: { [x: string]: { [x: string]: number; }; } & UIObject = new UIObject() as any\n _intrinsicWidthCache: { [x: string]: { [x: string]: number; }; } & UIObject = new UIObject() as any\n \n private _useFastMeasurement: boolean | undefined\n private _cachedMeasurementStyles: TextMeasurementStyle | undefined\n \n override usesVirtualLayoutingForIntrinsicSizing = NO\n \n //#endregion\n \n \n \n override intrinsicContentHeight(constrainingWidth = 0) {\n \n const keyPath = (this.viewHTMLElement.innerHTML + \"_csf_\" + this._getFontCacheKey()) + \".\" +\n (\"\" + constrainingWidth).replace(new RegExp(\"\\\\.\", \"g\"), \"_\")\n \n let cacheObject = UITextView._intrinsicHeightCache\n \n if (this.changesOften) {\n cacheObject = this._intrinsicHeightCache\n }\n \n var result = cacheObject.valueForKeyPath(keyPath)\n \n if (IS_LIKE_NULL(result)) {\n result = super.intrinsicContentHeight(constrainingWidth)\n cacheObject.setValueForKeyPath(keyPath, result)\n }\n \n if (isNaN(result) || (!result && !this.text)) {\n result = super.intrinsicContentHeight(constrainingWidth)\n cacheObject.setValueForKeyPath(keyPath, result)\n }\n \n return result\n }\n \n override intrinsicContentWidth(constrainingHeight = 0) {\n \n const keyPath = (this.viewHTMLElement.innerHTML + \"_csf_\" + this._getFontCacheKey()) + \".\" +\n (\"\" + constrainingHeight).replace(new RegExp(\"\\\\.\", \"g\"), \"_\")\n \n let cacheObject = UITextView._intrinsicWidthCache\n \n if (this.changesOften) {\n cacheObject = this._intrinsicWidthCache\n }\n \n var result = cacheObject.valueForKeyPath(keyPath)\n \n if (IS_LIKE_NULL(result)) {\n result = super.intrinsicContentWidth(constrainingHeight)\n cacheObject.setValueForKeyPath(keyPath, result)\n }\n \n return result\n }\n \n \n // Override addStyleClass to invalidate font cache\n override addStyleClass(styleClass: string) {\n super.addStyleClass(styleClass)\n this._invalidateFontCache()\n }\n \n // Override removeStyleClass to invalidate font cache\n override removeStyleClass(styleClass: string) {\n super.removeStyleClass(styleClass)\n this._invalidateFontCache()\n }\n \n \n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -84,6 +84,7 @@ export declare class UIView extends UIObject {
84
84
  _frame?: UIRectangle & {
85
85
  zIndex?: number;
86
86
  };
87
+ _frameCache?: UIRectangle;
87
88
  _backgroundColor: UIColor;
88
89
  _viewHTMLElement: HTMLElement & LooseObject;
89
90
  _innerHTMLKey?: string;
@@ -137,13 +138,42 @@ export declare class UIView extends UIObject {
137
138
  static _onWindowMouseup: (event: MouseEvent) => void;
138
139
  private _resizeObserverEntry?;
139
140
  protected _intrinsicSizesCache: Record<string, UIRectangle>;
140
- static isVirtualLayouting: boolean;
141
+ private static _virtualLayoutingDepth;
142
+ static get isVirtualLayouting(): boolean;
143
+ get isVirtualLayouting(): boolean;
144
+ startVirtualLayout(): void;
145
+ finishVirtualLayout(): void;
141
146
  _frameForVirtualLayouting?: UIRectangle;
142
147
  usesVirtualLayoutingForIntrinsicSizing: boolean;
148
+ _contentInsets: {
149
+ top: number;
150
+ left: number;
151
+ bottom: number;
152
+ right: number;
153
+ };
143
154
  constructor(elementID?: string, viewHTMLElement?: HTMLElement & LooseObject | null, elementType?: string | null, initViewData?: any);
144
155
  static get nextIndex(): number;
145
- static get pageHeight(): number;
156
+ private static _cachedPageWidth;
157
+ private static _cachedPageHeight;
158
+ private static _pageDimensionsCacheValid;
159
+ private static _resizeObserverInitialized;
160
+ /**
161
+ * Initialize resize observer to invalidate cache when page dimensions change.
162
+ * This is called lazily on first access.
163
+ */
164
+ private static _initializePageDimensionsCacheIfNeeded;
165
+ /**
166
+ * Compute and cache page dimensions.
167
+ * Only triggers reflow when cache is invalid.
168
+ */
169
+ private static _updatePageDimensionsCacheIfNeeded;
146
170
  static get pageWidth(): number;
171
+ static get pageHeight(): number;
172
+ /**
173
+ * Manually invalidate the page dimensions cache.
174
+ * Useful if you know dimensions changed and want to force a recalculation.
175
+ */
176
+ static invalidatePageDimensionsCache(): void;
147
177
  centerInContainer(): void;
148
178
  centerXInContainer(): void;
149
179
  centerYInContainer(): void;
@@ -392,7 +422,15 @@ export declare class UIView extends UIObject {
392
422
  forEachViewInSubtree(functionToCall: (view: UIView) => void): void;
393
423
  rectangleInView(rectangle: UIRectangle, view: UIView, forceIfNotInViewTree?: boolean): any;
394
424
  rectangleFromView(rectangle: UIRectangle, view: UIView): any;
425
+ get contentBounds(): UIRectangle;
426
+ contentBoundsWithInset(inset: number): UIRectangle;
427
+ contentBoundsWithInsets(left: number, right: number, bottom: number, top: number): UIRectangle;
428
+ private _getIntrinsicSizeCacheKey;
429
+ private _getCachedIntrinsicSize;
430
+ private _setCachedIntrinsicSize;
431
+ clearIntrinsicSizeCache(): void;
395
432
  intrinsicContentSizeWithConstraints(constrainingHeight?: number, constrainingWidth?: number): UIRectangle;
433
+ private _intrinsicFrameFromSubviewFrames;
396
434
  intrinsicContentWidth(constrainingHeight?: number): number;
397
435
  intrinsicContentHeight(constrainingWidth?: number): number;
398
436
  intrinsicContentSize(): UIRectangle;