uicore-ts 1.1.310 → 1.1.315
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/UILayoutDebugger.d.ts +393 -0
- package/compiledScripts/UILayoutDebugger.js +2535 -0
- package/compiledScripts/UILayoutDebugger.js.map +7 -0
- package/compiledScripts/UITextView.d.ts +17 -0
- package/compiledScripts/UITextView.js +22 -1
- package/compiledScripts/UITextView.js.map +2 -2
- package/compiledScripts/UIView.d.ts +32 -0
- package/compiledScripts/UIView.js +33 -8
- package/compiledScripts/UIView.js.map +2 -2
- package/compiledScripts/UIViewController.js +8 -2
- package/compiledScripts/UIViewController.js.map +2 -2
- package/package.json +1 -1
- package/scripts/UILayoutDebugger.ts +3252 -0
- package/scripts/UITextView.ts +45 -1
- package/scripts/UIView.ts +75 -1
- package/scripts/UIViewController.ts +9 -2
|
@@ -34,6 +34,7 @@ const _UITextView = class extends import_UIView.UIView {
|
|
|
34
34
|
this.textPrefix = "";
|
|
35
35
|
this.textSuffix = "";
|
|
36
36
|
this._notificationAmount = 0;
|
|
37
|
+
this._attentionRequired = false;
|
|
37
38
|
this._thousandsSeparator = null;
|
|
38
39
|
this._textColor = _UITextView.defaultTextColor;
|
|
39
40
|
this._isSingleLine = import_UIObject.YES;
|
|
@@ -192,6 +193,9 @@ const _UITextView = class extends import_UIView.UIView {
|
|
|
192
193
|
if (this.notificationAmount > 0) {
|
|
193
194
|
return false;
|
|
194
195
|
}
|
|
196
|
+
if (this._attentionRequired) {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
195
199
|
const hasComplexHTML = /<(?!\/?(b|i|em|strong|span)\b)[^>]+>/i.test(content);
|
|
196
200
|
if (hasComplexHTML) {
|
|
197
201
|
return false;
|
|
@@ -259,6 +263,17 @@ const _UITextView = class extends import_UIView.UIView {
|
|
|
259
263
|
}
|
|
260
264
|
notificationAmountDidChange(notificationAmount) {
|
|
261
265
|
}
|
|
266
|
+
get attentionRequired() {
|
|
267
|
+
return this._attentionRequired;
|
|
268
|
+
}
|
|
269
|
+
set attentionRequired(attentionRequired) {
|
|
270
|
+
if (this._attentionRequired == attentionRequired) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
this._attentionRequired = attentionRequired;
|
|
274
|
+
this.text = this.text;
|
|
275
|
+
this.setNeedsLayoutUpToRootView();
|
|
276
|
+
}
|
|
262
277
|
get text() {
|
|
263
278
|
return this._text || this.textElementView.viewHTMLElement.innerHTML;
|
|
264
279
|
}
|
|
@@ -268,8 +283,12 @@ const _UITextView = class extends import_UIView.UIView {
|
|
|
268
283
|
if (this.notificationAmount) {
|
|
269
284
|
notificationText = '<span style="color: ' + _UITextView.notificationTextColor.stringValue + ';">' + (" (" + this.notificationAmount + ")").bold() + "</span>";
|
|
270
285
|
}
|
|
286
|
+
var attentionDot = "";
|
|
287
|
+
if (this._attentionRequired) {
|
|
288
|
+
attentionDot = _UITextView.renderAttentionIndicator();
|
|
289
|
+
}
|
|
271
290
|
const displayText = this.thousandsSeparator !== null ? _UITextView.applyThousandsSeparatorToNumericalString(text, this.thousandsSeparator) : text;
|
|
272
|
-
const newInnerHTML = this.textPrefix + (0, import_UIObject.FIRST)(displayText, "") + this.textSuffix + notificationText;
|
|
291
|
+
const newInnerHTML = this.textPrefix + (0, import_UIObject.FIRST)(displayText, "") + this.textSuffix + notificationText + attentionDot;
|
|
273
292
|
if (this.textElementView.viewHTMLElement.innerHTML !== newInnerHTML) {
|
|
274
293
|
this.textElementView.viewHTMLElement.innerHTML = newInnerHTML;
|
|
275
294
|
if (this.changesOften) {
|
|
@@ -541,6 +560,8 @@ const _UITextView = class extends import_UIView.UIView {
|
|
|
541
560
|
let UITextView = _UITextView;
|
|
542
561
|
UITextView.defaultTextColor = import_UIColor.UIColor.blackColor;
|
|
543
562
|
UITextView.notificationTextColor = import_UIColor.UIColor.redColor;
|
|
563
|
+
UITextView.attentionRequiredColor = new import_UIColor.UIColor("#f59e0b");
|
|
564
|
+
UITextView.renderAttentionIndicator = () => '<span style="color: ' + _UITextView.attentionRequiredColor.stringValue + '; margin-left: 4px;">\u25CF</span>';
|
|
544
565
|
UITextView._intrinsicHeightCache = new import_UIObject.UIObject();
|
|
545
566
|
UITextView._intrinsicWidthCache = new import_UIObject.UIObject();
|
|
546
567
|
UITextView.type = {
|
|
@@ -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 { EXTEND, 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 \n constructor(\n elementID?: string,\n textViewType: string | ValueOf<typeof UITextView.type> = UITextView.type.paragraph,\n viewHTMLElement = null\n ) {\n \n // Create inner text element as a UIView\n const innerElementID = elementID ? `${elementID}_textElement` : undefined\n const _textElementView = new UIView(innerElementID, null, textViewType)\n \n // Create outer container (wrapper) - this is the main viewHTMLElement\n super(elementID, viewHTMLElement, \"span\", { _textElementView })\n \n // Configure outer container for vertical centering using direct property access\n \n this.configureWithObject({\n // @ts-ignore\n viewHTMLElement: {\n style: {\n display: \"flex\",\n alignItems: \"center\", // Vertical centering\n overflow: \"hidden\"\n }\n }\n })\n \n this.text = \"\"\n \n this._textElementView = _textElementView\n \n // Configure inner text element for ellipsis and positioning\n this._textElementView.configureWithObject({\n style: {\n position: \"relative\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n width: \"100%\",\n margin: \"0\",\n padding: \"0\"\n },\n // Forward control events from text element to the container\n sendControlEventForKey: EXTEND(this.sendControlEventForKey.bind(this))\n })\n \n // Add text element as a subview\n this.addSubview(this._textElementView)\n \n \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 Text Element View Property\n \n private _textElementView: UIView\n \n /**\n * The inner text element that holds the actual text content\n */\n get textElementView(): UIView {\n return this._textElementView\n }\n \n /**\n * Override style to apply to the text element instead of the container\n */\n // override get style() {\n // return this._textElementView.style\n // }\n //\n // /**\n // * Override computedStyle to get computed styles from the text element\n // */\n // override get computedStyle() {\n // return this._textElementView.computedStyle\n // }\n \n /**\n * Access the outer container's style (for positioning, layout, etc.)\n */\n get containerStyle() {\n return this.viewHTMLElement.style\n }\n \n /**\n * Override styleClasses to apply to the text element\n */\n override get styleClasses() {\n return this._textElementView.styleClasses\n }\n \n override set styleClasses(styleClasses: string[]) {\n this._textElementView.styleClasses = styleClasses\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 documentFontsDidLoad() {\n super.documentFontsDidLoad()\n this._invalidateFontCache()\n this.invalidateMeasurementStrategy()\n this._intrinsicHeightCache = new UIObject() as any\n this._intrinsicWidthCache = new UIObject() as any\n UITextView._intrinsicHeightCache = new UIObject() as any\n UITextView._intrinsicWidthCache = new UIObject() as any\n }\n \n \n override layoutSubviews() {\n super.layoutSubviews()\n \n if (this._automaticFontSizeSelection) {\n this.fontSize = UITextView.automaticallyCalculatedFontSize(\n new UIRectangle(\n 0,\n 0,\n this.textElementView.viewHTMLElement.offsetHeight,\n this.textElementView.viewHTMLElement.offsetWidth\n ),\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.textElementView.viewHTMLElement)\n this._intrinsicSizesCache = {}\n }\n \n private _getMeasurementStyles(): TextMeasurementStyle | null {\n if (this._cachedMeasurementStyles) {\n return this._cachedMeasurementStyles\n }\n \n // Ensure element is in document\n if (!this.textElementView.viewHTMLElement.isConnected) {\n return null\n }\n \n // Force a layout flush ONCE to ensure computed styles are available\n // This is only paid once per style change, then we use cached values\n this.textElementView.viewHTMLElement.offsetHeight\n \n const computed = window.getComputedStyle(this.textElementView.viewHTMLElement)\n const fontSizeStr = computed.fontSize\n const fontSize = parseFloat(fontSizeStr)\n \n if (!fontSize || isNaN(fontSize)) {\n return null\n }\n \n const lineHeight = this._parseLineHeight(computed.lineHeight, fontSize)\n \n if (isNaN(lineHeight)) {\n return null\n }\n \n const font = [\n computed.fontStyle || \"normal\",\n computed.fontVariant || \"normal\",\n computed.fontWeight || \"normal\",\n fontSize + \"px\",\n computed.fontFamily || \"sans-serif\"\n ].join(\" \")\n \n this._cachedMeasurementStyles = {\n font: font,\n fontSize: fontSize,\n lineHeight: lineHeight,\n whiteSpace: computed.whiteSpace || \"normal\",\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 letterSpacing: parseFloat(computed.letterSpacing) || 0,\n textTransform: computed.textTransform || \"none\"\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.textElementView.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)\\b)[^>]+>/i.test(content)\n \n if (hasComplexHTML) {\n return false\n }\n \n // Canvas measureText silently falls back to the system font when the\n // custom font hasn't been loaded into the canvas font system yet, even\n // if getComputedStyle already reports the correct font family. Guard\n // against this by checking the font is confirmed available before\n // trusting canvas-based measurement.\n const styles = this._getMeasurementStyles()\n if (styles && !document.fonts.check(styles.font)) {\n return false\n }\n \n return true\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 return this._textElementView.style.textAlign as ValueOf<typeof UITextView.textAlignment>\n }\n \n set textAlignment(textAlignment: ValueOf<typeof UITextView.textAlignment>) {\n this._textAlignment = textAlignment\n this._textElementView.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._textElementView.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 // Single line: use nowrap with ellipsis\n this._textElementView.style.whiteSpace = \"nowrap\"\n this._textElementView.style.textOverflow = \"ellipsis\"\n this._textElementView.style.display = \"\"\n this._textElementView.style.webkitLineClamp = \"\"\n this._textElementView.style.webkitBoxOrient = \"\"\n return\n }\n \n // Multiline: allow wrapping, but still show ellipsis if content overflows the container\n // This uses the -webkit-line-clamp approach which works for multiline ellipsis\n this._textElementView.style.whiteSpace = \"normal\"\n this._textElementView.style.textOverflow = \"ellipsis\"\n this._textElementView.style.display = \"-webkit-box\"\n this._textElementView.style.webkitBoxOrient = \"vertical\"\n // Don't set line-clamp to a specific number - let it fill available space\n // The overflow: hidden from the constructor will clip content that exceeds the height\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.textElementView.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 const displayText = this.thousandsSeparator !== null\n ? UITextView.applyThousandsSeparatorToNumericalString(text, this.thousandsSeparator)\n : text\n \n const newInnerHTML = this.textPrefix + FIRST(displayText, \"\") + this.textSuffix + notificationText\n \n if (this.textElementView.viewHTMLElement.innerHTML !== newInnerHTML) {\n this.textElementView.viewHTMLElement.innerHTML = newInnerHTML\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 this.setNeedsLayout()\n }\n }\n \n \n /**\n * Formats a raw number string by inserting `separator` every three digits\n * in the integer part. Handles negative numbers and decimals (machine locale\n * \".\" as decimal point). Non-numeric strings are returned unchanged.\n */\n static applyThousandsSeparatorToNumericalString(value: string, separator: string): string {\n const trimmed = (value || \"\").trim()\n if (trimmed === \"\") {\n return value\n }\n \n // Split on the decimal point (machine locale uses \".\")\n const parts = trimmed.split(\".\")\n const integerPart = parts[0]\n const decimalPart = parts.length > 1 ? parts[1] : null\n \n // Only format if the integer part consists solely of digits (optionally\n // prefixed with a minus sign). Non-numeric strings pass through as-is.\n if (!/^-?\\d+$/.test(integerPart)) {\n return value\n }\n \n const isNegative = integerPart.startsWith(\"-\")\n const digits = isNegative ? integerPart.slice(1) : integerPart\n \n let formatted = \"\"\n const offset = digits.length % 3\n for (let index = 0; index < digits.length; index++) {\n if (index > 0 && (index - offset) % 3 === 0) {\n formatted += separator\n }\n formatted += digits[index]\n }\n \n const result = (isNegative ? \"-\" : \"\") + formatted\n return decimalPart !== null ? result + \".\" + decimalPart : result\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.textElementView.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._textElementView.style.fontSize || window.getComputedStyle(this._textElementView.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._textElementView.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._textElementView.style.fontSize || \"\",\n fontFamily: this._textElementView.style.fontFamily || \"\",\n fontWeight: this._textElementView.style.fontWeight || \"\",\n fontStyle: this._textElementView.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._textElementView.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 _thousandsSeparator: string | null = null\n \n get thousandsSeparator(): string | null {\n return this._thousandsSeparator\n }\n \n set thousandsSeparator(value: string | null) {\n this._thousandsSeparator = value\n }\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: \"\",\n fontFamily: \"\",\n fontWeight: \"\",\n fontStyle: \"\",\n styleClasses: \"\"\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 | null\n \n override usesVirtualLayoutingForIntrinsicSizing = NO\n \n //#endregion\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 // Override focus to focus the text element\n override focus() {\n this._textElementView.focus()\n }\n \n // Override blur to blur the text element\n override blur() {\n this._textElementView.blur()\n }\n \n override intrinsicContentHeight(constrainingWidth = 0) {\n \n constrainingWidth = Math.max(constrainingWidth.integerValue, 0)\n \n const keyPath = ((this.textElementView.viewHTMLElement.innerHTML || this.text) + \"_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 // Determine if we should use fast measurement\n const shouldUseFastPath = this._useFastMeasurement ?? this._shouldUseFastMeasurement()\n \n if (shouldUseFastPath) {\n // Fast path: use UITextMeasurement with pre-extracted styles\n const styles = this._getMeasurementStyles()\n \n // If styles are invalid (element not properly initialized), fall back to DOM\n if (styles) {\n const size = UITextMeasurement.calculateTextSize(\n this.textElementView.viewHTMLElement,\n ((this.text || this.textElementView.innerHTML || \"\") + \"\"),\n constrainingWidth || undefined,\n undefined,\n styles\n )\n result = size.height\n }\n else {\n // Styles not ready, use DOM measurement\n result = super.intrinsicContentHeight(constrainingWidth)\n }\n }\n else {\n // Fallback: DOM-based measurement for complex content\n result = super.intrinsicContentHeight(constrainingWidth)\n }\n \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 constrainingHeight = Math.max(constrainingHeight.integerValue, 0)\n \n const keyPath = ((this.textElementView.viewHTMLElement.innerHTML || this.text) + \"_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 // Determine if we should use fast measurement\n const shouldUseFastPath = this._useFastMeasurement ?? this._shouldUseFastMeasurement()\n \n if (shouldUseFastPath) {\n // Fast path: use UITextMeasurement with pre-extracted styles\n const styles = this._getMeasurementStyles()\n \n // If styles are invalid (element not properly initialized), fall back to DOM\n if (styles) {\n const size = UITextMeasurement.calculateTextSize(\n this.textElementView.viewHTMLElement,\n ((this.text || this.textElementView.innerHTML || \"\") + \"\").replace(/<br\\s*\\/?>/gi, \"\\n\"),\n undefined,\n constrainingHeight || undefined,\n styles\n )\n result = size.width\n }\n else {\n // Styles not ready, use DOM measurement\n result = super.intrinsicContentWidth(constrainingHeight)\n }\n }\n else {\n // Fallback: DOM-based measurement for complex content\n result = super.intrinsicContentWidth(constrainingHeight)\n }\n \n cacheObject.setValueForKeyPath(keyPath, result)\n }\n \n return result\n }\n \n \n override intrinsicContentSizeWithConstraints(constrainingHeight: number = 0, constrainingWidth: number = 0) {\n \n const cacheKey = this._getIntrinsicSizeCacheKey(constrainingHeight, constrainingWidth)\n const cachedResult = this._getCachedIntrinsicSize(cacheKey)\n if (cachedResult) {\n return cachedResult\n }\n \n // UITextView needs to measure the text element, not the outer container\n const result = new UIRectangle(0, 0, 0, 0)\n if (this.rootView.forceIntrinsicSizeZero) {\n return result\n }\n \n let temporarilyInViewTree = NO\n let nodeAboveThisView: Node | null = null\n if (!this.isMemberOfViewTree) {\n document.body.appendChild(this.viewHTMLElement)\n temporarilyInViewTree = YES\n nodeAboveThisView = this.viewHTMLElement.nextSibling\n }\n \n // Save and clear styles on the TEXT ELEMENT (not the container)\n const height = this._textElementView.style.height\n const width = this._textElementView.style.width\n \n this._textElementView.style.height = \"\" + constrainingHeight + \"px\"\n this._textElementView.style.width = \"\" + constrainingWidth + \"px\"\n \n const left = this._textElementView.style.left\n const right = this._textElementView.style.right\n const bottom = this._textElementView.style.bottom\n const top = this._textElementView.style.top\n \n this._textElementView.style.left = \"\"\n this._textElementView.style.right = \"\"\n this._textElementView.style.bottom = \"\"\n this._textElementView.style.top = \"\"\n \n // Measure height with the text element\n const resultHeight = this._textElementView.viewHTMLElement.scrollHeight\n \n // Measure width by temporarily setting nowrap\n const whiteSpace = this._textElementView.style.whiteSpace\n this._textElementView.style.whiteSpace = \"nowrap\"\n \n const resultWidth = this._textElementView.viewHTMLElement.scrollWidth\n \n this._textElementView.style.whiteSpace = whiteSpace\n \n // Restore styles on the TEXT ELEMENT\n this._textElementView.style.height = height\n this._textElementView.style.width = width\n \n this._textElementView.style.left = left\n this._textElementView.style.right = right\n this._textElementView.style.bottom = bottom\n this._textElementView.style.top = top\n \n if (temporarilyInViewTree) {\n document.body.removeChild(this.viewHTMLElement)\n if (this.superview) {\n if (nodeAboveThisView) {\n this.superview.viewHTMLElement.insertBefore(this.viewHTMLElement, nodeAboveThisView)\n }\n else {\n this.superview.viewHTMLElement.appendChild(this.viewHTMLElement)\n }\n }\n }\n \n result.height = resultHeight\n result.width = resultWidth\n \n this._setCachedIntrinsicSize(cacheKey, result)\n \n return result\n }\n \n \n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { UIColor } from \"./UIColor\"\nimport { UILocalizedTextObject } from \"./UIInterfaces\"\nimport { EXTEND, 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 static attentionRequiredColor = new UIColor(\"#f59e0b\")\n \n /**\n * Override this to customise the attention indicator HTML that is appended\n * to a label's text when `attentionRequired` is `true`.\n *\n * The default renders an amber `\u25CF` dot:\n * ```\n * UITextView.renderAttentionIndicator = () =>\n * `<span style=\"color: #f59e0b; margin-left: 4px;\">\u25CF</span>`\n * ```\n * Call sites never need to change \u2014 only this one function needs to be\n * replaced at app startup to restyle every attention indicator globally.\n */\n static renderAttentionIndicator: () => string = () =>\n \"<span style=\\\"color: \" + UITextView.attentionRequiredColor.stringValue + \"; margin-left: 4px;\\\">\u25CF</span>\"\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 \n constructor(\n elementID?: string,\n textViewType: string | ValueOf<typeof UITextView.type> = UITextView.type.paragraph,\n viewHTMLElement = null\n ) {\n \n // Create inner text element as a UIView\n const innerElementID = elementID ? `${elementID}_textElement` : undefined\n const _textElementView = new UIView(innerElementID, null, textViewType)\n \n // Create outer container (wrapper) - this is the main viewHTMLElement\n super(elementID, viewHTMLElement, \"span\", { _textElementView })\n \n // Configure outer container for vertical centering using direct property access\n \n this.configureWithObject({\n // @ts-ignore\n viewHTMLElement: {\n style: {\n display: \"flex\",\n alignItems: \"center\", // Vertical centering\n overflow: \"hidden\"\n }\n }\n })\n \n this.text = \"\"\n \n this._textElementView = _textElementView\n \n // Configure inner text element for ellipsis and positioning\n this._textElementView.configureWithObject({\n style: {\n position: \"relative\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n width: \"100%\",\n margin: \"0\",\n padding: \"0\"\n },\n // Forward control events from text element to the container\n sendControlEventForKey: EXTEND(this.sendControlEventForKey.bind(this))\n })\n \n // Add text element as a subview\n this.addSubview(this._textElementView)\n \n \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 Text Element View Property\n \n private _textElementView: UIView\n \n /**\n * The inner text element that holds the actual text content\n */\n get textElementView(): UIView {\n return this._textElementView\n }\n \n /**\n * Override style to apply to the text element instead of the container\n */\n // override get style() {\n // return this._textElementView.style\n // }\n //\n // /**\n // * Override computedStyle to get computed styles from the text element\n // */\n // override get computedStyle() {\n // return this._textElementView.computedStyle\n // }\n \n /**\n * Access the outer container's style (for positioning, layout, etc.)\n */\n get containerStyle() {\n return this.viewHTMLElement.style\n }\n \n /**\n * Override styleClasses to apply to the text element\n */\n override get styleClasses() {\n return this._textElementView.styleClasses\n }\n \n override set styleClasses(styleClasses: string[]) {\n this._textElementView.styleClasses = styleClasses\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 documentFontsDidLoad() {\n super.documentFontsDidLoad()\n this._invalidateFontCache()\n this.invalidateMeasurementStrategy()\n this._intrinsicHeightCache = new UIObject() as any\n this._intrinsicWidthCache = new UIObject() as any\n UITextView._intrinsicHeightCache = new UIObject() as any\n UITextView._intrinsicWidthCache = new UIObject() as any\n }\n \n \n override layoutSubviews() {\n super.layoutSubviews()\n \n if (this._automaticFontSizeSelection) {\n this.fontSize = UITextView.automaticallyCalculatedFontSize(\n new UIRectangle(\n 0,\n 0,\n this.textElementView.viewHTMLElement.offsetHeight,\n this.textElementView.viewHTMLElement.offsetWidth\n ),\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.textElementView.viewHTMLElement)\n this._intrinsicSizesCache = {}\n }\n \n private _getMeasurementStyles(): TextMeasurementStyle | null {\n if (this._cachedMeasurementStyles) {\n return this._cachedMeasurementStyles\n }\n \n // Ensure element is in document\n if (!this.textElementView.viewHTMLElement.isConnected) {\n return null\n }\n \n // Force a layout flush ONCE to ensure computed styles are available\n // This is only paid once per style change, then we use cached values\n this.textElementView.viewHTMLElement.offsetHeight\n \n const computed = window.getComputedStyle(this.textElementView.viewHTMLElement)\n const fontSizeStr = computed.fontSize\n const fontSize = parseFloat(fontSizeStr)\n \n if (!fontSize || isNaN(fontSize)) {\n return null\n }\n \n const lineHeight = this._parseLineHeight(computed.lineHeight, fontSize)\n \n if (isNaN(lineHeight)) {\n return null\n }\n \n const font = [\n computed.fontStyle || \"normal\",\n computed.fontVariant || \"normal\",\n computed.fontWeight || \"normal\",\n fontSize + \"px\",\n computed.fontFamily || \"sans-serif\"\n ].join(\" \")\n \n this._cachedMeasurementStyles = {\n font: font,\n fontSize: fontSize,\n lineHeight: lineHeight,\n whiteSpace: computed.whiteSpace || \"normal\",\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 letterSpacing: parseFloat(computed.letterSpacing) || 0,\n textTransform: computed.textTransform || \"none\"\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.textElementView.innerHTML\n \n if (this._innerHTMLKey || this._localizedTextObject) {\n return false\n }\n \n if (this.notificationAmount > 0) {\n return false\n }\n \n if (this._attentionRequired) {\n return false\n }\n \n const hasComplexHTML = /<(?!\\/?(b|i|em|strong|span)\\b)[^>]+>/i.test(content)\n \n if (hasComplexHTML) {\n return false\n }\n \n // Canvas measureText silently falls back to the system font when the\n // custom font hasn't been loaded into the canvas font system yet, even\n // if getComputedStyle already reports the correct font family. Guard\n // against this by checking the font is confirmed available before\n // trusting canvas-based measurement.\n const styles = this._getMeasurementStyles()\n if (styles && !document.fonts.check(styles.font)) {\n return false\n }\n \n return true\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 return this._textElementView.style.textAlign as ValueOf<typeof UITextView.textAlignment>\n }\n \n set textAlignment(textAlignment: ValueOf<typeof UITextView.textAlignment>) {\n this._textAlignment = textAlignment\n this._textElementView.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._textElementView.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 // Single line: use nowrap with ellipsis\n this._textElementView.style.whiteSpace = \"nowrap\"\n this._textElementView.style.textOverflow = \"ellipsis\"\n this._textElementView.style.display = \"\"\n this._textElementView.style.webkitLineClamp = \"\"\n this._textElementView.style.webkitBoxOrient = \"\"\n return\n }\n \n // Multiline: allow wrapping, but still show ellipsis if content overflows the container\n // This uses the -webkit-line-clamp approach which works for multiline ellipsis\n this._textElementView.style.whiteSpace = \"normal\"\n this._textElementView.style.textOverflow = \"ellipsis\"\n this._textElementView.style.display = \"-webkit-box\"\n this._textElementView.style.webkitBoxOrient = \"vertical\"\n // Don't set line-clamp to a specific number - let it fill available space\n // The overflow: hidden from the constructor will clip content that exceeds the height\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 - Attention Required\n \n get attentionRequired() {\n return this._attentionRequired\n }\n \n set attentionRequired(attentionRequired: boolean) {\n if (this._attentionRequired == attentionRequired) {\n return\n }\n \n this._attentionRequired = attentionRequired\n this.text = this.text\n this.setNeedsLayoutUpToRootView()\n }\n \n //#endregion\n \n //#region Getters & Setters - Text Content\n \n get text() {\n return (this._text || this.textElementView.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 var attentionDot = \"\"\n if (this._attentionRequired) {\n attentionDot = UITextView.renderAttentionIndicator()\n }\n \n const displayText = this.thousandsSeparator !== null\n ? UITextView.applyThousandsSeparatorToNumericalString(text, this.thousandsSeparator)\n : text\n \n const newInnerHTML = this.textPrefix + FIRST(displayText, \"\") + this.textSuffix + notificationText + attentionDot\n \n if (this.textElementView.viewHTMLElement.innerHTML !== newInnerHTML) {\n this.textElementView.viewHTMLElement.innerHTML = newInnerHTML\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 this.setNeedsLayout()\n }\n }\n \n \n /**\n * Formats a raw number string by inserting `separator` every three digits\n * in the integer part. Handles negative numbers and decimals (machine locale\n * \".\" as decimal point). Non-numeric strings are returned unchanged.\n */\n static applyThousandsSeparatorToNumericalString(value: string, separator: string): string {\n const trimmed = (value || \"\").trim()\n if (trimmed === \"\") {\n return value\n }\n \n // Split on the decimal point (machine locale uses \".\")\n const parts = trimmed.split(\".\")\n const integerPart = parts[0]\n const decimalPart = parts.length > 1 ? parts[1] : null\n \n // Only format if the integer part consists solely of digits (optionally\n // prefixed with a minus sign). Non-numeric strings pass through as-is.\n if (!/^-?\\d+$/.test(integerPart)) {\n return value\n }\n \n const isNegative = integerPart.startsWith(\"-\")\n const digits = isNegative ? integerPart.slice(1) : integerPart\n \n let formatted = \"\"\n const offset = digits.length % 3\n for (let index = 0; index < digits.length; index++) {\n if (index > 0 && (index - offset) % 3 === 0) {\n formatted += separator\n }\n formatted += digits[index]\n }\n \n const result = (isNegative ? \"-\" : \"\") + formatted\n return decimalPart !== null ? result + \".\" + decimalPart : result\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.textElementView.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._textElementView.style.fontSize || window.getComputedStyle(this._textElementView.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._textElementView.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._textElementView.style.fontSize || \"\",\n fontFamily: this._textElementView.style.fontFamily || \"\",\n fontWeight: this._textElementView.style.fontWeight || \"\",\n fontStyle: this._textElementView.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._textElementView.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 _attentionRequired = false\n \n _thousandsSeparator: string | null = null\n \n get thousandsSeparator(): string | null {\n return this._thousandsSeparator\n }\n \n set thousandsSeparator(value: string | null) {\n this._thousandsSeparator = value\n }\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: \"\",\n fontFamily: \"\",\n fontWeight: \"\",\n fontStyle: \"\",\n styleClasses: \"\"\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 | null\n \n override usesVirtualLayoutingForIntrinsicSizing = NO\n \n //#endregion\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 // Override focus to focus the text element\n override focus() {\n this._textElementView.focus()\n }\n \n // Override blur to blur the text element\n override blur() {\n this._textElementView.blur()\n }\n \n override intrinsicContentHeight(constrainingWidth = 0) {\n \n constrainingWidth = Math.max(constrainingWidth.integerValue, 0)\n \n const keyPath = ((this.textElementView.viewHTMLElement.innerHTML || this.text) + \"_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 // Determine if we should use fast measurement\n const shouldUseFastPath = this._useFastMeasurement ?? this._shouldUseFastMeasurement()\n \n if (shouldUseFastPath) {\n // Fast path: use UITextMeasurement with pre-extracted styles\n const styles = this._getMeasurementStyles()\n \n // If styles are invalid (element not properly initialized), fall back to DOM\n if (styles) {\n const size = UITextMeasurement.calculateTextSize(\n this.textElementView.viewHTMLElement,\n ((this.text || this.textElementView.innerHTML || \"\") + \"\"),\n constrainingWidth || undefined,\n undefined,\n styles\n )\n result = size.height\n }\n else {\n // Styles not ready, use DOM measurement\n result = super.intrinsicContentHeight(constrainingWidth)\n }\n }\n else {\n // Fallback: DOM-based measurement for complex content\n result = super.intrinsicContentHeight(constrainingWidth)\n }\n \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 constrainingHeight = Math.max(constrainingHeight.integerValue, 0)\n \n const keyPath = ((this.textElementView.viewHTMLElement.innerHTML || this.text) + \"_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 // Determine if we should use fast measurement\n const shouldUseFastPath = this._useFastMeasurement ?? this._shouldUseFastMeasurement()\n \n if (shouldUseFastPath) {\n // Fast path: use UITextMeasurement with pre-extracted styles\n const styles = this._getMeasurementStyles()\n \n // If styles are invalid (element not properly initialized), fall back to DOM\n if (styles) {\n const size = UITextMeasurement.calculateTextSize(\n this.textElementView.viewHTMLElement,\n ((this.text || this.textElementView.innerHTML || \"\") + \"\").replace(/<br\\s*\\/?>/gi, \"\\n\"),\n undefined,\n constrainingHeight || undefined,\n styles\n )\n result = size.width\n }\n else {\n // Styles not ready, use DOM measurement\n result = super.intrinsicContentWidth(constrainingHeight)\n }\n }\n else {\n // Fallback: DOM-based measurement for complex content\n result = super.intrinsicContentWidth(constrainingHeight)\n }\n \n cacheObject.setValueForKeyPath(keyPath, result)\n }\n \n return result\n }\n \n \n override intrinsicContentSizeWithConstraints(constrainingHeight: number = 0, constrainingWidth: number = 0) {\n \n const cacheKey = this._getIntrinsicSizeCacheKey(constrainingHeight, constrainingWidth)\n const cachedResult = this._getCachedIntrinsicSize(cacheKey)\n if (cachedResult) {\n return cachedResult\n }\n \n // UITextView needs to measure the text element, not the outer container\n const result = new UIRectangle(0, 0, 0, 0)\n if (this.rootView.forceIntrinsicSizeZero) {\n return result\n }\n \n let temporarilyInViewTree = NO\n let nodeAboveThisView: Node | null = null\n if (!this.isMemberOfViewTree) {\n document.body.appendChild(this.viewHTMLElement)\n temporarilyInViewTree = YES\n nodeAboveThisView = this.viewHTMLElement.nextSibling\n }\n \n // Save and clear styles on the TEXT ELEMENT (not the container)\n const height = this._textElementView.style.height\n const width = this._textElementView.style.width\n \n this._textElementView.style.height = \"\" + constrainingHeight + \"px\"\n this._textElementView.style.width = \"\" + constrainingWidth + \"px\"\n \n const left = this._textElementView.style.left\n const right = this._textElementView.style.right\n const bottom = this._textElementView.style.bottom\n const top = this._textElementView.style.top\n \n this._textElementView.style.left = \"\"\n this._textElementView.style.right = \"\"\n this._textElementView.style.bottom = \"\"\n this._textElementView.style.top = \"\"\n \n // Measure height with the text element\n const resultHeight = this._textElementView.viewHTMLElement.scrollHeight\n \n // Measure width by temporarily setting nowrap\n const whiteSpace = this._textElementView.style.whiteSpace\n this._textElementView.style.whiteSpace = \"nowrap\"\n \n const resultWidth = this._textElementView.viewHTMLElement.scrollWidth\n \n this._textElementView.style.whiteSpace = whiteSpace\n \n // Restore styles on the TEXT ELEMENT\n this._textElementView.style.height = height\n this._textElementView.style.width = width\n \n this._textElementView.style.left = left\n this._textElementView.style.right = right\n this._textElementView.style.bottom = bottom\n this._textElementView.style.top = top\n \n if (temporarilyInViewTree) {\n document.body.removeChild(this.viewHTMLElement)\n if (this.superview) {\n if (nodeAboveThisView) {\n this.superview.viewHTMLElement.insertBefore(this.viewHTMLElement, nodeAboveThisView)\n }\n else {\n this.superview.viewHTMLElement.appendChild(this.viewHTMLElement)\n }\n }\n }\n \n result.height = resultHeight\n result.width = resultWidth\n \n this._setCachedIntrinsicSize(cacheKey, result)\n \n return result\n }\n \n \n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -518,5 +518,37 @@ export declare class UIView extends UIObject {
|
|
|
518
518
|
intrinsicContentWidth(constrainingHeight?: number): number;
|
|
519
519
|
intrinsicContentHeight(constrainingWidth?: number): number;
|
|
520
520
|
intrinsicContentSize(): UIRectangle;
|
|
521
|
+
/**
|
|
522
|
+
* ⚠️ NUCLEAR OPTION — DO NOT CALL IN NORMAL CODE ⚠️
|
|
523
|
+
*
|
|
524
|
+
* Performs a full-scorched-earth cache purge across the entire view subtree rooted
|
|
525
|
+
* at `this`, then drives an immediate synchronous layout pass, as if the app had
|
|
526
|
+
* just cold-started.
|
|
527
|
+
*
|
|
528
|
+
* What gets destroyed:
|
|
529
|
+
* • Every per-instance intrinsic-size cache entry (`_intrinsicSizesCache`)
|
|
530
|
+
* • Every shared intrinsic-size cache bucket (`UIView._sharedIntrinsicSizeCaches`)
|
|
531
|
+
* • Every frame cache (`_frameCache`) and virtual-layout frame cache
|
|
532
|
+
* (`_frameCacheForVirtualLayouting`) on every view in the subtree
|
|
533
|
+
* • Every UITextMeasurement style cache (canvas glyph metrics,
|
|
534
|
+
* computed-style snapshots, etc.)
|
|
535
|
+
*
|
|
536
|
+
* After the purge every view in the subtree is unconditionally marked dirty via
|
|
537
|
+
* `setNeedsLayout()`, then `UIView.layoutViewsIfNeeded()` is called immediately
|
|
538
|
+
* to flush the queue rather than waiting for the next rAF tick.
|
|
539
|
+
*
|
|
540
|
+
* Legitimate uses (exhaustive list):
|
|
541
|
+
* - Recovery from a confirmed cache-corruption bug while a proper fix ships
|
|
542
|
+
* - Test harness reset between isolated rendering assertions
|
|
543
|
+
* - Post-hot-module-replacement refresh in development tooling
|
|
544
|
+
*
|
|
545
|
+
* Do NOT use this to fix a layout glitch you don't understand.
|
|
546
|
+
* Fix the root cause instead. If you find yourself calling this in production
|
|
547
|
+
* code for any reason other than the above, that is a bug — file it.
|
|
548
|
+
*
|
|
549
|
+
* Complexity: O(n) where n = total views in the subtree.
|
|
550
|
+
* All shared caches are wiped globally, not just for the subtree.
|
|
551
|
+
*/
|
|
552
|
+
performForcedSubtreeLayout(): void;
|
|
521
553
|
}
|
|
522
554
|
export {};
|
|
@@ -1121,7 +1121,7 @@ const _UIView = class extends import_UIObject.UIObject {
|
|
|
1121
1121
|
});
|
|
1122
1122
|
}
|
|
1123
1123
|
static layoutViewsIfNeeded() {
|
|
1124
|
-
var _a, _b, _c, _d;
|
|
1124
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
1125
1125
|
if (!_UIView._isLayoutViewsIfNeededScheduled) {
|
|
1126
1126
|
_UIView.scheduleLayoutViewsIfNeeded();
|
|
1127
1127
|
}
|
|
@@ -1129,11 +1129,13 @@ const _UIView = class extends import_UIObject.UIObject {
|
|
|
1129
1129
|
return;
|
|
1130
1130
|
}
|
|
1131
1131
|
(_a = window.UILayoutCycleTracer) == null ? void 0 : _a.willBeginLayoutPass();
|
|
1132
|
+
(_b = window.UILayoutDebugger) == null ? void 0 : _b.willBeginLayoutPass(_UIView._viewsToLayout);
|
|
1132
1133
|
const maxIterations = 10;
|
|
1133
1134
|
let iteration = 0;
|
|
1134
1135
|
const layoutCounts = /* @__PURE__ */ new Map();
|
|
1135
1136
|
while (_UIView._viewsToLayout.length > 0 && iteration < maxIterations) {
|
|
1136
|
-
(
|
|
1137
|
+
(_c = window.UILayoutCycleTracer) == null ? void 0 : _c.willBeginIteration(iteration);
|
|
1138
|
+
(_d = window.UILayoutDebugger) == null ? void 0 : _d.willBeginIteration(iteration);
|
|
1137
1139
|
const viewsToProcess = _UIView._viewsToLayout;
|
|
1138
1140
|
_UIView._viewsToLayout = [];
|
|
1139
1141
|
const viewDepthMap = /* @__PURE__ */ new Map();
|
|
@@ -1154,16 +1156,22 @@ const _UIView = class extends import_UIObject.UIObject {
|
|
|
1154
1156
|
});
|
|
1155
1157
|
for (let i = 0; i < sortedViews.length; i++) {
|
|
1156
1158
|
const view = sortedViews[i];
|
|
1159
|
+
(_e = window.UILayoutDebugger) == null ? void 0 : _e.willLayoutView(view);
|
|
1160
|
+
if ((_f = window.UILayoutDebugger) == null ? void 0 : _f._shouldHitBreakpoint(view)) {
|
|
1161
|
+
const breakpointOnThisLine = "Add a breakpoint on this line to step through layout.";
|
|
1162
|
+
}
|
|
1157
1163
|
view.layoutIfNeeded();
|
|
1158
1164
|
layoutCounts.set(view, (layoutCounts.get(view) || 0) + 1);
|
|
1159
|
-
(
|
|
1165
|
+
(_g = window.UILayoutCycleTracer) == null ? void 0 : _g.didLayoutView(view);
|
|
1166
|
+
(_h = window.UILayoutDebugger) == null ? void 0 : _h.didLayoutView(view);
|
|
1160
1167
|
}
|
|
1161
1168
|
iteration++;
|
|
1162
1169
|
}
|
|
1163
|
-
(
|
|
1170
|
+
(_i = window.UILayoutCycleTracer) == null ? void 0 : _i.didFinishLayoutPass(iteration);
|
|
1171
|
+
(_j = window.UILayoutDebugger) == null ? void 0 : _j.didFinishLayoutPass(iteration);
|
|
1164
1172
|
}
|
|
1165
1173
|
setNeedsLayout() {
|
|
1166
|
-
var _a;
|
|
1174
|
+
var _a, _b;
|
|
1167
1175
|
if (this._shouldLayout && _UIView._viewsToLayout.contains(this)) {
|
|
1168
1176
|
return;
|
|
1169
1177
|
}
|
|
@@ -1171,6 +1179,7 @@ const _UIView = class extends import_UIObject.UIObject {
|
|
|
1171
1179
|
_UIView._viewsToLayout.push(this);
|
|
1172
1180
|
this.clearIntrinsicSizeCache();
|
|
1173
1181
|
(_a = window.UILayoutCycleTracer) == null ? void 0 : _a.viewDidCallSetNeedsLayout(this);
|
|
1182
|
+
(_b = window.UILayoutDebugger) == null ? void 0 : _b.viewDidCallSetNeedsLayout(this);
|
|
1174
1183
|
if (!_UIView._isLayoutViewsIfNeededScheduled) {
|
|
1175
1184
|
_UIView.scheduleLayoutViewsIfNeeded();
|
|
1176
1185
|
}
|
|
@@ -1186,7 +1195,7 @@ const _UIView = class extends import_UIObject.UIObject {
|
|
|
1186
1195
|
this._shouldLayout = import_UIObject.NO;
|
|
1187
1196
|
}
|
|
1188
1197
|
try {
|
|
1189
|
-
if (this.bounds.width < 0) {
|
|
1198
|
+
if (this.bounds.width < 0 || !this.isVirtualLayouting && !this.isMemberOfViewTree) {
|
|
1190
1199
|
return;
|
|
1191
1200
|
}
|
|
1192
1201
|
this.layoutSubviews();
|
|
@@ -1195,7 +1204,7 @@ const _UIView = class extends import_UIObject.UIObject {
|
|
|
1195
1204
|
}
|
|
1196
1205
|
}
|
|
1197
1206
|
layoutSubviews() {
|
|
1198
|
-
var _a, _b, _c, _d;
|
|
1207
|
+
var _a, _b, _c, _d, _e, _f;
|
|
1199
1208
|
this.willLayoutSubviews();
|
|
1200
1209
|
if (!this.isVirtualLayouting) {
|
|
1201
1210
|
this._shouldLayout = import_UIObject.NO;
|
|
@@ -1206,10 +1215,12 @@ const _UIView = class extends import_UIObject.UIObject {
|
|
|
1206
1215
|
(_b = this._updateLayoutFunction) == null ? void 0 : _b.call(this);
|
|
1207
1216
|
(_c = this.viewController) == null ? void 0 : _c.layoutViewSubviews();
|
|
1208
1217
|
this.applyClassesAndStyles();
|
|
1209
|
-
|
|
1218
|
+
(_d = window.UILayoutDebugger) == null ? void 0 : _d.willSetSubviewFrames(this);
|
|
1219
|
+
for (let i = 0; i < ((_e = this.subviews) == null ? void 0 : _e.length); i++) {
|
|
1210
1220
|
const subview = this.subviews[i];
|
|
1211
1221
|
subview.calculateAndSetViewFrame();
|
|
1212
1222
|
}
|
|
1223
|
+
(_f = window.UILayoutDebugger) == null ? void 0 : _f.didSetSubviewFrames(this);
|
|
1213
1224
|
this.didLayoutSubviews();
|
|
1214
1225
|
if (this._overlayView) {
|
|
1215
1226
|
this._overlayView.weakFrame = this.bounds;
|
|
@@ -2571,6 +2582,7 @@ const _UIView = class extends import_UIObject.UIObject {
|
|
|
2571
2582
|
return this._intrinsicSizesCache[cacheKey];
|
|
2572
2583
|
}
|
|
2573
2584
|
_setCachedIntrinsicSize(cacheKey, size) {
|
|
2585
|
+
var _a, _b;
|
|
2574
2586
|
if (this.sharedIntrinsicSizeCacheIdentifier) {
|
|
2575
2587
|
let bucket = _UIView._sharedIntrinsicSizeCaches.get(
|
|
2576
2588
|
this.sharedIntrinsicSizeCacheIdentifier
|
|
@@ -2580,9 +2592,11 @@ const _UIView = class extends import_UIObject.UIObject {
|
|
|
2580
2592
|
_UIView._sharedIntrinsicSizeCaches.set(this.sharedIntrinsicSizeCacheIdentifier, bucket);
|
|
2581
2593
|
}
|
|
2582
2594
|
bucket[cacheKey] = size.copy();
|
|
2595
|
+
(_a = window.UILayoutDebugger) == null ? void 0 : _a.didSetCachedIntrinsicSize(this, cacheKey, size);
|
|
2583
2596
|
return;
|
|
2584
2597
|
}
|
|
2585
2598
|
this._intrinsicSizesCache[cacheKey] = size.copy();
|
|
2599
|
+
(_b = window.UILayoutDebugger) == null ? void 0 : _b.didSetCachedIntrinsicSize(this, cacheKey, size);
|
|
2586
2600
|
}
|
|
2587
2601
|
clearIntrinsicSizeCache() {
|
|
2588
2602
|
var _a;
|
|
@@ -2749,6 +2763,17 @@ const _UIView = class extends import_UIObject.UIObject {
|
|
|
2749
2763
|
}
|
|
2750
2764
|
return import_UIObject.nil;
|
|
2751
2765
|
}
|
|
2766
|
+
performForcedSubtreeLayout() {
|
|
2767
|
+
import_UITextMeasurement.UITextMeasurement.clearCaches();
|
|
2768
|
+
_UIView.invalidateAllSharedIntrinsicSizeCaches();
|
|
2769
|
+
this.forEachViewInSubtree((view) => {
|
|
2770
|
+
view._intrinsicSizesCache = {};
|
|
2771
|
+
view._frameCache = void 0;
|
|
2772
|
+
view._frameCacheForVirtualLayouting = void 0;
|
|
2773
|
+
view.setNeedsLayout();
|
|
2774
|
+
});
|
|
2775
|
+
_UIView.layoutViewsIfNeeded();
|
|
2776
|
+
}
|
|
2752
2777
|
};
|
|
2753
2778
|
let UIView = _UIView;
|
|
2754
2779
|
UIView._UIViewIndex = -1;
|