@kurot/ui 3.5.0 → 3.6.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 CHANGED
@@ -4,9 +4,58 @@ All notable changes to `@kurot/ui` are documented here.
4
4
 
5
5
  ---
6
6
 
7
+ ## [3.6.0] — 2026-10-11
8
+
9
+ Prepared for publication; not yet published. Requires published Core ^2.5.2.
10
+ See [Label outline layout](docs/label-text-layout.md#outline-safe-layout-in-360).
11
+
12
+ ### Fixed
13
+
14
+ - Dynamic Label outlines now reserve a symmetric internal safety inset in normal
15
+ layout and fitting. Automatic dimensions include this inset and any glyph
16
+ block taller than nominal rows; wrapping, painting and shrink checks share the
17
+ same content bounds. Scroller viewports retain complete edge outlines without
18
+ per-Scroller configuration or relaxed clips.
19
+ - Preserve authored alignment, state overrides, minimum overflow, blank rows,
20
+ automatic axes and stable top-aligned typewriter origins after clearing.
21
+ Empty/unoutlined Labels and EditableText retain native sizing/viewport rules.
22
+ RichLabel, BitmapLabel and Core nominal measurement are unchanged.
23
+
24
+ ### Compatibility and adoption
25
+
26
+ Outlined Label dimensions and wrapping may change, including when fitting is
27
+ disabled. Recheck tightly sized captions and keep explicit top alignment for
28
+ progressively typed dialogue. Empty/unoutlined Labels, EditableText, RichLabel
29
+ and BitmapLabel retain their layout contracts. No public property or KUI/resource
30
+ format migration is added.
31
+
32
+ The Core peer and development range increase from ^2.4.0 to ^2.5.2 for public
33
+ glyph metrics and unified block alignment. Development installs registry 2.5.3;
34
+ the 2.5.2 minimum is tested separately. Core itself needs no new release.
35
+ ui-runtime 0.10.0 already accepts UI 3.6.0 through ^3.4.0; its host must also
36
+ satisfy the new UI Core peer. CLI and ui-document need no changes or releases.
37
+
38
+ After publication, applications adopt UI 3.6.0 and rebuild explicitly. Editor's
39
+ exact UI 3.5.0 pin must change; compatible example/template ranges can update
40
+ their installations and locks without changing their ranges. Existing application
41
+ and SDK development locks are unchanged by this release preparation.
42
+
43
+ ### Verification
44
+
45
+ The clean prepublish build and all 371 unit tests pass with installed registry Core
46
+ 2.5.3 and an isolated 2.5.2 minimum. All 18 minified browser tests pass, including
47
+ exact outline clips on Canvas/WebGL 1/2 at physical 1x/2x. An isolated packed-UI
48
+ consumer also passes all six backend/density checks for clipping, Japanese tails
49
+ and typewriter layout with Core 2.5.2; its strict TypeScript check passes.
50
+ The 3.6.0 tarball contains all 344 matching compiled/declaration/map files and
51
+ public documentation, excluding tests, node_modules and internal drafts;
52
+ frozen registry installation and `git diff --check` pass. The MilfMaster trial
53
+ harness verifies the actual compiled Drama skin and completed render frames
54
+ without replacing its registry dependencies.
55
+
7
56
  ## [3.5.0] — 2026-10-10
8
57
 
9
- Prepared for publication; not yet published. Requires Core ^2.4.0, unchanged
58
+ Published; verified on npm on 2026-10-10. Requires Core ^2.4.0, unchanged
10
59
  from 3.4.0. See [Label fitting](docs/label-text-layout.md).
11
60
 
12
61
  ### Added
@@ -37,10 +86,11 @@ Core APIs, peer minima, KUI format and resource contracts are unchanged.
37
86
 
38
87
  ui-runtime 0.10.0's UI ^3.4.0 peer already accepts 3.5.0. CLI and ui-document
39
88
  already preserve the fitting fields; neither needs a new release. Applications
40
- adopt the UI installation/lock and rebuild explicitly. Editor 0.28.1's local
41
- trial includes this implementation through a built UI override; its exact UI
42
- 3.4.0 registry baseline must adopt 3.5.0 after publication for ordinary builds.
43
- Other SDKs, consumer manifests and locks are unchanged.
89
+ adopt the UI installation/lock and rebuild explicitly. Editor 0.28.2 uses exact
90
+ registry UI 3.5.0 with a matching Bun lock and ordinary App build; its temporary
91
+ UI source binding is removed. The selected Tentax and MilfMaster templates
92
+ adopt ^3.5.0 with matching pnpm locks and rebuilt outputs. Other applications
93
+ and SDK development locks are unchanged.
44
94
 
45
95
  ### Verification
46
96
 
@@ -50,7 +100,9 @@ flips, independent RichLabel/BitmapLabel, multiline shrink on Canvas/WebGL 1/2
50
100
  at 1x/2x and pixel-identical fitting toggles for all alignment combinations.
51
101
  Local npm packing verifies version 3.5.0, unchanged Core ^2.4.0, compiled fitting
52
102
  and alignment modules, declarations and public documentation, excluding tests,
53
- node_modules and internal drafts. `git diff --check` passes.
103
+ node_modules and internal drafts. Registry latest, package download and integrity
104
+ are verified; the published Label/fitting modules match the tested build.
105
+ `git diff --check` passes.
54
106
 
55
107
  ## [3.4.0] — 2026-10-09
56
108
 
package/README.md CHANGED
@@ -1,14 +1,21 @@
1
1
  # @kurot/ui
2
2
 
3
- **3.5.0 is prepared for publication; not yet published.** It adds multiline
4
- Label shrinking and retains the original text alignment when fitting is toggled.
5
- The Core ^2.4.0 peer and registry Core 2.4.0 development installation/lock are
6
- unchanged. UI 3.4.0 is the previously verified published release (2026-10-09).
7
- See [Label fitting](docs/label-text-layout.md) for behavior and adoption.
3
+ **3.6.0 is prepared for publication; it is not yet published.** Dynamic Label
4
+ outlines now fit inside their layout bounds, including Scroller viewports,
5
+ automatic dimensions, wrapping and text fitting. The release requires Core
6
+ ^2.5.2 and develops against registry Core 2.5.3 without local overrides.
7
+ The latest verified published UI release is 3.5.0 (2026-10-10).
8
+ See [Label layout](docs/label-text-layout.md) for behavior and adoption.
8
9
 
9
10
  UI component framework for [@kurot/core](https://github.com/kurot-engine/kurot/tree/main/packages/core). Migrated from Egret EUI, rewritten in modern TypeScript with clean class inheritance — no namespace hacks, no prototype manipulation.
10
11
 
11
- > **Package version: 3.5.0 (prepared, not yet published).** Requires `@kurot/core@^2.4.0`. Targets ES2022 + evergreen browsers, same as core.
12
+ > **Package version: 3.6.0 (prepared, unpublished).** Requires `@kurot/core@^2.5.2`. Targets ES2022 + evergreen browsers, same as core.
13
+
14
+ Outlined Label sizes and line breaks can change, including without `textFit`;
15
+ Scroller viewports need no extra configuration. Keep explicit top alignment for
16
+ progressively typed dialogue. No new KUI field, Core release or unrelated SDK
17
+ bump is required. After publication, applications must adopt UI 3.6.0 and rebuild
18
+ to receive the correction.
12
19
 
13
20
  For the full list of changes in this release, see [CHANGELOG.md](./CHANGELOG.md).
14
21
 
@@ -20,8 +27,9 @@ Published Core 2.5.2 and earlier default to top. Explicit top/bottom and skin-st
20
27
  overrides stay effective; multiline only controls line generation. Set top
21
28
  explicitly when text should start at the top of a taller box.
22
29
  UI 3.4.0's existing peer range accepts Core 2.5.3 without a UI release or a higher
23
- minimum. Applications adopt the Core installation/lock and rebuild;
24
- UI's development installation remains registry Core 2.4.0.
30
+ minimum for that default change alone. Applications adopt the Core installation/lock
31
+ and rebuild. UI 3.6.0's separate outline correction requires Core ^2.5.2;
32
+ the development installation is registry Core 2.5.3.
25
33
  See [text layout](docs/label-text-layout.md#vertical-alignment-and-skin-defaults).
26
34
 
27
35
  ## Centered flips in 3.4.0
@@ -66,9 +74,11 @@ BitmapLabel now also honors maxWidth during automatic measurement. Both text
66
74
  components remeasure automatic height when an authored width changes.
67
75
 
68
76
  The unpublished UI 3.3.1 snapshot built and tested against registry Core 2.3.1.
69
- Current UI 3.5.0 builds and tests against registry Core 2.4.0 without overrides.
70
- These native APIs do
71
- not add KUI tags or an Editor rich-text authoring interface by themselves.
77
+ Published UI 3.5.0 was tested against Core 2.4.0; UI 3.6.0 builds and tests against
78
+ registry Core 2.5.3 and separately verifies its 2.5.2 minimum. Native KUI support
79
+ for RichLabel and BitmapLabel is available with ui-document >= 0.12.0, CLI >= 3.4.0
80
+ and ui-runtime >= 0.9.0. The current document 0.13.1, CLI 3.6.0 and runtime 0.10.0
81
+ retain that support; authoring applications adopt these packages separately.
72
82
 
73
83
  ## Label text fitting in 3.5.0
74
84
 
@@ -97,9 +107,11 @@ height on the Label, and enable `textFit = 'shrink'`. Complete wrapped content,
97
107
  hard breaks and line spacing participate in fitting. If several rows fit at the
98
108
  base size, the base size is retained. Automatic axes are unconstrained, so
99
109
  width-only multiline captions normally wrap and grow taller without shrinking.
100
- Outline allowance participates in fitting and its shared wrap width. Text keeps
101
- the original Label alignment frame; automatic measurement remains nominal,
102
- without implicit outline padding or a position change when fitting is toggled.
110
+ UI 3.6.0 reserves a symmetric outline inset in every nonempty dynamic
111
+ Label with a positive finite stroke, including normal layout. Automatic dimensions
112
+ contain the outline; fixed and maximum bounds wrap/fit inside it. Toggling fitting at unchanged drawing size
113
+ retains geometry and painting. Published 3.5.0 kept automatic dimensions nominal.
114
+ See [outline layout](docs/label-text-layout.md#outline-safe-layout-in-360).
103
115
 
104
116
  ```ts
105
117
  const caption = new Label('Доказуемая честность');
@@ -128,27 +140,29 @@ only on Core.
128
140
  ## Installation
129
141
 
130
142
  ```bash
131
- pnpm add @kurot/ui@^3.5.0 @kurot/core@^2.4.0
143
+ pnpm add @kurot/ui@^3.6.0 @kurot/core@^2.5.2
132
144
  ```
133
145
 
134
146
  `@kurot/ui` declares `@kurot/core` as a peer dependency. Install both packages explicitly so the application controls the resolved core version.
135
147
 
136
- Run this installation command after UI 3.5.0 is published. UI 3.5.0 retains
137
- Core ^2.4.0 for the centered-flip frame hook, in addition to
138
- the native text APIs introduced in Core 2.2/2.3. Core installs its published
139
- bitmap-font dependency automatically.
140
- Refresh older Core/UI lockfiles and old sheet manifests with
141
- string-valued `subkeys` in Kurot Editor before launching the application.
148
+ Run this command after UI 3.6.0 is published. Its Core ^2.5.2 minimum supplies
149
+ the public glyph metrics and unified alignment used by outline-safe Label layout,
150
+ in addition to centered flips and the native text APIs from earlier releases.
151
+ Core installs its published bitmap-font dependency automatically. Update Core
152
+ installations older than 2.5.2 when adopting UI 3.6.0.
153
+ For legacy projects, refresh sheet manifests with string-valued `subkeys` in
154
+ Kurot Editor before launching the application on Core 2.x.
142
155
  See the [resource migration guide](../ui-document/docs/resource-nine-slice.md).
143
156
 
144
- Adopting 3.5.0 needs only a UI installation/lock update and rebuild when the
145
- application's range already accepts it. Existing multiline Labels with `shrink`
146
- start fitting; ordinary Labels without that policy keep their behavior. No KUI
147
- or resource migration is required. ui-runtime 0.10.0 accepts it through ^3.4.0;
148
- its development lock may adopt it separately. CLI/ui-document need no release.
149
- Editor 0.28.1 already removes the multiline Inspector restriction in its local
150
- trial, but its exact registry UI 3.4.0 dependency must adopt 3.5.0 after publication.
151
- Templates and other applications retain their own dependency trees and resources.
157
+ Adopting 3.6.0 requires a UI installation/lock update and rebuild, plus an accepted
158
+ Core installation. Review outlined captions for the larger automatic dimensions
159
+ or earlier wraps. ui-runtime 0.10.0 accepts it through ^3.4.0; its development lock
160
+ may adopt it separately and its host must satisfy UI's Core peer. CLI/ui-document
161
+ need no release or XML migration. Editor currently pins registry UI 3.5.0 and
162
+ requires an explicit dependency update after publication. The selected Tentax
163
+ and MilfMaster templates' ^3.5.0 ranges and the game example's ^3.1.0 range accept
164
+ 3.6.0; their installations/locks and rebuilds are separate adoption steps.
165
+ This release preparation does not upgrade applications or other SDK locks.
152
166
 
153
167
  ## Project style colors
154
168
 
@@ -169,8 +183,8 @@ The Label belongs to a Skin declaring the `disabled` state. Native Skin state
169
183
  handling applies the compiled numeric color and restores the base color on
170
184
  leaving that state. The same reference syntax works for base color properties.
171
185
  UI does not read style.json or evaluate XML references itself; programmatic
172
- components assign numeric colors. This release does not introduce complete
173
- typography presets or automatic live theme switching. See the
186
+ components assign numeric colors. Label presets are expanded by CLI/document
187
+ consumers before rendering; UI itself provides no automatic live theme switching. See the
174
188
  [project style contract](../ui-document/docs/project-styles.md).
175
189
 
176
190
  ## Quick Start
@@ -591,6 +605,7 @@ resource cache or caller retains ownership. Superseded async requests cannot
591
605
  replace a newer assignment. Successful named loads dispatch Event.COMPLETE;
592
606
  failed or incorrectly typed resources dispatch IOErrorEvent.IO_ERROR.
593
607
 
594
- The component supports native code and programmatic skins. Installed KUI
595
- compilers, the ui-document catalog, Editor and ui-runtime materializers do not
596
- yet adopt the BitmapLabel tag. Published UI 3.1.0 does not include the component.
608
+ The component supports native code and programmatic skins. Native KUI authoring
609
+ requires ui-document >= 0.12.0 and CLI >= 3.4.0; materialized previews require
610
+ ui-runtime >= 0.9.0. Editor adopts those contracts explicitly. Published UI 3.1.0
611
+ does not include BitmapLabel.
@@ -89,6 +89,6 @@ export declare class Label extends Component implements IDisplayText {
89
89
  setLayoutBoundsSize(layoutWidth: number, layoutHeight: number): void;
90
90
  updateDisplayList(unscaledWidth: number, unscaledHeight: number): void;
91
91
  private _applyTextFit;
92
- private _getFitContentWidth;
92
+ private _getTextContentWidth;
93
93
  }
94
94
  //# sourceMappingURL=Label.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Label.d.ts","sourceRoot":"","sources":["../../../src/kurot/components/Label.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Label.d.ts","sourceRoot":"","sources":["../../../src/kurot/components/Label.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { Component } from './Component.js';
2
2
  import { TextField, TextFieldType } from '@kurot/core';
3
3
  import { fitLabelText } from '../text/fit-label-text.js';
4
+ import { getLabelOutlinePadding, getLabelTextHeight } from '../text/label-text-bounds.js';
4
5
  import { PropertyEvent } from '../events/PropertyEvent.js';
5
6
  /**
6
7
  * Label component for displaying text.
@@ -277,8 +278,9 @@ export class Label extends Component {
277
278
  : NaN;
278
279
  this._applyTextFit(availableWidth, availableHeight);
279
280
  try {
280
- tf.width = this._getFitContentWidth(availableWidth);
281
- this.setMeasuredSize(tf.textWidth, tf.textHeight);
281
+ tf.width = this._getTextContentWidth(availableWidth);
282
+ const outline = getLabelOutlinePadding(tf) * 2;
283
+ this.setMeasuredSize(tf.textWidth + outline, getLabelTextHeight(tf) + outline);
282
284
  }
283
285
  finally {
284
286
  tf.width = oldWidth;
@@ -317,16 +319,13 @@ export class Label extends Component {
317
319
  if (previousSize !== this.renderedSize && (isNaN(this.$explicitWidth) || isNaN(this.$explicitHeight))) {
318
320
  this.invalidateSize();
319
321
  }
320
- const contentWidth = Number.isFinite(fitWidth)
321
- ? Math.min(unscaledWidth, this._getFitContentWidth(fitWidth))
322
- : unscaledWidth;
323
- // Wrapping reserves outline width; alignment still uses the original Label frame.
324
- const remainingWidth = unscaledWidth - contentWidth;
325
- this._textField.x =
326
- this.textAlign === 'right' ? remainingWidth : this.textAlign === 'center' ? remainingWidth / 2 : 0;
327
- this._textField.y = 0;
328
- this._textField.width = contentWidth;
329
- this._textField.height = unscaledHeight;
322
+ // Measure, wrap, fit and paint reserve the same space exactly once. Core
323
+ // alignment remains authored and operates inside this inset text region.
324
+ const padding = getLabelOutlinePadding(this._textField);
325
+ this._textField.x = padding;
326
+ this._textField.y = padding;
327
+ this._textField.width = Math.max(0, unscaledWidth - padding * 2);
328
+ this._textField.height = Math.max(0, unscaledHeight - padding * 2);
330
329
  }
331
330
  // ── Private methods ────────────────────────────────────────────────────
332
331
  _applyTextFit(width, height) {
@@ -376,8 +375,8 @@ export class Label extends Component {
376
375
  this._textFitOverflow = fitted.overflow;
377
376
  this._fitKey = key;
378
377
  }
379
- _getFitContentWidth(width) {
380
- const outline = this.textFit === 'shrink' && this.text ? Math.max(0, this.stroke) * 2 : 0;
378
+ _getTextContentWidth(width) {
379
+ const outline = getLabelOutlinePadding(this._textField) * 2;
381
380
  return Number.isFinite(width) ? Math.max(0, width - outline) : NaN;
382
381
  }
383
382
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Label.js","sourceRoot":"","sources":["../../../src/kurot/components/Label.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Label.js","sourceRoot":"","sources":["../../../src/kurot/components/Label.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"fit-label-text.d.ts","sourceRoot":"","sources":["../../../src/kurot/text/fit-label-text.ts"],"names":[],"mappings":"AAEA,UAAU,gBAAgB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAED,UAAU,YAAY;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,YAAY,CA4CpE"}
1
+ {"version":3,"file":"fit-label-text.d.ts","sourceRoot":"","sources":["../../../src/kurot/text/fit-label-text.ts"],"names":[],"mappings":"AAGA,UAAU,gBAAgB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAED,UAAU,YAAY;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,YAAY,CA6CpE"}
@@ -1,4 +1,5 @@
1
1
  import { TextField } from '@kurot/core';
2
+ import { getLabelOutlinePadding, getLabelTextHeight } from './label-text-bounds.js';
2
3
  /**
3
4
  * Fits plain text using the same line generation as the rendered TextField.
4
5
  * A finite zero bound is meaningful; NaN represents an unconstrained axis.
@@ -15,16 +16,17 @@ export function fitLabelText(metrics) {
15
16
  field.multiline = metrics.multiline;
16
17
  field.wordWrap = metrics.wordWrap;
17
18
  field.lineSpacing = metrics.lineSpacing;
18
- const outline = Math.max(0, metrics.stroke) * 2;
19
+ field.stroke = metrics.stroke;
20
+ const outline = getLabelOutlinePadding(field) * 2;
19
21
  const width = Number.isFinite(metrics.width) ? Math.max(0, metrics.width - outline) : NaN;
20
22
  const fits = (size) => {
21
23
  // Core intentionally measures zero-width content as empty, not as overflow.
22
24
  if (width === 0)
23
25
  return false;
24
26
  field.size = size;
25
- const measured = field.measureText(width);
26
- return ((!Number.isFinite(metrics.width) || measured.width + outline <= metrics.width) &&
27
- (!Number.isFinite(metrics.height) || measured.height + outline <= metrics.height));
27
+ field.width = width;
28
+ return ((!Number.isFinite(metrics.width) || field.textWidth + outline <= metrics.width) &&
29
+ (!Number.isFinite(metrics.height) || getLabelTextHeight(field) + outline <= metrics.height));
28
30
  };
29
31
  if (fits(metrics.size)) {
30
32
  return { size: metrics.size, overflow: false };
@@ -1 +1 @@
1
- {"version":3,"file":"fit-label-text.js","sourceRoot":"","sources":["../../../src/kurot/text/fit-label-text.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fit-label-text.js","sourceRoot":"","sources":["../../../src/kurot/text/fit-label-text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { TextField } from '@kurot/core';
2
+ /**
3
+ * Dynamic outlines need layout space inside external clips. Keep this allowance
4
+ * independent of glyphs so a typewriter prefix cannot move its drawing origin.
5
+ * Input retains its native editing viewport and empty Labels add no inset.
6
+ */
7
+ export declare function getLabelOutlinePadding(field: TextField): number;
8
+ /**
9
+ * Preserve nominal rows, including blanks, while containing the complete glyph
10
+ * block of an outlined Label. Core measurement itself remains nominal.
11
+ */
12
+ export declare function getLabelTextHeight(field: TextField): number;
13
+ //# sourceMappingURL=label-text-bounds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label-text-bounds.d.ts","sourceRoot":"","sources":["../../../src/kurot/text/label-text-bounds.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,aAAa,CAAC;AAI3D;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAQ/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAmB3D"}
@@ -0,0 +1,42 @@
1
+ import { TextFieldType } from '@kurot/core';
2
+ const heightCache = new WeakMap();
3
+ /**
4
+ * Dynamic outlines need layout space inside external clips. Keep this allowance
5
+ * independent of glyphs so a typewriter prefix cannot move its drawing origin.
6
+ * Input retains its native editing viewport and empty Labels add no inset.
7
+ */
8
+ export function getLabelOutlinePadding(field) {
9
+ if (field.type === TextFieldType.INPUT || !field.text || !Number.isFinite(field.stroke) || field.stroke <= 0) {
10
+ return 0;
11
+ }
12
+ if (!field.multiline && !field.displayAsPassword && /^[\n\r\v\f\u0085\u2028\u2029]/u.test(field.text)) {
13
+ return 0;
14
+ }
15
+ return Math.ceil(field.stroke * 2) + 2;
16
+ }
17
+ /**
18
+ * Preserve nominal rows, including blanks, while containing the complete glyph
19
+ * block of an outlined Label. Core measurement itself remains nominal.
20
+ */
21
+ export function getLabelTextHeight(field) {
22
+ const nominalHeight = field.textHeight;
23
+ if (getLabelOutlinePadding(field) === 0)
24
+ return nominalHeight;
25
+ const lines = field.getLinesArr();
26
+ const cached = heightCache.get(lines);
27
+ if (cached !== undefined)
28
+ return cached;
29
+ let top = Infinity;
30
+ let bottom = -Infinity;
31
+ let lineTop = 0;
32
+ for (const line of lines) {
33
+ const hasInk = line.inkAscent + line.inkDescent > 0;
34
+ top = Math.min(top, lineTop + (hasInk ? line.baseline - line.inkAscent : 0));
35
+ bottom = Math.max(bottom, lineTop + (hasInk ? line.baseline + line.inkDescent : line.height));
36
+ lineTop += line.height + field.lineSpacing;
37
+ }
38
+ const height = Math.max(nominalHeight, lines.length === 0 ? 0 : bottom - top);
39
+ heightCache.set(lines, height);
40
+ return height;
41
+ }
42
+ //# sourceMappingURL=label-text-bounds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label-text-bounds.js","sourceRoot":"","sources":["../../../src/kurot/text/label-text-bounds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,WAAW,GAAG,IAAI,OAAO,EAA0B,CAAC;AAE1D;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAgB;IACtD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC9G,OAAO,CAAC,CAAC;IACV,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvG,OAAO,CAAC,CAAC;IACV,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAgB;IAClD,MAAM,aAAa,GAAG,KAAK,CAAC,UAAU,CAAC;IACvC,IAAI,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC;IAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAExC,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,IAAI,MAAM,GAAG,CAAC,QAAQ,CAAC;IACvB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpD,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9F,OAAO,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;IAC5C,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC9E,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -1,9 +1,12 @@
1
1
  # @kurot/ui — AI context map
2
2
 
3
- UI 3.5.0 is prepared for publication, not yet published. It adds multiline
4
- Label fitting and stable alignment when fitting is toggled. UI 3.4.0 is the
5
- previous verified published release (2026-10-09). Development still installs
6
- published Core 2.4.0 with a matching registry lockfile, without local overrides. Read
3
+ UI 3.6.0 is prepared for publication, not yet published. It adds outline-safe
4
+ Label layout to normal measurement, wrapping and fitting; outlined automatic
5
+ dimensions and line breaks can change. Its Core peer is ^2.5.2 for public line
6
+ ink metrics and unified block alignment. Development installs registry Core
7
+ 2.5.3 with a matching lock, without local overrides; the 2.5.2 minimum is tested
8
+ separately. Published UI 3.5.0 (verified on 2026-10-10) introduced multiline
9
+ Label fitting and stable alignment when fitting is toggled, with Core ^2.4.0. Read
7
10
  [centered flips](../../../docs/centered-flips.md) before changing transforms,
8
11
  reflection frames, authored flags or dependency adoption.
9
12
 
@@ -11,7 +14,8 @@ Label/RichLabel/EditableText inherit TextField's vertical alignment;
11
14
  BitmapLabel inherits BitmapText's. Published Core 2.5.3 defaults both to middle;
12
15
  published Core 2.5.2 and earlier default to top. Explicit values remain effective
13
16
  and multiline only controls line generation. UI has no default override and needs
14
- no new release/peer minimum; its installed development Core remains 2.4.0.
17
+ no new release for this default change alone. The separate UI 3.6.0 outline
18
+ correction requires Core ^2.5.2.
15
19
  Published document 0.13.1 supplies matching authoring defaults.
16
20
 
17
21
  Read this before exploring `src/`. It is a compressed map so an agent
@@ -20,8 +24,8 @@ each session. Treat the package source and its `src/index.ts` barrel as the
20
24
  authority for current behavior and exports; this file provides the compressed
21
25
  map, runtime contracts and task→file lookup.
22
26
 
23
- Package identity: `@kurot/ui@3.5.0`, EUI-compatible UI framework on top of
24
- `@kurot/core`. Peer-depends on `@kurot/core@^2.4.0`. Rewritten with standard class
27
+ Package identity: `@kurot/ui@3.6.0` (prepared, unpublished), EUI-compatible UI framework on top of
28
+ `@kurot/core`. Its peer is `@kurot/core@^2.5.2`; published 3.5.0 uses ^2.4.0. Rewritten with standard class
25
29
  inheritance and delegation — no namespace mixins, no prototype copying.
26
30
  Version 3.3.1 is preserved in commit 60e6404 and fixes transformed parent
27
31
  allocations. It has not been published; UI 3.4.0 includes the same correction. Version 3.3.0 adds RichLabel and tests against published Core 2.3.1 through its
@@ -219,7 +223,7 @@ before patching core's transform code.
219
223
  | Understand validation/render scheduling order | `core/Validator.ts`, core `player/SystemTicker.ts` |
220
224
  | Measure UI validation/rendering performance | `examples/benchmark/` for the visual runner, scenarios, Playwright automation, and local JSON/Markdown reports |
221
225
 
222
- ## Label text layout contract in 3.5.0
226
+ ## Label text layout contract in 3.6.0
223
227
 
224
228
  Label defaults to multiline; explicit false draws only the first hard-separated
225
229
  line without wrapping. EditableText defaults to single-line and rejects
@@ -230,8 +234,11 @@ multiline is enabled.
230
234
  UI 3.5.0 fits both line modes using complete Core measurement at each candidate
231
235
  size; UI 3.1.0–3.4.0 fit only single-line Labels.
232
236
  `multiline` stays authored and automatic axes stay unconstrained. Outline
233
- allowance affects fit checks and shared wrapping width, not the original alignment
234
- frame or nominal automatic dimensions. `minFontSize` defaults to
237
+ allowance affected fit checks and shared wrapping width, not the original alignment
238
+ frame or nominal automatic dimensions in 3.5.0. UI 3.6.0
239
+ uses `text/label-text-bounds.ts` to reserve symmetric stroke/AA insets
240
+ and contain complete ink in automatic dimensions. Measurement, wrapping, fitting
241
+ and painting share this area. Empty/input fields add no inset. `minFontSize` defaults to
235
242
  12 and must be finite and >= 1.
236
243
  `size` stays authored; `renderedSize` and `textFitOverflow` are read-only results
237
244
  after validation. Fitting uses fixed axes, parent layout constraints or explicit
@@ -241,18 +248,19 @@ automatic bounds are not fed back as fit constraints.
241
248
 
242
249
  `label.invalidateSize()` also invalidates Core line metrics. Call it after
243
250
  late font loading, even if the family name did not change. This requires
244
- Core >= 2.1.0 for that API; current UI 3.5.0 requires Core ^2.4.0 for its
245
- centered-flip frame hook.
251
+ Core >= 2.1.0 for that API; published UI 3.5.0 requires Core ^2.4.0 for centered
252
+ flips, while the UI 3.6.0 outline correction needs ^2.5.2.
246
253
 
247
254
  Width/height setters refresh automatic text dimensions. Font readiness also
248
255
  invalidates fitting in fixed-size boxes. Fitting toggles preserve unchanged text
249
- positions, all nine alignments and nominal automatic dimensions.
256
+ positions, all nine alignments and outline-safe automatic dimensions.
250
257
  There is no global font-readiness listener.
251
258
 
252
259
  Existing multiline `shrink` policies begin fitting upon adoption; no XML format
253
- or authored-property migration is required. Runtime 0.10.0 accepts UI 3.5.0
254
- through its existing ^3.4.0 peer. CLI/document APIs are unchanged. Consumers
255
- update their own UI installations/locks and rebuild; no other SDK bump is needed.
260
+ or authored-property migration is required. Runtime 0.10.0 accepts UI 3.6.0
261
+ through its existing ^3.4.0 peer; its host must also satisfy UI's Core ^2.5.2 peer.
262
+ CLI/document APIs are unchanged. After publication, consumers update their own
263
+ UI installations/locks and rebuild; no other SDK bump is needed.
256
264
 
257
265
  See [Label text layout](label-text-layout.md) for fit bounds, state restoration,
258
266
  font readiness and shared-schema boundaries. Native UI still depends only on
@@ -1,6 +1,6 @@
1
1
  # @kurot/ui architecture
2
2
 
3
- > Package version: 3.5.0 (prepared, not yet published), with peerDependency `@kurot/core: ^2.4.0`.
3
+ > Package version: 3.5.0 (published), with peerDependency `@kurot/core: ^2.4.0`.
4
4
  > Development installs published Core 2.4.0 with a matching registry lockfile.
5
5
  > No local Core override is needed for builds or centered-flip checks.
6
6
  > See [CHANGELOG.md](../CHANGELOG.md) for release-by-release changes.
@@ -2,8 +2,9 @@
2
2
 
3
3
  Introduced in UI 3.1.0 with Core >= 2.1.0, fitting is single-line in UI 3.1.0–3.4.0.
4
4
  UI 3.5.0 extends it to multiline Labels using Core's existing independent
5
- measurement API. Version 3.5.0 is prepared, not yet published. Its peer remains
6
- Core ^2.4.0 for centered flips. The public
5
+ measurement API. Version 3.5.0 is published, verified on npm on 2026-10-10, with
6
+ Core ^2.4.0. UI 3.6.0 is prepared, not yet published; it adds outline-safe layout
7
+ and requires Core ^2.5.2. The public
7
8
  `TextFitMode` type is `none | shrink`. Native UI depends only on Core. KUI
8
9
  authoring introduced fitting metadata in ui-document 0.9.0 and retains it in
9
10
  0.13.1. Current CLI 3.6.0 and runtime 0.10.0 use document `^0.13.0`; runtime
@@ -12,6 +13,37 @@ automatically accept 0.13.0. Label presets expand into native properties before
12
13
  rendering; their precedence does not change fitting behavior. See the
13
14
  [project style contract](../../ui-document/docs/project-styles.md).
14
15
 
16
+ ## Outline-safe layout in 3.6.0
17
+
18
+ Nonempty dynamic Labels with a positive finite `stroke` reserve
19
+ `ceil(2 * stroke) + 2` logical pixels on each side. This conservative allowance
20
+ contains the stroke and antialiasing inside the Label's external layout box.
21
+ The TextField is inset by that fixed amount; it does not change with a typewriter
22
+ prefix or fitting candidate. Scroller clips remain exact, with no new setting.
23
+
24
+ Automatic width includes both insets. Automatic height contains nominal rows
25
+ (including blank rows and line spacing), the complete glyph block if taller,
26
+ and both insets. Fixed/parent/max dimensions remain the outer box; line generation
27
+ and fitting use its inner area. Minimum-size overflow still reports failure
28
+ and permits clipping; a box too small for its inset does not become automatic.
29
+ Fitting toggles at unchanged drawing size retain identical geometry and pixels.
30
+ Unoutlined or empty Labels add no inset; empty-row measurements stay native.
31
+ EditableText, RichLabel and BitmapLabel do not adopt this layout change.
32
+
33
+ Keep explicit `verticalAlign="top"` for progressively typed dialogue. The origin
34
+ stays fixed after clearing/retyping; middle alignment intentionally follows its
35
+ changing glyph block and is not appropriate for that effect. Font readiness still
36
+ uses `invalidateSize()`. Outline/state changes invalidate the normal UI layout.
37
+
38
+ UI 3.6.0 is prepared for publication. Outlined Labels can measure larger
39
+ and wrap earlier than 3.5.0 even without `textFit`. No authored
40
+ properties or XML/resource formats change. Its manifest requires Core
41
+ ^2.5.2 for public line ink metrics and unified vertical block alignment; development
42
+ installs published 2.5.3. Core itself needs no new release. After publication,
43
+ consumers must adopt UI 3.6.0, use an accepted Core installation and rebuild; compatible
44
+ CLI/document/runtime contracts need no new SDK release. Existing application
45
+ installations remain on their registry versions until explicitly updated.
46
+
15
47
  ## Lines and bounds
16
48
 
17
49
  - `Label.multiline` defaults to `true`. Text wraps at a finite available width;
@@ -54,7 +86,8 @@ Published Core 2.5.2 makes dynamic top/middle/bottom use the same
54
86
  complete glyph-block boundaries in single-line and multiline modes. Blank rows
55
87
  retain their height. `multiline` controls only line generation. Input uses stable
56
88
  editing-row boundaries in all three modes; its caret and selection remain stable.
57
- Measurements and fitting stay nominal. Older Core installations retain their
89
+ Core measurements stay nominal; UI 3.6.0 reserves outline-safe
90
+ layout space separately. Older Core installations retain their
58
91
  recorded text behavior; adopt the Core installation/lock and rebuild.
59
92
  UI 3.4.0's peer accepts 2.5.2; this correction needs no UI release.
60
93
  See [Core text layout](../../core/docs/text-layout.md#unified-vertical-alignment-core-252).
@@ -84,12 +117,12 @@ height clipping. If the base size fits across several rows it is retained.
84
117
  Otherwise fitting searches smaller sizes, recalculating the row breaks each time.
85
118
  No maximum row count is implied by a fixed height, and no `maxLines` is added.
86
119
 
87
- | Available bounds | Multiline shrink behavior |
88
- | --- | --- |
89
- | Both automatic | Retain base size; soft wrapping has no width constraint. |
120
+ | Available bounds | Multiline shrink behavior |
121
+ | ----------------------------------- | ------------------------------------------------------------------------------------------- |
122
+ | Both automatic | Retain base size; soft wrapping has no width constraint. |
90
123
  | Width constrained, height automatic | Wrap and measure automatic height; shrink only if a protected sequence still exceeds width. |
91
- | Width automatic, height constrained | Measure hard-separated rows without soft wrapping, then fit their complete height. |
92
- | Both constrained | Wrap and shrink as needed to fit complete width and height. |
124
+ | Width automatic, height constrained | Measure hard-separated rows without soft wrapping, then fit their complete height. |
125
+ | Both constrained | Wrap and shrink as needed to fit complete width and height. |
93
126
 
94
127
  - `size` is always the authored/base size. `renderedSize` is the derived drawing
95
128
  size after layout validation. State overrides capture and restore `size`.
@@ -97,16 +130,12 @@ No maximum row count is implied by a fixed height, and no `maxLines` is added.
97
130
  larger region restores the base size; text never grows beyond it.
98
131
  - `minFontSize` defaults to 12 logical pixels, must be finite and at least 1,
99
132
  and acts as a lower bound. A minimum above `size` never enlarges the text.
100
- - Measurement uses the displayed text, font family, bold and italic settings,
101
- and reserves twice the outline thickness on each constrained axis. Search,
102
- measurement and drawing use the same reserved wrapping width. Horizontal
103
- alignment retains the original Label's left edge, center or right edge;
104
- vertical alignment retains the full original height. Fitting adds no implicit
105
- padding or outline inflation to automatic measured dimensions. A maximum
106
- width reserves outline space once, even when the measured Label is narrower.
107
- Toggling fitting leaves unchanged text at unchanged size in its original
108
- position. Core's nominal measurement, clipping and outline rendering rules
109
- remain in effect.
133
+ - Measurement uses displayed text, font family, bold/italic settings and the
134
+ outline-safe layout bounds described above. Search, automatic measurement and
135
+ drawing reserve the same inset once. Both alignments operate inside that area;
136
+ symmetric insets preserve the horizontal center. Automatic measurements are
137
+ never recycled as fitting constraints. The published 3.5.0 baseline reserved
138
+ only twice the stroke in fit checks and kept automatic dimensions nominal.
110
139
  - Available bounds come from fixed dimensions, parent layout constraints or
111
140
  explicit maximum dimensions. Icon spacing belongs to the skin's Label
112
141
  region. Automatic measured dimensions are not fed back as fit constraints.
@@ -133,12 +162,13 @@ Finite zero content width reports overflow for nonempty displayed text; it is
133
162
  not mistaken for empty content by Core's zero-width measurement. Empty displayed
134
163
  content retains its base size without overflow.
135
164
 
136
- Core, KUI format and dependency minima require no change. CLI/runtime already
137
- pass the fields through; runtime 0.10.0's ^3.4.0 peer accepts UI 3.5.0.
138
- Applications adopt the UI installation/lock and rebuild explicitly. Editor
139
- 0.28.1's local trial removes the old single-line Inspector restriction and binds
140
- built UI. Its exact registry 3.4.0 dependency must adopt 3.5.0 after publication
141
- for ordinary builds. Preview and compiled games use the native Label behavior.
165
+ The 3.5.0 multiline extension required no Core or KUI-format change. The separate
166
+ 3.6.0 outline correction raises UI's Core minimum to ^2.5.2. CLI/runtime already
167
+ pass the fields through; runtime 0.10.0's ^3.4.0 peer accepts UI 3.6.0, provided
168
+ its host also satisfies UI's Core peer. Applications adopt the UI installation/lock
169
+ and rebuild explicitly after publication. Editor currently pins registry UI 3.5.0;
170
+ Tentax and MilfMaster accept 3.6.0 through ^3.5.0 but retain their existing locks.
171
+ Preview and compiled games use the native Label behavior once their host adopts it.
142
172
 
143
173
  Load fonts before constructing or measuring text where possible. If a font
144
174
  becomes ready later, call `label.invalidateSize()` before the next validation;
@@ -174,3 +204,10 @@ WebGL 1 and WebGL 2 at 1x/2x, using independent Canvas width measurements.
174
204
  Pixel comparisons verify unchanged painting across fitting toggles for all nine
175
205
  horizontal/vertical alignments and automatic dimensions; icon-and-caption row
176
206
  tests retain parent geometry.
207
+
208
+ UI 3.6.0 adds exact clipped/unclipped pixel comparisons in real
209
+ Scroller viewports, across all nine alignments, italic text, thick outlines,
210
+ automatic/fixed/maximum/fitted bounds, and Japanese scroll tails. Minified Canvas,
211
+ WebGL 1 and WebGL 2 tests use physical 1x/2x targets. Unit tests additionally
212
+ cover glyphs taller than nominal rows, state outline restoration, late fonts,
213
+ empty text, EditableText isolation and repeated top-aligned typewriter prefixes.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kurot/ui",
3
- "version": "3.5.0",
3
+ "version": "3.6.0",
4
4
  "description": "EUI-compatible UI component framework for the Kurot game engine — skin-based components, layouts, data binding, view states",
5
5
  "author": "Kelvin <kyia.x52@gmail.com>",
6
6
  "license": "MIT",
@@ -34,10 +34,10 @@
34
34
  "test:text-labels": "playwright test test/browser --workers=1"
35
35
  },
36
36
  "peerDependencies": {
37
- "@kurot/core": "^2.4.0"
37
+ "@kurot/core": "^2.5.2"
38
38
  },
39
39
  "devDependencies": {
40
- "@kurot/core": "^2.4.0",
40
+ "@kurot/core": "^2.5.2",
41
41
  "@playwright/test": "1.62.1",
42
42
  "@types/node": "^22.0.0",
43
43
  "esbuild": "^0.28.2",