@celestia-island/hikari 0.55.36 → 0.55.37

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@celestia-island/hikari",
3
- "version": "0.55.36",
3
+ "version": "0.55.37",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Hikari Vue 3 component library — production-grade UI components based on shittim-chest design system",
@@ -452,21 +452,30 @@
452
452
  }
453
453
 
454
454
  .hk-modal-content {
455
- // IME cap-chase guard (2026-09-21, Xiaomi WebView chest report): on
456
- // adjustResize engines the keyboard animation steps the layout
457
- // viewport — and with it the 100dvh term of the max-height cap —
458
- // every frame. With max-height in the base transition list each step
459
- // RETARGETS a 150ms transition, so a sheet that binds the cap (tall
460
- // content: multi-step wizards, model pickers) stays permanently
461
- // mid-transition: the box chases the viewport, layout stays dirty,
462
- // and the fixed layer re-rasters per step (black-block flicker).
463
- // Short sheets never bind the cap and never noticed. The cap now
464
- // follows the viewport INSTANTLY on phones — which is exactly how
465
- // native iOS/Android sheets track the keyboard — while the height
466
- // pin (content-driven, one-shot per morph) and the clip reveal
467
- // keep their transition. Desktop keeps the full list.
455
+ // Phone-sheet transition = clip-path ONLY (2026-09-21, two Xiaomi
456
+ // WebView chest reports same day):
457
+ //
458
+ // ① IME cap-chase: on adjustResize engines the keyboard animation
459
+ // steps the layout viewport — and the 100dvh term of the
460
+ // max-height cap — every frame. With max-height in the transition
461
+ // list each step RETARGETS a 150ms transition, so a cap-bound
462
+ // sheet (tall content: wizards, model pickers) stays permanently
463
+ // mid-transition chasing its own viewport. The cap now follows
464
+ // the viewport INSTANTLY — exactly how native sheets track the
465
+ // keyboard.
466
+ //
467
+ // ② Step-change shrink flicker: useSizeMorph's clip mode pins
468
+ // growth instantly and sweeps the top edge paint-only, but
469
+ // SHRINKS still route through this height transition — 150ms of
470
+ // per-frame layout on a fixed full-width layer, re-rastering the
471
+ // moving edge every frame (wizard Prev/Next between
472
+ // different-height steps showed black blocks along the top).
473
+ // Shrinks now SNAP: one layout, one paint — the native-sheet
474
+ // direction change. Growth keeps its animated reveal via the
475
+ // clip-path sweep (the only transition left on phones).
476
+ //
477
+ // Desktop keeps the full base list (height + max-height + clip-path).
468
478
  transition:
469
- height var(--duration-fast, 0.15s) var(--ease-standard, cubic-bezier(0.4, 0, 0.2, 1)),
470
479
  clip-path var(--duration-fast, 0.15s) var(--ease-standard, cubic-bezier(0.4, 0, 0.2, 1));
471
480
  // !important beats the inline maxWidth (width prop); base width: 100%
472
481
  // already applies at every viewport, so only the cap is re-asserted.
@@ -74,24 +74,28 @@ describe("HkModal mobile sheet spacing contract", () => {
74
74
  expect(content).not.toMatch(/max-height:\s*none/);
75
75
  });
76
76
 
77
- // 2026-09-21 IME cap-chase guard (Xiaomi WebView chest report): the
78
- // keyboard animation steps the layout viewport — and the 100dvh term
79
- // of the cap — every frame; with max-height in the transition list
80
- // each step RETARGETS a 150ms transition and a cap-bound (tall)
81
- // sheet chases its own viewport, re-rastering per step (black-block
82
- // flicker). The phone sheet's transition list must therefore carry
83
- // ONLY the content-driven channels: the height pin (one-shot per
84
- // morph) and the clip reveal. The cap itself follows the viewport
85
- // instantly — native sheet behavior.
86
- it("drops max-height from the phone sheet transition (IME cap-chase guard)", () => {
77
+ // 2026-09-21 phone-sheet transition contract (two Xiaomi WebView
78
+ // chest reports the same day): the mobile list carries ONLY the
79
+ // clip-path reveal.
80
+ // ① IME cap-chase: the keyboard animation steps the 100dvh cap every
81
+ // frame; max-height in the transition list made cap-bound sheets
82
+ // chase their own viewport. The cap follows the viewport instantly.
83
+ // ② Step-change shrink flicker: useSizeMorph routes clip-mode
84
+ // SHRINKS through the height transition — 150ms of per-frame
85
+ // layout on a fixed layer re-rastering the moving edge (wizard
86
+ // Prev/Next between different-height steps showed black blocks).
87
+ // With height out of the list, shrinks snap (one layout, one
88
+ // paint — native-sheet behavior); growth keeps its animated
89
+ // reveal through the clip-path sweep.
90
+ it("narrows the phone sheet transition to clip-path only (IME + shrink guards)", () => {
87
91
  // Extraction self-check: the mobile rule must exist and MUST carry
88
92
  // a transition declaration at all (its absence is the regression,
89
93
  // not a vacuous pass).
90
94
  expect(content.length, "mobile .hk-modal-content rule extracted").toBeGreaterThan(0);
91
95
  const tr = content.match(/transition:\s*([^;]+);/)?.[1] ?? "";
92
96
  expect(tr.length, "mobile sheet transition declaration present").toBeGreaterThan(0);
93
- expect(tr).toMatch(/\bheight\b/);
94
97
  expect(tr).toMatch(/\bclip-path\b/);
98
+ expect(tr).not.toMatch(/\bheight\b/);
95
99
  expect(tr).not.toMatch(/\bmax-height\b/);
96
100
  });
97
101
 
@@ -85,9 +85,13 @@ export interface SizeMorphOptions {
85
85
  * transition, same "content rides rigidly" grammar as the modal unveil,
86
86
  * but paint/compositor-level: no per-frame layout and no per-frame
87
87
  * backdrop-filter re-raster over the resizing fixed layer (the mobile
88
- * patchy-flicker source, 2026-09-15 chest report). Shrinks and every
89
- * height-mode surface keep the height transition — the rare direction
90
- * is not worth the flex-compression look-ahead trade.
88
+ * patchy-flicker source, 2026-09-15 chest report). Height-mode
89
+ * surfaces and the select sheet keep the height transition for shrinks
90
+ * (their stylesheets list it); the phone MODAL sheet narrowed its list
91
+ * to clip-path-only (2026-09-21 step-change shrink report — 150ms of
92
+ * per-frame layout on the fixed layer re-rastered the moving edge), so
93
+ * its shrinks snap: the L291-style pin flip lands instantly when the
94
+ * stylesheet no longer transitions height.
91
95
  *
92
96
  * Reduced motion / the global animation switch stay honored: the frame's
93
97
  * transition-duration collapses to one frame under