uicore-ts 1.1.101 → 1.1.105
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/compiledScripts/UICore.js +3 -0
- package/compiledScripts/UICore.js.map +2 -2
- package/compiledScripts/UITableView.d.ts +8 -0
- package/compiledScripts/UITableView.js +122 -39
- package/compiledScripts/UITableView.js.map +3 -3
- package/compiledScripts/UITextView.d.ts +49 -39
- package/compiledScripts/UITextView.js +131 -132
- package/compiledScripts/UITextView.js.map +2 -2
- package/compiledScripts/UIView.d.ts +21 -1
- package/compiledScripts/UIView.js +66 -8
- package/compiledScripts/UIView.js.map +2 -2
- package/package.json +1 -1
- package/scripts/UICore.ts +5 -0
- package/scripts/UITableView.ts +188 -129
- package/scripts/UITextView.ts +266 -376
- package/scripts/UIView.ts +131 -7
|
@@ -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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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;
|
|
@@ -150,6 +225,7 @@ const _UITextView = class extends import_UIView.UIView {
|
|
|
150
225
|
this.style.fontSize = "" + fontSize + "pt";
|
|
151
226
|
this._intrinsicHeightCache = new import_UIObject.UIObject();
|
|
152
227
|
this._intrinsicWidthCache = new import_UIObject.UIObject();
|
|
228
|
+
this._invalidateFontCache();
|
|
153
229
|
this._invalidateMeasurementStyles();
|
|
154
230
|
this.clearIntrinsicSizeCache();
|
|
155
231
|
}
|
|
@@ -160,6 +236,42 @@ const _UITextView = class extends import_UIView.UIView {
|
|
|
160
236
|
this._maxFontSize = maxFontSize;
|
|
161
237
|
this.setNeedsLayout();
|
|
162
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
|
+
}
|
|
163
275
|
static automaticallyCalculatedFontSize(bounds, currentSize, currentFontSize, minFontSize, maxFontSize) {
|
|
164
276
|
minFontSize = (0, import_UIObject.FIRST)(minFontSize, 1);
|
|
165
277
|
maxFontSize = (0, import_UIObject.FIRST)(maxFontSize, 1e11);
|
|
@@ -178,29 +290,8 @@ const _UITextView = class extends import_UIView.UIView {
|
|
|
178
290
|
}
|
|
179
291
|
return maxFittingFontSize;
|
|
180
292
|
}
|
|
181
|
-
didReceiveBroadcastEvent(event) {
|
|
182
|
-
super.didReceiveBroadcastEvent(event);
|
|
183
|
-
}
|
|
184
|
-
willMoveToSuperview(superview) {
|
|
185
|
-
super.willMoveToSuperview(superview);
|
|
186
|
-
}
|
|
187
|
-
layoutSubviews() {
|
|
188
|
-
super.layoutSubviews();
|
|
189
|
-
if (this._automaticFontSizeSelection) {
|
|
190
|
-
this.fontSize = _UITextView.automaticallyCalculatedFontSize(
|
|
191
|
-
new import_UIRectangle.UIRectangle(0, 0, 1 * this.viewHTMLElement.offsetHeight, 1 * this.viewHTMLElement.offsetWidth),
|
|
192
|
-
this.intrinsicContentSize(),
|
|
193
|
-
this.fontSize,
|
|
194
|
-
this._minFontSize,
|
|
195
|
-
this._maxFontSize
|
|
196
|
-
);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
293
|
intrinsicContentHeight(constrainingWidth = 0) {
|
|
200
|
-
const keyPath =
|
|
201
|
-
"\\.",
|
|
202
|
-
"g"
|
|
203
|
-
), "_") + "." + ("" + constrainingWidth).replace(new RegExp("\\.", "g"), "_");
|
|
294
|
+
const keyPath = this.viewHTMLElement.innerHTML + "_csf_" + this._getFontCacheKey() + "." + ("" + constrainingWidth).replace(new RegExp("\\.", "g"), "_");
|
|
204
295
|
let cacheObject = _UITextView._intrinsicHeightCache;
|
|
205
296
|
if (this.changesOften) {
|
|
206
297
|
cacheObject = this._intrinsicHeightCache;
|
|
@@ -211,18 +302,13 @@ const _UITextView = class extends import_UIView.UIView {
|
|
|
211
302
|
cacheObject.setValueForKeyPath(keyPath, result);
|
|
212
303
|
}
|
|
213
304
|
if (isNaN(result) || !result && !this.text) {
|
|
214
|
-
var asd = 1;
|
|
215
305
|
result = super.intrinsicContentHeight(constrainingWidth);
|
|
216
306
|
cacheObject.setValueForKeyPath(keyPath, result);
|
|
217
|
-
var asdasd = 1;
|
|
218
307
|
}
|
|
219
308
|
return result;
|
|
220
309
|
}
|
|
221
310
|
intrinsicContentWidth(constrainingHeight = 0) {
|
|
222
|
-
const keyPath =
|
|
223
|
-
"\\.",
|
|
224
|
-
"g"
|
|
225
|
-
), "_") + "." + ("" + constrainingHeight).replace(new RegExp("\\.", "g"), "_");
|
|
311
|
+
const keyPath = this.viewHTMLElement.innerHTML + "_csf_" + this._getFontCacheKey() + "." + ("" + constrainingHeight).replace(new RegExp("\\.", "g"), "_");
|
|
226
312
|
let cacheObject = _UITextView._intrinsicWidthCache;
|
|
227
313
|
if (this.changesOften) {
|
|
228
314
|
cacheObject = this._intrinsicWidthCache;
|
|
@@ -234,99 +320,13 @@ const _UITextView = class extends import_UIView.UIView {
|
|
|
234
320
|
}
|
|
235
321
|
return result;
|
|
236
322
|
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
this._intrinsicSizesCache = {};
|
|
241
|
-
}
|
|
242
|
-
_getMeasurementStyles() {
|
|
243
|
-
if (this._cachedMeasurementStyles) {
|
|
244
|
-
return this._cachedMeasurementStyles;
|
|
245
|
-
}
|
|
246
|
-
const computed = window.getComputedStyle(this.viewHTMLElement);
|
|
247
|
-
const fontSize = parseFloat(computed.fontSize);
|
|
248
|
-
this._cachedMeasurementStyles = {
|
|
249
|
-
font: [
|
|
250
|
-
computed.fontStyle,
|
|
251
|
-
computed.fontVariant,
|
|
252
|
-
computed.fontWeight,
|
|
253
|
-
computed.fontSize,
|
|
254
|
-
computed.fontFamily
|
|
255
|
-
].join(" "),
|
|
256
|
-
fontSize,
|
|
257
|
-
lineHeight: this._parseLineHeight(computed.lineHeight, fontSize),
|
|
258
|
-
whiteSpace: computed.whiteSpace,
|
|
259
|
-
paddingLeft: parseFloat(computed.paddingLeft) || 0,
|
|
260
|
-
paddingRight: parseFloat(computed.paddingRight) || 0,
|
|
261
|
-
paddingTop: parseFloat(computed.paddingTop) || 0,
|
|
262
|
-
paddingBottom: parseFloat(computed.paddingBottom) || 0
|
|
263
|
-
};
|
|
264
|
-
return this._cachedMeasurementStyles;
|
|
265
|
-
}
|
|
266
|
-
_parseLineHeight(lineHeight, fontSize) {
|
|
267
|
-
if (lineHeight === "normal") {
|
|
268
|
-
return fontSize * 1.2;
|
|
269
|
-
}
|
|
270
|
-
if (lineHeight.endsWith("px")) {
|
|
271
|
-
return parseFloat(lineHeight);
|
|
272
|
-
}
|
|
273
|
-
const numericLineHeight = parseFloat(lineHeight);
|
|
274
|
-
if (!isNaN(numericLineHeight)) {
|
|
275
|
-
return fontSize * numericLineHeight;
|
|
276
|
-
}
|
|
277
|
-
return fontSize * 1.2;
|
|
278
|
-
}
|
|
279
|
-
intrinsicContentSizeWithConstraints(constrainingHeight = 0, constrainingWidth = 0) {
|
|
280
|
-
var _a;
|
|
281
|
-
const cacheKey = "h_" + constrainingHeight + "__w_" + constrainingWidth;
|
|
282
|
-
const cachedResult = this._intrinsicSizesCache[cacheKey];
|
|
283
|
-
if (cachedResult) {
|
|
284
|
-
return cachedResult;
|
|
285
|
-
}
|
|
286
|
-
const shouldUseFastPath = (_a = this._useFastMeasurement) != null ? _a : this._shouldUseFastMeasurement();
|
|
287
|
-
let result;
|
|
288
|
-
if (shouldUseFastPath) {
|
|
289
|
-
const styles = this._getMeasurementStyles();
|
|
290
|
-
const size = import_UITextMeasurement.UITextMeasurement.calculateTextSize(
|
|
291
|
-
this.viewHTMLElement,
|
|
292
|
-
this.text || this.innerHTML,
|
|
293
|
-
constrainingWidth || void 0,
|
|
294
|
-
constrainingHeight || void 0,
|
|
295
|
-
styles
|
|
296
|
-
);
|
|
297
|
-
result = new import_UIRectangle.UIRectangle(0, 0, size.height, size.width);
|
|
298
|
-
} else {
|
|
299
|
-
result = super.intrinsicContentSizeWithConstraints(constrainingHeight, constrainingWidth);
|
|
300
|
-
}
|
|
301
|
-
if (isNaN(result.height) || isNaN(result.width)) {
|
|
302
|
-
var asd = 1;
|
|
303
|
-
result = super.intrinsicContentSizeWithConstraints(constrainingHeight, constrainingWidth);
|
|
304
|
-
}
|
|
305
|
-
this._intrinsicSizesCache[cacheKey] = result.copy();
|
|
306
|
-
return result;
|
|
307
|
-
}
|
|
308
|
-
_shouldUseFastMeasurement() {
|
|
309
|
-
const content = this.text || this.innerHTML;
|
|
310
|
-
if (this._innerHTMLKey || this._localizedTextObject) {
|
|
311
|
-
return false;
|
|
312
|
-
}
|
|
313
|
-
if (this.notificationAmount > 0) {
|
|
314
|
-
return false;
|
|
315
|
-
}
|
|
316
|
-
const hasComplexHTML = /<(?!\/?(b|i|em|strong|span|br)\b)[^>]+>/i.test(content);
|
|
317
|
-
return !hasComplexHTML;
|
|
318
|
-
}
|
|
319
|
-
setUseFastMeasurement(useFast) {
|
|
320
|
-
this._useFastMeasurement = useFast;
|
|
321
|
-
this._intrinsicSizesCache = {};
|
|
322
|
-
}
|
|
323
|
-
invalidateMeasurementStrategy() {
|
|
324
|
-
this._useFastMeasurement = void 0;
|
|
325
|
-
this._invalidateMeasurementStyles();
|
|
323
|
+
addStyleClass(styleClass) {
|
|
324
|
+
super.addStyleClass(styleClass);
|
|
325
|
+
this._invalidateFontCache();
|
|
326
326
|
}
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
327
|
+
removeStyleClass(styleClass) {
|
|
328
|
+
super.removeStyleClass(styleClass);
|
|
329
|
+
this._invalidateFontCache();
|
|
330
330
|
}
|
|
331
331
|
};
|
|
332
332
|
let UITextView = _UITextView;
|
|
@@ -353,7 +353,6 @@ UITextView.textAlignment = {
|
|
|
353
353
|
"right": "right",
|
|
354
354
|
"justify": "justify"
|
|
355
355
|
};
|
|
356
|
-
UITextView._determinePXAndPTRatios();
|
|
357
356
|
// Annotate the CommonJS export names for ESM import in node:
|
|
358
357
|
0 && (module.exports = {
|
|
359
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 // 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 // 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 \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 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 this.clearIntrinsicSizeCache()\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 this.clearIntrinsicSizeCache()\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 if (isNaN(result) || (!result && !this.text) ) {\n \n // console.error(\"Failed to calculate intrinsic height (\" + this.elementID + \")\", this, this.viewHTMLElement)\n var asd = 1\n \n result = super.intrinsicContentHeight(constrainingWidth)\n \n cacheObject.setValueForKeyPath(keyPath, result)\n \n var asdasd = 1\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 }\n else {\n // Fallback: original DOM-based measurement for complex content\n result = super.intrinsicContentSizeWithConstraints(constrainingHeight, constrainingWidth)\n }\n \n if (isNaN(result.height) || isNaN(result.width)) {\n \n // console.error(\"Failed to calculate intrinsic height (\" + this.elementID + \")\", this)\n var asd = 1\n \n // Fallback: original DOM-based measurement\n result = super.intrinsicContentSizeWithConstraints(constrainingHeight, constrainingWidth)\n \n \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 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,
|
|
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;
|
|
@@ -152,8 +153,27 @@ export declare class UIView extends UIObject {
|
|
|
152
153
|
};
|
|
153
154
|
constructor(elementID?: string, viewHTMLElement?: HTMLElement & LooseObject | null, elementType?: string | null, initViewData?: any);
|
|
154
155
|
static get nextIndex(): number;
|
|
155
|
-
static
|
|
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;
|
|
156
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;
|
|
157
177
|
centerInContainer(): void;
|
|
158
178
|
centerXInContainer(): void;
|
|
159
179
|
centerYInContainer(): void;
|
|
@@ -123,21 +123,75 @@ const _UIView = class extends import_UIObject.UIObject {
|
|
|
123
123
|
static get nextIndex() {
|
|
124
124
|
return _UIView._UIViewIndex + 1;
|
|
125
125
|
}
|
|
126
|
-
static
|
|
126
|
+
static _initializePageDimensionsCacheIfNeeded() {
|
|
127
|
+
if (this._resizeObserverInitialized) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
this._resizeObserverInitialized = true;
|
|
131
|
+
window.addEventListener("resize", () => {
|
|
132
|
+
this._pageDimensionsCacheValid = false;
|
|
133
|
+
}, { passive: true });
|
|
134
|
+
const bodyObserver = new ResizeObserver(() => {
|
|
135
|
+
this._pageDimensionsCacheValid = false;
|
|
136
|
+
});
|
|
137
|
+
if (document.body) {
|
|
138
|
+
bodyObserver.observe(document.body);
|
|
139
|
+
} else {
|
|
140
|
+
document.addEventListener("DOMContentLoaded", () => {
|
|
141
|
+
bodyObserver.observe(document.body);
|
|
142
|
+
}, { once: true });
|
|
143
|
+
}
|
|
144
|
+
const mutationObserver = new MutationObserver(() => {
|
|
145
|
+
this._pageDimensionsCacheValid = false;
|
|
146
|
+
});
|
|
147
|
+
const observeMutations = () => {
|
|
148
|
+
mutationObserver.observe(document.body, {
|
|
149
|
+
childList: true,
|
|
150
|
+
subtree: true,
|
|
151
|
+
attributes: true,
|
|
152
|
+
attributeFilter: ["style", "class"]
|
|
153
|
+
});
|
|
154
|
+
};
|
|
155
|
+
if (document.body) {
|
|
156
|
+
observeMutations();
|
|
157
|
+
} else {
|
|
158
|
+
document.addEventListener("DOMContentLoaded", observeMutations, { once: true });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
static _updatePageDimensionsCacheIfNeeded() {
|
|
162
|
+
if (this._pageDimensionsCacheValid && this._cachedPageWidth !== void 0 && this._cachedPageHeight !== void 0) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
127
165
|
const body = document.body;
|
|
128
166
|
const html = document.documentElement;
|
|
129
|
-
|
|
167
|
+
this._cachedPageWidth = Math.max(
|
|
168
|
+
body.scrollWidth,
|
|
169
|
+
body.offsetWidth,
|
|
170
|
+
html.clientWidth,
|
|
171
|
+
html.scrollWidth,
|
|
172
|
+
html.offsetWidth
|
|
173
|
+
);
|
|
174
|
+
this._cachedPageHeight = Math.max(
|
|
130
175
|
body.scrollHeight,
|
|
131
176
|
body.offsetHeight,
|
|
132
177
|
html.clientHeight,
|
|
133
178
|
html.scrollHeight,
|
|
134
179
|
html.offsetHeight
|
|
135
180
|
);
|
|
181
|
+
this._pageDimensionsCacheValid = true;
|
|
136
182
|
}
|
|
137
183
|
static get pageWidth() {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
return
|
|
184
|
+
this._initializePageDimensionsCacheIfNeeded();
|
|
185
|
+
this._updatePageDimensionsCacheIfNeeded();
|
|
186
|
+
return this._cachedPageWidth;
|
|
187
|
+
}
|
|
188
|
+
static get pageHeight() {
|
|
189
|
+
this._initializePageDimensionsCacheIfNeeded();
|
|
190
|
+
this._updatePageDimensionsCacheIfNeeded();
|
|
191
|
+
return this._cachedPageHeight;
|
|
192
|
+
}
|
|
193
|
+
static invalidatePageDimensionsCache() {
|
|
194
|
+
this._pageDimensionsCacheValid = false;
|
|
141
195
|
}
|
|
142
196
|
centerInContainer() {
|
|
143
197
|
this.style.left = "50%";
|
|
@@ -542,7 +596,7 @@ const _UIView = class extends import_UIObject.UIObject {
|
|
|
542
596
|
}
|
|
543
597
|
}
|
|
544
598
|
get bounds() {
|
|
545
|
-
var _a, _b, _c, _d, _e;
|
|
599
|
+
var _a, _b, _c, _d, _e, _f;
|
|
546
600
|
let _frame;
|
|
547
601
|
if (!this.isVirtualLayouting) {
|
|
548
602
|
_frame = this._frame;
|
|
@@ -551,18 +605,19 @@ const _UIView = class extends import_UIObject.UIObject {
|
|
|
551
605
|
}
|
|
552
606
|
let result;
|
|
553
607
|
if ((0, import_UIObject.IS_NOT)(_frame)) {
|
|
554
|
-
result = new import_UIRectangle.UIRectangle(
|
|
608
|
+
result = (_e = this._frameCache) != null ? _e : new import_UIRectangle.UIRectangle(
|
|
555
609
|
0,
|
|
556
610
|
0,
|
|
557
611
|
(_b = (_a = this._resizeObserverEntry) == null ? void 0 : _a.contentRect.height) != null ? _b : this.viewHTMLElement.offsetHeight,
|
|
558
612
|
(_d = (_c = this._resizeObserverEntry) == null ? void 0 : _c.contentRect.width) != null ? _d : this.viewHTMLElement.offsetWidth
|
|
559
613
|
);
|
|
614
|
+
this._frameCache = result;
|
|
560
615
|
} else {
|
|
561
616
|
let frame;
|
|
562
617
|
if (!this.isVirtualLayouting) {
|
|
563
618
|
frame = this.frame;
|
|
564
619
|
} else {
|
|
565
|
-
frame = (
|
|
620
|
+
frame = (_f = this._frameForVirtualLayouting) != null ? _f : this.frame;
|
|
566
621
|
}
|
|
567
622
|
result = frame.copy();
|
|
568
623
|
result.x = 0;
|
|
@@ -582,6 +637,7 @@ const _UIView = class extends import_UIObject.UIObject {
|
|
|
582
637
|
}
|
|
583
638
|
didResize(entry) {
|
|
584
639
|
this._resizeObserverEntry = entry;
|
|
640
|
+
this._frameCache = void 0;
|
|
585
641
|
this.setNeedsLayout();
|
|
586
642
|
this.boundsDidChange(new import_UIRectangle.UIRectangle(0, 0, entry.contentRect.height, entry.contentRect.width));
|
|
587
643
|
}
|
|
@@ -2387,6 +2443,8 @@ UIView._onWindowTouchMove = import_UIObject.nil;
|
|
|
2387
2443
|
UIView._onWindowMouseMove = import_UIObject.nil;
|
|
2388
2444
|
UIView._onWindowMouseup = import_UIObject.nil;
|
|
2389
2445
|
UIView._virtualLayoutingDepth = 0;
|
|
2446
|
+
UIView._pageDimensionsCacheValid = false;
|
|
2447
|
+
UIView._resizeObserverInitialized = false;
|
|
2390
2448
|
UIView._transformAttribute = ("transform" in document.documentElement.style ? "transform" : void 0) || ("-webkit-transform" in document.documentElement.style ? "-webkit-transform" : "undefined") || ("-moz-transform" in document.documentElement.style ? "-moz-transform" : "undefined") || ("-ms-transform" in document.documentElement.style ? "-ms-transform" : "undefined") || ("-o-transform" in document.documentElement.style ? "-o-transform" : "undefined");
|
|
2391
2449
|
UIView.constraintAttribute = {
|
|
2392
2450
|
"left": AutoLayout.Attribute.LEFT,
|