@cplieger/web-terminal-ui 6.1.0 → 6.1.2

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/css/30-tabs.css CHANGED
@@ -690,15 +690,29 @@
690
690
  in css/31-switcher.css. On the narrow-coarse phone the strip is hidden and
691
691
  the mobile switcher's inset is applied through viewport.ts
692
692
  (--wt-reserve-bottom) instead. Two rules because the class half cannot mix
693
- into a media condition; they set the same declaration. */
693
+ into a media condition; they set the same declaration.
694
+
695
+ The clearance is the strip's height PLUS --safe-bottom, because that is where
696
+ the strip is: .wt-tab-bar sits at `bottom: var(--safe-bottom)`, so the band it
697
+ occupies runs from --safe-bottom to --safe-bottom + --wt-tabbar-h. Clearing
698
+ the height alone left the surface reaching exactly env(safe-area-inset-bottom)
699
+ past the strip's top edge — 0 on a desktop, 20px in iPad Safari (viewport-fit
700
+ is cover, so the insets are live), where the terminal grew one extra row that
701
+ rendered behind the strip. --wt-tabbar-h is the bar's OWN height and must stay
702
+ that: the wide-touchscreen key grid (31-switcher.css) already adds the inset to
703
+ it itself, and folding the inset into the variable would double-count there.
704
+ The mobile switcher reaches the same total from the other direction, measuring
705
+ `innerHeight - rect.top` so the inset rides along inside --wt-reserve-bottom.
706
+ --kb-inset is deliberately absent: viewport.ts owns the keyboard case by
707
+ writing an inline bottom on the surface, which outranks this rule entirely. */
694
708
  @media (pointer: fine) {
695
709
  :where(.wt-root) .term.wt-with-tabbar {
696
- bottom: var(--wt-tabbar-h, 44px);
710
+ bottom: calc(var(--wt-tabbar-h, 44px) + var(--safe-bottom, 0px));
697
711
  }
698
712
  }
699
713
 
700
714
  :where(.wt-root:not(.wt-narrow)) .term.wt-with-tabbar {
701
- bottom: var(--wt-tabbar-h, 44px);
715
+ bottom: calc(var(--wt-tabbar-h, 44px) + var(--safe-bottom, 0px));
702
716
  }
703
717
 
704
718
  /* ===== Activity dots (activityMonitor via tabs) =====
package/css/page.css CHANGED
@@ -73,10 +73,15 @@ body {
73
73
  --wt-loading-bg: #000;
74
74
  --wt-loading-bar-inline-size: min(220px, 62vw);
75
75
  --wt-loading-bar-block-size: 5px;
76
- /* Symmetric ease-in-out-cubic, deliberately NOT one of the component easing
77
- tokens: those are all asymmetric (they settle at one end), which reads as a
78
- stutter on a looping indeterminate sweep. */
79
- --wt-loading-sweep-easing: cubic-bezier(0.65, 0, 0.35, 1);
76
+ /* Symmetric, deliberately NOT one of the component easing tokens: those are all
77
+ asymmetric (they settle at one end), which reads as a stutter on a looping
78
+ indeterminate sweep. It is also deliberately NOT an ease-in-out-cubic
79
+ (`cubic-bezier(0.65, 0, 0.35, 1)`, what this was): a curve with zero velocity
80
+ at both ends spends its two slow phases exactly where the sweep is clipped
81
+ off-screen, which measured as 315 ms of blank track at each end of every
82
+ 1.5 s lap. Non-zero end velocity keeps the symmetry and cuts that to 90 ms,
83
+ below the point where the loop reads as a stall. */
84
+ --wt-loading-sweep-easing: cubic-bezier(0.3, 0.25, 0.7, 0.75);
80
85
  --wt-loading-sweep-duration: 1.5s;
81
86
 
82
87
  position: fixed;
@@ -129,6 +134,15 @@ body {
129
134
  content: "";
130
135
  position: absolute;
131
136
  inset-block: 0;
137
+ /* Load-bearing, and the whole reason the sweep used to enter mid-track: with
138
+ both inline offsets `auto` an absolutely positioned box falls back to its
139
+ STATIC position, and .wt-loading sets `text-align: center`, which centres
140
+ that static position inside the 220px track. The keyframes below are written
141
+ against the track's left edge, so every offset was silently shifted right by
142
+ (220 - 92.4) / 2 = 64px: the sweep was already visible at t=0 near the left
143
+ of centre, and it left the track at ~73% of the cycle. Pinning the origin is
144
+ what makes translateX(-100%) mean "one full sweep-width off the left edge". */
145
+ inset-inline-start: 0;
132
146
  inline-size: 42%;
133
147
  border-radius: inherit;
134
148
  background: linear-gradient(
@@ -167,12 +181,17 @@ body {
167
181
  opacity: 0;
168
182
  }
169
183
 
184
+ /* Offsets are percentages of the SWEEP (42% of the track), not of the track, so
185
+ -100% is exactly one sweep-width left of the origin (fully clipped, flush with
186
+ the left edge) and 100% / 0.42 = 238% puts its left edge flush with the right
187
+ edge. Flush at both ends rather than over-travelled: every pixel of travel
188
+ outside the track is dead time on a screen whose only job is to look alive. */
170
189
  @keyframes wt-loading-slide {
171
190
  0% {
172
- transform: translateX(-110%);
191
+ transform: translateX(-100%);
173
192
  }
174
193
  100% {
175
- transform: translateX(250%);
194
+ transform: translateX(238%);
176
195
  }
177
196
  }
178
197
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cplieger/web-terminal-ui",
3
- "version": "6.1.0",
3
+ "version": "6.1.2",
4
4
  "type": "module",
5
5
  "description": "Reference touch-first browser UI for @cplieger/web-terminal-engine: a composable kernel + feature modules (tabs, activity monitor, mobile toolbar, context menu, IME, predictive echo, viewport handling) and CSS. One createTerminal() call.",
6
6
  "license": "MPL-2.0",