@kurot/ui 3.1.0 → 3.3.0

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.
@@ -0,0 +1,172 @@
1
+ import { TextField } from '@kurot/core';
2
+ import { Component } from './Component.js';
3
+ import { PropertyEvent } from '../events/PropertyEvent.js';
4
+ /**
5
+ * Displays styled text runs in one continuous layout. Content is assigned only
6
+ * through textFlow; ordinary Label text and appearance presets are not exposed.
7
+ * Unspecified run styles use the TextField defaults captured at construction.
8
+ */
9
+ export class RichLabel extends Component {
10
+ // ── Instance fields ───────────────────────────────────────────────────────
11
+ _textField = new TextField();
12
+ _widthConstraint = NaN;
13
+ _measurement;
14
+ _measurementWidth = NaN;
15
+ // ── Constructor ───────────────────────────────────────────────────────────
16
+ constructor(textFlow = []) {
17
+ super();
18
+ this.touchChildren = false;
19
+ this._textField.wordWrap = true;
20
+ this.textFlow = textFlow;
21
+ }
22
+ // ── Getters / Setters ──────────────────────────────────────────────────────
23
+ get width() {
24
+ return super.width;
25
+ }
26
+ set width(value) {
27
+ if (Object.is(this.$explicitWidth, value))
28
+ return;
29
+ super.width = value;
30
+ // Component width changes alone do not invalidate automatic text height.
31
+ this._invalidateText();
32
+ }
33
+ /**
34
+ * Assignment and reads copy the runs and their styles. Reassign an edited
35
+ * snapshot to update the component; [] clears all content.
36
+ */
37
+ get textFlow() {
38
+ return this._copyTextFlow(this._textField.textFlow ?? []);
39
+ }
40
+ set textFlow(value) {
41
+ this._textField.textFlow = this._copyTextFlow(value);
42
+ this.invalidateSize();
43
+ this.invalidateDisplayList();
44
+ PropertyEvent.dispatchPropertyEvent(this, 'textFlow');
45
+ }
46
+ get multiline() {
47
+ return this._textField.multiline;
48
+ }
49
+ set multiline(value) {
50
+ if (this.multiline === value)
51
+ return;
52
+ this._textField.multiline = value;
53
+ this._invalidateText();
54
+ }
55
+ /**
56
+ * True uses Unicode line-break opportunities; false wraps by graphemes.
57
+ * Explicit multiline=false displays only the first unwrapped hard line.
58
+ */
59
+ get wordWrap() {
60
+ return this._textField.wordWrap;
61
+ }
62
+ set wordWrap(value) {
63
+ if (this.wordWrap === value)
64
+ return;
65
+ this._textField.wordWrap = value;
66
+ this._invalidateText();
67
+ }
68
+ get lineSpacing() {
69
+ return this._textField.lineSpacing;
70
+ }
71
+ set lineSpacing(value) {
72
+ if (!Number.isFinite(value) || value < 0) {
73
+ throw new RangeError('RichLabel.lineSpacing must be finite and nonnegative.');
74
+ }
75
+ if (this.lineSpacing === value)
76
+ return;
77
+ this._textField.lineSpacing = value;
78
+ this._invalidateText();
79
+ }
80
+ get textAlign() {
81
+ return this._textField.textAlign;
82
+ }
83
+ set textAlign(value) {
84
+ if (this.textAlign === value)
85
+ return;
86
+ if (!['left', 'center', 'right'].includes(value)) {
87
+ throw new RangeError('Invalid rich text alignment.');
88
+ }
89
+ this._textField.textAlign = value;
90
+ this.invalidateDisplayList();
91
+ }
92
+ get verticalAlign() {
93
+ return this._textField.verticalAlign;
94
+ }
95
+ set verticalAlign(value) {
96
+ if (this.verticalAlign === value)
97
+ return;
98
+ if (!['top', 'middle', 'bottom'].includes(value)) {
99
+ throw new RangeError('Invalid rich text vertical alignment.');
100
+ }
101
+ this._textField.verticalAlign = value;
102
+ this.invalidateDisplayList();
103
+ }
104
+ /**
105
+ * Complete content metrics under the current width constraint, before
106
+ * height clipping. Empty content has zero width and height.
107
+ */
108
+ get textWidth() {
109
+ return this._measureText().width;
110
+ }
111
+ get textHeight() {
112
+ return this._measureText().height;
113
+ }
114
+ // ── Override methods ──────────────────────────────────────────────────────
115
+ invalidateSize() {
116
+ // A late font load can change metrics without changing the authored runs.
117
+ this._measurement = undefined;
118
+ this._textField?.invalidateTextMetrics();
119
+ super.invalidateSize();
120
+ }
121
+ createChildren() {
122
+ super.createChildren();
123
+ this.addChild(this._textField);
124
+ }
125
+ measure() {
126
+ const measured = this._measureText();
127
+ this.setMeasuredSize(measured.width, measured.height);
128
+ }
129
+ setLayoutBoundsSize(layoutWidth, layoutHeight) {
130
+ super.setLayoutBoundsSize(layoutWidth, layoutHeight);
131
+ const width = Number.isFinite(layoutWidth) ? this.width : NaN;
132
+ if (Object.is(this._widthConstraint, width))
133
+ return;
134
+ this._widthConstraint = width;
135
+ this._invalidateText();
136
+ }
137
+ updateDisplayList(unscaledWidth, unscaledHeight) {
138
+ super.updateDisplayList(unscaledWidth, unscaledHeight);
139
+ this._textField.width = unscaledWidth;
140
+ this._textField.height = unscaledHeight;
141
+ }
142
+ // ── Private methods ───────────────────────────────────────────────────────
143
+ _copyTextFlow(value) {
144
+ return value.map(element => {
145
+ if (typeof element.text !== 'string') {
146
+ throw new TypeError('RichLabel text runs must contain string text.');
147
+ }
148
+ return element.style ? { text: element.text, style: { ...element.style } } : { text: element.text };
149
+ });
150
+ }
151
+ _invalidateText() {
152
+ this.invalidateSize();
153
+ this.invalidateDisplayList();
154
+ }
155
+ _measureText() {
156
+ if (!this._textField.text)
157
+ return { width: 0, height: 0 };
158
+ const width = Number.isFinite(this._widthConstraint)
159
+ ? this._widthConstraint
160
+ : Number.isFinite(this.$explicitWidth)
161
+ ? this.$explicitWidth
162
+ : this.maxWidth !== 100000
163
+ ? this.maxWidth
164
+ : NaN;
165
+ if (!this._measurement || !Object.is(this._measurementWidth, width)) {
166
+ this._measurement = this._textField.measureText(width);
167
+ this._measurementWidth = width;
168
+ }
169
+ return this._measurement;
170
+ }
171
+ }
172
+ //# sourceMappingURL=RichLabel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichLabel.js","sourceRoot":"","sources":["../../../src/kurot/components/RichLabel.ts"],"names":[],"mappings":"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"}
@@ -31,4 +31,6 @@ export { UILayer } from './UILayer.js';
31
31
  export { EditableText } from './EditableText.js';
32
32
  export { TextInput } from './TextInput.js';
33
33
  export { ComboBox } from './ComboBox.js';
34
+ export { BitmapLabel } from './BitmapLabel.js';
35
+ export { RichLabel } from './RichLabel.js';
34
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/kurot/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACtG,OAAO,EAAE,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/kurot/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACtG,OAAO,EAAE,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
@@ -31,4 +31,6 @@ export { UILayer } from './UILayer.js';
31
31
  export { EditableText } from './EditableText.js';
32
32
  export { TextInput } from './TextInput.js';
33
33
  export { ComboBox } from './ComboBox.js';
34
+ export { BitmapLabel } from './BitmapLabel.js';
35
+ export { RichLabel } from './RichLabel.js';
34
36
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/kurot/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA6D,MAAM,gBAAgB,CAAC;AACtG,OAAO,EAAE,KAAK,EAAoB,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAoB,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAmB,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/kurot/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA6D,MAAM,gBAAgB,CAAC;AACtG,OAAO,EAAE,KAAK,EAAoB,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAoB,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAmB,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
@@ -6,9 +6,12 @@ each session. Treat the package source and its `src/index.ts` barrel as the
6
6
  authority for current behavior and exports; this file provides the compressed
7
7
  map, runtime contracts and task→file lookup.
8
8
 
9
- Package identity: `@kurot/ui@3.1.0`, EUI-compatible UI framework on top of
10
- `@kurot/core`. Peer-depends on `@kurot/core@^2.1.0`. Rewritten with standard class
9
+ Package identity: `@kurot/ui@3.3.0`, EUI-compatible UI framework on top of
10
+ `@kurot/core`. Peer-depends on `@kurot/core@^2.3.0`. Rewritten with standard class
11
11
  inheritance and delegation — no namespace mixins, no prototype copying.
12
+ Version 3.3.0 adds RichLabel and tests against published Core 2.3.1 through its
13
+ development installation and lockfile, without overrides. Version 3.2.0 is published with BitmapLabel against published Core 2.2.0,
14
+ without local dependency overrides. Published UI 3.1.0 does not contain BitmapLabel.
12
15
 
13
16
  Source root: `src/kurot/`. Public API: `src/index.ts` is a flat re-export of
14
17
  7 barrels — `core`, `layouts`, `components`, `events`, `states`, `collections`,
@@ -24,7 +27,7 @@ src/kurot/
24
27
  │ Validator/validator (render-preparation validation scheduler),
25
28
  │ Theme/getTheme()/setTheme(), IViewport, IAssetAdapter/IThemeAdapter.
26
29
  ├── components/ Group, Component (delegation core — see §2), Skin, and
27
- │ concrete widgets: Button, Label, CheckBox, RadioButton,
30
+ │ concrete widgets: Button, Label, BitmapLabel, RichLabel, CheckBox, RadioButton,
28
31
  │ ToggleButton/ToggleSwitch, ProgressBar, HSlider/VSlider,
29
32
  │ Rect, Image, EditableText, TextInput, Panel, ViewStack,
30
33
  │ Scroller, UILayer, DataGroup, List, TabBar, ComboBox,
@@ -141,7 +144,7 @@ Flat re-export of 7 barrels, in this order: `core`, `layouts`, `components`,
141
144
 
142
145
  - **core**: `IUIComponent`, `IUIOwner`, `UIState`, `isUIComponent`, `Validator`/`validator`, `Theme`/`getTheme`/`setTheme`, `IViewport`, `IAssetAdapter`/`DefaultAssetAdapter`, `setAssetAdapter`/`getAssetAdapter`, `IThemeAdapter`/`DefaultThemeAdapter`, `Direction`, `ScrollPolicy`, `IDisplayText`, `IItemRenderer`.
143
146
  - **layouts**: `ILayoutTarget`, `LayoutBase`, `BasicLayout`, `LinearLayoutBase`, `VerticalLayout`, `HorizontalLayout`, `TileLayout`, `ColumnAlign`, `RowAlign`, `JustifyAlign`, `TileOrientation`.
144
- - **components**: `Group`/`GroupEvents`, `Component`/`ComponentEvents`, `Skin`/`SkinEvents`; `Button`, `Label`/`TextFitMode` (type), `CheckBox`, `RadioButton`/`RadioButtonGroup`, `ToggleButton`, `ToggleSwitch`, `ProgressBar`, `HSlider`/`VSlider`/`SliderBase`, `Rect`, `Image`, `EditableText`, `TextInput`, `Panel`, `ViewStack`, `Scroller`, `TouchScroll`, `UILayer`, `DataGroup`, `List`/`ListBase`, `TabBar`, `ComboBox`, `ItemRenderer`, `HScrollBar`/`VScrollBar`/`ScrollBarBase`, `Animation`, `Range`.
147
+ - **components**: `Group`/`GroupEvents`, `Component`/`ComponentEvents`, `Skin`/`SkinEvents`; `Button`, `Label`/`TextFitMode` (type), `BitmapLabel`, `RichLabel`, `CheckBox`, `RadioButton`/`RadioButtonGroup`, `ToggleButton`, `ToggleSwitch`, `ProgressBar`, `HSlider`/`VSlider`/`SliderBase`, `Rect`, `Image`, `EditableText`, `TextInput`, `Panel`, `ViewStack`, `Scroller`, `TouchScroll`, `UILayer`, `DataGroup`, `List`/`ListBase`, `TabBar`, `ComboBox`, `ItemRenderer`, `HScrollBar`/`VScrollBar`/`ScrollBarBase`, `Animation`, `Range`.
145
148
  - **events**: `UIEvent`, `ItemTapEvent`, `CollectionEvent`/`CollectionEventKind`, `PropertyEvent`, `ScrollerThrowEvent`.
146
149
  - **states**: `State`, `IOverride`, `SetProperty`, `SetStateProperty`, `AddItems`.
147
150
  - **collections**: `ICollection`, `ArrayCollection`.
@@ -204,8 +207,34 @@ automatic bounds are not fed back as fit constraints.
204
207
 
205
208
  `label.invalidateSize()` also invalidates Core line metrics. Call it after
206
209
  late font loading, even if the family name did not change. This requires
207
- Core >= 2.1.0; there is no global font-readiness listener.
210
+ Core >= 2.1.0 for that API; UI 3.3.0's package requirement is Core ^2.3.0.
211
+ There is no global font-readiness listener.
208
212
 
209
213
  See [Label text layout](label-text-layout.md) for fit bounds, state restoration,
210
214
  font readiness and shared-schema boundaries. Native UI still depends only on
211
- Core; KUI authoring uses ui-document 0.9.x and matching CLI/runtime releases.
215
+ Core; KUI authoring uses ui-document 0.11.x, published CLI 3.3.0 and
216
+ published ui-runtime 0.8.2. Label presets expand in consumer-owned
217
+ copies before native rendering; UI does not read style.json or consume textStyle.
218
+
219
+ ## Bitmap labels in 3.2.0
220
+
221
+ [bitmap-label.md](bitmap-label.md) documents the new exported BitmapLabel,
222
+ using one BitmapText child and the configured Core resource singleton for string
223
+ font names. Stale async results are guarded by request generation. Core ^2.2.0
224
+ is required; local Core overrides have been removed. Published UI 3.1.0 does
225
+ not contain it. KUI catalog, installed compilers and Editor adoption are separate.
226
+
227
+ ## Rich labels in 3.3.0
228
+
229
+ [rich-label.md](rich-label.md) defines RichLabel, an independent Component using
230
+ one native TextField. Only textFlow supplies content; no Label text/appearance
231
+ properties, textFit or textStyle. Reads and assignments copy runs and styles;
232
+ [] clears content. Wrapping is continuous across styles. Measurement uses Core
233
+ 2.3.0's pure measureText with parent width, explicit width or maxWidth; cached
234
+ metrics clear on invalidateSize, including after fonts load. Geometry, multiline,
235
+ wordWrap, lineSpacing, textAlign and verticalAlign remain component-level.
236
+
237
+ Task → `components/RichLabel.ts`, `test/RichLabel.test.ts`,
238
+ `test/browser/text-labels.spec.ts`. Run `pnpm test:text-labels` after building
239
+ Core and UI. BitmapLabel automatic measurement now uses maxWidth too. The KUI
240
+ catalog, CLI and Editor must adopt these native components in a later phase.