@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.
- package/CHANGELOG.md +63 -0
- package/README.md +135 -42
- package/dist/kurot/components/BitmapLabel.d.ts +48 -0
- package/dist/kurot/components/BitmapLabel.d.ts.map +1 -0
- package/dist/kurot/components/BitmapLabel.js +196 -0
- package/dist/kurot/components/BitmapLabel.js.map +1 -0
- package/dist/kurot/components/RichLabel.d.ts +51 -0
- package/dist/kurot/components/RichLabel.d.ts.map +1 -0
- package/dist/kurot/components/RichLabel.js +172 -0
- package/dist/kurot/components/RichLabel.js.map +1 -0
- package/dist/kurot/components/index.d.ts +2 -0
- package/dist/kurot/components/index.d.ts.map +1 -1
- package/dist/kurot/components/index.js +2 -0
- package/dist/kurot/components/index.js.map +1 -1
- package/docs/ai-context.md +35 -6
- package/docs/architecture.md +407 -409
- package/docs/bitmap-label.md +47 -0
- package/docs/label-text-layout.md +8 -3
- package/docs/rich-label.md +77 -0
- package/package.json +6 -4
|
@@ -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"}
|
package/docs/ai-context.md
CHANGED
|
@@ -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.
|
|
10
|
-
`@kurot/core`. Peer-depends on `@kurot/core@^2.
|
|
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;
|
|
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.
|
|
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.
|